{"version":3,"file":"static/js/96456.043a8f38.chunk.js","mappings":"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","sources":["../node_modules/cropperjs/dist/cropper.js","../node_modules/react-cropper/dist/react-cropper.es.js"],"sourcesContent":["/*!\n * Cropper.js v1.6.2\n * https://fengyuanchen.github.io/cropperjs\n *\n * Copyright 2015-present Chen Fengyuan\n * Released under the MIT license\n *\n * Date: 2024-04-21T07:43:05.335Z\n */\n\n(function (global, factory) {\n  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n  typeof define === 'function' && define.amd ? define(factory) :\n  (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Cropper = factory());\n})(this, (function () { 'use strict';\n\n  function ownKeys(e, r) {\n    var t = Object.keys(e);\n    if (Object.getOwnPropertySymbols) {\n      var o = Object.getOwnPropertySymbols(e);\n      r && (o = o.filter(function (r) {\n        return Object.getOwnPropertyDescriptor(e, r).enumerable;\n      })), t.push.apply(t, o);\n    }\n    return t;\n  }\n  function _objectSpread2(e) {\n    for (var r = 1; r < arguments.length; r++) {\n      var t = null != arguments[r] ? arguments[r] : {};\n      r % 2 ? ownKeys(Object(t), !0).forEach(function (r) {\n        _defineProperty(e, r, t[r]);\n      }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) {\n        Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r));\n      });\n    }\n    return e;\n  }\n  function _toPrimitive(t, r) {\n    if (\"object\" != typeof t || !t) return t;\n    var e = t[Symbol.toPrimitive];\n    if (void 0 !== e) {\n      var i = e.call(t, r || \"default\");\n      if (\"object\" != typeof i) return i;\n      throw new TypeError(\"@@toPrimitive must return a primitive value.\");\n    }\n    return (\"string\" === r ? String : Number)(t);\n  }\n  function _toPropertyKey(t) {\n    var i = _toPrimitive(t, \"string\");\n    return \"symbol\" == typeof i ? i : i + \"\";\n  }\n  function _typeof(o) {\n    \"@babel/helpers - typeof\";\n\n    return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) {\n      return typeof o;\n    } : function (o) {\n      return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o;\n    }, _typeof(o);\n  }\n  function _classCallCheck(instance, Constructor) {\n    if (!(instance instanceof Constructor)) {\n      throw new TypeError(\"Cannot call a class as a function\");\n    }\n  }\n  function _defineProperties(target, props) {\n    for (var i = 0; i < props.length; i++) {\n      var descriptor = props[i];\n      descriptor.enumerable = descriptor.enumerable || false;\n      descriptor.configurable = true;\n      if (\"value\" in descriptor) descriptor.writable = true;\n      Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor);\n    }\n  }\n  function _createClass(Constructor, protoProps, staticProps) {\n    if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n    if (staticProps) _defineProperties(Constructor, staticProps);\n    Object.defineProperty(Constructor, \"prototype\", {\n      writable: false\n    });\n    return Constructor;\n  }\n  function _defineProperty(obj, key, value) {\n    key = _toPropertyKey(key);\n    if (key in obj) {\n      Object.defineProperty(obj, key, {\n        value: value,\n        enumerable: true,\n        configurable: true,\n        writable: true\n      });\n    } else {\n      obj[key] = value;\n    }\n    return obj;\n  }\n  function _toConsumableArray(arr) {\n    return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();\n  }\n  function _arrayWithoutHoles(arr) {\n    if (Array.isArray(arr)) return _arrayLikeToArray(arr);\n  }\n  function _iterableToArray(iter) {\n    if (typeof Symbol !== \"undefined\" && iter[Symbol.iterator] != null || iter[\"@@iterator\"] != null) return Array.from(iter);\n  }\n  function _unsupportedIterableToArray(o, minLen) {\n    if (!o) return;\n    if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n    var n = Object.prototype.toString.call(o).slice(8, -1);\n    if (n === \"Object\" && o.constructor) n = o.constructor.name;\n    if (n === \"Map\" || n === \"Set\") return Array.from(o);\n    if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n  }\n  function _arrayLikeToArray(arr, len) {\n    if (len == null || len > arr.length) len = arr.length;\n    for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];\n    return arr2;\n  }\n  function _nonIterableSpread() {\n    throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n  }\n\n  var IS_BROWSER = typeof window !== 'undefined' && typeof window.document !== 'undefined';\n  var WINDOW = IS_BROWSER ? window : {};\n  var IS_TOUCH_DEVICE = IS_BROWSER && WINDOW.document.documentElement ? 'ontouchstart' in WINDOW.document.documentElement : false;\n  var HAS_POINTER_EVENT = IS_BROWSER ? 'PointerEvent' in WINDOW : false;\n  var NAMESPACE = 'cropper';\n\n  // Actions\n  var ACTION_ALL = 'all';\n  var ACTION_CROP = 'crop';\n  var ACTION_MOVE = 'move';\n  var ACTION_ZOOM = 'zoom';\n  var ACTION_EAST = 'e';\n  var ACTION_WEST = 'w';\n  var ACTION_SOUTH = 's';\n  var ACTION_NORTH = 'n';\n  var ACTION_NORTH_EAST = 'ne';\n  var ACTION_NORTH_WEST = 'nw';\n  var ACTION_SOUTH_EAST = 'se';\n  var ACTION_SOUTH_WEST = 'sw';\n\n  // Classes\n  var CLASS_CROP = \"\".concat(NAMESPACE, \"-crop\");\n  var CLASS_DISABLED = \"\".concat(NAMESPACE, \"-disabled\");\n  var CLASS_HIDDEN = \"\".concat(NAMESPACE, \"-hidden\");\n  var CLASS_HIDE = \"\".concat(NAMESPACE, \"-hide\");\n  var CLASS_INVISIBLE = \"\".concat(NAMESPACE, \"-invisible\");\n  var CLASS_MODAL = \"\".concat(NAMESPACE, \"-modal\");\n  var CLASS_MOVE = \"\".concat(NAMESPACE, \"-move\");\n\n  // Data keys\n  var DATA_ACTION = \"\".concat(NAMESPACE, \"Action\");\n  var DATA_PREVIEW = \"\".concat(NAMESPACE, \"Preview\");\n\n  // Drag modes\n  var DRAG_MODE_CROP = 'crop';\n  var DRAG_MODE_MOVE = 'move';\n  var DRAG_MODE_NONE = 'none';\n\n  // Events\n  var EVENT_CROP = 'crop';\n  var EVENT_CROP_END = 'cropend';\n  var EVENT_CROP_MOVE = 'cropmove';\n  var EVENT_CROP_START = 'cropstart';\n  var EVENT_DBLCLICK = 'dblclick';\n  var EVENT_TOUCH_START = IS_TOUCH_DEVICE ? 'touchstart' : 'mousedown';\n  var EVENT_TOUCH_MOVE = IS_TOUCH_DEVICE ? 'touchmove' : 'mousemove';\n  var EVENT_TOUCH_END = IS_TOUCH_DEVICE ? 'touchend touchcancel' : 'mouseup';\n  var EVENT_POINTER_DOWN = HAS_POINTER_EVENT ? 'pointerdown' : EVENT_TOUCH_START;\n  var EVENT_POINTER_MOVE = HAS_POINTER_EVENT ? 'pointermove' : EVENT_TOUCH_MOVE;\n  var EVENT_POINTER_UP = HAS_POINTER_EVENT ? 'pointerup pointercancel' : EVENT_TOUCH_END;\n  var EVENT_READY = 'ready';\n  var EVENT_RESIZE = 'resize';\n  var EVENT_WHEEL = 'wheel';\n  var EVENT_ZOOM = 'zoom';\n\n  // Mime types\n  var MIME_TYPE_JPEG = 'image/jpeg';\n\n  // RegExps\n  var REGEXP_ACTIONS = /^e|w|s|n|se|sw|ne|nw|all|crop|move|zoom$/;\n  var REGEXP_DATA_URL = /^data:/;\n  var REGEXP_DATA_URL_JPEG = /^data:image\\/jpeg;base64,/;\n  var REGEXP_TAG_NAME = /^img|canvas$/i;\n\n  // Misc\n  // Inspired by the default width and height of a canvas element.\n  var MIN_CONTAINER_WIDTH = 200;\n  var MIN_CONTAINER_HEIGHT = 100;\n\n  var DEFAULTS = {\n    // Define the view mode of the cropper\n    viewMode: 0,\n    // 0, 1, 2, 3\n\n    // Define the dragging mode of the cropper\n    dragMode: DRAG_MODE_CROP,\n    // 'crop', 'move' or 'none'\n\n    // Define the initial aspect ratio of the crop box\n    initialAspectRatio: NaN,\n    // Define the aspect ratio of the crop box\n    aspectRatio: NaN,\n    // An object with the previous cropping result data\n    data: null,\n    // A selector for adding extra containers to preview\n    preview: '',\n    // Re-render the cropper when resize the window\n    responsive: true,\n    // Restore the cropped area after resize the window\n    restore: true,\n    // Check if the current image is a cross-origin image\n    checkCrossOrigin: true,\n    // Check the current image's Exif Orientation information\n    checkOrientation: true,\n    // Show the black modal\n    modal: true,\n    // Show the dashed lines for guiding\n    guides: true,\n    // Show the center indicator for guiding\n    center: true,\n    // Show the white modal to highlight the crop box\n    highlight: true,\n    // Show the grid background\n    background: true,\n    // Enable to crop the image automatically when initialize\n    autoCrop: true,\n    // Define the percentage of automatic cropping area when initializes\n    autoCropArea: 0.8,\n    // Enable to move the image\n    movable: true,\n    // Enable to rotate the image\n    rotatable: true,\n    // Enable to scale the image\n    scalable: true,\n    // Enable to zoom the image\n    zoomable: true,\n    // Enable to zoom the image by dragging touch\n    zoomOnTouch: true,\n    // Enable to zoom the image by wheeling mouse\n    zoomOnWheel: true,\n    // Define zoom ratio when zoom the image by wheeling mouse\n    wheelZoomRatio: 0.1,\n    // Enable to move the crop box\n    cropBoxMovable: true,\n    // Enable to resize the crop box\n    cropBoxResizable: true,\n    // Toggle drag mode between \"crop\" and \"move\" when click twice on the cropper\n    toggleDragModeOnDblclick: true,\n    // Size limitation\n    minCanvasWidth: 0,\n    minCanvasHeight: 0,\n    minCropBoxWidth: 0,\n    minCropBoxHeight: 0,\n    minContainerWidth: MIN_CONTAINER_WIDTH,\n    minContainerHeight: MIN_CONTAINER_HEIGHT,\n    // Shortcuts of events\n    ready: null,\n    cropstart: null,\n    cropmove: null,\n    cropend: null,\n    crop: null,\n    zoom: null\n  };\n\n  var TEMPLATE = '<div class=\"cropper-container\" touch-action=\"none\">' + '<div class=\"cropper-wrap-box\">' + '<div class=\"cropper-canvas\"></div>' + '</div>' + '<div class=\"cropper-drag-box\"></div>' + '<div class=\"cropper-crop-box\">' + '<span class=\"cropper-view-box\"></span>' + '<span class=\"cropper-dashed dashed-h\"></span>' + '<span class=\"cropper-dashed dashed-v\"></span>' + '<span class=\"cropper-center\"></span>' + '<span class=\"cropper-face\"></span>' + '<span class=\"cropper-line line-e\" data-cropper-action=\"e\"></span>' + '<span class=\"cropper-line line-n\" data-cropper-action=\"n\"></span>' + '<span class=\"cropper-line line-w\" data-cropper-action=\"w\"></span>' + '<span class=\"cropper-line line-s\" data-cropper-action=\"s\"></span>' + '<span class=\"cropper-point point-e\" data-cropper-action=\"e\"></span>' + '<span class=\"cropper-point point-n\" data-cropper-action=\"n\"></span>' + '<span class=\"cropper-point point-w\" data-cropper-action=\"w\"></span>' + '<span class=\"cropper-point point-s\" data-cropper-action=\"s\"></span>' + '<span class=\"cropper-point point-ne\" data-cropper-action=\"ne\"></span>' + '<span class=\"cropper-point point-nw\" data-cropper-action=\"nw\"></span>' + '<span class=\"cropper-point point-sw\" data-cropper-action=\"sw\"></span>' + '<span class=\"cropper-point point-se\" data-cropper-action=\"se\"></span>' + '</div>' + '</div>';\n\n  /**\n   * Check if the given value is not a number.\n   */\n  var isNaN = Number.isNaN || WINDOW.isNaN;\n\n  /**\n   * Check if the given value is a number.\n   * @param {*} value - The value to check.\n   * @returns {boolean} Returns `true` if the given value is a number, else `false`.\n   */\n  function isNumber(value) {\n    return typeof value === 'number' && !isNaN(value);\n  }\n\n  /**\n   * Check if the given value is a positive number.\n   * @param {*} value - The value to check.\n   * @returns {boolean} Returns `true` if the given value is a positive number, else `false`.\n   */\n  var isPositiveNumber = function isPositiveNumber(value) {\n    return value > 0 && value < Infinity;\n  };\n\n  /**\n   * Check if the given value is undefined.\n   * @param {*} value - The value to check.\n   * @returns {boolean} Returns `true` if the given value is undefined, else `false`.\n   */\n  function isUndefined(value) {\n    return typeof value === 'undefined';\n  }\n\n  /**\n   * Check if the given value is an object.\n   * @param {*} value - The value to check.\n   * @returns {boolean} Returns `true` if the given value is an object, else `false`.\n   */\n  function isObject(value) {\n    return _typeof(value) === 'object' && value !== null;\n  }\n  var hasOwnProperty = Object.prototype.hasOwnProperty;\n\n  /**\n   * Check if the given value is a plain object.\n   * @param {*} value - The value to check.\n   * @returns {boolean} Returns `true` if the given value is a plain object, else `false`.\n   */\n  function isPlainObject(value) {\n    if (!isObject(value)) {\n      return false;\n    }\n    try {\n      var _constructor = value.constructor;\n      var prototype = _constructor.prototype;\n      return _constructor && prototype && hasOwnProperty.call(prototype, 'isPrototypeOf');\n    } catch (error) {\n      return false;\n    }\n  }\n\n  /**\n   * Check if the given value is a function.\n   * @param {*} value - The value to check.\n   * @returns {boolean} Returns `true` if the given value is a function, else `false`.\n   */\n  function isFunction(value) {\n    return typeof value === 'function';\n  }\n  var slice = Array.prototype.slice;\n\n  /**\n   * Convert array-like or iterable object to an array.\n   * @param {*} value - The value to convert.\n   * @returns {Array} Returns a new array.\n   */\n  function toArray(value) {\n    return Array.from ? Array.from(value) : slice.call(value);\n  }\n\n  /**\n   * Iterate the given data.\n   * @param {*} data - The data to iterate.\n   * @param {Function} callback - The process function for each element.\n   * @returns {*} The original data.\n   */\n  function forEach(data, callback) {\n    if (data && isFunction(callback)) {\n      if (Array.isArray(data) || isNumber(data.length) /* array-like */) {\n        toArray(data).forEach(function (value, key) {\n          callback.call(data, value, key, data);\n        });\n      } else if (isObject(data)) {\n        Object.keys(data).forEach(function (key) {\n          callback.call(data, data[key], key, data);\n        });\n      }\n    }\n    return data;\n  }\n\n  /**\n   * Extend the given object.\n   * @param {*} target - The target object to extend.\n   * @param {*} args - The rest objects for merging to the target object.\n   * @returns {Object} The extended object.\n   */\n  var assign = Object.assign || function assign(target) {\n    for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n      args[_key - 1] = arguments[_key];\n    }\n    if (isObject(target) && args.length > 0) {\n      args.forEach(function (arg) {\n        if (isObject(arg)) {\n          Object.keys(arg).forEach(function (key) {\n            target[key] = arg[key];\n          });\n        }\n      });\n    }\n    return target;\n  };\n  var REGEXP_DECIMALS = /\\.\\d*(?:0|9){12}\\d*$/;\n\n  /**\n   * Normalize decimal number.\n   * Check out {@link https://0.30000000000000004.com/}\n   * @param {number} value - The value to normalize.\n   * @param {number} [times=100000000000] - The times for normalizing.\n   * @returns {number} Returns the normalized number.\n   */\n  function normalizeDecimalNumber(value) {\n    var times = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 100000000000;\n    return REGEXP_DECIMALS.test(value) ? Math.round(value * times) / times : value;\n  }\n  var REGEXP_SUFFIX = /^width|height|left|top|marginLeft|marginTop$/;\n\n  /**\n   * Apply styles to the given element.\n   * @param {Element} element - The target element.\n   * @param {Object} styles - The styles for applying.\n   */\n  function setStyle(element, styles) {\n    var style = element.style;\n    forEach(styles, function (value, property) {\n      if (REGEXP_SUFFIX.test(property) && isNumber(value)) {\n        value = \"\".concat(value, \"px\");\n      }\n      style[property] = value;\n    });\n  }\n\n  /**\n   * Check if the given element has a special class.\n   * @param {Element} element - The element to check.\n   * @param {string} value - The class to search.\n   * @returns {boolean} Returns `true` if the special class was found.\n   */\n  function hasClass(element, value) {\n    return element.classList ? element.classList.contains(value) : element.className.indexOf(value) > -1;\n  }\n\n  /**\n   * Add classes to the given element.\n   * @param {Element} element - The target element.\n   * @param {string} value - The classes to be added.\n   */\n  function addClass(element, value) {\n    if (!value) {\n      return;\n    }\n    if (isNumber(element.length)) {\n      forEach(element, function (elem) {\n        addClass(elem, value);\n      });\n      return;\n    }\n    if (element.classList) {\n      element.classList.add(value);\n      return;\n    }\n    var className = element.className.trim();\n    if (!className) {\n      element.className = value;\n    } else if (className.indexOf(value) < 0) {\n      element.className = \"\".concat(className, \" \").concat(value);\n    }\n  }\n\n  /**\n   * Remove classes from the given element.\n   * @param {Element} element - The target element.\n   * @param {string} value - The classes to be removed.\n   */\n  function removeClass(element, value) {\n    if (!value) {\n      return;\n    }\n    if (isNumber(element.length)) {\n      forEach(element, function (elem) {\n        removeClass(elem, value);\n      });\n      return;\n    }\n    if (element.classList) {\n      element.classList.remove(value);\n      return;\n    }\n    if (element.className.indexOf(value) >= 0) {\n      element.className = element.className.replace(value, '');\n    }\n  }\n\n  /**\n   * Add or remove classes from the given element.\n   * @param {Element} element - The target element.\n   * @param {string} value - The classes to be toggled.\n   * @param {boolean} added - Add only.\n   */\n  function toggleClass(element, value, added) {\n    if (!value) {\n      return;\n    }\n    if (isNumber(element.length)) {\n      forEach(element, function (elem) {\n        toggleClass(elem, value, added);\n      });\n      return;\n    }\n\n    // IE10-11 doesn't support the second parameter of `classList.toggle`\n    if (added) {\n      addClass(element, value);\n    } else {\n      removeClass(element, value);\n    }\n  }\n  var REGEXP_CAMEL_CASE = /([a-z\\d])([A-Z])/g;\n\n  /**\n   * Transform the given string from camelCase to kebab-case\n   * @param {string} value - The value to transform.\n   * @returns {string} The transformed value.\n   */\n  function toParamCase(value) {\n    return value.replace(REGEXP_CAMEL_CASE, '$1-$2').toLowerCase();\n  }\n\n  /**\n   * Get data from the given element.\n   * @param {Element} element - The target element.\n   * @param {string} name - The data key to get.\n   * @returns {string} The data value.\n   */\n  function getData(element, name) {\n    if (isObject(element[name])) {\n      return element[name];\n    }\n    if (element.dataset) {\n      return element.dataset[name];\n    }\n    return element.getAttribute(\"data-\".concat(toParamCase(name)));\n  }\n\n  /**\n   * Set data to the given element.\n   * @param {Element} element - The target element.\n   * @param {string} name - The data key to set.\n   * @param {string} data - The data value.\n   */\n  function setData(element, name, data) {\n    if (isObject(data)) {\n      element[name] = data;\n    } else if (element.dataset) {\n      element.dataset[name] = data;\n    } else {\n      element.setAttribute(\"data-\".concat(toParamCase(name)), data);\n    }\n  }\n\n  /**\n   * Remove data from the given element.\n   * @param {Element} element - The target element.\n   * @param {string} name - The data key to remove.\n   */\n  function removeData(element, name) {\n    if (isObject(element[name])) {\n      try {\n        delete element[name];\n      } catch (error) {\n        element[name] = undefined;\n      }\n    } else if (element.dataset) {\n      // #128 Safari not allows to delete dataset property\n      try {\n        delete element.dataset[name];\n      } catch (error) {\n        element.dataset[name] = undefined;\n      }\n    } else {\n      element.removeAttribute(\"data-\".concat(toParamCase(name)));\n    }\n  }\n  var REGEXP_SPACES = /\\s\\s*/;\n  var onceSupported = function () {\n    var supported = false;\n    if (IS_BROWSER) {\n      var once = false;\n      var listener = function listener() {};\n      var options = Object.defineProperty({}, 'once', {\n        get: function get() {\n          supported = true;\n          return once;\n        },\n        /**\n         * This setter can fix a `TypeError` in strict mode\n         * {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Errors/Getter_only}\n         * @param {boolean} value - The value to set\n         */\n        set: function set(value) {\n          once = value;\n        }\n      });\n      WINDOW.addEventListener('test', listener, options);\n      WINDOW.removeEventListener('test', listener, options);\n    }\n    return supported;\n  }();\n\n  /**\n   * Remove event listener from the target element.\n   * @param {Element} element - The event target.\n   * @param {string} type - The event type(s).\n   * @param {Function} listener - The event listener.\n   * @param {Object} options - The event options.\n   */\n  function removeListener(element, type, listener) {\n    var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};\n    var handler = listener;\n    type.trim().split(REGEXP_SPACES).forEach(function (event) {\n      if (!onceSupported) {\n        var listeners = element.listeners;\n        if (listeners && listeners[event] && listeners[event][listener]) {\n          handler = listeners[event][listener];\n          delete listeners[event][listener];\n          if (Object.keys(listeners[event]).length === 0) {\n            delete listeners[event];\n          }\n          if (Object.keys(listeners).length === 0) {\n            delete element.listeners;\n          }\n        }\n      }\n      element.removeEventListener(event, handler, options);\n    });\n  }\n\n  /**\n   * Add event listener to the target element.\n   * @param {Element} element - The event target.\n   * @param {string} type - The event type(s).\n   * @param {Function} listener - The event listener.\n   * @param {Object} options - The event options.\n   */\n  function addListener(element, type, listener) {\n    var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};\n    var _handler = listener;\n    type.trim().split(REGEXP_SPACES).forEach(function (event) {\n      if (options.once && !onceSupported) {\n        var _element$listeners = element.listeners,\n          listeners = _element$listeners === void 0 ? {} : _element$listeners;\n        _handler = function handler() {\n          delete listeners[event][listener];\n          element.removeEventListener(event, _handler, options);\n          for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n            args[_key2] = arguments[_key2];\n          }\n          listener.apply(element, args);\n        };\n        if (!listeners[event]) {\n          listeners[event] = {};\n        }\n        if (listeners[event][listener]) {\n          element.removeEventListener(event, listeners[event][listener], options);\n        }\n        listeners[event][listener] = _handler;\n        element.listeners = listeners;\n      }\n      element.addEventListener(event, _handler, options);\n    });\n  }\n\n  /**\n   * Dispatch event on the target element.\n   * @param {Element} element - The event target.\n   * @param {string} type - The event type(s).\n   * @param {Object} data - The additional event data.\n   * @returns {boolean} Indicate if the event is default prevented or not.\n   */\n  function dispatchEvent(element, type, data) {\n    var event;\n\n    // Event and CustomEvent on IE9-11 are global objects, not constructors\n    if (isFunction(Event) && isFunction(CustomEvent)) {\n      event = new CustomEvent(type, {\n        detail: data,\n        bubbles: true,\n        cancelable: true\n      });\n    } else {\n      event = document.createEvent('CustomEvent');\n      event.initCustomEvent(type, true, true, data);\n    }\n    return element.dispatchEvent(event);\n  }\n\n  /**\n   * Get the offset base on the document.\n   * @param {Element} element - The target element.\n   * @returns {Object} The offset data.\n   */\n  function getOffset(element) {\n    var box = element.getBoundingClientRect();\n    return {\n      left: box.left + (window.pageXOffset - document.documentElement.clientLeft),\n      top: box.top + (window.pageYOffset - document.documentElement.clientTop)\n    };\n  }\n  var location = WINDOW.location;\n  var REGEXP_ORIGINS = /^(\\w+:)\\/\\/([^:/?#]*):?(\\d*)/i;\n\n  /**\n   * Check if the given URL is a cross origin URL.\n   * @param {string} url - The target URL.\n   * @returns {boolean} Returns `true` if the given URL is a cross origin URL, else `false`.\n   */\n  function isCrossOriginURL(url) {\n    var parts = url.match(REGEXP_ORIGINS);\n    return parts !== null && (parts[1] !== location.protocol || parts[2] !== location.hostname || parts[3] !== location.port);\n  }\n\n  /**\n   * Add timestamp to the given URL.\n   * @param {string} url - The target URL.\n   * @returns {string} The result URL.\n   */\n  function addTimestamp(url) {\n    var timestamp = \"timestamp=\".concat(new Date().getTime());\n    return url + (url.indexOf('?') === -1 ? '?' : '&') + timestamp;\n  }\n\n  /**\n   * Get transforms base on the given object.\n   * @param {Object} obj - The target object.\n   * @returns {string} A string contains transform values.\n   */\n  function getTransforms(_ref) {\n    var rotate = _ref.rotate,\n      scaleX = _ref.scaleX,\n      scaleY = _ref.scaleY,\n      translateX = _ref.translateX,\n      translateY = _ref.translateY;\n    var values = [];\n    if (isNumber(translateX) && translateX !== 0) {\n      values.push(\"translateX(\".concat(translateX, \"px)\"));\n    }\n    if (isNumber(translateY) && translateY !== 0) {\n      values.push(\"translateY(\".concat(translateY, \"px)\"));\n    }\n\n    // Rotate should come first before scale to match orientation transform\n    if (isNumber(rotate) && rotate !== 0) {\n      values.push(\"rotate(\".concat(rotate, \"deg)\"));\n    }\n    if (isNumber(scaleX) && scaleX !== 1) {\n      values.push(\"scaleX(\".concat(scaleX, \")\"));\n    }\n    if (isNumber(scaleY) && scaleY !== 1) {\n      values.push(\"scaleY(\".concat(scaleY, \")\"));\n    }\n    var transform = values.length ? values.join(' ') : 'none';\n    return {\n      WebkitTransform: transform,\n      msTransform: transform,\n      transform: transform\n    };\n  }\n\n  /**\n   * Get the max ratio of a group of pointers.\n   * @param {string} pointers - The target pointers.\n   * @returns {number} The result ratio.\n   */\n  function getMaxZoomRatio(pointers) {\n    var pointers2 = _objectSpread2({}, pointers);\n    var maxRatio = 0;\n    forEach(pointers, function (pointer, pointerId) {\n      delete pointers2[pointerId];\n      forEach(pointers2, function (pointer2) {\n        var x1 = Math.abs(pointer.startX - pointer2.startX);\n        var y1 = Math.abs(pointer.startY - pointer2.startY);\n        var x2 = Math.abs(pointer.endX - pointer2.endX);\n        var y2 = Math.abs(pointer.endY - pointer2.endY);\n        var z1 = Math.sqrt(x1 * x1 + y1 * y1);\n        var z2 = Math.sqrt(x2 * x2 + y2 * y2);\n        var ratio = (z2 - z1) / z1;\n        if (Math.abs(ratio) > Math.abs(maxRatio)) {\n          maxRatio = ratio;\n        }\n      });\n    });\n    return maxRatio;\n  }\n\n  /**\n   * Get a pointer from an event object.\n   * @param {Object} event - The target event object.\n   * @param {boolean} endOnly - Indicates if only returns the end point coordinate or not.\n   * @returns {Object} The result pointer contains start and/or end point coordinates.\n   */\n  function getPointer(_ref2, endOnly) {\n    var pageX = _ref2.pageX,\n      pageY = _ref2.pageY;\n    var end = {\n      endX: pageX,\n      endY: pageY\n    };\n    return endOnly ? end : _objectSpread2({\n      startX: pageX,\n      startY: pageY\n    }, end);\n  }\n\n  /**\n   * Get the center point coordinate of a group of pointers.\n   * @param {Object} pointers - The target pointers.\n   * @returns {Object} The center point coordinate.\n   */\n  function getPointersCenter(pointers) {\n    var pageX = 0;\n    var pageY = 0;\n    var count = 0;\n    forEach(pointers, function (_ref3) {\n      var startX = _ref3.startX,\n        startY = _ref3.startY;\n      pageX += startX;\n      pageY += startY;\n      count += 1;\n    });\n    pageX /= count;\n    pageY /= count;\n    return {\n      pageX: pageX,\n      pageY: pageY\n    };\n  }\n\n  /**\n   * Get the max sizes in a rectangle under the given aspect ratio.\n   * @param {Object} data - The original sizes.\n   * @param {string} [type='contain'] - The adjust type.\n   * @returns {Object} The result sizes.\n   */\n  function getAdjustedSizes(_ref4) {\n    var aspectRatio = _ref4.aspectRatio,\n      height = _ref4.height,\n      width = _ref4.width;\n    var type = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'contain';\n    var isValidWidth = isPositiveNumber(width);\n    var isValidHeight = isPositiveNumber(height);\n    if (isValidWidth && isValidHeight) {\n      var adjustedWidth = height * aspectRatio;\n      if (type === 'contain' && adjustedWidth > width || type === 'cover' && adjustedWidth < width) {\n        height = width / aspectRatio;\n      } else {\n        width = height * aspectRatio;\n      }\n    } else if (isValidWidth) {\n      height = width / aspectRatio;\n    } else if (isValidHeight) {\n      width = height * aspectRatio;\n    }\n    return {\n      width: width,\n      height: height\n    };\n  }\n\n  /**\n   * Get the new sizes of a rectangle after rotated.\n   * @param {Object} data - The original sizes.\n   * @returns {Object} The result sizes.\n   */\n  function getRotatedSizes(_ref5) {\n    var width = _ref5.width,\n      height = _ref5.height,\n      degree = _ref5.degree;\n    degree = Math.abs(degree) % 180;\n    if (degree === 90) {\n      return {\n        width: height,\n        height: width\n      };\n    }\n    var arc = degree % 90 * Math.PI / 180;\n    var sinArc = Math.sin(arc);\n    var cosArc = Math.cos(arc);\n    var newWidth = width * cosArc + height * sinArc;\n    var newHeight = width * sinArc + height * cosArc;\n    return degree > 90 ? {\n      width: newHeight,\n      height: newWidth\n    } : {\n      width: newWidth,\n      height: newHeight\n    };\n  }\n\n  /**\n   * Get a canvas which drew the given image.\n   * @param {HTMLImageElement} image - The image for drawing.\n   * @param {Object} imageData - The image data.\n   * @param {Object} canvasData - The canvas data.\n   * @param {Object} options - The options.\n   * @returns {HTMLCanvasElement} The result canvas.\n   */\n  function getSourceCanvas(image, _ref6, _ref7, _ref8) {\n    var imageAspectRatio = _ref6.aspectRatio,\n      imageNaturalWidth = _ref6.naturalWidth,\n      imageNaturalHeight = _ref6.naturalHeight,\n      _ref6$rotate = _ref6.rotate,\n      rotate = _ref6$rotate === void 0 ? 0 : _ref6$rotate,\n      _ref6$scaleX = _ref6.scaleX,\n      scaleX = _ref6$scaleX === void 0 ? 1 : _ref6$scaleX,\n      _ref6$scaleY = _ref6.scaleY,\n      scaleY = _ref6$scaleY === void 0 ? 1 : _ref6$scaleY;\n    var aspectRatio = _ref7.aspectRatio,\n      naturalWidth = _ref7.naturalWidth,\n      naturalHeight = _ref7.naturalHeight;\n    var _ref8$fillColor = _ref8.fillColor,\n      fillColor = _ref8$fillColor === void 0 ? 'transparent' : _ref8$fillColor,\n      _ref8$imageSmoothingE = _ref8.imageSmoothingEnabled,\n      imageSmoothingEnabled = _ref8$imageSmoothingE === void 0 ? true : _ref8$imageSmoothingE,\n      _ref8$imageSmoothingQ = _ref8.imageSmoothingQuality,\n      imageSmoothingQuality = _ref8$imageSmoothingQ === void 0 ? 'low' : _ref8$imageSmoothingQ,\n      _ref8$maxWidth = _ref8.maxWidth,\n      maxWidth = _ref8$maxWidth === void 0 ? Infinity : _ref8$maxWidth,\n      _ref8$maxHeight = _ref8.maxHeight,\n      maxHeight = _ref8$maxHeight === void 0 ? Infinity : _ref8$maxHeight,\n      _ref8$minWidth = _ref8.minWidth,\n      minWidth = _ref8$minWidth === void 0 ? 0 : _ref8$minWidth,\n      _ref8$minHeight = _ref8.minHeight,\n      minHeight = _ref8$minHeight === void 0 ? 0 : _ref8$minHeight;\n    var canvas = document.createElement('canvas');\n    var context = canvas.getContext('2d');\n    var maxSizes = getAdjustedSizes({\n      aspectRatio: aspectRatio,\n      width: maxWidth,\n      height: maxHeight\n    });\n    var minSizes = getAdjustedSizes({\n      aspectRatio: aspectRatio,\n      width: minWidth,\n      height: minHeight\n    }, 'cover');\n    var width = Math.min(maxSizes.width, Math.max(minSizes.width, naturalWidth));\n    var height = Math.min(maxSizes.height, Math.max(minSizes.height, naturalHeight));\n\n    // Note: should always use image's natural sizes for drawing as\n    // imageData.naturalWidth === canvasData.naturalHeight when rotate % 180 === 90\n    var destMaxSizes = getAdjustedSizes({\n      aspectRatio: imageAspectRatio,\n      width: maxWidth,\n      height: maxHeight\n    });\n    var destMinSizes = getAdjustedSizes({\n      aspectRatio: imageAspectRatio,\n      width: minWidth,\n      height: minHeight\n    }, 'cover');\n    var destWidth = Math.min(destMaxSizes.width, Math.max(destMinSizes.width, imageNaturalWidth));\n    var destHeight = Math.min(destMaxSizes.height, Math.max(destMinSizes.height, imageNaturalHeight));\n    var params = [-destWidth / 2, -destHeight / 2, destWidth, destHeight];\n    canvas.width = normalizeDecimalNumber(width);\n    canvas.height = normalizeDecimalNumber(height);\n    context.fillStyle = fillColor;\n    context.fillRect(0, 0, width, height);\n    context.save();\n    context.translate(width / 2, height / 2);\n    context.rotate(rotate * Math.PI / 180);\n    context.scale(scaleX, scaleY);\n    context.imageSmoothingEnabled = imageSmoothingEnabled;\n    context.imageSmoothingQuality = imageSmoothingQuality;\n    context.drawImage.apply(context, [image].concat(_toConsumableArray(params.map(function (param) {\n      return Math.floor(normalizeDecimalNumber(param));\n    }))));\n    context.restore();\n    return canvas;\n  }\n  var fromCharCode = String.fromCharCode;\n\n  /**\n   * Get string from char code in data view.\n   * @param {DataView} dataView - The data view for read.\n   * @param {number} start - The start index.\n   * @param {number} length - The read length.\n   * @returns {string} The read result.\n   */\n  function getStringFromCharCode(dataView, start, length) {\n    var str = '';\n    length += start;\n    for (var i = start; i < length; i += 1) {\n      str += fromCharCode(dataView.getUint8(i));\n    }\n    return str;\n  }\n  var REGEXP_DATA_URL_HEAD = /^data:.*,/;\n\n  /**\n   * Transform Data URL to array buffer.\n   * @param {string} dataURL - The Data URL to transform.\n   * @returns {ArrayBuffer} The result array buffer.\n   */\n  function dataURLToArrayBuffer(dataURL) {\n    var base64 = dataURL.replace(REGEXP_DATA_URL_HEAD, '');\n    var binary = atob(base64);\n    var arrayBuffer = new ArrayBuffer(binary.length);\n    var uint8 = new Uint8Array(arrayBuffer);\n    forEach(uint8, function (value, i) {\n      uint8[i] = binary.charCodeAt(i);\n    });\n    return arrayBuffer;\n  }\n\n  /**\n   * Transform array buffer to Data URL.\n   * @param {ArrayBuffer} arrayBuffer - The array buffer to transform.\n   * @param {string} mimeType - The mime type of the Data URL.\n   * @returns {string} The result Data URL.\n   */\n  function arrayBufferToDataURL(arrayBuffer, mimeType) {\n    var chunks = [];\n\n    // Chunk Typed Array for better performance (#435)\n    var chunkSize = 8192;\n    var uint8 = new Uint8Array(arrayBuffer);\n    while (uint8.length > 0) {\n      // XXX: Babel's `toConsumableArray` helper will throw error in IE or Safari 9\n      // eslint-disable-next-line prefer-spread\n      chunks.push(fromCharCode.apply(null, toArray(uint8.subarray(0, chunkSize))));\n      uint8 = uint8.subarray(chunkSize);\n    }\n    return \"data:\".concat(mimeType, \";base64,\").concat(btoa(chunks.join('')));\n  }\n\n  /**\n   * Get orientation value from given array buffer.\n   * @param {ArrayBuffer} arrayBuffer - The array buffer to read.\n   * @returns {number} The read orientation value.\n   */\n  function resetAndGetOrientation(arrayBuffer) {\n    var dataView = new DataView(arrayBuffer);\n    var orientation;\n\n    // Ignores range error when the image does not have correct Exif information\n    try {\n      var littleEndian;\n      var app1Start;\n      var ifdStart;\n\n      // Only handle JPEG image (start by 0xFFD8)\n      if (dataView.getUint8(0) === 0xFF && dataView.getUint8(1) === 0xD8) {\n        var length = dataView.byteLength;\n        var offset = 2;\n        while (offset + 1 < length) {\n          if (dataView.getUint8(offset) === 0xFF && dataView.getUint8(offset + 1) === 0xE1) {\n            app1Start = offset;\n            break;\n          }\n          offset += 1;\n        }\n      }\n      if (app1Start) {\n        var exifIDCode = app1Start + 4;\n        var tiffOffset = app1Start + 10;\n        if (getStringFromCharCode(dataView, exifIDCode, 4) === 'Exif') {\n          var endianness = dataView.getUint16(tiffOffset);\n          littleEndian = endianness === 0x4949;\n          if (littleEndian || endianness === 0x4D4D /* bigEndian */) {\n            if (dataView.getUint16(tiffOffset + 2, littleEndian) === 0x002A) {\n              var firstIFDOffset = dataView.getUint32(tiffOffset + 4, littleEndian);\n              if (firstIFDOffset >= 0x00000008) {\n                ifdStart = tiffOffset + firstIFDOffset;\n              }\n            }\n          }\n        }\n      }\n      if (ifdStart) {\n        var _length = dataView.getUint16(ifdStart, littleEndian);\n        var _offset;\n        var i;\n        for (i = 0; i < _length; i += 1) {\n          _offset = ifdStart + i * 12 + 2;\n          if (dataView.getUint16(_offset, littleEndian) === 0x0112 /* Orientation */) {\n            // 8 is the offset of the current tag's value\n            _offset += 8;\n\n            // Get the original orientation value\n            orientation = dataView.getUint16(_offset, littleEndian);\n\n            // Override the orientation with its default value\n            dataView.setUint16(_offset, 1, littleEndian);\n            break;\n          }\n        }\n      }\n    } catch (error) {\n      orientation = 1;\n    }\n    return orientation;\n  }\n\n  /**\n   * Parse Exif Orientation value.\n   * @param {number} orientation - The orientation to parse.\n   * @returns {Object} The parsed result.\n   */\n  function parseOrientation(orientation) {\n    var rotate = 0;\n    var scaleX = 1;\n    var scaleY = 1;\n    switch (orientation) {\n      // Flip horizontal\n      case 2:\n        scaleX = -1;\n        break;\n\n      // Rotate left 180°\n      case 3:\n        rotate = -180;\n        break;\n\n      // Flip vertical\n      case 4:\n        scaleY = -1;\n        break;\n\n      // Flip vertical and rotate right 90°\n      case 5:\n        rotate = 90;\n        scaleY = -1;\n        break;\n\n      // Rotate right 90°\n      case 6:\n        rotate = 90;\n        break;\n\n      // Flip horizontal and rotate right 90°\n      case 7:\n        rotate = 90;\n        scaleX = -1;\n        break;\n\n      // Rotate left 90°\n      case 8:\n        rotate = -90;\n        break;\n    }\n    return {\n      rotate: rotate,\n      scaleX: scaleX,\n      scaleY: scaleY\n    };\n  }\n\n  var render = {\n    render: function render() {\n      this.initContainer();\n      this.initCanvas();\n      this.initCropBox();\n      this.renderCanvas();\n      if (this.cropped) {\n        this.renderCropBox();\n      }\n    },\n    initContainer: function initContainer() {\n      var element = this.element,\n        options = this.options,\n        container = this.container,\n        cropper = this.cropper;\n      var minWidth = Number(options.minContainerWidth);\n      var minHeight = Number(options.minContainerHeight);\n      addClass(cropper, CLASS_HIDDEN);\n      removeClass(element, CLASS_HIDDEN);\n      var containerData = {\n        width: Math.max(container.offsetWidth, minWidth >= 0 ? minWidth : MIN_CONTAINER_WIDTH),\n        height: Math.max(container.offsetHeight, minHeight >= 0 ? minHeight : MIN_CONTAINER_HEIGHT)\n      };\n      this.containerData = containerData;\n      setStyle(cropper, {\n        width: containerData.width,\n        height: containerData.height\n      });\n      addClass(element, CLASS_HIDDEN);\n      removeClass(cropper, CLASS_HIDDEN);\n    },\n    // Canvas (image wrapper)\n    initCanvas: function initCanvas() {\n      var containerData = this.containerData,\n        imageData = this.imageData;\n      var viewMode = this.options.viewMode;\n      var rotated = Math.abs(imageData.rotate) % 180 === 90;\n      var naturalWidth = rotated ? imageData.naturalHeight : imageData.naturalWidth;\n      var naturalHeight = rotated ? imageData.naturalWidth : imageData.naturalHeight;\n      var aspectRatio = naturalWidth / naturalHeight;\n      var canvasWidth = containerData.width;\n      var canvasHeight = containerData.height;\n      if (containerData.height * aspectRatio > containerData.width) {\n        if (viewMode === 3) {\n          canvasWidth = containerData.height * aspectRatio;\n        } else {\n          canvasHeight = containerData.width / aspectRatio;\n        }\n      } else if (viewMode === 3) {\n        canvasHeight = containerData.width / aspectRatio;\n      } else {\n        canvasWidth = containerData.height * aspectRatio;\n      }\n      var canvasData = {\n        aspectRatio: aspectRatio,\n        naturalWidth: naturalWidth,\n        naturalHeight: naturalHeight,\n        width: canvasWidth,\n        height: canvasHeight\n      };\n      this.canvasData = canvasData;\n      this.limited = viewMode === 1 || viewMode === 2;\n      this.limitCanvas(true, true);\n      canvasData.width = Math.min(Math.max(canvasData.width, canvasData.minWidth), canvasData.maxWidth);\n      canvasData.height = Math.min(Math.max(canvasData.height, canvasData.minHeight), canvasData.maxHeight);\n      canvasData.left = (containerData.width - canvasData.width) / 2;\n      canvasData.top = (containerData.height - canvasData.height) / 2;\n      canvasData.oldLeft = canvasData.left;\n      canvasData.oldTop = canvasData.top;\n      this.initialCanvasData = assign({}, canvasData);\n    },\n    limitCanvas: function limitCanvas(sizeLimited, positionLimited) {\n      var options = this.options,\n        containerData = this.containerData,\n        canvasData = this.canvasData,\n        cropBoxData = this.cropBoxData;\n      var viewMode = options.viewMode;\n      var aspectRatio = canvasData.aspectRatio;\n      var cropped = this.cropped && cropBoxData;\n      if (sizeLimited) {\n        var minCanvasWidth = Number(options.minCanvasWidth) || 0;\n        var minCanvasHeight = Number(options.minCanvasHeight) || 0;\n        if (viewMode > 1) {\n          minCanvasWidth = Math.max(minCanvasWidth, containerData.width);\n          minCanvasHeight = Math.max(minCanvasHeight, containerData.height);\n          if (viewMode === 3) {\n            if (minCanvasHeight * aspectRatio > minCanvasWidth) {\n              minCanvasWidth = minCanvasHeight * aspectRatio;\n            } else {\n              minCanvasHeight = minCanvasWidth / aspectRatio;\n            }\n          }\n        } else if (viewMode > 0) {\n          if (minCanvasWidth) {\n            minCanvasWidth = Math.max(minCanvasWidth, cropped ? cropBoxData.width : 0);\n          } else if (minCanvasHeight) {\n            minCanvasHeight = Math.max(minCanvasHeight, cropped ? cropBoxData.height : 0);\n          } else if (cropped) {\n            minCanvasWidth = cropBoxData.width;\n            minCanvasHeight = cropBoxData.height;\n            if (minCanvasHeight * aspectRatio > minCanvasWidth) {\n              minCanvasWidth = minCanvasHeight * aspectRatio;\n            } else {\n              minCanvasHeight = minCanvasWidth / aspectRatio;\n            }\n          }\n        }\n        var _getAdjustedSizes = getAdjustedSizes({\n          aspectRatio: aspectRatio,\n          width: minCanvasWidth,\n          height: minCanvasHeight\n        });\n        minCanvasWidth = _getAdjustedSizes.width;\n        minCanvasHeight = _getAdjustedSizes.height;\n        canvasData.minWidth = minCanvasWidth;\n        canvasData.minHeight = minCanvasHeight;\n        canvasData.maxWidth = Infinity;\n        canvasData.maxHeight = Infinity;\n      }\n      if (positionLimited) {\n        if (viewMode > (cropped ? 0 : 1)) {\n          var newCanvasLeft = containerData.width - canvasData.width;\n          var newCanvasTop = containerData.height - canvasData.height;\n          canvasData.minLeft = Math.min(0, newCanvasLeft);\n          canvasData.minTop = Math.min(0, newCanvasTop);\n          canvasData.maxLeft = Math.max(0, newCanvasLeft);\n          canvasData.maxTop = Math.max(0, newCanvasTop);\n          if (cropped && this.limited) {\n            canvasData.minLeft = Math.min(cropBoxData.left, cropBoxData.left + (cropBoxData.width - canvasData.width));\n            canvasData.minTop = Math.min(cropBoxData.top, cropBoxData.top + (cropBoxData.height - canvasData.height));\n            canvasData.maxLeft = cropBoxData.left;\n            canvasData.maxTop = cropBoxData.top;\n            if (viewMode === 2) {\n              if (canvasData.width >= containerData.width) {\n                canvasData.minLeft = Math.min(0, newCanvasLeft);\n                canvasData.maxLeft = Math.max(0, newCanvasLeft);\n              }\n              if (canvasData.height >= containerData.height) {\n                canvasData.minTop = Math.min(0, newCanvasTop);\n                canvasData.maxTop = Math.max(0, newCanvasTop);\n              }\n            }\n          }\n        } else {\n          canvasData.minLeft = -canvasData.width;\n          canvasData.minTop = -canvasData.height;\n          canvasData.maxLeft = containerData.width;\n          canvasData.maxTop = containerData.height;\n        }\n      }\n    },\n    renderCanvas: function renderCanvas(changed, transformed) {\n      var canvasData = this.canvasData,\n        imageData = this.imageData;\n      if (transformed) {\n        var _getRotatedSizes = getRotatedSizes({\n            width: imageData.naturalWidth * Math.abs(imageData.scaleX || 1),\n            height: imageData.naturalHeight * Math.abs(imageData.scaleY || 1),\n            degree: imageData.rotate || 0\n          }),\n          naturalWidth = _getRotatedSizes.width,\n          naturalHeight = _getRotatedSizes.height;\n        var width = canvasData.width * (naturalWidth / canvasData.naturalWidth);\n        var height = canvasData.height * (naturalHeight / canvasData.naturalHeight);\n        canvasData.left -= (width - canvasData.width) / 2;\n        canvasData.top -= (height - canvasData.height) / 2;\n        canvasData.width = width;\n        canvasData.height = height;\n        canvasData.aspectRatio = naturalWidth / naturalHeight;\n        canvasData.naturalWidth = naturalWidth;\n        canvasData.naturalHeight = naturalHeight;\n        this.limitCanvas(true, false);\n      }\n      if (canvasData.width > canvasData.maxWidth || canvasData.width < canvasData.minWidth) {\n        canvasData.left = canvasData.oldLeft;\n      }\n      if (canvasData.height > canvasData.maxHeight || canvasData.height < canvasData.minHeight) {\n        canvasData.top = canvasData.oldTop;\n      }\n      canvasData.width = Math.min(Math.max(canvasData.width, canvasData.minWidth), canvasData.maxWidth);\n      canvasData.height = Math.min(Math.max(canvasData.height, canvasData.minHeight), canvasData.maxHeight);\n      this.limitCanvas(false, true);\n      canvasData.left = Math.min(Math.max(canvasData.left, canvasData.minLeft), canvasData.maxLeft);\n      canvasData.top = Math.min(Math.max(canvasData.top, canvasData.minTop), canvasData.maxTop);\n      canvasData.oldLeft = canvasData.left;\n      canvasData.oldTop = canvasData.top;\n      setStyle(this.canvas, assign({\n        width: canvasData.width,\n        height: canvasData.height\n      }, getTransforms({\n        translateX: canvasData.left,\n        translateY: canvasData.top\n      })));\n      this.renderImage(changed);\n      if (this.cropped && this.limited) {\n        this.limitCropBox(true, true);\n      }\n    },\n    renderImage: function renderImage(changed) {\n      var canvasData = this.canvasData,\n        imageData = this.imageData;\n      var width = imageData.naturalWidth * (canvasData.width / canvasData.naturalWidth);\n      var height = imageData.naturalHeight * (canvasData.height / canvasData.naturalHeight);\n      assign(imageData, {\n        width: width,\n        height: height,\n        left: (canvasData.width - width) / 2,\n        top: (canvasData.height - height) / 2\n      });\n      setStyle(this.image, assign({\n        width: imageData.width,\n        height: imageData.height\n      }, getTransforms(assign({\n        translateX: imageData.left,\n        translateY: imageData.top\n      }, imageData))));\n      if (changed) {\n        this.output();\n      }\n    },\n    initCropBox: function initCropBox() {\n      var options = this.options,\n        canvasData = this.canvasData;\n      var aspectRatio = options.aspectRatio || options.initialAspectRatio;\n      var autoCropArea = Number(options.autoCropArea) || 0.8;\n      var cropBoxData = {\n        width: canvasData.width,\n        height: canvasData.height\n      };\n      if (aspectRatio) {\n        if (canvasData.height * aspectRatio > canvasData.width) {\n          cropBoxData.height = cropBoxData.width / aspectRatio;\n        } else {\n          cropBoxData.width = cropBoxData.height * aspectRatio;\n        }\n      }\n      this.cropBoxData = cropBoxData;\n      this.limitCropBox(true, true);\n\n      // Initialize auto crop area\n      cropBoxData.width = Math.min(Math.max(cropBoxData.width, cropBoxData.minWidth), cropBoxData.maxWidth);\n      cropBoxData.height = Math.min(Math.max(cropBoxData.height, cropBoxData.minHeight), cropBoxData.maxHeight);\n\n      // The width/height of auto crop area must large than \"minWidth/Height\"\n      cropBoxData.width = Math.max(cropBoxData.minWidth, cropBoxData.width * autoCropArea);\n      cropBoxData.height = Math.max(cropBoxData.minHeight, cropBoxData.height * autoCropArea);\n      cropBoxData.left = canvasData.left + (canvasData.width - cropBoxData.width) / 2;\n      cropBoxData.top = canvasData.top + (canvasData.height - cropBoxData.height) / 2;\n      cropBoxData.oldLeft = cropBoxData.left;\n      cropBoxData.oldTop = cropBoxData.top;\n      this.initialCropBoxData = assign({}, cropBoxData);\n    },\n    limitCropBox: function limitCropBox(sizeLimited, positionLimited) {\n      var options = this.options,\n        containerData = this.containerData,\n        canvasData = this.canvasData,\n        cropBoxData = this.cropBoxData,\n        limited = this.limited;\n      var aspectRatio = options.aspectRatio;\n      if (sizeLimited) {\n        var minCropBoxWidth = Number(options.minCropBoxWidth) || 0;\n        var minCropBoxHeight = Number(options.minCropBoxHeight) || 0;\n        var maxCropBoxWidth = limited ? Math.min(containerData.width, canvasData.width, canvasData.width + canvasData.left, containerData.width - canvasData.left) : containerData.width;\n        var maxCropBoxHeight = limited ? Math.min(containerData.height, canvasData.height, canvasData.height + canvasData.top, containerData.height - canvasData.top) : containerData.height;\n\n        // The min/maxCropBoxWidth/Height must be less than container's width/height\n        minCropBoxWidth = Math.min(minCropBoxWidth, containerData.width);\n        minCropBoxHeight = Math.min(minCropBoxHeight, containerData.height);\n        if (aspectRatio) {\n          if (minCropBoxWidth && minCropBoxHeight) {\n            if (minCropBoxHeight * aspectRatio > minCropBoxWidth) {\n              minCropBoxHeight = minCropBoxWidth / aspectRatio;\n            } else {\n              minCropBoxWidth = minCropBoxHeight * aspectRatio;\n            }\n          } else if (minCropBoxWidth) {\n            minCropBoxHeight = minCropBoxWidth / aspectRatio;\n          } else if (minCropBoxHeight) {\n            minCropBoxWidth = minCropBoxHeight * aspectRatio;\n          }\n          if (maxCropBoxHeight * aspectRatio > maxCropBoxWidth) {\n            maxCropBoxHeight = maxCropBoxWidth / aspectRatio;\n          } else {\n            maxCropBoxWidth = maxCropBoxHeight * aspectRatio;\n          }\n        }\n\n        // The minWidth/Height must be less than maxWidth/Height\n        cropBoxData.minWidth = Math.min(minCropBoxWidth, maxCropBoxWidth);\n        cropBoxData.minHeight = Math.min(minCropBoxHeight, maxCropBoxHeight);\n        cropBoxData.maxWidth = maxCropBoxWidth;\n        cropBoxData.maxHeight = maxCropBoxHeight;\n      }\n      if (positionLimited) {\n        if (limited) {\n          cropBoxData.minLeft = Math.max(0, canvasData.left);\n          cropBoxData.minTop = Math.max(0, canvasData.top);\n          cropBoxData.maxLeft = Math.min(containerData.width, canvasData.left + canvasData.width) - cropBoxData.width;\n          cropBoxData.maxTop = Math.min(containerData.height, canvasData.top + canvasData.height) - cropBoxData.height;\n        } else {\n          cropBoxData.minLeft = 0;\n          cropBoxData.minTop = 0;\n          cropBoxData.maxLeft = containerData.width - cropBoxData.width;\n          cropBoxData.maxTop = containerData.height - cropBoxData.height;\n        }\n      }\n    },\n    renderCropBox: function renderCropBox() {\n      var options = this.options,\n        containerData = this.containerData,\n        cropBoxData = this.cropBoxData;\n      if (cropBoxData.width > cropBoxData.maxWidth || cropBoxData.width < cropBoxData.minWidth) {\n        cropBoxData.left = cropBoxData.oldLeft;\n      }\n      if (cropBoxData.height > cropBoxData.maxHeight || cropBoxData.height < cropBoxData.minHeight) {\n        cropBoxData.top = cropBoxData.oldTop;\n      }\n      cropBoxData.width = Math.min(Math.max(cropBoxData.width, cropBoxData.minWidth), cropBoxData.maxWidth);\n      cropBoxData.height = Math.min(Math.max(cropBoxData.height, cropBoxData.minHeight), cropBoxData.maxHeight);\n      this.limitCropBox(false, true);\n      cropBoxData.left = Math.min(Math.max(cropBoxData.left, cropBoxData.minLeft), cropBoxData.maxLeft);\n      cropBoxData.top = Math.min(Math.max(cropBoxData.top, cropBoxData.minTop), cropBoxData.maxTop);\n      cropBoxData.oldLeft = cropBoxData.left;\n      cropBoxData.oldTop = cropBoxData.top;\n      if (options.movable && options.cropBoxMovable) {\n        // Turn to move the canvas when the crop box is equal to the container\n        setData(this.face, DATA_ACTION, cropBoxData.width >= containerData.width && cropBoxData.height >= containerData.height ? ACTION_MOVE : ACTION_ALL);\n      }\n      setStyle(this.cropBox, assign({\n        width: cropBoxData.width,\n        height: cropBoxData.height\n      }, getTransforms({\n        translateX: cropBoxData.left,\n        translateY: cropBoxData.top\n      })));\n      if (this.cropped && this.limited) {\n        this.limitCanvas(true, true);\n      }\n      if (!this.disabled) {\n        this.output();\n      }\n    },\n    output: function output() {\n      this.preview();\n      dispatchEvent(this.element, EVENT_CROP, this.getData());\n    }\n  };\n\n  var preview = {\n    initPreview: function initPreview() {\n      var element = this.element,\n        crossOrigin = this.crossOrigin;\n      var preview = this.options.preview;\n      var url = crossOrigin ? this.crossOriginUrl : this.url;\n      var alt = element.alt || 'The image to preview';\n      var image = document.createElement('img');\n      if (crossOrigin) {\n        image.crossOrigin = crossOrigin;\n      }\n      image.src = url;\n      image.alt = alt;\n      this.viewBox.appendChild(image);\n      this.viewBoxImage = image;\n      if (!preview) {\n        return;\n      }\n      var previews = preview;\n      if (typeof preview === 'string') {\n        previews = element.ownerDocument.querySelectorAll(preview);\n      } else if (preview.querySelector) {\n        previews = [preview];\n      }\n      this.previews = previews;\n      forEach(previews, function (el) {\n        var img = document.createElement('img');\n\n        // Save the original size for recover\n        setData(el, DATA_PREVIEW, {\n          width: el.offsetWidth,\n          height: el.offsetHeight,\n          html: el.innerHTML\n        });\n        if (crossOrigin) {\n          img.crossOrigin = crossOrigin;\n        }\n        img.src = url;\n        img.alt = alt;\n\n        /**\n         * Override img element styles\n         * Add `display:block` to avoid margin top issue\n         * Add `height:auto` to override `height` attribute on IE8\n         * (Occur only when margin-top <= -height)\n         */\n        img.style.cssText = 'display:block;' + 'width:100%;' + 'height:auto;' + 'min-width:0!important;' + 'min-height:0!important;' + 'max-width:none!important;' + 'max-height:none!important;' + 'image-orientation:0deg!important;\"';\n        el.innerHTML = '';\n        el.appendChild(img);\n      });\n    },\n    resetPreview: function resetPreview() {\n      forEach(this.previews, function (element) {\n        var data = getData(element, DATA_PREVIEW);\n        setStyle(element, {\n          width: data.width,\n          height: data.height\n        });\n        element.innerHTML = data.html;\n        removeData(element, DATA_PREVIEW);\n      });\n    },\n    preview: function preview() {\n      var imageData = this.imageData,\n        canvasData = this.canvasData,\n        cropBoxData = this.cropBoxData;\n      var cropBoxWidth = cropBoxData.width,\n        cropBoxHeight = cropBoxData.height;\n      var width = imageData.width,\n        height = imageData.height;\n      var left = cropBoxData.left - canvasData.left - imageData.left;\n      var top = cropBoxData.top - canvasData.top - imageData.top;\n      if (!this.cropped || this.disabled) {\n        return;\n      }\n      setStyle(this.viewBoxImage, assign({\n        width: width,\n        height: height\n      }, getTransforms(assign({\n        translateX: -left,\n        translateY: -top\n      }, imageData))));\n      forEach(this.previews, function (element) {\n        var data = getData(element, DATA_PREVIEW);\n        var originalWidth = data.width;\n        var originalHeight = data.height;\n        var newWidth = originalWidth;\n        var newHeight = originalHeight;\n        var ratio = 1;\n        if (cropBoxWidth) {\n          ratio = originalWidth / cropBoxWidth;\n          newHeight = cropBoxHeight * ratio;\n        }\n        if (cropBoxHeight && newHeight > originalHeight) {\n          ratio = originalHeight / cropBoxHeight;\n          newWidth = cropBoxWidth * ratio;\n          newHeight = originalHeight;\n        }\n        setStyle(element, {\n          width: newWidth,\n          height: newHeight\n        });\n        setStyle(element.getElementsByTagName('img')[0], assign({\n          width: width * ratio,\n          height: height * ratio\n        }, getTransforms(assign({\n          translateX: -left * ratio,\n          translateY: -top * ratio\n        }, imageData))));\n      });\n    }\n  };\n\n  var events = {\n    bind: function bind() {\n      var element = this.element,\n        options = this.options,\n        cropper = this.cropper;\n      if (isFunction(options.cropstart)) {\n        addListener(element, EVENT_CROP_START, options.cropstart);\n      }\n      if (isFunction(options.cropmove)) {\n        addListener(element, EVENT_CROP_MOVE, options.cropmove);\n      }\n      if (isFunction(options.cropend)) {\n        addListener(element, EVENT_CROP_END, options.cropend);\n      }\n      if (isFunction(options.crop)) {\n        addListener(element, EVENT_CROP, options.crop);\n      }\n      if (isFunction(options.zoom)) {\n        addListener(element, EVENT_ZOOM, options.zoom);\n      }\n      addListener(cropper, EVENT_POINTER_DOWN, this.onCropStart = this.cropStart.bind(this));\n      if (options.zoomable && options.zoomOnWheel) {\n        addListener(cropper, EVENT_WHEEL, this.onWheel = this.wheel.bind(this), {\n          passive: false,\n          capture: true\n        });\n      }\n      if (options.toggleDragModeOnDblclick) {\n        addListener(cropper, EVENT_DBLCLICK, this.onDblclick = this.dblclick.bind(this));\n      }\n      addListener(element.ownerDocument, EVENT_POINTER_MOVE, this.onCropMove = this.cropMove.bind(this));\n      addListener(element.ownerDocument, EVENT_POINTER_UP, this.onCropEnd = this.cropEnd.bind(this));\n      if (options.responsive) {\n        addListener(window, EVENT_RESIZE, this.onResize = this.resize.bind(this));\n      }\n    },\n    unbind: function unbind() {\n      var element = this.element,\n        options = this.options,\n        cropper = this.cropper;\n      if (isFunction(options.cropstart)) {\n        removeListener(element, EVENT_CROP_START, options.cropstart);\n      }\n      if (isFunction(options.cropmove)) {\n        removeListener(element, EVENT_CROP_MOVE, options.cropmove);\n      }\n      if (isFunction(options.cropend)) {\n        removeListener(element, EVENT_CROP_END, options.cropend);\n      }\n      if (isFunction(options.crop)) {\n        removeListener(element, EVENT_CROP, options.crop);\n      }\n      if (isFunction(options.zoom)) {\n        removeListener(element, EVENT_ZOOM, options.zoom);\n      }\n      removeListener(cropper, EVENT_POINTER_DOWN, this.onCropStart);\n      if (options.zoomable && options.zoomOnWheel) {\n        removeListener(cropper, EVENT_WHEEL, this.onWheel, {\n          passive: false,\n          capture: true\n        });\n      }\n      if (options.toggleDragModeOnDblclick) {\n        removeListener(cropper, EVENT_DBLCLICK, this.onDblclick);\n      }\n      removeListener(element.ownerDocument, EVENT_POINTER_MOVE, this.onCropMove);\n      removeListener(element.ownerDocument, EVENT_POINTER_UP, this.onCropEnd);\n      if (options.responsive) {\n        removeListener(window, EVENT_RESIZE, this.onResize);\n      }\n    }\n  };\n\n  var handlers = {\n    resize: function resize() {\n      if (this.disabled) {\n        return;\n      }\n      var options = this.options,\n        container = this.container,\n        containerData = this.containerData;\n      var ratioX = container.offsetWidth / containerData.width;\n      var ratioY = container.offsetHeight / containerData.height;\n      var ratio = Math.abs(ratioX - 1) > Math.abs(ratioY - 1) ? ratioX : ratioY;\n\n      // Resize when width changed or height changed\n      if (ratio !== 1) {\n        var canvasData;\n        var cropBoxData;\n        if (options.restore) {\n          canvasData = this.getCanvasData();\n          cropBoxData = this.getCropBoxData();\n        }\n        this.render();\n        if (options.restore) {\n          this.setCanvasData(forEach(canvasData, function (n, i) {\n            canvasData[i] = n * ratio;\n          }));\n          this.setCropBoxData(forEach(cropBoxData, function (n, i) {\n            cropBoxData[i] = n * ratio;\n          }));\n        }\n      }\n    },\n    dblclick: function dblclick() {\n      if (this.disabled || this.options.dragMode === DRAG_MODE_NONE) {\n        return;\n      }\n      this.setDragMode(hasClass(this.dragBox, CLASS_CROP) ? DRAG_MODE_MOVE : DRAG_MODE_CROP);\n    },\n    wheel: function wheel(event) {\n      var _this = this;\n      var ratio = Number(this.options.wheelZoomRatio) || 0.1;\n      var delta = 1;\n      if (this.disabled) {\n        return;\n      }\n      event.preventDefault();\n\n      // Limit wheel speed to prevent zoom too fast (#21)\n      if (this.wheeling) {\n        return;\n      }\n      this.wheeling = true;\n      setTimeout(function () {\n        _this.wheeling = false;\n      }, 50);\n      if (event.deltaY) {\n        delta = event.deltaY > 0 ? 1 : -1;\n      } else if (event.wheelDelta) {\n        delta = -event.wheelDelta / 120;\n      } else if (event.detail) {\n        delta = event.detail > 0 ? 1 : -1;\n      }\n      this.zoom(-delta * ratio, event);\n    },\n    cropStart: function cropStart(event) {\n      var buttons = event.buttons,\n        button = event.button;\n      if (this.disabled\n\n      // Handle mouse event and pointer event and ignore touch event\n      || (event.type === 'mousedown' || event.type === 'pointerdown' && event.pointerType === 'mouse') && (\n      // No primary button (Usually the left button)\n      isNumber(buttons) && buttons !== 1 || isNumber(button) && button !== 0\n\n      // Open context menu\n      || event.ctrlKey)) {\n        return;\n      }\n      var options = this.options,\n        pointers = this.pointers;\n      var action;\n      if (event.changedTouches) {\n        // Handle touch event\n        forEach(event.changedTouches, function (touch) {\n          pointers[touch.identifier] = getPointer(touch);\n        });\n      } else {\n        // Handle mouse event and pointer event\n        pointers[event.pointerId || 0] = getPointer(event);\n      }\n      if (Object.keys(pointers).length > 1 && options.zoomable && options.zoomOnTouch) {\n        action = ACTION_ZOOM;\n      } else {\n        action = getData(event.target, DATA_ACTION);\n      }\n      if (!REGEXP_ACTIONS.test(action)) {\n        return;\n      }\n      if (dispatchEvent(this.element, EVENT_CROP_START, {\n        originalEvent: event,\n        action: action\n      }) === false) {\n        return;\n      }\n\n      // This line is required for preventing page zooming in iOS browsers\n      event.preventDefault();\n      this.action = action;\n      this.cropping = false;\n      if (action === ACTION_CROP) {\n        this.cropping = true;\n        addClass(this.dragBox, CLASS_MODAL);\n      }\n    },\n    cropMove: function cropMove(event) {\n      var action = this.action;\n      if (this.disabled || !action) {\n        return;\n      }\n      var pointers = this.pointers;\n      event.preventDefault();\n      if (dispatchEvent(this.element, EVENT_CROP_MOVE, {\n        originalEvent: event,\n        action: action\n      }) === false) {\n        return;\n      }\n      if (event.changedTouches) {\n        forEach(event.changedTouches, function (touch) {\n          // The first parameter should not be undefined (#432)\n          assign(pointers[touch.identifier] || {}, getPointer(touch, true));\n        });\n      } else {\n        assign(pointers[event.pointerId || 0] || {}, getPointer(event, true));\n      }\n      this.change(event);\n    },\n    cropEnd: function cropEnd(event) {\n      if (this.disabled) {\n        return;\n      }\n      var action = this.action,\n        pointers = this.pointers;\n      if (event.changedTouches) {\n        forEach(event.changedTouches, function (touch) {\n          delete pointers[touch.identifier];\n        });\n      } else {\n        delete pointers[event.pointerId || 0];\n      }\n      if (!action) {\n        return;\n      }\n      event.preventDefault();\n      if (!Object.keys(pointers).length) {\n        this.action = '';\n      }\n      if (this.cropping) {\n        this.cropping = false;\n        toggleClass(this.dragBox, CLASS_MODAL, this.cropped && this.options.modal);\n      }\n      dispatchEvent(this.element, EVENT_CROP_END, {\n        originalEvent: event,\n        action: action\n      });\n    }\n  };\n\n  var change = {\n    change: function change(event) {\n      var options = this.options,\n        canvasData = this.canvasData,\n        containerData = this.containerData,\n        cropBoxData = this.cropBoxData,\n        pointers = this.pointers;\n      var action = this.action;\n      var aspectRatio = options.aspectRatio;\n      var left = cropBoxData.left,\n        top = cropBoxData.top,\n        width = cropBoxData.width,\n        height = cropBoxData.height;\n      var right = left + width;\n      var bottom = top + height;\n      var minLeft = 0;\n      var minTop = 0;\n      var maxWidth = containerData.width;\n      var maxHeight = containerData.height;\n      var renderable = true;\n      var offset;\n\n      // Locking aspect ratio in \"free mode\" by holding shift key\n      if (!aspectRatio && event.shiftKey) {\n        aspectRatio = width && height ? width / height : 1;\n      }\n      if (this.limited) {\n        minLeft = cropBoxData.minLeft;\n        minTop = cropBoxData.minTop;\n        maxWidth = minLeft + Math.min(containerData.width, canvasData.width, canvasData.left + canvasData.width);\n        maxHeight = minTop + Math.min(containerData.height, canvasData.height, canvasData.top + canvasData.height);\n      }\n      var pointer = pointers[Object.keys(pointers)[0]];\n      var range = {\n        x: pointer.endX - pointer.startX,\n        y: pointer.endY - pointer.startY\n      };\n      var check = function check(side) {\n        switch (side) {\n          case ACTION_EAST:\n            if (right + range.x > maxWidth) {\n              range.x = maxWidth - right;\n            }\n            break;\n          case ACTION_WEST:\n            if (left + range.x < minLeft) {\n              range.x = minLeft - left;\n            }\n            break;\n          case ACTION_NORTH:\n            if (top + range.y < minTop) {\n              range.y = minTop - top;\n            }\n            break;\n          case ACTION_SOUTH:\n            if (bottom + range.y > maxHeight) {\n              range.y = maxHeight - bottom;\n            }\n            break;\n        }\n      };\n      switch (action) {\n        // Move crop box\n        case ACTION_ALL:\n          left += range.x;\n          top += range.y;\n          break;\n\n        // Resize crop box\n        case ACTION_EAST:\n          if (range.x >= 0 && (right >= maxWidth || aspectRatio && (top <= minTop || bottom >= maxHeight))) {\n            renderable = false;\n            break;\n          }\n          check(ACTION_EAST);\n          width += range.x;\n          if (width < 0) {\n            action = ACTION_WEST;\n            width = -width;\n            left -= width;\n          }\n          if (aspectRatio) {\n            height = width / aspectRatio;\n            top += (cropBoxData.height - height) / 2;\n          }\n          break;\n        case ACTION_NORTH:\n          if (range.y <= 0 && (top <= minTop || aspectRatio && (left <= minLeft || right >= maxWidth))) {\n            renderable = false;\n            break;\n          }\n          check(ACTION_NORTH);\n          height -= range.y;\n          top += range.y;\n          if (height < 0) {\n            action = ACTION_SOUTH;\n            height = -height;\n            top -= height;\n          }\n          if (aspectRatio) {\n            width = height * aspectRatio;\n            left += (cropBoxData.width - width) / 2;\n          }\n          break;\n        case ACTION_WEST:\n          if (range.x <= 0 && (left <= minLeft || aspectRatio && (top <= minTop || bottom >= maxHeight))) {\n            renderable = false;\n            break;\n          }\n          check(ACTION_WEST);\n          width -= range.x;\n          left += range.x;\n          if (width < 0) {\n            action = ACTION_EAST;\n            width = -width;\n            left -= width;\n          }\n          if (aspectRatio) {\n            height = width / aspectRatio;\n            top += (cropBoxData.height - height) / 2;\n          }\n          break;\n        case ACTION_SOUTH:\n          if (range.y >= 0 && (bottom >= maxHeight || aspectRatio && (left <= minLeft || right >= maxWidth))) {\n            renderable = false;\n            break;\n          }\n          check(ACTION_SOUTH);\n          height += range.y;\n          if (height < 0) {\n            action = ACTION_NORTH;\n            height = -height;\n            top -= height;\n          }\n          if (aspectRatio) {\n            width = height * aspectRatio;\n            left += (cropBoxData.width - width) / 2;\n          }\n          break;\n        case ACTION_NORTH_EAST:\n          if (aspectRatio) {\n            if (range.y <= 0 && (top <= minTop || right >= maxWidth)) {\n              renderable = false;\n              break;\n            }\n            check(ACTION_NORTH);\n            height -= range.y;\n            top += range.y;\n            width = height * aspectRatio;\n          } else {\n            check(ACTION_NORTH);\n            check(ACTION_EAST);\n            if (range.x >= 0) {\n              if (right < maxWidth) {\n                width += range.x;\n              } else if (range.y <= 0 && top <= minTop) {\n                renderable = false;\n              }\n            } else {\n              width += range.x;\n            }\n            if (range.y <= 0) {\n              if (top > minTop) {\n                height -= range.y;\n                top += range.y;\n              }\n            } else {\n              height -= range.y;\n              top += range.y;\n            }\n          }\n          if (width < 0 && height < 0) {\n            action = ACTION_SOUTH_WEST;\n            height = -height;\n            width = -width;\n            top -= height;\n            left -= width;\n          } else if (width < 0) {\n            action = ACTION_NORTH_WEST;\n            width = -width;\n            left -= width;\n          } else if (height < 0) {\n            action = ACTION_SOUTH_EAST;\n            height = -height;\n            top -= height;\n          }\n          break;\n        case ACTION_NORTH_WEST:\n          if (aspectRatio) {\n            if (range.y <= 0 && (top <= minTop || left <= minLeft)) {\n              renderable = false;\n              break;\n            }\n            check(ACTION_NORTH);\n            height -= range.y;\n            top += range.y;\n            width = height * aspectRatio;\n            left += cropBoxData.width - width;\n          } else {\n            check(ACTION_NORTH);\n            check(ACTION_WEST);\n            if (range.x <= 0) {\n              if (left > minLeft) {\n                width -= range.x;\n                left += range.x;\n              } else if (range.y <= 0 && top <= minTop) {\n                renderable = false;\n              }\n            } else {\n              width -= range.x;\n              left += range.x;\n            }\n            if (range.y <= 0) {\n              if (top > minTop) {\n                height -= range.y;\n                top += range.y;\n              }\n            } else {\n              height -= range.y;\n              top += range.y;\n            }\n          }\n          if (width < 0 && height < 0) {\n            action = ACTION_SOUTH_EAST;\n            height = -height;\n            width = -width;\n            top -= height;\n            left -= width;\n          } else if (width < 0) {\n            action = ACTION_NORTH_EAST;\n            width = -width;\n            left -= width;\n          } else if (height < 0) {\n            action = ACTION_SOUTH_WEST;\n            height = -height;\n            top -= height;\n          }\n          break;\n        case ACTION_SOUTH_WEST:\n          if (aspectRatio) {\n            if (range.x <= 0 && (left <= minLeft || bottom >= maxHeight)) {\n              renderable = false;\n              break;\n            }\n            check(ACTION_WEST);\n            width -= range.x;\n            left += range.x;\n            height = width / aspectRatio;\n          } else {\n            check(ACTION_SOUTH);\n            check(ACTION_WEST);\n            if (range.x <= 0) {\n              if (left > minLeft) {\n                width -= range.x;\n                left += range.x;\n              } else if (range.y >= 0 && bottom >= maxHeight) {\n                renderable = false;\n              }\n            } else {\n              width -= range.x;\n              left += range.x;\n            }\n            if (range.y >= 0) {\n              if (bottom < maxHeight) {\n                height += range.y;\n              }\n            } else {\n              height += range.y;\n            }\n          }\n          if (width < 0 && height < 0) {\n            action = ACTION_NORTH_EAST;\n            height = -height;\n            width = -width;\n            top -= height;\n            left -= width;\n          } else if (width < 0) {\n            action = ACTION_SOUTH_EAST;\n            width = -width;\n            left -= width;\n          } else if (height < 0) {\n            action = ACTION_NORTH_WEST;\n            height = -height;\n            top -= height;\n          }\n          break;\n        case ACTION_SOUTH_EAST:\n          if (aspectRatio) {\n            if (range.x >= 0 && (right >= maxWidth || bottom >= maxHeight)) {\n              renderable = false;\n              break;\n            }\n            check(ACTION_EAST);\n            width += range.x;\n            height = width / aspectRatio;\n          } else {\n            check(ACTION_SOUTH);\n            check(ACTION_EAST);\n            if (range.x >= 0) {\n              if (right < maxWidth) {\n                width += range.x;\n              } else if (range.y >= 0 && bottom >= maxHeight) {\n                renderable = false;\n              }\n            } else {\n              width += range.x;\n            }\n            if (range.y >= 0) {\n              if (bottom < maxHeight) {\n                height += range.y;\n              }\n            } else {\n              height += range.y;\n            }\n          }\n          if (width < 0 && height < 0) {\n            action = ACTION_NORTH_WEST;\n            height = -height;\n            width = -width;\n            top -= height;\n            left -= width;\n          } else if (width < 0) {\n            action = ACTION_SOUTH_WEST;\n            width = -width;\n            left -= width;\n          } else if (height < 0) {\n            action = ACTION_NORTH_EAST;\n            height = -height;\n            top -= height;\n          }\n          break;\n\n        // Move canvas\n        case ACTION_MOVE:\n          this.move(range.x, range.y);\n          renderable = false;\n          break;\n\n        // Zoom canvas\n        case ACTION_ZOOM:\n          this.zoom(getMaxZoomRatio(pointers), event);\n          renderable = false;\n          break;\n\n        // Create crop box\n        case ACTION_CROP:\n          if (!range.x || !range.y) {\n            renderable = false;\n            break;\n          }\n          offset = getOffset(this.cropper);\n          left = pointer.startX - offset.left;\n          top = pointer.startY - offset.top;\n          width = cropBoxData.minWidth;\n          height = cropBoxData.minHeight;\n          if (range.x > 0) {\n            action = range.y > 0 ? ACTION_SOUTH_EAST : ACTION_NORTH_EAST;\n          } else if (range.x < 0) {\n            left -= width;\n            action = range.y > 0 ? ACTION_SOUTH_WEST : ACTION_NORTH_WEST;\n          }\n          if (range.y < 0) {\n            top -= height;\n          }\n\n          // Show the crop box if is hidden\n          if (!this.cropped) {\n            removeClass(this.cropBox, CLASS_HIDDEN);\n            this.cropped = true;\n            if (this.limited) {\n              this.limitCropBox(true, true);\n            }\n          }\n          break;\n      }\n      if (renderable) {\n        cropBoxData.width = width;\n        cropBoxData.height = height;\n        cropBoxData.left = left;\n        cropBoxData.top = top;\n        this.action = action;\n        this.renderCropBox();\n      }\n\n      // Override\n      forEach(pointers, function (p) {\n        p.startX = p.endX;\n        p.startY = p.endY;\n      });\n    }\n  };\n\n  var methods = {\n    // Show the crop box manually\n    crop: function crop() {\n      if (this.ready && !this.cropped && !this.disabled) {\n        this.cropped = true;\n        this.limitCropBox(true, true);\n        if (this.options.modal) {\n          addClass(this.dragBox, CLASS_MODAL);\n        }\n        removeClass(this.cropBox, CLASS_HIDDEN);\n        this.setCropBoxData(this.initialCropBoxData);\n      }\n      return this;\n    },\n    // Reset the image and crop box to their initial states\n    reset: function reset() {\n      if (this.ready && !this.disabled) {\n        this.imageData = assign({}, this.initialImageData);\n        this.canvasData = assign({}, this.initialCanvasData);\n        this.cropBoxData = assign({}, this.initialCropBoxData);\n        this.renderCanvas();\n        if (this.cropped) {\n          this.renderCropBox();\n        }\n      }\n      return this;\n    },\n    // Clear the crop box\n    clear: function clear() {\n      if (this.cropped && !this.disabled) {\n        assign(this.cropBoxData, {\n          left: 0,\n          top: 0,\n          width: 0,\n          height: 0\n        });\n        this.cropped = false;\n        this.renderCropBox();\n        this.limitCanvas(true, true);\n\n        // Render canvas after crop box rendered\n        this.renderCanvas();\n        removeClass(this.dragBox, CLASS_MODAL);\n        addClass(this.cropBox, CLASS_HIDDEN);\n      }\n      return this;\n    },\n    /**\n     * Replace the image's src and rebuild the cropper\n     * @param {string} url - The new URL.\n     * @param {boolean} [hasSameSize] - Indicate if the new image has the same size as the old one.\n     * @returns {Cropper} this\n     */\n    replace: function replace(url) {\n      var hasSameSize = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n      if (!this.disabled && url) {\n        if (this.isImg) {\n          this.element.src = url;\n        }\n        if (hasSameSize) {\n          this.url = url;\n          this.image.src = url;\n          if (this.ready) {\n            this.viewBoxImage.src = url;\n            forEach(this.previews, function (element) {\n              element.getElementsByTagName('img')[0].src = url;\n            });\n          }\n        } else {\n          if (this.isImg) {\n            this.replaced = true;\n          }\n          this.options.data = null;\n          this.uncreate();\n          this.load(url);\n        }\n      }\n      return this;\n    },\n    // Enable (unfreeze) the cropper\n    enable: function enable() {\n      if (this.ready && this.disabled) {\n        this.disabled = false;\n        removeClass(this.cropper, CLASS_DISABLED);\n      }\n      return this;\n    },\n    // Disable (freeze) the cropper\n    disable: function disable() {\n      if (this.ready && !this.disabled) {\n        this.disabled = true;\n        addClass(this.cropper, CLASS_DISABLED);\n      }\n      return this;\n    },\n    /**\n     * Destroy the cropper and remove the instance from the image\n     * @returns {Cropper} this\n     */\n    destroy: function destroy() {\n      var element = this.element;\n      if (!element[NAMESPACE]) {\n        return this;\n      }\n      element[NAMESPACE] = undefined;\n      if (this.isImg && this.replaced) {\n        element.src = this.originalUrl;\n      }\n      this.uncreate();\n      return this;\n    },\n    /**\n     * Move the canvas with relative offsets\n     * @param {number} offsetX - The relative offset distance on the x-axis.\n     * @param {number} [offsetY=offsetX] - The relative offset distance on the y-axis.\n     * @returns {Cropper} this\n     */\n    move: function move(offsetX) {\n      var offsetY = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : offsetX;\n      var _this$canvasData = this.canvasData,\n        left = _this$canvasData.left,\n        top = _this$canvasData.top;\n      return this.moveTo(isUndefined(offsetX) ? offsetX : left + Number(offsetX), isUndefined(offsetY) ? offsetY : top + Number(offsetY));\n    },\n    /**\n     * Move the canvas to an absolute point\n     * @param {number} x - The x-axis coordinate.\n     * @param {number} [y=x] - The y-axis coordinate.\n     * @returns {Cropper} this\n     */\n    moveTo: function moveTo(x) {\n      var y = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : x;\n      var canvasData = this.canvasData;\n      var changed = false;\n      x = Number(x);\n      y = Number(y);\n      if (this.ready && !this.disabled && this.options.movable) {\n        if (isNumber(x)) {\n          canvasData.left = x;\n          changed = true;\n        }\n        if (isNumber(y)) {\n          canvasData.top = y;\n          changed = true;\n        }\n        if (changed) {\n          this.renderCanvas(true);\n        }\n      }\n      return this;\n    },\n    /**\n     * Zoom the canvas with a relative ratio\n     * @param {number} ratio - The target ratio.\n     * @param {Event} _originalEvent - The original event if any.\n     * @returns {Cropper} this\n     */\n    zoom: function zoom(ratio, _originalEvent) {\n      var canvasData = this.canvasData;\n      ratio = Number(ratio);\n      if (ratio < 0) {\n        ratio = 1 / (1 - ratio);\n      } else {\n        ratio = 1 + ratio;\n      }\n      return this.zoomTo(canvasData.width * ratio / canvasData.naturalWidth, null, _originalEvent);\n    },\n    /**\n     * Zoom the canvas to an absolute ratio\n     * @param {number} ratio - The target ratio.\n     * @param {Object} pivot - The zoom pivot point coordinate.\n     * @param {Event} _originalEvent - The original event if any.\n     * @returns {Cropper} this\n     */\n    zoomTo: function zoomTo(ratio, pivot, _originalEvent) {\n      var options = this.options,\n        canvasData = this.canvasData;\n      var width = canvasData.width,\n        height = canvasData.height,\n        naturalWidth = canvasData.naturalWidth,\n        naturalHeight = canvasData.naturalHeight;\n      ratio = Number(ratio);\n      if (ratio >= 0 && this.ready && !this.disabled && options.zoomable) {\n        var newWidth = naturalWidth * ratio;\n        var newHeight = naturalHeight * ratio;\n        if (dispatchEvent(this.element, EVENT_ZOOM, {\n          ratio: ratio,\n          oldRatio: width / naturalWidth,\n          originalEvent: _originalEvent\n        }) === false) {\n          return this;\n        }\n        if (_originalEvent) {\n          var pointers = this.pointers;\n          var offset = getOffset(this.cropper);\n          var center = pointers && Object.keys(pointers).length ? getPointersCenter(pointers) : {\n            pageX: _originalEvent.pageX,\n            pageY: _originalEvent.pageY\n          };\n\n          // Zoom from the triggering point of the event\n          canvasData.left -= (newWidth - width) * ((center.pageX - offset.left - canvasData.left) / width);\n          canvasData.top -= (newHeight - height) * ((center.pageY - offset.top - canvasData.top) / height);\n        } else if (isPlainObject(pivot) && isNumber(pivot.x) && isNumber(pivot.y)) {\n          canvasData.left -= (newWidth - width) * ((pivot.x - canvasData.left) / width);\n          canvasData.top -= (newHeight - height) * ((pivot.y - canvasData.top) / height);\n        } else {\n          // Zoom from the center of the canvas\n          canvasData.left -= (newWidth - width) / 2;\n          canvasData.top -= (newHeight - height) / 2;\n        }\n        canvasData.width = newWidth;\n        canvasData.height = newHeight;\n        this.renderCanvas(true);\n      }\n      return this;\n    },\n    /**\n     * Rotate the canvas with a relative degree\n     * @param {number} degree - The rotate degree.\n     * @returns {Cropper} this\n     */\n    rotate: function rotate(degree) {\n      return this.rotateTo((this.imageData.rotate || 0) + Number(degree));\n    },\n    /**\n     * Rotate the canvas to an absolute degree\n     * @param {number} degree - The rotate degree.\n     * @returns {Cropper} this\n     */\n    rotateTo: function rotateTo(degree) {\n      degree = Number(degree);\n      if (isNumber(degree) && this.ready && !this.disabled && this.options.rotatable) {\n        this.imageData.rotate = degree % 360;\n        this.renderCanvas(true, true);\n      }\n      return this;\n    },\n    /**\n     * Scale the image on the x-axis.\n     * @param {number} scaleX - The scale ratio on the x-axis.\n     * @returns {Cropper} this\n     */\n    scaleX: function scaleX(_scaleX) {\n      var scaleY = this.imageData.scaleY;\n      return this.scale(_scaleX, isNumber(scaleY) ? scaleY : 1);\n    },\n    /**\n     * Scale the image on the y-axis.\n     * @param {number} scaleY - The scale ratio on the y-axis.\n     * @returns {Cropper} this\n     */\n    scaleY: function scaleY(_scaleY) {\n      var scaleX = this.imageData.scaleX;\n      return this.scale(isNumber(scaleX) ? scaleX : 1, _scaleY);\n    },\n    /**\n     * Scale the image\n     * @param {number} scaleX - The scale ratio on the x-axis.\n     * @param {number} [scaleY=scaleX] - The scale ratio on the y-axis.\n     * @returns {Cropper} this\n     */\n    scale: function scale(scaleX) {\n      var scaleY = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : scaleX;\n      var imageData = this.imageData;\n      var transformed = false;\n      scaleX = Number(scaleX);\n      scaleY = Number(scaleY);\n      if (this.ready && !this.disabled && this.options.scalable) {\n        if (isNumber(scaleX)) {\n          imageData.scaleX = scaleX;\n          transformed = true;\n        }\n        if (isNumber(scaleY)) {\n          imageData.scaleY = scaleY;\n          transformed = true;\n        }\n        if (transformed) {\n          this.renderCanvas(true, true);\n        }\n      }\n      return this;\n    },\n    /**\n     * Get the cropped area position and size data (base on the original image)\n     * @param {boolean} [rounded=false] - Indicate if round the data values or not.\n     * @returns {Object} The result cropped data.\n     */\n    getData: function getData() {\n      var rounded = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n      var options = this.options,\n        imageData = this.imageData,\n        canvasData = this.canvasData,\n        cropBoxData = this.cropBoxData;\n      var data;\n      if (this.ready && this.cropped) {\n        data = {\n          x: cropBoxData.left - canvasData.left,\n          y: cropBoxData.top - canvasData.top,\n          width: cropBoxData.width,\n          height: cropBoxData.height\n        };\n        var ratio = imageData.width / imageData.naturalWidth;\n        forEach(data, function (n, i) {\n          data[i] = n / ratio;\n        });\n        if (rounded) {\n          // In case rounding off leads to extra 1px in right or bottom border\n          // we should round the top-left corner and the dimension (#343).\n          var bottom = Math.round(data.y + data.height);\n          var right = Math.round(data.x + data.width);\n          data.x = Math.round(data.x);\n          data.y = Math.round(data.y);\n          data.width = right - data.x;\n          data.height = bottom - data.y;\n        }\n      } else {\n        data = {\n          x: 0,\n          y: 0,\n          width: 0,\n          height: 0\n        };\n      }\n      if (options.rotatable) {\n        data.rotate = imageData.rotate || 0;\n      }\n      if (options.scalable) {\n        data.scaleX = imageData.scaleX || 1;\n        data.scaleY = imageData.scaleY || 1;\n      }\n      return data;\n    },\n    /**\n     * Set the cropped area position and size with new data\n     * @param {Object} data - The new data.\n     * @returns {Cropper} this\n     */\n    setData: function setData(data) {\n      var options = this.options,\n        imageData = this.imageData,\n        canvasData = this.canvasData;\n      var cropBoxData = {};\n      if (this.ready && !this.disabled && isPlainObject(data)) {\n        var transformed = false;\n        if (options.rotatable) {\n          if (isNumber(data.rotate) && data.rotate !== imageData.rotate) {\n            imageData.rotate = data.rotate;\n            transformed = true;\n          }\n        }\n        if (options.scalable) {\n          if (isNumber(data.scaleX) && data.scaleX !== imageData.scaleX) {\n            imageData.scaleX = data.scaleX;\n            transformed = true;\n          }\n          if (isNumber(data.scaleY) && data.scaleY !== imageData.scaleY) {\n            imageData.scaleY = data.scaleY;\n            transformed = true;\n          }\n        }\n        if (transformed) {\n          this.renderCanvas(true, true);\n        }\n        var ratio = imageData.width / imageData.naturalWidth;\n        if (isNumber(data.x)) {\n          cropBoxData.left = data.x * ratio + canvasData.left;\n        }\n        if (isNumber(data.y)) {\n          cropBoxData.top = data.y * ratio + canvasData.top;\n        }\n        if (isNumber(data.width)) {\n          cropBoxData.width = data.width * ratio;\n        }\n        if (isNumber(data.height)) {\n          cropBoxData.height = data.height * ratio;\n        }\n        this.setCropBoxData(cropBoxData);\n      }\n      return this;\n    },\n    /**\n     * Get the container size data.\n     * @returns {Object} The result container data.\n     */\n    getContainerData: function getContainerData() {\n      return this.ready ? assign({}, this.containerData) : {};\n    },\n    /**\n     * Get the image position and size data.\n     * @returns {Object} The result image data.\n     */\n    getImageData: function getImageData() {\n      return this.sized ? assign({}, this.imageData) : {};\n    },\n    /**\n     * Get the canvas position and size data.\n     * @returns {Object} The result canvas data.\n     */\n    getCanvasData: function getCanvasData() {\n      var canvasData = this.canvasData;\n      var data = {};\n      if (this.ready) {\n        forEach(['left', 'top', 'width', 'height', 'naturalWidth', 'naturalHeight'], function (n) {\n          data[n] = canvasData[n];\n        });\n      }\n      return data;\n    },\n    /**\n     * Set the canvas position and size with new data.\n     * @param {Object} data - The new canvas data.\n     * @returns {Cropper} this\n     */\n    setCanvasData: function setCanvasData(data) {\n      var canvasData = this.canvasData;\n      var aspectRatio = canvasData.aspectRatio;\n      if (this.ready && !this.disabled && isPlainObject(data)) {\n        if (isNumber(data.left)) {\n          canvasData.left = data.left;\n        }\n        if (isNumber(data.top)) {\n          canvasData.top = data.top;\n        }\n        if (isNumber(data.width)) {\n          canvasData.width = data.width;\n          canvasData.height = data.width / aspectRatio;\n        } else if (isNumber(data.height)) {\n          canvasData.height = data.height;\n          canvasData.width = data.height * aspectRatio;\n        }\n        this.renderCanvas(true);\n      }\n      return this;\n    },\n    /**\n     * Get the crop box position and size data.\n     * @returns {Object} The result crop box data.\n     */\n    getCropBoxData: function getCropBoxData() {\n      var cropBoxData = this.cropBoxData;\n      var data;\n      if (this.ready && this.cropped) {\n        data = {\n          left: cropBoxData.left,\n          top: cropBoxData.top,\n          width: cropBoxData.width,\n          height: cropBoxData.height\n        };\n      }\n      return data || {};\n    },\n    /**\n     * Set the crop box position and size with new data.\n     * @param {Object} data - The new crop box data.\n     * @returns {Cropper} this\n     */\n    setCropBoxData: function setCropBoxData(data) {\n      var cropBoxData = this.cropBoxData;\n      var aspectRatio = this.options.aspectRatio;\n      var widthChanged;\n      var heightChanged;\n      if (this.ready && this.cropped && !this.disabled && isPlainObject(data)) {\n        if (isNumber(data.left)) {\n          cropBoxData.left = data.left;\n        }\n        if (isNumber(data.top)) {\n          cropBoxData.top = data.top;\n        }\n        if (isNumber(data.width) && data.width !== cropBoxData.width) {\n          widthChanged = true;\n          cropBoxData.width = data.width;\n        }\n        if (isNumber(data.height) && data.height !== cropBoxData.height) {\n          heightChanged = true;\n          cropBoxData.height = data.height;\n        }\n        if (aspectRatio) {\n          if (widthChanged) {\n            cropBoxData.height = cropBoxData.width / aspectRatio;\n          } else if (heightChanged) {\n            cropBoxData.width = cropBoxData.height * aspectRatio;\n          }\n        }\n        this.renderCropBox();\n      }\n      return this;\n    },\n    /**\n     * Get a canvas drawn the cropped image.\n     * @param {Object} [options={}] - The config options.\n     * @returns {HTMLCanvasElement} - The result canvas.\n     */\n    getCroppedCanvas: function getCroppedCanvas() {\n      var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n      if (!this.ready || !window.HTMLCanvasElement) {\n        return null;\n      }\n      var canvasData = this.canvasData;\n      var source = getSourceCanvas(this.image, this.imageData, canvasData, options);\n\n      // Returns the source canvas if it is not cropped.\n      if (!this.cropped) {\n        return source;\n      }\n      var _this$getData = this.getData(options.rounded),\n        initialX = _this$getData.x,\n        initialY = _this$getData.y,\n        initialWidth = _this$getData.width,\n        initialHeight = _this$getData.height;\n      var ratio = source.width / Math.floor(canvasData.naturalWidth);\n      if (ratio !== 1) {\n        initialX *= ratio;\n        initialY *= ratio;\n        initialWidth *= ratio;\n        initialHeight *= ratio;\n      }\n      var aspectRatio = initialWidth / initialHeight;\n      var maxSizes = getAdjustedSizes({\n        aspectRatio: aspectRatio,\n        width: options.maxWidth || Infinity,\n        height: options.maxHeight || Infinity\n      });\n      var minSizes = getAdjustedSizes({\n        aspectRatio: aspectRatio,\n        width: options.minWidth || 0,\n        height: options.minHeight || 0\n      }, 'cover');\n      var _getAdjustedSizes = getAdjustedSizes({\n          aspectRatio: aspectRatio,\n          width: options.width || (ratio !== 1 ? source.width : initialWidth),\n          height: options.height || (ratio !== 1 ? source.height : initialHeight)\n        }),\n        width = _getAdjustedSizes.width,\n        height = _getAdjustedSizes.height;\n      width = Math.min(maxSizes.width, Math.max(minSizes.width, width));\n      height = Math.min(maxSizes.height, Math.max(minSizes.height, height));\n      var canvas = document.createElement('canvas');\n      var context = canvas.getContext('2d');\n      canvas.width = normalizeDecimalNumber(width);\n      canvas.height = normalizeDecimalNumber(height);\n      context.fillStyle = options.fillColor || 'transparent';\n      context.fillRect(0, 0, width, height);\n      var _options$imageSmoothi = options.imageSmoothingEnabled,\n        imageSmoothingEnabled = _options$imageSmoothi === void 0 ? true : _options$imageSmoothi,\n        imageSmoothingQuality = options.imageSmoothingQuality;\n      context.imageSmoothingEnabled = imageSmoothingEnabled;\n      if (imageSmoothingQuality) {\n        context.imageSmoothingQuality = imageSmoothingQuality;\n      }\n\n      // https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D.drawImage\n      var sourceWidth = source.width;\n      var sourceHeight = source.height;\n\n      // Source canvas parameters\n      var srcX = initialX;\n      var srcY = initialY;\n      var srcWidth;\n      var srcHeight;\n\n      // Destination canvas parameters\n      var dstX;\n      var dstY;\n      var dstWidth;\n      var dstHeight;\n      if (srcX <= -initialWidth || srcX > sourceWidth) {\n        srcX = 0;\n        srcWidth = 0;\n        dstX = 0;\n        dstWidth = 0;\n      } else if (srcX <= 0) {\n        dstX = -srcX;\n        srcX = 0;\n        srcWidth = Math.min(sourceWidth, initialWidth + srcX);\n        dstWidth = srcWidth;\n      } else if (srcX <= sourceWidth) {\n        dstX = 0;\n        srcWidth = Math.min(initialWidth, sourceWidth - srcX);\n        dstWidth = srcWidth;\n      }\n      if (srcWidth <= 0 || srcY <= -initialHeight || srcY > sourceHeight) {\n        srcY = 0;\n        srcHeight = 0;\n        dstY = 0;\n        dstHeight = 0;\n      } else if (srcY <= 0) {\n        dstY = -srcY;\n        srcY = 0;\n        srcHeight = Math.min(sourceHeight, initialHeight + srcY);\n        dstHeight = srcHeight;\n      } else if (srcY <= sourceHeight) {\n        dstY = 0;\n        srcHeight = Math.min(initialHeight, sourceHeight - srcY);\n        dstHeight = srcHeight;\n      }\n      var params = [srcX, srcY, srcWidth, srcHeight];\n\n      // Avoid \"IndexSizeError\"\n      if (dstWidth > 0 && dstHeight > 0) {\n        var scale = width / initialWidth;\n        params.push(dstX * scale, dstY * scale, dstWidth * scale, dstHeight * scale);\n      }\n\n      // All the numerical parameters should be integer for `drawImage`\n      // https://github.com/fengyuanchen/cropper/issues/476\n      context.drawImage.apply(context, [source].concat(_toConsumableArray(params.map(function (param) {\n        return Math.floor(normalizeDecimalNumber(param));\n      }))));\n      return canvas;\n    },\n    /**\n     * Change the aspect ratio of the crop box.\n     * @param {number} aspectRatio - The new aspect ratio.\n     * @returns {Cropper} this\n     */\n    setAspectRatio: function setAspectRatio(aspectRatio) {\n      var options = this.options;\n      if (!this.disabled && !isUndefined(aspectRatio)) {\n        // 0 -> NaN\n        options.aspectRatio = Math.max(0, aspectRatio) || NaN;\n        if (this.ready) {\n          this.initCropBox();\n          if (this.cropped) {\n            this.renderCropBox();\n          }\n        }\n      }\n      return this;\n    },\n    /**\n     * Change the drag mode.\n     * @param {string} mode - The new drag mode.\n     * @returns {Cropper} this\n     */\n    setDragMode: function setDragMode(mode) {\n      var options = this.options,\n        dragBox = this.dragBox,\n        face = this.face;\n      if (this.ready && !this.disabled) {\n        var croppable = mode === DRAG_MODE_CROP;\n        var movable = options.movable && mode === DRAG_MODE_MOVE;\n        mode = croppable || movable ? mode : DRAG_MODE_NONE;\n        options.dragMode = mode;\n        setData(dragBox, DATA_ACTION, mode);\n        toggleClass(dragBox, CLASS_CROP, croppable);\n        toggleClass(dragBox, CLASS_MOVE, movable);\n        if (!options.cropBoxMovable) {\n          // Sync drag mode to crop box when it is not movable\n          setData(face, DATA_ACTION, mode);\n          toggleClass(face, CLASS_CROP, croppable);\n          toggleClass(face, CLASS_MOVE, movable);\n        }\n      }\n      return this;\n    }\n  };\n\n  var AnotherCropper = WINDOW.Cropper;\n  var Cropper = /*#__PURE__*/function () {\n    /**\n     * Create a new Cropper.\n     * @param {Element} element - The target element for cropping.\n     * @param {Object} [options={}] - The configuration options.\n     */\n    function Cropper(element) {\n      var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n      _classCallCheck(this, Cropper);\n      if (!element || !REGEXP_TAG_NAME.test(element.tagName)) {\n        throw new Error('The first argument is required and must be an <img> or <canvas> element.');\n      }\n      this.element = element;\n      this.options = assign({}, DEFAULTS, isPlainObject(options) && options);\n      this.cropped = false;\n      this.disabled = false;\n      this.pointers = {};\n      this.ready = false;\n      this.reloading = false;\n      this.replaced = false;\n      this.sized = false;\n      this.sizing = false;\n      this.init();\n    }\n    return _createClass(Cropper, [{\n      key: \"init\",\n      value: function init() {\n        var element = this.element;\n        var tagName = element.tagName.toLowerCase();\n        var url;\n        if (element[NAMESPACE]) {\n          return;\n        }\n        element[NAMESPACE] = this;\n        if (tagName === 'img') {\n          this.isImg = true;\n\n          // e.g.: \"img/picture.jpg\"\n          url = element.getAttribute('src') || '';\n          this.originalUrl = url;\n\n          // Stop when it's a blank image\n          if (!url) {\n            return;\n          }\n\n          // e.g.: \"https://example.com/img/picture.jpg\"\n          url = element.src;\n        } else if (tagName === 'canvas' && window.HTMLCanvasElement) {\n          url = element.toDataURL();\n        }\n        this.load(url);\n      }\n    }, {\n      key: \"load\",\n      value: function load(url) {\n        var _this = this;\n        if (!url) {\n          return;\n        }\n        this.url = url;\n        this.imageData = {};\n        var element = this.element,\n          options = this.options;\n        if (!options.rotatable && !options.scalable) {\n          options.checkOrientation = false;\n        }\n\n        // Only IE10+ supports Typed Arrays\n        if (!options.checkOrientation || !window.ArrayBuffer) {\n          this.clone();\n          return;\n        }\n\n        // Detect the mime type of the image directly if it is a Data URL\n        if (REGEXP_DATA_URL.test(url)) {\n          // Read ArrayBuffer from Data URL of JPEG images directly for better performance\n          if (REGEXP_DATA_URL_JPEG.test(url)) {\n            this.read(dataURLToArrayBuffer(url));\n          } else {\n            // Only a JPEG image may contains Exif Orientation information,\n            // the rest types of Data URLs are not necessary to check orientation at all.\n            this.clone();\n          }\n          return;\n        }\n\n        // 1. Detect the mime type of the image by a XMLHttpRequest.\n        // 2. Load the image as ArrayBuffer for reading orientation if its a JPEG image.\n        var xhr = new XMLHttpRequest();\n        var clone = this.clone.bind(this);\n        this.reloading = true;\n        this.xhr = xhr;\n\n        // 1. Cross origin requests are only supported for protocol schemes:\n        // http, https, data, chrome, chrome-extension.\n        // 2. Access to XMLHttpRequest from a Data URL will be blocked by CORS policy\n        // in some browsers as IE11 and Safari.\n        xhr.onabort = clone;\n        xhr.onerror = clone;\n        xhr.ontimeout = clone;\n        xhr.onprogress = function () {\n          // Abort the request directly if it not a JPEG image for better performance\n          if (xhr.getResponseHeader('content-type') !== MIME_TYPE_JPEG) {\n            xhr.abort();\n          }\n        };\n        xhr.onload = function () {\n          _this.read(xhr.response);\n        };\n        xhr.onloadend = function () {\n          _this.reloading = false;\n          _this.xhr = null;\n        };\n\n        // Bust cache when there is a \"crossOrigin\" property to avoid browser cache error\n        if (options.checkCrossOrigin && isCrossOriginURL(url) && element.crossOrigin) {\n          url = addTimestamp(url);\n        }\n\n        // The third parameter is required for avoiding side-effect (#682)\n        xhr.open('GET', url, true);\n        xhr.responseType = 'arraybuffer';\n        xhr.withCredentials = element.crossOrigin === 'use-credentials';\n        xhr.send();\n      }\n    }, {\n      key: \"read\",\n      value: function read(arrayBuffer) {\n        var options = this.options,\n          imageData = this.imageData;\n\n        // Reset the orientation value to its default value 1\n        // as some iOS browsers will render image with its orientation\n        var orientation = resetAndGetOrientation(arrayBuffer);\n        var rotate = 0;\n        var scaleX = 1;\n        var scaleY = 1;\n        if (orientation > 1) {\n          // Generate a new URL which has the default orientation value\n          this.url = arrayBufferToDataURL(arrayBuffer, MIME_TYPE_JPEG);\n          var _parseOrientation = parseOrientation(orientation);\n          rotate = _parseOrientation.rotate;\n          scaleX = _parseOrientation.scaleX;\n          scaleY = _parseOrientation.scaleY;\n        }\n        if (options.rotatable) {\n          imageData.rotate = rotate;\n        }\n        if (options.scalable) {\n          imageData.scaleX = scaleX;\n          imageData.scaleY = scaleY;\n        }\n        this.clone();\n      }\n    }, {\n      key: \"clone\",\n      value: function clone() {\n        var element = this.element,\n          url = this.url;\n        var crossOrigin = element.crossOrigin;\n        var crossOriginUrl = url;\n        if (this.options.checkCrossOrigin && isCrossOriginURL(url)) {\n          if (!crossOrigin) {\n            crossOrigin = 'anonymous';\n          }\n\n          // Bust cache when there is not a \"crossOrigin\" property (#519)\n          crossOriginUrl = addTimestamp(url);\n        }\n        this.crossOrigin = crossOrigin;\n        this.crossOriginUrl = crossOriginUrl;\n        var image = document.createElement('img');\n        if (crossOrigin) {\n          image.crossOrigin = crossOrigin;\n        }\n        image.src = crossOriginUrl || url;\n        image.alt = element.alt || 'The image to crop';\n        this.image = image;\n        image.onload = this.start.bind(this);\n        image.onerror = this.stop.bind(this);\n        addClass(image, CLASS_HIDE);\n        element.parentNode.insertBefore(image, element.nextSibling);\n      }\n    }, {\n      key: \"start\",\n      value: function start() {\n        var _this2 = this;\n        var image = this.image;\n        image.onload = null;\n        image.onerror = null;\n        this.sizing = true;\n\n        // Match all browsers that use WebKit as the layout engine in iOS devices,\n        // such as Safari for iOS, Chrome for iOS, and in-app browsers.\n        var isIOSWebKit = WINDOW.navigator && /(?:iPad|iPhone|iPod).*?AppleWebKit/i.test(WINDOW.navigator.userAgent);\n        var done = function done(naturalWidth, naturalHeight) {\n          assign(_this2.imageData, {\n            naturalWidth: naturalWidth,\n            naturalHeight: naturalHeight,\n            aspectRatio: naturalWidth / naturalHeight\n          });\n          _this2.initialImageData = assign({}, _this2.imageData);\n          _this2.sizing = false;\n          _this2.sized = true;\n          _this2.build();\n        };\n\n        // Most modern browsers (excepts iOS WebKit)\n        if (image.naturalWidth && !isIOSWebKit) {\n          done(image.naturalWidth, image.naturalHeight);\n          return;\n        }\n        var sizingImage = document.createElement('img');\n        var body = document.body || document.documentElement;\n        this.sizingImage = sizingImage;\n        sizingImage.onload = function () {\n          done(sizingImage.width, sizingImage.height);\n          if (!isIOSWebKit) {\n            body.removeChild(sizingImage);\n          }\n        };\n        sizingImage.src = image.src;\n\n        // iOS WebKit will convert the image automatically\n        // with its orientation once append it into DOM (#279)\n        if (!isIOSWebKit) {\n          sizingImage.style.cssText = 'left:0;' + 'max-height:none!important;' + 'max-width:none!important;' + 'min-height:0!important;' + 'min-width:0!important;' + 'opacity:0;' + 'position:absolute;' + 'top:0;' + 'z-index:-1;';\n          body.appendChild(sizingImage);\n        }\n      }\n    }, {\n      key: \"stop\",\n      value: function stop() {\n        var image = this.image;\n        image.onload = null;\n        image.onerror = null;\n        image.parentNode.removeChild(image);\n        this.image = null;\n      }\n    }, {\n      key: \"build\",\n      value: function build() {\n        if (!this.sized || this.ready) {\n          return;\n        }\n        var element = this.element,\n          options = this.options,\n          image = this.image;\n\n        // Create cropper elements\n        var container = element.parentNode;\n        var template = document.createElement('div');\n        template.innerHTML = TEMPLATE;\n        var cropper = template.querySelector(\".\".concat(NAMESPACE, \"-container\"));\n        var canvas = cropper.querySelector(\".\".concat(NAMESPACE, \"-canvas\"));\n        var dragBox = cropper.querySelector(\".\".concat(NAMESPACE, \"-drag-box\"));\n        var cropBox = cropper.querySelector(\".\".concat(NAMESPACE, \"-crop-box\"));\n        var face = cropBox.querySelector(\".\".concat(NAMESPACE, \"-face\"));\n        this.container = container;\n        this.cropper = cropper;\n        this.canvas = canvas;\n        this.dragBox = dragBox;\n        this.cropBox = cropBox;\n        this.viewBox = cropper.querySelector(\".\".concat(NAMESPACE, \"-view-box\"));\n        this.face = face;\n        canvas.appendChild(image);\n\n        // Hide the original image\n        addClass(element, CLASS_HIDDEN);\n\n        // Inserts the cropper after to the current image\n        container.insertBefore(cropper, element.nextSibling);\n\n        // Show the hidden image\n        removeClass(image, CLASS_HIDE);\n        this.initPreview();\n        this.bind();\n        options.initialAspectRatio = Math.max(0, options.initialAspectRatio) || NaN;\n        options.aspectRatio = Math.max(0, options.aspectRatio) || NaN;\n        options.viewMode = Math.max(0, Math.min(3, Math.round(options.viewMode))) || 0;\n        addClass(cropBox, CLASS_HIDDEN);\n        if (!options.guides) {\n          addClass(cropBox.getElementsByClassName(\"\".concat(NAMESPACE, \"-dashed\")), CLASS_HIDDEN);\n        }\n        if (!options.center) {\n          addClass(cropBox.getElementsByClassName(\"\".concat(NAMESPACE, \"-center\")), CLASS_HIDDEN);\n        }\n        if (options.background) {\n          addClass(cropper, \"\".concat(NAMESPACE, \"-bg\"));\n        }\n        if (!options.highlight) {\n          addClass(face, CLASS_INVISIBLE);\n        }\n        if (options.cropBoxMovable) {\n          addClass(face, CLASS_MOVE);\n          setData(face, DATA_ACTION, ACTION_ALL);\n        }\n        if (!options.cropBoxResizable) {\n          addClass(cropBox.getElementsByClassName(\"\".concat(NAMESPACE, \"-line\")), CLASS_HIDDEN);\n          addClass(cropBox.getElementsByClassName(\"\".concat(NAMESPACE, \"-point\")), CLASS_HIDDEN);\n        }\n        this.render();\n        this.ready = true;\n        this.setDragMode(options.dragMode);\n        if (options.autoCrop) {\n          this.crop();\n        }\n        this.setData(options.data);\n        if (isFunction(options.ready)) {\n          addListener(element, EVENT_READY, options.ready, {\n            once: true\n          });\n        }\n        dispatchEvent(element, EVENT_READY);\n      }\n    }, {\n      key: \"unbuild\",\n      value: function unbuild() {\n        if (!this.ready) {\n          return;\n        }\n        this.ready = false;\n        this.unbind();\n        this.resetPreview();\n        var parentNode = this.cropper.parentNode;\n        if (parentNode) {\n          parentNode.removeChild(this.cropper);\n        }\n        removeClass(this.element, CLASS_HIDDEN);\n      }\n    }, {\n      key: \"uncreate\",\n      value: function uncreate() {\n        if (this.ready) {\n          this.unbuild();\n          this.ready = false;\n          this.cropped = false;\n        } else if (this.sizing) {\n          this.sizingImage.onload = null;\n          this.sizing = false;\n          this.sized = false;\n        } else if (this.reloading) {\n          this.xhr.onabort = null;\n          this.xhr.abort();\n        } else if (this.image) {\n          this.stop();\n        }\n      }\n\n      /**\n       * Get the no conflict cropper class.\n       * @returns {Cropper} The cropper class.\n       */\n    }], [{\n      key: \"noConflict\",\n      value: function noConflict() {\n        window.Cropper = AnotherCropper;\n        return Cropper;\n      }\n\n      /**\n       * Change the default options.\n       * @param {Object} options - The new default options.\n       */\n    }, {\n      key: \"setDefaults\",\n      value: function setDefaults(options) {\n        assign(DEFAULTS, isPlainObject(options) && options);\n      }\n    }]);\n  }();\n  assign(Cropper.prototype, render, preview, events, handlers, change, methods);\n\n  return Cropper;\n\n}));\n","import e,{useRef as r,useEffect as o}from\"react\";import t from\"cropperjs\";var n=function(){return n=Object.assign||function(e){for(var r,o=1,t=arguments.length;o<t;o++)for(var n in r=arguments[o])Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n]);return e},n.apply(this,arguments)};function a(e,r){var o={};for(var t in e)Object.prototype.hasOwnProperty.call(e,t)&&r.indexOf(t)<0&&(o[t]=e[t]);if(null!=e&&\"function\"==typeof Object.getOwnPropertySymbols){var n=0;for(t=Object.getOwnPropertySymbols(e);n<t.length;n++)r.indexOf(t[n])<0&&Object.prototype.propertyIsEnumerable.call(e,t[n])&&(o[t[n]]=e[t[n]])}return o}var c=[\"aspectRatio\",\"autoCrop\",\"autoCropArea\",\"background\",\"center\",\"checkCrossOrigin\",\"checkOrientation\",\"cropBoxMovable\",\"cropBoxResizable\",\"data\",\"dragMode\",\"guides\",\"highlight\",\"initialAspectRatio\",\"minCanvasHeight\",\"minCanvasWidth\",\"minContainerHeight\",\"minContainerWidth\",\"minCropBoxHeight\",\"minCropBoxWidth\",\"modal\",\"movable\",\"preview\",\"responsive\",\"restore\",\"rotatable\",\"scalable\",\"toggleDragModeOnDblclick\",\"viewMode\",\"wheelZoomRatio\",\"zoomOnTouch\",\"zoomOnWheel\",\"zoomable\",\"cropstart\",\"cropmove\",\"cropend\",\"crop\",\"zoom\",\"ready\"],i={opacity:0,maxWidth:\"100%\"},l=e.forwardRef((function(l,s){var u=a(l,[]),p=u.dragMode,d=void 0===p?\"crop\":p,v=u.src,f=u.style,m=u.className,g=u.crossOrigin,y=u.scaleX,b=u.scaleY,h=u.enable,O=u.zoomTo,T=u.rotateTo,z=u.alt,C=void 0===z?\"picture\":z,w=u.ready,x=u.onInitialized,j=a(u,[\"dragMode\",\"src\",\"style\",\"className\",\"crossOrigin\",\"scaleX\",\"scaleY\",\"enable\",\"zoomTo\",\"rotateTo\",\"alt\",\"ready\",\"onInitialized\"]),M={scaleY:b,scaleX:y,enable:h,zoomTo:O,rotateTo:T},E=function(){for(var o=[],t=0;t<arguments.length;t++)o[t]=arguments[t];var n=r(null);return e.useEffect((function(){o.forEach((function(e){e&&(\"function\"==typeof e?e(n.current):e.current=n.current)}))}),[o]),n}(s,r(null));o((function(){var e;(null===(e=E.current)||void 0===e?void 0:e.cropper)&&\"number\"==typeof O&&E.current.cropper.zoomTo(O)}),[u.zoomTo]),o((function(){var e;(null===(e=E.current)||void 0===e?void 0:e.cropper)&&void 0!==v&&E.current.cropper.reset().clear().replace(v)}),[v]),o((function(){if(null!==E.current){var e=new t(E.current,n(n({dragMode:d},j),{ready:function(e){null!==e.currentTarget&&function(e,r){void 0===r&&(r={});var o=r.enable,t=void 0===o||o,n=r.scaleX,a=void 0===n?1:n,c=r.scaleY,i=void 0===c?1:c,l=r.zoomTo,s=void 0===l?0:l,u=r.rotateTo;t?e.enable():e.disable(),e.scaleX(a),e.scaleY(i),void 0!==u&&e.rotateTo(u),s>0&&e.zoomTo(s)}(e.currentTarget.cropper,M),w&&w(e)}}));x&&x(e)}return function(){var e,r;null===(r=null===(e=E.current)||void 0===e?void 0:e.cropper)||void 0===r||r.destroy()}}),[E]);var R=function(e){return c.reduce((function(e,r){var o=e,t=r;return o[t],a(o,[\"symbol\"==typeof t?t:t+\"\"])}),e)}(n(n({},j),{crossOrigin:g,src:v,alt:C}));return e.createElement(\"div\",{style:f,className:m},e.createElement(\"img\",n({},R,{style:i,ref:E})))}));export{l as Cropper,l as default};\n"],"names":["module","exports","ownKeys","e","r","t","Object","keys","getOwnPropertySymbols","o","filter","getOwnPropertyDescriptor","enumerable","push","apply","_objectSpread2","arguments","length","forEach","_defineProperty","getOwnPropertyDescriptors","defineProperties","defineProperty","_toPrimitive","Symbol","toPrimitive","i","call","TypeError","String","Number","_toPropertyKey","_typeof","iterator","constructor","prototype","_classCallCheck","instance","Constructor","_defineProperties","target","props","descriptor","configurable","writable","key","_createClass","protoProps","staticProps","obj","value","_toConsumableArray","arr","_arrayWithoutHoles","_iterableToArray","_unsupportedIterableToArray","_nonIterableSpread","Array","isArray","_arrayLikeToArray","iter","from","minLen","n","toString","slice","name","test","len","arr2","IS_BROWSER","window","document","WINDOW","IS_TOUCH_DEVICE","documentElement","HAS_POINTER_EVENT","NAMESPACE","ACTION_ALL","ACTION_CROP","ACTION_MOVE","ACTION_ZOOM","ACTION_EAST","ACTION_WEST","ACTION_SOUTH","ACTION_NORTH","ACTION_NORTH_EAST","ACTION_NORTH_WEST","ACTION_SOUTH_EAST","ACTION_SOUTH_WEST","CLASS_CROP","concat","CLASS_DISABLED","CLASS_HIDDEN","CLASS_HIDE","CLASS_INVISIBLE","CLASS_MODAL","CLASS_MOVE","DATA_ACTION","DATA_PREVIEW","DRAG_MODE_CROP","DRAG_MODE_MOVE","DRAG_MODE_NONE","EVENT_CROP","EVENT_CROP_END","EVENT_CROP_MOVE","EVENT_CROP_START","EVENT_DBLCLICK","EVENT_TOUCH_START","EVENT_TOUCH_MOVE","EVENT_TOUCH_END","EVENT_POINTER_DOWN","EVENT_POINTER_MOVE","EVENT_POINTER_UP","EVENT_READY","EVENT_RESIZE","EVENT_WHEEL","EVENT_ZOOM","MIME_TYPE_JPEG","REGEXP_ACTIONS","REGEXP_DATA_URL","REGEXP_DATA_URL_JPEG","REGEXP_TAG_NAME","MIN_CONTAINER_WIDTH","MIN_CONTAINER_HEIGHT","DEFAULTS","viewMode","dragMode","initialAspectRatio","NaN","aspectRatio","data","preview","responsive","restore","checkCrossOrigin","checkOrientation","modal","guides","center","highlight","background","autoCrop","autoCropArea","movable","rotatable","scalable","zoomable","zoomOnTouch","zoomOnWheel","wheelZoomRatio","cropBoxMovable","cropBoxResizable","toggleDragModeOnDblclick","minCanvasWidth","minCanvasHeight","minCropBoxWidth","minCropBoxHeight","minContainerWidth","minContainerHeight","ready","cropstart","cropmove","cropend","crop","zoom","TEMPLATE","isNaN","isNumber","isPositiveNumber","Infinity","isUndefined","isObject","hasOwnProperty","isPlainObject","_constructor","error","isFunction","toArray","callback","assign","_len","args","_key","arg","REGEXP_DECIMALS","normalizeDecimalNumber","times","undefined","Math","round","REGEXP_SUFFIX","setStyle","element","styles","style","property","hasClass","classList","contains","className","indexOf","addClass","elem","add","trim","removeClass","remove","replace","toggleClass","added","REGEXP_CAMEL_CASE","toParamCase","toLowerCase","getData","dataset","getAttribute","setData","setAttribute","removeData","removeAttribute","REGEXP_SPACES","onceSupported","supported","once","listener","options","get","set","addEventListener","removeEventListener","removeListener","type","handler","split","event","listeners","addListener","_handler","_element$listeners","_len2","_key2","dispatchEvent","Event","CustomEvent","detail","bubbles","cancelable","createEvent","initCustomEvent","getOffset","box","getBoundingClientRect","left","pageXOffset","clientLeft","top","pageYOffset","clientTop","location","REGEXP_ORIGINS","isCrossOriginURL","url","parts","match","protocol","hostname","port","addTimestamp","timestamp","Date","getTime","getTransforms","_ref","rotate","scaleX","scaleY","translateX","translateY","values","transform","join","WebkitTransform","msTransform","getMaxZoomRatio","pointers","pointers2","maxRatio","pointer","pointerId","pointer2","x1","abs","startX","y1","startY","x2","endX","y2","endY","z1","sqrt","ratio","getPointer","_ref2","endOnly","pageX","pageY","end","getPointersCenter","count","_ref3","getAdjustedSizes","_ref4","height","width","isValidWidth","isValidHeight","adjustedWidth","getRotatedSizes","_ref5","degree","arc","PI","sinArc","sin","cosArc","cos","newWidth","newHeight","getSourceCanvas","image","_ref6","_ref7","_ref8","imageAspectRatio","imageNaturalWidth","naturalWidth","imageNaturalHeight","naturalHeight","_ref6$rotate","_ref6$scaleX","_ref6$scaleY","_ref8$fillColor","fillColor","_ref8$imageSmoothingE","imageSmoothingEnabled","_ref8$imageSmoothingQ","imageSmoothingQuality","_ref8$maxWidth","maxWidth","_ref8$maxHeight","maxHeight","_ref8$minWidth","minWidth","_ref8$minHeight","minHeight","canvas","createElement","context","getContext","maxSizes","minSizes","min","max","destMaxSizes","destMinSizes","destWidth","destHeight","params","fillStyle","fillRect","save","translate","scale","drawImage","map","param","floor","fromCharCode","getStringFromCharCode","dataView","start","str","getUint8","REGEXP_DATA_URL_HEAD","dataURLToArrayBuffer","dataURL","base64","binary","atob","arrayBuffer","ArrayBuffer","uint8","Uint8Array","charCodeAt","arrayBufferToDataURL","mimeType","chunks","chunkSize","subarray","btoa","resetAndGetOrientation","orientation","DataView","littleEndian","app1Start","ifdStart","byteLength","offset","tiffOffset","endianness","getUint16","firstIFDOffset","getUint32","_offset","_length","setUint16","parseOrientation","render","this","initContainer","initCanvas","initCropBox","renderCanvas","cropped","renderCropBox","container","cropper","containerData","offsetWidth","offsetHeight","imageData","rotated","canvasWidth","canvasHeight","canvasData","limited","limitCanvas","oldLeft","oldTop","initialCanvasData","sizeLimited","positionLimited","cropBoxData","_getAdjustedSizes","newCanvasLeft","newCanvasTop","minLeft","minTop","maxLeft","maxTop","changed","transformed","_getRotatedSizes","renderImage","limitCropBox","output","initialCropBoxData","maxCropBoxWidth","maxCropBoxHeight","face","cropBox","disabled","initPreview","crossOrigin","crossOriginUrl","alt","src","viewBox","appendChild","viewBoxImage","previews","ownerDocument","querySelectorAll","querySelector","el","img","html","innerHTML","cssText","resetPreview","cropBoxWidth","cropBoxHeight","originalWidth","originalHeight","getElementsByTagName","events","bind","onCropStart","cropStart","onWheel","wheel","passive","capture","onDblclick","dblclick","onCropMove","cropMove","onCropEnd","cropEnd","onResize","resize","unbind","handlers","ratioX","ratioY","getCanvasData","getCropBoxData","setCanvasData","setCropBoxData","setDragMode","dragBox","_this","delta","preventDefault","wheeling","setTimeout","deltaY","wheelDelta","buttons","button","pointerType","ctrlKey","action","changedTouches","touch","identifier","originalEvent","cropping","change","right","bottom","renderable","shiftKey","range","x","y","check","side","move","p","methods","reset","initialImageData","clear","hasSameSize","isImg","replaced","uncreate","load","enable","disable","destroy","originalUrl","offsetX","offsetY","_this$canvasData","moveTo","_originalEvent","zoomTo","pivot","oldRatio","rotateTo","_scaleX","_scaleY","rounded","getContainerData","getImageData","sized","widthChanged","heightChanged","getCroppedCanvas","HTMLCanvasElement","source","_this$getData","initialX","initialY","initialWidth","initialHeight","_options$imageSmoothi","srcWidth","srcHeight","dstX","dstY","dstWidth","dstHeight","sourceWidth","sourceHeight","srcX","srcY","setAspectRatio","mode","croppable","AnotherCropper","Cropper","tagName","Error","reloading","sizing","init","toDataURL","read","clone","xhr","XMLHttpRequest","onabort","onerror","ontimeout","onprogress","getResponseHeader","abort","onload","response","onloadend","open","responseType","withCredentials","send","_parseOrientation","stop","parentNode","insertBefore","nextSibling","_this2","isIOSWebKit","navigator","userAgent","done","build","sizingImage","body","removeChild","template","getElementsByClassName","unbuild","factory","a","propertyIsEnumerable","c","opacity","l","s","u","d","v","f","m","g","b","h","O","T","z","C","w","onInitialized","j","M","E","current","currentTarget","R","reduce","ref"],"sourceRoot":""}