{"version":3,"file":"app-vendor.1742883063025.js","mappings":"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","sources":["webpack://BugHerdClient/../../node_modules/@bugsnag/browser/dist/bugsnag.js","webpack://BugHerdClient/../../node_modules/@bugsnag/js/browser/notifier.js","webpack://BugHerdClient/../../node_modules/@bugsnag/plugin-react/dist/bugsnag-react.js","webpack://BugHerdClient/../../node_modules/fabric/dist/fabric.js","webpack://BugHerdClient/../../node_modules/lodash/_DataView.js","webpack://BugHerdClient/../../node_modules/lodash/_Hash.js","webpack://BugHerdClient/../../node_modules/lodash/_ListCache.js","webpack://BugHerdClient/../../node_modules/lodash/_Map.js","webpack://BugHerdClient/../../node_modules/lodash/_MapCache.js","webpack://BugHerdClient/../../node_modules/lodash/_Promise.js","webpack://BugHerdClient/../../node_modules/lodash/_Set.js","webpack://BugHerdClient/../../node_modules/lodash/_SetCache.js","webpack://BugHerdClient/../../node_modules/lodash/_Stack.js","webpack://BugHerdClient/../../node_modules/lodash/_Symbol.js","webpack://BugHerdClient/../../node_modules/lodash/_Uint8Array.js","webpack://BugHerdClient/../../node_modules/lodash/_WeakMap.js","webpack://BugHerdClient/../../node_modules/lodash/_arrayEach.js","webpack://BugHerdClient/../../node_modules/lodash/_arrayFilter.js","webpack://BugHerdClient/../../node_modules/lodash/_arrayLikeKeys.js","webpack://BugHerdClient/../../node_modules/lodash/_arrayMap.js","webpack://BugHerdClient/../../node_modules/lodash/_arrayPush.js","webpack://BugHerdClient/../../node_modules/lodash/_arrayReduce.js","webpack://BugHerdClient/../../node_modules/lodash/_arraySome.js","webpack://BugHerdClient/../../node_modules/lodash/_asciiToArray.js","webpack://BugHerdClient/../../node_modules/lodash/_asciiWords.js","webpack://BugHerdClient/../../node_modules/lodash/_assignValue.js","webpack://BugHerdClient/../../node_modules/lodash/_assocIndexOf.js","webpack://BugHerdClient/../../node_modules/lodash/_baseAssign.js","webpack://BugHerdClient/../../node_modules/lodash/_baseAssignIn.js","webpack://BugHerdClient/../../node_modules/lodash/_baseAssignValue.js","webpack://BugHerdClient/../../node_modules/lodash/_baseClone.js","webpack://BugHerdClient/../../node_modules/lodash/_baseCreate.js","webpack://BugHerdClient/../../node_modules/lodash/_baseEach.js","webpack://BugHerdClient/../../node_modules/lodash/_baseFor.js","webpack://BugHerdClient/../../node_modules/lodash/_baseForOwn.js","webpack://BugHerdClient/../../node_modules/lodash/_baseGet.js","webpack://BugHerdClient/../../node_modules/lodash/_baseGetAllKeys.js","webpack://BugHerdClient/../../node_modules/lodash/_baseGetTag.js","webpack://BugHerdClient/../../node_modules/lodash/_baseHasIn.js","webpack://BugHerdClient/../../node_modules/lodash/_baseIsArguments.js","webpack://BugHerdClient/../../node_modules/lodash/_baseIsEqual.js","webpack://BugHerdClient/../../node_modules/lodash/_baseIsEqualDeep.js","webpack://BugHerdClient/../../node_modules/lodash/_baseIsMap.js","webpack://BugHerdClient/../../node_modules/lodash/_baseIsMatch.js","webpack://BugHerdClient/../../node_modules/lodash/_baseIsNative.js","webpack://BugHerdClient/../../node_modules/lodash/_baseIsSet.js","webpack://BugHerdClient/../../node_modules/lodash/_baseIsTypedArray.js","webpack://BugHerdClient/../../node_modules/lodash/_baseIteratee.js","webpack://BugHerdClient/../../node_modules/lodash/_baseKeys.js","webpack://BugHerdClient/../../node_modules/lodash/_baseKeysIn.js","webpack://BugHerdClient/../../node_modules/lodash/_baseMap.js","webpack://BugHerdClient/../../node_modules/lodash/_baseMatches.js","webpack://BugHerdClient/../../node_modules/lodash/_baseMatchesProperty.js","webpack://BugHerdClient/../../node_modules/lodash/_baseProperty.js","webpack://BugHerdClient/../../node_modules/lodash/_basePropertyDeep.js","webpack://BugHerdClient/../../node_modules/lodash/_basePropertyOf.js","webpack://BugHerdClient/../../node_modules/lodash/_baseSlice.js","webpack://BugHerdClient/../../node_modules/lodash/_baseTimes.js","webpack://BugHerdClient/../../node_modules/lodash/_baseToString.js","webpack://BugHerdClient/../../node_modules/lodash/_baseTrim.js","webpack://BugHerdClient/../../node_modules/lodash/_baseUnary.js","webpack://BugHerdClient/../../node_modules/lodash/_cacheHas.js","webpack://BugHerdClient/../../node_modules/lodash/_castFunction.js","webpack://BugHerdClient/../../node_modules/lodash/_castPath.js","webpack://BugHerdClient/../../node_modules/lodash/_castSlice.js","webpack://BugHerdClient/../../node_modules/lodash/_cloneArrayBuffer.js","webpack://BugHerdClient/../../node_modules/lodash/_cloneBuffer.js","webpack://BugHerdClient/../../node_modules/lodash/_cloneDataView.js","webpack://BugHerdClient/../../node_modules/lodash/_cloneRegExp.js","webpack://BugHerdClient/../../node_modules/lodash/_cloneSymbol.js","webpack://BugHerdClient/../../node_modules/lodash/_cloneTypedArray.js","webpack://BugHerdClient/../../node_modules/lodash/_copyArray.js","webpack://BugHerdClient/../../node_modules/lodash/_copyObject.js","webpack://BugHerdClient/../../node_modules/lodash/_copySymbols.js","webpack://BugHerdClient/../../node_modules/lodash/_copySymbolsIn.js","webpack://BugHerdClient/../../node_modules/lodash/_coreJsData.js","webpack://BugHerdClient/../../node_modules/lodash/_createBaseEach.js","webpack://BugHerdClient/../../node_modules/lodash/_createBaseFor.js","webpack://BugHerdClient/../../node_modules/lodash/_createCaseFirst.js","webpack://BugHerdClient/../../node_modules/lodash/_createCompounder.js","webpack://BugHerdClient/../../node_modules/lodash/_deburrLetter.js","webpack://BugHerdClient/../../node_modules/lodash/_defineProperty.js","webpack://BugHerdClient/../../node_modules/lodash/_equalArrays.js","webpack://BugHerdClient/../../node_modules/lodash/_equalByTag.js","webpack://BugHerdClient/../../node_modules/lodash/_equalObjects.js","webpack://BugHerdClient/../../node_modules/lodash/_freeGlobal.js","webpack://BugHerdClient/../../node_modules/lodash/_getAllKeys.js","webpack://BugHerdClient/../../node_modules/lodash/_getAllKeysIn.js","webpack://BugHerdClient/../../node_modules/lodash/_getMapData.js","webpack://BugHerdClient/../../node_modules/lodash/_getMatchData.js","webpack://BugHerdClient/../../node_modules/lodash/_getNative.js","webpack://BugHerdClient/../../node_modules/lodash/_getPrototype.js","webpack://BugHerdClient/../../node_modules/lodash/_getRawTag.js","webpack://BugHerdClient/../../node_modules/lodash/_getSymbols.js","webpack://BugHerdClient/../../node_modules/lodash/_getSymbolsIn.js","webpack://BugHerdClient/../../node_modules/lodash/_getTag.js","webpack://BugHerdClient/../../node_modules/lodash/_getValue.js","webpack://BugHerdClient/../../node_modules/lodash/_hasPath.js","webpack://BugHerdClient/../../node_modules/lodash/_hasUnicode.js","webpack://BugHerdClient/../../node_modules/lodash/_hasUnicodeWord.js","webpack://BugHerdClient/../../node_modules/lodash/_hashClear.js","webpack://BugHerdClient/../../node_modules/lodash/_hashDelete.js","webpack://BugHerdClient/../../node_modules/lodash/_hashGet.js","webpack://BugHerdClient/../../node_modules/lodash/_hashHas.js","webpack://BugHerdClient/../../node_modules/lodash/_hashSet.js","webpack://BugHerdClient/../../node_modules/lodash/_initCloneArray.js","webpack://BugHerdClient/../../node_modules/lodash/_initCloneByTag.js","webpack://BugHerdClient/../../node_modules/lodash/_initCloneObject.js","webpack://BugHerdClient/../../node_modules/lodash/_isIndex.js","webpack://BugHerdClient/../../node_modules/lodash/_isKey.js","webpack://BugHerdClient/../../node_modules/lodash/_isKeyable.js","webpack://BugHerdClient/../../node_modules/lodash/_isMasked.js","webpack://BugHerdClient/../../node_modules/lodash/_isPrototype.js","webpack://BugHerdClient/../../node_modules/lodash/_isStrictComparable.js","webpack://BugHerdClient/../../node_modules/lodash/_listCacheClear.js","webpack://BugHerdClient/../../node_modules/lodash/_listCacheDelete.js","webpack://BugHerdClient/../../node_modules/lodash/_listCacheGet.js","webpack://BugHerdClient/../../node_modules/lodash/_listCacheHas.js","webpack://BugHerdClient/../../node_modules/lodash/_listCacheSet.js","webpack://BugHerdClient/../../node_modules/lodash/_mapCacheClear.js","webpack://BugHerdClient/../../node_modules/lodash/_mapCacheDelete.js","webpack://BugHerdClient/../../node_modules/lodash/_mapCacheGet.js","webpack://BugHerdClient/../../node_modules/lodash/_mapCacheHas.js","webpack://BugHerdClient/../../node_modules/lodash/_mapCacheSet.js","webpack://BugHerdClient/../../node_modules/lodash/_mapToArray.js","webpack://BugHerdClient/../../node_modules/lodash/_matchesStrictComparable.js","webpack://BugHerdClient/../../node_modules/lodash/_memoizeCapped.js","webpack://BugHerdClient/../../node_modules/lodash/_nativeCreate.js","webpack://BugHerdClient/../../node_modules/lodash/_nativeKeys.js","webpack://BugHerdClient/../../node_modules/lodash/_nativeKeysIn.js","webpack://BugHerdClient/../../node_modules/lodash/_nodeUtil.js","webpack://BugHerdClient/../../node_modules/lodash/_objectToString.js","webpack://BugHerdClient/../../node_modules/lodash/_overArg.js","webpack://BugHerdClient/../../node_modules/lodash/_root.js","webpack://BugHerdClient/../../node_modules/lodash/_setCacheAdd.js","webpack://BugHerdClient/../../node_modules/lodash/_setCacheHas.js","webpack://BugHerdClient/../../node_modules/lodash/_setToArray.js","webpack://BugHerdClient/../../node_modules/lodash/_stackClear.js","webpack://BugHerdClient/../../node_modules/lodash/_stackDelete.js","webpack://BugHerdClient/../../node_modules/lodash/_stackGet.js","webpack://BugHerdClient/../../node_modules/lodash/_stackHas.js","webpack://BugHerdClient/../../node_modules/lodash/_stackSet.js","webpack://BugHerdClient/../../node_modules/lodash/_stringToArray.js","webpack://BugHerdClient/../../node_modules/lodash/_stringToPath.js","webpack://BugHerdClient/../../node_modules/lodash/_toKey.js","webpack://BugHerdClient/../../node_modules/lodash/_toSource.js","webpack://BugHerdClient/../../node_modules/lodash/_trimmedEndIndex.js","webpack://BugHerdClient/../../node_modules/lodash/_unicodeToArray.js","webpack://BugHerdClient/../../node_modules/lodash/_unicodeWords.js","webpack://BugHerdClient/../../node_modules/lodash/camelCase.js","webpack://BugHerdClient/../../node_modules/lodash/capitalize.js","webpack://BugHerdClient/../../node_modules/lodash/cloneDeep.js","webpack://BugHerdClient/../../node_modules/lodash/debounce.js","webpack://BugHerdClient/../../node_modules/lodash/deburr.js","webpack://BugHerdClient/../../node_modules/lodash/eq.js","webpack://BugHerdClient/../../node_modules/lodash/forOwn.js","webpack://BugHerdClient/../../node_modules/lodash/get.js","webpack://BugHerdClient/../../node_modules/lodash/hasIn.js","webpack://BugHerdClient/../../node_modules/lodash/identity.js","webpack://BugHerdClient/../../node_modules/lodash/isArguments.js","webpack://BugHerdClient/../../node_modules/lodash/isArray.js","webpack://BugHerdClient/../../node_modules/lodash/isArrayLike.js","webpack://BugHerdClient/../../node_modules/lodash/isBuffer.js","webpack://BugHerdClient/../../node_modules/lodash/isFunction.js","webpack://BugHerdClient/../../node_modules/lodash/isLength.js","webpack://BugHerdClient/../../node_modules/lodash/isMap.js","webpack://BugHerdClient/../../node_modules/lodash/isObject.js","webpack://BugHerdClient/../../node_modules/lodash/isObjectLike.js","webpack://BugHerdClient/../../node_modules/lodash/isPlainObject.js","webpack://BugHerdClient/../../node_modules/lodash/isSet.js","webpack://BugHerdClient/../../node_modules/lodash/isString.js","webpack://BugHerdClient/../../node_modules/lodash/isSymbol.js","webpack://BugHerdClient/../../node_modules/lodash/isTypedArray.js","webpack://BugHerdClient/../../node_modules/lodash/keys.js","webpack://BugHerdClient/../../node_modules/lodash/keysIn.js","webpack://BugHerdClient/../../node_modules/lodash/map.js","webpack://BugHerdClient/../../node_modules/lodash/memoize.js","webpack://BugHerdClient/../../node_modules/lodash/now.js","webpack://BugHerdClient/../../node_modules/lodash/property.js","webpack://BugHerdClient/../../node_modules/lodash/stubArray.js","webpack://BugHerdClient/../../node_modules/lodash/stubFalse.js","webpack://BugHerdClient/../../node_modules/lodash/toNumber.js","webpack://BugHerdClient/../../node_modules/lodash/toString.js","webpack://BugHerdClient/../../node_modules/lodash/upperFirst.js","webpack://BugHerdClient/../../node_modules/lodash/words.js","webpack://BugHerdClient/../../node_modules/pusher-js/dist/web/pusher-with-encryption.js","webpack://BugHerdClient/../../node_modules/pusher-js/with-encryption/index.js"],"sourcesContent":["(function(f){if(typeof exports===\"object\"&&typeof module!==\"undefined\"){module.exports=f()}else if(typeof define===\"function\"&&define.amd){define([],f)}else{var g;if(typeof window!==\"undefined\"){g=window}else if(typeof global!==\"undefined\"){g=global}else if(typeof self!==\"undefined\"){g=self}else{g=this}g.Bugsnag = f()}})(function(){var define,module,exports;\nvar _$breadcrumbTypes_8 = ['navigation', 'request', 'process', 'log', 'user', 'state', 'error', 'manual'];\n\n// Array#reduce\nvar _$reduce_17 = function (arr, fn, accum) {\n var val = accum;\n\n for (var i = 0, len = arr.length; i < len; i++) {\n val = fn(val, arr[i], i, arr);\n }\n\n return val;\n};\n\n/* removed: var _$reduce_17 = require('./reduce'); */; // Array#filter\n\n\nvar _$filter_12 = function (arr, fn) {\n return _$reduce_17(arr, function (accum, item, i, arr) {\n return !fn(item, i, arr) ? accum : accum.concat(item);\n }, []);\n};\n\n/* removed: var _$reduce_17 = require('./reduce'); */; // Array#includes\n\n\nvar _$includes_13 = function (arr, x) {\n return _$reduce_17(arr, function (accum, item, i, arr) {\n return accum === true || item === x;\n }, false);\n};\n\n// Array#isArray\nvar _$isArray_14 = function (obj) {\n return Object.prototype.toString.call(obj) === '[object Array]';\n};\n\n/* eslint-disable-next-line no-prototype-builtins */\nvar _hasDontEnumBug = !{\n toString: null\n}.propertyIsEnumerable('toString');\n\nvar _dontEnums = ['toString', 'toLocaleString', 'valueOf', 'hasOwnProperty', 'isPrototypeOf', 'propertyIsEnumerable', 'constructor']; // Object#keys\n\nvar _$keys_15 = function (obj) {\n // stripped down version of\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/Keys\n var result = [];\n var prop;\n\n for (prop in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, prop)) result.push(prop);\n }\n\n if (!_hasDontEnumBug) return result;\n\n for (var i = 0, len = _dontEnums.length; i < len; i++) {\n if (Object.prototype.hasOwnProperty.call(obj, _dontEnums[i])) result.push(_dontEnums[i]);\n }\n\n return result;\n};\n\nvar _$intRange_24 = function (min, max) {\n if (min === void 0) {\n min = 1;\n }\n\n if (max === void 0) {\n max = Infinity;\n }\n\n return function (value) {\n return typeof value === 'number' && parseInt('' + value, 10) === value && value >= min && value <= max;\n };\n};\n\n/* removed: var _$filter_12 = require('../es-utils/filter'); */;\n\n/* removed: var _$isArray_14 = require('../es-utils/is-array'); */;\n\nvar _$listOfFunctions_25 = function (value) {\n return typeof value === 'function' || _$isArray_14(value) && _$filter_12(value, function (f) {\n return typeof f === 'function';\n }).length === value.length;\n};\n\nvar _$stringWithLength_26 = function (value) {\n return typeof value === 'string' && !!value.length;\n};\n\nvar _$config_5 = {};\n/* removed: var _$filter_12 = require('./lib/es-utils/filter'); */;\n\n/* removed: var _$reduce_17 = require('./lib/es-utils/reduce'); */;\n\n/* removed: var _$keys_15 = require('./lib/es-utils/keys'); */;\n\n/* removed: var _$isArray_14 = require('./lib/es-utils/is-array'); */;\n\n/* removed: var _$includes_13 = require('./lib/es-utils/includes'); */;\n\n/* removed: var _$intRange_24 = require('./lib/validators/int-range'); */;\n\n/* removed: var _$stringWithLength_26 = require('./lib/validators/string-with-length'); */;\n\n/* removed: var _$listOfFunctions_25 = require('./lib/validators/list-of-functions'); */;\n\n/* removed: var _$breadcrumbTypes_8 = require('./lib/breadcrumb-types'); */;\n\nvar defaultErrorTypes = function () {\n return {\n unhandledExceptions: true,\n unhandledRejections: true\n };\n};\n\n_$config_5.schema = {\n apiKey: {\n defaultValue: function () {\n return null;\n },\n message: 'is required',\n validate: _$stringWithLength_26\n },\n appVersion: {\n defaultValue: function () {\n return undefined;\n },\n message: 'should be a string',\n validate: function (value) {\n return value === undefined || _$stringWithLength_26(value);\n }\n },\n appType: {\n defaultValue: function () {\n return undefined;\n },\n message: 'should be a string',\n validate: function (value) {\n return value === undefined || _$stringWithLength_26(value);\n }\n },\n autoDetectErrors: {\n defaultValue: function () {\n return true;\n },\n message: 'should be true|false',\n validate: function (value) {\n return value === true || value === false;\n }\n },\n enabledErrorTypes: {\n defaultValue: function () {\n return defaultErrorTypes();\n },\n message: 'should be an object containing the flags { unhandledExceptions:true|false, unhandledRejections:true|false }',\n allowPartialObject: true,\n validate: function (value) {\n // ensure we have an object\n if (typeof value !== 'object' || !value) return false;\n var providedKeys = _$keys_15(value);\n var defaultKeys = _$keys_15(defaultErrorTypes()); // ensure it only has a subset of the allowed keys\n\n if (_$filter_12(providedKeys, function (k) {\n return _$includes_13(defaultKeys, k);\n }).length < providedKeys.length) return false; // ensure all of the values are boolean\n\n if (_$filter_12(_$keys_15(value), function (k) {\n return typeof value[k] !== 'boolean';\n }).length > 0) return false;\n return true;\n }\n },\n onError: {\n defaultValue: function () {\n return [];\n },\n message: 'should be a function or array of functions',\n validate: _$listOfFunctions_25\n },\n onSession: {\n defaultValue: function () {\n return [];\n },\n message: 'should be a function or array of functions',\n validate: _$listOfFunctions_25\n },\n onBreadcrumb: {\n defaultValue: function () {\n return [];\n },\n message: 'should be a function or array of functions',\n validate: _$listOfFunctions_25\n },\n endpoints: {\n defaultValue: function () {\n return {\n notify: 'https://notify.bugsnag.com',\n sessions: 'https://sessions.bugsnag.com'\n };\n },\n message: 'should be an object containing endpoint URLs { notify, sessions }',\n validate: function (val) {\n return (// first, ensure it's an object\n val && typeof val === 'object' && // notify and sessions must always be set\n _$stringWithLength_26(val.notify) && _$stringWithLength_26(val.sessions) && // ensure no keys other than notify/session are set on endpoints object\n _$filter_12(_$keys_15(val), function (k) {\n return !_$includes_13(['notify', 'sessions'], k);\n }).length === 0\n );\n }\n },\n autoTrackSessions: {\n defaultValue: function (val) {\n return true;\n },\n message: 'should be true|false',\n validate: function (val) {\n return val === true || val === false;\n }\n },\n enabledReleaseStages: {\n defaultValue: function () {\n return null;\n },\n message: 'should be an array of strings',\n validate: function (value) {\n return value === null || _$isArray_14(value) && _$filter_12(value, function (f) {\n return typeof f === 'string';\n }).length === value.length;\n }\n },\n releaseStage: {\n defaultValue: function () {\n return 'production';\n },\n message: 'should be a string',\n validate: function (value) {\n return typeof value === 'string' && value.length;\n }\n },\n maxBreadcrumbs: {\n defaultValue: function () {\n return 25;\n },\n message: 'should be a number ≤100',\n validate: function (value) {\n return _$intRange_24(0, 100)(value);\n }\n },\n enabledBreadcrumbTypes: {\n defaultValue: function () {\n return _$breadcrumbTypes_8;\n },\n message: \"should be null or a list of available breadcrumb types (\" + _$breadcrumbTypes_8.join(',') + \")\",\n validate: function (value) {\n return value === null || _$isArray_14(value) && _$reduce_17(value, function (accum, maybeType) {\n if (accum === false) return accum;\n return _$includes_13(_$breadcrumbTypes_8, maybeType);\n }, true);\n }\n },\n context: {\n defaultValue: function () {\n return undefined;\n },\n message: 'should be a string',\n validate: function (value) {\n return value === undefined || typeof value === 'string';\n }\n },\n user: {\n defaultValue: function () {\n return {};\n },\n message: 'should be an object with { id, email, name } properties',\n validate: function (value) {\n return value === null || value && _$reduce_17(_$keys_15(value), function (accum, key) {\n return accum && _$includes_13(['id', 'email', 'name'], key);\n }, true);\n }\n },\n metadata: {\n defaultValue: function () {\n return {};\n },\n message: 'should be an object',\n validate: function (value) {\n return typeof value === 'object' && value !== null;\n }\n },\n logger: {\n defaultValue: function () {\n return undefined;\n },\n message: 'should be null or an object with methods { debug, info, warn, error }',\n validate: function (value) {\n return !value || value && _$reduce_17(['debug', 'info', 'warn', 'error'], function (accum, method) {\n return accum && typeof value[method] === 'function';\n }, true);\n }\n },\n redactedKeys: {\n defaultValue: function () {\n return ['password'];\n },\n message: 'should be an array of strings|regexes',\n validate: function (value) {\n return _$isArray_14(value) && value.length === _$filter_12(value, function (s) {\n return typeof s === 'string' || s && typeof s.test === 'function';\n }).length;\n }\n },\n plugins: {\n defaultValue: function () {\n return [];\n },\n message: 'should be an array of plugin objects',\n validate: function (value) {\n return _$isArray_14(value) && value.length === _$filter_12(value, function (p) {\n return p && typeof p === 'object' && typeof p.load === 'function';\n }).length;\n }\n },\n featureFlags: {\n defaultValue: function () {\n return [];\n },\n message: 'should be an array of objects that have a \"name\" property',\n validate: function (value) {\n return _$isArray_14(value) && value.length === _$filter_12(value, function (feature) {\n return feature && typeof feature === 'object' && typeof feature.name === 'string';\n }).length;\n }\n }\n};\n\n// extends helper from babel\n// https://github.com/babel/babel/blob/916429b516e6466fd06588ee820e40e025d7f3a3/packages/babel-helpers/src/helpers.js#L377-L393\nvar _$assign_11 = function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n};\n\n/* removed: var _$reduce_17 = require('./reduce'); */; // Array#map\n\n\nvar _$map_16 = function (arr, fn) {\n return _$reduce_17(arr, function (accum, item, i, arr) {\n return accum.concat(fn(item, i, arr));\n }, []);\n};\n\nfunction _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nvar schema = _$config_5.schema;\n\n/* removed: var _$map_16 = require('@bugsnag/core/lib/es-utils/map'); */;\n\n/* removed: var _$assign_11 = require('@bugsnag/core/lib/es-utils/assign'); */;\n\nvar _$config_1 = {\n releaseStage: _$assign_11({}, schema.releaseStage, {\n defaultValue: function () {\n if (/^localhost(:\\d+)?$/.test(window.location.host)) return 'development';\n return 'production';\n }\n }),\n appType: _extends({}, schema.appType, {\n defaultValue: function () {\n return 'browser';\n }\n }),\n logger: _$assign_11({}, schema.logger, {\n defaultValue: function () {\n return (// set logger based on browser capability\n typeof console !== 'undefined' && typeof console.debug === 'function' ? getPrefixedConsole() : undefined\n );\n }\n })\n};\n\nvar getPrefixedConsole = function () {\n var logger = {};\n var consoleLog = console.log;\n _$map_16(['debug', 'info', 'warn', 'error'], function (method) {\n var consoleMethod = console[method];\n logger[method] = typeof consoleMethod === 'function' ? consoleMethod.bind(console, '[bugsnag]') : consoleLog.bind(console, '[bugsnag]');\n });\n return logger;\n};\n\nvar Breadcrumb = /*#__PURE__*/function () {\n function Breadcrumb(message, metadata, type, timestamp) {\n if (timestamp === void 0) {\n timestamp = new Date();\n }\n\n this.type = type;\n this.message = message;\n this.metadata = metadata;\n this.timestamp = timestamp;\n }\n\n var _proto = Breadcrumb.prototype;\n\n _proto.toJSON = function toJSON() {\n return {\n type: this.type,\n name: this.message,\n timestamp: this.timestamp,\n metaData: this.metadata\n };\n };\n\n return Breadcrumb;\n}();\n\nvar _$Breadcrumb_3 = Breadcrumb;\n\nvar _$stackframe_34 = {};\n(function (root, factory) {\n 'use strict'; // Universal Module Definition (UMD) to support AMD, CommonJS/Node.js, Rhino, and browsers.\n\n /* istanbul ignore next */\n\n if (typeof define === 'function' && define.amd) {\n define('stackframe', [], factory);\n } else if (typeof _$stackframe_34 === 'object') {\n _$stackframe_34 = factory();\n } else {\n root.StackFrame = factory();\n }\n})(this, function () {\n 'use strict';\n\n function _isNumber(n) {\n return !isNaN(parseFloat(n)) && isFinite(n);\n }\n\n function _capitalize(str) {\n return str.charAt(0).toUpperCase() + str.substring(1);\n }\n\n function _getter(p) {\n return function () {\n return this[p];\n };\n }\n\n var booleanProps = ['isConstructor', 'isEval', 'isNative', 'isToplevel'];\n var numericProps = ['columnNumber', 'lineNumber'];\n var stringProps = ['fileName', 'functionName', 'source'];\n var arrayProps = ['args'];\n var props = booleanProps.concat(numericProps, stringProps, arrayProps);\n\n function StackFrame(obj) {\n if (obj instanceof Object) {\n for (var i = 0; i < props.length; i++) {\n if (obj.hasOwnProperty(props[i]) && obj[props[i]] !== undefined) {\n this['set' + _capitalize(props[i])](obj[props[i]]);\n }\n }\n }\n }\n\n StackFrame.prototype = {\n getArgs: function () {\n return this.args;\n },\n setArgs: function (v) {\n if (Object.prototype.toString.call(v) !== '[object Array]') {\n throw new TypeError('Args must be an Array');\n }\n\n this.args = v;\n },\n getEvalOrigin: function () {\n return this.evalOrigin;\n },\n setEvalOrigin: function (v) {\n if (v instanceof StackFrame) {\n this.evalOrigin = v;\n } else if (v instanceof Object) {\n this.evalOrigin = new StackFrame(v);\n } else {\n throw new TypeError('Eval Origin must be an Object or StackFrame');\n }\n },\n toString: function () {\n var functionName = this.getFunctionName() || '{anonymous}';\n var args = '(' + (this.getArgs() || []).join(',') + ')';\n var fileName = this.getFileName() ? '@' + this.getFileName() : '';\n var lineNumber = _isNumber(this.getLineNumber()) ? ':' + this.getLineNumber() : '';\n var columnNumber = _isNumber(this.getColumnNumber()) ? ':' + this.getColumnNumber() : '';\n return functionName + args + fileName + lineNumber + columnNumber;\n }\n };\n\n for (var i = 0; i < booleanProps.length; i++) {\n StackFrame.prototype['get' + _capitalize(booleanProps[i])] = _getter(booleanProps[i]);\n\n StackFrame.prototype['set' + _capitalize(booleanProps[i])] = function (p) {\n return function (v) {\n this[p] = Boolean(v);\n };\n }(booleanProps[i]);\n }\n\n for (var j = 0; j < numericProps.length; j++) {\n StackFrame.prototype['get' + _capitalize(numericProps[j])] = _getter(numericProps[j]);\n\n StackFrame.prototype['set' + _capitalize(numericProps[j])] = function (p) {\n return function (v) {\n if (!_isNumber(v)) {\n throw new TypeError(p + ' must be a Number');\n }\n\n this[p] = Number(v);\n };\n }(numericProps[j]);\n }\n\n for (var k = 0; k < stringProps.length; k++) {\n StackFrame.prototype['get' + _capitalize(stringProps[k])] = _getter(stringProps[k]);\n\n StackFrame.prototype['set' + _capitalize(stringProps[k])] = function (p) {\n return function (v) {\n this[p] = String(v);\n };\n }(stringProps[k]);\n }\n\n return StackFrame;\n});\n\nvar _$errorStackParser_31 = {};\n(function (root, factory) {\n 'use strict'; // Universal Module Definition (UMD) to support AMD, CommonJS/Node.js, Rhino, and browsers.\n\n /* istanbul ignore next */\n\n if (typeof define === 'function' && define.amd) {\n define('error-stack-parser', ['stackframe'], factory);\n } else if (typeof _$errorStackParser_31 === 'object') {\n _$errorStackParser_31 = factory(_$stackframe_34);\n } else {\n root.ErrorStackParser = factory(root.StackFrame);\n }\n})(this, function ErrorStackParser(StackFrame) {\n 'use strict';\n\n var FIREFOX_SAFARI_STACK_REGEXP = /(^|@)\\S+\\:\\d+/;\n var CHROME_IE_STACK_REGEXP = /^\\s*at .*(\\S+\\:\\d+|\\(native\\))/m;\n var SAFARI_NATIVE_CODE_REGEXP = /^(eval@)?(\\[native code\\])?$/;\n return {\n /**\n * Given an Error object, extract the most information from it.\n *\n * @param {Error} error object\n * @return {Array} of StackFrames\n */\n parse: function ErrorStackParser$$parse(error) {\n if (typeof error.stacktrace !== 'undefined' || typeof error['opera#sourceloc'] !== 'undefined') {\n return this.parseOpera(error);\n } else if (error.stack && error.stack.match(CHROME_IE_STACK_REGEXP)) {\n return this.parseV8OrIE(error);\n } else if (error.stack) {\n return this.parseFFOrSafari(error);\n } else {\n throw new Error('Cannot parse given Error object');\n }\n },\n // Separate line and column numbers from a string of the form: (URI:Line:Column)\n extractLocation: function ErrorStackParser$$extractLocation(urlLike) {\n // Fail-fast but return locations like \"(native)\"\n if (urlLike.indexOf(':') === -1) {\n return [urlLike];\n }\n\n var regExp = /(.+?)(?:\\:(\\d+))?(?:\\:(\\d+))?$/;\n var parts = regExp.exec(urlLike.replace(/[\\(\\)]/g, ''));\n return [parts[1], parts[2] || undefined, parts[3] || undefined];\n },\n parseV8OrIE: function ErrorStackParser$$parseV8OrIE(error) {\n var filtered = error.stack.split('\\n').filter(function (line) {\n return !!line.match(CHROME_IE_STACK_REGEXP);\n }, this);\n return filtered.map(function (line) {\n if (line.indexOf('(eval ') > -1) {\n // Throw away eval information until we implement stacktrace.js/stackframe#8\n line = line.replace(/eval code/g, 'eval').replace(/(\\(eval at [^\\()]*)|(\\)\\,.*$)/g, '');\n }\n\n var sanitizedLine = line.replace(/^\\s+/, '').replace(/\\(eval code/g, '('); // capture and preseve the parenthesized location \"(/foo/my bar.js:12:87)\" in\n // case it has spaces in it, as the string is split on \\s+ later on\n\n var location = sanitizedLine.match(/ (\\((.+):(\\d+):(\\d+)\\)$)/); // remove the parenthesized location from the line, if it was matched\n\n sanitizedLine = location ? sanitizedLine.replace(location[0], '') : sanitizedLine;\n var tokens = sanitizedLine.split(/\\s+/).slice(1); // if a location was matched, pass it to extractLocation() otherwise pop the last token\n\n var locationParts = this.extractLocation(location ? location[1] : tokens.pop());\n var functionName = tokens.join(' ') || undefined;\n var fileName = ['eval', ''].indexOf(locationParts[0]) > -1 ? undefined : locationParts[0];\n return new StackFrame({\n functionName: functionName,\n fileName: fileName,\n lineNumber: locationParts[1],\n columnNumber: locationParts[2],\n source: line\n });\n }, this);\n },\n parseFFOrSafari: function ErrorStackParser$$parseFFOrSafari(error) {\n var filtered = error.stack.split('\\n').filter(function (line) {\n return !line.match(SAFARI_NATIVE_CODE_REGEXP);\n }, this);\n return filtered.map(function (line) {\n // Throw away eval information until we implement stacktrace.js/stackframe#8\n if (line.indexOf(' > eval') > -1) {\n line = line.replace(/ line (\\d+)(?: > eval line \\d+)* > eval\\:\\d+\\:\\d+/g, ':$1');\n }\n\n if (line.indexOf('@') === -1 && line.indexOf(':') === -1) {\n // Safari eval frames only have function names and nothing else\n return new StackFrame({\n functionName: line\n });\n } else {\n var functionNameRegex = /((.*\".+\"[^@]*)?[^@]*)(?:@)/;\n var matches = line.match(functionNameRegex);\n var functionName = matches && matches[1] ? matches[1] : undefined;\n var locationParts = this.extractLocation(line.replace(functionNameRegex, ''));\n return new StackFrame({\n functionName: functionName,\n fileName: locationParts[0],\n lineNumber: locationParts[1],\n columnNumber: locationParts[2],\n source: line\n });\n }\n }, this);\n },\n parseOpera: function ErrorStackParser$$parseOpera(e) {\n if (!e.stacktrace || e.message.indexOf('\\n') > -1 && e.message.split('\\n').length > e.stacktrace.split('\\n').length) {\n return this.parseOpera9(e);\n } else if (!e.stack) {\n return this.parseOpera10(e);\n } else {\n return this.parseOpera11(e);\n }\n },\n parseOpera9: function ErrorStackParser$$parseOpera9(e) {\n var lineRE = /Line (\\d+).*script (?:in )?(\\S+)/i;\n var lines = e.message.split('\\n');\n var result = [];\n\n for (var i = 2, len = lines.length; i < len; i += 2) {\n var match = lineRE.exec(lines[i]);\n\n if (match) {\n result.push(new StackFrame({\n fileName: match[2],\n lineNumber: match[1],\n source: lines[i]\n }));\n }\n }\n\n return result;\n },\n parseOpera10: function ErrorStackParser$$parseOpera10(e) {\n var lineRE = /Line (\\d+).*script (?:in )?(\\S+)(?:: In function (\\S+))?$/i;\n var lines = e.stacktrace.split('\\n');\n var result = [];\n\n for (var i = 0, len = lines.length; i < len; i += 2) {\n var match = lineRE.exec(lines[i]);\n\n if (match) {\n result.push(new StackFrame({\n functionName: match[3] || undefined,\n fileName: match[2],\n lineNumber: match[1],\n source: lines[i]\n }));\n }\n }\n\n return result;\n },\n // Opera 10.65+ Error.stack very similar to FF/Safari\n parseOpera11: function ErrorStackParser$$parseOpera11(error) {\n var filtered = error.stack.split('\\n').filter(function (line) {\n return !!line.match(FIREFOX_SAFARI_STACK_REGEXP) && !line.match(/^Error created at/);\n }, this);\n return filtered.map(function (line) {\n var tokens = line.split('@');\n var locationParts = this.extractLocation(tokens.pop());\n var functionCall = tokens.shift() || '';\n var functionName = functionCall.replace(//, '$2').replace(/\\([^\\)]*\\)/g, '') || undefined;\n var argsRaw;\n\n if (functionCall.match(/\\(([^\\)]*)\\)/)) {\n argsRaw = functionCall.replace(/^[^\\(]+\\(([^\\)]*)\\)$/, '$1');\n }\n\n var args = argsRaw === undefined || argsRaw === '[arguments not available]' ? undefined : argsRaw.split(',');\n return new StackFrame({\n functionName: functionName,\n args: args,\n fileName: locationParts[0],\n lineNumber: locationParts[1],\n columnNumber: locationParts[2],\n source: line\n });\n }, this);\n }\n };\n});\n\nvar _$errorStackParser_10 = _$errorStackParser_31;\n\nvar _$safeJsonStringify_30 = function (data, replacer, space, opts) {\n var redactedKeys = opts && opts.redactedKeys ? opts.redactedKeys : [];\n var redactedPaths = opts && opts.redactedPaths ? opts.redactedPaths : [];\n return JSON.stringify(prepareObjForSerialization(data, redactedKeys, redactedPaths), replacer, space);\n};\n\nvar MAX_DEPTH = 20;\nvar MAX_EDGES = 25000;\nvar MIN_PRESERVED_DEPTH = 8;\nvar REPLACEMENT_NODE = '...';\n\nfunction isError(o) {\n return o instanceof Error || /^\\[object (Error|(Dom)?Exception)\\]$/.test(Object.prototype.toString.call(o));\n}\n\nfunction throwsMessage(err) {\n return '[Throws: ' + (err ? err.message : '?') + ']';\n}\n\nfunction find(haystack, needle) {\n for (var i = 0, len = haystack.length; i < len; i++) {\n if (haystack[i] === needle) return true;\n }\n\n return false;\n} // returns true if the string `path` starts with any of the provided `paths`\n\n\nfunction isDescendent(paths, path) {\n for (var i = 0, len = paths.length; i < len; i++) {\n if (path.indexOf(paths[i]) === 0) return true;\n }\n\n return false;\n}\n\nfunction shouldRedact(patterns, key) {\n for (var i = 0, len = patterns.length; i < len; i++) {\n if (typeof patterns[i] === 'string' && patterns[i].toLowerCase() === key.toLowerCase()) return true;\n if (patterns[i] && typeof patterns[i].test === 'function' && patterns[i].test(key)) return true;\n }\n\n return false;\n}\n\nfunction __isArray_30(obj) {\n return Object.prototype.toString.call(obj) === '[object Array]';\n}\n\nfunction safelyGetProp(obj, prop) {\n try {\n return obj[prop];\n } catch (err) {\n return throwsMessage(err);\n }\n}\n\nfunction prepareObjForSerialization(obj, redactedKeys, redactedPaths) {\n var seen = []; // store references to objects we have seen before\n\n var edges = 0;\n\n function visit(obj, path) {\n function edgesExceeded() {\n return path.length > MIN_PRESERVED_DEPTH && edges > MAX_EDGES;\n }\n\n edges++;\n if (path.length > MAX_DEPTH) return REPLACEMENT_NODE;\n if (edgesExceeded()) return REPLACEMENT_NODE;\n if (obj === null || typeof obj !== 'object') return obj;\n if (find(seen, obj)) return '[Circular]';\n seen.push(obj);\n\n if (typeof obj.toJSON === 'function') {\n try {\n // we're not going to count this as an edge because it\n // replaces the value of the currently visited object\n edges--;\n var fResult = visit(obj.toJSON(), path);\n seen.pop();\n return fResult;\n } catch (err) {\n return throwsMessage(err);\n }\n }\n\n var er = isError(obj);\n\n if (er) {\n edges--;\n var eResult = visit({\n name: obj.name,\n message: obj.message\n }, path);\n seen.pop();\n return eResult;\n }\n\n if (__isArray_30(obj)) {\n var aResult = [];\n\n for (var i = 0, len = obj.length; i < len; i++) {\n if (edgesExceeded()) {\n aResult.push(REPLACEMENT_NODE);\n break;\n }\n\n aResult.push(visit(obj[i], path.concat('[]')));\n }\n\n seen.pop();\n return aResult;\n }\n\n var result = {};\n\n try {\n for (var prop in obj) {\n if (!Object.prototype.hasOwnProperty.call(obj, prop)) continue;\n\n if (isDescendent(redactedPaths, path.join('.')) && shouldRedact(redactedKeys, prop)) {\n result[prop] = '[REDACTED]';\n continue;\n }\n\n if (edgesExceeded()) {\n result[prop] = REPLACEMENT_NODE;\n break;\n }\n\n result[prop] = visit(safelyGetProp(obj, prop), path.concat(prop));\n }\n } catch (e) {}\n\n seen.pop();\n return result;\n }\n\n return visit(obj, []);\n}\n\n/* removed: var _$map_16 = require('./es-utils/map'); */;\n\n/* removed: var _$filter_12 = require('./es-utils/filter'); */;\n\n/* removed: var _$isArray_14 = require('./es-utils/is-array'); */;\n\n/* removed: var _$safeJsonStringify_30 = require('@bugsnag/safe-json-stringify'); */;\n\nfunction add(existingFeatures, existingFeatureKeys, name, variant) {\n if (typeof name !== 'string') {\n return;\n }\n\n if (variant === undefined) {\n variant = null;\n } else if (variant !== null && typeof variant !== 'string') {\n variant = _$safeJsonStringify_30(variant);\n }\n\n var existingIndex = existingFeatureKeys[name];\n\n if (typeof existingIndex === 'number') {\n existingFeatures[existingIndex] = {\n name: name,\n variant: variant\n };\n return;\n }\n\n existingFeatures.push({\n name: name,\n variant: variant\n });\n existingFeatureKeys[name] = existingFeatures.length - 1;\n}\n\nfunction merge(existingFeatures, newFeatures, existingFeatureKeys) {\n if (!_$isArray_14(newFeatures)) {\n return;\n }\n\n for (var i = 0; i < newFeatures.length; ++i) {\n var feature = newFeatures[i];\n\n if (feature === null || typeof feature !== 'object') {\n continue;\n } // 'add' will handle if 'name' doesn't exist & 'variant' is optional\n\n\n add(existingFeatures, existingFeatureKeys, feature.name, feature.variant);\n }\n\n return existingFeatures;\n} // convert feature flags from a map of 'name -> variant' into the format required\n// by the Bugsnag Event API:\n// [{ featureFlag: 'name', variant: 'variant' }, { featureFlag: 'name 2' }]\n\n\nfunction toEventApi(featureFlags) {\n return _$map_16(_$filter_12(featureFlags, Boolean), function (_ref) {\n var name = _ref.name,\n variant = _ref.variant;\n var flag = {\n featureFlag: name\n }; // don't add a 'variant' property unless there's actually a value\n\n if (typeof variant === 'string') {\n flag.variant = variant;\n }\n\n return flag;\n });\n}\n\nfunction clear(features, featuresIndex, name) {\n var existingIndex = featuresIndex[name];\n\n if (typeof existingIndex === 'number') {\n features[existingIndex] = null;\n delete featuresIndex[name];\n }\n}\n\nvar _$featureFlagDelegate_18 = {\n add: add,\n clear: clear,\n merge: merge,\n toEventApi: toEventApi\n};\n\n// Given `err` which may be an error, does it have a stack property which is a string?\nvar _$hasStack_19 = function (err) {\n return !!err && (!!err.stack || !!err.stacktrace || !!err['opera#sourceloc']) && typeof (err.stack || err.stacktrace || err['opera#sourceloc']) === 'string' && err.stack !== err.name + \": \" + err.message;\n};\n\n/**\n * Expose `isError`.\n */\nvar _$isError_32 = __isError_32;\n/**\n * Test whether `value` is error object.\n *\n * @param {*} value\n * @returns {boolean}\n */\n\nfunction __isError_32(value) {\n switch (Object.prototype.toString.call(value)) {\n case '[object Error]':\n return true;\n\n case '[object Exception]':\n return true;\n\n case '[object DOMException]':\n return true;\n\n default:\n return value instanceof Error;\n }\n}\n\nvar _$iserror_20 = _$isError_32;\n\n/* removed: var _$assign_11 = require('./es-utils/assign'); */;\n\nvar __add_22 = function (state, section, keyOrObj, maybeVal) {\n var _updates;\n\n if (!section) return;\n var updates; // addMetadata(\"section\", null) -> clears section\n\n if (keyOrObj === null) return __clear_22(state, section); // normalise the two supported input types into object form\n\n if (typeof keyOrObj === 'object') updates = keyOrObj;\n if (typeof keyOrObj === 'string') updates = (_updates = {}, _updates[keyOrObj] = maybeVal, _updates); // exit if we don't have an updates object at this point\n\n if (!updates) return; // ensure a section with this name exists\n\n if (!state[section]) state[section] = {}; // merge the updates with the existing section\n\n state[section] = _$assign_11({}, state[section], updates);\n};\n\nvar get = function (state, section, key) {\n if (typeof section !== 'string') return undefined;\n\n if (!key) {\n return state[section];\n }\n\n if (state[section]) {\n return state[section][key];\n }\n\n return undefined;\n};\n\nvar __clear_22 = function (state, section, key) {\n if (typeof section !== 'string') return; // clear an entire section\n\n if (!key) {\n delete state[section];\n return;\n } // clear a single value from a section\n\n\n if (state[section]) {\n delete state[section][key];\n }\n};\n\nvar _$metadataDelegate_22 = {\n add: __add_22,\n get: get,\n clear: __clear_22\n};\n\nvar _$stackGenerator_33 = {};\n(function (root, factory) {\n 'use strict'; // Universal Module Definition (UMD) to support AMD, CommonJS/Node.js, Rhino, and browsers.\n\n /* istanbul ignore next */\n\n if (typeof define === 'function' && define.amd) {\n define('stack-generator', ['stackframe'], factory);\n } else if (typeof _$stackGenerator_33 === 'object') {\n _$stackGenerator_33 = factory(_$stackframe_34);\n } else {\n root.StackGenerator = factory(root.StackFrame);\n }\n})(this, function (StackFrame) {\n return {\n backtrace: function StackGenerator$$backtrace(opts) {\n var stack = [];\n var maxStackSize = 10;\n\n if (typeof opts === 'object' && typeof opts.maxStackSize === 'number') {\n maxStackSize = opts.maxStackSize;\n }\n\n var curr = arguments.callee;\n\n while (curr && stack.length < maxStackSize && curr['arguments']) {\n // Allow V8 optimizations\n var args = new Array(curr['arguments'].length);\n\n for (var i = 0; i < args.length; ++i) {\n args[i] = curr['arguments'][i];\n }\n\n if (/function(?:\\s+([\\w$]+))+\\s*\\(/.test(curr.toString())) {\n stack.push(new StackFrame({\n functionName: RegExp.$1 || undefined,\n args: args\n }));\n } else {\n stack.push(new StackFrame({\n args: args\n }));\n }\n\n try {\n curr = curr.caller;\n } catch (e) {\n break;\n }\n }\n\n return stack;\n }\n };\n});\n\n/* removed: var _$errorStackParser_10 = require('./lib/error-stack-parser'); */;\n\n/* removed: var _$stackGenerator_33 = require('stack-generator'); */;\n\n/* removed: var _$hasStack_19 = require('./lib/has-stack'); */;\n\n/* removed: var _$map_16 = require('./lib/es-utils/map'); */;\n\n/* removed: var _$reduce_17 = require('./lib/es-utils/reduce'); */;\n\n/* removed: var _$filter_12 = require('./lib/es-utils/filter'); */;\n\n/* removed: var _$assign_11 = require('./lib/es-utils/assign'); */;\n\n/* removed: var _$metadataDelegate_22 = require('./lib/metadata-delegate'); */;\n\n/* removed: var _$featureFlagDelegate_18 = require('./lib/feature-flag-delegate'); */;\n\n/* removed: var _$iserror_20 = require('./lib/iserror'); */;\n\nvar Event = /*#__PURE__*/function () {\n function Event(errorClass, errorMessage, stacktrace, handledState, originalError) {\n if (stacktrace === void 0) {\n stacktrace = [];\n }\n\n if (handledState === void 0) {\n handledState = defaultHandledState();\n }\n\n this.apiKey = undefined;\n this.context = undefined;\n this.groupingHash = undefined;\n this.originalError = originalError;\n this._handledState = handledState;\n this.severity = this._handledState.severity;\n this.unhandled = this._handledState.unhandled;\n this.app = {};\n this.device = {};\n this.request = {};\n this.breadcrumbs = [];\n this.threads = [];\n this._metadata = {};\n this._features = [];\n this._featuresIndex = {};\n this._user = {};\n this._session = undefined;\n this.errors = [createBugsnagError(errorClass, errorMessage, Event.__type, stacktrace)]; // Flags.\n // Note these are not initialised unless they are used\n // to save unnecessary bytes in the browser bundle\n\n /* this.attemptImmediateDelivery, default: true */\n }\n\n var _proto = Event.prototype;\n\n _proto.addMetadata = function addMetadata(section, keyOrObj, maybeVal) {\n return _$metadataDelegate_22.add(this._metadata, section, keyOrObj, maybeVal);\n };\n\n _proto.getMetadata = function getMetadata(section, key) {\n return _$metadataDelegate_22.get(this._metadata, section, key);\n };\n\n _proto.clearMetadata = function clearMetadata(section, key) {\n return _$metadataDelegate_22.clear(this._metadata, section, key);\n };\n\n _proto.addFeatureFlag = function addFeatureFlag(name, variant) {\n if (variant === void 0) {\n variant = null;\n }\n\n _$featureFlagDelegate_18.add(this._features, this._featuresIndex, name, variant);\n };\n\n _proto.addFeatureFlags = function addFeatureFlags(featureFlags) {\n _$featureFlagDelegate_18.merge(this._features, featureFlags, this._featuresIndex);\n };\n\n _proto.getFeatureFlags = function getFeatureFlags() {\n return _$featureFlagDelegate_18.toEventApi(this._features);\n };\n\n _proto.clearFeatureFlag = function clearFeatureFlag(name) {\n _$featureFlagDelegate_18.clear(this._features, this._featuresIndex, name);\n };\n\n _proto.clearFeatureFlags = function clearFeatureFlags() {\n this._features = [];\n this._featuresIndex = {};\n };\n\n _proto.getUser = function getUser() {\n return this._user;\n };\n\n _proto.setUser = function setUser(id, email, name) {\n this._user = {\n id: id,\n email: email,\n name: name\n };\n };\n\n _proto.toJSON = function toJSON() {\n return {\n payloadVersion: '4',\n exceptions: _$map_16(this.errors, function (er) {\n return _$assign_11({}, er, {\n message: er.errorMessage\n });\n }),\n severity: this.severity,\n unhandled: this._handledState.unhandled,\n severityReason: this._handledState.severityReason,\n app: this.app,\n device: this.device,\n request: this.request,\n breadcrumbs: this.breadcrumbs,\n context: this.context,\n groupingHash: this.groupingHash,\n metaData: this._metadata,\n user: this._user,\n session: this._session,\n featureFlags: this.getFeatureFlags()\n };\n };\n\n return Event;\n}(); // takes a stacktrace.js style stackframe (https://github.com/stacktracejs/stackframe)\n// and returns a Bugsnag compatible stackframe (https://docs.bugsnag.com/api/error-reporting/#json-payload)\n\n\nvar formatStackframe = function (frame) {\n var f = {\n file: frame.fileName,\n method: normaliseFunctionName(frame.functionName),\n lineNumber: frame.lineNumber,\n columnNumber: frame.columnNumber,\n code: undefined,\n inProject: undefined\n }; // Some instances result in no file:\n // - calling notify() from chrome's terminal results in no file/method.\n // - non-error exception thrown from global code in FF\n // This adds one.\n\n if (f.lineNumber > -1 && !f.file && !f.method) {\n f.file = 'global code';\n }\n\n return f;\n};\n\nvar normaliseFunctionName = function (name) {\n return /^global code$/i.test(name) ? 'global code' : name;\n};\n\nvar defaultHandledState = function () {\n return {\n unhandled: false,\n severity: 'warning',\n severityReason: {\n type: 'handledException'\n }\n };\n};\n\nvar ensureString = function (str) {\n return typeof str === 'string' ? str : '';\n};\n\nfunction createBugsnagError(errorClass, errorMessage, type, stacktrace) {\n return {\n errorClass: ensureString(errorClass),\n errorMessage: ensureString(errorMessage),\n type: type,\n stacktrace: _$reduce_17(stacktrace, function (accum, frame) {\n var f = formatStackframe(frame); // don't include a stackframe if none of its properties are defined\n\n try {\n if (JSON.stringify(f) === '{}') return accum;\n return accum.concat(f);\n } catch (e) {\n return accum;\n }\n }, [])\n };\n}\n\nfunction getCauseStack(error) {\n if (error.cause) {\n return [error].concat(getCauseStack(error.cause));\n } else {\n return [error];\n }\n} // Helpers\n\n\nEvent.getStacktrace = function (error, errorFramesToSkip, backtraceFramesToSkip) {\n if (_$hasStack_19(error)) return _$errorStackParser_10.parse(error).slice(errorFramesToSkip); // error wasn't provided or didn't have a stacktrace so try to walk the callstack\n\n try {\n return _$filter_12(_$stackGenerator_33.backtrace(), function (frame) {\n return (frame.functionName || '').indexOf('StackGenerator$$') === -1;\n }).slice(1 + backtraceFramesToSkip);\n } catch (e) {\n return [];\n }\n};\n\nEvent.create = function (maybeError, tolerateNonErrors, handledState, component, errorFramesToSkip, logger) {\n if (errorFramesToSkip === void 0) {\n errorFramesToSkip = 0;\n }\n\n var _normaliseError = normaliseError(maybeError, tolerateNonErrors, component, logger),\n error = _normaliseError[0],\n internalFrames = _normaliseError[1];\n\n var event;\n\n try {\n var stacktrace = Event.getStacktrace(error, // if an error was created/throw in the normaliseError() function, we need to\n // tell the getStacktrace() function to skip the number of frames we know will\n // be from our own functions. This is added to the number of frames deep we\n // were told about\n internalFrames > 0 ? 1 + internalFrames + errorFramesToSkip : 0, // if there's no stacktrace, the callstack may be walked to generated one.\n // this is how many frames should be removed because they come from our library\n 1 + errorFramesToSkip);\n event = new Event(error.name, error.message, stacktrace, handledState, maybeError);\n } catch (e) {\n event = new Event(error.name, error.message, [], handledState, maybeError);\n }\n\n if (error.name === 'InvalidError') {\n event.addMetadata(\"\" + component, 'non-error parameter', makeSerialisable(maybeError));\n }\n\n if (error.cause) {\n var _event$errors;\n\n var causes = getCauseStack(error).slice(1);\n var normalisedCauses = _$map_16(causes, function (cause) {\n // Only get stacktrace for error causes that are a valid JS Error and already have a stack\n var stacktrace = _$iserror_20(cause) && _$hasStack_19(cause) ? _$errorStackParser_10.parse(cause) : [];\n\n var _normaliseError2 = normaliseError(cause, true, 'error cause'),\n error = _normaliseError2[0];\n\n if (error.name === 'InvalidError') event.addMetadata('error cause', makeSerialisable(cause));\n return createBugsnagError(error.name, error.message, Event.__type, stacktrace);\n });\n\n (_event$errors = event.errors).push.apply(_event$errors, normalisedCauses);\n }\n\n return event;\n};\n\nvar makeSerialisable = function (err) {\n if (err === null) return 'null';\n if (err === undefined) return 'undefined';\n return err;\n};\n\nvar normaliseError = function (maybeError, tolerateNonErrors, component, logger) {\n var error;\n var internalFrames = 0;\n\n var createAndLogInputError = function (reason) {\n var verb = component === 'error cause' ? 'was' : 'received';\n if (logger) logger.warn(component + \" \" + verb + \" a non-error: \\\"\" + reason + \"\\\"\");\n var err = new Error(component + \" \" + verb + \" a non-error. See \\\"\" + component + \"\\\" tab for more detail.\");\n err.name = 'InvalidError';\n return err;\n }; // In some cases:\n //\n // - the promise rejection handler (both in the browser and node)\n // - the node uncaughtException handler\n //\n // We are really limited in what we can do to get a stacktrace. So we use the\n // tolerateNonErrors option to ensure that the resulting error communicates as\n // such.\n\n\n if (!tolerateNonErrors) {\n if (_$iserror_20(maybeError)) {\n error = maybeError;\n } else {\n error = createAndLogInputError(typeof maybeError);\n internalFrames += 2;\n }\n } else {\n switch (typeof maybeError) {\n case 'string':\n case 'number':\n case 'boolean':\n error = new Error(String(maybeError));\n internalFrames += 1;\n break;\n\n case 'function':\n error = createAndLogInputError('function');\n internalFrames += 2;\n break;\n\n case 'object':\n if (maybeError !== null && _$iserror_20(maybeError)) {\n error = maybeError;\n } else if (maybeError !== null && hasNecessaryFields(maybeError)) {\n error = new Error(maybeError.message || maybeError.errorMessage);\n error.name = maybeError.name || maybeError.errorClass;\n internalFrames += 1;\n } else {\n error = createAndLogInputError(maybeError === null ? 'null' : 'unsupported object');\n internalFrames += 2;\n }\n\n break;\n\n default:\n error = createAndLogInputError('nothing');\n internalFrames += 2;\n }\n }\n\n if (!_$hasStack_19(error)) {\n // in IE10/11 a new Error() doesn't have a stacktrace until you throw it, so try that here\n try {\n throw error;\n } catch (e) {\n if (_$hasStack_19(e)) {\n error = e; // if the error only got a stacktrace after we threw it here, we know it\n // will only have one extra internal frame from this function, regardless\n // of whether it went through createAndLogInputError() or not\n\n internalFrames = 1;\n }\n }\n }\n\n return [error, internalFrames];\n}; // default value for stacktrace.type\n\n\nEvent.__type = 'browserjs';\n\nvar hasNecessaryFields = function (error) {\n return (typeof error.name === 'string' || typeof error.errorClass === 'string') && (typeof error.message === 'string' || typeof error.errorMessage === 'string');\n};\n\nvar _$Event_6 = Event;\n\n// This is a heavily modified/simplified version of\n// https://github.com/othiym23/async-some\n// with the logic flipped so that it is akin to the\n// synchronous \"every\" method instead of \"some\".\n// run the asynchronous test function (fn) over each item in the array (arr)\n// in series until:\n// - fn(item, cb) => calls cb(null, false)\n// - or the end of the array is reached\n// the callback (cb) will be passed (null, false) if any of the items in arr\n// caused fn to call back with false, otherwise it will be passed (null, true)\nvar _$asyncEvery_7 = function (arr, fn, cb) {\n var index = 0;\n\n var next = function () {\n if (index >= arr.length) return cb(null, true);\n fn(arr[index], function (err, result) {\n if (err) return cb(err);\n if (result === false) return cb(null, false);\n index++;\n next();\n });\n };\n\n next();\n};\n\n/* removed: var _$asyncEvery_7 = require('./async-every'); */;\n\nvar _$callbackRunner_9 = function (callbacks, event, onCallbackError, cb) {\n // This function is how we support different kinds of callback:\n // - synchronous - return value\n // - node-style async with callback - cb(err, value)\n // - promise/thenable - resolve(value)\n // It normalises each of these into the lowest common denominator – a node-style callback\n var runMaybeAsyncCallback = function (fn, cb) {\n if (typeof fn !== 'function') return cb(null);\n\n try {\n // if function appears sync…\n if (fn.length !== 2) {\n var ret = fn(event); // check if it returned a \"thenable\" (promise)\n\n if (ret && typeof ret.then === 'function') {\n return ret.then( // resolve\n function (val) {\n return setTimeout(function () {\n return cb(null, val);\n });\n }, // reject\n function (err) {\n setTimeout(function () {\n onCallbackError(err);\n return cb(null, true);\n });\n });\n }\n\n return cb(null, ret);\n } // if function is async…\n\n\n fn(event, function (err, result) {\n if (err) {\n onCallbackError(err);\n return cb(null);\n }\n\n cb(null, result);\n });\n } catch (e) {\n onCallbackError(e);\n cb(null);\n }\n };\n\n _$asyncEvery_7(callbacks, runMaybeAsyncCallback, cb);\n};\n\nvar _$syncCallbackRunner_23 = function (callbacks, callbackArg, callbackType, logger) {\n var ignore = false;\n var cbs = callbacks.slice();\n\n while (!ignore) {\n if (!cbs.length) break;\n\n try {\n ignore = cbs.pop()(callbackArg) === false;\n } catch (e) {\n logger.error(\"Error occurred in \" + callbackType + \" callback, continuing anyway\\u2026\");\n logger.error(e);\n }\n }\n\n return ignore;\n};\n\nvar _$pad_29 = function pad(num, size) {\n var s = '000000000' + num;\n return s.substr(s.length - size);\n};\n\n/* removed: var _$pad_29 = require('./pad.js'); */;\n\nvar env = typeof window === 'object' ? window : self;\nvar globalCount = 0;\n\nfor (var prop in env) {\n if (Object.hasOwnProperty.call(env, prop)) globalCount++;\n}\n\nvar mimeTypesLength = navigator.mimeTypes ? navigator.mimeTypes.length : 0;\nvar clientId = _$pad_29((mimeTypesLength + navigator.userAgent.length).toString(36) + globalCount.toString(36), 4);\n\nvar _$fingerprint_28 = function fingerprint() {\n return clientId;\n};\n\n/**\n * cuid.js\n * Collision-resistant UID generator for browsers and node.\n * Sequential for fast db lookups and recency sorting.\n * Safe for element IDs and server-side lookups.\n *\n * Extracted from CLCTR\n *\n * Copyright (c) Eric Elliott 2012\n * MIT License\n */\n/* removed: var _$fingerprint_28 = require('./lib/fingerprint.js'); */;\n\n/* removed: var _$pad_29 = require('./lib/pad.js'); */;\n\nvar c = 0,\n blockSize = 4,\n base = 36,\n discreteValues = Math.pow(base, blockSize);\n\nfunction randomBlock() {\n return _$pad_29((Math.random() * discreteValues << 0).toString(base), blockSize);\n}\n\nfunction safeCounter() {\n c = c < discreteValues ? c : 0;\n c++; // this is not subliminal\n\n return c - 1;\n}\n\nfunction cuid() {\n // Starting with a lowercase letter makes\n // it HTML element ID friendly.\n var letter = 'c',\n // hard-coded allows for sequential access\n // timestamp\n // warning: this exposes the exact date and time\n // that the uid was created.\n timestamp = new Date().getTime().toString(base),\n // Prevent same-machine collisions.\n counter = _$pad_29(safeCounter().toString(base), blockSize),\n // A few chars to generate distinct ids for different\n // clients (so different computers are far less\n // likely to generate the same id)\n print = _$fingerprint_28(),\n // Grab some more chars from Math.random()\n random = randomBlock() + randomBlock();\n return letter + timestamp + counter + print + random;\n}\n\ncuid.fingerprint = _$fingerprint_28;\nvar _$cuid_27 = cuid;\n\n/* removed: var _$cuid_27 = require('@bugsnag/cuid'); */;\n\nvar Session = /*#__PURE__*/function () {\n function Session() {\n this.id = _$cuid_27();\n this.startedAt = new Date();\n this._handled = 0;\n this._unhandled = 0;\n this._user = {};\n this.app = {};\n this.device = {};\n }\n\n var _proto = Session.prototype;\n\n _proto.getUser = function getUser() {\n return this._user;\n };\n\n _proto.setUser = function setUser(id, email, name) {\n this._user = {\n id: id,\n email: email,\n name: name\n };\n };\n\n _proto.toJSON = function toJSON() {\n return {\n id: this.id,\n startedAt: this.startedAt,\n events: {\n handled: this._handled,\n unhandled: this._unhandled\n }\n };\n };\n\n _proto._track = function _track(event) {\n this[event._handledState.unhandled ? '_unhandled' : '_handled'] += 1;\n };\n\n return Session;\n}();\n\nvar _$Session_35 = Session;\n\n/* removed: var _$config_5 = require('./config'); */;\n\n/* removed: var _$Event_6 = require('./event'); */;\n\n/* removed: var _$Breadcrumb_3 = require('./breadcrumb'); */;\n\n/* removed: var _$Session_35 = require('./session'); */;\n\n/* removed: var _$map_16 = require('./lib/es-utils/map'); */;\n\n/* removed: var _$includes_13 = require('./lib/es-utils/includes'); */;\n\n/* removed: var _$filter_12 = require('./lib/es-utils/filter'); */;\n\n/* removed: var _$reduce_17 = require('./lib/es-utils/reduce'); */;\n\n/* removed: var _$keys_15 = require('./lib/es-utils/keys'); */;\n\n/* removed: var _$assign_11 = require('./lib/es-utils/assign'); */;\n\n/* removed: var _$callbackRunner_9 = require('./lib/callback-runner'); */;\n\n/* removed: var _$metadataDelegate_22 = require('./lib/metadata-delegate'); */;\n\n/* removed: var _$syncCallbackRunner_23 = require('./lib/sync-callback-runner'); */;\n\n/* removed: var _$breadcrumbTypes_8 = require('./lib/breadcrumb-types'); */;\n\nvar __add_4 = _$featureFlagDelegate_18.add,\n __clear_4 = _$featureFlagDelegate_18.clear,\n __merge_4 = _$featureFlagDelegate_18.merge;\n\nvar noop = function () {};\n\nvar Client = /*#__PURE__*/function () {\n function Client(configuration, schema, internalPlugins, notifier) {\n var _this = this;\n\n if (schema === void 0) {\n schema = _$config_5.schema;\n }\n\n if (internalPlugins === void 0) {\n internalPlugins = [];\n }\n\n // notifier id\n this._notifier = notifier; // intialise opts and config\n\n this._config = {};\n this._schema = schema; // i/o\n\n this._delivery = {\n sendSession: noop,\n sendEvent: noop\n };\n this._logger = {\n debug: noop,\n info: noop,\n warn: noop,\n error: noop\n }; // plugins\n\n this._plugins = {}; // state\n\n this._breadcrumbs = [];\n this._session = null;\n this._metadata = {};\n this._featuresIndex = {};\n this._features = [];\n this._context = undefined;\n this._user = {}; // callbacks:\n // e: onError\n // s: onSession\n // sp: onSessionPayload\n // b: onBreadcrumb\n // (note these names are minified by hand because object\n // properties are not safe to minify automatically)\n\n this._cbs = {\n e: [],\n s: [],\n sp: [],\n b: []\n }; // expose internal constructors\n\n this.Client = Client;\n this.Event = _$Event_6;\n this.Breadcrumb = _$Breadcrumb_3;\n this.Session = _$Session_35;\n this._config = this._configure(configuration, internalPlugins);\n _$map_16(internalPlugins.concat(this._config.plugins), function (pl) {\n if (pl) _this._loadPlugin(pl);\n }); // when notify() is called we need to know how many frames are from our own source\n // this inital value is 1 not 0 because we wrap notify() to ensure it is always\n // bound to have the client as its `this` value – see below.\n\n this._depth = 1;\n var self = this;\n var notify = this.notify;\n\n this.notify = function () {\n return notify.apply(self, arguments);\n };\n }\n\n var _proto = Client.prototype;\n\n _proto.addMetadata = function addMetadata(section, keyOrObj, maybeVal) {\n return _$metadataDelegate_22.add(this._metadata, section, keyOrObj, maybeVal);\n };\n\n _proto.getMetadata = function getMetadata(section, key) {\n return _$metadataDelegate_22.get(this._metadata, section, key);\n };\n\n _proto.clearMetadata = function clearMetadata(section, key) {\n return _$metadataDelegate_22.clear(this._metadata, section, key);\n };\n\n _proto.addFeatureFlag = function addFeatureFlag(name, variant) {\n if (variant === void 0) {\n variant = null;\n }\n\n __add_4(this._features, this._featuresIndex, name, variant);\n };\n\n _proto.addFeatureFlags = function addFeatureFlags(featureFlags) {\n __merge_4(this._features, featureFlags, this._featuresIndex);\n };\n\n _proto.clearFeatureFlag = function clearFeatureFlag(name) {\n __clear_4(this._features, this._featuresIndex, name);\n };\n\n _proto.clearFeatureFlags = function clearFeatureFlags() {\n this._features = [];\n this._featuresIndex = {};\n };\n\n _proto.getContext = function getContext() {\n return this._context;\n };\n\n _proto.setContext = function setContext(c) {\n this._context = c;\n };\n\n _proto._configure = function _configure(opts, internalPlugins) {\n var schema = _$reduce_17(internalPlugins, function (schema, plugin) {\n if (plugin && plugin.configSchema) return _$assign_11({}, schema, plugin.configSchema);\n return schema;\n }, this._schema); // accumulate configuration and error messages\n\n var _reduce = _$reduce_17(_$keys_15(schema), function (accum, key) {\n var defaultValue = schema[key].defaultValue(opts[key]);\n\n if (opts[key] !== undefined) {\n var valid = schema[key].validate(opts[key]);\n\n if (!valid) {\n accum.errors[key] = schema[key].message;\n accum.config[key] = defaultValue;\n } else {\n if (schema[key].allowPartialObject) {\n accum.config[key] = _$assign_11(defaultValue, opts[key]);\n } else {\n accum.config[key] = opts[key];\n }\n }\n } else {\n accum.config[key] = defaultValue;\n }\n\n return accum;\n }, {\n errors: {},\n config: {}\n }),\n errors = _reduce.errors,\n config = _reduce.config;\n\n if (schema.apiKey) {\n // missing api key is the only fatal error\n if (!config.apiKey) throw new Error('No Bugsnag API Key set'); // warn about an apikey that is not of the expected format\n\n if (!/^[0-9a-f]{32}$/i.test(config.apiKey)) errors.apiKey = 'should be a string of 32 hexadecimal characters';\n } // update and elevate some options\n\n\n this._metadata = _$assign_11({}, config.metadata);\n __merge_4(this._features, config.featureFlags, this._featuresIndex);\n this._user = _$assign_11({}, config.user);\n this._context = config.context;\n if (config.logger) this._logger = config.logger; // add callbacks\n\n if (config.onError) this._cbs.e = this._cbs.e.concat(config.onError);\n if (config.onBreadcrumb) this._cbs.b = this._cbs.b.concat(config.onBreadcrumb);\n if (config.onSession) this._cbs.s = this._cbs.s.concat(config.onSession); // finally warn about any invalid config where we fell back to the default\n\n if (_$keys_15(errors).length) {\n this._logger.warn(generateConfigErrorMessage(errors, opts));\n }\n\n return config;\n };\n\n _proto.getUser = function getUser() {\n return this._user;\n };\n\n _proto.setUser = function setUser(id, email, name) {\n this._user = {\n id: id,\n email: email,\n name: name\n };\n };\n\n _proto._loadPlugin = function _loadPlugin(plugin) {\n var result = plugin.load(this); // JS objects are not the safest way to store arbitrarily keyed values,\n // so bookend the key with some characters that prevent tampering with\n // stuff like __proto__ etc. (only store the result if the plugin had a\n // name)\n\n if (plugin.name) this._plugins[\"~\" + plugin.name + \"~\"] = result;\n return this;\n };\n\n _proto.getPlugin = function getPlugin(name) {\n return this._plugins[\"~\" + name + \"~\"];\n };\n\n _proto._setDelivery = function _setDelivery(d) {\n this._delivery = d(this);\n };\n\n _proto.startSession = function startSession() {\n var session = new _$Session_35();\n session.app.releaseStage = this._config.releaseStage;\n session.app.version = this._config.appVersion;\n session.app.type = this._config.appType;\n session._user = _$assign_11({}, this._user); // run onSession callbacks\n\n var ignore = _$syncCallbackRunner_23(this._cbs.s, session, 'onSession', this._logger);\n\n if (ignore) {\n this._logger.debug('Session not started due to onSession callback');\n\n return this;\n }\n\n return this._sessionDelegate.startSession(this, session);\n };\n\n _proto.addOnError = function addOnError(fn, front) {\n if (front === void 0) {\n front = false;\n }\n\n this._cbs.e[front ? 'unshift' : 'push'](fn);\n };\n\n _proto.removeOnError = function removeOnError(fn) {\n this._cbs.e = _$filter_12(this._cbs.e, function (f) {\n return f !== fn;\n });\n };\n\n _proto._addOnSessionPayload = function _addOnSessionPayload(fn) {\n this._cbs.sp.push(fn);\n };\n\n _proto.addOnSession = function addOnSession(fn) {\n this._cbs.s.push(fn);\n };\n\n _proto.removeOnSession = function removeOnSession(fn) {\n this._cbs.s = _$filter_12(this._cbs.s, function (f) {\n return f !== fn;\n });\n };\n\n _proto.addOnBreadcrumb = function addOnBreadcrumb(fn, front) {\n if (front === void 0) {\n front = false;\n }\n\n this._cbs.b[front ? 'unshift' : 'push'](fn);\n };\n\n _proto.removeOnBreadcrumb = function removeOnBreadcrumb(fn) {\n this._cbs.b = _$filter_12(this._cbs.b, function (f) {\n return f !== fn;\n });\n };\n\n _proto.pauseSession = function pauseSession() {\n return this._sessionDelegate.pauseSession(this);\n };\n\n _proto.resumeSession = function resumeSession() {\n return this._sessionDelegate.resumeSession(this);\n };\n\n _proto.leaveBreadcrumb = function leaveBreadcrumb(message, metadata, type) {\n // coerce bad values so that the defaults get set\n message = typeof message === 'string' ? message : '';\n type = typeof type === 'string' && _$includes_13(_$breadcrumbTypes_8, type) ? type : 'manual';\n metadata = typeof metadata === 'object' && metadata !== null ? metadata : {}; // if no message, discard\n\n if (!message) return;\n var crumb = new _$Breadcrumb_3(message, metadata, type); // run onBreadcrumb callbacks\n\n var ignore = _$syncCallbackRunner_23(this._cbs.b, crumb, 'onBreadcrumb', this._logger);\n\n if (ignore) {\n this._logger.debug('Breadcrumb not attached due to onBreadcrumb callback');\n\n return;\n } // push the valid crumb onto the queue and maintain the length\n\n\n this._breadcrumbs.push(crumb);\n\n if (this._breadcrumbs.length > this._config.maxBreadcrumbs) {\n this._breadcrumbs = this._breadcrumbs.slice(this._breadcrumbs.length - this._config.maxBreadcrumbs);\n }\n };\n\n _proto._isBreadcrumbTypeEnabled = function _isBreadcrumbTypeEnabled(type) {\n var types = this._config.enabledBreadcrumbTypes;\n return types === null || _$includes_13(types, type);\n };\n\n _proto.notify = function notify(maybeError, onError, postReportCallback) {\n if (postReportCallback === void 0) {\n postReportCallback = noop;\n }\n\n var event = _$Event_6.create(maybeError, true, undefined, 'notify()', this._depth + 1, this._logger);\n\n this._notify(event, onError, postReportCallback);\n };\n\n _proto._notify = function _notify(event, onError, postReportCallback) {\n var _this2 = this;\n\n if (postReportCallback === void 0) {\n postReportCallback = noop;\n }\n\n event.app = _$assign_11({}, event.app, {\n releaseStage: this._config.releaseStage,\n version: this._config.appVersion,\n type: this._config.appType\n });\n event.context = event.context || this._context;\n event._metadata = _$assign_11({}, event._metadata, this._metadata);\n event._user = _$assign_11({}, event._user, this._user);\n event.breadcrumbs = this._breadcrumbs.slice();\n __merge_4(event._features, this._features, event._featuresIndex); // exit early if events should not be sent on the current releaseStage\n\n if (this._config.enabledReleaseStages !== null && !_$includes_13(this._config.enabledReleaseStages, this._config.releaseStage)) {\n this._logger.warn('Event not sent due to releaseStage/enabledReleaseStages configuration');\n\n return postReportCallback(null, event);\n }\n\n var originalSeverity = event.severity;\n\n var onCallbackError = function (err) {\n // errors in callbacks are tolerated but we want to log them out\n _this2._logger.error('Error occurred in onError callback, continuing anyway…');\n\n _this2._logger.error(err);\n };\n\n var callbacks = [].concat(this._cbs.e).concat(onError);\n _$callbackRunner_9(callbacks, event, onCallbackError, function (err, shouldSend) {\n if (err) onCallbackError(err);\n\n if (!shouldSend) {\n _this2._logger.debug('Event not sent due to onError callback');\n\n return postReportCallback(null, event);\n }\n\n if (_this2._isBreadcrumbTypeEnabled('error')) {\n // only leave a crumb for the error if actually got sent\n Client.prototype.leaveBreadcrumb.call(_this2, event.errors[0].errorClass, {\n errorClass: event.errors[0].errorClass,\n errorMessage: event.errors[0].errorMessage,\n severity: event.severity\n }, 'error');\n }\n\n if (originalSeverity !== event.severity) {\n event._handledState.severityReason = {\n type: 'userCallbackSetSeverity'\n };\n }\n\n if (event.unhandled !== event._handledState.unhandled) {\n event._handledState.severityReason.unhandledOverridden = true;\n event._handledState.unhandled = event.unhandled;\n }\n\n if (_this2._session) {\n _this2._session._track(event);\n\n event._session = _this2._session;\n }\n\n _this2._delivery.sendEvent({\n apiKey: event.apiKey || _this2._config.apiKey,\n notifier: _this2._notifier,\n events: [event]\n }, function (err) {\n return postReportCallback(err, event);\n });\n });\n };\n\n return Client;\n}();\n\nvar generateConfigErrorMessage = function (errors, rawInput) {\n var er = new Error(\"Invalid configuration\\n\" + _$map_16(_$keys_15(errors), function (key) {\n return \" - \" + key + \" \" + errors[key] + \", got \" + stringify(rawInput[key]);\n }).join('\\n\\n'));\n return er;\n};\n\nvar stringify = function (val) {\n switch (typeof val) {\n case 'string':\n case 'number':\n case 'object':\n return JSON.stringify(val);\n\n default:\n return String(val);\n }\n};\n\nvar _$Client_4 = Client;\n\nvar _$jsonPayload_21 = {};\n/* removed: var _$safeJsonStringify_30 = require('@bugsnag/safe-json-stringify'); */;\n\nvar EVENT_REDACTION_PATHS = ['events.[].metaData', 'events.[].breadcrumbs.[].metaData', 'events.[].request'];\n\n_$jsonPayload_21.event = function (event, redactedKeys) {\n var payload = _$safeJsonStringify_30(event, null, null, {\n redactedPaths: EVENT_REDACTION_PATHS,\n redactedKeys: redactedKeys\n });\n\n if (payload.length > 10e5) {\n event.events[0]._metadata = {\n notifier: \"WARNING!\\nSerialized payload was \" + payload.length / 10e5 + \"MB (limit = 1MB)\\nmetadata was removed\"\n };\n payload = _$safeJsonStringify_30(event, null, null, {\n redactedPaths: EVENT_REDACTION_PATHS,\n redactedKeys: redactedKeys\n });\n }\n\n return payload;\n};\n\n_$jsonPayload_21.session = function (session, redactedKeys) {\n var payload = _$safeJsonStringify_30(session, null, null);\n return payload;\n};\n\nvar _$delivery_36 = {};\n/* removed: var _$jsonPayload_21 = require('@bugsnag/core/lib/json-payload'); */;\n\n_$delivery_36 = function (client, win) {\n if (win === void 0) {\n win = window;\n }\n\n return {\n sendEvent: function (event, cb) {\n if (cb === void 0) {\n cb = function () {};\n }\n\n var url = getApiUrl(client._config, 'notify', '4', win);\n var body = _$jsonPayload_21.event(event, client._config.redactedKeys);\n var req = new win.XDomainRequest();\n\n req.onload = function () {\n cb(null);\n };\n\n req.onerror = function () {\n var err = new Error('Event failed to send');\n\n client._logger.error('Event failed to send…', err);\n\n if (body.length > 10e5) {\n client._logger.warn(\"Event oversized (\" + (body.length / 10e5).toFixed(2) + \" MB)\");\n }\n\n cb(err);\n };\n\n req.open('POST', url);\n setTimeout(function () {\n try {\n req.send(body);\n } catch (e) {\n client._logger.error(e);\n\n cb(e);\n }\n }, 0);\n },\n sendSession: function (session, cb) {\n if (cb === void 0) {\n cb = function () {};\n }\n\n var url = getApiUrl(client._config, 'sessions', '1', win);\n var req = new win.XDomainRequest();\n\n req.onload = function () {\n cb(null);\n };\n\n req.open('POST', url);\n setTimeout(function () {\n try {\n req.send(_$jsonPayload_21.session(session, client._config.redactedKeys));\n } catch (e) {\n client._logger.error(e);\n\n cb(e);\n }\n }, 0);\n }\n };\n};\n\nvar getApiUrl = function (config, endpoint, version, win) {\n // IE8 doesn't support Date.prototype.toISOstring(), but it does convert a date\n // to an ISO string when you use JSON stringify. Simply parsing the result of\n // JSON.stringify is smaller than using a toISOstring() polyfill.\n var isoDate = JSON.parse(JSON.stringify(new Date()));\n var url = matchPageProtocol(config.endpoints[endpoint], win.location.protocol);\n return url + \"?apiKey=\" + encodeURIComponent(config.apiKey) + \"&payloadVersion=\" + version + \"&sentAt=\" + encodeURIComponent(isoDate);\n};\n\nvar matchPageProtocol = _$delivery_36._matchPageProtocol = function (endpoint, pageProtocol) {\n return pageProtocol === 'http:' ? endpoint.replace(/^https:/, 'http:') : endpoint;\n};\n\n/* removed: var _$jsonPayload_21 = require('@bugsnag/core/lib/json-payload'); */;\n\nvar _$delivery_37 = function (client, win) {\n if (win === void 0) {\n win = window;\n }\n\n return {\n sendEvent: function (event, cb) {\n if (cb === void 0) {\n cb = function () {};\n }\n\n try {\n var url = client._config.endpoints.notify;\n var req = new win.XMLHttpRequest();\n var body = _$jsonPayload_21.event(event, client._config.redactedKeys);\n\n req.onreadystatechange = function () {\n if (req.readyState === win.XMLHttpRequest.DONE) {\n var status = req.status;\n\n if (status === 0 || status >= 400) {\n var err = new Error(\"Request failed with status \" + status);\n\n client._logger.error('Event failed to send…', err);\n\n if (body.length > 10e5) {\n client._logger.warn(\"Event oversized (\" + (body.length / 10e5).toFixed(2) + \" MB)\");\n }\n\n cb(err);\n } else {\n cb(null);\n }\n }\n };\n\n req.open('POST', url);\n req.setRequestHeader('Content-Type', 'application/json');\n req.setRequestHeader('Bugsnag-Api-Key', event.apiKey || client._config.apiKey);\n req.setRequestHeader('Bugsnag-Payload-Version', '4');\n req.setRequestHeader('Bugsnag-Sent-At', new Date().toISOString());\n req.send(body);\n } catch (e) {\n client._logger.error(e);\n }\n },\n sendSession: function (session, cb) {\n if (cb === void 0) {\n cb = function () {};\n }\n\n try {\n var url = client._config.endpoints.sessions;\n var req = new win.XMLHttpRequest();\n\n req.onreadystatechange = function () {\n if (req.readyState === win.XMLHttpRequest.DONE) {\n var status = req.status;\n\n if (status === 0 || status >= 400) {\n var err = new Error(\"Request failed with status \" + status);\n\n client._logger.error('Session failed to send…', err);\n\n cb(err);\n } else {\n cb(null);\n }\n }\n };\n\n req.open('POST', url);\n req.setRequestHeader('Content-Type', 'application/json');\n req.setRequestHeader('Bugsnag-Api-Key', client._config.apiKey);\n req.setRequestHeader('Bugsnag-Payload-Version', '1');\n req.setRequestHeader('Bugsnag-Sent-At', new Date().toISOString());\n req.send(_$jsonPayload_21.session(session, client._config.redactedKeys));\n } catch (e) {\n client._logger.error(e);\n }\n }\n };\n};\n\nvar appStart = new Date();\n\nvar reset = function () {\n appStart = new Date();\n};\n\nvar _$app_38 = {\n name: 'appDuration',\n load: function (client) {\n client.addOnError(function (event) {\n var now = new Date();\n event.app.duration = now - appStart;\n }, true);\n return {\n reset: reset\n };\n }\n};\n\n/*\n * Sets the default context to be the current URL\n */\nvar _$context_39 = function (win) {\n if (win === void 0) {\n win = window;\n }\n\n return {\n load: function (client) {\n client.addOnError(function (event) {\n if (event.context !== undefined) return;\n event.context = win.location.pathname;\n }, true);\n }\n };\n};\n\nvar _$pad_43 = function pad(num, size) {\n var s = '000000000' + num;\n return s.substr(s.length - size);\n};\n\n/* removed: var _$pad_43 = require('./pad.js'); */;\n\nvar __env_42 = typeof window === 'object' ? window : self;\nvar __globalCount_42 = 0;\n\nfor (var __prop_42 in __env_42) {\n if (Object.hasOwnProperty.call(__env_42, __prop_42)) __globalCount_42++;\n}\n\nvar __mimeTypesLength_42 = navigator.mimeTypes ? navigator.mimeTypes.length : 0;\nvar __clientId_42 = _$pad_43((__mimeTypesLength_42 + navigator.userAgent.length).toString(36) + __globalCount_42.toString(36), 4);\n\nvar _$fingerprint_42 = function fingerprint() {\n return __clientId_42;\n};\n\n/**\n * cuid.js\n * Collision-resistant UID generator for browsers and node.\n * Sequential for fast db lookups and recency sorting.\n * Safe for element IDs and server-side lookups.\n *\n * Extracted from CLCTR\n *\n * Copyright (c) Eric Elliott 2012\n * MIT License\n */\n/* removed: var _$fingerprint_42 = require('./lib/fingerprint.js'); */;\n\n/* removed: var _$pad_43 = require('./lib/pad.js'); */;\n\nvar __c_41 = 0,\n __blockSize_41 = 4,\n __base_41 = 36,\n __discreteValues_41 = Math.pow(__base_41, __blockSize_41);\n\nfunction __randomBlock_41() {\n return _$pad_43((Math.random() * __discreteValues_41 << 0).toString(__base_41), __blockSize_41);\n}\n\nfunction __safeCounter_41() {\n __c_41 = __c_41 < __discreteValues_41 ? __c_41 : 0;\n __c_41++; // this is not subliminal\n\n return __c_41 - 1;\n}\n\nfunction __cuid_41() {\n // Starting with a lowercase letter makes\n // it HTML element ID friendly.\n var letter = 'c',\n // hard-coded allows for sequential access\n // timestamp\n // warning: this exposes the exact date and time\n // that the uid was created.\n timestamp = new Date().getTime().toString(__base_41),\n // Prevent same-machine collisions.\n counter = _$pad_43(__safeCounter_41().toString(__base_41), __blockSize_41),\n // A few chars to generate distinct ids for different\n // clients (so different computers are far less\n // likely to generate the same id)\n print = _$fingerprint_42(),\n // Grab some more chars from Math.random()\n random = __randomBlock_41() + __randomBlock_41();\n return letter + timestamp + counter + print + random;\n}\n\n__cuid_41.fingerprint = _$fingerprint_42;\nvar _$cuid_41 = __cuid_41;\n\n/* removed: var _$assign_11 = require('@bugsnag/core/lib/es-utils/assign'); */;\n\nvar BUGSNAG_ANONYMOUS_ID_KEY = 'bugsnag-anonymous-id';\n\nvar getDeviceId = function (win) {\n try {\n var storage = win.localStorage;\n var id = storage.getItem(BUGSNAG_ANONYMOUS_ID_KEY); // If we get an ID, make sure it looks like a valid cuid. The length can\n // fluctuate slightly, so some leeway is built in\n\n if (id && /^c[a-z0-9]{20,32}$/.test(id)) {\n return id;\n }\n\n /* removed: var _$cuid_41 = require('@bugsnag/cuid'); */;\n\n id = _$cuid_41();\n storage.setItem(BUGSNAG_ANONYMOUS_ID_KEY, id);\n return id;\n } catch (err) {// If localStorage is not available (e.g. because it's disabled) then give up\n }\n};\n/*\n * Automatically detects browser device details\n */\n\n\nvar _$device_40 = function (nav, win) {\n if (nav === void 0) {\n nav = navigator;\n }\n\n if (win === void 0) {\n win = window;\n }\n\n return {\n load: function (client) {\n var device = {\n locale: nav.browserLanguage || nav.systemLanguage || nav.userLanguage || nav.language,\n userAgent: nav.userAgent\n };\n\n if (win && win.screen && win.screen.orientation && win.screen.orientation.type) {\n device.orientation = win.screen.orientation.type;\n } else if (win && win.document) {\n device.orientation = win.document.documentElement.clientWidth > win.document.documentElement.clientHeight ? 'landscape' : 'portrait';\n }\n\n if (client._config.generateAnonymousId) {\n device.id = getDeviceId(win);\n }\n\n client.addOnSession(function (session) {\n session.device = _$assign_11({}, session.device, device); // only set device id if collectUserIp is false\n\n if (!client._config.collectUserIp) setDefaultUserId(session);\n }); // add time just as the event is sent\n\n client.addOnError(function (event) {\n event.device = _$assign_11({}, event.device, device, {\n time: new Date()\n });\n if (!client._config.collectUserIp) setDefaultUserId(event);\n }, true);\n },\n configSchema: {\n generateAnonymousId: {\n validate: function (value) {\n return value === true || value === false;\n },\n defaultValue: function () {\n return true;\n },\n message: 'should be true|false'\n }\n }\n };\n};\n\nvar setDefaultUserId = function (eventOrSession) {\n // device id is also used to populate the user id field, if it's not already set\n var user = eventOrSession.getUser();\n\n if (!user || !user.id) {\n eventOrSession.setUser(eventOrSession.device.id);\n }\n};\n\n/* removed: var _$assign_11 = require('@bugsnag/core/lib/es-utils/assign'); */;\n/*\n * Sets the event request: { url } to be the current href\n */\n\n\nvar _$request_44 = function (win) {\n if (win === void 0) {\n win = window;\n }\n\n return {\n load: function (client) {\n client.addOnError(function (event) {\n if (event.request && event.request.url) return;\n event.request = _$assign_11({}, event.request, {\n url: win.location.href\n });\n }, true);\n }\n };\n};\n\n/* removed: var _$includes_13 = require('@bugsnag/core/lib/es-utils/includes'); */;\n\nvar _$session_45 = {\n load: function (client) {\n client._sessionDelegate = sessionDelegate;\n }\n};\nvar sessionDelegate = {\n startSession: function (client, session) {\n var sessionClient = client;\n sessionClient._session = session;\n sessionClient._pausedSession = null; // exit early if the current releaseStage is not enabled\n\n if (sessionClient._config.enabledReleaseStages !== null && !_$includes_13(sessionClient._config.enabledReleaseStages, sessionClient._config.releaseStage)) {\n sessionClient._logger.warn('Session not sent due to releaseStage/enabledReleaseStages configuration');\n\n return sessionClient;\n }\n\n sessionClient._delivery.sendSession({\n notifier: sessionClient._notifier,\n device: session.device,\n app: session.app,\n sessions: [{\n id: session.id,\n startedAt: session.startedAt,\n user: session._user\n }]\n });\n\n return sessionClient;\n },\n resumeSession: function (client) {\n // Do nothing if there's already an active session\n if (client._session) {\n return client;\n } // If we have a paused session then make it the active session\n\n\n if (client._pausedSession) {\n client._session = client._pausedSession;\n client._pausedSession = null;\n return client;\n } // Otherwise start a new session\n\n\n return client.startSession();\n },\n pauseSession: function (client) {\n client._pausedSession = client._session;\n client._session = null;\n }\n};\n\n/* removed: var _$assign_11 = require('@bugsnag/core/lib/es-utils/assign'); */;\n/*\n * Prevent collection of user IPs\n */\n\n\nvar _$clientIp_46 = {\n load: function (client) {\n if (client._config.collectUserIp) return;\n client.addOnError(function (event) {\n // If user.id is explicitly undefined, it will be missing from the payload. It needs\n // removing so that the following line replaces it\n if (event._user && typeof event._user.id === 'undefined') delete event._user.id;\n event._user = _$assign_11({\n id: '[REDACTED]'\n }, event._user);\n event.request = _$assign_11({\n clientIp: '[REDACTED]'\n }, event.request);\n });\n },\n configSchema: {\n collectUserIp: {\n defaultValue: function () {\n return true;\n },\n message: 'should be true|false',\n validate: function (value) {\n return value === true || value === false;\n }\n }\n }\n};\n\nvar _$consoleBreadcrumbs_47 = {};\n/* removed: var _$map_16 = require('@bugsnag/core/lib/es-utils/map'); */;\n\n/* removed: var _$reduce_17 = require('@bugsnag/core/lib/es-utils/reduce'); */;\n\n/* removed: var _$filter_12 = require('@bugsnag/core/lib/es-utils/filter'); */;\n/*\n * Leaves breadcrumbs when console log methods are called\n */\n\n\n_$consoleBreadcrumbs_47.load = function (client) {\n var isDev = /^(local-)?dev(elopment)?$/.test(client._config.releaseStage);\n if (isDev || !client._isBreadcrumbTypeEnabled('log')) return;\n _$map_16(CONSOLE_LOG_METHODS, function (method) {\n var original = console[method];\n\n console[method] = function () {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n client.leaveBreadcrumb('Console output', _$reduce_17(args, function (accum, arg, i) {\n // do the best/simplest stringification of each argument\n var stringified = '[Unknown value]'; // this may fail if the input is:\n // - an object whose [[Prototype]] is null (no toString)\n // - an object with a broken toString or @@toPrimitive implementation\n\n try {\n stringified = String(arg);\n } catch (e) {} // if it stringifies to [object Object] attempt to JSON stringify\n\n\n if (stringified === '[object Object]') {\n // catch stringify errors and fallback to [object Object]\n try {\n stringified = JSON.stringify(arg);\n } catch (e) {}\n }\n\n accum[\"[\" + i + \"]\"] = stringified;\n return accum;\n }, {\n severity: method.indexOf('group') === 0 ? 'log' : method\n }), 'log');\n original.apply(console, args);\n };\n\n console[method]._restore = function () {\n console[method] = original;\n };\n });\n};\n\nif (\"production\" !== 'production') {\n _$consoleBreadcrumbs_47.destroy = function () {\n return CONSOLE_LOG_METHODS.forEach(function (method) {\n if (typeof console[method]._restore === 'function') console[method]._restore();\n });\n };\n}\n\nvar CONSOLE_LOG_METHODS = _$filter_12(['log', 'debug', 'info', 'warn', 'error'], function (method) {\n return typeof console !== 'undefined' && typeof console[method] === 'function';\n});\n\n/* removed: var _$map_16 = require('@bugsnag/core/lib/es-utils/map'); */;\n\n/* removed: var _$reduce_17 = require('@bugsnag/core/lib/es-utils/reduce'); */;\n\n/* removed: var _$filter_12 = require('@bugsnag/core/lib/es-utils/filter'); */;\n\nvar MAX_LINE_LENGTH = 200;\nvar MAX_SCRIPT_LENGTH = 500000;\n\nvar _$inlineScriptContent_48 = function (doc, win) {\n if (doc === void 0) {\n doc = document;\n }\n\n if (win === void 0) {\n win = window;\n }\n\n return {\n load: function (client) {\n if (!client._config.trackInlineScripts) return;\n var originalLocation = win.location.href;\n var html = ''; // in IE8-10 the 'interactive' state can fire too soon (before scripts have finished executing), so in those\n // we wait for the 'complete' state before assuming that synchronous scripts are no longer executing\n\n var isOldIe = !!doc.attachEvent;\n var DOMContentLoaded = isOldIe ? doc.readyState === 'complete' : doc.readyState !== 'loading';\n\n var getHtml = function () {\n return doc.documentElement.outerHTML;\n }; // get whatever HTML exists at this point in time\n\n\n html = getHtml();\n var prev = doc.onreadystatechange; // then update it when the DOM content has loaded\n\n doc.onreadystatechange = function () {\n // IE8 compatible alternative to document#DOMContentLoaded\n if (doc.readyState === 'interactive') {\n html = getHtml();\n DOMContentLoaded = true;\n }\n\n try {\n prev.apply(this, arguments);\n } catch (e) {}\n };\n\n var _lastScript = null;\n\n var updateLastScript = function (script) {\n _lastScript = script;\n };\n\n var getCurrentScript = function () {\n var script = doc.currentScript || _lastScript;\n\n if (!script && !DOMContentLoaded) {\n var scripts = doc.scripts || doc.getElementsByTagName('script');\n script = scripts[scripts.length - 1];\n }\n\n return script;\n };\n\n var addSurroundingCode = function (lineNumber) {\n // get whatever html has rendered at this point\n if (!DOMContentLoaded || !html) html = getHtml(); // simulate the raw html\n\n var htmlLines = [''].concat(html.split('\\n'));\n var zeroBasedLine = lineNumber - 1;\n var start = Math.max(zeroBasedLine - 3, 0);\n var end = Math.min(zeroBasedLine + 3, htmlLines.length);\n return _$reduce_17(htmlLines.slice(start, end), function (accum, line, i) {\n accum[start + 1 + i] = line.length <= MAX_LINE_LENGTH ? line : line.substr(0, MAX_LINE_LENGTH);\n return accum;\n }, {});\n };\n\n client.addOnError(function (event) {\n // remove any of our own frames that may be part the stack this\n // happens before the inline script check as it happens for all errors\n event.errors[0].stacktrace = _$filter_12(event.errors[0].stacktrace, function (f) {\n return !/__trace__$/.test(f.method);\n });\n var frame = event.errors[0].stacktrace[0]; // remove hash and query string from url\n\n var cleanUrl = function (url) {\n return url.replace(/#.*$/, '').replace(/\\?.*$/, '');\n }; // if frame.file exists and is not the original location of the page, this can't be an inline script\n\n\n if (frame && frame.file && cleanUrl(frame.file) !== cleanUrl(originalLocation)) return; // grab the last script known to have run\n\n var currentScript = getCurrentScript();\n\n if (currentScript) {\n var content = currentScript.innerHTML;\n event.addMetadata('script', 'content', content.length <= MAX_SCRIPT_LENGTH ? content : content.substr(0, MAX_SCRIPT_LENGTH)); // only attempt to grab some surrounding code if we have a line number\n\n if (frame && frame.lineNumber) {\n frame.code = addSurroundingCode(frame.lineNumber);\n }\n }\n }, true); // Proxy all the timer functions whose callback is their 0th argument.\n // Keep a reference to the original setTimeout because we need it later\n\n var _map = _$map_16(['setTimeout', 'setInterval', 'setImmediate', 'requestAnimationFrame'], function (fn) {\n return __proxy(win, fn, function (original) {\n return __traceOriginalScript(original, function (args) {\n return {\n get: function () {\n return args[0];\n },\n replace: function (fn) {\n args[0] = fn;\n }\n };\n });\n });\n }),\n _setTimeout = _map[0]; // Proxy all the host objects whose prototypes have an addEventListener function\n\n\n _$map_16(['EventTarget', 'Window', 'Node', 'ApplicationCache', 'AudioTrackList', 'ChannelMergerNode', 'CryptoOperation', 'EventSource', 'FileReader', 'HTMLUnknownElement', 'IDBDatabase', 'IDBRequest', 'IDBTransaction', 'KeyOperation', 'MediaController', 'MessagePort', 'ModalWindow', 'Notification', 'SVGElementInstance', 'Screen', 'TextTrack', 'TextTrackCue', 'TextTrackList', 'WebSocket', 'WebSocketWorker', 'Worker', 'XMLHttpRequest', 'XMLHttpRequestEventTarget', 'XMLHttpRequestUpload'], function (o) {\n if (!win[o] || !win[o].prototype || !Object.prototype.hasOwnProperty.call(win[o].prototype, 'addEventListener')) return;\n\n __proxy(win[o].prototype, 'addEventListener', function (original) {\n return __traceOriginalScript(original, eventTargetCallbackAccessor);\n });\n\n __proxy(win[o].prototype, 'removeEventListener', function (original) {\n return __traceOriginalScript(original, eventTargetCallbackAccessor, true);\n });\n });\n\n function __traceOriginalScript(fn, callbackAccessor, alsoCallOriginal) {\n if (alsoCallOriginal === void 0) {\n alsoCallOriginal = false;\n }\n\n return function () {\n // this is required for removeEventListener to remove anything added with\n // addEventListener before the functions started being wrapped by Bugsnag\n var args = [].slice.call(arguments);\n\n try {\n var cba = callbackAccessor(args);\n var cb = cba.get();\n if (alsoCallOriginal) fn.apply(this, args);\n if (typeof cb !== 'function') return fn.apply(this, args);\n\n if (cb.__trace__) {\n cba.replace(cb.__trace__);\n } else {\n var script = getCurrentScript(); // this function mustn't be annonymous due to a bug in the stack\n // generation logic, meaning it gets tripped up\n // see: https://github.com/stacktracejs/stack-generator/issues/6\n\n cb.__trace__ = function __trace__() {\n // set the script that called this function\n updateLastScript(script); // immediately unset the currentScript synchronously below, however\n // if this cb throws an error the line after will not get run so schedule\n // an almost-immediate aysnc update too\n\n _setTimeout(function () {\n updateLastScript(null);\n }, 0);\n\n var ret = cb.apply(this, arguments);\n updateLastScript(null);\n return ret;\n };\n\n cb.__trace__.__trace__ = cb.__trace__;\n cba.replace(cb.__trace__);\n }\n } catch (e) {// swallow these errors on Selenium:\n // Permission denied to access property '__trace__'\n // WebDriverException: Message: Permission denied to access property \"handleEvent\"\n } // IE8 doesn't let you call .apply() on setTimeout/setInterval\n\n\n if (fn.apply) return fn.apply(this, args);\n\n switch (args.length) {\n case 1:\n return fn(args[0]);\n\n case 2:\n return fn(args[0], args[1]);\n\n default:\n return fn();\n }\n };\n }\n },\n configSchema: {\n trackInlineScripts: {\n validate: function (value) {\n return value === true || value === false;\n },\n defaultValue: function () {\n return true;\n },\n message: 'should be true|false'\n }\n }\n };\n};\n\nfunction __proxy(host, name, replacer) {\n var original = host[name];\n if (!original) return original;\n var replacement = replacer(original);\n host[name] = replacement;\n return original;\n}\n\nfunction eventTargetCallbackAccessor(args) {\n var isEventHandlerObj = !!args[1] && typeof args[1].handleEvent === 'function';\n return {\n get: function () {\n return isEventHandlerObj ? args[1].handleEvent : args[1];\n },\n replace: function (fn) {\n if (isEventHandlerObj) {\n args[1].handleEvent = fn;\n } else {\n args[1] = fn;\n }\n }\n };\n}\n\n/*\n * Leaves breadcrumbs when the user interacts with the DOM\n */\nvar _$interactionBreadcrumbs_49 = function (win) {\n if (win === void 0) {\n win = window;\n }\n\n return {\n load: function (client) {\n if (!('addEventListener' in win)) return;\n if (!client._isBreadcrumbTypeEnabled('user')) return;\n win.addEventListener('click', function (event) {\n var targetText, targetSelector;\n\n try {\n targetText = getNodeText(event.target);\n targetSelector = getNodeSelector(event.target, win);\n } catch (e) {\n targetText = '[hidden]';\n targetSelector = '[hidden]';\n\n client._logger.error('Cross domain error when tracking click event. See docs: https://tinyurl.com/yy3rn63z');\n }\n\n client.leaveBreadcrumb('UI click', {\n targetText: targetText,\n targetSelector: targetSelector\n }, 'user');\n }, true);\n }\n };\n};\n\nvar trimStart = /^\\s+/;\nvar trimEnd = /(^|[^\\s])\\s+$/;\n\nfunction getNodeText(el) {\n var text = el.textContent || el.innerText || '';\n\n if (!text && (el.type === 'submit' || el.type === 'button')) {\n text = el.value;\n }\n\n text = text.replace(trimStart, '').replace(trimEnd, '$1');\n\n if (text.length > 140) {\n return text.slice(0, 135) + '(...)';\n }\n\n return text;\n} // Create a label from tagname, id and css class of the element\n\n\nfunction getNodeSelector(el, win) {\n var parts = [el.tagName];\n if (el.id) parts.push('#' + el.id);\n if (el.className && el.className.length) parts.push(\".\" + el.className.split(' ').join('.')); // Can't get much more advanced with the current browser\n\n if (!win.document.querySelectorAll || !Array.prototype.indexOf) return parts.join('');\n\n try {\n if (win.document.querySelectorAll(parts.join('')).length === 1) return parts.join('');\n } catch (e) {\n // Sometimes the query selector can be invalid just return it as-is\n return parts.join('');\n } // try to get a more specific selector if this one matches more than one element\n\n\n if (el.parentNode.childNodes.length > 1) {\n var index = Array.prototype.indexOf.call(el.parentNode.childNodes, el) + 1;\n parts.push(\":nth-child(\" + index + \")\");\n }\n\n if (win.document.querySelectorAll(parts.join('')).length === 1) return parts.join(''); // try prepending the parent node selector\n\n if (el.parentNode) return getNodeSelector(el.parentNode, win) + \" > \" + parts.join('');\n return parts.join('');\n}\n\nvar _$navigationBreadcrumbs_50 = {};\n/*\n* Leaves breadcrumbs when navigation methods are called or events are emitted\n*/\n_$navigationBreadcrumbs_50 = function (win) {\n if (win === void 0) {\n win = window;\n }\n\n var plugin = {\n load: function (client) {\n if (!('addEventListener' in win)) return;\n if (!client._isBreadcrumbTypeEnabled('navigation')) return; // returns a function that will drop a breadcrumb with a given name\n\n var drop = function (name) {\n return function () {\n return client.leaveBreadcrumb(name, {}, 'navigation');\n };\n }; // simple drops – just names, no meta\n\n\n win.addEventListener('pagehide', drop('Page hidden'), true);\n win.addEventListener('pageshow', drop('Page shown'), true);\n win.addEventListener('load', drop('Page loaded'), true);\n win.document.addEventListener('DOMContentLoaded', drop('DOMContentLoaded'), true); // some browsers like to emit popstate when the page loads, so only add the popstate listener after that\n\n win.addEventListener('load', function () {\n return win.addEventListener('popstate', drop('Navigated back'), true);\n }); // hashchange has some metadata that we care about\n\n win.addEventListener('hashchange', function (event) {\n var metadata = event.oldURL ? {\n from: relativeLocation(event.oldURL, win),\n to: relativeLocation(event.newURL, win),\n state: getCurrentState(win)\n } : {\n to: relativeLocation(win.location.href, win)\n };\n client.leaveBreadcrumb('Hash changed', metadata, 'navigation');\n }, true); // the only way to know about replaceState/pushState is to wrap them… >_<\n\n if (win.history.replaceState) wrapHistoryFn(client, win.history, 'replaceState', win);\n if (win.history.pushState) wrapHistoryFn(client, win.history, 'pushState', win);\n }\n };\n\n if (\"production\" !== 'production') {\n plugin.destroy = function (win) {\n if (win === void 0) {\n win = window;\n }\n\n win.history.replaceState._restore();\n\n win.history.pushState._restore();\n };\n }\n\n return plugin;\n};\n\nif (\"production\" !== 'production') {\n _$navigationBreadcrumbs_50.destroy = function (win) {\n if (win === void 0) {\n win = window;\n }\n\n win.history.replaceState._restore();\n\n win.history.pushState._restore();\n };\n} // takes a full url like http://foo.com:1234/pages/01.html?yes=no#section-2 and returns\n// just the path and hash parts, e.g. /pages/01.html?yes=no#section-2\n\n\nvar relativeLocation = function (url, win) {\n var a = win.document.createElement('A');\n a.href = url;\n return \"\" + a.pathname + a.search + a.hash;\n};\n\nvar stateChangeToMetadata = function (win, state, title, url) {\n var currentPath = relativeLocation(win.location.href, win);\n return {\n title: title,\n state: state,\n prevState: getCurrentState(win),\n to: url || currentPath,\n from: currentPath\n };\n};\n\nvar wrapHistoryFn = function (client, target, fn, win) {\n var orig = target[fn];\n\n target[fn] = function (state, title, url) {\n client.leaveBreadcrumb(\"History \" + fn, stateChangeToMetadata(win, state, title, url), 'navigation'); // if throttle plugin is in use, reset the event sent count\n\n if (typeof client.resetEventCount === 'function') client.resetEventCount(); // if the client is operating in auto session-mode, a new route should trigger a new session\n\n if (client._config.autoTrackSessions) client.startSession(); // Internet Explorer will convert `undefined` to a string when passed, causing an unintended redirect\n // to '/undefined'. therefore we only pass the url if it's not undefined.\n\n orig.apply(target, [state, title].concat(url !== undefined ? url : []));\n };\n\n if (\"production\" !== 'production') {\n target[fn]._restore = function () {\n target[fn] = orig;\n };\n }\n};\n\nvar getCurrentState = function (win) {\n try {\n return win.history.state;\n } catch (e) {}\n};\n\nvar BREADCRUMB_TYPE = 'request';\n\n/* removed: var _$includes_13 = require('@bugsnag/core/lib/es-utils/includes'); */;\n/*\n * Leaves breadcrumbs when network requests occur\n */\n\n\nvar _$networkBreadcrumbs_51 = function (_ignoredUrls, win) {\n if (_ignoredUrls === void 0) {\n _ignoredUrls = [];\n }\n\n if (win === void 0) {\n win = window;\n }\n\n var restoreFunctions = [];\n var plugin = {\n load: function (client) {\n if (!client._isBreadcrumbTypeEnabled('request')) return;\n var ignoredUrls = [client._config.endpoints.notify, client._config.endpoints.sessions].concat(_ignoredUrls);\n monkeyPatchXMLHttpRequest();\n monkeyPatchFetch(); // XMLHttpRequest monkey patch\n\n function monkeyPatchXMLHttpRequest() {\n if (!('addEventListener' in win.XMLHttpRequest.prototype)) return;\n var nativeOpen = win.XMLHttpRequest.prototype.open; // override native open()\n\n win.XMLHttpRequest.prototype.open = function open(method, url) {\n var _this = this;\n\n var requestSetupKey = false;\n\n var error = function () {\n return handleXHRError(method, url);\n };\n\n var load = function () {\n return handleXHRLoad(method, url, _this.status);\n }; // if we have already setup listeners, it means open() was called twice, we need to remove\n // the listeners and recreate them\n\n\n if (requestSetupKey) {\n this.removeEventListener('load', load);\n this.removeEventListener('error', error);\n } // attach load event listener\n\n\n this.addEventListener('load', load); // attach error event listener\n\n this.addEventListener('error', error);\n requestSetupKey = true;\n nativeOpen.apply(this, arguments);\n };\n\n if (\"production\" !== 'production') {\n restoreFunctions.push(function () {\n win.XMLHttpRequest.prototype.open = nativeOpen;\n });\n }\n }\n\n function handleXHRLoad(method, url, status) {\n if (url === undefined) {\n client._logger.warn('The request URL is no longer present on this XMLHttpRequest. A breadcrumb cannot be left for this request.');\n\n return;\n } // an XMLHttpRequest's URL can be an object as long as its 'toString'\n // returns a URL, e.g. a HTMLAnchorElement\n\n\n if (typeof url === 'string' && _$includes_13(ignoredUrls, url.replace(/\\?.*$/, ''))) {\n // don't leave a network breadcrumb from bugsnag notify calls\n return;\n }\n\n var metadata = {\n status: status,\n request: method + \" \" + url\n };\n\n if (status >= 400) {\n // contacted server but got an error response\n client.leaveBreadcrumb('XMLHttpRequest failed', metadata, BREADCRUMB_TYPE);\n } else {\n client.leaveBreadcrumb('XMLHttpRequest succeeded', metadata, BREADCRUMB_TYPE);\n }\n }\n\n function handleXHRError(method, url) {\n if (url === undefined) {\n client._logger.warn('The request URL is no longer present on this XMLHttpRequest. A breadcrumb cannot be left for this request.');\n\n return;\n }\n\n if (typeof url === 'string' && _$includes_13(ignoredUrls, url.replace(/\\?.*$/, ''))) {\n // don't leave a network breadcrumb from bugsnag notify calls\n return;\n } // failed to contact server\n\n\n client.leaveBreadcrumb('XMLHttpRequest error', {\n request: method + \" \" + url\n }, BREADCRUMB_TYPE);\n } // window.fetch monkey patch\n\n\n function monkeyPatchFetch() {\n // only patch it if it exists and if it is not a polyfill (patching a polyfilled\n // fetch() results in duplicate breadcrumbs for the same request because the\n // implementation uses XMLHttpRequest which is also patched)\n if (!('fetch' in win) || win.fetch.polyfill) return;\n var oldFetch = win.fetch;\n\n win.fetch = function fetch() {\n var _arguments = arguments;\n var urlOrRequest = arguments[0];\n var options = arguments[1];\n var method;\n var url = null;\n\n if (urlOrRequest && typeof urlOrRequest === 'object') {\n url = urlOrRequest.url;\n\n if (options && 'method' in options) {\n method = options.method;\n } else if (urlOrRequest && 'method' in urlOrRequest) {\n method = urlOrRequest.method;\n }\n } else {\n url = urlOrRequest;\n\n if (options && 'method' in options) {\n method = options.method;\n }\n }\n\n if (method === undefined) {\n method = 'GET';\n }\n\n return new Promise(function (resolve, reject) {\n // pass through to native fetch\n oldFetch.apply(void 0, _arguments).then(function (response) {\n handleFetchSuccess(response, method, url);\n resolve(response);\n })[\"catch\"](function (error) {\n handleFetchError(method, url);\n reject(error);\n });\n });\n };\n\n if (\"production\" !== 'production') {\n restoreFunctions.push(function () {\n win.fetch = oldFetch;\n });\n }\n }\n\n var handleFetchSuccess = function (response, method, url) {\n var metadata = {\n status: response.status,\n request: method + \" \" + url\n };\n\n if (response.status >= 400) {\n // when the request comes back with a 4xx or 5xx status it does not reject the fetch promise,\n client.leaveBreadcrumb('fetch() failed', metadata, BREADCRUMB_TYPE);\n } else {\n client.leaveBreadcrumb('fetch() succeeded', metadata, BREADCRUMB_TYPE);\n }\n };\n\n var handleFetchError = function (method, url) {\n client.leaveBreadcrumb('fetch() error', {\n request: method + \" \" + url\n }, BREADCRUMB_TYPE);\n };\n }\n };\n\n if (\"production\" !== 'production') {\n plugin.destroy = function () {\n restoreFunctions.forEach(function (fn) {\n return fn();\n });\n restoreFunctions = [];\n };\n }\n\n return plugin;\n};\n\n/* removed: var _$intRange_24 = require('@bugsnag/core/lib/validators/int-range'); */;\n/*\n * Throttles and dedupes events\n */\n\n\nvar _$throttle_52 = {\n load: function (client) {\n // track sent events for each init of the plugin\n var n = 0; // add onError hook\n\n client.addOnError(function (event) {\n // have max events been sent already?\n if (n >= client._config.maxEvents) {\n client._logger.warn(\"Cancelling event send due to maxEvents per session limit of \" + client._config.maxEvents + \" being reached\");\n\n return false;\n }\n\n n++;\n });\n\n client.resetEventCount = function () {\n n = 0;\n };\n },\n configSchema: {\n maxEvents: {\n defaultValue: function () {\n return 10;\n },\n message: 'should be a positive integer ≤100',\n validate: function (val) {\n return _$intRange_24(1, 100)(val);\n }\n }\n }\n};\n\nvar _$stripQueryString_53 = {};\n/*\n * Remove query strings (and fragments) from stacktraces\n */\n/* removed: var _$map_16 = require('@bugsnag/core/lib/es-utils/map'); */;\n\n/* removed: var _$reduce_17 = require('@bugsnag/core/lib/es-utils/reduce'); */;\n\n_$stripQueryString_53 = {\n load: function (client) {\n client.addOnError(function (event) {\n var allFrames = _$reduce_17(event.errors, function (accum, er) {\n return accum.concat(er.stacktrace);\n }, []);\n _$map_16(allFrames, function (frame) {\n frame.file = strip(frame.file);\n });\n });\n }\n};\n\nvar strip = _$stripQueryString_53._strip = function (str) {\n return typeof str === 'string' ? str.replace(/\\?.*$/, '').replace(/#.*$/, '') : str;\n};\n\n/*\n * Automatically notifies Bugsnag when window.onerror is called\n */\nvar _$onerror_54 = function (win, component) {\n if (win === void 0) {\n win = window;\n }\n\n if (component === void 0) {\n component = 'window onerror';\n }\n\n return {\n load: function (client) {\n if (!client._config.autoDetectErrors) return;\n if (!client._config.enabledErrorTypes.unhandledExceptions) return;\n\n function onerror(messageOrEvent, url, lineNo, charNo, error) {\n // Ignore errors with no info due to CORS settings\n if (lineNo === 0 && /Script error\\.?/.test(messageOrEvent)) {\n client._logger.warn('Ignoring cross-domain or eval script error. See docs: https://tinyurl.com/yy3rn63z');\n } else {\n // any error sent to window.onerror is unhandled and has severity=error\n var handledState = {\n severity: 'error',\n unhandled: true,\n severityReason: {\n type: 'unhandledException'\n }\n };\n var event; // window.onerror can be called in a number of ways. This big if-else is how we\n // figure out which arguments were supplied, and what kind of values it received.\n\n if (error) {\n // if the last parameter (error) was supplied, this is a modern browser's\n // way of saying \"this value was thrown and not caught\"\n event = client.Event.create(error, true, handledState, component, 1);\n decorateStack(event.errors[0].stacktrace, url, lineNo, charNo);\n } else if ( // This complex case detects \"error\" events that are typically synthesised\n // by jquery's trigger method (although can be created in other ways). In\n // order to detect this:\n // - the first argument (message) must exist and be an object (most likely it's a jQuery event)\n // - the second argument (url) must either not exist or be something other than a string (if it\n // exists and is not a string, it'll be the extraParameters argument from jQuery's trigger()\n // function)\n // - the third, fourth and fifth arguments must not exist (lineNo, charNo and error)\n typeof messageOrEvent === 'object' && messageOrEvent !== null && (!url || typeof url !== 'string') && !lineNo && !charNo && !error) {\n // The jQuery event may have a \"type\" property, if so use it as part of the error message\n var name = messageOrEvent.type ? \"Event: \" + messageOrEvent.type : 'Error'; // attempt to find a message from one of the conventional properties, but\n // default to empty string (the event will fill it with a placeholder)\n\n var message = messageOrEvent.message || messageOrEvent.detail || '';\n event = client.Event.create({\n name: name,\n message: message\n }, true, handledState, component, 1); // provide the original thing onerror received – not our error-like object we passed to _notify\n\n event.originalError = messageOrEvent; // include the raw input as metadata – it might contain more info than we extracted\n\n event.addMetadata(component, {\n event: messageOrEvent,\n extraParameters: url\n });\n } else {\n // Lastly, if there was no \"error\" parameter this event was probably from an old\n // browser that doesn't support that. Instead we need to generate a stacktrace.\n event = client.Event.create(messageOrEvent, true, handledState, component, 1);\n decorateStack(event.errors[0].stacktrace, url, lineNo, charNo);\n }\n\n client._notify(event);\n }\n\n if (typeof prevOnError === 'function') prevOnError.apply(this, arguments);\n }\n\n var prevOnError = win.onerror;\n win.onerror = onerror;\n }\n };\n}; // Sometimes the stacktrace has less information than was passed to window.onerror.\n// This function will augment the first stackframe with any useful info that was\n// received as arguments to the onerror callback.\n\n\nvar decorateStack = function (stack, url, lineNo, charNo) {\n if (!stack[0]) stack.push({});\n var culprit = stack[0];\n if (!culprit.file && typeof url === 'string') culprit.file = url;\n if (!culprit.lineNumber && isActualNumber(lineNo)) culprit.lineNumber = lineNo;\n\n if (!culprit.columnNumber) {\n if (isActualNumber(charNo)) {\n culprit.columnNumber = charNo;\n } else if (window.event && isActualNumber(window.event.errorCharacter)) {\n culprit.columnNumber = window.event.errorCharacter;\n }\n }\n};\n\nvar isActualNumber = function (n) {\n return typeof n === 'number' && String.call(n) !== 'NaN';\n};\n\n/* removed: var _$map_16 = require('@bugsnag/core/lib/es-utils/map'); */;\n\n/* removed: var _$iserror_20 = require('@bugsnag/core/lib/iserror'); */;\n\nvar _listener;\n/*\n * Automatically notifies Bugsnag when window.onunhandledrejection is called\n */\n\n\nvar _$unhandledRejection_55 = function (win) {\n if (win === void 0) {\n win = window;\n }\n\n var plugin = {\n load: function (client) {\n if (!client._config.autoDetectErrors || !client._config.enabledErrorTypes.unhandledRejections) return;\n\n var listener = function (evt) {\n var error = evt.reason;\n var isBluebird = false; // accessing properties on evt.detail can throw errors (see #394)\n\n try {\n if (evt.detail && evt.detail.reason) {\n error = evt.detail.reason;\n isBluebird = true;\n }\n } catch (e) {}\n\n var event = client.Event.create(error, false, {\n severity: 'error',\n unhandled: true,\n severityReason: {\n type: 'unhandledPromiseRejection'\n }\n }, 'unhandledrejection handler', 1, client._logger);\n\n if (isBluebird) {\n _$map_16(event.errors[0].stacktrace, fixBluebirdStacktrace(error));\n }\n\n client._notify(event, function (event) {\n if (_$iserror_20(event.originalError) && !event.originalError.stack) {\n var _event$addMetadata;\n\n event.addMetadata('unhandledRejection handler', (_event$addMetadata = {}, _event$addMetadata[Object.prototype.toString.call(event.originalError)] = {\n name: event.originalError.name,\n message: event.originalError.message,\n code: event.originalError.code\n }, _event$addMetadata));\n }\n });\n };\n\n if ('addEventListener' in win) {\n win.addEventListener('unhandledrejection', listener);\n } else {\n win.onunhandledrejection = function (reason, promise) {\n listener({\n detail: {\n reason: reason,\n promise: promise\n }\n });\n };\n }\n\n _listener = listener;\n }\n };\n\n if (\"production\" !== 'production') {\n plugin.destroy = function (win) {\n if (win === void 0) {\n win = window;\n }\n\n if (_listener) {\n if ('addEventListener' in win) {\n win.removeEventListener('unhandledrejection', _listener);\n } else {\n win.onunhandledrejection = null;\n }\n }\n\n _listener = null;\n };\n }\n\n return plugin;\n}; // The stack parser on bluebird stacks in FF get a suprious first frame:\n//\n// Error: derp\n// b@http://localhost:5000/bluebird.html:22:24\n// a@http://localhost:5000/bluebird.html:18:9\n// @http://localhost:5000/bluebird.html:14:9\n//\n// results in\n// […]\n// 0: Object { file: \"Error: derp\", method: undefined, lineNumber: undefined, … }\n// 1: Object { file: \"http://localhost:5000/bluebird.html\", method: \"b\", lineNumber: 22, … }\n// 2: Object { file: \"http://localhost:5000/bluebird.html\", method: \"a\", lineNumber: 18, … }\n// 3: Object { file: \"http://localhost:5000/bluebird.html\", lineNumber: 14, columnNumber: 9, … }\n//\n// so the following reduce/accumulator function removes such frames\n//\n// Bluebird pads method names with spaces so trim that too…\n// https://github.com/petkaantonov/bluebird/blob/b7f21399816d02f979fe434585334ce901dcaf44/src/debuggability.js#L568-L571\n\n\nvar fixBluebirdStacktrace = function (error) {\n return function (frame) {\n if (frame.file === error.toString()) return;\n\n if (frame.method) {\n frame.method = frame.method.replace(/^\\s+/, '');\n }\n };\n};\n\nvar _$notifier_2 = {};\nvar name = 'Bugsnag JavaScript';\nvar version = '7.20.2';\nvar url = 'https://github.com/bugsnag/bugsnag-js';\n\n/* removed: var _$Client_4 = require('@bugsnag/core/client'); */;\n\n/* removed: var _$Event_6 = require('@bugsnag/core/event'); */;\n\n/* removed: var _$Session_35 = require('@bugsnag/core/session'); */;\n\n/* removed: var _$Breadcrumb_3 = require('@bugsnag/core/breadcrumb'); */;\n\n/* removed: var _$map_16 = require('@bugsnag/core/lib/es-utils/map'); */;\n\n/* removed: var _$keys_15 = require('@bugsnag/core/lib/es-utils/keys'); */;\n\n/* removed: var _$assign_11 = require('@bugsnag/core/lib/es-utils/assign'); */; // extend the base config schema with some browser-specific options\n\n\nvar __schema_2 = _$assign_11({}, _$config_5.schema, _$config_1);\n\n/* removed: var _$onerror_54 = require('@bugsnag/plugin-window-onerror'); */;\n\n/* removed: var _$unhandledRejection_55 = require('@bugsnag/plugin-window-unhandled-rejection'); */;\n\n/* removed: var _$app_38 = require('@bugsnag/plugin-app-duration'); */;\n\n/* removed: var _$device_40 = require('@bugsnag/plugin-browser-device'); */;\n\n/* removed: var _$context_39 = require('@bugsnag/plugin-browser-context'); */;\n\n/* removed: var _$request_44 = require('@bugsnag/plugin-browser-request'); */;\n\n/* removed: var _$throttle_52 = require('@bugsnag/plugin-simple-throttle'); */;\n\n/* removed: var _$consoleBreadcrumbs_47 = require('@bugsnag/plugin-console-breadcrumbs'); */;\n\n/* removed: var _$networkBreadcrumbs_51 = require('@bugsnag/plugin-network-breadcrumbs'); */;\n\n/* removed: var _$navigationBreadcrumbs_50 = require('@bugsnag/plugin-navigation-breadcrumbs'); */;\n\n/* removed: var _$interactionBreadcrumbs_49 = require('@bugsnag/plugin-interaction-breadcrumbs'); */;\n\n/* removed: var _$inlineScriptContent_48 = require('@bugsnag/plugin-inline-script-content'); */;\n\n/* removed: var _$session_45 = require('@bugsnag/plugin-browser-session'); */;\n\n/* removed: var _$clientIp_46 = require('@bugsnag/plugin-client-ip'); */;\n\n/* removed: var _$stripQueryString_53 = require('@bugsnag/plugin-strip-query-string'); */; // delivery mechanisms\n\n\n/* removed: var _$delivery_36 = require('@bugsnag/delivery-x-domain-request'); */;\n\n/* removed: var _$delivery_37 = require('@bugsnag/delivery-xml-http-request'); */;\n\nvar Bugsnag = {\n _client: null,\n createClient: function (opts) {\n // handle very simple use case where user supplies just the api key as a string\n if (typeof opts === 'string') opts = {\n apiKey: opts\n };\n if (!opts) opts = {};\n var internalPlugins = [// add browser-specific plugins\n _$app_38, _$device_40(), _$context_39(), _$request_44(), _$throttle_52, _$session_45, _$clientIp_46, _$stripQueryString_53, _$onerror_54(), _$unhandledRejection_55(), _$navigationBreadcrumbs_50(), _$interactionBreadcrumbs_49(), _$networkBreadcrumbs_51(), _$consoleBreadcrumbs_47, // this one added last to avoid wrapping functionality before bugsnag uses it\n _$inlineScriptContent_48()]; // configure a client with user supplied options\n\n var bugsnag = new _$Client_4(opts, __schema_2, internalPlugins, {\n name: name,\n version: version,\n url: url\n }); // set delivery based on browser capability (IE 8+9 have an XDomainRequest object)\n\n bugsnag._setDelivery(window.XDomainRequest ? _$delivery_36 : _$delivery_37);\n\n bugsnag._logger.debug('Loaded!');\n\n bugsnag.leaveBreadcrumb('Bugsnag loaded', {}, 'state');\n return bugsnag._config.autoTrackSessions ? bugsnag.startSession() : bugsnag;\n },\n start: function (opts) {\n if (Bugsnag._client) {\n Bugsnag._client._logger.warn('Bugsnag.start() was called more than once. Ignoring.');\n\n return Bugsnag._client;\n }\n\n Bugsnag._client = Bugsnag.createClient(opts);\n return Bugsnag._client;\n },\n isStarted: function () {\n return Bugsnag._client != null;\n }\n};\n_$map_16(['resetEventCount'].concat(_$keys_15(_$Client_4.prototype)), function (m) {\n if (/^_/.test(m)) return;\n\n Bugsnag[m] = function () {\n if (!Bugsnag._client) return console.log(\"Bugsnag.\" + m + \"() was called before Bugsnag.start()\");\n Bugsnag._client._depth += 1;\n\n var ret = Bugsnag._client[m].apply(Bugsnag._client, arguments);\n\n Bugsnag._client._depth -= 1;\n return ret;\n };\n});\n_$notifier_2 = Bugsnag;\n_$notifier_2.Client = _$Client_4;\n_$notifier_2.Event = _$Event_6;\n_$notifier_2.Session = _$Session_35;\n_$notifier_2.Breadcrumb = _$Breadcrumb_3; // Export a \"default\" property for compatibility with ESM imports\n\n_$notifier_2[\"default\"] = Bugsnag;\n\nreturn _$notifier_2;\n\n});\n//# sourceMappingURL=bugsnag.js.map\n","module.exports = require('@bugsnag/browser')\n","(function(f){if(typeof exports===\"object\"&&typeof module!==\"undefined\"){module.exports=f()}else if(typeof define===\"function\"&&define.amd){define([],f)}else{var g;if(typeof window!==\"undefined\"){g=window}else if(typeof global!==\"undefined\"){g=global}else if(typeof self!==\"undefined\"){g=self}else{g=this}g.BugsnagPluginReact = f()}})(function(){var define,module,exports;\nvar _$src_1 = {};\nfunction _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\n_$src_1 = /*#__PURE__*/function () {\n function BugsnagPluginReact() {\n // Fetch React from the window object, if it exists\n var globalReact = typeof window !== 'undefined' && window.React;\n this.name = 'react';\n this.lazy = arguments.length === 0 && !globalReact;\n\n if (!this.lazy) {\n this.React = (arguments.length <= 0 ? undefined : arguments[0]) || globalReact;\n if (!this.React) throw new Error('@bugsnag/plugin-react reference to `React` was undefined');\n }\n }\n\n var _proto = BugsnagPluginReact.prototype;\n\n _proto.load = function load(client) {\n if (!this.lazy) {\n var ErrorBoundary = createClass(this.React, client);\n\n ErrorBoundary.createErrorBoundary = function () {\n return ErrorBoundary;\n };\n\n return ErrorBoundary;\n }\n\n var BugsnagPluginReactLazyInitializer = function () {\n throw new Error(\"@bugsnag/plugin-react was used incorrectly. Valid usage is as follows:\\nPass React to the plugin constructor\\n\\n `Bugsnag.start({ plugins: [new BugsnagPluginReact(React)] })`\\nand then call `const ErrorBoundary = Bugsnag.getPlugin('react').createErrorBoundary()`\\n\\nOr if React is not available until after Bugsnag has started,\\nconstruct the plugin with no arguments\\n `Bugsnag.start({ plugins: [new BugsnagPluginReact()] })`,\\nthen pass in React when available to construct your error boundary\\n `const ErrorBoundary = Bugsnag.getPlugin('react').createErrorBoundary(React)`\");\n };\n\n BugsnagPluginReactLazyInitializer.createErrorBoundary = function (React) {\n if (!React) throw new Error('@bugsnag/plugin-react reference to `React` was undefined');\n return createClass(React, client);\n };\n\n return BugsnagPluginReactLazyInitializer;\n };\n\n return BugsnagPluginReact;\n}();\n\nvar formatComponentStack = function (str) {\n var lines = str.split(/\\s*\\n\\s*/g);\n var ret = '';\n\n for (var line = 0, len = lines.length; line < len; line++) {\n if (lines[line].length) ret += \"\" + (ret.length ? '\\n' : '') + lines[line];\n }\n\n return ret;\n};\n\nvar createClass = function (React, client) {\n return /*#__PURE__*/function (_React$Component) {\n _inheritsLoose(ErrorBoundary, _React$Component);\n\n function ErrorBoundary(props) {\n var _this;\n\n _this = _React$Component.call(this, props) || this;\n _this.state = {\n error: null,\n info: null\n };\n _this.handleClearError = _this.handleClearError.bind(_assertThisInitialized(_this));\n return _this;\n }\n\n var _proto2 = ErrorBoundary.prototype;\n\n _proto2.handleClearError = function handleClearError() {\n this.setState({\n error: null,\n info: null\n });\n };\n\n _proto2.componentDidCatch = function componentDidCatch(error, info) {\n var onError = this.props.onError;\n var handledState = {\n severity: 'error',\n unhandled: true,\n severityReason: {\n type: 'unhandledException'\n }\n };\n var event = client.Event.create(error, true, handledState, 1);\n if (info && info.componentStack) info.componentStack = formatComponentStack(info.componentStack);\n event.addMetadata('react', info);\n\n client._notify(event, onError);\n\n this.setState({\n error: error,\n info: info\n });\n };\n\n _proto2.render = function render() {\n var error = this.state.error;\n\n if (error) {\n var FallbackComponent = this.props.FallbackComponent;\n if (FallbackComponent) return React.createElement(FallbackComponent, _extends({}, this.state, {\n clearError: this.handleClearError\n }));\n return null;\n }\n\n return this.props.children;\n };\n\n return ErrorBoundary;\n }(React.Component);\n};\n\n_$src_1.formatComponentStack = formatComponentStack;\n_$src_1[\"default\"] = _$src_1;\n\nreturn _$src_1;\n\n});\n//# sourceMappingURL=bugsnag-react.js.map\n","/* build: `node build.js modules=ALL exclude=gestures,accessors,erasing requirejs minifier=uglifyjs` */\n/*! Fabric.js Copyright 2008-2015, Printio (Juriy Zaytsev, Maxim Chernyak) */\n\nvar fabric = fabric || { version: '5.3.0' };\nif (typeof exports !== 'undefined') {\n exports.fabric = fabric;\n}\n/* _AMD_START_ */\nelse if (typeof define === 'function' && define.amd) {\n define([], function() { return fabric; });\n}\n/* _AMD_END_ */\nif (typeof document !== 'undefined' && typeof window !== 'undefined') {\n if (document instanceof (typeof HTMLDocument !== 'undefined' ? HTMLDocument : Document)) {\n fabric.document = document;\n }\n else {\n fabric.document = document.implementation.createHTMLDocument('');\n }\n fabric.window = window;\n}\nelse {\n // assume we're running under node.js when document/window are not present\n var jsdom = require('jsdom');\n var virtualWindow = new jsdom.JSDOM(\n decodeURIComponent('%3C!DOCTYPE%20html%3E%3Chtml%3E%3Chead%3E%3C%2Fhead%3E%3Cbody%3E%3C%2Fbody%3E%3C%2Fhtml%3E'),\n {\n features: {\n FetchExternalResources: ['img']\n },\n resources: 'usable'\n }).window;\n fabric.document = virtualWindow.document;\n fabric.jsdomImplForWrapper = require('jsdom/lib/jsdom/living/generated/utils').implForWrapper;\n fabric.nodeCanvas = require('jsdom/lib/jsdom/utils').Canvas;\n fabric.window = virtualWindow;\n DOMParser = fabric.window.DOMParser;\n}\n\n/**\n * True when in environment that supports touch events\n * @type boolean\n */\nfabric.isTouchSupported = 'ontouchstart' in fabric.window || 'ontouchstart' in fabric.document ||\n (fabric.window && fabric.window.navigator && fabric.window.navigator.maxTouchPoints > 0);\n\n/**\n * True when in environment that's probably Node.js\n * @type boolean\n */\nfabric.isLikelyNode = typeof Buffer !== 'undefined' &&\n typeof window === 'undefined';\n\n/* _FROM_SVG_START_ */\n/**\n * Attributes parsed from all SVG elements\n * @type array\n */\nfabric.SHARED_ATTRIBUTES = [\n 'display',\n 'transform',\n 'fill', 'fill-opacity', 'fill-rule',\n 'opacity',\n 'stroke', 'stroke-dasharray', 'stroke-linecap', 'stroke-dashoffset',\n 'stroke-linejoin', 'stroke-miterlimit',\n 'stroke-opacity', 'stroke-width',\n 'id', 'paint-order', 'vector-effect',\n 'instantiated_by_use', 'clip-path',\n];\n/* _FROM_SVG_END_ */\n\n/**\n * Pixel per Inch as a default value set to 96. Can be changed for more realistic conversion.\n */\nfabric.DPI = 96;\nfabric.reNum = '(?:[-+]?(?:\\\\d+|\\\\d*\\\\.\\\\d+)(?:[eE][-+]?\\\\d+)?)';\nfabric.commaWsp = '(?:\\\\s+,?\\\\s*|,\\\\s*)';\nfabric.rePathCommand = /([-+]?((\\d+\\.\\d+)|((\\d+)|(\\.\\d+)))(?:[eE][-+]?\\d+)?)/ig;\nfabric.reNonWord = /[ \\n\\.,;!\\?\\-]/;\nfabric.fontPaths = { };\nfabric.iMatrix = [1, 0, 0, 1, 0, 0];\nfabric.svgNS = 'http://www.w3.org/2000/svg';\n\n/**\n * Pixel limit for cache canvases. 1Mpx , 4Mpx should be fine.\n * @since 1.7.14\n * @type Number\n * @default\n */\nfabric.perfLimitSizeTotal = 2097152;\n\n/**\n * Pixel limit for cache canvases width or height. IE fixes the maximum at 5000\n * @since 1.7.14\n * @type Number\n * @default\n */\nfabric.maxCacheSideLimit = 4096;\n\n/**\n * Lowest pixel limit for cache canvases, set at 256PX\n * @since 1.7.14\n * @type Number\n * @default\n */\nfabric.minCacheSideLimit = 256;\n\n/**\n * Cache Object for widths of chars in text rendering.\n */\nfabric.charWidthsCache = { };\n\n/**\n * if webgl is enabled and available, textureSize will determine the size\n * of the canvas backend\n * @since 2.0.0\n * @type Number\n * @default\n */\nfabric.textureSize = 2048;\n\n/**\n * When 'true', style information is not retained when copy/pasting text, making\n * pasted text use destination style.\n * Defaults to 'false'.\n * @type Boolean\n * @default\n */\nfabric.disableStyleCopyPaste = false;\n\n/**\n * Enable webgl for filtering picture is available\n * A filtering backend will be initialized, this will both take memory and\n * time since a default 2048x2048 canvas will be created for the gl context\n * @since 2.0.0\n * @type Boolean\n * @default\n */\nfabric.enableGLFiltering = true;\n\n/**\n * Device Pixel Ratio\n * @see https://developer.apple.com/library/safari/documentation/AudioVideo/Conceptual/HTML-canvas-guide/SettingUptheCanvas/SettingUptheCanvas.html\n */\nfabric.devicePixelRatio = fabric.window.devicePixelRatio ||\n fabric.window.webkitDevicePixelRatio ||\n fabric.window.mozDevicePixelRatio ||\n 1;\n/**\n * Browser-specific constant to adjust CanvasRenderingContext2D.shadowBlur value,\n * which is unitless and not rendered equally across browsers.\n *\n * Values that work quite well (as of October 2017) are:\n * - Chrome: 1.5\n * - Edge: 1.75\n * - Firefox: 0.9\n * - Safari: 0.95\n *\n * @since 2.0.0\n * @type Number\n * @default 1\n */\nfabric.browserShadowBlurConstant = 1;\n\n/**\n * This object contains the result of arc to bezier conversion for faster retrieving if the same arc needs to be converted again.\n * It was an internal variable, is accessible since version 2.3.4\n */\nfabric.arcToSegmentsCache = { };\n\n/**\n * This object keeps the results of the boundsOfCurve calculation mapped by the joined arguments necessary to calculate it.\n * It does speed up calculation, if you parse and add always the same paths, but in case of heavy usage of freedrawing\n * you do not get any speed benefit and you get a big object in memory.\n * The object was a private variable before, while now is appended to the lib so that you have access to it and you\n * can eventually clear it.\n * It was an internal variable, is accessible since version 2.3.4\n */\nfabric.boundsOfCurveCache = { };\n\n/**\n * If disabled boundsOfCurveCache is not used. For apps that make heavy usage of pencil drawing probably disabling it is better\n * @default true\n */\nfabric.cachesBoundsOfCurve = true;\n\n/**\n * Skip performance testing of setupGLContext and force the use of putImageData that seems to be the one that works best on\n * Chrome + old hardware. if your users are experiencing empty images after filtering you may try to force this to true\n * this has to be set before instantiating the filtering backend ( before filtering the first image )\n * @type Boolean\n * @default false\n */\nfabric.forceGLPutImageData = false;\n\nfabric.initFilterBackend = function() {\n if (fabric.enableGLFiltering && fabric.isWebglSupported && fabric.isWebglSupported(fabric.textureSize)) {\n console.log('max texture size: ' + fabric.maxTextureSize);\n return (new fabric.WebglFilterBackend({ tileSize: fabric.textureSize }));\n }\n else if (fabric.Canvas2dFilterBackend) {\n return (new fabric.Canvas2dFilterBackend());\n }\n};\n\n\nif (typeof document !== 'undefined' && typeof window !== 'undefined') {\n // ensure globality even if entire library were function wrapped (as in Meteor.js packaging system)\n window.fabric = fabric;\n}\n\n\n(function() {\n\n /**\n * @private\n * @param {String} eventName\n * @param {Function} handler\n */\n function _removeEventListener(eventName, handler) {\n if (!this.__eventListeners[eventName]) {\n return;\n }\n var eventListener = this.__eventListeners[eventName];\n if (handler) {\n eventListener[eventListener.indexOf(handler)] = false;\n }\n else {\n fabric.util.array.fill(eventListener, false);\n }\n }\n\n /**\n * Observes specified event\n * @memberOf fabric.Observable\n * @alias on\n * @param {String|Object} eventName Event name (eg. 'after:render') or object with key/value pairs (eg. {'after:render': handler, 'selection:cleared': handler})\n * @param {Function} handler Function that receives a notification when an event of the specified type occurs\n * @return {Self} thisArg\n * @chainable\n */\n function on(eventName, handler) {\n if (!this.__eventListeners) {\n this.__eventListeners = { };\n }\n // one object with key/value pairs was passed\n if (arguments.length === 1) {\n for (var prop in eventName) {\n this.on(prop, eventName[prop]);\n }\n }\n else {\n if (!this.__eventListeners[eventName]) {\n this.__eventListeners[eventName] = [];\n }\n this.__eventListeners[eventName].push(handler);\n }\n return this;\n }\n\n function _once(eventName, handler) {\n var _handler = function () {\n handler.apply(this, arguments);\n this.off(eventName, _handler);\n }.bind(this);\n this.on(eventName, _handler);\n }\n\n function once(eventName, handler) {\n // one object with key/value pairs was passed\n if (arguments.length === 1) {\n for (var prop in eventName) {\n _once.call(this, prop, eventName[prop]);\n }\n }\n else {\n _once.call(this, eventName, handler);\n }\n return this;\n }\n\n /**\n * Stops event observing for a particular event handler. Calling this method\n * without arguments removes all handlers for all events\n * @memberOf fabric.Observable\n * @alias off\n * @param {String|Object} eventName Event name (eg. 'after:render') or object with key/value pairs (eg. {'after:render': handler, 'selection:cleared': handler})\n * @param {Function} handler Function to be deleted from EventListeners\n * @return {Self} thisArg\n * @chainable\n */\n function off(eventName, handler) {\n if (!this.__eventListeners) {\n return this;\n }\n\n // remove all key/value pairs (event name -> event handler)\n if (arguments.length === 0) {\n for (eventName in this.__eventListeners) {\n _removeEventListener.call(this, eventName);\n }\n }\n // one object with key/value pairs was passed\n else if (arguments.length === 1 && typeof arguments[0] === 'object') {\n for (var prop in eventName) {\n _removeEventListener.call(this, prop, eventName[prop]);\n }\n }\n else {\n _removeEventListener.call(this, eventName, handler);\n }\n return this;\n }\n\n /**\n * Fires event with an optional options object\n * @memberOf fabric.Observable\n * @param {String} eventName Event name to fire\n * @param {Object} [options] Options object\n * @return {Self} thisArg\n * @chainable\n */\n function fire(eventName, options) {\n if (!this.__eventListeners) {\n return this;\n }\n\n var listenersForEvent = this.__eventListeners[eventName];\n if (!listenersForEvent) {\n return this;\n }\n\n for (var i = 0, len = listenersForEvent.length; i < len; i++) {\n listenersForEvent[i] && listenersForEvent[i].call(this, options || { });\n }\n this.__eventListeners[eventName] = listenersForEvent.filter(function(value) {\n return value !== false;\n });\n return this;\n }\n\n /**\n * @namespace fabric.Observable\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-2#events}\n * @see {@link http://fabricjs.com/events|Events demo}\n */\n fabric.Observable = {\n fire: fire,\n on: on,\n once: once,\n off: off,\n };\n})();\n\n\n/**\n * @namespace fabric.Collection\n */\nfabric.Collection = {\n\n _objects: [],\n\n /**\n * Adds objects to collection, Canvas or Group, then renders canvas\n * (if `renderOnAddRemove` is not `false`).\n * in case of Group no changes to bounding box are made.\n * Objects should be instances of (or inherit from) fabric.Object\n * Use of this function is highly discouraged for groups.\n * you can add a bunch of objects with the add method but then you NEED\n * to run a addWithUpdate call for the Group class or position/bbox will be wrong.\n * @param {...fabric.Object} object Zero or more fabric instances\n * @return {Self} thisArg\n * @chainable\n */\n add: function () {\n this._objects.push.apply(this._objects, arguments);\n if (this._onObjectAdded) {\n for (var i = 0, length = arguments.length; i < length; i++) {\n this._onObjectAdded(arguments[i]);\n }\n }\n this.renderOnAddRemove && this.requestRenderAll();\n return this;\n },\n\n /**\n * Inserts an object into collection at specified index, then renders canvas (if `renderOnAddRemove` is not `false`)\n * An object should be an instance of (or inherit from) fabric.Object\n * Use of this function is highly discouraged for groups.\n * you can add a bunch of objects with the insertAt method but then you NEED\n * to run a addWithUpdate call for the Group class or position/bbox will be wrong.\n * @param {Object} object Object to insert\n * @param {Number} index Index to insert object at\n * @param {Boolean} nonSplicing When `true`, no splicing (shifting) of objects occurs\n * @return {Self} thisArg\n * @chainable\n */\n insertAt: function (object, index, nonSplicing) {\n var objects = this._objects;\n if (nonSplicing) {\n objects[index] = object;\n }\n else {\n objects.splice(index, 0, object);\n }\n this._onObjectAdded && this._onObjectAdded(object);\n this.renderOnAddRemove && this.requestRenderAll();\n return this;\n },\n\n /**\n * Removes objects from a collection, then renders canvas (if `renderOnAddRemove` is not `false`)\n * @param {...fabric.Object} object Zero or more fabric instances\n * @return {Self} thisArg\n * @chainable\n */\n remove: function() {\n var objects = this._objects,\n index, somethingRemoved = false;\n\n for (var i = 0, length = arguments.length; i < length; i++) {\n index = objects.indexOf(arguments[i]);\n\n // only call onObjectRemoved if an object was actually removed\n if (index !== -1) {\n somethingRemoved = true;\n objects.splice(index, 1);\n this._onObjectRemoved && this._onObjectRemoved(arguments[i]);\n }\n }\n\n this.renderOnAddRemove && somethingRemoved && this.requestRenderAll();\n return this;\n },\n\n /**\n * Executes given function for each object in this group\n * @param {Function} callback\n * Callback invoked with current object as first argument,\n * index - as second and an array of all objects - as third.\n * Callback is invoked in a context of Global Object (e.g. `window`)\n * when no `context` argument is given\n *\n * @param {Object} context Context (aka thisObject)\n * @return {Self} thisArg\n * @chainable\n */\n forEachObject: function(callback, context) {\n var objects = this.getObjects();\n for (var i = 0, len = objects.length; i < len; i++) {\n callback.call(context, objects[i], i, objects);\n }\n return this;\n },\n\n /**\n * Returns an array of children objects of this instance\n * Type parameter introduced in 1.3.10\n * since 2.3.5 this method return always a COPY of the array;\n * @param {String} [type] When specified, only objects of this type are returned\n * @return {Array}\n */\n getObjects: function(type) {\n if (typeof type === 'undefined') {\n return this._objects.concat();\n }\n return this._objects.filter(function(o) {\n return o.type === type;\n });\n },\n\n /**\n * Returns object at specified index\n * @param {Number} index\n * @return {Self} thisArg\n */\n item: function (index) {\n return this._objects[index];\n },\n\n /**\n * Returns true if collection contains no objects\n * @return {Boolean} true if collection is empty\n */\n isEmpty: function () {\n return this._objects.length === 0;\n },\n\n /**\n * Returns a size of a collection (i.e: length of an array containing its objects)\n * @return {Number} Collection size\n */\n size: function() {\n return this._objects.length;\n },\n\n /**\n * Returns true if collection contains an object\n * @param {Object} object Object to check against\n * @param {Boolean} [deep=false] `true` to check all descendants, `false` to check only `_objects`\n * @return {Boolean} `true` if collection contains an object\n */\n contains: function (object, deep) {\n if (this._objects.indexOf(object) > -1) {\n return true;\n }\n else if (deep) {\n return this._objects.some(function (obj) {\n return typeof obj.contains === 'function' && obj.contains(object, true);\n });\n }\n return false;\n },\n\n /**\n * Returns number representation of a collection complexity\n * @return {Number} complexity\n */\n complexity: function () {\n return this._objects.reduce(function (memo, current) {\n memo += current.complexity ? current.complexity() : 0;\n return memo;\n }, 0);\n }\n};\n\n\n/**\n * @namespace fabric.CommonMethods\n */\nfabric.CommonMethods = {\n\n /**\n * Sets object's properties from options\n * @param {Object} [options] Options object\n */\n _setOptions: function(options) {\n for (var prop in options) {\n this.set(prop, options[prop]);\n }\n },\n\n /**\n * @private\n * @param {Object} [filler] Options object\n * @param {String} [property] property to set the Gradient to\n */\n _initGradient: function(filler, property) {\n if (filler && filler.colorStops && !(filler instanceof fabric.Gradient)) {\n this.set(property, new fabric.Gradient(filler));\n }\n },\n\n /**\n * @private\n * @param {Object} [filler] Options object\n * @param {String} [property] property to set the Pattern to\n * @param {Function} [callback] callback to invoke after pattern load\n */\n _initPattern: function(filler, property, callback) {\n if (filler && filler.source && !(filler instanceof fabric.Pattern)) {\n this.set(property, new fabric.Pattern(filler, callback));\n }\n else {\n callback && callback();\n }\n },\n\n /**\n * @private\n */\n _setObject: function(obj) {\n for (var prop in obj) {\n this._set(prop, obj[prop]);\n }\n },\n\n /**\n * Sets property to a given value. When changing position/dimension -related properties (left, top, scale, angle, etc.) `set` does not update position of object's borders/controls. If you need to update those, call `setCoords()`.\n * @param {String|Object} key Property name or object (if object, iterate over the object properties)\n * @param {Object|Function} value Property value (if function, the value is passed into it and its return value is used as a new one)\n * @return {fabric.Object} thisArg\n * @chainable\n */\n set: function(key, value) {\n if (typeof key === 'object') {\n this._setObject(key);\n }\n else {\n this._set(key, value);\n }\n return this;\n },\n\n _set: function(key, value) {\n this[key] = value;\n },\n\n /**\n * Toggles specified property from `true` to `false` or from `false` to `true`\n * @param {String} property Property to toggle\n * @return {fabric.Object} thisArg\n * @chainable\n */\n toggle: function(property) {\n var value = this.get(property);\n if (typeof value === 'boolean') {\n this.set(property, !value);\n }\n return this;\n },\n\n /**\n * Basic getter\n * @param {String} property Property name\n * @return {*} value of a property\n */\n get: function(property) {\n return this[property];\n }\n};\n\n\n(function(global) {\n\n var sqrt = Math.sqrt,\n atan2 = Math.atan2,\n pow = Math.pow,\n PiBy180 = Math.PI / 180,\n PiBy2 = Math.PI / 2;\n\n /**\n * @namespace fabric.util\n */\n fabric.util = {\n\n /**\n * Calculate the cos of an angle, avoiding returning floats for known results\n * @static\n * @memberOf fabric.util\n * @param {Number} angle the angle in radians or in degree\n * @return {Number}\n */\n cos: function(angle) {\n if (angle === 0) { return 1; }\n if (angle < 0) {\n // cos(a) = cos(-a)\n angle = -angle;\n }\n var angleSlice = angle / PiBy2;\n switch (angleSlice) {\n case 1: case 3: return 0;\n case 2: return -1;\n }\n return Math.cos(angle);\n },\n\n /**\n * Calculate the sin of an angle, avoiding returning floats for known results\n * @static\n * @memberOf fabric.util\n * @param {Number} angle the angle in radians or in degree\n * @return {Number}\n */\n sin: function(angle) {\n if (angle === 0) { return 0; }\n var angleSlice = angle / PiBy2, sign = 1;\n if (angle < 0) {\n // sin(-a) = -sin(a)\n sign = -1;\n }\n switch (angleSlice) {\n case 1: return sign;\n case 2: return 0;\n case 3: return -sign;\n }\n return Math.sin(angle);\n },\n\n /**\n * Removes value from an array.\n * Presence of value (and its position in an array) is determined via `Array.prototype.indexOf`\n * @static\n * @memberOf fabric.util\n * @param {Array} array\n * @param {*} value\n * @return {Array} original array\n */\n removeFromArray: function(array, value) {\n var idx = array.indexOf(value);\n if (idx !== -1) {\n array.splice(idx, 1);\n }\n return array;\n },\n\n /**\n * Returns random number between 2 specified ones.\n * @static\n * @memberOf fabric.util\n * @param {Number} min lower limit\n * @param {Number} max upper limit\n * @return {Number} random value (between min and max)\n */\n getRandomInt: function(min, max) {\n return Math.floor(Math.random() * (max - min + 1)) + min;\n },\n\n /**\n * Transforms degrees to radians.\n * @static\n * @memberOf fabric.util\n * @param {Number} degrees value in degrees\n * @return {Number} value in radians\n */\n degreesToRadians: function(degrees) {\n return degrees * PiBy180;\n },\n\n /**\n * Transforms radians to degrees.\n * @static\n * @memberOf fabric.util\n * @param {Number} radians value in radians\n * @return {Number} value in degrees\n */\n radiansToDegrees: function(radians) {\n return radians / PiBy180;\n },\n\n /**\n * Rotates `point` around `origin` with `radians`\n * @static\n * @memberOf fabric.util\n * @param {fabric.Point} point The point to rotate\n * @param {fabric.Point} origin The origin of the rotation\n * @param {Number} radians The radians of the angle for the rotation\n * @return {fabric.Point} The new rotated point\n */\n rotatePoint: function(point, origin, radians) {\n var newPoint = new fabric.Point(point.x - origin.x, point.y - origin.y),\n v = fabric.util.rotateVector(newPoint, radians);\n return new fabric.Point(v.x, v.y).addEquals(origin);\n },\n\n /**\n * Rotates `vector` with `radians`\n * @static\n * @memberOf fabric.util\n * @param {Object} vector The vector to rotate (x and y)\n * @param {Number} radians The radians of the angle for the rotation\n * @return {Object} The new rotated point\n */\n rotateVector: function(vector, radians) {\n var sin = fabric.util.sin(radians),\n cos = fabric.util.cos(radians),\n rx = vector.x * cos - vector.y * sin,\n ry = vector.x * sin + vector.y * cos;\n return {\n x: rx,\n y: ry\n };\n },\n\n /**\n * Creates a vetor from points represented as a point\n * @static\n * @memberOf fabric.util\n *\n * @typedef {Object} Point\n * @property {number} x\n * @property {number} y\n *\n * @param {Point} from\n * @param {Point} to\n * @returns {Point} vector\n */\n createVector: function (from, to) {\n return new fabric.Point(to.x - from.x, to.y - from.y);\n },\n\n /**\n * Calculates angle between 2 vectors using dot product\n * @static\n * @memberOf fabric.util\n * @param {Point} a\n * @param {Point} b\n * @returns the angle in radian between the vectors\n */\n calcAngleBetweenVectors: function (a, b) {\n return Math.acos((a.x * b.x + a.y * b.y) / (Math.hypot(a.x, a.y) * Math.hypot(b.x, b.y)));\n },\n\n /**\n * @static\n * @memberOf fabric.util\n * @param {Point} v\n * @returns {Point} vector representing the unit vector of pointing to the direction of `v`\n */\n getHatVector: function (v) {\n return new fabric.Point(v.x, v.y).multiply(1 / Math.hypot(v.x, v.y));\n },\n\n /**\n * @static\n * @memberOf fabric.util\n * @param {Point} A\n * @param {Point} B\n * @param {Point} C\n * @returns {{ vector: Point, angle: number }} vector representing the bisector of A and A's angle\n */\n getBisector: function (A, B, C) {\n var AB = fabric.util.createVector(A, B), AC = fabric.util.createVector(A, C);\n var alpha = fabric.util.calcAngleBetweenVectors(AB, AC);\n // check if alpha is relative to AB->BC\n var ro = fabric.util.calcAngleBetweenVectors(fabric.util.rotateVector(AB, alpha), AC);\n var phi = alpha * (ro === 0 ? 1 : -1) / 2;\n return {\n vector: fabric.util.getHatVector(fabric.util.rotateVector(AB, phi)),\n angle: alpha\n };\n },\n\n /**\n * Project stroke width on points returning 2 projections for each point as follows:\n * - `miter`: 2 points corresponding to the outer boundary and the inner boundary of stroke.\n * - `bevel`: 2 points corresponding to the bevel boundaries, tangent to the bisector.\n * - `round`: same as `bevel`\n * Used to calculate object's bounding box\n * @static\n * @memberOf fabric.util\n * @param {Point[]} points\n * @param {Object} options\n * @param {number} options.strokeWidth\n * @param {'miter'|'bevel'|'round'} options.strokeLineJoin\n * @param {number} options.strokeMiterLimit https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-miterlimit\n * @param {boolean} options.strokeUniform\n * @param {number} options.scaleX\n * @param {number} options.scaleY\n * @param {boolean} [openPath] whether the shape is open or not, affects the calculations of the first and last points\n * @returns {fabric.Point[]} array of size 2n/4n of all suspected points\n */\n projectStrokeOnPoints: function (points, options, openPath) {\n var coords = [], s = options.strokeWidth / 2,\n strokeUniformScalar = options.strokeUniform ?\n new fabric.Point(1 / options.scaleX, 1 / options.scaleY) : new fabric.Point(1, 1),\n getStrokeHatVector = function (v) {\n var scalar = s / (Math.hypot(v.x, v.y));\n return new fabric.Point(v.x * scalar * strokeUniformScalar.x, v.y * scalar * strokeUniformScalar.y);\n };\n if (points.length <= 1) {return coords;}\n points.forEach(function (p, index) {\n var A = new fabric.Point(p.x, p.y), B, C;\n if (index === 0) {\n C = points[index + 1];\n B = openPath ? getStrokeHatVector(fabric.util.createVector(C, A)).addEquals(A) : points[points.length - 1];\n }\n else if (index === points.length - 1) {\n B = points[index - 1];\n C = openPath ? getStrokeHatVector(fabric.util.createVector(B, A)).addEquals(A) : points[0];\n }\n else {\n B = points[index - 1];\n C = points[index + 1];\n }\n var bisector = fabric.util.getBisector(A, B, C),\n bisectorVector = bisector.vector,\n alpha = bisector.angle,\n scalar,\n miterVector;\n if (options.strokeLineJoin === 'miter') {\n scalar = -s / Math.sin(alpha / 2);\n miterVector = new fabric.Point(\n bisectorVector.x * scalar * strokeUniformScalar.x,\n bisectorVector.y * scalar * strokeUniformScalar.y\n );\n if (Math.hypot(miterVector.x, miterVector.y) / s <= options.strokeMiterLimit) {\n coords.push(A.add(miterVector));\n coords.push(A.subtract(miterVector));\n return;\n }\n }\n scalar = -s * Math.SQRT2;\n miterVector = new fabric.Point(\n bisectorVector.x * scalar * strokeUniformScalar.x,\n bisectorVector.y * scalar * strokeUniformScalar.y\n );\n coords.push(A.add(miterVector));\n coords.push(A.subtract(miterVector));\n });\n return coords;\n },\n\n /**\n * Apply transform t to point p\n * @static\n * @memberOf fabric.util\n * @param {fabric.Point} p The point to transform\n * @param {Array} t The transform\n * @param {Boolean} [ignoreOffset] Indicates that the offset should not be applied\n * @return {fabric.Point} The transformed point\n */\n transformPoint: function(p, t, ignoreOffset) {\n if (ignoreOffset) {\n return new fabric.Point(\n t[0] * p.x + t[2] * p.y,\n t[1] * p.x + t[3] * p.y\n );\n }\n return new fabric.Point(\n t[0] * p.x + t[2] * p.y + t[4],\n t[1] * p.x + t[3] * p.y + t[5]\n );\n },\n\n /**\n * Returns coordinates of points's bounding rectangle (left, top, width, height)\n * @param {Array} points 4 points array\n * @param {Array} [transform] an array of 6 numbers representing a 2x3 transform matrix\n * @return {Object} Object with left, top, width, height properties\n */\n makeBoundingBoxFromPoints: function(points, transform) {\n if (transform) {\n for (var i = 0; i < points.length; i++) {\n points[i] = fabric.util.transformPoint(points[i], transform);\n }\n }\n var xPoints = [points[0].x, points[1].x, points[2].x, points[3].x],\n minX = fabric.util.array.min(xPoints),\n maxX = fabric.util.array.max(xPoints),\n width = maxX - minX,\n yPoints = [points[0].y, points[1].y, points[2].y, points[3].y],\n minY = fabric.util.array.min(yPoints),\n maxY = fabric.util.array.max(yPoints),\n height = maxY - minY;\n\n return {\n left: minX,\n top: minY,\n width: width,\n height: height\n };\n },\n\n /**\n * Invert transformation t\n * @static\n * @memberOf fabric.util\n * @param {Array} t The transform\n * @return {Array} The inverted transform\n */\n invertTransform: function(t) {\n var a = 1 / (t[0] * t[3] - t[1] * t[2]),\n r = [a * t[3], -a * t[1], -a * t[2], a * t[0]],\n o = fabric.util.transformPoint({ x: t[4], y: t[5] }, r, true);\n r[4] = -o.x;\n r[5] = -o.y;\n return r;\n },\n\n /**\n * A wrapper around Number#toFixed, which contrary to native method returns number, not string.\n * @static\n * @memberOf fabric.util\n * @param {Number|String} number number to operate on\n * @param {Number} fractionDigits number of fraction digits to \"leave\"\n * @return {Number}\n */\n toFixed: function(number, fractionDigits) {\n return parseFloat(Number(number).toFixed(fractionDigits));\n },\n\n /**\n * Converts from attribute value to pixel value if applicable.\n * Returns converted pixels or original value not converted.\n * @param {Number|String} value number to operate on\n * @param {Number} fontSize\n * @return {Number|String}\n */\n parseUnit: function(value, fontSize) {\n var unit = /\\D{0,2}$/.exec(value),\n number = parseFloat(value);\n if (!fontSize) {\n fontSize = fabric.Text.DEFAULT_SVG_FONT_SIZE;\n }\n switch (unit[0]) {\n case 'mm':\n return number * fabric.DPI / 25.4;\n\n case 'cm':\n return number * fabric.DPI / 2.54;\n\n case 'in':\n return number * fabric.DPI;\n\n case 'pt':\n return number * fabric.DPI / 72; // or * 4 / 3\n\n case 'pc':\n return number * fabric.DPI / 72 * 12; // or * 16\n\n case 'em':\n return number * fontSize;\n\n default:\n return number;\n }\n },\n\n /**\n * Function which always returns `false`.\n * @static\n * @memberOf fabric.util\n * @return {Boolean}\n */\n falseFunction: function() {\n return false;\n },\n\n /**\n * Returns klass \"Class\" object of given namespace\n * @memberOf fabric.util\n * @param {String} type Type of object (eg. 'circle')\n * @param {String} namespace Namespace to get klass \"Class\" object from\n * @return {Object} klass \"Class\"\n */\n getKlass: function(type, namespace) {\n // capitalize first letter only\n type = fabric.util.string.camelize(type.charAt(0).toUpperCase() + type.slice(1));\n return fabric.util.resolveNamespace(namespace)[type];\n },\n\n /**\n * Returns array of attributes for given svg that fabric parses\n * @memberOf fabric.util\n * @param {String} type Type of svg element (eg. 'circle')\n * @return {Array} string names of supported attributes\n */\n getSvgAttributes: function(type) {\n var attributes = [\n 'instantiated_by_use',\n 'style',\n 'id',\n 'class'\n ];\n switch (type) {\n case 'linearGradient':\n attributes = attributes.concat(['x1', 'y1', 'x2', 'y2', 'gradientUnits', 'gradientTransform']);\n break;\n case 'radialGradient':\n attributes = attributes.concat(['gradientUnits', 'gradientTransform', 'cx', 'cy', 'r', 'fx', 'fy', 'fr']);\n break;\n case 'stop':\n attributes = attributes.concat(['offset', 'stop-color', 'stop-opacity']);\n break;\n }\n return attributes;\n },\n\n /**\n * Returns object of given namespace\n * @memberOf fabric.util\n * @param {String} namespace Namespace string e.g. 'fabric.Image.filter' or 'fabric'\n * @return {Object} Object for given namespace (default fabric)\n */\n resolveNamespace: function(namespace) {\n if (!namespace) {\n return fabric;\n }\n\n var parts = namespace.split('.'),\n len = parts.length, i,\n obj = global || fabric.window;\n\n for (i = 0; i < len; ++i) {\n obj = obj[parts[i]];\n }\n\n return obj;\n },\n\n /**\n * Loads image element from given url and passes it to a callback\n * @memberOf fabric.util\n * @param {String} url URL representing an image\n * @param {Function} callback Callback; invoked with loaded image\n * @param {*} [context] Context to invoke callback in\n * @param {Object} [crossOrigin] crossOrigin value to set image element to\n */\n loadImage: function(url, callback, context, crossOrigin) {\n if (!url) {\n callback && callback.call(context, url);\n return;\n }\n\n var img = fabric.util.createImage();\n\n /** @ignore */\n var onLoadCallback = function () {\n callback && callback.call(context, img, false);\n img = img.onload = img.onerror = null;\n };\n\n img.onload = onLoadCallback;\n /** @ignore */\n img.onerror = function() {\n fabric.log('Error loading ' + img.src);\n callback && callback.call(context, null, true);\n img = img.onload = img.onerror = null;\n };\n\n // data-urls appear to be buggy with crossOrigin\n // https://github.com/kangax/fabric.js/commit/d0abb90f1cd5c5ef9d2a94d3fb21a22330da3e0a#commitcomment-4513767\n // see https://code.google.com/p/chromium/issues/detail?id=315152\n // https://bugzilla.mozilla.org/show_bug.cgi?id=935069\n // crossOrigin null is the same as not set.\n if (url.indexOf('data') !== 0 &&\n crossOrigin !== undefined &&\n crossOrigin !== null) {\n img.crossOrigin = crossOrigin;\n }\n\n // IE10 / IE11-Fix: SVG contents from data: URI\n // will only be available if the IMG is present\n // in the DOM (and visible)\n if (url.substring(0,14) === 'data:image/svg') {\n img.onload = null;\n fabric.util.loadImageInDom(img, onLoadCallback);\n }\n\n img.src = url;\n },\n\n /**\n * Attaches SVG image with data: URL to the dom\n * @memberOf fabric.util\n * @param {Object} img Image object with data:image/svg src\n * @param {Function} callback Callback; invoked with loaded image\n * @return {Object} DOM element (div containing the SVG image)\n */\n loadImageInDom: function(img, onLoadCallback) {\n var div = fabric.document.createElement('div');\n div.style.width = div.style.height = '1px';\n div.style.left = div.style.top = '-100%';\n div.style.position = 'absolute';\n div.appendChild(img);\n fabric.document.querySelector('body').appendChild(div);\n /**\n * Wrap in function to:\n * 1. Call existing callback\n * 2. Cleanup DOM\n */\n img.onload = function () {\n onLoadCallback();\n div.parentNode.removeChild(div);\n div = null;\n };\n },\n\n /**\n * Creates corresponding fabric instances from their object representations\n * @static\n * @memberOf fabric.util\n * @param {Array} objects Objects to enliven\n * @param {Function} callback Callback to invoke when all objects are created\n * @param {String} namespace Namespace to get klass \"Class\" object from\n * @param {Function} reviver Method for further parsing of object elements,\n * called after each fabric object created.\n */\n enlivenObjects: function(objects, callback, namespace, reviver) {\n objects = objects || [];\n\n var enlivenedObjects = [],\n numLoadedObjects = 0,\n numTotalObjects = objects.length;\n\n function onLoaded() {\n if (++numLoadedObjects === numTotalObjects) {\n callback && callback(enlivenedObjects.filter(function(obj) {\n // filter out undefined objects (objects that gave error)\n return obj;\n }));\n }\n }\n\n if (!numTotalObjects) {\n callback && callback(enlivenedObjects);\n return;\n }\n\n objects.forEach(function (o, index) {\n // if sparse array\n if (!o || !o.type) {\n onLoaded();\n return;\n }\n var klass = fabric.util.getKlass(o.type, namespace);\n klass.fromObject(o, function (obj, error) {\n error || (enlivenedObjects[index] = obj);\n reviver && reviver(o, obj, error);\n onLoaded();\n });\n });\n },\n\n /**\n * Creates corresponding fabric instances residing in an object, e.g. `clipPath`\n * @see {@link fabric.Object.ENLIVEN_PROPS}\n * @param {Object} object\n * @param {Object} [context] assign enlived props to this object (pass null to skip this)\n * @param {(objects:fabric.Object[]) => void} callback\n */\n enlivenObjectEnlivables: function (object, context, callback) {\n var enlivenProps = fabric.Object.ENLIVEN_PROPS.filter(function (key) { return !!object[key]; });\n fabric.util.enlivenObjects(enlivenProps.map(function (key) { return object[key]; }), function (enlivedProps) {\n var objects = {};\n enlivenProps.forEach(function (key, index) {\n objects[key] = enlivedProps[index];\n context && (context[key] = enlivedProps[index]);\n });\n callback && callback(objects);\n });\n },\n\n /**\n * Create and wait for loading of patterns\n * @static\n * @memberOf fabric.util\n * @param {Array} patterns Objects to enliven\n * @param {Function} callback Callback to invoke when all objects are created\n * called after each fabric object created.\n */\n enlivenPatterns: function(patterns, callback) {\n patterns = patterns || [];\n\n function onLoaded() {\n if (++numLoadedPatterns === numPatterns) {\n callback && callback(enlivenedPatterns);\n }\n }\n\n var enlivenedPatterns = [],\n numLoadedPatterns = 0,\n numPatterns = patterns.length;\n\n if (!numPatterns) {\n callback && callback(enlivenedPatterns);\n return;\n }\n\n patterns.forEach(function (p, index) {\n if (p && p.source) {\n new fabric.Pattern(p, function(pattern) {\n enlivenedPatterns[index] = pattern;\n onLoaded();\n });\n }\n else {\n enlivenedPatterns[index] = p;\n onLoaded();\n }\n });\n },\n\n /**\n * Groups SVG elements (usually those retrieved from SVG document)\n * @static\n * @memberOf fabric.util\n * @param {Array} elements SVG elements to group\n * @param {Object} [options] Options object\n * @param {String} path Value to set sourcePath to\n * @return {fabric.Object|fabric.Group}\n */\n groupSVGElements: function(elements, options, path) {\n var object;\n if (elements && elements.length === 1) {\n if (typeof path !== 'undefined') {\n elements[0].sourcePath = path;\n }\n return elements[0];\n }\n if (options) {\n if (options.width && options.height) {\n options.centerPoint = {\n x: options.width / 2,\n y: options.height / 2\n };\n }\n else {\n delete options.width;\n delete options.height;\n }\n }\n object = new fabric.Group(elements, options);\n if (typeof path !== 'undefined') {\n object.sourcePath = path;\n }\n return object;\n },\n\n /**\n * Populates an object with properties of another object\n * @static\n * @memberOf fabric.util\n * @param {Object} source Source object\n * @param {Object} destination Destination object\n * @return {Array} properties Properties names to include\n */\n populateWithProperties: function(source, destination, properties) {\n if (properties && Array.isArray(properties)) {\n for (var i = 0, len = properties.length; i < len; i++) {\n if (properties[i] in source) {\n destination[properties[i]] = source[properties[i]];\n }\n }\n }\n },\n\n /**\n * Creates canvas element\n * @static\n * @memberOf fabric.util\n * @return {CanvasElement} initialized canvas element\n */\n createCanvasElement: function() {\n return fabric.document.createElement('canvas');\n },\n\n /**\n * Creates a canvas element that is a copy of another and is also painted\n * @param {CanvasElement} canvas to copy size and content of\n * @static\n * @memberOf fabric.util\n * @return {CanvasElement} initialized canvas element\n */\n copyCanvasElement: function(canvas) {\n var newCanvas = fabric.util.createCanvasElement();\n newCanvas.width = canvas.width;\n newCanvas.height = canvas.height;\n newCanvas.getContext('2d').drawImage(canvas, 0, 0);\n return newCanvas;\n },\n\n /**\n * since 2.6.0 moved from canvas instance to utility.\n * @param {CanvasElement} canvasEl to copy size and content of\n * @param {String} format 'jpeg' or 'png', in some browsers 'webp' is ok too\n * @param {Number} quality <= 1 and > 0\n * @static\n * @memberOf fabric.util\n * @return {String} data url\n */\n toDataURL: function(canvasEl, format, quality) {\n return canvasEl.toDataURL('image/' + format, quality);\n },\n\n /**\n * Creates image element (works on client and node)\n * @static\n * @memberOf fabric.util\n * @return {HTMLImageElement} HTML image element\n */\n createImage: function() {\n return fabric.document.createElement('img');\n },\n\n /**\n * Multiply matrix A by matrix B to nest transformations\n * @static\n * @memberOf fabric.util\n * @param {Array} a First transformMatrix\n * @param {Array} b Second transformMatrix\n * @param {Boolean} is2x2 flag to multiply matrices as 2x2 matrices\n * @return {Array} The product of the two transform matrices\n */\n multiplyTransformMatrices: function(a, b, is2x2) {\n // Matrix multiply a * b\n return [\n a[0] * b[0] + a[2] * b[1],\n a[1] * b[0] + a[3] * b[1],\n a[0] * b[2] + a[2] * b[3],\n a[1] * b[2] + a[3] * b[3],\n is2x2 ? 0 : a[0] * b[4] + a[2] * b[5] + a[4],\n is2x2 ? 0 : a[1] * b[4] + a[3] * b[5] + a[5]\n ];\n },\n\n /**\n * Decomposes standard 2x3 matrix into transform components\n * @static\n * @memberOf fabric.util\n * @param {Array} a transformMatrix\n * @return {Object} Components of transform\n */\n qrDecompose: function(a) {\n var angle = atan2(a[1], a[0]),\n denom = pow(a[0], 2) + pow(a[1], 2),\n scaleX = sqrt(denom),\n scaleY = (a[0] * a[3] - a[2] * a[1]) / scaleX,\n skewX = atan2(a[0] * a[2] + a[1] * a [3], denom);\n return {\n angle: angle / PiBy180,\n scaleX: scaleX,\n scaleY: scaleY,\n skewX: skewX / PiBy180,\n skewY: 0,\n translateX: a[4],\n translateY: a[5]\n };\n },\n\n /**\n * Returns a transform matrix starting from an object of the same kind of\n * the one returned from qrDecompose, useful also if you want to calculate some\n * transformations from an object that is not enlived yet\n * @static\n * @memberOf fabric.util\n * @param {Object} options\n * @param {Number} [options.angle] angle in degrees\n * @return {Number[]} transform matrix\n */\n calcRotateMatrix: function(options) {\n if (!options.angle) {\n return fabric.iMatrix.concat();\n }\n var theta = fabric.util.degreesToRadians(options.angle),\n cos = fabric.util.cos(theta),\n sin = fabric.util.sin(theta);\n return [cos, sin, -sin, cos, 0, 0];\n },\n\n /**\n * Returns a transform matrix starting from an object of the same kind of\n * the one returned from qrDecompose, useful also if you want to calculate some\n * transformations from an object that is not enlived yet.\n * is called DimensionsTransformMatrix because those properties are the one that influence\n * the size of the resulting box of the object.\n * @static\n * @memberOf fabric.util\n * @param {Object} options\n * @param {Number} [options.scaleX]\n * @param {Number} [options.scaleY]\n * @param {Boolean} [options.flipX]\n * @param {Boolean} [options.flipY]\n * @param {Number} [options.skewX]\n * @param {Number} [options.skewY]\n * @return {Number[]} transform matrix\n */\n calcDimensionsMatrix: function(options) {\n var scaleX = typeof options.scaleX === 'undefined' ? 1 : options.scaleX,\n scaleY = typeof options.scaleY === 'undefined' ? 1 : options.scaleY,\n scaleMatrix = [\n options.flipX ? -scaleX : scaleX,\n 0,\n 0,\n options.flipY ? -scaleY : scaleY,\n 0,\n 0],\n multiply = fabric.util.multiplyTransformMatrices,\n degreesToRadians = fabric.util.degreesToRadians;\n if (options.skewX) {\n scaleMatrix = multiply(\n scaleMatrix,\n [1, 0, Math.tan(degreesToRadians(options.skewX)), 1],\n true);\n }\n if (options.skewY) {\n scaleMatrix = multiply(\n scaleMatrix,\n [1, Math.tan(degreesToRadians(options.skewY)), 0, 1],\n true);\n }\n return scaleMatrix;\n },\n\n /**\n * Returns a transform matrix starting from an object of the same kind of\n * the one returned from qrDecompose, useful also if you want to calculate some\n * transformations from an object that is not enlived yet\n * @static\n * @memberOf fabric.util\n * @param {Object} options\n * @param {Number} [options.angle]\n * @param {Number} [options.scaleX]\n * @param {Number} [options.scaleY]\n * @param {Boolean} [options.flipX]\n * @param {Boolean} [options.flipY]\n * @param {Number} [options.skewX]\n * @param {Number} [options.skewX]\n * @param {Number} [options.translateX]\n * @param {Number} [options.translateY]\n * @return {Number[]} transform matrix\n */\n composeMatrix: function(options) {\n var matrix = [1, 0, 0, 1, options.translateX || 0, options.translateY || 0],\n multiply = fabric.util.multiplyTransformMatrices;\n if (options.angle) {\n matrix = multiply(matrix, fabric.util.calcRotateMatrix(options));\n }\n if (options.scaleX !== 1 || options.scaleY !== 1 ||\n options.skewX || options.skewY || options.flipX || options.flipY) {\n matrix = multiply(matrix, fabric.util.calcDimensionsMatrix(options));\n }\n return matrix;\n },\n\n /**\n * reset an object transform state to neutral. Top and left are not accounted for\n * @static\n * @memberOf fabric.util\n * @param {fabric.Object} target object to transform\n */\n resetObjectTransform: function (target) {\n target.scaleX = 1;\n target.scaleY = 1;\n target.skewX = 0;\n target.skewY = 0;\n target.flipX = false;\n target.flipY = false;\n target.rotate(0);\n },\n\n /**\n * Extract Object transform values\n * @static\n * @memberOf fabric.util\n * @param {fabric.Object} target object to read from\n * @return {Object} Components of transform\n */\n saveObjectTransform: function (target) {\n return {\n scaleX: target.scaleX,\n scaleY: target.scaleY,\n skewX: target.skewX,\n skewY: target.skewY,\n angle: target.angle,\n left: target.left,\n flipX: target.flipX,\n flipY: target.flipY,\n top: target.top\n };\n },\n\n /**\n * Returns true if context has transparent pixel\n * at specified location (taking tolerance into account)\n * @param {CanvasRenderingContext2D} ctx context\n * @param {Number} x x coordinate\n * @param {Number} y y coordinate\n * @param {Number} tolerance Tolerance\n */\n isTransparent: function(ctx, x, y, tolerance) {\n\n // If tolerance is > 0 adjust start coords to take into account.\n // If moves off Canvas fix to 0\n if (tolerance > 0) {\n if (x > tolerance) {\n x -= tolerance;\n }\n else {\n x = 0;\n }\n if (y > tolerance) {\n y -= tolerance;\n }\n else {\n y = 0;\n }\n }\n\n var _isTransparent = true, i, temp,\n imageData = ctx.getImageData(x, y, (tolerance * 2) || 1, (tolerance * 2) || 1),\n l = imageData.data.length;\n\n // Split image data - for tolerance > 1, pixelDataSize = 4;\n for (i = 3; i < l; i += 4) {\n temp = imageData.data[i];\n _isTransparent = temp <= 0;\n if (_isTransparent === false) {\n break; // Stop if colour found\n }\n }\n\n imageData = null;\n\n return _isTransparent;\n },\n\n /**\n * Parse preserveAspectRatio attribute from element\n * @param {string} attribute to be parsed\n * @return {Object} an object containing align and meetOrSlice attribute\n */\n parsePreserveAspectRatioAttribute: function(attribute) {\n var meetOrSlice = 'meet', alignX = 'Mid', alignY = 'Mid',\n aspectRatioAttrs = attribute.split(' '), align;\n\n if (aspectRatioAttrs && aspectRatioAttrs.length) {\n meetOrSlice = aspectRatioAttrs.pop();\n if (meetOrSlice !== 'meet' && meetOrSlice !== 'slice') {\n align = meetOrSlice;\n meetOrSlice = 'meet';\n }\n else if (aspectRatioAttrs.length) {\n align = aspectRatioAttrs.pop();\n }\n }\n //divide align in alignX and alignY\n alignX = align !== 'none' ? align.slice(1, 4) : 'none';\n alignY = align !== 'none' ? align.slice(5, 8) : 'none';\n return {\n meetOrSlice: meetOrSlice,\n alignX: alignX,\n alignY: alignY\n };\n },\n\n /**\n * Clear char widths cache for the given font family or all the cache if no\n * fontFamily is specified.\n * Use it if you know you are loading fonts in a lazy way and you are not waiting\n * for custom fonts to load properly when adding text objects to the canvas.\n * If a text object is added when its own font is not loaded yet, you will get wrong\n * measurement and so wrong bounding boxes.\n * After the font cache is cleared, either change the textObject text content or call\n * initDimensions() to trigger a recalculation\n * @memberOf fabric.util\n * @param {String} [fontFamily] font family to clear\n */\n clearFabricFontCache: function(fontFamily) {\n fontFamily = (fontFamily || '').toLowerCase();\n if (!fontFamily) {\n fabric.charWidthsCache = { };\n }\n else if (fabric.charWidthsCache[fontFamily]) {\n delete fabric.charWidthsCache[fontFamily];\n }\n },\n\n /**\n * Given current aspect ratio, determines the max width and height that can\n * respect the total allowed area for the cache.\n * @memberOf fabric.util\n * @param {Number} ar aspect ratio\n * @param {Number} maximumArea Maximum area you want to achieve\n * @return {Object.x} Limited dimensions by X\n * @return {Object.y} Limited dimensions by Y\n */\n limitDimsByArea: function(ar, maximumArea) {\n var roughWidth = Math.sqrt(maximumArea * ar),\n perfLimitSizeY = Math.floor(maximumArea / roughWidth);\n return { x: Math.floor(roughWidth), y: perfLimitSizeY };\n },\n\n capValue: function(min, value, max) {\n return Math.max(min, Math.min(value, max));\n },\n\n /**\n * Finds the scale for the object source to fit inside the object destination,\n * keeping aspect ratio intact.\n * respect the total allowed area for the cache.\n * @memberOf fabric.util\n * @param {Object | fabric.Object} source\n * @param {Number} source.height natural unscaled height of the object\n * @param {Number} source.width natural unscaled width of the object\n * @param {Object | fabric.Object} destination\n * @param {Number} destination.height natural unscaled height of the object\n * @param {Number} destination.width natural unscaled width of the object\n * @return {Number} scale factor to apply to source to fit into destination\n */\n findScaleToFit: function(source, destination) {\n return Math.min(destination.width / source.width, destination.height / source.height);\n },\n\n /**\n * Finds the scale for the object source to cover entirely the object destination,\n * keeping aspect ratio intact.\n * respect the total allowed area for the cache.\n * @memberOf fabric.util\n * @param {Object | fabric.Object} source\n * @param {Number} source.height natural unscaled height of the object\n * @param {Number} source.width natural unscaled width of the object\n * @param {Object | fabric.Object} destination\n * @param {Number} destination.height natural unscaled height of the object\n * @param {Number} destination.width natural unscaled width of the object\n * @return {Number} scale factor to apply to source to cover destination\n */\n findScaleToCover: function(source, destination) {\n return Math.max(destination.width / source.width, destination.height / source.height);\n },\n\n /**\n * given an array of 6 number returns something like `\"matrix(...numbers)\"`\n * @memberOf fabric.util\n * @param {Array} transform an array with 6 numbers\n * @return {String} transform matrix for svg\n * @return {Object.y} Limited dimensions by Y\n */\n matrixToSVG: function(transform) {\n return 'matrix(' + transform.map(function(value) {\n return fabric.util.toFixed(value, fabric.Object.NUM_FRACTION_DIGITS);\n }).join(' ') + ')';\n },\n\n /**\n * given an object and a transform, apply the inverse transform to the object,\n * this is equivalent to remove from that object that transformation, so that\n * added in a space with the removed transform, the object will be the same as before.\n * Removing from an object a transform that scale by 2 is like scaling it by 1/2.\n * Removing from an object a transfrom that rotate by 30deg is like rotating by 30deg\n * in the opposite direction.\n * This util is used to add objects inside transformed groups or nested groups.\n * @memberOf fabric.util\n * @param {fabric.Object} object the object you want to transform\n * @param {Array} transform the destination transform\n */\n removeTransformFromObject: function(object, transform) {\n var inverted = fabric.util.invertTransform(transform),\n finalTransform = fabric.util.multiplyTransformMatrices(inverted, object.calcOwnMatrix());\n fabric.util.applyTransformToObject(object, finalTransform);\n },\n\n /**\n * given an object and a transform, apply the transform to the object.\n * this is equivalent to change the space where the object is drawn.\n * Adding to an object a transform that scale by 2 is like scaling it by 2.\n * This is used when removing an object from an active selection for example.\n * @memberOf fabric.util\n * @param {fabric.Object} object the object you want to transform\n * @param {Array} transform the destination transform\n */\n addTransformToObject: function(object, transform) {\n fabric.util.applyTransformToObject(\n object,\n fabric.util.multiplyTransformMatrices(transform, object.calcOwnMatrix())\n );\n },\n\n /**\n * discard an object transform state and apply the one from the matrix.\n * @memberOf fabric.util\n * @param {fabric.Object} object the object you want to transform\n * @param {Array} transform the destination transform\n */\n applyTransformToObject: function(object, transform) {\n var options = fabric.util.qrDecompose(transform),\n center = new fabric.Point(options.translateX, options.translateY);\n object.flipX = false;\n object.flipY = false;\n object.set('scaleX', options.scaleX);\n object.set('scaleY', options.scaleY);\n object.skewX = options.skewX;\n object.skewY = options.skewY;\n object.angle = options.angle;\n object.setPositionByOrigin(center, 'center', 'center');\n },\n\n /**\n * given a width and height, return the size of the bounding box\n * that can contains the box with width/height with applied transform\n * described in options.\n * Use to calculate the boxes around objects for controls.\n * @memberOf fabric.util\n * @param {Number} width\n * @param {Number} height\n * @param {Object} options\n * @param {Number} options.scaleX\n * @param {Number} options.scaleY\n * @param {Number} options.skewX\n * @param {Number} options.skewY\n * @return {Object.x} width of containing\n * @return {Object.y} height of containing\n */\n sizeAfterTransform: function(width, height, options) {\n var dimX = width / 2, dimY = height / 2,\n points = [\n {\n x: -dimX,\n y: -dimY\n },\n {\n x: dimX,\n y: -dimY\n },\n {\n x: -dimX,\n y: dimY\n },\n {\n x: dimX,\n y: dimY\n }],\n transformMatrix = fabric.util.calcDimensionsMatrix(options),\n bbox = fabric.util.makeBoundingBoxFromPoints(points, transformMatrix);\n return {\n x: bbox.width,\n y: bbox.height,\n };\n },\n\n /**\n * Merges 2 clip paths into one visually equal clip path\n *\n * **IMPORTANT**:\\\n * Does **NOT** clone the arguments, clone them proir if necessary.\n *\n * Creates a wrapper (group) that contains one clip path and is clipped by the other so content is kept where both overlap.\n * Use this method if both the clip paths may have nested clip paths of their own, so assigning one to the other's clip path property is not possible.\n *\n * In order to handle the `inverted` property we follow logic described in the following cases:\\\n * **(1)** both clip paths are inverted - the clip paths pass the inverted prop to the wrapper and loose it themselves.\\\n * **(2)** one is inverted and the other isn't - the wrapper shouldn't become inverted and the inverted clip path must clip the non inverted one to produce an identical visual effect.\\\n * **(3)** both clip paths are not inverted - wrapper and clip paths remain unchanged.\n *\n * @memberOf fabric.util\n * @param {fabric.Object} c1\n * @param {fabric.Object} c2\n * @returns {fabric.Object} merged clip path\n */\n mergeClipPaths: function (c1, c2) {\n var a = c1, b = c2;\n if (a.inverted && !b.inverted) {\n // case (2)\n a = c2;\n b = c1;\n }\n // `b` becomes `a`'s clip path so we transform `b` to `a` coordinate plane\n fabric.util.applyTransformToObject(\n b,\n fabric.util.multiplyTransformMatrices(\n fabric.util.invertTransform(a.calcTransformMatrix()),\n b.calcTransformMatrix()\n )\n );\n // assign the `inverted` prop to the wrapping group\n var inverted = a.inverted && b.inverted;\n if (inverted) {\n // case (1)\n a.inverted = b.inverted = false;\n }\n return new fabric.Group([a], { clipPath: b, inverted: inverted });\n },\n\n /**\n * @memberOf fabric.util\n * @param {Object} prevStyle first style to compare\n * @param {Object} thisStyle second style to compare\n * @param {boolean} forTextSpans whether to check overline, underline, and line-through properties\n * @return {boolean} true if the style changed\n */\n hasStyleChanged: function(prevStyle, thisStyle, forTextSpans) {\n forTextSpans = forTextSpans || false;\n return (prevStyle.fill !== thisStyle.fill ||\n prevStyle.stroke !== thisStyle.stroke ||\n prevStyle.strokeWidth !== thisStyle.strokeWidth ||\n prevStyle.fontSize !== thisStyle.fontSize ||\n prevStyle.fontFamily !== thisStyle.fontFamily ||\n prevStyle.fontWeight !== thisStyle.fontWeight ||\n prevStyle.fontStyle !== thisStyle.fontStyle ||\n prevStyle.textBackgroundColor !== thisStyle.textBackgroundColor ||\n prevStyle.deltaY !== thisStyle.deltaY) ||\n (forTextSpans &&\n (prevStyle.overline !== thisStyle.overline ||\n prevStyle.underline !== thisStyle.underline ||\n prevStyle.linethrough !== thisStyle.linethrough));\n },\n\n /**\n * Returns the array form of a text object's inline styles property with styles grouped in ranges\n * rather than per character. This format is less verbose, and is better suited for storage\n * so it is used in serialization (not during runtime).\n * @memberOf fabric.util\n * @param {object} styles per character styles for a text object\n * @param {String} text the text string that the styles are applied to\n * @return {{start: number, end: number, style: object}[]}\n */\n stylesToArray: function(styles, text) {\n // clone style structure to prevent mutation\n var styles = fabric.util.object.clone(styles, true),\n textLines = text.split('\\n'),\n charIndex = -1, prevStyle = {}, stylesArray = [];\n //loop through each textLine\n for (var i = 0; i < textLines.length; i++) {\n if (!styles[i]) {\n //no styles exist for this line, so add the line's length to the charIndex total\n charIndex += textLines[i].length;\n continue;\n }\n //loop through each character of the current line\n for (var c = 0; c < textLines[i].length; c++) {\n charIndex++;\n var thisStyle = styles[i][c];\n //check if style exists for this character\n if (thisStyle && Object.keys(thisStyle).length > 0) {\n var styleChanged = fabric.util.hasStyleChanged(prevStyle, thisStyle, true);\n if (styleChanged) {\n stylesArray.push({\n start: charIndex,\n end: charIndex + 1,\n style: thisStyle\n });\n }\n else {\n //if style is the same as previous character, increase end index\n stylesArray[stylesArray.length - 1].end++;\n }\n }\n prevStyle = thisStyle || {};\n }\n }\n return stylesArray;\n },\n\n /**\n * Returns the object form of the styles property with styles that are assigned per\n * character rather than grouped by range. This format is more verbose, and is\n * only used during runtime (not for serialization/storage)\n * @memberOf fabric.util\n * @param {Array} styles the serialized form of a text object's styles\n * @param {String} text the text string that the styles are applied to\n * @return {Object}\n */\n stylesFromArray: function(styles, text) {\n if (!Array.isArray(styles)) {\n return styles;\n }\n var textLines = text.split('\\n'),\n charIndex = -1, styleIndex = 0, stylesObject = {};\n //loop through each textLine\n for (var i = 0; i < textLines.length; i++) {\n //loop through each character of the current line\n for (var c = 0; c < textLines[i].length; c++) {\n charIndex++;\n //check if there's a style collection that includes the current character\n if (styles[styleIndex]\n && styles[styleIndex].start <= charIndex\n && charIndex < styles[styleIndex].end) {\n //create object for line index if it doesn't exist\n stylesObject[i] = stylesObject[i] || {};\n //assign a style at this character's index\n stylesObject[i][c] = Object.assign({}, styles[styleIndex].style);\n //if character is at the end of the current style collection, move to the next\n if (charIndex === styles[styleIndex].end - 1) {\n styleIndex++;\n }\n }\n }\n }\n return stylesObject;\n }\n };\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function() {\n var _join = Array.prototype.join,\n commandLengths = {\n m: 2,\n l: 2,\n h: 1,\n v: 1,\n c: 6,\n s: 4,\n q: 4,\n t: 2,\n a: 7\n },\n repeatedCommands = {\n m: 'l',\n M: 'L'\n };\n function segmentToBezier(th2, th3, cosTh, sinTh, rx, ry, cx1, cy1, mT, fromX, fromY) {\n var costh2 = fabric.util.cos(th2),\n sinth2 = fabric.util.sin(th2),\n costh3 = fabric.util.cos(th3),\n sinth3 = fabric.util.sin(th3),\n toX = cosTh * rx * costh3 - sinTh * ry * sinth3 + cx1,\n toY = sinTh * rx * costh3 + cosTh * ry * sinth3 + cy1,\n cp1X = fromX + mT * ( -cosTh * rx * sinth2 - sinTh * ry * costh2),\n cp1Y = fromY + mT * ( -sinTh * rx * sinth2 + cosTh * ry * costh2),\n cp2X = toX + mT * ( cosTh * rx * sinth3 + sinTh * ry * costh3),\n cp2Y = toY + mT * ( sinTh * rx * sinth3 - cosTh * ry * costh3);\n\n return ['C',\n cp1X, cp1Y,\n cp2X, cp2Y,\n toX, toY\n ];\n }\n\n /* Adapted from http://dxr.mozilla.org/mozilla-central/source/content/svg/content/src/nsSVGPathDataParser.cpp\n * by Andrea Bogazzi code is under MPL. if you don't have a copy of the license you can take it here\n * http://mozilla.org/MPL/2.0/\n */\n function arcToSegments(toX, toY, rx, ry, large, sweep, rotateX) {\n var PI = Math.PI, th = rotateX * PI / 180,\n sinTh = fabric.util.sin(th),\n cosTh = fabric.util.cos(th),\n fromX = 0, fromY = 0;\n\n rx = Math.abs(rx);\n ry = Math.abs(ry);\n\n var px = -cosTh * toX * 0.5 - sinTh * toY * 0.5,\n py = -cosTh * toY * 0.5 + sinTh * toX * 0.5,\n rx2 = rx * rx, ry2 = ry * ry, py2 = py * py, px2 = px * px,\n pl = rx2 * ry2 - rx2 * py2 - ry2 * px2,\n root = 0;\n\n if (pl < 0) {\n var s = Math.sqrt(1 - pl / (rx2 * ry2));\n rx *= s;\n ry *= s;\n }\n else {\n root = (large === sweep ? -1.0 : 1.0) *\n Math.sqrt( pl / (rx2 * py2 + ry2 * px2));\n }\n\n var cx = root * rx * py / ry,\n cy = -root * ry * px / rx,\n cx1 = cosTh * cx - sinTh * cy + toX * 0.5,\n cy1 = sinTh * cx + cosTh * cy + toY * 0.5,\n mTheta = calcVectorAngle(1, 0, (px - cx) / rx, (py - cy) / ry),\n dtheta = calcVectorAngle((px - cx) / rx, (py - cy) / ry, (-px - cx) / rx, (-py - cy) / ry);\n\n if (sweep === 0 && dtheta > 0) {\n dtheta -= 2 * PI;\n }\n else if (sweep === 1 && dtheta < 0) {\n dtheta += 2 * PI;\n }\n\n // Convert into cubic bezier segments <= 90deg\n var segments = Math.ceil(Math.abs(dtheta / PI * 2)),\n result = [], mDelta = dtheta / segments,\n mT = 8 / 3 * Math.sin(mDelta / 4) * Math.sin(mDelta / 4) / Math.sin(mDelta / 2),\n th3 = mTheta + mDelta;\n\n for (var i = 0; i < segments; i++) {\n result[i] = segmentToBezier(mTheta, th3, cosTh, sinTh, rx, ry, cx1, cy1, mT, fromX, fromY);\n fromX = result[i][5];\n fromY = result[i][6];\n mTheta = th3;\n th3 += mDelta;\n }\n return result;\n }\n\n /*\n * Private\n */\n function calcVectorAngle(ux, uy, vx, vy) {\n var ta = Math.atan2(uy, ux),\n tb = Math.atan2(vy, vx);\n if (tb >= ta) {\n return tb - ta;\n }\n else {\n return 2 * Math.PI - (ta - tb);\n }\n }\n\n /**\n * Calculate bounding box of a beziercurve\n * @param {Number} x0 starting point\n * @param {Number} y0\n * @param {Number} x1 first control point\n * @param {Number} y1\n * @param {Number} x2 secondo control point\n * @param {Number} y2\n * @param {Number} x3 end of bezier\n * @param {Number} y3\n */\n // taken from http://jsbin.com/ivomiq/56/edit no credits available for that.\n // TODO: can we normalize this with the starting points set at 0 and then translated the bbox?\n function getBoundsOfCurve(x0, y0, x1, y1, x2, y2, x3, y3) {\n var argsString;\n if (fabric.cachesBoundsOfCurve) {\n argsString = _join.call(arguments);\n if (fabric.boundsOfCurveCache[argsString]) {\n return fabric.boundsOfCurveCache[argsString];\n }\n }\n\n var sqrt = Math.sqrt,\n min = Math.min, max = Math.max,\n abs = Math.abs, tvalues = [],\n bounds = [[], []],\n a, b, c, t, t1, t2, b2ac, sqrtb2ac;\n\n b = 6 * x0 - 12 * x1 + 6 * x2;\n a = -3 * x0 + 9 * x1 - 9 * x2 + 3 * x3;\n c = 3 * x1 - 3 * x0;\n\n for (var i = 0; i < 2; ++i) {\n if (i > 0) {\n b = 6 * y0 - 12 * y1 + 6 * y2;\n a = -3 * y0 + 9 * y1 - 9 * y2 + 3 * y3;\n c = 3 * y1 - 3 * y0;\n }\n\n if (abs(a) < 1e-12) {\n if (abs(b) < 1e-12) {\n continue;\n }\n t = -c / b;\n if (0 < t && t < 1) {\n tvalues.push(t);\n }\n continue;\n }\n b2ac = b * b - 4 * c * a;\n if (b2ac < 0) {\n continue;\n }\n sqrtb2ac = sqrt(b2ac);\n t1 = (-b + sqrtb2ac) / (2 * a);\n if (0 < t1 && t1 < 1) {\n tvalues.push(t1);\n }\n t2 = (-b - sqrtb2ac) / (2 * a);\n if (0 < t2 && t2 < 1) {\n tvalues.push(t2);\n }\n }\n\n var x, y, j = tvalues.length, jlen = j, mt;\n while (j--) {\n t = tvalues[j];\n mt = 1 - t;\n x = (mt * mt * mt * x0) + (3 * mt * mt * t * x1) + (3 * mt * t * t * x2) + (t * t * t * x3);\n bounds[0][j] = x;\n\n y = (mt * mt * mt * y0) + (3 * mt * mt * t * y1) + (3 * mt * t * t * y2) + (t * t * t * y3);\n bounds[1][j] = y;\n }\n\n bounds[0][jlen] = x0;\n bounds[1][jlen] = y0;\n bounds[0][jlen + 1] = x3;\n bounds[1][jlen + 1] = y3;\n var result = [\n {\n x: min.apply(null, bounds[0]),\n y: min.apply(null, bounds[1])\n },\n {\n x: max.apply(null, bounds[0]),\n y: max.apply(null, bounds[1])\n }\n ];\n if (fabric.cachesBoundsOfCurve) {\n fabric.boundsOfCurveCache[argsString] = result;\n }\n return result;\n }\n\n /**\n * Converts arc to a bunch of bezier curves\n * @param {Number} fx starting point x\n * @param {Number} fy starting point y\n * @param {Array} coords Arc command\n */\n function fromArcToBeziers(fx, fy, coords) {\n var rx = coords[1],\n ry = coords[2],\n rot = coords[3],\n large = coords[4],\n sweep = coords[5],\n tx = coords[6],\n ty = coords[7],\n segsNorm = arcToSegments(tx - fx, ty - fy, rx, ry, large, sweep, rot);\n\n for (var i = 0, len = segsNorm.length; i < len; i++) {\n segsNorm[i][1] += fx;\n segsNorm[i][2] += fy;\n segsNorm[i][3] += fx;\n segsNorm[i][4] += fy;\n segsNorm[i][5] += fx;\n segsNorm[i][6] += fy;\n }\n return segsNorm;\n };\n\n /**\n * This function take a parsed SVG path and make it simpler for fabricJS logic.\n * simplification consist of: only UPPERCASE absolute commands ( relative converted to absolute )\n * S converted in C, T converted in Q, A converted in C.\n * @param {Array} path the array of commands of a parsed svg path for fabric.Path\n * @return {Array} the simplified array of commands of a parsed svg path for fabric.Path\n */\n function makePathSimpler(path) {\n // x and y represent the last point of the path. the previous command point.\n // we add them to each relative command to make it an absolute comment.\n // we also swap the v V h H with L, because are easier to transform.\n var x = 0, y = 0, len = path.length,\n // x1 and y1 represent the last point of the subpath. the subpath is started with\n // m or M command. When a z or Z command is drawn, x and y need to be resetted to\n // the last x1 and y1.\n x1 = 0, y1 = 0, current, i, converted,\n // previous will host the letter of the previous command, to handle S and T.\n // controlX and controlY will host the previous reflected control point\n destinationPath = [], previous, controlX, controlY;\n for (i = 0; i < len; ++i) {\n converted = false;\n current = path[i].slice(0);\n switch (current[0]) { // first letter\n case 'l': // lineto, relative\n current[0] = 'L';\n current[1] += x;\n current[2] += y;\n // falls through\n case 'L':\n x = current[1];\n y = current[2];\n break;\n case 'h': // horizontal lineto, relative\n current[1] += x;\n // falls through\n case 'H':\n current[0] = 'L';\n current[2] = y;\n x = current[1];\n break;\n case 'v': // vertical lineto, relative\n current[1] += y;\n // falls through\n case 'V':\n current[0] = 'L';\n y = current[1];\n current[1] = x;\n current[2] = y;\n break;\n case 'm': // moveTo, relative\n current[0] = 'M';\n current[1] += x;\n current[2] += y;\n // falls through\n case 'M':\n x = current[1];\n y = current[2];\n x1 = current[1];\n y1 = current[2];\n break;\n case 'c': // bezierCurveTo, relative\n current[0] = 'C';\n current[1] += x;\n current[2] += y;\n current[3] += x;\n current[4] += y;\n current[5] += x;\n current[6] += y;\n // falls through\n case 'C':\n controlX = current[3];\n controlY = current[4];\n x = current[5];\n y = current[6];\n break;\n case 's': // shorthand cubic bezierCurveTo, relative\n current[0] = 'S';\n current[1] += x;\n current[2] += y;\n current[3] += x;\n current[4] += y;\n // falls through\n case 'S':\n // would be sScC but since we are swapping sSc for C, we check just that.\n if (previous === 'C') {\n // calculate reflection of previous control points\n controlX = 2 * x - controlX;\n controlY = 2 * y - controlY;\n }\n else {\n // If there is no previous command or if the previous command was not a C, c, S, or s,\n // the control point is coincident with the current point\n controlX = x;\n controlY = y;\n }\n x = current[3];\n y = current[4];\n current[0] = 'C';\n current[5] = current[3];\n current[6] = current[4];\n current[3] = current[1];\n current[4] = current[2];\n current[1] = controlX;\n current[2] = controlY;\n // current[3] and current[4] are NOW the second control point.\n // we keep it for the next reflection.\n controlX = current[3];\n controlY = current[4];\n break;\n case 'q': // quadraticCurveTo, relative\n current[0] = 'Q';\n current[1] += x;\n current[2] += y;\n current[3] += x;\n current[4] += y;\n // falls through\n case 'Q':\n controlX = current[1];\n controlY = current[2];\n x = current[3];\n y = current[4];\n break;\n case 't': // shorthand quadraticCurveTo, relative\n current[0] = 'T';\n current[1] += x;\n current[2] += y;\n // falls through\n case 'T':\n if (previous === 'Q') {\n // calculate reflection of previous control point\n controlX = 2 * x - controlX;\n controlY = 2 * y - controlY;\n }\n else {\n // If there is no previous command or if the previous command was not a Q, q, T or t,\n // assume the control point is coincident with the current point\n controlX = x;\n controlY = y;\n }\n current[0] = 'Q';\n x = current[1];\n y = current[2];\n current[1] = controlX;\n current[2] = controlY;\n current[3] = x;\n current[4] = y;\n break;\n case 'a':\n current[0] = 'A';\n current[6] += x;\n current[7] += y;\n // falls through\n case 'A':\n converted = true;\n destinationPath = destinationPath.concat(fromArcToBeziers(x, y, current));\n x = current[6];\n y = current[7];\n break;\n case 'z':\n case 'Z':\n x = x1;\n y = y1;\n break;\n default:\n }\n if (!converted) {\n destinationPath.push(current);\n }\n previous = current[0];\n }\n return destinationPath;\n };\n\n /**\n * Calc length from point x1,y1 to x2,y2\n * @param {Number} x1 starting point x\n * @param {Number} y1 starting point y\n * @param {Number} x2 starting point x\n * @param {Number} y2 starting point y\n * @return {Number} length of segment\n */\n function calcLineLength(x1, y1, x2, y2) {\n return Math.sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1));\n }\n\n // functions for the Cubic beizer\n // taken from: https://github.com/konvajs/konva/blob/7.0.5/src/shapes/Path.ts#L350\n function CB1(t) {\n return t * t * t;\n }\n function CB2(t) {\n return 3 * t * t * (1 - t);\n }\n function CB3(t) {\n return 3 * t * (1 - t) * (1 - t);\n }\n function CB4(t) {\n return (1 - t) * (1 - t) * (1 - t);\n }\n\n function getPointOnCubicBezierIterator(p1x, p1y, p2x, p2y, p3x, p3y, p4x, p4y) {\n return function(pct) {\n var c1 = CB1(pct), c2 = CB2(pct), c3 = CB3(pct), c4 = CB4(pct);\n return {\n x: p4x * c1 + p3x * c2 + p2x * c3 + p1x * c4,\n y: p4y * c1 + p3y * c2 + p2y * c3 + p1y * c4\n };\n };\n }\n\n function getTangentCubicIterator(p1x, p1y, p2x, p2y, p3x, p3y, p4x, p4y) {\n return function (pct) {\n var invT = 1 - pct,\n tangentX = (3 * invT * invT * (p2x - p1x)) + (6 * invT * pct * (p3x - p2x)) +\n (3 * pct * pct * (p4x - p3x)),\n tangentY = (3 * invT * invT * (p2y - p1y)) + (6 * invT * pct * (p3y - p2y)) +\n (3 * pct * pct * (p4y - p3y));\n return Math.atan2(tangentY, tangentX);\n };\n }\n\n function QB1(t) {\n return t * t;\n }\n\n function QB2(t) {\n return 2 * t * (1 - t);\n }\n\n function QB3(t) {\n return (1 - t) * (1 - t);\n }\n\n function getPointOnQuadraticBezierIterator(p1x, p1y, p2x, p2y, p3x, p3y) {\n return function(pct) {\n var c1 = QB1(pct), c2 = QB2(pct), c3 = QB3(pct);\n return {\n x: p3x * c1 + p2x * c2 + p1x * c3,\n y: p3y * c1 + p2y * c2 + p1y * c3\n };\n };\n }\n\n function getTangentQuadraticIterator(p1x, p1y, p2x, p2y, p3x, p3y) {\n return function (pct) {\n var invT = 1 - pct,\n tangentX = (2 * invT * (p2x - p1x)) + (2 * pct * (p3x - p2x)),\n tangentY = (2 * invT * (p2y - p1y)) + (2 * pct * (p3y - p2y));\n return Math.atan2(tangentY, tangentX);\n };\n }\n\n\n // this will run over a path segment ( a cubic or quadratic segment) and approximate it\n // with 100 segemnts. This will good enough to calculate the length of the curve\n function pathIterator(iterator, x1, y1) {\n var tempP = { x: x1, y: y1 }, p, tmpLen = 0, perc;\n for (perc = 1; perc <= 100; perc += 1) {\n p = iterator(perc / 100);\n tmpLen += calcLineLength(tempP.x, tempP.y, p.x, p.y);\n tempP = p;\n }\n return tmpLen;\n }\n\n /**\n * Given a pathInfo, and a distance in pixels, find the percentage from 0 to 1\n * that correspond to that pixels run over the path.\n * The percentage will be then used to find the correct point on the canvas for the path.\n * @param {Array} segInfo fabricJS collection of information on a parsed path\n * @param {Number} distance from starting point, in pixels.\n * @return {Object} info object with x and y ( the point on canvas ) and angle, the tangent on that point;\n */\n function findPercentageForDistance(segInfo, distance) {\n var perc = 0, tmpLen = 0, iterator = segInfo.iterator, tempP = { x: segInfo.x, y: segInfo.y },\n p, nextLen, nextStep = 0.01, angleFinder = segInfo.angleFinder, lastPerc;\n // nextStep > 0.0001 covers 0.00015625 that 1/64th of 1/100\n // the path\n while (tmpLen < distance && nextStep > 0.0001) {\n p = iterator(perc);\n lastPerc = perc;\n nextLen = calcLineLength(tempP.x, tempP.y, p.x, p.y);\n // compare tmpLen each cycle with distance, decide next perc to test.\n if ((nextLen + tmpLen) > distance) {\n // we discard this step and we make smaller steps.\n perc -= nextStep;\n nextStep /= 2;\n }\n else {\n tempP = p;\n perc += nextStep;\n tmpLen += nextLen;\n }\n }\n p.angle = angleFinder(lastPerc);\n return p;\n }\n\n /**\n * Run over a parsed and simplifed path and extrac some informations.\n * informations are length of each command and starting point\n * @param {Array} path fabricJS parsed path commands\n * @return {Array} path commands informations\n */\n function getPathSegmentsInfo(path) {\n var totalLength = 0, len = path.length, current,\n //x2 and y2 are the coords of segment start\n //x1 and y1 are the coords of the current point\n x1 = 0, y1 = 0, x2 = 0, y2 = 0, info = [], iterator, tempInfo, angleFinder;\n for (var i = 0; i < len; i++) {\n current = path[i];\n tempInfo = {\n x: x1,\n y: y1,\n command: current[0],\n };\n switch (current[0]) { //first letter\n case 'M':\n tempInfo.length = 0;\n x2 = x1 = current[1];\n y2 = y1 = current[2];\n break;\n case 'L':\n tempInfo.length = calcLineLength(x1, y1, current[1], current[2]);\n x1 = current[1];\n y1 = current[2];\n break;\n case 'C':\n iterator = getPointOnCubicBezierIterator(\n x1,\n y1,\n current[1],\n current[2],\n current[3],\n current[4],\n current[5],\n current[6]\n );\n angleFinder = getTangentCubicIterator(\n x1,\n y1,\n current[1],\n current[2],\n current[3],\n current[4],\n current[5],\n current[6]\n );\n tempInfo.iterator = iterator;\n tempInfo.angleFinder = angleFinder;\n tempInfo.length = pathIterator(iterator, x1, y1);\n x1 = current[5];\n y1 = current[6];\n break;\n case 'Q':\n iterator = getPointOnQuadraticBezierIterator(\n x1,\n y1,\n current[1],\n current[2],\n current[3],\n current[4]\n );\n angleFinder = getTangentQuadraticIterator(\n x1,\n y1,\n current[1],\n current[2],\n current[3],\n current[4]\n );\n tempInfo.iterator = iterator;\n tempInfo.angleFinder = angleFinder;\n tempInfo.length = pathIterator(iterator, x1, y1);\n x1 = current[3];\n y1 = current[4];\n break;\n case 'Z':\n case 'z':\n // we add those in order to ease calculations later\n tempInfo.destX = x2;\n tempInfo.destY = y2;\n tempInfo.length = calcLineLength(x1, y1, x2, y2);\n x1 = x2;\n y1 = y2;\n break;\n }\n totalLength += tempInfo.length;\n info.push(tempInfo);\n }\n info.push({ length: totalLength, x: x1, y: y1 });\n return info;\n }\n\n function getPointOnPath(path, distance, infos) {\n if (!infos) {\n infos = getPathSegmentsInfo(path);\n }\n var i = 0;\n while ((distance - infos[i].length > 0) && i < (infos.length - 2)) {\n distance -= infos[i].length;\n i++;\n }\n // var distance = infos[infos.length - 1] * perc;\n var segInfo = infos[i], segPercent = distance / segInfo.length,\n command = segInfo.command, segment = path[i], info;\n\n switch (command) {\n case 'M':\n return { x: segInfo.x, y: segInfo.y, angle: 0 };\n case 'Z':\n case 'z':\n info = new fabric.Point(segInfo.x, segInfo.y).lerp(\n new fabric.Point(segInfo.destX, segInfo.destY),\n segPercent\n );\n info.angle = Math.atan2(segInfo.destY - segInfo.y, segInfo.destX - segInfo.x);\n return info;\n case 'L':\n info = new fabric.Point(segInfo.x, segInfo.y).lerp(\n new fabric.Point(segment[1], segment[2]),\n segPercent\n );\n info.angle = Math.atan2(segment[2] - segInfo.y, segment[1] - segInfo.x);\n return info;\n case 'C':\n return findPercentageForDistance(segInfo, distance);\n case 'Q':\n return findPercentageForDistance(segInfo, distance);\n }\n }\n\n /**\n *\n * @param {string} pathString\n * @return {(string|number)[][]} An array of SVG path commands\n * @example Usage\n * parsePath('M 3 4 Q 3 5 2 1 4 0 Q 9 12 2 1 4 0') === [\n * ['M', 3, 4],\n * ['Q', 3, 5, 2, 1, 4, 0],\n * ['Q', 9, 12, 2, 1, 4, 0],\n * ];\n *\n */\n function parsePath(pathString) {\n var result = [],\n coords = [],\n currentPath,\n parsed,\n re = fabric.rePathCommand,\n rNumber = '[-+]?(?:\\\\d*\\\\.\\\\d+|\\\\d+\\\\.?)(?:[eE][-+]?\\\\d+)?\\\\s*',\n rNumberCommaWsp = '(' + rNumber + ')' + fabric.commaWsp,\n rFlagCommaWsp = '([01])' + fabric.commaWsp + '?',\n rArcSeq = rNumberCommaWsp + '?' + rNumberCommaWsp + '?' + rNumberCommaWsp + rFlagCommaWsp + rFlagCommaWsp +\n rNumberCommaWsp + '?(' + rNumber + ')',\n regArcArgumentSequence = new RegExp(rArcSeq, 'g'),\n match,\n coordsStr,\n // one of commands (m,M,l,L,q,Q,c,C,etc.) followed by non-command characters (i.e. command values)\n path;\n if (!pathString || !pathString.match) {\n return result;\n }\n path = pathString.match(/[mzlhvcsqta][^mzlhvcsqta]*/gi);\n\n for (var i = 0, coordsParsed, len = path.length; i < len; i++) {\n currentPath = path[i];\n\n coordsStr = currentPath.slice(1).trim();\n coords.length = 0;\n\n var command = currentPath.charAt(0);\n coordsParsed = [command];\n\n if (command.toLowerCase() === 'a') {\n // arcs have special flags that apparently don't require spaces so handle special\n for (var args; (args = regArcArgumentSequence.exec(coordsStr));) {\n for (var j = 1; j < args.length; j++) {\n coords.push(args[j]);\n }\n }\n }\n else {\n while ((match = re.exec(coordsStr))) {\n coords.push(match[0]);\n }\n }\n\n for (var j = 0, jlen = coords.length; j < jlen; j++) {\n parsed = parseFloat(coords[j]);\n if (!isNaN(parsed)) {\n coordsParsed.push(parsed);\n }\n }\n\n var commandLength = commandLengths[command.toLowerCase()],\n repeatedCommand = repeatedCommands[command] || command;\n\n if (coordsParsed.length - 1 > commandLength) {\n for (var k = 1, klen = coordsParsed.length; k < klen; k += commandLength) {\n result.push([command].concat(coordsParsed.slice(k, k + commandLength)));\n command = repeatedCommand;\n }\n }\n else {\n result.push(coordsParsed);\n }\n }\n\n return result;\n };\n\n /**\n *\n * Converts points to a smooth SVG path\n * @param {{ x: number,y: number }[]} points Array of points\n * @param {number} [correction] Apply a correction to the path (usually we use `width / 1000`). If value is undefined 0 is used as the correction value.\n * @return {(string|number)[][]} An array of SVG path commands\n */\n function getSmoothPathFromPoints(points, correction) {\n var path = [], i,\n p1 = new fabric.Point(points[0].x, points[0].y),\n p2 = new fabric.Point(points[1].x, points[1].y),\n len = points.length, multSignX = 1, multSignY = 0, manyPoints = len > 2;\n correction = correction || 0;\n\n if (manyPoints) {\n multSignX = points[2].x < p2.x ? -1 : points[2].x === p2.x ? 0 : 1;\n multSignY = points[2].y < p2.y ? -1 : points[2].y === p2.y ? 0 : 1;\n }\n path.push(['M', p1.x - multSignX * correction, p1.y - multSignY * correction]);\n for (i = 1; i < len; i++) {\n if (!p1.eq(p2)) {\n var midPoint = p1.midPointFrom(p2);\n // p1 is our bezier control point\n // midpoint is our endpoint\n // start point is p(i-1) value.\n path.push(['Q', p1.x, p1.y, midPoint.x, midPoint.y]);\n }\n p1 = points[i];\n if ((i + 1) < points.length) {\n p2 = points[i + 1];\n }\n }\n if (manyPoints) {\n multSignX = p1.x > points[i - 2].x ? 1 : p1.x === points[i - 2].x ? 0 : -1;\n multSignY = p1.y > points[i - 2].y ? 1 : p1.y === points[i - 2].y ? 0 : -1;\n }\n path.push(['L', p1.x + multSignX * correction, p1.y + multSignY * correction]);\n return path;\n }\n /**\n * Transform a path by transforming each segment.\n * it has to be a simplified path or it won't work.\n * WARNING: this depends from pathOffset for correct operation\n * @param {Array} path fabricJS parsed and simplified path commands\n * @param {Array} transform matrix that represent the transformation\n * @param {Object} [pathOffset] the fabric.Path pathOffset\n * @param {Number} pathOffset.x\n * @param {Number} pathOffset.y\n * @returns {Array} the transformed path\n */\n function transformPath(path, transform, pathOffset) {\n if (pathOffset) {\n transform = fabric.util.multiplyTransformMatrices(\n transform,\n [1, 0, 0, 1, -pathOffset.x, -pathOffset.y]\n );\n }\n return path.map(function(pathSegment) {\n var newSegment = pathSegment.slice(0), point = {};\n for (var i = 1; i < pathSegment.length - 1; i += 2) {\n point.x = pathSegment[i];\n point.y = pathSegment[i + 1];\n point = fabric.util.transformPoint(point, transform);\n newSegment[i] = point.x;\n newSegment[i + 1] = point.y;\n }\n return newSegment;\n });\n }\n\n /**\n * Join path commands to go back to svg format\n * @param {Array} pathData fabricJS parsed path commands\n * @return {String} joined path 'M 0 0 L 20 30'\n */\n fabric.util.joinPath = function(pathData) {\n return pathData.map(function (segment) { return segment.join(' '); }).join(' ');\n };\n fabric.util.parsePath = parsePath;\n fabric.util.makePathSimpler = makePathSimpler;\n fabric.util.getSmoothPathFromPoints = getSmoothPathFromPoints;\n fabric.util.getPathSegmentsInfo = getPathSegmentsInfo;\n fabric.util.getBoundsOfCurve = getBoundsOfCurve;\n fabric.util.getPointOnPath = getPointOnPath;\n fabric.util.transformPath = transformPath;\n})();\n\n\n(function() {\n\n var slice = Array.prototype.slice;\n\n /**\n * Invokes method on all items in a given array\n * @memberOf fabric.util.array\n * @param {Array} array Array to iterate over\n * @param {String} method Name of a method to invoke\n * @return {Array}\n */\n function invoke(array, method) {\n var args = slice.call(arguments, 2), result = [];\n for (var i = 0, len = array.length; i < len; i++) {\n result[i] = args.length ? array[i][method].apply(array[i], args) : array[i][method].call(array[i]);\n }\n return result;\n }\n\n /**\n * Finds maximum value in array (not necessarily \"first\" one)\n * @memberOf fabric.util.array\n * @param {Array} array Array to iterate over\n * @param {String} byProperty\n * @return {*}\n */\n function max(array, byProperty) {\n return find(array, byProperty, function(value1, value2) {\n return value1 >= value2;\n });\n }\n\n /**\n * Finds minimum value in array (not necessarily \"first\" one)\n * @memberOf fabric.util.array\n * @param {Array} array Array to iterate over\n * @param {String} byProperty\n * @return {*}\n */\n function min(array, byProperty) {\n return find(array, byProperty, function(value1, value2) {\n return value1 < value2;\n });\n }\n\n /**\n * @private\n */\n function fill(array, value) {\n var k = array.length;\n while (k--) {\n array[k] = value;\n }\n return array;\n }\n\n /**\n * @private\n */\n function find(array, byProperty, condition) {\n if (!array || array.length === 0) {\n return;\n }\n\n var i = array.length - 1,\n result = byProperty ? array[i][byProperty] : array[i];\n if (byProperty) {\n while (i--) {\n if (condition(array[i][byProperty], result)) {\n result = array[i][byProperty];\n }\n }\n }\n else {\n while (i--) {\n if (condition(array[i], result)) {\n result = array[i];\n }\n }\n }\n return result;\n }\n\n /**\n * @namespace fabric.util.array\n */\n fabric.util.array = {\n fill: fill,\n invoke: invoke,\n min: min,\n max: max\n };\n\n})();\n\n\n(function() {\n /**\n * Copies all enumerable properties of one js object to another\n * this does not and cannot compete with generic utils.\n * Does not clone or extend fabric.Object subclasses.\n * This is mostly for internal use and has extra handling for fabricJS objects\n * it skips the canvas and group properties in deep cloning.\n * @memberOf fabric.util.object\n * @param {Object} destination Where to copy to\n * @param {Object} source Where to copy from\n * @param {Boolean} [deep] Whether to extend nested objects\n * @return {Object}\n */\n\n function extend(destination, source, deep) {\n // JScript DontEnum bug is not taken care of\n // the deep clone is for internal use, is not meant to avoid\n // javascript traps or cloning html element or self referenced objects.\n if (deep) {\n if (!fabric.isLikelyNode && source instanceof Element) {\n // avoid cloning deep images, canvases,\n destination = source;\n }\n else if (source instanceof Array) {\n destination = [];\n for (var i = 0, len = source.length; i < len; i++) {\n destination[i] = extend({ }, source[i], deep);\n }\n }\n else if (source && typeof source === 'object') {\n for (var property in source) {\n if (property === 'canvas' || property === 'group') {\n // we do not want to clone this props at all.\n // we want to keep the keys in the copy\n destination[property] = null;\n }\n else if (source.hasOwnProperty(property)) {\n destination[property] = extend({ }, source[property], deep);\n }\n }\n }\n else {\n // this sounds odd for an extend but is ok for recursive use\n destination = source;\n }\n }\n else {\n for (var property in source) {\n destination[property] = source[property];\n }\n }\n return destination;\n }\n\n /**\n * Creates an empty object and copies all enumerable properties of another object to it\n * This method is mostly for internal use, and not intended for duplicating shapes in canvas. \n * @memberOf fabric.util.object\n * @param {Object} object Object to clone\n * @param {Boolean} [deep] Whether to clone nested objects\n * @return {Object}\n */\n\n //TODO: this function return an empty object if you try to clone null\n function clone(object, deep) {\n return extend({ }, object, deep);\n }\n\n /** @namespace fabric.util.object */\n fabric.util.object = {\n extend: extend,\n clone: clone\n };\n fabric.util.object.extend(fabric.util, fabric.Observable);\n})();\n\n\n(function() {\n\n /**\n * Camelizes a string\n * @memberOf fabric.util.string\n * @param {String} string String to camelize\n * @return {String} Camelized version of a string\n */\n function camelize(string) {\n return string.replace(/-+(.)?/g, function(match, character) {\n return character ? character.toUpperCase() : '';\n });\n }\n\n /**\n * Capitalizes a string\n * @memberOf fabric.util.string\n * @param {String} string String to capitalize\n * @param {Boolean} [firstLetterOnly] If true only first letter is capitalized\n * and other letters stay untouched, if false first letter is capitalized\n * and other letters are converted to lowercase.\n * @return {String} Capitalized version of a string\n */\n function capitalize(string, firstLetterOnly) {\n return string.charAt(0).toUpperCase() +\n (firstLetterOnly ? string.slice(1) : string.slice(1).toLowerCase());\n }\n\n /**\n * Escapes XML in a string\n * @memberOf fabric.util.string\n * @param {String} string String to escape\n * @return {String} Escaped version of a string\n */\n function escapeXml(string) {\n return string.replace(/&/g, '&')\n .replace(/\"/g, '"')\n .replace(/'/g, ''')\n .replace(//g, '>');\n }\n\n /**\n * Divide a string in the user perceived single units\n * @memberOf fabric.util.string\n * @param {String} textstring String to escape\n * @return {Array} array containing the graphemes\n */\n function graphemeSplit(textstring) {\n var i = 0, chr, graphemes = [];\n for (i = 0, chr; i < textstring.length; i++) {\n if ((chr = getWholeChar(textstring, i)) === false) {\n continue;\n }\n graphemes.push(chr);\n }\n return graphemes;\n }\n\n // taken from mdn in the charAt doc page.\n function getWholeChar(str, i) {\n var code = str.charCodeAt(i);\n\n if (isNaN(code)) {\n return ''; // Position not found\n }\n if (code < 0xD800 || code > 0xDFFF) {\n return str.charAt(i);\n }\n\n // High surrogate (could change last hex to 0xDB7F to treat high private\n // surrogates as single characters)\n if (0xD800 <= code && code <= 0xDBFF) {\n if (str.length <= (i + 1)) {\n throw 'High surrogate without following low surrogate';\n }\n var next = str.charCodeAt(i + 1);\n if (0xDC00 > next || next > 0xDFFF) {\n throw 'High surrogate without following low surrogate';\n }\n return str.charAt(i) + str.charAt(i + 1);\n }\n // Low surrogate (0xDC00 <= code && code <= 0xDFFF)\n if (i === 0) {\n throw 'Low surrogate without preceding high surrogate';\n }\n var prev = str.charCodeAt(i - 1);\n\n // (could change last hex to 0xDB7F to treat high private\n // surrogates as single characters)\n if (0xD800 > prev || prev > 0xDBFF) {\n throw 'Low surrogate without preceding high surrogate';\n }\n // We can pass over low surrogates now as the second component\n // in a pair which we have already processed\n return false;\n }\n\n\n /**\n * String utilities\n * @namespace fabric.util.string\n */\n fabric.util.string = {\n camelize: camelize,\n capitalize: capitalize,\n escapeXml: escapeXml,\n graphemeSplit: graphemeSplit\n };\n})();\n\n\n(function() {\n\n var slice = Array.prototype.slice, emptyFunction = function() { },\n\n IS_DONTENUM_BUGGY = (function() {\n for (var p in { toString: 1 }) {\n if (p === 'toString') {\n return false;\n }\n }\n return true;\n })(),\n\n /** @ignore */\n addMethods = function(klass, source, parent) {\n for (var property in source) {\n\n if (property in klass.prototype &&\n typeof klass.prototype[property] === 'function' &&\n (source[property] + '').indexOf('callSuper') > -1) {\n\n klass.prototype[property] = (function(property) {\n return function() {\n\n var superclass = this.constructor.superclass;\n this.constructor.superclass = parent;\n var returnValue = source[property].apply(this, arguments);\n this.constructor.superclass = superclass;\n\n if (property !== 'initialize') {\n return returnValue;\n }\n };\n })(property);\n }\n else {\n klass.prototype[property] = source[property];\n }\n\n if (IS_DONTENUM_BUGGY) {\n if (source.toString !== Object.prototype.toString) {\n klass.prototype.toString = source.toString;\n }\n if (source.valueOf !== Object.prototype.valueOf) {\n klass.prototype.valueOf = source.valueOf;\n }\n }\n }\n };\n\n function Subclass() { }\n\n function callSuper(methodName) {\n var parentMethod = null,\n _this = this;\n\n // climb prototype chain to find method not equal to callee's method\n while (_this.constructor.superclass) {\n var superClassMethod = _this.constructor.superclass.prototype[methodName];\n if (_this[methodName] !== superClassMethod) {\n parentMethod = superClassMethod;\n break;\n }\n // eslint-disable-next-line\n _this = _this.constructor.superclass.prototype;\n }\n\n if (!parentMethod) {\n return console.log('tried to callSuper ' + methodName + ', method not found in prototype chain', this);\n }\n\n return (arguments.length > 1)\n ? parentMethod.apply(this, slice.call(arguments, 1))\n : parentMethod.call(this);\n }\n\n /**\n * Helper for creation of \"classes\".\n * @memberOf fabric.util\n * @param {Function} [parent] optional \"Class\" to inherit from\n * @param {Object} [properties] Properties shared by all instances of this class\n * (be careful modifying objects defined here as this would affect all instances)\n */\n function createClass() {\n var parent = null,\n properties = slice.call(arguments, 0);\n\n if (typeof properties[0] === 'function') {\n parent = properties.shift();\n }\n function klass() {\n this.initialize.apply(this, arguments);\n }\n\n klass.superclass = parent;\n klass.subclasses = [];\n\n if (parent) {\n Subclass.prototype = parent.prototype;\n klass.prototype = new Subclass();\n parent.subclasses.push(klass);\n }\n for (var i = 0, length = properties.length; i < length; i++) {\n addMethods(klass, properties[i], parent);\n }\n if (!klass.prototype.initialize) {\n klass.prototype.initialize = emptyFunction;\n }\n klass.prototype.constructor = klass;\n klass.prototype.callSuper = callSuper;\n return klass;\n }\n\n fabric.util.createClass = createClass;\n})();\n\n\n(function () {\n // since ie11 can use addEventListener but they do not support options, i need to check\n var couldUseAttachEvent = !!fabric.document.createElement('div').attachEvent,\n touchEvents = ['touchstart', 'touchmove', 'touchend'];\n /**\n * Adds an event listener to an element\n * @function\n * @memberOf fabric.util\n * @param {HTMLElement} element\n * @param {String} eventName\n * @param {Function} handler\n */\n fabric.util.addListener = function(element, eventName, handler, options) {\n element && element.addEventListener(eventName, handler, couldUseAttachEvent ? false : options);\n };\n\n /**\n * Removes an event listener from an element\n * @function\n * @memberOf fabric.util\n * @param {HTMLElement} element\n * @param {String} eventName\n * @param {Function} handler\n */\n fabric.util.removeListener = function(element, eventName, handler, options) {\n element && element.removeEventListener(eventName, handler, couldUseAttachEvent ? false : options);\n };\n\n function getTouchInfo(event) {\n var touchProp = event.changedTouches;\n if (touchProp && touchProp[0]) {\n return touchProp[0];\n }\n return event;\n }\n\n fabric.util.getPointer = function(event) {\n var element = event.target,\n scroll = fabric.util.getScrollLeftTop(element),\n _evt = getTouchInfo(event);\n return {\n x: _evt.clientX + scroll.left,\n y: _evt.clientY + scroll.top\n };\n };\n\n fabric.util.isTouchEvent = function(event) {\n return touchEvents.indexOf(event.type) > -1 || event.pointerType === 'touch';\n };\n})();\n\n\n(function () {\n\n /**\n * Cross-browser wrapper for setting element's style\n * @memberOf fabric.util\n * @param {HTMLElement} element\n * @param {Object} styles\n * @return {HTMLElement} Element that was passed as a first argument\n */\n function setStyle(element, styles) {\n var elementStyle = element.style;\n if (!elementStyle) {\n return element;\n }\n if (typeof styles === 'string') {\n element.style.cssText += ';' + styles;\n return styles.indexOf('opacity') > -1\n ? setOpacity(element, styles.match(/opacity:\\s*(\\d?\\.?\\d*)/)[1])\n : element;\n }\n for (var property in styles) {\n if (property === 'opacity') {\n setOpacity(element, styles[property]);\n }\n else {\n var normalizedProperty = (property === 'float' || property === 'cssFloat')\n ? (typeof elementStyle.styleFloat === 'undefined' ? 'cssFloat' : 'styleFloat')\n : property;\n elementStyle.setProperty(normalizedProperty, styles[property]);\n }\n }\n return element;\n }\n\n var parseEl = fabric.document.createElement('div'),\n supportsOpacity = typeof parseEl.style.opacity === 'string',\n supportsFilters = typeof parseEl.style.filter === 'string',\n reOpacity = /alpha\\s*\\(\\s*opacity\\s*=\\s*([^\\)]+)\\)/,\n\n /** @ignore */\n setOpacity = function (element) { return element; };\n\n if (supportsOpacity) {\n /** @ignore */\n setOpacity = function(element, value) {\n element.style.opacity = value;\n return element;\n };\n }\n else if (supportsFilters) {\n /** @ignore */\n setOpacity = function(element, value) {\n var es = element.style;\n if (element.currentStyle && !element.currentStyle.hasLayout) {\n es.zoom = 1;\n }\n if (reOpacity.test(es.filter)) {\n value = value >= 0.9999 ? '' : ('alpha(opacity=' + (value * 100) + ')');\n es.filter = es.filter.replace(reOpacity, value);\n }\n else {\n es.filter += ' alpha(opacity=' + (value * 100) + ')';\n }\n return element;\n };\n }\n\n fabric.util.setStyle = setStyle;\n\n})();\n\n\n(function() {\n\n var _slice = Array.prototype.slice;\n\n /**\n * Takes id and returns an element with that id (if one exists in a document)\n * @memberOf fabric.util\n * @param {String|HTMLElement} id\n * @return {HTMLElement|null}\n */\n function getById(id) {\n return typeof id === 'string' ? fabric.document.getElementById(id) : id;\n }\n\n var sliceCanConvertNodelists,\n /**\n * Converts an array-like object (e.g. arguments or NodeList) to an array\n * @memberOf fabric.util\n * @param {Object} arrayLike\n * @return {Array}\n */\n toArray = function(arrayLike) {\n return _slice.call(arrayLike, 0);\n };\n\n try {\n sliceCanConvertNodelists = toArray(fabric.document.childNodes) instanceof Array;\n }\n catch (err) { }\n\n if (!sliceCanConvertNodelists) {\n toArray = function(arrayLike) {\n var arr = new Array(arrayLike.length), i = arrayLike.length;\n while (i--) {\n arr[i] = arrayLike[i];\n }\n return arr;\n };\n }\n\n /**\n * Creates specified element with specified attributes\n * @memberOf fabric.util\n * @param {String} tagName Type of an element to create\n * @param {Object} [attributes] Attributes to set on an element\n * @return {HTMLElement} Newly created element\n */\n function makeElement(tagName, attributes) {\n var el = fabric.document.createElement(tagName);\n for (var prop in attributes) {\n if (prop === 'class') {\n el.className = attributes[prop];\n }\n else if (prop === 'for') {\n el.htmlFor = attributes[prop];\n }\n else {\n el.setAttribute(prop, attributes[prop]);\n }\n }\n return el;\n }\n\n /**\n * Adds class to an element\n * @memberOf fabric.util\n * @param {HTMLElement} element Element to add class to\n * @param {String} className Class to add to an element\n */\n function addClass(element, className) {\n if (element && (' ' + element.className + ' ').indexOf(' ' + className + ' ') === -1) {\n element.className += (element.className ? ' ' : '') + className;\n }\n }\n\n /**\n * Wraps element with another element\n * @memberOf fabric.util\n * @param {HTMLElement} element Element to wrap\n * @param {HTMLElement|String} wrapper Element to wrap with\n * @param {Object} [attributes] Attributes to set on a wrapper\n * @return {HTMLElement} wrapper\n */\n function wrapElement(element, wrapper, attributes) {\n if (typeof wrapper === 'string') {\n wrapper = makeElement(wrapper, attributes);\n }\n if (element.parentNode) {\n element.parentNode.replaceChild(wrapper, element);\n }\n wrapper.appendChild(element);\n return wrapper;\n }\n\n /**\n * Returns element scroll offsets\n * @memberOf fabric.util\n * @param {HTMLElement} element Element to operate on\n * @return {Object} Object with left/top values\n */\n function getScrollLeftTop(element) {\n\n var left = 0,\n top = 0,\n docElement = fabric.document.documentElement,\n body = fabric.document.body || {\n scrollLeft: 0, scrollTop: 0\n };\n\n // While loop checks (and then sets element to) .parentNode OR .host\n // to account for ShadowDOM. We still want to traverse up out of ShadowDOM,\n // but the .parentNode of a root ShadowDOM node will always be null, instead\n // it should be accessed through .host. See http://stackoverflow.com/a/24765528/4383938\n while (element && (element.parentNode || element.host)) {\n\n // Set element to element parent, or 'host' in case of ShadowDOM\n element = element.parentNode || element.host;\n\n if (element === fabric.document) {\n left = body.scrollLeft || docElement.scrollLeft || 0;\n top = body.scrollTop || docElement.scrollTop || 0;\n }\n else {\n left += element.scrollLeft || 0;\n top += element.scrollTop || 0;\n }\n\n if (element.nodeType === 1 && element.style.position === 'fixed') {\n break;\n }\n }\n\n return { left: left, top: top };\n }\n\n /**\n * Returns offset for a given element\n * @function\n * @memberOf fabric.util\n * @param {HTMLElement} element Element to get offset for\n * @return {Object} Object with \"left\" and \"top\" properties\n */\n function getElementOffset(element) {\n var docElem,\n doc = element && element.ownerDocument,\n box = { left: 0, top: 0 },\n offset = { left: 0, top: 0 },\n scrollLeftTop,\n offsetAttributes = {\n borderLeftWidth: 'left',\n borderTopWidth: 'top',\n paddingLeft: 'left',\n paddingTop: 'top'\n };\n\n if (!doc) {\n return offset;\n }\n\n for (var attr in offsetAttributes) {\n offset[offsetAttributes[attr]] += parseInt(getElementStyle(element, attr), 10) || 0;\n }\n\n docElem = doc.documentElement;\n if ( typeof element.getBoundingClientRect !== 'undefined' ) {\n box = element.getBoundingClientRect();\n }\n\n scrollLeftTop = getScrollLeftTop(element);\n\n return {\n left: box.left + scrollLeftTop.left - (docElem.clientLeft || 0) + offset.left,\n top: box.top + scrollLeftTop.top - (docElem.clientTop || 0) + offset.top\n };\n }\n\n /**\n * Returns style attribute value of a given element\n * @memberOf fabric.util\n * @param {HTMLElement} element Element to get style attribute for\n * @param {String} attr Style attribute to get for element\n * @return {String} Style attribute value of the given element.\n */\n var getElementStyle;\n if (fabric.document.defaultView && fabric.document.defaultView.getComputedStyle) {\n getElementStyle = function(element, attr) {\n var style = fabric.document.defaultView.getComputedStyle(element, null);\n return style ? style[attr] : undefined;\n };\n }\n else {\n getElementStyle = function(element, attr) {\n var value = element.style[attr];\n if (!value && element.currentStyle) {\n value = element.currentStyle[attr];\n }\n return value;\n };\n }\n\n (function () {\n var style = fabric.document.documentElement.style,\n selectProp = 'userSelect' in style\n ? 'userSelect'\n : 'MozUserSelect' in style\n ? 'MozUserSelect'\n : 'WebkitUserSelect' in style\n ? 'WebkitUserSelect'\n : 'KhtmlUserSelect' in style\n ? 'KhtmlUserSelect'\n : '';\n\n /**\n * Makes element unselectable\n * @memberOf fabric.util\n * @param {HTMLElement} element Element to make unselectable\n * @return {HTMLElement} Element that was passed in\n */\n function makeElementUnselectable(element) {\n if (typeof element.onselectstart !== 'undefined') {\n element.onselectstart = fabric.util.falseFunction;\n }\n if (selectProp) {\n element.style[selectProp] = 'none';\n }\n else if (typeof element.unselectable === 'string') {\n element.unselectable = 'on';\n }\n return element;\n }\n\n /**\n * Makes element selectable\n * @memberOf fabric.util\n * @param {HTMLElement} element Element to make selectable\n * @return {HTMLElement} Element that was passed in\n */\n function makeElementSelectable(element) {\n if (typeof element.onselectstart !== 'undefined') {\n element.onselectstart = null;\n }\n if (selectProp) {\n element.style[selectProp] = '';\n }\n else if (typeof element.unselectable === 'string') {\n element.unselectable = '';\n }\n return element;\n }\n\n fabric.util.makeElementUnselectable = makeElementUnselectable;\n fabric.util.makeElementSelectable = makeElementSelectable;\n })();\n\n function getNodeCanvas(element) {\n var impl = fabric.jsdomImplForWrapper(element);\n return impl._canvas || impl._image;\n };\n\n function cleanUpJsdomNode(element) {\n if (!fabric.isLikelyNode) {\n return;\n }\n var impl = fabric.jsdomImplForWrapper(element);\n if (impl) {\n impl._image = null;\n impl._canvas = null;\n // unsure if necessary\n impl._currentSrc = null;\n impl._attributes = null;\n impl._classList = null;\n }\n }\n\n function setImageSmoothing(ctx, value) {\n ctx.imageSmoothingEnabled = ctx.imageSmoothingEnabled || ctx.webkitImageSmoothingEnabled\n || ctx.mozImageSmoothingEnabled || ctx.msImageSmoothingEnabled || ctx.oImageSmoothingEnabled;\n ctx.imageSmoothingEnabled = value;\n }\n\n /**\n * setImageSmoothing sets the context imageSmoothingEnabled property.\n * Used by canvas and by ImageObject.\n * @memberOf fabric.util\n * @since 4.0.0\n * @param {HTMLRenderingContext2D} ctx to set on\n * @param {Boolean} value true or false\n */\n fabric.util.setImageSmoothing = setImageSmoothing;\n fabric.util.getById = getById;\n fabric.util.toArray = toArray;\n fabric.util.addClass = addClass;\n fabric.util.makeElement = makeElement;\n fabric.util.wrapElement = wrapElement;\n fabric.util.getScrollLeftTop = getScrollLeftTop;\n fabric.util.getElementOffset = getElementOffset;\n fabric.util.getNodeCanvas = getNodeCanvas;\n fabric.util.cleanUpJsdomNode = cleanUpJsdomNode;\n\n})();\n\n\n(function() {\n\n function addParamToUrl(url, param) {\n return url + (/\\?/.test(url) ? '&' : '?') + param;\n }\n\n function emptyFn() { }\n\n /**\n * Cross-browser abstraction for sending XMLHttpRequest\n * @memberOf fabric.util\n * @param {String} url URL to send XMLHttpRequest to\n * @param {Object} [options] Options object\n * @param {String} [options.method=\"GET\"]\n * @param {String} [options.parameters] parameters to append to url in GET or in body\n * @param {String} [options.body] body to send with POST or PUT request\n * @param {Function} options.onComplete Callback to invoke when request is completed\n * @return {XMLHttpRequest} request\n */\n function request(url, options) {\n options || (options = { });\n\n var method = options.method ? options.method.toUpperCase() : 'GET',\n onComplete = options.onComplete || function() { },\n xhr = new fabric.window.XMLHttpRequest(),\n body = options.body || options.parameters;\n\n /** @ignore */\n xhr.onreadystatechange = function() {\n if (xhr.readyState === 4) {\n onComplete(xhr);\n xhr.onreadystatechange = emptyFn;\n }\n };\n\n if (method === 'GET') {\n body = null;\n if (typeof options.parameters === 'string') {\n url = addParamToUrl(url, options.parameters);\n }\n }\n\n xhr.open(method, url, true);\n\n if (method === 'POST' || method === 'PUT') {\n xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');\n }\n\n xhr.send(body);\n return xhr;\n }\n\n fabric.util.request = request;\n})();\n\n\n/**\n * Wrapper around `console.log` (when available)\n * @param {*} [values] Values to log\n */\nfabric.log = console.log;\n\n/**\n * Wrapper around `console.warn` (when available)\n * @param {*} [values] Values to log as a warning\n */\nfabric.warn = console.warn;\n\n\n(function () {\n\n var extend = fabric.util.object.extend,\n clone = fabric.util.object.clone;\n\n /**\n * @typedef {Object} AnimationOptions\n * Animation of a value or list of values.\n * When using lists, think of something like this:\n * fabric.util.animate({\n * startValue: [1, 2, 3],\n * endValue: [2, 4, 6],\n * onChange: function([a, b, c]) {\n * canvas.zoomToPoint({x: b, y: c}, a)\n * canvas.renderAll()\n * }\n * });\n * @example\n * @property {Function} [onChange] Callback; invoked on every value change\n * @property {Function} [onComplete] Callback; invoked when value change is completed\n * @example\n * // Note: startValue, endValue, and byValue must match the type\n * var animationOptions = { startValue: 0, endValue: 1, byValue: 0.25 }\n * var animationOptions = { startValue: [0, 1], endValue: [1, 2], byValue: [0.25, 0.25] }\n * @property {number | number[]} [startValue=0] Starting value\n * @property {number | number[]} [endValue=100] Ending value\n * @property {number | number[]} [byValue=100] Value to modify the property by\n * @property {Function} [easing] Easing function\n * @property {Number} [duration=500] Duration of change (in ms)\n * @property {Function} [abort] Additional function with logic. If returns true, animation aborts.\n *\n * @typedef {() => void} CancelFunction\n *\n * @typedef {Object} AnimationCurrentState\n * @property {number | number[]} currentValue value in range [`startValue`, `endValue`]\n * @property {number} completionRate value in range [0, 1]\n * @property {number} durationRate value in range [0, 1]\n *\n * @typedef {(AnimationOptions & AnimationCurrentState & { cancel: CancelFunction }} AnimationContext\n */\n\n /**\n * Array holding all running animations\n * @memberof fabric\n * @type {AnimationContext[]}\n */\n var RUNNING_ANIMATIONS = [];\n fabric.util.object.extend(RUNNING_ANIMATIONS, {\n\n /**\n * cancel all running animations at the next requestAnimFrame\n * @returns {AnimationContext[]}\n */\n cancelAll: function () {\n var animations = this.splice(0);\n animations.forEach(function (animation) {\n animation.cancel();\n });\n return animations;\n },\n\n /**\n * cancel all running animations attached to canvas at the next requestAnimFrame\n * @param {fabric.Canvas} canvas\n * @returns {AnimationContext[]}\n */\n cancelByCanvas: function (canvas) {\n if (!canvas) {\n return [];\n }\n var cancelled = this.filter(function (animation) {\n return typeof animation.target === 'object' && animation.target.canvas === canvas;\n });\n cancelled.forEach(function (animation) {\n animation.cancel();\n });\n return cancelled;\n },\n\n /**\n * cancel all running animations for target at the next requestAnimFrame\n * @param {*} target\n * @returns {AnimationContext[]}\n */\n cancelByTarget: function (target) {\n var cancelled = this.findAnimationsByTarget(target);\n cancelled.forEach(function (animation) {\n animation.cancel();\n });\n return cancelled;\n },\n\n /**\n *\n * @param {CancelFunction} cancelFunc the function returned by animate\n * @returns {number}\n */\n findAnimationIndex: function (cancelFunc) {\n return this.indexOf(this.findAnimation(cancelFunc));\n },\n\n /**\n *\n * @param {CancelFunction} cancelFunc the function returned by animate\n * @returns {AnimationContext | undefined} animation's options object\n */\n findAnimation: function (cancelFunc) {\n return this.find(function (animation) {\n return animation.cancel === cancelFunc;\n });\n },\n\n /**\n *\n * @param {*} target the object that is assigned to the target property of the animation context\n * @returns {AnimationContext[]} array of animation options object associated with target\n */\n findAnimationsByTarget: function (target) {\n if (!target) {\n return [];\n }\n return this.filter(function (animation) {\n return animation.target === target;\n });\n }\n });\n\n function noop() {\n return false;\n }\n\n function defaultEasing(t, b, c, d) {\n return -c * Math.cos(t / d * (Math.PI / 2)) + c + b;\n }\n\n /**\n * Changes value from one to another within certain period of time, invoking callbacks as value is being changed.\n * @memberOf fabric.util\n * @param {AnimationOptions} [options] Animation options\n * @example\n * // Note: startValue, endValue, and byValue must match the type\n * fabric.util.animate({ startValue: 0, endValue: 1, byValue: 0.25 })\n * fabric.util.animate({ startValue: [0, 1], endValue: [1, 2], byValue: [0.25, 0.25] })\n * @returns {CancelFunction} cancel function\n */\n function animate(options) {\n options || (options = {});\n var cancel = false,\n context,\n removeFromRegistry = function () {\n var index = fabric.runningAnimations.indexOf(context);\n return index > -1 && fabric.runningAnimations.splice(index, 1)[0];\n };\n\n context = extend(clone(options), {\n cancel: function () {\n cancel = true;\n return removeFromRegistry();\n },\n currentValue: 'startValue' in options ? options.startValue : 0,\n completionRate: 0,\n durationRate: 0\n });\n fabric.runningAnimations.push(context);\n\n requestAnimFrame(function(timestamp) {\n var start = timestamp || +new Date(),\n duration = options.duration || 500,\n finish = start + duration, time,\n onChange = options.onChange || noop,\n abort = options.abort || noop,\n onComplete = options.onComplete || noop,\n easing = options.easing || defaultEasing,\n isMany = 'startValue' in options ? options.startValue.length > 0 : false,\n startValue = 'startValue' in options ? options.startValue : 0,\n endValue = 'endValue' in options ? options.endValue : 100,\n byValue = options.byValue || (isMany ? startValue.map(function(value, i) {\n return endValue[i] - startValue[i];\n }) : endValue - startValue);\n\n options.onStart && options.onStart();\n\n (function tick(ticktime) {\n time = ticktime || +new Date();\n var currentTime = time > finish ? duration : (time - start),\n timePerc = currentTime / duration,\n current = isMany ? startValue.map(function(_value, i) {\n return easing(currentTime, startValue[i], byValue[i], duration);\n }) : easing(currentTime, startValue, byValue, duration),\n valuePerc = isMany ? Math.abs((current[0] - startValue[0]) / byValue[0])\n : Math.abs((current - startValue) / byValue);\n // update context\n context.currentValue = isMany ? current.slice() : current;\n context.completionRate = valuePerc;\n context.durationRate = timePerc;\n if (cancel) {\n return;\n }\n if (abort(current, valuePerc, timePerc)) {\n removeFromRegistry();\n return;\n }\n if (time > finish) {\n // update context\n context.currentValue = isMany ? endValue.slice() : endValue;\n context.completionRate = 1;\n context.durationRate = 1;\n // execute callbacks\n onChange(isMany ? endValue.slice() : endValue, 1, 1);\n onComplete(endValue, 1, 1);\n removeFromRegistry();\n return;\n }\n else {\n onChange(current, valuePerc, timePerc);\n requestAnimFrame(tick);\n }\n })(start);\n });\n\n return context.cancel;\n }\n\n var _requestAnimFrame = fabric.window.requestAnimationFrame ||\n fabric.window.webkitRequestAnimationFrame ||\n fabric.window.mozRequestAnimationFrame ||\n fabric.window.oRequestAnimationFrame ||\n fabric.window.msRequestAnimationFrame ||\n function(callback) {\n return fabric.window.setTimeout(callback, 1000 / 60);\n };\n\n var _cancelAnimFrame = fabric.window.cancelAnimationFrame || fabric.window.clearTimeout;\n\n /**\n * requestAnimationFrame polyfill based on http://paulirish.com/2011/requestanimationframe-for-smart-animating/\n * In order to get a precise start time, `requestAnimFrame` should be called as an entry into the method\n * @memberOf fabric.util\n * @param {Function} callback Callback to invoke\n * @param {DOMElement} element optional Element to associate with animation\n */\n function requestAnimFrame() {\n return _requestAnimFrame.apply(fabric.window, arguments);\n }\n\n function cancelAnimFrame() {\n return _cancelAnimFrame.apply(fabric.window, arguments);\n }\n\n fabric.util.animate = animate;\n fabric.util.requestAnimFrame = requestAnimFrame;\n fabric.util.cancelAnimFrame = cancelAnimFrame;\n fabric.runningAnimations = RUNNING_ANIMATIONS;\n})();\n\n\n(function() {\n // Calculate an in-between color. Returns a \"rgba()\" string.\n // Credit: Edwin Martin \n // http://www.bitstorm.org/jquery/color-animation/jquery.animate-colors.js\n function calculateColor(begin, end, pos) {\n var color = 'rgba('\n + parseInt((begin[0] + pos * (end[0] - begin[0])), 10) + ','\n + parseInt((begin[1] + pos * (end[1] - begin[1])), 10) + ','\n + parseInt((begin[2] + pos * (end[2] - begin[2])), 10);\n\n color += ',' + (begin && end ? parseFloat(begin[3] + pos * (end[3] - begin[3])) : 1);\n color += ')';\n return color;\n }\n\n /**\n * Changes the color from one to another within certain period of time, invoking callbacks as value is being changed.\n * @memberOf fabric.util\n * @param {String} fromColor The starting color in hex or rgb(a) format.\n * @param {String} toColor The starting color in hex or rgb(a) format.\n * @param {Number} [duration] Duration of change (in ms).\n * @param {Object} [options] Animation options\n * @param {Function} [options.onChange] Callback; invoked on every value change\n * @param {Function} [options.onComplete] Callback; invoked when value change is completed\n * @param {Function} [options.colorEasing] Easing function. Note that this function only take two arguments (currentTime, duration). Thus the regular animation easing functions cannot be used.\n * @param {Function} [options.abort] Additional function with logic. If returns true, onComplete is called.\n * @returns {Function} abort function\n */\n function animateColor(fromColor, toColor, duration, options) {\n var startColor = new fabric.Color(fromColor).getSource(),\n endColor = new fabric.Color(toColor).getSource(),\n originalOnComplete = options.onComplete,\n originalOnChange = options.onChange;\n options = options || {};\n\n return fabric.util.animate(fabric.util.object.extend(options, {\n duration: duration || 500,\n startValue: startColor,\n endValue: endColor,\n byValue: endColor,\n easing: function (currentTime, startValue, byValue, duration) {\n var posValue = options.colorEasing\n ? options.colorEasing(currentTime, duration)\n : 1 - Math.cos(currentTime / duration * (Math.PI / 2));\n return calculateColor(startValue, byValue, posValue);\n },\n // has to take in account for color restoring;\n onComplete: function(current, valuePerc, timePerc) {\n if (originalOnComplete) {\n return originalOnComplete(\n calculateColor(endColor, endColor, 0),\n valuePerc,\n timePerc\n );\n }\n },\n onChange: function(current, valuePerc, timePerc) {\n if (originalOnChange) {\n if (Array.isArray(current)) {\n return originalOnChange(\n calculateColor(current, current, 0),\n valuePerc,\n timePerc\n );\n }\n originalOnChange(current, valuePerc, timePerc);\n }\n }\n }));\n }\n\n fabric.util.animateColor = animateColor;\n\n})();\n\n\n(function() {\n\n function normalize(a, c, p, s) {\n if (a < Math.abs(c)) {\n a = c;\n s = p / 4;\n }\n else {\n //handle the 0/0 case:\n if (c === 0 && a === 0) {\n s = p / (2 * Math.PI) * Math.asin(1);\n }\n else {\n s = p / (2 * Math.PI) * Math.asin(c / a);\n }\n }\n return { a: a, c: c, p: p, s: s };\n }\n\n function elastic(opts, t, d) {\n return opts.a *\n Math.pow(2, 10 * (t -= 1)) *\n Math.sin( (t * d - opts.s) * (2 * Math.PI) / opts.p );\n }\n\n /**\n * Cubic easing out\n * @memberOf fabric.util.ease\n */\n function easeOutCubic(t, b, c, d) {\n return c * ((t = t / d - 1) * t * t + 1) + b;\n }\n\n /**\n * Cubic easing in and out\n * @memberOf fabric.util.ease\n */\n function easeInOutCubic(t, b, c, d) {\n t /= d / 2;\n if (t < 1) {\n return c / 2 * t * t * t + b;\n }\n return c / 2 * ((t -= 2) * t * t + 2) + b;\n }\n\n /**\n * Quartic easing in\n * @memberOf fabric.util.ease\n */\n function easeInQuart(t, b, c, d) {\n return c * (t /= d) * t * t * t + b;\n }\n\n /**\n * Quartic easing out\n * @memberOf fabric.util.ease\n */\n function easeOutQuart(t, b, c, d) {\n return -c * ((t = t / d - 1) * t * t * t - 1) + b;\n }\n\n /**\n * Quartic easing in and out\n * @memberOf fabric.util.ease\n */\n function easeInOutQuart(t, b, c, d) {\n t /= d / 2;\n if (t < 1) {\n return c / 2 * t * t * t * t + b;\n }\n return -c / 2 * ((t -= 2) * t * t * t - 2) + b;\n }\n\n /**\n * Quintic easing in\n * @memberOf fabric.util.ease\n */\n function easeInQuint(t, b, c, d) {\n return c * (t /= d) * t * t * t * t + b;\n }\n\n /**\n * Quintic easing out\n * @memberOf fabric.util.ease\n */\n function easeOutQuint(t, b, c, d) {\n return c * ((t = t / d - 1) * t * t * t * t + 1) + b;\n }\n\n /**\n * Quintic easing in and out\n * @memberOf fabric.util.ease\n */\n function easeInOutQuint(t, b, c, d) {\n t /= d / 2;\n if (t < 1) {\n return c / 2 * t * t * t * t * t + b;\n }\n return c / 2 * ((t -= 2) * t * t * t * t + 2) + b;\n }\n\n /**\n * Sinusoidal easing in\n * @memberOf fabric.util.ease\n */\n function easeInSine(t, b, c, d) {\n return -c * Math.cos(t / d * (Math.PI / 2)) + c + b;\n }\n\n /**\n * Sinusoidal easing out\n * @memberOf fabric.util.ease\n */\n function easeOutSine(t, b, c, d) {\n return c * Math.sin(t / d * (Math.PI / 2)) + b;\n }\n\n /**\n * Sinusoidal easing in and out\n * @memberOf fabric.util.ease\n */\n function easeInOutSine(t, b, c, d) {\n return -c / 2 * (Math.cos(Math.PI * t / d) - 1) + b;\n }\n\n /**\n * Exponential easing in\n * @memberOf fabric.util.ease\n */\n function easeInExpo(t, b, c, d) {\n return (t === 0) ? b : c * Math.pow(2, 10 * (t / d - 1)) + b;\n }\n\n /**\n * Exponential easing out\n * @memberOf fabric.util.ease\n */\n function easeOutExpo(t, b, c, d) {\n return (t === d) ? b + c : c * (-Math.pow(2, -10 * t / d) + 1) + b;\n }\n\n /**\n * Exponential easing in and out\n * @memberOf fabric.util.ease\n */\n function easeInOutExpo(t, b, c, d) {\n if (t === 0) {\n return b;\n }\n if (t === d) {\n return b + c;\n }\n t /= d / 2;\n if (t < 1) {\n return c / 2 * Math.pow(2, 10 * (t - 1)) + b;\n }\n return c / 2 * (-Math.pow(2, -10 * --t) + 2) + b;\n }\n\n /**\n * Circular easing in\n * @memberOf fabric.util.ease\n */\n function easeInCirc(t, b, c, d) {\n return -c * (Math.sqrt(1 - (t /= d) * t) - 1) + b;\n }\n\n /**\n * Circular easing out\n * @memberOf fabric.util.ease\n */\n function easeOutCirc(t, b, c, d) {\n return c * Math.sqrt(1 - (t = t / d - 1) * t) + b;\n }\n\n /**\n * Circular easing in and out\n * @memberOf fabric.util.ease\n */\n function easeInOutCirc(t, b, c, d) {\n t /= d / 2;\n if (t < 1) {\n return -c / 2 * (Math.sqrt(1 - t * t) - 1) + b;\n }\n return c / 2 * (Math.sqrt(1 - (t -= 2) * t) + 1) + b;\n }\n\n /**\n * Elastic easing in\n * @memberOf fabric.util.ease\n */\n function easeInElastic(t, b, c, d) {\n var s = 1.70158, p = 0, a = c;\n if (t === 0) {\n return b;\n }\n t /= d;\n if (t === 1) {\n return b + c;\n }\n if (!p) {\n p = d * 0.3;\n }\n var opts = normalize(a, c, p, s);\n return -elastic(opts, t, d) + b;\n }\n\n /**\n * Elastic easing out\n * @memberOf fabric.util.ease\n */\n function easeOutElastic(t, b, c, d) {\n var s = 1.70158, p = 0, a = c;\n if (t === 0) {\n return b;\n }\n t /= d;\n if (t === 1) {\n return b + c;\n }\n if (!p) {\n p = d * 0.3;\n }\n var opts = normalize(a, c, p, s);\n return opts.a * Math.pow(2, -10 * t) * Math.sin((t * d - opts.s) * (2 * Math.PI) / opts.p ) + opts.c + b;\n }\n\n /**\n * Elastic easing in and out\n * @memberOf fabric.util.ease\n */\n function easeInOutElastic(t, b, c, d) {\n var s = 1.70158, p = 0, a = c;\n if (t === 0) {\n return b;\n }\n t /= d / 2;\n if (t === 2) {\n return b + c;\n }\n if (!p) {\n p = d * (0.3 * 1.5);\n }\n var opts = normalize(a, c, p, s);\n if (t < 1) {\n return -0.5 * elastic(opts, t, d) + b;\n }\n return opts.a * Math.pow(2, -10 * (t -= 1)) *\n Math.sin((t * d - opts.s) * (2 * Math.PI) / opts.p ) * 0.5 + opts.c + b;\n }\n\n /**\n * Backwards easing in\n * @memberOf fabric.util.ease\n */\n function easeInBack(t, b, c, d, s) {\n if (s === undefined) {\n s = 1.70158;\n }\n return c * (t /= d) * t * ((s + 1) * t - s) + b;\n }\n\n /**\n * Backwards easing out\n * @memberOf fabric.util.ease\n */\n function easeOutBack(t, b, c, d, s) {\n if (s === undefined) {\n s = 1.70158;\n }\n return c * ((t = t / d - 1) * t * ((s + 1) * t + s) + 1) + b;\n }\n\n /**\n * Backwards easing in and out\n * @memberOf fabric.util.ease\n */\n function easeInOutBack(t, b, c, d, s) {\n if (s === undefined) {\n s = 1.70158;\n }\n t /= d / 2;\n if (t < 1) {\n return c / 2 * (t * t * (((s *= (1.525)) + 1) * t - s)) + b;\n }\n return c / 2 * ((t -= 2) * t * (((s *= (1.525)) + 1) * t + s) + 2) + b;\n }\n\n /**\n * Bouncing easing in\n * @memberOf fabric.util.ease\n */\n function easeInBounce(t, b, c, d) {\n return c - easeOutBounce (d - t, 0, c, d) + b;\n }\n\n /**\n * Bouncing easing out\n * @memberOf fabric.util.ease\n */\n function easeOutBounce(t, b, c, d) {\n if ((t /= d) < (1 / 2.75)) {\n return c * (7.5625 * t * t) + b;\n }\n else if (t < (2 / 2.75)) {\n return c * (7.5625 * (t -= (1.5 / 2.75)) * t + 0.75) + b;\n }\n else if (t < (2.5 / 2.75)) {\n return c * (7.5625 * (t -= (2.25 / 2.75)) * t + 0.9375) + b;\n }\n else {\n return c * (7.5625 * (t -= (2.625 / 2.75)) * t + 0.984375) + b;\n }\n }\n\n /**\n * Bouncing easing in and out\n * @memberOf fabric.util.ease\n */\n function easeInOutBounce(t, b, c, d) {\n if (t < d / 2) {\n return easeInBounce (t * 2, 0, c, d) * 0.5 + b;\n }\n return easeOutBounce(t * 2 - d, 0, c, d) * 0.5 + c * 0.5 + b;\n }\n\n /**\n * Easing functions\n * See Easing Equations by Robert Penner\n * @namespace fabric.util.ease\n */\n fabric.util.ease = {\n\n /**\n * Quadratic easing in\n * @memberOf fabric.util.ease\n */\n easeInQuad: function(t, b, c, d) {\n return c * (t /= d) * t + b;\n },\n\n /**\n * Quadratic easing out\n * @memberOf fabric.util.ease\n */\n easeOutQuad: function(t, b, c, d) {\n return -c * (t /= d) * (t - 2) + b;\n },\n\n /**\n * Quadratic easing in and out\n * @memberOf fabric.util.ease\n */\n easeInOutQuad: function(t, b, c, d) {\n t /= (d / 2);\n if (t < 1) {\n return c / 2 * t * t + b;\n }\n return -c / 2 * ((--t) * (t - 2) - 1) + b;\n },\n\n /**\n * Cubic easing in\n * @memberOf fabric.util.ease\n */\n easeInCubic: function(t, b, c, d) {\n return c * (t /= d) * t * t + b;\n },\n\n easeOutCubic: easeOutCubic,\n easeInOutCubic: easeInOutCubic,\n easeInQuart: easeInQuart,\n easeOutQuart: easeOutQuart,\n easeInOutQuart: easeInOutQuart,\n easeInQuint: easeInQuint,\n easeOutQuint: easeOutQuint,\n easeInOutQuint: easeInOutQuint,\n easeInSine: easeInSine,\n easeOutSine: easeOutSine,\n easeInOutSine: easeInOutSine,\n easeInExpo: easeInExpo,\n easeOutExpo: easeOutExpo,\n easeInOutExpo: easeInOutExpo,\n easeInCirc: easeInCirc,\n easeOutCirc: easeOutCirc,\n easeInOutCirc: easeInOutCirc,\n easeInElastic: easeInElastic,\n easeOutElastic: easeOutElastic,\n easeInOutElastic: easeInOutElastic,\n easeInBack: easeInBack,\n easeOutBack: easeOutBack,\n easeInOutBack: easeInOutBack,\n easeInBounce: easeInBounce,\n easeOutBounce: easeOutBounce,\n easeInOutBounce: easeInOutBounce\n };\n\n})();\n\n\n(function(global) {\n\n 'use strict';\n\n /**\n * @name fabric\n * @namespace\n */\n\n var fabric = global.fabric || (global.fabric = { }),\n extend = fabric.util.object.extend,\n clone = fabric.util.object.clone,\n toFixed = fabric.util.toFixed,\n parseUnit = fabric.util.parseUnit,\n multiplyTransformMatrices = fabric.util.multiplyTransformMatrices,\n\n svgValidTagNames = ['path', 'circle', 'polygon', 'polyline', 'ellipse', 'rect', 'line',\n 'image', 'text'],\n svgViewBoxElements = ['symbol', 'image', 'marker', 'pattern', 'view', 'svg'],\n svgInvalidAncestors = ['pattern', 'defs', 'symbol', 'metadata', 'clipPath', 'mask', 'desc'],\n svgValidParents = ['symbol', 'g', 'a', 'svg', 'clipPath', 'defs'],\n\n attributesMap = {\n cx: 'left',\n x: 'left',\n r: 'radius',\n cy: 'top',\n y: 'top',\n display: 'visible',\n visibility: 'visible',\n transform: 'transformMatrix',\n 'fill-opacity': 'fillOpacity',\n 'fill-rule': 'fillRule',\n 'font-family': 'fontFamily',\n 'font-size': 'fontSize',\n 'font-style': 'fontStyle',\n 'font-weight': 'fontWeight',\n 'letter-spacing': 'charSpacing',\n 'paint-order': 'paintFirst',\n 'stroke-dasharray': 'strokeDashArray',\n 'stroke-dashoffset': 'strokeDashOffset',\n 'stroke-linecap': 'strokeLineCap',\n 'stroke-linejoin': 'strokeLineJoin',\n 'stroke-miterlimit': 'strokeMiterLimit',\n 'stroke-opacity': 'strokeOpacity',\n 'stroke-width': 'strokeWidth',\n 'text-decoration': 'textDecoration',\n 'text-anchor': 'textAnchor',\n opacity: 'opacity',\n 'clip-path': 'clipPath',\n 'clip-rule': 'clipRule',\n 'vector-effect': 'strokeUniform',\n 'image-rendering': 'imageSmoothing',\n },\n\n colorAttributes = {\n stroke: 'strokeOpacity',\n fill: 'fillOpacity'\n },\n\n fSize = 'font-size', cPath = 'clip-path';\n\n fabric.svgValidTagNamesRegEx = getSvgRegex(svgValidTagNames);\n fabric.svgViewBoxElementsRegEx = getSvgRegex(svgViewBoxElements);\n fabric.svgInvalidAncestorsRegEx = getSvgRegex(svgInvalidAncestors);\n fabric.svgValidParentsRegEx = getSvgRegex(svgValidParents);\n\n fabric.cssRules = { };\n fabric.gradientDefs = { };\n fabric.clipPaths = { };\n\n function normalizeAttr(attr) {\n // transform attribute names\n if (attr in attributesMap) {\n return attributesMap[attr];\n }\n return attr;\n }\n\n function normalizeValue(attr, value, parentAttributes, fontSize) {\n var isArray = Array.isArray(value), parsed;\n\n if ((attr === 'fill' || attr === 'stroke') && value === 'none') {\n value = '';\n }\n else if (attr === 'strokeUniform') {\n return (value === 'non-scaling-stroke');\n }\n else if (attr === 'strokeDashArray') {\n if (value === 'none') {\n value = null;\n }\n else {\n value = value.replace(/,/g, ' ').split(/\\s+/).map(parseFloat);\n }\n }\n else if (attr === 'transformMatrix') {\n if (parentAttributes && parentAttributes.transformMatrix) {\n value = multiplyTransformMatrices(\n parentAttributes.transformMatrix, fabric.parseTransformAttribute(value));\n }\n else {\n value = fabric.parseTransformAttribute(value);\n }\n }\n else if (attr === 'visible') {\n value = value !== 'none' && value !== 'hidden';\n // display=none on parent element always takes precedence over child element\n if (parentAttributes && parentAttributes.visible === false) {\n value = false;\n }\n }\n else if (attr === 'opacity') {\n value = parseFloat(value);\n if (parentAttributes && typeof parentAttributes.opacity !== 'undefined') {\n value *= parentAttributes.opacity;\n }\n }\n else if (attr === 'textAnchor' /* text-anchor */) {\n value = value === 'start' ? 'left' : value === 'end' ? 'right' : 'center';\n }\n else if (attr === 'charSpacing') {\n // parseUnit returns px and we convert it to em\n parsed = parseUnit(value, fontSize) / fontSize * 1000;\n }\n else if (attr === 'paintFirst') {\n var fillIndex = value.indexOf('fill');\n var strokeIndex = value.indexOf('stroke');\n var value = 'fill';\n if (fillIndex > -1 && strokeIndex > -1 && strokeIndex < fillIndex) {\n value = 'stroke';\n }\n else if (fillIndex === -1 && strokeIndex > -1) {\n value = 'stroke';\n }\n }\n else if (attr === 'href' || attr === 'xlink:href' || attr === 'font') {\n return value;\n }\n else if (attr === 'imageSmoothing') {\n return (value === 'optimizeQuality');\n }\n else {\n parsed = isArray ? value.map(parseUnit) : parseUnit(value, fontSize);\n }\n\n return (!isArray && isNaN(parsed) ? value : parsed);\n }\n\n /**\n * @private\n */\n function getSvgRegex(arr) {\n return new RegExp('^(' + arr.join('|') + ')\\\\b', 'i');\n }\n\n /**\n * @private\n * @param {Object} attributes Array of attributes to parse\n */\n function _setStrokeFillOpacity(attributes) {\n for (var attr in colorAttributes) {\n\n if (typeof attributes[colorAttributes[attr]] === 'undefined' || attributes[attr] === '') {\n continue;\n }\n\n if (typeof attributes[attr] === 'undefined') {\n if (!fabric.Object.prototype[attr]) {\n continue;\n }\n attributes[attr] = fabric.Object.prototype[attr];\n }\n\n if (attributes[attr].indexOf('url(') === 0) {\n continue;\n }\n\n var color = new fabric.Color(attributes[attr]);\n attributes[attr] = color.setAlpha(toFixed(color.getAlpha() * attributes[colorAttributes[attr]], 2)).toRgba();\n }\n return attributes;\n }\n\n /**\n * @private\n */\n function _getMultipleNodes(doc, nodeNames) {\n var nodeName, nodeArray = [], nodeList, i, len;\n for (i = 0, len = nodeNames.length; i < len; i++) {\n nodeName = nodeNames[i];\n nodeList = doc.getElementsByTagName(nodeName);\n nodeArray = nodeArray.concat(Array.prototype.slice.call(nodeList));\n }\n return nodeArray;\n }\n\n /**\n * Parses \"transform\" attribute, returning an array of values\n * @static\n * @function\n * @memberOf fabric\n * @param {String} attributeValue String containing attribute value\n * @return {Array} Array of 6 elements representing transformation matrix\n */\n fabric.parseTransformAttribute = (function() {\n function rotateMatrix(matrix, args) {\n var cos = fabric.util.cos(args[0]), sin = fabric.util.sin(args[0]),\n x = 0, y = 0;\n if (args.length === 3) {\n x = args[1];\n y = args[2];\n }\n\n matrix[0] = cos;\n matrix[1] = sin;\n matrix[2] = -sin;\n matrix[3] = cos;\n matrix[4] = x - (cos * x - sin * y);\n matrix[5] = y - (sin * x + cos * y);\n }\n\n function scaleMatrix(matrix, args) {\n var multiplierX = args[0],\n multiplierY = (args.length === 2) ? args[1] : args[0];\n\n matrix[0] = multiplierX;\n matrix[3] = multiplierY;\n }\n\n function skewMatrix(matrix, args, pos) {\n matrix[pos] = Math.tan(fabric.util.degreesToRadians(args[0]));\n }\n\n function translateMatrix(matrix, args) {\n matrix[4] = args[0];\n if (args.length === 2) {\n matrix[5] = args[1];\n }\n }\n\n // identity matrix\n var iMatrix = fabric.iMatrix,\n\n // == begin transform regexp\n number = fabric.reNum,\n\n commaWsp = fabric.commaWsp,\n\n skewX = '(?:(skewX)\\\\s*\\\\(\\\\s*(' + number + ')\\\\s*\\\\))',\n\n skewY = '(?:(skewY)\\\\s*\\\\(\\\\s*(' + number + ')\\\\s*\\\\))',\n\n rotate = '(?:(rotate)\\\\s*\\\\(\\\\s*(' + number + ')(?:' +\n commaWsp + '(' + number + ')' +\n commaWsp + '(' + number + '))?\\\\s*\\\\))',\n\n scale = '(?:(scale)\\\\s*\\\\(\\\\s*(' + number + ')(?:' +\n commaWsp + '(' + number + '))?\\\\s*\\\\))',\n\n translate = '(?:(translate)\\\\s*\\\\(\\\\s*(' + number + ')(?:' +\n commaWsp + '(' + number + '))?\\\\s*\\\\))',\n\n matrix = '(?:(matrix)\\\\s*\\\\(\\\\s*' +\n '(' + number + ')' + commaWsp +\n '(' + number + ')' + commaWsp +\n '(' + number + ')' + commaWsp +\n '(' + number + ')' + commaWsp +\n '(' + number + ')' + commaWsp +\n '(' + number + ')' +\n '\\\\s*\\\\))',\n\n transform = '(?:' +\n matrix + '|' +\n translate + '|' +\n scale + '|' +\n rotate + '|' +\n skewX + '|' +\n skewY +\n ')',\n\n transforms = '(?:' + transform + '(?:' + commaWsp + '*' + transform + ')*' + ')',\n\n transformList = '^\\\\s*(?:' + transforms + '?)\\\\s*$',\n\n // http://www.w3.org/TR/SVG/coords.html#TransformAttribute\n reTransformList = new RegExp(transformList),\n // == end transform regexp\n\n reTransform = new RegExp(transform, 'g');\n\n return function(attributeValue) {\n\n // start with identity matrix\n var matrix = iMatrix.concat(),\n matrices = [];\n\n // return if no argument was given or\n // an argument does not match transform attribute regexp\n if (!attributeValue || (attributeValue && !reTransformList.test(attributeValue))) {\n return matrix;\n }\n\n attributeValue.replace(reTransform, function(match) {\n\n var m = new RegExp(transform).exec(match).filter(function (match) {\n // match !== '' && match != null\n return (!!match);\n }),\n operation = m[1],\n args = m.slice(2).map(parseFloat);\n\n switch (operation) {\n case 'translate':\n translateMatrix(matrix, args);\n break;\n case 'rotate':\n args[0] = fabric.util.degreesToRadians(args[0]);\n rotateMatrix(matrix, args);\n break;\n case 'scale':\n scaleMatrix(matrix, args);\n break;\n case 'skewX':\n skewMatrix(matrix, args, 2);\n break;\n case 'skewY':\n skewMatrix(matrix, args, 1);\n break;\n case 'matrix':\n matrix = args;\n break;\n }\n\n // snapshot current matrix into matrices array\n matrices.push(matrix.concat());\n // reset\n matrix = iMatrix.concat();\n });\n\n var combinedMatrix = matrices[0];\n while (matrices.length > 1) {\n matrices.shift();\n combinedMatrix = fabric.util.multiplyTransformMatrices(combinedMatrix, matrices[0]);\n }\n return combinedMatrix;\n };\n })();\n\n /**\n * @private\n */\n function parseStyleString(style, oStyle) {\n var attr, value;\n style.replace(/;\\s*$/, '').split(';').forEach(function (chunk) {\n var pair = chunk.split(':');\n\n attr = pair[0].trim().toLowerCase();\n value = pair[1].trim();\n\n oStyle[attr] = value;\n });\n }\n\n /**\n * @private\n */\n function parseStyleObject(style, oStyle) {\n var attr, value;\n for (var prop in style) {\n if (typeof style[prop] === 'undefined') {\n continue;\n }\n\n attr = prop.toLowerCase();\n value = style[prop];\n\n oStyle[attr] = value;\n }\n }\n\n /**\n * @private\n */\n function getGlobalStylesForElement(element, svgUid) {\n var styles = { };\n for (var rule in fabric.cssRules[svgUid]) {\n if (elementMatchesRule(element, rule.split(' '))) {\n for (var property in fabric.cssRules[svgUid][rule]) {\n styles[property] = fabric.cssRules[svgUid][rule][property];\n }\n }\n }\n return styles;\n }\n\n /**\n * @private\n */\n function elementMatchesRule(element, selectors) {\n var firstMatching, parentMatching = true;\n //start from rightmost selector.\n firstMatching = selectorMatches(element, selectors.pop());\n if (firstMatching && selectors.length) {\n parentMatching = doesSomeParentMatch(element, selectors);\n }\n return firstMatching && parentMatching && (selectors.length === 0);\n }\n\n function doesSomeParentMatch(element, selectors) {\n var selector, parentMatching = true;\n while (element.parentNode && element.parentNode.nodeType === 1 && selectors.length) {\n if (parentMatching) {\n selector = selectors.pop();\n }\n element = element.parentNode;\n parentMatching = selectorMatches(element, selector);\n }\n return selectors.length === 0;\n }\n\n /**\n * @private\n */\n function selectorMatches(element, selector) {\n var nodeName = element.nodeName,\n classNames = element.getAttribute('class'),\n id = element.getAttribute('id'), matcher, i;\n // i check if a selector matches slicing away part from it.\n // if i get empty string i should match\n matcher = new RegExp('^' + nodeName, 'i');\n selector = selector.replace(matcher, '');\n if (id && selector.length) {\n matcher = new RegExp('#' + id + '(?![a-zA-Z\\\\-]+)', 'i');\n selector = selector.replace(matcher, '');\n }\n if (classNames && selector.length) {\n classNames = classNames.split(' ');\n for (i = classNames.length; i--;) {\n matcher = new RegExp('\\\\.' + classNames[i] + '(?![a-zA-Z\\\\-]+)', 'i');\n selector = selector.replace(matcher, '');\n }\n }\n return selector.length === 0;\n }\n\n /**\n * @private\n * to support IE8 missing getElementById on SVGdocument and on node xmlDOM\n */\n function elementById(doc, id) {\n var el;\n doc.getElementById && (el = doc.getElementById(id));\n if (el) {\n return el;\n }\n var node, i, len, nodelist = doc.getElementsByTagName('*');\n for (i = 0, len = nodelist.length; i < len; i++) {\n node = nodelist[i];\n if (id === node.getAttribute('id')) {\n return node;\n }\n }\n }\n\n /**\n * @private\n */\n function parseUseDirectives(doc) {\n var nodelist = _getMultipleNodes(doc, ['use', 'svg:use']), i = 0;\n while (nodelist.length && i < nodelist.length) {\n var el = nodelist[i],\n xlinkAttribute = el.getAttribute('xlink:href') || el.getAttribute('href');\n\n if (xlinkAttribute === null) {\n return;\n }\n\n var xlink = xlinkAttribute.slice(1),\n x = el.getAttribute('x') || 0,\n y = el.getAttribute('y') || 0,\n el2 = elementById(doc, xlink).cloneNode(true),\n currentTrans = (el2.getAttribute('transform') || '') + ' translate(' + x + ', ' + y + ')',\n parentNode,\n oldLength = nodelist.length, attr,\n j,\n attrs,\n len,\n namespace = fabric.svgNS;\n\n applyViewboxTransform(el2);\n if (/^svg$/i.test(el2.nodeName)) {\n var el3 = el2.ownerDocument.createElementNS(namespace, 'g');\n for (j = 0, attrs = el2.attributes, len = attrs.length; j < len; j++) {\n attr = attrs.item(j);\n el3.setAttributeNS(namespace, attr.nodeName, attr.nodeValue);\n }\n // el2.firstChild != null\n while (el2.firstChild) {\n el3.appendChild(el2.firstChild);\n }\n el2 = el3;\n }\n\n for (j = 0, attrs = el.attributes, len = attrs.length; j < len; j++) {\n attr = attrs.item(j);\n if (attr.nodeName === 'x' || attr.nodeName === 'y' ||\n attr.nodeName === 'xlink:href' || attr.nodeName === 'href') {\n continue;\n }\n\n if (attr.nodeName === 'transform') {\n currentTrans = attr.nodeValue + ' ' + currentTrans;\n }\n else {\n el2.setAttribute(attr.nodeName, attr.nodeValue);\n }\n }\n\n el2.setAttribute('transform', currentTrans);\n el2.setAttribute('instantiated_by_use', '1');\n el2.removeAttribute('id');\n parentNode = el.parentNode;\n parentNode.replaceChild(el2, el);\n // some browsers do not shorten nodelist after replaceChild (IE8)\n if (nodelist.length === oldLength) {\n i++;\n }\n }\n }\n\n // http://www.w3.org/TR/SVG/coords.html#ViewBoxAttribute\n // matches, e.g.: +14.56e-12, etc.\n var reViewBoxAttrValue = new RegExp(\n '^' +\n '\\\\s*(' + fabric.reNum + '+)\\\\s*,?' +\n '\\\\s*(' + fabric.reNum + '+)\\\\s*,?' +\n '\\\\s*(' + fabric.reNum + '+)\\\\s*,?' +\n '\\\\s*(' + fabric.reNum + '+)\\\\s*' +\n '$'\n );\n\n /**\n * Add a element that envelop all child elements and makes the viewbox transformMatrix descend on all elements\n */\n function applyViewboxTransform(element) {\n if (!fabric.svgViewBoxElementsRegEx.test(element.nodeName)) {\n return {};\n }\n var viewBoxAttr = element.getAttribute('viewBox'),\n scaleX = 1,\n scaleY = 1,\n minX = 0,\n minY = 0,\n viewBoxWidth, viewBoxHeight, matrix, el,\n widthAttr = element.getAttribute('width'),\n heightAttr = element.getAttribute('height'),\n x = element.getAttribute('x') || 0,\n y = element.getAttribute('y') || 0,\n preserveAspectRatio = element.getAttribute('preserveAspectRatio') || '',\n missingViewBox = (!viewBoxAttr || !(viewBoxAttr = viewBoxAttr.match(reViewBoxAttrValue))),\n missingDimAttr = (!widthAttr || !heightAttr || widthAttr === '100%' || heightAttr === '100%'),\n toBeParsed = missingViewBox && missingDimAttr,\n parsedDim = { }, translateMatrix = '', widthDiff = 0, heightDiff = 0;\n\n parsedDim.width = 0;\n parsedDim.height = 0;\n parsedDim.toBeParsed = toBeParsed;\n\n if (missingViewBox) {\n if (((x || y) && element.parentNode && element.parentNode.nodeName !== '#document')) {\n translateMatrix = ' translate(' + parseUnit(x) + ' ' + parseUnit(y) + ') ';\n matrix = (element.getAttribute('transform') || '') + translateMatrix;\n element.setAttribute('transform', matrix);\n element.removeAttribute('x');\n element.removeAttribute('y');\n }\n }\n\n if (toBeParsed) {\n return parsedDim;\n }\n\n if (missingViewBox) {\n parsedDim.width = parseUnit(widthAttr);\n parsedDim.height = parseUnit(heightAttr);\n // set a transform for elements that have x y and are inner(only) SVGs\n return parsedDim;\n }\n minX = -parseFloat(viewBoxAttr[1]);\n minY = -parseFloat(viewBoxAttr[2]);\n viewBoxWidth = parseFloat(viewBoxAttr[3]);\n viewBoxHeight = parseFloat(viewBoxAttr[4]);\n parsedDim.minX = minX;\n parsedDim.minY = minY;\n parsedDim.viewBoxWidth = viewBoxWidth;\n parsedDim.viewBoxHeight = viewBoxHeight;\n if (!missingDimAttr) {\n parsedDim.width = parseUnit(widthAttr);\n parsedDim.height = parseUnit(heightAttr);\n scaleX = parsedDim.width / viewBoxWidth;\n scaleY = parsedDim.height / viewBoxHeight;\n }\n else {\n parsedDim.width = viewBoxWidth;\n parsedDim.height = viewBoxHeight;\n }\n\n // default is to preserve aspect ratio\n preserveAspectRatio = fabric.util.parsePreserveAspectRatioAttribute(preserveAspectRatio);\n if (preserveAspectRatio.alignX !== 'none') {\n //translate all container for the effect of Mid, Min, Max\n if (preserveAspectRatio.meetOrSlice === 'meet') {\n scaleY = scaleX = (scaleX > scaleY ? scaleY : scaleX);\n // calculate additional translation to move the viewbox\n }\n if (preserveAspectRatio.meetOrSlice === 'slice') {\n scaleY = scaleX = (scaleX > scaleY ? scaleX : scaleY);\n // calculate additional translation to move the viewbox\n }\n widthDiff = parsedDim.width - viewBoxWidth * scaleX;\n heightDiff = parsedDim.height - viewBoxHeight * scaleX;\n if (preserveAspectRatio.alignX === 'Mid') {\n widthDiff /= 2;\n }\n if (preserveAspectRatio.alignY === 'Mid') {\n heightDiff /= 2;\n }\n if (preserveAspectRatio.alignX === 'Min') {\n widthDiff = 0;\n }\n if (preserveAspectRatio.alignY === 'Min') {\n heightDiff = 0;\n }\n }\n\n if (scaleX === 1 && scaleY === 1 && minX === 0 && minY === 0 && x === 0 && y === 0) {\n return parsedDim;\n }\n if ((x || y) && element.parentNode.nodeName !== '#document') {\n translateMatrix = ' translate(' + parseUnit(x) + ' ' + parseUnit(y) + ') ';\n }\n\n matrix = translateMatrix + ' matrix(' + scaleX +\n ' 0' +\n ' 0 ' +\n scaleY + ' ' +\n (minX * scaleX + widthDiff) + ' ' +\n (minY * scaleY + heightDiff) + ') ';\n // seems unused.\n // parsedDim.viewboxTransform = fabric.parseTransformAttribute(matrix);\n if (element.nodeName === 'svg') {\n el = element.ownerDocument.createElementNS(fabric.svgNS, 'g');\n // element.firstChild != null\n while (element.firstChild) {\n el.appendChild(element.firstChild);\n }\n element.appendChild(el);\n }\n else {\n el = element;\n el.removeAttribute('x');\n el.removeAttribute('y');\n matrix = el.getAttribute('transform') + matrix;\n }\n el.setAttribute('transform', matrix);\n return parsedDim;\n }\n\n function hasAncestorWithNodeName(element, nodeName) {\n while (element && (element = element.parentNode)) {\n if (element.nodeName && nodeName.test(element.nodeName.replace('svg:', ''))\n && !element.getAttribute('instantiated_by_use')) {\n return true;\n }\n }\n return false;\n }\n\n /**\n * Parses an SVG document, converts it to an array of corresponding fabric.* instances and passes them to a callback\n * @static\n * @function\n * @memberOf fabric\n * @param {SVGDocument} doc SVG document to parse\n * @param {Function} callback Callback to call when parsing is finished;\n * It's being passed an array of elements (parsed from a document).\n * @param {Function} [reviver] Method for further parsing of SVG elements, called after each fabric object created.\n * @param {Object} [parsingOptions] options for parsing document\n * @param {String} [parsingOptions.crossOrigin] crossOrigin settings\n */\n fabric.parseSVGDocument = function(doc, callback, reviver, parsingOptions) {\n if (!doc) {\n return;\n }\n\n parseUseDirectives(doc);\n\n var svgUid = fabric.Object.__uid++, i, len,\n options = applyViewboxTransform(doc),\n descendants = fabric.util.toArray(doc.getElementsByTagName('*'));\n options.crossOrigin = parsingOptions && parsingOptions.crossOrigin;\n options.svgUid = svgUid;\n\n if (descendants.length === 0 && fabric.isLikelyNode) {\n // we're likely in node, where \"o3-xml\" library fails to gEBTN(\"*\")\n // https://github.com/ajaxorg/node-o3-xml/issues/21\n descendants = doc.selectNodes('//*[name(.)!=\"svg\"]');\n var arr = [];\n for (i = 0, len = descendants.length; i < len; i++) {\n arr[i] = descendants[i];\n }\n descendants = arr;\n }\n\n var elements = descendants.filter(function(el) {\n applyViewboxTransform(el);\n return fabric.svgValidTagNamesRegEx.test(el.nodeName.replace('svg:', '')) &&\n !hasAncestorWithNodeName(el, fabric.svgInvalidAncestorsRegEx); // http://www.w3.org/TR/SVG/struct.html#DefsElement\n });\n if (!elements || (elements && !elements.length)) {\n callback && callback([], {});\n return;\n }\n var clipPaths = { };\n descendants.filter(function(el) {\n return el.nodeName.replace('svg:', '') === 'clipPath';\n }).forEach(function(el) {\n var id = el.getAttribute('id');\n clipPaths[id] = fabric.util.toArray(el.getElementsByTagName('*')).filter(function(el) {\n return fabric.svgValidTagNamesRegEx.test(el.nodeName.replace('svg:', ''));\n });\n });\n fabric.gradientDefs[svgUid] = fabric.getGradientDefs(doc);\n fabric.cssRules[svgUid] = fabric.getCSSRules(doc);\n fabric.clipPaths[svgUid] = clipPaths;\n // Precedence of rules: style > class > attribute\n fabric.parseElements(elements, function(instances, elements) {\n if (callback) {\n callback(instances, options, elements, descendants);\n delete fabric.gradientDefs[svgUid];\n delete fabric.cssRules[svgUid];\n delete fabric.clipPaths[svgUid];\n }\n }, clone(options), reviver, parsingOptions);\n };\n\n function recursivelyParseGradientsXlink(doc, gradient) {\n var gradientsAttrs = ['gradientTransform', 'x1', 'x2', 'y1', 'y2', 'gradientUnits', 'cx', 'cy', 'r', 'fx', 'fy'],\n xlinkAttr = 'xlink:href',\n xLink = gradient.getAttribute(xlinkAttr).slice(1),\n referencedGradient = elementById(doc, xLink);\n if (referencedGradient && referencedGradient.getAttribute(xlinkAttr)) {\n recursivelyParseGradientsXlink(doc, referencedGradient);\n }\n gradientsAttrs.forEach(function(attr) {\n if (referencedGradient && !gradient.hasAttribute(attr) && referencedGradient.hasAttribute(attr)) {\n gradient.setAttribute(attr, referencedGradient.getAttribute(attr));\n }\n });\n if (!gradient.children.length) {\n var referenceClone = referencedGradient.cloneNode(true);\n while (referenceClone.firstChild) {\n gradient.appendChild(referenceClone.firstChild);\n }\n }\n gradient.removeAttribute(xlinkAttr);\n }\n\n var reFontDeclaration = new RegExp(\n '(normal|italic)?\\\\s*(normal|small-caps)?\\\\s*' +\n '(normal|bold|bolder|lighter|100|200|300|400|500|600|700|800|900)?\\\\s*(' +\n fabric.reNum +\n '(?:px|cm|mm|em|pt|pc|in)*)(?:\\\\/(normal|' + fabric.reNum + '))?\\\\s+(.*)');\n\n extend(fabric, {\n /**\n * Parses a short font declaration, building adding its properties to a style object\n * @static\n * @function\n * @memberOf fabric\n * @param {String} value font declaration\n * @param {Object} oStyle definition\n */\n parseFontDeclaration: function(value, oStyle) {\n var match = value.match(reFontDeclaration);\n\n if (!match) {\n return;\n }\n var fontStyle = match[1],\n // font variant is not used\n // fontVariant = match[2],\n fontWeight = match[3],\n fontSize = match[4],\n lineHeight = match[5],\n fontFamily = match[6];\n\n if (fontStyle) {\n oStyle.fontStyle = fontStyle;\n }\n if (fontWeight) {\n oStyle.fontWeight = isNaN(parseFloat(fontWeight)) ? fontWeight : parseFloat(fontWeight);\n }\n if (fontSize) {\n oStyle.fontSize = parseUnit(fontSize);\n }\n if (fontFamily) {\n oStyle.fontFamily = fontFamily;\n }\n if (lineHeight) {\n oStyle.lineHeight = lineHeight === 'normal' ? 1 : lineHeight;\n }\n },\n\n /**\n * Parses an SVG document, returning all of the gradient declarations found in it\n * @static\n * @function\n * @memberOf fabric\n * @param {SVGDocument} doc SVG document to parse\n * @return {Object} Gradient definitions; key corresponds to element id, value -- to gradient definition element\n */\n getGradientDefs: function(doc) {\n var tagArray = [\n 'linearGradient',\n 'radialGradient',\n 'svg:linearGradient',\n 'svg:radialGradient'],\n elList = _getMultipleNodes(doc, tagArray),\n el, j = 0, gradientDefs = { };\n j = elList.length;\n while (j--) {\n el = elList[j];\n if (el.getAttribute('xlink:href')) {\n recursivelyParseGradientsXlink(doc, el);\n }\n gradientDefs[el.getAttribute('id')] = el;\n }\n return gradientDefs;\n },\n\n /**\n * Returns an object of attributes' name/value, given element and an array of attribute names;\n * Parses parent \"g\" nodes recursively upwards.\n * @static\n * @memberOf fabric\n * @param {DOMElement} element Element to parse\n * @param {Array} attributes Array of attributes to parse\n * @return {Object} object containing parsed attributes' names/values\n */\n parseAttributes: function(element, attributes, svgUid) {\n\n if (!element) {\n return;\n }\n\n var value,\n parentAttributes = { },\n fontSize, parentFontSize;\n\n if (typeof svgUid === 'undefined') {\n svgUid = element.getAttribute('svgUid');\n }\n // if there's a parent container (`g` or `a` or `symbol` node), parse its attributes recursively upwards\n if (element.parentNode && fabric.svgValidParentsRegEx.test(element.parentNode.nodeName)) {\n parentAttributes = fabric.parseAttributes(element.parentNode, attributes, svgUid);\n }\n\n var ownAttributes = attributes.reduce(function(memo, attr) {\n value = element.getAttribute(attr);\n if (value) { // eslint-disable-line\n memo[attr] = value;\n }\n return memo;\n }, { });\n // add values parsed from style, which take precedence over attributes\n // (see: http://www.w3.org/TR/SVG/styling.html#UsingPresentationAttributes)\n var cssAttrs = extend(\n getGlobalStylesForElement(element, svgUid),\n fabric.parseStyleAttribute(element)\n );\n ownAttributes = extend(\n ownAttributes,\n cssAttrs\n );\n if (cssAttrs[cPath]) {\n element.setAttribute(cPath, cssAttrs[cPath]);\n }\n fontSize = parentFontSize = parentAttributes.fontSize || fabric.Text.DEFAULT_SVG_FONT_SIZE;\n if (ownAttributes[fSize]) {\n // looks like the minimum should be 9px when dealing with ems. this is what looks like in browsers.\n ownAttributes[fSize] = fontSize = parseUnit(ownAttributes[fSize], parentFontSize);\n }\n\n var normalizedAttr, normalizedValue, normalizedStyle = {};\n for (var attr in ownAttributes) {\n normalizedAttr = normalizeAttr(attr);\n normalizedValue = normalizeValue(normalizedAttr, ownAttributes[attr], parentAttributes, fontSize);\n normalizedStyle[normalizedAttr] = normalizedValue;\n }\n if (normalizedStyle && normalizedStyle.font) {\n fabric.parseFontDeclaration(normalizedStyle.font, normalizedStyle);\n }\n var mergedAttrs = extend(parentAttributes, normalizedStyle);\n return fabric.svgValidParentsRegEx.test(element.nodeName) ? mergedAttrs : _setStrokeFillOpacity(mergedAttrs);\n },\n\n /**\n * Transforms an array of svg elements to corresponding fabric.* instances\n * @static\n * @memberOf fabric\n * @param {Array} elements Array of elements to parse\n * @param {Function} callback Being passed an array of fabric instances (transformed from SVG elements)\n * @param {Object} [options] Options object\n * @param {Function} [reviver] Method for further parsing of SVG elements, called after each fabric object created.\n */\n parseElements: function(elements, callback, options, reviver, parsingOptions) {\n new fabric.ElementsParser(elements, callback, options, reviver, parsingOptions).parse();\n },\n\n /**\n * Parses \"style\" attribute, retuning an object with values\n * @static\n * @memberOf fabric\n * @param {SVGElement} element Element to parse\n * @return {Object} Objects with values parsed from style attribute of an element\n */\n parseStyleAttribute: function(element) {\n var oStyle = { },\n style = element.getAttribute('style');\n\n if (!style) {\n return oStyle;\n }\n\n if (typeof style === 'string') {\n parseStyleString(style, oStyle);\n }\n else {\n parseStyleObject(style, oStyle);\n }\n\n return oStyle;\n },\n\n /**\n * Parses \"points\" attribute, returning an array of values\n * @static\n * @memberOf fabric\n * @param {String} points points attribute string\n * @return {Array} array of points\n */\n parsePointsAttribute: function(points) {\n\n // points attribute is required and must not be empty\n if (!points) {\n return null;\n }\n\n // replace commas with whitespace and remove bookending whitespace\n points = points.replace(/,/g, ' ').trim();\n\n points = points.split(/\\s+/);\n var parsedPoints = [], i, len;\n\n for (i = 0, len = points.length; i < len; i += 2) {\n parsedPoints.push({\n x: parseFloat(points[i]),\n y: parseFloat(points[i + 1])\n });\n }\n\n // odd number of points is an error\n // if (parsedPoints.length % 2 !== 0) {\n // return null;\n // }\n\n return parsedPoints;\n },\n\n /**\n * Returns CSS rules for a given SVG document\n * @static\n * @function\n * @memberOf fabric\n * @param {SVGDocument} doc SVG document to parse\n * @return {Object} CSS rules of this document\n */\n getCSSRules: function(doc) {\n var styles = doc.getElementsByTagName('style'), i, len,\n allRules = { }, rules;\n\n // very crude parsing of style contents\n for (i = 0, len = styles.length; i < len; i++) {\n var styleContents = styles[i].textContent;\n\n // remove comments\n styleContents = styleContents.replace(/\\/\\*[\\s\\S]*?\\*\\//g, '');\n if (styleContents.trim() === '') {\n continue;\n }\n // recovers all the rule in this form `body { style code... }`\n // rules = styleContents.match(/[^{]*\\{[\\s\\S]*?\\}/g);\n rules = styleContents.split('}');\n // remove empty rules.\n rules = rules.filter(function(rule) { return rule.trim(); });\n // at this point we have hopefully an array of rules `body { style code... `\n // eslint-disable-next-line no-loop-func\n rules.forEach(function(rule) {\n\n var match = rule.split('{'),\n ruleObj = { }, declaration = match[1].trim(),\n propertyValuePairs = declaration.split(';').filter(function(pair) { return pair.trim(); });\n\n for (i = 0, len = propertyValuePairs.length; i < len; i++) {\n var pair = propertyValuePairs[i].split(':'),\n property = pair[0].trim(),\n value = pair[1].trim();\n ruleObj[property] = value;\n }\n rule = match[0].trim();\n rule.split(',').forEach(function(_rule) {\n _rule = _rule.replace(/^svg/i, '').trim();\n if (_rule === '') {\n return;\n }\n if (allRules[_rule]) {\n fabric.util.object.extend(allRules[_rule], ruleObj);\n }\n else {\n allRules[_rule] = fabric.util.object.clone(ruleObj);\n }\n });\n });\n }\n return allRules;\n },\n\n /**\n * Takes url corresponding to an SVG document, and parses it into a set of fabric objects.\n * Note that SVG is fetched via XMLHttpRequest, so it needs to conform to SOP (Same Origin Policy)\n * @memberOf fabric\n * @param {String} url\n * @param {Function} callback\n * @param {Function} [reviver] Method for further parsing of SVG elements, called after each fabric object created.\n * @param {Object} [options] Object containing options for parsing\n * @param {String} [options.crossOrigin] crossOrigin crossOrigin setting to use for external resources\n */\n loadSVGFromURL: function(url, callback, reviver, options) {\n\n url = url.replace(/^\\n\\s*/, '').trim();\n new fabric.util.request(url, {\n method: 'get',\n onComplete: onComplete\n });\n\n function onComplete(r) {\n\n var xml = r.responseXML;\n if (!xml || !xml.documentElement) {\n callback && callback(null);\n return false;\n }\n\n fabric.parseSVGDocument(xml.documentElement, function (results, _options, elements, allElements) {\n callback && callback(results, _options, elements, allElements);\n }, reviver, options);\n }\n },\n\n /**\n * Takes string corresponding to an SVG document, and parses it into a set of fabric objects\n * @memberOf fabric\n * @param {String} string\n * @param {Function} callback\n * @param {Function} [reviver] Method for further parsing of SVG elements, called after each fabric object created.\n * @param {Object} [options] Object containing options for parsing\n * @param {String} [options.crossOrigin] crossOrigin crossOrigin setting to use for external resources\n */\n loadSVGFromString: function(string, callback, reviver, options) {\n var parser = new fabric.window.DOMParser(),\n doc = parser.parseFromString(string.trim(), 'text/xml');\n fabric.parseSVGDocument(doc.documentElement, function (results, _options, elements, allElements) {\n callback(results, _options, elements, allElements);\n }, reviver, options);\n }\n });\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\nfabric.ElementsParser = function(elements, callback, options, reviver, parsingOptions, doc) {\n this.elements = elements;\n this.callback = callback;\n this.options = options;\n this.reviver = reviver;\n this.svgUid = (options && options.svgUid) || 0;\n this.parsingOptions = parsingOptions;\n this.regexUrl = /^url\\(['\"]?#([^'\"]+)['\"]?\\)/g;\n this.doc = doc;\n};\n\n(function(proto) {\n proto.parse = function() {\n this.instances = new Array(this.elements.length);\n this.numElements = this.elements.length;\n this.createObjects();\n };\n\n proto.createObjects = function() {\n var _this = this;\n this.elements.forEach(function(element, i) {\n element.setAttribute('svgUid', _this.svgUid);\n _this.createObject(element, i);\n });\n };\n\n proto.findTag = function(el) {\n return fabric[fabric.util.string.capitalize(el.tagName.replace('svg:', ''))];\n };\n\n proto.createObject = function(el, index) {\n var klass = this.findTag(el);\n if (klass && klass.fromElement) {\n try {\n klass.fromElement(el, this.createCallback(index, el), this.options);\n }\n catch (err) {\n fabric.log(err);\n }\n }\n else {\n this.checkIfDone();\n }\n };\n\n proto.createCallback = function(index, el) {\n var _this = this;\n return function(obj) {\n var _options;\n _this.resolveGradient(obj, el, 'fill');\n _this.resolveGradient(obj, el, 'stroke');\n if (obj instanceof fabric.Image && obj._originalElement) {\n _options = obj.parsePreserveAspectRatioAttribute(el);\n }\n obj._removeTransformMatrix(_options);\n _this.resolveClipPath(obj, el);\n _this.reviver && _this.reviver(el, obj);\n _this.instances[index] = obj;\n _this.checkIfDone();\n };\n };\n\n proto.extractPropertyDefinition = function(obj, property, storage) {\n var value = obj[property], regex = this.regexUrl;\n if (!regex.test(value)) {\n return;\n }\n regex.lastIndex = 0;\n var id = regex.exec(value)[1];\n regex.lastIndex = 0;\n return fabric[storage][this.svgUid][id];\n };\n\n proto.resolveGradient = function(obj, el, property) {\n var gradientDef = this.extractPropertyDefinition(obj, property, 'gradientDefs');\n if (gradientDef) {\n var opacityAttr = el.getAttribute(property + '-opacity');\n var gradient = fabric.Gradient.fromElement(gradientDef, obj, opacityAttr, this.options);\n obj.set(property, gradient);\n }\n };\n\n proto.createClipPathCallback = function(obj, container) {\n return function(_newObj) {\n _newObj._removeTransformMatrix();\n _newObj.fillRule = _newObj.clipRule;\n container.push(_newObj);\n };\n };\n\n proto.resolveClipPath = function(obj, usingElement) {\n var clipPath = this.extractPropertyDefinition(obj, 'clipPath', 'clipPaths'),\n element, klass, objTransformInv, container, gTransform, options;\n if (clipPath) {\n container = [];\n objTransformInv = fabric.util.invertTransform(obj.calcTransformMatrix());\n // move the clipPath tag as sibling to the real element that is using it\n var clipPathTag = clipPath[0].parentNode;\n var clipPathOwner = usingElement;\n while (clipPathOwner.parentNode && clipPathOwner.getAttribute('clip-path') !== obj.clipPath) {\n clipPathOwner = clipPathOwner.parentNode;\n }\n clipPathOwner.parentNode.appendChild(clipPathTag);\n for (var i = 0; i < clipPath.length; i++) {\n element = clipPath[i];\n klass = this.findTag(element);\n klass.fromElement(\n element,\n this.createClipPathCallback(obj, container),\n this.options\n );\n }\n if (container.length === 1) {\n clipPath = container[0];\n }\n else {\n clipPath = new fabric.Group(container);\n }\n gTransform = fabric.util.multiplyTransformMatrices(\n objTransformInv,\n clipPath.calcTransformMatrix()\n );\n if (clipPath.clipPath) {\n this.resolveClipPath(clipPath, clipPathOwner);\n }\n var options = fabric.util.qrDecompose(gTransform);\n clipPath.flipX = false;\n clipPath.flipY = false;\n clipPath.set('scaleX', options.scaleX);\n clipPath.set('scaleY', options.scaleY);\n clipPath.angle = options.angle;\n clipPath.skewX = options.skewX;\n clipPath.skewY = 0;\n clipPath.setPositionByOrigin({ x: options.translateX, y: options.translateY }, 'center', 'center');\n obj.clipPath = clipPath;\n }\n else {\n // if clip-path does not resolve to any element, delete the property.\n delete obj.clipPath;\n }\n };\n\n proto.checkIfDone = function() {\n if (--this.numElements === 0) {\n this.instances = this.instances.filter(function(el) {\n // eslint-disable-next-line no-eq-null, eqeqeq\n return el != null;\n });\n this.callback(this.instances, this.elements);\n }\n };\n})(fabric.ElementsParser.prototype);\n\n\n(function(global) {\n\n 'use strict';\n\n /* Adaptation of work of Kevin Lindsey (kevin@kevlindev.com) */\n\n var fabric = global.fabric || (global.fabric = { });\n\n if (fabric.Point) {\n fabric.warn('fabric.Point is already defined');\n return;\n }\n\n fabric.Point = Point;\n\n /**\n * Point class\n * @class fabric.Point\n * @memberOf fabric\n * @constructor\n * @param {Number} x\n * @param {Number} y\n * @return {fabric.Point} thisArg\n */\n function Point(x, y) {\n this.x = x;\n this.y = y;\n }\n\n Point.prototype = /** @lends fabric.Point.prototype */ {\n\n type: 'point',\n\n constructor: Point,\n\n /**\n * Adds another point to this one and returns another one\n * @param {fabric.Point} that\n * @return {fabric.Point} new Point instance with added values\n */\n add: function (that) {\n return new Point(this.x + that.x, this.y + that.y);\n },\n\n /**\n * Adds another point to this one\n * @param {fabric.Point} that\n * @return {fabric.Point} thisArg\n * @chainable\n */\n addEquals: function (that) {\n this.x += that.x;\n this.y += that.y;\n return this;\n },\n\n /**\n * Adds value to this point and returns a new one\n * @param {Number} scalar\n * @return {fabric.Point} new Point with added value\n */\n scalarAdd: function (scalar) {\n return new Point(this.x + scalar, this.y + scalar);\n },\n\n /**\n * Adds value to this point\n * @param {Number} scalar\n * @return {fabric.Point} thisArg\n * @chainable\n */\n scalarAddEquals: function (scalar) {\n this.x += scalar;\n this.y += scalar;\n return this;\n },\n\n /**\n * Subtracts another point from this point and returns a new one\n * @param {fabric.Point} that\n * @return {fabric.Point} new Point object with subtracted values\n */\n subtract: function (that) {\n return new Point(this.x - that.x, this.y - that.y);\n },\n\n /**\n * Subtracts another point from this point\n * @param {fabric.Point} that\n * @return {fabric.Point} thisArg\n * @chainable\n */\n subtractEquals: function (that) {\n this.x -= that.x;\n this.y -= that.y;\n return this;\n },\n\n /**\n * Subtracts value from this point and returns a new one\n * @param {Number} scalar\n * @return {fabric.Point}\n */\n scalarSubtract: function (scalar) {\n return new Point(this.x - scalar, this.y - scalar);\n },\n\n /**\n * Subtracts value from this point\n * @param {Number} scalar\n * @return {fabric.Point} thisArg\n * @chainable\n */\n scalarSubtractEquals: function (scalar) {\n this.x -= scalar;\n this.y -= scalar;\n return this;\n },\n\n /**\n * Multiplies this point by a value and returns a new one\n * TODO: rename in scalarMultiply in 2.0\n * @param {Number} scalar\n * @return {fabric.Point}\n */\n multiply: function (scalar) {\n return new Point(this.x * scalar, this.y * scalar);\n },\n\n /**\n * Multiplies this point by a value\n * TODO: rename in scalarMultiplyEquals in 2.0\n * @param {Number} scalar\n * @return {fabric.Point} thisArg\n * @chainable\n */\n multiplyEquals: function (scalar) {\n this.x *= scalar;\n this.y *= scalar;\n return this;\n },\n\n /**\n * Divides this point by a value and returns a new one\n * TODO: rename in scalarDivide in 2.0\n * @param {Number} scalar\n * @return {fabric.Point}\n */\n divide: function (scalar) {\n return new Point(this.x / scalar, this.y / scalar);\n },\n\n /**\n * Divides this point by a value\n * TODO: rename in scalarDivideEquals in 2.0\n * @param {Number} scalar\n * @return {fabric.Point} thisArg\n * @chainable\n */\n divideEquals: function (scalar) {\n this.x /= scalar;\n this.y /= scalar;\n return this;\n },\n\n /**\n * Returns true if this point is equal to another one\n * @param {fabric.Point} that\n * @return {Boolean}\n */\n eq: function (that) {\n return (this.x === that.x && this.y === that.y);\n },\n\n /**\n * Returns true if this point is less than another one\n * @param {fabric.Point} that\n * @return {Boolean}\n */\n lt: function (that) {\n return (this.x < that.x && this.y < that.y);\n },\n\n /**\n * Returns true if this point is less than or equal to another one\n * @param {fabric.Point} that\n * @return {Boolean}\n */\n lte: function (that) {\n return (this.x <= that.x && this.y <= that.y);\n },\n\n /**\n\n * Returns true if this point is greater another one\n * @param {fabric.Point} that\n * @return {Boolean}\n */\n gt: function (that) {\n return (this.x > that.x && this.y > that.y);\n },\n\n /**\n * Returns true if this point is greater than or equal to another one\n * @param {fabric.Point} that\n * @return {Boolean}\n */\n gte: function (that) {\n return (this.x >= that.x && this.y >= that.y);\n },\n\n /**\n * Returns new point which is the result of linear interpolation with this one and another one\n * @param {fabric.Point} that\n * @param {Number} t , position of interpolation, between 0 and 1 default 0.5\n * @return {fabric.Point}\n */\n lerp: function (that, t) {\n if (typeof t === 'undefined') {\n t = 0.5;\n }\n t = Math.max(Math.min(1, t), 0);\n return new Point(this.x + (that.x - this.x) * t, this.y + (that.y - this.y) * t);\n },\n\n /**\n * Returns distance from this point and another one\n * @param {fabric.Point} that\n * @return {Number}\n */\n distanceFrom: function (that) {\n var dx = this.x - that.x,\n dy = this.y - that.y;\n return Math.sqrt(dx * dx + dy * dy);\n },\n\n /**\n * Returns the point between this point and another one\n * @param {fabric.Point} that\n * @return {fabric.Point}\n */\n midPointFrom: function (that) {\n return this.lerp(that);\n },\n\n /**\n * Returns a new point which is the min of this and another one\n * @param {fabric.Point} that\n * @return {fabric.Point}\n */\n min: function (that) {\n return new Point(Math.min(this.x, that.x), Math.min(this.y, that.y));\n },\n\n /**\n * Returns a new point which is the max of this and another one\n * @param {fabric.Point} that\n * @return {fabric.Point}\n */\n max: function (that) {\n return new Point(Math.max(this.x, that.x), Math.max(this.y, that.y));\n },\n\n /**\n * Returns string representation of this point\n * @return {String}\n */\n toString: function () {\n return this.x + ',' + this.y;\n },\n\n /**\n * Sets x/y of this point\n * @param {Number} x\n * @param {Number} y\n * @chainable\n */\n setXY: function (x, y) {\n this.x = x;\n this.y = y;\n return this;\n },\n\n /**\n * Sets x of this point\n * @param {Number} x\n * @chainable\n */\n setX: function (x) {\n this.x = x;\n return this;\n },\n\n /**\n * Sets y of this point\n * @param {Number} y\n * @chainable\n */\n setY: function (y) {\n this.y = y;\n return this;\n },\n\n /**\n * Sets x/y of this point from another point\n * @param {fabric.Point} that\n * @chainable\n */\n setFromPoint: function (that) {\n this.x = that.x;\n this.y = that.y;\n return this;\n },\n\n /**\n * Swaps x/y of this point and another point\n * @param {fabric.Point} that\n */\n swap: function (that) {\n var x = this.x,\n y = this.y;\n this.x = that.x;\n this.y = that.y;\n that.x = x;\n that.y = y;\n },\n\n /**\n * return a cloned instance of the point\n * @return {fabric.Point}\n */\n clone: function () {\n return new Point(this.x, this.y);\n }\n };\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n /* Adaptation of work of Kevin Lindsey (kevin@kevlindev.com) */\n var fabric = global.fabric || (global.fabric = { });\n\n if (fabric.Intersection) {\n fabric.warn('fabric.Intersection is already defined');\n return;\n }\n\n /**\n * Intersection class\n * @class fabric.Intersection\n * @memberOf fabric\n * @constructor\n */\n function Intersection(status) {\n this.status = status;\n this.points = [];\n }\n\n fabric.Intersection = Intersection;\n\n fabric.Intersection.prototype = /** @lends fabric.Intersection.prototype */ {\n\n constructor: Intersection,\n\n /**\n * Appends a point to intersection\n * @param {fabric.Point} point\n * @return {fabric.Intersection} thisArg\n * @chainable\n */\n appendPoint: function (point) {\n this.points.push(point);\n return this;\n },\n\n /**\n * Appends points to intersection\n * @param {Array} points\n * @return {fabric.Intersection} thisArg\n * @chainable\n */\n appendPoints: function (points) {\n this.points = this.points.concat(points);\n return this;\n }\n };\n\n /**\n * Checks if one line intersects another\n * TODO: rename in intersectSegmentSegment\n * @static\n * @param {fabric.Point} a1\n * @param {fabric.Point} a2\n * @param {fabric.Point} b1\n * @param {fabric.Point} b2\n * @return {fabric.Intersection}\n */\n fabric.Intersection.intersectLineLine = function (a1, a2, b1, b2) {\n var result,\n uaT = (b2.x - b1.x) * (a1.y - b1.y) - (b2.y - b1.y) * (a1.x - b1.x),\n ubT = (a2.x - a1.x) * (a1.y - b1.y) - (a2.y - a1.y) * (a1.x - b1.x),\n uB = (b2.y - b1.y) * (a2.x - a1.x) - (b2.x - b1.x) * (a2.y - a1.y);\n if (uB !== 0) {\n var ua = uaT / uB,\n ub = ubT / uB;\n if (0 <= ua && ua <= 1 && 0 <= ub && ub <= 1) {\n result = new Intersection('Intersection');\n result.appendPoint(new fabric.Point(a1.x + ua * (a2.x - a1.x), a1.y + ua * (a2.y - a1.y)));\n }\n else {\n result = new Intersection();\n }\n }\n else {\n if (uaT === 0 || ubT === 0) {\n result = new Intersection('Coincident');\n }\n else {\n result = new Intersection('Parallel');\n }\n }\n return result;\n };\n\n /**\n * Checks if line intersects polygon\n * TODO: rename in intersectSegmentPolygon\n * fix detection of coincident\n * @static\n * @param {fabric.Point} a1\n * @param {fabric.Point} a2\n * @param {Array} points\n * @return {fabric.Intersection}\n */\n fabric.Intersection.intersectLinePolygon = function(a1, a2, points) {\n var result = new Intersection(),\n length = points.length,\n b1, b2, inter, i;\n\n for (i = 0; i < length; i++) {\n b1 = points[i];\n b2 = points[(i + 1) % length];\n inter = Intersection.intersectLineLine(a1, a2, b1, b2);\n\n result.appendPoints(inter.points);\n }\n if (result.points.length > 0) {\n result.status = 'Intersection';\n }\n return result;\n };\n\n /**\n * Checks if polygon intersects another polygon\n * @static\n * @param {Array} points1\n * @param {Array} points2\n * @return {fabric.Intersection}\n */\n fabric.Intersection.intersectPolygonPolygon = function (points1, points2) {\n var result = new Intersection(),\n length = points1.length, i;\n\n for (i = 0; i < length; i++) {\n var a1 = points1[i],\n a2 = points1[(i + 1) % length],\n inter = Intersection.intersectLinePolygon(a1, a2, points2);\n\n result.appendPoints(inter.points);\n }\n if (result.points.length > 0) {\n result.status = 'Intersection';\n }\n return result;\n };\n\n /**\n * Checks if polygon intersects rectangle\n * @static\n * @param {Array} points\n * @param {fabric.Point} r1\n * @param {fabric.Point} r2\n * @return {fabric.Intersection}\n */\n fabric.Intersection.intersectPolygonRectangle = function (points, r1, r2) {\n var min = r1.min(r2),\n max = r1.max(r2),\n topRight = new fabric.Point(max.x, min.y),\n bottomLeft = new fabric.Point(min.x, max.y),\n inter1 = Intersection.intersectLinePolygon(min, topRight, points),\n inter2 = Intersection.intersectLinePolygon(topRight, max, points),\n inter3 = Intersection.intersectLinePolygon(max, bottomLeft, points),\n inter4 = Intersection.intersectLinePolygon(bottomLeft, min, points),\n result = new Intersection();\n\n result.appendPoints(inter1.points);\n result.appendPoints(inter2.points);\n result.appendPoints(inter3.points);\n result.appendPoints(inter4.points);\n\n if (result.points.length > 0) {\n result.status = 'Intersection';\n }\n return result;\n };\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { });\n\n if (fabric.Color) {\n fabric.warn('fabric.Color is already defined.');\n return;\n }\n\n /**\n * Color class\n * The purpose of {@link fabric.Color} is to abstract and encapsulate common color operations;\n * {@link fabric.Color} is a constructor and creates instances of {@link fabric.Color} objects.\n *\n * @class fabric.Color\n * @param {String} color optional in hex or rgb(a) or hsl format or from known color list\n * @return {fabric.Color} thisArg\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-2/#colors}\n */\n function Color(color) {\n if (!color) {\n this.setSource([0, 0, 0, 1]);\n }\n else {\n this._tryParsingColor(color);\n }\n }\n\n fabric.Color = Color;\n\n fabric.Color.prototype = /** @lends fabric.Color.prototype */ {\n\n /**\n * @private\n * @param {String|Array} color Color value to parse\n */\n _tryParsingColor: function(color) {\n var source;\n\n if (color in Color.colorNameMap) {\n color = Color.colorNameMap[color];\n }\n\n if (color === 'transparent') {\n source = [255, 255, 255, 0];\n }\n\n if (!source) {\n source = Color.sourceFromHex(color);\n }\n if (!source) {\n source = Color.sourceFromRgb(color);\n }\n if (!source) {\n source = Color.sourceFromHsl(color);\n }\n if (!source) {\n //if color is not recognize let's make black as canvas does\n source = [0, 0, 0, 1];\n }\n if (source) {\n this.setSource(source);\n }\n },\n\n /**\n * Adapted from https://github.com/mjijackson\n * @private\n * @param {Number} r Red color value\n * @param {Number} g Green color value\n * @param {Number} b Blue color value\n * @return {Array} Hsl color\n */\n _rgbToHsl: function(r, g, b) {\n r /= 255; g /= 255; b /= 255;\n\n var h, s, l,\n max = fabric.util.array.max([r, g, b]),\n min = fabric.util.array.min([r, g, b]);\n\n l = (max + min) / 2;\n\n if (max === min) {\n h = s = 0; // achromatic\n }\n else {\n var d = max - min;\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n switch (max) {\n case r:\n h = (g - b) / d + (g < b ? 6 : 0);\n break;\n case g:\n h = (b - r) / d + 2;\n break;\n case b:\n h = (r - g) / d + 4;\n break;\n }\n h /= 6;\n }\n\n return [\n Math.round(h * 360),\n Math.round(s * 100),\n Math.round(l * 100)\n ];\n },\n\n /**\n * Returns source of this color (where source is an array representation; ex: [200, 200, 100, 1])\n * @return {Array}\n */\n getSource: function() {\n return this._source;\n },\n\n /**\n * Sets source of this color (where source is an array representation; ex: [200, 200, 100, 1])\n * @param {Array} source\n */\n setSource: function(source) {\n this._source = source;\n },\n\n /**\n * Returns color representation in RGB format\n * @return {String} ex: rgb(0-255,0-255,0-255)\n */\n toRgb: function() {\n var source = this.getSource();\n return 'rgb(' + source[0] + ',' + source[1] + ',' + source[2] + ')';\n },\n\n /**\n * Returns color representation in RGBA format\n * @return {String} ex: rgba(0-255,0-255,0-255,0-1)\n */\n toRgba: function() {\n var source = this.getSource();\n return 'rgba(' + source[0] + ',' + source[1] + ',' + source[2] + ',' + source[3] + ')';\n },\n\n /**\n * Returns color representation in HSL format\n * @return {String} ex: hsl(0-360,0%-100%,0%-100%)\n */\n toHsl: function() {\n var source = this.getSource(),\n hsl = this._rgbToHsl(source[0], source[1], source[2]);\n\n return 'hsl(' + hsl[0] + ',' + hsl[1] + '%,' + hsl[2] + '%)';\n },\n\n /**\n * Returns color representation in HSLA format\n * @return {String} ex: hsla(0-360,0%-100%,0%-100%,0-1)\n */\n toHsla: function() {\n var source = this.getSource(),\n hsl = this._rgbToHsl(source[0], source[1], source[2]);\n\n return 'hsla(' + hsl[0] + ',' + hsl[1] + '%,' + hsl[2] + '%,' + source[3] + ')';\n },\n\n /**\n * Returns color representation in HEX format\n * @return {String} ex: FF5555\n */\n toHex: function() {\n var source = this.getSource(), r, g, b;\n\n r = source[0].toString(16);\n r = (r.length === 1) ? ('0' + r) : r;\n\n g = source[1].toString(16);\n g = (g.length === 1) ? ('0' + g) : g;\n\n b = source[2].toString(16);\n b = (b.length === 1) ? ('0' + b) : b;\n\n return r.toUpperCase() + g.toUpperCase() + b.toUpperCase();\n },\n\n /**\n * Returns color representation in HEXA format\n * @return {String} ex: FF5555CC\n */\n toHexa: function() {\n var source = this.getSource(), a;\n\n a = Math.round(source[3] * 255);\n a = a.toString(16);\n a = (a.length === 1) ? ('0' + a) : a;\n\n return this.toHex() + a.toUpperCase();\n },\n\n /**\n * Gets value of alpha channel for this color\n * @return {Number} 0-1\n */\n getAlpha: function() {\n return this.getSource()[3];\n },\n\n /**\n * Sets value of alpha channel for this color\n * @param {Number} alpha Alpha value 0-1\n * @return {fabric.Color} thisArg\n */\n setAlpha: function(alpha) {\n var source = this.getSource();\n source[3] = alpha;\n this.setSource(source);\n return this;\n },\n\n /**\n * Transforms color to its grayscale representation\n * @return {fabric.Color} thisArg\n */\n toGrayscale: function() {\n var source = this.getSource(),\n average = parseInt((source[0] * 0.3 + source[1] * 0.59 + source[2] * 0.11).toFixed(0), 10),\n currentAlpha = source[3];\n this.setSource([average, average, average, currentAlpha]);\n return this;\n },\n\n /**\n * Transforms color to its black and white representation\n * @param {Number} threshold\n * @return {fabric.Color} thisArg\n */\n toBlackWhite: function(threshold) {\n var source = this.getSource(),\n average = (source[0] * 0.3 + source[1] * 0.59 + source[2] * 0.11).toFixed(0),\n currentAlpha = source[3];\n\n threshold = threshold || 127;\n\n average = (Number(average) < Number(threshold)) ? 0 : 255;\n this.setSource([average, average, average, currentAlpha]);\n return this;\n },\n\n /**\n * Overlays color with another color\n * @param {String|fabric.Color} otherColor\n * @return {fabric.Color} thisArg\n */\n overlayWith: function(otherColor) {\n if (!(otherColor instanceof Color)) {\n otherColor = new Color(otherColor);\n }\n\n var result = [],\n alpha = this.getAlpha(),\n otherAlpha = 0.5,\n source = this.getSource(),\n otherSource = otherColor.getSource(), i;\n\n for (i = 0; i < 3; i++) {\n result.push(Math.round((source[i] * (1 - otherAlpha)) + (otherSource[i] * otherAlpha)));\n }\n\n result[3] = alpha;\n this.setSource(result);\n return this;\n }\n };\n\n /**\n * Regex matching color in RGB or RGBA formats (ex: rgb(0, 0, 0), rgba(255, 100, 10, 0.5), rgba( 255 , 100 , 10 , 0.5 ), rgb(1,1,1), rgba(100%, 60%, 10%, 0.5))\n * @static\n * @field\n * @memberOf fabric.Color\n */\n // eslint-disable-next-line max-len\n fabric.Color.reRGBa = /^rgba?\\(\\s*(\\d{1,3}(?:\\.\\d+)?\\%?)\\s*,\\s*(\\d{1,3}(?:\\.\\d+)?\\%?)\\s*,\\s*(\\d{1,3}(?:\\.\\d+)?\\%?)\\s*(?:\\s*,\\s*((?:\\d*\\.?\\d+)?)\\s*)?\\)$/i;\n\n /**\n * Regex matching color in HSL or HSLA formats (ex: hsl(200, 80%, 10%), hsla(300, 50%, 80%, 0.5), hsla( 300 , 50% , 80% , 0.5 ))\n * @static\n * @field\n * @memberOf fabric.Color\n */\n fabric.Color.reHSLa = /^hsla?\\(\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3}\\%)\\s*,\\s*(\\d{1,3}\\%)\\s*(?:\\s*,\\s*(\\d+(?:\\.\\d+)?)\\s*)?\\)$/i;\n\n /**\n * Regex matching color in HEX format (ex: #FF5544CC, #FF5555, 010155, aff)\n * @static\n * @field\n * @memberOf fabric.Color\n */\n fabric.Color.reHex = /^#?([0-9a-f]{8}|[0-9a-f]{6}|[0-9a-f]{4}|[0-9a-f]{3})$/i;\n\n /**\n * Map of the 148 color names with HEX code\n * @static\n * @field\n * @memberOf fabric.Color\n * @see: https://www.w3.org/TR/css3-color/#svg-color\n */\n fabric.Color.colorNameMap = {\n aliceblue: '#F0F8FF',\n antiquewhite: '#FAEBD7',\n aqua: '#00FFFF',\n aquamarine: '#7FFFD4',\n azure: '#F0FFFF',\n beige: '#F5F5DC',\n bisque: '#FFE4C4',\n black: '#000000',\n blanchedalmond: '#FFEBCD',\n blue: '#0000FF',\n blueviolet: '#8A2BE2',\n brown: '#A52A2A',\n burlywood: '#DEB887',\n cadetblue: '#5F9EA0',\n chartreuse: '#7FFF00',\n chocolate: '#D2691E',\n coral: '#FF7F50',\n cornflowerblue: '#6495ED',\n cornsilk: '#FFF8DC',\n crimson: '#DC143C',\n cyan: '#00FFFF',\n darkblue: '#00008B',\n darkcyan: '#008B8B',\n darkgoldenrod: '#B8860B',\n darkgray: '#A9A9A9',\n darkgrey: '#A9A9A9',\n darkgreen: '#006400',\n darkkhaki: '#BDB76B',\n darkmagenta: '#8B008B',\n darkolivegreen: '#556B2F',\n darkorange: '#FF8C00',\n darkorchid: '#9932CC',\n darkred: '#8B0000',\n darksalmon: '#E9967A',\n darkseagreen: '#8FBC8F',\n darkslateblue: '#483D8B',\n darkslategray: '#2F4F4F',\n darkslategrey: '#2F4F4F',\n darkturquoise: '#00CED1',\n darkviolet: '#9400D3',\n deeppink: '#FF1493',\n deepskyblue: '#00BFFF',\n dimgray: '#696969',\n dimgrey: '#696969',\n dodgerblue: '#1E90FF',\n firebrick: '#B22222',\n floralwhite: '#FFFAF0',\n forestgreen: '#228B22',\n fuchsia: '#FF00FF',\n gainsboro: '#DCDCDC',\n ghostwhite: '#F8F8FF',\n gold: '#FFD700',\n goldenrod: '#DAA520',\n gray: '#808080',\n grey: '#808080',\n green: '#008000',\n greenyellow: '#ADFF2F',\n honeydew: '#F0FFF0',\n hotpink: '#FF69B4',\n indianred: '#CD5C5C',\n indigo: '#4B0082',\n ivory: '#FFFFF0',\n khaki: '#F0E68C',\n lavender: '#E6E6FA',\n lavenderblush: '#FFF0F5',\n lawngreen: '#7CFC00',\n lemonchiffon: '#FFFACD',\n lightblue: '#ADD8E6',\n lightcoral: '#F08080',\n lightcyan: '#E0FFFF',\n lightgoldenrodyellow: '#FAFAD2',\n lightgray: '#D3D3D3',\n lightgrey: '#D3D3D3',\n lightgreen: '#90EE90',\n lightpink: '#FFB6C1',\n lightsalmon: '#FFA07A',\n lightseagreen: '#20B2AA',\n lightskyblue: '#87CEFA',\n lightslategray: '#778899',\n lightslategrey: '#778899',\n lightsteelblue: '#B0C4DE',\n lightyellow: '#FFFFE0',\n lime: '#00FF00',\n limegreen: '#32CD32',\n linen: '#FAF0E6',\n magenta: '#FF00FF',\n maroon: '#800000',\n mediumaquamarine: '#66CDAA',\n mediumblue: '#0000CD',\n mediumorchid: '#BA55D3',\n mediumpurple: '#9370DB',\n mediumseagreen: '#3CB371',\n mediumslateblue: '#7B68EE',\n mediumspringgreen: '#00FA9A',\n mediumturquoise: '#48D1CC',\n mediumvioletred: '#C71585',\n midnightblue: '#191970',\n mintcream: '#F5FFFA',\n mistyrose: '#FFE4E1',\n moccasin: '#FFE4B5',\n navajowhite: '#FFDEAD',\n navy: '#000080',\n oldlace: '#FDF5E6',\n olive: '#808000',\n olivedrab: '#6B8E23',\n orange: '#FFA500',\n orangered: '#FF4500',\n orchid: '#DA70D6',\n palegoldenrod: '#EEE8AA',\n palegreen: '#98FB98',\n paleturquoise: '#AFEEEE',\n palevioletred: '#DB7093',\n papayawhip: '#FFEFD5',\n peachpuff: '#FFDAB9',\n peru: '#CD853F',\n pink: '#FFC0CB',\n plum: '#DDA0DD',\n powderblue: '#B0E0E6',\n purple: '#800080',\n rebeccapurple: '#663399',\n red: '#FF0000',\n rosybrown: '#BC8F8F',\n royalblue: '#4169E1',\n saddlebrown: '#8B4513',\n salmon: '#FA8072',\n sandybrown: '#F4A460',\n seagreen: '#2E8B57',\n seashell: '#FFF5EE',\n sienna: '#A0522D',\n silver: '#C0C0C0',\n skyblue: '#87CEEB',\n slateblue: '#6A5ACD',\n slategray: '#708090',\n slategrey: '#708090',\n snow: '#FFFAFA',\n springgreen: '#00FF7F',\n steelblue: '#4682B4',\n tan: '#D2B48C',\n teal: '#008080',\n thistle: '#D8BFD8',\n tomato: '#FF6347',\n turquoise: '#40E0D0',\n violet: '#EE82EE',\n wheat: '#F5DEB3',\n white: '#FFFFFF',\n whitesmoke: '#F5F5F5',\n yellow: '#FFFF00',\n yellowgreen: '#9ACD32'\n };\n\n /**\n * @private\n * @param {Number} p\n * @param {Number} q\n * @param {Number} t\n * @return {Number}\n */\n function hue2rgb(p, q, t) {\n if (t < 0) {\n t += 1;\n }\n if (t > 1) {\n t -= 1;\n }\n if (t < 1 / 6) {\n return p + (q - p) * 6 * t;\n }\n if (t < 1 / 2) {\n return q;\n }\n if (t < 2 / 3) {\n return p + (q - p) * (2 / 3 - t) * 6;\n }\n return p;\n }\n\n /**\n * Returns new color object, when given a color in RGB format\n * @memberOf fabric.Color\n * @param {String} color Color value ex: rgb(0-255,0-255,0-255)\n * @return {fabric.Color}\n */\n fabric.Color.fromRgb = function(color) {\n return Color.fromSource(Color.sourceFromRgb(color));\n };\n\n /**\n * Returns array representation (ex: [100, 100, 200, 1]) of a color that's in RGB or RGBA format\n * @memberOf fabric.Color\n * @param {String} color Color value ex: rgb(0-255,0-255,0-255), rgb(0%-100%,0%-100%,0%-100%)\n * @return {Array} source\n */\n fabric.Color.sourceFromRgb = function(color) {\n var match = color.match(Color.reRGBa);\n if (match) {\n var r = parseInt(match[1], 10) / (/%$/.test(match[1]) ? 100 : 1) * (/%$/.test(match[1]) ? 255 : 1),\n g = parseInt(match[2], 10) / (/%$/.test(match[2]) ? 100 : 1) * (/%$/.test(match[2]) ? 255 : 1),\n b = parseInt(match[3], 10) / (/%$/.test(match[3]) ? 100 : 1) * (/%$/.test(match[3]) ? 255 : 1);\n\n return [\n parseInt(r, 10),\n parseInt(g, 10),\n parseInt(b, 10),\n match[4] ? parseFloat(match[4]) : 1\n ];\n }\n };\n\n /**\n * Returns new color object, when given a color in RGBA format\n * @static\n * @function\n * @memberOf fabric.Color\n * @param {String} color\n * @return {fabric.Color}\n */\n fabric.Color.fromRgba = Color.fromRgb;\n\n /**\n * Returns new color object, when given a color in HSL format\n * @param {String} color Color value ex: hsl(0-260,0%-100%,0%-100%)\n * @memberOf fabric.Color\n * @return {fabric.Color}\n */\n fabric.Color.fromHsl = function(color) {\n return Color.fromSource(Color.sourceFromHsl(color));\n };\n\n /**\n * Returns array representation (ex: [100, 100, 200, 1]) of a color that's in HSL or HSLA format.\n * Adapted from https://github.com/mjijackson\n * @memberOf fabric.Color\n * @param {String} color Color value ex: hsl(0-360,0%-100%,0%-100%) or hsla(0-360,0%-100%,0%-100%, 0-1)\n * @return {Array} source\n * @see http://http://www.w3.org/TR/css3-color/#hsl-color\n */\n fabric.Color.sourceFromHsl = function(color) {\n var match = color.match(Color.reHSLa);\n if (!match) {\n return;\n }\n\n var h = (((parseFloat(match[1]) % 360) + 360) % 360) / 360,\n s = parseFloat(match[2]) / (/%$/.test(match[2]) ? 100 : 1),\n l = parseFloat(match[3]) / (/%$/.test(match[3]) ? 100 : 1),\n r, g, b;\n\n if (s === 0) {\n r = g = b = l;\n }\n else {\n var q = l <= 0.5 ? l * (s + 1) : l + s - l * s,\n p = l * 2 - q;\n\n r = hue2rgb(p, q, h + 1 / 3);\n g = hue2rgb(p, q, h);\n b = hue2rgb(p, q, h - 1 / 3);\n }\n\n return [\n Math.round(r * 255),\n Math.round(g * 255),\n Math.round(b * 255),\n match[4] ? parseFloat(match[4]) : 1\n ];\n };\n\n /**\n * Returns new color object, when given a color in HSLA format\n * @static\n * @function\n * @memberOf fabric.Color\n * @param {String} color\n * @return {fabric.Color}\n */\n fabric.Color.fromHsla = Color.fromHsl;\n\n /**\n * Returns new color object, when given a color in HEX format\n * @static\n * @memberOf fabric.Color\n * @param {String} color Color value ex: FF5555\n * @return {fabric.Color}\n */\n fabric.Color.fromHex = function(color) {\n return Color.fromSource(Color.sourceFromHex(color));\n };\n\n /**\n * Returns array representation (ex: [100, 100, 200, 1]) of a color that's in HEX format\n * @static\n * @memberOf fabric.Color\n * @param {String} color ex: FF5555 or FF5544CC (RGBa)\n * @return {Array} source\n */\n fabric.Color.sourceFromHex = function(color) {\n if (color.match(Color.reHex)) {\n var value = color.slice(color.indexOf('#') + 1),\n isShortNotation = (value.length === 3 || value.length === 4),\n isRGBa = (value.length === 8 || value.length === 4),\n r = isShortNotation ? (value.charAt(0) + value.charAt(0)) : value.substring(0, 2),\n g = isShortNotation ? (value.charAt(1) + value.charAt(1)) : value.substring(2, 4),\n b = isShortNotation ? (value.charAt(2) + value.charAt(2)) : value.substring(4, 6),\n a = isRGBa ? (isShortNotation ? (value.charAt(3) + value.charAt(3)) : value.substring(6, 8)) : 'FF';\n\n return [\n parseInt(r, 16),\n parseInt(g, 16),\n parseInt(b, 16),\n parseFloat((parseInt(a, 16) / 255).toFixed(2))\n ];\n }\n };\n\n /**\n * Returns new color object, when given color in array representation (ex: [200, 100, 100, 0.5])\n * @static\n * @memberOf fabric.Color\n * @param {Array} source\n * @return {fabric.Color}\n */\n fabric.Color.fromSource = function(source) {\n var oColor = new Color();\n oColor.setSource(source);\n return oColor;\n };\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n scaleMap = ['e', 'se', 's', 'sw', 'w', 'nw', 'n', 'ne', 'e'],\n skewMap = ['ns', 'nesw', 'ew', 'nwse'],\n controls = {},\n LEFT = 'left', TOP = 'top', RIGHT = 'right', BOTTOM = 'bottom', CENTER = 'center',\n opposite = {\n top: BOTTOM,\n bottom: TOP,\n left: RIGHT,\n right: LEFT,\n center: CENTER,\n }, radiansToDegrees = fabric.util.radiansToDegrees,\n sign = (Math.sign || function(x) { return ((x > 0) - (x < 0)) || +x; });\n\n /**\n * Combine control position and object angle to find the control direction compared\n * to the object center.\n * @param {fabric.Object} fabricObject the fabric object for which we are rendering controls\n * @param {fabric.Control} control the control class\n * @return {Number} 0 - 7 a quadrant number\n */\n function findCornerQuadrant(fabricObject, control) {\n var cornerAngle = fabricObject.angle + radiansToDegrees(Math.atan2(control.y, control.x)) + 360;\n return Math.round((cornerAngle % 360) / 45);\n }\n\n function fireEvent(eventName, options) {\n var target = options.transform.target,\n canvas = target.canvas,\n canvasOptions = fabric.util.object.clone(options);\n canvasOptions.target = target;\n canvas && canvas.fire('object:' + eventName, canvasOptions);\n target.fire(eventName, options);\n }\n\n /**\n * Inspect event and fabricObject properties to understand if the scaling action\n * @param {Event} eventData from the user action\n * @param {fabric.Object} fabricObject the fabric object about to scale\n * @return {Boolean} true if scale is proportional\n */\n function scaleIsProportional(eventData, fabricObject) {\n var canvas = fabricObject.canvas, uniScaleKey = canvas.uniScaleKey,\n uniformIsToggled = eventData[uniScaleKey];\n return (canvas.uniformScaling && !uniformIsToggled) ||\n (!canvas.uniformScaling && uniformIsToggled);\n }\n\n /**\n * Checks if transform is centered\n * @param {Object} transform transform data\n * @return {Boolean} true if transform is centered\n */\n function isTransformCentered(transform) {\n return transform.originX === CENTER && transform.originY === CENTER;\n }\n\n /**\n * Inspect fabricObject to understand if the current scaling action is allowed\n * @param {fabric.Object} fabricObject the fabric object about to scale\n * @param {String} by 'x' or 'y' or ''\n * @param {Boolean} scaleProportionally true if we are trying to scale proportionally\n * @return {Boolean} true if scaling is not allowed at current conditions\n */\n function scalingIsForbidden(fabricObject, by, scaleProportionally) {\n var lockX = fabricObject.lockScalingX, lockY = fabricObject.lockScalingY;\n if (lockX && lockY) {\n return true;\n }\n if (!by && (lockX || lockY) && scaleProportionally) {\n return true;\n }\n if (lockX && by === 'x') {\n return true;\n }\n if (lockY && by === 'y') {\n return true;\n }\n return false;\n }\n\n /**\n * return the correct cursor style for the scale action\n * @param {Event} eventData the javascript event that is causing the scale\n * @param {fabric.Control} control the control that is interested in the action\n * @param {fabric.Object} fabricObject the fabric object that is interested in the action\n * @return {String} a valid css string for the cursor\n */\n function scaleCursorStyleHandler(eventData, control, fabricObject) {\n var notAllowed = 'not-allowed',\n scaleProportionally = scaleIsProportional(eventData, fabricObject),\n by = '';\n if (control.x !== 0 && control.y === 0) {\n by = 'x';\n }\n else if (control.x === 0 && control.y !== 0) {\n by = 'y';\n }\n if (scalingIsForbidden(fabricObject, by, scaleProportionally)) {\n return notAllowed;\n }\n var n = findCornerQuadrant(fabricObject, control);\n return scaleMap[n] + '-resize';\n }\n\n /**\n * return the correct cursor style for the skew action\n * @param {Event} eventData the javascript event that is causing the scale\n * @param {fabric.Control} control the control that is interested in the action\n * @param {fabric.Object} fabricObject the fabric object that is interested in the action\n * @return {String} a valid css string for the cursor\n */\n function skewCursorStyleHandler(eventData, control, fabricObject) {\n var notAllowed = 'not-allowed';\n if (control.x !== 0 && fabricObject.lockSkewingY) {\n return notAllowed;\n }\n if (control.y !== 0 && fabricObject.lockSkewingX) {\n return notAllowed;\n }\n var n = findCornerQuadrant(fabricObject, control) % 4;\n return skewMap[n] + '-resize';\n }\n\n /**\n * Combine skew and scale style handlers to cover fabric standard use case\n * @param {Event} eventData the javascript event that is causing the scale\n * @param {fabric.Control} control the control that is interested in the action\n * @param {fabric.Object} fabricObject the fabric object that is interested in the action\n * @return {String} a valid css string for the cursor\n */\n function scaleSkewCursorStyleHandler(eventData, control, fabricObject) {\n if (eventData[fabricObject.canvas.altActionKey]) {\n return controls.skewCursorStyleHandler(eventData, control, fabricObject);\n }\n return controls.scaleCursorStyleHandler(eventData, control, fabricObject);\n }\n\n /**\n * Inspect event, control and fabricObject to return the correct action name\n * @param {Event} eventData the javascript event that is causing the scale\n * @param {fabric.Control} control the control that is interested in the action\n * @param {fabric.Object} fabricObject the fabric object that is interested in the action\n * @return {String} an action name\n */\n function scaleOrSkewActionName(eventData, control, fabricObject) {\n var isAlternative = eventData[fabricObject.canvas.altActionKey];\n if (control.x === 0) {\n // then is scaleY or skewX\n return isAlternative ? 'skewX' : 'scaleY';\n }\n if (control.y === 0) {\n // then is scaleY or skewX\n return isAlternative ? 'skewY' : 'scaleX';\n }\n }\n\n /**\n * Find the correct style for the control that is used for rotation.\n * this function is very simple and it just take care of not-allowed or standard cursor\n * @param {Event} eventData the javascript event that is causing the scale\n * @param {fabric.Control} control the control that is interested in the action\n * @param {fabric.Object} fabricObject the fabric object that is interested in the action\n * @return {String} a valid css string for the cursor\n */\n function rotationStyleHandler(eventData, control, fabricObject) {\n if (fabricObject.lockRotation) {\n return 'not-allowed';\n }\n return control.cursorStyle;\n }\n\n function commonEventInfo(eventData, transform, x, y) {\n return {\n e: eventData,\n transform: transform,\n pointer: {\n x: x,\n y: y,\n }\n };\n }\n\n /**\n * Wrap an action handler with saving/restoring object position on the transform.\n * this is the code that permits to objects to keep their position while transforming.\n * @param {Function} actionHandler the function to wrap\n * @return {Function} a function with an action handler signature\n */\n function wrapWithFixedAnchor(actionHandler) {\n return function(eventData, transform, x, y) {\n var target = transform.target, centerPoint = target.getCenterPoint(),\n constraint = target.translateToOriginPoint(centerPoint, transform.originX, transform.originY),\n actionPerformed = actionHandler(eventData, transform, x, y);\n target.setPositionByOrigin(constraint, transform.originX, transform.originY);\n return actionPerformed;\n };\n }\n\n /**\n * Wrap an action handler with firing an event if the action is performed\n * @param {Function} actionHandler the function to wrap\n * @return {Function} a function with an action handler signature\n */\n function wrapWithFireEvent(eventName, actionHandler) {\n return function(eventData, transform, x, y) {\n var actionPerformed = actionHandler(eventData, transform, x, y);\n if (actionPerformed) {\n fireEvent(eventName, commonEventInfo(eventData, transform, x, y));\n }\n return actionPerformed;\n };\n }\n\n /**\n * Transforms a point described by x and y in a distance from the top left corner of the object\n * bounding box.\n * @param {Object} transform\n * @param {String} originX\n * @param {String} originY\n * @param {number} x\n * @param {number} y\n * @return {Fabric.Point} the normalized point\n */\n function getLocalPoint(transform, originX, originY, x, y) {\n var target = transform.target,\n control = target.controls[transform.corner],\n zoom = target.canvas.getZoom(),\n padding = target.padding / zoom,\n localPoint = target.toLocalPoint(new fabric.Point(x, y), originX, originY);\n if (localPoint.x >= padding) {\n localPoint.x -= padding;\n }\n if (localPoint.x <= -padding) {\n localPoint.x += padding;\n }\n if (localPoint.y >= padding) {\n localPoint.y -= padding;\n }\n if (localPoint.y <= padding) {\n localPoint.y += padding;\n }\n localPoint.x -= control.offsetX;\n localPoint.y -= control.offsetY;\n return localPoint;\n }\n\n /**\n * Detect if the fabric object is flipped on one side.\n * @param {fabric.Object} target\n * @return {Boolean} true if one flip, but not two.\n */\n function targetHasOneFlip(target) {\n return target.flipX !== target.flipY;\n }\n\n /**\n * Utility function to compensate the scale factor when skew is applied on both axes\n * @private\n */\n function compensateScaleForSkew(target, oppositeSkew, scaleToCompensate, axis, reference) {\n if (target[oppositeSkew] !== 0) {\n var newDim = target._getTransformedDimensions()[axis];\n var newValue = reference / newDim * target[scaleToCompensate];\n target.set(scaleToCompensate, newValue);\n }\n }\n\n /**\n * Action handler for skewing on the X axis\n * @private\n */\n function skewObjectX(eventData, transform, x, y) {\n var target = transform.target,\n // find how big the object would be, if there was no skewX. takes in account scaling\n dimNoSkew = target._getTransformedDimensions(0, target.skewY),\n localPoint = getLocalPoint(transform, transform.originX, transform.originY, x, y),\n // the mouse is in the center of the object, and we want it to stay there.\n // so the object will grow twice as much as the mouse.\n // this makes the skew growth to localPoint * 2 - dimNoSkew.\n totalSkewSize = Math.abs(localPoint.x * 2) - dimNoSkew.x,\n currentSkew = target.skewX, newSkew;\n if (totalSkewSize < 2) {\n // let's make it easy to go back to position 0.\n newSkew = 0;\n }\n else {\n newSkew = radiansToDegrees(\n Math.atan2((totalSkewSize / target.scaleX), (dimNoSkew.y / target.scaleY))\n );\n // now we have to find the sign of the skew.\n // it mostly depend on the origin of transformation.\n if (transform.originX === LEFT && transform.originY === BOTTOM) {\n newSkew = -newSkew;\n }\n if (transform.originX === RIGHT && transform.originY === TOP) {\n newSkew = -newSkew;\n }\n if (targetHasOneFlip(target)) {\n newSkew = -newSkew;\n }\n }\n var hasSkewed = currentSkew !== newSkew;\n if (hasSkewed) {\n var dimBeforeSkewing = target._getTransformedDimensions().y;\n target.set('skewX', newSkew);\n compensateScaleForSkew(target, 'skewY', 'scaleY', 'y', dimBeforeSkewing);\n }\n return hasSkewed;\n }\n\n /**\n * Action handler for skewing on the Y axis\n * @private\n */\n function skewObjectY(eventData, transform, x, y) {\n var target = transform.target,\n // find how big the object would be, if there was no skewX. takes in account scaling\n dimNoSkew = target._getTransformedDimensions(target.skewX, 0),\n localPoint = getLocalPoint(transform, transform.originX, transform.originY, x, y),\n // the mouse is in the center of the object, and we want it to stay there.\n // so the object will grow twice as much as the mouse.\n // this makes the skew growth to localPoint * 2 - dimNoSkew.\n totalSkewSize = Math.abs(localPoint.y * 2) - dimNoSkew.y,\n currentSkew = target.skewY, newSkew;\n if (totalSkewSize < 2) {\n // let's make it easy to go back to position 0.\n newSkew = 0;\n }\n else {\n newSkew = radiansToDegrees(\n Math.atan2((totalSkewSize / target.scaleY), (dimNoSkew.x / target.scaleX))\n );\n // now we have to find the sign of the skew.\n // it mostly depend on the origin of transformation.\n if (transform.originX === LEFT && transform.originY === BOTTOM) {\n newSkew = -newSkew;\n }\n if (transform.originX === RIGHT && transform.originY === TOP) {\n newSkew = -newSkew;\n }\n if (targetHasOneFlip(target)) {\n newSkew = -newSkew;\n }\n }\n var hasSkewed = currentSkew !== newSkew;\n if (hasSkewed) {\n var dimBeforeSkewing = target._getTransformedDimensions().x;\n target.set('skewY', newSkew);\n compensateScaleForSkew(target, 'skewX', 'scaleX', 'x', dimBeforeSkewing);\n }\n return hasSkewed;\n }\n\n /**\n * Wrapped Action handler for skewing on the Y axis, takes care of the\n * skew direction and determine the correct transform origin for the anchor point\n * @param {Event} eventData javascript event that is doing the transform\n * @param {Object} transform javascript object containing a series of information around the current transform\n * @param {number} x current mouse x position, canvas normalized\n * @param {number} y current mouse y position, canvas normalized\n * @return {Boolean} true if some change happened\n */\n function skewHandlerX(eventData, transform, x, y) {\n // step1 figure out and change transform origin.\n // if skewX > 0 and originY bottom we anchor on right\n // if skewX > 0 and originY top we anchor on left\n // if skewX < 0 and originY bottom we anchor on left\n // if skewX < 0 and originY top we anchor on right\n // if skewX is 0, we look for mouse position to understand where are we going.\n var target = transform.target, currentSkew = target.skewX, originX, originY = transform.originY;\n if (target.lockSkewingX) {\n return false;\n }\n if (currentSkew === 0) {\n var localPointFromCenter = getLocalPoint(transform, CENTER, CENTER, x, y);\n if (localPointFromCenter.x > 0) {\n // we are pulling right, anchor left;\n originX = LEFT;\n }\n else {\n // we are pulling right, anchor right\n originX = RIGHT;\n }\n }\n else {\n if (currentSkew > 0) {\n originX = originY === TOP ? LEFT : RIGHT;\n }\n if (currentSkew < 0) {\n originX = originY === TOP ? RIGHT : LEFT;\n }\n // is the object flipped on one side only? swap the origin.\n if (targetHasOneFlip(target)) {\n originX = originX === LEFT ? RIGHT : LEFT;\n }\n }\n\n // once we have the origin, we find the anchor point\n transform.originX = originX;\n var finalHandler = wrapWithFireEvent('skewing', wrapWithFixedAnchor(skewObjectX));\n return finalHandler(eventData, transform, x, y);\n }\n\n /**\n * Wrapped Action handler for skewing on the Y axis, takes care of the\n * skew direction and determine the correct transform origin for the anchor point\n * @param {Event} eventData javascript event that is doing the transform\n * @param {Object} transform javascript object containing a series of information around the current transform\n * @param {number} x current mouse x position, canvas normalized\n * @param {number} y current mouse y position, canvas normalized\n * @return {Boolean} true if some change happened\n */\n function skewHandlerY(eventData, transform, x, y) {\n // step1 figure out and change transform origin.\n // if skewY > 0 and originX left we anchor on top\n // if skewY > 0 and originX right we anchor on bottom\n // if skewY < 0 and originX left we anchor on bottom\n // if skewY < 0 and originX right we anchor on top\n // if skewY is 0, we look for mouse position to understand where are we going.\n var target = transform.target, currentSkew = target.skewY, originY, originX = transform.originX;\n if (target.lockSkewingY) {\n return false;\n }\n if (currentSkew === 0) {\n var localPointFromCenter = getLocalPoint(transform, CENTER, CENTER, x, y);\n if (localPointFromCenter.y > 0) {\n // we are pulling down, anchor up;\n originY = TOP;\n }\n else {\n // we are pulling up, anchor down\n originY = BOTTOM;\n }\n }\n else {\n if (currentSkew > 0) {\n originY = originX === LEFT ? TOP : BOTTOM;\n }\n if (currentSkew < 0) {\n originY = originX === LEFT ? BOTTOM : TOP;\n }\n // is the object flipped on one side only? swap the origin.\n if (targetHasOneFlip(target)) {\n originY = originY === TOP ? BOTTOM : TOP;\n }\n }\n\n // once we have the origin, we find the anchor point\n transform.originY = originY;\n var finalHandler = wrapWithFireEvent('skewing', wrapWithFixedAnchor(skewObjectY));\n return finalHandler(eventData, transform, x, y);\n }\n\n /**\n * Action handler for rotation and snapping, without anchor point.\n * Needs to be wrapped with `wrapWithFixedAnchor` to be effective\n * @param {Event} eventData javascript event that is doing the transform\n * @param {Object} transform javascript object containing a series of information around the current transform\n * @param {number} x current mouse x position, canvas normalized\n * @param {number} y current mouse y position, canvas normalized\n * @return {Boolean} true if some change happened\n * @private\n */\n function rotationWithSnapping(eventData, transform, x, y) {\n var t = transform,\n target = t.target,\n pivotPoint = target.translateToOriginPoint(target.getCenterPoint(), t.originX, t.originY);\n\n if (target.lockRotation) {\n return false;\n }\n\n var lastAngle = Math.atan2(t.ey - pivotPoint.y, t.ex - pivotPoint.x),\n curAngle = Math.atan2(y - pivotPoint.y, x - pivotPoint.x),\n angle = radiansToDegrees(curAngle - lastAngle + t.theta),\n hasRotated = true;\n\n if (target.snapAngle > 0) {\n var snapAngle = target.snapAngle,\n snapThreshold = target.snapThreshold || snapAngle,\n rightAngleLocked = Math.ceil(angle / snapAngle) * snapAngle,\n leftAngleLocked = Math.floor(angle / snapAngle) * snapAngle;\n\n if (Math.abs(angle - leftAngleLocked) < snapThreshold) {\n angle = leftAngleLocked;\n }\n else if (Math.abs(angle - rightAngleLocked) < snapThreshold) {\n angle = rightAngleLocked;\n }\n }\n\n // normalize angle to positive value\n if (angle < 0) {\n angle = 360 + angle;\n }\n angle %= 360;\n\n hasRotated = target.angle !== angle;\n target.angle = angle;\n return hasRotated;\n }\n\n /**\n * Basic scaling logic, reused with different constrain for scaling X,Y, freely or equally.\n * Needs to be wrapped with `wrapWithFixedAnchor` to be effective\n * @param {Event} eventData javascript event that is doing the transform\n * @param {Object} transform javascript object containing a series of information around the current transform\n * @param {number} x current mouse x position, canvas normalized\n * @param {number} y current mouse y position, canvas normalized\n * @param {Object} options additional information for scaling\n * @param {String} options.by 'x', 'y', 'equally' or '' to indicate type of scaling\n * @return {Boolean} true if some change happened\n * @private\n */\n function scaleObject(eventData, transform, x, y, options) {\n options = options || {};\n var target = transform.target,\n lockScalingX = target.lockScalingX, lockScalingY = target.lockScalingY,\n by = options.by, newPoint, scaleX, scaleY, dim,\n scaleProportionally = scaleIsProportional(eventData, target),\n forbidScaling = scalingIsForbidden(target, by, scaleProportionally),\n signX, signY, gestureScale = transform.gestureScale;\n\n if (forbidScaling) {\n return false;\n }\n if (gestureScale) {\n scaleX = transform.scaleX * gestureScale;\n scaleY = transform.scaleY * gestureScale;\n }\n else {\n newPoint = getLocalPoint(transform, transform.originX, transform.originY, x, y);\n // use of sign: We use sign to detect change of direction of an action. sign usually change when\n // we cross the origin point with the mouse. So a scale flip for example. There is an issue when scaling\n // by center and scaling using one middle control ( default: mr, mt, ml, mb), the mouse movement can easily\n // cross many time the origin point and flip the object. so we need a way to filter out the noise.\n // This ternary here should be ok to filter out X scaling when we want Y only and vice versa.\n signX = by !== 'y' ? sign(newPoint.x) : 1;\n signY = by !== 'x' ? sign(newPoint.y) : 1;\n if (!transform.signX) {\n transform.signX = signX;\n }\n if (!transform.signY) {\n transform.signY = signY;\n }\n\n if (target.lockScalingFlip &&\n (transform.signX !== signX || transform.signY !== signY)\n ) {\n return false;\n }\n\n dim = target._getTransformedDimensions();\n // missing detection of flip and logic to switch the origin\n if (scaleProportionally && !by) {\n // uniform scaling\n var distance = Math.abs(newPoint.x) + Math.abs(newPoint.y),\n original = transform.original,\n originalDistance = Math.abs(dim.x * original.scaleX / target.scaleX) +\n Math.abs(dim.y * original.scaleY / target.scaleY),\n scale = distance / originalDistance;\n scaleX = original.scaleX * scale;\n scaleY = original.scaleY * scale;\n }\n else {\n scaleX = Math.abs(newPoint.x * target.scaleX / dim.x);\n scaleY = Math.abs(newPoint.y * target.scaleY / dim.y);\n }\n // if we are scaling by center, we need to double the scale\n if (isTransformCentered(transform)) {\n scaleX *= 2;\n scaleY *= 2;\n }\n if (transform.signX !== signX && by !== 'y') {\n transform.originX = opposite[transform.originX];\n scaleX *= -1;\n transform.signX = signX;\n }\n if (transform.signY !== signY && by !== 'x') {\n transform.originY = opposite[transform.originY];\n scaleY *= -1;\n transform.signY = signY;\n }\n }\n // minScale is taken are in the setter.\n var oldScaleX = target.scaleX, oldScaleY = target.scaleY;\n if (!by) {\n !lockScalingX && target.set('scaleX', scaleX);\n !lockScalingY && target.set('scaleY', scaleY);\n }\n else {\n // forbidden cases already handled on top here.\n by === 'x' && target.set('scaleX', scaleX);\n by === 'y' && target.set('scaleY', scaleY);\n }\n return oldScaleX !== target.scaleX || oldScaleY !== target.scaleY;\n }\n\n /**\n * Generic scaling logic, to scale from corners either equally or freely.\n * Needs to be wrapped with `wrapWithFixedAnchor` to be effective\n * @param {Event} eventData javascript event that is doing the transform\n * @param {Object} transform javascript object containing a series of information around the current transform\n * @param {number} x current mouse x position, canvas normalized\n * @param {number} y current mouse y position, canvas normalized\n * @return {Boolean} true if some change happened\n */\n function scaleObjectFromCorner(eventData, transform, x, y) {\n return scaleObject(eventData, transform, x, y);\n }\n\n /**\n * Scaling logic for the X axis.\n * Needs to be wrapped with `wrapWithFixedAnchor` to be effective\n * @param {Event} eventData javascript event that is doing the transform\n * @param {Object} transform javascript object containing a series of information around the current transform\n * @param {number} x current mouse x position, canvas normalized\n * @param {number} y current mouse y position, canvas normalized\n * @return {Boolean} true if some change happened\n */\n function scaleObjectX(eventData, transform, x, y) {\n return scaleObject(eventData, transform, x, y , { by: 'x' });\n }\n\n /**\n * Scaling logic for the Y axis.\n * Needs to be wrapped with `wrapWithFixedAnchor` to be effective\n * @param {Event} eventData javascript event that is doing the transform\n * @param {Object} transform javascript object containing a series of information around the current transform\n * @param {number} x current mouse x position, canvas normalized\n * @param {number} y current mouse y position, canvas normalized\n * @return {Boolean} true if some change happened\n */\n function scaleObjectY(eventData, transform, x, y) {\n return scaleObject(eventData, transform, x, y , { by: 'y' });\n }\n\n /**\n * Composed action handler to either scale Y or skew X\n * Needs to be wrapped with `wrapWithFixedAnchor` to be effective\n * @param {Event} eventData javascript event that is doing the transform\n * @param {Object} transform javascript object containing a series of information around the current transform\n * @param {number} x current mouse x position, canvas normalized\n * @param {number} y current mouse y position, canvas normalized\n * @return {Boolean} true if some change happened\n */\n function scalingYOrSkewingX(eventData, transform, x, y) {\n // ok some safety needed here.\n if (eventData[transform.target.canvas.altActionKey]) {\n return controls.skewHandlerX(eventData, transform, x, y);\n }\n return controls.scalingY(eventData, transform, x, y);\n }\n\n /**\n * Composed action handler to either scale X or skew Y\n * Needs to be wrapped with `wrapWithFixedAnchor` to be effective\n * @param {Event} eventData javascript event that is doing the transform\n * @param {Object} transform javascript object containing a series of information around the current transform\n * @param {number} x current mouse x position, canvas normalized\n * @param {number} y current mouse y position, canvas normalized\n * @return {Boolean} true if some change happened\n */\n function scalingXOrSkewingY(eventData, transform, x, y) {\n // ok some safety needed here.\n if (eventData[transform.target.canvas.altActionKey]) {\n return controls.skewHandlerY(eventData, transform, x, y);\n }\n return controls.scalingX(eventData, transform, x, y);\n }\n\n /**\n * Action handler to change textbox width\n * Needs to be wrapped with `wrapWithFixedAnchor` to be effective\n * @param {Event} eventData javascript event that is doing the transform\n * @param {Object} transform javascript object containing a series of information around the current transform\n * @param {number} x current mouse x position, canvas normalized\n * @param {number} y current mouse y position, canvas normalized\n * @return {Boolean} true if some change happened\n */\n function changeWidth(eventData, transform, x, y) {\n var target = transform.target, localPoint = getLocalPoint(transform, transform.originX, transform.originY, x, y),\n strokePadding = target.strokeWidth / (target.strokeUniform ? target.scaleX : 1),\n multiplier = isTransformCentered(transform) ? 2 : 1,\n oldWidth = target.width,\n newWidth = Math.abs(localPoint.x * multiplier / target.scaleX) - strokePadding;\n target.set('width', Math.max(newWidth, 0));\n return oldWidth !== newWidth;\n }\n\n /**\n * Action handler\n * @private\n * @param {Event} eventData javascript event that is doing the transform\n * @param {Object} transform javascript object containing a series of information around the current transform\n * @param {number} x current mouse x position, canvas normalized\n * @param {number} y current mouse y position, canvas normalized\n * @return {Boolean} true if the translation occurred\n */\n function dragHandler(eventData, transform, x, y) {\n var target = transform.target,\n newLeft = x - transform.offsetX,\n newTop = y - transform.offsetY,\n moveX = !target.get('lockMovementX') && target.left !== newLeft,\n moveY = !target.get('lockMovementY') && target.top !== newTop;\n moveX && target.set('left', newLeft);\n moveY && target.set('top', newTop);\n if (moveX || moveY) {\n fireEvent('moving', commonEventInfo(eventData, transform, x, y));\n }\n return moveX || moveY;\n }\n\n controls.scaleCursorStyleHandler = scaleCursorStyleHandler;\n controls.skewCursorStyleHandler = skewCursorStyleHandler;\n controls.scaleSkewCursorStyleHandler = scaleSkewCursorStyleHandler;\n controls.rotationWithSnapping = wrapWithFireEvent('rotating', wrapWithFixedAnchor(rotationWithSnapping));\n controls.scalingEqually = wrapWithFireEvent('scaling', wrapWithFixedAnchor( scaleObjectFromCorner));\n controls.scalingX = wrapWithFireEvent('scaling', wrapWithFixedAnchor(scaleObjectX));\n controls.scalingY = wrapWithFireEvent('scaling', wrapWithFixedAnchor(scaleObjectY));\n controls.scalingYOrSkewingX = scalingYOrSkewingX;\n controls.scalingXOrSkewingY = scalingXOrSkewingY;\n controls.changeWidth = wrapWithFireEvent('resizing', wrapWithFixedAnchor(changeWidth));\n controls.skewHandlerX = skewHandlerX;\n controls.skewHandlerY = skewHandlerY;\n controls.dragHandler = dragHandler;\n controls.scaleOrSkewActionName = scaleOrSkewActionName;\n controls.rotationStyleHandler = rotationStyleHandler;\n controls.fireEvent = fireEvent;\n controls.wrapWithFixedAnchor = wrapWithFixedAnchor;\n controls.wrapWithFireEvent = wrapWithFireEvent;\n controls.getLocalPoint = getLocalPoint;\n fabric.controlsUtils = controls;\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n degreesToRadians = fabric.util.degreesToRadians,\n controls = fabric.controlsUtils;\n\n /**\n * Render a round control, as per fabric features.\n * This function is written to respect object properties like transparentCorners, cornerSize\n * cornerColor, cornerStrokeColor\n * plus the addition of offsetY and offsetX.\n * @param {CanvasRenderingContext2D} ctx context to render on\n * @param {Number} left x coordinate where the control center should be\n * @param {Number} top y coordinate where the control center should be\n * @param {Object} styleOverride override for fabric.Object controls style\n * @param {fabric.Object} fabricObject the fabric object for which we are rendering controls\n */\n function renderCircleControl (ctx, left, top, styleOverride, fabricObject) {\n styleOverride = styleOverride || {};\n var xSize = this.sizeX || styleOverride.cornerSize || fabricObject.cornerSize,\n ySize = this.sizeY || styleOverride.cornerSize || fabricObject.cornerSize,\n transparentCorners = typeof styleOverride.transparentCorners !== 'undefined' ?\n styleOverride.transparentCorners : fabricObject.transparentCorners,\n methodName = transparentCorners ? 'stroke' : 'fill',\n stroke = !transparentCorners && (styleOverride.cornerStrokeColor || fabricObject.cornerStrokeColor),\n myLeft = left,\n myTop = top, size;\n ctx.save();\n ctx.fillStyle = styleOverride.cornerColor || fabricObject.cornerColor;\n ctx.strokeStyle = styleOverride.cornerStrokeColor || fabricObject.cornerStrokeColor;\n // as soon as fabric react v5, remove ie11, use proper ellipse code.\n if (xSize > ySize) {\n size = xSize;\n ctx.scale(1.0, ySize / xSize);\n myTop = top * xSize / ySize;\n }\n else if (ySize > xSize) {\n size = ySize;\n ctx.scale(xSize / ySize, 1.0);\n myLeft = left * ySize / xSize;\n }\n else {\n size = xSize;\n }\n // this is still wrong\n ctx.lineWidth = 1;\n ctx.beginPath();\n ctx.arc(myLeft, myTop, size / 2, 0, 2 * Math.PI, false);\n ctx[methodName]();\n if (stroke) {\n ctx.stroke();\n }\n ctx.restore();\n }\n\n /**\n * Render a square control, as per fabric features.\n * This function is written to respect object properties like transparentCorners, cornerSize\n * cornerColor, cornerStrokeColor\n * plus the addition of offsetY and offsetX.\n * @param {CanvasRenderingContext2D} ctx context to render on\n * @param {Number} left x coordinate where the control center should be\n * @param {Number} top y coordinate where the control center should be\n * @param {Object} styleOverride override for fabric.Object controls style\n * @param {fabric.Object} fabricObject the fabric object for which we are rendering controls\n */\n function renderSquareControl(ctx, left, top, styleOverride, fabricObject) {\n styleOverride = styleOverride || {};\n var xSize = this.sizeX || styleOverride.cornerSize || fabricObject.cornerSize,\n ySize = this.sizeY || styleOverride.cornerSize || fabricObject.cornerSize,\n transparentCorners = typeof styleOverride.transparentCorners !== 'undefined' ?\n styleOverride.transparentCorners : fabricObject.transparentCorners,\n methodName = transparentCorners ? 'stroke' : 'fill',\n stroke = !transparentCorners && (\n styleOverride.cornerStrokeColor || fabricObject.cornerStrokeColor\n ), xSizeBy2 = xSize / 2, ySizeBy2 = ySize / 2;\n ctx.save();\n ctx.fillStyle = styleOverride.cornerColor || fabricObject.cornerColor;\n ctx.strokeStyle = styleOverride.cornerStrokeColor || fabricObject.cornerStrokeColor;\n // this is still wrong\n ctx.lineWidth = 1;\n ctx.translate(left, top);\n ctx.rotate(degreesToRadians(fabricObject.angle));\n // this does not work, and fixed with ( && ) does not make sense.\n // to have real transparent corners we need the controls on upperCanvas\n // transparentCorners || ctx.clearRect(-xSizeBy2, -ySizeBy2, xSize, ySize);\n ctx[methodName + 'Rect'](-xSizeBy2, -ySizeBy2, xSize, ySize);\n if (stroke) {\n ctx.strokeRect(-xSizeBy2, -ySizeBy2, xSize, ySize);\n }\n ctx.restore();\n }\n\n controls.renderCircleControl = renderCircleControl;\n controls.renderSquareControl = renderSquareControl;\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { });\n\n function Control(options) {\n for (var i in options) {\n this[i] = options[i];\n }\n }\n\n fabric.Control = Control;\n\n fabric.Control.prototype = /** @lends fabric.Control.prototype */ {\n\n /**\n * keep track of control visibility.\n * mainly for backward compatibility.\n * if you do not want to see a control, you can remove it\n * from the controlset.\n * @type {Boolean}\n * @default true\n */\n visible: true,\n\n /**\n * Name of the action that the control will likely execute.\n * This is optional. FabricJS uses to identify what the user is doing for some\n * extra optimizations. If you are writing a custom control and you want to know\n * somewhere else in the code what is going on, you can use this string here.\n * you can also provide a custom getActionName if your control run multiple actions\n * depending on some external state.\n * default to scale since is the most common, used on 4 corners by default\n * @type {String}\n * @default 'scale'\n */\n actionName: 'scale',\n\n /**\n * Drawing angle of the control.\n * NOT used for now, but name marked as needed for internal logic\n * example: to reuse the same drawing function for different rotated controls\n * @type {Number}\n * @default 0\n */\n angle: 0,\n\n /**\n * Relative position of the control. X\n * 0,0 is the center of the Object, while -0.5 (left) or 0.5 (right) are the extremities\n * of the bounding box.\n * @type {Number}\n * @default 0\n */\n x: 0,\n\n /**\n * Relative position of the control. Y\n * 0,0 is the center of the Object, while -0.5 (top) or 0.5 (bottom) are the extremities\n * of the bounding box.\n * @type {Number}\n * @default 0\n */\n y: 0,\n\n /**\n * Horizontal offset of the control from the defined position. In pixels\n * Positive offset moves the control to the right, negative to the left.\n * It used when you want to have position of control that does not scale with\n * the bounding box. Example: rotation control is placed at x:0, y: 0.5 on\n * the boundindbox, with an offset of 30 pixels vertically. Those 30 pixels will\n * stay 30 pixels no matter how the object is big. Another example is having 2\n * controls in the corner, that stay in the same position when the object scale.\n * of the bounding box.\n * @type {Number}\n * @default 0\n */\n offsetX: 0,\n\n /**\n * Vertical offset of the control from the defined position. In pixels\n * Positive offset moves the control to the bottom, negative to the top.\n * @type {Number}\n * @default 0\n */\n offsetY: 0,\n\n /**\n * Sets the length of the control. If null, defaults to object's cornerSize.\n * Expects both sizeX and sizeY to be set when set.\n * @type {?Number}\n * @default null\n */\n sizeX: null,\n\n /**\n * Sets the height of the control. If null, defaults to object's cornerSize.\n * Expects both sizeX and sizeY to be set when set.\n * @type {?Number}\n * @default null\n */\n sizeY: null,\n\n /**\n * Sets the length of the touch area of the control. If null, defaults to object's touchCornerSize.\n * Expects both touchSizeX and touchSizeY to be set when set.\n * @type {?Number}\n * @default null\n */\n touchSizeX: null,\n\n /**\n * Sets the height of the touch area of the control. If null, defaults to object's touchCornerSize.\n * Expects both touchSizeX and touchSizeY to be set when set.\n * @type {?Number}\n * @default null\n */\n touchSizeY: null,\n\n /**\n * Css cursor style to display when the control is hovered.\n * if the method `cursorStyleHandler` is provided, this property is ignored.\n * @type {String}\n * @default 'crosshair'\n */\n cursorStyle: 'crosshair',\n\n /**\n * If controls has an offsetY or offsetX, draw a line that connects\n * the control to the bounding box\n * @type {Boolean}\n * @default false\n */\n withConnection: false,\n\n /**\n * The control actionHandler, provide one to handle action ( control being moved )\n * @param {Event} eventData the native mouse event\n * @param {Object} transformData properties of the current transform\n * @param {Number} x x position of the cursor\n * @param {Number} y y position of the cursor\n * @return {Boolean} true if the action/event modified the object\n */\n actionHandler: function(/* eventData, transformData, x, y */) { },\n\n /**\n * The control handler for mouse down, provide one to handle mouse down on control\n * @param {Event} eventData the native mouse event\n * @param {Object} transformData properties of the current transform\n * @param {Number} x x position of the cursor\n * @param {Number} y y position of the cursor\n * @return {Boolean} true if the action/event modified the object\n */\n mouseDownHandler: function(/* eventData, transformData, x, y */) { },\n\n /**\n * The control mouseUpHandler, provide one to handle an effect on mouse up.\n * @param {Event} eventData the native mouse event\n * @param {Object} transformData properties of the current transform\n * @param {Number} x x position of the cursor\n * @param {Number} y y position of the cursor\n * @return {Boolean} true if the action/event modified the object\n */\n mouseUpHandler: function(/* eventData, transformData, x, y */) { },\n\n /**\n * Returns control actionHandler\n * @param {Event} eventData the native mouse event\n * @param {fabric.Object} fabricObject on which the control is displayed\n * @param {fabric.Control} control control for which the action handler is being asked\n * @return {Function} the action handler\n */\n getActionHandler: function(/* eventData, fabricObject, control */) {\n return this.actionHandler;\n },\n\n /**\n * Returns control mouseDown handler\n * @param {Event} eventData the native mouse event\n * @param {fabric.Object} fabricObject on which the control is displayed\n * @param {fabric.Control} control control for which the action handler is being asked\n * @return {Function} the action handler\n */\n getMouseDownHandler: function(/* eventData, fabricObject, control */) {\n return this.mouseDownHandler;\n },\n\n /**\n * Returns control mouseUp handler\n * @param {Event} eventData the native mouse event\n * @param {fabric.Object} fabricObject on which the control is displayed\n * @param {fabric.Control} control control for which the action handler is being asked\n * @return {Function} the action handler\n */\n getMouseUpHandler: function(/* eventData, fabricObject, control */) {\n return this.mouseUpHandler;\n },\n\n /**\n * Returns control cursorStyle for css using cursorStyle. If you need a more elaborate\n * function you can pass one in the constructor\n * the cursorStyle property\n * @param {Event} eventData the native mouse event\n * @param {fabric.Control} control the current control ( likely this)\n * @param {fabric.Object} object on which the control is displayed\n * @return {String}\n */\n cursorStyleHandler: function(eventData, control /* fabricObject */) {\n return control.cursorStyle;\n },\n\n /**\n * Returns the action name. The basic implementation just return the actionName property.\n * @param {Event} eventData the native mouse event\n * @param {fabric.Control} control the current control ( likely this)\n * @param {fabric.Object} object on which the control is displayed\n * @return {String}\n */\n getActionName: function(eventData, control /* fabricObject */) {\n return control.actionName;\n },\n\n /**\n * Returns controls visibility\n * @param {fabric.Object} object on which the control is displayed\n * @param {String} controlKey key where the control is memorized on the\n * @return {Boolean}\n */\n getVisibility: function(fabricObject, controlKey) {\n var objectVisibility = fabricObject._controlsVisibility;\n if (objectVisibility && typeof objectVisibility[controlKey] !== 'undefined') {\n return objectVisibility[controlKey];\n }\n return this.visible;\n },\n\n /**\n * Sets controls visibility\n * @param {Boolean} visibility for the object\n * @return {Void}\n */\n setVisibility: function(visibility /* name, fabricObject */) {\n this.visible = visibility;\n },\n\n\n positionHandler: function(dim, finalMatrix /*, fabricObject, currentControl */) {\n var point = fabric.util.transformPoint({\n x: this.x * dim.x + this.offsetX,\n y: this.y * dim.y + this.offsetY }, finalMatrix);\n return point;\n },\n\n /**\n * Returns the coords for this control based on object values.\n * @param {Number} objectAngle angle from the fabric object holding the control\n * @param {Number} objectCornerSize cornerSize from the fabric object holding the control (or touchCornerSize if\n * isTouch is true)\n * @param {Number} centerX x coordinate where the control center should be\n * @param {Number} centerY y coordinate where the control center should be\n * @param {boolean} isTouch true if touch corner, false if normal corner\n */\n calcCornerCoords: function(objectAngle, objectCornerSize, centerX, centerY, isTouch) {\n var cosHalfOffset,\n sinHalfOffset,\n cosHalfOffsetComp,\n sinHalfOffsetComp,\n xSize = (isTouch) ? this.touchSizeX : this.sizeX,\n ySize = (isTouch) ? this.touchSizeY : this.sizeY;\n if (xSize && ySize && xSize !== ySize) {\n // handle rectangular corners\n var controlTriangleAngle = Math.atan2(ySize, xSize);\n var cornerHypotenuse = Math.sqrt(xSize * xSize + ySize * ySize) / 2;\n var newTheta = controlTriangleAngle - fabric.util.degreesToRadians(objectAngle);\n var newThetaComp = Math.PI / 2 - controlTriangleAngle - fabric.util.degreesToRadians(objectAngle);\n cosHalfOffset = cornerHypotenuse * fabric.util.cos(newTheta);\n sinHalfOffset = cornerHypotenuse * fabric.util.sin(newTheta);\n // use complementary angle for two corners\n cosHalfOffsetComp = cornerHypotenuse * fabric.util.cos(newThetaComp);\n sinHalfOffsetComp = cornerHypotenuse * fabric.util.sin(newThetaComp);\n }\n else {\n // handle square corners\n // use default object corner size unless size is defined\n var cornerSize = (xSize && ySize) ? xSize : objectCornerSize;\n /* 0.7071067812 stands for sqrt(2)/2 */\n cornerHypotenuse = cornerSize * 0.7071067812;\n // complementary angles are equal since they're both 45 degrees\n var newTheta = fabric.util.degreesToRadians(45 - objectAngle);\n cosHalfOffset = cosHalfOffsetComp = cornerHypotenuse * fabric.util.cos(newTheta);\n sinHalfOffset = sinHalfOffsetComp = cornerHypotenuse * fabric.util.sin(newTheta);\n }\n\n return {\n tl: {\n x: centerX - sinHalfOffsetComp,\n y: centerY - cosHalfOffsetComp,\n },\n tr: {\n x: centerX + cosHalfOffset,\n y: centerY - sinHalfOffset,\n },\n bl: {\n x: centerX - cosHalfOffset,\n y: centerY + sinHalfOffset,\n },\n br: {\n x: centerX + sinHalfOffsetComp,\n y: centerY + cosHalfOffsetComp,\n },\n };\n },\n\n /**\n * Render function for the control.\n * When this function runs the context is unscaled. unrotate. Just retina scaled.\n * all the functions will have to translate to the point left,top before starting Drawing\n * if they want to draw a control where the position is detected.\n * left and top are the result of the positionHandler function\n * @param {RenderingContext2D} ctx the context where the control will be drawn\n * @param {Number} left position of the canvas where we are about to render the control.\n * @param {Number} top position of the canvas where we are about to render the control.\n * @param {Object} styleOverride\n * @param {fabric.Object} fabricObject the object where the control is about to be rendered\n */\n render: function(ctx, left, top, styleOverride, fabricObject) {\n styleOverride = styleOverride || {};\n switch (styleOverride.cornerStyle || fabricObject.cornerStyle) {\n case 'circle':\n fabric.controlsUtils.renderCircleControl.call(this, ctx, left, top, styleOverride, fabricObject);\n break;\n default:\n fabric.controlsUtils.renderSquareControl.call(this, ctx, left, top, styleOverride, fabricObject);\n }\n },\n };\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function() {\n\n /* _FROM_SVG_START_ */\n function getColorStop(el, multiplier) {\n var style = el.getAttribute('style'),\n offset = el.getAttribute('offset') || 0,\n color, colorAlpha, opacity, i;\n\n // convert percents to absolute values\n offset = parseFloat(offset) / (/%$/.test(offset) ? 100 : 1);\n offset = offset < 0 ? 0 : offset > 1 ? 1 : offset;\n if (style) {\n var keyValuePairs = style.split(/\\s*;\\s*/);\n\n if (keyValuePairs[keyValuePairs.length - 1] === '') {\n keyValuePairs.pop();\n }\n\n for (i = keyValuePairs.length; i--; ) {\n\n var split = keyValuePairs[i].split(/\\s*:\\s*/),\n key = split[0].trim(),\n value = split[1].trim();\n\n if (key === 'stop-color') {\n color = value;\n }\n else if (key === 'stop-opacity') {\n opacity = value;\n }\n }\n }\n\n if (!color) {\n color = el.getAttribute('stop-color') || 'rgb(0,0,0)';\n }\n if (!opacity) {\n opacity = el.getAttribute('stop-opacity');\n }\n\n color = new fabric.Color(color);\n colorAlpha = color.getAlpha();\n opacity = isNaN(parseFloat(opacity)) ? 1 : parseFloat(opacity);\n opacity *= colorAlpha * multiplier;\n\n return {\n offset: offset,\n color: color.toRgb(),\n opacity: opacity\n };\n }\n\n function getLinearCoords(el) {\n return {\n x1: el.getAttribute('x1') || 0,\n y1: el.getAttribute('y1') || 0,\n x2: el.getAttribute('x2') || '100%',\n y2: el.getAttribute('y2') || 0\n };\n }\n\n function getRadialCoords(el) {\n return {\n x1: el.getAttribute('fx') || el.getAttribute('cx') || '50%',\n y1: el.getAttribute('fy') || el.getAttribute('cy') || '50%',\n r1: 0,\n x2: el.getAttribute('cx') || '50%',\n y2: el.getAttribute('cy') || '50%',\n r2: el.getAttribute('r') || '50%'\n };\n }\n /* _FROM_SVG_END_ */\n\n var clone = fabric.util.object.clone;\n\n /**\n * Gradient class\n * @class fabric.Gradient\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-2#gradients}\n * @see {@link fabric.Gradient#initialize} for constructor definition\n */\n fabric.Gradient = fabric.util.createClass(/** @lends fabric.Gradient.prototype */ {\n\n /**\n * Horizontal offset for aligning gradients coming from SVG when outside pathgroups\n * @type Number\n * @default 0\n */\n offsetX: 0,\n\n /**\n * Vertical offset for aligning gradients coming from SVG when outside pathgroups\n * @type Number\n * @default 0\n */\n offsetY: 0,\n\n /**\n * A transform matrix to apply to the gradient before painting.\n * Imported from svg gradients, is not applied with the current transform in the center.\n * Before this transform is applied, the origin point is at the top left corner of the object\n * plus the addition of offsetY and offsetX.\n * @type Number[]\n * @default null\n */\n gradientTransform: null,\n\n /**\n * coordinates units for coords.\n * If `pixels`, the number of coords are in the same unit of width / height.\n * If set as `percentage` the coords are still a number, but 1 means 100% of width\n * for the X and 100% of the height for the y. It can be bigger than 1 and negative.\n * allowed values pixels or percentage.\n * @type String\n * @default 'pixels'\n */\n gradientUnits: 'pixels',\n\n /**\n * Gradient type linear or radial\n * @type String\n * @default 'pixels'\n */\n type: 'linear',\n\n /**\n * Constructor\n * @param {Object} options Options object with type, coords, gradientUnits and colorStops\n * @param {Object} [options.type] gradient type linear or radial\n * @param {Object} [options.gradientUnits] gradient units\n * @param {Object} [options.offsetX] SVG import compatibility\n * @param {Object} [options.offsetY] SVG import compatibility\n * @param {Object[]} options.colorStops contains the colorstops.\n * @param {Object} options.coords contains the coords of the gradient\n * @param {Number} [options.coords.x1] X coordiante of the first point for linear or of the focal point for radial\n * @param {Number} [options.coords.y1] Y coordiante of the first point for linear or of the focal point for radial\n * @param {Number} [options.coords.x2] X coordiante of the second point for linear or of the center point for radial\n * @param {Number} [options.coords.y2] Y coordiante of the second point for linear or of the center point for radial\n * @param {Number} [options.coords.r1] only for radial gradient, radius of the inner circle\n * @param {Number} [options.coords.r2] only for radial gradient, radius of the external circle\n * @return {fabric.Gradient} thisArg\n */\n initialize: function(options) {\n options || (options = { });\n options.coords || (options.coords = { });\n\n var coords, _this = this;\n\n // sets everything, then coords and colorstops get sets again\n Object.keys(options).forEach(function(option) {\n _this[option] = options[option];\n });\n\n if (this.id) {\n this.id += '_' + fabric.Object.__uid++;\n }\n else {\n this.id = fabric.Object.__uid++;\n }\n\n coords = {\n x1: options.coords.x1 || 0,\n y1: options.coords.y1 || 0,\n x2: options.coords.x2 || 0,\n y2: options.coords.y2 || 0\n };\n\n if (this.type === 'radial') {\n coords.r1 = options.coords.r1 || 0;\n coords.r2 = options.coords.r2 || 0;\n }\n\n this.coords = coords;\n this.colorStops = options.colorStops.slice();\n },\n\n /**\n * Adds another colorStop\n * @param {Object} colorStop Object with offset and color\n * @return {fabric.Gradient} thisArg\n */\n addColorStop: function(colorStops) {\n for (var position in colorStops) {\n var color = new fabric.Color(colorStops[position]);\n this.colorStops.push({\n offset: parseFloat(position),\n color: color.toRgb(),\n opacity: color.getAlpha()\n });\n }\n return this;\n },\n\n /**\n * Returns object representation of a gradient\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object}\n */\n toObject: function(propertiesToInclude) {\n var object = {\n type: this.type,\n coords: this.coords,\n colorStops: this.colorStops,\n offsetX: this.offsetX,\n offsetY: this.offsetY,\n gradientUnits: this.gradientUnits,\n gradientTransform: this.gradientTransform ? this.gradientTransform.concat() : this.gradientTransform\n };\n fabric.util.populateWithProperties(this, object, propertiesToInclude);\n\n return object;\n },\n\n /* _TO_SVG_START_ */\n /**\n * Returns SVG representation of an gradient\n * @param {Object} object Object to create a gradient for\n * @return {String} SVG representation of an gradient (linear/radial)\n */\n toSVG: function(object, options) {\n var coords = clone(this.coords, true), i, len, options = options || {},\n markup, commonAttributes, colorStops = clone(this.colorStops, true),\n needsSwap = coords.r1 > coords.r2,\n transform = this.gradientTransform ? this.gradientTransform.concat() : fabric.iMatrix.concat(),\n offsetX = -this.offsetX, offsetY = -this.offsetY,\n withViewport = !!options.additionalTransform,\n gradientUnits = this.gradientUnits === 'pixels' ? 'userSpaceOnUse' : 'objectBoundingBox';\n // colorStops must be sorted ascending\n colorStops.sort(function(a, b) {\n return a.offset - b.offset;\n });\n\n if (gradientUnits === 'objectBoundingBox') {\n offsetX /= object.width;\n offsetY /= object.height;\n }\n else {\n offsetX += object.width / 2;\n offsetY += object.height / 2;\n }\n if (object.type === 'path' && this.gradientUnits !== 'percentage') {\n offsetX -= object.pathOffset.x;\n offsetY -= object.pathOffset.y;\n }\n\n\n transform[4] -= offsetX;\n transform[5] -= offsetY;\n\n commonAttributes = 'id=\"SVGID_' + this.id +\n '\" gradientUnits=\"' + gradientUnits + '\"';\n commonAttributes += ' gradientTransform=\"' + (withViewport ?\n options.additionalTransform + ' ' : '') + fabric.util.matrixToSVG(transform) + '\" ';\n\n if (this.type === 'linear') {\n markup = [\n '\\n'\n ];\n }\n else if (this.type === 'radial') {\n // svg radial gradient has just 1 radius. the biggest.\n markup = [\n '\\n'\n ];\n }\n\n if (this.type === 'radial') {\n if (needsSwap) {\n // svg goes from internal to external radius. if radius are inverted, swap color stops.\n colorStops = colorStops.concat();\n colorStops.reverse();\n for (i = 0, len = colorStops.length; i < len; i++) {\n colorStops[i].offset = 1 - colorStops[i].offset;\n }\n }\n var minRadius = Math.min(coords.r1, coords.r2);\n if (minRadius > 0) {\n // i have to shift all colorStops and add new one in 0.\n var maxRadius = Math.max(coords.r1, coords.r2),\n percentageShift = minRadius / maxRadius;\n for (i = 0, len = colorStops.length; i < len; i++) {\n colorStops[i].offset += percentageShift * (1 - colorStops[i].offset);\n }\n }\n }\n\n for (i = 0, len = colorStops.length; i < len; i++) {\n var colorStop = colorStops[i];\n markup.push(\n '\\n'\n );\n }\n\n markup.push((this.type === 'linear' ? '\\n' : '\\n'));\n\n return markup.join('');\n },\n /* _TO_SVG_END_ */\n\n /**\n * Returns an instance of CanvasGradient\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @return {CanvasGradient}\n */\n toLive: function(ctx) {\n var gradient, coords = fabric.util.object.clone(this.coords), i, len;\n\n if (!this.type) {\n return;\n }\n\n if (this.type === 'linear') {\n gradient = ctx.createLinearGradient(\n coords.x1, coords.y1, coords.x2, coords.y2);\n }\n else if (this.type === 'radial') {\n gradient = ctx.createRadialGradient(\n coords.x1, coords.y1, coords.r1, coords.x2, coords.y2, coords.r2);\n }\n\n for (i = 0, len = this.colorStops.length; i < len; i++) {\n var color = this.colorStops[i].color,\n opacity = this.colorStops[i].opacity,\n offset = this.colorStops[i].offset;\n\n if (typeof opacity !== 'undefined') {\n color = new fabric.Color(color).setAlpha(opacity).toRgba();\n }\n gradient.addColorStop(offset, color);\n }\n\n return gradient;\n }\n });\n\n fabric.util.object.extend(fabric.Gradient, {\n\n /* _FROM_SVG_START_ */\n /**\n * Returns {@link fabric.Gradient} instance from an SVG element\n * @static\n * @memberOf fabric.Gradient\n * @param {SVGGradientElement} el SVG gradient element\n * @param {fabric.Object} instance\n * @param {String} opacityAttr A fill-opacity or stroke-opacity attribute to multiply to each stop's opacity.\n * @param {Object} svgOptions an object containing the size of the SVG in order to parse correctly gradients\n * that uses gradientUnits as 'userSpaceOnUse' and percentages.\n * @param {Object.number} viewBoxWidth width part of the viewBox attribute on svg\n * @param {Object.number} viewBoxHeight height part of the viewBox attribute on svg\n * @param {Object.number} width width part of the svg tag if viewBox is not specified\n * @param {Object.number} height height part of the svg tag if viewBox is not specified\n * @return {fabric.Gradient} Gradient instance\n * @see http://www.w3.org/TR/SVG/pservers.html#LinearGradientElement\n * @see http://www.w3.org/TR/SVG/pservers.html#RadialGradientElement\n */\n fromElement: function(el, instance, opacityAttr, svgOptions) {\n /**\n * @example:\n *\n * \n * \n * \n * \n *\n * OR\n *\n * \n * \n * \n * \n *\n * OR\n *\n * \n * \n * \n * \n * \n *\n * OR\n *\n * \n * \n * \n * \n * \n *\n */\n\n var multiplier = parseFloat(opacityAttr) / (/%$/.test(opacityAttr) ? 100 : 1);\n multiplier = multiplier < 0 ? 0 : multiplier > 1 ? 1 : multiplier;\n if (isNaN(multiplier)) {\n multiplier = 1;\n }\n\n var colorStopEls = el.getElementsByTagName('stop'),\n type,\n gradientUnits = el.getAttribute('gradientUnits') === 'userSpaceOnUse' ?\n 'pixels' : 'percentage',\n gradientTransform = el.getAttribute('gradientTransform') || '',\n colorStops = [],\n coords, i, offsetX = 0, offsetY = 0,\n transformMatrix;\n if (el.nodeName === 'linearGradient' || el.nodeName === 'LINEARGRADIENT') {\n type = 'linear';\n coords = getLinearCoords(el);\n }\n else {\n type = 'radial';\n coords = getRadialCoords(el);\n }\n\n for (i = colorStopEls.length; i--; ) {\n colorStops.push(getColorStop(colorStopEls[i], multiplier));\n }\n\n transformMatrix = fabric.parseTransformAttribute(gradientTransform);\n\n __convertPercentUnitsToValues(instance, coords, svgOptions, gradientUnits);\n\n if (gradientUnits === 'pixels') {\n offsetX = -instance.left;\n offsetY = -instance.top;\n }\n\n var gradient = new fabric.Gradient({\n id: el.getAttribute('id'),\n type: type,\n coords: coords,\n colorStops: colorStops,\n gradientUnits: gradientUnits,\n gradientTransform: transformMatrix,\n offsetX: offsetX,\n offsetY: offsetY,\n });\n\n return gradient;\n }\n /* _FROM_SVG_END_ */\n });\n\n /**\n * @private\n */\n function __convertPercentUnitsToValues(instance, options, svgOptions, gradientUnits) {\n var propValue, finalValue;\n Object.keys(options).forEach(function(prop) {\n propValue = options[prop];\n if (propValue === 'Infinity') {\n finalValue = 1;\n }\n else if (propValue === '-Infinity') {\n finalValue = 0;\n }\n else {\n finalValue = parseFloat(options[prop], 10);\n if (typeof propValue === 'string' && /^(\\d+\\.\\d+)%|(\\d+)%$/.test(propValue)) {\n finalValue *= 0.01;\n if (gradientUnits === 'pixels') {\n // then we need to fix those percentages here in svg parsing\n if (prop === 'x1' || prop === 'x2' || prop === 'r2') {\n finalValue *= svgOptions.viewBoxWidth || svgOptions.width;\n }\n if (prop === 'y1' || prop === 'y2') {\n finalValue *= svgOptions.viewBoxHeight || svgOptions.height;\n }\n }\n }\n }\n options[prop] = finalValue;\n });\n }\n})();\n\n\n(function() {\n\n 'use strict';\n\n var toFixed = fabric.util.toFixed;\n\n /**\n * Pattern class\n * @class fabric.Pattern\n * @see {@link http://fabricjs.com/patterns|Pattern demo}\n * @see {@link http://fabricjs.com/dynamic-patterns|DynamicPattern demo}\n * @see {@link fabric.Pattern#initialize} for constructor definition\n */\n\n\n fabric.Pattern = fabric.util.createClass(/** @lends fabric.Pattern.prototype */ {\n\n /**\n * Repeat property of a pattern (one of repeat, repeat-x, repeat-y or no-repeat)\n * @type String\n * @default\n */\n repeat: 'repeat',\n\n /**\n * Pattern horizontal offset from object's left/top corner\n * @type Number\n * @default\n */\n offsetX: 0,\n\n /**\n * Pattern vertical offset from object's left/top corner\n * @type Number\n * @default\n */\n offsetY: 0,\n\n /**\n * crossOrigin value (one of \"\", \"anonymous\", \"use-credentials\")\n * @see https://developer.mozilla.org/en-US/docs/HTML/CORS_settings_attributes\n * @type String\n * @default\n */\n crossOrigin: '',\n\n /**\n * transform matrix to change the pattern, imported from svgs.\n * @type Array\n * @default\n */\n patternTransform: null,\n\n /**\n * Constructor\n * @param {Object} [options] Options object\n * @param {Function} [callback] function to invoke after callback init.\n * @return {fabric.Pattern} thisArg\n */\n initialize: function(options, callback) {\n options || (options = { });\n\n this.id = fabric.Object.__uid++;\n this.setOptions(options);\n if (!options.source || (options.source && typeof options.source !== 'string')) {\n callback && callback(this);\n return;\n }\n else {\n // img src string\n var _this = this;\n this.source = fabric.util.createImage();\n fabric.util.loadImage(options.source, function(img, isError) {\n _this.source = img;\n callback && callback(_this, isError);\n }, null, this.crossOrigin);\n }\n },\n\n /**\n * Returns object representation of a pattern\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} Object representation of a pattern instance\n */\n toObject: function(propertiesToInclude) {\n var NUM_FRACTION_DIGITS = fabric.Object.NUM_FRACTION_DIGITS,\n source, object;\n\n // element\n if (typeof this.source.src === 'string') {\n source = this.source.src;\n }\n // element\n else if (typeof this.source === 'object' && this.source.toDataURL) {\n source = this.source.toDataURL();\n }\n\n object = {\n type: 'pattern',\n source: source,\n repeat: this.repeat,\n crossOrigin: this.crossOrigin,\n offsetX: toFixed(this.offsetX, NUM_FRACTION_DIGITS),\n offsetY: toFixed(this.offsetY, NUM_FRACTION_DIGITS),\n patternTransform: this.patternTransform ? this.patternTransform.concat() : null\n };\n fabric.util.populateWithProperties(this, object, propertiesToInclude);\n\n return object;\n },\n\n /* _TO_SVG_START_ */\n /**\n * Returns SVG representation of a pattern\n * @param {fabric.Object} object\n * @return {String} SVG representation of a pattern\n */\n toSVG: function(object) {\n var patternSource = typeof this.source === 'function' ? this.source() : this.source,\n patternWidth = patternSource.width / object.width,\n patternHeight = patternSource.height / object.height,\n patternOffsetX = this.offsetX / object.width,\n patternOffsetY = this.offsetY / object.height,\n patternImgSrc = '';\n if (this.repeat === 'repeat-x' || this.repeat === 'no-repeat') {\n patternHeight = 1;\n if (patternOffsetY) {\n patternHeight += Math.abs(patternOffsetY);\n }\n }\n if (this.repeat === 'repeat-y' || this.repeat === 'no-repeat') {\n patternWidth = 1;\n if (patternOffsetX) {\n patternWidth += Math.abs(patternOffsetX);\n }\n\n }\n if (patternSource.src) {\n patternImgSrc = patternSource.src;\n }\n else if (patternSource.toDataURL) {\n patternImgSrc = patternSource.toDataURL();\n }\n\n return '\\n' +\n '\\n' +\n '\\n';\n },\n /* _TO_SVG_END_ */\n\n setOptions: function(options) {\n for (var prop in options) {\n this[prop] = options[prop];\n }\n },\n\n /**\n * Returns an instance of CanvasPattern\n * @param {CanvasRenderingContext2D} ctx Context to create pattern\n * @return {CanvasPattern}\n */\n toLive: function(ctx) {\n var source = this.source;\n // if the image failed to load, return, and allow rest to continue loading\n if (!source) {\n return '';\n }\n\n // if an image\n if (typeof source.src !== 'undefined') {\n if (!source.complete) {\n return '';\n }\n if (source.naturalWidth === 0 || source.naturalHeight === 0) {\n return '';\n }\n }\n return ctx.createPattern(source, this.repeat);\n }\n });\n})();\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n toFixed = fabric.util.toFixed;\n\n if (fabric.Shadow) {\n fabric.warn('fabric.Shadow is already defined.');\n return;\n }\n\n /**\n * Shadow class\n * @class fabric.Shadow\n * @see {@link http://fabricjs.com/shadows|Shadow demo}\n * @see {@link fabric.Shadow#initialize} for constructor definition\n */\n fabric.Shadow = fabric.util.createClass(/** @lends fabric.Shadow.prototype */ {\n\n /**\n * Shadow color\n * @type String\n * @default\n */\n color: 'rgb(0,0,0)',\n\n /**\n * Shadow blur\n * @type Number\n */\n blur: 0,\n\n /**\n * Shadow horizontal offset\n * @type Number\n * @default\n */\n offsetX: 0,\n\n /**\n * Shadow vertical offset\n * @type Number\n * @default\n */\n offsetY: 0,\n\n /**\n * Whether the shadow should affect stroke operations\n * @type Boolean\n * @default\n */\n affectStroke: false,\n\n /**\n * Indicates whether toObject should include default values\n * @type Boolean\n * @default\n */\n includeDefaultValues: true,\n\n /**\n * When `false`, the shadow will scale with the object.\n * When `true`, the shadow's offsetX, offsetY, and blur will not be affected by the object's scale.\n * default to false\n * @type Boolean\n * @default\n */\n nonScaling: false,\n\n /**\n * Constructor\n * @param {Object|String} [options] Options object with any of color, blur, offsetX, offsetY properties or string (e.g. \"rgba(0,0,0,0.2) 2px 2px 10px\")\n * @return {fabric.Shadow} thisArg\n */\n initialize: function(options) {\n\n if (typeof options === 'string') {\n options = this._parseShadow(options);\n }\n\n for (var prop in options) {\n this[prop] = options[prop];\n }\n\n this.id = fabric.Object.__uid++;\n },\n\n /**\n * @private\n * @param {String} shadow Shadow value to parse\n * @return {Object} Shadow object with color, offsetX, offsetY and blur\n */\n _parseShadow: function(shadow) {\n var shadowStr = shadow.trim(),\n offsetsAndBlur = fabric.Shadow.reOffsetsAndBlur.exec(shadowStr) || [],\n color = shadowStr.replace(fabric.Shadow.reOffsetsAndBlur, '') || 'rgb(0,0,0)';\n\n return {\n color: color.trim(),\n offsetX: parseFloat(offsetsAndBlur[1], 10) || 0,\n offsetY: parseFloat(offsetsAndBlur[2], 10) || 0,\n blur: parseFloat(offsetsAndBlur[3], 10) || 0\n };\n },\n\n /**\n * Returns a string representation of an instance\n * @see http://www.w3.org/TR/css-text-decor-3/#text-shadow\n * @return {String} Returns CSS3 text-shadow declaration\n */\n toString: function() {\n return [this.offsetX, this.offsetY, this.blur, this.color].join('px ');\n },\n\n /* _TO_SVG_START_ */\n /**\n * Returns SVG representation of a shadow\n * @param {fabric.Object} object\n * @return {String} SVG representation of a shadow\n */\n toSVG: function(object) {\n var fBoxX = 40, fBoxY = 40, NUM_FRACTION_DIGITS = fabric.Object.NUM_FRACTION_DIGITS,\n offset = fabric.util.rotateVector(\n { x: this.offsetX, y: this.offsetY },\n fabric.util.degreesToRadians(-object.angle)),\n BLUR_BOX = 20, color = new fabric.Color(this.color);\n\n if (object.width && object.height) {\n //http://www.w3.org/TR/SVG/filters.html#FilterEffectsRegion\n // we add some extra space to filter box to contain the blur ( 20 )\n fBoxX = toFixed((Math.abs(offset.x) + this.blur) / object.width, NUM_FRACTION_DIGITS) * 100 + BLUR_BOX;\n fBoxY = toFixed((Math.abs(offset.y) + this.blur) / object.height, NUM_FRACTION_DIGITS) * 100 + BLUR_BOX;\n }\n if (object.flipX) {\n offset.x *= -1;\n }\n if (object.flipY) {\n offset.y *= -1;\n }\n\n return (\n '\\n' +\n '\\t\\n' +\n '\\t\\n' +\n '\\t\\n' +\n '\\t\\n' +\n '\\t\\n' +\n '\\t\\t\\n' +\n '\\t\\t\\n' +\n '\\t\\n' +\n '\\n');\n },\n /* _TO_SVG_END_ */\n\n /**\n * Returns object representation of a shadow\n * @return {Object} Object representation of a shadow instance\n */\n toObject: function() {\n if (this.includeDefaultValues) {\n return {\n color: this.color,\n blur: this.blur,\n offsetX: this.offsetX,\n offsetY: this.offsetY,\n affectStroke: this.affectStroke,\n nonScaling: this.nonScaling\n };\n }\n var obj = { }, proto = fabric.Shadow.prototype;\n\n ['color', 'blur', 'offsetX', 'offsetY', 'affectStroke', 'nonScaling'].forEach(function(prop) {\n if (this[prop] !== proto[prop]) {\n obj[prop] = this[prop];\n }\n }, this);\n\n return obj;\n }\n });\n\n /**\n * Regex matching shadow offsetX, offsetY and blur (ex: \"2px 2px 10px rgba(0,0,0,0.2)\", \"rgb(0,255,0) 2px 2px\")\n * @static\n * @field\n * @memberOf fabric.Shadow\n */\n // eslint-disable-next-line max-len\n fabric.Shadow.reOffsetsAndBlur = /(?:\\s|^)(-?\\d+(?:\\.\\d*)?(?:px)?(?:\\s?|$))?(-?\\d+(?:\\.\\d*)?(?:px)?(?:\\s?|$))?(\\d+(?:\\.\\d*)?(?:px)?)?(?:\\s?|$)(?:$|\\s)/;\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function () {\n\n 'use strict';\n\n if (fabric.StaticCanvas) {\n fabric.warn('fabric.StaticCanvas is already defined.');\n return;\n }\n\n // aliases for faster resolution\n var extend = fabric.util.object.extend,\n getElementOffset = fabric.util.getElementOffset,\n removeFromArray = fabric.util.removeFromArray,\n toFixed = fabric.util.toFixed,\n transformPoint = fabric.util.transformPoint,\n invertTransform = fabric.util.invertTransform,\n getNodeCanvas = fabric.util.getNodeCanvas,\n createCanvasElement = fabric.util.createCanvasElement,\n\n CANVAS_INIT_ERROR = new Error('Could not initialize `canvas` element');\n\n /**\n * Static canvas class\n * @class fabric.StaticCanvas\n * @mixes fabric.Collection\n * @mixes fabric.Observable\n * @see {@link http://fabricjs.com/static_canvas|StaticCanvas demo}\n * @see {@link fabric.StaticCanvas#initialize} for constructor definition\n * @fires before:render\n * @fires after:render\n * @fires canvas:cleared\n * @fires object:added\n * @fires object:removed\n */\n fabric.StaticCanvas = fabric.util.createClass(fabric.CommonMethods, /** @lends fabric.StaticCanvas.prototype */ {\n\n /**\n * Constructor\n * @param {HTMLElement | String} el <canvas> element to initialize instance on\n * @param {Object} [options] Options object\n * @return {Object} thisArg\n */\n initialize: function(el, options) {\n options || (options = { });\n this.renderAndResetBound = this.renderAndReset.bind(this);\n this.requestRenderAllBound = this.requestRenderAll.bind(this);\n this._initStatic(el, options);\n },\n\n /**\n * Background color of canvas instance.\n * Should be set via {@link fabric.StaticCanvas#setBackgroundColor}.\n * @type {(String|fabric.Pattern)}\n * @default\n */\n backgroundColor: '',\n\n /**\n * Background image of canvas instance.\n * since 2.4.0 image caching is active, please when putting an image as background, add to the\n * canvas property a reference to the canvas it is on. Otherwise the image cannot detect the zoom\n * vale. As an alternative you can disable image objectCaching\n * @type fabric.Image\n * @default\n */\n backgroundImage: null,\n\n /**\n * Overlay color of canvas instance.\n * Should be set via {@link fabric.StaticCanvas#setOverlayColor}\n * @since 1.3.9\n * @type {(String|fabric.Pattern)}\n * @default\n */\n overlayColor: '',\n\n /**\n * Overlay image of canvas instance.\n * since 2.4.0 image caching is active, please when putting an image as overlay, add to the\n * canvas property a reference to the canvas it is on. Otherwise the image cannot detect the zoom\n * vale. As an alternative you can disable image objectCaching\n * @type fabric.Image\n * @default\n */\n overlayImage: null,\n\n /**\n * Indicates whether toObject/toDatalessObject should include default values\n * if set to false, takes precedence over the object value.\n * @type Boolean\n * @default\n */\n includeDefaultValues: true,\n\n /**\n * Indicates whether objects' state should be saved\n * @type Boolean\n * @default\n */\n stateful: false,\n\n /**\n * Indicates whether {@link fabric.Collection.add}, {@link fabric.Collection.insertAt} and {@link fabric.Collection.remove},\n * {@link fabric.StaticCanvas.moveTo}, {@link fabric.StaticCanvas.clear} and many more, should also re-render canvas.\n * Disabling this option will not give a performance boost when adding/removing a lot of objects to/from canvas at once\n * since the renders are quequed and executed one per frame.\n * Disabling is suggested anyway and managing the renders of the app manually is not a big effort ( canvas.requestRenderAll() )\n * Left default to true to do not break documentation and old app, fiddles.\n * @type Boolean\n * @default\n */\n renderOnAddRemove: true,\n\n /**\n * Indicates whether object controls (borders/controls) are rendered above overlay image\n * @type Boolean\n * @default\n */\n controlsAboveOverlay: false,\n\n /**\n * Indicates whether the browser can be scrolled when using a touchscreen and dragging on the canvas\n * @type Boolean\n * @default\n */\n allowTouchScrolling: false,\n\n /**\n * Indicates whether this canvas will use image smoothing, this is on by default in browsers\n * @type Boolean\n * @default\n */\n imageSmoothingEnabled: true,\n\n /**\n * The transformation (a Canvas 2D API transform matrix) which focuses the viewport\n * @type Array\n * @example Default transform\n * canvas.viewportTransform = [1, 0, 0, 1, 0, 0];\n * @example Scale by 70% and translate toward bottom-right by 50, without skewing\n * canvas.viewportTransform = [0.7, 0, 0, 0.7, 50, 50];\n * @default\n */\n viewportTransform: fabric.iMatrix.concat(),\n\n /**\n * if set to false background image is not affected by viewport transform\n * @since 1.6.3\n * @type Boolean\n * @default\n */\n backgroundVpt: true,\n\n /**\n * if set to false overlya image is not affected by viewport transform\n * @since 1.6.3\n * @type Boolean\n * @default\n */\n overlayVpt: true,\n\n /**\n * When true, canvas is scaled by devicePixelRatio for better rendering on retina screens\n * @type Boolean\n * @default\n */\n enableRetinaScaling: true,\n\n /**\n * Describe canvas element extension over design\n * properties are tl,tr,bl,br.\n * if canvas is not zoomed/panned those points are the four corner of canvas\n * if canvas is viewportTransformed you those points indicate the extension\n * of canvas element in plain untrasformed coordinates\n * The coordinates get updated with @method calcViewportBoundaries.\n * @memberOf fabric.StaticCanvas.prototype\n */\n vptCoords: { },\n\n /**\n * Based on vptCoords and object.aCoords, skip rendering of objects that\n * are not included in current viewport.\n * May greatly help in applications with crowded canvas and use of zoom/pan\n * If One of the corner of the bounding box of the object is on the canvas\n * the objects get rendered.\n * @memberOf fabric.StaticCanvas.prototype\n * @type Boolean\n * @default\n */\n skipOffscreen: true,\n\n /**\n * a fabricObject that, without stroke define a clipping area with their shape. filled in black\n * the clipPath object gets used when the canvas has rendered, and the context is placed in the\n * top left corner of the canvas.\n * clipPath will clip away controls, if you do not want this to happen use controlsAboveOverlay = true\n * @type fabric.Object\n */\n clipPath: undefined,\n\n /**\n * @private\n * @param {HTMLElement | String} el <canvas> element to initialize instance on\n * @param {Object} [options] Options object\n */\n _initStatic: function(el, options) {\n var cb = this.requestRenderAllBound;\n this._objects = [];\n this._createLowerCanvas(el);\n this._initOptions(options);\n // only initialize retina scaling once\n if (!this.interactive) {\n this._initRetinaScaling();\n }\n\n if (options.overlayImage) {\n this.setOverlayImage(options.overlayImage, cb);\n }\n if (options.backgroundImage) {\n this.setBackgroundImage(options.backgroundImage, cb);\n }\n if (options.backgroundColor) {\n this.setBackgroundColor(options.backgroundColor, cb);\n }\n if (options.overlayColor) {\n this.setOverlayColor(options.overlayColor, cb);\n }\n this.calcOffset();\n },\n\n /**\n * @private\n */\n _isRetinaScaling: function() {\n return (fabric.devicePixelRatio > 1 && this.enableRetinaScaling);\n },\n\n /**\n * @private\n * @return {Number} retinaScaling if applied, otherwise 1;\n */\n getRetinaScaling: function() {\n return this._isRetinaScaling() ? Math.max(1, fabric.devicePixelRatio) : 1;\n },\n\n /**\n * @private\n */\n _initRetinaScaling: function() {\n if (!this._isRetinaScaling()) {\n return;\n }\n var scaleRatio = fabric.devicePixelRatio;\n this.__initRetinaScaling(scaleRatio, this.lowerCanvasEl, this.contextContainer);\n if (this.upperCanvasEl) {\n this.__initRetinaScaling(scaleRatio, this.upperCanvasEl, this.contextTop);\n }\n },\n\n __initRetinaScaling: function(scaleRatio, canvas, context) {\n canvas.setAttribute('width', this.width * scaleRatio);\n canvas.setAttribute('height', this.height * scaleRatio);\n context.scale(scaleRatio, scaleRatio);\n },\n\n\n /**\n * Calculates canvas element offset relative to the document\n * This method is also attached as \"resize\" event handler of window\n * @return {fabric.Canvas} instance\n * @chainable\n */\n calcOffset: function () {\n this._offset = getElementOffset(this.lowerCanvasEl);\n return this;\n },\n\n /**\n * Sets {@link fabric.StaticCanvas#overlayImage|overlay image} for this canvas\n * @param {(fabric.Image|String)} image fabric.Image instance or URL of an image to set overlay to\n * @param {Function} callback callback to invoke when image is loaded and set as an overlay\n * @param {Object} [options] Optional options to set for the {@link fabric.Image|overlay image}.\n * @return {fabric.Canvas} thisArg\n * @chainable\n * @see {@link http://jsfiddle.net/fabricjs/MnzHT/|jsFiddle demo}\n * @example Normal overlayImage with left/top = 0\n * canvas.setOverlayImage('http://fabricjs.com/assets/jail_cell_bars.png', canvas.renderAll.bind(canvas), {\n * // Needed to position overlayImage at 0/0\n * originX: 'left',\n * originY: 'top'\n * });\n * @example overlayImage with different properties\n * canvas.setOverlayImage('http://fabricjs.com/assets/jail_cell_bars.png', canvas.renderAll.bind(canvas), {\n * opacity: 0.5,\n * angle: 45,\n * left: 400,\n * top: 400,\n * originX: 'left',\n * originY: 'top'\n * });\n * @example Stretched overlayImage #1 - width/height correspond to canvas width/height\n * fabric.Image.fromURL('http://fabricjs.com/assets/jail_cell_bars.png', function(img, isError) {\n * img.set({width: canvas.width, height: canvas.height, originX: 'left', originY: 'top'});\n * canvas.setOverlayImage(img, canvas.renderAll.bind(canvas));\n * });\n * @example Stretched overlayImage #2 - width/height correspond to canvas width/height\n * canvas.setOverlayImage('http://fabricjs.com/assets/jail_cell_bars.png', canvas.renderAll.bind(canvas), {\n * width: canvas.width,\n * height: canvas.height,\n * // Needed to position overlayImage at 0/0\n * originX: 'left',\n * originY: 'top'\n * });\n * @example overlayImage loaded from cross-origin\n * canvas.setOverlayImage('http://fabricjs.com/assets/jail_cell_bars.png', canvas.renderAll.bind(canvas), {\n * opacity: 0.5,\n * angle: 45,\n * left: 400,\n * top: 400,\n * originX: 'left',\n * originY: 'top',\n * crossOrigin: 'anonymous'\n * });\n */\n setOverlayImage: function (image, callback, options) {\n return this.__setBgOverlayImage('overlayImage', image, callback, options);\n },\n\n /**\n * Sets {@link fabric.StaticCanvas#backgroundImage|background image} for this canvas\n * @param {(fabric.Image|String)} image fabric.Image instance or URL of an image to set background to\n * @param {Function} callback Callback to invoke when image is loaded and set as background\n * @param {Object} [options] Optional options to set for the {@link fabric.Image|background image}.\n * @return {fabric.Canvas} thisArg\n * @chainable\n * @see {@link http://jsfiddle.net/djnr8o7a/28/|jsFiddle demo}\n * @example Normal backgroundImage with left/top = 0\n * canvas.setBackgroundImage('http://fabricjs.com/assets/honey_im_subtle.png', canvas.renderAll.bind(canvas), {\n * // Needed to position backgroundImage at 0/0\n * originX: 'left',\n * originY: 'top'\n * });\n * @example backgroundImage with different properties\n * canvas.setBackgroundImage('http://fabricjs.com/assets/honey_im_subtle.png', canvas.renderAll.bind(canvas), {\n * opacity: 0.5,\n * angle: 45,\n * left: 400,\n * top: 400,\n * originX: 'left',\n * originY: 'top'\n * });\n * @example Stretched backgroundImage #1 - width/height correspond to canvas width/height\n * fabric.Image.fromURL('http://fabricjs.com/assets/honey_im_subtle.png', function(img, isError) {\n * img.set({width: canvas.width, height: canvas.height, originX: 'left', originY: 'top'});\n * canvas.setBackgroundImage(img, canvas.renderAll.bind(canvas));\n * });\n * @example Stretched backgroundImage #2 - width/height correspond to canvas width/height\n * canvas.setBackgroundImage('http://fabricjs.com/assets/honey_im_subtle.png', canvas.renderAll.bind(canvas), {\n * width: canvas.width,\n * height: canvas.height,\n * // Needed to position backgroundImage at 0/0\n * originX: 'left',\n * originY: 'top'\n * });\n * @example backgroundImage loaded from cross-origin\n * canvas.setBackgroundImage('http://fabricjs.com/assets/honey_im_subtle.png', canvas.renderAll.bind(canvas), {\n * opacity: 0.5,\n * angle: 45,\n * left: 400,\n * top: 400,\n * originX: 'left',\n * originY: 'top',\n * crossOrigin: 'anonymous'\n * });\n */\n // TODO: fix stretched examples\n setBackgroundImage: function (image, callback, options) {\n return this.__setBgOverlayImage('backgroundImage', image, callback, options);\n },\n\n /**\n * Sets {@link fabric.StaticCanvas#overlayColor|foreground color} for this canvas\n * @param {(String|fabric.Pattern)} overlayColor Color or pattern to set foreground color to\n * @param {Function} callback Callback to invoke when foreground color is set\n * @return {fabric.Canvas} thisArg\n * @chainable\n * @see {@link http://jsfiddle.net/fabricjs/pB55h/|jsFiddle demo}\n * @example Normal overlayColor - color value\n * canvas.setOverlayColor('rgba(255, 73, 64, 0.6)', canvas.renderAll.bind(canvas));\n * @example fabric.Pattern used as overlayColor\n * canvas.setOverlayColor({\n * source: 'http://fabricjs.com/assets/escheresque_ste.png'\n * }, canvas.renderAll.bind(canvas));\n * @example fabric.Pattern used as overlayColor with repeat and offset\n * canvas.setOverlayColor({\n * source: 'http://fabricjs.com/assets/escheresque_ste.png',\n * repeat: 'repeat',\n * offsetX: 200,\n * offsetY: 100\n * }, canvas.renderAll.bind(canvas));\n */\n setOverlayColor: function(overlayColor, callback) {\n return this.__setBgOverlayColor('overlayColor', overlayColor, callback);\n },\n\n /**\n * Sets {@link fabric.StaticCanvas#backgroundColor|background color} for this canvas\n * @param {(String|fabric.Pattern)} backgroundColor Color or pattern to set background color to\n * @param {Function} callback Callback to invoke when background color is set\n * @return {fabric.Canvas} thisArg\n * @chainable\n * @see {@link http://jsfiddle.net/fabricjs/hXzvk/|jsFiddle demo}\n * @example Normal backgroundColor - color value\n * canvas.setBackgroundColor('rgba(255, 73, 64, 0.6)', canvas.renderAll.bind(canvas));\n * @example fabric.Pattern used as backgroundColor\n * canvas.setBackgroundColor({\n * source: 'http://fabricjs.com/assets/escheresque_ste.png'\n * }, canvas.renderAll.bind(canvas));\n * @example fabric.Pattern used as backgroundColor with repeat and offset\n * canvas.setBackgroundColor({\n * source: 'http://fabricjs.com/assets/escheresque_ste.png',\n * repeat: 'repeat',\n * offsetX: 200,\n * offsetY: 100\n * }, canvas.renderAll.bind(canvas));\n */\n setBackgroundColor: function(backgroundColor, callback) {\n return this.__setBgOverlayColor('backgroundColor', backgroundColor, callback);\n },\n\n /**\n * @private\n * @param {String} property Property to set ({@link fabric.StaticCanvas#backgroundImage|backgroundImage}\n * or {@link fabric.StaticCanvas#overlayImage|overlayImage})\n * @param {(fabric.Image|String|null)} image fabric.Image instance, URL of an image or null to set background or overlay to\n * @param {Function} callback Callback to invoke when image is loaded and set as background or overlay. The first argument is the created image, the second argument is a flag indicating whether an error occurred or not.\n * @param {Object} [options] Optional options to set for the {@link fabric.Image|image}.\n */\n __setBgOverlayImage: function(property, image, callback, options) {\n if (typeof image === 'string') {\n fabric.util.loadImage(image, function(img, isError) {\n if (img) {\n var instance = new fabric.Image(img, options);\n this[property] = instance;\n instance.canvas = this;\n }\n callback && callback(img, isError);\n }, this, options && options.crossOrigin);\n }\n else {\n options && image.setOptions(options);\n this[property] = image;\n image && (image.canvas = this);\n callback && callback(image, false);\n }\n\n return this;\n },\n\n /**\n * @private\n * @param {String} property Property to set ({@link fabric.StaticCanvas#backgroundColor|backgroundColor}\n * or {@link fabric.StaticCanvas#overlayColor|overlayColor})\n * @param {(Object|String|null)} color Object with pattern information, color value or null\n * @param {Function} [callback] Callback is invoked when color is set\n */\n __setBgOverlayColor: function(property, color, callback) {\n this[property] = color;\n this._initGradient(color, property);\n this._initPattern(color, property, callback);\n return this;\n },\n\n /**\n * @private\n */\n _createCanvasElement: function() {\n var element = createCanvasElement();\n if (!element) {\n throw CANVAS_INIT_ERROR;\n }\n if (!element.style) {\n element.style = { };\n }\n if (typeof element.getContext === 'undefined') {\n throw CANVAS_INIT_ERROR;\n }\n return element;\n },\n\n /**\n * @private\n * @param {Object} [options] Options object\n */\n _initOptions: function (options) {\n var lowerCanvasEl = this.lowerCanvasEl;\n this._setOptions(options);\n\n this.width = this.width || parseInt(lowerCanvasEl.width, 10) || 0;\n this.height = this.height || parseInt(lowerCanvasEl.height, 10) || 0;\n\n if (!this.lowerCanvasEl.style) {\n return;\n }\n\n lowerCanvasEl.width = this.width;\n lowerCanvasEl.height = this.height;\n\n lowerCanvasEl.style.width = this.width + 'px';\n lowerCanvasEl.style.height = this.height + 'px';\n\n this.viewportTransform = this.viewportTransform.slice();\n },\n\n /**\n * Creates a bottom canvas\n * @private\n * @param {HTMLElement} [canvasEl]\n */\n _createLowerCanvas: function (canvasEl) {\n // canvasEl === 'HTMLCanvasElement' does not work on jsdom/node\n if (canvasEl && canvasEl.getContext) {\n this.lowerCanvasEl = canvasEl;\n }\n else {\n this.lowerCanvasEl = fabric.util.getById(canvasEl) || this._createCanvasElement();\n }\n\n fabric.util.addClass(this.lowerCanvasEl, 'lower-canvas');\n this._originalCanvasStyle = this.lowerCanvasEl.style;\n if (this.interactive) {\n this._applyCanvasStyle(this.lowerCanvasEl);\n }\n\n this.contextContainer = this.lowerCanvasEl.getContext('2d');\n },\n\n /**\n * Returns canvas width (in px)\n * @return {Number}\n */\n getWidth: function () {\n return this.width;\n },\n\n /**\n * Returns canvas height (in px)\n * @return {Number}\n */\n getHeight: function () {\n return this.height;\n },\n\n /**\n * Sets width of this canvas instance\n * @param {Number|String} value Value to set width to\n * @param {Object} [options] Options object\n * @param {Boolean} [options.backstoreOnly=false] Set the given dimensions only as canvas backstore dimensions\n * @param {Boolean} [options.cssOnly=false] Set the given dimensions only as css dimensions\n * @return {fabric.Canvas} instance\n * @chainable true\n */\n setWidth: function (value, options) {\n return this.setDimensions({ width: value }, options);\n },\n\n /**\n * Sets height of this canvas instance\n * @param {Number|String} value Value to set height to\n * @param {Object} [options] Options object\n * @param {Boolean} [options.backstoreOnly=false] Set the given dimensions only as canvas backstore dimensions\n * @param {Boolean} [options.cssOnly=false] Set the given dimensions only as css dimensions\n * @return {fabric.Canvas} instance\n * @chainable true\n */\n setHeight: function (value, options) {\n return this.setDimensions({ height: value }, options);\n },\n\n /**\n * Sets dimensions (width, height) of this canvas instance. when options.cssOnly flag active you should also supply the unit of measure (px/%/em)\n * @param {Object} dimensions Object with width/height properties\n * @param {Number|String} [dimensions.width] Width of canvas element\n * @param {Number|String} [dimensions.height] Height of canvas element\n * @param {Object} [options] Options object\n * @param {Boolean} [options.backstoreOnly=false] Set the given dimensions only as canvas backstore dimensions\n * @param {Boolean} [options.cssOnly=false] Set the given dimensions only as css dimensions\n * @return {fabric.Canvas} thisArg\n * @chainable\n */\n setDimensions: function (dimensions, options) {\n var cssValue;\n\n options = options || {};\n\n for (var prop in dimensions) {\n cssValue = dimensions[prop];\n\n if (!options.cssOnly) {\n this._setBackstoreDimension(prop, dimensions[prop]);\n cssValue += 'px';\n this.hasLostContext = true;\n }\n\n if (!options.backstoreOnly) {\n this._setCssDimension(prop, cssValue);\n }\n }\n if (this._isCurrentlyDrawing) {\n this.freeDrawingBrush && this.freeDrawingBrush._setBrushStyles(this.contextTop);\n }\n this._initRetinaScaling();\n this.calcOffset();\n\n if (!options.cssOnly) {\n this.requestRenderAll();\n }\n\n return this;\n },\n\n /**\n * Helper for setting width/height\n * @private\n * @param {String} prop property (width|height)\n * @param {Number} value value to set property to\n * @return {fabric.Canvas} instance\n * @chainable true\n */\n _setBackstoreDimension: function (prop, value) {\n this.lowerCanvasEl[prop] = value;\n\n if (this.upperCanvasEl) {\n this.upperCanvasEl[prop] = value;\n }\n\n if (this.cacheCanvasEl) {\n this.cacheCanvasEl[prop] = value;\n }\n\n this[prop] = value;\n\n return this;\n },\n\n /**\n * Helper for setting css width/height\n * @private\n * @param {String} prop property (width|height)\n * @param {String} value value to set property to\n * @return {fabric.Canvas} instance\n * @chainable true\n */\n _setCssDimension: function (prop, value) {\n this.lowerCanvasEl.style[prop] = value;\n\n if (this.upperCanvasEl) {\n this.upperCanvasEl.style[prop] = value;\n }\n\n if (this.wrapperEl) {\n this.wrapperEl.style[prop] = value;\n }\n\n return this;\n },\n\n /**\n * Returns canvas zoom level\n * @return {Number}\n */\n getZoom: function () {\n return this.viewportTransform[0];\n },\n\n /**\n * Sets viewport transformation of this canvas instance\n * @param {Array} vpt a Canvas 2D API transform matrix\n * @return {fabric.Canvas} instance\n * @chainable true\n */\n setViewportTransform: function (vpt) {\n var activeObject = this._activeObject,\n backgroundObject = this.backgroundImage,\n overlayObject = this.overlayImage,\n object, i, len;\n this.viewportTransform = vpt;\n for (i = 0, len = this._objects.length; i < len; i++) {\n object = this._objects[i];\n object.group || object.setCoords(true);\n }\n if (activeObject) {\n activeObject.setCoords();\n }\n if (backgroundObject) {\n backgroundObject.setCoords(true);\n }\n if (overlayObject) {\n overlayObject.setCoords(true);\n }\n this.calcViewportBoundaries();\n this.renderOnAddRemove && this.requestRenderAll();\n return this;\n },\n\n /**\n * Sets zoom level of this canvas instance, the zoom centered around point\n * meaning that following zoom to point with the same point will have the visual\n * effect of the zoom originating from that point. The point won't move.\n * It has nothing to do with canvas center or visual center of the viewport.\n * @param {fabric.Point} point to zoom with respect to\n * @param {Number} value to set zoom to, less than 1 zooms out\n * @return {fabric.Canvas} instance\n * @chainable true\n */\n zoomToPoint: function (point, value) {\n // TODO: just change the scale, preserve other transformations\n var before = point, vpt = this.viewportTransform.slice(0);\n point = transformPoint(point, invertTransform(this.viewportTransform));\n vpt[0] = value;\n vpt[3] = value;\n var after = transformPoint(point, vpt);\n vpt[4] += before.x - after.x;\n vpt[5] += before.y - after.y;\n return this.setViewportTransform(vpt);\n },\n\n /**\n * Sets zoom level of this canvas instance\n * @param {Number} value to set zoom to, less than 1 zooms out\n * @return {fabric.Canvas} instance\n * @chainable true\n */\n setZoom: function (value) {\n this.zoomToPoint(new fabric.Point(0, 0), value);\n return this;\n },\n\n /**\n * Pan viewport so as to place point at top left corner of canvas\n * @param {fabric.Point} point to move to\n * @return {fabric.Canvas} instance\n * @chainable true\n */\n absolutePan: function (point) {\n var vpt = this.viewportTransform.slice(0);\n vpt[4] = -point.x;\n vpt[5] = -point.y;\n return this.setViewportTransform(vpt);\n },\n\n /**\n * Pans viewpoint relatively\n * @param {fabric.Point} point (position vector) to move by\n * @return {fabric.Canvas} instance\n * @chainable true\n */\n relativePan: function (point) {\n return this.absolutePan(new fabric.Point(\n -point.x - this.viewportTransform[4],\n -point.y - this.viewportTransform[5]\n ));\n },\n\n /**\n * Returns <canvas> element corresponding to this instance\n * @return {HTMLCanvasElement}\n */\n getElement: function () {\n return this.lowerCanvasEl;\n },\n\n /**\n * @private\n * @param {fabric.Object} obj Object that was added\n */\n _onObjectAdded: function(obj) {\n this.stateful && obj.setupState();\n obj._set('canvas', this);\n obj.setCoords();\n this.fire('object:added', { target: obj });\n obj.fire('added');\n },\n\n /**\n * @private\n * @param {fabric.Object} obj Object that was removed\n */\n _onObjectRemoved: function(obj) {\n this.fire('object:removed', { target: obj });\n obj.fire('removed');\n delete obj.canvas;\n },\n\n /**\n * Clears specified context of canvas element\n * @param {CanvasRenderingContext2D} ctx Context to clear\n * @return {fabric.Canvas} thisArg\n * @chainable\n */\n clearContext: function(ctx) {\n ctx.clearRect(0, 0, this.width, this.height);\n return this;\n },\n\n /**\n * Returns context of canvas where objects are drawn\n * @return {CanvasRenderingContext2D}\n */\n getContext: function () {\n return this.contextContainer;\n },\n\n /**\n * Clears all contexts (background, main, top) of an instance\n * @return {fabric.Canvas} thisArg\n * @chainable\n */\n clear: function () {\n this.remove.apply(this, this.getObjects());\n this.backgroundImage = null;\n this.overlayImage = null;\n this.backgroundColor = '';\n this.overlayColor = '';\n if (this._hasITextHandlers) {\n this.off('mouse:up', this._mouseUpITextHandler);\n this._iTextInstances = null;\n this._hasITextHandlers = false;\n }\n this.clearContext(this.contextContainer);\n this.fire('canvas:cleared');\n this.renderOnAddRemove && this.requestRenderAll();\n return this;\n },\n\n /**\n * Renders the canvas\n * @return {fabric.Canvas} instance\n * @chainable\n */\n renderAll: function () {\n var canvasToDrawOn = this.contextContainer;\n this.renderCanvas(canvasToDrawOn, this._objects);\n return this;\n },\n\n /**\n * Function created to be instance bound at initialization\n * used in requestAnimationFrame rendering\n * Let the fabricJS call it. If you call it manually you could have more\n * animationFrame stacking on to of each other\n * for an imperative rendering, use canvas.renderAll\n * @private\n * @return {fabric.Canvas} instance\n * @chainable\n */\n renderAndReset: function() {\n this.isRendering = 0;\n this.renderAll();\n },\n\n /**\n * Append a renderAll request to next animation frame.\n * unless one is already in progress, in that case nothing is done\n * a boolean flag will avoid appending more.\n * @return {fabric.Canvas} instance\n * @chainable\n */\n requestRenderAll: function () {\n if (!this.isRendering) {\n this.isRendering = fabric.util.requestAnimFrame(this.renderAndResetBound);\n }\n return this;\n },\n\n /**\n * Calculate the position of the 4 corner of canvas with current viewportTransform.\n * helps to determinate when an object is in the current rendering viewport using\n * object absolute coordinates ( aCoords )\n * @return {Object} points.tl\n * @chainable\n */\n calcViewportBoundaries: function() {\n var points = { }, width = this.width, height = this.height,\n iVpt = invertTransform(this.viewportTransform);\n points.tl = transformPoint({ x: 0, y: 0 }, iVpt);\n points.br = transformPoint({ x: width, y: height }, iVpt);\n points.tr = new fabric.Point(points.br.x, points.tl.y);\n points.bl = new fabric.Point(points.tl.x, points.br.y);\n this.vptCoords = points;\n return points;\n },\n\n cancelRequestedRender: function() {\n if (this.isRendering) {\n fabric.util.cancelAnimFrame(this.isRendering);\n this.isRendering = 0;\n }\n },\n\n /**\n * Renders background, objects, overlay and controls.\n * @param {CanvasRenderingContext2D} ctx\n * @param {Array} objects to render\n * @return {fabric.Canvas} instance\n * @chainable\n */\n renderCanvas: function(ctx, objects) {\n var v = this.viewportTransform, path = this.clipPath;\n this.cancelRequestedRender();\n this.calcViewportBoundaries();\n this.clearContext(ctx);\n fabric.util.setImageSmoothing(ctx, this.imageSmoothingEnabled);\n this.fire('before:render', { ctx: ctx, });\n this._renderBackground(ctx);\n\n ctx.save();\n //apply viewport transform once for all rendering process\n ctx.transform(v[0], v[1], v[2], v[3], v[4], v[5]);\n this._renderObjects(ctx, objects);\n ctx.restore();\n if (!this.controlsAboveOverlay && this.interactive) {\n this.drawControls(ctx);\n }\n if (path) {\n path.canvas = this;\n // needed to setup a couple of variables\n path.shouldCache();\n path._transformDone = true;\n path.renderCache({ forClipping: true });\n this.drawClipPathOnCanvas(ctx);\n }\n this._renderOverlay(ctx);\n if (this.controlsAboveOverlay && this.interactive) {\n this.drawControls(ctx);\n }\n this.fire('after:render', { ctx: ctx, });\n },\n\n /**\n * Paint the cached clipPath on the lowerCanvasEl\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n drawClipPathOnCanvas: function(ctx) {\n var v = this.viewportTransform, path = this.clipPath;\n ctx.save();\n ctx.transform(v[0], v[1], v[2], v[3], v[4], v[5]);\n // DEBUG: uncomment this line, comment the following\n // ctx.globalAlpha = 0.4;\n ctx.globalCompositeOperation = 'destination-in';\n path.transform(ctx);\n ctx.scale(1 / path.zoomX, 1 / path.zoomY);\n ctx.drawImage(path._cacheCanvas, -path.cacheTranslationX, -path.cacheTranslationY);\n ctx.restore();\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {Array} objects to render\n */\n _renderObjects: function(ctx, objects) {\n var i, len;\n for (i = 0, len = objects.length; i < len; ++i) {\n objects[i] && objects[i].render(ctx);\n }\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {string} property 'background' or 'overlay'\n */\n _renderBackgroundOrOverlay: function(ctx, property) {\n var fill = this[property + 'Color'], object = this[property + 'Image'],\n v = this.viewportTransform, needsVpt = this[property + 'Vpt'];\n if (!fill && !object) {\n return;\n }\n if (fill) {\n ctx.save();\n ctx.beginPath();\n ctx.moveTo(0, 0);\n ctx.lineTo(this.width, 0);\n ctx.lineTo(this.width, this.height);\n ctx.lineTo(0, this.height);\n ctx.closePath();\n ctx.fillStyle = fill.toLive\n ? fill.toLive(ctx, this)\n : fill;\n if (needsVpt) {\n ctx.transform(v[0], v[1], v[2], v[3], v[4], v[5]);\n }\n ctx.transform(1, 0, 0, 1, fill.offsetX || 0, fill.offsetY || 0);\n var m = fill.gradientTransform || fill.patternTransform;\n m && ctx.transform(m[0], m[1], m[2], m[3], m[4], m[5]);\n ctx.fill();\n ctx.restore();\n }\n if (object) {\n ctx.save();\n if (needsVpt) {\n ctx.transform(v[0], v[1], v[2], v[3], v[4], v[5]);\n }\n object.render(ctx);\n ctx.restore();\n }\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderBackground: function(ctx) {\n this._renderBackgroundOrOverlay(ctx, 'background');\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderOverlay: function(ctx) {\n this._renderBackgroundOrOverlay(ctx, 'overlay');\n },\n\n /**\n * Returns coordinates of a center of canvas.\n * Returned value is an object with top and left properties\n * @return {Object} object with \"top\" and \"left\" number values\n * @deprecated migrate to `getCenterPoint`\n */\n getCenter: function () {\n return {\n top: this.height / 2,\n left: this.width / 2\n };\n },\n\n /**\n * Returns coordinates of a center of canvas.\n * @return {fabric.Point} \n */\n getCenterPoint: function () {\n return new fabric.Point(this.width / 2, this.height / 2);\n },\n\n /**\n * Centers object horizontally in the canvas\n * @param {fabric.Object} object Object to center horizontally\n * @return {fabric.Canvas} thisArg\n */\n centerObjectH: function (object) {\n return this._centerObject(object, new fabric.Point(this.getCenterPoint().x, object.getCenterPoint().y));\n },\n\n /**\n * Centers object vertically in the canvas\n * @param {fabric.Object} object Object to center vertically\n * @return {fabric.Canvas} thisArg\n * @chainable\n */\n centerObjectV: function (object) {\n return this._centerObject(object, new fabric.Point(object.getCenterPoint().x, this.getCenterPoint().y));\n },\n\n /**\n * Centers object vertically and horizontally in the canvas\n * @param {fabric.Object} object Object to center vertically and horizontally\n * @return {fabric.Canvas} thisArg\n * @chainable\n */\n centerObject: function(object) {\n var center = this.getCenterPoint();\n return this._centerObject(object, center);\n },\n\n /**\n * Centers object vertically and horizontally in the viewport\n * @param {fabric.Object} object Object to center vertically and horizontally\n * @return {fabric.Canvas} thisArg\n * @chainable\n */\n viewportCenterObject: function(object) {\n var vpCenter = this.getVpCenter();\n return this._centerObject(object, vpCenter);\n },\n\n /**\n * Centers object horizontally in the viewport, object.top is unchanged\n * @param {fabric.Object} object Object to center vertically and horizontally\n * @return {fabric.Canvas} thisArg\n * @chainable\n */\n viewportCenterObjectH: function(object) {\n var vpCenter = this.getVpCenter();\n this._centerObject(object, new fabric.Point(vpCenter.x, object.getCenterPoint().y));\n return this;\n },\n\n /**\n * Centers object Vertically in the viewport, object.top is unchanged\n * @param {fabric.Object} object Object to center vertically and horizontally\n * @return {fabric.Canvas} thisArg\n * @chainable\n */\n viewportCenterObjectV: function(object) {\n var vpCenter = this.getVpCenter();\n\n return this._centerObject(object, new fabric.Point(object.getCenterPoint().x, vpCenter.y));\n },\n\n /**\n * Calculate the point in canvas that correspond to the center of actual viewport.\n * @return {fabric.Point} vpCenter, viewport center\n * @chainable\n */\n getVpCenter: function() {\n var center = this.getCenterPoint(),\n iVpt = invertTransform(this.viewportTransform);\n return transformPoint(center, iVpt);\n },\n\n /**\n * @private\n * @param {fabric.Object} object Object to center\n * @param {fabric.Point} center Center point\n * @return {fabric.Canvas} thisArg\n * @chainable\n */\n _centerObject: function(object, center) {\n object.setPositionByOrigin(center, 'center', 'center');\n object.setCoords();\n this.renderOnAddRemove && this.requestRenderAll();\n return this;\n },\n\n /**\n * Returns dataless JSON representation of canvas\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {String} json string\n */\n toDatalessJSON: function (propertiesToInclude) {\n return this.toDatalessObject(propertiesToInclude);\n },\n\n /**\n * Returns object representation of canvas\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toObject: function (propertiesToInclude) {\n return this._toObjectMethod('toObject', propertiesToInclude);\n },\n\n /**\n * Returns dataless object representation of canvas\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toDatalessObject: function (propertiesToInclude) {\n return this._toObjectMethod('toDatalessObject', propertiesToInclude);\n },\n\n /**\n * @private\n */\n _toObjectMethod: function (methodName, propertiesToInclude) {\n\n var clipPath = this.clipPath, data = {\n version: fabric.version,\n objects: this._toObjects(methodName, propertiesToInclude),\n };\n if (clipPath && !clipPath.excludeFromExport) {\n data.clipPath = this._toObject(this.clipPath, methodName, propertiesToInclude);\n }\n extend(data, this.__serializeBgOverlay(methodName, propertiesToInclude));\n\n fabric.util.populateWithProperties(this, data, propertiesToInclude);\n\n return data;\n },\n\n /**\n * @private\n */\n _toObjects: function(methodName, propertiesToInclude) {\n return this._objects.filter(function(object) {\n return !object.excludeFromExport;\n }).map(function(instance) {\n return this._toObject(instance, methodName, propertiesToInclude);\n }, this);\n },\n\n /**\n * @private\n */\n _toObject: function(instance, methodName, propertiesToInclude) {\n var originalValue;\n\n if (!this.includeDefaultValues) {\n originalValue = instance.includeDefaultValues;\n instance.includeDefaultValues = false;\n }\n\n var object = instance[methodName](propertiesToInclude);\n if (!this.includeDefaultValues) {\n instance.includeDefaultValues = originalValue;\n }\n return object;\n },\n\n /**\n * @private\n */\n __serializeBgOverlay: function(methodName, propertiesToInclude) {\n var data = {}, bgImage = this.backgroundImage, overlayImage = this.overlayImage,\n bgColor = this.backgroundColor, overlayColor = this.overlayColor;\n\n if (bgColor && bgColor.toObject) {\n if (!bgColor.excludeFromExport) {\n data.background = bgColor.toObject(propertiesToInclude);\n }\n }\n else if (bgColor) {\n data.background = bgColor;\n }\n\n if (overlayColor && overlayColor.toObject) {\n if (!overlayColor.excludeFromExport) {\n data.overlay = overlayColor.toObject(propertiesToInclude);\n }\n }\n else if (overlayColor) {\n data.overlay = overlayColor;\n }\n\n if (bgImage && !bgImage.excludeFromExport) {\n data.backgroundImage = this._toObject(bgImage, methodName, propertiesToInclude);\n }\n if (overlayImage && !overlayImage.excludeFromExport) {\n data.overlayImage = this._toObject(overlayImage, methodName, propertiesToInclude);\n }\n\n return data;\n },\n\n /* _TO_SVG_START_ */\n /**\n * When true, getSvgTransform() will apply the StaticCanvas.viewportTransform to the SVG transformation. When true,\n * a zoomed canvas will then produce zoomed SVG output.\n * @type Boolean\n * @default\n */\n svgViewportTransformation: true,\n\n /**\n * Returns SVG representation of canvas\n * @function\n * @param {Object} [options] Options object for SVG output\n * @param {Boolean} [options.suppressPreamble=false] If true xml tag is not included\n * @param {Object} [options.viewBox] SVG viewbox object\n * @param {Number} [options.viewBox.x] x-coordinate of viewbox\n * @param {Number} [options.viewBox.y] y-coordinate of viewbox\n * @param {Number} [options.viewBox.width] Width of viewbox\n * @param {Number} [options.viewBox.height] Height of viewbox\n * @param {String} [options.encoding=UTF-8] Encoding of SVG output\n * @param {String} [options.width] desired width of svg with or without units\n * @param {String} [options.height] desired height of svg with or without units\n * @param {Function} [reviver] Method for further parsing of svg elements, called after each fabric object converted into svg representation.\n * @return {String} SVG string\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-3#serialization}\n * @see {@link http://jsfiddle.net/fabricjs/jQ3ZZ/|jsFiddle demo}\n * @example Normal SVG output\n * var svg = canvas.toSVG();\n * @example SVG output without preamble (without <?xml ../>)\n * var svg = canvas.toSVG({suppressPreamble: true});\n * @example SVG output with viewBox attribute\n * var svg = canvas.toSVG({\n * viewBox: {\n * x: 100,\n * y: 100,\n * width: 200,\n * height: 300\n * }\n * });\n * @example SVG output with different encoding (default: UTF-8)\n * var svg = canvas.toSVG({encoding: 'ISO-8859-1'});\n * @example Modify SVG output with reviver function\n * var svg = canvas.toSVG(null, function(svg) {\n * return svg.replace('stroke-dasharray: ; stroke-linecap: butt; stroke-linejoin: miter; stroke-miterlimit: 10; ', '');\n * });\n */\n toSVG: function(options, reviver) {\n options || (options = { });\n options.reviver = reviver;\n var markup = [];\n\n this._setSVGPreamble(markup, options);\n this._setSVGHeader(markup, options);\n if (this.clipPath) {\n markup.push('\\n');\n }\n this._setSVGBgOverlayColor(markup, 'background');\n this._setSVGBgOverlayImage(markup, 'backgroundImage', reviver);\n this._setSVGObjects(markup, reviver);\n if (this.clipPath) {\n markup.push('\\n');\n }\n this._setSVGBgOverlayColor(markup, 'overlay');\n this._setSVGBgOverlayImage(markup, 'overlayImage', reviver);\n\n markup.push('');\n\n return markup.join('');\n },\n\n /**\n * @private\n */\n _setSVGPreamble: function(markup, options) {\n if (options.suppressPreamble) {\n return;\n }\n markup.push(\n '\\n',\n '\\n'\n );\n },\n\n /**\n * @private\n */\n _setSVGHeader: function(markup, options) {\n var width = options.width || this.width,\n height = options.height || this.height,\n vpt, viewBox = 'viewBox=\"0 0 ' + this.width + ' ' + this.height + '\" ',\n NUM_FRACTION_DIGITS = fabric.Object.NUM_FRACTION_DIGITS;\n\n if (options.viewBox) {\n viewBox = 'viewBox=\"' +\n options.viewBox.x + ' ' +\n options.viewBox.y + ' ' +\n options.viewBox.width + ' ' +\n options.viewBox.height + '\" ';\n }\n else {\n if (this.svgViewportTransformation) {\n vpt = this.viewportTransform;\n viewBox = 'viewBox=\"' +\n toFixed(-vpt[4] / vpt[0], NUM_FRACTION_DIGITS) + ' ' +\n toFixed(-vpt[5] / vpt[3], NUM_FRACTION_DIGITS) + ' ' +\n toFixed(this.width / vpt[0], NUM_FRACTION_DIGITS) + ' ' +\n toFixed(this.height / vpt[3], NUM_FRACTION_DIGITS) + '\" ';\n }\n }\n\n markup.push(\n '\\n',\n 'Created with Fabric.js ', fabric.version, '\\n',\n '\\n',\n this.createSVGFontFacesMarkup(),\n this.createSVGRefElementsMarkup(),\n this.createSVGClipPathMarkup(options),\n '\\n'\n );\n },\n\n createSVGClipPathMarkup: function(options) {\n var clipPath = this.clipPath;\n if (clipPath) {\n clipPath.clipPathId = 'CLIPPATH_' + fabric.Object.__uid++;\n return '\\n' +\n this.clipPath.toClipPathSVG(options.reviver) +\n '\\n';\n }\n return '';\n },\n\n /**\n * Creates markup containing SVG referenced elements like patterns, gradients etc.\n * @return {String}\n */\n createSVGRefElementsMarkup: function() {\n var _this = this,\n markup = ['background', 'overlay'].map(function(prop) {\n var fill = _this[prop + 'Color'];\n if (fill && fill.toLive) {\n var shouldTransform = _this[prop + 'Vpt'], vpt = _this.viewportTransform,\n object = {\n width: _this.width / (shouldTransform ? vpt[0] : 1),\n height: _this.height / (shouldTransform ? vpt[3] : 1)\n };\n return fill.toSVG(\n object,\n { additionalTransform: shouldTransform ? fabric.util.matrixToSVG(vpt) : '' }\n );\n }\n });\n return markup.join('');\n },\n\n /**\n * Creates markup containing SVG font faces,\n * font URLs for font faces must be collected by developers\n * and are not extracted from the DOM by fabricjs\n * @param {Array} objects Array of fabric objects\n * @return {String}\n */\n createSVGFontFacesMarkup: function() {\n var markup = '', fontList = { }, obj, fontFamily,\n style, row, rowIndex, _char, charIndex, i, len,\n fontPaths = fabric.fontPaths, objects = [];\n\n this._objects.forEach(function add(object) {\n objects.push(object);\n if (object._objects) {\n object._objects.forEach(add);\n }\n });\n\n for (i = 0, len = objects.length; i < len; i++) {\n obj = objects[i];\n fontFamily = obj.fontFamily;\n if (obj.type.indexOf('text') === -1 || fontList[fontFamily] || !fontPaths[fontFamily]) {\n continue;\n }\n fontList[fontFamily] = true;\n if (!obj.styles) {\n continue;\n }\n style = obj.styles;\n for (rowIndex in style) {\n row = style[rowIndex];\n for (charIndex in row) {\n _char = row[charIndex];\n fontFamily = _char.fontFamily;\n if (!fontList[fontFamily] && fontPaths[fontFamily]) {\n fontList[fontFamily] = true;\n }\n }\n }\n }\n\n for (var j in fontList) {\n markup += [\n '\\t\\t@font-face {\\n',\n '\\t\\t\\tfont-family: \\'', j, '\\';\\n',\n '\\t\\t\\tsrc: url(\\'', fontPaths[j], '\\');\\n',\n '\\t\\t}\\n'\n ].join('');\n }\n\n if (markup) {\n markup = [\n '\\t\\n'\n ].join('');\n }\n\n return markup;\n },\n\n /**\n * @private\n */\n _setSVGObjects: function(markup, reviver) {\n var instance, i, len, objects = this._objects;\n for (i = 0, len = objects.length; i < len; i++) {\n instance = objects[i];\n if (instance.excludeFromExport) {\n continue;\n }\n this._setSVGObject(markup, instance, reviver);\n }\n },\n\n /**\n * @private\n */\n _setSVGObject: function(markup, instance, reviver) {\n markup.push(instance.toSVG(reviver));\n },\n\n /**\n * @private\n */\n _setSVGBgOverlayImage: function(markup, property, reviver) {\n if (this[property] && !this[property].excludeFromExport && this[property].toSVG) {\n markup.push(this[property].toSVG(reviver));\n }\n },\n\n /**\n * @private\n */\n _setSVGBgOverlayColor: function(markup, property) {\n var filler = this[property + 'Color'], vpt = this.viewportTransform, finalWidth = this.width,\n finalHeight = this.height;\n if (!filler) {\n return;\n }\n if (filler.toLive) {\n var repeat = filler.repeat, iVpt = fabric.util.invertTransform(vpt), shouldInvert = this[property + 'Vpt'],\n additionalTransform = shouldInvert ? fabric.util.matrixToSVG(iVpt) : '';\n markup.push(\n '\\n'\n );\n }\n else {\n markup.push(\n '\\n'\n );\n }\n },\n /* _TO_SVG_END_ */\n\n /**\n * Moves an object or the objects of a multiple selection\n * to the bottom of the stack of drawn objects\n * @param {fabric.Object} object Object to send to back\n * @return {fabric.Canvas} thisArg\n * @chainable\n */\n sendToBack: function (object) {\n if (!object) {\n return this;\n }\n var activeSelection = this._activeObject,\n i, obj, objs;\n if (object === activeSelection && object.type === 'activeSelection') {\n objs = activeSelection._objects;\n for (i = objs.length; i--;) {\n obj = objs[i];\n removeFromArray(this._objects, obj);\n this._objects.unshift(obj);\n }\n }\n else {\n removeFromArray(this._objects, object);\n this._objects.unshift(object);\n }\n this.renderOnAddRemove && this.requestRenderAll();\n return this;\n },\n\n /**\n * Moves an object or the objects of a multiple selection\n * to the top of the stack of drawn objects\n * @param {fabric.Object} object Object to send\n * @return {fabric.Canvas} thisArg\n * @chainable\n */\n bringToFront: function (object) {\n if (!object) {\n return this;\n }\n var activeSelection = this._activeObject,\n i, obj, objs;\n if (object === activeSelection && object.type === 'activeSelection') {\n objs = activeSelection._objects;\n for (i = 0; i < objs.length; i++) {\n obj = objs[i];\n removeFromArray(this._objects, obj);\n this._objects.push(obj);\n }\n }\n else {\n removeFromArray(this._objects, object);\n this._objects.push(object);\n }\n this.renderOnAddRemove && this.requestRenderAll();\n return this;\n },\n\n /**\n * Moves an object or a selection down in stack of drawn objects\n * An optional parameter, intersecting allows to move the object in behind\n * the first intersecting object. Where intersection is calculated with\n * bounding box. If no intersection is found, there will not be change in the\n * stack.\n * @param {fabric.Object} object Object to send\n * @param {Boolean} [intersecting] If `true`, send object behind next lower intersecting object\n * @return {fabric.Canvas} thisArg\n * @chainable\n */\n sendBackwards: function (object, intersecting) {\n if (!object) {\n return this;\n }\n var activeSelection = this._activeObject,\n i, obj, idx, newIdx, objs, objsMoved = 0;\n\n if (object === activeSelection && object.type === 'activeSelection') {\n objs = activeSelection._objects;\n for (i = 0; i < objs.length; i++) {\n obj = objs[i];\n idx = this._objects.indexOf(obj);\n if (idx > 0 + objsMoved) {\n newIdx = idx - 1;\n removeFromArray(this._objects, obj);\n this._objects.splice(newIdx, 0, obj);\n }\n objsMoved++;\n }\n }\n else {\n idx = this._objects.indexOf(object);\n if (idx !== 0) {\n // if object is not on the bottom of stack\n newIdx = this._findNewLowerIndex(object, idx, intersecting);\n removeFromArray(this._objects, object);\n this._objects.splice(newIdx, 0, object);\n }\n }\n this.renderOnAddRemove && this.requestRenderAll();\n return this;\n },\n\n /**\n * @private\n */\n _findNewLowerIndex: function(object, idx, intersecting) {\n var newIdx, i;\n\n if (intersecting) {\n newIdx = idx;\n\n // traverse down the stack looking for the nearest intersecting object\n for (i = idx - 1; i >= 0; --i) {\n\n var isIntersecting = object.intersectsWithObject(this._objects[i]) ||\n object.isContainedWithinObject(this._objects[i]) ||\n this._objects[i].isContainedWithinObject(object);\n\n if (isIntersecting) {\n newIdx = i;\n break;\n }\n }\n }\n else {\n newIdx = idx - 1;\n }\n\n return newIdx;\n },\n\n /**\n * Moves an object or a selection up in stack of drawn objects\n * An optional parameter, intersecting allows to move the object in front\n * of the first intersecting object. Where intersection is calculated with\n * bounding box. If no intersection is found, there will not be change in the\n * stack.\n * @param {fabric.Object} object Object to send\n * @param {Boolean} [intersecting] If `true`, send object in front of next upper intersecting object\n * @return {fabric.Canvas} thisArg\n * @chainable\n */\n bringForward: function (object, intersecting) {\n if (!object) {\n return this;\n }\n var activeSelection = this._activeObject,\n i, obj, idx, newIdx, objs, objsMoved = 0;\n\n if (object === activeSelection && object.type === 'activeSelection') {\n objs = activeSelection._objects;\n for (i = objs.length; i--;) {\n obj = objs[i];\n idx = this._objects.indexOf(obj);\n if (idx < this._objects.length - 1 - objsMoved) {\n newIdx = idx + 1;\n removeFromArray(this._objects, obj);\n this._objects.splice(newIdx, 0, obj);\n }\n objsMoved++;\n }\n }\n else {\n idx = this._objects.indexOf(object);\n if (idx !== this._objects.length - 1) {\n // if object is not on top of stack (last item in an array)\n newIdx = this._findNewUpperIndex(object, idx, intersecting);\n removeFromArray(this._objects, object);\n this._objects.splice(newIdx, 0, object);\n }\n }\n this.renderOnAddRemove && this.requestRenderAll();\n return this;\n },\n\n /**\n * @private\n */\n _findNewUpperIndex: function(object, idx, intersecting) {\n var newIdx, i, len;\n\n if (intersecting) {\n newIdx = idx;\n\n // traverse up the stack looking for the nearest intersecting object\n for (i = idx + 1, len = this._objects.length; i < len; ++i) {\n\n var isIntersecting = object.intersectsWithObject(this._objects[i]) ||\n object.isContainedWithinObject(this._objects[i]) ||\n this._objects[i].isContainedWithinObject(object);\n\n if (isIntersecting) {\n newIdx = i;\n break;\n }\n }\n }\n else {\n newIdx = idx + 1;\n }\n\n return newIdx;\n },\n\n /**\n * Moves an object to specified level in stack of drawn objects\n * @param {fabric.Object} object Object to send\n * @param {Number} index Position to move to\n * @return {fabric.Canvas} thisArg\n * @chainable\n */\n moveTo: function (object, index) {\n removeFromArray(this._objects, object);\n this._objects.splice(index, 0, object);\n return this.renderOnAddRemove && this.requestRenderAll();\n },\n\n /**\n * Clears a canvas element and dispose objects\n * @return {fabric.Canvas} thisArg\n * @chainable\n */\n dispose: function () {\n // cancel eventually ongoing renders\n if (this.isRendering) {\n fabric.util.cancelAnimFrame(this.isRendering);\n this.isRendering = 0;\n }\n this.forEachObject(function(object) {\n object.dispose && object.dispose();\n });\n this._objects = [];\n if (this.backgroundImage && this.backgroundImage.dispose) {\n this.backgroundImage.dispose();\n }\n this.backgroundImage = null;\n if (this.overlayImage && this.overlayImage.dispose) {\n this.overlayImage.dispose();\n }\n this.overlayImage = null;\n this._iTextInstances = null;\n this.contextContainer = null;\n // restore canvas style\n this.lowerCanvasEl.classList.remove('lower-canvas');\n fabric.util.setStyle(this.lowerCanvasEl, this._originalCanvasStyle);\n delete this._originalCanvasStyle;\n // restore canvas size to original size in case retina scaling was applied\n this.lowerCanvasEl.setAttribute('width', this.width);\n this.lowerCanvasEl.setAttribute('height', this.height);\n fabric.util.cleanUpJsdomNode(this.lowerCanvasEl);\n this.lowerCanvasEl = undefined;\n return this;\n },\n\n /**\n * Returns a string representation of an instance\n * @return {String} string representation of an instance\n */\n toString: function () {\n return '#';\n }\n });\n\n extend(fabric.StaticCanvas.prototype, fabric.Observable);\n extend(fabric.StaticCanvas.prototype, fabric.Collection);\n extend(fabric.StaticCanvas.prototype, fabric.DataURLExporter);\n\n extend(fabric.StaticCanvas, /** @lends fabric.StaticCanvas */ {\n\n /**\n * @static\n * @type String\n * @default\n */\n EMPTY_JSON: '{\"objects\": [], \"background\": \"white\"}',\n\n /**\n * Provides a way to check support of some of the canvas methods\n * (either those of HTMLCanvasElement itself, or rendering context)\n *\n * @param {String} methodName Method to check support for;\n * Could be one of \"setLineDash\"\n * @return {Boolean | null} `true` if method is supported (or at least exists),\n * `null` if canvas element or context can not be initialized\n */\n supports: function (methodName) {\n var el = createCanvasElement();\n\n if (!el || !el.getContext) {\n return null;\n }\n\n var ctx = el.getContext('2d');\n if (!ctx) {\n return null;\n }\n\n switch (methodName) {\n\n case 'setLineDash':\n return typeof ctx.setLineDash !== 'undefined';\n\n default:\n return null;\n }\n }\n });\n\n /**\n * Returns Object representation of canvas\n * this alias is provided because if you call JSON.stringify on an instance,\n * the toJSON object will be invoked if it exists.\n * Having a toJSON method means you can do JSON.stringify(myCanvas)\n * @function\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} JSON compatible object\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-3#serialization}\n * @see {@link http://jsfiddle.net/fabricjs/pec86/|jsFiddle demo}\n * @example JSON without additional properties\n * var json = canvas.toJSON();\n * @example JSON with additional properties included\n * var json = canvas.toJSON(['lockMovementX', 'lockMovementY', 'lockRotation', 'lockScalingX', 'lockScalingY']);\n * @example JSON without default values\n * canvas.includeDefaultValues = false;\n * var json = canvas.toJSON();\n */\n fabric.StaticCanvas.prototype.toJSON = fabric.StaticCanvas.prototype.toObject;\n\n if (fabric.isLikelyNode) {\n fabric.StaticCanvas.prototype.createPNGStream = function() {\n var impl = getNodeCanvas(this.lowerCanvasEl);\n return impl && impl.createPNGStream();\n };\n fabric.StaticCanvas.prototype.createJPEGStream = function(opts) {\n var impl = getNodeCanvas(this.lowerCanvasEl);\n return impl && impl.createJPEGStream(opts);\n };\n }\n})();\n\n\n/**\n * BaseBrush class\n * @class fabric.BaseBrush\n * @see {@link http://fabricjs.com/freedrawing|Freedrawing demo}\n */\nfabric.BaseBrush = fabric.util.createClass(/** @lends fabric.BaseBrush.prototype */ {\n\n /**\n * Color of a brush\n * @type String\n * @default\n */\n color: 'rgb(0, 0, 0)',\n\n /**\n * Width of a brush, has to be a Number, no string literals\n * @type Number\n * @default\n */\n width: 1,\n\n /**\n * Shadow object representing shadow of this shape.\n * Backwards incompatibility note: This property replaces \"shadowColor\" (String), \"shadowOffsetX\" (Number),\n * \"shadowOffsetY\" (Number) and \"shadowBlur\" (Number) since v1.2.12\n * @type fabric.Shadow\n * @default\n */\n shadow: null,\n\n /**\n * Line endings style of a brush (one of \"butt\", \"round\", \"square\")\n * @type String\n * @default\n */\n strokeLineCap: 'round',\n\n /**\n * Corner style of a brush (one of \"bevel\", \"round\", \"miter\")\n * @type String\n * @default\n */\n strokeLineJoin: 'round',\n\n /**\n * Maximum miter length (used for strokeLineJoin = \"miter\") of a brush's\n * @type Number\n * @default\n */\n strokeMiterLimit: 10,\n\n /**\n * Stroke Dash Array.\n * @type Array\n * @default\n */\n strokeDashArray: null,\n\n /**\n * When `true`, the free drawing is limited to the whiteboard size. Default to false.\n * @type Boolean\n * @default false\n */\n\n limitedToCanvasSize: false,\n\n\n /**\n * Sets brush styles\n * @private\n * @param {CanvasRenderingContext2D} ctx\n */\n _setBrushStyles: function (ctx) {\n ctx.strokeStyle = this.color;\n ctx.lineWidth = this.width;\n ctx.lineCap = this.strokeLineCap;\n ctx.miterLimit = this.strokeMiterLimit;\n ctx.lineJoin = this.strokeLineJoin;\n ctx.setLineDash(this.strokeDashArray || []);\n },\n\n /**\n * Sets the transformation on given context\n * @param {RenderingContext2d} ctx context to render on\n * @private\n */\n _saveAndTransform: function(ctx) {\n var v = this.canvas.viewportTransform;\n ctx.save();\n ctx.transform(v[0], v[1], v[2], v[3], v[4], v[5]);\n },\n\n /**\n * Sets brush shadow styles\n * @private\n */\n _setShadow: function() {\n if (!this.shadow) {\n return;\n }\n\n var canvas = this.canvas,\n shadow = this.shadow,\n ctx = canvas.contextTop,\n zoom = canvas.getZoom();\n if (canvas && canvas._isRetinaScaling()) {\n zoom *= fabric.devicePixelRatio;\n }\n\n ctx.shadowColor = shadow.color;\n ctx.shadowBlur = shadow.blur * zoom;\n ctx.shadowOffsetX = shadow.offsetX * zoom;\n ctx.shadowOffsetY = shadow.offsetY * zoom;\n },\n\n needsFullRender: function() {\n var color = new fabric.Color(this.color);\n return color.getAlpha() < 1 || !!this.shadow;\n },\n\n /**\n * Removes brush shadow styles\n * @private\n */\n _resetShadow: function() {\n var ctx = this.canvas.contextTop;\n\n ctx.shadowColor = '';\n ctx.shadowBlur = ctx.shadowOffsetX = ctx.shadowOffsetY = 0;\n },\n\n /**\n * Check is pointer is outside canvas boundaries\n * @param {Object} pointer\n * @private\n */\n _isOutSideCanvas: function(pointer) {\n return pointer.x < 0 || pointer.x > this.canvas.getWidth() || pointer.y < 0 || pointer.y > this.canvas.getHeight();\n }\n});\n\n\n(function() {\n /**\n * PencilBrush class\n * @class fabric.PencilBrush\n * @extends fabric.BaseBrush\n */\n fabric.PencilBrush = fabric.util.createClass(fabric.BaseBrush, /** @lends fabric.PencilBrush.prototype */ {\n\n /**\n * Discard points that are less than `decimate` pixel distant from each other\n * @type Number\n * @default 0.4\n */\n decimate: 0.4,\n\n /**\n * Draws a straight line between last recorded point to current pointer\n * Used for `shift` functionality\n *\n * @type boolean\n * @default false\n */\n drawStraightLine: false,\n\n /**\n * The event modifier key that makes the brush draw a straight line.\n * If `null` or 'none' or any other string that is not a modifier key the feature is disabled.\n * @type {'altKey' | 'shiftKey' | 'ctrlKey' | 'none' | undefined | null}\n */\n straightLineKey: 'shiftKey',\n\n /**\n * Constructor\n * @param {fabric.Canvas} canvas\n * @return {fabric.PencilBrush} Instance of a pencil brush\n */\n initialize: function(canvas) {\n this.canvas = canvas;\n this._points = [];\n },\n\n needsFullRender: function () {\n return this.callSuper('needsFullRender') || this._hasStraightLine;\n },\n\n /**\n * Invoked inside on mouse down and mouse move\n * @param {Object} pointer\n */\n _drawSegment: function (ctx, p1, p2) {\n var midPoint = p1.midPointFrom(p2);\n ctx.quadraticCurveTo(p1.x, p1.y, midPoint.x, midPoint.y);\n return midPoint;\n },\n\n /**\n * Invoked on mouse down\n * @param {Object} pointer\n */\n onMouseDown: function(pointer, options) {\n if (!this.canvas._isMainEvent(options.e)) {\n return;\n }\n this.drawStraightLine = options.e[this.straightLineKey];\n this._prepareForDrawing(pointer);\n // capture coordinates immediately\n // this allows to draw dots (when movement never occurs)\n this._captureDrawingPath(pointer);\n this._render();\n },\n\n /**\n * Invoked on mouse move\n * @param {Object} pointer\n */\n onMouseMove: function(pointer, options) {\n if (!this.canvas._isMainEvent(options.e)) {\n return;\n }\n this.drawStraightLine = options.e[this.straightLineKey];\n if (this.limitedToCanvasSize === true && this._isOutSideCanvas(pointer)) {\n return;\n }\n if (this._captureDrawingPath(pointer) && this._points.length > 1) {\n if (this.needsFullRender()) {\n // redraw curve\n // clear top canvas\n this.canvas.clearContext(this.canvas.contextTop);\n this._render();\n }\n else {\n var points = this._points, length = points.length, ctx = this.canvas.contextTop;\n // draw the curve update\n this._saveAndTransform(ctx);\n if (this.oldEnd) {\n ctx.beginPath();\n ctx.moveTo(this.oldEnd.x, this.oldEnd.y);\n }\n this.oldEnd = this._drawSegment(ctx, points[length - 2], points[length - 1], true);\n ctx.stroke();\n ctx.restore();\n }\n }\n },\n\n /**\n * Invoked on mouse up\n */\n onMouseUp: function(options) {\n if (!this.canvas._isMainEvent(options.e)) {\n return true;\n }\n this.drawStraightLine = false;\n this.oldEnd = undefined;\n this._finalizeAndAddPath();\n return false;\n },\n\n /**\n * @private\n * @param {Object} pointer Actual mouse position related to the canvas.\n */\n _prepareForDrawing: function(pointer) {\n\n var p = new fabric.Point(pointer.x, pointer.y);\n\n this._reset();\n this._addPoint(p);\n this.canvas.contextTop.moveTo(p.x, p.y);\n },\n\n /**\n * @private\n * @param {fabric.Point} point Point to be added to points array\n */\n _addPoint: function(point) {\n if (this._points.length > 1 && point.eq(this._points[this._points.length - 1])) {\n return false;\n }\n if (this.drawStraightLine && this._points.length > 1) {\n this._hasStraightLine = true;\n this._points.pop();\n }\n this._points.push(point);\n return true;\n },\n\n /**\n * Clear points array and set contextTop canvas style.\n * @private\n */\n _reset: function() {\n this._points = [];\n this._setBrushStyles(this.canvas.contextTop);\n this._setShadow();\n this._hasStraightLine = false;\n },\n\n /**\n * @private\n * @param {Object} pointer Actual mouse position related to the canvas.\n */\n _captureDrawingPath: function(pointer) {\n var pointerPoint = new fabric.Point(pointer.x, pointer.y);\n return this._addPoint(pointerPoint);\n },\n\n /**\n * Draw a smooth path on the topCanvas using quadraticCurveTo\n * @private\n * @param {CanvasRenderingContext2D} [ctx]\n */\n _render: function(ctx) {\n var i, len,\n p1 = this._points[0],\n p2 = this._points[1];\n ctx = ctx || this.canvas.contextTop;\n this._saveAndTransform(ctx);\n ctx.beginPath();\n //if we only have 2 points in the path and they are the same\n //it means that the user only clicked the canvas without moving the mouse\n //then we should be drawing a dot. A path isn't drawn between two identical dots\n //that's why we set them apart a bit\n if (this._points.length === 2 && p1.x === p2.x && p1.y === p2.y) {\n var width = this.width / 1000;\n p1 = new fabric.Point(p1.x, p1.y);\n p2 = new fabric.Point(p2.x, p2.y);\n p1.x -= width;\n p2.x += width;\n }\n ctx.moveTo(p1.x, p1.y);\n\n for (i = 1, len = this._points.length; i < len; i++) {\n // we pick the point between pi + 1 & pi + 2 as the\n // end point and p1 as our control point.\n this._drawSegment(ctx, p1, p2);\n p1 = this._points[i];\n p2 = this._points[i + 1];\n }\n // Draw last line as a straight line while\n // we wait for the next point to be able to calculate\n // the bezier control point\n ctx.lineTo(p1.x, p1.y);\n ctx.stroke();\n ctx.restore();\n },\n\n /**\n * Converts points to SVG path\n * @param {Array} points Array of points\n * @return {(string|number)[][]} SVG path commands\n */\n convertPointsToSVGPath: function (points) {\n var correction = this.width / 1000;\n return fabric.util.getSmoothPathFromPoints(points, correction);\n },\n\n /**\n * @private\n * @param {(string|number)[][]} pathData SVG path commands\n * @returns {boolean}\n */\n _isEmptySVGPath: function (pathData) {\n var pathString = fabric.util.joinPath(pathData);\n return pathString === 'M 0 0 Q 0 0 0 0 L 0 0';\n },\n\n /**\n * Creates fabric.Path object to add on canvas\n * @param {(string|number)[][]} pathData Path data\n * @return {fabric.Path} Path to add on canvas\n */\n createPath: function(pathData) {\n var path = new fabric.Path(pathData, {\n fill: null,\n stroke: this.color,\n strokeWidth: this.width,\n strokeLineCap: this.strokeLineCap,\n strokeMiterLimit: this.strokeMiterLimit,\n strokeLineJoin: this.strokeLineJoin,\n strokeDashArray: this.strokeDashArray,\n });\n if (this.shadow) {\n this.shadow.affectStroke = true;\n path.shadow = new fabric.Shadow(this.shadow);\n }\n\n return path;\n },\n\n /**\n * Decimate points array with the decimate value\n */\n decimatePoints: function(points, distance) {\n if (points.length <= 2) {\n return points;\n }\n var zoom = this.canvas.getZoom(), adjustedDistance = Math.pow(distance / zoom, 2),\n i, l = points.length - 1, lastPoint = points[0], newPoints = [lastPoint],\n cDistance;\n for (i = 1; i < l - 1; i++) {\n cDistance = Math.pow(lastPoint.x - points[i].x, 2) + Math.pow(lastPoint.y - points[i].y, 2);\n if (cDistance >= adjustedDistance) {\n lastPoint = points[i];\n newPoints.push(lastPoint);\n }\n }\n /**\n * Add the last point from the original line to the end of the array.\n * This ensures decimate doesn't delete the last point on the line, and ensures the line is > 1 point.\n */\n newPoints.push(points[l]);\n return newPoints;\n },\n\n /**\n * On mouseup after drawing the path on contextTop canvas\n * we use the points captured to create an new fabric path object\n * and add it to the fabric canvas.\n */\n _finalizeAndAddPath: function() {\n var ctx = this.canvas.contextTop;\n ctx.closePath();\n if (this.decimate) {\n this._points = this.decimatePoints(this._points, this.decimate);\n }\n var pathData = this.convertPointsToSVGPath(this._points);\n if (this._isEmptySVGPath(pathData)) {\n // do not create 0 width/height paths, as they are\n // rendered inconsistently across browsers\n // Firefox 4, for example, renders a dot,\n // whereas Chrome 10 renders nothing\n this.canvas.requestRenderAll();\n return;\n }\n\n var path = this.createPath(pathData);\n this.canvas.clearContext(this.canvas.contextTop);\n this.canvas.fire('before:path:created', { path: path });\n this.canvas.add(path);\n this.canvas.requestRenderAll();\n path.setCoords();\n this._resetShadow();\n\n\n // fire event 'path' created\n this.canvas.fire('path:created', { path: path });\n }\n });\n})();\n\n\n/**\n * CircleBrush class\n * @class fabric.CircleBrush\n */\nfabric.CircleBrush = fabric.util.createClass(fabric.BaseBrush, /** @lends fabric.CircleBrush.prototype */ {\n\n /**\n * Width of a brush\n * @type Number\n * @default\n */\n width: 10,\n\n /**\n * Constructor\n * @param {fabric.Canvas} canvas\n * @return {fabric.CircleBrush} Instance of a circle brush\n */\n initialize: function(canvas) {\n this.canvas = canvas;\n this.points = [];\n },\n\n /**\n * Invoked inside on mouse down and mouse move\n * @param {Object} pointer\n */\n drawDot: function(pointer) {\n var point = this.addPoint(pointer),\n ctx = this.canvas.contextTop;\n this._saveAndTransform(ctx);\n this.dot(ctx, point);\n ctx.restore();\n },\n\n dot: function(ctx, point) {\n ctx.fillStyle = point.fill;\n ctx.beginPath();\n ctx.arc(point.x, point.y, point.radius, 0, Math.PI * 2, false);\n ctx.closePath();\n ctx.fill();\n },\n\n /**\n * Invoked on mouse down\n */\n onMouseDown: function(pointer) {\n this.points.length = 0;\n this.canvas.clearContext(this.canvas.contextTop);\n this._setShadow();\n this.drawDot(pointer);\n },\n\n /**\n * Render the full state of the brush\n * @private\n */\n _render: function() {\n var ctx = this.canvas.contextTop, i, len,\n points = this.points;\n this._saveAndTransform(ctx);\n for (i = 0, len = points.length; i < len; i++) {\n this.dot(ctx, points[i]);\n }\n ctx.restore();\n },\n\n /**\n * Invoked on mouse move\n * @param {Object} pointer\n */\n onMouseMove: function(pointer) {\n if (this.limitedToCanvasSize === true && this._isOutSideCanvas(pointer)) {\n return;\n }\n if (this.needsFullRender()) {\n this.canvas.clearContext(this.canvas.contextTop);\n this.addPoint(pointer);\n this._render();\n }\n else {\n this.drawDot(pointer);\n }\n },\n\n /**\n * Invoked on mouse up\n */\n onMouseUp: function() {\n var originalRenderOnAddRemove = this.canvas.renderOnAddRemove, i, len;\n this.canvas.renderOnAddRemove = false;\n\n var circles = [];\n\n for (i = 0, len = this.points.length; i < len; i++) {\n var point = this.points[i],\n circle = new fabric.Circle({\n radius: point.radius,\n left: point.x,\n top: point.y,\n originX: 'center',\n originY: 'center',\n fill: point.fill\n });\n\n this.shadow && (circle.shadow = new fabric.Shadow(this.shadow));\n\n circles.push(circle);\n }\n var group = new fabric.Group(circles);\n group.canvas = this.canvas;\n\n this.canvas.fire('before:path:created', { path: group });\n this.canvas.add(group);\n this.canvas.fire('path:created', { path: group });\n\n this.canvas.clearContext(this.canvas.contextTop);\n this._resetShadow();\n this.canvas.renderOnAddRemove = originalRenderOnAddRemove;\n this.canvas.requestRenderAll();\n },\n\n /**\n * @param {Object} pointer\n * @return {fabric.Point} Just added pointer point\n */\n addPoint: function(pointer) {\n var pointerPoint = new fabric.Point(pointer.x, pointer.y),\n\n circleRadius = fabric.util.getRandomInt(\n Math.max(0, this.width - 20), this.width + 20) / 2,\n\n circleColor = new fabric.Color(this.color)\n .setAlpha(fabric.util.getRandomInt(0, 100) / 100)\n .toRgba();\n\n pointerPoint.radius = circleRadius;\n pointerPoint.fill = circleColor;\n\n this.points.push(pointerPoint);\n\n return pointerPoint;\n }\n});\n\n\n/**\n * SprayBrush class\n * @class fabric.SprayBrush\n */\nfabric.SprayBrush = fabric.util.createClass( fabric.BaseBrush, /** @lends fabric.SprayBrush.prototype */ {\n\n /**\n * Width of a spray\n * @type Number\n * @default\n */\n width: 10,\n\n /**\n * Density of a spray (number of dots per chunk)\n * @type Number\n * @default\n */\n density: 20,\n\n /**\n * Width of spray dots\n * @type Number\n * @default\n */\n dotWidth: 1,\n\n /**\n * Width variance of spray dots\n * @type Number\n * @default\n */\n dotWidthVariance: 1,\n\n /**\n * Whether opacity of a dot should be random\n * @type Boolean\n * @default\n */\n randomOpacity: false,\n\n /**\n * Whether overlapping dots (rectangles) should be removed (for performance reasons)\n * @type Boolean\n * @default\n */\n optimizeOverlapping: true,\n\n /**\n * Constructor\n * @param {fabric.Canvas} canvas\n * @return {fabric.SprayBrush} Instance of a spray brush\n */\n initialize: function(canvas) {\n this.canvas = canvas;\n this.sprayChunks = [];\n },\n\n /**\n * Invoked on mouse down\n * @param {Object} pointer\n */\n onMouseDown: function(pointer) {\n this.sprayChunks.length = 0;\n this.canvas.clearContext(this.canvas.contextTop);\n this._setShadow();\n\n this.addSprayChunk(pointer);\n this.render(this.sprayChunkPoints);\n },\n\n /**\n * Invoked on mouse move\n * @param {Object} pointer\n */\n onMouseMove: function(pointer) {\n if (this.limitedToCanvasSize === true && this._isOutSideCanvas(pointer)) {\n return;\n }\n this.addSprayChunk(pointer);\n this.render(this.sprayChunkPoints);\n },\n\n /**\n * Invoked on mouse up\n */\n onMouseUp: function() {\n var originalRenderOnAddRemove = this.canvas.renderOnAddRemove;\n this.canvas.renderOnAddRemove = false;\n\n var rects = [];\n\n for (var i = 0, ilen = this.sprayChunks.length; i < ilen; i++) {\n var sprayChunk = this.sprayChunks[i];\n\n for (var j = 0, jlen = sprayChunk.length; j < jlen; j++) {\n\n var rect = new fabric.Rect({\n width: sprayChunk[j].width,\n height: sprayChunk[j].width,\n left: sprayChunk[j].x + 1,\n top: sprayChunk[j].y + 1,\n originX: 'center',\n originY: 'center',\n fill: this.color\n });\n rects.push(rect);\n }\n }\n\n if (this.optimizeOverlapping) {\n rects = this._getOptimizedRects(rects);\n }\n\n var group = new fabric.Group(rects);\n this.shadow && group.set('shadow', new fabric.Shadow(this.shadow));\n this.canvas.fire('before:path:created', { path: group });\n this.canvas.add(group);\n this.canvas.fire('path:created', { path: group });\n\n this.canvas.clearContext(this.canvas.contextTop);\n this._resetShadow();\n this.canvas.renderOnAddRemove = originalRenderOnAddRemove;\n this.canvas.requestRenderAll();\n },\n\n /**\n * @private\n * @param {Array} rects\n */\n _getOptimizedRects: function(rects) {\n\n // avoid creating duplicate rects at the same coordinates\n var uniqueRects = { }, key, i, len;\n\n for (i = 0, len = rects.length; i < len; i++) {\n key = rects[i].left + '' + rects[i].top;\n if (!uniqueRects[key]) {\n uniqueRects[key] = rects[i];\n }\n }\n var uniqueRectsArray = [];\n for (key in uniqueRects) {\n uniqueRectsArray.push(uniqueRects[key]);\n }\n\n return uniqueRectsArray;\n },\n\n /**\n * Render new chunk of spray brush\n */\n render: function(sprayChunk) {\n var ctx = this.canvas.contextTop, i, len;\n ctx.fillStyle = this.color;\n\n this._saveAndTransform(ctx);\n\n for (i = 0, len = sprayChunk.length; i < len; i++) {\n var point = sprayChunk[i];\n if (typeof point.opacity !== 'undefined') {\n ctx.globalAlpha = point.opacity;\n }\n ctx.fillRect(point.x, point.y, point.width, point.width);\n }\n ctx.restore();\n },\n\n /**\n * Render all spray chunks\n */\n _render: function() {\n var ctx = this.canvas.contextTop, i, ilen;\n ctx.fillStyle = this.color;\n\n this._saveAndTransform(ctx);\n\n for (i = 0, ilen = this.sprayChunks.length; i < ilen; i++) {\n this.render(this.sprayChunks[i]);\n }\n ctx.restore();\n },\n\n /**\n * @param {Object} pointer\n */\n addSprayChunk: function(pointer) {\n this.sprayChunkPoints = [];\n\n var x, y, width, radius = this.width / 2, i;\n\n for (i = 0; i < this.density; i++) {\n\n x = fabric.util.getRandomInt(pointer.x - radius, pointer.x + radius);\n y = fabric.util.getRandomInt(pointer.y - radius, pointer.y + radius);\n\n if (this.dotWidthVariance) {\n width = fabric.util.getRandomInt(\n // bottom clamp width to 1\n Math.max(1, this.dotWidth - this.dotWidthVariance),\n this.dotWidth + this.dotWidthVariance);\n }\n else {\n width = this.dotWidth;\n }\n\n var point = new fabric.Point(x, y);\n point.width = width;\n\n if (this.randomOpacity) {\n point.opacity = fabric.util.getRandomInt(0, 100) / 100;\n }\n\n this.sprayChunkPoints.push(point);\n }\n\n this.sprayChunks.push(this.sprayChunkPoints);\n }\n});\n\n\n/**\n * PatternBrush class\n * @class fabric.PatternBrush\n * @extends fabric.BaseBrush\n */\nfabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, /** @lends fabric.PatternBrush.prototype */ {\n\n getPatternSrc: function() {\n\n var dotWidth = 20,\n dotDistance = 5,\n patternCanvas = fabric.util.createCanvasElement(),\n patternCtx = patternCanvas.getContext('2d');\n\n patternCanvas.width = patternCanvas.height = dotWidth + dotDistance;\n\n patternCtx.fillStyle = this.color;\n patternCtx.beginPath();\n patternCtx.arc(dotWidth / 2, dotWidth / 2, dotWidth / 2, 0, Math.PI * 2, false);\n patternCtx.closePath();\n patternCtx.fill();\n\n return patternCanvas;\n },\n\n getPatternSrcFunction: function() {\n return String(this.getPatternSrc).replace('this.color', '\"' + this.color + '\"');\n },\n\n /**\n * Creates \"pattern\" instance property\n * @param {CanvasRenderingContext2D} ctx\n */\n getPattern: function(ctx) {\n return ctx.createPattern(this.source || this.getPatternSrc(), 'repeat');\n },\n\n /**\n * Sets brush styles\n * @param {CanvasRenderingContext2D} ctx\n */\n _setBrushStyles: function(ctx) {\n this.callSuper('_setBrushStyles', ctx);\n ctx.strokeStyle = this.getPattern(ctx);\n },\n\n /**\n * Creates path\n */\n createPath: function(pathData) {\n var path = this.callSuper('createPath', pathData),\n topLeft = path._getLeftTopCoords().scalarAdd(path.strokeWidth / 2);\n\n path.stroke = new fabric.Pattern({\n source: this.source || this.getPatternSrcFunction(),\n offsetX: -topLeft.x,\n offsetY: -topLeft.y\n });\n return path;\n }\n});\n\n\n(function() {\n\n var getPointer = fabric.util.getPointer,\n degreesToRadians = fabric.util.degreesToRadians,\n isTouchEvent = fabric.util.isTouchEvent;\n\n /**\n * Canvas class\n * @class fabric.Canvas\n * @extends fabric.StaticCanvas\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-1#canvas}\n * @see {@link fabric.Canvas#initialize} for constructor definition\n *\n * @fires object:modified at the end of a transform or any change when statefull is true\n * @fires object:rotating while an object is being rotated from the control\n * @fires object:scaling while an object is being scaled by controls\n * @fires object:moving while an object is being dragged\n * @fires object:skewing while an object is being skewed from the controls\n *\n * @fires before:transform before a transform is is started\n * @fires before:selection:cleared\n * @fires selection:cleared\n * @fires selection:updated\n * @fires selection:created\n *\n * @fires path:created after a drawing operation ends and the path is added\n * @fires mouse:down\n * @fires mouse:move\n * @fires mouse:up\n * @fires mouse:down:before on mouse down, before the inner fabric logic runs\n * @fires mouse:move:before on mouse move, before the inner fabric logic runs\n * @fires mouse:up:before on mouse up, before the inner fabric logic runs\n * @fires mouse:over\n * @fires mouse:out\n * @fires mouse:dblclick whenever a native dbl click event fires on the canvas.\n *\n * @fires dragover\n * @fires dragenter\n * @fires dragleave\n * @fires drop:before before drop event. same native event. This is added to handle edge cases\n * @fires drop\n * @fires after:render at the end of the render process, receives the context in the callback\n * @fires before:render at start the render process, receives the context in the callback\n *\n */\n fabric.Canvas = fabric.util.createClass(fabric.StaticCanvas, /** @lends fabric.Canvas.prototype */ {\n\n /**\n * Constructor\n * @param {HTMLElement | String} el <canvas> element to initialize instance on\n * @param {Object} [options] Options object\n * @return {Object} thisArg\n */\n initialize: function(el, options) {\n options || (options = { });\n this.renderAndResetBound = this.renderAndReset.bind(this);\n this.requestRenderAllBound = this.requestRenderAll.bind(this);\n this._initStatic(el, options);\n this._initInteractive();\n this._createCacheCanvas();\n },\n\n /**\n * When true, objects can be transformed by one side (unproportionally)\n * when dragged on the corners that normally would not do that.\n * @type Boolean\n * @default\n * @since fabric 4.0 // changed name and default value\n */\n uniformScaling: true,\n\n /**\n * Indicates which key switches uniform scaling.\n * values: 'altKey', 'shiftKey', 'ctrlKey'.\n * If `null` or 'none' or any other string that is not a modifier key\n * feature is disabled.\n * totally wrong named. this sounds like `uniform scaling`\n * if Canvas.uniformScaling is true, pressing this will set it to false\n * and viceversa.\n * @since 1.6.2\n * @type String\n * @default\n */\n uniScaleKey: 'shiftKey',\n\n /**\n * When true, objects use center point as the origin of scale transformation.\n * Backwards incompatibility note: This property replaces \"centerTransform\" (Boolean).\n * @since 1.3.4\n * @type Boolean\n * @default\n */\n centeredScaling: false,\n\n /**\n * When true, objects use center point as the origin of rotate transformation.\n * Backwards incompatibility note: This property replaces \"centerTransform\" (Boolean).\n * @since 1.3.4\n * @type Boolean\n * @default\n */\n centeredRotation: false,\n\n /**\n * Indicates which key enable centered Transform\n * values: 'altKey', 'shiftKey', 'ctrlKey'.\n * If `null` or 'none' or any other string that is not a modifier key\n * feature is disabled feature disabled.\n * @since 1.6.2\n * @type String\n * @default\n */\n centeredKey: 'altKey',\n\n /**\n * Indicates which key enable alternate action on corner\n * values: 'altKey', 'shiftKey', 'ctrlKey'.\n * If `null` or 'none' or any other string that is not a modifier key\n * feature is disabled feature disabled.\n * @since 1.6.2\n * @type String\n * @default\n */\n altActionKey: 'shiftKey',\n\n /**\n * Indicates that canvas is interactive. This property should not be changed.\n * @type Boolean\n * @default\n */\n interactive: true,\n\n /**\n * Indicates whether group selection should be enabled\n * @type Boolean\n * @default\n */\n selection: true,\n\n /**\n * Indicates which key or keys enable multiple click selection\n * Pass value as a string or array of strings\n * values: 'altKey', 'shiftKey', 'ctrlKey'.\n * If `null` or empty or containing any other string that is not a modifier key\n * feature is disabled.\n * @since 1.6.2\n * @type String|Array\n * @default\n */\n selectionKey: 'shiftKey',\n\n /**\n * Indicates which key enable alternative selection\n * in case of target overlapping with active object\n * values: 'altKey', 'shiftKey', 'ctrlKey'.\n * For a series of reason that come from the general expectations on how\n * things should work, this feature works only for preserveObjectStacking true.\n * If `null` or 'none' or any other string that is not a modifier key\n * feature is disabled.\n * @since 1.6.5\n * @type null|String\n * @default\n */\n altSelectionKey: null,\n\n /**\n * Color of selection\n * @type String\n * @default\n */\n selectionColor: 'rgba(100, 100, 255, 0.3)', // blue\n\n /**\n * Default dash array pattern\n * If not empty the selection border is dashed\n * @type Array\n */\n selectionDashArray: [],\n\n /**\n * Color of the border of selection (usually slightly darker than color of selection itself)\n * @type String\n * @default\n */\n selectionBorderColor: 'rgba(255, 255, 255, 0.3)',\n\n /**\n * Width of a line used in object/group selection\n * @type Number\n * @default\n */\n selectionLineWidth: 1,\n\n /**\n * Select only shapes that are fully contained in the dragged selection rectangle.\n * @type Boolean\n * @default\n */\n selectionFullyContained: false,\n\n /**\n * Default cursor value used when hovering over an object on canvas\n * @type String\n * @default\n */\n hoverCursor: 'move',\n\n /**\n * Default cursor value used when moving an object on canvas\n * @type String\n * @default\n */\n moveCursor: 'move',\n\n /**\n * Default cursor value used for the entire canvas\n * @type String\n * @default\n */\n defaultCursor: 'default',\n\n /**\n * Cursor value used during free drawing\n * @type String\n * @default\n */\n freeDrawingCursor: 'crosshair',\n\n /**\n * Cursor value used for disabled elements ( corners with disabled action )\n * @type String\n * @since 2.0.0\n * @default\n */\n notAllowedCursor: 'not-allowed',\n\n /**\n * Default element class that's given to wrapper (div) element of canvas\n * @type String\n * @default\n */\n containerClass: 'canvas-container',\n\n /**\n * When true, object detection happens on per-pixel basis rather than on per-bounding-box\n * @type Boolean\n * @default\n */\n perPixelTargetFind: false,\n\n /**\n * Number of pixels around target pixel to tolerate (consider active) during object detection\n * @type Number\n * @default\n */\n targetFindTolerance: 0,\n\n /**\n * When true, target detection is skipped. Target detection will return always undefined.\n * click selection won't work anymore, events will fire with no targets.\n * if something is selected before setting it to true, it will be deselected at the first click.\n * area selection will still work. check the `selection` property too.\n * if you deactivate both, you should look into staticCanvas.\n * @type Boolean\n * @default\n */\n skipTargetFind: false,\n\n /**\n * When true, mouse events on canvas (mousedown/mousemove/mouseup) result in free drawing.\n * After mousedown, mousemove creates a shape,\n * and then mouseup finalizes it and adds an instance of `fabric.Path` onto canvas.\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-4#free_drawing}\n * @type Boolean\n * @default\n */\n isDrawingMode: false,\n\n /**\n * Indicates whether objects should remain in current stack position when selected.\n * When false objects are brought to top and rendered as part of the selection group\n * @type Boolean\n * @default\n */\n preserveObjectStacking: false,\n\n /**\n * Indicates the angle that an object will lock to while rotating.\n * @type Number\n * @since 1.6.7\n * @default\n */\n snapAngle: 0,\n\n /**\n * Indicates the distance from the snapAngle the rotation will lock to the snapAngle.\n * When `null`, the snapThreshold will default to the snapAngle.\n * @type null|Number\n * @since 1.6.7\n * @default\n */\n snapThreshold: null,\n\n /**\n * Indicates if the right click on canvas can output the context menu or not\n * @type Boolean\n * @since 1.6.5\n * @default\n */\n stopContextMenu: false,\n\n /**\n * Indicates if the canvas can fire right click events\n * @type Boolean\n * @since 1.6.5\n * @default\n */\n fireRightClick: false,\n\n /**\n * Indicates if the canvas can fire middle click events\n * @type Boolean\n * @since 1.7.8\n * @default\n */\n fireMiddleClick: false,\n\n /**\n * Keep track of the subTargets for Mouse Events\n * @type fabric.Object[]\n */\n targets: [],\n\n /**\n * When the option is enabled, PointerEvent is used instead of MouseEvent.\n * @type Boolean\n * @default\n */\n enablePointerEvents: false,\n\n /**\n * Keep track of the hovered target\n * @type fabric.Object\n * @private\n */\n _hoveredTarget: null,\n\n /**\n * hold the list of nested targets hovered\n * @type fabric.Object[]\n * @private\n */\n _hoveredTargets: [],\n\n /**\n * @private\n */\n _initInteractive: function() {\n this._currentTransform = null;\n this._groupSelector = null;\n this._initWrapperElement();\n this._createUpperCanvas();\n this._initEventListeners();\n\n this._initRetinaScaling();\n\n this.freeDrawingBrush = fabric.PencilBrush && new fabric.PencilBrush(this);\n\n this.calcOffset();\n },\n\n /**\n * Divides objects in two groups, one to render immediately\n * and one to render as activeGroup.\n * @return {Array} objects to render immediately and pushes the other in the activeGroup.\n */\n _chooseObjectsToRender: function() {\n var activeObjects = this.getActiveObjects(),\n object, objsToRender, activeGroupObjects;\n\n if (activeObjects.length > 0 && !this.preserveObjectStacking) {\n objsToRender = [];\n activeGroupObjects = [];\n for (var i = 0, length = this._objects.length; i < length; i++) {\n object = this._objects[i];\n if (activeObjects.indexOf(object) === -1 ) {\n objsToRender.push(object);\n }\n else {\n activeGroupObjects.push(object);\n }\n }\n if (activeObjects.length > 1) {\n this._activeObject._objects = activeGroupObjects;\n }\n objsToRender.push.apply(objsToRender, activeGroupObjects);\n }\n else {\n objsToRender = this._objects;\n }\n return objsToRender;\n },\n\n /**\n * Renders both the top canvas and the secondary container canvas.\n * @return {fabric.Canvas} instance\n * @chainable\n */\n renderAll: function () {\n if (this.contextTopDirty && !this._groupSelector && !this.isDrawingMode) {\n this.clearContext(this.contextTop);\n this.contextTopDirty = false;\n }\n if (this.hasLostContext) {\n this.renderTopLayer(this.contextTop);\n this.hasLostContext = false;\n }\n var canvasToDrawOn = this.contextContainer;\n this.renderCanvas(canvasToDrawOn, this._chooseObjectsToRender());\n return this;\n },\n\n renderTopLayer: function(ctx) {\n ctx.save();\n if (this.isDrawingMode && this._isCurrentlyDrawing) {\n this.freeDrawingBrush && this.freeDrawingBrush._render();\n this.contextTopDirty = true;\n }\n // we render the top context - last object\n if (this.selection && this._groupSelector) {\n this._drawSelection(ctx);\n this.contextTopDirty = true;\n }\n ctx.restore();\n },\n\n /**\n * Method to render only the top canvas.\n * Also used to render the group selection box.\n * @return {fabric.Canvas} thisArg\n * @chainable\n */\n renderTop: function () {\n var ctx = this.contextTop;\n this.clearContext(ctx);\n this.renderTopLayer(ctx);\n this.fire('after:render');\n return this;\n },\n\n /**\n * @private\n */\n _normalizePointer: function (object, pointer) {\n var m = object.calcTransformMatrix(),\n invertedM = fabric.util.invertTransform(m),\n vptPointer = this.restorePointerVpt(pointer);\n return fabric.util.transformPoint(vptPointer, invertedM);\n },\n\n /**\n * Returns true if object is transparent at a certain location\n * @param {fabric.Object} target Object to check\n * @param {Number} x Left coordinate\n * @param {Number} y Top coordinate\n * @return {Boolean}\n */\n isTargetTransparent: function (target, x, y) {\n // in case the target is the activeObject, we cannot execute this optimization\n // because we need to draw controls too.\n if (target.shouldCache() && target._cacheCanvas && target !== this._activeObject) {\n var normalizedPointer = this._normalizePointer(target, {x: x, y: y}),\n targetRelativeX = Math.max(target.cacheTranslationX + (normalizedPointer.x * target.zoomX), 0),\n targetRelativeY = Math.max(target.cacheTranslationY + (normalizedPointer.y * target.zoomY), 0);\n\n var isTransparent = fabric.util.isTransparent(\n target._cacheContext, Math.round(targetRelativeX), Math.round(targetRelativeY), this.targetFindTolerance);\n\n return isTransparent;\n }\n\n var ctx = this.contextCache,\n originalColor = target.selectionBackgroundColor, v = this.viewportTransform;\n\n target.selectionBackgroundColor = '';\n\n this.clearContext(ctx);\n\n ctx.save();\n ctx.transform(v[0], v[1], v[2], v[3], v[4], v[5]);\n target.render(ctx);\n ctx.restore();\n\n target.selectionBackgroundColor = originalColor;\n\n var isTransparent = fabric.util.isTransparent(\n ctx, x, y, this.targetFindTolerance);\n\n return isTransparent;\n },\n\n /**\n * takes an event and determines if selection key has been pressed\n * @private\n * @param {Event} e Event object\n */\n _isSelectionKeyPressed: function(e) {\n var selectionKeyPressed = false;\n\n if (Array.isArray(this.selectionKey)) {\n selectionKeyPressed = !!this.selectionKey.find(function(key) { return e[key] === true; });\n }\n else {\n selectionKeyPressed = e[this.selectionKey];\n }\n\n return selectionKeyPressed;\n },\n\n /**\n * @private\n * @param {Event} e Event object\n * @param {fabric.Object} target\n */\n _shouldClearSelection: function (e, target) {\n var activeObjects = this.getActiveObjects(),\n activeObject = this._activeObject;\n\n return (\n !target\n ||\n (target &&\n activeObject &&\n activeObjects.length > 1 &&\n activeObjects.indexOf(target) === -1 &&\n activeObject !== target &&\n !this._isSelectionKeyPressed(e))\n ||\n (target && !target.evented)\n ||\n (target &&\n !target.selectable &&\n activeObject &&\n activeObject !== target)\n );\n },\n\n /**\n * centeredScaling from object can't override centeredScaling from canvas.\n * this should be fixed, since object setting should take precedence over canvas.\n * also this should be something that will be migrated in the control properties.\n * as ability to define the origin of the transformation that the control provide.\n * @private\n * @param {fabric.Object} target\n * @param {String} action\n * @param {Boolean} altKey\n */\n _shouldCenterTransform: function (target, action, altKey) {\n if (!target) {\n return;\n }\n\n var centerTransform;\n\n if (action === 'scale' || action === 'scaleX' || action === 'scaleY' || action === 'resizing') {\n centerTransform = this.centeredScaling || target.centeredScaling;\n }\n else if (action === 'rotate') {\n centerTransform = this.centeredRotation || target.centeredRotation;\n }\n\n return centerTransform ? !altKey : altKey;\n },\n\n /**\n * should disappear before release 4.0\n * @private\n */\n _getOriginFromCorner: function(target, corner) {\n var origin = {\n x: target.originX,\n y: target.originY\n };\n\n if (corner === 'ml' || corner === 'tl' || corner === 'bl') {\n origin.x = 'right';\n }\n else if (corner === 'mr' || corner === 'tr' || corner === 'br') {\n origin.x = 'left';\n }\n\n if (corner === 'tl' || corner === 'mt' || corner === 'tr') {\n origin.y = 'bottom';\n }\n else if (corner === 'bl' || corner === 'mb' || corner === 'br') {\n origin.y = 'top';\n }\n return origin;\n },\n\n /**\n * @private\n * @param {Boolean} alreadySelected true if target is already selected\n * @param {String} corner a string representing the corner ml, mr, tl ...\n * @param {Event} e Event object\n * @param {fabric.Object} [target] inserted back to help overriding. Unused\n */\n _getActionFromCorner: function(alreadySelected, corner, e, target) {\n if (!corner || !alreadySelected) {\n return 'drag';\n }\n var control = target.controls[corner];\n return control.getActionName(e, control, target);\n },\n\n /**\n * @private\n * @param {Event} e Event object\n * @param {fabric.Object} target\n */\n _setupCurrentTransform: function (e, target, alreadySelected) {\n if (!target) {\n return;\n }\n\n var pointer = this.getPointer(e), corner = target.__corner,\n control = target.controls[corner],\n actionHandler = (alreadySelected && corner) ?\n control.getActionHandler(e, target, control) : fabric.controlsUtils.dragHandler,\n action = this._getActionFromCorner(alreadySelected, corner, e, target),\n origin = this._getOriginFromCorner(target, corner),\n altKey = e[this.centeredKey],\n transform = {\n target: target,\n action: action,\n actionHandler: actionHandler,\n corner: corner,\n scaleX: target.scaleX,\n scaleY: target.scaleY,\n skewX: target.skewX,\n skewY: target.skewY,\n // used by transation\n offsetX: pointer.x - target.left,\n offsetY: pointer.y - target.top,\n originX: origin.x,\n originY: origin.y,\n ex: pointer.x,\n ey: pointer.y,\n lastX: pointer.x,\n lastY: pointer.y,\n // unsure they are useful anymore.\n // left: target.left,\n // top: target.top,\n theta: degreesToRadians(target.angle),\n // end of unsure\n width: target.width * target.scaleX,\n shiftKey: e.shiftKey,\n altKey: altKey,\n original: fabric.util.saveObjectTransform(target),\n };\n\n if (this._shouldCenterTransform(target, action, altKey)) {\n transform.originX = 'center';\n transform.originY = 'center';\n }\n transform.original.originX = origin.x;\n transform.original.originY = origin.y;\n this._currentTransform = transform;\n this._beforeTransform(e);\n },\n\n /**\n * Set the cursor type of the canvas element\n * @param {String} value Cursor type of the canvas element.\n * @see http://www.w3.org/TR/css3-ui/#cursor\n */\n setCursor: function (value) {\n this.upperCanvasEl.style.cursor = value;\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx to draw the selection on\n */\n _drawSelection: function (ctx) {\n var selector = this._groupSelector,\n viewportStart = new fabric.Point(selector.ex, selector.ey),\n start = fabric.util.transformPoint(viewportStart, this.viewportTransform),\n viewportExtent = new fabric.Point(selector.ex + selector.left, selector.ey + selector.top),\n extent = fabric.util.transformPoint(viewportExtent, this.viewportTransform),\n minX = Math.min(start.x, extent.x),\n minY = Math.min(start.y, extent.y),\n maxX = Math.max(start.x, extent.x),\n maxY = Math.max(start.y, extent.y),\n strokeOffset = this.selectionLineWidth / 2;\n\n if (this.selectionColor) {\n ctx.fillStyle = this.selectionColor;\n ctx.fillRect(minX, minY, maxX - minX, maxY - minY);\n }\n\n if (!this.selectionLineWidth || !this.selectionBorderColor) {\n return;\n }\n ctx.lineWidth = this.selectionLineWidth;\n ctx.strokeStyle = this.selectionBorderColor;\n\n minX += strokeOffset;\n minY += strokeOffset;\n maxX -= strokeOffset;\n maxY -= strokeOffset;\n // selection border\n fabric.Object.prototype._setLineDash.call(this, ctx, this.selectionDashArray);\n ctx.strokeRect(minX, minY, maxX - minX, maxY - minY);\n },\n\n /**\n * Method that determines what object we are clicking on\n * the skipGroup parameter is for internal use, is needed for shift+click action\n * 11/09/2018 TODO: would be cool if findTarget could discern between being a full target\n * or the outside part of the corner.\n * @param {Event} e mouse event\n * @param {Boolean} skipGroup when true, activeGroup is skipped and only objects are traversed through\n * @return {fabric.Object} the target found\n */\n findTarget: function (e, skipGroup) {\n if (this.skipTargetFind) {\n return;\n }\n\n var ignoreZoom = true,\n pointer = this.getPointer(e, ignoreZoom),\n activeObject = this._activeObject,\n aObjects = this.getActiveObjects(),\n activeTarget, activeTargetSubs,\n isTouch = isTouchEvent(e),\n shouldLookForActive = (aObjects.length > 1 && !skipGroup) || aObjects.length === 1;\n\n // first check current group (if one exists)\n // active group does not check sub targets like normal groups.\n // if active group just exits.\n this.targets = [];\n\n // if we hit the corner of an activeObject, let's return that.\n if (shouldLookForActive && activeObject._findTargetCorner(pointer, isTouch)) {\n return activeObject;\n }\n if (aObjects.length > 1 && !skipGroup && activeObject === this._searchPossibleTargets([activeObject], pointer)) {\n return activeObject;\n }\n if (aObjects.length === 1 &&\n activeObject === this._searchPossibleTargets([activeObject], pointer)) {\n if (!this.preserveObjectStacking) {\n return activeObject;\n }\n else {\n activeTarget = activeObject;\n activeTargetSubs = this.targets;\n this.targets = [];\n }\n }\n var target = this._searchPossibleTargets(this._objects, pointer);\n if (e[this.altSelectionKey] && target && activeTarget && target !== activeTarget) {\n target = activeTarget;\n this.targets = activeTargetSubs;\n }\n return target;\n },\n\n /**\n * Checks point is inside the object.\n * @param {Object} [pointer] x,y object of point coordinates we want to check.\n * @param {fabric.Object} obj Object to test against\n * @param {Object} [globalPointer] x,y object of point coordinates relative to canvas used to search per pixel target.\n * @return {Boolean} true if point is contained within an area of given object\n * @private\n */\n _checkTarget: function(pointer, obj, globalPointer) {\n if (obj &&\n obj.visible &&\n obj.evented &&\n // http://www.geog.ubc.ca/courses/klink/gis.notes/ncgia/u32.html\n // http://idav.ucdavis.edu/~okreylos/TAship/Spring2000/PointInPolygon.html\n obj.containsPoint(pointer)\n ) {\n if ((this.perPixelTargetFind || obj.perPixelTargetFind) && !obj.isEditing) {\n var isTransparent = this.isTargetTransparent(obj, globalPointer.x, globalPointer.y);\n if (!isTransparent) {\n return true;\n }\n }\n else {\n return true;\n }\n }\n },\n\n /**\n * Function used to search inside objects an object that contains pointer in bounding box or that contains pointerOnCanvas when painted\n * @param {Array} [objects] objects array to look into\n * @param {Object} [pointer] x,y object of point coordinates we want to check.\n * @return {fabric.Object} object that contains pointer\n * @private\n */\n _searchPossibleTargets: function(objects, pointer) {\n // Cache all targets where their bounding box contains point.\n var target, i = objects.length, subTarget;\n // Do not check for currently grouped objects, since we check the parent group itself.\n // until we call this function specifically to search inside the activeGroup\n while (i--) {\n var objToCheck = objects[i];\n var pointerToUse = objToCheck.group ?\n this._normalizePointer(objToCheck.group, pointer) : pointer;\n if (this._checkTarget(pointerToUse, objToCheck, pointer)) {\n target = objects[i];\n if (target.subTargetCheck && target instanceof fabric.Group) {\n subTarget = this._searchPossibleTargets(target._objects, pointer);\n subTarget && this.targets.push(subTarget);\n }\n break;\n }\n }\n return target;\n },\n\n /**\n * Returns pointer coordinates without the effect of the viewport\n * @param {Object} pointer with \"x\" and \"y\" number values\n * @return {Object} object with \"x\" and \"y\" number values\n */\n restorePointerVpt: function(pointer) {\n return fabric.util.transformPoint(\n pointer,\n fabric.util.invertTransform(this.viewportTransform)\n );\n },\n\n /**\n * Returns pointer coordinates relative to canvas.\n * Can return coordinates with or without viewportTransform.\n * ignoreZoom false gives back coordinates that represent\n * the point clicked on canvas element.\n * ignoreZoom true gives back coordinates after being processed\n * by the viewportTransform ( sort of coordinates of what is displayed\n * on the canvas where you are clicking.\n * ignoreZoom true = HTMLElement coordinates relative to top,left\n * ignoreZoom false, default = fabric space coordinates, the same used for shape position\n * To interact with your shapes top and left you want to use ignoreZoom true\n * most of the time, while ignoreZoom false will give you coordinates\n * compatible with the object.oCoords system.\n * of the time.\n * @param {Event} e\n * @param {Boolean} ignoreZoom\n * @return {Object} object with \"x\" and \"y\" number values\n */\n getPointer: function (e, ignoreZoom) {\n // return cached values if we are in the event processing chain\n if (this._absolutePointer && !ignoreZoom) {\n return this._absolutePointer;\n }\n if (this._pointer && ignoreZoom) {\n return this._pointer;\n }\n\n var pointer = getPointer(e),\n upperCanvasEl = this.upperCanvasEl,\n bounds = upperCanvasEl.getBoundingClientRect(),\n boundsWidth = bounds.width || 0,\n boundsHeight = bounds.height || 0,\n cssScale;\n\n if (!boundsWidth || !boundsHeight ) {\n if ('top' in bounds && 'bottom' in bounds) {\n boundsHeight = Math.abs( bounds.top - bounds.bottom );\n }\n if ('right' in bounds && 'left' in bounds) {\n boundsWidth = Math.abs( bounds.right - bounds.left );\n }\n }\n\n this.calcOffset();\n pointer.x = pointer.x - this._offset.left;\n pointer.y = pointer.y - this._offset.top;\n if (!ignoreZoom) {\n pointer = this.restorePointerVpt(pointer);\n }\n\n var retinaScaling = this.getRetinaScaling();\n if (retinaScaling !== 1) {\n pointer.x /= retinaScaling;\n pointer.y /= retinaScaling;\n }\n\n if (boundsWidth === 0 || boundsHeight === 0) {\n // If bounds are not available (i.e. not visible), do not apply scale.\n cssScale = { width: 1, height: 1 };\n }\n else {\n cssScale = {\n width: upperCanvasEl.width / boundsWidth,\n height: upperCanvasEl.height / boundsHeight\n };\n }\n\n return {\n x: pointer.x * cssScale.width,\n y: pointer.y * cssScale.height\n };\n },\n\n /**\n * @private\n * @throws {CANVAS_INIT_ERROR} If canvas can not be initialized\n */\n _createUpperCanvas: function () {\n var lowerCanvasClass = this.lowerCanvasEl.className.replace(/\\s*lower-canvas\\s*/, ''),\n lowerCanvasEl = this.lowerCanvasEl, upperCanvasEl = this.upperCanvasEl;\n\n // there is no need to create a new upperCanvas element if we have already one.\n if (upperCanvasEl) {\n upperCanvasEl.className = '';\n }\n else {\n upperCanvasEl = this._createCanvasElement();\n this.upperCanvasEl = upperCanvasEl;\n }\n fabric.util.addClass(upperCanvasEl, 'upper-canvas ' + lowerCanvasClass);\n\n this.wrapperEl.appendChild(upperCanvasEl);\n\n this._copyCanvasStyle(lowerCanvasEl, upperCanvasEl);\n this._applyCanvasStyle(upperCanvasEl);\n this.contextTop = upperCanvasEl.getContext('2d');\n },\n\n /**\n * Returns context of top canvas where interactions are drawn\n * @returns {CanvasRenderingContext2D}\n */\n getTopContext: function () {\n return this.contextTop;\n },\n\n /**\n * @private\n */\n _createCacheCanvas: function () {\n this.cacheCanvasEl = this._createCanvasElement();\n this.cacheCanvasEl.setAttribute('width', this.width);\n this.cacheCanvasEl.setAttribute('height', this.height);\n this.contextCache = this.cacheCanvasEl.getContext('2d');\n },\n\n /**\n * @private\n */\n _initWrapperElement: function () {\n this.wrapperEl = fabric.util.wrapElement(this.lowerCanvasEl, 'div', {\n 'class': this.containerClass\n });\n fabric.util.setStyle(this.wrapperEl, {\n width: this.width + 'px',\n height: this.height + 'px',\n position: 'relative'\n });\n fabric.util.makeElementUnselectable(this.wrapperEl);\n },\n\n /**\n * @private\n * @param {HTMLElement} element canvas element to apply styles on\n */\n _applyCanvasStyle: function (element) {\n var width = this.width || element.width,\n height = this.height || element.height;\n\n fabric.util.setStyle(element, {\n position: 'absolute',\n width: width + 'px',\n height: height + 'px',\n left: 0,\n top: 0,\n 'touch-action': this.allowTouchScrolling ? 'manipulation' : 'none',\n '-ms-touch-action': this.allowTouchScrolling ? 'manipulation' : 'none'\n });\n element.width = width;\n element.height = height;\n fabric.util.makeElementUnselectable(element);\n },\n\n /**\n * Copy the entire inline style from one element (fromEl) to another (toEl)\n * @private\n * @param {Element} fromEl Element style is copied from\n * @param {Element} toEl Element copied style is applied to\n */\n _copyCanvasStyle: function (fromEl, toEl) {\n toEl.style.cssText = fromEl.style.cssText;\n },\n\n /**\n * Returns context of canvas where object selection is drawn\n * @return {CanvasRenderingContext2D}\n */\n getSelectionContext: function() {\n return this.contextTop;\n },\n\n /**\n * Returns <canvas> element on which object selection is drawn\n * @return {HTMLCanvasElement}\n */\n getSelectionElement: function () {\n return this.upperCanvasEl;\n },\n\n /**\n * Returns currently active object\n * @return {fabric.Object} active object\n */\n getActiveObject: function () {\n return this._activeObject;\n },\n\n /**\n * Returns an array with the current selected objects\n * @return {fabric.Object} active object\n */\n getActiveObjects: function () {\n var active = this._activeObject;\n if (active) {\n if (active.type === 'activeSelection' && active._objects) {\n return active._objects.slice(0);\n }\n else {\n return [active];\n }\n }\n return [];\n },\n\n /**\n * @private\n * @param {fabric.Object} obj Object that was removed\n */\n _onObjectRemoved: function(obj) {\n // removing active object should fire \"selection:cleared\" events\n if (obj === this._activeObject) {\n this.fire('before:selection:cleared', { target: obj });\n this._discardActiveObject();\n this.fire('selection:cleared', { target: obj });\n obj.fire('deselected');\n }\n if (obj === this._hoveredTarget){\n this._hoveredTarget = null;\n this._hoveredTargets = [];\n }\n this.callSuper('_onObjectRemoved', obj);\n },\n\n /**\n * @private\n * Compares the old activeObject with the current one and fires correct events\n * @param {fabric.Object} obj old activeObject\n */\n _fireSelectionEvents: function(oldObjects, e) {\n var somethingChanged = false, objects = this.getActiveObjects(),\n added = [], removed = [];\n oldObjects.forEach(function(oldObject) {\n if (objects.indexOf(oldObject) === -1) {\n somethingChanged = true;\n oldObject.fire('deselected', {\n e: e,\n target: oldObject\n });\n removed.push(oldObject);\n }\n });\n objects.forEach(function(object) {\n if (oldObjects.indexOf(object) === -1) {\n somethingChanged = true;\n object.fire('selected', {\n e: e,\n target: object\n });\n added.push(object);\n }\n });\n if (oldObjects.length > 0 && objects.length > 0) {\n somethingChanged && this.fire('selection:updated', {\n e: e,\n selected: added,\n deselected: removed,\n });\n }\n else if (objects.length > 0) {\n this.fire('selection:created', {\n e: e,\n selected: added,\n });\n }\n else if (oldObjects.length > 0) {\n this.fire('selection:cleared', {\n e: e,\n deselected: removed,\n });\n }\n },\n\n /**\n * Sets given object as the only active object on canvas\n * @param {fabric.Object} object Object to set as an active one\n * @param {Event} [e] Event (passed along when firing \"object:selected\")\n * @return {fabric.Canvas} thisArg\n * @chainable\n */\n setActiveObject: function (object, e) {\n var currentActives = this.getActiveObjects();\n this._setActiveObject(object, e);\n this._fireSelectionEvents(currentActives, e);\n return this;\n },\n\n /**\n * This is a private method for now.\n * This is supposed to be equivalent to setActiveObject but without firing\n * any event. There is commitment to have this stay this way.\n * This is the functional part of setActiveObject.\n * @private\n * @param {Object} object to set as active\n * @param {Event} [e] Event (passed along when firing \"object:selected\")\n * @return {Boolean} true if the selection happened\n */\n _setActiveObject: function(object, e) {\n if (this._activeObject === object) {\n return false;\n }\n if (!this._discardActiveObject(e, object)) {\n return false;\n }\n if (object.onSelect({ e: e })) {\n return false;\n }\n this._activeObject = object;\n return true;\n },\n\n /**\n * This is a private method for now.\n * This is supposed to be equivalent to discardActiveObject but without firing\n * any events. There is commitment to have this stay this way.\n * This is the functional part of discardActiveObject.\n * @param {Event} [e] Event (passed along when firing \"object:deselected\")\n * @param {Object} object to set as active\n * @return {Boolean} true if the selection happened\n * @private\n */\n _discardActiveObject: function(e, object) {\n var obj = this._activeObject;\n if (obj) {\n // onDeselect return TRUE to cancel selection;\n if (obj.onDeselect({ e: e, object: object })) {\n return false;\n }\n this._activeObject = null;\n }\n return true;\n },\n\n /**\n * Discards currently active object and fire events. If the function is called by fabric\n * as a consequence of a mouse event, the event is passed as a parameter and\n * sent to the fire function for the custom events. When used as a method the\n * e param does not have any application.\n * @param {event} e\n * @return {fabric.Canvas} thisArg\n * @chainable\n */\n discardActiveObject: function (e) {\n var currentActives = this.getActiveObjects(), activeObject = this.getActiveObject();\n if (currentActives.length) {\n this.fire('before:selection:cleared', { target: activeObject, e: e });\n }\n this._discardActiveObject(e);\n this._fireSelectionEvents(currentActives, e);\n return this;\n },\n\n /**\n * Clears a canvas element and removes all event listeners\n * @return {fabric.Canvas} thisArg\n * @chainable\n */\n dispose: function () {\n var wrapper = this.wrapperEl;\n this.removeListeners();\n wrapper.removeChild(this.upperCanvasEl);\n wrapper.removeChild(this.lowerCanvasEl);\n this.contextCache = null;\n this.contextTop = null;\n ['upperCanvasEl', 'cacheCanvasEl'].forEach((function(element) {\n fabric.util.cleanUpJsdomNode(this[element]);\n this[element] = undefined;\n }).bind(this));\n if (wrapper.parentNode) {\n wrapper.parentNode.replaceChild(this.lowerCanvasEl, this.wrapperEl);\n }\n delete this.wrapperEl;\n fabric.StaticCanvas.prototype.dispose.call(this);\n return this;\n },\n\n /**\n * Clears all contexts (background, main, top) of an instance\n * @return {fabric.Canvas} thisArg\n * @chainable\n */\n clear: function () {\n // this.discardActiveGroup();\n this.discardActiveObject();\n this.clearContext(this.contextTop);\n return this.callSuper('clear');\n },\n\n /**\n * Draws objects' controls (borders/controls)\n * @param {CanvasRenderingContext2D} ctx Context to render controls on\n */\n drawControls: function(ctx) {\n var activeObject = this._activeObject;\n\n if (activeObject) {\n activeObject._renderControls(ctx);\n }\n },\n\n /**\n * @private\n */\n _toObject: function(instance, methodName, propertiesToInclude) {\n //If the object is part of the current selection group, it should\n //be transformed appropriately\n //i.e. it should be serialised as it would appear if the selection group\n //were to be destroyed.\n var originalProperties = this._realizeGroupTransformOnObject(instance),\n object = this.callSuper('_toObject', instance, methodName, propertiesToInclude);\n //Undo the damage we did by changing all of its properties\n this._unwindGroupTransformOnObject(instance, originalProperties);\n return object;\n },\n\n /**\n * Realises an object's group transformation on it\n * @private\n * @param {fabric.Object} [instance] the object to transform (gets mutated)\n * @returns the original values of instance which were changed\n */\n _realizeGroupTransformOnObject: function(instance) {\n if (instance.group && instance.group.type === 'activeSelection' && this._activeObject === instance.group) {\n var layoutProps = ['angle', 'flipX', 'flipY', 'left', 'scaleX', 'scaleY', 'skewX', 'skewY', 'top'];\n //Copy all the positionally relevant properties across now\n var originalValues = {};\n layoutProps.forEach(function(prop) {\n originalValues[prop] = instance[prop];\n });\n fabric.util.addTransformToObject(instance, this._activeObject.calcOwnMatrix());\n return originalValues;\n }\n else {\n return null;\n }\n },\n\n /**\n * Restores the changed properties of instance\n * @private\n * @param {fabric.Object} [instance] the object to un-transform (gets mutated)\n * @param {Object} [originalValues] the original values of instance, as returned by _realizeGroupTransformOnObject\n */\n _unwindGroupTransformOnObject: function(instance, originalValues) {\n if (originalValues) {\n instance.set(originalValues);\n }\n },\n\n /**\n * @private\n */\n _setSVGObject: function(markup, instance, reviver) {\n //If the object is in a selection group, simulate what would happen to that\n //object when the group is deselected\n var originalProperties = this._realizeGroupTransformOnObject(instance);\n this.callSuper('_setSVGObject', markup, instance, reviver);\n this._unwindGroupTransformOnObject(instance, originalProperties);\n },\n\n setViewportTransform: function (vpt) {\n if (this.renderOnAddRemove && this._activeObject && this._activeObject.isEditing) {\n this._activeObject.clearContextTop();\n }\n fabric.StaticCanvas.prototype.setViewportTransform.call(this, vpt);\n }\n });\n\n // copying static properties manually to work around Opera's bug,\n // where \"prototype\" property is enumerable and overrides existing prototype\n for (var prop in fabric.StaticCanvas) {\n if (prop !== 'prototype') {\n fabric.Canvas[prop] = fabric.StaticCanvas[prop];\n }\n }\n})();\n\n\n(function() {\n\n var addListener = fabric.util.addListener,\n removeListener = fabric.util.removeListener,\n RIGHT_CLICK = 3, MIDDLE_CLICK = 2, LEFT_CLICK = 1,\n addEventOptions = { passive: false };\n\n function checkClick(e, value) {\n return e.button && (e.button === value - 1);\n }\n\n fabric.util.object.extend(fabric.Canvas.prototype, /** @lends fabric.Canvas.prototype */ {\n\n /**\n * Contains the id of the touch event that owns the fabric transform\n * @type Number\n * @private\n */\n mainTouchId: null,\n\n /**\n * Adds mouse listeners to canvas\n * @private\n */\n _initEventListeners: function () {\n // in case we initialized the class twice. This should not happen normally\n // but in some kind of applications where the canvas element may be changed\n // this is a workaround to having double listeners.\n this.removeListeners();\n this._bindEvents();\n this.addOrRemove(addListener, 'add');\n },\n\n /**\n * return an event prefix pointer or mouse.\n * @private\n */\n _getEventPrefix: function () {\n return this.enablePointerEvents ? 'pointer' : 'mouse';\n },\n\n addOrRemove: function(functor, eventjsFunctor) {\n var canvasElement = this.upperCanvasEl,\n eventTypePrefix = this._getEventPrefix();\n functor(fabric.window, 'resize', this._onResize);\n functor(canvasElement, eventTypePrefix + 'down', this._onMouseDown);\n functor(canvasElement, eventTypePrefix + 'move', this._onMouseMove, addEventOptions);\n functor(canvasElement, eventTypePrefix + 'out', this._onMouseOut);\n functor(canvasElement, eventTypePrefix + 'enter', this._onMouseEnter);\n functor(canvasElement, 'wheel', this._onMouseWheel);\n functor(canvasElement, 'contextmenu', this._onContextMenu);\n functor(canvasElement, 'dblclick', this._onDoubleClick);\n functor(canvasElement, 'dragover', this._onDragOver);\n functor(canvasElement, 'dragenter', this._onDragEnter);\n functor(canvasElement, 'dragleave', this._onDragLeave);\n functor(canvasElement, 'drop', this._onDrop);\n if (!this.enablePointerEvents) {\n functor(canvasElement, 'touchstart', this._onTouchStart, addEventOptions);\n }\n if (typeof eventjs !== 'undefined' && eventjsFunctor in eventjs) {\n eventjs[eventjsFunctor](canvasElement, 'gesture', this._onGesture);\n eventjs[eventjsFunctor](canvasElement, 'drag', this._onDrag);\n eventjs[eventjsFunctor](canvasElement, 'orientation', this._onOrientationChange);\n eventjs[eventjsFunctor](canvasElement, 'shake', this._onShake);\n eventjs[eventjsFunctor](canvasElement, 'longpress', this._onLongPress);\n }\n },\n\n /**\n * Removes all event listeners\n */\n removeListeners: function() {\n this.addOrRemove(removeListener, 'remove');\n // if you dispose on a mouseDown, before mouse up, you need to clean document to...\n var eventTypePrefix = this._getEventPrefix();\n removeListener(fabric.document, eventTypePrefix + 'up', this._onMouseUp);\n removeListener(fabric.document, 'touchend', this._onTouchEnd, addEventOptions);\n removeListener(fabric.document, eventTypePrefix + 'move', this._onMouseMove, addEventOptions);\n removeListener(fabric.document, 'touchmove', this._onMouseMove, addEventOptions);\n },\n\n /**\n * @private\n */\n _bindEvents: function() {\n if (this.eventsBound) {\n // for any reason we pass here twice we do not want to bind events twice.\n return;\n }\n this._onMouseDown = this._onMouseDown.bind(this);\n this._onTouchStart = this._onTouchStart.bind(this);\n this._onMouseMove = this._onMouseMove.bind(this);\n this._onMouseUp = this._onMouseUp.bind(this);\n this._onTouchEnd = this._onTouchEnd.bind(this);\n this._onResize = this._onResize.bind(this);\n this._onGesture = this._onGesture.bind(this);\n this._onDrag = this._onDrag.bind(this);\n this._onShake = this._onShake.bind(this);\n this._onLongPress = this._onLongPress.bind(this);\n this._onOrientationChange = this._onOrientationChange.bind(this);\n this._onMouseWheel = this._onMouseWheel.bind(this);\n this._onMouseOut = this._onMouseOut.bind(this);\n this._onMouseEnter = this._onMouseEnter.bind(this);\n this._onContextMenu = this._onContextMenu.bind(this);\n this._onDoubleClick = this._onDoubleClick.bind(this);\n this._onDragOver = this._onDragOver.bind(this);\n this._onDragEnter = this._simpleEventHandler.bind(this, 'dragenter');\n this._onDragLeave = this._simpleEventHandler.bind(this, 'dragleave');\n this._onDrop = this._onDrop.bind(this);\n this.eventsBound = true;\n },\n\n /**\n * @private\n * @param {Event} [e] Event object fired on Event.js gesture\n * @param {Event} [self] Inner Event object\n */\n _onGesture: function(e, self) {\n this.__onTransformGesture && this.__onTransformGesture(e, self);\n },\n\n /**\n * @private\n * @param {Event} [e] Event object fired on Event.js drag\n * @param {Event} [self] Inner Event object\n */\n _onDrag: function(e, self) {\n this.__onDrag && this.__onDrag(e, self);\n },\n\n /**\n * @private\n * @param {Event} [e] Event object fired on wheel event\n */\n _onMouseWheel: function(e) {\n this.__onMouseWheel(e);\n },\n\n /**\n * @private\n * @param {Event} e Event object fired on mousedown\n */\n _onMouseOut: function(e) {\n var target = this._hoveredTarget;\n this.fire('mouse:out', { target: target, e: e });\n this._hoveredTarget = null;\n target && target.fire('mouseout', { e: e });\n\n var _this = this;\n this._hoveredTargets.forEach(function(_target){\n _this.fire('mouse:out', { target: target, e: e });\n _target && target.fire('mouseout', { e: e });\n });\n this._hoveredTargets = [];\n },\n\n /**\n * @private\n * @param {Event} e Event object fired on mouseenter\n */\n _onMouseEnter: function(e) {\n // This find target and consequent 'mouse:over' is used to\n // clear old instances on hovered target.\n // calling findTarget has the side effect of killing target.__corner.\n // as a short term fix we are not firing this if we are currently transforming.\n // as a long term fix we need to separate the action of finding a target with the\n // side effects we added to it.\n if (!this._currentTransform && !this.findTarget(e)) {\n this.fire('mouse:over', { target: null, e: e });\n this._hoveredTarget = null;\n this._hoveredTargets = [];\n }\n },\n\n /**\n * @private\n * @param {Event} [e] Event object fired on Event.js orientation change\n * @param {Event} [self] Inner Event object\n */\n _onOrientationChange: function(e, self) {\n this.__onOrientationChange && this.__onOrientationChange(e, self);\n },\n\n /**\n * @private\n * @param {Event} [e] Event object fired on Event.js shake\n * @param {Event} [self] Inner Event object\n */\n _onShake: function(e, self) {\n this.__onShake && this.__onShake(e, self);\n },\n\n /**\n * @private\n * @param {Event} [e] Event object fired on Event.js shake\n * @param {Event} [self] Inner Event object\n */\n _onLongPress: function(e, self) {\n this.__onLongPress && this.__onLongPress(e, self);\n },\n\n /**\n * prevent default to allow drop event to be fired\n * @private\n * @param {Event} [e] Event object fired on Event.js shake\n */\n _onDragOver: function(e) {\n e.preventDefault();\n var target = this._simpleEventHandler('dragover', e);\n this._fireEnterLeaveEvents(target, e);\n },\n\n /**\n * `drop:before` is a an event that allow you to schedule logic\n * before the `drop` event. Prefer `drop` event always, but if you need\n * to run some drop-disabling logic on an event, since there is no way\n * to handle event handlers ordering, use `drop:before`\n * @param {Event} e\n */\n _onDrop: function (e) {\n this._simpleEventHandler('drop:before', e);\n return this._simpleEventHandler('drop', e);\n },\n\n /**\n * @private\n * @param {Event} e Event object fired on mousedown\n */\n _onContextMenu: function (e) {\n if (this.stopContextMenu) {\n e.stopPropagation();\n e.preventDefault();\n }\n return false;\n },\n\n /**\n * @private\n * @param {Event} e Event object fired on mousedown\n */\n _onDoubleClick: function (e) {\n this._cacheTransformEventData(e);\n this._handleEvent(e, 'dblclick');\n this._resetTransformEventData(e);\n },\n\n /**\n * Return a the id of an event.\n * returns either the pointerId or the identifier or 0 for the mouse event\n * @private\n * @param {Event} evt Event object\n */\n getPointerId: function(evt) {\n var changedTouches = evt.changedTouches;\n\n if (changedTouches) {\n return changedTouches[0] && changedTouches[0].identifier;\n }\n\n if (this.enablePointerEvents) {\n return evt.pointerId;\n }\n\n return -1;\n },\n\n /**\n * Determines if an event has the id of the event that is considered main\n * @private\n * @param {evt} event Event object\n */\n _isMainEvent: function(evt) {\n if (evt.isPrimary === true) {\n return true;\n }\n if (evt.isPrimary === false) {\n return false;\n }\n if (evt.type === 'touchend' && evt.touches.length === 0) {\n return true;\n }\n if (evt.changedTouches) {\n return evt.changedTouches[0].identifier === this.mainTouchId;\n }\n return true;\n },\n\n /**\n * @private\n * @param {Event} e Event object fired on mousedown\n */\n _onTouchStart: function(e) {\n e.preventDefault();\n if (this.mainTouchId === null) {\n this.mainTouchId = this.getPointerId(e);\n }\n this.__onMouseDown(e);\n this._resetTransformEventData();\n var canvasElement = this.upperCanvasEl,\n eventTypePrefix = this._getEventPrefix();\n addListener(fabric.document, 'touchend', this._onTouchEnd, addEventOptions);\n addListener(fabric.document, 'touchmove', this._onMouseMove, addEventOptions);\n // Unbind mousedown to prevent double triggers from touch devices\n removeListener(canvasElement, eventTypePrefix + 'down', this._onMouseDown);\n },\n\n /**\n * @private\n * @param {Event} e Event object fired on mousedown\n */\n _onMouseDown: function (e) {\n this.__onMouseDown(e);\n this._resetTransformEventData();\n var canvasElement = this.upperCanvasEl,\n eventTypePrefix = this._getEventPrefix();\n removeListener(canvasElement, eventTypePrefix + 'move', this._onMouseMove, addEventOptions);\n addListener(fabric.document, eventTypePrefix + 'up', this._onMouseUp);\n addListener(fabric.document, eventTypePrefix + 'move', this._onMouseMove, addEventOptions);\n },\n\n /**\n * @private\n * @param {Event} e Event object fired on mousedown\n */\n _onTouchEnd: function(e) {\n if (e.touches.length > 0) {\n // if there are still touches stop here\n return;\n }\n this.__onMouseUp(e);\n this._resetTransformEventData();\n this.mainTouchId = null;\n var eventTypePrefix = this._getEventPrefix();\n removeListener(fabric.document, 'touchend', this._onTouchEnd, addEventOptions);\n removeListener(fabric.document, 'touchmove', this._onMouseMove, addEventOptions);\n var _this = this;\n if (this._willAddMouseDown) {\n clearTimeout(this._willAddMouseDown);\n }\n this._willAddMouseDown = setTimeout(function() {\n // Wait 400ms before rebinding mousedown to prevent double triggers\n // from touch devices\n addListener(_this.upperCanvasEl, eventTypePrefix + 'down', _this._onMouseDown);\n _this._willAddMouseDown = 0;\n }, 400);\n },\n\n /**\n * @private\n * @param {Event} e Event object fired on mouseup\n */\n _onMouseUp: function (e) {\n this.__onMouseUp(e);\n this._resetTransformEventData();\n var canvasElement = this.upperCanvasEl,\n eventTypePrefix = this._getEventPrefix();\n if (this._isMainEvent(e)) {\n removeListener(fabric.document, eventTypePrefix + 'up', this._onMouseUp);\n removeListener(fabric.document, eventTypePrefix + 'move', this._onMouseMove, addEventOptions);\n addListener(canvasElement, eventTypePrefix + 'move', this._onMouseMove, addEventOptions);\n }\n },\n\n /**\n * @private\n * @param {Event} e Event object fired on mousemove\n */\n _onMouseMove: function (e) {\n !this.allowTouchScrolling && e.preventDefault && e.preventDefault();\n this.__onMouseMove(e);\n },\n\n /**\n * @private\n */\n _onResize: function () {\n this.calcOffset();\n },\n\n /**\n * Decides whether the canvas should be redrawn in mouseup and mousedown events.\n * @private\n * @param {Object} target\n */\n _shouldRender: function(target) {\n var activeObject = this._activeObject;\n\n if (\n !!activeObject !== !!target ||\n (activeObject && target && (activeObject !== target))\n ) {\n // this covers: switch of target, from target to no target, selection of target\n // multiSelection with key and mouse\n return true;\n }\n else if (activeObject && activeObject.isEditing) {\n // if we mouse up/down over a editing textbox a cursor change,\n // there is no need to re render\n return false;\n }\n return false;\n },\n\n /**\n * Method that defines the actions when mouse is released on canvas.\n * The method resets the currentTransform parameters, store the image corner\n * position in the image object and render the canvas on top.\n * @private\n * @param {Event} e Event object fired on mouseup\n */\n __onMouseUp: function (e) {\n var target, transform = this._currentTransform,\n groupSelector = this._groupSelector, shouldRender = false,\n isClick = (!groupSelector || (groupSelector.left === 0 && groupSelector.top === 0));\n this._cacheTransformEventData(e);\n target = this._target;\n this._handleEvent(e, 'up:before');\n // if right/middle click just fire events and return\n // target undefined will make the _handleEvent search the target\n if (checkClick(e, RIGHT_CLICK)) {\n if (this.fireRightClick) {\n this._handleEvent(e, 'up', RIGHT_CLICK, isClick);\n }\n return;\n }\n\n if (checkClick(e, MIDDLE_CLICK)) {\n if (this.fireMiddleClick) {\n this._handleEvent(e, 'up', MIDDLE_CLICK, isClick);\n }\n this._resetTransformEventData();\n return;\n }\n\n if (this.isDrawingMode && this._isCurrentlyDrawing) {\n this._onMouseUpInDrawingMode(e);\n return;\n }\n\n if (!this._isMainEvent(e)) {\n return;\n }\n if (transform) {\n this._finalizeCurrentTransform(e);\n shouldRender = transform.actionPerformed;\n }\n if (!isClick) {\n var targetWasActive = target === this._activeObject;\n this._maybeGroupObjects(e);\n if (!shouldRender) {\n shouldRender = (\n this._shouldRender(target) ||\n (!targetWasActive && target === this._activeObject)\n );\n }\n }\n var corner, pointer;\n if (target) {\n corner = target._findTargetCorner(\n this.getPointer(e, true),\n fabric.util.isTouchEvent(e)\n );\n if (target.selectable && target !== this._activeObject && target.activeOn === 'up') {\n this.setActiveObject(target, e);\n shouldRender = true;\n }\n else {\n var control = target.controls[corner],\n mouseUpHandler = control && control.getMouseUpHandler(e, target, control);\n if (mouseUpHandler) {\n pointer = this.getPointer(e);\n mouseUpHandler(e, transform, pointer.x, pointer.y);\n }\n }\n target.isMoving = false;\n }\n // if we are ending up a transform on a different control or a new object\n // fire the original mouse up from the corner that started the transform\n if (transform && (transform.target !== target || transform.corner !== corner)) {\n var originalControl = transform.target && transform.target.controls[transform.corner],\n originalMouseUpHandler = originalControl && originalControl.getMouseUpHandler(e, target, control);\n pointer = pointer || this.getPointer(e);\n originalMouseUpHandler && originalMouseUpHandler(e, transform, pointer.x, pointer.y);\n }\n this._setCursorFromEvent(e, target);\n this._handleEvent(e, 'up', LEFT_CLICK, isClick);\n this._groupSelector = null;\n this._currentTransform = null;\n // reset the target information about which corner is selected\n target && (target.__corner = 0);\n if (shouldRender) {\n this.requestRenderAll();\n }\n else if (!isClick) {\n this.renderTop();\n }\n },\n\n /**\n * @private\n * Handle event firing for target and subtargets\n * @param {Event} e event from mouse\n * @param {String} eventType event to fire (up, down or move)\n * @return {Fabric.Object} target return the the target found, for internal reasons.\n */\n _simpleEventHandler: function(eventType, e) {\n var target = this.findTarget(e),\n targets = this.targets,\n options = {\n e: e,\n target: target,\n subTargets: targets,\n };\n this.fire(eventType, options);\n target && target.fire(eventType, options);\n if (!targets) {\n return target;\n }\n for (var i = 0; i < targets.length; i++) {\n targets[i].fire(eventType, options);\n }\n return target;\n },\n\n /**\n * @private\n * Handle event firing for target and subtargets\n * @param {Event} e event from mouse\n * @param {String} eventType event to fire (up, down or move)\n * @param {fabric.Object} targetObj receiving event\n * @param {Number} [button] button used in the event 1 = left, 2 = middle, 3 = right\n * @param {Boolean} isClick for left button only, indicates that the mouse up happened without move.\n */\n _handleEvent: function(e, eventType, button, isClick) {\n var target = this._target,\n targets = this.targets || [],\n options = {\n e: e,\n target: target,\n subTargets: targets,\n button: button || LEFT_CLICK,\n isClick: isClick || false,\n pointer: this._pointer,\n absolutePointer: this._absolutePointer,\n transform: this._currentTransform\n };\n if (eventType === 'up') {\n options.currentTarget = this.findTarget(e);\n options.currentSubTargets = this.targets;\n }\n this.fire('mouse:' + eventType, options);\n target && target.fire('mouse' + eventType, options);\n for (var i = 0; i < targets.length; i++) {\n targets[i].fire('mouse' + eventType, options);\n }\n },\n\n /**\n * @private\n * @param {Event} e send the mouse event that generate the finalize down, so it can be used in the event\n */\n _finalizeCurrentTransform: function(e) {\n\n var transform = this._currentTransform,\n target = transform.target,\n options = {\n e: e,\n target: target,\n transform: transform,\n action: transform.action,\n };\n\n if (target._scaling) {\n target._scaling = false;\n }\n\n target.setCoords();\n\n if (transform.actionPerformed || (this.stateful && target.hasStateChanged())) {\n this._fire('modified', options);\n }\n },\n\n /**\n * @private\n * @param {Event} e Event object fired on mousedown\n */\n _onMouseDownInDrawingMode: function(e) {\n this._isCurrentlyDrawing = true;\n if (this.getActiveObject()) {\n this.discardActiveObject(e).requestRenderAll();\n }\n var pointer = this.getPointer(e);\n this.freeDrawingBrush.onMouseDown(pointer, { e: e, pointer: pointer });\n this._handleEvent(e, 'down');\n },\n\n /**\n * @private\n * @param {Event} e Event object fired on mousemove\n */\n _onMouseMoveInDrawingMode: function(e) {\n if (this._isCurrentlyDrawing) {\n var pointer = this.getPointer(e);\n this.freeDrawingBrush.onMouseMove(pointer, { e: e, pointer: pointer });\n }\n this.setCursor(this.freeDrawingCursor);\n this._handleEvent(e, 'move');\n },\n\n /**\n * @private\n * @param {Event} e Event object fired on mouseup\n */\n _onMouseUpInDrawingMode: function(e) {\n var pointer = this.getPointer(e);\n this._isCurrentlyDrawing = this.freeDrawingBrush.onMouseUp({ e: e, pointer: pointer });\n this._handleEvent(e, 'up');\n },\n\n /**\n * Method that defines the actions when mouse is clicked on canvas.\n * The method inits the currentTransform parameters and renders all the\n * canvas so the current image can be placed on the top canvas and the rest\n * in on the container one.\n * @private\n * @param {Event} e Event object fired on mousedown\n */\n __onMouseDown: function (e) {\n this._cacheTransformEventData(e);\n this._handleEvent(e, 'down:before');\n var target = this._target;\n // if right click just fire events\n if (checkClick(e, RIGHT_CLICK)) {\n if (this.fireRightClick) {\n this._handleEvent(e, 'down', RIGHT_CLICK);\n }\n return;\n }\n\n if (checkClick(e, MIDDLE_CLICK)) {\n if (this.fireMiddleClick) {\n this._handleEvent(e, 'down', MIDDLE_CLICK);\n }\n return;\n }\n\n if (this.isDrawingMode) {\n this._onMouseDownInDrawingMode(e);\n return;\n }\n\n if (!this._isMainEvent(e)) {\n return;\n }\n\n // ignore if some object is being transformed at this moment\n if (this._currentTransform) {\n return;\n }\n\n var pointer = this._pointer;\n // save pointer for check in __onMouseUp event\n this._previousPointer = pointer;\n var shouldRender = this._shouldRender(target),\n shouldGroup = this._shouldGroup(e, target);\n if (this._shouldClearSelection(e, target)) {\n this.discardActiveObject(e);\n }\n else if (shouldGroup) {\n this._handleGrouping(e, target);\n target = this._activeObject;\n }\n\n if (this.selection && (!target ||\n (!target.selectable && !target.isEditing && target !== this._activeObject))) {\n this._groupSelector = {\n ex: this._absolutePointer.x,\n ey: this._absolutePointer.y,\n top: 0,\n left: 0\n };\n }\n\n if (target) {\n var alreadySelected = target === this._activeObject;\n if (target.selectable && target.activeOn === 'down') {\n this.setActiveObject(target, e);\n }\n var corner = target._findTargetCorner(\n this.getPointer(e, true),\n fabric.util.isTouchEvent(e)\n );\n target.__corner = corner;\n if (target === this._activeObject && (corner || !shouldGroup)) {\n this._setupCurrentTransform(e, target, alreadySelected);\n var control = target.controls[corner],\n pointer = this.getPointer(e),\n mouseDownHandler = control && control.getMouseDownHandler(e, target, control);\n if (mouseDownHandler) {\n mouseDownHandler(e, this._currentTransform, pointer.x, pointer.y);\n }\n }\n }\n this._handleEvent(e, 'down');\n // we must renderAll so that we update the visuals\n (shouldRender || shouldGroup) && this.requestRenderAll();\n },\n\n /**\n * reset cache form common information needed during event processing\n * @private\n */\n _resetTransformEventData: function() {\n this._target = null;\n this._pointer = null;\n this._absolutePointer = null;\n },\n\n /**\n * Cache common information needed during event processing\n * @private\n * @param {Event} e Event object fired on event\n */\n _cacheTransformEventData: function(e) {\n // reset in order to avoid stale caching\n this._resetTransformEventData();\n this._pointer = this.getPointer(e, true);\n this._absolutePointer = this.restorePointerVpt(this._pointer);\n this._target = this._currentTransform ? this._currentTransform.target : this.findTarget(e) || null;\n },\n\n /**\n * @private\n */\n _beforeTransform: function(e) {\n var t = this._currentTransform;\n this.stateful && t.target.saveState();\n this.fire('before:transform', {\n e: e,\n transform: t,\n });\n },\n\n /**\n * Method that defines the actions when mouse is hovering the canvas.\n * The currentTransform parameter will define whether the user is rotating/scaling/translating\n * an image or neither of them (only hovering). A group selection is also possible and would cancel\n * all any other type of action.\n * In case of an image transformation only the top canvas will be rendered.\n * @private\n * @param {Event} e Event object fired on mousemove\n */\n __onMouseMove: function (e) {\n this._handleEvent(e, 'move:before');\n this._cacheTransformEventData(e);\n var target, pointer;\n\n if (this.isDrawingMode) {\n this._onMouseMoveInDrawingMode(e);\n return;\n }\n\n if (!this._isMainEvent(e)) {\n return;\n }\n\n var groupSelector = this._groupSelector;\n\n // We initially clicked in an empty area, so we draw a box for multiple selection\n if (groupSelector) {\n pointer = this._absolutePointer;\n\n groupSelector.left = pointer.x - groupSelector.ex;\n groupSelector.top = pointer.y - groupSelector.ey;\n\n this.renderTop();\n }\n else if (!this._currentTransform) {\n target = this.findTarget(e) || null;\n this._setCursorFromEvent(e, target);\n this._fireOverOutEvents(target, e);\n }\n else {\n this._transformObject(e);\n }\n this._handleEvent(e, 'move');\n this._resetTransformEventData();\n },\n\n /**\n * Manage the mouseout, mouseover events for the fabric object on the canvas\n * @param {Fabric.Object} target the target where the target from the mousemove event\n * @param {Event} e Event object fired on mousemove\n * @private\n */\n _fireOverOutEvents: function(target, e) {\n var _hoveredTarget = this._hoveredTarget,\n _hoveredTargets = this._hoveredTargets, targets = this.targets,\n length = Math.max(_hoveredTargets.length, targets.length);\n\n this.fireSyntheticInOutEvents(target, e, {\n oldTarget: _hoveredTarget,\n evtOut: 'mouseout',\n canvasEvtOut: 'mouse:out',\n evtIn: 'mouseover',\n canvasEvtIn: 'mouse:over',\n });\n for (var i = 0; i < length; i++){\n this.fireSyntheticInOutEvents(targets[i], e, {\n oldTarget: _hoveredTargets[i],\n evtOut: 'mouseout',\n evtIn: 'mouseover',\n });\n }\n this._hoveredTarget = target;\n this._hoveredTargets = this.targets.concat();\n },\n\n /**\n * Manage the dragEnter, dragLeave events for the fabric objects on the canvas\n * @param {Fabric.Object} target the target where the target from the onDrag event\n * @param {Event} e Event object fired on ondrag\n * @private\n */\n _fireEnterLeaveEvents: function(target, e) {\n var _draggedoverTarget = this._draggedoverTarget,\n _hoveredTargets = this._hoveredTargets, targets = this.targets,\n length = Math.max(_hoveredTargets.length, targets.length);\n\n this.fireSyntheticInOutEvents(target, e, {\n oldTarget: _draggedoverTarget,\n evtOut: 'dragleave',\n evtIn: 'dragenter',\n });\n for (var i = 0; i < length; i++) {\n this.fireSyntheticInOutEvents(targets[i], e, {\n oldTarget: _hoveredTargets[i],\n evtOut: 'dragleave',\n evtIn: 'dragenter',\n });\n }\n this._draggedoverTarget = target;\n },\n\n /**\n * Manage the synthetic in/out events for the fabric objects on the canvas\n * @param {Fabric.Object} target the target where the target from the supported events\n * @param {Event} e Event object fired\n * @param {Object} config configuration for the function to work\n * @param {String} config.targetName property on the canvas where the old target is stored\n * @param {String} [config.canvasEvtOut] name of the event to fire at canvas level for out\n * @param {String} config.evtOut name of the event to fire for out\n * @param {String} [config.canvasEvtIn] name of the event to fire at canvas level for in\n * @param {String} config.evtIn name of the event to fire for in\n * @private\n */\n fireSyntheticInOutEvents: function(target, e, config) {\n var inOpt, outOpt, oldTarget = config.oldTarget, outFires, inFires,\n targetChanged = oldTarget !== target, canvasEvtIn = config.canvasEvtIn, canvasEvtOut = config.canvasEvtOut;\n if (targetChanged) {\n inOpt = { e: e, target: target, previousTarget: oldTarget };\n outOpt = { e: e, target: oldTarget, nextTarget: target };\n }\n inFires = target && targetChanged;\n outFires = oldTarget && targetChanged;\n if (outFires) {\n canvasEvtOut && this.fire(canvasEvtOut, outOpt);\n oldTarget.fire(config.evtOut, outOpt);\n }\n if (inFires) {\n canvasEvtIn && this.fire(canvasEvtIn, inOpt);\n target.fire(config.evtIn, inOpt);\n }\n },\n\n /**\n * Method that defines actions when an Event Mouse Wheel\n * @param {Event} e Event object fired on mouseup\n */\n __onMouseWheel: function(e) {\n this._cacheTransformEventData(e);\n this._handleEvent(e, 'wheel');\n this._resetTransformEventData();\n },\n\n /**\n * @private\n * @param {Event} e Event fired on mousemove\n */\n _transformObject: function(e) {\n var pointer = this.getPointer(e),\n transform = this._currentTransform;\n\n transform.reset = false;\n transform.shiftKey = e.shiftKey;\n transform.altKey = e[this.centeredKey];\n\n this._performTransformAction(e, transform, pointer);\n transform.actionPerformed && this.requestRenderAll();\n },\n\n /**\n * @private\n */\n _performTransformAction: function(e, transform, pointer) {\n var x = pointer.x,\n y = pointer.y,\n action = transform.action,\n actionPerformed = false,\n actionHandler = transform.actionHandler;\n // this object could be created from the function in the control handlers\n\n\n if (actionHandler) {\n actionPerformed = actionHandler(e, transform, x, y);\n }\n if (action === 'drag' && actionPerformed) {\n transform.target.isMoving = true;\n this.setCursor(transform.target.moveCursor || this.moveCursor);\n }\n transform.actionPerformed = transform.actionPerformed || actionPerformed;\n },\n\n /**\n * @private\n */\n _fire: fabric.controlsUtils.fireEvent,\n\n /**\n * Sets the cursor depending on where the canvas is being hovered.\n * Note: very buggy in Opera\n * @param {Event} e Event object\n * @param {Object} target Object that the mouse is hovering, if so.\n */\n _setCursorFromEvent: function (e, target) {\n if (!target) {\n this.setCursor(this.defaultCursor);\n return false;\n }\n var hoverCursor = target.hoverCursor || this.hoverCursor,\n activeSelection = this._activeObject && this._activeObject.type === 'activeSelection' ?\n this._activeObject : null,\n // only show proper corner when group selection is not active\n corner = (!activeSelection || !activeSelection.contains(target))\n // here we call findTargetCorner always with undefined for the touch parameter.\n // we assume that if you are using a cursor you do not need to interact with\n // the bigger touch area.\n && target._findTargetCorner(this.getPointer(e, true));\n\n if (!corner) {\n if (target.subTargetCheck){\n // hoverCursor should come from top-most subTarget,\n // so we walk the array backwards\n this.targets.concat().reverse().map(function(_target){\n hoverCursor = _target.hoverCursor || hoverCursor;\n });\n }\n this.setCursor(hoverCursor);\n }\n else {\n this.setCursor(this.getCornerCursor(corner, target, e));\n }\n },\n\n /**\n * @private\n */\n getCornerCursor: function(corner, target, e) {\n var control = target.controls[corner];\n return control.cursorStyleHandler(e, control, target);\n }\n });\n})();\n\n\n(function() {\n\n var min = Math.min,\n max = Math.max;\n\n fabric.util.object.extend(fabric.Canvas.prototype, /** @lends fabric.Canvas.prototype */ {\n\n /**\n * @private\n * @param {Event} e Event object\n * @param {fabric.Object} target\n * @return {Boolean}\n */\n _shouldGroup: function(e, target) {\n var activeObject = this._activeObject;\n return activeObject && this._isSelectionKeyPressed(e) && target && target.selectable && this.selection &&\n (activeObject !== target || activeObject.type === 'activeSelection') && !target.onSelect({ e: e });\n },\n\n /**\n * @private\n * @param {Event} e Event object\n * @param {fabric.Object} target\n */\n _handleGrouping: function (e, target) {\n var activeObject = this._activeObject;\n // avoid multi select when shift click on a corner\n if (activeObject.__corner) {\n return;\n }\n if (target === activeObject) {\n // if it's a group, find target again, using activeGroup objects\n target = this.findTarget(e, true);\n // if even object is not found or we are on activeObjectCorner, bail out\n if (!target || !target.selectable) {\n return;\n }\n }\n if (activeObject && activeObject.type === 'activeSelection') {\n this._updateActiveSelection(target, e);\n }\n else {\n this._createActiveSelection(target, e);\n }\n },\n\n /**\n * @private\n */\n _updateActiveSelection: function(target, e) {\n var activeSelection = this._activeObject,\n currentActiveObjects = activeSelection._objects.slice(0);\n if (activeSelection.contains(target)) {\n activeSelection.removeWithUpdate(target);\n this._hoveredTarget = target;\n this._hoveredTargets = this.targets.concat();\n if (activeSelection.size() === 1) {\n // activate last remaining object\n this._setActiveObject(activeSelection.item(0), e);\n }\n }\n else {\n activeSelection.addWithUpdate(target);\n this._hoveredTarget = activeSelection;\n this._hoveredTargets = this.targets.concat();\n }\n this._fireSelectionEvents(currentActiveObjects, e);\n },\n\n /**\n * @private\n */\n _createActiveSelection: function(target, e) {\n var currentActives = this.getActiveObjects(), group = this._createGroup(target);\n this._hoveredTarget = group;\n // ISSUE 4115: should we consider subTargets here?\n // this._hoveredTargets = [];\n // this._hoveredTargets = this.targets.concat();\n this._setActiveObject(group, e);\n this._fireSelectionEvents(currentActives, e);\n },\n\n /**\n * @private\n * @param {Object} target\n */\n _createGroup: function(target) {\n var objects = this._objects,\n isActiveLower = objects.indexOf(this._activeObject) < objects.indexOf(target),\n groupObjects = isActiveLower\n ? [this._activeObject, target]\n : [target, this._activeObject];\n this._activeObject.isEditing && this._activeObject.exitEditing();\n return new fabric.ActiveSelection(groupObjects, {\n canvas: this\n });\n },\n\n /**\n * @private\n * @param {Event} e mouse event\n */\n _groupSelectedObjects: function (e) {\n\n var group = this._collectObjects(e),\n aGroup;\n\n // do not create group for 1 element only\n if (group.length === 1) {\n this.setActiveObject(group[0], e);\n }\n else if (group.length > 1) {\n aGroup = new fabric.ActiveSelection(group.reverse(), {\n canvas: this\n });\n this.setActiveObject(aGroup, e);\n }\n },\n\n /**\n * @private\n */\n _collectObjects: function(e) {\n var group = [],\n currentObject,\n x1 = this._groupSelector.ex,\n y1 = this._groupSelector.ey,\n x2 = x1 + this._groupSelector.left,\n y2 = y1 + this._groupSelector.top,\n selectionX1Y1 = new fabric.Point(min(x1, x2), min(y1, y2)),\n selectionX2Y2 = new fabric.Point(max(x1, x2), max(y1, y2)),\n allowIntersect = !this.selectionFullyContained,\n isClick = x1 === x2 && y1 === y2;\n // we iterate reverse order to collect top first in case of click.\n for (var i = this._objects.length; i--; ) {\n currentObject = this._objects[i];\n\n if (!currentObject || !currentObject.selectable || !currentObject.visible) {\n continue;\n }\n\n if ((allowIntersect && currentObject.intersectsWithRect(selectionX1Y1, selectionX2Y2, true)) ||\n currentObject.isContainedWithinRect(selectionX1Y1, selectionX2Y2, true) ||\n (allowIntersect && currentObject.containsPoint(selectionX1Y1, null, true)) ||\n (allowIntersect && currentObject.containsPoint(selectionX2Y2, null, true))\n ) {\n group.push(currentObject);\n // only add one object if it's a click\n if (isClick) {\n break;\n }\n }\n }\n\n if (group.length > 1) {\n group = group.filter(function(object) {\n return !object.onSelect({ e: e });\n });\n }\n\n return group;\n },\n\n /**\n * @private\n */\n _maybeGroupObjects: function(e) {\n if (this.selection && this._groupSelector) {\n this._groupSelectedObjects(e);\n }\n this.setCursor(this.defaultCursor);\n // clear selection and current transformation\n this._groupSelector = null;\n }\n });\n\n})();\n\n\n(function () {\n fabric.util.object.extend(fabric.StaticCanvas.prototype, /** @lends fabric.StaticCanvas.prototype */ {\n\n /**\n * Exports canvas element to a dataurl image. Note that when multiplier is used, cropping is scaled appropriately\n * @param {Object} [options] Options object\n * @param {String} [options.format=png] The format of the output image. Either \"jpeg\" or \"png\"\n * @param {Number} [options.quality=1] Quality level (0..1). Only used for jpeg.\n * @param {Number} [options.multiplier=1] Multiplier to scale by, to have consistent\n * @param {Number} [options.left] Cropping left offset. Introduced in v1.2.14\n * @param {Number} [options.top] Cropping top offset. Introduced in v1.2.14\n * @param {Number} [options.width] Cropping width. Introduced in v1.2.14\n * @param {Number} [options.height] Cropping height. Introduced in v1.2.14\n * @param {Boolean} [options.enableRetinaScaling] Enable retina scaling for clone image. Introduce in 2.0.0\n * @return {String} Returns a data: URL containing a representation of the object in the format specified by options.format\n * @see {@link http://jsfiddle.net/fabricjs/NfZVb/|jsFiddle demo}\n * @example Generate jpeg dataURL with lower quality\n * var dataURL = canvas.toDataURL({\n * format: 'jpeg',\n * quality: 0.8\n * });\n * @example Generate cropped png dataURL (clipping of canvas)\n * var dataURL = canvas.toDataURL({\n * format: 'png',\n * left: 100,\n * top: 100,\n * width: 200,\n * height: 200\n * });\n * @example Generate double scaled png dataURL\n * var dataURL = canvas.toDataURL({\n * format: 'png',\n * multiplier: 2\n * });\n */\n toDataURL: function (options) {\n options || (options = { });\n\n var format = options.format || 'png',\n quality = options.quality || 1,\n multiplier = (options.multiplier || 1) * (options.enableRetinaScaling ? this.getRetinaScaling() : 1),\n canvasEl = this.toCanvasElement(multiplier, options);\n return fabric.util.toDataURL(canvasEl, format, quality);\n },\n\n /**\n * Create a new HTMLCanvas element painted with the current canvas content.\n * No need to resize the actual one or repaint it.\n * Will transfer object ownership to a new canvas, paint it, and set everything back.\n * This is an intermediary step used to get to a dataUrl but also it is useful to\n * create quick image copies of a canvas without passing for the dataUrl string\n * @param {Number} [multiplier] a zoom factor.\n * @param {Object} [cropping] Cropping informations\n * @param {Number} [cropping.left] Cropping left offset.\n * @param {Number} [cropping.top] Cropping top offset.\n * @param {Number} [cropping.width] Cropping width.\n * @param {Number} [cropping.height] Cropping height.\n */\n toCanvasElement: function(multiplier, cropping) {\n multiplier = multiplier || 1;\n cropping = cropping || { };\n var scaledWidth = (cropping.width || this.width) * multiplier,\n scaledHeight = (cropping.height || this.height) * multiplier,\n zoom = this.getZoom(),\n originalWidth = this.width,\n originalHeight = this.height,\n newZoom = zoom * multiplier,\n vp = this.viewportTransform,\n translateX = (vp[4] - (cropping.left || 0)) * multiplier,\n translateY = (vp[5] - (cropping.top || 0)) * multiplier,\n originalInteractive = this.interactive,\n newVp = [newZoom, 0, 0, newZoom, translateX, translateY],\n originalRetina = this.enableRetinaScaling,\n canvasEl = fabric.util.createCanvasElement(),\n originalContextTop = this.contextTop;\n canvasEl.width = scaledWidth;\n canvasEl.height = scaledHeight;\n this.contextTop = null;\n this.enableRetinaScaling = false;\n this.interactive = false;\n this.viewportTransform = newVp;\n this.width = scaledWidth;\n this.height = scaledHeight;\n this.calcViewportBoundaries();\n this.renderCanvas(canvasEl.getContext('2d'), this._objects);\n this.viewportTransform = vp;\n this.width = originalWidth;\n this.height = originalHeight;\n this.calcViewportBoundaries();\n this.interactive = originalInteractive;\n this.enableRetinaScaling = originalRetina;\n this.contextTop = originalContextTop;\n return canvasEl;\n },\n });\n\n})();\n\n\nfabric.util.object.extend(fabric.StaticCanvas.prototype, /** @lends fabric.StaticCanvas.prototype */ {\n /**\n * Populates canvas with data from the specified JSON.\n * JSON format must conform to the one of {@link fabric.Canvas#toJSON}\n * @param {String|Object} json JSON string or object\n * @param {Function} callback Callback, invoked when json is parsed\n * and corresponding objects (e.g: {@link fabric.Image})\n * are initialized\n * @param {Function} [reviver] Method for further parsing of JSON elements, called after each fabric object created.\n * @return {fabric.Canvas} instance\n * @chainable\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-3#deserialization}\n * @see {@link http://jsfiddle.net/fabricjs/fmgXt/|jsFiddle demo}\n * @example loadFromJSON\n * canvas.loadFromJSON(json, canvas.renderAll.bind(canvas));\n * @example loadFromJSON with reviver\n * canvas.loadFromJSON(json, canvas.renderAll.bind(canvas), function(o, object) {\n * // `o` = json object\n * // `object` = fabric.Object instance\n * // ... do some stuff ...\n * });\n */\n loadFromJSON: function (json, callback, reviver) {\n if (!json) {\n return;\n }\n\n // serialize if it wasn't already\n var serialized = (typeof json === 'string')\n ? JSON.parse(json)\n : fabric.util.object.clone(json);\n\n var _this = this,\n clipPath = serialized.clipPath,\n renderOnAddRemove = this.renderOnAddRemove;\n\n this.renderOnAddRemove = false;\n\n delete serialized.clipPath;\n\n this._enlivenObjects(serialized.objects, function (enlivenedObjects) {\n _this.clear();\n _this._setBgOverlay(serialized, function () {\n if (clipPath) {\n _this._enlivenObjects([clipPath], function (enlivenedCanvasClip) {\n _this.clipPath = enlivenedCanvasClip[0];\n _this.__setupCanvas.call(_this, serialized, enlivenedObjects, renderOnAddRemove, callback);\n });\n }\n else {\n _this.__setupCanvas.call(_this, serialized, enlivenedObjects, renderOnAddRemove, callback);\n }\n });\n }, reviver);\n return this;\n },\n\n /**\n * @private\n * @param {Object} serialized Object with background and overlay information\n * @param {Array} restored canvas objects\n * @param {Function} cached renderOnAddRemove callback\n * @param {Function} callback Invoked after all background and overlay images/patterns loaded\n */\n __setupCanvas: function(serialized, enlivenedObjects, renderOnAddRemove, callback) {\n var _this = this;\n enlivenedObjects.forEach(function(obj, index) {\n // we splice the array just in case some custom classes restored from JSON\n // will add more object to canvas at canvas init.\n _this.insertAt(obj, index);\n });\n this.renderOnAddRemove = renderOnAddRemove;\n // remove parts i cannot set as options\n delete serialized.objects;\n delete serialized.backgroundImage;\n delete serialized.overlayImage;\n delete serialized.background;\n delete serialized.overlay;\n // this._initOptions does too many things to just\n // call it. Normally loading an Object from JSON\n // create the Object instance. Here the Canvas is\n // already an instance and we are just loading things over it\n this._setOptions(serialized);\n this.renderAll();\n callback && callback();\n },\n\n /**\n * @private\n * @param {Object} serialized Object with background and overlay information\n * @param {Function} callback Invoked after all background and overlay images/patterns loaded\n */\n _setBgOverlay: function(serialized, callback) {\n var loaded = {\n backgroundColor: false,\n overlayColor: false,\n backgroundImage: false,\n overlayImage: false\n };\n\n if (!serialized.backgroundImage && !serialized.overlayImage && !serialized.background && !serialized.overlay) {\n callback && callback();\n return;\n }\n\n var cbIfLoaded = function () {\n if (loaded.backgroundImage && loaded.overlayImage && loaded.backgroundColor && loaded.overlayColor) {\n callback && callback();\n }\n };\n\n this.__setBgOverlay('backgroundImage', serialized.backgroundImage, loaded, cbIfLoaded);\n this.__setBgOverlay('overlayImage', serialized.overlayImage, loaded, cbIfLoaded);\n this.__setBgOverlay('backgroundColor', serialized.background, loaded, cbIfLoaded);\n this.__setBgOverlay('overlayColor', serialized.overlay, loaded, cbIfLoaded);\n },\n\n /**\n * @private\n * @param {String} property Property to set (backgroundImage, overlayImage, backgroundColor, overlayColor)\n * @param {(Object|String)} value Value to set\n * @param {Object} loaded Set loaded property to true if property is set\n * @param {Object} callback Callback function to invoke after property is set\n */\n __setBgOverlay: function(property, value, loaded, callback) {\n var _this = this;\n\n if (!value) {\n loaded[property] = true;\n callback && callback();\n return;\n }\n\n if (property === 'backgroundImage' || property === 'overlayImage') {\n fabric.util.enlivenObjects([value], function(enlivedObject){\n _this[property] = enlivedObject[0];\n loaded[property] = true;\n callback && callback();\n });\n }\n else {\n this['set' + fabric.util.string.capitalize(property, true)](value, function() {\n loaded[property] = true;\n callback && callback();\n });\n }\n },\n\n /**\n * @private\n * @param {Array} objects\n * @param {Function} callback\n * @param {Function} [reviver]\n */\n _enlivenObjects: function (objects, callback, reviver) {\n if (!objects || objects.length === 0) {\n callback && callback([]);\n return;\n }\n\n fabric.util.enlivenObjects(objects, function(enlivenedObjects) {\n callback && callback(enlivenedObjects);\n }, null, reviver);\n },\n\n /**\n * @private\n * @param {String} format\n * @param {Function} callback\n */\n _toDataURL: function (format, callback) {\n this.clone(function (clone) {\n callback(clone.toDataURL(format));\n });\n },\n\n /**\n * @private\n * @param {String} format\n * @param {Number} multiplier\n * @param {Function} callback\n */\n _toDataURLWithMultiplier: function (format, multiplier, callback) {\n this.clone(function (clone) {\n callback(clone.toDataURLWithMultiplier(format, multiplier));\n });\n },\n\n /**\n * Clones canvas instance\n * @param {Object} [callback] Receives cloned instance as a first argument\n * @param {Array} [properties] Array of properties to include in the cloned canvas and children\n */\n clone: function (callback, properties) {\n var data = JSON.stringify(this.toJSON(properties));\n this.cloneWithoutData(function(clone) {\n clone.loadFromJSON(data, function() {\n callback && callback(clone);\n });\n });\n },\n\n /**\n * Clones canvas instance without cloning existing data.\n * This essentially copies canvas dimensions, clipping properties, etc.\n * but leaves data empty (so that you can populate it with your own)\n * @param {Object} [callback] Receives cloned instance as a first argument\n */\n cloneWithoutData: function(callback) {\n var el = fabric.util.createCanvasElement();\n\n el.width = this.width;\n el.height = this.height;\n\n var clone = new fabric.Canvas(el);\n if (this.backgroundImage) {\n clone.setBackgroundImage(this.backgroundImage.src, function() {\n clone.renderAll();\n callback && callback(clone);\n });\n clone.backgroundImageOpacity = this.backgroundImageOpacity;\n clone.backgroundImageStretch = this.backgroundImageStretch;\n }\n else {\n callback && callback(clone);\n }\n }\n});\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n extend = fabric.util.object.extend,\n clone = fabric.util.object.clone,\n toFixed = fabric.util.toFixed,\n capitalize = fabric.util.string.capitalize,\n degreesToRadians = fabric.util.degreesToRadians,\n objectCaching = !fabric.isLikelyNode,\n ALIASING_LIMIT = 2;\n\n if (fabric.Object) {\n return;\n }\n\n /**\n * Root object class from which all 2d shape classes inherit from\n * @class fabric.Object\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-1#objects}\n * @see {@link fabric.Object#initialize} for constructor definition\n *\n * @fires added\n * @fires removed\n *\n * @fires selected\n * @fires deselected\n * @fires modified\n * @fires modified\n * @fires moved\n * @fires scaled\n * @fires rotated\n * @fires skewed\n *\n * @fires rotating\n * @fires scaling\n * @fires moving\n * @fires skewing\n *\n * @fires mousedown\n * @fires mouseup\n * @fires mouseover\n * @fires mouseout\n * @fires mousewheel\n * @fires mousedblclick\n *\n * @fires dragover\n * @fires dragenter\n * @fires dragleave\n * @fires drop\n */\n fabric.Object = fabric.util.createClass(fabric.CommonMethods, /** @lends fabric.Object.prototype */ {\n\n /**\n * Type of an object (rect, circle, path, etc.).\n * Note that this property is meant to be read-only and not meant to be modified.\n * If you modify, certain parts of Fabric (such as JSON loading) won't work correctly.\n * @type String\n * @default\n */\n type: 'object',\n\n /**\n * Horizontal origin of transformation of an object (one of \"left\", \"right\", \"center\")\n * See http://jsfiddle.net/1ow02gea/244/ on how originX/originY affect objects in groups\n * @type String\n * @default\n */\n originX: 'left',\n\n /**\n * Vertical origin of transformation of an object (one of \"top\", \"bottom\", \"center\")\n * See http://jsfiddle.net/1ow02gea/244/ on how originX/originY affect objects in groups\n * @type String\n * @default\n */\n originY: 'top',\n\n /**\n * Top position of an object. Note that by default it's relative to object top. You can change this by setting originY={top/center/bottom}\n * @type Number\n * @default\n */\n top: 0,\n\n /**\n * Left position of an object. Note that by default it's relative to object left. You can change this by setting originX={left/center/right}\n * @type Number\n * @default\n */\n left: 0,\n\n /**\n * Object width\n * @type Number\n * @default\n */\n width: 0,\n\n /**\n * Object height\n * @type Number\n * @default\n */\n height: 0,\n\n /**\n * Object scale factor (horizontal)\n * @type Number\n * @default\n */\n scaleX: 1,\n\n /**\n * Object scale factor (vertical)\n * @type Number\n * @default\n */\n scaleY: 1,\n\n /**\n * When true, an object is rendered as flipped horizontally\n * @type Boolean\n * @default\n */\n flipX: false,\n\n /**\n * When true, an object is rendered as flipped vertically\n * @type Boolean\n * @default\n */\n flipY: false,\n\n /**\n * Opacity of an object\n * @type Number\n * @default\n */\n opacity: 1,\n\n /**\n * Angle of rotation of an object (in degrees)\n * @type Number\n * @default\n */\n angle: 0,\n\n /**\n * Angle of skew on x axes of an object (in degrees)\n * @type Number\n * @default\n */\n skewX: 0,\n\n /**\n * Angle of skew on y axes of an object (in degrees)\n * @type Number\n * @default\n */\n skewY: 0,\n\n /**\n * Size of object's controlling corners (in pixels)\n * @type Number\n * @default\n */\n cornerSize: 13,\n\n /**\n * Size of object's controlling corners when touch interaction is detected\n * @type Number\n * @default\n */\n touchCornerSize: 24,\n\n /**\n * When true, object's controlling corners are rendered as transparent inside (i.e. stroke instead of fill)\n * @type Boolean\n * @default\n */\n transparentCorners: true,\n\n /**\n * Default cursor value used when hovering over this object on canvas\n * @type String\n * @default\n */\n hoverCursor: null,\n\n /**\n * Default cursor value used when moving this object on canvas\n * @type String\n * @default\n */\n moveCursor: null,\n\n /**\n * Padding between object and its controlling borders (in pixels)\n * @type Number\n * @default\n */\n padding: 0,\n\n /**\n * Color of controlling borders of an object (when it's active)\n * @type String\n * @default\n */\n borderColor: 'rgb(178,204,255)',\n\n /**\n * Array specifying dash pattern of an object's borders (hasBorder must be true)\n * @since 1.6.2\n * @type Array\n */\n borderDashArray: null,\n\n /**\n * Color of controlling corners of an object (when it's active)\n * @type String\n * @default\n */\n cornerColor: 'rgb(178,204,255)',\n\n /**\n * Color of controlling corners of an object (when it's active and transparentCorners false)\n * @since 1.6.2\n * @type String\n * @default\n */\n cornerStrokeColor: null,\n\n /**\n * Specify style of control, 'rect' or 'circle'\n * @since 1.6.2\n * @type String\n */\n cornerStyle: 'rect',\n\n /**\n * Array specifying dash pattern of an object's control (hasBorder must be true)\n * @since 1.6.2\n * @type Array\n */\n cornerDashArray: null,\n\n /**\n * When true, this object will use center point as the origin of transformation\n * when being scaled via the controls.\n * Backwards incompatibility note: This property replaces \"centerTransform\" (Boolean).\n * @since 1.3.4\n * @type Boolean\n * @default\n */\n centeredScaling: false,\n\n /**\n * When true, this object will use center point as the origin of transformation\n * when being rotated via the controls.\n * Backwards incompatibility note: This property replaces \"centerTransform\" (Boolean).\n * @since 1.3.4\n * @type Boolean\n * @default\n */\n centeredRotation: true,\n\n /**\n * Color of object's fill\n * takes css colors https://www.w3.org/TR/css-color-3/\n * @type String\n * @default\n */\n fill: 'rgb(0,0,0)',\n\n /**\n * Fill rule used to fill an object\n * accepted values are nonzero, evenodd\n * Backwards incompatibility note: This property was used for setting globalCompositeOperation until v1.4.12 (use `fabric.Object#globalCompositeOperation` instead)\n * @type String\n * @default\n */\n fillRule: 'nonzero',\n\n /**\n * Composite rule used for canvas globalCompositeOperation\n * @type String\n * @default\n */\n globalCompositeOperation: 'source-over',\n\n /**\n * Background color of an object.\n * takes css colors https://www.w3.org/TR/css-color-3/\n * @type String\n * @default\n */\n backgroundColor: '',\n\n /**\n * Selection Background color of an object. colored layer behind the object when it is active.\n * does not mix good with globalCompositeOperation methods.\n * @type String\n * @default\n */\n selectionBackgroundColor: '',\n\n /**\n * When defined, an object is rendered via stroke and this property specifies its color\n * takes css colors https://www.w3.org/TR/css-color-3/\n * @type String\n * @default\n */\n stroke: null,\n\n /**\n * Width of a stroke used to render this object\n * @type Number\n * @default\n */\n strokeWidth: 1,\n\n /**\n * Array specifying dash pattern of an object's stroke (stroke must be defined)\n * @type Array\n */\n strokeDashArray: null,\n\n /**\n * Line offset of an object's stroke\n * @type Number\n * @default\n */\n strokeDashOffset: 0,\n\n /**\n * Line endings style of an object's stroke (one of \"butt\", \"round\", \"square\")\n * @type String\n * @default\n */\n strokeLineCap: 'butt',\n\n /**\n * Corner style of an object's stroke (one of \"bevel\", \"round\", \"miter\")\n * @type String\n * @default\n */\n strokeLineJoin: 'miter',\n\n /**\n * Maximum miter length (used for strokeLineJoin = \"miter\") of an object's stroke\n * @type Number\n * @default\n */\n strokeMiterLimit: 4,\n\n /**\n * Shadow object representing shadow of this shape\n * @type fabric.Shadow\n * @default\n */\n shadow: null,\n\n /**\n * Opacity of object's controlling borders when object is active and moving\n * @type Number\n * @default\n */\n borderOpacityWhenMoving: 0.4,\n\n /**\n * Scale factor of object's controlling borders\n * bigger number will make a thicker border\n * border is 1, so this is basically a border thickness\n * since there is no way to change the border itself.\n * @type Number\n * @default\n */\n borderScaleFactor: 1,\n\n /**\n * Minimum allowed scale value of an object\n * @type Number\n * @default\n */\n minScaleLimit: 0,\n\n /**\n * When set to `false`, an object can not be selected for modification (using either point-click-based or group-based selection).\n * But events still fire on it.\n * @type Boolean\n * @default\n */\n selectable: true,\n\n /**\n * When set to `false`, an object can not be a target of events. All events propagate through it. Introduced in v1.3.4\n * @type Boolean\n * @default\n */\n evented: true,\n\n /**\n * When set to `false`, an object is not rendered on canvas\n * @type Boolean\n * @default\n */\n visible: true,\n\n /**\n * When set to `false`, object's controls are not displayed and can not be used to manipulate object\n * @type Boolean\n * @default\n */\n hasControls: true,\n\n /**\n * When set to `false`, object's controlling borders are not rendered\n * @type Boolean\n * @default\n */\n hasBorders: true,\n\n /**\n * When set to `true`, objects are \"found\" on canvas on per-pixel basis rather than according to bounding box\n * @type Boolean\n * @default\n */\n perPixelTargetFind: false,\n\n /**\n * When `false`, default object's values are not included in its serialization\n * @type Boolean\n * @default\n */\n includeDefaultValues: true,\n\n /**\n * When `true`, object horizontal movement is locked\n * @type Boolean\n * @default\n */\n lockMovementX: false,\n\n /**\n * When `true`, object vertical movement is locked\n * @type Boolean\n * @default\n */\n lockMovementY: false,\n\n /**\n * When `true`, object rotation is locked\n * @type Boolean\n * @default\n */\n lockRotation: false,\n\n /**\n * When `true`, object horizontal scaling is locked\n * @type Boolean\n * @default\n */\n lockScalingX: false,\n\n /**\n * When `true`, object vertical scaling is locked\n * @type Boolean\n * @default\n */\n lockScalingY: false,\n\n /**\n * When `true`, object horizontal skewing is locked\n * @type Boolean\n * @default\n */\n lockSkewingX: false,\n\n /**\n * When `true`, object vertical skewing is locked\n * @type Boolean\n * @default\n */\n lockSkewingY: false,\n\n /**\n * When `true`, object cannot be flipped by scaling into negative values\n * @type Boolean\n * @default\n */\n lockScalingFlip: false,\n\n /**\n * When `true`, object is not exported in OBJECT/JSON\n * @since 1.6.3\n * @type Boolean\n * @default\n */\n excludeFromExport: false,\n\n /**\n * When `true`, object is cached on an additional canvas.\n * When `false`, object is not cached unless necessary ( clipPath )\n * default to true\n * @since 1.7.0\n * @type Boolean\n * @default true\n */\n objectCaching: objectCaching,\n\n /**\n * When `true`, object properties are checked for cache invalidation. In some particular\n * situation you may want this to be disabled ( spray brush, very big, groups)\n * or if your application does not allow you to modify properties for groups child you want\n * to disable it for groups.\n * default to false\n * since 1.7.0\n * @type Boolean\n * @default false\n */\n statefullCache: false,\n\n /**\n * When `true`, cache does not get updated during scaling. The picture will get blocky if scaled\n * too much and will be redrawn with correct details at the end of scaling.\n * this setting is performance and application dependant.\n * default to true\n * since 1.7.0\n * @type Boolean\n * @default true\n */\n noScaleCache: true,\n\n /**\n * When `false`, the stoke width will scale with the object.\n * When `true`, the stroke will always match the exact pixel size entered for stroke width.\n * this Property does not work on Text classes or drawing call that uses strokeText,fillText methods\n * default to false\n * @since 2.6.0\n * @type Boolean\n * @default false\n * @type Boolean\n * @default false\n */\n strokeUniform: false,\n\n /**\n * When set to `true`, object's cache will be rerendered next render call.\n * since 1.7.0\n * @type Boolean\n * @default true\n */\n dirty: true,\n\n /**\n * keeps the value of the last hovered corner during mouse move.\n * 0 is no corner, or 'mt', 'ml', 'mtr' etc..\n * It should be private, but there is no harm in using it as\n * a read-only property.\n * @type number|string|any\n * @default 0\n */\n __corner: 0,\n\n /**\n * Determines if the fill or the stroke is drawn first (one of \"fill\" or \"stroke\")\n * @type String\n * @default\n */\n paintFirst: 'fill',\n\n /**\n * When 'down', object is set to active on mousedown/touchstart\n * When 'up', object is set to active on mouseup/touchend\n * Experimental. Let's see if this breaks anything before supporting officially\n * @private\n * since 4.4.0\n * @type String\n * @default 'down'\n */\n activeOn: 'down',\n\n /**\n * List of properties to consider when checking if state\n * of an object is changed (fabric.Object#hasStateChanged)\n * as well as for history (undo/redo) purposes\n * @type Array\n */\n stateProperties: (\n 'top left width height scaleX scaleY flipX flipY originX originY transformMatrix ' +\n 'stroke strokeWidth strokeDashArray strokeLineCap strokeDashOffset strokeLineJoin strokeMiterLimit ' +\n 'angle opacity fill globalCompositeOperation shadow visible backgroundColor ' +\n 'skewX skewY fillRule paintFirst clipPath strokeUniform'\n ).split(' '),\n\n /**\n * List of properties to consider when checking if cache needs refresh\n * Those properties are checked by statefullCache ON ( or lazy mode if we want ) or from single\n * calls to Object.set(key, value). If the key is in this list, the object is marked as dirty\n * and refreshed at the next render\n * @type Array\n */\n cacheProperties: (\n 'fill stroke strokeWidth strokeDashArray width height paintFirst strokeUniform' +\n ' strokeLineCap strokeDashOffset strokeLineJoin strokeMiterLimit backgroundColor clipPath'\n ).split(' '),\n\n /**\n * List of properties to consider for animating colors.\n * @type Array\n */\n colorProperties: (\n 'fill stroke backgroundColor'\n ).split(' '),\n\n /**\n * a fabricObject that, without stroke define a clipping area with their shape. filled in black\n * the clipPath object gets used when the object has rendered, and the context is placed in the center\n * of the object cacheCanvas.\n * If you want 0,0 of a clipPath to align with an object center, use clipPath.originX/Y to 'center'\n * @type fabric.Object\n */\n clipPath: undefined,\n\n /**\n * Meaningful ONLY when the object is used as clipPath.\n * if true, the clipPath will make the object clip to the outside of the clipPath\n * since 2.4.0\n * @type boolean\n * @default false\n */\n inverted: false,\n\n /**\n * Meaningful ONLY when the object is used as clipPath.\n * if true, the clipPath will have its top and left relative to canvas, and will\n * not be influenced by the object transform. This will make the clipPath relative\n * to the canvas, but clipping just a particular object.\n * WARNING this is beta, this feature may change or be renamed.\n * since 2.4.0\n * @type boolean\n * @default false\n */\n absolutePositioned: false,\n\n /**\n * Constructor\n * @param {Object} [options] Options object\n */\n initialize: function(options) {\n if (options) {\n this.setOptions(options);\n }\n },\n\n /**\n * Create a the canvas used to keep the cached copy of the object\n * @private\n */\n _createCacheCanvas: function() {\n this._cacheProperties = {};\n this._cacheCanvas = fabric.util.createCanvasElement();\n this._cacheContext = this._cacheCanvas.getContext('2d');\n this._updateCacheCanvas();\n // if canvas gets created, is empty, so dirty.\n this.dirty = true;\n },\n\n /**\n * Limit the cache dimensions so that X * Y do not cross fabric.perfLimitSizeTotal\n * and each side do not cross fabric.cacheSideLimit\n * those numbers are configurable so that you can get as much detail as you want\n * making bargain with performances.\n * @param {Object} dims\n * @param {Object} dims.width width of canvas\n * @param {Object} dims.height height of canvas\n * @param {Object} dims.zoomX zoomX zoom value to unscale the canvas before drawing cache\n * @param {Object} dims.zoomY zoomY zoom value to unscale the canvas before drawing cache\n * @return {Object}.width width of canvas\n * @return {Object}.height height of canvas\n * @return {Object}.zoomX zoomX zoom value to unscale the canvas before drawing cache\n * @return {Object}.zoomY zoomY zoom value to unscale the canvas before drawing cache\n */\n _limitCacheSize: function(dims) {\n var perfLimitSizeTotal = fabric.perfLimitSizeTotal,\n width = dims.width, height = dims.height,\n max = fabric.maxCacheSideLimit, min = fabric.minCacheSideLimit;\n if (width <= max && height <= max && width * height <= perfLimitSizeTotal) {\n if (width < min) {\n dims.width = min;\n }\n if (height < min) {\n dims.height = min;\n }\n return dims;\n }\n var ar = width / height, limitedDims = fabric.util.limitDimsByArea(ar, perfLimitSizeTotal),\n capValue = fabric.util.capValue,\n x = capValue(min, limitedDims.x, max),\n y = capValue(min, limitedDims.y, max);\n if (width > x) {\n dims.zoomX /= width / x;\n dims.width = x;\n dims.capped = true;\n }\n if (height > y) {\n dims.zoomY /= height / y;\n dims.height = y;\n dims.capped = true;\n }\n return dims;\n },\n\n /**\n * Return the dimension and the zoom level needed to create a cache canvas\n * big enough to host the object to be cached.\n * @private\n * @return {Object}.x width of object to be cached\n * @return {Object}.y height of object to be cached\n * @return {Object}.width width of canvas\n * @return {Object}.height height of canvas\n * @return {Object}.zoomX zoomX zoom value to unscale the canvas before drawing cache\n * @return {Object}.zoomY zoomY zoom value to unscale the canvas before drawing cache\n */\n _getCacheCanvasDimensions: function() {\n var objectScale = this.getTotalObjectScaling(),\n // caculate dimensions without skewing\n dim = this._getTransformedDimensions(0, 0),\n neededX = dim.x * objectScale.scaleX / this.scaleX,\n neededY = dim.y * objectScale.scaleY / this.scaleY;\n return {\n // for sure this ALIASING_LIMIT is slightly creating problem\n // in situation in which the cache canvas gets an upper limit\n // also objectScale contains already scaleX and scaleY\n width: neededX + ALIASING_LIMIT,\n height: neededY + ALIASING_LIMIT,\n zoomX: objectScale.scaleX,\n zoomY: objectScale.scaleY,\n x: neededX,\n y: neededY\n };\n },\n\n /**\n * Update width and height of the canvas for cache\n * returns true or false if canvas needed resize.\n * @private\n * @return {Boolean} true if the canvas has been resized\n */\n _updateCacheCanvas: function() {\n var targetCanvas = this.canvas;\n if (this.noScaleCache && targetCanvas && targetCanvas._currentTransform) {\n var target = targetCanvas._currentTransform.target,\n action = targetCanvas._currentTransform.action;\n if (this === target && action.slice && action.slice(0, 5) === 'scale') {\n return false;\n }\n }\n var canvas = this._cacheCanvas,\n dims = this._limitCacheSize(this._getCacheCanvasDimensions()),\n minCacheSize = fabric.minCacheSideLimit,\n width = dims.width, height = dims.height, drawingWidth, drawingHeight,\n zoomX = dims.zoomX, zoomY = dims.zoomY,\n dimensionsChanged = width !== this.cacheWidth || height !== this.cacheHeight,\n zoomChanged = this.zoomX !== zoomX || this.zoomY !== zoomY,\n shouldRedraw = dimensionsChanged || zoomChanged,\n additionalWidth = 0, additionalHeight = 0, shouldResizeCanvas = false;\n if (dimensionsChanged) {\n var canvasWidth = this._cacheCanvas.width,\n canvasHeight = this._cacheCanvas.height,\n sizeGrowing = width > canvasWidth || height > canvasHeight,\n sizeShrinking = (width < canvasWidth * 0.9 || height < canvasHeight * 0.9) &&\n canvasWidth > minCacheSize && canvasHeight > minCacheSize;\n shouldResizeCanvas = sizeGrowing || sizeShrinking;\n if (sizeGrowing && !dims.capped && (width > minCacheSize || height > minCacheSize)) {\n additionalWidth = width * 0.1;\n additionalHeight = height * 0.1;\n }\n }\n if (this instanceof fabric.Text && this.path) {\n shouldRedraw = true;\n shouldResizeCanvas = true;\n additionalWidth += this.getHeightOfLine(0) * this.zoomX;\n additionalHeight += this.getHeightOfLine(0) * this.zoomY;\n }\n if (shouldRedraw) {\n if (shouldResizeCanvas) {\n canvas.width = Math.ceil(width + additionalWidth);\n canvas.height = Math.ceil(height + additionalHeight);\n }\n else {\n this._cacheContext.setTransform(1, 0, 0, 1, 0, 0);\n this._cacheContext.clearRect(0, 0, canvas.width, canvas.height);\n }\n drawingWidth = dims.x / 2;\n drawingHeight = dims.y / 2;\n this.cacheTranslationX = Math.round(canvas.width / 2 - drawingWidth) + drawingWidth;\n this.cacheTranslationY = Math.round(canvas.height / 2 - drawingHeight) + drawingHeight;\n this.cacheWidth = width;\n this.cacheHeight = height;\n this._cacheContext.translate(this.cacheTranslationX, this.cacheTranslationY);\n this._cacheContext.scale(zoomX, zoomY);\n this.zoomX = zoomX;\n this.zoomY = zoomY;\n return true;\n }\n return false;\n },\n\n /**\n * Sets object's properties from options\n * @param {Object} [options] Options object\n */\n setOptions: function(options) {\n this._setOptions(options);\n this._initGradient(options.fill, 'fill');\n this._initGradient(options.stroke, 'stroke');\n this._initPattern(options.fill, 'fill');\n this._initPattern(options.stroke, 'stroke');\n },\n\n /**\n * Transforms context when rendering an object\n * @param {CanvasRenderingContext2D} ctx Context\n */\n transform: function(ctx) {\n var needFullTransform = (this.group && !this.group._transformDone) ||\n (this.group && this.canvas && ctx === this.canvas.contextTop);\n var m = this.calcTransformMatrix(!needFullTransform);\n ctx.transform(m[0], m[1], m[2], m[3], m[4], m[5]);\n },\n\n /**\n * Returns an object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} Object representation of an instance\n */\n toObject: function(propertiesToInclude) {\n var NUM_FRACTION_DIGITS = fabric.Object.NUM_FRACTION_DIGITS,\n\n object = {\n type: this.type,\n version: fabric.version,\n originX: this.originX,\n originY: this.originY,\n left: toFixed(this.left, NUM_FRACTION_DIGITS),\n top: toFixed(this.top, NUM_FRACTION_DIGITS),\n width: toFixed(this.width, NUM_FRACTION_DIGITS),\n height: toFixed(this.height, NUM_FRACTION_DIGITS),\n fill: (this.fill && this.fill.toObject) ? this.fill.toObject() : this.fill,\n stroke: (this.stroke && this.stroke.toObject) ? this.stroke.toObject() : this.stroke,\n strokeWidth: toFixed(this.strokeWidth, NUM_FRACTION_DIGITS),\n strokeDashArray: this.strokeDashArray ? this.strokeDashArray.concat() : this.strokeDashArray,\n strokeLineCap: this.strokeLineCap,\n strokeDashOffset: this.strokeDashOffset,\n strokeLineJoin: this.strokeLineJoin,\n strokeUniform: this.strokeUniform,\n strokeMiterLimit: toFixed(this.strokeMiterLimit, NUM_FRACTION_DIGITS),\n scaleX: toFixed(this.scaleX, NUM_FRACTION_DIGITS),\n scaleY: toFixed(this.scaleY, NUM_FRACTION_DIGITS),\n angle: toFixed(this.angle, NUM_FRACTION_DIGITS),\n flipX: this.flipX,\n flipY: this.flipY,\n opacity: toFixed(this.opacity, NUM_FRACTION_DIGITS),\n shadow: (this.shadow && this.shadow.toObject) ? this.shadow.toObject() : this.shadow,\n visible: this.visible,\n backgroundColor: this.backgroundColor,\n fillRule: this.fillRule,\n paintFirst: this.paintFirst,\n globalCompositeOperation: this.globalCompositeOperation,\n skewX: toFixed(this.skewX, NUM_FRACTION_DIGITS),\n skewY: toFixed(this.skewY, NUM_FRACTION_DIGITS),\n };\n\n if (this.clipPath && !this.clipPath.excludeFromExport) {\n object.clipPath = this.clipPath.toObject(propertiesToInclude);\n object.clipPath.inverted = this.clipPath.inverted;\n object.clipPath.absolutePositioned = this.clipPath.absolutePositioned;\n }\n\n fabric.util.populateWithProperties(this, object, propertiesToInclude);\n if (!this.includeDefaultValues) {\n object = this._removeDefaultValues(object);\n }\n\n return object;\n },\n\n /**\n * Returns (dataless) object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} Object representation of an instance\n */\n toDatalessObject: function(propertiesToInclude) {\n // will be overwritten by subclasses\n return this.toObject(propertiesToInclude);\n },\n\n /**\n * @private\n * @param {Object} object\n */\n _removeDefaultValues: function(object) {\n var prototype = fabric.util.getKlass(object.type).prototype,\n stateProperties = prototype.stateProperties;\n stateProperties.forEach(function(prop) {\n if (prop === 'left' || prop === 'top') {\n return;\n }\n if (object[prop] === prototype[prop]) {\n delete object[prop];\n }\n // basically a check for [] === []\n if (Array.isArray(object[prop]) && Array.isArray(prototype[prop])\n && object[prop].length === 0 && prototype[prop].length === 0) {\n delete object[prop];\n }\n });\n\n return object;\n },\n\n /**\n * Returns a string representation of an instance\n * @return {String}\n */\n toString: function() {\n return '#';\n },\n\n /**\n * Return the object scale factor counting also the group scaling\n * @return {Object} object with scaleX and scaleY properties\n */\n getObjectScaling: function() {\n // if the object is a top level one, on the canvas, we go for simple aritmetic\n // otherwise the complex method with angles will return approximations and decimals\n // and will likely kill the cache when not needed\n // https://github.com/fabricjs/fabric.js/issues/7157\n if (!this.group) {\n return {\n scaleX: this.scaleX,\n scaleY: this.scaleY,\n };\n }\n // if we are inside a group total zoom calculation is complex, we defer to generic matrices\n var options = fabric.util.qrDecompose(this.calcTransformMatrix());\n return { scaleX: Math.abs(options.scaleX), scaleY: Math.abs(options.scaleY) };\n },\n\n /**\n * Return the object scale factor counting also the group scaling, zoom and retina\n * @return {Object} object with scaleX and scaleY properties\n */\n getTotalObjectScaling: function() {\n var scale = this.getObjectScaling(), scaleX = scale.scaleX, scaleY = scale.scaleY;\n if (this.canvas) {\n var zoom = this.canvas.getZoom();\n var retina = this.canvas.getRetinaScaling();\n scaleX *= zoom * retina;\n scaleY *= zoom * retina;\n }\n return { scaleX: scaleX, scaleY: scaleY };\n },\n\n /**\n * Return the object opacity counting also the group property\n * @return {Number}\n */\n getObjectOpacity: function() {\n var opacity = this.opacity;\n if (this.group) {\n opacity *= this.group.getObjectOpacity();\n }\n return opacity;\n },\n\n /**\n * @private\n * @param {String} key\n * @param {*} value\n * @return {fabric.Object} thisArg\n */\n _set: function(key, value) {\n var shouldConstrainValue = (key === 'scaleX' || key === 'scaleY'),\n isChanged = this[key] !== value, groupNeedsUpdate = false;\n\n if (shouldConstrainValue) {\n value = this._constrainScale(value);\n }\n if (key === 'scaleX' && value < 0) {\n this.flipX = !this.flipX;\n value *= -1;\n }\n else if (key === 'scaleY' && value < 0) {\n this.flipY = !this.flipY;\n value *= -1;\n }\n else if (key === 'shadow' && value && !(value instanceof fabric.Shadow)) {\n value = new fabric.Shadow(value);\n }\n else if (key === 'dirty' && this.group) {\n this.group.set('dirty', value);\n }\n\n this[key] = value;\n\n if (isChanged) {\n groupNeedsUpdate = this.group && this.group.isOnACache();\n if (this.cacheProperties.indexOf(key) > -1) {\n this.dirty = true;\n groupNeedsUpdate && this.group.set('dirty', true);\n }\n else if (groupNeedsUpdate && this.stateProperties.indexOf(key) > -1) {\n this.group.set('dirty', true);\n }\n }\n return this;\n },\n\n /**\n * This callback function is called by the parent group of an object every\n * time a non-delegated property changes on the group. It is passed the key\n * and value as parameters. Not adding in this function's signature to avoid\n * Travis build error about unused variables.\n */\n setOnGroup: function() {\n // implemented by sub-classes, as needed.\n },\n\n /**\n * Retrieves viewportTransform from Object's canvas if possible\n * @method getViewportTransform\n * @memberOf fabric.Object.prototype\n * @return {Array}\n */\n getViewportTransform: function() {\n if (this.canvas && this.canvas.viewportTransform) {\n return this.canvas.viewportTransform;\n }\n return fabric.iMatrix.concat();\n },\n\n /*\n * @private\n * return if the object would be visible in rendering\n * @memberOf fabric.Object.prototype\n * @return {Boolean}\n */\n isNotVisible: function() {\n return this.opacity === 0 ||\n (!this.width && !this.height && this.strokeWidth === 0) ||\n !this.visible;\n },\n\n /**\n * Renders an object on a specified context\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n render: function(ctx) {\n // do not render if width/height are zeros or object is not visible\n if (this.isNotVisible()) {\n return;\n }\n if (this.canvas && this.canvas.skipOffscreen && !this.group && !this.isOnScreen()) {\n return;\n }\n ctx.save();\n this._setupCompositeOperation(ctx);\n this.drawSelectionBackground(ctx);\n this.transform(ctx);\n this._setOpacity(ctx);\n this._setShadow(ctx, this);\n if (this.shouldCache()) {\n this.renderCache();\n this.drawCacheOnCanvas(ctx);\n }\n else {\n this._removeCacheCanvas();\n this.dirty = false;\n this.drawObject(ctx);\n if (this.objectCaching && this.statefullCache) {\n this.saveState({ propertySet: 'cacheProperties' });\n }\n }\n ctx.restore();\n },\n\n renderCache: function(options) {\n options = options || {};\n if (!this._cacheCanvas || !this._cacheContext) {\n this._createCacheCanvas();\n }\n if (this.isCacheDirty()) {\n this.statefullCache && this.saveState({ propertySet: 'cacheProperties' });\n this.drawObject(this._cacheContext, options.forClipping);\n this.dirty = false;\n }\n },\n\n /**\n * Remove cacheCanvas and its dimensions from the objects\n */\n _removeCacheCanvas: function() {\n this._cacheCanvas = null;\n this._cacheContext = null;\n this.cacheWidth = 0;\n this.cacheHeight = 0;\n },\n\n /**\n * return true if the object will draw a stroke\n * Does not consider text styles. This is just a shortcut used at rendering time\n * We want it to be an approximation and be fast.\n * wrote to avoid extra caching, it has to return true when stroke happens,\n * can guess when it will not happen at 100% chance, does not matter if it misses\n * some use case where the stroke is invisible.\n * @since 3.0.0\n * @returns Boolean\n */\n hasStroke: function() {\n return this.stroke && this.stroke !== 'transparent' && this.strokeWidth !== 0;\n },\n\n /**\n * return true if the object will draw a fill\n * Does not consider text styles. This is just a shortcut used at rendering time\n * We want it to be an approximation and be fast.\n * wrote to avoid extra caching, it has to return true when fill happens,\n * can guess when it will not happen at 100% chance, does not matter if it misses\n * some use case where the fill is invisible.\n * @since 3.0.0\n * @returns Boolean\n */\n hasFill: function() {\n return this.fill && this.fill !== 'transparent';\n },\n\n /**\n * When set to `true`, force the object to have its own cache, even if it is inside a group\n * it may be needed when your object behave in a particular way on the cache and always needs\n * its own isolated canvas to render correctly.\n * Created to be overridden\n * since 1.7.12\n * @returns Boolean\n */\n needsItsOwnCache: function() {\n if (this.paintFirst === 'stroke' &&\n this.hasFill() && this.hasStroke() && typeof this.shadow === 'object') {\n return true;\n }\n if (this.clipPath) {\n return true;\n }\n return false;\n },\n\n /**\n * Decide if the object should cache or not. Create its own cache level\n * objectCaching is a global flag, wins over everything\n * needsItsOwnCache should be used when the object drawing method requires\n * a cache step. None of the fabric classes requires it.\n * Generally you do not cache objects in groups because the group outside is cached.\n * Read as: cache if is needed, or if the feature is enabled but we are not already caching.\n * @return {Boolean}\n */\n shouldCache: function() {\n this.ownCaching = this.needsItsOwnCache() || (\n this.objectCaching &&\n (!this.group || !this.group.isOnACache())\n );\n return this.ownCaching;\n },\n\n /**\n * Check if this object or a child object will cast a shadow\n * used by Group.shouldCache to know if child has a shadow recursively\n * @return {Boolean}\n */\n willDrawShadow: function() {\n return !!this.shadow && (this.shadow.offsetX !== 0 || this.shadow.offsetY !== 0);\n },\n\n /**\n * Execute the drawing operation for an object clipPath\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {fabric.Object} clipPath\n */\n drawClipPathOnCache: function(ctx, clipPath) {\n ctx.save();\n // DEBUG: uncomment this line, comment the following\n // ctx.globalAlpha = 0.4\n if (clipPath.inverted) {\n ctx.globalCompositeOperation = 'destination-out';\n }\n else {\n ctx.globalCompositeOperation = 'destination-in';\n }\n //ctx.scale(1 / 2, 1 / 2);\n if (clipPath.absolutePositioned) {\n var m = fabric.util.invertTransform(this.calcTransformMatrix());\n ctx.transform(m[0], m[1], m[2], m[3], m[4], m[5]);\n }\n clipPath.transform(ctx);\n ctx.scale(1 / clipPath.zoomX, 1 / clipPath.zoomY);\n ctx.drawImage(clipPath._cacheCanvas, -clipPath.cacheTranslationX, -clipPath.cacheTranslationY);\n ctx.restore();\n },\n\n /**\n * Execute the drawing operation for an object on a specified context\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n drawObject: function(ctx, forClipping) {\n var originalFill = this.fill, originalStroke = this.stroke;\n if (forClipping) {\n this.fill = 'black';\n this.stroke = '';\n this._setClippingProperties(ctx);\n }\n else {\n this._renderBackground(ctx);\n }\n this._render(ctx);\n this._drawClipPath(ctx, this.clipPath);\n this.fill = originalFill;\n this.stroke = originalStroke;\n },\n\n /**\n * Prepare clipPath state and cache and draw it on instance's cache\n * @param {CanvasRenderingContext2D} ctx\n * @param {fabric.Object} clipPath\n */\n _drawClipPath: function (ctx, clipPath) {\n if (!clipPath) { return; }\n // needed to setup a couple of variables\n // path canvas gets overridden with this one.\n // TODO find a better solution?\n clipPath.canvas = this.canvas;\n clipPath.shouldCache();\n clipPath._transformDone = true;\n clipPath.renderCache({ forClipping: true });\n this.drawClipPathOnCache(ctx, clipPath);\n },\n\n /**\n * Paint the cached copy of the object on the target context.\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n drawCacheOnCanvas: function(ctx) {\n ctx.scale(1 / this.zoomX, 1 / this.zoomY);\n ctx.drawImage(this._cacheCanvas, -this.cacheTranslationX, -this.cacheTranslationY);\n },\n\n /**\n * Check if cache is dirty\n * @param {Boolean} skipCanvas skip canvas checks because this object is painted\n * on parent canvas.\n */\n isCacheDirty: function(skipCanvas) {\n if (this.isNotVisible()) {\n return false;\n }\n if (this._cacheCanvas && this._cacheContext && !skipCanvas && this._updateCacheCanvas()) {\n // in this case the context is already cleared.\n return true;\n }\n else {\n if (this.dirty ||\n (this.clipPath && this.clipPath.absolutePositioned) ||\n (this.statefullCache && this.hasStateChanged('cacheProperties'))\n ) {\n if (this._cacheCanvas && this._cacheContext && !skipCanvas) {\n var width = this.cacheWidth / this.zoomX;\n var height = this.cacheHeight / this.zoomY;\n this._cacheContext.clearRect(-width / 2, -height / 2, width, height);\n }\n return true;\n }\n }\n return false;\n },\n\n /**\n * Draws a background for the object big as its untransformed dimensions\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderBackground: function(ctx) {\n if (!this.backgroundColor) {\n return;\n }\n var dim = this._getNonTransformedDimensions();\n ctx.fillStyle = this.backgroundColor;\n\n ctx.fillRect(\n -dim.x / 2,\n -dim.y / 2,\n dim.x,\n dim.y\n );\n // if there is background color no other shadows\n // should be casted\n this._removeShadow(ctx);\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _setOpacity: function(ctx) {\n if (this.group && !this.group._transformDone) {\n ctx.globalAlpha = this.getObjectOpacity();\n }\n else {\n ctx.globalAlpha *= this.opacity;\n }\n },\n\n _setStrokeStyles: function(ctx, decl) {\n var stroke = decl.stroke;\n if (stroke) {\n ctx.lineWidth = decl.strokeWidth;\n ctx.lineCap = decl.strokeLineCap;\n ctx.lineDashOffset = decl.strokeDashOffset;\n ctx.lineJoin = decl.strokeLineJoin;\n ctx.miterLimit = decl.strokeMiterLimit;\n if (stroke.toLive) {\n if (stroke.gradientUnits === 'percentage' || stroke.gradientTransform || stroke.patternTransform) {\n // need to transform gradient in a pattern.\n // this is a slow process. If you are hitting this codepath, and the object\n // is not using caching, you should consider switching it on.\n // we need a canvas as big as the current object caching canvas.\n this._applyPatternForTransformedGradient(ctx, stroke);\n }\n else {\n // is a simple gradient or pattern\n ctx.strokeStyle = stroke.toLive(ctx, this);\n this._applyPatternGradientTransform(ctx, stroke);\n }\n }\n else {\n // is a color\n ctx.strokeStyle = decl.stroke;\n }\n }\n },\n\n _setFillStyles: function(ctx, decl) {\n var fill = decl.fill;\n if (fill) {\n if (fill.toLive) {\n ctx.fillStyle = fill.toLive(ctx, this);\n this._applyPatternGradientTransform(ctx, decl.fill);\n }\n else {\n ctx.fillStyle = fill;\n }\n }\n },\n\n _setClippingProperties: function(ctx) {\n ctx.globalAlpha = 1;\n ctx.strokeStyle = 'transparent';\n ctx.fillStyle = '#000000';\n },\n\n /**\n * @private\n * Sets line dash\n * @param {CanvasRenderingContext2D} ctx Context to set the dash line on\n * @param {Array} dashArray array representing dashes\n */\n _setLineDash: function(ctx, dashArray) {\n if (!dashArray || dashArray.length === 0) {\n return;\n }\n // Spec requires the concatenation of two copies the dash list when the number of elements is odd\n if (1 & dashArray.length) {\n dashArray.push.apply(dashArray, dashArray);\n }\n ctx.setLineDash(dashArray);\n },\n\n /**\n * Renders controls and borders for the object\n * the context here is not transformed\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {Object} [styleOverride] properties to override the object style\n */\n _renderControls: function(ctx, styleOverride) {\n var vpt = this.getViewportTransform(),\n matrix = this.calcTransformMatrix(),\n options, drawBorders, drawControls;\n styleOverride = styleOverride || { };\n drawBorders = typeof styleOverride.hasBorders !== 'undefined' ? styleOverride.hasBorders : this.hasBorders;\n drawControls = typeof styleOverride.hasControls !== 'undefined' ? styleOverride.hasControls : this.hasControls;\n matrix = fabric.util.multiplyTransformMatrices(vpt, matrix);\n options = fabric.util.qrDecompose(matrix);\n ctx.save();\n ctx.translate(options.translateX, options.translateY);\n ctx.lineWidth = 1 * this.borderScaleFactor;\n if (!this.group) {\n ctx.globalAlpha = this.isMoving ? this.borderOpacityWhenMoving : 1;\n }\n if (this.flipX) {\n options.angle -= 180;\n }\n ctx.rotate(degreesToRadians(this.group ? options.angle : this.angle));\n if (styleOverride.forActiveSelection || this.group) {\n drawBorders && this.drawBordersInGroup(ctx, options, styleOverride);\n }\n else {\n drawBorders && this.drawBorders(ctx, styleOverride);\n }\n drawControls && this.drawControls(ctx, styleOverride);\n ctx.restore();\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _setShadow: function(ctx) {\n if (!this.shadow) {\n return;\n }\n\n var shadow = this.shadow, canvas = this.canvas, scaling,\n multX = (canvas && canvas.viewportTransform[0]) || 1,\n multY = (canvas && canvas.viewportTransform[3]) || 1;\n if (shadow.nonScaling) {\n scaling = { scaleX: 1, scaleY: 1 };\n }\n else {\n scaling = this.getObjectScaling();\n }\n if (canvas && canvas._isRetinaScaling()) {\n multX *= fabric.devicePixelRatio;\n multY *= fabric.devicePixelRatio;\n }\n ctx.shadowColor = shadow.color;\n ctx.shadowBlur = shadow.blur * fabric.browserShadowBlurConstant *\n (multX + multY) * (scaling.scaleX + scaling.scaleY) / 4;\n ctx.shadowOffsetX = shadow.offsetX * multX * scaling.scaleX;\n ctx.shadowOffsetY = shadow.offsetY * multY * scaling.scaleY;\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _removeShadow: function(ctx) {\n if (!this.shadow) {\n return;\n }\n\n ctx.shadowColor = '';\n ctx.shadowBlur = ctx.shadowOffsetX = ctx.shadowOffsetY = 0;\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {Object} filler fabric.Pattern or fabric.Gradient\n * @return {Object} offset.offsetX offset for text rendering\n * @return {Object} offset.offsetY offset for text rendering\n */\n _applyPatternGradientTransform: function(ctx, filler) {\n if (!filler || !filler.toLive) {\n return { offsetX: 0, offsetY: 0 };\n }\n var t = filler.gradientTransform || filler.patternTransform;\n var offsetX = -this.width / 2 + filler.offsetX || 0,\n offsetY = -this.height / 2 + filler.offsetY || 0;\n\n if (filler.gradientUnits === 'percentage') {\n ctx.transform(this.width, 0, 0, this.height, offsetX, offsetY);\n }\n else {\n ctx.transform(1, 0, 0, 1, offsetX, offsetY);\n }\n if (t) {\n ctx.transform(t[0], t[1], t[2], t[3], t[4], t[5]);\n }\n return { offsetX: offsetX, offsetY: offsetY };\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderPaintInOrder: function(ctx) {\n if (this.paintFirst === 'stroke') {\n this._renderStroke(ctx);\n this._renderFill(ctx);\n }\n else {\n this._renderFill(ctx);\n this._renderStroke(ctx);\n }\n },\n\n /**\n * @private\n * function that actually render something on the context.\n * empty here to allow Obects to work on tests to benchmark fabric functionalites\n * not related to rendering\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _render: function(/* ctx */) {\n\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderFill: function(ctx) {\n if (!this.fill) {\n return;\n }\n\n ctx.save();\n this._setFillStyles(ctx, this);\n if (this.fillRule === 'evenodd') {\n ctx.fill('evenodd');\n }\n else {\n ctx.fill();\n }\n ctx.restore();\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderStroke: function(ctx) {\n if (!this.stroke || this.strokeWidth === 0) {\n return;\n }\n\n if (this.shadow && !this.shadow.affectStroke) {\n this._removeShadow(ctx);\n }\n\n ctx.save();\n if (this.strokeUniform && this.group) {\n var scaling = this.getObjectScaling();\n ctx.scale(1 / scaling.scaleX, 1 / scaling.scaleY);\n }\n else if (this.strokeUniform) {\n ctx.scale(1 / this.scaleX, 1 / this.scaleY);\n }\n this._setLineDash(ctx, this.strokeDashArray);\n this._setStrokeStyles(ctx, this);\n ctx.stroke();\n ctx.restore();\n },\n\n /**\n * This function try to patch the missing gradientTransform on canvas gradients.\n * transforming a context to transform the gradient, is going to transform the stroke too.\n * we want to transform the gradient but not the stroke operation, so we create\n * a transformed gradient on a pattern and then we use the pattern instead of the gradient.\n * this method has drwabacks: is slow, is in low resolution, needs a patch for when the size\n * is limited.\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {fabric.Gradient} filler a fabric gradient instance\n */\n _applyPatternForTransformedGradient: function(ctx, filler) {\n var dims = this._limitCacheSize(this._getCacheCanvasDimensions()),\n pCanvas = fabric.util.createCanvasElement(), pCtx, retinaScaling = this.canvas.getRetinaScaling(),\n width = dims.x / this.scaleX / retinaScaling, height = dims.y / this.scaleY / retinaScaling;\n pCanvas.width = width;\n pCanvas.height = height;\n pCtx = pCanvas.getContext('2d');\n pCtx.beginPath(); pCtx.moveTo(0, 0); pCtx.lineTo(width, 0); pCtx.lineTo(width, height);\n pCtx.lineTo(0, height); pCtx.closePath();\n pCtx.translate(width / 2, height / 2);\n pCtx.scale(\n dims.zoomX / this.scaleX / retinaScaling,\n dims.zoomY / this.scaleY / retinaScaling\n );\n this._applyPatternGradientTransform(pCtx, filler);\n pCtx.fillStyle = filler.toLive(ctx);\n pCtx.fill();\n ctx.translate(-this.width / 2 - this.strokeWidth / 2, -this.height / 2 - this.strokeWidth / 2);\n ctx.scale(\n retinaScaling * this.scaleX / dims.zoomX,\n retinaScaling * this.scaleY / dims.zoomY\n );\n ctx.strokeStyle = pCtx.createPattern(pCanvas, 'no-repeat');\n },\n\n /**\n * This function is an helper for svg import. it returns the center of the object in the svg\n * untransformed coordinates\n * @private\n * @return {Object} center point from element coordinates\n */\n _findCenterFromElement: function() {\n return { x: this.left + this.width / 2, y: this.top + this.height / 2 };\n },\n\n /**\n * This function is an helper for svg import. it decompose the transformMatrix\n * and assign properties to object.\n * untransformed coordinates\n * @private\n * @chainable\n */\n _assignTransformMatrixProps: function() {\n if (this.transformMatrix) {\n var options = fabric.util.qrDecompose(this.transformMatrix);\n this.flipX = false;\n this.flipY = false;\n this.set('scaleX', options.scaleX);\n this.set('scaleY', options.scaleY);\n this.angle = options.angle;\n this.skewX = options.skewX;\n this.skewY = 0;\n }\n },\n\n /**\n * This function is an helper for svg import. it removes the transform matrix\n * and set to object properties that fabricjs can handle\n * @private\n * @param {Object} preserveAspectRatioOptions\n * @return {thisArg}\n */\n _removeTransformMatrix: function(preserveAspectRatioOptions) {\n var center = this._findCenterFromElement();\n if (this.transformMatrix) {\n this._assignTransformMatrixProps();\n center = fabric.util.transformPoint(center, this.transformMatrix);\n }\n this.transformMatrix = null;\n if (preserveAspectRatioOptions) {\n this.scaleX *= preserveAspectRatioOptions.scaleX;\n this.scaleY *= preserveAspectRatioOptions.scaleY;\n this.cropX = preserveAspectRatioOptions.cropX;\n this.cropY = preserveAspectRatioOptions.cropY;\n center.x += preserveAspectRatioOptions.offsetLeft;\n center.y += preserveAspectRatioOptions.offsetTop;\n this.width = preserveAspectRatioOptions.width;\n this.height = preserveAspectRatioOptions.height;\n }\n this.setPositionByOrigin(center, 'center', 'center');\n },\n\n /**\n * Clones an instance, using a callback method will work for every object.\n * @param {Function} callback Callback is invoked with a clone as a first argument\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n */\n clone: function(callback, propertiesToInclude) {\n var objectForm = this.toObject(propertiesToInclude);\n if (this.constructor.fromObject) {\n this.constructor.fromObject(objectForm, callback);\n }\n else {\n fabric.Object._fromObject('Object', objectForm, callback);\n }\n },\n\n /**\n * Creates an instance of fabric.Image out of an object\n * makes use of toCanvasElement.\n * Once this method was based on toDataUrl and loadImage, so it also had a quality\n * and format option. toCanvasElement is faster and produce no loss of quality.\n * If you need to get a real Jpeg or Png from an object, using toDataURL is the right way to do it.\n * toCanvasElement and then toBlob from the obtained canvas is also a good option.\n * This method is sync now, but still support the callback because we did not want to break.\n * When fabricJS 5.0 will be planned, this will probably be changed to not have a callback.\n * @param {Function} callback callback, invoked with an instance as a first argument\n * @param {Object} [options] for clone as image, passed to toDataURL\n * @param {Number} [options.multiplier=1] Multiplier to scale by\n * @param {Number} [options.left] Cropping left offset. Introduced in v1.2.14\n * @param {Number} [options.top] Cropping top offset. Introduced in v1.2.14\n * @param {Number} [options.width] Cropping width. Introduced in v1.2.14\n * @param {Number} [options.height] Cropping height. Introduced in v1.2.14\n * @param {Boolean} [options.enableRetinaScaling] Enable retina scaling for clone image. Introduce in 1.6.4\n * @param {Boolean} [options.withoutTransform] Remove current object transform ( no scale , no angle, no flip, no skew ). Introduced in 2.3.4\n * @param {Boolean} [options.withoutShadow] Remove current object shadow. Introduced in 2.4.2\n * @return {fabric.Object} thisArg\n */\n cloneAsImage: function(callback, options) {\n var canvasEl = this.toCanvasElement(options);\n if (callback) {\n callback(new fabric.Image(canvasEl));\n }\n return this;\n },\n\n /**\n * Converts an object into a HTMLCanvas element\n * @param {Object} options Options object\n * @param {Number} [options.multiplier=1] Multiplier to scale by\n * @param {Number} [options.left] Cropping left offset. Introduced in v1.2.14\n * @param {Number} [options.top] Cropping top offset. Introduced in v1.2.14\n * @param {Number} [options.width] Cropping width. Introduced in v1.2.14\n * @param {Number} [options.height] Cropping height. Introduced in v1.2.14\n * @param {Boolean} [options.enableRetinaScaling] Enable retina scaling for clone image. Introduce in 1.6.4\n * @param {Boolean} [options.withoutTransform] Remove current object transform ( no scale , no angle, no flip, no skew ). Introduced in 2.3.4\n * @param {Boolean} [options.withoutShadow] Remove current object shadow. Introduced in 2.4.2\n * @return {HTMLCanvasElement} Returns DOM element with the fabric.Object\n */\n toCanvasElement: function(options) {\n options || (options = { });\n\n var utils = fabric.util, origParams = utils.saveObjectTransform(this),\n originalGroup = this.group,\n originalShadow = this.shadow, abs = Math.abs,\n multiplier = (options.multiplier || 1) * (options.enableRetinaScaling ? fabric.devicePixelRatio : 1);\n delete this.group;\n if (options.withoutTransform) {\n utils.resetObjectTransform(this);\n }\n if (options.withoutShadow) {\n this.shadow = null;\n }\n\n var el = fabric.util.createCanvasElement(),\n // skip canvas zoom and calculate with setCoords now.\n boundingRect = this.getBoundingRect(true, true),\n shadow = this.shadow, scaling,\n shadowOffset = { x: 0, y: 0 }, shadowBlur,\n width, height;\n\n if (shadow) {\n shadowBlur = shadow.blur;\n if (shadow.nonScaling) {\n scaling = { scaleX: 1, scaleY: 1 };\n }\n else {\n scaling = this.getObjectScaling();\n }\n // consider non scaling shadow.\n shadowOffset.x = 2 * Math.round(abs(shadow.offsetX) + shadowBlur) * (abs(scaling.scaleX));\n shadowOffset.y = 2 * Math.round(abs(shadow.offsetY) + shadowBlur) * (abs(scaling.scaleY));\n }\n width = boundingRect.width + shadowOffset.x;\n height = boundingRect.height + shadowOffset.y;\n // if the current width/height is not an integer\n // we need to make it so.\n el.width = Math.ceil(width);\n el.height = Math.ceil(height);\n var canvas = new fabric.StaticCanvas(el, {\n enableRetinaScaling: false,\n renderOnAddRemove: false,\n skipOffscreen: false,\n });\n if (options.format === 'jpeg') {\n canvas.backgroundColor = '#fff';\n }\n this.setPositionByOrigin(new fabric.Point(canvas.width / 2, canvas.height / 2), 'center', 'center');\n\n var originalCanvas = this.canvas;\n canvas.add(this);\n var canvasEl = canvas.toCanvasElement(multiplier || 1, options);\n this.shadow = originalShadow;\n this.set('canvas', originalCanvas);\n if (originalGroup) {\n this.group = originalGroup;\n }\n this.set(origParams).setCoords();\n // canvas.dispose will call image.dispose that will nullify the elements\n // since this canvas is a simple element for the process, we remove references\n // to objects in this way in order to avoid object trashing.\n canvas._objects = [];\n canvas.dispose();\n canvas = null;\n\n return canvasEl;\n },\n\n /**\n * Converts an object into a data-url-like string\n * @param {Object} options Options object\n * @param {String} [options.format=png] The format of the output image. Either \"jpeg\" or \"png\"\n * @param {Number} [options.quality=1] Quality level (0..1). Only used for jpeg.\n * @param {Number} [options.multiplier=1] Multiplier to scale by\n * @param {Number} [options.left] Cropping left offset. Introduced in v1.2.14\n * @param {Number} [options.top] Cropping top offset. Introduced in v1.2.14\n * @param {Number} [options.width] Cropping width. Introduced in v1.2.14\n * @param {Number} [options.height] Cropping height. Introduced in v1.2.14\n * @param {Boolean} [options.enableRetinaScaling] Enable retina scaling for clone image. Introduce in 1.6.4\n * @param {Boolean} [options.withoutTransform] Remove current object transform ( no scale , no angle, no flip, no skew ). Introduced in 2.3.4\n * @param {Boolean} [options.withoutShadow] Remove current object shadow. Introduced in 2.4.2\n * @return {String} Returns a data: URL containing a representation of the object in the format specified by options.format\n */\n toDataURL: function(options) {\n options || (options = { });\n return fabric.util.toDataURL(this.toCanvasElement(options), options.format || 'png', options.quality || 1);\n },\n\n /**\n * Returns true if specified type is identical to the type of an instance\n * @param {String} type Type to check against\n * @return {Boolean}\n */\n isType: function(type) {\n return arguments.length > 1 ? Array.from(arguments).includes(this.type) : this.type === type;\n },\n\n /**\n * Returns complexity of an instance\n * @return {Number} complexity of this instance (is 1 unless subclassed)\n */\n complexity: function() {\n return 1;\n },\n\n /**\n * Returns a JSON representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} JSON\n */\n toJSON: function(propertiesToInclude) {\n // delegate, not alias\n return this.toObject(propertiesToInclude);\n },\n\n /**\n * Sets \"angle\" of an instance with centered rotation\n * @param {Number} angle Angle value (in degrees)\n * @return {fabric.Object} thisArg\n * @chainable\n */\n rotate: function(angle) {\n var shouldCenterOrigin = (this.originX !== 'center' || this.originY !== 'center') && this.centeredRotation;\n\n if (shouldCenterOrigin) {\n this._setOriginToCenter();\n }\n\n this.set('angle', angle);\n\n if (shouldCenterOrigin) {\n this._resetOrigin();\n }\n\n return this;\n },\n\n /**\n * Centers object horizontally on canvas to which it was added last.\n * You might need to call `setCoords` on an object after centering, to update controls area.\n * @return {fabric.Object} thisArg\n * @chainable\n */\n centerH: function () {\n this.canvas && this.canvas.centerObjectH(this);\n return this;\n },\n\n /**\n * Centers object horizontally on current viewport of canvas to which it was added last.\n * You might need to call `setCoords` on an object after centering, to update controls area.\n * @return {fabric.Object} thisArg\n * @chainable\n */\n viewportCenterH: function () {\n this.canvas && this.canvas.viewportCenterObjectH(this);\n return this;\n },\n\n /**\n * Centers object vertically on canvas to which it was added last.\n * You might need to call `setCoords` on an object after centering, to update controls area.\n * @return {fabric.Object} thisArg\n * @chainable\n */\n centerV: function () {\n this.canvas && this.canvas.centerObjectV(this);\n return this;\n },\n\n /**\n * Centers object vertically on current viewport of canvas to which it was added last.\n * You might need to call `setCoords` on an object after centering, to update controls area.\n * @return {fabric.Object} thisArg\n * @chainable\n */\n viewportCenterV: function () {\n this.canvas && this.canvas.viewportCenterObjectV(this);\n return this;\n },\n\n /**\n * Centers object vertically and horizontally on canvas to which is was added last\n * You might need to call `setCoords` on an object after centering, to update controls area.\n * @return {fabric.Object} thisArg\n * @chainable\n */\n center: function () {\n this.canvas && this.canvas.centerObject(this);\n return this;\n },\n\n /**\n * Centers object on current viewport of canvas to which it was added last.\n * You might need to call `setCoords` on an object after centering, to update controls area.\n * @return {fabric.Object} thisArg\n * @chainable\n */\n viewportCenter: function () {\n this.canvas && this.canvas.viewportCenterObject(this);\n return this;\n },\n\n /**\n * Returns coordinates of a pointer relative to an object\n * @param {Event} e Event to operate upon\n * @param {Object} [pointer] Pointer to operate upon (instead of event)\n * @return {Object} Coordinates of a pointer (x, y)\n */\n getLocalPointer: function(e, pointer) {\n pointer = pointer || this.canvas.getPointer(e);\n var pClicked = new fabric.Point(pointer.x, pointer.y),\n objectLeftTop = this._getLeftTopCoords();\n if (this.angle) {\n pClicked = fabric.util.rotatePoint(\n pClicked, objectLeftTop, degreesToRadians(-this.angle));\n }\n return {\n x: pClicked.x - objectLeftTop.x,\n y: pClicked.y - objectLeftTop.y\n };\n },\n\n /**\n * Sets canvas globalCompositeOperation for specific object\n * custom composition operation for the particular object can be specified using globalCompositeOperation property\n * @param {CanvasRenderingContext2D} ctx Rendering canvas context\n */\n _setupCompositeOperation: function (ctx) {\n if (this.globalCompositeOperation) {\n ctx.globalCompositeOperation = this.globalCompositeOperation;\n }\n },\n\n /**\n * cancel instance's running animations\n * override if necessary to dispose artifacts such as `clipPath`\n */\n dispose: function () {\n if (fabric.runningAnimations) {\n fabric.runningAnimations.cancelByTarget(this);\n }\n }\n });\n\n fabric.util.createAccessors && fabric.util.createAccessors(fabric.Object);\n\n extend(fabric.Object.prototype, fabric.Observable);\n\n /**\n * Defines the number of fraction digits to use when serializing object values.\n * You can use it to increase/decrease precision of such values like left, top, scaleX, scaleY, etc.\n * @static\n * @memberOf fabric.Object\n * @constant\n * @type Number\n */\n fabric.Object.NUM_FRACTION_DIGITS = 2;\n\n /**\n * Defines which properties should be enlivened from the object passed to {@link fabric.Object._fromObject}\n * @static\n * @memberOf fabric.Object\n * @constant\n * @type string[]\n */\n fabric.Object.ENLIVEN_PROPS = ['clipPath'];\n\n fabric.Object._fromObject = function(className, object, callback, extraParam) {\n var klass = fabric[className];\n object = clone(object, true);\n fabric.util.enlivenPatterns([object.fill, object.stroke], function(patterns) {\n if (typeof patterns[0] !== 'undefined') {\n object.fill = patterns[0];\n }\n if (typeof patterns[1] !== 'undefined') {\n object.stroke = patterns[1];\n }\n fabric.util.enlivenObjectEnlivables(object, object, function () {\n var instance = extraParam ? new klass(object[extraParam], object) : new klass(object);\n callback && callback(instance);\n });\n });\n };\n\n /**\n * Unique id used internally when creating SVG elements\n * @static\n * @memberOf fabric.Object\n * @type Number\n */\n fabric.Object.__uid = 0;\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function() {\n\n var degreesToRadians = fabric.util.degreesToRadians,\n originXOffset = {\n left: -0.5,\n center: 0,\n right: 0.5\n },\n originYOffset = {\n top: -0.5,\n center: 0,\n bottom: 0.5\n };\n\n fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prototype */ {\n\n /**\n * Translates the coordinates from a set of origin to another (based on the object's dimensions)\n * @param {fabric.Point} point The point which corresponds to the originX and originY params\n * @param {String} fromOriginX Horizontal origin: 'left', 'center' or 'right'\n * @param {String} fromOriginY Vertical origin: 'top', 'center' or 'bottom'\n * @param {String} toOriginX Horizontal origin: 'left', 'center' or 'right'\n * @param {String} toOriginY Vertical origin: 'top', 'center' or 'bottom'\n * @return {fabric.Point}\n */\n translateToGivenOrigin: function(point, fromOriginX, fromOriginY, toOriginX, toOriginY) {\n var x = point.x,\n y = point.y,\n offsetX, offsetY, dim;\n\n if (typeof fromOriginX === 'string') {\n fromOriginX = originXOffset[fromOriginX];\n }\n else {\n fromOriginX -= 0.5;\n }\n\n if (typeof toOriginX === 'string') {\n toOriginX = originXOffset[toOriginX];\n }\n else {\n toOriginX -= 0.5;\n }\n\n offsetX = toOriginX - fromOriginX;\n\n if (typeof fromOriginY === 'string') {\n fromOriginY = originYOffset[fromOriginY];\n }\n else {\n fromOriginY -= 0.5;\n }\n\n if (typeof toOriginY === 'string') {\n toOriginY = originYOffset[toOriginY];\n }\n else {\n toOriginY -= 0.5;\n }\n\n offsetY = toOriginY - fromOriginY;\n\n if (offsetX || offsetY) {\n dim = this._getTransformedDimensions();\n x = point.x + offsetX * dim.x;\n y = point.y + offsetY * dim.y;\n }\n\n return new fabric.Point(x, y);\n },\n\n /**\n * Translates the coordinates from origin to center coordinates (based on the object's dimensions)\n * @param {fabric.Point} point The point which corresponds to the originX and originY params\n * @param {String} originX Horizontal origin: 'left', 'center' or 'right'\n * @param {String} originY Vertical origin: 'top', 'center' or 'bottom'\n * @return {fabric.Point}\n */\n translateToCenterPoint: function(point, originX, originY) {\n var p = this.translateToGivenOrigin(point, originX, originY, 'center', 'center');\n if (this.angle) {\n return fabric.util.rotatePoint(p, point, degreesToRadians(this.angle));\n }\n return p;\n },\n\n /**\n * Translates the coordinates from center to origin coordinates (based on the object's dimensions)\n * @param {fabric.Point} center The point which corresponds to center of the object\n * @param {String} originX Horizontal origin: 'left', 'center' or 'right'\n * @param {String} originY Vertical origin: 'top', 'center' or 'bottom'\n * @return {fabric.Point}\n */\n translateToOriginPoint: function(center, originX, originY) {\n var p = this.translateToGivenOrigin(center, 'center', 'center', originX, originY);\n if (this.angle) {\n return fabric.util.rotatePoint(p, center, degreesToRadians(this.angle));\n }\n return p;\n },\n\n /**\n * Returns the real center coordinates of the object\n * @return {fabric.Point}\n */\n getCenterPoint: function() {\n var leftTop = new fabric.Point(this.left, this.top);\n return this.translateToCenterPoint(leftTop, this.originX, this.originY);\n },\n\n /**\n * Returns the coordinates of the object based on center coordinates\n * @param {fabric.Point} point The point which corresponds to the originX and originY params\n * @return {fabric.Point}\n */\n // getOriginPoint: function(center) {\n // return this.translateToOriginPoint(center, this.originX, this.originY);\n // },\n\n /**\n * Returns the coordinates of the object as if it has a different origin\n * @param {String} originX Horizontal origin: 'left', 'center' or 'right'\n * @param {String} originY Vertical origin: 'top', 'center' or 'bottom'\n * @return {fabric.Point}\n */\n getPointByOrigin: function(originX, originY) {\n var center = this.getCenterPoint();\n return this.translateToOriginPoint(center, originX, originY);\n },\n\n /**\n * Returns the point in local coordinates\n * @param {fabric.Point} point The point relative to the global coordinate system\n * @param {String} originX Horizontal origin: 'left', 'center' or 'right'\n * @param {String} originY Vertical origin: 'top', 'center' or 'bottom'\n * @return {fabric.Point}\n */\n toLocalPoint: function(point, originX, originY) {\n var center = this.getCenterPoint(),\n p, p2;\n\n if (typeof originX !== 'undefined' && typeof originY !== 'undefined' ) {\n p = this.translateToGivenOrigin(center, 'center', 'center', originX, originY);\n }\n else {\n p = new fabric.Point(this.left, this.top);\n }\n\n p2 = new fabric.Point(point.x, point.y);\n if (this.angle) {\n p2 = fabric.util.rotatePoint(p2, center, -degreesToRadians(this.angle));\n }\n return p2.subtractEquals(p);\n },\n\n /**\n * Returns the point in global coordinates\n * @param {fabric.Point} The point relative to the local coordinate system\n * @return {fabric.Point}\n */\n // toGlobalPoint: function(point) {\n // return fabric.util.rotatePoint(point, this.getCenterPoint(), degreesToRadians(this.angle)).addEquals(new fabric.Point(this.left, this.top));\n // },\n\n /**\n * Sets the position of the object taking into consideration the object's origin\n * @param {fabric.Point} pos The new position of the object\n * @param {String} originX Horizontal origin: 'left', 'center' or 'right'\n * @param {String} originY Vertical origin: 'top', 'center' or 'bottom'\n * @return {void}\n */\n setPositionByOrigin: function(pos, originX, originY) {\n var center = this.translateToCenterPoint(pos, originX, originY),\n position = this.translateToOriginPoint(center, this.originX, this.originY);\n this.set('left', position.x);\n this.set('top', position.y);\n },\n\n /**\n * @param {String} to One of 'left', 'center', 'right'\n */\n adjustPosition: function(to) {\n var angle = degreesToRadians(this.angle),\n hypotFull = this.getScaledWidth(),\n xFull = fabric.util.cos(angle) * hypotFull,\n yFull = fabric.util.sin(angle) * hypotFull,\n offsetFrom, offsetTo;\n\n //TODO: this function does not consider mixed situation like top, center.\n if (typeof this.originX === 'string') {\n offsetFrom = originXOffset[this.originX];\n }\n else {\n offsetFrom = this.originX - 0.5;\n }\n if (typeof to === 'string') {\n offsetTo = originXOffset[to];\n }\n else {\n offsetTo = to - 0.5;\n }\n this.left += xFull * (offsetTo - offsetFrom);\n this.top += yFull * (offsetTo - offsetFrom);\n this.setCoords();\n this.originX = to;\n },\n\n /**\n * Sets the origin/position of the object to it's center point\n * @private\n * @return {void}\n */\n _setOriginToCenter: function() {\n this._originalOriginX = this.originX;\n this._originalOriginY = this.originY;\n\n var center = this.getCenterPoint();\n\n this.originX = 'center';\n this.originY = 'center';\n\n this.left = center.x;\n this.top = center.y;\n },\n\n /**\n * Resets the origin/position of the object to it's original origin\n * @private\n * @return {void}\n */\n _resetOrigin: function() {\n var originPoint = this.translateToOriginPoint(\n this.getCenterPoint(),\n this._originalOriginX,\n this._originalOriginY);\n\n this.originX = this._originalOriginX;\n this.originY = this._originalOriginY;\n\n this.left = originPoint.x;\n this.top = originPoint.y;\n\n this._originalOriginX = null;\n this._originalOriginY = null;\n },\n\n /**\n * @private\n */\n _getLeftTopCoords: function() {\n return this.translateToOriginPoint(this.getCenterPoint(), 'left', 'top');\n },\n });\n\n})();\n\n\n(function() {\n\n function arrayFromCoords(coords) {\n return [\n new fabric.Point(coords.tl.x, coords.tl.y),\n new fabric.Point(coords.tr.x, coords.tr.y),\n new fabric.Point(coords.br.x, coords.br.y),\n new fabric.Point(coords.bl.x, coords.bl.y)\n ];\n }\n\n var util = fabric.util,\n degreesToRadians = util.degreesToRadians,\n multiplyMatrices = util.multiplyTransformMatrices,\n transformPoint = util.transformPoint;\n\n util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prototype */ {\n\n /**\n * Describe object's corner position in canvas element coordinates.\n * properties are depending on control keys and padding the main controls.\n * each property is an object with x, y and corner.\n * The `corner` property contains in a similar manner the 4 points of the\n * interactive area of the corner.\n * The coordinates depends from the controls positionHandler and are used\n * to draw and locate controls\n * @memberOf fabric.Object.prototype\n */\n oCoords: null,\n\n /**\n * Describe object's corner position in canvas object absolute coordinates\n * properties are tl,tr,bl,br and describe the four main corner.\n * each property is an object with x, y, instance of Fabric.Point.\n * The coordinates depends from this properties: width, height, scaleX, scaleY\n * skewX, skewY, angle, strokeWidth, top, left.\n * Those coordinates are useful to understand where an object is. They get updated\n * with oCoords but they do not need to be updated when zoom or panning change.\n * The coordinates get updated with @method setCoords.\n * You can calculate them without updating with @method calcACoords();\n * @memberOf fabric.Object.prototype\n */\n aCoords: null,\n\n /**\n * Describe object's corner position in canvas element coordinates.\n * includes padding. Used of object detection.\n * set and refreshed with setCoords.\n * @memberOf fabric.Object.prototype\n */\n lineCoords: null,\n\n /**\n * storage for object transform matrix\n */\n ownMatrixCache: null,\n\n /**\n * storage for object full transform matrix\n */\n matrixCache: null,\n\n /**\n * custom controls interface\n * controls are added by default_controls.js\n */\n controls: { },\n\n /**\n * return correct set of coordinates for intersection\n * this will return either aCoords or lineCoords.\n * @param {Boolean} absolute will return aCoords if true or lineCoords\n * @return {Object} {tl, tr, br, bl} points\n */\n _getCoords: function(absolute, calculate) {\n if (calculate) {\n return (absolute ? this.calcACoords() : this.calcLineCoords());\n }\n if (!this.aCoords || !this.lineCoords) {\n this.setCoords(true);\n }\n return (absolute ? this.aCoords : this.lineCoords);\n },\n\n /**\n * return correct set of coordinates for intersection\n * this will return either aCoords or lineCoords.\n * The coords are returned in an array.\n * @return {Array} [tl, tr, br, bl] of points\n */\n getCoords: function(absolute, calculate) {\n return arrayFromCoords(this._getCoords(absolute, calculate));\n },\n\n /**\n * Checks if object intersects with an area formed by 2 points\n * @param {Object} pointTL top-left point of area\n * @param {Object} pointBR bottom-right point of area\n * @param {Boolean} [absolute] use coordinates without viewportTransform\n * @param {Boolean} [calculate] use coordinates of current position instead of .oCoords\n * @return {Boolean} true if object intersects with an area formed by 2 points\n */\n intersectsWithRect: function(pointTL, pointBR, absolute, calculate) {\n var coords = this.getCoords(absolute, calculate),\n intersection = fabric.Intersection.intersectPolygonRectangle(\n coords,\n pointTL,\n pointBR\n );\n return intersection.status === 'Intersection';\n },\n\n /**\n * Checks if object intersects with another object\n * @param {Object} other Object to test\n * @param {Boolean} [absolute] use coordinates without viewportTransform\n * @param {Boolean} [calculate] use coordinates of current position instead of .oCoords\n * @return {Boolean} true if object intersects with another object\n */\n intersectsWithObject: function(other, absolute, calculate) {\n var intersection = fabric.Intersection.intersectPolygonPolygon(\n this.getCoords(absolute, calculate),\n other.getCoords(absolute, calculate)\n );\n\n return intersection.status === 'Intersection'\n || other.isContainedWithinObject(this, absolute, calculate)\n || this.isContainedWithinObject(other, absolute, calculate);\n },\n\n /**\n * Checks if object is fully contained within area of another object\n * @param {Object} other Object to test\n * @param {Boolean} [absolute] use coordinates without viewportTransform\n * @param {Boolean} [calculate] use coordinates of current position instead of .oCoords\n * @return {Boolean} true if object is fully contained within area of another object\n */\n isContainedWithinObject: function(other, absolute, calculate) {\n var points = this.getCoords(absolute, calculate),\n otherCoords = absolute ? other.aCoords : other.lineCoords,\n i = 0, lines = other._getImageLines(otherCoords);\n for (; i < 4; i++) {\n if (!other.containsPoint(points[i], lines)) {\n return false;\n }\n }\n return true;\n },\n\n /**\n * Checks if object is fully contained within area formed by 2 points\n * @param {Object} pointTL top-left point of area\n * @param {Object} pointBR bottom-right point of area\n * @param {Boolean} [absolute] use coordinates without viewportTransform\n * @param {Boolean} [calculate] use coordinates of current position instead of .oCoords\n * @return {Boolean} true if object is fully contained within area formed by 2 points\n */\n isContainedWithinRect: function(pointTL, pointBR, absolute, calculate) {\n var boundingRect = this.getBoundingRect(absolute, calculate);\n\n return (\n boundingRect.left >= pointTL.x &&\n boundingRect.left + boundingRect.width <= pointBR.x &&\n boundingRect.top >= pointTL.y &&\n boundingRect.top + boundingRect.height <= pointBR.y\n );\n },\n\n /**\n * Checks if point is inside the object\n * @param {fabric.Point} point Point to check against\n * @param {Object} [lines] object returned from @method _getImageLines\n * @param {Boolean} [absolute] use coordinates without viewportTransform\n * @param {Boolean} [calculate] use coordinates of current position instead of .oCoords\n * @return {Boolean} true if point is inside the object\n */\n containsPoint: function(point, lines, absolute, calculate) {\n var coords = this._getCoords(absolute, calculate),\n lines = lines || this._getImageLines(coords),\n xPoints = this._findCrossPoints(point, lines);\n // if xPoints is odd then point is inside the object\n return (xPoints !== 0 && xPoints % 2 === 1);\n },\n\n /**\n * Checks if object is contained within the canvas with current viewportTransform\n * the check is done stopping at first point that appears on screen\n * @param {Boolean} [calculate] use coordinates of current position instead of .aCoords\n * @return {Boolean} true if object is fully or partially contained within canvas\n */\n isOnScreen: function(calculate) {\n if (!this.canvas) {\n return false;\n }\n var pointTL = this.canvas.vptCoords.tl, pointBR = this.canvas.vptCoords.br;\n var points = this.getCoords(true, calculate);\n // if some point is on screen, the object is on screen.\n if (points.some(function(point) {\n return point.x <= pointBR.x && point.x >= pointTL.x &&\n point.y <= pointBR.y && point.y >= pointTL.y;\n })) {\n return true;\n }\n // no points on screen, check intersection with absolute coordinates\n if (this.intersectsWithRect(pointTL, pointBR, true, calculate)) {\n return true;\n }\n return this._containsCenterOfCanvas(pointTL, pointBR, calculate);\n },\n\n /**\n * Checks if the object contains the midpoint between canvas extremities\n * Does not make sense outside the context of isOnScreen and isPartiallyOnScreen\n * @private\n * @param {Fabric.Point} pointTL Top Left point\n * @param {Fabric.Point} pointBR Top Right point\n * @param {Boolean} calculate use coordinates of current position instead of .oCoords\n * @return {Boolean} true if the object contains the point\n */\n _containsCenterOfCanvas: function(pointTL, pointBR, calculate) {\n // worst case scenario the object is so big that contains the screen\n var centerPoint = { x: (pointTL.x + pointBR.x) / 2, y: (pointTL.y + pointBR.y) / 2 };\n if (this.containsPoint(centerPoint, null, true, calculate)) {\n return true;\n }\n return false;\n },\n\n /**\n * Checks if object is partially contained within the canvas with current viewportTransform\n * @param {Boolean} [calculate] use coordinates of current position instead of .oCoords\n * @return {Boolean} true if object is partially contained within canvas\n */\n isPartiallyOnScreen: function(calculate) {\n if (!this.canvas) {\n return false;\n }\n var pointTL = this.canvas.vptCoords.tl, pointBR = this.canvas.vptCoords.br;\n if (this.intersectsWithRect(pointTL, pointBR, true, calculate)) {\n return true;\n }\n var allPointsAreOutside = this.getCoords(true, calculate).every(function(point) {\n return (point.x >= pointBR.x || point.x <= pointTL.x) &&\n (point.y >= pointBR.y || point.y <= pointTL.y);\n });\n return allPointsAreOutside && this._containsCenterOfCanvas(pointTL, pointBR, calculate);\n },\n\n /**\n * Method that returns an object with the object edges in it, given the coordinates of the corners\n * @private\n * @param {Object} oCoords Coordinates of the object corners\n */\n _getImageLines: function(oCoords) {\n\n var lines = {\n topline: {\n o: oCoords.tl,\n d: oCoords.tr\n },\n rightline: {\n o: oCoords.tr,\n d: oCoords.br\n },\n bottomline: {\n o: oCoords.br,\n d: oCoords.bl\n },\n leftline: {\n o: oCoords.bl,\n d: oCoords.tl\n }\n };\n\n // // debugging\n // if (this.canvas.contextTop) {\n // this.canvas.contextTop.fillRect(lines.bottomline.d.x, lines.bottomline.d.y, 2, 2);\n // this.canvas.contextTop.fillRect(lines.bottomline.o.x, lines.bottomline.o.y, 2, 2);\n //\n // this.canvas.contextTop.fillRect(lines.leftline.d.x, lines.leftline.d.y, 2, 2);\n // this.canvas.contextTop.fillRect(lines.leftline.o.x, lines.leftline.o.y, 2, 2);\n //\n // this.canvas.contextTop.fillRect(lines.topline.d.x, lines.topline.d.y, 2, 2);\n // this.canvas.contextTop.fillRect(lines.topline.o.x, lines.topline.o.y, 2, 2);\n //\n // this.canvas.contextTop.fillRect(lines.rightline.d.x, lines.rightline.d.y, 2, 2);\n // this.canvas.contextTop.fillRect(lines.rightline.o.x, lines.rightline.o.y, 2, 2);\n // }\n\n return lines;\n },\n\n /**\n * Helper method to determine how many cross points are between the 4 object edges\n * and the horizontal line determined by a point on canvas\n * @private\n * @param {fabric.Point} point Point to check\n * @param {Object} lines Coordinates of the object being evaluated\n */\n // remove yi, not used but left code here just in case.\n _findCrossPoints: function(point, lines) {\n var b1, b2, a1, a2, xi, // yi,\n xcount = 0,\n iLine;\n\n for (var lineKey in lines) {\n iLine = lines[lineKey];\n // optimisation 1: line below point. no cross\n if ((iLine.o.y < point.y) && (iLine.d.y < point.y)) {\n continue;\n }\n // optimisation 2: line above point. no cross\n if ((iLine.o.y >= point.y) && (iLine.d.y >= point.y)) {\n continue;\n }\n // optimisation 3: vertical line case\n if ((iLine.o.x === iLine.d.x) && (iLine.o.x >= point.x)) {\n xi = iLine.o.x;\n // yi = point.y;\n }\n // calculate the intersection point\n else {\n b1 = 0;\n b2 = (iLine.d.y - iLine.o.y) / (iLine.d.x - iLine.o.x);\n a1 = point.y - b1 * point.x;\n a2 = iLine.o.y - b2 * iLine.o.x;\n\n xi = -(a1 - a2) / (b1 - b2);\n // yi = a1 + b1 * xi;\n }\n // dont count xi < point.x cases\n if (xi >= point.x) {\n xcount += 1;\n }\n // optimisation 4: specific for square images\n if (xcount === 2) {\n break;\n }\n }\n return xcount;\n },\n\n /**\n * Returns coordinates of object's bounding rectangle (left, top, width, height)\n * the box is intended as aligned to axis of canvas.\n * @param {Boolean} [absolute] use coordinates without viewportTransform\n * @param {Boolean} [calculate] use coordinates of current position instead of .oCoords / .aCoords\n * @return {Object} Object with left, top, width, height properties\n */\n getBoundingRect: function(absolute, calculate) {\n var coords = this.getCoords(absolute, calculate);\n return util.makeBoundingBoxFromPoints(coords);\n },\n\n /**\n * Returns width of an object's bounding box counting transformations\n * before 2.0 it was named getWidth();\n * @return {Number} width value\n */\n getScaledWidth: function() {\n return this._getTransformedDimensions().x;\n },\n\n /**\n * Returns height of an object bounding box counting transformations\n * before 2.0 it was named getHeight();\n * @return {Number} height value\n */\n getScaledHeight: function() {\n return this._getTransformedDimensions().y;\n },\n\n /**\n * Makes sure the scale is valid and modifies it if necessary\n * @private\n * @param {Number} value\n * @return {Number}\n */\n _constrainScale: function(value) {\n if (Math.abs(value) < this.minScaleLimit) {\n if (value < 0) {\n return -this.minScaleLimit;\n }\n else {\n return this.minScaleLimit;\n }\n }\n else if (value === 0) {\n return 0.0001;\n }\n return value;\n },\n\n /**\n * Scales an object (equally by x and y)\n * @param {Number} value Scale factor\n * @return {fabric.Object} thisArg\n * @chainable\n */\n scale: function(value) {\n this._set('scaleX', value);\n this._set('scaleY', value);\n return this.setCoords();\n },\n\n /**\n * Scales an object to a given width, with respect to bounding box (scaling by x/y equally)\n * @param {Number} value New width value\n * @param {Boolean} absolute ignore viewport\n * @return {fabric.Object} thisArg\n * @chainable\n */\n scaleToWidth: function(value, absolute) {\n // adjust to bounding rect factor so that rotated shapes would fit as well\n var boundingRectFactor = this.getBoundingRect(absolute).width / this.getScaledWidth();\n return this.scale(value / this.width / boundingRectFactor);\n },\n\n /**\n * Scales an object to a given height, with respect to bounding box (scaling by x/y equally)\n * @param {Number} value New height value\n * @param {Boolean} absolute ignore viewport\n * @return {fabric.Object} thisArg\n * @chainable\n */\n scaleToHeight: function(value, absolute) {\n // adjust to bounding rect factor so that rotated shapes would fit as well\n var boundingRectFactor = this.getBoundingRect(absolute).height / this.getScaledHeight();\n return this.scale(value / this.height / boundingRectFactor);\n },\n\n calcLineCoords: function() {\n var vpt = this.getViewportTransform(),\n padding = this.padding, angle = degreesToRadians(this.angle),\n cos = util.cos(angle), sin = util.sin(angle),\n cosP = cos * padding, sinP = sin * padding, cosPSinP = cosP + sinP,\n cosPMinusSinP = cosP - sinP, aCoords = this.calcACoords();\n\n var lineCoords = {\n tl: transformPoint(aCoords.tl, vpt),\n tr: transformPoint(aCoords.tr, vpt),\n bl: transformPoint(aCoords.bl, vpt),\n br: transformPoint(aCoords.br, vpt),\n };\n\n if (padding) {\n lineCoords.tl.x -= cosPMinusSinP;\n lineCoords.tl.y -= cosPSinP;\n lineCoords.tr.x += cosPSinP;\n lineCoords.tr.y -= cosPMinusSinP;\n lineCoords.bl.x -= cosPSinP;\n lineCoords.bl.y += cosPMinusSinP;\n lineCoords.br.x += cosPMinusSinP;\n lineCoords.br.y += cosPSinP;\n }\n\n return lineCoords;\n },\n\n calcOCoords: function() {\n var rotateMatrix = this._calcRotateMatrix(),\n translateMatrix = this._calcTranslateMatrix(),\n vpt = this.getViewportTransform(),\n startMatrix = multiplyMatrices(vpt, translateMatrix),\n finalMatrix = multiplyMatrices(startMatrix, rotateMatrix),\n finalMatrix = multiplyMatrices(finalMatrix, [1 / vpt[0], 0, 0, 1 / vpt[3], 0, 0]),\n dim = this._calculateCurrentDimensions(),\n coords = {};\n this.forEachControl(function(control, key, fabricObject) {\n coords[key] = control.positionHandler(dim, finalMatrix, fabricObject);\n });\n\n // debug code\n // var canvas = this.canvas;\n // setTimeout(function() {\n // canvas.contextTop.clearRect(0, 0, 700, 700);\n // canvas.contextTop.fillStyle = 'green';\n // Object.keys(coords).forEach(function(key) {\n // var control = coords[key];\n // canvas.contextTop.fillRect(control.x, control.y, 3, 3);\n // });\n // }, 50);\n return coords;\n },\n\n calcACoords: function() {\n var rotateMatrix = this._calcRotateMatrix(),\n translateMatrix = this._calcTranslateMatrix(),\n finalMatrix = multiplyMatrices(translateMatrix, rotateMatrix),\n dim = this._getTransformedDimensions(),\n w = dim.x / 2, h = dim.y / 2;\n return {\n // corners\n tl: transformPoint({ x: -w, y: -h }, finalMatrix),\n tr: transformPoint({ x: w, y: -h }, finalMatrix),\n bl: transformPoint({ x: -w, y: h }, finalMatrix),\n br: transformPoint({ x: w, y: h }, finalMatrix)\n };\n },\n\n /**\n * Sets corner and controls position coordinates based on current angle, width and height, left and top.\n * oCoords are used to find the corners\n * aCoords are used to quickly find an object on the canvas\n * lineCoords are used to quickly find object during pointer events.\n * See {@link https://github.com/fabricjs/fabric.js/wiki/When-to-call-setCoords} and {@link http://fabricjs.com/fabric-gotchas}\n *\n * @param {Boolean} [skipCorners] skip calculation of oCoords.\n * @return {fabric.Object} thisArg\n * @chainable\n */\n setCoords: function(skipCorners) {\n this.aCoords = this.calcACoords();\n // in case we are in a group, for how the inner group target check works,\n // lineCoords are exactly aCoords. Since the vpt gets absorbed by the normalized pointer.\n this.lineCoords = this.group ? this.aCoords : this.calcLineCoords();\n if (skipCorners) {\n return this;\n }\n // set coordinates of the draggable boxes in the corners used to scale/rotate the image\n this.oCoords = this.calcOCoords();\n this._setCornerCoords && this._setCornerCoords();\n return this;\n },\n\n /**\n * calculate rotation matrix of an object\n * @return {Array} rotation matrix for the object\n */\n _calcRotateMatrix: function() {\n return util.calcRotateMatrix(this);\n },\n\n /**\n * calculate the translation matrix for an object transform\n * @return {Array} rotation matrix for the object\n */\n _calcTranslateMatrix: function() {\n var center = this.getCenterPoint();\n return [1, 0, 0, 1, center.x, center.y];\n },\n\n transformMatrixKey: function(skipGroup) {\n var sep = '_', prefix = '';\n if (!skipGroup && this.group) {\n prefix = this.group.transformMatrixKey(skipGroup) + sep;\n };\n return prefix + this.top + sep + this.left + sep + this.scaleX + sep + this.scaleY +\n sep + this.skewX + sep + this.skewY + sep + this.angle + sep + this.originX + sep + this.originY +\n sep + this.width + sep + this.height + sep + this.strokeWidth + this.flipX + this.flipY;\n },\n\n /**\n * calculate transform matrix that represents the current transformations from the\n * object's properties.\n * @param {Boolean} [skipGroup] return transform matrix for object not counting parent transformations\n * There are some situation in which this is useful to avoid the fake rotation.\n * @return {Array} transform matrix for the object\n */\n calcTransformMatrix: function(skipGroup) {\n var matrix = this.calcOwnMatrix();\n if (skipGroup || !this.group) {\n return matrix;\n }\n var key = this.transformMatrixKey(skipGroup), cache = this.matrixCache || (this.matrixCache = {});\n if (cache.key === key) {\n return cache.value;\n }\n if (this.group) {\n matrix = multiplyMatrices(this.group.calcTransformMatrix(false), matrix);\n }\n cache.key = key;\n cache.value = matrix;\n return matrix;\n },\n\n /**\n * calculate transform matrix that represents the current transformations from the\n * object's properties, this matrix does not include the group transformation\n * @return {Array} transform matrix for the object\n */\n calcOwnMatrix: function() {\n var key = this.transformMatrixKey(true), cache = this.ownMatrixCache || (this.ownMatrixCache = {});\n if (cache.key === key) {\n return cache.value;\n }\n var tMatrix = this._calcTranslateMatrix(),\n options = {\n angle: this.angle,\n translateX: tMatrix[4],\n translateY: tMatrix[5],\n scaleX: this.scaleX,\n scaleY: this.scaleY,\n skewX: this.skewX,\n skewY: this.skewY,\n flipX: this.flipX,\n flipY: this.flipY,\n };\n cache.key = key;\n cache.value = util.composeMatrix(options);\n return cache.value;\n },\n\n /*\n * Calculate object dimensions from its properties\n * @private\n * @return {Object} .x width dimension\n * @return {Object} .y height dimension\n */\n _getNonTransformedDimensions: function() {\n var strokeWidth = this.strokeWidth,\n w = this.width + strokeWidth,\n h = this.height + strokeWidth;\n return { x: w, y: h };\n },\n\n /*\n * Calculate object bounding box dimensions from its properties scale, skew.\n * @param {Number} skewX, a value to override current skewX\n * @param {Number} skewY, a value to override current skewY\n * @private\n * @return {Object} .x width dimension\n * @return {Object} .y height dimension\n */\n _getTransformedDimensions: function(skewX, skewY) {\n if (typeof skewX === 'undefined') {\n skewX = this.skewX;\n }\n if (typeof skewY === 'undefined') {\n skewY = this.skewY;\n }\n var dimensions, dimX, dimY,\n noSkew = skewX === 0 && skewY === 0;\n\n if (this.strokeUniform) {\n dimX = this.width;\n dimY = this.height;\n }\n else {\n dimensions = this._getNonTransformedDimensions();\n dimX = dimensions.x;\n dimY = dimensions.y;\n }\n if (noSkew) {\n return this._finalizeDimensions(dimX * this.scaleX, dimY * this.scaleY);\n }\n var bbox = util.sizeAfterTransform(dimX, dimY, {\n scaleX: this.scaleX,\n scaleY: this.scaleY,\n skewX: skewX,\n skewY: skewY,\n });\n return this._finalizeDimensions(bbox.x, bbox.y);\n },\n\n /*\n * Calculate object bounding box dimensions from its properties scale, skew.\n * @param Number width width of the bbox\n * @param Number height height of the bbox\n * @private\n * @return {Object} .x finalized width dimension\n * @return {Object} .y finalized height dimension\n */\n _finalizeDimensions: function(width, height) {\n return this.strokeUniform ?\n { x: width + this.strokeWidth, y: height + this.strokeWidth }\n :\n { x: width, y: height };\n },\n\n /*\n * Calculate object dimensions for controls box, including padding and canvas zoom.\n * and active selection\n * private\n */\n _calculateCurrentDimensions: function() {\n var vpt = this.getViewportTransform(),\n dim = this._getTransformedDimensions(),\n p = transformPoint(dim, vpt, true);\n return p.scalarAdd(2 * this.padding);\n },\n });\n})();\n\n\nfabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prototype */ {\n\n /**\n * Moves an object to the bottom of the stack of drawn objects\n * @return {fabric.Object} thisArg\n * @chainable\n */\n sendToBack: function() {\n if (this.group) {\n fabric.StaticCanvas.prototype.sendToBack.call(this.group, this);\n }\n else if (this.canvas) {\n this.canvas.sendToBack(this);\n }\n return this;\n },\n\n /**\n * Moves an object to the top of the stack of drawn objects\n * @return {fabric.Object} thisArg\n * @chainable\n */\n bringToFront: function() {\n if (this.group) {\n fabric.StaticCanvas.prototype.bringToFront.call(this.group, this);\n }\n else if (this.canvas) {\n this.canvas.bringToFront(this);\n }\n return this;\n },\n\n /**\n * Moves an object down in stack of drawn objects\n * @param {Boolean} [intersecting] If `true`, send object behind next lower intersecting object\n * @return {fabric.Object} thisArg\n * @chainable\n */\n sendBackwards: function(intersecting) {\n if (this.group) {\n fabric.StaticCanvas.prototype.sendBackwards.call(this.group, this, intersecting);\n }\n else if (this.canvas) {\n this.canvas.sendBackwards(this, intersecting);\n }\n return this;\n },\n\n /**\n * Moves an object up in stack of drawn objects\n * @param {Boolean} [intersecting] If `true`, send object in front of next upper intersecting object\n * @return {fabric.Object} thisArg\n * @chainable\n */\n bringForward: function(intersecting) {\n if (this.group) {\n fabric.StaticCanvas.prototype.bringForward.call(this.group, this, intersecting);\n }\n else if (this.canvas) {\n this.canvas.bringForward(this, intersecting);\n }\n return this;\n },\n\n /**\n * Moves an object to specified level in stack of drawn objects\n * @param {Number} index New position of object\n * @return {fabric.Object} thisArg\n * @chainable\n */\n moveTo: function(index) {\n if (this.group && this.group.type !== 'activeSelection') {\n fabric.StaticCanvas.prototype.moveTo.call(this.group, this, index);\n }\n else if (this.canvas) {\n this.canvas.moveTo(this, index);\n }\n return this;\n }\n});\n\n\n/* _TO_SVG_START_ */\n(function() {\n function getSvgColorString(prop, value) {\n if (!value) {\n return prop + ': none; ';\n }\n else if (value.toLive) {\n return prop + ': url(#SVGID_' + value.id + '); ';\n }\n else {\n var color = new fabric.Color(value),\n str = prop + ': ' + color.toRgb() + '; ',\n opacity = color.getAlpha();\n if (opacity !== 1) {\n //change the color in rgb + opacity\n str += prop + '-opacity: ' + opacity.toString() + '; ';\n }\n return str;\n }\n }\n\n var toFixed = fabric.util.toFixed;\n\n fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prototype */ {\n /**\n * Returns styles-string for svg-export\n * @param {Boolean} skipShadow a boolean to skip shadow filter output\n * @return {String}\n */\n getSvgStyles: function(skipShadow) {\n\n var fillRule = this.fillRule ? this.fillRule : 'nonzero',\n strokeWidth = this.strokeWidth ? this.strokeWidth : '0',\n strokeDashArray = this.strokeDashArray ? this.strokeDashArray.join(' ') : 'none',\n strokeDashOffset = this.strokeDashOffset ? this.strokeDashOffset : '0',\n strokeLineCap = this.strokeLineCap ? this.strokeLineCap : 'butt',\n strokeLineJoin = this.strokeLineJoin ? this.strokeLineJoin : 'miter',\n strokeMiterLimit = this.strokeMiterLimit ? this.strokeMiterLimit : '4',\n opacity = typeof this.opacity !== 'undefined' ? this.opacity : '1',\n visibility = this.visible ? '' : ' visibility: hidden;',\n filter = skipShadow ? '' : this.getSvgFilter(),\n fill = getSvgColorString('fill', this.fill),\n stroke = getSvgColorString('stroke', this.stroke);\n\n return [\n stroke,\n 'stroke-width: ', strokeWidth, '; ',\n 'stroke-dasharray: ', strokeDashArray, '; ',\n 'stroke-linecap: ', strokeLineCap, '; ',\n 'stroke-dashoffset: ', strokeDashOffset, '; ',\n 'stroke-linejoin: ', strokeLineJoin, '; ',\n 'stroke-miterlimit: ', strokeMiterLimit, '; ',\n fill,\n 'fill-rule: ', fillRule, '; ',\n 'opacity: ', opacity, ';',\n filter,\n visibility\n ].join('');\n },\n\n /**\n * Returns styles-string for svg-export\n * @param {Object} style the object from which to retrieve style properties\n * @param {Boolean} useWhiteSpace a boolean to include an additional attribute in the style.\n * @return {String}\n */\n getSvgSpanStyles: function(style, useWhiteSpace) {\n var term = '; ';\n var fontFamily = style.fontFamily ?\n 'font-family: ' + (((style.fontFamily.indexOf('\\'') === -1 && style.fontFamily.indexOf('\"') === -1) ?\n '\\'' + style.fontFamily + '\\'' : style.fontFamily)) + term : '';\n var strokeWidth = style.strokeWidth ? 'stroke-width: ' + style.strokeWidth + term : '',\n fontFamily = fontFamily,\n fontSize = style.fontSize ? 'font-size: ' + style.fontSize + 'px' + term : '',\n fontStyle = style.fontStyle ? 'font-style: ' + style.fontStyle + term : '',\n fontWeight = style.fontWeight ? 'font-weight: ' + style.fontWeight + term : '',\n fill = style.fill ? getSvgColorString('fill', style.fill) : '',\n stroke = style.stroke ? getSvgColorString('stroke', style.stroke) : '',\n textDecoration = this.getSvgTextDecoration(style),\n deltaY = style.deltaY ? 'baseline-shift: ' + (-style.deltaY) + '; ' : '';\n if (textDecoration) {\n textDecoration = 'text-decoration: ' + textDecoration + term;\n }\n\n return [\n stroke,\n strokeWidth,\n fontFamily,\n fontSize,\n fontStyle,\n fontWeight,\n textDecoration,\n fill,\n deltaY,\n useWhiteSpace ? 'white-space: pre; ' : ''\n ].join('');\n },\n\n /**\n * Returns text-decoration property for svg-export\n * @param {Object} style the object from which to retrieve style properties\n * @return {String}\n */\n getSvgTextDecoration: function(style) {\n return ['overline', 'underline', 'line-through'].filter(function(decoration) {\n return style[decoration.replace('-', '')];\n }).join(' ');\n },\n\n /**\n * Returns filter for svg shadow\n * @return {String}\n */\n getSvgFilter: function() {\n return this.shadow ? 'filter: url(#SVGID_' + this.shadow.id + ');' : '';\n },\n\n /**\n * Returns id attribute for svg output\n * @return {String}\n */\n getSvgCommons: function() {\n return [\n this.id ? 'id=\"' + this.id + '\" ' : '',\n this.clipPath ? 'clip-path=\"url(#' + this.clipPath.clipPathId + ')\" ' : '',\n ].join('');\n },\n\n /**\n * Returns transform-string for svg-export\n * @param {Boolean} use the full transform or the single object one.\n * @return {String}\n */\n getSvgTransform: function(full, additionalTransform) {\n var transform = full ? this.calcTransformMatrix() : this.calcOwnMatrix(),\n svgTransform = 'transform=\"' + fabric.util.matrixToSVG(transform);\n return svgTransform +\n (additionalTransform || '') + '\" ';\n },\n\n _setSVGBg: function(textBgRects) {\n if (this.backgroundColor) {\n var NUM_FRACTION_DIGITS = fabric.Object.NUM_FRACTION_DIGITS;\n textBgRects.push(\n '\\t\\t\\n');\n }\n },\n\n /**\n * Returns svg representation of an instance\n * @param {Function} [reviver] Method for further parsing of svg representation.\n * @return {String} svg representation of an instance\n */\n toSVG: function(reviver) {\n return this._createBaseSVGMarkup(this._toSVG(reviver), { reviver: reviver });\n },\n\n /**\n * Returns svg clipPath representation of an instance\n * @param {Function} [reviver] Method for further parsing of svg representation.\n * @return {String} svg representation of an instance\n */\n toClipPathSVG: function(reviver) {\n return '\\t' + this._createBaseClipPathSVGMarkup(this._toSVG(reviver), { reviver: reviver });\n },\n\n /**\n * @private\n */\n _createBaseClipPathSVGMarkup: function(objectMarkup, options) {\n options = options || {};\n var reviver = options.reviver,\n additionalTransform = options.additionalTransform || '',\n commonPieces = [\n this.getSvgTransform(true, additionalTransform),\n this.getSvgCommons(),\n ].join(''),\n // insert commons in the markup, style and svgCommons\n index = objectMarkup.indexOf('COMMON_PARTS');\n objectMarkup[index] = commonPieces;\n return reviver ? reviver(objectMarkup.join('')) : objectMarkup.join('');\n },\n\n /**\n * @private\n */\n _createBaseSVGMarkup: function(objectMarkup, options) {\n options = options || {};\n var noStyle = options.noStyle,\n reviver = options.reviver,\n styleInfo = noStyle ? '' : 'style=\"' + this.getSvgStyles() + '\" ',\n shadowInfo = options.withShadow ? 'style=\"' + this.getSvgFilter() + '\" ' : '',\n clipPath = this.clipPath,\n vectorEffect = this.strokeUniform ? 'vector-effect=\"non-scaling-stroke\" ' : '',\n absoluteClipPath = clipPath && clipPath.absolutePositioned,\n stroke = this.stroke, fill = this.fill, shadow = this.shadow,\n commonPieces, markup = [], clipPathMarkup,\n // insert commons in the markup, style and svgCommons\n index = objectMarkup.indexOf('COMMON_PARTS'),\n additionalTransform = options.additionalTransform;\n if (clipPath) {\n clipPath.clipPathId = 'CLIPPATH_' + fabric.Object.__uid++;\n clipPathMarkup = '\\n' +\n clipPath.toClipPathSVG(reviver) +\n '\\n';\n }\n if (absoluteClipPath) {\n markup.push(\n '\\n'\n );\n }\n markup.push(\n '\\n'\n );\n commonPieces = [\n styleInfo,\n vectorEffect,\n noStyle ? '' : this.addPaintOrder(), ' ',\n additionalTransform ? 'transform=\"' + additionalTransform + '\" ' : '',\n ].join('');\n objectMarkup[index] = commonPieces;\n if (fill && fill.toLive) {\n markup.push(fill.toSVG(this));\n }\n if (stroke && stroke.toLive) {\n markup.push(stroke.toSVG(this));\n }\n if (shadow) {\n markup.push(shadow.toSVG(this));\n }\n if (clipPath) {\n markup.push(clipPathMarkup);\n }\n markup.push(objectMarkup.join(''));\n markup.push('\\n');\n absoluteClipPath && markup.push('\\n');\n return reviver ? reviver(markup.join('')) : markup.join('');\n },\n\n addPaintOrder: function() {\n return this.paintFirst !== 'fill' ? ' paint-order=\"' + this.paintFirst + '\" ' : '';\n }\n });\n})();\n/* _TO_SVG_END_ */\n\n\n(function() {\n\n var extend = fabric.util.object.extend,\n originalSet = 'stateProperties';\n\n /*\n Depends on `stateProperties`\n */\n function saveProps(origin, destination, props) {\n var tmpObj = { }, deep = true;\n props.forEach(function(prop) {\n tmpObj[prop] = origin[prop];\n });\n\n extend(origin[destination], tmpObj, deep);\n }\n\n function _isEqual(origValue, currentValue, firstPass) {\n if (origValue === currentValue) {\n // if the objects are identical, return\n return true;\n }\n else if (Array.isArray(origValue)) {\n if (!Array.isArray(currentValue) || origValue.length !== currentValue.length) {\n return false;\n }\n for (var i = 0, len = origValue.length; i < len; i++) {\n if (!_isEqual(origValue[i], currentValue[i])) {\n return false;\n }\n }\n return true;\n }\n else if (origValue && typeof origValue === 'object') {\n var keys = Object.keys(origValue), key;\n if (!currentValue ||\n typeof currentValue !== 'object' ||\n (!firstPass && keys.length !== Object.keys(currentValue).length)\n ) {\n return false;\n }\n for (var i = 0, len = keys.length; i < len; i++) {\n key = keys[i];\n // since clipPath is in the statefull cache list and the clipPath objects\n // would be iterated as an object, this would lead to possible infinite recursion\n // we do not want to compare those.\n if (key === 'canvas' || key === 'group') {\n continue;\n }\n if (!_isEqual(origValue[key], currentValue[key])) {\n return false;\n }\n }\n return true;\n }\n }\n\n\n fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prototype */ {\n\n /**\n * Returns true if object state (one of its state properties) was changed\n * @param {String} [propertySet] optional name for the set of property we want to save\n * @return {Boolean} true if instance' state has changed since `{@link fabric.Object#saveState}` was called\n */\n hasStateChanged: function(propertySet) {\n propertySet = propertySet || originalSet;\n var dashedPropertySet = '_' + propertySet;\n if (Object.keys(this[dashedPropertySet]).length < this[propertySet].length) {\n return true;\n }\n return !_isEqual(this[dashedPropertySet], this, true);\n },\n\n /**\n * Saves state of an object\n * @param {Object} [options] Object with additional `stateProperties` array to include when saving state\n * @return {fabric.Object} thisArg\n */\n saveState: function(options) {\n var propertySet = options && options.propertySet || originalSet,\n destination = '_' + propertySet;\n if (!this[destination]) {\n return this.setupState(options);\n }\n saveProps(this, destination, this[propertySet]);\n if (options && options.stateProperties) {\n saveProps(this, destination, options.stateProperties);\n }\n return this;\n },\n\n /**\n * Setups state of an object\n * @param {Object} [options] Object with additional `stateProperties` array to include when saving state\n * @return {fabric.Object} thisArg\n */\n setupState: function(options) {\n options = options || { };\n var propertySet = options.propertySet || originalSet;\n options.propertySet = propertySet;\n this['_' + propertySet] = { };\n this.saveState(options);\n return this;\n }\n });\n})();\n\n\n(function() {\n\n var degreesToRadians = fabric.util.degreesToRadians;\n\n fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prototype */ {\n /**\n * Determines which corner has been clicked\n * @private\n * @param {Object} pointer The pointer indicating the mouse position\n * @return {String|Boolean} corner code (tl, tr, bl, br, etc.), or false if nothing is found\n */\n _findTargetCorner: function(pointer, forTouch) {\n // objects in group, anykind, are not self modificable,\n // must not return an hovered corner.\n if (!this.hasControls || this.group || (!this.canvas || this.canvas._activeObject !== this)) {\n return false;\n }\n\n var ex = pointer.x,\n ey = pointer.y,\n xPoints,\n lines, keys = Object.keys(this.oCoords),\n j = keys.length - 1, i;\n this.__corner = 0;\n\n // cycle in reverse order so we pick first the one on top\n for (; j >= 0; j--) {\n i = keys[j];\n if (!this.isControlVisible(i)) {\n continue;\n }\n\n lines = this._getImageLines(forTouch ? this.oCoords[i].touchCorner : this.oCoords[i].corner);\n // // debugging\n //\n // this.canvas.contextTop.fillRect(lines.bottomline.d.x, lines.bottomline.d.y, 2, 2);\n // this.canvas.contextTop.fillRect(lines.bottomline.o.x, lines.bottomline.o.y, 2, 2);\n //\n // this.canvas.contextTop.fillRect(lines.leftline.d.x, lines.leftline.d.y, 2, 2);\n // this.canvas.contextTop.fillRect(lines.leftline.o.x, lines.leftline.o.y, 2, 2);\n //\n // this.canvas.contextTop.fillRect(lines.topline.d.x, lines.topline.d.y, 2, 2);\n // this.canvas.contextTop.fillRect(lines.topline.o.x, lines.topline.o.y, 2, 2);\n //\n // this.canvas.contextTop.fillRect(lines.rightline.d.x, lines.rightline.d.y, 2, 2);\n // this.canvas.contextTop.fillRect(lines.rightline.o.x, lines.rightline.o.y, 2, 2);\n\n xPoints = this._findCrossPoints({ x: ex, y: ey }, lines);\n if (xPoints !== 0 && xPoints % 2 === 1) {\n this.__corner = i;\n return i;\n }\n }\n return false;\n },\n\n /**\n * Calls a function for each control. The function gets called,\n * with the control, the object that is calling the iterator and the control's key\n * @param {Function} fn function to iterate over the controls over\n */\n forEachControl: function(fn) {\n for (var i in this.controls) {\n fn(this.controls[i], i, this);\n };\n },\n\n /**\n * Sets the coordinates of the draggable boxes in the corners of\n * the image used to scale/rotate it.\n * note: if we would switch to ROUND corner area, all of this would disappear.\n * everything would resolve to a single point and a pythagorean theorem for the distance\n * @private\n */\n _setCornerCoords: function() {\n var coords = this.oCoords;\n\n for (var control in coords) {\n var controlObject = this.controls[control];\n coords[control].corner = controlObject.calcCornerCoords(\n this.angle, this.cornerSize, coords[control].x, coords[control].y, false);\n coords[control].touchCorner = controlObject.calcCornerCoords(\n this.angle, this.touchCornerSize, coords[control].x, coords[control].y, true);\n }\n },\n\n /**\n * Draws a colored layer behind the object, inside its selection borders.\n * Requires public options: padding, selectionBackgroundColor\n * this function is called when the context is transformed\n * has checks to be skipped when the object is on a staticCanvas\n * @param {CanvasRenderingContext2D} ctx Context to draw on\n * @return {fabric.Object} thisArg\n * @chainable\n */\n drawSelectionBackground: function(ctx) {\n if (!this.selectionBackgroundColor ||\n (this.canvas && !this.canvas.interactive) ||\n (this.canvas && this.canvas._activeObject !== this)\n ) {\n return this;\n }\n ctx.save();\n var center = this.getCenterPoint(), wh = this._calculateCurrentDimensions(),\n vpt = this.canvas.viewportTransform;\n ctx.translate(center.x, center.y);\n ctx.scale(1 / vpt[0], 1 / vpt[3]);\n ctx.rotate(degreesToRadians(this.angle));\n ctx.fillStyle = this.selectionBackgroundColor;\n ctx.fillRect(-wh.x / 2, -wh.y / 2, wh.x, wh.y);\n ctx.restore();\n return this;\n },\n\n /**\n * Draws borders of an object's bounding box.\n * Requires public properties: width, height\n * Requires public options: padding, borderColor\n * @param {CanvasRenderingContext2D} ctx Context to draw on\n * @param {Object} styleOverride object to override the object style\n * @return {fabric.Object} thisArg\n * @chainable\n */\n drawBorders: function(ctx, styleOverride) {\n styleOverride = styleOverride || {};\n var wh = this._calculateCurrentDimensions(),\n strokeWidth = this.borderScaleFactor,\n width = wh.x + strokeWidth,\n height = wh.y + strokeWidth,\n hasControls = typeof styleOverride.hasControls !== 'undefined' ?\n styleOverride.hasControls : this.hasControls,\n shouldStroke = false;\n\n ctx.save();\n ctx.strokeStyle = styleOverride.borderColor || this.borderColor;\n this._setLineDash(ctx, styleOverride.borderDashArray || this.borderDashArray);\n\n ctx.strokeRect(\n -width / 2,\n -height / 2,\n width,\n height\n );\n\n if (hasControls) {\n ctx.beginPath();\n this.forEachControl(function(control, key, fabricObject) {\n // in this moment, the ctx is centered on the object.\n // width and height of the above function are the size of the bbox.\n if (control.withConnection && control.getVisibility(fabricObject, key)) {\n // reset movement for each control\n shouldStroke = true;\n ctx.moveTo(control.x * width, control.y * height);\n ctx.lineTo(\n control.x * width + control.offsetX,\n control.y * height + control.offsetY\n );\n }\n });\n if (shouldStroke) {\n ctx.stroke();\n }\n }\n ctx.restore();\n return this;\n },\n\n /**\n * Draws borders of an object's bounding box when it is inside a group.\n * Requires public properties: width, height\n * Requires public options: padding, borderColor\n * @param {CanvasRenderingContext2D} ctx Context to draw on\n * @param {object} options object representing current object parameters\n * @param {Object} styleOverride object to override the object style\n * @return {fabric.Object} thisArg\n * @chainable\n */\n drawBordersInGroup: function(ctx, options, styleOverride) {\n styleOverride = styleOverride || {};\n var bbox = fabric.util.sizeAfterTransform(this.width, this.height, options),\n strokeWidth = this.strokeWidth,\n strokeUniform = this.strokeUniform,\n borderScaleFactor = this.borderScaleFactor,\n width =\n bbox.x + strokeWidth * (strokeUniform ? this.canvas.getZoom() : options.scaleX) + borderScaleFactor,\n height =\n bbox.y + strokeWidth * (strokeUniform ? this.canvas.getZoom() : options.scaleY) + borderScaleFactor;\n ctx.save();\n this._setLineDash(ctx, styleOverride.borderDashArray || this.borderDashArray);\n ctx.strokeStyle = styleOverride.borderColor || this.borderColor;\n ctx.strokeRect(\n -width / 2,\n -height / 2,\n width,\n height\n );\n\n ctx.restore();\n return this;\n },\n\n /**\n * Draws corners of an object's bounding box.\n * Requires public properties: width, height\n * Requires public options: cornerSize, padding\n * @param {CanvasRenderingContext2D} ctx Context to draw on\n * @param {Object} styleOverride object to override the object style\n * @return {fabric.Object} thisArg\n * @chainable\n */\n drawControls: function(ctx, styleOverride) {\n styleOverride = styleOverride || {};\n ctx.save();\n var retinaScaling = this.canvas.getRetinaScaling(), matrix, p;\n ctx.setTransform(retinaScaling, 0, 0, retinaScaling, 0, 0);\n ctx.strokeStyle = ctx.fillStyle = styleOverride.cornerColor || this.cornerColor;\n if (!this.transparentCorners) {\n ctx.strokeStyle = styleOverride.cornerStrokeColor || this.cornerStrokeColor;\n }\n this._setLineDash(ctx, styleOverride.cornerDashArray || this.cornerDashArray);\n this.setCoords();\n if (this.group) {\n // fabricJS does not really support drawing controls inside groups,\n // this piece of code here helps having at least the control in places.\n // If an application needs to show some objects as selected because of some UI state\n // can still call Object._renderControls() on any object they desire, independently of groups.\n // using no padding, circular controls and hiding the rotating cursor is higly suggested,\n matrix = this.group.calcTransformMatrix();\n }\n this.forEachControl(function(control, key, fabricObject) {\n p = fabricObject.oCoords[key];\n if (control.getVisibility(fabricObject, key)) {\n if (matrix) {\n p = fabric.util.transformPoint(p, matrix);\n }\n control.render(ctx, p.x, p.y, styleOverride, fabricObject);\n }\n });\n ctx.restore();\n\n return this;\n },\n\n /**\n * Returns true if the specified control is visible, false otherwise.\n * @param {String} controlKey The key of the control. Possible values are 'tl', 'tr', 'br', 'bl', 'ml', 'mt', 'mr', 'mb', 'mtr'.\n * @returns {Boolean} true if the specified control is visible, false otherwise\n */\n isControlVisible: function(controlKey) {\n return this.controls[controlKey] && this.controls[controlKey].getVisibility(this, controlKey);\n },\n\n /**\n * Sets the visibility of the specified control.\n * @param {String} controlKey The key of the control. Possible values are 'tl', 'tr', 'br', 'bl', 'ml', 'mt', 'mr', 'mb', 'mtr'.\n * @param {Boolean} visible true to set the specified control visible, false otherwise\n * @return {fabric.Object} thisArg\n * @chainable\n */\n setControlVisible: function(controlKey, visible) {\n if (!this._controlsVisibility) {\n this._controlsVisibility = {};\n }\n this._controlsVisibility[controlKey] = visible;\n return this;\n },\n\n /**\n * Sets the visibility state of object controls.\n * @param {Object} [options] Options object\n * @param {Boolean} [options.bl] true to enable the bottom-left control, false to disable it\n * @param {Boolean} [options.br] true to enable the bottom-right control, false to disable it\n * @param {Boolean} [options.mb] true to enable the middle-bottom control, false to disable it\n * @param {Boolean} [options.ml] true to enable the middle-left control, false to disable it\n * @param {Boolean} [options.mr] true to enable the middle-right control, false to disable it\n * @param {Boolean} [options.mt] true to enable the middle-top control, false to disable it\n * @param {Boolean} [options.tl] true to enable the top-left control, false to disable it\n * @param {Boolean} [options.tr] true to enable the top-right control, false to disable it\n * @param {Boolean} [options.mtr] true to enable the middle-top-rotate control, false to disable it\n * @return {fabric.Object} thisArg\n * @chainable\n */\n setControlsVisibility: function(options) {\n options || (options = { });\n\n for (var p in options) {\n this.setControlVisible(p, options[p]);\n }\n return this;\n },\n\n\n /**\n * This callback function is called every time _discardActiveObject or _setActiveObject\n * try to to deselect this object. If the function returns true, the process is cancelled\n * @param {Object} [options] options sent from the upper functions\n * @param {Event} [options.e] event if the process is generated by an event\n */\n onDeselect: function() {\n // implemented by sub-classes, as needed.\n },\n\n\n /**\n * This callback function is called every time _discardActiveObject or _setActiveObject\n * try to to select this object. If the function returns true, the process is cancelled\n * @param {Object} [options] options sent from the upper functions\n * @param {Event} [options.e] event if the process is generated by an event\n */\n onSelect: function() {\n // implemented by sub-classes, as needed.\n }\n });\n})();\n\n\nfabric.util.object.extend(fabric.StaticCanvas.prototype, /** @lends fabric.StaticCanvas.prototype */ {\n\n /**\n * Animation duration (in ms) for fx* methods\n * @type Number\n * @default\n */\n FX_DURATION: 500,\n\n /**\n * Centers object horizontally with animation.\n * @param {fabric.Object} object Object to center\n * @param {Object} [callbacks] Callbacks object with optional \"onComplete\" and/or \"onChange\" properties\n * @param {Function} [callbacks.onComplete] Invoked on completion\n * @param {Function} [callbacks.onChange] Invoked on every step of animation\n * @return {fabric.AnimationContext} context\n */\n fxCenterObjectH: function (object, callbacks) {\n callbacks = callbacks || { };\n\n var empty = function() { },\n onComplete = callbacks.onComplete || empty,\n onChange = callbacks.onChange || empty,\n _this = this;\n\n return fabric.util.animate({\n target: this,\n startValue: object.left,\n endValue: this.getCenterPoint().x,\n duration: this.FX_DURATION,\n onChange: function(value) {\n object.set('left', value);\n _this.requestRenderAll();\n onChange();\n },\n onComplete: function() {\n object.setCoords();\n onComplete();\n }\n });\n },\n\n /**\n * Centers object vertically with animation.\n * @param {fabric.Object} object Object to center\n * @param {Object} [callbacks] Callbacks object with optional \"onComplete\" and/or \"onChange\" properties\n * @param {Function} [callbacks.onComplete] Invoked on completion\n * @param {Function} [callbacks.onChange] Invoked on every step of animation\n * @return {fabric.AnimationContext} context\n */\n fxCenterObjectV: function (object, callbacks) {\n callbacks = callbacks || { };\n\n var empty = function() { },\n onComplete = callbacks.onComplete || empty,\n onChange = callbacks.onChange || empty,\n _this = this;\n\n return fabric.util.animate({\n target: this,\n startValue: object.top,\n endValue: this.getCenterPoint().y,\n duration: this.FX_DURATION,\n onChange: function(value) {\n object.set('top', value);\n _this.requestRenderAll();\n onChange();\n },\n onComplete: function() {\n object.setCoords();\n onComplete();\n }\n });\n },\n\n /**\n * Same as `fabric.Canvas#remove` but animated\n * @param {fabric.Object} object Object to remove\n * @param {Object} [callbacks] Callbacks object with optional \"onComplete\" and/or \"onChange\" properties\n * @param {Function} [callbacks.onComplete] Invoked on completion\n * @param {Function} [callbacks.onChange] Invoked on every step of animation\n * @return {fabric.AnimationContext} context\n */\n fxRemove: function (object, callbacks) {\n callbacks = callbacks || { };\n\n var empty = function() { },\n onComplete = callbacks.onComplete || empty,\n onChange = callbacks.onChange || empty,\n _this = this;\n\n return fabric.util.animate({\n target: this,\n startValue: object.opacity,\n endValue: 0,\n duration: this.FX_DURATION,\n onChange: function(value) {\n object.set('opacity', value);\n _this.requestRenderAll();\n onChange();\n },\n onComplete: function () {\n _this.remove(object);\n onComplete();\n }\n });\n }\n});\n\nfabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prototype */ {\n /**\n * Animates object's properties\n * @param {String|Object} property Property to animate (if string) or properties to animate (if object)\n * @param {Number|Object} value Value to animate property to (if string was given first) or options object\n * @return {fabric.Object} thisArg\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-2#animation}\n * @return {fabric.AnimationContext | fabric.AnimationContext[]} animation context (or an array if passed multiple properties)\n *\n * As object — multiple properties\n *\n * object.animate({ left: ..., top: ... });\n * object.animate({ left: ..., top: ... }, { duration: ... });\n *\n * As string — one property\n *\n * object.animate('left', ...);\n * object.animate('left', { duration: ... });\n *\n */\n animate: function () {\n if (arguments[0] && typeof arguments[0] === 'object') {\n var propsToAnimate = [], prop, skipCallbacks, out = [];\n for (prop in arguments[0]) {\n propsToAnimate.push(prop);\n }\n for (var i = 0, len = propsToAnimate.length; i < len; i++) {\n prop = propsToAnimate[i];\n skipCallbacks = i !== len - 1;\n out.push(this._animate(prop, arguments[0][prop], arguments[1], skipCallbacks));\n }\n return out;\n }\n else {\n return this._animate.apply(this, arguments);\n }\n },\n\n /**\n * @private\n * @param {String} property Property to animate\n * @param {String} to Value to animate to\n * @param {Object} [options] Options object\n * @param {Boolean} [skipCallbacks] When true, callbacks like onchange and oncomplete are not invoked\n */\n _animate: function(property, to, options, skipCallbacks) {\n var _this = this, propPair;\n\n to = to.toString();\n\n if (!options) {\n options = { };\n }\n else {\n options = fabric.util.object.clone(options);\n }\n\n if (~property.indexOf('.')) {\n propPair = property.split('.');\n }\n\n var propIsColor =\n _this.colorProperties.indexOf(property) > -1 ||\n (propPair && _this.colorProperties.indexOf(propPair[1]) > -1);\n\n var currentValue = propPair\n ? this.get(propPair[0])[propPair[1]]\n : this.get(property);\n\n if (!('from' in options)) {\n options.from = currentValue;\n }\n\n if (!propIsColor) {\n if (~to.indexOf('=')) {\n to = currentValue + parseFloat(to.replace('=', ''));\n }\n else {\n to = parseFloat(to);\n }\n }\n\n var _options = {\n target: this,\n startValue: options.from,\n endValue: to,\n byValue: options.by,\n easing: options.easing,\n duration: options.duration,\n abort: options.abort && function(value, valueProgress, timeProgress) {\n return options.abort.call(_this, value, valueProgress, timeProgress);\n },\n onChange: function (value, valueProgress, timeProgress) {\n if (propPair) {\n _this[propPair[0]][propPair[1]] = value;\n }\n else {\n _this.set(property, value);\n }\n if (skipCallbacks) {\n return;\n }\n options.onChange && options.onChange(value, valueProgress, timeProgress);\n },\n onComplete: function (value, valueProgress, timeProgress) {\n if (skipCallbacks) {\n return;\n }\n\n _this.setCoords();\n options.onComplete && options.onComplete(value, valueProgress, timeProgress);\n }\n };\n\n if (propIsColor) {\n return fabric.util.animateColor(_options.startValue, _options.endValue, _options.duration, _options);\n }\n else {\n return fabric.util.animate(_options);\n }\n }\n});\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n extend = fabric.util.object.extend,\n clone = fabric.util.object.clone,\n coordProps = { x1: 1, x2: 1, y1: 1, y2: 1 };\n\n if (fabric.Line) {\n fabric.warn('fabric.Line is already defined');\n return;\n }\n\n /**\n * Line class\n * @class fabric.Line\n * @extends fabric.Object\n * @see {@link fabric.Line#initialize} for constructor definition\n */\n fabric.Line = fabric.util.createClass(fabric.Object, /** @lends fabric.Line.prototype */ {\n\n /**\n * Type of an object\n * @type String\n * @default\n */\n type: 'line',\n\n /**\n * x value or first line edge\n * @type Number\n * @default\n */\n x1: 0,\n\n /**\n * y value or first line edge\n * @type Number\n * @default\n */\n y1: 0,\n\n /**\n * x value or second line edge\n * @type Number\n * @default\n */\n x2: 0,\n\n /**\n * y value or second line edge\n * @type Number\n * @default\n */\n y2: 0,\n\n cacheProperties: fabric.Object.prototype.cacheProperties.concat('x1', 'x2', 'y1', 'y2'),\n\n /**\n * Constructor\n * @param {Array} [points] Array of points\n * @param {Object} [options] Options object\n * @return {fabric.Line} thisArg\n */\n initialize: function(points, options) {\n if (!points) {\n points = [0, 0, 0, 0];\n }\n\n this.callSuper('initialize', options);\n\n this.set('x1', points[0]);\n this.set('y1', points[1]);\n this.set('x2', points[2]);\n this.set('y2', points[3]);\n\n this._setWidthHeight(options);\n },\n\n /**\n * @private\n * @param {Object} [options] Options\n */\n _setWidthHeight: function(options) {\n options || (options = { });\n\n this.width = Math.abs(this.x2 - this.x1);\n this.height = Math.abs(this.y2 - this.y1);\n\n this.left = 'left' in options\n ? options.left\n : this._getLeftToOriginX();\n\n this.top = 'top' in options\n ? options.top\n : this._getTopToOriginY();\n },\n\n /**\n * @private\n * @param {String} key\n * @param {*} value\n */\n _set: function(key, value) {\n this.callSuper('_set', key, value);\n if (typeof coordProps[key] !== 'undefined') {\n this._setWidthHeight();\n }\n return this;\n },\n\n /**\n * @private\n * @return {Number} leftToOriginX Distance from left edge of canvas to originX of Line.\n */\n _getLeftToOriginX: makeEdgeToOriginGetter(\n { // property names\n origin: 'originX',\n axis1: 'x1',\n axis2: 'x2',\n dimension: 'width'\n },\n { // possible values of origin\n nearest: 'left',\n center: 'center',\n farthest: 'right'\n }\n ),\n\n /**\n * @private\n * @return {Number} topToOriginY Distance from top edge of canvas to originY of Line.\n */\n _getTopToOriginY: makeEdgeToOriginGetter(\n { // property names\n origin: 'originY',\n axis1: 'y1',\n axis2: 'y2',\n dimension: 'height'\n },\n { // possible values of origin\n nearest: 'top',\n center: 'center',\n farthest: 'bottom'\n }\n ),\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _render: function(ctx) {\n ctx.beginPath();\n\n\n var p = this.calcLinePoints();\n ctx.moveTo(p.x1, p.y1);\n ctx.lineTo(p.x2, p.y2);\n\n ctx.lineWidth = this.strokeWidth;\n\n // TODO: test this\n // make sure setting \"fill\" changes color of a line\n // (by copying fillStyle to strokeStyle, since line is stroked, not filled)\n var origStrokeStyle = ctx.strokeStyle;\n ctx.strokeStyle = this.stroke || ctx.fillStyle;\n this.stroke && this._renderStroke(ctx);\n ctx.strokeStyle = origStrokeStyle;\n },\n\n /**\n * This function is an helper for svg import. it returns the center of the object in the svg\n * untransformed coordinates\n * @private\n * @return {Object} center point from element coordinates\n */\n _findCenterFromElement: function() {\n return {\n x: (this.x1 + this.x2) / 2,\n y: (this.y1 + this.y2) / 2,\n };\n },\n\n /**\n * Returns object representation of an instance\n * @method toObject\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toObject: function(propertiesToInclude) {\n return extend(this.callSuper('toObject', propertiesToInclude), this.calcLinePoints());\n },\n\n /*\n * Calculate object dimensions from its properties\n * @private\n */\n _getNonTransformedDimensions: function() {\n var dim = this.callSuper('_getNonTransformedDimensions');\n if (this.strokeLineCap === 'butt') {\n if (this.width === 0) {\n dim.y -= this.strokeWidth;\n }\n if (this.height === 0) {\n dim.x -= this.strokeWidth;\n }\n }\n return dim;\n },\n\n /**\n * Recalculates line points given width and height\n * @private\n */\n calcLinePoints: function() {\n var xMult = this.x1 <= this.x2 ? -1 : 1,\n yMult = this.y1 <= this.y2 ? -1 : 1,\n x1 = (xMult * this.width * 0.5),\n y1 = (yMult * this.height * 0.5),\n x2 = (xMult * this.width * -0.5),\n y2 = (yMult * this.height * -0.5);\n\n return {\n x1: x1,\n x2: x2,\n y1: y1,\n y2: y2\n };\n },\n\n /* _TO_SVG_START_ */\n /**\n * Returns svg representation of an instance\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG: function() {\n var p = this.calcLinePoints();\n return [\n '\\n'\n ];\n },\n /* _TO_SVG_END_ */\n });\n\n /* _FROM_SVG_START_ */\n /**\n * List of attribute names to account for when parsing SVG element (used by {@link fabric.Line.fromElement})\n * @static\n * @memberOf fabric.Line\n * @see http://www.w3.org/TR/SVG/shapes.html#LineElement\n */\n fabric.Line.ATTRIBUTE_NAMES = fabric.SHARED_ATTRIBUTES.concat('x1 y1 x2 y2'.split(' '));\n\n /**\n * Returns fabric.Line instance from an SVG element\n * @static\n * @memberOf fabric.Line\n * @param {SVGElement} element Element to parse\n * @param {Object} [options] Options object\n * @param {Function} [callback] callback function invoked after parsing\n */\n fabric.Line.fromElement = function(element, callback, options) {\n options = options || { };\n var parsedAttributes = fabric.parseAttributes(element, fabric.Line.ATTRIBUTE_NAMES),\n points = [\n parsedAttributes.x1 || 0,\n parsedAttributes.y1 || 0,\n parsedAttributes.x2 || 0,\n parsedAttributes.y2 || 0\n ];\n callback(new fabric.Line(points, extend(parsedAttributes, options)));\n };\n /* _FROM_SVG_END_ */\n\n /**\n * Returns fabric.Line instance from an object representation\n * @static\n * @memberOf fabric.Line\n * @param {Object} object Object to create an instance from\n * @param {function} [callback] invoked with new instance as first argument\n */\n fabric.Line.fromObject = function(object, callback) {\n function _callback(instance) {\n delete instance.points;\n callback && callback(instance);\n };\n var options = clone(object, true);\n options.points = [object.x1, object.y1, object.x2, object.y2];\n fabric.Object._fromObject('Line', options, _callback, 'points');\n };\n\n /**\n * Produces a function that calculates distance from canvas edge to Line origin.\n */\n function makeEdgeToOriginGetter(propertyNames, originValues) {\n var origin = propertyNames.origin,\n axis1 = propertyNames.axis1,\n axis2 = propertyNames.axis2,\n dimension = propertyNames.dimension,\n nearest = originValues.nearest,\n center = originValues.center,\n farthest = originValues.farthest;\n\n return function() {\n switch (this.get(origin)) {\n case nearest:\n return Math.min(this.get(axis1), this.get(axis2));\n case center:\n return Math.min(this.get(axis1), this.get(axis2)) + (0.5 * this.get(dimension));\n case farthest:\n return Math.max(this.get(axis1), this.get(axis2));\n }\n };\n\n }\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n degreesToRadians = fabric.util.degreesToRadians;\n\n if (fabric.Circle) {\n fabric.warn('fabric.Circle is already defined.');\n return;\n }\n\n /**\n * Circle class\n * @class fabric.Circle\n * @extends fabric.Object\n * @see {@link fabric.Circle#initialize} for constructor definition\n */\n fabric.Circle = fabric.util.createClass(fabric.Object, /** @lends fabric.Circle.prototype */ {\n\n /**\n * Type of an object\n * @type String\n * @default\n */\n type: 'circle',\n\n /**\n * Radius of this circle\n * @type Number\n * @default\n */\n radius: 0,\n\n /**\n * degrees of start of the circle.\n * probably will change to degrees in next major version\n * @type Number 0 - 359\n * @default 0\n */\n startAngle: 0,\n\n /**\n * End angle of the circle\n * probably will change to degrees in next major version\n * @type Number 1 - 360\n * @default 360\n */\n endAngle: 360,\n\n cacheProperties: fabric.Object.prototype.cacheProperties.concat('radius', 'startAngle', 'endAngle'),\n\n /**\n * @private\n * @param {String} key\n * @param {*} value\n * @return {fabric.Circle} thisArg\n */\n _set: function(key, value) {\n this.callSuper('_set', key, value);\n\n if (key === 'radius') {\n this.setRadius(value);\n }\n\n return this;\n },\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toObject: function(propertiesToInclude) {\n return this.callSuper('toObject', ['radius', 'startAngle', 'endAngle'].concat(propertiesToInclude));\n },\n\n /* _TO_SVG_START_ */\n\n /**\n * Returns svg representation of an instance\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG: function() {\n var svgString, x = 0, y = 0,\n angle = (this.endAngle - this.startAngle) % 360;\n\n if (angle === 0) {\n svgString = [\n '\\n'\n ];\n }\n else {\n var start = degreesToRadians(this.startAngle),\n end = degreesToRadians(this.endAngle),\n radius = this.radius,\n startX = fabric.util.cos(start) * radius,\n startY = fabric.util.sin(start) * radius,\n endX = fabric.util.cos(end) * radius,\n endY = fabric.util.sin(end) * radius,\n largeFlag = angle > 180 ? '1' : '0';\n svgString = [\n '\\n'\n ];\n }\n return svgString;\n },\n /* _TO_SVG_END_ */\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx context to render on\n */\n _render: function(ctx) {\n ctx.beginPath();\n ctx.arc(\n 0,\n 0,\n this.radius,\n degreesToRadians(this.startAngle),\n degreesToRadians(this.endAngle),\n false\n );\n this._renderPaintInOrder(ctx);\n },\n\n /**\n * Returns horizontal radius of an object (according to how an object is scaled)\n * @return {Number}\n */\n getRadiusX: function() {\n return this.get('radius') * this.get('scaleX');\n },\n\n /**\n * Returns vertical radius of an object (according to how an object is scaled)\n * @return {Number}\n */\n getRadiusY: function() {\n return this.get('radius') * this.get('scaleY');\n },\n\n /**\n * Sets radius of an object (and updates width accordingly)\n * @return {fabric.Circle} thisArg\n */\n setRadius: function(value) {\n this.radius = value;\n return this.set('width', value * 2).set('height', value * 2);\n },\n });\n\n /* _FROM_SVG_START_ */\n /**\n * List of attribute names to account for when parsing SVG element (used by {@link fabric.Circle.fromElement})\n * @static\n * @memberOf fabric.Circle\n * @see: http://www.w3.org/TR/SVG/shapes.html#CircleElement\n */\n fabric.Circle.ATTRIBUTE_NAMES = fabric.SHARED_ATTRIBUTES.concat('cx cy r'.split(' '));\n\n /**\n * Returns {@link fabric.Circle} instance from an SVG element\n * @static\n * @memberOf fabric.Circle\n * @param {SVGElement} element Element to parse\n * @param {Function} [callback] Options callback invoked after parsing is finished\n * @param {Object} [options] Options object\n * @throws {Error} If value of `r` attribute is missing or invalid\n */\n fabric.Circle.fromElement = function(element, callback) {\n var parsedAttributes = fabric.parseAttributes(element, fabric.Circle.ATTRIBUTE_NAMES);\n\n if (!isValidRadius(parsedAttributes)) {\n throw new Error('value of `r` attribute is required and can not be negative');\n }\n\n parsedAttributes.left = (parsedAttributes.left || 0) - parsedAttributes.radius;\n parsedAttributes.top = (parsedAttributes.top || 0) - parsedAttributes.radius;\n callback(new fabric.Circle(parsedAttributes));\n };\n\n /**\n * @private\n */\n function isValidRadius(attributes) {\n return (('radius' in attributes) && (attributes.radius >= 0));\n }\n /* _FROM_SVG_END_ */\n\n /**\n * Returns {@link fabric.Circle} instance from an object representation\n * @static\n * @memberOf fabric.Circle\n * @param {Object} object Object to create an instance from\n * @param {function} [callback] invoked with new instance as first argument\n * @return {void}\n */\n fabric.Circle.fromObject = function(object, callback) {\n fabric.Object._fromObject('Circle', object, callback);\n };\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { });\n\n if (fabric.Triangle) {\n fabric.warn('fabric.Triangle is already defined');\n return;\n }\n\n /**\n * Triangle class\n * @class fabric.Triangle\n * @extends fabric.Object\n * @return {fabric.Triangle} thisArg\n * @see {@link fabric.Triangle#initialize} for constructor definition\n */\n fabric.Triangle = fabric.util.createClass(fabric.Object, /** @lends fabric.Triangle.prototype */ {\n\n /**\n * Type of an object\n * @type String\n * @default\n */\n type: 'triangle',\n\n /**\n * Width is set to 100 to compensate the old initialize code that was setting it to 100\n * @type Number\n * @default\n */\n width: 100,\n\n /**\n * Height is set to 100 to compensate the old initialize code that was setting it to 100\n * @type Number\n * @default\n */\n height: 100,\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _render: function(ctx) {\n var widthBy2 = this.width / 2,\n heightBy2 = this.height / 2;\n\n ctx.beginPath();\n ctx.moveTo(-widthBy2, heightBy2);\n ctx.lineTo(0, -heightBy2);\n ctx.lineTo(widthBy2, heightBy2);\n ctx.closePath();\n\n this._renderPaintInOrder(ctx);\n },\n\n /* _TO_SVG_START_ */\n /**\n * Returns svg representation of an instance\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG: function() {\n var widthBy2 = this.width / 2,\n heightBy2 = this.height / 2,\n points = [\n -widthBy2 + ' ' + heightBy2,\n '0 ' + -heightBy2,\n widthBy2 + ' ' + heightBy2\n ].join(',');\n return [\n ''\n ];\n },\n /* _TO_SVG_END_ */\n });\n\n /**\n * Returns {@link fabric.Triangle} instance from an object representation\n * @static\n * @memberOf fabric.Triangle\n * @param {Object} object Object to create an instance from\n * @param {function} [callback] invoked with new instance as first argument\n */\n fabric.Triangle.fromObject = function(object, callback) {\n return fabric.Object._fromObject('Triangle', object, callback);\n };\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n piBy2 = Math.PI * 2;\n\n if (fabric.Ellipse) {\n fabric.warn('fabric.Ellipse is already defined.');\n return;\n }\n\n /**\n * Ellipse class\n * @class fabric.Ellipse\n * @extends fabric.Object\n * @return {fabric.Ellipse} thisArg\n * @see {@link fabric.Ellipse#initialize} for constructor definition\n */\n fabric.Ellipse = fabric.util.createClass(fabric.Object, /** @lends fabric.Ellipse.prototype */ {\n\n /**\n * Type of an object\n * @type String\n * @default\n */\n type: 'ellipse',\n\n /**\n * Horizontal radius\n * @type Number\n * @default\n */\n rx: 0,\n\n /**\n * Vertical radius\n * @type Number\n * @default\n */\n ry: 0,\n\n cacheProperties: fabric.Object.prototype.cacheProperties.concat('rx', 'ry'),\n\n /**\n * Constructor\n * @param {Object} [options] Options object\n * @return {fabric.Ellipse} thisArg\n */\n initialize: function(options) {\n this.callSuper('initialize', options);\n this.set('rx', options && options.rx || 0);\n this.set('ry', options && options.ry || 0);\n },\n\n /**\n * @private\n * @param {String} key\n * @param {*} value\n * @return {fabric.Ellipse} thisArg\n */\n _set: function(key, value) {\n this.callSuper('_set', key, value);\n switch (key) {\n\n case 'rx':\n this.rx = value;\n this.set('width', value * 2);\n break;\n\n case 'ry':\n this.ry = value;\n this.set('height', value * 2);\n break;\n\n }\n return this;\n },\n\n /**\n * Returns horizontal radius of an object (according to how an object is scaled)\n * @return {Number}\n */\n getRx: function() {\n return this.get('rx') * this.get('scaleX');\n },\n\n /**\n * Returns Vertical radius of an object (according to how an object is scaled)\n * @return {Number}\n */\n getRy: function() {\n return this.get('ry') * this.get('scaleY');\n },\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toObject: function(propertiesToInclude) {\n return this.callSuper('toObject', ['rx', 'ry'].concat(propertiesToInclude));\n },\n\n /* _TO_SVG_START_ */\n /**\n * Returns svg representation of an instance\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG: function() {\n return [\n '\\n'\n ];\n },\n /* _TO_SVG_END_ */\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx context to render on\n */\n _render: function(ctx) {\n ctx.beginPath();\n ctx.save();\n ctx.transform(1, 0, 0, this.ry / this.rx, 0, 0);\n ctx.arc(\n 0,\n 0,\n this.rx,\n 0,\n piBy2,\n false);\n ctx.restore();\n this._renderPaintInOrder(ctx);\n },\n });\n\n /* _FROM_SVG_START_ */\n /**\n * List of attribute names to account for when parsing SVG element (used by {@link fabric.Ellipse.fromElement})\n * @static\n * @memberOf fabric.Ellipse\n * @see http://www.w3.org/TR/SVG/shapes.html#EllipseElement\n */\n fabric.Ellipse.ATTRIBUTE_NAMES = fabric.SHARED_ATTRIBUTES.concat('cx cy rx ry'.split(' '));\n\n /**\n * Returns {@link fabric.Ellipse} instance from an SVG element\n * @static\n * @memberOf fabric.Ellipse\n * @param {SVGElement} element Element to parse\n * @param {Function} [callback] Options callback invoked after parsing is finished\n * @return {fabric.Ellipse}\n */\n fabric.Ellipse.fromElement = function(element, callback) {\n\n var parsedAttributes = fabric.parseAttributes(element, fabric.Ellipse.ATTRIBUTE_NAMES);\n\n parsedAttributes.left = (parsedAttributes.left || 0) - parsedAttributes.rx;\n parsedAttributes.top = (parsedAttributes.top || 0) - parsedAttributes.ry;\n callback(new fabric.Ellipse(parsedAttributes));\n };\n /* _FROM_SVG_END_ */\n\n /**\n * Returns {@link fabric.Ellipse} instance from an object representation\n * @static\n * @memberOf fabric.Ellipse\n * @param {Object} object Object to create an instance from\n * @param {function} [callback] invoked with new instance as first argument\n * @return {void}\n */\n fabric.Ellipse.fromObject = function(object, callback) {\n fabric.Object._fromObject('Ellipse', object, callback);\n };\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n extend = fabric.util.object.extend;\n\n if (fabric.Rect) {\n fabric.warn('fabric.Rect is already defined');\n return;\n }\n\n /**\n * Rectangle class\n * @class fabric.Rect\n * @extends fabric.Object\n * @return {fabric.Rect} thisArg\n * @see {@link fabric.Rect#initialize} for constructor definition\n */\n fabric.Rect = fabric.util.createClass(fabric.Object, /** @lends fabric.Rect.prototype */ {\n\n /**\n * List of properties to consider when checking if state of an object is changed ({@link fabric.Object#hasStateChanged})\n * as well as for history (undo/redo) purposes\n * @type Array\n */\n stateProperties: fabric.Object.prototype.stateProperties.concat('rx', 'ry'),\n\n /**\n * Type of an object\n * @type String\n * @default\n */\n type: 'rect',\n\n /**\n * Horizontal border radius\n * @type Number\n * @default\n */\n rx: 0,\n\n /**\n * Vertical border radius\n * @type Number\n * @default\n */\n ry: 0,\n\n cacheProperties: fabric.Object.prototype.cacheProperties.concat('rx', 'ry'),\n\n /**\n * Constructor\n * @param {Object} [options] Options object\n * @return {Object} thisArg\n */\n initialize: function(options) {\n this.callSuper('initialize', options);\n this._initRxRy();\n },\n\n /**\n * Initializes rx/ry attributes\n * @private\n */\n _initRxRy: function() {\n if (this.rx && !this.ry) {\n this.ry = this.rx;\n }\n else if (this.ry && !this.rx) {\n this.rx = this.ry;\n }\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _render: function(ctx) {\n\n // 1x1 case (used in spray brush) optimization was removed because\n // with caching and higher zoom level this makes more damage than help\n\n var rx = this.rx ? Math.min(this.rx, this.width / 2) : 0,\n ry = this.ry ? Math.min(this.ry, this.height / 2) : 0,\n w = this.width,\n h = this.height,\n x = -this.width / 2,\n y = -this.height / 2,\n isRounded = rx !== 0 || ry !== 0,\n /* \"magic number\" for bezier approximations of arcs (http://itc.ktu.lt/itc354/Riskus354.pdf) */\n k = 1 - 0.5522847498;\n ctx.beginPath();\n\n ctx.moveTo(x + rx, y);\n\n ctx.lineTo(x + w - rx, y);\n isRounded && ctx.bezierCurveTo(x + w - k * rx, y, x + w, y + k * ry, x + w, y + ry);\n\n ctx.lineTo(x + w, y + h - ry);\n isRounded && ctx.bezierCurveTo(x + w, y + h - k * ry, x + w - k * rx, y + h, x + w - rx, y + h);\n\n ctx.lineTo(x + rx, y + h);\n isRounded && ctx.bezierCurveTo(x + k * rx, y + h, x, y + h - k * ry, x, y + h - ry);\n\n ctx.lineTo(x, y + ry);\n isRounded && ctx.bezierCurveTo(x, y + k * ry, x + k * rx, y, x + rx, y);\n\n ctx.closePath();\n\n this._renderPaintInOrder(ctx);\n },\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toObject: function(propertiesToInclude) {\n return this.callSuper('toObject', ['rx', 'ry'].concat(propertiesToInclude));\n },\n\n /* _TO_SVG_START_ */\n /**\n * Returns svg representation of an instance\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG: function() {\n var x = -this.width / 2, y = -this.height / 2;\n return [\n '\\n'\n ];\n },\n /* _TO_SVG_END_ */\n });\n\n /* _FROM_SVG_START_ */\n /**\n * List of attribute names to account for when parsing SVG element (used by `fabric.Rect.fromElement`)\n * @static\n * @memberOf fabric.Rect\n * @see: http://www.w3.org/TR/SVG/shapes.html#RectElement\n */\n fabric.Rect.ATTRIBUTE_NAMES = fabric.SHARED_ATTRIBUTES.concat('x y rx ry width height'.split(' '));\n\n /**\n * Returns {@link fabric.Rect} instance from an SVG element\n * @static\n * @memberOf fabric.Rect\n * @param {SVGElement} element Element to parse\n * @param {Function} callback callback function invoked after parsing\n * @param {Object} [options] Options object\n */\n fabric.Rect.fromElement = function(element, callback, options) {\n if (!element) {\n return callback(null);\n }\n options = options || { };\n\n var parsedAttributes = fabric.parseAttributes(element, fabric.Rect.ATTRIBUTE_NAMES);\n parsedAttributes.left = parsedAttributes.left || 0;\n parsedAttributes.top = parsedAttributes.top || 0;\n parsedAttributes.height = parsedAttributes.height || 0;\n parsedAttributes.width = parsedAttributes.width || 0;\n var rect = new fabric.Rect(extend((options ? fabric.util.object.clone(options) : { }), parsedAttributes));\n rect.visible = rect.visible && rect.width > 0 && rect.height > 0;\n callback(rect);\n };\n /* _FROM_SVG_END_ */\n\n /**\n * Returns {@link fabric.Rect} instance from an object representation\n * @static\n * @memberOf fabric.Rect\n * @param {Object} object Object to create an instance from\n * @param {Function} [callback] Callback to invoke when an fabric.Rect instance is created\n */\n fabric.Rect.fromObject = function(object, callback) {\n return fabric.Object._fromObject('Rect', object, callback);\n };\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n extend = fabric.util.object.extend,\n min = fabric.util.array.min,\n max = fabric.util.array.max,\n toFixed = fabric.util.toFixed,\n projectStrokeOnPoints = fabric.util.projectStrokeOnPoints;\n\n if (fabric.Polyline) {\n fabric.warn('fabric.Polyline is already defined');\n return;\n }\n\n /**\n * Polyline class\n * @class fabric.Polyline\n * @extends fabric.Object\n * @see {@link fabric.Polyline#initialize} for constructor definition\n */\n fabric.Polyline = fabric.util.createClass(fabric.Object, /** @lends fabric.Polyline.prototype */ {\n\n /**\n * Type of an object\n * @type String\n * @default\n */\n type: 'polyline',\n\n /**\n * Points array\n * @type Array\n * @default\n */\n points: null,\n\n /**\n * WARNING: Feature in progress\n * Calculate the exact bounding box taking in account strokeWidth on acute angles\n * this will be turned to true by default on fabric 6.0\n * maybe will be left in as an optimization since calculations may be slow\n * @deprecated\n * @type Boolean\n * @default false\n */\n exactBoundingBox: false,\n\n cacheProperties: fabric.Object.prototype.cacheProperties.concat('points'),\n\n /**\n * Constructor\n * @param {Array} points Array of points (where each point is an object with x and y)\n * @param {Object} [options] Options object\n * @return {fabric.Polyline} thisArg\n * @example\n * var poly = new fabric.Polyline([\n * { x: 10, y: 10 },\n * { x: 50, y: 30 },\n * { x: 40, y: 70 },\n * { x: 60, y: 50 },\n * { x: 100, y: 150 },\n * { x: 40, y: 100 }\n * ], {\n * stroke: 'red',\n * left: 100,\n * top: 100\n * });\n */\n initialize: function(points, options) {\n options = options || {};\n this.points = points || [];\n this.callSuper('initialize', options);\n this._setPositionDimensions(options);\n },\n\n /**\n * @private\n */\n _projectStrokeOnPoints: function () {\n return projectStrokeOnPoints(this.points, this, true);\n },\n\n _setPositionDimensions: function(options) {\n var calcDim = this._calcDimensions(options), correctLeftTop,\n correctSize = this.exactBoundingBox ? this.strokeWidth : 0;\n this.width = calcDim.width - correctSize;\n this.height = calcDim.height - correctSize;\n if (!options.fromSVG) {\n correctLeftTop = this.translateToGivenOrigin(\n {\n // this looks bad, but is one way to keep it optional for now.\n x: calcDim.left - this.strokeWidth / 2 + correctSize / 2,\n y: calcDim.top - this.strokeWidth / 2 + correctSize / 2\n },\n 'left',\n 'top',\n this.originX,\n this.originY\n );\n }\n if (typeof options.left === 'undefined') {\n this.left = options.fromSVG ? calcDim.left : correctLeftTop.x;\n }\n if (typeof options.top === 'undefined') {\n this.top = options.fromSVG ? calcDim.top : correctLeftTop.y;\n }\n this.pathOffset = {\n x: calcDim.left + this.width / 2 + correctSize / 2,\n y: calcDim.top + this.height / 2 + correctSize / 2\n };\n },\n\n /**\n * Calculate the polygon min and max point from points array,\n * returning an object with left, top, width, height to measure the\n * polygon size\n * @return {Object} object.left X coordinate of the polygon leftmost point\n * @return {Object} object.top Y coordinate of the polygon topmost point\n * @return {Object} object.width distance between X coordinates of the polygon leftmost and rightmost point\n * @return {Object} object.height distance between Y coordinates of the polygon topmost and bottommost point\n * @private\n */\n _calcDimensions: function() {\n\n var points = this.exactBoundingBox ? this._projectStrokeOnPoints() : this.points,\n minX = min(points, 'x') || 0,\n minY = min(points, 'y') || 0,\n maxX = max(points, 'x') || 0,\n maxY = max(points, 'y') || 0,\n width = (maxX - minX),\n height = (maxY - minY);\n\n return {\n left: minX,\n top: minY,\n width: width,\n height: height,\n };\n },\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} Object representation of an instance\n */\n toObject: function(propertiesToInclude) {\n return extend(this.callSuper('toObject', propertiesToInclude), {\n points: this.points.concat()\n });\n },\n\n /* _TO_SVG_START_ */\n /**\n * Returns svg representation of an instance\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG: function() {\n var points = [], diffX = this.pathOffset.x, diffY = this.pathOffset.y,\n NUM_FRACTION_DIGITS = fabric.Object.NUM_FRACTION_DIGITS;\n\n for (var i = 0, len = this.points.length; i < len; i++) {\n points.push(\n toFixed(this.points[i].x - diffX, NUM_FRACTION_DIGITS), ',',\n toFixed(this.points[i].y - diffY, NUM_FRACTION_DIGITS), ' '\n );\n }\n return [\n '<' + this.type + ' ', 'COMMON_PARTS',\n 'points=\"', points.join(''),\n '\" />\\n'\n ];\n },\n /* _TO_SVG_END_ */\n\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n commonRender: function(ctx) {\n var point, len = this.points.length,\n x = this.pathOffset.x,\n y = this.pathOffset.y;\n\n if (!len || isNaN(this.points[len - 1].y)) {\n // do not draw if no points or odd points\n // NaN comes from parseFloat of a empty string in parser\n return false;\n }\n ctx.beginPath();\n ctx.moveTo(this.points[0].x - x, this.points[0].y - y);\n for (var i = 0; i < len; i++) {\n point = this.points[i];\n ctx.lineTo(point.x - x, point.y - y);\n }\n return true;\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _render: function(ctx) {\n if (!this.commonRender(ctx)) {\n return;\n }\n this._renderPaintInOrder(ctx);\n },\n\n /**\n * Returns complexity of an instance\n * @return {Number} complexity of this instance\n */\n complexity: function() {\n return this.get('points').length;\n }\n });\n\n /* _FROM_SVG_START_ */\n /**\n * List of attribute names to account for when parsing SVG element (used by {@link fabric.Polyline.fromElement})\n * @static\n * @memberOf fabric.Polyline\n * @see: http://www.w3.org/TR/SVG/shapes.html#PolylineElement\n */\n fabric.Polyline.ATTRIBUTE_NAMES = fabric.SHARED_ATTRIBUTES.concat();\n\n /**\n * Returns fabric.Polyline instance from an SVG element\n * @static\n * @memberOf fabric.Polyline\n * @param {SVGElement} element Element to parser\n * @param {Function} callback callback function invoked after parsing\n * @param {Object} [options] Options object\n */\n fabric.Polyline.fromElementGenerator = function(_class) {\n return function(element, callback, options) {\n if (!element) {\n return callback(null);\n }\n options || (options = { });\n\n var points = fabric.parsePointsAttribute(element.getAttribute('points')),\n parsedAttributes = fabric.parseAttributes(element, fabric[_class].ATTRIBUTE_NAMES);\n parsedAttributes.fromSVG = true;\n callback(new fabric[_class](points, extend(parsedAttributes, options)));\n };\n };\n\n fabric.Polyline.fromElement = fabric.Polyline.fromElementGenerator('Polyline');\n\n /* _FROM_SVG_END_ */\n\n /**\n * Returns fabric.Polyline instance from an object representation\n * @static\n * @memberOf fabric.Polyline\n * @param {Object} object Object to create an instance from\n * @param {Function} [callback] Callback to invoke when an fabric.Path instance is created\n */\n fabric.Polyline.fromObject = function(object, callback) {\n return fabric.Object._fromObject('Polyline', object, callback, 'points');\n };\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = {}),\n projectStrokeOnPoints = fabric.util.projectStrokeOnPoints;\n\n if (fabric.Polygon) {\n fabric.warn('fabric.Polygon is already defined');\n return;\n }\n\n /**\n * Polygon class\n * @class fabric.Polygon\n * @extends fabric.Polyline\n * @see {@link fabric.Polygon#initialize} for constructor definition\n */\n fabric.Polygon = fabric.util.createClass(fabric.Polyline, /** @lends fabric.Polygon.prototype */ {\n\n /**\n * Type of an object\n * @type String\n * @default\n */\n type: 'polygon',\n\n /**\n * @private\n */\n _projectStrokeOnPoints: function () {\n return projectStrokeOnPoints(this.points, this);\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _render: function(ctx) {\n if (!this.commonRender(ctx)) {\n return;\n }\n ctx.closePath();\n this._renderPaintInOrder(ctx);\n },\n\n });\n\n /* _FROM_SVG_START_ */\n /**\n * List of attribute names to account for when parsing SVG element (used by `fabric.Polygon.fromElement`)\n * @static\n * @memberOf fabric.Polygon\n * @see: http://www.w3.org/TR/SVG/shapes.html#PolygonElement\n */\n fabric.Polygon.ATTRIBUTE_NAMES = fabric.SHARED_ATTRIBUTES.concat();\n\n /**\n * Returns {@link fabric.Polygon} instance from an SVG element\n * @static\n * @memberOf fabric.Polygon\n * @param {SVGElement} element Element to parse\n * @param {Function} callback callback function invoked after parsing\n * @param {Object} [options] Options object\n */\n fabric.Polygon.fromElement = fabric.Polyline.fromElementGenerator('Polygon');\n /* _FROM_SVG_END_ */\n\n /**\n * Returns fabric.Polygon instance from an object representation\n * @static\n * @memberOf fabric.Polygon\n * @param {Object} object Object to create an instance from\n * @param {Function} [callback] Callback to invoke when an fabric.Path instance is created\n * @return {void}\n */\n fabric.Polygon.fromObject = function(object, callback) {\n fabric.Object._fromObject('Polygon', object, callback, 'points');\n };\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n min = fabric.util.array.min,\n max = fabric.util.array.max,\n extend = fabric.util.object.extend,\n clone = fabric.util.object.clone,\n toFixed = fabric.util.toFixed;\n\n if (fabric.Path) {\n fabric.warn('fabric.Path is already defined');\n return;\n }\n\n /**\n * Path class\n * @class fabric.Path\n * @extends fabric.Object\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-1#path_and_pathgroup}\n * @see {@link fabric.Path#initialize} for constructor definition\n */\n fabric.Path = fabric.util.createClass(fabric.Object, /** @lends fabric.Path.prototype */ {\n\n /**\n * Type of an object\n * @type String\n * @default\n */\n type: 'path',\n\n /**\n * Array of path points\n * @type Array\n * @default\n */\n path: null,\n\n cacheProperties: fabric.Object.prototype.cacheProperties.concat('path', 'fillRule'),\n\n stateProperties: fabric.Object.prototype.stateProperties.concat('path'),\n\n /**\n * Constructor\n * @param {Array|String} path Path data (sequence of coordinates and corresponding \"command\" tokens)\n * @param {Object} [options] Options object\n * @return {fabric.Path} thisArg\n */\n initialize: function (path, options) {\n options = clone(options || {});\n delete options.path;\n this.callSuper('initialize', options);\n this._setPath(path || [], options);\n },\n\n /**\n * @private\n * @param {Array|String} path Path data (sequence of coordinates and corresponding \"command\" tokens)\n * @param {Object} [options] Options object\n */\n _setPath: function (path, options) {\n this.path = fabric.util.makePathSimpler(\n Array.isArray(path) ? path : fabric.util.parsePath(path)\n );\n\n fabric.Polyline.prototype._setPositionDimensions.call(this, options || {});\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx context to render path on\n */\n _renderPathCommands: function(ctx) {\n var current, // current instruction\n subpathStartX = 0,\n subpathStartY = 0,\n x = 0, // current x\n y = 0, // current y\n controlX = 0, // current control point x\n controlY = 0, // current control point y\n l = -this.pathOffset.x,\n t = -this.pathOffset.y;\n\n ctx.beginPath();\n\n for (var i = 0, len = this.path.length; i < len; ++i) {\n\n current = this.path[i];\n\n switch (current[0]) { // first letter\n\n case 'L': // lineto, absolute\n x = current[1];\n y = current[2];\n ctx.lineTo(x + l, y + t);\n break;\n\n case 'M': // moveTo, absolute\n x = current[1];\n y = current[2];\n subpathStartX = x;\n subpathStartY = y;\n ctx.moveTo(x + l, y + t);\n break;\n\n case 'C': // bezierCurveTo, absolute\n x = current[5];\n y = current[6];\n controlX = current[3];\n controlY = current[4];\n ctx.bezierCurveTo(\n current[1] + l,\n current[2] + t,\n controlX + l,\n controlY + t,\n x + l,\n y + t\n );\n break;\n\n case 'Q': // quadraticCurveTo, absolute\n ctx.quadraticCurveTo(\n current[1] + l,\n current[2] + t,\n current[3] + l,\n current[4] + t\n );\n x = current[3];\n y = current[4];\n controlX = current[1];\n controlY = current[2];\n break;\n\n case 'z':\n case 'Z':\n x = subpathStartX;\n y = subpathStartY;\n ctx.closePath();\n break;\n }\n }\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx context to render path on\n */\n _render: function(ctx) {\n this._renderPathCommands(ctx);\n this._renderPaintInOrder(ctx);\n },\n\n /**\n * Returns string representation of an instance\n * @return {String} string representation of an instance\n */\n toString: function() {\n return '#';\n },\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toObject: function(propertiesToInclude) {\n return extend(this.callSuper('toObject', propertiesToInclude), {\n path: this.path.map(function(item) { return item.slice(); }),\n });\n },\n\n /**\n * Returns dataless object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toDatalessObject: function(propertiesToInclude) {\n var o = this.toObject(['sourcePath'].concat(propertiesToInclude));\n if (o.sourcePath) {\n delete o.path;\n }\n return o;\n },\n\n /* _TO_SVG_START_ */\n /**\n * Returns svg representation of an instance\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG: function() {\n var path = fabric.util.joinPath(this.path);\n return [\n '\\n'\n ];\n },\n\n _getOffsetTransform: function() {\n var digits = fabric.Object.NUM_FRACTION_DIGITS;\n return ' translate(' + toFixed(-this.pathOffset.x, digits) + ', ' +\n toFixed(-this.pathOffset.y, digits) + ')';\n },\n\n /**\n * Returns svg clipPath representation of an instance\n * @param {Function} [reviver] Method for further parsing of svg representation.\n * @return {String} svg representation of an instance\n */\n toClipPathSVG: function(reviver) {\n var additionalTransform = this._getOffsetTransform();\n return '\\t' + this._createBaseClipPathSVGMarkup(\n this._toSVG(), { reviver: reviver, additionalTransform: additionalTransform }\n );\n },\n\n /**\n * Returns svg representation of an instance\n * @param {Function} [reviver] Method for further parsing of svg representation.\n * @return {String} svg representation of an instance\n */\n toSVG: function(reviver) {\n var additionalTransform = this._getOffsetTransform();\n return this._createBaseSVGMarkup(this._toSVG(), { reviver: reviver, additionalTransform: additionalTransform });\n },\n /* _TO_SVG_END_ */\n\n /**\n * Returns number representation of an instance complexity\n * @return {Number} complexity of this instance\n */\n complexity: function() {\n return this.path.length;\n },\n\n /**\n * @private\n */\n _calcDimensions: function() {\n\n var aX = [],\n aY = [],\n current, // current instruction\n subpathStartX = 0,\n subpathStartY = 0,\n x = 0, // current x\n y = 0, // current y\n bounds;\n\n for (var i = 0, len = this.path.length; i < len; ++i) {\n\n current = this.path[i];\n\n switch (current[0]) { // first letter\n\n case 'L': // lineto, absolute\n x = current[1];\n y = current[2];\n bounds = [];\n break;\n\n case 'M': // moveTo, absolute\n x = current[1];\n y = current[2];\n subpathStartX = x;\n subpathStartY = y;\n bounds = [];\n break;\n\n case 'C': // bezierCurveTo, absolute\n bounds = fabric.util.getBoundsOfCurve(x, y,\n current[1],\n current[2],\n current[3],\n current[4],\n current[5],\n current[6]\n );\n x = current[5];\n y = current[6];\n break;\n\n case 'Q': // quadraticCurveTo, absolute\n bounds = fabric.util.getBoundsOfCurve(x, y,\n current[1],\n current[2],\n current[1],\n current[2],\n current[3],\n current[4]\n );\n x = current[3];\n y = current[4];\n break;\n\n case 'z':\n case 'Z':\n x = subpathStartX;\n y = subpathStartY;\n break;\n }\n bounds.forEach(function (point) {\n aX.push(point.x);\n aY.push(point.y);\n });\n aX.push(x);\n aY.push(y);\n }\n\n var minX = min(aX) || 0,\n minY = min(aY) || 0,\n maxX = max(aX) || 0,\n maxY = max(aY) || 0,\n deltaX = maxX - minX,\n deltaY = maxY - minY;\n\n return {\n left: minX,\n top: minY,\n width: deltaX,\n height: deltaY\n };\n }\n });\n\n /**\n * Creates an instance of fabric.Path from an object\n * @static\n * @memberOf fabric.Path\n * @param {Object} object\n * @param {Function} [callback] Callback to invoke when an fabric.Path instance is created\n */\n fabric.Path.fromObject = function(object, callback) {\n if (typeof object.sourcePath === 'string') {\n var pathUrl = object.sourcePath;\n fabric.loadSVGFromURL(pathUrl, function (elements) {\n var path = elements[0];\n path.setOptions(object);\n if (object.clipPath) {\n fabric.util.enlivenObjects([object.clipPath], function(elivenedObjects) {\n path.clipPath = elivenedObjects[0];\n callback && callback(path);\n });\n }\n else {\n callback && callback(path);\n }\n });\n }\n else {\n fabric.Object._fromObject('Path', object, callback, 'path');\n }\n };\n\n /* _FROM_SVG_START_ */\n /**\n * List of attribute names to account for when parsing SVG element (used by `fabric.Path.fromElement`)\n * @static\n * @memberOf fabric.Path\n * @see http://www.w3.org/TR/SVG/paths.html#PathElement\n */\n fabric.Path.ATTRIBUTE_NAMES = fabric.SHARED_ATTRIBUTES.concat(['d']);\n\n /**\n * Creates an instance of fabric.Path from an SVG element\n * @static\n * @memberOf fabric.Path\n * @param {SVGElement} element to parse\n * @param {Function} callback Callback to invoke when an fabric.Path instance is created\n * @param {Object} [options] Options object\n * @param {Function} [callback] Options callback invoked after parsing is finished\n */\n fabric.Path.fromElement = function(element, callback, options) {\n var parsedAttributes = fabric.parseAttributes(element, fabric.Path.ATTRIBUTE_NAMES);\n parsedAttributes.fromSVG = true;\n callback(new fabric.Path(parsedAttributes.d, extend(parsedAttributes, options)));\n };\n /* _FROM_SVG_END_ */\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n min = fabric.util.array.min,\n max = fabric.util.array.max;\n\n if (fabric.Group) {\n return;\n }\n\n /**\n * Group class\n * @class fabric.Group\n * @extends fabric.Object\n * @mixes fabric.Collection\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-3#groups}\n * @see {@link fabric.Group#initialize} for constructor definition\n */\n fabric.Group = fabric.util.createClass(fabric.Object, fabric.Collection, /** @lends fabric.Group.prototype */ {\n\n /**\n * Type of an object\n * @type String\n * @default\n */\n type: 'group',\n\n /**\n * Width of stroke\n * @type Number\n * @default\n */\n strokeWidth: 0,\n\n /**\n * Indicates if click, mouseover, mouseout events & hoverCursor should also check for subtargets\n * @type Boolean\n * @default\n */\n subTargetCheck: false,\n\n /**\n * Groups are container, do not render anything on theyr own, ence no cache properties\n * @type Array\n * @default\n */\n cacheProperties: [],\n\n /**\n * setOnGroup is a method used for TextBox that is no more used since 2.0.0 The behavior is still\n * available setting this boolean to true.\n * @type Boolean\n * @since 2.0.0\n * @default\n */\n useSetOnGroup: false,\n\n /**\n * Constructor\n * @param {Object} objects Group objects\n * @param {Object} [options] Options object\n * @param {Boolean} [isAlreadyGrouped] if true, objects have been grouped already.\n * @return {Object} thisArg\n */\n initialize: function(objects, options, isAlreadyGrouped) {\n options = options || {};\n this._objects = [];\n // if objects enclosed in a group have been grouped already,\n // we cannot change properties of objects.\n // Thus we need to set options to group without objects,\n isAlreadyGrouped && this.callSuper('initialize', options);\n this._objects = objects || [];\n for (var i = this._objects.length; i--; ) {\n this._objects[i].group = this;\n }\n\n if (!isAlreadyGrouped) {\n var center = options && options.centerPoint;\n // we want to set origins before calculating the bounding box.\n // so that the topleft can be set with that in mind.\n // if specific top and left are passed, are overwritten later\n // with the callSuper('initialize', options)\n if (options.originX !== undefined) {\n this.originX = options.originX;\n }\n if (options.originY !== undefined) {\n this.originY = options.originY;\n }\n // if coming from svg i do not want to calc bounds.\n // i assume width and height are passed along options\n center || this._calcBounds();\n this._updateObjectsCoords(center);\n delete options.centerPoint;\n this.callSuper('initialize', options);\n }\n else {\n this._updateObjectsACoords();\n }\n\n this.setCoords();\n },\n\n /**\n * @private\n */\n _updateObjectsACoords: function() {\n var skipControls = true;\n for (var i = this._objects.length; i--; ){\n this._objects[i].setCoords(skipControls);\n }\n },\n\n /**\n * @private\n * @param {Boolean} [skipCoordsChange] if true, coordinates of objects enclosed in a group do not change\n */\n _updateObjectsCoords: function(center) {\n var center = center || this.getCenterPoint();\n for (var i = this._objects.length; i--; ){\n this._updateObjectCoords(this._objects[i], center);\n }\n },\n\n /**\n * @private\n * @param {Object} object\n * @param {fabric.Point} center, current center of group.\n */\n _updateObjectCoords: function(object, center) {\n var objectLeft = object.left,\n objectTop = object.top,\n skipControls = true;\n\n object.set({\n left: objectLeft - center.x,\n top: objectTop - center.y\n });\n object.group = this;\n object.setCoords(skipControls);\n },\n\n /**\n * Returns string represenation of a group\n * @return {String}\n */\n toString: function() {\n return '#';\n },\n\n /**\n * Adds an object to a group; Then recalculates group's dimension, position.\n * @param {Object} object\n * @return {fabric.Group} thisArg\n * @chainable\n */\n addWithUpdate: function(object) {\n var nested = !!this.group;\n this._restoreObjectsState();\n fabric.util.resetObjectTransform(this);\n if (object) {\n if (nested) {\n // if this group is inside another group, we need to pre transform the object\n fabric.util.removeTransformFromObject(object, this.group.calcTransformMatrix());\n }\n this._objects.push(object);\n object.group = this;\n object._set('canvas', this.canvas);\n }\n this._calcBounds();\n this._updateObjectsCoords();\n this.dirty = true;\n if (nested) {\n this.group.addWithUpdate();\n }\n else {\n this.setCoords();\n }\n return this;\n },\n\n /**\n * Removes an object from a group; Then recalculates group's dimension, position.\n * @param {Object} object\n * @return {fabric.Group} thisArg\n * @chainable\n */\n removeWithUpdate: function(object) {\n this._restoreObjectsState();\n fabric.util.resetObjectTransform(this);\n\n this.remove(object);\n this._calcBounds();\n this._updateObjectsCoords();\n this.setCoords();\n this.dirty = true;\n return this;\n },\n\n /**\n * @private\n */\n _onObjectAdded: function(object) {\n this.dirty = true;\n object.group = this;\n object._set('canvas', this.canvas);\n },\n\n /**\n * @private\n */\n _onObjectRemoved: function(object) {\n this.dirty = true;\n delete object.group;\n },\n\n /**\n * @private\n */\n _set: function(key, value) {\n var i = this._objects.length;\n if (this.useSetOnGroup) {\n while (i--) {\n this._objects[i].setOnGroup(key, value);\n }\n }\n if (key === 'canvas') {\n while (i--) {\n this._objects[i]._set(key, value);\n }\n }\n fabric.Object.prototype._set.call(this, key, value);\n },\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toObject: function(propertiesToInclude) {\n var _includeDefaultValues = this.includeDefaultValues;\n var objsToObject = this._objects\n .filter(function (obj) {\n return !obj.excludeFromExport;\n })\n .map(function (obj) {\n var originalDefaults = obj.includeDefaultValues;\n obj.includeDefaultValues = _includeDefaultValues;\n var _obj = obj.toObject(propertiesToInclude);\n obj.includeDefaultValues = originalDefaults;\n return _obj;\n });\n var obj = fabric.Object.prototype.toObject.call(this, propertiesToInclude);\n obj.objects = objsToObject;\n return obj;\n },\n\n /**\n * Returns object representation of an instance, in dataless mode.\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toDatalessObject: function(propertiesToInclude) {\n var objsToObject, sourcePath = this.sourcePath;\n if (sourcePath) {\n objsToObject = sourcePath;\n }\n else {\n var _includeDefaultValues = this.includeDefaultValues;\n objsToObject = this._objects.map(function(obj) {\n var originalDefaults = obj.includeDefaultValues;\n obj.includeDefaultValues = _includeDefaultValues;\n var _obj = obj.toDatalessObject(propertiesToInclude);\n obj.includeDefaultValues = originalDefaults;\n return _obj;\n });\n }\n var obj = fabric.Object.prototype.toDatalessObject.call(this, propertiesToInclude);\n obj.objects = objsToObject;\n return obj;\n },\n\n /**\n * Renders instance on a given context\n * @param {CanvasRenderingContext2D} ctx context to render instance on\n */\n render: function(ctx) {\n this._transformDone = true;\n this.callSuper('render', ctx);\n this._transformDone = false;\n },\n\n /**\n * Decide if the object should cache or not. Create its own cache level\n * needsItsOwnCache should be used when the object drawing method requires\n * a cache step. None of the fabric classes requires it.\n * Generally you do not cache objects in groups because the group is already cached.\n * @return {Boolean}\n */\n shouldCache: function() {\n var ownCache = fabric.Object.prototype.shouldCache.call(this);\n if (ownCache) {\n for (var i = 0, len = this._objects.length; i < len; i++) {\n if (this._objects[i].willDrawShadow()) {\n this.ownCaching = false;\n return false;\n }\n }\n }\n return ownCache;\n },\n\n /**\n * Check if this object or a child object will cast a shadow\n * @return {Boolean}\n */\n willDrawShadow: function() {\n if (fabric.Object.prototype.willDrawShadow.call(this)) {\n return true;\n }\n for (var i = 0, len = this._objects.length; i < len; i++) {\n if (this._objects[i].willDrawShadow()) {\n return true;\n }\n }\n return false;\n },\n\n /**\n * Check if this group or its parent group are caching, recursively up\n * @return {Boolean}\n */\n isOnACache: function() {\n return this.ownCaching || (this.group && this.group.isOnACache());\n },\n\n /**\n * Execute the drawing operation for an object on a specified context\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n drawObject: function(ctx) {\n for (var i = 0, len = this._objects.length; i < len; i++) {\n this._objects[i].render(ctx);\n }\n this._drawClipPath(ctx, this.clipPath);\n },\n\n /**\n * Check if cache is dirty\n */\n isCacheDirty: function(skipCanvas) {\n if (this.callSuper('isCacheDirty', skipCanvas)) {\n return true;\n }\n if (!this.statefullCache) {\n return false;\n }\n for (var i = 0, len = this._objects.length; i < len; i++) {\n if (this._objects[i].isCacheDirty(true)) {\n if (this._cacheCanvas) {\n // if this group has not a cache canvas there is nothing to clean\n var x = this.cacheWidth / this.zoomX, y = this.cacheHeight / this.zoomY;\n this._cacheContext.clearRect(-x / 2, -y / 2, x, y);\n }\n return true;\n }\n }\n return false;\n },\n\n /**\n * Restores original state of each of group objects (original state is that which was before group was created).\n * if the nested boolean is true, the original state will be restored just for the\n * first group and not for all the group chain\n * @private\n * @param {Boolean} nested tell the function to restore object state up to the parent group and not more\n * @return {fabric.Group} thisArg\n * @chainable\n */\n _restoreObjectsState: function() {\n var groupMatrix = this.calcOwnMatrix();\n this._objects.forEach(function(object) {\n // instead of using _this = this;\n fabric.util.addTransformToObject(object, groupMatrix);\n delete object.group;\n object.setCoords();\n });\n return this;\n },\n\n /**\n * Destroys a group (restoring state of its objects)\n * @return {fabric.Group} thisArg\n * @chainable\n */\n destroy: function() {\n // when group is destroyed objects needs to get a repaint to be eventually\n // displayed on canvas.\n this._objects.forEach(function(object) {\n object.set('dirty', true);\n });\n return this._restoreObjectsState();\n },\n\n dispose: function () {\n this.callSuper('dispose');\n this.forEachObject(function (object) {\n object.dispose && object.dispose();\n });\n this._objects = [];\n },\n\n /**\n * make a group an active selection, remove the group from canvas\n * the group has to be on canvas for this to work.\n * @return {fabric.ActiveSelection} thisArg\n * @chainable\n */\n toActiveSelection: function() {\n if (!this.canvas) {\n return;\n }\n var objects = this._objects, canvas = this.canvas;\n this._objects = [];\n var options = this.toObject();\n delete options.objects;\n var activeSelection = new fabric.ActiveSelection([]);\n activeSelection.set(options);\n activeSelection.type = 'activeSelection';\n canvas.remove(this);\n objects.forEach(function(object) {\n object.group = activeSelection;\n object.dirty = true;\n canvas.add(object);\n });\n activeSelection.canvas = canvas;\n activeSelection._objects = objects;\n canvas._activeObject = activeSelection;\n activeSelection.setCoords();\n return activeSelection;\n },\n\n /**\n * Destroys a group (restoring state of its objects)\n * @return {fabric.Group} thisArg\n * @chainable\n */\n ungroupOnCanvas: function() {\n return this._restoreObjectsState();\n },\n\n /**\n * Sets coordinates of all objects inside group\n * @return {fabric.Group} thisArg\n * @chainable\n */\n setObjectsCoords: function() {\n var skipControls = true;\n this.forEachObject(function(object) {\n object.setCoords(skipControls);\n });\n return this;\n },\n\n /**\n * @private\n */\n _calcBounds: function(onlyWidthHeight) {\n var aX = [],\n aY = [],\n o, prop, coords,\n props = ['tr', 'br', 'bl', 'tl'],\n i = 0, iLen = this._objects.length,\n j, jLen = props.length;\n\n for ( ; i < iLen; ++i) {\n o = this._objects[i];\n coords = o.calcACoords();\n for (j = 0; j < jLen; j++) {\n prop = props[j];\n aX.push(coords[prop].x);\n aY.push(coords[prop].y);\n }\n o.aCoords = coords;\n }\n\n this._getBounds(aX, aY, onlyWidthHeight);\n },\n\n /**\n * @private\n */\n _getBounds: function(aX, aY, onlyWidthHeight) {\n var minXY = new fabric.Point(min(aX), min(aY)),\n maxXY = new fabric.Point(max(aX), max(aY)),\n top = minXY.y || 0, left = minXY.x || 0,\n width = (maxXY.x - minXY.x) || 0,\n height = (maxXY.y - minXY.y) || 0;\n this.width = width;\n this.height = height;\n if (!onlyWidthHeight) {\n // the bounding box always finds the topleft most corner.\n // whatever is the group origin, we set up here the left/top position.\n this.setPositionByOrigin({ x: left, y: top }, 'left', 'top');\n }\n },\n\n /* _TO_SVG_START_ */\n /**\n * Returns svg representation of an instance\n * @param {Function} [reviver] Method for further parsing of svg representation.\n * @return {String} svg representation of an instance\n */\n _toSVG: function(reviver) {\n var svgString = ['\\n'];\n\n for (var i = 0, len = this._objects.length; i < len; i++) {\n svgString.push('\\t\\t', this._objects[i].toSVG(reviver));\n }\n svgString.push('\\n');\n return svgString;\n },\n\n /**\n * Returns styles-string for svg-export, specific version for group\n * @return {String}\n */\n getSvgStyles: function() {\n var opacity = typeof this.opacity !== 'undefined' && this.opacity !== 1 ?\n 'opacity: ' + this.opacity + ';' : '',\n visibility = this.visible ? '' : ' visibility: hidden;';\n return [\n opacity,\n this.getSvgFilter(),\n visibility\n ].join('');\n },\n\n /**\n * Returns svg clipPath representation of an instance\n * @param {Function} [reviver] Method for further parsing of svg representation.\n * @return {String} svg representation of an instance\n */\n toClipPathSVG: function(reviver) {\n var svgString = [];\n\n for (var i = 0, len = this._objects.length; i < len; i++) {\n svgString.push('\\t', this._objects[i].toClipPathSVG(reviver));\n }\n\n return this._createBaseClipPathSVGMarkup(svgString, { reviver: reviver });\n },\n /* _TO_SVG_END_ */\n });\n\n /**\n * Returns {@link fabric.Group} instance from an object representation\n * @static\n * @memberOf fabric.Group\n * @param {Object} object Object to create a group from\n * @param {Function} [callback] Callback to invoke when an group instance is created\n */\n fabric.Group.fromObject = function(object, callback) {\n var objects = object.objects,\n options = fabric.util.object.clone(object, true);\n delete options.objects;\n if (typeof objects === 'string') {\n // it has to be an url or something went wrong.\n fabric.loadSVGFromURL(objects, function (elements) {\n var group = fabric.util.groupSVGElements(elements, object, objects);\n var clipPath = options.clipPath;\n delete options.clipPath;\n group.set(options);\n if (clipPath) {\n fabric.util.enlivenObjects([clipPath], function(elivenedObjects) {\n group.clipPath = elivenedObjects[0];\n callback && callback(group);\n });\n }\n else {\n callback && callback(group);\n }\n });\n return;\n }\n fabric.util.enlivenObjects(objects, function (enlivenedObjects) {\n fabric.util.enlivenObjectEnlivables(object, options, function () {\n callback && callback(new fabric.Group(enlivenedObjects, options, true));\n });\n });\n };\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { });\n\n if (fabric.ActiveSelection) {\n return;\n }\n\n /**\n * Group class\n * @class fabric.ActiveSelection\n * @extends fabric.Group\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-3#groups}\n * @see {@link fabric.ActiveSelection#initialize} for constructor definition\n */\n fabric.ActiveSelection = fabric.util.createClass(fabric.Group, /** @lends fabric.ActiveSelection.prototype */ {\n\n /**\n * Type of an object\n * @type String\n * @default\n */\n type: 'activeSelection',\n\n /**\n * Constructor\n * @param {Object} objects ActiveSelection objects\n * @param {Object} [options] Options object\n * @return {Object} thisArg\n */\n initialize: function(objects, options) {\n options = options || {};\n this._objects = objects || [];\n for (var i = this._objects.length; i--; ) {\n this._objects[i].group = this;\n }\n\n if (options.originX) {\n this.originX = options.originX;\n }\n if (options.originY) {\n this.originY = options.originY;\n }\n this._calcBounds();\n this._updateObjectsCoords();\n fabric.Object.prototype.initialize.call(this, options);\n this.setCoords();\n },\n\n /**\n * Change te activeSelection to a normal group,\n * High level function that automatically adds it to canvas as\n * active object. no events fired.\n * @since 2.0.0\n * @return {fabric.Group}\n */\n toGroup: function() {\n var objects = this._objects.concat();\n this._objects = [];\n var options = fabric.Object.prototype.toObject.call(this);\n var newGroup = new fabric.Group([]);\n delete options.type;\n newGroup.set(options);\n objects.forEach(function(object) {\n object.canvas.remove(object);\n object.group = newGroup;\n });\n newGroup._objects = objects;\n if (!this.canvas) {\n return newGroup;\n }\n var canvas = this.canvas;\n canvas.add(newGroup);\n canvas._activeObject = newGroup;\n newGroup.setCoords();\n return newGroup;\n },\n\n /**\n * If returns true, deselection is cancelled.\n * @since 2.0.0\n * @return {Boolean} [cancel]\n */\n onDeselect: function() {\n this.destroy();\n return false;\n },\n\n /**\n * Returns string representation of a group\n * @return {String}\n */\n toString: function() {\n return '#';\n },\n\n /**\n * Decide if the object should cache or not. Create its own cache level\n * objectCaching is a global flag, wins over everything\n * needsItsOwnCache should be used when the object drawing method requires\n * a cache step. None of the fabric classes requires it.\n * Generally you do not cache objects in groups because the group outside is cached.\n * @return {Boolean}\n */\n shouldCache: function() {\n return false;\n },\n\n /**\n * Check if this group or its parent group are caching, recursively up\n * @return {Boolean}\n */\n isOnACache: function() {\n return false;\n },\n\n /**\n * Renders controls and borders for the object\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {Object} [styleOverride] properties to override the object style\n * @param {Object} [childrenOverride] properties to override the children overrides\n */\n _renderControls: function(ctx, styleOverride, childrenOverride) {\n ctx.save();\n ctx.globalAlpha = this.isMoving ? this.borderOpacityWhenMoving : 1;\n this.callSuper('_renderControls', ctx, styleOverride);\n childrenOverride = childrenOverride || { };\n if (typeof childrenOverride.hasControls === 'undefined') {\n childrenOverride.hasControls = false;\n }\n childrenOverride.forActiveSelection = true;\n for (var i = 0, len = this._objects.length; i < len; i++) {\n this._objects[i]._renderControls(ctx, childrenOverride);\n }\n ctx.restore();\n },\n });\n\n /**\n * Returns {@link fabric.ActiveSelection} instance from an object representation\n * @static\n * @memberOf fabric.ActiveSelection\n * @param {Object} object Object to create a group from\n * @param {Function} [callback] Callback to invoke when an ActiveSelection instance is created\n */\n fabric.ActiveSelection.fromObject = function(object, callback) {\n fabric.util.enlivenObjects(object.objects, function(enlivenedObjects) {\n delete object.objects;\n callback && callback(new fabric.ActiveSelection(enlivenedObjects, object, true));\n });\n };\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var extend = fabric.util.object.extend;\n\n if (!global.fabric) {\n global.fabric = { };\n }\n\n if (global.fabric.Image) {\n fabric.warn('fabric.Image is already defined.');\n return;\n }\n\n /**\n * Image class\n * @class fabric.Image\n * @extends fabric.Object\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-1#images}\n * @see {@link fabric.Image#initialize} for constructor definition\n */\n fabric.Image = fabric.util.createClass(fabric.Object, /** @lends fabric.Image.prototype */ {\n\n /**\n * Type of an object\n * @type String\n * @default\n */\n type: 'image',\n\n /**\n * Width of a stroke.\n * For image quality a stroke multiple of 2 gives better results.\n * @type Number\n * @default\n */\n strokeWidth: 0,\n\n /**\n * When calling {@link fabric.Image.getSrc}, return value from element src with `element.getAttribute('src')`.\n * This allows for relative urls as image src.\n * @since 2.7.0\n * @type Boolean\n * @default\n */\n srcFromAttribute: false,\n\n /**\n * private\n * contains last value of scaleX to detect\n * if the Image got resized after the last Render\n * @type Number\n */\n _lastScaleX: 1,\n\n /**\n * private\n * contains last value of scaleY to detect\n * if the Image got resized after the last Render\n * @type Number\n */\n _lastScaleY: 1,\n\n /**\n * private\n * contains last value of scaling applied by the apply filter chain\n * @type Number\n */\n _filterScalingX: 1,\n\n /**\n * private\n * contains last value of scaling applied by the apply filter chain\n * @type Number\n */\n _filterScalingY: 1,\n\n /**\n * minimum scale factor under which any resizeFilter is triggered to resize the image\n * 0 will disable the automatic resize. 1 will trigger automatically always.\n * number bigger than 1 are not implemented yet.\n * @type Number\n */\n minimumScaleTrigger: 0.5,\n\n /**\n * List of properties to consider when checking if\n * state of an object is changed ({@link fabric.Object#hasStateChanged})\n * as well as for history (undo/redo) purposes\n * @type Array\n */\n stateProperties: fabric.Object.prototype.stateProperties.concat('cropX', 'cropY'),\n\n /**\n * List of properties to consider when checking if cache needs refresh\n * Those properties are checked by statefullCache ON ( or lazy mode if we want ) or from single\n * calls to Object.set(key, value). If the key is in this list, the object is marked as dirty\n * and refreshed at the next render\n * @type Array\n */\n cacheProperties: fabric.Object.prototype.cacheProperties.concat('cropX', 'cropY'),\n\n /**\n * key used to retrieve the texture representing this image\n * @since 2.0.0\n * @type String\n * @default\n */\n cacheKey: '',\n\n /**\n * Image crop in pixels from original image size.\n * @since 2.0.0\n * @type Number\n * @default\n */\n cropX: 0,\n\n /**\n * Image crop in pixels from original image size.\n * @since 2.0.0\n * @type Number\n * @default\n */\n cropY: 0,\n\n /**\n * Indicates whether this canvas will use image smoothing when painting this image.\n * Also influence if the cacheCanvas for this image uses imageSmoothing\n * @since 4.0.0-beta.11\n * @type Boolean\n * @default\n */\n imageSmoothing: true,\n\n /**\n * Constructor\n * Image can be initialized with any canvas drawable or a string.\n * The string should be a url and will be loaded as an image.\n * Canvas and Image element work out of the box, while videos require extra code to work.\n * Please check video element events for seeking.\n * @param {HTMLImageElement | HTMLCanvasElement | HTMLVideoElement | String} element Image element\n * @param {Object} [options] Options object\n * @param {function} [callback] callback function to call after eventual filters applied.\n * @return {fabric.Image} thisArg\n */\n initialize: function(element, options) {\n options || (options = { });\n this.filters = [];\n this.cacheKey = 'texture' + fabric.Object.__uid++;\n this.callSuper('initialize', options);\n this._initElement(element, options);\n },\n\n /**\n * Returns image element which this instance if based on\n * @return {HTMLImageElement} Image element\n */\n getElement: function() {\n return this._element || {};\n },\n\n /**\n * Sets image element for this instance to a specified one.\n * If filters defined they are applied to new image.\n * You might need to call `canvas.renderAll` and `object.setCoords` after replacing, to render new image and update controls area.\n * @param {HTMLImageElement} element\n * @param {Object} [options] Options object\n * @return {fabric.Image} thisArg\n * @chainable\n */\n setElement: function(element, options) {\n this.removeTexture(this.cacheKey);\n this.removeTexture(this.cacheKey + '_filtered');\n this._element = element;\n this._originalElement = element;\n this._initConfig(options);\n if (this.filters.length !== 0) {\n this.applyFilters();\n }\n // resizeFilters work on the already filtered copy.\n // we need to apply resizeFilters AFTER normal filters.\n // applyResizeFilters is run more often than normal filters\n // and is triggered by user interactions rather than dev code\n if (this.resizeFilter) {\n this.applyResizeFilters();\n }\n return this;\n },\n\n /**\n * Delete a single texture if in webgl mode\n */\n removeTexture: function(key) {\n var backend = fabric.filterBackend;\n if (backend && backend.evictCachesForKey) {\n backend.evictCachesForKey(key);\n }\n },\n\n /**\n * Delete textures, reference to elements and eventually JSDOM cleanup\n */\n dispose: function () {\n this.callSuper('dispose');\n this.removeTexture(this.cacheKey);\n this.removeTexture(this.cacheKey + '_filtered');\n this._cacheContext = undefined;\n ['_originalElement', '_element', '_filteredEl', '_cacheCanvas'].forEach((function(element) {\n fabric.util.cleanUpJsdomNode(this[element]);\n this[element] = undefined;\n }).bind(this));\n },\n\n /**\n * Get the crossOrigin value (of the corresponding image element)\n */\n getCrossOrigin: function() {\n return this._originalElement && (this._originalElement.crossOrigin || null);\n },\n\n /**\n * Returns original size of an image\n * @return {Object} Object with \"width\" and \"height\" properties\n */\n getOriginalSize: function() {\n var element = this.getElement();\n return {\n width: element.naturalWidth || element.width,\n height: element.naturalHeight || element.height\n };\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _stroke: function(ctx) {\n if (!this.stroke || this.strokeWidth === 0) {\n return;\n }\n var w = this.width / 2, h = this.height / 2;\n ctx.beginPath();\n ctx.moveTo(-w, -h);\n ctx.lineTo(w, -h);\n ctx.lineTo(w, h);\n ctx.lineTo(-w, h);\n ctx.lineTo(-w, -h);\n ctx.closePath();\n },\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} Object representation of an instance\n */\n toObject: function(propertiesToInclude) {\n var filters = [];\n\n this.filters.forEach(function(filterObj) {\n if (filterObj) {\n filters.push(filterObj.toObject());\n }\n });\n var object = extend(\n this.callSuper(\n 'toObject',\n ['cropX', 'cropY'].concat(propertiesToInclude)\n ), {\n src: this.getSrc(),\n crossOrigin: this.getCrossOrigin(),\n filters: filters,\n });\n if (this.resizeFilter) {\n object.resizeFilter = this.resizeFilter.toObject();\n }\n return object;\n },\n\n /**\n * Returns true if an image has crop applied, inspecting values of cropX,cropY,width,height.\n * @return {Boolean}\n */\n hasCrop: function() {\n return this.cropX || this.cropY || this.width < this._element.width || this.height < this._element.height;\n },\n\n /* _TO_SVG_START_ */\n /**\n * Returns svg representation of an instance\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG: function() {\n var svgString = [], imageMarkup = [], strokeSvg, element = this._element,\n x = -this.width / 2, y = -this.height / 2, clipPath = '', imageRendering = '';\n if (!element) {\n return [];\n }\n if (this.hasCrop()) {\n var clipPathId = fabric.Object.__uid++;\n svgString.push(\n '\\n',\n '\\t\\n',\n '\\n'\n );\n clipPath = ' clip-path=\"url(#imageCrop_' + clipPathId + ')\" ';\n }\n if (!this.imageSmoothing) {\n imageRendering = '\" image-rendering=\"optimizeSpeed';\n }\n imageMarkup.push('\\t element with actual transformation, then offsetting object to the top/left\n // so that object's center aligns with container's left/top\n '\" width=\"', element.width || element.naturalWidth,\n '\" height=\"', element.height || element.height,\n imageRendering,\n '\"', clipPath,\n '>\\n');\n\n if (this.stroke || this.strokeDashArray) {\n var origFill = this.fill;\n this.fill = null;\n strokeSvg = [\n '\\t\\n'\n ];\n this.fill = origFill;\n }\n if (this.paintFirst !== 'fill') {\n svgString = svgString.concat(strokeSvg, imageMarkup);\n }\n else {\n svgString = svgString.concat(imageMarkup, strokeSvg);\n }\n return svgString;\n },\n /* _TO_SVG_END_ */\n\n /**\n * Returns source of an image\n * @param {Boolean} filtered indicates if the src is needed for svg\n * @return {String} Source of an image\n */\n getSrc: function(filtered) {\n var element = filtered ? this._element : this._originalElement;\n if (element) {\n if (element.toDataURL) {\n return element.toDataURL();\n }\n\n if (this.srcFromAttribute) {\n return element.getAttribute('src');\n }\n else {\n return element.src;\n }\n }\n else {\n return this.src || '';\n }\n },\n\n /**\n * Sets source of an image\n * @param {String} src Source string (URL)\n * @param {Function} [callback] Callback is invoked when image has been loaded (and all filters have been applied)\n * @param {Object} [options] Options object\n * @param {String} [options.crossOrigin] crossOrigin value (one of \"\", \"anonymous\", \"use-credentials\")\n * @see https://developer.mozilla.org/en-US/docs/HTML/CORS_settings_attributes\n * @return {fabric.Image} thisArg\n * @chainable\n */\n setSrc: function(src, callback, options) {\n fabric.util.loadImage(src, function(img, isError) {\n this.setElement(img, options);\n this._setWidthHeight();\n callback && callback(this, isError);\n }, this, options && options.crossOrigin);\n return this;\n },\n\n /**\n * Returns string representation of an instance\n * @return {String} String representation of an instance\n */\n toString: function() {\n return '#';\n },\n\n applyResizeFilters: function() {\n var filter = this.resizeFilter,\n minimumScale = this.minimumScaleTrigger,\n objectScale = this.getTotalObjectScaling(),\n scaleX = objectScale.scaleX,\n scaleY = objectScale.scaleY,\n elementToFilter = this._filteredEl || this._originalElement;\n if (this.group) {\n this.set('dirty', true);\n }\n if (!filter || (scaleX > minimumScale && scaleY > minimumScale)) {\n this._element = elementToFilter;\n this._filterScalingX = 1;\n this._filterScalingY = 1;\n this._lastScaleX = scaleX;\n this._lastScaleY = scaleY;\n return;\n }\n if (!fabric.filterBackend) {\n fabric.filterBackend = fabric.initFilterBackend();\n }\n var canvasEl = fabric.util.createCanvasElement(),\n cacheKey = this._filteredEl ? (this.cacheKey + '_filtered') : this.cacheKey,\n sourceWidth = elementToFilter.width, sourceHeight = elementToFilter.height;\n canvasEl.width = sourceWidth;\n canvasEl.height = sourceHeight;\n this._element = canvasEl;\n this._lastScaleX = filter.scaleX = scaleX;\n this._lastScaleY = filter.scaleY = scaleY;\n fabric.filterBackend.applyFilters(\n [filter], elementToFilter, sourceWidth, sourceHeight, this._element, cacheKey);\n this._filterScalingX = canvasEl.width / this._originalElement.width;\n this._filterScalingY = canvasEl.height / this._originalElement.height;\n },\n\n /**\n * Applies filters assigned to this image (from \"filters\" array) or from filter param\n * @method applyFilters\n * @param {Array} filters to be applied\n * @param {Boolean} forResizing specify if the filter operation is a resize operation\n * @return {thisArg} return the fabric.Image object\n * @chainable\n */\n applyFilters: function(filters) {\n\n filters = filters || this.filters || [];\n filters = filters.filter(function(filter) { return filter && !filter.isNeutralState(); });\n this.set('dirty', true);\n\n // needs to clear out or WEBGL will not resize correctly\n this.removeTexture(this.cacheKey + '_filtered');\n\n if (filters.length === 0) {\n this._element = this._originalElement;\n this._filteredEl = null;\n this._filterScalingX = 1;\n this._filterScalingY = 1;\n return this;\n }\n\n var imgElement = this._originalElement,\n sourceWidth = imgElement.naturalWidth || imgElement.width,\n sourceHeight = imgElement.naturalHeight || imgElement.height;\n\n if (this._element === this._originalElement) {\n // if the element is the same we need to create a new element\n var canvasEl = fabric.util.createCanvasElement();\n canvasEl.width = sourceWidth;\n canvasEl.height = sourceHeight;\n this._element = canvasEl;\n this._filteredEl = canvasEl;\n }\n else {\n // clear the existing element to get new filter data\n // also dereference the eventual resized _element\n this._element = this._filteredEl;\n this._filteredEl.getContext('2d').clearRect(0, 0, sourceWidth, sourceHeight);\n // we also need to resize again at next renderAll, so remove saved _lastScaleX/Y\n this._lastScaleX = 1;\n this._lastScaleY = 1;\n }\n if (!fabric.filterBackend) {\n fabric.filterBackend = fabric.initFilterBackend();\n }\n fabric.filterBackend.applyFilters(\n filters, this._originalElement, sourceWidth, sourceHeight, this._element, this.cacheKey);\n if (this._originalElement.width !== this._element.width ||\n this._originalElement.height !== this._element.height) {\n this._filterScalingX = this._element.width / this._originalElement.width;\n this._filterScalingY = this._element.height / this._originalElement.height;\n }\n return this;\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _render: function(ctx) {\n fabric.util.setImageSmoothing(ctx, this.imageSmoothing);\n if (this.isMoving !== true && this.resizeFilter && this._needsResize()) {\n this.applyResizeFilters();\n }\n this._stroke(ctx);\n this._renderPaintInOrder(ctx);\n },\n\n /**\n * Paint the cached copy of the object on the target context.\n * it will set the imageSmoothing for the draw operation\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n drawCacheOnCanvas: function(ctx) {\n fabric.util.setImageSmoothing(ctx, this.imageSmoothing);\n fabric.Object.prototype.drawCacheOnCanvas.call(this, ctx);\n },\n\n /**\n * Decide if the object should cache or not. Create its own cache level\n * needsItsOwnCache should be used when the object drawing method requires\n * a cache step. None of the fabric classes requires it.\n * Generally you do not cache objects in groups because the group outside is cached.\n * This is the special image version where we would like to avoid caching where possible.\n * Essentially images do not benefit from caching. They may require caching, and in that\n * case we do it. Also caching an image usually ends in a loss of details.\n * A full performance audit should be done.\n * @return {Boolean}\n */\n shouldCache: function() {\n return this.needsItsOwnCache();\n },\n\n _renderFill: function(ctx) {\n var elementToDraw = this._element;\n if (!elementToDraw) {\n return;\n }\n var scaleX = this._filterScalingX, scaleY = this._filterScalingY,\n w = this.width, h = this.height, min = Math.min, max = Math.max,\n // crop values cannot be lesser than 0.\n cropX = max(this.cropX, 0), cropY = max(this.cropY, 0),\n elWidth = elementToDraw.naturalWidth || elementToDraw.width,\n elHeight = elementToDraw.naturalHeight || elementToDraw.height,\n sX = cropX * scaleX,\n sY = cropY * scaleY,\n // the width height cannot exceed element width/height, starting from the crop offset.\n sW = min(w * scaleX, elWidth - sX),\n sH = min(h * scaleY, elHeight - sY),\n x = -w / 2, y = -h / 2,\n maxDestW = min(w, elWidth / scaleX - cropX),\n maxDestH = min(h, elHeight / scaleY - cropY);\n\n elementToDraw && ctx.drawImage(elementToDraw, sX, sY, sW, sH, x, y, maxDestW, maxDestH);\n },\n\n /**\n * needed to check if image needs resize\n * @private\n */\n _needsResize: function() {\n var scale = this.getTotalObjectScaling();\n return (scale.scaleX !== this._lastScaleX || scale.scaleY !== this._lastScaleY);\n },\n\n /**\n * @private\n */\n _resetWidthHeight: function() {\n this.set(this.getOriginalSize());\n },\n\n /**\n * The Image class's initialization method. This method is automatically\n * called by the constructor.\n * @private\n * @param {HTMLImageElement|String} element The element representing the image\n * @param {Object} [options] Options object\n */\n _initElement: function(element, options) {\n this.setElement(fabric.util.getById(element), options);\n fabric.util.addClass(this.getElement(), fabric.Image.CSS_CANVAS);\n },\n\n /**\n * @private\n * @param {Object} [options] Options object\n */\n _initConfig: function(options) {\n options || (options = { });\n this.setOptions(options);\n this._setWidthHeight(options);\n },\n\n /**\n * @private\n * @param {Array} filters to be initialized\n * @param {Function} callback Callback to invoke when all fabric.Image.filters instances are created\n */\n _initFilters: function(filters, callback) {\n if (filters && filters.length) {\n fabric.util.enlivenObjects(filters, function(enlivenedObjects) {\n callback && callback(enlivenedObjects);\n }, 'fabric.Image.filters');\n }\n else {\n callback && callback();\n }\n },\n\n /**\n * @private\n * Set the width and the height of the image object, using the element or the\n * options.\n * @param {Object} [options] Object with width/height properties\n */\n _setWidthHeight: function(options) {\n options || (options = { });\n var el = this.getElement();\n this.width = options.width || el.naturalWidth || el.width || 0;\n this.height = options.height || el.naturalHeight || el.height || 0;\n },\n\n /**\n * Calculate offset for center and scale factor for the image in order to respect\n * the preserveAspectRatio attribute\n * @private\n * @return {Object}\n */\n parsePreserveAspectRatioAttribute: function() {\n var pAR = fabric.util.parsePreserveAspectRatioAttribute(this.preserveAspectRatio || ''),\n rWidth = this._element.width, rHeight = this._element.height,\n scaleX = 1, scaleY = 1, offsetLeft = 0, offsetTop = 0, cropX = 0, cropY = 0,\n offset, pWidth = this.width, pHeight = this.height, parsedAttributes = { width: pWidth, height: pHeight };\n if (pAR && (pAR.alignX !== 'none' || pAR.alignY !== 'none')) {\n if (pAR.meetOrSlice === 'meet') {\n scaleX = scaleY = fabric.util.findScaleToFit(this._element, parsedAttributes);\n offset = (pWidth - rWidth * scaleX) / 2;\n if (pAR.alignX === 'Min') {\n offsetLeft = -offset;\n }\n if (pAR.alignX === 'Max') {\n offsetLeft = offset;\n }\n offset = (pHeight - rHeight * scaleY) / 2;\n if (pAR.alignY === 'Min') {\n offsetTop = -offset;\n }\n if (pAR.alignY === 'Max') {\n offsetTop = offset;\n }\n }\n if (pAR.meetOrSlice === 'slice') {\n scaleX = scaleY = fabric.util.findScaleToCover(this._element, parsedAttributes);\n offset = rWidth - pWidth / scaleX;\n if (pAR.alignX === 'Mid') {\n cropX = offset / 2;\n }\n if (pAR.alignX === 'Max') {\n cropX = offset;\n }\n offset = rHeight - pHeight / scaleY;\n if (pAR.alignY === 'Mid') {\n cropY = offset / 2;\n }\n if (pAR.alignY === 'Max') {\n cropY = offset;\n }\n rWidth = pWidth / scaleX;\n rHeight = pHeight / scaleY;\n }\n }\n else {\n scaleX = pWidth / rWidth;\n scaleY = pHeight / rHeight;\n }\n return {\n width: rWidth,\n height: rHeight,\n scaleX: scaleX,\n scaleY: scaleY,\n offsetLeft: offsetLeft,\n offsetTop: offsetTop,\n cropX: cropX,\n cropY: cropY\n };\n }\n });\n\n /**\n * Default CSS class name for canvas\n * @static\n * @type String\n * @default\n */\n fabric.Image.CSS_CANVAS = 'canvas-img';\n\n /**\n * Alias for getSrc\n * @static\n */\n fabric.Image.prototype.getSvgSrc = fabric.Image.prototype.getSrc;\n\n /**\n * Creates an instance of fabric.Image from its object representation\n * @static\n * @param {Object} object Object to create an instance from\n * @param {Function} callback Callback to invoke when an image instance is created\n */\n fabric.Image.fromObject = function(_object, callback) {\n var object = fabric.util.object.clone(_object);\n fabric.util.loadImage(object.src, function(img, isError) {\n if (isError) {\n callback && callback(null, true);\n return;\n }\n fabric.Image.prototype._initFilters.call(object, object.filters, function(filters) {\n object.filters = filters || [];\n fabric.Image.prototype._initFilters.call(object, [object.resizeFilter], function(resizeFilters) {\n object.resizeFilter = resizeFilters[0];\n fabric.util.enlivenObjectEnlivables(object, object, function () {\n var image = new fabric.Image(img, object);\n callback(image, false);\n });\n });\n });\n }, null, object.crossOrigin);\n };\n\n /**\n * Creates an instance of fabric.Image from an URL string\n * @static\n * @param {String} url URL to create an image from\n * @param {Function} [callback] Callback to invoke when image is created (newly created image is passed as a first argument). Second argument is a boolean indicating if an error occurred or not.\n * @param {Object} [imgOptions] Options object\n */\n fabric.Image.fromURL = function(url, callback, imgOptions) {\n fabric.util.loadImage(url, function(img, isError) {\n callback && callback(new fabric.Image(img, imgOptions), isError);\n }, null, imgOptions && imgOptions.crossOrigin);\n };\n\n /* _FROM_SVG_START_ */\n /**\n * List of attribute names to account for when parsing SVG element (used by {@link fabric.Image.fromElement})\n * @static\n * @see {@link http://www.w3.org/TR/SVG/struct.html#ImageElement}\n */\n fabric.Image.ATTRIBUTE_NAMES =\n fabric.SHARED_ATTRIBUTES.concat(\n 'x y width height preserveAspectRatio xlink:href crossOrigin image-rendering'.split(' ')\n );\n\n /**\n * Returns {@link fabric.Image} instance from an SVG element\n * @static\n * @param {SVGElement} element Element to parse\n * @param {Object} [options] Options object\n * @param {Function} callback Callback to execute when fabric.Image object is created\n * @return {fabric.Image} Instance of fabric.Image\n */\n fabric.Image.fromElement = function(element, callback, options) {\n var parsedAttributes = fabric.parseAttributes(element, fabric.Image.ATTRIBUTE_NAMES);\n fabric.Image.fromURL(parsedAttributes['xlink:href'], callback,\n extend((options ? fabric.util.object.clone(options) : { }), parsedAttributes));\n };\n /* _FROM_SVG_END_ */\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\nfabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prototype */ {\n\n /**\n * @private\n * @return {Number} angle value\n */\n _getAngleValueForStraighten: function() {\n var angle = this.angle % 360;\n if (angle > 0) {\n return Math.round((angle - 1) / 90) * 90;\n }\n return Math.round(angle / 90) * 90;\n },\n\n /**\n * Straightens an object (rotating it from current angle to one of 0, 90, 180, 270, etc. depending on which is closer)\n * @return {fabric.Object} thisArg\n * @chainable\n */\n straighten: function() {\n return this.rotate(this._getAngleValueForStraighten());\n },\n\n /**\n * Same as {@link fabric.Object.prototype.straighten} but with animation\n * @param {Object} callbacks Object with callback functions\n * @param {Function} [callbacks.onComplete] Invoked on completion\n * @param {Function} [callbacks.onChange] Invoked on every step of animation\n * @return {fabric.Object} thisArg\n */\n fxStraighten: function(callbacks) {\n callbacks = callbacks || { };\n\n var empty = function() { },\n onComplete = callbacks.onComplete || empty,\n onChange = callbacks.onChange || empty,\n _this = this;\n\n return fabric.util.animate({\n target: this,\n startValue: this.get('angle'),\n endValue: this._getAngleValueForStraighten(),\n duration: this.FX_DURATION,\n onChange: function(value) {\n _this.rotate(value);\n onChange();\n },\n onComplete: function() {\n _this.setCoords();\n onComplete();\n },\n });\n }\n});\n\nfabric.util.object.extend(fabric.StaticCanvas.prototype, /** @lends fabric.StaticCanvas.prototype */ {\n\n /**\n * Straightens object, then rerenders canvas\n * @param {fabric.Object} object Object to straighten\n * @return {fabric.Canvas} thisArg\n * @chainable\n */\n straightenObject: function (object) {\n object.straighten();\n this.requestRenderAll();\n return this;\n },\n\n /**\n * Same as {@link fabric.Canvas.prototype.straightenObject}, but animated\n * @param {fabric.Object} object Object to straighten\n * @return {fabric.Canvas} thisArg\n */\n fxStraightenObject: function (object) {\n return object.fxStraighten({\n onChange: this.requestRenderAllBound\n });\n }\n});\n\n\n(function() {\n\n 'use strict';\n\n /**\n * Tests if webgl supports certain precision\n * @param {WebGL} Canvas WebGL context to test on\n * @param {String} Precision to test can be any of following: 'lowp', 'mediump', 'highp'\n * @returns {Boolean} Whether the user's browser WebGL supports given precision.\n */\n function testPrecision(gl, precision){\n var fragmentSource = 'precision ' + precision + ' float;\\nvoid main(){}';\n var fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);\n gl.shaderSource(fragmentShader, fragmentSource);\n gl.compileShader(fragmentShader);\n if (!gl.getShaderParameter(fragmentShader, gl.COMPILE_STATUS)) {\n return false;\n }\n return true;\n }\n\n /**\n * Indicate whether this filtering backend is supported by the user's browser.\n * @param {Number} tileSize check if the tileSize is supported\n * @returns {Boolean} Whether the user's browser supports WebGL.\n */\n fabric.isWebglSupported = function(tileSize) {\n if (fabric.isLikelyNode) {\n return false;\n }\n tileSize = tileSize || fabric.WebglFilterBackend.prototype.tileSize;\n var canvas = document.createElement('canvas');\n var gl = canvas.getContext('webgl') || canvas.getContext('experimental-webgl');\n var isSupported = false;\n // eslint-disable-next-line\n if (gl) {\n fabric.maxTextureSize = gl.getParameter(gl.MAX_TEXTURE_SIZE);\n isSupported = fabric.maxTextureSize >= tileSize;\n var precisions = ['highp', 'mediump', 'lowp'];\n for (var i = 0; i < 3; i++){\n if (testPrecision(gl, precisions[i])){\n fabric.webGlPrecision = precisions[i];\n break;\n };\n }\n }\n this.isSupported = isSupported;\n return isSupported;\n };\n\n fabric.WebglFilterBackend = WebglFilterBackend;\n\n /**\n * WebGL filter backend.\n */\n function WebglFilterBackend(options) {\n if (options && options.tileSize) {\n this.tileSize = options.tileSize;\n }\n this.setupGLContext(this.tileSize, this.tileSize);\n this.captureGPUInfo();\n };\n\n WebglFilterBackend.prototype = /** @lends fabric.WebglFilterBackend.prototype */ {\n\n tileSize: 2048,\n\n /**\n * Experimental. This object is a sort of repository of help layers used to avoid\n * of recreating them during frequent filtering. If you are previewing a filter with\n * a slider you probably do not want to create help layers every filter step.\n * in this object there will be appended some canvases, created once, resized sometimes\n * cleared never. Clearing is left to the developer.\n **/\n resources: {\n\n },\n\n /**\n * Setup a WebGL context suitable for filtering, and bind any needed event handlers.\n */\n setupGLContext: function(width, height) {\n this.dispose();\n this.createWebGLCanvas(width, height);\n // eslint-disable-next-line\n this.aPosition = new Float32Array([0, 0, 0, 1, 1, 0, 1, 1]);\n this.chooseFastestCopyGLTo2DMethod(width, height);\n },\n\n /**\n * Pick a method to copy data from GL context to 2d canvas. In some browsers using\n * putImageData is faster than drawImage for that specific operation.\n */\n chooseFastestCopyGLTo2DMethod: function(width, height) {\n var canMeasurePerf = typeof window.performance !== 'undefined', canUseImageData;\n try {\n new ImageData(1, 1);\n canUseImageData = true;\n }\n catch (e) {\n canUseImageData = false;\n }\n // eslint-disable-next-line no-undef\n var canUseArrayBuffer = typeof ArrayBuffer !== 'undefined';\n // eslint-disable-next-line no-undef\n var canUseUint8Clamped = typeof Uint8ClampedArray !== 'undefined';\n\n if (!(canMeasurePerf && canUseImageData && canUseArrayBuffer && canUseUint8Clamped)) {\n return;\n }\n\n var targetCanvas = fabric.util.createCanvasElement();\n // eslint-disable-next-line no-undef\n var imageBuffer = new ArrayBuffer(width * height * 4);\n if (fabric.forceGLPutImageData) {\n this.imageBuffer = imageBuffer;\n this.copyGLTo2D = copyGLTo2DPutImageData;\n return;\n }\n var testContext = {\n imageBuffer: imageBuffer,\n destinationWidth: width,\n destinationHeight: height,\n targetCanvas: targetCanvas\n };\n var startTime, drawImageTime, putImageDataTime;\n targetCanvas.width = width;\n targetCanvas.height = height;\n\n startTime = window.performance.now();\n copyGLTo2DDrawImage.call(testContext, this.gl, testContext);\n drawImageTime = window.performance.now() - startTime;\n\n startTime = window.performance.now();\n copyGLTo2DPutImageData.call(testContext, this.gl, testContext);\n putImageDataTime = window.performance.now() - startTime;\n\n if (drawImageTime > putImageDataTime) {\n this.imageBuffer = imageBuffer;\n this.copyGLTo2D = copyGLTo2DPutImageData;\n }\n else {\n this.copyGLTo2D = copyGLTo2DDrawImage;\n }\n },\n\n /**\n * Create a canvas element and associated WebGL context and attaches them as\n * class properties to the GLFilterBackend class.\n */\n createWebGLCanvas: function(width, height) {\n var canvas = fabric.util.createCanvasElement();\n canvas.width = width;\n canvas.height = height;\n var glOptions = {\n alpha: true,\n premultipliedAlpha: false,\n depth: false,\n stencil: false,\n antialias: false\n },\n gl = canvas.getContext('webgl', glOptions);\n if (!gl) {\n gl = canvas.getContext('experimental-webgl', glOptions);\n }\n if (!gl) {\n return;\n }\n gl.clearColor(0, 0, 0, 0);\n // this canvas can fire webglcontextlost and webglcontextrestored\n this.canvas = canvas;\n this.gl = gl;\n },\n\n /**\n * Attempts to apply the requested filters to the source provided, drawing the filtered output\n * to the provided target canvas.\n *\n * @param {Array} filters The filters to apply.\n * @param {HTMLImageElement|HTMLCanvasElement} source The source to be filtered.\n * @param {Number} width The width of the source input.\n * @param {Number} height The height of the source input.\n * @param {HTMLCanvasElement} targetCanvas The destination for filtered output to be drawn.\n * @param {String|undefined} cacheKey A key used to cache resources related to the source. If\n * omitted, caching will be skipped.\n */\n applyFilters: function(filters, source, width, height, targetCanvas, cacheKey) {\n var gl = this.gl;\n var cachedTexture;\n if (cacheKey) {\n cachedTexture = this.getCachedTexture(cacheKey, source);\n }\n var pipelineState = {\n originalWidth: source.width || source.originalWidth,\n originalHeight: source.height || source.originalHeight,\n sourceWidth: width,\n sourceHeight: height,\n destinationWidth: width,\n destinationHeight: height,\n context: gl,\n sourceTexture: this.createTexture(gl, width, height, !cachedTexture && source),\n targetTexture: this.createTexture(gl, width, height),\n originalTexture: cachedTexture ||\n this.createTexture(gl, width, height, !cachedTexture && source),\n passes: filters.length,\n webgl: true,\n aPosition: this.aPosition,\n programCache: this.programCache,\n pass: 0,\n filterBackend: this,\n targetCanvas: targetCanvas\n };\n var tempFbo = gl.createFramebuffer();\n gl.bindFramebuffer(gl.FRAMEBUFFER, tempFbo);\n filters.forEach(function(filter) { filter && filter.applyTo(pipelineState); });\n resizeCanvasIfNeeded(pipelineState);\n this.copyGLTo2D(gl, pipelineState);\n gl.bindTexture(gl.TEXTURE_2D, null);\n gl.deleteTexture(pipelineState.sourceTexture);\n gl.deleteTexture(pipelineState.targetTexture);\n gl.deleteFramebuffer(tempFbo);\n targetCanvas.getContext('2d').setTransform(1, 0, 0, 1, 0, 0);\n return pipelineState;\n },\n\n /**\n * Detach event listeners, remove references, and clean up caches.\n */\n dispose: function() {\n if (this.canvas) {\n this.canvas = null;\n this.gl = null;\n }\n this.clearWebGLCaches();\n },\n\n /**\n * Wipe out WebGL-related caches.\n */\n clearWebGLCaches: function() {\n this.programCache = {};\n this.textureCache = {};\n },\n\n /**\n * Create a WebGL texture object.\n *\n * Accepts specific dimensions to initialize the texture to or a source image.\n *\n * @param {WebGLRenderingContext} gl The GL context to use for creating the texture.\n * @param {Number} width The width to initialize the texture at.\n * @param {Number} height The height to initialize the texture.\n * @param {HTMLImageElement|HTMLCanvasElement} textureImageSource A source for the texture data.\n * @param {Number} filterType gl.NEAREST or gl.LINEAR usually, webgl numeri constants\n * @returns {WebGLTexture}\n */\n createTexture: function(gl, width, height, textureImageSource, filterType) {\n var texture = gl.createTexture();\n gl.bindTexture(gl.TEXTURE_2D, texture);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, filterType || gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, filterType || gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n if (textureImageSource) {\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, textureImageSource);\n }\n else {\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, width, height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);\n }\n return texture;\n },\n\n /**\n * Can be optionally used to get a texture from the cache array\n *\n * If an existing texture is not found, a new texture is created and cached.\n *\n * @param {String} uniqueId A cache key to use to find an existing texture.\n * @param {HTMLImageElement|HTMLCanvasElement} textureImageSource A source to use to create the\n * texture cache entry if one does not already exist.\n */\n getCachedTexture: function(uniqueId, textureImageSource) {\n if (this.textureCache[uniqueId]) {\n return this.textureCache[uniqueId];\n }\n else {\n var texture = this.createTexture(\n this.gl, textureImageSource.width, textureImageSource.height, textureImageSource);\n this.textureCache[uniqueId] = texture;\n return texture;\n }\n },\n\n /**\n * Clear out cached resources related to a source image that has been\n * filtered previously.\n *\n * @param {String} cacheKey The cache key provided when the source image was filtered.\n */\n evictCachesForKey: function(cacheKey) {\n if (this.textureCache[cacheKey]) {\n this.gl.deleteTexture(this.textureCache[cacheKey]);\n delete this.textureCache[cacheKey];\n }\n },\n\n copyGLTo2D: copyGLTo2DDrawImage,\n\n /**\n * Attempt to extract GPU information strings from a WebGL context.\n *\n * Useful information when debugging or blacklisting specific GPUs.\n *\n * @returns {Object} A GPU info object with renderer and vendor strings.\n */\n captureGPUInfo: function() {\n if (this.gpuInfo) {\n return this.gpuInfo;\n }\n var gl = this.gl, gpuInfo = { renderer: '', vendor: '' };\n if (!gl) {\n return gpuInfo;\n }\n var ext = gl.getExtension('WEBGL_debug_renderer_info');\n if (ext) {\n var renderer = gl.getParameter(ext.UNMASKED_RENDERER_WEBGL);\n var vendor = gl.getParameter(ext.UNMASKED_VENDOR_WEBGL);\n if (renderer) {\n gpuInfo.renderer = renderer.toLowerCase();\n }\n if (vendor) {\n gpuInfo.vendor = vendor.toLowerCase();\n }\n }\n this.gpuInfo = gpuInfo;\n return gpuInfo;\n },\n };\n})();\n\nfunction resizeCanvasIfNeeded(pipelineState) {\n var targetCanvas = pipelineState.targetCanvas,\n width = targetCanvas.width, height = targetCanvas.height,\n dWidth = pipelineState.destinationWidth,\n dHeight = pipelineState.destinationHeight;\n\n if (width !== dWidth || height !== dHeight) {\n targetCanvas.width = dWidth;\n targetCanvas.height = dHeight;\n }\n}\n\n/**\n * Copy an input WebGL canvas on to an output 2D canvas.\n *\n * The WebGL canvas is assumed to be upside down, with the top-left pixel of the\n * desired output image appearing in the bottom-left corner of the WebGL canvas.\n *\n * @param {WebGLRenderingContext} sourceContext The WebGL context to copy from.\n * @param {HTMLCanvasElement} targetCanvas The 2D target canvas to copy on to.\n * @param {Object} pipelineState The 2D target canvas to copy on to.\n */\nfunction copyGLTo2DDrawImage(gl, pipelineState) {\n var glCanvas = gl.canvas, targetCanvas = pipelineState.targetCanvas,\n ctx = targetCanvas.getContext('2d');\n ctx.translate(0, targetCanvas.height); // move it down again\n ctx.scale(1, -1); // vertical flip\n // where is my image on the big glcanvas?\n var sourceY = glCanvas.height - targetCanvas.height;\n ctx.drawImage(glCanvas, 0, sourceY, targetCanvas.width, targetCanvas.height, 0, 0,\n targetCanvas.width, targetCanvas.height);\n}\n\n/**\n * Copy an input WebGL canvas on to an output 2D canvas using 2d canvas' putImageData\n * API. Measurably faster than using ctx.drawImage in Firefox (version 54 on OSX Sierra).\n *\n * @param {WebGLRenderingContext} sourceContext The WebGL context to copy from.\n * @param {HTMLCanvasElement} targetCanvas The 2D target canvas to copy on to.\n * @param {Object} pipelineState The 2D target canvas to copy on to.\n */\nfunction copyGLTo2DPutImageData(gl, pipelineState) {\n var targetCanvas = pipelineState.targetCanvas, ctx = targetCanvas.getContext('2d'),\n dWidth = pipelineState.destinationWidth,\n dHeight = pipelineState.destinationHeight,\n numBytes = dWidth * dHeight * 4;\n\n // eslint-disable-next-line no-undef\n var u8 = new Uint8Array(this.imageBuffer, 0, numBytes);\n // eslint-disable-next-line no-undef\n var u8Clamped = new Uint8ClampedArray(this.imageBuffer, 0, numBytes);\n\n gl.readPixels(0, 0, dWidth, dHeight, gl.RGBA, gl.UNSIGNED_BYTE, u8);\n var imgData = new ImageData(u8Clamped, dWidth, dHeight);\n ctx.putImageData(imgData, 0, 0);\n}\n\n\n(function() {\n\n 'use strict';\n\n var noop = function() {};\n\n fabric.Canvas2dFilterBackend = Canvas2dFilterBackend;\n\n /**\n * Canvas 2D filter backend.\n */\n function Canvas2dFilterBackend() {};\n\n Canvas2dFilterBackend.prototype = /** @lends fabric.Canvas2dFilterBackend.prototype */ {\n evictCachesForKey: noop,\n dispose: noop,\n clearWebGLCaches: noop,\n\n /**\n * Experimental. This object is a sort of repository of help layers used to avoid\n * of recreating them during frequent filtering. If you are previewing a filter with\n * a slider you probably do not want to create help layers every filter step.\n * in this object there will be appended some canvases, created once, resized sometimes\n * cleared never. Clearing is left to the developer.\n **/\n resources: {\n\n },\n\n /**\n * Apply a set of filters against a source image and draw the filtered output\n * to the provided destination canvas.\n *\n * @param {EnhancedFilter} filters The filter to apply.\n * @param {HTMLImageElement|HTMLCanvasElement} sourceElement The source to be filtered.\n * @param {Number} sourceWidth The width of the source input.\n * @param {Number} sourceHeight The height of the source input.\n * @param {HTMLCanvasElement} targetCanvas The destination for filtered output to be drawn.\n */\n applyFilters: function(filters, sourceElement, sourceWidth, sourceHeight, targetCanvas) {\n var ctx = targetCanvas.getContext('2d');\n ctx.drawImage(sourceElement, 0, 0, sourceWidth, sourceHeight);\n var imageData = ctx.getImageData(0, 0, sourceWidth, sourceHeight);\n var originalImageData = ctx.getImageData(0, 0, sourceWidth, sourceHeight);\n var pipelineState = {\n sourceWidth: sourceWidth,\n sourceHeight: sourceHeight,\n imageData: imageData,\n originalEl: sourceElement,\n originalImageData: originalImageData,\n canvasEl: targetCanvas,\n ctx: ctx,\n filterBackend: this,\n };\n filters.forEach(function(filter) { filter.applyTo(pipelineState); });\n if (pipelineState.imageData.width !== sourceWidth || pipelineState.imageData.height !== sourceHeight) {\n targetCanvas.width = pipelineState.imageData.width;\n targetCanvas.height = pipelineState.imageData.height;\n }\n ctx.putImageData(pipelineState.imageData, 0, 0);\n return pipelineState;\n },\n\n };\n})();\n\n\n/**\n * @namespace fabric.Image.filters\n * @memberOf fabric.Image\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-2#image_filters}\n * @see {@link http://fabricjs.com/image-filters|ImageFilters demo}\n */\nfabric.Image = fabric.Image || { };\nfabric.Image.filters = fabric.Image.filters || { };\n\n/**\n * Root filter class from which all filter classes inherit from\n * @class fabric.Image.filters.BaseFilter\n * @memberOf fabric.Image.filters\n */\nfabric.Image.filters.BaseFilter = fabric.util.createClass(/** @lends fabric.Image.filters.BaseFilter.prototype */ {\n\n /**\n * Filter type\n * @param {String} type\n * @default\n */\n type: 'BaseFilter',\n\n /**\n * Array of attributes to send with buffers. do not modify\n * @private\n */\n\n vertexSource: 'attribute vec2 aPosition;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'void main() {\\n' +\n 'vTexCoord = aPosition;\\n' +\n 'gl_Position = vec4(aPosition * 2.0 - 1.0, 0.0, 1.0);\\n' +\n '}',\n\n fragmentSource: 'precision highp float;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'void main() {\\n' +\n 'gl_FragColor = texture2D(uTexture, vTexCoord);\\n' +\n '}',\n\n /**\n * Constructor\n * @param {Object} [options] Options object\n */\n initialize: function(options) {\n if (options) {\n this.setOptions(options);\n }\n },\n\n /**\n * Sets filter's properties from options\n * @param {Object} [options] Options object\n */\n setOptions: function(options) {\n for (var prop in options) {\n this[prop] = options[prop];\n }\n },\n\n /**\n * Compile this filter's shader program.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context to use for shader compilation.\n * @param {String} fragmentSource fragmentShader source for compilation\n * @param {String} vertexSource vertexShader source for compilation\n */\n createProgram: function(gl, fragmentSource, vertexSource) {\n fragmentSource = fragmentSource || this.fragmentSource;\n vertexSource = vertexSource || this.vertexSource;\n if (fabric.webGlPrecision !== 'highp'){\n fragmentSource = fragmentSource.replace(\n /precision highp float/g,\n 'precision ' + fabric.webGlPrecision + ' float'\n );\n }\n var vertexShader = gl.createShader(gl.VERTEX_SHADER);\n gl.shaderSource(vertexShader, vertexSource);\n gl.compileShader(vertexShader);\n if (!gl.getShaderParameter(vertexShader, gl.COMPILE_STATUS)) {\n throw new Error(\n // eslint-disable-next-line prefer-template\n 'Vertex shader compile error for ' + this.type + ': ' +\n gl.getShaderInfoLog(vertexShader)\n );\n }\n\n var fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);\n gl.shaderSource(fragmentShader, fragmentSource);\n gl.compileShader(fragmentShader);\n if (!gl.getShaderParameter(fragmentShader, gl.COMPILE_STATUS)) {\n throw new Error(\n // eslint-disable-next-line prefer-template\n 'Fragment shader compile error for ' + this.type + ': ' +\n gl.getShaderInfoLog(fragmentShader)\n );\n }\n\n var program = gl.createProgram();\n gl.attachShader(program, vertexShader);\n gl.attachShader(program, fragmentShader);\n gl.linkProgram(program);\n if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n throw new Error(\n // eslint-disable-next-line prefer-template\n 'Shader link error for \"${this.type}\" ' +\n gl.getProgramInfoLog(program)\n );\n }\n\n var attributeLocations = this.getAttributeLocations(gl, program);\n var uniformLocations = this.getUniformLocations(gl, program) || { };\n uniformLocations.uStepW = gl.getUniformLocation(program, 'uStepW');\n uniformLocations.uStepH = gl.getUniformLocation(program, 'uStepH');\n return {\n program: program,\n attributeLocations: attributeLocations,\n uniformLocations: uniformLocations\n };\n },\n\n /**\n * Return a map of attribute names to WebGLAttributeLocation objects.\n *\n * @param {WebGLRenderingContext} gl The canvas context used to compile the shader program.\n * @param {WebGLShaderProgram} program The shader program from which to take attribute locations.\n * @returns {Object} A map of attribute names to attribute locations.\n */\n getAttributeLocations: function(gl, program) {\n return {\n aPosition: gl.getAttribLocation(program, 'aPosition'),\n };\n },\n\n /**\n * Return a map of uniform names to WebGLUniformLocation objects.\n *\n * Intended to be overridden by subclasses.\n *\n * @param {WebGLRenderingContext} gl The canvas context used to compile the shader program.\n * @param {WebGLShaderProgram} program The shader program from which to take uniform locations.\n * @returns {Object} A map of uniform names to uniform locations.\n */\n getUniformLocations: function (/* gl, program */) {\n // in case i do not need any special uniform i need to return an empty object\n return { };\n },\n\n /**\n * Send attribute data from this filter to its shader program on the GPU.\n *\n * @param {WebGLRenderingContext} gl The canvas context used to compile the shader program.\n * @param {Object} attributeLocations A map of shader attribute names to their locations.\n */\n sendAttributeData: function(gl, attributeLocations, aPositionData) {\n var attributeLocation = attributeLocations.aPosition;\n var buffer = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n gl.enableVertexAttribArray(attributeLocation);\n gl.vertexAttribPointer(attributeLocation, 2, gl.FLOAT, false, 0, 0);\n gl.bufferData(gl.ARRAY_BUFFER, aPositionData, gl.STATIC_DRAW);\n },\n\n _setupFrameBuffer: function(options) {\n var gl = options.context, width, height;\n if (options.passes > 1) {\n width = options.destinationWidth;\n height = options.destinationHeight;\n if (options.sourceWidth !== width || options.sourceHeight !== height) {\n gl.deleteTexture(options.targetTexture);\n options.targetTexture = options.filterBackend.createTexture(gl, width, height);\n }\n gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D,\n options.targetTexture, 0);\n }\n else {\n // draw last filter on canvas and not to framebuffer.\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n gl.finish();\n }\n },\n\n _swapTextures: function(options) {\n options.passes--;\n options.pass++;\n var temp = options.targetTexture;\n options.targetTexture = options.sourceTexture;\n options.sourceTexture = temp;\n },\n\n /**\n * Generic isNeutral implementation for one parameter based filters.\n * Used only in image applyFilters to discard filters that will not have an effect\n * on the image\n * Other filters may need their own version ( ColorMatrix, HueRotation, gamma, ComposedFilter )\n * @param {Object} options\n **/\n isNeutralState: function(/* options */) {\n var main = this.mainParameter,\n _class = fabric.Image.filters[this.type].prototype;\n if (main) {\n if (Array.isArray(_class[main])) {\n for (var i = _class[main].length; i--;) {\n if (this[main][i] !== _class[main][i]) {\n return false;\n }\n }\n return true;\n }\n else {\n return _class[main] === this[main];\n }\n }\n else {\n return false;\n }\n },\n\n /**\n * Apply this filter to the input image data provided.\n *\n * Determines whether to use WebGL or Canvas2D based on the options.webgl flag.\n *\n * @param {Object} options\n * @param {Number} options.passes The number of filters remaining to be executed\n * @param {Boolean} options.webgl Whether to use webgl to render the filter.\n * @param {WebGLTexture} options.sourceTexture The texture setup as the source to be filtered.\n * @param {WebGLTexture} options.targetTexture The texture where filtered output should be drawn.\n * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n */\n applyTo: function(options) {\n if (options.webgl) {\n this._setupFrameBuffer(options);\n this.applyToWebGL(options);\n this._swapTextures(options);\n }\n else {\n this.applyTo2d(options);\n }\n },\n\n /**\n * Retrieves the cached shader.\n * @param {Object} options\n * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n */\n retrieveShader: function(options) {\n if (!options.programCache.hasOwnProperty(this.type)) {\n options.programCache[this.type] = this.createProgram(options.context);\n }\n return options.programCache[this.type];\n },\n\n /**\n * Apply this filter using webgl.\n *\n * @param {Object} options\n * @param {Number} options.passes The number of filters remaining to be executed\n * @param {Boolean} options.webgl Whether to use webgl to render the filter.\n * @param {WebGLTexture} options.originalTexture The texture of the original input image.\n * @param {WebGLTexture} options.sourceTexture The texture setup as the source to be filtered.\n * @param {WebGLTexture} options.targetTexture The texture where filtered output should be drawn.\n * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n */\n applyToWebGL: function(options) {\n var gl = options.context;\n var shader = this.retrieveShader(options);\n if (options.pass === 0 && options.originalTexture) {\n gl.bindTexture(gl.TEXTURE_2D, options.originalTexture);\n }\n else {\n gl.bindTexture(gl.TEXTURE_2D, options.sourceTexture);\n }\n gl.useProgram(shader.program);\n this.sendAttributeData(gl, shader.attributeLocations, options.aPosition);\n\n gl.uniform1f(shader.uniformLocations.uStepW, 1 / options.sourceWidth);\n gl.uniform1f(shader.uniformLocations.uStepH, 1 / options.sourceHeight);\n\n this.sendUniformData(gl, shader.uniformLocations);\n gl.viewport(0, 0, options.destinationWidth, options.destinationHeight);\n gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);\n },\n\n bindAdditionalTexture: function(gl, texture, textureUnit) {\n gl.activeTexture(textureUnit);\n gl.bindTexture(gl.TEXTURE_2D, texture);\n // reset active texture to 0 as usual\n gl.activeTexture(gl.TEXTURE0);\n },\n\n unbindAdditionalTexture: function(gl, textureUnit) {\n gl.activeTexture(textureUnit);\n gl.bindTexture(gl.TEXTURE_2D, null);\n gl.activeTexture(gl.TEXTURE0);\n },\n\n getMainParameter: function() {\n return this[this.mainParameter];\n },\n\n setMainParameter: function(value) {\n this[this.mainParameter] = value;\n },\n\n /**\n * Send uniform data from this filter to its shader program on the GPU.\n *\n * Intended to be overridden by subclasses.\n *\n * @param {WebGLRenderingContext} gl The canvas context used to compile the shader program.\n * @param {Object} uniformLocations A map of shader uniform names to their locations.\n */\n sendUniformData: function(/* gl, uniformLocations */) {\n // Intentionally left blank. Override me in subclasses.\n },\n\n /**\n * If needed by a 2d filter, this functions can create an helper canvas to be used\n * remember that options.targetCanvas is available for use till end of chain.\n */\n createHelpLayer: function(options) {\n if (!options.helpLayer) {\n var helpLayer = document.createElement('canvas');\n helpLayer.width = options.sourceWidth;\n helpLayer.height = options.sourceHeight;\n options.helpLayer = helpLayer;\n }\n },\n\n /**\n * Returns object representation of an instance\n * @return {Object} Object representation of an instance\n */\n toObject: function() {\n var object = { type: this.type }, mainP = this.mainParameter;\n if (mainP) {\n object[mainP] = this[mainP];\n }\n return object;\n },\n\n /**\n * Returns a JSON representation of an instance\n * @return {Object} JSON\n */\n toJSON: function() {\n // delegate, not alias\n return this.toObject();\n }\n});\n\nfabric.Image.filters.BaseFilter.fromObject = function(object, callback) {\n var filter = new fabric.Image.filters[object.type](object);\n callback && callback(filter);\n return filter;\n};\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n filters = fabric.Image.filters,\n createClass = fabric.util.createClass;\n\n /**\n * Color Matrix filter class\n * @class fabric.Image.filters.ColorMatrix\n * @memberOf fabric.Image.filters\n * @extends fabric.Image.filters.BaseFilter\n * @see {@link fabric.Image.filters.ColorMatrix#initialize} for constructor definition\n * @see {@link http://fabricjs.com/image-filters|ImageFilters demo}\n * @see {@Link http://www.webwasp.co.uk/tutorials/219/Color_Matrix_Filter.php}\n * @see {@Link http://phoboslab.org/log/2013/11/fast-image-filters-with-webgl}\n * @example Kodachrome filter\n * var filter = new fabric.Image.filters.ColorMatrix({\n * matrix: [\n 1.1285582396593525, -0.3967382283601348, -0.03992559172921793, 0, 63.72958762196502,\n -0.16404339962244616, 1.0835251566291304, -0.05498805115633132, 0, 24.732407896706203,\n -0.16786010706155763, -0.5603416277695248, 1.6014850761964943, 0, 35.62982807460946,\n 0, 0, 0, 1, 0\n ]\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n */\n filters.ColorMatrix = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.ColorMatrix.prototype */ {\n\n /**\n * Filter type\n * @param {String} type\n * @default\n */\n type: 'ColorMatrix',\n\n fragmentSource: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'uniform mat4 uColorMatrix;\\n' +\n 'uniform vec4 uConstants;\\n' +\n 'void main() {\\n' +\n 'vec4 color = texture2D(uTexture, vTexCoord);\\n' +\n 'color *= uColorMatrix;\\n' +\n 'color += uConstants;\\n' +\n 'gl_FragColor = color;\\n' +\n '}',\n\n /**\n * Colormatrix for pixels.\n * array of 20 floats. Numbers in positions 4, 9, 14, 19 loose meaning\n * outside the -1, 1 range.\n * 0.0039215686 is the part of 1 that get translated to 1 in 2d\n * @param {Array} matrix array of 20 numbers.\n * @default\n */\n matrix: [\n 1, 0, 0, 0, 0,\n 0, 1, 0, 0, 0,\n 0, 0, 1, 0, 0,\n 0, 0, 0, 1, 0\n ],\n\n mainParameter: 'matrix',\n\n /**\n * Lock the colormatrix on the color part, skipping alpha, mainly for non webgl scenario\n * to save some calculation\n * @type Boolean\n * @default true\n */\n colorsOnly: true,\n\n /**\n * Constructor\n * @param {Object} [options] Options object\n */\n initialize: function(options) {\n this.callSuper('initialize', options);\n // create a new array instead mutating the prototype with push\n this.matrix = this.matrix.slice(0);\n },\n\n /**\n * Apply the ColorMatrix operation to a Uint8Array representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8Array to be filtered.\n */\n applyTo2d: function(options) {\n var imageData = options.imageData,\n data = imageData.data,\n iLen = data.length,\n m = this.matrix,\n r, g, b, a, i, colorsOnly = this.colorsOnly;\n\n for (i = 0; i < iLen; i += 4) {\n r = data[i];\n g = data[i + 1];\n b = data[i + 2];\n if (colorsOnly) {\n data[i] = r * m[0] + g * m[1] + b * m[2] + m[4] * 255;\n data[i + 1] = r * m[5] + g * m[6] + b * m[7] + m[9] * 255;\n data[i + 2] = r * m[10] + g * m[11] + b * m[12] + m[14] * 255;\n }\n else {\n a = data[i + 3];\n data[i] = r * m[0] + g * m[1] + b * m[2] + a * m[3] + m[4] * 255;\n data[i + 1] = r * m[5] + g * m[6] + b * m[7] + a * m[8] + m[9] * 255;\n data[i + 2] = r * m[10] + g * m[11] + b * m[12] + a * m[13] + m[14] * 255;\n data[i + 3] = r * m[15] + g * m[16] + b * m[17] + a * m[18] + m[19] * 255;\n }\n }\n },\n\n /**\n * Return WebGL uniform locations for this filter's shader.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {WebGLShaderProgram} program This filter's compiled shader program.\n */\n getUniformLocations: function(gl, program) {\n return {\n uColorMatrix: gl.getUniformLocation(program, 'uColorMatrix'),\n uConstants: gl.getUniformLocation(program, 'uConstants'),\n };\n },\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData: function(gl, uniformLocations) {\n var m = this.matrix,\n matrix = [\n m[0], m[1], m[2], m[3],\n m[5], m[6], m[7], m[8],\n m[10], m[11], m[12], m[13],\n m[15], m[16], m[17], m[18]\n ],\n constants = [m[4], m[9], m[14], m[19]];\n gl.uniformMatrix4fv(uniformLocations.uColorMatrix, false, matrix);\n gl.uniform4fv(uniformLocations.uConstants, constants);\n },\n });\n\n /**\n * Returns filter instance from an object representation\n * @static\n * @param {Object} object Object to create an instance from\n * @param {function} [callback] function to invoke after filter creation\n * @return {fabric.Image.filters.ColorMatrix} Instance of fabric.Image.filters.ColorMatrix\n */\n fabric.Image.filters.ColorMatrix.fromObject = fabric.Image.filters.BaseFilter.fromObject;\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n filters = fabric.Image.filters,\n createClass = fabric.util.createClass;\n\n /**\n * Brightness filter class\n * @class fabric.Image.filters.Brightness\n * @memberOf fabric.Image.filters\n * @extends fabric.Image.filters.BaseFilter\n * @see {@link fabric.Image.filters.Brightness#initialize} for constructor definition\n * @see {@link http://fabricjs.com/image-filters|ImageFilters demo}\n * @example\n * var filter = new fabric.Image.filters.Brightness({\n * brightness: 0.05\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n */\n filters.Brightness = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Brightness.prototype */ {\n\n /**\n * Filter type\n * @param {String} type\n * @default\n */\n type: 'Brightness',\n\n /**\n * Fragment source for the brightness program\n */\n fragmentSource: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform float uBrightness;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'void main() {\\n' +\n 'vec4 color = texture2D(uTexture, vTexCoord);\\n' +\n 'color.rgb += uBrightness;\\n' +\n 'gl_FragColor = color;\\n' +\n '}',\n\n /**\n * Brightness value, from -1 to 1.\n * translated to -255 to 255 for 2d\n * 0.0039215686 is the part of 1 that get translated to 1 in 2d\n * @param {Number} brightness\n * @default\n */\n brightness: 0,\n\n /**\n * Describe the property that is the filter parameter\n * @param {String} m\n * @default\n */\n mainParameter: 'brightness',\n\n /**\n * Apply the Brightness operation to a Uint8ClampedArray representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n */\n applyTo2d: function(options) {\n if (this.brightness === 0) {\n return;\n }\n var imageData = options.imageData,\n data = imageData.data, i, len = data.length,\n brightness = Math.round(this.brightness * 255);\n for (i = 0; i < len; i += 4) {\n data[i] = data[i] + brightness;\n data[i + 1] = data[i + 1] + brightness;\n data[i + 2] = data[i + 2] + brightness;\n }\n },\n\n /**\n * Return WebGL uniform locations for this filter's shader.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {WebGLShaderProgram} program This filter's compiled shader program.\n */\n getUniformLocations: function(gl, program) {\n return {\n uBrightness: gl.getUniformLocation(program, 'uBrightness'),\n };\n },\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData: function(gl, uniformLocations) {\n gl.uniform1f(uniformLocations.uBrightness, this.brightness);\n },\n });\n\n /**\n * Returns filter instance from an object representation\n * @static\n * @param {Object} object Object to create an instance from\n * @param {function} [callback] to be invoked after filter creation\n * @return {fabric.Image.filters.Brightness} Instance of fabric.Image.filters.Brightness\n */\n fabric.Image.filters.Brightness.fromObject = fabric.Image.filters.BaseFilter.fromObject;\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n extend = fabric.util.object.extend,\n filters = fabric.Image.filters,\n createClass = fabric.util.createClass;\n\n /**\n * Adapted from html5rocks article\n * @class fabric.Image.filters.Convolute\n * @memberOf fabric.Image.filters\n * @extends fabric.Image.filters.BaseFilter\n * @see {@link fabric.Image.filters.Convolute#initialize} for constructor definition\n * @see {@link http://fabricjs.com/image-filters|ImageFilters demo}\n * @example Sharpen filter\n * var filter = new fabric.Image.filters.Convolute({\n * matrix: [ 0, -1, 0,\n * -1, 5, -1,\n * 0, -1, 0 ]\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n * @example Blur filter\n * var filter = new fabric.Image.filters.Convolute({\n * matrix: [ 1/9, 1/9, 1/9,\n * 1/9, 1/9, 1/9,\n * 1/9, 1/9, 1/9 ]\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n * @example Emboss filter\n * var filter = new fabric.Image.filters.Convolute({\n * matrix: [ 1, 1, 1,\n * 1, 0.7, -1,\n * -1, -1, -1 ]\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n * @example Emboss filter with opaqueness\n * var filter = new fabric.Image.filters.Convolute({\n * opaque: true,\n * matrix: [ 1, 1, 1,\n * 1, 0.7, -1,\n * -1, -1, -1 ]\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n */\n filters.Convolute = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Convolute.prototype */ {\n\n /**\n * Filter type\n * @param {String} type\n * @default\n */\n type: 'Convolute',\n\n /*\n * Opaque value (true/false)\n */\n opaque: false,\n\n /*\n * matrix for the filter, max 9x9\n */\n matrix: [0, 0, 0, 0, 1, 0, 0, 0, 0],\n\n /**\n * Fragment source for the brightness program\n */\n fragmentSource: {\n Convolute_3_1: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform float uMatrix[9];\\n' +\n 'uniform float uStepW;\\n' +\n 'uniform float uStepH;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'void main() {\\n' +\n 'vec4 color = vec4(0, 0, 0, 0);\\n' +\n 'for (float h = 0.0; h < 3.0; h+=1.0) {\\n' +\n 'for (float w = 0.0; w < 3.0; w+=1.0) {\\n' +\n 'vec2 matrixPos = vec2(uStepW * (w - 1), uStepH * (h - 1));\\n' +\n 'color += texture2D(uTexture, vTexCoord + matrixPos) * uMatrix[int(h * 3.0 + w)];\\n' +\n '}\\n' +\n '}\\n' +\n 'gl_FragColor = color;\\n' +\n '}',\n Convolute_3_0: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform float uMatrix[9];\\n' +\n 'uniform float uStepW;\\n' +\n 'uniform float uStepH;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'void main() {\\n' +\n 'vec4 color = vec4(0, 0, 0, 1);\\n' +\n 'for (float h = 0.0; h < 3.0; h+=1.0) {\\n' +\n 'for (float w = 0.0; w < 3.0; w+=1.0) {\\n' +\n 'vec2 matrixPos = vec2(uStepW * (w - 1.0), uStepH * (h - 1.0));\\n' +\n 'color.rgb += texture2D(uTexture, vTexCoord + matrixPos).rgb * uMatrix[int(h * 3.0 + w)];\\n' +\n '}\\n' +\n '}\\n' +\n 'float alpha = texture2D(uTexture, vTexCoord).a;\\n' +\n 'gl_FragColor = color;\\n' +\n 'gl_FragColor.a = alpha;\\n' +\n '}',\n Convolute_5_1: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform float uMatrix[25];\\n' +\n 'uniform float uStepW;\\n' +\n 'uniform float uStepH;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'void main() {\\n' +\n 'vec4 color = vec4(0, 0, 0, 0);\\n' +\n 'for (float h = 0.0; h < 5.0; h+=1.0) {\\n' +\n 'for (float w = 0.0; w < 5.0; w+=1.0) {\\n' +\n 'vec2 matrixPos = vec2(uStepW * (w - 2.0), uStepH * (h - 2.0));\\n' +\n 'color += texture2D(uTexture, vTexCoord + matrixPos) * uMatrix[int(h * 5.0 + w)];\\n' +\n '}\\n' +\n '}\\n' +\n 'gl_FragColor = color;\\n' +\n '}',\n Convolute_5_0: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform float uMatrix[25];\\n' +\n 'uniform float uStepW;\\n' +\n 'uniform float uStepH;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'void main() {\\n' +\n 'vec4 color = vec4(0, 0, 0, 1);\\n' +\n 'for (float h = 0.0; h < 5.0; h+=1.0) {\\n' +\n 'for (float w = 0.0; w < 5.0; w+=1.0) {\\n' +\n 'vec2 matrixPos = vec2(uStepW * (w - 2.0), uStepH * (h - 2.0));\\n' +\n 'color.rgb += texture2D(uTexture, vTexCoord + matrixPos).rgb * uMatrix[int(h * 5.0 + w)];\\n' +\n '}\\n' +\n '}\\n' +\n 'float alpha = texture2D(uTexture, vTexCoord).a;\\n' +\n 'gl_FragColor = color;\\n' +\n 'gl_FragColor.a = alpha;\\n' +\n '}',\n Convolute_7_1: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform float uMatrix[49];\\n' +\n 'uniform float uStepW;\\n' +\n 'uniform float uStepH;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'void main() {\\n' +\n 'vec4 color = vec4(0, 0, 0, 0);\\n' +\n 'for (float h = 0.0; h < 7.0; h+=1.0) {\\n' +\n 'for (float w = 0.0; w < 7.0; w+=1.0) {\\n' +\n 'vec2 matrixPos = vec2(uStepW * (w - 3.0), uStepH * (h - 3.0));\\n' +\n 'color += texture2D(uTexture, vTexCoord + matrixPos) * uMatrix[int(h * 7.0 + w)];\\n' +\n '}\\n' +\n '}\\n' +\n 'gl_FragColor = color;\\n' +\n '}',\n Convolute_7_0: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform float uMatrix[49];\\n' +\n 'uniform float uStepW;\\n' +\n 'uniform float uStepH;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'void main() {\\n' +\n 'vec4 color = vec4(0, 0, 0, 1);\\n' +\n 'for (float h = 0.0; h < 7.0; h+=1.0) {\\n' +\n 'for (float w = 0.0; w < 7.0; w+=1.0) {\\n' +\n 'vec2 matrixPos = vec2(uStepW * (w - 3.0), uStepH * (h - 3.0));\\n' +\n 'color.rgb += texture2D(uTexture, vTexCoord + matrixPos).rgb * uMatrix[int(h * 7.0 + w)];\\n' +\n '}\\n' +\n '}\\n' +\n 'float alpha = texture2D(uTexture, vTexCoord).a;\\n' +\n 'gl_FragColor = color;\\n' +\n 'gl_FragColor.a = alpha;\\n' +\n '}',\n Convolute_9_1: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform float uMatrix[81];\\n' +\n 'uniform float uStepW;\\n' +\n 'uniform float uStepH;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'void main() {\\n' +\n 'vec4 color = vec4(0, 0, 0, 0);\\n' +\n 'for (float h = 0.0; h < 9.0; h+=1.0) {\\n' +\n 'for (float w = 0.0; w < 9.0; w+=1.0) {\\n' +\n 'vec2 matrixPos = vec2(uStepW * (w - 4.0), uStepH * (h - 4.0));\\n' +\n 'color += texture2D(uTexture, vTexCoord + matrixPos) * uMatrix[int(h * 9.0 + w)];\\n' +\n '}\\n' +\n '}\\n' +\n 'gl_FragColor = color;\\n' +\n '}',\n Convolute_9_0: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform float uMatrix[81];\\n' +\n 'uniform float uStepW;\\n' +\n 'uniform float uStepH;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'void main() {\\n' +\n 'vec4 color = vec4(0, 0, 0, 1);\\n' +\n 'for (float h = 0.0; h < 9.0; h+=1.0) {\\n' +\n 'for (float w = 0.0; w < 9.0; w+=1.0) {\\n' +\n 'vec2 matrixPos = vec2(uStepW * (w - 4.0), uStepH * (h - 4.0));\\n' +\n 'color.rgb += texture2D(uTexture, vTexCoord + matrixPos).rgb * uMatrix[int(h * 9.0 + w)];\\n' +\n '}\\n' +\n '}\\n' +\n 'float alpha = texture2D(uTexture, vTexCoord).a;\\n' +\n 'gl_FragColor = color;\\n' +\n 'gl_FragColor.a = alpha;\\n' +\n '}',\n },\n\n /**\n * Constructor\n * @memberOf fabric.Image.filters.Convolute.prototype\n * @param {Object} [options] Options object\n * @param {Boolean} [options.opaque=false] Opaque value (true/false)\n * @param {Array} [options.matrix] Filter matrix\n */\n\n\n /**\n * Retrieves the cached shader.\n * @param {Object} options\n * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n */\n retrieveShader: function(options) {\n var size = Math.sqrt(this.matrix.length);\n var cacheKey = this.type + '_' + size + '_' + (this.opaque ? 1 : 0);\n var shaderSource = this.fragmentSource[cacheKey];\n if (!options.programCache.hasOwnProperty(cacheKey)) {\n options.programCache[cacheKey] = this.createProgram(options.context, shaderSource);\n }\n return options.programCache[cacheKey];\n },\n\n /**\n * Apply the Brightness operation to a Uint8ClampedArray representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n */\n applyTo2d: function(options) {\n var imageData = options.imageData,\n data = imageData.data,\n weights = this.matrix,\n side = Math.round(Math.sqrt(weights.length)),\n halfSide = Math.floor(side / 2),\n sw = imageData.width,\n sh = imageData.height,\n output = options.ctx.createImageData(sw, sh),\n dst = output.data,\n // go through the destination image pixels\n alphaFac = this.opaque ? 1 : 0,\n r, g, b, a, dstOff,\n scx, scy, srcOff, wt,\n x, y, cx, cy;\n\n for (y = 0; y < sh; y++) {\n for (x = 0; x < sw; x++) {\n dstOff = (y * sw + x) * 4;\n // calculate the weighed sum of the source image pixels that\n // fall under the convolution matrix\n r = 0; g = 0; b = 0; a = 0;\n\n for (cy = 0; cy < side; cy++) {\n for (cx = 0; cx < side; cx++) {\n scy = y + cy - halfSide;\n scx = x + cx - halfSide;\n\n // eslint-disable-next-line max-depth\n if (scy < 0 || scy >= sh || scx < 0 || scx >= sw) {\n continue;\n }\n\n srcOff = (scy * sw + scx) * 4;\n wt = weights[cy * side + cx];\n\n r += data[srcOff] * wt;\n g += data[srcOff + 1] * wt;\n b += data[srcOff + 2] * wt;\n // eslint-disable-next-line max-depth\n if (!alphaFac) {\n a += data[srcOff + 3] * wt;\n }\n }\n }\n dst[dstOff] = r;\n dst[dstOff + 1] = g;\n dst[dstOff + 2] = b;\n if (!alphaFac) {\n dst[dstOff + 3] = a;\n }\n else {\n dst[dstOff + 3] = data[dstOff + 3];\n }\n }\n }\n options.imageData = output;\n },\n\n /**\n * Return WebGL uniform locations for this filter's shader.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {WebGLShaderProgram} program This filter's compiled shader program.\n */\n getUniformLocations: function(gl, program) {\n return {\n uMatrix: gl.getUniformLocation(program, 'uMatrix'),\n uOpaque: gl.getUniformLocation(program, 'uOpaque'),\n uHalfSize: gl.getUniformLocation(program, 'uHalfSize'),\n uSize: gl.getUniformLocation(program, 'uSize'),\n };\n },\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData: function(gl, uniformLocations) {\n gl.uniform1fv(uniformLocations.uMatrix, this.matrix);\n },\n\n /**\n * Returns object representation of an instance\n * @return {Object} Object representation of an instance\n */\n toObject: function() {\n return extend(this.callSuper('toObject'), {\n opaque: this.opaque,\n matrix: this.matrix\n });\n }\n });\n\n /**\n * Returns filter instance from an object representation\n * @static\n * @param {Object} object Object to create an instance from\n * @param {function} [callback] to be invoked after filter creation\n * @return {fabric.Image.filters.Convolute} Instance of fabric.Image.filters.Convolute\n */\n fabric.Image.filters.Convolute.fromObject = fabric.Image.filters.BaseFilter.fromObject;\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n filters = fabric.Image.filters,\n createClass = fabric.util.createClass;\n\n /**\n * Grayscale image filter class\n * @class fabric.Image.filters.Grayscale\n * @memberOf fabric.Image.filters\n * @extends fabric.Image.filters.BaseFilter\n * @see {@link http://fabricjs.com/image-filters|ImageFilters demo}\n * @example\n * var filter = new fabric.Image.filters.Grayscale();\n * object.filters.push(filter);\n * object.applyFilters();\n */\n filters.Grayscale = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Grayscale.prototype */ {\n\n /**\n * Filter type\n * @param {String} type\n * @default\n */\n type: 'Grayscale',\n\n fragmentSource: {\n average: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'void main() {\\n' +\n 'vec4 color = texture2D(uTexture, vTexCoord);\\n' +\n 'float average = (color.r + color.b + color.g) / 3.0;\\n' +\n 'gl_FragColor = vec4(average, average, average, color.a);\\n' +\n '}',\n lightness: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform int uMode;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'void main() {\\n' +\n 'vec4 col = texture2D(uTexture, vTexCoord);\\n' +\n 'float average = (max(max(col.r, col.g),col.b) + min(min(col.r, col.g),col.b)) / 2.0;\\n' +\n 'gl_FragColor = vec4(average, average, average, col.a);\\n' +\n '}',\n luminosity: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform int uMode;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'void main() {\\n' +\n 'vec4 col = texture2D(uTexture, vTexCoord);\\n' +\n 'float average = 0.21 * col.r + 0.72 * col.g + 0.07 * col.b;\\n' +\n 'gl_FragColor = vec4(average, average, average, col.a);\\n' +\n '}',\n },\n\n\n /**\n * Grayscale mode, between 'average', 'lightness', 'luminosity'\n * @param {String} type\n * @default\n */\n mode: 'average',\n\n mainParameter: 'mode',\n\n /**\n * Apply the Grayscale operation to a Uint8Array representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8Array to be filtered.\n */\n applyTo2d: function(options) {\n var imageData = options.imageData,\n data = imageData.data, i,\n len = data.length, value,\n mode = this.mode;\n for (i = 0; i < len; i += 4) {\n if (mode === 'average') {\n value = (data[i] + data[i + 1] + data[i + 2]) / 3;\n }\n else if (mode === 'lightness') {\n value = (Math.min(data[i], data[i + 1], data[i + 2]) +\n Math.max(data[i], data[i + 1], data[i + 2])) / 2;\n }\n else if (mode === 'luminosity') {\n value = 0.21 * data[i] + 0.72 * data[i + 1] + 0.07 * data[i + 2];\n }\n data[i] = value;\n data[i + 1] = value;\n data[i + 2] = value;\n }\n },\n\n /**\n * Retrieves the cached shader.\n * @param {Object} options\n * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n */\n retrieveShader: function(options) {\n var cacheKey = this.type + '_' + this.mode;\n if (!options.programCache.hasOwnProperty(cacheKey)) {\n var shaderSource = this.fragmentSource[this.mode];\n options.programCache[cacheKey] = this.createProgram(options.context, shaderSource);\n }\n return options.programCache[cacheKey];\n },\n\n /**\n * Return WebGL uniform locations for this filter's shader.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {WebGLShaderProgram} program This filter's compiled shader program.\n */\n getUniformLocations: function(gl, program) {\n return {\n uMode: gl.getUniformLocation(program, 'uMode'),\n };\n },\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData: function(gl, uniformLocations) {\n // default average mode.\n var mode = 1;\n gl.uniform1i(uniformLocations.uMode, mode);\n },\n\n /**\n * Grayscale filter isNeutralState implementation\n * The filter is never neutral\n * on the image\n **/\n isNeutralState: function() {\n return false;\n },\n });\n\n /**\n * Returns filter instance from an object representation\n * @static\n * @param {Object} object Object to create an instance from\n * @param {function} [callback] to be invoked after filter creation\n * @return {fabric.Image.filters.Grayscale} Instance of fabric.Image.filters.Grayscale\n */\n fabric.Image.filters.Grayscale.fromObject = fabric.Image.filters.BaseFilter.fromObject;\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n filters = fabric.Image.filters,\n createClass = fabric.util.createClass;\n\n /**\n * Invert filter class\n * @class fabric.Image.filters.Invert\n * @memberOf fabric.Image.filters\n * @extends fabric.Image.filters.BaseFilter\n * @see {@link http://fabricjs.com/image-filters|ImageFilters demo}\n * @example\n * var filter = new fabric.Image.filters.Invert();\n * object.filters.push(filter);\n * object.applyFilters(canvas.renderAll.bind(canvas));\n */\n filters.Invert = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Invert.prototype */ {\n\n /**\n * Filter type\n * @param {String} type\n * @default\n */\n type: 'Invert',\n\n fragmentSource: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform int uInvert;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'void main() {\\n' +\n 'vec4 color = texture2D(uTexture, vTexCoord);\\n' +\n 'if (uInvert == 1) {\\n' +\n 'gl_FragColor = vec4(1.0 - color.r,1.0 -color.g,1.0 -color.b,color.a);\\n' +\n '} else {\\n' +\n 'gl_FragColor = color;\\n' +\n '}\\n' +\n '}',\n\n /**\n * Filter invert. if false, does nothing\n * @param {Boolean} invert\n * @default\n */\n invert: true,\n\n mainParameter: 'invert',\n\n /**\n * Apply the Invert operation to a Uint8Array representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8Array to be filtered.\n */\n applyTo2d: function(options) {\n var imageData = options.imageData,\n data = imageData.data, i,\n len = data.length;\n for (i = 0; i < len; i += 4) {\n data[i] = 255 - data[i];\n data[i + 1] = 255 - data[i + 1];\n data[i + 2] = 255 - data[i + 2];\n }\n },\n\n /**\n * Invert filter isNeutralState implementation\n * Used only in image applyFilters to discard filters that will not have an effect\n * on the image\n * @param {Object} options\n **/\n isNeutralState: function() {\n return !this.invert;\n },\n\n /**\n * Return WebGL uniform locations for this filter's shader.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {WebGLShaderProgram} program This filter's compiled shader program.\n */\n getUniformLocations: function(gl, program) {\n return {\n uInvert: gl.getUniformLocation(program, 'uInvert'),\n };\n },\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData: function(gl, uniformLocations) {\n gl.uniform1i(uniformLocations.uInvert, this.invert);\n },\n });\n\n /**\n * Returns filter instance from an object representation\n * @static\n * @param {Object} object Object to create an instance from\n * @param {function} [callback] to be invoked after filter creation\n * @return {fabric.Image.filters.Invert} Instance of fabric.Image.filters.Invert\n */\n fabric.Image.filters.Invert.fromObject = fabric.Image.filters.BaseFilter.fromObject;\n\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n extend = fabric.util.object.extend,\n filters = fabric.Image.filters,\n createClass = fabric.util.createClass;\n\n /**\n * Noise filter class\n * @class fabric.Image.filters.Noise\n * @memberOf fabric.Image.filters\n * @extends fabric.Image.filters.BaseFilter\n * @see {@link fabric.Image.filters.Noise#initialize} for constructor definition\n * @see {@link http://fabricjs.com/image-filters|ImageFilters demo}\n * @example\n * var filter = new fabric.Image.filters.Noise({\n * noise: 700\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n */\n filters.Noise = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Noise.prototype */ {\n\n /**\n * Filter type\n * @param {String} type\n * @default\n */\n type: 'Noise',\n\n /**\n * Fragment source for the noise program\n */\n fragmentSource: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform float uStepH;\\n' +\n 'uniform float uNoise;\\n' +\n 'uniform float uSeed;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'float rand(vec2 co, float seed, float vScale) {\\n' +\n 'return fract(sin(dot(co.xy * vScale ,vec2(12.9898 , 78.233))) * 43758.5453 * (seed + 0.01) / 2.0);\\n' +\n '}\\n' +\n 'void main() {\\n' +\n 'vec4 color = texture2D(uTexture, vTexCoord);\\n' +\n 'color.rgb += (0.5 - rand(vTexCoord, uSeed, 0.1 / uStepH)) * uNoise;\\n' +\n 'gl_FragColor = color;\\n' +\n '}',\n\n /**\n * Describe the property that is the filter parameter\n * @param {String} m\n * @default\n */\n mainParameter: 'noise',\n\n /**\n * Noise value, from\n * @param {Number} noise\n * @default\n */\n noise: 0,\n\n /**\n * Apply the Brightness operation to a Uint8ClampedArray representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n */\n applyTo2d: function(options) {\n if (this.noise === 0) {\n return;\n }\n var imageData = options.imageData,\n data = imageData.data, i, len = data.length,\n noise = this.noise, rand;\n\n for (i = 0, len = data.length; i < len; i += 4) {\n\n rand = (0.5 - Math.random()) * noise;\n\n data[i] += rand;\n data[i + 1] += rand;\n data[i + 2] += rand;\n }\n },\n\n /**\n * Return WebGL uniform locations for this filter's shader.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {WebGLShaderProgram} program This filter's compiled shader program.\n */\n getUniformLocations: function(gl, program) {\n return {\n uNoise: gl.getUniformLocation(program, 'uNoise'),\n uSeed: gl.getUniformLocation(program, 'uSeed'),\n };\n },\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData: function(gl, uniformLocations) {\n gl.uniform1f(uniformLocations.uNoise, this.noise / 255);\n gl.uniform1f(uniformLocations.uSeed, Math.random());\n },\n\n /**\n * Returns object representation of an instance\n * @return {Object} Object representation of an instance\n */\n toObject: function() {\n return extend(this.callSuper('toObject'), {\n noise: this.noise\n });\n }\n });\n\n /**\n * Returns filter instance from an object representation\n * @static\n * @param {Object} object Object to create an instance from\n * @param {Function} [callback] to be invoked after filter creation\n * @return {fabric.Image.filters.Noise} Instance of fabric.Image.filters.Noise\n */\n fabric.Image.filters.Noise.fromObject = fabric.Image.filters.BaseFilter.fromObject;\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n filters = fabric.Image.filters,\n createClass = fabric.util.createClass;\n\n /**\n * Pixelate filter class\n * @class fabric.Image.filters.Pixelate\n * @memberOf fabric.Image.filters\n * @extends fabric.Image.filters.BaseFilter\n * @see {@link fabric.Image.filters.Pixelate#initialize} for constructor definition\n * @see {@link http://fabricjs.com/image-filters|ImageFilters demo}\n * @example\n * var filter = new fabric.Image.filters.Pixelate({\n * blocksize: 8\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n */\n filters.Pixelate = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Pixelate.prototype */ {\n\n /**\n * Filter type\n * @param {String} type\n * @default\n */\n type: 'Pixelate',\n\n blocksize: 4,\n\n mainParameter: 'blocksize',\n\n /**\n * Fragment source for the Pixelate program\n */\n fragmentSource: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform float uBlocksize;\\n' +\n 'uniform float uStepW;\\n' +\n 'uniform float uStepH;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'void main() {\\n' +\n 'float blockW = uBlocksize * uStepW;\\n' +\n 'float blockH = uBlocksize * uStepW;\\n' +\n 'int posX = int(vTexCoord.x / blockW);\\n' +\n 'int posY = int(vTexCoord.y / blockH);\\n' +\n 'float fposX = float(posX);\\n' +\n 'float fposY = float(posY);\\n' +\n 'vec2 squareCoords = vec2(fposX * blockW, fposY * blockH);\\n' +\n 'vec4 color = texture2D(uTexture, squareCoords);\\n' +\n 'gl_FragColor = color;\\n' +\n '}',\n\n /**\n * Apply the Pixelate operation to a Uint8ClampedArray representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n */\n applyTo2d: function(options) {\n var imageData = options.imageData,\n data = imageData.data,\n iLen = imageData.height,\n jLen = imageData.width,\n index, i, j, r, g, b, a,\n _i, _j, _iLen, _jLen;\n\n for (i = 0; i < iLen; i += this.blocksize) {\n for (j = 0; j < jLen; j += this.blocksize) {\n\n index = (i * 4) * jLen + (j * 4);\n\n r = data[index];\n g = data[index + 1];\n b = data[index + 2];\n a = data[index + 3];\n\n _iLen = Math.min(i + this.blocksize, iLen);\n _jLen = Math.min(j + this.blocksize, jLen);\n for (_i = i; _i < _iLen; _i++) {\n for (_j = j; _j < _jLen; _j++) {\n index = (_i * 4) * jLen + (_j * 4);\n data[index] = r;\n data[index + 1] = g;\n data[index + 2] = b;\n data[index + 3] = a;\n }\n }\n }\n }\n },\n\n /**\n * Indicate when the filter is not gonna apply changes to the image\n **/\n isNeutralState: function() {\n return this.blocksize === 1;\n },\n\n /**\n * Return WebGL uniform locations for this filter's shader.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {WebGLShaderProgram} program This filter's compiled shader program.\n */\n getUniformLocations: function(gl, program) {\n return {\n uBlocksize: gl.getUniformLocation(program, 'uBlocksize'),\n uStepW: gl.getUniformLocation(program, 'uStepW'),\n uStepH: gl.getUniformLocation(program, 'uStepH'),\n };\n },\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData: function(gl, uniformLocations) {\n gl.uniform1f(uniformLocations.uBlocksize, this.blocksize);\n },\n });\n\n /**\n * Returns filter instance from an object representation\n * @static\n * @param {Object} object Object to create an instance from\n * @param {Function} [callback] to be invoked after filter creation\n * @return {fabric.Image.filters.Pixelate} Instance of fabric.Image.filters.Pixelate\n */\n fabric.Image.filters.Pixelate.fromObject = fabric.Image.filters.BaseFilter.fromObject;\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n extend = fabric.util.object.extend,\n filters = fabric.Image.filters,\n createClass = fabric.util.createClass;\n\n /**\n * Remove white filter class\n * @class fabric.Image.filters.RemoveColor\n * @memberOf fabric.Image.filters\n * @extends fabric.Image.filters.BaseFilter\n * @see {@link fabric.Image.filters.RemoveColor#initialize} for constructor definition\n * @see {@link http://fabricjs.com/image-filters|ImageFilters demo}\n * @example\n * var filter = new fabric.Image.filters.RemoveColor({\n * threshold: 0.2,\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n */\n filters.RemoveColor = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.RemoveColor.prototype */ {\n\n /**\n * Filter type\n * @param {String} type\n * @default\n */\n type: 'RemoveColor',\n\n /**\n * Color to remove, in any format understood by fabric.Color.\n * @param {String} type\n * @default\n */\n color: '#FFFFFF',\n\n /**\n * Fragment source for the brightness program\n */\n fragmentSource: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform vec4 uLow;\\n' +\n 'uniform vec4 uHigh;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'void main() {\\n' +\n 'gl_FragColor = texture2D(uTexture, vTexCoord);\\n' +\n 'if(all(greaterThan(gl_FragColor.rgb,uLow.rgb)) && all(greaterThan(uHigh.rgb,gl_FragColor.rgb))) {\\n' +\n 'gl_FragColor.a = 0.0;\\n' +\n '}\\n' +\n '}',\n\n /**\n * distance to actual color, as value up or down from each r,g,b\n * between 0 and 1\n **/\n distance: 0.02,\n\n /**\n * For color to remove inside distance, use alpha channel for a smoother deletion\n * NOT IMPLEMENTED YET\n **/\n useAlpha: false,\n\n /**\n * Constructor\n * @memberOf fabric.Image.filters.RemoveWhite.prototype\n * @param {Object} [options] Options object\n * @param {Number} [options.color=#RRGGBB] Threshold value\n * @param {Number} [options.distance=10] Distance value\n */\n\n /**\n * Applies filter to canvas element\n * @param {Object} canvasEl Canvas element to apply filter to\n */\n applyTo2d: function(options) {\n var imageData = options.imageData,\n data = imageData.data, i,\n distance = this.distance * 255,\n r, g, b,\n source = new fabric.Color(this.color).getSource(),\n lowC = [\n source[0] - distance,\n source[1] - distance,\n source[2] - distance,\n ],\n highC = [\n source[0] + distance,\n source[1] + distance,\n source[2] + distance,\n ];\n\n\n for (i = 0; i < data.length; i += 4) {\n r = data[i];\n g = data[i + 1];\n b = data[i + 2];\n\n if (r > lowC[0] &&\n g > lowC[1] &&\n b > lowC[2] &&\n r < highC[0] &&\n g < highC[1] &&\n b < highC[2]) {\n data[i + 3] = 0;\n }\n }\n },\n\n /**\n * Return WebGL uniform locations for this filter's shader.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {WebGLShaderProgram} program This filter's compiled shader program.\n */\n getUniformLocations: function(gl, program) {\n return {\n uLow: gl.getUniformLocation(program, 'uLow'),\n uHigh: gl.getUniformLocation(program, 'uHigh'),\n };\n },\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData: function(gl, uniformLocations) {\n var source = new fabric.Color(this.color).getSource(),\n distance = parseFloat(this.distance),\n lowC = [\n 0 + source[0] / 255 - distance,\n 0 + source[1] / 255 - distance,\n 0 + source[2] / 255 - distance,\n 1\n ],\n highC = [\n source[0] / 255 + distance,\n source[1] / 255 + distance,\n source[2] / 255 + distance,\n 1\n ];\n gl.uniform4fv(uniformLocations.uLow, lowC);\n gl.uniform4fv(uniformLocations.uHigh, highC);\n },\n\n /**\n * Returns object representation of an instance\n * @return {Object} Object representation of an instance\n */\n toObject: function() {\n return extend(this.callSuper('toObject'), {\n color: this.color,\n distance: this.distance\n });\n }\n });\n\n /**\n * Returns filter instance from an object representation\n * @static\n * @param {Object} object Object to create an instance from\n * @param {Function} [callback] to be invoked after filter creation\n * @return {fabric.Image.filters.RemoveColor} Instance of fabric.Image.filters.RemoveWhite\n */\n fabric.Image.filters.RemoveColor.fromObject = fabric.Image.filters.BaseFilter.fromObject;\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n filters = fabric.Image.filters,\n createClass = fabric.util.createClass;\n\n var matrices = {\n Brownie: [\n 0.59970,0.34553,-0.27082,0,0.186,\n -0.03770,0.86095,0.15059,0,-0.1449,\n 0.24113,-0.07441,0.44972,0,-0.02965,\n 0,0,0,1,0\n ],\n Vintage: [\n 0.62793,0.32021,-0.03965,0,0.03784,\n 0.02578,0.64411,0.03259,0,0.02926,\n 0.04660,-0.08512,0.52416,0,0.02023,\n 0,0,0,1,0\n ],\n Kodachrome: [\n 1.12855,-0.39673,-0.03992,0,0.24991,\n -0.16404,1.08352,-0.05498,0,0.09698,\n -0.16786,-0.56034,1.60148,0,0.13972,\n 0,0,0,1,0\n ],\n Technicolor: [\n 1.91252,-0.85453,-0.09155,0,0.04624,\n -0.30878,1.76589,-0.10601,0,-0.27589,\n -0.23110,-0.75018,1.84759,0,0.12137,\n 0,0,0,1,0\n ],\n Polaroid: [\n 1.438,-0.062,-0.062,0,0,\n -0.122,1.378,-0.122,0,0,\n -0.016,-0.016,1.483,0,0,\n 0,0,0,1,0\n ],\n Sepia: [\n 0.393, 0.769, 0.189, 0, 0,\n 0.349, 0.686, 0.168, 0, 0,\n 0.272, 0.534, 0.131, 0, 0,\n 0, 0, 0, 1, 0\n ],\n BlackWhite: [\n 1.5, 1.5, 1.5, 0, -1,\n 1.5, 1.5, 1.5, 0, -1,\n 1.5, 1.5, 1.5, 0, -1,\n 0, 0, 0, 1, 0,\n ]\n };\n\n for (var key in matrices) {\n filters[key] = createClass(filters.ColorMatrix, /** @lends fabric.Image.filters.Sepia.prototype */ {\n\n /**\n * Filter type\n * @param {String} type\n * @default\n */\n type: key,\n\n /**\n * Colormatrix for the effect\n * array of 20 floats. Numbers in positions 4, 9, 14, 19 loose meaning\n * outside the -1, 1 range.\n * @param {Array} matrix array of 20 numbers.\n * @default\n */\n matrix: matrices[key],\n\n /**\n * Lock the matrix export for this kind of static, parameter less filters.\n */\n mainParameter: false,\n /**\n * Lock the colormatrix on the color part, skipping alpha\n */\n colorsOnly: true,\n\n });\n fabric.Image.filters[key].fromObject = fabric.Image.filters.BaseFilter.fromObject;\n }\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n 'use strict';\n\n var fabric = global.fabric,\n filters = fabric.Image.filters,\n createClass = fabric.util.createClass;\n\n /**\n * Color Blend filter class\n * @class fabric.Image.filter.BlendColor\n * @memberOf fabric.Image.filters\n * @extends fabric.Image.filters.BaseFilter\n * @example\n * var filter = new fabric.Image.filters.BlendColor({\n * color: '#000',\n * mode: 'multiply'\n * });\n *\n * var filter = new fabric.Image.filters.BlendImage({\n * image: fabricImageObject,\n * mode: 'multiply',\n * alpha: 0.5\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n */\n\n filters.BlendColor = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Blend.prototype */ {\n type: 'BlendColor',\n\n /**\n * Color to make the blend operation with. default to a reddish color since black or white\n * gives always strong result.\n * @type String\n * @default\n **/\n color: '#F95C63',\n\n /**\n * Blend mode for the filter: one of multiply, add, diff, screen, subtract,\n * darken, lighten, overlay, exclusion, tint.\n * @type String\n * @default\n **/\n mode: 'multiply',\n\n /**\n * alpha value. represent the strength of the blend color operation.\n * @type Number\n * @default\n **/\n alpha: 1,\n\n /**\n * Fragment source for the Multiply program\n */\n fragmentSource: {\n multiply: 'gl_FragColor.rgb *= uColor.rgb;\\n',\n screen: 'gl_FragColor.rgb = 1.0 - (1.0 - gl_FragColor.rgb) * (1.0 - uColor.rgb);\\n',\n add: 'gl_FragColor.rgb += uColor.rgb;\\n',\n diff: 'gl_FragColor.rgb = abs(gl_FragColor.rgb - uColor.rgb);\\n',\n subtract: 'gl_FragColor.rgb -= uColor.rgb;\\n',\n lighten: 'gl_FragColor.rgb = max(gl_FragColor.rgb, uColor.rgb);\\n',\n darken: 'gl_FragColor.rgb = min(gl_FragColor.rgb, uColor.rgb);\\n',\n exclusion: 'gl_FragColor.rgb += uColor.rgb - 2.0 * (uColor.rgb * gl_FragColor.rgb);\\n',\n overlay: 'if (uColor.r < 0.5) {\\n' +\n 'gl_FragColor.r *= 2.0 * uColor.r;\\n' +\n '} else {\\n' +\n 'gl_FragColor.r = 1.0 - 2.0 * (1.0 - gl_FragColor.r) * (1.0 - uColor.r);\\n' +\n '}\\n' +\n 'if (uColor.g < 0.5) {\\n' +\n 'gl_FragColor.g *= 2.0 * uColor.g;\\n' +\n '} else {\\n' +\n 'gl_FragColor.g = 1.0 - 2.0 * (1.0 - gl_FragColor.g) * (1.0 - uColor.g);\\n' +\n '}\\n' +\n 'if (uColor.b < 0.5) {\\n' +\n 'gl_FragColor.b *= 2.0 * uColor.b;\\n' +\n '} else {\\n' +\n 'gl_FragColor.b = 1.0 - 2.0 * (1.0 - gl_FragColor.b) * (1.0 - uColor.b);\\n' +\n '}\\n',\n tint: 'gl_FragColor.rgb *= (1.0 - uColor.a);\\n' +\n 'gl_FragColor.rgb += uColor.rgb;\\n',\n },\n\n /**\n * build the fragment source for the filters, joining the common part with\n * the specific one.\n * @param {String} mode the mode of the filter, a key of this.fragmentSource\n * @return {String} the source to be compiled\n * @private\n */\n buildSource: function(mode) {\n return 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform vec4 uColor;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'void main() {\\n' +\n 'vec4 color = texture2D(uTexture, vTexCoord);\\n' +\n 'gl_FragColor = color;\\n' +\n 'if (color.a > 0.0) {\\n' +\n this.fragmentSource[mode] +\n '}\\n' +\n '}';\n },\n\n /**\n * Retrieves the cached shader.\n * @param {Object} options\n * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n */\n retrieveShader: function(options) {\n var cacheKey = this.type + '_' + this.mode, shaderSource;\n if (!options.programCache.hasOwnProperty(cacheKey)) {\n shaderSource = this.buildSource(this.mode);\n options.programCache[cacheKey] = this.createProgram(options.context, shaderSource);\n }\n return options.programCache[cacheKey];\n },\n\n /**\n * Apply the Blend operation to a Uint8ClampedArray representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n */\n applyTo2d: function(options) {\n var imageData = options.imageData,\n data = imageData.data, iLen = data.length,\n tr, tg, tb,\n r, g, b,\n source, alpha1 = 1 - this.alpha;\n\n source = new fabric.Color(this.color).getSource();\n tr = source[0] * this.alpha;\n tg = source[1] * this.alpha;\n tb = source[2] * this.alpha;\n\n for (var i = 0; i < iLen; i += 4) {\n\n r = data[i];\n g = data[i + 1];\n b = data[i + 2];\n\n switch (this.mode) {\n case 'multiply':\n data[i] = r * tr / 255;\n data[i + 1] = g * tg / 255;\n data[i + 2] = b * tb / 255;\n break;\n case 'screen':\n data[i] = 255 - (255 - r) * (255 - tr) / 255;\n data[i + 1] = 255 - (255 - g) * (255 - tg) / 255;\n data[i + 2] = 255 - (255 - b) * (255 - tb) / 255;\n break;\n case 'add':\n data[i] = r + tr;\n data[i + 1] = g + tg;\n data[i + 2] = b + tb;\n break;\n case 'diff':\n case 'difference':\n data[i] = Math.abs(r - tr);\n data[i + 1] = Math.abs(g - tg);\n data[i + 2] = Math.abs(b - tb);\n break;\n case 'subtract':\n data[i] = r - tr;\n data[i + 1] = g - tg;\n data[i + 2] = b - tb;\n break;\n case 'darken':\n data[i] = Math.min(r, tr);\n data[i + 1] = Math.min(g, tg);\n data[i + 2] = Math.min(b, tb);\n break;\n case 'lighten':\n data[i] = Math.max(r, tr);\n data[i + 1] = Math.max(g, tg);\n data[i + 2] = Math.max(b, tb);\n break;\n case 'overlay':\n data[i] = tr < 128 ? (2 * r * tr / 255) : (255 - 2 * (255 - r) * (255 - tr) / 255);\n data[i + 1] = tg < 128 ? (2 * g * tg / 255) : (255 - 2 * (255 - g) * (255 - tg) / 255);\n data[i + 2] = tb < 128 ? (2 * b * tb / 255) : (255 - 2 * (255 - b) * (255 - tb) / 255);\n break;\n case 'exclusion':\n data[i] = tr + r - ((2 * tr * r) / 255);\n data[i + 1] = tg + g - ((2 * tg * g) / 255);\n data[i + 2] = tb + b - ((2 * tb * b) / 255);\n break;\n case 'tint':\n data[i] = tr + r * alpha1;\n data[i + 1] = tg + g * alpha1;\n data[i + 2] = tb + b * alpha1;\n }\n }\n },\n\n /**\n * Return WebGL uniform locations for this filter's shader.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {WebGLShaderProgram} program This filter's compiled shader program.\n */\n getUniformLocations: function(gl, program) {\n return {\n uColor: gl.getUniformLocation(program, 'uColor'),\n };\n },\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData: function(gl, uniformLocations) {\n var source = new fabric.Color(this.color).getSource();\n source[0] = this.alpha * source[0] / 255;\n source[1] = this.alpha * source[1] / 255;\n source[2] = this.alpha * source[2] / 255;\n source[3] = this.alpha;\n gl.uniform4fv(uniformLocations.uColor, source);\n },\n\n /**\n * Returns object representation of an instance\n * @return {Object} Object representation of an instance\n */\n toObject: function() {\n return {\n type: this.type,\n color: this.color,\n mode: this.mode,\n alpha: this.alpha\n };\n }\n });\n\n /**\n * Returns filter instance from an object representation\n * @static\n * @param {Object} object Object to create an instance from\n * @param {function} [callback] to be invoked after filter creation\n * @return {fabric.Image.filters.BlendColor} Instance of fabric.Image.filters.BlendColor\n */\n fabric.Image.filters.BlendColor.fromObject = fabric.Image.filters.BaseFilter.fromObject;\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n 'use strict';\n\n var fabric = global.fabric,\n filters = fabric.Image.filters,\n createClass = fabric.util.createClass;\n\n /**\n * Image Blend filter class\n * @class fabric.Image.filter.BlendImage\n * @memberOf fabric.Image.filters\n * @extends fabric.Image.filters.BaseFilter\n * @example\n * var filter = new fabric.Image.filters.BlendColor({\n * color: '#000',\n * mode: 'multiply'\n * });\n *\n * var filter = new fabric.Image.filters.BlendImage({\n * image: fabricImageObject,\n * mode: 'multiply',\n * alpha: 0.5\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n */\n\n filters.BlendImage = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.BlendImage.prototype */ {\n type: 'BlendImage',\n\n /**\n * Color to make the blend operation with. default to a reddish color since black or white\n * gives always strong result.\n **/\n image: null,\n\n /**\n * Blend mode for the filter (one of \"multiply\", \"mask\")\n * @type String\n * @default\n **/\n mode: 'multiply',\n\n /**\n * alpha value. represent the strength of the blend image operation.\n * not implemented.\n **/\n alpha: 1,\n\n vertexSource: 'attribute vec2 aPosition;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'varying vec2 vTexCoord2;\\n' +\n 'uniform mat3 uTransformMatrix;\\n' +\n 'void main() {\\n' +\n 'vTexCoord = aPosition;\\n' +\n 'vTexCoord2 = (uTransformMatrix * vec3(aPosition, 1.0)).xy;\\n' +\n 'gl_Position = vec4(aPosition * 2.0 - 1.0, 0.0, 1.0);\\n' +\n '}',\n\n /**\n * Fragment source for the Multiply program\n */\n fragmentSource: {\n multiply: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform sampler2D uImage;\\n' +\n 'uniform vec4 uColor;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'varying vec2 vTexCoord2;\\n' +\n 'void main() {\\n' +\n 'vec4 color = texture2D(uTexture, vTexCoord);\\n' +\n 'vec4 color2 = texture2D(uImage, vTexCoord2);\\n' +\n 'color.rgba *= color2.rgba;\\n' +\n 'gl_FragColor = color;\\n' +\n '}',\n mask: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform sampler2D uImage;\\n' +\n 'uniform vec4 uColor;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'varying vec2 vTexCoord2;\\n' +\n 'void main() {\\n' +\n 'vec4 color = texture2D(uTexture, vTexCoord);\\n' +\n 'vec4 color2 = texture2D(uImage, vTexCoord2);\\n' +\n 'color.a = color2.a;\\n' +\n 'gl_FragColor = color;\\n' +\n '}',\n },\n\n /**\n * Retrieves the cached shader.\n * @param {Object} options\n * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n */\n retrieveShader: function(options) {\n var cacheKey = this.type + '_' + this.mode;\n var shaderSource = this.fragmentSource[this.mode];\n if (!options.programCache.hasOwnProperty(cacheKey)) {\n options.programCache[cacheKey] = this.createProgram(options.context, shaderSource);\n }\n return options.programCache[cacheKey];\n },\n\n applyToWebGL: function(options) {\n // load texture to blend.\n var gl = options.context,\n texture = this.createTexture(options.filterBackend, this.image);\n this.bindAdditionalTexture(gl, texture, gl.TEXTURE1);\n this.callSuper('applyToWebGL', options);\n this.unbindAdditionalTexture(gl, gl.TEXTURE1);\n },\n\n createTexture: function(backend, image) {\n return backend.getCachedTexture(image.cacheKey, image._element);\n },\n\n /**\n * Calculate a transformMatrix to adapt the image to blend over\n * @param {Object} options\n * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n */\n calculateMatrix: function() {\n var image = this.image,\n width = image._element.width,\n height = image._element.height;\n return [\n 1 / image.scaleX, 0, 0,\n 0, 1 / image.scaleY, 0,\n -image.left / width, -image.top / height, 1\n ];\n },\n\n /**\n * Apply the Blend operation to a Uint8ClampedArray representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n */\n applyTo2d: function(options) {\n var imageData = options.imageData,\n resources = options.filterBackend.resources,\n data = imageData.data, iLen = data.length,\n width = imageData.width,\n height = imageData.height,\n tr, tg, tb, ta,\n r, g, b, a,\n canvas1, context, image = this.image, blendData;\n\n if (!resources.blendImage) {\n resources.blendImage = fabric.util.createCanvasElement();\n }\n canvas1 = resources.blendImage;\n context = canvas1.getContext('2d');\n if (canvas1.width !== width || canvas1.height !== height) {\n canvas1.width = width;\n canvas1.height = height;\n }\n else {\n context.clearRect(0, 0, width, height);\n }\n context.setTransform(image.scaleX, 0, 0, image.scaleY, image.left, image.top);\n context.drawImage(image._element, 0, 0, width, height);\n blendData = context.getImageData(0, 0, width, height).data;\n for (var i = 0; i < iLen; i += 4) {\n\n r = data[i];\n g = data[i + 1];\n b = data[i + 2];\n a = data[i + 3];\n\n tr = blendData[i];\n tg = blendData[i + 1];\n tb = blendData[i + 2];\n ta = blendData[i + 3];\n\n switch (this.mode) {\n case 'multiply':\n data[i] = r * tr / 255;\n data[i + 1] = g * tg / 255;\n data[i + 2] = b * tb / 255;\n data[i + 3] = a * ta / 255;\n break;\n case 'mask':\n data[i + 3] = ta;\n break;\n }\n }\n },\n\n /**\n * Return WebGL uniform locations for this filter's shader.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {WebGLShaderProgram} program This filter's compiled shader program.\n */\n getUniformLocations: function(gl, program) {\n return {\n uTransformMatrix: gl.getUniformLocation(program, 'uTransformMatrix'),\n uImage: gl.getUniformLocation(program, 'uImage'),\n };\n },\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData: function(gl, uniformLocations) {\n var matrix = this.calculateMatrix();\n gl.uniform1i(uniformLocations.uImage, 1); // texture unit 1.\n gl.uniformMatrix3fv(uniformLocations.uTransformMatrix, false, matrix);\n },\n\n /**\n * Returns object representation of an instance\n * @return {Object} Object representation of an instance\n */\n toObject: function() {\n return {\n type: this.type,\n image: this.image && this.image.toObject(),\n mode: this.mode,\n alpha: this.alpha\n };\n }\n });\n\n /**\n * Returns filter instance from an object representation\n * @static\n * @param {Object} object Object to create an instance from\n * @param {function} callback to be invoked after filter creation\n * @return {fabric.Image.filters.BlendImage} Instance of fabric.Image.filters.BlendImage\n */\n fabric.Image.filters.BlendImage.fromObject = function(object, callback) {\n fabric.Image.fromObject(object.image, function(image) {\n var options = fabric.util.object.clone(object);\n options.image = image;\n callback(new fabric.Image.filters.BlendImage(options));\n });\n };\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }), pow = Math.pow, floor = Math.floor,\n sqrt = Math.sqrt, abs = Math.abs, round = Math.round, sin = Math.sin,\n ceil = Math.ceil,\n filters = fabric.Image.filters,\n createClass = fabric.util.createClass;\n\n /**\n * Resize image filter class\n * @class fabric.Image.filters.Resize\n * @memberOf fabric.Image.filters\n * @extends fabric.Image.filters.BaseFilter\n * @see {@link http://fabricjs.com/image-filters|ImageFilters demo}\n * @example\n * var filter = new fabric.Image.filters.Resize();\n * object.filters.push(filter);\n * object.applyFilters(canvas.renderAll.bind(canvas));\n */\n filters.Resize = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Resize.prototype */ {\n\n /**\n * Filter type\n * @param {String} type\n * @default\n */\n type: 'Resize',\n\n /**\n * Resize type\n * for webgl resizeType is just lanczos, for canvas2d can be:\n * bilinear, hermite, sliceHack, lanczos.\n * @param {String} resizeType\n * @default\n */\n resizeType: 'hermite',\n\n /**\n * Scale factor for resizing, x axis\n * @param {Number} scaleX\n * @default\n */\n scaleX: 1,\n\n /**\n * Scale factor for resizing, y axis\n * @param {Number} scaleY\n * @default\n */\n scaleY: 1,\n\n /**\n * LanczosLobes parameter for lanczos filter, valid for resizeType lanczos\n * @param {Number} lanczosLobes\n * @default\n */\n lanczosLobes: 3,\n\n\n /**\n * Return WebGL uniform locations for this filter's shader.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {WebGLShaderProgram} program This filter's compiled shader program.\n */\n getUniformLocations: function(gl, program) {\n return {\n uDelta: gl.getUniformLocation(program, 'uDelta'),\n uTaps: gl.getUniformLocation(program, 'uTaps'),\n };\n },\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData: function(gl, uniformLocations) {\n gl.uniform2fv(uniformLocations.uDelta, this.horizontal ? [1 / this.width, 0] : [0, 1 / this.height]);\n gl.uniform1fv(uniformLocations.uTaps, this.taps);\n },\n\n /**\n * Retrieves the cached shader.\n * @param {Object} options\n * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n */\n retrieveShader: function(options) {\n var filterWindow = this.getFilterWindow(), cacheKey = this.type + '_' + filterWindow;\n if (!options.programCache.hasOwnProperty(cacheKey)) {\n var fragmentShader = this.generateShader(filterWindow);\n options.programCache[cacheKey] = this.createProgram(options.context, fragmentShader);\n }\n return options.programCache[cacheKey];\n },\n\n getFilterWindow: function() {\n var scale = this.tempScale;\n return Math.ceil(this.lanczosLobes / scale);\n },\n\n getTaps: function() {\n var lobeFunction = this.lanczosCreate(this.lanczosLobes), scale = this.tempScale,\n filterWindow = this.getFilterWindow(), taps = new Array(filterWindow);\n for (var i = 1; i <= filterWindow; i++) {\n taps[i - 1] = lobeFunction(i * scale);\n }\n return taps;\n },\n\n /**\n * Generate vertex and shader sources from the necessary steps numbers\n * @param {Number} filterWindow\n */\n generateShader: function(filterWindow) {\n var offsets = new Array(filterWindow),\n fragmentShader = this.fragmentSourceTOP, filterWindow;\n\n for (var i = 1; i <= filterWindow; i++) {\n offsets[i - 1] = i + '.0 * uDelta';\n }\n\n fragmentShader += 'uniform float uTaps[' + filterWindow + '];\\n';\n fragmentShader += 'void main() {\\n';\n fragmentShader += ' vec4 color = texture2D(uTexture, vTexCoord);\\n';\n fragmentShader += ' float sum = 1.0;\\n';\n\n offsets.forEach(function(offset, i) {\n fragmentShader += ' color += texture2D(uTexture, vTexCoord + ' + offset + ') * uTaps[' + i + '];\\n';\n fragmentShader += ' color += texture2D(uTexture, vTexCoord - ' + offset + ') * uTaps[' + i + '];\\n';\n fragmentShader += ' sum += 2.0 * uTaps[' + i + '];\\n';\n });\n fragmentShader += ' gl_FragColor = color / sum;\\n';\n fragmentShader += '}';\n return fragmentShader;\n },\n\n fragmentSourceTOP: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform vec2 uDelta;\\n' +\n 'varying vec2 vTexCoord;\\n',\n\n /**\n * Apply the resize filter to the image\n * Determines whether to use WebGL or Canvas2D based on the options.webgl flag.\n *\n * @param {Object} options\n * @param {Number} options.passes The number of filters remaining to be executed\n * @param {Boolean} options.webgl Whether to use webgl to render the filter.\n * @param {WebGLTexture} options.sourceTexture The texture setup as the source to be filtered.\n * @param {WebGLTexture} options.targetTexture The texture where filtered output should be drawn.\n * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n */\n applyTo: function(options) {\n if (options.webgl) {\n options.passes++;\n this.width = options.sourceWidth;\n this.horizontal = true;\n this.dW = Math.round(this.width * this.scaleX);\n this.dH = options.sourceHeight;\n this.tempScale = this.dW / this.width;\n this.taps = this.getTaps();\n options.destinationWidth = this.dW;\n this._setupFrameBuffer(options);\n this.applyToWebGL(options);\n this._swapTextures(options);\n options.sourceWidth = options.destinationWidth;\n\n this.height = options.sourceHeight;\n this.horizontal = false;\n this.dH = Math.round(this.height * this.scaleY);\n this.tempScale = this.dH / this.height;\n this.taps = this.getTaps();\n options.destinationHeight = this.dH;\n this._setupFrameBuffer(options);\n this.applyToWebGL(options);\n this._swapTextures(options);\n options.sourceHeight = options.destinationHeight;\n }\n else {\n this.applyTo2d(options);\n }\n },\n\n isNeutralState: function() {\n return this.scaleX === 1 && this.scaleY === 1;\n },\n\n lanczosCreate: function(lobes) {\n return function(x) {\n if (x >= lobes || x <= -lobes) {\n return 0.0;\n }\n if (x < 1.19209290E-07 && x > -1.19209290E-07) {\n return 1.0;\n }\n x *= Math.PI;\n var xx = x / lobes;\n return (sin(x) / x) * sin(xx) / xx;\n };\n },\n\n /**\n * Applies filter to canvas element\n * @memberOf fabric.Image.filters.Resize.prototype\n * @param {Object} canvasEl Canvas element to apply filter to\n * @param {Number} scaleX\n * @param {Number} scaleY\n */\n applyTo2d: function(options) {\n var imageData = options.imageData,\n scaleX = this.scaleX,\n scaleY = this.scaleY;\n\n this.rcpScaleX = 1 / scaleX;\n this.rcpScaleY = 1 / scaleY;\n\n var oW = imageData.width, oH = imageData.height,\n dW = round(oW * scaleX), dH = round(oH * scaleY),\n newData;\n\n if (this.resizeType === 'sliceHack') {\n newData = this.sliceByTwo(options, oW, oH, dW, dH);\n }\n else if (this.resizeType === 'hermite') {\n newData = this.hermiteFastResize(options, oW, oH, dW, dH);\n }\n else if (this.resizeType === 'bilinear') {\n newData = this.bilinearFiltering(options, oW, oH, dW, dH);\n }\n else if (this.resizeType === 'lanczos') {\n newData = this.lanczosResize(options, oW, oH, dW, dH);\n }\n options.imageData = newData;\n },\n\n /**\n * Filter sliceByTwo\n * @param {Object} canvasEl Canvas element to apply filter to\n * @param {Number} oW Original Width\n * @param {Number} oH Original Height\n * @param {Number} dW Destination Width\n * @param {Number} dH Destination Height\n * @returns {ImageData}\n */\n sliceByTwo: function(options, oW, oH, dW, dH) {\n var imageData = options.imageData,\n mult = 0.5, doneW = false, doneH = false, stepW = oW * mult,\n stepH = oH * mult, resources = fabric.filterBackend.resources,\n tmpCanvas, ctx, sX = 0, sY = 0, dX = oW, dY = 0;\n if (!resources.sliceByTwo) {\n resources.sliceByTwo = document.createElement('canvas');\n }\n tmpCanvas = resources.sliceByTwo;\n if (tmpCanvas.width < oW * 1.5 || tmpCanvas.height < oH) {\n tmpCanvas.width = oW * 1.5;\n tmpCanvas.height = oH;\n }\n ctx = tmpCanvas.getContext('2d');\n ctx.clearRect(0, 0, oW * 1.5, oH);\n ctx.putImageData(imageData, 0, 0);\n\n dW = floor(dW);\n dH = floor(dH);\n\n while (!doneW || !doneH) {\n oW = stepW;\n oH = stepH;\n if (dW < floor(stepW * mult)) {\n stepW = floor(stepW * mult);\n }\n else {\n stepW = dW;\n doneW = true;\n }\n if (dH < floor(stepH * mult)) {\n stepH = floor(stepH * mult);\n }\n else {\n stepH = dH;\n doneH = true;\n }\n ctx.drawImage(tmpCanvas, sX, sY, oW, oH, dX, dY, stepW, stepH);\n sX = dX;\n sY = dY;\n dY += stepH;\n }\n return ctx.getImageData(sX, sY, dW, dH);\n },\n\n /**\n * Filter lanczosResize\n * @param {Object} canvasEl Canvas element to apply filter to\n * @param {Number} oW Original Width\n * @param {Number} oH Original Height\n * @param {Number} dW Destination Width\n * @param {Number} dH Destination Height\n * @returns {ImageData}\n */\n lanczosResize: function(options, oW, oH, dW, dH) {\n\n function process(u) {\n var v, i, weight, idx, a, red, green,\n blue, alpha, fX, fY;\n center.x = (u + 0.5) * ratioX;\n icenter.x = floor(center.x);\n for (v = 0; v < dH; v++) {\n center.y = (v + 0.5) * ratioY;\n icenter.y = floor(center.y);\n a = 0; red = 0; green = 0; blue = 0; alpha = 0;\n for (i = icenter.x - range2X; i <= icenter.x + range2X; i++) {\n if (i < 0 || i >= oW) {\n continue;\n }\n fX = floor(1000 * abs(i - center.x));\n if (!cacheLanc[fX]) {\n cacheLanc[fX] = { };\n }\n for (var j = icenter.y - range2Y; j <= icenter.y + range2Y; j++) {\n if (j < 0 || j >= oH) {\n continue;\n }\n fY = floor(1000 * abs(j - center.y));\n if (!cacheLanc[fX][fY]) {\n cacheLanc[fX][fY] = lanczos(sqrt(pow(fX * rcpRatioX, 2) + pow(fY * rcpRatioY, 2)) / 1000);\n }\n weight = cacheLanc[fX][fY];\n if (weight > 0) {\n idx = (j * oW + i) * 4;\n a += weight;\n red += weight * srcData[idx];\n green += weight * srcData[idx + 1];\n blue += weight * srcData[idx + 2];\n alpha += weight * srcData[idx + 3];\n }\n }\n }\n idx = (v * dW + u) * 4;\n destData[idx] = red / a;\n destData[idx + 1] = green / a;\n destData[idx + 2] = blue / a;\n destData[idx + 3] = alpha / a;\n }\n\n if (++u < dW) {\n return process(u);\n }\n else {\n return destImg;\n }\n }\n\n var srcData = options.imageData.data,\n destImg = options.ctx.createImageData(dW, dH),\n destData = destImg.data,\n lanczos = this.lanczosCreate(this.lanczosLobes),\n ratioX = this.rcpScaleX, ratioY = this.rcpScaleY,\n rcpRatioX = 2 / this.rcpScaleX, rcpRatioY = 2 / this.rcpScaleY,\n range2X = ceil(ratioX * this.lanczosLobes / 2),\n range2Y = ceil(ratioY * this.lanczosLobes / 2),\n cacheLanc = { }, center = { }, icenter = { };\n\n return process(0);\n },\n\n /**\n * bilinearFiltering\n * @param {Object} canvasEl Canvas element to apply filter to\n * @param {Number} oW Original Width\n * @param {Number} oH Original Height\n * @param {Number} dW Destination Width\n * @param {Number} dH Destination Height\n * @returns {ImageData}\n */\n bilinearFiltering: function(options, oW, oH, dW, dH) {\n var a, b, c, d, x, y, i, j, xDiff, yDiff, chnl,\n color, offset = 0, origPix, ratioX = this.rcpScaleX,\n ratioY = this.rcpScaleY,\n w4 = 4 * (oW - 1), img = options.imageData,\n pixels = img.data, destImage = options.ctx.createImageData(dW, dH),\n destPixels = destImage.data;\n for (i = 0; i < dH; i++) {\n for (j = 0; j < dW; j++) {\n x = floor(ratioX * j);\n y = floor(ratioY * i);\n xDiff = ratioX * j - x;\n yDiff = ratioY * i - y;\n origPix = 4 * (y * oW + x);\n\n for (chnl = 0; chnl < 4; chnl++) {\n a = pixels[origPix + chnl];\n b = pixels[origPix + 4 + chnl];\n c = pixels[origPix + w4 + chnl];\n d = pixels[origPix + w4 + 4 + chnl];\n color = a * (1 - xDiff) * (1 - yDiff) + b * xDiff * (1 - yDiff) +\n c * yDiff * (1 - xDiff) + d * xDiff * yDiff;\n destPixels[offset++] = color;\n }\n }\n }\n return destImage;\n },\n\n /**\n * hermiteFastResize\n * @param {Object} canvasEl Canvas element to apply filter to\n * @param {Number} oW Original Width\n * @param {Number} oH Original Height\n * @param {Number} dW Destination Width\n * @param {Number} dH Destination Height\n * @returns {ImageData}\n */\n hermiteFastResize: function(options, oW, oH, dW, dH) {\n var ratioW = this.rcpScaleX, ratioH = this.rcpScaleY,\n ratioWHalf = ceil(ratioW / 2),\n ratioHHalf = ceil(ratioH / 2),\n img = options.imageData, data = img.data,\n img2 = options.ctx.createImageData(dW, dH), data2 = img2.data;\n for (var j = 0; j < dH; j++) {\n for (var i = 0; i < dW; i++) {\n var x2 = (i + j * dW) * 4, weight = 0, weights = 0, weightsAlpha = 0,\n gxR = 0, gxG = 0, gxB = 0, gxA = 0, centerY = (j + 0.5) * ratioH;\n for (var yy = floor(j * ratioH); yy < (j + 1) * ratioH; yy++) {\n var dy = abs(centerY - (yy + 0.5)) / ratioHHalf,\n centerX = (i + 0.5) * ratioW, w0 = dy * dy;\n for (var xx = floor(i * ratioW); xx < (i + 1) * ratioW; xx++) {\n var dx = abs(centerX - (xx + 0.5)) / ratioWHalf,\n w = sqrt(w0 + dx * dx);\n /* eslint-disable max-depth */\n if (w > 1 && w < -1) {\n continue;\n }\n //hermite filter\n weight = 2 * w * w * w - 3 * w * w + 1;\n if (weight > 0) {\n dx = 4 * (xx + yy * oW);\n //alpha\n gxA += weight * data[dx + 3];\n weightsAlpha += weight;\n //colors\n if (data[dx + 3] < 255) {\n weight = weight * data[dx + 3] / 250;\n }\n gxR += weight * data[dx];\n gxG += weight * data[dx + 1];\n gxB += weight * data[dx + 2];\n weights += weight;\n }\n /* eslint-enable max-depth */\n }\n }\n data2[x2] = gxR / weights;\n data2[x2 + 1] = gxG / weights;\n data2[x2 + 2] = gxB / weights;\n data2[x2 + 3] = gxA / weightsAlpha;\n }\n }\n return img2;\n },\n\n /**\n * Returns object representation of an instance\n * @return {Object} Object representation of an instance\n */\n toObject: function() {\n return {\n type: this.type,\n scaleX: this.scaleX,\n scaleY: this.scaleY,\n resizeType: this.resizeType,\n lanczosLobes: this.lanczosLobes\n };\n }\n });\n\n /**\n * Returns filter instance from an object representation\n * @static\n * @param {Object} object Object to create an instance from\n * @param {Function} [callback] to be invoked after filter creation\n * @return {fabric.Image.filters.Resize} Instance of fabric.Image.filters.Resize\n */\n fabric.Image.filters.Resize.fromObject = fabric.Image.filters.BaseFilter.fromObject;\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n filters = fabric.Image.filters,\n createClass = fabric.util.createClass;\n\n /**\n * Contrast filter class\n * @class fabric.Image.filters.Contrast\n * @memberOf fabric.Image.filters\n * @extends fabric.Image.filters.BaseFilter\n * @see {@link fabric.Image.filters.Contrast#initialize} for constructor definition\n * @see {@link http://fabricjs.com/image-filters|ImageFilters demo}\n * @example\n * var filter = new fabric.Image.filters.Contrast({\n * contrast: 0.25\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n */\n filters.Contrast = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Contrast.prototype */ {\n\n /**\n * Filter type\n * @param {String} type\n * @default\n */\n type: 'Contrast',\n\n fragmentSource: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform float uContrast;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'void main() {\\n' +\n 'vec4 color = texture2D(uTexture, vTexCoord);\\n' +\n 'float contrastF = 1.015 * (uContrast + 1.0) / (1.0 * (1.015 - uContrast));\\n' +\n 'color.rgb = contrastF * (color.rgb - 0.5) + 0.5;\\n' +\n 'gl_FragColor = color;\\n' +\n '}',\n\n /**\n * contrast value, range from -1 to 1.\n * @param {Number} contrast\n * @default 0\n */\n contrast: 0,\n\n mainParameter: 'contrast',\n\n /**\n * Constructor\n * @memberOf fabric.Image.filters.Contrast.prototype\n * @param {Object} [options] Options object\n * @param {Number} [options.contrast=0] Value to contrast the image up (-1...1)\n */\n\n /**\n * Apply the Contrast operation to a Uint8Array representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8Array to be filtered.\n */\n applyTo2d: function(options) {\n if (this.contrast === 0) {\n return;\n }\n var imageData = options.imageData, i, len,\n data = imageData.data, len = data.length,\n contrast = Math.floor(this.contrast * 255),\n contrastF = 259 * (contrast + 255) / (255 * (259 - contrast));\n\n for (i = 0; i < len; i += 4) {\n data[i] = contrastF * (data[i] - 128) + 128;\n data[i + 1] = contrastF * (data[i + 1] - 128) + 128;\n data[i + 2] = contrastF * (data[i + 2] - 128) + 128;\n }\n },\n\n /**\n * Return WebGL uniform locations for this filter's shader.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {WebGLShaderProgram} program This filter's compiled shader program.\n */\n getUniformLocations: function(gl, program) {\n return {\n uContrast: gl.getUniformLocation(program, 'uContrast'),\n };\n },\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData: function(gl, uniformLocations) {\n gl.uniform1f(uniformLocations.uContrast, this.contrast);\n },\n });\n\n /**\n * Returns filter instance from an object representation\n * @static\n * @param {Object} object Object to create an instance from\n * @param {function} [callback] to be invoked after filter creation\n * @return {fabric.Image.filters.Contrast} Instance of fabric.Image.filters.Contrast\n */\n fabric.Image.filters.Contrast.fromObject = fabric.Image.filters.BaseFilter.fromObject;\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n filters = fabric.Image.filters,\n createClass = fabric.util.createClass;\n\n /**\n * Saturate filter class\n * @class fabric.Image.filters.Saturation\n * @memberOf fabric.Image.filters\n * @extends fabric.Image.filters.BaseFilter\n * @see {@link fabric.Image.filters.Saturation#initialize} for constructor definition\n * @see {@link http://fabricjs.com/image-filters|ImageFilters demo}\n * @example\n * var filter = new fabric.Image.filters.Saturation({\n * saturation: 1\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n */\n filters.Saturation = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Saturation.prototype */ {\n\n /**\n * Filter type\n * @param {String} type\n * @default\n */\n type: 'Saturation',\n\n fragmentSource: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform float uSaturation;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'void main() {\\n' +\n 'vec4 color = texture2D(uTexture, vTexCoord);\\n' +\n 'float rgMax = max(color.r, color.g);\\n' +\n 'float rgbMax = max(rgMax, color.b);\\n' +\n 'color.r += rgbMax != color.r ? (rgbMax - color.r) * uSaturation : 0.00;\\n' +\n 'color.g += rgbMax != color.g ? (rgbMax - color.g) * uSaturation : 0.00;\\n' +\n 'color.b += rgbMax != color.b ? (rgbMax - color.b) * uSaturation : 0.00;\\n' +\n 'gl_FragColor = color;\\n' +\n '}',\n\n /**\n * Saturation value, from -1 to 1.\n * Increases/decreases the color saturation.\n * A value of 0 has no effect.\n * \n * @param {Number} saturation\n * @default\n */\n saturation: 0,\n\n mainParameter: 'saturation',\n\n /**\n * Constructor\n * @memberOf fabric.Image.filters.Saturate.prototype\n * @param {Object} [options] Options object\n * @param {Number} [options.saturate=0] Value to saturate the image (-1...1)\n */\n\n /**\n * Apply the Saturation operation to a Uint8ClampedArray representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n */\n applyTo2d: function(options) {\n if (this.saturation === 0) {\n return;\n }\n var imageData = options.imageData,\n data = imageData.data, len = data.length,\n adjust = -this.saturation, i, max;\n\n for (i = 0; i < len; i += 4) {\n max = Math.max(data[i], data[i + 1], data[i + 2]);\n data[i] += max !== data[i] ? (max - data[i]) * adjust : 0;\n data[i + 1] += max !== data[i + 1] ? (max - data[i + 1]) * adjust : 0;\n data[i + 2] += max !== data[i + 2] ? (max - data[i + 2]) * adjust : 0;\n }\n },\n\n /**\n * Return WebGL uniform locations for this filter's shader.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {WebGLShaderProgram} program This filter's compiled shader program.\n */\n getUniformLocations: function(gl, program) {\n return {\n uSaturation: gl.getUniformLocation(program, 'uSaturation'),\n };\n },\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData: function(gl, uniformLocations) {\n gl.uniform1f(uniformLocations.uSaturation, -this.saturation);\n },\n });\n\n /**\n * Returns filter instance from an object representation\n * @static\n * @param {Object} object Object to create an instance from\n * @param {Function} [callback] to be invoked after filter creation\n * @return {fabric.Image.filters.Saturation} Instance of fabric.Image.filters.Saturate\n */\n fabric.Image.filters.Saturation.fromObject = fabric.Image.filters.BaseFilter.fromObject;\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n filters = fabric.Image.filters,\n createClass = fabric.util.createClass;\n\n /**\n * Vibrance filter class\n * @class fabric.Image.filters.Vibrance\n * @memberOf fabric.Image.filters\n * @extends fabric.Image.filters.BaseFilter\n * @see {@link fabric.Image.filters.Vibrance#initialize} for constructor definition\n * @see {@link http://fabricjs.com/image-filters|ImageFilters demo}\n * @example\n * var filter = new fabric.Image.filters.Vibrance({\n * vibrance: 1\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n */\n filters.Vibrance = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Vibrance.prototype */ {\n\n /**\n * Filter type\n * @param {String} type\n * @default\n */\n type: 'Vibrance',\n\n fragmentSource: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform float uVibrance;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'void main() {\\n' +\n 'vec4 color = texture2D(uTexture, vTexCoord);\\n' +\n 'float max = max(color.r, max(color.g, color.b));\\n' +\n 'float avg = (color.r + color.g + color.b) / 3.0;\\n' +\n 'float amt = (abs(max - avg) * 2.0) * uVibrance;\\n' +\n 'color.r += max != color.r ? (max - color.r) * amt : 0.00;\\n' +\n 'color.g += max != color.g ? (max - color.g) * amt : 0.00;\\n' +\n 'color.b += max != color.b ? (max - color.b) * amt : 0.00;\\n' +\n 'gl_FragColor = color;\\n' +\n '}',\n\n /**\n * Vibrance value, from -1 to 1.\n * Increases/decreases the saturation of more muted colors with less effect on saturated colors.\n * A value of 0 has no effect.\n * \n * @param {Number} vibrance\n * @default\n */\n vibrance: 0,\n\n mainParameter: 'vibrance',\n\n /**\n * Constructor\n * @memberOf fabric.Image.filters.Vibrance.prototype\n * @param {Object} [options] Options object\n * @param {Number} [options.vibrance=0] Vibrance value for the image (between -1 and 1)\n */\n\n /**\n * Apply the Vibrance operation to a Uint8ClampedArray representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n */\n applyTo2d: function(options) {\n if (this.vibrance === 0) {\n return;\n }\n var imageData = options.imageData,\n data = imageData.data, len = data.length,\n adjust = -this.vibrance, i, max, avg, amt;\n\n for (i = 0; i < len; i += 4) {\n max = Math.max(data[i], data[i + 1], data[i + 2]);\n avg = (data[i] + data[i + 1] + data[i + 2]) / 3;\n amt = ((Math.abs(max - avg) * 2 / 255) * adjust);\n data[i] += max !== data[i] ? (max - data[i]) * amt : 0;\n data[i + 1] += max !== data[i + 1] ? (max - data[i + 1]) * amt : 0;\n data[i + 2] += max !== data[i + 2] ? (max - data[i + 2]) * amt : 0;\n }\n },\n\n /**\n * Return WebGL uniform locations for this filter's shader.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {WebGLShaderProgram} program This filter's compiled shader program.\n */\n getUniformLocations: function(gl, program) {\n return {\n uVibrance: gl.getUniformLocation(program, 'uVibrance'),\n };\n },\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData: function(gl, uniformLocations) {\n gl.uniform1f(uniformLocations.uVibrance, -this.vibrance);\n },\n });\n\n /**\n * Returns filter instance from an object representation\n * @static\n * @param {Object} object Object to create an instance from\n * @param {Function} [callback] to be invoked after filter creation\n * @return {fabric.Image.filters.Vibrance} Instance of fabric.Image.filters.Vibrance\n */\n fabric.Image.filters.Vibrance.fromObject = fabric.Image.filters.BaseFilter.fromObject;\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n filters = fabric.Image.filters,\n createClass = fabric.util.createClass;\n\n /**\n * Blur filter class\n * @class fabric.Image.filters.Blur\n * @memberOf fabric.Image.filters\n * @extends fabric.Image.filters.BaseFilter\n * @see {@link fabric.Image.filters.Blur#initialize} for constructor definition\n * @see {@link http://fabricjs.com/image-filters|ImageFilters demo}\n * @example\n * var filter = new fabric.Image.filters.Blur({\n * blur: 0.5\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n */\n filters.Blur = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Blur.prototype */ {\n\n type: 'Blur',\n\n /*\n'gl_FragColor = vec4(0.0);',\n'gl_FragColor += texture2D(texture, vTexCoord + -7 * uDelta)*0.0044299121055113265;',\n'gl_FragColor += texture2D(texture, vTexCoord + -6 * uDelta)*0.00895781211794;',\n'gl_FragColor += texture2D(texture, vTexCoord + -5 * uDelta)*0.0215963866053;',\n'gl_FragColor += texture2D(texture, vTexCoord + -4 * uDelta)*0.0443683338718;',\n'gl_FragColor += texture2D(texture, vTexCoord + -3 * uDelta)*0.0776744219933;',\n'gl_FragColor += texture2D(texture, vTexCoord + -2 * uDelta)*0.115876621105;',\n'gl_FragColor += texture2D(texture, vTexCoord + -1 * uDelta)*0.147308056121;',\n'gl_FragColor += texture2D(texture, vTexCoord )*0.159576912161;',\n'gl_FragColor += texture2D(texture, vTexCoord + 1 * uDelta)*0.147308056121;',\n'gl_FragColor += texture2D(texture, vTexCoord + 2 * uDelta)*0.115876621105;',\n'gl_FragColor += texture2D(texture, vTexCoord + 3 * uDelta)*0.0776744219933;',\n'gl_FragColor += texture2D(texture, vTexCoord + 4 * uDelta)*0.0443683338718;',\n'gl_FragColor += texture2D(texture, vTexCoord + 5 * uDelta)*0.0215963866053;',\n'gl_FragColor += texture2D(texture, vTexCoord + 6 * uDelta)*0.00895781211794;',\n'gl_FragColor += texture2D(texture, vTexCoord + 7 * uDelta)*0.0044299121055113265;',\n*/\n\n /* eslint-disable max-len */\n fragmentSource: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform vec2 uDelta;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'const float nSamples = 15.0;\\n' +\n 'vec3 v3offset = vec3(12.9898, 78.233, 151.7182);\\n' +\n 'float random(vec3 scale) {\\n' +\n /* use the fragment position for a different seed per-pixel */\n 'return fract(sin(dot(gl_FragCoord.xyz, scale)) * 43758.5453);\\n' +\n '}\\n' +\n 'void main() {\\n' +\n 'vec4 color = vec4(0.0);\\n' +\n 'float total = 0.0;\\n' +\n 'float offset = random(v3offset);\\n' +\n 'for (float t = -nSamples; t <= nSamples; t++) {\\n' +\n 'float percent = (t + offset - 0.5) / nSamples;\\n' +\n 'float weight = 1.0 - abs(percent);\\n' +\n 'color += texture2D(uTexture, vTexCoord + uDelta * percent) * weight;\\n' +\n 'total += weight;\\n' +\n '}\\n' +\n 'gl_FragColor = color / total;\\n' +\n '}',\n /* eslint-enable max-len */\n\n /**\n * blur value, in percentage of image dimensions.\n * specific to keep the image blur constant at different resolutions\n * range between 0 and 1.\n * @type Number\n * @default\n */\n blur: 0,\n\n mainParameter: 'blur',\n\n applyTo: function(options) {\n if (options.webgl) {\n // this aspectRatio is used to give the same blur to vertical and horizontal\n this.aspectRatio = options.sourceWidth / options.sourceHeight;\n options.passes++;\n this._setupFrameBuffer(options);\n this.horizontal = true;\n this.applyToWebGL(options);\n this._swapTextures(options);\n this._setupFrameBuffer(options);\n this.horizontal = false;\n this.applyToWebGL(options);\n this._swapTextures(options);\n }\n else {\n this.applyTo2d(options);\n }\n },\n\n applyTo2d: function(options) {\n // paint canvasEl with current image data.\n //options.ctx.putImageData(options.imageData, 0, 0);\n options.imageData = this.simpleBlur(options);\n },\n\n simpleBlur: function(options) {\n var resources = options.filterBackend.resources, canvas1, canvas2,\n width = options.imageData.width,\n height = options.imageData.height;\n\n if (!resources.blurLayer1) {\n resources.blurLayer1 = fabric.util.createCanvasElement();\n resources.blurLayer2 = fabric.util.createCanvasElement();\n }\n canvas1 = resources.blurLayer1;\n canvas2 = resources.blurLayer2;\n if (canvas1.width !== width || canvas1.height !== height) {\n canvas2.width = canvas1.width = width;\n canvas2.height = canvas1.height = height;\n }\n var ctx1 = canvas1.getContext('2d'),\n ctx2 = canvas2.getContext('2d'),\n nSamples = 15,\n random, percent, j, i,\n blur = this.blur * 0.06 * 0.5;\n\n // load first canvas\n ctx1.putImageData(options.imageData, 0, 0);\n ctx2.clearRect(0, 0, width, height);\n\n for (i = -nSamples; i <= nSamples; i++) {\n random = (Math.random() - 0.5) / 4;\n percent = i / nSamples;\n j = blur * percent * width + random;\n ctx2.globalAlpha = 1 - Math.abs(percent);\n ctx2.drawImage(canvas1, j, random);\n ctx1.drawImage(canvas2, 0, 0);\n ctx2.globalAlpha = 1;\n ctx2.clearRect(0, 0, canvas2.width, canvas2.height);\n }\n for (i = -nSamples; i <= nSamples; i++) {\n random = (Math.random() - 0.5) / 4;\n percent = i / nSamples;\n j = blur * percent * height + random;\n ctx2.globalAlpha = 1 - Math.abs(percent);\n ctx2.drawImage(canvas1, random, j);\n ctx1.drawImage(canvas2, 0, 0);\n ctx2.globalAlpha = 1;\n ctx2.clearRect(0, 0, canvas2.width, canvas2.height);\n }\n options.ctx.drawImage(canvas1, 0, 0);\n var newImageData = options.ctx.getImageData(0, 0, canvas1.width, canvas1.height);\n ctx1.globalAlpha = 1;\n ctx1.clearRect(0, 0, canvas1.width, canvas1.height);\n return newImageData;\n },\n\n /**\n * Return WebGL uniform locations for this filter's shader.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {WebGLShaderProgram} program This filter's compiled shader program.\n */\n getUniformLocations: function(gl, program) {\n return {\n delta: gl.getUniformLocation(program, 'uDelta'),\n };\n },\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData: function(gl, uniformLocations) {\n var delta = this.chooseRightDelta();\n gl.uniform2fv(uniformLocations.delta, delta);\n },\n\n /**\n * choose right value of image percentage to blur with\n * @returns {Array} a numeric array with delta values\n */\n chooseRightDelta: function() {\n var blurScale = 1, delta = [0, 0], blur;\n if (this.horizontal) {\n if (this.aspectRatio > 1) {\n // image is wide, i want to shrink radius horizontal\n blurScale = 1 / this.aspectRatio;\n }\n }\n else {\n if (this.aspectRatio < 1) {\n // image is tall, i want to shrink radius vertical\n blurScale = this.aspectRatio;\n }\n }\n blur = blurScale * this.blur * 0.12;\n if (this.horizontal) {\n delta[0] = blur;\n }\n else {\n delta[1] = blur;\n }\n return delta;\n },\n });\n\n /**\n * Deserialize a JSON definition of a BlurFilter into a concrete instance.\n */\n filters.Blur.fromObject = fabric.Image.filters.BaseFilter.fromObject;\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n filters = fabric.Image.filters,\n createClass = fabric.util.createClass;\n\n /**\n * Gamma filter class\n * @class fabric.Image.filters.Gamma\n * @memberOf fabric.Image.filters\n * @extends fabric.Image.filters.BaseFilter\n * @see {@link fabric.Image.filters.Gamma#initialize} for constructor definition\n * @see {@link http://fabricjs.com/image-filters|ImageFilters demo}\n * @example\n * var filter = new fabric.Image.filters.Gamma({\n * gamma: [1, 0.5, 2.1]\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n */\n filters.Gamma = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Gamma.prototype */ {\n\n /**\n * Filter type\n * @param {String} type\n * @default\n */\n type: 'Gamma',\n\n fragmentSource: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform vec3 uGamma;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'void main() {\\n' +\n 'vec4 color = texture2D(uTexture, vTexCoord);\\n' +\n 'vec3 correction = (1.0 / uGamma);\\n' +\n 'color.r = pow(color.r, correction.r);\\n' +\n 'color.g = pow(color.g, correction.g);\\n' +\n 'color.b = pow(color.b, correction.b);\\n' +\n 'gl_FragColor = color;\\n' +\n 'gl_FragColor.rgb *= color.a;\\n' +\n '}',\n\n /**\n * Gamma array value, from 0.01 to 2.2.\n * @param {Array} gamma\n * @default\n */\n gamma: [1, 1, 1],\n\n /**\n * Describe the property that is the filter parameter\n * @param {String} m\n * @default\n */\n mainParameter: 'gamma',\n\n /**\n * Constructor\n * @param {Object} [options] Options object\n */\n initialize: function(options) {\n this.gamma = [1, 1, 1];\n filters.BaseFilter.prototype.initialize.call(this, options);\n },\n\n /**\n * Apply the Gamma operation to a Uint8Array representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8Array to be filtered.\n */\n applyTo2d: function(options) {\n var imageData = options.imageData, data = imageData.data,\n gamma = this.gamma, len = data.length,\n rInv = 1 / gamma[0], gInv = 1 / gamma[1],\n bInv = 1 / gamma[2], i;\n\n if (!this.rVals) {\n // eslint-disable-next-line\n this.rVals = new Uint8Array(256);\n // eslint-disable-next-line\n this.gVals = new Uint8Array(256);\n // eslint-disable-next-line\n this.bVals = new Uint8Array(256);\n }\n\n // This is an optimization - pre-compute a look-up table for each color channel\n // instead of performing these pow calls for each pixel in the image.\n for (i = 0, len = 256; i < len; i++) {\n this.rVals[i] = Math.pow(i / 255, rInv) * 255;\n this.gVals[i] = Math.pow(i / 255, gInv) * 255;\n this.bVals[i] = Math.pow(i / 255, bInv) * 255;\n }\n for (i = 0, len = data.length; i < len; i += 4) {\n data[i] = this.rVals[data[i]];\n data[i + 1] = this.gVals[data[i + 1]];\n data[i + 2] = this.bVals[data[i + 2]];\n }\n },\n\n /**\n * Return WebGL uniform locations for this filter's shader.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {WebGLShaderProgram} program This filter's compiled shader program.\n */\n getUniformLocations: function(gl, program) {\n return {\n uGamma: gl.getUniformLocation(program, 'uGamma'),\n };\n },\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData: function(gl, uniformLocations) {\n gl.uniform3fv(uniformLocations.uGamma, this.gamma);\n },\n });\n\n /**\n * Returns filter instance from an object representation\n * @static\n * @param {Object} object Object to create an instance from\n * @param {function} [callback] to be invoked after filter creation\n * @return {fabric.Image.filters.Gamma} Instance of fabric.Image.filters.Gamma\n */\n fabric.Image.filters.Gamma.fromObject = fabric.Image.filters.BaseFilter.fromObject;\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n filters = fabric.Image.filters,\n createClass = fabric.util.createClass;\n\n /**\n * A container class that knows how to apply a sequence of filters to an input image.\n */\n filters.Composed = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Composed.prototype */ {\n\n type: 'Composed',\n\n /**\n * A non sparse array of filters to apply\n */\n subFilters: [],\n\n /**\n * Constructor\n * @param {Object} [options] Options object\n */\n initialize: function(options) {\n this.callSuper('initialize', options);\n // create a new array instead mutating the prototype with push\n this.subFilters = this.subFilters.slice(0);\n },\n\n /**\n * Apply this container's filters to the input image provided.\n *\n * @param {Object} options\n * @param {Number} options.passes The number of filters remaining to be applied.\n */\n applyTo: function(options) {\n options.passes += this.subFilters.length - 1;\n this.subFilters.forEach(function(filter) {\n filter.applyTo(options);\n });\n },\n\n /**\n * Serialize this filter into JSON.\n *\n * @returns {Object} A JSON representation of this filter.\n */\n toObject: function() {\n return fabric.util.object.extend(this.callSuper('toObject'), {\n subFilters: this.subFilters.map(function(filter) { return filter.toObject(); }),\n });\n },\n\n isNeutralState: function() {\n return !this.subFilters.some(function(filter) { return !filter.isNeutralState(); });\n }\n });\n\n /**\n * Deserialize a JSON definition of a ComposedFilter into a concrete instance.\n */\n fabric.Image.filters.Composed.fromObject = function(object, callback) {\n var filters = object.subFilters || [],\n subFilters = filters.map(function(filter) {\n return new fabric.Image.filters[filter.type](filter);\n }),\n instance = new fabric.Image.filters.Composed({ subFilters: subFilters });\n callback && callback(instance);\n return instance;\n };\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n filters = fabric.Image.filters,\n createClass = fabric.util.createClass;\n\n /**\n * HueRotation filter class\n * @class fabric.Image.filters.HueRotation\n * @memberOf fabric.Image.filters\n * @extends fabric.Image.filters.BaseFilter\n * @see {@link fabric.Image.filters.HueRotation#initialize} for constructor definition\n * @see {@link http://fabricjs.com/image-filters|ImageFilters demo}\n * @example\n * var filter = new fabric.Image.filters.HueRotation({\n * rotation: -0.5\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n */\n filters.HueRotation = createClass(filters.ColorMatrix, /** @lends fabric.Image.filters.HueRotation.prototype */ {\n\n /**\n * Filter type\n * @param {String} type\n * @default\n */\n type: 'HueRotation',\n\n /**\n * HueRotation value, from -1 to 1.\n * the unit is radians\n * @param {Number} myParameter\n * @default\n */\n rotation: 0,\n\n /**\n * Describe the property that is the filter parameter\n * @param {String} m\n * @default\n */\n mainParameter: 'rotation',\n\n calculateMatrix: function() {\n var rad = this.rotation * Math.PI, cos = fabric.util.cos(rad), sin = fabric.util.sin(rad),\n aThird = 1 / 3, aThirdSqtSin = Math.sqrt(aThird) * sin, OneMinusCos = 1 - cos;\n this.matrix = [\n 1, 0, 0, 0, 0,\n 0, 1, 0, 0, 0,\n 0, 0, 1, 0, 0,\n 0, 0, 0, 1, 0\n ];\n this.matrix[0] = cos + OneMinusCos / 3;\n this.matrix[1] = aThird * OneMinusCos - aThirdSqtSin;\n this.matrix[2] = aThird * OneMinusCos + aThirdSqtSin;\n this.matrix[5] = aThird * OneMinusCos + aThirdSqtSin;\n this.matrix[6] = cos + aThird * OneMinusCos;\n this.matrix[7] = aThird * OneMinusCos - aThirdSqtSin;\n this.matrix[10] = aThird * OneMinusCos - aThirdSqtSin;\n this.matrix[11] = aThird * OneMinusCos + aThirdSqtSin;\n this.matrix[12] = cos + aThird * OneMinusCos;\n },\n\n /**\n * HueRotation isNeutralState implementation\n * Used only in image applyFilters to discard filters that will not have an effect\n * on the image\n * @param {Object} options\n **/\n isNeutralState: function(options) {\n this.calculateMatrix();\n return filters.BaseFilter.prototype.isNeutralState.call(this, options);\n },\n\n /**\n * Apply this filter to the input image data provided.\n *\n * Determines whether to use WebGL or Canvas2D based on the options.webgl flag.\n *\n * @param {Object} options\n * @param {Number} options.passes The number of filters remaining to be executed\n * @param {Boolean} options.webgl Whether to use webgl to render the filter.\n * @param {WebGLTexture} options.sourceTexture The texture setup as the source to be filtered.\n * @param {WebGLTexture} options.targetTexture The texture where filtered output should be drawn.\n * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n */\n applyTo: function(options) {\n this.calculateMatrix();\n filters.BaseFilter.prototype.applyTo.call(this, options);\n },\n\n });\n\n /**\n * Returns filter instance from an object representation\n * @static\n * @param {Object} object Object to create an instance from\n * @param {function} [callback] to be invoked after filter creation\n * @return {fabric.Image.filters.HueRotation} Instance of fabric.Image.filters.HueRotation\n */\n fabric.Image.filters.HueRotation.fromObject = fabric.Image.filters.BaseFilter.fromObject;\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n clone = fabric.util.object.clone;\n\n if (fabric.Text) {\n fabric.warn('fabric.Text is already defined');\n return;\n }\n\n var additionalProps =\n ('fontFamily fontWeight fontSize text underline overline linethrough' +\n ' textAlign fontStyle lineHeight textBackgroundColor charSpacing styles' +\n ' direction path pathStartOffset pathSide pathAlign').split(' ');\n\n /**\n * Text class\n * @class fabric.Text\n * @extends fabric.Object\n * @return {fabric.Text} thisArg\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-2#text}\n * @see {@link fabric.Text#initialize} for constructor definition\n */\n fabric.Text = fabric.util.createClass(fabric.Object, /** @lends fabric.Text.prototype */ {\n\n /**\n * Properties which when set cause object to change dimensions\n * @type Array\n * @private\n */\n _dimensionAffectingProps: [\n 'fontSize',\n 'fontWeight',\n 'fontFamily',\n 'fontStyle',\n 'lineHeight',\n 'text',\n 'charSpacing',\n 'textAlign',\n 'styles',\n 'path',\n 'pathStartOffset',\n 'pathSide',\n 'pathAlign'\n ],\n\n /**\n * @private\n */\n _reNewline: /\\r?\\n/,\n\n /**\n * Use this regular expression to filter for whitespaces that is not a new line.\n * Mostly used when text is 'justify' aligned.\n * @private\n */\n _reSpacesAndTabs: /[ \\t\\r]/g,\n\n /**\n * Use this regular expression to filter for whitespace that is not a new line.\n * Mostly used when text is 'justify' aligned.\n * @private\n */\n _reSpaceAndTab: /[ \\t\\r]/,\n\n /**\n * Use this regular expression to filter consecutive groups of non spaces.\n * Mostly used when text is 'justify' aligned.\n * @private\n */\n _reWords: /\\S+/g,\n\n /**\n * Type of an object\n * @type String\n * @default\n */\n type: 'text',\n\n /**\n * Font size (in pixels)\n * @type Number\n * @default\n */\n fontSize: 40,\n\n /**\n * Font weight (e.g. bold, normal, 400, 600, 800)\n * @type {(Number|String)}\n * @default\n */\n fontWeight: 'normal',\n\n /**\n * Font family\n * @type String\n * @default\n */\n fontFamily: 'Times New Roman',\n\n /**\n * Text decoration underline.\n * @type Boolean\n * @default\n */\n underline: false,\n\n /**\n * Text decoration overline.\n * @type Boolean\n * @default\n */\n overline: false,\n\n /**\n * Text decoration linethrough.\n * @type Boolean\n * @default\n */\n linethrough: false,\n\n /**\n * Text alignment. Possible values: \"left\", \"center\", \"right\", \"justify\",\n * \"justify-left\", \"justify-center\" or \"justify-right\".\n * @type String\n * @default\n */\n textAlign: 'left',\n\n /**\n * Font style . Possible values: \"\", \"normal\", \"italic\" or \"oblique\".\n * @type String\n * @default\n */\n fontStyle: 'normal',\n\n /**\n * Line height\n * @type Number\n * @default\n */\n lineHeight: 1.16,\n\n /**\n * Superscript schema object (minimum overlap)\n * @type {Object}\n * @default\n */\n superscript: {\n size: 0.60, // fontSize factor\n baseline: -0.35 // baseline-shift factor (upwards)\n },\n\n /**\n * Subscript schema object (minimum overlap)\n * @type {Object}\n * @default\n */\n subscript: {\n size: 0.60, // fontSize factor\n baseline: 0.11 // baseline-shift factor (downwards)\n },\n\n /**\n * Background color of text lines\n * @type String\n * @default\n */\n textBackgroundColor: '',\n\n /**\n * List of properties to consider when checking if\n * state of an object is changed ({@link fabric.Object#hasStateChanged})\n * as well as for history (undo/redo) purposes\n * @type Array\n */\n stateProperties: fabric.Object.prototype.stateProperties.concat(additionalProps),\n\n /**\n * List of properties to consider when checking if cache needs refresh\n * @type Array\n */\n cacheProperties: fabric.Object.prototype.cacheProperties.concat(additionalProps),\n\n /**\n * When defined, an object is rendered via stroke and this property specifies its color.\n * Backwards incompatibility note: This property was named \"strokeStyle\" until v1.1.6\n * @type String\n * @default\n */\n stroke: null,\n\n /**\n * Shadow object representing shadow of this shape.\n * Backwards incompatibility note: This property was named \"textShadow\" (String) until v1.2.11\n * @type fabric.Shadow\n * @default\n */\n shadow: null,\n\n /**\n * fabric.Path that the text should follow.\n * since 4.6.0 the path will be drawn automatically.\n * if you want to make the path visible, give it a stroke and strokeWidth or fill value\n * if you want it to be hidden, assign visible = false to the path.\n * This feature is in BETA, and SVG import/export is not yet supported.\n * @type fabric.Path\n * @example\n * var textPath = new fabric.Text('Text on a path', {\n * top: 150,\n * left: 150,\n * textAlign: 'center',\n * charSpacing: -50,\n * path: new fabric.Path('M 0 0 C 50 -100 150 -100 200 0', {\n * strokeWidth: 1,\n * visible: false\n * }),\n * pathSide: 'left',\n * pathStartOffset: 0\n * });\n * @default\n */\n path: null,\n\n /**\n * Offset amount for text path starting position\n * Only used when text has a path\n * @type Number\n * @default\n */\n pathStartOffset: 0,\n\n /**\n * Which side of the path the text should be drawn on.\n * Only used when text has a path\n * @type {String} 'left|right'\n * @default\n */\n pathSide: 'left',\n\n /**\n * How text is aligned to the path. This property determines\n * the perpendicular position of each character relative to the path.\n * (one of \"baseline\", \"center\", \"ascender\", \"descender\")\n * This feature is in BETA, and its behavior may change\n * @type String\n * @default\n */\n pathAlign: 'baseline',\n\n /**\n * @private\n */\n _fontSizeFraction: 0.222,\n\n /**\n * @private\n */\n offsets: {\n underline: 0.10,\n linethrough: -0.315,\n overline: -0.88\n },\n\n /**\n * Text Line proportion to font Size (in pixels)\n * @type Number\n * @default\n */\n _fontSizeMult: 1.13,\n\n /**\n * additional space between characters\n * expressed in thousands of em unit\n * @type Number\n * @default\n */\n charSpacing: 0,\n\n /**\n * Object containing character styles - top-level properties -> line numbers,\n * 2nd-level properties - character numbers\n * @type Object\n * @default\n */\n styles: null,\n\n /**\n * Reference to a context to measure text char or couple of chars\n * the cacheContext of the canvas will be used or a freshly created one if the object is not on canvas\n * once created it will be referenced on fabric._measuringContext to avoid creating a canvas for every\n * text object created.\n * @type {CanvasRenderingContext2D}\n * @default\n */\n _measuringContext: null,\n\n /**\n * Baseline shift, styles only, keep at 0 for the main text object\n * @type {Number}\n * @default\n */\n deltaY: 0,\n\n /**\n * WARNING: EXPERIMENTAL. NOT SUPPORTED YET\n * determine the direction of the text.\n * This has to be set manually together with textAlign and originX for proper\n * experience.\n * some interesting link for the future\n * https://www.w3.org/International/questions/qa-bidi-unicode-controls\n * @since 4.5.0\n * @type {String} 'ltr|rtl'\n * @default\n */\n direction: 'ltr',\n\n /**\n * Array of properties that define a style unit (of 'styles').\n * @type {Array}\n * @default\n */\n _styleProperties: [\n 'stroke',\n 'strokeWidth',\n 'fill',\n 'fontFamily',\n 'fontSize',\n 'fontWeight',\n 'fontStyle',\n 'underline',\n 'overline',\n 'linethrough',\n 'deltaY',\n 'textBackgroundColor',\n ],\n\n /**\n * contains characters bounding boxes\n */\n __charBounds: [],\n\n /**\n * use this size when measuring text. To avoid IE11 rounding errors\n * @type {Number}\n * @default\n * @readonly\n * @private\n */\n CACHE_FONT_SIZE: 400,\n\n /**\n * contains the min text width to avoid getting 0\n * @type {Number}\n * @default\n */\n MIN_TEXT_WIDTH: 2,\n\n /**\n * Constructor\n * @param {String} text Text string\n * @param {Object} [options] Options object\n * @return {fabric.Text} thisArg\n */\n initialize: function(text, options) {\n this.styles = options ? (options.styles || { }) : { };\n this.text = text;\n this.__skipDimension = true;\n this.callSuper('initialize', options);\n if (this.path) {\n this.setPathInfo();\n }\n this.__skipDimension = false;\n this.initDimensions();\n this.setCoords();\n this.setupState({ propertySet: '_dimensionAffectingProps' });\n },\n\n /**\n * If text has a path, it will add the extra information needed\n * for path and text calculations\n * @return {fabric.Text} thisArg\n */\n setPathInfo: function() {\n var path = this.path;\n if (path) {\n path.segmentsInfo = fabric.util.getPathSegmentsInfo(path.path);\n }\n },\n\n /**\n * Return a context for measurement of text string.\n * if created it gets stored for reuse\n * this is for internal use, please do not use it\n * @private\n * @param {String} text Text string\n * @param {Object} [options] Options object\n * @return {fabric.Text} thisArg\n */\n getMeasuringContext: function() {\n // if we did not return we have to measure something.\n if (!fabric._measuringContext) {\n fabric._measuringContext = this.canvas && this.canvas.contextCache ||\n fabric.util.createCanvasElement().getContext('2d');\n }\n return fabric._measuringContext;\n },\n\n /**\n * @private\n * Divides text into lines of text and lines of graphemes.\n */\n _splitText: function() {\n var newLines = this._splitTextIntoLines(this.text);\n this.textLines = newLines.lines;\n this._textLines = newLines.graphemeLines;\n this._unwrappedTextLines = newLines._unwrappedLines;\n this._text = newLines.graphemeText;\n return newLines;\n },\n\n /**\n * Initialize or update text dimensions.\n * Updates this.width and this.height with the proper values.\n * Does not return dimensions.\n */\n initDimensions: function() {\n if (this.__skipDimension) {\n return;\n }\n this._splitText();\n this._clearCache();\n if (this.path) {\n this.width = this.path.width;\n this.height = this.path.height;\n }\n else {\n this.width = this.calcTextWidth() || this.cursorWidth || this.MIN_TEXT_WIDTH;\n this.height = this.calcTextHeight();\n }\n if (this.textAlign.indexOf('justify') !== -1) {\n // once text is measured we need to make space fatter to make justified text.\n this.enlargeSpaces();\n }\n this.saveState({ propertySet: '_dimensionAffectingProps' });\n },\n\n /**\n * Enlarge space boxes and shift the others\n */\n enlargeSpaces: function() {\n var diffSpace, currentLineWidth, numberOfSpaces, accumulatedSpace, line, charBound, spaces;\n for (var i = 0, len = this._textLines.length; i < len; i++) {\n if (this.textAlign !== 'justify' && (i === len - 1 || this.isEndOfWrapping(i))) {\n continue;\n }\n accumulatedSpace = 0;\n line = this._textLines[i];\n currentLineWidth = this.getLineWidth(i);\n if (currentLineWidth < this.width && (spaces = this.textLines[i].match(this._reSpacesAndTabs))) {\n numberOfSpaces = spaces.length;\n diffSpace = (this.width - currentLineWidth) / numberOfSpaces;\n for (var j = 0, jlen = line.length; j <= jlen; j++) {\n charBound = this.__charBounds[i][j];\n if (this._reSpaceAndTab.test(line[j])) {\n charBound.width += diffSpace;\n charBound.kernedWidth += diffSpace;\n charBound.left += accumulatedSpace;\n accumulatedSpace += diffSpace;\n }\n else {\n charBound.left += accumulatedSpace;\n }\n }\n }\n }\n },\n\n /**\n * Detect if the text line is ended with an hard break\n * text and itext do not have wrapping, return false\n * @return {Boolean}\n */\n isEndOfWrapping: function(lineIndex) {\n return lineIndex === this._textLines.length - 1;\n },\n\n /**\n * Detect if a line has a linebreak and so we need to account for it when moving\n * and counting style.\n * It return always for text and Itext.\n * @return Number\n */\n missingNewlineOffset: function() {\n return 1;\n },\n\n /**\n * Returns string representation of an instance\n * @return {String} String representation of text object\n */\n toString: function() {\n return '#';\n },\n\n /**\n * Return the dimension and the zoom level needed to create a cache canvas\n * big enough to host the object to be cached.\n * @private\n * @param {Object} dim.x width of object to be cached\n * @param {Object} dim.y height of object to be cached\n * @return {Object}.width width of canvas\n * @return {Object}.height height of canvas\n * @return {Object}.zoomX zoomX zoom value to unscale the canvas before drawing cache\n * @return {Object}.zoomY zoomY zoom value to unscale the canvas before drawing cache\n */\n _getCacheCanvasDimensions: function() {\n var dims = this.callSuper('_getCacheCanvasDimensions');\n var fontSize = this.fontSize;\n dims.width += fontSize * dims.zoomX;\n dims.height += fontSize * dims.zoomY;\n return dims;\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _render: function(ctx) {\n var path = this.path;\n path && !path.isNotVisible() && path._render(ctx);\n this._setTextStyles(ctx);\n this._renderTextLinesBackground(ctx);\n this._renderTextDecoration(ctx, 'underline');\n this._renderText(ctx);\n this._renderTextDecoration(ctx, 'overline');\n this._renderTextDecoration(ctx, 'linethrough');\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderText: function(ctx) {\n if (this.paintFirst === 'stroke') {\n this._renderTextStroke(ctx);\n this._renderTextFill(ctx);\n }\n else {\n this._renderTextFill(ctx);\n this._renderTextStroke(ctx);\n }\n },\n\n /**\n * Set the font parameter of the context with the object properties or with charStyle\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {Object} [charStyle] object with font style properties\n * @param {String} [charStyle.fontFamily] Font Family\n * @param {Number} [charStyle.fontSize] Font size in pixels. ( without px suffix )\n * @param {String} [charStyle.fontWeight] Font weight\n * @param {String} [charStyle.fontStyle] Font style (italic|normal)\n */\n _setTextStyles: function(ctx, charStyle, forMeasuring) {\n ctx.textBaseline = 'alphabetical';\n if (this.path) {\n switch (this.pathAlign) {\n case 'center':\n ctx.textBaseline = 'middle';\n break;\n case 'ascender':\n ctx.textBaseline = 'top';\n break;\n case 'descender':\n ctx.textBaseline = 'bottom';\n break;\n }\n }\n ctx.font = this._getFontDeclaration(charStyle, forMeasuring);\n },\n\n /**\n * calculate and return the text Width measuring each line.\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @return {Number} Maximum width of fabric.Text object\n */\n calcTextWidth: function() {\n var maxWidth = this.getLineWidth(0);\n\n for (var i = 1, len = this._textLines.length; i < len; i++) {\n var currentLineWidth = this.getLineWidth(i);\n if (currentLineWidth > maxWidth) {\n maxWidth = currentLineWidth;\n }\n }\n return maxWidth;\n },\n\n /**\n * @private\n * @param {String} method Method name (\"fillText\" or \"strokeText\")\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {String} line Text to render\n * @param {Number} left Left position of text\n * @param {Number} top Top position of text\n * @param {Number} lineIndex Index of a line in a text\n */\n _renderTextLine: function(method, ctx, line, left, top, lineIndex) {\n this._renderChars(method, ctx, line, left, top, lineIndex);\n },\n\n /**\n * Renders the text background for lines, taking care of style\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderTextLinesBackground: function(ctx) {\n if (!this.textBackgroundColor && !this.styleHas('textBackgroundColor')) {\n return;\n }\n var heightOfLine,\n lineLeftOffset, originalFill = ctx.fillStyle,\n line, lastColor,\n leftOffset = this._getLeftOffset(),\n lineTopOffset = this._getTopOffset(),\n boxStart = 0, boxWidth = 0, charBox, currentColor, path = this.path,\n drawStart;\n\n for (var i = 0, len = this._textLines.length; i < len; i++) {\n heightOfLine = this.getHeightOfLine(i);\n if (!this.textBackgroundColor && !this.styleHas('textBackgroundColor', i)) {\n lineTopOffset += heightOfLine;\n continue;\n }\n line = this._textLines[i];\n lineLeftOffset = this._getLineLeftOffset(i);\n boxWidth = 0;\n boxStart = 0;\n lastColor = this.getValueOfPropertyAt(i, 0, 'textBackgroundColor');\n for (var j = 0, jlen = line.length; j < jlen; j++) {\n charBox = this.__charBounds[i][j];\n currentColor = this.getValueOfPropertyAt(i, j, 'textBackgroundColor');\n if (path) {\n ctx.save();\n ctx.translate(charBox.renderLeft, charBox.renderTop);\n ctx.rotate(charBox.angle);\n ctx.fillStyle = currentColor;\n currentColor && ctx.fillRect(\n -charBox.width / 2,\n -heightOfLine / this.lineHeight * (1 - this._fontSizeFraction),\n charBox.width,\n heightOfLine / this.lineHeight\n );\n ctx.restore();\n }\n else if (currentColor !== lastColor) {\n drawStart = leftOffset + lineLeftOffset + boxStart;\n if (this.direction === 'rtl') {\n drawStart = this.width - drawStart - boxWidth;\n }\n ctx.fillStyle = lastColor;\n lastColor && ctx.fillRect(\n drawStart,\n lineTopOffset,\n boxWidth,\n heightOfLine / this.lineHeight\n );\n boxStart = charBox.left;\n boxWidth = charBox.width;\n lastColor = currentColor;\n }\n else {\n boxWidth += charBox.kernedWidth;\n }\n }\n if (currentColor && !path) {\n drawStart = leftOffset + lineLeftOffset + boxStart;\n if (this.direction === 'rtl') {\n drawStart = this.width - drawStart - boxWidth;\n }\n ctx.fillStyle = currentColor;\n ctx.fillRect(\n drawStart,\n lineTopOffset,\n boxWidth,\n heightOfLine / this.lineHeight\n );\n }\n lineTopOffset += heightOfLine;\n }\n ctx.fillStyle = originalFill;\n // if there is text background color no\n // other shadows should be casted\n this._removeShadow(ctx);\n },\n\n /**\n * @private\n * @param {Object} decl style declaration for cache\n * @param {String} decl.fontFamily fontFamily\n * @param {String} decl.fontStyle fontStyle\n * @param {String} decl.fontWeight fontWeight\n * @return {Object} reference to cache\n */\n getFontCache: function(decl) {\n var fontFamily = decl.fontFamily.toLowerCase();\n if (!fabric.charWidthsCache[fontFamily]) {\n fabric.charWidthsCache[fontFamily] = { };\n }\n var cache = fabric.charWidthsCache[fontFamily],\n cacheProp = decl.fontStyle.toLowerCase() + '_' + (decl.fontWeight + '').toLowerCase();\n if (!cache[cacheProp]) {\n cache[cacheProp] = { };\n }\n return cache[cacheProp];\n },\n\n /**\n * measure and return the width of a single character.\n * possibly overridden to accommodate different measure logic or\n * to hook some external lib for character measurement\n * @private\n * @param {String} _char, char to be measured\n * @param {Object} charStyle style of char to be measured\n * @param {String} [previousChar] previous char\n * @param {Object} [prevCharStyle] style of previous char\n */\n _measureChar: function(_char, charStyle, previousChar, prevCharStyle) {\n // first i try to return from cache\n var fontCache = this.getFontCache(charStyle), fontDeclaration = this._getFontDeclaration(charStyle),\n previousFontDeclaration = this._getFontDeclaration(prevCharStyle), couple = previousChar + _char,\n stylesAreEqual = fontDeclaration === previousFontDeclaration, width, coupleWidth, previousWidth,\n fontMultiplier = charStyle.fontSize / this.CACHE_FONT_SIZE, kernedWidth;\n\n if (previousChar && fontCache[previousChar] !== undefined) {\n previousWidth = fontCache[previousChar];\n }\n if (fontCache[_char] !== undefined) {\n kernedWidth = width = fontCache[_char];\n }\n if (stylesAreEqual && fontCache[couple] !== undefined) {\n coupleWidth = fontCache[couple];\n kernedWidth = coupleWidth - previousWidth;\n }\n if (width === undefined || previousWidth === undefined || coupleWidth === undefined) {\n var ctx = this.getMeasuringContext();\n // send a TRUE to specify measuring font size CACHE_FONT_SIZE\n this._setTextStyles(ctx, charStyle, true);\n }\n if (width === undefined) {\n kernedWidth = width = ctx.measureText(_char).width;\n fontCache[_char] = width;\n }\n if (previousWidth === undefined && stylesAreEqual && previousChar) {\n previousWidth = ctx.measureText(previousChar).width;\n fontCache[previousChar] = previousWidth;\n }\n if (stylesAreEqual && coupleWidth === undefined) {\n // we can measure the kerning couple and subtract the width of the previous character\n coupleWidth = ctx.measureText(couple).width;\n fontCache[couple] = coupleWidth;\n kernedWidth = coupleWidth - previousWidth;\n }\n return { width: width * fontMultiplier, kernedWidth: kernedWidth * fontMultiplier };\n },\n\n /**\n * Computes height of character at given position\n * @param {Number} line the line index number\n * @param {Number} _char the character index number\n * @return {Number} fontSize of the character\n */\n getHeightOfChar: function(line, _char) {\n return this.getValueOfPropertyAt(line, _char, 'fontSize');\n },\n\n /**\n * measure a text line measuring all characters.\n * @param {Number} lineIndex line number\n * @return {Number} Line width\n */\n measureLine: function(lineIndex) {\n var lineInfo = this._measureLine(lineIndex);\n if (this.charSpacing !== 0) {\n lineInfo.width -= this._getWidthOfCharSpacing();\n }\n if (lineInfo.width < 0) {\n lineInfo.width = 0;\n }\n return lineInfo;\n },\n\n /**\n * measure every grapheme of a line, populating __charBounds\n * @param {Number} lineIndex\n * @return {Object} object.width total width of characters\n * @return {Object} object.widthOfSpaces length of chars that match this._reSpacesAndTabs\n */\n _measureLine: function(lineIndex) {\n var width = 0, i, grapheme, line = this._textLines[lineIndex], prevGrapheme,\n graphemeInfo, numOfSpaces = 0, lineBounds = new Array(line.length),\n positionInPath = 0, startingPoint, totalPathLength, path = this.path,\n reverse = this.pathSide === 'right';\n\n this.__charBounds[lineIndex] = lineBounds;\n for (i = 0; i < line.length; i++) {\n grapheme = line[i];\n graphemeInfo = this._getGraphemeBox(grapheme, lineIndex, i, prevGrapheme);\n lineBounds[i] = graphemeInfo;\n width += graphemeInfo.kernedWidth;\n prevGrapheme = grapheme;\n }\n // this latest bound box represent the last character of the line\n // to simplify cursor handling in interactive mode.\n lineBounds[i] = {\n left: graphemeInfo ? graphemeInfo.left + graphemeInfo.width : 0,\n width: 0,\n kernedWidth: 0,\n height: this.fontSize\n };\n if (path) {\n totalPathLength = path.segmentsInfo[path.segmentsInfo.length - 1].length;\n startingPoint = fabric.util.getPointOnPath(path.path, 0, path.segmentsInfo);\n startingPoint.x += path.pathOffset.x;\n startingPoint.y += path.pathOffset.y;\n switch (this.textAlign) {\n case 'left':\n positionInPath = reverse ? (totalPathLength - width) : 0;\n break;\n case 'center':\n positionInPath = (totalPathLength - width) / 2;\n break;\n case 'right':\n positionInPath = reverse ? 0 : (totalPathLength - width);\n break;\n //todo - add support for justify\n }\n positionInPath += this.pathStartOffset * (reverse ? -1 : 1);\n for (i = reverse ? line.length - 1 : 0;\n reverse ? i >= 0 : i < line.length;\n reverse ? i-- : i++) {\n graphemeInfo = lineBounds[i];\n if (positionInPath > totalPathLength) {\n positionInPath %= totalPathLength;\n }\n else if (positionInPath < 0) {\n positionInPath += totalPathLength;\n }\n // it would probably much faster to send all the grapheme position for a line\n // and calculate path position/angle at once.\n this._setGraphemeOnPath(positionInPath, graphemeInfo, startingPoint);\n positionInPath += graphemeInfo.kernedWidth;\n }\n }\n return { width: width, numOfSpaces: numOfSpaces };\n },\n\n /**\n * Calculate the angle and the left,top position of the char that follow a path.\n * It appends it to graphemeInfo to be reused later at rendering\n * @private\n * @param {Number} positionInPath to be measured\n * @param {Object} graphemeInfo current grapheme box information\n * @param {Object} startingPoint position of the point\n */\n _setGraphemeOnPath: function(positionInPath, graphemeInfo, startingPoint) {\n var centerPosition = positionInPath + graphemeInfo.kernedWidth / 2,\n path = this.path;\n\n // we are at currentPositionOnPath. we want to know what point on the path is.\n var info = fabric.util.getPointOnPath(path.path, centerPosition, path.segmentsInfo);\n graphemeInfo.renderLeft = info.x - startingPoint.x;\n graphemeInfo.renderTop = info.y - startingPoint.y;\n graphemeInfo.angle = info.angle + (this.pathSide === 'right' ? Math.PI : 0);\n },\n\n /**\n * Measure and return the info of a single grapheme.\n * needs the the info of previous graphemes already filled\n * @private\n * @param {String} grapheme to be measured\n * @param {Number} lineIndex index of the line where the char is\n * @param {Number} charIndex position in the line\n * @param {String} [prevGrapheme] character preceding the one to be measured\n */\n _getGraphemeBox: function(grapheme, lineIndex, charIndex, prevGrapheme, skipLeft) {\n var style = this.getCompleteStyleDeclaration(lineIndex, charIndex),\n prevStyle = prevGrapheme ? this.getCompleteStyleDeclaration(lineIndex, charIndex - 1) : { },\n info = this._measureChar(grapheme, style, prevGrapheme, prevStyle),\n kernedWidth = info.kernedWidth,\n width = info.width, charSpacing;\n\n if (this.charSpacing !== 0) {\n charSpacing = this._getWidthOfCharSpacing();\n width += charSpacing;\n kernedWidth += charSpacing;\n }\n\n var box = {\n width: width,\n left: 0,\n height: style.fontSize,\n kernedWidth: kernedWidth,\n deltaY: style.deltaY,\n };\n if (charIndex > 0 && !skipLeft) {\n var previousBox = this.__charBounds[lineIndex][charIndex - 1];\n box.left = previousBox.left + previousBox.width + info.kernedWidth - info.width;\n }\n return box;\n },\n\n /**\n * Calculate height of line at 'lineIndex'\n * @param {Number} lineIndex index of line to calculate\n * @return {Number}\n */\n getHeightOfLine: function(lineIndex) {\n if (this.__lineHeights[lineIndex]) {\n return this.__lineHeights[lineIndex];\n }\n\n var line = this._textLines[lineIndex],\n // char 0 is measured before the line cycle because it nneds to char\n // emptylines\n maxHeight = this.getHeightOfChar(lineIndex, 0);\n for (var i = 1, len = line.length; i < len; i++) {\n maxHeight = Math.max(this.getHeightOfChar(lineIndex, i), maxHeight);\n }\n\n return this.__lineHeights[lineIndex] = maxHeight * this.lineHeight * this._fontSizeMult;\n },\n\n /**\n * Calculate text box height\n */\n calcTextHeight: function() {\n var lineHeight, height = 0;\n for (var i = 0, len = this._textLines.length; i < len; i++) {\n lineHeight = this.getHeightOfLine(i);\n height += (i === len - 1 ? lineHeight / this.lineHeight : lineHeight);\n }\n return height;\n },\n\n /**\n * @private\n * @return {Number} Left offset\n */\n _getLeftOffset: function() {\n return this.direction === 'ltr' ? -this.width / 2 : this.width / 2;\n },\n\n /**\n * @private\n * @return {Number} Top offset\n */\n _getTopOffset: function() {\n return -this.height / 2;\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {String} method Method name (\"fillText\" or \"strokeText\")\n */\n _renderTextCommon: function(ctx, method) {\n ctx.save();\n var lineHeights = 0, left = this._getLeftOffset(), top = this._getTopOffset();\n for (var i = 0, len = this._textLines.length; i < len; i++) {\n var heightOfLine = this.getHeightOfLine(i),\n maxHeight = heightOfLine / this.lineHeight,\n leftOffset = this._getLineLeftOffset(i);\n this._renderTextLine(\n method,\n ctx,\n this._textLines[i],\n left + leftOffset,\n top + lineHeights + maxHeight,\n i\n );\n lineHeights += heightOfLine;\n }\n ctx.restore();\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderTextFill: function(ctx) {\n if (!this.fill && !this.styleHas('fill')) {\n return;\n }\n\n this._renderTextCommon(ctx, 'fillText');\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderTextStroke: function(ctx) {\n if ((!this.stroke || this.strokeWidth === 0) && this.isEmptyStyles()) {\n return;\n }\n\n if (this.shadow && !this.shadow.affectStroke) {\n this._removeShadow(ctx);\n }\n\n ctx.save();\n this._setLineDash(ctx, this.strokeDashArray);\n ctx.beginPath();\n this._renderTextCommon(ctx, 'strokeText');\n ctx.closePath();\n ctx.restore();\n },\n\n /**\n * @private\n * @param {String} method fillText or strokeText.\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {Array} line Content of the line, splitted in an array by grapheme\n * @param {Number} left\n * @param {Number} top\n * @param {Number} lineIndex\n */\n _renderChars: function(method, ctx, line, left, top, lineIndex) {\n // set proper line offset\n var lineHeight = this.getHeightOfLine(lineIndex),\n isJustify = this.textAlign.indexOf('justify') !== -1,\n actualStyle,\n nextStyle,\n charsToRender = '',\n charBox,\n boxWidth = 0,\n timeToRender,\n path = this.path,\n shortCut = !isJustify && this.charSpacing === 0 && this.isEmptyStyles(lineIndex) && !path,\n isLtr = this.direction === 'ltr', sign = this.direction === 'ltr' ? 1 : -1,\n drawingLeft, currentDirection = ctx.canvas.getAttribute('dir');\n ctx.save();\n if (currentDirection !== this.direction) {\n ctx.canvas.setAttribute('dir', isLtr ? 'ltr' : 'rtl');\n ctx.direction = isLtr ? 'ltr' : 'rtl';\n ctx.textAlign = isLtr ? 'left' : 'right';\n }\n top -= lineHeight * this._fontSizeFraction / this.lineHeight;\n if (shortCut) {\n // render all the line in one pass without checking\n // drawingLeft = isLtr ? left : left - this.getLineWidth(lineIndex);\n this._renderChar(method, ctx, lineIndex, 0, line.join(''), left, top, lineHeight);\n ctx.restore();\n return;\n }\n for (var i = 0, len = line.length - 1; i <= len; i++) {\n timeToRender = i === len || this.charSpacing || path;\n charsToRender += line[i];\n charBox = this.__charBounds[lineIndex][i];\n if (boxWidth === 0) {\n left += sign * (charBox.kernedWidth - charBox.width);\n boxWidth += charBox.width;\n }\n else {\n boxWidth += charBox.kernedWidth;\n }\n if (isJustify && !timeToRender) {\n if (this._reSpaceAndTab.test(line[i])) {\n timeToRender = true;\n }\n }\n if (!timeToRender) {\n // if we have charSpacing, we render char by char\n actualStyle = actualStyle || this.getCompleteStyleDeclaration(lineIndex, i);\n nextStyle = this.getCompleteStyleDeclaration(lineIndex, i + 1);\n timeToRender = fabric.util.hasStyleChanged(actualStyle, nextStyle, false);\n }\n if (timeToRender) {\n if (path) {\n ctx.save();\n ctx.translate(charBox.renderLeft, charBox.renderTop);\n ctx.rotate(charBox.angle);\n this._renderChar(method, ctx, lineIndex, i, charsToRender, -boxWidth / 2, 0, lineHeight);\n ctx.restore();\n }\n else {\n drawingLeft = left;\n this._renderChar(method, ctx, lineIndex, i, charsToRender, drawingLeft, top, lineHeight);\n }\n charsToRender = '';\n actualStyle = nextStyle;\n left += sign * boxWidth;\n boxWidth = 0;\n }\n }\n ctx.restore();\n },\n\n /**\n * This function try to patch the missing gradientTransform on canvas gradients.\n * transforming a context to transform the gradient, is going to transform the stroke too.\n * we want to transform the gradient but not the stroke operation, so we create\n * a transformed gradient on a pattern and then we use the pattern instead of the gradient.\n * this method has drawbacks: is slow, is in low resolution, needs a patch for when the size\n * is limited.\n * @private\n * @param {fabric.Gradient} filler a fabric gradient instance\n * @return {CanvasPattern} a pattern to use as fill/stroke style\n */\n _applyPatternGradientTransformText: function(filler) {\n var pCanvas = fabric.util.createCanvasElement(), pCtx,\n // TODO: verify compatibility with strokeUniform\n width = this.width + this.strokeWidth, height = this.height + this.strokeWidth;\n pCanvas.width = width;\n pCanvas.height = height;\n pCtx = pCanvas.getContext('2d');\n pCtx.beginPath(); pCtx.moveTo(0, 0); pCtx.lineTo(width, 0); pCtx.lineTo(width, height);\n pCtx.lineTo(0, height); pCtx.closePath();\n pCtx.translate(width / 2, height / 2);\n pCtx.fillStyle = filler.toLive(pCtx);\n this._applyPatternGradientTransform(pCtx, filler);\n pCtx.fill();\n return pCtx.createPattern(pCanvas, 'no-repeat');\n },\n\n handleFiller: function(ctx, property, filler) {\n var offsetX, offsetY;\n if (filler.toLive) {\n if (filler.gradientUnits === 'percentage' || filler.gradientTransform || filler.patternTransform) {\n // need to transform gradient in a pattern.\n // this is a slow process. If you are hitting this codepath, and the object\n // is not using caching, you should consider switching it on.\n // we need a canvas as big as the current object caching canvas.\n offsetX = -this.width / 2;\n offsetY = -this.height / 2;\n ctx.translate(offsetX, offsetY);\n ctx[property] = this._applyPatternGradientTransformText(filler);\n return { offsetX: offsetX, offsetY: offsetY };\n }\n else {\n // is a simple gradient or pattern\n ctx[property] = filler.toLive(ctx, this);\n return this._applyPatternGradientTransform(ctx, filler);\n }\n }\n else {\n // is a color\n ctx[property] = filler;\n }\n return { offsetX: 0, offsetY: 0 };\n },\n\n _setStrokeStyles: function(ctx, decl) {\n ctx.lineWidth = decl.strokeWidth;\n ctx.lineCap = this.strokeLineCap;\n ctx.lineDashOffset = this.strokeDashOffset;\n ctx.lineJoin = this.strokeLineJoin;\n ctx.miterLimit = this.strokeMiterLimit;\n return this.handleFiller(ctx, 'strokeStyle', decl.stroke);\n },\n\n _setFillStyles: function(ctx, decl) {\n return this.handleFiller(ctx, 'fillStyle', decl.fill);\n },\n\n /**\n * @private\n * @param {String} method\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {Number} lineIndex\n * @param {Number} charIndex\n * @param {String} _char\n * @param {Number} left Left coordinate\n * @param {Number} top Top coordinate\n * @param {Number} lineHeight Height of the line\n */\n _renderChar: function(method, ctx, lineIndex, charIndex, _char, left, top) {\n var decl = this._getStyleDeclaration(lineIndex, charIndex),\n fullDecl = this.getCompleteStyleDeclaration(lineIndex, charIndex),\n shouldFill = method === 'fillText' && fullDecl.fill,\n shouldStroke = method === 'strokeText' && fullDecl.stroke && fullDecl.strokeWidth,\n fillOffsets, strokeOffsets;\n\n if (!shouldStroke && !shouldFill) {\n return;\n }\n ctx.save();\n\n shouldFill && (fillOffsets = this._setFillStyles(ctx, fullDecl));\n shouldStroke && (strokeOffsets = this._setStrokeStyles(ctx, fullDecl));\n\n ctx.font = this._getFontDeclaration(fullDecl);\n\n\n if (decl && decl.textBackgroundColor) {\n this._removeShadow(ctx);\n }\n if (decl && decl.deltaY) {\n top += decl.deltaY;\n }\n shouldFill && ctx.fillText(_char, left - fillOffsets.offsetX, top - fillOffsets.offsetY);\n shouldStroke && ctx.strokeText(_char, left - strokeOffsets.offsetX, top - strokeOffsets.offsetY);\n ctx.restore();\n },\n\n /**\n * Turns the character into a 'superior figure' (i.e. 'superscript')\n * @param {Number} start selection start\n * @param {Number} end selection end\n * @returns {fabric.Text} thisArg\n * @chainable\n */\n setSuperscript: function(start, end) {\n return this._setScript(start, end, this.superscript);\n },\n\n /**\n * Turns the character into an 'inferior figure' (i.e. 'subscript')\n * @param {Number} start selection start\n * @param {Number} end selection end\n * @returns {fabric.Text} thisArg\n * @chainable\n */\n setSubscript: function(start, end) {\n return this._setScript(start, end, this.subscript);\n },\n\n /**\n * Applies 'schema' at given position\n * @private\n * @param {Number} start selection start\n * @param {Number} end selection end\n * @param {Number} schema\n * @returns {fabric.Text} thisArg\n * @chainable\n */\n _setScript: function(start, end, schema) {\n var loc = this.get2DCursorLocation(start, true),\n fontSize = this.getValueOfPropertyAt(loc.lineIndex, loc.charIndex, 'fontSize'),\n dy = this.getValueOfPropertyAt(loc.lineIndex, loc.charIndex, 'deltaY'),\n style = { fontSize: fontSize * schema.size, deltaY: dy + fontSize * schema.baseline };\n this.setSelectionStyles(style, start, end);\n return this;\n },\n\n /**\n * @private\n * @param {Number} lineIndex index text line\n * @return {Number} Line left offset\n */\n _getLineLeftOffset: function(lineIndex) {\n var lineWidth = this.getLineWidth(lineIndex),\n lineDiff = this.width - lineWidth, textAlign = this.textAlign, direction = this.direction,\n isEndOfWrapping, leftOffset = 0, isEndOfWrapping = this.isEndOfWrapping(lineIndex);\n if (textAlign === 'justify'\n || (textAlign === 'justify-center' && !isEndOfWrapping)\n || (textAlign === 'justify-right' && !isEndOfWrapping)\n || (textAlign === 'justify-left' && !isEndOfWrapping)\n ) {\n return 0;\n }\n if (textAlign === 'center') {\n leftOffset = lineDiff / 2;\n }\n if (textAlign === 'right') {\n leftOffset = lineDiff;\n }\n if (textAlign === 'justify-center') {\n leftOffset = lineDiff / 2;\n }\n if (textAlign === 'justify-right') {\n leftOffset = lineDiff;\n }\n if (direction === 'rtl') {\n leftOffset -= lineDiff;\n }\n return leftOffset;\n },\n\n /**\n * @private\n */\n _clearCache: function() {\n this.__lineWidths = [];\n this.__lineHeights = [];\n this.__charBounds = [];\n },\n\n /**\n * @private\n */\n _shouldClearDimensionCache: function() {\n var shouldClear = this._forceClearCache;\n shouldClear || (shouldClear = this.hasStateChanged('_dimensionAffectingProps'));\n if (shouldClear) {\n this.dirty = true;\n this._forceClearCache = false;\n }\n return shouldClear;\n },\n\n /**\n * Measure a single line given its index. Used to calculate the initial\n * text bounding box. The values are calculated and stored in __lineWidths cache.\n * @private\n * @param {Number} lineIndex line number\n * @return {Number} Line width\n */\n getLineWidth: function(lineIndex) {\n if (this.__lineWidths[lineIndex] !== undefined) {\n return this.__lineWidths[lineIndex];\n }\n\n var lineInfo = this.measureLine(lineIndex);\n var width = lineInfo.width;\n this.__lineWidths[lineIndex] = width;\n return width;\n },\n\n _getWidthOfCharSpacing: function() {\n if (this.charSpacing !== 0) {\n return this.fontSize * this.charSpacing / 1000;\n }\n return 0;\n },\n\n /**\n * Retrieves the value of property at given character position\n * @param {Number} lineIndex the line number\n * @param {Number} charIndex the character number\n * @param {String} property the property name\n * @returns the value of 'property'\n */\n getValueOfPropertyAt: function(lineIndex, charIndex, property) {\n var charStyle = this._getStyleDeclaration(lineIndex, charIndex);\n if (charStyle && typeof charStyle[property] !== 'undefined') {\n return charStyle[property];\n }\n return this[property];\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderTextDecoration: function(ctx, type) {\n if (!this[type] && !this.styleHas(type)) {\n return;\n }\n var heightOfLine, size, _size,\n lineLeftOffset, dy, _dy,\n line, lastDecoration,\n leftOffset = this._getLeftOffset(),\n topOffset = this._getTopOffset(), top,\n boxStart, boxWidth, charBox, currentDecoration,\n maxHeight, currentFill, lastFill, path = this.path,\n charSpacing = this._getWidthOfCharSpacing(),\n offsetY = this.offsets[type];\n\n for (var i = 0, len = this._textLines.length; i < len; i++) {\n heightOfLine = this.getHeightOfLine(i);\n if (!this[type] && !this.styleHas(type, i)) {\n topOffset += heightOfLine;\n continue;\n }\n line = this._textLines[i];\n maxHeight = heightOfLine / this.lineHeight;\n lineLeftOffset = this._getLineLeftOffset(i);\n boxStart = 0;\n boxWidth = 0;\n lastDecoration = this.getValueOfPropertyAt(i, 0, type);\n lastFill = this.getValueOfPropertyAt(i, 0, 'fill');\n top = topOffset + maxHeight * (1 - this._fontSizeFraction);\n size = this.getHeightOfChar(i, 0);\n dy = this.getValueOfPropertyAt(i, 0, 'deltaY');\n for (var j = 0, jlen = line.length; j < jlen; j++) {\n charBox = this.__charBounds[i][j];\n currentDecoration = this.getValueOfPropertyAt(i, j, type);\n currentFill = this.getValueOfPropertyAt(i, j, 'fill');\n _size = this.getHeightOfChar(i, j);\n _dy = this.getValueOfPropertyAt(i, j, 'deltaY');\n if (path && currentDecoration && currentFill) {\n ctx.save();\n ctx.fillStyle = lastFill;\n ctx.translate(charBox.renderLeft, charBox.renderTop);\n ctx.rotate(charBox.angle);\n ctx.fillRect(\n -charBox.kernedWidth / 2,\n offsetY * _size + _dy,\n charBox.kernedWidth,\n this.fontSize / 15\n );\n ctx.restore();\n }\n else if (\n (currentDecoration !== lastDecoration || currentFill !== lastFill || _size !== size || _dy !== dy)\n && boxWidth > 0\n ) {\n var drawStart = leftOffset + lineLeftOffset + boxStart;\n if (this.direction === 'rtl') {\n drawStart = this.width - drawStart - boxWidth;\n }\n if (lastDecoration && lastFill) {\n ctx.fillStyle = lastFill;\n ctx.fillRect(\n drawStart,\n top + offsetY * size + dy,\n boxWidth,\n this.fontSize / 15\n );\n }\n boxStart = charBox.left;\n boxWidth = charBox.width;\n lastDecoration = currentDecoration;\n lastFill = currentFill;\n size = _size;\n dy = _dy;\n }\n else {\n boxWidth += charBox.kernedWidth;\n }\n }\n var drawStart = leftOffset + lineLeftOffset + boxStart;\n if (this.direction === 'rtl') {\n drawStart = this.width - drawStart - boxWidth;\n }\n ctx.fillStyle = currentFill;\n currentDecoration && currentFill && ctx.fillRect(\n drawStart,\n top + offsetY * size + dy,\n boxWidth - charSpacing,\n this.fontSize / 15\n );\n topOffset += heightOfLine;\n }\n // if there is text background color no\n // other shadows should be casted\n this._removeShadow(ctx);\n },\n\n /**\n * return font declaration string for canvas context\n * @param {Object} [styleObject] object\n * @returns {String} font declaration formatted for canvas context.\n */\n _getFontDeclaration: function(styleObject, forMeasuring) {\n var style = styleObject || this, family = this.fontFamily,\n fontIsGeneric = fabric.Text.genericFonts.indexOf(family.toLowerCase()) > -1;\n var fontFamily = family === undefined ||\n family.indexOf('\\'') > -1 || family.indexOf(',') > -1 ||\n family.indexOf('\"') > -1 || fontIsGeneric\n ? style.fontFamily : '\"' + style.fontFamily + '\"';\n return [\n // node-canvas needs \"weight style\", while browsers need \"style weight\"\n // verify if this can be fixed in JSDOM\n (fabric.isLikelyNode ? style.fontWeight : style.fontStyle),\n (fabric.isLikelyNode ? style.fontStyle : style.fontWeight),\n forMeasuring ? this.CACHE_FONT_SIZE + 'px' : style.fontSize + 'px',\n fontFamily\n ].join(' ');\n },\n\n /**\n * Renders text instance on a specified context\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n render: function(ctx) {\n // do not render if object is not visible\n if (!this.visible) {\n return;\n }\n if (this.canvas && this.canvas.skipOffscreen && !this.group && !this.isOnScreen()) {\n return;\n }\n if (this._shouldClearDimensionCache()) {\n this.initDimensions();\n }\n this.callSuper('render', ctx);\n },\n\n /**\n * Returns the text as an array of lines.\n * @param {String} text text to split\n * @returns {Array} Lines in the text\n */\n _splitTextIntoLines: function(text) {\n var lines = text.split(this._reNewline),\n newLines = new Array(lines.length),\n newLine = ['\\n'],\n newText = [];\n for (var i = 0; i < lines.length; i++) {\n newLines[i] = fabric.util.string.graphemeSplit(lines[i]);\n newText = newText.concat(newLines[i], newLine);\n }\n newText.pop();\n return { _unwrappedLines: newLines, lines: lines, graphemeText: newText, graphemeLines: newLines };\n },\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} Object representation of an instance\n */\n toObject: function(propertiesToInclude) {\n var allProperties = additionalProps.concat(propertiesToInclude);\n var obj = this.callSuper('toObject', allProperties);\n obj.styles = fabric.util.stylesToArray(this.styles, this.text);\n if (obj.path) {\n obj.path = this.path.toObject();\n }\n return obj;\n },\n\n /**\n * Sets property to a given value. When changing position/dimension -related properties (left, top, scale, angle, etc.) `set` does not update position of object's borders/controls. If you need to update those, call `setCoords()`.\n * @param {String|Object} key Property name or object (if object, iterate over the object properties)\n * @param {Object|Function} value Property value (if function, the value is passed into it and its return value is used as a new one)\n * @return {fabric.Object} thisArg\n * @chainable\n */\n set: function(key, value) {\n this.callSuper('set', key, value);\n var needsDims = false;\n var isAddingPath = false;\n if (typeof key === 'object') {\n for (var _key in key) {\n if (_key === 'path') {\n this.setPathInfo();\n }\n needsDims = needsDims || this._dimensionAffectingProps.indexOf(_key) !== -1;\n isAddingPath = isAddingPath || _key === 'path';\n }\n }\n else {\n needsDims = this._dimensionAffectingProps.indexOf(key) !== -1;\n isAddingPath = key === 'path';\n }\n if (isAddingPath) {\n this.setPathInfo();\n }\n if (needsDims) {\n this.initDimensions();\n this.setCoords();\n }\n return this;\n },\n\n /**\n * Returns complexity of an instance\n * @return {Number} complexity\n */\n complexity: function() {\n return 1;\n }\n });\n\n /* _FROM_SVG_START_ */\n /**\n * List of attribute names to account for when parsing SVG element (used by {@link fabric.Text.fromElement})\n * @static\n * @memberOf fabric.Text\n * @see: http://www.w3.org/TR/SVG/text.html#TextElement\n */\n fabric.Text.ATTRIBUTE_NAMES = fabric.SHARED_ATTRIBUTES.concat(\n 'x y dx dy font-family font-style font-weight font-size letter-spacing text-decoration text-anchor'.split(' '));\n\n /**\n * Default SVG font size\n * @static\n * @memberOf fabric.Text\n */\n fabric.Text.DEFAULT_SVG_FONT_SIZE = 16;\n\n /**\n * Returns fabric.Text instance from an SVG element (not yet implemented)\n * @static\n * @memberOf fabric.Text\n * @param {SVGElement} element Element to parse\n * @param {Function} callback callback function invoked after parsing\n * @param {Object} [options] Options object\n */\n fabric.Text.fromElement = function(element, callback, options) {\n if (!element) {\n return callback(null);\n }\n\n var parsedAttributes = fabric.parseAttributes(element, fabric.Text.ATTRIBUTE_NAMES),\n parsedAnchor = parsedAttributes.textAnchor || 'left';\n options = fabric.util.object.extend((options ? clone(options) : { }), parsedAttributes);\n\n options.top = options.top || 0;\n options.left = options.left || 0;\n if (parsedAttributes.textDecoration) {\n var textDecoration = parsedAttributes.textDecoration;\n if (textDecoration.indexOf('underline') !== -1) {\n options.underline = true;\n }\n if (textDecoration.indexOf('overline') !== -1) {\n options.overline = true;\n }\n if (textDecoration.indexOf('line-through') !== -1) {\n options.linethrough = true;\n }\n delete options.textDecoration;\n }\n if ('dx' in parsedAttributes) {\n options.left += parsedAttributes.dx;\n }\n if ('dy' in parsedAttributes) {\n options.top += parsedAttributes.dy;\n }\n if (!('fontSize' in options)) {\n options.fontSize = fabric.Text.DEFAULT_SVG_FONT_SIZE;\n }\n\n var textContent = '';\n\n // The XML is not properly parsed in IE9 so a workaround to get\n // textContent is through firstChild.data. Another workaround would be\n // to convert XML loaded from a file to be converted using DOMParser (same way loadSVGFromString() does)\n if (!('textContent' in element)) {\n if ('firstChild' in element && element.firstChild !== null) {\n if ('data' in element.firstChild && element.firstChild.data !== null) {\n textContent = element.firstChild.data;\n }\n }\n }\n else {\n textContent = element.textContent;\n }\n\n textContent = textContent.replace(/^\\s+|\\s+$|\\n+/g, '').replace(/\\s+/g, ' ');\n var originalStrokeWidth = options.strokeWidth;\n options.strokeWidth = 0;\n\n var text = new fabric.Text(textContent, options),\n textHeightScaleFactor = text.getScaledHeight() / text.height,\n lineHeightDiff = (text.height + text.strokeWidth) * text.lineHeight - text.height,\n scaledDiff = lineHeightDiff * textHeightScaleFactor,\n textHeight = text.getScaledHeight() + scaledDiff,\n offX = 0;\n /*\n Adjust positioning:\n x/y attributes in SVG correspond to the bottom-left corner of text bounding box\n fabric output by default at top, left.\n */\n if (parsedAnchor === 'center') {\n offX = text.getScaledWidth() / 2;\n }\n if (parsedAnchor === 'right') {\n offX = text.getScaledWidth();\n }\n text.set({\n left: text.left - offX,\n top: text.top - (textHeight - text.fontSize * (0.07 + text._fontSizeFraction)) / text.lineHeight,\n strokeWidth: typeof originalStrokeWidth !== 'undefined' ? originalStrokeWidth : 1,\n });\n callback(text);\n };\n /* _FROM_SVG_END_ */\n\n /**\n * Returns fabric.Text instance from an object representation\n * @static\n * @memberOf fabric.Text\n * @param {Object} object plain js Object to create an instance from\n * @param {Function} [callback] Callback to invoke when an fabric.Text instance is created\n */\n fabric.Text.fromObject = function(object, callback) {\n var objectCopy = clone(object), path = object.path;\n delete objectCopy.path;\n return fabric.Object._fromObject('Text', objectCopy, function(textInstance) {\n textInstance.styles = fabric.util.stylesFromArray(object.styles, object.text);\n if (path) {\n fabric.Object._fromObject('Path', path, function(pathInstance) {\n textInstance.set('path', pathInstance);\n callback(textInstance);\n }, 'path');\n }\n else {\n callback(textInstance);\n }\n }, 'text');\n };\n\n fabric.Text.genericFonts = ['sans-serif', 'serif', 'cursive', 'fantasy', 'monospace'];\n\n fabric.util.createAccessors && fabric.util.createAccessors(fabric.Text);\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function() {\n fabric.util.object.extend(fabric.Text.prototype, /** @lends fabric.Text.prototype */ {\n /**\n * Returns true if object has no styling or no styling in a line\n * @param {Number} lineIndex , lineIndex is on wrapped lines.\n * @return {Boolean}\n */\n isEmptyStyles: function(lineIndex) {\n if (!this.styles) {\n return true;\n }\n if (typeof lineIndex !== 'undefined' && !this.styles[lineIndex]) {\n return true;\n }\n var obj = typeof lineIndex === 'undefined' ? this.styles : { line: this.styles[lineIndex] };\n for (var p1 in obj) {\n for (var p2 in obj[p1]) {\n // eslint-disable-next-line no-unused-vars\n for (var p3 in obj[p1][p2]) {\n return false;\n }\n }\n }\n return true;\n },\n\n /**\n * Returns true if object has a style property or has it ina specified line\n * This function is used to detect if a text will use a particular property or not.\n * @param {String} property to check for\n * @param {Number} lineIndex to check the style on\n * @return {Boolean}\n */\n styleHas: function(property, lineIndex) {\n if (!this.styles || !property || property === '') {\n return false;\n }\n if (typeof lineIndex !== 'undefined' && !this.styles[lineIndex]) {\n return false;\n }\n var obj = typeof lineIndex === 'undefined' ? this.styles : { 0: this.styles[lineIndex] };\n // eslint-disable-next-line\n for (var p1 in obj) {\n // eslint-disable-next-line\n for (var p2 in obj[p1]) {\n if (typeof obj[p1][p2][property] !== 'undefined') {\n return true;\n }\n }\n }\n return false;\n },\n\n /**\n * Check if characters in a text have a value for a property\n * whose value matches the textbox's value for that property. If so,\n * the character-level property is deleted. If the character\n * has no other properties, then it is also deleted. Finally,\n * if the line containing that character has no other characters\n * then it also is deleted.\n *\n * @param {string} property The property to compare between characters and text.\n */\n cleanStyle: function(property) {\n if (!this.styles || !property || property === '') {\n return false;\n }\n var obj = this.styles, stylesCount = 0, letterCount, stylePropertyValue,\n allStyleObjectPropertiesMatch = true, graphemeCount = 0, styleObject;\n // eslint-disable-next-line\n for (var p1 in obj) {\n letterCount = 0;\n // eslint-disable-next-line\n for (var p2 in obj[p1]) {\n var styleObject = obj[p1][p2],\n stylePropertyHasBeenSet = styleObject.hasOwnProperty(property);\n\n stylesCount++;\n\n if (stylePropertyHasBeenSet) {\n if (!stylePropertyValue) {\n stylePropertyValue = styleObject[property];\n }\n else if (styleObject[property] !== stylePropertyValue) {\n allStyleObjectPropertiesMatch = false;\n }\n\n if (styleObject[property] === this[property]) {\n delete styleObject[property];\n }\n }\n else {\n allStyleObjectPropertiesMatch = false;\n }\n\n if (Object.keys(styleObject).length !== 0) {\n letterCount++;\n }\n else {\n delete obj[p1][p2];\n }\n }\n\n if (letterCount === 0) {\n delete obj[p1];\n }\n }\n // if every grapheme has the same style set then\n // delete those styles and set it on the parent\n for (var i = 0; i < this._textLines.length; i++) {\n graphemeCount += this._textLines[i].length;\n }\n if (allStyleObjectPropertiesMatch && stylesCount === graphemeCount) {\n this[property] = stylePropertyValue;\n this.removeStyle(property);\n }\n },\n\n /**\n * Remove a style property or properties from all individual character styles\n * in a text object. Deletes the character style object if it contains no other style\n * props. Deletes a line style object if it contains no other character styles.\n *\n * @param {String} props The property to remove from character styles.\n */\n removeStyle: function(property) {\n if (!this.styles || !property || property === '') {\n return;\n }\n var obj = this.styles, line, lineNum, charNum;\n for (lineNum in obj) {\n line = obj[lineNum];\n for (charNum in line) {\n delete line[charNum][property];\n if (Object.keys(line[charNum]).length === 0) {\n delete line[charNum];\n }\n }\n if (Object.keys(line).length === 0) {\n delete obj[lineNum];\n }\n }\n },\n\n /**\n * @private\n */\n _extendStyles: function(index, styles) {\n var loc = this.get2DCursorLocation(index);\n\n if (!this._getLineStyle(loc.lineIndex)) {\n this._setLineStyle(loc.lineIndex);\n }\n\n if (!this._getStyleDeclaration(loc.lineIndex, loc.charIndex)) {\n this._setStyleDeclaration(loc.lineIndex, loc.charIndex, {});\n }\n\n fabric.util.object.extend(this._getStyleDeclaration(loc.lineIndex, loc.charIndex), styles);\n },\n\n /**\n * Returns 2d representation (lineIndex and charIndex) of cursor (or selection start)\n * @param {Number} [selectionStart] Optional index. When not given, current selectionStart is used.\n * @param {Boolean} [skipWrapping] consider the location for unwrapped lines. useful to manage styles.\n */\n get2DCursorLocation: function(selectionStart, skipWrapping) {\n if (typeof selectionStart === 'undefined') {\n selectionStart = this.selectionStart;\n }\n var lines = skipWrapping ? this._unwrappedTextLines : this._textLines,\n len = lines.length;\n for (var i = 0; i < len; i++) {\n if (selectionStart <= lines[i].length) {\n return {\n lineIndex: i,\n charIndex: selectionStart\n };\n }\n selectionStart -= lines[i].length + this.missingNewlineOffset(i);\n }\n return {\n lineIndex: i - 1,\n charIndex: lines[i - 1].length < selectionStart ? lines[i - 1].length : selectionStart\n };\n },\n\n /**\n * Gets style of a current selection/cursor (at the start position)\n * if startIndex or endIndex are not provided, selectionStart or selectionEnd will be used.\n * @param {Number} [startIndex] Start index to get styles at\n * @param {Number} [endIndex] End index to get styles at, if not specified selectionEnd or startIndex + 1\n * @param {Boolean} [complete] get full style or not\n * @return {Array} styles an array with one, zero or more Style objects\n */\n getSelectionStyles: function(startIndex, endIndex, complete) {\n if (typeof startIndex === 'undefined') {\n startIndex = this.selectionStart || 0;\n }\n if (typeof endIndex === 'undefined') {\n endIndex = this.selectionEnd || startIndex;\n }\n var styles = [];\n for (var i = startIndex; i < endIndex; i++) {\n styles.push(this.getStyleAtPosition(i, complete));\n }\n return styles;\n },\n\n /**\n * Gets style of a current selection/cursor position\n * @param {Number} position to get styles at\n * @param {Boolean} [complete] full style if true\n * @return {Object} style Style object at a specified index\n * @private\n */\n getStyleAtPosition: function(position, complete) {\n var loc = this.get2DCursorLocation(position),\n style = complete ? this.getCompleteStyleDeclaration(loc.lineIndex, loc.charIndex) :\n this._getStyleDeclaration(loc.lineIndex, loc.charIndex);\n return style || {};\n },\n\n /**\n * Sets style of a current selection, if no selection exist, do not set anything.\n * @param {Object} [styles] Styles object\n * @param {Number} [startIndex] Start index to get styles at\n * @param {Number} [endIndex] End index to get styles at, if not specified selectionEnd or startIndex + 1\n * @return {fabric.IText} thisArg\n * @chainable\n */\n setSelectionStyles: function(styles, startIndex, endIndex) {\n if (typeof startIndex === 'undefined') {\n startIndex = this.selectionStart || 0;\n }\n if (typeof endIndex === 'undefined') {\n endIndex = this.selectionEnd || startIndex;\n }\n for (var i = startIndex; i < endIndex; i++) {\n this._extendStyles(i, styles);\n }\n /* not included in _extendStyles to avoid clearing cache more than once */\n this._forceClearCache = true;\n return this;\n },\n\n /**\n * get the reference, not a clone, of the style object for a given character\n * @param {Number} lineIndex\n * @param {Number} charIndex\n * @return {Object} style object\n */\n _getStyleDeclaration: function(lineIndex, charIndex) {\n var lineStyle = this.styles && this.styles[lineIndex];\n if (!lineStyle) {\n return null;\n }\n return lineStyle[charIndex];\n },\n\n /**\n * return a new object that contains all the style property for a character\n * the object returned is newly created\n * @param {Number} lineIndex of the line where the character is\n * @param {Number} charIndex position of the character on the line\n * @return {Object} style object\n */\n getCompleteStyleDeclaration: function(lineIndex, charIndex) {\n var style = this._getStyleDeclaration(lineIndex, charIndex) || { },\n styleObject = { }, prop;\n for (var i = 0; i < this._styleProperties.length; i++) {\n prop = this._styleProperties[i];\n styleObject[prop] = typeof style[prop] === 'undefined' ? this[prop] : style[prop];\n }\n return styleObject;\n },\n\n /**\n * @param {Number} lineIndex\n * @param {Number} charIndex\n * @param {Object} style\n * @private\n */\n _setStyleDeclaration: function(lineIndex, charIndex, style) {\n this.styles[lineIndex][charIndex] = style;\n },\n\n /**\n *\n * @param {Number} lineIndex\n * @param {Number} charIndex\n * @private\n */\n _deleteStyleDeclaration: function(lineIndex, charIndex) {\n delete this.styles[lineIndex][charIndex];\n },\n\n /**\n * @param {Number} lineIndex\n * @return {Boolean} if the line exists or not\n * @private\n */\n _getLineStyle: function(lineIndex) {\n return !!this.styles[lineIndex];\n },\n\n /**\n * Set the line style to an empty object so that is initialized\n * @param {Number} lineIndex\n * @private\n */\n _setLineStyle: function(lineIndex) {\n this.styles[lineIndex] = {};\n },\n\n /**\n * @param {Number} lineIndex\n * @private\n */\n _deleteLineStyle: function(lineIndex) {\n delete this.styles[lineIndex];\n }\n });\n})();\n\n\n(function() {\n\n function parseDecoration(object) {\n if (object.textDecoration) {\n object.textDecoration.indexOf('underline') > -1 && (object.underline = true);\n object.textDecoration.indexOf('line-through') > -1 && (object.linethrough = true);\n object.textDecoration.indexOf('overline') > -1 && (object.overline = true);\n delete object.textDecoration;\n }\n }\n\n /**\n * IText class (introduced in v1.4) Events are also fired with \"text:\"\n * prefix when observing canvas.\n * @class fabric.IText\n * @extends fabric.Text\n * @mixes fabric.Observable\n *\n * @fires changed\n * @fires selection:changed\n * @fires editing:entered\n * @fires editing:exited\n *\n * @return {fabric.IText} thisArg\n * @see {@link fabric.IText#initialize} for constructor definition\n *\n *

Supported key combinations:

\n *
\n   *   Move cursor:                    left, right, up, down\n   *   Select character:               shift + left, shift + right\n   *   Select text vertically:         shift + up, shift + down\n   *   Move cursor by word:            alt + left, alt + right\n   *   Select words:                   shift + alt + left, shift + alt + right\n   *   Move cursor to line start/end:  cmd + left, cmd + right or home, end\n   *   Select till start/end of line:  cmd + shift + left, cmd + shift + right or shift + home, shift + end\n   *   Jump to start/end of text:      cmd + up, cmd + down\n   *   Select till start/end of text:  cmd + shift + up, cmd + shift + down or shift + pgUp, shift + pgDown\n   *   Delete character:               backspace\n   *   Delete word:                    alt + backspace\n   *   Delete line:                    cmd + backspace\n   *   Forward delete:                 delete\n   *   Copy text:                      ctrl/cmd + c\n   *   Paste text:                     ctrl/cmd + v\n   *   Cut text:                       ctrl/cmd + x\n   *   Select entire text:             ctrl/cmd + a\n   *   Quit editing                    tab or esc\n   * 
\n *\n *

Supported mouse/touch combination

\n *
\n   *   Position cursor:                click/touch\n   *   Create selection:               click/touch & drag\n   *   Create selection:               click & shift + click\n   *   Select word:                    double click\n   *   Select line:                    triple click\n   * 
\n */\n fabric.IText = fabric.util.createClass(fabric.Text, fabric.Observable, /** @lends fabric.IText.prototype */ {\n\n /**\n * Type of an object\n * @type String\n * @default\n */\n type: 'i-text',\n\n /**\n * Index where text selection starts (or where cursor is when there is no selection)\n * @type Number\n * @default\n */\n selectionStart: 0,\n\n /**\n * Index where text selection ends\n * @type Number\n * @default\n */\n selectionEnd: 0,\n\n /**\n * Color of text selection\n * @type String\n * @default\n */\n selectionColor: 'rgba(17,119,255,0.3)',\n\n /**\n * Indicates whether text is in editing mode\n * @type Boolean\n * @default\n */\n isEditing: false,\n\n /**\n * Indicates whether a text can be edited\n * @type Boolean\n * @default\n */\n editable: true,\n\n /**\n * Border color of text object while it's in editing mode\n * @type String\n * @default\n */\n editingBorderColor: 'rgba(102,153,255,0.25)',\n\n /**\n * Width of cursor (in px)\n * @type Number\n * @default\n */\n cursorWidth: 2,\n\n /**\n * Color of text cursor color in editing mode.\n * if not set (default) will take color from the text.\n * if set to a color value that fabric can understand, it will\n * be used instead of the color of the text at the current position.\n * @type String\n * @default\n */\n cursorColor: '',\n\n /**\n * Delay between cursor blink (in ms)\n * @type Number\n * @default\n */\n cursorDelay: 1000,\n\n /**\n * Duration of cursor fadein (in ms)\n * @type Number\n * @default\n */\n cursorDuration: 600,\n\n /**\n * Indicates whether internal text char widths can be cached\n * @type Boolean\n * @default\n */\n caching: true,\n\n /**\n * DOM container to append the hiddenTextarea.\n * An alternative to attaching to the document.body.\n * Useful to reduce laggish redraw of the full document.body tree and\n * also with modals event capturing that won't let the textarea take focus.\n * @type HTMLElement\n * @default\n */\n hiddenTextareaContainer: null,\n\n /**\n * @private\n */\n _reSpace: /\\s|\\n/,\n\n /**\n * @private\n */\n _currentCursorOpacity: 0,\n\n /**\n * @private\n */\n _selectionDirection: null,\n\n /**\n * @private\n */\n _abortCursorAnimation: false,\n\n /**\n * @private\n */\n __widthOfSpace: [],\n\n /**\n * Helps determining when the text is in composition, so that the cursor\n * rendering is altered.\n */\n inCompositionMode: false,\n\n /**\n * Constructor\n * @param {String} text Text string\n * @param {Object} [options] Options object\n * @return {fabric.IText} thisArg\n */\n initialize: function(text, options) {\n this.callSuper('initialize', text, options);\n this.initBehavior();\n },\n\n /**\n * Sets selection start (left boundary of a selection)\n * @param {Number} index Index to set selection start to\n */\n setSelectionStart: function(index) {\n index = Math.max(index, 0);\n this._updateAndFire('selectionStart', index);\n },\n\n /**\n * Sets selection end (right boundary of a selection)\n * @param {Number} index Index to set selection end to\n */\n setSelectionEnd: function(index) {\n index = Math.min(index, this.text.length);\n this._updateAndFire('selectionEnd', index);\n },\n\n /**\n * @private\n * @param {String} property 'selectionStart' or 'selectionEnd'\n * @param {Number} index new position of property\n */\n _updateAndFire: function(property, index) {\n if (this[property] !== index) {\n this._fireSelectionChanged();\n this[property] = index;\n }\n this._updateTextarea();\n },\n\n /**\n * Fires the even of selection changed\n * @private\n */\n _fireSelectionChanged: function() {\n this.fire('selection:changed');\n this.canvas && this.canvas.fire('text:selection:changed', { target: this });\n },\n\n /**\n * Initialize text dimensions. Render all text on given context\n * or on a offscreen canvas to get the text width with measureText.\n * Updates this.width and this.height with the proper values.\n * Does not return dimensions.\n * @private\n */\n initDimensions: function() {\n this.isEditing && this.initDelayedCursor();\n this.clearContextTop();\n this.callSuper('initDimensions');\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n render: function(ctx) {\n this.clearContextTop();\n this.callSuper('render', ctx);\n // clear the cursorOffsetCache, so we ensure to calculate once per renderCursor\n // the correct position but not at every cursor animation.\n this.cursorOffsetCache = { };\n this.renderCursorOrSelection();\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _render: function(ctx) {\n this.callSuper('_render', ctx);\n },\n\n /**\n * Prepare and clean the contextTop\n */\n clearContextTop: function(skipRestore) {\n if (!this.isEditing || !this.canvas || !this.canvas.contextTop) {\n return;\n }\n var ctx = this.canvas.contextTop, v = this.canvas.viewportTransform;\n ctx.save();\n ctx.transform(v[0], v[1], v[2], v[3], v[4], v[5]);\n this.transform(ctx);\n this._clearTextArea(ctx);\n skipRestore || ctx.restore();\n },\n /**\n * Renders cursor or selection (depending on what exists)\n * it does on the contextTop. If contextTop is not available, do nothing.\n */\n renderCursorOrSelection: function() {\n if (!this.isEditing || !this.canvas || !this.canvas.contextTop) {\n return;\n }\n var boundaries = this._getCursorBoundaries(),\n ctx = this.canvas.contextTop;\n this.clearContextTop(true);\n if (this.selectionStart === this.selectionEnd) {\n this.renderCursor(boundaries, ctx);\n }\n else {\n this.renderSelection(boundaries, ctx);\n }\n ctx.restore();\n },\n\n _clearTextArea: function(ctx) {\n // we add 4 pixel, to be sure to do not leave any pixel out\n var width = this.width + 4, height = this.height + 4;\n ctx.clearRect(-width / 2, -height / 2, width, height);\n },\n\n /**\n * Returns cursor boundaries (left, top, leftOffset, topOffset)\n * @private\n * @param {Array} chars Array of characters\n * @param {String} typeOfBoundaries\n */\n _getCursorBoundaries: function(position) {\n\n // left/top are left/top of entire text box\n // leftOffset/topOffset are offset from that left/top point of a text box\n\n if (typeof position === 'undefined') {\n position = this.selectionStart;\n }\n\n var left = this._getLeftOffset(),\n top = this._getTopOffset(),\n offsets = this._getCursorBoundariesOffsets(position);\n return {\n left: left,\n top: top,\n leftOffset: offsets.left,\n topOffset: offsets.top\n };\n },\n\n /**\n * @private\n */\n _getCursorBoundariesOffsets: function(position) {\n if (this.cursorOffsetCache && 'top' in this.cursorOffsetCache) {\n return this.cursorOffsetCache;\n }\n var lineLeftOffset,\n lineIndex,\n charIndex,\n topOffset = 0,\n leftOffset = 0,\n boundaries,\n cursorPosition = this.get2DCursorLocation(position);\n charIndex = cursorPosition.charIndex;\n lineIndex = cursorPosition.lineIndex;\n for (var i = 0; i < lineIndex; i++) {\n topOffset += this.getHeightOfLine(i);\n }\n lineLeftOffset = this._getLineLeftOffset(lineIndex);\n var bound = this.__charBounds[lineIndex][charIndex];\n bound && (leftOffset = bound.left);\n if (this.charSpacing !== 0 && charIndex === this._textLines[lineIndex].length) {\n leftOffset -= this._getWidthOfCharSpacing();\n }\n boundaries = {\n top: topOffset,\n left: lineLeftOffset + (leftOffset > 0 ? leftOffset : 0),\n };\n if (this.direction === 'rtl') {\n boundaries.left *= -1;\n }\n this.cursorOffsetCache = boundaries;\n return this.cursorOffsetCache;\n },\n\n /**\n * Renders cursor\n * @param {Object} boundaries\n * @param {CanvasRenderingContext2D} ctx transformed context to draw on\n */\n renderCursor: function(boundaries, ctx) {\n var cursorLocation = this.get2DCursorLocation(),\n lineIndex = cursorLocation.lineIndex,\n charIndex = cursorLocation.charIndex > 0 ? cursorLocation.charIndex - 1 : 0,\n charHeight = this.getValueOfPropertyAt(lineIndex, charIndex, 'fontSize'),\n multiplier = this.scaleX * this.canvas.getZoom(),\n cursorWidth = this.cursorWidth / multiplier,\n topOffset = boundaries.topOffset,\n dy = this.getValueOfPropertyAt(lineIndex, charIndex, 'deltaY');\n topOffset += (1 - this._fontSizeFraction) * this.getHeightOfLine(lineIndex) / this.lineHeight\n - charHeight * (1 - this._fontSizeFraction);\n\n if (this.inCompositionMode) {\n this.renderSelection(boundaries, ctx);\n }\n ctx.fillStyle = this.cursorColor || this.getValueOfPropertyAt(lineIndex, charIndex, 'fill');\n ctx.globalAlpha = this.__isMousedown ? 1 : this._currentCursorOpacity;\n ctx.fillRect(\n boundaries.left + boundaries.leftOffset - cursorWidth / 2,\n topOffset + boundaries.top + dy,\n cursorWidth,\n charHeight);\n },\n\n /**\n * Renders text selection\n * @param {Object} boundaries Object with left/top/leftOffset/topOffset\n * @param {CanvasRenderingContext2D} ctx transformed context to draw on\n */\n renderSelection: function(boundaries, ctx) {\n\n var selectionStart = this.inCompositionMode ? this.hiddenTextarea.selectionStart : this.selectionStart,\n selectionEnd = this.inCompositionMode ? this.hiddenTextarea.selectionEnd : this.selectionEnd,\n isJustify = this.textAlign.indexOf('justify') !== -1,\n start = this.get2DCursorLocation(selectionStart),\n end = this.get2DCursorLocation(selectionEnd),\n startLine = start.lineIndex,\n endLine = end.lineIndex,\n startChar = start.charIndex < 0 ? 0 : start.charIndex,\n endChar = end.charIndex < 0 ? 0 : end.charIndex;\n\n for (var i = startLine; i <= endLine; i++) {\n var lineOffset = this._getLineLeftOffset(i) || 0,\n lineHeight = this.getHeightOfLine(i),\n realLineHeight = 0, boxStart = 0, boxEnd = 0;\n\n if (i === startLine) {\n boxStart = this.__charBounds[startLine][startChar].left;\n }\n if (i >= startLine && i < endLine) {\n boxEnd = isJustify && !this.isEndOfWrapping(i) ? this.width : this.getLineWidth(i) || 5; // WTF is this 5?\n }\n else if (i === endLine) {\n if (endChar === 0) {\n boxEnd = this.__charBounds[endLine][endChar].left;\n }\n else {\n var charSpacing = this._getWidthOfCharSpacing();\n boxEnd = this.__charBounds[endLine][endChar - 1].left\n + this.__charBounds[endLine][endChar - 1].width - charSpacing;\n }\n }\n realLineHeight = lineHeight;\n if (this.lineHeight < 1 || (i === endLine && this.lineHeight > 1)) {\n lineHeight /= this.lineHeight;\n }\n var drawStart = boundaries.left + lineOffset + boxStart,\n drawWidth = boxEnd - boxStart,\n drawHeight = lineHeight, extraTop = 0;\n if (this.inCompositionMode) {\n ctx.fillStyle = this.compositionColor || 'black';\n drawHeight = 1;\n extraTop = lineHeight;\n }\n else {\n ctx.fillStyle = this.selectionColor;\n }\n if (this.direction === 'rtl') {\n drawStart = this.width - drawStart - drawWidth;\n }\n ctx.fillRect(\n drawStart,\n boundaries.top + boundaries.topOffset + extraTop,\n drawWidth,\n drawHeight);\n boundaries.topOffset += realLineHeight;\n }\n },\n\n /**\n * High level function to know the height of the cursor.\n * the currentChar is the one that precedes the cursor\n * Returns fontSize of char at the current cursor\n * Unused from the library, is for the end user\n * @return {Number} Character font size\n */\n getCurrentCharFontSize: function() {\n var cp = this._getCurrentCharIndex();\n return this.getValueOfPropertyAt(cp.l, cp.c, 'fontSize');\n },\n\n /**\n * High level function to know the color of the cursor.\n * the currentChar is the one that precedes the cursor\n * Returns color (fill) of char at the current cursor\n * if the text object has a pattern or gradient for filler, it will return that.\n * Unused by the library, is for the end user\n * @return {String | fabric.Gradient | fabric.Pattern} Character color (fill)\n */\n getCurrentCharColor: function() {\n var cp = this._getCurrentCharIndex();\n return this.getValueOfPropertyAt(cp.l, cp.c, 'fill');\n },\n\n /**\n * Returns the cursor position for the getCurrent.. functions\n * @private\n */\n _getCurrentCharIndex: function() {\n var cursorPosition = this.get2DCursorLocation(this.selectionStart, true),\n charIndex = cursorPosition.charIndex > 0 ? cursorPosition.charIndex - 1 : 0;\n return { l: cursorPosition.lineIndex, c: charIndex };\n }\n });\n\n /**\n * Returns fabric.IText instance from an object representation\n * @static\n * @memberOf fabric.IText\n * @param {Object} object Object to create an instance from\n * @param {function} [callback] invoked with new instance as argument\n */\n fabric.IText.fromObject = function(object, callback) {\n var styles = fabric.util.stylesFromArray(object.styles, object.text);\n //copy object to prevent mutation\n var objCopy = Object.assign({}, object, { styles: styles });\n parseDecoration(objCopy);\n if (objCopy.styles) {\n for (var i in objCopy.styles) {\n for (var j in objCopy.styles[i]) {\n parseDecoration(objCopy.styles[i][j]);\n }\n }\n }\n fabric.Object._fromObject('IText', objCopy, callback, 'text');\n };\n})();\n\n\n(function() {\n\n var clone = fabric.util.object.clone;\n\n fabric.util.object.extend(fabric.IText.prototype, /** @lends fabric.IText.prototype */ {\n\n /**\n * Initializes all the interactive behavior of IText\n */\n initBehavior: function() {\n this.initAddedHandler();\n this.initRemovedHandler();\n this.initCursorSelectionHandlers();\n this.initDoubleClickSimulation();\n this.mouseMoveHandler = this.mouseMoveHandler.bind(this);\n },\n\n onDeselect: function() {\n this.isEditing && this.exitEditing();\n this.selected = false;\n },\n\n /**\n * Initializes \"added\" event handler\n */\n initAddedHandler: function() {\n var _this = this;\n this.on('added', function() {\n var canvas = _this.canvas;\n if (canvas) {\n if (!canvas._hasITextHandlers) {\n canvas._hasITextHandlers = true;\n _this._initCanvasHandlers(canvas);\n }\n canvas._iTextInstances = canvas._iTextInstances || [];\n canvas._iTextInstances.push(_this);\n }\n });\n },\n\n initRemovedHandler: function() {\n var _this = this;\n this.on('removed', function() {\n var canvas = _this.canvas;\n if (canvas) {\n canvas._iTextInstances = canvas._iTextInstances || [];\n fabric.util.removeFromArray(canvas._iTextInstances, _this);\n if (canvas._iTextInstances.length === 0) {\n canvas._hasITextHandlers = false;\n _this._removeCanvasHandlers(canvas);\n }\n }\n });\n },\n\n /**\n * register canvas event to manage exiting on other instances\n * @private\n */\n _initCanvasHandlers: function(canvas) {\n canvas._mouseUpITextHandler = function() {\n if (canvas._iTextInstances) {\n canvas._iTextInstances.forEach(function(obj) {\n obj.__isMousedown = false;\n });\n }\n };\n canvas.on('mouse:up', canvas._mouseUpITextHandler);\n },\n\n /**\n * remove canvas event to manage exiting on other instances\n * @private\n */\n _removeCanvasHandlers: function(canvas) {\n canvas.off('mouse:up', canvas._mouseUpITextHandler);\n },\n\n /**\n * @private\n */\n _tick: function() {\n this._currentTickState = this._animateCursor(this, 1, this.cursorDuration, '_onTickComplete');\n },\n\n /**\n * @private\n */\n _animateCursor: function(obj, targetOpacity, duration, completeMethod) {\n\n var tickState;\n\n tickState = {\n isAborted: false,\n abort: function() {\n this.isAborted = true;\n },\n };\n\n obj.animate('_currentCursorOpacity', targetOpacity, {\n duration: duration,\n onComplete: function() {\n if (!tickState.isAborted) {\n obj[completeMethod]();\n }\n },\n onChange: function() {\n // we do not want to animate a selection, only cursor\n if (obj.canvas && obj.selectionStart === obj.selectionEnd) {\n obj.renderCursorOrSelection();\n }\n },\n abort: function() {\n return tickState.isAborted;\n }\n });\n return tickState;\n },\n\n /**\n * @private\n */\n _onTickComplete: function() {\n\n var _this = this;\n\n if (this._cursorTimeout1) {\n clearTimeout(this._cursorTimeout1);\n }\n this._cursorTimeout1 = setTimeout(function() {\n _this._currentTickCompleteState = _this._animateCursor(_this, 0, this.cursorDuration / 2, '_tick');\n }, 100);\n },\n\n /**\n * Initializes delayed cursor\n */\n initDelayedCursor: function(restart) {\n var _this = this,\n delay = restart ? 0 : this.cursorDelay;\n\n this.abortCursorAnimation();\n this._currentCursorOpacity = 1;\n this._cursorTimeout2 = setTimeout(function() {\n _this._tick();\n }, delay);\n },\n\n /**\n * Aborts cursor animation and clears all timeouts\n */\n abortCursorAnimation: function() {\n var shouldClear = this._currentTickState || this._currentTickCompleteState,\n canvas = this.canvas;\n this._currentTickState && this._currentTickState.abort();\n this._currentTickCompleteState && this._currentTickCompleteState.abort();\n\n clearTimeout(this._cursorTimeout1);\n clearTimeout(this._cursorTimeout2);\n\n this._currentCursorOpacity = 0;\n // to clear just itext area we need to transform the context\n // it may not be worth it\n if (shouldClear && canvas) {\n canvas.clearContext(canvas.contextTop || canvas.contextContainer);\n }\n\n },\n\n /**\n * Selects entire text\n * @return {fabric.IText} thisArg\n * @chainable\n */\n selectAll: function() {\n this.selectionStart = 0;\n this.selectionEnd = this._text.length;\n this._fireSelectionChanged();\n this._updateTextarea();\n return this;\n },\n\n /**\n * Returns selected text\n * @return {String}\n */\n getSelectedText: function() {\n return this._text.slice(this.selectionStart, this.selectionEnd).join('');\n },\n\n /**\n * Find new selection index representing start of current word according to current selection index\n * @param {Number} startFrom Current selection index\n * @return {Number} New selection index\n */\n findWordBoundaryLeft: function(startFrom) {\n var offset = 0, index = startFrom - 1;\n\n // remove space before cursor first\n if (this._reSpace.test(this._text[index])) {\n while (this._reSpace.test(this._text[index])) {\n offset++;\n index--;\n }\n }\n while (/\\S/.test(this._text[index]) && index > -1) {\n offset++;\n index--;\n }\n\n return startFrom - offset;\n },\n\n /**\n * Find new selection index representing end of current word according to current selection index\n * @param {Number} startFrom Current selection index\n * @return {Number} New selection index\n */\n findWordBoundaryRight: function(startFrom) {\n var offset = 0, index = startFrom;\n\n // remove space after cursor first\n if (this._reSpace.test(this._text[index])) {\n while (this._reSpace.test(this._text[index])) {\n offset++;\n index++;\n }\n }\n while (/\\S/.test(this._text[index]) && index < this._text.length) {\n offset++;\n index++;\n }\n\n return startFrom + offset;\n },\n\n /**\n * Find new selection index representing start of current line according to current selection index\n * @param {Number} startFrom Current selection index\n * @return {Number} New selection index\n */\n findLineBoundaryLeft: function(startFrom) {\n var offset = 0, index = startFrom - 1;\n\n while (!/\\n/.test(this._text[index]) && index > -1) {\n offset++;\n index--;\n }\n\n return startFrom - offset;\n },\n\n /**\n * Find new selection index representing end of current line according to current selection index\n * @param {Number} startFrom Current selection index\n * @return {Number} New selection index\n */\n findLineBoundaryRight: function(startFrom) {\n var offset = 0, index = startFrom;\n\n while (!/\\n/.test(this._text[index]) && index < this._text.length) {\n offset++;\n index++;\n }\n\n return startFrom + offset;\n },\n\n /**\n * Finds index corresponding to beginning or end of a word\n * @param {Number} selectionStart Index of a character\n * @param {Number} direction 1 or -1\n * @return {Number} Index of the beginning or end of a word\n */\n searchWordBoundary: function(selectionStart, direction) {\n var text = this._text,\n index = this._reSpace.test(text[selectionStart]) ? selectionStart - 1 : selectionStart,\n _char = text[index],\n // wrong\n reNonWord = fabric.reNonWord;\n\n while (!reNonWord.test(_char) && index > 0 && index < text.length) {\n index += direction;\n _char = text[index];\n }\n if (reNonWord.test(_char)) {\n index += direction === 1 ? 0 : 1;\n }\n return index;\n },\n\n /**\n * Selects a word based on the index\n * @param {Number} selectionStart Index of a character\n */\n selectWord: function(selectionStart) {\n selectionStart = selectionStart || this.selectionStart;\n var newSelectionStart = this.searchWordBoundary(selectionStart, -1), /* search backwards */\n newSelectionEnd = this.searchWordBoundary(selectionStart, 1); /* search forward */\n\n this.selectionStart = newSelectionStart;\n this.selectionEnd = newSelectionEnd;\n this._fireSelectionChanged();\n this._updateTextarea();\n this.renderCursorOrSelection();\n },\n\n /**\n * Selects a line based on the index\n * @param {Number} selectionStart Index of a character\n * @return {fabric.IText} thisArg\n * @chainable\n */\n selectLine: function(selectionStart) {\n selectionStart = selectionStart || this.selectionStart;\n var newSelectionStart = this.findLineBoundaryLeft(selectionStart),\n newSelectionEnd = this.findLineBoundaryRight(selectionStart);\n\n this.selectionStart = newSelectionStart;\n this.selectionEnd = newSelectionEnd;\n this._fireSelectionChanged();\n this._updateTextarea();\n return this;\n },\n\n /**\n * Enters editing state\n * @return {fabric.IText} thisArg\n * @chainable\n */\n enterEditing: function(e) {\n if (this.isEditing || !this.editable) {\n return;\n }\n\n if (this.canvas) {\n this.canvas.calcOffset();\n this.exitEditingOnOthers(this.canvas);\n }\n\n this.isEditing = true;\n\n this.initHiddenTextarea(e);\n this.hiddenTextarea.focus();\n this.hiddenTextarea.value = this.text;\n this._updateTextarea();\n this._saveEditingProps();\n this._setEditingProps();\n this._textBeforeEdit = this.text;\n\n this._tick();\n this.fire('editing:entered');\n this._fireSelectionChanged();\n if (!this.canvas) {\n return this;\n }\n this.canvas.fire('text:editing:entered', { target: this });\n this.initMouseMoveHandler();\n this.canvas.requestRenderAll();\n return this;\n },\n\n exitEditingOnOthers: function(canvas) {\n if (canvas._iTextInstances) {\n canvas._iTextInstances.forEach(function(obj) {\n obj.selected = false;\n if (obj.isEditing) {\n obj.exitEditing();\n }\n });\n }\n },\n\n /**\n * Initializes \"mousemove\" event handler\n */\n initMouseMoveHandler: function() {\n this.canvas.on('mouse:move', this.mouseMoveHandler);\n },\n\n /**\n * @private\n */\n mouseMoveHandler: function(options) {\n if (!this.__isMousedown || !this.isEditing) {\n return;\n }\n\n // regain focus\n document.activeElement !== this.hiddenTextarea && this.hiddenTextarea.focus();\n\n var newSelectionStart = this.getSelectionStartFromPointer(options.e),\n currentStart = this.selectionStart,\n currentEnd = this.selectionEnd;\n if (\n (newSelectionStart !== this.__selectionStartOnMouseDown || currentStart === currentEnd)\n &&\n (currentStart === newSelectionStart || currentEnd === newSelectionStart)\n ) {\n return;\n }\n if (newSelectionStart > this.__selectionStartOnMouseDown) {\n this.selectionStart = this.__selectionStartOnMouseDown;\n this.selectionEnd = newSelectionStart;\n }\n else {\n this.selectionStart = newSelectionStart;\n this.selectionEnd = this.__selectionStartOnMouseDown;\n }\n if (this.selectionStart !== currentStart || this.selectionEnd !== currentEnd) {\n this.restartCursorIfNeeded();\n this._fireSelectionChanged();\n this._updateTextarea();\n this.renderCursorOrSelection();\n }\n },\n\n /**\n * @private\n */\n _setEditingProps: function() {\n this.hoverCursor = 'text';\n\n if (this.canvas) {\n this.canvas.defaultCursor = this.canvas.moveCursor = 'text';\n }\n\n this.borderColor = this.editingBorderColor;\n this.hasControls = this.selectable = false;\n this.lockMovementX = this.lockMovementY = true;\n },\n\n /**\n * convert from textarea to grapheme indexes\n */\n fromStringToGraphemeSelection: function(start, end, text) {\n var smallerTextStart = text.slice(0, start),\n graphemeStart = fabric.util.string.graphemeSplit(smallerTextStart).length;\n if (start === end) {\n return { selectionStart: graphemeStart, selectionEnd: graphemeStart };\n }\n var smallerTextEnd = text.slice(start, end),\n graphemeEnd = fabric.util.string.graphemeSplit(smallerTextEnd).length;\n return { selectionStart: graphemeStart, selectionEnd: graphemeStart + graphemeEnd };\n },\n\n /**\n * convert from fabric to textarea values\n */\n fromGraphemeToStringSelection: function(start, end, _text) {\n var smallerTextStart = _text.slice(0, start),\n graphemeStart = smallerTextStart.join('').length;\n if (start === end) {\n return { selectionStart: graphemeStart, selectionEnd: graphemeStart };\n }\n var smallerTextEnd = _text.slice(start, end),\n graphemeEnd = smallerTextEnd.join('').length;\n return { selectionStart: graphemeStart, selectionEnd: graphemeStart + graphemeEnd };\n },\n\n /**\n * @private\n */\n _updateTextarea: function() {\n this.cursorOffsetCache = { };\n if (!this.hiddenTextarea) {\n return;\n }\n if (!this.inCompositionMode) {\n var newSelection = this.fromGraphemeToStringSelection(this.selectionStart, this.selectionEnd, this._text);\n this.hiddenTextarea.selectionStart = newSelection.selectionStart;\n this.hiddenTextarea.selectionEnd = newSelection.selectionEnd;\n }\n this.updateTextareaPosition();\n },\n\n /**\n * @private\n */\n updateFromTextArea: function() {\n if (!this.hiddenTextarea) {\n return;\n }\n this.cursorOffsetCache = { };\n this.text = this.hiddenTextarea.value;\n if (this._shouldClearDimensionCache()) {\n this.initDimensions();\n this.setCoords();\n }\n var newSelection = this.fromStringToGraphemeSelection(\n this.hiddenTextarea.selectionStart, this.hiddenTextarea.selectionEnd, this.hiddenTextarea.value);\n this.selectionEnd = this.selectionStart = newSelection.selectionEnd;\n if (!this.inCompositionMode) {\n this.selectionStart = newSelection.selectionStart;\n }\n this.updateTextareaPosition();\n },\n\n /**\n * @private\n */\n updateTextareaPosition: function() {\n if (this.selectionStart === this.selectionEnd) {\n var style = this._calcTextareaPosition();\n this.hiddenTextarea.style.left = style.left;\n this.hiddenTextarea.style.top = style.top;\n }\n },\n\n /**\n * @private\n * @return {Object} style contains style for hiddenTextarea\n */\n _calcTextareaPosition: function() {\n if (!this.canvas) {\n return { x: 1, y: 1 };\n }\n var desiredPosition = this.inCompositionMode ? this.compositionStart : this.selectionStart,\n boundaries = this._getCursorBoundaries(desiredPosition),\n cursorLocation = this.get2DCursorLocation(desiredPosition),\n lineIndex = cursorLocation.lineIndex,\n charIndex = cursorLocation.charIndex,\n charHeight = this.getValueOfPropertyAt(lineIndex, charIndex, 'fontSize') * this.lineHeight,\n leftOffset = boundaries.leftOffset,\n m = this.calcTransformMatrix(),\n p = {\n x: boundaries.left + leftOffset,\n y: boundaries.top + boundaries.topOffset + charHeight\n },\n retinaScaling = this.canvas.getRetinaScaling(),\n upperCanvas = this.canvas.upperCanvasEl,\n upperCanvasWidth = upperCanvas.width / retinaScaling,\n upperCanvasHeight = upperCanvas.height / retinaScaling,\n maxWidth = upperCanvasWidth - charHeight,\n maxHeight = upperCanvasHeight - charHeight,\n scaleX = upperCanvas.clientWidth / upperCanvasWidth,\n scaleY = upperCanvas.clientHeight / upperCanvasHeight;\n\n p = fabric.util.transformPoint(p, m);\n p = fabric.util.transformPoint(p, this.canvas.viewportTransform);\n p.x *= scaleX;\n p.y *= scaleY;\n if (p.x < 0) {\n p.x = 0;\n }\n if (p.x > maxWidth) {\n p.x = maxWidth;\n }\n if (p.y < 0) {\n p.y = 0;\n }\n if (p.y > maxHeight) {\n p.y = maxHeight;\n }\n\n // add canvas offset on document\n p.x += this.canvas._offset.left;\n p.y += this.canvas._offset.top;\n\n return { left: p.x + 'px', top: p.y + 'px', fontSize: charHeight + 'px', charHeight: charHeight };\n },\n\n /**\n * @private\n */\n _saveEditingProps: function() {\n this._savedProps = {\n hasControls: this.hasControls,\n borderColor: this.borderColor,\n lockMovementX: this.lockMovementX,\n lockMovementY: this.lockMovementY,\n hoverCursor: this.hoverCursor,\n selectable: this.selectable,\n defaultCursor: this.canvas && this.canvas.defaultCursor,\n moveCursor: this.canvas && this.canvas.moveCursor\n };\n },\n\n /**\n * @private\n */\n _restoreEditingProps: function() {\n if (!this._savedProps) {\n return;\n }\n\n this.hoverCursor = this._savedProps.hoverCursor;\n this.hasControls = this._savedProps.hasControls;\n this.borderColor = this._savedProps.borderColor;\n this.selectable = this._savedProps.selectable;\n this.lockMovementX = this._savedProps.lockMovementX;\n this.lockMovementY = this._savedProps.lockMovementY;\n\n if (this.canvas) {\n this.canvas.defaultCursor = this._savedProps.defaultCursor;\n this.canvas.moveCursor = this._savedProps.moveCursor;\n }\n },\n\n /**\n * Exits from editing state\n * @return {fabric.IText} thisArg\n * @chainable\n */\n exitEditing: function() {\n var isTextChanged = (this._textBeforeEdit !== this.text);\n var hiddenTextarea = this.hiddenTextarea;\n this.selected = false;\n this.isEditing = false;\n\n this.selectionEnd = this.selectionStart;\n\n if (hiddenTextarea) {\n hiddenTextarea.blur && hiddenTextarea.blur();\n hiddenTextarea.parentNode && hiddenTextarea.parentNode.removeChild(hiddenTextarea);\n }\n this.hiddenTextarea = null;\n this.abortCursorAnimation();\n this._restoreEditingProps();\n this._currentCursorOpacity = 0;\n if (this._shouldClearDimensionCache()) {\n this.initDimensions();\n this.setCoords();\n }\n this.fire('editing:exited');\n isTextChanged && this.fire('modified');\n if (this.canvas) {\n this.canvas.off('mouse:move', this.mouseMoveHandler);\n this.canvas.fire('text:editing:exited', { target: this });\n isTextChanged && this.canvas.fire('object:modified', { target: this });\n }\n return this;\n },\n\n /**\n * @private\n */\n _removeExtraneousStyles: function() {\n for (var prop in this.styles) {\n if (!this._textLines[prop]) {\n delete this.styles[prop];\n }\n }\n },\n\n /**\n * remove and reflow a style block from start to end.\n * @param {Number} start linear start position for removal (included in removal)\n * @param {Number} end linear end position for removal ( excluded from removal )\n */\n removeStyleFromTo: function(start, end) {\n var cursorStart = this.get2DCursorLocation(start, true),\n cursorEnd = this.get2DCursorLocation(end, true),\n lineStart = cursorStart.lineIndex,\n charStart = cursorStart.charIndex,\n lineEnd = cursorEnd.lineIndex,\n charEnd = cursorEnd.charIndex,\n i, styleObj;\n if (lineStart !== lineEnd) {\n // step1 remove the trailing of lineStart\n if (this.styles[lineStart]) {\n for (i = charStart; i < this._unwrappedTextLines[lineStart].length; i++) {\n delete this.styles[lineStart][i];\n }\n }\n // step2 move the trailing of lineEnd to lineStart if needed\n if (this.styles[lineEnd]) {\n for (i = charEnd; i < this._unwrappedTextLines[lineEnd].length; i++) {\n styleObj = this.styles[lineEnd][i];\n if (styleObj) {\n this.styles[lineStart] || (this.styles[lineStart] = { });\n this.styles[lineStart][charStart + i - charEnd] = styleObj;\n }\n }\n }\n // step3 detects lines will be completely removed.\n for (i = lineStart + 1; i <= lineEnd; i++) {\n delete this.styles[i];\n }\n // step4 shift remaining lines.\n this.shiftLineStyles(lineEnd, lineStart - lineEnd);\n }\n else {\n // remove and shift left on the same line\n if (this.styles[lineStart]) {\n styleObj = this.styles[lineStart];\n var diff = charEnd - charStart, numericChar, _char;\n for (i = charStart; i < charEnd; i++) {\n delete styleObj[i];\n }\n for (_char in this.styles[lineStart]) {\n numericChar = parseInt(_char, 10);\n if (numericChar >= charEnd) {\n styleObj[numericChar - diff] = styleObj[_char];\n delete styleObj[_char];\n }\n }\n }\n }\n },\n\n /**\n * Shifts line styles up or down\n * @param {Number} lineIndex Index of a line\n * @param {Number} offset Can any number?\n */\n shiftLineStyles: function(lineIndex, offset) {\n // shift all line styles by offset upward or downward\n // do not clone deep. we need new array, not new style objects\n var clonedStyles = clone(this.styles);\n for (var line in this.styles) {\n var numericLine = parseInt(line, 10);\n if (numericLine > lineIndex) {\n this.styles[numericLine + offset] = clonedStyles[numericLine];\n if (!clonedStyles[numericLine - offset]) {\n delete this.styles[numericLine];\n }\n }\n }\n },\n\n restartCursorIfNeeded: function() {\n if (!this._currentTickState || this._currentTickState.isAborted\n || !this._currentTickCompleteState || this._currentTickCompleteState.isAborted\n ) {\n this.initDelayedCursor();\n }\n },\n\n /**\n * Handle insertion of more consecutive style lines for when one or more\n * newlines gets added to the text. Since current style needs to be shifted\n * first we shift the current style of the number lines needed, then we add\n * new lines from the last to the first.\n * @param {Number} lineIndex Index of a line\n * @param {Number} charIndex Index of a char\n * @param {Number} qty number of lines to add\n * @param {Array} copiedStyle Array of objects styles\n */\n insertNewlineStyleObject: function(lineIndex, charIndex, qty, copiedStyle) {\n var currentCharStyle,\n newLineStyles = {},\n somethingAdded = false,\n isEndOfLine = this._unwrappedTextLines[lineIndex].length === charIndex;\n\n qty || (qty = 1);\n this.shiftLineStyles(lineIndex, qty);\n if (this.styles[lineIndex]) {\n currentCharStyle = this.styles[lineIndex][charIndex === 0 ? charIndex : charIndex - 1];\n }\n // we clone styles of all chars\n // after cursor onto the current line\n for (var index in this.styles[lineIndex]) {\n var numIndex = parseInt(index, 10);\n if (numIndex >= charIndex) {\n somethingAdded = true;\n newLineStyles[numIndex - charIndex] = this.styles[lineIndex][index];\n // remove lines from the previous line since they're on a new line now\n if (!(isEndOfLine && charIndex === 0)) {\n delete this.styles[lineIndex][index];\n }\n }\n }\n var styleCarriedOver = false;\n if (somethingAdded && !isEndOfLine) {\n // if is end of line, the extra style we copied\n // is probably not something we want\n this.styles[lineIndex + qty] = newLineStyles;\n styleCarriedOver = true;\n }\n if (styleCarriedOver) {\n // skip the last line of since we already prepared it.\n qty--;\n }\n // for the all the lines or all the other lines\n // we clone current char style onto the next (otherwise empty) line\n while (qty > 0) {\n if (copiedStyle && copiedStyle[qty - 1]) {\n this.styles[lineIndex + qty] = { 0: clone(copiedStyle[qty - 1]) };\n }\n else if (currentCharStyle) {\n this.styles[lineIndex + qty] = { 0: clone(currentCharStyle) };\n }\n else {\n delete this.styles[lineIndex + qty];\n }\n qty--;\n }\n this._forceClearCache = true;\n },\n\n /**\n * Inserts style object for a given line/char index\n * @param {Number} lineIndex Index of a line\n * @param {Number} charIndex Index of a char\n * @param {Number} quantity number Style object to insert, if given\n * @param {Array} copiedStyle array of style objects\n */\n insertCharStyleObject: function(lineIndex, charIndex, quantity, copiedStyle) {\n if (!this.styles) {\n this.styles = {};\n }\n var currentLineStyles = this.styles[lineIndex],\n currentLineStylesCloned = currentLineStyles ? clone(currentLineStyles) : {};\n\n quantity || (quantity = 1);\n // shift all char styles by quantity forward\n // 0,1,2,3 -> (charIndex=2) -> 0,1,3,4 -> (insert 2) -> 0,1,2,3,4\n for (var index in currentLineStylesCloned) {\n var numericIndex = parseInt(index, 10);\n if (numericIndex >= charIndex) {\n currentLineStyles[numericIndex + quantity] = currentLineStylesCloned[numericIndex];\n // only delete the style if there was nothing moved there\n if (!currentLineStylesCloned[numericIndex - quantity]) {\n delete currentLineStyles[numericIndex];\n }\n }\n }\n this._forceClearCache = true;\n if (copiedStyle) {\n while (quantity--) {\n if (!Object.keys(copiedStyle[quantity]).length) {\n continue;\n }\n if (!this.styles[lineIndex]) {\n this.styles[lineIndex] = {};\n }\n this.styles[lineIndex][charIndex + quantity] = clone(copiedStyle[quantity]);\n }\n return;\n }\n if (!currentLineStyles) {\n return;\n }\n var newStyle = currentLineStyles[charIndex ? charIndex - 1 : 1];\n while (newStyle && quantity--) {\n this.styles[lineIndex][charIndex + quantity] = clone(newStyle);\n }\n },\n\n /**\n * Inserts style object(s)\n * @param {Array} insertedText Characters at the location where style is inserted\n * @param {Number} start cursor index for inserting style\n * @param {Array} [copiedStyle] array of style objects to insert.\n */\n insertNewStyleBlock: function(insertedText, start, copiedStyle) {\n var cursorLoc = this.get2DCursorLocation(start, true),\n addedLines = [0], linesLength = 0;\n // get an array of how many char per lines are being added.\n for (var i = 0; i < insertedText.length; i++) {\n if (insertedText[i] === '\\n') {\n linesLength++;\n addedLines[linesLength] = 0;\n }\n else {\n addedLines[linesLength]++;\n }\n }\n // for the first line copy the style from the current char position.\n if (addedLines[0] > 0) {\n this.insertCharStyleObject(cursorLoc.lineIndex, cursorLoc.charIndex, addedLines[0], copiedStyle);\n copiedStyle = copiedStyle && copiedStyle.slice(addedLines[0] + 1);\n }\n linesLength && this.insertNewlineStyleObject(\n cursorLoc.lineIndex, cursorLoc.charIndex + addedLines[0], linesLength);\n for (var i = 1; i < linesLength; i++) {\n if (addedLines[i] > 0) {\n this.insertCharStyleObject(cursorLoc.lineIndex + i, 0, addedLines[i], copiedStyle);\n }\n else if (copiedStyle) {\n // this test is required in order to close #6841\n // when a pasted buffer begins with a newline then\n // this.styles[cursorLoc.lineIndex + i] and copiedStyle[0]\n // may be undefined for some reason\n if (this.styles[cursorLoc.lineIndex + i] && copiedStyle[0]) {\n this.styles[cursorLoc.lineIndex + i][0] = copiedStyle[0];\n }\n }\n copiedStyle = copiedStyle && copiedStyle.slice(addedLines[i] + 1);\n }\n // we use i outside the loop to get it like linesLength\n if (addedLines[i] > 0) {\n this.insertCharStyleObject(cursorLoc.lineIndex + i, 0, addedLines[i], copiedStyle);\n }\n },\n\n /**\n * Set the selectionStart and selectionEnd according to the new position of cursor\n * mimic the key - mouse navigation when shift is pressed.\n */\n setSelectionStartEndWithShift: function(start, end, newSelection) {\n if (newSelection <= start) {\n if (end === start) {\n this._selectionDirection = 'left';\n }\n else if (this._selectionDirection === 'right') {\n this._selectionDirection = 'left';\n this.selectionEnd = start;\n }\n this.selectionStart = newSelection;\n }\n else if (newSelection > start && newSelection < end) {\n if (this._selectionDirection === 'right') {\n this.selectionEnd = newSelection;\n }\n else {\n this.selectionStart = newSelection;\n }\n }\n else {\n // newSelection is > selection start and end\n if (end === start) {\n this._selectionDirection = 'right';\n }\n else if (this._selectionDirection === 'left') {\n this._selectionDirection = 'right';\n this.selectionStart = end;\n }\n this.selectionEnd = newSelection;\n }\n },\n\n setSelectionInBoundaries: function() {\n var length = this.text.length;\n if (this.selectionStart > length) {\n this.selectionStart = length;\n }\n else if (this.selectionStart < 0) {\n this.selectionStart = 0;\n }\n if (this.selectionEnd > length) {\n this.selectionEnd = length;\n }\n else if (this.selectionEnd < 0) {\n this.selectionEnd = 0;\n }\n }\n });\n})();\n\n\nfabric.util.object.extend(fabric.IText.prototype, /** @lends fabric.IText.prototype */ {\n /**\n * Initializes \"dbclick\" event handler\n */\n initDoubleClickSimulation: function() {\n\n // for double click\n this.__lastClickTime = +new Date();\n\n // for triple click\n this.__lastLastClickTime = +new Date();\n\n this.__lastPointer = { };\n\n this.on('mousedown', this.onMouseDown);\n },\n\n /**\n * Default event handler to simulate triple click\n * @private\n */\n onMouseDown: function(options) {\n if (!this.canvas) {\n return;\n }\n this.__newClickTime = +new Date();\n var newPointer = options.pointer;\n if (this.isTripleClick(newPointer)) {\n this.fire('tripleclick', options);\n this._stopEvent(options.e);\n }\n this.__lastLastClickTime = this.__lastClickTime;\n this.__lastClickTime = this.__newClickTime;\n this.__lastPointer = newPointer;\n this.__lastIsEditing = this.isEditing;\n this.__lastSelected = this.selected;\n },\n\n isTripleClick: function(newPointer) {\n return this.__newClickTime - this.__lastClickTime < 500 &&\n this.__lastClickTime - this.__lastLastClickTime < 500 &&\n this.__lastPointer.x === newPointer.x &&\n this.__lastPointer.y === newPointer.y;\n },\n\n /**\n * @private\n */\n _stopEvent: function(e) {\n e.preventDefault && e.preventDefault();\n e.stopPropagation && e.stopPropagation();\n },\n\n /**\n * Initializes event handlers related to cursor or selection\n */\n initCursorSelectionHandlers: function() {\n this.initMousedownHandler();\n this.initMouseupHandler();\n this.initClicks();\n },\n\n /**\n * Default handler for double click, select a word\n */\n doubleClickHandler: function(options) {\n if (!this.isEditing) {\n return;\n }\n this.selectWord(this.getSelectionStartFromPointer(options.e));\n },\n\n /**\n * Default handler for triple click, select a line\n */\n tripleClickHandler: function(options) {\n if (!this.isEditing) {\n return;\n }\n this.selectLine(this.getSelectionStartFromPointer(options.e));\n },\n\n /**\n * Initializes double and triple click event handlers\n */\n initClicks: function() {\n this.on('mousedblclick', this.doubleClickHandler);\n this.on('tripleclick', this.tripleClickHandler);\n },\n\n /**\n * Default event handler for the basic functionalities needed on _mouseDown\n * can be overridden to do something different.\n * Scope of this implementation is: find the click position, set selectionStart\n * find selectionEnd, initialize the drawing of either cursor or selection area\n * initializing a mousedDown on a text area will cancel fabricjs knowledge of\n * current compositionMode. It will be set to false.\n */\n _mouseDownHandler: function(options) {\n if (!this.canvas || !this.editable || (options.e.button && options.e.button !== 1)) {\n return;\n }\n\n this.__isMousedown = true;\n\n if (this.selected) {\n this.inCompositionMode = false;\n this.setCursorByClick(options.e);\n }\n\n if (this.isEditing) {\n this.__selectionStartOnMouseDown = this.selectionStart;\n if (this.selectionStart === this.selectionEnd) {\n this.abortCursorAnimation();\n }\n this.renderCursorOrSelection();\n }\n },\n\n /**\n * Default event handler for the basic functionalities needed on mousedown:before\n * can be overridden to do something different.\n * Scope of this implementation is: verify the object is already selected when mousing down\n */\n _mouseDownHandlerBefore: function(options) {\n if (!this.canvas || !this.editable || (options.e.button && options.e.button !== 1)) {\n return;\n }\n // we want to avoid that an object that was selected and then becomes unselectable,\n // may trigger editing mode in some way.\n this.selected = this === this.canvas._activeObject;\n },\n\n /**\n * Initializes \"mousedown\" event handler\n */\n initMousedownHandler: function() {\n this.on('mousedown', this._mouseDownHandler);\n this.on('mousedown:before', this._mouseDownHandlerBefore);\n },\n\n /**\n * Initializes \"mouseup\" event handler\n */\n initMouseupHandler: function() {\n this.on('mouseup', this.mouseUpHandler);\n },\n\n /**\n * standard handler for mouse up, overridable\n * @private\n */\n mouseUpHandler: function(options) {\n this.__isMousedown = false;\n if (!this.editable || this.group ||\n (options.transform && options.transform.actionPerformed) ||\n (options.e.button && options.e.button !== 1)) {\n return;\n }\n\n if (this.canvas) {\n var currentActive = this.canvas._activeObject;\n if (currentActive && currentActive !== this) {\n // avoid running this logic when there is an active object\n // this because is possible with shift click and fast clicks,\n // to rapidly deselect and reselect this object and trigger an enterEdit\n return;\n }\n }\n\n if (this.__lastSelected && !this.__corner) {\n this.selected = false;\n this.__lastSelected = false;\n this.enterEditing(options.e);\n if (this.selectionStart === this.selectionEnd) {\n this.initDelayedCursor(true);\n }\n else {\n this.renderCursorOrSelection();\n }\n }\n else {\n this.selected = true;\n }\n },\n\n /**\n * Changes cursor location in a text depending on passed pointer (x/y) object\n * @param {Event} e Event object\n */\n setCursorByClick: function(e) {\n var newSelection = this.getSelectionStartFromPointer(e),\n start = this.selectionStart, end = this.selectionEnd;\n if (e.shiftKey) {\n this.setSelectionStartEndWithShift(start, end, newSelection);\n }\n else {\n this.selectionStart = newSelection;\n this.selectionEnd = newSelection;\n }\n if (this.isEditing) {\n this._fireSelectionChanged();\n this._updateTextarea();\n }\n },\n\n /**\n * Returns index of a character corresponding to where an object was clicked\n * @param {Event} e Event object\n * @return {Number} Index of a character\n */\n getSelectionStartFromPointer: function(e) {\n var mouseOffset = this.getLocalPointer(e),\n prevWidth = 0,\n width = 0,\n height = 0,\n charIndex = 0,\n lineIndex = 0,\n lineLeftOffset,\n line;\n for (var i = 0, len = this._textLines.length; i < len; i++) {\n if (height <= mouseOffset.y) {\n height += this.getHeightOfLine(i) * this.scaleY;\n lineIndex = i;\n if (i > 0) {\n charIndex += this._textLines[i - 1].length + this.missingNewlineOffset(i - 1);\n }\n }\n else {\n break;\n }\n }\n lineLeftOffset = this._getLineLeftOffset(lineIndex);\n width = lineLeftOffset * this.scaleX;\n line = this._textLines[lineIndex];\n // handling of RTL: in order to get things work correctly,\n // we assume RTL writing is mirrored compared to LTR writing.\n // so in position detection we mirror the X offset, and when is time\n // of rendering it, we mirror it again.\n if (this.direction === 'rtl') {\n mouseOffset.x = this.width * this.scaleX - mouseOffset.x + width;\n }\n for (var j = 0, jlen = line.length; j < jlen; j++) {\n prevWidth = width;\n // i removed something about flipX here, check.\n width += this.__charBounds[lineIndex][j].kernedWidth * this.scaleX;\n if (width <= mouseOffset.x) {\n charIndex++;\n }\n else {\n break;\n }\n }\n return this._getNewSelectionStartFromOffset(mouseOffset, prevWidth, width, charIndex, jlen);\n },\n\n /**\n * @private\n */\n _getNewSelectionStartFromOffset: function(mouseOffset, prevWidth, width, index, jlen) {\n // we need Math.abs because when width is after the last char, the offset is given as 1, while is 0\n var distanceBtwLastCharAndCursor = mouseOffset.x - prevWidth,\n distanceBtwNextCharAndCursor = width - mouseOffset.x,\n offset = distanceBtwNextCharAndCursor > distanceBtwLastCharAndCursor ||\n distanceBtwNextCharAndCursor < 0 ? 0 : 1,\n newSelectionStart = index + offset;\n // if object is horizontally flipped, mirror cursor location from the end\n if (this.flipX) {\n newSelectionStart = jlen - newSelectionStart;\n }\n\n if (newSelectionStart > this._text.length) {\n newSelectionStart = this._text.length;\n }\n\n return newSelectionStart;\n }\n});\n\n\nfabric.util.object.extend(fabric.IText.prototype, /** @lends fabric.IText.prototype */ {\n\n /**\n * Initializes hidden textarea (needed to bring up keyboard in iOS)\n */\n initHiddenTextarea: function() {\n this.hiddenTextarea = fabric.document.createElement('textarea');\n this.hiddenTextarea.setAttribute('autocapitalize', 'off');\n this.hiddenTextarea.setAttribute('autocorrect', 'off');\n this.hiddenTextarea.setAttribute('autocomplete', 'off');\n this.hiddenTextarea.setAttribute('spellcheck', 'false');\n this.hiddenTextarea.setAttribute('data-fabric-hiddentextarea', '');\n this.hiddenTextarea.setAttribute('wrap', 'off');\n var style = this._calcTextareaPosition();\n // line-height: 1px; was removed from the style to fix this:\n // https://bugs.chromium.org/p/chromium/issues/detail?id=870966\n this.hiddenTextarea.style.cssText = 'position: absolute; top: ' + style.top +\n '; left: ' + style.left + '; z-index: -999; opacity: 0; width: 1px; height: 1px; font-size: 1px;' +\n ' padding-top: ' + style.fontSize + ';';\n\n if (this.hiddenTextareaContainer) {\n this.hiddenTextareaContainer.appendChild(this.hiddenTextarea);\n }\n else {\n fabric.document.body.appendChild(this.hiddenTextarea);\n }\n\n fabric.util.addListener(this.hiddenTextarea, 'keydown', this.onKeyDown.bind(this));\n fabric.util.addListener(this.hiddenTextarea, 'keyup', this.onKeyUp.bind(this));\n fabric.util.addListener(this.hiddenTextarea, 'input', this.onInput.bind(this));\n fabric.util.addListener(this.hiddenTextarea, 'copy', this.copy.bind(this));\n fabric.util.addListener(this.hiddenTextarea, 'cut', this.copy.bind(this));\n fabric.util.addListener(this.hiddenTextarea, 'paste', this.paste.bind(this));\n fabric.util.addListener(this.hiddenTextarea, 'compositionstart', this.onCompositionStart.bind(this));\n fabric.util.addListener(this.hiddenTextarea, 'compositionupdate', this.onCompositionUpdate.bind(this));\n fabric.util.addListener(this.hiddenTextarea, 'compositionend', this.onCompositionEnd.bind(this));\n\n if (!this._clickHandlerInitialized && this.canvas) {\n fabric.util.addListener(this.canvas.upperCanvasEl, 'click', this.onClick.bind(this));\n this._clickHandlerInitialized = true;\n }\n },\n\n /**\n * For functionalities on keyDown\n * Map a special key to a function of the instance/prototype\n * If you need different behaviour for ESC or TAB or arrows, you have to change\n * this map setting the name of a function that you build on the fabric.Itext or\n * your prototype.\n * the map change will affect all Instances unless you need for only some text Instances\n * in that case you have to clone this object and assign your Instance.\n * this.keysMap = fabric.util.object.clone(this.keysMap);\n * The function must be in fabric.Itext.prototype.myFunction And will receive event as args[0]\n */\n keysMap: {\n 9: 'exitEditing',\n 27: 'exitEditing',\n 33: 'moveCursorUp',\n 34: 'moveCursorDown',\n 35: 'moveCursorRight',\n 36: 'moveCursorLeft',\n 37: 'moveCursorLeft',\n 38: 'moveCursorUp',\n 39: 'moveCursorRight',\n 40: 'moveCursorDown',\n },\n\n keysMapRtl: {\n 9: 'exitEditing',\n 27: 'exitEditing',\n 33: 'moveCursorUp',\n 34: 'moveCursorDown',\n 35: 'moveCursorLeft',\n 36: 'moveCursorRight',\n 37: 'moveCursorRight',\n 38: 'moveCursorUp',\n 39: 'moveCursorLeft',\n 40: 'moveCursorDown',\n },\n\n /**\n * For functionalities on keyUp + ctrl || cmd\n */\n ctrlKeysMapUp: {\n 67: 'copy',\n 88: 'cut'\n },\n\n /**\n * For functionalities on keyDown + ctrl || cmd\n */\n ctrlKeysMapDown: {\n 65: 'selectAll'\n },\n\n onClick: function() {\n // No need to trigger click event here, focus is enough to have the keyboard appear on Android\n this.hiddenTextarea && this.hiddenTextarea.focus();\n },\n\n /**\n * Handles keydown event\n * only used for arrows and combination of modifier keys.\n * @param {Event} e Event object\n */\n onKeyDown: function(e) {\n if (!this.isEditing) {\n return;\n }\n var keyMap = this.direction === 'rtl' ? this.keysMapRtl : this.keysMap;\n if (e.keyCode in keyMap) {\n this[keyMap[e.keyCode]](e);\n }\n else if ((e.keyCode in this.ctrlKeysMapDown) && (e.ctrlKey || e.metaKey)) {\n this[this.ctrlKeysMapDown[e.keyCode]](e);\n }\n else {\n return;\n }\n e.stopImmediatePropagation();\n e.preventDefault();\n if (e.keyCode >= 33 && e.keyCode <= 40) {\n // if i press an arrow key just update selection\n this.inCompositionMode = false;\n this.clearContextTop();\n this.renderCursorOrSelection();\n }\n else {\n this.canvas && this.canvas.requestRenderAll();\n }\n },\n\n /**\n * Handles keyup event\n * We handle KeyUp because ie11 and edge have difficulties copy/pasting\n * if a copy/cut event fired, keyup is dismissed\n * @param {Event} e Event object\n */\n onKeyUp: function(e) {\n if (!this.isEditing || this._copyDone || this.inCompositionMode) {\n this._copyDone = false;\n return;\n }\n if ((e.keyCode in this.ctrlKeysMapUp) && (e.ctrlKey || e.metaKey)) {\n this[this.ctrlKeysMapUp[e.keyCode]](e);\n }\n else {\n return;\n }\n e.stopImmediatePropagation();\n e.preventDefault();\n this.canvas && this.canvas.requestRenderAll();\n },\n\n /**\n * Handles onInput event\n * @param {Event} e Event object\n */\n onInput: function(e) {\n var fromPaste = this.fromPaste;\n this.fromPaste = false;\n e && e.stopPropagation();\n if (!this.isEditing) {\n return;\n }\n // decisions about style changes.\n var nextText = this._splitTextIntoLines(this.hiddenTextarea.value).graphemeText,\n charCount = this._text.length,\n nextCharCount = nextText.length,\n removedText, insertedText,\n charDiff = nextCharCount - charCount,\n selectionStart = this.selectionStart, selectionEnd = this.selectionEnd,\n selection = selectionStart !== selectionEnd,\n copiedStyle, removeFrom, removeTo;\n if (this.hiddenTextarea.value === '') {\n this.styles = { };\n this.updateFromTextArea();\n this.fire('changed');\n if (this.canvas) {\n this.canvas.fire('text:changed', { target: this });\n this.canvas.requestRenderAll();\n }\n return;\n }\n\n var textareaSelection = this.fromStringToGraphemeSelection(\n this.hiddenTextarea.selectionStart,\n this.hiddenTextarea.selectionEnd,\n this.hiddenTextarea.value\n );\n var backDelete = selectionStart > textareaSelection.selectionStart;\n\n if (selection) {\n removedText = this._text.slice(selectionStart, selectionEnd);\n charDiff += selectionEnd - selectionStart;\n }\n else if (nextCharCount < charCount) {\n if (backDelete) {\n removedText = this._text.slice(selectionEnd + charDiff, selectionEnd);\n }\n else {\n removedText = this._text.slice(selectionStart, selectionStart - charDiff);\n }\n }\n insertedText = nextText.slice(textareaSelection.selectionEnd - charDiff, textareaSelection.selectionEnd);\n if (removedText && removedText.length) {\n if (insertedText.length) {\n // let's copy some style before deleting.\n // we want to copy the style before the cursor OR the style at the cursor if selection\n // is bigger than 0.\n copiedStyle = this.getSelectionStyles(selectionStart, selectionStart + 1, false);\n // now duplicate the style one for each inserted text.\n copiedStyle = insertedText.map(function() {\n // this return an array of references, but that is fine since we are\n // copying the style later.\n return copiedStyle[0];\n });\n }\n if (selection) {\n removeFrom = selectionStart;\n removeTo = selectionEnd;\n }\n else if (backDelete) {\n // detect differences between forwardDelete and backDelete\n removeFrom = selectionEnd - removedText.length;\n removeTo = selectionEnd;\n }\n else {\n removeFrom = selectionEnd;\n removeTo = selectionEnd + removedText.length;\n }\n this.removeStyleFromTo(removeFrom, removeTo);\n }\n if (insertedText.length) {\n if (fromPaste && insertedText.join('') === fabric.copiedText && !fabric.disableStyleCopyPaste) {\n copiedStyle = fabric.copiedTextStyle;\n }\n this.insertNewStyleBlock(insertedText, selectionStart, copiedStyle);\n }\n this.updateFromTextArea();\n this.fire('changed');\n if (this.canvas) {\n this.canvas.fire('text:changed', { target: this });\n this.canvas.requestRenderAll();\n }\n },\n /**\n * Composition start\n */\n onCompositionStart: function() {\n this.inCompositionMode = true;\n },\n\n /**\n * Composition end\n */\n onCompositionEnd: function() {\n this.inCompositionMode = false;\n },\n\n // /**\n // * Composition update\n // */\n onCompositionUpdate: function(e) {\n this.compositionStart = e.target.selectionStart;\n this.compositionEnd = e.target.selectionEnd;\n this.updateTextareaPosition();\n },\n\n /**\n * Copies selected text\n * @param {Event} e Event object\n */\n copy: function() {\n if (this.selectionStart === this.selectionEnd) {\n //do not cut-copy if no selection\n return;\n }\n\n fabric.copiedText = this.getSelectedText();\n if (!fabric.disableStyleCopyPaste) {\n fabric.copiedTextStyle = this.getSelectionStyles(this.selectionStart, this.selectionEnd, true);\n }\n else {\n fabric.copiedTextStyle = null;\n }\n this._copyDone = true;\n },\n\n /**\n * Pastes text\n * @param {Event} e Event object\n */\n paste: function() {\n this.fromPaste = true;\n },\n\n /**\n * @private\n * @param {Event} e Event object\n * @return {Object} Clipboard data object\n */\n _getClipboardData: function(e) {\n return (e && e.clipboardData) || fabric.window.clipboardData;\n },\n\n /**\n * Finds the width in pixels before the cursor on the same line\n * @private\n * @param {Number} lineIndex\n * @param {Number} charIndex\n * @return {Number} widthBeforeCursor width before cursor\n */\n _getWidthBeforeCursor: function(lineIndex, charIndex) {\n var widthBeforeCursor = this._getLineLeftOffset(lineIndex), bound;\n\n if (charIndex > 0) {\n bound = this.__charBounds[lineIndex][charIndex - 1];\n widthBeforeCursor += bound.left + bound.width;\n }\n return widthBeforeCursor;\n },\n\n /**\n * Gets start offset of a selection\n * @param {Event} e Event object\n * @param {Boolean} isRight\n * @return {Number}\n */\n getDownCursorOffset: function(e, isRight) {\n var selectionProp = this._getSelectionForOffset(e, isRight),\n cursorLocation = this.get2DCursorLocation(selectionProp),\n lineIndex = cursorLocation.lineIndex;\n // if on last line, down cursor goes to end of line\n if (lineIndex === this._textLines.length - 1 || e.metaKey || e.keyCode === 34) {\n // move to the end of a text\n return this._text.length - selectionProp;\n }\n var charIndex = cursorLocation.charIndex,\n widthBeforeCursor = this._getWidthBeforeCursor(lineIndex, charIndex),\n indexOnOtherLine = this._getIndexOnLine(lineIndex + 1, widthBeforeCursor),\n textAfterCursor = this._textLines[lineIndex].slice(charIndex);\n return textAfterCursor.length + indexOnOtherLine + 1 + this.missingNewlineOffset(lineIndex);\n },\n\n /**\n * private\n * Helps finding if the offset should be counted from Start or End\n * @param {Event} e Event object\n * @param {Boolean} isRight\n * @return {Number}\n */\n _getSelectionForOffset: function(e, isRight) {\n if (e.shiftKey && this.selectionStart !== this.selectionEnd && isRight) {\n return this.selectionEnd;\n }\n else {\n return this.selectionStart;\n }\n },\n\n /**\n * @param {Event} e Event object\n * @param {Boolean} isRight\n * @return {Number}\n */\n getUpCursorOffset: function(e, isRight) {\n var selectionProp = this._getSelectionForOffset(e, isRight),\n cursorLocation = this.get2DCursorLocation(selectionProp),\n lineIndex = cursorLocation.lineIndex;\n if (lineIndex === 0 || e.metaKey || e.keyCode === 33) {\n // if on first line, up cursor goes to start of line\n return -selectionProp;\n }\n var charIndex = cursorLocation.charIndex,\n widthBeforeCursor = this._getWidthBeforeCursor(lineIndex, charIndex),\n indexOnOtherLine = this._getIndexOnLine(lineIndex - 1, widthBeforeCursor),\n textBeforeCursor = this._textLines[lineIndex].slice(0, charIndex),\n missingNewlineOffset = this.missingNewlineOffset(lineIndex - 1);\n // return a negative offset\n return -this._textLines[lineIndex - 1].length\n + indexOnOtherLine - textBeforeCursor.length + (1 - missingNewlineOffset);\n },\n\n /**\n * for a given width it founds the matching character.\n * @private\n */\n _getIndexOnLine: function(lineIndex, width) {\n\n var line = this._textLines[lineIndex],\n lineLeftOffset = this._getLineLeftOffset(lineIndex),\n widthOfCharsOnLine = lineLeftOffset,\n indexOnLine = 0, charWidth, foundMatch;\n\n for (var j = 0, jlen = line.length; j < jlen; j++) {\n charWidth = this.__charBounds[lineIndex][j].width;\n widthOfCharsOnLine += charWidth;\n if (widthOfCharsOnLine > width) {\n foundMatch = true;\n var leftEdge = widthOfCharsOnLine - charWidth,\n rightEdge = widthOfCharsOnLine,\n offsetFromLeftEdge = Math.abs(leftEdge - width),\n offsetFromRightEdge = Math.abs(rightEdge - width);\n\n indexOnLine = offsetFromRightEdge < offsetFromLeftEdge ? j : (j - 1);\n break;\n }\n }\n\n // reached end\n if (!foundMatch) {\n indexOnLine = line.length - 1;\n }\n\n return indexOnLine;\n },\n\n\n /**\n * Moves cursor down\n * @param {Event} e Event object\n */\n moveCursorDown: function(e) {\n if (this.selectionStart >= this._text.length && this.selectionEnd >= this._text.length) {\n return;\n }\n this._moveCursorUpOrDown('Down', e);\n },\n\n /**\n * Moves cursor up\n * @param {Event} e Event object\n */\n moveCursorUp: function(e) {\n if (this.selectionStart === 0 && this.selectionEnd === 0) {\n return;\n }\n this._moveCursorUpOrDown('Up', e);\n },\n\n /**\n * Moves cursor up or down, fires the events\n * @param {String} direction 'Up' or 'Down'\n * @param {Event} e Event object\n */\n _moveCursorUpOrDown: function(direction, e) {\n // getUpCursorOffset\n // getDownCursorOffset\n var action = 'get' + direction + 'CursorOffset',\n offset = this[action](e, this._selectionDirection === 'right');\n if (e.shiftKey) {\n this.moveCursorWithShift(offset);\n }\n else {\n this.moveCursorWithoutShift(offset);\n }\n if (offset !== 0) {\n this.setSelectionInBoundaries();\n this.abortCursorAnimation();\n this._currentCursorOpacity = 1;\n this.initDelayedCursor();\n this._fireSelectionChanged();\n this._updateTextarea();\n }\n },\n\n /**\n * Moves cursor with shift\n * @param {Number} offset\n */\n moveCursorWithShift: function(offset) {\n var newSelection = this._selectionDirection === 'left'\n ? this.selectionStart + offset\n : this.selectionEnd + offset;\n this.setSelectionStartEndWithShift(this.selectionStart, this.selectionEnd, newSelection);\n return offset !== 0;\n },\n\n /**\n * Moves cursor up without shift\n * @param {Number} offset\n */\n moveCursorWithoutShift: function(offset) {\n if (offset < 0) {\n this.selectionStart += offset;\n this.selectionEnd = this.selectionStart;\n }\n else {\n this.selectionEnd += offset;\n this.selectionStart = this.selectionEnd;\n }\n return offset !== 0;\n },\n\n /**\n * Moves cursor left\n * @param {Event} e Event object\n */\n moveCursorLeft: function(e) {\n if (this.selectionStart === 0 && this.selectionEnd === 0) {\n return;\n }\n this._moveCursorLeftOrRight('Left', e);\n },\n\n /**\n * @private\n * @return {Boolean} true if a change happened\n */\n _move: function(e, prop, direction) {\n var newValue;\n if (e.altKey) {\n newValue = this['findWordBoundary' + direction](this[prop]);\n }\n else if (e.metaKey || e.keyCode === 35 || e.keyCode === 36 ) {\n newValue = this['findLineBoundary' + direction](this[prop]);\n }\n else {\n this[prop] += direction === 'Left' ? -1 : 1;\n return true;\n }\n if (typeof newValue !== 'undefined' && this[prop] !== newValue) {\n this[prop] = newValue;\n return true;\n }\n },\n\n /**\n * @private\n */\n _moveLeft: function(e, prop) {\n return this._move(e, prop, 'Left');\n },\n\n /**\n * @private\n */\n _moveRight: function(e, prop) {\n return this._move(e, prop, 'Right');\n },\n\n /**\n * Moves cursor left without keeping selection\n * @param {Event} e\n */\n moveCursorLeftWithoutShift: function(e) {\n var change = true;\n this._selectionDirection = 'left';\n\n // only move cursor when there is no selection,\n // otherwise we discard it, and leave cursor on same place\n if (this.selectionEnd === this.selectionStart && this.selectionStart !== 0) {\n change = this._moveLeft(e, 'selectionStart');\n\n }\n this.selectionEnd = this.selectionStart;\n return change;\n },\n\n /**\n * Moves cursor left while keeping selection\n * @param {Event} e\n */\n moveCursorLeftWithShift: function(e) {\n if (this._selectionDirection === 'right' && this.selectionStart !== this.selectionEnd) {\n return this._moveLeft(e, 'selectionEnd');\n }\n else if (this.selectionStart !== 0){\n this._selectionDirection = 'left';\n return this._moveLeft(e, 'selectionStart');\n }\n },\n\n /**\n * Moves cursor right\n * @param {Event} e Event object\n */\n moveCursorRight: function(e) {\n if (this.selectionStart >= this._text.length && this.selectionEnd >= this._text.length) {\n return;\n }\n this._moveCursorLeftOrRight('Right', e);\n },\n\n /**\n * Moves cursor right or Left, fires event\n * @param {String} direction 'Left', 'Right'\n * @param {Event} e Event object\n */\n _moveCursorLeftOrRight: function(direction, e) {\n var actionName = 'moveCursor' + direction + 'With';\n this._currentCursorOpacity = 1;\n\n if (e.shiftKey) {\n actionName += 'Shift';\n }\n else {\n actionName += 'outShift';\n }\n if (this[actionName](e)) {\n this.abortCursorAnimation();\n this.initDelayedCursor();\n this._fireSelectionChanged();\n this._updateTextarea();\n }\n },\n\n /**\n * Moves cursor right while keeping selection\n * @param {Event} e\n */\n moveCursorRightWithShift: function(e) {\n if (this._selectionDirection === 'left' && this.selectionStart !== this.selectionEnd) {\n return this._moveRight(e, 'selectionStart');\n }\n else if (this.selectionEnd !== this._text.length) {\n this._selectionDirection = 'right';\n return this._moveRight(e, 'selectionEnd');\n }\n },\n\n /**\n * Moves cursor right without keeping selection\n * @param {Event} e Event object\n */\n moveCursorRightWithoutShift: function(e) {\n var changed = true;\n this._selectionDirection = 'right';\n\n if (this.selectionStart === this.selectionEnd) {\n changed = this._moveRight(e, 'selectionStart');\n this.selectionEnd = this.selectionStart;\n }\n else {\n this.selectionStart = this.selectionEnd;\n }\n return changed;\n },\n\n /**\n * Removes characters from start/end\n * start/end ar per grapheme position in _text array.\n *\n * @param {Number} start\n * @param {Number} end default to start + 1\n */\n removeChars: function(start, end) {\n if (typeof end === 'undefined') {\n end = start + 1;\n }\n this.removeStyleFromTo(start, end);\n this._text.splice(start, end - start);\n this.text = this._text.join('');\n this.set('dirty', true);\n if (this._shouldClearDimensionCache()) {\n this.initDimensions();\n this.setCoords();\n }\n this._removeExtraneousStyles();\n },\n\n /**\n * insert characters at start position, before start position.\n * start equal 1 it means the text get inserted between actual grapheme 0 and 1\n * if style array is provided, it must be as the same length of text in graphemes\n * if end is provided and is bigger than start, old text is replaced.\n * start/end ar per grapheme position in _text array.\n *\n * @param {String} text text to insert\n * @param {Array} style array of style objects\n * @param {Number} start\n * @param {Number} end default to start + 1\n */\n insertChars: function(text, style, start, end) {\n if (typeof end === 'undefined') {\n end = start;\n }\n if (end > start) {\n this.removeStyleFromTo(start, end);\n }\n var graphemes = fabric.util.string.graphemeSplit(text);\n this.insertNewStyleBlock(graphemes, start, style);\n this._text = [].concat(this._text.slice(0, start), graphemes, this._text.slice(end));\n this.text = this._text.join('');\n this.set('dirty', true);\n if (this._shouldClearDimensionCache()) {\n this.initDimensions();\n this.setCoords();\n }\n this._removeExtraneousStyles();\n },\n\n});\n\n\n/* _TO_SVG_START_ */\n(function() {\n var toFixed = fabric.util.toFixed,\n multipleSpacesRegex = / +/g;\n\n fabric.util.object.extend(fabric.Text.prototype, /** @lends fabric.Text.prototype */ {\n\n /**\n * Returns SVG representation of an instance\n * @param {Function} [reviver] Method for further parsing of svg representation.\n * @return {String} svg representation of an instance\n */\n _toSVG: function() {\n var offsets = this._getSVGLeftTopOffsets(),\n textAndBg = this._getSVGTextAndBg(offsets.textTop, offsets.textLeft);\n return this._wrapSVGTextAndBg(textAndBg);\n },\n\n /**\n * Returns svg representation of an instance\n * @param {Function} [reviver] Method for further parsing of svg representation.\n * @return {String} svg representation of an instance\n */\n toSVG: function(reviver) {\n return this._createBaseSVGMarkup(\n this._toSVG(),\n { reviver: reviver, noStyle: true, withShadow: true }\n );\n },\n\n /**\n * @private\n */\n _getSVGLeftTopOffsets: function() {\n return {\n textLeft: -this.width / 2,\n textTop: -this.height / 2,\n lineTop: this.getHeightOfLine(0)\n };\n },\n\n /**\n * @private\n */\n _wrapSVGTextAndBg: function(textAndBg) {\n var noShadow = true,\n textDecoration = this.getSvgTextDecoration(this);\n return [\n textAndBg.textBgRects.join(''),\n '\\t\\t',\n textAndBg.textSpans.join(''),\n '\\n'\n ];\n },\n\n /**\n * @private\n * @param {Number} textTopOffset Text top offset\n * @param {Number} textLeftOffset Text left offset\n * @return {Object}\n */\n _getSVGTextAndBg: function(textTopOffset, textLeftOffset) {\n var textSpans = [],\n textBgRects = [],\n height = textTopOffset, lineOffset;\n // bounding-box background\n this._setSVGBg(textBgRects);\n\n // text and text-background\n for (var i = 0, len = this._textLines.length; i < len; i++) {\n lineOffset = this._getLineLeftOffset(i);\n if (this.textBackgroundColor || this.styleHas('textBackgroundColor', i)) {\n this._setSVGTextLineBg(textBgRects, i, textLeftOffset + lineOffset, height);\n }\n this._setSVGTextLineText(textSpans, i, textLeftOffset + lineOffset, height);\n height += this.getHeightOfLine(i);\n }\n\n return {\n textSpans: textSpans,\n textBgRects: textBgRects\n };\n },\n\n /**\n * @private\n */\n _createTextCharSpan: function(_char, styleDecl, left, top) {\n var shouldUseWhitespace = _char !== _char.trim() || _char.match(multipleSpacesRegex),\n styleProps = this.getSvgSpanStyles(styleDecl, shouldUseWhitespace),\n fillStyles = styleProps ? 'style=\"' + styleProps + '\"' : '',\n dy = styleDecl.deltaY, dySpan = '',\n NUM_FRACTION_DIGITS = fabric.Object.NUM_FRACTION_DIGITS;\n if (dy) {\n dySpan = ' dy=\"' + toFixed(dy, NUM_FRACTION_DIGITS) + '\" ';\n }\n return [\n '',\n fabric.util.string.escapeXml(_char),\n ''\n ].join('');\n },\n\n _setSVGTextLineText: function(textSpans, lineIndex, textLeftOffset, textTopOffset) {\n // set proper line offset\n var lineHeight = this.getHeightOfLine(lineIndex),\n isJustify = this.textAlign.indexOf('justify') !== -1,\n actualStyle,\n nextStyle,\n charsToRender = '',\n charBox, style,\n boxWidth = 0,\n line = this._textLines[lineIndex],\n timeToRender;\n\n textTopOffset += lineHeight * (1 - this._fontSizeFraction) / this.lineHeight;\n for (var i = 0, len = line.length - 1; i <= len; i++) {\n timeToRender = i === len || this.charSpacing;\n charsToRender += line[i];\n charBox = this.__charBounds[lineIndex][i];\n if (boxWidth === 0) {\n textLeftOffset += charBox.kernedWidth - charBox.width;\n boxWidth += charBox.width;\n }\n else {\n boxWidth += charBox.kernedWidth;\n }\n if (isJustify && !timeToRender) {\n if (this._reSpaceAndTab.test(line[i])) {\n timeToRender = true;\n }\n }\n if (!timeToRender) {\n // if we have charSpacing, we render char by char\n actualStyle = actualStyle || this.getCompleteStyleDeclaration(lineIndex, i);\n nextStyle = this.getCompleteStyleDeclaration(lineIndex, i + 1);\n timeToRender = fabric.util.hasStyleChanged(actualStyle, nextStyle, true);\n }\n if (timeToRender) {\n style = this._getStyleDeclaration(lineIndex, i) || { };\n textSpans.push(this._createTextCharSpan(charsToRender, style, textLeftOffset, textTopOffset));\n charsToRender = '';\n actualStyle = nextStyle;\n textLeftOffset += boxWidth;\n boxWidth = 0;\n }\n }\n },\n\n _pushTextBgRect: function(textBgRects, color, left, top, width, height) {\n var NUM_FRACTION_DIGITS = fabric.Object.NUM_FRACTION_DIGITS;\n textBgRects.push(\n '\\t\\t\\n');\n },\n\n _setSVGTextLineBg: function(textBgRects, i, leftOffset, textTopOffset) {\n var line = this._textLines[i],\n heightOfLine = this.getHeightOfLine(i) / this.lineHeight,\n boxWidth = 0,\n boxStart = 0,\n charBox, currentColor,\n lastColor = this.getValueOfPropertyAt(i, 0, 'textBackgroundColor');\n for (var j = 0, jlen = line.length; j < jlen; j++) {\n charBox = this.__charBounds[i][j];\n currentColor = this.getValueOfPropertyAt(i, j, 'textBackgroundColor');\n if (currentColor !== lastColor) {\n lastColor && this._pushTextBgRect(textBgRects, lastColor, leftOffset + boxStart,\n textTopOffset, boxWidth, heightOfLine);\n boxStart = charBox.left;\n boxWidth = charBox.width;\n lastColor = currentColor;\n }\n else {\n boxWidth += charBox.kernedWidth;\n }\n }\n currentColor && this._pushTextBgRect(textBgRects, currentColor, leftOffset + boxStart,\n textTopOffset, boxWidth, heightOfLine);\n },\n\n /**\n * Adobe Illustrator (at least CS5) is unable to render rgba()-based fill values\n * we work around it by \"moving\" alpha channel into opacity attribute and setting fill's alpha to 1\n *\n * @private\n * @param {*} value\n * @return {String}\n */\n _getFillAttributes: function(value) {\n var fillColor = (value && typeof value === 'string') ? new fabric.Color(value) : '';\n if (!fillColor || !fillColor.getSource() || fillColor.getAlpha() === 1) {\n return 'fill=\"' + value + '\"';\n }\n return 'opacity=\"' + fillColor.getAlpha() + '\" fill=\"' + fillColor.setAlpha(1).toRgb() + '\"';\n },\n\n /**\n * @private\n */\n _getSVGLineTopOffset: function(lineIndex) {\n var lineTopOffset = 0, lastHeight = 0;\n for (var j = 0; j < lineIndex; j++) {\n lineTopOffset += this.getHeightOfLine(j);\n }\n lastHeight = this.getHeightOfLine(j);\n return {\n lineTop: lineTopOffset,\n offset: (this._fontSizeMult - this._fontSizeFraction) * lastHeight / (this.lineHeight * this._fontSizeMult)\n };\n },\n\n /**\n * Returns styles-string for svg-export\n * @param {Boolean} skipShadow a boolean to skip shadow filter output\n * @return {String}\n */\n getSvgStyles: function(skipShadow) {\n var svgStyle = fabric.Object.prototype.getSvgStyles.call(this, skipShadow);\n return svgStyle + ' white-space: pre;';\n },\n });\n})();\n/* _TO_SVG_END_ */\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = {});\n\n /**\n * Textbox class, based on IText, allows the user to resize the text rectangle\n * and wraps lines automatically. Textboxes have their Y scaling locked, the\n * user can only change width. Height is adjusted automatically based on the\n * wrapping of lines.\n * @class fabric.Textbox\n * @extends fabric.IText\n * @mixes fabric.Observable\n * @return {fabric.Textbox} thisArg\n * @see {@link fabric.Textbox#initialize} for constructor definition\n */\n fabric.Textbox = fabric.util.createClass(fabric.IText, fabric.Observable, {\n\n /**\n * Type of an object\n * @type String\n * @default\n */\n type: 'textbox',\n\n /**\n * Minimum width of textbox, in pixels.\n * @type Number\n * @default\n */\n minWidth: 20,\n\n /**\n * Minimum calculated width of a textbox, in pixels.\n * fixed to 2 so that an empty textbox cannot go to 0\n * and is still selectable without text.\n * @type Number\n * @default\n */\n dynamicMinWidth: 2,\n\n /**\n * Cached array of text wrapping.\n * @type Array\n */\n __cachedLines: null,\n\n /**\n * Override standard Object class values\n */\n lockScalingFlip: true,\n\n /**\n * Override standard Object class values\n * Textbox needs this on false\n */\n noScaleCache: false,\n\n /**\n * Properties which when set cause object to change dimensions\n * @type Object\n * @private\n */\n _dimensionAffectingProps: fabric.Text.prototype._dimensionAffectingProps.concat('width'),\n\n /**\n * Use this regular expression to split strings in breakable lines\n * @private\n */\n _wordJoiners: /[ \\t\\r]/,\n\n /**\n * Use this boolean property in order to split strings that have no white space concept.\n * this is a cheap way to help with chinese/japanese\n * @type Boolean\n * @since 2.6.0\n */\n splitByGrapheme: false,\n\n /**\n * Unlike superclass's version of this function, Textbox does not update\n * its width.\n * @private\n * @override\n */\n initDimensions: function() {\n if (this.__skipDimension) {\n return;\n }\n this.isEditing && this.initDelayedCursor();\n this.clearContextTop();\n this._clearCache();\n // clear dynamicMinWidth as it will be different after we re-wrap line\n this.dynamicMinWidth = 0;\n // wrap lines\n this._styleMap = this._generateStyleMap(this._splitText());\n // if after wrapping, the width is smaller than dynamicMinWidth, change the width and re-wrap\n if (this.dynamicMinWidth > this.width) {\n this._set('width', this.dynamicMinWidth);\n }\n if (this.textAlign.indexOf('justify') !== -1) {\n // once text is measured we need to make space fatter to make justified text.\n this.enlargeSpaces();\n }\n // clear cache and re-calculate height\n this.height = this.calcTextHeight();\n this.saveState({ propertySet: '_dimensionAffectingProps' });\n },\n\n /**\n * Generate an object that translates the style object so that it is\n * broken up by visual lines (new lines and automatic wrapping).\n * The original text styles object is broken up by actual lines (new lines only),\n * which is only sufficient for Text / IText\n * @private\n */\n _generateStyleMap: function(textInfo) {\n var realLineCount = 0,\n realLineCharCount = 0,\n charCount = 0,\n map = {};\n\n for (var i = 0; i < textInfo.graphemeLines.length; i++) {\n if (textInfo.graphemeText[charCount] === '\\n' && i > 0) {\n realLineCharCount = 0;\n charCount++;\n realLineCount++;\n }\n else if (!this.splitByGrapheme && this._reSpaceAndTab.test(textInfo.graphemeText[charCount]) && i > 0) {\n // this case deals with space's that are removed from end of lines when wrapping\n realLineCharCount++;\n charCount++;\n }\n\n map[i] = { line: realLineCount, offset: realLineCharCount };\n\n charCount += textInfo.graphemeLines[i].length;\n realLineCharCount += textInfo.graphemeLines[i].length;\n }\n\n return map;\n },\n\n /**\n * Returns true if object has a style property or has it on a specified line\n * @param {Number} lineIndex\n * @return {Boolean}\n */\n styleHas: function(property, lineIndex) {\n if (this._styleMap && !this.isWrapping) {\n var map = this._styleMap[lineIndex];\n if (map) {\n lineIndex = map.line;\n }\n }\n return fabric.Text.prototype.styleHas.call(this, property, lineIndex);\n },\n\n /**\n * Returns true if object has no styling or no styling in a line\n * @param {Number} lineIndex , lineIndex is on wrapped lines.\n * @return {Boolean}\n */\n isEmptyStyles: function(lineIndex) {\n if (!this.styles) {\n return true;\n }\n var offset = 0, nextLineIndex = lineIndex + 1, nextOffset, obj, shouldLimit = false,\n map = this._styleMap[lineIndex], mapNextLine = this._styleMap[lineIndex + 1];\n if (map) {\n lineIndex = map.line;\n offset = map.offset;\n }\n if (mapNextLine) {\n nextLineIndex = mapNextLine.line;\n shouldLimit = nextLineIndex === lineIndex;\n nextOffset = mapNextLine.offset;\n }\n obj = typeof lineIndex === 'undefined' ? this.styles : { line: this.styles[lineIndex] };\n for (var p1 in obj) {\n for (var p2 in obj[p1]) {\n if (p2 >= offset && (!shouldLimit || p2 < nextOffset)) {\n // eslint-disable-next-line no-unused-vars\n for (var p3 in obj[p1][p2]) {\n return false;\n }\n }\n }\n }\n return true;\n },\n\n /**\n * @param {Number} lineIndex\n * @param {Number} charIndex\n * @private\n */\n _getStyleDeclaration: function(lineIndex, charIndex) {\n if (this._styleMap && !this.isWrapping) {\n var map = this._styleMap[lineIndex];\n if (!map) {\n return null;\n }\n lineIndex = map.line;\n charIndex = map.offset + charIndex;\n }\n return this.callSuper('_getStyleDeclaration', lineIndex, charIndex);\n },\n\n /**\n * @param {Number} lineIndex\n * @param {Number} charIndex\n * @param {Object} style\n * @private\n */\n _setStyleDeclaration: function(lineIndex, charIndex, style) {\n var map = this._styleMap[lineIndex];\n lineIndex = map.line;\n charIndex = map.offset + charIndex;\n\n this.styles[lineIndex][charIndex] = style;\n },\n\n /**\n * @param {Number} lineIndex\n * @param {Number} charIndex\n * @private\n */\n _deleteStyleDeclaration: function(lineIndex, charIndex) {\n var map = this._styleMap[lineIndex];\n lineIndex = map.line;\n charIndex = map.offset + charIndex;\n delete this.styles[lineIndex][charIndex];\n },\n\n /**\n * probably broken need a fix\n * Returns the real style line that correspond to the wrapped lineIndex line\n * Used just to verify if the line does exist or not.\n * @param {Number} lineIndex\n * @returns {Boolean} if the line exists or not\n * @private\n */\n _getLineStyle: function(lineIndex) {\n var map = this._styleMap[lineIndex];\n return !!this.styles[map.line];\n },\n\n /**\n * Set the line style to an empty object so that is initialized\n * @param {Number} lineIndex\n * @param {Object} style\n * @private\n */\n _setLineStyle: function(lineIndex) {\n var map = this._styleMap[lineIndex];\n this.styles[map.line] = {};\n },\n\n /**\n * Wraps text using the 'width' property of Textbox. First this function\n * splits text on newlines, so we preserve newlines entered by the user.\n * Then it wraps each line using the width of the Textbox by calling\n * _wrapLine().\n * @param {Array} lines The string array of text that is split into lines\n * @param {Number} desiredWidth width you want to wrap to\n * @returns {Array} Array of lines\n */\n _wrapText: function(lines, desiredWidth) {\n var wrapped = [], i;\n this.isWrapping = true;\n for (i = 0; i < lines.length; i++) {\n wrapped = wrapped.concat(this._wrapLine(lines[i], i, desiredWidth));\n }\n this.isWrapping = false;\n return wrapped;\n },\n\n /**\n * Helper function to measure a string of text, given its lineIndex and charIndex offset\n * it gets called when charBounds are not available yet.\n * @param {CanvasRenderingContext2D} ctx\n * @param {String} text\n * @param {number} lineIndex\n * @param {number} charOffset\n * @returns {number}\n * @private\n */\n _measureWord: function(word, lineIndex, charOffset) {\n var width = 0, prevGrapheme, skipLeft = true;\n charOffset = charOffset || 0;\n for (var i = 0, len = word.length; i < len; i++) {\n var box = this._getGraphemeBox(word[i], lineIndex, i + charOffset, prevGrapheme, skipLeft);\n width += box.kernedWidth;\n prevGrapheme = word[i];\n }\n return width;\n },\n\n /**\n * Wraps a line of text using the width of the Textbox and a context.\n * @param {Array} line The grapheme array that represent the line\n * @param {Number} lineIndex\n * @param {Number} desiredWidth width you want to wrap the line to\n * @param {Number} reservedSpace space to remove from wrapping for custom functionalities\n * @returns {Array} Array of line(s) into which the given text is wrapped\n * to.\n */\n _wrapLine: function(_line, lineIndex, desiredWidth, reservedSpace) {\n var lineWidth = 0,\n splitByGrapheme = this.splitByGrapheme,\n graphemeLines = [],\n line = [],\n // spaces in different languages?\n words = splitByGrapheme ? fabric.util.string.graphemeSplit(_line) : _line.split(this._wordJoiners),\n word = '',\n offset = 0,\n infix = splitByGrapheme ? '' : ' ',\n wordWidth = 0,\n infixWidth = 0,\n largestWordWidth = 0,\n lineJustStarted = true,\n additionalSpace = this._getWidthOfCharSpacing(),\n reservedSpace = reservedSpace || 0;\n // fix a difference between split and graphemeSplit\n if (words.length === 0) {\n words.push([]);\n }\n desiredWidth -= reservedSpace;\n for (var i = 0; i < words.length; i++) {\n // if using splitByGrapheme words are already in graphemes.\n word = splitByGrapheme ? words[i] : fabric.util.string.graphemeSplit(words[i]);\n wordWidth = this._measureWord(word, lineIndex, offset);\n offset += word.length;\n\n lineWidth += infixWidth + wordWidth - additionalSpace;\n if (lineWidth > desiredWidth && !lineJustStarted) {\n graphemeLines.push(line);\n line = [];\n lineWidth = wordWidth;\n lineJustStarted = true;\n }\n else {\n lineWidth += additionalSpace;\n }\n\n if (!lineJustStarted && !splitByGrapheme) {\n line.push(infix);\n }\n line = line.concat(word);\n\n infixWidth = splitByGrapheme ? 0 : this._measureWord([infix], lineIndex, offset);\n offset++;\n lineJustStarted = false;\n // keep track of largest word\n if (wordWidth > largestWordWidth) {\n largestWordWidth = wordWidth;\n }\n }\n\n i && graphemeLines.push(line);\n\n if (largestWordWidth + reservedSpace > this.dynamicMinWidth) {\n this.dynamicMinWidth = largestWordWidth - additionalSpace + reservedSpace;\n }\n return graphemeLines;\n },\n\n /**\n * Detect if the text line is ended with an hard break\n * text and itext do not have wrapping, return false\n * @param {Number} lineIndex text to split\n * @return {Boolean}\n */\n isEndOfWrapping: function(lineIndex) {\n if (!this._styleMap[lineIndex + 1]) {\n // is last line, return true;\n return true;\n }\n if (this._styleMap[lineIndex + 1].line !== this._styleMap[lineIndex].line) {\n // this is last line before a line break, return true;\n return true;\n }\n return false;\n },\n\n /**\n * Detect if a line has a linebreak and so we need to account for it when moving\n * and counting style.\n * @return Number\n */\n missingNewlineOffset: function(lineIndex) {\n if (this.splitByGrapheme) {\n return this.isEndOfWrapping(lineIndex) ? 1 : 0;\n }\n return 1;\n },\n\n /**\n * Gets lines of text to render in the Textbox. This function calculates\n * text wrapping on the fly every time it is called.\n * @param {String} text text to split\n * @returns {Array} Array of lines in the Textbox.\n * @override\n */\n _splitTextIntoLines: function(text) {\n var newText = fabric.Text.prototype._splitTextIntoLines.call(this, text),\n graphemeLines = this._wrapText(newText.lines, this.width),\n lines = new Array(graphemeLines.length);\n for (var i = 0; i < graphemeLines.length; i++) {\n lines[i] = graphemeLines[i].join('');\n }\n newText.lines = lines;\n newText.graphemeLines = graphemeLines;\n return newText;\n },\n\n getMinWidth: function() {\n return Math.max(this.minWidth, this.dynamicMinWidth);\n },\n\n _removeExtraneousStyles: function() {\n var linesToKeep = {};\n for (var prop in this._styleMap) {\n if (this._textLines[prop]) {\n linesToKeep[this._styleMap[prop].line] = 1;\n }\n }\n for (var prop in this.styles) {\n if (!linesToKeep[prop]) {\n delete this.styles[prop];\n }\n }\n },\n\n /**\n * Returns object representation of an instance\n * @method toObject\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toObject: function(propertiesToInclude) {\n return this.callSuper('toObject', ['minWidth', 'splitByGrapheme'].concat(propertiesToInclude));\n }\n });\n\n /**\n * Returns fabric.Textbox instance from an object representation\n * @static\n * @memberOf fabric.Textbox\n * @param {Object} object Object to create an instance from\n * @param {Function} [callback] Callback to invoke when an fabric.Textbox instance is created\n */\n fabric.Textbox.fromObject = function(object, callback) {\n var styles = fabric.util.stylesFromArray(object.styles, object.text);\n //copy object to prevent mutation\n var objCopy = Object.assign({}, object, { styles: styles });\n return fabric.Object._fromObject('Textbox', objCopy, callback, 'text');\n };\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function() {\n\n var controlsUtils = fabric.controlsUtils,\n scaleSkewStyleHandler = controlsUtils.scaleSkewCursorStyleHandler,\n scaleStyleHandler = controlsUtils.scaleCursorStyleHandler,\n scalingEqually = controlsUtils.scalingEqually,\n scalingYOrSkewingX = controlsUtils.scalingYOrSkewingX,\n scalingXOrSkewingY = controlsUtils.scalingXOrSkewingY,\n scaleOrSkewActionName = controlsUtils.scaleOrSkewActionName,\n objectControls = fabric.Object.prototype.controls;\n\n objectControls.ml = new fabric.Control({\n x: -0.5,\n y: 0,\n cursorStyleHandler: scaleSkewStyleHandler,\n actionHandler: scalingXOrSkewingY,\n getActionName: scaleOrSkewActionName,\n });\n\n objectControls.mr = new fabric.Control({\n x: 0.5,\n y: 0,\n cursorStyleHandler: scaleSkewStyleHandler,\n actionHandler: scalingXOrSkewingY,\n getActionName: scaleOrSkewActionName,\n });\n\n objectControls.mb = new fabric.Control({\n x: 0,\n y: 0.5,\n cursorStyleHandler: scaleSkewStyleHandler,\n actionHandler: scalingYOrSkewingX,\n getActionName: scaleOrSkewActionName,\n });\n\n objectControls.mt = new fabric.Control({\n x: 0,\n y: -0.5,\n cursorStyleHandler: scaleSkewStyleHandler,\n actionHandler: scalingYOrSkewingX,\n getActionName: scaleOrSkewActionName,\n });\n\n objectControls.tl = new fabric.Control({\n x: -0.5,\n y: -0.5,\n cursorStyleHandler: scaleStyleHandler,\n actionHandler: scalingEqually\n });\n\n objectControls.tr = new fabric.Control({\n x: 0.5,\n y: -0.5,\n cursorStyleHandler: scaleStyleHandler,\n actionHandler: scalingEqually\n });\n\n objectControls.bl = new fabric.Control({\n x: -0.5,\n y: 0.5,\n cursorStyleHandler: scaleStyleHandler,\n actionHandler: scalingEqually\n });\n\n objectControls.br = new fabric.Control({\n x: 0.5,\n y: 0.5,\n cursorStyleHandler: scaleStyleHandler,\n actionHandler: scalingEqually\n });\n\n objectControls.mtr = new fabric.Control({\n x: 0,\n y: -0.5,\n actionHandler: controlsUtils.rotationWithSnapping,\n cursorStyleHandler: controlsUtils.rotationStyleHandler,\n offsetY: -40,\n withConnection: true,\n actionName: 'rotate',\n });\n\n if (fabric.Textbox) {\n // this is breaking the prototype inheritance, no time / ideas to fix it.\n // is important to document that if you want to have all objects to have a\n // specific custom control, you have to add it to Object prototype and to Textbox\n // prototype. The controls are shared as references. So changes to control `tr`\n // can still apply to all objects if needed.\n var textBoxControls = fabric.Textbox.prototype.controls = { };\n\n textBoxControls.mtr = objectControls.mtr;\n textBoxControls.tr = objectControls.tr;\n textBoxControls.br = objectControls.br;\n textBoxControls.tl = objectControls.tl;\n textBoxControls.bl = objectControls.bl;\n textBoxControls.mt = objectControls.mt;\n textBoxControls.mb = objectControls.mb;\n\n textBoxControls.mr = new fabric.Control({\n x: 0.5,\n y: 0,\n actionHandler: controlsUtils.changeWidth,\n cursorStyleHandler: scaleSkewStyleHandler,\n actionName: 'resizing',\n });\n\n textBoxControls.ml = new fabric.Control({\n x: -0.5,\n y: 0,\n actionHandler: controlsUtils.changeWidth,\n cursorStyleHandler: scaleSkewStyleHandler,\n actionName: 'resizing',\n });\n }\n})();\n\n","var getNative = require('./_getNative'),\n root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar DataView = getNative(root, 'DataView');\n\nmodule.exports = DataView;\n","var hashClear = require('./_hashClear'),\n hashDelete = require('./_hashDelete'),\n hashGet = require('./_hashGet'),\n hashHas = require('./_hashHas'),\n hashSet = require('./_hashSet');\n\n/**\n * Creates a hash object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Hash(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `Hash`.\nHash.prototype.clear = hashClear;\nHash.prototype['delete'] = hashDelete;\nHash.prototype.get = hashGet;\nHash.prototype.has = hashHas;\nHash.prototype.set = hashSet;\n\nmodule.exports = Hash;\n","var listCacheClear = require('./_listCacheClear'),\n listCacheDelete = require('./_listCacheDelete'),\n listCacheGet = require('./_listCacheGet'),\n listCacheHas = require('./_listCacheHas'),\n listCacheSet = require('./_listCacheSet');\n\n/**\n * Creates an list cache object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction ListCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `ListCache`.\nListCache.prototype.clear = listCacheClear;\nListCache.prototype['delete'] = listCacheDelete;\nListCache.prototype.get = listCacheGet;\nListCache.prototype.has = listCacheHas;\nListCache.prototype.set = listCacheSet;\n\nmodule.exports = ListCache;\n","var getNative = require('./_getNative'),\n root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar Map = getNative(root, 'Map');\n\nmodule.exports = Map;\n","var mapCacheClear = require('./_mapCacheClear'),\n mapCacheDelete = require('./_mapCacheDelete'),\n mapCacheGet = require('./_mapCacheGet'),\n mapCacheHas = require('./_mapCacheHas'),\n mapCacheSet = require('./_mapCacheSet');\n\n/**\n * Creates a map cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction MapCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `MapCache`.\nMapCache.prototype.clear = mapCacheClear;\nMapCache.prototype['delete'] = mapCacheDelete;\nMapCache.prototype.get = mapCacheGet;\nMapCache.prototype.has = mapCacheHas;\nMapCache.prototype.set = mapCacheSet;\n\nmodule.exports = MapCache;\n","var getNative = require('./_getNative'),\n root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar Promise = getNative(root, 'Promise');\n\nmodule.exports = Promise;\n","var getNative = require('./_getNative'),\n root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar Set = getNative(root, 'Set');\n\nmodule.exports = Set;\n","var MapCache = require('./_MapCache'),\n setCacheAdd = require('./_setCacheAdd'),\n setCacheHas = require('./_setCacheHas');\n\n/**\n *\n * Creates an array cache object to store unique values.\n *\n * @private\n * @constructor\n * @param {Array} [values] The values to cache.\n */\nfunction SetCache(values) {\n var index = -1,\n length = values == null ? 0 : values.length;\n\n this.__data__ = new MapCache;\n while (++index < length) {\n this.add(values[index]);\n }\n}\n\n// Add methods to `SetCache`.\nSetCache.prototype.add = SetCache.prototype.push = setCacheAdd;\nSetCache.prototype.has = setCacheHas;\n\nmodule.exports = SetCache;\n","var ListCache = require('./_ListCache'),\n stackClear = require('./_stackClear'),\n stackDelete = require('./_stackDelete'),\n stackGet = require('./_stackGet'),\n stackHas = require('./_stackHas'),\n stackSet = require('./_stackSet');\n\n/**\n * Creates a stack cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Stack(entries) {\n var data = this.__data__ = new ListCache(entries);\n this.size = data.size;\n}\n\n// Add methods to `Stack`.\nStack.prototype.clear = stackClear;\nStack.prototype['delete'] = stackDelete;\nStack.prototype.get = stackGet;\nStack.prototype.has = stackHas;\nStack.prototype.set = stackSet;\n\nmodule.exports = Stack;\n","var root = require('./_root');\n\n/** Built-in value references. */\nvar Symbol = root.Symbol;\n\nmodule.exports = Symbol;\n","var root = require('./_root');\n\n/** Built-in value references. */\nvar Uint8Array = root.Uint8Array;\n\nmodule.exports = Uint8Array;\n","var getNative = require('./_getNative'),\n root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar WeakMap = getNative(root, 'WeakMap');\n\nmodule.exports = WeakMap;\n","/**\n * A specialized version of `_.forEach` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns `array`.\n */\nfunction arrayEach(array, iteratee) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n if (iteratee(array[index], index, array) === false) {\n break;\n }\n }\n return array;\n}\n\nmodule.exports = arrayEach;\n","/**\n * A specialized version of `_.filter` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n */\nfunction arrayFilter(array, predicate) {\n var index = -1,\n length = array == null ? 0 : array.length,\n resIndex = 0,\n result = [];\n\n while (++index < length) {\n var value = array[index];\n if (predicate(value, index, array)) {\n result[resIndex++] = value;\n }\n }\n return result;\n}\n\nmodule.exports = arrayFilter;\n","var baseTimes = require('./_baseTimes'),\n isArguments = require('./isArguments'),\n isArray = require('./isArray'),\n isBuffer = require('./isBuffer'),\n isIndex = require('./_isIndex'),\n isTypedArray = require('./isTypedArray');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Creates an array of the enumerable property names of the array-like `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @param {boolean} inherited Specify returning inherited property names.\n * @returns {Array} Returns the array of property names.\n */\nfunction arrayLikeKeys(value, inherited) {\n var isArr = isArray(value),\n isArg = !isArr && isArguments(value),\n isBuff = !isArr && !isArg && isBuffer(value),\n isType = !isArr && !isArg && !isBuff && isTypedArray(value),\n skipIndexes = isArr || isArg || isBuff || isType,\n result = skipIndexes ? baseTimes(value.length, String) : [],\n length = result.length;\n\n for (var key in value) {\n if ((inherited || hasOwnProperty.call(value, key)) &&\n !(skipIndexes && (\n // Safari 9 has enumerable `arguments.length` in strict mode.\n key == 'length' ||\n // Node.js 0.10 has enumerable non-index properties on buffers.\n (isBuff && (key == 'offset' || key == 'parent')) ||\n // PhantomJS 2 has enumerable non-index properties on typed arrays.\n (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||\n // Skip index properties.\n isIndex(key, length)\n ))) {\n result.push(key);\n }\n }\n return result;\n}\n\nmodule.exports = arrayLikeKeys;\n","/**\n * A specialized version of `_.map` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */\nfunction arrayMap(array, iteratee) {\n var index = -1,\n length = array == null ? 0 : array.length,\n result = Array(length);\n\n while (++index < length) {\n result[index] = iteratee(array[index], index, array);\n }\n return result;\n}\n\nmodule.exports = arrayMap;\n","/**\n * Appends the elements of `values` to `array`.\n *\n * @private\n * @param {Array} array The array to modify.\n * @param {Array} values The values to append.\n * @returns {Array} Returns `array`.\n */\nfunction arrayPush(array, values) {\n var index = -1,\n length = values.length,\n offset = array.length;\n\n while (++index < length) {\n array[offset + index] = values[index];\n }\n return array;\n}\n\nmodule.exports = arrayPush;\n","/**\n * A specialized version of `_.reduce` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {*} [accumulator] The initial value.\n * @param {boolean} [initAccum] Specify using the first element of `array` as\n * the initial value.\n * @returns {*} Returns the accumulated value.\n */\nfunction arrayReduce(array, iteratee, accumulator, initAccum) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n if (initAccum && length) {\n accumulator = array[++index];\n }\n while (++index < length) {\n accumulator = iteratee(accumulator, array[index], index, array);\n }\n return accumulator;\n}\n\nmodule.exports = arrayReduce;\n","/**\n * A specialized version of `_.some` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {boolean} Returns `true` if any element passes the predicate check,\n * else `false`.\n */\nfunction arraySome(array, predicate) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n if (predicate(array[index], index, array)) {\n return true;\n }\n }\n return false;\n}\n\nmodule.exports = arraySome;\n","/**\n * Converts an ASCII `string` to an array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the converted array.\n */\nfunction asciiToArray(string) {\n return string.split('');\n}\n\nmodule.exports = asciiToArray;\n","/** Used to match words composed of alphanumeric characters. */\nvar reAsciiWord = /[^\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\x7f]+/g;\n\n/**\n * Splits an ASCII `string` into an array of its words.\n *\n * @private\n * @param {string} The string to inspect.\n * @returns {Array} Returns the words of `string`.\n */\nfunction asciiWords(string) {\n return string.match(reAsciiWord) || [];\n}\n\nmodule.exports = asciiWords;\n","var baseAssignValue = require('./_baseAssignValue'),\n eq = require('./eq');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Assigns `value` to `key` of `object` if the existing value is not equivalent\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction assignValue(object, key, value) {\n var objValue = object[key];\n if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||\n (value === undefined && !(key in object))) {\n baseAssignValue(object, key, value);\n }\n}\n\nmodule.exports = assignValue;\n","var eq = require('./eq');\n\n/**\n * Gets the index at which the `key` is found in `array` of key-value pairs.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} key The key to search for.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction assocIndexOf(array, key) {\n var length = array.length;\n while (length--) {\n if (eq(array[length][0], key)) {\n return length;\n }\n }\n return -1;\n}\n\nmodule.exports = assocIndexOf;\n","var copyObject = require('./_copyObject'),\n keys = require('./keys');\n\n/**\n * The base implementation of `_.assign` without support for multiple sources\n * or `customizer` functions.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @returns {Object} Returns `object`.\n */\nfunction baseAssign(object, source) {\n return object && copyObject(source, keys(source), object);\n}\n\nmodule.exports = baseAssign;\n","var copyObject = require('./_copyObject'),\n keysIn = require('./keysIn');\n\n/**\n * The base implementation of `_.assignIn` without support for multiple sources\n * or `customizer` functions.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @returns {Object} Returns `object`.\n */\nfunction baseAssignIn(object, source) {\n return object && copyObject(source, keysIn(source), object);\n}\n\nmodule.exports = baseAssignIn;\n","var defineProperty = require('./_defineProperty');\n\n/**\n * The base implementation of `assignValue` and `assignMergeValue` without\n * value checks.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction baseAssignValue(object, key, value) {\n if (key == '__proto__' && defineProperty) {\n defineProperty(object, key, {\n 'configurable': true,\n 'enumerable': true,\n 'value': value,\n 'writable': true\n });\n } else {\n object[key] = value;\n }\n}\n\nmodule.exports = baseAssignValue;\n","var Stack = require('./_Stack'),\n arrayEach = require('./_arrayEach'),\n assignValue = require('./_assignValue'),\n baseAssign = require('./_baseAssign'),\n baseAssignIn = require('./_baseAssignIn'),\n cloneBuffer = require('./_cloneBuffer'),\n copyArray = require('./_copyArray'),\n copySymbols = require('./_copySymbols'),\n copySymbolsIn = require('./_copySymbolsIn'),\n getAllKeys = require('./_getAllKeys'),\n getAllKeysIn = require('./_getAllKeysIn'),\n getTag = require('./_getTag'),\n initCloneArray = require('./_initCloneArray'),\n initCloneByTag = require('./_initCloneByTag'),\n initCloneObject = require('./_initCloneObject'),\n isArray = require('./isArray'),\n isBuffer = require('./isBuffer'),\n isMap = require('./isMap'),\n isObject = require('./isObject'),\n isSet = require('./isSet'),\n keys = require('./keys'),\n keysIn = require('./keysIn');\n\n/** Used to compose bitmasks for cloning. */\nvar CLONE_DEEP_FLAG = 1,\n CLONE_FLAT_FLAG = 2,\n CLONE_SYMBOLS_FLAG = 4;\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n arrayTag = '[object Array]',\n boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n errorTag = '[object Error]',\n funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n objectTag = '[object Object]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n symbolTag = '[object Symbol]',\n weakMapTag = '[object WeakMap]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]',\n float32Tag = '[object Float32Array]',\n float64Tag = '[object Float64Array]',\n int8Tag = '[object Int8Array]',\n int16Tag = '[object Int16Array]',\n int32Tag = '[object Int32Array]',\n uint8Tag = '[object Uint8Array]',\n uint8ClampedTag = '[object Uint8ClampedArray]',\n uint16Tag = '[object Uint16Array]',\n uint32Tag = '[object Uint32Array]';\n\n/** Used to identify `toStringTag` values supported by `_.clone`. */\nvar cloneableTags = {};\ncloneableTags[argsTag] = cloneableTags[arrayTag] =\ncloneableTags[arrayBufferTag] = cloneableTags[dataViewTag] =\ncloneableTags[boolTag] = cloneableTags[dateTag] =\ncloneableTags[float32Tag] = cloneableTags[float64Tag] =\ncloneableTags[int8Tag] = cloneableTags[int16Tag] =\ncloneableTags[int32Tag] = cloneableTags[mapTag] =\ncloneableTags[numberTag] = cloneableTags[objectTag] =\ncloneableTags[regexpTag] = cloneableTags[setTag] =\ncloneableTags[stringTag] = cloneableTags[symbolTag] =\ncloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] =\ncloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true;\ncloneableTags[errorTag] = cloneableTags[funcTag] =\ncloneableTags[weakMapTag] = false;\n\n/**\n * The base implementation of `_.clone` and `_.cloneDeep` which tracks\n * traversed objects.\n *\n * @private\n * @param {*} value The value to clone.\n * @param {boolean} bitmask The bitmask flags.\n * 1 - Deep clone\n * 2 - Flatten inherited properties\n * 4 - Clone symbols\n * @param {Function} [customizer] The function to customize cloning.\n * @param {string} [key] The key of `value`.\n * @param {Object} [object] The parent object of `value`.\n * @param {Object} [stack] Tracks traversed objects and their clone counterparts.\n * @returns {*} Returns the cloned value.\n */\nfunction baseClone(value, bitmask, customizer, key, object, stack) {\n var result,\n isDeep = bitmask & CLONE_DEEP_FLAG,\n isFlat = bitmask & CLONE_FLAT_FLAG,\n isFull = bitmask & CLONE_SYMBOLS_FLAG;\n\n if (customizer) {\n result = object ? customizer(value, key, object, stack) : customizer(value);\n }\n if (result !== undefined) {\n return result;\n }\n if (!isObject(value)) {\n return value;\n }\n var isArr = isArray(value);\n if (isArr) {\n result = initCloneArray(value);\n if (!isDeep) {\n return copyArray(value, result);\n }\n } else {\n var tag = getTag(value),\n isFunc = tag == funcTag || tag == genTag;\n\n if (isBuffer(value)) {\n return cloneBuffer(value, isDeep);\n }\n if (tag == objectTag || tag == argsTag || (isFunc && !object)) {\n result = (isFlat || isFunc) ? {} : initCloneObject(value);\n if (!isDeep) {\n return isFlat\n ? copySymbolsIn(value, baseAssignIn(result, value))\n : copySymbols(value, baseAssign(result, value));\n }\n } else {\n if (!cloneableTags[tag]) {\n return object ? value : {};\n }\n result = initCloneByTag(value, tag, isDeep);\n }\n }\n // Check for circular references and return its corresponding clone.\n stack || (stack = new Stack);\n var stacked = stack.get(value);\n if (stacked) {\n return stacked;\n }\n stack.set(value, result);\n\n if (isSet(value)) {\n value.forEach(function(subValue) {\n result.add(baseClone(subValue, bitmask, customizer, subValue, value, stack));\n });\n } else if (isMap(value)) {\n value.forEach(function(subValue, key) {\n result.set(key, baseClone(subValue, bitmask, customizer, key, value, stack));\n });\n }\n\n var keysFunc = isFull\n ? (isFlat ? getAllKeysIn : getAllKeys)\n : (isFlat ? keysIn : keys);\n\n var props = isArr ? undefined : keysFunc(value);\n arrayEach(props || value, function(subValue, key) {\n if (props) {\n key = subValue;\n subValue = value[key];\n }\n // Recursively populate clone (susceptible to call stack limits).\n assignValue(result, key, baseClone(subValue, bitmask, customizer, key, value, stack));\n });\n return result;\n}\n\nmodule.exports = baseClone;\n","var isObject = require('./isObject');\n\n/** Built-in value references. */\nvar objectCreate = Object.create;\n\n/**\n * The base implementation of `_.create` without support for assigning\n * properties to the created object.\n *\n * @private\n * @param {Object} proto The object to inherit from.\n * @returns {Object} Returns the new object.\n */\nvar baseCreate = (function() {\n function object() {}\n return function(proto) {\n if (!isObject(proto)) {\n return {};\n }\n if (objectCreate) {\n return objectCreate(proto);\n }\n object.prototype = proto;\n var result = new object;\n object.prototype = undefined;\n return result;\n };\n}());\n\nmodule.exports = baseCreate;\n","var baseForOwn = require('./_baseForOwn'),\n createBaseEach = require('./_createBaseEach');\n\n/**\n * The base implementation of `_.forEach` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array|Object} Returns `collection`.\n */\nvar baseEach = createBaseEach(baseForOwn);\n\nmodule.exports = baseEach;\n","var createBaseFor = require('./_createBaseFor');\n\n/**\n * The base implementation of `baseForOwn` which iterates over `object`\n * properties returned by `keysFunc` and invokes `iteratee` for each property.\n * Iteratee functions may exit iteration early by explicitly returning `false`.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @returns {Object} Returns `object`.\n */\nvar baseFor = createBaseFor();\n\nmodule.exports = baseFor;\n","var baseFor = require('./_baseFor'),\n keys = require('./keys');\n\n/**\n * The base implementation of `_.forOwn` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Object} Returns `object`.\n */\nfunction baseForOwn(object, iteratee) {\n return object && baseFor(object, iteratee, keys);\n}\n\nmodule.exports = baseForOwn;\n","var castPath = require('./_castPath'),\n toKey = require('./_toKey');\n\n/**\n * The base implementation of `_.get` without support for default values.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @returns {*} Returns the resolved value.\n */\nfunction baseGet(object, path) {\n path = castPath(path, object);\n\n var index = 0,\n length = path.length;\n\n while (object != null && index < length) {\n object = object[toKey(path[index++])];\n }\n return (index && index == length) ? object : undefined;\n}\n\nmodule.exports = baseGet;\n","var arrayPush = require('./_arrayPush'),\n isArray = require('./isArray');\n\n/**\n * The base implementation of `getAllKeys` and `getAllKeysIn` which uses\n * `keysFunc` and `symbolsFunc` to get the enumerable property names and\n * symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @param {Function} symbolsFunc The function to get the symbols of `object`.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction baseGetAllKeys(object, keysFunc, symbolsFunc) {\n var result = keysFunc(object);\n return isArray(object) ? result : arrayPush(result, symbolsFunc(object));\n}\n\nmodule.exports = baseGetAllKeys;\n","var Symbol = require('./_Symbol'),\n getRawTag = require('./_getRawTag'),\n objectToString = require('./_objectToString');\n\n/** `Object#toString` result references. */\nvar nullTag = '[object Null]',\n undefinedTag = '[object Undefined]';\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction baseGetTag(value) {\n if (value == null) {\n return value === undefined ? undefinedTag : nullTag;\n }\n return (symToStringTag && symToStringTag in Object(value))\n ? getRawTag(value)\n : objectToString(value);\n}\n\nmodule.exports = baseGetTag;\n","/**\n * The base implementation of `_.hasIn` without support for deep paths.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {Array|string} key The key to check.\n * @returns {boolean} Returns `true` if `key` exists, else `false`.\n */\nfunction baseHasIn(object, key) {\n return object != null && key in Object(object);\n}\n\nmodule.exports = baseHasIn;\n","var baseGetTag = require('./_baseGetTag'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]';\n\n/**\n * The base implementation of `_.isArguments`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n */\nfunction baseIsArguments(value) {\n return isObjectLike(value) && baseGetTag(value) == argsTag;\n}\n\nmodule.exports = baseIsArguments;\n","var baseIsEqualDeep = require('./_baseIsEqualDeep'),\n isObjectLike = require('./isObjectLike');\n\n/**\n * The base implementation of `_.isEqual` which supports partial comparisons\n * and tracks traversed objects.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @param {boolean} bitmask The bitmask flags.\n * 1 - Unordered comparison\n * 2 - Partial comparison\n * @param {Function} [customizer] The function to customize comparisons.\n * @param {Object} [stack] Tracks traversed `value` and `other` objects.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n */\nfunction baseIsEqual(value, other, bitmask, customizer, stack) {\n if (value === other) {\n return true;\n }\n if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) {\n return value !== value && other !== other;\n }\n return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);\n}\n\nmodule.exports = baseIsEqual;\n","var Stack = require('./_Stack'),\n equalArrays = require('./_equalArrays'),\n equalByTag = require('./_equalByTag'),\n equalObjects = require('./_equalObjects'),\n getTag = require('./_getTag'),\n isArray = require('./isArray'),\n isBuffer = require('./isBuffer'),\n isTypedArray = require('./isTypedArray');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1;\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n arrayTag = '[object Array]',\n objectTag = '[object Object]';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * A specialized version of `baseIsEqual` for arrays and objects which performs\n * deep comparisons and tracks traversed objects enabling objects with circular\n * references to be compared.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} [stack] Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {\n var objIsArr = isArray(object),\n othIsArr = isArray(other),\n objTag = objIsArr ? arrayTag : getTag(object),\n othTag = othIsArr ? arrayTag : getTag(other);\n\n objTag = objTag == argsTag ? objectTag : objTag;\n othTag = othTag == argsTag ? objectTag : othTag;\n\n var objIsObj = objTag == objectTag,\n othIsObj = othTag == objectTag,\n isSameTag = objTag == othTag;\n\n if (isSameTag && isBuffer(object)) {\n if (!isBuffer(other)) {\n return false;\n }\n objIsArr = true;\n objIsObj = false;\n }\n if (isSameTag && !objIsObj) {\n stack || (stack = new Stack);\n return (objIsArr || isTypedArray(object))\n ? equalArrays(object, other, bitmask, customizer, equalFunc, stack)\n : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);\n }\n if (!(bitmask & COMPARE_PARTIAL_FLAG)) {\n var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),\n othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');\n\n if (objIsWrapped || othIsWrapped) {\n var objUnwrapped = objIsWrapped ? object.value() : object,\n othUnwrapped = othIsWrapped ? other.value() : other;\n\n stack || (stack = new Stack);\n return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);\n }\n }\n if (!isSameTag) {\n return false;\n }\n stack || (stack = new Stack);\n return equalObjects(object, other, bitmask, customizer, equalFunc, stack);\n}\n\nmodule.exports = baseIsEqualDeep;\n","var getTag = require('./_getTag'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar mapTag = '[object Map]';\n\n/**\n * The base implementation of `_.isMap` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a map, else `false`.\n */\nfunction baseIsMap(value) {\n return isObjectLike(value) && getTag(value) == mapTag;\n}\n\nmodule.exports = baseIsMap;\n","var Stack = require('./_Stack'),\n baseIsEqual = require('./_baseIsEqual');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n COMPARE_UNORDERED_FLAG = 2;\n\n/**\n * The base implementation of `_.isMatch` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The object to inspect.\n * @param {Object} source The object of property values to match.\n * @param {Array} matchData The property names, values, and compare flags to match.\n * @param {Function} [customizer] The function to customize comparisons.\n * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n */\nfunction baseIsMatch(object, source, matchData, customizer) {\n var index = matchData.length,\n length = index,\n noCustomizer = !customizer;\n\n if (object == null) {\n return !length;\n }\n object = Object(object);\n while (index--) {\n var data = matchData[index];\n if ((noCustomizer && data[2])\n ? data[1] !== object[data[0]]\n : !(data[0] in object)\n ) {\n return false;\n }\n }\n while (++index < length) {\n data = matchData[index];\n var key = data[0],\n objValue = object[key],\n srcValue = data[1];\n\n if (noCustomizer && data[2]) {\n if (objValue === undefined && !(key in object)) {\n return false;\n }\n } else {\n var stack = new Stack;\n if (customizer) {\n var result = customizer(objValue, srcValue, key, object, source, stack);\n }\n if (!(result === undefined\n ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG, customizer, stack)\n : result\n )) {\n return false;\n }\n }\n }\n return true;\n}\n\nmodule.exports = baseIsMatch;\n","var isFunction = require('./isFunction'),\n isMasked = require('./_isMasked'),\n isObject = require('./isObject'),\n toSource = require('./_toSource');\n\n/**\n * Used to match `RegExp`\n * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n */\nvar reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g;\n\n/** Used to detect host constructors (Safari). */\nvar reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n/** Used for built-in method references. */\nvar funcProto = Function.prototype,\n objectProto = Object.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Used to detect if a method is native. */\nvar reIsNative = RegExp('^' +\n funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&')\n .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n);\n\n/**\n * The base implementation of `_.isNative` without bad shim checks.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function,\n * else `false`.\n */\nfunction baseIsNative(value) {\n if (!isObject(value) || isMasked(value)) {\n return false;\n }\n var pattern = isFunction(value) ? reIsNative : reIsHostCtor;\n return pattern.test(toSource(value));\n}\n\nmodule.exports = baseIsNative;\n","var getTag = require('./_getTag'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar setTag = '[object Set]';\n\n/**\n * The base implementation of `_.isSet` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a set, else `false`.\n */\nfunction baseIsSet(value) {\n return isObjectLike(value) && getTag(value) == setTag;\n}\n\nmodule.exports = baseIsSet;\n","var baseGetTag = require('./_baseGetTag'),\n isLength = require('./isLength'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n arrayTag = '[object Array]',\n boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n errorTag = '[object Error]',\n funcTag = '[object Function]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n objectTag = '[object Object]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n weakMapTag = '[object WeakMap]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]',\n float32Tag = '[object Float32Array]',\n float64Tag = '[object Float64Array]',\n int8Tag = '[object Int8Array]',\n int16Tag = '[object Int16Array]',\n int32Tag = '[object Int32Array]',\n uint8Tag = '[object Uint8Array]',\n uint8ClampedTag = '[object Uint8ClampedArray]',\n uint16Tag = '[object Uint16Array]',\n uint32Tag = '[object Uint32Array]';\n\n/** Used to identify `toStringTag` values of typed arrays. */\nvar typedArrayTags = {};\ntypedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\ntypedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\ntypedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\ntypedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\ntypedArrayTags[uint32Tag] = true;\ntypedArrayTags[argsTag] = typedArrayTags[arrayTag] =\ntypedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\ntypedArrayTags[dataViewTag] = typedArrayTags[dateTag] =\ntypedArrayTags[errorTag] = typedArrayTags[funcTag] =\ntypedArrayTags[mapTag] = typedArrayTags[numberTag] =\ntypedArrayTags[objectTag] = typedArrayTags[regexpTag] =\ntypedArrayTags[setTag] = typedArrayTags[stringTag] =\ntypedArrayTags[weakMapTag] = false;\n\n/**\n * The base implementation of `_.isTypedArray` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n */\nfunction baseIsTypedArray(value) {\n return isObjectLike(value) &&\n isLength(value.length) && !!typedArrayTags[baseGetTag(value)];\n}\n\nmodule.exports = baseIsTypedArray;\n","var baseMatches = require('./_baseMatches'),\n baseMatchesProperty = require('./_baseMatchesProperty'),\n identity = require('./identity'),\n isArray = require('./isArray'),\n property = require('./property');\n\n/**\n * The base implementation of `_.iteratee`.\n *\n * @private\n * @param {*} [value=_.identity] The value to convert to an iteratee.\n * @returns {Function} Returns the iteratee.\n */\nfunction baseIteratee(value) {\n // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9.\n // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details.\n if (typeof value == 'function') {\n return value;\n }\n if (value == null) {\n return identity;\n }\n if (typeof value == 'object') {\n return isArray(value)\n ? baseMatchesProperty(value[0], value[1])\n : baseMatches(value);\n }\n return property(value);\n}\n\nmodule.exports = baseIteratee;\n","var isPrototype = require('./_isPrototype'),\n nativeKeys = require('./_nativeKeys');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction baseKeys(object) {\n if (!isPrototype(object)) {\n return nativeKeys(object);\n }\n var result = [];\n for (var key in Object(object)) {\n if (hasOwnProperty.call(object, key) && key != 'constructor') {\n result.push(key);\n }\n }\n return result;\n}\n\nmodule.exports = baseKeys;\n","var isObject = require('./isObject'),\n isPrototype = require('./_isPrototype'),\n nativeKeysIn = require('./_nativeKeysIn');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction baseKeysIn(object) {\n if (!isObject(object)) {\n return nativeKeysIn(object);\n }\n var isProto = isPrototype(object),\n result = [];\n\n for (var key in object) {\n if (!(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {\n result.push(key);\n }\n }\n return result;\n}\n\nmodule.exports = baseKeysIn;\n","var baseEach = require('./_baseEach'),\n isArrayLike = require('./isArrayLike');\n\n/**\n * The base implementation of `_.map` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */\nfunction baseMap(collection, iteratee) {\n var index = -1,\n result = isArrayLike(collection) ? Array(collection.length) : [];\n\n baseEach(collection, function(value, key, collection) {\n result[++index] = iteratee(value, key, collection);\n });\n return result;\n}\n\nmodule.exports = baseMap;\n","var baseIsMatch = require('./_baseIsMatch'),\n getMatchData = require('./_getMatchData'),\n matchesStrictComparable = require('./_matchesStrictComparable');\n\n/**\n * The base implementation of `_.matches` which doesn't clone `source`.\n *\n * @private\n * @param {Object} source The object of property values to match.\n * @returns {Function} Returns the new spec function.\n */\nfunction baseMatches(source) {\n var matchData = getMatchData(source);\n if (matchData.length == 1 && matchData[0][2]) {\n return matchesStrictComparable(matchData[0][0], matchData[0][1]);\n }\n return function(object) {\n return object === source || baseIsMatch(object, source, matchData);\n };\n}\n\nmodule.exports = baseMatches;\n","var baseIsEqual = require('./_baseIsEqual'),\n get = require('./get'),\n hasIn = require('./hasIn'),\n isKey = require('./_isKey'),\n isStrictComparable = require('./_isStrictComparable'),\n matchesStrictComparable = require('./_matchesStrictComparable'),\n toKey = require('./_toKey');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n COMPARE_UNORDERED_FLAG = 2;\n\n/**\n * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`.\n *\n * @private\n * @param {string} path The path of the property to get.\n * @param {*} srcValue The value to match.\n * @returns {Function} Returns the new spec function.\n */\nfunction baseMatchesProperty(path, srcValue) {\n if (isKey(path) && isStrictComparable(srcValue)) {\n return matchesStrictComparable(toKey(path), srcValue);\n }\n return function(object) {\n var objValue = get(object, path);\n return (objValue === undefined && objValue === srcValue)\n ? hasIn(object, path)\n : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG);\n };\n}\n\nmodule.exports = baseMatchesProperty;\n","/**\n * The base implementation of `_.property` without support for deep paths.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @returns {Function} Returns the new accessor function.\n */\nfunction baseProperty(key) {\n return function(object) {\n return object == null ? undefined : object[key];\n };\n}\n\nmodule.exports = baseProperty;\n","var baseGet = require('./_baseGet');\n\n/**\n * A specialized version of `baseProperty` which supports deep paths.\n *\n * @private\n * @param {Array|string} path The path of the property to get.\n * @returns {Function} Returns the new accessor function.\n */\nfunction basePropertyDeep(path) {\n return function(object) {\n return baseGet(object, path);\n };\n}\n\nmodule.exports = basePropertyDeep;\n","/**\n * The base implementation of `_.propertyOf` without support for deep paths.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Function} Returns the new accessor function.\n */\nfunction basePropertyOf(object) {\n return function(key) {\n return object == null ? undefined : object[key];\n };\n}\n\nmodule.exports = basePropertyOf;\n","/**\n * The base implementation of `_.slice` without an iteratee call guard.\n *\n * @private\n * @param {Array} array The array to slice.\n * @param {number} [start=0] The start position.\n * @param {number} [end=array.length] The end position.\n * @returns {Array} Returns the slice of `array`.\n */\nfunction baseSlice(array, start, end) {\n var index = -1,\n length = array.length;\n\n if (start < 0) {\n start = -start > length ? 0 : (length + start);\n }\n end = end > length ? length : end;\n if (end < 0) {\n end += length;\n }\n length = start > end ? 0 : ((end - start) >>> 0);\n start >>>= 0;\n\n var result = Array(length);\n while (++index < length) {\n result[index] = array[index + start];\n }\n return result;\n}\n\nmodule.exports = baseSlice;\n","/**\n * The base implementation of `_.times` without support for iteratee shorthands\n * or max array length checks.\n *\n * @private\n * @param {number} n The number of times to invoke `iteratee`.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the array of results.\n */\nfunction baseTimes(n, iteratee) {\n var index = -1,\n result = Array(n);\n\n while (++index < n) {\n result[index] = iteratee(index);\n }\n return result;\n}\n\nmodule.exports = baseTimes;\n","var Symbol = require('./_Symbol'),\n arrayMap = require('./_arrayMap'),\n isArray = require('./isArray'),\n isSymbol = require('./isSymbol');\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n symbolToString = symbolProto ? symbolProto.toString : undefined;\n\n/**\n * The base implementation of `_.toString` which doesn't convert nullish\n * values to empty strings.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {string} Returns the string.\n */\nfunction baseToString(value) {\n // Exit early for strings to avoid a performance hit in some environments.\n if (typeof value == 'string') {\n return value;\n }\n if (isArray(value)) {\n // Recursively convert values (susceptible to call stack limits).\n return arrayMap(value, baseToString) + '';\n }\n if (isSymbol(value)) {\n return symbolToString ? symbolToString.call(value) : '';\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\nmodule.exports = baseToString;\n","var trimmedEndIndex = require('./_trimmedEndIndex');\n\n/** Used to match leading whitespace. */\nvar reTrimStart = /^\\s+/;\n\n/**\n * The base implementation of `_.trim`.\n *\n * @private\n * @param {string} string The string to trim.\n * @returns {string} Returns the trimmed string.\n */\nfunction baseTrim(string) {\n return string\n ? string.slice(0, trimmedEndIndex(string) + 1).replace(reTrimStart, '')\n : string;\n}\n\nmodule.exports = baseTrim;\n","/**\n * The base implementation of `_.unary` without support for storing metadata.\n *\n * @private\n * @param {Function} func The function to cap arguments for.\n * @returns {Function} Returns the new capped function.\n */\nfunction baseUnary(func) {\n return function(value) {\n return func(value);\n };\n}\n\nmodule.exports = baseUnary;\n","/**\n * Checks if a `cache` value for `key` exists.\n *\n * @private\n * @param {Object} cache The cache to query.\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction cacheHas(cache, key) {\n return cache.has(key);\n}\n\nmodule.exports = cacheHas;\n","var identity = require('./identity');\n\n/**\n * Casts `value` to `identity` if it's not a function.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {Function} Returns cast function.\n */\nfunction castFunction(value) {\n return typeof value == 'function' ? value : identity;\n}\n\nmodule.exports = castFunction;\n","var isArray = require('./isArray'),\n isKey = require('./_isKey'),\n stringToPath = require('./_stringToPath'),\n toString = require('./toString');\n\n/**\n * Casts `value` to a path array if it's not one.\n *\n * @private\n * @param {*} value The value to inspect.\n * @param {Object} [object] The object to query keys on.\n * @returns {Array} Returns the cast property path array.\n */\nfunction castPath(value, object) {\n if (isArray(value)) {\n return value;\n }\n return isKey(value, object) ? [value] : stringToPath(toString(value));\n}\n\nmodule.exports = castPath;\n","var baseSlice = require('./_baseSlice');\n\n/**\n * Casts `array` to a slice if it's needed.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {number} start The start position.\n * @param {number} [end=array.length] The end position.\n * @returns {Array} Returns the cast slice.\n */\nfunction castSlice(array, start, end) {\n var length = array.length;\n end = end === undefined ? length : end;\n return (!start && end >= length) ? array : baseSlice(array, start, end);\n}\n\nmodule.exports = castSlice;\n","var Uint8Array = require('./_Uint8Array');\n\n/**\n * Creates a clone of `arrayBuffer`.\n *\n * @private\n * @param {ArrayBuffer} arrayBuffer The array buffer to clone.\n * @returns {ArrayBuffer} Returns the cloned array buffer.\n */\nfunction cloneArrayBuffer(arrayBuffer) {\n var result = new arrayBuffer.constructor(arrayBuffer.byteLength);\n new Uint8Array(result).set(new Uint8Array(arrayBuffer));\n return result;\n}\n\nmodule.exports = cloneArrayBuffer;\n","var root = require('./_root');\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Built-in value references. */\nvar Buffer = moduleExports ? root.Buffer : undefined,\n allocUnsafe = Buffer ? Buffer.allocUnsafe : undefined;\n\n/**\n * Creates a clone of `buffer`.\n *\n * @private\n * @param {Buffer} buffer The buffer to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Buffer} Returns the cloned buffer.\n */\nfunction cloneBuffer(buffer, isDeep) {\n if (isDeep) {\n return buffer.slice();\n }\n var length = buffer.length,\n result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length);\n\n buffer.copy(result);\n return result;\n}\n\nmodule.exports = cloneBuffer;\n","var cloneArrayBuffer = require('./_cloneArrayBuffer');\n\n/**\n * Creates a clone of `dataView`.\n *\n * @private\n * @param {Object} dataView The data view to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the cloned data view.\n */\nfunction cloneDataView(dataView, isDeep) {\n var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer;\n return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength);\n}\n\nmodule.exports = cloneDataView;\n","/** Used to match `RegExp` flags from their coerced string values. */\nvar reFlags = /\\w*$/;\n\n/**\n * Creates a clone of `regexp`.\n *\n * @private\n * @param {Object} regexp The regexp to clone.\n * @returns {Object} Returns the cloned regexp.\n */\nfunction cloneRegExp(regexp) {\n var result = new regexp.constructor(regexp.source, reFlags.exec(regexp));\n result.lastIndex = regexp.lastIndex;\n return result;\n}\n\nmodule.exports = cloneRegExp;\n","var Symbol = require('./_Symbol');\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n symbolValueOf = symbolProto ? symbolProto.valueOf : undefined;\n\n/**\n * Creates a clone of the `symbol` object.\n *\n * @private\n * @param {Object} symbol The symbol object to clone.\n * @returns {Object} Returns the cloned symbol object.\n */\nfunction cloneSymbol(symbol) {\n return symbolValueOf ? Object(symbolValueOf.call(symbol)) : {};\n}\n\nmodule.exports = cloneSymbol;\n","var cloneArrayBuffer = require('./_cloneArrayBuffer');\n\n/**\n * Creates a clone of `typedArray`.\n *\n * @private\n * @param {Object} typedArray The typed array to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the cloned typed array.\n */\nfunction cloneTypedArray(typedArray, isDeep) {\n var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;\n return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length);\n}\n\nmodule.exports = cloneTypedArray;\n","/**\n * Copies the values of `source` to `array`.\n *\n * @private\n * @param {Array} source The array to copy values from.\n * @param {Array} [array=[]] The array to copy values to.\n * @returns {Array} Returns `array`.\n */\nfunction copyArray(source, array) {\n var index = -1,\n length = source.length;\n\n array || (array = Array(length));\n while (++index < length) {\n array[index] = source[index];\n }\n return array;\n}\n\nmodule.exports = copyArray;\n","var assignValue = require('./_assignValue'),\n baseAssignValue = require('./_baseAssignValue');\n\n/**\n * Copies properties of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy properties from.\n * @param {Array} props The property identifiers to copy.\n * @param {Object} [object={}] The object to copy properties to.\n * @param {Function} [customizer] The function to customize copied values.\n * @returns {Object} Returns `object`.\n */\nfunction copyObject(source, props, object, customizer) {\n var isNew = !object;\n object || (object = {});\n\n var index = -1,\n length = props.length;\n\n while (++index < length) {\n var key = props[index];\n\n var newValue = customizer\n ? customizer(object[key], source[key], key, object, source)\n : undefined;\n\n if (newValue === undefined) {\n newValue = source[key];\n }\n if (isNew) {\n baseAssignValue(object, key, newValue);\n } else {\n assignValue(object, key, newValue);\n }\n }\n return object;\n}\n\nmodule.exports = copyObject;\n","var copyObject = require('./_copyObject'),\n getSymbols = require('./_getSymbols');\n\n/**\n * Copies own symbols of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy symbols from.\n * @param {Object} [object={}] The object to copy symbols to.\n * @returns {Object} Returns `object`.\n */\nfunction copySymbols(source, object) {\n return copyObject(source, getSymbols(source), object);\n}\n\nmodule.exports = copySymbols;\n","var copyObject = require('./_copyObject'),\n getSymbolsIn = require('./_getSymbolsIn');\n\n/**\n * Copies own and inherited symbols of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy symbols from.\n * @param {Object} [object={}] The object to copy symbols to.\n * @returns {Object} Returns `object`.\n */\nfunction copySymbolsIn(source, object) {\n return copyObject(source, getSymbolsIn(source), object);\n}\n\nmodule.exports = copySymbolsIn;\n","var root = require('./_root');\n\n/** Used to detect overreaching core-js shims. */\nvar coreJsData = root['__core-js_shared__'];\n\nmodule.exports = coreJsData;\n","var isArrayLike = require('./isArrayLike');\n\n/**\n * Creates a `baseEach` or `baseEachRight` function.\n *\n * @private\n * @param {Function} eachFunc The function to iterate over a collection.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new base function.\n */\nfunction createBaseEach(eachFunc, fromRight) {\n return function(collection, iteratee) {\n if (collection == null) {\n return collection;\n }\n if (!isArrayLike(collection)) {\n return eachFunc(collection, iteratee);\n }\n var length = collection.length,\n index = fromRight ? length : -1,\n iterable = Object(collection);\n\n while ((fromRight ? index-- : ++index < length)) {\n if (iteratee(iterable[index], index, iterable) === false) {\n break;\n }\n }\n return collection;\n };\n}\n\nmodule.exports = createBaseEach;\n","/**\n * Creates a base function for methods like `_.forIn` and `_.forOwn`.\n *\n * @private\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new base function.\n */\nfunction createBaseFor(fromRight) {\n return function(object, iteratee, keysFunc) {\n var index = -1,\n iterable = Object(object),\n props = keysFunc(object),\n length = props.length;\n\n while (length--) {\n var key = props[fromRight ? length : ++index];\n if (iteratee(iterable[key], key, iterable) === false) {\n break;\n }\n }\n return object;\n };\n}\n\nmodule.exports = createBaseFor;\n","var castSlice = require('./_castSlice'),\n hasUnicode = require('./_hasUnicode'),\n stringToArray = require('./_stringToArray'),\n toString = require('./toString');\n\n/**\n * Creates a function like `_.lowerFirst`.\n *\n * @private\n * @param {string} methodName The name of the `String` case method to use.\n * @returns {Function} Returns the new case function.\n */\nfunction createCaseFirst(methodName) {\n return function(string) {\n string = toString(string);\n\n var strSymbols = hasUnicode(string)\n ? stringToArray(string)\n : undefined;\n\n var chr = strSymbols\n ? strSymbols[0]\n : string.charAt(0);\n\n var trailing = strSymbols\n ? castSlice(strSymbols, 1).join('')\n : string.slice(1);\n\n return chr[methodName]() + trailing;\n };\n}\n\nmodule.exports = createCaseFirst;\n","var arrayReduce = require('./_arrayReduce'),\n deburr = require('./deburr'),\n words = require('./words');\n\n/** Used to compose unicode capture groups. */\nvar rsApos = \"['\\u2019]\";\n\n/** Used to match apostrophes. */\nvar reApos = RegExp(rsApos, 'g');\n\n/**\n * Creates a function like `_.camelCase`.\n *\n * @private\n * @param {Function} callback The function to combine each word.\n * @returns {Function} Returns the new compounder function.\n */\nfunction createCompounder(callback) {\n return function(string) {\n return arrayReduce(words(deburr(string).replace(reApos, '')), callback, '');\n };\n}\n\nmodule.exports = createCompounder;\n","var basePropertyOf = require('./_basePropertyOf');\n\n/** Used to map Latin Unicode letters to basic Latin letters. */\nvar deburredLetters = {\n // Latin-1 Supplement block.\n '\\xc0': 'A', '\\xc1': 'A', '\\xc2': 'A', '\\xc3': 'A', '\\xc4': 'A', '\\xc5': 'A',\n '\\xe0': 'a', '\\xe1': 'a', '\\xe2': 'a', '\\xe3': 'a', '\\xe4': 'a', '\\xe5': 'a',\n '\\xc7': 'C', '\\xe7': 'c',\n '\\xd0': 'D', '\\xf0': 'd',\n '\\xc8': 'E', '\\xc9': 'E', '\\xca': 'E', '\\xcb': 'E',\n '\\xe8': 'e', '\\xe9': 'e', '\\xea': 'e', '\\xeb': 'e',\n '\\xcc': 'I', '\\xcd': 'I', '\\xce': 'I', '\\xcf': 'I',\n '\\xec': 'i', '\\xed': 'i', '\\xee': 'i', '\\xef': 'i',\n '\\xd1': 'N', '\\xf1': 'n',\n '\\xd2': 'O', '\\xd3': 'O', '\\xd4': 'O', '\\xd5': 'O', '\\xd6': 'O', '\\xd8': 'O',\n '\\xf2': 'o', '\\xf3': 'o', '\\xf4': 'o', '\\xf5': 'o', '\\xf6': 'o', '\\xf8': 'o',\n '\\xd9': 'U', '\\xda': 'U', '\\xdb': 'U', '\\xdc': 'U',\n '\\xf9': 'u', '\\xfa': 'u', '\\xfb': 'u', '\\xfc': 'u',\n '\\xdd': 'Y', '\\xfd': 'y', '\\xff': 'y',\n '\\xc6': 'Ae', '\\xe6': 'ae',\n '\\xde': 'Th', '\\xfe': 'th',\n '\\xdf': 'ss',\n // Latin Extended-A block.\n '\\u0100': 'A', '\\u0102': 'A', '\\u0104': 'A',\n '\\u0101': 'a', '\\u0103': 'a', '\\u0105': 'a',\n '\\u0106': 'C', '\\u0108': 'C', '\\u010a': 'C', '\\u010c': 'C',\n '\\u0107': 'c', '\\u0109': 'c', '\\u010b': 'c', '\\u010d': 'c',\n '\\u010e': 'D', '\\u0110': 'D', '\\u010f': 'd', '\\u0111': 'd',\n '\\u0112': 'E', '\\u0114': 'E', '\\u0116': 'E', '\\u0118': 'E', '\\u011a': 'E',\n '\\u0113': 'e', '\\u0115': 'e', '\\u0117': 'e', '\\u0119': 'e', '\\u011b': 'e',\n '\\u011c': 'G', '\\u011e': 'G', '\\u0120': 'G', '\\u0122': 'G',\n '\\u011d': 'g', '\\u011f': 'g', '\\u0121': 'g', '\\u0123': 'g',\n '\\u0124': 'H', '\\u0126': 'H', '\\u0125': 'h', '\\u0127': 'h',\n '\\u0128': 'I', '\\u012a': 'I', '\\u012c': 'I', '\\u012e': 'I', '\\u0130': 'I',\n '\\u0129': 'i', '\\u012b': 'i', '\\u012d': 'i', '\\u012f': 'i', '\\u0131': 'i',\n '\\u0134': 'J', '\\u0135': 'j',\n '\\u0136': 'K', '\\u0137': 'k', '\\u0138': 'k',\n '\\u0139': 'L', '\\u013b': 'L', '\\u013d': 'L', '\\u013f': 'L', '\\u0141': 'L',\n '\\u013a': 'l', '\\u013c': 'l', '\\u013e': 'l', '\\u0140': 'l', '\\u0142': 'l',\n '\\u0143': 'N', '\\u0145': 'N', '\\u0147': 'N', '\\u014a': 'N',\n '\\u0144': 'n', '\\u0146': 'n', '\\u0148': 'n', '\\u014b': 'n',\n '\\u014c': 'O', '\\u014e': 'O', '\\u0150': 'O',\n '\\u014d': 'o', '\\u014f': 'o', '\\u0151': 'o',\n '\\u0154': 'R', '\\u0156': 'R', '\\u0158': 'R',\n '\\u0155': 'r', '\\u0157': 'r', '\\u0159': 'r',\n '\\u015a': 'S', '\\u015c': 'S', '\\u015e': 'S', '\\u0160': 'S',\n '\\u015b': 's', '\\u015d': 's', '\\u015f': 's', '\\u0161': 's',\n '\\u0162': 'T', '\\u0164': 'T', '\\u0166': 'T',\n '\\u0163': 't', '\\u0165': 't', '\\u0167': 't',\n '\\u0168': 'U', '\\u016a': 'U', '\\u016c': 'U', '\\u016e': 'U', '\\u0170': 'U', '\\u0172': 'U',\n '\\u0169': 'u', '\\u016b': 'u', '\\u016d': 'u', '\\u016f': 'u', '\\u0171': 'u', '\\u0173': 'u',\n '\\u0174': 'W', '\\u0175': 'w',\n '\\u0176': 'Y', '\\u0177': 'y', '\\u0178': 'Y',\n '\\u0179': 'Z', '\\u017b': 'Z', '\\u017d': 'Z',\n '\\u017a': 'z', '\\u017c': 'z', '\\u017e': 'z',\n '\\u0132': 'IJ', '\\u0133': 'ij',\n '\\u0152': 'Oe', '\\u0153': 'oe',\n '\\u0149': \"'n\", '\\u017f': 's'\n};\n\n/**\n * Used by `_.deburr` to convert Latin-1 Supplement and Latin Extended-A\n * letters to basic Latin letters.\n *\n * @private\n * @param {string} letter The matched letter to deburr.\n * @returns {string} Returns the deburred letter.\n */\nvar deburrLetter = basePropertyOf(deburredLetters);\n\nmodule.exports = deburrLetter;\n","var getNative = require('./_getNative');\n\nvar defineProperty = (function() {\n try {\n var func = getNative(Object, 'defineProperty');\n func({}, '', {});\n return func;\n } catch (e) {}\n}());\n\nmodule.exports = defineProperty;\n","var SetCache = require('./_SetCache'),\n arraySome = require('./_arraySome'),\n cacheHas = require('./_cacheHas');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n COMPARE_UNORDERED_FLAG = 2;\n\n/**\n * A specialized version of `baseIsEqualDeep` for arrays with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Array} array The array to compare.\n * @param {Array} other The other array to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `array` and `other` objects.\n * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.\n */\nfunction equalArrays(array, other, bitmask, customizer, equalFunc, stack) {\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n arrLength = array.length,\n othLength = other.length;\n\n if (arrLength != othLength && !(isPartial && othLength > arrLength)) {\n return false;\n }\n // Check that cyclic values are equal.\n var arrStacked = stack.get(array);\n var othStacked = stack.get(other);\n if (arrStacked && othStacked) {\n return arrStacked == other && othStacked == array;\n }\n var index = -1,\n result = true,\n seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined;\n\n stack.set(array, other);\n stack.set(other, array);\n\n // Ignore non-index properties.\n while (++index < arrLength) {\n var arrValue = array[index],\n othValue = other[index];\n\n if (customizer) {\n var compared = isPartial\n ? customizer(othValue, arrValue, index, other, array, stack)\n : customizer(arrValue, othValue, index, array, other, stack);\n }\n if (compared !== undefined) {\n if (compared) {\n continue;\n }\n result = false;\n break;\n }\n // Recursively compare arrays (susceptible to call stack limits).\n if (seen) {\n if (!arraySome(other, function(othValue, othIndex) {\n if (!cacheHas(seen, othIndex) &&\n (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {\n return seen.push(othIndex);\n }\n })) {\n result = false;\n break;\n }\n } else if (!(\n arrValue === othValue ||\n equalFunc(arrValue, othValue, bitmask, customizer, stack)\n )) {\n result = false;\n break;\n }\n }\n stack['delete'](array);\n stack['delete'](other);\n return result;\n}\n\nmodule.exports = equalArrays;\n","var Symbol = require('./_Symbol'),\n Uint8Array = require('./_Uint8Array'),\n eq = require('./eq'),\n equalArrays = require('./_equalArrays'),\n mapToArray = require('./_mapToArray'),\n setToArray = require('./_setToArray');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n COMPARE_UNORDERED_FLAG = 2;\n\n/** `Object#toString` result references. */\nvar boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n errorTag = '[object Error]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n symbolTag = '[object Symbol]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]';\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n symbolValueOf = symbolProto ? symbolProto.valueOf : undefined;\n\n/**\n * A specialized version of `baseIsEqualDeep` for comparing objects of\n * the same `toStringTag`.\n *\n * **Note:** This function only supports comparing values with tags of\n * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {string} tag The `toStringTag` of the objects to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {\n switch (tag) {\n case dataViewTag:\n if ((object.byteLength != other.byteLength) ||\n (object.byteOffset != other.byteOffset)) {\n return false;\n }\n object = object.buffer;\n other = other.buffer;\n\n case arrayBufferTag:\n if ((object.byteLength != other.byteLength) ||\n !equalFunc(new Uint8Array(object), new Uint8Array(other))) {\n return false;\n }\n return true;\n\n case boolTag:\n case dateTag:\n case numberTag:\n // Coerce booleans to `1` or `0` and dates to milliseconds.\n // Invalid dates are coerced to `NaN`.\n return eq(+object, +other);\n\n case errorTag:\n return object.name == other.name && object.message == other.message;\n\n case regexpTag:\n case stringTag:\n // Coerce regexes to strings and treat strings, primitives and objects,\n // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring\n // for more details.\n return object == (other + '');\n\n case mapTag:\n var convert = mapToArray;\n\n case setTag:\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG;\n convert || (convert = setToArray);\n\n if (object.size != other.size && !isPartial) {\n return false;\n }\n // Assume cyclic values are equal.\n var stacked = stack.get(object);\n if (stacked) {\n return stacked == other;\n }\n bitmask |= COMPARE_UNORDERED_FLAG;\n\n // Recursively compare objects (susceptible to call stack limits).\n stack.set(object, other);\n var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack);\n stack['delete'](object);\n return result;\n\n case symbolTag:\n if (symbolValueOf) {\n return symbolValueOf.call(object) == symbolValueOf.call(other);\n }\n }\n return false;\n}\n\nmodule.exports = equalByTag;\n","var getAllKeys = require('./_getAllKeys');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1;\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * A specialized version of `baseIsEqualDeep` for objects with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction equalObjects(object, other, bitmask, customizer, equalFunc, stack) {\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n objProps = getAllKeys(object),\n objLength = objProps.length,\n othProps = getAllKeys(other),\n othLength = othProps.length;\n\n if (objLength != othLength && !isPartial) {\n return false;\n }\n var index = objLength;\n while (index--) {\n var key = objProps[index];\n if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) {\n return false;\n }\n }\n // Check that cyclic values are equal.\n var objStacked = stack.get(object);\n var othStacked = stack.get(other);\n if (objStacked && othStacked) {\n return objStacked == other && othStacked == object;\n }\n var result = true;\n stack.set(object, other);\n stack.set(other, object);\n\n var skipCtor = isPartial;\n while (++index < objLength) {\n key = objProps[index];\n var objValue = object[key],\n othValue = other[key];\n\n if (customizer) {\n var compared = isPartial\n ? customizer(othValue, objValue, key, other, object, stack)\n : customizer(objValue, othValue, key, object, other, stack);\n }\n // Recursively compare objects (susceptible to call stack limits).\n if (!(compared === undefined\n ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack))\n : compared\n )) {\n result = false;\n break;\n }\n skipCtor || (skipCtor = key == 'constructor');\n }\n if (result && !skipCtor) {\n var objCtor = object.constructor,\n othCtor = other.constructor;\n\n // Non `Object` object instances with different constructors are not equal.\n if (objCtor != othCtor &&\n ('constructor' in object && 'constructor' in other) &&\n !(typeof objCtor == 'function' && objCtor instanceof objCtor &&\n typeof othCtor == 'function' && othCtor instanceof othCtor)) {\n result = false;\n }\n }\n stack['delete'](object);\n stack['delete'](other);\n return result;\n}\n\nmodule.exports = equalObjects;\n","/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\nmodule.exports = freeGlobal;\n","var baseGetAllKeys = require('./_baseGetAllKeys'),\n getSymbols = require('./_getSymbols'),\n keys = require('./keys');\n\n/**\n * Creates an array of own enumerable property names and symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction getAllKeys(object) {\n return baseGetAllKeys(object, keys, getSymbols);\n}\n\nmodule.exports = getAllKeys;\n","var baseGetAllKeys = require('./_baseGetAllKeys'),\n getSymbolsIn = require('./_getSymbolsIn'),\n keysIn = require('./keysIn');\n\n/**\n * Creates an array of own and inherited enumerable property names and\n * symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction getAllKeysIn(object) {\n return baseGetAllKeys(object, keysIn, getSymbolsIn);\n}\n\nmodule.exports = getAllKeysIn;\n","var isKeyable = require('./_isKeyable');\n\n/**\n * Gets the data for `map`.\n *\n * @private\n * @param {Object} map The map to query.\n * @param {string} key The reference key.\n * @returns {*} Returns the map data.\n */\nfunction getMapData(map, key) {\n var data = map.__data__;\n return isKeyable(key)\n ? data[typeof key == 'string' ? 'string' : 'hash']\n : data.map;\n}\n\nmodule.exports = getMapData;\n","var isStrictComparable = require('./_isStrictComparable'),\n keys = require('./keys');\n\n/**\n * Gets the property names, values, and compare flags of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the match data of `object`.\n */\nfunction getMatchData(object) {\n var result = keys(object),\n length = result.length;\n\n while (length--) {\n var key = result[length],\n value = object[key];\n\n result[length] = [key, value, isStrictComparable(value)];\n }\n return result;\n}\n\nmodule.exports = getMatchData;\n","var baseIsNative = require('./_baseIsNative'),\n getValue = require('./_getValue');\n\n/**\n * Gets the native function at `key` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the method to get.\n * @returns {*} Returns the function if it's native, else `undefined`.\n */\nfunction getNative(object, key) {\n var value = getValue(object, key);\n return baseIsNative(value) ? value : undefined;\n}\n\nmodule.exports = getNative;\n","var overArg = require('./_overArg');\n\n/** Built-in value references. */\nvar getPrototype = overArg(Object.getPrototypeOf, Object);\n\nmodule.exports = getPrototype;\n","var Symbol = require('./_Symbol');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */\nfunction getRawTag(value) {\n var isOwn = hasOwnProperty.call(value, symToStringTag),\n tag = value[symToStringTag];\n\n try {\n value[symToStringTag] = undefined;\n var unmasked = true;\n } catch (e) {}\n\n var result = nativeObjectToString.call(value);\n if (unmasked) {\n if (isOwn) {\n value[symToStringTag] = tag;\n } else {\n delete value[symToStringTag];\n }\n }\n return result;\n}\n\nmodule.exports = getRawTag;\n","var arrayFilter = require('./_arrayFilter'),\n stubArray = require('./stubArray');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Built-in value references. */\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeGetSymbols = Object.getOwnPropertySymbols;\n\n/**\n * Creates an array of the own enumerable symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of symbols.\n */\nvar getSymbols = !nativeGetSymbols ? stubArray : function(object) {\n if (object == null) {\n return [];\n }\n object = Object(object);\n return arrayFilter(nativeGetSymbols(object), function(symbol) {\n return propertyIsEnumerable.call(object, symbol);\n });\n};\n\nmodule.exports = getSymbols;\n","var arrayPush = require('./_arrayPush'),\n getPrototype = require('./_getPrototype'),\n getSymbols = require('./_getSymbols'),\n stubArray = require('./stubArray');\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeGetSymbols = Object.getOwnPropertySymbols;\n\n/**\n * Creates an array of the own and inherited enumerable symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of symbols.\n */\nvar getSymbolsIn = !nativeGetSymbols ? stubArray : function(object) {\n var result = [];\n while (object) {\n arrayPush(result, getSymbols(object));\n object = getPrototype(object);\n }\n return result;\n};\n\nmodule.exports = getSymbolsIn;\n","var DataView = require('./_DataView'),\n Map = require('./_Map'),\n Promise = require('./_Promise'),\n Set = require('./_Set'),\n WeakMap = require('./_WeakMap'),\n baseGetTag = require('./_baseGetTag'),\n toSource = require('./_toSource');\n\n/** `Object#toString` result references. */\nvar mapTag = '[object Map]',\n objectTag = '[object Object]',\n promiseTag = '[object Promise]',\n setTag = '[object Set]',\n weakMapTag = '[object WeakMap]';\n\nvar dataViewTag = '[object DataView]';\n\n/** Used to detect maps, sets, and weakmaps. */\nvar dataViewCtorString = toSource(DataView),\n mapCtorString = toSource(Map),\n promiseCtorString = toSource(Promise),\n setCtorString = toSource(Set),\n weakMapCtorString = toSource(WeakMap);\n\n/**\n * Gets the `toStringTag` of `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nvar getTag = baseGetTag;\n\n// Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.\nif ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||\n (Map && getTag(new Map) != mapTag) ||\n (Promise && getTag(Promise.resolve()) != promiseTag) ||\n (Set && getTag(new Set) != setTag) ||\n (WeakMap && getTag(new WeakMap) != weakMapTag)) {\n getTag = function(value) {\n var result = baseGetTag(value),\n Ctor = result == objectTag ? value.constructor : undefined,\n ctorString = Ctor ? toSource(Ctor) : '';\n\n if (ctorString) {\n switch (ctorString) {\n case dataViewCtorString: return dataViewTag;\n case mapCtorString: return mapTag;\n case promiseCtorString: return promiseTag;\n case setCtorString: return setTag;\n case weakMapCtorString: return weakMapTag;\n }\n }\n return result;\n };\n}\n\nmodule.exports = getTag;\n","/**\n * Gets the value at `key` of `object`.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\nfunction getValue(object, key) {\n return object == null ? undefined : object[key];\n}\n\nmodule.exports = getValue;\n","var castPath = require('./_castPath'),\n isArguments = require('./isArguments'),\n isArray = require('./isArray'),\n isIndex = require('./_isIndex'),\n isLength = require('./isLength'),\n toKey = require('./_toKey');\n\n/**\n * Checks if `path` exists on `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @param {Function} hasFunc The function to check properties.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n */\nfunction hasPath(object, path, hasFunc) {\n path = castPath(path, object);\n\n var index = -1,\n length = path.length,\n result = false;\n\n while (++index < length) {\n var key = toKey(path[index]);\n if (!(result = object != null && hasFunc(object, key))) {\n break;\n }\n object = object[key];\n }\n if (result || ++index != length) {\n return result;\n }\n length = object == null ? 0 : object.length;\n return !!length && isLength(length) && isIndex(key, length) &&\n (isArray(object) || isArguments(object));\n}\n\nmodule.exports = hasPath;\n","/** Used to compose unicode character classes. */\nvar rsAstralRange = '\\\\ud800-\\\\udfff',\n rsComboMarksRange = '\\\\u0300-\\\\u036f',\n reComboHalfMarksRange = '\\\\ufe20-\\\\ufe2f',\n rsComboSymbolsRange = '\\\\u20d0-\\\\u20ff',\n rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange,\n rsVarRange = '\\\\ufe0e\\\\ufe0f';\n\n/** Used to compose unicode capture groups. */\nvar rsZWJ = '\\\\u200d';\n\n/** Used to detect strings with [zero-width joiners or code points from the astral planes](http://eev.ee/blog/2015/09/12/dark-corners-of-unicode/). */\nvar reHasUnicode = RegExp('[' + rsZWJ + rsAstralRange + rsComboRange + rsVarRange + ']');\n\n/**\n * Checks if `string` contains Unicode symbols.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {boolean} Returns `true` if a symbol is found, else `false`.\n */\nfunction hasUnicode(string) {\n return reHasUnicode.test(string);\n}\n\nmodule.exports = hasUnicode;\n","/** Used to detect strings that need a more robust regexp to match words. */\nvar reHasUnicodeWord = /[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/;\n\n/**\n * Checks if `string` contains a word composed of Unicode symbols.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {boolean} Returns `true` if a word is found, else `false`.\n */\nfunction hasUnicodeWord(string) {\n return reHasUnicodeWord.test(string);\n}\n\nmodule.exports = hasUnicodeWord;\n","var nativeCreate = require('./_nativeCreate');\n\n/**\n * Removes all key-value entries from the hash.\n *\n * @private\n * @name clear\n * @memberOf Hash\n */\nfunction hashClear() {\n this.__data__ = nativeCreate ? nativeCreate(null) : {};\n this.size = 0;\n}\n\nmodule.exports = hashClear;\n","/**\n * Removes `key` and its value from the hash.\n *\n * @private\n * @name delete\n * @memberOf Hash\n * @param {Object} hash The hash to modify.\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction hashDelete(key) {\n var result = this.has(key) && delete this.__data__[key];\n this.size -= result ? 1 : 0;\n return result;\n}\n\nmodule.exports = hashDelete;\n","var nativeCreate = require('./_nativeCreate');\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Gets the hash value for `key`.\n *\n * @private\n * @name get\n * @memberOf Hash\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction hashGet(key) {\n var data = this.__data__;\n if (nativeCreate) {\n var result = data[key];\n return result === HASH_UNDEFINED ? undefined : result;\n }\n return hasOwnProperty.call(data, key) ? data[key] : undefined;\n}\n\nmodule.exports = hashGet;\n","var nativeCreate = require('./_nativeCreate');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Checks if a hash value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Hash\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction hashHas(key) {\n var data = this.__data__;\n return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);\n}\n\nmodule.exports = hashHas;\n","var nativeCreate = require('./_nativeCreate');\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/**\n * Sets the hash `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Hash\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the hash instance.\n */\nfunction hashSet(key, value) {\n var data = this.__data__;\n this.size += this.has(key) ? 0 : 1;\n data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\n return this;\n}\n\nmodule.exports = hashSet;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Initializes an array clone.\n *\n * @private\n * @param {Array} array The array to clone.\n * @returns {Array} Returns the initialized clone.\n */\nfunction initCloneArray(array) {\n var length = array.length,\n result = new array.constructor(length);\n\n // Add properties assigned by `RegExp#exec`.\n if (length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index')) {\n result.index = array.index;\n result.input = array.input;\n }\n return result;\n}\n\nmodule.exports = initCloneArray;\n","var cloneArrayBuffer = require('./_cloneArrayBuffer'),\n cloneDataView = require('./_cloneDataView'),\n cloneRegExp = require('./_cloneRegExp'),\n cloneSymbol = require('./_cloneSymbol'),\n cloneTypedArray = require('./_cloneTypedArray');\n\n/** `Object#toString` result references. */\nvar boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n symbolTag = '[object Symbol]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]',\n float32Tag = '[object Float32Array]',\n float64Tag = '[object Float64Array]',\n int8Tag = '[object Int8Array]',\n int16Tag = '[object Int16Array]',\n int32Tag = '[object Int32Array]',\n uint8Tag = '[object Uint8Array]',\n uint8ClampedTag = '[object Uint8ClampedArray]',\n uint16Tag = '[object Uint16Array]',\n uint32Tag = '[object Uint32Array]';\n\n/**\n * Initializes an object clone based on its `toStringTag`.\n *\n * **Note:** This function only supports cloning values with tags of\n * `Boolean`, `Date`, `Error`, `Map`, `Number`, `RegExp`, `Set`, or `String`.\n *\n * @private\n * @param {Object} object The object to clone.\n * @param {string} tag The `toStringTag` of the object to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the initialized clone.\n */\nfunction initCloneByTag(object, tag, isDeep) {\n var Ctor = object.constructor;\n switch (tag) {\n case arrayBufferTag:\n return cloneArrayBuffer(object);\n\n case boolTag:\n case dateTag:\n return new Ctor(+object);\n\n case dataViewTag:\n return cloneDataView(object, isDeep);\n\n case float32Tag: case float64Tag:\n case int8Tag: case int16Tag: case int32Tag:\n case uint8Tag: case uint8ClampedTag: case uint16Tag: case uint32Tag:\n return cloneTypedArray(object, isDeep);\n\n case mapTag:\n return new Ctor;\n\n case numberTag:\n case stringTag:\n return new Ctor(object);\n\n case regexpTag:\n return cloneRegExp(object);\n\n case setTag:\n return new Ctor;\n\n case symbolTag:\n return cloneSymbol(object);\n }\n}\n\nmodule.exports = initCloneByTag;\n","var baseCreate = require('./_baseCreate'),\n getPrototype = require('./_getPrototype'),\n isPrototype = require('./_isPrototype');\n\n/**\n * Initializes an object clone.\n *\n * @private\n * @param {Object} object The object to clone.\n * @returns {Object} Returns the initialized clone.\n */\nfunction initCloneObject(object) {\n return (typeof object.constructor == 'function' && !isPrototype(object))\n ? baseCreate(getPrototype(object))\n : {};\n}\n\nmodule.exports = initCloneObject;\n","/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/** Used to detect unsigned integer values. */\nvar reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n/**\n * Checks if `value` is a valid array-like index.\n *\n * @private\n * @param {*} value The value to check.\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n */\nfunction isIndex(value, length) {\n var type = typeof value;\n length = length == null ? MAX_SAFE_INTEGER : length;\n\n return !!length &&\n (type == 'number' ||\n (type != 'symbol' && reIsUint.test(value))) &&\n (value > -1 && value % 1 == 0 && value < length);\n}\n\nmodule.exports = isIndex;\n","var isArray = require('./isArray'),\n isSymbol = require('./isSymbol');\n\n/** Used to match property names within property paths. */\nvar reIsDeepProp = /\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/,\n reIsPlainProp = /^\\w*$/;\n\n/**\n * Checks if `value` is a property name and not a property path.\n *\n * @private\n * @param {*} value The value to check.\n * @param {Object} [object] The object to query keys on.\n * @returns {boolean} Returns `true` if `value` is a property name, else `false`.\n */\nfunction isKey(value, object) {\n if (isArray(value)) {\n return false;\n }\n var type = typeof value;\n if (type == 'number' || type == 'symbol' || type == 'boolean' ||\n value == null || isSymbol(value)) {\n return true;\n }\n return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||\n (object != null && value in Object(object));\n}\n\nmodule.exports = isKey;\n","/**\n * Checks if `value` is suitable for use as unique object key.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\n */\nfunction isKeyable(value) {\n var type = typeof value;\n return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\n ? (value !== '__proto__')\n : (value === null);\n}\n\nmodule.exports = isKeyable;\n","var coreJsData = require('./_coreJsData');\n\n/** Used to detect methods masquerading as native. */\nvar maskSrcKey = (function() {\n var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n return uid ? ('Symbol(src)_1.' + uid) : '';\n}());\n\n/**\n * Checks if `func` has its source masked.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n */\nfunction isMasked(func) {\n return !!maskSrcKey && (maskSrcKey in func);\n}\n\nmodule.exports = isMasked;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Checks if `value` is likely a prototype object.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n */\nfunction isPrototype(value) {\n var Ctor = value && value.constructor,\n proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\n\n return value === proto;\n}\n\nmodule.exports = isPrototype;\n","var isObject = require('./isObject');\n\n/**\n * Checks if `value` is suitable for strict equality comparisons, i.e. `===`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` if suitable for strict\n * equality comparisons, else `false`.\n */\nfunction isStrictComparable(value) {\n return value === value && !isObject(value);\n}\n\nmodule.exports = isStrictComparable;\n","/**\n * Removes all key-value entries from the list cache.\n *\n * @private\n * @name clear\n * @memberOf ListCache\n */\nfunction listCacheClear() {\n this.__data__ = [];\n this.size = 0;\n}\n\nmodule.exports = listCacheClear;\n","var assocIndexOf = require('./_assocIndexOf');\n\n/** Used for built-in method references. */\nvar arrayProto = Array.prototype;\n\n/** Built-in value references. */\nvar splice = arrayProto.splice;\n\n/**\n * Removes `key` and its value from the list cache.\n *\n * @private\n * @name delete\n * @memberOf ListCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction listCacheDelete(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n return false;\n }\n var lastIndex = data.length - 1;\n if (index == lastIndex) {\n data.pop();\n } else {\n splice.call(data, index, 1);\n }\n --this.size;\n return true;\n}\n\nmodule.exports = listCacheDelete;\n","var assocIndexOf = require('./_assocIndexOf');\n\n/**\n * Gets the list cache value for `key`.\n *\n * @private\n * @name get\n * @memberOf ListCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction listCacheGet(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n return index < 0 ? undefined : data[index][1];\n}\n\nmodule.exports = listCacheGet;\n","var assocIndexOf = require('./_assocIndexOf');\n\n/**\n * Checks if a list cache value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf ListCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction listCacheHas(key) {\n return assocIndexOf(this.__data__, key) > -1;\n}\n\nmodule.exports = listCacheHas;\n","var assocIndexOf = require('./_assocIndexOf');\n\n/**\n * Sets the list cache `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf ListCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the list cache instance.\n */\nfunction listCacheSet(key, value) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n ++this.size;\n data.push([key, value]);\n } else {\n data[index][1] = value;\n }\n return this;\n}\n\nmodule.exports = listCacheSet;\n","var Hash = require('./_Hash'),\n ListCache = require('./_ListCache'),\n Map = require('./_Map');\n\n/**\n * Removes all key-value entries from the map.\n *\n * @private\n * @name clear\n * @memberOf MapCache\n */\nfunction mapCacheClear() {\n this.size = 0;\n this.__data__ = {\n 'hash': new Hash,\n 'map': new (Map || ListCache),\n 'string': new Hash\n };\n}\n\nmodule.exports = mapCacheClear;\n","var getMapData = require('./_getMapData');\n\n/**\n * Removes `key` and its value from the map.\n *\n * @private\n * @name delete\n * @memberOf MapCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction mapCacheDelete(key) {\n var result = getMapData(this, key)['delete'](key);\n this.size -= result ? 1 : 0;\n return result;\n}\n\nmodule.exports = mapCacheDelete;\n","var getMapData = require('./_getMapData');\n\n/**\n * Gets the map value for `key`.\n *\n * @private\n * @name get\n * @memberOf MapCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction mapCacheGet(key) {\n return getMapData(this, key).get(key);\n}\n\nmodule.exports = mapCacheGet;\n","var getMapData = require('./_getMapData');\n\n/**\n * Checks if a map value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf MapCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction mapCacheHas(key) {\n return getMapData(this, key).has(key);\n}\n\nmodule.exports = mapCacheHas;\n","var getMapData = require('./_getMapData');\n\n/**\n * Sets the map `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf MapCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the map cache instance.\n */\nfunction mapCacheSet(key, value) {\n var data = getMapData(this, key),\n size = data.size;\n\n data.set(key, value);\n this.size += data.size == size ? 0 : 1;\n return this;\n}\n\nmodule.exports = mapCacheSet;\n","/**\n * Converts `map` to its key-value pairs.\n *\n * @private\n * @param {Object} map The map to convert.\n * @returns {Array} Returns the key-value pairs.\n */\nfunction mapToArray(map) {\n var index = -1,\n result = Array(map.size);\n\n map.forEach(function(value, key) {\n result[++index] = [key, value];\n });\n return result;\n}\n\nmodule.exports = mapToArray;\n","/**\n * A specialized version of `matchesProperty` for source values suitable\n * for strict equality comparisons, i.e. `===`.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @param {*} srcValue The value to match.\n * @returns {Function} Returns the new spec function.\n */\nfunction matchesStrictComparable(key, srcValue) {\n return function(object) {\n if (object == null) {\n return false;\n }\n return object[key] === srcValue &&\n (srcValue !== undefined || (key in Object(object)));\n };\n}\n\nmodule.exports = matchesStrictComparable;\n","var memoize = require('./memoize');\n\n/** Used as the maximum memoize cache size. */\nvar MAX_MEMOIZE_SIZE = 500;\n\n/**\n * A specialized version of `_.memoize` which clears the memoized function's\n * cache when it exceeds `MAX_MEMOIZE_SIZE`.\n *\n * @private\n * @param {Function} func The function to have its output memoized.\n * @returns {Function} Returns the new memoized function.\n */\nfunction memoizeCapped(func) {\n var result = memoize(func, function(key) {\n if (cache.size === MAX_MEMOIZE_SIZE) {\n cache.clear();\n }\n return key;\n });\n\n var cache = result.cache;\n return result;\n}\n\nmodule.exports = memoizeCapped;\n","var getNative = require('./_getNative');\n\n/* Built-in method references that are verified to be native. */\nvar nativeCreate = getNative(Object, 'create');\n\nmodule.exports = nativeCreate;\n","var overArg = require('./_overArg');\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeKeys = overArg(Object.keys, Object);\n\nmodule.exports = nativeKeys;\n","/**\n * This function is like\n * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * except that it includes inherited enumerable properties.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction nativeKeysIn(object) {\n var result = [];\n if (object != null) {\n for (var key in Object(object)) {\n result.push(key);\n }\n }\n return result;\n}\n\nmodule.exports = nativeKeysIn;\n","var freeGlobal = require('./_freeGlobal');\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Detect free variable `process` from Node.js. */\nvar freeProcess = moduleExports && freeGlobal.process;\n\n/** Used to access faster Node.js helpers. */\nvar nodeUtil = (function() {\n try {\n // Use `util.types` for Node.js 10+.\n var types = freeModule && freeModule.require && freeModule.require('util').types;\n\n if (types) {\n return types;\n }\n\n // Legacy `process.binding('util')` for Node.js < 10.\n return freeProcess && freeProcess.binding && freeProcess.binding('util');\n } catch (e) {}\n}());\n\nmodule.exports = nodeUtil;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\nfunction objectToString(value) {\n return nativeObjectToString.call(value);\n}\n\nmodule.exports = objectToString;\n","/**\n * Creates a unary function that invokes `func` with its argument transformed.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {Function} transform The argument transform.\n * @returns {Function} Returns the new function.\n */\nfunction overArg(func, transform) {\n return function(arg) {\n return func(transform(arg));\n };\n}\n\nmodule.exports = overArg;\n","var freeGlobal = require('./_freeGlobal');\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\nmodule.exports = root;\n","/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/**\n * Adds `value` to the array cache.\n *\n * @private\n * @name add\n * @memberOf SetCache\n * @alias push\n * @param {*} value The value to cache.\n * @returns {Object} Returns the cache instance.\n */\nfunction setCacheAdd(value) {\n this.__data__.set(value, HASH_UNDEFINED);\n return this;\n}\n\nmodule.exports = setCacheAdd;\n","/**\n * Checks if `value` is in the array cache.\n *\n * @private\n * @name has\n * @memberOf SetCache\n * @param {*} value The value to search for.\n * @returns {number} Returns `true` if `value` is found, else `false`.\n */\nfunction setCacheHas(value) {\n return this.__data__.has(value);\n}\n\nmodule.exports = setCacheHas;\n","/**\n * Converts `set` to an array of its values.\n *\n * @private\n * @param {Object} set The set to convert.\n * @returns {Array} Returns the values.\n */\nfunction setToArray(set) {\n var index = -1,\n result = Array(set.size);\n\n set.forEach(function(value) {\n result[++index] = value;\n });\n return result;\n}\n\nmodule.exports = setToArray;\n","var ListCache = require('./_ListCache');\n\n/**\n * Removes all key-value entries from the stack.\n *\n * @private\n * @name clear\n * @memberOf Stack\n */\nfunction stackClear() {\n this.__data__ = new ListCache;\n this.size = 0;\n}\n\nmodule.exports = stackClear;\n","/**\n * Removes `key` and its value from the stack.\n *\n * @private\n * @name delete\n * @memberOf Stack\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction stackDelete(key) {\n var data = this.__data__,\n result = data['delete'](key);\n\n this.size = data.size;\n return result;\n}\n\nmodule.exports = stackDelete;\n","/**\n * Gets the stack value for `key`.\n *\n * @private\n * @name get\n * @memberOf Stack\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction stackGet(key) {\n return this.__data__.get(key);\n}\n\nmodule.exports = stackGet;\n","/**\n * Checks if a stack value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Stack\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction stackHas(key) {\n return this.__data__.has(key);\n}\n\nmodule.exports = stackHas;\n","var ListCache = require('./_ListCache'),\n Map = require('./_Map'),\n MapCache = require('./_MapCache');\n\n/** Used as the size to enable large array optimizations. */\nvar LARGE_ARRAY_SIZE = 200;\n\n/**\n * Sets the stack `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Stack\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the stack cache instance.\n */\nfunction stackSet(key, value) {\n var data = this.__data__;\n if (data instanceof ListCache) {\n var pairs = data.__data__;\n if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {\n pairs.push([key, value]);\n this.size = ++data.size;\n return this;\n }\n data = this.__data__ = new MapCache(pairs);\n }\n data.set(key, value);\n this.size = data.size;\n return this;\n}\n\nmodule.exports = stackSet;\n","var asciiToArray = require('./_asciiToArray'),\n hasUnicode = require('./_hasUnicode'),\n unicodeToArray = require('./_unicodeToArray');\n\n/**\n * Converts `string` to an array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the converted array.\n */\nfunction stringToArray(string) {\n return hasUnicode(string)\n ? unicodeToArray(string)\n : asciiToArray(string);\n}\n\nmodule.exports = stringToArray;\n","var memoizeCapped = require('./_memoizeCapped');\n\n/** Used to match property names within property paths. */\nvar rePropName = /[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g;\n\n/** Used to match backslashes in property paths. */\nvar reEscapeChar = /\\\\(\\\\)?/g;\n\n/**\n * Converts `string` to a property path array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the property path array.\n */\nvar stringToPath = memoizeCapped(function(string) {\n var result = [];\n if (string.charCodeAt(0) === 46 /* . */) {\n result.push('');\n }\n string.replace(rePropName, function(match, number, quote, subString) {\n result.push(quote ? subString.replace(reEscapeChar, '$1') : (number || match));\n });\n return result;\n});\n\nmodule.exports = stringToPath;\n","var isSymbol = require('./isSymbol');\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/**\n * Converts `value` to a string key if it's not a string or symbol.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {string|symbol} Returns the key.\n */\nfunction toKey(value) {\n if (typeof value == 'string' || isSymbol(value)) {\n return value;\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\nmodule.exports = toKey;\n","/** Used for built-in method references. */\nvar funcProto = Function.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/**\n * Converts `func` to its source code.\n *\n * @private\n * @param {Function} func The function to convert.\n * @returns {string} Returns the source code.\n */\nfunction toSource(func) {\n if (func != null) {\n try {\n return funcToString.call(func);\n } catch (e) {}\n try {\n return (func + '');\n } catch (e) {}\n }\n return '';\n}\n\nmodule.exports = toSource;\n","/** Used to match a single whitespace character. */\nvar reWhitespace = /\\s/;\n\n/**\n * Used by `_.trim` and `_.trimEnd` to get the index of the last non-whitespace\n * character of `string`.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {number} Returns the index of the last non-whitespace character.\n */\nfunction trimmedEndIndex(string) {\n var index = string.length;\n\n while (index-- && reWhitespace.test(string.charAt(index))) {}\n return index;\n}\n\nmodule.exports = trimmedEndIndex;\n","/** Used to compose unicode character classes. */\nvar rsAstralRange = '\\\\ud800-\\\\udfff',\n rsComboMarksRange = '\\\\u0300-\\\\u036f',\n reComboHalfMarksRange = '\\\\ufe20-\\\\ufe2f',\n rsComboSymbolsRange = '\\\\u20d0-\\\\u20ff',\n rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange,\n rsVarRange = '\\\\ufe0e\\\\ufe0f';\n\n/** Used to compose unicode capture groups. */\nvar rsAstral = '[' + rsAstralRange + ']',\n rsCombo = '[' + rsComboRange + ']',\n rsFitz = '\\\\ud83c[\\\\udffb-\\\\udfff]',\n rsModifier = '(?:' + rsCombo + '|' + rsFitz + ')',\n rsNonAstral = '[^' + rsAstralRange + ']',\n rsRegional = '(?:\\\\ud83c[\\\\udde6-\\\\uddff]){2}',\n rsSurrPair = '[\\\\ud800-\\\\udbff][\\\\udc00-\\\\udfff]',\n rsZWJ = '\\\\u200d';\n\n/** Used to compose unicode regexes. */\nvar reOptMod = rsModifier + '?',\n rsOptVar = '[' + rsVarRange + ']?',\n rsOptJoin = '(?:' + rsZWJ + '(?:' + [rsNonAstral, rsRegional, rsSurrPair].join('|') + ')' + rsOptVar + reOptMod + ')*',\n rsSeq = rsOptVar + reOptMod + rsOptJoin,\n rsSymbol = '(?:' + [rsNonAstral + rsCombo + '?', rsCombo, rsRegional, rsSurrPair, rsAstral].join('|') + ')';\n\n/** Used to match [string symbols](https://mathiasbynens.be/notes/javascript-unicode). */\nvar reUnicode = RegExp(rsFitz + '(?=' + rsFitz + ')|' + rsSymbol + rsSeq, 'g');\n\n/**\n * Converts a Unicode `string` to an array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the converted array.\n */\nfunction unicodeToArray(string) {\n return string.match(reUnicode) || [];\n}\n\nmodule.exports = unicodeToArray;\n","/** Used to compose unicode character classes. */\nvar rsAstralRange = '\\\\ud800-\\\\udfff',\n rsComboMarksRange = '\\\\u0300-\\\\u036f',\n reComboHalfMarksRange = '\\\\ufe20-\\\\ufe2f',\n rsComboSymbolsRange = '\\\\u20d0-\\\\u20ff',\n rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange,\n rsDingbatRange = '\\\\u2700-\\\\u27bf',\n rsLowerRange = 'a-z\\\\xdf-\\\\xf6\\\\xf8-\\\\xff',\n rsMathOpRange = '\\\\xac\\\\xb1\\\\xd7\\\\xf7',\n rsNonCharRange = '\\\\x00-\\\\x2f\\\\x3a-\\\\x40\\\\x5b-\\\\x60\\\\x7b-\\\\xbf',\n rsPunctuationRange = '\\\\u2000-\\\\u206f',\n rsSpaceRange = ' \\\\t\\\\x0b\\\\f\\\\xa0\\\\ufeff\\\\n\\\\r\\\\u2028\\\\u2029\\\\u1680\\\\u180e\\\\u2000\\\\u2001\\\\u2002\\\\u2003\\\\u2004\\\\u2005\\\\u2006\\\\u2007\\\\u2008\\\\u2009\\\\u200a\\\\u202f\\\\u205f\\\\u3000',\n rsUpperRange = 'A-Z\\\\xc0-\\\\xd6\\\\xd8-\\\\xde',\n rsVarRange = '\\\\ufe0e\\\\ufe0f',\n rsBreakRange = rsMathOpRange + rsNonCharRange + rsPunctuationRange + rsSpaceRange;\n\n/** Used to compose unicode capture groups. */\nvar rsApos = \"['\\u2019]\",\n rsBreak = '[' + rsBreakRange + ']',\n rsCombo = '[' + rsComboRange + ']',\n rsDigits = '\\\\d+',\n rsDingbat = '[' + rsDingbatRange + ']',\n rsLower = '[' + rsLowerRange + ']',\n rsMisc = '[^' + rsAstralRange + rsBreakRange + rsDigits + rsDingbatRange + rsLowerRange + rsUpperRange + ']',\n rsFitz = '\\\\ud83c[\\\\udffb-\\\\udfff]',\n rsModifier = '(?:' + rsCombo + '|' + rsFitz + ')',\n rsNonAstral = '[^' + rsAstralRange + ']',\n rsRegional = '(?:\\\\ud83c[\\\\udde6-\\\\uddff]){2}',\n rsSurrPair = '[\\\\ud800-\\\\udbff][\\\\udc00-\\\\udfff]',\n rsUpper = '[' + rsUpperRange + ']',\n rsZWJ = '\\\\u200d';\n\n/** Used to compose unicode regexes. */\nvar rsMiscLower = '(?:' + rsLower + '|' + rsMisc + ')',\n rsMiscUpper = '(?:' + rsUpper + '|' + rsMisc + ')',\n rsOptContrLower = '(?:' + rsApos + '(?:d|ll|m|re|s|t|ve))?',\n rsOptContrUpper = '(?:' + rsApos + '(?:D|LL|M|RE|S|T|VE))?',\n reOptMod = rsModifier + '?',\n rsOptVar = '[' + rsVarRange + ']?',\n rsOptJoin = '(?:' + rsZWJ + '(?:' + [rsNonAstral, rsRegional, rsSurrPair].join('|') + ')' + rsOptVar + reOptMod + ')*',\n rsOrdLower = '\\\\d*(?:1st|2nd|3rd|(?![123])\\\\dth)(?=\\\\b|[A-Z_])',\n rsOrdUpper = '\\\\d*(?:1ST|2ND|3RD|(?![123])\\\\dTH)(?=\\\\b|[a-z_])',\n rsSeq = rsOptVar + reOptMod + rsOptJoin,\n rsEmoji = '(?:' + [rsDingbat, rsRegional, rsSurrPair].join('|') + ')' + rsSeq;\n\n/** Used to match complex or compound words. */\nvar reUnicodeWord = RegExp([\n rsUpper + '?' + rsLower + '+' + rsOptContrLower + '(?=' + [rsBreak, rsUpper, '$'].join('|') + ')',\n rsMiscUpper + '+' + rsOptContrUpper + '(?=' + [rsBreak, rsUpper + rsMiscLower, '$'].join('|') + ')',\n rsUpper + '?' + rsMiscLower + '+' + rsOptContrLower,\n rsUpper + '+' + rsOptContrUpper,\n rsOrdUpper,\n rsOrdLower,\n rsDigits,\n rsEmoji\n].join('|'), 'g');\n\n/**\n * Splits a Unicode `string` into an array of its words.\n *\n * @private\n * @param {string} The string to inspect.\n * @returns {Array} Returns the words of `string`.\n */\nfunction unicodeWords(string) {\n return string.match(reUnicodeWord) || [];\n}\n\nmodule.exports = unicodeWords;\n","var capitalize = require('./capitalize'),\n createCompounder = require('./_createCompounder');\n\n/**\n * Converts `string` to [camel case](https://en.wikipedia.org/wiki/CamelCase).\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to convert.\n * @returns {string} Returns the camel cased string.\n * @example\n *\n * _.camelCase('Foo Bar');\n * // => 'fooBar'\n *\n * _.camelCase('--foo-bar--');\n * // => 'fooBar'\n *\n * _.camelCase('__FOO_BAR__');\n * // => 'fooBar'\n */\nvar camelCase = createCompounder(function(result, word, index) {\n word = word.toLowerCase();\n return result + (index ? capitalize(word) : word);\n});\n\nmodule.exports = camelCase;\n","var toString = require('./toString'),\n upperFirst = require('./upperFirst');\n\n/**\n * Converts the first character of `string` to upper case and the remaining\n * to lower case.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to capitalize.\n * @returns {string} Returns the capitalized string.\n * @example\n *\n * _.capitalize('FRED');\n * // => 'Fred'\n */\nfunction capitalize(string) {\n return upperFirst(toString(string).toLowerCase());\n}\n\nmodule.exports = capitalize;\n","var baseClone = require('./_baseClone');\n\n/** Used to compose bitmasks for cloning. */\nvar CLONE_DEEP_FLAG = 1,\n CLONE_SYMBOLS_FLAG = 4;\n\n/**\n * This method is like `_.clone` except that it recursively clones `value`.\n *\n * @static\n * @memberOf _\n * @since 1.0.0\n * @category Lang\n * @param {*} value The value to recursively clone.\n * @returns {*} Returns the deep cloned value.\n * @see _.clone\n * @example\n *\n * var objects = [{ 'a': 1 }, { 'b': 2 }];\n *\n * var deep = _.cloneDeep(objects);\n * console.log(deep[0] === objects[0]);\n * // => false\n */\nfunction cloneDeep(value) {\n return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG);\n}\n\nmodule.exports = cloneDeep;\n","var isObject = require('./isObject'),\n now = require('./now'),\n toNumber = require('./toNumber');\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max,\n nativeMin = Math.min;\n\n/**\n * Creates a debounced function that delays invoking `func` until after `wait`\n * milliseconds have elapsed since the last time the debounced function was\n * invoked. The debounced function comes with a `cancel` method to cancel\n * delayed `func` invocations and a `flush` method to immediately invoke them.\n * Provide `options` to indicate whether `func` should be invoked on the\n * leading and/or trailing edge of the `wait` timeout. The `func` is invoked\n * with the last arguments provided to the debounced function. Subsequent\n * calls to the debounced function return the result of the last `func`\n * invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\n * invoked on the trailing edge of the timeout only if the debounced function\n * is invoked more than once during the `wait` timeout.\n *\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between `_.debounce` and `_.throttle`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to debounce.\n * @param {number} [wait=0] The number of milliseconds to delay.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=false]\n * Specify invoking on the leading edge of the timeout.\n * @param {number} [options.maxWait]\n * The maximum time `func` is allowed to be delayed before it's invoked.\n * @param {boolean} [options.trailing=true]\n * Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new debounced function.\n * @example\n *\n * // Avoid costly calculations while the window size is in flux.\n * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\n *\n * // Invoke `sendMail` when clicked, debouncing subsequent calls.\n * jQuery(element).on('click', _.debounce(sendMail, 300, {\n * 'leading': true,\n * 'trailing': false\n * }));\n *\n * // Ensure `batchLog` is invoked once after 1 second of debounced calls.\n * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });\n * var source = new EventSource('/stream');\n * jQuery(source).on('message', debounced);\n *\n * // Cancel the trailing debounced invocation.\n * jQuery(window).on('popstate', debounced.cancel);\n */\nfunction debounce(func, wait, options) {\n var lastArgs,\n lastThis,\n maxWait,\n result,\n timerId,\n lastCallTime,\n lastInvokeTime = 0,\n leading = false,\n maxing = false,\n trailing = true;\n\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n wait = toNumber(wait) || 0;\n if (isObject(options)) {\n leading = !!options.leading;\n maxing = 'maxWait' in options;\n maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;\n trailing = 'trailing' in options ? !!options.trailing : trailing;\n }\n\n function invokeFunc(time) {\n var args = lastArgs,\n thisArg = lastThis;\n\n lastArgs = lastThis = undefined;\n lastInvokeTime = time;\n result = func.apply(thisArg, args);\n return result;\n }\n\n function leadingEdge(time) {\n // Reset any `maxWait` timer.\n lastInvokeTime = time;\n // Start the timer for the trailing edge.\n timerId = setTimeout(timerExpired, wait);\n // Invoke the leading edge.\n return leading ? invokeFunc(time) : result;\n }\n\n function remainingWait(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime,\n timeWaiting = wait - timeSinceLastCall;\n\n return maxing\n ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke)\n : timeWaiting;\n }\n\n function shouldInvoke(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime;\n\n // Either this is the first call, activity has stopped and we're at the\n // trailing edge, the system time has gone backwards and we're treating\n // it as the trailing edge, or we've hit the `maxWait` limit.\n return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||\n (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));\n }\n\n function timerExpired() {\n var time = now();\n if (shouldInvoke(time)) {\n return trailingEdge(time);\n }\n // Restart the timer.\n timerId = setTimeout(timerExpired, remainingWait(time));\n }\n\n function trailingEdge(time) {\n timerId = undefined;\n\n // Only invoke if we have `lastArgs` which means `func` has been\n // debounced at least once.\n if (trailing && lastArgs) {\n return invokeFunc(time);\n }\n lastArgs = lastThis = undefined;\n return result;\n }\n\n function cancel() {\n if (timerId !== undefined) {\n clearTimeout(timerId);\n }\n lastInvokeTime = 0;\n lastArgs = lastCallTime = lastThis = timerId = undefined;\n }\n\n function flush() {\n return timerId === undefined ? result : trailingEdge(now());\n }\n\n function debounced() {\n var time = now(),\n isInvoking = shouldInvoke(time);\n\n lastArgs = arguments;\n lastThis = this;\n lastCallTime = time;\n\n if (isInvoking) {\n if (timerId === undefined) {\n return leadingEdge(lastCallTime);\n }\n if (maxing) {\n // Handle invocations in a tight loop.\n clearTimeout(timerId);\n timerId = setTimeout(timerExpired, wait);\n return invokeFunc(lastCallTime);\n }\n }\n if (timerId === undefined) {\n timerId = setTimeout(timerExpired, wait);\n }\n return result;\n }\n debounced.cancel = cancel;\n debounced.flush = flush;\n return debounced;\n}\n\nmodule.exports = debounce;\n","var deburrLetter = require('./_deburrLetter'),\n toString = require('./toString');\n\n/** Used to match Latin Unicode letters (excluding mathematical operators). */\nvar reLatin = /[\\xc0-\\xd6\\xd8-\\xf6\\xf8-\\xff\\u0100-\\u017f]/g;\n\n/** Used to compose unicode character classes. */\nvar rsComboMarksRange = '\\\\u0300-\\\\u036f',\n reComboHalfMarksRange = '\\\\ufe20-\\\\ufe2f',\n rsComboSymbolsRange = '\\\\u20d0-\\\\u20ff',\n rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange;\n\n/** Used to compose unicode capture groups. */\nvar rsCombo = '[' + rsComboRange + ']';\n\n/**\n * Used to match [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks) and\n * [combining diacritical marks for symbols](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks_for_Symbols).\n */\nvar reComboMark = RegExp(rsCombo, 'g');\n\n/**\n * Deburrs `string` by converting\n * [Latin-1 Supplement](https://en.wikipedia.org/wiki/Latin-1_Supplement_(Unicode_block)#Character_table)\n * and [Latin Extended-A](https://en.wikipedia.org/wiki/Latin_Extended-A)\n * letters to basic Latin letters and removing\n * [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks).\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to deburr.\n * @returns {string} Returns the deburred string.\n * @example\n *\n * _.deburr('déjà vu');\n * // => 'deja vu'\n */\nfunction deburr(string) {\n string = toString(string);\n return string && string.replace(reLatin, deburrLetter).replace(reComboMark, '');\n}\n\nmodule.exports = deburr;\n","/**\n * Performs a\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * comparison between two values to determine if they are equivalent.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.eq(object, object);\n * // => true\n *\n * _.eq(object, other);\n * // => false\n *\n * _.eq('a', 'a');\n * // => true\n *\n * _.eq('a', Object('a'));\n * // => false\n *\n * _.eq(NaN, NaN);\n * // => true\n */\nfunction eq(value, other) {\n return value === other || (value !== value && other !== other);\n}\n\nmodule.exports = eq;\n","var baseForOwn = require('./_baseForOwn'),\n castFunction = require('./_castFunction');\n\n/**\n * Iterates over own enumerable string keyed properties of an object and\n * invokes `iteratee` for each property. The iteratee is invoked with three\n * arguments: (value, key, object). Iteratee functions may exit iteration\n * early by explicitly returning `false`.\n *\n * @static\n * @memberOf _\n * @since 0.3.0\n * @category Object\n * @param {Object} object The object to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Object} Returns `object`.\n * @see _.forOwnRight\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.forOwn(new Foo, function(value, key) {\n * console.log(key);\n * });\n * // => Logs 'a' then 'b' (iteration order is not guaranteed).\n */\nfunction forOwn(object, iteratee) {\n return object && baseForOwn(object, castFunction(iteratee));\n}\n\nmodule.exports = forOwn;\n","var baseGet = require('./_baseGet');\n\n/**\n * Gets the value at `path` of `object`. If the resolved value is\n * `undefined`, the `defaultValue` is returned in its place.\n *\n * @static\n * @memberOf _\n * @since 3.7.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @param {*} [defaultValue] The value returned for `undefined` resolved values.\n * @returns {*} Returns the resolved value.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n *\n * _.get(object, 'a[0].b.c');\n * // => 3\n *\n * _.get(object, ['a', '0', 'b', 'c']);\n * // => 3\n *\n * _.get(object, 'a.b.c', 'default');\n * // => 'default'\n */\nfunction get(object, path, defaultValue) {\n var result = object == null ? undefined : baseGet(object, path);\n return result === undefined ? defaultValue : result;\n}\n\nmodule.exports = get;\n","var baseHasIn = require('./_baseHasIn'),\n hasPath = require('./_hasPath');\n\n/**\n * Checks if `path` is a direct or inherited property of `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n * @example\n *\n * var object = _.create({ 'a': _.create({ 'b': 2 }) });\n *\n * _.hasIn(object, 'a');\n * // => true\n *\n * _.hasIn(object, 'a.b');\n * // => true\n *\n * _.hasIn(object, ['a', 'b']);\n * // => true\n *\n * _.hasIn(object, 'b');\n * // => false\n */\nfunction hasIn(object, path) {\n return object != null && hasPath(object, path, baseHasIn);\n}\n\nmodule.exports = hasIn;\n","/**\n * This method returns the first argument it receives.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Util\n * @param {*} value Any value.\n * @returns {*} Returns `value`.\n * @example\n *\n * var object = { 'a': 1 };\n *\n * console.log(_.identity(object) === object);\n * // => true\n */\nfunction identity(value) {\n return value;\n}\n\nmodule.exports = identity;\n","var baseIsArguments = require('./_baseIsArguments'),\n isObjectLike = require('./isObjectLike');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Built-in value references. */\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n/**\n * Checks if `value` is likely an `arguments` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n * else `false`.\n * @example\n *\n * _.isArguments(function() { return arguments; }());\n * // => true\n *\n * _.isArguments([1, 2, 3]);\n * // => false\n */\nvar isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {\n return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&\n !propertyIsEnumerable.call(value, 'callee');\n};\n\nmodule.exports = isArguments;\n","/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\n\nmodule.exports = isArray;\n","var isFunction = require('./isFunction'),\n isLength = require('./isLength');\n\n/**\n * Checks if `value` is array-like. A value is considered array-like if it's\n * not a function and has a `value.length` that's an integer greater than or\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n * @example\n *\n * _.isArrayLike([1, 2, 3]);\n * // => true\n *\n * _.isArrayLike(document.body.children);\n * // => true\n *\n * _.isArrayLike('abc');\n * // => true\n *\n * _.isArrayLike(_.noop);\n * // => false\n */\nfunction isArrayLike(value) {\n return value != null && isLength(value.length) && !isFunction(value);\n}\n\nmodule.exports = isArrayLike;\n","var root = require('./_root'),\n stubFalse = require('./stubFalse');\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Built-in value references. */\nvar Buffer = moduleExports ? root.Buffer : undefined;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined;\n\n/**\n * Checks if `value` is a buffer.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.\n * @example\n *\n * _.isBuffer(new Buffer(2));\n * // => true\n *\n * _.isBuffer(new Uint8Array(2));\n * // => false\n */\nvar isBuffer = nativeIsBuffer || stubFalse;\n\nmodule.exports = isBuffer;\n","var baseGetTag = require('./_baseGetTag'),\n isObject = require('./isObject');\n\n/** `Object#toString` result references. */\nvar asyncTag = '[object AsyncFunction]',\n funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]',\n proxyTag = '[object Proxy]';\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n if (!isObject(value)) {\n return false;\n }\n // The use of `Object#toString` avoids issues with the `typeof` operator\n // in Safari 9 which returns 'object' for typed arrays and other constructors.\n var tag = baseGetTag(value);\n return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;\n}\n\nmodule.exports = isFunction;\n","/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This method is loosely based on\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n * @example\n *\n * _.isLength(3);\n * // => true\n *\n * _.isLength(Number.MIN_VALUE);\n * // => false\n *\n * _.isLength(Infinity);\n * // => false\n *\n * _.isLength('3');\n * // => false\n */\nfunction isLength(value) {\n return typeof value == 'number' &&\n value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\nmodule.exports = isLength;\n","var baseIsMap = require('./_baseIsMap'),\n baseUnary = require('./_baseUnary'),\n nodeUtil = require('./_nodeUtil');\n\n/* Node.js helper references. */\nvar nodeIsMap = nodeUtil && nodeUtil.isMap;\n\n/**\n * Checks if `value` is classified as a `Map` object.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a map, else `false`.\n * @example\n *\n * _.isMap(new Map);\n * // => true\n *\n * _.isMap(new WeakMap);\n * // => false\n */\nvar isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap;\n\nmodule.exports = isMap;\n","/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return value != null && (type == 'object' || type == 'function');\n}\n\nmodule.exports = isObject;\n","/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return value != null && typeof value == 'object';\n}\n\nmodule.exports = isObjectLike;\n","var baseGetTag = require('./_baseGetTag'),\n getPrototype = require('./_getPrototype'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar objectTag = '[object Object]';\n\n/** Used for built-in method references. */\nvar funcProto = Function.prototype,\n objectProto = Object.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Used to infer the `Object` constructor. */\nvar objectCtorString = funcToString.call(Object);\n\n/**\n * Checks if `value` is a plain object, that is, an object created by the\n * `Object` constructor or one with a `[[Prototype]]` of `null`.\n *\n * @static\n * @memberOf _\n * @since 0.8.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * }\n *\n * _.isPlainObject(new Foo);\n * // => false\n *\n * _.isPlainObject([1, 2, 3]);\n * // => false\n *\n * _.isPlainObject({ 'x': 0, 'y': 0 });\n * // => true\n *\n * _.isPlainObject(Object.create(null));\n * // => true\n */\nfunction isPlainObject(value) {\n if (!isObjectLike(value) || baseGetTag(value) != objectTag) {\n return false;\n }\n var proto = getPrototype(value);\n if (proto === null) {\n return true;\n }\n var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor;\n return typeof Ctor == 'function' && Ctor instanceof Ctor &&\n funcToString.call(Ctor) == objectCtorString;\n}\n\nmodule.exports = isPlainObject;\n","var baseIsSet = require('./_baseIsSet'),\n baseUnary = require('./_baseUnary'),\n nodeUtil = require('./_nodeUtil');\n\n/* Node.js helper references. */\nvar nodeIsSet = nodeUtil && nodeUtil.isSet;\n\n/**\n * Checks if `value` is classified as a `Set` object.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a set, else `false`.\n * @example\n *\n * _.isSet(new Set);\n * // => true\n *\n * _.isSet(new WeakSet);\n * // => false\n */\nvar isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet;\n\nmodule.exports = isSet;\n","var baseGetTag = require('./_baseGetTag'),\n isArray = require('./isArray'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar stringTag = '[object String]';\n\n/**\n * Checks if `value` is classified as a `String` primitive or object.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a string, else `false`.\n * @example\n *\n * _.isString('abc');\n * // => true\n *\n * _.isString(1);\n * // => false\n */\nfunction isString(value) {\n return typeof value == 'string' ||\n (!isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag);\n}\n\nmodule.exports = isString;\n","var baseGetTag = require('./_baseGetTag'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar symbolTag = '[object Symbol]';\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n return typeof value == 'symbol' ||\n (isObjectLike(value) && baseGetTag(value) == symbolTag);\n}\n\nmodule.exports = isSymbol;\n","var baseIsTypedArray = require('./_baseIsTypedArray'),\n baseUnary = require('./_baseUnary'),\n nodeUtil = require('./_nodeUtil');\n\n/* Node.js helper references. */\nvar nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;\n\n/**\n * Checks if `value` is classified as a typed array.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n * @example\n *\n * _.isTypedArray(new Uint8Array);\n * // => true\n *\n * _.isTypedArray([]);\n * // => false\n */\nvar isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;\n\nmodule.exports = isTypedArray;\n","var arrayLikeKeys = require('./_arrayLikeKeys'),\n baseKeys = require('./_baseKeys'),\n isArrayLike = require('./isArrayLike');\n\n/**\n * Creates an array of the own enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects. See the\n * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * for more details.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keys(new Foo);\n * // => ['a', 'b'] (iteration order is not guaranteed)\n *\n * _.keys('hi');\n * // => ['0', '1']\n */\nfunction keys(object) {\n return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);\n}\n\nmodule.exports = keys;\n","var arrayLikeKeys = require('./_arrayLikeKeys'),\n baseKeysIn = require('./_baseKeysIn'),\n isArrayLike = require('./isArrayLike');\n\n/**\n * Creates an array of the own and inherited enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keysIn(new Foo);\n * // => ['a', 'b', 'c'] (iteration order is not guaranteed)\n */\nfunction keysIn(object) {\n return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);\n}\n\nmodule.exports = keysIn;\n","var arrayMap = require('./_arrayMap'),\n baseIteratee = require('./_baseIteratee'),\n baseMap = require('./_baseMap'),\n isArray = require('./isArray');\n\n/**\n * Creates an array of values by running each element in `collection` thru\n * `iteratee`. The iteratee is invoked with three arguments:\n * (value, index|key, collection).\n *\n * Many lodash methods are guarded to work as iteratees for methods like\n * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`.\n *\n * The guarded methods are:\n * `ary`, `chunk`, `curry`, `curryRight`, `drop`, `dropRight`, `every`,\n * `fill`, `invert`, `parseInt`, `random`, `range`, `rangeRight`, `repeat`,\n * `sampleSize`, `slice`, `some`, `sortBy`, `split`, `take`, `takeRight`,\n * `template`, `trim`, `trimEnd`, `trimStart`, and `words`\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n * @example\n *\n * function square(n) {\n * return n * n;\n * }\n *\n * _.map([4, 8], square);\n * // => [16, 64]\n *\n * _.map({ 'a': 4, 'b': 8 }, square);\n * // => [16, 64] (iteration order is not guaranteed)\n *\n * var users = [\n * { 'user': 'barney' },\n * { 'user': 'fred' }\n * ];\n *\n * // The `_.property` iteratee shorthand.\n * _.map(users, 'user');\n * // => ['barney', 'fred']\n */\nfunction map(collection, iteratee) {\n var func = isArray(collection) ? arrayMap : baseMap;\n return func(collection, baseIteratee(iteratee, 3));\n}\n\nmodule.exports = map;\n","var MapCache = require('./_MapCache');\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/**\n * Creates a function that memoizes the result of `func`. If `resolver` is\n * provided, it determines the cache key for storing the result based on the\n * arguments provided to the memoized function. By default, the first argument\n * provided to the memoized function is used as the map cache key. The `func`\n * is invoked with the `this` binding of the memoized function.\n *\n * **Note:** The cache is exposed as the `cache` property on the memoized\n * function. Its creation may be customized by replacing the `_.memoize.Cache`\n * constructor with one whose instances implement the\n * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)\n * method interface of `clear`, `delete`, `get`, `has`, and `set`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to have its output memoized.\n * @param {Function} [resolver] The function to resolve the cache key.\n * @returns {Function} Returns the new memoized function.\n * @example\n *\n * var object = { 'a': 1, 'b': 2 };\n * var other = { 'c': 3, 'd': 4 };\n *\n * var values = _.memoize(_.values);\n * values(object);\n * // => [1, 2]\n *\n * values(other);\n * // => [3, 4]\n *\n * object.a = 2;\n * values(object);\n * // => [1, 2]\n *\n * // Modify the result cache.\n * values.cache.set(object, ['a', 'b']);\n * values(object);\n * // => ['a', 'b']\n *\n * // Replace `_.memoize.Cache`.\n * _.memoize.Cache = WeakMap;\n */\nfunction memoize(func, resolver) {\n if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n var memoized = function() {\n var args = arguments,\n key = resolver ? resolver.apply(this, args) : args[0],\n cache = memoized.cache;\n\n if (cache.has(key)) {\n return cache.get(key);\n }\n var result = func.apply(this, args);\n memoized.cache = cache.set(key, result) || cache;\n return result;\n };\n memoized.cache = new (memoize.Cache || MapCache);\n return memoized;\n}\n\n// Expose `MapCache`.\nmemoize.Cache = MapCache;\n\nmodule.exports = memoize;\n","var root = require('./_root');\n\n/**\n * Gets the timestamp of the number of milliseconds that have elapsed since\n * the Unix epoch (1 January 1970 00:00:00 UTC).\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Date\n * @returns {number} Returns the timestamp.\n * @example\n *\n * _.defer(function(stamp) {\n * console.log(_.now() - stamp);\n * }, _.now());\n * // => Logs the number of milliseconds it took for the deferred invocation.\n */\nvar now = function() {\n return root.Date.now();\n};\n\nmodule.exports = now;\n","var baseProperty = require('./_baseProperty'),\n basePropertyDeep = require('./_basePropertyDeep'),\n isKey = require('./_isKey'),\n toKey = require('./_toKey');\n\n/**\n * Creates a function that returns the value at `path` of a given object.\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Util\n * @param {Array|string} path The path of the property to get.\n * @returns {Function} Returns the new accessor function.\n * @example\n *\n * var objects = [\n * { 'a': { 'b': 2 } },\n * { 'a': { 'b': 1 } }\n * ];\n *\n * _.map(objects, _.property('a.b'));\n * // => [2, 1]\n *\n * _.map(_.sortBy(objects, _.property(['a', 'b'])), 'a.b');\n * // => [1, 2]\n */\nfunction property(path) {\n return isKey(path) ? baseProperty(toKey(path)) : basePropertyDeep(path);\n}\n\nmodule.exports = property;\n","/**\n * This method returns a new empty array.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {Array} Returns the new empty array.\n * @example\n *\n * var arrays = _.times(2, _.stubArray);\n *\n * console.log(arrays);\n * // => [[], []]\n *\n * console.log(arrays[0] === arrays[1]);\n * // => false\n */\nfunction stubArray() {\n return [];\n}\n\nmodule.exports = stubArray;\n","/**\n * This method returns `false`.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {boolean} Returns `false`.\n * @example\n *\n * _.times(2, _.stubFalse);\n * // => [false, false]\n */\nfunction stubFalse() {\n return false;\n}\n\nmodule.exports = stubFalse;\n","var baseTrim = require('./_baseTrim'),\n isObject = require('./isObject'),\n isSymbol = require('./isSymbol');\n\n/** Used as references for various `Number` constants. */\nvar NAN = 0 / 0;\n\n/** Used to detect bad signed hexadecimal string values. */\nvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n/** Used to detect binary string values. */\nvar reIsBinary = /^0b[01]+$/i;\n\n/** Used to detect octal string values. */\nvar reIsOctal = /^0o[0-7]+$/i;\n\n/** Built-in method references without a dependency on `root`. */\nvar freeParseInt = parseInt;\n\n/**\n * Converts `value` to a number.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n * @example\n *\n * _.toNumber(3.2);\n * // => 3.2\n *\n * _.toNumber(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toNumber(Infinity);\n * // => Infinity\n *\n * _.toNumber('3.2');\n * // => 3.2\n */\nfunction toNumber(value) {\n if (typeof value == 'number') {\n return value;\n }\n if (isSymbol(value)) {\n return NAN;\n }\n if (isObject(value)) {\n var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n value = isObject(other) ? (other + '') : other;\n }\n if (typeof value != 'string') {\n return value === 0 ? value : +value;\n }\n value = baseTrim(value);\n var isBinary = reIsBinary.test(value);\n return (isBinary || reIsOctal.test(value))\n ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n : (reIsBadHex.test(value) ? NAN : +value);\n}\n\nmodule.exports = toNumber;\n","var baseToString = require('./_baseToString');\n\n/**\n * Converts `value` to a string. An empty string is returned for `null`\n * and `undefined` values. The sign of `-0` is preserved.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n * @example\n *\n * _.toString(null);\n * // => ''\n *\n * _.toString(-0);\n * // => '-0'\n *\n * _.toString([1, 2, 3]);\n * // => '1,2,3'\n */\nfunction toString(value) {\n return value == null ? '' : baseToString(value);\n}\n\nmodule.exports = toString;\n","var createCaseFirst = require('./_createCaseFirst');\n\n/**\n * Converts the first character of `string` to upper case.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=''] The string to convert.\n * @returns {string} Returns the converted string.\n * @example\n *\n * _.upperFirst('fred');\n * // => 'Fred'\n *\n * _.upperFirst('FRED');\n * // => 'FRED'\n */\nvar upperFirst = createCaseFirst('toUpperCase');\n\nmodule.exports = upperFirst;\n","var asciiWords = require('./_asciiWords'),\n hasUnicodeWord = require('./_hasUnicodeWord'),\n toString = require('./toString'),\n unicodeWords = require('./_unicodeWords');\n\n/**\n * Splits `string` into an array of its words.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to inspect.\n * @param {RegExp|string} [pattern] The pattern to match words.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Array} Returns the words of `string`.\n * @example\n *\n * _.words('fred, barney, & pebbles');\n * // => ['fred', 'barney', 'pebbles']\n *\n * _.words('fred, barney, & pebbles', /[^, ]+/g);\n * // => ['fred', 'barney', '&', 'pebbles']\n */\nfunction words(string, pattern, guard) {\n string = toString(string);\n pattern = guard ? undefined : pattern;\n\n if (pattern === undefined) {\n return hasUnicodeWord(string) ? unicodeWords(string) : asciiWords(string);\n }\n return string.match(pattern) || [];\n}\n\nmodule.exports = words;\n","/*!\n * Pusher JavaScript Library v7.6.0\n * https://pusher.com/\n *\n * Copyright 2020, Pusher\n * Released under the MIT licence.\n */\n\n(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"Pusher\"] = factory();\n\telse\n\t\troot[\"Pusher\"] = factory();\n})(window, function() {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// define __esModule on exports\n/******/ \t__webpack_require__.r = function(exports) {\n/******/ \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n/******/ \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n/******/ \t\t}\n/******/ \t\tObject.defineProperty(exports, '__esModule', { value: true });\n/******/ \t};\n/******/\n/******/ \t// create a fake namespace object\n/******/ \t// mode & 1: value is a module id, require it\n/******/ \t// mode & 2: merge all properties of value into the ns\n/******/ \t// mode & 4: return value when already ns object\n/******/ \t// mode & 8|1: behave like require\n/******/ \t__webpack_require__.t = function(value, mode) {\n/******/ \t\tif(mode & 1) value = __webpack_require__(value);\n/******/ \t\tif(mode & 8) return value;\n/******/ \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n/******/ \t\tvar ns = Object.create(null);\n/******/ \t\t__webpack_require__.r(ns);\n/******/ \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n/******/ \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n/******/ \t\treturn ns;\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 3);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n// Copyright (C) 2016 Dmitry Chestnykh\n// MIT License. See LICENSE file for details.\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\n/**\n * Package base64 implements Base64 encoding and decoding.\n */\n// Invalid character used in decoding to indicate\n// that the character to decode is out of range of\n// alphabet and cannot be decoded.\nvar INVALID_BYTE = 256;\n/**\n * Implements standard Base64 encoding.\n *\n * Operates in constant time.\n */\nvar Coder = /** @class */ (function () {\n // TODO(dchest): methods to encode chunk-by-chunk.\n function Coder(_paddingCharacter) {\n if (_paddingCharacter === void 0) { _paddingCharacter = \"=\"; }\n this._paddingCharacter = _paddingCharacter;\n }\n Coder.prototype.encodedLength = function (length) {\n if (!this._paddingCharacter) {\n return (length * 8 + 5) / 6 | 0;\n }\n return (length + 2) / 3 * 4 | 0;\n };\n Coder.prototype.encode = function (data) {\n var out = \"\";\n var i = 0;\n for (; i < data.length - 2; i += 3) {\n var c = (data[i] << 16) | (data[i + 1] << 8) | (data[i + 2]);\n out += this._encodeByte((c >>> 3 * 6) & 63);\n out += this._encodeByte((c >>> 2 * 6) & 63);\n out += this._encodeByte((c >>> 1 * 6) & 63);\n out += this._encodeByte((c >>> 0 * 6) & 63);\n }\n var left = data.length - i;\n if (left > 0) {\n var c = (data[i] << 16) | (left === 2 ? data[i + 1] << 8 : 0);\n out += this._encodeByte((c >>> 3 * 6) & 63);\n out += this._encodeByte((c >>> 2 * 6) & 63);\n if (left === 2) {\n out += this._encodeByte((c >>> 1 * 6) & 63);\n }\n else {\n out += this._paddingCharacter || \"\";\n }\n out += this._paddingCharacter || \"\";\n }\n return out;\n };\n Coder.prototype.maxDecodedLength = function (length) {\n if (!this._paddingCharacter) {\n return (length * 6 + 7) / 8 | 0;\n }\n return length / 4 * 3 | 0;\n };\n Coder.prototype.decodedLength = function (s) {\n return this.maxDecodedLength(s.length - this._getPaddingLength(s));\n };\n Coder.prototype.decode = function (s) {\n if (s.length === 0) {\n return new Uint8Array(0);\n }\n var paddingLength = this._getPaddingLength(s);\n var length = s.length - paddingLength;\n var out = new Uint8Array(this.maxDecodedLength(length));\n var op = 0;\n var i = 0;\n var haveBad = 0;\n var v0 = 0, v1 = 0, v2 = 0, v3 = 0;\n for (; i < length - 4; i += 4) {\n v0 = this._decodeChar(s.charCodeAt(i + 0));\n v1 = this._decodeChar(s.charCodeAt(i + 1));\n v2 = this._decodeChar(s.charCodeAt(i + 2));\n v3 = this._decodeChar(s.charCodeAt(i + 3));\n out[op++] = (v0 << 2) | (v1 >>> 4);\n out[op++] = (v1 << 4) | (v2 >>> 2);\n out[op++] = (v2 << 6) | v3;\n haveBad |= v0 & INVALID_BYTE;\n haveBad |= v1 & INVALID_BYTE;\n haveBad |= v2 & INVALID_BYTE;\n haveBad |= v3 & INVALID_BYTE;\n }\n if (i < length - 1) {\n v0 = this._decodeChar(s.charCodeAt(i));\n v1 = this._decodeChar(s.charCodeAt(i + 1));\n out[op++] = (v0 << 2) | (v1 >>> 4);\n haveBad |= v0 & INVALID_BYTE;\n haveBad |= v1 & INVALID_BYTE;\n }\n if (i < length - 2) {\n v2 = this._decodeChar(s.charCodeAt(i + 2));\n out[op++] = (v1 << 4) | (v2 >>> 2);\n haveBad |= v2 & INVALID_BYTE;\n }\n if (i < length - 3) {\n v3 = this._decodeChar(s.charCodeAt(i + 3));\n out[op++] = (v2 << 6) | v3;\n haveBad |= v3 & INVALID_BYTE;\n }\n if (haveBad !== 0) {\n throw new Error(\"Base64Coder: incorrect characters for decoding\");\n }\n return out;\n };\n // Standard encoding have the following encoded/decoded ranges,\n // which we need to convert between.\n //\n // ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz 0123456789 + /\n // Index: 0 - 25 26 - 51 52 - 61 62 63\n // ASCII: 65 - 90 97 - 122 48 - 57 43 47\n //\n // Encode 6 bits in b into a new character.\n Coder.prototype._encodeByte = function (b) {\n // Encoding uses constant time operations as follows:\n //\n // 1. Define comparison of A with B using (A - B) >>> 8:\n // if A > B, then result is positive integer\n // if A <= B, then result is 0\n //\n // 2. Define selection of C or 0 using bitwise AND: X & C:\n // if X == 0, then result is 0\n // if X != 0, then result is C\n //\n // 3. Start with the smallest comparison (b >= 0), which is always\n // true, so set the result to the starting ASCII value (65).\n //\n // 4. Continue comparing b to higher ASCII values, and selecting\n // zero if comparison isn't true, otherwise selecting a value\n // to add to result, which:\n //\n // a) undoes the previous addition\n // b) provides new value to add\n //\n var result = b;\n // b >= 0\n result += 65;\n // b > 25\n result += ((25 - b) >>> 8) & ((0 - 65) - 26 + 97);\n // b > 51\n result += ((51 - b) >>> 8) & ((26 - 97) - 52 + 48);\n // b > 61\n result += ((61 - b) >>> 8) & ((52 - 48) - 62 + 43);\n // b > 62\n result += ((62 - b) >>> 8) & ((62 - 43) - 63 + 47);\n return String.fromCharCode(result);\n };\n // Decode a character code into a byte.\n // Must return 256 if character is out of alphabet range.\n Coder.prototype._decodeChar = function (c) {\n // Decoding works similar to encoding: using the same comparison\n // function, but now it works on ranges: result is always incremented\n // by value, but this value becomes zero if the range is not\n // satisfied.\n //\n // Decoding starts with invalid value, 256, which is then\n // subtracted when the range is satisfied. If none of the ranges\n // apply, the function returns 256, which is then checked by\n // the caller to throw error.\n var result = INVALID_BYTE; // start with invalid character\n // c == 43 (c > 42 and c < 44)\n result += (((42 - c) & (c - 44)) >>> 8) & (-INVALID_BYTE + c - 43 + 62);\n // c == 47 (c > 46 and c < 48)\n result += (((46 - c) & (c - 48)) >>> 8) & (-INVALID_BYTE + c - 47 + 63);\n // c > 47 and c < 58\n result += (((47 - c) & (c - 58)) >>> 8) & (-INVALID_BYTE + c - 48 + 52);\n // c > 64 and c < 91\n result += (((64 - c) & (c - 91)) >>> 8) & (-INVALID_BYTE + c - 65 + 0);\n // c > 96 and c < 123\n result += (((96 - c) & (c - 123)) >>> 8) & (-INVALID_BYTE + c - 97 + 26);\n return result;\n };\n Coder.prototype._getPaddingLength = function (s) {\n var paddingLength = 0;\n if (this._paddingCharacter) {\n for (var i = s.length - 1; i >= 0; i--) {\n if (s[i] !== this._paddingCharacter) {\n break;\n }\n paddingLength++;\n }\n if (s.length < 4 || paddingLength > 2) {\n throw new Error(\"Base64Coder: incorrect padding\");\n }\n }\n return paddingLength;\n };\n return Coder;\n}());\nexports.Coder = Coder;\nvar stdCoder = new Coder();\nfunction encode(data) {\n return stdCoder.encode(data);\n}\nexports.encode = encode;\nfunction decode(s) {\n return stdCoder.decode(s);\n}\nexports.decode = decode;\n/**\n * Implements URL-safe Base64 encoding.\n * (Same as Base64, but '+' is replaced with '-', and '/' with '_').\n *\n * Operates in constant time.\n */\nvar URLSafeCoder = /** @class */ (function (_super) {\n __extends(URLSafeCoder, _super);\n function URLSafeCoder() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n // URL-safe encoding have the following encoded/decoded ranges:\n //\n // ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz 0123456789 - _\n // Index: 0 - 25 26 - 51 52 - 61 62 63\n // ASCII: 65 - 90 97 - 122 48 - 57 45 95\n //\n URLSafeCoder.prototype._encodeByte = function (b) {\n var result = b;\n // b >= 0\n result += 65;\n // b > 25\n result += ((25 - b) >>> 8) & ((0 - 65) - 26 + 97);\n // b > 51\n result += ((51 - b) >>> 8) & ((26 - 97) - 52 + 48);\n // b > 61\n result += ((61 - b) >>> 8) & ((52 - 48) - 62 + 45);\n // b > 62\n result += ((62 - b) >>> 8) & ((62 - 45) - 63 + 95);\n return String.fromCharCode(result);\n };\n URLSafeCoder.prototype._decodeChar = function (c) {\n var result = INVALID_BYTE;\n // c == 45 (c > 44 and c < 46)\n result += (((44 - c) & (c - 46)) >>> 8) & (-INVALID_BYTE + c - 45 + 62);\n // c == 95 (c > 94 and c < 96)\n result += (((94 - c) & (c - 96)) >>> 8) & (-INVALID_BYTE + c - 95 + 63);\n // c > 47 and c < 58\n result += (((47 - c) & (c - 58)) >>> 8) & (-INVALID_BYTE + c - 48 + 52);\n // c > 64 and c < 91\n result += (((64 - c) & (c - 91)) >>> 8) & (-INVALID_BYTE + c - 65 + 0);\n // c > 96 and c < 123\n result += (((96 - c) & (c - 123)) >>> 8) & (-INVALID_BYTE + c - 97 + 26);\n return result;\n };\n return URLSafeCoder;\n}(Coder));\nexports.URLSafeCoder = URLSafeCoder;\nvar urlSafeCoder = new URLSafeCoder();\nfunction encodeURLSafe(data) {\n return urlSafeCoder.encode(data);\n}\nexports.encodeURLSafe = encodeURLSafe;\nfunction decodeURLSafe(s) {\n return urlSafeCoder.decode(s);\n}\nexports.decodeURLSafe = decodeURLSafe;\nexports.encodedLength = function (length) {\n return stdCoder.encodedLength(length);\n};\nexports.maxDecodedLength = function (length) {\n return stdCoder.maxDecodedLength(length);\n};\nexports.decodedLength = function (s) {\n return stdCoder.decodedLength(s);\n};\n\n\n/***/ }),\n/* 1 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n// Copyright (C) 2016 Dmitry Chestnykh\n// MIT License. See LICENSE file for details.\nObject.defineProperty(exports, \"__esModule\", { value: true });\n/**\n * Package utf8 implements UTF-8 encoding and decoding.\n */\nvar INVALID_UTF16 = \"utf8: invalid string\";\nvar INVALID_UTF8 = \"utf8: invalid source encoding\";\n/**\n * Encodes the given string into UTF-8 byte array.\n * Throws if the source string has invalid UTF-16 encoding.\n */\nfunction encode(s) {\n // Calculate result length and allocate output array.\n // encodedLength() also validates string and throws errors,\n // so we don't need repeat validation here.\n var arr = new Uint8Array(encodedLength(s));\n var pos = 0;\n for (var i = 0; i < s.length; i++) {\n var c = s.charCodeAt(i);\n if (c < 0x80) {\n arr[pos++] = c;\n }\n else if (c < 0x800) {\n arr[pos++] = 0xc0 | c >> 6;\n arr[pos++] = 0x80 | c & 0x3f;\n }\n else if (c < 0xd800) {\n arr[pos++] = 0xe0 | c >> 12;\n arr[pos++] = 0x80 | (c >> 6) & 0x3f;\n arr[pos++] = 0x80 | c & 0x3f;\n }\n else {\n i++; // get one more character\n c = (c & 0x3ff) << 10;\n c |= s.charCodeAt(i) & 0x3ff;\n c += 0x10000;\n arr[pos++] = 0xf0 | c >> 18;\n arr[pos++] = 0x80 | (c >> 12) & 0x3f;\n arr[pos++] = 0x80 | (c >> 6) & 0x3f;\n arr[pos++] = 0x80 | c & 0x3f;\n }\n }\n return arr;\n}\nexports.encode = encode;\n/**\n * Returns the number of bytes required to encode the given string into UTF-8.\n * Throws if the source string has invalid UTF-16 encoding.\n */\nfunction encodedLength(s) {\n var result = 0;\n for (var i = 0; i < s.length; i++) {\n var c = s.charCodeAt(i);\n if (c < 0x80) {\n result += 1;\n }\n else if (c < 0x800) {\n result += 2;\n }\n else if (c < 0xd800) {\n result += 3;\n }\n else if (c <= 0xdfff) {\n if (i >= s.length - 1) {\n throw new Error(INVALID_UTF16);\n }\n i++; // \"eat\" next character\n result += 4;\n }\n else {\n throw new Error(INVALID_UTF16);\n }\n }\n return result;\n}\nexports.encodedLength = encodedLength;\n/**\n * Decodes the given byte array from UTF-8 into a string.\n * Throws if encoding is invalid.\n */\nfunction decode(arr) {\n var chars = [];\n for (var i = 0; i < arr.length; i++) {\n var b = arr[i];\n if (b & 0x80) {\n var min = void 0;\n if (b < 0xe0) {\n // Need 1 more byte.\n if (i >= arr.length) {\n throw new Error(INVALID_UTF8);\n }\n var n1 = arr[++i];\n if ((n1 & 0xc0) !== 0x80) {\n throw new Error(INVALID_UTF8);\n }\n b = (b & 0x1f) << 6 | (n1 & 0x3f);\n min = 0x80;\n }\n else if (b < 0xf0) {\n // Need 2 more bytes.\n if (i >= arr.length - 1) {\n throw new Error(INVALID_UTF8);\n }\n var n1 = arr[++i];\n var n2 = arr[++i];\n if ((n1 & 0xc0) !== 0x80 || (n2 & 0xc0) !== 0x80) {\n throw new Error(INVALID_UTF8);\n }\n b = (b & 0x0f) << 12 | (n1 & 0x3f) << 6 | (n2 & 0x3f);\n min = 0x800;\n }\n else if (b < 0xf8) {\n // Need 3 more bytes.\n if (i >= arr.length - 2) {\n throw new Error(INVALID_UTF8);\n }\n var n1 = arr[++i];\n var n2 = arr[++i];\n var n3 = arr[++i];\n if ((n1 & 0xc0) !== 0x80 || (n2 & 0xc0) !== 0x80 || (n3 & 0xc0) !== 0x80) {\n throw new Error(INVALID_UTF8);\n }\n b = (b & 0x0f) << 18 | (n1 & 0x3f) << 12 | (n2 & 0x3f) << 6 | (n3 & 0x3f);\n min = 0x10000;\n }\n else {\n throw new Error(INVALID_UTF8);\n }\n if (b < min || (b >= 0xd800 && b <= 0xdfff)) {\n throw new Error(INVALID_UTF8);\n }\n if (b >= 0x10000) {\n // Surrogate pair.\n if (b > 0x10ffff) {\n throw new Error(INVALID_UTF8);\n }\n b -= 0x10000;\n chars.push(String.fromCharCode(0xd800 | (b >> 10)));\n b = 0xdc00 | (b & 0x3ff);\n }\n }\n chars.push(String.fromCharCode(b));\n }\n return chars.join(\"\");\n}\nexports.decode = decode;\n\n\n/***/ }),\n/* 2 */\n/***/ (function(module, exports, __webpack_require__) {\n\n(function(nacl) {\n'use strict';\n\n// Ported in 2014 by Dmitry Chestnykh and Devi Mandiri.\n// Public domain.\n//\n// Implementation derived from TweetNaCl version 20140427.\n// See for details: http://tweetnacl.cr.yp.to/\n\nvar gf = function(init) {\n var i, r = new Float64Array(16);\n if (init) for (i = 0; i < init.length; i++) r[i] = init[i];\n return r;\n};\n\n// Pluggable, initialized in high-level API below.\nvar randombytes = function(/* x, n */) { throw new Error('no PRNG'); };\n\nvar _0 = new Uint8Array(16);\nvar _9 = new Uint8Array(32); _9[0] = 9;\n\nvar gf0 = gf(),\n gf1 = gf([1]),\n _121665 = gf([0xdb41, 1]),\n D = gf([0x78a3, 0x1359, 0x4dca, 0x75eb, 0xd8ab, 0x4141, 0x0a4d, 0x0070, 0xe898, 0x7779, 0x4079, 0x8cc7, 0xfe73, 0x2b6f, 0x6cee, 0x5203]),\n D2 = gf([0xf159, 0x26b2, 0x9b94, 0xebd6, 0xb156, 0x8283, 0x149a, 0x00e0, 0xd130, 0xeef3, 0x80f2, 0x198e, 0xfce7, 0x56df, 0xd9dc, 0x2406]),\n X = gf([0xd51a, 0x8f25, 0x2d60, 0xc956, 0xa7b2, 0x9525, 0xc760, 0x692c, 0xdc5c, 0xfdd6, 0xe231, 0xc0a4, 0x53fe, 0xcd6e, 0x36d3, 0x2169]),\n Y = gf([0x6658, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666]),\n I = gf([0xa0b0, 0x4a0e, 0x1b27, 0xc4ee, 0xe478, 0xad2f, 0x1806, 0x2f43, 0xd7a7, 0x3dfb, 0x0099, 0x2b4d, 0xdf0b, 0x4fc1, 0x2480, 0x2b83]);\n\nfunction ts64(x, i, h, l) {\n x[i] = (h >> 24) & 0xff;\n x[i+1] = (h >> 16) & 0xff;\n x[i+2] = (h >> 8) & 0xff;\n x[i+3] = h & 0xff;\n x[i+4] = (l >> 24) & 0xff;\n x[i+5] = (l >> 16) & 0xff;\n x[i+6] = (l >> 8) & 0xff;\n x[i+7] = l & 0xff;\n}\n\nfunction vn(x, xi, y, yi, n) {\n var i,d = 0;\n for (i = 0; i < n; i++) d |= x[xi+i]^y[yi+i];\n return (1 & ((d - 1) >>> 8)) - 1;\n}\n\nfunction crypto_verify_16(x, xi, y, yi) {\n return vn(x,xi,y,yi,16);\n}\n\nfunction crypto_verify_32(x, xi, y, yi) {\n return vn(x,xi,y,yi,32);\n}\n\nfunction core_salsa20(o, p, k, c) {\n var j0 = c[ 0] & 0xff | (c[ 1] & 0xff)<<8 | (c[ 2] & 0xff)<<16 | (c[ 3] & 0xff)<<24,\n j1 = k[ 0] & 0xff | (k[ 1] & 0xff)<<8 | (k[ 2] & 0xff)<<16 | (k[ 3] & 0xff)<<24,\n j2 = k[ 4] & 0xff | (k[ 5] & 0xff)<<8 | (k[ 6] & 0xff)<<16 | (k[ 7] & 0xff)<<24,\n j3 = k[ 8] & 0xff | (k[ 9] & 0xff)<<8 | (k[10] & 0xff)<<16 | (k[11] & 0xff)<<24,\n j4 = k[12] & 0xff | (k[13] & 0xff)<<8 | (k[14] & 0xff)<<16 | (k[15] & 0xff)<<24,\n j5 = c[ 4] & 0xff | (c[ 5] & 0xff)<<8 | (c[ 6] & 0xff)<<16 | (c[ 7] & 0xff)<<24,\n j6 = p[ 0] & 0xff | (p[ 1] & 0xff)<<8 | (p[ 2] & 0xff)<<16 | (p[ 3] & 0xff)<<24,\n j7 = p[ 4] & 0xff | (p[ 5] & 0xff)<<8 | (p[ 6] & 0xff)<<16 | (p[ 7] & 0xff)<<24,\n j8 = p[ 8] & 0xff | (p[ 9] & 0xff)<<8 | (p[10] & 0xff)<<16 | (p[11] & 0xff)<<24,\n j9 = p[12] & 0xff | (p[13] & 0xff)<<8 | (p[14] & 0xff)<<16 | (p[15] & 0xff)<<24,\n j10 = c[ 8] & 0xff | (c[ 9] & 0xff)<<8 | (c[10] & 0xff)<<16 | (c[11] & 0xff)<<24,\n j11 = k[16] & 0xff | (k[17] & 0xff)<<8 | (k[18] & 0xff)<<16 | (k[19] & 0xff)<<24,\n j12 = k[20] & 0xff | (k[21] & 0xff)<<8 | (k[22] & 0xff)<<16 | (k[23] & 0xff)<<24,\n j13 = k[24] & 0xff | (k[25] & 0xff)<<8 | (k[26] & 0xff)<<16 | (k[27] & 0xff)<<24,\n j14 = k[28] & 0xff | (k[29] & 0xff)<<8 | (k[30] & 0xff)<<16 | (k[31] & 0xff)<<24,\n j15 = c[12] & 0xff | (c[13] & 0xff)<<8 | (c[14] & 0xff)<<16 | (c[15] & 0xff)<<24;\n\n var x0 = j0, x1 = j1, x2 = j2, x3 = j3, x4 = j4, x5 = j5, x6 = j6, x7 = j7,\n x8 = j8, x9 = j9, x10 = j10, x11 = j11, x12 = j12, x13 = j13, x14 = j14,\n x15 = j15, u;\n\n for (var i = 0; i < 20; i += 2) {\n u = x0 + x12 | 0;\n x4 ^= u<<7 | u>>>(32-7);\n u = x4 + x0 | 0;\n x8 ^= u<<9 | u>>>(32-9);\n u = x8 + x4 | 0;\n x12 ^= u<<13 | u>>>(32-13);\n u = x12 + x8 | 0;\n x0 ^= u<<18 | u>>>(32-18);\n\n u = x5 + x1 | 0;\n x9 ^= u<<7 | u>>>(32-7);\n u = x9 + x5 | 0;\n x13 ^= u<<9 | u>>>(32-9);\n u = x13 + x9 | 0;\n x1 ^= u<<13 | u>>>(32-13);\n u = x1 + x13 | 0;\n x5 ^= u<<18 | u>>>(32-18);\n\n u = x10 + x6 | 0;\n x14 ^= u<<7 | u>>>(32-7);\n u = x14 + x10 | 0;\n x2 ^= u<<9 | u>>>(32-9);\n u = x2 + x14 | 0;\n x6 ^= u<<13 | u>>>(32-13);\n u = x6 + x2 | 0;\n x10 ^= u<<18 | u>>>(32-18);\n\n u = x15 + x11 | 0;\n x3 ^= u<<7 | u>>>(32-7);\n u = x3 + x15 | 0;\n x7 ^= u<<9 | u>>>(32-9);\n u = x7 + x3 | 0;\n x11 ^= u<<13 | u>>>(32-13);\n u = x11 + x7 | 0;\n x15 ^= u<<18 | u>>>(32-18);\n\n u = x0 + x3 | 0;\n x1 ^= u<<7 | u>>>(32-7);\n u = x1 + x0 | 0;\n x2 ^= u<<9 | u>>>(32-9);\n u = x2 + x1 | 0;\n x3 ^= u<<13 | u>>>(32-13);\n u = x3 + x2 | 0;\n x0 ^= u<<18 | u>>>(32-18);\n\n u = x5 + x4 | 0;\n x6 ^= u<<7 | u>>>(32-7);\n u = x6 + x5 | 0;\n x7 ^= u<<9 | u>>>(32-9);\n u = x7 + x6 | 0;\n x4 ^= u<<13 | u>>>(32-13);\n u = x4 + x7 | 0;\n x5 ^= u<<18 | u>>>(32-18);\n\n u = x10 + x9 | 0;\n x11 ^= u<<7 | u>>>(32-7);\n u = x11 + x10 | 0;\n x8 ^= u<<9 | u>>>(32-9);\n u = x8 + x11 | 0;\n x9 ^= u<<13 | u>>>(32-13);\n u = x9 + x8 | 0;\n x10 ^= u<<18 | u>>>(32-18);\n\n u = x15 + x14 | 0;\n x12 ^= u<<7 | u>>>(32-7);\n u = x12 + x15 | 0;\n x13 ^= u<<9 | u>>>(32-9);\n u = x13 + x12 | 0;\n x14 ^= u<<13 | u>>>(32-13);\n u = x14 + x13 | 0;\n x15 ^= u<<18 | u>>>(32-18);\n }\n x0 = x0 + j0 | 0;\n x1 = x1 + j1 | 0;\n x2 = x2 + j2 | 0;\n x3 = x3 + j3 | 0;\n x4 = x4 + j4 | 0;\n x5 = x5 + j5 | 0;\n x6 = x6 + j6 | 0;\n x7 = x7 + j7 | 0;\n x8 = x8 + j8 | 0;\n x9 = x9 + j9 | 0;\n x10 = x10 + j10 | 0;\n x11 = x11 + j11 | 0;\n x12 = x12 + j12 | 0;\n x13 = x13 + j13 | 0;\n x14 = x14 + j14 | 0;\n x15 = x15 + j15 | 0;\n\n o[ 0] = x0 >>> 0 & 0xff;\n o[ 1] = x0 >>> 8 & 0xff;\n o[ 2] = x0 >>> 16 & 0xff;\n o[ 3] = x0 >>> 24 & 0xff;\n\n o[ 4] = x1 >>> 0 & 0xff;\n o[ 5] = x1 >>> 8 & 0xff;\n o[ 6] = x1 >>> 16 & 0xff;\n o[ 7] = x1 >>> 24 & 0xff;\n\n o[ 8] = x2 >>> 0 & 0xff;\n o[ 9] = x2 >>> 8 & 0xff;\n o[10] = x2 >>> 16 & 0xff;\n o[11] = x2 >>> 24 & 0xff;\n\n o[12] = x3 >>> 0 & 0xff;\n o[13] = x3 >>> 8 & 0xff;\n o[14] = x3 >>> 16 & 0xff;\n o[15] = x3 >>> 24 & 0xff;\n\n o[16] = x4 >>> 0 & 0xff;\n o[17] = x4 >>> 8 & 0xff;\n o[18] = x4 >>> 16 & 0xff;\n o[19] = x4 >>> 24 & 0xff;\n\n o[20] = x5 >>> 0 & 0xff;\n o[21] = x5 >>> 8 & 0xff;\n o[22] = x5 >>> 16 & 0xff;\n o[23] = x5 >>> 24 & 0xff;\n\n o[24] = x6 >>> 0 & 0xff;\n o[25] = x6 >>> 8 & 0xff;\n o[26] = x6 >>> 16 & 0xff;\n o[27] = x6 >>> 24 & 0xff;\n\n o[28] = x7 >>> 0 & 0xff;\n o[29] = x7 >>> 8 & 0xff;\n o[30] = x7 >>> 16 & 0xff;\n o[31] = x7 >>> 24 & 0xff;\n\n o[32] = x8 >>> 0 & 0xff;\n o[33] = x8 >>> 8 & 0xff;\n o[34] = x8 >>> 16 & 0xff;\n o[35] = x8 >>> 24 & 0xff;\n\n o[36] = x9 >>> 0 & 0xff;\n o[37] = x9 >>> 8 & 0xff;\n o[38] = x9 >>> 16 & 0xff;\n o[39] = x9 >>> 24 & 0xff;\n\n o[40] = x10 >>> 0 & 0xff;\n o[41] = x10 >>> 8 & 0xff;\n o[42] = x10 >>> 16 & 0xff;\n o[43] = x10 >>> 24 & 0xff;\n\n o[44] = x11 >>> 0 & 0xff;\n o[45] = x11 >>> 8 & 0xff;\n o[46] = x11 >>> 16 & 0xff;\n o[47] = x11 >>> 24 & 0xff;\n\n o[48] = x12 >>> 0 & 0xff;\n o[49] = x12 >>> 8 & 0xff;\n o[50] = x12 >>> 16 & 0xff;\n o[51] = x12 >>> 24 & 0xff;\n\n o[52] = x13 >>> 0 & 0xff;\n o[53] = x13 >>> 8 & 0xff;\n o[54] = x13 >>> 16 & 0xff;\n o[55] = x13 >>> 24 & 0xff;\n\n o[56] = x14 >>> 0 & 0xff;\n o[57] = x14 >>> 8 & 0xff;\n o[58] = x14 >>> 16 & 0xff;\n o[59] = x14 >>> 24 & 0xff;\n\n o[60] = x15 >>> 0 & 0xff;\n o[61] = x15 >>> 8 & 0xff;\n o[62] = x15 >>> 16 & 0xff;\n o[63] = x15 >>> 24 & 0xff;\n}\n\nfunction core_hsalsa20(o,p,k,c) {\n var j0 = c[ 0] & 0xff | (c[ 1] & 0xff)<<8 | (c[ 2] & 0xff)<<16 | (c[ 3] & 0xff)<<24,\n j1 = k[ 0] & 0xff | (k[ 1] & 0xff)<<8 | (k[ 2] & 0xff)<<16 | (k[ 3] & 0xff)<<24,\n j2 = k[ 4] & 0xff | (k[ 5] & 0xff)<<8 | (k[ 6] & 0xff)<<16 | (k[ 7] & 0xff)<<24,\n j3 = k[ 8] & 0xff | (k[ 9] & 0xff)<<8 | (k[10] & 0xff)<<16 | (k[11] & 0xff)<<24,\n j4 = k[12] & 0xff | (k[13] & 0xff)<<8 | (k[14] & 0xff)<<16 | (k[15] & 0xff)<<24,\n j5 = c[ 4] & 0xff | (c[ 5] & 0xff)<<8 | (c[ 6] & 0xff)<<16 | (c[ 7] & 0xff)<<24,\n j6 = p[ 0] & 0xff | (p[ 1] & 0xff)<<8 | (p[ 2] & 0xff)<<16 | (p[ 3] & 0xff)<<24,\n j7 = p[ 4] & 0xff | (p[ 5] & 0xff)<<8 | (p[ 6] & 0xff)<<16 | (p[ 7] & 0xff)<<24,\n j8 = p[ 8] & 0xff | (p[ 9] & 0xff)<<8 | (p[10] & 0xff)<<16 | (p[11] & 0xff)<<24,\n j9 = p[12] & 0xff | (p[13] & 0xff)<<8 | (p[14] & 0xff)<<16 | (p[15] & 0xff)<<24,\n j10 = c[ 8] & 0xff | (c[ 9] & 0xff)<<8 | (c[10] & 0xff)<<16 | (c[11] & 0xff)<<24,\n j11 = k[16] & 0xff | (k[17] & 0xff)<<8 | (k[18] & 0xff)<<16 | (k[19] & 0xff)<<24,\n j12 = k[20] & 0xff | (k[21] & 0xff)<<8 | (k[22] & 0xff)<<16 | (k[23] & 0xff)<<24,\n j13 = k[24] & 0xff | (k[25] & 0xff)<<8 | (k[26] & 0xff)<<16 | (k[27] & 0xff)<<24,\n j14 = k[28] & 0xff | (k[29] & 0xff)<<8 | (k[30] & 0xff)<<16 | (k[31] & 0xff)<<24,\n j15 = c[12] & 0xff | (c[13] & 0xff)<<8 | (c[14] & 0xff)<<16 | (c[15] & 0xff)<<24;\n\n var x0 = j0, x1 = j1, x2 = j2, x3 = j3, x4 = j4, x5 = j5, x6 = j6, x7 = j7,\n x8 = j8, x9 = j9, x10 = j10, x11 = j11, x12 = j12, x13 = j13, x14 = j14,\n x15 = j15, u;\n\n for (var i = 0; i < 20; i += 2) {\n u = x0 + x12 | 0;\n x4 ^= u<<7 | u>>>(32-7);\n u = x4 + x0 | 0;\n x8 ^= u<<9 | u>>>(32-9);\n u = x8 + x4 | 0;\n x12 ^= u<<13 | u>>>(32-13);\n u = x12 + x8 | 0;\n x0 ^= u<<18 | u>>>(32-18);\n\n u = x5 + x1 | 0;\n x9 ^= u<<7 | u>>>(32-7);\n u = x9 + x5 | 0;\n x13 ^= u<<9 | u>>>(32-9);\n u = x13 + x9 | 0;\n x1 ^= u<<13 | u>>>(32-13);\n u = x1 + x13 | 0;\n x5 ^= u<<18 | u>>>(32-18);\n\n u = x10 + x6 | 0;\n x14 ^= u<<7 | u>>>(32-7);\n u = x14 + x10 | 0;\n x2 ^= u<<9 | u>>>(32-9);\n u = x2 + x14 | 0;\n x6 ^= u<<13 | u>>>(32-13);\n u = x6 + x2 | 0;\n x10 ^= u<<18 | u>>>(32-18);\n\n u = x15 + x11 | 0;\n x3 ^= u<<7 | u>>>(32-7);\n u = x3 + x15 | 0;\n x7 ^= u<<9 | u>>>(32-9);\n u = x7 + x3 | 0;\n x11 ^= u<<13 | u>>>(32-13);\n u = x11 + x7 | 0;\n x15 ^= u<<18 | u>>>(32-18);\n\n u = x0 + x3 | 0;\n x1 ^= u<<7 | u>>>(32-7);\n u = x1 + x0 | 0;\n x2 ^= u<<9 | u>>>(32-9);\n u = x2 + x1 | 0;\n x3 ^= u<<13 | u>>>(32-13);\n u = x3 + x2 | 0;\n x0 ^= u<<18 | u>>>(32-18);\n\n u = x5 + x4 | 0;\n x6 ^= u<<7 | u>>>(32-7);\n u = x6 + x5 | 0;\n x7 ^= u<<9 | u>>>(32-9);\n u = x7 + x6 | 0;\n x4 ^= u<<13 | u>>>(32-13);\n u = x4 + x7 | 0;\n x5 ^= u<<18 | u>>>(32-18);\n\n u = x10 + x9 | 0;\n x11 ^= u<<7 | u>>>(32-7);\n u = x11 + x10 | 0;\n x8 ^= u<<9 | u>>>(32-9);\n u = x8 + x11 | 0;\n x9 ^= u<<13 | u>>>(32-13);\n u = x9 + x8 | 0;\n x10 ^= u<<18 | u>>>(32-18);\n\n u = x15 + x14 | 0;\n x12 ^= u<<7 | u>>>(32-7);\n u = x12 + x15 | 0;\n x13 ^= u<<9 | u>>>(32-9);\n u = x13 + x12 | 0;\n x14 ^= u<<13 | u>>>(32-13);\n u = x14 + x13 | 0;\n x15 ^= u<<18 | u>>>(32-18);\n }\n\n o[ 0] = x0 >>> 0 & 0xff;\n o[ 1] = x0 >>> 8 & 0xff;\n o[ 2] = x0 >>> 16 & 0xff;\n o[ 3] = x0 >>> 24 & 0xff;\n\n o[ 4] = x5 >>> 0 & 0xff;\n o[ 5] = x5 >>> 8 & 0xff;\n o[ 6] = x5 >>> 16 & 0xff;\n o[ 7] = x5 >>> 24 & 0xff;\n\n o[ 8] = x10 >>> 0 & 0xff;\n o[ 9] = x10 >>> 8 & 0xff;\n o[10] = x10 >>> 16 & 0xff;\n o[11] = x10 >>> 24 & 0xff;\n\n o[12] = x15 >>> 0 & 0xff;\n o[13] = x15 >>> 8 & 0xff;\n o[14] = x15 >>> 16 & 0xff;\n o[15] = x15 >>> 24 & 0xff;\n\n o[16] = x6 >>> 0 & 0xff;\n o[17] = x6 >>> 8 & 0xff;\n o[18] = x6 >>> 16 & 0xff;\n o[19] = x6 >>> 24 & 0xff;\n\n o[20] = x7 >>> 0 & 0xff;\n o[21] = x7 >>> 8 & 0xff;\n o[22] = x7 >>> 16 & 0xff;\n o[23] = x7 >>> 24 & 0xff;\n\n o[24] = x8 >>> 0 & 0xff;\n o[25] = x8 >>> 8 & 0xff;\n o[26] = x8 >>> 16 & 0xff;\n o[27] = x8 >>> 24 & 0xff;\n\n o[28] = x9 >>> 0 & 0xff;\n o[29] = x9 >>> 8 & 0xff;\n o[30] = x9 >>> 16 & 0xff;\n o[31] = x9 >>> 24 & 0xff;\n}\n\nfunction crypto_core_salsa20(out,inp,k,c) {\n core_salsa20(out,inp,k,c);\n}\n\nfunction crypto_core_hsalsa20(out,inp,k,c) {\n core_hsalsa20(out,inp,k,c);\n}\n\nvar sigma = new Uint8Array([101, 120, 112, 97, 110, 100, 32, 51, 50, 45, 98, 121, 116, 101, 32, 107]);\n // \"expand 32-byte k\"\n\nfunction crypto_stream_salsa20_xor(c,cpos,m,mpos,b,n,k) {\n var z = new Uint8Array(16), x = new Uint8Array(64);\n var u, i;\n for (i = 0; i < 16; i++) z[i] = 0;\n for (i = 0; i < 8; i++) z[i] = n[i];\n while (b >= 64) {\n crypto_core_salsa20(x,z,k,sigma);\n for (i = 0; i < 64; i++) c[cpos+i] = m[mpos+i] ^ x[i];\n u = 1;\n for (i = 8; i < 16; i++) {\n u = u + (z[i] & 0xff) | 0;\n z[i] = u & 0xff;\n u >>>= 8;\n }\n b -= 64;\n cpos += 64;\n mpos += 64;\n }\n if (b > 0) {\n crypto_core_salsa20(x,z,k,sigma);\n for (i = 0; i < b; i++) c[cpos+i] = m[mpos+i] ^ x[i];\n }\n return 0;\n}\n\nfunction crypto_stream_salsa20(c,cpos,b,n,k) {\n var z = new Uint8Array(16), x = new Uint8Array(64);\n var u, i;\n for (i = 0; i < 16; i++) z[i] = 0;\n for (i = 0; i < 8; i++) z[i] = n[i];\n while (b >= 64) {\n crypto_core_salsa20(x,z,k,sigma);\n for (i = 0; i < 64; i++) c[cpos+i] = x[i];\n u = 1;\n for (i = 8; i < 16; i++) {\n u = u + (z[i] & 0xff) | 0;\n z[i] = u & 0xff;\n u >>>= 8;\n }\n b -= 64;\n cpos += 64;\n }\n if (b > 0) {\n crypto_core_salsa20(x,z,k,sigma);\n for (i = 0; i < b; i++) c[cpos+i] = x[i];\n }\n return 0;\n}\n\nfunction crypto_stream(c,cpos,d,n,k) {\n var s = new Uint8Array(32);\n crypto_core_hsalsa20(s,n,k,sigma);\n var sn = new Uint8Array(8);\n for (var i = 0; i < 8; i++) sn[i] = n[i+16];\n return crypto_stream_salsa20(c,cpos,d,sn,s);\n}\n\nfunction crypto_stream_xor(c,cpos,m,mpos,d,n,k) {\n var s = new Uint8Array(32);\n crypto_core_hsalsa20(s,n,k,sigma);\n var sn = new Uint8Array(8);\n for (var i = 0; i < 8; i++) sn[i] = n[i+16];\n return crypto_stream_salsa20_xor(c,cpos,m,mpos,d,sn,s);\n}\n\n/*\n* Port of Andrew Moon's Poly1305-donna-16. Public domain.\n* https://github.com/floodyberry/poly1305-donna\n*/\n\nvar poly1305 = function(key) {\n this.buffer = new Uint8Array(16);\n this.r = new Uint16Array(10);\n this.h = new Uint16Array(10);\n this.pad = new Uint16Array(8);\n this.leftover = 0;\n this.fin = 0;\n\n var t0, t1, t2, t3, t4, t5, t6, t7;\n\n t0 = key[ 0] & 0xff | (key[ 1] & 0xff) << 8; this.r[0] = ( t0 ) & 0x1fff;\n t1 = key[ 2] & 0xff | (key[ 3] & 0xff) << 8; this.r[1] = ((t0 >>> 13) | (t1 << 3)) & 0x1fff;\n t2 = key[ 4] & 0xff | (key[ 5] & 0xff) << 8; this.r[2] = ((t1 >>> 10) | (t2 << 6)) & 0x1f03;\n t3 = key[ 6] & 0xff | (key[ 7] & 0xff) << 8; this.r[3] = ((t2 >>> 7) | (t3 << 9)) & 0x1fff;\n t4 = key[ 8] & 0xff | (key[ 9] & 0xff) << 8; this.r[4] = ((t3 >>> 4) | (t4 << 12)) & 0x00ff;\n this.r[5] = ((t4 >>> 1)) & 0x1ffe;\n t5 = key[10] & 0xff | (key[11] & 0xff) << 8; this.r[6] = ((t4 >>> 14) | (t5 << 2)) & 0x1fff;\n t6 = key[12] & 0xff | (key[13] & 0xff) << 8; this.r[7] = ((t5 >>> 11) | (t6 << 5)) & 0x1f81;\n t7 = key[14] & 0xff | (key[15] & 0xff) << 8; this.r[8] = ((t6 >>> 8) | (t7 << 8)) & 0x1fff;\n this.r[9] = ((t7 >>> 5)) & 0x007f;\n\n this.pad[0] = key[16] & 0xff | (key[17] & 0xff) << 8;\n this.pad[1] = key[18] & 0xff | (key[19] & 0xff) << 8;\n this.pad[2] = key[20] & 0xff | (key[21] & 0xff) << 8;\n this.pad[3] = key[22] & 0xff | (key[23] & 0xff) << 8;\n this.pad[4] = key[24] & 0xff | (key[25] & 0xff) << 8;\n this.pad[5] = key[26] & 0xff | (key[27] & 0xff) << 8;\n this.pad[6] = key[28] & 0xff | (key[29] & 0xff) << 8;\n this.pad[7] = key[30] & 0xff | (key[31] & 0xff) << 8;\n};\n\npoly1305.prototype.blocks = function(m, mpos, bytes) {\n var hibit = this.fin ? 0 : (1 << 11);\n var t0, t1, t2, t3, t4, t5, t6, t7, c;\n var d0, d1, d2, d3, d4, d5, d6, d7, d8, d9;\n\n var h0 = this.h[0],\n h1 = this.h[1],\n h2 = this.h[2],\n h3 = this.h[3],\n h4 = this.h[4],\n h5 = this.h[5],\n h6 = this.h[6],\n h7 = this.h[7],\n h8 = this.h[8],\n h9 = this.h[9];\n\n var r0 = this.r[0],\n r1 = this.r[1],\n r2 = this.r[2],\n r3 = this.r[3],\n r4 = this.r[4],\n r5 = this.r[5],\n r6 = this.r[6],\n r7 = this.r[7],\n r8 = this.r[8],\n r9 = this.r[9];\n\n while (bytes >= 16) {\n t0 = m[mpos+ 0] & 0xff | (m[mpos+ 1] & 0xff) << 8; h0 += ( t0 ) & 0x1fff;\n t1 = m[mpos+ 2] & 0xff | (m[mpos+ 3] & 0xff) << 8; h1 += ((t0 >>> 13) | (t1 << 3)) & 0x1fff;\n t2 = m[mpos+ 4] & 0xff | (m[mpos+ 5] & 0xff) << 8; h2 += ((t1 >>> 10) | (t2 << 6)) & 0x1fff;\n t3 = m[mpos+ 6] & 0xff | (m[mpos+ 7] & 0xff) << 8; h3 += ((t2 >>> 7) | (t3 << 9)) & 0x1fff;\n t4 = m[mpos+ 8] & 0xff | (m[mpos+ 9] & 0xff) << 8; h4 += ((t3 >>> 4) | (t4 << 12)) & 0x1fff;\n h5 += ((t4 >>> 1)) & 0x1fff;\n t5 = m[mpos+10] & 0xff | (m[mpos+11] & 0xff) << 8; h6 += ((t4 >>> 14) | (t5 << 2)) & 0x1fff;\n t6 = m[mpos+12] & 0xff | (m[mpos+13] & 0xff) << 8; h7 += ((t5 >>> 11) | (t6 << 5)) & 0x1fff;\n t7 = m[mpos+14] & 0xff | (m[mpos+15] & 0xff) << 8; h8 += ((t6 >>> 8) | (t7 << 8)) & 0x1fff;\n h9 += ((t7 >>> 5)) | hibit;\n\n c = 0;\n\n d0 = c;\n d0 += h0 * r0;\n d0 += h1 * (5 * r9);\n d0 += h2 * (5 * r8);\n d0 += h3 * (5 * r7);\n d0 += h4 * (5 * r6);\n c = (d0 >>> 13); d0 &= 0x1fff;\n d0 += h5 * (5 * r5);\n d0 += h6 * (5 * r4);\n d0 += h7 * (5 * r3);\n d0 += h8 * (5 * r2);\n d0 += h9 * (5 * r1);\n c += (d0 >>> 13); d0 &= 0x1fff;\n\n d1 = c;\n d1 += h0 * r1;\n d1 += h1 * r0;\n d1 += h2 * (5 * r9);\n d1 += h3 * (5 * r8);\n d1 += h4 * (5 * r7);\n c = (d1 >>> 13); d1 &= 0x1fff;\n d1 += h5 * (5 * r6);\n d1 += h6 * (5 * r5);\n d1 += h7 * (5 * r4);\n d1 += h8 * (5 * r3);\n d1 += h9 * (5 * r2);\n c += (d1 >>> 13); d1 &= 0x1fff;\n\n d2 = c;\n d2 += h0 * r2;\n d2 += h1 * r1;\n d2 += h2 * r0;\n d2 += h3 * (5 * r9);\n d2 += h4 * (5 * r8);\n c = (d2 >>> 13); d2 &= 0x1fff;\n d2 += h5 * (5 * r7);\n d2 += h6 * (5 * r6);\n d2 += h7 * (5 * r5);\n d2 += h8 * (5 * r4);\n d2 += h9 * (5 * r3);\n c += (d2 >>> 13); d2 &= 0x1fff;\n\n d3 = c;\n d3 += h0 * r3;\n d3 += h1 * r2;\n d3 += h2 * r1;\n d3 += h3 * r0;\n d3 += h4 * (5 * r9);\n c = (d3 >>> 13); d3 &= 0x1fff;\n d3 += h5 * (5 * r8);\n d3 += h6 * (5 * r7);\n d3 += h7 * (5 * r6);\n d3 += h8 * (5 * r5);\n d3 += h9 * (5 * r4);\n c += (d3 >>> 13); d3 &= 0x1fff;\n\n d4 = c;\n d4 += h0 * r4;\n d4 += h1 * r3;\n d4 += h2 * r2;\n d4 += h3 * r1;\n d4 += h4 * r0;\n c = (d4 >>> 13); d4 &= 0x1fff;\n d4 += h5 * (5 * r9);\n d4 += h6 * (5 * r8);\n d4 += h7 * (5 * r7);\n d4 += h8 * (5 * r6);\n d4 += h9 * (5 * r5);\n c += (d4 >>> 13); d4 &= 0x1fff;\n\n d5 = c;\n d5 += h0 * r5;\n d5 += h1 * r4;\n d5 += h2 * r3;\n d5 += h3 * r2;\n d5 += h4 * r1;\n c = (d5 >>> 13); d5 &= 0x1fff;\n d5 += h5 * r0;\n d5 += h6 * (5 * r9);\n d5 += h7 * (5 * r8);\n d5 += h8 * (5 * r7);\n d5 += h9 * (5 * r6);\n c += (d5 >>> 13); d5 &= 0x1fff;\n\n d6 = c;\n d6 += h0 * r6;\n d6 += h1 * r5;\n d6 += h2 * r4;\n d6 += h3 * r3;\n d6 += h4 * r2;\n c = (d6 >>> 13); d6 &= 0x1fff;\n d6 += h5 * r1;\n d6 += h6 * r0;\n d6 += h7 * (5 * r9);\n d6 += h8 * (5 * r8);\n d6 += h9 * (5 * r7);\n c += (d6 >>> 13); d6 &= 0x1fff;\n\n d7 = c;\n d7 += h0 * r7;\n d7 += h1 * r6;\n d7 += h2 * r5;\n d7 += h3 * r4;\n d7 += h4 * r3;\n c = (d7 >>> 13); d7 &= 0x1fff;\n d7 += h5 * r2;\n d7 += h6 * r1;\n d7 += h7 * r0;\n d7 += h8 * (5 * r9);\n d7 += h9 * (5 * r8);\n c += (d7 >>> 13); d7 &= 0x1fff;\n\n d8 = c;\n d8 += h0 * r8;\n d8 += h1 * r7;\n d8 += h2 * r6;\n d8 += h3 * r5;\n d8 += h4 * r4;\n c = (d8 >>> 13); d8 &= 0x1fff;\n d8 += h5 * r3;\n d8 += h6 * r2;\n d8 += h7 * r1;\n d8 += h8 * r0;\n d8 += h9 * (5 * r9);\n c += (d8 >>> 13); d8 &= 0x1fff;\n\n d9 = c;\n d9 += h0 * r9;\n d9 += h1 * r8;\n d9 += h2 * r7;\n d9 += h3 * r6;\n d9 += h4 * r5;\n c = (d9 >>> 13); d9 &= 0x1fff;\n d9 += h5 * r4;\n d9 += h6 * r3;\n d9 += h7 * r2;\n d9 += h8 * r1;\n d9 += h9 * r0;\n c += (d9 >>> 13); d9 &= 0x1fff;\n\n c = (((c << 2) + c)) | 0;\n c = (c + d0) | 0;\n d0 = c & 0x1fff;\n c = (c >>> 13);\n d1 += c;\n\n h0 = d0;\n h1 = d1;\n h2 = d2;\n h3 = d3;\n h4 = d4;\n h5 = d5;\n h6 = d6;\n h7 = d7;\n h8 = d8;\n h9 = d9;\n\n mpos += 16;\n bytes -= 16;\n }\n this.h[0] = h0;\n this.h[1] = h1;\n this.h[2] = h2;\n this.h[3] = h3;\n this.h[4] = h4;\n this.h[5] = h5;\n this.h[6] = h6;\n this.h[7] = h7;\n this.h[8] = h8;\n this.h[9] = h9;\n};\n\npoly1305.prototype.finish = function(mac, macpos) {\n var g = new Uint16Array(10);\n var c, mask, f, i;\n\n if (this.leftover) {\n i = this.leftover;\n this.buffer[i++] = 1;\n for (; i < 16; i++) this.buffer[i] = 0;\n this.fin = 1;\n this.blocks(this.buffer, 0, 16);\n }\n\n c = this.h[1] >>> 13;\n this.h[1] &= 0x1fff;\n for (i = 2; i < 10; i++) {\n this.h[i] += c;\n c = this.h[i] >>> 13;\n this.h[i] &= 0x1fff;\n }\n this.h[0] += (c * 5);\n c = this.h[0] >>> 13;\n this.h[0] &= 0x1fff;\n this.h[1] += c;\n c = this.h[1] >>> 13;\n this.h[1] &= 0x1fff;\n this.h[2] += c;\n\n g[0] = this.h[0] + 5;\n c = g[0] >>> 13;\n g[0] &= 0x1fff;\n for (i = 1; i < 10; i++) {\n g[i] = this.h[i] + c;\n c = g[i] >>> 13;\n g[i] &= 0x1fff;\n }\n g[9] -= (1 << 13);\n\n mask = (c ^ 1) - 1;\n for (i = 0; i < 10; i++) g[i] &= mask;\n mask = ~mask;\n for (i = 0; i < 10; i++) this.h[i] = (this.h[i] & mask) | g[i];\n\n this.h[0] = ((this.h[0] ) | (this.h[1] << 13) ) & 0xffff;\n this.h[1] = ((this.h[1] >>> 3) | (this.h[2] << 10) ) & 0xffff;\n this.h[2] = ((this.h[2] >>> 6) | (this.h[3] << 7) ) & 0xffff;\n this.h[3] = ((this.h[3] >>> 9) | (this.h[4] << 4) ) & 0xffff;\n this.h[4] = ((this.h[4] >>> 12) | (this.h[5] << 1) | (this.h[6] << 14)) & 0xffff;\n this.h[5] = ((this.h[6] >>> 2) | (this.h[7] << 11) ) & 0xffff;\n this.h[6] = ((this.h[7] >>> 5) | (this.h[8] << 8) ) & 0xffff;\n this.h[7] = ((this.h[8] >>> 8) | (this.h[9] << 5) ) & 0xffff;\n\n f = this.h[0] + this.pad[0];\n this.h[0] = f & 0xffff;\n for (i = 1; i < 8; i++) {\n f = (((this.h[i] + this.pad[i]) | 0) + (f >>> 16)) | 0;\n this.h[i] = f & 0xffff;\n }\n\n mac[macpos+ 0] = (this.h[0] >>> 0) & 0xff;\n mac[macpos+ 1] = (this.h[0] >>> 8) & 0xff;\n mac[macpos+ 2] = (this.h[1] >>> 0) & 0xff;\n mac[macpos+ 3] = (this.h[1] >>> 8) & 0xff;\n mac[macpos+ 4] = (this.h[2] >>> 0) & 0xff;\n mac[macpos+ 5] = (this.h[2] >>> 8) & 0xff;\n mac[macpos+ 6] = (this.h[3] >>> 0) & 0xff;\n mac[macpos+ 7] = (this.h[3] >>> 8) & 0xff;\n mac[macpos+ 8] = (this.h[4] >>> 0) & 0xff;\n mac[macpos+ 9] = (this.h[4] >>> 8) & 0xff;\n mac[macpos+10] = (this.h[5] >>> 0) & 0xff;\n mac[macpos+11] = (this.h[5] >>> 8) & 0xff;\n mac[macpos+12] = (this.h[6] >>> 0) & 0xff;\n mac[macpos+13] = (this.h[6] >>> 8) & 0xff;\n mac[macpos+14] = (this.h[7] >>> 0) & 0xff;\n mac[macpos+15] = (this.h[7] >>> 8) & 0xff;\n};\n\npoly1305.prototype.update = function(m, mpos, bytes) {\n var i, want;\n\n if (this.leftover) {\n want = (16 - this.leftover);\n if (want > bytes)\n want = bytes;\n for (i = 0; i < want; i++)\n this.buffer[this.leftover + i] = m[mpos+i];\n bytes -= want;\n mpos += want;\n this.leftover += want;\n if (this.leftover < 16)\n return;\n this.blocks(this.buffer, 0, 16);\n this.leftover = 0;\n }\n\n if (bytes >= 16) {\n want = bytes - (bytes % 16);\n this.blocks(m, mpos, want);\n mpos += want;\n bytes -= want;\n }\n\n if (bytes) {\n for (i = 0; i < bytes; i++)\n this.buffer[this.leftover + i] = m[mpos+i];\n this.leftover += bytes;\n }\n};\n\nfunction crypto_onetimeauth(out, outpos, m, mpos, n, k) {\n var s = new poly1305(k);\n s.update(m, mpos, n);\n s.finish(out, outpos);\n return 0;\n}\n\nfunction crypto_onetimeauth_verify(h, hpos, m, mpos, n, k) {\n var x = new Uint8Array(16);\n crypto_onetimeauth(x,0,m,mpos,n,k);\n return crypto_verify_16(h,hpos,x,0);\n}\n\nfunction crypto_secretbox(c,m,d,n,k) {\n var i;\n if (d < 32) return -1;\n crypto_stream_xor(c,0,m,0,d,n,k);\n crypto_onetimeauth(c, 16, c, 32, d - 32, c);\n for (i = 0; i < 16; i++) c[i] = 0;\n return 0;\n}\n\nfunction crypto_secretbox_open(m,c,d,n,k) {\n var i;\n var x = new Uint8Array(32);\n if (d < 32) return -1;\n crypto_stream(x,0,32,n,k);\n if (crypto_onetimeauth_verify(c, 16,c, 32,d - 32,x) !== 0) return -1;\n crypto_stream_xor(m,0,c,0,d,n,k);\n for (i = 0; i < 32; i++) m[i] = 0;\n return 0;\n}\n\nfunction set25519(r, a) {\n var i;\n for (i = 0; i < 16; i++) r[i] = a[i]|0;\n}\n\nfunction car25519(o) {\n var i, v, c = 1;\n for (i = 0; i < 16; i++) {\n v = o[i] + c + 65535;\n c = Math.floor(v / 65536);\n o[i] = v - c * 65536;\n }\n o[0] += c-1 + 37 * (c-1);\n}\n\nfunction sel25519(p, q, b) {\n var t, c = ~(b-1);\n for (var i = 0; i < 16; i++) {\n t = c & (p[i] ^ q[i]);\n p[i] ^= t;\n q[i] ^= t;\n }\n}\n\nfunction pack25519(o, n) {\n var i, j, b;\n var m = gf(), t = gf();\n for (i = 0; i < 16; i++) t[i] = n[i];\n car25519(t);\n car25519(t);\n car25519(t);\n for (j = 0; j < 2; j++) {\n m[0] = t[0] - 0xffed;\n for (i = 1; i < 15; i++) {\n m[i] = t[i] - 0xffff - ((m[i-1]>>16) & 1);\n m[i-1] &= 0xffff;\n }\n m[15] = t[15] - 0x7fff - ((m[14]>>16) & 1);\n b = (m[15]>>16) & 1;\n m[14] &= 0xffff;\n sel25519(t, m, 1-b);\n }\n for (i = 0; i < 16; i++) {\n o[2*i] = t[i] & 0xff;\n o[2*i+1] = t[i]>>8;\n }\n}\n\nfunction neq25519(a, b) {\n var c = new Uint8Array(32), d = new Uint8Array(32);\n pack25519(c, a);\n pack25519(d, b);\n return crypto_verify_32(c, 0, d, 0);\n}\n\nfunction par25519(a) {\n var d = new Uint8Array(32);\n pack25519(d, a);\n return d[0] & 1;\n}\n\nfunction unpack25519(o, n) {\n var i;\n for (i = 0; i < 16; i++) o[i] = n[2*i] + (n[2*i+1] << 8);\n o[15] &= 0x7fff;\n}\n\nfunction A(o, a, b) {\n for (var i = 0; i < 16; i++) o[i] = a[i] + b[i];\n}\n\nfunction Z(o, a, b) {\n for (var i = 0; i < 16; i++) o[i] = a[i] - b[i];\n}\n\nfunction M(o, a, b) {\n var v, c,\n t0 = 0, t1 = 0, t2 = 0, t3 = 0, t4 = 0, t5 = 0, t6 = 0, t7 = 0,\n t8 = 0, t9 = 0, t10 = 0, t11 = 0, t12 = 0, t13 = 0, t14 = 0, t15 = 0,\n t16 = 0, t17 = 0, t18 = 0, t19 = 0, t20 = 0, t21 = 0, t22 = 0, t23 = 0,\n t24 = 0, t25 = 0, t26 = 0, t27 = 0, t28 = 0, t29 = 0, t30 = 0,\n b0 = b[0],\n b1 = b[1],\n b2 = b[2],\n b3 = b[3],\n b4 = b[4],\n b5 = b[5],\n b6 = b[6],\n b7 = b[7],\n b8 = b[8],\n b9 = b[9],\n b10 = b[10],\n b11 = b[11],\n b12 = b[12],\n b13 = b[13],\n b14 = b[14],\n b15 = b[15];\n\n v = a[0];\n t0 += v * b0;\n t1 += v * b1;\n t2 += v * b2;\n t3 += v * b3;\n t4 += v * b4;\n t5 += v * b5;\n t6 += v * b6;\n t7 += v * b7;\n t8 += v * b8;\n t9 += v * b9;\n t10 += v * b10;\n t11 += v * b11;\n t12 += v * b12;\n t13 += v * b13;\n t14 += v * b14;\n t15 += v * b15;\n v = a[1];\n t1 += v * b0;\n t2 += v * b1;\n t3 += v * b2;\n t4 += v * b3;\n t5 += v * b4;\n t6 += v * b5;\n t7 += v * b6;\n t8 += v * b7;\n t9 += v * b8;\n t10 += v * b9;\n t11 += v * b10;\n t12 += v * b11;\n t13 += v * b12;\n t14 += v * b13;\n t15 += v * b14;\n t16 += v * b15;\n v = a[2];\n t2 += v * b0;\n t3 += v * b1;\n t4 += v * b2;\n t5 += v * b3;\n t6 += v * b4;\n t7 += v * b5;\n t8 += v * b6;\n t9 += v * b7;\n t10 += v * b8;\n t11 += v * b9;\n t12 += v * b10;\n t13 += v * b11;\n t14 += v * b12;\n t15 += v * b13;\n t16 += v * b14;\n t17 += v * b15;\n v = a[3];\n t3 += v * b0;\n t4 += v * b1;\n t5 += v * b2;\n t6 += v * b3;\n t7 += v * b4;\n t8 += v * b5;\n t9 += v * b6;\n t10 += v * b7;\n t11 += v * b8;\n t12 += v * b9;\n t13 += v * b10;\n t14 += v * b11;\n t15 += v * b12;\n t16 += v * b13;\n t17 += v * b14;\n t18 += v * b15;\n v = a[4];\n t4 += v * b0;\n t5 += v * b1;\n t6 += v * b2;\n t7 += v * b3;\n t8 += v * b4;\n t9 += v * b5;\n t10 += v * b6;\n t11 += v * b7;\n t12 += v * b8;\n t13 += v * b9;\n t14 += v * b10;\n t15 += v * b11;\n t16 += v * b12;\n t17 += v * b13;\n t18 += v * b14;\n t19 += v * b15;\n v = a[5];\n t5 += v * b0;\n t6 += v * b1;\n t7 += v * b2;\n t8 += v * b3;\n t9 += v * b4;\n t10 += v * b5;\n t11 += v * b6;\n t12 += v * b7;\n t13 += v * b8;\n t14 += v * b9;\n t15 += v * b10;\n t16 += v * b11;\n t17 += v * b12;\n t18 += v * b13;\n t19 += v * b14;\n t20 += v * b15;\n v = a[6];\n t6 += v * b0;\n t7 += v * b1;\n t8 += v * b2;\n t9 += v * b3;\n t10 += v * b4;\n t11 += v * b5;\n t12 += v * b6;\n t13 += v * b7;\n t14 += v * b8;\n t15 += v * b9;\n t16 += v * b10;\n t17 += v * b11;\n t18 += v * b12;\n t19 += v * b13;\n t20 += v * b14;\n t21 += v * b15;\n v = a[7];\n t7 += v * b0;\n t8 += v * b1;\n t9 += v * b2;\n t10 += v * b3;\n t11 += v * b4;\n t12 += v * b5;\n t13 += v * b6;\n t14 += v * b7;\n t15 += v * b8;\n t16 += v * b9;\n t17 += v * b10;\n t18 += v * b11;\n t19 += v * b12;\n t20 += v * b13;\n t21 += v * b14;\n t22 += v * b15;\n v = a[8];\n t8 += v * b0;\n t9 += v * b1;\n t10 += v * b2;\n t11 += v * b3;\n t12 += v * b4;\n t13 += v * b5;\n t14 += v * b6;\n t15 += v * b7;\n t16 += v * b8;\n t17 += v * b9;\n t18 += v * b10;\n t19 += v * b11;\n t20 += v * b12;\n t21 += v * b13;\n t22 += v * b14;\n t23 += v * b15;\n v = a[9];\n t9 += v * b0;\n t10 += v * b1;\n t11 += v * b2;\n t12 += v * b3;\n t13 += v * b4;\n t14 += v * b5;\n t15 += v * b6;\n t16 += v * b7;\n t17 += v * b8;\n t18 += v * b9;\n t19 += v * b10;\n t20 += v * b11;\n t21 += v * b12;\n t22 += v * b13;\n t23 += v * b14;\n t24 += v * b15;\n v = a[10];\n t10 += v * b0;\n t11 += v * b1;\n t12 += v * b2;\n t13 += v * b3;\n t14 += v * b4;\n t15 += v * b5;\n t16 += v * b6;\n t17 += v * b7;\n t18 += v * b8;\n t19 += v * b9;\n t20 += v * b10;\n t21 += v * b11;\n t22 += v * b12;\n t23 += v * b13;\n t24 += v * b14;\n t25 += v * b15;\n v = a[11];\n t11 += v * b0;\n t12 += v * b1;\n t13 += v * b2;\n t14 += v * b3;\n t15 += v * b4;\n t16 += v * b5;\n t17 += v * b6;\n t18 += v * b7;\n t19 += v * b8;\n t20 += v * b9;\n t21 += v * b10;\n t22 += v * b11;\n t23 += v * b12;\n t24 += v * b13;\n t25 += v * b14;\n t26 += v * b15;\n v = a[12];\n t12 += v * b0;\n t13 += v * b1;\n t14 += v * b2;\n t15 += v * b3;\n t16 += v * b4;\n t17 += v * b5;\n t18 += v * b6;\n t19 += v * b7;\n t20 += v * b8;\n t21 += v * b9;\n t22 += v * b10;\n t23 += v * b11;\n t24 += v * b12;\n t25 += v * b13;\n t26 += v * b14;\n t27 += v * b15;\n v = a[13];\n t13 += v * b0;\n t14 += v * b1;\n t15 += v * b2;\n t16 += v * b3;\n t17 += v * b4;\n t18 += v * b5;\n t19 += v * b6;\n t20 += v * b7;\n t21 += v * b8;\n t22 += v * b9;\n t23 += v * b10;\n t24 += v * b11;\n t25 += v * b12;\n t26 += v * b13;\n t27 += v * b14;\n t28 += v * b15;\n v = a[14];\n t14 += v * b0;\n t15 += v * b1;\n t16 += v * b2;\n t17 += v * b3;\n t18 += v * b4;\n t19 += v * b5;\n t20 += v * b6;\n t21 += v * b7;\n t22 += v * b8;\n t23 += v * b9;\n t24 += v * b10;\n t25 += v * b11;\n t26 += v * b12;\n t27 += v * b13;\n t28 += v * b14;\n t29 += v * b15;\n v = a[15];\n t15 += v * b0;\n t16 += v * b1;\n t17 += v * b2;\n t18 += v * b3;\n t19 += v * b4;\n t20 += v * b5;\n t21 += v * b6;\n t22 += v * b7;\n t23 += v * b8;\n t24 += v * b9;\n t25 += v * b10;\n t26 += v * b11;\n t27 += v * b12;\n t28 += v * b13;\n t29 += v * b14;\n t30 += v * b15;\n\n t0 += 38 * t16;\n t1 += 38 * t17;\n t2 += 38 * t18;\n t3 += 38 * t19;\n t4 += 38 * t20;\n t5 += 38 * t21;\n t6 += 38 * t22;\n t7 += 38 * t23;\n t8 += 38 * t24;\n t9 += 38 * t25;\n t10 += 38 * t26;\n t11 += 38 * t27;\n t12 += 38 * t28;\n t13 += 38 * t29;\n t14 += 38 * t30;\n // t15 left as is\n\n // first car\n c = 1;\n v = t0 + c + 65535; c = Math.floor(v / 65536); t0 = v - c * 65536;\n v = t1 + c + 65535; c = Math.floor(v / 65536); t1 = v - c * 65536;\n v = t2 + c + 65535; c = Math.floor(v / 65536); t2 = v - c * 65536;\n v = t3 + c + 65535; c = Math.floor(v / 65536); t3 = v - c * 65536;\n v = t4 + c + 65535; c = Math.floor(v / 65536); t4 = v - c * 65536;\n v = t5 + c + 65535; c = Math.floor(v / 65536); t5 = v - c * 65536;\n v = t6 + c + 65535; c = Math.floor(v / 65536); t6 = v - c * 65536;\n v = t7 + c + 65535; c = Math.floor(v / 65536); t7 = v - c * 65536;\n v = t8 + c + 65535; c = Math.floor(v / 65536); t8 = v - c * 65536;\n v = t9 + c + 65535; c = Math.floor(v / 65536); t9 = v - c * 65536;\n v = t10 + c + 65535; c = Math.floor(v / 65536); t10 = v - c * 65536;\n v = t11 + c + 65535; c = Math.floor(v / 65536); t11 = v - c * 65536;\n v = t12 + c + 65535; c = Math.floor(v / 65536); t12 = v - c * 65536;\n v = t13 + c + 65535; c = Math.floor(v / 65536); t13 = v - c * 65536;\n v = t14 + c + 65535; c = Math.floor(v / 65536); t14 = v - c * 65536;\n v = t15 + c + 65535; c = Math.floor(v / 65536); t15 = v - c * 65536;\n t0 += c-1 + 37 * (c-1);\n\n // second car\n c = 1;\n v = t0 + c + 65535; c = Math.floor(v / 65536); t0 = v - c * 65536;\n v = t1 + c + 65535; c = Math.floor(v / 65536); t1 = v - c * 65536;\n v = t2 + c + 65535; c = Math.floor(v / 65536); t2 = v - c * 65536;\n v = t3 + c + 65535; c = Math.floor(v / 65536); t3 = v - c * 65536;\n v = t4 + c + 65535; c = Math.floor(v / 65536); t4 = v - c * 65536;\n v = t5 + c + 65535; c = Math.floor(v / 65536); t5 = v - c * 65536;\n v = t6 + c + 65535; c = Math.floor(v / 65536); t6 = v - c * 65536;\n v = t7 + c + 65535; c = Math.floor(v / 65536); t7 = v - c * 65536;\n v = t8 + c + 65535; c = Math.floor(v / 65536); t8 = v - c * 65536;\n v = t9 + c + 65535; c = Math.floor(v / 65536); t9 = v - c * 65536;\n v = t10 + c + 65535; c = Math.floor(v / 65536); t10 = v - c * 65536;\n v = t11 + c + 65535; c = Math.floor(v / 65536); t11 = v - c * 65536;\n v = t12 + c + 65535; c = Math.floor(v / 65536); t12 = v - c * 65536;\n v = t13 + c + 65535; c = Math.floor(v / 65536); t13 = v - c * 65536;\n v = t14 + c + 65535; c = Math.floor(v / 65536); t14 = v - c * 65536;\n v = t15 + c + 65535; c = Math.floor(v / 65536); t15 = v - c * 65536;\n t0 += c-1 + 37 * (c-1);\n\n o[ 0] = t0;\n o[ 1] = t1;\n o[ 2] = t2;\n o[ 3] = t3;\n o[ 4] = t4;\n o[ 5] = t5;\n o[ 6] = t6;\n o[ 7] = t7;\n o[ 8] = t8;\n o[ 9] = t9;\n o[10] = t10;\n o[11] = t11;\n o[12] = t12;\n o[13] = t13;\n o[14] = t14;\n o[15] = t15;\n}\n\nfunction S(o, a) {\n M(o, a, a);\n}\n\nfunction inv25519(o, i) {\n var c = gf();\n var a;\n for (a = 0; a < 16; a++) c[a] = i[a];\n for (a = 253; a >= 0; a--) {\n S(c, c);\n if(a !== 2 && a !== 4) M(c, c, i);\n }\n for (a = 0; a < 16; a++) o[a] = c[a];\n}\n\nfunction pow2523(o, i) {\n var c = gf();\n var a;\n for (a = 0; a < 16; a++) c[a] = i[a];\n for (a = 250; a >= 0; a--) {\n S(c, c);\n if(a !== 1) M(c, c, i);\n }\n for (a = 0; a < 16; a++) o[a] = c[a];\n}\n\nfunction crypto_scalarmult(q, n, p) {\n var z = new Uint8Array(32);\n var x = new Float64Array(80), r, i;\n var a = gf(), b = gf(), c = gf(),\n d = gf(), e = gf(), f = gf();\n for (i = 0; i < 31; i++) z[i] = n[i];\n z[31]=(n[31]&127)|64;\n z[0]&=248;\n unpack25519(x,p);\n for (i = 0; i < 16; i++) {\n b[i]=x[i];\n d[i]=a[i]=c[i]=0;\n }\n a[0]=d[0]=1;\n for (i=254; i>=0; --i) {\n r=(z[i>>>3]>>>(i&7))&1;\n sel25519(a,b,r);\n sel25519(c,d,r);\n A(e,a,c);\n Z(a,a,c);\n A(c,b,d);\n Z(b,b,d);\n S(d,e);\n S(f,a);\n M(a,c,a);\n M(c,b,e);\n A(e,a,c);\n Z(a,a,c);\n S(b,a);\n Z(c,d,f);\n M(a,c,_121665);\n A(a,a,d);\n M(c,c,a);\n M(a,d,f);\n M(d,b,x);\n S(b,e);\n sel25519(a,b,r);\n sel25519(c,d,r);\n }\n for (i = 0; i < 16; i++) {\n x[i+16]=a[i];\n x[i+32]=c[i];\n x[i+48]=b[i];\n x[i+64]=d[i];\n }\n var x32 = x.subarray(32);\n var x16 = x.subarray(16);\n inv25519(x32,x32);\n M(x16,x16,x32);\n pack25519(q,x16);\n return 0;\n}\n\nfunction crypto_scalarmult_base(q, n) {\n return crypto_scalarmult(q, n, _9);\n}\n\nfunction crypto_box_keypair(y, x) {\n randombytes(x, 32);\n return crypto_scalarmult_base(y, x);\n}\n\nfunction crypto_box_beforenm(k, y, x) {\n var s = new Uint8Array(32);\n crypto_scalarmult(s, x, y);\n return crypto_core_hsalsa20(k, _0, s, sigma);\n}\n\nvar crypto_box_afternm = crypto_secretbox;\nvar crypto_box_open_afternm = crypto_secretbox_open;\n\nfunction crypto_box(c, m, d, n, y, x) {\n var k = new Uint8Array(32);\n crypto_box_beforenm(k, y, x);\n return crypto_box_afternm(c, m, d, n, k);\n}\n\nfunction crypto_box_open(m, c, d, n, y, x) {\n var k = new Uint8Array(32);\n crypto_box_beforenm(k, y, x);\n return crypto_box_open_afternm(m, c, d, n, k);\n}\n\nvar K = [\n 0x428a2f98, 0xd728ae22, 0x71374491, 0x23ef65cd,\n 0xb5c0fbcf, 0xec4d3b2f, 0xe9b5dba5, 0x8189dbbc,\n 0x3956c25b, 0xf348b538, 0x59f111f1, 0xb605d019,\n 0x923f82a4, 0xaf194f9b, 0xab1c5ed5, 0xda6d8118,\n 0xd807aa98, 0xa3030242, 0x12835b01, 0x45706fbe,\n 0x243185be, 0x4ee4b28c, 0x550c7dc3, 0xd5ffb4e2,\n 0x72be5d74, 0xf27b896f, 0x80deb1fe, 0x3b1696b1,\n 0x9bdc06a7, 0x25c71235, 0xc19bf174, 0xcf692694,\n 0xe49b69c1, 0x9ef14ad2, 0xefbe4786, 0x384f25e3,\n 0x0fc19dc6, 0x8b8cd5b5, 0x240ca1cc, 0x77ac9c65,\n 0x2de92c6f, 0x592b0275, 0x4a7484aa, 0x6ea6e483,\n 0x5cb0a9dc, 0xbd41fbd4, 0x76f988da, 0x831153b5,\n 0x983e5152, 0xee66dfab, 0xa831c66d, 0x2db43210,\n 0xb00327c8, 0x98fb213f, 0xbf597fc7, 0xbeef0ee4,\n 0xc6e00bf3, 0x3da88fc2, 0xd5a79147, 0x930aa725,\n 0x06ca6351, 0xe003826f, 0x14292967, 0x0a0e6e70,\n 0x27b70a85, 0x46d22ffc, 0x2e1b2138, 0x5c26c926,\n 0x4d2c6dfc, 0x5ac42aed, 0x53380d13, 0x9d95b3df,\n 0x650a7354, 0x8baf63de, 0x766a0abb, 0x3c77b2a8,\n 0x81c2c92e, 0x47edaee6, 0x92722c85, 0x1482353b,\n 0xa2bfe8a1, 0x4cf10364, 0xa81a664b, 0xbc423001,\n 0xc24b8b70, 0xd0f89791, 0xc76c51a3, 0x0654be30,\n 0xd192e819, 0xd6ef5218, 0xd6990624, 0x5565a910,\n 0xf40e3585, 0x5771202a, 0x106aa070, 0x32bbd1b8,\n 0x19a4c116, 0xb8d2d0c8, 0x1e376c08, 0x5141ab53,\n 0x2748774c, 0xdf8eeb99, 0x34b0bcb5, 0xe19b48a8,\n 0x391c0cb3, 0xc5c95a63, 0x4ed8aa4a, 0xe3418acb,\n 0x5b9cca4f, 0x7763e373, 0x682e6ff3, 0xd6b2b8a3,\n 0x748f82ee, 0x5defb2fc, 0x78a5636f, 0x43172f60,\n 0x84c87814, 0xa1f0ab72, 0x8cc70208, 0x1a6439ec,\n 0x90befffa, 0x23631e28, 0xa4506ceb, 0xde82bde9,\n 0xbef9a3f7, 0xb2c67915, 0xc67178f2, 0xe372532b,\n 0xca273ece, 0xea26619c, 0xd186b8c7, 0x21c0c207,\n 0xeada7dd6, 0xcde0eb1e, 0xf57d4f7f, 0xee6ed178,\n 0x06f067aa, 0x72176fba, 0x0a637dc5, 0xa2c898a6,\n 0x113f9804, 0xbef90dae, 0x1b710b35, 0x131c471b,\n 0x28db77f5, 0x23047d84, 0x32caab7b, 0x40c72493,\n 0x3c9ebe0a, 0x15c9bebc, 0x431d67c4, 0x9c100d4c,\n 0x4cc5d4be, 0xcb3e42b6, 0x597f299c, 0xfc657e2a,\n 0x5fcb6fab, 0x3ad6faec, 0x6c44198c, 0x4a475817\n];\n\nfunction crypto_hashblocks_hl(hh, hl, m, n) {\n var wh = new Int32Array(16), wl = new Int32Array(16),\n bh0, bh1, bh2, bh3, bh4, bh5, bh6, bh7,\n bl0, bl1, bl2, bl3, bl4, bl5, bl6, bl7,\n th, tl, i, j, h, l, a, b, c, d;\n\n var ah0 = hh[0],\n ah1 = hh[1],\n ah2 = hh[2],\n ah3 = hh[3],\n ah4 = hh[4],\n ah5 = hh[5],\n ah6 = hh[6],\n ah7 = hh[7],\n\n al0 = hl[0],\n al1 = hl[1],\n al2 = hl[2],\n al3 = hl[3],\n al4 = hl[4],\n al5 = hl[5],\n al6 = hl[6],\n al7 = hl[7];\n\n var pos = 0;\n while (n >= 128) {\n for (i = 0; i < 16; i++) {\n j = 8 * i + pos;\n wh[i] = (m[j+0] << 24) | (m[j+1] << 16) | (m[j+2] << 8) | m[j+3];\n wl[i] = (m[j+4] << 24) | (m[j+5] << 16) | (m[j+6] << 8) | m[j+7];\n }\n for (i = 0; i < 80; i++) {\n bh0 = ah0;\n bh1 = ah1;\n bh2 = ah2;\n bh3 = ah3;\n bh4 = ah4;\n bh5 = ah5;\n bh6 = ah6;\n bh7 = ah7;\n\n bl0 = al0;\n bl1 = al1;\n bl2 = al2;\n bl3 = al3;\n bl4 = al4;\n bl5 = al5;\n bl6 = al6;\n bl7 = al7;\n\n // add\n h = ah7;\n l = al7;\n\n a = l & 0xffff; b = l >>> 16;\n c = h & 0xffff; d = h >>> 16;\n\n // Sigma1\n h = ((ah4 >>> 14) | (al4 << (32-14))) ^ ((ah4 >>> 18) | (al4 << (32-18))) ^ ((al4 >>> (41-32)) | (ah4 << (32-(41-32))));\n l = ((al4 >>> 14) | (ah4 << (32-14))) ^ ((al4 >>> 18) | (ah4 << (32-18))) ^ ((ah4 >>> (41-32)) | (al4 << (32-(41-32))));\n\n a += l & 0xffff; b += l >>> 16;\n c += h & 0xffff; d += h >>> 16;\n\n // Ch\n h = (ah4 & ah5) ^ (~ah4 & ah6);\n l = (al4 & al5) ^ (~al4 & al6);\n\n a += l & 0xffff; b += l >>> 16;\n c += h & 0xffff; d += h >>> 16;\n\n // K\n h = K[i*2];\n l = K[i*2+1];\n\n a += l & 0xffff; b += l >>> 16;\n c += h & 0xffff; d += h >>> 16;\n\n // w\n h = wh[i%16];\n l = wl[i%16];\n\n a += l & 0xffff; b += l >>> 16;\n c += h & 0xffff; d += h >>> 16;\n\n b += a >>> 16;\n c += b >>> 16;\n d += c >>> 16;\n\n th = c & 0xffff | d << 16;\n tl = a & 0xffff | b << 16;\n\n // add\n h = th;\n l = tl;\n\n a = l & 0xffff; b = l >>> 16;\n c = h & 0xffff; d = h >>> 16;\n\n // Sigma0\n h = ((ah0 >>> 28) | (al0 << (32-28))) ^ ((al0 >>> (34-32)) | (ah0 << (32-(34-32)))) ^ ((al0 >>> (39-32)) | (ah0 << (32-(39-32))));\n l = ((al0 >>> 28) | (ah0 << (32-28))) ^ ((ah0 >>> (34-32)) | (al0 << (32-(34-32)))) ^ ((ah0 >>> (39-32)) | (al0 << (32-(39-32))));\n\n a += l & 0xffff; b += l >>> 16;\n c += h & 0xffff; d += h >>> 16;\n\n // Maj\n h = (ah0 & ah1) ^ (ah0 & ah2) ^ (ah1 & ah2);\n l = (al0 & al1) ^ (al0 & al2) ^ (al1 & al2);\n\n a += l & 0xffff; b += l >>> 16;\n c += h & 0xffff; d += h >>> 16;\n\n b += a >>> 16;\n c += b >>> 16;\n d += c >>> 16;\n\n bh7 = (c & 0xffff) | (d << 16);\n bl7 = (a & 0xffff) | (b << 16);\n\n // add\n h = bh3;\n l = bl3;\n\n a = l & 0xffff; b = l >>> 16;\n c = h & 0xffff; d = h >>> 16;\n\n h = th;\n l = tl;\n\n a += l & 0xffff; b += l >>> 16;\n c += h & 0xffff; d += h >>> 16;\n\n b += a >>> 16;\n c += b >>> 16;\n d += c >>> 16;\n\n bh3 = (c & 0xffff) | (d << 16);\n bl3 = (a & 0xffff) | (b << 16);\n\n ah1 = bh0;\n ah2 = bh1;\n ah3 = bh2;\n ah4 = bh3;\n ah5 = bh4;\n ah6 = bh5;\n ah7 = bh6;\n ah0 = bh7;\n\n al1 = bl0;\n al2 = bl1;\n al3 = bl2;\n al4 = bl3;\n al5 = bl4;\n al6 = bl5;\n al7 = bl6;\n al0 = bl7;\n\n if (i%16 === 15) {\n for (j = 0; j < 16; j++) {\n // add\n h = wh[j];\n l = wl[j];\n\n a = l & 0xffff; b = l >>> 16;\n c = h & 0xffff; d = h >>> 16;\n\n h = wh[(j+9)%16];\n l = wl[(j+9)%16];\n\n a += l & 0xffff; b += l >>> 16;\n c += h & 0xffff; d += h >>> 16;\n\n // sigma0\n th = wh[(j+1)%16];\n tl = wl[(j+1)%16];\n h = ((th >>> 1) | (tl << (32-1))) ^ ((th >>> 8) | (tl << (32-8))) ^ (th >>> 7);\n l = ((tl >>> 1) | (th << (32-1))) ^ ((tl >>> 8) | (th << (32-8))) ^ ((tl >>> 7) | (th << (32-7)));\n\n a += l & 0xffff; b += l >>> 16;\n c += h & 0xffff; d += h >>> 16;\n\n // sigma1\n th = wh[(j+14)%16];\n tl = wl[(j+14)%16];\n h = ((th >>> 19) | (tl << (32-19))) ^ ((tl >>> (61-32)) | (th << (32-(61-32)))) ^ (th >>> 6);\n l = ((tl >>> 19) | (th << (32-19))) ^ ((th >>> (61-32)) | (tl << (32-(61-32)))) ^ ((tl >>> 6) | (th << (32-6)));\n\n a += l & 0xffff; b += l >>> 16;\n c += h & 0xffff; d += h >>> 16;\n\n b += a >>> 16;\n c += b >>> 16;\n d += c >>> 16;\n\n wh[j] = (c & 0xffff) | (d << 16);\n wl[j] = (a & 0xffff) | (b << 16);\n }\n }\n }\n\n // add\n h = ah0;\n l = al0;\n\n a = l & 0xffff; b = l >>> 16;\n c = h & 0xffff; d = h >>> 16;\n\n h = hh[0];\n l = hl[0];\n\n a += l & 0xffff; b += l >>> 16;\n c += h & 0xffff; d += h >>> 16;\n\n b += a >>> 16;\n c += b >>> 16;\n d += c >>> 16;\n\n hh[0] = ah0 = (c & 0xffff) | (d << 16);\n hl[0] = al0 = (a & 0xffff) | (b << 16);\n\n h = ah1;\n l = al1;\n\n a = l & 0xffff; b = l >>> 16;\n c = h & 0xffff; d = h >>> 16;\n\n h = hh[1];\n l = hl[1];\n\n a += l & 0xffff; b += l >>> 16;\n c += h & 0xffff; d += h >>> 16;\n\n b += a >>> 16;\n c += b >>> 16;\n d += c >>> 16;\n\n hh[1] = ah1 = (c & 0xffff) | (d << 16);\n hl[1] = al1 = (a & 0xffff) | (b << 16);\n\n h = ah2;\n l = al2;\n\n a = l & 0xffff; b = l >>> 16;\n c = h & 0xffff; d = h >>> 16;\n\n h = hh[2];\n l = hl[2];\n\n a += l & 0xffff; b += l >>> 16;\n c += h & 0xffff; d += h >>> 16;\n\n b += a >>> 16;\n c += b >>> 16;\n d += c >>> 16;\n\n hh[2] = ah2 = (c & 0xffff) | (d << 16);\n hl[2] = al2 = (a & 0xffff) | (b << 16);\n\n h = ah3;\n l = al3;\n\n a = l & 0xffff; b = l >>> 16;\n c = h & 0xffff; d = h >>> 16;\n\n h = hh[3];\n l = hl[3];\n\n a += l & 0xffff; b += l >>> 16;\n c += h & 0xffff; d += h >>> 16;\n\n b += a >>> 16;\n c += b >>> 16;\n d += c >>> 16;\n\n hh[3] = ah3 = (c & 0xffff) | (d << 16);\n hl[3] = al3 = (a & 0xffff) | (b << 16);\n\n h = ah4;\n l = al4;\n\n a = l & 0xffff; b = l >>> 16;\n c = h & 0xffff; d = h >>> 16;\n\n h = hh[4];\n l = hl[4];\n\n a += l & 0xffff; b += l >>> 16;\n c += h & 0xffff; d += h >>> 16;\n\n b += a >>> 16;\n c += b >>> 16;\n d += c >>> 16;\n\n hh[4] = ah4 = (c & 0xffff) | (d << 16);\n hl[4] = al4 = (a & 0xffff) | (b << 16);\n\n h = ah5;\n l = al5;\n\n a = l & 0xffff; b = l >>> 16;\n c = h & 0xffff; d = h >>> 16;\n\n h = hh[5];\n l = hl[5];\n\n a += l & 0xffff; b += l >>> 16;\n c += h & 0xffff; d += h >>> 16;\n\n b += a >>> 16;\n c += b >>> 16;\n d += c >>> 16;\n\n hh[5] = ah5 = (c & 0xffff) | (d << 16);\n hl[5] = al5 = (a & 0xffff) | (b << 16);\n\n h = ah6;\n l = al6;\n\n a = l & 0xffff; b = l >>> 16;\n c = h & 0xffff; d = h >>> 16;\n\n h = hh[6];\n l = hl[6];\n\n a += l & 0xffff; b += l >>> 16;\n c += h & 0xffff; d += h >>> 16;\n\n b += a >>> 16;\n c += b >>> 16;\n d += c >>> 16;\n\n hh[6] = ah6 = (c & 0xffff) | (d << 16);\n hl[6] = al6 = (a & 0xffff) | (b << 16);\n\n h = ah7;\n l = al7;\n\n a = l & 0xffff; b = l >>> 16;\n c = h & 0xffff; d = h >>> 16;\n\n h = hh[7];\n l = hl[7];\n\n a += l & 0xffff; b += l >>> 16;\n c += h & 0xffff; d += h >>> 16;\n\n b += a >>> 16;\n c += b >>> 16;\n d += c >>> 16;\n\n hh[7] = ah7 = (c & 0xffff) | (d << 16);\n hl[7] = al7 = (a & 0xffff) | (b << 16);\n\n pos += 128;\n n -= 128;\n }\n\n return n;\n}\n\nfunction crypto_hash(out, m, n) {\n var hh = new Int32Array(8),\n hl = new Int32Array(8),\n x = new Uint8Array(256),\n i, b = n;\n\n hh[0] = 0x6a09e667;\n hh[1] = 0xbb67ae85;\n hh[2] = 0x3c6ef372;\n hh[3] = 0xa54ff53a;\n hh[4] = 0x510e527f;\n hh[5] = 0x9b05688c;\n hh[6] = 0x1f83d9ab;\n hh[7] = 0x5be0cd19;\n\n hl[0] = 0xf3bcc908;\n hl[1] = 0x84caa73b;\n hl[2] = 0xfe94f82b;\n hl[3] = 0x5f1d36f1;\n hl[4] = 0xade682d1;\n hl[5] = 0x2b3e6c1f;\n hl[6] = 0xfb41bd6b;\n hl[7] = 0x137e2179;\n\n crypto_hashblocks_hl(hh, hl, m, n);\n n %= 128;\n\n for (i = 0; i < n; i++) x[i] = m[b-n+i];\n x[n] = 128;\n\n n = 256-128*(n<112?1:0);\n x[n-9] = 0;\n ts64(x, n-8, (b / 0x20000000) | 0, b << 3);\n crypto_hashblocks_hl(hh, hl, x, n);\n\n for (i = 0; i < 8; i++) ts64(out, 8*i, hh[i], hl[i]);\n\n return 0;\n}\n\nfunction add(p, q) {\n var a = gf(), b = gf(), c = gf(),\n d = gf(), e = gf(), f = gf(),\n g = gf(), h = gf(), t = gf();\n\n Z(a, p[1], p[0]);\n Z(t, q[1], q[0]);\n M(a, a, t);\n A(b, p[0], p[1]);\n A(t, q[0], q[1]);\n M(b, b, t);\n M(c, p[3], q[3]);\n M(c, c, D2);\n M(d, p[2], q[2]);\n A(d, d, d);\n Z(e, b, a);\n Z(f, d, c);\n A(g, d, c);\n A(h, b, a);\n\n M(p[0], e, f);\n M(p[1], h, g);\n M(p[2], g, f);\n M(p[3], e, h);\n}\n\nfunction cswap(p, q, b) {\n var i;\n for (i = 0; i < 4; i++) {\n sel25519(p[i], q[i], b);\n }\n}\n\nfunction pack(r, p) {\n var tx = gf(), ty = gf(), zi = gf();\n inv25519(zi, p[2]);\n M(tx, p[0], zi);\n M(ty, p[1], zi);\n pack25519(r, ty);\n r[31] ^= par25519(tx) << 7;\n}\n\nfunction scalarmult(p, q, s) {\n var b, i;\n set25519(p[0], gf0);\n set25519(p[1], gf1);\n set25519(p[2], gf1);\n set25519(p[3], gf0);\n for (i = 255; i >= 0; --i) {\n b = (s[(i/8)|0] >> (i&7)) & 1;\n cswap(p, q, b);\n add(q, p);\n add(p, p);\n cswap(p, q, b);\n }\n}\n\nfunction scalarbase(p, s) {\n var q = [gf(), gf(), gf(), gf()];\n set25519(q[0], X);\n set25519(q[1], Y);\n set25519(q[2], gf1);\n M(q[3], X, Y);\n scalarmult(p, q, s);\n}\n\nfunction crypto_sign_keypair(pk, sk, seeded) {\n var d = new Uint8Array(64);\n var p = [gf(), gf(), gf(), gf()];\n var i;\n\n if (!seeded) randombytes(sk, 32);\n crypto_hash(d, sk, 32);\n d[0] &= 248;\n d[31] &= 127;\n d[31] |= 64;\n\n scalarbase(p, d);\n pack(pk, p);\n\n for (i = 0; i < 32; i++) sk[i+32] = pk[i];\n return 0;\n}\n\nvar L = new Float64Array([0xed, 0xd3, 0xf5, 0x5c, 0x1a, 0x63, 0x12, 0x58, 0xd6, 0x9c, 0xf7, 0xa2, 0xde, 0xf9, 0xde, 0x14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x10]);\n\nfunction modL(r, x) {\n var carry, i, j, k;\n for (i = 63; i >= 32; --i) {\n carry = 0;\n for (j = i - 32, k = i - 12; j < k; ++j) {\n x[j] += carry - 16 * x[i] * L[j - (i - 32)];\n carry = Math.floor((x[j] + 128) / 256);\n x[j] -= carry * 256;\n }\n x[j] += carry;\n x[i] = 0;\n }\n carry = 0;\n for (j = 0; j < 32; j++) {\n x[j] += carry - (x[31] >> 4) * L[j];\n carry = x[j] >> 8;\n x[j] &= 255;\n }\n for (j = 0; j < 32; j++) x[j] -= carry * L[j];\n for (i = 0; i < 32; i++) {\n x[i+1] += x[i] >> 8;\n r[i] = x[i] & 255;\n }\n}\n\nfunction reduce(r) {\n var x = new Float64Array(64), i;\n for (i = 0; i < 64; i++) x[i] = r[i];\n for (i = 0; i < 64; i++) r[i] = 0;\n modL(r, x);\n}\n\n// Note: difference from C - smlen returned, not passed as argument.\nfunction crypto_sign(sm, m, n, sk) {\n var d = new Uint8Array(64), h = new Uint8Array(64), r = new Uint8Array(64);\n var i, j, x = new Float64Array(64);\n var p = [gf(), gf(), gf(), gf()];\n\n crypto_hash(d, sk, 32);\n d[0] &= 248;\n d[31] &= 127;\n d[31] |= 64;\n\n var smlen = n + 64;\n for (i = 0; i < n; i++) sm[64 + i] = m[i];\n for (i = 0; i < 32; i++) sm[32 + i] = d[32 + i];\n\n crypto_hash(r, sm.subarray(32), n+32);\n reduce(r);\n scalarbase(p, r);\n pack(sm, p);\n\n for (i = 32; i < 64; i++) sm[i] = sk[i];\n crypto_hash(h, sm, n + 64);\n reduce(h);\n\n for (i = 0; i < 64; i++) x[i] = 0;\n for (i = 0; i < 32; i++) x[i] = r[i];\n for (i = 0; i < 32; i++) {\n for (j = 0; j < 32; j++) {\n x[i+j] += h[i] * d[j];\n }\n }\n\n modL(sm.subarray(32), x);\n return smlen;\n}\n\nfunction unpackneg(r, p) {\n var t = gf(), chk = gf(), num = gf(),\n den = gf(), den2 = gf(), den4 = gf(),\n den6 = gf();\n\n set25519(r[2], gf1);\n unpack25519(r[1], p);\n S(num, r[1]);\n M(den, num, D);\n Z(num, num, r[2]);\n A(den, r[2], den);\n\n S(den2, den);\n S(den4, den2);\n M(den6, den4, den2);\n M(t, den6, num);\n M(t, t, den);\n\n pow2523(t, t);\n M(t, t, num);\n M(t, t, den);\n M(t, t, den);\n M(r[0], t, den);\n\n S(chk, r[0]);\n M(chk, chk, den);\n if (neq25519(chk, num)) M(r[0], r[0], I);\n\n S(chk, r[0]);\n M(chk, chk, den);\n if (neq25519(chk, num)) return -1;\n\n if (par25519(r[0]) === (p[31]>>7)) Z(r[0], gf0, r[0]);\n\n M(r[3], r[0], r[1]);\n return 0;\n}\n\nfunction crypto_sign_open(m, sm, n, pk) {\n var i;\n var t = new Uint8Array(32), h = new Uint8Array(64);\n var p = [gf(), gf(), gf(), gf()],\n q = [gf(), gf(), gf(), gf()];\n\n if (n < 64) return -1;\n\n if (unpackneg(q, pk)) return -1;\n\n for (i = 0; i < n; i++) m[i] = sm[i];\n for (i = 0; i < 32; i++) m[i+32] = pk[i];\n crypto_hash(h, m, n);\n reduce(h);\n scalarmult(p, q, h);\n\n scalarbase(q, sm.subarray(32));\n add(p, q);\n pack(t, p);\n\n n -= 64;\n if (crypto_verify_32(sm, 0, t, 0)) {\n for (i = 0; i < n; i++) m[i] = 0;\n return -1;\n }\n\n for (i = 0; i < n; i++) m[i] = sm[i + 64];\n return n;\n}\n\nvar crypto_secretbox_KEYBYTES = 32,\n crypto_secretbox_NONCEBYTES = 24,\n crypto_secretbox_ZEROBYTES = 32,\n crypto_secretbox_BOXZEROBYTES = 16,\n crypto_scalarmult_BYTES = 32,\n crypto_scalarmult_SCALARBYTES = 32,\n crypto_box_PUBLICKEYBYTES = 32,\n crypto_box_SECRETKEYBYTES = 32,\n crypto_box_BEFORENMBYTES = 32,\n crypto_box_NONCEBYTES = crypto_secretbox_NONCEBYTES,\n crypto_box_ZEROBYTES = crypto_secretbox_ZEROBYTES,\n crypto_box_BOXZEROBYTES = crypto_secretbox_BOXZEROBYTES,\n crypto_sign_BYTES = 64,\n crypto_sign_PUBLICKEYBYTES = 32,\n crypto_sign_SECRETKEYBYTES = 64,\n crypto_sign_SEEDBYTES = 32,\n crypto_hash_BYTES = 64;\n\nnacl.lowlevel = {\n crypto_core_hsalsa20: crypto_core_hsalsa20,\n crypto_stream_xor: crypto_stream_xor,\n crypto_stream: crypto_stream,\n crypto_stream_salsa20_xor: crypto_stream_salsa20_xor,\n crypto_stream_salsa20: crypto_stream_salsa20,\n crypto_onetimeauth: crypto_onetimeauth,\n crypto_onetimeauth_verify: crypto_onetimeauth_verify,\n crypto_verify_16: crypto_verify_16,\n crypto_verify_32: crypto_verify_32,\n crypto_secretbox: crypto_secretbox,\n crypto_secretbox_open: crypto_secretbox_open,\n crypto_scalarmult: crypto_scalarmult,\n crypto_scalarmult_base: crypto_scalarmult_base,\n crypto_box_beforenm: crypto_box_beforenm,\n crypto_box_afternm: crypto_box_afternm,\n crypto_box: crypto_box,\n crypto_box_open: crypto_box_open,\n crypto_box_keypair: crypto_box_keypair,\n crypto_hash: crypto_hash,\n crypto_sign: crypto_sign,\n crypto_sign_keypair: crypto_sign_keypair,\n crypto_sign_open: crypto_sign_open,\n\n crypto_secretbox_KEYBYTES: crypto_secretbox_KEYBYTES,\n crypto_secretbox_NONCEBYTES: crypto_secretbox_NONCEBYTES,\n crypto_secretbox_ZEROBYTES: crypto_secretbox_ZEROBYTES,\n crypto_secretbox_BOXZEROBYTES: crypto_secretbox_BOXZEROBYTES,\n crypto_scalarmult_BYTES: crypto_scalarmult_BYTES,\n crypto_scalarmult_SCALARBYTES: crypto_scalarmult_SCALARBYTES,\n crypto_box_PUBLICKEYBYTES: crypto_box_PUBLICKEYBYTES,\n crypto_box_SECRETKEYBYTES: crypto_box_SECRETKEYBYTES,\n crypto_box_BEFORENMBYTES: crypto_box_BEFORENMBYTES,\n crypto_box_NONCEBYTES: crypto_box_NONCEBYTES,\n crypto_box_ZEROBYTES: crypto_box_ZEROBYTES,\n crypto_box_BOXZEROBYTES: crypto_box_BOXZEROBYTES,\n crypto_sign_BYTES: crypto_sign_BYTES,\n crypto_sign_PUBLICKEYBYTES: crypto_sign_PUBLICKEYBYTES,\n crypto_sign_SECRETKEYBYTES: crypto_sign_SECRETKEYBYTES,\n crypto_sign_SEEDBYTES: crypto_sign_SEEDBYTES,\n crypto_hash_BYTES: crypto_hash_BYTES,\n\n gf: gf,\n D: D,\n L: L,\n pack25519: pack25519,\n unpack25519: unpack25519,\n M: M,\n A: A,\n S: S,\n Z: Z,\n pow2523: pow2523,\n add: add,\n set25519: set25519,\n modL: modL,\n scalarmult: scalarmult,\n scalarbase: scalarbase,\n};\n\n/* High-level API */\n\nfunction checkLengths(k, n) {\n if (k.length !== crypto_secretbox_KEYBYTES) throw new Error('bad key size');\n if (n.length !== crypto_secretbox_NONCEBYTES) throw new Error('bad nonce size');\n}\n\nfunction checkBoxLengths(pk, sk) {\n if (pk.length !== crypto_box_PUBLICKEYBYTES) throw new Error('bad public key size');\n if (sk.length !== crypto_box_SECRETKEYBYTES) throw new Error('bad secret key size');\n}\n\nfunction checkArrayTypes() {\n for (var i = 0; i < arguments.length; i++) {\n if (!(arguments[i] instanceof Uint8Array))\n throw new TypeError('unexpected type, use Uint8Array');\n }\n}\n\nfunction cleanup(arr) {\n for (var i = 0; i < arr.length; i++) arr[i] = 0;\n}\n\nnacl.randomBytes = function(n) {\n var b = new Uint8Array(n);\n randombytes(b, n);\n return b;\n};\n\nnacl.secretbox = function(msg, nonce, key) {\n checkArrayTypes(msg, nonce, key);\n checkLengths(key, nonce);\n var m = new Uint8Array(crypto_secretbox_ZEROBYTES + msg.length);\n var c = new Uint8Array(m.length);\n for (var i = 0; i < msg.length; i++) m[i+crypto_secretbox_ZEROBYTES] = msg[i];\n crypto_secretbox(c, m, m.length, nonce, key);\n return c.subarray(crypto_secretbox_BOXZEROBYTES);\n};\n\nnacl.secretbox.open = function(box, nonce, key) {\n checkArrayTypes(box, nonce, key);\n checkLengths(key, nonce);\n var c = new Uint8Array(crypto_secretbox_BOXZEROBYTES + box.length);\n var m = new Uint8Array(c.length);\n for (var i = 0; i < box.length; i++) c[i+crypto_secretbox_BOXZEROBYTES] = box[i];\n if (c.length < 32) return null;\n if (crypto_secretbox_open(m, c, c.length, nonce, key) !== 0) return null;\n return m.subarray(crypto_secretbox_ZEROBYTES);\n};\n\nnacl.secretbox.keyLength = crypto_secretbox_KEYBYTES;\nnacl.secretbox.nonceLength = crypto_secretbox_NONCEBYTES;\nnacl.secretbox.overheadLength = crypto_secretbox_BOXZEROBYTES;\n\nnacl.scalarMult = function(n, p) {\n checkArrayTypes(n, p);\n if (n.length !== crypto_scalarmult_SCALARBYTES) throw new Error('bad n size');\n if (p.length !== crypto_scalarmult_BYTES) throw new Error('bad p size');\n var q = new Uint8Array(crypto_scalarmult_BYTES);\n crypto_scalarmult(q, n, p);\n return q;\n};\n\nnacl.scalarMult.base = function(n) {\n checkArrayTypes(n);\n if (n.length !== crypto_scalarmult_SCALARBYTES) throw new Error('bad n size');\n var q = new Uint8Array(crypto_scalarmult_BYTES);\n crypto_scalarmult_base(q, n);\n return q;\n};\n\nnacl.scalarMult.scalarLength = crypto_scalarmult_SCALARBYTES;\nnacl.scalarMult.groupElementLength = crypto_scalarmult_BYTES;\n\nnacl.box = function(msg, nonce, publicKey, secretKey) {\n var k = nacl.box.before(publicKey, secretKey);\n return nacl.secretbox(msg, nonce, k);\n};\n\nnacl.box.before = function(publicKey, secretKey) {\n checkArrayTypes(publicKey, secretKey);\n checkBoxLengths(publicKey, secretKey);\n var k = new Uint8Array(crypto_box_BEFORENMBYTES);\n crypto_box_beforenm(k, publicKey, secretKey);\n return k;\n};\n\nnacl.box.after = nacl.secretbox;\n\nnacl.box.open = function(msg, nonce, publicKey, secretKey) {\n var k = nacl.box.before(publicKey, secretKey);\n return nacl.secretbox.open(msg, nonce, k);\n};\n\nnacl.box.open.after = nacl.secretbox.open;\n\nnacl.box.keyPair = function() {\n var pk = new Uint8Array(crypto_box_PUBLICKEYBYTES);\n var sk = new Uint8Array(crypto_box_SECRETKEYBYTES);\n crypto_box_keypair(pk, sk);\n return {publicKey: pk, secretKey: sk};\n};\n\nnacl.box.keyPair.fromSecretKey = function(secretKey) {\n checkArrayTypes(secretKey);\n if (secretKey.length !== crypto_box_SECRETKEYBYTES)\n throw new Error('bad secret key size');\n var pk = new Uint8Array(crypto_box_PUBLICKEYBYTES);\n crypto_scalarmult_base(pk, secretKey);\n return {publicKey: pk, secretKey: new Uint8Array(secretKey)};\n};\n\nnacl.box.publicKeyLength = crypto_box_PUBLICKEYBYTES;\nnacl.box.secretKeyLength = crypto_box_SECRETKEYBYTES;\nnacl.box.sharedKeyLength = crypto_box_BEFORENMBYTES;\nnacl.box.nonceLength = crypto_box_NONCEBYTES;\nnacl.box.overheadLength = nacl.secretbox.overheadLength;\n\nnacl.sign = function(msg, secretKey) {\n checkArrayTypes(msg, secretKey);\n if (secretKey.length !== crypto_sign_SECRETKEYBYTES)\n throw new Error('bad secret key size');\n var signedMsg = new Uint8Array(crypto_sign_BYTES+msg.length);\n crypto_sign(signedMsg, msg, msg.length, secretKey);\n return signedMsg;\n};\n\nnacl.sign.open = function(signedMsg, publicKey) {\n checkArrayTypes(signedMsg, publicKey);\n if (publicKey.length !== crypto_sign_PUBLICKEYBYTES)\n throw new Error('bad public key size');\n var tmp = new Uint8Array(signedMsg.length);\n var mlen = crypto_sign_open(tmp, signedMsg, signedMsg.length, publicKey);\n if (mlen < 0) return null;\n var m = new Uint8Array(mlen);\n for (var i = 0; i < m.length; i++) m[i] = tmp[i];\n return m;\n};\n\nnacl.sign.detached = function(msg, secretKey) {\n var signedMsg = nacl.sign(msg, secretKey);\n var sig = new Uint8Array(crypto_sign_BYTES);\n for (var i = 0; i < sig.length; i++) sig[i] = signedMsg[i];\n return sig;\n};\n\nnacl.sign.detached.verify = function(msg, sig, publicKey) {\n checkArrayTypes(msg, sig, publicKey);\n if (sig.length !== crypto_sign_BYTES)\n throw new Error('bad signature size');\n if (publicKey.length !== crypto_sign_PUBLICKEYBYTES)\n throw new Error('bad public key size');\n var sm = new Uint8Array(crypto_sign_BYTES + msg.length);\n var m = new Uint8Array(crypto_sign_BYTES + msg.length);\n var i;\n for (i = 0; i < crypto_sign_BYTES; i++) sm[i] = sig[i];\n for (i = 0; i < msg.length; i++) sm[i+crypto_sign_BYTES] = msg[i];\n return (crypto_sign_open(m, sm, sm.length, publicKey) >= 0);\n};\n\nnacl.sign.keyPair = function() {\n var pk = new Uint8Array(crypto_sign_PUBLICKEYBYTES);\n var sk = new Uint8Array(crypto_sign_SECRETKEYBYTES);\n crypto_sign_keypair(pk, sk);\n return {publicKey: pk, secretKey: sk};\n};\n\nnacl.sign.keyPair.fromSecretKey = function(secretKey) {\n checkArrayTypes(secretKey);\n if (secretKey.length !== crypto_sign_SECRETKEYBYTES)\n throw new Error('bad secret key size');\n var pk = new Uint8Array(crypto_sign_PUBLICKEYBYTES);\n for (var i = 0; i < pk.length; i++) pk[i] = secretKey[32+i];\n return {publicKey: pk, secretKey: new Uint8Array(secretKey)};\n};\n\nnacl.sign.keyPair.fromSeed = function(seed) {\n checkArrayTypes(seed);\n if (seed.length !== crypto_sign_SEEDBYTES)\n throw new Error('bad seed size');\n var pk = new Uint8Array(crypto_sign_PUBLICKEYBYTES);\n var sk = new Uint8Array(crypto_sign_SECRETKEYBYTES);\n for (var i = 0; i < 32; i++) sk[i] = seed[i];\n crypto_sign_keypair(pk, sk, true);\n return {publicKey: pk, secretKey: sk};\n};\n\nnacl.sign.publicKeyLength = crypto_sign_PUBLICKEYBYTES;\nnacl.sign.secretKeyLength = crypto_sign_SECRETKEYBYTES;\nnacl.sign.seedLength = crypto_sign_SEEDBYTES;\nnacl.sign.signatureLength = crypto_sign_BYTES;\n\nnacl.hash = function(msg) {\n checkArrayTypes(msg);\n var h = new Uint8Array(crypto_hash_BYTES);\n crypto_hash(h, msg, msg.length);\n return h;\n};\n\nnacl.hash.hashLength = crypto_hash_BYTES;\n\nnacl.verify = function(x, y) {\n checkArrayTypes(x, y);\n // Zero length arguments are considered not equal.\n if (x.length === 0 || y.length === 0) return false;\n if (x.length !== y.length) return false;\n return (vn(x, 0, y, 0, x.length) === 0) ? true : false;\n};\n\nnacl.setPRNG = function(fn) {\n randombytes = fn;\n};\n\n(function() {\n // Initialize PRNG if environment provides CSPRNG.\n // If not, methods calling randombytes will throw.\n var crypto = typeof self !== 'undefined' ? (self.crypto || self.msCrypto) : null;\n if (crypto && crypto.getRandomValues) {\n // Browsers.\n var QUOTA = 65536;\n nacl.setPRNG(function(x, n) {\n var i, v = new Uint8Array(n);\n for (i = 0; i < n; i += QUOTA) {\n crypto.getRandomValues(v.subarray(i, i + Math.min(n - i, QUOTA)));\n }\n for (i = 0; i < n; i++) x[i] = v[i];\n cleanup(v);\n });\n } else if (true) {\n // Node.js.\n crypto = __webpack_require__(4);\n if (crypto && crypto.randomBytes) {\n nacl.setPRNG(function(x, n) {\n var i, v = crypto.randomBytes(n);\n for (i = 0; i < n; i++) x[i] = v[i];\n cleanup(v);\n });\n }\n }\n})();\n\n})( true && module.exports ? module.exports : (self.nacl = self.nacl || {}));\n\n\n/***/ }),\n/* 3 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__(5).default;\n\n\n/***/ }),\n/* 4 */\n/***/ (function(module, exports) {\n\n/* (ignored) */\n\n/***/ }),\n/* 5 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n// ESM COMPAT FLAG\n__webpack_require__.r(__webpack_exports__);\n\n// CONCATENATED MODULE: ./src/runtimes/web/dom/script_receiver_factory.ts\nvar ScriptReceiverFactory = (function () {\n function ScriptReceiverFactory(prefix, name) {\n this.lastId = 0;\n this.prefix = prefix;\n this.name = name;\n }\n ScriptReceiverFactory.prototype.create = function (callback) {\n this.lastId++;\n var number = this.lastId;\n var id = this.prefix + number;\n var name = this.name + '[' + number + ']';\n var called = false;\n var callbackWrapper = function () {\n if (!called) {\n callback.apply(null, arguments);\n called = true;\n }\n };\n this[number] = callbackWrapper;\n return { number: number, id: id, name: name, callback: callbackWrapper };\n };\n ScriptReceiverFactory.prototype.remove = function (receiver) {\n delete this[receiver.number];\n };\n return ScriptReceiverFactory;\n}());\n\nvar ScriptReceivers = new ScriptReceiverFactory('_pusher_script_', 'Pusher.ScriptReceivers');\n\n// CONCATENATED MODULE: ./src/core/defaults.ts\nvar Defaults = {\n VERSION: \"7.6.0\",\n PROTOCOL: 7,\n wsPort: 80,\n wssPort: 443,\n wsPath: '',\n httpHost: 'sockjs.pusher.com',\n httpPort: 80,\n httpsPort: 443,\n httpPath: '/pusher',\n stats_host: 'stats.pusher.com',\n authEndpoint: '/pusher/auth',\n authTransport: 'ajax',\n activityTimeout: 120000,\n pongTimeout: 30000,\n unavailableTimeout: 10000,\n cluster: 'mt1',\n userAuthentication: {\n endpoint: '/pusher/user-auth',\n transport: 'ajax'\n },\n channelAuthorization: {\n endpoint: '/pusher/auth',\n transport: 'ajax'\n },\n cdn_http: \"http://js.pusher.com\",\n cdn_https: \"https://js.pusher.com\",\n dependency_suffix: \"\"\n};\n/* harmony default export */ var defaults = (Defaults);\n\n// CONCATENATED MODULE: ./src/runtimes/web/dom/dependency_loader.ts\n\n\nvar dependency_loader_DependencyLoader = (function () {\n function DependencyLoader(options) {\n this.options = options;\n this.receivers = options.receivers || ScriptReceivers;\n this.loading = {};\n }\n DependencyLoader.prototype.load = function (name, options, callback) {\n var self = this;\n if (self.loading[name] && self.loading[name].length > 0) {\n self.loading[name].push(callback);\n }\n else {\n self.loading[name] = [callback];\n var request = runtime.createScriptRequest(self.getPath(name, options));\n var receiver = self.receivers.create(function (error) {\n self.receivers.remove(receiver);\n if (self.loading[name]) {\n var callbacks = self.loading[name];\n delete self.loading[name];\n var successCallback = function (wasSuccessful) {\n if (!wasSuccessful) {\n request.cleanup();\n }\n };\n for (var i = 0; i < callbacks.length; i++) {\n callbacks[i](error, successCallback);\n }\n }\n });\n request.send(receiver);\n }\n };\n DependencyLoader.prototype.getRoot = function (options) {\n var cdn;\n var protocol = runtime.getDocument().location.protocol;\n if ((options && options.useTLS) || protocol === 'https:') {\n cdn = this.options.cdn_https;\n }\n else {\n cdn = this.options.cdn_http;\n }\n return cdn.replace(/\\/*$/, '') + '/' + this.options.version;\n };\n DependencyLoader.prototype.getPath = function (name, options) {\n return this.getRoot(options) + '/' + name + this.options.suffix + '.js';\n };\n return DependencyLoader;\n}());\n/* harmony default export */ var dependency_loader = (dependency_loader_DependencyLoader);\n\n// CONCATENATED MODULE: ./src/runtimes/web/dom/dependencies.ts\n\n\n\nvar DependenciesReceivers = new ScriptReceiverFactory('_pusher_dependencies', 'Pusher.DependenciesReceivers');\nvar Dependencies = new dependency_loader({\n cdn_http: defaults.cdn_http,\n cdn_https: defaults.cdn_https,\n version: defaults.VERSION,\n suffix: defaults.dependency_suffix,\n receivers: DependenciesReceivers\n});\n\n// CONCATENATED MODULE: ./src/core/utils/url_store.ts\nvar urlStore = {\n baseUrl: 'https://pusher.com',\n urls: {\n authenticationEndpoint: {\n path: '/docs/channels/server_api/authenticating_users'\n },\n authorizationEndpoint: {\n path: '/docs/channels/server_api/authorizing-users/'\n },\n javascriptQuickStart: {\n path: '/docs/javascript_quick_start'\n },\n triggeringClientEvents: {\n path: '/docs/client_api_guide/client_events#trigger-events'\n },\n encryptedChannelSupport: {\n fullUrl: 'https://github.com/pusher/pusher-js/tree/cc491015371a4bde5743d1c87a0fbac0feb53195#encrypted-channel-support'\n }\n }\n};\nvar buildLogSuffix = function (key) {\n var urlPrefix = 'See:';\n var urlObj = urlStore.urls[key];\n if (!urlObj)\n return '';\n var url;\n if (urlObj.fullUrl) {\n url = urlObj.fullUrl;\n }\n else if (urlObj.path) {\n url = urlStore.baseUrl + urlObj.path;\n }\n if (!url)\n return '';\n return urlPrefix + \" \" + url;\n};\n/* harmony default export */ var url_store = ({ buildLogSuffix: buildLogSuffix });\n\n// CONCATENATED MODULE: ./src/core/auth/options.ts\nvar AuthRequestType;\n(function (AuthRequestType) {\n AuthRequestType[\"UserAuthentication\"] = \"user-authentication\";\n AuthRequestType[\"ChannelAuthorization\"] = \"channel-authorization\";\n})(AuthRequestType || (AuthRequestType = {}));\n\n// CONCATENATED MODULE: ./src/core/errors.ts\nvar __extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar BadEventName = (function (_super) {\n __extends(BadEventName, _super);\n function BadEventName(msg) {\n var _newTarget = this.constructor;\n var _this = _super.call(this, msg) || this;\n Object.setPrototypeOf(_this, _newTarget.prototype);\n return _this;\n }\n return BadEventName;\n}(Error));\n\nvar BadChannelName = (function (_super) {\n __extends(BadChannelName, _super);\n function BadChannelName(msg) {\n var _newTarget = this.constructor;\n var _this = _super.call(this, msg) || this;\n Object.setPrototypeOf(_this, _newTarget.prototype);\n return _this;\n }\n return BadChannelName;\n}(Error));\n\nvar RequestTimedOut = (function (_super) {\n __extends(RequestTimedOut, _super);\n function RequestTimedOut(msg) {\n var _newTarget = this.constructor;\n var _this = _super.call(this, msg) || this;\n Object.setPrototypeOf(_this, _newTarget.prototype);\n return _this;\n }\n return RequestTimedOut;\n}(Error));\n\nvar TransportPriorityTooLow = (function (_super) {\n __extends(TransportPriorityTooLow, _super);\n function TransportPriorityTooLow(msg) {\n var _newTarget = this.constructor;\n var _this = _super.call(this, msg) || this;\n Object.setPrototypeOf(_this, _newTarget.prototype);\n return _this;\n }\n return TransportPriorityTooLow;\n}(Error));\n\nvar TransportClosed = (function (_super) {\n __extends(TransportClosed, _super);\n function TransportClosed(msg) {\n var _newTarget = this.constructor;\n var _this = _super.call(this, msg) || this;\n Object.setPrototypeOf(_this, _newTarget.prototype);\n return _this;\n }\n return TransportClosed;\n}(Error));\n\nvar UnsupportedFeature = (function (_super) {\n __extends(UnsupportedFeature, _super);\n function UnsupportedFeature(msg) {\n var _newTarget = this.constructor;\n var _this = _super.call(this, msg) || this;\n Object.setPrototypeOf(_this, _newTarget.prototype);\n return _this;\n }\n return UnsupportedFeature;\n}(Error));\n\nvar UnsupportedTransport = (function (_super) {\n __extends(UnsupportedTransport, _super);\n function UnsupportedTransport(msg) {\n var _newTarget = this.constructor;\n var _this = _super.call(this, msg) || this;\n Object.setPrototypeOf(_this, _newTarget.prototype);\n return _this;\n }\n return UnsupportedTransport;\n}(Error));\n\nvar UnsupportedStrategy = (function (_super) {\n __extends(UnsupportedStrategy, _super);\n function UnsupportedStrategy(msg) {\n var _newTarget = this.constructor;\n var _this = _super.call(this, msg) || this;\n Object.setPrototypeOf(_this, _newTarget.prototype);\n return _this;\n }\n return UnsupportedStrategy;\n}(Error));\n\nvar HTTPAuthError = (function (_super) {\n __extends(HTTPAuthError, _super);\n function HTTPAuthError(status, msg) {\n var _newTarget = this.constructor;\n var _this = _super.call(this, msg) || this;\n _this.status = status;\n Object.setPrototypeOf(_this, _newTarget.prototype);\n return _this;\n }\n return HTTPAuthError;\n}(Error));\n\n\n// CONCATENATED MODULE: ./src/runtimes/isomorphic/auth/xhr_auth.ts\n\n\n\n\nvar ajax = function (context, query, authOptions, authRequestType, callback) {\n var xhr = runtime.createXHR();\n xhr.open('POST', authOptions.endpoint, true);\n xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');\n for (var headerName in authOptions.headers) {\n xhr.setRequestHeader(headerName, authOptions.headers[headerName]);\n }\n if (authOptions.headersProvider != null) {\n var dynamicHeaders = authOptions.headersProvider();\n for (var headerName in dynamicHeaders) {\n xhr.setRequestHeader(headerName, dynamicHeaders[headerName]);\n }\n }\n xhr.onreadystatechange = function () {\n if (xhr.readyState === 4) {\n if (xhr.status === 200) {\n var data = void 0;\n var parsed = false;\n try {\n data = JSON.parse(xhr.responseText);\n parsed = true;\n }\n catch (e) {\n callback(new HTTPAuthError(200, \"JSON returned from \" + authRequestType.toString() + \" endpoint was invalid, yet status code was 200. Data was: \" + xhr.responseText), null);\n }\n if (parsed) {\n callback(null, data);\n }\n }\n else {\n var suffix = '';\n switch (authRequestType) {\n case AuthRequestType.UserAuthentication:\n suffix = url_store.buildLogSuffix('authenticationEndpoint');\n break;\n case AuthRequestType.ChannelAuthorization:\n suffix = \"Clients must be authorized to join private or presence channels. \" + url_store.buildLogSuffix('authorizationEndpoint');\n break;\n }\n callback(new HTTPAuthError(xhr.status, \"Unable to retrieve auth string from \" + authRequestType.toString() + \" endpoint - \" +\n (\"received status: \" + xhr.status + \" from \" + authOptions.endpoint + \". \" + suffix)), null);\n }\n }\n };\n xhr.send(query);\n return xhr;\n};\n/* harmony default export */ var xhr_auth = (ajax);\n\n// CONCATENATED MODULE: ./src/core/base64.ts\nfunction encode(s) {\n return btoa(utob(s));\n}\nvar fromCharCode = String.fromCharCode;\nvar b64chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\nvar b64tab = {};\nfor (var base64_i = 0, l = b64chars.length; base64_i < l; base64_i++) {\n b64tab[b64chars.charAt(base64_i)] = base64_i;\n}\nvar cb_utob = function (c) {\n var cc = c.charCodeAt(0);\n return cc < 0x80\n ? c\n : cc < 0x800\n ? fromCharCode(0xc0 | (cc >>> 6)) + fromCharCode(0x80 | (cc & 0x3f))\n : fromCharCode(0xe0 | ((cc >>> 12) & 0x0f)) +\n fromCharCode(0x80 | ((cc >>> 6) & 0x3f)) +\n fromCharCode(0x80 | (cc & 0x3f));\n};\nvar utob = function (u) {\n return u.replace(/[^\\x00-\\x7F]/g, cb_utob);\n};\nvar cb_encode = function (ccc) {\n var padlen = [0, 2, 1][ccc.length % 3];\n var ord = (ccc.charCodeAt(0) << 16) |\n ((ccc.length > 1 ? ccc.charCodeAt(1) : 0) << 8) |\n (ccc.length > 2 ? ccc.charCodeAt(2) : 0);\n var chars = [\n b64chars.charAt(ord >>> 18),\n b64chars.charAt((ord >>> 12) & 63),\n padlen >= 2 ? '=' : b64chars.charAt((ord >>> 6) & 63),\n padlen >= 1 ? '=' : b64chars.charAt(ord & 63)\n ];\n return chars.join('');\n};\nvar btoa = window.btoa ||\n function (b) {\n return b.replace(/[\\s\\S]{1,3}/g, cb_encode);\n };\n\n// CONCATENATED MODULE: ./src/core/utils/timers/abstract_timer.ts\nvar Timer = (function () {\n function Timer(set, clear, delay, callback) {\n var _this = this;\n this.clear = clear;\n this.timer = set(function () {\n if (_this.timer) {\n _this.timer = callback(_this.timer);\n }\n }, delay);\n }\n Timer.prototype.isRunning = function () {\n return this.timer !== null;\n };\n Timer.prototype.ensureAborted = function () {\n if (this.timer) {\n this.clear(this.timer);\n this.timer = null;\n }\n };\n return Timer;\n}());\n/* harmony default export */ var abstract_timer = (Timer);\n\n// CONCATENATED MODULE: ./src/core/utils/timers/index.ts\nvar timers_extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\n\nfunction timers_clearTimeout(timer) {\n window.clearTimeout(timer);\n}\nfunction timers_clearInterval(timer) {\n window.clearInterval(timer);\n}\nvar OneOffTimer = (function (_super) {\n timers_extends(OneOffTimer, _super);\n function OneOffTimer(delay, callback) {\n return _super.call(this, setTimeout, timers_clearTimeout, delay, function (timer) {\n callback();\n return null;\n }) || this;\n }\n return OneOffTimer;\n}(abstract_timer));\n\nvar PeriodicTimer = (function (_super) {\n timers_extends(PeriodicTimer, _super);\n function PeriodicTimer(delay, callback) {\n return _super.call(this, setInterval, timers_clearInterval, delay, function (timer) {\n callback();\n return timer;\n }) || this;\n }\n return PeriodicTimer;\n}(abstract_timer));\n\n\n// CONCATENATED MODULE: ./src/core/util.ts\n\nvar Util = {\n now: function () {\n if (Date.now) {\n return Date.now();\n }\n else {\n return new Date().valueOf();\n }\n },\n defer: function (callback) {\n return new OneOffTimer(0, callback);\n },\n method: function (name) {\n var args = [];\n for (var _i = 1; _i < arguments.length; _i++) {\n args[_i - 1] = arguments[_i];\n }\n var boundArguments = Array.prototype.slice.call(arguments, 1);\n return function (object) {\n return object[name].apply(object, boundArguments.concat(arguments));\n };\n }\n};\n/* harmony default export */ var util = (Util);\n\n// CONCATENATED MODULE: ./src/core/utils/collections.ts\n\n\nfunction extend(target) {\n var sources = [];\n for (var _i = 1; _i < arguments.length; _i++) {\n sources[_i - 1] = arguments[_i];\n }\n for (var i = 0; i < sources.length; i++) {\n var extensions = sources[i];\n for (var property in extensions) {\n if (extensions[property] &&\n extensions[property].constructor &&\n extensions[property].constructor === Object) {\n target[property] = extend(target[property] || {}, extensions[property]);\n }\n else {\n target[property] = extensions[property];\n }\n }\n }\n return target;\n}\nfunction stringify() {\n var m = ['Pusher'];\n for (var i = 0; i < arguments.length; i++) {\n if (typeof arguments[i] === 'string') {\n m.push(arguments[i]);\n }\n else {\n m.push(safeJSONStringify(arguments[i]));\n }\n }\n return m.join(' : ');\n}\nfunction arrayIndexOf(array, item) {\n var nativeIndexOf = Array.prototype.indexOf;\n if (array === null) {\n return -1;\n }\n if (nativeIndexOf && array.indexOf === nativeIndexOf) {\n return array.indexOf(item);\n }\n for (var i = 0, l = array.length; i < l; i++) {\n if (array[i] === item) {\n return i;\n }\n }\n return -1;\n}\nfunction objectApply(object, f) {\n for (var key in object) {\n if (Object.prototype.hasOwnProperty.call(object, key)) {\n f(object[key], key, object);\n }\n }\n}\nfunction keys(object) {\n var keys = [];\n objectApply(object, function (_, key) {\n keys.push(key);\n });\n return keys;\n}\nfunction values(object) {\n var values = [];\n objectApply(object, function (value) {\n values.push(value);\n });\n return values;\n}\nfunction apply(array, f, context) {\n for (var i = 0; i < array.length; i++) {\n f.call(context || window, array[i], i, array);\n }\n}\nfunction map(array, f) {\n var result = [];\n for (var i = 0; i < array.length; i++) {\n result.push(f(array[i], i, array, result));\n }\n return result;\n}\nfunction mapObject(object, f) {\n var result = {};\n objectApply(object, function (value, key) {\n result[key] = f(value);\n });\n return result;\n}\nfunction filter(array, test) {\n test =\n test ||\n function (value) {\n return !!value;\n };\n var result = [];\n for (var i = 0; i < array.length; i++) {\n if (test(array[i], i, array, result)) {\n result.push(array[i]);\n }\n }\n return result;\n}\nfunction filterObject(object, test) {\n var result = {};\n objectApply(object, function (value, key) {\n if ((test && test(value, key, object, result)) || Boolean(value)) {\n result[key] = value;\n }\n });\n return result;\n}\nfunction flatten(object) {\n var result = [];\n objectApply(object, function (value, key) {\n result.push([key, value]);\n });\n return result;\n}\nfunction any(array, test) {\n for (var i = 0; i < array.length; i++) {\n if (test(array[i], i, array)) {\n return true;\n }\n }\n return false;\n}\nfunction collections_all(array, test) {\n for (var i = 0; i < array.length; i++) {\n if (!test(array[i], i, array)) {\n return false;\n }\n }\n return true;\n}\nfunction encodeParamsObject(data) {\n return mapObject(data, function (value) {\n if (typeof value === 'object') {\n value = safeJSONStringify(value);\n }\n return encodeURIComponent(encode(value.toString()));\n });\n}\nfunction buildQueryString(data) {\n var params = filterObject(data, function (value) {\n return value !== undefined;\n });\n var query = map(flatten(encodeParamsObject(params)), util.method('join', '=')).join('&');\n return query;\n}\nfunction decycleObject(object) {\n var objects = [], paths = [];\n return (function derez(value, path) {\n var i, name, nu;\n switch (typeof value) {\n case 'object':\n if (!value) {\n return null;\n }\n for (i = 0; i < objects.length; i += 1) {\n if (objects[i] === value) {\n return { $ref: paths[i] };\n }\n }\n objects.push(value);\n paths.push(path);\n if (Object.prototype.toString.apply(value) === '[object Array]') {\n nu = [];\n for (i = 0; i < value.length; i += 1) {\n nu[i] = derez(value[i], path + '[' + i + ']');\n }\n }\n else {\n nu = {};\n for (name in value) {\n if (Object.prototype.hasOwnProperty.call(value, name)) {\n nu[name] = derez(value[name], path + '[' + JSON.stringify(name) + ']');\n }\n }\n }\n return nu;\n case 'number':\n case 'string':\n case 'boolean':\n return value;\n }\n })(object, '$');\n}\nfunction safeJSONStringify(source) {\n try {\n return JSON.stringify(source);\n }\n catch (e) {\n return JSON.stringify(decycleObject(source));\n }\n}\n\n// CONCATENATED MODULE: ./src/core/logger.ts\n\n\nvar logger_Logger = (function () {\n function Logger() {\n this.globalLog = function (message) {\n if (window.console && window.console.log) {\n window.console.log(message);\n }\n };\n }\n Logger.prototype.debug = function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n this.log(this.globalLog, args);\n };\n Logger.prototype.warn = function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n this.log(this.globalLogWarn, args);\n };\n Logger.prototype.error = function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n this.log(this.globalLogError, args);\n };\n Logger.prototype.globalLogWarn = function (message) {\n if (window.console && window.console.warn) {\n window.console.warn(message);\n }\n else {\n this.globalLog(message);\n }\n };\n Logger.prototype.globalLogError = function (message) {\n if (window.console && window.console.error) {\n window.console.error(message);\n }\n else {\n this.globalLogWarn(message);\n }\n };\n Logger.prototype.log = function (defaultLoggingFunction) {\n var args = [];\n for (var _i = 1; _i < arguments.length; _i++) {\n args[_i - 1] = arguments[_i];\n }\n var message = stringify.apply(this, arguments);\n if (core_pusher.log) {\n core_pusher.log(message);\n }\n else if (core_pusher.logToConsole) {\n var log = defaultLoggingFunction.bind(this);\n log(message);\n }\n };\n return Logger;\n}());\n/* harmony default export */ var logger = (new logger_Logger());\n\n// CONCATENATED MODULE: ./src/runtimes/web/auth/jsonp_auth.ts\n\nvar jsonp = function (context, query, authOptions, authRequestType, callback) {\n if (authOptions.headers !== undefined ||\n authOptions.headersProvider != null) {\n logger.warn(\"To send headers with the \" + authRequestType.toString() + \" request, you must use AJAX, rather than JSONP.\");\n }\n var callbackName = context.nextAuthCallbackID.toString();\n context.nextAuthCallbackID++;\n var document = context.getDocument();\n var script = document.createElement('script');\n context.auth_callbacks[callbackName] = function (data) {\n callback(null, data);\n };\n var callback_name = \"Pusher.auth_callbacks['\" + callbackName + \"']\";\n script.src =\n authOptions.endpoint +\n '?callback=' +\n encodeURIComponent(callback_name) +\n '&' +\n query;\n var head = document.getElementsByTagName('head')[0] || document.documentElement;\n head.insertBefore(script, head.firstChild);\n};\n/* harmony default export */ var jsonp_auth = (jsonp);\n\n// CONCATENATED MODULE: ./src/runtimes/web/dom/script_request.ts\nvar ScriptRequest = (function () {\n function ScriptRequest(src) {\n this.src = src;\n }\n ScriptRequest.prototype.send = function (receiver) {\n var self = this;\n var errorString = 'Error loading ' + self.src;\n self.script = document.createElement('script');\n self.script.id = receiver.id;\n self.script.src = self.src;\n self.script.type = 'text/javascript';\n self.script.charset = 'UTF-8';\n if (self.script.addEventListener) {\n self.script.onerror = function () {\n receiver.callback(errorString);\n };\n self.script.onload = function () {\n receiver.callback(null);\n };\n }\n else {\n self.script.onreadystatechange = function () {\n if (self.script.readyState === 'loaded' ||\n self.script.readyState === 'complete') {\n receiver.callback(null);\n }\n };\n }\n if (self.script.async === undefined &&\n document.attachEvent &&\n /opera/i.test(navigator.userAgent)) {\n self.errorScript = document.createElement('script');\n self.errorScript.id = receiver.id + '_error';\n self.errorScript.text = receiver.name + \"('\" + errorString + \"');\";\n self.script.async = self.errorScript.async = false;\n }\n else {\n self.script.async = true;\n }\n var head = document.getElementsByTagName('head')[0];\n head.insertBefore(self.script, head.firstChild);\n if (self.errorScript) {\n head.insertBefore(self.errorScript, self.script.nextSibling);\n }\n };\n ScriptRequest.prototype.cleanup = function () {\n if (this.script) {\n this.script.onload = this.script.onerror = null;\n this.script.onreadystatechange = null;\n }\n if (this.script && this.script.parentNode) {\n this.script.parentNode.removeChild(this.script);\n }\n if (this.errorScript && this.errorScript.parentNode) {\n this.errorScript.parentNode.removeChild(this.errorScript);\n }\n this.script = null;\n this.errorScript = null;\n };\n return ScriptRequest;\n}());\n/* harmony default export */ var script_request = (ScriptRequest);\n\n// CONCATENATED MODULE: ./src/runtimes/web/dom/jsonp_request.ts\n\n\nvar jsonp_request_JSONPRequest = (function () {\n function JSONPRequest(url, data) {\n this.url = url;\n this.data = data;\n }\n JSONPRequest.prototype.send = function (receiver) {\n if (this.request) {\n return;\n }\n var query = buildQueryString(this.data);\n var url = this.url + '/' + receiver.number + '?' + query;\n this.request = runtime.createScriptRequest(url);\n this.request.send(receiver);\n };\n JSONPRequest.prototype.cleanup = function () {\n if (this.request) {\n this.request.cleanup();\n }\n };\n return JSONPRequest;\n}());\n/* harmony default export */ var jsonp_request = (jsonp_request_JSONPRequest);\n\n// CONCATENATED MODULE: ./src/runtimes/web/timeline/jsonp_timeline.ts\n\n\nvar getAgent = function (sender, useTLS) {\n return function (data, callback) {\n var scheme = 'http' + (useTLS ? 's' : '') + '://';\n var url = scheme + (sender.host || sender.options.host) + sender.options.path;\n var request = runtime.createJSONPRequest(url, data);\n var receiver = runtime.ScriptReceivers.create(function (error, result) {\n ScriptReceivers.remove(receiver);\n request.cleanup();\n if (result && result.host) {\n sender.host = result.host;\n }\n if (callback) {\n callback(error, result);\n }\n });\n request.send(receiver);\n };\n};\nvar jsonp_timeline_jsonp = {\n name: 'jsonp',\n getAgent: getAgent\n};\n/* harmony default export */ var jsonp_timeline = (jsonp_timeline_jsonp);\n\n// CONCATENATED MODULE: ./src/core/transports/url_schemes.ts\n\nfunction getGenericURL(baseScheme, params, path) {\n var scheme = baseScheme + (params.useTLS ? 's' : '');\n var host = params.useTLS ? params.hostTLS : params.hostNonTLS;\n return scheme + '://' + host + path;\n}\nfunction getGenericPath(key, queryString) {\n var path = '/app/' + key;\n var query = '?protocol=' +\n defaults.PROTOCOL +\n '&client=js' +\n '&version=' +\n defaults.VERSION +\n (queryString ? '&' + queryString : '');\n return path + query;\n}\nvar ws = {\n getInitial: function (key, params) {\n var path = (params.httpPath || '') + getGenericPath(key, 'flash=false');\n return getGenericURL('ws', params, path);\n }\n};\nvar http = {\n getInitial: function (key, params) {\n var path = (params.httpPath || '/pusher') + getGenericPath(key);\n return getGenericURL('http', params, path);\n }\n};\nvar sockjs = {\n getInitial: function (key, params) {\n return getGenericURL('http', params, params.httpPath || '/pusher');\n },\n getPath: function (key, params) {\n return getGenericPath(key);\n }\n};\n\n// CONCATENATED MODULE: ./src/core/events/callback_registry.ts\n\nvar callback_registry_CallbackRegistry = (function () {\n function CallbackRegistry() {\n this._callbacks = {};\n }\n CallbackRegistry.prototype.get = function (name) {\n return this._callbacks[prefix(name)];\n };\n CallbackRegistry.prototype.add = function (name, callback, context) {\n var prefixedEventName = prefix(name);\n this._callbacks[prefixedEventName] =\n this._callbacks[prefixedEventName] || [];\n this._callbacks[prefixedEventName].push({\n fn: callback,\n context: context\n });\n };\n CallbackRegistry.prototype.remove = function (name, callback, context) {\n if (!name && !callback && !context) {\n this._callbacks = {};\n return;\n }\n var names = name ? [prefix(name)] : keys(this._callbacks);\n if (callback || context) {\n this.removeCallback(names, callback, context);\n }\n else {\n this.removeAllCallbacks(names);\n }\n };\n CallbackRegistry.prototype.removeCallback = function (names, callback, context) {\n apply(names, function (name) {\n this._callbacks[name] = filter(this._callbacks[name] || [], function (binding) {\n return ((callback && callback !== binding.fn) ||\n (context && context !== binding.context));\n });\n if (this._callbacks[name].length === 0) {\n delete this._callbacks[name];\n }\n }, this);\n };\n CallbackRegistry.prototype.removeAllCallbacks = function (names) {\n apply(names, function (name) {\n delete this._callbacks[name];\n }, this);\n };\n return CallbackRegistry;\n}());\n/* harmony default export */ var callback_registry = (callback_registry_CallbackRegistry);\nfunction prefix(name) {\n return '_' + name;\n}\n\n// CONCATENATED MODULE: ./src/core/events/dispatcher.ts\n\n\nvar dispatcher_Dispatcher = (function () {\n function Dispatcher(failThrough) {\n this.callbacks = new callback_registry();\n this.global_callbacks = [];\n this.failThrough = failThrough;\n }\n Dispatcher.prototype.bind = function (eventName, callback, context) {\n this.callbacks.add(eventName, callback, context);\n return this;\n };\n Dispatcher.prototype.bind_global = function (callback) {\n this.global_callbacks.push(callback);\n return this;\n };\n Dispatcher.prototype.unbind = function (eventName, callback, context) {\n this.callbacks.remove(eventName, callback, context);\n return this;\n };\n Dispatcher.prototype.unbind_global = function (callback) {\n if (!callback) {\n this.global_callbacks = [];\n return this;\n }\n this.global_callbacks = filter(this.global_callbacks || [], function (c) { return c !== callback; });\n return this;\n };\n Dispatcher.prototype.unbind_all = function () {\n this.unbind();\n this.unbind_global();\n return this;\n };\n Dispatcher.prototype.emit = function (eventName, data, metadata) {\n for (var i = 0; i < this.global_callbacks.length; i++) {\n this.global_callbacks[i](eventName, data);\n }\n var callbacks = this.callbacks.get(eventName);\n var args = [];\n if (metadata) {\n args.push(data, metadata);\n }\n else if (data) {\n args.push(data);\n }\n if (callbacks && callbacks.length > 0) {\n for (var i = 0; i < callbacks.length; i++) {\n callbacks[i].fn.apply(callbacks[i].context || window, args);\n }\n }\n else if (this.failThrough) {\n this.failThrough(eventName, data);\n }\n return this;\n };\n return Dispatcher;\n}());\n/* harmony default export */ var dispatcher = (dispatcher_Dispatcher);\n\n// CONCATENATED MODULE: ./src/core/transports/transport_connection.ts\nvar transport_connection_extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\n\n\n\n\n\nvar transport_connection_TransportConnection = (function (_super) {\n transport_connection_extends(TransportConnection, _super);\n function TransportConnection(hooks, name, priority, key, options) {\n var _this = _super.call(this) || this;\n _this.initialize = runtime.transportConnectionInitializer;\n _this.hooks = hooks;\n _this.name = name;\n _this.priority = priority;\n _this.key = key;\n _this.options = options;\n _this.state = 'new';\n _this.timeline = options.timeline;\n _this.activityTimeout = options.activityTimeout;\n _this.id = _this.timeline.generateUniqueID();\n return _this;\n }\n TransportConnection.prototype.handlesActivityChecks = function () {\n return Boolean(this.hooks.handlesActivityChecks);\n };\n TransportConnection.prototype.supportsPing = function () {\n return Boolean(this.hooks.supportsPing);\n };\n TransportConnection.prototype.connect = function () {\n var _this = this;\n if (this.socket || this.state !== 'initialized') {\n return false;\n }\n var url = this.hooks.urls.getInitial(this.key, this.options);\n try {\n this.socket = this.hooks.getSocket(url, this.options);\n }\n catch (e) {\n util.defer(function () {\n _this.onError(e);\n _this.changeState('closed');\n });\n return false;\n }\n this.bindListeners();\n logger.debug('Connecting', { transport: this.name, url: url });\n this.changeState('connecting');\n return true;\n };\n TransportConnection.prototype.close = function () {\n if (this.socket) {\n this.socket.close();\n return true;\n }\n else {\n return false;\n }\n };\n TransportConnection.prototype.send = function (data) {\n var _this = this;\n if (this.state === 'open') {\n util.defer(function () {\n if (_this.socket) {\n _this.socket.send(data);\n }\n });\n return true;\n }\n else {\n return false;\n }\n };\n TransportConnection.prototype.ping = function () {\n if (this.state === 'open' && this.supportsPing()) {\n this.socket.ping();\n }\n };\n TransportConnection.prototype.onOpen = function () {\n if (this.hooks.beforeOpen) {\n this.hooks.beforeOpen(this.socket, this.hooks.urls.getPath(this.key, this.options));\n }\n this.changeState('open');\n this.socket.onopen = undefined;\n };\n TransportConnection.prototype.onError = function (error) {\n this.emit('error', { type: 'WebSocketError', error: error });\n this.timeline.error(this.buildTimelineMessage({ error: error.toString() }));\n };\n TransportConnection.prototype.onClose = function (closeEvent) {\n if (closeEvent) {\n this.changeState('closed', {\n code: closeEvent.code,\n reason: closeEvent.reason,\n wasClean: closeEvent.wasClean\n });\n }\n else {\n this.changeState('closed');\n }\n this.unbindListeners();\n this.socket = undefined;\n };\n TransportConnection.prototype.onMessage = function (message) {\n this.emit('message', message);\n };\n TransportConnection.prototype.onActivity = function () {\n this.emit('activity');\n };\n TransportConnection.prototype.bindListeners = function () {\n var _this = this;\n this.socket.onopen = function () {\n _this.onOpen();\n };\n this.socket.onerror = function (error) {\n _this.onError(error);\n };\n this.socket.onclose = function (closeEvent) {\n _this.onClose(closeEvent);\n };\n this.socket.onmessage = function (message) {\n _this.onMessage(message);\n };\n if (this.supportsPing()) {\n this.socket.onactivity = function () {\n _this.onActivity();\n };\n }\n };\n TransportConnection.prototype.unbindListeners = function () {\n if (this.socket) {\n this.socket.onopen = undefined;\n this.socket.onerror = undefined;\n this.socket.onclose = undefined;\n this.socket.onmessage = undefined;\n if (this.supportsPing()) {\n this.socket.onactivity = undefined;\n }\n }\n };\n TransportConnection.prototype.changeState = function (state, params) {\n this.state = state;\n this.timeline.info(this.buildTimelineMessage({\n state: state,\n params: params\n }));\n this.emit(state, params);\n };\n TransportConnection.prototype.buildTimelineMessage = function (message) {\n return extend({ cid: this.id }, message);\n };\n return TransportConnection;\n}(dispatcher));\n/* harmony default export */ var transport_connection = (transport_connection_TransportConnection);\n\n// CONCATENATED MODULE: ./src/core/transports/transport.ts\n\nvar transport_Transport = (function () {\n function Transport(hooks) {\n this.hooks = hooks;\n }\n Transport.prototype.isSupported = function (environment) {\n return this.hooks.isSupported(environment);\n };\n Transport.prototype.createConnection = function (name, priority, key, options) {\n return new transport_connection(this.hooks, name, priority, key, options);\n };\n return Transport;\n}());\n/* harmony default export */ var transports_transport = (transport_Transport);\n\n// CONCATENATED MODULE: ./src/runtimes/isomorphic/transports/transports.ts\n\n\n\n\nvar WSTransport = new transports_transport({\n urls: ws,\n handlesActivityChecks: false,\n supportsPing: false,\n isInitialized: function () {\n return Boolean(runtime.getWebSocketAPI());\n },\n isSupported: function () {\n return Boolean(runtime.getWebSocketAPI());\n },\n getSocket: function (url) {\n return runtime.createWebSocket(url);\n }\n});\nvar httpConfiguration = {\n urls: http,\n handlesActivityChecks: false,\n supportsPing: true,\n isInitialized: function () {\n return true;\n }\n};\nvar streamingConfiguration = extend({\n getSocket: function (url) {\n return runtime.HTTPFactory.createStreamingSocket(url);\n }\n}, httpConfiguration);\nvar pollingConfiguration = extend({\n getSocket: function (url) {\n return runtime.HTTPFactory.createPollingSocket(url);\n }\n}, httpConfiguration);\nvar xhrConfiguration = {\n isSupported: function () {\n return runtime.isXHRSupported();\n }\n};\nvar XHRStreamingTransport = new transports_transport((extend({}, streamingConfiguration, xhrConfiguration)));\nvar XHRPollingTransport = new transports_transport(extend({}, pollingConfiguration, xhrConfiguration));\nvar Transports = {\n ws: WSTransport,\n xhr_streaming: XHRStreamingTransport,\n xhr_polling: XHRPollingTransport\n};\n/* harmony default export */ var transports = (Transports);\n\n// CONCATENATED MODULE: ./src/runtimes/web/transports/transports.ts\n\n\n\n\n\n\nvar SockJSTransport = new transports_transport({\n file: 'sockjs',\n urls: sockjs,\n handlesActivityChecks: true,\n supportsPing: false,\n isSupported: function () {\n return true;\n },\n isInitialized: function () {\n return window.SockJS !== undefined;\n },\n getSocket: function (url, options) {\n return new window.SockJS(url, null, {\n js_path: Dependencies.getPath('sockjs', {\n useTLS: options.useTLS\n }),\n ignore_null_origin: options.ignoreNullOrigin\n });\n },\n beforeOpen: function (socket, path) {\n socket.send(JSON.stringify({\n path: path\n }));\n }\n});\nvar xdrConfiguration = {\n isSupported: function (environment) {\n var yes = runtime.isXDRSupported(environment.useTLS);\n return yes;\n }\n};\nvar XDRStreamingTransport = new transports_transport((extend({}, streamingConfiguration, xdrConfiguration)));\nvar XDRPollingTransport = new transports_transport(extend({}, pollingConfiguration, xdrConfiguration));\ntransports.xdr_streaming = XDRStreamingTransport;\ntransports.xdr_polling = XDRPollingTransport;\ntransports.sockjs = SockJSTransport;\n/* harmony default export */ var transports_transports = (transports);\n\n// CONCATENATED MODULE: ./src/runtimes/web/net_info.ts\nvar net_info_extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\n\nvar NetInfo = (function (_super) {\n net_info_extends(NetInfo, _super);\n function NetInfo() {\n var _this = _super.call(this) || this;\n var self = _this;\n if (window.addEventListener !== undefined) {\n window.addEventListener('online', function () {\n self.emit('online');\n }, false);\n window.addEventListener('offline', function () {\n self.emit('offline');\n }, false);\n }\n return _this;\n }\n NetInfo.prototype.isOnline = function () {\n if (window.navigator.onLine === undefined) {\n return true;\n }\n else {\n return window.navigator.onLine;\n }\n };\n return NetInfo;\n}(dispatcher));\n\nvar net_info_Network = new NetInfo();\n\n// CONCATENATED MODULE: ./src/core/transports/assistant_to_the_transport_manager.ts\n\n\nvar assistant_to_the_transport_manager_AssistantToTheTransportManager = (function () {\n function AssistantToTheTransportManager(manager, transport, options) {\n this.manager = manager;\n this.transport = transport;\n this.minPingDelay = options.minPingDelay;\n this.maxPingDelay = options.maxPingDelay;\n this.pingDelay = undefined;\n }\n AssistantToTheTransportManager.prototype.createConnection = function (name, priority, key, options) {\n var _this = this;\n options = extend({}, options, {\n activityTimeout: this.pingDelay\n });\n var connection = this.transport.createConnection(name, priority, key, options);\n var openTimestamp = null;\n var onOpen = function () {\n connection.unbind('open', onOpen);\n connection.bind('closed', onClosed);\n openTimestamp = util.now();\n };\n var onClosed = function (closeEvent) {\n connection.unbind('closed', onClosed);\n if (closeEvent.code === 1002 || closeEvent.code === 1003) {\n _this.manager.reportDeath();\n }\n else if (!closeEvent.wasClean && openTimestamp) {\n var lifespan = util.now() - openTimestamp;\n if (lifespan < 2 * _this.maxPingDelay) {\n _this.manager.reportDeath();\n _this.pingDelay = Math.max(lifespan / 2, _this.minPingDelay);\n }\n }\n };\n connection.bind('open', onOpen);\n return connection;\n };\n AssistantToTheTransportManager.prototype.isSupported = function (environment) {\n return this.manager.isAlive() && this.transport.isSupported(environment);\n };\n return AssistantToTheTransportManager;\n}());\n/* harmony default export */ var assistant_to_the_transport_manager = (assistant_to_the_transport_manager_AssistantToTheTransportManager);\n\n// CONCATENATED MODULE: ./src/core/connection/protocol/protocol.ts\nvar Protocol = {\n decodeMessage: function (messageEvent) {\n try {\n var messageData = JSON.parse(messageEvent.data);\n var pusherEventData = messageData.data;\n if (typeof pusherEventData === 'string') {\n try {\n pusherEventData = JSON.parse(messageData.data);\n }\n catch (e) { }\n }\n var pusherEvent = {\n event: messageData.event,\n channel: messageData.channel,\n data: pusherEventData\n };\n if (messageData.user_id) {\n pusherEvent.user_id = messageData.user_id;\n }\n return pusherEvent;\n }\n catch (e) {\n throw { type: 'MessageParseError', error: e, data: messageEvent.data };\n }\n },\n encodeMessage: function (event) {\n return JSON.stringify(event);\n },\n processHandshake: function (messageEvent) {\n var message = Protocol.decodeMessage(messageEvent);\n if (message.event === 'pusher:connection_established') {\n if (!message.data.activity_timeout) {\n throw 'No activity timeout specified in handshake';\n }\n return {\n action: 'connected',\n id: message.data.socket_id,\n activityTimeout: message.data.activity_timeout * 1000\n };\n }\n else if (message.event === 'pusher:error') {\n return {\n action: this.getCloseAction(message.data),\n error: this.getCloseError(message.data)\n };\n }\n else {\n throw 'Invalid handshake';\n }\n },\n getCloseAction: function (closeEvent) {\n if (closeEvent.code < 4000) {\n if (closeEvent.code >= 1002 && closeEvent.code <= 1004) {\n return 'backoff';\n }\n else {\n return null;\n }\n }\n else if (closeEvent.code === 4000) {\n return 'tls_only';\n }\n else if (closeEvent.code < 4100) {\n return 'refused';\n }\n else if (closeEvent.code < 4200) {\n return 'backoff';\n }\n else if (closeEvent.code < 4300) {\n return 'retry';\n }\n else {\n return 'refused';\n }\n },\n getCloseError: function (closeEvent) {\n if (closeEvent.code !== 1000 && closeEvent.code !== 1001) {\n return {\n type: 'PusherError',\n data: {\n code: closeEvent.code,\n message: closeEvent.reason || closeEvent.message\n }\n };\n }\n else {\n return null;\n }\n }\n};\n/* harmony default export */ var protocol_protocol = (Protocol);\n\n// CONCATENATED MODULE: ./src/core/connection/connection.ts\nvar connection_extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\n\n\n\n\nvar connection_Connection = (function (_super) {\n connection_extends(Connection, _super);\n function Connection(id, transport) {\n var _this = _super.call(this) || this;\n _this.id = id;\n _this.transport = transport;\n _this.activityTimeout = transport.activityTimeout;\n _this.bindListeners();\n return _this;\n }\n Connection.prototype.handlesActivityChecks = function () {\n return this.transport.handlesActivityChecks();\n };\n Connection.prototype.send = function (data) {\n return this.transport.send(data);\n };\n Connection.prototype.send_event = function (name, data, channel) {\n var event = { event: name, data: data };\n if (channel) {\n event.channel = channel;\n }\n logger.debug('Event sent', event);\n return this.send(protocol_protocol.encodeMessage(event));\n };\n Connection.prototype.ping = function () {\n if (this.transport.supportsPing()) {\n this.transport.ping();\n }\n else {\n this.send_event('pusher:ping', {});\n }\n };\n Connection.prototype.close = function () {\n this.transport.close();\n };\n Connection.prototype.bindListeners = function () {\n var _this = this;\n var listeners = {\n message: function (messageEvent) {\n var pusherEvent;\n try {\n pusherEvent = protocol_protocol.decodeMessage(messageEvent);\n }\n catch (e) {\n _this.emit('error', {\n type: 'MessageParseError',\n error: e,\n data: messageEvent.data\n });\n }\n if (pusherEvent !== undefined) {\n logger.debug('Event recd', pusherEvent);\n switch (pusherEvent.event) {\n case 'pusher:error':\n _this.emit('error', {\n type: 'PusherError',\n data: pusherEvent.data\n });\n break;\n case 'pusher:ping':\n _this.emit('ping');\n break;\n case 'pusher:pong':\n _this.emit('pong');\n break;\n }\n _this.emit('message', pusherEvent);\n }\n },\n activity: function () {\n _this.emit('activity');\n },\n error: function (error) {\n _this.emit('error', error);\n },\n closed: function (closeEvent) {\n unbindListeners();\n if (closeEvent && closeEvent.code) {\n _this.handleCloseEvent(closeEvent);\n }\n _this.transport = null;\n _this.emit('closed');\n }\n };\n var unbindListeners = function () {\n objectApply(listeners, function (listener, event) {\n _this.transport.unbind(event, listener);\n });\n };\n objectApply(listeners, function (listener, event) {\n _this.transport.bind(event, listener);\n });\n };\n Connection.prototype.handleCloseEvent = function (closeEvent) {\n var action = protocol_protocol.getCloseAction(closeEvent);\n var error = protocol_protocol.getCloseError(closeEvent);\n if (error) {\n this.emit('error', error);\n }\n if (action) {\n this.emit(action, { action: action, error: error });\n }\n };\n return Connection;\n}(dispatcher));\n/* harmony default export */ var connection_connection = (connection_Connection);\n\n// CONCATENATED MODULE: ./src/core/connection/handshake/index.ts\n\n\n\nvar handshake_Handshake = (function () {\n function Handshake(transport, callback) {\n this.transport = transport;\n this.callback = callback;\n this.bindListeners();\n }\n Handshake.prototype.close = function () {\n this.unbindListeners();\n this.transport.close();\n };\n Handshake.prototype.bindListeners = function () {\n var _this = this;\n this.onMessage = function (m) {\n _this.unbindListeners();\n var result;\n try {\n result = protocol_protocol.processHandshake(m);\n }\n catch (e) {\n _this.finish('error', { error: e });\n _this.transport.close();\n return;\n }\n if (result.action === 'connected') {\n _this.finish('connected', {\n connection: new connection_connection(result.id, _this.transport),\n activityTimeout: result.activityTimeout\n });\n }\n else {\n _this.finish(result.action, { error: result.error });\n _this.transport.close();\n }\n };\n this.onClosed = function (closeEvent) {\n _this.unbindListeners();\n var action = protocol_protocol.getCloseAction(closeEvent) || 'backoff';\n var error = protocol_protocol.getCloseError(closeEvent);\n _this.finish(action, { error: error });\n };\n this.transport.bind('message', this.onMessage);\n this.transport.bind('closed', this.onClosed);\n };\n Handshake.prototype.unbindListeners = function () {\n this.transport.unbind('message', this.onMessage);\n this.transport.unbind('closed', this.onClosed);\n };\n Handshake.prototype.finish = function (action, params) {\n this.callback(extend({ transport: this.transport, action: action }, params));\n };\n return Handshake;\n}());\n/* harmony default export */ var connection_handshake = (handshake_Handshake);\n\n// CONCATENATED MODULE: ./src/core/timeline/timeline_sender.ts\n\nvar timeline_sender_TimelineSender = (function () {\n function TimelineSender(timeline, options) {\n this.timeline = timeline;\n this.options = options || {};\n }\n TimelineSender.prototype.send = function (useTLS, callback) {\n if (this.timeline.isEmpty()) {\n return;\n }\n this.timeline.send(runtime.TimelineTransport.getAgent(this, useTLS), callback);\n };\n return TimelineSender;\n}());\n/* harmony default export */ var timeline_sender = (timeline_sender_TimelineSender);\n\n// CONCATENATED MODULE: ./src/core/channels/channel.ts\nvar channel_extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\n\n\n\n\n\nvar channel_Channel = (function (_super) {\n channel_extends(Channel, _super);\n function Channel(name, pusher) {\n var _this = _super.call(this, function (event, data) {\n logger.debug('No callbacks on ' + name + ' for ' + event);\n }) || this;\n _this.name = name;\n _this.pusher = pusher;\n _this.subscribed = false;\n _this.subscriptionPending = false;\n _this.subscriptionCancelled = false;\n return _this;\n }\n Channel.prototype.authorize = function (socketId, callback) {\n return callback(null, { auth: '' });\n };\n Channel.prototype.trigger = function (event, data) {\n if (event.indexOf('client-') !== 0) {\n throw new BadEventName(\"Event '\" + event + \"' does not start with 'client-'\");\n }\n if (!this.subscribed) {\n var suffix = url_store.buildLogSuffix('triggeringClientEvents');\n logger.warn(\"Client event triggered before channel 'subscription_succeeded' event . \" + suffix);\n }\n return this.pusher.send_event(event, data, this.name);\n };\n Channel.prototype.disconnect = function () {\n this.subscribed = false;\n this.subscriptionPending = false;\n };\n Channel.prototype.handleEvent = function (event) {\n var eventName = event.event;\n var data = event.data;\n if (eventName === 'pusher_internal:subscription_succeeded') {\n this.handleSubscriptionSucceededEvent(event);\n }\n else if (eventName === 'pusher_internal:subscription_count') {\n this.handleSubscriptionCountEvent(event);\n }\n else if (eventName.indexOf('pusher_internal:') !== 0) {\n var metadata = {};\n this.emit(eventName, data, metadata);\n }\n };\n Channel.prototype.handleSubscriptionSucceededEvent = function (event) {\n this.subscriptionPending = false;\n this.subscribed = true;\n if (this.subscriptionCancelled) {\n this.pusher.unsubscribe(this.name);\n }\n else {\n this.emit('pusher:subscription_succeeded', event.data);\n }\n };\n Channel.prototype.handleSubscriptionCountEvent = function (event) {\n if (event.data.subscription_count) {\n this.subscriptionCount = event.data.subscription_count;\n }\n this.emit('pusher:subscription_count', event.data);\n };\n Channel.prototype.subscribe = function () {\n var _this = this;\n if (this.subscribed) {\n return;\n }\n this.subscriptionPending = true;\n this.subscriptionCancelled = false;\n this.authorize(this.pusher.connection.socket_id, function (error, data) {\n if (error) {\n _this.subscriptionPending = false;\n logger.error(error.toString());\n _this.emit('pusher:subscription_error', Object.assign({}, {\n type: 'AuthError',\n error: error.message\n }, error instanceof HTTPAuthError ? { status: error.status } : {}));\n }\n else {\n _this.pusher.send_event('pusher:subscribe', {\n auth: data.auth,\n channel_data: data.channel_data,\n channel: _this.name\n });\n }\n });\n };\n Channel.prototype.unsubscribe = function () {\n this.subscribed = false;\n this.pusher.send_event('pusher:unsubscribe', {\n channel: this.name\n });\n };\n Channel.prototype.cancelSubscription = function () {\n this.subscriptionCancelled = true;\n };\n Channel.prototype.reinstateSubscription = function () {\n this.subscriptionCancelled = false;\n };\n return Channel;\n}(dispatcher));\n/* harmony default export */ var channels_channel = (channel_Channel);\n\n// CONCATENATED MODULE: ./src/core/channels/private_channel.ts\nvar private_channel_extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\n\nvar PrivateChannel = (function (_super) {\n private_channel_extends(PrivateChannel, _super);\n function PrivateChannel() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n PrivateChannel.prototype.authorize = function (socketId, callback) {\n return this.pusher.config.channelAuthorizer({\n channelName: this.name,\n socketId: socketId\n }, callback);\n };\n return PrivateChannel;\n}(channels_channel));\n/* harmony default export */ var private_channel = (PrivateChannel);\n\n// CONCATENATED MODULE: ./src/core/channels/members.ts\n\nvar members_Members = (function () {\n function Members() {\n this.reset();\n }\n Members.prototype.get = function (id) {\n if (Object.prototype.hasOwnProperty.call(this.members, id)) {\n return {\n id: id,\n info: this.members[id]\n };\n }\n else {\n return null;\n }\n };\n Members.prototype.each = function (callback) {\n var _this = this;\n objectApply(this.members, function (member, id) {\n callback(_this.get(id));\n });\n };\n Members.prototype.setMyID = function (id) {\n this.myID = id;\n };\n Members.prototype.onSubscription = function (subscriptionData) {\n this.members = subscriptionData.presence.hash;\n this.count = subscriptionData.presence.count;\n this.me = this.get(this.myID);\n };\n Members.prototype.addMember = function (memberData) {\n if (this.get(memberData.user_id) === null) {\n this.count++;\n }\n this.members[memberData.user_id] = memberData.user_info;\n return this.get(memberData.user_id);\n };\n Members.prototype.removeMember = function (memberData) {\n var member = this.get(memberData.user_id);\n if (member) {\n delete this.members[memberData.user_id];\n this.count--;\n }\n return member;\n };\n Members.prototype.reset = function () {\n this.members = {};\n this.count = 0;\n this.myID = null;\n this.me = null;\n };\n return Members;\n}());\n/* harmony default export */ var members = (members_Members);\n\n// CONCATENATED MODULE: ./src/core/channels/presence_channel.ts\nvar presence_channel_extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nvar __generator = (undefined && undefined.__generator) || function (thisArg, body) {\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\n function verb(n) { return function (v) { return step([n, v]); }; }\n function step(op) {\n if (f) throw new TypeError(\"Generator is already executing.\");\n while (_) try {\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n if (y = 0, t) op = [op[0] & 2, t.value];\n switch (op[0]) {\n case 0: case 1: t = op; break;\n case 4: _.label++; return { value: op[1], done: false };\n case 5: _.label++; y = op[1]; op = [0]; continue;\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\n default:\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\n if (t[2]) _.ops.pop();\n _.trys.pop(); continue;\n }\n op = body.call(thisArg, _);\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\n }\n};\n\n\n\n\nvar presence_channel_PresenceChannel = (function (_super) {\n presence_channel_extends(PresenceChannel, _super);\n function PresenceChannel(name, pusher) {\n var _this = _super.call(this, name, pusher) || this;\n _this.members = new members();\n return _this;\n }\n PresenceChannel.prototype.authorize = function (socketId, callback) {\n var _this = this;\n _super.prototype.authorize.call(this, socketId, function (error, authData) { return __awaiter(_this, void 0, void 0, function () {\n var channelData, suffix;\n return __generator(this, function (_a) {\n switch (_a.label) {\n case 0:\n if (!!error) return [3, 3];\n authData = authData;\n if (!(authData.channel_data != null)) return [3, 1];\n channelData = JSON.parse(authData.channel_data);\n this.members.setMyID(channelData.user_id);\n return [3, 3];\n case 1: return [4, this.pusher.user.signinDonePromise];\n case 2:\n _a.sent();\n if (this.pusher.user.user_data != null) {\n this.members.setMyID(this.pusher.user.user_data.id);\n }\n else {\n suffix = url_store.buildLogSuffix('authorizationEndpoint');\n logger.error(\"Invalid auth response for channel '\" + this.name + \"', \" +\n (\"expected 'channel_data' field. \" + suffix + \", \") +\n \"or the user should be signed in.\");\n callback('Invalid auth response');\n return [2];\n }\n _a.label = 3;\n case 3:\n callback(error, authData);\n return [2];\n }\n });\n }); });\n };\n PresenceChannel.prototype.handleEvent = function (event) {\n var eventName = event.event;\n if (eventName.indexOf('pusher_internal:') === 0) {\n this.handleInternalEvent(event);\n }\n else {\n var data = event.data;\n var metadata = {};\n if (event.user_id) {\n metadata.user_id = event.user_id;\n }\n this.emit(eventName, data, metadata);\n }\n };\n PresenceChannel.prototype.handleInternalEvent = function (event) {\n var eventName = event.event;\n var data = event.data;\n switch (eventName) {\n case 'pusher_internal:subscription_succeeded':\n this.handleSubscriptionSucceededEvent(event);\n break;\n case 'pusher_internal:subscription_count':\n this.handleSubscriptionCountEvent(event);\n break;\n case 'pusher_internal:member_added':\n var addedMember = this.members.addMember(data);\n this.emit('pusher:member_added', addedMember);\n break;\n case 'pusher_internal:member_removed':\n var removedMember = this.members.removeMember(data);\n if (removedMember) {\n this.emit('pusher:member_removed', removedMember);\n }\n break;\n }\n };\n PresenceChannel.prototype.handleSubscriptionSucceededEvent = function (event) {\n this.subscriptionPending = false;\n this.subscribed = true;\n if (this.subscriptionCancelled) {\n this.pusher.unsubscribe(this.name);\n }\n else {\n this.members.onSubscription(event.data);\n this.emit('pusher:subscription_succeeded', this.members);\n }\n };\n PresenceChannel.prototype.disconnect = function () {\n this.members.reset();\n _super.prototype.disconnect.call(this);\n };\n return PresenceChannel;\n}(private_channel));\n/* harmony default export */ var presence_channel = (presence_channel_PresenceChannel);\n\n// EXTERNAL MODULE: ./node_modules/@stablelib/utf8/lib/utf8.js\nvar utf8 = __webpack_require__(1);\n\n// EXTERNAL MODULE: ./node_modules/@stablelib/base64/lib/base64.js\nvar base64 = __webpack_require__(0);\n\n// CONCATENATED MODULE: ./src/core/channels/encrypted_channel.ts\nvar encrypted_channel_extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\n\n\n\n\n\nvar encrypted_channel_EncryptedChannel = (function (_super) {\n encrypted_channel_extends(EncryptedChannel, _super);\n function EncryptedChannel(name, pusher, nacl) {\n var _this = _super.call(this, name, pusher) || this;\n _this.key = null;\n _this.nacl = nacl;\n return _this;\n }\n EncryptedChannel.prototype.authorize = function (socketId, callback) {\n var _this = this;\n _super.prototype.authorize.call(this, socketId, function (error, authData) {\n if (error) {\n callback(error, authData);\n return;\n }\n var sharedSecret = authData['shared_secret'];\n if (!sharedSecret) {\n callback(new Error(\"No shared_secret key in auth payload for encrypted channel: \" + _this.name), null);\n return;\n }\n _this.key = Object(base64[\"decode\"])(sharedSecret);\n delete authData['shared_secret'];\n callback(null, authData);\n });\n };\n EncryptedChannel.prototype.trigger = function (event, data) {\n throw new UnsupportedFeature('Client events are not currently supported for encrypted channels');\n };\n EncryptedChannel.prototype.handleEvent = function (event) {\n var eventName = event.event;\n var data = event.data;\n if (eventName.indexOf('pusher_internal:') === 0 ||\n eventName.indexOf('pusher:') === 0) {\n _super.prototype.handleEvent.call(this, event);\n return;\n }\n this.handleEncryptedEvent(eventName, data);\n };\n EncryptedChannel.prototype.handleEncryptedEvent = function (event, data) {\n var _this = this;\n if (!this.key) {\n logger.debug('Received encrypted event before key has been retrieved from the authEndpoint');\n return;\n }\n if (!data.ciphertext || !data.nonce) {\n logger.error('Unexpected format for encrypted event, expected object with `ciphertext` and `nonce` fields, got: ' +\n data);\n return;\n }\n var cipherText = Object(base64[\"decode\"])(data.ciphertext);\n if (cipherText.length < this.nacl.secretbox.overheadLength) {\n logger.error(\"Expected encrypted event ciphertext length to be \" + this.nacl.secretbox.overheadLength + \", got: \" + cipherText.length);\n return;\n }\n var nonce = Object(base64[\"decode\"])(data.nonce);\n if (nonce.length < this.nacl.secretbox.nonceLength) {\n logger.error(\"Expected encrypted event nonce length to be \" + this.nacl.secretbox.nonceLength + \", got: \" + nonce.length);\n return;\n }\n var bytes = this.nacl.secretbox.open(cipherText, nonce, this.key);\n if (bytes === null) {\n logger.debug('Failed to decrypt an event, probably because it was encrypted with a different key. Fetching a new key from the authEndpoint...');\n this.authorize(this.pusher.connection.socket_id, function (error, authData) {\n if (error) {\n logger.error(\"Failed to make a request to the authEndpoint: \" + authData + \". Unable to fetch new key, so dropping encrypted event\");\n return;\n }\n bytes = _this.nacl.secretbox.open(cipherText, nonce, _this.key);\n if (bytes === null) {\n logger.error(\"Failed to decrypt event with new key. Dropping encrypted event\");\n return;\n }\n _this.emit(event, _this.getDataToEmit(bytes));\n return;\n });\n return;\n }\n this.emit(event, this.getDataToEmit(bytes));\n };\n EncryptedChannel.prototype.getDataToEmit = function (bytes) {\n var raw = Object(utf8[\"decode\"])(bytes);\n try {\n return JSON.parse(raw);\n }\n catch (_a) {\n return raw;\n }\n };\n return EncryptedChannel;\n}(private_channel));\n/* harmony default export */ var encrypted_channel = (encrypted_channel_EncryptedChannel);\n\n// CONCATENATED MODULE: ./src/core/connection/connection_manager.ts\nvar connection_manager_extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\n\n\n\n\n\nvar connection_manager_ConnectionManager = (function (_super) {\n connection_manager_extends(ConnectionManager, _super);\n function ConnectionManager(key, options) {\n var _this = _super.call(this) || this;\n _this.state = 'initialized';\n _this.connection = null;\n _this.key = key;\n _this.options = options;\n _this.timeline = _this.options.timeline;\n _this.usingTLS = _this.options.useTLS;\n _this.errorCallbacks = _this.buildErrorCallbacks();\n _this.connectionCallbacks = _this.buildConnectionCallbacks(_this.errorCallbacks);\n _this.handshakeCallbacks = _this.buildHandshakeCallbacks(_this.errorCallbacks);\n var Network = runtime.getNetwork();\n Network.bind('online', function () {\n _this.timeline.info({ netinfo: 'online' });\n if (_this.state === 'connecting' || _this.state === 'unavailable') {\n _this.retryIn(0);\n }\n });\n Network.bind('offline', function () {\n _this.timeline.info({ netinfo: 'offline' });\n if (_this.connection) {\n _this.sendActivityCheck();\n }\n });\n _this.updateStrategy();\n return _this;\n }\n ConnectionManager.prototype.connect = function () {\n if (this.connection || this.runner) {\n return;\n }\n if (!this.strategy.isSupported()) {\n this.updateState('failed');\n return;\n }\n this.updateState('connecting');\n this.startConnecting();\n this.setUnavailableTimer();\n };\n ConnectionManager.prototype.send = function (data) {\n if (this.connection) {\n return this.connection.send(data);\n }\n else {\n return false;\n }\n };\n ConnectionManager.prototype.send_event = function (name, data, channel) {\n if (this.connection) {\n return this.connection.send_event(name, data, channel);\n }\n else {\n return false;\n }\n };\n ConnectionManager.prototype.disconnect = function () {\n this.disconnectInternally();\n this.updateState('disconnected');\n };\n ConnectionManager.prototype.isUsingTLS = function () {\n return this.usingTLS;\n };\n ConnectionManager.prototype.startConnecting = function () {\n var _this = this;\n var callback = function (error, handshake) {\n if (error) {\n _this.runner = _this.strategy.connect(0, callback);\n }\n else {\n if (handshake.action === 'error') {\n _this.emit('error', {\n type: 'HandshakeError',\n error: handshake.error\n });\n _this.timeline.error({ handshakeError: handshake.error });\n }\n else {\n _this.abortConnecting();\n _this.handshakeCallbacks[handshake.action](handshake);\n }\n }\n };\n this.runner = this.strategy.connect(0, callback);\n };\n ConnectionManager.prototype.abortConnecting = function () {\n if (this.runner) {\n this.runner.abort();\n this.runner = null;\n }\n };\n ConnectionManager.prototype.disconnectInternally = function () {\n this.abortConnecting();\n this.clearRetryTimer();\n this.clearUnavailableTimer();\n if (this.connection) {\n var connection = this.abandonConnection();\n connection.close();\n }\n };\n ConnectionManager.prototype.updateStrategy = function () {\n this.strategy = this.options.getStrategy({\n key: this.key,\n timeline: this.timeline,\n useTLS: this.usingTLS\n });\n };\n ConnectionManager.prototype.retryIn = function (delay) {\n var _this = this;\n this.timeline.info({ action: 'retry', delay: delay });\n if (delay > 0) {\n this.emit('connecting_in', Math.round(delay / 1000));\n }\n this.retryTimer = new OneOffTimer(delay || 0, function () {\n _this.disconnectInternally();\n _this.connect();\n });\n };\n ConnectionManager.prototype.clearRetryTimer = function () {\n if (this.retryTimer) {\n this.retryTimer.ensureAborted();\n this.retryTimer = null;\n }\n };\n ConnectionManager.prototype.setUnavailableTimer = function () {\n var _this = this;\n this.unavailableTimer = new OneOffTimer(this.options.unavailableTimeout, function () {\n _this.updateState('unavailable');\n });\n };\n ConnectionManager.prototype.clearUnavailableTimer = function () {\n if (this.unavailableTimer) {\n this.unavailableTimer.ensureAborted();\n }\n };\n ConnectionManager.prototype.sendActivityCheck = function () {\n var _this = this;\n this.stopActivityCheck();\n this.connection.ping();\n this.activityTimer = new OneOffTimer(this.options.pongTimeout, function () {\n _this.timeline.error({ pong_timed_out: _this.options.pongTimeout });\n _this.retryIn(0);\n });\n };\n ConnectionManager.prototype.resetActivityCheck = function () {\n var _this = this;\n this.stopActivityCheck();\n if (this.connection && !this.connection.handlesActivityChecks()) {\n this.activityTimer = new OneOffTimer(this.activityTimeout, function () {\n _this.sendActivityCheck();\n });\n }\n };\n ConnectionManager.prototype.stopActivityCheck = function () {\n if (this.activityTimer) {\n this.activityTimer.ensureAborted();\n }\n };\n ConnectionManager.prototype.buildConnectionCallbacks = function (errorCallbacks) {\n var _this = this;\n return extend({}, errorCallbacks, {\n message: function (message) {\n _this.resetActivityCheck();\n _this.emit('message', message);\n },\n ping: function () {\n _this.send_event('pusher:pong', {});\n },\n activity: function () {\n _this.resetActivityCheck();\n },\n error: function (error) {\n _this.emit('error', error);\n },\n closed: function () {\n _this.abandonConnection();\n if (_this.shouldRetry()) {\n _this.retryIn(1000);\n }\n }\n });\n };\n ConnectionManager.prototype.buildHandshakeCallbacks = function (errorCallbacks) {\n var _this = this;\n return extend({}, errorCallbacks, {\n connected: function (handshake) {\n _this.activityTimeout = Math.min(_this.options.activityTimeout, handshake.activityTimeout, handshake.connection.activityTimeout || Infinity);\n _this.clearUnavailableTimer();\n _this.setConnection(handshake.connection);\n _this.socket_id = _this.connection.id;\n _this.updateState('connected', { socket_id: _this.socket_id });\n }\n });\n };\n ConnectionManager.prototype.buildErrorCallbacks = function () {\n var _this = this;\n var withErrorEmitted = function (callback) {\n return function (result) {\n if (result.error) {\n _this.emit('error', { type: 'WebSocketError', error: result.error });\n }\n callback(result);\n };\n };\n return {\n tls_only: withErrorEmitted(function () {\n _this.usingTLS = true;\n _this.updateStrategy();\n _this.retryIn(0);\n }),\n refused: withErrorEmitted(function () {\n _this.disconnect();\n }),\n backoff: withErrorEmitted(function () {\n _this.retryIn(1000);\n }),\n retry: withErrorEmitted(function () {\n _this.retryIn(0);\n })\n };\n };\n ConnectionManager.prototype.setConnection = function (connection) {\n this.connection = connection;\n for (var event in this.connectionCallbacks) {\n this.connection.bind(event, this.connectionCallbacks[event]);\n }\n this.resetActivityCheck();\n };\n ConnectionManager.prototype.abandonConnection = function () {\n if (!this.connection) {\n return;\n }\n this.stopActivityCheck();\n for (var event in this.connectionCallbacks) {\n this.connection.unbind(event, this.connectionCallbacks[event]);\n }\n var connection = this.connection;\n this.connection = null;\n return connection;\n };\n ConnectionManager.prototype.updateState = function (newState, data) {\n var previousState = this.state;\n this.state = newState;\n if (previousState !== newState) {\n var newStateDescription = newState;\n if (newStateDescription === 'connected') {\n newStateDescription += ' with new socket ID ' + data.socket_id;\n }\n logger.debug('State changed', previousState + ' -> ' + newStateDescription);\n this.timeline.info({ state: newState, params: data });\n this.emit('state_change', { previous: previousState, current: newState });\n this.emit(newState, data);\n }\n };\n ConnectionManager.prototype.shouldRetry = function () {\n return this.state === 'connecting' || this.state === 'connected';\n };\n return ConnectionManager;\n}(dispatcher));\n/* harmony default export */ var connection_manager = (connection_manager_ConnectionManager);\n\n// CONCATENATED MODULE: ./src/core/channels/channels.ts\n\n\n\n\nvar channels_Channels = (function () {\n function Channels() {\n this.channels = {};\n }\n Channels.prototype.add = function (name, pusher) {\n if (!this.channels[name]) {\n this.channels[name] = createChannel(name, pusher);\n }\n return this.channels[name];\n };\n Channels.prototype.all = function () {\n return values(this.channels);\n };\n Channels.prototype.find = function (name) {\n return this.channels[name];\n };\n Channels.prototype.remove = function (name) {\n var channel = this.channels[name];\n delete this.channels[name];\n return channel;\n };\n Channels.prototype.disconnect = function () {\n objectApply(this.channels, function (channel) {\n channel.disconnect();\n });\n };\n return Channels;\n}());\n/* harmony default export */ var channels = (channels_Channels);\nfunction createChannel(name, pusher) {\n if (name.indexOf('private-encrypted-') === 0) {\n if (pusher.config.nacl) {\n return factory.createEncryptedChannel(name, pusher, pusher.config.nacl);\n }\n var errMsg = 'Tried to subscribe to a private-encrypted- channel but no nacl implementation available';\n var suffix = url_store.buildLogSuffix('encryptedChannelSupport');\n throw new UnsupportedFeature(errMsg + \". \" + suffix);\n }\n else if (name.indexOf('private-') === 0) {\n return factory.createPrivateChannel(name, pusher);\n }\n else if (name.indexOf('presence-') === 0) {\n return factory.createPresenceChannel(name, pusher);\n }\n else if (name.indexOf('#') === 0) {\n throw new BadChannelName('Cannot create a channel with name \"' + name + '\".');\n }\n else {\n return factory.createChannel(name, pusher);\n }\n}\n\n// CONCATENATED MODULE: ./src/core/utils/factory.ts\n\n\n\n\n\n\n\n\n\nvar Factory = {\n createChannels: function () {\n return new channels();\n },\n createConnectionManager: function (key, options) {\n return new connection_manager(key, options);\n },\n createChannel: function (name, pusher) {\n return new channels_channel(name, pusher);\n },\n createPrivateChannel: function (name, pusher) {\n return new private_channel(name, pusher);\n },\n createPresenceChannel: function (name, pusher) {\n return new presence_channel(name, pusher);\n },\n createEncryptedChannel: function (name, pusher, nacl) {\n return new encrypted_channel(name, pusher, nacl);\n },\n createTimelineSender: function (timeline, options) {\n return new timeline_sender(timeline, options);\n },\n createHandshake: function (transport, callback) {\n return new connection_handshake(transport, callback);\n },\n createAssistantToTheTransportManager: function (manager, transport, options) {\n return new assistant_to_the_transport_manager(manager, transport, options);\n }\n};\n/* harmony default export */ var factory = (Factory);\n\n// CONCATENATED MODULE: ./src/core/transports/transport_manager.ts\n\nvar transport_manager_TransportManager = (function () {\n function TransportManager(options) {\n this.options = options || {};\n this.livesLeft = this.options.lives || Infinity;\n }\n TransportManager.prototype.getAssistant = function (transport) {\n return factory.createAssistantToTheTransportManager(this, transport, {\n minPingDelay: this.options.minPingDelay,\n maxPingDelay: this.options.maxPingDelay\n });\n };\n TransportManager.prototype.isAlive = function () {\n return this.livesLeft > 0;\n };\n TransportManager.prototype.reportDeath = function () {\n this.livesLeft -= 1;\n };\n return TransportManager;\n}());\n/* harmony default export */ var transport_manager = (transport_manager_TransportManager);\n\n// CONCATENATED MODULE: ./src/core/strategies/sequential_strategy.ts\n\n\n\nvar sequential_strategy_SequentialStrategy = (function () {\n function SequentialStrategy(strategies, options) {\n this.strategies = strategies;\n this.loop = Boolean(options.loop);\n this.failFast = Boolean(options.failFast);\n this.timeout = options.timeout;\n this.timeoutLimit = options.timeoutLimit;\n }\n SequentialStrategy.prototype.isSupported = function () {\n return any(this.strategies, util.method('isSupported'));\n };\n SequentialStrategy.prototype.connect = function (minPriority, callback) {\n var _this = this;\n var strategies = this.strategies;\n var current = 0;\n var timeout = this.timeout;\n var runner = null;\n var tryNextStrategy = function (error, handshake) {\n if (handshake) {\n callback(null, handshake);\n }\n else {\n current = current + 1;\n if (_this.loop) {\n current = current % strategies.length;\n }\n if (current < strategies.length) {\n if (timeout) {\n timeout = timeout * 2;\n if (_this.timeoutLimit) {\n timeout = Math.min(timeout, _this.timeoutLimit);\n }\n }\n runner = _this.tryStrategy(strategies[current], minPriority, { timeout: timeout, failFast: _this.failFast }, tryNextStrategy);\n }\n else {\n callback(true);\n }\n }\n };\n runner = this.tryStrategy(strategies[current], minPriority, { timeout: timeout, failFast: this.failFast }, tryNextStrategy);\n return {\n abort: function () {\n runner.abort();\n },\n forceMinPriority: function (p) {\n minPriority = p;\n if (runner) {\n runner.forceMinPriority(p);\n }\n }\n };\n };\n SequentialStrategy.prototype.tryStrategy = function (strategy, minPriority, options, callback) {\n var timer = null;\n var runner = null;\n if (options.timeout > 0) {\n timer = new OneOffTimer(options.timeout, function () {\n runner.abort();\n callback(true);\n });\n }\n runner = strategy.connect(minPriority, function (error, handshake) {\n if (error && timer && timer.isRunning() && !options.failFast) {\n return;\n }\n if (timer) {\n timer.ensureAborted();\n }\n callback(error, handshake);\n });\n return {\n abort: function () {\n if (timer) {\n timer.ensureAborted();\n }\n runner.abort();\n },\n forceMinPriority: function (p) {\n runner.forceMinPriority(p);\n }\n };\n };\n return SequentialStrategy;\n}());\n/* harmony default export */ var sequential_strategy = (sequential_strategy_SequentialStrategy);\n\n// CONCATENATED MODULE: ./src/core/strategies/best_connected_ever_strategy.ts\n\n\nvar best_connected_ever_strategy_BestConnectedEverStrategy = (function () {\n function BestConnectedEverStrategy(strategies) {\n this.strategies = strategies;\n }\n BestConnectedEverStrategy.prototype.isSupported = function () {\n return any(this.strategies, util.method('isSupported'));\n };\n BestConnectedEverStrategy.prototype.connect = function (minPriority, callback) {\n return connect(this.strategies, minPriority, function (i, runners) {\n return function (error, handshake) {\n runners[i].error = error;\n if (error) {\n if (allRunnersFailed(runners)) {\n callback(true);\n }\n return;\n }\n apply(runners, function (runner) {\n runner.forceMinPriority(handshake.transport.priority);\n });\n callback(null, handshake);\n };\n });\n };\n return BestConnectedEverStrategy;\n}());\n/* harmony default export */ var best_connected_ever_strategy = (best_connected_ever_strategy_BestConnectedEverStrategy);\nfunction connect(strategies, minPriority, callbackBuilder) {\n var runners = map(strategies, function (strategy, i, _, rs) {\n return strategy.connect(minPriority, callbackBuilder(i, rs));\n });\n return {\n abort: function () {\n apply(runners, abortRunner);\n },\n forceMinPriority: function (p) {\n apply(runners, function (runner) {\n runner.forceMinPriority(p);\n });\n }\n };\n}\nfunction allRunnersFailed(runners) {\n return collections_all(runners, function (runner) {\n return Boolean(runner.error);\n });\n}\nfunction abortRunner(runner) {\n if (!runner.error && !runner.aborted) {\n runner.abort();\n runner.aborted = true;\n }\n}\n\n// CONCATENATED MODULE: ./src/core/strategies/cached_strategy.ts\n\n\n\n\nvar cached_strategy_CachedStrategy = (function () {\n function CachedStrategy(strategy, transports, options) {\n this.strategy = strategy;\n this.transports = transports;\n this.ttl = options.ttl || 1800 * 1000;\n this.usingTLS = options.useTLS;\n this.timeline = options.timeline;\n }\n CachedStrategy.prototype.isSupported = function () {\n return this.strategy.isSupported();\n };\n CachedStrategy.prototype.connect = function (minPriority, callback) {\n var usingTLS = this.usingTLS;\n var info = fetchTransportCache(usingTLS);\n var strategies = [this.strategy];\n if (info && info.timestamp + this.ttl >= util.now()) {\n var transport = this.transports[info.transport];\n if (transport) {\n this.timeline.info({\n cached: true,\n transport: info.transport,\n latency: info.latency\n });\n strategies.push(new sequential_strategy([transport], {\n timeout: info.latency * 2 + 1000,\n failFast: true\n }));\n }\n }\n var startTimestamp = util.now();\n var runner = strategies\n .pop()\n .connect(minPriority, function cb(error, handshake) {\n if (error) {\n flushTransportCache(usingTLS);\n if (strategies.length > 0) {\n startTimestamp = util.now();\n runner = strategies.pop().connect(minPriority, cb);\n }\n else {\n callback(error);\n }\n }\n else {\n storeTransportCache(usingTLS, handshake.transport.name, util.now() - startTimestamp);\n callback(null, handshake);\n }\n });\n return {\n abort: function () {\n runner.abort();\n },\n forceMinPriority: function (p) {\n minPriority = p;\n if (runner) {\n runner.forceMinPriority(p);\n }\n }\n };\n };\n return CachedStrategy;\n}());\n/* harmony default export */ var cached_strategy = (cached_strategy_CachedStrategy);\nfunction getTransportCacheKey(usingTLS) {\n return 'pusherTransport' + (usingTLS ? 'TLS' : 'NonTLS');\n}\nfunction fetchTransportCache(usingTLS) {\n var storage = runtime.getLocalStorage();\n if (storage) {\n try {\n var serializedCache = storage[getTransportCacheKey(usingTLS)];\n if (serializedCache) {\n return JSON.parse(serializedCache);\n }\n }\n catch (e) {\n flushTransportCache(usingTLS);\n }\n }\n return null;\n}\nfunction storeTransportCache(usingTLS, transport, latency) {\n var storage = runtime.getLocalStorage();\n if (storage) {\n try {\n storage[getTransportCacheKey(usingTLS)] = safeJSONStringify({\n timestamp: util.now(),\n transport: transport,\n latency: latency\n });\n }\n catch (e) {\n }\n }\n}\nfunction flushTransportCache(usingTLS) {\n var storage = runtime.getLocalStorage();\n if (storage) {\n try {\n delete storage[getTransportCacheKey(usingTLS)];\n }\n catch (e) {\n }\n }\n}\n\n// CONCATENATED MODULE: ./src/core/strategies/delayed_strategy.ts\n\nvar delayed_strategy_DelayedStrategy = (function () {\n function DelayedStrategy(strategy, _a) {\n var number = _a.delay;\n this.strategy = strategy;\n this.options = { delay: number };\n }\n DelayedStrategy.prototype.isSupported = function () {\n return this.strategy.isSupported();\n };\n DelayedStrategy.prototype.connect = function (minPriority, callback) {\n var strategy = this.strategy;\n var runner;\n var timer = new OneOffTimer(this.options.delay, function () {\n runner = strategy.connect(minPriority, callback);\n });\n return {\n abort: function () {\n timer.ensureAborted();\n if (runner) {\n runner.abort();\n }\n },\n forceMinPriority: function (p) {\n minPriority = p;\n if (runner) {\n runner.forceMinPriority(p);\n }\n }\n };\n };\n return DelayedStrategy;\n}());\n/* harmony default export */ var delayed_strategy = (delayed_strategy_DelayedStrategy);\n\n// CONCATENATED MODULE: ./src/core/strategies/if_strategy.ts\nvar IfStrategy = (function () {\n function IfStrategy(test, trueBranch, falseBranch) {\n this.test = test;\n this.trueBranch = trueBranch;\n this.falseBranch = falseBranch;\n }\n IfStrategy.prototype.isSupported = function () {\n var branch = this.test() ? this.trueBranch : this.falseBranch;\n return branch.isSupported();\n };\n IfStrategy.prototype.connect = function (minPriority, callback) {\n var branch = this.test() ? this.trueBranch : this.falseBranch;\n return branch.connect(minPriority, callback);\n };\n return IfStrategy;\n}());\n/* harmony default export */ var if_strategy = (IfStrategy);\n\n// CONCATENATED MODULE: ./src/core/strategies/first_connected_strategy.ts\nvar FirstConnectedStrategy = (function () {\n function FirstConnectedStrategy(strategy) {\n this.strategy = strategy;\n }\n FirstConnectedStrategy.prototype.isSupported = function () {\n return this.strategy.isSupported();\n };\n FirstConnectedStrategy.prototype.connect = function (minPriority, callback) {\n var runner = this.strategy.connect(minPriority, function (error, handshake) {\n if (handshake) {\n runner.abort();\n }\n callback(error, handshake);\n });\n return runner;\n };\n return FirstConnectedStrategy;\n}());\n/* harmony default export */ var first_connected_strategy = (FirstConnectedStrategy);\n\n// CONCATENATED MODULE: ./src/runtimes/web/default_strategy.ts\n\n\n\n\n\n\n\nfunction testSupportsStrategy(strategy) {\n return function () {\n return strategy.isSupported();\n };\n}\nvar getDefaultStrategy = function (config, baseOptions, defineTransport) {\n var definedTransports = {};\n function defineTransportStrategy(name, type, priority, options, manager) {\n var transport = defineTransport(config, name, type, priority, options, manager);\n definedTransports[name] = transport;\n return transport;\n }\n var ws_options = Object.assign({}, baseOptions, {\n hostNonTLS: config.wsHost + ':' + config.wsPort,\n hostTLS: config.wsHost + ':' + config.wssPort,\n httpPath: config.wsPath\n });\n var wss_options = Object.assign({}, ws_options, {\n useTLS: true\n });\n var sockjs_options = Object.assign({}, baseOptions, {\n hostNonTLS: config.httpHost + ':' + config.httpPort,\n hostTLS: config.httpHost + ':' + config.httpsPort,\n httpPath: config.httpPath\n });\n var timeouts = {\n loop: true,\n timeout: 15000,\n timeoutLimit: 60000\n };\n var ws_manager = new transport_manager({\n lives: 2,\n minPingDelay: 10000,\n maxPingDelay: config.activityTimeout\n });\n var streaming_manager = new transport_manager({\n lives: 2,\n minPingDelay: 10000,\n maxPingDelay: config.activityTimeout\n });\n var ws_transport = defineTransportStrategy('ws', 'ws', 3, ws_options, ws_manager);\n var wss_transport = defineTransportStrategy('wss', 'ws', 3, wss_options, ws_manager);\n var sockjs_transport = defineTransportStrategy('sockjs', 'sockjs', 1, sockjs_options);\n var xhr_streaming_transport = defineTransportStrategy('xhr_streaming', 'xhr_streaming', 1, sockjs_options, streaming_manager);\n var xdr_streaming_transport = defineTransportStrategy('xdr_streaming', 'xdr_streaming', 1, sockjs_options, streaming_manager);\n var xhr_polling_transport = defineTransportStrategy('xhr_polling', 'xhr_polling', 1, sockjs_options);\n var xdr_polling_transport = defineTransportStrategy('xdr_polling', 'xdr_polling', 1, sockjs_options);\n var ws_loop = new sequential_strategy([ws_transport], timeouts);\n var wss_loop = new sequential_strategy([wss_transport], timeouts);\n var sockjs_loop = new sequential_strategy([sockjs_transport], timeouts);\n var streaming_loop = new sequential_strategy([\n new if_strategy(testSupportsStrategy(xhr_streaming_transport), xhr_streaming_transport, xdr_streaming_transport)\n ], timeouts);\n var polling_loop = new sequential_strategy([\n new if_strategy(testSupportsStrategy(xhr_polling_transport), xhr_polling_transport, xdr_polling_transport)\n ], timeouts);\n var http_loop = new sequential_strategy([\n new if_strategy(testSupportsStrategy(streaming_loop), new best_connected_ever_strategy([\n streaming_loop,\n new delayed_strategy(polling_loop, { delay: 4000 })\n ]), polling_loop)\n ], timeouts);\n var http_fallback_loop = new if_strategy(testSupportsStrategy(http_loop), http_loop, sockjs_loop);\n var wsStrategy;\n if (baseOptions.useTLS) {\n wsStrategy = new best_connected_ever_strategy([\n ws_loop,\n new delayed_strategy(http_fallback_loop, { delay: 2000 })\n ]);\n }\n else {\n wsStrategy = new best_connected_ever_strategy([\n ws_loop,\n new delayed_strategy(wss_loop, { delay: 2000 }),\n new delayed_strategy(http_fallback_loop, { delay: 5000 })\n ]);\n }\n return new cached_strategy(new first_connected_strategy(new if_strategy(testSupportsStrategy(ws_transport), wsStrategy, http_fallback_loop)), definedTransports, {\n ttl: 1800000,\n timeline: baseOptions.timeline,\n useTLS: baseOptions.useTLS\n });\n};\n/* harmony default export */ var default_strategy = (getDefaultStrategy);\n\n// CONCATENATED MODULE: ./src/runtimes/web/transports/transport_connection_initializer.ts\n\n/* harmony default export */ var transport_connection_initializer = (function () {\n var self = this;\n self.timeline.info(self.buildTimelineMessage({\n transport: self.name + (self.options.useTLS ? 's' : '')\n }));\n if (self.hooks.isInitialized()) {\n self.changeState('initialized');\n }\n else if (self.hooks.file) {\n self.changeState('initializing');\n Dependencies.load(self.hooks.file, { useTLS: self.options.useTLS }, function (error, callback) {\n if (self.hooks.isInitialized()) {\n self.changeState('initialized');\n callback(true);\n }\n else {\n if (error) {\n self.onError(error);\n }\n self.onClose();\n callback(false);\n }\n });\n }\n else {\n self.onClose();\n }\n});\n\n// CONCATENATED MODULE: ./src/runtimes/web/http/http_xdomain_request.ts\n\nvar http_xdomain_request_hooks = {\n getRequest: function (socket) {\n var xdr = new window.XDomainRequest();\n xdr.ontimeout = function () {\n socket.emit('error', new RequestTimedOut());\n socket.close();\n };\n xdr.onerror = function (e) {\n socket.emit('error', e);\n socket.close();\n };\n xdr.onprogress = function () {\n if (xdr.responseText && xdr.responseText.length > 0) {\n socket.onChunk(200, xdr.responseText);\n }\n };\n xdr.onload = function () {\n if (xdr.responseText && xdr.responseText.length > 0) {\n socket.onChunk(200, xdr.responseText);\n }\n socket.emit('finished', 200);\n socket.close();\n };\n return xdr;\n },\n abortRequest: function (xdr) {\n xdr.ontimeout = xdr.onerror = xdr.onprogress = xdr.onload = null;\n xdr.abort();\n }\n};\n/* harmony default export */ var http_xdomain_request = (http_xdomain_request_hooks);\n\n// CONCATENATED MODULE: ./src/core/http/http_request.ts\nvar http_request_extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\n\n\nvar MAX_BUFFER_LENGTH = 256 * 1024;\nvar http_request_HTTPRequest = (function (_super) {\n http_request_extends(HTTPRequest, _super);\n function HTTPRequest(hooks, method, url) {\n var _this = _super.call(this) || this;\n _this.hooks = hooks;\n _this.method = method;\n _this.url = url;\n return _this;\n }\n HTTPRequest.prototype.start = function (payload) {\n var _this = this;\n this.position = 0;\n this.xhr = this.hooks.getRequest(this);\n this.unloader = function () {\n _this.close();\n };\n runtime.addUnloadListener(this.unloader);\n this.xhr.open(this.method, this.url, true);\n if (this.xhr.setRequestHeader) {\n this.xhr.setRequestHeader('Content-Type', 'application/json');\n }\n this.xhr.send(payload);\n };\n HTTPRequest.prototype.close = function () {\n if (this.unloader) {\n runtime.removeUnloadListener(this.unloader);\n this.unloader = null;\n }\n if (this.xhr) {\n this.hooks.abortRequest(this.xhr);\n this.xhr = null;\n }\n };\n HTTPRequest.prototype.onChunk = function (status, data) {\n while (true) {\n var chunk = this.advanceBuffer(data);\n if (chunk) {\n this.emit('chunk', { status: status, data: chunk });\n }\n else {\n break;\n }\n }\n if (this.isBufferTooLong(data)) {\n this.emit('buffer_too_long');\n }\n };\n HTTPRequest.prototype.advanceBuffer = function (buffer) {\n var unreadData = buffer.slice(this.position);\n var endOfLinePosition = unreadData.indexOf('\\n');\n if (endOfLinePosition !== -1) {\n this.position += endOfLinePosition + 1;\n return unreadData.slice(0, endOfLinePosition);\n }\n else {\n return null;\n }\n };\n HTTPRequest.prototype.isBufferTooLong = function (buffer) {\n return this.position === buffer.length && buffer.length > MAX_BUFFER_LENGTH;\n };\n return HTTPRequest;\n}(dispatcher));\n/* harmony default export */ var http_request = (http_request_HTTPRequest);\n\n// CONCATENATED MODULE: ./src/core/http/state.ts\nvar State;\n(function (State) {\n State[State[\"CONNECTING\"] = 0] = \"CONNECTING\";\n State[State[\"OPEN\"] = 1] = \"OPEN\";\n State[State[\"CLOSED\"] = 3] = \"CLOSED\";\n})(State || (State = {}));\n/* harmony default export */ var state = (State);\n\n// CONCATENATED MODULE: ./src/core/http/http_socket.ts\n\n\n\nvar autoIncrement = 1;\nvar http_socket_HTTPSocket = (function () {\n function HTTPSocket(hooks, url) {\n this.hooks = hooks;\n this.session = randomNumber(1000) + '/' + randomString(8);\n this.location = getLocation(url);\n this.readyState = state.CONNECTING;\n this.openStream();\n }\n HTTPSocket.prototype.send = function (payload) {\n return this.sendRaw(JSON.stringify([payload]));\n };\n HTTPSocket.prototype.ping = function () {\n this.hooks.sendHeartbeat(this);\n };\n HTTPSocket.prototype.close = function (code, reason) {\n this.onClose(code, reason, true);\n };\n HTTPSocket.prototype.sendRaw = function (payload) {\n if (this.readyState === state.OPEN) {\n try {\n runtime.createSocketRequest('POST', getUniqueURL(getSendURL(this.location, this.session))).start(payload);\n return true;\n }\n catch (e) {\n return false;\n }\n }\n else {\n return false;\n }\n };\n HTTPSocket.prototype.reconnect = function () {\n this.closeStream();\n this.openStream();\n };\n HTTPSocket.prototype.onClose = function (code, reason, wasClean) {\n this.closeStream();\n this.readyState = state.CLOSED;\n if (this.onclose) {\n this.onclose({\n code: code,\n reason: reason,\n wasClean: wasClean\n });\n }\n };\n HTTPSocket.prototype.onChunk = function (chunk) {\n if (chunk.status !== 200) {\n return;\n }\n if (this.readyState === state.OPEN) {\n this.onActivity();\n }\n var payload;\n var type = chunk.data.slice(0, 1);\n switch (type) {\n case 'o':\n payload = JSON.parse(chunk.data.slice(1) || '{}');\n this.onOpen(payload);\n break;\n case 'a':\n payload = JSON.parse(chunk.data.slice(1) || '[]');\n for (var i = 0; i < payload.length; i++) {\n this.onEvent(payload[i]);\n }\n break;\n case 'm':\n payload = JSON.parse(chunk.data.slice(1) || 'null');\n this.onEvent(payload);\n break;\n case 'h':\n this.hooks.onHeartbeat(this);\n break;\n case 'c':\n payload = JSON.parse(chunk.data.slice(1) || '[]');\n this.onClose(payload[0], payload[1], true);\n break;\n }\n };\n HTTPSocket.prototype.onOpen = function (options) {\n if (this.readyState === state.CONNECTING) {\n if (options && options.hostname) {\n this.location.base = replaceHost(this.location.base, options.hostname);\n }\n this.readyState = state.OPEN;\n if (this.onopen) {\n this.onopen();\n }\n }\n else {\n this.onClose(1006, 'Server lost session', true);\n }\n };\n HTTPSocket.prototype.onEvent = function (event) {\n if (this.readyState === state.OPEN && this.onmessage) {\n this.onmessage({ data: event });\n }\n };\n HTTPSocket.prototype.onActivity = function () {\n if (this.onactivity) {\n this.onactivity();\n }\n };\n HTTPSocket.prototype.onError = function (error) {\n if (this.onerror) {\n this.onerror(error);\n }\n };\n HTTPSocket.prototype.openStream = function () {\n var _this = this;\n this.stream = runtime.createSocketRequest('POST', getUniqueURL(this.hooks.getReceiveURL(this.location, this.session)));\n this.stream.bind('chunk', function (chunk) {\n _this.onChunk(chunk);\n });\n this.stream.bind('finished', function (status) {\n _this.hooks.onFinished(_this, status);\n });\n this.stream.bind('buffer_too_long', function () {\n _this.reconnect();\n });\n try {\n this.stream.start();\n }\n catch (error) {\n util.defer(function () {\n _this.onError(error);\n _this.onClose(1006, 'Could not start streaming', false);\n });\n }\n };\n HTTPSocket.prototype.closeStream = function () {\n if (this.stream) {\n this.stream.unbind_all();\n this.stream.close();\n this.stream = null;\n }\n };\n return HTTPSocket;\n}());\nfunction getLocation(url) {\n var parts = /([^\\?]*)\\/*(\\??.*)/.exec(url);\n return {\n base: parts[1],\n queryString: parts[2]\n };\n}\nfunction getSendURL(url, session) {\n return url.base + '/' + session + '/xhr_send';\n}\nfunction getUniqueURL(url) {\n var separator = url.indexOf('?') === -1 ? '?' : '&';\n return url + separator + 't=' + +new Date() + '&n=' + autoIncrement++;\n}\nfunction replaceHost(url, hostname) {\n var urlParts = /(https?:\\/\\/)([^\\/:]+)((\\/|:)?.*)/.exec(url);\n return urlParts[1] + hostname + urlParts[3];\n}\nfunction randomNumber(max) {\n return runtime.randomInt(max);\n}\nfunction randomString(length) {\n var result = [];\n for (var i = 0; i < length; i++) {\n result.push(randomNumber(32).toString(32));\n }\n return result.join('');\n}\n/* harmony default export */ var http_socket = (http_socket_HTTPSocket);\n\n// CONCATENATED MODULE: ./src/core/http/http_streaming_socket.ts\nvar http_streaming_socket_hooks = {\n getReceiveURL: function (url, session) {\n return url.base + '/' + session + '/xhr_streaming' + url.queryString;\n },\n onHeartbeat: function (socket) {\n socket.sendRaw('[]');\n },\n sendHeartbeat: function (socket) {\n socket.sendRaw('[]');\n },\n onFinished: function (socket, status) {\n socket.onClose(1006, 'Connection interrupted (' + status + ')', false);\n }\n};\n/* harmony default export */ var http_streaming_socket = (http_streaming_socket_hooks);\n\n// CONCATENATED MODULE: ./src/core/http/http_polling_socket.ts\nvar http_polling_socket_hooks = {\n getReceiveURL: function (url, session) {\n return url.base + '/' + session + '/xhr' + url.queryString;\n },\n onHeartbeat: function () {\n },\n sendHeartbeat: function (socket) {\n socket.sendRaw('[]');\n },\n onFinished: function (socket, status) {\n if (status === 200) {\n socket.reconnect();\n }\n else {\n socket.onClose(1006, 'Connection interrupted (' + status + ')', false);\n }\n }\n};\n/* harmony default export */ var http_polling_socket = (http_polling_socket_hooks);\n\n// CONCATENATED MODULE: ./src/runtimes/isomorphic/http/http_xhr_request.ts\n\nvar http_xhr_request_hooks = {\n getRequest: function (socket) {\n var Constructor = runtime.getXHRAPI();\n var xhr = new Constructor();\n xhr.onreadystatechange = xhr.onprogress = function () {\n switch (xhr.readyState) {\n case 3:\n if (xhr.responseText && xhr.responseText.length > 0) {\n socket.onChunk(xhr.status, xhr.responseText);\n }\n break;\n case 4:\n if (xhr.responseText && xhr.responseText.length > 0) {\n socket.onChunk(xhr.status, xhr.responseText);\n }\n socket.emit('finished', xhr.status);\n socket.close();\n break;\n }\n };\n return xhr;\n },\n abortRequest: function (xhr) {\n xhr.onreadystatechange = null;\n xhr.abort();\n }\n};\n/* harmony default export */ var http_xhr_request = (http_xhr_request_hooks);\n\n// CONCATENATED MODULE: ./src/runtimes/isomorphic/http/http.ts\n\n\n\n\n\nvar HTTP = {\n createStreamingSocket: function (url) {\n return this.createSocket(http_streaming_socket, url);\n },\n createPollingSocket: function (url) {\n return this.createSocket(http_polling_socket, url);\n },\n createSocket: function (hooks, url) {\n return new http_socket(hooks, url);\n },\n createXHR: function (method, url) {\n return this.createRequest(http_xhr_request, method, url);\n },\n createRequest: function (hooks, method, url) {\n return new http_request(hooks, method, url);\n }\n};\n/* harmony default export */ var http_http = (HTTP);\n\n// CONCATENATED MODULE: ./src/runtimes/web/http/http.ts\n\n\nhttp_http.createXDR = function (method, url) {\n return this.createRequest(http_xdomain_request, method, url);\n};\n/* harmony default export */ var web_http_http = (http_http);\n\n// CONCATENATED MODULE: ./src/runtimes/web/runtime.ts\n\n\n\n\n\n\n\n\n\n\n\n\nvar Runtime = {\n nextAuthCallbackID: 1,\n auth_callbacks: {},\n ScriptReceivers: ScriptReceivers,\n DependenciesReceivers: DependenciesReceivers,\n getDefaultStrategy: default_strategy,\n Transports: transports_transports,\n transportConnectionInitializer: transport_connection_initializer,\n HTTPFactory: web_http_http,\n TimelineTransport: jsonp_timeline,\n getXHRAPI: function () {\n return window.XMLHttpRequest;\n },\n getWebSocketAPI: function () {\n return window.WebSocket || window.MozWebSocket;\n },\n setup: function (PusherClass) {\n var _this = this;\n window.Pusher = PusherClass;\n var initializeOnDocumentBody = function () {\n _this.onDocumentBody(PusherClass.ready);\n };\n if (!window.JSON) {\n Dependencies.load('json2', {}, initializeOnDocumentBody);\n }\n else {\n initializeOnDocumentBody();\n }\n },\n getDocument: function () {\n return document;\n },\n getProtocol: function () {\n return this.getDocument().location.protocol;\n },\n getAuthorizers: function () {\n return { ajax: xhr_auth, jsonp: jsonp_auth };\n },\n onDocumentBody: function (callback) {\n var _this = this;\n if (document.body) {\n callback();\n }\n else {\n setTimeout(function () {\n _this.onDocumentBody(callback);\n }, 0);\n }\n },\n createJSONPRequest: function (url, data) {\n return new jsonp_request(url, data);\n },\n createScriptRequest: function (src) {\n return new script_request(src);\n },\n getLocalStorage: function () {\n try {\n return window.localStorage;\n }\n catch (e) {\n return undefined;\n }\n },\n createXHR: function () {\n if (this.getXHRAPI()) {\n return this.createXMLHttpRequest();\n }\n else {\n return this.createMicrosoftXHR();\n }\n },\n createXMLHttpRequest: function () {\n var Constructor = this.getXHRAPI();\n return new Constructor();\n },\n createMicrosoftXHR: function () {\n return new ActiveXObject('Microsoft.XMLHTTP');\n },\n getNetwork: function () {\n return net_info_Network;\n },\n createWebSocket: function (url) {\n var Constructor = this.getWebSocketAPI();\n return new Constructor(url);\n },\n createSocketRequest: function (method, url) {\n if (this.isXHRSupported()) {\n return this.HTTPFactory.createXHR(method, url);\n }\n else if (this.isXDRSupported(url.indexOf('https:') === 0)) {\n return this.HTTPFactory.createXDR(method, url);\n }\n else {\n throw 'Cross-origin HTTP requests are not supported';\n }\n },\n isXHRSupported: function () {\n var Constructor = this.getXHRAPI();\n return (Boolean(Constructor) && new Constructor().withCredentials !== undefined);\n },\n isXDRSupported: function (useTLS) {\n var protocol = useTLS ? 'https:' : 'http:';\n var documentProtocol = this.getProtocol();\n return (Boolean(window['XDomainRequest']) && documentProtocol === protocol);\n },\n addUnloadListener: function (listener) {\n if (window.addEventListener !== undefined) {\n window.addEventListener('unload', listener, false);\n }\n else if (window.attachEvent !== undefined) {\n window.attachEvent('onunload', listener);\n }\n },\n removeUnloadListener: function (listener) {\n if (window.addEventListener !== undefined) {\n window.removeEventListener('unload', listener, false);\n }\n else if (window.detachEvent !== undefined) {\n window.detachEvent('onunload', listener);\n }\n },\n randomInt: function (max) {\n var random = function () {\n var crypto = window.crypto || window['msCrypto'];\n var random = crypto.getRandomValues(new Uint32Array(1))[0];\n return random / Math.pow(2, 32);\n };\n return Math.floor(random() * max);\n }\n};\n/* harmony default export */ var runtime = (Runtime);\n\n// CONCATENATED MODULE: ./src/core/timeline/level.ts\nvar TimelineLevel;\n(function (TimelineLevel) {\n TimelineLevel[TimelineLevel[\"ERROR\"] = 3] = \"ERROR\";\n TimelineLevel[TimelineLevel[\"INFO\"] = 6] = \"INFO\";\n TimelineLevel[TimelineLevel[\"DEBUG\"] = 7] = \"DEBUG\";\n})(TimelineLevel || (TimelineLevel = {}));\n/* harmony default export */ var timeline_level = (TimelineLevel);\n\n// CONCATENATED MODULE: ./src/core/timeline/timeline.ts\n\n\n\nvar timeline_Timeline = (function () {\n function Timeline(key, session, options) {\n this.key = key;\n this.session = session;\n this.events = [];\n this.options = options || {};\n this.sent = 0;\n this.uniqueID = 0;\n }\n Timeline.prototype.log = function (level, event) {\n if (level <= this.options.level) {\n this.events.push(extend({}, event, { timestamp: util.now() }));\n if (this.options.limit && this.events.length > this.options.limit) {\n this.events.shift();\n }\n }\n };\n Timeline.prototype.error = function (event) {\n this.log(timeline_level.ERROR, event);\n };\n Timeline.prototype.info = function (event) {\n this.log(timeline_level.INFO, event);\n };\n Timeline.prototype.debug = function (event) {\n this.log(timeline_level.DEBUG, event);\n };\n Timeline.prototype.isEmpty = function () {\n return this.events.length === 0;\n };\n Timeline.prototype.send = function (sendfn, callback) {\n var _this = this;\n var data = extend({\n session: this.session,\n bundle: this.sent + 1,\n key: this.key,\n lib: 'js',\n version: this.options.version,\n cluster: this.options.cluster,\n features: this.options.features,\n timeline: this.events\n }, this.options.params);\n this.events = [];\n sendfn(data, function (error, result) {\n if (!error) {\n _this.sent++;\n }\n if (callback) {\n callback(error, result);\n }\n });\n return true;\n };\n Timeline.prototype.generateUniqueID = function () {\n this.uniqueID++;\n return this.uniqueID;\n };\n return Timeline;\n}());\n/* harmony default export */ var timeline_timeline = (timeline_Timeline);\n\n// CONCATENATED MODULE: ./src/core/strategies/transport_strategy.ts\n\n\n\n\nvar transport_strategy_TransportStrategy = (function () {\n function TransportStrategy(name, priority, transport, options) {\n this.name = name;\n this.priority = priority;\n this.transport = transport;\n this.options = options || {};\n }\n TransportStrategy.prototype.isSupported = function () {\n return this.transport.isSupported({\n useTLS: this.options.useTLS\n });\n };\n TransportStrategy.prototype.connect = function (minPriority, callback) {\n var _this = this;\n if (!this.isSupported()) {\n return failAttempt(new UnsupportedStrategy(), callback);\n }\n else if (this.priority < minPriority) {\n return failAttempt(new TransportPriorityTooLow(), callback);\n }\n var connected = false;\n var transport = this.transport.createConnection(this.name, this.priority, this.options.key, this.options);\n var handshake = null;\n var onInitialized = function () {\n transport.unbind('initialized', onInitialized);\n transport.connect();\n };\n var onOpen = function () {\n handshake = factory.createHandshake(transport, function (result) {\n connected = true;\n unbindListeners();\n callback(null, result);\n });\n };\n var onError = function (error) {\n unbindListeners();\n callback(error);\n };\n var onClosed = function () {\n unbindListeners();\n var serializedTransport;\n serializedTransport = safeJSONStringify(transport);\n callback(new TransportClosed(serializedTransport));\n };\n var unbindListeners = function () {\n transport.unbind('initialized', onInitialized);\n transport.unbind('open', onOpen);\n transport.unbind('error', onError);\n transport.unbind('closed', onClosed);\n };\n transport.bind('initialized', onInitialized);\n transport.bind('open', onOpen);\n transport.bind('error', onError);\n transport.bind('closed', onClosed);\n transport.initialize();\n return {\n abort: function () {\n if (connected) {\n return;\n }\n unbindListeners();\n if (handshake) {\n handshake.close();\n }\n else {\n transport.close();\n }\n },\n forceMinPriority: function (p) {\n if (connected) {\n return;\n }\n if (_this.priority < p) {\n if (handshake) {\n handshake.close();\n }\n else {\n transport.close();\n }\n }\n }\n };\n };\n return TransportStrategy;\n}());\n/* harmony default export */ var transport_strategy = (transport_strategy_TransportStrategy);\nfunction failAttempt(error, callback) {\n util.defer(function () {\n callback(error);\n });\n return {\n abort: function () { },\n forceMinPriority: function () { }\n };\n}\n\n// CONCATENATED MODULE: ./src/core/strategies/strategy_builder.ts\n\n\n\n\n\nvar strategy_builder_Transports = runtime.Transports;\nvar strategy_builder_defineTransport = function (config, name, type, priority, options, manager) {\n var transportClass = strategy_builder_Transports[type];\n if (!transportClass) {\n throw new UnsupportedTransport(type);\n }\n var enabled = (!config.enabledTransports ||\n arrayIndexOf(config.enabledTransports, name) !== -1) &&\n (!config.disabledTransports ||\n arrayIndexOf(config.disabledTransports, name) === -1);\n var transport;\n if (enabled) {\n options = Object.assign({ ignoreNullOrigin: config.ignoreNullOrigin }, options);\n transport = new transport_strategy(name, priority, manager ? manager.getAssistant(transportClass) : transportClass, options);\n }\n else {\n transport = strategy_builder_UnsupportedStrategy;\n }\n return transport;\n};\nvar strategy_builder_UnsupportedStrategy = {\n isSupported: function () {\n return false;\n },\n connect: function (_, callback) {\n var deferred = util.defer(function () {\n callback(new UnsupportedStrategy());\n });\n return {\n abort: function () {\n deferred.ensureAborted();\n },\n forceMinPriority: function () { }\n };\n }\n};\n\n// CONCATENATED MODULE: ./src/core/auth/user_authenticator.ts\n\n\nvar composeChannelQuery = function (params, authOptions) {\n var query = 'socket_id=' + encodeURIComponent(params.socketId);\n for (var key in authOptions.params) {\n query +=\n '&' +\n encodeURIComponent(key) +\n '=' +\n encodeURIComponent(authOptions.params[key]);\n }\n if (authOptions.paramsProvider != null) {\n var dynamicParams = authOptions.paramsProvider();\n for (var key in dynamicParams) {\n query +=\n '&' +\n encodeURIComponent(key) +\n '=' +\n encodeURIComponent(dynamicParams[key]);\n }\n }\n return query;\n};\nvar UserAuthenticator = function (authOptions) {\n if (typeof runtime.getAuthorizers()[authOptions.transport] === 'undefined') {\n throw \"'\" + authOptions.transport + \"' is not a recognized auth transport\";\n }\n return function (params, callback) {\n var query = composeChannelQuery(params, authOptions);\n runtime.getAuthorizers()[authOptions.transport](runtime, query, authOptions, AuthRequestType.UserAuthentication, callback);\n };\n};\n/* harmony default export */ var user_authenticator = (UserAuthenticator);\n\n// CONCATENATED MODULE: ./src/core/auth/channel_authorizer.ts\n\n\nvar channel_authorizer_composeChannelQuery = function (params, authOptions) {\n var query = 'socket_id=' + encodeURIComponent(params.socketId);\n query += '&channel_name=' + encodeURIComponent(params.channelName);\n for (var key in authOptions.params) {\n query +=\n '&' +\n encodeURIComponent(key) +\n '=' +\n encodeURIComponent(authOptions.params[key]);\n }\n if (authOptions.paramsProvider != null) {\n var dynamicParams = authOptions.paramsProvider();\n for (var key in dynamicParams) {\n query +=\n '&' +\n encodeURIComponent(key) +\n '=' +\n encodeURIComponent(dynamicParams[key]);\n }\n }\n return query;\n};\nvar ChannelAuthorizer = function (authOptions) {\n if (typeof runtime.getAuthorizers()[authOptions.transport] === 'undefined') {\n throw \"'\" + authOptions.transport + \"' is not a recognized auth transport\";\n }\n return function (params, callback) {\n var query = channel_authorizer_composeChannelQuery(params, authOptions);\n runtime.getAuthorizers()[authOptions.transport](runtime, query, authOptions, AuthRequestType.ChannelAuthorization, callback);\n };\n};\n/* harmony default export */ var channel_authorizer = (ChannelAuthorizer);\n\n// CONCATENATED MODULE: ./src/core/auth/deprecated_channel_authorizer.ts\nvar ChannelAuthorizerProxy = function (pusher, authOptions, channelAuthorizerGenerator) {\n var deprecatedAuthorizerOptions = {\n authTransport: authOptions.transport,\n authEndpoint: authOptions.endpoint,\n auth: {\n params: authOptions.params,\n headers: authOptions.headers\n }\n };\n return function (params, callback) {\n var channel = pusher.channel(params.channelName);\n var channelAuthorizer = channelAuthorizerGenerator(channel, deprecatedAuthorizerOptions);\n channelAuthorizer.authorize(params.socketId, callback);\n };\n};\n\n// CONCATENATED MODULE: ./src/core/config.ts\nvar __assign = (undefined && undefined.__assign) || function () {\n __assign = Object.assign || function(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n t[p] = s[p];\n }\n return t;\n };\n return __assign.apply(this, arguments);\n};\n\n\n\n\n\nfunction getConfig(opts, pusher) {\n var config = {\n activityTimeout: opts.activityTimeout || defaults.activityTimeout,\n cluster: opts.cluster || defaults.cluster,\n httpPath: opts.httpPath || defaults.httpPath,\n httpPort: opts.httpPort || defaults.httpPort,\n httpsPort: opts.httpsPort || defaults.httpsPort,\n pongTimeout: opts.pongTimeout || defaults.pongTimeout,\n statsHost: opts.statsHost || defaults.stats_host,\n unavailableTimeout: opts.unavailableTimeout || defaults.unavailableTimeout,\n wsPath: opts.wsPath || defaults.wsPath,\n wsPort: opts.wsPort || defaults.wsPort,\n wssPort: opts.wssPort || defaults.wssPort,\n enableStats: getEnableStatsConfig(opts),\n httpHost: getHttpHost(opts),\n useTLS: shouldUseTLS(opts),\n wsHost: getWebsocketHost(opts),\n userAuthenticator: buildUserAuthenticator(opts),\n channelAuthorizer: buildChannelAuthorizer(opts, pusher)\n };\n if ('disabledTransports' in opts)\n config.disabledTransports = opts.disabledTransports;\n if ('enabledTransports' in opts)\n config.enabledTransports = opts.enabledTransports;\n if ('ignoreNullOrigin' in opts)\n config.ignoreNullOrigin = opts.ignoreNullOrigin;\n if ('timelineParams' in opts)\n config.timelineParams = opts.timelineParams;\n if ('nacl' in opts) {\n config.nacl = opts.nacl;\n }\n return config;\n}\nfunction getHttpHost(opts) {\n if (opts.httpHost) {\n return opts.httpHost;\n }\n if (opts.cluster) {\n return \"sockjs-\" + opts.cluster + \".pusher.com\";\n }\n return defaults.httpHost;\n}\nfunction getWebsocketHost(opts) {\n if (opts.wsHost) {\n return opts.wsHost;\n }\n if (opts.cluster) {\n return getWebsocketHostFromCluster(opts.cluster);\n }\n return getWebsocketHostFromCluster(defaults.cluster);\n}\nfunction getWebsocketHostFromCluster(cluster) {\n return \"ws-\" + cluster + \".pusher.com\";\n}\nfunction shouldUseTLS(opts) {\n if (runtime.getProtocol() === 'https:') {\n return true;\n }\n else if (opts.forceTLS === false) {\n return false;\n }\n return true;\n}\nfunction getEnableStatsConfig(opts) {\n if ('enableStats' in opts) {\n return opts.enableStats;\n }\n if ('disableStats' in opts) {\n return !opts.disableStats;\n }\n return false;\n}\nfunction buildUserAuthenticator(opts) {\n var userAuthentication = __assign(__assign({}, defaults.userAuthentication), opts.userAuthentication);\n if ('customHandler' in userAuthentication &&\n userAuthentication['customHandler'] != null) {\n return userAuthentication['customHandler'];\n }\n return user_authenticator(userAuthentication);\n}\nfunction buildChannelAuth(opts, pusher) {\n var channelAuthorization;\n if ('channelAuthorization' in opts) {\n channelAuthorization = __assign(__assign({}, defaults.channelAuthorization), opts.channelAuthorization);\n }\n else {\n channelAuthorization = {\n transport: opts.authTransport || defaults.authTransport,\n endpoint: opts.authEndpoint || defaults.authEndpoint\n };\n if ('auth' in opts) {\n if ('params' in opts.auth)\n channelAuthorization.params = opts.auth.params;\n if ('headers' in opts.auth)\n channelAuthorization.headers = opts.auth.headers;\n }\n if ('authorizer' in opts)\n channelAuthorization.customHandler = ChannelAuthorizerProxy(pusher, channelAuthorization, opts.authorizer);\n }\n return channelAuthorization;\n}\nfunction buildChannelAuthorizer(opts, pusher) {\n var channelAuthorization = buildChannelAuth(opts, pusher);\n if ('customHandler' in channelAuthorization &&\n channelAuthorization['customHandler'] != null) {\n return channelAuthorization['customHandler'];\n }\n return channel_authorizer(channelAuthorization);\n}\n\n// CONCATENATED MODULE: ./src/core/watchlist.ts\nvar watchlist_extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\n\n\nvar watchlist_WatchlistFacade = (function (_super) {\n watchlist_extends(WatchlistFacade, _super);\n function WatchlistFacade(pusher) {\n var _this = _super.call(this, function (eventName, data) {\n logger.debug(\"No callbacks on watchlist events for \" + eventName);\n }) || this;\n _this.pusher = pusher;\n _this.bindWatchlistInternalEvent();\n return _this;\n }\n WatchlistFacade.prototype.handleEvent = function (pusherEvent) {\n var _this = this;\n pusherEvent.data.events.forEach(function (watchlistEvent) {\n _this.emit(watchlistEvent.name, watchlistEvent);\n });\n };\n WatchlistFacade.prototype.bindWatchlistInternalEvent = function () {\n var _this = this;\n this.pusher.connection.bind('message', function (pusherEvent) {\n var eventName = pusherEvent.event;\n if (eventName === 'pusher_internal:watchlist_events') {\n _this.handleEvent(pusherEvent);\n }\n });\n };\n return WatchlistFacade;\n}(dispatcher));\n/* harmony default export */ var watchlist = (watchlist_WatchlistFacade);\n\n// CONCATENATED MODULE: ./src/core/utils/flat_promise.ts\nfunction flatPromise() {\n var resolve, reject;\n var promise = new Promise(function (res, rej) {\n resolve = res;\n reject = rej;\n });\n return { promise: promise, resolve: resolve, reject: reject };\n}\n/* harmony default export */ var flat_promise = (flatPromise);\n\n// CONCATENATED MODULE: ./src/core/user.ts\nvar user_extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\n\n\n\n\n\nvar user_UserFacade = (function (_super) {\n user_extends(UserFacade, _super);\n function UserFacade(pusher) {\n var _this = _super.call(this, function (eventName, data) {\n logger.debug('No callbacks on user for ' + eventName);\n }) || this;\n _this.signin_requested = false;\n _this.user_data = null;\n _this.serverToUserChannel = null;\n _this.signinDonePromise = null;\n _this._signinDoneResolve = null;\n _this._onAuthorize = function (err, authData) {\n if (err) {\n logger.warn(\"Error during signin: \" + err);\n _this._cleanup();\n return;\n }\n _this.pusher.send_event('pusher:signin', {\n auth: authData.auth,\n user_data: authData.user_data\n });\n };\n _this.pusher = pusher;\n _this.pusher.connection.bind('state_change', function (_a) {\n var previous = _a.previous, current = _a.current;\n if (previous !== 'connected' && current === 'connected') {\n _this._signin();\n }\n if (previous === 'connected' && current !== 'connected') {\n _this._cleanup();\n _this._newSigninPromiseIfNeeded();\n }\n });\n _this.watchlist = new watchlist(pusher);\n _this.pusher.connection.bind('message', function (event) {\n var eventName = event.event;\n if (eventName === 'pusher:signin_success') {\n _this._onSigninSuccess(event.data);\n }\n if (_this.serverToUserChannel &&\n _this.serverToUserChannel.name === event.channel) {\n _this.serverToUserChannel.handleEvent(event);\n }\n });\n return _this;\n }\n UserFacade.prototype.signin = function () {\n if (this.signin_requested) {\n return;\n }\n this.signin_requested = true;\n this._signin();\n };\n UserFacade.prototype._signin = function () {\n if (!this.signin_requested) {\n return;\n }\n this._newSigninPromiseIfNeeded();\n if (this.pusher.connection.state !== 'connected') {\n return;\n }\n this.pusher.config.userAuthenticator({\n socketId: this.pusher.connection.socket_id\n }, this._onAuthorize);\n };\n UserFacade.prototype._onSigninSuccess = function (data) {\n try {\n this.user_data = JSON.parse(data.user_data);\n }\n catch (e) {\n logger.error(\"Failed parsing user data after signin: \" + data.user_data);\n this._cleanup();\n return;\n }\n if (typeof this.user_data.id !== 'string' || this.user_data.id === '') {\n logger.error(\"user_data doesn't contain an id. user_data: \" + this.user_data);\n this._cleanup();\n return;\n }\n this._signinDoneResolve();\n this._subscribeChannels();\n };\n UserFacade.prototype._subscribeChannels = function () {\n var _this = this;\n var ensure_subscribed = function (channel) {\n if (channel.subscriptionPending && channel.subscriptionCancelled) {\n channel.reinstateSubscription();\n }\n else if (!channel.subscriptionPending &&\n _this.pusher.connection.state === 'connected') {\n channel.subscribe();\n }\n };\n this.serverToUserChannel = new channels_channel(\"#server-to-user-\" + this.user_data.id, this.pusher);\n this.serverToUserChannel.bind_global(function (eventName, data) {\n if (eventName.indexOf('pusher_internal:') === 0 ||\n eventName.indexOf('pusher:') === 0) {\n return;\n }\n _this.emit(eventName, data);\n });\n ensure_subscribed(this.serverToUserChannel);\n };\n UserFacade.prototype._cleanup = function () {\n this.user_data = null;\n if (this.serverToUserChannel) {\n this.serverToUserChannel.unbind_all();\n this.serverToUserChannel.disconnect();\n this.serverToUserChannel = null;\n }\n if (this.signin_requested) {\n this._signinDoneResolve();\n }\n };\n UserFacade.prototype._newSigninPromiseIfNeeded = function () {\n if (!this.signin_requested) {\n return;\n }\n if (this.signinDonePromise && !this.signinDonePromise.done) {\n return;\n }\n var _a = flat_promise(), promise = _a.promise, resolve = _a.resolve, _ = _a.reject;\n promise.done = false;\n var setDone = function () {\n promise.done = true;\n };\n promise.then(setDone)[\"catch\"](setDone);\n this.signinDonePromise = promise;\n this._signinDoneResolve = resolve;\n };\n return UserFacade;\n}(dispatcher));\n/* harmony default export */ var user = (user_UserFacade);\n\n// CONCATENATED MODULE: ./src/core/pusher.ts\n\n\n\n\n\n\n\n\n\n\n\n\n\nvar pusher_Pusher = (function () {\n function Pusher(app_key, options) {\n var _this = this;\n checkAppKey(app_key);\n options = options || {};\n if (!options.cluster && !(options.wsHost || options.httpHost)) {\n var suffix = url_store.buildLogSuffix('javascriptQuickStart');\n logger.warn(\"You should always specify a cluster when connecting. \" + suffix);\n }\n if ('disableStats' in options) {\n logger.warn('The disableStats option is deprecated in favor of enableStats');\n }\n this.key = app_key;\n this.config = getConfig(options, this);\n this.channels = factory.createChannels();\n this.global_emitter = new dispatcher();\n this.sessionID = runtime.randomInt(1000000000);\n this.timeline = new timeline_timeline(this.key, this.sessionID, {\n cluster: this.config.cluster,\n features: Pusher.getClientFeatures(),\n params: this.config.timelineParams || {},\n limit: 50,\n level: timeline_level.INFO,\n version: defaults.VERSION\n });\n if (this.config.enableStats) {\n this.timelineSender = factory.createTimelineSender(this.timeline, {\n host: this.config.statsHost,\n path: '/timeline/v2/' + runtime.TimelineTransport.name\n });\n }\n var getStrategy = function (options) {\n return runtime.getDefaultStrategy(_this.config, options, strategy_builder_defineTransport);\n };\n this.connection = factory.createConnectionManager(this.key, {\n getStrategy: getStrategy,\n timeline: this.timeline,\n activityTimeout: this.config.activityTimeout,\n pongTimeout: this.config.pongTimeout,\n unavailableTimeout: this.config.unavailableTimeout,\n useTLS: Boolean(this.config.useTLS)\n });\n this.connection.bind('connected', function () {\n _this.subscribeAll();\n if (_this.timelineSender) {\n _this.timelineSender.send(_this.connection.isUsingTLS());\n }\n });\n this.connection.bind('message', function (event) {\n var eventName = event.event;\n var internal = eventName.indexOf('pusher_internal:') === 0;\n if (event.channel) {\n var channel = _this.channel(event.channel);\n if (channel) {\n channel.handleEvent(event);\n }\n }\n if (!internal) {\n _this.global_emitter.emit(event.event, event.data);\n }\n });\n this.connection.bind('connecting', function () {\n _this.channels.disconnect();\n });\n this.connection.bind('disconnected', function () {\n _this.channels.disconnect();\n });\n this.connection.bind('error', function (err) {\n logger.warn(err);\n });\n Pusher.instances.push(this);\n this.timeline.info({ instances: Pusher.instances.length });\n this.user = new user(this);\n if (Pusher.isReady) {\n this.connect();\n }\n }\n Pusher.ready = function () {\n Pusher.isReady = true;\n for (var i = 0, l = Pusher.instances.length; i < l; i++) {\n Pusher.instances[i].connect();\n }\n };\n Pusher.getClientFeatures = function () {\n return keys(filterObject({ ws: runtime.Transports.ws }, function (t) {\n return t.isSupported({});\n }));\n };\n Pusher.prototype.channel = function (name) {\n return this.channels.find(name);\n };\n Pusher.prototype.allChannels = function () {\n return this.channels.all();\n };\n Pusher.prototype.connect = function () {\n this.connection.connect();\n if (this.timelineSender) {\n if (!this.timelineSenderTimer) {\n var usingTLS = this.connection.isUsingTLS();\n var timelineSender = this.timelineSender;\n this.timelineSenderTimer = new PeriodicTimer(60000, function () {\n timelineSender.send(usingTLS);\n });\n }\n }\n };\n Pusher.prototype.disconnect = function () {\n this.connection.disconnect();\n if (this.timelineSenderTimer) {\n this.timelineSenderTimer.ensureAborted();\n this.timelineSenderTimer = null;\n }\n };\n Pusher.prototype.bind = function (event_name, callback, context) {\n this.global_emitter.bind(event_name, callback, context);\n return this;\n };\n Pusher.prototype.unbind = function (event_name, callback, context) {\n this.global_emitter.unbind(event_name, callback, context);\n return this;\n };\n Pusher.prototype.bind_global = function (callback) {\n this.global_emitter.bind_global(callback);\n return this;\n };\n Pusher.prototype.unbind_global = function (callback) {\n this.global_emitter.unbind_global(callback);\n return this;\n };\n Pusher.prototype.unbind_all = function (callback) {\n this.global_emitter.unbind_all();\n return this;\n };\n Pusher.prototype.subscribeAll = function () {\n var channelName;\n for (channelName in this.channels.channels) {\n if (this.channels.channels.hasOwnProperty(channelName)) {\n this.subscribe(channelName);\n }\n }\n };\n Pusher.prototype.subscribe = function (channel_name) {\n var channel = this.channels.add(channel_name, this);\n if (channel.subscriptionPending && channel.subscriptionCancelled) {\n channel.reinstateSubscription();\n }\n else if (!channel.subscriptionPending &&\n this.connection.state === 'connected') {\n channel.subscribe();\n }\n return channel;\n };\n Pusher.prototype.unsubscribe = function (channel_name) {\n var channel = this.channels.find(channel_name);\n if (channel && channel.subscriptionPending) {\n channel.cancelSubscription();\n }\n else {\n channel = this.channels.remove(channel_name);\n if (channel && channel.subscribed) {\n channel.unsubscribe();\n }\n }\n };\n Pusher.prototype.send_event = function (event_name, data, channel) {\n return this.connection.send_event(event_name, data, channel);\n };\n Pusher.prototype.shouldUseTLS = function () {\n return this.config.useTLS;\n };\n Pusher.prototype.signin = function () {\n this.user.signin();\n };\n Pusher.instances = [];\n Pusher.isReady = false;\n Pusher.logToConsole = false;\n Pusher.Runtime = runtime;\n Pusher.ScriptReceivers = runtime.ScriptReceivers;\n Pusher.DependenciesReceivers = runtime.DependenciesReceivers;\n Pusher.auth_callbacks = runtime.auth_callbacks;\n return Pusher;\n}());\n/* harmony default export */ var core_pusher = (pusher_Pusher);\nfunction checkAppKey(key) {\n if (key === null || key === undefined) {\n throw 'You must pass your app key when you instantiate Pusher.';\n }\n}\nruntime.setup(pusher_Pusher);\n\n// EXTERNAL MODULE: ./node_modules/tweetnacl/nacl-fast.js\nvar nacl_fast = __webpack_require__(2);\n\n// CONCATENATED MODULE: ./src/core/pusher-with-encryption.ts\nvar pusher_with_encryption_extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\n\n\nvar pusher_with_encryption_PusherWithEncryption = (function (_super) {\n pusher_with_encryption_extends(PusherWithEncryption, _super);\n function PusherWithEncryption(app_key, options) {\n var _this = this;\n core_pusher.logToConsole = PusherWithEncryption.logToConsole;\n core_pusher.log = PusherWithEncryption.log;\n options = options || {};\n options.nacl = nacl_fast;\n _this = _super.call(this, app_key, options) || this;\n return _this;\n }\n return PusherWithEncryption;\n}(core_pusher));\n/* harmony default export */ var pusher_with_encryption = __webpack_exports__[\"default\"] = (pusher_with_encryption_PusherWithEncryption);\n\n\n/***/ })\n/******/ ]);\n});\n//# sourceMappingURL=pusher-with-encryption.js.map","// This is a wrapper to make importing the encrypted channel capable web build\n// nicer\n// import Pusher from 'pusher-js/with-encryption'\nmodule.exports = require('../dist/web/pusher-with-encryption');\n"],"names":["module","exports","_$breadcrumbTypes_8","_$reduce_17","arr","fn","accum","val","i","len","length","_$filter_12","item","concat","_$includes_13","x","_$isArray_14","obj","Object","prototype","toString","call","_hasDontEnumBug","propertyIsEnumerable","_dontEnums","_$keys_15","prop","result","hasOwnProperty","push","_$intRange_24","min","max","Infinity","value","parseInt","_$listOfFunctions_25","f","_$stringWithLength_26","_$config_5","schema","apiKey","defaultValue","message","validate","appVersion","undefined","appType","autoDetectErrors","enabledErrorTypes","unhandledExceptions","unhandledRejections","allowPartialObject","providedKeys","defaultKeys","k","onError","onSession","onBreadcrumb","endpoints","notify","sessions","autoTrackSessions","enabledReleaseStages","releaseStage","maxBreadcrumbs","enabledBreadcrumbTypes","join","maybeType","context","user","key","metadata","logger","method","redactedKeys","s","test","plugins","p","load","featureFlags","feature","name","_$assign_11","target","arguments","source","_$map_16","_extends","assign","apply","this","_$config_1","window","location","host","console","debug","getPrefixedConsole","consoleLog","log","consoleMethod","bind","_$Breadcrumb_3","Breadcrumb","type","timestamp","Date","toJSON","metaData","_$stackframe_34","root","factory","StackFrame","_isNumber","n","isNaN","parseFloat","isFinite","_capitalize","str","charAt","toUpperCase","substring","_getter","booleanProps","numericProps","stringProps","props","getArgs","args","setArgs","v","TypeError","getEvalOrigin","evalOrigin","setEvalOrigin","getFunctionName","getFileName","getLineNumber","getColumnNumber","Boolean","j","Number","String","_$errorStackParser_31","ErrorStackParser","FIREFOX_SAFARI_STACK_REGEXP","CHROME_IE_STACK_REGEXP","SAFARI_NATIVE_CODE_REGEXP","parse","error","stacktrace","parseOpera","stack","match","parseV8OrIE","parseFFOrSafari","Error","extractLocation","urlLike","indexOf","parts","exec","replace","split","filter","line","map","sanitizedLine","tokens","slice","locationParts","pop","functionName","fileName","lineNumber","columnNumber","functionNameRegex","matches","e","parseOpera9","parseOpera11","parseOpera10","lineRE","lines","argsRaw","functionCall","shift","_$errorStackParser_10","_$safeJsonStringify_30","data","replacer","space","opts","redactedPaths","JSON","stringify","seen","edges","visit","path","edgesExceeded","MIN_PRESERVED_DEPTH","MAX_EDGES","MAX_DEPTH","REPLACEMENT_NODE","haystack","needle","find","fResult","err","throwsMessage","o","eResult","__isArray_30","aResult","isDescendent","shouldRedact","safelyGetProp","prepareObjForSerialization","paths","patterns","toLowerCase","add","existingFeatures","existingFeatureKeys","variant","existingIndex","_$featureFlagDelegate_18","clear","features","featuresIndex","merge","newFeatures","toEventApi","_ref","flag","featureFlag","_$hasStack_19","_$iserror_20","__clear_22","state","section","_$metadataDelegate_22","keyOrObj","maybeVal","_updates","updates","get","_$stackGenerator_33","StackGenerator","backtrace","maxStackSize","curr","callee","Array","RegExp","$1","caller","Event","errorClass","errorMessage","handledState","originalError","defaultHandledState","groupingHash","_handledState","severity","unhandled","app","device","request","breadcrumbs","threads","_metadata","_features","_featuresIndex","_user","_session","errors","createBugsnagError","__type","_proto","addMetadata","getMetadata","clearMetadata","addFeatureFlag","addFeatureFlags","getFeatureFlags","clearFeatureFlag","clearFeatureFlags","getUser","setUser","id","email","payloadVersion","exceptions","er","severityReason","session","formatStackframe","frame","file","normaliseFunctionName","code","inProject","ensureString","getCauseStack","cause","getStacktrace","errorFramesToSkip","backtraceFramesToSkip","create","maybeError","tolerateNonErrors","component","event","_normaliseError","normaliseError","internalFrames","makeSerialisable","_event$errors","causes","normalisedCauses","createAndLogInputError","reason","verb","warn","hasNecessaryFields","_$Event_6","_$syncCallbackRunner_23","callbacks","callbackArg","callbackType","ignore","cbs","_$pad_29","num","size","substr","env","self","globalCount","mimeTypesLength","navigator","mimeTypes","clientId","userAgent","_$fingerprint_28","c","blockSize","base","discreteValues","Math","pow","randomBlock","random","cuid","getTime","fingerprint","_$cuid_27","_$Session_35","Session","startedAt","_handled","_unhandled","events","handled","_track","__add_4","__clear_4","__merge_4","noop","Client","configuration","internalPlugins","notifier","_this","_notifier","_config","_schema","_delivery","sendSession","sendEvent","_logger","info","_plugins","_breadcrumbs","_context","_cbs","sp","b","_configure","pl","_loadPlugin","_depth","getContext","setContext","plugin","configSchema","_reduce","config","generateConfigErrorMessage","getPlugin","_setDelivery","d","startSession","version","_sessionDelegate","addOnError","front","removeOnError","_addOnSessionPayload","addOnSession","removeOnSession","addOnBreadcrumb","removeOnBreadcrumb","pauseSession","resumeSession","leaveBreadcrumb","crumb","_isBreadcrumbTypeEnabled","types","postReportCallback","_notify","_this2","originalSeverity","onCallbackError","cb","index","next","_$asyncEvery_7","ret","then","setTimeout","_$callbackRunner_9","shouldSend","unhandledOverridden","rawInput","_$Client_4","_$jsonPayload_21","EVENT_REDACTION_PATHS","payload","_$delivery_36","client","win","url","getApiUrl","body","req","XDomainRequest","onload","onerror","toFixed","open","send","endpoint","isoDate","matchPageProtocol","protocol","encodeURIComponent","_matchPageProtocol","pageProtocol","_$delivery_37","XMLHttpRequest","onreadystatechange","readyState","DONE","status","setRequestHeader","toISOString","appStart","reset","_$app_38","now","duration","_$pad_43","__env_42","__globalCount_42","__prop_42","__mimeTypesLength_42","__clientId_42","_$fingerprint_42","__c_41","__blockSize_41","__base_41","__discreteValues_41","__randomBlock_41","__cuid_41","_$cuid_41","BUGSNAG_ANONYMOUS_ID_KEY","_$device_40","nav","locale","browserLanguage","systemLanguage","userLanguage","language","screen","orientation","document","documentElement","clientWidth","clientHeight","generateAnonymousId","storage","localStorage","getItem","setItem","getDeviceId","collectUserIp","setDefaultUserId","time","eventOrSession","_$request_44","href","_$session_45","sessionDelegate","sessionClient","_pausedSession","_$clientIp_46","clientIp","_$consoleBreadcrumbs_47","CONSOLE_LOG_METHODS","original","_len","_key","arg","stringified","_restore","MAX_SCRIPT_LENGTH","_$inlineScriptContent_48","doc","trackInlineScripts","originalLocation","html","DOMContentLoaded","attachEvent","getHtml","outerHTML","prev","_lastScript","updateLastScript","script","getCurrentScript","currentScript","scripts","getElementsByTagName","cleanUrl","content","innerHTML","htmlLines","zeroBasedLine","start","end","addSurroundingCode","_setTimeout","__proxy","__traceOriginalScript","eventTargetCallbackAccessor","callbackAccessor","alsoCallOriginal","cba","__trace__","replacement","isEventHandlerObj","handleEvent","_$interactionBreadcrumbs_49","addEventListener","targetText","targetSelector","el","text","textContent","innerText","trimStart","trimEnd","getNodeSelector","tagName","className","querySelectorAll","parentNode","childNodes","_$navigationBreadcrumbs_50","drop","oldURL","from","relativeLocation","to","newURL","getCurrentState","history","replaceState","wrapHistoryFn","pushState","a","createElement","pathname","search","hash","orig","title","currentPath","prevState","stateChangeToMetadata","resetEventCount","BREADCRUMB_TYPE","_$networkBreadcrumbs_51","_ignoredUrls","ignoredUrls","nativeOpen","requestSetupKey","handleXHRError","handleXHRLoad","removeEventListener","monkeyPatchXMLHttpRequest","fetch","polyfill","oldFetch","_arguments","urlOrRequest","options","Promise","resolve","reject","response","handleFetchSuccess","handleFetchError","monkeyPatchFetch","_$throttle_52","maxEvents","_$stripQueryString_53","strip","allFrames","_strip","_$onerror_54","prevOnError","messageOrEvent","lineNo","charNo","decorateStack","detail","extraParameters","culprit","isActualNumber","errorCharacter","_$unhandledRejection_55","listener","evt","isBluebird","fixBluebirdStacktrace","_event$addMetadata","onunhandledrejection","promise","_$notifier_2","__schema_2","Bugsnag","_client","createClient","bugsnag","isStarted","m","_$src_1","_setPrototypeOf","setPrototypeOf","__proto__","BugsnagPluginReact","globalReact","React","lazy","ErrorBoundary","createClass","createErrorBoundary","BugsnagPluginReactLazyInitializer","formatComponentStack","_React$Component","handleClearError","ReferenceError","_assertThisInitialized","subClass","superClass","constructor","_proto2","setState","componentDidCatch","componentStack","render","FallbackComponent","clearError","children","Component","global","sqrt","atan2","PiBy180","PiBy2","couldUseAttachEvent","touchEvents","parseEl","supportsOpacity","supportsFilters","reOpacity","setOpacity","proto","degreesToRadians","originXOffset","originYOffset","clone","multipleSpacesRegex","fabric","HTMLDocument","Document","implementation","createHTMLDocument","virtualWindow","JSDOM","decodeURIComponent","FetchExternalResources","resources","jsdomImplForWrapper","nodeCanvas","DOMParser","copyGLTo2DDrawImage","gl","pipelineState","glCanvas","canvas","targetCanvas","ctx","translate","height","scale","sourceY","drawImage","width","copyGLTo2DPutImageData","dWidth","destinationWidth","dHeight","destinationHeight","numBytes","u8","Uint8Array","imageBuffer","u8Clamped","Uint8ClampedArray","readPixels","RGBA","UNSIGNED_BYTE","imgData","ImageData","putImageData","isTouchSupported","maxTouchPoints","isLikelyNode","Buffer","SHARED_ATTRIBUTES","DPI","reNum","commaWsp","rePathCommand","reNonWord","fontPaths","iMatrix","svgNS","perfLimitSizeTotal","maxCacheSideLimit","minCacheSideLimit","charWidthsCache","textureSize","disableStyleCopyPaste","enableGLFiltering","devicePixelRatio","webkitDevicePixelRatio","mozDevicePixelRatio","browserShadowBlurConstant","arcToSegmentsCache","boundsOfCurveCache","cachesBoundsOfCurve","forceGLPutImageData","initFilterBackend","isWebglSupported","maxTextureSize","WebglFilterBackend","tileSize","Canvas2dFilterBackend","_removeEventListener","eventName","handler","__eventListeners","eventListener","util","array","fill","_once","_handler","off","on","Observable","fire","listenersForEvent","once","Collection","_objects","_onObjectAdded","renderOnAddRemove","requestRenderAll","insertAt","object","nonSplicing","objects","splice","remove","somethingRemoved","_onObjectRemoved","forEachObject","callback","getObjects","isEmpty","contains","deep","some","complexity","reduce","memo","current","CommonMethods","_setOptions","set","_initGradient","filler","property","colorStops","Gradient","_initPattern","Pattern","_setObject","_set","toggle","PI","cos","angle","sin","sign","removeFromArray","idx","getRandomInt","floor","degrees","radiansToDegrees","radians","rotatePoint","point","origin","newPoint","Point","y","rotateVector","addEquals","vector","createVector","calcAngleBetweenVectors","acos","hypot","getHatVector","multiply","getBisector","A","B","C","AB","AC","alpha","phi","projectStrokeOnPoints","points","openPath","coords","strokeWidth","strokeUniformScalar","strokeUniform","scaleX","scaleY","getStrokeHatVector","scalar","forEach","miterVector","bisector","bisectorVector","strokeLineJoin","strokeMiterLimit","subtract","SQRT2","transformPoint","t","ignoreOffset","makeBoundingBoxFromPoints","transform","xPoints","minX","yPoints","minY","left","top","invertTransform","r","number","fractionDigits","parseUnit","fontSize","unit","Text","DEFAULT_SVG_FONT_SIZE","falseFunction","getKlass","namespace","string","camelize","resolveNamespace","getSvgAttributes","attributes","loadImage","crossOrigin","img","createImage","onLoadCallback","src","loadImageInDom","div","style","position","appendChild","querySelector","removeChild","enlivenObjects","reviver","enlivenedObjects","numLoadedObjects","numTotalObjects","onLoaded","fromObject","enlivenObjectEnlivables","enlivenProps","ENLIVEN_PROPS","enlivedProps","enlivenPatterns","numLoadedPatterns","numPatterns","enlivenedPatterns","pattern","groupSVGElements","elements","sourcePath","centerPoint","Group","populateWithProperties","destination","properties","isArray","createCanvasElement","copyCanvasElement","newCanvas","toDataURL","canvasEl","format","quality","multiplyTransformMatrices","is2x2","qrDecompose","denom","skewX","skewY","translateX","translateY","calcRotateMatrix","theta","calcDimensionsMatrix","scaleMatrix","flipX","flipY","tan","composeMatrix","matrix","resetObjectTransform","rotate","saveObjectTransform","isTransparent","tolerance","_isTransparent","imageData","getImageData","l","parsePreserveAspectRatioAttribute","attribute","align","meetOrSlice","aspectRatioAttrs","alignX","alignY","clearFabricFontCache","fontFamily","limitDimsByArea","ar","maximumArea","roughWidth","perfLimitSizeY","capValue","findScaleToFit","findScaleToCover","matrixToSVG","NUM_FRACTION_DIGITS","removeTransformFromObject","inverted","finalTransform","calcOwnMatrix","applyTransformToObject","addTransformToObject","center","setPositionByOrigin","sizeAfterTransform","dimX","dimY","transformMatrix","bbox","mergeClipPaths","c1","c2","calcTransformMatrix","clipPath","hasStyleChanged","prevStyle","thisStyle","forTextSpans","stroke","fontWeight","fontStyle","textBackgroundColor","deltaY","overline","underline","linethrough","stylesToArray","styles","textLines","charIndex","stylesArray","keys","stylesFromArray","styleIndex","stylesObject","_join","commandLengths","h","q","repeatedCommands","M","segmentToBezier","th2","th3","cosTh","sinTh","rx","ry","cx1","cy1","mT","fromX","fromY","costh2","sinth2","costh3","sinth3","toX","toY","calcVectorAngle","ux","uy","vx","vy","ta","tb","fromArcToBeziers","fx","fy","rot","large","sweep","segsNorm","rotateX","th","px","py","rx2","abs","ry2","py2","px2","cx","cy","mTheta","dtheta","segments","ceil","mDelta","arcToSegments","calcLineLength","x1","y1","x2","y2","getPointOnCubicBezierIterator","p1x","p1y","p2x","p2y","p3x","p3y","p4x","p4y","pct","CB2","c3","CB3","c4","CB4","getTangentCubicIterator","invT","tangentX","tangentY","getPointOnQuadraticBezierIterator","QB2","QB3","getTangentQuadraticIterator","pathIterator","iterator","perc","tempP","tmpLen","getPathSegmentsInfo","tempInfo","angleFinder","totalLength","command","destX","destY","joinPath","pathData","segment","parsePath","pathString","parsed","coordsStr","re","rNumber","rNumberCommaWsp","rFlagCommaWsp","regArcArgumentSequence","coordsParsed","trim","jlen","commandLength","repeatedCommand","klen","makePathSimpler","converted","previous","controlX","controlY","destinationPath","getSmoothPathFromPoints","correction","p1","p2","multSignX","multSignY","manyPoints","eq","midPoint","midPointFrom","getBoundsOfCurve","x0","y0","x3","y3","argsString","t1","t2","b2ac","sqrtb2ac","tvalues","bounds","mt","getPointOnPath","distance","infos","segInfo","segPercent","lerp","nextLen","lastPerc","nextStep","findPercentageForDistance","transformPath","pathOffset","pathSegment","newSegment","byProperty","condition","invoke","value1","value2","extend","Element","getWholeChar","charCodeAt","character","capitalize","firstLetterOnly","escapeXml","graphemeSplit","textstring","chr","graphemes","emptyFunction","IS_DONTENUM_BUGGY","addMethods","klass","parent","superclass","returnValue","valueOf","Subclass","callSuper","methodName","parentMethod","superClassMethod","initialize","subclasses","addListener","element","removeListener","getPointer","scroll","getScrollLeftTop","_evt","touchProp","changedTouches","getTouchInfo","clientX","clientY","isTouchEvent","pointerType","opacity","es","currentStyle","hasLayout","zoom","setStyle","elementStyle","cssText","normalizedProperty","styleFloat","setProperty","sliceCanConvertNodelists","getElementStyle","selectProp","_slice","toArray","arrayLike","makeElement","htmlFor","setAttribute","docElement","scrollLeft","scrollTop","nodeType","defaultView","getComputedStyle","attr","makeElementUnselectable","onselectstart","unselectable","makeElementSelectable","setImageSmoothing","imageSmoothingEnabled","webkitImageSmoothingEnabled","mozImageSmoothingEnabled","msImageSmoothingEnabled","oImageSmoothingEnabled","getById","getElementById","addClass","wrapElement","wrapper","replaceChild","getElementOffset","docElem","scrollLeftTop","ownerDocument","box","offset","offsetAttributes","borderLeftWidth","borderTopWidth","paddingLeft","paddingTop","getBoundingClientRect","clientLeft","clientTop","getNodeCanvas","impl","_canvas","_image","cleanUpJsdomNode","_currentSrc","_attributes","_classList","emptyFn","onComplete","xhr","parameters","param","addParamToUrl","RUNNING_ANIMATIONS","defaultEasing","cancelAll","animations","animation","cancel","cancelByCanvas","cancelled","cancelByTarget","findAnimationsByTarget","findAnimationIndex","cancelFunc","findAnimation","_requestAnimFrame","requestAnimationFrame","webkitRequestAnimationFrame","mozRequestAnimationFrame","oRequestAnimationFrame","msRequestAnimationFrame","_cancelAnimFrame","cancelAnimationFrame","clearTimeout","requestAnimFrame","animate","removeFromRegistry","runningAnimations","currentValue","startValue","completionRate","durationRate","finish","onChange","abort","easing","isMany","endValue","byValue","onStart","tick","ticktime","currentTime","timePerc","_value","valuePerc","cancelAnimFrame","calculateColor","begin","pos","color","animateColor","fromColor","toColor","startColor","Color","getSource","endColor","originalOnComplete","originalOnChange","colorEasing","normalize","asin","elastic","easeInBounce","easeOutBounce","ease","easeInQuad","easeOutQuad","easeInOutQuad","easeInCubic","easeOutCubic","easeInOutCubic","easeInQuart","easeOutQuart","easeInOutQuart","easeInQuint","easeOutQuint","easeInOutQuint","easeInSine","easeOutSine","easeInOutSine","easeInExpo","easeOutExpo","easeInOutExpo","easeInCirc","easeOutCirc","easeInOutCirc","easeInElastic","easeOutElastic","easeInOutElastic","easeInBack","easeOutBack","easeInOutBack","easeInOutBounce","attributesMap","display","visibility","colorAttributes","fSize","cPath","normalizeAttr","normalizeValue","parentAttributes","parseTransformAttribute","visible","fillIndex","strokeIndex","getSvgRegex","_getMultipleNodes","nodeNames","nodeName","nodeList","nodeArray","elementMatchesRule","selectors","firstMatching","parentMatching","selectorMatches","selector","doesSomeParentMatch","matcher","classNames","getAttribute","elementById","node","nodelist","svgValidTagNamesRegEx","svgViewBoxElementsRegEx","svgInvalidAncestorsRegEx","svgValidParentsRegEx","cssRules","gradientDefs","clipPaths","skewMatrix","reTransformList","reTransform","attributeValue","matrices","operation","translateMatrix","rotateMatrix","multiplierX","multiplierY","combinedMatrix","reViewBoxAttrValue","applyViewboxTransform","viewBoxWidth","viewBoxHeight","viewBoxAttr","widthAttr","heightAttr","preserveAspectRatio","missingViewBox","missingDimAttr","toBeParsed","parsedDim","widthDiff","heightDiff","removeAttribute","createElementNS","firstChild","recursivelyParseGradientsXlink","gradient","xlinkAttr","referencedGradient","hasAttribute","referenceClone","cloneNode","parseSVGDocument","parsingOptions","xlinkAttribute","attrs","xlink","el2","currentTrans","oldLength","el3","setAttributeNS","nodeValue","parseUseDirectives","svgUid","__uid","descendants","selectNodes","hasAncestorWithNodeName","getGradientDefs","getCSSRules","parseElements","instances","reFontDeclaration","parseFontDeclaration","oStyle","lineHeight","elList","parseAttributes","parentFontSize","ownAttributes","cssAttrs","rule","getGlobalStylesForElement","parseStyleAttribute","normalizedAttr","normalizedValue","normalizedStyle","font","mergedAttrs","setAlpha","getAlpha","toRgba","_setStrokeFillOpacity","ElementsParser","chunk","pair","parseStyleString","parseStyleObject","parsePointsAttribute","parsedPoints","allRules","styleContents","ruleObj","propertyValuePairs","_rule","loadSVGFromURL","xml","responseXML","results","_options","allElements","loadSVGFromString","parseFromString","regexUrl","numElements","createObjects","createObject","findTag","fromElement","createCallback","checkIfDone","resolveGradient","Image","_originalElement","_removeTransformMatrix","resolveClipPath","extractPropertyDefinition","regex","lastIndex","gradientDef","opacityAttr","createClipPathCallback","container","_newObj","fillRule","clipRule","usingElement","objTransformInv","gTransform","clipPathTag","clipPathOwner","that","scalarAdd","scalarAddEquals","subtractEquals","scalarSubtract","scalarSubtractEquals","multiplyEquals","divide","divideEquals","lt","lte","gt","gte","distanceFrom","dx","dy","setXY","setX","setY","setFromPoint","swap","Intersection","appendPoint","appendPoints","intersectLineLine","a1","a2","b1","b2","uaT","ubT","uB","ua","ub","intersectLinePolygon","inter","intersectPolygonPolygon","points1","points2","intersectPolygonRectangle","r1","r2","topRight","bottomLeft","inter1","inter2","inter3","inter4","_tryParsingColor","setSource","hue2rgb","colorNameMap","sourceFromHex","sourceFromRgb","sourceFromHsl","_rgbToHsl","g","round","_source","toRgb","toHsl","hsl","toHsla","toHex","toHexa","toGrayscale","average","currentAlpha","toBlackWhite","threshold","overlayWith","otherColor","otherSource","reRGBa","reHSLa","reHex","aliceblue","antiquewhite","aqua","aquamarine","azure","beige","bisque","black","blanchedalmond","blue","blueviolet","brown","burlywood","cadetblue","chartreuse","chocolate","coral","cornflowerblue","cornsilk","crimson","cyan","darkblue","darkcyan","darkgoldenrod","darkgray","darkgrey","darkgreen","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkseagreen","darkslateblue","darkslategray","darkslategrey","darkturquoise","darkviolet","deeppink","deepskyblue","dimgray","dimgrey","dodgerblue","firebrick","floralwhite","forestgreen","fuchsia","gainsboro","ghostwhite","gold","goldenrod","gray","grey","green","greenyellow","honeydew","hotpink","indianred","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgray","lightgrey","lightgreen","lightpink","lightsalmon","lightseagreen","lightskyblue","lightslategray","lightslategrey","lightsteelblue","lightyellow","lime","limegreen","linen","magenta","maroon","mediumaquamarine","mediumblue","mediumorchid","mediumpurple","mediumseagreen","mediumslateblue","mediumspringgreen","mediumturquoise","mediumvioletred","midnightblue","mintcream","mistyrose","moccasin","navajowhite","navy","oldlace","olive","olivedrab","orange","orangered","orchid","palegoldenrod","palegreen","paleturquoise","palevioletred","papayawhip","peachpuff","peru","pink","plum","powderblue","purple","rebeccapurple","red","rosybrown","royalblue","saddlebrown","salmon","sandybrown","seagreen","seashell","sienna","silver","skyblue","slateblue","slategray","slategrey","snow","springgreen","steelblue","teal","thistle","tomato","turquoise","violet","wheat","white","whitesmoke","yellow","yellowgreen","fromRgb","fromSource","fromRgba","fromHsl","fromHsla","fromHex","isShortNotation","isRGBa","oColor","scaleMap","skewMap","controls","LEFT","TOP","RIGHT","BOTTOM","CENTER","opposite","bottom","right","findCornerQuadrant","fabricObject","control","cornerAngle","fireEvent","canvasOptions","scaleIsProportional","eventData","uniformIsToggled","uniScaleKey","uniformScaling","isTransformCentered","originX","originY","scalingIsForbidden","by","scaleProportionally","lockX","lockScalingX","lockY","lockScalingY","commonEventInfo","pointer","wrapWithFixedAnchor","actionHandler","getCenterPoint","constraint","translateToOriginPoint","actionPerformed","wrapWithFireEvent","getLocalPoint","corner","getZoom","padding","localPoint","toLocalPoint","offsetX","offsetY","targetHasOneFlip","compensateScaleForSkew","oppositeSkew","scaleToCompensate","axis","reference","newValue","_getTransformedDimensions","skewObjectX","newSkew","dimNoSkew","totalSkewSize","currentSkew","hasSkewed","dimBeforeSkewing","skewObjectY","scaleObject","dim","signX","signY","forbidScaling","gestureScale","lockScalingFlip","oldScaleX","oldScaleY","scaleCursorStyleHandler","skewCursorStyleHandler","notAllowed","lockSkewingY","lockSkewingX","scaleSkewCursorStyleHandler","altActionKey","rotationWithSnapping","pivotPoint","lockRotation","hasRotated","lastAngle","ey","ex","curAngle","snapAngle","snapThreshold","rightAngleLocked","leftAngleLocked","scalingEqually","scalingX","scalingY","scalingYOrSkewingX","skewHandlerX","scalingXOrSkewingY","skewHandlerY","changeWidth","strokePadding","multiplier","oldWidth","newWidth","finalHandler","dragHandler","newLeft","newTop","moveX","moveY","scaleOrSkewActionName","isAlternative","rotationStyleHandler","cursorStyle","controlsUtils","renderCircleControl","styleOverride","xSize","sizeX","cornerSize","ySize","sizeY","transparentCorners","cornerStrokeColor","myLeft","myTop","save","fillStyle","cornerColor","strokeStyle","lineWidth","beginPath","arc","restore","renderSquareControl","xSizeBy2","ySizeBy2","strokeRect","Control","actionName","touchSizeX","touchSizeY","withConnection","mouseDownHandler","mouseUpHandler","getActionHandler","getMouseDownHandler","getMouseUpHandler","cursorStyleHandler","getActionName","getVisibility","controlKey","objectVisibility","_controlsVisibility","setVisibility","positionHandler","finalMatrix","calcCornerCoords","objectAngle","objectCornerSize","centerX","centerY","isTouch","cosHalfOffset","sinHalfOffset","cosHalfOffsetComp","sinHalfOffsetComp","controlTriangleAngle","cornerHypotenuse","newTheta","newThetaComp","tl","tr","bl","br","cornerStyle","getColorStop","colorAlpha","keyValuePairs","gradientTransform","gradientUnits","option","addColorStop","toObject","propertiesToInclude","toSVG","markup","commonAttributes","needsSwap","withViewport","additionalTransform","sort","reverse","minRadius","percentageShift","colorStop","toLive","createLinearGradient","createRadialGradient","instance","svgOptions","colorStopEls","getLinearCoords","getRadialCoords","propValue","finalValue","__convertPercentUnitsToValues","repeat","patternTransform","setOptions","isError","patternSource","patternWidth","patternHeight","patternOffsetX","patternOffsetY","patternImgSrc","complete","naturalWidth","naturalHeight","createPattern","Shadow","blur","affectStroke","includeDefaultValues","nonScaling","_parseShadow","shadow","shadowStr","offsetsAndBlur","reOffsetsAndBlur","fBoxX","fBoxY","StaticCanvas","CANVAS_INIT_ERROR","renderAndResetBound","renderAndReset","requestRenderAllBound","_initStatic","backgroundColor","backgroundImage","overlayColor","overlayImage","stateful","controlsAboveOverlay","allowTouchScrolling","viewportTransform","backgroundVpt","overlayVpt","enableRetinaScaling","vptCoords","skipOffscreen","_createLowerCanvas","_initOptions","interactive","_initRetinaScaling","setOverlayImage","setBackgroundImage","setBackgroundColor","setOverlayColor","calcOffset","_isRetinaScaling","getRetinaScaling","scaleRatio","__initRetinaScaling","lowerCanvasEl","contextContainer","upperCanvasEl","contextTop","_offset","image","__setBgOverlayImage","__setBgOverlayColor","_createCanvasElement","_originalCanvasStyle","_applyCanvasStyle","getWidth","getHeight","setWidth","setDimensions","setHeight","dimensions","cssValue","cssOnly","_setBackstoreDimension","hasLostContext","backstoreOnly","_setCssDimension","_isCurrentlyDrawing","freeDrawingBrush","_setBrushStyles","cacheCanvasEl","wrapperEl","setViewportTransform","vpt","activeObject","_activeObject","backgroundObject","overlayObject","group","setCoords","calcViewportBoundaries","zoomToPoint","before","after","setZoom","absolutePan","relativePan","getElement","setupState","clearContext","clearRect","_hasITextHandlers","_mouseUpITextHandler","_iTextInstances","renderAll","canvasToDrawOn","renderCanvas","isRendering","iVpt","cancelRequestedRender","_renderBackground","_renderObjects","drawControls","shouldCache","_transformDone","renderCache","forClipping","drawClipPathOnCanvas","_renderOverlay","globalCompositeOperation","zoomX","zoomY","_cacheCanvas","cacheTranslationX","cacheTranslationY","_renderBackgroundOrOverlay","needsVpt","moveTo","lineTo","closePath","getCenter","centerObjectH","_centerObject","centerObjectV","centerObject","viewportCenterObject","vpCenter","getVpCenter","viewportCenterObjectH","viewportCenterObjectV","toDatalessJSON","toDatalessObject","_toObjectMethod","_toObjects","excludeFromExport","_toObject","__serializeBgOverlay","originalValue","bgImage","bgColor","background","overlay","svgViewportTransformation","_setSVGPreamble","_setSVGHeader","clipPathId","_setSVGBgOverlayColor","_setSVGBgOverlayImage","_setSVGObjects","suppressPreamble","encoding","viewBox","createSVGFontFacesMarkup","createSVGRefElementsMarkup","createSVGClipPathMarkup","toClipPathSVG","shouldTransform","row","rowIndex","fontList","_setSVGObject","finalWidth","finalHeight","sendToBack","objs","activeSelection","unshift","bringToFront","sendBackwards","intersecting","newIdx","objsMoved","_findNewLowerIndex","intersectsWithObject","isContainedWithinObject","bringForward","_findNewUpperIndex","dispose","classList","DataURLExporter","EMPTY_JSON","supports","setLineDash","createPNGStream","createJPEGStream","BaseBrush","strokeLineCap","strokeDashArray","limitedToCanvasSize","lineCap","miterLimit","lineJoin","_saveAndTransform","_setShadow","shadowColor","shadowBlur","shadowOffsetX","shadowOffsetY","needsFullRender","_resetShadow","_isOutSideCanvas","PencilBrush","decimate","drawStraightLine","straightLineKey","_points","_hasStraightLine","_drawSegment","quadraticCurveTo","onMouseDown","_isMainEvent","_prepareForDrawing","_captureDrawingPath","_render","onMouseMove","oldEnd","onMouseUp","_finalizeAndAddPath","_reset","_addPoint","pointerPoint","convertPointsToSVGPath","_isEmptySVGPath","createPath","Path","decimatePoints","adjustedDistance","lastPoint","newPoints","CircleBrush","drawDot","addPoint","dot","radius","originalRenderOnAddRemove","circles","circle","Circle","circleRadius","circleColor","SprayBrush","density","dotWidth","dotWidthVariance","randomOpacity","optimizeOverlapping","sprayChunks","addSprayChunk","sprayChunkPoints","rects","ilen","sprayChunk","rect","Rect","_getOptimizedRects","uniqueRects","uniqueRectsArray","globalAlpha","fillRect","PatternBrush","getPatternSrc","patternCanvas","patternCtx","getPatternSrcFunction","getPattern","topLeft","_getLeftTopCoords","Canvas","_initInteractive","_createCacheCanvas","centeredScaling","centeredRotation","centeredKey","selection","selectionKey","altSelectionKey","selectionColor","selectionDashArray","selectionBorderColor","selectionLineWidth","selectionFullyContained","hoverCursor","moveCursor","defaultCursor","freeDrawingCursor","notAllowedCursor","containerClass","perPixelTargetFind","targetFindTolerance","skipTargetFind","isDrawingMode","preserveObjectStacking","stopContextMenu","fireRightClick","fireMiddleClick","targets","enablePointerEvents","_hoveredTarget","_hoveredTargets","_currentTransform","_groupSelector","_initWrapperElement","_createUpperCanvas","_initEventListeners","_chooseObjectsToRender","objsToRender","activeGroupObjects","activeObjects","getActiveObjects","contextTopDirty","renderTopLayer","_drawSelection","renderTop","_normalizePointer","invertedM","vptPointer","restorePointerVpt","isTargetTransparent","normalizedPointer","targetRelativeX","targetRelativeY","_cacheContext","contextCache","originalColor","selectionBackgroundColor","_isSelectionKeyPressed","_shouldClearSelection","evented","selectable","_shouldCenterTransform","action","altKey","centerTransform","_getOriginFromCorner","_getActionFromCorner","alreadySelected","_setupCurrentTransform","__corner","lastX","lastY","shiftKey","_beforeTransform","setCursor","cursor","viewportStart","viewportExtent","extent","maxX","maxY","strokeOffset","_setLineDash","findTarget","skipGroup","activeTarget","activeTargetSubs","aObjects","shouldLookForActive","_findTargetCorner","_searchPossibleTargets","_checkTarget","globalPointer","containsPoint","isEditing","subTarget","objToCheck","pointerToUse","subTargetCheck","ignoreZoom","_absolutePointer","_pointer","cssScale","boundsWidth","boundsHeight","retinaScaling","lowerCanvasClass","_copyCanvasStyle","getTopContext","fromEl","toEl","getSelectionContext","getSelectionElement","getActiveObject","active","_discardActiveObject","_fireSelectionEvents","oldObjects","somethingChanged","added","removed","oldObject","selected","deselected","setActiveObject","currentActives","_setActiveObject","onSelect","onDeselect","discardActiveObject","removeListeners","_renderControls","originalProperties","_realizeGroupTransformOnObject","_unwindGroupTransformOnObject","originalValues","clearContextTop","addEventOptions","passive","checkClick","button","mainTouchId","_bindEvents","addOrRemove","_getEventPrefix","functor","eventjsFunctor","canvasElement","eventTypePrefix","_onResize","_onMouseDown","_onMouseMove","_onMouseOut","_onMouseEnter","_onMouseWheel","_onContextMenu","_onDoubleClick","_onDragOver","_onDragEnter","_onDragLeave","_onDrop","_onTouchStart","eventjs","_onGesture","_onDrag","_onOrientationChange","_onShake","_onLongPress","_onMouseUp","_onTouchEnd","eventsBound","_simpleEventHandler","__onTransformGesture","__onDrag","__onMouseWheel","_target","__onOrientationChange","__onShake","__onLongPress","preventDefault","_fireEnterLeaveEvents","stopPropagation","_cacheTransformEventData","_handleEvent","_resetTransformEventData","getPointerId","identifier","pointerId","isPrimary","touches","__onMouseDown","__onMouseUp","_willAddMouseDown","__onMouseMove","_shouldRender","groupSelector","shouldRender","isClick","_onMouseUpInDrawingMode","_finalizeCurrentTransform","targetWasActive","_maybeGroupObjects","activeOn","isMoving","originalControl","originalMouseUpHandler","_setCursorFromEvent","eventType","subTargets","absolutePointer","currentTarget","currentSubTargets","_scaling","hasStateChanged","_fire","_onMouseDownInDrawingMode","_onMouseMoveInDrawingMode","_previousPointer","shouldGroup","_shouldGroup","_handleGrouping","saveState","_transformObject","_fireOverOutEvents","fireSyntheticInOutEvents","oldTarget","evtOut","canvasEvtOut","evtIn","canvasEvtIn","_draggedoverTarget","inOpt","outOpt","inFires","targetChanged","previousTarget","nextTarget","_performTransformAction","getCornerCursor","_updateActiveSelection","_createActiveSelection","currentActiveObjects","removeWithUpdate","addWithUpdate","_createGroup","groupObjects","exitEditing","ActiveSelection","_groupSelectedObjects","aGroup","_collectObjects","currentObject","selectionX1Y1","selectionX2Y2","allowIntersect","intersectsWithRect","isContainedWithinRect","toCanvasElement","cropping","scaledWidth","scaledHeight","originalWidth","originalHeight","newZoom","vp","originalInteractive","newVp","originalRetina","originalContextTop","loadFromJSON","json","serialized","_enlivenObjects","_setBgOverlay","enlivenedCanvasClip","__setupCanvas","loaded","cbIfLoaded","__setBgOverlay","enlivedObject","_toDataURL","_toDataURLWithMultiplier","toDataURLWithMultiplier","cloneWithoutData","backgroundImageOpacity","backgroundImageStretch","objectCaching","touchCornerSize","borderColor","borderDashArray","cornerDashArray","strokeDashOffset","borderOpacityWhenMoving","borderScaleFactor","minScaleLimit","hasControls","hasBorders","lockMovementX","lockMovementY","statefullCache","noScaleCache","dirty","paintFirst","stateProperties","cacheProperties","colorProperties","absolutePositioned","_cacheProperties","_updateCacheCanvas","_limitCacheSize","dims","limitedDims","capped","_getCacheCanvasDimensions","objectScale","getTotalObjectScaling","neededX","neededY","drawingWidth","drawingHeight","minCacheSize","dimensionsChanged","cacheWidth","cacheHeight","zoomChanged","shouldRedraw","additionalWidth","additionalHeight","shouldResizeCanvas","canvasWidth","canvasHeight","sizeGrowing","getHeightOfLine","setTransform","needFullTransform","_removeDefaultValues","getObjectScaling","retina","getObjectOpacity","shouldConstrainValue","isChanged","groupNeedsUpdate","_constrainScale","isOnACache","setOnGroup","getViewportTransform","isNotVisible","isOnScreen","_setupCompositeOperation","drawSelectionBackground","_setOpacity","drawCacheOnCanvas","_removeCacheCanvas","drawObject","propertySet","isCacheDirty","hasStroke","hasFill","needsItsOwnCache","ownCaching","willDrawShadow","drawClipPathOnCache","originalFill","originalStroke","_setClippingProperties","_drawClipPath","skipCanvas","_getNonTransformedDimensions","_removeShadow","_setStrokeStyles","decl","lineDashOffset","_applyPatternForTransformedGradient","_applyPatternGradientTransform","_setFillStyles","dashArray","drawBorders","forActiveSelection","drawBordersInGroup","scaling","multX","multY","_renderPaintInOrder","_renderStroke","_renderFill","pCtx","pCanvas","_findCenterFromElement","_assignTransformMatrixProps","preserveAspectRatioOptions","cropX","cropY","offsetLeft","offsetTop","objectForm","_fromObject","cloneAsImage","utils","origParams","originalGroup","originalShadow","withoutTransform","withoutShadow","boundingRect","getBoundingRect","shadowOffset","originalCanvas","isType","includes","shouldCenterOrigin","_setOriginToCenter","_resetOrigin","centerH","viewportCenterH","centerV","viewportCenterV","viewportCenter","getLocalPointer","pClicked","objectLeftTop","createAccessors","extraParam","translateToGivenOrigin","fromOriginX","fromOriginY","toOriginX","toOriginY","translateToCenterPoint","leftTop","getPointByOrigin","adjustPosition","offsetFrom","offsetTo","hypotFull","getScaledWidth","xFull","yFull","_originalOriginX","_originalOriginY","originPoint","multiplyMatrices","oCoords","aCoords","lineCoords","ownMatrixCache","matrixCache","_getCoords","absolute","calculate","calcACoords","calcLineCoords","getCoords","pointTL","pointBR","other","otherCoords","_getImageLines","_findCrossPoints","_containsCenterOfCanvas","isPartiallyOnScreen","every","topline","rightline","bottomline","leftline","xi","iLine","xcount","lineKey","getScaledHeight","scaleToWidth","boundingRectFactor","scaleToHeight","cosP","sinP","cosPSinP","cosPMinusSinP","calcOCoords","_calcRotateMatrix","_calcTranslateMatrix","startMatrix","_calculateCurrentDimensions","forEachControl","w","skipCorners","_setCornerCoords","transformMatrixKey","sep","prefix","cache","tMatrix","noSkew","_finalizeDimensions","getSvgColorString","getSvgStyles","skipShadow","getSvgFilter","getSvgSpanStyles","useWhiteSpace","term","textDecoration","getSvgTextDecoration","decoration","getSvgCommons","getSvgTransform","full","_setSVGBg","textBgRects","_getFillAttributes","_createBaseSVGMarkup","_toSVG","_createBaseClipPathSVGMarkup","objectMarkup","commonPieces","clipPathMarkup","noStyle","styleInfo","shadowInfo","withShadow","vectorEffect","absoluteClipPath","addPaintOrder","originalSet","saveProps","tmpObj","_isEqual","origValue","firstPass","dashedPropertySet","forTouch","isControlVisible","touchCorner","controlObject","wh","shouldStroke","setControlVisible","setControlsVisibility","FX_DURATION","fxCenterObjectH","empty","fxCenterObjectV","fxRemove","skipCallbacks","propsToAnimate","out","_animate","propPair","propIsColor","valueProgress","timeProgress","coordProps","makeEdgeToOriginGetter","propertyNames","originValues","axis1","axis2","dimension","nearest","farthest","Line","_setWidthHeight","_getLeftToOriginX","_getTopToOriginY","calcLinePoints","origStrokeStyle","xMult","yMult","ATTRIBUTE_NAMES","parsedAttributes","startAngle","endAngle","setRadius","svgString","getRadiusX","getRadiusY","Triangle","widthBy2","heightBy2","piBy2","Ellipse","getRx","getRy","_initRxRy","isRounded","bezierCurveTo","Polyline","exactBoundingBox","_setPositionDimensions","_projectStrokeOnPoints","correctLeftTop","calcDim","_calcDimensions","correctSize","fromSVG","diffX","diffY","commonRender","fromElementGenerator","_class","Polygon","_setPath","_renderPathCommands","subpathStartX","subpathStartY","_getOffsetTransform","digits","aX","aY","pathUrl","elivenedObjects","useSetOnGroup","isAlreadyGrouped","_updateObjectsACoords","_calcBounds","_updateObjectsCoords","_updateObjectCoords","objectLeft","objectTop","nested","_restoreObjectsState","_includeDefaultValues","objsToObject","originalDefaults","_obj","ownCache","groupMatrix","destroy","toActiveSelection","ungroupOnCanvas","setObjectsCoords","onlyWidthHeight","iLen","jLen","_getBounds","minXY","maxXY","toGroup","newGroup","childrenOverride","srcFromAttribute","_lastScaleX","_lastScaleY","_filterScalingX","_filterScalingY","minimumScaleTrigger","cacheKey","imageSmoothing","filters","_initElement","_element","setElement","removeTexture","_initConfig","applyFilters","resizeFilter","applyResizeFilters","backend","filterBackend","evictCachesForKey","getCrossOrigin","getOriginalSize","_stroke","filterObj","getSrc","hasCrop","strokeSvg","imageMarkup","imageRendering","getSvgSrc","origFill","filtered","setSrc","minimumScale","elementToFilter","_filteredEl","sourceWidth","sourceHeight","isNeutralState","imgElement","_needsResize","elementToDraw","elWidth","elHeight","sX","sY","sW","sH","maxDestW","maxDestH","_resetWidthHeight","CSS_CANVAS","_initFilters","pAR","rWidth","rHeight","pWidth","pHeight","_object","resizeFilters","fromURL","imgOptions","_getAngleValueForStraighten","straighten","fxStraighten","straightenObject","fxStraightenObject","testPrecision","precision","fragmentSource","fragmentShader","createShader","FRAGMENT_SHADER","shaderSource","compileShader","getShaderParameter","COMPILE_STATUS","setupGLContext","captureGPUInfo","isSupported","getParameter","MAX_TEXTURE_SIZE","precisions","webGlPrecision","createWebGLCanvas","aPosition","Float32Array","chooseFastestCopyGLTo2DMethod","canUseImageData","canMeasurePerf","performance","canUseArrayBuffer","ArrayBuffer","canUseUint8Clamped","copyGLTo2D","startTime","drawImageTime","testContext","glOptions","premultipliedAlpha","depth","stencil","antialias","clearColor","cachedTexture","getCachedTexture","sourceTexture","createTexture","targetTexture","originalTexture","passes","webgl","programCache","pass","tempFbo","createFramebuffer","bindFramebuffer","FRAMEBUFFER","applyTo","resizeCanvasIfNeeded","bindTexture","TEXTURE_2D","deleteTexture","deleteFramebuffer","clearWebGLCaches","textureCache","textureImageSource","filterType","texture","texParameteri","TEXTURE_MAG_FILTER","NEAREST","TEXTURE_MIN_FILTER","TEXTURE_WRAP_S","CLAMP_TO_EDGE","TEXTURE_WRAP_T","texImage2D","uniqueId","gpuInfo","renderer","vendor","ext","getExtension","UNMASKED_RENDERER_WEBGL","UNMASKED_VENDOR_WEBGL","sourceElement","originalEl","originalImageData","BaseFilter","vertexSource","createProgram","vertexShader","VERTEX_SHADER","getShaderInfoLog","program","attachShader","linkProgram","getProgramParameter","LINK_STATUS","getProgramInfoLog","attributeLocations","getAttributeLocations","uniformLocations","getUniformLocations","uStepW","getUniformLocation","uStepH","getAttribLocation","sendAttributeData","aPositionData","attributeLocation","buffer","createBuffer","bindBuffer","ARRAY_BUFFER","enableVertexAttribArray","vertexAttribPointer","FLOAT","bufferData","STATIC_DRAW","_setupFrameBuffer","framebufferTexture2D","COLOR_ATTACHMENT0","_swapTextures","temp","main","mainParameter","applyToWebGL","applyTo2d","retrieveShader","shader","useProgram","uniform1f","sendUniformData","viewport","drawArrays","TRIANGLE_STRIP","bindAdditionalTexture","textureUnit","activeTexture","TEXTURE0","unbindAdditionalTexture","getMainParameter","setMainParameter","createHelpLayer","helpLayer","mainP","ColorMatrix","colorsOnly","uColorMatrix","uConstants","constants","uniformMatrix4fv","uniform4fv","Brightness","brightness","uBrightness","Convolute","opaque","Convolute_3_1","Convolute_3_0","Convolute_5_1","Convolute_5_0","Convolute_7_1","Convolute_7_0","Convolute_9_1","Convolute_9_0","dstOff","scx","scy","srcOff","wt","weights","side","halfSide","sw","sh","output","createImageData","dst","alphaFac","uMatrix","uOpaque","uHalfSize","uSize","uniform1fv","Grayscale","lightness","luminosity","mode","uMode","uniform1i","Invert","invert","uInvert","Noise","noise","rand","uNoise","uSeed","Pixelate","blocksize","_i","_j","_iLen","_jLen","uBlocksize","RemoveColor","useAlpha","lowC","highC","uLow","uHigh","Brownie","Vintage","Kodachrome","Technicolor","Polaroid","Sepia","BlackWhite","BlendColor","diff","lighten","darken","exclusion","tint","buildSource","tg","alpha1","uColor","BlendImage","mask","TEXTURE1","calculateMatrix","canvas1","blendData","blendImage","uTransformMatrix","uImage","uniformMatrix3fv","Resize","resizeType","lanczosLobes","uDelta","uTaps","uniform2fv","horizontal","taps","filterWindow","getFilterWindow","generateShader","tempScale","getTaps","lobeFunction","lanczosCreate","offsets","fragmentSourceTOP","dW","dH","lobes","xx","rcpScaleX","rcpScaleY","newData","oW","oH","sliceByTwo","hermiteFastResize","bilinearFiltering","lanczosResize","tmpCanvas","mult","doneW","doneH","stepW","stepH","dX","dY","srcData","destImg","destData","lanczos","ratioX","ratioY","rcpRatioX","rcpRatioY","range2X","range2Y","cacheLanc","icenter","process","u","weight","fX","fY","xDiff","yDiff","chnl","origPix","w4","pixels","destImage","destPixels","ratioW","ratioH","ratioWHalf","ratioHHalf","img2","data2","weightsAlpha","gxR","gxG","gxB","gxA","yy","w0","Contrast","contrast","contrastF","uContrast","Saturation","saturation","adjust","uSaturation","Vibrance","vibrance","avg","amt","uVibrance","Blur","aspectRatio","simpleBlur","canvas2","blurLayer1","blurLayer2","percent","ctx1","ctx2","newImageData","delta","chooseRightDelta","blurScale","Gamma","gamma","rInv","gInv","bInv","rVals","gVals","bVals","uGamma","uniform3fv","Composed","subFilters","HueRotation","rotation","rad","aThird","aThirdSqtSin","OneMinusCos","additionalProps","_dimensionAffectingProps","_reNewline","_reSpacesAndTabs","_reSpaceAndTab","_reWords","textAlign","superscript","baseline","subscript","pathStartOffset","pathSide","pathAlign","_fontSizeFraction","_fontSizeMult","charSpacing","_measuringContext","direction","_styleProperties","__charBounds","CACHE_FONT_SIZE","MIN_TEXT_WIDTH","__skipDimension","setPathInfo","initDimensions","segmentsInfo","getMeasuringContext","_splitText","newLines","_splitTextIntoLines","_textLines","graphemeLines","_unwrappedTextLines","_unwrappedLines","_text","graphemeText","_clearCache","calcTextWidth","cursorWidth","calcTextHeight","enlargeSpaces","diffSpace","currentLineWidth","numberOfSpaces","accumulatedSpace","charBound","spaces","isEndOfWrapping","getLineWidth","kernedWidth","lineIndex","missingNewlineOffset","_setTextStyles","_renderTextLinesBackground","_renderTextDecoration","_renderText","_renderTextStroke","_renderTextFill","charStyle","forMeasuring","textBaseline","_getFontDeclaration","maxWidth","_renderTextLine","_renderChars","styleHas","heightOfLine","lineLeftOffset","lastColor","charBox","currentColor","drawStart","leftOffset","_getLeftOffset","lineTopOffset","_getTopOffset","boxStart","boxWidth","_getLineLeftOffset","getValueOfPropertyAt","renderLeft","getFontCache","cacheProp","_measureChar","_char","previousChar","prevCharStyle","coupleWidth","previousWidth","fontCache","couple","stylesAreEqual","fontMultiplier","measureText","getHeightOfChar","measureLine","lineInfo","_measureLine","_getWidthOfCharSpacing","grapheme","prevGrapheme","graphemeInfo","startingPoint","totalPathLength","lineBounds","positionInPath","_getGraphemeBox","_setGraphemeOnPath","numOfSpaces","centerPosition","skipLeft","getCompleteStyleDeclaration","previousBox","__lineHeights","maxHeight","_renderTextCommon","lineHeights","isEmptyStyles","actualStyle","nextStyle","timeToRender","drawingLeft","isJustify","charsToRender","shortCut","isLtr","currentDirection","_renderChar","_applyPatternGradientTransformText","handleFiller","fillOffsets","strokeOffsets","_getStyleDeclaration","fullDecl","shouldFill","fillText","strokeText","setSuperscript","_setScript","setSubscript","loc","get2DCursorLocation","setSelectionStyles","lineDiff","__lineWidths","_shouldClearDimensionCache","shouldClear","_forceClearCache","_size","_dy","lastDecoration","currentDecoration","currentFill","lastFill","topOffset","styleObject","family","fontIsGeneric","genericFonts","newLine","newText","allProperties","needsDims","isAddingPath","parsedAnchor","textAnchor","originalStrokeWidth","textHeightScaleFactor","scaledDiff","textHeight","offX","objectCopy","textInstance","pathInstance","p3","cleanStyle","letterCount","stylePropertyValue","stylesCount","allStyleObjectPropertiesMatch","graphemeCount","removeStyle","lineNum","charNum","_extendStyles","_getLineStyle","_setLineStyle","_setStyleDeclaration","selectionStart","skipWrapping","getSelectionStyles","startIndex","endIndex","selectionEnd","getStyleAtPosition","lineStyle","_deleteStyleDeclaration","_deleteLineStyle","parseDecoration","IText","editable","editingBorderColor","cursorColor","cursorDelay","cursorDuration","caching","hiddenTextareaContainer","_reSpace","_currentCursorOpacity","_selectionDirection","_abortCursorAnimation","__widthOfSpace","inCompositionMode","initBehavior","setSelectionStart","_updateAndFire","setSelectionEnd","_fireSelectionChanged","_updateTextarea","initDelayedCursor","cursorOffsetCache","renderCursorOrSelection","skipRestore","_clearTextArea","boundaries","_getCursorBoundaries","renderCursor","renderSelection","_getCursorBoundariesOffsets","cursorPosition","bound","cursorLocation","charHeight","__isMousedown","hiddenTextarea","startLine","endLine","startChar","endChar","realLineHeight","lineOffset","boxEnd","drawWidth","drawHeight","extraTop","compositionColor","getCurrentCharFontSize","cp","_getCurrentCharIndex","getCurrentCharColor","objCopy","initAddedHandler","initRemovedHandler","initCursorSelectionHandlers","initDoubleClickSimulation","mouseMoveHandler","_initCanvasHandlers","_removeCanvasHandlers","_tick","_currentTickState","_animateCursor","targetOpacity","completeMethod","tickState","isAborted","_onTickComplete","_cursorTimeout1","_currentTickCompleteState","restart","delay","abortCursorAnimation","_cursorTimeout2","selectAll","getSelectedText","findWordBoundaryLeft","startFrom","findWordBoundaryRight","findLineBoundaryLeft","findLineBoundaryRight","searchWordBoundary","selectWord","newSelectionStart","newSelectionEnd","selectLine","enterEditing","exitEditingOnOthers","initHiddenTextarea","focus","_saveEditingProps","_setEditingProps","_textBeforeEdit","initMouseMoveHandler","activeElement","getSelectionStartFromPointer","currentStart","currentEnd","__selectionStartOnMouseDown","restartCursorIfNeeded","fromStringToGraphemeSelection","smallerTextStart","graphemeStart","smallerTextEnd","fromGraphemeToStringSelection","newSelection","updateTextareaPosition","updateFromTextArea","_calcTextareaPosition","desiredPosition","compositionStart","upperCanvas","upperCanvasWidth","upperCanvasHeight","_savedProps","_restoreEditingProps","isTextChanged","_removeExtraneousStyles","removeStyleFromTo","styleObj","cursorStart","cursorEnd","lineStart","charStart","lineEnd","charEnd","shiftLineStyles","numericChar","clonedStyles","numericLine","insertNewlineStyleObject","qty","copiedStyle","currentCharStyle","newLineStyles","somethingAdded","isEndOfLine","numIndex","styleCarriedOver","insertCharStyleObject","quantity","currentLineStyles","currentLineStylesCloned","numericIndex","newStyle","insertNewStyleBlock","insertedText","cursorLoc","addedLines","linesLength","setSelectionStartEndWithShift","setSelectionInBoundaries","__lastClickTime","__lastLastClickTime","__lastPointer","__newClickTime","newPointer","isTripleClick","_stopEvent","__lastIsEditing","__lastSelected","initMousedownHandler","initMouseupHandler","initClicks","doubleClickHandler","tripleClickHandler","_mouseDownHandler","setCursorByClick","_mouseDownHandlerBefore","currentActive","mouseOffset","prevWidth","_getNewSelectionStartFromOffset","distanceBtwLastCharAndCursor","distanceBtwNextCharAndCursor","onKeyDown","onKeyUp","onInput","copy","paste","onCompositionStart","onCompositionUpdate","onCompositionEnd","_clickHandlerInitialized","onClick","keysMap","keysMapRtl","ctrlKeysMapUp","ctrlKeysMapDown","keyMap","keyCode","ctrlKey","metaKey","stopImmediatePropagation","_copyDone","fromPaste","removedText","removeFrom","removeTo","nextText","charCount","nextCharCount","charDiff","textareaSelection","backDelete","copiedText","copiedTextStyle","compositionEnd","_getClipboardData","clipboardData","_getWidthBeforeCursor","widthBeforeCursor","getDownCursorOffset","isRight","selectionProp","_getSelectionForOffset","indexOnOtherLine","_getIndexOnLine","getUpCursorOffset","textBeforeCursor","charWidth","foundMatch","widthOfCharsOnLine","indexOnLine","leftEdge","rightEdge","offsetFromLeftEdge","moveCursorDown","_moveCursorUpOrDown","moveCursorUp","moveCursorWithShift","moveCursorWithoutShift","moveCursorLeft","_moveCursorLeftOrRight","_move","_moveLeft","_moveRight","moveCursorLeftWithoutShift","change","moveCursorLeftWithShift","moveCursorRight","moveCursorRightWithShift","moveCursorRightWithoutShift","changed","removeChars","insertChars","_getSVGLeftTopOffsets","textAndBg","_getSVGTextAndBg","textTop","textLeft","_wrapSVGTextAndBg","lineTop","textSpans","textTopOffset","textLeftOffset","_setSVGTextLineBg","_setSVGTextLineText","_createTextCharSpan","styleDecl","shouldUseWhitespace","styleProps","fillStyles","dySpan","_pushTextBgRect","fillColor","_getSVGLineTopOffset","lastHeight","Textbox","minWidth","dynamicMinWidth","__cachedLines","_wordJoiners","splitByGrapheme","_styleMap","_generateStyleMap","textInfo","realLineCount","realLineCharCount","isWrapping","nextOffset","shouldLimit","mapNextLine","_wrapText","desiredWidth","wrapped","_wrapLine","_measureWord","word","charOffset","_line","reservedSpace","words","infix","wordWidth","infixWidth","largestWordWidth","lineJustStarted","additionalSpace","getMinWidth","linesToKeep","scaleSkewStyleHandler","scaleStyleHandler","objectControls","ml","mr","mb","mtr","textBoxControls","DataView","getNative","hashClear","hashDelete","hashGet","hashHas","hashSet","Hash","entries","entry","has","listCacheClear","listCacheDelete","listCacheGet","listCacheHas","listCacheSet","ListCache","Map","mapCacheClear","mapCacheDelete","mapCacheGet","mapCacheHas","mapCacheSet","MapCache","Set","setCacheAdd","setCacheHas","SetCache","values","__data__","stackClear","stackDelete","stackGet","stackHas","stackSet","Stack","Symbol","WeakMap","iteratee","predicate","resIndex","baseTimes","isArguments","isBuffer","isIndex","isTypedArray","inherited","isArr","isArg","isBuff","skipIndexes","accumulator","initAccum","reAsciiWord","baseAssignValue","objValue","copyObject","keysIn","defineProperty","arrayEach","assignValue","baseAssign","baseAssignIn","cloneBuffer","copyArray","copySymbols","copySymbolsIn","getAllKeys","getAllKeysIn","getTag","initCloneArray","initCloneByTag","initCloneObject","isMap","isObject","isSet","argsTag","funcTag","objectTag","cloneableTags","baseClone","bitmask","customizer","isDeep","isFlat","isFull","tag","isFunc","stacked","subValue","objectCreate","baseCreate","baseForOwn","baseEach","createBaseEach","baseFor","createBaseFor","castPath","toKey","arrayPush","keysFunc","symbolsFunc","getRawTag","objectToString","symToStringTag","toStringTag","baseGetTag","isObjectLike","baseIsEqualDeep","baseIsEqual","equalArrays","equalByTag","equalObjects","arrayTag","equalFunc","objIsArr","othIsArr","objTag","othTag","objIsObj","othIsObj","isSameTag","objIsWrapped","othIsWrapped","objUnwrapped","othUnwrapped","matchData","noCustomizer","srcValue","COMPARE_PARTIAL_FLAG","isFunction","isMasked","toSource","reIsHostCtor","funcProto","Function","objectProto","funcToString","reIsNative","isLength","typedArrayTags","baseMatches","baseMatchesProperty","identity","isPrototype","nativeKeys","nativeKeysIn","isProto","isArrayLike","collection","baseIsMatch","getMatchData","matchesStrictComparable","hasIn","isKey","isStrictComparable","baseGet","arrayMap","isSymbol","symbolProto","symbolToString","baseToString","trimmedEndIndex","reTrimStart","func","stringToPath","baseSlice","arrayBuffer","byteLength","freeExports","freeModule","allocUnsafe","cloneArrayBuffer","dataView","byteOffset","reFlags","regexp","symbolValueOf","symbol","typedArray","isNew","getSymbols","getSymbolsIn","coreJsData","eachFunc","fromRight","iterable","castSlice","hasUnicode","stringToArray","strSymbols","trailing","arrayReduce","deburr","reApos","deburrLetter","basePropertyOf","arraySome","cacheHas","isPartial","arrLength","othLength","arrStacked","othStacked","arrValue","othValue","compared","othIndex","mapToArray","setToArray","convert","objProps","objLength","objStacked","skipCtor","objCtor","othCtor","freeGlobal","baseGetAllKeys","isKeyable","baseIsNative","getValue","getPrototype","overArg","getPrototypeOf","nativeObjectToString","isOwn","unmasked","arrayFilter","stubArray","nativeGetSymbols","getOwnPropertySymbols","mapTag","promiseTag","setTag","weakMapTag","dataViewTag","dataViewCtorString","mapCtorString","promiseCtorString","setCtorString","weakMapCtorString","Ctor","ctorString","hasFunc","reHasUnicode","reHasUnicodeWord","nativeCreate","input","cloneDataView","cloneRegExp","cloneSymbol","cloneTypedArray","reIsUint","reIsDeepProp","reIsPlainProp","uid","maskSrcKey","IE_PROTO","assocIndexOf","getMapData","memoize","freeProcess","nodeUtil","require","binding","freeSelf","pairs","LARGE_ARRAY_SIZE","asciiToArray","unicodeToArray","memoizeCapped","rePropName","reEscapeChar","quote","subString","reWhitespace","rsAstralRange","rsAstral","rsCombo","rsFitz","rsNonAstral","rsRegional","rsSurrPair","reOptMod","rsModifier","rsOptVar","rsSeq","rsSymbol","reUnicode","rsDingbatRange","rsLowerRange","rsUpperRange","rsBreakRange","rsMathOpRange","rsBreak","rsDigits","rsDingbat","rsLower","rsMisc","rsUpper","rsMiscLower","rsMiscUpper","rsOptContrLower","rsOptContrUpper","rsEmoji","reUnicodeWord","camelCase","createCompounder","upperFirst","CLONE_DEEP_FLAG","toNumber","nativeMax","nativeMin","wait","lastArgs","lastThis","maxWait","timerId","lastCallTime","lastInvokeTime","leading","maxing","invokeFunc","thisArg","shouldInvoke","timeSinceLastCall","timerExpired","trailingEdge","timeWaiting","remainingWait","debounced","isInvoking","leadingEdge","flush","reLatin","reComboMark","castFunction","baseHasIn","hasPath","baseIsArguments","stubFalse","baseIsMap","baseUnary","nodeIsMap","objectCtorString","baseIsSet","nodeIsSet","baseIsTypedArray","nodeIsTypedArray","arrayLikeKeys","baseKeys","baseKeysIn","baseIteratee","baseMap","resolver","memoized","Cache","baseProperty","basePropertyDeep","baseTrim","reIsBadHex","reIsBinary","reIsOctal","freeParseInt","isBinary","createCaseFirst","asciiWords","hasUnicodeWord","unicodeWords","guard","modules","installedModules","moduleId","getter","enumerable","__esModule","ns","__webpack_require__","extendStatics","__extends","__","INVALID_BYTE","Coder","_paddingCharacter","encodedLength","encode","_encodeByte","maxDecodedLength","decodedLength","_getPaddingLength","decode","paddingLength","op","haveBad","v0","v1","v2","v3","_decodeChar","fromCharCode","stdCoder","URLSafeCoder","_super","urlSafeCoder","encodeURLSafe","decodeURLSafe","INVALID_UTF16","INVALID_UTF8","chars","n1","n2","n3","nacl","gf","init","Float64Array","randombytes","_0","_9","gf0","gf1","_121665","D","D2","X","Y","I","ts64","vn","yi","crypto_verify_16","crypto_verify_32","crypto_core_salsa20","inp","j0","j1","j2","j3","j4","j5","j6","j7","j8","j9","j10","j11","j12","j13","j14","j15","x4","x5","x6","x7","x8","x9","x10","x11","x12","x13","x14","x15","core_salsa20","crypto_core_hsalsa20","core_hsalsa20","sigma","crypto_stream_salsa20_xor","cpos","mpos","z","crypto_stream_salsa20","crypto_stream","sn","crypto_stream_xor","poly1305","t0","t3","t4","t5","t6","t7","Uint16Array","pad","leftover","fin","crypto_onetimeauth","outpos","update","crypto_onetimeauth_verify","hpos","crypto_secretbox","crypto_secretbox_open","set25519","car25519","sel25519","pack25519","neq25519","par25519","unpack25519","Z","t8","t9","t10","t11","t12","t13","t14","t15","t16","t17","t18","t19","t20","t21","t22","t23","t24","t25","t26","t27","t28","t29","t30","b0","b3","b4","b5","b6","b7","b8","b9","b10","b11","b12","b13","b14","b15","S","inv25519","pow2523","crypto_scalarmult","x32","subarray","x16","crypto_scalarmult_base","crypto_box_keypair","crypto_box_beforenm","blocks","bytes","d0","d1","d2","d3","d4","d5","d6","d7","d8","d9","hibit","h0","h1","h2","h3","h4","h5","h6","h7","h8","h9","r0","r3","r4","r5","r6","r7","r8","r9","mac","macpos","want","crypto_box_afternm","crypto_box_open_afternm","K","crypto_hashblocks_hl","hh","hl","bh0","bh1","bh2","bh3","bh4","bh5","bh6","bh7","bl0","bl1","bl2","bl3","bl4","bl5","bl6","bl7","Int32Array","wl","ah0","ah1","ah2","ah3","ah4","ah5","ah6","ah7","al0","al1","al2","al3","al4","al5","al6","al7","crypto_hash","cswap","pack","tx","ty","zi","scalarmult","scalarbase","crypto_sign_keypair","pk","sk","seeded","L","modL","carry","crypto_sign","sm","smlen","crypto_sign_open","chk","den","den2","den4","den6","unpackneg","crypto","crypto_sign_BYTES","crypto_sign_PUBLICKEYBYTES","crypto_sign_SECRETKEYBYTES","checkLengths","checkArrayTypes","cleanup","lowlevel","crypto_box","crypto_box_open","crypto_secretbox_KEYBYTES","crypto_secretbox_NONCEBYTES","crypto_secretbox_ZEROBYTES","crypto_secretbox_BOXZEROBYTES","crypto_scalarmult_BYTES","crypto_scalarmult_SCALARBYTES","crypto_box_PUBLICKEYBYTES","crypto_box_SECRETKEYBYTES","crypto_box_BEFORENMBYTES","crypto_box_NONCEBYTES","crypto_box_ZEROBYTES","crypto_box_BOXZEROBYTES","crypto_sign_SEEDBYTES","crypto_hash_BYTES","randomBytes","secretbox","msg","nonce","keyLength","nonceLength","overheadLength","scalarMult","scalarLength","groupElementLength","publicKey","secretKey","checkBoxLengths","keyPair","fromSecretKey","publicKeyLength","secretKeyLength","sharedKeyLength","signedMsg","tmp","mlen","detached","sig","verify","fromSeed","seed","seedLength","signatureLength","hashLength","setPRNG","msCrypto","getRandomValues","default","__webpack_exports__","AuthRequestType","ScriptReceiverFactory","lastId","called","callbackWrapper","receiver","ScriptReceivers","defaults","transport","dependency_loader","DependencyLoader","receivers","loading","runtime","createScriptRequest","getPath","successCallback","wasSuccessful","getRoot","getDocument","useTLS","cdn_https","cdn_http","suffix","DependenciesReceivers","Dependencies","urlStore","baseUrl","urls","authenticationEndpoint","authorizationEndpoint","javascriptQuickStart","triggeringClientEvents","encryptedChannelSupport","fullUrl","url_store","urlObj","urlPrefix","BadEventName","_newTarget","BadChannelName","RequestTimedOut","TransportPriorityTooLow","TransportClosed","UnsupportedFeature","UnsupportedTransport","UnsupportedStrategy","HTTPAuthError","xhr_auth","query","authOptions","authRequestType","createXHR","headerName","headers","headersProvider","dynamicHeaders","responseText","UserAuthentication","ChannelAuthorization","b64chars","b64tab","base64_i","cb_utob","cc","utob","cb_encode","ccc","padlen","ord","btoa","abstract_timer","Timer","timer","isRunning","ensureAborted","timers_extends","timers_clearTimeout","timers_clearInterval","clearInterval","OneOffTimer","PeriodicTimer","setInterval","Util","defer","boundArguments","sources","extensions","safeJSONStringify","arrayIndexOf","nativeIndexOf","objectApply","_","filterObject","any","buildQueryString","encodeParamsObject","derez","nu","$ref","logger_Logger","Logger","globalLog","globalLogWarn","globalLogError","defaultLoggingFunction","core_pusher","logToConsole","jsonp_auth","callbackName","nextAuthCallbackID","auth_callbacks","callback_name","head","insertBefore","script_request","ScriptRequest","errorString","charset","async","errorScript","nextSibling","jsonp_request","JSONPRequest","jsonp_timeline","getAgent","sender","createJSONPRequest","getGenericURL","baseScheme","params","hostTLS","hostNonTLS","getGenericPath","queryString","ws","getInitial","httpPath","http","sockjs","callback_registry","CallbackRegistry","_callbacks","prefixedEventName","names","removeCallback","removeAllCallbacks","dispatcher","Dispatcher","failThrough","global_callbacks","bind_global","unbind","unbind_global","unbind_all","emit","transport_connection_extends","transport_connection_TransportConnection","TransportConnection","hooks","priority","transportConnectionInitializer","timeline","activityTimeout","generateUniqueID","handlesActivityChecks","supportsPing","connect","socket","getSocket","changeState","bindListeners","close","ping","onOpen","beforeOpen","onopen","buildTimelineMessage","onClose","closeEvent","wasClean","unbindListeners","onMessage","onActivity","onclose","onmessage","onactivity","cid","transport_connection","transports_transport","Transport","environment","createConnection","WSTransport","isInitialized","getWebSocketAPI","createWebSocket","httpConfiguration","streamingConfiguration","HTTPFactory","createStreamingSocket","pollingConfiguration","createPollingSocket","xhrConfiguration","isXHRSupported","transports","xhr_streaming","xhr_polling","SockJSTransport","SockJS","js_path","ignore_null_origin","ignoreNullOrigin","xdrConfiguration","isXDRSupported","XDRStreamingTransport","XDRPollingTransport","xdr_streaming","xdr_polling","transports_transports","net_info_extends","net_info_Network","NetInfo","isOnline","onLine","assistant_to_the_transport_manager","AssistantToTheTransportManager","manager","minPingDelay","maxPingDelay","pingDelay","connection","openTimestamp","onClosed","reportDeath","lifespan","isAlive","Protocol","decodeMessage","messageEvent","messageData","pusherEventData","pusherEvent","channel","user_id","encodeMessage","processHandshake","activity_timeout","socket_id","getCloseAction","getCloseError","protocol_protocol","connection_extends","connection_connection","Connection","send_event","listeners","activity","closed","handleCloseEvent","connection_handshake","Handshake","timeline_sender","TimelineSender","TimelineTransport","channel_extends","channels_channel","Channel","pusher","subscribed","subscriptionPending","subscriptionCancelled","authorize","socketId","auth","trigger","disconnect","handleSubscriptionSucceededEvent","handleSubscriptionCountEvent","unsubscribe","subscription_count","subscriptionCount","subscribe","channel_data","cancelSubscription","reinstateSubscription","private_channel_extends","PrivateChannel","channelAuthorizer","channelName","private_channel","members","Members","each","member","setMyID","myID","onSubscription","subscriptionData","presence","count","me","addMember","memberData","user_info","removeMember","presence_channel_extends","presence_channel","PresenceChannel","authData","generator","channelData","label","sent","trys","ops","done","step","__generator","_a","signinDonePromise","user_data","P","fulfilled","rejected","handleInternalEvent","addedMember","removedMember","utf8","base64","encrypted_channel_extends","encrypted_channel","EncryptedChannel","sharedSecret","handleEncryptedEvent","ciphertext","cipherText","getDataToEmit","raw","connection_manager_extends","connection_manager","ConnectionManager","usingTLS","errorCallbacks","buildErrorCallbacks","connectionCallbacks","buildConnectionCallbacks","handshakeCallbacks","buildHandshakeCallbacks","Network","getNetwork","netinfo","retryIn","sendActivityCheck","updateStrategy","runner","strategy","updateState","startConnecting","setUnavailableTimer","disconnectInternally","isUsingTLS","handshake","handshakeError","abortConnecting","clearRetryTimer","clearUnavailableTimer","abandonConnection","getStrategy","retryTimer","unavailableTimer","unavailableTimeout","stopActivityCheck","activityTimer","pongTimeout","pong_timed_out","resetActivityCheck","shouldRetry","connected","setConnection","withErrorEmitted","tls_only","refused","backoff","retry","newState","previousState","newStateDescription","channels","Channels","createEncryptedChannel","errMsg","createPrivateChannel","createPresenceChannel","createChannel","all","createChannels","createConnectionManager","createTimelineSender","createHandshake","createAssistantToTheTransportManager","transport_manager","TransportManager","livesLeft","lives","getAssistant","sequential_strategy","SequentialStrategy","strategies","loop","failFast","timeout","timeoutLimit","minPriority","tryNextStrategy","tryStrategy","forceMinPriority","best_connected_ever_strategy","BestConnectedEverStrategy","callbackBuilder","runners","rs","collections_all","allRunnersFailed","abortRunner","aborted","cached_strategy_CachedStrategy","CachedStrategy","ttl","getLocalStorage","serializedCache","getTransportCacheKey","flushTransportCache","fetchTransportCache","cached","latency","startTimestamp","storeTransportCache","cached_strategy","delayed_strategy","DelayedStrategy","if_strategy","IfStrategy","trueBranch","falseBranch","first_connected_strategy","FirstConnectedStrategy","testSupportsStrategy","State","http_xdomain_request","getRequest","xdr","ontimeout","onprogress","onChunk","abortRequest","http_request_extends","http_request","HTTPRequest","unloader","addUnloadListener","removeUnloadListener","advanceBuffer","isBufferTooLong","unreadData","endOfLinePosition","autoIncrement","getUniqueURL","separator","randomNumber","randomInt","TimelineLevel","http_socket","HTTPSocket","randomString","getLocation","CONNECTING","openStream","sendRaw","sendHeartbeat","OPEN","createSocketRequest","reconnect","closeStream","CLOSED","onEvent","onHeartbeat","hostname","urlParts","stream","getReceiveURL","onFinished","http_streaming_socket","http_polling_socket","http_xhr_request","getXHRAPI","getDefaultStrategy","baseOptions","defineTransport","definedTransports","defineTransportStrategy","wsStrategy","ws_options","wsHost","wsPort","wssPort","wsPath","wss_options","sockjs_options","httpHost","httpPort","httpsPort","timeouts","ws_manager","streaming_manager","ws_transport","wss_transport","sockjs_transport","xhr_streaming_transport","xdr_streaming_transport","xhr_polling_transport","xdr_polling_transport","ws_loop","wss_loop","sockjs_loop","streaming_loop","polling_loop","http_loop","http_fallback_loop","Transports","createSocket","createRequest","http_http","WebSocket","MozWebSocket","setup","PusherClass","Pusher","initializeOnDocumentBody","onDocumentBody","ready","getProtocol","getAuthorizers","ajax","jsonp","createXMLHttpRequest","createMicrosoftXHR","ActiveXObject","createXDR","Constructor","withCredentials","documentProtocol","detachEvent","Uint32Array","timeline_level","timeline_timeline","Timeline","uniqueID","level","limit","ERROR","INFO","DEBUG","sendfn","bundle","lib","cluster","transport_strategy","TransportStrategy","failAttempt","onInitialized","serializedTransport","strategy_builder_Transports","strategy_builder_defineTransport","transportClass","enabledTransports","disabledTransports","strategy_builder_UnsupportedStrategy","deferred","__assign","getHttpHost","getWebsocketHost","getWebsocketHostFromCluster","shouldUseTLS","forceTLS","getEnableStatsConfig","enableStats","disableStats","buildUserAuthenticator","userAuthentication","paramsProvider","dynamicParams","composeChannelQuery","user_authenticator","buildChannelAuthorizer","channelAuthorization","authTransport","authEndpoint","customHandler","channelAuthorizerGenerator","deprecatedAuthorizerOptions","ChannelAuthorizerProxy","authorizer","buildChannelAuth","channel_authorizer_composeChannelQuery","channel_authorizer","watchlist_extends","watchlist","WatchlistFacade","bindWatchlistInternalEvent","watchlistEvent","user_extends","UserFacade","signin_requested","serverToUserChannel","_signinDoneResolve","_onAuthorize","_cleanup","_signin","_newSigninPromiseIfNeeded","_onSigninSuccess","signin","userAuthenticator","_subscribeChannels","res","rej","flat_promise","setDone","pusher_Pusher","app_key","checkAppKey","statsHost","timelineParams","global_emitter","sessionID","getClientFeatures","timelineSender","subscribeAll","internal","isReady","allChannels","timelineSenderTimer","event_name","channel_name","Runtime","nacl_fast","pusher_with_encryption_extends","pusher_with_encryption_PusherWithEncryption","PusherWithEncryption"],"sourceRoot":""}