[
  {
    "path": ".browserslistrc",
    "content": "> 1%\nlast 2 versions\nnot ie <= 8\n"
  },
  {
    "path": ".eslintrc.js",
    "content": "module.exports = {\n  root: true,\n  env: {\n    node: true\n  },\n  'extends': [\n    'plugin:vue/essential',\n    'eslint:recommended'\n  ],\n  rules: {\n    'no-console': process.env.NODE_ENV === 'production' ? 'error' : 'off',\n    'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off'\n  },\n  parserOptions: {\n    parser: 'babel-eslint'\n  }\n}\n"
  },
  {
    "path": ".github/FUNDING.yml",
    "content": "github: jbaysolutions\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.md",
    "content": "---\nname: Bug report\nabout: Create a report to help us improve\ntitle: ''\nlabels: ''\nassignees: ''\n\n---\n\n**Software version (please complete the following information):**\n - Browser [e.g. chrome, safari]\n - Vue Version [e.g. 2.5.7]\n - vue-grid-layout Version: [e.g. 2.3.3]\n\n**Describe the bug**\nA clear and concise description of what the bug is.\n\nPlease use the [CodeSandbox Template](https://codesandbox.io/s/5wy3rz5z1x?module=%2Fsrc%2FShowcaseLayout.js) to demonstrate your bug. It is much easier for us to help you if you do.\n\n\n**To Reproduce**\nSteps to reproduce the behavior:\n1. Go to '...'\n2. Click on '....'\n3. Scroll down to '....'\n4. See error\n\n**Expected behavior**\nA clear and concise description of what you expected to happen.\n\n**Screenshots**\nIf applicable, add screenshots to help explain your problem.\n\n**Additional context**\nAdd any other context about the problem here.\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature_request.md",
    "content": "---\nname: Feature request\nabout: Suggest an idea for this project\ntitle: ''\nlabels: ''\nassignees: ''\n\n---\n\n## If you have a feature request, please try to implement it before requesting it. <br/>This is free software and the author is busy with other projects.\n\n**Is your feature request related to a problem? Please describe.**\nA clear and concise description of what the problem is. Ex. I'm always frustrated when [...]\n\n**Describe the solution you'd like**\nA clear and concise description of what you want to happen.\n\n**Describe alternatives you've considered**\nA clear and concise description of any alternative solutions or features you've considered.\n\n**Additional context**\nAdd any other context or screenshots about the feature request here.\n"
  },
  {
    "path": ".github/workflows/build-test.yml",
    "content": "name: Build and Test\n\non:\n  push:\n    branches: [ master ]\n  pull_request:\n    branches: [ master ]\n\njobs:\n  build:\n\n    runs-on: ubuntu-latest\n\n    strategy:\n      matrix:\n        node-version: [10.x, 12.x, 14.x, 15.x]\n        # See supported Node.js release schedule at https://nodejs.org/en/about/releases/\n\n    steps:\n    - uses: actions/checkout@v2\n    - name: Use Node.js ${{ matrix.node-version }}\n      uses: actions/setup-node@v1\n      with:\n        node-version: ${{ matrix.node-version }}\n    - name: Install dependency\n      run: yarn\n    - name: Lint check\n      run: yarn lint\n    - name: Build\n      run: yarn build\n    - name: Unit test\n      run: yarn test:unit\n"
  },
  {
    "path": ".github/workflows/vuepress-deploy.yml",
    "content": "name: Deploy vuepress website\non:\n  push:\n    branches:\n      - master\njobs:\n  build-and-deploy:\n    runs-on: ubuntu-latest\n    steps:\n      - name: Checkout\n        uses: actions/checkout@master\n\n      - uses: actions/setup-node@v2\n        with:\n          node-version: '16'\n\n      - name: vuepress-deploy\n        uses: jenkey2011/vuepress-deploy@master\n        env:\n          ACCESS_TOKEN: ${{ secrets.ACCESS_TOKEN }}\n          TARGET_REPO: jbaysolutions/vue-grid-layout\n          TARGET_BRANCH: gh-pages\n          BUILD_SCRIPT: cd website && yarn && yarn build\n          BUILD_DIR: public\n"
  },
  {
    "path": ".gitignore",
    "content": ".DS_Store\nnode_modules\n#/dist\ndist/demo.html\n\n# local env files\n.env.local\n.env.*.local\n\n# Log files\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\n\n# Editor directories and files\n.idea\n.vscode\n*.suo\n*.ntvs*\n*.njsproj\n*.sln\n*.sw*\n\nyarn-error.log\n\nwebsite/docs/dist\n"
  },
  {
    "path": "LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2015 greyby\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n"
  },
  {
    "path": "README-zh_CN.md",
    "content": "<h1 align=\"center\">vue-grid-layout</h1>\n\n<p align=\"center\">\n<a href=\"https://www.npmjs.com/package/vue-grid-layout\"><img src=\"https://img.shields.io/npm/v/vue-grid-layout.svg\"/> <img src=\"https://img.shields.io/npm/dm/vue-grid-layout.svg\"/></a> <a href=\"https://vuejs.org/\"><img src=\"https://img.shields.io/badge/vue-2.2.x-brightgreen.svg\"/></a>\n</p>\n\nvue-grid-layout是一个类似于[Gridster](http://dsmorse.github.io/gridster.js/)的栅格布局系统, 适用于Vue.js。 **灵感源自于 [React-Grid-Layout](https://github.com/STRML/react-grid-layout)**\n\n### **当前版本:** 2.4.0 (支持 Vue 2.2+)\n\n### **Vue 2.1.10 及以下请使用 [2.1.3](https://github.com/jbaysolutions/vue-grid-layout/tree/2.1.3)**\n### **Vue 1 请使用 [1.0.3](https://github.com/jbaysolutions/vue-grid-layout/tree/1.0.3)**\n\n<br/>\n\n[**[在线演示](https://jbaysolutions.github.io/vue-grid-layout/examples/01-basic.html) | [更新日志](/CHANGELOG.md)**]\n\n[English](./README.md) | 简体中文\n\n<!--\n## Table of Contents\n\n- [特性](#%e7%89%b9%e6%80%a7)\n- [入门指南](#%e5%85%a5%e9%97%a8%e6%8c%87%e5%8d%97)\n  - [安装](#%e5%ae%89%e8%a3%85)\n    - [npm](#npm)\n- [如何贡献](#%e5%a6%82%e4%bd%95%e8%b4%a1%e7%8c%ae)\n- [待办事项](#%e5%be%85%e5%8a%9e%e4%ba%8b%e9%a1%b9)\n\n## Demos\n\n\nTODO UPDATE DOCS\n\nUsed guide for vue cli build: https://medium.com/justfrontendthings/how-to-create-and-publish-your-own-vuejs-component-library-on-npm-using-vue-cli-28e60943eed3\nAlso check https://cli.vuejs.org/guide/build-targets.html#library\n\n-->\n\n#### 成功案例\n\n- [DocsFold](https://www.docsfold.com/?utm_source=github&utm_medium=web&utm_campaign=vue-grid-layout)\n- [Draxed](https://www.draxed.com/?utm_source=github&utm_medium=web&utm_campaign=vue-grid-layout)\n- [Data Providers](https://www.dataproviders.io/?utm_source=github&utm_medium=web&utm_campaign=vue-grid-layout)\n- [Cataholic](https://cataholic.glitch.me/)\n\n*您还知悉其他项目? 请创建一个PR，谢谢!*\n\n## 特性\n\n* 可拖拽\n* 可调整大小\n* 静态部件（不可拖拽、调整大小）\n* 拖拽和调整大小时进行边界检查\n* 增减部件时避免重建栅格\n* 可序列化和还原的布局\n* 自动化 RTL 支持\n* 响应式\n\n\n## 入门指南\n\n### 安装\n\n#### npm\n\n    # 使用 npm\n\tnpm install vue-grid-layout --save\n\n    # 使用 yarn\n    yarn add vue-grid-layout\n\n\n引入\n\n```javascript\n    import VueGridLayout from 'vue-grid-layout';\n```\n\n加入到 Vue 组件\n\n ```javascript\n    export default {\n        components: {\n            GridLayout: VueGridLayout.GridLayout,\n            GridItem: VueGridLayout.GridItem\n        },\n    // ... data, methods, mounted (), etc.\n    }\n\n```\n\n#### 浏览器\n\n在页面中使用已打包好的 [文件](https://github.com/jbaysolutions/vue-grid-layout/releases)。 此时组件已为可用状态。\n\n```html\n    <script src=\"vue-grid-layout.umd.min.js\"></script>\n```\n\n### 使用\n\n```javascript\n\tvar testLayout = [\n\t    {\"x\":0,\"y\":0,\"w\":2,\"h\":2,\"i\":\"0\"},\n\t    {\"x\":2,\"y\":0,\"w\":2,\"h\":4,\"i\":\"1\"},\n\t    {\"x\":4,\"y\":0,\"w\":2,\"h\":5,\"i\":\"2\"},\n\t    {\"x\":6,\"y\":0,\"w\":2,\"h\":3,\"i\":\"3\"},\n\t    {\"x\":8,\"y\":0,\"w\":2,\"h\":3,\"i\":\"4\"},\n\t    {\"x\":10,\"y\":0,\"w\":2,\"h\":3,\"i\":\"5\"},\n\t    {\"x\":0,\"y\":5,\"w\":2,\"h\":5,\"i\":\"6\"},\n\t    {\"x\":2,\"y\":5,\"w\":2,\"h\":5,\"i\":\"7\"},\n\t    {\"x\":4,\"y\":5,\"w\":2,\"h\":5,\"i\":\"8\"},\n\t    {\"x\":6,\"y\":3,\"w\":2,\"h\":4,\"i\":\"9\"},\n\t    {\"x\":8,\"y\":4,\"w\":2,\"h\":4,\"i\":\"10\"},\n\t    {\"x\":10,\"y\":4,\"w\":2,\"h\":4,\"i\":\"11\"},\n\t    {\"x\":0,\"y\":10,\"w\":2,\"h\":5,\"i\":\"12\"},\n\t    {\"x\":2,\"y\":10,\"w\":2,\"h\":5,\"i\":\"13\"},\n\t    {\"x\":4,\"y\":8,\"w\":2,\"h\":4,\"i\":\"14\"},\n\t    {\"x\":6,\"y\":8,\"w\":2,\"h\":4,\"i\":\"15\"},\n\t    {\"x\":8,\"y\":10,\"w\":2,\"h\":5,\"i\":\"16\"},\n\t    {\"x\":10,\"y\":4,\"w\":2,\"h\":2,\"i\":\"17\"},\n\t    {\"x\":0,\"y\":9,\"w\":2,\"h\":3,\"i\":\"18\"},\n\t    {\"x\":2,\"y\":6,\"w\":2,\"h\":2,\"i\":\"19\"}\n\t];\n\n\tnew Vue({\n\t    el: '#app',\n\t    data: {\n\t        layout: testLayout,\n\t    },\n\t});\n```\n\n\n```html\n\n    <grid-layout\n            :layout.sync=\"layout\"\n            :col-num=\"12\"\n            :row-height=\"30\"\n            :is-draggable=\"true\"\n            :is-resizable=\"true\"\n            :is-mirrored=\"false\"\n            :vertical-compact=\"true\"\n            :margin=\"[10, 10]\"\n            :use-css-transforms=\"true\"\n    >\n\n        <grid-item v-for=\"item in layout\"\n                   :x=\"item.x\"\n                   :y=\"item.y\"\n                   :w=\"item.w\"\n                   :h=\"item.h\"\n                   :i=\"item.i\"\n                   :key=\"item.i\">\n            {{item.i}}\n        </grid-item>\n    </grid-layout>\n```\n\n\n### 文档\n\n#### 属性\n\n##### GridLayout\n\n* **layout**\n\n    * type: `Array`\n    * required: `true`\n\n    数据源。值必须为 `Array`，其数据项为 `Object`。 每条数据项必须有 `i`, `x`, `y`, `w` 和 `h` 属性。 请参考下面的 `GridItem`。\n\n* **responsiveLayouts**\n\n    * type: `Object`\n    * required: `false`\n    * default: `{}`\n\n    如果 `responsive` 设置为 `true`，该配置将作为栅格中每个断点的初始布局。键值是断点名称，每项的值都是类似 `layout` 属性定义的数据结构，值必须为 `Array`，其数据项为 `Object`。例如： `{lg: [layout items], md: [layout items]}`。需要注意的是，在创建栅格布局后设置该属性无效。\n\n* **colNum**\n\n    * type: `Number`\n    * required: `false`\n    * default: `12`\n\n    定义栅格系统的列数，其值需为自然数。\n\n* **rowHeight**\n\n    * type: `Number`\n    * required: `false`\n    * default: `150`\n\n    每行的高度，单位像素。\n\n* **maxRows**\n\n    * type: `Number`\n    * required: `false`\n    * default: `Infinity`\n\n    定义最大行数。\n\n* **margin**\n\n    * type: `Array`\n    * required: `false`\n    * default: `[10, 10]`\n\n    定义栅格中的元素边距。\n\n    值必须是包含两个 `Number`的数组，数组中第一个元素表示水平边距，第二个表示垂直边距，单位为像素。\n\n* **isDraggable**\n\n    * type: `Boolean`\n    * required: `false`\n    * default: `true`\n\n    标识栅格中的元素是否可拖拽。\n\n* **isResizable**\n\n    * type: `Boolean`\n    * required: `false`\n    * default: `true`\n\n    标识栅格中的元素是否可调整大小。\n\n* **isMirrored**\n\n    * type: `Boolean`\n    * required: `false`\n    * default: `false`\n\n    标识栅格中的元素是否可镜像反转。\n\n* **autoSize**\n\n    * type: `Boolean`\n    * required: `false`\n    * default: `true`\n\n    标识容器是否自动调整大小。\n\n* **verticalCompact**\n\n    * type: `Boolean`\n    * required: `false`\n    * default: `true`\n\n    标识布局是否垂直压缩。\n\n* **useCssTransforms**\n\n    * type: `Boolean`\n    * required: `false`\n    * default: `true`\n\n    标识是否使用CSS属性 `transition-property: transform;`。\n\n* **responsive**\n\n    * type: `Boolean`\n    * required: `false`\n    * default: `false`\n\n    标识布局是否为响应式。\n\n* **breakpoints**\n\n    * type: `Object`\n    * required: `false`\n    * default: { lg: 1200, md: 996, sm: 768, xs: 480, xxs: 0 }\n\n    为响应式布局设置断点，其中参数代表不同设备的宽度：lg（large），md（medium），sm（small），xs（extra small）。\n\n* **cols**\n\n    * type: `Object`\n    * required: `false`\n    * default: { lg: 12, md: 10, sm: 6, xs: 4, xxs: 2 }\n\n    设置每个断点对应的列数。\n\n* **useStyleCursor**\n\n    * type: `Boolean`\n    * required: `false`\n    * default: `true`\n\n    标识是否使用动态鼠标指针样式。当拖动出现卡顿时，将此值设为 `false`也许可以缓解布局问题。\n\n * **preventCollision**\n\n    * type: `Boolean`\n    * default: `false`\n\n    值设置为ture时，栅格只能拖动至空白处。\n\n##### GridItem\n\n* **i**\n\n    * type: `String`\n    * required: `true`\n\n    栅格中元素的ID。\n\n* **x**\n\n    * type: `Number`\n    * required: `true`\n\n    标识栅格元素位于第几列，需为自然数。\n\n* **y**\n\n    * type: `Number`\n    * required: `true`\n\n    标识栅格元素位于第几行，需为自然数。\n\n* **w**\n\n    * type: `Number`\n    * required: `true`\n\n    标识栅格元素的初始宽度，值为`colWidth`的倍数。\n\n* **h**\n\n    * type: `Number`\n    * required: `true`\n\n    标识栅格元素的初始高度，值为`rowHeight`的倍数。\n\n* **minW**\n\n    * type: `Number`\n    * required: `false`\n    * default: `1`\n\n    栅格元素的最小宽度，值为`colWidth`的倍数。\n\n    如果`w`小于`minW`，则`minW`的值会被`w`覆盖。\n\n* **minH**\n\n    * type: `Number`\n    * required: `false`\n    * default: `1`\n\n    栅格元素的最小高度，值为`rowHeight`的倍数。\n\n    如果`h`小于`minH`，则`minH`的值会被`h`覆盖。\n\n* **maxW**\n\n    * type: `Number`\n    * required: `false`\n    * default: `Infinity`\n\n    栅格元素的最大宽度，值为`colWidth`的倍数。\n\n    如果`w`大于`maxW`，则`maxW`的值会被`w`覆盖。\n\n* **maxH**\n\n    * type: `Number`\n    * required: `false`\n    * default: `Infinity`\n\n    栅格元素的最大高度，值为`rowHeight`的倍数。\n\n    如果`h`大于`maxH`，则`maxH`的值会被`h`覆盖。\n\n* **isDraggable**\n\n    * type: `Boolean`\n    * required: `false`\n    * default: `null`\n\n    标识栅格元素是否可拖拽。如果值为`null`则取决于父容器。\n\n* **isResizable**\n\n    * type: `Boolean`\n    * required: `false`\n    * default: `null`\n\n    标识栅格元素是否可调整大小。如果值为`null`则取决于父容器。\n\n* **static**\n\n    * type: `Boolean`\n    * required: `false`\n    * default: `false`\n\n    标识栅格元素是否为静态的（无法拖拽、调整大小或被其他元素移动）。\n\n* **dragIgnoreFrom**\n\n    * type: `String`\n    * required: `false`\n    * default: `'a, button'`\n\n    标识栅格元素中哪些子元素无法触发拖拽事件，值为`css-like`选择器。\n\n    请参考 [interact.js docs](http://interactjs.io/docs/#ignorable-selectors)中的`ignoreFrom`。\n\n* **dragAllowFrom**\n\n    * type: `String`\n    * required: `false`\n    * default: `null`\n\n    标识栅格元素中哪些子元素可以触发拖拽事件，值为`css-like`选择器。\n\n    如果值为`null`则表示所有子元素（`dragIgnoreFrom`的除外）。\n\n    请参考 [interact.js docs](http://interactjs.io/docs/#ignorable-selectors)中的`allowFrom`。\n\n* **resizeIgnoreFrom**\n\n    * type: `String`\n    * required: `false`\n    * default: `'a, button'`\n\n    标识栅格元素中哪些子元素无法触发调整大小的事件，值为`css-like`选择器。\n\n    请参考 [interact.js docs](http://interactjs.io/docs/#ignorable-selectors)中的`ignoreFrom`。\n\n\n\n#### 事件\n\n每一个栅格元素`grid-item`上都可以添加监听器，用于监听移动和调整大小事件，这样父级Vue对象就可以收到通知。\n\n [示例](https://jbaysolutions.github.io/vue-grid-layout/examples/02-events.html)\n\n````html\n\n    <grid-layout\n            :layout=\"layout\"\n            :col-num=\"12\"\n            :row-height=\"30\"\n            :is-draggable=\"true\"\n            :is-resizable=\"true\"\n            :vertical-compact=\"true\"\n            :margin=\"[10, 10]\"\n            :use-css-transforms=\"true\"\n            @layout-created=\"layoutCreatedEvent\"\n            @layout-before-mount=\"layoutBeforeMountEvent\"\n            @layout-mounted=\"layoutMountedEvent\"\n            @layout-ready=\"layoutReadyEvent\"\n            @layout-updated=\"layoutUpdatedEvent\"\n    >\n\n        <grid-item v-for=\"item in layout\"\n                   :x=\"item.x\"\n                   :y=\"item.y\"\n                   :w=\"item.w\"\n                   :h=\"item.h\"\n                   :i=\"item.i\"\n                   :key=\"item.i\"\n                   @resize=\"resizeEvent\"\n                   @move=\"moveEvent\"\n                   @resized=\"resizedEvent\"\n                   @moved=\"movedEvent\">\n            {{item.i}}\n        </grid-item>\n    </grid-layout>\n````\n\n* **layoutCreatedEvent**\n\n    对应Vue生命周期的`created`\n\n```javascript\n    layoutCreatedEvent: function(newLayout){\n      console.log(\"Created layout: \", newLayout)\n    }\n```\n\n* **layoutBeforeMountEvent**\n\n    对应Vue生命周期的`beforeMount`\n\n```javascript\n    layoutBeforeMountEvent: function(newLayout){\n      console.log(\"beforeMount layout: \", newLayout)\n    }\n```\n\n* **layoutMountedEvent**\n\n    对应Vue生命周期的`mounted`\n\n```javascript\n    layoutMountedEvent: function(newLayout){\n      console.log(\"Mounted layout: \", newLayout)\n    }\n```\n\n* **layoutReadyEvent**\n\n    当完成mount中的所有操作时生成的事件\n\n```javascript\n    layoutReadyEvent: function(newLayout){\n      console.log(\"Ready layout: \", newLayout)\n    }\n```\n\n* **layoutUpdatedEvent**\n\n    更新事件（布局更新或栅格元素的位置重新计算）\n\n```javascript\n    layoutUpdatedEvent: function(newLayout){\n      console.log(\"Updated layout: \", newLayout)\n    }\n```\n\n* **moveEvent**\n\n    移动时的事件\n\n```javascript\n    moveEvent: function(i, newX, newY){\n        console.log(\"MOVE i=\" + i + \", X=\" + newX + \", Y=\" + newY);\n    },\n```\n\n* **resizeEvent**\n\n    调整大小时的事件\n\n```javascript\n    resizeEvent: function(i, newH, newW, newHPx, newWPx){\n        console.log(\"RESIZE i=\" + i + \", H=\" + newH + \", W=\" + newW + \", H(px)=\" + newHPx + \", W(px)=\" + newWPx);\n    },\n```\n\n* **movedEvent**\n\n    移动后的事件\n\n```javascript\n    movedEvent: function(i, newX, newY){\n        console.log(\"MOVED i=\" + i + \", X=\" + newX + \", Y=\" + newY);\n    },\n```\n\n* **resizedEvent**\n\n    调整大小后的事件\n\n```javascript\n    /**\n     *\n     * @param i the item id/index\n     * @param newH new height in grid rows\n     * @param newW new width in grid columns\n     * @param newHPx new height in pixels\n     * @param newWPx new width in pixels\n     *\n     */\n    resizedEvent: function(i, newH, newW, newHPx, newWPx){\n        console.log(\"RESIZED i=\" + i + \", H=\" + newH + \", W=\" + newW + \", H(px)=\" + newHPx + \", W(px)=\" + newWPx);\n    },\n```\n\n\n## 如何贡献\n\n请提交issue或PR。\n\n\n## 待办事项\n\n- [x] 基础栅格布局\n- [x] 响应式\n- [x] 可拖拽的栅格元素\n- [x] 可调整大小的栅格元素\n- [x] 静态元素\n- [x] 每个元素的Min/max w/h\n"
  },
  {
    "path": "README.md",
    "content": "<p align=\"center\"><a href=\"https://jbaysolutions.github.io/vue-grid-layout/\" target=\"_blank\" rel=\"noopener noreferrer\"><img width=\"100\" src=\"https://jbaysolutions.github.io/vue-grid-layout/assets/img/logo.png\" alt=\"Vue Grid Layout\"></a></p>\n\n<h1 align=\"center\">vue-grid-layout</h1>\n\n<p align=\"center\">\n<a href=\"https://www.npmjs.com/package/vue-grid-layout\">\n    <img src=\"https://img.shields.io/npm/v/vue-grid-layout.svg\"/> \n    <img src=\"https://img.shields.io/npm/dm/vue-grid-layout.svg\"/>\n</a> \n<a href=\"https://github.com/jbaysolutions/vue-grid-layout/releases\">\n    <img src=\"https://img.shields.io/github/size/jbaysolutions/vue-grid-layout/dist/vue-grid-layout.umd.min.js\"/>\n</a>\n<!--a href=\"https://vuejs.org/\">\n    <img src=\"https://img.shields.io/badge/vue-2.2.x-brightgreen.svg\"/>\n</a-->\n</p>\n<h2 align=\"center\">\n<a href=\"https://jbaysolutions.github.io/vue-grid-layout/\" target=\"_blank\">Documentation Website</a>\n</h2>\n\n## What is Vue Grid Layout?\n\nvue-grid-layout is a grid layout system, like [Gridster](http://dsmorse.github.io/gridster.js/), for Vue.js. **Heavily inspired by [React-Grid-Layout](https://github.com/STRML/react-grid-layout)**\n\n## Features\n\n* Draggable widgets\n* Resizable widgets\n* Static widgets\n* Bounds checking for dragging and resizing\n* Widgets may be added or removed without rebuilding grid\n* Layout can be serialized and restored\n* Automatic RTL support (resizing not working with RTL on 2.2.0)\n* Responsive\n\n## **Current version:** 2.4.0 (Supports Vue 2.2+)\n\n#### **For legacy browsers**, like IE11, use version [2.3.12-legacy](https://github.com/jbaysolutions/vue-grid-layout/tree/legacy)\n#### **For Vue 2.1.10 and below use version [2.1.3](https://github.com/jbaysolutions/vue-grid-layout/tree/2.1.3)**\n#### **For Vue 1 use version [1.0.3](https://github.com/jbaysolutions/vue-grid-layout/tree/1.0.3)** \n\n## Documentation\n\nCheck out the <a href=\"https://jbaysolutions.github.io/vue-grid-layout/\" target=\"_blank\">Documentation Website</a>\n\n<!--\nChinese documentation: [简体中文](./README-zh_CN.md) \n-->\n\n#### Projects using vue-grid-layout\n\n- [DocsFold](https://www.docsfold.com/?utm_source=github&utm_medium=web&utm_campaign=vue-grid-layout)\n- [Draxed](https://www.draxed.com/?utm_source=github&utm_medium=web&utm_campaign=vue-grid-layout)\n- [Data Providers](https://www.dataproviders.io/?utm_source=github&utm_medium=web&utm_campaign=vue-grid-layout)\n- [Cataholic](https://cataholic.glitch.me/)\n\n*Know of others? Create a PR to let me know!*\n\n\n## Contribute\n\nIf you have a feature request, please add it as an issue or make a pull request.\n\n\nDeveloped by <a href=\"https://www.jbaysolutions.com\">JBay Solutions</a> \n"
  },
  {
    "path": "babel.config.js",
    "content": "module.exports = {\n    presets: [\n        '@vue/app',\n        '@babel/preset-env'\n    ],\n    \"plugins\": [\n        \"transform-flow-comments\"\n    ]\n}\n"
  },
  {
    "path": "dist/vue-grid-layout.common.js",
    "content": "/*! vue-grid-layout - 2.4.0 | (c) 2015, 2022  Gustavo Santos (JBay Solutions) <gustavo.santos@jbaysolutions.com> (http://www.jbaysolutions.com) | https://github.com/jbaysolutions/vue-grid-layout */\nmodule.exports =\n/******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// define __esModule on exports\n/******/ \t__webpack_require__.r = function(exports) {\n/******/ \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n/******/ \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n/******/ \t\t}\n/******/ \t\tObject.defineProperty(exports, '__esModule', { value: true });\n/******/ \t};\n/******/\n/******/ \t// create a fake namespace object\n/******/ \t// mode & 1: value is a module id, require it\n/******/ \t// mode & 2: merge all properties of value into the ns\n/******/ \t// mode & 4: return value when already ns object\n/******/ \t// mode & 8|1: behave like require\n/******/ \t__webpack_require__.t = function(value, mode) {\n/******/ \t\tif(mode & 1) value = __webpack_require__(value);\n/******/ \t\tif(mode & 8) return value;\n/******/ \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n/******/ \t\tvar ns = Object.create(null);\n/******/ \t\t__webpack_require__.r(ns);\n/******/ \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n/******/ \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n/******/ \t\treturn ns;\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = \"fb15\");\n/******/ })\n/************************************************************************/\n/******/ ({\n\n/***/ \"01f9\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar LIBRARY = __webpack_require__(\"2d00\");\nvar $export = __webpack_require__(\"5ca1\");\nvar redefine = __webpack_require__(\"2aba\");\nvar hide = __webpack_require__(\"32e9\");\nvar Iterators = __webpack_require__(\"84f2\");\nvar $iterCreate = __webpack_require__(\"41a0\");\nvar setToStringTag = __webpack_require__(\"7f20\");\nvar getPrototypeOf = __webpack_require__(\"38fd\");\nvar ITERATOR = __webpack_require__(\"2b4c\")('iterator');\nvar BUGGY = !([].keys && 'next' in [].keys()); // Safari has buggy iterators w/o `next`\nvar FF_ITERATOR = '@@iterator';\nvar KEYS = 'keys';\nvar VALUES = 'values';\n\nvar returnThis = function () { return this; };\n\nmodule.exports = function (Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCED) {\n  $iterCreate(Constructor, NAME, next);\n  var getMethod = function (kind) {\n    if (!BUGGY && kind in proto) return proto[kind];\n    switch (kind) {\n      case KEYS: return function keys() { return new Constructor(this, kind); };\n      case VALUES: return function values() { return new Constructor(this, kind); };\n    } return function entries() { return new Constructor(this, kind); };\n  };\n  var TAG = NAME + ' Iterator';\n  var DEF_VALUES = DEFAULT == VALUES;\n  var VALUES_BUG = false;\n  var proto = Base.prototype;\n  var $native = proto[ITERATOR] || proto[FF_ITERATOR] || DEFAULT && proto[DEFAULT];\n  var $default = $native || getMethod(DEFAULT);\n  var $entries = DEFAULT ? !DEF_VALUES ? $default : getMethod('entries') : undefined;\n  var $anyNative = NAME == 'Array' ? proto.entries || $native : $native;\n  var methods, key, IteratorPrototype;\n  // Fix native\n  if ($anyNative) {\n    IteratorPrototype = getPrototypeOf($anyNative.call(new Base()));\n    if (IteratorPrototype !== Object.prototype && IteratorPrototype.next) {\n      // Set @@toStringTag to native iterators\n      setToStringTag(IteratorPrototype, TAG, true);\n      // fix for some old engines\n      if (!LIBRARY && typeof IteratorPrototype[ITERATOR] != 'function') hide(IteratorPrototype, ITERATOR, returnThis);\n    }\n  }\n  // fix Array#{values, @@iterator}.name in V8 / FF\n  if (DEF_VALUES && $native && $native.name !== VALUES) {\n    VALUES_BUG = true;\n    $default = function values() { return $native.call(this); };\n  }\n  // Define iterator\n  if ((!LIBRARY || FORCED) && (BUGGY || VALUES_BUG || !proto[ITERATOR])) {\n    hide(proto, ITERATOR, $default);\n  }\n  // Plug for library\n  Iterators[NAME] = $default;\n  Iterators[TAG] = returnThis;\n  if (DEFAULT) {\n    methods = {\n      values: DEF_VALUES ? $default : getMethod(VALUES),\n      keys: IS_SET ? $default : getMethod(KEYS),\n      entries: $entries\n    };\n    if (FORCED) for (key in methods) {\n      if (!(key in proto)) redefine(proto, key, methods[key]);\n    } else $export($export.P + $export.F * (BUGGY || VALUES_BUG), NAME, methods);\n  }\n  return methods;\n};\n\n\n/***/ }),\n\n/***/ \"02f4\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar toInteger = __webpack_require__(\"4588\");\nvar defined = __webpack_require__(\"be13\");\n// true  -> String#at\n// false -> String#codePointAt\nmodule.exports = function (TO_STRING) {\n  return function (that, pos) {\n    var s = String(defined(that));\n    var i = toInteger(pos);\n    var l = s.length;\n    var a, b;\n    if (i < 0 || i >= l) return TO_STRING ? '' : undefined;\n    a = s.charCodeAt(i);\n    return a < 0xd800 || a > 0xdbff || i + 1 === l || (b = s.charCodeAt(i + 1)) < 0xdc00 || b > 0xdfff\n      ? TO_STRING ? s.charAt(i) : a\n      : TO_STRING ? s.slice(i, i + 2) : (a - 0xd800 << 10) + (b - 0xdc00) + 0x10000;\n  };\n};\n\n\n/***/ }),\n\n/***/ \"0390\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar at = __webpack_require__(\"02f4\")(true);\n\n // `AdvanceStringIndex` abstract operation\n// https://tc39.github.io/ecma262/#sec-advancestringindex\nmodule.exports = function (S, index, unicode) {\n  return index + (unicode ? at(S, index).length : 1);\n};\n\n\n/***/ }),\n\n/***/ \"0bfb\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n// 21.2.5.3 get RegExp.prototype.flags\nvar anObject = __webpack_require__(\"cb7c\");\nmodule.exports = function () {\n  var that = anObject(this);\n  var result = '';\n  if (that.global) result += 'g';\n  if (that.ignoreCase) result += 'i';\n  if (that.multiline) result += 'm';\n  if (that.unicode) result += 'u';\n  if (that.sticky) result += 'y';\n  return result;\n};\n\n\n/***/ }),\n\n/***/ \"0d58\":\n/***/ (function(module, exports, __webpack_require__) {\n\n// 19.1.2.14 / 15.2.3.14 Object.keys(O)\nvar $keys = __webpack_require__(\"ce10\");\nvar enumBugKeys = __webpack_require__(\"e11e\");\n\nmodule.exports = Object.keys || function keys(O) {\n  return $keys(O, enumBugKeys);\n};\n\n\n/***/ }),\n\n/***/ \"1156\":\n/***/ (function(module, exports, __webpack_require__) {\n\n// style-loader: Adds some css to the DOM by adding a <style> tag\n\n// load the styles\nvar content = __webpack_require__(\"ad20\");\nif(typeof content === 'string') content = [[module.i, content, '']];\nif(content.locals) module.exports = content.locals;\n// add the styles to the DOM\nvar add = __webpack_require__(\"499e\").default\nvar update = add(\"c1ec597e\", content, true, {\"sourceMap\":false,\"shadowMode\":false});\n\n/***/ }),\n\n/***/ \"11e9\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar pIE = __webpack_require__(\"52a7\");\nvar createDesc = __webpack_require__(\"4630\");\nvar toIObject = __webpack_require__(\"6821\");\nvar toPrimitive = __webpack_require__(\"6a99\");\nvar has = __webpack_require__(\"69a8\");\nvar IE8_DOM_DEFINE = __webpack_require__(\"c69a\");\nvar gOPD = Object.getOwnPropertyDescriptor;\n\nexports.f = __webpack_require__(\"9e1e\") ? gOPD : function getOwnPropertyDescriptor(O, P) {\n  O = toIObject(O);\n  P = toPrimitive(P, true);\n  if (IE8_DOM_DEFINE) try {\n    return gOPD(O, P);\n  } catch (e) { /* empty */ }\n  if (has(O, P)) return createDesc(!pIE.f.call(O, P), O[P]);\n};\n\n\n/***/ }),\n\n/***/ \"1495\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar dP = __webpack_require__(\"86cc\");\nvar anObject = __webpack_require__(\"cb7c\");\nvar getKeys = __webpack_require__(\"0d58\");\n\nmodule.exports = __webpack_require__(\"9e1e\") ? Object.defineProperties : function defineProperties(O, Properties) {\n  anObject(O);\n  var keys = getKeys(Properties);\n  var length = keys.length;\n  var i = 0;\n  var P;\n  while (length > i) dP.f(O, P = keys[i++], Properties[P]);\n  return O;\n};\n\n\n/***/ }),\n\n/***/ \"18d2\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/**\n * Resize detection strategy that injects objects to elements in order to detect resize events.\n * Heavily inspired by: http://www.backalleycoder.com/2013/03/18/cross-browser-event-based-element-resize-detection/\n */\n\n\n\nvar browserDetector = __webpack_require__(\"18e9\");\n\nmodule.exports = function(options) {\n    options             = options || {};\n    var reporter        = options.reporter;\n    var batchProcessor  = options.batchProcessor;\n    var getState        = options.stateHandler.getState;\n\n    if(!reporter) {\n        throw new Error(\"Missing required dependency: reporter.\");\n    }\n\n    /**\n     * Adds a resize event listener to the element.\n     * @public\n     * @param {element} element The element that should have the listener added.\n     * @param {function} listener The listener callback to be called for each resize event of the element. The element will be given as a parameter to the listener callback.\n     */\n    function addListener(element, listener) {\n        function listenerProxy() {\n            listener(element);\n        }\n\n        if(browserDetector.isIE(8)) {\n            //IE 8 does not support object, but supports the resize event directly on elements.\n            getState(element).object = {\n                proxy: listenerProxy\n            };\n            element.attachEvent(\"onresize\", listenerProxy);\n        } else {\n            var object = getObject(element);\n\n            if(!object) {\n                throw new Error(\"Element is not detectable by this strategy.\");\n            }\n\n            object.contentDocument.defaultView.addEventListener(\"resize\", listenerProxy);\n        }\n    }\n\n    function buildCssTextString(rules) {\n        var seperator = options.important ? \" !important; \" : \"; \";\n\n        return (rules.join(seperator) + seperator).trim();\n    }\n\n    /**\n     * Makes an element detectable and ready to be listened for resize events. Will call the callback when the element is ready to be listened for resize changes.\n     * @private\n     * @param {object} options Optional options object.\n     * @param {element} element The element to make detectable\n     * @param {function} callback The callback to be called when the element is ready to be listened for resize changes. Will be called with the element as first parameter.\n     */\n    function makeDetectable(options, element, callback) {\n        if (!callback) {\n            callback = element;\n            element = options;\n            options = null;\n        }\n\n        options = options || {};\n        var debug = options.debug;\n\n        function injectObject(element, callback) {\n            var OBJECT_STYLE = buildCssTextString([\"display: block\", \"position: absolute\", \"top: 0\", \"left: 0\", \"width: 100%\", \"height: 100%\", \"border: none\", \"padding: 0\", \"margin: 0\", \"opacity: 0\", \"z-index: -1000\", \"pointer-events: none\"]);\n\n            //The target element needs to be positioned (everything except static) so the absolute positioned object will be positioned relative to the target element.\n\n            // Position altering may be performed directly or on object load, depending on if style resolution is possible directly or not.\n            var positionCheckPerformed = false;\n\n            // The element may not yet be attached to the DOM, and therefore the style object may be empty in some browsers.\n            // Since the style object is a reference, it will be updated as soon as the element is attached to the DOM.\n            var style = window.getComputedStyle(element);\n            var width = element.offsetWidth;\n            var height = element.offsetHeight;\n\n            getState(element).startSize = {\n                width: width,\n                height: height\n            };\n\n            function mutateDom() {\n                function alterPositionStyles() {\n                    if(style.position === \"static\") {\n                        element.style.setProperty(\"position\", \"relative\", options.important ? \"important\" : \"\");\n\n                        var removeRelativeStyles = function(reporter, element, style, property) {\n                            function getNumericalValue(value) {\n                                return value.replace(/[^-\\d\\.]/g, \"\");\n                            }\n\n                            var value = style[property];\n\n                            if(value !== \"auto\" && getNumericalValue(value) !== \"0\") {\n                                reporter.warn(\"An element that is positioned static has style.\" + property + \"=\" + value + \" which is ignored due to the static positioning. The element will need to be positioned relative, so the style.\" + property + \" will be set to 0. Element: \", element);\n                                element.style.setProperty(property, \"0\", options.important ? \"important\" : \"\");\n                            }\n                        };\n\n                        //Check so that there are no accidental styles that will make the element styled differently now that is is relative.\n                        //If there are any, set them to 0 (this should be okay with the user since the style properties did nothing before [since the element was positioned static] anyway).\n                        removeRelativeStyles(reporter, element, style, \"top\");\n                        removeRelativeStyles(reporter, element, style, \"right\");\n                        removeRelativeStyles(reporter, element, style, \"bottom\");\n                        removeRelativeStyles(reporter, element, style, \"left\");\n                    }\n                }\n\n                function onObjectLoad() {\n                    // The object has been loaded, which means that the element now is guaranteed to be attached to the DOM.\n                    if (!positionCheckPerformed) {\n                        alterPositionStyles();\n                    }\n\n                    /*jshint validthis: true */\n\n                    function getDocument(element, callback) {\n                        //Opera 12 seem to call the object.onload before the actual document has been created.\n                        //So if it is not present, poll it with an timeout until it is present.\n                        //TODO: Could maybe be handled better with object.onreadystatechange or similar.\n                        if(!element.contentDocument) {\n                            var state = getState(element);\n                            if (state.checkForObjectDocumentTimeoutId) {\n                                window.clearTimeout(state.checkForObjectDocumentTimeoutId);\n                            }\n                            state.checkForObjectDocumentTimeoutId = setTimeout(function checkForObjectDocument() {\n                                state.checkForObjectDocumentTimeoutId = 0;\n                                getDocument(element, callback);\n                            }, 100);\n\n                            return;\n                        }\n\n                        callback(element.contentDocument);\n                    }\n\n                    //Mutating the object element here seems to fire another load event.\n                    //Mutating the inner document of the object element is fine though.\n                    var objectElement = this;\n\n                    //Create the style element to be added to the object.\n                    getDocument(objectElement, function onObjectDocumentReady(objectDocument) {\n                        //Notify that the element is ready to be listened to.\n                        callback(element);\n                    });\n                }\n\n                // The element may be detached from the DOM, and some browsers does not support style resolving of detached elements.\n                // The alterPositionStyles needs to be delayed until we know the element has been attached to the DOM (which we are sure of when the onObjectLoad has been fired), if style resolution is not possible.\n                if (style.position !== \"\") {\n                    alterPositionStyles(style);\n                    positionCheckPerformed = true;\n                }\n\n                //Add an object element as a child to the target element that will be listened to for resize events.\n                var object = document.createElement(\"object\");\n                object.style.cssText = OBJECT_STYLE;\n                object.tabIndex = -1;\n                object.type = \"text/html\";\n                object.setAttribute(\"aria-hidden\", \"true\");\n                object.onload = onObjectLoad;\n\n                //Safari: This must occur before adding the object to the DOM.\n                //IE: Does not like that this happens before, even if it is also added after.\n                if(!browserDetector.isIE()) {\n                    object.data = \"about:blank\";\n                }\n\n                if (!getState(element)) {\n                    // The element has been uninstalled before the actual loading happened.\n                    return;\n                }\n\n                element.appendChild(object);\n                getState(element).object = object;\n\n                //IE: This must occur after adding the object to the DOM.\n                if(browserDetector.isIE()) {\n                    object.data = \"about:blank\";\n                }\n            }\n\n            if(batchProcessor) {\n                batchProcessor.add(mutateDom);\n            } else {\n                mutateDom();\n            }\n        }\n\n        if(browserDetector.isIE(8)) {\n            //IE 8 does not support objects properly. Luckily they do support the resize event.\n            //So do not inject the object and notify that the element is already ready to be listened to.\n            //The event handler for the resize event is attached in the utils.addListener instead.\n            callback(element);\n        } else {\n            injectObject(element, callback);\n        }\n    }\n\n    /**\n     * Returns the child object of the target element.\n     * @private\n     * @param {element} element The target element.\n     * @returns The object element of the target.\n     */\n    function getObject(element) {\n        return getState(element).object;\n    }\n\n    function uninstall(element) {\n        if (!getState(element)) {\n            return;\n        }\n\n        var object = getObject(element);\n\n        if (!object) {\n            return;\n        }\n\n        if (browserDetector.isIE(8)) {\n            element.detachEvent(\"onresize\", object.proxy);\n        } else {\n            element.removeChild(object);\n        }\n\n        if (getState(element).checkForObjectDocumentTimeoutId) {\n            window.clearTimeout(getState(element).checkForObjectDocumentTimeoutId);\n        }\n\n        delete getState(element).object;\n    }\n\n    return {\n        makeDetectable: makeDetectable,\n        addListener: addListener,\n        uninstall: uninstall\n    };\n};\n\n\n/***/ }),\n\n/***/ \"18e9\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar detector = module.exports = {};\n\ndetector.isIE = function(version) {\n    function isAnyIeVersion() {\n        var agent = navigator.userAgent.toLowerCase();\n        return agent.indexOf(\"msie\") !== -1 || agent.indexOf(\"trident\") !== -1 || agent.indexOf(\" edge/\") !== -1;\n    }\n\n    if(!isAnyIeVersion()) {\n        return false;\n    }\n\n    if(!version) {\n        return true;\n    }\n\n    //Shamelessly stolen from https://gist.github.com/padolsey/527683\n    var ieVersion = (function(){\n        var undef,\n            v = 3,\n            div = document.createElement(\"div\"),\n            all = div.getElementsByTagName(\"i\");\n\n        do {\n            div.innerHTML = \"<!--[if gt IE \" + (++v) + \"]><i></i><![endif]-->\";\n        }\n        while (all[0]);\n\n        return v > 4 ? v : undef;\n    }());\n\n    return version === ieVersion;\n};\n\ndetector.isLegacyOpera = function() {\n    return !!window.opera;\n};\n\n\n/***/ }),\n\n/***/ \"1ca7\":\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return getDocumentDir; });\n/* unused harmony export setDocumentDir */\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return addWindowEventListener; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"c\", function() { return removeWindowEventListener; });\nvar currentDir\n/*: \"ltr\" | \"rtl\" | \"auto\"*/\n= \"auto\"; // let currentDir = \"auto\";\n\nfunction hasDocument() {\n  return typeof document !== \"undefined\";\n}\n\nfunction hasWindow() {\n  return typeof window !== \"undefined\";\n}\n\nfunction getDocumentDir() {\n  if (!hasDocument()) {\n    return currentDir;\n  }\n\n  var direction = typeof document.dir !== \"undefined\" ? document.dir : document.getElementsByTagName(\"html\")[0].getAttribute(\"dir\");\n  return direction;\n}\nfunction setDocumentDir(dir\n/*: \"ltr\" | \"rtl\" | \"auto\"*/\n) {\n  // export function setDocumentDir(dir){\n  if (!hasDocument) {\n    currentDir = dir;\n    return;\n  }\n\n  var html = document.getElementsByTagName(\"html\")[0];\n  html.setAttribute(\"dir\", dir);\n}\nfunction addWindowEventListener(event\n/*:string*/\n, callback\n/*: () => mixed*/\n) {\n  if (!hasWindow) {\n    callback();\n    return;\n  }\n\n  window.addEventListener(event, callback);\n}\nfunction removeWindowEventListener(event\n/*:string*/\n, callback\n/*: () => mixed*/\n) {\n  if (!hasWindow) {\n    return;\n  }\n\n  window.removeEventListener(event, callback);\n}\n\n/***/ }),\n\n/***/ \"214f\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n__webpack_require__(\"b0c5\");\nvar redefine = __webpack_require__(\"2aba\");\nvar hide = __webpack_require__(\"32e9\");\nvar fails = __webpack_require__(\"79e5\");\nvar defined = __webpack_require__(\"be13\");\nvar wks = __webpack_require__(\"2b4c\");\nvar regexpExec = __webpack_require__(\"520a\");\n\nvar SPECIES = wks('species');\n\nvar REPLACE_SUPPORTS_NAMED_GROUPS = !fails(function () {\n  // #replace needs built-in support for named groups.\n  // #match works fine because it just return the exec results, even if it has\n  // a \"grops\" property.\n  var re = /./;\n  re.exec = function () {\n    var result = [];\n    result.groups = { a: '7' };\n    return result;\n  };\n  return ''.replace(re, '$<a>') !== '7';\n});\n\nvar SPLIT_WORKS_WITH_OVERWRITTEN_EXEC = (function () {\n  // Chrome 51 has a buggy \"split\" implementation when RegExp#exec !== nativeExec\n  var re = /(?:)/;\n  var originalExec = re.exec;\n  re.exec = function () { return originalExec.apply(this, arguments); };\n  var result = 'ab'.split(re);\n  return result.length === 2 && result[0] === 'a' && result[1] === 'b';\n})();\n\nmodule.exports = function (KEY, length, exec) {\n  var SYMBOL = wks(KEY);\n\n  var DELEGATES_TO_SYMBOL = !fails(function () {\n    // String methods call symbol-named RegEp methods\n    var O = {};\n    O[SYMBOL] = function () { return 7; };\n    return ''[KEY](O) != 7;\n  });\n\n  var DELEGATES_TO_EXEC = DELEGATES_TO_SYMBOL ? !fails(function () {\n    // Symbol-named RegExp methods call .exec\n    var execCalled = false;\n    var re = /a/;\n    re.exec = function () { execCalled = true; return null; };\n    if (KEY === 'split') {\n      // RegExp[@@split] doesn't call the regex's exec method, but first creates\n      // a new one. We need to return the patched regex when creating the new one.\n      re.constructor = {};\n      re.constructor[SPECIES] = function () { return re; };\n    }\n    re[SYMBOL]('');\n    return !execCalled;\n  }) : undefined;\n\n  if (\n    !DELEGATES_TO_SYMBOL ||\n    !DELEGATES_TO_EXEC ||\n    (KEY === 'replace' && !REPLACE_SUPPORTS_NAMED_GROUPS) ||\n    (KEY === 'split' && !SPLIT_WORKS_WITH_OVERWRITTEN_EXEC)\n  ) {\n    var nativeRegExpMethod = /./[SYMBOL];\n    var fns = exec(\n      defined,\n      SYMBOL,\n      ''[KEY],\n      function maybeCallNative(nativeMethod, regexp, str, arg2, forceStringMethod) {\n        if (regexp.exec === regexpExec) {\n          if (DELEGATES_TO_SYMBOL && !forceStringMethod) {\n            // The native String method already delegates to @@method (this\n            // polyfilled function), leasing to infinite recursion.\n            // We avoid it by directly calling the native @@method method.\n            return { done: true, value: nativeRegExpMethod.call(regexp, str, arg2) };\n          }\n          return { done: true, value: nativeMethod.call(str, regexp, arg2) };\n        }\n        return { done: false };\n      }\n    );\n    var strfn = fns[0];\n    var rxfn = fns[1];\n\n    redefine(String.prototype, KEY, strfn);\n    hide(RegExp.prototype, SYMBOL, length == 2\n      // 21.2.5.8 RegExp.prototype[@@replace](string, replaceValue)\n      // 21.2.5.11 RegExp.prototype[@@split](string, limit)\n      ? function (string, arg) { return rxfn.call(string, this, arg); }\n      // 21.2.5.6 RegExp.prototype[@@match](string)\n      // 21.2.5.9 RegExp.prototype[@@search](string)\n      : function (string) { return rxfn.call(string, this); }\n    );\n  }\n};\n\n\n/***/ }),\n\n/***/ \"230e\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar isObject = __webpack_require__(\"d3f4\");\nvar document = __webpack_require__(\"7726\").document;\n// typeof document.createElement is 'object' in old IE\nvar is = isObject(document) && isObject(document.createElement);\nmodule.exports = function (it) {\n  return is ? document.createElement(it) : {};\n};\n\n\n/***/ }),\n\n/***/ \"2350\":\n/***/ (function(module, exports) {\n\n/*\n\tMIT License http://www.opensource.org/licenses/mit-license.php\n\tAuthor Tobias Koppers @sokra\n*/\n// css base code, injected by the css-loader\nmodule.exports = function(useSourceMap) {\n\tvar list = [];\n\n\t// return the list of modules as css string\n\tlist.toString = function toString() {\n\t\treturn this.map(function (item) {\n\t\t\tvar content = cssWithMappingToString(item, useSourceMap);\n\t\t\tif(item[2]) {\n\t\t\t\treturn \"@media \" + item[2] + \"{\" + content + \"}\";\n\t\t\t} else {\n\t\t\t\treturn content;\n\t\t\t}\n\t\t}).join(\"\");\n\t};\n\n\t// import a list of modules into the list\n\tlist.i = function(modules, mediaQuery) {\n\t\tif(typeof modules === \"string\")\n\t\t\tmodules = [[null, modules, \"\"]];\n\t\tvar alreadyImportedModules = {};\n\t\tfor(var i = 0; i < this.length; i++) {\n\t\t\tvar id = this[i][0];\n\t\t\tif(typeof id === \"number\")\n\t\t\t\talreadyImportedModules[id] = true;\n\t\t}\n\t\tfor(i = 0; i < modules.length; i++) {\n\t\t\tvar item = modules[i];\n\t\t\t// skip already imported module\n\t\t\t// this implementation is not 100% perfect for weird media query combinations\n\t\t\t//  when a module is imported multiple times with different media queries.\n\t\t\t//  I hope this will never occur (Hey this way we have smaller bundles)\n\t\t\tif(typeof item[0] !== \"number\" || !alreadyImportedModules[item[0]]) {\n\t\t\t\tif(mediaQuery && !item[2]) {\n\t\t\t\t\titem[2] = mediaQuery;\n\t\t\t\t} else if(mediaQuery) {\n\t\t\t\t\titem[2] = \"(\" + item[2] + \") and (\" + mediaQuery + \")\";\n\t\t\t\t}\n\t\t\t\tlist.push(item);\n\t\t\t}\n\t\t}\n\t};\n\treturn list;\n};\n\nfunction cssWithMappingToString(item, useSourceMap) {\n\tvar content = item[1] || '';\n\tvar cssMapping = item[3];\n\tif (!cssMapping) {\n\t\treturn content;\n\t}\n\n\tif (useSourceMap && typeof btoa === 'function') {\n\t\tvar sourceMapping = toComment(cssMapping);\n\t\tvar sourceURLs = cssMapping.sources.map(function (source) {\n\t\t\treturn '/*# sourceURL=' + cssMapping.sourceRoot + source + ' */'\n\t\t});\n\n\t\treturn [content].concat(sourceURLs).concat([sourceMapping]).join('\\n');\n\t}\n\n\treturn [content].join('\\n');\n}\n\n// Adapted from convert-source-map (MIT)\nfunction toComment(sourceMap) {\n\t// eslint-disable-next-line no-undef\n\tvar base64 = btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap))));\n\tvar data = 'sourceMappingURL=data:application/json;charset=utf-8;base64,' + base64;\n\n\treturn '/*# ' + data + ' */';\n}\n\n\n/***/ }),\n\n/***/ \"23c6\":\n/***/ (function(module, exports, __webpack_require__) {\n\n// getting tag from 19.1.3.6 Object.prototype.toString()\nvar cof = __webpack_require__(\"2d95\");\nvar TAG = __webpack_require__(\"2b4c\")('toStringTag');\n// ES3 wrong here\nvar ARG = cof(function () { return arguments; }()) == 'Arguments';\n\n// fallback for IE11 Script Access Denied error\nvar tryGet = function (it, key) {\n  try {\n    return it[key];\n  } catch (e) { /* empty */ }\n};\n\nmodule.exports = function (it) {\n  var O, T, B;\n  return it === undefined ? 'Undefined' : it === null ? 'Null'\n    // @@toStringTag case\n    : typeof (T = tryGet(O = Object(it), TAG)) == 'string' ? T\n    // builtinTag case\n    : ARG ? cof(O)\n    // ES3 arguments fallback\n    : (B = cof(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : B;\n};\n\n\n/***/ }),\n\n/***/ \"2621\":\n/***/ (function(module, exports) {\n\nexports.f = Object.getOwnPropertySymbols;\n\n\n/***/ }),\n\n/***/ \"2877\":\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return normalizeComponent; });\n/* globals __VUE_SSR_CONTEXT__ */\n\n// IMPORTANT: Do NOT use ES2015 features in this file (except for modules).\n// This module is a runtime utility for cleaner component module output and will\n// be included in the final webpack user bundle.\n\nfunction normalizeComponent (\n  scriptExports,\n  render,\n  staticRenderFns,\n  functionalTemplate,\n  injectStyles,\n  scopeId,\n  moduleIdentifier, /* server only */\n  shadowMode /* vue-cli only */\n) {\n  // Vue.extend constructor export interop\n  var options = typeof scriptExports === 'function'\n    ? scriptExports.options\n    : scriptExports\n\n  // render functions\n  if (render) {\n    options.render = render\n    options.staticRenderFns = staticRenderFns\n    options._compiled = true\n  }\n\n  // functional template\n  if (functionalTemplate) {\n    options.functional = true\n  }\n\n  // scopedId\n  if (scopeId) {\n    options._scopeId = 'data-v-' + scopeId\n  }\n\n  var hook\n  if (moduleIdentifier) { // server build\n    hook = function (context) {\n      // 2.3 injection\n      context =\n        context || // cached call\n        (this.$vnode && this.$vnode.ssrContext) || // stateful\n        (this.parent && this.parent.$vnode && this.parent.$vnode.ssrContext) // functional\n      // 2.2 with runInNewContext: true\n      if (!context && typeof __VUE_SSR_CONTEXT__ !== 'undefined') {\n        context = __VUE_SSR_CONTEXT__\n      }\n      // inject component styles\n      if (injectStyles) {\n        injectStyles.call(this, context)\n      }\n      // register component module identifier for async chunk inferrence\n      if (context && context._registeredComponents) {\n        context._registeredComponents.add(moduleIdentifier)\n      }\n    }\n    // used by ssr in case component is cached and beforeCreate\n    // never gets called\n    options._ssrRegister = hook\n  } else if (injectStyles) {\n    hook = shadowMode\n      ? function () {\n        injectStyles.call(\n          this,\n          (options.functional ? this.parent : this).$root.$options.shadowRoot\n        )\n      }\n      : injectStyles\n  }\n\n  if (hook) {\n    if (options.functional) {\n      // for template-only hot-reload because in that case the render fn doesn't\n      // go through the normalizer\n      options._injectStyles = hook\n      // register for functional component in vue file\n      var originalRender = options.render\n      options.render = function renderWithStyleInjection (h, context) {\n        hook.call(context)\n        return originalRender(h, context)\n      }\n    } else {\n      // inject component registration as beforeCreate hook\n      var existing = options.beforeCreate\n      options.beforeCreate = existing\n        ? [].concat(existing, hook)\n        : [hook]\n    }\n  }\n\n  return {\n    exports: scriptExports,\n    options: options\n  }\n}\n\n\n/***/ }),\n\n/***/ \"2aba\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar global = __webpack_require__(\"7726\");\nvar hide = __webpack_require__(\"32e9\");\nvar has = __webpack_require__(\"69a8\");\nvar SRC = __webpack_require__(\"ca5a\")('src');\nvar $toString = __webpack_require__(\"fa5b\");\nvar TO_STRING = 'toString';\nvar TPL = ('' + $toString).split(TO_STRING);\n\n__webpack_require__(\"8378\").inspectSource = function (it) {\n  return $toString.call(it);\n};\n\n(module.exports = function (O, key, val, safe) {\n  var isFunction = typeof val == 'function';\n  if (isFunction) has(val, 'name') || hide(val, 'name', key);\n  if (O[key] === val) return;\n  if (isFunction) has(val, SRC) || hide(val, SRC, O[key] ? '' + O[key] : TPL.join(String(key)));\n  if (O === global) {\n    O[key] = val;\n  } else if (!safe) {\n    delete O[key];\n    hide(O, key, val);\n  } else if (O[key]) {\n    O[key] = val;\n  } else {\n    hide(O, key, val);\n  }\n// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative\n})(Function.prototype, TO_STRING, function toString() {\n  return typeof this == 'function' && this[SRC] || $toString.call(this);\n});\n\n\n/***/ }),\n\n/***/ \"2aeb\":\n/***/ (function(module, exports, __webpack_require__) {\n\n// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])\nvar anObject = __webpack_require__(\"cb7c\");\nvar dPs = __webpack_require__(\"1495\");\nvar enumBugKeys = __webpack_require__(\"e11e\");\nvar IE_PROTO = __webpack_require__(\"613b\")('IE_PROTO');\nvar Empty = function () { /* empty */ };\nvar PROTOTYPE = 'prototype';\n\n// Create object with fake `null` prototype: use iframe Object with cleared prototype\nvar createDict = function () {\n  // Thrash, waste and sodomy: IE GC bug\n  var iframe = __webpack_require__(\"230e\")('iframe');\n  var i = enumBugKeys.length;\n  var lt = '<';\n  var gt = '>';\n  var iframeDocument;\n  iframe.style.display = 'none';\n  __webpack_require__(\"fab2\").appendChild(iframe);\n  iframe.src = 'javascript:'; // eslint-disable-line no-script-url\n  // createDict = iframe.contentWindow.Object;\n  // html.removeChild(iframe);\n  iframeDocument = iframe.contentWindow.document;\n  iframeDocument.open();\n  iframeDocument.write(lt + 'script' + gt + 'document.F=Object' + lt + '/script' + gt);\n  iframeDocument.close();\n  createDict = iframeDocument.F;\n  while (i--) delete createDict[PROTOTYPE][enumBugKeys[i]];\n  return createDict();\n};\n\nmodule.exports = Object.create || function create(O, Properties) {\n  var result;\n  if (O !== null) {\n    Empty[PROTOTYPE] = anObject(O);\n    result = new Empty();\n    Empty[PROTOTYPE] = null;\n    // add \"__proto__\" for Object.getPrototypeOf polyfill\n    result[IE_PROTO] = O;\n  } else result = createDict();\n  return Properties === undefined ? result : dPs(result, Properties);\n};\n\n\n/***/ }),\n\n/***/ \"2af9\":\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* WEBPACK VAR INJECTION */(function(global) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"d\", function() { return install; });\n/* harmony import */ var core_js_modules_es6_function_name__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(\"7f7f\");\n/* harmony import */ var core_js_modules_es6_function_name__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es6_function_name__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var core_js_modules_es6_array_iterator__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(\"cadf\");\n/* harmony import */ var core_js_modules_es6_array_iterator__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es6_array_iterator__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var core_js_modules_es6_object_keys__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(\"456d\");\n/* harmony import */ var core_js_modules_es6_object_keys__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es6_object_keys__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var core_js_modules_web_dom_iterable__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(\"ac6a\");\n/* harmony import */ var core_js_modules_web_dom_iterable__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_web_dom_iterable__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _GridItem_vue__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(\"bc21\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return _GridItem_vue__WEBPACK_IMPORTED_MODULE_4__[\"a\"]; });\n\n/* harmony import */ var _GridLayout_vue__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(\"37c8\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return _GridLayout_vue__WEBPACK_IMPORTED_MODULE_5__[\"a\"]; });\n\n\n\n\n\n\n // import ResponsiveGridLayout from './ResponsiveGridLayout.vue';\n\nvar VueGridLayout = {\n  // ResponsiveGridLayout,\n  GridLayout: _GridLayout_vue__WEBPACK_IMPORTED_MODULE_5__[/* default */ \"a\"],\n  GridItem: _GridItem_vue__WEBPACK_IMPORTED_MODULE_4__[/* default */ \"a\"]\n};\nfunction install(Vue) {\n  if (install.installed) return;\n  install.installed = true;\n  Object.keys(VueGridLayout).forEach(function (name) {\n    Vue.component(name, VueGridLayout[name]);\n  });\n}\nvar plugin = {\n  install: install\n};\nvar GlobalVue = null;\n\nif (typeof window !== 'undefined') {\n  GlobalVue = window.Vue;\n} else if (typeof global !== 'undefined') {\n  GlobalVue = global.Vue;\n}\n\nif (GlobalVue) {\n  GlobalVue.use(plugin);\n}\n\n/* harmony default export */ __webpack_exports__[\"c\"] = (VueGridLayout);\n\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(\"c8ba\")))\n\n/***/ }),\n\n/***/ \"2b4c\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar store = __webpack_require__(\"5537\")('wks');\nvar uid = __webpack_require__(\"ca5a\");\nvar Symbol = __webpack_require__(\"7726\").Symbol;\nvar USE_SYMBOL = typeof Symbol == 'function';\n\nvar $exports = module.exports = function (name) {\n  return store[name] || (store[name] =\n    USE_SYMBOL && Symbol[name] || (USE_SYMBOL ? Symbol : uid)('Symbol.' + name));\n};\n\n$exports.store = store;\n\n\n/***/ }),\n\n/***/ \"2cef\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nmodule.exports = function() {\n    var idCount = 1;\n\n    /**\n     * Generates a new unique id in the context.\n     * @public\n     * @returns {number} A unique id in the context.\n     */\n    function generate() {\n        return idCount++;\n    }\n\n    return {\n        generate: generate\n    };\n};\n\n\n/***/ }),\n\n/***/ \"2d00\":\n/***/ (function(module, exports) {\n\nmodule.exports = false;\n\n\n/***/ }),\n\n/***/ \"2d95\":\n/***/ (function(module, exports) {\n\nvar toString = {}.toString;\n\nmodule.exports = function (it) {\n  return toString.call(it).slice(8, -1);\n};\n\n\n/***/ }),\n\n/***/ \"2f21\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar fails = __webpack_require__(\"79e5\");\n\nmodule.exports = function (method, arg) {\n  return !!method && fails(function () {\n    // eslint-disable-next-line no-useless-call\n    arg ? method.call(null, function () { /* empty */ }, 1) : method.call(null);\n  });\n};\n\n\n/***/ }),\n\n/***/ \"32e9\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar dP = __webpack_require__(\"86cc\");\nvar createDesc = __webpack_require__(\"4630\");\nmodule.exports = __webpack_require__(\"9e1e\") ? function (object, key, value) {\n  return dP.f(object, key, createDesc(1, value));\n} : function (object, key, value) {\n  object[key] = value;\n  return object;\n};\n\n\n/***/ }),\n\n/***/ \"37c8\":\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n\n// CONCATENATED MODULE: ./node_modules/cache-loader/dist/cjs.js?{\"cacheDirectory\":\"node_modules/.cache/vue-loader\",\"cacheIdentifier\":\"1705dc22-vue-loader-template\"}!./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options!./src/components/GridLayout.vue?vue&type=template&id=361da5e4&\nvar render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{ref:\"item\",staticClass:\"vue-grid-layout\",style:(_vm.mergedStyle)},[_vm._t(\"default\"),_c('grid-item',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.isDragging),expression:\"isDragging\"}],staticClass:\"vue-grid-placeholder\",attrs:{\"x\":_vm.placeholder.x,\"y\":_vm.placeholder.y,\"w\":_vm.placeholder.w,\"h\":_vm.placeholder.h,\"i\":_vm.placeholder.i}})],2)}\nvar staticRenderFns = []\n\n\n// CONCATENATED MODULE: ./src/components/GridLayout.vue?vue&type=template&id=361da5e4&\n\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es7.object.get-own-property-descriptors.js\nvar es7_object_get_own_property_descriptors = __webpack_require__(\"8e6e\");\n\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es6.array.iterator.js\nvar es6_array_iterator = __webpack_require__(\"cadf\");\n\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es6.object.keys.js\nvar es6_object_keys = __webpack_require__(\"456d\");\n\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es6.object.assign.js\nvar es6_object_assign = __webpack_require__(\"f751\");\n\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es6.number.is-finite.js\nvar es6_number_is_finite = __webpack_require__(\"fca0\");\n\n// EXTERNAL MODULE: ./node_modules/core-js/modules/web.dom.iterable.js\nvar web_dom_iterable = __webpack_require__(\"ac6a\");\n\n// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/esm/defineProperty.js\nvar defineProperty = __webpack_require__(\"ade3\");\n\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es6.number.constructor.js\nvar es6_number_constructor = __webpack_require__(\"c5f6\");\n\n// EXTERNAL MODULE: external {\"commonjs\":\"vue\",\"commonjs2\":\"vue\",\"root\":\"Vue\"}\nvar external_commonjs_vue_commonjs2_vue_root_Vue_ = __webpack_require__(\"8bbf\");\nvar external_commonjs_vue_commonjs2_vue_root_Vue_default = /*#__PURE__*/__webpack_require__.n(external_commonjs_vue_commonjs2_vue_root_Vue_);\n\n// EXTERNAL MODULE: ./src/helpers/utils.js\nvar utils = __webpack_require__(\"a2b6\");\n\n// EXTERNAL MODULE: ./src/helpers/responsiveUtils.js\nvar responsiveUtils = __webpack_require__(\"97a7\");\n\n// EXTERNAL MODULE: ./src/components/GridItem.vue + 71 modules\nvar GridItem = __webpack_require__(\"bc21\");\n\n// EXTERNAL MODULE: ./src/helpers/DOM.js\nvar DOM = __webpack_require__(\"1ca7\");\n\n// CONCATENATED MODULE: ./node_modules/cache-loader/dist/cjs.js??ref--12-0!./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options!./src/components/GridLayout.vue?vue&type=script&lang=js&\n\n\n\n\n\n\n\n\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { Object(defineProperty[\"a\" /* default */])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }\n\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\nvar elementResizeDetectorMaker = __webpack_require__(\"eec4\");\n\n\n //var eventBus = require('./eventBus');\n\n\n\n/* harmony default export */ var GridLayoutvue_type_script_lang_js_ = ({\n  name: \"GridLayout\",\n  provide: function provide() {\n    return {\n      eventBus: null,\n      layout: this\n    };\n  },\n  components: {\n    GridItem: GridItem[\"a\" /* default */]\n  },\n  props: {\n    // If true, the container height swells and contracts to fit contents\n    autoSize: {\n      type: Boolean,\n      default: true\n    },\n    colNum: {\n      type: Number,\n      default: 12\n    },\n    rowHeight: {\n      type: Number,\n      default: 150\n    },\n    maxRows: {\n      type: Number,\n      default: Infinity\n    },\n    margin: {\n      type: Array,\n      default: function _default() {\n        return [10, 10];\n      }\n    },\n    isDraggable: {\n      type: Boolean,\n      default: true\n    },\n    isResizable: {\n      type: Boolean,\n      default: true\n    },\n    isMirrored: {\n      type: Boolean,\n      default: false\n    },\n    isBounded: {\n      type: Boolean,\n      default: false\n    },\n    useCssTransforms: {\n      type: Boolean,\n      default: true\n    },\n    verticalCompact: {\n      type: Boolean,\n      default: true\n    },\n    restoreOnDrag: {\n      type: Boolean,\n      default: false\n    },\n    layout: {\n      type: Array,\n      required: true\n    },\n    responsive: {\n      type: Boolean,\n      default: false\n    },\n    responsiveLayouts: {\n      type: Object,\n      default: function _default() {\n        return {};\n      }\n    },\n    transformScale: {\n      type: Number,\n      default: 1\n    },\n    breakpoints: {\n      type: Object,\n      default: function _default() {\n        return {\n          lg: 1200,\n          md: 996,\n          sm: 768,\n          xs: 480,\n          xxs: 0\n        };\n      }\n    },\n    cols: {\n      type: Object,\n      default: function _default() {\n        return {\n          lg: 12,\n          md: 10,\n          sm: 6,\n          xs: 4,\n          xxs: 2\n        };\n      }\n    },\n    preventCollision: {\n      type: Boolean,\n      default: false\n    },\n    useStyleCursor: {\n      type: Boolean,\n      default: true\n    }\n  },\n  data: function data() {\n    return {\n      width: null,\n      mergedStyle: {},\n      lastLayoutLength: 0,\n      isDragging: false,\n      placeholder: {\n        x: 0,\n        y: 0,\n        w: 0,\n        h: 0,\n        i: -1\n      },\n      layouts: {},\n      // array to store all layouts from different breakpoints\n      lastBreakpoint: null,\n      // store last active breakpoint\n      originalLayout: null // store original Layout\n\n    };\n  },\n  created: function created() {\n    var self = this; // Accessible refernces of functions for removing in beforeDestroy\n\n    self.resizeEventHandler = function (eventType, i, x, y, h, w) {\n      self.resizeEvent(eventType, i, x, y, h, w);\n    };\n\n    self.dragEventHandler = function (eventType, i, x, y, h, w) {\n      self.dragEvent(eventType, i, x, y, h, w);\n    };\n\n    self._provided.eventBus = new external_commonjs_vue_commonjs2_vue_root_Vue_default.a();\n    self.eventBus = self._provided.eventBus;\n    self.eventBus.$on('resizeEvent', self.resizeEventHandler);\n    self.eventBus.$on('dragEvent', self.dragEventHandler);\n    self.$emit('layout-created', self.layout);\n  },\n  beforeDestroy: function beforeDestroy() {\n    //Remove listeners\n    this.eventBus.$off('resizeEvent', this.resizeEventHandler);\n    this.eventBus.$off('dragEvent', this.dragEventHandler);\n    this.eventBus.$destroy();\n    Object(DOM[\"c\" /* removeWindowEventListener */])(\"resize\", this.onWindowResize);\n\n    if (this.erd) {\n      this.erd.uninstall(this.$refs.item);\n    }\n  },\n  beforeMount: function beforeMount() {\n    this.$emit('layout-before-mount', this.layout);\n  },\n  mounted: function mounted() {\n    this.$emit('layout-mounted', this.layout);\n    this.$nextTick(function () {\n      Object(utils[\"l\" /* validateLayout */])(this.layout);\n      this.originalLayout = this.layout;\n      var self = this;\n      this.$nextTick(function () {\n        self.initResponsiveFeatures();\n        self.onWindowResize(); //self.width = self.$el.offsetWidth;\n\n        Object(DOM[\"a\" /* addWindowEventListener */])('resize', self.onWindowResize);\n        Object(utils[\"c\" /* compact */])(self.layout, self.verticalCompact);\n        self.$emit('layout-updated', self.layout);\n        self.updateHeight();\n        self.$nextTick(function () {\n          this.erd = elementResizeDetectorMaker({\n            strategy: \"scroll\",\n            //<- For ultra performance.\n            // See https://github.com/wnr/element-resize-detector/issues/110 about callOnAdd.\n            callOnAdd: false\n          });\n          this.erd.listenTo(self.$refs.item, function () {\n            self.onWindowResize();\n          });\n        });\n      });\n    });\n  },\n  watch: {\n    width: function width(newval, oldval) {\n      var self = this;\n      this.$nextTick(function () {\n        var _this = this;\n\n        //this.$broadcast(\"updateWidth\", this.width);\n        this.eventBus.$emit(\"updateWidth\", this.width);\n\n        if (oldval === null) {\n          /*\n              If oldval == null is when the width has never been\n              set before. That only occurs when mouting is\n              finished, and onWindowResize has been called and\n              this.width has been changed the first time after it\n              got set to null in the constructor. It is now time\n              to issue layout-ready events as the GridItems have\n              their sizes configured properly.\n                The reason for emitting the layout-ready events on\n              the next tick is to allow for the newly-emitted\n              updateWidth event (above) to have reached the\n              children GridItem-s and had their effect, so we're\n              sure that they have the final size before we emit\n              layout-ready (for this GridLayout) and\n              item-layout-ready (for the GridItem-s).\n                This way any client event handlers can reliably\n              invistigate stable sizes of GridItem-s.\n          */\n          this.$nextTick(function () {\n            _this.$emit('layout-ready', self.layout);\n          });\n        }\n\n        this.updateHeight();\n      });\n    },\n    layout: function layout() {\n      this.layoutUpdate();\n    },\n    colNum: function colNum(val) {\n      this.eventBus.$emit(\"setColNum\", val);\n    },\n    rowHeight: function rowHeight() {\n      this.eventBus.$emit(\"setRowHeight\", this.rowHeight);\n    },\n    isDraggable: function isDraggable() {\n      this.eventBus.$emit(\"setDraggable\", this.isDraggable);\n    },\n    isResizable: function isResizable() {\n      this.eventBus.$emit(\"setResizable\", this.isResizable);\n    },\n    isBounded: function isBounded() {\n      this.eventBus.$emit(\"setBounded\", this.isBounded);\n    },\n    transformScale: function transformScale() {\n      this.eventBus.$emit(\"setTransformScale\", this.transformScale);\n    },\n    responsive: function responsive() {\n      if (!this.responsive) {\n        this.$emit('update:layout', this.originalLayout);\n        this.eventBus.$emit(\"setColNum\", this.colNum);\n      }\n\n      this.onWindowResize();\n    },\n    maxRows: function maxRows() {\n      this.eventBus.$emit(\"setMaxRows\", this.maxRows);\n    },\n    margin: function margin() {\n      this.updateHeight();\n    }\n  },\n  methods: {\n    layoutUpdate: function layoutUpdate() {\n      if (this.layout !== undefined && this.originalLayout !== null) {\n        if (this.layout.length !== this.originalLayout.length) {\n          // console.log(\"### LAYOUT UPDATE!\", this.layout.length, this.originalLayout.length);\n          var diff = this.findDifference(this.layout, this.originalLayout);\n\n          if (diff.length > 0) {\n            // console.log(diff);\n            if (this.layout.length > this.originalLayout.length) {\n              this.originalLayout = this.originalLayout.concat(diff);\n            } else {\n              this.originalLayout = this.originalLayout.filter(function (obj) {\n                return !diff.some(function (obj2) {\n                  return obj.i === obj2.i;\n                });\n              });\n            }\n          }\n\n          this.lastLayoutLength = this.layout.length;\n          this.initResponsiveFeatures();\n        }\n\n        Object(utils[\"c\" /* compact */])(this.layout, this.verticalCompact);\n        this.eventBus.$emit(\"updateWidth\", this.width);\n        this.updateHeight();\n        this.$emit('layout-updated', this.layout);\n      }\n    },\n    updateHeight: function updateHeight() {\n      this.mergedStyle = {\n        height: this.containerHeight()\n      };\n    },\n    onWindowResize: function onWindowResize() {\n      if (this.$refs !== null && this.$refs.item !== null && this.$refs.item !== undefined) {\n        this.width = this.$refs.item.offsetWidth;\n      }\n\n      this.eventBus.$emit(\"resizeEvent\");\n    },\n    containerHeight: function containerHeight() {\n      if (!this.autoSize) return; // console.log(\"bottom: \" + bottom(this.layout))\n      // console.log(\"rowHeight + margins: \" + (this.rowHeight + this.margin[1]) + this.margin[1])\n\n      var containerHeight = Object(utils[\"a\" /* bottom */])(this.layout) * (this.rowHeight + this.margin[1]) + this.margin[1] + 'px';\n      return containerHeight;\n    },\n    dragEvent: function dragEvent(eventName, id, x, y, h, w) {\n      //console.log(eventName + \" id=\" + id + \", x=\" + x + \", y=\" + y);\n      var l = Object(utils[\"f\" /* getLayoutItem */])(this.layout, id); //GetLayoutItem sometimes returns null object\n\n      if (l === undefined || l === null) {\n        l = {\n          x: 0,\n          y: 0\n        };\n      }\n\n      if (eventName === \"dragstart\" && !this.verticalCompact) {\n        this.positionsBeforeDrag = this.layout.reduce(function (result, _ref) {\n          var i = _ref.i,\n              x = _ref.x,\n              y = _ref.y;\n          return _objectSpread(_objectSpread({}, result), {}, Object(defineProperty[\"a\" /* default */])({}, i, {\n            x: x,\n            y: y\n          }));\n        }, {});\n      }\n\n      if (eventName === \"dragmove\" || eventName === \"dragstart\") {\n        this.placeholder.i = id;\n        this.placeholder.x = l.x;\n        this.placeholder.y = l.y;\n        this.placeholder.w = w;\n        this.placeholder.h = h;\n        this.$nextTick(function () {\n          this.isDragging = true;\n        }); //this.$broadcast(\"updateWidth\", this.width);\n\n        this.eventBus.$emit(\"updateWidth\", this.width);\n      } else {\n        this.$nextTick(function () {\n          this.isDragging = false;\n        });\n      } // Move the element to the dragged location.\n\n\n      this.layout = Object(utils[\"g\" /* moveElement */])(this.layout, l, x, y, true, this.preventCollision);\n\n      if (this.restoreOnDrag) {\n        // Do not compact items more than in layout before drag\n        // Set moved item as static to avoid to compact it\n        l.static = true;\n        Object(utils[\"c\" /* compact */])(this.layout, this.verticalCompact, this.positionsBeforeDrag);\n        l.static = false;\n      } else {\n        Object(utils[\"c\" /* compact */])(this.layout, this.verticalCompact);\n      } // needed because vue can't detect changes on array element properties\n\n\n      this.eventBus.$emit(\"compact\");\n      this.updateHeight();\n\n      if (eventName === 'dragend') {\n        delete this.positionsBeforeDrag;\n        this.$emit('layout-updated', this.layout);\n      }\n    },\n    resizeEvent: function resizeEvent(eventName, id, x, y, h, w) {\n      var l = Object(utils[\"f\" /* getLayoutItem */])(this.layout, id); //GetLayoutItem sometimes return null object\n\n      if (l === undefined || l === null) {\n        l = {\n          h: 0,\n          w: 0\n        };\n      }\n\n      var hasCollisions;\n\n      if (this.preventCollision) {\n        var collisions = Object(utils[\"e\" /* getAllCollisions */])(this.layout, _objectSpread(_objectSpread({}, l), {}, {\n          w: w,\n          h: h\n        })).filter(function (layoutItem) {\n          return layoutItem.i !== l.i;\n        });\n        hasCollisions = collisions.length > 0; // If we're colliding, we need adjust the placeholder.\n\n        if (hasCollisions) {\n          // adjust w && h to maximum allowed space\n          var leastX = Infinity,\n              leastY = Infinity;\n          collisions.forEach(function (layoutItem) {\n            if (layoutItem.x > l.x) leastX = Math.min(leastX, layoutItem.x);\n            if (layoutItem.y > l.y) leastY = Math.min(leastY, layoutItem.y);\n          });\n          if (Number.isFinite(leastX)) l.w = leastX - l.x;\n          if (Number.isFinite(leastY)) l.h = leastY - l.y;\n        }\n      }\n\n      if (!hasCollisions) {\n        // Set new width and height.\n        l.w = w;\n        l.h = h;\n      }\n\n      if (eventName === \"resizestart\" || eventName === \"resizemove\") {\n        this.placeholder.i = id;\n        this.placeholder.x = x;\n        this.placeholder.y = y;\n        this.placeholder.w = l.w;\n        this.placeholder.h = l.h;\n        this.$nextTick(function () {\n          this.isDragging = true;\n        }); //this.$broadcast(\"updateWidth\", this.width);\n\n        this.eventBus.$emit(\"updateWidth\", this.width);\n      } else {\n        this.$nextTick(function () {\n          this.isDragging = false;\n        });\n      }\n\n      if (this.responsive) this.responsiveGridLayout();\n      Object(utils[\"c\" /* compact */])(this.layout, this.verticalCompact);\n      this.eventBus.$emit(\"compact\");\n      this.updateHeight();\n      if (eventName === 'resizeend') this.$emit('layout-updated', this.layout);\n    },\n    // finds or generates new layouts for set breakpoints\n    responsiveGridLayout: function responsiveGridLayout() {\n      var newBreakpoint = Object(responsiveUtils[\"b\" /* getBreakpointFromWidth */])(this.breakpoints, this.width);\n      var newCols = Object(responsiveUtils[\"c\" /* getColsFromBreakpoint */])(newBreakpoint, this.cols); // save actual layout in layouts\n\n      if (this.lastBreakpoint != null && !this.layouts[this.lastBreakpoint]) this.layouts[this.lastBreakpoint] = Object(utils[\"b\" /* cloneLayout */])(this.layout); // Find or generate a new layout.\n\n      var layout = Object(responsiveUtils[\"a\" /* findOrGenerateResponsiveLayout */])(this.originalLayout, this.layouts, this.breakpoints, newBreakpoint, this.lastBreakpoint, newCols, this.verticalCompact); // Store the new layout.\n\n      this.layouts[newBreakpoint] = layout;\n\n      if (this.lastBreakpoint !== newBreakpoint) {\n        this.$emit('breakpoint-changed', newBreakpoint, layout);\n      } // new prop sync\n\n\n      this.$emit('update:layout', layout);\n      this.lastBreakpoint = newBreakpoint;\n      this.eventBus.$emit(\"setColNum\", Object(responsiveUtils[\"c\" /* getColsFromBreakpoint */])(newBreakpoint, this.cols));\n    },\n    // clear all responsive layouts\n    initResponsiveFeatures: function initResponsiveFeatures() {\n      // clear layouts\n      this.layouts = Object.assign({}, this.responsiveLayouts);\n    },\n    // find difference in layouts\n    findDifference: function findDifference(layout, originalLayout) {\n      //Find values that are in result1 but not in result2\n      var uniqueResultOne = layout.filter(function (obj) {\n        return !originalLayout.some(function (obj2) {\n          return obj.i === obj2.i;\n        });\n      }); //Find values that are in result2 but not in result1\n\n      var uniqueResultTwo = originalLayout.filter(function (obj) {\n        return !layout.some(function (obj2) {\n          return obj.i === obj2.i;\n        });\n      }); //Combine the two arrays of unique entries#\n\n      return uniqueResultOne.concat(uniqueResultTwo);\n    }\n  }\n});\n// CONCATENATED MODULE: ./src/components/GridLayout.vue?vue&type=script&lang=js&\n /* harmony default export */ var components_GridLayoutvue_type_script_lang_js_ = (GridLayoutvue_type_script_lang_js_); \n// EXTERNAL MODULE: ./src/components/GridLayout.vue?vue&type=style&index=0&lang=css&\nvar GridLayoutvue_type_style_index_0_lang_css_ = __webpack_require__(\"e279\");\n\n// EXTERNAL MODULE: ./node_modules/vue-loader/lib/runtime/componentNormalizer.js\nvar componentNormalizer = __webpack_require__(\"2877\");\n\n// CONCATENATED MODULE: ./src/components/GridLayout.vue\n\n\n\n\n\n\n/* normalize component */\n\nvar component = Object(componentNormalizer[\"a\" /* default */])(\n  components_GridLayoutvue_type_script_lang_js_,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  null,\n  null\n  \n)\n\n/* harmony default export */ var GridLayout = __webpack_exports__[\"a\"] = (component.exports);\n\n/***/ }),\n\n/***/ \"38fd\":\n/***/ (function(module, exports, __webpack_require__) {\n\n// 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O)\nvar has = __webpack_require__(\"69a8\");\nvar toObject = __webpack_require__(\"4bf8\");\nvar IE_PROTO = __webpack_require__(\"613b\")('IE_PROTO');\nvar ObjectProto = Object.prototype;\n\nmodule.exports = Object.getPrototypeOf || function (O) {\n  O = toObject(O);\n  if (has(O, IE_PROTO)) return O[IE_PROTO];\n  if (typeof O.constructor == 'function' && O instanceof O.constructor) {\n    return O.constructor.prototype;\n  } return O instanceof Object ? ObjectProto : null;\n};\n\n\n/***/ }),\n\n/***/ \"41a0\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar create = __webpack_require__(\"2aeb\");\nvar descriptor = __webpack_require__(\"4630\");\nvar setToStringTag = __webpack_require__(\"7f20\");\nvar IteratorPrototype = {};\n\n// 25.1.2.1.1 %IteratorPrototype%[@@iterator]()\n__webpack_require__(\"32e9\")(IteratorPrototype, __webpack_require__(\"2b4c\")('iterator'), function () { return this; });\n\nmodule.exports = function (Constructor, NAME, next) {\n  Constructor.prototype = create(IteratorPrototype, { next: descriptor(1, next) });\n  setToStringTag(Constructor, NAME + ' Iterator');\n};\n\n\n/***/ }),\n\n/***/ \"456d\":\n/***/ (function(module, exports, __webpack_require__) {\n\n// 19.1.2.14 Object.keys(O)\nvar toObject = __webpack_require__(\"4bf8\");\nvar $keys = __webpack_require__(\"0d58\");\n\n__webpack_require__(\"5eda\")('keys', function () {\n  return function keys(it) {\n    return $keys(toObject(it));\n  };\n});\n\n\n/***/ }),\n\n/***/ \"4588\":\n/***/ (function(module, exports) {\n\n// 7.1.4 ToInteger\nvar ceil = Math.ceil;\nvar floor = Math.floor;\nmodule.exports = function (it) {\n  return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it);\n};\n\n\n/***/ }),\n\n/***/ \"4630\":\n/***/ (function(module, exports) {\n\nmodule.exports = function (bitmap, value) {\n  return {\n    enumerable: !(bitmap & 1),\n    configurable: !(bitmap & 2),\n    writable: !(bitmap & 4),\n    value: value\n  };\n};\n\n\n/***/ }),\n\n/***/ \"4917\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar anObject = __webpack_require__(\"cb7c\");\nvar toLength = __webpack_require__(\"9def\");\nvar advanceStringIndex = __webpack_require__(\"0390\");\nvar regExpExec = __webpack_require__(\"5f1b\");\n\n// @@match logic\n__webpack_require__(\"214f\")('match', 1, function (defined, MATCH, $match, maybeCallNative) {\n  return [\n    // `String.prototype.match` method\n    // https://tc39.github.io/ecma262/#sec-string.prototype.match\n    function match(regexp) {\n      var O = defined(this);\n      var fn = regexp == undefined ? undefined : regexp[MATCH];\n      return fn !== undefined ? fn.call(regexp, O) : new RegExp(regexp)[MATCH](String(O));\n    },\n    // `RegExp.prototype[@@match]` method\n    // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@match\n    function (regexp) {\n      var res = maybeCallNative($match, regexp, this);\n      if (res.done) return res.value;\n      var rx = anObject(regexp);\n      var S = String(this);\n      if (!rx.global) return regExpExec(rx, S);\n      var fullUnicode = rx.unicode;\n      rx.lastIndex = 0;\n      var A = [];\n      var n = 0;\n      var result;\n      while ((result = regExpExec(rx, S)) !== null) {\n        var matchStr = String(result[0]);\n        A[n] = matchStr;\n        if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode);\n        n++;\n      }\n      return n === 0 ? null : A;\n    }\n  ];\n});\n\n\n/***/ }),\n\n/***/ \"499e\":\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n// ESM COMPAT FLAG\n__webpack_require__.r(__webpack_exports__);\n\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, \"default\", function() { return /* binding */ addStylesClient; });\n\n// CONCATENATED MODULE: ./node_modules/vue-style-loader/lib/listToStyles.js\n/**\n * Translates the list format produced by css-loader into something\n * easier to manipulate.\n */\nfunction listToStyles (parentId, list) {\n  var styles = []\n  var newStyles = {}\n  for (var i = 0; i < list.length; i++) {\n    var item = list[i]\n    var id = item[0]\n    var css = item[1]\n    var media = item[2]\n    var sourceMap = item[3]\n    var part = {\n      id: parentId + ':' + i,\n      css: css,\n      media: media,\n      sourceMap: sourceMap\n    }\n    if (!newStyles[id]) {\n      styles.push(newStyles[id] = { id: id, parts: [part] })\n    } else {\n      newStyles[id].parts.push(part)\n    }\n  }\n  return styles\n}\n\n// CONCATENATED MODULE: ./node_modules/vue-style-loader/lib/addStylesClient.js\n/*\n  MIT License http://www.opensource.org/licenses/mit-license.php\n  Author Tobias Koppers @sokra\n  Modified by Evan You @yyx990803\n*/\n\n\n\nvar hasDocument = typeof document !== 'undefined'\n\nif (typeof DEBUG !== 'undefined' && DEBUG) {\n  if (!hasDocument) {\n    throw new Error(\n    'vue-style-loader cannot be used in a non-browser environment. ' +\n    \"Use { target: 'node' } in your Webpack config to indicate a server-rendering environment.\"\n  ) }\n}\n\n/*\ntype StyleObject = {\n  id: number;\n  parts: Array<StyleObjectPart>\n}\n\ntype StyleObjectPart = {\n  css: string;\n  media: string;\n  sourceMap: ?string\n}\n*/\n\nvar stylesInDom = {/*\n  [id: number]: {\n    id: number,\n    refs: number,\n    parts: Array<(obj?: StyleObjectPart) => void>\n  }\n*/}\n\nvar head = hasDocument && (document.head || document.getElementsByTagName('head')[0])\nvar singletonElement = null\nvar singletonCounter = 0\nvar isProduction = false\nvar noop = function () {}\nvar options = null\nvar ssrIdKey = 'data-vue-ssr-id'\n\n// Force single-tag solution on IE6-9, which has a hard limit on the # of <style>\n// tags it will allow on a page\nvar isOldIE = typeof navigator !== 'undefined' && /msie [6-9]\\b/.test(navigator.userAgent.toLowerCase())\n\nfunction addStylesClient (parentId, list, _isProduction, _options) {\n  isProduction = _isProduction\n\n  options = _options || {}\n\n  var styles = listToStyles(parentId, list)\n  addStylesToDom(styles)\n\n  return function update (newList) {\n    var mayRemove = []\n    for (var i = 0; i < styles.length; i++) {\n      var item = styles[i]\n      var domStyle = stylesInDom[item.id]\n      domStyle.refs--\n      mayRemove.push(domStyle)\n    }\n    if (newList) {\n      styles = listToStyles(parentId, newList)\n      addStylesToDom(styles)\n    } else {\n      styles = []\n    }\n    for (var i = 0; i < mayRemove.length; i++) {\n      var domStyle = mayRemove[i]\n      if (domStyle.refs === 0) {\n        for (var j = 0; j < domStyle.parts.length; j++) {\n          domStyle.parts[j]()\n        }\n        delete stylesInDom[domStyle.id]\n      }\n    }\n  }\n}\n\nfunction addStylesToDom (styles /* Array<StyleObject> */) {\n  for (var i = 0; i < styles.length; i++) {\n    var item = styles[i]\n    var domStyle = stylesInDom[item.id]\n    if (domStyle) {\n      domStyle.refs++\n      for (var j = 0; j < domStyle.parts.length; j++) {\n        domStyle.parts[j](item.parts[j])\n      }\n      for (; j < item.parts.length; j++) {\n        domStyle.parts.push(addStyle(item.parts[j]))\n      }\n      if (domStyle.parts.length > item.parts.length) {\n        domStyle.parts.length = item.parts.length\n      }\n    } else {\n      var parts = []\n      for (var j = 0; j < item.parts.length; j++) {\n        parts.push(addStyle(item.parts[j]))\n      }\n      stylesInDom[item.id] = { id: item.id, refs: 1, parts: parts }\n    }\n  }\n}\n\nfunction createStyleElement () {\n  var styleElement = document.createElement('style')\n  styleElement.type = 'text/css'\n  head.appendChild(styleElement)\n  return styleElement\n}\n\nfunction addStyle (obj /* StyleObjectPart */) {\n  var update, remove\n  var styleElement = document.querySelector('style[' + ssrIdKey + '~=\"' + obj.id + '\"]')\n\n  if (styleElement) {\n    if (isProduction) {\n      // has SSR styles and in production mode.\n      // simply do nothing.\n      return noop\n    } else {\n      // has SSR styles but in dev mode.\n      // for some reason Chrome can't handle source map in server-rendered\n      // style tags - source maps in <style> only works if the style tag is\n      // created and inserted dynamically. So we remove the server rendered\n      // styles and inject new ones.\n      styleElement.parentNode.removeChild(styleElement)\n    }\n  }\n\n  if (isOldIE) {\n    // use singleton mode for IE9.\n    var styleIndex = singletonCounter++\n    styleElement = singletonElement || (singletonElement = createStyleElement())\n    update = applyToSingletonTag.bind(null, styleElement, styleIndex, false)\n    remove = applyToSingletonTag.bind(null, styleElement, styleIndex, true)\n  } else {\n    // use multi-style-tag mode in all other cases\n    styleElement = createStyleElement()\n    update = applyToTag.bind(null, styleElement)\n    remove = function () {\n      styleElement.parentNode.removeChild(styleElement)\n    }\n  }\n\n  update(obj)\n\n  return function updateStyle (newObj /* StyleObjectPart */) {\n    if (newObj) {\n      if (newObj.css === obj.css &&\n          newObj.media === obj.media &&\n          newObj.sourceMap === obj.sourceMap) {\n        return\n      }\n      update(obj = newObj)\n    } else {\n      remove()\n    }\n  }\n}\n\nvar replaceText = (function () {\n  var textStore = []\n\n  return function (index, replacement) {\n    textStore[index] = replacement\n    return textStore.filter(Boolean).join('\\n')\n  }\n})()\n\nfunction applyToSingletonTag (styleElement, index, remove, obj) {\n  var css = remove ? '' : obj.css\n\n  if (styleElement.styleSheet) {\n    styleElement.styleSheet.cssText = replaceText(index, css)\n  } else {\n    var cssNode = document.createTextNode(css)\n    var childNodes = styleElement.childNodes\n    if (childNodes[index]) styleElement.removeChild(childNodes[index])\n    if (childNodes.length) {\n      styleElement.insertBefore(cssNode, childNodes[index])\n    } else {\n      styleElement.appendChild(cssNode)\n    }\n  }\n}\n\nfunction applyToTag (styleElement, obj) {\n  var css = obj.css\n  var media = obj.media\n  var sourceMap = obj.sourceMap\n\n  if (media) {\n    styleElement.setAttribute('media', media)\n  }\n  if (options.ssrId) {\n    styleElement.setAttribute(ssrIdKey, obj.id)\n  }\n\n  if (sourceMap) {\n    // https://developer.chrome.com/devtools/docs/javascript-debugging\n    // this makes source maps inside style tags work properly in Chrome\n    css += '\\n/*# sourceURL=' + sourceMap.sources[0] + ' */'\n    // http://stackoverflow.com/a/26603875\n    css += '\\n/*# sourceMappingURL=data:application/json;base64,' + btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap)))) + ' */'\n  }\n\n  if (styleElement.styleSheet) {\n    styleElement.styleSheet.cssText = css\n  } else {\n    while (styleElement.firstChild) {\n      styleElement.removeChild(styleElement.firstChild)\n    }\n    styleElement.appendChild(document.createTextNode(css))\n  }\n}\n\n\n/***/ }),\n\n/***/ \"49ad\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nmodule.exports = function(idHandler) {\n    var eventListeners = {};\n\n    /**\n     * Gets all listeners for the given element.\n     * @public\n     * @param {element} element The element to get all listeners for.\n     * @returns All listeners for the given element.\n     */\n    function getListeners(element) {\n        var id = idHandler.get(element);\n\n        if (id === undefined) {\n            return [];\n        }\n\n        return eventListeners[id] || [];\n    }\n\n    /**\n     * Stores the given listener for the given element. Will not actually add the listener to the element.\n     * @public\n     * @param {element} element The element that should have the listener added.\n     * @param {function} listener The callback that the element has added.\n     */\n    function addListener(element, listener) {\n        var id = idHandler.get(element);\n\n        if(!eventListeners[id]) {\n            eventListeners[id] = [];\n        }\n\n        eventListeners[id].push(listener);\n    }\n\n    function removeListener(element, listener) {\n        var listeners = getListeners(element);\n        for (var i = 0, len = listeners.length; i < len; ++i) {\n            if (listeners[i] === listener) {\n              listeners.splice(i, 1);\n              break;\n            }\n        }\n    }\n\n    function removeAllListeners(element) {\n      var listeners = getListeners(element);\n      if (!listeners) { return; }\n      listeners.length = 0;\n    }\n\n    return {\n        get: getListeners,\n        add: addListener,\n        removeListener: removeListener,\n        removeAllListeners: removeAllListeners\n    };\n};\n\n\n/***/ }),\n\n/***/ \"4bf8\":\n/***/ (function(module, exports, __webpack_require__) {\n\n// 7.1.13 ToObject(argument)\nvar defined = __webpack_require__(\"be13\");\nmodule.exports = function (it) {\n  return Object(defined(it));\n};\n\n\n/***/ }),\n\n/***/ \"5058\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nmodule.exports = function(options) {\n    var idGenerator     = options.idGenerator;\n    var getState        = options.stateHandler.getState;\n\n    /**\n     * Gets the resize detector id of the element.\n     * @public\n     * @param {element} element The target element to get the id of.\n     * @returns {string|number|null} The id of the element. Null if it has no id.\n     */\n    function getId(element) {\n        var state = getState(element);\n\n        if (state && state.id !== undefined) {\n            return state.id;\n        }\n\n        return null;\n    }\n\n    /**\n     * Sets the resize detector id of the element. Requires the element to have a resize detector state initialized.\n     * @public\n     * @param {element} element The target element to set the id of.\n     * @returns {string|number|null} The id of the element.\n     */\n    function setId(element) {\n        var state = getState(element);\n\n        if (!state) {\n            throw new Error(\"setId required the element to have a resize detection state.\");\n        }\n\n        var id = idGenerator.generate();\n\n        state.id = id;\n\n        return id;\n    }\n\n    return {\n        get: getId,\n        set: setId\n    };\n};\n\n\n/***/ }),\n\n/***/ \"50bf\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar utils = module.exports = {};\n\nutils.getOption = getOption;\n\nfunction getOption(options, name, defaultValue) {\n    var value = options[name];\n\n    if((value === undefined || value === null) && defaultValue !== undefined) {\n        return defaultValue;\n    }\n\n    return value;\n}\n\n\n/***/ }),\n\n/***/ \"520a\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar regexpFlags = __webpack_require__(\"0bfb\");\n\nvar nativeExec = RegExp.prototype.exec;\n// This always refers to the native implementation, because the\n// String#replace polyfill uses ./fix-regexp-well-known-symbol-logic.js,\n// which loads this file before patching the method.\nvar nativeReplace = String.prototype.replace;\n\nvar patchedExec = nativeExec;\n\nvar LAST_INDEX = 'lastIndex';\n\nvar UPDATES_LAST_INDEX_WRONG = (function () {\n  var re1 = /a/,\n      re2 = /b*/g;\n  nativeExec.call(re1, 'a');\n  nativeExec.call(re2, 'a');\n  return re1[LAST_INDEX] !== 0 || re2[LAST_INDEX] !== 0;\n})();\n\n// nonparticipating capturing group, copied from es5-shim's String#split patch.\nvar NPCG_INCLUDED = /()??/.exec('')[1] !== undefined;\n\nvar PATCH = UPDATES_LAST_INDEX_WRONG || NPCG_INCLUDED;\n\nif (PATCH) {\n  patchedExec = function exec(str) {\n    var re = this;\n    var lastIndex, reCopy, match, i;\n\n    if (NPCG_INCLUDED) {\n      reCopy = new RegExp('^' + re.source + '$(?!\\\\s)', regexpFlags.call(re));\n    }\n    if (UPDATES_LAST_INDEX_WRONG) lastIndex = re[LAST_INDEX];\n\n    match = nativeExec.call(re, str);\n\n    if (UPDATES_LAST_INDEX_WRONG && match) {\n      re[LAST_INDEX] = re.global ? match.index + match[0].length : lastIndex;\n    }\n    if (NPCG_INCLUDED && match && match.length > 1) {\n      // Fix browsers whose `exec` methods don't consistently return `undefined`\n      // for NPCG, like IE8. NOTE: This doesn' work for /(.?)?/\n      // eslint-disable-next-line no-loop-func\n      nativeReplace.call(match[0], reCopy, function () {\n        for (i = 1; i < arguments.length - 2; i++) {\n          if (arguments[i] === undefined) match[i] = undefined;\n        }\n      });\n    }\n\n    return match;\n  };\n}\n\nmodule.exports = patchedExec;\n\n\n/***/ }),\n\n/***/ \"52a7\":\n/***/ (function(module, exports) {\n\nexports.f = {}.propertyIsEnumerable;\n\n\n/***/ }),\n\n/***/ \"5537\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar core = __webpack_require__(\"8378\");\nvar global = __webpack_require__(\"7726\");\nvar SHARED = '__core-js_shared__';\nvar store = global[SHARED] || (global[SHARED] = {});\n\n(module.exports = function (key, value) {\n  return store[key] || (store[key] = value !== undefined ? value : {});\n})('versions', []).push({\n  version: core.version,\n  mode: __webpack_require__(\"2d00\") ? 'pure' : 'global',\n  copyright: '© 2020 Denis Pushkarev (zloirock.ru)'\n});\n\n\n/***/ }),\n\n/***/ \"55dd\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar $export = __webpack_require__(\"5ca1\");\nvar aFunction = __webpack_require__(\"d8e8\");\nvar toObject = __webpack_require__(\"4bf8\");\nvar fails = __webpack_require__(\"79e5\");\nvar $sort = [].sort;\nvar test = [1, 2, 3];\n\n$export($export.P + $export.F * (fails(function () {\n  // IE8-\n  test.sort(undefined);\n}) || !fails(function () {\n  // V8 bug\n  test.sort(null);\n  // Old WebKit\n}) || !__webpack_require__(\"2f21\")($sort)), 'Array', {\n  // 22.1.3.25 Array.prototype.sort(comparefn)\n  sort: function sort(comparefn) {\n    return comparefn === undefined\n      ? $sort.call(toObject(this))\n      : $sort.call(toObject(this), aFunction(comparefn));\n  }\n});\n\n\n/***/ }),\n\n/***/ \"5be5\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nmodule.exports = function(options) {\n    var getState = options.stateHandler.getState;\n\n    /**\n     * Tells if the element has been made detectable and ready to be listened for resize events.\n     * @public\n     * @param {element} The element to check.\n     * @returns {boolean} True or false depending on if the element is detectable or not.\n     */\n    function isDetectable(element) {\n        var state = getState(element);\n        return state && !!state.isDetectable;\n    }\n\n    /**\n     * Marks the element that it has been made detectable and ready to be listened for resize events.\n     * @public\n     * @param {element} The element to mark.\n     */\n    function markAsDetectable(element) {\n        getState(element).isDetectable = true;\n    }\n\n    /**\n     * Tells if the element is busy or not.\n     * @public\n     * @param {element} The element to check.\n     * @returns {boolean} True or false depending on if the element is busy or not.\n     */\n    function isBusy(element) {\n        return !!getState(element).busy;\n    }\n\n    /**\n     * Marks the object is busy and should not be made detectable.\n     * @public\n     * @param {element} element The element to mark.\n     * @param {boolean} busy If the element is busy or not.\n     */\n    function markBusy(element, busy) {\n        getState(element).busy = !!busy;\n    }\n\n    return {\n        isDetectable: isDetectable,\n        markAsDetectable: markAsDetectable,\n        isBusy: isBusy,\n        markBusy: markBusy\n    };\n};\n\n\n/***/ }),\n\n/***/ \"5ca1\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar global = __webpack_require__(\"7726\");\nvar core = __webpack_require__(\"8378\");\nvar hide = __webpack_require__(\"32e9\");\nvar redefine = __webpack_require__(\"2aba\");\nvar ctx = __webpack_require__(\"9b43\");\nvar PROTOTYPE = 'prototype';\n\nvar $export = function (type, name, source) {\n  var IS_FORCED = type & $export.F;\n  var IS_GLOBAL = type & $export.G;\n  var IS_STATIC = type & $export.S;\n  var IS_PROTO = type & $export.P;\n  var IS_BIND = type & $export.B;\n  var target = IS_GLOBAL ? global : IS_STATIC ? global[name] || (global[name] = {}) : (global[name] || {})[PROTOTYPE];\n  var exports = IS_GLOBAL ? core : core[name] || (core[name] = {});\n  var expProto = exports[PROTOTYPE] || (exports[PROTOTYPE] = {});\n  var key, own, out, exp;\n  if (IS_GLOBAL) source = name;\n  for (key in source) {\n    // contains in native\n    own = !IS_FORCED && target && target[key] !== undefined;\n    // export native or passed\n    out = (own ? target : source)[key];\n    // bind timers to global for call from export context\n    exp = IS_BIND && own ? ctx(out, global) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out;\n    // extend global\n    if (target) redefine(target, key, out, type & $export.U);\n    // export\n    if (exports[key] != out) hide(exports, key, exp);\n    if (IS_PROTO && expProto[key] != out) expProto[key] = out;\n  }\n};\nglobal.core = core;\n// type bitmap\n$export.F = 1;   // forced\n$export.G = 2;   // global\n$export.S = 4;   // static\n$export.P = 8;   // proto\n$export.B = 16;  // bind\n$export.W = 32;  // wrap\n$export.U = 64;  // safe\n$export.R = 128; // real proto method for `library`\nmodule.exports = $export;\n\n\n/***/ }),\n\n/***/ \"5dbc\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar isObject = __webpack_require__(\"d3f4\");\nvar setPrototypeOf = __webpack_require__(\"8b97\").set;\nmodule.exports = function (that, target, C) {\n  var S = target.constructor;\n  var P;\n  if (S !== C && typeof S == 'function' && (P = S.prototype) !== C.prototype && isObject(P) && setPrototypeOf) {\n    setPrototypeOf(that, P);\n  } return that;\n};\n\n\n/***/ }),\n\n/***/ \"5ed4\":\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var _node_modules_vue_style_loader_index_js_ref_6_oneOf_1_0_node_modules_css_loader_index_js_ref_6_oneOf_1_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_src_index_js_ref_6_oneOf_1_2_node_modules_postcss_loader_src_index_js_ref_6_oneOf_1_3_node_modules_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_lib_index_js_vue_loader_options_GridItem_vue_vue_type_style_index_0_lang_css___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(\"6e21\");\n/* harmony import */ var _node_modules_vue_style_loader_index_js_ref_6_oneOf_1_0_node_modules_css_loader_index_js_ref_6_oneOf_1_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_src_index_js_ref_6_oneOf_1_2_node_modules_postcss_loader_src_index_js_ref_6_oneOf_1_3_node_modules_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_lib_index_js_vue_loader_options_GridItem_vue_vue_type_style_index_0_lang_css___WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_vue_style_loader_index_js_ref_6_oneOf_1_0_node_modules_css_loader_index_js_ref_6_oneOf_1_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_src_index_js_ref_6_oneOf_1_2_node_modules_postcss_loader_src_index_js_ref_6_oneOf_1_3_node_modules_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_lib_index_js_vue_loader_options_GridItem_vue_vue_type_style_index_0_lang_css___WEBPACK_IMPORTED_MODULE_0__);\n/* unused harmony reexport * */\n\n\n/***/ }),\n\n/***/ \"5eda\":\n/***/ (function(module, exports, __webpack_require__) {\n\n// most Object methods by ES6 should accept primitives\nvar $export = __webpack_require__(\"5ca1\");\nvar core = __webpack_require__(\"8378\");\nvar fails = __webpack_require__(\"79e5\");\nmodule.exports = function (KEY, exec) {\n  var fn = (core.Object || {})[KEY] || Object[KEY];\n  var exp = {};\n  exp[KEY] = exec(fn);\n  $export($export.S + $export.F * fails(function () { fn(1); }), 'Object', exp);\n};\n\n\n/***/ }),\n\n/***/ \"5f1b\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar classof = __webpack_require__(\"23c6\");\nvar builtinExec = RegExp.prototype.exec;\n\n // `RegExpExec` abstract operation\n// https://tc39.github.io/ecma262/#sec-regexpexec\nmodule.exports = function (R, S) {\n  var exec = R.exec;\n  if (typeof exec === 'function') {\n    var result = exec.call(R, S);\n    if (typeof result !== 'object') {\n      throw new TypeError('RegExp exec method returned something other than an Object or null');\n    }\n    return result;\n  }\n  if (classof(R) !== 'RegExp') {\n    throw new TypeError('RegExp#exec called on incompatible receiver');\n  }\n  return builtinExec.call(R, S);\n};\n\n\n/***/ }),\n\n/***/ \"613b\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar shared = __webpack_require__(\"5537\")('keys');\nvar uid = __webpack_require__(\"ca5a\");\nmodule.exports = function (key) {\n  return shared[key] || (shared[key] = uid(key));\n};\n\n\n/***/ }),\n\n/***/ \"626a\":\n/***/ (function(module, exports, __webpack_require__) {\n\n// fallback for non-array-like ES3 and non-enumerable old V8 strings\nvar cof = __webpack_require__(\"2d95\");\n// eslint-disable-next-line no-prototype-builtins\nmodule.exports = Object('z').propertyIsEnumerable(0) ? Object : function (it) {\n  return cof(it) == 'String' ? it.split('') : Object(it);\n};\n\n\n/***/ }),\n\n/***/ \"6821\":\n/***/ (function(module, exports, __webpack_require__) {\n\n// to indexed object, toObject with fallback for non-array-like ES3 strings\nvar IObject = __webpack_require__(\"626a\");\nvar defined = __webpack_require__(\"be13\");\nmodule.exports = function (it) {\n  return IObject(defined(it));\n};\n\n\n/***/ }),\n\n/***/ \"69a8\":\n/***/ (function(module, exports) {\n\nvar hasOwnProperty = {}.hasOwnProperty;\nmodule.exports = function (it, key) {\n  return hasOwnProperty.call(it, key);\n};\n\n\n/***/ }),\n\n/***/ \"6a99\":\n/***/ (function(module, exports, __webpack_require__) {\n\n// 7.1.1 ToPrimitive(input [, PreferredType])\nvar isObject = __webpack_require__(\"d3f4\");\n// instead of the ES6 spec version, we didn't implement @@toPrimitive case\n// and the second argument - flag - preferred type is a string\nmodule.exports = function (it, S) {\n  if (!isObject(it)) return it;\n  var fn, val;\n  if (S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;\n  if (typeof (fn = it.valueOf) == 'function' && !isObject(val = fn.call(it))) return val;\n  if (!S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;\n  throw TypeError(\"Can't convert object to primitive value\");\n};\n\n\n/***/ }),\n\n/***/ \"6e21\":\n/***/ (function(module, exports, __webpack_require__) {\n\n// style-loader: Adds some css to the DOM by adding a <style> tag\n\n// load the styles\nvar content = __webpack_require__(\"9cbe\");\nif(typeof content === 'string') content = [[module.i, content, '']];\nif(content.locals) module.exports = content.locals;\n// add the styles to the DOM\nvar add = __webpack_require__(\"499e\").default\nvar update = add(\"3cbd0c21\", content, true, {\"sourceMap\":false,\"shadowMode\":false});\n\n/***/ }),\n\n/***/ \"7333\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n// 19.1.2.1 Object.assign(target, source, ...)\nvar DESCRIPTORS = __webpack_require__(\"9e1e\");\nvar getKeys = __webpack_require__(\"0d58\");\nvar gOPS = __webpack_require__(\"2621\");\nvar pIE = __webpack_require__(\"52a7\");\nvar toObject = __webpack_require__(\"4bf8\");\nvar IObject = __webpack_require__(\"626a\");\nvar $assign = Object.assign;\n\n// should work with symbols and should have deterministic property order (V8 bug)\nmodule.exports = !$assign || __webpack_require__(\"79e5\")(function () {\n  var A = {};\n  var B = {};\n  // eslint-disable-next-line no-undef\n  var S = Symbol();\n  var K = 'abcdefghijklmnopqrst';\n  A[S] = 7;\n  K.split('').forEach(function (k) { B[k] = k; });\n  return $assign({}, A)[S] != 7 || Object.keys($assign({}, B)).join('') != K;\n}) ? function assign(target, source) { // eslint-disable-line no-unused-vars\n  var T = toObject(target);\n  var aLen = arguments.length;\n  var index = 1;\n  var getSymbols = gOPS.f;\n  var isEnum = pIE.f;\n  while (aLen > index) {\n    var S = IObject(arguments[index++]);\n    var keys = getSymbols ? getKeys(S).concat(getSymbols(S)) : getKeys(S);\n    var length = keys.length;\n    var j = 0;\n    var key;\n    while (length > j) {\n      key = keys[j++];\n      if (!DESCRIPTORS || isEnum.call(S, key)) T[key] = S[key];\n    }\n  } return T;\n} : $assign;\n\n\n/***/ }),\n\n/***/ \"7726\":\n/***/ (function(module, exports) {\n\n// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\nvar global = module.exports = typeof window != 'undefined' && window.Math == Math\n  ? window : typeof self != 'undefined' && self.Math == Math ? self\n  // eslint-disable-next-line no-new-func\n  : Function('return this')();\nif (typeof __g == 'number') __g = global; // eslint-disable-line no-undef\n\n\n/***/ }),\n\n/***/ \"77f1\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar toInteger = __webpack_require__(\"4588\");\nvar max = Math.max;\nvar min = Math.min;\nmodule.exports = function (index, length) {\n  index = toInteger(index);\n  return index < 0 ? max(index + length, 0) : min(index, length);\n};\n\n\n/***/ }),\n\n/***/ \"79e5\":\n/***/ (function(module, exports) {\n\nmodule.exports = function (exec) {\n  try {\n    return !!exec();\n  } catch (e) {\n    return true;\n  }\n};\n\n\n/***/ }),\n\n/***/ \"7f20\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar def = __webpack_require__(\"86cc\").f;\nvar has = __webpack_require__(\"69a8\");\nvar TAG = __webpack_require__(\"2b4c\")('toStringTag');\n\nmodule.exports = function (it, tag, stat) {\n  if (it && !has(it = stat ? it : it.prototype, TAG)) def(it, TAG, { configurable: true, value: tag });\n};\n\n\n/***/ }),\n\n/***/ \"7f7f\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar dP = __webpack_require__(\"86cc\").f;\nvar FProto = Function.prototype;\nvar nameRE = /^\\s*function ([^ (]*)/;\nvar NAME = 'name';\n\n// 19.2.4.2 name\nNAME in FProto || __webpack_require__(\"9e1e\") && dP(FProto, NAME, {\n  configurable: true,\n  get: function () {\n    try {\n      return ('' + this).match(nameRE)[1];\n    } catch (e) {\n      return '';\n    }\n  }\n});\n\n\n/***/ }),\n\n/***/ \"8378\":\n/***/ (function(module, exports) {\n\nvar core = module.exports = { version: '2.6.12' };\nif (typeof __e == 'number') __e = core; // eslint-disable-line no-undef\n\n\n/***/ }),\n\n/***/ \"84f2\":\n/***/ (function(module, exports) {\n\nmodule.exports = {};\n\n\n/***/ }),\n\n/***/ \"86cc\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar anObject = __webpack_require__(\"cb7c\");\nvar IE8_DOM_DEFINE = __webpack_require__(\"c69a\");\nvar toPrimitive = __webpack_require__(\"6a99\");\nvar dP = Object.defineProperty;\n\nexports.f = __webpack_require__(\"9e1e\") ? Object.defineProperty : function defineProperty(O, P, Attributes) {\n  anObject(O);\n  P = toPrimitive(P, true);\n  anObject(Attributes);\n  if (IE8_DOM_DEFINE) try {\n    return dP(O, P, Attributes);\n  } catch (e) { /* empty */ }\n  if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported!');\n  if ('value' in Attributes) O[P] = Attributes.value;\n  return O;\n};\n\n\n/***/ }),\n\n/***/ \"8b97\":\n/***/ (function(module, exports, __webpack_require__) {\n\n// Works with __proto__ only. Old v8 can't work with null proto objects.\n/* eslint-disable no-proto */\nvar isObject = __webpack_require__(\"d3f4\");\nvar anObject = __webpack_require__(\"cb7c\");\nvar check = function (O, proto) {\n  anObject(O);\n  if (!isObject(proto) && proto !== null) throw TypeError(proto + \": can't set as prototype!\");\n};\nmodule.exports = {\n  set: Object.setPrototypeOf || ('__proto__' in {} ? // eslint-disable-line\n    function (test, buggy, set) {\n      try {\n        set = __webpack_require__(\"9b43\")(Function.call, __webpack_require__(\"11e9\").f(Object.prototype, '__proto__').set, 2);\n        set(test, []);\n        buggy = !(test instanceof Array);\n      } catch (e) { buggy = true; }\n      return function setPrototypeOf(O, proto) {\n        check(O, proto);\n        if (buggy) O.__proto__ = proto;\n        else set(O, proto);\n        return O;\n      };\n    }({}, false) : undefined),\n  check: check\n};\n\n\n/***/ }),\n\n/***/ \"8bbf\":\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"vue\");\n\n/***/ }),\n\n/***/ \"8e6e\":\n/***/ (function(module, exports, __webpack_require__) {\n\n// https://github.com/tc39/proposal-object-getownpropertydescriptors\nvar $export = __webpack_require__(\"5ca1\");\nvar ownKeys = __webpack_require__(\"990b\");\nvar toIObject = __webpack_require__(\"6821\");\nvar gOPD = __webpack_require__(\"11e9\");\nvar createProperty = __webpack_require__(\"f1ae\");\n\n$export($export.S, 'Object', {\n  getOwnPropertyDescriptors: function getOwnPropertyDescriptors(object) {\n    var O = toIObject(object);\n    var getDesc = gOPD.f;\n    var keys = ownKeys(O);\n    var result = {};\n    var i = 0;\n    var key, desc;\n    while (keys.length > i) {\n      desc = getDesc(O, key = keys[i++]);\n      if (desc !== undefined) createProperty(result, key, desc);\n    }\n    return result;\n  }\n});\n\n\n/***/ }),\n\n/***/ \"9093\":\n/***/ (function(module, exports, __webpack_require__) {\n\n// 19.1.2.7 / 15.2.3.4 Object.getOwnPropertyNames(O)\nvar $keys = __webpack_require__(\"ce10\");\nvar hiddenKeys = __webpack_require__(\"e11e\").concat('length', 'prototype');\n\nexports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {\n  return $keys(O, hiddenKeys);\n};\n\n\n/***/ }),\n\n/***/ \"97a7\":\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return getBreakpointFromWidth; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"c\", function() { return getColsFromBreakpoint; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return findOrGenerateResponsiveLayout; });\n/* unused harmony export generateResponsiveLayout */\n/* unused harmony export sortBreakpoints */\n/* harmony import */ var core_js_modules_es6_array_sort__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(\"55dd\");\n/* harmony import */ var core_js_modules_es6_array_sort__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es6_array_sort__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var core_js_modules_web_dom_iterable__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(\"ac6a\");\n/* harmony import */ var core_js_modules_web_dom_iterable__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_web_dom_iterable__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var core_js_modules_es6_array_iterator__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(\"cadf\");\n/* harmony import */ var core_js_modules_es6_array_iterator__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es6_array_iterator__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var core_js_modules_es6_object_keys__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(\"456d\");\n/* harmony import */ var core_js_modules_es6_object_keys__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es6_object_keys__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(\"a2b6\");\n\n\n\n\n// @flow\n\n\n/*:: import type {Layout} from './utils';*/\n\n/*:: export type ResponsiveLayout = {lg?: Layout, md?: Layout, sm?: Layout, xs?: Layout, xxs?: Layout};*/\n\n/*:: type Breakpoint = string;*/\n\n/**\n * Given a width, find the highest breakpoint that matches is valid for it (width > breakpoint).\n *\n * @param  {Object} breakpoints Breakpoints object (e.g. {lg: 1200, md: 960, ...})\n * @param  {Number} width Screen width.\n * @return {String}       Highest breakpoint that is less than width.\n */\n\n/*:: type Breakpoints = {lg?: number, md?: number, sm?: number, xs?: number, xxs?: number};*/\n\nfunction getBreakpointFromWidth(breakpoints\n/*: Breakpoints*/\n, width\n/*: number*/\n)\n/*: Breakpoint*/\n{\n  var sorted = sortBreakpoints(breakpoints);\n  var matching = sorted[0];\n\n  for (var i = 1, len = sorted.length; i < len; i++) {\n    var breakpointName = sorted[i];\n    if (width > breakpoints[breakpointName]) matching = breakpointName;\n  }\n\n  return matching;\n}\n/**\n * Given a breakpoint, get the # of cols set for it.\n * @param  {String} breakpoint Breakpoint name.\n * @param  {Object} cols       Map of breakpoints to cols.\n * @return {Number}            Number of cols.\n */\n\nfunction getColsFromBreakpoint(breakpoint\n/*: Breakpoint*/\n, cols\n/*: Breakpoints*/\n)\n/*: number*/\n{\n  if (!cols[breakpoint]) {\n    throw new Error(\"ResponsiveGridLayout: `cols` entry for breakpoint \" + breakpoint + \" is missing!\");\n  }\n\n  return cols[breakpoint];\n}\n/**\n * Given existing layouts and a new breakpoint, find or generate a new layout.\n *\n * This finds the layout above the new one and generates from it, if it exists.\n *\n * @param  {Array} orgLayout     Original layout.\n * @param  {Object} layouts     Existing layouts.\n * @param  {Array} breakpoints All breakpoints.\n * @param  {String} breakpoint New breakpoint.\n * @param  {String} breakpoint Last breakpoint (for fallback).\n * @param  {Number} cols       Column count at new breakpoint.\n * @param  {Boolean} verticalCompact Whether or not to compact the layout\n *   vertically.\n * @return {Array}             New layout.\n */\n\nfunction findOrGenerateResponsiveLayout(orgLayout\n/*: Layout*/\n, layouts\n/*: ResponsiveLayout*/\n, breakpoints\n/*: Breakpoints*/\n, breakpoint\n/*: Breakpoint*/\n, lastBreakpoint\n/*: Breakpoint*/\n, cols\n/*: number*/\n, verticalCompact\n/*: boolean*/\n)\n/*: Layout*/\n{\n  // If it already exists, just return it.\n  if (layouts[breakpoint]) return Object(_utils__WEBPACK_IMPORTED_MODULE_4__[/* cloneLayout */ \"b\"])(layouts[breakpoint]); // Find or generate the next layout\n\n  var layout = orgLayout;\n  var breakpointsSorted = sortBreakpoints(breakpoints);\n  var breakpointsAbove = breakpointsSorted.slice(breakpointsSorted.indexOf(breakpoint));\n\n  for (var i = 0, len = breakpointsAbove.length; i < len; i++) {\n    var b = breakpointsAbove[i];\n\n    if (layouts[b]) {\n      layout = layouts[b];\n      break;\n    }\n  }\n\n  layout = Object(_utils__WEBPACK_IMPORTED_MODULE_4__[/* cloneLayout */ \"b\"])(layout || []); // clone layout so we don't modify existing items\n\n  return Object(_utils__WEBPACK_IMPORTED_MODULE_4__[/* compact */ \"c\"])(Object(_utils__WEBPACK_IMPORTED_MODULE_4__[/* correctBounds */ \"d\"])(layout, {\n    cols: cols\n  }), verticalCompact);\n}\nfunction generateResponsiveLayout(layout\n/*: Layout*/\n, breakpoints\n/*: Breakpoints*/\n, breakpoint\n/*: Breakpoint*/\n, lastBreakpoint\n/*: Breakpoint*/\n, cols\n/*: number*/\n, verticalCompact\n/*: boolean*/\n)\n/*: Layout*/\n{\n  // If it already exists, just return it.\n\n  /*if (layouts[breakpoint]) return cloneLayout(layouts[breakpoint]);\n  // Find or generate the next layout\n  let layout = layouts[lastBreakpoint];*/\n\n  /*const breakpointsSorted = sortBreakpoints(breakpoints);\n  const breakpointsAbove = breakpointsSorted.slice(breakpointsSorted.indexOf(breakpoint));\n  for (let i = 0, len = breakpointsAbove.length; i < len; i++) {\n  const b = breakpointsAbove[i];\n  if (layouts[b]) {\n    layout = layouts[b];\n    break;\n  }\n  }*/\n  layout = Object(_utils__WEBPACK_IMPORTED_MODULE_4__[/* cloneLayout */ \"b\"])(layout || []); // clone layout so we don't modify existing items\n\n  return Object(_utils__WEBPACK_IMPORTED_MODULE_4__[/* compact */ \"c\"])(Object(_utils__WEBPACK_IMPORTED_MODULE_4__[/* correctBounds */ \"d\"])(layout, {\n    cols: cols\n  }), verticalCompact);\n}\n/**\n * Given breakpoints, return an array of breakpoints sorted by width. This is usually\n * e.g. ['xxs', 'xs', 'sm', ...]\n *\n * @param  {Object} breakpoints Key/value pair of breakpoint names to widths.\n * @return {Array}              Sorted breakpoints.\n */\n\nfunction sortBreakpoints(breakpoints\n/*: Breakpoints*/\n)\n/*: Array<Breakpoint>*/\n{\n  var keys\n  /*: Array<string>*/\n  = Object.keys(breakpoints);\n  return keys.sort(function (a, b) {\n    return breakpoints[a] - breakpoints[b];\n  });\n}\n\n/***/ }),\n\n/***/ \"990b\":\n/***/ (function(module, exports, __webpack_require__) {\n\n// all object keys, includes non-enumerable and symbols\nvar gOPN = __webpack_require__(\"9093\");\nvar gOPS = __webpack_require__(\"2621\");\nvar anObject = __webpack_require__(\"cb7c\");\nvar Reflect = __webpack_require__(\"7726\").Reflect;\nmodule.exports = Reflect && Reflect.ownKeys || function ownKeys(it) {\n  var keys = gOPN.f(anObject(it));\n  var getSymbols = gOPS.f;\n  return getSymbols ? keys.concat(getSymbols(it)) : keys;\n};\n\n\n/***/ }),\n\n/***/ \"9b43\":\n/***/ (function(module, exports, __webpack_require__) {\n\n// optional / simple context binding\nvar aFunction = __webpack_require__(\"d8e8\");\nmodule.exports = function (fn, that, length) {\n  aFunction(fn);\n  if (that === undefined) return fn;\n  switch (length) {\n    case 1: return function (a) {\n      return fn.call(that, a);\n    };\n    case 2: return function (a, b) {\n      return fn.call(that, a, b);\n    };\n    case 3: return function (a, b, c) {\n      return fn.call(that, a, b, c);\n    };\n  }\n  return function (/* ...args */) {\n    return fn.apply(that, arguments);\n  };\n};\n\n\n/***/ }),\n\n/***/ \"9c6c\":\n/***/ (function(module, exports, __webpack_require__) {\n\n// 22.1.3.31 Array.prototype[@@unscopables]\nvar UNSCOPABLES = __webpack_require__(\"2b4c\")('unscopables');\nvar ArrayProto = Array.prototype;\nif (ArrayProto[UNSCOPABLES] == undefined) __webpack_require__(\"32e9\")(ArrayProto, UNSCOPABLES, {});\nmodule.exports = function (key) {\n  ArrayProto[UNSCOPABLES][key] = true;\n};\n\n\n/***/ }),\n\n/***/ \"9cbe\":\n/***/ (function(module, exports, __webpack_require__) {\n\nexports = module.exports = __webpack_require__(\"2350\")(false);\n// imports\n\n\n// module\nexports.push([module.i, \".vue-grid-item{-webkit-transition:all .2s ease;transition:all .2s ease;-webkit-transition-property:left,top,right;transition-property:left,top,right}.vue-grid-item.no-touch{-ms-touch-action:none;touch-action:none}.vue-grid-item.cssTransforms{-webkit-transition-property:-webkit-transform;transition-property:-webkit-transform;transition-property:transform;transition-property:transform,-webkit-transform;left:0;right:auto}.vue-grid-item.cssTransforms.render-rtl{left:auto;right:0}.vue-grid-item.resizing{opacity:.6;z-index:3}.vue-grid-item.vue-draggable-dragging{-webkit-transition:none;transition:none;z-index:3}.vue-grid-item.vue-grid-placeholder{background:red;opacity:.2;-webkit-transition-duration:.1s;transition-duration:.1s;z-index:2;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;user-select:none}.vue-grid-item>.vue-resizable-handle{position:absolute;width:20px;height:20px;bottom:0;right:0;background:url(\\\"data:image/svg+xml;base64,PHN2ZyBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjojZmZmZmZmMDAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjYiIGhlaWdodD0iNiI+PHBhdGggZD0iTTYgNkgwVjQuMmg0LjJWMEg2djZ6IiBvcGFjaXR5PSIuMzAyIi8+PC9zdmc+\\\");background-position:100% 100%;padding:0 3px 3px 0;background-repeat:no-repeat;background-origin:content-box;-webkit-box-sizing:border-box;box-sizing:border-box;cursor:se-resize}.vue-grid-item>.vue-rtl-resizable-handle{bottom:0;left:0;background:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAiIGhlaWdodD0iMTAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZmlsbD0ibm9uZSIgZD0iTS0xLTFoMTJ2MTJILTF6Ii8+PGc+PHBhdGggc3Ryb2tlLWxpbmVjYXA9InVuZGVmaW5lZCIgc3Ryb2tlLWxpbmVqb2luPSJ1bmRlZmluZWQiIHN0cm9rZS13aWR0aD0iMS41IiBzdHJva2U9IiMwMDAiIGZpbGw9Im5vbmUiIGQ9Ik0xNDQuODIxLTM4LjM5M2wtMjAuMzU3LTMxLjc4NSIvPjxwYXRoIHN0cm9rZT0iIzY2NiIgc3Ryb2tlLWxpbmVjYXA9InVuZGVmaW5lZCIgc3Ryb2tlLWxpbmVqb2luPSJ1bmRlZmluZWQiIHN0cm9rZS13aWR0aD0iMiIgZmlsbD0ibm9uZSIgZD0iTS45NDctLjAxOHY5LjEyNU0tLjY1NiA5aDEwLjczIi8+PC9nPjwvc3ZnPg==);background-position:0 100%;padding-left:3px;background-repeat:no-repeat;background-origin:content-box;cursor:sw-resize;right:auto}.vue-grid-item.disable-userselect{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}\", \"\"]);\n\n// exports\n\n\n/***/ }),\n\n/***/ \"9def\":\n/***/ (function(module, exports, __webpack_require__) {\n\n// 7.1.15 ToLength\nvar toInteger = __webpack_require__(\"4588\");\nvar min = Math.min;\nmodule.exports = function (it) {\n  return it > 0 ? min(toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991\n};\n\n\n/***/ }),\n\n/***/ \"9e1e\":\n/***/ (function(module, exports, __webpack_require__) {\n\n// Thank's IE8 for his funny defineProperty\nmodule.exports = !__webpack_require__(\"79e5\")(function () {\n  return Object.defineProperty({}, 'a', { get: function () { return 7; } }).a != 7;\n});\n\n\n/***/ }),\n\n/***/ \"a2b6\":\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return bottom; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return cloneLayout; });\n/* unused harmony export cloneLayoutItem */\n/* unused harmony export collides */\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"c\", function() { return compact; });\n/* unused harmony export compactItem */\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"d\", function() { return correctBounds; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"f\", function() { return getLayoutItem; });\n/* unused harmony export getFirstCollision */\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"e\", function() { return getAllCollisions; });\n/* unused harmony export getStatics */\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"g\", function() { return moveElement; });\n/* unused harmony export moveElementAwayFromCollision */\n/* unused harmony export perc */\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"j\", function() { return setTransform; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"k\", function() { return setTransformRtl; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"h\", function() { return setTopLeft; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"i\", function() { return setTopRight; });\n/* unused harmony export sortLayoutItemsByRowCol */\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"l\", function() { return validateLayout; });\n/* unused harmony export autoBindHandlers */\n/* unused harmony export createMarkup */\n/* unused harmony export IS_UNITLESS */\n/* unused harmony export addPx */\n/* unused harmony export hyphenateRE */\n/* unused harmony export hyphenate */\n/* unused harmony export findItemInArray */\n/* unused harmony export findAndRemove */\n/* harmony import */ var core_js_modules_es6_regexp_replace__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(\"a481\");\n/* harmony import */ var core_js_modules_es6_regexp_replace__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es6_regexp_replace__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var core_js_modules_es6_array_iterator__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(\"cadf\");\n/* harmony import */ var core_js_modules_es6_array_iterator__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es6_array_iterator__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var core_js_modules_es6_object_keys__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(\"456d\");\n/* harmony import */ var core_js_modules_es6_object_keys__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es6_object_keys__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var core_js_modules_web_dom_iterable__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(\"ac6a\");\n/* harmony import */ var core_js_modules_web_dom_iterable__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_web_dom_iterable__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var core_js_modules_es6_array_sort__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(\"55dd\");\n/* harmony import */ var core_js_modules_es6_array_sort__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es6_array_sort__WEBPACK_IMPORTED_MODULE_4__);\n\n\n\n\n\n// @flow\n\n/*:: export type LayoutItemRequired = {w: number, h: number, x: number, y: number, i: string};*/\n\n/*:: export type LayoutItem = LayoutItemRequired &\n                         {minW?: number, minH?: number, maxW?: number, maxH?: number,\n                          moved?: boolean, static?: boolean,\n                          isDraggable?: ?boolean, isResizable?: ?boolean};*/\n\n// export type Position = {left: number, top: number, width: number, height: number};\n\n/*\nexport type DragCallbackData = {\n  node: HTMLElement,\n  x: number, y: number,\n  deltaX: number, deltaY: number,\n  lastX: number, lastY: number\n};\n*/\n// export type DragEvent = {e: Event} & DragCallbackData;\n\n/*:: export type Layout = Array<LayoutItem>;*/\n\n// export type ResizeEvent = {e: Event, node: HTMLElement, size: Size};\n// const isProduction = process.env.NODE_ENV === 'production';\n\n/**\n * Return the bottom coordinate of the layout.\n *\n * @param  {Array} layout Layout array.\n * @return {Number}       Bottom coordinate.\n */\n\n/*:: export type Size = {width: number, height: number};*/\n\nfunction bottom(layout\n/*: Layout*/\n)\n/*: number*/\n{\n  var max = 0,\n      bottomY;\n\n  for (var i = 0, len = layout.length; i < len; i++) {\n    bottomY = layout[i].y + layout[i].h;\n    if (bottomY > max) max = bottomY;\n  }\n\n  return max;\n}\nfunction cloneLayout(layout\n/*: Layout*/\n)\n/*: Layout*/\n{\n  var newLayout = Array(layout.length);\n\n  for (var i = 0, len = layout.length; i < len; i++) {\n    newLayout[i] = cloneLayoutItem(layout[i]);\n  }\n\n  return newLayout;\n} // Fast path to cloning, since this is monomorphic\n\nfunction cloneLayoutItem(layoutItem\n/*: LayoutItem*/\n)\n/*: LayoutItem*/\n{\n  /*return {\n    w: layoutItem.w, h: layoutItem.h, x: layoutItem.x, y: layoutItem.y, i: layoutItem.i,\n    minW: layoutItem.minW, maxW: layoutItem.maxW, minH: layoutItem.minH, maxH: layoutItem.maxH,\n    moved: Boolean(layoutItem.moved), static: Boolean(layoutItem.static),\n    // These can be null\n    isDraggable: layoutItem.isDraggable, isResizable: layoutItem.isResizable\n  };*/\n  return JSON.parse(JSON.stringify(layoutItem));\n}\n/**\n * Given two layoutitems, check if they collide.\n *\n * @return {Boolean}   True if colliding.\n */\n\nfunction collides(l1\n/*: LayoutItem*/\n, l2\n/*: LayoutItem*/\n)\n/*: boolean*/\n{\n  if (l1 === l2) return false; // same element\n\n  if (l1.x + l1.w <= l2.x) return false; // l1 is left of l2\n\n  if (l1.x >= l2.x + l2.w) return false; // l1 is right of l2\n\n  if (l1.y + l1.h <= l2.y) return false; // l1 is above l2\n\n  if (l1.y >= l2.y + l2.h) return false; // l1 is below l2\n\n  return true; // boxes overlap\n}\n/**\n * Given a layout, compact it. This involves going down each y coordinate and removing gaps\n * between items.\n *\n * @param  {Array} layout Layout.\n * @param  {Boolean} verticalCompact Whether or not to compact the layout\n *   vertically.\n * @param {Object} minPositions\n * @return {Array}       Compacted Layout.\n */\n\nfunction compact(layout\n/*: Layout*/\n, verticalCompact\n/*: Boolean*/\n, minPositions)\n/*: Layout*/\n{\n  // Statics go in the compareWith array right away so items flow around them.\n  var compareWith = getStatics(layout); // We go through the items by row and column.\n\n  var sorted = sortLayoutItemsByRowCol(layout); // Holding for new items.\n\n  var out = Array(layout.length);\n\n  for (var i = 0, len = sorted.length; i < len; i++) {\n    var l = sorted[i]; // Don't move static elements\n\n    if (!l.static) {\n      l = compactItem(compareWith, l, verticalCompact, minPositions); // Add to comparison array. We only collide with items before this one.\n      // Statics are already in this array.\n\n      compareWith.push(l);\n    } // Add to output array to make sure they still come out in the right order.\n\n\n    out[layout.indexOf(l)] = l; // Clear moved flag, if it exists.\n\n    l.moved = false;\n  }\n\n  return out;\n}\n/**\n * Compact an item in the layout.\n */\n\nfunction compactItem(compareWith\n/*: Layout*/\n, l\n/*: LayoutItem*/\n, verticalCompact\n/*: boolean*/\n, minPositions)\n/*: LayoutItem*/\n{\n  if (verticalCompact) {\n    // Move the element up as far as it can go without colliding.\n    while (l.y > 0 && !getFirstCollision(compareWith, l)) {\n      l.y--;\n    }\n  } else if (minPositions) {\n    var minY = minPositions[l.i].y;\n\n    while (l.y > minY && !getFirstCollision(compareWith, l)) {\n      l.y--;\n    }\n  } // Move it down, and keep moving it down if it's colliding.\n\n\n  var collides;\n\n  while (collides = getFirstCollision(compareWith, l)) {\n    l.y = collides.y + collides.h;\n  }\n\n  return l;\n}\n/**\n * Given a layout, make sure all elements fit within its bounds.\n *\n * @param  {Array} layout Layout array.\n * @param  {Number} bounds Number of columns.\n */\n\nfunction correctBounds(layout\n/*: Layout*/\n, bounds\n/*: {cols: number}*/\n)\n/*: Layout*/\n{\n  var collidesWith = getStatics(layout);\n\n  for (var i = 0, len = layout.length; i < len; i++) {\n    var l = layout[i]; // Overflows right\n\n    if (l.x + l.w > bounds.cols) l.x = bounds.cols - l.w; // Overflows left\n\n    if (l.x < 0) {\n      l.x = 0;\n      l.w = bounds.cols;\n    }\n\n    if (!l.static) collidesWith.push(l);else {\n      // If this is static and collides with other statics, we must move it down.\n      // We have to do something nicer than just letting them overlap.\n      while (getFirstCollision(collidesWith, l)) {\n        l.y++;\n      }\n    }\n  }\n\n  return layout;\n}\n/**\n * Get a layout item by ID. Used so we can override later on if necessary.\n *\n * @param  {Array}  layout Layout array.\n * @param  {String} id     ID\n * @return {LayoutItem}    Item at ID.\n */\n\nfunction getLayoutItem(layout\n/*: Layout*/\n, id\n/*: string*/\n)\n/*: ?LayoutItem*/\n{\n  for (var i = 0, len = layout.length; i < len; i++) {\n    if (layout[i].i === id) return layout[i];\n  }\n}\n/**\n * Returns the first item this layout collides with.\n * It doesn't appear to matter which order we approach this from, although\n * perhaps that is the wrong thing to do.\n *\n * @param  {Object} layoutItem Layout item.\n * @return {Object|undefined}  A colliding layout item, or undefined.\n */\n\nfunction getFirstCollision(layout\n/*: Layout*/\n, layoutItem\n/*: LayoutItem*/\n)\n/*: ?LayoutItem*/\n{\n  for (var i = 0, len = layout.length; i < len; i++) {\n    if (collides(layout[i], layoutItem)) return layout[i];\n  }\n}\nfunction getAllCollisions(layout\n/*: Layout*/\n, layoutItem\n/*: LayoutItem*/\n)\n/*: Array<LayoutItem>*/\n{\n  return layout.filter(function (l) {\n    return collides(l, layoutItem);\n  });\n}\n/**\n * Get all static elements.\n * @param  {Array} layout Array of layout objects.\n * @return {Array}        Array of static layout items..\n */\n\nfunction getStatics(layout\n/*: Layout*/\n)\n/*: Array<LayoutItem>*/\n{\n  //return [];\n  return layout.filter(function (l) {\n    return l.static;\n  });\n}\n/**\n * Move an element. Responsible for doing cascading movements of other elements.\n *\n * @param  {Array}      layout Full layout to modify.\n * @param  {LayoutItem} l      element to move.\n * @param  {Number}     [x]    X position in grid units.\n * @param  {Number}     [y]    Y position in grid units.\n * @param  {Boolean}    [isUserAction] If true, designates that the item we're moving is\n *                                     being dragged/resized by th euser.\n */\n\nfunction moveElement(layout\n/*: Layout*/\n, l\n/*: LayoutItem*/\n, x\n/*: Number*/\n, y\n/*: Number*/\n, isUserAction\n/*: Boolean*/\n, preventCollision\n/*: Boolean*/\n)\n/*: Layout*/\n{\n  if (l.static) return layout; // Short-circuit if nothing to do.\n  //if (l.y === y && l.x === x) return layout;\n\n  var oldX = l.x;\n  var oldY = l.y;\n  var movingUp = y && l.y > y; // This is quite a bit faster than extending the object\n\n  if (typeof x === 'number') l.x = x;\n  if (typeof y === 'number') l.y = y;\n  l.moved = true; // If this collides with anything, move it.\n  // When doing this comparison, we have to sort the items we compare with\n  // to ensure, in the case of multiple collisions, that we're getting the\n  // nearest collision.\n\n  var sorted = sortLayoutItemsByRowCol(layout);\n  if (movingUp) sorted = sorted.reverse();\n  var collisions = getAllCollisions(sorted, l);\n\n  if (preventCollision && collisions.length) {\n    l.x = oldX;\n    l.y = oldY;\n    l.moved = false;\n    return layout;\n  } // Move each item that collides away from this element.\n\n\n  for (var i = 0, len = collisions.length; i < len; i++) {\n    var collision = collisions[i]; // console.log('resolving collision between', l.i, 'at', l.y, 'and', collision.i, 'at', collision.y);\n    // Short circuit so we can't infinite loop\n\n    if (collision.moved) continue; // This makes it feel a bit more precise by waiting to swap for just a bit when moving up.\n\n    if (l.y > collision.y && l.y - collision.y > collision.h / 4) continue; // Don't move static items - we have to move *this* element away\n\n    if (collision.static) {\n      layout = moveElementAwayFromCollision(layout, collision, l, isUserAction);\n    } else {\n      layout = moveElementAwayFromCollision(layout, l, collision, isUserAction);\n    }\n  }\n\n  return layout;\n}\n/**\n * This is where the magic needs to happen - given a collision, move an element away from the collision.\n * We attempt to move it up if there's room, otherwise it goes below.\n *\n * @param  {Array} layout            Full layout to modify.\n * @param  {LayoutItem} collidesWith Layout item we're colliding with.\n * @param  {LayoutItem} itemToMove   Layout item we're moving.\n * @param  {Boolean} [isUserAction]  If true, designates that the item we're moving is being dragged/resized\n *                                   by the user.\n */\n\nfunction moveElementAwayFromCollision(layout\n/*: Layout*/\n, collidesWith\n/*: LayoutItem*/\n, itemToMove\n/*: LayoutItem*/\n, isUserAction\n/*: ?boolean*/\n)\n/*: Layout*/\n{\n  var preventCollision = false; // we're already colliding\n  // If there is enough space above the collision to put this element, move it there.\n  // We only do this on the main collision as this can get funky in cascades and cause\n  // unwanted swapping behavior.\n\n  if (isUserAction) {\n    // Make a mock item so we don't modify the item here, only modify in moveElement.\n    var fakeItem\n    /*: LayoutItem*/\n    = {\n      x: itemToMove.x,\n      y: itemToMove.y,\n      w: itemToMove.w,\n      h: itemToMove.h,\n      i: '-1'\n    };\n    fakeItem.y = Math.max(collidesWith.y - itemToMove.h, 0);\n\n    if (!getFirstCollision(layout, fakeItem)) {\n      return moveElement(layout, itemToMove, undefined, fakeItem.y, preventCollision);\n    }\n  } // Previously this was optimized to move below the collision directly, but this can cause problems\n  // with cascading moves, as an item may actually leapflog a collision and cause a reversal in order.\n\n\n  return moveElement(layout, itemToMove, undefined, itemToMove.y + 1, preventCollision);\n}\n/**\n * Helper to convert a number to a percentage string.\n *\n * @param  {Number} num Any number\n * @return {String}     That number as a percentage.\n */\n\nfunction perc(num\n/*: number*/\n)\n/*: string*/\n{\n  return num * 100 + '%';\n}\nfunction setTransform(top, left, width, height)\n/*: Object*/\n{\n  // Replace unitless items with px\n  var translate = \"translate3d(\" + left + \"px,\" + top + \"px, 0)\";\n  return {\n    transform: translate,\n    WebkitTransform: translate,\n    MozTransform: translate,\n    msTransform: translate,\n    OTransform: translate,\n    width: width + \"px\",\n    height: height + \"px\",\n    position: 'absolute'\n  };\n}\n/**\n * Just like the setTransform method, but instead it will return a negative value of right.\n *\n * @param top\n * @param right\n * @param width\n * @param height\n * @returns {{transform: string, WebkitTransform: string, MozTransform: string, msTransform: string, OTransform: string, width: string, height: string, position: string}}\n */\n\nfunction setTransformRtl(top, right, width, height)\n/*: Object*/\n{\n  // Replace unitless items with px\n  var translate = \"translate3d(\" + right * -1 + \"px,\" + top + \"px, 0)\";\n  return {\n    transform: translate,\n    WebkitTransform: translate,\n    MozTransform: translate,\n    msTransform: translate,\n    OTransform: translate,\n    width: width + \"px\",\n    height: height + \"px\",\n    position: 'absolute'\n  };\n}\nfunction setTopLeft(top, left, width, height)\n/*: Object*/\n{\n  return {\n    top: top + \"px\",\n    left: left + \"px\",\n    width: width + \"px\",\n    height: height + \"px\",\n    position: 'absolute'\n  };\n}\n/**\n * Just like the setTopLeft method, but instead, it will return a right property instead of left.\n *\n * @param top\n * @param right\n * @param width\n * @param height\n * @returns {{top: string, right: string, width: string, height: string, position: string}}\n */\n\nfunction setTopRight(top, right, width, height)\n/*: Object*/\n{\n  return {\n    top: top + \"px\",\n    right: right + \"px\",\n    width: width + \"px\",\n    height: height + \"px\",\n    position: 'absolute'\n  };\n}\n/**\n * Get layout items sorted from top left to right and down.\n *\n * @return {Array} Array of layout objects.\n * @return {Array}        Layout, sorted static items first.\n */\n\nfunction sortLayoutItemsByRowCol(layout\n/*: Layout*/\n)\n/*: Layout*/\n{\n  return [].concat(layout).sort(function (a, b) {\n    if (a.y === b.y && a.x === b.x) {\n      return 0;\n    }\n\n    if (a.y > b.y || a.y === b.y && a.x > b.x) {\n      return 1;\n    }\n\n    return -1;\n  });\n}\n/**\n * Generate a layout using the initialLayout and children as a template.\n * Missing entries will be added, extraneous ones will be truncated.\n *\n * @param  {Array}  initialLayout Layout passed in through props.\n * @param  {String} breakpoint    Current responsive breakpoint.\n * @param  {Boolean} verticalCompact Whether or not to compact the layout vertically.\n * @return {Array}                Working layout.\n */\n\n/*\nexport function synchronizeLayoutWithChildren(initialLayout: Layout, children: Array<React.Element>|React.Element,\n                                              cols: number, verticalCompact: boolean): Layout {\n  // ensure 'children' is always an array\n  if (!Array.isArray(children)) {\n    children = [children];\n  }\n  initialLayout = initialLayout || [];\n\n  // Generate one layout item per child.\n  let layout: Layout = [];\n  for (let i = 0, len = children.length; i < len; i++) {\n    let newItem;\n    const child = children[i];\n\n    // Don't overwrite if it already exists.\n    const exists = getLayoutItem(initialLayout, child.key || \"1\" /!* FIXME satisfies Flow *!/);\n    if (exists) {\n      newItem = exists;\n    } else {\n      const g = child.props._grid;\n\n      // Hey, this item has a _grid property, use it.\n      if (g) {\n        if (!isProduction) {\n          validateLayout([g], 'ReactGridLayout.children');\n        }\n        // Validated; add it to the layout. Bottom 'y' possible is the bottom of the layout.\n        // This allows you to do nice stuff like specify {y: Infinity}\n        if (verticalCompact) {\n          newItem = cloneLayoutItem({...g, y: Math.min(bottom(layout), g.y), i: child.key});\n        } else {\n          newItem = cloneLayoutItem({...g, y: g.y, i: child.key});\n        }\n      }\n      // Nothing provided: ensure this is added to the bottom\n      else {\n        newItem = cloneLayoutItem({w: 1, h: 1, x: 0, y: bottom(layout), i: child.key || \"1\"});\n      }\n    }\n    layout[i] = newItem;\n  }\n\n  // Correct the layout.\n  layout = correctBounds(layout, {cols: cols});\n  layout = compact(layout, verticalCompact);\n\n  return layout;\n}\n*/\n\n/**\n * Validate a layout. Throws errors.\n *\n * @param  {Array}  layout        Array of layout items.\n * @param  {String} [contextName] Context name for errors.\n * @throw  {Error}                Validation error.\n */\n\nfunction validateLayout(layout\n/*: Layout*/\n, contextName\n/*: string*/\n)\n/*: void*/\n{\n  contextName = contextName || \"Layout\";\n  var subProps = ['x', 'y', 'w', 'h'];\n  var keyArr = [];\n  if (!Array.isArray(layout)) throw new Error(contextName + \" must be an array!\");\n\n  for (var i = 0, len = layout.length; i < len; i++) {\n    var item = layout[i];\n\n    for (var j = 0; j < subProps.length; j++) {\n      if (typeof item[subProps[j]] !== 'number') {\n        throw new Error('VueGridLayout: ' + contextName + '[' + i + '].' + subProps[j] + ' must be a number!');\n      }\n    }\n\n    if (item.i === undefined || item.i === null) {\n      throw new Error('VueGridLayout: ' + contextName + '[' + i + '].i cannot be null!');\n    }\n\n    if (typeof item.i !== 'number' && typeof item.i !== 'string') {\n      throw new Error('VueGridLayout: ' + contextName + '[' + i + '].i must be a string or number!');\n    }\n\n    if (keyArr.indexOf(item.i) >= 0) {\n      throw new Error('VueGridLayout: ' + contextName + '[' + i + '].i must be unique!');\n    }\n\n    keyArr.push(item.i);\n\n    if (item.static !== undefined && typeof item.static !== 'boolean') {\n      throw new Error('VueGridLayout: ' + contextName + '[' + i + '].static must be a boolean!');\n    }\n  }\n} // Flow can't really figure this out, so we just use Object\n\nfunction autoBindHandlers(el\n/*: Object*/\n, fns\n/*: Array<string>*/\n)\n/*: void*/\n{\n  fns.forEach(function (key) {\n    return el[key] = el[key].bind(el);\n  });\n}\n/**\n * Convert a JS object to CSS string. Similar to React's output of CSS.\n * @param obj\n * @returns {string}\n */\n\nfunction createMarkup(obj) {\n  var keys = Object.keys(obj);\n  if (!keys.length) return '';\n  var i,\n      len = keys.length;\n  var result = '';\n\n  for (i = 0; i < len; i++) {\n    var key = keys[i];\n    var val = obj[key];\n    result += hyphenate(key) + ':' + addPx(key, val) + ';';\n  }\n\n  return result;\n}\n/* The following list is defined in React's core */\n\nvar IS_UNITLESS = {\n  animationIterationCount: true,\n  boxFlex: true,\n  boxFlexGroup: true,\n  boxOrdinalGroup: true,\n  columnCount: true,\n  flex: true,\n  flexGrow: true,\n  flexPositive: true,\n  flexShrink: true,\n  flexNegative: true,\n  flexOrder: true,\n  gridRow: true,\n  gridColumn: true,\n  fontWeight: true,\n  lineClamp: true,\n  lineHeight: true,\n  opacity: true,\n  order: true,\n  orphans: true,\n  tabSize: true,\n  widows: true,\n  zIndex: true,\n  zoom: true,\n  // SVG-related properties\n  fillOpacity: true,\n  stopOpacity: true,\n  strokeDashoffset: true,\n  strokeOpacity: true,\n  strokeWidth: true\n};\n/**\n * Will add px to the end of style values which are Numbers.\n * @param name\n * @param value\n * @returns {*}\n */\n\nfunction addPx(name, value) {\n  if (typeof value === 'number' && !IS_UNITLESS[name]) {\n    return value + 'px';\n  } else {\n    return value;\n  }\n}\n/**\n * Hyphenate a camelCase string.\n *\n * @param {String} str\n * @return {String}\n */\n\nvar hyphenateRE = /([a-z\\d])([A-Z])/g;\nfunction hyphenate(str) {\n  return str.replace(hyphenateRE, '$1-$2').toLowerCase();\n}\nfunction findItemInArray(array, property, value) {\n  for (var i = 0; i < array.length; i++) {\n    if (array[i][property] == value) return true;\n  }\n\n  return false;\n}\nfunction findAndRemove(array, property, value) {\n  array.forEach(function (result, index) {\n    if (result[property] === value) {\n      //Remove from array\n      array.splice(index, 1);\n    }\n  });\n}\n\n/***/ }),\n\n/***/ \"a481\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar anObject = __webpack_require__(\"cb7c\");\nvar toObject = __webpack_require__(\"4bf8\");\nvar toLength = __webpack_require__(\"9def\");\nvar toInteger = __webpack_require__(\"4588\");\nvar advanceStringIndex = __webpack_require__(\"0390\");\nvar regExpExec = __webpack_require__(\"5f1b\");\nvar max = Math.max;\nvar min = Math.min;\nvar floor = Math.floor;\nvar SUBSTITUTION_SYMBOLS = /\\$([$&`']|\\d\\d?|<[^>]*>)/g;\nvar SUBSTITUTION_SYMBOLS_NO_NAMED = /\\$([$&`']|\\d\\d?)/g;\n\nvar maybeToString = function (it) {\n  return it === undefined ? it : String(it);\n};\n\n// @@replace logic\n__webpack_require__(\"214f\")('replace', 2, function (defined, REPLACE, $replace, maybeCallNative) {\n  return [\n    // `String.prototype.replace` method\n    // https://tc39.github.io/ecma262/#sec-string.prototype.replace\n    function replace(searchValue, replaceValue) {\n      var O = defined(this);\n      var fn = searchValue == undefined ? undefined : searchValue[REPLACE];\n      return fn !== undefined\n        ? fn.call(searchValue, O, replaceValue)\n        : $replace.call(String(O), searchValue, replaceValue);\n    },\n    // `RegExp.prototype[@@replace]` method\n    // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@replace\n    function (regexp, replaceValue) {\n      var res = maybeCallNative($replace, regexp, this, replaceValue);\n      if (res.done) return res.value;\n\n      var rx = anObject(regexp);\n      var S = String(this);\n      var functionalReplace = typeof replaceValue === 'function';\n      if (!functionalReplace) replaceValue = String(replaceValue);\n      var global = rx.global;\n      if (global) {\n        var fullUnicode = rx.unicode;\n        rx.lastIndex = 0;\n      }\n      var results = [];\n      while (true) {\n        var result = regExpExec(rx, S);\n        if (result === null) break;\n        results.push(result);\n        if (!global) break;\n        var matchStr = String(result[0]);\n        if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode);\n      }\n      var accumulatedResult = '';\n      var nextSourcePosition = 0;\n      for (var i = 0; i < results.length; i++) {\n        result = results[i];\n        var matched = String(result[0]);\n        var position = max(min(toInteger(result.index), S.length), 0);\n        var captures = [];\n        // NOTE: This is equivalent to\n        //   captures = result.slice(1).map(maybeToString)\n        // but for some reason `nativeSlice.call(result, 1, result.length)` (called in\n        // the slice polyfill when slicing native arrays) \"doesn't work\" in safari 9 and\n        // causes a crash (https://pastebin.com/N21QzeQA) when trying to debug it.\n        for (var j = 1; j < result.length; j++) captures.push(maybeToString(result[j]));\n        var namedCaptures = result.groups;\n        if (functionalReplace) {\n          var replacerArgs = [matched].concat(captures, position, S);\n          if (namedCaptures !== undefined) replacerArgs.push(namedCaptures);\n          var replacement = String(replaceValue.apply(undefined, replacerArgs));\n        } else {\n          replacement = getSubstitution(matched, S, position, captures, namedCaptures, replaceValue);\n        }\n        if (position >= nextSourcePosition) {\n          accumulatedResult += S.slice(nextSourcePosition, position) + replacement;\n          nextSourcePosition = position + matched.length;\n        }\n      }\n      return accumulatedResult + S.slice(nextSourcePosition);\n    }\n  ];\n\n    // https://tc39.github.io/ecma262/#sec-getsubstitution\n  function getSubstitution(matched, str, position, captures, namedCaptures, replacement) {\n    var tailPos = position + matched.length;\n    var m = captures.length;\n    var symbols = SUBSTITUTION_SYMBOLS_NO_NAMED;\n    if (namedCaptures !== undefined) {\n      namedCaptures = toObject(namedCaptures);\n      symbols = SUBSTITUTION_SYMBOLS;\n    }\n    return $replace.call(replacement, symbols, function (match, ch) {\n      var capture;\n      switch (ch.charAt(0)) {\n        case '$': return '$';\n        case '&': return matched;\n        case '`': return str.slice(0, position);\n        case \"'\": return str.slice(tailPos);\n        case '<':\n          capture = namedCaptures[ch.slice(1, -1)];\n          break;\n        default: // \\d\\d?\n          var n = +ch;\n          if (n === 0) return match;\n          if (n > m) {\n            var f = floor(n / 10);\n            if (f === 0) return match;\n            if (f <= m) return captures[f - 1] === undefined ? ch.charAt(1) : captures[f - 1] + ch.charAt(1);\n            return match;\n          }\n          capture = captures[n - 1];\n      }\n      return capture === undefined ? '' : capture;\n    });\n  }\n});\n\n\n/***/ }),\n\n/***/ \"aa77\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar $export = __webpack_require__(\"5ca1\");\nvar defined = __webpack_require__(\"be13\");\nvar fails = __webpack_require__(\"79e5\");\nvar spaces = __webpack_require__(\"fdef\");\nvar space = '[' + spaces + ']';\nvar non = '\\u200b\\u0085';\nvar ltrim = RegExp('^' + space + space + '*');\nvar rtrim = RegExp(space + space + '*$');\n\nvar exporter = function (KEY, exec, ALIAS) {\n  var exp = {};\n  var FORCE = fails(function () {\n    return !!spaces[KEY]() || non[KEY]() != non;\n  });\n  var fn = exp[KEY] = FORCE ? exec(trim) : spaces[KEY];\n  if (ALIAS) exp[ALIAS] = fn;\n  $export($export.P + $export.F * FORCE, 'String', exp);\n};\n\n// 1 -> String#trimLeft\n// 2 -> String#trimRight\n// 3 -> String#trim\nvar trim = exporter.trim = function (string, TYPE) {\n  string = String(defined(string));\n  if (TYPE & 1) string = string.replace(ltrim, '');\n  if (TYPE & 2) string = string.replace(rtrim, '');\n  return string;\n};\n\nmodule.exports = exporter;\n\n\n/***/ }),\n\n/***/ \"abb4\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\n/* global console: false */\n\n/**\n * Reporter that handles the reporting of logs, warnings and errors.\n * @public\n * @param {boolean} quiet Tells if the reporter should be quiet or not.\n */\nmodule.exports = function(quiet) {\n    function noop() {\n        //Does nothing.\n    }\n\n    var reporter = {\n        log: noop,\n        warn: noop,\n        error: noop\n    };\n\n    if(!quiet && window.console) {\n        var attachFunction = function(reporter, name) {\n            //The proxy is needed to be able to call the method with the console context,\n            //since we cannot use bind.\n            reporter[name] = function reporterProxy() {\n                var f = console[name];\n                if (f.apply) { //IE9 does not support console.log.apply :)\n                    f.apply(console, arguments);\n                } else {\n                    for (var i = 0; i < arguments.length; i++) {\n                        f(arguments[i]);\n                    }\n                }\n            };\n        };\n\n        attachFunction(reporter, \"log\");\n        attachFunction(reporter, \"warn\");\n        attachFunction(reporter, \"error\");\n    }\n\n    return reporter;\n};\n\n/***/ }),\n\n/***/ \"ac6a\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar $iterators = __webpack_require__(\"cadf\");\nvar getKeys = __webpack_require__(\"0d58\");\nvar redefine = __webpack_require__(\"2aba\");\nvar global = __webpack_require__(\"7726\");\nvar hide = __webpack_require__(\"32e9\");\nvar Iterators = __webpack_require__(\"84f2\");\nvar wks = __webpack_require__(\"2b4c\");\nvar ITERATOR = wks('iterator');\nvar TO_STRING_TAG = wks('toStringTag');\nvar ArrayValues = Iterators.Array;\n\nvar DOMIterables = {\n  CSSRuleList: true, // TODO: Not spec compliant, should be false.\n  CSSStyleDeclaration: false,\n  CSSValueList: false,\n  ClientRectList: false,\n  DOMRectList: false,\n  DOMStringList: false,\n  DOMTokenList: true,\n  DataTransferItemList: false,\n  FileList: false,\n  HTMLAllCollection: false,\n  HTMLCollection: false,\n  HTMLFormElement: false,\n  HTMLSelectElement: false,\n  MediaList: true, // TODO: Not spec compliant, should be false.\n  MimeTypeArray: false,\n  NamedNodeMap: false,\n  NodeList: true,\n  PaintRequestList: false,\n  Plugin: false,\n  PluginArray: false,\n  SVGLengthList: false,\n  SVGNumberList: false,\n  SVGPathSegList: false,\n  SVGPointList: false,\n  SVGStringList: false,\n  SVGTransformList: false,\n  SourceBufferList: false,\n  StyleSheetList: true, // TODO: Not spec compliant, should be false.\n  TextTrackCueList: false,\n  TextTrackList: false,\n  TouchList: false\n};\n\nfor (var collections = getKeys(DOMIterables), i = 0; i < collections.length; i++) {\n  var NAME = collections[i];\n  var explicit = DOMIterables[NAME];\n  var Collection = global[NAME];\n  var proto = Collection && Collection.prototype;\n  var key;\n  if (proto) {\n    if (!proto[ITERATOR]) hide(proto, ITERATOR, ArrayValues);\n    if (!proto[TO_STRING_TAG]) hide(proto, TO_STRING_TAG, NAME);\n    Iterators[NAME] = ArrayValues;\n    if (explicit) for (key in $iterators) if (!proto[key]) redefine(proto, key, $iterators[key], true);\n  }\n}\n\n\n/***/ }),\n\n/***/ \"ad20\":\n/***/ (function(module, exports, __webpack_require__) {\n\nexports = module.exports = __webpack_require__(\"2350\")(false);\n// imports\n\n\n// module\nexports.push([module.i, \".vue-grid-layout{position:relative;-webkit-transition:height .2s ease;transition:height .2s ease}\", \"\"]);\n\n// exports\n\n\n/***/ }),\n\n/***/ \"ade3\":\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return _defineProperty; });\nfunction _defineProperty(obj, key, value) {\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\n  return obj;\n}\n\n/***/ }),\n\n/***/ \"b0c5\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar regexpExec = __webpack_require__(\"520a\");\n__webpack_require__(\"5ca1\")({\n  target: 'RegExp',\n  proto: true,\n  forced: regexpExec !== /./.exec\n}, {\n  exec: regexpExec\n});\n\n\n/***/ }),\n\n/***/ \"b770\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar utils = module.exports = {};\n\n/**\n * Loops through the collection and calls the callback for each element. if the callback returns truthy, the loop is broken and returns the same value.\n * @public\n * @param {*} collection The collection to loop through. Needs to have a length property set and have indices set from 0 to length - 1.\n * @param {function} callback The callback to be called for each element. The element will be given as a parameter to the callback. If this callback returns truthy, the loop is broken and the same value is returned.\n * @returns {*} The value that a callback has returned (if truthy). Otherwise nothing.\n */\nutils.forEach = function(collection, callback) {\n    for(var i = 0; i < collection.length; i++) {\n        var result = callback(collection[i]);\n        if(result) {\n            return result;\n        }\n    }\n};\n\n\n/***/ }),\n\n/***/ \"bc21\":\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n\n// NAMESPACE OBJECT: ./node_modules/@interactjs/snappers/all.js\nvar all_namespaceObject = {};\n__webpack_require__.r(all_namespaceObject);\n__webpack_require__.d(all_namespaceObject, \"edgeTarget\", function() { return edgeTarget; });\n__webpack_require__.d(all_namespaceObject, \"elements\", function() { return snappers_elements; });\n__webpack_require__.d(all_namespaceObject, \"grid\", function() { return grid; });\n\n// CONCATENATED MODULE: ./node_modules/cache-loader/dist/cjs.js?{\"cacheDirectory\":\"node_modules/.cache/vue-loader\",\"cacheIdentifier\":\"1705dc22-vue-loader-template\"}!./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options!./src/components/GridItem.vue?vue&type=template&id=e7489122&\nvar render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{ref:\"item\",staticClass:\"vue-grid-item\",class:_vm.classObj,style:(_vm.style)},[_vm._t(\"default\"),(_vm.resizableAndNotStatic)?_c('span',{ref:\"handle\",class:_vm.resizableHandleClass}):_vm._e()],2)}\nvar staticRenderFns = []\n\n\n// CONCATENATED MODULE: ./src/components/GridItem.vue?vue&type=template&id=e7489122&\n\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es7.object.get-own-property-descriptors.js\nvar es7_object_get_own_property_descriptors = __webpack_require__(\"8e6e\");\n\n// EXTERNAL MODULE: ./node_modules/core-js/modules/web.dom.iterable.js\nvar web_dom_iterable = __webpack_require__(\"ac6a\");\n\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es6.array.iterator.js\nvar es6_array_iterator = __webpack_require__(\"cadf\");\n\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es6.object.keys.js\nvar es6_object_keys = __webpack_require__(\"456d\");\n\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es6.regexp.replace.js\nvar es6_regexp_replace = __webpack_require__(\"a481\");\n\n// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/esm/defineProperty.js\nvar defineProperty = __webpack_require__(\"ade3\");\n\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es6.number.is-finite.js\nvar es6_number_is_finite = __webpack_require__(\"fca0\");\n\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es6.regexp.match.js\nvar es6_regexp_match = __webpack_require__(\"4917\");\n\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es6.number.constructor.js\nvar es6_number_constructor = __webpack_require__(\"c5f6\");\n\n// EXTERNAL MODULE: ./src/helpers/utils.js\nvar utils = __webpack_require__(\"a2b6\");\n\n// CONCATENATED MODULE: ./src/helpers/draggableUtils.js\n// Get {x, y} positions from event.\nfunction getControlPosition(e) {\n  return offsetXYFromParentOf(e);\n} // Get from offsetParent\n\nfunction offsetXYFromParentOf(evt) {\n  var offsetParent = evt.target.offsetParent || document.body;\n  var offsetParentRect = evt.offsetParent === document.body ? {\n    left: 0,\n    top: 0\n  } : offsetParent.getBoundingClientRect();\n  var x = evt.clientX + offsetParent.scrollLeft - offsetParentRect.left;\n  var y = evt.clientY + offsetParent.scrollTop - offsetParentRect.top;\n  /*const x = Math.round(evt.clientX + offsetParent.scrollLeft - offsetParentRect.left);\n  const y = Math.round(evt.clientY + offsetParent.scrollTop - offsetParentRect.top);*/\n\n  return {\n    x: x,\n    y: y\n  };\n} // Create an data object exposed by <DraggableCore>'s events\n\nfunction createCoreData(lastX, lastY, x, y) {\n  // State changes are often (but not always!) async. We want the latest value.\n  var isStart = !isNum(lastX);\n\n  if (isStart) {\n    // If this is our first move, use the x and y as last coords.\n    return {\n      deltaX: 0,\n      deltaY: 0,\n      lastX: x,\n      lastY: y,\n      x: x,\n      y: y\n    };\n  } else {\n    // Otherwise calculate proper values.\n    return {\n      deltaX: x - lastX,\n      deltaY: y - lastY,\n      lastX: lastX,\n      lastY: lastY,\n      x: x,\n      y: y\n    };\n  }\n}\n\nfunction isNum(num) {\n  return typeof num === 'number' && !isNaN(num);\n}\n// EXTERNAL MODULE: ./src/helpers/responsiveUtils.js\nvar responsiveUtils = __webpack_require__(\"97a7\");\n\n// EXTERNAL MODULE: ./src/helpers/DOM.js\nvar DOM = __webpack_require__(\"1ca7\");\n\n// CONCATENATED MODULE: ./node_modules/@interactjs/utils/domObjects.js\nconst domObjects = {\n  init,\n  document: null,\n  DocumentFragment: null,\n  SVGElement: null,\n  SVGSVGElement: null,\n  SVGElementInstance: null,\n  Element: null,\n  HTMLElement: null,\n  Event: null,\n  Touch: null,\n  PointerEvent: null\n};\n\nfunction blank() {}\n\n/* harmony default export */ var utils_domObjects = (domObjects);\n\nfunction init(window) {\n  const win = window;\n  domObjects.document = win.document;\n  domObjects.DocumentFragment = win.DocumentFragment || blank;\n  domObjects.SVGElement = win.SVGElement || blank;\n  domObjects.SVGSVGElement = win.SVGSVGElement || blank;\n  domObjects.SVGElementInstance = win.SVGElementInstance || blank;\n  domObjects.Element = win.Element || blank;\n  domObjects.HTMLElement = win.HTMLElement || domObjects.Element;\n  domObjects.Event = win.Event;\n  domObjects.Touch = win.Touch || blank;\n  domObjects.PointerEvent = win.PointerEvent || win.MSPointerEvent;\n}\n//# sourceMappingURL=domObjects.js.map\n// CONCATENATED MODULE: ./node_modules/@interactjs/utils/isWindow.js\n/* harmony default export */ var isWindow = (thing => !!(thing && thing.Window) && thing instanceof thing.Window);\n//# sourceMappingURL=isWindow.js.map\n// CONCATENATED MODULE: ./node_modules/@interactjs/utils/window.js\n\nlet realWindow = undefined;\nlet win = undefined;\n\nfunction window_init(window) {\n  // get wrapped window if using Shadow DOM polyfill\n  realWindow = window; // create a TextNode\n\n  const el = window.document.createTextNode(''); // check if it's wrapped by a polyfill\n\n  if (el.ownerDocument !== window.document && typeof window.wrap === 'function' && window.wrap(el) === el) {\n    // use wrapped window\n    window = window.wrap(window);\n  }\n\n  win = window;\n}\n\nif (typeof window !== 'undefined' && !!window) {\n  window_init(window);\n}\n\nfunction getWindow(node) {\n  if (isWindow(node)) {\n    return node;\n  }\n\n  const rootNode = node.ownerDocument || node;\n  return rootNode.defaultView || win.window;\n}\n//# sourceMappingURL=window.js.map\n// CONCATENATED MODULE: ./node_modules/@interactjs/utils/is.js\n\n\n\nconst is_window = thing => thing === win || isWindow(thing);\n\nconst docFrag = thing => object(thing) && thing.nodeType === 11;\n\nconst object = thing => !!thing && typeof thing === 'object';\n\nconst func = thing => typeof thing === 'function';\n\nconst number = thing => typeof thing === 'number';\n\nconst bool = thing => typeof thing === 'boolean';\n\nconst string = thing => typeof thing === 'string';\n\nconst is_element = thing => {\n  if (!thing || typeof thing !== 'object') {\n    return false;\n  } // eslint-disable-next-line import/no-named-as-default-member\n\n\n  const _window = getWindow(thing) || win;\n\n  return /object|function/.test(typeof _window.Element) ? thing instanceof _window.Element // DOM2\n  : thing.nodeType === 1 && typeof thing.nodeName === 'string';\n};\n\nconst plainObject = thing => object(thing) && !!thing.constructor && /function Object\\b/.test(thing.constructor.toString());\n\nconst array = thing => object(thing) && typeof thing.length !== 'undefined' && func(thing.splice);\n\n/* harmony default export */ var is = ({\n  window: is_window,\n  docFrag,\n  object,\n  func,\n  number,\n  bool,\n  string,\n  element: is_element,\n  plainObject,\n  array\n});\n//# sourceMappingURL=is.js.map\n// CONCATENATED MODULE: ./node_modules/@interactjs/utils/browser.js\n\n\n\nconst browser = {\n  init: browser_init,\n  supportsTouch: null,\n  supportsPointerEvent: null,\n  isIOS7: null,\n  isIOS: null,\n  isIe9: null,\n  isOperaMobile: null,\n  prefixedMatchesSelector: null,\n  pEventTypes: null,\n  wheelEvent: null\n};\n\nfunction browser_init(window) {\n  const Element = utils_domObjects.Element;\n  const navigator = win.navigator; // Does the browser support touch input?\n\n  browser.supportsTouch = 'ontouchstart' in window || is.func(window.DocumentTouch) && utils_domObjects.document instanceof window.DocumentTouch; // Does the browser support PointerEvents\n\n  browser.supportsPointerEvent = navigator.pointerEnabled !== false && !!utils_domObjects.PointerEvent;\n  browser.isIOS = /iP(hone|od|ad)/.test(navigator.platform); // scrolling doesn't change the result of getClientRects on iOS 7\n\n  browser.isIOS7 = /iP(hone|od|ad)/.test(navigator.platform) && /OS 7[^\\d]/.test(navigator.appVersion);\n  browser.isIe9 = /MSIE 9/.test(navigator.userAgent); // Opera Mobile must be handled differently\n\n  browser.isOperaMobile = navigator.appName === 'Opera' && browser.supportsTouch && /Presto/.test(navigator.userAgent); // prefix matchesSelector\n\n  browser.prefixedMatchesSelector = 'matches' in Element.prototype ? 'matches' : 'webkitMatchesSelector' in Element.prototype ? 'webkitMatchesSelector' : 'mozMatchesSelector' in Element.prototype ? 'mozMatchesSelector' : 'oMatchesSelector' in Element.prototype ? 'oMatchesSelector' : 'msMatchesSelector';\n  browser.pEventTypes = browser.supportsPointerEvent ? utils_domObjects.PointerEvent === window.MSPointerEvent ? {\n    up: 'MSPointerUp',\n    down: 'MSPointerDown',\n    over: 'mouseover',\n    out: 'mouseout',\n    move: 'MSPointerMove',\n    cancel: 'MSPointerCancel'\n  } : {\n    up: 'pointerup',\n    down: 'pointerdown',\n    over: 'pointerover',\n    out: 'pointerout',\n    move: 'pointermove',\n    cancel: 'pointercancel'\n  } : null; // because Webkit and Opera still use 'mousewheel' event type\n\n  browser.wheelEvent = 'onmousewheel' in utils_domObjects.document ? 'mousewheel' : 'wheel';\n}\n\n/* harmony default export */ var utils_browser = (browser);\n//# sourceMappingURL=browser.js.map\n// CONCATENATED MODULE: ./node_modules/@interactjs/utils/arr.js\nconst contains = (array, target) => array.indexOf(target) !== -1;\nconst arr_remove = (array, target) => array.splice(array.indexOf(target), 1);\nconst merge = (target, source) => {\n  for (const item of source) {\n    target.push(item);\n  }\n\n  return target;\n};\nconst from = source => merge([], source);\nconst findIndex = (array, func) => {\n  for (let i = 0; i < array.length; i++) {\n    if (func(array[i], i, array)) {\n      return i;\n    }\n  }\n\n  return -1;\n};\nconst find = (array, func) => array[findIndex(array, func)];\n//# sourceMappingURL=arr.js.map\n// CONCATENATED MODULE: ./node_modules/@interactjs/utils/clone.js\n\n // tslint:disable-next-line ban-types\n\nfunction clone(source) {\n  const dest = {};\n\n  for (const prop in source) {\n    const value = source[prop];\n\n    if (is.plainObject(value)) {\n      dest[prop] = clone(value);\n    } else if (is.array(value)) {\n      dest[prop] = from(value);\n    } else {\n      dest[prop] = value;\n    }\n  }\n\n  return dest;\n}\n//# sourceMappingURL=clone.js.map\n// CONCATENATED MODULE: ./node_modules/@interactjs/utils/extend.js\nfunction extend(dest, source) {\n  for (const prop in source) {\n    dest[prop] = source[prop];\n  }\n\n  const ret = dest;\n  return ret;\n}\n//# sourceMappingURL=extend.js.map\n// CONCATENATED MODULE: ./node_modules/@interactjs/utils/raf.js\nlet lastTime = 0;\nlet request;\nlet cancel;\n\nfunction raf_init(window) {\n  request = window.requestAnimationFrame;\n  cancel = window.cancelAnimationFrame;\n\n  if (!request) {\n    const vendors = ['ms', 'moz', 'webkit', 'o'];\n\n    for (const vendor of vendors) {\n      request = window[`${vendor}RequestAnimationFrame`];\n      cancel = window[`${vendor}CancelAnimationFrame`] || window[`${vendor}CancelRequestAnimationFrame`];\n    }\n  }\n\n  request = request && request.bind(window);\n  cancel = cancel && cancel.bind(window);\n\n  if (!request) {\n    request = callback => {\n      const currTime = Date.now();\n      const timeToCall = Math.max(0, 16 - (currTime - lastTime)); // eslint-disable-next-line node/no-callback-literal\n\n      const token = window.setTimeout(() => {\n        callback(currTime + timeToCall);\n      }, timeToCall);\n      lastTime = currTime + timeToCall;\n      return token;\n    };\n\n    cancel = token => clearTimeout(token);\n  }\n}\n\n/* harmony default export */ var raf = ({\n  request: callback => request(callback),\n  cancel: token => cancel(token),\n  init: raf_init\n});\n//# sourceMappingURL=raf.js.map\n// CONCATENATED MODULE: ./node_modules/@interactjs/utils/normalizeListeners.js\n\n\nfunction normalize(type, listeners, result) {\n  result = result || {};\n\n  if (is.string(type) && type.search(' ') !== -1) {\n    type = split(type);\n  }\n\n  if (is.array(type)) {\n    return type.reduce((acc, t) => extend(acc, normalize(t, listeners, result)), result);\n  } // ({ type: fn }) -> ('', { type: fn })\n\n\n  if (is.object(type)) {\n    listeners = type;\n    type = '';\n  }\n\n  if (is.func(listeners)) {\n    result[type] = result[type] || [];\n    result[type].push(listeners);\n  } else if (is.array(listeners)) {\n    for (const l of listeners) {\n      normalize(type, l, result);\n    }\n  } else if (is.object(listeners)) {\n    for (const prefix in listeners) {\n      const combinedTypes = split(prefix).map(p => `${type}${p}`);\n      normalize(combinedTypes, listeners[prefix], result);\n    }\n  }\n\n  return result;\n}\n\nfunction split(type) {\n  return type.trim().split(/ +/);\n}\n//# sourceMappingURL=normalizeListeners.js.map\n// CONCATENATED MODULE: ./node_modules/@interactjs/core/Eventable.js\n\n\n\n\nfunction fireUntilImmediateStopped(event, listeners) {\n  for (const listener of listeners) {\n    if (event.immediatePropagationStopped) {\n      break;\n    }\n\n    listener(event);\n  }\n}\n\nclass Eventable_Eventable {\n  constructor(options) {\n    this.options = void 0;\n    this.types = {};\n    this.propagationStopped = false;\n    this.immediatePropagationStopped = false;\n    this.global = void 0;\n    this.options = extend({}, options || {});\n  }\n\n  fire(event) {\n    let listeners;\n    const global = this.global; // Interactable#on() listeners\n    // tslint:disable no-conditional-assignment\n\n    if (listeners = this.types[event.type]) {\n      fireUntilImmediateStopped(event, listeners);\n    } // interact.on() listeners\n\n\n    if (!event.propagationStopped && global && (listeners = global[event.type])) {\n      fireUntilImmediateStopped(event, listeners);\n    }\n  }\n\n  on(type, listener) {\n    const listeners = normalize(type, listener);\n\n    for (type in listeners) {\n      this.types[type] = merge(this.types[type] || [], listeners[type]);\n    }\n  }\n\n  off(type, listener) {\n    const listeners = normalize(type, listener);\n\n    for (type in listeners) {\n      const eventList = this.types[type];\n\n      if (!eventList || !eventList.length) {\n        continue;\n      }\n\n      for (const subListener of listeners[type]) {\n        const index = eventList.indexOf(subListener);\n\n        if (index !== -1) {\n          eventList.splice(index, 1);\n        }\n      }\n    }\n  }\n\n  getRect(_element) {\n    return null;\n  }\n\n}\n//# sourceMappingURL=Eventable.js.map\n// CONCATENATED MODULE: ./node_modules/@interactjs/utils/domUtils.js\n\n\n\n\nfunction nodeContains(parent, child) {\n  if (parent.contains) {\n    return parent.contains(child);\n  }\n\n  while (child) {\n    if (child === parent) {\n      return true;\n    }\n\n    child = child.parentNode;\n  }\n\n  return false;\n}\nfunction domUtils_closest(element, selector) {\n  while (is.element(element)) {\n    if (matchesSelector(element, selector)) {\n      return element;\n    }\n\n    element = parentNode(element);\n  }\n\n  return null;\n}\nfunction parentNode(node) {\n  let parent = node.parentNode;\n\n  if (is.docFrag(parent)) {\n    // skip past #shado-root fragments\n    // tslint:disable-next-line\n    while ((parent = parent.host) && is.docFrag(parent)) {\n      continue;\n    }\n\n    return parent;\n  }\n\n  return parent;\n}\nfunction matchesSelector(element, selector) {\n  // remove /deep/ from selectors if shadowDOM polyfill is used\n  if (win !== realWindow) {\n    selector = selector.replace(/\\/deep\\//g, ' ');\n  }\n\n  return element[utils_browser.prefixedMatchesSelector](selector);\n}\n\nconst getParent = el => el.parentNode || el.host; // Test for the element that's \"above\" all other qualifiers\n\n\nfunction indexOfDeepestElement(elements) {\n  let deepestNodeParents = [];\n  let deepestNodeIndex;\n\n  for (let i = 0; i < elements.length; i++) {\n    const currentNode = elements[i];\n    const deepestNode = elements[deepestNodeIndex]; // node may appear in elements array multiple times\n\n    if (!currentNode || i === deepestNodeIndex) {\n      continue;\n    }\n\n    if (!deepestNode) {\n      deepestNodeIndex = i;\n      continue;\n    }\n\n    const currentNodeParent = getParent(currentNode);\n    const deepestNodeParent = getParent(deepestNode); // check if the deepest or current are document.documentElement/rootElement\n    // - if the current node is, do nothing and continue\n\n    if (currentNodeParent === currentNode.ownerDocument) {\n      continue;\n    } // - if deepest is, update with the current node and continue to next\n    else if (deepestNodeParent === currentNode.ownerDocument) {\n        deepestNodeIndex = i;\n        continue;\n      } // compare zIndex of siblings\n\n\n    if (currentNodeParent === deepestNodeParent) {\n      if (zIndexIsHigherThan(currentNode, deepestNode)) {\n        deepestNodeIndex = i;\n      }\n\n      continue;\n    } // populate the ancestry array for the latest deepest node\n\n\n    deepestNodeParents = deepestNodeParents.length ? deepestNodeParents : getNodeParents(deepestNode);\n    let ancestryStart; // if the deepest node is an HTMLElement and the current node is a non root svg element\n\n    if (deepestNode instanceof utils_domObjects.HTMLElement && currentNode instanceof utils_domObjects.SVGElement && !(currentNode instanceof utils_domObjects.SVGSVGElement)) {\n      // TODO: is this check necessary? Was this for HTML elements embedded in SVG?\n      if (currentNode === deepestNodeParent) {\n        continue;\n      }\n\n      ancestryStart = currentNode.ownerSVGElement;\n    } else {\n      ancestryStart = currentNode;\n    }\n\n    const currentNodeParents = getNodeParents(ancestryStart, deepestNode.ownerDocument);\n    let commonIndex = 0; // get (position of closest common ancestor) + 1\n\n    while (currentNodeParents[commonIndex] && currentNodeParents[commonIndex] === deepestNodeParents[commonIndex]) {\n      commonIndex++;\n    }\n\n    const parents = [currentNodeParents[commonIndex - 1], currentNodeParents[commonIndex], deepestNodeParents[commonIndex]];\n    let child = parents[0].lastChild;\n\n    while (child) {\n      if (child === parents[1]) {\n        deepestNodeIndex = i;\n        deepestNodeParents = currentNodeParents;\n        break;\n      } else if (child === parents[2]) {\n        break;\n      }\n\n      child = child.previousSibling;\n    }\n  }\n\n  return deepestNodeIndex;\n}\n\nfunction getNodeParents(node, limit) {\n  const parents = [];\n  let parent = node;\n  let parentParent;\n\n  while ((parentParent = getParent(parent)) && parent !== limit && parentParent !== parent.ownerDocument) {\n    parents.unshift(parent);\n    parent = parentParent;\n  }\n\n  return parents;\n}\n\nfunction zIndexIsHigherThan(higherNode, lowerNode) {\n  const higherIndex = parseInt(getWindow(higherNode).getComputedStyle(higherNode).zIndex, 10) || 0;\n  const lowerIndex = parseInt(getWindow(lowerNode).getComputedStyle(lowerNode).zIndex, 10) || 0;\n  return higherIndex >= lowerIndex;\n}\n\nfunction matchesUpTo(element, selector, limit) {\n  while (is.element(element)) {\n    if (matchesSelector(element, selector)) {\n      return true;\n    }\n\n    element = parentNode(element);\n\n    if (element === limit) {\n      return matchesSelector(element, selector);\n    }\n  }\n\n  return false;\n}\nfunction getActualElement(element) {\n  return element.correspondingUseElement || element;\n}\nfunction getScrollXY(relevantWindow) {\n  relevantWindow = relevantWindow || win;\n  return {\n    x: relevantWindow.scrollX || relevantWindow.document.documentElement.scrollLeft,\n    y: relevantWindow.scrollY || relevantWindow.document.documentElement.scrollTop\n  };\n}\nfunction getElementClientRect(element) {\n  const clientRect = element instanceof utils_domObjects.SVGElement ? element.getBoundingClientRect() : element.getClientRects()[0];\n  return clientRect && {\n    left: clientRect.left,\n    right: clientRect.right,\n    top: clientRect.top,\n    bottom: clientRect.bottom,\n    width: clientRect.width || clientRect.right - clientRect.left,\n    height: clientRect.height || clientRect.bottom - clientRect.top\n  };\n}\nfunction getElementRect(element) {\n  const clientRect = getElementClientRect(element);\n\n  if (!utils_browser.isIOS7 && clientRect) {\n    const scroll = getScrollXY(getWindow(element));\n    clientRect.left += scroll.x;\n    clientRect.right += scroll.x;\n    clientRect.top += scroll.y;\n    clientRect.bottom += scroll.y;\n  }\n\n  return clientRect;\n}\nfunction getPath(node) {\n  const path = [];\n\n  while (node) {\n    path.push(node);\n    node = parentNode(node);\n  }\n\n  return path;\n}\nfunction trySelector(value) {\n  if (!is.string(value)) {\n    return false;\n  } // an exception will be raised if it is invalid\n\n\n  utils_domObjects.document.querySelector(value);\n  return true;\n}\n//# sourceMappingURL=domUtils.js.map\n// CONCATENATED MODULE: ./node_modules/@interactjs/utils/rect.js\n\n\n\nfunction getStringOptionResult(value, target, element) {\n  if (value === 'parent') {\n    return parentNode(element);\n  }\n\n  if (value === 'self') {\n    return target.getRect(element);\n  }\n\n  return domUtils_closest(element, value);\n}\nfunction resolveRectLike(value, target, element, functionArgs) {\n  let returnValue = value;\n\n  if (is.string(returnValue)) {\n    returnValue = getStringOptionResult(returnValue, target, element);\n  } else if (is.func(returnValue)) {\n    returnValue = returnValue(...functionArgs);\n  }\n\n  if (is.element(returnValue)) {\n    returnValue = getElementRect(returnValue);\n  }\n\n  return returnValue;\n}\nfunction rectToXY(rect) {\n  return rect && {\n    x: 'x' in rect ? rect.x : rect.left,\n    y: 'y' in rect ? rect.y : rect.top\n  };\n}\nfunction xywhToTlbr(rect) {\n  if (rect && !('left' in rect && 'top' in rect)) {\n    rect = extend({}, rect);\n    rect.left = rect.x || 0;\n    rect.top = rect.y || 0;\n    rect.right = rect.right || rect.left + rect.width;\n    rect.bottom = rect.bottom || rect.top + rect.height;\n  }\n\n  return rect;\n}\nfunction tlbrToXywh(rect) {\n  if (rect && !('x' in rect && 'y' in rect)) {\n    rect = extend({}, rect);\n    rect.x = rect.left || 0;\n    rect.y = rect.top || 0;\n    rect.width = rect.width || (rect.right || 0) - rect.x;\n    rect.height = rect.height || (rect.bottom || 0) - rect.y;\n  }\n\n  return rect;\n}\nfunction addEdges(edges, rect, delta) {\n  if (edges.left) {\n    rect.left += delta.x;\n  }\n\n  if (edges.right) {\n    rect.right += delta.x;\n  }\n\n  if (edges.top) {\n    rect.top += delta.y;\n  }\n\n  if (edges.bottom) {\n    rect.bottom += delta.y;\n  }\n\n  rect.width = rect.right - rect.left;\n  rect.height = rect.bottom - rect.top;\n}\n//# sourceMappingURL=rect.js.map\n// CONCATENATED MODULE: ./node_modules/@interactjs/utils/getOriginXY.js\n\n/* harmony default export */ var getOriginXY = (function (target, element, actionName) {\n  const actionOptions = target.options[actionName];\n  const actionOrigin = actionOptions && actionOptions.origin;\n  const origin = actionOrigin || target.options.origin;\n  const originRect = resolveRectLike(origin, target, element, [target && element]);\n  return rectToXY(originRect) || {\n    x: 0,\n    y: 0\n  };\n});\n//# sourceMappingURL=getOriginXY.js.map\n// CONCATENATED MODULE: ./node_modules/@interactjs/utils/hypot.js\n/* harmony default export */ var hypot = ((x, y) => Math.sqrt(x * x + y * y));\n//# sourceMappingURL=hypot.js.map\n// CONCATENATED MODULE: ./node_modules/@interactjs/core/BaseEvent.js\nclass BaseEvent {\n  constructor(interaction) {\n    this.type = void 0;\n    this.target = void 0;\n    this.currentTarget = void 0;\n    this.interactable = void 0;\n    this._interaction = void 0;\n    this.timeStamp = void 0;\n    this.immediatePropagationStopped = false;\n    this.propagationStopped = false;\n    this._interaction = interaction;\n  }\n\n  preventDefault() {}\n  /**\n   * Don't call any other listeners (even on the current target)\n   */\n\n\n  stopPropagation() {\n    this.propagationStopped = true;\n  }\n  /**\n   * Don't call listeners on the remaining targets\n   */\n\n\n  stopImmediatePropagation() {\n    this.immediatePropagationStopped = this.propagationStopped = true;\n  }\n\n} // defined outside of class definition to avoid assignment of undefined during\n// construction\n\n// getters and setters defined here to support typescript 3.6 and below which\n// don't support getter and setters in .d.ts files\nObject.defineProperty(BaseEvent.prototype, 'interaction', {\n  get() {\n    return this._interaction._proxy;\n  },\n\n  set() {}\n\n});\n//# sourceMappingURL=BaseEvent.js.map\n// CONCATENATED MODULE: ./node_modules/@interactjs/core/defaultOptions.js\n// eslint-disable-next-line @typescript-eslint/no-empty-interface\n// export interface Options extends BaseDefaults, PerActionDefaults {}\nconst defaultOptions_defaults = {\n  base: {\n    preventDefault: 'auto',\n    deltaSource: 'page'\n  },\n  perAction: {\n    enabled: false,\n    origin: {\n      x: 0,\n      y: 0\n    }\n  },\n  actions: {}\n};\n//# sourceMappingURL=defaultOptions.js.map\n// CONCATENATED MODULE: ./node_modules/@interactjs/core/InteractEvent.js\n\n\n\n\n\nclass InteractEvent_InteractEvent extends BaseEvent {\n  // resize\n\n  /** */\n  constructor(interaction, event, actionName, phase, element, preEnd, type) {\n    super(interaction);\n    this.target = void 0;\n    this.currentTarget = void 0;\n    this.relatedTarget = null;\n    this.screenX = void 0;\n    this.screenY = void 0;\n    this.button = void 0;\n    this.buttons = void 0;\n    this.ctrlKey = void 0;\n    this.shiftKey = void 0;\n    this.altKey = void 0;\n    this.metaKey = void 0;\n    this.page = void 0;\n    this.client = void 0;\n    this.delta = void 0;\n    this.rect = void 0;\n    this.x0 = void 0;\n    this.y0 = void 0;\n    this.t0 = void 0;\n    this.dt = void 0;\n    this.duration = void 0;\n    this.clientX0 = void 0;\n    this.clientY0 = void 0;\n    this.velocity = void 0;\n    this.speed = void 0;\n    this.swipe = void 0;\n    this.timeStamp = void 0;\n    this.axes = void 0;\n    this.preEnd = void 0;\n    element = element || interaction.element;\n    const target = interaction.interactable;\n    const deltaSource = (target && target.options || defaultOptions_defaults).deltaSource;\n    const origin = getOriginXY(target, element, actionName);\n    const starting = phase === 'start';\n    const ending = phase === 'end';\n    const prevEvent = starting ? this : interaction.prevEvent;\n    const coords = starting ? interaction.coords.start : ending ? {\n      page: prevEvent.page,\n      client: prevEvent.client,\n      timeStamp: interaction.coords.cur.timeStamp\n    } : interaction.coords.cur;\n    this.page = extend({}, coords.page);\n    this.client = extend({}, coords.client);\n    this.rect = extend({}, interaction.rect);\n    this.timeStamp = coords.timeStamp;\n\n    if (!ending) {\n      this.page.x -= origin.x;\n      this.page.y -= origin.y;\n      this.client.x -= origin.x;\n      this.client.y -= origin.y;\n    }\n\n    this.ctrlKey = event.ctrlKey;\n    this.altKey = event.altKey;\n    this.shiftKey = event.shiftKey;\n    this.metaKey = event.metaKey;\n    this.button = event.button;\n    this.buttons = event.buttons;\n    this.target = element;\n    this.currentTarget = element;\n    this.preEnd = preEnd;\n    this.type = type || actionName + (phase || '');\n    this.interactable = target;\n    this.t0 = starting ? interaction.pointers[interaction.pointers.length - 1].downTime : prevEvent.t0;\n    this.x0 = interaction.coords.start.page.x - origin.x;\n    this.y0 = interaction.coords.start.page.y - origin.y;\n    this.clientX0 = interaction.coords.start.client.x - origin.x;\n    this.clientY0 = interaction.coords.start.client.y - origin.y;\n\n    if (starting || ending) {\n      this.delta = {\n        x: 0,\n        y: 0\n      };\n    } else {\n      this.delta = {\n        x: this[deltaSource].x - prevEvent[deltaSource].x,\n        y: this[deltaSource].y - prevEvent[deltaSource].y\n      };\n    }\n\n    this.dt = interaction.coords.delta.timeStamp;\n    this.duration = this.timeStamp - this.t0; // velocity and speed in pixels per second\n\n    this.velocity = extend({}, interaction.coords.velocity[deltaSource]);\n    this.speed = hypot(this.velocity.x, this.velocity.y);\n    this.swipe = ending || phase === 'inertiastart' ? this.getSwipe() : null;\n  }\n\n  getSwipe() {\n    const interaction = this._interaction;\n\n    if (interaction.prevEvent.speed < 600 || this.timeStamp - interaction.prevEvent.timeStamp > 150) {\n      return null;\n    }\n\n    let angle = 180 * Math.atan2(interaction.prevEvent.velocityY, interaction.prevEvent.velocityX) / Math.PI;\n    const overlap = 22.5;\n\n    if (angle < 0) {\n      angle += 360;\n    }\n\n    const left = 135 - overlap <= angle && angle < 225 + overlap;\n    const up = 225 - overlap <= angle && angle < 315 + overlap;\n    const right = !left && (315 - overlap <= angle || angle < 45 + overlap);\n    const down = !up && 45 - overlap <= angle && angle < 135 + overlap;\n    return {\n      up,\n      down,\n      left,\n      right,\n      angle,\n      speed: interaction.prevEvent.speed,\n      velocity: {\n        x: interaction.prevEvent.velocityX,\n        y: interaction.prevEvent.velocityY\n      }\n    };\n  }\n\n  preventDefault() {}\n  /**\n   * Don't call listeners on the remaining targets\n   */\n\n\n  stopImmediatePropagation() {\n    this.immediatePropagationStopped = this.propagationStopped = true;\n  }\n  /**\n   * Don't call any other listeners (even on the current target)\n   */\n\n\n  stopPropagation() {\n    this.propagationStopped = true;\n  }\n\n} // getters and setters defined here to support typescript 3.6 and below which\n// don't support getter and setters in .d.ts files\n\nObject.defineProperties(InteractEvent_InteractEvent.prototype, {\n  pageX: {\n    get() {\n      return this.page.x;\n    },\n\n    set(value) {\n      this.page.x = value;\n    }\n\n  },\n  pageY: {\n    get() {\n      return this.page.y;\n    },\n\n    set(value) {\n      this.page.y = value;\n    }\n\n  },\n  clientX: {\n    get() {\n      return this.client.x;\n    },\n\n    set(value) {\n      this.client.x = value;\n    }\n\n  },\n  clientY: {\n    get() {\n      return this.client.y;\n    },\n\n    set(value) {\n      this.client.y = value;\n    }\n\n  },\n  dx: {\n    get() {\n      return this.delta.x;\n    },\n\n    set(value) {\n      this.delta.x = value;\n    }\n\n  },\n  dy: {\n    get() {\n      return this.delta.y;\n    },\n\n    set(value) {\n      this.delta.y = value;\n    }\n\n  },\n  velocityX: {\n    get() {\n      return this.velocity.x;\n    },\n\n    set(value) {\n      this.velocity.x = value;\n    }\n\n  },\n  velocityY: {\n    get() {\n      return this.velocity.y;\n    },\n\n    set(value) {\n      this.velocity.y = value;\n    }\n\n  }\n});\n//# sourceMappingURL=InteractEvent.js.map\n// CONCATENATED MODULE: ./node_modules/@interactjs/core/isNonNativeEvent.js\nfunction isNonNativeEvent(type, actions) {\n  if (actions.phaselessTypes[type]) {\n    return true;\n  }\n\n  for (const name in actions.map) {\n    if (type.indexOf(name) === 0 && type.substr(name.length) in actions.phases) {\n      return true;\n    }\n  }\n\n  return false;\n}\n//# sourceMappingURL=isNonNativeEvent.js.map\n// CONCATENATED MODULE: ./node_modules/@interactjs/core/Interactable.js\n/* eslint-disable no-dupe-class-members */\n\n\n\n\n\n\n\n\n\n\n\n/** */\nclass Interactable_Interactable {\n  /** @internal */\n  get _defaults() {\n    return {\n      base: {},\n      perAction: {},\n      actions: {}\n    };\n  }\n\n  /** */\n  constructor(target, options, defaultContext, scopeEvents) {\n    this.options = void 0;\n    this._actions = void 0;\n    this.target = void 0;\n    this.events = new Eventable_Eventable();\n    this._context = void 0;\n    this._win = void 0;\n    this._doc = void 0;\n    this._scopeEvents = void 0;\n    this._rectChecker = void 0;\n    this._actions = options.actions;\n    this.target = target;\n    this._context = options.context || defaultContext;\n    this._win = getWindow(trySelector(target) ? this._context : target);\n    this._doc = this._win.document;\n    this._scopeEvents = scopeEvents;\n    this.set(options);\n  }\n\n  setOnEvents(actionName, phases) {\n    if (is.func(phases.onstart)) {\n      this.on(`${actionName}start`, phases.onstart);\n    }\n\n    if (is.func(phases.onmove)) {\n      this.on(`${actionName}move`, phases.onmove);\n    }\n\n    if (is.func(phases.onend)) {\n      this.on(`${actionName}end`, phases.onend);\n    }\n\n    if (is.func(phases.oninertiastart)) {\n      this.on(`${actionName}inertiastart`, phases.oninertiastart);\n    }\n\n    return this;\n  }\n\n  updatePerActionListeners(actionName, prev, cur) {\n    if (is.array(prev) || is.object(prev)) {\n      this.off(actionName, prev);\n    }\n\n    if (is.array(cur) || is.object(cur)) {\n      this.on(actionName, cur);\n    }\n  }\n\n  setPerAction(actionName, options) {\n    const defaults = this._defaults; // for all the default per-action options\n\n    for (const optionName_ in options) {\n      const optionName = optionName_;\n      const actionOptions = this.options[actionName];\n      const optionValue = options[optionName]; // remove old event listeners and add new ones\n\n      if (optionName === 'listeners') {\n        this.updatePerActionListeners(actionName, actionOptions.listeners, optionValue);\n      } // if the option value is an array\n\n\n      if (is.array(optionValue)) {\n        actionOptions[optionName] = from(optionValue);\n      } // if the option value is an object\n      else if (is.plainObject(optionValue)) {\n          // copy the object\n          actionOptions[optionName] = extend(actionOptions[optionName] || {}, clone(optionValue)); // set anabled field to true if it exists in the defaults\n\n          if (is.object(defaults.perAction[optionName]) && 'enabled' in defaults.perAction[optionName]) {\n            actionOptions[optionName].enabled = optionValue.enabled !== false;\n          }\n        } // if the option value is a boolean and the default is an object\n        else if (is.bool(optionValue) && is.object(defaults.perAction[optionName])) {\n            actionOptions[optionName].enabled = optionValue;\n          } // if it's anything else, do a plain assignment\n          else {\n              actionOptions[optionName] = optionValue;\n            }\n    }\n  }\n  /**\n   * The default function to get an Interactables bounding rect. Can be\n   * overridden using {@link Interactable.rectChecker}.\n   *\n   * @param {Element} [element] The element to measure.\n   * @return {Rect} The object's bounding rectangle.\n   */\n\n\n  getRect(element) {\n    element = element || (is.element(this.target) ? this.target : null);\n\n    if (is.string(this.target)) {\n      element = element || this._context.querySelector(this.target);\n    }\n\n    return getElementRect(element);\n  }\n  /**\n   * Returns or sets the function used to calculate the interactable's\n   * element's rectangle\n   *\n   * @param {function} [checker] A function which returns this Interactable's\n   * bounding rectangle. See {@link Interactable.getRect}\n   * @return {function | object} The checker function or this Interactable\n   */\n\n\n  rectChecker(checker) {\n    if (is.func(checker)) {\n      this._rectChecker = checker;\n\n      this.getRect = element => {\n        const rect = extend({}, this._rectChecker(element));\n\n        if (!('width' in rect)) {\n          rect.width = rect.right - rect.left;\n          rect.height = rect.bottom - rect.top;\n        }\n\n        return rect;\n      };\n\n      return this;\n    }\n\n    if (checker === null) {\n      delete this.getRect;\n      delete this._rectChecker;\n      return this;\n    }\n\n    return this.getRect;\n  }\n\n  _backCompatOption(optionName, newValue) {\n    if (trySelector(newValue) || is.object(newValue)) {\n      this.options[optionName] = newValue;\n\n      for (const action in this._actions.map) {\n        this.options[action][optionName] = newValue;\n      }\n\n      return this;\n    }\n\n    return this.options[optionName];\n  }\n  /**\n   * Gets or sets the origin of the Interactable's element.  The x and y\n   * of the origin will be subtracted from action event coordinates.\n   *\n   * @param {Element | object | string} [origin] An HTML or SVG Element whose\n   * rect will be used, an object eg. { x: 0, y: 0 } or string 'parent', 'self'\n   * or any CSS selector\n   *\n   * @return {object} The current origin or this Interactable\n   */\n\n\n  origin(newValue) {\n    return this._backCompatOption('origin', newValue);\n  }\n  /**\n   * Returns or sets the mouse coordinate types used to calculate the\n   * movement of the pointer.\n   *\n   * @param {string} [newValue] Use 'client' if you will be scrolling while\n   * interacting; Use 'page' if you want autoScroll to work\n   * @return {string | object} The current deltaSource or this Interactable\n   */\n\n\n  deltaSource(newValue) {\n    if (newValue === 'page' || newValue === 'client') {\n      this.options.deltaSource = newValue;\n      return this;\n    }\n\n    return this.options.deltaSource;\n  }\n  /**\n   * Gets the selector context Node of the Interactable. The default is\n   * `window.document`.\n   *\n   * @return {Node} The context Node of this Interactable\n   */\n\n\n  context() {\n    return this._context;\n  }\n\n  inContext(element) {\n    return this._context === element.ownerDocument || nodeContains(this._context, element);\n  }\n\n  testIgnoreAllow(options, targetNode, eventTarget) {\n    return !this.testIgnore(options.ignoreFrom, targetNode, eventTarget) && this.testAllow(options.allowFrom, targetNode, eventTarget);\n  }\n\n  testAllow(allowFrom, targetNode, element) {\n    if (!allowFrom) {\n      return true;\n    }\n\n    if (!is.element(element)) {\n      return false;\n    }\n\n    if (is.string(allowFrom)) {\n      return matchesUpTo(element, allowFrom, targetNode);\n    } else if (is.element(allowFrom)) {\n      return nodeContains(allowFrom, element);\n    }\n\n    return false;\n  }\n\n  testIgnore(ignoreFrom, targetNode, element) {\n    if (!ignoreFrom || !is.element(element)) {\n      return false;\n    }\n\n    if (is.string(ignoreFrom)) {\n      return matchesUpTo(element, ignoreFrom, targetNode);\n    } else if (is.element(ignoreFrom)) {\n      return nodeContains(ignoreFrom, element);\n    }\n\n    return false;\n  }\n  /**\n   * Calls listeners for the given InteractEvent type bound globally\n   * and directly to this Interactable\n   *\n   * @param {InteractEvent} iEvent The InteractEvent object to be fired on this\n   * Interactable\n   * @return {Interactable} this Interactable\n   */\n\n\n  fire(iEvent) {\n    this.events.fire(iEvent);\n    return this;\n  }\n\n  _onOff(method, typeArg, listenerArg, options) {\n    if (is.object(typeArg) && !is.array(typeArg)) {\n      options = listenerArg;\n      listenerArg = null;\n    }\n\n    const addRemove = method === 'on' ? 'add' : 'remove';\n    const listeners = normalize(typeArg, listenerArg);\n\n    for (let type in listeners) {\n      if (type === 'wheel') {\n        type = utils_browser.wheelEvent;\n      }\n\n      for (const listener of listeners[type]) {\n        // if it is an action event type\n        if (isNonNativeEvent(type, this._actions)) {\n          this.events[method](type, listener);\n        } // delegated event\n        else if (is.string(this.target)) {\n            this._scopeEvents[`${addRemove}Delegate`](this.target, this._context, type, listener, options);\n          } // remove listener from this Interactable's element\n          else {\n              this._scopeEvents[addRemove](this.target, type, listener, options);\n            }\n      }\n    }\n\n    return this;\n  }\n  /**\n   * Binds a listener for an InteractEvent, pointerEvent or DOM event.\n   *\n   * @param {string | array | object} types The types of events to listen\n   * for\n   * @param {function | array | object} [listener] The event listener function(s)\n   * @param {object | boolean} [options] options object or useCapture flag for\n   * addEventListener\n   * @return {Interactable} This Interactable\n   */\n\n\n  on(types, listener, options) {\n    return this._onOff('on', types, listener, options);\n  }\n  /**\n   * Removes an InteractEvent, pointerEvent or DOM event listener.\n   *\n   * @param {string | array | object} types The types of events that were\n   * listened for\n   * @param {function | array | object} [listener] The event listener function(s)\n   * @param {object | boolean} [options] options object or useCapture flag for\n   * removeEventListener\n   * @return {Interactable} This Interactable\n   */\n\n\n  off(types, listener, options) {\n    return this._onOff('off', types, listener, options);\n  }\n  /**\n   * Reset the options of this Interactable\n   *\n   * @param {object} options The new settings to apply\n   * @return {object} This Interactable\n   */\n\n\n  set(options) {\n    const defaults = this._defaults;\n\n    if (!is.object(options)) {\n      options = {};\n    }\n\n    this.options = clone(defaults.base);\n\n    for (const actionName_ in this._actions.methodDict) {\n      const actionName = actionName_;\n      const methodName = this._actions.methodDict[actionName];\n      this.options[actionName] = {};\n      this.setPerAction(actionName, extend(extend({}, defaults.perAction), defaults.actions[actionName]));\n      this[methodName](options[actionName]);\n    }\n\n    for (const setting in options) {\n      if (is.func(this[setting])) {\n        this[setting](options[setting]);\n      }\n    }\n\n    return this;\n  }\n  /**\n   * Remove this interactable from the list of interactables and remove it's\n   * action capabilities and event listeners\n   */\n\n\n  unset() {\n    if (is.string(this.target)) {\n      // remove delegated events\n      for (const type in this._scopeEvents.delegatedEvents) {\n        const delegated = this._scopeEvents.delegatedEvents[type];\n\n        for (let i = delegated.length - 1; i >= 0; i--) {\n          const {\n            selector,\n            context,\n            listeners\n          } = delegated[i];\n\n          if (selector === this.target && context === this._context) {\n            delegated.splice(i, 1);\n          }\n\n          for (let l = listeners.length - 1; l >= 0; l--) {\n            this._scopeEvents.removeDelegate(this.target, this._context, type, listeners[l][0], listeners[l][1]);\n          }\n        }\n      }\n    } else {\n      this._scopeEvents.remove(this.target, 'all');\n    }\n  }\n\n}\n//# sourceMappingURL=Interactable.js.map\n// CONCATENATED MODULE: ./node_modules/@interactjs/core/InteractableSet.js\n\n\n\n\nclass InteractableSet_InteractableSet {\n  // all set interactables\n  constructor(scope) {\n    this.list = [];\n    this.selectorMap = {};\n    this.scope = void 0;\n    this.scope = scope;\n    scope.addListeners({\n      'interactable:unset': ({\n        interactable\n      }) => {\n        const {\n          target,\n          _context: context\n        } = interactable;\n        const targetMappings = is.string(target) ? this.selectorMap[target] : target[this.scope.id];\n        const targetIndex = findIndex(targetMappings, m => m.context === context);\n\n        if (targetMappings[targetIndex]) {\n          // Destroying mappingInfo's context and interactable\n          targetMappings[targetIndex].context = null;\n          targetMappings[targetIndex].interactable = null;\n        }\n\n        targetMappings.splice(targetIndex, 1);\n      }\n    });\n  }\n\n  new(target, options) {\n    options = extend(options || {}, {\n      actions: this.scope.actions\n    });\n    const interactable = new this.scope.Interactable(target, options, this.scope.document, this.scope.events);\n    const mappingInfo = {\n      context: interactable._context,\n      interactable\n    };\n    this.scope.addDocument(interactable._doc);\n    this.list.push(interactable);\n\n    if (is.string(target)) {\n      if (!this.selectorMap[target]) {\n        this.selectorMap[target] = [];\n      }\n\n      this.selectorMap[target].push(mappingInfo);\n    } else {\n      if (!interactable.target[this.scope.id]) {\n        Object.defineProperty(target, this.scope.id, {\n          value: [],\n          configurable: true\n        });\n      }\n\n      target[this.scope.id].push(mappingInfo);\n    }\n\n    this.scope.fire('interactable:new', {\n      target,\n      options,\n      interactable,\n      win: this.scope._win\n    });\n    return interactable;\n  }\n\n  get(target, options) {\n    const context = options && options.context || this.scope.document;\n    const isSelector = is.string(target);\n    const targetMappings = isSelector ? this.selectorMap[target] : target[this.scope.id];\n\n    if (!targetMappings) {\n      return null;\n    }\n\n    const found = find(targetMappings, m => m.context === context && (isSelector || m.interactable.inContext(target)));\n    return found && found.interactable;\n  }\n\n  forEachMatch(node, callback) {\n    for (const interactable of this.list) {\n      let ret;\n\n      if ((is.string(interactable.target) // target is a selector and the element matches\n      ? is.element(node) && matchesSelector(node, interactable.target) : // target is the element\n      node === interactable.target) && // the element is in context\n      interactable.inContext(node)) {\n        ret = callback(interactable);\n      }\n\n      if (ret !== undefined) {\n        return ret;\n      }\n    }\n  }\n\n}\n//# sourceMappingURL=InteractableSet.js.map\n// CONCATENATED MODULE: ./node_modules/@interactjs/utils/pointerExtend.js\nfunction pointerExtend(dest, source) {\n  for (const prop in source) {\n    const prefixedPropREs = pointerExtend.prefixedPropREs;\n    let deprecated = false; // skip deprecated prefixed properties\n\n    for (const vendor in prefixedPropREs) {\n      if (prop.indexOf(vendor) === 0 && prefixedPropREs[vendor].test(prop)) {\n        deprecated = true;\n        break;\n      }\n    }\n\n    if (!deprecated && typeof source[prop] !== 'function') {\n      dest[prop] = source[prop];\n    }\n  }\n\n  return dest;\n}\n\npointerExtend.prefixedPropREs = {\n  webkit: /(Movement[XY]|Radius[XY]|RotationAngle|Force)$/,\n  moz: /(Pressure)$/\n};\n/* harmony default export */ var utils_pointerExtend = (pointerExtend);\n//# sourceMappingURL=pointerExtend.js.map\n// CONCATENATED MODULE: ./node_modules/@interactjs/utils/pointerUtils.js\n\n\n\n\n\n\nfunction copyCoords(dest, src) {\n  dest.page = dest.page || {};\n  dest.page.x = src.page.x;\n  dest.page.y = src.page.y;\n  dest.client = dest.client || {};\n  dest.client.x = src.client.x;\n  dest.client.y = src.client.y;\n  dest.timeStamp = src.timeStamp;\n}\nfunction setCoordDeltas(targetObj, prev, cur) {\n  targetObj.page.x = cur.page.x - prev.page.x;\n  targetObj.page.y = cur.page.y - prev.page.y;\n  targetObj.client.x = cur.client.x - prev.client.x;\n  targetObj.client.y = cur.client.y - prev.client.y;\n  targetObj.timeStamp = cur.timeStamp - prev.timeStamp;\n}\nfunction setCoordVelocity(targetObj, delta) {\n  const dt = Math.max(delta.timeStamp / 1000, 0.001);\n  targetObj.page.x = delta.page.x / dt;\n  targetObj.page.y = delta.page.y / dt;\n  targetObj.client.x = delta.client.x / dt;\n  targetObj.client.y = delta.client.y / dt;\n  targetObj.timeStamp = dt;\n}\nfunction setZeroCoords(targetObj) {\n  targetObj.page.x = 0;\n  targetObj.page.y = 0;\n  targetObj.client.x = 0;\n  targetObj.client.y = 0;\n}\nfunction isNativePointer(pointer) {\n  return pointer instanceof utils_domObjects.Event || pointer instanceof utils_domObjects.Touch;\n} // Get specified X/Y coords for mouse or event.touches[0]\n\nfunction getXY(type, pointer, xy) {\n  xy = xy || {};\n  type = type || 'page';\n  xy.x = pointer[type + 'X'];\n  xy.y = pointer[type + 'Y'];\n  return xy;\n}\nfunction getPageXY(pointer, page) {\n  page = page || {\n    x: 0,\n    y: 0\n  }; // Opera Mobile handles the viewport and scrolling oddly\n\n  if (utils_browser.isOperaMobile && isNativePointer(pointer)) {\n    getXY('screen', pointer, page);\n    page.x += window.scrollX;\n    page.y += window.scrollY;\n  } else {\n    getXY('page', pointer, page);\n  }\n\n  return page;\n}\nfunction getClientXY(pointer, client) {\n  client = client || {};\n\n  if (utils_browser.isOperaMobile && isNativePointer(pointer)) {\n    // Opera Mobile handles the viewport and scrolling oddly\n    getXY('screen', pointer, client);\n  } else {\n    getXY('client', pointer, client);\n  }\n\n  return client;\n}\nfunction getPointerId(pointer) {\n  return is.number(pointer.pointerId) ? pointer.pointerId : pointer.identifier;\n}\nfunction setCoords(dest, pointers, timeStamp) {\n  const pointer = pointers.length > 1 ? pointerAverage(pointers) : pointers[0];\n  getPageXY(pointer, dest.page);\n  getClientXY(pointer, dest.client);\n  dest.timeStamp = timeStamp;\n}\nfunction getTouchPair(event) {\n  const touches = []; // array of touches is supplied\n\n  if (is.array(event)) {\n    touches[0] = event[0];\n    touches[1] = event[1];\n  } // an event\n  else {\n      if (event.type === 'touchend') {\n        if (event.touches.length === 1) {\n          touches[0] = event.touches[0];\n          touches[1] = event.changedTouches[0];\n        } else if (event.touches.length === 0) {\n          touches[0] = event.changedTouches[0];\n          touches[1] = event.changedTouches[1];\n        }\n      } else {\n        touches[0] = event.touches[0];\n        touches[1] = event.touches[1];\n      }\n    }\n\n  return touches;\n}\nfunction pointerAverage(pointers) {\n  const average = {\n    pageX: 0,\n    pageY: 0,\n    clientX: 0,\n    clientY: 0,\n    screenX: 0,\n    screenY: 0\n  };\n\n  for (const pointer of pointers) {\n    for (const prop in average) {\n      average[prop] += pointer[prop];\n    }\n  }\n\n  for (const prop in average) {\n    average[prop] /= pointers.length;\n  }\n\n  return average;\n}\nfunction touchBBox(event) {\n  if (!event.length) {\n    return null;\n  }\n\n  const touches = getTouchPair(event);\n  const minX = Math.min(touches[0].pageX, touches[1].pageX);\n  const minY = Math.min(touches[0].pageY, touches[1].pageY);\n  const maxX = Math.max(touches[0].pageX, touches[1].pageX);\n  const maxY = Math.max(touches[0].pageY, touches[1].pageY);\n  return {\n    x: minX,\n    y: minY,\n    left: minX,\n    top: minY,\n    right: maxX,\n    bottom: maxY,\n    width: maxX - minX,\n    height: maxY - minY\n  };\n}\nfunction touchDistance(event, deltaSource) {\n  const sourceX = deltaSource + 'X';\n  const sourceY = deltaSource + 'Y';\n  const touches = getTouchPair(event);\n  const dx = touches[0][sourceX] - touches[1][sourceX];\n  const dy = touches[0][sourceY] - touches[1][sourceY];\n  return hypot(dx, dy);\n}\nfunction touchAngle(event, deltaSource) {\n  const sourceX = deltaSource + 'X';\n  const sourceY = deltaSource + 'Y';\n  const touches = getTouchPair(event);\n  const dx = touches[1][sourceX] - touches[0][sourceX];\n  const dy = touches[1][sourceY] - touches[0][sourceY];\n  const angle = 180 * Math.atan2(dy, dx) / Math.PI;\n  return angle;\n}\nfunction getPointerType(pointer) {\n  return is.string(pointer.pointerType) ? pointer.pointerType : is.number(pointer.pointerType) ? [undefined, undefined, 'touch', 'pen', 'mouse'][pointer.pointerType] // if the PointerEvent API isn't available, then the \"pointer\" must\n  // be either a MouseEvent, TouchEvent, or Touch object\n  : /touch/.test(pointer.type) || pointer instanceof utils_domObjects.Touch ? 'touch' : 'mouse';\n} // [ event.target, event.currentTarget ]\n\nfunction getEventTargets(event) {\n  const path = is.func(event.composedPath) ? event.composedPath() : event.path;\n  return [getActualElement(path ? path[0] : event.target), getActualElement(event.currentTarget)];\n}\nfunction newCoords() {\n  return {\n    page: {\n      x: 0,\n      y: 0\n    },\n    client: {\n      x: 0,\n      y: 0\n    },\n    timeStamp: 0\n  };\n}\nfunction coordsToEvent(coords) {\n  const event = {\n    coords,\n\n    get page() {\n      return this.coords.page;\n    },\n\n    get client() {\n      return this.coords.client;\n    },\n\n    get timeStamp() {\n      return this.coords.timeStamp;\n    },\n\n    get pageX() {\n      return this.coords.page.x;\n    },\n\n    get pageY() {\n      return this.coords.page.y;\n    },\n\n    get clientX() {\n      return this.coords.client.x;\n    },\n\n    get clientY() {\n      return this.coords.client.y;\n    },\n\n    get pointerId() {\n      return this.coords.pointerId;\n    },\n\n    get target() {\n      return this.coords.target;\n    },\n\n    get type() {\n      return this.coords.type;\n    },\n\n    get pointerType() {\n      return this.coords.pointerType;\n    },\n\n    get buttons() {\n      return this.coords.buttons;\n    },\n\n    preventDefault() {}\n\n  };\n  return event;\n}\n\n//# sourceMappingURL=pointerUtils.js.map\n// CONCATENATED MODULE: ./node_modules/@interactjs/core/events.js\n\n\n\n\n\n\n\n\nfunction install(scope) {\n  const targets = [];\n  const delegatedEvents = {};\n  const documents = [];\n  const eventsMethods = {\n    add,\n    remove,\n    addDelegate,\n    removeDelegate,\n    delegateListener,\n    delegateUseCapture,\n    delegatedEvents,\n    documents,\n    targets,\n    supportsOptions: false,\n    supportsPassive: false\n  }; // check if browser supports passive events and options arg\n\n  scope.document.createElement('div').addEventListener('test', null, {\n    get capture() {\n      return eventsMethods.supportsOptions = true;\n    },\n\n    get passive() {\n      return eventsMethods.supportsPassive = true;\n    }\n\n  });\n  scope.events = eventsMethods;\n\n  function add(eventTarget, type, listener, optionalArg) {\n    const options = getOptions(optionalArg);\n    let target = find(targets, t => t.eventTarget === eventTarget);\n\n    if (!target) {\n      target = {\n        eventTarget,\n        events: {}\n      };\n      targets.push(target);\n    }\n\n    if (!target.events[type]) {\n      target.events[type] = [];\n    }\n\n    if (eventTarget.addEventListener && !contains(target.events[type], listener)) {\n      eventTarget.addEventListener(type, listener, eventsMethods.supportsOptions ? options : options.capture);\n      target.events[type].push(listener);\n    }\n  }\n\n  function remove(eventTarget, type, listener, optionalArg) {\n    const options = getOptions(optionalArg);\n    const targetIndex = findIndex(targets, t => t.eventTarget === eventTarget);\n    const target = targets[targetIndex];\n\n    if (!target || !target.events) {\n      return;\n    }\n\n    if (type === 'all') {\n      for (type in target.events) {\n        if (target.events.hasOwnProperty(type)) {\n          remove(eventTarget, type, 'all');\n        }\n      }\n\n      return;\n    }\n\n    let typeIsEmpty = false;\n    const typeListeners = target.events[type];\n\n    if (typeListeners) {\n      if (listener === 'all') {\n        for (let i = typeListeners.length - 1; i >= 0; i--) {\n          remove(eventTarget, type, typeListeners[i], options);\n        }\n\n        return;\n      } else {\n        for (let i = 0; i < typeListeners.length; i++) {\n          if (typeListeners[i] === listener) {\n            eventTarget.removeEventListener(type, listener, eventsMethods.supportsOptions ? options : options.capture);\n            typeListeners.splice(i, 1);\n\n            if (typeListeners.length === 0) {\n              delete target.events[type];\n              typeIsEmpty = true;\n            }\n\n            break;\n          }\n        }\n      }\n    }\n\n    if (typeIsEmpty && !Object.keys(target.events).length) {\n      targets.splice(targetIndex, 1);\n    }\n  }\n\n  function addDelegate(selector, context, type, listener, optionalArg) {\n    const options = getOptions(optionalArg);\n\n    if (!delegatedEvents[type]) {\n      delegatedEvents[type] = []; // add delegate listener functions\n\n      for (const doc of documents) {\n        add(doc, type, delegateListener);\n        add(doc, type, delegateUseCapture, true);\n      }\n    }\n\n    const delegates = delegatedEvents[type];\n    let delegate = find(delegates, d => d.selector === selector && d.context === context);\n\n    if (!delegate) {\n      delegate = {\n        selector,\n        context,\n        listeners: []\n      };\n      delegates.push(delegate);\n    }\n\n    delegate.listeners.push([listener, options]);\n  }\n\n  function removeDelegate(selector, context, type, listener, optionalArg) {\n    const options = getOptions(optionalArg);\n    const delegates = delegatedEvents[type];\n    let matchFound = false;\n    let index;\n\n    if (!delegates) {\n      return;\n    } // count from last index of delegated to 0\n\n\n    for (index = delegates.length - 1; index >= 0; index--) {\n      const cur = delegates[index]; // look for matching selector and context Node\n\n      if (cur.selector === selector && cur.context === context) {\n        const {\n          listeners\n        } = cur; // each item of the listeners array is an array: [function, capture, passive]\n\n        for (let i = listeners.length - 1; i >= 0; i--) {\n          const [fn, {\n            capture,\n            passive\n          }] = listeners[i]; // check if the listener functions and capture and passive flags match\n\n          if (fn === listener && capture === options.capture && passive === options.passive) {\n            // remove the listener from the array of listeners\n            listeners.splice(i, 1); // if all listeners for this target have been removed\n            // remove the target from the delegates array\n\n            if (!listeners.length) {\n              delegates.splice(index, 1); // remove delegate function from context\n\n              remove(context, type, delegateListener);\n              remove(context, type, delegateUseCapture, true);\n            } // only remove one listener\n\n\n            matchFound = true;\n            break;\n          }\n        }\n\n        if (matchFound) {\n          break;\n        }\n      }\n    }\n  } // bound to the interactable context when a DOM event\n  // listener is added to a selector interactable\n\n\n  function delegateListener(event, optionalArg) {\n    const options = getOptions(optionalArg);\n    const fakeEvent = new events_FakeEvent(event);\n    const delegates = delegatedEvents[event.type];\n    const [eventTarget] = getEventTargets(event);\n    let element = eventTarget; // climb up document tree looking for selector matches\n\n    while (is.element(element)) {\n      for (let i = 0; i < delegates.length; i++) {\n        const cur = delegates[i];\n        const {\n          selector,\n          context\n        } = cur;\n\n        if (matchesSelector(element, selector) && nodeContains(context, eventTarget) && nodeContains(context, element)) {\n          const {\n            listeners\n          } = cur;\n          fakeEvent.currentTarget = element;\n\n          for (const [fn, {\n            capture,\n            passive\n          }] of listeners) {\n            if (capture === options.capture && passive === options.passive) {\n              fn(fakeEvent);\n            }\n          }\n        }\n      }\n\n      element = parentNode(element);\n    }\n  }\n\n  function delegateUseCapture(event) {\n    return delegateListener.call(this, event, true);\n  } // for type inferrence\n\n\n  return eventsMethods;\n}\n\nclass events_FakeEvent {\n  constructor(originalEvent) {\n    this.currentTarget = void 0;\n    this.originalEvent = void 0;\n    this.type = void 0;\n    this.originalEvent = originalEvent; // duplicate the event so that currentTarget can be changed\n\n    utils_pointerExtend(this, originalEvent);\n  }\n\n  preventOriginalDefault() {\n    this.originalEvent.preventDefault();\n  }\n\n  stopPropagation() {\n    this.originalEvent.stopPropagation();\n  }\n\n  stopImmediatePropagation() {\n    this.originalEvent.stopImmediatePropagation();\n  }\n\n}\n\nfunction getOptions(param) {\n  if (!is.object(param)) {\n    return {\n      capture: !!param,\n      passive: false\n    };\n  }\n\n  const options = extend({}, param);\n  options.capture = !!param.capture;\n  options.passive = !!param.passive;\n  return options;\n}\n\n/* harmony default export */ var events = ({\n  id: 'events',\n  install\n});\n//# sourceMappingURL=events.js.map\n// CONCATENATED MODULE: ./node_modules/@interactjs/utils/misc.js\n\nfunction warnOnce(method, message) {\n  let warned = false;\n  return function () {\n    if (!warned) {\n      win.console.warn(message);\n      warned = true;\n    }\n\n    return method.apply(this, arguments);\n  };\n}\nfunction copyAction(dest, src) {\n  dest.name = src.name;\n  dest.axis = src.axis;\n  dest.edges = src.edges;\n  return dest;\n}\n//# sourceMappingURL=misc.js.map\n// CONCATENATED MODULE: ./node_modules/@interactjs/core/interactStatic.js\n/** @module interact */\n\n\n\n\n\n\nfunction createInteractStatic(scope) {\n  /**\n   * ```js\n   * interact('#draggable').draggable(true)\n   *\n   * var rectables = interact('rect')\n   * rectables\n   *   .gesturable(true)\n   *   .on('gesturemove', function (event) {\n   *       // ...\n   *   })\n   * ```\n   *\n   * The methods of this variable can be used to set elements as interactables\n   * and also to change various default settings.\n   *\n   * Calling it as a function and passing an element or a valid CSS selector\n   * string returns an Interactable object which has various methods to configure\n   * it.\n   *\n   * @global\n   *\n   * @param {Element | string} target The HTML or SVG Element to interact with\n   * or CSS selector\n   * @return {Interactable}\n   */\n  const interact = (target, options) => {\n    let interactable = scope.interactables.get(target, options);\n\n    if (!interactable) {\n      interactable = scope.interactables.new(target, options);\n      interactable.events.global = interact.globalEvents;\n    }\n\n    return interactable;\n  }; // expose the functions used to calculate multi-touch properties\n\n\n  interact.getPointerAverage = pointerAverage;\n  interact.getTouchBBox = touchBBox;\n  interact.getTouchDistance = touchDistance;\n  interact.getTouchAngle = touchAngle;\n  interact.getElementRect = getElementRect;\n  interact.getElementClientRect = getElementClientRect;\n  interact.matchesSelector = matchesSelector;\n  interact.closest = domUtils_closest;\n  interact.globalEvents = {}; // eslint-disable-next-line no-undef\n\n  interact.version = \"1.10.2\";\n  interact.scope = scope;\n  /**\n  * Use a plugin\n  *\n  * @alias module:interact.use\n  *\n   */\n\n  interact.use = function (plugin, options) {\n    this.scope.usePlugin(plugin, options);\n    return this;\n  };\n  /**\n   * Check if an element or selector has been set with the {@link interact}\n   * function\n   *\n   * @alias module:interact.isSet\n   *\n   * @param {Target} target The Element or string being searched for\n   * @param {object} options\n   * @return {boolean} Indicates if the element or CSS selector was previously\n   * passed to interact\n   */\n\n\n  interact.isSet = function (target, options) {\n    return !!this.scope.interactables.get(target, options && options.context);\n  };\n  /**\n   * @deprecated\n   * Add a global listener for an InteractEvent or adds a DOM event to `document`\n   *\n   * @alias module:interact.on\n   *\n   * @param {string | array | object} type The types of events to listen for\n   * @param {function} listener The function event (s)\n   * @param {object | boolean} [options] object or useCapture flag for\n   * addEventListener\n   * @return {object} interact\n   */\n\n\n  interact.on = warnOnce(function on(type, listener, options) {\n    if (is.string(type) && type.search(' ') !== -1) {\n      type = type.trim().split(/ +/);\n    }\n\n    if (is.array(type)) {\n      for (const eventType of type) {\n        this.on(eventType, listener, options);\n      }\n\n      return this;\n    }\n\n    if (is.object(type)) {\n      for (const prop in type) {\n        this.on(prop, type[prop], listener);\n      }\n\n      return this;\n    } // if it is an InteractEvent type, add listener to globalEvents\n\n\n    if (isNonNativeEvent(type, this.scope.actions)) {\n      // if this type of event was never bound\n      if (!this.globalEvents[type]) {\n        this.globalEvents[type] = [listener];\n      } else {\n        this.globalEvents[type].push(listener);\n      }\n    } // If non InteractEvent type, addEventListener to document\n    else {\n        this.scope.events.add(this.scope.document, type, listener, {\n          options\n        });\n      }\n\n    return this;\n  }, 'The interact.on() method is being deprecated');\n  /**\n   * @deprecated\n   * Removes a global InteractEvent listener or DOM event from `document`\n   *\n   * @alias module:interact.off\n   *\n   * @param {string | array | object} type The types of events that were listened\n   * for\n   * @param {function} listener The listener function to be removed\n   * @param {object | boolean} options [options] object or useCapture flag for\n   * removeEventListener\n   * @return {object} interact\n   */\n\n  interact.off = warnOnce(function off(type, listener, options) {\n    if (is.string(type) && type.search(' ') !== -1) {\n      type = type.trim().split(/ +/);\n    }\n\n    if (is.array(type)) {\n      for (const eventType of type) {\n        this.off(eventType, listener, options);\n      }\n\n      return this;\n    }\n\n    if (is.object(type)) {\n      for (const prop in type) {\n        this.off(prop, type[prop], listener);\n      }\n\n      return this;\n    }\n\n    if (isNonNativeEvent(type, this.scope.actions)) {\n      let index;\n\n      if (type in this.globalEvents && (index = this.globalEvents[type].indexOf(listener)) !== -1) {\n        this.globalEvents[type].splice(index, 1);\n      }\n    } else {\n      this.scope.events.remove(this.scope.document, type, listener, options);\n    }\n\n    return this;\n  }, 'The interact.off() method is being deprecated');\n\n  interact.debug = function () {\n    return this.scope;\n  };\n  /**\n   * @alias module:interact.supportsTouch\n   *\n   * @return {boolean} Whether or not the browser supports touch input\n   */\n\n\n  interact.supportsTouch = function () {\n    return utils_browser.supportsTouch;\n  };\n  /**\n   * @alias module:interact.supportsPointerEvent\n   *\n   * @return {boolean} Whether or not the browser supports PointerEvents\n   */\n\n\n  interact.supportsPointerEvent = function () {\n    return utils_browser.supportsPointerEvent;\n  };\n  /**\n   * Cancels all interactions (end events are not fired)\n   *\n   * @alias module:interact.stop\n   *\n   * @return {object} interact\n   */\n\n\n  interact.stop = function () {\n    for (const interaction of this.scope.interactions.list) {\n      interaction.stop();\n    }\n\n    return this;\n  };\n  /**\n   * Returns or sets the distance the pointer must be moved before an action\n   * sequence occurs. This also affects tolerance for tap events.\n   *\n   * @alias module:interact.pointerMoveTolerance\n   *\n   * @param {number} [newValue] The movement from the start position must be greater than this value\n   * @return {interact | number}\n   */\n\n\n  interact.pointerMoveTolerance = function (newValue) {\n    if (is.number(newValue)) {\n      this.scope.interactions.pointerMoveTolerance = newValue;\n      return this;\n    }\n\n    return this.scope.interactions.pointerMoveTolerance;\n  };\n\n  interact.addDocument = function (doc, options) {\n    this.scope.addDocument(doc, options);\n  };\n\n  interact.removeDocument = function (doc) {\n    this.scope.removeDocument(doc);\n  };\n\n  return interact;\n}\n//# sourceMappingURL=interactStatic.js.map\n// CONCATENATED MODULE: ./node_modules/@interactjs/core/PointerInfo.js\nclass PointerInfo {\n  constructor(id, pointer, event, downTime, downTarget) {\n    this.id = void 0;\n    this.pointer = void 0;\n    this.event = void 0;\n    this.downTime = void 0;\n    this.downTarget = void 0;\n    this.id = id;\n    this.pointer = pointer;\n    this.event = event;\n    this.downTime = downTime;\n    this.downTarget = downTarget;\n  }\n\n}\n//# sourceMappingURL=PointerInfo.js.map\n// CONCATENATED MODULE: ./node_modules/@interactjs/core/Interaction.js\n\n\n\n\n\n\n\n\nlet _ProxyValues;\n\n(function (_ProxyValues) {\n  _ProxyValues[\"interactable\"] = \"\";\n  _ProxyValues[\"element\"] = \"\";\n  _ProxyValues[\"prepared\"] = \"\";\n  _ProxyValues[\"pointerIsDown\"] = \"\";\n  _ProxyValues[\"pointerWasMoved\"] = \"\";\n  _ProxyValues[\"_proxy\"] = \"\";\n})(_ProxyValues || (_ProxyValues = {}));\n\nlet _ProxyMethods;\n\n(function (_ProxyMethods) {\n  _ProxyMethods[\"start\"] = \"\";\n  _ProxyMethods[\"move\"] = \"\";\n  _ProxyMethods[\"end\"] = \"\";\n  _ProxyMethods[\"stop\"] = \"\";\n  _ProxyMethods[\"interacting\"] = \"\";\n})(_ProxyMethods || (_ProxyMethods = {}));\n\nlet idCounter = 0;\nclass Interaction_Interaction {\n  // current interactable being interacted with\n  // the target element of the interactable\n  // action that's ready to be fired on next move event\n  // keep track of added pointers\n  // pointerdown/mousedown/touchstart event\n  // previous action event\n\n  /** @internal */\n  get pointerMoveTolerance() {\n    return 1;\n  }\n  /**\n   * @alias Interaction.prototype.move\n   */\n\n\n  /** */\n  constructor({\n    pointerType,\n    scopeFire\n  }) {\n    this.interactable = null;\n    this.element = null;\n    this.rect = void 0;\n    this._rects = void 0;\n    this.edges = void 0;\n    this._scopeFire = void 0;\n    this.prepared = {\n      name: null,\n      axis: null,\n      edges: null\n    };\n    this.pointerType = void 0;\n    this.pointers = [];\n    this.downEvent = null;\n    this.downPointer = {};\n    this._latestPointer = {\n      pointer: null,\n      event: null,\n      eventTarget: null\n    };\n    this.prevEvent = null;\n    this.pointerIsDown = false;\n    this.pointerWasMoved = false;\n    this._interacting = false;\n    this._ending = false;\n    this._stopped = true;\n    this._proxy = null;\n    this.simulation = null;\n    this.doMove = warnOnce(function (signalArg) {\n      this.move(signalArg);\n    }, 'The interaction.doMove() method has been renamed to interaction.move()');\n    this.coords = {\n      // Starting InteractEvent pointer coordinates\n      start: newCoords(),\n      // Previous native pointer move event coordinates\n      prev: newCoords(),\n      // current native pointer move event coordinates\n      cur: newCoords(),\n      // Change in coordinates and time of the pointer\n      delta: newCoords(),\n      // pointer velocity\n      velocity: newCoords()\n    };\n    this._id = idCounter++;\n    this._scopeFire = scopeFire;\n    this.pointerType = pointerType;\n    const that = this;\n    this._proxy = {};\n\n    for (const key in _ProxyValues) {\n      Object.defineProperty(this._proxy, key, {\n        get() {\n          return that[key];\n        }\n\n      });\n    }\n\n    for (const key in _ProxyMethods) {\n      Object.defineProperty(this._proxy, key, {\n        value: (...args) => that[key](...args)\n      });\n    }\n\n    this._scopeFire('interactions:new', {\n      interaction: this\n    });\n  }\n\n  pointerDown(pointer, event, eventTarget) {\n    const pointerIndex = this.updatePointer(pointer, event, eventTarget, true);\n    const pointerInfo = this.pointers[pointerIndex];\n\n    this._scopeFire('interactions:down', {\n      pointer,\n      event,\n      eventTarget,\n      pointerIndex,\n      pointerInfo,\n      type: 'down',\n      interaction: this\n    });\n  }\n  /**\n   * ```js\n   * interact(target)\n   *   .draggable({\n   *     // disable the default drag start by down->move\n   *     manualStart: true\n   *   })\n   *   // start dragging after the user holds the pointer down\n   *   .on('hold', function (event) {\n   *     var interaction = event.interaction\n   *\n   *     if (!interaction.interacting()) {\n   *       interaction.start({ name: 'drag' },\n   *                         event.interactable,\n   *                         event.currentTarget)\n   *     }\n   * })\n   * ```\n   *\n   * Start an action with the given Interactable and Element as tartgets. The\n   * action must be enabled for the target Interactable and an appropriate\n   * number of pointers must be held down - 1 for drag/resize, 2 for gesture.\n   *\n   * Use it with `interactable.<action>able({ manualStart: false })` to always\n   * [start actions manually](https://github.com/taye/interact.js/issues/114)\n   *\n   * @param {object} action   The action to be performed - drag, resize, etc.\n   * @param {Interactable} target  The Interactable to target\n   * @param {Element} element The DOM Element to target\n   * @return {Boolean} Whether the interaction was successfully started\n   */\n\n\n  start(action, interactable, element) {\n    if (this.interacting() || !this.pointerIsDown || this.pointers.length < (action.name === 'gesture' ? 2 : 1) || !interactable.options[action.name].enabled) {\n      return false;\n    }\n\n    copyAction(this.prepared, action);\n    this.interactable = interactable;\n    this.element = element;\n    this.rect = interactable.getRect(element);\n    this.edges = this.prepared.edges ? extend({}, this.prepared.edges) : {\n      left: true,\n      right: true,\n      top: true,\n      bottom: true\n    };\n    this._stopped = false;\n    this._interacting = this._doPhase({\n      interaction: this,\n      event: this.downEvent,\n      phase: 'start'\n    }) && !this._stopped;\n    return this._interacting;\n  }\n\n  pointerMove(pointer, event, eventTarget) {\n    if (!this.simulation && !(this.modification && this.modification.endResult)) {\n      this.updatePointer(pointer, event, eventTarget, false);\n    }\n\n    const duplicateMove = this.coords.cur.page.x === this.coords.prev.page.x && this.coords.cur.page.y === this.coords.prev.page.y && this.coords.cur.client.x === this.coords.prev.client.x && this.coords.cur.client.y === this.coords.prev.client.y;\n    let dx;\n    let dy; // register movement greater than pointerMoveTolerance\n\n    if (this.pointerIsDown && !this.pointerWasMoved) {\n      dx = this.coords.cur.client.x - this.coords.start.client.x;\n      dy = this.coords.cur.client.y - this.coords.start.client.y;\n      this.pointerWasMoved = hypot(dx, dy) > this.pointerMoveTolerance;\n    }\n\n    const pointerIndex = this.getPointerIndex(pointer);\n    const signalArg = {\n      pointer,\n      pointerIndex,\n      pointerInfo: this.pointers[pointerIndex],\n      event,\n      type: 'move',\n      eventTarget,\n      dx,\n      dy,\n      duplicate: duplicateMove,\n      interaction: this\n    };\n\n    if (!duplicateMove) {\n      // set pointer coordinate, time changes and velocity\n      setCoordVelocity(this.coords.velocity, this.coords.delta);\n    }\n\n    this._scopeFire('interactions:move', signalArg);\n\n    if (!duplicateMove && !this.simulation) {\n      // if interacting, fire an 'action-move' signal etc\n      if (this.interacting()) {\n        signalArg.type = null;\n        this.move(signalArg);\n      }\n\n      if (this.pointerWasMoved) {\n        copyCoords(this.coords.prev, this.coords.cur);\n      }\n    }\n  }\n  /**\n   * ```js\n   * interact(target)\n   *   .draggable(true)\n   *   .on('dragmove', function (event) {\n   *     if (someCondition) {\n   *       // change the snap settings\n   *       event.interactable.draggable({ snap: { targets: [] }})\n   *       // fire another move event with re-calculated snap\n   *       event.interaction.move()\n   *     }\n   *   })\n   * ```\n   *\n   * Force a move of the current action at the same coordinates. Useful if\n   * snap/restrict has been changed and you want a movement with the new\n   * settings.\n   */\n\n\n  move(signalArg) {\n    if (!signalArg || !signalArg.event) {\n      setZeroCoords(this.coords.delta);\n    }\n\n    signalArg = extend({\n      pointer: this._latestPointer.pointer,\n      event: this._latestPointer.event,\n      eventTarget: this._latestPointer.eventTarget,\n      interaction: this\n    }, signalArg || {});\n    signalArg.phase = 'move';\n\n    this._doPhase(signalArg);\n  } // End interact move events and stop auto-scroll unless simulation is running\n\n\n  pointerUp(pointer, event, eventTarget, curEventTarget) {\n    let pointerIndex = this.getPointerIndex(pointer);\n\n    if (pointerIndex === -1) {\n      pointerIndex = this.updatePointer(pointer, event, eventTarget, false);\n    }\n\n    const type = /cancel$/i.test(event.type) ? 'cancel' : 'up';\n\n    this._scopeFire(`interactions:${type}`, {\n      pointer,\n      pointerIndex,\n      pointerInfo: this.pointers[pointerIndex],\n      event,\n      eventTarget,\n      type: type,\n      curEventTarget,\n      interaction: this\n    });\n\n    if (!this.simulation) {\n      this.end(event);\n    }\n\n    this.removePointer(pointer, event);\n  }\n\n  documentBlur(event) {\n    this.end(event);\n\n    this._scopeFire('interactions:blur', {\n      event,\n      type: 'blur',\n      interaction: this\n    });\n  }\n  /**\n   * ```js\n   * interact(target)\n   *   .draggable(true)\n   *   .on('move', function (event) {\n   *     if (event.pageX > 1000) {\n   *       // end the current action\n   *       event.interaction.end()\n   *       // stop all further listeners from being called\n   *       event.stopImmediatePropagation()\n   *     }\n   *   })\n   * ```\n   *\n   * @param {PointerEvent} [event]\n   */\n\n\n  end(event) {\n    this._ending = true;\n    event = event || this._latestPointer.event;\n    let endPhaseResult;\n\n    if (this.interacting()) {\n      endPhaseResult = this._doPhase({\n        event,\n        interaction: this,\n        phase: 'end'\n      });\n    }\n\n    this._ending = false;\n\n    if (endPhaseResult === true) {\n      this.stop();\n    }\n  }\n\n  currentAction() {\n    return this._interacting ? this.prepared.name : null;\n  }\n\n  interacting() {\n    return this._interacting;\n  }\n  /** */\n\n\n  stop() {\n    this._scopeFire('interactions:stop', {\n      interaction: this\n    });\n\n    this.interactable = this.element = null;\n    this._interacting = false;\n    this._stopped = true;\n    this.prepared.name = this.prevEvent = null;\n  }\n\n  getPointerIndex(pointer) {\n    const pointerId = getPointerId(pointer); // mouse and pen interactions may have only one pointer\n\n    return this.pointerType === 'mouse' || this.pointerType === 'pen' ? this.pointers.length - 1 : findIndex(this.pointers, curPointer => curPointer.id === pointerId);\n  }\n\n  getPointerInfo(pointer) {\n    return this.pointers[this.getPointerIndex(pointer)];\n  }\n\n  updatePointer(pointer, event, eventTarget, down) {\n    const id = getPointerId(pointer);\n    let pointerIndex = this.getPointerIndex(pointer);\n    let pointerInfo = this.pointers[pointerIndex];\n    down = down === false ? false : down || /(down|start)$/i.test(event.type);\n\n    if (!pointerInfo) {\n      pointerInfo = new PointerInfo(id, pointer, event, null, null);\n      pointerIndex = this.pointers.length;\n      this.pointers.push(pointerInfo);\n    } else {\n      pointerInfo.pointer = pointer;\n    }\n\n    setCoords(this.coords.cur, this.pointers.map(p => p.pointer), this._now());\n    setCoordDeltas(this.coords.delta, this.coords.prev, this.coords.cur);\n\n    if (down) {\n      this.pointerIsDown = true;\n      pointerInfo.downTime = this.coords.cur.timeStamp;\n      pointerInfo.downTarget = eventTarget;\n      utils_pointerExtend(this.downPointer, pointer);\n\n      if (!this.interacting()) {\n        copyCoords(this.coords.start, this.coords.cur);\n        copyCoords(this.coords.prev, this.coords.cur);\n        this.downEvent = event;\n        this.pointerWasMoved = false;\n      }\n    }\n\n    this._updateLatestPointer(pointer, event, eventTarget);\n\n    this._scopeFire('interactions:update-pointer', {\n      pointer,\n      event,\n      eventTarget,\n      down,\n      pointerInfo,\n      pointerIndex,\n      interaction: this\n    });\n\n    return pointerIndex;\n  }\n\n  removePointer(pointer, event) {\n    const pointerIndex = this.getPointerIndex(pointer);\n\n    if (pointerIndex === -1) {\n      return;\n    }\n\n    const pointerInfo = this.pointers[pointerIndex];\n\n    this._scopeFire('interactions:remove-pointer', {\n      pointer,\n      event,\n      eventTarget: null,\n      pointerIndex,\n      pointerInfo,\n      interaction: this\n    });\n\n    this.pointers.splice(pointerIndex, 1);\n    this.pointerIsDown = false;\n  }\n\n  _updateLatestPointer(pointer, event, eventTarget) {\n    this._latestPointer.pointer = pointer;\n    this._latestPointer.event = event;\n    this._latestPointer.eventTarget = eventTarget;\n  }\n\n  destroy() {\n    this._latestPointer.pointer = null;\n    this._latestPointer.event = null;\n    this._latestPointer.eventTarget = null;\n  }\n\n  _createPreparedEvent(event, phase, preEnd, type) {\n    return new InteractEvent_InteractEvent(this, event, this.prepared.name, phase, this.element, preEnd, type);\n  }\n\n  _fireEvent(iEvent) {\n    this.interactable.fire(iEvent);\n\n    if (!this.prevEvent || iEvent.timeStamp >= this.prevEvent.timeStamp) {\n      this.prevEvent = iEvent;\n    }\n  }\n\n  _doPhase(signalArg) {\n    const {\n      event,\n      phase,\n      preEnd,\n      type\n    } = signalArg;\n    const {\n      rect\n    } = this;\n\n    if (rect && phase === 'move') {\n      // update the rect changes due to pointer move\n      addEdges(this.edges, rect, this.coords.delta[this.interactable.options.deltaSource]);\n      rect.width = rect.right - rect.left;\n      rect.height = rect.bottom - rect.top;\n    }\n\n    const beforeResult = this._scopeFire(`interactions:before-action-${phase}`, signalArg);\n\n    if (beforeResult === false) {\n      return false;\n    }\n\n    const iEvent = signalArg.iEvent = this._createPreparedEvent(event, phase, preEnd, type);\n\n    this._scopeFire(`interactions:action-${phase}`, signalArg);\n\n    if (phase === 'start') {\n      this.prevEvent = iEvent;\n    }\n\n    this._fireEvent(iEvent);\n\n    this._scopeFire(`interactions:after-action-${phase}`, signalArg);\n\n    return true;\n  }\n\n  _now() {\n    return Date.now();\n  }\n\n}\n/* harmony default export */ var core_Interaction = (Interaction_Interaction);\n\n//# sourceMappingURL=Interaction.js.map\n// CONCATENATED MODULE: ./node_modules/@interactjs/core/interactablePreventDefault.js\n\n\n\n\n\nfunction preventDefault(newValue) {\n  if (/^(always|never|auto)$/.test(newValue)) {\n    this.options.preventDefault = newValue;\n    return this;\n  }\n\n  if (is.bool(newValue)) {\n    this.options.preventDefault = newValue ? 'always' : 'never';\n    return this;\n  }\n\n  return this.options.preventDefault;\n}\n\nfunction checkAndPreventDefault(interactable, scope, event) {\n  const setting = interactable.options.preventDefault;\n\n  if (setting === 'never') {\n    return;\n  }\n\n  if (setting === 'always') {\n    event.preventDefault();\n    return;\n  } // setting === 'auto'\n  // if the browser supports passive event listeners and isn't running on iOS,\n  // don't preventDefault of touch{start,move} events. CSS touch-action and\n  // user-select should be used instead of calling event.preventDefault().\n\n\n  if (scope.events.supportsPassive && /^touch(start|move)$/.test(event.type)) {\n    const doc = getWindow(event.target).document;\n    const docOptions = scope.getDocOptions(doc);\n\n    if (!(docOptions && docOptions.events) || docOptions.events.passive !== false) {\n      return;\n    }\n  } // don't preventDefault of pointerdown events\n\n\n  if (/^(mouse|pointer|touch)*(down|start)/i.test(event.type)) {\n    return;\n  } // don't preventDefault on editable elements\n\n\n  if (is.element(event.target) && matchesSelector(event.target, 'input,select,textarea,[contenteditable=true],[contenteditable=true] *')) {\n    return;\n  }\n\n  event.preventDefault();\n}\n\nfunction onInteractionEvent({\n  interaction,\n  event\n}) {\n  if (interaction.interactable) {\n    interaction.interactable.checkAndPreventDefault(event);\n  }\n}\n\nfunction interactablePreventDefault_install(scope) {\n  /** @lends Interactable */\n  const {\n    Interactable\n  } = scope;\n  /**\n   * Returns or sets whether to prevent the browser's default behaviour in\n   * response to pointer events. Can be set to:\n   *  - `'always'` to always prevent\n   *  - `'never'` to never prevent\n   *  - `'auto'` to let interact.js try to determine what would be best\n   *\n   * @param {string} [newValue] `'always'`, `'never'` or `'auto'`\n   * @return {string | Interactable} The current setting or this Interactable\n   */\n\n  Interactable.prototype.preventDefault = preventDefault;\n\n  Interactable.prototype.checkAndPreventDefault = function (event) {\n    return checkAndPreventDefault(this, scope, event);\n  }; // prevent native HTML5 drag on interact.js target elements\n\n\n  scope.interactions.docEvents.push({\n    type: 'dragstart',\n\n    listener(event) {\n      for (const interaction of scope.interactions.list) {\n        if (interaction.element && (interaction.element === event.target || nodeContains(interaction.element, event.target))) {\n          interaction.interactable.checkAndPreventDefault(event);\n          return;\n        }\n      }\n    }\n\n  });\n}\n/* harmony default export */ var interactablePreventDefault = ({\n  id: 'core/interactablePreventDefault',\n  install: interactablePreventDefault_install,\n  listeners: ['down', 'move', 'up', 'cancel'].reduce((acc, eventType) => {\n    acc[`interactions:${eventType}`] = onInteractionEvent;\n    return acc;\n  }, {})\n});\n//# sourceMappingURL=interactablePreventDefault.js.map\n// CONCATENATED MODULE: ./node_modules/@interactjs/core/interactionFinder.js\n\nconst finder = {\n  methodOrder: ['simulationResume', 'mouseOrPen', 'hasPointer', 'idle'],\n\n  search(details) {\n    for (const method of finder.methodOrder) {\n      const interaction = finder[method](details);\n\n      if (interaction) {\n        return interaction;\n      }\n    }\n\n    return null;\n  },\n\n  // try to resume simulation with a new pointer\n  simulationResume({\n    pointerType,\n    eventType,\n    eventTarget,\n    scope\n  }) {\n    if (!/down|start/i.test(eventType)) {\n      return null;\n    }\n\n    for (const interaction of scope.interactions.list) {\n      let element = eventTarget;\n\n      if (interaction.simulation && interaction.simulation.allowResume && interaction.pointerType === pointerType) {\n        while (element) {\n          // if the element is the interaction element\n          if (element === interaction.element) {\n            return interaction;\n          }\n\n          element = parentNode(element);\n        }\n      }\n    }\n\n    return null;\n  },\n\n  // if it's a mouse or pen interaction\n  mouseOrPen({\n    pointerId,\n    pointerType,\n    eventType,\n    scope\n  }) {\n    if (pointerType !== 'mouse' && pointerType !== 'pen') {\n      return null;\n    }\n\n    let firstNonActive;\n\n    for (const interaction of scope.interactions.list) {\n      if (interaction.pointerType === pointerType) {\n        // if it's a down event, skip interactions with running simulations\n        if (interaction.simulation && !hasPointerId(interaction, pointerId)) {\n          continue;\n        } // if the interaction is active, return it immediately\n\n\n        if (interaction.interacting()) {\n          return interaction;\n        } // otherwise save it and look for another active interaction\n        else if (!firstNonActive) {\n            firstNonActive = interaction;\n          }\n      }\n    } // if no active mouse interaction was found use the first inactive mouse\n    // interaction\n\n\n    if (firstNonActive) {\n      return firstNonActive;\n    } // find any mouse or pen interaction.\n    // ignore the interaction if the eventType is a *down, and a simulation\n    // is active\n\n\n    for (const interaction of scope.interactions.list) {\n      if (interaction.pointerType === pointerType && !(/down/i.test(eventType) && interaction.simulation)) {\n        return interaction;\n      }\n    }\n\n    return null;\n  },\n\n  // get interaction that has this pointer\n  hasPointer({\n    pointerId,\n    scope\n  }) {\n    for (const interaction of scope.interactions.list) {\n      if (hasPointerId(interaction, pointerId)) {\n        return interaction;\n      }\n    }\n\n    return null;\n  },\n\n  // get first idle interaction with a matching pointerType\n  idle({\n    pointerType,\n    scope\n  }) {\n    for (const interaction of scope.interactions.list) {\n      // if there's already a pointer held down\n      if (interaction.pointers.length === 1) {\n        const target = interaction.interactable; // don't add this pointer if there is a target interactable and it\n        // isn't gesturable\n\n        if (target && !(target.options.gesture && target.options.gesture.enabled)) {\n          continue;\n        }\n      } // maximum of 2 pointers per interaction\n      else if (interaction.pointers.length >= 2) {\n          continue;\n        }\n\n      if (!interaction.interacting() && pointerType === interaction.pointerType) {\n        return interaction;\n      }\n    }\n\n    return null;\n  }\n\n};\n\nfunction hasPointerId(interaction, pointerId) {\n  return interaction.pointers.some(({\n    id\n  }) => id === pointerId);\n}\n\n/* harmony default export */ var interactionFinder = (finder);\n//# sourceMappingURL=interactionFinder.js.map\n// CONCATENATED MODULE: ./node_modules/@interactjs/core/interactions.js\n\n\n\n\n\n\n\n\nconst methodNames = ['pointerDown', 'pointerMove', 'pointerUp', 'updatePointer', 'removePointer', 'windowBlur'];\n\nfunction interactions_install(scope) {\n  const listeners = {};\n\n  for (const method of methodNames) {\n    listeners[method] = doOnInteractions(method, scope);\n  }\n\n  const pEventTypes = utils_browser.pEventTypes;\n  let docEvents;\n\n  if (utils_domObjects.PointerEvent) {\n    docEvents = [{\n      type: pEventTypes.down,\n      listener: releasePointersOnRemovedEls\n    }, {\n      type: pEventTypes.down,\n      listener: listeners.pointerDown\n    }, {\n      type: pEventTypes.move,\n      listener: listeners.pointerMove\n    }, {\n      type: pEventTypes.up,\n      listener: listeners.pointerUp\n    }, {\n      type: pEventTypes.cancel,\n      listener: listeners.pointerUp\n    }];\n  } else {\n    docEvents = [{\n      type: 'mousedown',\n      listener: listeners.pointerDown\n    }, {\n      type: 'mousemove',\n      listener: listeners.pointerMove\n    }, {\n      type: 'mouseup',\n      listener: listeners.pointerUp\n    }, {\n      type: 'touchstart',\n      listener: releasePointersOnRemovedEls\n    }, {\n      type: 'touchstart',\n      listener: listeners.pointerDown\n    }, {\n      type: 'touchmove',\n      listener: listeners.pointerMove\n    }, {\n      type: 'touchend',\n      listener: listeners.pointerUp\n    }, {\n      type: 'touchcancel',\n      listener: listeners.pointerUp\n    }];\n  }\n\n  docEvents.push({\n    type: 'blur',\n\n    listener(event) {\n      for (const interaction of scope.interactions.list) {\n        interaction.documentBlur(event);\n      }\n    }\n\n  }); // for ignoring browser's simulated mouse events\n\n  scope.prevTouchTime = 0;\n  scope.Interaction = class extends core_Interaction {\n    get pointerMoveTolerance() {\n      return scope.interactions.pointerMoveTolerance;\n    }\n\n    set pointerMoveTolerance(value) {\n      scope.interactions.pointerMoveTolerance = value;\n    }\n\n    _now() {\n      return scope.now();\n    }\n\n  };\n  scope.interactions = {\n    // all active and idle interactions\n    list: [],\n\n    new(options) {\n      options.scopeFire = (name, arg) => scope.fire(name, arg);\n\n      const interaction = new scope.Interaction(options);\n      scope.interactions.list.push(interaction);\n      return interaction;\n    },\n\n    listeners,\n    docEvents,\n    pointerMoveTolerance: 1\n  };\n\n  function releasePointersOnRemovedEls() {\n    // for all inactive touch interactions with pointers down\n    for (const interaction of scope.interactions.list) {\n      if (!interaction.pointerIsDown || interaction.pointerType !== 'touch' || interaction._interacting) {\n        continue;\n      } // if a pointer is down on an element that is no longer in the DOM tree\n\n\n      for (const pointer of interaction.pointers) {\n        if (!scope.documents.some(({\n          doc\n        }) => nodeContains(doc, pointer.downTarget))) {\n          // remove the pointer from the interaction\n          interaction.removePointer(pointer.pointer, pointer.event);\n        }\n      }\n    }\n  }\n\n  scope.usePlugin(interactablePreventDefault);\n}\n\nfunction doOnInteractions(method, scope) {\n  return function (event) {\n    const interactions = scope.interactions.list;\n    const pointerType = getPointerType(event);\n    const [eventTarget, curEventTarget] = getEventTargets(event);\n    const matches = []; // [ [pointer, interaction], ...]\n\n    if (/^touch/.test(event.type)) {\n      scope.prevTouchTime = scope.now(); // @ts-expect-error\n\n      for (const changedTouch of event.changedTouches) {\n        const pointer = changedTouch;\n        const pointerId = getPointerId(pointer);\n        const searchDetails = {\n          pointer,\n          pointerId,\n          pointerType,\n          eventType: event.type,\n          eventTarget,\n          curEventTarget,\n          scope\n        };\n        const interaction = getInteraction(searchDetails);\n        matches.push([searchDetails.pointer, searchDetails.eventTarget, searchDetails.curEventTarget, interaction]);\n      }\n    } else {\n      let invalidPointer = false;\n\n      if (!utils_browser.supportsPointerEvent && /mouse/.test(event.type)) {\n        // ignore mouse events while touch interactions are active\n        for (let i = 0; i < interactions.length && !invalidPointer; i++) {\n          invalidPointer = interactions[i].pointerType !== 'mouse' && interactions[i].pointerIsDown;\n        } // try to ignore mouse events that are simulated by the browser\n        // after a touch event\n\n\n        invalidPointer = invalidPointer || scope.now() - scope.prevTouchTime < 500 || // on iOS and Firefox Mobile, MouseEvent.timeStamp is zero if simulated\n        event.timeStamp === 0;\n      }\n\n      if (!invalidPointer) {\n        const searchDetails = {\n          pointer: event,\n          pointerId: getPointerId(event),\n          pointerType,\n          eventType: event.type,\n          curEventTarget,\n          eventTarget,\n          scope\n        };\n        const interaction = getInteraction(searchDetails);\n        matches.push([searchDetails.pointer, searchDetails.eventTarget, searchDetails.curEventTarget, interaction]);\n      }\n    } // eslint-disable-next-line no-shadow\n\n\n    for (const [pointer, eventTarget, curEventTarget, interaction] of matches) {\n      interaction[method](pointer, event, eventTarget, curEventTarget);\n    }\n  };\n}\n\nfunction getInteraction(searchDetails) {\n  const {\n    pointerType,\n    scope\n  } = searchDetails;\n  const foundInteraction = interactionFinder.search(searchDetails);\n  const signalArg = {\n    interaction: foundInteraction,\n    searchDetails\n  };\n  scope.fire('interactions:find', signalArg);\n  return signalArg.interaction || scope.interactions.new({\n    pointerType\n  });\n}\n\nfunction onDocSignal({\n  doc,\n  scope,\n  options\n}, eventMethodName) {\n  const {\n    interactions: {\n      docEvents\n    },\n    events\n  } = scope;\n  const eventMethod = events[eventMethodName];\n\n  if (scope.browser.isIOS && !options.events) {\n    options.events = {\n      passive: false\n    };\n  } // delegate event listener\n\n\n  for (const eventType in events.delegatedEvents) {\n    eventMethod(doc, eventType, events.delegateListener);\n    eventMethod(doc, eventType, events.delegateUseCapture, true);\n  }\n\n  const eventOptions = options && options.events;\n\n  for (const {\n    type,\n    listener\n  } of docEvents) {\n    eventMethod(doc, type, listener, eventOptions);\n  }\n}\n\nconst interactions_interactions = {\n  id: 'core/interactions',\n  install: interactions_install,\n  listeners: {\n    'scope:add-document': arg => onDocSignal(arg, 'add'),\n    'scope:remove-document': arg => onDocSignal(arg, 'remove'),\n    'interactable:unset': ({\n      interactable\n    }, scope) => {\n      // Stop and destroy related interactions when an Interactable is unset\n      for (let i = scope.interactions.list.length - 1; i >= 0; i--) {\n        const interaction = scope.interactions.list[i];\n\n        if (interaction.interactable !== interactable) {\n          continue;\n        }\n\n        interaction.stop();\n        scope.fire('interactions:destroy', {\n          interaction\n        });\n        interaction.destroy();\n\n        if (scope.interactions.list.length > 2) {\n          scope.interactions.list.splice(i, 1);\n        }\n      }\n    }\n  },\n  onDocSignal,\n  doOnInteractions,\n  methodNames\n};\n/* harmony default export */ var core_interactions = (interactions_interactions);\n//# sourceMappingURL=interactions.js.map\n// CONCATENATED MODULE: ./node_modules/@interactjs/core/scope.js\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nclass scope_Scope {\n  // main window\n  // main document\n  // main window\n  // all documents being listened to\n  constructor() {\n    this.id = `__interact_scope_${Math.floor(Math.random() * 100)}`;\n    this.isInitialized = false;\n    this.listenerMaps = [];\n    this.browser = utils_browser;\n    this.defaults = clone(defaultOptions_defaults);\n    this.Eventable = Eventable_Eventable;\n    this.actions = {\n      map: {},\n      phases: {\n        start: true,\n        move: true,\n        end: true\n      },\n      methodDict: {},\n      phaselessTypes: {}\n    };\n    this.interactStatic = createInteractStatic(this);\n    this.InteractEvent = InteractEvent_InteractEvent;\n    this.Interactable = void 0;\n    this.interactables = new InteractableSet_InteractableSet(this);\n    this._win = void 0;\n    this.document = void 0;\n    this.window = void 0;\n    this.documents = [];\n    this._plugins = {\n      list: [],\n      map: {}\n    };\n\n    this.onWindowUnload = event => this.removeDocument(event.target);\n\n    const scope = this;\n    this.Interactable = class extends Interactable_Interactable {\n      get _defaults() {\n        return scope.defaults;\n      }\n\n      set(options) {\n        super.set(options);\n        scope.fire('interactable:set', {\n          options,\n          interactable: this\n        });\n        return this;\n      }\n\n      unset() {\n        super.unset();\n        scope.interactables.list.splice(scope.interactables.list.indexOf(this), 1);\n        scope.fire('interactable:unset', {\n          interactable: this\n        });\n      }\n\n    };\n  }\n\n  addListeners(map, id) {\n    this.listenerMaps.push({\n      id,\n      map\n    });\n  }\n\n  fire(name, arg) {\n    for (const {\n      map: {\n        [name]: listener\n      }\n    } of this.listenerMaps) {\n      if (!!listener && listener(arg, this, name) === false) {\n        return false;\n      }\n    }\n  }\n\n  init(window) {\n    return this.isInitialized ? this : initScope(this, window);\n  }\n\n  pluginIsInstalled(plugin) {\n    return this._plugins.map[plugin.id] || this._plugins.list.indexOf(plugin) !== -1;\n  }\n\n  usePlugin(plugin, options) {\n    if (!this.isInitialized) {\n      return this;\n    }\n\n    if (this.pluginIsInstalled(plugin)) {\n      return this;\n    }\n\n    if (plugin.id) {\n      this._plugins.map[plugin.id] = plugin;\n    }\n\n    this._plugins.list.push(plugin);\n\n    if (plugin.install) {\n      plugin.install(this, options);\n    }\n\n    if (plugin.listeners && plugin.before) {\n      let index = 0;\n      const len = this.listenerMaps.length;\n      const before = plugin.before.reduce((acc, id) => {\n        acc[id] = true;\n        acc[pluginIdRoot(id)] = true;\n        return acc;\n      }, {});\n\n      for (; index < len; index++) {\n        const otherId = this.listenerMaps[index].id;\n\n        if (before[otherId] || before[pluginIdRoot(otherId)]) {\n          break;\n        }\n      }\n\n      this.listenerMaps.splice(index, 0, {\n        id: plugin.id,\n        map: plugin.listeners\n      });\n    } else if (plugin.listeners) {\n      this.listenerMaps.push({\n        id: plugin.id,\n        map: plugin.listeners\n      });\n    }\n\n    return this;\n  }\n\n  addDocument(doc, options) {\n    // do nothing if document is already known\n    if (this.getDocIndex(doc) !== -1) {\n      return false;\n    }\n\n    const window = getWindow(doc);\n    options = options ? extend({}, options) : {};\n    this.documents.push({\n      doc,\n      options\n    });\n    this.events.documents.push(doc); // don't add an unload event for the main document\n    // so that the page may be cached in browser history\n\n    if (doc !== this.document) {\n      this.events.add(window, 'unload', this.onWindowUnload);\n    }\n\n    this.fire('scope:add-document', {\n      doc,\n      window,\n      scope: this,\n      options\n    });\n  }\n\n  removeDocument(doc) {\n    const index = this.getDocIndex(doc);\n    const window = getWindow(doc);\n    const options = this.documents[index].options;\n    this.events.remove(window, 'unload', this.onWindowUnload);\n    this.documents.splice(index, 1);\n    this.events.documents.splice(index, 1);\n    this.fire('scope:remove-document', {\n      doc,\n      window,\n      scope: this,\n      options\n    });\n  }\n\n  getDocIndex(doc) {\n    for (let i = 0; i < this.documents.length; i++) {\n      if (this.documents[i].doc === doc) {\n        return i;\n      }\n    }\n\n    return -1;\n  }\n\n  getDocOptions(doc) {\n    const docIndex = this.getDocIndex(doc);\n    return docIndex === -1 ? null : this.documents[docIndex].options;\n  }\n\n  now() {\n    return (this.window.Date || Date).now();\n  }\n\n}\nfunction initScope(scope, window) {\n  scope.isInitialized = true;\n  window_init(window);\n  utils_domObjects.init(window);\n  utils_browser.init(window);\n  raf.init(window);\n  scope.window = window;\n  scope.document = window.document;\n  scope.usePlugin(core_interactions);\n  scope.usePlugin(events);\n  return scope;\n}\n\nfunction pluginIdRoot(id) {\n  return id && id.replace(/\\/.*$/, '');\n}\n//# sourceMappingURL=scope.js.map\n// CONCATENATED MODULE: ./node_modules/@interactjs/interact/index.js\n\nconst interact_scope = new scope_Scope();\nconst interact_interact = interact_scope.interactStatic;\n/* harmony default export */ var _interactjs_interact = (interact_interact);\nconst interact_init = win => interact_scope.init(win);\n\nif (typeof window === 'object' && !!window) {\n  interact_init(window);\n}\n//# sourceMappingURL=index.js.map\n// CONCATENATED MODULE: ./node_modules/@interactjs/auto-start/InteractableMethods.js\n\n\n\n\nfunction InteractableMethods_install(scope) {\n  const {\n    /** @lends Interactable */\n    Interactable // tslint:disable-line no-shadowed-variable\n\n  } = scope;\n\n  Interactable.prototype.getAction = function getAction(pointer, event, interaction, element) {\n    const action = defaultActionChecker(this, event, interaction, element, scope);\n\n    if (this.options.actionChecker) {\n      return this.options.actionChecker(pointer, event, action, this, element, interaction);\n    }\n\n    return action;\n  };\n  /**\n   * If the target of the `mousedown`, `pointerdown` or `touchstart` event or any\n   * of it's parents match the given CSS selector or Element, no\n   * drag/resize/gesture is started.\n   *\n   * @deprecated\n   * Don't use this method. Instead set the `ignoreFrom` option for each action\n   * or for `pointerEvents`\n   *\n   * ```js\n   * interact(targett)\n   *   .draggable({\n   *     ignoreFrom: 'input, textarea, a[href]'',\n   *   })\n   *   .pointerEvents({\n   *     ignoreFrom: '[no-pointer]',\n   *   })\n   * ```\n   *\n   * @param {string | Element | null} [newValue] a CSS selector string, an\n   * Element or `null` to not ignore any elements\n   * @return {string | Element | object} The current ignoreFrom value or this\n   * Interactable\n   */\n\n\n  Interactable.prototype.ignoreFrom = warnOnce(function (newValue) {\n    return this._backCompatOption('ignoreFrom', newValue);\n  }, 'Interactable.ignoreFrom() has been deprecated. Use Interactble.draggable({ignoreFrom: newValue}).');\n  /**\n   *\n   * A drag/resize/gesture is started only If the target of the `mousedown`,\n   * `pointerdown` or `touchstart` event or any of it's parents match the given\n   * CSS selector or Element.\n   *\n   * @deprecated\n   * Don't use this method. Instead set the `allowFrom` option for each action\n   * or for `pointerEvents`\n   *\n   * ```js\n   * interact(targett)\n   *   .resizable({\n   *     allowFrom: '.resize-handle',\n   *   .pointerEvents({\n   *     allowFrom: '.handle',,\n   *   })\n   * ```\n   *\n   * @param {string | Element | null} [newValue] a CSS selector string, an\n   * Element or `null` to allow from any element\n   * @return {string | Element | object} The current allowFrom value or this\n   * Interactable\n   */\n\n  Interactable.prototype.allowFrom = warnOnce(function (newValue) {\n    return this._backCompatOption('allowFrom', newValue);\n  }, 'Interactable.allowFrom() has been deprecated. Use Interactble.draggable({allowFrom: newValue}).');\n  /**\n   * ```js\n   * interact('.resize-drag')\n   *   .resizable(true)\n   *   .draggable(true)\n   *   .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n   *\n   *     if (interact.matchesSelector(event.target, '.drag-handle')) {\n   *       // force drag with handle target\n   *       action.name = drag\n   *     }\n   *     else {\n   *       // resize from the top and right edges\n   *       action.name  = 'resize'\n   *       action.edges = { top: true, right: true }\n   *     }\n   *\n   *     return action\n   * })\n   * ```\n   *\n   * Returns or sets the function used to check action to be performed on\n   * pointerDown\n   *\n   * @param {function | null} [checker] A function which takes a pointer event,\n   * defaultAction string, interactable, element and interaction as parameters\n   * and returns an object with name property 'drag' 'resize' or 'gesture' and\n   * optionally an `edges` object with boolean 'top', 'left', 'bottom' and right\n   * props.\n   * @return {Function | Interactable} The checker function or this Interactable\n   */\n\n  Interactable.prototype.actionChecker = actionChecker;\n  /**\n   * Returns or sets whether the the cursor should be changed depending on the\n   * action that would be performed if the mouse were pressed and dragged.\n   *\n   * @param {boolean} [newValue]\n   * @return {boolean | Interactable} The current setting or this Interactable\n   */\n\n  Interactable.prototype.styleCursor = styleCursor;\n}\n\nfunction defaultActionChecker(interactable, event, interaction, element, scope) {\n  const rect = interactable.getRect(element);\n  const buttons = event.buttons || {\n    0: 1,\n    1: 4,\n    3: 8,\n    4: 16\n  }[event.button];\n  const arg = {\n    action: null,\n    interactable,\n    interaction,\n    element,\n    rect,\n    buttons\n  };\n  scope.fire('auto-start:check', arg);\n  return arg.action;\n}\n\nfunction styleCursor(newValue) {\n  if (is.bool(newValue)) {\n    this.options.styleCursor = newValue;\n    return this;\n  }\n\n  if (newValue === null) {\n    delete this.options.styleCursor;\n    return this;\n  }\n\n  return this.options.styleCursor;\n}\n\nfunction actionChecker(checker) {\n  if (is.func(checker)) {\n    this.options.actionChecker = checker;\n    return this;\n  }\n\n  if (checker === null) {\n    delete this.options.actionChecker;\n    return this;\n  }\n\n  return this.options.actionChecker;\n}\n\n/* harmony default export */ var InteractableMethods = ({\n  id: 'auto-start/interactableMethods',\n  install: InteractableMethods_install\n});\n//# sourceMappingURL=InteractableMethods.js.map\n// CONCATENATED MODULE: ./node_modules/@interactjs/auto-start/base.js\n\n\n\n\n\n\n\nfunction base_install(scope) {\n  const {\n    interactStatic: interact,\n    defaults\n  } = scope;\n  scope.usePlugin(InteractableMethods);\n  defaults.base.actionChecker = null;\n  defaults.base.styleCursor = true;\n  extend(defaults.perAction, {\n    manualStart: false,\n    max: Infinity,\n    maxPerElement: 1,\n    allowFrom: null,\n    ignoreFrom: null,\n    // only allow left button by default\n    // see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons#Return_value\n    mouseButtons: 1\n  });\n  /**\n   * Returns or sets the maximum number of concurrent interactions allowed.  By\n   * default only 1 interaction is allowed at a time (for backwards\n   * compatibility). To allow multiple interactions on the same Interactables and\n   * elements, you need to enable it in the draggable, resizable and gesturable\n   * `'max'` and `'maxPerElement'` options.\n   *\n   * @alias module:interact.maxInteractions\n   *\n   * @param {number} [newValue] Any number. newValue <= 0 means no interactions.\n   */\n\n  interact.maxInteractions = newValue => maxInteractions(newValue, scope);\n\n  scope.autoStart = {\n    // Allow this many interactions to happen simultaneously\n    maxInteractions: Infinity,\n    withinInteractionLimit,\n    cursorElement: null\n  };\n}\n\nfunction prepareOnDown({\n  interaction,\n  pointer,\n  event,\n  eventTarget\n}, scope) {\n  if (interaction.interacting()) {\n    return;\n  }\n\n  const actionInfo = getActionInfo(interaction, pointer, event, eventTarget, scope);\n  prepare(interaction, actionInfo, scope);\n}\n\nfunction prepareOnMove({\n  interaction,\n  pointer,\n  event,\n  eventTarget\n}, scope) {\n  if (interaction.pointerType !== 'mouse' || interaction.pointerIsDown || interaction.interacting()) {\n    return;\n  }\n\n  const actionInfo = getActionInfo(interaction, pointer, event, eventTarget, scope);\n  prepare(interaction, actionInfo, scope);\n}\n\nfunction startOnMove(arg, scope) {\n  const {\n    interaction\n  } = arg;\n\n  if (!interaction.pointerIsDown || interaction.interacting() || !interaction.pointerWasMoved || !interaction.prepared.name) {\n    return;\n  }\n\n  scope.fire('autoStart:before-start', arg);\n  const {\n    interactable\n  } = interaction;\n  const actionName = interaction.prepared.name;\n\n  if (actionName && interactable) {\n    // check manualStart and interaction limit\n    if (interactable.options[actionName].manualStart || !withinInteractionLimit(interactable, interaction.element, interaction.prepared, scope)) {\n      interaction.stop();\n    } else {\n      interaction.start(interaction.prepared, interactable, interaction.element);\n      setInteractionCursor(interaction, scope);\n    }\n  }\n}\n\nfunction clearCursorOnStop({\n  interaction\n}, scope) {\n  const {\n    interactable\n  } = interaction;\n\n  if (interactable && interactable.options.styleCursor) {\n    setCursor(interaction.element, '', scope);\n  }\n} // Check if the current interactable supports the action.\n// If so, return the validated action. Otherwise, return null\n\n\nfunction validateAction(action, interactable, element, eventTarget, scope) {\n  if (interactable.testIgnoreAllow(interactable.options[action.name], element, eventTarget) && interactable.options[action.name].enabled && withinInteractionLimit(interactable, element, action, scope)) {\n    return action;\n  }\n\n  return null;\n}\n\nfunction validateMatches(interaction, pointer, event, matches, matchElements, eventTarget, scope) {\n  for (let i = 0, len = matches.length; i < len; i++) {\n    const match = matches[i];\n    const matchElement = matchElements[i];\n    const matchAction = match.getAction(pointer, event, interaction, matchElement);\n\n    if (!matchAction) {\n      continue;\n    }\n\n    const action = validateAction(matchAction, match, matchElement, eventTarget, scope);\n\n    if (action) {\n      return {\n        action,\n        interactable: match,\n        element: matchElement\n      };\n    }\n  }\n\n  return {\n    action: null,\n    interactable: null,\n    element: null\n  };\n}\n\nfunction getActionInfo(interaction, pointer, event, eventTarget, scope) {\n  let matches = [];\n  let matchElements = [];\n  let element = eventTarget;\n\n  function pushMatches(interactable) {\n    matches.push(interactable);\n    matchElements.push(element);\n  }\n\n  while (is.element(element)) {\n    matches = [];\n    matchElements = [];\n    scope.interactables.forEachMatch(element, pushMatches);\n    const actionInfo = validateMatches(interaction, pointer, event, matches, matchElements, eventTarget, scope);\n\n    if (actionInfo.action && !actionInfo.interactable.options[actionInfo.action.name].manualStart) {\n      return actionInfo;\n    }\n\n    element = parentNode(element);\n  }\n\n  return {\n    action: null,\n    interactable: null,\n    element: null\n  };\n}\n\nfunction prepare(interaction, {\n  action,\n  interactable,\n  element\n}, scope) {\n  action = action || {\n    name: null\n  };\n  interaction.interactable = interactable;\n  interaction.element = element;\n  copyAction(interaction.prepared, action);\n  interaction.rect = interactable && action.name ? interactable.getRect(element) : null;\n  setInteractionCursor(interaction, scope);\n  scope.fire('autoStart:prepared', {\n    interaction\n  });\n}\n\nfunction withinInteractionLimit(interactable, element, action, scope) {\n  const options = interactable.options;\n  const maxActions = options[action.name].max;\n  const maxPerElement = options[action.name].maxPerElement;\n  const autoStartMax = scope.autoStart.maxInteractions;\n  let activeInteractions = 0;\n  let interactableCount = 0;\n  let elementCount = 0; // no actions if any of these values == 0\n\n  if (!(maxActions && maxPerElement && autoStartMax)) {\n    return false;\n  }\n\n  for (const interaction of scope.interactions.list) {\n    const otherAction = interaction.prepared.name;\n\n    if (!interaction.interacting()) {\n      continue;\n    }\n\n    activeInteractions++;\n\n    if (activeInteractions >= autoStartMax) {\n      return false;\n    }\n\n    if (interaction.interactable !== interactable) {\n      continue;\n    }\n\n    interactableCount += otherAction === action.name ? 1 : 0;\n\n    if (interactableCount >= maxActions) {\n      return false;\n    }\n\n    if (interaction.element === element) {\n      elementCount++;\n\n      if (otherAction === action.name && elementCount >= maxPerElement) {\n        return false;\n      }\n    }\n  }\n\n  return autoStartMax > 0;\n}\n\nfunction maxInteractions(newValue, scope) {\n  if (is.number(newValue)) {\n    scope.autoStart.maxInteractions = newValue;\n    return this;\n  }\n\n  return scope.autoStart.maxInteractions;\n}\n\nfunction setCursor(element, cursor, scope) {\n  const {\n    cursorElement: prevCursorElement\n  } = scope.autoStart;\n\n  if (prevCursorElement && prevCursorElement !== element) {\n    prevCursorElement.style.cursor = '';\n  }\n\n  element.ownerDocument.documentElement.style.cursor = cursor;\n  element.style.cursor = cursor;\n  scope.autoStart.cursorElement = cursor ? element : null;\n}\n\nfunction setInteractionCursor(interaction, scope) {\n  const {\n    interactable,\n    element,\n    prepared\n  } = interaction;\n\n  if (!(interaction.pointerType === 'mouse' && interactable && interactable.options.styleCursor)) {\n    // clear previous target element cursor\n    if (scope.autoStart.cursorElement) {\n      setCursor(scope.autoStart.cursorElement, '', scope);\n    }\n\n    return;\n  }\n\n  let cursor = '';\n\n  if (prepared.name) {\n    const cursorChecker = interactable.options[prepared.name].cursorChecker;\n\n    if (is.func(cursorChecker)) {\n      cursor = cursorChecker(prepared, interactable, element, interaction._interacting);\n    } else {\n      cursor = scope.actions.map[prepared.name].getCursor(prepared);\n    }\n  }\n\n  setCursor(interaction.element, cursor || '', scope);\n}\n\nconst autoStart = {\n  id: 'auto-start/base',\n  before: ['actions'],\n  install: base_install,\n  listeners: {\n    'interactions:down': prepareOnDown,\n    'interactions:move': (arg, scope) => {\n      prepareOnMove(arg, scope);\n      startOnMove(arg, scope);\n    },\n    'interactions:stop': clearCursorOnStop\n  },\n  maxInteractions,\n  withinInteractionLimit,\n  validateAction\n};\n/* harmony default export */ var base = (autoStart);\n//# sourceMappingURL=base.js.map\n// CONCATENATED MODULE: ./node_modules/@interactjs/auto-start/dragAxis.js\n\n\n\n\nfunction beforeStart({\n  interaction,\n  eventTarget,\n  dx,\n  dy\n}, scope) {\n  if (interaction.prepared.name !== 'drag') {\n    return;\n  } // check if a drag is in the correct axis\n\n\n  const absX = Math.abs(dx);\n  const absY = Math.abs(dy);\n  const targetOptions = interaction.interactable.options.drag;\n  const startAxis = targetOptions.startAxis;\n  const currentAxis = absX > absY ? 'x' : absX < absY ? 'y' : 'xy';\n  interaction.prepared.axis = targetOptions.lockAxis === 'start' ? currentAxis[0] // always lock to one axis even if currentAxis === 'xy'\n  : targetOptions.lockAxis; // if the movement isn't in the startAxis of the interactable\n\n  if (currentAxis !== 'xy' && startAxis !== 'xy' && startAxis !== currentAxis) {\n    // cancel the prepared action\n    interaction.prepared.name = null; // then try to get a drag from another ineractable\n\n    let element = eventTarget;\n\n    const getDraggable = function (interactable) {\n      if (interactable === interaction.interactable) {\n        return;\n      }\n\n      const options = interaction.interactable.options.drag;\n\n      if (!options.manualStart && interactable.testIgnoreAllow(options, element, eventTarget)) {\n        const action = interactable.getAction(interaction.downPointer, interaction.downEvent, interaction, element);\n\n        if (action && action.name === 'drag' && checkStartAxis(currentAxis, interactable) && base.validateAction(action, interactable, element, eventTarget, scope)) {\n          return interactable;\n        }\n      }\n    }; // check all interactables\n\n\n    while (is.element(element)) {\n      const interactable = scope.interactables.forEachMatch(element, getDraggable);\n\n      if (interactable) {\n        interaction.prepared.name = 'drag';\n        interaction.interactable = interactable;\n        interaction.element = element;\n        break;\n      }\n\n      element = parentNode(element);\n    }\n  }\n}\n\nfunction checkStartAxis(startAxis, interactable) {\n  if (!interactable) {\n    return false;\n  }\n\n  const thisAxis = interactable.options.drag.startAxis;\n  return startAxis === 'xy' || thisAxis === 'xy' || thisAxis === startAxis;\n}\n\n/* harmony default export */ var dragAxis = ({\n  id: 'auto-start/dragAxis',\n  listeners: {\n    'autoStart:before-start': beforeStart\n  }\n});\n//# sourceMappingURL=dragAxis.js.map\n// CONCATENATED MODULE: ./node_modules/@interactjs/auto-start/hold.js\n\n\n\nfunction hold_install(scope) {\n  const {\n    defaults\n  } = scope;\n  scope.usePlugin(base);\n  defaults.perAction.hold = 0;\n  defaults.perAction.delay = 0;\n}\n\nfunction getHoldDuration(interaction) {\n  const actionName = interaction.prepared && interaction.prepared.name;\n\n  if (!actionName) {\n    return null;\n  }\n\n  const options = interaction.interactable.options;\n  return options[actionName].hold || options[actionName].delay;\n}\n\nconst hold = {\n  id: 'auto-start/hold',\n  install: hold_install,\n  listeners: {\n    'interactions:new': ({\n      interaction\n    }) => {\n      interaction.autoStartHoldTimer = null;\n    },\n    'autoStart:prepared': ({\n      interaction\n    }) => {\n      const hold = getHoldDuration(interaction);\n\n      if (hold > 0) {\n        interaction.autoStartHoldTimer = setTimeout(() => {\n          interaction.start(interaction.prepared, interaction.interactable, interaction.element);\n        }, hold);\n      }\n    },\n    'interactions:move': ({\n      interaction,\n      duplicate\n    }) => {\n      if (interaction.autoStartHoldTimer && interaction.pointerWasMoved && !duplicate) {\n        clearTimeout(interaction.autoStartHoldTimer);\n        interaction.autoStartHoldTimer = null;\n      }\n    },\n    // prevent regular down->move autoStart\n    'autoStart:before-start': ({\n      interaction\n    }) => {\n      const holdDuration = getHoldDuration(interaction);\n\n      if (holdDuration > 0) {\n        interaction.prepared.name = null;\n      }\n    }\n  },\n  getHoldDuration\n};\n/* harmony default export */ var auto_start_hold = (hold);\n//# sourceMappingURL=hold.js.map\n// CONCATENATED MODULE: ./node_modules/@interactjs/auto-start/plugin.js\n\n\n\n/* harmony default export */ var auto_start_plugin = ({\n  id: 'auto-start',\n\n  install(scope) {\n    scope.usePlugin(base);\n    scope.usePlugin(auto_start_hold);\n    scope.usePlugin(dragAxis);\n  }\n\n});\n//# sourceMappingURL=plugin.js.map\n// CONCATENATED MODULE: ./node_modules/@interactjs/auto-start/index.js\n/* eslint-disable import/order, no-console, eol-last */\n\n\n\nif (typeof window === 'object' && !!window) {\n  interact_init(window);\n}\n\n_interactjs_interact.use(auto_start_plugin);\n//# sourceMappingURL=index.js.map\n// CONCATENATED MODULE: ./node_modules/@interactjs/auto-scroll/plugin.js\n\n\n\n\n\n\n\nfunction plugin_install(scope) {\n  const {\n    defaults,\n    actions\n  } = scope;\n  scope.autoScroll = autoScroll;\n\n  autoScroll.now = () => scope.now();\n\n  actions.phaselessTypes.autoscroll = true;\n  defaults.perAction.autoScroll = autoScroll.defaults;\n}\n\nconst autoScroll = {\n  defaults: {\n    enabled: false,\n    margin: 60,\n    // the item that is scrolled (Window or HTMLElement)\n    container: null,\n    // the scroll speed in pixels per second\n    speed: 300\n  },\n  now: Date.now,\n  interaction: null,\n  i: 0,\n  // the handle returned by window.setInterval\n  // Direction each pulse is to scroll in\n  x: 0,\n  y: 0,\n  isScrolling: false,\n  prevTime: 0,\n  margin: 0,\n  speed: 0,\n\n  start(interaction) {\n    autoScroll.isScrolling = true;\n    raf.cancel(autoScroll.i);\n    interaction.autoScroll = autoScroll;\n    autoScroll.interaction = interaction;\n    autoScroll.prevTime = autoScroll.now();\n    autoScroll.i = raf.request(autoScroll.scroll);\n  },\n\n  stop() {\n    autoScroll.isScrolling = false;\n\n    if (autoScroll.interaction) {\n      autoScroll.interaction.autoScroll = null;\n    }\n\n    raf.cancel(autoScroll.i);\n  },\n\n  // scroll the window by the values in scroll.x/y\n  scroll() {\n    const {\n      interaction\n    } = autoScroll;\n    const {\n      interactable,\n      element\n    } = interaction;\n    const actionName = interaction.prepared.name;\n    const options = interactable.options[actionName].autoScroll;\n    const container = getContainer(options.container, interactable, element);\n    const now = autoScroll.now(); // change in time in seconds\n\n    const dt = (now - autoScroll.prevTime) / 1000; // displacement\n\n    const s = options.speed * dt;\n\n    if (s >= 1) {\n      const scrollBy = {\n        x: autoScroll.x * s,\n        y: autoScroll.y * s\n      };\n\n      if (scrollBy.x || scrollBy.y) {\n        const prevScroll = getScroll(container);\n\n        if (is.window(container)) {\n          container.scrollBy(scrollBy.x, scrollBy.y);\n        } else if (container) {\n          container.scrollLeft += scrollBy.x;\n          container.scrollTop += scrollBy.y;\n        }\n\n        const curScroll = getScroll(container);\n        const delta = {\n          x: curScroll.x - prevScroll.x,\n          y: curScroll.y - prevScroll.y\n        };\n\n        if (delta.x || delta.y) {\n          interactable.fire({\n            type: 'autoscroll',\n            target: element,\n            interactable,\n            delta,\n            interaction,\n            container\n          });\n        }\n      }\n\n      autoScroll.prevTime = now;\n    }\n\n    if (autoScroll.isScrolling) {\n      raf.cancel(autoScroll.i);\n      autoScroll.i = raf.request(autoScroll.scroll);\n    }\n  },\n\n  check(interactable, actionName) {\n    var _options$actionName$a;\n\n    const options = interactable.options;\n    return (_options$actionName$a = options[actionName].autoScroll) == null ? void 0 : _options$actionName$a.enabled;\n  },\n\n  onInteractionMove({\n    interaction,\n    pointer\n  }) {\n    if (!(interaction.interacting() && autoScroll.check(interaction.interactable, interaction.prepared.name))) {\n      return;\n    }\n\n    if (interaction.simulation) {\n      autoScroll.x = autoScroll.y = 0;\n      return;\n    }\n\n    let top;\n    let right;\n    let bottom;\n    let left;\n    const {\n      interactable,\n      element\n    } = interaction;\n    const actionName = interaction.prepared.name;\n    const options = interactable.options[actionName].autoScroll;\n    const container = getContainer(options.container, interactable, element);\n\n    if (is.window(container)) {\n      left = pointer.clientX < autoScroll.margin;\n      top = pointer.clientY < autoScroll.margin;\n      right = pointer.clientX > container.innerWidth - autoScroll.margin;\n      bottom = pointer.clientY > container.innerHeight - autoScroll.margin;\n    } else {\n      const rect = getElementClientRect(container);\n      left = pointer.clientX < rect.left + autoScroll.margin;\n      top = pointer.clientY < rect.top + autoScroll.margin;\n      right = pointer.clientX > rect.right - autoScroll.margin;\n      bottom = pointer.clientY > rect.bottom - autoScroll.margin;\n    }\n\n    autoScroll.x = right ? 1 : left ? -1 : 0;\n    autoScroll.y = bottom ? 1 : top ? -1 : 0;\n\n    if (!autoScroll.isScrolling) {\n      // set the autoScroll properties to those of the target\n      autoScroll.margin = options.margin;\n      autoScroll.speed = options.speed;\n      autoScroll.start(interaction);\n    }\n  }\n\n};\nfunction getContainer(value, interactable, element) {\n  return (is.string(value) ? getStringOptionResult(value, interactable, element) : value) || getWindow(element);\n}\nfunction getScroll(container) {\n  if (is.window(container)) {\n    container = window.document.body;\n  }\n\n  return {\n    x: container.scrollLeft,\n    y: container.scrollTop\n  };\n}\nfunction getScrollSize(container) {\n  if (is.window(container)) {\n    container = window.document.body;\n  }\n\n  return {\n    x: container.scrollWidth,\n    y: container.scrollHeight\n  };\n}\nfunction getScrollSizeDelta({\n  interaction,\n  element\n}, func) {\n  const scrollOptions = interaction && interaction.interactable.options[interaction.prepared.name].autoScroll;\n\n  if (!scrollOptions || !scrollOptions.enabled) {\n    func();\n    return {\n      x: 0,\n      y: 0\n    };\n  }\n\n  const scrollContainer = getContainer(scrollOptions.container, interaction.interactable, element);\n  const prevSize = getScroll(scrollContainer);\n  func();\n  const curSize = getScroll(scrollContainer);\n  return {\n    x: curSize.x - prevSize.x,\n    y: curSize.y - prevSize.y\n  };\n}\nconst autoScrollPlugin = {\n  id: 'auto-scroll',\n  install: plugin_install,\n  listeners: {\n    'interactions:new': ({\n      interaction\n    }) => {\n      interaction.autoScroll = null;\n    },\n    'interactions:destroy': ({\n      interaction\n    }) => {\n      interaction.autoScroll = null;\n      autoScroll.stop();\n\n      if (autoScroll.interaction) {\n        autoScroll.interaction = null;\n      }\n    },\n    'interactions:stop': autoScroll.stop,\n    'interactions:action-move': arg => autoScroll.onInteractionMove(arg)\n  }\n};\n/* harmony default export */ var auto_scroll_plugin = (autoScrollPlugin);\n//# sourceMappingURL=plugin.js.map\n// CONCATENATED MODULE: ./node_modules/@interactjs/auto-scroll/index.js\n/* eslint-disable import/order, no-console, eol-last */\n\n\n\nif (typeof window === 'object' && !!window) {\n  interact_init(window);\n}\n\n_interactjs_interact.use(auto_scroll_plugin);\n//# sourceMappingURL=index.js.map\n// CONCATENATED MODULE: ./node_modules/@interactjs/actions/drag/plugin.js\n\n\n\nfunction drag_plugin_install(scope) {\n  const {\n    actions,\n    Interactable,\n    defaults\n  } = scope;\n  Interactable.prototype.draggable = drag.draggable;\n  actions.map.drag = drag;\n  actions.methodDict.drag = 'draggable';\n  defaults.actions.drag = drag.defaults;\n}\n\nfunction beforeMove({\n  interaction\n}) {\n  if (interaction.prepared.name !== 'drag') {\n    return;\n  }\n\n  const axis = interaction.prepared.axis;\n\n  if (axis === 'x') {\n    interaction.coords.cur.page.y = interaction.coords.start.page.y;\n    interaction.coords.cur.client.y = interaction.coords.start.client.y;\n    interaction.coords.velocity.client.y = 0;\n    interaction.coords.velocity.page.y = 0;\n  } else if (axis === 'y') {\n    interaction.coords.cur.page.x = interaction.coords.start.page.x;\n    interaction.coords.cur.client.x = interaction.coords.start.client.x;\n    interaction.coords.velocity.client.x = 0;\n    interaction.coords.velocity.page.x = 0;\n  }\n}\n\nfunction move({\n  iEvent,\n  interaction\n}) {\n  if (interaction.prepared.name !== 'drag') {\n    return;\n  }\n\n  const axis = interaction.prepared.axis;\n\n  if (axis === 'x' || axis === 'y') {\n    const opposite = axis === 'x' ? 'y' : 'x';\n    iEvent.page[opposite] = interaction.coords.start.page[opposite];\n    iEvent.client[opposite] = interaction.coords.start.client[opposite];\n    iEvent.delta[opposite] = 0;\n  }\n}\n/**\n * ```js\n * interact(element).draggable({\n *     onstart: function (event) {},\n *     onmove : function (event) {},\n *     onend  : function (event) {},\n *\n *     // the axis in which the first movement must be\n *     // for the drag sequence to start\n *     // 'xy' by default - any direction\n *     startAxis: 'x' || 'y' || 'xy',\n *\n *     // 'xy' by default - don't restrict to one axis (move in any direction)\n *     // 'x' or 'y' to restrict movement to either axis\n *     // 'start' to restrict movement to the axis the drag started in\n *     lockAxis: 'x' || 'y' || 'xy' || 'start',\n *\n *     // max number of drags that can happen concurrently\n *     // with elements of this Interactable. Infinity by default\n *     max: Infinity,\n *\n *     // max number of drags that can target the same element+Interactable\n *     // 1 by default\n *     maxPerElement: 2\n * })\n *\n * var isDraggable = interact('element').draggable(); // true\n * ```\n *\n * Get or set whether drag actions can be performed on the target\n *\n * @alias Interactable.prototype.draggable\n *\n * @param {boolean | object} [options] true/false or An object with event\n * listeners to be fired on drag events (object makes the Interactable\n * draggable)\n * @return {boolean | Interactable} boolean indicating if this can be the\n * target of drag events, or this Interctable\n */\n\n\nconst plugin_draggable = function draggable(options) {\n  if (is.object(options)) {\n    this.options.drag.enabled = options.enabled !== false;\n    this.setPerAction('drag', options);\n    this.setOnEvents('drag', options);\n\n    if (/^(xy|x|y|start)$/.test(options.lockAxis)) {\n      this.options.drag.lockAxis = options.lockAxis;\n    }\n\n    if (/^(xy|x|y)$/.test(options.startAxis)) {\n      this.options.drag.startAxis = options.startAxis;\n    }\n\n    return this;\n  }\n\n  if (is.bool(options)) {\n    this.options.drag.enabled = options;\n    return this;\n  }\n\n  return this.options.drag;\n};\n\nconst drag = {\n  id: 'actions/drag',\n  install: drag_plugin_install,\n  listeners: {\n    'interactions:before-action-move': beforeMove,\n    'interactions:action-resume': beforeMove,\n    // dragmove\n    'interactions:action-move': move,\n    'auto-start:check': arg => {\n      const {\n        interaction,\n        interactable,\n        buttons\n      } = arg;\n      const dragOptions = interactable.options.drag;\n\n      if (!(dragOptions && dragOptions.enabled) || // check mouseButton setting if the pointer is down\n      interaction.pointerIsDown && /mouse|pointer/.test(interaction.pointerType) && (buttons & interactable.options.drag.mouseButtons) === 0) {\n        return undefined;\n      }\n\n      arg.action = {\n        name: 'drag',\n        axis: dragOptions.lockAxis === 'start' ? dragOptions.startAxis : dragOptions.lockAxis\n      };\n      return false;\n    }\n  },\n  draggable: plugin_draggable,\n  beforeMove,\n  move,\n  defaults: {\n    startAxis: 'xy',\n    lockAxis: 'xy'\n  },\n\n  getCursor() {\n    return 'move';\n  }\n\n};\n/* harmony default export */ var drag_plugin = (drag);\n//# sourceMappingURL=plugin.js.map\n// CONCATENATED MODULE: ./node_modules/@interactjs/actions/drag/index.js\n/* eslint-disable import/order, no-console, eol-last */\n\n\n\nif (typeof window === 'object' && !!window) {\n  interact_init(window);\n}\n\n_interactjs_interact.use(drag_plugin);\n//# sourceMappingURL=index.js.map\n// CONCATENATED MODULE: ./node_modules/@interactjs/actions/resize/plugin.js\n\n\n\n\n\n\nfunction resize_plugin_install(scope) {\n  const {\n    actions,\n    browser,\n\n    /** @lends Interactable */\n    Interactable,\n    // tslint:disable-line no-shadowed-variable\n    defaults\n  } = scope; // Less Precision with touch input\n\n  resize.cursors = initCursors(browser);\n  resize.defaultMargin = browser.supportsTouch || browser.supportsPointerEvent ? 20 : 10;\n  /**\n   * ```js\n   * interact(element).resizable({\n   *   onstart: function (event) {},\n   *   onmove : function (event) {},\n   *   onend  : function (event) {},\n   *\n   *   edges: {\n   *     top   : true,       // Use pointer coords to check for resize.\n   *     left  : false,      // Disable resizing from left edge.\n   *     bottom: '.resize-s',// Resize if pointer target matches selector\n   *     right : handleEl    // Resize if pointer target is the given Element\n   *   },\n   *\n   *     // Width and height can be adjusted independently. When `true`, width and\n   *     // height are adjusted at a 1:1 ratio.\n   *     square: false,\n   *\n   *     // Width and height can be adjusted independently. When `true`, width and\n   *     // height maintain the aspect ratio they had when resizing started.\n   *     preserveAspectRatio: false,\n   *\n   *   // a value of 'none' will limit the resize rect to a minimum of 0x0\n   *   // 'negate' will allow the rect to have negative width/height\n   *   // 'reposition' will keep the width/height positive by swapping\n   *   // the top and bottom edges and/or swapping the left and right edges\n   *   invert: 'none' || 'negate' || 'reposition'\n   *\n   *   // limit multiple resizes.\n   *   // See the explanation in the {@link Interactable.draggable} example\n   *   max: Infinity,\n   *   maxPerElement: 1,\n   * })\n   *\n   * var isResizeable = interact(element).resizable()\n   * ```\n   *\n   * Gets or sets whether resize actions can be performed on the target\n   *\n   * @param {boolean | object} [options] true/false or An object with event\n   * listeners to be fired on resize events (object makes the Interactable\n   * resizable)\n   * @return {boolean | Interactable} A boolean indicating if this can be the\n   * target of resize elements, or this Interactable\n   */\n\n  Interactable.prototype.resizable = function (options) {\n    return resizable(this, options, scope);\n  };\n\n  actions.map.resize = resize;\n  actions.methodDict.resize = 'resizable';\n  defaults.actions.resize = resize.defaults;\n}\n\nfunction resizeChecker(arg) {\n  const {\n    interaction,\n    interactable,\n    element,\n    rect,\n    buttons\n  } = arg;\n\n  if (!rect) {\n    return undefined;\n  }\n\n  const page = extend({}, interaction.coords.cur.page);\n  const resizeOptions = interactable.options.resize;\n\n  if (!(resizeOptions && resizeOptions.enabled) || // check mouseButton setting if the pointer is down\n  interaction.pointerIsDown && /mouse|pointer/.test(interaction.pointerType) && (buttons & resizeOptions.mouseButtons) === 0) {\n    return undefined;\n  } // if using resize.edges\n\n\n  if (is.object(resizeOptions.edges)) {\n    const resizeEdges = {\n      left: false,\n      right: false,\n      top: false,\n      bottom: false\n    };\n\n    for (const edge in resizeEdges) {\n      resizeEdges[edge] = checkResizeEdge(edge, resizeOptions.edges[edge], page, interaction._latestPointer.eventTarget, element, rect, resizeOptions.margin || resize.defaultMargin);\n    }\n\n    resizeEdges.left = resizeEdges.left && !resizeEdges.right;\n    resizeEdges.top = resizeEdges.top && !resizeEdges.bottom;\n\n    if (resizeEdges.left || resizeEdges.right || resizeEdges.top || resizeEdges.bottom) {\n      arg.action = {\n        name: 'resize',\n        edges: resizeEdges\n      };\n    }\n  } else {\n    const right = resizeOptions.axis !== 'y' && page.x > rect.right - resize.defaultMargin;\n    const bottom = resizeOptions.axis !== 'x' && page.y > rect.bottom - resize.defaultMargin;\n\n    if (right || bottom) {\n      arg.action = {\n        name: 'resize',\n        axes: (right ? 'x' : '') + (bottom ? 'y' : '')\n      };\n    }\n  }\n\n  return arg.action ? false : undefined;\n}\n\nfunction resizable(interactable, options, scope) {\n  if (is.object(options)) {\n    interactable.options.resize.enabled = options.enabled !== false;\n    interactable.setPerAction('resize', options);\n    interactable.setOnEvents('resize', options);\n\n    if (is.string(options.axis) && /^x$|^y$|^xy$/.test(options.axis)) {\n      interactable.options.resize.axis = options.axis;\n    } else if (options.axis === null) {\n      interactable.options.resize.axis = scope.defaults.actions.resize.axis;\n    }\n\n    if (is.bool(options.preserveAspectRatio)) {\n      interactable.options.resize.preserveAspectRatio = options.preserveAspectRatio;\n    } else if (is.bool(options.square)) {\n      interactable.options.resize.square = options.square;\n    }\n\n    return interactable;\n  }\n\n  if (is.bool(options)) {\n    interactable.options.resize.enabled = options;\n    return interactable;\n  }\n\n  return interactable.options.resize;\n}\n\nfunction checkResizeEdge(name, value, page, element, interactableElement, rect, margin) {\n  // false, '', undefined, null\n  if (!value) {\n    return false;\n  } // true value, use pointer coords and element rect\n\n\n  if (value === true) {\n    // if dimensions are negative, \"switch\" edges\n    const width = is.number(rect.width) ? rect.width : rect.right - rect.left;\n    const height = is.number(rect.height) ? rect.height : rect.bottom - rect.top; // don't use margin greater than half the relevent dimension\n\n    margin = Math.min(margin, Math.abs((name === 'left' || name === 'right' ? width : height) / 2));\n\n    if (width < 0) {\n      if (name === 'left') {\n        name = 'right';\n      } else if (name === 'right') {\n        name = 'left';\n      }\n    }\n\n    if (height < 0) {\n      if (name === 'top') {\n        name = 'bottom';\n      } else if (name === 'bottom') {\n        name = 'top';\n      }\n    }\n\n    if (name === 'left') {\n      return page.x < (width >= 0 ? rect.left : rect.right) + margin;\n    }\n\n    if (name === 'top') {\n      return page.y < (height >= 0 ? rect.top : rect.bottom) + margin;\n    }\n\n    if (name === 'right') {\n      return page.x > (width >= 0 ? rect.right : rect.left) - margin;\n    }\n\n    if (name === 'bottom') {\n      return page.y > (height >= 0 ? rect.bottom : rect.top) - margin;\n    }\n  } // the remaining checks require an element\n\n\n  if (!is.element(element)) {\n    return false;\n  }\n\n  return is.element(value) // the value is an element to use as a resize handle\n  ? value === element // otherwise check if element matches value as selector\n  : matchesUpTo(element, value, interactableElement);\n}\n/* eslint-disable multiline-ternary */\n\n\nfunction initCursors(browser) {\n  return browser.isIe9 ? {\n    x: 'e-resize',\n    y: 's-resize',\n    xy: 'se-resize',\n    top: 'n-resize',\n    left: 'w-resize',\n    bottom: 's-resize',\n    right: 'e-resize',\n    topleft: 'se-resize',\n    bottomright: 'se-resize',\n    topright: 'ne-resize',\n    bottomleft: 'ne-resize'\n  } : {\n    x: 'ew-resize',\n    y: 'ns-resize',\n    xy: 'nwse-resize',\n    top: 'ns-resize',\n    left: 'ew-resize',\n    bottom: 'ns-resize',\n    right: 'ew-resize',\n    topleft: 'nwse-resize',\n    bottomright: 'nwse-resize',\n    topright: 'nesw-resize',\n    bottomleft: 'nesw-resize'\n  };\n}\n/* eslint-enable multiline-ternary */\n\n\nfunction start({\n  iEvent,\n  interaction\n}) {\n  if (interaction.prepared.name !== 'resize' || !interaction.prepared.edges) {\n    return;\n  }\n\n  const resizeEvent = iEvent;\n  const rect = interaction.rect;\n  interaction._rects = {\n    start: extend({}, rect),\n    corrected: extend({}, rect),\n    previous: extend({}, rect),\n    delta: {\n      left: 0,\n      right: 0,\n      width: 0,\n      top: 0,\n      bottom: 0,\n      height: 0\n    }\n  };\n  resizeEvent.edges = interaction.prepared.edges;\n  resizeEvent.rect = interaction._rects.corrected;\n  resizeEvent.deltaRect = interaction._rects.delta;\n}\n\nfunction plugin_move({\n  iEvent,\n  interaction\n}) {\n  if (interaction.prepared.name !== 'resize' || !interaction.prepared.edges) {\n    return;\n  }\n\n  const resizeEvent = iEvent;\n  const resizeOptions = interaction.interactable.options.resize;\n  const invert = resizeOptions.invert;\n  const invertible = invert === 'reposition' || invert === 'negate';\n  const current = interaction.rect;\n  const {\n    start: startRect,\n    corrected,\n    delta: deltaRect,\n    previous\n  } = interaction._rects;\n  extend(previous, corrected);\n\n  if (invertible) {\n    // if invertible, copy the current rect\n    extend(corrected, current);\n\n    if (invert === 'reposition') {\n      // swap edge values if necessary to keep width/height positive\n      if (corrected.top > corrected.bottom) {\n        const swap = corrected.top;\n        corrected.top = corrected.bottom;\n        corrected.bottom = swap;\n      }\n\n      if (corrected.left > corrected.right) {\n        const swap = corrected.left;\n        corrected.left = corrected.right;\n        corrected.right = swap;\n      }\n    }\n  } else {\n    // if not invertible, restrict to minimum of 0x0 rect\n    corrected.top = Math.min(current.top, startRect.bottom);\n    corrected.bottom = Math.max(current.bottom, startRect.top);\n    corrected.left = Math.min(current.left, startRect.right);\n    corrected.right = Math.max(current.right, startRect.left);\n  }\n\n  corrected.width = corrected.right - corrected.left;\n  corrected.height = corrected.bottom - corrected.top;\n\n  for (const edge in corrected) {\n    deltaRect[edge] = corrected[edge] - previous[edge];\n  }\n\n  resizeEvent.edges = interaction.prepared.edges;\n  resizeEvent.rect = corrected;\n  resizeEvent.deltaRect = deltaRect;\n}\n\nfunction end({\n  iEvent,\n  interaction\n}) {\n  if (interaction.prepared.name !== 'resize' || !interaction.prepared.edges) {\n    return;\n  }\n\n  const resizeEvent = iEvent;\n  resizeEvent.edges = interaction.prepared.edges;\n  resizeEvent.rect = interaction._rects.corrected;\n  resizeEvent.deltaRect = interaction._rects.delta;\n}\n\nfunction updateEventAxes({\n  iEvent,\n  interaction\n}) {\n  if (interaction.prepared.name !== 'resize' || !interaction.resizeAxes) {\n    return;\n  }\n\n  const options = interaction.interactable.options;\n  const resizeEvent = iEvent;\n\n  if (options.resize.square) {\n    if (interaction.resizeAxes === 'y') {\n      resizeEvent.delta.x = resizeEvent.delta.y;\n    } else {\n      resizeEvent.delta.y = resizeEvent.delta.x;\n    }\n\n    resizeEvent.axes = 'xy';\n  } else {\n    resizeEvent.axes = interaction.resizeAxes;\n\n    if (interaction.resizeAxes === 'x') {\n      resizeEvent.delta.y = 0;\n    } else if (interaction.resizeAxes === 'y') {\n      resizeEvent.delta.x = 0;\n    }\n  }\n}\n\nconst resize = {\n  id: 'actions/resize',\n  before: ['actions/drag'],\n  install: resize_plugin_install,\n  listeners: {\n    'interactions:new': ({\n      interaction\n    }) => {\n      interaction.resizeAxes = 'xy';\n    },\n    'interactions:action-start': arg => {\n      start(arg);\n      updateEventAxes(arg);\n    },\n    'interactions:action-move': arg => {\n      plugin_move(arg);\n      updateEventAxes(arg);\n    },\n    'interactions:action-end': end,\n    'auto-start:check': resizeChecker\n  },\n  defaults: {\n    square: false,\n    preserveAspectRatio: false,\n    axis: 'xy',\n    // use default margin\n    margin: NaN,\n    // object with props left, right, top, bottom which are\n    // true/false values to resize when the pointer is over that edge,\n    // CSS selectors to match the handles for each direction\n    // or the Elements for each handle\n    edges: null,\n    // a value of 'none' will limit the resize rect to a minimum of 0x0\n    // 'negate' will alow the rect to have negative width/height\n    // 'reposition' will keep the width/height positive by swapping\n    // the top and bottom edges and/or swapping the left and right edges\n    invert: 'none'\n  },\n  cursors: null,\n\n  getCursor({\n    edges,\n    axis,\n    name\n  }) {\n    const cursors = resize.cursors;\n    let result = null;\n\n    if (axis) {\n      result = cursors[name + axis];\n    } else if (edges) {\n      let cursorKey = '';\n\n      for (const edge of ['top', 'bottom', 'left', 'right']) {\n        if (edges[edge]) {\n          cursorKey += edge;\n        }\n      }\n\n      result = cursors[cursorKey];\n    }\n\n    return result;\n  },\n\n  defaultMargin: null\n};\n/* harmony default export */ var resize_plugin = (resize);\n//# sourceMappingURL=plugin.js.map\n// CONCATENATED MODULE: ./node_modules/@interactjs/actions/resize/index.js\n/* eslint-disable import/order, no-console, eol-last */\n\n\n\nif (typeof window === 'object' && !!window) {\n  interact_init(window);\n}\n\n_interactjs_interact.use(resize_plugin);\n//# sourceMappingURL=index.js.map\n// CONCATENATED MODULE: ./node_modules/@interactjs/snappers/edgeTarget.js\n/* harmony default export */ var edgeTarget = (() => {});\n//# sourceMappingURL=edgeTarget.js.map\n// CONCATENATED MODULE: ./node_modules/@interactjs/snappers/elements.js\n/* harmony default export */ var snappers_elements = (() => {});\n//# sourceMappingURL=elements.js.map\n// CONCATENATED MODULE: ./node_modules/@interactjs/snappers/grid.js\n/* harmony default export */ var grid = (grid => {\n  const coordFields = [['x', 'y'], ['left', 'top'], ['right', 'bottom'], ['width', 'height']].filter(([xField, yField]) => xField in grid || yField in grid);\n\n  const gridFunc = (x, y) => {\n    const {\n      range,\n      limits = {\n        left: -Infinity,\n        right: Infinity,\n        top: -Infinity,\n        bottom: Infinity\n      },\n      offset = {\n        x: 0,\n        y: 0\n      }\n    } = grid;\n    const result = {\n      range,\n      grid,\n      x: null,\n      y: null\n    };\n\n    for (const [xField, yField] of coordFields) {\n      const gridx = Math.round((x - offset.x) / grid[xField]);\n      const gridy = Math.round((y - offset.y) / grid[yField]);\n      result[xField] = Math.max(limits.left, Math.min(limits.right, gridx * grid[xField] + offset.x));\n      result[yField] = Math.max(limits.top, Math.min(limits.bottom, gridy * grid[yField] + offset.y));\n    }\n\n    return result;\n  };\n\n  gridFunc.grid = grid;\n  gridFunc.coordFields = coordFields;\n  return gridFunc;\n});\n//# sourceMappingURL=grid.js.map\n// CONCATENATED MODULE: ./node_modules/@interactjs/snappers/all.js\n\n\n\n//# sourceMappingURL=all.js.map\n// CONCATENATED MODULE: ./node_modules/@interactjs/snappers/plugin.js\n\n\nconst snappersPlugin = {\n  id: 'snappers',\n\n  install(scope) {\n    const {\n      interactStatic: interact\n    } = scope;\n    interact.snappers = extend(interact.snappers || {}, all_namespaceObject);\n    interact.createSnapGrid = interact.snappers.grid;\n  }\n\n};\n/* harmony default export */ var snappers_plugin = (snappersPlugin);\n//# sourceMappingURL=plugin.js.map\n// CONCATENATED MODULE: ./node_modules/@interactjs/modifiers/Modification.js\n\n\n\nclass Modification_Modification {\n  constructor(interaction) {\n    this.states = [];\n    this.startOffset = {\n      left: 0,\n      right: 0,\n      top: 0,\n      bottom: 0\n    };\n    this.startDelta = null;\n    this.result = null;\n    this.endResult = null;\n    this.edges = void 0;\n    this.interaction = void 0;\n    this.interaction = interaction;\n    this.result = createResult();\n  }\n\n  start({\n    phase\n  }, pageCoords) {\n    const {\n      interaction\n    } = this;\n    const modifierList = getModifierList(interaction);\n    this.prepareStates(modifierList);\n    this.edges = extend({}, interaction.edges);\n    this.startOffset = getRectOffset(interaction.rect, pageCoords);\n    this.startDelta = {\n      x: 0,\n      y: 0\n    };\n    const arg = {\n      phase,\n      pageCoords,\n      preEnd: false\n    };\n    this.result = createResult();\n    this.startAll(arg);\n    const result = this.result = this.setAll(arg);\n    return result;\n  }\n\n  fillArg(arg) {\n    const {\n      interaction\n    } = this;\n    arg.interaction = interaction;\n    arg.interactable = interaction.interactable;\n    arg.element = interaction.element;\n    arg.rect = arg.rect || interaction.rect;\n    arg.edges = this.edges;\n    arg.startOffset = this.startOffset;\n  }\n\n  startAll(arg) {\n    this.fillArg(arg);\n\n    for (const state of this.states) {\n      if (state.methods.start) {\n        arg.state = state;\n        state.methods.start(arg);\n      }\n    }\n  }\n\n  setAll(arg) {\n    this.fillArg(arg);\n    const {\n      phase,\n      preEnd,\n      skipModifiers,\n      rect: unmodifiedRect\n    } = arg;\n    arg.coords = extend({}, arg.pageCoords);\n    arg.rect = extend({}, unmodifiedRect);\n    const states = skipModifiers ? this.states.slice(skipModifiers) : this.states;\n    const newResult = createResult(arg.coords, arg.rect);\n\n    for (const state of states) {\n      const {\n        options\n      } = state;\n      const lastModifierCoords = extend({}, arg.coords);\n      let returnValue = null;\n\n      if (state.methods.set && this.shouldDo(options, preEnd, phase)) {\n        arg.state = state;\n        returnValue = state.methods.set(arg);\n        addEdges(this.interaction.edges, arg.rect, {\n          x: arg.coords.x - lastModifierCoords.x,\n          y: arg.coords.y - lastModifierCoords.y\n        });\n      }\n\n      newResult.eventProps.push(returnValue);\n    }\n\n    newResult.delta.x = arg.coords.x - arg.pageCoords.x;\n    newResult.delta.y = arg.coords.y - arg.pageCoords.y;\n    newResult.rectDelta.left = arg.rect.left - unmodifiedRect.left;\n    newResult.rectDelta.right = arg.rect.right - unmodifiedRect.right;\n    newResult.rectDelta.top = arg.rect.top - unmodifiedRect.top;\n    newResult.rectDelta.bottom = arg.rect.bottom - unmodifiedRect.bottom;\n    const prevCoords = this.result.coords;\n    const prevRect = this.result.rect;\n\n    if (prevCoords && prevRect) {\n      const rectChanged = newResult.rect.left !== prevRect.left || newResult.rect.right !== prevRect.right || newResult.rect.top !== prevRect.top || newResult.rect.bottom !== prevRect.bottom;\n      newResult.changed = rectChanged || prevCoords.x !== newResult.coords.x || prevCoords.y !== newResult.coords.y;\n    }\n\n    return newResult;\n  }\n\n  applyToInteraction(arg) {\n    const {\n      interaction\n    } = this;\n    const {\n      phase\n    } = arg;\n    const curCoords = interaction.coords.cur;\n    const startCoords = interaction.coords.start;\n    const {\n      result,\n      startDelta\n    } = this;\n    const curDelta = result.delta;\n\n    if (phase === 'start') {\n      extend(this.startDelta, result.delta);\n    }\n\n    for (const [coordsSet, delta] of [[startCoords, startDelta], [curCoords, curDelta]]) {\n      coordsSet.page.x += delta.x;\n      coordsSet.page.y += delta.y;\n      coordsSet.client.x += delta.x;\n      coordsSet.client.y += delta.y;\n    }\n\n    const {\n      rectDelta\n    } = this.result;\n    const rect = arg.rect || interaction.rect;\n    rect.left += rectDelta.left;\n    rect.right += rectDelta.right;\n    rect.top += rectDelta.top;\n    rect.bottom += rectDelta.bottom;\n    rect.width = rect.right - rect.left;\n    rect.height = rect.bottom - rect.top;\n  }\n\n  setAndApply(arg) {\n    const {\n      interaction\n    } = this;\n    const {\n      phase,\n      preEnd,\n      skipModifiers\n    } = arg;\n    const result = this.setAll({\n      preEnd,\n      phase,\n      pageCoords: arg.modifiedCoords || interaction.coords.cur.page\n    });\n    this.result = result; // don't fire an action move if a modifier would keep the event in the same\n    // cordinates as before\n\n    if (!result.changed && (!skipModifiers || skipModifiers < this.states.length) && interaction.interacting()) {\n      return false;\n    }\n\n    if (arg.modifiedCoords) {\n      const {\n        page\n      } = interaction.coords.cur;\n      const adjustment = {\n        x: arg.modifiedCoords.x - page.x,\n        y: arg.modifiedCoords.y - page.y\n      };\n      result.coords.x += adjustment.x;\n      result.coords.y += adjustment.y;\n      result.delta.x += adjustment.x;\n      result.delta.y += adjustment.y;\n    }\n\n    this.applyToInteraction(arg);\n  }\n\n  beforeEnd(arg) {\n    const {\n      interaction,\n      event\n    } = arg;\n    const states = this.states;\n\n    if (!states || !states.length) {\n      return;\n    }\n\n    let doPreend = false;\n\n    for (const state of states) {\n      arg.state = state;\n      const {\n        options,\n        methods\n      } = state;\n      const endPosition = methods.beforeEnd && methods.beforeEnd(arg);\n\n      if (endPosition) {\n        this.endResult = endPosition;\n        return false;\n      }\n\n      doPreend = doPreend || !doPreend && this.shouldDo(options, true, arg.phase, true);\n    }\n\n    if (doPreend) {\n      // trigger a final modified move before ending\n      interaction.move({\n        event,\n        preEnd: true\n      });\n    }\n  }\n\n  stop(arg) {\n    const {\n      interaction\n    } = arg;\n\n    if (!this.states || !this.states.length) {\n      return;\n    }\n\n    const modifierArg = extend({\n      states: this.states,\n      interactable: interaction.interactable,\n      element: interaction.element,\n      rect: null\n    }, arg);\n    this.fillArg(modifierArg);\n\n    for (const state of this.states) {\n      modifierArg.state = state;\n\n      if (state.methods.stop) {\n        state.methods.stop(modifierArg);\n      }\n    }\n\n    this.states = null;\n    this.endResult = null;\n  }\n\n  prepareStates(modifierList) {\n    this.states = [];\n\n    for (let index = 0; index < modifierList.length; index++) {\n      const {\n        options,\n        methods,\n        name\n      } = modifierList[index];\n      this.states.push({\n        options,\n        methods,\n        index,\n        name\n      });\n    }\n\n    return this.states;\n  }\n\n  restoreInteractionCoords({\n    interaction: {\n      coords,\n      rect,\n      modification\n    }\n  }) {\n    if (!modification.result) {\n      return;\n    }\n\n    const {\n      startDelta\n    } = modification;\n    const {\n      delta: curDelta,\n      rectDelta\n    } = modification.result;\n    const coordsAndDeltas = [[coords.start, startDelta], [coords.cur, curDelta]];\n\n    for (const [coordsSet, delta] of coordsAndDeltas) {\n      coordsSet.page.x -= delta.x;\n      coordsSet.page.y -= delta.y;\n      coordsSet.client.x -= delta.x;\n      coordsSet.client.y -= delta.y;\n    }\n\n    rect.left -= rectDelta.left;\n    rect.right -= rectDelta.right;\n    rect.top -= rectDelta.top;\n    rect.bottom -= rectDelta.bottom;\n  }\n\n  shouldDo(options, preEnd, phase, requireEndOnly) {\n    if ( // ignore disabled modifiers\n    !options || options.enabled === false || // check if we require endOnly option to fire move before end\n    requireEndOnly && !options.endOnly || // don't apply endOnly modifiers when not ending\n    options.endOnly && !preEnd || // check if modifier should run be applied on start\n    phase === 'start' && !options.setStart) {\n      return false;\n    }\n\n    return true;\n  }\n\n  copyFrom(other) {\n    this.startOffset = other.startOffset;\n    this.startDelta = other.startDelta;\n    this.edges = other.edges;\n    this.states = other.states.map(s => clone(s));\n    this.result = createResult(extend({}, other.result.coords), extend({}, other.result.rect));\n  }\n\n  destroy() {\n    for (const prop in this) {\n      this[prop] = null;\n    }\n  }\n\n}\n\nfunction createResult(coords, rect) {\n  return {\n    rect,\n    coords,\n    delta: {\n      x: 0,\n      y: 0\n    },\n    rectDelta: {\n      left: 0,\n      right: 0,\n      top: 0,\n      bottom: 0\n    },\n    eventProps: [],\n    changed: true\n  };\n}\n\nfunction getModifierList(interaction) {\n  const actionOptions = interaction.interactable.options[interaction.prepared.name];\n  const actionModifiers = actionOptions.modifiers;\n\n  if (actionModifiers && actionModifiers.length) {\n    return actionModifiers;\n  }\n\n  return ['snap', 'snapSize', 'snapEdges', 'restrict', 'restrictEdges', 'restrictSize'].map(type => {\n    const options = actionOptions[type];\n    return options && options.enabled && {\n      options,\n      methods: options._methods\n    };\n  }).filter(m => !!m);\n}\n\nfunction getRectOffset(rect, coords) {\n  return rect ? {\n    left: coords.x - rect.left,\n    top: coords.y - rect.top,\n    right: rect.right - coords.x,\n    bottom: rect.bottom - coords.y\n  } : {\n    left: 0,\n    top: 0,\n    right: 0,\n    bottom: 0\n  };\n}\n//# sourceMappingURL=Modification.js.map\n// CONCATENATED MODULE: ./node_modules/@interactjs/modifiers/base.js\n\n\n\nfunction makeModifier(module, name) {\n  const {\n    defaults\n  } = module;\n  const methods = {\n    start: module.start,\n    set: module.set,\n    beforeEnd: module.beforeEnd,\n    stop: module.stop\n  };\n\n  const modifier = _options => {\n    const options = _options || {};\n    options.enabled = options.enabled !== false; // add missing defaults to options\n\n    for (const prop in defaults) {\n      if (!(prop in options)) {\n        options[prop] = defaults[prop];\n      }\n    }\n\n    const m = {\n      options,\n      methods,\n      name,\n      enable: () => {\n        options.enabled = true;\n        return m;\n      },\n      disable: () => {\n        options.enabled = false;\n        return m;\n      }\n    };\n    return m;\n  };\n\n  if (name && typeof name === 'string') {\n    // for backwrads compatibility\n    modifier._defaults = defaults;\n    modifier._methods = methods;\n  }\n\n  return modifier;\n}\nfunction addEventModifiers({\n  iEvent,\n  interaction: {\n    modification: {\n      result\n    }\n  }\n}) {\n  if (result) {\n    iEvent.modifiers = result.eventProps;\n  }\n}\nconst modifiersBase = {\n  id: 'modifiers/base',\n  before: ['actions'],\n  install: scope => {\n    scope.defaults.perAction.modifiers = [];\n  },\n  listeners: {\n    'interactions:new': ({\n      interaction\n    }) => {\n      interaction.modification = new Modification_Modification(interaction);\n    },\n    'interactions:before-action-start': arg => {\n      const {\n        modification\n      } = arg.interaction;\n      modification.start(arg, arg.interaction.coords.start.page);\n      arg.interaction.edges = modification.edges;\n      modification.applyToInteraction(arg);\n    },\n    'interactions:before-action-move': arg => arg.interaction.modification.setAndApply(arg),\n    'interactions:before-action-end': arg => arg.interaction.modification.beforeEnd(arg),\n    'interactions:action-start': addEventModifiers,\n    'interactions:action-move': addEventModifiers,\n    'interactions:action-end': addEventModifiers,\n    'interactions:after-action-start': arg => arg.interaction.modification.restoreInteractionCoords(arg),\n    'interactions:after-action-move': arg => arg.interaction.modification.restoreInteractionCoords(arg),\n    'interactions:stop': arg => arg.interaction.modification.stop(arg)\n  }\n};\n/* harmony default export */ var modifiers_base = (modifiersBase);\n//# sourceMappingURL=base.js.map\n// CONCATENATED MODULE: ./node_modules/@interactjs/modifiers/aspectRatio.js\n/**\n * @module modifiers/aspectRatio\n *\n * @description\n * This module forces elements to be resized with a specified dx/dy ratio.\n *\n * ```js\n * interact(target).resizable({\n *   modifiers: [\n *     interact.modifiers.snapSize({\n *       targets: [ interact.snappers.grid({ x: 20, y: 20 }) ],\n *     }),\n *     interact.aspectRatio({ ratio: 'preserve' }),\n *   ],\n * });\n * ```\n */\n\n\n\n\nconst aspectRatio = {\n  start(arg) {\n    const {\n      state,\n      rect,\n      edges: originalEdges,\n      pageCoords: coords\n    } = arg;\n    let {\n      ratio\n    } = state.options;\n    const {\n      equalDelta,\n      modifiers\n    } = state.options;\n\n    if (ratio === 'preserve') {\n      ratio = rect.width / rect.height;\n    }\n\n    state.startCoords = extend({}, coords);\n    state.startRect = extend({}, rect);\n    state.ratio = ratio;\n    state.equalDelta = equalDelta;\n    const linkedEdges = state.linkedEdges = {\n      top: originalEdges.top || originalEdges.left && !originalEdges.bottom,\n      left: originalEdges.left || originalEdges.top && !originalEdges.right,\n      bottom: originalEdges.bottom || originalEdges.right && !originalEdges.top,\n      right: originalEdges.right || originalEdges.bottom && !originalEdges.left\n    };\n    state.xIsPrimaryAxis = !!(originalEdges.left || originalEdges.right);\n\n    if (state.equalDelta) {\n      state.edgeSign = (linkedEdges.left ? 1 : -1) * (linkedEdges.top ? 1 : -1);\n    } else {\n      const negativeSecondaryEdge = state.xIsPrimaryAxis ? linkedEdges.top : linkedEdges.left;\n      state.edgeSign = negativeSecondaryEdge ? -1 : 1;\n    }\n\n    extend(arg.edges, linkedEdges);\n\n    if (!modifiers || !modifiers.length) {\n      return;\n    }\n\n    const subModification = new Modification_Modification(arg.interaction);\n    subModification.copyFrom(arg.interaction.modification);\n    subModification.prepareStates(modifiers);\n    state.subModification = subModification;\n    subModification.startAll({ ...arg\n    });\n  },\n\n  set(arg) {\n    const {\n      state,\n      rect,\n      coords\n    } = arg;\n    const initialCoords = extend({}, coords);\n    const aspectMethod = state.equalDelta ? setEqualDelta : setRatio;\n    aspectMethod(state, state.xIsPrimaryAxis, coords, rect);\n\n    if (!state.subModification) {\n      return null;\n    }\n\n    const correctedRect = extend({}, rect);\n    addEdges(state.linkedEdges, correctedRect, {\n      x: coords.x - initialCoords.x,\n      y: coords.y - initialCoords.y\n    });\n    const result = state.subModification.setAll({ ...arg,\n      rect: correctedRect,\n      edges: state.linkedEdges,\n      pageCoords: coords,\n      prevCoords: coords,\n      prevRect: correctedRect\n    });\n    const {\n      delta\n    } = result;\n\n    if (result.changed) {\n      const xIsCriticalAxis = Math.abs(delta.x) > Math.abs(delta.y); // do aspect modification again with critical edge axis as primary\n\n      aspectMethod(state, xIsCriticalAxis, result.coords, result.rect);\n      extend(coords, result.coords);\n    }\n\n    return result.eventProps;\n  },\n\n  defaults: {\n    ratio: 'preserve',\n    equalDelta: false,\n    modifiers: [],\n    enabled: false\n  }\n};\n\nfunction setEqualDelta({\n  startCoords,\n  edgeSign\n}, xIsPrimaryAxis, coords) {\n  if (xIsPrimaryAxis) {\n    coords.y = startCoords.y + (coords.x - startCoords.x) * edgeSign;\n  } else {\n    coords.x = startCoords.x + (coords.y - startCoords.y) * edgeSign;\n  }\n}\n\nfunction setRatio({\n  startRect,\n  startCoords,\n  ratio,\n  edgeSign\n}, xIsPrimaryAxis, coords, rect) {\n  if (xIsPrimaryAxis) {\n    const newHeight = rect.width / ratio;\n    coords.y = startCoords.y + (newHeight - startRect.height) * edgeSign;\n  } else {\n    const newWidth = rect.height * ratio;\n    coords.x = startCoords.x + (newWidth - startRect.width) * edgeSign;\n  }\n}\n\n/* harmony default export */ var modifiers_aspectRatio = (makeModifier(aspectRatio, 'aspectRatio'));\n\n//# sourceMappingURL=aspectRatio.js.map\n// CONCATENATED MODULE: ./node_modules/@interactjs/modifiers/noop.js\nconst noop = () => {};\n\nnoop._defaults = {};\n/* harmony default export */ var modifiers_noop = (noop);\n//# sourceMappingURL=noop.js.map\n// CONCATENATED MODULE: ./node_modules/@interactjs/modifiers/restrict/pointer.js\n\n\n\n\n\nfunction pointer_start({\n  rect,\n  startOffset,\n  state,\n  interaction,\n  pageCoords\n}) {\n  const {\n    options\n  } = state;\n  const {\n    elementRect\n  } = options;\n  const offset = extend({\n    left: 0,\n    top: 0,\n    right: 0,\n    bottom: 0\n  }, options.offset || {});\n\n  if (rect && elementRect) {\n    const restriction = getRestrictionRect(options.restriction, interaction, pageCoords);\n\n    if (restriction) {\n      const widthDiff = restriction.right - restriction.left - rect.width;\n      const heightDiff = restriction.bottom - restriction.top - rect.height;\n\n      if (widthDiff < 0) {\n        offset.left += widthDiff;\n        offset.right += widthDiff;\n      }\n\n      if (heightDiff < 0) {\n        offset.top += heightDiff;\n        offset.bottom += heightDiff;\n      }\n    }\n\n    offset.left += startOffset.left - rect.width * elementRect.left;\n    offset.top += startOffset.top - rect.height * elementRect.top;\n    offset.right += startOffset.right - rect.width * (1 - elementRect.right);\n    offset.bottom += startOffset.bottom - rect.height * (1 - elementRect.bottom);\n  }\n\n  state.offset = offset;\n}\n\nfunction set({\n  coords,\n  interaction,\n  state\n}) {\n  const {\n    options,\n    offset\n  } = state;\n  const restriction = getRestrictionRect(options.restriction, interaction, coords);\n\n  if (!restriction) {\n    return;\n  }\n\n  const rect = xywhToTlbr(restriction);\n  coords.x = Math.max(Math.min(rect.right - offset.right, coords.x), rect.left + offset.left);\n  coords.y = Math.max(Math.min(rect.bottom - offset.bottom, coords.y), rect.top + offset.top);\n}\n\nfunction getRestrictionRect(value, interaction, coords) {\n  if (is.func(value)) {\n    return resolveRectLike(value, interaction.interactable, interaction.element, [coords.x, coords.y, interaction]);\n  } else {\n    return resolveRectLike(value, interaction.interactable, interaction.element);\n  }\n}\nconst pointer_defaults = {\n  restriction: null,\n  elementRect: null,\n  offset: null,\n  endOnly: false,\n  enabled: false\n};\nconst restrict = {\n  start: pointer_start,\n  set,\n  defaults: pointer_defaults\n};\n/* harmony default export */ var restrict_pointer = (makeModifier(restrict, 'restrict'));\n\n//# sourceMappingURL=pointer.js.map\n// CONCATENATED MODULE: ./node_modules/@interactjs/modifiers/restrict/edges.js\n// This module adds the options.resize.restrictEdges setting which sets min and\n// max for the top, left, bottom and right edges of the target being resized.\n//\n// interact(target).resize({\n//   edges: { top: true, left: true },\n//   restrictEdges: {\n//     inner: { top: 200, left: 200, right: 400, bottom: 400 },\n//     outer: { top:   0, left:   0, right: 600, bottom: 600 },\n//   },\n// })\n\n\n\n\nconst noInner = {\n  top: +Infinity,\n  left: +Infinity,\n  bottom: -Infinity,\n  right: -Infinity\n};\nconst noOuter = {\n  top: -Infinity,\n  left: -Infinity,\n  bottom: +Infinity,\n  right: +Infinity\n};\n\nfunction edges_start({\n  interaction,\n  startOffset,\n  state\n}) {\n  const {\n    options\n  } = state;\n  let offset;\n\n  if (options) {\n    const offsetRect = getRestrictionRect(options.offset, interaction, interaction.coords.start.page);\n    offset = rectToXY(offsetRect);\n  }\n\n  offset = offset || {\n    x: 0,\n    y: 0\n  };\n  state.offset = {\n    top: offset.y + startOffset.top,\n    left: offset.x + startOffset.left,\n    bottom: offset.y - startOffset.bottom,\n    right: offset.x - startOffset.right\n  };\n}\n\nfunction edges_set({\n  coords,\n  edges,\n  interaction,\n  state\n}) {\n  const {\n    offset,\n    options\n  } = state;\n\n  if (!edges) {\n    return;\n  }\n\n  const page = extend({}, coords);\n  const inner = getRestrictionRect(options.inner, interaction, page) || {};\n  const outer = getRestrictionRect(options.outer, interaction, page) || {};\n  fixRect(inner, noInner);\n  fixRect(outer, noOuter);\n\n  if (edges.top) {\n    coords.y = Math.min(Math.max(outer.top + offset.top, page.y), inner.top + offset.top);\n  } else if (edges.bottom) {\n    coords.y = Math.max(Math.min(outer.bottom + offset.bottom, page.y), inner.bottom + offset.bottom);\n  }\n\n  if (edges.left) {\n    coords.x = Math.min(Math.max(outer.left + offset.left, page.x), inner.left + offset.left);\n  } else if (edges.right) {\n    coords.x = Math.max(Math.min(outer.right + offset.right, page.x), inner.right + offset.right);\n  }\n}\n\nfunction fixRect(rect, defaults) {\n  for (const edge of ['top', 'left', 'bottom', 'right']) {\n    if (!(edge in rect)) {\n      rect[edge] = defaults[edge];\n    }\n  }\n\n  return rect;\n}\n\nconst edges_defaults = {\n  inner: null,\n  outer: null,\n  offset: null,\n  endOnly: false,\n  enabled: false\n};\nconst restrictEdges = {\n  noInner,\n  noOuter,\n  start: edges_start,\n  set: edges_set,\n  defaults: edges_defaults\n};\n/* harmony default export */ var restrict_edges = (makeModifier(restrictEdges, 'restrictEdges'));\n\n//# sourceMappingURL=edges.js.map\n// CONCATENATED MODULE: ./node_modules/@interactjs/modifiers/restrict/rect.js\n\n\n\nconst rect_defaults = extend({\n  get elementRect() {\n    return {\n      top: 0,\n      left: 0,\n      bottom: 1,\n      right: 1\n    };\n  },\n\n  set elementRect(_) {}\n\n}, restrict.defaults);\nconst restrictRect = {\n  start: restrict.start,\n  set: restrict.set,\n  defaults: rect_defaults\n};\n/* harmony default export */ var restrict_rect = (makeModifier(restrictRect, 'restrictRect'));\n\n//# sourceMappingURL=rect.js.map\n// CONCATENATED MODULE: ./node_modules/@interactjs/modifiers/restrict/size.js\n\n\n\n\n\nconst noMin = {\n  width: -Infinity,\n  height: -Infinity\n};\nconst noMax = {\n  width: +Infinity,\n  height: +Infinity\n};\n\nfunction size_start(arg) {\n  return restrictEdges.start(arg);\n}\n\nfunction size_set(arg) {\n  const {\n    interaction,\n    state,\n    rect,\n    edges\n  } = arg;\n  const {\n    options\n  } = state;\n\n  if (!edges) {\n    return;\n  }\n\n  const minSize = tlbrToXywh(getRestrictionRect(options.min, interaction, arg.coords)) || noMin;\n  const maxSize = tlbrToXywh(getRestrictionRect(options.max, interaction, arg.coords)) || noMax;\n  state.options = {\n    endOnly: options.endOnly,\n    inner: extend({}, restrictEdges.noInner),\n    outer: extend({}, restrictEdges.noOuter)\n  };\n\n  if (edges.top) {\n    state.options.inner.top = rect.bottom - minSize.height;\n    state.options.outer.top = rect.bottom - maxSize.height;\n  } else if (edges.bottom) {\n    state.options.inner.bottom = rect.top + minSize.height;\n    state.options.outer.bottom = rect.top + maxSize.height;\n  }\n\n  if (edges.left) {\n    state.options.inner.left = rect.right - minSize.width;\n    state.options.outer.left = rect.right - maxSize.width;\n  } else if (edges.right) {\n    state.options.inner.right = rect.left + minSize.width;\n    state.options.outer.right = rect.left + maxSize.width;\n  }\n\n  restrictEdges.set(arg);\n  state.options = options;\n}\n\nconst size_defaults = {\n  min: null,\n  max: null,\n  endOnly: false,\n  enabled: false\n};\nconst restrictSize = {\n  start: size_start,\n  set: size_set,\n  defaults: size_defaults\n};\n/* harmony default export */ var size = (makeModifier(restrictSize, 'restrictSize'));\n\n//# sourceMappingURL=size.js.map\n// CONCATENATED MODULE: ./node_modules/@interactjs/modifiers/snap/pointer.js\n\n\n\n\n\n\n\nfunction snap_pointer_start(arg) {\n  const {\n    interaction,\n    interactable,\n    element,\n    rect,\n    state,\n    startOffset\n  } = arg;\n  const {\n    options\n  } = state;\n  const origin = options.offsetWithOrigin ? getOrigin(arg) : {\n    x: 0,\n    y: 0\n  };\n  let snapOffset;\n\n  if (options.offset === 'startCoords') {\n    snapOffset = {\n      x: interaction.coords.start.page.x,\n      y: interaction.coords.start.page.y\n    };\n  } else {\n    const offsetRect = resolveRectLike(options.offset, interactable, element, [interaction]);\n    snapOffset = rectToXY(offsetRect) || {\n      x: 0,\n      y: 0\n    };\n    snapOffset.x += origin.x;\n    snapOffset.y += origin.y;\n  }\n\n  const {\n    relativePoints\n  } = options;\n  state.offsets = rect && relativePoints && relativePoints.length ? relativePoints.map((relativePoint, index) => ({\n    index,\n    relativePoint,\n    x: startOffset.left - rect.width * relativePoint.x + snapOffset.x,\n    y: startOffset.top - rect.height * relativePoint.y + snapOffset.y\n  })) : [extend({\n    index: 0,\n    relativePoint: null\n  }, snapOffset)];\n}\n\nfunction pointer_set(arg) {\n  const {\n    interaction,\n    coords,\n    state\n  } = arg;\n  const {\n    options,\n    offsets\n  } = state;\n  const origin = getOriginXY(interaction.interactable, interaction.element, interaction.prepared.name);\n  const page = extend({}, coords);\n  const targets = [];\n\n  if (!options.offsetWithOrigin) {\n    page.x -= origin.x;\n    page.y -= origin.y;\n  }\n\n  for (const offset of offsets) {\n    const relativeX = page.x - offset.x;\n    const relativeY = page.y - offset.y;\n\n    for (let index = 0, len = options.targets.length; index < len; index++) {\n      const snapTarget = options.targets[index];\n      let target;\n\n      if (is.func(snapTarget)) {\n        target = snapTarget(relativeX, relativeY, interaction._proxy, offset, index);\n      } else {\n        target = snapTarget;\n      }\n\n      if (!target) {\n        continue;\n      }\n\n      targets.push({\n        x: (is.number(target.x) ? target.x : relativeX) + offset.x,\n        y: (is.number(target.y) ? target.y : relativeY) + offset.y,\n        range: is.number(target.range) ? target.range : options.range,\n        source: snapTarget,\n        index,\n        offset\n      });\n    }\n  }\n\n  const closest = {\n    target: null,\n    inRange: false,\n    distance: 0,\n    range: 0,\n    delta: {\n      x: 0,\n      y: 0\n    }\n  };\n\n  for (const target of targets) {\n    const range = target.range;\n    const dx = target.x - page.x;\n    const dy = target.y - page.y;\n    const distance = hypot(dx, dy);\n    let inRange = distance <= range; // Infinite targets count as being out of range\n    // compared to non infinite ones that are in range\n\n    if (range === Infinity && closest.inRange && closest.range !== Infinity) {\n      inRange = false;\n    }\n\n    if (!closest.target || (inRange // is the closest target in range?\n    ? closest.inRange && range !== Infinity // the pointer is relatively deeper in this target\n    ? distance / range < closest.distance / closest.range // this target has Infinite range and the closest doesn't\n    : range === Infinity && closest.range !== Infinity || // OR this target is closer that the previous closest\n    distance < closest.distance : // The other is not in range and the pointer is closer to this target\n    !closest.inRange && distance < closest.distance)) {\n      closest.target = target;\n      closest.distance = distance;\n      closest.range = range;\n      closest.inRange = inRange;\n      closest.delta.x = dx;\n      closest.delta.y = dy;\n    }\n  }\n\n  if (closest.inRange) {\n    coords.x = closest.target.x;\n    coords.y = closest.target.y;\n  }\n\n  state.closest = closest;\n  return closest;\n}\n\nfunction getOrigin(arg) {\n  const {\n    element\n  } = arg.interaction;\n  const optionsOrigin = rectToXY(resolveRectLike(arg.state.options.origin, null, null, [element]));\n  const origin = optionsOrigin || getOriginXY(arg.interactable, element, arg.interaction.prepared.name);\n  return origin;\n}\n\nconst snap_pointer_defaults = {\n  range: Infinity,\n  targets: null,\n  offset: null,\n  offsetWithOrigin: true,\n  origin: null,\n  relativePoints: null,\n  endOnly: false,\n  enabled: false\n};\nconst snap = {\n  start: snap_pointer_start,\n  set: pointer_set,\n  defaults: snap_pointer_defaults\n};\n/* harmony default export */ var snap_pointer = (makeModifier(snap, 'snap'));\n\n//# sourceMappingURL=pointer.js.map\n// CONCATENATED MODULE: ./node_modules/@interactjs/modifiers/snap/size.js\n// This module allows snapping of the size of targets during resize\n// interactions.\n\n\n\n\n\nfunction snap_size_start(arg) {\n  const {\n    state,\n    edges\n  } = arg;\n  const {\n    options\n  } = state;\n\n  if (!edges) {\n    return null;\n  }\n\n  arg.state = {\n    options: {\n      targets: null,\n      relativePoints: [{\n        x: edges.left ? 0 : 1,\n        y: edges.top ? 0 : 1\n      }],\n      offset: options.offset || 'self',\n      origin: {\n        x: 0,\n        y: 0\n      },\n      range: options.range\n    }\n  };\n  state.targetFields = state.targetFields || [['width', 'height'], ['x', 'y']];\n  snap.start(arg);\n  state.offsets = arg.state.offsets;\n  arg.state = state;\n}\n\nfunction snap_size_set(arg) {\n  const {\n    interaction,\n    state,\n    coords\n  } = arg;\n  const {\n    options,\n    offsets\n  } = state;\n  const relative = {\n    x: coords.x - offsets[0].x,\n    y: coords.y - offsets[0].y\n  };\n  state.options = extend({}, options);\n  state.options.targets = [];\n\n  for (const snapTarget of options.targets || []) {\n    let target;\n\n    if (is.func(snapTarget)) {\n      target = snapTarget(relative.x, relative.y, interaction);\n    } else {\n      target = snapTarget;\n    }\n\n    if (!target) {\n      continue;\n    }\n\n    for (const [xField, yField] of state.targetFields) {\n      if (xField in target || yField in target) {\n        target.x = target[xField];\n        target.y = target[yField];\n        break;\n      }\n    }\n\n    state.options.targets.push(target);\n  }\n\n  const returnValue = snap.set(arg);\n  state.options = options;\n  return returnValue;\n}\n\nconst snap_size_defaults = {\n  range: Infinity,\n  targets: null,\n  offset: null,\n  endOnly: false,\n  enabled: false\n};\nconst snapSize = {\n  start: snap_size_start,\n  set: snap_size_set,\n  defaults: snap_size_defaults\n};\n/* harmony default export */ var snap_size = (makeModifier(snapSize, 'snapSize'));\n\n//# sourceMappingURL=size.js.map\n// CONCATENATED MODULE: ./node_modules/@interactjs/modifiers/snap/edges.js\n/**\n * @module modifiers/snapEdges\n *\n * @description\n * WOW> This module allows snapping of the edges of targets during resize\n * interactions.\n *\n * ```js\n * interact(target).resizable({\n *   snapEdges: {\n *     targets: [interact.snappers.grid({ x: 100, y: 50 })],\n *   },\n * })\n *\n * interact(target).resizable({\n *   snapEdges: {\n *     targets: [\n *       interact.snappers.grid({\n *        top: 50,\n *        left: 50,\n *        bottom: 100,\n *        right: 100,\n *       }),\n *     ],\n *   },\n * })\n * ```\n */\n\n\n\n\n\nfunction snap_edges_start(arg) {\n  const {\n    edges\n  } = arg;\n\n  if (!edges) {\n    return null;\n  }\n\n  arg.state.targetFields = arg.state.targetFields || [[edges.left ? 'left' : 'right', edges.top ? 'top' : 'bottom']];\n  return snapSize.start(arg);\n}\n\nconst snapEdges = {\n  start: snap_edges_start,\n  set: snapSize.set,\n  defaults: extend(clone(snapSize.defaults), {\n    targets: null,\n    range: null,\n    offset: {\n      x: 0,\n      y: 0\n    }\n  })\n};\n/* harmony default export */ var snap_edges = (makeModifier(snapEdges, 'snapEdges'));\n\n//# sourceMappingURL=edges.js.map\n// CONCATENATED MODULE: ./node_modules/@interactjs/modifiers/all.js\n/* eslint-disable node/no-extraneous-import */\n\n\n\n\n\n\n\n\n\n\n\n\n/* harmony default export */ var modifiers_all = ({\n  aspectRatio: modifiers_aspectRatio,\n  restrictEdges: restrict_edges,\n  restrict: restrict_pointer,\n  restrictRect: restrict_rect,\n  restrictSize: size,\n  snapEdges: snap_edges,\n  snap: snap_pointer,\n  snapSize: snap_size,\n  spring: modifiers_noop,\n  avoid: modifiers_noop,\n  transform: modifiers_noop,\n  rubberband: modifiers_noop\n});\n//# sourceMappingURL=all.js.map\n// CONCATENATED MODULE: ./node_modules/@interactjs/modifiers/plugin.js\n\n\n\nconst plugin_modifiers = {\n  id: 'modifiers',\n\n  install(scope) {\n    const {\n      interactStatic: interact\n    } = scope;\n    scope.usePlugin(modifiers_base);\n    scope.usePlugin(snappers_plugin);\n    interact.modifiers = modifiers_all; // for backwrads compatibility\n\n    for (const type in modifiers_all) {\n      const {\n        _defaults,\n        _methods\n      } = modifiers_all[type];\n      _defaults._methods = _methods;\n      scope.defaults.perAction[type] = _defaults;\n    }\n  }\n\n};\n/* harmony default export */ var modifiers_plugin = (plugin_modifiers);\n//# sourceMappingURL=plugin.js.map\n// CONCATENATED MODULE: ./node_modules/@interactjs/modifiers/index.js\n/* eslint-disable import/order, no-console, eol-last */\n\n\n\nif (typeof window === 'object' && !!window) {\n  interact_init(window);\n}\n\n_interactjs_interact.use(modifiers_plugin);\n//# sourceMappingURL=index.js.map\n// CONCATENATED MODULE: ./node_modules/@interactjs/dev-tools/plugin.js\n/* eslint-disable no-console */\n\n\n\n\n\n\nvar CheckName;\n\n(function (CheckName) {\n  CheckName[\"touchAction\"] = \"touchAction\";\n  CheckName[\"boxSizing\"] = \"boxSizing\";\n  CheckName[\"noListeners\"] = \"noListeners\";\n})(CheckName || (CheckName = {}));\n\nconst prefix = '[interact.js] ';\nconst links = {\n  touchAction: 'https://developer.mozilla.org/en-US/docs/Web/CSS/touch-action',\n  boxSizing: 'https://developer.mozilla.org/en-US/docs/Web/CSS/box-sizing'\n}; // eslint-disable-next-line no-undef\n\nconst isProduction = \"development\" === 'production'; // eslint-disable-next-line no-restricted-syntax\n\nfunction dev_tools_plugin_install(scope, {\n  logger\n} = {}) {\n  const {\n    Interactable,\n    defaults\n  } = scope;\n  scope.logger = logger || console;\n  defaults.base.devTools = {\n    ignore: {}\n  };\n\n  Interactable.prototype.devTools = function (options) {\n    if (options) {\n      extend(this.options.devTools, options);\n      return this;\n    }\n\n    return this.options.devTools;\n  };\n}\n\nconst checks = [{\n  name: CheckName.touchAction,\n\n  perform({\n    element\n  }) {\n    return !parentHasStyle(element, 'touchAction', /pan-|pinch|none/);\n  },\n\n  getInfo({\n    element\n  }) {\n    return [element, links.touchAction];\n  },\n\n  text: 'Consider adding CSS \"touch-action: none\" to this element\\n'\n}, {\n  name: CheckName.boxSizing,\n\n  perform(interaction) {\n    const {\n      element\n    } = interaction;\n    return interaction.prepared.name === 'resize' && element instanceof utils_domObjects.HTMLElement && !hasStyle(element, 'boxSizing', /border-box/);\n  },\n\n  text: 'Consider adding CSS \"box-sizing: border-box\" to this resizable element',\n\n  getInfo({\n    element\n  }) {\n    return [element, links.boxSizing];\n  }\n\n}, {\n  name: CheckName.noListeners,\n\n  perform(interaction) {\n    const actionName = interaction.prepared.name;\n    const moveListeners = interaction.interactable.events.types[`${actionName}move`] || [];\n    return !moveListeners.length;\n  },\n\n  getInfo(interaction) {\n    return [interaction.prepared.name, interaction.interactable];\n  },\n\n  text: 'There are no listeners set for this action'\n}];\n\nfunction hasStyle(element, prop, styleRe) {\n  const value = element.style[prop] || win.getComputedStyle(element)[prop];\n  return styleRe.test((value || '').toString());\n}\n\nfunction parentHasStyle(element, prop, styleRe) {\n  let parent = element;\n\n  while (is.element(parent)) {\n    if (hasStyle(parent, prop, styleRe)) {\n      return true;\n    }\n\n    parent = parentNode(parent);\n  }\n\n  return false;\n}\n\nconst plugin_id = 'dev-tools';\nconst defaultExport = isProduction ? {\n  id: plugin_id,\n  install: () => {}\n} : {\n  id: plugin_id,\n  install: dev_tools_plugin_install,\n  listeners: {\n    'interactions:action-start': ({\n      interaction\n    }, scope) => {\n      for (const check of checks) {\n        const options = interaction.interactable && interaction.interactable.options;\n\n        if (!(options && options.devTools && options.devTools.ignore[check.name]) && check.perform(interaction)) {\n          scope.logger.warn(prefix + check.text, ...check.getInfo(interaction));\n        }\n      }\n    }\n  },\n  checks,\n  CheckName,\n  links,\n  prefix\n};\n/* harmony default export */ var dev_tools_plugin = (defaultExport);\n//# sourceMappingURL=plugin.js.map\n// CONCATENATED MODULE: ./node_modules/@interactjs/dev-tools/index.js\n/* eslint-disable import/order, no-console, eol-last */\n\n\n\nif (typeof window === 'object' && !!window) {\n  interact_init(window);\n}\n\n_interactjs_interact.use(dev_tools_plugin);\n//# sourceMappingURL=index.js.map\n// CONCATENATED MODULE: ./node_modules/cache-loader/dist/cjs.js??ref--12-0!./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options!./src/components/GridItem.vue?vue&type=script&lang=js&\n\n\n\n\n\n\n\n\n\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { Object(defineProperty[\"a\" /* default */])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }\n\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n //    var eventBus = require('./eventBus');\n\n\n\n\n\n\n\n\n/* harmony default export */ var GridItemvue_type_script_lang_js_ = ({\n  name: \"GridItem\",\n  props: {\n    /*cols: {\n     type: Number,\n     required: true\n     },*/\n\n    /*containerWidth: {\n     type: Number,\n     required: true\n       },\n     rowHeight: {\n     type: Number,\n     required: true\n     },\n     margin: {\n     type: Array,\n     required: true\n     },\n     maxRows: {\n     type: Number,\n     required: true\n     },*/\n    isDraggable: {\n      type: Boolean,\n      required: false,\n      default: null\n    },\n    isResizable: {\n      type: Boolean,\n      required: false,\n      default: null\n    },\n    isBounded: {\n      type: Boolean,\n      required: false,\n      default: null\n    },\n\n    /*useCssTransforms: {\n     type: Boolean,\n     required: true\n     },\n     */\n    static: {\n      type: Boolean,\n      required: false,\n      default: false\n    },\n    minH: {\n      type: Number,\n      required: false,\n      default: 1\n    },\n    minW: {\n      type: Number,\n      required: false,\n      default: 1\n    },\n    maxH: {\n      type: Number,\n      required: false,\n      default: Infinity\n    },\n    maxW: {\n      type: Number,\n      required: false,\n      default: Infinity\n    },\n    x: {\n      type: Number,\n      required: true\n    },\n    y: {\n      type: Number,\n      required: true\n    },\n    w: {\n      type: Number,\n      required: true\n    },\n    h: {\n      type: Number,\n      required: true\n    },\n    i: {\n      required: true\n    },\n    dragIgnoreFrom: {\n      type: String,\n      required: false,\n      default: 'a, button'\n    },\n    dragAllowFrom: {\n      type: String,\n      required: false,\n      default: null\n    },\n    resizeIgnoreFrom: {\n      type: String,\n      required: false,\n      default: 'a, button'\n    },\n    preserveAspectRatio: {\n      type: Boolean,\n      required: false,\n      default: false\n    },\n    dragOption: {\n      type: Object,\n      required: false,\n      default: function _default() {\n        return {};\n      }\n    },\n    resizeOption: {\n      type: Object,\n      required: false,\n      default: function _default() {\n        return {};\n      }\n    }\n  },\n  inject: [\"eventBus\", \"layout\"],\n  data: function data() {\n    return {\n      cols: 1,\n      containerWidth: 100,\n      rowHeight: 30,\n      margin: [10, 10],\n      maxRows: Infinity,\n      draggable: null,\n      resizable: null,\n      transformScale: 1,\n      useCssTransforms: true,\n      useStyleCursor: true,\n      isDragging: false,\n      dragging: null,\n      isResizing: false,\n      resizing: null,\n      lastX: NaN,\n      lastY: NaN,\n      lastW: NaN,\n      lastH: NaN,\n      style: {},\n      rtl: false,\n      dragEventSet: false,\n      resizeEventSet: false,\n      previousW: null,\n      previousH: null,\n      previousX: null,\n      previousY: null,\n      innerX: this.x,\n      innerY: this.y,\n      innerW: this.w,\n      innerH: this.h\n    };\n  },\n  created: function created() {\n    var _this = this;\n\n    var self = this; // Accessible refernces of functions for removing in beforeDestroy\n\n    self.updateWidthHandler = function (width) {\n      self.updateWidth(width);\n    };\n\n    self.compactHandler = function (layout) {\n      self.compact(layout);\n    };\n\n    self.setDraggableHandler = function (isDraggable) {\n      if (self.isDraggable === null) {\n        self.draggable = isDraggable;\n      }\n    };\n\n    self.setResizableHandler = function (isResizable) {\n      if (self.isResizable === null) {\n        self.resizable = isResizable;\n      }\n    };\n\n    self.setBoundedHandler = function (isBounded) {\n      if (self.isBounded === null) {\n        self.bounded = isBounded;\n      }\n    };\n\n    self.setTransformScaleHandler = function (transformScale) {\n      self.transformScale = transformScale;\n    };\n\n    self.setRowHeightHandler = function (rowHeight) {\n      self.rowHeight = rowHeight;\n    };\n\n    self.setMaxRowsHandler = function (maxRows) {\n      self.maxRows = maxRows;\n    };\n\n    self.directionchangeHandler = function () {\n      _this.rtl = Object(DOM[\"b\" /* getDocumentDir */])() === 'rtl';\n\n      _this.compact();\n    };\n\n    self.setColNum = function (colNum) {\n      self.cols = parseInt(colNum);\n    };\n\n    this.eventBus.$on('updateWidth', self.updateWidthHandler);\n    this.eventBus.$on('compact', self.compactHandler);\n    this.eventBus.$on('setDraggable', self.setDraggableHandler);\n    this.eventBus.$on('setResizable', self.setResizableHandler);\n    this.eventBus.$on('setBounded', self.setBoundedHandler);\n    this.eventBus.$on('setTransformScale', self.setTransformScaleHandler);\n    this.eventBus.$on('setRowHeight', self.setRowHeightHandler);\n    this.eventBus.$on('setMaxRows', self.setMaxRowsHandler);\n    this.eventBus.$on('directionchange', self.directionchangeHandler);\n    this.eventBus.$on('setColNum', self.setColNum);\n    this.rtl = Object(DOM[\"b\" /* getDocumentDir */])() === 'rtl';\n  },\n  beforeDestroy: function beforeDestroy() {\n    var self = this; //Remove listeners\n\n    this.eventBus.$off('updateWidth', self.updateWidthHandler);\n    this.eventBus.$off('compact', self.compactHandler);\n    this.eventBus.$off('setDraggable', self.setDraggableHandler);\n    this.eventBus.$off('setResizable', self.setResizableHandler);\n    this.eventBus.$off('setBounded', self.setBoundedHandler);\n    this.eventBus.$off('setTransformScale', self.setTransformScaleHandler);\n    this.eventBus.$off('setRowHeight', self.setRowHeightHandler);\n    this.eventBus.$off('setMaxRows', self.setMaxRowsHandler);\n    this.eventBus.$off('directionchange', self.directionchangeHandler);\n    this.eventBus.$off('setColNum', self.setColNum);\n\n    if (this.interactObj) {\n      this.interactObj.unset(); // destroy interact intance\n    }\n  },\n  mounted: function mounted() {\n    if (this.layout.responsive && this.layout.lastBreakpoint) {\n      this.cols = Object(responsiveUtils[\"c\" /* getColsFromBreakpoint */])(this.layout.lastBreakpoint, this.layout.cols);\n    } else {\n      this.cols = this.layout.colNum;\n    }\n\n    this.rowHeight = this.layout.rowHeight;\n    this.containerWidth = this.layout.width !== null ? this.layout.width : 100;\n    this.margin = this.layout.margin !== undefined ? this.layout.margin : [10, 10];\n    this.maxRows = this.layout.maxRows;\n\n    if (this.isDraggable === null) {\n      this.draggable = this.layout.isDraggable;\n    } else {\n      this.draggable = this.isDraggable;\n    }\n\n    if (this.isResizable === null) {\n      this.resizable = this.layout.isResizable;\n    } else {\n      this.resizable = this.isResizable;\n    }\n\n    if (this.isBounded === null) {\n      this.bounded = this.layout.isBounded;\n    } else {\n      this.bounded = this.isBounded;\n    }\n\n    this.transformScale = this.layout.transformScale;\n    this.useCssTransforms = this.layout.useCssTransforms;\n    this.useStyleCursor = this.layout.useStyleCursor;\n    this.createStyle();\n  },\n  watch: {\n    isDraggable: function isDraggable() {\n      this.draggable = this.isDraggable;\n    },\n    static: function _static() {\n      this.tryMakeDraggable();\n      this.tryMakeResizable();\n    },\n    draggable: function draggable() {\n      this.tryMakeDraggable();\n    },\n    isResizable: function isResizable() {\n      this.resizable = this.isResizable;\n    },\n    isBounded: function isBounded() {\n      this.bounded = this.isBounded;\n    },\n    resizable: function resizable() {\n      this.tryMakeResizable();\n    },\n    rowHeight: function rowHeight() {\n      this.createStyle();\n      this.emitContainerResized();\n    },\n    cols: function cols() {\n      this.tryMakeResizable();\n      this.createStyle();\n      this.emitContainerResized();\n    },\n    containerWidth: function containerWidth() {\n      this.tryMakeResizable();\n      this.createStyle();\n      this.emitContainerResized();\n    },\n    x: function x(newVal) {\n      this.innerX = newVal;\n      this.createStyle();\n    },\n    y: function y(newVal) {\n      this.innerY = newVal;\n      this.createStyle();\n    },\n    h: function h(newVal) {\n      this.innerH = newVal;\n      this.createStyle(); // this.emitContainerResized();\n    },\n    w: function w(newVal) {\n      this.innerW = newVal;\n      this.createStyle(); // this.emitContainerResized();\n    },\n    renderRtl: function renderRtl() {\n      // console.log(\"### renderRtl\");\n      this.tryMakeResizable();\n      this.createStyle();\n    },\n    minH: function minH() {\n      this.tryMakeResizable();\n    },\n    maxH: function maxH() {\n      this.tryMakeResizable();\n    },\n    minW: function minW() {\n      this.tryMakeResizable();\n    },\n    maxW: function maxW() {\n      this.tryMakeResizable();\n    },\n    \"$parent.margin\": function $parentMargin(margin) {\n      if (!margin || margin[0] == this.margin[0] && margin[1] == this.margin[1]) {\n        return;\n      }\n\n      this.margin = margin.map(function (m) {\n        return Number(m);\n      });\n      this.createStyle();\n      this.emitContainerResized();\n    }\n  },\n  computed: {\n    classObj: function classObj() {\n      return {\n        'vue-resizable': this.resizableAndNotStatic,\n        'static': this.static,\n        'resizing': this.isResizing,\n        'vue-draggable-dragging': this.isDragging,\n        'cssTransforms': this.useCssTransforms,\n        'render-rtl': this.renderRtl,\n        'disable-userselect': this.isDragging,\n        'no-touch': this.isAndroid && this.draggableOrResizableAndNotStatic\n      };\n    },\n    resizableAndNotStatic: function resizableAndNotStatic() {\n      return this.resizable && !this.static;\n    },\n    draggableOrResizableAndNotStatic: function draggableOrResizableAndNotStatic() {\n      return (this.draggable || this.resizable) && !this.static;\n    },\n    isAndroid: function isAndroid() {\n      return navigator.userAgent.toLowerCase().indexOf(\"android\") !== -1;\n    },\n    renderRtl: function renderRtl() {\n      return this.layout.isMirrored ? !this.rtl : this.rtl;\n    },\n    resizableHandleClass: function resizableHandleClass() {\n      if (this.renderRtl) {\n        return 'vue-resizable-handle vue-rtl-resizable-handle';\n      } else {\n        return 'vue-resizable-handle';\n      }\n    }\n  },\n  methods: {\n    createStyle: function createStyle() {\n      if (this.x + this.w > this.cols) {\n        this.innerX = 0;\n        this.innerW = this.w > this.cols ? this.cols : this.w;\n      } else {\n        this.innerX = this.x;\n        this.innerW = this.w;\n      }\n\n      var pos = this.calcPosition(this.innerX, this.innerY, this.innerW, this.innerH);\n\n      if (this.isDragging) {\n        pos.top = this.dragging.top; //                    Add rtl support\n\n        if (this.renderRtl) {\n          pos.right = this.dragging.left;\n        } else {\n          pos.left = this.dragging.left;\n        }\n      }\n\n      if (this.isResizing) {\n        pos.width = this.resizing.width;\n        pos.height = this.resizing.height;\n      }\n\n      var style; // CSS Transforms support (default)\n\n      if (this.useCssTransforms) {\n        //                    Add rtl support\n        if (this.renderRtl) {\n          style = Object(utils[\"k\" /* setTransformRtl */])(pos.top, pos.right, pos.width, pos.height);\n        } else {\n          style = Object(utils[\"j\" /* setTransform */])(pos.top, pos.left, pos.width, pos.height);\n        }\n      } else {\n        // top,left (slow)\n        //                    Add rtl support\n        if (this.renderRtl) {\n          style = Object(utils[\"i\" /* setTopRight */])(pos.top, pos.right, pos.width, pos.height);\n        } else {\n          style = Object(utils[\"h\" /* setTopLeft */])(pos.top, pos.left, pos.width, pos.height);\n        }\n      }\n\n      this.style = style;\n    },\n    emitContainerResized: function emitContainerResized() {\n      // this.style has width and height with trailing 'px'. The\n      // resized event is without them\n      var styleProps = {};\n\n      for (var _i = 0, _arr = ['width', 'height']; _i < _arr.length; _i++) {\n        var prop = _arr[_i];\n        var val = this.style[prop];\n        var matches = val.match(/^(\\d+)px$/);\n        if (!matches) return;\n        styleProps[prop] = matches[1];\n      }\n\n      this.$emit(\"container-resized\", this.i, this.h, this.w, styleProps.height, styleProps.width);\n    },\n    handleResize: function handleResize(event) {\n      if (this.static) return;\n      var position = getControlPosition(event); // Get the current drag point from the event. This is used as the offset.\n\n      if (position == null) return; // not possible but satisfies flow\n\n      var x = position.x,\n          y = position.y;\n      var newSize = {\n        width: 0,\n        height: 0\n      };\n      var pos;\n\n      switch (event.type) {\n        case \"resizestart\":\n          {\n            this.tryMakeResizable();\n            this.previousW = this.innerW;\n            this.previousH = this.innerH;\n            pos = this.calcPosition(this.innerX, this.innerY, this.innerW, this.innerH);\n            newSize.width = pos.width;\n            newSize.height = pos.height;\n            this.resizing = newSize;\n            this.isResizing = true;\n            break;\n          }\n\n        case \"resizemove\":\n          {\n            //                        console.log(\"### resize => \" + event.type + \", lastW=\" + this.lastW + \", lastH=\" + this.lastH);\n            var coreEvent = createCoreData(this.lastW, this.lastH, x, y);\n\n            if (this.renderRtl) {\n              newSize.width = this.resizing.width - coreEvent.deltaX / this.transformScale;\n            } else {\n              newSize.width = this.resizing.width + coreEvent.deltaX / this.transformScale;\n            }\n\n            newSize.height = this.resizing.height + coreEvent.deltaY / this.transformScale; ///console.log(\"### resize => \" + event.type + \", deltaX=\" + coreEvent.deltaX + \", deltaY=\" + coreEvent.deltaY);\n\n            this.resizing = newSize;\n            break;\n          }\n\n        case \"resizeend\":\n          {\n            //console.log(\"### resize end => x=\" +this.innerX + \" y=\" + this.innerY + \" w=\" + this.innerW + \" h=\" + this.innerH);\n            pos = this.calcPosition(this.innerX, this.innerY, this.innerW, this.innerH);\n            newSize.width = pos.width;\n            newSize.height = pos.height; //                        console.log(\"### resize end => \" + JSON.stringify(newSize));\n\n            this.resizing = null;\n            this.isResizing = false;\n            break;\n          }\n      } // Get new WH\n\n\n      pos = this.calcWH(newSize.height, newSize.width);\n\n      if (pos.w < this.minW) {\n        pos.w = this.minW;\n      }\n\n      if (pos.w > this.maxW) {\n        pos.w = this.maxW;\n      }\n\n      if (pos.h < this.minH) {\n        pos.h = this.minH;\n      }\n\n      if (pos.h > this.maxH) {\n        pos.h = this.maxH;\n      }\n\n      if (pos.h < 1) {\n        pos.h = 1;\n      }\n\n      if (pos.w < 1) {\n        pos.w = 1;\n      }\n\n      this.lastW = x;\n      this.lastH = y;\n\n      if (this.innerW !== pos.w || this.innerH !== pos.h) {\n        this.$emit(\"resize\", this.i, pos.h, pos.w, newSize.height, newSize.width);\n      }\n\n      if (event.type === \"resizeend\" && (this.previousW !== this.innerW || this.previousH !== this.innerH)) {\n        this.$emit(\"resized\", this.i, pos.h, pos.w, newSize.height, newSize.width);\n      }\n\n      this.eventBus.$emit(\"resizeEvent\", event.type, this.i, this.innerX, this.innerY, pos.h, pos.w);\n    },\n    handleDrag: function handleDrag(event) {\n      if (this.static) return;\n      if (this.isResizing) return;\n      var position = getControlPosition(event); // Get the current drag point from the event. This is used as the offset.\n\n      if (position === null) return; // not possible but satisfies flow\n\n      var x = position.x,\n          y = position.y; // let shouldUpdate = false;\n\n      var newPosition = {\n        top: 0,\n        left: 0\n      };\n\n      switch (event.type) {\n        case \"dragstart\":\n          {\n            this.previousX = this.innerX;\n            this.previousY = this.innerY;\n            var parentRect = event.target.offsetParent.getBoundingClientRect();\n            var clientRect = event.target.getBoundingClientRect();\n            var cLeft = clientRect.left / this.transformScale;\n            var pLeft = parentRect.left / this.transformScale;\n            var cRight = clientRect.right / this.transformScale;\n            var pRight = parentRect.right / this.transformScale;\n            var cTop = clientRect.top / this.transformScale;\n            var pTop = parentRect.top / this.transformScale;\n\n            if (this.renderRtl) {\n              newPosition.left = (cRight - pRight) * -1;\n            } else {\n              newPosition.left = cLeft - pLeft;\n            }\n\n            newPosition.top = cTop - pTop;\n            this.dragging = newPosition;\n            this.isDragging = true;\n            break;\n          }\n\n        case \"dragend\":\n          {\n            if (!this.isDragging) return;\n\n            var _parentRect = event.target.offsetParent.getBoundingClientRect();\n\n            var _clientRect = event.target.getBoundingClientRect();\n\n            var _cLeft = _clientRect.left / this.transformScale;\n\n            var _pLeft = _parentRect.left / this.transformScale;\n\n            var _cRight = _clientRect.right / this.transformScale;\n\n            var _pRight = _parentRect.right / this.transformScale;\n\n            var _cTop = _clientRect.top / this.transformScale;\n\n            var _pTop = _parentRect.top / this.transformScale; //                        Add rtl support\n\n\n            if (this.renderRtl) {\n              newPosition.left = (_cRight - _pRight) * -1;\n            } else {\n              newPosition.left = _cLeft - _pLeft;\n            }\n\n            newPosition.top = _cTop - _pTop; //                        console.log(\"### drag end => \" + JSON.stringify(newPosition));\n            //                        console.log(\"### DROP: \" + JSON.stringify(newPosition));\n\n            this.dragging = null;\n            this.isDragging = false; // shouldUpdate = true;\n\n            break;\n          }\n\n        case \"dragmove\":\n          {\n            var coreEvent = createCoreData(this.lastX, this.lastY, x, y); //                        Add rtl support\n\n            if (this.renderRtl) {\n              newPosition.left = this.dragging.left - coreEvent.deltaX / this.transformScale;\n            } else {\n              newPosition.left = this.dragging.left + coreEvent.deltaX / this.transformScale;\n            }\n\n            newPosition.top = this.dragging.top + coreEvent.deltaY / this.transformScale;\n\n            if (this.bounded) {\n              var bottomBoundary = event.target.offsetParent.clientHeight - this.calcGridItemWHPx(this.h, this.rowHeight, this.margin[1]);\n              newPosition.top = this.clamp(newPosition.top, 0, bottomBoundary);\n              var colWidth = this.calcColWidth();\n              var rightBoundary = this.containerWidth - this.calcGridItemWHPx(this.w, colWidth, this.margin[0]);\n              newPosition.left = this.clamp(newPosition.left, 0, rightBoundary);\n            } //                        console.log(\"### drag => \" + event.type + \", x=\" + x + \", y=\" + y);\n            //                        console.log(\"### drag => \" + event.type + \", deltaX=\" + coreEvent.deltaX + \", deltaY=\" + coreEvent.deltaY);\n            //                        console.log(\"### drag end => \" + JSON.stringify(newPosition));\n\n\n            this.dragging = newPosition;\n            break;\n          }\n      } // Get new XY\n\n\n      var pos;\n\n      if (this.renderRtl) {\n        pos = this.calcXY(newPosition.top, newPosition.left);\n      } else {\n        pos = this.calcXY(newPosition.top, newPosition.left);\n      }\n\n      this.lastX = x;\n      this.lastY = y;\n\n      if (this.innerX !== pos.x || this.innerY !== pos.y) {\n        this.$emit(\"move\", this.i, pos.x, pos.y);\n      }\n\n      if (event.type === \"dragend\" && (this.previousX !== this.innerX || this.previousY !== this.innerY)) {\n        this.$emit(\"moved\", this.i, pos.x, pos.y);\n      }\n\n      this.eventBus.$emit(\"dragEvent\", event.type, this.i, pos.x, pos.y, this.innerH, this.innerW);\n    },\n    calcPosition: function calcPosition(x, y, w, h) {\n      var colWidth = this.calcColWidth(); // add rtl support\n\n      var out;\n\n      if (this.renderRtl) {\n        out = {\n          right: Math.round(colWidth * x + (x + 1) * this.margin[0]),\n          top: Math.round(this.rowHeight * y + (y + 1) * this.margin[1]),\n          // 0 * Infinity === NaN, which causes problems with resize constriants;\n          // Fix this if it occurs.\n          // Note we do it here rather than later because Math.round(Infinity) causes deopt\n          width: w === Infinity ? w : Math.round(colWidth * w + Math.max(0, w - 1) * this.margin[0]),\n          height: h === Infinity ? h : Math.round(this.rowHeight * h + Math.max(0, h - 1) * this.margin[1])\n        };\n      } else {\n        out = {\n          left: Math.round(colWidth * x + (x + 1) * this.margin[0]),\n          top: Math.round(this.rowHeight * y + (y + 1) * this.margin[1]),\n          // 0 * Infinity === NaN, which causes problems with resize constriants;\n          // Fix this if it occurs.\n          // Note we do it here rather than later because Math.round(Infinity) causes deopt\n          width: w === Infinity ? w : Math.round(colWidth * w + Math.max(0, w - 1) * this.margin[0]),\n          height: h === Infinity ? h : Math.round(this.rowHeight * h + Math.max(0, h - 1) * this.margin[1])\n        };\n      }\n\n      return out;\n    },\n\n    /**\n     * Translate x and y coordinates from pixels to grid units.\n     * @param  {Number} top  Top position (relative to parent) in pixels.\n     * @param  {Number} left Left position (relative to parent) in pixels.\n     * @return {Object} x and y in grid units.\n     */\n    // TODO check if this function needs change in order to support rtl.\n    calcXY: function calcXY(top, left) {\n      var colWidth = this.calcColWidth(); // left = colWidth * x + margin * (x + 1)\n      // l = cx + m(x+1)\n      // l = cx + mx + m\n      // l - m = cx + mx\n      // l - m = x(c + m)\n      // (l - m) / (c + m) = x\n      // x = (left - margin) / (coldWidth + margin)\n\n      var x = Math.round((left - this.margin[0]) / (colWidth + this.margin[0]));\n      var y = Math.round((top - this.margin[1]) / (this.rowHeight + this.margin[1])); // Capping\n\n      x = Math.max(Math.min(x, this.cols - this.innerW), 0);\n      y = Math.max(Math.min(y, this.maxRows - this.innerH), 0);\n      return {\n        x: x,\n        y: y\n      };\n    },\n    // Helper for generating column width\n    calcColWidth: function calcColWidth() {\n      var colWidth = (this.containerWidth - this.margin[0] * (this.cols + 1)) / this.cols; // console.log(\"### COLS=\" + this.cols + \" COL WIDTH=\" + colWidth + \" MARGIN \" + this.margin[0]);\n\n      return colWidth;\n    },\n    // This can either be called:\n    // calcGridItemWHPx(w, colWidth, margin[0])\n    // or\n    // calcGridItemWHPx(h, rowHeight, margin[1])\n    calcGridItemWHPx: function calcGridItemWHPx(gridUnits, colOrRowSize, marginPx) {\n      // 0 * Infinity === NaN, which causes problems with resize contraints\n      if (!Number.isFinite(gridUnits)) return gridUnits;\n      return Math.round(colOrRowSize * gridUnits + Math.max(0, gridUnits - 1) * marginPx);\n    },\n    // Similar to _.clamp\n    clamp: function clamp(num, lowerBound, upperBound) {\n      return Math.max(Math.min(num, upperBound), lowerBound);\n    },\n\n    /**\n     * Given a height and width in pixel values, calculate grid units.\n     * @param  {Number} height Height in pixels.\n     * @param  {Number} width  Width in pixels.\n     * @param  {Boolean} autoSizeFlag  function autoSize identifier.\n     * @return {Object} w, h as grid units.\n     */\n    calcWH: function calcWH(height, width) {\n      var autoSizeFlag = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n      var colWidth = this.calcColWidth(); // width = colWidth * w - (margin * (w - 1))\n      // ...\n      // w = (width + margin) / (colWidth + margin)\n\n      var w = Math.round((width + this.margin[0]) / (colWidth + this.margin[0]));\n      var h = 0;\n\n      if (!autoSizeFlag) {\n        h = Math.round((height + this.margin[1]) / (this.rowHeight + this.margin[1]));\n      } else {\n        h = Math.ceil((height + this.margin[1]) / (this.rowHeight + this.margin[1]));\n      } // Capping\n\n\n      w = Math.max(Math.min(w, this.cols - this.innerX), 0);\n      h = Math.max(Math.min(h, this.maxRows - this.innerY), 0);\n      return {\n        w: w,\n        h: h\n      };\n    },\n    updateWidth: function updateWidth(width, colNum) {\n      this.containerWidth = width;\n\n      if (colNum !== undefined && colNum !== null) {\n        this.cols = colNum;\n      }\n    },\n    compact: function compact() {\n      this.createStyle();\n    },\n    tryMakeDraggable: function tryMakeDraggable() {\n      var self = this;\n\n      if (this.interactObj === null || this.interactObj === undefined) {\n        this.interactObj = _interactjs_interact(this.$refs.item);\n\n        if (!this.useStyleCursor) {\n          this.interactObj.styleCursor(false);\n        }\n      }\n\n      if (this.draggable && !this.static) {\n        var opts = _objectSpread({\n          ignoreFrom: this.dragIgnoreFrom,\n          allowFrom: this.dragAllowFrom\n        }, this.dragOption);\n\n        this.interactObj.draggable(opts);\n        /*this.interactObj.draggable({allowFrom: '.vue-draggable-handle'});*/\n\n        if (!this.dragEventSet) {\n          this.dragEventSet = true;\n          this.interactObj.on('dragstart dragmove dragend', function (event) {\n            self.handleDrag(event);\n          });\n        }\n      } else {\n        this.interactObj.draggable({\n          enabled: false\n        });\n      }\n    },\n    tryMakeResizable: function tryMakeResizable() {\n      var self = this;\n\n      if (this.interactObj === null || this.interactObj === undefined) {\n        this.interactObj = _interactjs_interact(this.$refs.item);\n\n        if (!this.useStyleCursor) {\n          this.interactObj.styleCursor(false);\n        }\n      }\n\n      if (this.resizable && !this.static) {\n        var maximum = this.calcPosition(0, 0, this.maxW, this.maxH);\n        var minimum = this.calcPosition(0, 0, this.minW, this.minH); // console.log(\"### MAX \" + JSON.stringify(maximum));\n        // console.log(\"### MIN \" + JSON.stringify(minimum));\n\n        var opts = _objectSpread({\n          // allowFrom: \".\" + this.resizableHandleClass.trim().replace(\" \", \".\"),\n          edges: {\n            left: false,\n            right: \".\" + this.resizableHandleClass.trim().replace(\" \", \".\"),\n            bottom: \".\" + this.resizableHandleClass.trim().replace(\" \", \".\"),\n            top: false\n          },\n          ignoreFrom: this.resizeIgnoreFrom,\n          restrictSize: {\n            min: {\n              height: minimum.height * this.transformScale,\n              width: minimum.width * this.transformScale\n            },\n            max: {\n              height: maximum.height * this.transformScale,\n              width: maximum.width * this.transformScale\n            }\n          }\n        }, this.resizeOption);\n\n        if (this.preserveAspectRatio) {\n          opts.modifiers = [_interactjs_interact.modifiers.aspectRatio({\n            ratio: 'preserve'\n          })];\n        }\n\n        this.interactObj.resizable(opts);\n\n        if (!this.resizeEventSet) {\n          this.resizeEventSet = true;\n          this.interactObj.on('resizestart resizemove resizeend', function (event) {\n            self.handleResize(event);\n          });\n        }\n      } else {\n        this.interactObj.resizable({\n          enabled: false\n        });\n      }\n    },\n    autoSize: function autoSize() {\n      // ok here we want to calculate if a resize is needed\n      this.previousW = this.innerW;\n      this.previousH = this.innerH;\n      var newSize = this.$slots.default[0].elm.getBoundingClientRect();\n      var pos = this.calcWH(newSize.height, newSize.width, true);\n\n      if (pos.w < this.minW) {\n        pos.w = this.minW;\n      }\n\n      if (pos.w > this.maxW) {\n        pos.w = this.maxW;\n      }\n\n      if (pos.h < this.minH) {\n        pos.h = this.minH;\n      }\n\n      if (pos.h > this.maxH) {\n        pos.h = this.maxH;\n      }\n\n      if (pos.h < 1) {\n        pos.h = 1;\n      }\n\n      if (pos.w < 1) {\n        pos.w = 1;\n      } // this.lastW = x; // basically, this is copied from resizehandler, but shouldn't be needed\n      // this.lastH = y;\n\n\n      if (this.innerW !== pos.w || this.innerH !== pos.h) {\n        this.$emit(\"resize\", this.i, pos.h, pos.w, newSize.height, newSize.width);\n      }\n\n      if (this.previousW !== pos.w || this.previousH !== pos.h) {\n        this.$emit(\"resized\", this.i, pos.h, pos.w, newSize.height, newSize.width);\n        this.eventBus.$emit(\"resizeEvent\", \"resizeend\", this.i, this.innerX, this.innerY, pos.h, pos.w);\n      }\n    }\n  }\n});\n// CONCATENATED MODULE: ./src/components/GridItem.vue?vue&type=script&lang=js&\n /* harmony default export */ var components_GridItemvue_type_script_lang_js_ = (GridItemvue_type_script_lang_js_); \n// EXTERNAL MODULE: ./src/components/GridItem.vue?vue&type=style&index=0&lang=css&\nvar GridItemvue_type_style_index_0_lang_css_ = __webpack_require__(\"5ed4\");\n\n// EXTERNAL MODULE: ./node_modules/vue-loader/lib/runtime/componentNormalizer.js\nvar componentNormalizer = __webpack_require__(\"2877\");\n\n// CONCATENATED MODULE: ./src/components/GridItem.vue\n\n\n\n\n\n\n/* normalize component */\n\nvar component = Object(componentNormalizer[\"a\" /* default */])(\n  components_GridItemvue_type_script_lang_js_,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  null,\n  null\n  \n)\n\n/* harmony default export */ var GridItem = __webpack_exports__[\"a\"] = (component.exports);\n\n/***/ }),\n\n/***/ \"be13\":\n/***/ (function(module, exports) {\n\n// 7.2.1 RequireObjectCoercible(argument)\nmodule.exports = function (it) {\n  if (it == undefined) throw TypeError(\"Can't call method on  \" + it);\n  return it;\n};\n\n\n/***/ }),\n\n/***/ \"c274\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar utils = __webpack_require__(\"50bf\");\n\nmodule.exports = function batchProcessorMaker(options) {\n    options             = options || {};\n    var reporter        = options.reporter;\n    var asyncProcess    = utils.getOption(options, \"async\", true);\n    var autoProcess     = utils.getOption(options, \"auto\", true);\n\n    if(autoProcess && !asyncProcess) {\n        reporter && reporter.warn(\"Invalid options combination. auto=true and async=false is invalid. Setting async=true.\");\n        asyncProcess = true;\n    }\n\n    var batch = Batch();\n    var asyncFrameHandler;\n    var isProcessing = false;\n\n    function addFunction(level, fn) {\n        if(!isProcessing && autoProcess && asyncProcess && batch.size() === 0) {\n            // Since this is async, it is guaranteed to be executed after that the fn is added to the batch.\n            // This needs to be done before, since we're checking the size of the batch to be 0.\n            processBatchAsync();\n        }\n\n        batch.add(level, fn);\n    }\n\n    function processBatch() {\n        // Save the current batch, and create a new batch so that incoming functions are not added into the currently processing batch.\n        // Continue processing until the top-level batch is empty (functions may be added to the new batch while processing, and so on).\n        isProcessing = true;\n        while (batch.size()) {\n            var processingBatch = batch;\n            batch = Batch();\n            processingBatch.process();\n        }\n        isProcessing = false;\n    }\n\n    function forceProcessBatch(localAsyncProcess) {\n        if (isProcessing) {\n            return;\n        }\n\n        if(localAsyncProcess === undefined) {\n            localAsyncProcess = asyncProcess;\n        }\n\n        if(asyncFrameHandler) {\n            cancelFrame(asyncFrameHandler);\n            asyncFrameHandler = null;\n        }\n\n        if(localAsyncProcess) {\n            processBatchAsync();\n        } else {\n            processBatch();\n        }\n    }\n\n    function processBatchAsync() {\n        asyncFrameHandler = requestFrame(processBatch);\n    }\n\n    function clearBatch() {\n        batch           = {};\n        batchSize       = 0;\n        topLevel        = 0;\n        bottomLevel     = 0;\n    }\n\n    function cancelFrame(listener) {\n        // var cancel = window.cancelAnimationFrame || window.mozCancelAnimationFrame || window.webkitCancelAnimationFrame || window.clearTimeout;\n        var cancel = clearTimeout;\n        return cancel(listener);\n    }\n\n    function requestFrame(callback) {\n        // var raf = window.requestAnimationFrame || window.mozRequestAnimationFrame || window.webkitRequestAnimationFrame || function(fn) { return window.setTimeout(fn, 20); };\n        var raf = function(fn) { return setTimeout(fn, 0); };\n        return raf(callback);\n    }\n\n    return {\n        add: addFunction,\n        force: forceProcessBatch\n    };\n};\n\nfunction Batch() {\n    var batch       = {};\n    var size        = 0;\n    var topLevel    = 0;\n    var bottomLevel = 0;\n\n    function add(level, fn) {\n        if(!fn) {\n            fn = level;\n            level = 0;\n        }\n\n        if(level > topLevel) {\n            topLevel = level;\n        } else if(level < bottomLevel) {\n            bottomLevel = level;\n        }\n\n        if(!batch[level]) {\n            batch[level] = [];\n        }\n\n        batch[level].push(fn);\n        size++;\n    }\n\n    function process() {\n        for(var level = bottomLevel; level <= topLevel; level++) {\n            var fns = batch[level];\n\n            for(var i = 0; i < fns.length; i++) {\n                var fn = fns[i];\n                fn();\n            }\n        }\n    }\n\n    function getSize() {\n        return size;\n    }\n\n    return {\n        add: add,\n        process: process,\n        size: getSize\n    };\n}\n\n\n/***/ }),\n\n/***/ \"c366\":\n/***/ (function(module, exports, __webpack_require__) {\n\n// false -> Array#indexOf\n// true  -> Array#includes\nvar toIObject = __webpack_require__(\"6821\");\nvar toLength = __webpack_require__(\"9def\");\nvar toAbsoluteIndex = __webpack_require__(\"77f1\");\nmodule.exports = function (IS_INCLUDES) {\n  return function ($this, el, fromIndex) {\n    var O = toIObject($this);\n    var length = toLength(O.length);\n    var index = toAbsoluteIndex(fromIndex, length);\n    var value;\n    // Array#includes uses SameValueZero equality algorithm\n    // eslint-disable-next-line no-self-compare\n    if (IS_INCLUDES && el != el) while (length > index) {\n      value = O[index++];\n      // eslint-disable-next-line no-self-compare\n      if (value != value) return true;\n    // Array#indexOf ignores holes, Array#includes - not\n    } else for (;length > index; index++) if (IS_INCLUDES || index in O) {\n      if (O[index] === el) return IS_INCLUDES || index || 0;\n    } return !IS_INCLUDES && -1;\n  };\n};\n\n\n/***/ }),\n\n/***/ \"c5f6\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar global = __webpack_require__(\"7726\");\nvar has = __webpack_require__(\"69a8\");\nvar cof = __webpack_require__(\"2d95\");\nvar inheritIfRequired = __webpack_require__(\"5dbc\");\nvar toPrimitive = __webpack_require__(\"6a99\");\nvar fails = __webpack_require__(\"79e5\");\nvar gOPN = __webpack_require__(\"9093\").f;\nvar gOPD = __webpack_require__(\"11e9\").f;\nvar dP = __webpack_require__(\"86cc\").f;\nvar $trim = __webpack_require__(\"aa77\").trim;\nvar NUMBER = 'Number';\nvar $Number = global[NUMBER];\nvar Base = $Number;\nvar proto = $Number.prototype;\n// Opera ~12 has broken Object#toString\nvar BROKEN_COF = cof(__webpack_require__(\"2aeb\")(proto)) == NUMBER;\nvar TRIM = 'trim' in String.prototype;\n\n// 7.1.3 ToNumber(argument)\nvar toNumber = function (argument) {\n  var it = toPrimitive(argument, false);\n  if (typeof it == 'string' && it.length > 2) {\n    it = TRIM ? it.trim() : $trim(it, 3);\n    var first = it.charCodeAt(0);\n    var third, radix, maxCode;\n    if (first === 43 || first === 45) {\n      third = it.charCodeAt(2);\n      if (third === 88 || third === 120) return NaN; // Number('+0x1') should be NaN, old V8 fix\n    } else if (first === 48) {\n      switch (it.charCodeAt(1)) {\n        case 66: case 98: radix = 2; maxCode = 49; break; // fast equal /^0b[01]+$/i\n        case 79: case 111: radix = 8; maxCode = 55; break; // fast equal /^0o[0-7]+$/i\n        default: return +it;\n      }\n      for (var digits = it.slice(2), i = 0, l = digits.length, code; i < l; i++) {\n        code = digits.charCodeAt(i);\n        // parseInt parses a string to a first unavailable symbol\n        // but ToNumber should return NaN if a string contains unavailable symbols\n        if (code < 48 || code > maxCode) return NaN;\n      } return parseInt(digits, radix);\n    }\n  } return +it;\n};\n\nif (!$Number(' 0o1') || !$Number('0b1') || $Number('+0x1')) {\n  $Number = function Number(value) {\n    var it = arguments.length < 1 ? 0 : value;\n    var that = this;\n    return that instanceof $Number\n      // check on 1..constructor(foo) case\n      && (BROKEN_COF ? fails(function () { proto.valueOf.call(that); }) : cof(that) != NUMBER)\n        ? inheritIfRequired(new Base(toNumber(it)), that, $Number) : toNumber(it);\n  };\n  for (var keys = __webpack_require__(\"9e1e\") ? gOPN(Base) : (\n    // ES3:\n    'MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,' +\n    // ES6 (in case, if modules with ES6 Number statics required before):\n    'EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,' +\n    'MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger'\n  ).split(','), j = 0, key; keys.length > j; j++) {\n    if (has(Base, key = keys[j]) && !has($Number, key)) {\n      dP($Number, key, gOPD(Base, key));\n    }\n  }\n  $Number.prototype = proto;\n  proto.constructor = $Number;\n  __webpack_require__(\"2aba\")(global, NUMBER, $Number);\n}\n\n\n/***/ }),\n\n/***/ \"c69a\":\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = !__webpack_require__(\"9e1e\") && !__webpack_require__(\"79e5\")(function () {\n  return Object.defineProperty(__webpack_require__(\"230e\")('div'), 'a', { get: function () { return 7; } }).a != 7;\n});\n\n\n/***/ }),\n\n/***/ \"c8ba\":\n/***/ (function(module, exports) {\n\nvar g;\n\n// This works in non-strict mode\ng = (function() {\n\treturn this;\n})();\n\ntry {\n\t// This works if eval is allowed (see CSP)\n\tg = g || new Function(\"return this\")();\n} catch (e) {\n\t// This works if the window reference is available\n\tif (typeof window === \"object\") g = window;\n}\n\n// g can still be undefined, but nothing to do about it...\n// We return undefined, instead of nothing here, so it's\n// easier to handle this case. if(!global) { ...}\n\nmodule.exports = g;\n\n\n/***/ }),\n\n/***/ \"c946\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/**\n * Resize detection strategy that injects divs to elements in order to detect resize events on scroll events.\n * Heavily inspired by: https://github.com/marcj/css-element-queries/blob/master/src/ResizeSensor.js\n */\n\n\n\nvar forEach = __webpack_require__(\"b770\").forEach;\n\nmodule.exports = function(options) {\n    options             = options || {};\n    var reporter        = options.reporter;\n    var batchProcessor  = options.batchProcessor;\n    var getState        = options.stateHandler.getState;\n    var hasState        = options.stateHandler.hasState;\n    var idHandler       = options.idHandler;\n\n    if (!batchProcessor) {\n        throw new Error(\"Missing required dependency: batchProcessor\");\n    }\n\n    if (!reporter) {\n        throw new Error(\"Missing required dependency: reporter.\");\n    }\n\n    //TODO: Could this perhaps be done at installation time?\n    var scrollbarSizes = getScrollbarSizes();\n\n    var styleId = \"erd_scroll_detection_scrollbar_style\";\n    var detectionContainerClass = \"erd_scroll_detection_container\";\n\n    function initDocument(targetDocument) {\n        // Inject the scrollbar styling that prevents them from appearing sometimes in Chrome.\n        // The injected container needs to have a class, so that it may be styled with CSS (pseudo elements).\n        injectScrollStyle(targetDocument, styleId, detectionContainerClass);\n    }\n\n    initDocument(window.document);\n\n    function buildCssTextString(rules) {\n        var seperator = options.important ? \" !important; \" : \"; \";\n\n        return (rules.join(seperator) + seperator).trim();\n    }\n\n    function getScrollbarSizes() {\n        var width = 500;\n        var height = 500;\n\n        var child = document.createElement(\"div\");\n        child.style.cssText = buildCssTextString([\"position: absolute\", \"width: \" + width*2 + \"px\", \"height: \" + height*2 + \"px\", \"visibility: hidden\", \"margin: 0\", \"padding: 0\"]);\n\n        var container = document.createElement(\"div\");\n        container.style.cssText = buildCssTextString([\"position: absolute\", \"width: \" + width + \"px\", \"height: \" + height + \"px\", \"overflow: scroll\", \"visibility: none\", \"top: \" + -width*3 + \"px\", \"left: \" + -height*3 + \"px\", \"visibility: hidden\", \"margin: 0\", \"padding: 0\"]);\n\n        container.appendChild(child);\n\n        document.body.insertBefore(container, document.body.firstChild);\n\n        var widthSize = width - container.clientWidth;\n        var heightSize = height - container.clientHeight;\n\n        document.body.removeChild(container);\n\n        return {\n            width: widthSize,\n            height: heightSize\n        };\n    }\n\n    function injectScrollStyle(targetDocument, styleId, containerClass) {\n        function injectStyle(style, method) {\n            method = method || function (element) {\n                targetDocument.head.appendChild(element);\n            };\n\n            var styleElement = targetDocument.createElement(\"style\");\n            styleElement.innerHTML = style;\n            styleElement.id = styleId;\n            method(styleElement);\n            return styleElement;\n        }\n\n        if (!targetDocument.getElementById(styleId)) {\n            var containerAnimationClass = containerClass + \"_animation\";\n            var containerAnimationActiveClass = containerClass + \"_animation_active\";\n            var style = \"/* Created by the element-resize-detector library. */\\n\";\n            style += \".\" + containerClass + \" > div::-webkit-scrollbar { \" + buildCssTextString([\"display: none\"]) + \" }\\n\\n\";\n            style += \".\" + containerAnimationActiveClass + \" { \" + buildCssTextString([\"-webkit-animation-duration: 0.1s\", \"animation-duration: 0.1s\", \"-webkit-animation-name: \" + containerAnimationClass, \"animation-name: \" + containerAnimationClass]) + \" }\\n\";\n            style += \"@-webkit-keyframes \" + containerAnimationClass +  \" { 0% { opacity: 1; } 50% { opacity: 0; } 100% { opacity: 1; } }\\n\";\n            style += \"@keyframes \" + containerAnimationClass +          \" { 0% { opacity: 1; } 50% { opacity: 0; } 100% { opacity: 1; } }\";\n            injectStyle(style);\n        }\n    }\n\n    function addAnimationClass(element) {\n        element.className += \" \" + detectionContainerClass + \"_animation_active\";\n    }\n\n    function addEvent(el, name, cb) {\n        if (el.addEventListener) {\n            el.addEventListener(name, cb);\n        } else if(el.attachEvent) {\n            el.attachEvent(\"on\" + name, cb);\n        } else {\n            return reporter.error(\"[scroll] Don't know how to add event listeners.\");\n        }\n    }\n\n    function removeEvent(el, name, cb) {\n        if (el.removeEventListener) {\n            el.removeEventListener(name, cb);\n        } else if(el.detachEvent) {\n            el.detachEvent(\"on\" + name, cb);\n        } else {\n            return reporter.error(\"[scroll] Don't know how to remove event listeners.\");\n        }\n    }\n\n    function getExpandElement(element) {\n        return getState(element).container.childNodes[0].childNodes[0].childNodes[0];\n    }\n\n    function getShrinkElement(element) {\n        return getState(element).container.childNodes[0].childNodes[0].childNodes[1];\n    }\n\n    /**\n     * Adds a resize event listener to the element.\n     * @public\n     * @param {element} element The element that should have the listener added.\n     * @param {function} listener The listener callback to be called for each resize event of the element. The element will be given as a parameter to the listener callback.\n     */\n    function addListener(element, listener) {\n        var listeners = getState(element).listeners;\n\n        if (!listeners.push) {\n            throw new Error(\"Cannot add listener to an element that is not detectable.\");\n        }\n\n        getState(element).listeners.push(listener);\n    }\n\n    /**\n     * Makes an element detectable and ready to be listened for resize events. Will call the callback when the element is ready to be listened for resize changes.\n     * @private\n     * @param {object} options Optional options object.\n     * @param {element} element The element to make detectable\n     * @param {function} callback The callback to be called when the element is ready to be listened for resize changes. Will be called with the element as first parameter.\n     */\n    function makeDetectable(options, element, callback) {\n        if (!callback) {\n            callback = element;\n            element = options;\n            options = null;\n        }\n\n        options = options || {};\n\n        function debug() {\n            if (options.debug) {\n                var args = Array.prototype.slice.call(arguments);\n                args.unshift(idHandler.get(element), \"Scroll: \");\n                if (reporter.log.apply) {\n                    reporter.log.apply(null, args);\n                } else {\n                    for (var i = 0; i < args.length; i++) {\n                        reporter.log(args[i]);\n                    }\n                }\n            }\n        }\n\n        function isDetached(element) {\n            function isInDocument(element) {\n                var isInShadowRoot = element.getRootNode && element.getRootNode().contains(element);\n                return element === element.ownerDocument.body || element.ownerDocument.body.contains(element) || isInShadowRoot;\n            }\n\n            if (!isInDocument(element)) {\n                return true;\n            }\n\n            // FireFox returns null style in hidden iframes. See https://github.com/wnr/element-resize-detector/issues/68 and https://bugzilla.mozilla.org/show_bug.cgi?id=795520\n            if (window.getComputedStyle(element) === null) {\n                return true;\n            }\n\n            return false;\n        }\n\n        function isUnrendered(element) {\n            // Check the absolute positioned container since the top level container is display: inline.\n            var container = getState(element).container.childNodes[0];\n            var style = window.getComputedStyle(container);\n            return !style.width || style.width.indexOf(\"px\") === -1; //Can only compute pixel value when rendered.\n        }\n\n        function getStyle() {\n            // Some browsers only force layouts when actually reading the style properties of the style object, so make sure that they are all read here,\n            // so that the user of the function can be sure that it will perform the layout here, instead of later (important for batching).\n            var elementStyle            = window.getComputedStyle(element);\n            var style                   = {};\n            style.position              = elementStyle.position;\n            style.width                 = element.offsetWidth;\n            style.height                = element.offsetHeight;\n            style.top                   = elementStyle.top;\n            style.right                 = elementStyle.right;\n            style.bottom                = elementStyle.bottom;\n            style.left                  = elementStyle.left;\n            style.widthCSS              = elementStyle.width;\n            style.heightCSS             = elementStyle.height;\n            return style;\n        }\n\n        function storeStartSize() {\n            var style = getStyle();\n            getState(element).startSize = {\n                width: style.width,\n                height: style.height\n            };\n            debug(\"Element start size\", getState(element).startSize);\n        }\n\n        function initListeners() {\n            getState(element).listeners = [];\n        }\n\n        function storeStyle() {\n            debug(\"storeStyle invoked.\");\n            if (!getState(element)) {\n                debug(\"Aborting because element has been uninstalled\");\n                return;\n            }\n\n            var style = getStyle();\n            getState(element).style = style;\n        }\n\n        function storeCurrentSize(element, width, height) {\n            getState(element).lastWidth = width;\n            getState(element).lastHeight  = height;\n        }\n\n        function getExpandChildElement(element) {\n            return getExpandElement(element).childNodes[0];\n        }\n\n        function getWidthOffset() {\n            return 2 * scrollbarSizes.width + 1;\n        }\n\n        function getHeightOffset() {\n            return 2 * scrollbarSizes.height + 1;\n        }\n\n        function getExpandWidth(width) {\n            return width + 10 + getWidthOffset();\n        }\n\n        function getExpandHeight(height) {\n            return height + 10 + getHeightOffset();\n        }\n\n        function getShrinkWidth(width) {\n            return width * 2 + getWidthOffset();\n        }\n\n        function getShrinkHeight(height) {\n            return height * 2 + getHeightOffset();\n        }\n\n        function positionScrollbars(element, width, height) {\n            var expand          = getExpandElement(element);\n            var shrink          = getShrinkElement(element);\n            var expandWidth     = getExpandWidth(width);\n            var expandHeight    = getExpandHeight(height);\n            var shrinkWidth     = getShrinkWidth(width);\n            var shrinkHeight    = getShrinkHeight(height);\n            expand.scrollLeft   = expandWidth;\n            expand.scrollTop    = expandHeight;\n            shrink.scrollLeft   = shrinkWidth;\n            shrink.scrollTop    = shrinkHeight;\n        }\n\n        function injectContainerElement() {\n            var container = getState(element).container;\n\n            if (!container) {\n                container                   = document.createElement(\"div\");\n                container.className         = detectionContainerClass;\n                container.style.cssText     = buildCssTextString([\"visibility: hidden\", \"display: inline\", \"width: 0px\", \"height: 0px\", \"z-index: -1\", \"overflow: hidden\", \"margin: 0\", \"padding: 0\"]);\n                getState(element).container = container;\n                addAnimationClass(container);\n                element.appendChild(container);\n\n                var onAnimationStart = function () {\n                    getState(element).onRendered && getState(element).onRendered();\n                };\n\n                addEvent(container, \"animationstart\", onAnimationStart);\n\n                // Store the event handler here so that they may be removed when uninstall is called.\n                // See uninstall function for an explanation why it is needed.\n                getState(element).onAnimationStart = onAnimationStart;\n            }\n\n            return container;\n        }\n\n        function injectScrollElements() {\n            function alterPositionStyles() {\n                var style = getState(element).style;\n\n                if(style.position === \"static\") {\n                    element.style.setProperty(\"position\", \"relative\",options.important ? \"important\" : \"\");\n\n                    var removeRelativeStyles = function(reporter, element, style, property) {\n                        function getNumericalValue(value) {\n                            return value.replace(/[^-\\d\\.]/g, \"\");\n                        }\n\n                        var value = style[property];\n\n                        if(value !== \"auto\" && getNumericalValue(value) !== \"0\") {\n                            reporter.warn(\"An element that is positioned static has style.\" + property + \"=\" + value + \" which is ignored due to the static positioning. The element will need to be positioned relative, so the style.\" + property + \" will be set to 0. Element: \", element);\n                            element.style[property] = 0;\n                        }\n                    };\n\n                    //Check so that there are no accidental styles that will make the element styled differently now that is is relative.\n                    //If there are any, set them to 0 (this should be okay with the user since the style properties did nothing before [since the element was positioned static] anyway).\n                    removeRelativeStyles(reporter, element, style, \"top\");\n                    removeRelativeStyles(reporter, element, style, \"right\");\n                    removeRelativeStyles(reporter, element, style, \"bottom\");\n                    removeRelativeStyles(reporter, element, style, \"left\");\n                }\n            }\n\n            function getLeftTopBottomRightCssText(left, top, bottom, right) {\n                left = (!left ? \"0\" : (left + \"px\"));\n                top = (!top ? \"0\" : (top + \"px\"));\n                bottom = (!bottom ? \"0\" : (bottom + \"px\"));\n                right = (!right ? \"0\" : (right + \"px\"));\n\n                return [\"left: \" + left, \"top: \" + top, \"right: \" + right, \"bottom: \" + bottom];\n            }\n\n            debug(\"Injecting elements\");\n\n            if (!getState(element)) {\n                debug(\"Aborting because element has been uninstalled\");\n                return;\n            }\n\n            alterPositionStyles();\n\n            var rootContainer = getState(element).container;\n\n            if (!rootContainer) {\n                rootContainer = injectContainerElement();\n            }\n\n            // Due to this WebKit bug https://bugs.webkit.org/show_bug.cgi?id=80808 (currently fixed in Blink, but still present in WebKit browsers such as Safari),\n            // we need to inject two containers, one that is width/height 100% and another that is left/top -1px so that the final container always is 1x1 pixels bigger than\n            // the targeted element.\n            // When the bug is resolved, \"containerContainer\" may be removed.\n\n            // The outer container can occasionally be less wide than the targeted when inside inline elements element in WebKit (see https://bugs.webkit.org/show_bug.cgi?id=152980).\n            // This should be no problem since the inner container either way makes sure the injected scroll elements are at least 1x1 px.\n\n            var scrollbarWidth          = scrollbarSizes.width;\n            var scrollbarHeight         = scrollbarSizes.height;\n            var containerContainerStyle = buildCssTextString([\"position: absolute\", \"flex: none\", \"overflow: hidden\", \"z-index: -1\", \"visibility: hidden\", \"width: 100%\", \"height: 100%\", \"left: 0px\", \"top: 0px\"]);\n            var containerStyle          = buildCssTextString([\"position: absolute\", \"flex: none\", \"overflow: hidden\", \"z-index: -1\", \"visibility: hidden\"].concat(getLeftTopBottomRightCssText(-(1 + scrollbarWidth), -(1 + scrollbarHeight), -scrollbarHeight, -scrollbarWidth)));\n            var expandStyle             = buildCssTextString([\"position: absolute\", \"flex: none\", \"overflow: scroll\", \"z-index: -1\", \"visibility: hidden\", \"width: 100%\", \"height: 100%\"]);\n            var shrinkStyle             = buildCssTextString([\"position: absolute\", \"flex: none\", \"overflow: scroll\", \"z-index: -1\", \"visibility: hidden\", \"width: 100%\", \"height: 100%\"]);\n            var expandChildStyle        = buildCssTextString([\"position: absolute\", \"left: 0\", \"top: 0\"]);\n            var shrinkChildStyle        = buildCssTextString([\"position: absolute\", \"width: 200%\", \"height: 200%\"]);\n\n            var containerContainer      = document.createElement(\"div\");\n            var container               = document.createElement(\"div\");\n            var expand                  = document.createElement(\"div\");\n            var expandChild             = document.createElement(\"div\");\n            var shrink                  = document.createElement(\"div\");\n            var shrinkChild             = document.createElement(\"div\");\n\n            // Some browsers choke on the resize system being rtl, so force it to ltr. https://github.com/wnr/element-resize-detector/issues/56\n            // However, dir should not be set on the top level container as it alters the dimensions of the target element in some browsers.\n            containerContainer.dir              = \"ltr\";\n\n            containerContainer.style.cssText    = containerContainerStyle;\n            containerContainer.className        = detectionContainerClass;\n            container.className                 = detectionContainerClass;\n            container.style.cssText             = containerStyle;\n            expand.style.cssText                = expandStyle;\n            expandChild.style.cssText           = expandChildStyle;\n            shrink.style.cssText                = shrinkStyle;\n            shrinkChild.style.cssText           = shrinkChildStyle;\n\n            expand.appendChild(expandChild);\n            shrink.appendChild(shrinkChild);\n            container.appendChild(expand);\n            container.appendChild(shrink);\n            containerContainer.appendChild(container);\n            rootContainer.appendChild(containerContainer);\n\n            function onExpandScroll() {\n                var state = getState(element);\n                if (state && state.onExpand) {\n                    state.onExpand();\n                } else {\n                    debug(\"Aborting expand scroll handler: element has been uninstalled\");\n                }\n            }\n\n            function onShrinkScroll() {\n                var state = getState(element);\n                if (state && state.onShrink) {\n                    state.onShrink();\n                } else {\n                    debug(\"Aborting shrink scroll handler: element has been uninstalled\");\n                }\n            }\n\n            addEvent(expand, \"scroll\", onExpandScroll);\n            addEvent(shrink, \"scroll\", onShrinkScroll);\n\n            // Store the event handlers here so that they may be removed when uninstall is called.\n            // See uninstall function for an explanation why it is needed.\n            getState(element).onExpandScroll = onExpandScroll;\n            getState(element).onShrinkScroll = onShrinkScroll;\n        }\n\n        function registerListenersAndPositionElements() {\n            function updateChildSizes(element, width, height) {\n                var expandChild             = getExpandChildElement(element);\n                var expandWidth             = getExpandWidth(width);\n                var expandHeight            = getExpandHeight(height);\n                expandChild.style.setProperty(\"width\", expandWidth + \"px\", options.important ? \"important\" : \"\");\n                expandChild.style.setProperty(\"height\", expandHeight + \"px\", options.important ? \"important\" : \"\");\n            }\n\n            function updateDetectorElements(done) {\n                var width           = element.offsetWidth;\n                var height          = element.offsetHeight;\n\n                // Check whether the size has actually changed since last time the algorithm ran. If not, some steps may be skipped.\n                var sizeChanged = width !== getState(element).lastWidth || height !== getState(element).lastHeight;\n\n                debug(\"Storing current size\", width, height);\n\n                // Store the size of the element sync here, so that multiple scroll events may be ignored in the event listeners.\n                // Otherwise the if-check in handleScroll is useless.\n                storeCurrentSize(element, width, height);\n\n                // Since we delay the processing of the batch, there is a risk that uninstall has been called before the batch gets to execute.\n                // Since there is no way to cancel the fn executions, we need to add an uninstall guard to all fns of the batch.\n\n                batchProcessor.add(0, function performUpdateChildSizes() {\n                    if (!sizeChanged) {\n                        return;\n                    }\n\n                    if (!getState(element)) {\n                        debug(\"Aborting because element has been uninstalled\");\n                        return;\n                    }\n\n                    if (!areElementsInjected()) {\n                        debug(\"Aborting because element container has not been initialized\");\n                        return;\n                    }\n\n                    if (options.debug) {\n                        var w = element.offsetWidth;\n                        var h = element.offsetHeight;\n\n                        if (w !== width || h !== height) {\n                            reporter.warn(idHandler.get(element), \"Scroll: Size changed before updating detector elements.\");\n                        }\n                    }\n\n                    updateChildSizes(element, width, height);\n                });\n\n                batchProcessor.add(1, function updateScrollbars() {\n                    // This function needs to be invoked event though the size is unchanged. The element could have been resized very quickly and then\n                    // been restored to the original size, which will have changed the scrollbar positions.\n\n                    if (!getState(element)) {\n                        debug(\"Aborting because element has been uninstalled\");\n                        return;\n                    }\n\n                    if (!areElementsInjected()) {\n                        debug(\"Aborting because element container has not been initialized\");\n                        return;\n                    }\n\n                    positionScrollbars(element, width, height);\n                });\n\n                if (sizeChanged && done) {\n                    batchProcessor.add(2, function () {\n                        if (!getState(element)) {\n                            debug(\"Aborting because element has been uninstalled\");\n                            return;\n                        }\n\n                        if (!areElementsInjected()) {\n                          debug(\"Aborting because element container has not been initialized\");\n                          return;\n                        }\n\n                        done();\n                    });\n                }\n            }\n\n            function areElementsInjected() {\n                return !!getState(element).container;\n            }\n\n            function notifyListenersIfNeeded() {\n                function isFirstNotify() {\n                    return getState(element).lastNotifiedWidth === undefined;\n                }\n\n                debug(\"notifyListenersIfNeeded invoked\");\n\n                var state = getState(element);\n\n                // Don't notify if the current size is the start size, and this is the first notification.\n                if (isFirstNotify() && state.lastWidth === state.startSize.width && state.lastHeight === state.startSize.height) {\n                    return debug(\"Not notifying: Size is the same as the start size, and there has been no notification yet.\");\n                }\n\n                // Don't notify if the size already has been notified.\n                if (state.lastWidth === state.lastNotifiedWidth && state.lastHeight === state.lastNotifiedHeight) {\n                    return debug(\"Not notifying: Size already notified\");\n                }\n\n\n                debug(\"Current size not notified, notifying...\");\n                state.lastNotifiedWidth = state.lastWidth;\n                state.lastNotifiedHeight = state.lastHeight;\n                forEach(getState(element).listeners, function (listener) {\n                    listener(element);\n                });\n            }\n\n            function handleRender() {\n                debug(\"startanimation triggered.\");\n\n                if (isUnrendered(element)) {\n                    debug(\"Ignoring since element is still unrendered...\");\n                    return;\n                }\n\n                debug(\"Element rendered.\");\n                var expand = getExpandElement(element);\n                var shrink = getShrinkElement(element);\n                if (expand.scrollLeft === 0 || expand.scrollTop === 0 || shrink.scrollLeft === 0 || shrink.scrollTop === 0) {\n                    debug(\"Scrollbars out of sync. Updating detector elements...\");\n                    updateDetectorElements(notifyListenersIfNeeded);\n                }\n            }\n\n            function handleScroll() {\n                debug(\"Scroll detected.\");\n\n                if (isUnrendered(element)) {\n                    // Element is still unrendered. Skip this scroll event.\n                    debug(\"Scroll event fired while unrendered. Ignoring...\");\n                    return;\n                }\n\n                updateDetectorElements(notifyListenersIfNeeded);\n            }\n\n            debug(\"registerListenersAndPositionElements invoked.\");\n\n            if (!getState(element)) {\n                debug(\"Aborting because element has been uninstalled\");\n                return;\n            }\n\n            getState(element).onRendered = handleRender;\n            getState(element).onExpand = handleScroll;\n            getState(element).onShrink = handleScroll;\n\n            var style = getState(element).style;\n            updateChildSizes(element, style.width, style.height);\n        }\n\n        function finalizeDomMutation() {\n            debug(\"finalizeDomMutation invoked.\");\n\n            if (!getState(element)) {\n                debug(\"Aborting because element has been uninstalled\");\n                return;\n            }\n\n            var style = getState(element).style;\n            storeCurrentSize(element, style.width, style.height);\n            positionScrollbars(element, style.width, style.height);\n        }\n\n        function ready() {\n            callback(element);\n        }\n\n        function install() {\n            debug(\"Installing...\");\n            initListeners();\n            storeStartSize();\n\n            batchProcessor.add(0, storeStyle);\n            batchProcessor.add(1, injectScrollElements);\n            batchProcessor.add(2, registerListenersAndPositionElements);\n            batchProcessor.add(3, finalizeDomMutation);\n            batchProcessor.add(4, ready);\n        }\n\n        debug(\"Making detectable...\");\n\n        if (isDetached(element)) {\n            debug(\"Element is detached\");\n\n            injectContainerElement();\n\n            debug(\"Waiting until element is attached...\");\n\n            getState(element).onRendered = function () {\n                debug(\"Element is now attached\");\n                install();\n            };\n        } else {\n            install();\n        }\n    }\n\n    function uninstall(element) {\n        var state = getState(element);\n\n        if (!state) {\n            // Uninstall has been called on a non-erd element.\n            return;\n        }\n\n        // Uninstall may have been called in the following scenarios:\n        // (1) Right between the sync code and async batch (here state.busy = true, but nothing have been registered or injected).\n        // (2) In the ready callback of the last level of the batch by another element (here, state.busy = true, but all the stuff has been injected).\n        // (3) After the installation process (here, state.busy = false and all the stuff has been injected).\n        // So to be on the safe side, let's check for each thing before removing.\n\n        // We need to remove the event listeners, because otherwise the event might fire on an uninstall element which results in an error when trying to get the state of the element.\n        state.onExpandScroll && removeEvent(getExpandElement(element), \"scroll\", state.onExpandScroll);\n        state.onShrinkScroll && removeEvent(getShrinkElement(element), \"scroll\", state.onShrinkScroll);\n        state.onAnimationStart && removeEvent(state.container, \"animationstart\", state.onAnimationStart);\n\n        state.container && element.removeChild(state.container);\n    }\n\n    return {\n        makeDetectable: makeDetectable,\n        addListener: addListener,\n        uninstall: uninstall,\n        initDocument: initDocument\n    };\n};\n\n\n/***/ }),\n\n/***/ \"ca5a\":\n/***/ (function(module, exports) {\n\nvar id = 0;\nvar px = Math.random();\nmodule.exports = function (key) {\n  return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36));\n};\n\n\n/***/ }),\n\n/***/ \"cadf\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar addToUnscopables = __webpack_require__(\"9c6c\");\nvar step = __webpack_require__(\"d53b\");\nvar Iterators = __webpack_require__(\"84f2\");\nvar toIObject = __webpack_require__(\"6821\");\n\n// 22.1.3.4 Array.prototype.entries()\n// 22.1.3.13 Array.prototype.keys()\n// 22.1.3.29 Array.prototype.values()\n// 22.1.3.30 Array.prototype[@@iterator]()\nmodule.exports = __webpack_require__(\"01f9\")(Array, 'Array', function (iterated, kind) {\n  this._t = toIObject(iterated); // target\n  this._i = 0;                   // next index\n  this._k = kind;                // kind\n// 22.1.5.2.1 %ArrayIteratorPrototype%.next()\n}, function () {\n  var O = this._t;\n  var kind = this._k;\n  var index = this._i++;\n  if (!O || index >= O.length) {\n    this._t = undefined;\n    return step(1);\n  }\n  if (kind == 'keys') return step(0, index);\n  if (kind == 'values') return step(0, O[index]);\n  return step(0, [index, O[index]]);\n}, 'values');\n\n// argumentsList[@@iterator] is %ArrayProto_values% (9.4.4.6, 9.4.4.7)\nIterators.Arguments = Iterators.Array;\n\naddToUnscopables('keys');\naddToUnscopables('values');\naddToUnscopables('entries');\n\n\n/***/ }),\n\n/***/ \"cb7c\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar isObject = __webpack_require__(\"d3f4\");\nmodule.exports = function (it) {\n  if (!isObject(it)) throw TypeError(it + ' is not an object!');\n  return it;\n};\n\n\n/***/ }),\n\n/***/ \"ce10\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar has = __webpack_require__(\"69a8\");\nvar toIObject = __webpack_require__(\"6821\");\nvar arrayIndexOf = __webpack_require__(\"c366\")(false);\nvar IE_PROTO = __webpack_require__(\"613b\")('IE_PROTO');\n\nmodule.exports = function (object, names) {\n  var O = toIObject(object);\n  var i = 0;\n  var result = [];\n  var key;\n  for (key in O) if (key != IE_PROTO) has(O, key) && result.push(key);\n  // Don't enum bug & hidden keys\n  while (names.length > i) if (has(O, key = names[i++])) {\n    ~arrayIndexOf(result, key) || result.push(key);\n  }\n  return result;\n};\n\n\n/***/ }),\n\n/***/ \"d3f4\":\n/***/ (function(module, exports) {\n\nmodule.exports = function (it) {\n  return typeof it === 'object' ? it !== null : typeof it === 'function';\n};\n\n\n/***/ }),\n\n/***/ \"d53b\":\n/***/ (function(module, exports) {\n\nmodule.exports = function (done, value) {\n  return { value: value, done: !!done };\n};\n\n\n/***/ }),\n\n/***/ \"d6eb\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar prop = \"_erd\";\n\nfunction initState(element) {\n    element[prop] = {};\n    return getState(element);\n}\n\nfunction getState(element) {\n    return element[prop];\n}\n\nfunction cleanState(element) {\n    delete element[prop];\n}\n\nmodule.exports = {\n    initState: initState,\n    getState: getState,\n    cleanState: cleanState\n};\n\n\n/***/ }),\n\n/***/ \"d8e8\":\n/***/ (function(module, exports) {\n\nmodule.exports = function (it) {\n  if (typeof it != 'function') throw TypeError(it + ' is not a function!');\n  return it;\n};\n\n\n/***/ }),\n\n/***/ \"e11e\":\n/***/ (function(module, exports) {\n\n// IE 8- don't enum bug keys\nmodule.exports = (\n  'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf'\n).split(',');\n\n\n/***/ }),\n\n/***/ \"e279\":\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var _node_modules_vue_style_loader_index_js_ref_6_oneOf_1_0_node_modules_css_loader_index_js_ref_6_oneOf_1_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_src_index_js_ref_6_oneOf_1_2_node_modules_postcss_loader_src_index_js_ref_6_oneOf_1_3_node_modules_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_lib_index_js_vue_loader_options_GridLayout_vue_vue_type_style_index_0_lang_css___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(\"1156\");\n/* harmony import */ var _node_modules_vue_style_loader_index_js_ref_6_oneOf_1_0_node_modules_css_loader_index_js_ref_6_oneOf_1_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_src_index_js_ref_6_oneOf_1_2_node_modules_postcss_loader_src_index_js_ref_6_oneOf_1_3_node_modules_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_lib_index_js_vue_loader_options_GridLayout_vue_vue_type_style_index_0_lang_css___WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_vue_style_loader_index_js_ref_6_oneOf_1_0_node_modules_css_loader_index_js_ref_6_oneOf_1_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_src_index_js_ref_6_oneOf_1_2_node_modules_postcss_loader_src_index_js_ref_6_oneOf_1_3_node_modules_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_lib_index_js_vue_loader_options_GridLayout_vue_vue_type_style_index_0_lang_css___WEBPACK_IMPORTED_MODULE_0__);\n/* unused harmony reexport * */\n\n\n/***/ }),\n\n/***/ \"eec4\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar forEach                 = __webpack_require__(\"b770\").forEach;\nvar elementUtilsMaker       = __webpack_require__(\"5be5\");\nvar listenerHandlerMaker    = __webpack_require__(\"49ad\");\nvar idGeneratorMaker        = __webpack_require__(\"2cef\");\nvar idHandlerMaker          = __webpack_require__(\"5058\");\nvar reporterMaker           = __webpack_require__(\"abb4\");\nvar browserDetector         = __webpack_require__(\"18e9\");\nvar batchProcessorMaker     = __webpack_require__(\"c274\");\nvar stateHandler            = __webpack_require__(\"d6eb\");\n\n//Detection strategies.\nvar objectStrategyMaker     = __webpack_require__(\"18d2\");\nvar scrollStrategyMaker     = __webpack_require__(\"c946\");\n\nfunction isCollection(obj) {\n    return Array.isArray(obj) || obj.length !== undefined;\n}\n\nfunction toArray(collection) {\n    if (!Array.isArray(collection)) {\n        var array = [];\n        forEach(collection, function (obj) {\n            array.push(obj);\n        });\n        return array;\n    } else {\n        return collection;\n    }\n}\n\nfunction isElement(obj) {\n    return obj && obj.nodeType === 1;\n}\n\n/**\n * @typedef idHandler\n * @type {object}\n * @property {function} get Gets the resize detector id of the element.\n * @property {function} set Generate and sets the resize detector id of the element.\n */\n\n/**\n * @typedef Options\n * @type {object}\n * @property {boolean} callOnAdd    Determines if listeners should be called when they are getting added.\n                                    Default is true. If true, the listener is guaranteed to be called when it has been added.\n                                    If false, the listener will not be guarenteed to be called when it has been added (does not prevent it from being called).\n * @property {idHandler} idHandler  A custom id handler that is responsible for generating, setting and retrieving id's for elements.\n                                    If not provided, a default id handler will be used.\n * @property {reporter} reporter    A custom reporter that handles reporting logs, warnings and errors.\n                                    If not provided, a default id handler will be used.\n                                    If set to false, then nothing will be reported.\n * @property {boolean} debug        If set to true, the the system will report debug messages as default for the listenTo method.\n */\n\n/**\n * Creates an element resize detector instance.\n * @public\n * @param {Options?} options Optional global options object that will decide how this instance will work.\n */\nmodule.exports = function(options) {\n    options = options || {};\n\n    //idHandler is currently not an option to the listenTo function, so it should not be added to globalOptions.\n    var idHandler;\n\n    if (options.idHandler) {\n        // To maintain compatability with idHandler.get(element, readonly), make sure to wrap the given idHandler\n        // so that readonly flag always is true when it's used here. This may be removed next major version bump.\n        idHandler = {\n            get: function (element) { return options.idHandler.get(element, true); },\n            set: options.idHandler.set\n        };\n    } else {\n        var idGenerator = idGeneratorMaker();\n        var defaultIdHandler = idHandlerMaker({\n            idGenerator: idGenerator,\n            stateHandler: stateHandler\n        });\n        idHandler = defaultIdHandler;\n    }\n\n    //reporter is currently not an option to the listenTo function, so it should not be added to globalOptions.\n    var reporter = options.reporter;\n\n    if(!reporter) {\n        //If options.reporter is false, then the reporter should be quiet.\n        var quiet = reporter === false;\n        reporter = reporterMaker(quiet);\n    }\n\n    //batchProcessor is currently not an option to the listenTo function, so it should not be added to globalOptions.\n    var batchProcessor = getOption(options, \"batchProcessor\", batchProcessorMaker({ reporter: reporter }));\n\n    //Options to be used as default for the listenTo function.\n    var globalOptions = {};\n    globalOptions.callOnAdd     = !!getOption(options, \"callOnAdd\", true);\n    globalOptions.debug         = !!getOption(options, \"debug\", false);\n\n    var eventListenerHandler    = listenerHandlerMaker(idHandler);\n    var elementUtils            = elementUtilsMaker({\n        stateHandler: stateHandler\n    });\n\n    //The detection strategy to be used.\n    var detectionStrategy;\n    var desiredStrategy = getOption(options, \"strategy\", \"object\");\n    var importantCssRules = getOption(options, \"important\", false);\n    var strategyOptions = {\n        reporter: reporter,\n        batchProcessor: batchProcessor,\n        stateHandler: stateHandler,\n        idHandler: idHandler,\n        important: importantCssRules\n    };\n\n    if(desiredStrategy === \"scroll\") {\n        if (browserDetector.isLegacyOpera()) {\n            reporter.warn(\"Scroll strategy is not supported on legacy Opera. Changing to object strategy.\");\n            desiredStrategy = \"object\";\n        } else if (browserDetector.isIE(9)) {\n            reporter.warn(\"Scroll strategy is not supported on IE9. Changing to object strategy.\");\n            desiredStrategy = \"object\";\n        }\n    }\n\n    if(desiredStrategy === \"scroll\") {\n        detectionStrategy = scrollStrategyMaker(strategyOptions);\n    } else if(desiredStrategy === \"object\") {\n        detectionStrategy = objectStrategyMaker(strategyOptions);\n    } else {\n        throw new Error(\"Invalid strategy name: \" + desiredStrategy);\n    }\n\n    //Calls can be made to listenTo with elements that are still being installed.\n    //Also, same elements can occur in the elements list in the listenTo function.\n    //With this map, the ready callbacks can be synchronized between the calls\n    //so that the ready callback can always be called when an element is ready - even if\n    //it wasn't installed from the function itself.\n    var onReadyCallbacks = {};\n\n    /**\n     * Makes the given elements resize-detectable and starts listening to resize events on the elements. Calls the event callback for each event for each element.\n     * @public\n     * @param {Options?} options Optional options object. These options will override the global options. Some options may not be overriden, such as idHandler.\n     * @param {element[]|element} elements The given array of elements to detect resize events of. Single element is also valid.\n     * @param {function} listener The callback to be executed for each resize event for each element.\n     */\n    function listenTo(options, elements, listener) {\n        function onResizeCallback(element) {\n            var listeners = eventListenerHandler.get(element);\n            forEach(listeners, function callListenerProxy(listener) {\n                listener(element);\n            });\n        }\n\n        function addListener(callOnAdd, element, listener) {\n            eventListenerHandler.add(element, listener);\n\n            if(callOnAdd) {\n                listener(element);\n            }\n        }\n\n        //Options object may be omitted.\n        if(!listener) {\n            listener = elements;\n            elements = options;\n            options = {};\n        }\n\n        if(!elements) {\n            throw new Error(\"At least one element required.\");\n        }\n\n        if(!listener) {\n            throw new Error(\"Listener required.\");\n        }\n\n        if (isElement(elements)) {\n            // A single element has been passed in.\n            elements = [elements];\n        } else if (isCollection(elements)) {\n            // Convert collection to array for plugins.\n            // TODO: May want to check so that all the elements in the collection are valid elements.\n            elements = toArray(elements);\n        } else {\n            return reporter.error(\"Invalid arguments. Must be a DOM element or a collection of DOM elements.\");\n        }\n\n        var elementsReady = 0;\n\n        var callOnAdd = getOption(options, \"callOnAdd\", globalOptions.callOnAdd);\n        var onReadyCallback = getOption(options, \"onReady\", function noop() {});\n        var debug = getOption(options, \"debug\", globalOptions.debug);\n\n        forEach(elements, function attachListenerToElement(element) {\n            if (!stateHandler.getState(element)) {\n                stateHandler.initState(element);\n                idHandler.set(element);\n            }\n\n            var id = idHandler.get(element);\n\n            debug && reporter.log(\"Attaching listener to element\", id, element);\n\n            if(!elementUtils.isDetectable(element)) {\n                debug && reporter.log(id, \"Not detectable.\");\n                if(elementUtils.isBusy(element)) {\n                    debug && reporter.log(id, \"System busy making it detectable\");\n\n                    //The element is being prepared to be detectable. Do not make it detectable.\n                    //Just add the listener, because the element will soon be detectable.\n                    addListener(callOnAdd, element, listener);\n                    onReadyCallbacks[id] = onReadyCallbacks[id] || [];\n                    onReadyCallbacks[id].push(function onReady() {\n                        elementsReady++;\n\n                        if(elementsReady === elements.length) {\n                            onReadyCallback();\n                        }\n                    });\n                    return;\n                }\n\n                debug && reporter.log(id, \"Making detectable...\");\n                //The element is not prepared to be detectable, so do prepare it and add a listener to it.\n                elementUtils.markBusy(element, true);\n                return detectionStrategy.makeDetectable({ debug: debug, important: importantCssRules }, element, function onElementDetectable(element) {\n                    debug && reporter.log(id, \"onElementDetectable\");\n\n                    if (stateHandler.getState(element)) {\n                        elementUtils.markAsDetectable(element);\n                        elementUtils.markBusy(element, false);\n                        detectionStrategy.addListener(element, onResizeCallback);\n                        addListener(callOnAdd, element, listener);\n\n                        // Since the element size might have changed since the call to \"listenTo\", we need to check for this change,\n                        // so that a resize event may be emitted.\n                        // Having the startSize object is optional (since it does not make sense in some cases such as unrendered elements), so check for its existance before.\n                        // Also, check the state existance before since the element may have been uninstalled in the installation process.\n                        var state = stateHandler.getState(element);\n                        if (state && state.startSize) {\n                            var width = element.offsetWidth;\n                            var height = element.offsetHeight;\n                            if (state.startSize.width !== width || state.startSize.height !== height) {\n                                onResizeCallback(element);\n                            }\n                        }\n\n                        if(onReadyCallbacks[id]) {\n                            forEach(onReadyCallbacks[id], function(callback) {\n                                callback();\n                            });\n                        }\n                    } else {\n                        // The element has been unisntalled before being detectable.\n                        debug && reporter.log(id, \"Element uninstalled before being detectable.\");\n                    }\n\n                    delete onReadyCallbacks[id];\n\n                    elementsReady++;\n                    if(elementsReady === elements.length) {\n                        onReadyCallback();\n                    }\n                });\n            }\n\n            debug && reporter.log(id, \"Already detecable, adding listener.\");\n\n            //The element has been prepared to be detectable and is ready to be listened to.\n            addListener(callOnAdd, element, listener);\n            elementsReady++;\n        });\n\n        if(elementsReady === elements.length) {\n            onReadyCallback();\n        }\n    }\n\n    function uninstall(elements) {\n        if(!elements) {\n            return reporter.error(\"At least one element is required.\");\n        }\n\n        if (isElement(elements)) {\n            // A single element has been passed in.\n            elements = [elements];\n        } else if (isCollection(elements)) {\n            // Convert collection to array for plugins.\n            // TODO: May want to check so that all the elements in the collection are valid elements.\n            elements = toArray(elements);\n        } else {\n            return reporter.error(\"Invalid arguments. Must be a DOM element or a collection of DOM elements.\");\n        }\n\n        forEach(elements, function (element) {\n            eventListenerHandler.removeAllListeners(element);\n            detectionStrategy.uninstall(element);\n            stateHandler.cleanState(element);\n        });\n    }\n\n    function initDocument(targetDocument) {\n        detectionStrategy.initDocument && detectionStrategy.initDocument(targetDocument);\n    }\n\n    return {\n        listenTo: listenTo,\n        removeListener: eventListenerHandler.removeListener,\n        removeAllListeners: eventListenerHandler.removeAllListeners,\n        uninstall: uninstall,\n        initDocument: initDocument\n    };\n};\n\nfunction getOption(options, name, defaultValue) {\n    var value = options[name];\n\n    if((value === undefined || value === null) && defaultValue !== undefined) {\n        return defaultValue;\n    }\n\n    return value;\n}\n\n\n/***/ }),\n\n/***/ \"f1ae\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar $defineProperty = __webpack_require__(\"86cc\");\nvar createDesc = __webpack_require__(\"4630\");\n\nmodule.exports = function (object, index, value) {\n  if (index in object) $defineProperty.f(object, index, createDesc(0, value));\n  else object[index] = value;\n};\n\n\n/***/ }),\n\n/***/ \"f6fd\":\n/***/ (function(module, exports) {\n\n// document.currentScript polyfill by Adam Miller\n\n// MIT license\n\n(function(document){\n  var currentScript = \"currentScript\",\n      scripts = document.getElementsByTagName('script'); // Live NodeList collection\n\n  // If browser needs currentScript polyfill, add get currentScript() to the document object\n  if (!(currentScript in document)) {\n    Object.defineProperty(document, currentScript, {\n      get: function(){\n\n        // IE 6-10 supports script readyState\n        // IE 10+ support stack trace\n        try { throw new Error(); }\n        catch (err) {\n\n          // Find the second match for the \"at\" string to get file src url from stack.\n          // Specifically works with the format of stack traces in IE.\n          var i, res = ((/.*at [^\\(]*\\((.*):.+:.+\\)$/ig).exec(err.stack) || [false])[1];\n\n          // For all scripts on the page, if src matches or if ready state is interactive, return the script tag\n          for(i in scripts){\n            if(scripts[i].src == res || scripts[i].readyState == \"interactive\"){\n              return scripts[i];\n            }\n          }\n\n          // If no match, return null\n          return null;\n        }\n      }\n    });\n  }\n})(document);\n\n\n/***/ }),\n\n/***/ \"f751\":\n/***/ (function(module, exports, __webpack_require__) {\n\n// 19.1.3.1 Object.assign(target, source)\nvar $export = __webpack_require__(\"5ca1\");\n\n$export($export.S + $export.F, 'Object', { assign: __webpack_require__(\"7333\") });\n\n\n/***/ }),\n\n/***/ \"fa5b\":\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__(\"5537\")('native-function-to-string', Function.toString);\n\n\n/***/ }),\n\n/***/ \"fab2\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar document = __webpack_require__(\"7726\").document;\nmodule.exports = document && document.documentElement;\n\n\n/***/ }),\n\n/***/ \"fb15\":\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n// ESM COMPAT FLAG\n__webpack_require__.r(__webpack_exports__);\n\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, \"install\", function() { return /* reexport */ components[\"d\" /* install */]; });\n__webpack_require__.d(__webpack_exports__, \"GridLayout\", function() { return /* reexport */ components[\"b\" /* GridLayout */]; });\n__webpack_require__.d(__webpack_exports__, \"GridItem\", function() { return /* reexport */ components[\"a\" /* GridItem */]; });\n\n// CONCATENATED MODULE: ./node_modules/@vue/cli-service/lib/commands/build/setPublicPath.js\n// This file is imported into lib/wc client bundles.\n\nif (typeof window !== 'undefined') {\n  if (true) {\n    __webpack_require__(\"f6fd\")\n  }\n\n  var i\n  if ((i = window.document.currentScript) && (i = i.src.match(/(.+\\/)[^/]+\\.js(\\?.*)?$/))) {\n    __webpack_require__.p = i[1] // eslint-disable-line\n  }\n}\n\n// Indicate to webpack that this file can be concatenated\n/* harmony default export */ var setPublicPath = (null);\n\n// EXTERNAL MODULE: ./src/components/index.js\nvar components = __webpack_require__(\"2af9\");\n\n// CONCATENATED MODULE: ./node_modules/@vue/cli-service/lib/commands/build/entry-lib.js\n\n\n/* harmony default export */ var entry_lib = __webpack_exports__[\"default\"] = (components[\"c\" /* default */]);\n\n\n\n/***/ }),\n\n/***/ \"fca0\":\n/***/ (function(module, exports, __webpack_require__) {\n\n// 20.1.2.2 Number.isFinite(number)\nvar $export = __webpack_require__(\"5ca1\");\nvar _isFinite = __webpack_require__(\"7726\").isFinite;\n\n$export($export.S, 'Number', {\n  isFinite: function isFinite(it) {\n    return typeof it == 'number' && _isFinite(it);\n  }\n});\n\n\n/***/ }),\n\n/***/ \"fdef\":\n/***/ (function(module, exports) {\n\nmodule.exports = '\\x09\\x0A\\x0B\\x0C\\x0D\\x20\\xA0\\u1680\\u180E\\u2000\\u2001\\u2002\\u2003' +\n  '\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\u2028\\u2029\\uFEFF';\n\n\n/***/ })\n\n/******/ })[\"default\"];\n//# sourceMappingURL=vue-grid-layout.common.js.map"
  },
  {
    "path": "dist/vue-grid-layout.umd.js",
    "content": "/*! vue-grid-layout - 2.4.0 | (c) 2015, 2022  Gustavo Santos (JBay Solutions) <gustavo.santos@jbaysolutions.com> (http://www.jbaysolutions.com) | https://github.com/jbaysolutions/vue-grid-layout */\n(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"vue\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"VueGridLayout\"] = factory(require(\"vue\"));\n\telse\n\t\troot[\"VueGridLayout\"] = factory(root[\"Vue\"]);\n})((typeof self !== 'undefined' ? self : this), function(__WEBPACK_EXTERNAL_MODULE__8bbf__) {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// define __esModule on exports\n/******/ \t__webpack_require__.r = function(exports) {\n/******/ \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n/******/ \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n/******/ \t\t}\n/******/ \t\tObject.defineProperty(exports, '__esModule', { value: true });\n/******/ \t};\n/******/\n/******/ \t// create a fake namespace object\n/******/ \t// mode & 1: value is a module id, require it\n/******/ \t// mode & 2: merge all properties of value into the ns\n/******/ \t// mode & 4: return value when already ns object\n/******/ \t// mode & 8|1: behave like require\n/******/ \t__webpack_require__.t = function(value, mode) {\n/******/ \t\tif(mode & 1) value = __webpack_require__(value);\n/******/ \t\tif(mode & 8) return value;\n/******/ \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n/******/ \t\tvar ns = Object.create(null);\n/******/ \t\t__webpack_require__.r(ns);\n/******/ \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n/******/ \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n/******/ \t\treturn ns;\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = \"fb15\");\n/******/ })\n/************************************************************************/\n/******/ ({\n\n/***/ \"01f9\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar LIBRARY = __webpack_require__(\"2d00\");\nvar $export = __webpack_require__(\"5ca1\");\nvar redefine = __webpack_require__(\"2aba\");\nvar hide = __webpack_require__(\"32e9\");\nvar Iterators = __webpack_require__(\"84f2\");\nvar $iterCreate = __webpack_require__(\"41a0\");\nvar setToStringTag = __webpack_require__(\"7f20\");\nvar getPrototypeOf = __webpack_require__(\"38fd\");\nvar ITERATOR = __webpack_require__(\"2b4c\")('iterator');\nvar BUGGY = !([].keys && 'next' in [].keys()); // Safari has buggy iterators w/o `next`\nvar FF_ITERATOR = '@@iterator';\nvar KEYS = 'keys';\nvar VALUES = 'values';\n\nvar returnThis = function () { return this; };\n\nmodule.exports = function (Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCED) {\n  $iterCreate(Constructor, NAME, next);\n  var getMethod = function (kind) {\n    if (!BUGGY && kind in proto) return proto[kind];\n    switch (kind) {\n      case KEYS: return function keys() { return new Constructor(this, kind); };\n      case VALUES: return function values() { return new Constructor(this, kind); };\n    } return function entries() { return new Constructor(this, kind); };\n  };\n  var TAG = NAME + ' Iterator';\n  var DEF_VALUES = DEFAULT == VALUES;\n  var VALUES_BUG = false;\n  var proto = Base.prototype;\n  var $native = proto[ITERATOR] || proto[FF_ITERATOR] || DEFAULT && proto[DEFAULT];\n  var $default = $native || getMethod(DEFAULT);\n  var $entries = DEFAULT ? !DEF_VALUES ? $default : getMethod('entries') : undefined;\n  var $anyNative = NAME == 'Array' ? proto.entries || $native : $native;\n  var methods, key, IteratorPrototype;\n  // Fix native\n  if ($anyNative) {\n    IteratorPrototype = getPrototypeOf($anyNative.call(new Base()));\n    if (IteratorPrototype !== Object.prototype && IteratorPrototype.next) {\n      // Set @@toStringTag to native iterators\n      setToStringTag(IteratorPrototype, TAG, true);\n      // fix for some old engines\n      if (!LIBRARY && typeof IteratorPrototype[ITERATOR] != 'function') hide(IteratorPrototype, ITERATOR, returnThis);\n    }\n  }\n  // fix Array#{values, @@iterator}.name in V8 / FF\n  if (DEF_VALUES && $native && $native.name !== VALUES) {\n    VALUES_BUG = true;\n    $default = function values() { return $native.call(this); };\n  }\n  // Define iterator\n  if ((!LIBRARY || FORCED) && (BUGGY || VALUES_BUG || !proto[ITERATOR])) {\n    hide(proto, ITERATOR, $default);\n  }\n  // Plug for library\n  Iterators[NAME] = $default;\n  Iterators[TAG] = returnThis;\n  if (DEFAULT) {\n    methods = {\n      values: DEF_VALUES ? $default : getMethod(VALUES),\n      keys: IS_SET ? $default : getMethod(KEYS),\n      entries: $entries\n    };\n    if (FORCED) for (key in methods) {\n      if (!(key in proto)) redefine(proto, key, methods[key]);\n    } else $export($export.P + $export.F * (BUGGY || VALUES_BUG), NAME, methods);\n  }\n  return methods;\n};\n\n\n/***/ }),\n\n/***/ \"02f4\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar toInteger = __webpack_require__(\"4588\");\nvar defined = __webpack_require__(\"be13\");\n// true  -> String#at\n// false -> String#codePointAt\nmodule.exports = function (TO_STRING) {\n  return function (that, pos) {\n    var s = String(defined(that));\n    var i = toInteger(pos);\n    var l = s.length;\n    var a, b;\n    if (i < 0 || i >= l) return TO_STRING ? '' : undefined;\n    a = s.charCodeAt(i);\n    return a < 0xd800 || a > 0xdbff || i + 1 === l || (b = s.charCodeAt(i + 1)) < 0xdc00 || b > 0xdfff\n      ? TO_STRING ? s.charAt(i) : a\n      : TO_STRING ? s.slice(i, i + 2) : (a - 0xd800 << 10) + (b - 0xdc00) + 0x10000;\n  };\n};\n\n\n/***/ }),\n\n/***/ \"0390\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar at = __webpack_require__(\"02f4\")(true);\n\n // `AdvanceStringIndex` abstract operation\n// https://tc39.github.io/ecma262/#sec-advancestringindex\nmodule.exports = function (S, index, unicode) {\n  return index + (unicode ? at(S, index).length : 1);\n};\n\n\n/***/ }),\n\n/***/ \"0bfb\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n// 21.2.5.3 get RegExp.prototype.flags\nvar anObject = __webpack_require__(\"cb7c\");\nmodule.exports = function () {\n  var that = anObject(this);\n  var result = '';\n  if (that.global) result += 'g';\n  if (that.ignoreCase) result += 'i';\n  if (that.multiline) result += 'm';\n  if (that.unicode) result += 'u';\n  if (that.sticky) result += 'y';\n  return result;\n};\n\n\n/***/ }),\n\n/***/ \"0d58\":\n/***/ (function(module, exports, __webpack_require__) {\n\n// 19.1.2.14 / 15.2.3.14 Object.keys(O)\nvar $keys = __webpack_require__(\"ce10\");\nvar enumBugKeys = __webpack_require__(\"e11e\");\n\nmodule.exports = Object.keys || function keys(O) {\n  return $keys(O, enumBugKeys);\n};\n\n\n/***/ }),\n\n/***/ \"1156\":\n/***/ (function(module, exports, __webpack_require__) {\n\n// style-loader: Adds some css to the DOM by adding a <style> tag\n\n// load the styles\nvar content = __webpack_require__(\"ad20\");\nif(typeof content === 'string') content = [[module.i, content, '']];\nif(content.locals) module.exports = content.locals;\n// add the styles to the DOM\nvar add = __webpack_require__(\"499e\").default\nvar update = add(\"c1ec597e\", content, true, {\"sourceMap\":false,\"shadowMode\":false});\n\n/***/ }),\n\n/***/ \"11e9\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar pIE = __webpack_require__(\"52a7\");\nvar createDesc = __webpack_require__(\"4630\");\nvar toIObject = __webpack_require__(\"6821\");\nvar toPrimitive = __webpack_require__(\"6a99\");\nvar has = __webpack_require__(\"69a8\");\nvar IE8_DOM_DEFINE = __webpack_require__(\"c69a\");\nvar gOPD = Object.getOwnPropertyDescriptor;\n\nexports.f = __webpack_require__(\"9e1e\") ? gOPD : function getOwnPropertyDescriptor(O, P) {\n  O = toIObject(O);\n  P = toPrimitive(P, true);\n  if (IE8_DOM_DEFINE) try {\n    return gOPD(O, P);\n  } catch (e) { /* empty */ }\n  if (has(O, P)) return createDesc(!pIE.f.call(O, P), O[P]);\n};\n\n\n/***/ }),\n\n/***/ \"1495\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar dP = __webpack_require__(\"86cc\");\nvar anObject = __webpack_require__(\"cb7c\");\nvar getKeys = __webpack_require__(\"0d58\");\n\nmodule.exports = __webpack_require__(\"9e1e\") ? Object.defineProperties : function defineProperties(O, Properties) {\n  anObject(O);\n  var keys = getKeys(Properties);\n  var length = keys.length;\n  var i = 0;\n  var P;\n  while (length > i) dP.f(O, P = keys[i++], Properties[P]);\n  return O;\n};\n\n\n/***/ }),\n\n/***/ \"18d2\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/**\n * Resize detection strategy that injects objects to elements in order to detect resize events.\n * Heavily inspired by: http://www.backalleycoder.com/2013/03/18/cross-browser-event-based-element-resize-detection/\n */\n\n\n\nvar browserDetector = __webpack_require__(\"18e9\");\n\nmodule.exports = function(options) {\n    options             = options || {};\n    var reporter        = options.reporter;\n    var batchProcessor  = options.batchProcessor;\n    var getState        = options.stateHandler.getState;\n\n    if(!reporter) {\n        throw new Error(\"Missing required dependency: reporter.\");\n    }\n\n    /**\n     * Adds a resize event listener to the element.\n     * @public\n     * @param {element} element The element that should have the listener added.\n     * @param {function} listener The listener callback to be called for each resize event of the element. The element will be given as a parameter to the listener callback.\n     */\n    function addListener(element, listener) {\n        function listenerProxy() {\n            listener(element);\n        }\n\n        if(browserDetector.isIE(8)) {\n            //IE 8 does not support object, but supports the resize event directly on elements.\n            getState(element).object = {\n                proxy: listenerProxy\n            };\n            element.attachEvent(\"onresize\", listenerProxy);\n        } else {\n            var object = getObject(element);\n\n            if(!object) {\n                throw new Error(\"Element is not detectable by this strategy.\");\n            }\n\n            object.contentDocument.defaultView.addEventListener(\"resize\", listenerProxy);\n        }\n    }\n\n    function buildCssTextString(rules) {\n        var seperator = options.important ? \" !important; \" : \"; \";\n\n        return (rules.join(seperator) + seperator).trim();\n    }\n\n    /**\n     * Makes an element detectable and ready to be listened for resize events. Will call the callback when the element is ready to be listened for resize changes.\n     * @private\n     * @param {object} options Optional options object.\n     * @param {element} element The element to make detectable\n     * @param {function} callback The callback to be called when the element is ready to be listened for resize changes. Will be called with the element as first parameter.\n     */\n    function makeDetectable(options, element, callback) {\n        if (!callback) {\n            callback = element;\n            element = options;\n            options = null;\n        }\n\n        options = options || {};\n        var debug = options.debug;\n\n        function injectObject(element, callback) {\n            var OBJECT_STYLE = buildCssTextString([\"display: block\", \"position: absolute\", \"top: 0\", \"left: 0\", \"width: 100%\", \"height: 100%\", \"border: none\", \"padding: 0\", \"margin: 0\", \"opacity: 0\", \"z-index: -1000\", \"pointer-events: none\"]);\n\n            //The target element needs to be positioned (everything except static) so the absolute positioned object will be positioned relative to the target element.\n\n            // Position altering may be performed directly or on object load, depending on if style resolution is possible directly or not.\n            var positionCheckPerformed = false;\n\n            // The element may not yet be attached to the DOM, and therefore the style object may be empty in some browsers.\n            // Since the style object is a reference, it will be updated as soon as the element is attached to the DOM.\n            var style = window.getComputedStyle(element);\n            var width = element.offsetWidth;\n            var height = element.offsetHeight;\n\n            getState(element).startSize = {\n                width: width,\n                height: height\n            };\n\n            function mutateDom() {\n                function alterPositionStyles() {\n                    if(style.position === \"static\") {\n                        element.style.setProperty(\"position\", \"relative\", options.important ? \"important\" : \"\");\n\n                        var removeRelativeStyles = function(reporter, element, style, property) {\n                            function getNumericalValue(value) {\n                                return value.replace(/[^-\\d\\.]/g, \"\");\n                            }\n\n                            var value = style[property];\n\n                            if(value !== \"auto\" && getNumericalValue(value) !== \"0\") {\n                                reporter.warn(\"An element that is positioned static has style.\" + property + \"=\" + value + \" which is ignored due to the static positioning. The element will need to be positioned relative, so the style.\" + property + \" will be set to 0. Element: \", element);\n                                element.style.setProperty(property, \"0\", options.important ? \"important\" : \"\");\n                            }\n                        };\n\n                        //Check so that there are no accidental styles that will make the element styled differently now that is is relative.\n                        //If there are any, set them to 0 (this should be okay with the user since the style properties did nothing before [since the element was positioned static] anyway).\n                        removeRelativeStyles(reporter, element, style, \"top\");\n                        removeRelativeStyles(reporter, element, style, \"right\");\n                        removeRelativeStyles(reporter, element, style, \"bottom\");\n                        removeRelativeStyles(reporter, element, style, \"left\");\n                    }\n                }\n\n                function onObjectLoad() {\n                    // The object has been loaded, which means that the element now is guaranteed to be attached to the DOM.\n                    if (!positionCheckPerformed) {\n                        alterPositionStyles();\n                    }\n\n                    /*jshint validthis: true */\n\n                    function getDocument(element, callback) {\n                        //Opera 12 seem to call the object.onload before the actual document has been created.\n                        //So if it is not present, poll it with an timeout until it is present.\n                        //TODO: Could maybe be handled better with object.onreadystatechange or similar.\n                        if(!element.contentDocument) {\n                            var state = getState(element);\n                            if (state.checkForObjectDocumentTimeoutId) {\n                                window.clearTimeout(state.checkForObjectDocumentTimeoutId);\n                            }\n                            state.checkForObjectDocumentTimeoutId = setTimeout(function checkForObjectDocument() {\n                                state.checkForObjectDocumentTimeoutId = 0;\n                                getDocument(element, callback);\n                            }, 100);\n\n                            return;\n                        }\n\n                        callback(element.contentDocument);\n                    }\n\n                    //Mutating the object element here seems to fire another load event.\n                    //Mutating the inner document of the object element is fine though.\n                    var objectElement = this;\n\n                    //Create the style element to be added to the object.\n                    getDocument(objectElement, function onObjectDocumentReady(objectDocument) {\n                        //Notify that the element is ready to be listened to.\n                        callback(element);\n                    });\n                }\n\n                // The element may be detached from the DOM, and some browsers does not support style resolving of detached elements.\n                // The alterPositionStyles needs to be delayed until we know the element has been attached to the DOM (which we are sure of when the onObjectLoad has been fired), if style resolution is not possible.\n                if (style.position !== \"\") {\n                    alterPositionStyles(style);\n                    positionCheckPerformed = true;\n                }\n\n                //Add an object element as a child to the target element that will be listened to for resize events.\n                var object = document.createElement(\"object\");\n                object.style.cssText = OBJECT_STYLE;\n                object.tabIndex = -1;\n                object.type = \"text/html\";\n                object.setAttribute(\"aria-hidden\", \"true\");\n                object.onload = onObjectLoad;\n\n                //Safari: This must occur before adding the object to the DOM.\n                //IE: Does not like that this happens before, even if it is also added after.\n                if(!browserDetector.isIE()) {\n                    object.data = \"about:blank\";\n                }\n\n                if (!getState(element)) {\n                    // The element has been uninstalled before the actual loading happened.\n                    return;\n                }\n\n                element.appendChild(object);\n                getState(element).object = object;\n\n                //IE: This must occur after adding the object to the DOM.\n                if(browserDetector.isIE()) {\n                    object.data = \"about:blank\";\n                }\n            }\n\n            if(batchProcessor) {\n                batchProcessor.add(mutateDom);\n            } else {\n                mutateDom();\n            }\n        }\n\n        if(browserDetector.isIE(8)) {\n            //IE 8 does not support objects properly. Luckily they do support the resize event.\n            //So do not inject the object and notify that the element is already ready to be listened to.\n            //The event handler for the resize event is attached in the utils.addListener instead.\n            callback(element);\n        } else {\n            injectObject(element, callback);\n        }\n    }\n\n    /**\n     * Returns the child object of the target element.\n     * @private\n     * @param {element} element The target element.\n     * @returns The object element of the target.\n     */\n    function getObject(element) {\n        return getState(element).object;\n    }\n\n    function uninstall(element) {\n        if (!getState(element)) {\n            return;\n        }\n\n        var object = getObject(element);\n\n        if (!object) {\n            return;\n        }\n\n        if (browserDetector.isIE(8)) {\n            element.detachEvent(\"onresize\", object.proxy);\n        } else {\n            element.removeChild(object);\n        }\n\n        if (getState(element).checkForObjectDocumentTimeoutId) {\n            window.clearTimeout(getState(element).checkForObjectDocumentTimeoutId);\n        }\n\n        delete getState(element).object;\n    }\n\n    return {\n        makeDetectable: makeDetectable,\n        addListener: addListener,\n        uninstall: uninstall\n    };\n};\n\n\n/***/ }),\n\n/***/ \"18e9\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar detector = module.exports = {};\n\ndetector.isIE = function(version) {\n    function isAnyIeVersion() {\n        var agent = navigator.userAgent.toLowerCase();\n        return agent.indexOf(\"msie\") !== -1 || agent.indexOf(\"trident\") !== -1 || agent.indexOf(\" edge/\") !== -1;\n    }\n\n    if(!isAnyIeVersion()) {\n        return false;\n    }\n\n    if(!version) {\n        return true;\n    }\n\n    //Shamelessly stolen from https://gist.github.com/padolsey/527683\n    var ieVersion = (function(){\n        var undef,\n            v = 3,\n            div = document.createElement(\"div\"),\n            all = div.getElementsByTagName(\"i\");\n\n        do {\n            div.innerHTML = \"<!--[if gt IE \" + (++v) + \"]><i></i><![endif]-->\";\n        }\n        while (all[0]);\n\n        return v > 4 ? v : undef;\n    }());\n\n    return version === ieVersion;\n};\n\ndetector.isLegacyOpera = function() {\n    return !!window.opera;\n};\n\n\n/***/ }),\n\n/***/ \"1ca7\":\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return getDocumentDir; });\n/* unused harmony export setDocumentDir */\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return addWindowEventListener; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"c\", function() { return removeWindowEventListener; });\nvar currentDir\n/*: \"ltr\" | \"rtl\" | \"auto\"*/\n= \"auto\"; // let currentDir = \"auto\";\n\nfunction hasDocument() {\n  return typeof document !== \"undefined\";\n}\n\nfunction hasWindow() {\n  return typeof window !== \"undefined\";\n}\n\nfunction getDocumentDir() {\n  if (!hasDocument()) {\n    return currentDir;\n  }\n\n  var direction = typeof document.dir !== \"undefined\" ? document.dir : document.getElementsByTagName(\"html\")[0].getAttribute(\"dir\");\n  return direction;\n}\nfunction setDocumentDir(dir\n/*: \"ltr\" | \"rtl\" | \"auto\"*/\n) {\n  // export function setDocumentDir(dir){\n  if (!hasDocument) {\n    currentDir = dir;\n    return;\n  }\n\n  var html = document.getElementsByTagName(\"html\")[0];\n  html.setAttribute(\"dir\", dir);\n}\nfunction addWindowEventListener(event\n/*:string*/\n, callback\n/*: () => mixed*/\n) {\n  if (!hasWindow) {\n    callback();\n    return;\n  }\n\n  window.addEventListener(event, callback);\n}\nfunction removeWindowEventListener(event\n/*:string*/\n, callback\n/*: () => mixed*/\n) {\n  if (!hasWindow) {\n    return;\n  }\n\n  window.removeEventListener(event, callback);\n}\n\n/***/ }),\n\n/***/ \"214f\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n__webpack_require__(\"b0c5\");\nvar redefine = __webpack_require__(\"2aba\");\nvar hide = __webpack_require__(\"32e9\");\nvar fails = __webpack_require__(\"79e5\");\nvar defined = __webpack_require__(\"be13\");\nvar wks = __webpack_require__(\"2b4c\");\nvar regexpExec = __webpack_require__(\"520a\");\n\nvar SPECIES = wks('species');\n\nvar REPLACE_SUPPORTS_NAMED_GROUPS = !fails(function () {\n  // #replace needs built-in support for named groups.\n  // #match works fine because it just return the exec results, even if it has\n  // a \"grops\" property.\n  var re = /./;\n  re.exec = function () {\n    var result = [];\n    result.groups = { a: '7' };\n    return result;\n  };\n  return ''.replace(re, '$<a>') !== '7';\n});\n\nvar SPLIT_WORKS_WITH_OVERWRITTEN_EXEC = (function () {\n  // Chrome 51 has a buggy \"split\" implementation when RegExp#exec !== nativeExec\n  var re = /(?:)/;\n  var originalExec = re.exec;\n  re.exec = function () { return originalExec.apply(this, arguments); };\n  var result = 'ab'.split(re);\n  return result.length === 2 && result[0] === 'a' && result[1] === 'b';\n})();\n\nmodule.exports = function (KEY, length, exec) {\n  var SYMBOL = wks(KEY);\n\n  var DELEGATES_TO_SYMBOL = !fails(function () {\n    // String methods call symbol-named RegEp methods\n    var O = {};\n    O[SYMBOL] = function () { return 7; };\n    return ''[KEY](O) != 7;\n  });\n\n  var DELEGATES_TO_EXEC = DELEGATES_TO_SYMBOL ? !fails(function () {\n    // Symbol-named RegExp methods call .exec\n    var execCalled = false;\n    var re = /a/;\n    re.exec = function () { execCalled = true; return null; };\n    if (KEY === 'split') {\n      // RegExp[@@split] doesn't call the regex's exec method, but first creates\n      // a new one. We need to return the patched regex when creating the new one.\n      re.constructor = {};\n      re.constructor[SPECIES] = function () { return re; };\n    }\n    re[SYMBOL]('');\n    return !execCalled;\n  }) : undefined;\n\n  if (\n    !DELEGATES_TO_SYMBOL ||\n    !DELEGATES_TO_EXEC ||\n    (KEY === 'replace' && !REPLACE_SUPPORTS_NAMED_GROUPS) ||\n    (KEY === 'split' && !SPLIT_WORKS_WITH_OVERWRITTEN_EXEC)\n  ) {\n    var nativeRegExpMethod = /./[SYMBOL];\n    var fns = exec(\n      defined,\n      SYMBOL,\n      ''[KEY],\n      function maybeCallNative(nativeMethod, regexp, str, arg2, forceStringMethod) {\n        if (regexp.exec === regexpExec) {\n          if (DELEGATES_TO_SYMBOL && !forceStringMethod) {\n            // The native String method already delegates to @@method (this\n            // polyfilled function), leasing to infinite recursion.\n            // We avoid it by directly calling the native @@method method.\n            return { done: true, value: nativeRegExpMethod.call(regexp, str, arg2) };\n          }\n          return { done: true, value: nativeMethod.call(str, regexp, arg2) };\n        }\n        return { done: false };\n      }\n    );\n    var strfn = fns[0];\n    var rxfn = fns[1];\n\n    redefine(String.prototype, KEY, strfn);\n    hide(RegExp.prototype, SYMBOL, length == 2\n      // 21.2.5.8 RegExp.prototype[@@replace](string, replaceValue)\n      // 21.2.5.11 RegExp.prototype[@@split](string, limit)\n      ? function (string, arg) { return rxfn.call(string, this, arg); }\n      // 21.2.5.6 RegExp.prototype[@@match](string)\n      // 21.2.5.9 RegExp.prototype[@@search](string)\n      : function (string) { return rxfn.call(string, this); }\n    );\n  }\n};\n\n\n/***/ }),\n\n/***/ \"230e\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar isObject = __webpack_require__(\"d3f4\");\nvar document = __webpack_require__(\"7726\").document;\n// typeof document.createElement is 'object' in old IE\nvar is = isObject(document) && isObject(document.createElement);\nmodule.exports = function (it) {\n  return is ? document.createElement(it) : {};\n};\n\n\n/***/ }),\n\n/***/ \"2350\":\n/***/ (function(module, exports) {\n\n/*\n\tMIT License http://www.opensource.org/licenses/mit-license.php\n\tAuthor Tobias Koppers @sokra\n*/\n// css base code, injected by the css-loader\nmodule.exports = function(useSourceMap) {\n\tvar list = [];\n\n\t// return the list of modules as css string\n\tlist.toString = function toString() {\n\t\treturn this.map(function (item) {\n\t\t\tvar content = cssWithMappingToString(item, useSourceMap);\n\t\t\tif(item[2]) {\n\t\t\t\treturn \"@media \" + item[2] + \"{\" + content + \"}\";\n\t\t\t} else {\n\t\t\t\treturn content;\n\t\t\t}\n\t\t}).join(\"\");\n\t};\n\n\t// import a list of modules into the list\n\tlist.i = function(modules, mediaQuery) {\n\t\tif(typeof modules === \"string\")\n\t\t\tmodules = [[null, modules, \"\"]];\n\t\tvar alreadyImportedModules = {};\n\t\tfor(var i = 0; i < this.length; i++) {\n\t\t\tvar id = this[i][0];\n\t\t\tif(typeof id === \"number\")\n\t\t\t\talreadyImportedModules[id] = true;\n\t\t}\n\t\tfor(i = 0; i < modules.length; i++) {\n\t\t\tvar item = modules[i];\n\t\t\t// skip already imported module\n\t\t\t// this implementation is not 100% perfect for weird media query combinations\n\t\t\t//  when a module is imported multiple times with different media queries.\n\t\t\t//  I hope this will never occur (Hey this way we have smaller bundles)\n\t\t\tif(typeof item[0] !== \"number\" || !alreadyImportedModules[item[0]]) {\n\t\t\t\tif(mediaQuery && !item[2]) {\n\t\t\t\t\titem[2] = mediaQuery;\n\t\t\t\t} else if(mediaQuery) {\n\t\t\t\t\titem[2] = \"(\" + item[2] + \") and (\" + mediaQuery + \")\";\n\t\t\t\t}\n\t\t\t\tlist.push(item);\n\t\t\t}\n\t\t}\n\t};\n\treturn list;\n};\n\nfunction cssWithMappingToString(item, useSourceMap) {\n\tvar content = item[1] || '';\n\tvar cssMapping = item[3];\n\tif (!cssMapping) {\n\t\treturn content;\n\t}\n\n\tif (useSourceMap && typeof btoa === 'function') {\n\t\tvar sourceMapping = toComment(cssMapping);\n\t\tvar sourceURLs = cssMapping.sources.map(function (source) {\n\t\t\treturn '/*# sourceURL=' + cssMapping.sourceRoot + source + ' */'\n\t\t});\n\n\t\treturn [content].concat(sourceURLs).concat([sourceMapping]).join('\\n');\n\t}\n\n\treturn [content].join('\\n');\n}\n\n// Adapted from convert-source-map (MIT)\nfunction toComment(sourceMap) {\n\t// eslint-disable-next-line no-undef\n\tvar base64 = btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap))));\n\tvar data = 'sourceMappingURL=data:application/json;charset=utf-8;base64,' + base64;\n\n\treturn '/*# ' + data + ' */';\n}\n\n\n/***/ }),\n\n/***/ \"23c6\":\n/***/ (function(module, exports, __webpack_require__) {\n\n// getting tag from 19.1.3.6 Object.prototype.toString()\nvar cof = __webpack_require__(\"2d95\");\nvar TAG = __webpack_require__(\"2b4c\")('toStringTag');\n// ES3 wrong here\nvar ARG = cof(function () { return arguments; }()) == 'Arguments';\n\n// fallback for IE11 Script Access Denied error\nvar tryGet = function (it, key) {\n  try {\n    return it[key];\n  } catch (e) { /* empty */ }\n};\n\nmodule.exports = function (it) {\n  var O, T, B;\n  return it === undefined ? 'Undefined' : it === null ? 'Null'\n    // @@toStringTag case\n    : typeof (T = tryGet(O = Object(it), TAG)) == 'string' ? T\n    // builtinTag case\n    : ARG ? cof(O)\n    // ES3 arguments fallback\n    : (B = cof(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : B;\n};\n\n\n/***/ }),\n\n/***/ \"2621\":\n/***/ (function(module, exports) {\n\nexports.f = Object.getOwnPropertySymbols;\n\n\n/***/ }),\n\n/***/ \"2877\":\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return normalizeComponent; });\n/* globals __VUE_SSR_CONTEXT__ */\n\n// IMPORTANT: Do NOT use ES2015 features in this file (except for modules).\n// This module is a runtime utility for cleaner component module output and will\n// be included in the final webpack user bundle.\n\nfunction normalizeComponent (\n  scriptExports,\n  render,\n  staticRenderFns,\n  functionalTemplate,\n  injectStyles,\n  scopeId,\n  moduleIdentifier, /* server only */\n  shadowMode /* vue-cli only */\n) {\n  // Vue.extend constructor export interop\n  var options = typeof scriptExports === 'function'\n    ? scriptExports.options\n    : scriptExports\n\n  // render functions\n  if (render) {\n    options.render = render\n    options.staticRenderFns = staticRenderFns\n    options._compiled = true\n  }\n\n  // functional template\n  if (functionalTemplate) {\n    options.functional = true\n  }\n\n  // scopedId\n  if (scopeId) {\n    options._scopeId = 'data-v-' + scopeId\n  }\n\n  var hook\n  if (moduleIdentifier) { // server build\n    hook = function (context) {\n      // 2.3 injection\n      context =\n        context || // cached call\n        (this.$vnode && this.$vnode.ssrContext) || // stateful\n        (this.parent && this.parent.$vnode && this.parent.$vnode.ssrContext) // functional\n      // 2.2 with runInNewContext: true\n      if (!context && typeof __VUE_SSR_CONTEXT__ !== 'undefined') {\n        context = __VUE_SSR_CONTEXT__\n      }\n      // inject component styles\n      if (injectStyles) {\n        injectStyles.call(this, context)\n      }\n      // register component module identifier for async chunk inferrence\n      if (context && context._registeredComponents) {\n        context._registeredComponents.add(moduleIdentifier)\n      }\n    }\n    // used by ssr in case component is cached and beforeCreate\n    // never gets called\n    options._ssrRegister = hook\n  } else if (injectStyles) {\n    hook = shadowMode\n      ? function () {\n        injectStyles.call(\n          this,\n          (options.functional ? this.parent : this).$root.$options.shadowRoot\n        )\n      }\n      : injectStyles\n  }\n\n  if (hook) {\n    if (options.functional) {\n      // for template-only hot-reload because in that case the render fn doesn't\n      // go through the normalizer\n      options._injectStyles = hook\n      // register for functional component in vue file\n      var originalRender = options.render\n      options.render = function renderWithStyleInjection (h, context) {\n        hook.call(context)\n        return originalRender(h, context)\n      }\n    } else {\n      // inject component registration as beforeCreate hook\n      var existing = options.beforeCreate\n      options.beforeCreate = existing\n        ? [].concat(existing, hook)\n        : [hook]\n    }\n  }\n\n  return {\n    exports: scriptExports,\n    options: options\n  }\n}\n\n\n/***/ }),\n\n/***/ \"2aba\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar global = __webpack_require__(\"7726\");\nvar hide = __webpack_require__(\"32e9\");\nvar has = __webpack_require__(\"69a8\");\nvar SRC = __webpack_require__(\"ca5a\")('src');\nvar $toString = __webpack_require__(\"fa5b\");\nvar TO_STRING = 'toString';\nvar TPL = ('' + $toString).split(TO_STRING);\n\n__webpack_require__(\"8378\").inspectSource = function (it) {\n  return $toString.call(it);\n};\n\n(module.exports = function (O, key, val, safe) {\n  var isFunction = typeof val == 'function';\n  if (isFunction) has(val, 'name') || hide(val, 'name', key);\n  if (O[key] === val) return;\n  if (isFunction) has(val, SRC) || hide(val, SRC, O[key] ? '' + O[key] : TPL.join(String(key)));\n  if (O === global) {\n    O[key] = val;\n  } else if (!safe) {\n    delete O[key];\n    hide(O, key, val);\n  } else if (O[key]) {\n    O[key] = val;\n  } else {\n    hide(O, key, val);\n  }\n// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative\n})(Function.prototype, TO_STRING, function toString() {\n  return typeof this == 'function' && this[SRC] || $toString.call(this);\n});\n\n\n/***/ }),\n\n/***/ \"2aeb\":\n/***/ (function(module, exports, __webpack_require__) {\n\n// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])\nvar anObject = __webpack_require__(\"cb7c\");\nvar dPs = __webpack_require__(\"1495\");\nvar enumBugKeys = __webpack_require__(\"e11e\");\nvar IE_PROTO = __webpack_require__(\"613b\")('IE_PROTO');\nvar Empty = function () { /* empty */ };\nvar PROTOTYPE = 'prototype';\n\n// Create object with fake `null` prototype: use iframe Object with cleared prototype\nvar createDict = function () {\n  // Thrash, waste and sodomy: IE GC bug\n  var iframe = __webpack_require__(\"230e\")('iframe');\n  var i = enumBugKeys.length;\n  var lt = '<';\n  var gt = '>';\n  var iframeDocument;\n  iframe.style.display = 'none';\n  __webpack_require__(\"fab2\").appendChild(iframe);\n  iframe.src = 'javascript:'; // eslint-disable-line no-script-url\n  // createDict = iframe.contentWindow.Object;\n  // html.removeChild(iframe);\n  iframeDocument = iframe.contentWindow.document;\n  iframeDocument.open();\n  iframeDocument.write(lt + 'script' + gt + 'document.F=Object' + lt + '/script' + gt);\n  iframeDocument.close();\n  createDict = iframeDocument.F;\n  while (i--) delete createDict[PROTOTYPE][enumBugKeys[i]];\n  return createDict();\n};\n\nmodule.exports = Object.create || function create(O, Properties) {\n  var result;\n  if (O !== null) {\n    Empty[PROTOTYPE] = anObject(O);\n    result = new Empty();\n    Empty[PROTOTYPE] = null;\n    // add \"__proto__\" for Object.getPrototypeOf polyfill\n    result[IE_PROTO] = O;\n  } else result = createDict();\n  return Properties === undefined ? result : dPs(result, Properties);\n};\n\n\n/***/ }),\n\n/***/ \"2af9\":\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* WEBPACK VAR INJECTION */(function(global) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"d\", function() { return install; });\n/* harmony import */ var core_js_modules_es6_function_name__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(\"7f7f\");\n/* harmony import */ var core_js_modules_es6_function_name__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es6_function_name__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var core_js_modules_es6_array_iterator__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(\"cadf\");\n/* harmony import */ var core_js_modules_es6_array_iterator__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es6_array_iterator__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var core_js_modules_es6_object_keys__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(\"456d\");\n/* harmony import */ var core_js_modules_es6_object_keys__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es6_object_keys__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var core_js_modules_web_dom_iterable__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(\"ac6a\");\n/* harmony import */ var core_js_modules_web_dom_iterable__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_web_dom_iterable__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _GridItem_vue__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(\"bc21\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return _GridItem_vue__WEBPACK_IMPORTED_MODULE_4__[\"a\"]; });\n\n/* harmony import */ var _GridLayout_vue__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(\"37c8\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return _GridLayout_vue__WEBPACK_IMPORTED_MODULE_5__[\"a\"]; });\n\n\n\n\n\n\n // import ResponsiveGridLayout from './ResponsiveGridLayout.vue';\n\nvar VueGridLayout = {\n  // ResponsiveGridLayout,\n  GridLayout: _GridLayout_vue__WEBPACK_IMPORTED_MODULE_5__[/* default */ \"a\"],\n  GridItem: _GridItem_vue__WEBPACK_IMPORTED_MODULE_4__[/* default */ \"a\"]\n};\nfunction install(Vue) {\n  if (install.installed) return;\n  install.installed = true;\n  Object.keys(VueGridLayout).forEach(function (name) {\n    Vue.component(name, VueGridLayout[name]);\n  });\n}\nvar plugin = {\n  install: install\n};\nvar GlobalVue = null;\n\nif (typeof window !== 'undefined') {\n  GlobalVue = window.Vue;\n} else if (typeof global !== 'undefined') {\n  GlobalVue = global.Vue;\n}\n\nif (GlobalVue) {\n  GlobalVue.use(plugin);\n}\n\n/* harmony default export */ __webpack_exports__[\"c\"] = (VueGridLayout);\n\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(\"c8ba\")))\n\n/***/ }),\n\n/***/ \"2b4c\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar store = __webpack_require__(\"5537\")('wks');\nvar uid = __webpack_require__(\"ca5a\");\nvar Symbol = __webpack_require__(\"7726\").Symbol;\nvar USE_SYMBOL = typeof Symbol == 'function';\n\nvar $exports = module.exports = function (name) {\n  return store[name] || (store[name] =\n    USE_SYMBOL && Symbol[name] || (USE_SYMBOL ? Symbol : uid)('Symbol.' + name));\n};\n\n$exports.store = store;\n\n\n/***/ }),\n\n/***/ \"2cef\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nmodule.exports = function() {\n    var idCount = 1;\n\n    /**\n     * Generates a new unique id in the context.\n     * @public\n     * @returns {number} A unique id in the context.\n     */\n    function generate() {\n        return idCount++;\n    }\n\n    return {\n        generate: generate\n    };\n};\n\n\n/***/ }),\n\n/***/ \"2d00\":\n/***/ (function(module, exports) {\n\nmodule.exports = false;\n\n\n/***/ }),\n\n/***/ \"2d95\":\n/***/ (function(module, exports) {\n\nvar toString = {}.toString;\n\nmodule.exports = function (it) {\n  return toString.call(it).slice(8, -1);\n};\n\n\n/***/ }),\n\n/***/ \"2f21\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar fails = __webpack_require__(\"79e5\");\n\nmodule.exports = function (method, arg) {\n  return !!method && fails(function () {\n    // eslint-disable-next-line no-useless-call\n    arg ? method.call(null, function () { /* empty */ }, 1) : method.call(null);\n  });\n};\n\n\n/***/ }),\n\n/***/ \"32e9\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar dP = __webpack_require__(\"86cc\");\nvar createDesc = __webpack_require__(\"4630\");\nmodule.exports = __webpack_require__(\"9e1e\") ? function (object, key, value) {\n  return dP.f(object, key, createDesc(1, value));\n} : function (object, key, value) {\n  object[key] = value;\n  return object;\n};\n\n\n/***/ }),\n\n/***/ \"37c8\":\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n\n// CONCATENATED MODULE: ./node_modules/cache-loader/dist/cjs.js?{\"cacheDirectory\":\"node_modules/.cache/vue-loader\",\"cacheIdentifier\":\"1705dc22-vue-loader-template\"}!./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options!./src/components/GridLayout.vue?vue&type=template&id=361da5e4&\nvar render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{ref:\"item\",staticClass:\"vue-grid-layout\",style:(_vm.mergedStyle)},[_vm._t(\"default\"),_c('grid-item',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.isDragging),expression:\"isDragging\"}],staticClass:\"vue-grid-placeholder\",attrs:{\"x\":_vm.placeholder.x,\"y\":_vm.placeholder.y,\"w\":_vm.placeholder.w,\"h\":_vm.placeholder.h,\"i\":_vm.placeholder.i}})],2)}\nvar staticRenderFns = []\n\n\n// CONCATENATED MODULE: ./src/components/GridLayout.vue?vue&type=template&id=361da5e4&\n\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es7.object.get-own-property-descriptors.js\nvar es7_object_get_own_property_descriptors = __webpack_require__(\"8e6e\");\n\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es6.array.iterator.js\nvar es6_array_iterator = __webpack_require__(\"cadf\");\n\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es6.object.keys.js\nvar es6_object_keys = __webpack_require__(\"456d\");\n\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es6.object.assign.js\nvar es6_object_assign = __webpack_require__(\"f751\");\n\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es6.number.is-finite.js\nvar es6_number_is_finite = __webpack_require__(\"fca0\");\n\n// EXTERNAL MODULE: ./node_modules/core-js/modules/web.dom.iterable.js\nvar web_dom_iterable = __webpack_require__(\"ac6a\");\n\n// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/esm/defineProperty.js\nvar defineProperty = __webpack_require__(\"ade3\");\n\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es6.number.constructor.js\nvar es6_number_constructor = __webpack_require__(\"c5f6\");\n\n// EXTERNAL MODULE: external {\"commonjs\":\"vue\",\"commonjs2\":\"vue\",\"root\":\"Vue\"}\nvar external_commonjs_vue_commonjs2_vue_root_Vue_ = __webpack_require__(\"8bbf\");\nvar external_commonjs_vue_commonjs2_vue_root_Vue_default = /*#__PURE__*/__webpack_require__.n(external_commonjs_vue_commonjs2_vue_root_Vue_);\n\n// EXTERNAL MODULE: ./src/helpers/utils.js\nvar utils = __webpack_require__(\"a2b6\");\n\n// EXTERNAL MODULE: ./src/helpers/responsiveUtils.js\nvar responsiveUtils = __webpack_require__(\"97a7\");\n\n// EXTERNAL MODULE: ./src/components/GridItem.vue + 71 modules\nvar GridItem = __webpack_require__(\"bc21\");\n\n// EXTERNAL MODULE: ./src/helpers/DOM.js\nvar DOM = __webpack_require__(\"1ca7\");\n\n// CONCATENATED MODULE: ./node_modules/cache-loader/dist/cjs.js??ref--12-0!./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options!./src/components/GridLayout.vue?vue&type=script&lang=js&\n\n\n\n\n\n\n\n\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { Object(defineProperty[\"a\" /* default */])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }\n\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\nvar elementResizeDetectorMaker = __webpack_require__(\"eec4\");\n\n\n //var eventBus = require('./eventBus');\n\n\n\n/* harmony default export */ var GridLayoutvue_type_script_lang_js_ = ({\n  name: \"GridLayout\",\n  provide: function provide() {\n    return {\n      eventBus: null,\n      layout: this\n    };\n  },\n  components: {\n    GridItem: GridItem[\"a\" /* default */]\n  },\n  props: {\n    // If true, the container height swells and contracts to fit contents\n    autoSize: {\n      type: Boolean,\n      default: true\n    },\n    colNum: {\n      type: Number,\n      default: 12\n    },\n    rowHeight: {\n      type: Number,\n      default: 150\n    },\n    maxRows: {\n      type: Number,\n      default: Infinity\n    },\n    margin: {\n      type: Array,\n      default: function _default() {\n        return [10, 10];\n      }\n    },\n    isDraggable: {\n      type: Boolean,\n      default: true\n    },\n    isResizable: {\n      type: Boolean,\n      default: true\n    },\n    isMirrored: {\n      type: Boolean,\n      default: false\n    },\n    isBounded: {\n      type: Boolean,\n      default: false\n    },\n    useCssTransforms: {\n      type: Boolean,\n      default: true\n    },\n    verticalCompact: {\n      type: Boolean,\n      default: true\n    },\n    restoreOnDrag: {\n      type: Boolean,\n      default: false\n    },\n    layout: {\n      type: Array,\n      required: true\n    },\n    responsive: {\n      type: Boolean,\n      default: false\n    },\n    responsiveLayouts: {\n      type: Object,\n      default: function _default() {\n        return {};\n      }\n    },\n    transformScale: {\n      type: Number,\n      default: 1\n    },\n    breakpoints: {\n      type: Object,\n      default: function _default() {\n        return {\n          lg: 1200,\n          md: 996,\n          sm: 768,\n          xs: 480,\n          xxs: 0\n        };\n      }\n    },\n    cols: {\n      type: Object,\n      default: function _default() {\n        return {\n          lg: 12,\n          md: 10,\n          sm: 6,\n          xs: 4,\n          xxs: 2\n        };\n      }\n    },\n    preventCollision: {\n      type: Boolean,\n      default: false\n    },\n    useStyleCursor: {\n      type: Boolean,\n      default: true\n    }\n  },\n  data: function data() {\n    return {\n      width: null,\n      mergedStyle: {},\n      lastLayoutLength: 0,\n      isDragging: false,\n      placeholder: {\n        x: 0,\n        y: 0,\n        w: 0,\n        h: 0,\n        i: -1\n      },\n      layouts: {},\n      // array to store all layouts from different breakpoints\n      lastBreakpoint: null,\n      // store last active breakpoint\n      originalLayout: null // store original Layout\n\n    };\n  },\n  created: function created() {\n    var self = this; // Accessible refernces of functions for removing in beforeDestroy\n\n    self.resizeEventHandler = function (eventType, i, x, y, h, w) {\n      self.resizeEvent(eventType, i, x, y, h, w);\n    };\n\n    self.dragEventHandler = function (eventType, i, x, y, h, w) {\n      self.dragEvent(eventType, i, x, y, h, w);\n    };\n\n    self._provided.eventBus = new external_commonjs_vue_commonjs2_vue_root_Vue_default.a();\n    self.eventBus = self._provided.eventBus;\n    self.eventBus.$on('resizeEvent', self.resizeEventHandler);\n    self.eventBus.$on('dragEvent', self.dragEventHandler);\n    self.$emit('layout-created', self.layout);\n  },\n  beforeDestroy: function beforeDestroy() {\n    //Remove listeners\n    this.eventBus.$off('resizeEvent', this.resizeEventHandler);\n    this.eventBus.$off('dragEvent', this.dragEventHandler);\n    this.eventBus.$destroy();\n    Object(DOM[\"c\" /* removeWindowEventListener */])(\"resize\", this.onWindowResize);\n\n    if (this.erd) {\n      this.erd.uninstall(this.$refs.item);\n    }\n  },\n  beforeMount: function beforeMount() {\n    this.$emit('layout-before-mount', this.layout);\n  },\n  mounted: function mounted() {\n    this.$emit('layout-mounted', this.layout);\n    this.$nextTick(function () {\n      Object(utils[\"l\" /* validateLayout */])(this.layout);\n      this.originalLayout = this.layout;\n      var self = this;\n      this.$nextTick(function () {\n        self.initResponsiveFeatures();\n        self.onWindowResize(); //self.width = self.$el.offsetWidth;\n\n        Object(DOM[\"a\" /* addWindowEventListener */])('resize', self.onWindowResize);\n        Object(utils[\"c\" /* compact */])(self.layout, self.verticalCompact);\n        self.$emit('layout-updated', self.layout);\n        self.updateHeight();\n        self.$nextTick(function () {\n          this.erd = elementResizeDetectorMaker({\n            strategy: \"scroll\",\n            //<- For ultra performance.\n            // See https://github.com/wnr/element-resize-detector/issues/110 about callOnAdd.\n            callOnAdd: false\n          });\n          this.erd.listenTo(self.$refs.item, function () {\n            self.onWindowResize();\n          });\n        });\n      });\n    });\n  },\n  watch: {\n    width: function width(newval, oldval) {\n      var self = this;\n      this.$nextTick(function () {\n        var _this = this;\n\n        //this.$broadcast(\"updateWidth\", this.width);\n        this.eventBus.$emit(\"updateWidth\", this.width);\n\n        if (oldval === null) {\n          /*\n              If oldval == null is when the width has never been\n              set before. That only occurs when mouting is\n              finished, and onWindowResize has been called and\n              this.width has been changed the first time after it\n              got set to null in the constructor. It is now time\n              to issue layout-ready events as the GridItems have\n              their sizes configured properly.\n                The reason for emitting the layout-ready events on\n              the next tick is to allow for the newly-emitted\n              updateWidth event (above) to have reached the\n              children GridItem-s and had their effect, so we're\n              sure that they have the final size before we emit\n              layout-ready (for this GridLayout) and\n              item-layout-ready (for the GridItem-s).\n                This way any client event handlers can reliably\n              invistigate stable sizes of GridItem-s.\n          */\n          this.$nextTick(function () {\n            _this.$emit('layout-ready', self.layout);\n          });\n        }\n\n        this.updateHeight();\n      });\n    },\n    layout: function layout() {\n      this.layoutUpdate();\n    },\n    colNum: function colNum(val) {\n      this.eventBus.$emit(\"setColNum\", val);\n    },\n    rowHeight: function rowHeight() {\n      this.eventBus.$emit(\"setRowHeight\", this.rowHeight);\n    },\n    isDraggable: function isDraggable() {\n      this.eventBus.$emit(\"setDraggable\", this.isDraggable);\n    },\n    isResizable: function isResizable() {\n      this.eventBus.$emit(\"setResizable\", this.isResizable);\n    },\n    isBounded: function isBounded() {\n      this.eventBus.$emit(\"setBounded\", this.isBounded);\n    },\n    transformScale: function transformScale() {\n      this.eventBus.$emit(\"setTransformScale\", this.transformScale);\n    },\n    responsive: function responsive() {\n      if (!this.responsive) {\n        this.$emit('update:layout', this.originalLayout);\n        this.eventBus.$emit(\"setColNum\", this.colNum);\n      }\n\n      this.onWindowResize();\n    },\n    maxRows: function maxRows() {\n      this.eventBus.$emit(\"setMaxRows\", this.maxRows);\n    },\n    margin: function margin() {\n      this.updateHeight();\n    }\n  },\n  methods: {\n    layoutUpdate: function layoutUpdate() {\n      if (this.layout !== undefined && this.originalLayout !== null) {\n        if (this.layout.length !== this.originalLayout.length) {\n          // console.log(\"### LAYOUT UPDATE!\", this.layout.length, this.originalLayout.length);\n          var diff = this.findDifference(this.layout, this.originalLayout);\n\n          if (diff.length > 0) {\n            // console.log(diff);\n            if (this.layout.length > this.originalLayout.length) {\n              this.originalLayout = this.originalLayout.concat(diff);\n            } else {\n              this.originalLayout = this.originalLayout.filter(function (obj) {\n                return !diff.some(function (obj2) {\n                  return obj.i === obj2.i;\n                });\n              });\n            }\n          }\n\n          this.lastLayoutLength = this.layout.length;\n          this.initResponsiveFeatures();\n        }\n\n        Object(utils[\"c\" /* compact */])(this.layout, this.verticalCompact);\n        this.eventBus.$emit(\"updateWidth\", this.width);\n        this.updateHeight();\n        this.$emit('layout-updated', this.layout);\n      }\n    },\n    updateHeight: function updateHeight() {\n      this.mergedStyle = {\n        height: this.containerHeight()\n      };\n    },\n    onWindowResize: function onWindowResize() {\n      if (this.$refs !== null && this.$refs.item !== null && this.$refs.item !== undefined) {\n        this.width = this.$refs.item.offsetWidth;\n      }\n\n      this.eventBus.$emit(\"resizeEvent\");\n    },\n    containerHeight: function containerHeight() {\n      if (!this.autoSize) return; // console.log(\"bottom: \" + bottom(this.layout))\n      // console.log(\"rowHeight + margins: \" + (this.rowHeight + this.margin[1]) + this.margin[1])\n\n      var containerHeight = Object(utils[\"a\" /* bottom */])(this.layout) * (this.rowHeight + this.margin[1]) + this.margin[1] + 'px';\n      return containerHeight;\n    },\n    dragEvent: function dragEvent(eventName, id, x, y, h, w) {\n      //console.log(eventName + \" id=\" + id + \", x=\" + x + \", y=\" + y);\n      var l = Object(utils[\"f\" /* getLayoutItem */])(this.layout, id); //GetLayoutItem sometimes returns null object\n\n      if (l === undefined || l === null) {\n        l = {\n          x: 0,\n          y: 0\n        };\n      }\n\n      if (eventName === \"dragstart\" && !this.verticalCompact) {\n        this.positionsBeforeDrag = this.layout.reduce(function (result, _ref) {\n          var i = _ref.i,\n              x = _ref.x,\n              y = _ref.y;\n          return _objectSpread(_objectSpread({}, result), {}, Object(defineProperty[\"a\" /* default */])({}, i, {\n            x: x,\n            y: y\n          }));\n        }, {});\n      }\n\n      if (eventName === \"dragmove\" || eventName === \"dragstart\") {\n        this.placeholder.i = id;\n        this.placeholder.x = l.x;\n        this.placeholder.y = l.y;\n        this.placeholder.w = w;\n        this.placeholder.h = h;\n        this.$nextTick(function () {\n          this.isDragging = true;\n        }); //this.$broadcast(\"updateWidth\", this.width);\n\n        this.eventBus.$emit(\"updateWidth\", this.width);\n      } else {\n        this.$nextTick(function () {\n          this.isDragging = false;\n        });\n      } // Move the element to the dragged location.\n\n\n      this.layout = Object(utils[\"g\" /* moveElement */])(this.layout, l, x, y, true, this.preventCollision);\n\n      if (this.restoreOnDrag) {\n        // Do not compact items more than in layout before drag\n        // Set moved item as static to avoid to compact it\n        l.static = true;\n        Object(utils[\"c\" /* compact */])(this.layout, this.verticalCompact, this.positionsBeforeDrag);\n        l.static = false;\n      } else {\n        Object(utils[\"c\" /* compact */])(this.layout, this.verticalCompact);\n      } // needed because vue can't detect changes on array element properties\n\n\n      this.eventBus.$emit(\"compact\");\n      this.updateHeight();\n\n      if (eventName === 'dragend') {\n        delete this.positionsBeforeDrag;\n        this.$emit('layout-updated', this.layout);\n      }\n    },\n    resizeEvent: function resizeEvent(eventName, id, x, y, h, w) {\n      var l = Object(utils[\"f\" /* getLayoutItem */])(this.layout, id); //GetLayoutItem sometimes return null object\n\n      if (l === undefined || l === null) {\n        l = {\n          h: 0,\n          w: 0\n        };\n      }\n\n      var hasCollisions;\n\n      if (this.preventCollision) {\n        var collisions = Object(utils[\"e\" /* getAllCollisions */])(this.layout, _objectSpread(_objectSpread({}, l), {}, {\n          w: w,\n          h: h\n        })).filter(function (layoutItem) {\n          return layoutItem.i !== l.i;\n        });\n        hasCollisions = collisions.length > 0; // If we're colliding, we need adjust the placeholder.\n\n        if (hasCollisions) {\n          // adjust w && h to maximum allowed space\n          var leastX = Infinity,\n              leastY = Infinity;\n          collisions.forEach(function (layoutItem) {\n            if (layoutItem.x > l.x) leastX = Math.min(leastX, layoutItem.x);\n            if (layoutItem.y > l.y) leastY = Math.min(leastY, layoutItem.y);\n          });\n          if (Number.isFinite(leastX)) l.w = leastX - l.x;\n          if (Number.isFinite(leastY)) l.h = leastY - l.y;\n        }\n      }\n\n      if (!hasCollisions) {\n        // Set new width and height.\n        l.w = w;\n        l.h = h;\n      }\n\n      if (eventName === \"resizestart\" || eventName === \"resizemove\") {\n        this.placeholder.i = id;\n        this.placeholder.x = x;\n        this.placeholder.y = y;\n        this.placeholder.w = l.w;\n        this.placeholder.h = l.h;\n        this.$nextTick(function () {\n          this.isDragging = true;\n        }); //this.$broadcast(\"updateWidth\", this.width);\n\n        this.eventBus.$emit(\"updateWidth\", this.width);\n      } else {\n        this.$nextTick(function () {\n          this.isDragging = false;\n        });\n      }\n\n      if (this.responsive) this.responsiveGridLayout();\n      Object(utils[\"c\" /* compact */])(this.layout, this.verticalCompact);\n      this.eventBus.$emit(\"compact\");\n      this.updateHeight();\n      if (eventName === 'resizeend') this.$emit('layout-updated', this.layout);\n    },\n    // finds or generates new layouts for set breakpoints\n    responsiveGridLayout: function responsiveGridLayout() {\n      var newBreakpoint = Object(responsiveUtils[\"b\" /* getBreakpointFromWidth */])(this.breakpoints, this.width);\n      var newCols = Object(responsiveUtils[\"c\" /* getColsFromBreakpoint */])(newBreakpoint, this.cols); // save actual layout in layouts\n\n      if (this.lastBreakpoint != null && !this.layouts[this.lastBreakpoint]) this.layouts[this.lastBreakpoint] = Object(utils[\"b\" /* cloneLayout */])(this.layout); // Find or generate a new layout.\n\n      var layout = Object(responsiveUtils[\"a\" /* findOrGenerateResponsiveLayout */])(this.originalLayout, this.layouts, this.breakpoints, newBreakpoint, this.lastBreakpoint, newCols, this.verticalCompact); // Store the new layout.\n\n      this.layouts[newBreakpoint] = layout;\n\n      if (this.lastBreakpoint !== newBreakpoint) {\n        this.$emit('breakpoint-changed', newBreakpoint, layout);\n      } // new prop sync\n\n\n      this.$emit('update:layout', layout);\n      this.lastBreakpoint = newBreakpoint;\n      this.eventBus.$emit(\"setColNum\", Object(responsiveUtils[\"c\" /* getColsFromBreakpoint */])(newBreakpoint, this.cols));\n    },\n    // clear all responsive layouts\n    initResponsiveFeatures: function initResponsiveFeatures() {\n      // clear layouts\n      this.layouts = Object.assign({}, this.responsiveLayouts);\n    },\n    // find difference in layouts\n    findDifference: function findDifference(layout, originalLayout) {\n      //Find values that are in result1 but not in result2\n      var uniqueResultOne = layout.filter(function (obj) {\n        return !originalLayout.some(function (obj2) {\n          return obj.i === obj2.i;\n        });\n      }); //Find values that are in result2 but not in result1\n\n      var uniqueResultTwo = originalLayout.filter(function (obj) {\n        return !layout.some(function (obj2) {\n          return obj.i === obj2.i;\n        });\n      }); //Combine the two arrays of unique entries#\n\n      return uniqueResultOne.concat(uniqueResultTwo);\n    }\n  }\n});\n// CONCATENATED MODULE: ./src/components/GridLayout.vue?vue&type=script&lang=js&\n /* harmony default export */ var components_GridLayoutvue_type_script_lang_js_ = (GridLayoutvue_type_script_lang_js_); \n// EXTERNAL MODULE: ./src/components/GridLayout.vue?vue&type=style&index=0&lang=css&\nvar GridLayoutvue_type_style_index_0_lang_css_ = __webpack_require__(\"e279\");\n\n// EXTERNAL MODULE: ./node_modules/vue-loader/lib/runtime/componentNormalizer.js\nvar componentNormalizer = __webpack_require__(\"2877\");\n\n// CONCATENATED MODULE: ./src/components/GridLayout.vue\n\n\n\n\n\n\n/* normalize component */\n\nvar component = Object(componentNormalizer[\"a\" /* default */])(\n  components_GridLayoutvue_type_script_lang_js_,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  null,\n  null\n  \n)\n\n/* harmony default export */ var GridLayout = __webpack_exports__[\"a\"] = (component.exports);\n\n/***/ }),\n\n/***/ \"38fd\":\n/***/ (function(module, exports, __webpack_require__) {\n\n// 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O)\nvar has = __webpack_require__(\"69a8\");\nvar toObject = __webpack_require__(\"4bf8\");\nvar IE_PROTO = __webpack_require__(\"613b\")('IE_PROTO');\nvar ObjectProto = Object.prototype;\n\nmodule.exports = Object.getPrototypeOf || function (O) {\n  O = toObject(O);\n  if (has(O, IE_PROTO)) return O[IE_PROTO];\n  if (typeof O.constructor == 'function' && O instanceof O.constructor) {\n    return O.constructor.prototype;\n  } return O instanceof Object ? ObjectProto : null;\n};\n\n\n/***/ }),\n\n/***/ \"41a0\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar create = __webpack_require__(\"2aeb\");\nvar descriptor = __webpack_require__(\"4630\");\nvar setToStringTag = __webpack_require__(\"7f20\");\nvar IteratorPrototype = {};\n\n// 25.1.2.1.1 %IteratorPrototype%[@@iterator]()\n__webpack_require__(\"32e9\")(IteratorPrototype, __webpack_require__(\"2b4c\")('iterator'), function () { return this; });\n\nmodule.exports = function (Constructor, NAME, next) {\n  Constructor.prototype = create(IteratorPrototype, { next: descriptor(1, next) });\n  setToStringTag(Constructor, NAME + ' Iterator');\n};\n\n\n/***/ }),\n\n/***/ \"456d\":\n/***/ (function(module, exports, __webpack_require__) {\n\n// 19.1.2.14 Object.keys(O)\nvar toObject = __webpack_require__(\"4bf8\");\nvar $keys = __webpack_require__(\"0d58\");\n\n__webpack_require__(\"5eda\")('keys', function () {\n  return function keys(it) {\n    return $keys(toObject(it));\n  };\n});\n\n\n/***/ }),\n\n/***/ \"4588\":\n/***/ (function(module, exports) {\n\n// 7.1.4 ToInteger\nvar ceil = Math.ceil;\nvar floor = Math.floor;\nmodule.exports = function (it) {\n  return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it);\n};\n\n\n/***/ }),\n\n/***/ \"4630\":\n/***/ (function(module, exports) {\n\nmodule.exports = function (bitmap, value) {\n  return {\n    enumerable: !(bitmap & 1),\n    configurable: !(bitmap & 2),\n    writable: !(bitmap & 4),\n    value: value\n  };\n};\n\n\n/***/ }),\n\n/***/ \"4917\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar anObject = __webpack_require__(\"cb7c\");\nvar toLength = __webpack_require__(\"9def\");\nvar advanceStringIndex = __webpack_require__(\"0390\");\nvar regExpExec = __webpack_require__(\"5f1b\");\n\n// @@match logic\n__webpack_require__(\"214f\")('match', 1, function (defined, MATCH, $match, maybeCallNative) {\n  return [\n    // `String.prototype.match` method\n    // https://tc39.github.io/ecma262/#sec-string.prototype.match\n    function match(regexp) {\n      var O = defined(this);\n      var fn = regexp == undefined ? undefined : regexp[MATCH];\n      return fn !== undefined ? fn.call(regexp, O) : new RegExp(regexp)[MATCH](String(O));\n    },\n    // `RegExp.prototype[@@match]` method\n    // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@match\n    function (regexp) {\n      var res = maybeCallNative($match, regexp, this);\n      if (res.done) return res.value;\n      var rx = anObject(regexp);\n      var S = String(this);\n      if (!rx.global) return regExpExec(rx, S);\n      var fullUnicode = rx.unicode;\n      rx.lastIndex = 0;\n      var A = [];\n      var n = 0;\n      var result;\n      while ((result = regExpExec(rx, S)) !== null) {\n        var matchStr = String(result[0]);\n        A[n] = matchStr;\n        if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode);\n        n++;\n      }\n      return n === 0 ? null : A;\n    }\n  ];\n});\n\n\n/***/ }),\n\n/***/ \"499e\":\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n// ESM COMPAT FLAG\n__webpack_require__.r(__webpack_exports__);\n\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, \"default\", function() { return /* binding */ addStylesClient; });\n\n// CONCATENATED MODULE: ./node_modules/vue-style-loader/lib/listToStyles.js\n/**\n * Translates the list format produced by css-loader into something\n * easier to manipulate.\n */\nfunction listToStyles (parentId, list) {\n  var styles = []\n  var newStyles = {}\n  for (var i = 0; i < list.length; i++) {\n    var item = list[i]\n    var id = item[0]\n    var css = item[1]\n    var media = item[2]\n    var sourceMap = item[3]\n    var part = {\n      id: parentId + ':' + i,\n      css: css,\n      media: media,\n      sourceMap: sourceMap\n    }\n    if (!newStyles[id]) {\n      styles.push(newStyles[id] = { id: id, parts: [part] })\n    } else {\n      newStyles[id].parts.push(part)\n    }\n  }\n  return styles\n}\n\n// CONCATENATED MODULE: ./node_modules/vue-style-loader/lib/addStylesClient.js\n/*\n  MIT License http://www.opensource.org/licenses/mit-license.php\n  Author Tobias Koppers @sokra\n  Modified by Evan You @yyx990803\n*/\n\n\n\nvar hasDocument = typeof document !== 'undefined'\n\nif (typeof DEBUG !== 'undefined' && DEBUG) {\n  if (!hasDocument) {\n    throw new Error(\n    'vue-style-loader cannot be used in a non-browser environment. ' +\n    \"Use { target: 'node' } in your Webpack config to indicate a server-rendering environment.\"\n  ) }\n}\n\n/*\ntype StyleObject = {\n  id: number;\n  parts: Array<StyleObjectPart>\n}\n\ntype StyleObjectPart = {\n  css: string;\n  media: string;\n  sourceMap: ?string\n}\n*/\n\nvar stylesInDom = {/*\n  [id: number]: {\n    id: number,\n    refs: number,\n    parts: Array<(obj?: StyleObjectPart) => void>\n  }\n*/}\n\nvar head = hasDocument && (document.head || document.getElementsByTagName('head')[0])\nvar singletonElement = null\nvar singletonCounter = 0\nvar isProduction = false\nvar noop = function () {}\nvar options = null\nvar ssrIdKey = 'data-vue-ssr-id'\n\n// Force single-tag solution on IE6-9, which has a hard limit on the # of <style>\n// tags it will allow on a page\nvar isOldIE = typeof navigator !== 'undefined' && /msie [6-9]\\b/.test(navigator.userAgent.toLowerCase())\n\nfunction addStylesClient (parentId, list, _isProduction, _options) {\n  isProduction = _isProduction\n\n  options = _options || {}\n\n  var styles = listToStyles(parentId, list)\n  addStylesToDom(styles)\n\n  return function update (newList) {\n    var mayRemove = []\n    for (var i = 0; i < styles.length; i++) {\n      var item = styles[i]\n      var domStyle = stylesInDom[item.id]\n      domStyle.refs--\n      mayRemove.push(domStyle)\n    }\n    if (newList) {\n      styles = listToStyles(parentId, newList)\n      addStylesToDom(styles)\n    } else {\n      styles = []\n    }\n    for (var i = 0; i < mayRemove.length; i++) {\n      var domStyle = mayRemove[i]\n      if (domStyle.refs === 0) {\n        for (var j = 0; j < domStyle.parts.length; j++) {\n          domStyle.parts[j]()\n        }\n        delete stylesInDom[domStyle.id]\n      }\n    }\n  }\n}\n\nfunction addStylesToDom (styles /* Array<StyleObject> */) {\n  for (var i = 0; i < styles.length; i++) {\n    var item = styles[i]\n    var domStyle = stylesInDom[item.id]\n    if (domStyle) {\n      domStyle.refs++\n      for (var j = 0; j < domStyle.parts.length; j++) {\n        domStyle.parts[j](item.parts[j])\n      }\n      for (; j < item.parts.length; j++) {\n        domStyle.parts.push(addStyle(item.parts[j]))\n      }\n      if (domStyle.parts.length > item.parts.length) {\n        domStyle.parts.length = item.parts.length\n      }\n    } else {\n      var parts = []\n      for (var j = 0; j < item.parts.length; j++) {\n        parts.push(addStyle(item.parts[j]))\n      }\n      stylesInDom[item.id] = { id: item.id, refs: 1, parts: parts }\n    }\n  }\n}\n\nfunction createStyleElement () {\n  var styleElement = document.createElement('style')\n  styleElement.type = 'text/css'\n  head.appendChild(styleElement)\n  return styleElement\n}\n\nfunction addStyle (obj /* StyleObjectPart */) {\n  var update, remove\n  var styleElement = document.querySelector('style[' + ssrIdKey + '~=\"' + obj.id + '\"]')\n\n  if (styleElement) {\n    if (isProduction) {\n      // has SSR styles and in production mode.\n      // simply do nothing.\n      return noop\n    } else {\n      // has SSR styles but in dev mode.\n      // for some reason Chrome can't handle source map in server-rendered\n      // style tags - source maps in <style> only works if the style tag is\n      // created and inserted dynamically. So we remove the server rendered\n      // styles and inject new ones.\n      styleElement.parentNode.removeChild(styleElement)\n    }\n  }\n\n  if (isOldIE) {\n    // use singleton mode for IE9.\n    var styleIndex = singletonCounter++\n    styleElement = singletonElement || (singletonElement = createStyleElement())\n    update = applyToSingletonTag.bind(null, styleElement, styleIndex, false)\n    remove = applyToSingletonTag.bind(null, styleElement, styleIndex, true)\n  } else {\n    // use multi-style-tag mode in all other cases\n    styleElement = createStyleElement()\n    update = applyToTag.bind(null, styleElement)\n    remove = function () {\n      styleElement.parentNode.removeChild(styleElement)\n    }\n  }\n\n  update(obj)\n\n  return function updateStyle (newObj /* StyleObjectPart */) {\n    if (newObj) {\n      if (newObj.css === obj.css &&\n          newObj.media === obj.media &&\n          newObj.sourceMap === obj.sourceMap) {\n        return\n      }\n      update(obj = newObj)\n    } else {\n      remove()\n    }\n  }\n}\n\nvar replaceText = (function () {\n  var textStore = []\n\n  return function (index, replacement) {\n    textStore[index] = replacement\n    return textStore.filter(Boolean).join('\\n')\n  }\n})()\n\nfunction applyToSingletonTag (styleElement, index, remove, obj) {\n  var css = remove ? '' : obj.css\n\n  if (styleElement.styleSheet) {\n    styleElement.styleSheet.cssText = replaceText(index, css)\n  } else {\n    var cssNode = document.createTextNode(css)\n    var childNodes = styleElement.childNodes\n    if (childNodes[index]) styleElement.removeChild(childNodes[index])\n    if (childNodes.length) {\n      styleElement.insertBefore(cssNode, childNodes[index])\n    } else {\n      styleElement.appendChild(cssNode)\n    }\n  }\n}\n\nfunction applyToTag (styleElement, obj) {\n  var css = obj.css\n  var media = obj.media\n  var sourceMap = obj.sourceMap\n\n  if (media) {\n    styleElement.setAttribute('media', media)\n  }\n  if (options.ssrId) {\n    styleElement.setAttribute(ssrIdKey, obj.id)\n  }\n\n  if (sourceMap) {\n    // https://developer.chrome.com/devtools/docs/javascript-debugging\n    // this makes source maps inside style tags work properly in Chrome\n    css += '\\n/*# sourceURL=' + sourceMap.sources[0] + ' */'\n    // http://stackoverflow.com/a/26603875\n    css += '\\n/*# sourceMappingURL=data:application/json;base64,' + btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap)))) + ' */'\n  }\n\n  if (styleElement.styleSheet) {\n    styleElement.styleSheet.cssText = css\n  } else {\n    while (styleElement.firstChild) {\n      styleElement.removeChild(styleElement.firstChild)\n    }\n    styleElement.appendChild(document.createTextNode(css))\n  }\n}\n\n\n/***/ }),\n\n/***/ \"49ad\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nmodule.exports = function(idHandler) {\n    var eventListeners = {};\n\n    /**\n     * Gets all listeners for the given element.\n     * @public\n     * @param {element} element The element to get all listeners for.\n     * @returns All listeners for the given element.\n     */\n    function getListeners(element) {\n        var id = idHandler.get(element);\n\n        if (id === undefined) {\n            return [];\n        }\n\n        return eventListeners[id] || [];\n    }\n\n    /**\n     * Stores the given listener for the given element. Will not actually add the listener to the element.\n     * @public\n     * @param {element} element The element that should have the listener added.\n     * @param {function} listener The callback that the element has added.\n     */\n    function addListener(element, listener) {\n        var id = idHandler.get(element);\n\n        if(!eventListeners[id]) {\n            eventListeners[id] = [];\n        }\n\n        eventListeners[id].push(listener);\n    }\n\n    function removeListener(element, listener) {\n        var listeners = getListeners(element);\n        for (var i = 0, len = listeners.length; i < len; ++i) {\n            if (listeners[i] === listener) {\n              listeners.splice(i, 1);\n              break;\n            }\n        }\n    }\n\n    function removeAllListeners(element) {\n      var listeners = getListeners(element);\n      if (!listeners) { return; }\n      listeners.length = 0;\n    }\n\n    return {\n        get: getListeners,\n        add: addListener,\n        removeListener: removeListener,\n        removeAllListeners: removeAllListeners\n    };\n};\n\n\n/***/ }),\n\n/***/ \"4bf8\":\n/***/ (function(module, exports, __webpack_require__) {\n\n// 7.1.13 ToObject(argument)\nvar defined = __webpack_require__(\"be13\");\nmodule.exports = function (it) {\n  return Object(defined(it));\n};\n\n\n/***/ }),\n\n/***/ \"5058\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nmodule.exports = function(options) {\n    var idGenerator     = options.idGenerator;\n    var getState        = options.stateHandler.getState;\n\n    /**\n     * Gets the resize detector id of the element.\n     * @public\n     * @param {element} element The target element to get the id of.\n     * @returns {string|number|null} The id of the element. Null if it has no id.\n     */\n    function getId(element) {\n        var state = getState(element);\n\n        if (state && state.id !== undefined) {\n            return state.id;\n        }\n\n        return null;\n    }\n\n    /**\n     * Sets the resize detector id of the element. Requires the element to have a resize detector state initialized.\n     * @public\n     * @param {element} element The target element to set the id of.\n     * @returns {string|number|null} The id of the element.\n     */\n    function setId(element) {\n        var state = getState(element);\n\n        if (!state) {\n            throw new Error(\"setId required the element to have a resize detection state.\");\n        }\n\n        var id = idGenerator.generate();\n\n        state.id = id;\n\n        return id;\n    }\n\n    return {\n        get: getId,\n        set: setId\n    };\n};\n\n\n/***/ }),\n\n/***/ \"50bf\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar utils = module.exports = {};\n\nutils.getOption = getOption;\n\nfunction getOption(options, name, defaultValue) {\n    var value = options[name];\n\n    if((value === undefined || value === null) && defaultValue !== undefined) {\n        return defaultValue;\n    }\n\n    return value;\n}\n\n\n/***/ }),\n\n/***/ \"520a\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar regexpFlags = __webpack_require__(\"0bfb\");\n\nvar nativeExec = RegExp.prototype.exec;\n// This always refers to the native implementation, because the\n// String#replace polyfill uses ./fix-regexp-well-known-symbol-logic.js,\n// which loads this file before patching the method.\nvar nativeReplace = String.prototype.replace;\n\nvar patchedExec = nativeExec;\n\nvar LAST_INDEX = 'lastIndex';\n\nvar UPDATES_LAST_INDEX_WRONG = (function () {\n  var re1 = /a/,\n      re2 = /b*/g;\n  nativeExec.call(re1, 'a');\n  nativeExec.call(re2, 'a');\n  return re1[LAST_INDEX] !== 0 || re2[LAST_INDEX] !== 0;\n})();\n\n// nonparticipating capturing group, copied from es5-shim's String#split patch.\nvar NPCG_INCLUDED = /()??/.exec('')[1] !== undefined;\n\nvar PATCH = UPDATES_LAST_INDEX_WRONG || NPCG_INCLUDED;\n\nif (PATCH) {\n  patchedExec = function exec(str) {\n    var re = this;\n    var lastIndex, reCopy, match, i;\n\n    if (NPCG_INCLUDED) {\n      reCopy = new RegExp('^' + re.source + '$(?!\\\\s)', regexpFlags.call(re));\n    }\n    if (UPDATES_LAST_INDEX_WRONG) lastIndex = re[LAST_INDEX];\n\n    match = nativeExec.call(re, str);\n\n    if (UPDATES_LAST_INDEX_WRONG && match) {\n      re[LAST_INDEX] = re.global ? match.index + match[0].length : lastIndex;\n    }\n    if (NPCG_INCLUDED && match && match.length > 1) {\n      // Fix browsers whose `exec` methods don't consistently return `undefined`\n      // for NPCG, like IE8. NOTE: This doesn' work for /(.?)?/\n      // eslint-disable-next-line no-loop-func\n      nativeReplace.call(match[0], reCopy, function () {\n        for (i = 1; i < arguments.length - 2; i++) {\n          if (arguments[i] === undefined) match[i] = undefined;\n        }\n      });\n    }\n\n    return match;\n  };\n}\n\nmodule.exports = patchedExec;\n\n\n/***/ }),\n\n/***/ \"52a7\":\n/***/ (function(module, exports) {\n\nexports.f = {}.propertyIsEnumerable;\n\n\n/***/ }),\n\n/***/ \"5537\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar core = __webpack_require__(\"8378\");\nvar global = __webpack_require__(\"7726\");\nvar SHARED = '__core-js_shared__';\nvar store = global[SHARED] || (global[SHARED] = {});\n\n(module.exports = function (key, value) {\n  return store[key] || (store[key] = value !== undefined ? value : {});\n})('versions', []).push({\n  version: core.version,\n  mode: __webpack_require__(\"2d00\") ? 'pure' : 'global',\n  copyright: '© 2020 Denis Pushkarev (zloirock.ru)'\n});\n\n\n/***/ }),\n\n/***/ \"55dd\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar $export = __webpack_require__(\"5ca1\");\nvar aFunction = __webpack_require__(\"d8e8\");\nvar toObject = __webpack_require__(\"4bf8\");\nvar fails = __webpack_require__(\"79e5\");\nvar $sort = [].sort;\nvar test = [1, 2, 3];\n\n$export($export.P + $export.F * (fails(function () {\n  // IE8-\n  test.sort(undefined);\n}) || !fails(function () {\n  // V8 bug\n  test.sort(null);\n  // Old WebKit\n}) || !__webpack_require__(\"2f21\")($sort)), 'Array', {\n  // 22.1.3.25 Array.prototype.sort(comparefn)\n  sort: function sort(comparefn) {\n    return comparefn === undefined\n      ? $sort.call(toObject(this))\n      : $sort.call(toObject(this), aFunction(comparefn));\n  }\n});\n\n\n/***/ }),\n\n/***/ \"5be5\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nmodule.exports = function(options) {\n    var getState = options.stateHandler.getState;\n\n    /**\n     * Tells if the element has been made detectable and ready to be listened for resize events.\n     * @public\n     * @param {element} The element to check.\n     * @returns {boolean} True or false depending on if the element is detectable or not.\n     */\n    function isDetectable(element) {\n        var state = getState(element);\n        return state && !!state.isDetectable;\n    }\n\n    /**\n     * Marks the element that it has been made detectable and ready to be listened for resize events.\n     * @public\n     * @param {element} The element to mark.\n     */\n    function markAsDetectable(element) {\n        getState(element).isDetectable = true;\n    }\n\n    /**\n     * Tells if the element is busy or not.\n     * @public\n     * @param {element} The element to check.\n     * @returns {boolean} True or false depending on if the element is busy or not.\n     */\n    function isBusy(element) {\n        return !!getState(element).busy;\n    }\n\n    /**\n     * Marks the object is busy and should not be made detectable.\n     * @public\n     * @param {element} element The element to mark.\n     * @param {boolean} busy If the element is busy or not.\n     */\n    function markBusy(element, busy) {\n        getState(element).busy = !!busy;\n    }\n\n    return {\n        isDetectable: isDetectable,\n        markAsDetectable: markAsDetectable,\n        isBusy: isBusy,\n        markBusy: markBusy\n    };\n};\n\n\n/***/ }),\n\n/***/ \"5ca1\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar global = __webpack_require__(\"7726\");\nvar core = __webpack_require__(\"8378\");\nvar hide = __webpack_require__(\"32e9\");\nvar redefine = __webpack_require__(\"2aba\");\nvar ctx = __webpack_require__(\"9b43\");\nvar PROTOTYPE = 'prototype';\n\nvar $export = function (type, name, source) {\n  var IS_FORCED = type & $export.F;\n  var IS_GLOBAL = type & $export.G;\n  var IS_STATIC = type & $export.S;\n  var IS_PROTO = type & $export.P;\n  var IS_BIND = type & $export.B;\n  var target = IS_GLOBAL ? global : IS_STATIC ? global[name] || (global[name] = {}) : (global[name] || {})[PROTOTYPE];\n  var exports = IS_GLOBAL ? core : core[name] || (core[name] = {});\n  var expProto = exports[PROTOTYPE] || (exports[PROTOTYPE] = {});\n  var key, own, out, exp;\n  if (IS_GLOBAL) source = name;\n  for (key in source) {\n    // contains in native\n    own = !IS_FORCED && target && target[key] !== undefined;\n    // export native or passed\n    out = (own ? target : source)[key];\n    // bind timers to global for call from export context\n    exp = IS_BIND && own ? ctx(out, global) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out;\n    // extend global\n    if (target) redefine(target, key, out, type & $export.U);\n    // export\n    if (exports[key] != out) hide(exports, key, exp);\n    if (IS_PROTO && expProto[key] != out) expProto[key] = out;\n  }\n};\nglobal.core = core;\n// type bitmap\n$export.F = 1;   // forced\n$export.G = 2;   // global\n$export.S = 4;   // static\n$export.P = 8;   // proto\n$export.B = 16;  // bind\n$export.W = 32;  // wrap\n$export.U = 64;  // safe\n$export.R = 128; // real proto method for `library`\nmodule.exports = $export;\n\n\n/***/ }),\n\n/***/ \"5dbc\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar isObject = __webpack_require__(\"d3f4\");\nvar setPrototypeOf = __webpack_require__(\"8b97\").set;\nmodule.exports = function (that, target, C) {\n  var S = target.constructor;\n  var P;\n  if (S !== C && typeof S == 'function' && (P = S.prototype) !== C.prototype && isObject(P) && setPrototypeOf) {\n    setPrototypeOf(that, P);\n  } return that;\n};\n\n\n/***/ }),\n\n/***/ \"5ed4\":\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var _node_modules_vue_style_loader_index_js_ref_6_oneOf_1_0_node_modules_css_loader_index_js_ref_6_oneOf_1_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_src_index_js_ref_6_oneOf_1_2_node_modules_postcss_loader_src_index_js_ref_6_oneOf_1_3_node_modules_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_lib_index_js_vue_loader_options_GridItem_vue_vue_type_style_index_0_lang_css___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(\"6e21\");\n/* harmony import */ var _node_modules_vue_style_loader_index_js_ref_6_oneOf_1_0_node_modules_css_loader_index_js_ref_6_oneOf_1_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_src_index_js_ref_6_oneOf_1_2_node_modules_postcss_loader_src_index_js_ref_6_oneOf_1_3_node_modules_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_lib_index_js_vue_loader_options_GridItem_vue_vue_type_style_index_0_lang_css___WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_vue_style_loader_index_js_ref_6_oneOf_1_0_node_modules_css_loader_index_js_ref_6_oneOf_1_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_src_index_js_ref_6_oneOf_1_2_node_modules_postcss_loader_src_index_js_ref_6_oneOf_1_3_node_modules_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_lib_index_js_vue_loader_options_GridItem_vue_vue_type_style_index_0_lang_css___WEBPACK_IMPORTED_MODULE_0__);\n/* unused harmony reexport * */\n\n\n/***/ }),\n\n/***/ \"5eda\":\n/***/ (function(module, exports, __webpack_require__) {\n\n// most Object methods by ES6 should accept primitives\nvar $export = __webpack_require__(\"5ca1\");\nvar core = __webpack_require__(\"8378\");\nvar fails = __webpack_require__(\"79e5\");\nmodule.exports = function (KEY, exec) {\n  var fn = (core.Object || {})[KEY] || Object[KEY];\n  var exp = {};\n  exp[KEY] = exec(fn);\n  $export($export.S + $export.F * fails(function () { fn(1); }), 'Object', exp);\n};\n\n\n/***/ }),\n\n/***/ \"5f1b\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar classof = __webpack_require__(\"23c6\");\nvar builtinExec = RegExp.prototype.exec;\n\n // `RegExpExec` abstract operation\n// https://tc39.github.io/ecma262/#sec-regexpexec\nmodule.exports = function (R, S) {\n  var exec = R.exec;\n  if (typeof exec === 'function') {\n    var result = exec.call(R, S);\n    if (typeof result !== 'object') {\n      throw new TypeError('RegExp exec method returned something other than an Object or null');\n    }\n    return result;\n  }\n  if (classof(R) !== 'RegExp') {\n    throw new TypeError('RegExp#exec called on incompatible receiver');\n  }\n  return builtinExec.call(R, S);\n};\n\n\n/***/ }),\n\n/***/ \"613b\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar shared = __webpack_require__(\"5537\")('keys');\nvar uid = __webpack_require__(\"ca5a\");\nmodule.exports = function (key) {\n  return shared[key] || (shared[key] = uid(key));\n};\n\n\n/***/ }),\n\n/***/ \"626a\":\n/***/ (function(module, exports, __webpack_require__) {\n\n// fallback for non-array-like ES3 and non-enumerable old V8 strings\nvar cof = __webpack_require__(\"2d95\");\n// eslint-disable-next-line no-prototype-builtins\nmodule.exports = Object('z').propertyIsEnumerable(0) ? Object : function (it) {\n  return cof(it) == 'String' ? it.split('') : Object(it);\n};\n\n\n/***/ }),\n\n/***/ \"6821\":\n/***/ (function(module, exports, __webpack_require__) {\n\n// to indexed object, toObject with fallback for non-array-like ES3 strings\nvar IObject = __webpack_require__(\"626a\");\nvar defined = __webpack_require__(\"be13\");\nmodule.exports = function (it) {\n  return IObject(defined(it));\n};\n\n\n/***/ }),\n\n/***/ \"69a8\":\n/***/ (function(module, exports) {\n\nvar hasOwnProperty = {}.hasOwnProperty;\nmodule.exports = function (it, key) {\n  return hasOwnProperty.call(it, key);\n};\n\n\n/***/ }),\n\n/***/ \"6a99\":\n/***/ (function(module, exports, __webpack_require__) {\n\n// 7.1.1 ToPrimitive(input [, PreferredType])\nvar isObject = __webpack_require__(\"d3f4\");\n// instead of the ES6 spec version, we didn't implement @@toPrimitive case\n// and the second argument - flag - preferred type is a string\nmodule.exports = function (it, S) {\n  if (!isObject(it)) return it;\n  var fn, val;\n  if (S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;\n  if (typeof (fn = it.valueOf) == 'function' && !isObject(val = fn.call(it))) return val;\n  if (!S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;\n  throw TypeError(\"Can't convert object to primitive value\");\n};\n\n\n/***/ }),\n\n/***/ \"6e21\":\n/***/ (function(module, exports, __webpack_require__) {\n\n// style-loader: Adds some css to the DOM by adding a <style> tag\n\n// load the styles\nvar content = __webpack_require__(\"9cbe\");\nif(typeof content === 'string') content = [[module.i, content, '']];\nif(content.locals) module.exports = content.locals;\n// add the styles to the DOM\nvar add = __webpack_require__(\"499e\").default\nvar update = add(\"3cbd0c21\", content, true, {\"sourceMap\":false,\"shadowMode\":false});\n\n/***/ }),\n\n/***/ \"7333\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n// 19.1.2.1 Object.assign(target, source, ...)\nvar DESCRIPTORS = __webpack_require__(\"9e1e\");\nvar getKeys = __webpack_require__(\"0d58\");\nvar gOPS = __webpack_require__(\"2621\");\nvar pIE = __webpack_require__(\"52a7\");\nvar toObject = __webpack_require__(\"4bf8\");\nvar IObject = __webpack_require__(\"626a\");\nvar $assign = Object.assign;\n\n// should work with symbols and should have deterministic property order (V8 bug)\nmodule.exports = !$assign || __webpack_require__(\"79e5\")(function () {\n  var A = {};\n  var B = {};\n  // eslint-disable-next-line no-undef\n  var S = Symbol();\n  var K = 'abcdefghijklmnopqrst';\n  A[S] = 7;\n  K.split('').forEach(function (k) { B[k] = k; });\n  return $assign({}, A)[S] != 7 || Object.keys($assign({}, B)).join('') != K;\n}) ? function assign(target, source) { // eslint-disable-line no-unused-vars\n  var T = toObject(target);\n  var aLen = arguments.length;\n  var index = 1;\n  var getSymbols = gOPS.f;\n  var isEnum = pIE.f;\n  while (aLen > index) {\n    var S = IObject(arguments[index++]);\n    var keys = getSymbols ? getKeys(S).concat(getSymbols(S)) : getKeys(S);\n    var length = keys.length;\n    var j = 0;\n    var key;\n    while (length > j) {\n      key = keys[j++];\n      if (!DESCRIPTORS || isEnum.call(S, key)) T[key] = S[key];\n    }\n  } return T;\n} : $assign;\n\n\n/***/ }),\n\n/***/ \"7726\":\n/***/ (function(module, exports) {\n\n// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\nvar global = module.exports = typeof window != 'undefined' && window.Math == Math\n  ? window : typeof self != 'undefined' && self.Math == Math ? self\n  // eslint-disable-next-line no-new-func\n  : Function('return this')();\nif (typeof __g == 'number') __g = global; // eslint-disable-line no-undef\n\n\n/***/ }),\n\n/***/ \"77f1\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar toInteger = __webpack_require__(\"4588\");\nvar max = Math.max;\nvar min = Math.min;\nmodule.exports = function (index, length) {\n  index = toInteger(index);\n  return index < 0 ? max(index + length, 0) : min(index, length);\n};\n\n\n/***/ }),\n\n/***/ \"79e5\":\n/***/ (function(module, exports) {\n\nmodule.exports = function (exec) {\n  try {\n    return !!exec();\n  } catch (e) {\n    return true;\n  }\n};\n\n\n/***/ }),\n\n/***/ \"7f20\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar def = __webpack_require__(\"86cc\").f;\nvar has = __webpack_require__(\"69a8\");\nvar TAG = __webpack_require__(\"2b4c\")('toStringTag');\n\nmodule.exports = function (it, tag, stat) {\n  if (it && !has(it = stat ? it : it.prototype, TAG)) def(it, TAG, { configurable: true, value: tag });\n};\n\n\n/***/ }),\n\n/***/ \"7f7f\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar dP = __webpack_require__(\"86cc\").f;\nvar FProto = Function.prototype;\nvar nameRE = /^\\s*function ([^ (]*)/;\nvar NAME = 'name';\n\n// 19.2.4.2 name\nNAME in FProto || __webpack_require__(\"9e1e\") && dP(FProto, NAME, {\n  configurable: true,\n  get: function () {\n    try {\n      return ('' + this).match(nameRE)[1];\n    } catch (e) {\n      return '';\n    }\n  }\n});\n\n\n/***/ }),\n\n/***/ \"8378\":\n/***/ (function(module, exports) {\n\nvar core = module.exports = { version: '2.6.12' };\nif (typeof __e == 'number') __e = core; // eslint-disable-line no-undef\n\n\n/***/ }),\n\n/***/ \"84f2\":\n/***/ (function(module, exports) {\n\nmodule.exports = {};\n\n\n/***/ }),\n\n/***/ \"86cc\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar anObject = __webpack_require__(\"cb7c\");\nvar IE8_DOM_DEFINE = __webpack_require__(\"c69a\");\nvar toPrimitive = __webpack_require__(\"6a99\");\nvar dP = Object.defineProperty;\n\nexports.f = __webpack_require__(\"9e1e\") ? Object.defineProperty : function defineProperty(O, P, Attributes) {\n  anObject(O);\n  P = toPrimitive(P, true);\n  anObject(Attributes);\n  if (IE8_DOM_DEFINE) try {\n    return dP(O, P, Attributes);\n  } catch (e) { /* empty */ }\n  if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported!');\n  if ('value' in Attributes) O[P] = Attributes.value;\n  return O;\n};\n\n\n/***/ }),\n\n/***/ \"8b97\":\n/***/ (function(module, exports, __webpack_require__) {\n\n// Works with __proto__ only. Old v8 can't work with null proto objects.\n/* eslint-disable no-proto */\nvar isObject = __webpack_require__(\"d3f4\");\nvar anObject = __webpack_require__(\"cb7c\");\nvar check = function (O, proto) {\n  anObject(O);\n  if (!isObject(proto) && proto !== null) throw TypeError(proto + \": can't set as prototype!\");\n};\nmodule.exports = {\n  set: Object.setPrototypeOf || ('__proto__' in {} ? // eslint-disable-line\n    function (test, buggy, set) {\n      try {\n        set = __webpack_require__(\"9b43\")(Function.call, __webpack_require__(\"11e9\").f(Object.prototype, '__proto__').set, 2);\n        set(test, []);\n        buggy = !(test instanceof Array);\n      } catch (e) { buggy = true; }\n      return function setPrototypeOf(O, proto) {\n        check(O, proto);\n        if (buggy) O.__proto__ = proto;\n        else set(O, proto);\n        return O;\n      };\n    }({}, false) : undefined),\n  check: check\n};\n\n\n/***/ }),\n\n/***/ \"8bbf\":\n/***/ (function(module, exports) {\n\nmodule.exports = __WEBPACK_EXTERNAL_MODULE__8bbf__;\n\n/***/ }),\n\n/***/ \"8e6e\":\n/***/ (function(module, exports, __webpack_require__) {\n\n// https://github.com/tc39/proposal-object-getownpropertydescriptors\nvar $export = __webpack_require__(\"5ca1\");\nvar ownKeys = __webpack_require__(\"990b\");\nvar toIObject = __webpack_require__(\"6821\");\nvar gOPD = __webpack_require__(\"11e9\");\nvar createProperty = __webpack_require__(\"f1ae\");\n\n$export($export.S, 'Object', {\n  getOwnPropertyDescriptors: function getOwnPropertyDescriptors(object) {\n    var O = toIObject(object);\n    var getDesc = gOPD.f;\n    var keys = ownKeys(O);\n    var result = {};\n    var i = 0;\n    var key, desc;\n    while (keys.length > i) {\n      desc = getDesc(O, key = keys[i++]);\n      if (desc !== undefined) createProperty(result, key, desc);\n    }\n    return result;\n  }\n});\n\n\n/***/ }),\n\n/***/ \"9093\":\n/***/ (function(module, exports, __webpack_require__) {\n\n// 19.1.2.7 / 15.2.3.4 Object.getOwnPropertyNames(O)\nvar $keys = __webpack_require__(\"ce10\");\nvar hiddenKeys = __webpack_require__(\"e11e\").concat('length', 'prototype');\n\nexports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {\n  return $keys(O, hiddenKeys);\n};\n\n\n/***/ }),\n\n/***/ \"97a7\":\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return getBreakpointFromWidth; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"c\", function() { return getColsFromBreakpoint; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return findOrGenerateResponsiveLayout; });\n/* unused harmony export generateResponsiveLayout */\n/* unused harmony export sortBreakpoints */\n/* harmony import */ var core_js_modules_es6_array_sort__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(\"55dd\");\n/* harmony import */ var core_js_modules_es6_array_sort__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es6_array_sort__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var core_js_modules_web_dom_iterable__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(\"ac6a\");\n/* harmony import */ var core_js_modules_web_dom_iterable__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_web_dom_iterable__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var core_js_modules_es6_array_iterator__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(\"cadf\");\n/* harmony import */ var core_js_modules_es6_array_iterator__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es6_array_iterator__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var core_js_modules_es6_object_keys__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(\"456d\");\n/* harmony import */ var core_js_modules_es6_object_keys__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es6_object_keys__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(\"a2b6\");\n\n\n\n\n// @flow\n\n\n/*:: import type {Layout} from './utils';*/\n\n/*:: export type ResponsiveLayout = {lg?: Layout, md?: Layout, sm?: Layout, xs?: Layout, xxs?: Layout};*/\n\n/*:: type Breakpoint = string;*/\n\n/**\n * Given a width, find the highest breakpoint that matches is valid for it (width > breakpoint).\n *\n * @param  {Object} breakpoints Breakpoints object (e.g. {lg: 1200, md: 960, ...})\n * @param  {Number} width Screen width.\n * @return {String}       Highest breakpoint that is less than width.\n */\n\n/*:: type Breakpoints = {lg?: number, md?: number, sm?: number, xs?: number, xxs?: number};*/\n\nfunction getBreakpointFromWidth(breakpoints\n/*: Breakpoints*/\n, width\n/*: number*/\n)\n/*: Breakpoint*/\n{\n  var sorted = sortBreakpoints(breakpoints);\n  var matching = sorted[0];\n\n  for (var i = 1, len = sorted.length; i < len; i++) {\n    var breakpointName = sorted[i];\n    if (width > breakpoints[breakpointName]) matching = breakpointName;\n  }\n\n  return matching;\n}\n/**\n * Given a breakpoint, get the # of cols set for it.\n * @param  {String} breakpoint Breakpoint name.\n * @param  {Object} cols       Map of breakpoints to cols.\n * @return {Number}            Number of cols.\n */\n\nfunction getColsFromBreakpoint(breakpoint\n/*: Breakpoint*/\n, cols\n/*: Breakpoints*/\n)\n/*: number*/\n{\n  if (!cols[breakpoint]) {\n    throw new Error(\"ResponsiveGridLayout: `cols` entry for breakpoint \" + breakpoint + \" is missing!\");\n  }\n\n  return cols[breakpoint];\n}\n/**\n * Given existing layouts and a new breakpoint, find or generate a new layout.\n *\n * This finds the layout above the new one and generates from it, if it exists.\n *\n * @param  {Array} orgLayout     Original layout.\n * @param  {Object} layouts     Existing layouts.\n * @param  {Array} breakpoints All breakpoints.\n * @param  {String} breakpoint New breakpoint.\n * @param  {String} breakpoint Last breakpoint (for fallback).\n * @param  {Number} cols       Column count at new breakpoint.\n * @param  {Boolean} verticalCompact Whether or not to compact the layout\n *   vertically.\n * @return {Array}             New layout.\n */\n\nfunction findOrGenerateResponsiveLayout(orgLayout\n/*: Layout*/\n, layouts\n/*: ResponsiveLayout*/\n, breakpoints\n/*: Breakpoints*/\n, breakpoint\n/*: Breakpoint*/\n, lastBreakpoint\n/*: Breakpoint*/\n, cols\n/*: number*/\n, verticalCompact\n/*: boolean*/\n)\n/*: Layout*/\n{\n  // If it already exists, just return it.\n  if (layouts[breakpoint]) return Object(_utils__WEBPACK_IMPORTED_MODULE_4__[/* cloneLayout */ \"b\"])(layouts[breakpoint]); // Find or generate the next layout\n\n  var layout = orgLayout;\n  var breakpointsSorted = sortBreakpoints(breakpoints);\n  var breakpointsAbove = breakpointsSorted.slice(breakpointsSorted.indexOf(breakpoint));\n\n  for (var i = 0, len = breakpointsAbove.length; i < len; i++) {\n    var b = breakpointsAbove[i];\n\n    if (layouts[b]) {\n      layout = layouts[b];\n      break;\n    }\n  }\n\n  layout = Object(_utils__WEBPACK_IMPORTED_MODULE_4__[/* cloneLayout */ \"b\"])(layout || []); // clone layout so we don't modify existing items\n\n  return Object(_utils__WEBPACK_IMPORTED_MODULE_4__[/* compact */ \"c\"])(Object(_utils__WEBPACK_IMPORTED_MODULE_4__[/* correctBounds */ \"d\"])(layout, {\n    cols: cols\n  }), verticalCompact);\n}\nfunction generateResponsiveLayout(layout\n/*: Layout*/\n, breakpoints\n/*: Breakpoints*/\n, breakpoint\n/*: Breakpoint*/\n, lastBreakpoint\n/*: Breakpoint*/\n, cols\n/*: number*/\n, verticalCompact\n/*: boolean*/\n)\n/*: Layout*/\n{\n  // If it already exists, just return it.\n\n  /*if (layouts[breakpoint]) return cloneLayout(layouts[breakpoint]);\n  // Find or generate the next layout\n  let layout = layouts[lastBreakpoint];*/\n\n  /*const breakpointsSorted = sortBreakpoints(breakpoints);\n  const breakpointsAbove = breakpointsSorted.slice(breakpointsSorted.indexOf(breakpoint));\n  for (let i = 0, len = breakpointsAbove.length; i < len; i++) {\n  const b = breakpointsAbove[i];\n  if (layouts[b]) {\n    layout = layouts[b];\n    break;\n  }\n  }*/\n  layout = Object(_utils__WEBPACK_IMPORTED_MODULE_4__[/* cloneLayout */ \"b\"])(layout || []); // clone layout so we don't modify existing items\n\n  return Object(_utils__WEBPACK_IMPORTED_MODULE_4__[/* compact */ \"c\"])(Object(_utils__WEBPACK_IMPORTED_MODULE_4__[/* correctBounds */ \"d\"])(layout, {\n    cols: cols\n  }), verticalCompact);\n}\n/**\n * Given breakpoints, return an array of breakpoints sorted by width. This is usually\n * e.g. ['xxs', 'xs', 'sm', ...]\n *\n * @param  {Object} breakpoints Key/value pair of breakpoint names to widths.\n * @return {Array}              Sorted breakpoints.\n */\n\nfunction sortBreakpoints(breakpoints\n/*: Breakpoints*/\n)\n/*: Array<Breakpoint>*/\n{\n  var keys\n  /*: Array<string>*/\n  = Object.keys(breakpoints);\n  return keys.sort(function (a, b) {\n    return breakpoints[a] - breakpoints[b];\n  });\n}\n\n/***/ }),\n\n/***/ \"990b\":\n/***/ (function(module, exports, __webpack_require__) {\n\n// all object keys, includes non-enumerable and symbols\nvar gOPN = __webpack_require__(\"9093\");\nvar gOPS = __webpack_require__(\"2621\");\nvar anObject = __webpack_require__(\"cb7c\");\nvar Reflect = __webpack_require__(\"7726\").Reflect;\nmodule.exports = Reflect && Reflect.ownKeys || function ownKeys(it) {\n  var keys = gOPN.f(anObject(it));\n  var getSymbols = gOPS.f;\n  return getSymbols ? keys.concat(getSymbols(it)) : keys;\n};\n\n\n/***/ }),\n\n/***/ \"9b43\":\n/***/ (function(module, exports, __webpack_require__) {\n\n// optional / simple context binding\nvar aFunction = __webpack_require__(\"d8e8\");\nmodule.exports = function (fn, that, length) {\n  aFunction(fn);\n  if (that === undefined) return fn;\n  switch (length) {\n    case 1: return function (a) {\n      return fn.call(that, a);\n    };\n    case 2: return function (a, b) {\n      return fn.call(that, a, b);\n    };\n    case 3: return function (a, b, c) {\n      return fn.call(that, a, b, c);\n    };\n  }\n  return function (/* ...args */) {\n    return fn.apply(that, arguments);\n  };\n};\n\n\n/***/ }),\n\n/***/ \"9c6c\":\n/***/ (function(module, exports, __webpack_require__) {\n\n// 22.1.3.31 Array.prototype[@@unscopables]\nvar UNSCOPABLES = __webpack_require__(\"2b4c\")('unscopables');\nvar ArrayProto = Array.prototype;\nif (ArrayProto[UNSCOPABLES] == undefined) __webpack_require__(\"32e9\")(ArrayProto, UNSCOPABLES, {});\nmodule.exports = function (key) {\n  ArrayProto[UNSCOPABLES][key] = true;\n};\n\n\n/***/ }),\n\n/***/ \"9cbe\":\n/***/ (function(module, exports, __webpack_require__) {\n\nexports = module.exports = __webpack_require__(\"2350\")(false);\n// imports\n\n\n// module\nexports.push([module.i, \".vue-grid-item{-webkit-transition:all .2s ease;transition:all .2s ease;-webkit-transition-property:left,top,right;transition-property:left,top,right}.vue-grid-item.no-touch{-ms-touch-action:none;touch-action:none}.vue-grid-item.cssTransforms{-webkit-transition-property:-webkit-transform;transition-property:-webkit-transform;transition-property:transform;transition-property:transform,-webkit-transform;left:0;right:auto}.vue-grid-item.cssTransforms.render-rtl{left:auto;right:0}.vue-grid-item.resizing{opacity:.6;z-index:3}.vue-grid-item.vue-draggable-dragging{-webkit-transition:none;transition:none;z-index:3}.vue-grid-item.vue-grid-placeholder{background:red;opacity:.2;-webkit-transition-duration:.1s;transition-duration:.1s;z-index:2;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;user-select:none}.vue-grid-item>.vue-resizable-handle{position:absolute;width:20px;height:20px;bottom:0;right:0;background:url(\\\"data:image/svg+xml;base64,PHN2ZyBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjojZmZmZmZmMDAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjYiIGhlaWdodD0iNiI+PHBhdGggZD0iTTYgNkgwVjQuMmg0LjJWMEg2djZ6IiBvcGFjaXR5PSIuMzAyIi8+PC9zdmc+\\\");background-position:100% 100%;padding:0 3px 3px 0;background-repeat:no-repeat;background-origin:content-box;-webkit-box-sizing:border-box;box-sizing:border-box;cursor:se-resize}.vue-grid-item>.vue-rtl-resizable-handle{bottom:0;left:0;background:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAiIGhlaWdodD0iMTAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZmlsbD0ibm9uZSIgZD0iTS0xLTFoMTJ2MTJILTF6Ii8+PGc+PHBhdGggc3Ryb2tlLWxpbmVjYXA9InVuZGVmaW5lZCIgc3Ryb2tlLWxpbmVqb2luPSJ1bmRlZmluZWQiIHN0cm9rZS13aWR0aD0iMS41IiBzdHJva2U9IiMwMDAiIGZpbGw9Im5vbmUiIGQ9Ik0xNDQuODIxLTM4LjM5M2wtMjAuMzU3LTMxLjc4NSIvPjxwYXRoIHN0cm9rZT0iIzY2NiIgc3Ryb2tlLWxpbmVjYXA9InVuZGVmaW5lZCIgc3Ryb2tlLWxpbmVqb2luPSJ1bmRlZmluZWQiIHN0cm9rZS13aWR0aD0iMiIgZmlsbD0ibm9uZSIgZD0iTS45NDctLjAxOHY5LjEyNU0tLjY1NiA5aDEwLjczIi8+PC9nPjwvc3ZnPg==);background-position:0 100%;padding-left:3px;background-repeat:no-repeat;background-origin:content-box;cursor:sw-resize;right:auto}.vue-grid-item.disable-userselect{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}\", \"\"]);\n\n// exports\n\n\n/***/ }),\n\n/***/ \"9def\":\n/***/ (function(module, exports, __webpack_require__) {\n\n// 7.1.15 ToLength\nvar toInteger = __webpack_require__(\"4588\");\nvar min = Math.min;\nmodule.exports = function (it) {\n  return it > 0 ? min(toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991\n};\n\n\n/***/ }),\n\n/***/ \"9e1e\":\n/***/ (function(module, exports, __webpack_require__) {\n\n// Thank's IE8 for his funny defineProperty\nmodule.exports = !__webpack_require__(\"79e5\")(function () {\n  return Object.defineProperty({}, 'a', { get: function () { return 7; } }).a != 7;\n});\n\n\n/***/ }),\n\n/***/ \"a2b6\":\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return bottom; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return cloneLayout; });\n/* unused harmony export cloneLayoutItem */\n/* unused harmony export collides */\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"c\", function() { return compact; });\n/* unused harmony export compactItem */\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"d\", function() { return correctBounds; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"f\", function() { return getLayoutItem; });\n/* unused harmony export getFirstCollision */\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"e\", function() { return getAllCollisions; });\n/* unused harmony export getStatics */\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"g\", function() { return moveElement; });\n/* unused harmony export moveElementAwayFromCollision */\n/* unused harmony export perc */\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"j\", function() { return setTransform; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"k\", function() { return setTransformRtl; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"h\", function() { return setTopLeft; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"i\", function() { return setTopRight; });\n/* unused harmony export sortLayoutItemsByRowCol */\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"l\", function() { return validateLayout; });\n/* unused harmony export autoBindHandlers */\n/* unused harmony export createMarkup */\n/* unused harmony export IS_UNITLESS */\n/* unused harmony export addPx */\n/* unused harmony export hyphenateRE */\n/* unused harmony export hyphenate */\n/* unused harmony export findItemInArray */\n/* unused harmony export findAndRemove */\n/* harmony import */ var core_js_modules_es6_regexp_replace__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(\"a481\");\n/* harmony import */ var core_js_modules_es6_regexp_replace__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es6_regexp_replace__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var core_js_modules_es6_array_iterator__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(\"cadf\");\n/* harmony import */ var core_js_modules_es6_array_iterator__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es6_array_iterator__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var core_js_modules_es6_object_keys__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(\"456d\");\n/* harmony import */ var core_js_modules_es6_object_keys__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es6_object_keys__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var core_js_modules_web_dom_iterable__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(\"ac6a\");\n/* harmony import */ var core_js_modules_web_dom_iterable__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_web_dom_iterable__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var core_js_modules_es6_array_sort__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(\"55dd\");\n/* harmony import */ var core_js_modules_es6_array_sort__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es6_array_sort__WEBPACK_IMPORTED_MODULE_4__);\n\n\n\n\n\n// @flow\n\n/*:: export type LayoutItemRequired = {w: number, h: number, x: number, y: number, i: string};*/\n\n/*:: export type LayoutItem = LayoutItemRequired &\n                         {minW?: number, minH?: number, maxW?: number, maxH?: number,\n                          moved?: boolean, static?: boolean,\n                          isDraggable?: ?boolean, isResizable?: ?boolean};*/\n\n// export type Position = {left: number, top: number, width: number, height: number};\n\n/*\nexport type DragCallbackData = {\n  node: HTMLElement,\n  x: number, y: number,\n  deltaX: number, deltaY: number,\n  lastX: number, lastY: number\n};\n*/\n// export type DragEvent = {e: Event} & DragCallbackData;\n\n/*:: export type Layout = Array<LayoutItem>;*/\n\n// export type ResizeEvent = {e: Event, node: HTMLElement, size: Size};\n// const isProduction = process.env.NODE_ENV === 'production';\n\n/**\n * Return the bottom coordinate of the layout.\n *\n * @param  {Array} layout Layout array.\n * @return {Number}       Bottom coordinate.\n */\n\n/*:: export type Size = {width: number, height: number};*/\n\nfunction bottom(layout\n/*: Layout*/\n)\n/*: number*/\n{\n  var max = 0,\n      bottomY;\n\n  for (var i = 0, len = layout.length; i < len; i++) {\n    bottomY = layout[i].y + layout[i].h;\n    if (bottomY > max) max = bottomY;\n  }\n\n  return max;\n}\nfunction cloneLayout(layout\n/*: Layout*/\n)\n/*: Layout*/\n{\n  var newLayout = Array(layout.length);\n\n  for (var i = 0, len = layout.length; i < len; i++) {\n    newLayout[i] = cloneLayoutItem(layout[i]);\n  }\n\n  return newLayout;\n} // Fast path to cloning, since this is monomorphic\n\nfunction cloneLayoutItem(layoutItem\n/*: LayoutItem*/\n)\n/*: LayoutItem*/\n{\n  /*return {\n    w: layoutItem.w, h: layoutItem.h, x: layoutItem.x, y: layoutItem.y, i: layoutItem.i,\n    minW: layoutItem.minW, maxW: layoutItem.maxW, minH: layoutItem.minH, maxH: layoutItem.maxH,\n    moved: Boolean(layoutItem.moved), static: Boolean(layoutItem.static),\n    // These can be null\n    isDraggable: layoutItem.isDraggable, isResizable: layoutItem.isResizable\n  };*/\n  return JSON.parse(JSON.stringify(layoutItem));\n}\n/**\n * Given two layoutitems, check if they collide.\n *\n * @return {Boolean}   True if colliding.\n */\n\nfunction collides(l1\n/*: LayoutItem*/\n, l2\n/*: LayoutItem*/\n)\n/*: boolean*/\n{\n  if (l1 === l2) return false; // same element\n\n  if (l1.x + l1.w <= l2.x) return false; // l1 is left of l2\n\n  if (l1.x >= l2.x + l2.w) return false; // l1 is right of l2\n\n  if (l1.y + l1.h <= l2.y) return false; // l1 is above l2\n\n  if (l1.y >= l2.y + l2.h) return false; // l1 is below l2\n\n  return true; // boxes overlap\n}\n/**\n * Given a layout, compact it. This involves going down each y coordinate and removing gaps\n * between items.\n *\n * @param  {Array} layout Layout.\n * @param  {Boolean} verticalCompact Whether or not to compact the layout\n *   vertically.\n * @param {Object} minPositions\n * @return {Array}       Compacted Layout.\n */\n\nfunction compact(layout\n/*: Layout*/\n, verticalCompact\n/*: Boolean*/\n, minPositions)\n/*: Layout*/\n{\n  // Statics go in the compareWith array right away so items flow around them.\n  var compareWith = getStatics(layout); // We go through the items by row and column.\n\n  var sorted = sortLayoutItemsByRowCol(layout); // Holding for new items.\n\n  var out = Array(layout.length);\n\n  for (var i = 0, len = sorted.length; i < len; i++) {\n    var l = sorted[i]; // Don't move static elements\n\n    if (!l.static) {\n      l = compactItem(compareWith, l, verticalCompact, minPositions); // Add to comparison array. We only collide with items before this one.\n      // Statics are already in this array.\n\n      compareWith.push(l);\n    } // Add to output array to make sure they still come out in the right order.\n\n\n    out[layout.indexOf(l)] = l; // Clear moved flag, if it exists.\n\n    l.moved = false;\n  }\n\n  return out;\n}\n/**\n * Compact an item in the layout.\n */\n\nfunction compactItem(compareWith\n/*: Layout*/\n, l\n/*: LayoutItem*/\n, verticalCompact\n/*: boolean*/\n, minPositions)\n/*: LayoutItem*/\n{\n  if (verticalCompact) {\n    // Move the element up as far as it can go without colliding.\n    while (l.y > 0 && !getFirstCollision(compareWith, l)) {\n      l.y--;\n    }\n  } else if (minPositions) {\n    var minY = minPositions[l.i].y;\n\n    while (l.y > minY && !getFirstCollision(compareWith, l)) {\n      l.y--;\n    }\n  } // Move it down, and keep moving it down if it's colliding.\n\n\n  var collides;\n\n  while (collides = getFirstCollision(compareWith, l)) {\n    l.y = collides.y + collides.h;\n  }\n\n  return l;\n}\n/**\n * Given a layout, make sure all elements fit within its bounds.\n *\n * @param  {Array} layout Layout array.\n * @param  {Number} bounds Number of columns.\n */\n\nfunction correctBounds(layout\n/*: Layout*/\n, bounds\n/*: {cols: number}*/\n)\n/*: Layout*/\n{\n  var collidesWith = getStatics(layout);\n\n  for (var i = 0, len = layout.length; i < len; i++) {\n    var l = layout[i]; // Overflows right\n\n    if (l.x + l.w > bounds.cols) l.x = bounds.cols - l.w; // Overflows left\n\n    if (l.x < 0) {\n      l.x = 0;\n      l.w = bounds.cols;\n    }\n\n    if (!l.static) collidesWith.push(l);else {\n      // If this is static and collides with other statics, we must move it down.\n      // We have to do something nicer than just letting them overlap.\n      while (getFirstCollision(collidesWith, l)) {\n        l.y++;\n      }\n    }\n  }\n\n  return layout;\n}\n/**\n * Get a layout item by ID. Used so we can override later on if necessary.\n *\n * @param  {Array}  layout Layout array.\n * @param  {String} id     ID\n * @return {LayoutItem}    Item at ID.\n */\n\nfunction getLayoutItem(layout\n/*: Layout*/\n, id\n/*: string*/\n)\n/*: ?LayoutItem*/\n{\n  for (var i = 0, len = layout.length; i < len; i++) {\n    if (layout[i].i === id) return layout[i];\n  }\n}\n/**\n * Returns the first item this layout collides with.\n * It doesn't appear to matter which order we approach this from, although\n * perhaps that is the wrong thing to do.\n *\n * @param  {Object} layoutItem Layout item.\n * @return {Object|undefined}  A colliding layout item, or undefined.\n */\n\nfunction getFirstCollision(layout\n/*: Layout*/\n, layoutItem\n/*: LayoutItem*/\n)\n/*: ?LayoutItem*/\n{\n  for (var i = 0, len = layout.length; i < len; i++) {\n    if (collides(layout[i], layoutItem)) return layout[i];\n  }\n}\nfunction getAllCollisions(layout\n/*: Layout*/\n, layoutItem\n/*: LayoutItem*/\n)\n/*: Array<LayoutItem>*/\n{\n  return layout.filter(function (l) {\n    return collides(l, layoutItem);\n  });\n}\n/**\n * Get all static elements.\n * @param  {Array} layout Array of layout objects.\n * @return {Array}        Array of static layout items..\n */\n\nfunction getStatics(layout\n/*: Layout*/\n)\n/*: Array<LayoutItem>*/\n{\n  //return [];\n  return layout.filter(function (l) {\n    return l.static;\n  });\n}\n/**\n * Move an element. Responsible for doing cascading movements of other elements.\n *\n * @param  {Array}      layout Full layout to modify.\n * @param  {LayoutItem} l      element to move.\n * @param  {Number}     [x]    X position in grid units.\n * @param  {Number}     [y]    Y position in grid units.\n * @param  {Boolean}    [isUserAction] If true, designates that the item we're moving is\n *                                     being dragged/resized by th euser.\n */\n\nfunction moveElement(layout\n/*: Layout*/\n, l\n/*: LayoutItem*/\n, x\n/*: Number*/\n, y\n/*: Number*/\n, isUserAction\n/*: Boolean*/\n, preventCollision\n/*: Boolean*/\n)\n/*: Layout*/\n{\n  if (l.static) return layout; // Short-circuit if nothing to do.\n  //if (l.y === y && l.x === x) return layout;\n\n  var oldX = l.x;\n  var oldY = l.y;\n  var movingUp = y && l.y > y; // This is quite a bit faster than extending the object\n\n  if (typeof x === 'number') l.x = x;\n  if (typeof y === 'number') l.y = y;\n  l.moved = true; // If this collides with anything, move it.\n  // When doing this comparison, we have to sort the items we compare with\n  // to ensure, in the case of multiple collisions, that we're getting the\n  // nearest collision.\n\n  var sorted = sortLayoutItemsByRowCol(layout);\n  if (movingUp) sorted = sorted.reverse();\n  var collisions = getAllCollisions(sorted, l);\n\n  if (preventCollision && collisions.length) {\n    l.x = oldX;\n    l.y = oldY;\n    l.moved = false;\n    return layout;\n  } // Move each item that collides away from this element.\n\n\n  for (var i = 0, len = collisions.length; i < len; i++) {\n    var collision = collisions[i]; // console.log('resolving collision between', l.i, 'at', l.y, 'and', collision.i, 'at', collision.y);\n    // Short circuit so we can't infinite loop\n\n    if (collision.moved) continue; // This makes it feel a bit more precise by waiting to swap for just a bit when moving up.\n\n    if (l.y > collision.y && l.y - collision.y > collision.h / 4) continue; // Don't move static items - we have to move *this* element away\n\n    if (collision.static) {\n      layout = moveElementAwayFromCollision(layout, collision, l, isUserAction);\n    } else {\n      layout = moveElementAwayFromCollision(layout, l, collision, isUserAction);\n    }\n  }\n\n  return layout;\n}\n/**\n * This is where the magic needs to happen - given a collision, move an element away from the collision.\n * We attempt to move it up if there's room, otherwise it goes below.\n *\n * @param  {Array} layout            Full layout to modify.\n * @param  {LayoutItem} collidesWith Layout item we're colliding with.\n * @param  {LayoutItem} itemToMove   Layout item we're moving.\n * @param  {Boolean} [isUserAction]  If true, designates that the item we're moving is being dragged/resized\n *                                   by the user.\n */\n\nfunction moveElementAwayFromCollision(layout\n/*: Layout*/\n, collidesWith\n/*: LayoutItem*/\n, itemToMove\n/*: LayoutItem*/\n, isUserAction\n/*: ?boolean*/\n)\n/*: Layout*/\n{\n  var preventCollision = false; // we're already colliding\n  // If there is enough space above the collision to put this element, move it there.\n  // We only do this on the main collision as this can get funky in cascades and cause\n  // unwanted swapping behavior.\n\n  if (isUserAction) {\n    // Make a mock item so we don't modify the item here, only modify in moveElement.\n    var fakeItem\n    /*: LayoutItem*/\n    = {\n      x: itemToMove.x,\n      y: itemToMove.y,\n      w: itemToMove.w,\n      h: itemToMove.h,\n      i: '-1'\n    };\n    fakeItem.y = Math.max(collidesWith.y - itemToMove.h, 0);\n\n    if (!getFirstCollision(layout, fakeItem)) {\n      return moveElement(layout, itemToMove, undefined, fakeItem.y, preventCollision);\n    }\n  } // Previously this was optimized to move below the collision directly, but this can cause problems\n  // with cascading moves, as an item may actually leapflog a collision and cause a reversal in order.\n\n\n  return moveElement(layout, itemToMove, undefined, itemToMove.y + 1, preventCollision);\n}\n/**\n * Helper to convert a number to a percentage string.\n *\n * @param  {Number} num Any number\n * @return {String}     That number as a percentage.\n */\n\nfunction perc(num\n/*: number*/\n)\n/*: string*/\n{\n  return num * 100 + '%';\n}\nfunction setTransform(top, left, width, height)\n/*: Object*/\n{\n  // Replace unitless items with px\n  var translate = \"translate3d(\" + left + \"px,\" + top + \"px, 0)\";\n  return {\n    transform: translate,\n    WebkitTransform: translate,\n    MozTransform: translate,\n    msTransform: translate,\n    OTransform: translate,\n    width: width + \"px\",\n    height: height + \"px\",\n    position: 'absolute'\n  };\n}\n/**\n * Just like the setTransform method, but instead it will return a negative value of right.\n *\n * @param top\n * @param right\n * @param width\n * @param height\n * @returns {{transform: string, WebkitTransform: string, MozTransform: string, msTransform: string, OTransform: string, width: string, height: string, position: string}}\n */\n\nfunction setTransformRtl(top, right, width, height)\n/*: Object*/\n{\n  // Replace unitless items with px\n  var translate = \"translate3d(\" + right * -1 + \"px,\" + top + \"px, 0)\";\n  return {\n    transform: translate,\n    WebkitTransform: translate,\n    MozTransform: translate,\n    msTransform: translate,\n    OTransform: translate,\n    width: width + \"px\",\n    height: height + \"px\",\n    position: 'absolute'\n  };\n}\nfunction setTopLeft(top, left, width, height)\n/*: Object*/\n{\n  return {\n    top: top + \"px\",\n    left: left + \"px\",\n    width: width + \"px\",\n    height: height + \"px\",\n    position: 'absolute'\n  };\n}\n/**\n * Just like the setTopLeft method, but instead, it will return a right property instead of left.\n *\n * @param top\n * @param right\n * @param width\n * @param height\n * @returns {{top: string, right: string, width: string, height: string, position: string}}\n */\n\nfunction setTopRight(top, right, width, height)\n/*: Object*/\n{\n  return {\n    top: top + \"px\",\n    right: right + \"px\",\n    width: width + \"px\",\n    height: height + \"px\",\n    position: 'absolute'\n  };\n}\n/**\n * Get layout items sorted from top left to right and down.\n *\n * @return {Array} Array of layout objects.\n * @return {Array}        Layout, sorted static items first.\n */\n\nfunction sortLayoutItemsByRowCol(layout\n/*: Layout*/\n)\n/*: Layout*/\n{\n  return [].concat(layout).sort(function (a, b) {\n    if (a.y === b.y && a.x === b.x) {\n      return 0;\n    }\n\n    if (a.y > b.y || a.y === b.y && a.x > b.x) {\n      return 1;\n    }\n\n    return -1;\n  });\n}\n/**\n * Generate a layout using the initialLayout and children as a template.\n * Missing entries will be added, extraneous ones will be truncated.\n *\n * @param  {Array}  initialLayout Layout passed in through props.\n * @param  {String} breakpoint    Current responsive breakpoint.\n * @param  {Boolean} verticalCompact Whether or not to compact the layout vertically.\n * @return {Array}                Working layout.\n */\n\n/*\nexport function synchronizeLayoutWithChildren(initialLayout: Layout, children: Array<React.Element>|React.Element,\n                                              cols: number, verticalCompact: boolean): Layout {\n  // ensure 'children' is always an array\n  if (!Array.isArray(children)) {\n    children = [children];\n  }\n  initialLayout = initialLayout || [];\n\n  // Generate one layout item per child.\n  let layout: Layout = [];\n  for (let i = 0, len = children.length; i < len; i++) {\n    let newItem;\n    const child = children[i];\n\n    // Don't overwrite if it already exists.\n    const exists = getLayoutItem(initialLayout, child.key || \"1\" /!* FIXME satisfies Flow *!/);\n    if (exists) {\n      newItem = exists;\n    } else {\n      const g = child.props._grid;\n\n      // Hey, this item has a _grid property, use it.\n      if (g) {\n        if (!isProduction) {\n          validateLayout([g], 'ReactGridLayout.children');\n        }\n        // Validated; add it to the layout. Bottom 'y' possible is the bottom of the layout.\n        // This allows you to do nice stuff like specify {y: Infinity}\n        if (verticalCompact) {\n          newItem = cloneLayoutItem({...g, y: Math.min(bottom(layout), g.y), i: child.key});\n        } else {\n          newItem = cloneLayoutItem({...g, y: g.y, i: child.key});\n        }\n      }\n      // Nothing provided: ensure this is added to the bottom\n      else {\n        newItem = cloneLayoutItem({w: 1, h: 1, x: 0, y: bottom(layout), i: child.key || \"1\"});\n      }\n    }\n    layout[i] = newItem;\n  }\n\n  // Correct the layout.\n  layout = correctBounds(layout, {cols: cols});\n  layout = compact(layout, verticalCompact);\n\n  return layout;\n}\n*/\n\n/**\n * Validate a layout. Throws errors.\n *\n * @param  {Array}  layout        Array of layout items.\n * @param  {String} [contextName] Context name for errors.\n * @throw  {Error}                Validation error.\n */\n\nfunction validateLayout(layout\n/*: Layout*/\n, contextName\n/*: string*/\n)\n/*: void*/\n{\n  contextName = contextName || \"Layout\";\n  var subProps = ['x', 'y', 'w', 'h'];\n  var keyArr = [];\n  if (!Array.isArray(layout)) throw new Error(contextName + \" must be an array!\");\n\n  for (var i = 0, len = layout.length; i < len; i++) {\n    var item = layout[i];\n\n    for (var j = 0; j < subProps.length; j++) {\n      if (typeof item[subProps[j]] !== 'number') {\n        throw new Error('VueGridLayout: ' + contextName + '[' + i + '].' + subProps[j] + ' must be a number!');\n      }\n    }\n\n    if (item.i === undefined || item.i === null) {\n      throw new Error('VueGridLayout: ' + contextName + '[' + i + '].i cannot be null!');\n    }\n\n    if (typeof item.i !== 'number' && typeof item.i !== 'string') {\n      throw new Error('VueGridLayout: ' + contextName + '[' + i + '].i must be a string or number!');\n    }\n\n    if (keyArr.indexOf(item.i) >= 0) {\n      throw new Error('VueGridLayout: ' + contextName + '[' + i + '].i must be unique!');\n    }\n\n    keyArr.push(item.i);\n\n    if (item.static !== undefined && typeof item.static !== 'boolean') {\n      throw new Error('VueGridLayout: ' + contextName + '[' + i + '].static must be a boolean!');\n    }\n  }\n} // Flow can't really figure this out, so we just use Object\n\nfunction autoBindHandlers(el\n/*: Object*/\n, fns\n/*: Array<string>*/\n)\n/*: void*/\n{\n  fns.forEach(function (key) {\n    return el[key] = el[key].bind(el);\n  });\n}\n/**\n * Convert a JS object to CSS string. Similar to React's output of CSS.\n * @param obj\n * @returns {string}\n */\n\nfunction createMarkup(obj) {\n  var keys = Object.keys(obj);\n  if (!keys.length) return '';\n  var i,\n      len = keys.length;\n  var result = '';\n\n  for (i = 0; i < len; i++) {\n    var key = keys[i];\n    var val = obj[key];\n    result += hyphenate(key) + ':' + addPx(key, val) + ';';\n  }\n\n  return result;\n}\n/* The following list is defined in React's core */\n\nvar IS_UNITLESS = {\n  animationIterationCount: true,\n  boxFlex: true,\n  boxFlexGroup: true,\n  boxOrdinalGroup: true,\n  columnCount: true,\n  flex: true,\n  flexGrow: true,\n  flexPositive: true,\n  flexShrink: true,\n  flexNegative: true,\n  flexOrder: true,\n  gridRow: true,\n  gridColumn: true,\n  fontWeight: true,\n  lineClamp: true,\n  lineHeight: true,\n  opacity: true,\n  order: true,\n  orphans: true,\n  tabSize: true,\n  widows: true,\n  zIndex: true,\n  zoom: true,\n  // SVG-related properties\n  fillOpacity: true,\n  stopOpacity: true,\n  strokeDashoffset: true,\n  strokeOpacity: true,\n  strokeWidth: true\n};\n/**\n * Will add px to the end of style values which are Numbers.\n * @param name\n * @param value\n * @returns {*}\n */\n\nfunction addPx(name, value) {\n  if (typeof value === 'number' && !IS_UNITLESS[name]) {\n    return value + 'px';\n  } else {\n    return value;\n  }\n}\n/**\n * Hyphenate a camelCase string.\n *\n * @param {String} str\n * @return {String}\n */\n\nvar hyphenateRE = /([a-z\\d])([A-Z])/g;\nfunction hyphenate(str) {\n  return str.replace(hyphenateRE, '$1-$2').toLowerCase();\n}\nfunction findItemInArray(array, property, value) {\n  for (var i = 0; i < array.length; i++) {\n    if (array[i][property] == value) return true;\n  }\n\n  return false;\n}\nfunction findAndRemove(array, property, value) {\n  array.forEach(function (result, index) {\n    if (result[property] === value) {\n      //Remove from array\n      array.splice(index, 1);\n    }\n  });\n}\n\n/***/ }),\n\n/***/ \"a481\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar anObject = __webpack_require__(\"cb7c\");\nvar toObject = __webpack_require__(\"4bf8\");\nvar toLength = __webpack_require__(\"9def\");\nvar toInteger = __webpack_require__(\"4588\");\nvar advanceStringIndex = __webpack_require__(\"0390\");\nvar regExpExec = __webpack_require__(\"5f1b\");\nvar max = Math.max;\nvar min = Math.min;\nvar floor = Math.floor;\nvar SUBSTITUTION_SYMBOLS = /\\$([$&`']|\\d\\d?|<[^>]*>)/g;\nvar SUBSTITUTION_SYMBOLS_NO_NAMED = /\\$([$&`']|\\d\\d?)/g;\n\nvar maybeToString = function (it) {\n  return it === undefined ? it : String(it);\n};\n\n// @@replace logic\n__webpack_require__(\"214f\")('replace', 2, function (defined, REPLACE, $replace, maybeCallNative) {\n  return [\n    // `String.prototype.replace` method\n    // https://tc39.github.io/ecma262/#sec-string.prototype.replace\n    function replace(searchValue, replaceValue) {\n      var O = defined(this);\n      var fn = searchValue == undefined ? undefined : searchValue[REPLACE];\n      return fn !== undefined\n        ? fn.call(searchValue, O, replaceValue)\n        : $replace.call(String(O), searchValue, replaceValue);\n    },\n    // `RegExp.prototype[@@replace]` method\n    // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@replace\n    function (regexp, replaceValue) {\n      var res = maybeCallNative($replace, regexp, this, replaceValue);\n      if (res.done) return res.value;\n\n      var rx = anObject(regexp);\n      var S = String(this);\n      var functionalReplace = typeof replaceValue === 'function';\n      if (!functionalReplace) replaceValue = String(replaceValue);\n      var global = rx.global;\n      if (global) {\n        var fullUnicode = rx.unicode;\n        rx.lastIndex = 0;\n      }\n      var results = [];\n      while (true) {\n        var result = regExpExec(rx, S);\n        if (result === null) break;\n        results.push(result);\n        if (!global) break;\n        var matchStr = String(result[0]);\n        if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode);\n      }\n      var accumulatedResult = '';\n      var nextSourcePosition = 0;\n      for (var i = 0; i < results.length; i++) {\n        result = results[i];\n        var matched = String(result[0]);\n        var position = max(min(toInteger(result.index), S.length), 0);\n        var captures = [];\n        // NOTE: This is equivalent to\n        //   captures = result.slice(1).map(maybeToString)\n        // but for some reason `nativeSlice.call(result, 1, result.length)` (called in\n        // the slice polyfill when slicing native arrays) \"doesn't work\" in safari 9 and\n        // causes a crash (https://pastebin.com/N21QzeQA) when trying to debug it.\n        for (var j = 1; j < result.length; j++) captures.push(maybeToString(result[j]));\n        var namedCaptures = result.groups;\n        if (functionalReplace) {\n          var replacerArgs = [matched].concat(captures, position, S);\n          if (namedCaptures !== undefined) replacerArgs.push(namedCaptures);\n          var replacement = String(replaceValue.apply(undefined, replacerArgs));\n        } else {\n          replacement = getSubstitution(matched, S, position, captures, namedCaptures, replaceValue);\n        }\n        if (position >= nextSourcePosition) {\n          accumulatedResult += S.slice(nextSourcePosition, position) + replacement;\n          nextSourcePosition = position + matched.length;\n        }\n      }\n      return accumulatedResult + S.slice(nextSourcePosition);\n    }\n  ];\n\n    // https://tc39.github.io/ecma262/#sec-getsubstitution\n  function getSubstitution(matched, str, position, captures, namedCaptures, replacement) {\n    var tailPos = position + matched.length;\n    var m = captures.length;\n    var symbols = SUBSTITUTION_SYMBOLS_NO_NAMED;\n    if (namedCaptures !== undefined) {\n      namedCaptures = toObject(namedCaptures);\n      symbols = SUBSTITUTION_SYMBOLS;\n    }\n    return $replace.call(replacement, symbols, function (match, ch) {\n      var capture;\n      switch (ch.charAt(0)) {\n        case '$': return '$';\n        case '&': return matched;\n        case '`': return str.slice(0, position);\n        case \"'\": return str.slice(tailPos);\n        case '<':\n          capture = namedCaptures[ch.slice(1, -1)];\n          break;\n        default: // \\d\\d?\n          var n = +ch;\n          if (n === 0) return match;\n          if (n > m) {\n            var f = floor(n / 10);\n            if (f === 0) return match;\n            if (f <= m) return captures[f - 1] === undefined ? ch.charAt(1) : captures[f - 1] + ch.charAt(1);\n            return match;\n          }\n          capture = captures[n - 1];\n      }\n      return capture === undefined ? '' : capture;\n    });\n  }\n});\n\n\n/***/ }),\n\n/***/ \"aa77\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar $export = __webpack_require__(\"5ca1\");\nvar defined = __webpack_require__(\"be13\");\nvar fails = __webpack_require__(\"79e5\");\nvar spaces = __webpack_require__(\"fdef\");\nvar space = '[' + spaces + ']';\nvar non = '\\u200b\\u0085';\nvar ltrim = RegExp('^' + space + space + '*');\nvar rtrim = RegExp(space + space + '*$');\n\nvar exporter = function (KEY, exec, ALIAS) {\n  var exp = {};\n  var FORCE = fails(function () {\n    return !!spaces[KEY]() || non[KEY]() != non;\n  });\n  var fn = exp[KEY] = FORCE ? exec(trim) : spaces[KEY];\n  if (ALIAS) exp[ALIAS] = fn;\n  $export($export.P + $export.F * FORCE, 'String', exp);\n};\n\n// 1 -> String#trimLeft\n// 2 -> String#trimRight\n// 3 -> String#trim\nvar trim = exporter.trim = function (string, TYPE) {\n  string = String(defined(string));\n  if (TYPE & 1) string = string.replace(ltrim, '');\n  if (TYPE & 2) string = string.replace(rtrim, '');\n  return string;\n};\n\nmodule.exports = exporter;\n\n\n/***/ }),\n\n/***/ \"abb4\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\n/* global console: false */\n\n/**\n * Reporter that handles the reporting of logs, warnings and errors.\n * @public\n * @param {boolean} quiet Tells if the reporter should be quiet or not.\n */\nmodule.exports = function(quiet) {\n    function noop() {\n        //Does nothing.\n    }\n\n    var reporter = {\n        log: noop,\n        warn: noop,\n        error: noop\n    };\n\n    if(!quiet && window.console) {\n        var attachFunction = function(reporter, name) {\n            //The proxy is needed to be able to call the method with the console context,\n            //since we cannot use bind.\n            reporter[name] = function reporterProxy() {\n                var f = console[name];\n                if (f.apply) { //IE9 does not support console.log.apply :)\n                    f.apply(console, arguments);\n                } else {\n                    for (var i = 0; i < arguments.length; i++) {\n                        f(arguments[i]);\n                    }\n                }\n            };\n        };\n\n        attachFunction(reporter, \"log\");\n        attachFunction(reporter, \"warn\");\n        attachFunction(reporter, \"error\");\n    }\n\n    return reporter;\n};\n\n/***/ }),\n\n/***/ \"ac6a\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar $iterators = __webpack_require__(\"cadf\");\nvar getKeys = __webpack_require__(\"0d58\");\nvar redefine = __webpack_require__(\"2aba\");\nvar global = __webpack_require__(\"7726\");\nvar hide = __webpack_require__(\"32e9\");\nvar Iterators = __webpack_require__(\"84f2\");\nvar wks = __webpack_require__(\"2b4c\");\nvar ITERATOR = wks('iterator');\nvar TO_STRING_TAG = wks('toStringTag');\nvar ArrayValues = Iterators.Array;\n\nvar DOMIterables = {\n  CSSRuleList: true, // TODO: Not spec compliant, should be false.\n  CSSStyleDeclaration: false,\n  CSSValueList: false,\n  ClientRectList: false,\n  DOMRectList: false,\n  DOMStringList: false,\n  DOMTokenList: true,\n  DataTransferItemList: false,\n  FileList: false,\n  HTMLAllCollection: false,\n  HTMLCollection: false,\n  HTMLFormElement: false,\n  HTMLSelectElement: false,\n  MediaList: true, // TODO: Not spec compliant, should be false.\n  MimeTypeArray: false,\n  NamedNodeMap: false,\n  NodeList: true,\n  PaintRequestList: false,\n  Plugin: false,\n  PluginArray: false,\n  SVGLengthList: false,\n  SVGNumberList: false,\n  SVGPathSegList: false,\n  SVGPointList: false,\n  SVGStringList: false,\n  SVGTransformList: false,\n  SourceBufferList: false,\n  StyleSheetList: true, // TODO: Not spec compliant, should be false.\n  TextTrackCueList: false,\n  TextTrackList: false,\n  TouchList: false\n};\n\nfor (var collections = getKeys(DOMIterables), i = 0; i < collections.length; i++) {\n  var NAME = collections[i];\n  var explicit = DOMIterables[NAME];\n  var Collection = global[NAME];\n  var proto = Collection && Collection.prototype;\n  var key;\n  if (proto) {\n    if (!proto[ITERATOR]) hide(proto, ITERATOR, ArrayValues);\n    if (!proto[TO_STRING_TAG]) hide(proto, TO_STRING_TAG, NAME);\n    Iterators[NAME] = ArrayValues;\n    if (explicit) for (key in $iterators) if (!proto[key]) redefine(proto, key, $iterators[key], true);\n  }\n}\n\n\n/***/ }),\n\n/***/ \"ad20\":\n/***/ (function(module, exports, __webpack_require__) {\n\nexports = module.exports = __webpack_require__(\"2350\")(false);\n// imports\n\n\n// module\nexports.push([module.i, \".vue-grid-layout{position:relative;-webkit-transition:height .2s ease;transition:height .2s ease}\", \"\"]);\n\n// exports\n\n\n/***/ }),\n\n/***/ \"ade3\":\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return _defineProperty; });\nfunction _defineProperty(obj, key, value) {\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\n  return obj;\n}\n\n/***/ }),\n\n/***/ \"b0c5\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar regexpExec = __webpack_require__(\"520a\");\n__webpack_require__(\"5ca1\")({\n  target: 'RegExp',\n  proto: true,\n  forced: regexpExec !== /./.exec\n}, {\n  exec: regexpExec\n});\n\n\n/***/ }),\n\n/***/ \"b770\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar utils = module.exports = {};\n\n/**\n * Loops through the collection and calls the callback for each element. if the callback returns truthy, the loop is broken and returns the same value.\n * @public\n * @param {*} collection The collection to loop through. Needs to have a length property set and have indices set from 0 to length - 1.\n * @param {function} callback The callback to be called for each element. The element will be given as a parameter to the callback. If this callback returns truthy, the loop is broken and the same value is returned.\n * @returns {*} The value that a callback has returned (if truthy). Otherwise nothing.\n */\nutils.forEach = function(collection, callback) {\n    for(var i = 0; i < collection.length; i++) {\n        var result = callback(collection[i]);\n        if(result) {\n            return result;\n        }\n    }\n};\n\n\n/***/ }),\n\n/***/ \"bc21\":\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n\n// NAMESPACE OBJECT: ./node_modules/@interactjs/snappers/all.js\nvar all_namespaceObject = {};\n__webpack_require__.r(all_namespaceObject);\n__webpack_require__.d(all_namespaceObject, \"edgeTarget\", function() { return edgeTarget; });\n__webpack_require__.d(all_namespaceObject, \"elements\", function() { return snappers_elements; });\n__webpack_require__.d(all_namespaceObject, \"grid\", function() { return grid; });\n\n// CONCATENATED MODULE: ./node_modules/cache-loader/dist/cjs.js?{\"cacheDirectory\":\"node_modules/.cache/vue-loader\",\"cacheIdentifier\":\"1705dc22-vue-loader-template\"}!./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options!./src/components/GridItem.vue?vue&type=template&id=e7489122&\nvar render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{ref:\"item\",staticClass:\"vue-grid-item\",class:_vm.classObj,style:(_vm.style)},[_vm._t(\"default\"),(_vm.resizableAndNotStatic)?_c('span',{ref:\"handle\",class:_vm.resizableHandleClass}):_vm._e()],2)}\nvar staticRenderFns = []\n\n\n// CONCATENATED MODULE: ./src/components/GridItem.vue?vue&type=template&id=e7489122&\n\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es7.object.get-own-property-descriptors.js\nvar es7_object_get_own_property_descriptors = __webpack_require__(\"8e6e\");\n\n// EXTERNAL MODULE: ./node_modules/core-js/modules/web.dom.iterable.js\nvar web_dom_iterable = __webpack_require__(\"ac6a\");\n\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es6.array.iterator.js\nvar es6_array_iterator = __webpack_require__(\"cadf\");\n\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es6.object.keys.js\nvar es6_object_keys = __webpack_require__(\"456d\");\n\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es6.regexp.replace.js\nvar es6_regexp_replace = __webpack_require__(\"a481\");\n\n// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/esm/defineProperty.js\nvar defineProperty = __webpack_require__(\"ade3\");\n\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es6.number.is-finite.js\nvar es6_number_is_finite = __webpack_require__(\"fca0\");\n\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es6.regexp.match.js\nvar es6_regexp_match = __webpack_require__(\"4917\");\n\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es6.number.constructor.js\nvar es6_number_constructor = __webpack_require__(\"c5f6\");\n\n// EXTERNAL MODULE: ./src/helpers/utils.js\nvar utils = __webpack_require__(\"a2b6\");\n\n// CONCATENATED MODULE: ./src/helpers/draggableUtils.js\n// Get {x, y} positions from event.\nfunction getControlPosition(e) {\n  return offsetXYFromParentOf(e);\n} // Get from offsetParent\n\nfunction offsetXYFromParentOf(evt) {\n  var offsetParent = evt.target.offsetParent || document.body;\n  var offsetParentRect = evt.offsetParent === document.body ? {\n    left: 0,\n    top: 0\n  } : offsetParent.getBoundingClientRect();\n  var x = evt.clientX + offsetParent.scrollLeft - offsetParentRect.left;\n  var y = evt.clientY + offsetParent.scrollTop - offsetParentRect.top;\n  /*const x = Math.round(evt.clientX + offsetParent.scrollLeft - offsetParentRect.left);\n  const y = Math.round(evt.clientY + offsetParent.scrollTop - offsetParentRect.top);*/\n\n  return {\n    x: x,\n    y: y\n  };\n} // Create an data object exposed by <DraggableCore>'s events\n\nfunction createCoreData(lastX, lastY, x, y) {\n  // State changes are often (but not always!) async. We want the latest value.\n  var isStart = !isNum(lastX);\n\n  if (isStart) {\n    // If this is our first move, use the x and y as last coords.\n    return {\n      deltaX: 0,\n      deltaY: 0,\n      lastX: x,\n      lastY: y,\n      x: x,\n      y: y\n    };\n  } else {\n    // Otherwise calculate proper values.\n    return {\n      deltaX: x - lastX,\n      deltaY: y - lastY,\n      lastX: lastX,\n      lastY: lastY,\n      x: x,\n      y: y\n    };\n  }\n}\n\nfunction isNum(num) {\n  return typeof num === 'number' && !isNaN(num);\n}\n// EXTERNAL MODULE: ./src/helpers/responsiveUtils.js\nvar responsiveUtils = __webpack_require__(\"97a7\");\n\n// EXTERNAL MODULE: ./src/helpers/DOM.js\nvar DOM = __webpack_require__(\"1ca7\");\n\n// CONCATENATED MODULE: ./node_modules/@interactjs/utils/domObjects.js\nconst domObjects = {\n  init,\n  document: null,\n  DocumentFragment: null,\n  SVGElement: null,\n  SVGSVGElement: null,\n  SVGElementInstance: null,\n  Element: null,\n  HTMLElement: null,\n  Event: null,\n  Touch: null,\n  PointerEvent: null\n};\n\nfunction blank() {}\n\n/* harmony default export */ var utils_domObjects = (domObjects);\n\nfunction init(window) {\n  const win = window;\n  domObjects.document = win.document;\n  domObjects.DocumentFragment = win.DocumentFragment || blank;\n  domObjects.SVGElement = win.SVGElement || blank;\n  domObjects.SVGSVGElement = win.SVGSVGElement || blank;\n  domObjects.SVGElementInstance = win.SVGElementInstance || blank;\n  domObjects.Element = win.Element || blank;\n  domObjects.HTMLElement = win.HTMLElement || domObjects.Element;\n  domObjects.Event = win.Event;\n  domObjects.Touch = win.Touch || blank;\n  domObjects.PointerEvent = win.PointerEvent || win.MSPointerEvent;\n}\n//# sourceMappingURL=domObjects.js.map\n// CONCATENATED MODULE: ./node_modules/@interactjs/utils/isWindow.js\n/* harmony default export */ var isWindow = (thing => !!(thing && thing.Window) && thing instanceof thing.Window);\n//# sourceMappingURL=isWindow.js.map\n// CONCATENATED MODULE: ./node_modules/@interactjs/utils/window.js\n\nlet realWindow = undefined;\nlet win = undefined;\n\nfunction window_init(window) {\n  // get wrapped window if using Shadow DOM polyfill\n  realWindow = window; // create a TextNode\n\n  const el = window.document.createTextNode(''); // check if it's wrapped by a polyfill\n\n  if (el.ownerDocument !== window.document && typeof window.wrap === 'function' && window.wrap(el) === el) {\n    // use wrapped window\n    window = window.wrap(window);\n  }\n\n  win = window;\n}\n\nif (typeof window !== 'undefined' && !!window) {\n  window_init(window);\n}\n\nfunction getWindow(node) {\n  if (isWindow(node)) {\n    return node;\n  }\n\n  const rootNode = node.ownerDocument || node;\n  return rootNode.defaultView || win.window;\n}\n//# sourceMappingURL=window.js.map\n// CONCATENATED MODULE: ./node_modules/@interactjs/utils/is.js\n\n\n\nconst is_window = thing => thing === win || isWindow(thing);\n\nconst docFrag = thing => object(thing) && thing.nodeType === 11;\n\nconst object = thing => !!thing && typeof thing === 'object';\n\nconst func = thing => typeof thing === 'function';\n\nconst number = thing => typeof thing === 'number';\n\nconst bool = thing => typeof thing === 'boolean';\n\nconst string = thing => typeof thing === 'string';\n\nconst is_element = thing => {\n  if (!thing || typeof thing !== 'object') {\n    return false;\n  } // eslint-disable-next-line import/no-named-as-default-member\n\n\n  const _window = getWindow(thing) || win;\n\n  return /object|function/.test(typeof _window.Element) ? thing instanceof _window.Element // DOM2\n  : thing.nodeType === 1 && typeof thing.nodeName === 'string';\n};\n\nconst plainObject = thing => object(thing) && !!thing.constructor && /function Object\\b/.test(thing.constructor.toString());\n\nconst array = thing => object(thing) && typeof thing.length !== 'undefined' && func(thing.splice);\n\n/* harmony default export */ var is = ({\n  window: is_window,\n  docFrag,\n  object,\n  func,\n  number,\n  bool,\n  string,\n  element: is_element,\n  plainObject,\n  array\n});\n//# sourceMappingURL=is.js.map\n// CONCATENATED MODULE: ./node_modules/@interactjs/utils/browser.js\n\n\n\nconst browser = {\n  init: browser_init,\n  supportsTouch: null,\n  supportsPointerEvent: null,\n  isIOS7: null,\n  isIOS: null,\n  isIe9: null,\n  isOperaMobile: null,\n  prefixedMatchesSelector: null,\n  pEventTypes: null,\n  wheelEvent: null\n};\n\nfunction browser_init(window) {\n  const Element = utils_domObjects.Element;\n  const navigator = win.navigator; // Does the browser support touch input?\n\n  browser.supportsTouch = 'ontouchstart' in window || is.func(window.DocumentTouch) && utils_domObjects.document instanceof window.DocumentTouch; // Does the browser support PointerEvents\n\n  browser.supportsPointerEvent = navigator.pointerEnabled !== false && !!utils_domObjects.PointerEvent;\n  browser.isIOS = /iP(hone|od|ad)/.test(navigator.platform); // scrolling doesn't change the result of getClientRects on iOS 7\n\n  browser.isIOS7 = /iP(hone|od|ad)/.test(navigator.platform) && /OS 7[^\\d]/.test(navigator.appVersion);\n  browser.isIe9 = /MSIE 9/.test(navigator.userAgent); // Opera Mobile must be handled differently\n\n  browser.isOperaMobile = navigator.appName === 'Opera' && browser.supportsTouch && /Presto/.test(navigator.userAgent); // prefix matchesSelector\n\n  browser.prefixedMatchesSelector = 'matches' in Element.prototype ? 'matches' : 'webkitMatchesSelector' in Element.prototype ? 'webkitMatchesSelector' : 'mozMatchesSelector' in Element.prototype ? 'mozMatchesSelector' : 'oMatchesSelector' in Element.prototype ? 'oMatchesSelector' : 'msMatchesSelector';\n  browser.pEventTypes = browser.supportsPointerEvent ? utils_domObjects.PointerEvent === window.MSPointerEvent ? {\n    up: 'MSPointerUp',\n    down: 'MSPointerDown',\n    over: 'mouseover',\n    out: 'mouseout',\n    move: 'MSPointerMove',\n    cancel: 'MSPointerCancel'\n  } : {\n    up: 'pointerup',\n    down: 'pointerdown',\n    over: 'pointerover',\n    out: 'pointerout',\n    move: 'pointermove',\n    cancel: 'pointercancel'\n  } : null; // because Webkit and Opera still use 'mousewheel' event type\n\n  browser.wheelEvent = 'onmousewheel' in utils_domObjects.document ? 'mousewheel' : 'wheel';\n}\n\n/* harmony default export */ var utils_browser = (browser);\n//# sourceMappingURL=browser.js.map\n// CONCATENATED MODULE: ./node_modules/@interactjs/utils/arr.js\nconst contains = (array, target) => array.indexOf(target) !== -1;\nconst arr_remove = (array, target) => array.splice(array.indexOf(target), 1);\nconst merge = (target, source) => {\n  for (const item of source) {\n    target.push(item);\n  }\n\n  return target;\n};\nconst from = source => merge([], source);\nconst findIndex = (array, func) => {\n  for (let i = 0; i < array.length; i++) {\n    if (func(array[i], i, array)) {\n      return i;\n    }\n  }\n\n  return -1;\n};\nconst find = (array, func) => array[findIndex(array, func)];\n//# sourceMappingURL=arr.js.map\n// CONCATENATED MODULE: ./node_modules/@interactjs/utils/clone.js\n\n // tslint:disable-next-line ban-types\n\nfunction clone(source) {\n  const dest = {};\n\n  for (const prop in source) {\n    const value = source[prop];\n\n    if (is.plainObject(value)) {\n      dest[prop] = clone(value);\n    } else if (is.array(value)) {\n      dest[prop] = from(value);\n    } else {\n      dest[prop] = value;\n    }\n  }\n\n  return dest;\n}\n//# sourceMappingURL=clone.js.map\n// CONCATENATED MODULE: ./node_modules/@interactjs/utils/extend.js\nfunction extend(dest, source) {\n  for (const prop in source) {\n    dest[prop] = source[prop];\n  }\n\n  const ret = dest;\n  return ret;\n}\n//# sourceMappingURL=extend.js.map\n// CONCATENATED MODULE: ./node_modules/@interactjs/utils/raf.js\nlet lastTime = 0;\nlet request;\nlet cancel;\n\nfunction raf_init(window) {\n  request = window.requestAnimationFrame;\n  cancel = window.cancelAnimationFrame;\n\n  if (!request) {\n    const vendors = ['ms', 'moz', 'webkit', 'o'];\n\n    for (const vendor of vendors) {\n      request = window[`${vendor}RequestAnimationFrame`];\n      cancel = window[`${vendor}CancelAnimationFrame`] || window[`${vendor}CancelRequestAnimationFrame`];\n    }\n  }\n\n  request = request && request.bind(window);\n  cancel = cancel && cancel.bind(window);\n\n  if (!request) {\n    request = callback => {\n      const currTime = Date.now();\n      const timeToCall = Math.max(0, 16 - (currTime - lastTime)); // eslint-disable-next-line node/no-callback-literal\n\n      const token = window.setTimeout(() => {\n        callback(currTime + timeToCall);\n      }, timeToCall);\n      lastTime = currTime + timeToCall;\n      return token;\n    };\n\n    cancel = token => clearTimeout(token);\n  }\n}\n\n/* harmony default export */ var raf = ({\n  request: callback => request(callback),\n  cancel: token => cancel(token),\n  init: raf_init\n});\n//# sourceMappingURL=raf.js.map\n// CONCATENATED MODULE: ./node_modules/@interactjs/utils/normalizeListeners.js\n\n\nfunction normalize(type, listeners, result) {\n  result = result || {};\n\n  if (is.string(type) && type.search(' ') !== -1) {\n    type = split(type);\n  }\n\n  if (is.array(type)) {\n    return type.reduce((acc, t) => extend(acc, normalize(t, listeners, result)), result);\n  } // ({ type: fn }) -> ('', { type: fn })\n\n\n  if (is.object(type)) {\n    listeners = type;\n    type = '';\n  }\n\n  if (is.func(listeners)) {\n    result[type] = result[type] || [];\n    result[type].push(listeners);\n  } else if (is.array(listeners)) {\n    for (const l of listeners) {\n      normalize(type, l, result);\n    }\n  } else if (is.object(listeners)) {\n    for (const prefix in listeners) {\n      const combinedTypes = split(prefix).map(p => `${type}${p}`);\n      normalize(combinedTypes, listeners[prefix], result);\n    }\n  }\n\n  return result;\n}\n\nfunction split(type) {\n  return type.trim().split(/ +/);\n}\n//# sourceMappingURL=normalizeListeners.js.map\n// CONCATENATED MODULE: ./node_modules/@interactjs/core/Eventable.js\n\n\n\n\nfunction fireUntilImmediateStopped(event, listeners) {\n  for (const listener of listeners) {\n    if (event.immediatePropagationStopped) {\n      break;\n    }\n\n    listener(event);\n  }\n}\n\nclass Eventable_Eventable {\n  constructor(options) {\n    this.options = void 0;\n    this.types = {};\n    this.propagationStopped = false;\n    this.immediatePropagationStopped = false;\n    this.global = void 0;\n    this.options = extend({}, options || {});\n  }\n\n  fire(event) {\n    let listeners;\n    const global = this.global; // Interactable#on() listeners\n    // tslint:disable no-conditional-assignment\n\n    if (listeners = this.types[event.type]) {\n      fireUntilImmediateStopped(event, listeners);\n    } // interact.on() listeners\n\n\n    if (!event.propagationStopped && global && (listeners = global[event.type])) {\n      fireUntilImmediateStopped(event, listeners);\n    }\n  }\n\n  on(type, listener) {\n    const listeners = normalize(type, listener);\n\n    for (type in listeners) {\n      this.types[type] = merge(this.types[type] || [], listeners[type]);\n    }\n  }\n\n  off(type, listener) {\n    const listeners = normalize(type, listener);\n\n    for (type in listeners) {\n      const eventList = this.types[type];\n\n      if (!eventList || !eventList.length) {\n        continue;\n      }\n\n      for (const subListener of listeners[type]) {\n        const index = eventList.indexOf(subListener);\n\n        if (index !== -1) {\n          eventList.splice(index, 1);\n        }\n      }\n    }\n  }\n\n  getRect(_element) {\n    return null;\n  }\n\n}\n//# sourceMappingURL=Eventable.js.map\n// CONCATENATED MODULE: ./node_modules/@interactjs/utils/domUtils.js\n\n\n\n\nfunction nodeContains(parent, child) {\n  if (parent.contains) {\n    return parent.contains(child);\n  }\n\n  while (child) {\n    if (child === parent) {\n      return true;\n    }\n\n    child = child.parentNode;\n  }\n\n  return false;\n}\nfunction domUtils_closest(element, selector) {\n  while (is.element(element)) {\n    if (matchesSelector(element, selector)) {\n      return element;\n    }\n\n    element = parentNode(element);\n  }\n\n  return null;\n}\nfunction parentNode(node) {\n  let parent = node.parentNode;\n\n  if (is.docFrag(parent)) {\n    // skip past #shado-root fragments\n    // tslint:disable-next-line\n    while ((parent = parent.host) && is.docFrag(parent)) {\n      continue;\n    }\n\n    return parent;\n  }\n\n  return parent;\n}\nfunction matchesSelector(element, selector) {\n  // remove /deep/ from selectors if shadowDOM polyfill is used\n  if (win !== realWindow) {\n    selector = selector.replace(/\\/deep\\//g, ' ');\n  }\n\n  return element[utils_browser.prefixedMatchesSelector](selector);\n}\n\nconst getParent = el => el.parentNode || el.host; // Test for the element that's \"above\" all other qualifiers\n\n\nfunction indexOfDeepestElement(elements) {\n  let deepestNodeParents = [];\n  let deepestNodeIndex;\n\n  for (let i = 0; i < elements.length; i++) {\n    const currentNode = elements[i];\n    const deepestNode = elements[deepestNodeIndex]; // node may appear in elements array multiple times\n\n    if (!currentNode || i === deepestNodeIndex) {\n      continue;\n    }\n\n    if (!deepestNode) {\n      deepestNodeIndex = i;\n      continue;\n    }\n\n    const currentNodeParent = getParent(currentNode);\n    const deepestNodeParent = getParent(deepestNode); // check if the deepest or current are document.documentElement/rootElement\n    // - if the current node is, do nothing and continue\n\n    if (currentNodeParent === currentNode.ownerDocument) {\n      continue;\n    } // - if deepest is, update with the current node and continue to next\n    else if (deepestNodeParent === currentNode.ownerDocument) {\n        deepestNodeIndex = i;\n        continue;\n      } // compare zIndex of siblings\n\n\n    if (currentNodeParent === deepestNodeParent) {\n      if (zIndexIsHigherThan(currentNode, deepestNode)) {\n        deepestNodeIndex = i;\n      }\n\n      continue;\n    } // populate the ancestry array for the latest deepest node\n\n\n    deepestNodeParents = deepestNodeParents.length ? deepestNodeParents : getNodeParents(deepestNode);\n    let ancestryStart; // if the deepest node is an HTMLElement and the current node is a non root svg element\n\n    if (deepestNode instanceof utils_domObjects.HTMLElement && currentNode instanceof utils_domObjects.SVGElement && !(currentNode instanceof utils_domObjects.SVGSVGElement)) {\n      // TODO: is this check necessary? Was this for HTML elements embedded in SVG?\n      if (currentNode === deepestNodeParent) {\n        continue;\n      }\n\n      ancestryStart = currentNode.ownerSVGElement;\n    } else {\n      ancestryStart = currentNode;\n    }\n\n    const currentNodeParents = getNodeParents(ancestryStart, deepestNode.ownerDocument);\n    let commonIndex = 0; // get (position of closest common ancestor) + 1\n\n    while (currentNodeParents[commonIndex] && currentNodeParents[commonIndex] === deepestNodeParents[commonIndex]) {\n      commonIndex++;\n    }\n\n    const parents = [currentNodeParents[commonIndex - 1], currentNodeParents[commonIndex], deepestNodeParents[commonIndex]];\n    let child = parents[0].lastChild;\n\n    while (child) {\n      if (child === parents[1]) {\n        deepestNodeIndex = i;\n        deepestNodeParents = currentNodeParents;\n        break;\n      } else if (child === parents[2]) {\n        break;\n      }\n\n      child = child.previousSibling;\n    }\n  }\n\n  return deepestNodeIndex;\n}\n\nfunction getNodeParents(node, limit) {\n  const parents = [];\n  let parent = node;\n  let parentParent;\n\n  while ((parentParent = getParent(parent)) && parent !== limit && parentParent !== parent.ownerDocument) {\n    parents.unshift(parent);\n    parent = parentParent;\n  }\n\n  return parents;\n}\n\nfunction zIndexIsHigherThan(higherNode, lowerNode) {\n  const higherIndex = parseInt(getWindow(higherNode).getComputedStyle(higherNode).zIndex, 10) || 0;\n  const lowerIndex = parseInt(getWindow(lowerNode).getComputedStyle(lowerNode).zIndex, 10) || 0;\n  return higherIndex >= lowerIndex;\n}\n\nfunction matchesUpTo(element, selector, limit) {\n  while (is.element(element)) {\n    if (matchesSelector(element, selector)) {\n      return true;\n    }\n\n    element = parentNode(element);\n\n    if (element === limit) {\n      return matchesSelector(element, selector);\n    }\n  }\n\n  return false;\n}\nfunction getActualElement(element) {\n  return element.correspondingUseElement || element;\n}\nfunction getScrollXY(relevantWindow) {\n  relevantWindow = relevantWindow || win;\n  return {\n    x: relevantWindow.scrollX || relevantWindow.document.documentElement.scrollLeft,\n    y: relevantWindow.scrollY || relevantWindow.document.documentElement.scrollTop\n  };\n}\nfunction getElementClientRect(element) {\n  const clientRect = element instanceof utils_domObjects.SVGElement ? element.getBoundingClientRect() : element.getClientRects()[0];\n  return clientRect && {\n    left: clientRect.left,\n    right: clientRect.right,\n    top: clientRect.top,\n    bottom: clientRect.bottom,\n    width: clientRect.width || clientRect.right - clientRect.left,\n    height: clientRect.height || clientRect.bottom - clientRect.top\n  };\n}\nfunction getElementRect(element) {\n  const clientRect = getElementClientRect(element);\n\n  if (!utils_browser.isIOS7 && clientRect) {\n    const scroll = getScrollXY(getWindow(element));\n    clientRect.left += scroll.x;\n    clientRect.right += scroll.x;\n    clientRect.top += scroll.y;\n    clientRect.bottom += scroll.y;\n  }\n\n  return clientRect;\n}\nfunction getPath(node) {\n  const path = [];\n\n  while (node) {\n    path.push(node);\n    node = parentNode(node);\n  }\n\n  return path;\n}\nfunction trySelector(value) {\n  if (!is.string(value)) {\n    return false;\n  } // an exception will be raised if it is invalid\n\n\n  utils_domObjects.document.querySelector(value);\n  return true;\n}\n//# sourceMappingURL=domUtils.js.map\n// CONCATENATED MODULE: ./node_modules/@interactjs/utils/rect.js\n\n\n\nfunction getStringOptionResult(value, target, element) {\n  if (value === 'parent') {\n    return parentNode(element);\n  }\n\n  if (value === 'self') {\n    return target.getRect(element);\n  }\n\n  return domUtils_closest(element, value);\n}\nfunction resolveRectLike(value, target, element, functionArgs) {\n  let returnValue = value;\n\n  if (is.string(returnValue)) {\n    returnValue = getStringOptionResult(returnValue, target, element);\n  } else if (is.func(returnValue)) {\n    returnValue = returnValue(...functionArgs);\n  }\n\n  if (is.element(returnValue)) {\n    returnValue = getElementRect(returnValue);\n  }\n\n  return returnValue;\n}\nfunction rectToXY(rect) {\n  return rect && {\n    x: 'x' in rect ? rect.x : rect.left,\n    y: 'y' in rect ? rect.y : rect.top\n  };\n}\nfunction xywhToTlbr(rect) {\n  if (rect && !('left' in rect && 'top' in rect)) {\n    rect = extend({}, rect);\n    rect.left = rect.x || 0;\n    rect.top = rect.y || 0;\n    rect.right = rect.right || rect.left + rect.width;\n    rect.bottom = rect.bottom || rect.top + rect.height;\n  }\n\n  return rect;\n}\nfunction tlbrToXywh(rect) {\n  if (rect && !('x' in rect && 'y' in rect)) {\n    rect = extend({}, rect);\n    rect.x = rect.left || 0;\n    rect.y = rect.top || 0;\n    rect.width = rect.width || (rect.right || 0) - rect.x;\n    rect.height = rect.height || (rect.bottom || 0) - rect.y;\n  }\n\n  return rect;\n}\nfunction addEdges(edges, rect, delta) {\n  if (edges.left) {\n    rect.left += delta.x;\n  }\n\n  if (edges.right) {\n    rect.right += delta.x;\n  }\n\n  if (edges.top) {\n    rect.top += delta.y;\n  }\n\n  if (edges.bottom) {\n    rect.bottom += delta.y;\n  }\n\n  rect.width = rect.right - rect.left;\n  rect.height = rect.bottom - rect.top;\n}\n//# sourceMappingURL=rect.js.map\n// CONCATENATED MODULE: ./node_modules/@interactjs/utils/getOriginXY.js\n\n/* harmony default export */ var getOriginXY = (function (target, element, actionName) {\n  const actionOptions = target.options[actionName];\n  const actionOrigin = actionOptions && actionOptions.origin;\n  const origin = actionOrigin || target.options.origin;\n  const originRect = resolveRectLike(origin, target, element, [target && element]);\n  return rectToXY(originRect) || {\n    x: 0,\n    y: 0\n  };\n});\n//# sourceMappingURL=getOriginXY.js.map\n// CONCATENATED MODULE: ./node_modules/@interactjs/utils/hypot.js\n/* harmony default export */ var hypot = ((x, y) => Math.sqrt(x * x + y * y));\n//# sourceMappingURL=hypot.js.map\n// CONCATENATED MODULE: ./node_modules/@interactjs/core/BaseEvent.js\nclass BaseEvent {\n  constructor(interaction) {\n    this.type = void 0;\n    this.target = void 0;\n    this.currentTarget = void 0;\n    this.interactable = void 0;\n    this._interaction = void 0;\n    this.timeStamp = void 0;\n    this.immediatePropagationStopped = false;\n    this.propagationStopped = false;\n    this._interaction = interaction;\n  }\n\n  preventDefault() {}\n  /**\n   * Don't call any other listeners (even on the current target)\n   */\n\n\n  stopPropagation() {\n    this.propagationStopped = true;\n  }\n  /**\n   * Don't call listeners on the remaining targets\n   */\n\n\n  stopImmediatePropagation() {\n    this.immediatePropagationStopped = this.propagationStopped = true;\n  }\n\n} // defined outside of class definition to avoid assignment of undefined during\n// construction\n\n// getters and setters defined here to support typescript 3.6 and below which\n// don't support getter and setters in .d.ts files\nObject.defineProperty(BaseEvent.prototype, 'interaction', {\n  get() {\n    return this._interaction._proxy;\n  },\n\n  set() {}\n\n});\n//# sourceMappingURL=BaseEvent.js.map\n// CONCATENATED MODULE: ./node_modules/@interactjs/core/defaultOptions.js\n// eslint-disable-next-line @typescript-eslint/no-empty-interface\n// export interface Options extends BaseDefaults, PerActionDefaults {}\nconst defaultOptions_defaults = {\n  base: {\n    preventDefault: 'auto',\n    deltaSource: 'page'\n  },\n  perAction: {\n    enabled: false,\n    origin: {\n      x: 0,\n      y: 0\n    }\n  },\n  actions: {}\n};\n//# sourceMappingURL=defaultOptions.js.map\n// CONCATENATED MODULE: ./node_modules/@interactjs/core/InteractEvent.js\n\n\n\n\n\nclass InteractEvent_InteractEvent extends BaseEvent {\n  // resize\n\n  /** */\n  constructor(interaction, event, actionName, phase, element, preEnd, type) {\n    super(interaction);\n    this.target = void 0;\n    this.currentTarget = void 0;\n    this.relatedTarget = null;\n    this.screenX = void 0;\n    this.screenY = void 0;\n    this.button = void 0;\n    this.buttons = void 0;\n    this.ctrlKey = void 0;\n    this.shiftKey = void 0;\n    this.altKey = void 0;\n    this.metaKey = void 0;\n    this.page = void 0;\n    this.client = void 0;\n    this.delta = void 0;\n    this.rect = void 0;\n    this.x0 = void 0;\n    this.y0 = void 0;\n    this.t0 = void 0;\n    this.dt = void 0;\n    this.duration = void 0;\n    this.clientX0 = void 0;\n    this.clientY0 = void 0;\n    this.velocity = void 0;\n    this.speed = void 0;\n    this.swipe = void 0;\n    this.timeStamp = void 0;\n    this.axes = void 0;\n    this.preEnd = void 0;\n    element = element || interaction.element;\n    const target = interaction.interactable;\n    const deltaSource = (target && target.options || defaultOptions_defaults).deltaSource;\n    const origin = getOriginXY(target, element, actionName);\n    const starting = phase === 'start';\n    const ending = phase === 'end';\n    const prevEvent = starting ? this : interaction.prevEvent;\n    const coords = starting ? interaction.coords.start : ending ? {\n      page: prevEvent.page,\n      client: prevEvent.client,\n      timeStamp: interaction.coords.cur.timeStamp\n    } : interaction.coords.cur;\n    this.page = extend({}, coords.page);\n    this.client = extend({}, coords.client);\n    this.rect = extend({}, interaction.rect);\n    this.timeStamp = coords.timeStamp;\n\n    if (!ending) {\n      this.page.x -= origin.x;\n      this.page.y -= origin.y;\n      this.client.x -= origin.x;\n      this.client.y -= origin.y;\n    }\n\n    this.ctrlKey = event.ctrlKey;\n    this.altKey = event.altKey;\n    this.shiftKey = event.shiftKey;\n    this.metaKey = event.metaKey;\n    this.button = event.button;\n    this.buttons = event.buttons;\n    this.target = element;\n    this.currentTarget = element;\n    this.preEnd = preEnd;\n    this.type = type || actionName + (phase || '');\n    this.interactable = target;\n    this.t0 = starting ? interaction.pointers[interaction.pointers.length - 1].downTime : prevEvent.t0;\n    this.x0 = interaction.coords.start.page.x - origin.x;\n    this.y0 = interaction.coords.start.page.y - origin.y;\n    this.clientX0 = interaction.coords.start.client.x - origin.x;\n    this.clientY0 = interaction.coords.start.client.y - origin.y;\n\n    if (starting || ending) {\n      this.delta = {\n        x: 0,\n        y: 0\n      };\n    } else {\n      this.delta = {\n        x: this[deltaSource].x - prevEvent[deltaSource].x,\n        y: this[deltaSource].y - prevEvent[deltaSource].y\n      };\n    }\n\n    this.dt = interaction.coords.delta.timeStamp;\n    this.duration = this.timeStamp - this.t0; // velocity and speed in pixels per second\n\n    this.velocity = extend({}, interaction.coords.velocity[deltaSource]);\n    this.speed = hypot(this.velocity.x, this.velocity.y);\n    this.swipe = ending || phase === 'inertiastart' ? this.getSwipe() : null;\n  }\n\n  getSwipe() {\n    const interaction = this._interaction;\n\n    if (interaction.prevEvent.speed < 600 || this.timeStamp - interaction.prevEvent.timeStamp > 150) {\n      return null;\n    }\n\n    let angle = 180 * Math.atan2(interaction.prevEvent.velocityY, interaction.prevEvent.velocityX) / Math.PI;\n    const overlap = 22.5;\n\n    if (angle < 0) {\n      angle += 360;\n    }\n\n    const left = 135 - overlap <= angle && angle < 225 + overlap;\n    const up = 225 - overlap <= angle && angle < 315 + overlap;\n    const right = !left && (315 - overlap <= angle || angle < 45 + overlap);\n    const down = !up && 45 - overlap <= angle && angle < 135 + overlap;\n    return {\n      up,\n      down,\n      left,\n      right,\n      angle,\n      speed: interaction.prevEvent.speed,\n      velocity: {\n        x: interaction.prevEvent.velocityX,\n        y: interaction.prevEvent.velocityY\n      }\n    };\n  }\n\n  preventDefault() {}\n  /**\n   * Don't call listeners on the remaining targets\n   */\n\n\n  stopImmediatePropagation() {\n    this.immediatePropagationStopped = this.propagationStopped = true;\n  }\n  /**\n   * Don't call any other listeners (even on the current target)\n   */\n\n\n  stopPropagation() {\n    this.propagationStopped = true;\n  }\n\n} // getters and setters defined here to support typescript 3.6 and below which\n// don't support getter and setters in .d.ts files\n\nObject.defineProperties(InteractEvent_InteractEvent.prototype, {\n  pageX: {\n    get() {\n      return this.page.x;\n    },\n\n    set(value) {\n      this.page.x = value;\n    }\n\n  },\n  pageY: {\n    get() {\n      return this.page.y;\n    },\n\n    set(value) {\n      this.page.y = value;\n    }\n\n  },\n  clientX: {\n    get() {\n      return this.client.x;\n    },\n\n    set(value) {\n      this.client.x = value;\n    }\n\n  },\n  clientY: {\n    get() {\n      return this.client.y;\n    },\n\n    set(value) {\n      this.client.y = value;\n    }\n\n  },\n  dx: {\n    get() {\n      return this.delta.x;\n    },\n\n    set(value) {\n      this.delta.x = value;\n    }\n\n  },\n  dy: {\n    get() {\n      return this.delta.y;\n    },\n\n    set(value) {\n      this.delta.y = value;\n    }\n\n  },\n  velocityX: {\n    get() {\n      return this.velocity.x;\n    },\n\n    set(value) {\n      this.velocity.x = value;\n    }\n\n  },\n  velocityY: {\n    get() {\n      return this.velocity.y;\n    },\n\n    set(value) {\n      this.velocity.y = value;\n    }\n\n  }\n});\n//# sourceMappingURL=InteractEvent.js.map\n// CONCATENATED MODULE: ./node_modules/@interactjs/core/isNonNativeEvent.js\nfunction isNonNativeEvent(type, actions) {\n  if (actions.phaselessTypes[type]) {\n    return true;\n  }\n\n  for (const name in actions.map) {\n    if (type.indexOf(name) === 0 && type.substr(name.length) in actions.phases) {\n      return true;\n    }\n  }\n\n  return false;\n}\n//# sourceMappingURL=isNonNativeEvent.js.map\n// CONCATENATED MODULE: ./node_modules/@interactjs/core/Interactable.js\n/* eslint-disable no-dupe-class-members */\n\n\n\n\n\n\n\n\n\n\n\n/** */\nclass Interactable_Interactable {\n  /** @internal */\n  get _defaults() {\n    return {\n      base: {},\n      perAction: {},\n      actions: {}\n    };\n  }\n\n  /** */\n  constructor(target, options, defaultContext, scopeEvents) {\n    this.options = void 0;\n    this._actions = void 0;\n    this.target = void 0;\n    this.events = new Eventable_Eventable();\n    this._context = void 0;\n    this._win = void 0;\n    this._doc = void 0;\n    this._scopeEvents = void 0;\n    this._rectChecker = void 0;\n    this._actions = options.actions;\n    this.target = target;\n    this._context = options.context || defaultContext;\n    this._win = getWindow(trySelector(target) ? this._context : target);\n    this._doc = this._win.document;\n    this._scopeEvents = scopeEvents;\n    this.set(options);\n  }\n\n  setOnEvents(actionName, phases) {\n    if (is.func(phases.onstart)) {\n      this.on(`${actionName}start`, phases.onstart);\n    }\n\n    if (is.func(phases.onmove)) {\n      this.on(`${actionName}move`, phases.onmove);\n    }\n\n    if (is.func(phases.onend)) {\n      this.on(`${actionName}end`, phases.onend);\n    }\n\n    if (is.func(phases.oninertiastart)) {\n      this.on(`${actionName}inertiastart`, phases.oninertiastart);\n    }\n\n    return this;\n  }\n\n  updatePerActionListeners(actionName, prev, cur) {\n    if (is.array(prev) || is.object(prev)) {\n      this.off(actionName, prev);\n    }\n\n    if (is.array(cur) || is.object(cur)) {\n      this.on(actionName, cur);\n    }\n  }\n\n  setPerAction(actionName, options) {\n    const defaults = this._defaults; // for all the default per-action options\n\n    for (const optionName_ in options) {\n      const optionName = optionName_;\n      const actionOptions = this.options[actionName];\n      const optionValue = options[optionName]; // remove old event listeners and add new ones\n\n      if (optionName === 'listeners') {\n        this.updatePerActionListeners(actionName, actionOptions.listeners, optionValue);\n      } // if the option value is an array\n\n\n      if (is.array(optionValue)) {\n        actionOptions[optionName] = from(optionValue);\n      } // if the option value is an object\n      else if (is.plainObject(optionValue)) {\n          // copy the object\n          actionOptions[optionName] = extend(actionOptions[optionName] || {}, clone(optionValue)); // set anabled field to true if it exists in the defaults\n\n          if (is.object(defaults.perAction[optionName]) && 'enabled' in defaults.perAction[optionName]) {\n            actionOptions[optionName].enabled = optionValue.enabled !== false;\n          }\n        } // if the option value is a boolean and the default is an object\n        else if (is.bool(optionValue) && is.object(defaults.perAction[optionName])) {\n            actionOptions[optionName].enabled = optionValue;\n          } // if it's anything else, do a plain assignment\n          else {\n              actionOptions[optionName] = optionValue;\n            }\n    }\n  }\n  /**\n   * The default function to get an Interactables bounding rect. Can be\n   * overridden using {@link Interactable.rectChecker}.\n   *\n   * @param {Element} [element] The element to measure.\n   * @return {Rect} The object's bounding rectangle.\n   */\n\n\n  getRect(element) {\n    element = element || (is.element(this.target) ? this.target : null);\n\n    if (is.string(this.target)) {\n      element = element || this._context.querySelector(this.target);\n    }\n\n    return getElementRect(element);\n  }\n  /**\n   * Returns or sets the function used to calculate the interactable's\n   * element's rectangle\n   *\n   * @param {function} [checker] A function which returns this Interactable's\n   * bounding rectangle. See {@link Interactable.getRect}\n   * @return {function | object} The checker function or this Interactable\n   */\n\n\n  rectChecker(checker) {\n    if (is.func(checker)) {\n      this._rectChecker = checker;\n\n      this.getRect = element => {\n        const rect = extend({}, this._rectChecker(element));\n\n        if (!('width' in rect)) {\n          rect.width = rect.right - rect.left;\n          rect.height = rect.bottom - rect.top;\n        }\n\n        return rect;\n      };\n\n      return this;\n    }\n\n    if (checker === null) {\n      delete this.getRect;\n      delete this._rectChecker;\n      return this;\n    }\n\n    return this.getRect;\n  }\n\n  _backCompatOption(optionName, newValue) {\n    if (trySelector(newValue) || is.object(newValue)) {\n      this.options[optionName] = newValue;\n\n      for (const action in this._actions.map) {\n        this.options[action][optionName] = newValue;\n      }\n\n      return this;\n    }\n\n    return this.options[optionName];\n  }\n  /**\n   * Gets or sets the origin of the Interactable's element.  The x and y\n   * of the origin will be subtracted from action event coordinates.\n   *\n   * @param {Element | object | string} [origin] An HTML or SVG Element whose\n   * rect will be used, an object eg. { x: 0, y: 0 } or string 'parent', 'self'\n   * or any CSS selector\n   *\n   * @return {object} The current origin or this Interactable\n   */\n\n\n  origin(newValue) {\n    return this._backCompatOption('origin', newValue);\n  }\n  /**\n   * Returns or sets the mouse coordinate types used to calculate the\n   * movement of the pointer.\n   *\n   * @param {string} [newValue] Use 'client' if you will be scrolling while\n   * interacting; Use 'page' if you want autoScroll to work\n   * @return {string | object} The current deltaSource or this Interactable\n   */\n\n\n  deltaSource(newValue) {\n    if (newValue === 'page' || newValue === 'client') {\n      this.options.deltaSource = newValue;\n      return this;\n    }\n\n    return this.options.deltaSource;\n  }\n  /**\n   * Gets the selector context Node of the Interactable. The default is\n   * `window.document`.\n   *\n   * @return {Node} The context Node of this Interactable\n   */\n\n\n  context() {\n    return this._context;\n  }\n\n  inContext(element) {\n    return this._context === element.ownerDocument || nodeContains(this._context, element);\n  }\n\n  testIgnoreAllow(options, targetNode, eventTarget) {\n    return !this.testIgnore(options.ignoreFrom, targetNode, eventTarget) && this.testAllow(options.allowFrom, targetNode, eventTarget);\n  }\n\n  testAllow(allowFrom, targetNode, element) {\n    if (!allowFrom) {\n      return true;\n    }\n\n    if (!is.element(element)) {\n      return false;\n    }\n\n    if (is.string(allowFrom)) {\n      return matchesUpTo(element, allowFrom, targetNode);\n    } else if (is.element(allowFrom)) {\n      return nodeContains(allowFrom, element);\n    }\n\n    return false;\n  }\n\n  testIgnore(ignoreFrom, targetNode, element) {\n    if (!ignoreFrom || !is.element(element)) {\n      return false;\n    }\n\n    if (is.string(ignoreFrom)) {\n      return matchesUpTo(element, ignoreFrom, targetNode);\n    } else if (is.element(ignoreFrom)) {\n      return nodeContains(ignoreFrom, element);\n    }\n\n    return false;\n  }\n  /**\n   * Calls listeners for the given InteractEvent type bound globally\n   * and directly to this Interactable\n   *\n   * @param {InteractEvent} iEvent The InteractEvent object to be fired on this\n   * Interactable\n   * @return {Interactable} this Interactable\n   */\n\n\n  fire(iEvent) {\n    this.events.fire(iEvent);\n    return this;\n  }\n\n  _onOff(method, typeArg, listenerArg, options) {\n    if (is.object(typeArg) && !is.array(typeArg)) {\n      options = listenerArg;\n      listenerArg = null;\n    }\n\n    const addRemove = method === 'on' ? 'add' : 'remove';\n    const listeners = normalize(typeArg, listenerArg);\n\n    for (let type in listeners) {\n      if (type === 'wheel') {\n        type = utils_browser.wheelEvent;\n      }\n\n      for (const listener of listeners[type]) {\n        // if it is an action event type\n        if (isNonNativeEvent(type, this._actions)) {\n          this.events[method](type, listener);\n        } // delegated event\n        else if (is.string(this.target)) {\n            this._scopeEvents[`${addRemove}Delegate`](this.target, this._context, type, listener, options);\n          } // remove listener from this Interactable's element\n          else {\n              this._scopeEvents[addRemove](this.target, type, listener, options);\n            }\n      }\n    }\n\n    return this;\n  }\n  /**\n   * Binds a listener for an InteractEvent, pointerEvent or DOM event.\n   *\n   * @param {string | array | object} types The types of events to listen\n   * for\n   * @param {function | array | object} [listener] The event listener function(s)\n   * @param {object | boolean} [options] options object or useCapture flag for\n   * addEventListener\n   * @return {Interactable} This Interactable\n   */\n\n\n  on(types, listener, options) {\n    return this._onOff('on', types, listener, options);\n  }\n  /**\n   * Removes an InteractEvent, pointerEvent or DOM event listener.\n   *\n   * @param {string | array | object} types The types of events that were\n   * listened for\n   * @param {function | array | object} [listener] The event listener function(s)\n   * @param {object | boolean} [options] options object or useCapture flag for\n   * removeEventListener\n   * @return {Interactable} This Interactable\n   */\n\n\n  off(types, listener, options) {\n    return this._onOff('off', types, listener, options);\n  }\n  /**\n   * Reset the options of this Interactable\n   *\n   * @param {object} options The new settings to apply\n   * @return {object} This Interactable\n   */\n\n\n  set(options) {\n    const defaults = this._defaults;\n\n    if (!is.object(options)) {\n      options = {};\n    }\n\n    this.options = clone(defaults.base);\n\n    for (const actionName_ in this._actions.methodDict) {\n      const actionName = actionName_;\n      const methodName = this._actions.methodDict[actionName];\n      this.options[actionName] = {};\n      this.setPerAction(actionName, extend(extend({}, defaults.perAction), defaults.actions[actionName]));\n      this[methodName](options[actionName]);\n    }\n\n    for (const setting in options) {\n      if (is.func(this[setting])) {\n        this[setting](options[setting]);\n      }\n    }\n\n    return this;\n  }\n  /**\n   * Remove this interactable from the list of interactables and remove it's\n   * action capabilities and event listeners\n   */\n\n\n  unset() {\n    if (is.string(this.target)) {\n      // remove delegated events\n      for (const type in this._scopeEvents.delegatedEvents) {\n        const delegated = this._scopeEvents.delegatedEvents[type];\n\n        for (let i = delegated.length - 1; i >= 0; i--) {\n          const {\n            selector,\n            context,\n            listeners\n          } = delegated[i];\n\n          if (selector === this.target && context === this._context) {\n            delegated.splice(i, 1);\n          }\n\n          for (let l = listeners.length - 1; l >= 0; l--) {\n            this._scopeEvents.removeDelegate(this.target, this._context, type, listeners[l][0], listeners[l][1]);\n          }\n        }\n      }\n    } else {\n      this._scopeEvents.remove(this.target, 'all');\n    }\n  }\n\n}\n//# sourceMappingURL=Interactable.js.map\n// CONCATENATED MODULE: ./node_modules/@interactjs/core/InteractableSet.js\n\n\n\n\nclass InteractableSet_InteractableSet {\n  // all set interactables\n  constructor(scope) {\n    this.list = [];\n    this.selectorMap = {};\n    this.scope = void 0;\n    this.scope = scope;\n    scope.addListeners({\n      'interactable:unset': ({\n        interactable\n      }) => {\n        const {\n          target,\n          _context: context\n        } = interactable;\n        const targetMappings = is.string(target) ? this.selectorMap[target] : target[this.scope.id];\n        const targetIndex = findIndex(targetMappings, m => m.context === context);\n\n        if (targetMappings[targetIndex]) {\n          // Destroying mappingInfo's context and interactable\n          targetMappings[targetIndex].context = null;\n          targetMappings[targetIndex].interactable = null;\n        }\n\n        targetMappings.splice(targetIndex, 1);\n      }\n    });\n  }\n\n  new(target, options) {\n    options = extend(options || {}, {\n      actions: this.scope.actions\n    });\n    const interactable = new this.scope.Interactable(target, options, this.scope.document, this.scope.events);\n    const mappingInfo = {\n      context: interactable._context,\n      interactable\n    };\n    this.scope.addDocument(interactable._doc);\n    this.list.push(interactable);\n\n    if (is.string(target)) {\n      if (!this.selectorMap[target]) {\n        this.selectorMap[target] = [];\n      }\n\n      this.selectorMap[target].push(mappingInfo);\n    } else {\n      if (!interactable.target[this.scope.id]) {\n        Object.defineProperty(target, this.scope.id, {\n          value: [],\n          configurable: true\n        });\n      }\n\n      target[this.scope.id].push(mappingInfo);\n    }\n\n    this.scope.fire('interactable:new', {\n      target,\n      options,\n      interactable,\n      win: this.scope._win\n    });\n    return interactable;\n  }\n\n  get(target, options) {\n    const context = options && options.context || this.scope.document;\n    const isSelector = is.string(target);\n    const targetMappings = isSelector ? this.selectorMap[target] : target[this.scope.id];\n\n    if (!targetMappings) {\n      return null;\n    }\n\n    const found = find(targetMappings, m => m.context === context && (isSelector || m.interactable.inContext(target)));\n    return found && found.interactable;\n  }\n\n  forEachMatch(node, callback) {\n    for (const interactable of this.list) {\n      let ret;\n\n      if ((is.string(interactable.target) // target is a selector and the element matches\n      ? is.element(node) && matchesSelector(node, interactable.target) : // target is the element\n      node === interactable.target) && // the element is in context\n      interactable.inContext(node)) {\n        ret = callback(interactable);\n      }\n\n      if (ret !== undefined) {\n        return ret;\n      }\n    }\n  }\n\n}\n//# sourceMappingURL=InteractableSet.js.map\n// CONCATENATED MODULE: ./node_modules/@interactjs/utils/pointerExtend.js\nfunction pointerExtend(dest, source) {\n  for (const prop in source) {\n    const prefixedPropREs = pointerExtend.prefixedPropREs;\n    let deprecated = false; // skip deprecated prefixed properties\n\n    for (const vendor in prefixedPropREs) {\n      if (prop.indexOf(vendor) === 0 && prefixedPropREs[vendor].test(prop)) {\n        deprecated = true;\n        break;\n      }\n    }\n\n    if (!deprecated && typeof source[prop] !== 'function') {\n      dest[prop] = source[prop];\n    }\n  }\n\n  return dest;\n}\n\npointerExtend.prefixedPropREs = {\n  webkit: /(Movement[XY]|Radius[XY]|RotationAngle|Force)$/,\n  moz: /(Pressure)$/\n};\n/* harmony default export */ var utils_pointerExtend = (pointerExtend);\n//# sourceMappingURL=pointerExtend.js.map\n// CONCATENATED MODULE: ./node_modules/@interactjs/utils/pointerUtils.js\n\n\n\n\n\n\nfunction copyCoords(dest, src) {\n  dest.page = dest.page || {};\n  dest.page.x = src.page.x;\n  dest.page.y = src.page.y;\n  dest.client = dest.client || {};\n  dest.client.x = src.client.x;\n  dest.client.y = src.client.y;\n  dest.timeStamp = src.timeStamp;\n}\nfunction setCoordDeltas(targetObj, prev, cur) {\n  targetObj.page.x = cur.page.x - prev.page.x;\n  targetObj.page.y = cur.page.y - prev.page.y;\n  targetObj.client.x = cur.client.x - prev.client.x;\n  targetObj.client.y = cur.client.y - prev.client.y;\n  targetObj.timeStamp = cur.timeStamp - prev.timeStamp;\n}\nfunction setCoordVelocity(targetObj, delta) {\n  const dt = Math.max(delta.timeStamp / 1000, 0.001);\n  targetObj.page.x = delta.page.x / dt;\n  targetObj.page.y = delta.page.y / dt;\n  targetObj.client.x = delta.client.x / dt;\n  targetObj.client.y = delta.client.y / dt;\n  targetObj.timeStamp = dt;\n}\nfunction setZeroCoords(targetObj) {\n  targetObj.page.x = 0;\n  targetObj.page.y = 0;\n  targetObj.client.x = 0;\n  targetObj.client.y = 0;\n}\nfunction isNativePointer(pointer) {\n  return pointer instanceof utils_domObjects.Event || pointer instanceof utils_domObjects.Touch;\n} // Get specified X/Y coords for mouse or event.touches[0]\n\nfunction getXY(type, pointer, xy) {\n  xy = xy || {};\n  type = type || 'page';\n  xy.x = pointer[type + 'X'];\n  xy.y = pointer[type + 'Y'];\n  return xy;\n}\nfunction getPageXY(pointer, page) {\n  page = page || {\n    x: 0,\n    y: 0\n  }; // Opera Mobile handles the viewport and scrolling oddly\n\n  if (utils_browser.isOperaMobile && isNativePointer(pointer)) {\n    getXY('screen', pointer, page);\n    page.x += window.scrollX;\n    page.y += window.scrollY;\n  } else {\n    getXY('page', pointer, page);\n  }\n\n  return page;\n}\nfunction getClientXY(pointer, client) {\n  client = client || {};\n\n  if (utils_browser.isOperaMobile && isNativePointer(pointer)) {\n    // Opera Mobile handles the viewport and scrolling oddly\n    getXY('screen', pointer, client);\n  } else {\n    getXY('client', pointer, client);\n  }\n\n  return client;\n}\nfunction getPointerId(pointer) {\n  return is.number(pointer.pointerId) ? pointer.pointerId : pointer.identifier;\n}\nfunction setCoords(dest, pointers, timeStamp) {\n  const pointer = pointers.length > 1 ? pointerAverage(pointers) : pointers[0];\n  getPageXY(pointer, dest.page);\n  getClientXY(pointer, dest.client);\n  dest.timeStamp = timeStamp;\n}\nfunction getTouchPair(event) {\n  const touches = []; // array of touches is supplied\n\n  if (is.array(event)) {\n    touches[0] = event[0];\n    touches[1] = event[1];\n  } // an event\n  else {\n      if (event.type === 'touchend') {\n        if (event.touches.length === 1) {\n          touches[0] = event.touches[0];\n          touches[1] = event.changedTouches[0];\n        } else if (event.touches.length === 0) {\n          touches[0] = event.changedTouches[0];\n          touches[1] = event.changedTouches[1];\n        }\n      } else {\n        touches[0] = event.touches[0];\n        touches[1] = event.touches[1];\n      }\n    }\n\n  return touches;\n}\nfunction pointerAverage(pointers) {\n  const average = {\n    pageX: 0,\n    pageY: 0,\n    clientX: 0,\n    clientY: 0,\n    screenX: 0,\n    screenY: 0\n  };\n\n  for (const pointer of pointers) {\n    for (const prop in average) {\n      average[prop] += pointer[prop];\n    }\n  }\n\n  for (const prop in average) {\n    average[prop] /= pointers.length;\n  }\n\n  return average;\n}\nfunction touchBBox(event) {\n  if (!event.length) {\n    return null;\n  }\n\n  const touches = getTouchPair(event);\n  const minX = Math.min(touches[0].pageX, touches[1].pageX);\n  const minY = Math.min(touches[0].pageY, touches[1].pageY);\n  const maxX = Math.max(touches[0].pageX, touches[1].pageX);\n  const maxY = Math.max(touches[0].pageY, touches[1].pageY);\n  return {\n    x: minX,\n    y: minY,\n    left: minX,\n    top: minY,\n    right: maxX,\n    bottom: maxY,\n    width: maxX - minX,\n    height: maxY - minY\n  };\n}\nfunction touchDistance(event, deltaSource) {\n  const sourceX = deltaSource + 'X';\n  const sourceY = deltaSource + 'Y';\n  const touches = getTouchPair(event);\n  const dx = touches[0][sourceX] - touches[1][sourceX];\n  const dy = touches[0][sourceY] - touches[1][sourceY];\n  return hypot(dx, dy);\n}\nfunction touchAngle(event, deltaSource) {\n  const sourceX = deltaSource + 'X';\n  const sourceY = deltaSource + 'Y';\n  const touches = getTouchPair(event);\n  const dx = touches[1][sourceX] - touches[0][sourceX];\n  const dy = touches[1][sourceY] - touches[0][sourceY];\n  const angle = 180 * Math.atan2(dy, dx) / Math.PI;\n  return angle;\n}\nfunction getPointerType(pointer) {\n  return is.string(pointer.pointerType) ? pointer.pointerType : is.number(pointer.pointerType) ? [undefined, undefined, 'touch', 'pen', 'mouse'][pointer.pointerType] // if the PointerEvent API isn't available, then the \"pointer\" must\n  // be either a MouseEvent, TouchEvent, or Touch object\n  : /touch/.test(pointer.type) || pointer instanceof utils_domObjects.Touch ? 'touch' : 'mouse';\n} // [ event.target, event.currentTarget ]\n\nfunction getEventTargets(event) {\n  const path = is.func(event.composedPath) ? event.composedPath() : event.path;\n  return [getActualElement(path ? path[0] : event.target), getActualElement(event.currentTarget)];\n}\nfunction newCoords() {\n  return {\n    page: {\n      x: 0,\n      y: 0\n    },\n    client: {\n      x: 0,\n      y: 0\n    },\n    timeStamp: 0\n  };\n}\nfunction coordsToEvent(coords) {\n  const event = {\n    coords,\n\n    get page() {\n      return this.coords.page;\n    },\n\n    get client() {\n      return this.coords.client;\n    },\n\n    get timeStamp() {\n      return this.coords.timeStamp;\n    },\n\n    get pageX() {\n      return this.coords.page.x;\n    },\n\n    get pageY() {\n      return this.coords.page.y;\n    },\n\n    get clientX() {\n      return this.coords.client.x;\n    },\n\n    get clientY() {\n      return this.coords.client.y;\n    },\n\n    get pointerId() {\n      return this.coords.pointerId;\n    },\n\n    get target() {\n      return this.coords.target;\n    },\n\n    get type() {\n      return this.coords.type;\n    },\n\n    get pointerType() {\n      return this.coords.pointerType;\n    },\n\n    get buttons() {\n      return this.coords.buttons;\n    },\n\n    preventDefault() {}\n\n  };\n  return event;\n}\n\n//# sourceMappingURL=pointerUtils.js.map\n// CONCATENATED MODULE: ./node_modules/@interactjs/core/events.js\n\n\n\n\n\n\n\n\nfunction install(scope) {\n  const targets = [];\n  const delegatedEvents = {};\n  const documents = [];\n  const eventsMethods = {\n    add,\n    remove,\n    addDelegate,\n    removeDelegate,\n    delegateListener,\n    delegateUseCapture,\n    delegatedEvents,\n    documents,\n    targets,\n    supportsOptions: false,\n    supportsPassive: false\n  }; // check if browser supports passive events and options arg\n\n  scope.document.createElement('div').addEventListener('test', null, {\n    get capture() {\n      return eventsMethods.supportsOptions = true;\n    },\n\n    get passive() {\n      return eventsMethods.supportsPassive = true;\n    }\n\n  });\n  scope.events = eventsMethods;\n\n  function add(eventTarget, type, listener, optionalArg) {\n    const options = getOptions(optionalArg);\n    let target = find(targets, t => t.eventTarget === eventTarget);\n\n    if (!target) {\n      target = {\n        eventTarget,\n        events: {}\n      };\n      targets.push(target);\n    }\n\n    if (!target.events[type]) {\n      target.events[type] = [];\n    }\n\n    if (eventTarget.addEventListener && !contains(target.events[type], listener)) {\n      eventTarget.addEventListener(type, listener, eventsMethods.supportsOptions ? options : options.capture);\n      target.events[type].push(listener);\n    }\n  }\n\n  function remove(eventTarget, type, listener, optionalArg) {\n    const options = getOptions(optionalArg);\n    const targetIndex = findIndex(targets, t => t.eventTarget === eventTarget);\n    const target = targets[targetIndex];\n\n    if (!target || !target.events) {\n      return;\n    }\n\n    if (type === 'all') {\n      for (type in target.events) {\n        if (target.events.hasOwnProperty(type)) {\n          remove(eventTarget, type, 'all');\n        }\n      }\n\n      return;\n    }\n\n    let typeIsEmpty = false;\n    const typeListeners = target.events[type];\n\n    if (typeListeners) {\n      if (listener === 'all') {\n        for (let i = typeListeners.length - 1; i >= 0; i--) {\n          remove(eventTarget, type, typeListeners[i], options);\n        }\n\n        return;\n      } else {\n        for (let i = 0; i < typeListeners.length; i++) {\n          if (typeListeners[i] === listener) {\n            eventTarget.removeEventListener(type, listener, eventsMethods.supportsOptions ? options : options.capture);\n            typeListeners.splice(i, 1);\n\n            if (typeListeners.length === 0) {\n              delete target.events[type];\n              typeIsEmpty = true;\n            }\n\n            break;\n          }\n        }\n      }\n    }\n\n    if (typeIsEmpty && !Object.keys(target.events).length) {\n      targets.splice(targetIndex, 1);\n    }\n  }\n\n  function addDelegate(selector, context, type, listener, optionalArg) {\n    const options = getOptions(optionalArg);\n\n    if (!delegatedEvents[type]) {\n      delegatedEvents[type] = []; // add delegate listener functions\n\n      for (const doc of documents) {\n        add(doc, type, delegateListener);\n        add(doc, type, delegateUseCapture, true);\n      }\n    }\n\n    const delegates = delegatedEvents[type];\n    let delegate = find(delegates, d => d.selector === selector && d.context === context);\n\n    if (!delegate) {\n      delegate = {\n        selector,\n        context,\n        listeners: []\n      };\n      delegates.push(delegate);\n    }\n\n    delegate.listeners.push([listener, options]);\n  }\n\n  function removeDelegate(selector, context, type, listener, optionalArg) {\n    const options = getOptions(optionalArg);\n    const delegates = delegatedEvents[type];\n    let matchFound = false;\n    let index;\n\n    if (!delegates) {\n      return;\n    } // count from last index of delegated to 0\n\n\n    for (index = delegates.length - 1; index >= 0; index--) {\n      const cur = delegates[index]; // look for matching selector and context Node\n\n      if (cur.selector === selector && cur.context === context) {\n        const {\n          listeners\n        } = cur; // each item of the listeners array is an array: [function, capture, passive]\n\n        for (let i = listeners.length - 1; i >= 0; i--) {\n          const [fn, {\n            capture,\n            passive\n          }] = listeners[i]; // check if the listener functions and capture and passive flags match\n\n          if (fn === listener && capture === options.capture && passive === options.passive) {\n            // remove the listener from the array of listeners\n            listeners.splice(i, 1); // if all listeners for this target have been removed\n            // remove the target from the delegates array\n\n            if (!listeners.length) {\n              delegates.splice(index, 1); // remove delegate function from context\n\n              remove(context, type, delegateListener);\n              remove(context, type, delegateUseCapture, true);\n            } // only remove one listener\n\n\n            matchFound = true;\n            break;\n          }\n        }\n\n        if (matchFound) {\n          break;\n        }\n      }\n    }\n  } // bound to the interactable context when a DOM event\n  // listener is added to a selector interactable\n\n\n  function delegateListener(event, optionalArg) {\n    const options = getOptions(optionalArg);\n    const fakeEvent = new events_FakeEvent(event);\n    const delegates = delegatedEvents[event.type];\n    const [eventTarget] = getEventTargets(event);\n    let element = eventTarget; // climb up document tree looking for selector matches\n\n    while (is.element(element)) {\n      for (let i = 0; i < delegates.length; i++) {\n        const cur = delegates[i];\n        const {\n          selector,\n          context\n        } = cur;\n\n        if (matchesSelector(element, selector) && nodeContains(context, eventTarget) && nodeContains(context, element)) {\n          const {\n            listeners\n          } = cur;\n          fakeEvent.currentTarget = element;\n\n          for (const [fn, {\n            capture,\n            passive\n          }] of listeners) {\n            if (capture === options.capture && passive === options.passive) {\n              fn(fakeEvent);\n            }\n          }\n        }\n      }\n\n      element = parentNode(element);\n    }\n  }\n\n  function delegateUseCapture(event) {\n    return delegateListener.call(this, event, true);\n  } // for type inferrence\n\n\n  return eventsMethods;\n}\n\nclass events_FakeEvent {\n  constructor(originalEvent) {\n    this.currentTarget = void 0;\n    this.originalEvent = void 0;\n    this.type = void 0;\n    this.originalEvent = originalEvent; // duplicate the event so that currentTarget can be changed\n\n    utils_pointerExtend(this, originalEvent);\n  }\n\n  preventOriginalDefault() {\n    this.originalEvent.preventDefault();\n  }\n\n  stopPropagation() {\n    this.originalEvent.stopPropagation();\n  }\n\n  stopImmediatePropagation() {\n    this.originalEvent.stopImmediatePropagation();\n  }\n\n}\n\nfunction getOptions(param) {\n  if (!is.object(param)) {\n    return {\n      capture: !!param,\n      passive: false\n    };\n  }\n\n  const options = extend({}, param);\n  options.capture = !!param.capture;\n  options.passive = !!param.passive;\n  return options;\n}\n\n/* harmony default export */ var events = ({\n  id: 'events',\n  install\n});\n//# sourceMappingURL=events.js.map\n// CONCATENATED MODULE: ./node_modules/@interactjs/utils/misc.js\n\nfunction warnOnce(method, message) {\n  let warned = false;\n  return function () {\n    if (!warned) {\n      win.console.warn(message);\n      warned = true;\n    }\n\n    return method.apply(this, arguments);\n  };\n}\nfunction copyAction(dest, src) {\n  dest.name = src.name;\n  dest.axis = src.axis;\n  dest.edges = src.edges;\n  return dest;\n}\n//# sourceMappingURL=misc.js.map\n// CONCATENATED MODULE: ./node_modules/@interactjs/core/interactStatic.js\n/** @module interact */\n\n\n\n\n\n\nfunction createInteractStatic(scope) {\n  /**\n   * ```js\n   * interact('#draggable').draggable(true)\n   *\n   * var rectables = interact('rect')\n   * rectables\n   *   .gesturable(true)\n   *   .on('gesturemove', function (event) {\n   *       // ...\n   *   })\n   * ```\n   *\n   * The methods of this variable can be used to set elements as interactables\n   * and also to change various default settings.\n   *\n   * Calling it as a function and passing an element or a valid CSS selector\n   * string returns an Interactable object which has various methods to configure\n   * it.\n   *\n   * @global\n   *\n   * @param {Element | string} target The HTML or SVG Element to interact with\n   * or CSS selector\n   * @return {Interactable}\n   */\n  const interact = (target, options) => {\n    let interactable = scope.interactables.get(target, options);\n\n    if (!interactable) {\n      interactable = scope.interactables.new(target, options);\n      interactable.events.global = interact.globalEvents;\n    }\n\n    return interactable;\n  }; // expose the functions used to calculate multi-touch properties\n\n\n  interact.getPointerAverage = pointerAverage;\n  interact.getTouchBBox = touchBBox;\n  interact.getTouchDistance = touchDistance;\n  interact.getTouchAngle = touchAngle;\n  interact.getElementRect = getElementRect;\n  interact.getElementClientRect = getElementClientRect;\n  interact.matchesSelector = matchesSelector;\n  interact.closest = domUtils_closest;\n  interact.globalEvents = {}; // eslint-disable-next-line no-undef\n\n  interact.version = \"1.10.2\";\n  interact.scope = scope;\n  /**\n  * Use a plugin\n  *\n  * @alias module:interact.use\n  *\n   */\n\n  interact.use = function (plugin, options) {\n    this.scope.usePlugin(plugin, options);\n    return this;\n  };\n  /**\n   * Check if an element or selector has been set with the {@link interact}\n   * function\n   *\n   * @alias module:interact.isSet\n   *\n   * @param {Target} target The Element or string being searched for\n   * @param {object} options\n   * @return {boolean} Indicates if the element or CSS selector was previously\n   * passed to interact\n   */\n\n\n  interact.isSet = function (target, options) {\n    return !!this.scope.interactables.get(target, options && options.context);\n  };\n  /**\n   * @deprecated\n   * Add a global listener for an InteractEvent or adds a DOM event to `document`\n   *\n   * @alias module:interact.on\n   *\n   * @param {string | array | object} type The types of events to listen for\n   * @param {function} listener The function event (s)\n   * @param {object | boolean} [options] object or useCapture flag for\n   * addEventListener\n   * @return {object} interact\n   */\n\n\n  interact.on = warnOnce(function on(type, listener, options) {\n    if (is.string(type) && type.search(' ') !== -1) {\n      type = type.trim().split(/ +/);\n    }\n\n    if (is.array(type)) {\n      for (const eventType of type) {\n        this.on(eventType, listener, options);\n      }\n\n      return this;\n    }\n\n    if (is.object(type)) {\n      for (const prop in type) {\n        this.on(prop, type[prop], listener);\n      }\n\n      return this;\n    } // if it is an InteractEvent type, add listener to globalEvents\n\n\n    if (isNonNativeEvent(type, this.scope.actions)) {\n      // if this type of event was never bound\n      if (!this.globalEvents[type]) {\n        this.globalEvents[type] = [listener];\n      } else {\n        this.globalEvents[type].push(listener);\n      }\n    } // If non InteractEvent type, addEventListener to document\n    else {\n        this.scope.events.add(this.scope.document, type, listener, {\n          options\n        });\n      }\n\n    return this;\n  }, 'The interact.on() method is being deprecated');\n  /**\n   * @deprecated\n   * Removes a global InteractEvent listener or DOM event from `document`\n   *\n   * @alias module:interact.off\n   *\n   * @param {string | array | object} type The types of events that were listened\n   * for\n   * @param {function} listener The listener function to be removed\n   * @param {object | boolean} options [options] object or useCapture flag for\n   * removeEventListener\n   * @return {object} interact\n   */\n\n  interact.off = warnOnce(function off(type, listener, options) {\n    if (is.string(type) && type.search(' ') !== -1) {\n      type = type.trim().split(/ +/);\n    }\n\n    if (is.array(type)) {\n      for (const eventType of type) {\n        this.off(eventType, listener, options);\n      }\n\n      return this;\n    }\n\n    if (is.object(type)) {\n      for (const prop in type) {\n        this.off(prop, type[prop], listener);\n      }\n\n      return this;\n    }\n\n    if (isNonNativeEvent(type, this.scope.actions)) {\n      let index;\n\n      if (type in this.globalEvents && (index = this.globalEvents[type].indexOf(listener)) !== -1) {\n        this.globalEvents[type].splice(index, 1);\n      }\n    } else {\n      this.scope.events.remove(this.scope.document, type, listener, options);\n    }\n\n    return this;\n  }, 'The interact.off() method is being deprecated');\n\n  interact.debug = function () {\n    return this.scope;\n  };\n  /**\n   * @alias module:interact.supportsTouch\n   *\n   * @return {boolean} Whether or not the browser supports touch input\n   */\n\n\n  interact.supportsTouch = function () {\n    return utils_browser.supportsTouch;\n  };\n  /**\n   * @alias module:interact.supportsPointerEvent\n   *\n   * @return {boolean} Whether or not the browser supports PointerEvents\n   */\n\n\n  interact.supportsPointerEvent = function () {\n    return utils_browser.supportsPointerEvent;\n  };\n  /**\n   * Cancels all interactions (end events are not fired)\n   *\n   * @alias module:interact.stop\n   *\n   * @return {object} interact\n   */\n\n\n  interact.stop = function () {\n    for (const interaction of this.scope.interactions.list) {\n      interaction.stop();\n    }\n\n    return this;\n  };\n  /**\n   * Returns or sets the distance the pointer must be moved before an action\n   * sequence occurs. This also affects tolerance for tap events.\n   *\n   * @alias module:interact.pointerMoveTolerance\n   *\n   * @param {number} [newValue] The movement from the start position must be greater than this value\n   * @return {interact | number}\n   */\n\n\n  interact.pointerMoveTolerance = function (newValue) {\n    if (is.number(newValue)) {\n      this.scope.interactions.pointerMoveTolerance = newValue;\n      return this;\n    }\n\n    return this.scope.interactions.pointerMoveTolerance;\n  };\n\n  interact.addDocument = function (doc, options) {\n    this.scope.addDocument(doc, options);\n  };\n\n  interact.removeDocument = function (doc) {\n    this.scope.removeDocument(doc);\n  };\n\n  return interact;\n}\n//# sourceMappingURL=interactStatic.js.map\n// CONCATENATED MODULE: ./node_modules/@interactjs/core/PointerInfo.js\nclass PointerInfo {\n  constructor(id, pointer, event, downTime, downTarget) {\n    this.id = void 0;\n    this.pointer = void 0;\n    this.event = void 0;\n    this.downTime = void 0;\n    this.downTarget = void 0;\n    this.id = id;\n    this.pointer = pointer;\n    this.event = event;\n    this.downTime = downTime;\n    this.downTarget = downTarget;\n  }\n\n}\n//# sourceMappingURL=PointerInfo.js.map\n// CONCATENATED MODULE: ./node_modules/@interactjs/core/Interaction.js\n\n\n\n\n\n\n\n\nlet _ProxyValues;\n\n(function (_ProxyValues) {\n  _ProxyValues[\"interactable\"] = \"\";\n  _ProxyValues[\"element\"] = \"\";\n  _ProxyValues[\"prepared\"] = \"\";\n  _ProxyValues[\"pointerIsDown\"] = \"\";\n  _ProxyValues[\"pointerWasMoved\"] = \"\";\n  _ProxyValues[\"_proxy\"] = \"\";\n})(_ProxyValues || (_ProxyValues = {}));\n\nlet _ProxyMethods;\n\n(function (_ProxyMethods) {\n  _ProxyMethods[\"start\"] = \"\";\n  _ProxyMethods[\"move\"] = \"\";\n  _ProxyMethods[\"end\"] = \"\";\n  _ProxyMethods[\"stop\"] = \"\";\n  _ProxyMethods[\"interacting\"] = \"\";\n})(_ProxyMethods || (_ProxyMethods = {}));\n\nlet idCounter = 0;\nclass Interaction_Interaction {\n  // current interactable being interacted with\n  // the target element of the interactable\n  // action that's ready to be fired on next move event\n  // keep track of added pointers\n  // pointerdown/mousedown/touchstart event\n  // previous action event\n\n  /** @internal */\n  get pointerMoveTolerance() {\n    return 1;\n  }\n  /**\n   * @alias Interaction.prototype.move\n   */\n\n\n  /** */\n  constructor({\n    pointerType,\n    scopeFire\n  }) {\n    this.interactable = null;\n    this.element = null;\n    this.rect = void 0;\n    this._rects = void 0;\n    this.edges = void 0;\n    this._scopeFire = void 0;\n    this.prepared = {\n      name: null,\n      axis: null,\n      edges: null\n    };\n    this.pointerType = void 0;\n    this.pointers = [];\n    this.downEvent = null;\n    this.downPointer = {};\n    this._latestPointer = {\n      pointer: null,\n      event: null,\n      eventTarget: null\n    };\n    this.prevEvent = null;\n    this.pointerIsDown = false;\n    this.pointerWasMoved = false;\n    this._interacting = false;\n    this._ending = false;\n    this._stopped = true;\n    this._proxy = null;\n    this.simulation = null;\n    this.doMove = warnOnce(function (signalArg) {\n      this.move(signalArg);\n    }, 'The interaction.doMove() method has been renamed to interaction.move()');\n    this.coords = {\n      // Starting InteractEvent pointer coordinates\n      start: newCoords(),\n      // Previous native pointer move event coordinates\n      prev: newCoords(),\n      // current native pointer move event coordinates\n      cur: newCoords(),\n      // Change in coordinates and time of the pointer\n      delta: newCoords(),\n      // pointer velocity\n      velocity: newCoords()\n    };\n    this._id = idCounter++;\n    this._scopeFire = scopeFire;\n    this.pointerType = pointerType;\n    const that = this;\n    this._proxy = {};\n\n    for (const key in _ProxyValues) {\n      Object.defineProperty(this._proxy, key, {\n        get() {\n          return that[key];\n        }\n\n      });\n    }\n\n    for (const key in _ProxyMethods) {\n      Object.defineProperty(this._proxy, key, {\n        value: (...args) => that[key](...args)\n      });\n    }\n\n    this._scopeFire('interactions:new', {\n      interaction: this\n    });\n  }\n\n  pointerDown(pointer, event, eventTarget) {\n    const pointerIndex = this.updatePointer(pointer, event, eventTarget, true);\n    const pointerInfo = this.pointers[pointerIndex];\n\n    this._scopeFire('interactions:down', {\n      pointer,\n      event,\n      eventTarget,\n      pointerIndex,\n      pointerInfo,\n      type: 'down',\n      interaction: this\n    });\n  }\n  /**\n   * ```js\n   * interact(target)\n   *   .draggable({\n   *     // disable the default drag start by down->move\n   *     manualStart: true\n   *   })\n   *   // start dragging after the user holds the pointer down\n   *   .on('hold', function (event) {\n   *     var interaction = event.interaction\n   *\n   *     if (!interaction.interacting()) {\n   *       interaction.start({ name: 'drag' },\n   *                         event.interactable,\n   *                         event.currentTarget)\n   *     }\n   * })\n   * ```\n   *\n   * Start an action with the given Interactable and Element as tartgets. The\n   * action must be enabled for the target Interactable and an appropriate\n   * number of pointers must be held down - 1 for drag/resize, 2 for gesture.\n   *\n   * Use it with `interactable.<action>able({ manualStart: false })` to always\n   * [start actions manually](https://github.com/taye/interact.js/issues/114)\n   *\n   * @param {object} action   The action to be performed - drag, resize, etc.\n   * @param {Interactable} target  The Interactable to target\n   * @param {Element} element The DOM Element to target\n   * @return {Boolean} Whether the interaction was successfully started\n   */\n\n\n  start(action, interactable, element) {\n    if (this.interacting() || !this.pointerIsDown || this.pointers.length < (action.name === 'gesture' ? 2 : 1) || !interactable.options[action.name].enabled) {\n      return false;\n    }\n\n    copyAction(this.prepared, action);\n    this.interactable = interactable;\n    this.element = element;\n    this.rect = interactable.getRect(element);\n    this.edges = this.prepared.edges ? extend({}, this.prepared.edges) : {\n      left: true,\n      right: true,\n      top: true,\n      bottom: true\n    };\n    this._stopped = false;\n    this._interacting = this._doPhase({\n      interaction: this,\n      event: this.downEvent,\n      phase: 'start'\n    }) && !this._stopped;\n    return this._interacting;\n  }\n\n  pointerMove(pointer, event, eventTarget) {\n    if (!this.simulation && !(this.modification && this.modification.endResult)) {\n      this.updatePointer(pointer, event, eventTarget, false);\n    }\n\n    const duplicateMove = this.coords.cur.page.x === this.coords.prev.page.x && this.coords.cur.page.y === this.coords.prev.page.y && this.coords.cur.client.x === this.coords.prev.client.x && this.coords.cur.client.y === this.coords.prev.client.y;\n    let dx;\n    let dy; // register movement greater than pointerMoveTolerance\n\n    if (this.pointerIsDown && !this.pointerWasMoved) {\n      dx = this.coords.cur.client.x - this.coords.start.client.x;\n      dy = this.coords.cur.client.y - this.coords.start.client.y;\n      this.pointerWasMoved = hypot(dx, dy) > this.pointerMoveTolerance;\n    }\n\n    const pointerIndex = this.getPointerIndex(pointer);\n    const signalArg = {\n      pointer,\n      pointerIndex,\n      pointerInfo: this.pointers[pointerIndex],\n      event,\n      type: 'move',\n      eventTarget,\n      dx,\n      dy,\n      duplicate: duplicateMove,\n      interaction: this\n    };\n\n    if (!duplicateMove) {\n      // set pointer coordinate, time changes and velocity\n      setCoordVelocity(this.coords.velocity, this.coords.delta);\n    }\n\n    this._scopeFire('interactions:move', signalArg);\n\n    if (!duplicateMove && !this.simulation) {\n      // if interacting, fire an 'action-move' signal etc\n      if (this.interacting()) {\n        signalArg.type = null;\n        this.move(signalArg);\n      }\n\n      if (this.pointerWasMoved) {\n        copyCoords(this.coords.prev, this.coords.cur);\n      }\n    }\n  }\n  /**\n   * ```js\n   * interact(target)\n   *   .draggable(true)\n   *   .on('dragmove', function (event) {\n   *     if (someCondition) {\n   *       // change the snap settings\n   *       event.interactable.draggable({ snap: { targets: [] }})\n   *       // fire another move event with re-calculated snap\n   *       event.interaction.move()\n   *     }\n   *   })\n   * ```\n   *\n   * Force a move of the current action at the same coordinates. Useful if\n   * snap/restrict has been changed and you want a movement with the new\n   * settings.\n   */\n\n\n  move(signalArg) {\n    if (!signalArg || !signalArg.event) {\n      setZeroCoords(this.coords.delta);\n    }\n\n    signalArg = extend({\n      pointer: this._latestPointer.pointer,\n      event: this._latestPointer.event,\n      eventTarget: this._latestPointer.eventTarget,\n      interaction: this\n    }, signalArg || {});\n    signalArg.phase = 'move';\n\n    this._doPhase(signalArg);\n  } // End interact move events and stop auto-scroll unless simulation is running\n\n\n  pointerUp(pointer, event, eventTarget, curEventTarget) {\n    let pointerIndex = this.getPointerIndex(pointer);\n\n    if (pointerIndex === -1) {\n      pointerIndex = this.updatePointer(pointer, event, eventTarget, false);\n    }\n\n    const type = /cancel$/i.test(event.type) ? 'cancel' : 'up';\n\n    this._scopeFire(`interactions:${type}`, {\n      pointer,\n      pointerIndex,\n      pointerInfo: this.pointers[pointerIndex],\n      event,\n      eventTarget,\n      type: type,\n      curEventTarget,\n      interaction: this\n    });\n\n    if (!this.simulation) {\n      this.end(event);\n    }\n\n    this.removePointer(pointer, event);\n  }\n\n  documentBlur(event) {\n    this.end(event);\n\n    this._scopeFire('interactions:blur', {\n      event,\n      type: 'blur',\n      interaction: this\n    });\n  }\n  /**\n   * ```js\n   * interact(target)\n   *   .draggable(true)\n   *   .on('move', function (event) {\n   *     if (event.pageX > 1000) {\n   *       // end the current action\n   *       event.interaction.end()\n   *       // stop all further listeners from being called\n   *       event.stopImmediatePropagation()\n   *     }\n   *   })\n   * ```\n   *\n   * @param {PointerEvent} [event]\n   */\n\n\n  end(event) {\n    this._ending = true;\n    event = event || this._latestPointer.event;\n    let endPhaseResult;\n\n    if (this.interacting()) {\n      endPhaseResult = this._doPhase({\n        event,\n        interaction: this,\n        phase: 'end'\n      });\n    }\n\n    this._ending = false;\n\n    if (endPhaseResult === true) {\n      this.stop();\n    }\n  }\n\n  currentAction() {\n    return this._interacting ? this.prepared.name : null;\n  }\n\n  interacting() {\n    return this._interacting;\n  }\n  /** */\n\n\n  stop() {\n    this._scopeFire('interactions:stop', {\n      interaction: this\n    });\n\n    this.interactable = this.element = null;\n    this._interacting = false;\n    this._stopped = true;\n    this.prepared.name = this.prevEvent = null;\n  }\n\n  getPointerIndex(pointer) {\n    const pointerId = getPointerId(pointer); // mouse and pen interactions may have only one pointer\n\n    return this.pointerType === 'mouse' || this.pointerType === 'pen' ? this.pointers.length - 1 : findIndex(this.pointers, curPointer => curPointer.id === pointerId);\n  }\n\n  getPointerInfo(pointer) {\n    return this.pointers[this.getPointerIndex(pointer)];\n  }\n\n  updatePointer(pointer, event, eventTarget, down) {\n    const id = getPointerId(pointer);\n    let pointerIndex = this.getPointerIndex(pointer);\n    let pointerInfo = this.pointers[pointerIndex];\n    down = down === false ? false : down || /(down|start)$/i.test(event.type);\n\n    if (!pointerInfo) {\n      pointerInfo = new PointerInfo(id, pointer, event, null, null);\n      pointerIndex = this.pointers.length;\n      this.pointers.push(pointerInfo);\n    } else {\n      pointerInfo.pointer = pointer;\n    }\n\n    setCoords(this.coords.cur, this.pointers.map(p => p.pointer), this._now());\n    setCoordDeltas(this.coords.delta, this.coords.prev, this.coords.cur);\n\n    if (down) {\n      this.pointerIsDown = true;\n      pointerInfo.downTime = this.coords.cur.timeStamp;\n      pointerInfo.downTarget = eventTarget;\n      utils_pointerExtend(this.downPointer, pointer);\n\n      if (!this.interacting()) {\n        copyCoords(this.coords.start, this.coords.cur);\n        copyCoords(this.coords.prev, this.coords.cur);\n        this.downEvent = event;\n        this.pointerWasMoved = false;\n      }\n    }\n\n    this._updateLatestPointer(pointer, event, eventTarget);\n\n    this._scopeFire('interactions:update-pointer', {\n      pointer,\n      event,\n      eventTarget,\n      down,\n      pointerInfo,\n      pointerIndex,\n      interaction: this\n    });\n\n    return pointerIndex;\n  }\n\n  removePointer(pointer, event) {\n    const pointerIndex = this.getPointerIndex(pointer);\n\n    if (pointerIndex === -1) {\n      return;\n    }\n\n    const pointerInfo = this.pointers[pointerIndex];\n\n    this._scopeFire('interactions:remove-pointer', {\n      pointer,\n      event,\n      eventTarget: null,\n      pointerIndex,\n      pointerInfo,\n      interaction: this\n    });\n\n    this.pointers.splice(pointerIndex, 1);\n    this.pointerIsDown = false;\n  }\n\n  _updateLatestPointer(pointer, event, eventTarget) {\n    this._latestPointer.pointer = pointer;\n    this._latestPointer.event = event;\n    this._latestPointer.eventTarget = eventTarget;\n  }\n\n  destroy() {\n    this._latestPointer.pointer = null;\n    this._latestPointer.event = null;\n    this._latestPointer.eventTarget = null;\n  }\n\n  _createPreparedEvent(event, phase, preEnd, type) {\n    return new InteractEvent_InteractEvent(this, event, this.prepared.name, phase, this.element, preEnd, type);\n  }\n\n  _fireEvent(iEvent) {\n    this.interactable.fire(iEvent);\n\n    if (!this.prevEvent || iEvent.timeStamp >= this.prevEvent.timeStamp) {\n      this.prevEvent = iEvent;\n    }\n  }\n\n  _doPhase(signalArg) {\n    const {\n      event,\n      phase,\n      preEnd,\n      type\n    } = signalArg;\n    const {\n      rect\n    } = this;\n\n    if (rect && phase === 'move') {\n      // update the rect changes due to pointer move\n      addEdges(this.edges, rect, this.coords.delta[this.interactable.options.deltaSource]);\n      rect.width = rect.right - rect.left;\n      rect.height = rect.bottom - rect.top;\n    }\n\n    const beforeResult = this._scopeFire(`interactions:before-action-${phase}`, signalArg);\n\n    if (beforeResult === false) {\n      return false;\n    }\n\n    const iEvent = signalArg.iEvent = this._createPreparedEvent(event, phase, preEnd, type);\n\n    this._scopeFire(`interactions:action-${phase}`, signalArg);\n\n    if (phase === 'start') {\n      this.prevEvent = iEvent;\n    }\n\n    this._fireEvent(iEvent);\n\n    this._scopeFire(`interactions:after-action-${phase}`, signalArg);\n\n    return true;\n  }\n\n  _now() {\n    return Date.now();\n  }\n\n}\n/* harmony default export */ var core_Interaction = (Interaction_Interaction);\n\n//# sourceMappingURL=Interaction.js.map\n// CONCATENATED MODULE: ./node_modules/@interactjs/core/interactablePreventDefault.js\n\n\n\n\n\nfunction preventDefault(newValue) {\n  if (/^(always|never|auto)$/.test(newValue)) {\n    this.options.preventDefault = newValue;\n    return this;\n  }\n\n  if (is.bool(newValue)) {\n    this.options.preventDefault = newValue ? 'always' : 'never';\n    return this;\n  }\n\n  return this.options.preventDefault;\n}\n\nfunction checkAndPreventDefault(interactable, scope, event) {\n  const setting = interactable.options.preventDefault;\n\n  if (setting === 'never') {\n    return;\n  }\n\n  if (setting === 'always') {\n    event.preventDefault();\n    return;\n  } // setting === 'auto'\n  // if the browser supports passive event listeners and isn't running on iOS,\n  // don't preventDefault of touch{start,move} events. CSS touch-action and\n  // user-select should be used instead of calling event.preventDefault().\n\n\n  if (scope.events.supportsPassive && /^touch(start|move)$/.test(event.type)) {\n    const doc = getWindow(event.target).document;\n    const docOptions = scope.getDocOptions(doc);\n\n    if (!(docOptions && docOptions.events) || docOptions.events.passive !== false) {\n      return;\n    }\n  } // don't preventDefault of pointerdown events\n\n\n  if (/^(mouse|pointer|touch)*(down|start)/i.test(event.type)) {\n    return;\n  } // don't preventDefault on editable elements\n\n\n  if (is.element(event.target) && matchesSelector(event.target, 'input,select,textarea,[contenteditable=true],[contenteditable=true] *')) {\n    return;\n  }\n\n  event.preventDefault();\n}\n\nfunction onInteractionEvent({\n  interaction,\n  event\n}) {\n  if (interaction.interactable) {\n    interaction.interactable.checkAndPreventDefault(event);\n  }\n}\n\nfunction interactablePreventDefault_install(scope) {\n  /** @lends Interactable */\n  const {\n    Interactable\n  } = scope;\n  /**\n   * Returns or sets whether to prevent the browser's default behaviour in\n   * response to pointer events. Can be set to:\n   *  - `'always'` to always prevent\n   *  - `'never'` to never prevent\n   *  - `'auto'` to let interact.js try to determine what would be best\n   *\n   * @param {string} [newValue] `'always'`, `'never'` or `'auto'`\n   * @return {string | Interactable} The current setting or this Interactable\n   */\n\n  Interactable.prototype.preventDefault = preventDefault;\n\n  Interactable.prototype.checkAndPreventDefault = function (event) {\n    return checkAndPreventDefault(this, scope, event);\n  }; // prevent native HTML5 drag on interact.js target elements\n\n\n  scope.interactions.docEvents.push({\n    type: 'dragstart',\n\n    listener(event) {\n      for (const interaction of scope.interactions.list) {\n        if (interaction.element && (interaction.element === event.target || nodeContains(interaction.element, event.target))) {\n          interaction.interactable.checkAndPreventDefault(event);\n          return;\n        }\n      }\n    }\n\n  });\n}\n/* harmony default export */ var interactablePreventDefault = ({\n  id: 'core/interactablePreventDefault',\n  install: interactablePreventDefault_install,\n  listeners: ['down', 'move', 'up', 'cancel'].reduce((acc, eventType) => {\n    acc[`interactions:${eventType}`] = onInteractionEvent;\n    return acc;\n  }, {})\n});\n//# sourceMappingURL=interactablePreventDefault.js.map\n// CONCATENATED MODULE: ./node_modules/@interactjs/core/interactionFinder.js\n\nconst finder = {\n  methodOrder: ['simulationResume', 'mouseOrPen', 'hasPointer', 'idle'],\n\n  search(details) {\n    for (const method of finder.methodOrder) {\n      const interaction = finder[method](details);\n\n      if (interaction) {\n        return interaction;\n      }\n    }\n\n    return null;\n  },\n\n  // try to resume simulation with a new pointer\n  simulationResume({\n    pointerType,\n    eventType,\n    eventTarget,\n    scope\n  }) {\n    if (!/down|start/i.test(eventType)) {\n      return null;\n    }\n\n    for (const interaction of scope.interactions.list) {\n      let element = eventTarget;\n\n      if (interaction.simulation && interaction.simulation.allowResume && interaction.pointerType === pointerType) {\n        while (element) {\n          // if the element is the interaction element\n          if (element === interaction.element) {\n            return interaction;\n          }\n\n          element = parentNode(element);\n        }\n      }\n    }\n\n    return null;\n  },\n\n  // if it's a mouse or pen interaction\n  mouseOrPen({\n    pointerId,\n    pointerType,\n    eventType,\n    scope\n  }) {\n    if (pointerType !== 'mouse' && pointerType !== 'pen') {\n      return null;\n    }\n\n    let firstNonActive;\n\n    for (const interaction of scope.interactions.list) {\n      if (interaction.pointerType === pointerType) {\n        // if it's a down event, skip interactions with running simulations\n        if (interaction.simulation && !hasPointerId(interaction, pointerId)) {\n          continue;\n        } // if the interaction is active, return it immediately\n\n\n        if (interaction.interacting()) {\n          return interaction;\n        } // otherwise save it and look for another active interaction\n        else if (!firstNonActive) {\n            firstNonActive = interaction;\n          }\n      }\n    } // if no active mouse interaction was found use the first inactive mouse\n    // interaction\n\n\n    if (firstNonActive) {\n      return firstNonActive;\n    } // find any mouse or pen interaction.\n    // ignore the interaction if the eventType is a *down, and a simulation\n    // is active\n\n\n    for (const interaction of scope.interactions.list) {\n      if (interaction.pointerType === pointerType && !(/down/i.test(eventType) && interaction.simulation)) {\n        return interaction;\n      }\n    }\n\n    return null;\n  },\n\n  // get interaction that has this pointer\n  hasPointer({\n    pointerId,\n    scope\n  }) {\n    for (const interaction of scope.interactions.list) {\n      if (hasPointerId(interaction, pointerId)) {\n        return interaction;\n      }\n    }\n\n    return null;\n  },\n\n  // get first idle interaction with a matching pointerType\n  idle({\n    pointerType,\n    scope\n  }) {\n    for (const interaction of scope.interactions.list) {\n      // if there's already a pointer held down\n      if (interaction.pointers.length === 1) {\n        const target = interaction.interactable; // don't add this pointer if there is a target interactable and it\n        // isn't gesturable\n\n        if (target && !(target.options.gesture && target.options.gesture.enabled)) {\n          continue;\n        }\n      } // maximum of 2 pointers per interaction\n      else if (interaction.pointers.length >= 2) {\n          continue;\n        }\n\n      if (!interaction.interacting() && pointerType === interaction.pointerType) {\n        return interaction;\n      }\n    }\n\n    return null;\n  }\n\n};\n\nfunction hasPointerId(interaction, pointerId) {\n  return interaction.pointers.some(({\n    id\n  }) => id === pointerId);\n}\n\n/* harmony default export */ var interactionFinder = (finder);\n//# sourceMappingURL=interactionFinder.js.map\n// CONCATENATED MODULE: ./node_modules/@interactjs/core/interactions.js\n\n\n\n\n\n\n\n\nconst methodNames = ['pointerDown', 'pointerMove', 'pointerUp', 'updatePointer', 'removePointer', 'windowBlur'];\n\nfunction interactions_install(scope) {\n  const listeners = {};\n\n  for (const method of methodNames) {\n    listeners[method] = doOnInteractions(method, scope);\n  }\n\n  const pEventTypes = utils_browser.pEventTypes;\n  let docEvents;\n\n  if (utils_domObjects.PointerEvent) {\n    docEvents = [{\n      type: pEventTypes.down,\n      listener: releasePointersOnRemovedEls\n    }, {\n      type: pEventTypes.down,\n      listener: listeners.pointerDown\n    }, {\n      type: pEventTypes.move,\n      listener: listeners.pointerMove\n    }, {\n      type: pEventTypes.up,\n      listener: listeners.pointerUp\n    }, {\n      type: pEventTypes.cancel,\n      listener: listeners.pointerUp\n    }];\n  } else {\n    docEvents = [{\n      type: 'mousedown',\n      listener: listeners.pointerDown\n    }, {\n      type: 'mousemove',\n      listener: listeners.pointerMove\n    }, {\n      type: 'mouseup',\n      listener: listeners.pointerUp\n    }, {\n      type: 'touchstart',\n      listener: releasePointersOnRemovedEls\n    }, {\n      type: 'touchstart',\n      listener: listeners.pointerDown\n    }, {\n      type: 'touchmove',\n      listener: listeners.pointerMove\n    }, {\n      type: 'touchend',\n      listener: listeners.pointerUp\n    }, {\n      type: 'touchcancel',\n      listener: listeners.pointerUp\n    }];\n  }\n\n  docEvents.push({\n    type: 'blur',\n\n    listener(event) {\n      for (const interaction of scope.interactions.list) {\n        interaction.documentBlur(event);\n      }\n    }\n\n  }); // for ignoring browser's simulated mouse events\n\n  scope.prevTouchTime = 0;\n  scope.Interaction = class extends core_Interaction {\n    get pointerMoveTolerance() {\n      return scope.interactions.pointerMoveTolerance;\n    }\n\n    set pointerMoveTolerance(value) {\n      scope.interactions.pointerMoveTolerance = value;\n    }\n\n    _now() {\n      return scope.now();\n    }\n\n  };\n  scope.interactions = {\n    // all active and idle interactions\n    list: [],\n\n    new(options) {\n      options.scopeFire = (name, arg) => scope.fire(name, arg);\n\n      const interaction = new scope.Interaction(options);\n      scope.interactions.list.push(interaction);\n      return interaction;\n    },\n\n    listeners,\n    docEvents,\n    pointerMoveTolerance: 1\n  };\n\n  function releasePointersOnRemovedEls() {\n    // for all inactive touch interactions with pointers down\n    for (const interaction of scope.interactions.list) {\n      if (!interaction.pointerIsDown || interaction.pointerType !== 'touch' || interaction._interacting) {\n        continue;\n      } // if a pointer is down on an element that is no longer in the DOM tree\n\n\n      for (const pointer of interaction.pointers) {\n        if (!scope.documents.some(({\n          doc\n        }) => nodeContains(doc, pointer.downTarget))) {\n          // remove the pointer from the interaction\n          interaction.removePointer(pointer.pointer, pointer.event);\n        }\n      }\n    }\n  }\n\n  scope.usePlugin(interactablePreventDefault);\n}\n\nfunction doOnInteractions(method, scope) {\n  return function (event) {\n    const interactions = scope.interactions.list;\n    const pointerType = getPointerType(event);\n    const [eventTarget, curEventTarget] = getEventTargets(event);\n    const matches = []; // [ [pointer, interaction], ...]\n\n    if (/^touch/.test(event.type)) {\n      scope.prevTouchTime = scope.now(); // @ts-expect-error\n\n      for (const changedTouch of event.changedTouches) {\n        const pointer = changedTouch;\n        const pointerId = getPointerId(pointer);\n        const searchDetails = {\n          pointer,\n          pointerId,\n          pointerType,\n          eventType: event.type,\n          eventTarget,\n          curEventTarget,\n          scope\n        };\n        const interaction = getInteraction(searchDetails);\n        matches.push([searchDetails.pointer, searchDetails.eventTarget, searchDetails.curEventTarget, interaction]);\n      }\n    } else {\n      let invalidPointer = false;\n\n      if (!utils_browser.supportsPointerEvent && /mouse/.test(event.type)) {\n        // ignore mouse events while touch interactions are active\n        for (let i = 0; i < interactions.length && !invalidPointer; i++) {\n          invalidPointer = interactions[i].pointerType !== 'mouse' && interactions[i].pointerIsDown;\n        } // try to ignore mouse events that are simulated by the browser\n        // after a touch event\n\n\n        invalidPointer = invalidPointer || scope.now() - scope.prevTouchTime < 500 || // on iOS and Firefox Mobile, MouseEvent.timeStamp is zero if simulated\n        event.timeStamp === 0;\n      }\n\n      if (!invalidPointer) {\n        const searchDetails = {\n          pointer: event,\n          pointerId: getPointerId(event),\n          pointerType,\n          eventType: event.type,\n          curEventTarget,\n          eventTarget,\n          scope\n        };\n        const interaction = getInteraction(searchDetails);\n        matches.push([searchDetails.pointer, searchDetails.eventTarget, searchDetails.curEventTarget, interaction]);\n      }\n    } // eslint-disable-next-line no-shadow\n\n\n    for (const [pointer, eventTarget, curEventTarget, interaction] of matches) {\n      interaction[method](pointer, event, eventTarget, curEventTarget);\n    }\n  };\n}\n\nfunction getInteraction(searchDetails) {\n  const {\n    pointerType,\n    scope\n  } = searchDetails;\n  const foundInteraction = interactionFinder.search(searchDetails);\n  const signalArg = {\n    interaction: foundInteraction,\n    searchDetails\n  };\n  scope.fire('interactions:find', signalArg);\n  return signalArg.interaction || scope.interactions.new({\n    pointerType\n  });\n}\n\nfunction onDocSignal({\n  doc,\n  scope,\n  options\n}, eventMethodName) {\n  const {\n    interactions: {\n      docEvents\n    },\n    events\n  } = scope;\n  const eventMethod = events[eventMethodName];\n\n  if (scope.browser.isIOS && !options.events) {\n    options.events = {\n      passive: false\n    };\n  } // delegate event listener\n\n\n  for (const eventType in events.delegatedEvents) {\n    eventMethod(doc, eventType, events.delegateListener);\n    eventMethod(doc, eventType, events.delegateUseCapture, true);\n  }\n\n  const eventOptions = options && options.events;\n\n  for (const {\n    type,\n    listener\n  } of docEvents) {\n    eventMethod(doc, type, listener, eventOptions);\n  }\n}\n\nconst interactions_interactions = {\n  id: 'core/interactions',\n  install: interactions_install,\n  listeners: {\n    'scope:add-document': arg => onDocSignal(arg, 'add'),\n    'scope:remove-document': arg => onDocSignal(arg, 'remove'),\n    'interactable:unset': ({\n      interactable\n    }, scope) => {\n      // Stop and destroy related interactions when an Interactable is unset\n      for (let i = scope.interactions.list.length - 1; i >= 0; i--) {\n        const interaction = scope.interactions.list[i];\n\n        if (interaction.interactable !== interactable) {\n          continue;\n        }\n\n        interaction.stop();\n        scope.fire('interactions:destroy', {\n          interaction\n        });\n        interaction.destroy();\n\n        if (scope.interactions.list.length > 2) {\n          scope.interactions.list.splice(i, 1);\n        }\n      }\n    }\n  },\n  onDocSignal,\n  doOnInteractions,\n  methodNames\n};\n/* harmony default export */ var core_interactions = (interactions_interactions);\n//# sourceMappingURL=interactions.js.map\n// CONCATENATED MODULE: ./node_modules/@interactjs/core/scope.js\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nclass scope_Scope {\n  // main window\n  // main document\n  // main window\n  // all documents being listened to\n  constructor() {\n    this.id = `__interact_scope_${Math.floor(Math.random() * 100)}`;\n    this.isInitialized = false;\n    this.listenerMaps = [];\n    this.browser = utils_browser;\n    this.defaults = clone(defaultOptions_defaults);\n    this.Eventable = Eventable_Eventable;\n    this.actions = {\n      map: {},\n      phases: {\n        start: true,\n        move: true,\n        end: true\n      },\n      methodDict: {},\n      phaselessTypes: {}\n    };\n    this.interactStatic = createInteractStatic(this);\n    this.InteractEvent = InteractEvent_InteractEvent;\n    this.Interactable = void 0;\n    this.interactables = new InteractableSet_InteractableSet(this);\n    this._win = void 0;\n    this.document = void 0;\n    this.window = void 0;\n    this.documents = [];\n    this._plugins = {\n      list: [],\n      map: {}\n    };\n\n    this.onWindowUnload = event => this.removeDocument(event.target);\n\n    const scope = this;\n    this.Interactable = class extends Interactable_Interactable {\n      get _defaults() {\n        return scope.defaults;\n      }\n\n      set(options) {\n        super.set(options);\n        scope.fire('interactable:set', {\n          options,\n          interactable: this\n        });\n        return this;\n      }\n\n      unset() {\n        super.unset();\n        scope.interactables.list.splice(scope.interactables.list.indexOf(this), 1);\n        scope.fire('interactable:unset', {\n          interactable: this\n        });\n      }\n\n    };\n  }\n\n  addListeners(map, id) {\n    this.listenerMaps.push({\n      id,\n      map\n    });\n  }\n\n  fire(name, arg) {\n    for (const {\n      map: {\n        [name]: listener\n      }\n    } of this.listenerMaps) {\n      if (!!listener && listener(arg, this, name) === false) {\n        return false;\n      }\n    }\n  }\n\n  init(window) {\n    return this.isInitialized ? this : initScope(this, window);\n  }\n\n  pluginIsInstalled(plugin) {\n    return this._plugins.map[plugin.id] || this._plugins.list.indexOf(plugin) !== -1;\n  }\n\n  usePlugin(plugin, options) {\n    if (!this.isInitialized) {\n      return this;\n    }\n\n    if (this.pluginIsInstalled(plugin)) {\n      return this;\n    }\n\n    if (plugin.id) {\n      this._plugins.map[plugin.id] = plugin;\n    }\n\n    this._plugins.list.push(plugin);\n\n    if (plugin.install) {\n      plugin.install(this, options);\n    }\n\n    if (plugin.listeners && plugin.before) {\n      let index = 0;\n      const len = this.listenerMaps.length;\n      const before = plugin.before.reduce((acc, id) => {\n        acc[id] = true;\n        acc[pluginIdRoot(id)] = true;\n        return acc;\n      }, {});\n\n      for (; index < len; index++) {\n        const otherId = this.listenerMaps[index].id;\n\n        if (before[otherId] || before[pluginIdRoot(otherId)]) {\n          break;\n        }\n      }\n\n      this.listenerMaps.splice(index, 0, {\n        id: plugin.id,\n        map: plugin.listeners\n      });\n    } else if (plugin.listeners) {\n      this.listenerMaps.push({\n        id: plugin.id,\n        map: plugin.listeners\n      });\n    }\n\n    return this;\n  }\n\n  addDocument(doc, options) {\n    // do nothing if document is already known\n    if (this.getDocIndex(doc) !== -1) {\n      return false;\n    }\n\n    const window = getWindow(doc);\n    options = options ? extend({}, options) : {};\n    this.documents.push({\n      doc,\n      options\n    });\n    this.events.documents.push(doc); // don't add an unload event for the main document\n    // so that the page may be cached in browser history\n\n    if (doc !== this.document) {\n      this.events.add(window, 'unload', this.onWindowUnload);\n    }\n\n    this.fire('scope:add-document', {\n      doc,\n      window,\n      scope: this,\n      options\n    });\n  }\n\n  removeDocument(doc) {\n    const index = this.getDocIndex(doc);\n    const window = getWindow(doc);\n    const options = this.documents[index].options;\n    this.events.remove(window, 'unload', this.onWindowUnload);\n    this.documents.splice(index, 1);\n    this.events.documents.splice(index, 1);\n    this.fire('scope:remove-document', {\n      doc,\n      window,\n      scope: this,\n      options\n    });\n  }\n\n  getDocIndex(doc) {\n    for (let i = 0; i < this.documents.length; i++) {\n      if (this.documents[i].doc === doc) {\n        return i;\n      }\n    }\n\n    return -1;\n  }\n\n  getDocOptions(doc) {\n    const docIndex = this.getDocIndex(doc);\n    return docIndex === -1 ? null : this.documents[docIndex].options;\n  }\n\n  now() {\n    return (this.window.Date || Date).now();\n  }\n\n}\nfunction initScope(scope, window) {\n  scope.isInitialized = true;\n  window_init(window);\n  utils_domObjects.init(window);\n  utils_browser.init(window);\n  raf.init(window);\n  scope.window = window;\n  scope.document = window.document;\n  scope.usePlugin(core_interactions);\n  scope.usePlugin(events);\n  return scope;\n}\n\nfunction pluginIdRoot(id) {\n  return id && id.replace(/\\/.*$/, '');\n}\n//# sourceMappingURL=scope.js.map\n// CONCATENATED MODULE: ./node_modules/@interactjs/interact/index.js\n\nconst interact_scope = new scope_Scope();\nconst interact_interact = interact_scope.interactStatic;\n/* harmony default export */ var _interactjs_interact = (interact_interact);\nconst interact_init = win => interact_scope.init(win);\n\nif (typeof window === 'object' && !!window) {\n  interact_init(window);\n}\n//# sourceMappingURL=index.js.map\n// CONCATENATED MODULE: ./node_modules/@interactjs/auto-start/InteractableMethods.js\n\n\n\n\nfunction InteractableMethods_install(scope) {\n  const {\n    /** @lends Interactable */\n    Interactable // tslint:disable-line no-shadowed-variable\n\n  } = scope;\n\n  Interactable.prototype.getAction = function getAction(pointer, event, interaction, element) {\n    const action = defaultActionChecker(this, event, interaction, element, scope);\n\n    if (this.options.actionChecker) {\n      return this.options.actionChecker(pointer, event, action, this, element, interaction);\n    }\n\n    return action;\n  };\n  /**\n   * If the target of the `mousedown`, `pointerdown` or `touchstart` event or any\n   * of it's parents match the given CSS selector or Element, no\n   * drag/resize/gesture is started.\n   *\n   * @deprecated\n   * Don't use this method. Instead set the `ignoreFrom` option for each action\n   * or for `pointerEvents`\n   *\n   * ```js\n   * interact(targett)\n   *   .draggable({\n   *     ignoreFrom: 'input, textarea, a[href]'',\n   *   })\n   *   .pointerEvents({\n   *     ignoreFrom: '[no-pointer]',\n   *   })\n   * ```\n   *\n   * @param {string | Element | null} [newValue] a CSS selector string, an\n   * Element or `null` to not ignore any elements\n   * @return {string | Element | object} The current ignoreFrom value or this\n   * Interactable\n   */\n\n\n  Interactable.prototype.ignoreFrom = warnOnce(function (newValue) {\n    return this._backCompatOption('ignoreFrom', newValue);\n  }, 'Interactable.ignoreFrom() has been deprecated. Use Interactble.draggable({ignoreFrom: newValue}).');\n  /**\n   *\n   * A drag/resize/gesture is started only If the target of the `mousedown`,\n   * `pointerdown` or `touchstart` event or any of it's parents match the given\n   * CSS selector or Element.\n   *\n   * @deprecated\n   * Don't use this method. Instead set the `allowFrom` option for each action\n   * or for `pointerEvents`\n   *\n   * ```js\n   * interact(targett)\n   *   .resizable({\n   *     allowFrom: '.resize-handle',\n   *   .pointerEvents({\n   *     allowFrom: '.handle',,\n   *   })\n   * ```\n   *\n   * @param {string | Element | null} [newValue] a CSS selector string, an\n   * Element or `null` to allow from any element\n   * @return {string | Element | object} The current allowFrom value or this\n   * Interactable\n   */\n\n  Interactable.prototype.allowFrom = warnOnce(function (newValue) {\n    return this._backCompatOption('allowFrom', newValue);\n  }, 'Interactable.allowFrom() has been deprecated. Use Interactble.draggable({allowFrom: newValue}).');\n  /**\n   * ```js\n   * interact('.resize-drag')\n   *   .resizable(true)\n   *   .draggable(true)\n   *   .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n   *\n   *     if (interact.matchesSelector(event.target, '.drag-handle')) {\n   *       // force drag with handle target\n   *       action.name = drag\n   *     }\n   *     else {\n   *       // resize from the top and right edges\n   *       action.name  = 'resize'\n   *       action.edges = { top: true, right: true }\n   *     }\n   *\n   *     return action\n   * })\n   * ```\n   *\n   * Returns or sets the function used to check action to be performed on\n   * pointerDown\n   *\n   * @param {function | null} [checker] A function which takes a pointer event,\n   * defaultAction string, interactable, element and interaction as parameters\n   * and returns an object with name property 'drag' 'resize' or 'gesture' and\n   * optionally an `edges` object with boolean 'top', 'left', 'bottom' and right\n   * props.\n   * @return {Function | Interactable} The checker function or this Interactable\n   */\n\n  Interactable.prototype.actionChecker = actionChecker;\n  /**\n   * Returns or sets whether the the cursor should be changed depending on the\n   * action that would be performed if the mouse were pressed and dragged.\n   *\n   * @param {boolean} [newValue]\n   * @return {boolean | Interactable} The current setting or this Interactable\n   */\n\n  Interactable.prototype.styleCursor = styleCursor;\n}\n\nfunction defaultActionChecker(interactable, event, interaction, element, scope) {\n  const rect = interactable.getRect(element);\n  const buttons = event.buttons || {\n    0: 1,\n    1: 4,\n    3: 8,\n    4: 16\n  }[event.button];\n  const arg = {\n    action: null,\n    interactable,\n    interaction,\n    element,\n    rect,\n    buttons\n  };\n  scope.fire('auto-start:check', arg);\n  return arg.action;\n}\n\nfunction styleCursor(newValue) {\n  if (is.bool(newValue)) {\n    this.options.styleCursor = newValue;\n    return this;\n  }\n\n  if (newValue === null) {\n    delete this.options.styleCursor;\n    return this;\n  }\n\n  return this.options.styleCursor;\n}\n\nfunction actionChecker(checker) {\n  if (is.func(checker)) {\n    this.options.actionChecker = checker;\n    return this;\n  }\n\n  if (checker === null) {\n    delete this.options.actionChecker;\n    return this;\n  }\n\n  return this.options.actionChecker;\n}\n\n/* harmony default export */ var InteractableMethods = ({\n  id: 'auto-start/interactableMethods',\n  install: InteractableMethods_install\n});\n//# sourceMappingURL=InteractableMethods.js.map\n// CONCATENATED MODULE: ./node_modules/@interactjs/auto-start/base.js\n\n\n\n\n\n\n\nfunction base_install(scope) {\n  const {\n    interactStatic: interact,\n    defaults\n  } = scope;\n  scope.usePlugin(InteractableMethods);\n  defaults.base.actionChecker = null;\n  defaults.base.styleCursor = true;\n  extend(defaults.perAction, {\n    manualStart: false,\n    max: Infinity,\n    maxPerElement: 1,\n    allowFrom: null,\n    ignoreFrom: null,\n    // only allow left button by default\n    // see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons#Return_value\n    mouseButtons: 1\n  });\n  /**\n   * Returns or sets the maximum number of concurrent interactions allowed.  By\n   * default only 1 interaction is allowed at a time (for backwards\n   * compatibility). To allow multiple interactions on the same Interactables and\n   * elements, you need to enable it in the draggable, resizable and gesturable\n   * `'max'` and `'maxPerElement'` options.\n   *\n   * @alias module:interact.maxInteractions\n   *\n   * @param {number} [newValue] Any number. newValue <= 0 means no interactions.\n   */\n\n  interact.maxInteractions = newValue => maxInteractions(newValue, scope);\n\n  scope.autoStart = {\n    // Allow this many interactions to happen simultaneously\n    maxInteractions: Infinity,\n    withinInteractionLimit,\n    cursorElement: null\n  };\n}\n\nfunction prepareOnDown({\n  interaction,\n  pointer,\n  event,\n  eventTarget\n}, scope) {\n  if (interaction.interacting()) {\n    return;\n  }\n\n  const actionInfo = getActionInfo(interaction, pointer, event, eventTarget, scope);\n  prepare(interaction, actionInfo, scope);\n}\n\nfunction prepareOnMove({\n  interaction,\n  pointer,\n  event,\n  eventTarget\n}, scope) {\n  if (interaction.pointerType !== 'mouse' || interaction.pointerIsDown || interaction.interacting()) {\n    return;\n  }\n\n  const actionInfo = getActionInfo(interaction, pointer, event, eventTarget, scope);\n  prepare(interaction, actionInfo, scope);\n}\n\nfunction startOnMove(arg, scope) {\n  const {\n    interaction\n  } = arg;\n\n  if (!interaction.pointerIsDown || interaction.interacting() || !interaction.pointerWasMoved || !interaction.prepared.name) {\n    return;\n  }\n\n  scope.fire('autoStart:before-start', arg);\n  const {\n    interactable\n  } = interaction;\n  const actionName = interaction.prepared.name;\n\n  if (actionName && interactable) {\n    // check manualStart and interaction limit\n    if (interactable.options[actionName].manualStart || !withinInteractionLimit(interactable, interaction.element, interaction.prepared, scope)) {\n      interaction.stop();\n    } else {\n      interaction.start(interaction.prepared, interactable, interaction.element);\n      setInteractionCursor(interaction, scope);\n    }\n  }\n}\n\nfunction clearCursorOnStop({\n  interaction\n}, scope) {\n  const {\n    interactable\n  } = interaction;\n\n  if (interactable && interactable.options.styleCursor) {\n    setCursor(interaction.element, '', scope);\n  }\n} // Check if the current interactable supports the action.\n// If so, return the validated action. Otherwise, return null\n\n\nfunction validateAction(action, interactable, element, eventTarget, scope) {\n  if (interactable.testIgnoreAllow(interactable.options[action.name], element, eventTarget) && interactable.options[action.name].enabled && withinInteractionLimit(interactable, element, action, scope)) {\n    return action;\n  }\n\n  return null;\n}\n\nfunction validateMatches(interaction, pointer, event, matches, matchElements, eventTarget, scope) {\n  for (let i = 0, len = matches.length; i < len; i++) {\n    const match = matches[i];\n    const matchElement = matchElements[i];\n    const matchAction = match.getAction(pointer, event, interaction, matchElement);\n\n    if (!matchAction) {\n      continue;\n    }\n\n    const action = validateAction(matchAction, match, matchElement, eventTarget, scope);\n\n    if (action) {\n      return {\n        action,\n        interactable: match,\n        element: matchElement\n      };\n    }\n  }\n\n  return {\n    action: null,\n    interactable: null,\n    element: null\n  };\n}\n\nfunction getActionInfo(interaction, pointer, event, eventTarget, scope) {\n  let matches = [];\n  let matchElements = [];\n  let element = eventTarget;\n\n  function pushMatches(interactable) {\n    matches.push(interactable);\n    matchElements.push(element);\n  }\n\n  while (is.element(element)) {\n    matches = [];\n    matchElements = [];\n    scope.interactables.forEachMatch(element, pushMatches);\n    const actionInfo = validateMatches(interaction, pointer, event, matches, matchElements, eventTarget, scope);\n\n    if (actionInfo.action && !actionInfo.interactable.options[actionInfo.action.name].manualStart) {\n      return actionInfo;\n    }\n\n    element = parentNode(element);\n  }\n\n  return {\n    action: null,\n    interactable: null,\n    element: null\n  };\n}\n\nfunction prepare(interaction, {\n  action,\n  interactable,\n  element\n}, scope) {\n  action = action || {\n    name: null\n  };\n  interaction.interactable = interactable;\n  interaction.element = element;\n  copyAction(interaction.prepared, action);\n  interaction.rect = interactable && action.name ? interactable.getRect(element) : null;\n  setInteractionCursor(interaction, scope);\n  scope.fire('autoStart:prepared', {\n    interaction\n  });\n}\n\nfunction withinInteractionLimit(interactable, element, action, scope) {\n  const options = interactable.options;\n  const maxActions = options[action.name].max;\n  const maxPerElement = options[action.name].maxPerElement;\n  const autoStartMax = scope.autoStart.maxInteractions;\n  let activeInteractions = 0;\n  let interactableCount = 0;\n  let elementCount = 0; // no actions if any of these values == 0\n\n  if (!(maxActions && maxPerElement && autoStartMax)) {\n    return false;\n  }\n\n  for (const interaction of scope.interactions.list) {\n    const otherAction = interaction.prepared.name;\n\n    if (!interaction.interacting()) {\n      continue;\n    }\n\n    activeInteractions++;\n\n    if (activeInteractions >= autoStartMax) {\n      return false;\n    }\n\n    if (interaction.interactable !== interactable) {\n      continue;\n    }\n\n    interactableCount += otherAction === action.name ? 1 : 0;\n\n    if (interactableCount >= maxActions) {\n      return false;\n    }\n\n    if (interaction.element === element) {\n      elementCount++;\n\n      if (otherAction === action.name && elementCount >= maxPerElement) {\n        return false;\n      }\n    }\n  }\n\n  return autoStartMax > 0;\n}\n\nfunction maxInteractions(newValue, scope) {\n  if (is.number(newValue)) {\n    scope.autoStart.maxInteractions = newValue;\n    return this;\n  }\n\n  return scope.autoStart.maxInteractions;\n}\n\nfunction setCursor(element, cursor, scope) {\n  const {\n    cursorElement: prevCursorElement\n  } = scope.autoStart;\n\n  if (prevCursorElement && prevCursorElement !== element) {\n    prevCursorElement.style.cursor = '';\n  }\n\n  element.ownerDocument.documentElement.style.cursor = cursor;\n  element.style.cursor = cursor;\n  scope.autoStart.cursorElement = cursor ? element : null;\n}\n\nfunction setInteractionCursor(interaction, scope) {\n  const {\n    interactable,\n    element,\n    prepared\n  } = interaction;\n\n  if (!(interaction.pointerType === 'mouse' && interactable && interactable.options.styleCursor)) {\n    // clear previous target element cursor\n    if (scope.autoStart.cursorElement) {\n      setCursor(scope.autoStart.cursorElement, '', scope);\n    }\n\n    return;\n  }\n\n  let cursor = '';\n\n  if (prepared.name) {\n    const cursorChecker = interactable.options[prepared.name].cursorChecker;\n\n    if (is.func(cursorChecker)) {\n      cursor = cursorChecker(prepared, interactable, element, interaction._interacting);\n    } else {\n      cursor = scope.actions.map[prepared.name].getCursor(prepared);\n    }\n  }\n\n  setCursor(interaction.element, cursor || '', scope);\n}\n\nconst autoStart = {\n  id: 'auto-start/base',\n  before: ['actions'],\n  install: base_install,\n  listeners: {\n    'interactions:down': prepareOnDown,\n    'interactions:move': (arg, scope) => {\n      prepareOnMove(arg, scope);\n      startOnMove(arg, scope);\n    },\n    'interactions:stop': clearCursorOnStop\n  },\n  maxInteractions,\n  withinInteractionLimit,\n  validateAction\n};\n/* harmony default export */ var base = (autoStart);\n//# sourceMappingURL=base.js.map\n// CONCATENATED MODULE: ./node_modules/@interactjs/auto-start/dragAxis.js\n\n\n\n\nfunction beforeStart({\n  interaction,\n  eventTarget,\n  dx,\n  dy\n}, scope) {\n  if (interaction.prepared.name !== 'drag') {\n    return;\n  } // check if a drag is in the correct axis\n\n\n  const absX = Math.abs(dx);\n  const absY = Math.abs(dy);\n  const targetOptions = interaction.interactable.options.drag;\n  const startAxis = targetOptions.startAxis;\n  const currentAxis = absX > absY ? 'x' : absX < absY ? 'y' : 'xy';\n  interaction.prepared.axis = targetOptions.lockAxis === 'start' ? currentAxis[0] // always lock to one axis even if currentAxis === 'xy'\n  : targetOptions.lockAxis; // if the movement isn't in the startAxis of the interactable\n\n  if (currentAxis !== 'xy' && startAxis !== 'xy' && startAxis !== currentAxis) {\n    // cancel the prepared action\n    interaction.prepared.name = null; // then try to get a drag from another ineractable\n\n    let element = eventTarget;\n\n    const getDraggable = function (interactable) {\n      if (interactable === interaction.interactable) {\n        return;\n      }\n\n      const options = interaction.interactable.options.drag;\n\n      if (!options.manualStart && interactable.testIgnoreAllow(options, element, eventTarget)) {\n        const action = interactable.getAction(interaction.downPointer, interaction.downEvent, interaction, element);\n\n        if (action && action.name === 'drag' && checkStartAxis(currentAxis, interactable) && base.validateAction(action, interactable, element, eventTarget, scope)) {\n          return interactable;\n        }\n      }\n    }; // check all interactables\n\n\n    while (is.element(element)) {\n      const interactable = scope.interactables.forEachMatch(element, getDraggable);\n\n      if (interactable) {\n        interaction.prepared.name = 'drag';\n        interaction.interactable = interactable;\n        interaction.element = element;\n        break;\n      }\n\n      element = parentNode(element);\n    }\n  }\n}\n\nfunction checkStartAxis(startAxis, interactable) {\n  if (!interactable) {\n    return false;\n  }\n\n  const thisAxis = interactable.options.drag.startAxis;\n  return startAxis === 'xy' || thisAxis === 'xy' || thisAxis === startAxis;\n}\n\n/* harmony default export */ var dragAxis = ({\n  id: 'auto-start/dragAxis',\n  listeners: {\n    'autoStart:before-start': beforeStart\n  }\n});\n//# sourceMappingURL=dragAxis.js.map\n// CONCATENATED MODULE: ./node_modules/@interactjs/auto-start/hold.js\n\n\n\nfunction hold_install(scope) {\n  const {\n    defaults\n  } = scope;\n  scope.usePlugin(base);\n  defaults.perAction.hold = 0;\n  defaults.perAction.delay = 0;\n}\n\nfunction getHoldDuration(interaction) {\n  const actionName = interaction.prepared && interaction.prepared.name;\n\n  if (!actionName) {\n    return null;\n  }\n\n  const options = interaction.interactable.options;\n  return options[actionName].hold || options[actionName].delay;\n}\n\nconst hold = {\n  id: 'auto-start/hold',\n  install: hold_install,\n  listeners: {\n    'interactions:new': ({\n      interaction\n    }) => {\n      interaction.autoStartHoldTimer = null;\n    },\n    'autoStart:prepared': ({\n      interaction\n    }) => {\n      const hold = getHoldDuration(interaction);\n\n      if (hold > 0) {\n        interaction.autoStartHoldTimer = setTimeout(() => {\n          interaction.start(interaction.prepared, interaction.interactable, interaction.element);\n        }, hold);\n      }\n    },\n    'interactions:move': ({\n      interaction,\n      duplicate\n    }) => {\n      if (interaction.autoStartHoldTimer && interaction.pointerWasMoved && !duplicate) {\n        clearTimeout(interaction.autoStartHoldTimer);\n        interaction.autoStartHoldTimer = null;\n      }\n    },\n    // prevent regular down->move autoStart\n    'autoStart:before-start': ({\n      interaction\n    }) => {\n      const holdDuration = getHoldDuration(interaction);\n\n      if (holdDuration > 0) {\n        interaction.prepared.name = null;\n      }\n    }\n  },\n  getHoldDuration\n};\n/* harmony default export */ var auto_start_hold = (hold);\n//# sourceMappingURL=hold.js.map\n// CONCATENATED MODULE: ./node_modules/@interactjs/auto-start/plugin.js\n\n\n\n/* harmony default export */ var auto_start_plugin = ({\n  id: 'auto-start',\n\n  install(scope) {\n    scope.usePlugin(base);\n    scope.usePlugin(auto_start_hold);\n    scope.usePlugin(dragAxis);\n  }\n\n});\n//# sourceMappingURL=plugin.js.map\n// CONCATENATED MODULE: ./node_modules/@interactjs/auto-start/index.js\n/* eslint-disable import/order, no-console, eol-last */\n\n\n\nif (typeof window === 'object' && !!window) {\n  interact_init(window);\n}\n\n_interactjs_interact.use(auto_start_plugin);\n//# sourceMappingURL=index.js.map\n// CONCATENATED MODULE: ./node_modules/@interactjs/auto-scroll/plugin.js\n\n\n\n\n\n\n\nfunction plugin_install(scope) {\n  const {\n    defaults,\n    actions\n  } = scope;\n  scope.autoScroll = autoScroll;\n\n  autoScroll.now = () => scope.now();\n\n  actions.phaselessTypes.autoscroll = true;\n  defaults.perAction.autoScroll = autoScroll.defaults;\n}\n\nconst autoScroll = {\n  defaults: {\n    enabled: false,\n    margin: 60,\n    // the item that is scrolled (Window or HTMLElement)\n    container: null,\n    // the scroll speed in pixels per second\n    speed: 300\n  },\n  now: Date.now,\n  interaction: null,\n  i: 0,\n  // the handle returned by window.setInterval\n  // Direction each pulse is to scroll in\n  x: 0,\n  y: 0,\n  isScrolling: false,\n  prevTime: 0,\n  margin: 0,\n  speed: 0,\n\n  start(interaction) {\n    autoScroll.isScrolling = true;\n    raf.cancel(autoScroll.i);\n    interaction.autoScroll = autoScroll;\n    autoScroll.interaction = interaction;\n    autoScroll.prevTime = autoScroll.now();\n    autoScroll.i = raf.request(autoScroll.scroll);\n  },\n\n  stop() {\n    autoScroll.isScrolling = false;\n\n    if (autoScroll.interaction) {\n      autoScroll.interaction.autoScroll = null;\n    }\n\n    raf.cancel(autoScroll.i);\n  },\n\n  // scroll the window by the values in scroll.x/y\n  scroll() {\n    const {\n      interaction\n    } = autoScroll;\n    const {\n      interactable,\n      element\n    } = interaction;\n    const actionName = interaction.prepared.name;\n    const options = interactable.options[actionName].autoScroll;\n    const container = getContainer(options.container, interactable, element);\n    const now = autoScroll.now(); // change in time in seconds\n\n    const dt = (now - autoScroll.prevTime) / 1000; // displacement\n\n    const s = options.speed * dt;\n\n    if (s >= 1) {\n      const scrollBy = {\n        x: autoScroll.x * s,\n        y: autoScroll.y * s\n      };\n\n      if (scrollBy.x || scrollBy.y) {\n        const prevScroll = getScroll(container);\n\n        if (is.window(container)) {\n          container.scrollBy(scrollBy.x, scrollBy.y);\n        } else if (container) {\n          container.scrollLeft += scrollBy.x;\n          container.scrollTop += scrollBy.y;\n        }\n\n        const curScroll = getScroll(container);\n        const delta = {\n          x: curScroll.x - prevScroll.x,\n          y: curScroll.y - prevScroll.y\n        };\n\n        if (delta.x || delta.y) {\n          interactable.fire({\n            type: 'autoscroll',\n            target: element,\n            interactable,\n            delta,\n            interaction,\n            container\n          });\n        }\n      }\n\n      autoScroll.prevTime = now;\n    }\n\n    if (autoScroll.isScrolling) {\n      raf.cancel(autoScroll.i);\n      autoScroll.i = raf.request(autoScroll.scroll);\n    }\n  },\n\n  check(interactable, actionName) {\n    var _options$actionName$a;\n\n    const options = interactable.options;\n    return (_options$actionName$a = options[actionName].autoScroll) == null ? void 0 : _options$actionName$a.enabled;\n  },\n\n  onInteractionMove({\n    interaction,\n    pointer\n  }) {\n    if (!(interaction.interacting() && autoScroll.check(interaction.interactable, interaction.prepared.name))) {\n      return;\n    }\n\n    if (interaction.simulation) {\n      autoScroll.x = autoScroll.y = 0;\n      return;\n    }\n\n    let top;\n    let right;\n    let bottom;\n    let left;\n    const {\n      interactable,\n      element\n    } = interaction;\n    const actionName = interaction.prepared.name;\n    const options = interactable.options[actionName].autoScroll;\n    const container = getContainer(options.container, interactable, element);\n\n    if (is.window(container)) {\n      left = pointer.clientX < autoScroll.margin;\n      top = pointer.clientY < autoScroll.margin;\n      right = pointer.clientX > container.innerWidth - autoScroll.margin;\n      bottom = pointer.clientY > container.innerHeight - autoScroll.margin;\n    } else {\n      const rect = getElementClientRect(container);\n      left = pointer.clientX < rect.left + autoScroll.margin;\n      top = pointer.clientY < rect.top + autoScroll.margin;\n      right = pointer.clientX > rect.right - autoScroll.margin;\n      bottom = pointer.clientY > rect.bottom - autoScroll.margin;\n    }\n\n    autoScroll.x = right ? 1 : left ? -1 : 0;\n    autoScroll.y = bottom ? 1 : top ? -1 : 0;\n\n    if (!autoScroll.isScrolling) {\n      // set the autoScroll properties to those of the target\n      autoScroll.margin = options.margin;\n      autoScroll.speed = options.speed;\n      autoScroll.start(interaction);\n    }\n  }\n\n};\nfunction getContainer(value, interactable, element) {\n  return (is.string(value) ? getStringOptionResult(value, interactable, element) : value) || getWindow(element);\n}\nfunction getScroll(container) {\n  if (is.window(container)) {\n    container = window.document.body;\n  }\n\n  return {\n    x: container.scrollLeft,\n    y: container.scrollTop\n  };\n}\nfunction getScrollSize(container) {\n  if (is.window(container)) {\n    container = window.document.body;\n  }\n\n  return {\n    x: container.scrollWidth,\n    y: container.scrollHeight\n  };\n}\nfunction getScrollSizeDelta({\n  interaction,\n  element\n}, func) {\n  const scrollOptions = interaction && interaction.interactable.options[interaction.prepared.name].autoScroll;\n\n  if (!scrollOptions || !scrollOptions.enabled) {\n    func();\n    return {\n      x: 0,\n      y: 0\n    };\n  }\n\n  const scrollContainer = getContainer(scrollOptions.container, interaction.interactable, element);\n  const prevSize = getScroll(scrollContainer);\n  func();\n  const curSize = getScroll(scrollContainer);\n  return {\n    x: curSize.x - prevSize.x,\n    y: curSize.y - prevSize.y\n  };\n}\nconst autoScrollPlugin = {\n  id: 'auto-scroll',\n  install: plugin_install,\n  listeners: {\n    'interactions:new': ({\n      interaction\n    }) => {\n      interaction.autoScroll = null;\n    },\n    'interactions:destroy': ({\n      interaction\n    }) => {\n      interaction.autoScroll = null;\n      autoScroll.stop();\n\n      if (autoScroll.interaction) {\n        autoScroll.interaction = null;\n      }\n    },\n    'interactions:stop': autoScroll.stop,\n    'interactions:action-move': arg => autoScroll.onInteractionMove(arg)\n  }\n};\n/* harmony default export */ var auto_scroll_plugin = (autoScrollPlugin);\n//# sourceMappingURL=plugin.js.map\n// CONCATENATED MODULE: ./node_modules/@interactjs/auto-scroll/index.js\n/* eslint-disable import/order, no-console, eol-last */\n\n\n\nif (typeof window === 'object' && !!window) {\n  interact_init(window);\n}\n\n_interactjs_interact.use(auto_scroll_plugin);\n//# sourceMappingURL=index.js.map\n// CONCATENATED MODULE: ./node_modules/@interactjs/actions/drag/plugin.js\n\n\n\nfunction drag_plugin_install(scope) {\n  const {\n    actions,\n    Interactable,\n    defaults\n  } = scope;\n  Interactable.prototype.draggable = drag.draggable;\n  actions.map.drag = drag;\n  actions.methodDict.drag = 'draggable';\n  defaults.actions.drag = drag.defaults;\n}\n\nfunction beforeMove({\n  interaction\n}) {\n  if (interaction.prepared.name !== 'drag') {\n    return;\n  }\n\n  const axis = interaction.prepared.axis;\n\n  if (axis === 'x') {\n    interaction.coords.cur.page.y = interaction.coords.start.page.y;\n    interaction.coords.cur.client.y = interaction.coords.start.client.y;\n    interaction.coords.velocity.client.y = 0;\n    interaction.coords.velocity.page.y = 0;\n  } else if (axis === 'y') {\n    interaction.coords.cur.page.x = interaction.coords.start.page.x;\n    interaction.coords.cur.client.x = interaction.coords.start.client.x;\n    interaction.coords.velocity.client.x = 0;\n    interaction.coords.velocity.page.x = 0;\n  }\n}\n\nfunction move({\n  iEvent,\n  interaction\n}) {\n  if (interaction.prepared.name !== 'drag') {\n    return;\n  }\n\n  const axis = interaction.prepared.axis;\n\n  if (axis === 'x' || axis === 'y') {\n    const opposite = axis === 'x' ? 'y' : 'x';\n    iEvent.page[opposite] = interaction.coords.start.page[opposite];\n    iEvent.client[opposite] = interaction.coords.start.client[opposite];\n    iEvent.delta[opposite] = 0;\n  }\n}\n/**\n * ```js\n * interact(element).draggable({\n *     onstart: function (event) {},\n *     onmove : function (event) {},\n *     onend  : function (event) {},\n *\n *     // the axis in which the first movement must be\n *     // for the drag sequence to start\n *     // 'xy' by default - any direction\n *     startAxis: 'x' || 'y' || 'xy',\n *\n *     // 'xy' by default - don't restrict to one axis (move in any direction)\n *     // 'x' or 'y' to restrict movement to either axis\n *     // 'start' to restrict movement to the axis the drag started in\n *     lockAxis: 'x' || 'y' || 'xy' || 'start',\n *\n *     // max number of drags that can happen concurrently\n *     // with elements of this Interactable. Infinity by default\n *     max: Infinity,\n *\n *     // max number of drags that can target the same element+Interactable\n *     // 1 by default\n *     maxPerElement: 2\n * })\n *\n * var isDraggable = interact('element').draggable(); // true\n * ```\n *\n * Get or set whether drag actions can be performed on the target\n *\n * @alias Interactable.prototype.draggable\n *\n * @param {boolean | object} [options] true/false or An object with event\n * listeners to be fired on drag events (object makes the Interactable\n * draggable)\n * @return {boolean | Interactable} boolean indicating if this can be the\n * target of drag events, or this Interctable\n */\n\n\nconst plugin_draggable = function draggable(options) {\n  if (is.object(options)) {\n    this.options.drag.enabled = options.enabled !== false;\n    this.setPerAction('drag', options);\n    this.setOnEvents('drag', options);\n\n    if (/^(xy|x|y|start)$/.test(options.lockAxis)) {\n      this.options.drag.lockAxis = options.lockAxis;\n    }\n\n    if (/^(xy|x|y)$/.test(options.startAxis)) {\n      this.options.drag.startAxis = options.startAxis;\n    }\n\n    return this;\n  }\n\n  if (is.bool(options)) {\n    this.options.drag.enabled = options;\n    return this;\n  }\n\n  return this.options.drag;\n};\n\nconst drag = {\n  id: 'actions/drag',\n  install: drag_plugin_install,\n  listeners: {\n    'interactions:before-action-move': beforeMove,\n    'interactions:action-resume': beforeMove,\n    // dragmove\n    'interactions:action-move': move,\n    'auto-start:check': arg => {\n      const {\n        interaction,\n        interactable,\n        buttons\n      } = arg;\n      const dragOptions = interactable.options.drag;\n\n      if (!(dragOptions && dragOptions.enabled) || // check mouseButton setting if the pointer is down\n      interaction.pointerIsDown && /mouse|pointer/.test(interaction.pointerType) && (buttons & interactable.options.drag.mouseButtons) === 0) {\n        return undefined;\n      }\n\n      arg.action = {\n        name: 'drag',\n        axis: dragOptions.lockAxis === 'start' ? dragOptions.startAxis : dragOptions.lockAxis\n      };\n      return false;\n    }\n  },\n  draggable: plugin_draggable,\n  beforeMove,\n  move,\n  defaults: {\n    startAxis: 'xy',\n    lockAxis: 'xy'\n  },\n\n  getCursor() {\n    return 'move';\n  }\n\n};\n/* harmony default export */ var drag_plugin = (drag);\n//# sourceMappingURL=plugin.js.map\n// CONCATENATED MODULE: ./node_modules/@interactjs/actions/drag/index.js\n/* eslint-disable import/order, no-console, eol-last */\n\n\n\nif (typeof window === 'object' && !!window) {\n  interact_init(window);\n}\n\n_interactjs_interact.use(drag_plugin);\n//# sourceMappingURL=index.js.map\n// CONCATENATED MODULE: ./node_modules/@interactjs/actions/resize/plugin.js\n\n\n\n\n\n\nfunction resize_plugin_install(scope) {\n  const {\n    actions,\n    browser,\n\n    /** @lends Interactable */\n    Interactable,\n    // tslint:disable-line no-shadowed-variable\n    defaults\n  } = scope; // Less Precision with touch input\n\n  resize.cursors = initCursors(browser);\n  resize.defaultMargin = browser.supportsTouch || browser.supportsPointerEvent ? 20 : 10;\n  /**\n   * ```js\n   * interact(element).resizable({\n   *   onstart: function (event) {},\n   *   onmove : function (event) {},\n   *   onend  : function (event) {},\n   *\n   *   edges: {\n   *     top   : true,       // Use pointer coords to check for resize.\n   *     left  : false,      // Disable resizing from left edge.\n   *     bottom: '.resize-s',// Resize if pointer target matches selector\n   *     right : handleEl    // Resize if pointer target is the given Element\n   *   },\n   *\n   *     // Width and height can be adjusted independently. When `true`, width and\n   *     // height are adjusted at a 1:1 ratio.\n   *     square: false,\n   *\n   *     // Width and height can be adjusted independently. When `true`, width and\n   *     // height maintain the aspect ratio they had when resizing started.\n   *     preserveAspectRatio: false,\n   *\n   *   // a value of 'none' will limit the resize rect to a minimum of 0x0\n   *   // 'negate' will allow the rect to have negative width/height\n   *   // 'reposition' will keep the width/height positive by swapping\n   *   // the top and bottom edges and/or swapping the left and right edges\n   *   invert: 'none' || 'negate' || 'reposition'\n   *\n   *   // limit multiple resizes.\n   *   // See the explanation in the {@link Interactable.draggable} example\n   *   max: Infinity,\n   *   maxPerElement: 1,\n   * })\n   *\n   * var isResizeable = interact(element).resizable()\n   * ```\n   *\n   * Gets or sets whether resize actions can be performed on the target\n   *\n   * @param {boolean | object} [options] true/false or An object with event\n   * listeners to be fired on resize events (object makes the Interactable\n   * resizable)\n   * @return {boolean | Interactable} A boolean indicating if this can be the\n   * target of resize elements, or this Interactable\n   */\n\n  Interactable.prototype.resizable = function (options) {\n    return resizable(this, options, scope);\n  };\n\n  actions.map.resize = resize;\n  actions.methodDict.resize = 'resizable';\n  defaults.actions.resize = resize.defaults;\n}\n\nfunction resizeChecker(arg) {\n  const {\n    interaction,\n    interactable,\n    element,\n    rect,\n    buttons\n  } = arg;\n\n  if (!rect) {\n    return undefined;\n  }\n\n  const page = extend({}, interaction.coords.cur.page);\n  const resizeOptions = interactable.options.resize;\n\n  if (!(resizeOptions && resizeOptions.enabled) || // check mouseButton setting if the pointer is down\n  interaction.pointerIsDown && /mouse|pointer/.test(interaction.pointerType) && (buttons & resizeOptions.mouseButtons) === 0) {\n    return undefined;\n  } // if using resize.edges\n\n\n  if (is.object(resizeOptions.edges)) {\n    const resizeEdges = {\n      left: false,\n      right: false,\n      top: false,\n      bottom: false\n    };\n\n    for (const edge in resizeEdges) {\n      resizeEdges[edge] = checkResizeEdge(edge, resizeOptions.edges[edge], page, interaction._latestPointer.eventTarget, element, rect, resizeOptions.margin || resize.defaultMargin);\n    }\n\n    resizeEdges.left = resizeEdges.left && !resizeEdges.right;\n    resizeEdges.top = resizeEdges.top && !resizeEdges.bottom;\n\n    if (resizeEdges.left || resizeEdges.right || resizeEdges.top || resizeEdges.bottom) {\n      arg.action = {\n        name: 'resize',\n        edges: resizeEdges\n      };\n    }\n  } else {\n    const right = resizeOptions.axis !== 'y' && page.x > rect.right - resize.defaultMargin;\n    const bottom = resizeOptions.axis !== 'x' && page.y > rect.bottom - resize.defaultMargin;\n\n    if (right || bottom) {\n      arg.action = {\n        name: 'resize',\n        axes: (right ? 'x' : '') + (bottom ? 'y' : '')\n      };\n    }\n  }\n\n  return arg.action ? false : undefined;\n}\n\nfunction resizable(interactable, options, scope) {\n  if (is.object(options)) {\n    interactable.options.resize.enabled = options.enabled !== false;\n    interactable.setPerAction('resize', options);\n    interactable.setOnEvents('resize', options);\n\n    if (is.string(options.axis) && /^x$|^y$|^xy$/.test(options.axis)) {\n      interactable.options.resize.axis = options.axis;\n    } else if (options.axis === null) {\n      interactable.options.resize.axis = scope.defaults.actions.resize.axis;\n    }\n\n    if (is.bool(options.preserveAspectRatio)) {\n      interactable.options.resize.preserveAspectRatio = options.preserveAspectRatio;\n    } else if (is.bool(options.square)) {\n      interactable.options.resize.square = options.square;\n    }\n\n    return interactable;\n  }\n\n  if (is.bool(options)) {\n    interactable.options.resize.enabled = options;\n    return interactable;\n  }\n\n  return interactable.options.resize;\n}\n\nfunction checkResizeEdge(name, value, page, element, interactableElement, rect, margin) {\n  // false, '', undefined, null\n  if (!value) {\n    return false;\n  } // true value, use pointer coords and element rect\n\n\n  if (value === true) {\n    // if dimensions are negative, \"switch\" edges\n    const width = is.number(rect.width) ? rect.width : rect.right - rect.left;\n    const height = is.number(rect.height) ? rect.height : rect.bottom - rect.top; // don't use margin greater than half the relevent dimension\n\n    margin = Math.min(margin, Math.abs((name === 'left' || name === 'right' ? width : height) / 2));\n\n    if (width < 0) {\n      if (name === 'left') {\n        name = 'right';\n      } else if (name === 'right') {\n        name = 'left';\n      }\n    }\n\n    if (height < 0) {\n      if (name === 'top') {\n        name = 'bottom';\n      } else if (name === 'bottom') {\n        name = 'top';\n      }\n    }\n\n    if (name === 'left') {\n      return page.x < (width >= 0 ? rect.left : rect.right) + margin;\n    }\n\n    if (name === 'top') {\n      return page.y < (height >= 0 ? rect.top : rect.bottom) + margin;\n    }\n\n    if (name === 'right') {\n      return page.x > (width >= 0 ? rect.right : rect.left) - margin;\n    }\n\n    if (name === 'bottom') {\n      return page.y > (height >= 0 ? rect.bottom : rect.top) - margin;\n    }\n  } // the remaining checks require an element\n\n\n  if (!is.element(element)) {\n    return false;\n  }\n\n  return is.element(value) // the value is an element to use as a resize handle\n  ? value === element // otherwise check if element matches value as selector\n  : matchesUpTo(element, value, interactableElement);\n}\n/* eslint-disable multiline-ternary */\n\n\nfunction initCursors(browser) {\n  return browser.isIe9 ? {\n    x: 'e-resize',\n    y: 's-resize',\n    xy: 'se-resize',\n    top: 'n-resize',\n    left: 'w-resize',\n    bottom: 's-resize',\n    right: 'e-resize',\n    topleft: 'se-resize',\n    bottomright: 'se-resize',\n    topright: 'ne-resize',\n    bottomleft: 'ne-resize'\n  } : {\n    x: 'ew-resize',\n    y: 'ns-resize',\n    xy: 'nwse-resize',\n    top: 'ns-resize',\n    left: 'ew-resize',\n    bottom: 'ns-resize',\n    right: 'ew-resize',\n    topleft: 'nwse-resize',\n    bottomright: 'nwse-resize',\n    topright: 'nesw-resize',\n    bottomleft: 'nesw-resize'\n  };\n}\n/* eslint-enable multiline-ternary */\n\n\nfunction start({\n  iEvent,\n  interaction\n}) {\n  if (interaction.prepared.name !== 'resize' || !interaction.prepared.edges) {\n    return;\n  }\n\n  const resizeEvent = iEvent;\n  const rect = interaction.rect;\n  interaction._rects = {\n    start: extend({}, rect),\n    corrected: extend({}, rect),\n    previous: extend({}, rect),\n    delta: {\n      left: 0,\n      right: 0,\n      width: 0,\n      top: 0,\n      bottom: 0,\n      height: 0\n    }\n  };\n  resizeEvent.edges = interaction.prepared.edges;\n  resizeEvent.rect = interaction._rects.corrected;\n  resizeEvent.deltaRect = interaction._rects.delta;\n}\n\nfunction plugin_move({\n  iEvent,\n  interaction\n}) {\n  if (interaction.prepared.name !== 'resize' || !interaction.prepared.edges) {\n    return;\n  }\n\n  const resizeEvent = iEvent;\n  const resizeOptions = interaction.interactable.options.resize;\n  const invert = resizeOptions.invert;\n  const invertible = invert === 'reposition' || invert === 'negate';\n  const current = interaction.rect;\n  const {\n    start: startRect,\n    corrected,\n    delta: deltaRect,\n    previous\n  } = interaction._rects;\n  extend(previous, corrected);\n\n  if (invertible) {\n    // if invertible, copy the current rect\n    extend(corrected, current);\n\n    if (invert === 'reposition') {\n      // swap edge values if necessary to keep width/height positive\n      if (corrected.top > corrected.bottom) {\n        const swap = corrected.top;\n        corrected.top = corrected.bottom;\n        corrected.bottom = swap;\n      }\n\n      if (corrected.left > corrected.right) {\n        const swap = corrected.left;\n        corrected.left = corrected.right;\n        corrected.right = swap;\n      }\n    }\n  } else {\n    // if not invertible, restrict to minimum of 0x0 rect\n    corrected.top = Math.min(current.top, startRect.bottom);\n    corrected.bottom = Math.max(current.bottom, startRect.top);\n    corrected.left = Math.min(current.left, startRect.right);\n    corrected.right = Math.max(current.right, startRect.left);\n  }\n\n  corrected.width = corrected.right - corrected.left;\n  corrected.height = corrected.bottom - corrected.top;\n\n  for (const edge in corrected) {\n    deltaRect[edge] = corrected[edge] - previous[edge];\n  }\n\n  resizeEvent.edges = interaction.prepared.edges;\n  resizeEvent.rect = corrected;\n  resizeEvent.deltaRect = deltaRect;\n}\n\nfunction end({\n  iEvent,\n  interaction\n}) {\n  if (interaction.prepared.name !== 'resize' || !interaction.prepared.edges) {\n    return;\n  }\n\n  const resizeEvent = iEvent;\n  resizeEvent.edges = interaction.prepared.edges;\n  resizeEvent.rect = interaction._rects.corrected;\n  resizeEvent.deltaRect = interaction._rects.delta;\n}\n\nfunction updateEventAxes({\n  iEvent,\n  interaction\n}) {\n  if (interaction.prepared.name !== 'resize' || !interaction.resizeAxes) {\n    return;\n  }\n\n  const options = interaction.interactable.options;\n  const resizeEvent = iEvent;\n\n  if (options.resize.square) {\n    if (interaction.resizeAxes === 'y') {\n      resizeEvent.delta.x = resizeEvent.delta.y;\n    } else {\n      resizeEvent.delta.y = resizeEvent.delta.x;\n    }\n\n    resizeEvent.axes = 'xy';\n  } else {\n    resizeEvent.axes = interaction.resizeAxes;\n\n    if (interaction.resizeAxes === 'x') {\n      resizeEvent.delta.y = 0;\n    } else if (interaction.resizeAxes === 'y') {\n      resizeEvent.delta.x = 0;\n    }\n  }\n}\n\nconst resize = {\n  id: 'actions/resize',\n  before: ['actions/drag'],\n  install: resize_plugin_install,\n  listeners: {\n    'interactions:new': ({\n      interaction\n    }) => {\n      interaction.resizeAxes = 'xy';\n    },\n    'interactions:action-start': arg => {\n      start(arg);\n      updateEventAxes(arg);\n    },\n    'interactions:action-move': arg => {\n      plugin_move(arg);\n      updateEventAxes(arg);\n    },\n    'interactions:action-end': end,\n    'auto-start:check': resizeChecker\n  },\n  defaults: {\n    square: false,\n    preserveAspectRatio: false,\n    axis: 'xy',\n    // use default margin\n    margin: NaN,\n    // object with props left, right, top, bottom which are\n    // true/false values to resize when the pointer is over that edge,\n    // CSS selectors to match the handles for each direction\n    // or the Elements for each handle\n    edges: null,\n    // a value of 'none' will limit the resize rect to a minimum of 0x0\n    // 'negate' will alow the rect to have negative width/height\n    // 'reposition' will keep the width/height positive by swapping\n    // the top and bottom edges and/or swapping the left and right edges\n    invert: 'none'\n  },\n  cursors: null,\n\n  getCursor({\n    edges,\n    axis,\n    name\n  }) {\n    const cursors = resize.cursors;\n    let result = null;\n\n    if (axis) {\n      result = cursors[name + axis];\n    } else if (edges) {\n      let cursorKey = '';\n\n      for (const edge of ['top', 'bottom', 'left', 'right']) {\n        if (edges[edge]) {\n          cursorKey += edge;\n        }\n      }\n\n      result = cursors[cursorKey];\n    }\n\n    return result;\n  },\n\n  defaultMargin: null\n};\n/* harmony default export */ var resize_plugin = (resize);\n//# sourceMappingURL=plugin.js.map\n// CONCATENATED MODULE: ./node_modules/@interactjs/actions/resize/index.js\n/* eslint-disable import/order, no-console, eol-last */\n\n\n\nif (typeof window === 'object' && !!window) {\n  interact_init(window);\n}\n\n_interactjs_interact.use(resize_plugin);\n//# sourceMappingURL=index.js.map\n// CONCATENATED MODULE: ./node_modules/@interactjs/snappers/edgeTarget.js\n/* harmony default export */ var edgeTarget = (() => {});\n//# sourceMappingURL=edgeTarget.js.map\n// CONCATENATED MODULE: ./node_modules/@interactjs/snappers/elements.js\n/* harmony default export */ var snappers_elements = (() => {});\n//# sourceMappingURL=elements.js.map\n// CONCATENATED MODULE: ./node_modules/@interactjs/snappers/grid.js\n/* harmony default export */ var grid = (grid => {\n  const coordFields = [['x', 'y'], ['left', 'top'], ['right', 'bottom'], ['width', 'height']].filter(([xField, yField]) => xField in grid || yField in grid);\n\n  const gridFunc = (x, y) => {\n    const {\n      range,\n      limits = {\n        left: -Infinity,\n        right: Infinity,\n        top: -Infinity,\n        bottom: Infinity\n      },\n      offset = {\n        x: 0,\n        y: 0\n      }\n    } = grid;\n    const result = {\n      range,\n      grid,\n      x: null,\n      y: null\n    };\n\n    for (const [xField, yField] of coordFields) {\n      const gridx = Math.round((x - offset.x) / grid[xField]);\n      const gridy = Math.round((y - offset.y) / grid[yField]);\n      result[xField] = Math.max(limits.left, Math.min(limits.right, gridx * grid[xField] + offset.x));\n      result[yField] = Math.max(limits.top, Math.min(limits.bottom, gridy * grid[yField] + offset.y));\n    }\n\n    return result;\n  };\n\n  gridFunc.grid = grid;\n  gridFunc.coordFields = coordFields;\n  return gridFunc;\n});\n//# sourceMappingURL=grid.js.map\n// CONCATENATED MODULE: ./node_modules/@interactjs/snappers/all.js\n\n\n\n//# sourceMappingURL=all.js.map\n// CONCATENATED MODULE: ./node_modules/@interactjs/snappers/plugin.js\n\n\nconst snappersPlugin = {\n  id: 'snappers',\n\n  install(scope) {\n    const {\n      interactStatic: interact\n    } = scope;\n    interact.snappers = extend(interact.snappers || {}, all_namespaceObject);\n    interact.createSnapGrid = interact.snappers.grid;\n  }\n\n};\n/* harmony default export */ var snappers_plugin = (snappersPlugin);\n//# sourceMappingURL=plugin.js.map\n// CONCATENATED MODULE: ./node_modules/@interactjs/modifiers/Modification.js\n\n\n\nclass Modification_Modification {\n  constructor(interaction) {\n    this.states = [];\n    this.startOffset = {\n      left: 0,\n      right: 0,\n      top: 0,\n      bottom: 0\n    };\n    this.startDelta = null;\n    this.result = null;\n    this.endResult = null;\n    this.edges = void 0;\n    this.interaction = void 0;\n    this.interaction = interaction;\n    this.result = createResult();\n  }\n\n  start({\n    phase\n  }, pageCoords) {\n    const {\n      interaction\n    } = this;\n    const modifierList = getModifierList(interaction);\n    this.prepareStates(modifierList);\n    this.edges = extend({}, interaction.edges);\n    this.startOffset = getRectOffset(interaction.rect, pageCoords);\n    this.startDelta = {\n      x: 0,\n      y: 0\n    };\n    const arg = {\n      phase,\n      pageCoords,\n      preEnd: false\n    };\n    this.result = createResult();\n    this.startAll(arg);\n    const result = this.result = this.setAll(arg);\n    return result;\n  }\n\n  fillArg(arg) {\n    const {\n      interaction\n    } = this;\n    arg.interaction = interaction;\n    arg.interactable = interaction.interactable;\n    arg.element = interaction.element;\n    arg.rect = arg.rect || interaction.rect;\n    arg.edges = this.edges;\n    arg.startOffset = this.startOffset;\n  }\n\n  startAll(arg) {\n    this.fillArg(arg);\n\n    for (const state of this.states) {\n      if (state.methods.start) {\n        arg.state = state;\n        state.methods.start(arg);\n      }\n    }\n  }\n\n  setAll(arg) {\n    this.fillArg(arg);\n    const {\n      phase,\n      preEnd,\n      skipModifiers,\n      rect: unmodifiedRect\n    } = arg;\n    arg.coords = extend({}, arg.pageCoords);\n    arg.rect = extend({}, unmodifiedRect);\n    const states = skipModifiers ? this.states.slice(skipModifiers) : this.states;\n    const newResult = createResult(arg.coords, arg.rect);\n\n    for (const state of states) {\n      const {\n        options\n      } = state;\n      const lastModifierCoords = extend({}, arg.coords);\n      let returnValue = null;\n\n      if (state.methods.set && this.shouldDo(options, preEnd, phase)) {\n        arg.state = state;\n        returnValue = state.methods.set(arg);\n        addEdges(this.interaction.edges, arg.rect, {\n          x: arg.coords.x - lastModifierCoords.x,\n          y: arg.coords.y - lastModifierCoords.y\n        });\n      }\n\n      newResult.eventProps.push(returnValue);\n    }\n\n    newResult.delta.x = arg.coords.x - arg.pageCoords.x;\n    newResult.delta.y = arg.coords.y - arg.pageCoords.y;\n    newResult.rectDelta.left = arg.rect.left - unmodifiedRect.left;\n    newResult.rectDelta.right = arg.rect.right - unmodifiedRect.right;\n    newResult.rectDelta.top = arg.rect.top - unmodifiedRect.top;\n    newResult.rectDelta.bottom = arg.rect.bottom - unmodifiedRect.bottom;\n    const prevCoords = this.result.coords;\n    const prevRect = this.result.rect;\n\n    if (prevCoords && prevRect) {\n      const rectChanged = newResult.rect.left !== prevRect.left || newResult.rect.right !== prevRect.right || newResult.rect.top !== prevRect.top || newResult.rect.bottom !== prevRect.bottom;\n      newResult.changed = rectChanged || prevCoords.x !== newResult.coords.x || prevCoords.y !== newResult.coords.y;\n    }\n\n    return newResult;\n  }\n\n  applyToInteraction(arg) {\n    const {\n      interaction\n    } = this;\n    const {\n      phase\n    } = arg;\n    const curCoords = interaction.coords.cur;\n    const startCoords = interaction.coords.start;\n    const {\n      result,\n      startDelta\n    } = this;\n    const curDelta = result.delta;\n\n    if (phase === 'start') {\n      extend(this.startDelta, result.delta);\n    }\n\n    for (const [coordsSet, delta] of [[startCoords, startDelta], [curCoords, curDelta]]) {\n      coordsSet.page.x += delta.x;\n      coordsSet.page.y += delta.y;\n      coordsSet.client.x += delta.x;\n      coordsSet.client.y += delta.y;\n    }\n\n    const {\n      rectDelta\n    } = this.result;\n    const rect = arg.rect || interaction.rect;\n    rect.left += rectDelta.left;\n    rect.right += rectDelta.right;\n    rect.top += rectDelta.top;\n    rect.bottom += rectDelta.bottom;\n    rect.width = rect.right - rect.left;\n    rect.height = rect.bottom - rect.top;\n  }\n\n  setAndApply(arg) {\n    const {\n      interaction\n    } = this;\n    const {\n      phase,\n      preEnd,\n      skipModifiers\n    } = arg;\n    const result = this.setAll({\n      preEnd,\n      phase,\n      pageCoords: arg.modifiedCoords || interaction.coords.cur.page\n    });\n    this.result = result; // don't fire an action move if a modifier would keep the event in the same\n    // cordinates as before\n\n    if (!result.changed && (!skipModifiers || skipModifiers < this.states.length) && interaction.interacting()) {\n      return false;\n    }\n\n    if (arg.modifiedCoords) {\n      const {\n        page\n      } = interaction.coords.cur;\n      const adjustment = {\n        x: arg.modifiedCoords.x - page.x,\n        y: arg.modifiedCoords.y - page.y\n      };\n      result.coords.x += adjustment.x;\n      result.coords.y += adjustment.y;\n      result.delta.x += adjustment.x;\n      result.delta.y += adjustment.y;\n    }\n\n    this.applyToInteraction(arg);\n  }\n\n  beforeEnd(arg) {\n    const {\n      interaction,\n      event\n    } = arg;\n    const states = this.states;\n\n    if (!states || !states.length) {\n      return;\n    }\n\n    let doPreend = false;\n\n    for (const state of states) {\n      arg.state = state;\n      const {\n        options,\n        methods\n      } = state;\n      const endPosition = methods.beforeEnd && methods.beforeEnd(arg);\n\n      if (endPosition) {\n        this.endResult = endPosition;\n        return false;\n      }\n\n      doPreend = doPreend || !doPreend && this.shouldDo(options, true, arg.phase, true);\n    }\n\n    if (doPreend) {\n      // trigger a final modified move before ending\n      interaction.move({\n        event,\n        preEnd: true\n      });\n    }\n  }\n\n  stop(arg) {\n    const {\n      interaction\n    } = arg;\n\n    if (!this.states || !this.states.length) {\n      return;\n    }\n\n    const modifierArg = extend({\n      states: this.states,\n      interactable: interaction.interactable,\n      element: interaction.element,\n      rect: null\n    }, arg);\n    this.fillArg(modifierArg);\n\n    for (const state of this.states) {\n      modifierArg.state = state;\n\n      if (state.methods.stop) {\n        state.methods.stop(modifierArg);\n      }\n    }\n\n    this.states = null;\n    this.endResult = null;\n  }\n\n  prepareStates(modifierList) {\n    this.states = [];\n\n    for (let index = 0; index < modifierList.length; index++) {\n      const {\n        options,\n        methods,\n        name\n      } = modifierList[index];\n      this.states.push({\n        options,\n        methods,\n        index,\n        name\n      });\n    }\n\n    return this.states;\n  }\n\n  restoreInteractionCoords({\n    interaction: {\n      coords,\n      rect,\n      modification\n    }\n  }) {\n    if (!modification.result) {\n      return;\n    }\n\n    const {\n      startDelta\n    } = modification;\n    const {\n      delta: curDelta,\n      rectDelta\n    } = modification.result;\n    const coordsAndDeltas = [[coords.start, startDelta], [coords.cur, curDelta]];\n\n    for (const [coordsSet, delta] of coordsAndDeltas) {\n      coordsSet.page.x -= delta.x;\n      coordsSet.page.y -= delta.y;\n      coordsSet.client.x -= delta.x;\n      coordsSet.client.y -= delta.y;\n    }\n\n    rect.left -= rectDelta.left;\n    rect.right -= rectDelta.right;\n    rect.top -= rectDelta.top;\n    rect.bottom -= rectDelta.bottom;\n  }\n\n  shouldDo(options, preEnd, phase, requireEndOnly) {\n    if ( // ignore disabled modifiers\n    !options || options.enabled === false || // check if we require endOnly option to fire move before end\n    requireEndOnly && !options.endOnly || // don't apply endOnly modifiers when not ending\n    options.endOnly && !preEnd || // check if modifier should run be applied on start\n    phase === 'start' && !options.setStart) {\n      return false;\n    }\n\n    return true;\n  }\n\n  copyFrom(other) {\n    this.startOffset = other.startOffset;\n    this.startDelta = other.startDelta;\n    this.edges = other.edges;\n    this.states = other.states.map(s => clone(s));\n    this.result = createResult(extend({}, other.result.coords), extend({}, other.result.rect));\n  }\n\n  destroy() {\n    for (const prop in this) {\n      this[prop] = null;\n    }\n  }\n\n}\n\nfunction createResult(coords, rect) {\n  return {\n    rect,\n    coords,\n    delta: {\n      x: 0,\n      y: 0\n    },\n    rectDelta: {\n      left: 0,\n      right: 0,\n      top: 0,\n      bottom: 0\n    },\n    eventProps: [],\n    changed: true\n  };\n}\n\nfunction getModifierList(interaction) {\n  const actionOptions = interaction.interactable.options[interaction.prepared.name];\n  const actionModifiers = actionOptions.modifiers;\n\n  if (actionModifiers && actionModifiers.length) {\n    return actionModifiers;\n  }\n\n  return ['snap', 'snapSize', 'snapEdges', 'restrict', 'restrictEdges', 'restrictSize'].map(type => {\n    const options = actionOptions[type];\n    return options && options.enabled && {\n      options,\n      methods: options._methods\n    };\n  }).filter(m => !!m);\n}\n\nfunction getRectOffset(rect, coords) {\n  return rect ? {\n    left: coords.x - rect.left,\n    top: coords.y - rect.top,\n    right: rect.right - coords.x,\n    bottom: rect.bottom - coords.y\n  } : {\n    left: 0,\n    top: 0,\n    right: 0,\n    bottom: 0\n  };\n}\n//# sourceMappingURL=Modification.js.map\n// CONCATENATED MODULE: ./node_modules/@interactjs/modifiers/base.js\n\n\n\nfunction makeModifier(module, name) {\n  const {\n    defaults\n  } = module;\n  const methods = {\n    start: module.start,\n    set: module.set,\n    beforeEnd: module.beforeEnd,\n    stop: module.stop\n  };\n\n  const modifier = _options => {\n    const options = _options || {};\n    options.enabled = options.enabled !== false; // add missing defaults to options\n\n    for (const prop in defaults) {\n      if (!(prop in options)) {\n        options[prop] = defaults[prop];\n      }\n    }\n\n    const m = {\n      options,\n      methods,\n      name,\n      enable: () => {\n        options.enabled = true;\n        return m;\n      },\n      disable: () => {\n        options.enabled = false;\n        return m;\n      }\n    };\n    return m;\n  };\n\n  if (name && typeof name === 'string') {\n    // for backwrads compatibility\n    modifier._defaults = defaults;\n    modifier._methods = methods;\n  }\n\n  return modifier;\n}\nfunction addEventModifiers({\n  iEvent,\n  interaction: {\n    modification: {\n      result\n    }\n  }\n}) {\n  if (result) {\n    iEvent.modifiers = result.eventProps;\n  }\n}\nconst modifiersBase = {\n  id: 'modifiers/base',\n  before: ['actions'],\n  install: scope => {\n    scope.defaults.perAction.modifiers = [];\n  },\n  listeners: {\n    'interactions:new': ({\n      interaction\n    }) => {\n      interaction.modification = new Modification_Modification(interaction);\n    },\n    'interactions:before-action-start': arg => {\n      const {\n        modification\n      } = arg.interaction;\n      modification.start(arg, arg.interaction.coords.start.page);\n      arg.interaction.edges = modification.edges;\n      modification.applyToInteraction(arg);\n    },\n    'interactions:before-action-move': arg => arg.interaction.modification.setAndApply(arg),\n    'interactions:before-action-end': arg => arg.interaction.modification.beforeEnd(arg),\n    'interactions:action-start': addEventModifiers,\n    'interactions:action-move': addEventModifiers,\n    'interactions:action-end': addEventModifiers,\n    'interactions:after-action-start': arg => arg.interaction.modification.restoreInteractionCoords(arg),\n    'interactions:after-action-move': arg => arg.interaction.modification.restoreInteractionCoords(arg),\n    'interactions:stop': arg => arg.interaction.modification.stop(arg)\n  }\n};\n/* harmony default export */ var modifiers_base = (modifiersBase);\n//# sourceMappingURL=base.js.map\n// CONCATENATED MODULE: ./node_modules/@interactjs/modifiers/aspectRatio.js\n/**\n * @module modifiers/aspectRatio\n *\n * @description\n * This module forces elements to be resized with a specified dx/dy ratio.\n *\n * ```js\n * interact(target).resizable({\n *   modifiers: [\n *     interact.modifiers.snapSize({\n *       targets: [ interact.snappers.grid({ x: 20, y: 20 }) ],\n *     }),\n *     interact.aspectRatio({ ratio: 'preserve' }),\n *   ],\n * });\n * ```\n */\n\n\n\n\nconst aspectRatio = {\n  start(arg) {\n    const {\n      state,\n      rect,\n      edges: originalEdges,\n      pageCoords: coords\n    } = arg;\n    let {\n      ratio\n    } = state.options;\n    const {\n      equalDelta,\n      modifiers\n    } = state.options;\n\n    if (ratio === 'preserve') {\n      ratio = rect.width / rect.height;\n    }\n\n    state.startCoords = extend({}, coords);\n    state.startRect = extend({}, rect);\n    state.ratio = ratio;\n    state.equalDelta = equalDelta;\n    const linkedEdges = state.linkedEdges = {\n      top: originalEdges.top || originalEdges.left && !originalEdges.bottom,\n      left: originalEdges.left || originalEdges.top && !originalEdges.right,\n      bottom: originalEdges.bottom || originalEdges.right && !originalEdges.top,\n      right: originalEdges.right || originalEdges.bottom && !originalEdges.left\n    };\n    state.xIsPrimaryAxis = !!(originalEdges.left || originalEdges.right);\n\n    if (state.equalDelta) {\n      state.edgeSign = (linkedEdges.left ? 1 : -1) * (linkedEdges.top ? 1 : -1);\n    } else {\n      const negativeSecondaryEdge = state.xIsPrimaryAxis ? linkedEdges.top : linkedEdges.left;\n      state.edgeSign = negativeSecondaryEdge ? -1 : 1;\n    }\n\n    extend(arg.edges, linkedEdges);\n\n    if (!modifiers || !modifiers.length) {\n      return;\n    }\n\n    const subModification = new Modification_Modification(arg.interaction);\n    subModification.copyFrom(arg.interaction.modification);\n    subModification.prepareStates(modifiers);\n    state.subModification = subModification;\n    subModification.startAll({ ...arg\n    });\n  },\n\n  set(arg) {\n    const {\n      state,\n      rect,\n      coords\n    } = arg;\n    const initialCoords = extend({}, coords);\n    const aspectMethod = state.equalDelta ? setEqualDelta : setRatio;\n    aspectMethod(state, state.xIsPrimaryAxis, coords, rect);\n\n    if (!state.subModification) {\n      return null;\n    }\n\n    const correctedRect = extend({}, rect);\n    addEdges(state.linkedEdges, correctedRect, {\n      x: coords.x - initialCoords.x,\n      y: coords.y - initialCoords.y\n    });\n    const result = state.subModification.setAll({ ...arg,\n      rect: correctedRect,\n      edges: state.linkedEdges,\n      pageCoords: coords,\n      prevCoords: coords,\n      prevRect: correctedRect\n    });\n    const {\n      delta\n    } = result;\n\n    if (result.changed) {\n      const xIsCriticalAxis = Math.abs(delta.x) > Math.abs(delta.y); // do aspect modification again with critical edge axis as primary\n\n      aspectMethod(state, xIsCriticalAxis, result.coords, result.rect);\n      extend(coords, result.coords);\n    }\n\n    return result.eventProps;\n  },\n\n  defaults: {\n    ratio: 'preserve',\n    equalDelta: false,\n    modifiers: [],\n    enabled: false\n  }\n};\n\nfunction setEqualDelta({\n  startCoords,\n  edgeSign\n}, xIsPrimaryAxis, coords) {\n  if (xIsPrimaryAxis) {\n    coords.y = startCoords.y + (coords.x - startCoords.x) * edgeSign;\n  } else {\n    coords.x = startCoords.x + (coords.y - startCoords.y) * edgeSign;\n  }\n}\n\nfunction setRatio({\n  startRect,\n  startCoords,\n  ratio,\n  edgeSign\n}, xIsPrimaryAxis, coords, rect) {\n  if (xIsPrimaryAxis) {\n    const newHeight = rect.width / ratio;\n    coords.y = startCoords.y + (newHeight - startRect.height) * edgeSign;\n  } else {\n    const newWidth = rect.height * ratio;\n    coords.x = startCoords.x + (newWidth - startRect.width) * edgeSign;\n  }\n}\n\n/* harmony default export */ var modifiers_aspectRatio = (makeModifier(aspectRatio, 'aspectRatio'));\n\n//# sourceMappingURL=aspectRatio.js.map\n// CONCATENATED MODULE: ./node_modules/@interactjs/modifiers/noop.js\nconst noop = () => {};\n\nnoop._defaults = {};\n/* harmony default export */ var modifiers_noop = (noop);\n//# sourceMappingURL=noop.js.map\n// CONCATENATED MODULE: ./node_modules/@interactjs/modifiers/restrict/pointer.js\n\n\n\n\n\nfunction pointer_start({\n  rect,\n  startOffset,\n  state,\n  interaction,\n  pageCoords\n}) {\n  const {\n    options\n  } = state;\n  const {\n    elementRect\n  } = options;\n  const offset = extend({\n    left: 0,\n    top: 0,\n    right: 0,\n    bottom: 0\n  }, options.offset || {});\n\n  if (rect && elementRect) {\n    const restriction = getRestrictionRect(options.restriction, interaction, pageCoords);\n\n    if (restriction) {\n      const widthDiff = restriction.right - restriction.left - rect.width;\n      const heightDiff = restriction.bottom - restriction.top - rect.height;\n\n      if (widthDiff < 0) {\n        offset.left += widthDiff;\n        offset.right += widthDiff;\n      }\n\n      if (heightDiff < 0) {\n        offset.top += heightDiff;\n        offset.bottom += heightDiff;\n      }\n    }\n\n    offset.left += startOffset.left - rect.width * elementRect.left;\n    offset.top += startOffset.top - rect.height * elementRect.top;\n    offset.right += startOffset.right - rect.width * (1 - elementRect.right);\n    offset.bottom += startOffset.bottom - rect.height * (1 - elementRect.bottom);\n  }\n\n  state.offset = offset;\n}\n\nfunction set({\n  coords,\n  interaction,\n  state\n}) {\n  const {\n    options,\n    offset\n  } = state;\n  const restriction = getRestrictionRect(options.restriction, interaction, coords);\n\n  if (!restriction) {\n    return;\n  }\n\n  const rect = xywhToTlbr(restriction);\n  coords.x = Math.max(Math.min(rect.right - offset.right, coords.x), rect.left + offset.left);\n  coords.y = Math.max(Math.min(rect.bottom - offset.bottom, coords.y), rect.top + offset.top);\n}\n\nfunction getRestrictionRect(value, interaction, coords) {\n  if (is.func(value)) {\n    return resolveRectLike(value, interaction.interactable, interaction.element, [coords.x, coords.y, interaction]);\n  } else {\n    return resolveRectLike(value, interaction.interactable, interaction.element);\n  }\n}\nconst pointer_defaults = {\n  restriction: null,\n  elementRect: null,\n  offset: null,\n  endOnly: false,\n  enabled: false\n};\nconst restrict = {\n  start: pointer_start,\n  set,\n  defaults: pointer_defaults\n};\n/* harmony default export */ var restrict_pointer = (makeModifier(restrict, 'restrict'));\n\n//# sourceMappingURL=pointer.js.map\n// CONCATENATED MODULE: ./node_modules/@interactjs/modifiers/restrict/edges.js\n// This module adds the options.resize.restrictEdges setting which sets min and\n// max for the top, left, bottom and right edges of the target being resized.\n//\n// interact(target).resize({\n//   edges: { top: true, left: true },\n//   restrictEdges: {\n//     inner: { top: 200, left: 200, right: 400, bottom: 400 },\n//     outer: { top:   0, left:   0, right: 600, bottom: 600 },\n//   },\n// })\n\n\n\n\nconst noInner = {\n  top: +Infinity,\n  left: +Infinity,\n  bottom: -Infinity,\n  right: -Infinity\n};\nconst noOuter = {\n  top: -Infinity,\n  left: -Infinity,\n  bottom: +Infinity,\n  right: +Infinity\n};\n\nfunction edges_start({\n  interaction,\n  startOffset,\n  state\n}) {\n  const {\n    options\n  } = state;\n  let offset;\n\n  if (options) {\n    const offsetRect = getRestrictionRect(options.offset, interaction, interaction.coords.start.page);\n    offset = rectToXY(offsetRect);\n  }\n\n  offset = offset || {\n    x: 0,\n    y: 0\n  };\n  state.offset = {\n    top: offset.y + startOffset.top,\n    left: offset.x + startOffset.left,\n    bottom: offset.y - startOffset.bottom,\n    right: offset.x - startOffset.right\n  };\n}\n\nfunction edges_set({\n  coords,\n  edges,\n  interaction,\n  state\n}) {\n  const {\n    offset,\n    options\n  } = state;\n\n  if (!edges) {\n    return;\n  }\n\n  const page = extend({}, coords);\n  const inner = getRestrictionRect(options.inner, interaction, page) || {};\n  const outer = getRestrictionRect(options.outer, interaction, page) || {};\n  fixRect(inner, noInner);\n  fixRect(outer, noOuter);\n\n  if (edges.top) {\n    coords.y = Math.min(Math.max(outer.top + offset.top, page.y), inner.top + offset.top);\n  } else if (edges.bottom) {\n    coords.y = Math.max(Math.min(outer.bottom + offset.bottom, page.y), inner.bottom + offset.bottom);\n  }\n\n  if (edges.left) {\n    coords.x = Math.min(Math.max(outer.left + offset.left, page.x), inner.left + offset.left);\n  } else if (edges.right) {\n    coords.x = Math.max(Math.min(outer.right + offset.right, page.x), inner.right + offset.right);\n  }\n}\n\nfunction fixRect(rect, defaults) {\n  for (const edge of ['top', 'left', 'bottom', 'right']) {\n    if (!(edge in rect)) {\n      rect[edge] = defaults[edge];\n    }\n  }\n\n  return rect;\n}\n\nconst edges_defaults = {\n  inner: null,\n  outer: null,\n  offset: null,\n  endOnly: false,\n  enabled: false\n};\nconst restrictEdges = {\n  noInner,\n  noOuter,\n  start: edges_start,\n  set: edges_set,\n  defaults: edges_defaults\n};\n/* harmony default export */ var restrict_edges = (makeModifier(restrictEdges, 'restrictEdges'));\n\n//# sourceMappingURL=edges.js.map\n// CONCATENATED MODULE: ./node_modules/@interactjs/modifiers/restrict/rect.js\n\n\n\nconst rect_defaults = extend({\n  get elementRect() {\n    return {\n      top: 0,\n      left: 0,\n      bottom: 1,\n      right: 1\n    };\n  },\n\n  set elementRect(_) {}\n\n}, restrict.defaults);\nconst restrictRect = {\n  start: restrict.start,\n  set: restrict.set,\n  defaults: rect_defaults\n};\n/* harmony default export */ var restrict_rect = (makeModifier(restrictRect, 'restrictRect'));\n\n//# sourceMappingURL=rect.js.map\n// CONCATENATED MODULE: ./node_modules/@interactjs/modifiers/restrict/size.js\n\n\n\n\n\nconst noMin = {\n  width: -Infinity,\n  height: -Infinity\n};\nconst noMax = {\n  width: +Infinity,\n  height: +Infinity\n};\n\nfunction size_start(arg) {\n  return restrictEdges.start(arg);\n}\n\nfunction size_set(arg) {\n  const {\n    interaction,\n    state,\n    rect,\n    edges\n  } = arg;\n  const {\n    options\n  } = state;\n\n  if (!edges) {\n    return;\n  }\n\n  const minSize = tlbrToXywh(getRestrictionRect(options.min, interaction, arg.coords)) || noMin;\n  const maxSize = tlbrToXywh(getRestrictionRect(options.max, interaction, arg.coords)) || noMax;\n  state.options = {\n    endOnly: options.endOnly,\n    inner: extend({}, restrictEdges.noInner),\n    outer: extend({}, restrictEdges.noOuter)\n  };\n\n  if (edges.top) {\n    state.options.inner.top = rect.bottom - minSize.height;\n    state.options.outer.top = rect.bottom - maxSize.height;\n  } else if (edges.bottom) {\n    state.options.inner.bottom = rect.top + minSize.height;\n    state.options.outer.bottom = rect.top + maxSize.height;\n  }\n\n  if (edges.left) {\n    state.options.inner.left = rect.right - minSize.width;\n    state.options.outer.left = rect.right - maxSize.width;\n  } else if (edges.right) {\n    state.options.inner.right = rect.left + minSize.width;\n    state.options.outer.right = rect.left + maxSize.width;\n  }\n\n  restrictEdges.set(arg);\n  state.options = options;\n}\n\nconst size_defaults = {\n  min: null,\n  max: null,\n  endOnly: false,\n  enabled: false\n};\nconst restrictSize = {\n  start: size_start,\n  set: size_set,\n  defaults: size_defaults\n};\n/* harmony default export */ var size = (makeModifier(restrictSize, 'restrictSize'));\n\n//# sourceMappingURL=size.js.map\n// CONCATENATED MODULE: ./node_modules/@interactjs/modifiers/snap/pointer.js\n\n\n\n\n\n\n\nfunction snap_pointer_start(arg) {\n  const {\n    interaction,\n    interactable,\n    element,\n    rect,\n    state,\n    startOffset\n  } = arg;\n  const {\n    options\n  } = state;\n  const origin = options.offsetWithOrigin ? getOrigin(arg) : {\n    x: 0,\n    y: 0\n  };\n  let snapOffset;\n\n  if (options.offset === 'startCoords') {\n    snapOffset = {\n      x: interaction.coords.start.page.x,\n      y: interaction.coords.start.page.y\n    };\n  } else {\n    const offsetRect = resolveRectLike(options.offset, interactable, element, [interaction]);\n    snapOffset = rectToXY(offsetRect) || {\n      x: 0,\n      y: 0\n    };\n    snapOffset.x += origin.x;\n    snapOffset.y += origin.y;\n  }\n\n  const {\n    relativePoints\n  } = options;\n  state.offsets = rect && relativePoints && relativePoints.length ? relativePoints.map((relativePoint, index) => ({\n    index,\n    relativePoint,\n    x: startOffset.left - rect.width * relativePoint.x + snapOffset.x,\n    y: startOffset.top - rect.height * relativePoint.y + snapOffset.y\n  })) : [extend({\n    index: 0,\n    relativePoint: null\n  }, snapOffset)];\n}\n\nfunction pointer_set(arg) {\n  const {\n    interaction,\n    coords,\n    state\n  } = arg;\n  const {\n    options,\n    offsets\n  } = state;\n  const origin = getOriginXY(interaction.interactable, interaction.element, interaction.prepared.name);\n  const page = extend({}, coords);\n  const targets = [];\n\n  if (!options.offsetWithOrigin) {\n    page.x -= origin.x;\n    page.y -= origin.y;\n  }\n\n  for (const offset of offsets) {\n    const relativeX = page.x - offset.x;\n    const relativeY = page.y - offset.y;\n\n    for (let index = 0, len = options.targets.length; index < len; index++) {\n      const snapTarget = options.targets[index];\n      let target;\n\n      if (is.func(snapTarget)) {\n        target = snapTarget(relativeX, relativeY, interaction._proxy, offset, index);\n      } else {\n        target = snapTarget;\n      }\n\n      if (!target) {\n        continue;\n      }\n\n      targets.push({\n        x: (is.number(target.x) ? target.x : relativeX) + offset.x,\n        y: (is.number(target.y) ? target.y : relativeY) + offset.y,\n        range: is.number(target.range) ? target.range : options.range,\n        source: snapTarget,\n        index,\n        offset\n      });\n    }\n  }\n\n  const closest = {\n    target: null,\n    inRange: false,\n    distance: 0,\n    range: 0,\n    delta: {\n      x: 0,\n      y: 0\n    }\n  };\n\n  for (const target of targets) {\n    const range = target.range;\n    const dx = target.x - page.x;\n    const dy = target.y - page.y;\n    const distance = hypot(dx, dy);\n    let inRange = distance <= range; // Infinite targets count as being out of range\n    // compared to non infinite ones that are in range\n\n    if (range === Infinity && closest.inRange && closest.range !== Infinity) {\n      inRange = false;\n    }\n\n    if (!closest.target || (inRange // is the closest target in range?\n    ? closest.inRange && range !== Infinity // the pointer is relatively deeper in this target\n    ? distance / range < closest.distance / closest.range // this target has Infinite range and the closest doesn't\n    : range === Infinity && closest.range !== Infinity || // OR this target is closer that the previous closest\n    distance < closest.distance : // The other is not in range and the pointer is closer to this target\n    !closest.inRange && distance < closest.distance)) {\n      closest.target = target;\n      closest.distance = distance;\n      closest.range = range;\n      closest.inRange = inRange;\n      closest.delta.x = dx;\n      closest.delta.y = dy;\n    }\n  }\n\n  if (closest.inRange) {\n    coords.x = closest.target.x;\n    coords.y = closest.target.y;\n  }\n\n  state.closest = closest;\n  return closest;\n}\n\nfunction getOrigin(arg) {\n  const {\n    element\n  } = arg.interaction;\n  const optionsOrigin = rectToXY(resolveRectLike(arg.state.options.origin, null, null, [element]));\n  const origin = optionsOrigin || getOriginXY(arg.interactable, element, arg.interaction.prepared.name);\n  return origin;\n}\n\nconst snap_pointer_defaults = {\n  range: Infinity,\n  targets: null,\n  offset: null,\n  offsetWithOrigin: true,\n  origin: null,\n  relativePoints: null,\n  endOnly: false,\n  enabled: false\n};\nconst snap = {\n  start: snap_pointer_start,\n  set: pointer_set,\n  defaults: snap_pointer_defaults\n};\n/* harmony default export */ var snap_pointer = (makeModifier(snap, 'snap'));\n\n//# sourceMappingURL=pointer.js.map\n// CONCATENATED MODULE: ./node_modules/@interactjs/modifiers/snap/size.js\n// This module allows snapping of the size of targets during resize\n// interactions.\n\n\n\n\n\nfunction snap_size_start(arg) {\n  const {\n    state,\n    edges\n  } = arg;\n  const {\n    options\n  } = state;\n\n  if (!edges) {\n    return null;\n  }\n\n  arg.state = {\n    options: {\n      targets: null,\n      relativePoints: [{\n        x: edges.left ? 0 : 1,\n        y: edges.top ? 0 : 1\n      }],\n      offset: options.offset || 'self',\n      origin: {\n        x: 0,\n        y: 0\n      },\n      range: options.range\n    }\n  };\n  state.targetFields = state.targetFields || [['width', 'height'], ['x', 'y']];\n  snap.start(arg);\n  state.offsets = arg.state.offsets;\n  arg.state = state;\n}\n\nfunction snap_size_set(arg) {\n  const {\n    interaction,\n    state,\n    coords\n  } = arg;\n  const {\n    options,\n    offsets\n  } = state;\n  const relative = {\n    x: coords.x - offsets[0].x,\n    y: coords.y - offsets[0].y\n  };\n  state.options = extend({}, options);\n  state.options.targets = [];\n\n  for (const snapTarget of options.targets || []) {\n    let target;\n\n    if (is.func(snapTarget)) {\n      target = snapTarget(relative.x, relative.y, interaction);\n    } else {\n      target = snapTarget;\n    }\n\n    if (!target) {\n      continue;\n    }\n\n    for (const [xField, yField] of state.targetFields) {\n      if (xField in target || yField in target) {\n        target.x = target[xField];\n        target.y = target[yField];\n        break;\n      }\n    }\n\n    state.options.targets.push(target);\n  }\n\n  const returnValue = snap.set(arg);\n  state.options = options;\n  return returnValue;\n}\n\nconst snap_size_defaults = {\n  range: Infinity,\n  targets: null,\n  offset: null,\n  endOnly: false,\n  enabled: false\n};\nconst snapSize = {\n  start: snap_size_start,\n  set: snap_size_set,\n  defaults: snap_size_defaults\n};\n/* harmony default export */ var snap_size = (makeModifier(snapSize, 'snapSize'));\n\n//# sourceMappingURL=size.js.map\n// CONCATENATED MODULE: ./node_modules/@interactjs/modifiers/snap/edges.js\n/**\n * @module modifiers/snapEdges\n *\n * @description\n * WOW> This module allows snapping of the edges of targets during resize\n * interactions.\n *\n * ```js\n * interact(target).resizable({\n *   snapEdges: {\n *     targets: [interact.snappers.grid({ x: 100, y: 50 })],\n *   },\n * })\n *\n * interact(target).resizable({\n *   snapEdges: {\n *     targets: [\n *       interact.snappers.grid({\n *        top: 50,\n *        left: 50,\n *        bottom: 100,\n *        right: 100,\n *       }),\n *     ],\n *   },\n * })\n * ```\n */\n\n\n\n\n\nfunction snap_edges_start(arg) {\n  const {\n    edges\n  } = arg;\n\n  if (!edges) {\n    return null;\n  }\n\n  arg.state.targetFields = arg.state.targetFields || [[edges.left ? 'left' : 'right', edges.top ? 'top' : 'bottom']];\n  return snapSize.start(arg);\n}\n\nconst snapEdges = {\n  start: snap_edges_start,\n  set: snapSize.set,\n  defaults: extend(clone(snapSize.defaults), {\n    targets: null,\n    range: null,\n    offset: {\n      x: 0,\n      y: 0\n    }\n  })\n};\n/* harmony default export */ var snap_edges = (makeModifier(snapEdges, 'snapEdges'));\n\n//# sourceMappingURL=edges.js.map\n// CONCATENATED MODULE: ./node_modules/@interactjs/modifiers/all.js\n/* eslint-disable node/no-extraneous-import */\n\n\n\n\n\n\n\n\n\n\n\n\n/* harmony default export */ var modifiers_all = ({\n  aspectRatio: modifiers_aspectRatio,\n  restrictEdges: restrict_edges,\n  restrict: restrict_pointer,\n  restrictRect: restrict_rect,\n  restrictSize: size,\n  snapEdges: snap_edges,\n  snap: snap_pointer,\n  snapSize: snap_size,\n  spring: modifiers_noop,\n  avoid: modifiers_noop,\n  transform: modifiers_noop,\n  rubberband: modifiers_noop\n});\n//# sourceMappingURL=all.js.map\n// CONCATENATED MODULE: ./node_modules/@interactjs/modifiers/plugin.js\n\n\n\nconst plugin_modifiers = {\n  id: 'modifiers',\n\n  install(scope) {\n    const {\n      interactStatic: interact\n    } = scope;\n    scope.usePlugin(modifiers_base);\n    scope.usePlugin(snappers_plugin);\n    interact.modifiers = modifiers_all; // for backwrads compatibility\n\n    for (const type in modifiers_all) {\n      const {\n        _defaults,\n        _methods\n      } = modifiers_all[type];\n      _defaults._methods = _methods;\n      scope.defaults.perAction[type] = _defaults;\n    }\n  }\n\n};\n/* harmony default export */ var modifiers_plugin = (plugin_modifiers);\n//# sourceMappingURL=plugin.js.map\n// CONCATENATED MODULE: ./node_modules/@interactjs/modifiers/index.js\n/* eslint-disable import/order, no-console, eol-last */\n\n\n\nif (typeof window === 'object' && !!window) {\n  interact_init(window);\n}\n\n_interactjs_interact.use(modifiers_plugin);\n//# sourceMappingURL=index.js.map\n// CONCATENATED MODULE: ./node_modules/@interactjs/dev-tools/plugin.js\n/* eslint-disable no-console */\n\n\n\n\n\n\nvar CheckName;\n\n(function (CheckName) {\n  CheckName[\"touchAction\"] = \"touchAction\";\n  CheckName[\"boxSizing\"] = \"boxSizing\";\n  CheckName[\"noListeners\"] = \"noListeners\";\n})(CheckName || (CheckName = {}));\n\nconst prefix = '[interact.js] ';\nconst links = {\n  touchAction: 'https://developer.mozilla.org/en-US/docs/Web/CSS/touch-action',\n  boxSizing: 'https://developer.mozilla.org/en-US/docs/Web/CSS/box-sizing'\n}; // eslint-disable-next-line no-undef\n\nconst isProduction = \"development\" === 'production'; // eslint-disable-next-line no-restricted-syntax\n\nfunction dev_tools_plugin_install(scope, {\n  logger\n} = {}) {\n  const {\n    Interactable,\n    defaults\n  } = scope;\n  scope.logger = logger || console;\n  defaults.base.devTools = {\n    ignore: {}\n  };\n\n  Interactable.prototype.devTools = function (options) {\n    if (options) {\n      extend(this.options.devTools, options);\n      return this;\n    }\n\n    return this.options.devTools;\n  };\n}\n\nconst checks = [{\n  name: CheckName.touchAction,\n\n  perform({\n    element\n  }) {\n    return !parentHasStyle(element, 'touchAction', /pan-|pinch|none/);\n  },\n\n  getInfo({\n    element\n  }) {\n    return [element, links.touchAction];\n  },\n\n  text: 'Consider adding CSS \"touch-action: none\" to this element\\n'\n}, {\n  name: CheckName.boxSizing,\n\n  perform(interaction) {\n    const {\n      element\n    } = interaction;\n    return interaction.prepared.name === 'resize' && element instanceof utils_domObjects.HTMLElement && !hasStyle(element, 'boxSizing', /border-box/);\n  },\n\n  text: 'Consider adding CSS \"box-sizing: border-box\" to this resizable element',\n\n  getInfo({\n    element\n  }) {\n    return [element, links.boxSizing];\n  }\n\n}, {\n  name: CheckName.noListeners,\n\n  perform(interaction) {\n    const actionName = interaction.prepared.name;\n    const moveListeners = interaction.interactable.events.types[`${actionName}move`] || [];\n    return !moveListeners.length;\n  },\n\n  getInfo(interaction) {\n    return [interaction.prepared.name, interaction.interactable];\n  },\n\n  text: 'There are no listeners set for this action'\n}];\n\nfunction hasStyle(element, prop, styleRe) {\n  const value = element.style[prop] || win.getComputedStyle(element)[prop];\n  return styleRe.test((value || '').toString());\n}\n\nfunction parentHasStyle(element, prop, styleRe) {\n  let parent = element;\n\n  while (is.element(parent)) {\n    if (hasStyle(parent, prop, styleRe)) {\n      return true;\n    }\n\n    parent = parentNode(parent);\n  }\n\n  return false;\n}\n\nconst plugin_id = 'dev-tools';\nconst defaultExport = isProduction ? {\n  id: plugin_id,\n  install: () => {}\n} : {\n  id: plugin_id,\n  install: dev_tools_plugin_install,\n  listeners: {\n    'interactions:action-start': ({\n      interaction\n    }, scope) => {\n      for (const check of checks) {\n        const options = interaction.interactable && interaction.interactable.options;\n\n        if (!(options && options.devTools && options.devTools.ignore[check.name]) && check.perform(interaction)) {\n          scope.logger.warn(prefix + check.text, ...check.getInfo(interaction));\n        }\n      }\n    }\n  },\n  checks,\n  CheckName,\n  links,\n  prefix\n};\n/* harmony default export */ var dev_tools_plugin = (defaultExport);\n//# sourceMappingURL=plugin.js.map\n// CONCATENATED MODULE: ./node_modules/@interactjs/dev-tools/index.js\n/* eslint-disable import/order, no-console, eol-last */\n\n\n\nif (typeof window === 'object' && !!window) {\n  interact_init(window);\n}\n\n_interactjs_interact.use(dev_tools_plugin);\n//# sourceMappingURL=index.js.map\n// CONCATENATED MODULE: ./node_modules/cache-loader/dist/cjs.js??ref--12-0!./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options!./src/components/GridItem.vue?vue&type=script&lang=js&\n\n\n\n\n\n\n\n\n\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { Object(defineProperty[\"a\" /* default */])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }\n\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n //    var eventBus = require('./eventBus');\n\n\n\n\n\n\n\n\n/* harmony default export */ var GridItemvue_type_script_lang_js_ = ({\n  name: \"GridItem\",\n  props: {\n    /*cols: {\n     type: Number,\n     required: true\n     },*/\n\n    /*containerWidth: {\n     type: Number,\n     required: true\n       },\n     rowHeight: {\n     type: Number,\n     required: true\n     },\n     margin: {\n     type: Array,\n     required: true\n     },\n     maxRows: {\n     type: Number,\n     required: true\n     },*/\n    isDraggable: {\n      type: Boolean,\n      required: false,\n      default: null\n    },\n    isResizable: {\n      type: Boolean,\n      required: false,\n      default: null\n    },\n    isBounded: {\n      type: Boolean,\n      required: false,\n      default: null\n    },\n\n    /*useCssTransforms: {\n     type: Boolean,\n     required: true\n     },\n     */\n    static: {\n      type: Boolean,\n      required: false,\n      default: false\n    },\n    minH: {\n      type: Number,\n      required: false,\n      default: 1\n    },\n    minW: {\n      type: Number,\n      required: false,\n      default: 1\n    },\n    maxH: {\n      type: Number,\n      required: false,\n      default: Infinity\n    },\n    maxW: {\n      type: Number,\n      required: false,\n      default: Infinity\n    },\n    x: {\n      type: Number,\n      required: true\n    },\n    y: {\n      type: Number,\n      required: true\n    },\n    w: {\n      type: Number,\n      required: true\n    },\n    h: {\n      type: Number,\n      required: true\n    },\n    i: {\n      required: true\n    },\n    dragIgnoreFrom: {\n      type: String,\n      required: false,\n      default: 'a, button'\n    },\n    dragAllowFrom: {\n      type: String,\n      required: false,\n      default: null\n    },\n    resizeIgnoreFrom: {\n      type: String,\n      required: false,\n      default: 'a, button'\n    },\n    preserveAspectRatio: {\n      type: Boolean,\n      required: false,\n      default: false\n    },\n    dragOption: {\n      type: Object,\n      required: false,\n      default: function _default() {\n        return {};\n      }\n    },\n    resizeOption: {\n      type: Object,\n      required: false,\n      default: function _default() {\n        return {};\n      }\n    }\n  },\n  inject: [\"eventBus\", \"layout\"],\n  data: function data() {\n    return {\n      cols: 1,\n      containerWidth: 100,\n      rowHeight: 30,\n      margin: [10, 10],\n      maxRows: Infinity,\n      draggable: null,\n      resizable: null,\n      transformScale: 1,\n      useCssTransforms: true,\n      useStyleCursor: true,\n      isDragging: false,\n      dragging: null,\n      isResizing: false,\n      resizing: null,\n      lastX: NaN,\n      lastY: NaN,\n      lastW: NaN,\n      lastH: NaN,\n      style: {},\n      rtl: false,\n      dragEventSet: false,\n      resizeEventSet: false,\n      previousW: null,\n      previousH: null,\n      previousX: null,\n      previousY: null,\n      innerX: this.x,\n      innerY: this.y,\n      innerW: this.w,\n      innerH: this.h\n    };\n  },\n  created: function created() {\n    var _this = this;\n\n    var self = this; // Accessible refernces of functions for removing in beforeDestroy\n\n    self.updateWidthHandler = function (width) {\n      self.updateWidth(width);\n    };\n\n    self.compactHandler = function (layout) {\n      self.compact(layout);\n    };\n\n    self.setDraggableHandler = function (isDraggable) {\n      if (self.isDraggable === null) {\n        self.draggable = isDraggable;\n      }\n    };\n\n    self.setResizableHandler = function (isResizable) {\n      if (self.isResizable === null) {\n        self.resizable = isResizable;\n      }\n    };\n\n    self.setBoundedHandler = function (isBounded) {\n      if (self.isBounded === null) {\n        self.bounded = isBounded;\n      }\n    };\n\n    self.setTransformScaleHandler = function (transformScale) {\n      self.transformScale = transformScale;\n    };\n\n    self.setRowHeightHandler = function (rowHeight) {\n      self.rowHeight = rowHeight;\n    };\n\n    self.setMaxRowsHandler = function (maxRows) {\n      self.maxRows = maxRows;\n    };\n\n    self.directionchangeHandler = function () {\n      _this.rtl = Object(DOM[\"b\" /* getDocumentDir */])() === 'rtl';\n\n      _this.compact();\n    };\n\n    self.setColNum = function (colNum) {\n      self.cols = parseInt(colNum);\n    };\n\n    this.eventBus.$on('updateWidth', self.updateWidthHandler);\n    this.eventBus.$on('compact', self.compactHandler);\n    this.eventBus.$on('setDraggable', self.setDraggableHandler);\n    this.eventBus.$on('setResizable', self.setResizableHandler);\n    this.eventBus.$on('setBounded', self.setBoundedHandler);\n    this.eventBus.$on('setTransformScale', self.setTransformScaleHandler);\n    this.eventBus.$on('setRowHeight', self.setRowHeightHandler);\n    this.eventBus.$on('setMaxRows', self.setMaxRowsHandler);\n    this.eventBus.$on('directionchange', self.directionchangeHandler);\n    this.eventBus.$on('setColNum', self.setColNum);\n    this.rtl = Object(DOM[\"b\" /* getDocumentDir */])() === 'rtl';\n  },\n  beforeDestroy: function beforeDestroy() {\n    var self = this; //Remove listeners\n\n    this.eventBus.$off('updateWidth', self.updateWidthHandler);\n    this.eventBus.$off('compact', self.compactHandler);\n    this.eventBus.$off('setDraggable', self.setDraggableHandler);\n    this.eventBus.$off('setResizable', self.setResizableHandler);\n    this.eventBus.$off('setBounded', self.setBoundedHandler);\n    this.eventBus.$off('setTransformScale', self.setTransformScaleHandler);\n    this.eventBus.$off('setRowHeight', self.setRowHeightHandler);\n    this.eventBus.$off('setMaxRows', self.setMaxRowsHandler);\n    this.eventBus.$off('directionchange', self.directionchangeHandler);\n    this.eventBus.$off('setColNum', self.setColNum);\n\n    if (this.interactObj) {\n      this.interactObj.unset(); // destroy interact intance\n    }\n  },\n  mounted: function mounted() {\n    if (this.layout.responsive && this.layout.lastBreakpoint) {\n      this.cols = Object(responsiveUtils[\"c\" /* getColsFromBreakpoint */])(this.layout.lastBreakpoint, this.layout.cols);\n    } else {\n      this.cols = this.layout.colNum;\n    }\n\n    this.rowHeight = this.layout.rowHeight;\n    this.containerWidth = this.layout.width !== null ? this.layout.width : 100;\n    this.margin = this.layout.margin !== undefined ? this.layout.margin : [10, 10];\n    this.maxRows = this.layout.maxRows;\n\n    if (this.isDraggable === null) {\n      this.draggable = this.layout.isDraggable;\n    } else {\n      this.draggable = this.isDraggable;\n    }\n\n    if (this.isResizable === null) {\n      this.resizable = this.layout.isResizable;\n    } else {\n      this.resizable = this.isResizable;\n    }\n\n    if (this.isBounded === null) {\n      this.bounded = this.layout.isBounded;\n    } else {\n      this.bounded = this.isBounded;\n    }\n\n    this.transformScale = this.layout.transformScale;\n    this.useCssTransforms = this.layout.useCssTransforms;\n    this.useStyleCursor = this.layout.useStyleCursor;\n    this.createStyle();\n  },\n  watch: {\n    isDraggable: function isDraggable() {\n      this.draggable = this.isDraggable;\n    },\n    static: function _static() {\n      this.tryMakeDraggable();\n      this.tryMakeResizable();\n    },\n    draggable: function draggable() {\n      this.tryMakeDraggable();\n    },\n    isResizable: function isResizable() {\n      this.resizable = this.isResizable;\n    },\n    isBounded: function isBounded() {\n      this.bounded = this.isBounded;\n    },\n    resizable: function resizable() {\n      this.tryMakeResizable();\n    },\n    rowHeight: function rowHeight() {\n      this.createStyle();\n      this.emitContainerResized();\n    },\n    cols: function cols() {\n      this.tryMakeResizable();\n      this.createStyle();\n      this.emitContainerResized();\n    },\n    containerWidth: function containerWidth() {\n      this.tryMakeResizable();\n      this.createStyle();\n      this.emitContainerResized();\n    },\n    x: function x(newVal) {\n      this.innerX = newVal;\n      this.createStyle();\n    },\n    y: function y(newVal) {\n      this.innerY = newVal;\n      this.createStyle();\n    },\n    h: function h(newVal) {\n      this.innerH = newVal;\n      this.createStyle(); // this.emitContainerResized();\n    },\n    w: function w(newVal) {\n      this.innerW = newVal;\n      this.createStyle(); // this.emitContainerResized();\n    },\n    renderRtl: function renderRtl() {\n      // console.log(\"### renderRtl\");\n      this.tryMakeResizable();\n      this.createStyle();\n    },\n    minH: function minH() {\n      this.tryMakeResizable();\n    },\n    maxH: function maxH() {\n      this.tryMakeResizable();\n    },\n    minW: function minW() {\n      this.tryMakeResizable();\n    },\n    maxW: function maxW() {\n      this.tryMakeResizable();\n    },\n    \"$parent.margin\": function $parentMargin(margin) {\n      if (!margin || margin[0] == this.margin[0] && margin[1] == this.margin[1]) {\n        return;\n      }\n\n      this.margin = margin.map(function (m) {\n        return Number(m);\n      });\n      this.createStyle();\n      this.emitContainerResized();\n    }\n  },\n  computed: {\n    classObj: function classObj() {\n      return {\n        'vue-resizable': this.resizableAndNotStatic,\n        'static': this.static,\n        'resizing': this.isResizing,\n        'vue-draggable-dragging': this.isDragging,\n        'cssTransforms': this.useCssTransforms,\n        'render-rtl': this.renderRtl,\n        'disable-userselect': this.isDragging,\n        'no-touch': this.isAndroid && this.draggableOrResizableAndNotStatic\n      };\n    },\n    resizableAndNotStatic: function resizableAndNotStatic() {\n      return this.resizable && !this.static;\n    },\n    draggableOrResizableAndNotStatic: function draggableOrResizableAndNotStatic() {\n      return (this.draggable || this.resizable) && !this.static;\n    },\n    isAndroid: function isAndroid() {\n      return navigator.userAgent.toLowerCase().indexOf(\"android\") !== -1;\n    },\n    renderRtl: function renderRtl() {\n      return this.layout.isMirrored ? !this.rtl : this.rtl;\n    },\n    resizableHandleClass: function resizableHandleClass() {\n      if (this.renderRtl) {\n        return 'vue-resizable-handle vue-rtl-resizable-handle';\n      } else {\n        return 'vue-resizable-handle';\n      }\n    }\n  },\n  methods: {\n    createStyle: function createStyle() {\n      if (this.x + this.w > this.cols) {\n        this.innerX = 0;\n        this.innerW = this.w > this.cols ? this.cols : this.w;\n      } else {\n        this.innerX = this.x;\n        this.innerW = this.w;\n      }\n\n      var pos = this.calcPosition(this.innerX, this.innerY, this.innerW, this.innerH);\n\n      if (this.isDragging) {\n        pos.top = this.dragging.top; //                    Add rtl support\n\n        if (this.renderRtl) {\n          pos.right = this.dragging.left;\n        } else {\n          pos.left = this.dragging.left;\n        }\n      }\n\n      if (this.isResizing) {\n        pos.width = this.resizing.width;\n        pos.height = this.resizing.height;\n      }\n\n      var style; // CSS Transforms support (default)\n\n      if (this.useCssTransforms) {\n        //                    Add rtl support\n        if (this.renderRtl) {\n          style = Object(utils[\"k\" /* setTransformRtl */])(pos.top, pos.right, pos.width, pos.height);\n        } else {\n          style = Object(utils[\"j\" /* setTransform */])(pos.top, pos.left, pos.width, pos.height);\n        }\n      } else {\n        // top,left (slow)\n        //                    Add rtl support\n        if (this.renderRtl) {\n          style = Object(utils[\"i\" /* setTopRight */])(pos.top, pos.right, pos.width, pos.height);\n        } else {\n          style = Object(utils[\"h\" /* setTopLeft */])(pos.top, pos.left, pos.width, pos.height);\n        }\n      }\n\n      this.style = style;\n    },\n    emitContainerResized: function emitContainerResized() {\n      // this.style has width and height with trailing 'px'. The\n      // resized event is without them\n      var styleProps = {};\n\n      for (var _i = 0, _arr = ['width', 'height']; _i < _arr.length; _i++) {\n        var prop = _arr[_i];\n        var val = this.style[prop];\n        var matches = val.match(/^(\\d+)px$/);\n        if (!matches) return;\n        styleProps[prop] = matches[1];\n      }\n\n      this.$emit(\"container-resized\", this.i, this.h, this.w, styleProps.height, styleProps.width);\n    },\n    handleResize: function handleResize(event) {\n      if (this.static) return;\n      var position = getControlPosition(event); // Get the current drag point from the event. This is used as the offset.\n\n      if (position == null) return; // not possible but satisfies flow\n\n      var x = position.x,\n          y = position.y;\n      var newSize = {\n        width: 0,\n        height: 0\n      };\n      var pos;\n\n      switch (event.type) {\n        case \"resizestart\":\n          {\n            this.tryMakeResizable();\n            this.previousW = this.innerW;\n            this.previousH = this.innerH;\n            pos = this.calcPosition(this.innerX, this.innerY, this.innerW, this.innerH);\n            newSize.width = pos.width;\n            newSize.height = pos.height;\n            this.resizing = newSize;\n            this.isResizing = true;\n            break;\n          }\n\n        case \"resizemove\":\n          {\n            //                        console.log(\"### resize => \" + event.type + \", lastW=\" + this.lastW + \", lastH=\" + this.lastH);\n            var coreEvent = createCoreData(this.lastW, this.lastH, x, y);\n\n            if (this.renderRtl) {\n              newSize.width = this.resizing.width - coreEvent.deltaX / this.transformScale;\n            } else {\n              newSize.width = this.resizing.width + coreEvent.deltaX / this.transformScale;\n            }\n\n            newSize.height = this.resizing.height + coreEvent.deltaY / this.transformScale; ///console.log(\"### resize => \" + event.type + \", deltaX=\" + coreEvent.deltaX + \", deltaY=\" + coreEvent.deltaY);\n\n            this.resizing = newSize;\n            break;\n          }\n\n        case \"resizeend\":\n          {\n            //console.log(\"### resize end => x=\" +this.innerX + \" y=\" + this.innerY + \" w=\" + this.innerW + \" h=\" + this.innerH);\n            pos = this.calcPosition(this.innerX, this.innerY, this.innerW, this.innerH);\n            newSize.width = pos.width;\n            newSize.height = pos.height; //                        console.log(\"### resize end => \" + JSON.stringify(newSize));\n\n            this.resizing = null;\n            this.isResizing = false;\n            break;\n          }\n      } // Get new WH\n\n\n      pos = this.calcWH(newSize.height, newSize.width);\n\n      if (pos.w < this.minW) {\n        pos.w = this.minW;\n      }\n\n      if (pos.w > this.maxW) {\n        pos.w = this.maxW;\n      }\n\n      if (pos.h < this.minH) {\n        pos.h = this.minH;\n      }\n\n      if (pos.h > this.maxH) {\n        pos.h = this.maxH;\n      }\n\n      if (pos.h < 1) {\n        pos.h = 1;\n      }\n\n      if (pos.w < 1) {\n        pos.w = 1;\n      }\n\n      this.lastW = x;\n      this.lastH = y;\n\n      if (this.innerW !== pos.w || this.innerH !== pos.h) {\n        this.$emit(\"resize\", this.i, pos.h, pos.w, newSize.height, newSize.width);\n      }\n\n      if (event.type === \"resizeend\" && (this.previousW !== this.innerW || this.previousH !== this.innerH)) {\n        this.$emit(\"resized\", this.i, pos.h, pos.w, newSize.height, newSize.width);\n      }\n\n      this.eventBus.$emit(\"resizeEvent\", event.type, this.i, this.innerX, this.innerY, pos.h, pos.w);\n    },\n    handleDrag: function handleDrag(event) {\n      if (this.static) return;\n      if (this.isResizing) return;\n      var position = getControlPosition(event); // Get the current drag point from the event. This is used as the offset.\n\n      if (position === null) return; // not possible but satisfies flow\n\n      var x = position.x,\n          y = position.y; // let shouldUpdate = false;\n\n      var newPosition = {\n        top: 0,\n        left: 0\n      };\n\n      switch (event.type) {\n        case \"dragstart\":\n          {\n            this.previousX = this.innerX;\n            this.previousY = this.innerY;\n            var parentRect = event.target.offsetParent.getBoundingClientRect();\n            var clientRect = event.target.getBoundingClientRect();\n            var cLeft = clientRect.left / this.transformScale;\n            var pLeft = parentRect.left / this.transformScale;\n            var cRight = clientRect.right / this.transformScale;\n            var pRight = parentRect.right / this.transformScale;\n            var cTop = clientRect.top / this.transformScale;\n            var pTop = parentRect.top / this.transformScale;\n\n            if (this.renderRtl) {\n              newPosition.left = (cRight - pRight) * -1;\n            } else {\n              newPosition.left = cLeft - pLeft;\n            }\n\n            newPosition.top = cTop - pTop;\n            this.dragging = newPosition;\n            this.isDragging = true;\n            break;\n          }\n\n        case \"dragend\":\n          {\n            if (!this.isDragging) return;\n\n            var _parentRect = event.target.offsetParent.getBoundingClientRect();\n\n            var _clientRect = event.target.getBoundingClientRect();\n\n            var _cLeft = _clientRect.left / this.transformScale;\n\n            var _pLeft = _parentRect.left / this.transformScale;\n\n            var _cRight = _clientRect.right / this.transformScale;\n\n            var _pRight = _parentRect.right / this.transformScale;\n\n            var _cTop = _clientRect.top / this.transformScale;\n\n            var _pTop = _parentRect.top / this.transformScale; //                        Add rtl support\n\n\n            if (this.renderRtl) {\n              newPosition.left = (_cRight - _pRight) * -1;\n            } else {\n              newPosition.left = _cLeft - _pLeft;\n            }\n\n            newPosition.top = _cTop - _pTop; //                        console.log(\"### drag end => \" + JSON.stringify(newPosition));\n            //                        console.log(\"### DROP: \" + JSON.stringify(newPosition));\n\n            this.dragging = null;\n            this.isDragging = false; // shouldUpdate = true;\n\n            break;\n          }\n\n        case \"dragmove\":\n          {\n            var coreEvent = createCoreData(this.lastX, this.lastY, x, y); //                        Add rtl support\n\n            if (this.renderRtl) {\n              newPosition.left = this.dragging.left - coreEvent.deltaX / this.transformScale;\n            } else {\n              newPosition.left = this.dragging.left + coreEvent.deltaX / this.transformScale;\n            }\n\n            newPosition.top = this.dragging.top + coreEvent.deltaY / this.transformScale;\n\n            if (this.bounded) {\n              var bottomBoundary = event.target.offsetParent.clientHeight - this.calcGridItemWHPx(this.h, this.rowHeight, this.margin[1]);\n              newPosition.top = this.clamp(newPosition.top, 0, bottomBoundary);\n              var colWidth = this.calcColWidth();\n              var rightBoundary = this.containerWidth - this.calcGridItemWHPx(this.w, colWidth, this.margin[0]);\n              newPosition.left = this.clamp(newPosition.left, 0, rightBoundary);\n            } //                        console.log(\"### drag => \" + event.type + \", x=\" + x + \", y=\" + y);\n            //                        console.log(\"### drag => \" + event.type + \", deltaX=\" + coreEvent.deltaX + \", deltaY=\" + coreEvent.deltaY);\n            //                        console.log(\"### drag end => \" + JSON.stringify(newPosition));\n\n\n            this.dragging = newPosition;\n            break;\n          }\n      } // Get new XY\n\n\n      var pos;\n\n      if (this.renderRtl) {\n        pos = this.calcXY(newPosition.top, newPosition.left);\n      } else {\n        pos = this.calcXY(newPosition.top, newPosition.left);\n      }\n\n      this.lastX = x;\n      this.lastY = y;\n\n      if (this.innerX !== pos.x || this.innerY !== pos.y) {\n        this.$emit(\"move\", this.i, pos.x, pos.y);\n      }\n\n      if (event.type === \"dragend\" && (this.previousX !== this.innerX || this.previousY !== this.innerY)) {\n        this.$emit(\"moved\", this.i, pos.x, pos.y);\n      }\n\n      this.eventBus.$emit(\"dragEvent\", event.type, this.i, pos.x, pos.y, this.innerH, this.innerW);\n    },\n    calcPosition: function calcPosition(x, y, w, h) {\n      var colWidth = this.calcColWidth(); // add rtl support\n\n      var out;\n\n      if (this.renderRtl) {\n        out = {\n          right: Math.round(colWidth * x + (x + 1) * this.margin[0]),\n          top: Math.round(this.rowHeight * y + (y + 1) * this.margin[1]),\n          // 0 * Infinity === NaN, which causes problems with resize constriants;\n          // Fix this if it occurs.\n          // Note we do it here rather than later because Math.round(Infinity) causes deopt\n          width: w === Infinity ? w : Math.round(colWidth * w + Math.max(0, w - 1) * this.margin[0]),\n          height: h === Infinity ? h : Math.round(this.rowHeight * h + Math.max(0, h - 1) * this.margin[1])\n        };\n      } else {\n        out = {\n          left: Math.round(colWidth * x + (x + 1) * this.margin[0]),\n          top: Math.round(this.rowHeight * y + (y + 1) * this.margin[1]),\n          // 0 * Infinity === NaN, which causes problems with resize constriants;\n          // Fix this if it occurs.\n          // Note we do it here rather than later because Math.round(Infinity) causes deopt\n          width: w === Infinity ? w : Math.round(colWidth * w + Math.max(0, w - 1) * this.margin[0]),\n          height: h === Infinity ? h : Math.round(this.rowHeight * h + Math.max(0, h - 1) * this.margin[1])\n        };\n      }\n\n      return out;\n    },\n\n    /**\n     * Translate x and y coordinates from pixels to grid units.\n     * @param  {Number} top  Top position (relative to parent) in pixels.\n     * @param  {Number} left Left position (relative to parent) in pixels.\n     * @return {Object} x and y in grid units.\n     */\n    // TODO check if this function needs change in order to support rtl.\n    calcXY: function calcXY(top, left) {\n      var colWidth = this.calcColWidth(); // left = colWidth * x + margin * (x + 1)\n      // l = cx + m(x+1)\n      // l = cx + mx + m\n      // l - m = cx + mx\n      // l - m = x(c + m)\n      // (l - m) / (c + m) = x\n      // x = (left - margin) / (coldWidth + margin)\n\n      var x = Math.round((left - this.margin[0]) / (colWidth + this.margin[0]));\n      var y = Math.round((top - this.margin[1]) / (this.rowHeight + this.margin[1])); // Capping\n\n      x = Math.max(Math.min(x, this.cols - this.innerW), 0);\n      y = Math.max(Math.min(y, this.maxRows - this.innerH), 0);\n      return {\n        x: x,\n        y: y\n      };\n    },\n    // Helper for generating column width\n    calcColWidth: function calcColWidth() {\n      var colWidth = (this.containerWidth - this.margin[0] * (this.cols + 1)) / this.cols; // console.log(\"### COLS=\" + this.cols + \" COL WIDTH=\" + colWidth + \" MARGIN \" + this.margin[0]);\n\n      return colWidth;\n    },\n    // This can either be called:\n    // calcGridItemWHPx(w, colWidth, margin[0])\n    // or\n    // calcGridItemWHPx(h, rowHeight, margin[1])\n    calcGridItemWHPx: function calcGridItemWHPx(gridUnits, colOrRowSize, marginPx) {\n      // 0 * Infinity === NaN, which causes problems with resize contraints\n      if (!Number.isFinite(gridUnits)) return gridUnits;\n      return Math.round(colOrRowSize * gridUnits + Math.max(0, gridUnits - 1) * marginPx);\n    },\n    // Similar to _.clamp\n    clamp: function clamp(num, lowerBound, upperBound) {\n      return Math.max(Math.min(num, upperBound), lowerBound);\n    },\n\n    /**\n     * Given a height and width in pixel values, calculate grid units.\n     * @param  {Number} height Height in pixels.\n     * @param  {Number} width  Width in pixels.\n     * @param  {Boolean} autoSizeFlag  function autoSize identifier.\n     * @return {Object} w, h as grid units.\n     */\n    calcWH: function calcWH(height, width) {\n      var autoSizeFlag = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n      var colWidth = this.calcColWidth(); // width = colWidth * w - (margin * (w - 1))\n      // ...\n      // w = (width + margin) / (colWidth + margin)\n\n      var w = Math.round((width + this.margin[0]) / (colWidth + this.margin[0]));\n      var h = 0;\n\n      if (!autoSizeFlag) {\n        h = Math.round((height + this.margin[1]) / (this.rowHeight + this.margin[1]));\n      } else {\n        h = Math.ceil((height + this.margin[1]) / (this.rowHeight + this.margin[1]));\n      } // Capping\n\n\n      w = Math.max(Math.min(w, this.cols - this.innerX), 0);\n      h = Math.max(Math.min(h, this.maxRows - this.innerY), 0);\n      return {\n        w: w,\n        h: h\n      };\n    },\n    updateWidth: function updateWidth(width, colNum) {\n      this.containerWidth = width;\n\n      if (colNum !== undefined && colNum !== null) {\n        this.cols = colNum;\n      }\n    },\n    compact: function compact() {\n      this.createStyle();\n    },\n    tryMakeDraggable: function tryMakeDraggable() {\n      var self = this;\n\n      if (this.interactObj === null || this.interactObj === undefined) {\n        this.interactObj = _interactjs_interact(this.$refs.item);\n\n        if (!this.useStyleCursor) {\n          this.interactObj.styleCursor(false);\n        }\n      }\n\n      if (this.draggable && !this.static) {\n        var opts = _objectSpread({\n          ignoreFrom: this.dragIgnoreFrom,\n          allowFrom: this.dragAllowFrom\n        }, this.dragOption);\n\n        this.interactObj.draggable(opts);\n        /*this.interactObj.draggable({allowFrom: '.vue-draggable-handle'});*/\n\n        if (!this.dragEventSet) {\n          this.dragEventSet = true;\n          this.interactObj.on('dragstart dragmove dragend', function (event) {\n            self.handleDrag(event);\n          });\n        }\n      } else {\n        this.interactObj.draggable({\n          enabled: false\n        });\n      }\n    },\n    tryMakeResizable: function tryMakeResizable() {\n      var self = this;\n\n      if (this.interactObj === null || this.interactObj === undefined) {\n        this.interactObj = _interactjs_interact(this.$refs.item);\n\n        if (!this.useStyleCursor) {\n          this.interactObj.styleCursor(false);\n        }\n      }\n\n      if (this.resizable && !this.static) {\n        var maximum = this.calcPosition(0, 0, this.maxW, this.maxH);\n        var minimum = this.calcPosition(0, 0, this.minW, this.minH); // console.log(\"### MAX \" + JSON.stringify(maximum));\n        // console.log(\"### MIN \" + JSON.stringify(minimum));\n\n        var opts = _objectSpread({\n          // allowFrom: \".\" + this.resizableHandleClass.trim().replace(\" \", \".\"),\n          edges: {\n            left: false,\n            right: \".\" + this.resizableHandleClass.trim().replace(\" \", \".\"),\n            bottom: \".\" + this.resizableHandleClass.trim().replace(\" \", \".\"),\n            top: false\n          },\n          ignoreFrom: this.resizeIgnoreFrom,\n          restrictSize: {\n            min: {\n              height: minimum.height * this.transformScale,\n              width: minimum.width * this.transformScale\n            },\n            max: {\n              height: maximum.height * this.transformScale,\n              width: maximum.width * this.transformScale\n            }\n          }\n        }, this.resizeOption);\n\n        if (this.preserveAspectRatio) {\n          opts.modifiers = [_interactjs_interact.modifiers.aspectRatio({\n            ratio: 'preserve'\n          })];\n        }\n\n        this.interactObj.resizable(opts);\n\n        if (!this.resizeEventSet) {\n          this.resizeEventSet = true;\n          this.interactObj.on('resizestart resizemove resizeend', function (event) {\n            self.handleResize(event);\n          });\n        }\n      } else {\n        this.interactObj.resizable({\n          enabled: false\n        });\n      }\n    },\n    autoSize: function autoSize() {\n      // ok here we want to calculate if a resize is needed\n      this.previousW = this.innerW;\n      this.previousH = this.innerH;\n      var newSize = this.$slots.default[0].elm.getBoundingClientRect();\n      var pos = this.calcWH(newSize.height, newSize.width, true);\n\n      if (pos.w < this.minW) {\n        pos.w = this.minW;\n      }\n\n      if (pos.w > this.maxW) {\n        pos.w = this.maxW;\n      }\n\n      if (pos.h < this.minH) {\n        pos.h = this.minH;\n      }\n\n      if (pos.h > this.maxH) {\n        pos.h = this.maxH;\n      }\n\n      if (pos.h < 1) {\n        pos.h = 1;\n      }\n\n      if (pos.w < 1) {\n        pos.w = 1;\n      } // this.lastW = x; // basically, this is copied from resizehandler, but shouldn't be needed\n      // this.lastH = y;\n\n\n      if (this.innerW !== pos.w || this.innerH !== pos.h) {\n        this.$emit(\"resize\", this.i, pos.h, pos.w, newSize.height, newSize.width);\n      }\n\n      if (this.previousW !== pos.w || this.previousH !== pos.h) {\n        this.$emit(\"resized\", this.i, pos.h, pos.w, newSize.height, newSize.width);\n        this.eventBus.$emit(\"resizeEvent\", \"resizeend\", this.i, this.innerX, this.innerY, pos.h, pos.w);\n      }\n    }\n  }\n});\n// CONCATENATED MODULE: ./src/components/GridItem.vue?vue&type=script&lang=js&\n /* harmony default export */ var components_GridItemvue_type_script_lang_js_ = (GridItemvue_type_script_lang_js_); \n// EXTERNAL MODULE: ./src/components/GridItem.vue?vue&type=style&index=0&lang=css&\nvar GridItemvue_type_style_index_0_lang_css_ = __webpack_require__(\"5ed4\");\n\n// EXTERNAL MODULE: ./node_modules/vue-loader/lib/runtime/componentNormalizer.js\nvar componentNormalizer = __webpack_require__(\"2877\");\n\n// CONCATENATED MODULE: ./src/components/GridItem.vue\n\n\n\n\n\n\n/* normalize component */\n\nvar component = Object(componentNormalizer[\"a\" /* default */])(\n  components_GridItemvue_type_script_lang_js_,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  null,\n  null\n  \n)\n\n/* harmony default export */ var GridItem = __webpack_exports__[\"a\"] = (component.exports);\n\n/***/ }),\n\n/***/ \"be13\":\n/***/ (function(module, exports) {\n\n// 7.2.1 RequireObjectCoercible(argument)\nmodule.exports = function (it) {\n  if (it == undefined) throw TypeError(\"Can't call method on  \" + it);\n  return it;\n};\n\n\n/***/ }),\n\n/***/ \"c274\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar utils = __webpack_require__(\"50bf\");\n\nmodule.exports = function batchProcessorMaker(options) {\n    options             = options || {};\n    var reporter        = options.reporter;\n    var asyncProcess    = utils.getOption(options, \"async\", true);\n    var autoProcess     = utils.getOption(options, \"auto\", true);\n\n    if(autoProcess && !asyncProcess) {\n        reporter && reporter.warn(\"Invalid options combination. auto=true and async=false is invalid. Setting async=true.\");\n        asyncProcess = true;\n    }\n\n    var batch = Batch();\n    var asyncFrameHandler;\n    var isProcessing = false;\n\n    function addFunction(level, fn) {\n        if(!isProcessing && autoProcess && asyncProcess && batch.size() === 0) {\n            // Since this is async, it is guaranteed to be executed after that the fn is added to the batch.\n            // This needs to be done before, since we're checking the size of the batch to be 0.\n            processBatchAsync();\n        }\n\n        batch.add(level, fn);\n    }\n\n    function processBatch() {\n        // Save the current batch, and create a new batch so that incoming functions are not added into the currently processing batch.\n        // Continue processing until the top-level batch is empty (functions may be added to the new batch while processing, and so on).\n        isProcessing = true;\n        while (batch.size()) {\n            var processingBatch = batch;\n            batch = Batch();\n            processingBatch.process();\n        }\n        isProcessing = false;\n    }\n\n    function forceProcessBatch(localAsyncProcess) {\n        if (isProcessing) {\n            return;\n        }\n\n        if(localAsyncProcess === undefined) {\n            localAsyncProcess = asyncProcess;\n        }\n\n        if(asyncFrameHandler) {\n            cancelFrame(asyncFrameHandler);\n            asyncFrameHandler = null;\n        }\n\n        if(localAsyncProcess) {\n            processBatchAsync();\n        } else {\n            processBatch();\n        }\n    }\n\n    function processBatchAsync() {\n        asyncFrameHandler = requestFrame(processBatch);\n    }\n\n    function clearBatch() {\n        batch           = {};\n        batchSize       = 0;\n        topLevel        = 0;\n        bottomLevel     = 0;\n    }\n\n    function cancelFrame(listener) {\n        // var cancel = window.cancelAnimationFrame || window.mozCancelAnimationFrame || window.webkitCancelAnimationFrame || window.clearTimeout;\n        var cancel = clearTimeout;\n        return cancel(listener);\n    }\n\n    function requestFrame(callback) {\n        // var raf = window.requestAnimationFrame || window.mozRequestAnimationFrame || window.webkitRequestAnimationFrame || function(fn) { return window.setTimeout(fn, 20); };\n        var raf = function(fn) { return setTimeout(fn, 0); };\n        return raf(callback);\n    }\n\n    return {\n        add: addFunction,\n        force: forceProcessBatch\n    };\n};\n\nfunction Batch() {\n    var batch       = {};\n    var size        = 0;\n    var topLevel    = 0;\n    var bottomLevel = 0;\n\n    function add(level, fn) {\n        if(!fn) {\n            fn = level;\n            level = 0;\n        }\n\n        if(level > topLevel) {\n            topLevel = level;\n        } else if(level < bottomLevel) {\n            bottomLevel = level;\n        }\n\n        if(!batch[level]) {\n            batch[level] = [];\n        }\n\n        batch[level].push(fn);\n        size++;\n    }\n\n    function process() {\n        for(var level = bottomLevel; level <= topLevel; level++) {\n            var fns = batch[level];\n\n            for(var i = 0; i < fns.length; i++) {\n                var fn = fns[i];\n                fn();\n            }\n        }\n    }\n\n    function getSize() {\n        return size;\n    }\n\n    return {\n        add: add,\n        process: process,\n        size: getSize\n    };\n}\n\n\n/***/ }),\n\n/***/ \"c366\":\n/***/ (function(module, exports, __webpack_require__) {\n\n// false -> Array#indexOf\n// true  -> Array#includes\nvar toIObject = __webpack_require__(\"6821\");\nvar toLength = __webpack_require__(\"9def\");\nvar toAbsoluteIndex = __webpack_require__(\"77f1\");\nmodule.exports = function (IS_INCLUDES) {\n  return function ($this, el, fromIndex) {\n    var O = toIObject($this);\n    var length = toLength(O.length);\n    var index = toAbsoluteIndex(fromIndex, length);\n    var value;\n    // Array#includes uses SameValueZero equality algorithm\n    // eslint-disable-next-line no-self-compare\n    if (IS_INCLUDES && el != el) while (length > index) {\n      value = O[index++];\n      // eslint-disable-next-line no-self-compare\n      if (value != value) return true;\n    // Array#indexOf ignores holes, Array#includes - not\n    } else for (;length > index; index++) if (IS_INCLUDES || index in O) {\n      if (O[index] === el) return IS_INCLUDES || index || 0;\n    } return !IS_INCLUDES && -1;\n  };\n};\n\n\n/***/ }),\n\n/***/ \"c5f6\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar global = __webpack_require__(\"7726\");\nvar has = __webpack_require__(\"69a8\");\nvar cof = __webpack_require__(\"2d95\");\nvar inheritIfRequired = __webpack_require__(\"5dbc\");\nvar toPrimitive = __webpack_require__(\"6a99\");\nvar fails = __webpack_require__(\"79e5\");\nvar gOPN = __webpack_require__(\"9093\").f;\nvar gOPD = __webpack_require__(\"11e9\").f;\nvar dP = __webpack_require__(\"86cc\").f;\nvar $trim = __webpack_require__(\"aa77\").trim;\nvar NUMBER = 'Number';\nvar $Number = global[NUMBER];\nvar Base = $Number;\nvar proto = $Number.prototype;\n// Opera ~12 has broken Object#toString\nvar BROKEN_COF = cof(__webpack_require__(\"2aeb\")(proto)) == NUMBER;\nvar TRIM = 'trim' in String.prototype;\n\n// 7.1.3 ToNumber(argument)\nvar toNumber = function (argument) {\n  var it = toPrimitive(argument, false);\n  if (typeof it == 'string' && it.length > 2) {\n    it = TRIM ? it.trim() : $trim(it, 3);\n    var first = it.charCodeAt(0);\n    var third, radix, maxCode;\n    if (first === 43 || first === 45) {\n      third = it.charCodeAt(2);\n      if (third === 88 || third === 120) return NaN; // Number('+0x1') should be NaN, old V8 fix\n    } else if (first === 48) {\n      switch (it.charCodeAt(1)) {\n        case 66: case 98: radix = 2; maxCode = 49; break; // fast equal /^0b[01]+$/i\n        case 79: case 111: radix = 8; maxCode = 55; break; // fast equal /^0o[0-7]+$/i\n        default: return +it;\n      }\n      for (var digits = it.slice(2), i = 0, l = digits.length, code; i < l; i++) {\n        code = digits.charCodeAt(i);\n        // parseInt parses a string to a first unavailable symbol\n        // but ToNumber should return NaN if a string contains unavailable symbols\n        if (code < 48 || code > maxCode) return NaN;\n      } return parseInt(digits, radix);\n    }\n  } return +it;\n};\n\nif (!$Number(' 0o1') || !$Number('0b1') || $Number('+0x1')) {\n  $Number = function Number(value) {\n    var it = arguments.length < 1 ? 0 : value;\n    var that = this;\n    return that instanceof $Number\n      // check on 1..constructor(foo) case\n      && (BROKEN_COF ? fails(function () { proto.valueOf.call(that); }) : cof(that) != NUMBER)\n        ? inheritIfRequired(new Base(toNumber(it)), that, $Number) : toNumber(it);\n  };\n  for (var keys = __webpack_require__(\"9e1e\") ? gOPN(Base) : (\n    // ES3:\n    'MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,' +\n    // ES6 (in case, if modules with ES6 Number statics required before):\n    'EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,' +\n    'MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger'\n  ).split(','), j = 0, key; keys.length > j; j++) {\n    if (has(Base, key = keys[j]) && !has($Number, key)) {\n      dP($Number, key, gOPD(Base, key));\n    }\n  }\n  $Number.prototype = proto;\n  proto.constructor = $Number;\n  __webpack_require__(\"2aba\")(global, NUMBER, $Number);\n}\n\n\n/***/ }),\n\n/***/ \"c69a\":\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = !__webpack_require__(\"9e1e\") && !__webpack_require__(\"79e5\")(function () {\n  return Object.defineProperty(__webpack_require__(\"230e\")('div'), 'a', { get: function () { return 7; } }).a != 7;\n});\n\n\n/***/ }),\n\n/***/ \"c8ba\":\n/***/ (function(module, exports) {\n\nvar g;\n\n// This works in non-strict mode\ng = (function() {\n\treturn this;\n})();\n\ntry {\n\t// This works if eval is allowed (see CSP)\n\tg = g || new Function(\"return this\")();\n} catch (e) {\n\t// This works if the window reference is available\n\tif (typeof window === \"object\") g = window;\n}\n\n// g can still be undefined, but nothing to do about it...\n// We return undefined, instead of nothing here, so it's\n// easier to handle this case. if(!global) { ...}\n\nmodule.exports = g;\n\n\n/***/ }),\n\n/***/ \"c946\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/**\n * Resize detection strategy that injects divs to elements in order to detect resize events on scroll events.\n * Heavily inspired by: https://github.com/marcj/css-element-queries/blob/master/src/ResizeSensor.js\n */\n\n\n\nvar forEach = __webpack_require__(\"b770\").forEach;\n\nmodule.exports = function(options) {\n    options             = options || {};\n    var reporter        = options.reporter;\n    var batchProcessor  = options.batchProcessor;\n    var getState        = options.stateHandler.getState;\n    var hasState        = options.stateHandler.hasState;\n    var idHandler       = options.idHandler;\n\n    if (!batchProcessor) {\n        throw new Error(\"Missing required dependency: batchProcessor\");\n    }\n\n    if (!reporter) {\n        throw new Error(\"Missing required dependency: reporter.\");\n    }\n\n    //TODO: Could this perhaps be done at installation time?\n    var scrollbarSizes = getScrollbarSizes();\n\n    var styleId = \"erd_scroll_detection_scrollbar_style\";\n    var detectionContainerClass = \"erd_scroll_detection_container\";\n\n    function initDocument(targetDocument) {\n        // Inject the scrollbar styling that prevents them from appearing sometimes in Chrome.\n        // The injected container needs to have a class, so that it may be styled with CSS (pseudo elements).\n        injectScrollStyle(targetDocument, styleId, detectionContainerClass);\n    }\n\n    initDocument(window.document);\n\n    function buildCssTextString(rules) {\n        var seperator = options.important ? \" !important; \" : \"; \";\n\n        return (rules.join(seperator) + seperator).trim();\n    }\n\n    function getScrollbarSizes() {\n        var width = 500;\n        var height = 500;\n\n        var child = document.createElement(\"div\");\n        child.style.cssText = buildCssTextString([\"position: absolute\", \"width: \" + width*2 + \"px\", \"height: \" + height*2 + \"px\", \"visibility: hidden\", \"margin: 0\", \"padding: 0\"]);\n\n        var container = document.createElement(\"div\");\n        container.style.cssText = buildCssTextString([\"position: absolute\", \"width: \" + width + \"px\", \"height: \" + height + \"px\", \"overflow: scroll\", \"visibility: none\", \"top: \" + -width*3 + \"px\", \"left: \" + -height*3 + \"px\", \"visibility: hidden\", \"margin: 0\", \"padding: 0\"]);\n\n        container.appendChild(child);\n\n        document.body.insertBefore(container, document.body.firstChild);\n\n        var widthSize = width - container.clientWidth;\n        var heightSize = height - container.clientHeight;\n\n        document.body.removeChild(container);\n\n        return {\n            width: widthSize,\n            height: heightSize\n        };\n    }\n\n    function injectScrollStyle(targetDocument, styleId, containerClass) {\n        function injectStyle(style, method) {\n            method = method || function (element) {\n                targetDocument.head.appendChild(element);\n            };\n\n            var styleElement = targetDocument.createElement(\"style\");\n            styleElement.innerHTML = style;\n            styleElement.id = styleId;\n            method(styleElement);\n            return styleElement;\n        }\n\n        if (!targetDocument.getElementById(styleId)) {\n            var containerAnimationClass = containerClass + \"_animation\";\n            var containerAnimationActiveClass = containerClass + \"_animation_active\";\n            var style = \"/* Created by the element-resize-detector library. */\\n\";\n            style += \".\" + containerClass + \" > div::-webkit-scrollbar { \" + buildCssTextString([\"display: none\"]) + \" }\\n\\n\";\n            style += \".\" + containerAnimationActiveClass + \" { \" + buildCssTextString([\"-webkit-animation-duration: 0.1s\", \"animation-duration: 0.1s\", \"-webkit-animation-name: \" + containerAnimationClass, \"animation-name: \" + containerAnimationClass]) + \" }\\n\";\n            style += \"@-webkit-keyframes \" + containerAnimationClass +  \" { 0% { opacity: 1; } 50% { opacity: 0; } 100% { opacity: 1; } }\\n\";\n            style += \"@keyframes \" + containerAnimationClass +          \" { 0% { opacity: 1; } 50% { opacity: 0; } 100% { opacity: 1; } }\";\n            injectStyle(style);\n        }\n    }\n\n    function addAnimationClass(element) {\n        element.className += \" \" + detectionContainerClass + \"_animation_active\";\n    }\n\n    function addEvent(el, name, cb) {\n        if (el.addEventListener) {\n            el.addEventListener(name, cb);\n        } else if(el.attachEvent) {\n            el.attachEvent(\"on\" + name, cb);\n        } else {\n            return reporter.error(\"[scroll] Don't know how to add event listeners.\");\n        }\n    }\n\n    function removeEvent(el, name, cb) {\n        if (el.removeEventListener) {\n            el.removeEventListener(name, cb);\n        } else if(el.detachEvent) {\n            el.detachEvent(\"on\" + name, cb);\n        } else {\n            return reporter.error(\"[scroll] Don't know how to remove event listeners.\");\n        }\n    }\n\n    function getExpandElement(element) {\n        return getState(element).container.childNodes[0].childNodes[0].childNodes[0];\n    }\n\n    function getShrinkElement(element) {\n        return getState(element).container.childNodes[0].childNodes[0].childNodes[1];\n    }\n\n    /**\n     * Adds a resize event listener to the element.\n     * @public\n     * @param {element} element The element that should have the listener added.\n     * @param {function} listener The listener callback to be called for each resize event of the element. The element will be given as a parameter to the listener callback.\n     */\n    function addListener(element, listener) {\n        var listeners = getState(element).listeners;\n\n        if (!listeners.push) {\n            throw new Error(\"Cannot add listener to an element that is not detectable.\");\n        }\n\n        getState(element).listeners.push(listener);\n    }\n\n    /**\n     * Makes an element detectable and ready to be listened for resize events. Will call the callback when the element is ready to be listened for resize changes.\n     * @private\n     * @param {object} options Optional options object.\n     * @param {element} element The element to make detectable\n     * @param {function} callback The callback to be called when the element is ready to be listened for resize changes. Will be called with the element as first parameter.\n     */\n    function makeDetectable(options, element, callback) {\n        if (!callback) {\n            callback = element;\n            element = options;\n            options = null;\n        }\n\n        options = options || {};\n\n        function debug() {\n            if (options.debug) {\n                var args = Array.prototype.slice.call(arguments);\n                args.unshift(idHandler.get(element), \"Scroll: \");\n                if (reporter.log.apply) {\n                    reporter.log.apply(null, args);\n                } else {\n                    for (var i = 0; i < args.length; i++) {\n                        reporter.log(args[i]);\n                    }\n                }\n            }\n        }\n\n        function isDetached(element) {\n            function isInDocument(element) {\n                var isInShadowRoot = element.getRootNode && element.getRootNode().contains(element);\n                return element === element.ownerDocument.body || element.ownerDocument.body.contains(element) || isInShadowRoot;\n            }\n\n            if (!isInDocument(element)) {\n                return true;\n            }\n\n            // FireFox returns null style in hidden iframes. See https://github.com/wnr/element-resize-detector/issues/68 and https://bugzilla.mozilla.org/show_bug.cgi?id=795520\n            if (window.getComputedStyle(element) === null) {\n                return true;\n            }\n\n            return false;\n        }\n\n        function isUnrendered(element) {\n            // Check the absolute positioned container since the top level container is display: inline.\n            var container = getState(element).container.childNodes[0];\n            var style = window.getComputedStyle(container);\n            return !style.width || style.width.indexOf(\"px\") === -1; //Can only compute pixel value when rendered.\n        }\n\n        function getStyle() {\n            // Some browsers only force layouts when actually reading the style properties of the style object, so make sure that they are all read here,\n            // so that the user of the function can be sure that it will perform the layout here, instead of later (important for batching).\n            var elementStyle            = window.getComputedStyle(element);\n            var style                   = {};\n            style.position              = elementStyle.position;\n            style.width                 = element.offsetWidth;\n            style.height                = element.offsetHeight;\n            style.top                   = elementStyle.top;\n            style.right                 = elementStyle.right;\n            style.bottom                = elementStyle.bottom;\n            style.left                  = elementStyle.left;\n            style.widthCSS              = elementStyle.width;\n            style.heightCSS             = elementStyle.height;\n            return style;\n        }\n\n        function storeStartSize() {\n            var style = getStyle();\n            getState(element).startSize = {\n                width: style.width,\n                height: style.height\n            };\n            debug(\"Element start size\", getState(element).startSize);\n        }\n\n        function initListeners() {\n            getState(element).listeners = [];\n        }\n\n        function storeStyle() {\n            debug(\"storeStyle invoked.\");\n            if (!getState(element)) {\n                debug(\"Aborting because element has been uninstalled\");\n                return;\n            }\n\n            var style = getStyle();\n            getState(element).style = style;\n        }\n\n        function storeCurrentSize(element, width, height) {\n            getState(element).lastWidth = width;\n            getState(element).lastHeight  = height;\n        }\n\n        function getExpandChildElement(element) {\n            return getExpandElement(element).childNodes[0];\n        }\n\n        function getWidthOffset() {\n            return 2 * scrollbarSizes.width + 1;\n        }\n\n        function getHeightOffset() {\n            return 2 * scrollbarSizes.height + 1;\n        }\n\n        function getExpandWidth(width) {\n            return width + 10 + getWidthOffset();\n        }\n\n        function getExpandHeight(height) {\n            return height + 10 + getHeightOffset();\n        }\n\n        function getShrinkWidth(width) {\n            return width * 2 + getWidthOffset();\n        }\n\n        function getShrinkHeight(height) {\n            return height * 2 + getHeightOffset();\n        }\n\n        function positionScrollbars(element, width, height) {\n            var expand          = getExpandElement(element);\n            var shrink          = getShrinkElement(element);\n            var expandWidth     = getExpandWidth(width);\n            var expandHeight    = getExpandHeight(height);\n            var shrinkWidth     = getShrinkWidth(width);\n            var shrinkHeight    = getShrinkHeight(height);\n            expand.scrollLeft   = expandWidth;\n            expand.scrollTop    = expandHeight;\n            shrink.scrollLeft   = shrinkWidth;\n            shrink.scrollTop    = shrinkHeight;\n        }\n\n        function injectContainerElement() {\n            var container = getState(element).container;\n\n            if (!container) {\n                container                   = document.createElement(\"div\");\n                container.className         = detectionContainerClass;\n                container.style.cssText     = buildCssTextString([\"visibility: hidden\", \"display: inline\", \"width: 0px\", \"height: 0px\", \"z-index: -1\", \"overflow: hidden\", \"margin: 0\", \"padding: 0\"]);\n                getState(element).container = container;\n                addAnimationClass(container);\n                element.appendChild(container);\n\n                var onAnimationStart = function () {\n                    getState(element).onRendered && getState(element).onRendered();\n                };\n\n                addEvent(container, \"animationstart\", onAnimationStart);\n\n                // Store the event handler here so that they may be removed when uninstall is called.\n                // See uninstall function for an explanation why it is needed.\n                getState(element).onAnimationStart = onAnimationStart;\n            }\n\n            return container;\n        }\n\n        function injectScrollElements() {\n            function alterPositionStyles() {\n                var style = getState(element).style;\n\n                if(style.position === \"static\") {\n                    element.style.setProperty(\"position\", \"relative\",options.important ? \"important\" : \"\");\n\n                    var removeRelativeStyles = function(reporter, element, style, property) {\n                        function getNumericalValue(value) {\n                            return value.replace(/[^-\\d\\.]/g, \"\");\n                        }\n\n                        var value = style[property];\n\n                        if(value !== \"auto\" && getNumericalValue(value) !== \"0\") {\n                            reporter.warn(\"An element that is positioned static has style.\" + property + \"=\" + value + \" which is ignored due to the static positioning. The element will need to be positioned relative, so the style.\" + property + \" will be set to 0. Element: \", element);\n                            element.style[property] = 0;\n                        }\n                    };\n\n                    //Check so that there are no accidental styles that will make the element styled differently now that is is relative.\n                    //If there are any, set them to 0 (this should be okay with the user since the style properties did nothing before [since the element was positioned static] anyway).\n                    removeRelativeStyles(reporter, element, style, \"top\");\n                    removeRelativeStyles(reporter, element, style, \"right\");\n                    removeRelativeStyles(reporter, element, style, \"bottom\");\n                    removeRelativeStyles(reporter, element, style, \"left\");\n                }\n            }\n\n            function getLeftTopBottomRightCssText(left, top, bottom, right) {\n                left = (!left ? \"0\" : (left + \"px\"));\n                top = (!top ? \"0\" : (top + \"px\"));\n                bottom = (!bottom ? \"0\" : (bottom + \"px\"));\n                right = (!right ? \"0\" : (right + \"px\"));\n\n                return [\"left: \" + left, \"top: \" + top, \"right: \" + right, \"bottom: \" + bottom];\n            }\n\n            debug(\"Injecting elements\");\n\n            if (!getState(element)) {\n                debug(\"Aborting because element has been uninstalled\");\n                return;\n            }\n\n            alterPositionStyles();\n\n            var rootContainer = getState(element).container;\n\n            if (!rootContainer) {\n                rootContainer = injectContainerElement();\n            }\n\n            // Due to this WebKit bug https://bugs.webkit.org/show_bug.cgi?id=80808 (currently fixed in Blink, but still present in WebKit browsers such as Safari),\n            // we need to inject two containers, one that is width/height 100% and another that is left/top -1px so that the final container always is 1x1 pixels bigger than\n            // the targeted element.\n            // When the bug is resolved, \"containerContainer\" may be removed.\n\n            // The outer container can occasionally be less wide than the targeted when inside inline elements element in WebKit (see https://bugs.webkit.org/show_bug.cgi?id=152980).\n            // This should be no problem since the inner container either way makes sure the injected scroll elements are at least 1x1 px.\n\n            var scrollbarWidth          = scrollbarSizes.width;\n            var scrollbarHeight         = scrollbarSizes.height;\n            var containerContainerStyle = buildCssTextString([\"position: absolute\", \"flex: none\", \"overflow: hidden\", \"z-index: -1\", \"visibility: hidden\", \"width: 100%\", \"height: 100%\", \"left: 0px\", \"top: 0px\"]);\n            var containerStyle          = buildCssTextString([\"position: absolute\", \"flex: none\", \"overflow: hidden\", \"z-index: -1\", \"visibility: hidden\"].concat(getLeftTopBottomRightCssText(-(1 + scrollbarWidth), -(1 + scrollbarHeight), -scrollbarHeight, -scrollbarWidth)));\n            var expandStyle             = buildCssTextString([\"position: absolute\", \"flex: none\", \"overflow: scroll\", \"z-index: -1\", \"visibility: hidden\", \"width: 100%\", \"height: 100%\"]);\n            var shrinkStyle             = buildCssTextString([\"position: absolute\", \"flex: none\", \"overflow: scroll\", \"z-index: -1\", \"visibility: hidden\", \"width: 100%\", \"height: 100%\"]);\n            var expandChildStyle        = buildCssTextString([\"position: absolute\", \"left: 0\", \"top: 0\"]);\n            var shrinkChildStyle        = buildCssTextString([\"position: absolute\", \"width: 200%\", \"height: 200%\"]);\n\n            var containerContainer      = document.createElement(\"div\");\n            var container               = document.createElement(\"div\");\n            var expand                  = document.createElement(\"div\");\n            var expandChild             = document.createElement(\"div\");\n            var shrink                  = document.createElement(\"div\");\n            var shrinkChild             = document.createElement(\"div\");\n\n            // Some browsers choke on the resize system being rtl, so force it to ltr. https://github.com/wnr/element-resize-detector/issues/56\n            // However, dir should not be set on the top level container as it alters the dimensions of the target element in some browsers.\n            containerContainer.dir              = \"ltr\";\n\n            containerContainer.style.cssText    = containerContainerStyle;\n            containerContainer.className        = detectionContainerClass;\n            container.className                 = detectionContainerClass;\n            container.style.cssText             = containerStyle;\n            expand.style.cssText                = expandStyle;\n            expandChild.style.cssText           = expandChildStyle;\n            shrink.style.cssText                = shrinkStyle;\n            shrinkChild.style.cssText           = shrinkChildStyle;\n\n            expand.appendChild(expandChild);\n            shrink.appendChild(shrinkChild);\n            container.appendChild(expand);\n            container.appendChild(shrink);\n            containerContainer.appendChild(container);\n            rootContainer.appendChild(containerContainer);\n\n            function onExpandScroll() {\n                var state = getState(element);\n                if (state && state.onExpand) {\n                    state.onExpand();\n                } else {\n                    debug(\"Aborting expand scroll handler: element has been uninstalled\");\n                }\n            }\n\n            function onShrinkScroll() {\n                var state = getState(element);\n                if (state && state.onShrink) {\n                    state.onShrink();\n                } else {\n                    debug(\"Aborting shrink scroll handler: element has been uninstalled\");\n                }\n            }\n\n            addEvent(expand, \"scroll\", onExpandScroll);\n            addEvent(shrink, \"scroll\", onShrinkScroll);\n\n            // Store the event handlers here so that they may be removed when uninstall is called.\n            // See uninstall function for an explanation why it is needed.\n            getState(element).onExpandScroll = onExpandScroll;\n            getState(element).onShrinkScroll = onShrinkScroll;\n        }\n\n        function registerListenersAndPositionElements() {\n            function updateChildSizes(element, width, height) {\n                var expandChild             = getExpandChildElement(element);\n                var expandWidth             = getExpandWidth(width);\n                var expandHeight            = getExpandHeight(height);\n                expandChild.style.setProperty(\"width\", expandWidth + \"px\", options.important ? \"important\" : \"\");\n                expandChild.style.setProperty(\"height\", expandHeight + \"px\", options.important ? \"important\" : \"\");\n            }\n\n            function updateDetectorElements(done) {\n                var width           = element.offsetWidth;\n                var height          = element.offsetHeight;\n\n                // Check whether the size has actually changed since last time the algorithm ran. If not, some steps may be skipped.\n                var sizeChanged = width !== getState(element).lastWidth || height !== getState(element).lastHeight;\n\n                debug(\"Storing current size\", width, height);\n\n                // Store the size of the element sync here, so that multiple scroll events may be ignored in the event listeners.\n                // Otherwise the if-check in handleScroll is useless.\n                storeCurrentSize(element, width, height);\n\n                // Since we delay the processing of the batch, there is a risk that uninstall has been called before the batch gets to execute.\n                // Since there is no way to cancel the fn executions, we need to add an uninstall guard to all fns of the batch.\n\n                batchProcessor.add(0, function performUpdateChildSizes() {\n                    if (!sizeChanged) {\n                        return;\n                    }\n\n                    if (!getState(element)) {\n                        debug(\"Aborting because element has been uninstalled\");\n                        return;\n                    }\n\n                    if (!areElementsInjected()) {\n                        debug(\"Aborting because element container has not been initialized\");\n                        return;\n                    }\n\n                    if (options.debug) {\n                        var w = element.offsetWidth;\n                        var h = element.offsetHeight;\n\n                        if (w !== width || h !== height) {\n                            reporter.warn(idHandler.get(element), \"Scroll: Size changed before updating detector elements.\");\n                        }\n                    }\n\n                    updateChildSizes(element, width, height);\n                });\n\n                batchProcessor.add(1, function updateScrollbars() {\n                    // This function needs to be invoked event though the size is unchanged. The element could have been resized very quickly and then\n                    // been restored to the original size, which will have changed the scrollbar positions.\n\n                    if (!getState(element)) {\n                        debug(\"Aborting because element has been uninstalled\");\n                        return;\n                    }\n\n                    if (!areElementsInjected()) {\n                        debug(\"Aborting because element container has not been initialized\");\n                        return;\n                    }\n\n                    positionScrollbars(element, width, height);\n                });\n\n                if (sizeChanged && done) {\n                    batchProcessor.add(2, function () {\n                        if (!getState(element)) {\n                            debug(\"Aborting because element has been uninstalled\");\n                            return;\n                        }\n\n                        if (!areElementsInjected()) {\n                          debug(\"Aborting because element container has not been initialized\");\n                          return;\n                        }\n\n                        done();\n                    });\n                }\n            }\n\n            function areElementsInjected() {\n                return !!getState(element).container;\n            }\n\n            function notifyListenersIfNeeded() {\n                function isFirstNotify() {\n                    return getState(element).lastNotifiedWidth === undefined;\n                }\n\n                debug(\"notifyListenersIfNeeded invoked\");\n\n                var state = getState(element);\n\n                // Don't notify if the current size is the start size, and this is the first notification.\n                if (isFirstNotify() && state.lastWidth === state.startSize.width && state.lastHeight === state.startSize.height) {\n                    return debug(\"Not notifying: Size is the same as the start size, and there has been no notification yet.\");\n                }\n\n                // Don't notify if the size already has been notified.\n                if (state.lastWidth === state.lastNotifiedWidth && state.lastHeight === state.lastNotifiedHeight) {\n                    return debug(\"Not notifying: Size already notified\");\n                }\n\n\n                debug(\"Current size not notified, notifying...\");\n                state.lastNotifiedWidth = state.lastWidth;\n                state.lastNotifiedHeight = state.lastHeight;\n                forEach(getState(element).listeners, function (listener) {\n                    listener(element);\n                });\n            }\n\n            function handleRender() {\n                debug(\"startanimation triggered.\");\n\n                if (isUnrendered(element)) {\n                    debug(\"Ignoring since element is still unrendered...\");\n                    return;\n                }\n\n                debug(\"Element rendered.\");\n                var expand = getExpandElement(element);\n                var shrink = getShrinkElement(element);\n                if (expand.scrollLeft === 0 || expand.scrollTop === 0 || shrink.scrollLeft === 0 || shrink.scrollTop === 0) {\n                    debug(\"Scrollbars out of sync. Updating detector elements...\");\n                    updateDetectorElements(notifyListenersIfNeeded);\n                }\n            }\n\n            function handleScroll() {\n                debug(\"Scroll detected.\");\n\n                if (isUnrendered(element)) {\n                    // Element is still unrendered. Skip this scroll event.\n                    debug(\"Scroll event fired while unrendered. Ignoring...\");\n                    return;\n                }\n\n                updateDetectorElements(notifyListenersIfNeeded);\n            }\n\n            debug(\"registerListenersAndPositionElements invoked.\");\n\n            if (!getState(element)) {\n                debug(\"Aborting because element has been uninstalled\");\n                return;\n            }\n\n            getState(element).onRendered = handleRender;\n            getState(element).onExpand = handleScroll;\n            getState(element).onShrink = handleScroll;\n\n            var style = getState(element).style;\n            updateChildSizes(element, style.width, style.height);\n        }\n\n        function finalizeDomMutation() {\n            debug(\"finalizeDomMutation invoked.\");\n\n            if (!getState(element)) {\n                debug(\"Aborting because element has been uninstalled\");\n                return;\n            }\n\n            var style = getState(element).style;\n            storeCurrentSize(element, style.width, style.height);\n            positionScrollbars(element, style.width, style.height);\n        }\n\n        function ready() {\n            callback(element);\n        }\n\n        function install() {\n            debug(\"Installing...\");\n            initListeners();\n            storeStartSize();\n\n            batchProcessor.add(0, storeStyle);\n            batchProcessor.add(1, injectScrollElements);\n            batchProcessor.add(2, registerListenersAndPositionElements);\n            batchProcessor.add(3, finalizeDomMutation);\n            batchProcessor.add(4, ready);\n        }\n\n        debug(\"Making detectable...\");\n\n        if (isDetached(element)) {\n            debug(\"Element is detached\");\n\n            injectContainerElement();\n\n            debug(\"Waiting until element is attached...\");\n\n            getState(element).onRendered = function () {\n                debug(\"Element is now attached\");\n                install();\n            };\n        } else {\n            install();\n        }\n    }\n\n    function uninstall(element) {\n        var state = getState(element);\n\n        if (!state) {\n            // Uninstall has been called on a non-erd element.\n            return;\n        }\n\n        // Uninstall may have been called in the following scenarios:\n        // (1) Right between the sync code and async batch (here state.busy = true, but nothing have been registered or injected).\n        // (2) In the ready callback of the last level of the batch by another element (here, state.busy = true, but all the stuff has been injected).\n        // (3) After the installation process (here, state.busy = false and all the stuff has been injected).\n        // So to be on the safe side, let's check for each thing before removing.\n\n        // We need to remove the event listeners, because otherwise the event might fire on an uninstall element which results in an error when trying to get the state of the element.\n        state.onExpandScroll && removeEvent(getExpandElement(element), \"scroll\", state.onExpandScroll);\n        state.onShrinkScroll && removeEvent(getShrinkElement(element), \"scroll\", state.onShrinkScroll);\n        state.onAnimationStart && removeEvent(state.container, \"animationstart\", state.onAnimationStart);\n\n        state.container && element.removeChild(state.container);\n    }\n\n    return {\n        makeDetectable: makeDetectable,\n        addListener: addListener,\n        uninstall: uninstall,\n        initDocument: initDocument\n    };\n};\n\n\n/***/ }),\n\n/***/ \"ca5a\":\n/***/ (function(module, exports) {\n\nvar id = 0;\nvar px = Math.random();\nmodule.exports = function (key) {\n  return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36));\n};\n\n\n/***/ }),\n\n/***/ \"cadf\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar addToUnscopables = __webpack_require__(\"9c6c\");\nvar step = __webpack_require__(\"d53b\");\nvar Iterators = __webpack_require__(\"84f2\");\nvar toIObject = __webpack_require__(\"6821\");\n\n// 22.1.3.4 Array.prototype.entries()\n// 22.1.3.13 Array.prototype.keys()\n// 22.1.3.29 Array.prototype.values()\n// 22.1.3.30 Array.prototype[@@iterator]()\nmodule.exports = __webpack_require__(\"01f9\")(Array, 'Array', function (iterated, kind) {\n  this._t = toIObject(iterated); // target\n  this._i = 0;                   // next index\n  this._k = kind;                // kind\n// 22.1.5.2.1 %ArrayIteratorPrototype%.next()\n}, function () {\n  var O = this._t;\n  var kind = this._k;\n  var index = this._i++;\n  if (!O || index >= O.length) {\n    this._t = undefined;\n    return step(1);\n  }\n  if (kind == 'keys') return step(0, index);\n  if (kind == 'values') return step(0, O[index]);\n  return step(0, [index, O[index]]);\n}, 'values');\n\n// argumentsList[@@iterator] is %ArrayProto_values% (9.4.4.6, 9.4.4.7)\nIterators.Arguments = Iterators.Array;\n\naddToUnscopables('keys');\naddToUnscopables('values');\naddToUnscopables('entries');\n\n\n/***/ }),\n\n/***/ \"cb7c\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar isObject = __webpack_require__(\"d3f4\");\nmodule.exports = function (it) {\n  if (!isObject(it)) throw TypeError(it + ' is not an object!');\n  return it;\n};\n\n\n/***/ }),\n\n/***/ \"ce10\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar has = __webpack_require__(\"69a8\");\nvar toIObject = __webpack_require__(\"6821\");\nvar arrayIndexOf = __webpack_require__(\"c366\")(false);\nvar IE_PROTO = __webpack_require__(\"613b\")('IE_PROTO');\n\nmodule.exports = function (object, names) {\n  var O = toIObject(object);\n  var i = 0;\n  var result = [];\n  var key;\n  for (key in O) if (key != IE_PROTO) has(O, key) && result.push(key);\n  // Don't enum bug & hidden keys\n  while (names.length > i) if (has(O, key = names[i++])) {\n    ~arrayIndexOf(result, key) || result.push(key);\n  }\n  return result;\n};\n\n\n/***/ }),\n\n/***/ \"d3f4\":\n/***/ (function(module, exports) {\n\nmodule.exports = function (it) {\n  return typeof it === 'object' ? it !== null : typeof it === 'function';\n};\n\n\n/***/ }),\n\n/***/ \"d53b\":\n/***/ (function(module, exports) {\n\nmodule.exports = function (done, value) {\n  return { value: value, done: !!done };\n};\n\n\n/***/ }),\n\n/***/ \"d6eb\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar prop = \"_erd\";\n\nfunction initState(element) {\n    element[prop] = {};\n    return getState(element);\n}\n\nfunction getState(element) {\n    return element[prop];\n}\n\nfunction cleanState(element) {\n    delete element[prop];\n}\n\nmodule.exports = {\n    initState: initState,\n    getState: getState,\n    cleanState: cleanState\n};\n\n\n/***/ }),\n\n/***/ \"d8e8\":\n/***/ (function(module, exports) {\n\nmodule.exports = function (it) {\n  if (typeof it != 'function') throw TypeError(it + ' is not a function!');\n  return it;\n};\n\n\n/***/ }),\n\n/***/ \"e11e\":\n/***/ (function(module, exports) {\n\n// IE 8- don't enum bug keys\nmodule.exports = (\n  'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf'\n).split(',');\n\n\n/***/ }),\n\n/***/ \"e279\":\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var _node_modules_vue_style_loader_index_js_ref_6_oneOf_1_0_node_modules_css_loader_index_js_ref_6_oneOf_1_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_src_index_js_ref_6_oneOf_1_2_node_modules_postcss_loader_src_index_js_ref_6_oneOf_1_3_node_modules_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_lib_index_js_vue_loader_options_GridLayout_vue_vue_type_style_index_0_lang_css___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(\"1156\");\n/* harmony import */ var _node_modules_vue_style_loader_index_js_ref_6_oneOf_1_0_node_modules_css_loader_index_js_ref_6_oneOf_1_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_src_index_js_ref_6_oneOf_1_2_node_modules_postcss_loader_src_index_js_ref_6_oneOf_1_3_node_modules_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_lib_index_js_vue_loader_options_GridLayout_vue_vue_type_style_index_0_lang_css___WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_vue_style_loader_index_js_ref_6_oneOf_1_0_node_modules_css_loader_index_js_ref_6_oneOf_1_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_src_index_js_ref_6_oneOf_1_2_node_modules_postcss_loader_src_index_js_ref_6_oneOf_1_3_node_modules_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_lib_index_js_vue_loader_options_GridLayout_vue_vue_type_style_index_0_lang_css___WEBPACK_IMPORTED_MODULE_0__);\n/* unused harmony reexport * */\n\n\n/***/ }),\n\n/***/ \"eec4\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar forEach                 = __webpack_require__(\"b770\").forEach;\nvar elementUtilsMaker       = __webpack_require__(\"5be5\");\nvar listenerHandlerMaker    = __webpack_require__(\"49ad\");\nvar idGeneratorMaker        = __webpack_require__(\"2cef\");\nvar idHandlerMaker          = __webpack_require__(\"5058\");\nvar reporterMaker           = __webpack_require__(\"abb4\");\nvar browserDetector         = __webpack_require__(\"18e9\");\nvar batchProcessorMaker     = __webpack_require__(\"c274\");\nvar stateHandler            = __webpack_require__(\"d6eb\");\n\n//Detection strategies.\nvar objectStrategyMaker     = __webpack_require__(\"18d2\");\nvar scrollStrategyMaker     = __webpack_require__(\"c946\");\n\nfunction isCollection(obj) {\n    return Array.isArray(obj) || obj.length !== undefined;\n}\n\nfunction toArray(collection) {\n    if (!Array.isArray(collection)) {\n        var array = [];\n        forEach(collection, function (obj) {\n            array.push(obj);\n        });\n        return array;\n    } else {\n        return collection;\n    }\n}\n\nfunction isElement(obj) {\n    return obj && obj.nodeType === 1;\n}\n\n/**\n * @typedef idHandler\n * @type {object}\n * @property {function} get Gets the resize detector id of the element.\n * @property {function} set Generate and sets the resize detector id of the element.\n */\n\n/**\n * @typedef Options\n * @type {object}\n * @property {boolean} callOnAdd    Determines if listeners should be called when they are getting added.\n                                    Default is true. If true, the listener is guaranteed to be called when it has been added.\n                                    If false, the listener will not be guarenteed to be called when it has been added (does not prevent it from being called).\n * @property {idHandler} idHandler  A custom id handler that is responsible for generating, setting and retrieving id's for elements.\n                                    If not provided, a default id handler will be used.\n * @property {reporter} reporter    A custom reporter that handles reporting logs, warnings and errors.\n                                    If not provided, a default id handler will be used.\n                                    If set to false, then nothing will be reported.\n * @property {boolean} debug        If set to true, the the system will report debug messages as default for the listenTo method.\n */\n\n/**\n * Creates an element resize detector instance.\n * @public\n * @param {Options?} options Optional global options object that will decide how this instance will work.\n */\nmodule.exports = function(options) {\n    options = options || {};\n\n    //idHandler is currently not an option to the listenTo function, so it should not be added to globalOptions.\n    var idHandler;\n\n    if (options.idHandler) {\n        // To maintain compatability with idHandler.get(element, readonly), make sure to wrap the given idHandler\n        // so that readonly flag always is true when it's used here. This may be removed next major version bump.\n        idHandler = {\n            get: function (element) { return options.idHandler.get(element, true); },\n            set: options.idHandler.set\n        };\n    } else {\n        var idGenerator = idGeneratorMaker();\n        var defaultIdHandler = idHandlerMaker({\n            idGenerator: idGenerator,\n            stateHandler: stateHandler\n        });\n        idHandler = defaultIdHandler;\n    }\n\n    //reporter is currently not an option to the listenTo function, so it should not be added to globalOptions.\n    var reporter = options.reporter;\n\n    if(!reporter) {\n        //If options.reporter is false, then the reporter should be quiet.\n        var quiet = reporter === false;\n        reporter = reporterMaker(quiet);\n    }\n\n    //batchProcessor is currently not an option to the listenTo function, so it should not be added to globalOptions.\n    var batchProcessor = getOption(options, \"batchProcessor\", batchProcessorMaker({ reporter: reporter }));\n\n    //Options to be used as default for the listenTo function.\n    var globalOptions = {};\n    globalOptions.callOnAdd     = !!getOption(options, \"callOnAdd\", true);\n    globalOptions.debug         = !!getOption(options, \"debug\", false);\n\n    var eventListenerHandler    = listenerHandlerMaker(idHandler);\n    var elementUtils            = elementUtilsMaker({\n        stateHandler: stateHandler\n    });\n\n    //The detection strategy to be used.\n    var detectionStrategy;\n    var desiredStrategy = getOption(options, \"strategy\", \"object\");\n    var importantCssRules = getOption(options, \"important\", false);\n    var strategyOptions = {\n        reporter: reporter,\n        batchProcessor: batchProcessor,\n        stateHandler: stateHandler,\n        idHandler: idHandler,\n        important: importantCssRules\n    };\n\n    if(desiredStrategy === \"scroll\") {\n        if (browserDetector.isLegacyOpera()) {\n            reporter.warn(\"Scroll strategy is not supported on legacy Opera. Changing to object strategy.\");\n            desiredStrategy = \"object\";\n        } else if (browserDetector.isIE(9)) {\n            reporter.warn(\"Scroll strategy is not supported on IE9. Changing to object strategy.\");\n            desiredStrategy = \"object\";\n        }\n    }\n\n    if(desiredStrategy === \"scroll\") {\n        detectionStrategy = scrollStrategyMaker(strategyOptions);\n    } else if(desiredStrategy === \"object\") {\n        detectionStrategy = objectStrategyMaker(strategyOptions);\n    } else {\n        throw new Error(\"Invalid strategy name: \" + desiredStrategy);\n    }\n\n    //Calls can be made to listenTo with elements that are still being installed.\n    //Also, same elements can occur in the elements list in the listenTo function.\n    //With this map, the ready callbacks can be synchronized between the calls\n    //so that the ready callback can always be called when an element is ready - even if\n    //it wasn't installed from the function itself.\n    var onReadyCallbacks = {};\n\n    /**\n     * Makes the given elements resize-detectable and starts listening to resize events on the elements. Calls the event callback for each event for each element.\n     * @public\n     * @param {Options?} options Optional options object. These options will override the global options. Some options may not be overriden, such as idHandler.\n     * @param {element[]|element} elements The given array of elements to detect resize events of. Single element is also valid.\n     * @param {function} listener The callback to be executed for each resize event for each element.\n     */\n    function listenTo(options, elements, listener) {\n        function onResizeCallback(element) {\n            var listeners = eventListenerHandler.get(element);\n            forEach(listeners, function callListenerProxy(listener) {\n                listener(element);\n            });\n        }\n\n        function addListener(callOnAdd, element, listener) {\n            eventListenerHandler.add(element, listener);\n\n            if(callOnAdd) {\n                listener(element);\n            }\n        }\n\n        //Options object may be omitted.\n        if(!listener) {\n            listener = elements;\n            elements = options;\n            options = {};\n        }\n\n        if(!elements) {\n            throw new Error(\"At least one element required.\");\n        }\n\n        if(!listener) {\n            throw new Error(\"Listener required.\");\n        }\n\n        if (isElement(elements)) {\n            // A single element has been passed in.\n            elements = [elements];\n        } else if (isCollection(elements)) {\n            // Convert collection to array for plugins.\n            // TODO: May want to check so that all the elements in the collection are valid elements.\n            elements = toArray(elements);\n        } else {\n            return reporter.error(\"Invalid arguments. Must be a DOM element or a collection of DOM elements.\");\n        }\n\n        var elementsReady = 0;\n\n        var callOnAdd = getOption(options, \"callOnAdd\", globalOptions.callOnAdd);\n        var onReadyCallback = getOption(options, \"onReady\", function noop() {});\n        var debug = getOption(options, \"debug\", globalOptions.debug);\n\n        forEach(elements, function attachListenerToElement(element) {\n            if (!stateHandler.getState(element)) {\n                stateHandler.initState(element);\n                idHandler.set(element);\n            }\n\n            var id = idHandler.get(element);\n\n            debug && reporter.log(\"Attaching listener to element\", id, element);\n\n            if(!elementUtils.isDetectable(element)) {\n                debug && reporter.log(id, \"Not detectable.\");\n                if(elementUtils.isBusy(element)) {\n                    debug && reporter.log(id, \"System busy making it detectable\");\n\n                    //The element is being prepared to be detectable. Do not make it detectable.\n                    //Just add the listener, because the element will soon be detectable.\n                    addListener(callOnAdd, element, listener);\n                    onReadyCallbacks[id] = onReadyCallbacks[id] || [];\n                    onReadyCallbacks[id].push(function onReady() {\n                        elementsReady++;\n\n                        if(elementsReady === elements.length) {\n                            onReadyCallback();\n                        }\n                    });\n                    return;\n                }\n\n                debug && reporter.log(id, \"Making detectable...\");\n                //The element is not prepared to be detectable, so do prepare it and add a listener to it.\n                elementUtils.markBusy(element, true);\n                return detectionStrategy.makeDetectable({ debug: debug, important: importantCssRules }, element, function onElementDetectable(element) {\n                    debug && reporter.log(id, \"onElementDetectable\");\n\n                    if (stateHandler.getState(element)) {\n                        elementUtils.markAsDetectable(element);\n                        elementUtils.markBusy(element, false);\n                        detectionStrategy.addListener(element, onResizeCallback);\n                        addListener(callOnAdd, element, listener);\n\n                        // Since the element size might have changed since the call to \"listenTo\", we need to check for this change,\n                        // so that a resize event may be emitted.\n                        // Having the startSize object is optional (since it does not make sense in some cases such as unrendered elements), so check for its existance before.\n                        // Also, check the state existance before since the element may have been uninstalled in the installation process.\n                        var state = stateHandler.getState(element);\n                        if (state && state.startSize) {\n                            var width = element.offsetWidth;\n                            var height = element.offsetHeight;\n                            if (state.startSize.width !== width || state.startSize.height !== height) {\n                                onResizeCallback(element);\n                            }\n                        }\n\n                        if(onReadyCallbacks[id]) {\n                            forEach(onReadyCallbacks[id], function(callback) {\n                                callback();\n                            });\n                        }\n                    } else {\n                        // The element has been unisntalled before being detectable.\n                        debug && reporter.log(id, \"Element uninstalled before being detectable.\");\n                    }\n\n                    delete onReadyCallbacks[id];\n\n                    elementsReady++;\n                    if(elementsReady === elements.length) {\n                        onReadyCallback();\n                    }\n                });\n            }\n\n            debug && reporter.log(id, \"Already detecable, adding listener.\");\n\n            //The element has been prepared to be detectable and is ready to be listened to.\n            addListener(callOnAdd, element, listener);\n            elementsReady++;\n        });\n\n        if(elementsReady === elements.length) {\n            onReadyCallback();\n        }\n    }\n\n    function uninstall(elements) {\n        if(!elements) {\n            return reporter.error(\"At least one element is required.\");\n        }\n\n        if (isElement(elements)) {\n            // A single element has been passed in.\n            elements = [elements];\n        } else if (isCollection(elements)) {\n            // Convert collection to array for plugins.\n            // TODO: May want to check so that all the elements in the collection are valid elements.\n            elements = toArray(elements);\n        } else {\n            return reporter.error(\"Invalid arguments. Must be a DOM element or a collection of DOM elements.\");\n        }\n\n        forEach(elements, function (element) {\n            eventListenerHandler.removeAllListeners(element);\n            detectionStrategy.uninstall(element);\n            stateHandler.cleanState(element);\n        });\n    }\n\n    function initDocument(targetDocument) {\n        detectionStrategy.initDocument && detectionStrategy.initDocument(targetDocument);\n    }\n\n    return {\n        listenTo: listenTo,\n        removeListener: eventListenerHandler.removeListener,\n        removeAllListeners: eventListenerHandler.removeAllListeners,\n        uninstall: uninstall,\n        initDocument: initDocument\n    };\n};\n\nfunction getOption(options, name, defaultValue) {\n    var value = options[name];\n\n    if((value === undefined || value === null) && defaultValue !== undefined) {\n        return defaultValue;\n    }\n\n    return value;\n}\n\n\n/***/ }),\n\n/***/ \"f1ae\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar $defineProperty = __webpack_require__(\"86cc\");\nvar createDesc = __webpack_require__(\"4630\");\n\nmodule.exports = function (object, index, value) {\n  if (index in object) $defineProperty.f(object, index, createDesc(0, value));\n  else object[index] = value;\n};\n\n\n/***/ }),\n\n/***/ \"f6fd\":\n/***/ (function(module, exports) {\n\n// document.currentScript polyfill by Adam Miller\n\n// MIT license\n\n(function(document){\n  var currentScript = \"currentScript\",\n      scripts = document.getElementsByTagName('script'); // Live NodeList collection\n\n  // If browser needs currentScript polyfill, add get currentScript() to the document object\n  if (!(currentScript in document)) {\n    Object.defineProperty(document, currentScript, {\n      get: function(){\n\n        // IE 6-10 supports script readyState\n        // IE 10+ support stack trace\n        try { throw new Error(); }\n        catch (err) {\n\n          // Find the second match for the \"at\" string to get file src url from stack.\n          // Specifically works with the format of stack traces in IE.\n          var i, res = ((/.*at [^\\(]*\\((.*):.+:.+\\)$/ig).exec(err.stack) || [false])[1];\n\n          // For all scripts on the page, if src matches or if ready state is interactive, return the script tag\n          for(i in scripts){\n            if(scripts[i].src == res || scripts[i].readyState == \"interactive\"){\n              return scripts[i];\n            }\n          }\n\n          // If no match, return null\n          return null;\n        }\n      }\n    });\n  }\n})(document);\n\n\n/***/ }),\n\n/***/ \"f751\":\n/***/ (function(module, exports, __webpack_require__) {\n\n// 19.1.3.1 Object.assign(target, source)\nvar $export = __webpack_require__(\"5ca1\");\n\n$export($export.S + $export.F, 'Object', { assign: __webpack_require__(\"7333\") });\n\n\n/***/ }),\n\n/***/ \"fa5b\":\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__(\"5537\")('native-function-to-string', Function.toString);\n\n\n/***/ }),\n\n/***/ \"fab2\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar document = __webpack_require__(\"7726\").document;\nmodule.exports = document && document.documentElement;\n\n\n/***/ }),\n\n/***/ \"fb15\":\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n// ESM COMPAT FLAG\n__webpack_require__.r(__webpack_exports__);\n\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, \"install\", function() { return /* reexport */ components[\"d\" /* install */]; });\n__webpack_require__.d(__webpack_exports__, \"GridLayout\", function() { return /* reexport */ components[\"b\" /* GridLayout */]; });\n__webpack_require__.d(__webpack_exports__, \"GridItem\", function() { return /* reexport */ components[\"a\" /* GridItem */]; });\n\n// CONCATENATED MODULE: ./node_modules/@vue/cli-service/lib/commands/build/setPublicPath.js\n// This file is imported into lib/wc client bundles.\n\nif (typeof window !== 'undefined') {\n  if (true) {\n    __webpack_require__(\"f6fd\")\n  }\n\n  var i\n  if ((i = window.document.currentScript) && (i = i.src.match(/(.+\\/)[^/]+\\.js(\\?.*)?$/))) {\n    __webpack_require__.p = i[1] // eslint-disable-line\n  }\n}\n\n// Indicate to webpack that this file can be concatenated\n/* harmony default export */ var setPublicPath = (null);\n\n// EXTERNAL MODULE: ./src/components/index.js\nvar components = __webpack_require__(\"2af9\");\n\n// CONCATENATED MODULE: ./node_modules/@vue/cli-service/lib/commands/build/entry-lib.js\n\n\n/* harmony default export */ var entry_lib = __webpack_exports__[\"default\"] = (components[\"c\" /* default */]);\n\n\n\n/***/ }),\n\n/***/ \"fca0\":\n/***/ (function(module, exports, __webpack_require__) {\n\n// 20.1.2.2 Number.isFinite(number)\nvar $export = __webpack_require__(\"5ca1\");\nvar _isFinite = __webpack_require__(\"7726\").isFinite;\n\n$export($export.S, 'Number', {\n  isFinite: function isFinite(it) {\n    return typeof it == 'number' && _isFinite(it);\n  }\n});\n\n\n/***/ }),\n\n/***/ \"fdef\":\n/***/ (function(module, exports) {\n\nmodule.exports = '\\x09\\x0A\\x0B\\x0C\\x0D\\x20\\xA0\\u1680\\u180E\\u2000\\u2001\\u2002\\u2003' +\n  '\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\u2028\\u2029\\uFEFF';\n\n\n/***/ })\n\n/******/ })[\"default\"];\n});\n//# sourceMappingURL=vue-grid-layout.umd.js.map"
  },
  {
    "path": "jest.config.js",
    "content": "module.exports = {\n  moduleFileExtensions: [\n    'js',\n    'json',\n    'vue',\n  ],\n  moduleNameMapper: {\n    '^@/(.*)$': '<rootDir>/src/$1', \n  },\n  transformIgnorePatterns: [\n    \"<rootDir>/node_modules/(?!@babel|@interactjs)\",\n  ],\n  transform: {\n    '^.+\\\\.js$': '<rootDir>/node_modules/babel-jest',\n    '.*\\\\.(vue)$': '<rootDir>/node_modules/vue-jest',\n  },\n  coverageDirectory: '<rootDir>/test/unit/coverage',\n  collectCoverageFrom: [\n    'src/**/*.{js,vue}',\n    '!src/main.js',\n    '!src/router/index.js',\n    '!**/node_modules/**',\n  ],\n};\n"
  },
  {
    "path": "package.json",
    "content": "{\n  \"name\": \"vue-grid-layout\",\n  \"version\": \"2.4.0\",\n  \"description\": \"A draggable and resizable grid layout, as a Vue component.\",\n  \"keywords\": [\n    \"grid\",\n    \"vuejs\",\n    \"drag\",\n    \"draggable\",\n    \"resize\",\n    \"resizable\",\n    \"fluid\",\n    \"responsive\"\n  ],\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/jbaysolutions/vue-grid-layout.git\"\n  },\n  \"author\": \"Gustavo Santos (JBay Solutions) <gustavo.santos@jbaysolutions.com> (http://www.jbaysolutions.com)\",\n  \"homepage\": \"https://github.com/jbaysolutions/vue-grid-layout\",\n  \"main\": \"dist/vue-grid-layout.common.js\",\n  \"unpkg\": \"dist/vue-grid-layout.umd.min.js\",\n  \"scripts\": {\n    \"serve\": \"vue-cli-service serve\",\n    \"build\": \"rimraf dist && vue-cli-service build\",\n    \"build-lib\": \"rimraf dist && vue-cli-service build --target lib ./src/components/index.js\",\n    \"lint\": \"vue-cli-service lint\",\n    \"test:unit\": \"vue-cli-service test:unit\",\n    \"test:cover\": \"vue-cli-service test:unit --coverage\"\n  },\n  \"dependencies\": {\n    \"@interactjs/actions\": \"1.10.2\",\n    \"@interactjs/auto-scroll\": \"1.10.2\",\n    \"@interactjs/auto-start\": \"1.10.2\",\n    \"@interactjs/interactjs\": \"1.10.2\",\n    \"@interactjs/modifiers\": \"1.10.2\",\n    \"@interactjs/dev-tools\": \"1.10.2\",\n    \"element-resize-detector\": \"^1.2.1\"\n  },\n  \"devDependencies\": {\n    \"@babel/preset-env\": \"^7.12.11\",\n    \"@vue/cli-plugin-babel\": \"^3.4.1\",\n    \"@vue/cli-plugin-eslint\": \"^3.4.1\",\n    \"@vue/cli-plugin-unit-jest\": \"^4.5.10\",\n    \"@vue/cli-service\": \"^3.4.1\",\n    \"@vue/eslint-config-standard\": \"^3.0.5\",\n    \"@vue/test-utils\": \"^1.1.2\",\n    \"babel-core\": \"7.0.0-bridge.0\",\n    \"babel-jest\": \"^26.6.3\",\n    \"babel-plugin-transform-flow-comments\": \"^6.7.0\",\n    \"rimraf\": \"^2.6.2\",\n    \"vue\": \"^2.7.8\",\n    \"vue-jest\": \"^3.0.7\",\n    \"vue-template-compiler\": \"^2.7.8\",\n    \"webpack-bundle-analyzer\": \"^3.9.0\"\n  }\n}\n"
  },
  {
    "path": "postcss.config.js",
    "content": "module.exports = {\n  plugins: {\n    autoprefixer: {}\n  }\n}\n"
  },
  {
    "path": "public/app.css",
    "content": "/*** EXAMPLE ***/\n#content {\n    width: 100%;\n    margin-top:10px;\n}\n\n.vue-grid-layout {\n    background: #eee;\n}\n\n.layoutJSON {\n    background: #ddd;\n    border: 1px solid black;\n    margin-top: 10px;\n    padding: 10px;\n}\n\n.eventsJSON {\n    background: #ddd;\n    border: 1px solid black;\n    margin-top: 10px;\n    padding: 10px;\n    height: 100px;\n    overflow-y: scroll;\n}\n\n.columns {\n    -moz-columns: 120px;\n    -webkit-columns: 120px;\n    columns: 120px;\n}\n\n\n\n.vue-resizable-handle {\n    z-index: 5000;\n    position: absolute;\n    width: 20px;\n    height: 20px;\n    bottom: 0;\n    right: 0;\n    background: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBzdGFuZGFsb25lPSJubyI/Pg08IS0tIEdlbmVyYXRvcjogQWRvYmUgRmlyZXdvcmtzIENTNiwgRXhwb3J0IFNWRyBFeHRlbnNpb24gYnkgQWFyb24gQmVhbGwgKGh0dHA6Ly9maXJld29ya3MuYWJlYWxsLmNvbSkgLiBWZXJzaW9uOiAwLjYuMSAgLS0+DTwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DTxzdmcgaWQ9IlVudGl0bGVkLVBhZ2UlMjAxIiB2aWV3Qm94PSIwIDAgNiA2IiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjojZmZmZmZmMDAiIHZlcnNpb249IjEuMSINCXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHhtbDpzcGFjZT0icHJlc2VydmUiDQl4PSIwcHgiIHk9IjBweCIgd2lkdGg9IjZweCIgaGVpZ2h0PSI2cHgiDT4NCTxnIG9wYWNpdHk9IjAuMzAyIj4NCQk8cGF0aCBkPSJNIDYgNiBMIDAgNiBMIDAgNC4yIEwgNCA0LjIgTCA0LjIgNC4yIEwgNC4yIDAgTCA2IDAgTCA2IDYgTCA2IDYgWiIgZmlsbD0iIzAwMDAwMCIvPg0JPC9nPg08L3N2Zz4=');\n    background-position: bottom right;\n    padding: 0 3px 3px 0;\n    background-repeat: no-repeat;\n    background-origin: content-box;\n    box-sizing: border-box;\n    cursor: se-resize;\n}\n\n.vue-grid-item:not(.vue-grid-placeholder) {\n    background: #ccc;\n    border: 1px solid black;\n}\n\n.vue-grid-item.resizing {\n    opacity: 0.9;\n}\n\n.vue-grid-item.static {\n    background: #cce;\n}\n\n.vue-grid-item .text {\n    font-size: 24px;\n    text-align: center;\n    position: absolute;\n    top: 0;\n    bottom: 0;\n    left: 0;\n    right: 0;\n    margin: auto;\n    height: 100%;\n    width: 100%;\n}\n\n.vue-grid-item .no-drag {\n    height: 100%;\n    width: 100%;\n}\n\n.vue-grid-item .minMax {\n    font-size: 12px;\n}\n\n.vue-grid-item .add {\n    cursor: pointer;\n}\n\n.vue-draggable-handle {\n    position: absolute;\n    width: 20px;\n    height: 20px;\n    top: 0;\n    left: 0;\n    background: url(\"data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='10' height='10'><circle cx='5' cy='5' r='5' fill='#999999'/></svg>\") no-repeat;\n    background-position: bottom right;\n    padding: 0 8px 8px 0;\n    background-repeat: no-repeat;\n    background-origin: content-box;\n    box-sizing: border-box;\n    cursor: pointer;\n}\n\n#content .vue-grid-item.vue-grid-placeholder {\n    background-color: green;\n}\n"
  },
  {
    "path": "public/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"utf-8\">\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n    <meta name=\"viewport\" content=\"width=device-width,initial-scale=1.0\">\n    <!--<link rel=\"icon\" href=\"<%= BASE_URL %>favicon.ico\">-->\n    <link rel=\"icon\" href=\"favicon.ico\">\n    <link href=\"app.css\" rel=\"stylesheet\"/>\n\n    <title>Vue Grid Layout</title>\n</head>\n<body>\n<noscript>\n    <strong>We're sorry but vue-grid-layout-vuecli doesn't work properly without JavaScript enabled. Please enable it to\n        continue.</strong>\n</noscript>\n<div id=\"app\"></div>\n<!-- built files will be auto injected -->\n</body>\n</html>\n"
  },
  {
    "path": "src/App.vue",
    "content": "<template>\n    <div id=\"app\">\n        <h1 style=\"text-align: center\">Vue Grid Layout</h1>\n        <!--<pre>{{ layout | json }}</pre>-->\n        <div>\n            <div class=\"layoutJSON\">\n                Displayed as <code>[x, y, w, h]</code>:\n                <div class=\"columns\">\n                    <div class=\"layoutItem\" v-for=\"item in layout\" :key=\"item.i\">\n                        <b>{{item.i}}</b>: [{{item.x}}, {{item.y}}, {{item.w}}, {{item.h}}]\n                    </div>\n                </div>\n            </div>\n            <!--<div class=\"layoutJSON\">\n                Displayed as <code>[x, y, w, h]</code>:\n                <div class=\"columns\">\n                    <div class=\"layoutItem\" v-for=\"item in layout2\">\n                        <b>{{item.i}}</b>: [{{item.x}}, {{item.y}}, {{item.w}}, {{item.h}}]\n                    </div>\n                </div>\n            </div>-->\n        </div>\n        <div id=\"content\">\n            <button @click=\"decreaseWidth\">Decrease Width</button>\n            <button @click=\"increaseWidth\">Increase Width</button>\n            <button @click=\"scaleHalf\">Scale x0.5</button>\n            <button @click=\"scaleThreeQuarters\">Scale x0.75</button>\n            <button @click=\"scaleIdentity\">Scale x1.0</button>\n            <button @click=\"addItem\">Add an item</button>\n            <button @click=\"addItemDynamically\">Add an item dynamically</button>\n            <!-- Add to show rtl support -->\n            <button @click=\"changeDirection\">Change Direction</button>\n            <input type=\"checkbox\" v-model=\"draggable\"/> Draggable\n            <input type=\"checkbox\" v-model=\"resizable\"/> Resizable\n            <input type=\"checkbox\" v-model=\"mirrored\"/> Mirrored\n            <input type=\"checkbox\" v-model=\"bounded\"/> Bounded\n            <input type=\"checkbox\" v-model=\"responsive\"/> Responsive\n            <input type=\"checkbox\" v-model=\"preventCollision\"/> Prevent Collision\n            <input type=\"checkbox\" v-model=\"compact\"/> Vertical Compact\n            <div style=\"margin-top: 10px;margin-bottom: 10px;\">\n                Row Height: <input type=\"number\" v-model=\"rowHeight\"/> Col nums: <input type=\"number\" v-model=\"colNum\"/>\n                Margin x: <input type=\"number\" v-model=\"marginX\"/> Margin y: <input type=\"number\" v-model=\"marginY\"/>\n            </div>\n            <grid-layout\n                    id=\"grid-layout\"\n                    :margin=\"[parseInt(marginX), parseInt(marginY)]\"\n                    :layout.sync=\"layout\"\n                    :col-num=\"parseInt(colNum)\"\n                    :row-height=\"rowHeight\"\n                    :is-draggable=\"draggable\"\n                    :is-resizable=\"resizable\"\n                    :is-mirrored=\"mirrored\"\n                    :is-bounded=\"bounded\"\n                    :prevent-collision=\"preventCollision\"\n                    :vertical-compact=\"compact\"\n                    :restore-on-drag=\"restoreOnDrag\"\n                    :use-css-transforms=\"true\"\n                    :responsive=\"responsive\"\n                    :transformScale=\"transformScale\"\n                    @layout-created=\"layoutCreatedEvent\"\n                    @layout-before-mount=\"layoutBeforeMountEvent\"\n                    @layout-mounted=\"layoutMountedEvent\"\n                    @layout-ready=\"layoutReadyEvent\"\n                    @layout-updated=\"layoutUpdatedEvent\"\n                    @breakpoint-changed=\"breakpointChangedEvent\"\n            >\n                <grid-item v-for=\"item in layout\" :key=\"item.i\"\n                           :static=\"item.static\"\n                           :x=\"item.x\"\n                           :y=\"item.y\"\n                           :w=\"item.w\"\n                           :h=\"item.h\"\n                           :i=\"item.i\"\n                           :min-w=\"item.minW\"\n                           :max-w=\"item.maxW\"\n                           :min-x=\"item.minX\"\n                           :max-x=\"item.maxX\"\n                           :min-y=\"item.minY\"\n                           :max-y=\"item.maxY\"\n                           :preserve-aspect-ratio=\"item.preserveAspectRatio\"\n                           @resize=\"resize\"\n                           @move=\"move\"\n                           @resized=\"resized\"\n                           @container-resized=\"containerResized\"\n                           @moved=\"moved\"\n                >\n                    <!--<custom-drag-element :text=\"item.i\"></custom-drag-element>-->\n                    <test-element :text=\"item.i\" @removeItem=\"removeItem($event)\"></test-element>\n                    <!--<button @click=\"clicked\">CLICK ME!</button>-->\n                </grid-item>\n            </grid-layout>\n            <hr/>\n            <!--<grid-layout\n                    :layout=\"layout2\"\n                    :col-num=\"12\"\n                    :row-height=\"rowHeight\"\n                    :is-draggable=\"draggable\"\n                    :is-resizable=\"resizable\"\n                    :vertical-compact=\"true\"\n                    :use-css-transforms=\"true\"\n            >\n                <grid-item v-for=\"item in layout2\" :key=\"item.i\"\n                           :x=\"item.x\"\n                           :y=\"item.y\"\n                           :w=\"item.w\"\n                           :h=\"item.h\"\n                           :min-w=\"2\"\n                           :min-h=\"2\"\n                           :i=\"item.i\"\n                           :is-draggable=\"item.draggable\"\n                           :is-resizable=\"item.resizable\"\n                >\n                    <test-element :text=\"item.i\"></test-element>\n                </grid-item>\n            </grid-layout>-->\n        </div>\n    </div>\n</template>\n\n<script>\n    import GridItem from './components/GridItem.vue';\n    import GridLayout from './components/GridLayout.vue';\n    // import ResponsiveGridLayout from './components/ResponsiveGridLayout.vue';\n    import TestElement from './components/TestElement.vue';\n    import CustomDragElement from './components/CustomDragElement.vue';\n    import {getDocumentDir, setDocumentDir} from \"./helpers/DOM\";\n    //var eventBus = require('./eventBus');\n\n    let testLayout = [\n        {\"x\":0,\"y\":0,\"w\":2,\"h\":2,\"i\":\"0\", resizable: true, draggable: true, static: false, minY: 0, maxY: 2},\n        {\"x\":2,\"y\":0,\"w\":2,\"h\":4,\"i\":\"1\", resizable: null, draggable: null, static: true},\n        {\"x\":4,\"y\":0,\"w\":2,\"h\":5,\"i\":\"2\", resizable: false, draggable: false, static: false, minX: 4, maxX: 4, minW: 2, maxW: 2, preserveAspectRatio: true},\n        {\"x\":6,\"y\":0,\"w\":2,\"h\":3,\"i\":\"3\", resizable: false, draggable: false, static: false, preserveAspectRatio: true},\n        {\"x\":8,\"y\":0,\"w\":2,\"h\":3,\"i\":\"4\", resizable: false, draggable: false, static: false},\n        {\"x\":10,\"y\":0,\"w\":2,\"h\":3,\"i\":\"5\", resizable: false, draggable: false, static: false},\n        {\"x\":0,\"y\":5,\"w\":2,\"h\":5,\"i\":\"6\", resizable: false, draggable: false, static: false},\n        {\"x\":2,\"y\":5,\"w\":2,\"h\":5,\"i\":\"7\", resizable: false, draggable: false, static: false},\n        {\"x\":4,\"y\":5,\"w\":2,\"h\":5,\"i\":\"8\", resizable: false, draggable: false, static: false},\n        {\"x\":6,\"y\":3,\"w\":2,\"h\":4,\"i\":\"9\", resizable: false, draggable: false, static: true},\n        {\"x\":8,\"y\":4,\"w\":2,\"h\":4,\"i\":\"10\", resizable: false, draggable: false, static: false},\n        {\"x\":10,\"y\":4,\"w\":2,\"h\":4,\"i\":\"11\", resizable: false, draggable: false, static: false, minY: 4},\n        {\"x\":0,\"y\":10,\"w\":2,\"h\":5,\"i\":\"12\", resizable: false, draggable: false, static: false},\n        {\"x\":2,\"y\":10,\"w\":2,\"h\":5,\"i\":\"13\", resizable: false, draggable: false, static: false},\n        {\"x\":4,\"y\":8,\"w\":2,\"h\":4,\"i\":\"14\", resizable: false, draggable: false, static: false},\n        {\"x\":6,\"y\":8,\"w\":2,\"h\":4,\"i\":\"15\", resizable: false, draggable: false, static: false},\n        {\"x\":8,\"y\":10,\"w\":2,\"h\":5,\"i\":\"16\", resizable: false, draggable: false, static: false},\n        {\"x\":10,\"y\":4,\"w\":2,\"h\":2,\"i\":\"17\", resizable: false, draggable: false, static: false},\n        {\"x\":0,\"y\":9,\"w\":2,\"h\":3,\"i\":\"18\", resizable: false, draggable: false, static: false},\n        {\"x\":2,\"y\":6,\"w\":2,\"h\":2,\"i\":\"19\", resizable: false, draggable: false, static: false}\n    ];\n\n    /*let testLayout = [\n        { x: 0, y: 0, w: 2, h: 2, i: \"0\" },\n        { x: 2, y: 0, w: 2, h: 2, i: \"1\" },\n        { x: 4, y: 0, w: 2, h: 2, i: \"2\" },\n        { x: 6, y: 0, w: 2, h: 2, i: \"3\" },\n        { x: 8, y: 0, w: 2, h: 2, i: \"4\" },\n    ];*/\n\n    export default {\n        name: 'app',\n        components: {\n            GridLayout,\n            GridItem,\n            TestElement,\n            CustomDragElement,\n        },\n        data () {\n            return {\n                layout: JSON.parse(JSON.stringify(testLayout)),\n                layout2: JSON.parse(JSON.stringify(testLayout)),\n                draggable: true,\n                resizable: true,\n                mirrored: false,\n                responsive: true,\n                bounded: false,\n                transformScale: 1,\n                preventCollision: false,\n                compact: true,\n                restoreOnDrag: true,\n                rowHeight: 30,\n                colNum: 12,\n                index: 0,\n                marginX: 10,\n                marginY: 10,\n            }\n        },\n        mounted: function () {\n            this.index = this.layout.length;\n        },\n        methods: {\n            clicked: function() {\n                window.alert(\"CLICK!\");\n            },\n            increaseWidth: function() {\n                let width = document.getElementById(\"content\").offsetWidth;\n                width += 20;\n                document.getElementById(\"content\").style.width = width+\"px\";\n            },\n            decreaseWidth: function() {\n                let width = document.getElementById(\"content\").offsetWidth;\n                width -= 20;\n                document.getElementById(\"content\").style.width = width+\"px\";\n            },\n            scaleHalf: function() {\n                this.transformScale = 0.5\n                document.getElementById(\"grid-layout\").style.transform = \"scale(0.5)\";\n            },\n            scaleThreeQuarters: function() {\n                this.transformScale = 0.75\n                document.getElementById(\"grid-layout\").style.transform = \"scale(0.75)\";\n            },\n            scaleIdentity: function() {\n                this.transformScale = 1\n                document.getElementById(\"grid-layout\").style.transform = \"scale(1)\";\n            },\n            removeItem: function(i) {\n                console.log(\"### REMOVE \" + i);\n                const index = this.layout.map(item => item.i).indexOf(i);\n                this.layout.splice(index, 1);\n            },\n            addItem: function() {\n                // let self = this;\n                //console.log(\"### LENGTH: \" + this.layout.length);\n                let item = {\"x\":0,\"y\":0,\"w\":2,\"h\":2,\"i\":this.index+\"\", whatever: \"bbb\"};\n                this.index++;\n                this.layout.push(item);\n            },\n            addItemDynamically: function() {\n                const x = (this.layout.length * 2) % (this.colNum || 12);\n                const y = this.layout.length + (this.colNum || 12);\n                console.log(\"X=\" + x + \" Y=\" + y)\n                let item = {\n                  x: x,\n                  y: y,\n                  w: 2,\n                  h: 2,\n                  i: this.index+\"\",\n                }\n                this.index++;\n                this.layout.push(item);\n            },\n            move: function(i, newX, newY){\n                console.log(\"MOVE i=\" + i + \", X=\" + newX + \", Y=\" + newY);\n            },\n            resize: function(i, newH, newW, newHPx, newWPx){\n                console.log(\"RESIZE i=\" + i + \", H=\" + newH + \", W=\" + newW + \", H(px)=\" + newHPx + \", W(px)=\" + newWPx);\n            },\n            moved: function(i, newX, newY){\n                console.log(\"### MOVED i=\" + i + \", X=\" + newX + \", Y=\" + newY);\n            },\n            resized: function(i, newH, newW, newHPx, newWPx){\n                console.log(\"### RESIZED i=\" + i + \", H=\" + newH + \", W=\" + newW + \", H(px)=\" + newHPx + \", W(px)=\" + newWPx);\n            },\n            containerResized: function(i, newH, newW, newHPx, newWPx){\n                console.log(\"### CONTAINER RESIZED i=\" + i + \", H=\" + newH + \", W=\" + newW + \", H(px)=\" + newHPx + \", W(px)=\" + newWPx);\n            },\n            /**\n             * Add change direction button\n             */\n            changeDirection() {\n                let documentDirection = getDocumentDir();\n                let toggle = \"\";\n                if (documentDirection === \"rtl\") {\n                    toggle = \"ltr\"\n                } else {\n                    toggle = \"rtl\"\n                }\n                setDocumentDir(toggle);\n                //eventBus.$emit('directionchange');\n            },\n\n            layoutCreatedEvent: function(newLayout){\n                console.log(\"Created layout: \", newLayout)\n            },\n            layoutBeforeMountEvent: function(newLayout){\n                console.log(\"beforeMount layout: \", newLayout)\n            },\n            layoutMountedEvent: function(newLayout){\n                console.log(\"Mounted layout: \", newLayout)\n            },\n            layoutReadyEvent: function(newLayout){\n                console.log(\"Ready layout: \", newLayout)\n            },\n            layoutUpdatedEvent: function(newLayout){\n                console.log(\"Updated layout: \", newLayout)\n            },\n            breakpointChangedEvent: function(newBreakpoint, newLayout){\n                console.log(\"breakpoint changed breakpoint=\", newBreakpoint, \", layout: \", newLayout );\n            }\n\n        },\n    }\n</script>\n\n<style>\n    /*    #app {\n            font-family: 'Avenir', Helvetica, Arial, sans-serif;\n            -webkit-font-smoothing: antialiased;\n            -moz-osx-font-smoothing: grayscale;\n            text-align: center;\n            color: #2c3e50;\n            margin-top: 60px;\n        }\n\n        h1, h2 {\n            font-weight: normal;\n        }\n\n        ul {\n            list-style-type: none;\n            padding: 0;\n        }\n\n        li {\n            display: inline-block;\n            margin: 0 10px;\n        }\n\n        a {\n            color: #42b983;\n        }*/\n</style>\n\n<style lang=\"css\">\n#app {\n  font-family: 'Avenir', Helvetica, Arial, sans-serif;\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n  /*text-align: center;*/\n  color: #2c3e50;\n  /*margin-top: 60px;*/\n}\n</style>\n"
  },
  {
    "path": "src/components/CustomDragElement.vue",
    "content": "<template>\n    <span class=\"text\">\n        {{text}}\n    <button>xxx</button>\n    <span class=\"vue-draggable-handle\"></span>\n    </span>\n</template>\n<style>\n    .vue-draggable-handle {\n        position: absolute;\n        width: 20px;\n        height: 20px;\n        top: 0;\n        left: 0;\n        background: url(\"data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='10' height='10'><circle cx='5' cy='5' r='5' fill='#999999'/></svg>\") no-repeat;\n        background-position: bottom right;\n        padding: 0 8px 8px 0;\n        background-repeat: no-repeat;\n        background-origin: content-box;\n        box-sizing: border-box;\n        cursor: pointer;\n    }\n</style>\n<script>\n    export default {\n        name: \"CustomDragElement\",\n        props: {\n            text : {\n                type: String,\n                default: \"x\",\n            },\n        },\n        data: function() {\n            return {\n            }\n        },\n        mounted: function() {\n            console.log(\"### \" + this.text + \" ready!\");\n        },\n    }\n</script>"
  },
  {
    "path": "src/components/GridItem.vue",
    "content": "<template>\n    <div ref=\"item\"\n         class=\"vue-grid-item\"\n         :class=\"classObj\"\n         :style=\"style\"\n    >\n        <slot></slot>\n        <span v-if=\"resizableAndNotStatic\" ref=\"handle\" :class=\"resizableHandleClass\"></span>\n        <!--<span v-if=\"draggable\" ref=\"dragHandle\" class=\"vue-draggable-handle\"></span>-->\n    </div>\n</template>\n<style>\n    .vue-grid-item {\n        transition: all 200ms ease;\n        transition-property: left, top, right;\n        /* add right for rtl */\n    }\n\n    .vue-grid-item.no-touch {\n        -ms-touch-action: none;\n        touch-action: none;\n    }\n\n    .vue-grid-item.cssTransforms {\n        transition-property: transform;\n        left: 0;\n        right: auto;\n    }\n\n    .vue-grid-item.cssTransforms.render-rtl {\n        left: auto;\n        right: 0;\n    }\n\n    .vue-grid-item.resizing {\n        opacity: 0.6;\n        z-index: 3;\n    }\n\n    .vue-grid-item.vue-draggable-dragging {\n        transition:none;\n        z-index: 3;\n    }\n\n    .vue-grid-item.vue-grid-placeholder {\n        background: red;\n        opacity: 0.2;\n        transition-duration: 100ms;\n        z-index: 2;\n        -webkit-user-select: none;\n        -moz-user-select: none;\n        -ms-user-select: none;\n        -o-user-select: none;\n        user-select: none;\n    }\n\n    .vue-grid-item > .vue-resizable-handle {\n        position: absolute;\n        width: 20px;\n        height: 20px;\n        bottom: 0;\n        right: 0;\n        background: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBzdGFuZGFsb25lPSJubyI/Pg08IS0tIEdlbmVyYXRvcjogQWRvYmUgRmlyZXdvcmtzIENTNiwgRXhwb3J0IFNWRyBFeHRlbnNpb24gYnkgQWFyb24gQmVhbGwgKGh0dHA6Ly9maXJld29ya3MuYWJlYWxsLmNvbSkgLiBWZXJzaW9uOiAwLjYuMSAgLS0+DTwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DTxzdmcgaWQ9IlVudGl0bGVkLVBhZ2UlMjAxIiB2aWV3Qm94PSIwIDAgNiA2IiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjojZmZmZmZmMDAiIHZlcnNpb249IjEuMSINCXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHhtbDpzcGFjZT0icHJlc2VydmUiDQl4PSIwcHgiIHk9IjBweCIgd2lkdGg9IjZweCIgaGVpZ2h0PSI2cHgiDT4NCTxnIG9wYWNpdHk9IjAuMzAyIj4NCQk8cGF0aCBkPSJNIDYgNiBMIDAgNiBMIDAgNC4yIEwgNCA0LjIgTCA0LjIgNC4yIEwgNC4yIDAgTCA2IDAgTCA2IDYgTCA2IDYgWiIgZmlsbD0iIzAwMDAwMCIvPg0JPC9nPg08L3N2Zz4=');\n        background-position: bottom right;\n        padding: 0 3px 3px 0;\n        background-repeat: no-repeat;\n        background-origin: content-box;\n        box-sizing: border-box;\n        cursor: se-resize;\n    }\n\n    .vue-grid-item > .vue-rtl-resizable-handle {\n        bottom: 0;\n        left: 0;\n        background: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAuMDAwMDAwMDAwMDAwMDAyIiBoZWlnaHQ9IjEwLjAwMDAwMDAwMDAwMDAwMiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KIDwhLS0gQ3JlYXRlZCB3aXRoIE1ldGhvZCBEcmF3IC0gaHR0cDovL2dpdGh1Yi5jb20vZHVvcGl4ZWwvTWV0aG9kLURyYXcvIC0tPgogPGc+CiAgPHRpdGxlPmJhY2tncm91bmQ8L3RpdGxlPgogIDxyZWN0IGZpbGw9Im5vbmUiIGlkPSJjYW52YXNfYmFja2dyb3VuZCIgaGVpZ2h0PSIxMiIgd2lkdGg9IjEyIiB5PSItMSIgeD0iLTEiLz4KICA8ZyBkaXNwbGF5PSJub25lIiBvdmVyZmxvdz0idmlzaWJsZSIgeT0iMCIgeD0iMCIgaGVpZ2h0PSIxMDAlIiB3aWR0aD0iMTAwJSIgaWQ9ImNhbnZhc0dyaWQiPgogICA8cmVjdCBmaWxsPSJ1cmwoI2dyaWRwYXR0ZXJuKSIgc3Ryb2tlLXdpZHRoPSIwIiB5PSIwIiB4PSIwIiBoZWlnaHQ9IjEwMCUiIHdpZHRoPSIxMDAlIi8+CiAgPC9nPgogPC9nPgogPGc+CiAgPHRpdGxlPkxheWVyIDE8L3RpdGxlPgogIDxsaW5lIGNhbnZhcz0iI2ZmZmZmZiIgY2FudmFzLW9wYWNpdHk9IjEiIHN0cm9rZS1saW5lY2FwPSJ1bmRlZmluZWQiIHN0cm9rZS1saW5lam9pbj0idW5kZWZpbmVkIiBpZD0ic3ZnXzEiIHkyPSItNzAuMTc4NDA3IiB4Mj0iMTI0LjQ2NDE3NSIgeTE9Ii0zOC4zOTI3MzciIHgxPSIxNDQuODIxMjg5IiBzdHJva2Utd2lkdGg9IjEuNSIgc3Ryb2tlPSIjMDAwIiBmaWxsPSJub25lIi8+CiAgPGxpbmUgc3Ryb2tlPSIjNjY2NjY2IiBzdHJva2UtbGluZWNhcD0idW5kZWZpbmVkIiBzdHJva2UtbGluZWpvaW49InVuZGVmaW5lZCIgaWQ9InN2Z181IiB5Mj0iOS4xMDY5NTciIHgyPSIwLjk0NzI0NyIgeTE9Ii0wLjAxODEyOCIgeDE9IjAuOTQ3MjQ3IiBzdHJva2Utd2lkdGg9IjIiIGZpbGw9Im5vbmUiLz4KICA8bGluZSBzdHJva2UtbGluZWNhcD0idW5kZWZpbmVkIiBzdHJva2UtbGluZWpvaW49InVuZGVmaW5lZCIgaWQ9InN2Z183IiB5Mj0iOSIgeDI9IjEwLjA3MzUyOSIgeTE9IjkiIHgxPSItMC42NTU2NCIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2U9IiM2NjY2NjYiIGZpbGw9Im5vbmUiLz4KIDwvZz4KPC9zdmc+);\n        background-position: bottom left;\n        padding-left: 3px;\n        background-repeat: no-repeat;\n        background-origin: content-box;\n        cursor: sw-resize;\n        right: auto;\n    }\n\n    .vue-grid-item.disable-userselect {\n        user-select: none;\n    }\n</style>\n<script>\n    import {setTopLeft, setTopRight, setTransformRtl, setTransform} from '@/helpers/utils';\n    import {getControlPosition, createCoreData} from '@/helpers/draggableUtils';\n    import {getColsFromBreakpoint} from '@/helpers/responsiveUtils';\n    import {getDocumentDir} from \"@/helpers/DOM\";\n    //    var eventBus = require('./eventBus');\n\n    import '@interactjs/auto-start'\n    import '@interactjs/auto-scroll'\n    import '@interactjs/actions/drag'\n    import '@interactjs/actions/resize'\n    import '@interactjs/modifiers'\n    import '@interactjs/dev-tools'\n    import interact from '@interactjs/interact'\n\n    export default {\n        name: \"GridItem\",\n        props: {\n            /*cols: {\n             type: Number,\n             required: true\n             },*/\n            /*containerWidth: {\n             type: Number,\n             required: true\n\n             },\n             rowHeight: {\n             type: Number,\n             required: true\n             },\n             margin: {\n             type: Array,\n             required: true\n             },\n             maxRows: {\n             type: Number,\n             required: true\n             },*/\n            isDraggable: {\n                type: Boolean,\n                required: false,\n                default: null\n            },\n            isResizable: {\n                type: Boolean,\n                required: false,\n                default: null\n            },\n            isBounded: {\n                type: Boolean,\n                required: false,\n                default: null\n            },\n            /*useCssTransforms: {\n             type: Boolean,\n             required: true\n             },\n             */\n            static: {\n                type: Boolean,\n                required: false,\n                default: false\n            },\n            minH: {\n                type: Number,\n                required: false,\n                default: 1\n            },\n            minW: {\n                type: Number,\n                required: false,\n                default: 1\n            },\n            maxH: {\n                type: Number,\n                required: false,\n                default: Infinity\n            },\n            maxW: {\n                type: Number,\n                required: false,\n                default: Infinity\n            },\n            x: {\n                type: Number,\n                required: true\n            },\n            y: {\n                type: Number,\n                required: true\n            },\n            w: {\n                type: Number,\n                required: true\n            },\n            h: {\n                type: Number,\n                required: true\n            },\n            i: {\n                required: true\n            },\n            dragIgnoreFrom: {\n                type: String,\n                required: false,\n                default: 'a, button'\n            },\n            dragAllowFrom: {\n                type: String,\n                required: false,\n                default: null\n            },\n            resizeIgnoreFrom: {\n                type: String,\n                required: false,\n                default: 'a, button'\n            },\n            preserveAspectRatio: {\n                type: Boolean,\n                required: false,\n                default: false,\n            },\n            dragOption:{\n                type:Object,\n                required: false,\n                default: ()=>({}),\n            },\n            resizeOption:{\n                type:Object,\n                required: false,\n                default: ()=>({}),\n            }\n        },\n        inject: [\"eventBus\", \"layout\"],\n        data: function () {\n            return {\n                cols: 1,\n                containerWidth: 100,\n                rowHeight: 30,\n                margin: [10, 10],\n                maxRows: Infinity,\n                draggable: null,\n                resizable: null,\n                transformScale: 1,\n                useCssTransforms: true,\n                useStyleCursor: true,\n\n                isDragging: false,\n                dragging: null,\n                isResizing: false,\n                resizing: null,\n                lastX: NaN,\n                lastY: NaN,\n                lastW: NaN,\n                lastH: NaN,\n                style: {},\n                rtl: false,\n\n                dragEventSet: false,\n                resizeEventSet: false,\n\n                previousW: null,\n                previousH: null,\n                previousX: null,\n                previousY: null,\n                innerX: this.x,\n                innerY: this.y,\n                innerW: this.w,\n                innerH: this.h\n            }\n        },\n        created () {\n            let self = this;\n\n            // Accessible refernces of functions for removing in beforeDestroy\n            self.updateWidthHandler = function (width) {\n                self.updateWidth(width);\n            };\n\n            self.compactHandler = function (layout) {\n                self.compact(layout);\n            };\n\n            self.setDraggableHandler = function (isDraggable) {\n                if (self.isDraggable === null) {\n                    self.draggable = isDraggable;\n                }\n            };\n\n            self.setResizableHandler = function (isResizable) {\n                if (self.isResizable === null) {\n                    self.resizable = isResizable;\n                }\n            };\n\n            self.setBoundedHandler = function (isBounded) {\n                if (self.isBounded === null) {\n                    self.bounded = isBounded;\n                }\n            };\n\n            self.setTransformScaleHandler = function (transformScale) {\n                self.transformScale = transformScale\n            };\n\n            self.setRowHeightHandler = function (rowHeight) {\n                self.rowHeight = rowHeight;\n            };\n\n            self.setMaxRowsHandler = function (maxRows) {\n                self.maxRows = maxRows;\n            };\n\n            self.directionchangeHandler = () => {\n                this.rtl = getDocumentDir() === 'rtl';\n                this.compact();\n            };\n\n            self.setColNum = (colNum) => {\n               self.cols = parseInt(colNum);\n            }\n\n            this.eventBus.$on('updateWidth', self.updateWidthHandler);\n            this.eventBus.$on('compact', self.compactHandler);\n            this.eventBus.$on('setDraggable', self.setDraggableHandler);\n            this.eventBus.$on('setResizable', self.setResizableHandler);\n            this.eventBus.$on('setBounded', self.setBoundedHandler);\n            this.eventBus.$on('setTransformScale', self.setTransformScaleHandler)\n            this.eventBus.$on('setRowHeight', self.setRowHeightHandler);\n            this.eventBus.$on('setMaxRows', self.setMaxRowsHandler);\n            this.eventBus.$on('directionchange', self.directionchangeHandler);\n            this.eventBus.$on('setColNum', self.setColNum)\n\n            this.rtl = getDocumentDir() === 'rtl';\n        },\n        beforeDestroy: function(){\n            let self = this;\n            //Remove listeners\n            this.eventBus.$off('updateWidth', self.updateWidthHandler);\n            this.eventBus.$off('compact', self.compactHandler);\n            this.eventBus.$off('setDraggable', self.setDraggableHandler);\n            this.eventBus.$off('setResizable', self.setResizableHandler);\n            this.eventBus.$off('setBounded', self.setBoundedHandler);\n            this.eventBus.$off('setTransformScale', self.setTransformScaleHandler)\n            this.eventBus.$off('setRowHeight', self.setRowHeightHandler);\n            this.eventBus.$off('setMaxRows', self.setMaxRowsHandler);\n            this.eventBus.$off('directionchange', self.directionchangeHandler);\n            this.eventBus.$off('setColNum', self.setColNum);\n            if (this.interactObj) {\n                this.interactObj.unset() // destroy interact intance\n            }\n        },\n        mounted: function () {\n            if (this.layout.responsive && this.layout.lastBreakpoint) {\n                this.cols = getColsFromBreakpoint(this.layout.lastBreakpoint, this.layout.cols);\n            } else {\n                this.cols = this.layout.colNum;\n            }\n            this.rowHeight = this.layout.rowHeight;\n            this.containerWidth = this.layout.width !== null ? this.layout.width : 100;\n            this.margin = this.layout.margin !== undefined ? this.layout.margin : [10, 10];\n            this.maxRows = this.layout.maxRows;\n\n            if (this.isDraggable === null) {\n                this.draggable = this.layout.isDraggable;\n            } else {\n                this.draggable = this.isDraggable;\n            }\n            if (this.isResizable === null) {\n                this.resizable = this.layout.isResizable;\n            } else {\n                this.resizable = this.isResizable;\n            }\n            if (this.isBounded === null) {\n                this.bounded = this.layout.isBounded;\n            } else {\n                this.bounded = this.isBounded;\n            }\n            this.transformScale = this.layout.transformScale\n            this.useCssTransforms = this.layout.useCssTransforms;\n            this.useStyleCursor = this.layout.useStyleCursor;\n            this.createStyle();\n        },\n        watch: {\n            isDraggable: function () {\n                this.draggable = this.isDraggable;\n            },\n            static: function () {\n                this.tryMakeDraggable();\n                this.tryMakeResizable();\n            },\n            draggable: function () {\n                this.tryMakeDraggable();\n            },\n            isResizable: function () {\n                this.resizable = this.isResizable;\n            },\n            isBounded: function () {\n                this.bounded = this.isBounded;\n            },\n            resizable: function () {\n                this.tryMakeResizable();\n            },\n            rowHeight: function () {\n                this.createStyle();\n                this.emitContainerResized();\n            },\n            cols: function () {\n                this.tryMakeResizable();\n                this.createStyle();\n                this.emitContainerResized();\n            },\n            containerWidth: function () {\n                this.tryMakeResizable();\n                this.createStyle();\n                this.emitContainerResized();\n            },\n            x: function (newVal) {\n                this.innerX = newVal;\n                this.createStyle();\n            },\n            y: function (newVal) {\n                this.innerY = newVal;\n                this.createStyle();\n            },\n            h: function (newVal) {\n                this.innerH = newVal\n                this.createStyle();\n                // this.emitContainerResized();\n            },\n            w: function (newVal) {\n                this.innerW = newVal;\n                this.createStyle();\n                // this.emitContainerResized();\n            },\n            renderRtl: function () {\n                // console.log(\"### renderRtl\");\n                this.tryMakeResizable();\n                this.createStyle();\n            },\n            minH: function () {\n                this.tryMakeResizable();\n            },\n            maxH: function () {\n                this.tryMakeResizable();\n            },\n            minW: function () {\n                this.tryMakeResizable();\n            },\n            maxW: function () {\n                this.tryMakeResizable();\n            },\n            \"$parent.margin\": function (margin) {\n                if (!margin || (margin[0] == this.margin[0] && margin[1] == this.margin[1])) {\n                    return;\n                }\n                this.margin = margin.map(m => Number(m));\n                this.createStyle();\n                this.emitContainerResized();\n            },\n        },\n        computed: {\n            classObj() {\n                return {\n                    'vue-resizable' : this.resizableAndNotStatic,\n                    'static': this.static,\n                    'resizing' : this.isResizing,\n                    'vue-draggable-dragging' : this.isDragging,\n                    'cssTransforms' : this.useCssTransforms,\n                    'render-rtl' : this.renderRtl,\n                    'disable-userselect': this.isDragging,\n                    'no-touch': this.isAndroid && this.draggableOrResizableAndNotStatic\n                }\n            },\n            resizableAndNotStatic(){\n                return this.resizable && !this.static;\n            },\n            draggableOrResizableAndNotStatic(){\n                return (this.draggable || this.resizable) && !this.static;\n            },\n            isAndroid() {\n                return navigator.userAgent.toLowerCase().indexOf(\"android\") !== -1;\n            },\n            renderRtl() {\n                return (this.layout.isMirrored) ? !this.rtl : this.rtl;\n            },\n            resizableHandleClass() {\n                if (this.renderRtl) {\n                    return 'vue-resizable-handle vue-rtl-resizable-handle';\n                } else {\n                    return 'vue-resizable-handle';\n                }\n            }\n        },\n        methods: {\n            createStyle: function () {\n                if (this.x + this.w > this.cols) {\n                    this.innerX = 0;\n                    this.innerW = (this.w > this.cols) ? this.cols : this.w\n                } else {\n                  this.innerX = this.x;\n                  this.innerW = this.w;\n                }\n                let pos = this.calcPosition(this.innerX, this.innerY, this.innerW, this.innerH);\n\n\n                if (this.isDragging) {\n                    pos.top = this.dragging.top;\n//                    Add rtl support\n                    if (this.renderRtl) {\n                        pos.right = this.dragging.left;\n                    } else {\n                        pos.left = this.dragging.left;\n                    }\n                }\n                if (this.isResizing) {\n                    pos.width = this.resizing.width;\n                    pos.height = this.resizing.height;\n                }\n\n                let style;\n                // CSS Transforms support (default)\n                if (this.useCssTransforms) {\n//                    Add rtl support\n                    if (this.renderRtl) {\n                        style = setTransformRtl(pos.top, pos.right, pos.width, pos.height);\n                    } else {\n                        style = setTransform(pos.top, pos.left, pos.width, pos.height);\n                    }\n\n                } else { // top,left (slow)\n//                    Add rtl support\n                    if (this.renderRtl) {\n                        style = setTopRight(pos.top, pos.right, pos.width, pos.height);\n                    } else {\n                        style = setTopLeft(pos.top, pos.left, pos.width, pos.height);\n                    }\n                }\n                this.style = style;\n            },\n            emitContainerResized() {\n                // this.style has width and height with trailing 'px'. The\n                // resized event is without them\n                let styleProps = {};\n                for (let prop of ['width', 'height']) {\n                    let val = this.style[prop];\n                    let matches = val.match(/^(\\d+)px$/);\n                    if (! matches)\n                        return;\n                    styleProps[prop] = matches[1];\n                }\n                this.$emit(\"container-resized\", this.i, this.h, this.w, styleProps.height, styleProps.width);\n            },\n            handleResize: function (event) {\n                if (this.static) return;\n                const position = getControlPosition(event);\n                // Get the current drag point from the event. This is used as the offset.\n                if (position == null) return; // not possible but satisfies flow\n                const {x, y} = position;\n\n                const newSize = {width: 0, height: 0};\n                let pos;\n                switch (event.type) {\n                    case \"resizestart\": {\n                        this.tryMakeResizable()\n                        this.previousW = this.innerW;\n                        this.previousH = this.innerH;\n                        pos = this.calcPosition(this.innerX, this.innerY, this.innerW, this.innerH);\n                        newSize.width = pos.width;\n                        newSize.height = pos.height;\n                        this.resizing = newSize;\n                        this.isResizing = true;\n                        break;\n                    }\n                    case \"resizemove\": {\n//                        console.log(\"### resize => \" + event.type + \", lastW=\" + this.lastW + \", lastH=\" + this.lastH);\n                        const coreEvent = createCoreData(this.lastW, this.lastH, x, y);\n                        if (this.renderRtl) {\n                            newSize.width = this.resizing.width - coreEvent.deltaX / this.transformScale;\n                        } else {\n                            newSize.width = this.resizing.width + coreEvent.deltaX / this.transformScale;\n                        }\n                        newSize.height = this.resizing.height + coreEvent.deltaY / this.transformScale;\n\n                        ///console.log(\"### resize => \" + event.type + \", deltaX=\" + coreEvent.deltaX + \", deltaY=\" + coreEvent.deltaY);\n                        this.resizing = newSize;\n                        break;\n                    }\n                    case \"resizeend\": {\n                        //console.log(\"### resize end => x=\" +this.innerX + \" y=\" + this.innerY + \" w=\" + this.innerW + \" h=\" + this.innerH);\n                        pos = this.calcPosition(this.innerX, this.innerY, this.innerW, this.innerH);\n                        newSize.width = pos.width;\n                        newSize.height = pos.height;\n//                        console.log(\"### resize end => \" + JSON.stringify(newSize));\n                        this.resizing = null;\n                        this.isResizing = false;\n                        break;\n                    }\n                }\n\n                // Get new WH\n                pos = this.calcWH(newSize.height, newSize.width);\n                if (pos.w < this.minW) {\n                    pos.w = this.minW;\n                }\n                if (pos.w > this.maxW) {\n                    pos.w = this.maxW;\n                }\n                if (pos.h < this.minH) {\n                    pos.h = this.minH;\n                }\n                if (pos.h > this.maxH) {\n                    pos.h = this.maxH;\n                }\n\n                if (pos.h < 1) {\n                    pos.h = 1;\n                }\n                if (pos.w < 1) {\n                    pos.w = 1;\n                }\n\n                this.lastW = x;\n                this.lastH = y;\n\n                if (this.innerW !== pos.w || this.innerH !== pos.h) {\n                    this.$emit(\"resize\", this.i, pos.h, pos.w, newSize.height, newSize.width);\n                }\n                if (event.type === \"resizeend\" && (this.previousW !== this.innerW || this.previousH !== this.innerH)) {\n                    this.$emit(\"resized\", this.i, pos.h, pos.w, newSize.height, newSize.width);\n                }\n                this.eventBus.$emit(\"resizeEvent\", event.type, this.i, this.innerX, this.innerY, pos.h, pos.w);\n            },\n            handleDrag(event) {\n                if (this.static) return;\n                if (this.isResizing) return;\n\n                const position = getControlPosition(event);\n\n                // Get the current drag point from the event. This is used as the offset.\n                if (position === null) return; // not possible but satisfies flow\n                const {x, y} = position;\n\n                // let shouldUpdate = false;\n                let newPosition = {top: 0, left: 0};\n                switch (event.type) {\n                    case \"dragstart\": {\n                        this.previousX = this.innerX;\n                        this.previousY = this.innerY;\n\n                        let parentRect = event.target.offsetParent.getBoundingClientRect();\n                        let clientRect = event.target.getBoundingClientRect();\n\n                        const cLeft = clientRect.left / this.transformScale;\n                        const pLeft = parentRect.left / this.transformScale;\n                        const cRight = clientRect.right / this.transformScale;\n                        const pRight = parentRect.right / this.transformScale;\n                        const cTop = clientRect.top / this.transformScale;\n                        const pTop = parentRect.top / this.transformScale;\n\n                        if (this.renderRtl) {\n                          newPosition.left = (cRight - pRight) * -1;\n                        } else {\n                          newPosition.left = cLeft - pLeft;\n                        }\n                        newPosition.top = cTop - pTop;\n                        this.dragging = newPosition;\n                        this.isDragging = true;\n                        break;\n                    }\n                    case \"dragend\": {\n                        if (!this.isDragging) return;\n                        let parentRect = event.target.offsetParent.getBoundingClientRect();\n                        let clientRect = event.target.getBoundingClientRect();\n\n                        const cLeft = clientRect.left / this.transformScale;\n                        const pLeft = parentRect.left / this.transformScale;\n                        const cRight = clientRect.right / this.transformScale;\n                        const pRight = parentRect.right / this.transformScale;\n                        const cTop = clientRect.top / this.transformScale;\n                        const pTop = parentRect.top / this.transformScale;\n\n//                        Add rtl support\n                        if (this.renderRtl) {\n                            newPosition.left = (cRight - pRight) * -1;\n                        } else {\n                            newPosition.left = cLeft - pLeft;\n                        }\n                        newPosition.top = cTop - pTop;\n//                        console.log(\"### drag end => \" + JSON.stringify(newPosition));\n//                        console.log(\"### DROP: \" + JSON.stringify(newPosition));\n                        this.dragging = null;\n                        this.isDragging = false;\n                        // shouldUpdate = true;\n                        break;\n                    }\n                    case \"dragmove\": {\n                        const coreEvent = createCoreData(this.lastX, this.lastY, x, y);\n//                        Add rtl support\n                        if (this.renderRtl) {\n                            newPosition.left = this.dragging.left - coreEvent.deltaX / this.transformScale;\n                        } else {\n                            newPosition.left = this.dragging.left + coreEvent.deltaX / this.transformScale;\n                        }\n                        newPosition.top = this.dragging.top + coreEvent.deltaY / this.transformScale;\n                        if(this.bounded){\n                            const bottomBoundary = event.target.offsetParent.clientHeight - this.calcGridItemWHPx(this.h, this.rowHeight, this.margin[1]);\n                            newPosition.top = this.clamp(newPosition.top, 0, bottomBoundary);\n                            const colWidth = this.calcColWidth();\n                            const rightBoundary = this.containerWidth - this.calcGridItemWHPx(this.w, colWidth, this.margin[0]);\n                            newPosition.left = this.clamp(newPosition.left, 0, rightBoundary);\n                        }\n//                        console.log(\"### drag => \" + event.type + \", x=\" + x + \", y=\" + y);\n//                        console.log(\"### drag => \" + event.type + \", deltaX=\" + coreEvent.deltaX + \", deltaY=\" + coreEvent.deltaY);\n//                        console.log(\"### drag end => \" + JSON.stringify(newPosition));\n                        this.dragging = newPosition;\n                        break;\n                    }\n                }\n\n                // Get new XY\n                let pos;\n                if (this.renderRtl) {\n                    pos = this.calcXY(newPosition.top, newPosition.left);\n                } else {\n                    pos = this.calcXY(newPosition.top, newPosition.left);\n                }\n\n                this.lastX = x;\n                this.lastY = y;\n\n                if (this.innerX !== pos.x || this.innerY !== pos.y) {\n                    this.$emit(\"move\", this.i, pos.x, pos.y);\n                }\n                if (event.type === \"dragend\" && (this.previousX !== this.innerX || this.previousY !== this.innerY)) {\n                    this.$emit(\"moved\", this.i, pos.x, pos.y);\n                }\n                this.eventBus.$emit(\"dragEvent\", event.type, this.i, pos.x, pos.y, this.innerH, this.innerW);\n            },\n            calcPosition: function (x, y, w, h) {\n                const colWidth = this.calcColWidth();\n                // add rtl support\n                let out;\n                if (this.renderRtl) {\n                    out = {\n                        right: Math.round(colWidth * x + (x + 1) * this.margin[0]),\n                        top: Math.round(this.rowHeight * y + (y + 1) * this.margin[1]),\n                        // 0 * Infinity === NaN, which causes problems with resize constriants;\n                        // Fix this if it occurs.\n                        // Note we do it here rather than later because Math.round(Infinity) causes deopt\n                        width: w === Infinity ? w : Math.round(colWidth * w + Math.max(0, w - 1) * this.margin[0]),\n                        height: h === Infinity ? h : Math.round(this.rowHeight * h + Math.max(0, h - 1) * this.margin[1])\n                    };\n                } else {\n                    out = {\n                        left: Math.round(colWidth * x + (x + 1) * this.margin[0]),\n                        top: Math.round(this.rowHeight * y + (y + 1) * this.margin[1]),\n                        // 0 * Infinity === NaN, which causes problems with resize constriants;\n                        // Fix this if it occurs.\n                        // Note we do it here rather than later because Math.round(Infinity) causes deopt\n                        width: w === Infinity ? w : Math.round(colWidth * w + Math.max(0, w - 1) * this.margin[0]),\n                        height: h === Infinity ? h : Math.round(this.rowHeight * h + Math.max(0, h - 1) * this.margin[1])\n                    };\n                }\n\n\n                return out;\n            },\n            /**\n             * Translate x and y coordinates from pixels to grid units.\n             * @param  {Number} top  Top position (relative to parent) in pixels.\n             * @param  {Number} left Left position (relative to parent) in pixels.\n             * @return {Object} x and y in grid units.\n             */\n            // TODO check if this function needs change in order to support rtl.\n            calcXY(top, left) {\n                const colWidth = this.calcColWidth();\n\n                // left = colWidth * x + margin * (x + 1)\n                // l = cx + m(x+1)\n                // l = cx + mx + m\n                // l - m = cx + mx\n                // l - m = x(c + m)\n                // (l - m) / (c + m) = x\n                // x = (left - margin) / (coldWidth + margin)\n                let x = Math.round((left - this.margin[0]) / (colWidth + this.margin[0]));\n                let y = Math.round((top - this.margin[1]) / (this.rowHeight + this.margin[1]));\n\n                // Capping\n                x = Math.max(Math.min(x, this.cols - this.innerW), 0);\n                y = Math.max(Math.min(y, this.maxRows - this.innerH), 0);\n\n                return {x, y};\n            },\n            // Helper for generating column width\n            calcColWidth() {\n                const colWidth = (this.containerWidth - (this.margin[0] * (this.cols + 1))) / this.cols;\n               // console.log(\"### COLS=\" + this.cols + \" COL WIDTH=\" + colWidth + \" MARGIN \" + this.margin[0]);\n                return colWidth;\n            },\n            // This can either be called:\n            // calcGridItemWHPx(w, colWidth, margin[0])\n            // or\n            // calcGridItemWHPx(h, rowHeight, margin[1])\n            calcGridItemWHPx(gridUnits,colOrRowSize,marginPx) {\n                // 0 * Infinity === NaN, which causes problems with resize contraints\n                if (!Number.isFinite(gridUnits)) return gridUnits;\n                return Math.round(\n                    colOrRowSize * gridUnits + Math.max(0, gridUnits - 1) * marginPx\n                );\n            },\n\n            // Similar to _.clamp\n            clamp(num, lowerBound, upperBound) {\n                return Math.max(Math.min(num, upperBound), lowerBound);\n            },\n\n            /**\n             * Given a height and width in pixel values, calculate grid units.\n             * @param  {Number} height Height in pixels.\n             * @param  {Number} width  Width in pixels.\n             * @param  {Boolean} autoSizeFlag  function autoSize identifier.\n             * @return {Object} w, h as grid units.\n             */\n            calcWH(height, width, autoSizeFlag = false) {\n                const colWidth = this.calcColWidth();\n\n                // width = colWidth * w - (margin * (w - 1))\n                // ...\n                // w = (width + margin) / (colWidth + margin)\n                let w = Math.round((width + this.margin[0]) / (colWidth + this.margin[0]));\n                let h = 0;\n                if (!autoSizeFlag) {\n                    h = Math.round((height + this.margin[1]) / (this.rowHeight + this.margin[1]));\n                } else {\n                    h = Math.ceil((height + this.margin[1]) / (this.rowHeight + this.margin[1]));\n                }\n\n                // Capping\n                w = Math.max(Math.min(w, this.cols - this.innerX), 0);\n                h = Math.max(Math.min(h, this.maxRows - this.innerY), 0);\n                return {w, h};\n            },\n            updateWidth: function (width, colNum) {\n                this.containerWidth = width;\n                if (colNum !== undefined && colNum !== null) {\n                    this.cols = colNum;\n                }\n            },\n            compact: function () {\n                this.createStyle();\n            },\n            tryMakeDraggable: function(){\n                const self = this;\n                if (this.interactObj === null || this.interactObj === undefined) {\n                    this.interactObj = interact(this.$refs.item);\n                    if (!this.useStyleCursor) {\n                        this.interactObj.styleCursor(false);\n                    }\n                }\n                if (this.draggable && !this.static) {\n                    const opts = {\n                        ignoreFrom: this.dragIgnoreFrom,\n                        allowFrom: this.dragAllowFrom,\n                        ...this.dragOption\n                    };\n                    this.interactObj.draggable(opts);\n                    /*this.interactObj.draggable({allowFrom: '.vue-draggable-handle'});*/\n                    if (!this.dragEventSet) {\n                        this.dragEventSet = true;\n                        this.interactObj.on('dragstart dragmove dragend', function (event) {\n                            self.handleDrag(event);\n                        });\n                    }\n                } else {\n                    this.interactObj.draggable({\n                        enabled: false\n                    });\n                }\n            },\n            tryMakeResizable: function(){\n                const self = this;\n                if (this.interactObj === null || this.interactObj === undefined) {\n                    this.interactObj = interact(this.$refs.item);\n                    if (!this.useStyleCursor) {\n                        this.interactObj.styleCursor(false);\n                    }\n                }\n                if (this.resizable && !this.static) {\n                    let maximum = this.calcPosition(0,0, this.maxW, this.maxH);\n                    let minimum = this.calcPosition(0,0, this.minW, this.minH);\n\n                    // console.log(\"### MAX \" + JSON.stringify(maximum));\n                    // console.log(\"### MIN \" + JSON.stringify(minimum));\n\n                    const opts = {\n                        // allowFrom: \".\" + this.resizableHandleClass.trim().replace(\" \", \".\"),\n                        edges: {\n                            left: false,\n                            right: \".\" + this.resizableHandleClass.trim().replace(\" \", \".\"),\n                            bottom: \".\" + this.resizableHandleClass.trim().replace(\" \", \".\"),\n                            top: false\n                        },\n                        ignoreFrom: this.resizeIgnoreFrom,\n                        restrictSize: {\n                            min: {\n                                height: minimum.height * this.transformScale,\n                                width: minimum.width * this.transformScale\n                            },\n                            max: {\n                                height: maximum.height * this.transformScale,\n                                width: maximum.width * this.transformScale\n                            }\n                        },\n                        ...this.resizeOption,\n                    };\n\n                    if (this.preserveAspectRatio) {\n                        opts.modifiers = [\n                            interact.modifiers.aspectRatio({\n                                ratio: 'preserve'\n                            }),\n                        ]\n                    }\n\n                    this.interactObj.resizable(opts);\n                    if (!this.resizeEventSet) {\n                        this.resizeEventSet = true;\n                        this.interactObj\n                            .on('resizestart resizemove resizeend', function (event) {\n                                self.handleResize(event);\n                            });\n                    }\n                } else {\n                    this.interactObj.resizable({\n                        enabled: false\n                    });\n                }\n            },\n            autoSize: function() {\n                // ok here we want to calculate if a resize is needed\n                this.previousW = this.innerW;\n                this.previousH = this.innerH;\n\n                let newSize=this.$slots.default[0].elm.getBoundingClientRect();\n                let pos = this.calcWH(newSize.height, newSize.width, true);\n                if (pos.w < this.minW) {\n                    pos.w = this.minW;\n                }\n                if (pos.w > this.maxW) {\n                    pos.w = this.maxW;\n                }\n                if (pos.h < this.minH) {\n                    pos.h = this.minH;\n                }\n                if (pos.h > this.maxH) {\n                    pos.h = this.maxH;\n                }\n\n                if (pos.h < 1) {\n                    pos.h = 1;\n                }\n                if (pos.w < 1) {\n                    pos.w = 1;\n                }\n\n                // this.lastW = x; // basically, this is copied from resizehandler, but shouldn't be needed\n                // this.lastH = y;\n\n                if (this.innerW !== pos.w || this.innerH !== pos.h) {\n                    this.$emit(\"resize\", this.i, pos.h, pos.w, newSize.height, newSize.width);\n                }\n                if (this.previousW !== pos.w || this.previousH !== pos.h) {\n                    this.$emit(\"resized\", this.i, pos.h, pos.w, newSize.height, newSize.width);\n                    this.eventBus.$emit(\"resizeEvent\", \"resizeend\", this.i, this.innerX, this.innerY, pos.h, pos.w);\n                }\n            }\n        },\n    }\n</script>\n"
  },
  {
    "path": "src/components/GridLayout.vue",
    "content": "<template>\n    <div ref=\"item\" class=\"vue-grid-layout\" :style=\"mergedStyle\">\n        <slot></slot>\n        <grid-item class=\"vue-grid-placeholder\"\n                   v-show=\"isDragging\"\n                   :x=\"placeholder.x\"\n                   :y=\"placeholder.y\"\n                   :w=\"placeholder.w\"\n                   :h=\"placeholder.h\"\n                   :i=\"placeholder.i\"></grid-item>\n    </div>\n</template>\n<style>\n    .vue-grid-layout {\n        position: relative;\n        transition: height 200ms ease;\n    }\n</style>\n<script>\n    import Vue from 'vue';\n    const elementResizeDetectorMaker = require(\"element-resize-detector\");\n\n    import {bottom, compact, getLayoutItem, moveElement, validateLayout, cloneLayout, getAllCollisions} from '@/helpers/utils';\n    import {getBreakpointFromWidth, getColsFromBreakpoint, findOrGenerateResponsiveLayout} from \"@/helpers/responsiveUtils\";\n    //var eventBus = require('./eventBus');\n\n    import GridItem from './GridItem.vue'\n    import {addWindowEventListener, removeWindowEventListener} from \"@/helpers/DOM\";\n\n    export default {\n        name: \"GridLayout\",\n        provide() {\n            return {\n                eventBus: null,\n                layout: this\n            }\n        },\n        components: {\n            GridItem,\n        },\n        props: {\n            // If true, the container height swells and contracts to fit contents\n            autoSize: {\n                type: Boolean,\n                default: true\n            },\n            colNum: {\n                type: Number,\n                default: 12\n            },\n            rowHeight: {\n                type: Number,\n                default: 150\n            },\n            maxRows: {\n                type: Number,\n                default: Infinity\n            },\n            margin: {\n                type: Array,\n                default: function () {\n                    return [10, 10];\n                }\n            },\n            isDraggable: {\n                type: Boolean,\n                default: true\n            },\n            isResizable: {\n                type: Boolean,\n                default: true\n            },\n            isMirrored: {\n                type: Boolean,\n                default: false\n            },\n            isBounded: {\n                type: Boolean,\n                default: false\n            },\n            useCssTransforms: {\n                type: Boolean,\n                default: true\n            },\n            verticalCompact: {\n                type: Boolean,\n                default: true\n            },\n            restoreOnDrag: {\n                type: Boolean,\n                default: false\n            },\n            layout: {\n                type: Array,\n                required: true,\n            },\n            responsive: {\n                type: Boolean,\n                default: false\n            },\n            responsiveLayouts: {\n                type: Object,\n                default: function() {\n                    return {};\n                }\n            },\n            transformScale: {\n                type: Number,\n                default: 1\n            },\n            breakpoints:{\n                type: Object,\n                default: function(){return{ lg: 1200, md: 996, sm: 768, xs: 480, xxs: 0 }}\n            },\n            cols:{\n                type: Object,\n                default: function(){return{ lg: 12, md: 10, sm: 6, xs: 4, xxs: 2 }},\n            },\n            preventCollision: {\n                type: Boolean,\n                default: false\n            },\n            useStyleCursor: {\n                type: Boolean,\n                default: true\n            }\n        },\n        data: function () {\n            return {\n                width: null,\n                mergedStyle: {},\n                lastLayoutLength: 0,\n                isDragging: false,\n                placeholder: {\n                    x: 0,\n                    y: 0,\n                    w: 0,\n                    h: 0,\n                    i: -1\n                },\n                layouts: {}, // array to store all layouts from different breakpoints\n                lastBreakpoint: null, // store last active breakpoint\n                originalLayout: null, // store original Layout\n            };\n        },\n        created () {\n            const self = this;\n\n            // Accessible refernces of functions for removing in beforeDestroy\n            self.resizeEventHandler = function(eventType, i, x, y, h, w) {\n                self.resizeEvent(eventType, i, x, y, h, w);\n            };\n\n            self.dragEventHandler = function(eventType, i, x, y, h, w) {\n                self.dragEvent(eventType, i, x, y, h, w);\n            };\n\n            self._provided.eventBus = new Vue();\n            self.eventBus = self._provided.eventBus;\n            self.eventBus.$on('resizeEvent', self.resizeEventHandler);\n            self.eventBus.$on('dragEvent', self.dragEventHandler);\n            self.$emit('layout-created', self.layout);\n        },\n        beforeDestroy: function(){\n            //Remove listeners\n            this.eventBus.$off('resizeEvent', this.resizeEventHandler);\n            this.eventBus.$off('dragEvent', this.dragEventHandler);\n\t\t\tthis.eventBus.$destroy();\n            removeWindowEventListener(\"resize\", this.onWindowResize);\n            if (this.erd) {\n                this.erd.uninstall(this.$refs.item);\n            }\n        },\n        beforeMount: function() {\n            this.$emit('layout-before-mount', this.layout);\n        },\n        mounted: function() {\n            this.$emit('layout-mounted', this.layout);\n            this.$nextTick(function () {\n                validateLayout(this.layout);\n\n                this.originalLayout = this.layout;\n                const self = this;\n                this.$nextTick(function() {\n                    self.initResponsiveFeatures();\n\n                    self.onWindowResize();\n\n\n                    //self.width = self.$el.offsetWidth;\n                    addWindowEventListener('resize', self.onWindowResize);\n\n                    compact(self.layout, self.verticalCompact);\n\n                    self.$emit('layout-updated',self.layout)\n\n                    self.updateHeight();\n                    self.$nextTick(function () {\n                        this.erd = elementResizeDetectorMaker({\n                            strategy: \"scroll\", //<- For ultra performance.\n                            // See https://github.com/wnr/element-resize-detector/issues/110 about callOnAdd.\n                            callOnAdd: false,\n                        });\n                        this.erd.listenTo(self.$refs.item, function () {\n                            self.onWindowResize();\n                        });\n                    });\n                });\n            });\n        },\n        watch: {\n            width: function (newval, oldval) {\n                const self = this;\n                this.$nextTick(function () {\n                    //this.$broadcast(\"updateWidth\", this.width);\n                    this.eventBus.$emit(\"updateWidth\", this.width);\n                    if (oldval === null) {\n                        /*\n                            If oldval == null is when the width has never been\n                            set before. That only occurs when mouting is\n                            finished, and onWindowResize has been called and\n                            this.width has been changed the first time after it\n                            got set to null in the constructor. It is now time\n                            to issue layout-ready events as the GridItems have\n                            their sizes configured properly.\n\n                            The reason for emitting the layout-ready events on\n                            the next tick is to allow for the newly-emitted\n                            updateWidth event (above) to have reached the\n                            children GridItem-s and had their effect, so we're\n                            sure that they have the final size before we emit\n                            layout-ready (for this GridLayout) and\n                            item-layout-ready (for the GridItem-s).\n\n                            This way any client event handlers can reliably\n                            invistigate stable sizes of GridItem-s.\n                        */\n                        this.$nextTick(() => {\n                            this.$emit('layout-ready', self.layout);\n                        });\n                    }\n                    this.updateHeight();\n                });\n            },\n            layout: function () {\n                this.layoutUpdate();\n            },\n            colNum: function (val) {\n                this.eventBus.$emit(\"setColNum\", val);\n            },\n            rowHeight: function() {\n                this.eventBus.$emit(\"setRowHeight\", this.rowHeight);\n            },\n            isDraggable: function() {\n                this.eventBus.$emit(\"setDraggable\", this.isDraggable);\n            },\n            isResizable: function() {\n                this.eventBus.$emit(\"setResizable\", this.isResizable);\n            },\n            isBounded: function() {\n                this.eventBus.$emit(\"setBounded\", this.isBounded);\n            },\n            transformScale: function() {\n                this.eventBus.$emit(\"setTransformScale\", this.transformScale);\n            },\n            responsive() {\n                if (!this.responsive) {\n                    this.$emit('update:layout', this.originalLayout);\n                    this.eventBus.$emit(\"setColNum\", this.colNum);\n                }\n                this.onWindowResize();\n            },\n            maxRows: function() {\n                this.eventBus.$emit(\"setMaxRows\", this.maxRows);\n            },\n            margin() {\n                this.updateHeight();\n            }\n        },\n        methods: {\n            layoutUpdate() {\n                if (this.layout !== undefined && this.originalLayout !== null) {\n                    if (this.layout.length !== this.originalLayout.length) {\n                        // console.log(\"### LAYOUT UPDATE!\", this.layout.length, this.originalLayout.length);\n\n                        let diff = this.findDifference(this.layout, this.originalLayout);\n                        if (diff.length > 0){\n                            // console.log(diff);\n                            if (this.layout.length > this.originalLayout.length) {\n                                this.originalLayout = this.originalLayout.concat(diff);\n                            } else {\n                                this.originalLayout = this.originalLayout.filter(obj => {\n                                    return !diff.some(obj2 => {\n                                        return obj.i === obj2.i;\n                                    });\n                                });\n                            }\n                        }\n\n                        this.lastLayoutLength = this.layout.length;\n                        this.initResponsiveFeatures();\n                    }\n\n                    compact(this.layout, this.verticalCompact);\n                    this.eventBus.$emit(\"updateWidth\", this.width);\n                    this.updateHeight();\n\n                    this.$emit('layout-updated',this.layout)\n                }\n            },\n            updateHeight: function () {\n                this.mergedStyle = {\n                    height: this.containerHeight()\n                };\n            },\n            onWindowResize: function () {\n                if (this.$refs !== null && this.$refs.item !== null && this.$refs.item !== undefined) {\n                    this.width = this.$refs.item.offsetWidth;\n                }\n                this.eventBus.$emit(\"resizeEvent\");\n            },\n            containerHeight: function () {\n                if (!this.autoSize) return;\n                // console.log(\"bottom: \" + bottom(this.layout))\n                // console.log(\"rowHeight + margins: \" + (this.rowHeight + this.margin[1]) + this.margin[1])\n                const containerHeight =  bottom(this.layout) * (this.rowHeight + this.margin[1]) + this.margin[1] + 'px';\n                return containerHeight;\n            },\n            dragEvent: function (eventName, id, x, y, h, w) {\n                //console.log(eventName + \" id=\" + id + \", x=\" + x + \", y=\" + y);\n                let l = getLayoutItem(this.layout, id);\n                //GetLayoutItem sometimes returns null object\n                if (l === undefined || l === null){\n                    l = {x:0, y:0}\n                }\n\n                if (eventName === \"dragstart\" && !this.verticalCompact) {\n                    this.positionsBeforeDrag = this.layout.reduce((result, {i, x, y}) => ({\n                        ...result,\n                        [i]: {x, y}\n                    }), {});\n                }\n\n                if (eventName === \"dragmove\" || eventName === \"dragstart\") {\n                    this.placeholder.i = id;\n                    this.placeholder.x = l.x;\n                    this.placeholder.y = l.y;\n                    this.placeholder.w = w;\n                    this.placeholder.h = h;\n                    this.$nextTick(function() {\n                        this.isDragging = true;\n                    });\n                    //this.$broadcast(\"updateWidth\", this.width);\n                    this.eventBus.$emit(\"updateWidth\", this.width);\n                } else {\n                    this.$nextTick(function() {\n                        this.isDragging = false;\n                    });\n                }\n\n                // Move the element to the dragged location.\n                this.layout = moveElement(this.layout, l, x, y, true, this.preventCollision);\n\n                if (this.restoreOnDrag) {\n                    // Do not compact items more than in layout before drag\n                    // Set moved item as static to avoid to compact it\n                    l.static = true;\n                    compact(this.layout, this.verticalCompact, this.positionsBeforeDrag);\n                    l.static = false;\n                } else {\n                    compact(this.layout, this.verticalCompact);\n                }\n\n                // needed because vue can't detect changes on array element properties\n                this.eventBus.$emit(\"compact\");\n                this.updateHeight();\n                if (eventName === 'dragend') {\n                    delete this.positionsBeforeDrag;\n                    this.$emit('layout-updated', this.layout);\n                }\n            },\n            resizeEvent: function (eventName, id, x, y, h, w) {\n                let l = getLayoutItem(this.layout, id);\n                //GetLayoutItem sometimes return null object\n                if (l === undefined || l === null){\n                    l = {h:0, w:0}\n                }\n\n                let hasCollisions;\n                if (this.preventCollision) {\n                    const collisions = getAllCollisions(this.layout, { ...l, w, h }).filter(\n                        layoutItem => layoutItem.i !== l.i\n                    );\n                    hasCollisions = collisions.length > 0;\n\n                    // If we're colliding, we need adjust the placeholder.\n                    if (hasCollisions) {\n                        // adjust w && h to maximum allowed space\n                        let leastX = Infinity,\n                        leastY = Infinity;\n                        collisions.forEach(layoutItem => {\n                        if (layoutItem.x > l.x) leastX = Math.min(leastX, layoutItem.x);\n                        if (layoutItem.y > l.y) leastY = Math.min(leastY, layoutItem.y);\n                        });\n\n                        if (Number.isFinite(leastX)) l.w = leastX - l.x;\n                        if (Number.isFinite(leastY)) l.h = leastY - l.y;\n                    }\n                }\n\n                if (!hasCollisions) {\n                    // Set new width and height.\n                    l.w = w;\n                    l.h = h;\n                }\n\n                if (eventName === \"resizestart\" || eventName === \"resizemove\") {\n                    this.placeholder.i = id;\n                    this.placeholder.x = x;\n                    this.placeholder.y = y;\n                    this.placeholder.w = l.w;\n                    this.placeholder.h = l.h;\n                    this.$nextTick(function() {\n                        this.isDragging = true;\n                    });\n                    //this.$broadcast(\"updateWidth\", this.width);\n                    this.eventBus.$emit(\"updateWidth\", this.width);\n\n                } else {\n                    this.$nextTick(function() {\n                        this.isDragging = false;\n                    });\n                }\n\n                if (this.responsive) this.responsiveGridLayout();\n\n                compact(this.layout, this.verticalCompact);\n                this.eventBus.$emit(\"compact\");\n                this.updateHeight();\n\n                if (eventName === 'resizeend') this.$emit('layout-updated', this.layout);\n            },\n\n            // finds or generates new layouts for set breakpoints\n            responsiveGridLayout(){\n                let newBreakpoint = getBreakpointFromWidth(this.breakpoints, this.width);\n                let newCols = getColsFromBreakpoint(newBreakpoint, this.cols);\n\n                // save actual layout in layouts\n                if(this.lastBreakpoint != null && !this.layouts[this.lastBreakpoint])\n                    this.layouts[this.lastBreakpoint] = cloneLayout(this.layout);\n\n                // Find or generate a new layout.\n                let layout = findOrGenerateResponsiveLayout(\n                    this.originalLayout,\n                    this.layouts,\n                    this.breakpoints,\n                    newBreakpoint,\n                    this.lastBreakpoint,\n                    newCols,\n                    this.verticalCompact\n                );\n\n                // Store the new layout.\n                this.layouts[newBreakpoint] = layout;\n\n                if (this.lastBreakpoint !== newBreakpoint) {\n                    this.$emit('breakpoint-changed', newBreakpoint, layout);\n                }\n\n                // new prop sync\n                this.$emit('update:layout', layout);\n\n                this.lastBreakpoint = newBreakpoint;\n                this.eventBus.$emit(\"setColNum\", getColsFromBreakpoint(newBreakpoint, this.cols));\n            },\n\n            // clear all responsive layouts\n            initResponsiveFeatures(){\n                // clear layouts\n                this.layouts = Object.assign({}, this.responsiveLayouts);\n            },\n\n            // find difference in layouts\n            findDifference(layout, originalLayout){\n\n                //Find values that are in result1 but not in result2\n                let uniqueResultOne = layout.filter(function(obj) {\n                    return !originalLayout.some(function(obj2) {\n                        return obj.i === obj2.i;\n                    });\n                });\n\n                //Find values that are in result2 but not in result1\n                let uniqueResultTwo = originalLayout.filter(function(obj) {\n                    return !layout.some(function(obj2) {\n                        return obj.i === obj2.i;\n                    });\n                });\n\n                //Combine the two arrays of unique entries#\n                return uniqueResultOne.concat(uniqueResultTwo);\n            }\n        },\n    }\n</script>\n"
  },
  {
    "path": "src/components/TestElement.vue",
    "content": "<template>\n    <div>\n        <span class=\"text\">\n            {{text}}\n        </span>\n        <span class=\"remove\" @click=\"$emit('removeItem', text)\">x</span>\n    </div>\n</template>\n<style>\n.remove {\n    position: absolute;\n    right: 2px;\n    top: 0;\n    cursor: pointer;\n}\n</style>\n<script>\n    export default {\n        name: \"TestElement\",\n        props: {\n            text : {\n                type: String,\n                default: \"x\",\n            },\n        },\n        data: function() {\n            return {\n            }\n        },\n        mounted: function() {\n            console.log(\"### \" + this.text + \" ready!\");\n        },\n    }\n</script>\n"
  },
  {
    "path": "src/components/index.js",
    "content": "import GridItem from './GridItem.vue';\nimport GridLayout from './GridLayout.vue';\n// import ResponsiveGridLayout from './ResponsiveGridLayout.vue';\n\nconst VueGridLayout = {\n    // ResponsiveGridLayout,\n    GridLayout,\n    GridItem\n}\n\nexport function install(Vue) {\n    if (install.installed) return;\n    install.installed = true;\n    Object.keys(VueGridLayout).forEach(name => {\n        Vue.component(name, VueGridLayout[name]);\n    });\n}\n\nconst plugin = {\n    install,\n};\n\nlet GlobalVue = null;\nif (typeof window !== 'undefined') {\n    GlobalVue = window.Vue;\n} else if (typeof global !== 'undefined') {\n    GlobalVue = global.Vue;\n}\nif (GlobalVue) {\n    GlobalVue.use(plugin);\n}\n\nexport default VueGridLayout;\nexport { GridLayout, GridItem };\n"
  },
  {
    "path": "src/helpers/DOM.js",
    "content": "let currentDir: \"ltr\" | \"rtl\" | \"auto\"  = \"auto\";\n// let currentDir = \"auto\";\n\nfunction hasDocument(){\n    return (typeof document !== \"undefined\");\n}\n\nfunction hasWindow(){\n    return (typeof window !== \"undefined\");\n}\n\nexport function getDocumentDir(){\n    if(!hasDocument()){\n        return currentDir;\n    }\n    const direction = (typeof document.dir !== \"undefined\") ?\n        document.dir :\n        document.getElementsByTagName(\"html\")[0].getAttribute(\"dir\");\n    return direction;\n}\n\nexport function setDocumentDir(dir: \"ltr\" | \"rtl\" | \"auto\"){\n// export function setDocumentDir(dir){\n    if(!hasDocument){\n        currentDir = dir;\n        return;\n    }\n\n    const html = document.getElementsByTagName(\"html\")[0];\n    html.setAttribute(\"dir\", dir);\n}\n\nexport function addWindowEventListener(event:string, callback: () => mixed){\n    if(!hasWindow){\n\n        callback();\n        return;\n    }\n    window.addEventListener(event, callback);\n}\n\nexport function removeWindowEventListener(event:string, callback: () => mixed){\n    if(!hasWindow){\n        return;\n    }\n    window.removeEventListener(event, callback);\n}\n\n\n\n"
  },
  {
    "path": "src/helpers/draggableUtils.js",
    "content": "// Get {x, y} positions from event.\nexport function getControlPosition(e) {\n    return offsetXYFromParentOf(e);\n}\n\n\n// Get from offsetParent\nexport function offsetXYFromParentOf(evt) {\n    const offsetParent = evt.target.offsetParent || document.body;\n    const offsetParentRect = evt.offsetParent === document.body ? {left: 0, top: 0} : offsetParent.getBoundingClientRect();\n\n    const x = evt.clientX + offsetParent.scrollLeft - offsetParentRect.left;\n    const y = evt.clientY + offsetParent.scrollTop - offsetParentRect.top;\n\n    /*const x = Math.round(evt.clientX + offsetParent.scrollLeft - offsetParentRect.left);\n    const y = Math.round(evt.clientY + offsetParent.scrollTop - offsetParentRect.top);*/\n\n\n    return {x, y};\n}\n\n\n// Create an data object exposed by <DraggableCore>'s events\nexport function createCoreData(lastX, lastY, x, y) {\n    // State changes are often (but not always!) async. We want the latest value.\n    const isStart = !isNum(lastX);\n\n    if (isStart) {\n        // If this is our first move, use the x and y as last coords.\n        return {\n            deltaX: 0, deltaY: 0,\n            lastX: x, lastY: y,\n            x: x, y: y\n        };\n    } else {\n        // Otherwise calculate proper values.\n        return {\n            deltaX: x - lastX, deltaY: y - lastY,\n            lastX: lastX, lastY: lastY,\n            x: x, y: y\n        };\n    }\n}\n\n\nfunction isNum(num)  {\n    return typeof num === 'number' && !isNaN(num);\n}\n\n"
  },
  {
    "path": "src/helpers/responsiveUtils.js",
    "content": "// @flow\n\nimport {cloneLayout, compact, correctBounds} from './utils';\n\nimport type {Layout} from './utils';\nexport type ResponsiveLayout = {lg?: Layout, md?: Layout, sm?: Layout, xs?: Layout, xxs?: Layout};\ntype Breakpoint = string;\ntype Breakpoints = {lg?: number, md?: number, sm?: number, xs?: number, xxs?: number};\n\n/**\n * Given a width, find the highest breakpoint that matches is valid for it (width > breakpoint).\n *\n * @param  {Object} breakpoints Breakpoints object (e.g. {lg: 1200, md: 960, ...})\n * @param  {Number} width Screen width.\n * @return {String}       Highest breakpoint that is less than width.\n */\nexport function getBreakpointFromWidth(breakpoints: Breakpoints, width: number): Breakpoint {\n  const sorted = sortBreakpoints(breakpoints);\n  let matching = sorted[0];\n  for (let i = 1, len = sorted.length; i < len; i++) {\n    const breakpointName = sorted[i];\n    if (width > breakpoints[breakpointName]) matching = breakpointName;\n  }\n  return matching;\n}\n\n\n/**\n * Given a breakpoint, get the # of cols set for it.\n * @param  {String} breakpoint Breakpoint name.\n * @param  {Object} cols       Map of breakpoints to cols.\n * @return {Number}            Number of cols.\n */\nexport function getColsFromBreakpoint(breakpoint: Breakpoint, cols: Breakpoints): number {\n  if (!cols[breakpoint]) {\n    throw new Error(\"ResponsiveGridLayout: `cols` entry for breakpoint \" + breakpoint + \" is missing!\");\n  }\n  return cols[breakpoint];\n}\n\n/**\n * Given existing layouts and a new breakpoint, find or generate a new layout.\n *\n * This finds the layout above the new one and generates from it, if it exists.\n *\n * @param  {Array} orgLayout     Original layout.\n * @param  {Object} layouts     Existing layouts.\n * @param  {Array} breakpoints All breakpoints.\n * @param  {String} breakpoint New breakpoint.\n * @param  {String} breakpoint Last breakpoint (for fallback).\n * @param  {Number} cols       Column count at new breakpoint.\n * @param  {Boolean} verticalCompact Whether or not to compact the layout\n *   vertically.\n * @return {Array}             New layout.\n */\nexport function findOrGenerateResponsiveLayout(orgLayout: Layout, layouts: ResponsiveLayout, breakpoints: Breakpoints,\n                                               breakpoint: Breakpoint, lastBreakpoint: Breakpoint,\n                                               cols: number, verticalCompact: boolean): Layout {\n  // If it already exists, just return it.\n  if (layouts[breakpoint]) return cloneLayout(layouts[breakpoint]);\n  // Find or generate the next layout\n  let layout = orgLayout;\n\n  const breakpointsSorted = sortBreakpoints(breakpoints);\n  const breakpointsAbove = breakpointsSorted.slice(breakpointsSorted.indexOf(breakpoint));\n  for (let i = 0, len = breakpointsAbove.length; i < len; i++) {\n    const b = breakpointsAbove[i];\n    if (layouts[b]) {\n      layout = layouts[b];\n      break;\n    }\n  }\n  layout = cloneLayout(layout || []); // clone layout so we don't modify existing items\n  return compact(correctBounds(layout, {cols: cols}), verticalCompact);\n}\n\nexport function generateResponsiveLayout(layout: Layout, breakpoints: Breakpoints,\n                                               breakpoint: Breakpoint, lastBreakpoint: Breakpoint,\n                                               cols: number, verticalCompact: boolean): Layout {\n  // If it already exists, just return it.\n  /*if (layouts[breakpoint]) return cloneLayout(layouts[breakpoint]);\n  // Find or generate the next layout\n  let layout = layouts[lastBreakpoint];*/\n    /*const breakpointsSorted = sortBreakpoints(breakpoints);\n  const breakpointsAbove = breakpointsSorted.slice(breakpointsSorted.indexOf(breakpoint));\n  for (let i = 0, len = breakpointsAbove.length; i < len; i++) {\n    const b = breakpointsAbove[i];\n    if (layouts[b]) {\n      layout = layouts[b];\n      break;\n    }\n  }*/\n  layout = cloneLayout(layout || []); // clone layout so we don't modify existing items\n  return compact(correctBounds(layout, {cols: cols}), verticalCompact);\n}\n\n/**\n * Given breakpoints, return an array of breakpoints sorted by width. This is usually\n * e.g. ['xxs', 'xs', 'sm', ...]\n *\n * @param  {Object} breakpoints Key/value pair of breakpoint names to widths.\n * @return {Array}              Sorted breakpoints.\n */\nexport function sortBreakpoints(breakpoints: Breakpoints): Array<Breakpoint> {\n  const keys: Array<string> = Object.keys(breakpoints);\n  return keys.sort(function(a, b) {\n    return breakpoints[a] - breakpoints[b];\n  });\n}\n"
  },
  {
    "path": "src/helpers/utils.js",
    "content": "// @flow\nexport type LayoutItemRequired = {w: number, h: number, x: number, y: number, i: string};\nexport type LayoutItem = LayoutItemRequired &\n                         {minW?: number, minH?: number, maxW?: number, maxH?: number,\n                          moved?: boolean, static?: boolean,\n                          isDraggable?: ?boolean, isResizable?: ?boolean};\nexport type Layout = Array<LayoutItem>;\n// export type Position = {left: number, top: number, width: number, height: number};\n/*\nexport type DragCallbackData = {\n  node: HTMLElement,\n  x: number, y: number,\n  deltaX: number, deltaY: number,\n  lastX: number, lastY: number\n};\n*/\n// export type DragEvent = {e: Event} & DragCallbackData;\nexport type Size = {width: number, height: number};\n// export type ResizeEvent = {e: Event, node: HTMLElement, size: Size};\n\n// const isProduction = process.env.NODE_ENV === 'production';\n/**\n * Return the bottom coordinate of the layout.\n *\n * @param  {Array} layout Layout array.\n * @return {Number}       Bottom coordinate.\n */\nexport function bottom(layout: Layout): number {\n  let max = 0, bottomY;\n  for (let i = 0, len = layout.length; i < len; i++) {\n    bottomY = layout[i]. y + layout[i].h;\n    if (bottomY > max) max = bottomY;\n  }\n  return max;\n}\n\nexport function cloneLayout(layout: Layout): Layout {\n  const newLayout = Array(layout.length);\n  for (let i = 0, len = layout.length; i < len; i++) {\n    newLayout[i] = cloneLayoutItem(layout[i]);\n  }\n  return newLayout;\n}\n\n// Fast path to cloning, since this is monomorphic\nexport function cloneLayoutItem(layoutItem: LayoutItem): LayoutItem {\n  /*return {\n    w: layoutItem.w, h: layoutItem.h, x: layoutItem.x, y: layoutItem.y, i: layoutItem.i,\n    minW: layoutItem.minW, maxW: layoutItem.maxW, minH: layoutItem.minH, maxH: layoutItem.maxH,\n    moved: Boolean(layoutItem.moved), static: Boolean(layoutItem.static),\n    // These can be null\n    isDraggable: layoutItem.isDraggable, isResizable: layoutItem.isResizable\n  };*/\n    return JSON.parse(JSON.stringify(layoutItem));\n}\n\n/**\n * Given two layoutitems, check if they collide.\n *\n * @return {Boolean}   True if colliding.\n */\nexport function collides(l1: LayoutItem, l2: LayoutItem): boolean {\n  if (l1 === l2) return false; // same element\n  if (l1.x + l1.w <= l2.x) return false; // l1 is left of l2\n  if (l1.x >= l2.x + l2.w) return false; // l1 is right of l2\n  if (l1.y + l1.h <= l2.y) return false; // l1 is above l2\n  if (l1.y >= l2.y + l2.h) return false; // l1 is below l2\n  return true; // boxes overlap\n}\n\n/**\n * Given a layout, compact it. This involves going down each y coordinate and removing gaps\n * between items.\n *\n * @param  {Array} layout Layout.\n * @param  {Boolean} verticalCompact Whether or not to compact the layout\n *   vertically.\n * @param {Object} minPositions\n * @return {Array}       Compacted Layout.\n */\nexport function compact(layout: Layout, verticalCompact: Boolean, minPositions): Layout {\n    // Statics go in the compareWith array right away so items flow around them.\n  const compareWith = getStatics(layout);\n  // We go through the items by row and column.\n  const sorted = sortLayoutItemsByRowCol(layout);\n  // Holding for new items.\n  const out = Array(layout.length);\n\n  for (let i = 0, len = sorted.length; i < len; i++) {\n    let l = sorted[i];\n\n    // Don't move static elements\n    if (!l.static) {\n      l = compactItem(compareWith, l, verticalCompact, minPositions);\n\n      // Add to comparison array. We only collide with items before this one.\n      // Statics are already in this array.\n      compareWith.push(l);\n    }\n\n    // Add to output array to make sure they still come out in the right order.\n    out[layout.indexOf(l)] = l;\n\n    // Clear moved flag, if it exists.\n    l.moved = false;\n  }\n\n  return out;\n}\n\n/**\n * Compact an item in the layout.\n */\nexport function compactItem(compareWith: Layout, l: LayoutItem, verticalCompact: boolean, minPositions): LayoutItem {\n  if (verticalCompact) {\n    // Move the element up as far as it can go without colliding.\n    while (l.y > 0 && !getFirstCollision(compareWith, l)) {\n      l.y--;\n    }\n  } else if (minPositions) {\n    const minY = minPositions[l.i].y;\n    while (l.y > minY && !getFirstCollision(compareWith, l)) {\n      l.y--;\n    }\n  }\n\n  // Move it down, and keep moving it down if it's colliding.\n  let collides;\n  while((collides = getFirstCollision(compareWith, l))) {\n    l.y = collides.y + collides.h;\n  }\n  return l;\n}\n\n/**\n * Given a layout, make sure all elements fit within its bounds.\n *\n * @param  {Array} layout Layout array.\n * @param  {Number} bounds Number of columns.\n */\nexport function correctBounds(layout: Layout, bounds: {cols: number}): Layout {\n  const collidesWith = getStatics(layout);\n  for (let i = 0, len = layout.length; i < len; i++) {\n    const l = layout[i];\n    // Overflows right\n    if (l.x + l.w > bounds.cols) l.x = bounds.cols - l.w;\n    // Overflows left\n    if (l.x < 0) {\n      l.x = 0;\n      l.w = bounds.cols;\n    }\n    if (!l.static) collidesWith.push(l);\n    else {\n      // If this is static and collides with other statics, we must move it down.\n      // We have to do something nicer than just letting them overlap.\n      while(getFirstCollision(collidesWith, l)) {\n        l.y++;\n      }\n    }\n  }\n  return layout;\n}\n\n/**\n * Get a layout item by ID. Used so we can override later on if necessary.\n *\n * @param  {Array}  layout Layout array.\n * @param  {String} id     ID\n * @return {LayoutItem}    Item at ID.\n */\nexport function getLayoutItem(layout: Layout, id: string): ?LayoutItem {\n  for (let i = 0, len = layout.length; i < len; i++) {\n    if (layout[i].i === id) return layout[i];\n  }\n}\n\n/**\n * Returns the first item this layout collides with.\n * It doesn't appear to matter which order we approach this from, although\n * perhaps that is the wrong thing to do.\n *\n * @param  {Object} layoutItem Layout item.\n * @return {Object|undefined}  A colliding layout item, or undefined.\n */\nexport function getFirstCollision(layout: Layout, layoutItem: LayoutItem): ?LayoutItem {\n  for (let i = 0, len = layout.length; i < len; i++) {\n    if (collides(layout[i], layoutItem)) return layout[i];\n  }\n}\n\nexport function getAllCollisions(layout: Layout, layoutItem: LayoutItem): Array<LayoutItem> {\n  return layout.filter((l) => collides(l, layoutItem));\n}\n\n/**\n * Get all static elements.\n * @param  {Array} layout Array of layout objects.\n * @return {Array}        Array of static layout items..\n */\nexport function getStatics(layout: Layout): Array<LayoutItem> {\n    //return [];\n    return layout.filter((l) => l.static);\n}\n\n/**\n * Move an element. Responsible for doing cascading movements of other elements.\n *\n * @param  {Array}      layout Full layout to modify.\n * @param  {LayoutItem} l      element to move.\n * @param  {Number}     [x]    X position in grid units.\n * @param  {Number}     [y]    Y position in grid units.\n * @param  {Boolean}    [isUserAction] If true, designates that the item we're moving is\n *                                     being dragged/resized by th euser.\n */\nexport function moveElement(layout: Layout, l: LayoutItem, x: Number, y: Number, isUserAction: Boolean, preventCollision: Boolean): Layout {\n  if (l.static) return layout;\n\n  // Short-circuit if nothing to do.\n  //if (l.y === y && l.x === x) return layout;\n\n  const oldX = l.x;\n  const oldY = l.y;\n\n  const movingUp = y && l.y > y;\n  // This is quite a bit faster than extending the object\n  if (typeof x === 'number') l.x = x;\n  if (typeof y === 'number') l.y = y;\n  l.moved = true;\n\n  // If this collides with anything, move it.\n  // When doing this comparison, we have to sort the items we compare with\n  // to ensure, in the case of multiple collisions, that we're getting the\n  // nearest collision.\n  let sorted = sortLayoutItemsByRowCol(layout);\n  if (movingUp) sorted = sorted.reverse();\n  const collisions = getAllCollisions(sorted, l);\n\n  if (preventCollision && collisions.length) {\n    l.x = oldX;\n    l.y = oldY;\n    l.moved = false;\n    return layout;\n  }\n\n  // Move each item that collides away from this element.\n  for (let i = 0, len = collisions.length; i < len; i++) {\n    const collision = collisions[i];\n    // console.log('resolving collision between', l.i, 'at', l.y, 'and', collision.i, 'at', collision.y);\n\n    // Short circuit so we can't infinite loop\n    if (collision.moved) continue;\n\n    // This makes it feel a bit more precise by waiting to swap for just a bit when moving up.\n    if (l.y > collision.y && l.y - collision.y > collision.h / 4) continue;\n\n    // Don't move static items - we have to move *this* element away\n    if (collision.static) {\n      layout = moveElementAwayFromCollision(layout, collision, l, isUserAction);\n    } else {\n      layout = moveElementAwayFromCollision(layout, l, collision, isUserAction);\n    }\n  }\n\n  return layout;\n}\n\n/**\n * This is where the magic needs to happen - given a collision, move an element away from the collision.\n * We attempt to move it up if there's room, otherwise it goes below.\n *\n * @param  {Array} layout            Full layout to modify.\n * @param  {LayoutItem} collidesWith Layout item we're colliding with.\n * @param  {LayoutItem} itemToMove   Layout item we're moving.\n * @param  {Boolean} [isUserAction]  If true, designates that the item we're moving is being dragged/resized\n *                                   by the user.\n */\nexport function moveElementAwayFromCollision(layout: Layout, collidesWith: LayoutItem,\n                                             itemToMove: LayoutItem, isUserAction: ?boolean): Layout {\n\n  const preventCollision = false // we're already colliding\n  // If there is enough space above the collision to put this element, move it there.\n  // We only do this on the main collision as this can get funky in cascades and cause\n  // unwanted swapping behavior.\n  if (isUserAction) {\n    // Make a mock item so we don't modify the item here, only modify in moveElement.\n    const fakeItem: LayoutItem = {\n      x: itemToMove.x,\n      y: itemToMove.y,\n      w: itemToMove.w,\n      h: itemToMove.h,\n      i: '-1'\n    };\n    fakeItem.y = Math.max(collidesWith.y - itemToMove.h, 0);\n    if (!getFirstCollision(layout, fakeItem)) {\n      return moveElement(layout, itemToMove, undefined, fakeItem.y, preventCollision);\n    }\n  }\n\n  // Previously this was optimized to move below the collision directly, but this can cause problems\n  // with cascading moves, as an item may actually leapflog a collision and cause a reversal in order.\n  return moveElement(layout, itemToMove, undefined, itemToMove.y + 1, preventCollision);\n}\n\n/**\n * Helper to convert a number to a percentage string.\n *\n * @param  {Number} num Any number\n * @return {String}     That number as a percentage.\n */\nexport function perc(num: number): string {\n  return num * 100 + '%';\n}\n\nexport function setTransform(top, left, width, height): Object {\n  // Replace unitless items with px\n  const translate = \"translate3d(\" + left + \"px,\" + top + \"px, 0)\";\n  return {\n    transform: translate,\n    WebkitTransform: translate,\n    MozTransform: translate,\n    msTransform: translate,\n    OTransform: translate,\n    width: width + \"px\",\n    height: height + \"px\",\n    position: 'absolute'\n  };\n}\n/**\n * Just like the setTransform method, but instead it will return a negative value of right.\n *\n * @param top\n * @param right\n * @param width\n * @param height\n * @returns {{transform: string, WebkitTransform: string, MozTransform: string, msTransform: string, OTransform: string, width: string, height: string, position: string}}\n */\nexport function setTransformRtl(top, right, width, height): Object {\n    // Replace unitless items with px\n    const translate = \"translate3d(\" + right * -1 + \"px,\" + top + \"px, 0)\";\n    return {\n        transform: translate,\n        WebkitTransform: translate,\n        MozTransform: translate,\n        msTransform: translate,\n        OTransform: translate,\n        width: width + \"px\",\n        height: height + \"px\",\n        position: 'absolute'\n    };\n}\n\nexport function setTopLeft(top, left, width, height): Object {\n    return {\n        top: top + \"px\",\n        left: left + \"px\",\n        width: width + \"px\",\n        height: height + \"px\",\n        position: 'absolute'\n    };\n}\n/**\n * Just like the setTopLeft method, but instead, it will return a right property instead of left.\n *\n * @param top\n * @param right\n * @param width\n * @param height\n * @returns {{top: string, right: string, width: string, height: string, position: string}}\n */\nexport function setTopRight(top, right, width, height): Object {\n    return {\n        top: top + \"px\",\n        right: right+ \"px\",\n        width: width + \"px\",\n        height: height + \"px\",\n        position: 'absolute'\n    };\n}\n\n\n/**\n * Get layout items sorted from top left to right and down.\n *\n * @return {Array} Array of layout objects.\n * @return {Array}        Layout, sorted static items first.\n */\nexport function sortLayoutItemsByRowCol(layout: Layout): Layout {\n  return [].concat(layout).sort(function(a, b) {\n    if (a.y === b.y && a.x === b.x) {\n      return 0;\n    }\n\n    if (a.y > b.y || (a.y === b.y && a.x > b.x)) {\n      return 1;\n    }\n\n    return -1;\n  });\n}\n\n/**\n * Generate a layout using the initialLayout and children as a template.\n * Missing entries will be added, extraneous ones will be truncated.\n *\n * @param  {Array}  initialLayout Layout passed in through props.\n * @param  {String} breakpoint    Current responsive breakpoint.\n * @param  {Boolean} verticalCompact Whether or not to compact the layout vertically.\n * @return {Array}                Working layout.\n */\n/*\nexport function synchronizeLayoutWithChildren(initialLayout: Layout, children: Array<React.Element>|React.Element,\n                                              cols: number, verticalCompact: boolean): Layout {\n  // ensure 'children' is always an array\n  if (!Array.isArray(children)) {\n    children = [children];\n  }\n  initialLayout = initialLayout || [];\n\n  // Generate one layout item per child.\n  let layout: Layout = [];\n  for (let i = 0, len = children.length; i < len; i++) {\n    let newItem;\n    const child = children[i];\n\n    // Don't overwrite if it already exists.\n    const exists = getLayoutItem(initialLayout, child.key || \"1\" /!* FIXME satisfies Flow *!/);\n    if (exists) {\n      newItem = exists;\n    } else {\n      const g = child.props._grid;\n\n      // Hey, this item has a _grid property, use it.\n      if (g) {\n        if (!isProduction) {\n          validateLayout([g], 'ReactGridLayout.children');\n        }\n        // Validated; add it to the layout. Bottom 'y' possible is the bottom of the layout.\n        // This allows you to do nice stuff like specify {y: Infinity}\n        if (verticalCompact) {\n          newItem = cloneLayoutItem({...g, y: Math.min(bottom(layout), g.y), i: child.key});\n        } else {\n          newItem = cloneLayoutItem({...g, y: g.y, i: child.key});\n        }\n      }\n      // Nothing provided: ensure this is added to the bottom\n      else {\n        newItem = cloneLayoutItem({w: 1, h: 1, x: 0, y: bottom(layout), i: child.key || \"1\"});\n      }\n    }\n    layout[i] = newItem;\n  }\n\n  // Correct the layout.\n  layout = correctBounds(layout, {cols: cols});\n  layout = compact(layout, verticalCompact);\n\n  return layout;\n}\n*/\n\n/**\n * Validate a layout. Throws errors.\n *\n * @param  {Array}  layout        Array of layout items.\n * @param  {String} [contextName] Context name for errors.\n * @throw  {Error}                Validation error.\n */\nexport function validateLayout(layout: Layout, contextName: string): void {\n  contextName = contextName || \"Layout\";\n  const subProps = ['x', 'y', 'w', 'h'];\n  let keyArr = [];\n  if (!Array.isArray(layout)) throw new Error(contextName + \" must be an array!\");\n  for (let i = 0, len = layout.length; i < len; i++) {\n    const item = layout[i];\n    for (let j = 0; j < subProps.length; j++) {\n      if (typeof item[subProps[j]] !== 'number') {\n        throw new Error('VueGridLayout: ' + contextName + '[' + i + '].' + subProps[j] + ' must be a number!');\n      }\n    }\n\n    if (item.i === undefined || item.i === null) {\n      throw new Error('VueGridLayout: ' + contextName + '[' + i + '].i cannot be null!');\n    }\n\n    if (typeof item.i !== 'number' && typeof item.i !== 'string') {\n      throw new Error('VueGridLayout: ' + contextName + '[' + i + '].i must be a string or number!');\n    }\n\n    if (keyArr.indexOf(item.i) >= 0) {\n      throw new Error('VueGridLayout: ' + contextName + '[' + i + '].i must be unique!');\n    }\n    keyArr.push(item.i);\n\n    if (item.static !== undefined && typeof item.static !== 'boolean') {\n      throw new Error('VueGridLayout: ' + contextName + '[' + i + '].static must be a boolean!');\n    }\n  }\n}\n\n// Flow can't really figure this out, so we just use Object\nexport function autoBindHandlers(el: Object, fns: Array<string>): void {\n  fns.forEach((key) => el[key] = el[key].bind(el));\n}\n\n\n\n/**\n * Convert a JS object to CSS string. Similar to React's output of CSS.\n * @param obj\n * @returns {string}\n */\nexport function createMarkup(obj) {\n    var keys = Object.keys(obj);\n    if (!keys.length) return '';\n    var i, len = keys.length;\n    var result = '';\n\n    for (i = 0; i < len; i++) {\n        var key = keys[i];\n        var val = obj[key];\n        result += hyphenate(key) + ':' + addPx(key, val) + ';';\n    }\n\n    return result;\n}\n\n\n/* The following list is defined in React's core */\nexport var IS_UNITLESS = {\n    animationIterationCount: true,\n    boxFlex: true,\n    boxFlexGroup: true,\n    boxOrdinalGroup: true,\n    columnCount: true,\n    flex: true,\n    flexGrow: true,\n    flexPositive: true,\n    flexShrink: true,\n    flexNegative: true,\n    flexOrder: true,\n    gridRow: true,\n    gridColumn: true,\n    fontWeight: true,\n    lineClamp: true,\n    lineHeight: true,\n    opacity: true,\n    order: true,\n    orphans: true,\n    tabSize: true,\n    widows: true,\n    zIndex: true,\n    zoom: true,\n\n    // SVG-related properties\n    fillOpacity: true,\n    stopOpacity: true,\n    strokeDashoffset: true,\n    strokeOpacity: true,\n    strokeWidth: true\n};\n\n\n/**\n * Will add px to the end of style values which are Numbers.\n * @param name\n * @param value\n * @returns {*}\n */\nexport function addPx(name, value) {\n    if(typeof value === 'number' && !IS_UNITLESS[ name ]) {\n        return value + 'px';\n    } else {\n        return value;\n    }\n}\n\n\n/**\n * Hyphenate a camelCase string.\n *\n * @param {String} str\n * @return {String}\n */\n\nexport var hyphenateRE = /([a-z\\d])([A-Z])/g;\n\nexport function hyphenate(str) {\n    return str.replace(hyphenateRE, '$1-$2').toLowerCase();\n}\n\n\nexport function findItemInArray(array, property, value) {\n    for (var i=0; i < array.length; i++)\n        if (array[i][property] == value)\n            return true;\n\n    return false;\n}\n\nexport function findAndRemove(array, property, value) {\n    array.forEach(function (result, index) {\n        if (result[property] === value) {\n            //Remove from array\n            array.splice(index, 1);\n        }\n    });\n}\n"
  },
  {
    "path": "src/main.js",
    "content": "import Vue from 'vue'\nimport App from './App.vue'\n\nnew Vue({\n  render: h => h(App)\n}).$mount('#app')\n"
  },
  {
    "path": "test/interact-test.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"utf-8\">\n    <title>Interact TEST</title>\n    <meta name=\"viewport\" content=\"initial-scale=1, maximum-scale=1, user-scalable=no\">\n    <style>\n        .resize-drag {\n            background-color: #29e;\n            color: white;\n            font-size: 20px;\n            font-family: sans-serif;\n            border-radius: 8px;\n            padding: 20px;\n            margin: 30px 20px;\n\n            width: 120px;\n\n            /* This makes things *much* easier */\n            box-sizing: border-box;\n        }\n\n        .resize-container {\n            display: inline-block;\n            background-color: #cccccc;\n            width: 400px;\n            height: 400px;\n        }\n    </style>\n</head>\n<body>\n<div class=\"resize-container\">\n    <div class=\"resize-drag\">\n        Resize from any edge or corner\n    </div>\n</div>\n<script src=\"../node_modules/interactjs/dist/interact.js\"></script>\n<script src=\"interact-test.js\"></script>\n</body>\n</html>\n"
  },
  {
    "path": "test/interact-test.js",
    "content": "function dragMoveListener (event) {\n    var target = event.target,\n        // keep the dragged position in the data-x/data-y attributes\n        x = (parseFloat(target.getAttribute('data-x')) || 0) + event.dx,\n        y = (parseFloat(target.getAttribute('data-y')) || 0) + event.dy;\n\n    // translate the element\n    target.style.webkitTransform =\n        target.style.transform =\n            'translate(' + x + 'px, ' + y + 'px)';\n\n    // update the posiion attributes\n    target.setAttribute('data-x', x);\n    target.setAttribute('data-y', y);\n}\n\n// this is used later in the resizing and gesture demos\nwindow.dragMoveListener = dragMoveListener;\n\n\ninteract('.resize-drag')\n    .draggable({\n        onmove: window.dragMoveListener,\n        restrict: {\n            restriction: 'parent',\n            elementRect: { top: 0, left: 0, bottom: 1, right: 1 }\n        },\n    })\n    .resizable({\n        // resize from all edges and corners\n        edges: { left: true, right: true, bottom: true, top: true },\n\n        // keep the edges inside the parent\n        restrictEdges: {\n            outer: 'parent',\n            endOnly: true,\n        },\n\n        // minimum size\n        restrictSize: {\n            min: { width: 100, height: 50 },\n        },\n\n        inertia: true,\n    })\n    .on('resizemove', function (event) {\n        var target = event.target,\n            x = (parseFloat(target.getAttribute('data-x')) || 0),\n            y = (parseFloat(target.getAttribute('data-y')) || 0);\n\n        // update the element's style\n        target.style.width  = event.rect.width + 'px';\n        target.style.height = event.rect.height + 'px';\n\n        // translate when resizing from top or left edges\n        x += event.deltaRect.left;\n        y += event.deltaRect.top;\n\n        target.style.webkitTransform = target.style.transform =\n            'translate(' + x + 'px,' + y + 'px)';\n\n        target.setAttribute('data-x', x);\n        target.setAttribute('data-y', y);\n        target.textContent = Math.round(event.rect.width) + '\\u00D7' + Math.round(event.rect.height);\n    });"
  },
  {
    "path": "test/unit/GridItem.spec.js",
    "content": "import { shallowMount } from '@vue/test-utils'\nimport GridLayout from '../../src/components/GridLayout.vue'\n\nlet layout\n\ndescribe('GridLayout test', () => {\n    beforeAll(()=>{\n        let testLayout = [{\"x\":0,\"y\":0,\"w\":2,\"h\":2,\"i\":\"0\", resizable: true, draggable: true, static: false, minY: 0, maxY: 2}];\n        layout = JSON.parse(JSON.stringify(testLayout))\n    })\n    \n    describe('Interface test', () => {\n        it('should render correct contents', () => {\n            const wrapper = shallowMount(GridLayout, {\n                propsData: {\n                    layout: layout\n                }   \n            })\n            const grid = wrapper.findAll('.vue-grid-layout');\n            expect(grid.selector).toEqual('.vue-grid-layout');\n        })\n    })\n})\n"
  },
  {
    "path": "test/unit/utils.spec.js",
    "content": "// @flow\r\n/* eslint-env jest */\r\n\r\nimport {\r\n    bottom,\r\n    collides,\r\n    compact,\r\n    moveElement,\r\n    sortLayoutItemsByRowCol,\r\n    validateLayout\r\n  } from \"../../src/helpers/utils\";\r\n  \r\n  describe(\"bottom\", () => {\r\n    it(\"Handles an empty layout as input\", () => {\r\n      expect(bottom([])).toEqual(0);\r\n    });\r\n  \r\n    it(\"Returns the bottom coordinate of the layout\", () => {\r\n      expect(\r\n        bottom([\r\n          { i: \"1\", x: 0, y: 1, w: 1, h: 1 },\r\n          { i: \"2\", x: 1, y: 2, w: 1, h: 1 }\r\n        ])\r\n      ).toEqual(3);\r\n    });\r\n  });\r\n  \r\n  describe(\"sortLayoutItemsByRowCol\", () => {\r\n    it(\"should sort by top to bottom right\", () => {\r\n      const layout = [\r\n        { x: 1, y: 1, w: 1, h: 1, i: \"2\" },\r\n        { x: 1, y: 0, w: 1, h: 1, i: \"1\" },\r\n        { x: 0, y: 1, w: 2, h: 2, i: \"3\" }\r\n      ];\r\n      expect(sortLayoutItemsByRowCol(layout)).toEqual([\r\n        { x: 1, y: 0, w: 1, h: 1, i: \"1\" },\r\n        { x: 0, y: 1, w: 2, h: 2, i: \"3\" },\r\n        { x: 1, y: 1, w: 1, h: 1, i: \"2\" }\r\n      ]);\r\n    });\r\n  });\r\n\r\n  describe(\"collides\", () => {\r\n    it(\"Returns whether the layout items collide\", () => {\r\n      expect(\r\n        collides(\r\n          { i: \"1\", x: 0, y: 1, w: 1, h: 1 },\r\n          { i: \"2\", x: 1, y: 2, w: 1, h: 1 }\r\n        )\r\n      ).toEqual(false);\r\n      expect(\r\n        collides(\r\n          { i: \"1\", x: 0, y: 1, w: 1, h: 1 },\r\n          { i: \"2\", x: 0, y: 1, w: 1, h: 1 }\r\n        )\r\n      ).toEqual(true);\r\n    });\r\n  });\r\n  \r\n  describe(\"validateLayout\", () => {\r\n    it(\"Validates an empty layout\", () => {\r\n      validateLayout([]);\r\n    });\r\n    it(\"Validates a populated layout\", () => {\r\n      validateLayout([\r\n        { i: \"1\", x: 0, y: 1, w: 1, h: 1 },\r\n        { i: \"2\", x: 1, y: 2, w: 1, h: 1 }\r\n      ]);\r\n    });\r\n    it(\"Throws errors on invalid input\", () => {\r\n      expect(() => {\r\n        validateLayout([\r\n          { i: \"1\", x: 0, y: 1, w: 1, h: 1 },\r\n          { i: \"2\", x: 1, y: 2, w: 1 }\r\n        ]);\r\n      }).toThrowError(/layout\\[1\\]\\.h must be a number!/i);\r\n    });\r\n  });\r\n  \r\n  describe(\"moveElement\", () => {\r\n    function compactAndMove(\r\n      layout,\r\n      layoutItem,\r\n      x,\r\n      y,\r\n      isUserAction,\r\n      preventCollision\r\n    ) {\r\n      return compact(\r\n        moveElement(\r\n          layout,\r\n          layoutItem,\r\n          x,\r\n          y,\r\n          isUserAction,\r\n          preventCollision\r\n        )\r\n      );\r\n    }\r\n  \r\n    it(\"Does not change layout when colliding on no rearrangement mode\", () => {\r\n      const layout = [\r\n        { i: \"1\", x: 0, y: 1, w: 1, h: 1, moved: false },\r\n        { i: \"2\", x: 1, y: 2, w: 1, h: 1, moved: false }\r\n      ];\r\n      const layoutItem = layout[0];\r\n      expect(\r\n        moveElement(\r\n          layout,\r\n          layoutItem,\r\n          1,\r\n          2, // x, y\r\n          true,\r\n          true // isUserAction, preventCollision\r\n        )\r\n      ).toEqual([\r\n        { i: \"1\", x: 0, y: 1, w: 1, h: 1, moved: false },\r\n        { i: \"2\", x: 1, y: 2, w: 1, h: 1, moved: false }\r\n      ]);\r\n    });\r\n  \r\n    it(\"Does change layout when colliding in rearrangement mode\", () => {\r\n      const layout = [\r\n        { i: \"1\", x: 0, y: 0, w: 1, h: 1, moved: false },\r\n        { i: \"2\", x: 1, y: 0, w: 1, h: 1, moved: false }\r\n      ];\r\n      const layoutItem = layout[0];\r\n      expect(\r\n        moveElement(\r\n          layout,\r\n          layoutItem,\r\n          1,\r\n          0, // x, y\r\n          true,\r\n          false // isUserAction, preventCollision\r\n        )\r\n      ).toEqual([\r\n        { i: \"1\", x: 1, y: 0, w: 1, h: 1, moved: true },\r\n        { i: \"2\", x: 1, y: 1, w: 1, h: 1, moved: true }\r\n      ]);\r\n    });\r\n  \r\n    it(\"Moves elements out of the way without causing panel jumps when compaction is vertical\", () => {\r\n      const layout = [\r\n        { x: 0, y: 0, w: 1, h: 10, i: \"A\" },\r\n        { x: 0, y: 10, w: 1, h: 1, i: \"B\" },\r\n        { x: 0, y: 11, w: 1, h: 1, i: \"C\" }\r\n      ];\r\n      // move A down slightly so it collides with C; can cause C to jump above B.\r\n      // We instead want B to jump above A (it has the room)\r\n      const itemA = layout[0];\r\n      expect(\r\n        compactAndMove(\r\n          layout,\r\n          itemA,\r\n          0,\r\n          1, // x, y\r\n          true,\r\n          false // isUserAction, preventCollision\r\n        )\r\n      ).toEqual([\r\n        expect.objectContaining({ x: 0, y: 1, w: 1, h: 10, i: \"A\" }),\r\n        expect.objectContaining({ x: 0, y: 0, w: 1, h: 1, i: \"B\" }),\r\n        expect.objectContaining({ x: 0, y: 11, w: 1, h: 1, i: \"C\" })\r\n      ]);\r\n    });\r\n  \r\n    it(\"Calculates the correct collision when moving large object far\", () => {\r\n      const layout = [\r\n        { x: 0, y: 0, w: 1, h: 10, i: \"A\" },\r\n        { x: 0, y: 10, w: 1, h: 1, i: \"B\" },\r\n        { x: 0, y: 11, w: 1, h: 1, i: \"C\" }\r\n      ];\r\n      // Move A down by 2. This should move B above, but since we don't compact in between,\r\n      // C should move below.\r\n      const itemA = layout[0];\r\n      expect(\r\n        moveElement(\r\n          layout,\r\n          itemA,\r\n          0,\r\n          2, // x, y\r\n          true,\r\n          false // isUserAction, preventCollision\r\n        )\r\n      ).toEqual([\r\n        expect.objectContaining({ x: 0, y: 2, w: 1, h: 10, i: \"A\" }),\r\n        expect.objectContaining({ x: 0, y: 1, w: 1, h: 1, i: \"B\" }),\r\n        expect.objectContaining({ x: 0, y: 12, w: 1, h: 1, i: \"C\" })\r\n      ]);\r\n    });\r\n  \r\n    it(\"Moves elements out of the way without causing panel jumps when compaction is vertical\", () => {\r\n      const layout = [\r\n        { x: 0, y: 0, w: 1, h: 1, i: \"A\" },\r\n        { x: 1, y: 0, w: 1, h: 1, i: \"B\" },\r\n        { x: 0, y: 1, w: 2, h: 2, i: \"C\" }\r\n      ];\r\n      // move A over slightly so it collides with B; can cause C to jump above B\r\n      // this test will check that that does not happen\r\n      const itemA = layout[0];\r\n      expect(\r\n        moveElement(\r\n          layout,\r\n          itemA,\r\n          1,\r\n          0, // x, y\r\n          true,\r\n          false // isUserAction, preventCollision\r\n        )\r\n      ).toEqual([\r\n        { x: 1, y: 0, w: 1, h: 1, i: \"A\", moved: true },\r\n        { x: 1, y: 1, w: 1, h: 1, i: \"B\", moved: true },\r\n        { x: 0, y: 2, w: 2, h: 2, i: \"C\", moved: true }\r\n      ]);\r\n    });\r\n  \r\n    it(\"Moves one element to another should cause moving down panels, vert compact\", () => {\r\n      // | A | B |\r\n      // |C|  D  |\r\n      const layout = [\r\n        { x: 0, y: 0, w: 2, h: 1, i: \"A\" },\r\n        { x: 2, y: 0, w: 2, h: 1, i: \"B\" },\r\n        { x: 0, y: 1, w: 1, h: 1, i: \"C\" },\r\n        { x: 1, y: 1, w: 3, h: 1, i: \"D\" }\r\n      ];\r\n      // move B left slightly so it collides with A; can cause C to jump above A\r\n      // this test will check that that does not happen\r\n      const itemB = layout[1];\r\n      expect(\r\n        compactAndMove(\r\n          layout,\r\n          itemB,\r\n          1,\r\n          0, // x, y\r\n          true,\r\n          false // isUserAction, preventCollision\r\n        )\r\n      ).toEqual([\r\n        expect.objectContaining({ x: 0, y: 1, w: 2, h: 1, i: \"A\" }),\r\n        expect.objectContaining({ x: 1, y: 0, w: 2, h: 1, i: \"B\" }),\r\n        expect.objectContaining({ x: 0, y: 2, w: 1, h: 1, i: \"C\" }),\r\n        expect.objectContaining({ x: 1, y: 2, w: 3, h: 1, i: \"D\" })\r\n      ]);\r\n    });\r\n  \r\n    it(\"Moves one element to another should cause moving down panels, vert compact\", () => {\r\n      // | A |\r\n      // |B|C|\r\n      //   | |\r\n      //\r\n      // Moving C above A should not move B above A\r\n      const layout = [\r\n        { x: 0, y: 0, w: 2, h: 1, i: \"A\" },\r\n        { x: 0, y: 1, w: 1, h: 1, i: \"B\" },\r\n        { x: 1, y: 1, w: 1, h: 2, i: \"C\" }\r\n      ];\r\n      // Move C up.\r\n      const itemB = layout[2];\r\n      expect(\r\n        compactAndMove(\r\n          layout,\r\n          itemB,\r\n          1,\r\n          0, // x, y\r\n          true,\r\n          false // isUserAction, preventCollision\r\n        )\r\n      ).toEqual([\r\n        expect.objectContaining({ x: 0, y: 2, w: 2, h: 1, i: \"A\" }),\r\n        expect.objectContaining({ x: 0, y: 3, w: 1, h: 1, i: \"B\" }),\r\n        expect.objectContaining({ x: 1, y: 0, w: 1, h: 2, i: \"C\" })\r\n      ]);\r\n    });\r\n  });\r\n  \r\n  describe(\"compact vertical\", () => {\r\n    it(\"Removes empty vertical space above item\", () => {\r\n      const layout = [{ i: \"1\", x: 0, y: 1, w: 1, h: 1 }];\r\n      expect(compact(layout, true)).toEqual([\r\n        { i: \"1\", x: 0, y: 0, w: 1, h: 1, moved: false }\r\n      ]);\r\n    });\r\n  \r\n    it(\"Resolve collision by moving item further down in array\", () => {\r\n      const layout = [\r\n        { x: 0, y: 0, w: 1, h: 5, i: \"1\" },\r\n        { x: 0, y: 1, w: 1, h: 1, i: \"2\" }\r\n      ];\r\n      expect(compact(layout, true)).toEqual([\r\n        { x: 0, y: 0, w: 1, h: 5, i: \"1\", moved: false },\r\n        { x: 0, y: 5, w: 1, h: 1, i: \"2\", moved: false }\r\n      ]);\r\n    });\r\n  \r\n    it(\"Handles recursive collision by moving new collisions out of the way before moving item down\", () => {\r\n      const layout = [\r\n        { x: 0, y: 0, w: 2, h: 5, i: \"1\" },\r\n        { x: 0, y: 0, w: 10, h: 1, i: \"2\" },\r\n        { x: 5, y: 1, w: 1, h: 1, i: \"3\" },\r\n        { x: 5, y: 2, w: 1, h: 1, i: \"4\" },\r\n        { x: 5, y: 3, w: 1, h: 1, i: \"5\", static: true }\r\n      ];\r\n  \r\n      expect(compact(layout, true)).toEqual([\r\n        { x: 0, y: 0, w: 2, h: 5, i: \"1\", moved: false },\r\n        { x: 0, y: 5, w: 10, h: 1, i: \"2\", moved: false },\r\n        { x: 5, y: 0, w: 1, h: 1, i: \"3\", moved: false },\r\n        { x: 5, y: 1, w: 1, h: 1, i: \"4\", moved: false },\r\n        { x: 5, y: 3, w: 1, h: 1, i: \"5\", moved: false, static: true }\r\n      ]);\r\n    });\r\n  });\r\n"
  },
  {
    "path": "vue.config.js",
    "content": "// https://medium.com/js-dojo/how-to-reduce-your-vue-js-bundle-size-with-webpack-3145bf5019b7\n// const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;\nconst webpack = require('webpack');\nconst PACKAGE = require('./package.json');\n\nconst banner = PACKAGE.name + ' - ' + PACKAGE.version + ' | ' +\n    '(c) 2015, ' + new Date().getFullYear() + '  ' + PACKAGE.author + ' | ' +\n    PACKAGE.homepage;\n\nmodule.exports = {\n    configureWebpack: {\n        output: {\n            library: \"VueGridLayout\",\n            libraryExport: 'default'\n        },\n        plugins: [\n            // new BundleAnalyzerPlugin(),\n            new webpack.BannerPlugin(banner)\n        ],\n    },\n    css: {\n        extract: false\n    },\n}\n"
  },
  {
    "path": "website/TODOS.md",
    "content": "# vue-grid-layout\n\n\nhttps://github.com/wearebraid/vueformulate.com/tree/master/docs\n\n\n# emit responsiveLayoutUpdatedEvent?\n\nhttps://github.com/jbaysolutions/vue-grid-layout/compare/master...wzquyin:master\n"
  },
  {
    "path": "website/docs/.vuepress/Autocomplete.js",
    "content": "// import MyFormulateAutocomplete from './components/MyFormulateAutocomplete'\n//\n// export default function (formulateInstance) {\n//   formulateInstance.extend({\n//     components: {\n//       MyFormulateAutocomplete\n//     },\n//     library: {\n//       autocomplete: {\n//         classification: 'text',\n//         component: 'MyFormulateAutocomplete'\n//       }\n//     }\n//   })\n// }\n"
  },
  {
    "path": "website/docs/.vuepress/components/Example01Basic.vue",
    "content": "<template>\n    <grid-layout :layout.sync=\"layout\"\n                 :col-num=\"12\"\n                 :row-height=\"30\"\n                 :is-draggable=\"draggable\"\n                 :is-resizable=\"resizable\"\n                 :vertical-compact=\"true\"\n                 :use-css-transforms=\"true\"\n    >\n        <grid-item v-for=\"item in layout\"\n                   :static=\"item.static\"\n                   :x=\"item.x\"\n                   :y=\"item.y\"\n                   :w=\"item.w\"\n                   :h=\"item.h\"\n                   :i=\"item.i\"\n        >\n            <span class=\"text\">{{itemTitle(item)}}</span>\n        </grid-item>\n    </grid-layout>\n</template>\n\n<script>\nimport { GridLayout, GridItem } from \"vue-grid-layout\"\n\nexport default {\n    components: {\n        GridLayout,\n        GridItem\n    },\n    data() {\n        return {\n            layout: [\n                {\"x\":0,\"y\":0,\"w\":2,\"h\":2,\"i\":\"0\", static: false},\n                {\"x\":2,\"y\":0,\"w\":2,\"h\":4,\"i\":\"1\", static: true},\n                {\"x\":4,\"y\":0,\"w\":2,\"h\":5,\"i\":\"2\", static: false},\n                {\"x\":6,\"y\":0,\"w\":2,\"h\":3,\"i\":\"3\", static: false},\n                {\"x\":8,\"y\":0,\"w\":2,\"h\":3,\"i\":\"4\", static: false},\n                {\"x\":10,\"y\":0,\"w\":2,\"h\":3,\"i\":\"5\", static: false},\n                {\"x\":0,\"y\":5,\"w\":2,\"h\":5,\"i\":\"6\", static: false},\n                {\"x\":2,\"y\":5,\"w\":2,\"h\":5,\"i\":\"7\", static: false},\n                {\"x\":4,\"y\":5,\"w\":2,\"h\":5,\"i\":\"8\", static: false},\n                {\"x\":6,\"y\":3,\"w\":2,\"h\":4,\"i\":\"9\", static: true},\n                {\"x\":8,\"y\":4,\"w\":2,\"h\":4,\"i\":\"10\", static: false},\n                {\"x\":10,\"y\":4,\"w\":2,\"h\":4,\"i\":\"11\", static: false},\n                {\"x\":0,\"y\":10,\"w\":2,\"h\":5,\"i\":\"12\", static: false},\n                {\"x\":2,\"y\":10,\"w\":2,\"h\":5,\"i\":\"13\", static: false},\n                {\"x\":4,\"y\":8,\"w\":2,\"h\":4,\"i\":\"14\", static: false},\n                {\"x\":6,\"y\":8,\"w\":2,\"h\":4,\"i\":\"15\", static: false},\n                {\"x\":8,\"y\":10,\"w\":2,\"h\":5,\"i\":\"16\", static: false},\n                {\"x\":10,\"y\":4,\"w\":2,\"h\":2,\"i\":\"17\", static: false},\n                {\"x\":0,\"y\":9,\"w\":2,\"h\":3,\"i\":\"18\", static: false},\n                {\"x\":2,\"y\":6,\"w\":2,\"h\":2,\"i\":\"19\", static: false}\n            ],\n            draggable: true,\n            resizable: true,\n            index: 0\n        }\n    },\n    methods: {\n        itemTitle(item) {\n            let result = item.i;\n            if (item.static) {\n                result += \" - Static\";\n            }\n            return result;\n        }\n    }\n}\n</script>\n\n<style scoped>\n.vue-grid-layout {\n    background: #eee;\n}\n\n.vue-grid-item:not(.vue-grid-placeholder) {\n    background: #ccc;\n    border: 1px solid black;\n}\n\n.vue-grid-item .resizing {\n    opacity: 0.9;\n}\n\n.vue-grid-item .static {\n    background: #cce;\n}\n\n.vue-grid-item .text {\n    font-size: 24px;\n    text-align: center;\n    position: absolute;\n    top: 0;\n    bottom: 0;\n    left: 0;\n    right: 0;\n    margin: auto;\n    height: 100%;\n    width: 100%;\n}\n\n.vue-grid-item .no-drag {\n    height: 100%;\n    width: 100%;\n}\n\n.vue-grid-item .minMax {\n    font-size: 12px;\n}\n\n.vue-grid-item .add {\n    cursor: pointer;\n}\n\n.vue-draggable-handle {\n    position: absolute;\n    width: 20px;\n    height: 20px;\n    top: 0;\n    left: 0;\n    background: url(\"data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='10' height='10'><circle cx='5' cy='5' r='5' fill='#999999'/></svg>\") no-repeat;\n    background-position: bottom right;\n    padding: 0 8px 8px 0;\n    background-repeat: no-repeat;\n    background-origin: content-box;\n    box-sizing: border-box;\n    cursor: pointer;\n}\n\n\n</style>\n"
  },
  {
    "path": "website/docs/.vuepress/components/Example02Events.vue",
    "content": "<template>\n    <div>\n        <div ref=\"eventsDiv\" class=\"eventsJSON\">\n            <div v-for=\"event in eventLog\">\n                {{event}}\n            </div>\n        </div>\n        <div style=\"margin-top:10px;\">\n            <grid-layout :layout.sync=\"layout\"\n                         :col-num=\"12\"\n                         :row-height=\"30\"\n                         :is-draggable=\"draggable\"\n                         :is-resizable=\"resizable\"\n                         :vertical-compact=\"true\"\n                         :use-css-transforms=\"true\"\n                         @layout-created=\"layoutCreatedEvent\"\n                         @layout-before-mount=\"layoutBeforeMountEvent\"\n                         @layout-mounted=\"layoutMountedEvent\"\n                         @layout-ready=\"layoutReadyEvent\"\n                         @layout-updated=\"layoutUpdatedEvent\"\n            >\n                <grid-item v-for=\"item in layout\"\n                           :x=\"item.x\"\n                           :y=\"item.y\"\n                           :w=\"item.w\"\n                           :h=\"item.h\"\n                           :i=\"item.i\"\n                           @resize=\"resizeEvent\"\n                           @move=\"moveEvent\"\n                           @resized=\"resizedEvent\"\n                           @container-resized=\"containerResizedEvent\"\n                           @moved=\"movedEvent\"\n                >\n                    <span class=\"text\">{{item.i}}</span>\n                </grid-item>\n            </grid-layout>\n        </div>\n    </div>\n</template>\n\n<script>\nimport { GridLayout, GridItem } from \"vue-grid-layout\"\n\nexport default {\n    components: {\n        GridLayout,\n        GridItem\n    },\n    data() {\n        return {\n            layout: [\n                {\"x\":0,\"y\":0,\"w\":2,\"h\":2,\"i\":\"0\", static: false},\n                {\"x\":2,\"y\":0,\"w\":2,\"h\":4,\"i\":\"1\", static: true},\n                {\"x\":4,\"y\":0,\"w\":2,\"h\":5,\"i\":\"2\", static: false},\n                {\"x\":6,\"y\":0,\"w\":2,\"h\":3,\"i\":\"3\", static: false},\n                {\"x\":8,\"y\":0,\"w\":2,\"h\":3,\"i\":\"4\", static: false},\n                {\"x\":10,\"y\":0,\"w\":2,\"h\":3,\"i\":\"5\", static: false},\n                {\"x\":0,\"y\":5,\"w\":2,\"h\":5,\"i\":\"6\", static: false},\n                {\"x\":2,\"y\":5,\"w\":2,\"h\":5,\"i\":\"7\", static: false},\n                {\"x\":4,\"y\":5,\"w\":2,\"h\":5,\"i\":\"8\", static: false},\n                {\"x\":6,\"y\":3,\"w\":2,\"h\":4,\"i\":\"9\", static: true},\n                {\"x\":8,\"y\":4,\"w\":2,\"h\":4,\"i\":\"10\", static: false},\n                {\"x\":10,\"y\":4,\"w\":2,\"h\":4,\"i\":\"11\", static: false},\n                {\"x\":0,\"y\":10,\"w\":2,\"h\":5,\"i\":\"12\", static: false},\n                {\"x\":2,\"y\":10,\"w\":2,\"h\":5,\"i\":\"13\", static: false},\n                {\"x\":4,\"y\":8,\"w\":2,\"h\":4,\"i\":\"14\", static: false},\n                {\"x\":6,\"y\":8,\"w\":2,\"h\":4,\"i\":\"15\", static: false},\n                {\"x\":8,\"y\":10,\"w\":2,\"h\":5,\"i\":\"16\", static: false},\n                {\"x\":10,\"y\":4,\"w\":2,\"h\":2,\"i\":\"17\", static: false},\n                {\"x\":0,\"y\":9,\"w\":2,\"h\":3,\"i\":\"18\", static: false},\n                {\"x\":2,\"y\":6,\"w\":2,\"h\":2,\"i\":\"19\", static: false}\n            ],\n            draggable: true,\n            resizable: true,\n            index: 0,\n            eventLog: []\n        }\n    },\n    watch: {\n        eventLog: function() {\n            const eventsDiv = this.$refs.eventsDiv;\n            eventsDiv.scrollTop = eventsDiv.scrollHeight;\n        }\n    },\n    methods: {\n        moveEvent: function(i, newX, newY){\n            const msg = \"MOVE i=\" + i + \", X=\" + newX + \", Y=\" + newY;\n            this.eventLog.push(msg);\n            console.log(msg);\n\n        },\n        movedEvent: function(i, newX, newY){\n            const msg = \"MOVED i=\" + i + \", X=\" + newX + \", Y=\" + newY;\n            this.eventLog.push(msg);\n            console.log(msg);\n\n        },\n        resizeEvent: function(i, newH, newW, newHPx, newWPx){\n            const msg = \"RESIZE i=\" + i + \", H=\" + newH + \", W=\" + newW + \", H(px)=\" + newHPx + \", W(px)=\" + newWPx;\n            this.eventLog.push(msg);\n            console.log(msg);\n        },\n        resizedEvent: function(i, newX, newY, newHPx, newWPx){\n            const msg = \"RESIZED i=\" + i + \", X=\" + newX + \", Y=\" + newY + \", H(px)=\" + newHPx + \", W(px)=\" + newWPx;\n            this.eventLog.push(msg);\n            console.log(msg);\n\n        },\n        containerResizedEvent: function(i, newH, newW, newHPx, newWPx){\n            const msg = \"CONTAINER RESIZED i=\" + i + \", H=\" + newH + \", W=\" + newW + \", H(px)=\" + newHPx + \", W(px)=\" + newWPx;\n            this.eventLog.push(msg);\n            console.log(msg);\n        },\n\n        layoutCreatedEvent: function(newLayout){\n            this.eventLog.push(\"Created layout\");\n            console.log(\"Created layout: \", newLayout)\n        },\n        layoutBeforeMountEvent: function(newLayout){\n            this.eventLog.push(\"beforeMount layout\");\n            console.log(\"beforeMount layout: \", newLayout)\n        },\n        layoutMountedEvent: function(newLayout){\n            this.eventLog.push(\"Mounted layout\");\n            console.log(\"Mounted layout: \", newLayout)\n        },\n        layoutReadyEvent: function(newLayout){\n            this.eventLog.push(\"Ready layout\");\n            console.log(\"Ready layout: \", newLayout)\n        },\n        layoutUpdatedEvent: function(newLayout){\n            this.eventLog.push(\"Updated layout\");\n            console.log(\"Updated layout: \", newLayout)\n        },\n    }\n}\n</script>\n\n<style scoped>\n.vue-grid-layout {\n    background: #eee;\n}\n\n.vue-grid-item:not(.vue-grid-placeholder) {\n    background: #ccc;\n    border: 1px solid black;\n}\n\n.vue-grid-item .resizing {\n    opacity: 0.9;\n}\n\n.vue-grid-item .static {\n    background: #cce;\n}\n\n.vue-grid-item .text {\n    font-size: 24px;\n    text-align: center;\n    position: absolute;\n    top: 0;\n    bottom: 0;\n    left: 0;\n    right: 0;\n    margin: auto;\n    height: 100%;\n    width: 100%;\n}\n\n.vue-grid-item .no-drag {\n    height: 100%;\n    width: 100%;\n}\n\n.vue-grid-item .minMax {\n    font-size: 12px;\n}\n\n.vue-grid-item .add {\n    cursor: pointer;\n}\n\n.vue-draggable-handle {\n    position: absolute;\n    width: 20px;\n    height: 20px;\n    top: 0;\n    left: 0;\n    background: url(\"data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='10' height='10'><circle cx='5' cy='5' r='5' fill='#999999'/></svg>\") no-repeat;\n    background-position: bottom right;\n    padding: 0 8px 8px 0;\n    background-repeat: no-repeat;\n    background-origin: content-box;\n    box-sizing: border-box;\n    cursor: pointer;\n}\n\n.layoutJSON {\n    background: #ddd;\n    border: 1px solid black;\n    margin-top: 10px;\n    padding: 10px;\n}\n\n.eventsJSON {\n    background: #ddd;\n    border: 1px solid black;\n    margin-top: 10px;\n    padding: 10px;\n    height: 100px;\n    overflow-y: scroll;\n}\n</style>\n"
  },
  {
    "path": "website/docs/.vuepress/components/Example03MultipleGrids.vue",
    "content": "<template>\n    <div>\n        <div style=\"margin-top:10px;\">\n            <h4>Grid #1</h4>\n            <grid-layout :layout.sync=\"layout\"\n                         :col-num=\"12\"\n                         :row-height=\"30\"\n                         :is-draggable=\"true\"\n                         :is-resizable=\"true\"\n                         :vertical-compact=\"true\"\n                         :use-css-transforms=\"true\"\n            >\n                <grid-item v-for=\"item in layout\"\n                           :x=\"item.x\"\n                           :y=\"item.y\"\n                           :w=\"item.w\"\n                           :h=\"item.h\"\n                           :i=\"item.i\"\n                >\n                    <span class=\"text\">{{item.i}}</span>\n                </grid-item>\n            </grid-layout>\n        </div>\n        <div style=\"margin-top:10px;\">\n            <h4>Grid #2</h4>\n            <grid-layout :layout=\"layout2\"\n                         :col-num=\"12\"\n                         :row-height=\"30\"\n                         :is-draggable=\"true\"\n                         :is-resizable=\"true\"\n                         :vertical-compact=\"true\"\n                         :use-css-transforms=\"true\"\n            >\n                <grid-item v-for=\"item in layout2\"\n                           :x=\"item.x\"\n                           :y=\"item.y\"\n                           :w=\"item.w\"\n                           :h=\"item.h\"\n                           :i=\"item.i\"\n                >\n                    <span class=\"text\">{{item.i}}</span>\n                </grid-item>\n            </grid-layout>\n        </div>\n    </div>\n</template>\n\n<script>\nimport { GridLayout, GridItem } from \"vue-grid-layout\"\n\nexport default {\n    components: {\n        GridLayout,\n        GridItem\n    },\n    data() {\n        return {\n            layout: [\n                {\"x\":0,\"y\":0,\"w\":2,\"h\":2,\"i\":\"0\"},\n                {\"x\":2,\"y\":0,\"w\":2,\"h\":4,\"i\":\"1\"},\n            ],\n            layout2: [\n                {\"x\":0,\"y\":0,\"w\":2,\"h\":2,\"i\":\"0\"},\n                {\"x\":2,\"y\":0,\"w\":2,\"h\":4,\"i\":\"1\"},\n                {\"x\":4,\"y\":0,\"w\":2,\"h\":2,\"i\":\"2\"},\n            ],\n            draggable: true,\n            resizable: true,\n            index: 0,\n            eventLog: []\n        }\n    },\n    watch: {\n        eventLog: function() {\n            const eventsDiv = this.$refs.eventsDiv;\n            eventsDiv.scrollTop = eventsDiv.scrollHeight;\n        }\n    },\n    methods: {\n        moveEvent: function(i, newX, newY){\n            const msg = \"MOVE i=\" + i + \", X=\" + newX + \", Y=\" + newY;\n            this.eventLog.push(msg);\n            console.log(msg);\n\n        },\n        movedEvent: function(i, newX, newY){\n            const msg = \"MOVED i=\" + i + \", X=\" + newX + \", Y=\" + newY;\n            this.eventLog.push(msg);\n            console.log(msg);\n\n        },\n        resizeEvent: function(i, newH, newW, newHPx, newWPx){\n            const msg = \"RESIZE i=\" + i + \", H=\" + newH + \", W=\" + newW + \", H(px)=\" + newHPx + \", W(px)=\" + newWPx;\n            this.eventLog.push(msg);\n            console.log(msg);\n        },\n        resizedEvent: function(i, newX, newY, newHPx, newWPx){\n            const msg = \"RESIZED i=\" + i + \", X=\" + newX + \", Y=\" + newY + \", H(px)=\" + newHPx + \", W(px)=\" + newWPx;\n            this.eventLog.push(msg);\n            console.log(msg);\n\n        },\n        containerResizedEvent: function(i, newH, newW, newHPx, newWPx){\n            const msg = \"CONTAINER RESIZED i=\" + i + \", H=\" + newH + \", W=\" + newW + \", H(px)=\" + newHPx + \", W(px)=\" + newWPx;\n            this.eventLog.push(msg);\n            console.log(msg);\n        },\n\n        layoutCreatedEvent: function(newLayout){\n            this.eventLog.push(\"Created layout\");\n            console.log(\"Created layout: \", newLayout)\n        },\n        layoutBeforeMountEvent: function(newLayout){\n            this.eventLog.push(\"beforeMount layout\");\n            console.log(\"beforeMount layout: \", newLayout)\n        },\n        layoutMountedEvent: function(newLayout){\n            this.eventLog.push(\"Mounted layout\");\n            console.log(\"Mounted layout: \", newLayout)\n        },\n        layoutReadyEvent: function(newLayout){\n            this.eventLog.push(\"Ready layout\");\n            console.log(\"Ready layout: \", newLayout)\n        },\n        layoutUpdatedEvent: function(newLayout){\n            this.eventLog.push(\"Updated layout\");\n            console.log(\"Updated layout: \", newLayout)\n        },\n    }\n}\n</script>\n\n<style scoped>\n.vue-grid-layout {\n    background: #eee;\n}\n\n.vue-grid-item:not(.vue-grid-placeholder) {\n    background: #ccc;\n    border: 1px solid black;\n}\n\n.vue-grid-item .resizing {\n    opacity: 0.9;\n}\n\n.vue-grid-item .static {\n    background: #cce;\n}\n\n.vue-grid-item .text {\n    font-size: 24px;\n    text-align: center;\n    position: absolute;\n    top: 0;\n    bottom: 0;\n    left: 0;\n    right: 0;\n    margin: auto;\n    height: 100%;\n    width: 100%;\n}\n\n.vue-grid-item .no-drag {\n    height: 100%;\n    width: 100%;\n}\n\n.vue-grid-item .minMax {\n    font-size: 12px;\n}\n\n.vue-grid-item .add {\n    cursor: pointer;\n}\n\n.vue-draggable-handle {\n    position: absolute;\n    width: 20px;\n    height: 20px;\n    top: 0;\n    left: 0;\n    background: url(\"data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='10' height='10'><circle cx='5' cy='5' r='5' fill='#999999'/></svg>\") no-repeat;\n    background-position: bottom right;\n    padding: 0 8px 8px 0;\n    background-repeat: no-repeat;\n    background-origin: content-box;\n    box-sizing: border-box;\n    cursor: pointer;\n}\n\n.layoutJSON {\n    background: #ddd;\n    border: 1px solid black;\n    margin-top: 10px;\n    padding: 10px;\n}\n\n.eventsJSON {\n    background: #ddd;\n    border: 1px solid black;\n    margin-top: 10px;\n    padding: 10px;\n    height: 100px;\n    overflow-y: scroll;\n}\n</style>\n"
  },
  {
    "path": "website/docs/.vuepress/components/Example04AllowIgnore.vue",
    "content": "<template>\n    <div>\n        <grid-layout :layout.sync=\"layout\"\n                     :col-num=\"12\"\n                     :row-height=\"30\"\n                     :is-draggable=\"true\"\n                     :is-resizable=\"true\"\n                     :vertical-compact=\"true\"\n                     :use-css-transforms=\"true\"\n        >\n            <grid-item v-for=\"item in layout\"\n                       :x=\"item.x\"\n                       :y=\"item.y\"\n                       :w=\"item.w\"\n                       :h=\"item.h\"\n                       :i=\"item.i\"\n                       drag-allow-from=\".vue-draggable-handle\"\n                       drag-ignore-from=\".no-drag\"\n            >\n                <div class=\"text\">\n                    <div class=\"vue-draggable-handle\"></div>\n                    <div class=\"no-drag\">\n                        <span>{{item.i}}</span>\n                        <br/>\n                        <button>click</button>\n                    </div>\n                </div>\n            </grid-item>\n        </grid-layout>\n    </div>\n</template>\n\n<script>\nimport { GridLayout, GridItem } from \"vue-grid-layout\"\n\nexport default {\n    components: {\n        GridLayout,\n        GridItem\n    },\n    data() {\n        return {\n            layout: [\n                {\"x\":0,\"y\":0,\"w\":2,\"h\":2,\"i\":\"0\"},\n                {\"x\":2,\"y\":0,\"w\":2,\"h\":4,\"i\":\"1\"},\n                {\"x\":4,\"y\":0,\"w\":2,\"h\":5,\"i\":\"2\"},\n                {\"x\":6,\"y\":0,\"w\":2,\"h\":3,\"i\":\"3\"},\n                {\"x\":8,\"y\":0,\"w\":2,\"h\":3,\"i\":\"4\"},\n                {\"x\":10,\"y\":0,\"w\":2,\"h\":3,\"i\":\"5\"},\n                {\"x\":0,\"y\":5,\"w\":2,\"h\":5,\"i\":\"6\"},\n                {\"x\":2,\"y\":5,\"w\":2,\"h\":5,\"i\":\"7\"},\n                {\"x\":4,\"y\":5,\"w\":2,\"h\":5,\"i\":\"8\"},\n                {\"x\":6,\"y\":4,\"w\":2,\"h\":4,\"i\":\"9\"},\n                {\"x\":8,\"y\":4,\"w\":2,\"h\":4,\"i\":\"10\"},\n                {\"x\":10,\"y\":4,\"w\":2,\"h\":4,\"i\":\"11\"},\n                {\"x\":0,\"y\":10,\"w\":2,\"h\":5,\"i\":\"12\"},\n                {\"x\":2,\"y\":10,\"w\":2,\"h\":5,\"i\":\"13\"},\n                {\"x\":4,\"y\":8,\"w\":2,\"h\":4,\"i\":\"14\"},\n                {\"x\":6,\"y\":8,\"w\":2,\"h\":4,\"i\":\"15\"},\n                {\"x\":8,\"y\":10,\"w\":2,\"h\":5,\"i\":\"16\"},\n                {\"x\":10,\"y\":4,\"w\":2,\"h\":2,\"i\":\"17\"},\n                {\"x\":0,\"y\":9,\"w\":2,\"h\":3,\"i\":\"18\"},\n                {\"x\":2,\"y\":6,\"w\":2,\"h\":2,\"i\":\"19\"}\n            ],\n            draggable: true,\n            resizable: true,\n            index: 0,\n            eventLog: []\n        }\n    },\n    watch: {\n        eventLog: function() {\n            const eventsDiv = this.$refs.eventsDiv;\n            eventsDiv.scrollTop = eventsDiv.scrollHeight;\n        }\n    },\n    methods: {\n        moveEvent: function(i, newX, newY){\n            const msg = \"MOVE i=\" + i + \", X=\" + newX + \", Y=\" + newY;\n            this.eventLog.push(msg);\n            console.log(msg);\n\n        },\n        movedEvent: function(i, newX, newY){\n            const msg = \"MOVED i=\" + i + \", X=\" + newX + \", Y=\" + newY;\n            this.eventLog.push(msg);\n            console.log(msg);\n\n        },\n        resizeEvent: function(i, newH, newW, newHPx, newWPx){\n            const msg = \"RESIZE i=\" + i + \", H=\" + newH + \", W=\" + newW + \", H(px)=\" + newHPx + \", W(px)=\" + newWPx;\n            this.eventLog.push(msg);\n            console.log(msg);\n        },\n        resizedEvent: function(i, newX, newY, newHPx, newWPx){\n            const msg = \"RESIZED i=\" + i + \", X=\" + newX + \", Y=\" + newY + \", H(px)=\" + newHPx + \", W(px)=\" + newWPx;\n            this.eventLog.push(msg);\n            console.log(msg);\n\n        },\n        containerResizedEvent: function(i, newH, newW, newHPx, newWPx){\n            const msg = \"CONTAINER RESIZED i=\" + i + \", H=\" + newH + \", W=\" + newW + \", H(px)=\" + newHPx + \", W(px)=\" + newWPx;\n            this.eventLog.push(msg);\n            console.log(msg);\n        },\n\n        layoutCreatedEvent: function(newLayout){\n            this.eventLog.push(\"Created layout\");\n            console.log(\"Created layout: \", newLayout)\n        },\n        layoutBeforeMountEvent: function(newLayout){\n            this.eventLog.push(\"beforeMount layout\");\n            console.log(\"beforeMount layout: \", newLayout)\n        },\n        layoutMountedEvent: function(newLayout){\n            this.eventLog.push(\"Mounted layout\");\n            console.log(\"Mounted layout: \", newLayout)\n        },\n        layoutReadyEvent: function(newLayout){\n            this.eventLog.push(\"Ready layout\");\n            console.log(\"Ready layout: \", newLayout)\n        },\n        layoutUpdatedEvent: function(newLayout){\n            this.eventLog.push(\"Updated layout\");\n            console.log(\"Updated layout: \", newLayout)\n        },\n    }\n}\n</script>\n\n<style scoped>\n.vue-grid-layout {\n    background: #eee;\n}\n\n.vue-grid-item:not(.vue-grid-placeholder) {\n    background: #ccc;\n    border: 1px solid black;\n}\n\n.vue-grid-item .resizing {\n    opacity: 0.9;\n}\n\n.vue-grid-item .static {\n    background: #cce;\n}\n\n.vue-grid-item .text {\n    font-size: 24px;\n    text-align: center;\n    position: absolute;\n    top: 0;\n    bottom: 0;\n    left: 0;\n    right: 0;\n    margin: auto;\n    height: 100%;\n    width: 100%;\n}\n\n.vue-grid-item .no-drag {\n    height: 100%;\n    width: 100%;\n}\n\n.vue-grid-item .minMax {\n    font-size: 12px;\n}\n\n.vue-grid-item .add {\n    cursor: pointer;\n}\n\n.vue-draggable-handle {\n    position: absolute;\n    width: 20px;\n    height: 20px;\n    top: 0;\n    right: 0;\n    padding: 0 8px 8px 0;\n    background-origin: content-box;\n    background-color: black;\n    box-sizing: border-box;\n    border-radius: 10px;\n    cursor: pointer;\n}\n\n.layoutJSON {\n    background: #ddd;\n    border: 1px solid black;\n    margin-top: 10px;\n    padding: 10px;\n}\n\n.eventsJSON {\n    background: #ddd;\n    border: 1px solid black;\n    margin-top: 10px;\n    padding: 10px;\n    height: 100px;\n    overflow-y: scroll;\n}\n</style>\n"
  },
  {
    "path": "website/docs/.vuepress/components/Example05Mirrored.vue",
    "content": "<template>\n    <div>\n        <input type=\"checkbox\" v-model=\"draggable\"/> Draggable\n        <input type=\"checkbox\" v-model=\"resizable\"/> Resizable\n        <input type=\"checkbox\" v-model=\"mirrored\"/> Mirrored\n        <br/>\n        <grid-layout :layout.sync=\"layout\"\n                     :col-num=\"12\"\n                     :row-height=\"30\"\n                     :is-draggable=\"draggable\"\n                     :is-resizable=\"resizable\"\n                     :is-mirrored=\"mirrored\"\n                     :vertical-compact=\"true\"\n                     :use-css-transforms=\"true\"\n        >\n            <grid-item v-for=\"item in layout\"\n                       :static=\"item.static\"\n                       :x=\"item.x\"\n                       :y=\"item.y\"\n                       :w=\"item.w\"\n                       :h=\"item.h\"\n                       :i=\"item.i\"\n            >\n                <span class=\"text\">{{item.i}}</span>\n            </grid-item>\n        </grid-layout>\n    </div>\n</template>\n\n<script>\nimport { GridLayout, GridItem } from \"vue-grid-layout\"\n\nexport default {\n    components: {\n        GridLayout,\n        GridItem\n    },\n    data() {\n        return {\n            layout: [\n                {\"x\":0,\"y\":0,\"w\":2,\"h\":2,\"i\":\"0\", static: false},\n                {\"x\":2,\"y\":0,\"w\":2,\"h\":4,\"i\":\"1\", static: true},\n                {\"x\":4,\"y\":0,\"w\":2,\"h\":5,\"i\":\"2\", static: false},\n                {\"x\":6,\"y\":0,\"w\":2,\"h\":3,\"i\":\"3\", static: false},\n                {\"x\":8,\"y\":0,\"w\":2,\"h\":3,\"i\":\"4\", static: false},\n                {\"x\":10,\"y\":0,\"w\":2,\"h\":3,\"i\":\"5\", static: false},\n                {\"x\":0,\"y\":5,\"w\":2,\"h\":5,\"i\":\"6\", static: false},\n                {\"x\":2,\"y\":5,\"w\":2,\"h\":5,\"i\":\"7\", static: false},\n                {\"x\":4,\"y\":5,\"w\":2,\"h\":5,\"i\":\"8\", static: false},\n                {\"x\":6,\"y\":3,\"w\":2,\"h\":4,\"i\":\"9\", static: true},\n                {\"x\":8,\"y\":4,\"w\":2,\"h\":4,\"i\":\"10\", static: false},\n                {\"x\":10,\"y\":4,\"w\":2,\"h\":4,\"i\":\"11\", static: false},\n                {\"x\":0,\"y\":10,\"w\":2,\"h\":5,\"i\":\"12\", static: false},\n                {\"x\":2,\"y\":10,\"w\":2,\"h\":5,\"i\":\"13\", static: false},\n                {\"x\":4,\"y\":8,\"w\":2,\"h\":4,\"i\":\"14\", static: false},\n                {\"x\":6,\"y\":8,\"w\":2,\"h\":4,\"i\":\"15\", static: false},\n                {\"x\":8,\"y\":10,\"w\":2,\"h\":5,\"i\":\"16\", static: false},\n                {\"x\":10,\"y\":4,\"w\":2,\"h\":2,\"i\":\"17\", static: false},\n                {\"x\":0,\"y\":9,\"w\":2,\"h\":3,\"i\":\"18\", static: false},\n                {\"x\":2,\"y\":6,\"w\":2,\"h\":2,\"i\":\"19\", static: false}\n            ],\n            draggable: true,\n            resizable: true,\n            mirrored: true,\n            index: 0\n        }\n    },\n    methods: {\n    }\n}\n</script>\n\n<style scoped>\n.vue-grid-layout {\n    background: #eee;\n}\n\n.vue-grid-item:not(.vue-grid-placeholder) {\n    background: #ccc;\n    border: 1px solid black;\n}\n\n.vue-grid-item .resizing {\n    opacity: 0.9;\n}\n\n.vue-grid-item .static {\n    background: #cce;\n}\n\n.vue-grid-item .text {\n    font-size: 24px;\n    text-align: center;\n    position: absolute;\n    top: 0;\n    bottom: 0;\n    left: 0;\n    right: 0;\n    margin: auto;\n    height: 100%;\n    width: 100%;\n}\n\n.vue-grid-item .no-drag {\n    height: 100%;\n    width: 100%;\n}\n\n.vue-grid-item .minMax {\n    font-size: 12px;\n}\n\n.vue-grid-item .add {\n    cursor: pointer;\n}\n\n.vue-draggable-handle {\n    position: absolute;\n    width: 20px;\n    height: 20px;\n    top: 0;\n    left: 0;\n    background: url(\"data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='10' height='10'><circle cx='5' cy='5' r='5' fill='#999999'/></svg>\") no-repeat;\n    background-position: bottom right;\n    padding: 0 8px 8px 0;\n    background-repeat: no-repeat;\n    background-origin: content-box;\n    box-sizing: border-box;\n    cursor: pointer;\n}\n\n\n</style>\n"
  },
  {
    "path": "website/docs/.vuepress/components/Example06Responsive.vue",
    "content": "<template>\n    <div style=\"width:100%;height:2000px;\">\n        <div class=\"layoutJSON\">\n            Displayed as <code>[x, y, w, h]</code>:\n            <div class=\"columns\">\n                <div v-for=\"item in layout\">\n                    <b>{{item.i}}</b>: [{{item.x}}, {{item.y}}, {{item.w}}, {{item.h}}]\n                </div>\n            </div>\n        </div>\n        <hr/>\n        <input type=\"checkbox\" v-model=\"draggable\"/> Draggable\n        <input type=\"checkbox\" v-model=\"resizable\"/> Resizable\n        <input type=\"checkbox\" v-model=\"responsive\"/> Responsive\n        <br/>\n        <div style=\"width:100%;margin-top: 10px;height:100%;\">\n            <grid-layout :layout.sync=\"layout\"\n                         :col-num=\"12\"\n                         :row-height=\"30\"\n                         :is-draggable=\"draggable\"\n                         :is-resizable=\"resizable\"\n                         :responsive=\"responsive\"\n                         :vertical-compact=\"true\"\n                         :use-css-transforms=\"true\"\n            >\n                <grid-item v-for=\"item in layout\"\n                           :static=\"item.static\"\n                           :x=\"item.x\"\n                           :y=\"item.y\"\n                           :w=\"item.w\"\n                           :h=\"item.h\"\n                           :i=\"item.i\"\n                >\n                    <span class=\"text\">{{item.i}}</span>\n                </grid-item>\n            </grid-layout>\n        </div>\n    </div>\n</template>\n\n<script>\nimport { GridLayout, GridItem } from \"vue-grid-layout\"\n\nexport default {\n    components: {\n        GridLayout,\n        GridItem\n    },\n    data() {\n        return {\n            layout: [\n                {\"x\":0,\"y\":0,\"w\":2,\"h\":2,\"i\":\"0\"},\n                {\"x\":2,\"y\":0,\"w\":2,\"h\":4,\"i\":\"1\"},\n                {\"x\":4,\"y\":0,\"w\":2,\"h\":5,\"i\":\"2\"},\n                {\"x\":6,\"y\":0,\"w\":2,\"h\":3,\"i\":\"3\"},\n                {\"x\":8,\"y\":0,\"w\":2,\"h\":3,\"i\":\"4\"},\n                {\"x\":10,\"y\":0,\"w\":2,\"h\":3,\"i\":\"5\"},\n                {\"x\":0,\"y\":5,\"w\":2,\"h\":5,\"i\":\"6\"},\n                {\"x\":2,\"y\":5,\"w\":2,\"h\":5,\"i\":\"7\"},\n                {\"x\":4,\"y\":5,\"w\":2,\"h\":5,\"i\":\"8\"},\n                {\"x\":6,\"y\":4,\"w\":2,\"h\":4,\"i\":\"9\"},\n                {\"x\":8,\"y\":4,\"w\":2,\"h\":4,\"i\":\"10\"},\n                {\"x\":10,\"y\":4,\"w\":2,\"h\":4,\"i\":\"11\"},\n                {\"x\":0,\"y\":10,\"w\":2,\"h\":5,\"i\":\"12\"},\n                {\"x\":2,\"y\":10,\"w\":2,\"h\":5,\"i\":\"13\"},\n                {\"x\":4,\"y\":8,\"w\":2,\"h\":4,\"i\":\"14\"},\n                {\"x\":6,\"y\":8,\"w\":2,\"h\":4,\"i\":\"15\"},\n                {\"x\":8,\"y\":10,\"w\":2,\"h\":5,\"i\":\"16\"},\n                {\"x\":10,\"y\":4,\"w\":2,\"h\":2,\"i\":\"17\"},\n                {\"x\":0,\"y\":9,\"w\":2,\"h\":3,\"i\":\"18\"},\n                {\"x\":2,\"y\":6,\"w\":2,\"h\":2,\"i\":\"19\"}\n            ],\n            draggable: true,\n            resizable: true,\n            responsive: true,\n            index: 0\n        }\n    },\n    methods: {\n    }\n}\n</script>\n\n<style scoped>\n.vue-grid-layout {\n    background: #eee;\n}\n\n.vue-grid-item:not(.vue-grid-placeholder) {\n    background: #ccc;\n    border: 1px solid black;\n}\n\n.vue-grid-item .resizing {\n    opacity: 0.9;\n}\n\n.vue-grid-item .static {\n    background: #cce;\n}\n\n.vue-grid-item .text {\n    font-size: 24px;\n    text-align: center;\n    position: absolute;\n    top: 0;\n    bottom: 0;\n    left: 0;\n    right: 0;\n    margin: auto;\n    height: 100%;\n    width: 100%;\n}\n\n.vue-grid-item .no-drag {\n    height: 100%;\n    width: 100%;\n}\n\n.vue-grid-item .minMax {\n    font-size: 12px;\n}\n\n.vue-grid-item .add {\n    cursor: pointer;\n}\n\n.vue-draggable-handle {\n    position: absolute;\n    width: 20px;\n    height: 20px;\n    top: 0;\n    left: 0;\n    background: url(\"data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='10' height='10'><circle cx='5' cy='5' r='5' fill='#999999'/></svg>\") no-repeat;\n    background-position: bottom right;\n    padding: 0 8px 8px 0;\n    background-repeat: no-repeat;\n    background-origin: content-box;\n    box-sizing: border-box;\n    cursor: pointer;\n}\n\n.layoutJSON {\n    background: #ddd;\n    border: 1px solid black;\n    margin-top: 10px;\n    padding: 10px;\n}\n\n.columns {\n    -moz-columns: 120px;\n    -webkit-columns: 120px;\n    columns: 120px;\n}\n\n</style>\n"
  },
  {
    "path": "website/docs/.vuepress/components/Example07PreventCollision.vue",
    "content": "<template>\n    <div>\n        <grid-layout :layout.sync=\"layout\"\n                     :col-num=\"12\"\n                     :row-height=\"30\"\n                     :is-draggable=\"draggable\"\n                     :is-resizable=\"resizable\"\n                     :responsive=\"false\"\n                     :vertical-compact=\"false\"\n                     :prevent-collision=\"true\"\n                     :use-css-transforms=\"true\"\n        >\n            <grid-item v-for=\"item in layout\"\n                       :static=\"item.static\"\n                       :x=\"item.x\"\n                       :y=\"item.y\"\n                       :w=\"item.w\"\n                       :h=\"item.h\"\n                       :i=\"item.i\"\n            >\n                <span class=\"text\">{{item.i}}</span>\n            </grid-item>\n        </grid-layout>\n    </div>\n</template>\n\n<script>\nimport { GridLayout, GridItem } from \"vue-grid-layout\"\n\nexport default {\n    components: {\n        GridLayout,\n        GridItem\n    },\n    data() {\n        return {\n            layout: [\n                {\"x\":0,\"y\":0,\"w\":2,\"h\":2,\"i\":\"0\", static: false},\n                {\"x\":2,\"y\":0,\"w\":2,\"h\":4,\"i\":\"1\", static: true},\n                {\"x\":4,\"y\":0,\"w\":2,\"h\":5,\"i\":\"2\", static: false},\n                {\"x\":6,\"y\":0,\"w\":2,\"h\":3,\"i\":\"3\", static: false},\n                {\"x\":8,\"y\":0,\"w\":2,\"h\":3,\"i\":\"4\", static: false},\n                {\"x\":10,\"y\":0,\"w\":2,\"h\":3,\"i\":\"5\", static: false},\n                {\"x\":0,\"y\":5,\"w\":2,\"h\":5,\"i\":\"6\", static: false},\n                {\"x\":2,\"y\":5,\"w\":2,\"h\":5,\"i\":\"7\", static: false},\n                {\"x\":4,\"y\":5,\"w\":2,\"h\":5,\"i\":\"8\", static: false},\n                {\"x\":6,\"y\":3,\"w\":2,\"h\":4,\"i\":\"9\", static: true},\n                {\"x\":8,\"y\":4,\"w\":2,\"h\":4,\"i\":\"10\", static: false},\n                {\"x\":10,\"y\":4,\"w\":2,\"h\":4,\"i\":\"11\", static: false},\n                {\"x\":0,\"y\":10,\"w\":2,\"h\":5,\"i\":\"12\", static: false},\n                {\"x\":2,\"y\":10,\"w\":2,\"h\":5,\"i\":\"13\", static: false},\n                {\"x\":4,\"y\":8,\"w\":2,\"h\":4,\"i\":\"14\", static: false},\n                {\"x\":6,\"y\":8,\"w\":2,\"h\":4,\"i\":\"15\", static: false},\n                {\"x\":8,\"y\":10,\"w\":2,\"h\":5,\"i\":\"16\", static: false},\n                {\"x\":10,\"y\":4,\"w\":2,\"h\":2,\"i\":\"17\", static: false},\n                {\"x\":0,\"y\":9,\"w\":2,\"h\":3,\"i\":\"18\", static: false},\n                {\"x\":2,\"y\":6,\"w\":2,\"h\":2,\"i\":\"19\", static: false}\n            ],\n            draggable: true,\n            resizable: true,\n        }\n    },\n    methods: {\n    }\n}\n</script>\n\n<style scoped>\n.vue-grid-layout {\n    background: #eee;\n}\n\n.vue-grid-item:not(.vue-grid-placeholder) {\n    background: #ccc;\n    border: 1px solid black;\n}\n\n.vue-grid-item .resizing {\n    opacity: 0.9;\n}\n\n.vue-grid-item .static {\n    background: #cce;\n}\n\n.vue-grid-item .text {\n    font-size: 24px;\n    text-align: center;\n    position: absolute;\n    top: 0;\n    bottom: 0;\n    left: 0;\n    right: 0;\n    margin: auto;\n    height: 100%;\n    width: 100%;\n}\n\n.vue-grid-item .no-drag {\n    height: 100%;\n    width: 100%;\n}\n\n.vue-grid-item .minMax {\n    font-size: 12px;\n}\n\n.vue-grid-item .add {\n    cursor: pointer;\n}\n\n.vue-draggable-handle {\n    position: absolute;\n    width: 20px;\n    height: 20px;\n    top: 0;\n    left: 0;\n    background: url(\"data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='10' height='10'><circle cx='5' cy='5' r='5' fill='#999999'/></svg>\") no-repeat;\n    background-position: bottom right;\n    padding: 0 8px 8px 0;\n    background-repeat: no-repeat;\n    background-origin: content-box;\n    box-sizing: border-box;\n    cursor: pointer;\n}\n\n\n</style>\n"
  },
  {
    "path": "website/docs/.vuepress/components/Example08ResponsivePredefinedLayouts.vue",
    "content": "<template>\n    <div>\n        <grid-layout :layout.sync=\"layout\"\n                     :responsive-layouts=\"layouts\"\n                     :col-num=\"12\"\n                     :row-height=\"30\"\n                     :is-draggable=\"draggable\"\n                     :is-resizable=\"resizable\"\n                     :vertical-compact=\"true\"\n                     :use-css-transforms=\"true\"\n                     :responsive=\"responsive\"\n                     @breakpoint-changed=\"breakpointChangedEvent\"\n        >\n            <grid-item v-for=\"item in layout\"\n                       :x=\"item.x\"\n                       :y=\"item.y\"\n                       :w=\"item.w\"\n                       :h=\"item.h\"\n                       :i=\"item.i\"\n            >\n                <span class=\"text\">{{item.i}}</span>\n            </grid-item>\n        </grid-layout>\n    </div>\n</template>\n\n<script>\nimport { GridLayout, GridItem } from \"vue-grid-layout\"\n\nlet testLayouts = {\n    md: [\n        {\"x\":0, \"y\":0, \"w\":2, \"h\":2, \"i\":\"0\"},\n        {\"x\":2, \"y\":0, \"w\":2, \"h\":4, \"i\":\"1\"},\n        {\"x\":4, \"y\":0, \"w\":2, \"h\":5, \"i\":\"2\"},\n        {\"x\":6, \"y\":0, \"w\":2, \"h\":3, \"i\":\"3\"},\n        {\"x\":2, \"y\":4, \"w\":2, \"h\":3, \"i\":\"4\"},\n        {\"x\":4, \"y\":5, \"w\":2, \"h\":3, \"i\":\"5\"},\n        {\"x\":0, \"y\":2, \"w\":2, \"h\":5, \"i\":\"6\"},\n        {\"x\":2, \"y\":7, \"w\":2, \"h\":5, \"i\":\"7\"},\n        {\"x\":4, \"y\":8, \"w\":2, \"h\":5, \"i\":\"8\"},\n        {\"x\":6, \"y\":3, \"w\":2, \"h\":4, \"i\":\"9\"},\n        {\"x\":0, \"y\":7, \"w\":2, \"h\":4, \"i\":\"10\"},\n        {\"x\":2, \"y\":19, \"w\":2, \"h\":4, \"i\":\"11\"},\n        {\"x\":0, \"y\":14, \"w\":2, \"h\":5, \"i\":\"12\"},\n        {\"x\":2, \"y\":14, \"w\":2, \"h\":5, \"i\":\"13\"},\n        {\"x\":4, \"y\":13, \"w\":2, \"h\":4, \"i\":\"14\"},\n        {\"x\":6, \"y\":7, \"w\":2, \"h\":4, \"i\":\"15\"},\n        {\"x\":0, \"y\":19, \"w\":2, \"h\":5, \"i\":\"16\"},\n        {\"x\":8, \"y\":0, \"w\":2, \"h\":2, \"i\":\"17\"},\n        {\"x\":0, \"y\":11, \"w\":2, \"h\":3, \"i\":\"18\"},\n        {\"x\":2, \"y\":12, \"w\":2, \"h\":2, \"i\":\"19\"}\n    ],\n    lg: [\n        {\"x\":0,\"y\":0,\"w\":2,\"h\":2,\"i\":\"0\"},\n        {\"x\":2,\"y\":0,\"w\":2,\"h\":4,\"i\":\"1\"},\n        {\"x\":4,\"y\":0,\"w\":2,\"h\":5,\"i\":\"2\"},\n        {\"x\":6,\"y\":0,\"w\":2,\"h\":3,\"i\":\"3\"},\n        {\"x\":8,\"y\":0,\"w\":2,\"h\":3,\"i\":\"4\"},\n        {\"x\":10,\"y\":0,\"w\":2,\"h\":3,\"i\":\"5\"},\n        {\"x\":0,\"y\":5,\"w\":2,\"h\":5,\"i\":\"6\"},\n        {\"x\":2,\"y\":5,\"w\":2,\"h\":5,\"i\":\"7\"},\n        {\"x\":4,\"y\":5,\"w\":2,\"h\":5,\"i\":\"8\"},\n        {\"x\":6,\"y\":4,\"w\":2,\"h\":4,\"i\":\"9\"},\n        {\"x\":8,\"y\":4,\"w\":2,\"h\":4,\"i\":\"10\"},\n        {\"x\":10,\"y\":4,\"w\":2,\"h\":4,\"i\":\"11\"},\n        {\"x\":0,\"y\":10,\"w\":2,\"h\":5,\"i\":\"12\"},\n        {\"x\":2,\"y\":10,\"w\":2,\"h\":5,\"i\":\"13\"},\n        {\"x\":4,\"y\":8,\"w\":2,\"h\":4,\"i\":\"14\"},\n        {\"x\":6,\"y\":8,\"w\":2,\"h\":4,\"i\":\"15\"},\n        {\"x\":8,\"y\":10,\"w\":2,\"h\":5,\"i\":\"16\"},\n        {\"x\":10,\"y\":4,\"w\":2,\"h\":2,\"i\":\"17\"},\n        {\"x\":0,\"y\":9,\"w\":2,\"h\":3,\"i\":\"18\"},\n        {\"x\":2,\"y\":6,\"w\":2,\"h\":2,\"i\":\"19\"}\n    ],\n};\n\nexport default {\n    components: {\n        GridLayout,\n        GridItem\n    },\n    data() {\n        return {\n            layouts: testLayouts,\n            layout: testLayouts[\"lg\"],\n            draggable: true,\n            resizable: true,\n            responsive: true,\n        }\n    },\n    methods: {\n        breakpointChangedEvent: function(newBreakpoint, newLayout){\n            console.log(\"BREAKPOINT CHANGED breakpoint=\", newBreakpoint, \", layout: \", newLayout );\n        }\n    }\n}\n</script>\n\n<style scoped>\n.vue-grid-layout {\n    background: #eee;\n}\n\n.vue-grid-item:not(.vue-grid-placeholder) {\n    background: #ccc;\n    border: 1px solid black;\n}\n\n.vue-grid-item .resizing {\n    opacity: 0.9;\n}\n\n.vue-grid-item .static {\n    background: #cce;\n}\n\n.vue-grid-item .text {\n    font-size: 24px;\n    text-align: center;\n    position: absolute;\n    top: 0;\n    bottom: 0;\n    left: 0;\n    right: 0;\n    margin: auto;\n    height: 100%;\n    width: 100%;\n}\n\n.vue-grid-item .no-drag {\n    height: 100%;\n    width: 100%;\n}\n\n.vue-grid-item .minMax {\n    font-size: 12px;\n}\n\n.vue-grid-item .add {\n    cursor: pointer;\n}\n\n.vue-draggable-handle {\n    position: absolute;\n    width: 20px;\n    height: 20px;\n    top: 0;\n    left: 0;\n    background: url(\"data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='10' height='10'><circle cx='5' cy='5' r='5' fill='#999999'/></svg>\") no-repeat;\n    background-position: bottom right;\n    padding: 0 8px 8px 0;\n    background-repeat: no-repeat;\n    background-origin: content-box;\n    box-sizing: border-box;\n    cursor: pointer;\n}\n\n\n</style>\n"
  },
  {
    "path": "website/docs/.vuepress/components/Example09DynamicAddRemove.vue",
    "content": "<template>\n    <div>\n        <div class=\"layoutJSON\">\n            Displayed as <code>[x, y, w, h]</code>:\n            <div class=\"columns\">\n                <div class=\"layoutItem\" v-for=\"item in layout\" :key=\"item.i\">\n                    <b>{{item.i}}</b>: [{{item.x}}, {{item.y}}, {{item.w}}, {{item.h}}]\n                </div>\n            </div>\n        </div>\n        <button @click=\"addItem\">Add an item dynamically</button>\n        <input type=\"checkbox\" v-model=\"draggable\" /> Draggable\n        <input type=\"checkbox\" v-model=\"resizable\" /> Resizable\n        <grid-layout :layout.sync=\"layout\"\n                     :col-num=\"colNum\"\n                     :row-height=\"30\"\n                     :is-draggable=\"draggable\"\n                     :is-resizable=\"resizable\"\n                     :vertical-compact=\"true\"\n                     :use-css-transforms=\"true\"\n        >\n            <grid-item v-for=\"item in layout\"\n                       :static=\"item.static\"\n                       :x=\"item.x\"\n                       :y=\"item.y\"\n                       :w=\"item.w\"\n                       :h=\"item.h\"\n                       :i=\"item.i\"\n                       :key=\"item.i\"\n            >\n                <span class=\"text\">{{item.i}}</span>\n                <span class=\"remove\" @click=\"removeItem(item.i)\">x</span>\n            </grid-item>\n        </grid-layout>\n    </div>\n</template>\n\n<script>\nimport { GridLayout, GridItem } from \"vue-grid-layout\"\n\nexport default {\n    components: {\n        GridLayout,\n        GridItem\n    },\n    data() {\n        return {\n            layout: [\n                { x: 0, y: 0, w: 2, h: 2, i: \"0\" },\n                { x: 2, y: 0, w: 2, h: 2, i: \"1\" },\n                { x: 4, y: 0, w: 2, h: 2, i: \"2\" },\n                { x: 6, y: 0, w: 2, h: 2, i: \"3\" },\n                { x: 8, y: 0, w: 2, h: 2, i: \"4\" },\n            ],\n            draggable: true,\n            resizable: true,\n            colNum: 12,\n            index: 0,\n        }\n    },\n    mounted() {\n        // this.$gridlayout.load();\n        this.index = this.layout.length;\n    },\n    methods: {\n        addItem: function () {\n            // Add a new item. It must have a unique key!\n            this.layout.push({\n                x: (this.layout.length * 2) % (this.colNum || 12),\n                y: this.layout.length + (this.colNum || 12), // puts it at the bottom\n                w: 2,\n                h: 2,\n                i: this.index,\n            });\n            // Increment the counter to ensure key is always unique.\n            this.index++;\n        },\n        removeItem: function (val) {\n            const index = this.layout.map(item => item.i).indexOf(val);\n            this.layout.splice(index, 1);\n        },\n    }\n}\n</script>\n\n<style>\n.layoutJSON {\n    background: #ddd;\n    border: 1px solid black;\n    margin-top: 10px;\n    padding: 10px;\n}\n\n.columns {\n    -moz-columns: 120px;\n    -webkit-columns: 120px;\n    columns: 120px;\n}\n\n/*************************************/\n\n.remove {\n    position: absolute;\n    right: 2px;\n    top: 0;\n    cursor: pointer;\n}\n\n.vue-grid-layout {\n    background: #eee;\n}\n\n.vue-grid-item:not(.vue-grid-placeholder) {\n    background: #ccc;\n    border: 1px solid black;\n}\n\n.vue-grid-item .resizing {\n    opacity: 0.9;\n}\n\n.vue-grid-item .static {\n    background: #cce;\n}\n\n.vue-grid-item .text {\n    font-size: 24px;\n    text-align: center;\n    position: absolute;\n    top: 0;\n    bottom: 0;\n    left: 0;\n    right: 0;\n    margin: auto;\n    height: 100%;\n    width: 100%;\n}\n\n.vue-grid-item .no-drag {\n    height: 100%;\n    width: 100%;\n}\n\n.vue-grid-item .minMax {\n    font-size: 12px;\n}\n\n.vue-grid-item .add {\n    cursor: pointer;\n}\n\n.vue-draggable-handle {\n    position: absolute;\n    width: 20px;\n    height: 20px;\n    top: 0;\n    left: 0;\n    background: url(\"data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='10' height='10'><circle cx='5' cy='5' r='5' fill='#999999'/></svg>\") no-repeat;\n    background-position: bottom right;\n    padding: 0 8px 8px 0;\n    background-repeat: no-repeat;\n    background-origin: content-box;\n    box-sizing: border-box;\n    cursor: pointer;\n}\n\n\n</style>\n"
  },
  {
    "path": "website/docs/.vuepress/components/Example10DragFromOutside.vue",
    "content": "<template>\n    <div>\n        <div>\n            <div class=\"layoutJSON\">\n                Displayed as <code>[x, y, w, h]</code>:\n                <div class=\"columns\">\n                    <div class=\"layoutItem\" v-for=\"item in layout\">\n                        <b>{{ item.i }}</b>: [{{ item.x }}, {{ item.y }}, {{ item.w }}, {{ item.h }}]\n                    </div>\n                </div>\n            </div>\n        </div>\n        <br/>\n        <div @drag=\"drag\" @dragend=\"dragend\" class=\"droppable-element\" draggable=\"true\"\n             unselectable=\"on\">Droppable Element (Drag me!)</div>\n        <div id=\"content\">\n            <grid-layout ref=\"gridlayout\" :layout.sync=\"layout\"\n                         :col-num=\"12\"\n                         :row-height=\"30\"\n                         :is-draggable=\"true\"\n                         :is-resizable=\"true\"\n                         :vertical-compact=\"true\"\n                         :use-css-transforms=\"true\"\n            >\n                <grid-item :key=\"item.i\" v-for=\"item in layout\"\n                           :x=\"item.x\"\n                           :y=\"item.y\"\n                           :w=\"item.w\"\n                           :h=\"item.h\"\n                           :i=\"item.i\"\n                >\n                    <span class=\"text\">{{ item.i }}</span>\n                </grid-item>\n            </grid-layout>\n        </div>\n    </div>\n</template>\n\n<script>\nimport {GridLayout, GridItem} from \"vue-grid-layout\"\n\nlet mouseXY = {\"x\": null, \"y\": null};\nlet DragPos = {\"x\": null, \"y\": null, \"w\": 1, \"h\": 1, \"i\": null};\n\n\nexport default {\n    components: {\n        GridLayout,\n        GridItem\n    },\n    data() {\n        return {\n            layout: [\n                {\"x\": 0, \"y\": 0, \"w\": 2, \"h\": 2, \"i\": \"0\"},\n                {\"x\": 2, \"y\": 0, \"w\": 2, \"h\": 4, \"i\": \"1\"},\n                {\"x\": 4, \"y\": 0, \"w\": 2, \"h\": 5, \"i\": \"2\"},\n                {\"x\": 6, \"y\": 0, \"w\": 2, \"h\": 3, \"i\": \"3\"},\n                {\"x\": 8, \"y\": 0, \"w\": 2, \"h\": 3, \"i\": \"4\"},\n                {\"x\": 10, \"y\": 0, \"w\": 2, \"h\": 3, \"i\": \"5\"},\n                {\"x\": 0, \"y\": 5, \"w\": 2, \"h\": 5, \"i\": \"6\"},\n                {\"x\": 2, \"y\": 5, \"w\": 2, \"h\": 5, \"i\": \"7\"},\n                {\"x\": 4, \"y\": 5, \"w\": 2, \"h\": 5, \"i\": \"8\"},\n                {\"x\": 5, \"y\": 10, \"w\": 4, \"h\": 3, \"i\": \"9\"},\n            ],\n        }\n    },\n    mounted() {\n        document.addEventListener(\"dragover\", function (e) {\n            mouseXY.x = e.clientX;\n            mouseXY.y = e.clientY;\n        }, false);\n    },\n    beforeDestroy() {\n    },\n    methods: {\n        drag: function (e) {\n            let parentRect = document.getElementById('content').getBoundingClientRect();\n            let mouseInGrid = false;\n            if (((mouseXY.x > parentRect.left) && (mouseXY.x < parentRect.right)) && ((mouseXY.y > parentRect.top) && (mouseXY.y < parentRect.bottom))) {\n                mouseInGrid = true;\n            }\n            if (mouseInGrid === true && (this.layout.findIndex(item => item.i === 'drop')) === -1) {\n                this.layout.push({\n                    x: (this.layout.length * 2) % (this.colNum || 12),\n                    y: this.layout.length + (this.colNum || 12), // puts it at the bottom\n                    w: 1,\n                    h: 1,\n                    i: 'drop',\n                });\n            }\n            let index = this.layout.findIndex(item => item.i === 'drop');\n            if (index !== -1) {\n                try {\n                    this.$refs.gridlayout.$children[this.layout.length].$refs.item.style.display = \"none\";\n                } catch {\n                }\n                let el = this.$refs.gridlayout.$children[index];\n                el.dragging = {\"top\": mouseXY.y - parentRect.top, \"left\": mouseXY.x - parentRect.left};\n                let new_pos = el.calcXY(mouseXY.y - parentRect.top, mouseXY.x - parentRect.left);\n\n                if (mouseInGrid === true) {\n                    this.$refs.gridlayout.dragEvent('dragstart', 'drop', new_pos.x, new_pos.y, 1, 1);\n                    DragPos.i = String(index);\n                    DragPos.x = this.layout[index].x;\n                    DragPos.y = this.layout[index].y;\n                }\n                if (mouseInGrid === false) {\n                    this.$refs.gridlayout.dragEvent('dragend', 'drop', new_pos.x, new_pos.y, 1, 1);\n                    this.layout = this.layout.filter(obj => obj.i !== 'drop');\n                }\n            }\n        },\n        dragend: function (e) {\n            let parentRect = document.getElementById('content').getBoundingClientRect();\n            let mouseInGrid = false;\n            if (((mouseXY.x > parentRect.left) && (mouseXY.x < parentRect.right)) && ((mouseXY.y > parentRect.top) && (mouseXY.y < parentRect.bottom))) {\n                mouseInGrid = true;\n            }\n            if (mouseInGrid === true) {\n                alert(`Dropped element props:\\n${JSON.stringify(DragPos, ['x', 'y', 'w', 'h'], 2)}`);\n                this.$refs.gridlayout.dragEvent('dragend', 'drop', DragPos.x, DragPos.y, 1, 1);\n                this.layout = this.layout.filter(obj => obj.i !== 'drop');\n\n                // UNCOMMENT below if you want to add a grid-item\n                /*\n                this.layout.push({\n                    x: DragPos.x,\n                    y: DragPos.y,\n                    w: 1,\n                    h: 1,\n                    i: DragPos.i,\n                });\n                this.$refs.gridLayout.dragEvent('dragend', DragPos.i, DragPos.x,DragPos.y,1,1);\n                try {\n                    this.$refs.gridLayout.$children[this.layout.length].$refs.item.style.display=\"block\";\n                } catch {\n                }\n                */\n            }\n        },\n    }\n}\n</script>\n\n<style scoped>\n\n.droppable-element {\n    width: 150px;\n    text-align: center;\n    background: #fdd;\n    border: 1px solid black;\n    margin: 10px 0;\n    padding: 10px;\n}\n\n\n.vue-grid-layout {\n    background: #eee;\n}\n\n.vue-grid-item:not(.vue-grid-placeholder) {\n    background: #ccc;\n    border: 1px solid black;\n}\n\n.vue-grid-item .resizing {\n    opacity: 0.9;\n}\n\n.vue-grid-item .static {\n    background: #cce;\n}\n\n.vue-grid-item .text {\n    font-size: 24px;\n    text-align: center;\n    position: absolute;\n    top: 0;\n    bottom: 0;\n    left: 0;\n    right: 0;\n    margin: auto;\n    height: 100%;\n    width: 100%;\n}\n\n.vue-grid-item .no-drag {\n    height: 100%;\n    width: 100%;\n}\n\n.vue-grid-item .minMax {\n    font-size: 12px;\n}\n\n.vue-grid-item .add {\n    cursor: pointer;\n}\n\n.vue-draggable-handle {\n    position: absolute;\n    width: 20px;\n    height: 20px;\n    top: 0;\n    left: 0;\n    background: url(\"data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='10' height='10'><circle cx='5' cy='5' r='5' fill='#999999'/></svg>\") no-repeat;\n    background-position: bottom right;\n    padding: 0 8px 8px 0;\n    background-repeat: no-repeat;\n    background-origin: content-box;\n    box-sizing: border-box;\n    cursor: pointer;\n}\n\n.layoutJSON {\n    background: #ddd;\n    border: 1px solid black;\n    margin-top: 10px;\n    padding: 10px;\n}\n\n.layoutJSON {\n    background: #ddd;\n    border: 1px solid black;\n    margin-top: 10px;\n    padding: 10px;\n}\n\n.columns {\n    -moz-columns: 120px;\n    -webkit-columns: 120px;\n    columns: 120px;\n}\n</style>\n"
  },
  {
    "path": "website/docs/.vuepress/components/Example11Bounded.vue",
    "content": "<template>\n    <div style=\"width:100%;height:2000px;\">\n        <div class=\"layoutJSON\">\n            Displayed as <code>[x, y, w, h]</code>:\n            <div class=\"columns\">\n                <div v-for=\"item in layout\">\n                    <b>{{item.i}}</b>: [{{item.x}}, {{item.y}}, {{item.w}}, {{item.h}}]\n                </div>\n            </div>\n        </div>\n        <hr/>\n        <input type=\"checkbox\" v-model=\"draggable\"/> Draggable\n        <input type=\"checkbox\" v-model=\"resizable\"/> Resizable\n        <input type=\"checkbox\" v-model=\"bounded\"/> Bounded\n        <br/>\n        <div style=\"width:100%;margin-top: 10px;height:100%;\">\n            <grid-layout :layout.sync=\"layout\"\n                         :col-num=\"12\"\n                         :row-height=\"30\"\n                         :is-draggable=\"draggable\"\n                         :is-resizable=\"resizable\"\n                         :is-bounded=\"bounded\"\n                         :vertical-compact=\"true\"\n                         :use-css-transforms=\"true\"\n            >\n                <grid-item v-for=\"item in layout\"\n                           :static=\"item.static\"\n                           :x=\"item.x\"\n                           :y=\"item.y\"\n                           :w=\"item.w\"\n                           :h=\"item.h\"\n                           :i=\"item.i\"\n                >\n                    <span class=\"text\">{{item.i}}</span>\n                </grid-item>\n            </grid-layout>\n        </div>\n    </div>\n</template>\n\n<script>\nimport { GridLayout, GridItem } from \"vue-grid-layout\"\n\nexport default {\n    components: {\n        GridLayout,\n        GridItem\n    },\n    data() {\n        return {\n            layout: [\n                {\"x\":0,\"y\":0,\"w\":2,\"h\":2,\"i\":\"0\"},\n                {\"x\":2,\"y\":0,\"w\":2,\"h\":4,\"i\":\"1\"},\n                {\"x\":4,\"y\":0,\"w\":2,\"h\":5,\"i\":\"2\"},\n                {\"x\":6,\"y\":0,\"w\":2,\"h\":3,\"i\":\"3\"},\n                {\"x\":8,\"y\":0,\"w\":2,\"h\":3,\"i\":\"4\"},\n                {\"x\":10,\"y\":0,\"w\":2,\"h\":3,\"i\":\"5\"},\n                {\"x\":0,\"y\":5,\"w\":2,\"h\":5,\"i\":\"6\"},\n                {\"x\":2,\"y\":5,\"w\":2,\"h\":5,\"i\":\"7\"},\n                {\"x\":4,\"y\":5,\"w\":2,\"h\":5,\"i\":\"8\"},\n                {\"x\":6,\"y\":4,\"w\":2,\"h\":4,\"i\":\"9\"},\n                {\"x\":8,\"y\":4,\"w\":2,\"h\":4,\"i\":\"10\"},\n                {\"x\":10,\"y\":4,\"w\":2,\"h\":4,\"i\":\"11\"},\n                {\"x\":0,\"y\":10,\"w\":2,\"h\":5,\"i\":\"12\"},\n                {\"x\":2,\"y\":10,\"w\":2,\"h\":5,\"i\":\"13\"},\n                {\"x\":4,\"y\":8,\"w\":2,\"h\":4,\"i\":\"14\"},\n                {\"x\":6,\"y\":8,\"w\":2,\"h\":4,\"i\":\"15\"},\n                {\"x\":8,\"y\":10,\"w\":2,\"h\":5,\"i\":\"16\"},\n                {\"x\":10,\"y\":4,\"w\":2,\"h\":2,\"i\":\"17\"},\n                {\"x\":0,\"y\":9,\"w\":2,\"h\":3,\"i\":\"18\"},\n                {\"x\":2,\"y\":6,\"w\":2,\"h\":2,\"i\":\"19\"}\n            ],\n            draggable: true,\n            resizable: true,\n            bounded: true\n        }\n    }\n}\n</script>\n\n<style scoped>\n.vue-grid-layout {\n    background: #eee;\n}\n\n.vue-grid-item:not(.vue-grid-placeholder) {\n    background: #ccc;\n    border: 1px solid black;\n}\n\n.vue-grid-item .resizing {\n    opacity: 0.9;\n}\n\n.vue-grid-item .static {\n    background: #cce;\n}\n\n.vue-grid-item .text {\n    font-size: 24px;\n    text-align: center;\n    position: absolute;\n    top: 0;\n    bottom: 0;\n    left: 0;\n    right: 0;\n    margin: auto;\n    height: 100%;\n    width: 100%;\n}\n\n.vue-grid-item .no-drag {\n    height: 100%;\n    width: 100%;\n}\n\n.vue-grid-item .minMax {\n    font-size: 12px;\n}\n\n.vue-grid-item .add {\n    cursor: pointer;\n}\n\n.vue-draggable-handle {\n    position: absolute;\n    width: 20px;\n    height: 20px;\n    top: 0;\n    left: 0;\n    background: url(\"data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='10' height='10'><circle cx='5' cy='5' r='5' fill='#999999'/></svg>\") no-repeat;\n    background-position: bottom right;\n    padding: 0 8px 8px 0;\n    background-repeat: no-repeat;\n    background-origin: content-box;\n    box-sizing: border-box;\n    cursor: pointer;\n}\n\n.layoutJSON {\n    background: #ddd;\n    border: 1px solid black;\n    margin-top: 10px;\n    padding: 10px;\n}\n\n.columns {\n    -moz-columns: 120px;\n    -webkit-columns: 120px;\n    columns: 120px;\n}\n\n</style>\n"
  },
  {
    "path": "website/docs/.vuepress/components/ExampleStylingGridLines.vue",
    "content": "<template>\n    <div class=\"container\">\n        <grid-layout\n            class=\"grid\"\n            :layout.sync=\"layout\"\n            :margin=\"margin\"\n            :col-num=\"colNum\"\n            :row-height=\"rowHeight\"\n            :is-draggable=\"draggable\"\n            :is-resizable=\"resizable\"\n            :vertical-compact=\"true\"\n            :use-css-transforms=\"true\"\n        >\n            <grid-item v-for=\"item in layout\"\n                       :static=\"item.static\"\n                       :x=\"item.x\"\n                       :y=\"item.y\"\n                       :w=\"item.w\"\n                       :h=\"item.h\"\n                       :i=\"item.i\"\n            >\n                <span class=\"text\">{{ itemTitle(item) }}</span>\n            </grid-item>\n        </grid-layout>\n    </div>\n</template>\n\n<script>\nimport {GridLayout, GridItem} from \"vue-grid-layout\"\n\nexport default {\n    components: {\n        GridLayout,\n        GridItem\n    },\n    data() {\n        return {\n            layout: [\n                {\"x\": 0, \"y\": 0, \"w\": 2, \"h\": 2, \"i\": \"0\", static: false},\n                {\"x\": 2, \"y\": 0, \"w\": 2, \"h\": 4, \"i\": \"1\", static: true},\n                {\"x\": 4, \"y\": 0, \"w\": 2, \"h\": 5, \"i\": \"2\", static: false},\n                {\"x\": 6, \"y\": 0, \"w\": 2, \"h\": 3, \"i\": \"3\", static: false},\n                {\"x\": 8, \"y\": 0, \"w\": 2, \"h\": 3, \"i\": \"4\", static: false},\n                {\"x\": 10, \"y\": 0, \"w\": 2, \"h\": 3, \"i\": \"5\", static: false},\n                {\"x\": 0, \"y\": 5, \"w\": 2, \"h\": 5, \"i\": \"6\", static: false},\n                {\"x\": 2, \"y\": 5, \"w\": 2, \"h\": 5, \"i\": \"7\", static: false},\n                {\"x\": 4, \"y\": 5, \"w\": 2, \"h\": 5, \"i\": \"8\", static: false},\n                {\"x\": 6, \"y\": 3, \"w\": 2, \"h\": 4, \"i\": \"9\", static: true},\n                {\"x\": 8, \"y\": 4, \"w\": 2, \"h\": 4, \"i\": \"10\", static: false},\n                {\"x\": 10, \"y\": 4, \"w\": 2, \"h\": 4, \"i\": \"11\", static: false},\n                {\"x\": 0, \"y\": 10, \"w\": 2, \"h\": 5, \"i\": \"12\", static: false},\n                {\"x\": 2, \"y\": 10, \"w\": 2, \"h\": 5, \"i\": \"13\", static: false},\n                {\"x\": 4, \"y\": 8, \"w\": 2, \"h\": 4, \"i\": \"14\", static: false},\n                {\"x\": 6, \"y\": 8, \"w\": 2, \"h\": 4, \"i\": \"15\", static: false},\n                {\"x\": 8, \"y\": 10, \"w\": 2, \"h\": 5, \"i\": \"16\", static: false},\n                {\"x\": 10, \"y\": 4, \"w\": 2, \"h\": 2, \"i\": \"17\", static: false},\n                {\"x\": 0, \"y\": 9, \"w\": 2, \"h\": 3, \"i\": \"18\", static: false},\n                {\"x\": 2, \"y\": 6, \"w\": 2, \"h\": 2, \"i\": \"19\", static: false}\n            ],\n            draggable: true,\n            resizable: true,\n            margin: [10, 10],\n            colNum: 12,\n            rowHeight: 30,\n            index: 0\n        }\n    },\n    computed: {\n        /*styleObject() {\n            const rowHeightMargin = this.rowHeight + this.margin[0];\n            return {\n                \"background-size\": \"calc(calc(100% - \" + this.margin[0] + \"px) / \" + this.colNum + \") \" + rowHeightMargin + \"px\",\n                \"margin\": this.margin[0] + \"px\",\n            }\n        }*/\n    },\n    methods: {\n        itemTitle(item) {\n            let result = item.i;\n            if (item.static) {\n                result += \" - Static\";\n            }\n            return result;\n        }\n    }\n}\n</script>\n\n<style>\n\n.grid::before {\n    content: '';\n    background-size: calc(calc(100% - 5px) / 12) 40px;\n    background-image: linear-gradient(\n        to right,\n        lightgrey 1px,\n        transparent 1px\n    ),\n    linear-gradient(to bottom, lightgrey 1px, transparent 1px);\n    height: calc(100% - 5px);\n    width: calc(100% - 5px);\n    /*height: 100%;*/\n    /*width: 100%;*/\n    position: absolute;\n    background-repeat: repeat;\n    margin:5px;\n}\n\n.vue-grid-layout {\n    background: #eee;\n}\n\n.vue-grid-item:not(.vue-grid-placeholder) {\n    background: #ccc;\n    border: 1px solid black;\n}\n\n.vue-grid-item .resizing {\n    opacity: 0.9;\n}\n\n.vue-grid-item .static {\n    background: #cce;\n}\n\n.vue-grid-item .text {\n    font-size: 24px;\n    text-align: center;\n    position: absolute;\n    top: 0;\n    bottom: 0;\n    left: 0;\n    right: 0;\n    margin: auto;\n    height: 100%;\n    width: 100%;\n}\n\n.vue-grid-item .no-drag {\n    height: 100%;\n    width: 100%;\n}\n\n.vue-grid-item .minMax {\n    font-size: 12px;\n}\n\n.vue-grid-item .add {\n    cursor: pointer;\n}\n\n.vue-draggable-handle {\n    position: absolute;\n    width: 20px;\n    height: 20px;\n    top: 0;\n    left: 0;\n    background: url(\"data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='10' height='10'><circle cx='5' cy='5' r='5' fill='#999999'/></svg>\") no-repeat;\n    background-position: bottom right;\n    padding: 0 8px 8px 0;\n    background-repeat: no-repeat;\n    background-origin: content-box;\n    box-sizing: border-box;\n    cursor: pointer;\n}\n\n\n</style>\n"
  },
  {
    "path": "website/docs/.vuepress/components/ExampleStylingPlaceholder.vue",
    "content": "<template>\n    <div class=\"container\">\n        <grid-layout :layout.sync=\"layout\"\n                     :col-num=\"12\"\n                     :row-height=\"30\"\n                     :is-draggable=\"draggable\"\n                     :is-resizable=\"resizable\"\n                     :vertical-compact=\"true\"\n                     :use-css-transforms=\"true\"\n        >\n            <grid-item v-for=\"item in layout\"\n                       :static=\"item.static\"\n                       :x=\"item.x\"\n                       :y=\"item.y\"\n                       :w=\"item.w\"\n                       :h=\"item.h\"\n                       :i=\"item.i\"\n            >\n                <span class=\"text\">{{itemTitle(item)}}</span>\n            </grid-item>\n        </grid-layout>\n    </div>\n</template>\n\n<script>\nimport { GridLayout, GridItem } from \"vue-grid-layout\"\n\nexport default {\n    components: {\n        GridLayout,\n        GridItem\n    },\n    data() {\n        return {\n            layout: [\n                {\"x\":0,\"y\":0,\"w\":2,\"h\":2,\"i\":\"0\", static: false},\n                {\"x\":2,\"y\":0,\"w\":2,\"h\":4,\"i\":\"1\", static: true},\n                {\"x\":4,\"y\":0,\"w\":2,\"h\":5,\"i\":\"2\", static: false},\n                {\"x\":6,\"y\":0,\"w\":2,\"h\":3,\"i\":\"3\", static: false},\n                {\"x\":8,\"y\":0,\"w\":2,\"h\":3,\"i\":\"4\", static: false},\n                {\"x\":10,\"y\":0,\"w\":2,\"h\":3,\"i\":\"5\", static: false},\n                {\"x\":0,\"y\":5,\"w\":2,\"h\":5,\"i\":\"6\", static: false},\n                {\"x\":2,\"y\":5,\"w\":2,\"h\":5,\"i\":\"7\", static: false},\n                {\"x\":4,\"y\":5,\"w\":2,\"h\":5,\"i\":\"8\", static: false},\n                {\"x\":6,\"y\":3,\"w\":2,\"h\":4,\"i\":\"9\", static: true},\n                {\"x\":8,\"y\":4,\"w\":2,\"h\":4,\"i\":\"10\", static: false},\n                {\"x\":10,\"y\":4,\"w\":2,\"h\":4,\"i\":\"11\", static: false},\n                {\"x\":0,\"y\":10,\"w\":2,\"h\":5,\"i\":\"12\", static: false},\n                {\"x\":2,\"y\":10,\"w\":2,\"h\":5,\"i\":\"13\", static: false},\n                {\"x\":4,\"y\":8,\"w\":2,\"h\":4,\"i\":\"14\", static: false},\n                {\"x\":6,\"y\":8,\"w\":2,\"h\":4,\"i\":\"15\", static: false},\n                {\"x\":8,\"y\":10,\"w\":2,\"h\":5,\"i\":\"16\", static: false},\n                {\"x\":10,\"y\":4,\"w\":2,\"h\":2,\"i\":\"17\", static: false},\n                {\"x\":0,\"y\":9,\"w\":2,\"h\":3,\"i\":\"18\", static: false},\n                {\"x\":2,\"y\":6,\"w\":2,\"h\":2,\"i\":\"19\", static: false}\n            ],\n            draggable: true,\n            resizable: true,\n            index: 0\n        }\n    },\n    methods: {\n        itemTitle(item) {\n            let result = item.i;\n            if (item.static) {\n                result += \" - Static\";\n            }\n            return result;\n        }\n    }\n}\n</script>\n\n<style>\n.container .vue-grid-item.vue-grid-placeholder {\n    background: green;\n}\n\n.vue-grid-layout {\n    background: #eee;\n}\n\n.vue-grid-item:not(.vue-grid-placeholder) {\n    background: #ccc;\n    border: 1px solid black;\n}\n\n.vue-grid-item .resizing {\n    opacity: 0.9;\n}\n\n.vue-grid-item .static {\n    background: #cce;\n}\n\n.vue-grid-item .text {\n    font-size: 24px;\n    text-align: center;\n    position: absolute;\n    top: 0;\n    bottom: 0;\n    left: 0;\n    right: 0;\n    margin: auto;\n    height: 100%;\n    width: 100%;\n}\n\n.vue-grid-item .no-drag {\n    height: 100%;\n    width: 100%;\n}\n\n.vue-grid-item .minMax {\n    font-size: 12px;\n}\n\n.vue-grid-item .add {\n    cursor: pointer;\n}\n\n.vue-draggable-handle {\n    position: absolute;\n    width: 20px;\n    height: 20px;\n    top: 0;\n    left: 0;\n    background: url(\"data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='10' height='10'><circle cx='5' cy='5' r='5' fill='#999999'/></svg>\") no-repeat;\n    background-position: bottom right;\n    padding: 0 8px 8px 0;\n    background-repeat: no-repeat;\n    background-origin: content-box;\n    box-sizing: border-box;\n    cursor: pointer;\n}\n\n\n</style>\n"
  },
  {
    "path": "website/docs/.vuepress/components/HomeFooter.vue",
    "content": "<template>\n    <footer class=\"footer\">\n        A product by:\n        <a href=\"https://www.jbaysolutions.com/\" target=\"_blank\" rel=\"noopener\" class=\"footer-card\">\n            <img src=\"assets/img/logo-jbay.png\" />\n        </a>\n    </footer>\n</template>\n\n<script>\nexport default {\n    name: \"HomeFooter\"\n}\n</script>\n\n<style scoped>\n.footer {\n    border-top: 1px solid #eaecef;\n    margin-top: 1em;\n}\n\n.footer-card {\n    display: block;\n    /*max-width: 100px;*/\n    width: 90%;\n    padding: 1em 1.5em;\n    border-radius: 5px;\n    margin-bottom: 1em;\n    margin-top: 0.5em;\n    margin-left: auto;\n    margin-right: auto;\n}\n</style>\n"
  },
  {
    "path": "website/docs/.vuepress/components/HomepageGrid.vue",
    "content": "<template>\n    <grid-layout :layout.sync=\"layout\"\n                 :col-num=\"12\"\n                 :row-height=\"30\"\n                 :is-draggable=\"draggable\"\n                 :is-resizable=\"resizable\"\n                 :vertical-compact=\"true\"\n                 :use-css-transforms=\"true\"\n    >\n        <grid-item v-for=\"item in layout\"\n                   :static=\"item.static\"\n                   :x=\"item.x\"\n                   :y=\"item.y\"\n                   :w=\"item.w\"\n                   :h=\"item.h\"\n                   :i=\"item.i\"\n        >\n            <div v-if=\"item.i === '2'\" class=\"docsfold-features\">\n                <img src=\"assets/img/docsfold-logo-sm.png\" alt=\"DocsFold\" style=\"max-width: 100%;\"/>\n                <div class=\"content\">\n                    <h2>API to generate image and PDF documents</h2>\n                    <div style=\"padding:10px 0;\">\n\n                        <a href=\"https://www.docsfold.com?utm_source=vue-grid-layout-website&utm_medium=web&utm_campaign=vue-grid-layout\" target=\"_blank\" class=\"btn-read-more\">Get started for FREE</a>\n                    </div>\n                </div>\n            </div>\n            <!--            <div v-if=\"item.i === '999'\" style=\"width: 90%;margin-left: auto;margin-right: auto;margin-top: 5px;height: 90%;\">\n                            <iframe src=\"https://github.com/sponsors/jbaysolutions/card\" title=\"Sponsor jbaysolutions\" height=\"100%\" width=\"100%\" style=\"border: 0;\"></iframe>\n            &lt;!&ndash;                <iframe src=\"https://github.com/sponsors/jbaysolutions/button\" title=\"Sponsor jbaysolutions\" height=\"35\" width=\"100%\" style=\"border: 0; margin-left:auto;margin-right: auto;\"></iframe>&ndash;&gt;\n                        </div>-->\n            <span v-else class=\"text\">{{ itemTitle(item) }}</span>\n        </grid-item>\n    </grid-layout>\n</template>\n\n<script>\nimport {GridLayout, GridItem} from \"vue-grid-layout\"\n\nexport default {\n\tname: \"HomepageGrid\",\n\tcomponents: {\n\t\tGridLayout,\n\t\tGridItem\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tlayout: [\n\t\t\t\t{\"x\": 0, \"y\": 0, \"w\": 2, \"h\": 2, \"i\": \"0\", static: false},\n\t\t\t\t{\"x\": 10, \"y\": 0, \"w\": 2, \"h\": 4, \"i\": \"1\", static: true},\n\t\t\t\t{\"x\": 2, \"y\": 0, \"w\": 8, \"h\": 4, \"i\": \"2\", static: false},\n\t\t\t\t{\"x\": 6, \"y\": 4, \"w\": 2, \"h\": 3, \"i\": \"3\", static: false},\n\t\t\t\t{\"x\": 8, \"y\": 4, \"w\": 2, \"h\": 3, \"i\": \"4\", static: false},\n\t\t\t\t{\"x\": 10, \"y\": 4, \"w\": 2, \"h\": 3, \"i\": \"5\", static: false},\n\t\t\t\t{\"x\": 0, \"y\": 2, \"w\": 2, \"h\": 5, \"i\": \"6\", static: false},\n\t\t\t\t{\"x\": 2, \"y\": 4, \"w\": 2, \"h\": 5, \"i\": \"7\", static: false},\n\t\t\t\t{\"x\": 4, \"y\": 4, \"w\": 2, \"h\": 5, \"i\": \"8\", static: false},\n\t\t\t\t{\"x\": 6, \"y\": 7, \"w\": 2, \"h\": 4, \"i\": \"9\", static: true},\n\t\t\t\t{\"x\": 8, \"y\": 7, \"w\": 2, \"h\": 4, \"i\": \"10\", static: false},\n\t\t\t\t{\"x\": 10, \"y\": 7, \"w\": 2, \"h\": 4, \"i\": \"11\", static: false},\n\t\t\t\t{\"x\": 0, \"y\": 10, \"w\": 2, \"h\": 5, \"i\": \"12\", static: false},\n\t\t\t\t{\"x\": 2, \"y\": 11, \"w\": 2, \"h\": 5, \"i\": \"13\", static: false},\n\t\t\t\t{\"x\": 4, \"y\": 9, \"w\": 2, \"h\": 4, \"i\": \"14\", static: false},\n\t\t\t\t{\"x\": 6, \"y\": 11, \"w\": 2, \"h\": 4, \"i\": \"15\", static: false},\n\t\t\t\t{\"x\": 8, \"y\": 11, \"w\": 2, \"h\": 5, \"i\": \"16\", static: false},\n\t\t\t\t{\"x\": 10, \"y\": 11, \"w\": 2, \"h\": 2, \"i\": \"17\", static: false},\n\t\t\t\t{\"x\": 0, \"y\": 7, \"w\": 2, \"h\": 3, \"i\": \"18\", static: false},\n\t\t\t\t{\"x\": 2, \"y\": 9, \"w\": 2, \"h\": 2, \"i\": \"19\", static: false}\n\t\t\t],\n\t\t\tdraggable: true,\n\t\t\tresizable: true,\n\t\t\tindex: 0\n\t\t}\n\t},\n\tmethods: {\n\t\titemTitle(item) {\n\t\t\tlet result = item.i;\n\t\t\tif (item.static) {\n\t\t\t\tresult += \" - Static\";\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\t}\n}\n</script>\n\n<style scoped>\n.vue-grid-layout {\n    background: #eee;\n}\n\n.vue-grid-item:not(.vue-grid-placeholder) {\n    background: #ccc;\n    border: 1px solid black;\n}\n\n.vue-grid-item .resizing {\n    opacity: 0.9;\n}\n\n.vue-grid-item .static {\n    background: #cce;\n}\n\n.vue-grid-item .text {\n    font-size: 24px;\n    text-align: center;\n    position: absolute;\n    top: 0;\n    bottom: 0;\n    left: 0;\n    right: 0;\n    margin: auto;\n    height: 100%;\n    width: 100%;\n}\n\n.vue-grid-item .no-drag {\n    height: 100%;\n    width: 100%;\n}\n\n.vue-grid-item .minMax {\n    font-size: 12px;\n}\n\n.vue-grid-item .add {\n    cursor: pointer;\n}\n\n.vue-draggable-handle {\n    position: absolute;\n    width: 20px;\n    height: 20px;\n    top: 0;\n    left: 0;\n    background: url(\"data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='10' height='10'><circle cx='5' cy='5' r='5' fill='#999999'/></svg>\") no-repeat;\n    background-position: bottom right;\n    padding: 0 8px 8px 0;\n    background-repeat: no-repeat;\n    background-origin: content-box;\n    box-sizing: border-box;\n    cursor: pointer;\n}\n\n\n.docsfold-features {\n    width: 90%;\n    margin-left: auto;\n    margin-right: auto;\n    /*margin-top: 5px;*/\n    height: 90%;\n    /*text-align: center!important;*/\n    display: flex;\n    flex-wrap: wrap;\n    justify-content: center;\n}\n\n.docsfold-features img {\n    width: 30%;\n    height: auto;\n    object-fit: contain;\n}\n\n.docsfold-features .content {\n    width: 50%;\n    height: 100%;\n    display: flex;\n    flex-direction: column;\n    justify-content: center;\n    flex-grow: 1;\n    align-items: center;\n    padding: 10px;\n}\n\n.docsfold-features h2 {\n    font-size: 18px;\n    margin-bottom: 10px;\n    border:0;\n}\n\n.docsfold-features .btn-read-more:hover {\n    background: #4104f1;\n}\n\n.docsfold-features .btn-read-more {\n    line-height: 0;\n    /*padding: 15px 40px;*/\n    padding: 10px 20px;\n    border-radius: 4px;\n    transition: 0.5s;\n    color: #fff;\n    background: #4154f1;\n    box-shadow: 0px 5px 25px rgba(65, 84, 241, 0.3);\n    /*cursor: pointer;*/\n}\n\n.docsfold-features .btn-read-more span {\n    font-family: \"Nunito\", sans-serif;\n    font-weight: 600;\n    font-size: 16px;\n    letter-spacing: 1px;\n}\n\n.docsfold-features .btn-read-more i {\n    margin-left: 5px;\n    font-size: 18px !important;\n    transition: 0.3s;\n    color: #fff !important;\n}\n\n.docsfold-features .btn-read-more:hover i {\n    transform: translateX(5px);\n}\n\n\n</style>\n"
  },
  {
    "path": "website/docs/.vuepress/config.js",
    "content": "const description = 'A draggable and resizable grid layout, as a Vue component.'\nconst title = 'Vue Grid Layout - ️A grid layout system for Vue.js'\n\nmodule.exports = {\n\tbase: \"/vue-grid-layout/\",\n\tlocales: {\n\t\t'/': {\n\t\t  lang: 'en-US',\n\t\t  title: 'Vue Grid Layout - ️A grid layout system for Vue.js',\n\t\t  description: 'A draggable and resizable grid layout, as a Vue component.'\n\t\t},\n\t\t'/zh/': {\n\t\t  lang: 'zh-CN',\n\t\t  title: 'Vue Grid Layout -️ 适用Vue.js的栅格布局系统',\n\t\t  description: '可拖动和可调整大小栅格布局的Vue组件。'\n\t\t}\n\t  },\n\thead: [\n\t\t['link', { rel: 'icon', href: `/favicon.ico` }],\n\t\t['link', { rel: \"apple-touch-icon\", sizes: \"180x180\", href: \"https://jbaysolutions.github.io/vue-grid-layout/assets/favicon/apple-touch-icon.png\"}],\n\t\t// ['script', { src: 'https://cdn.jsdelivr.net/npm/vue-grid-layout@2.3.9/dist/vue-grid-layout.umd.min.js' }]\n\t\t[\n\t\t\t'script',\n\t\t\t{\n\t\t\t\tasync: true,\n\t\t\t\tsrc: 'https://www.googletagmanager.com/gtag/js?id=G-9JZJJHRV8R',\n\t\t\t},\n\t\t],\n\t\t[\n\t\t\t'script',\n\t\t\t{},\n\t\t\t[\n\t\t\t\t\"window.dataLayer = window.dataLayer || [];\\nfunction gtag(){dataLayer.push(arguments);}\\ngtag('js', new Date());\\ngtag('config', 'G-9JZJJHRV8R');\",\n\t\t\t],\n\t\t],\n\t],\n\tport: 8081,\n\ttheme: '@vuepress/vue',\n\tthemeConfig: {\n\t\tsmoothScroll: true,\n\t\tlogo: '/assets/img/logo.png',\n\t\trepo: 'jbaysolutions/vue-grid-layout',\n\t\tdocsDir: 'website/docs',\n\t\teditLinks: true,\n\t\talgolia: {\n\t\t  apiKey: '2f143d1edd24605564065dd02bf0a22b',\n\t\t  indexName: 'vue_grid_layout'\n\t\t},\n\t\tlocales: {\n\t\t\t'/': {\n\t\t\t\tselectText: 'Languages',\n\t\t\t\tlabel: 'English',\n\t\t\t\tariaLabel: 'Select language',\n\t\t\t\tsidebar: {\n\t\t\t\t\t'/guide/': [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttitle: \"Guide\",\n\t\t\t\t\t\t\tcollapsable: false,\n\t\t\t\t\t\t\tchildren: [\n\t\t\t\t\t\t\t\t'',\n\t\t\t\t\t\t\t\t'usage',\n\t\t\t\t\t\t\t\t'properties',\n\t\t\t\t\t\t\t\t'events',\n\t\t\t\t\t\t\t\t'styling',\n\t\t\t\t\t\t\t]\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttitle: \"Examples\",\n\t\t\t\t\t\t\tcollapsable: false,\n\t\t\t\t\t\t\tchildren: [\n\t\t\t\t\t\t\t\t'01-basic',\n\t\t\t\t\t\t\t\t'02-events',\n\t\t\t\t\t\t\t\t'03-multiple-grids',\n\t\t\t\t\t\t\t\t'04-allow-ignore',\n\t\t\t\t\t\t\t\t'05-mirrored',\n\t\t\t\t\t\t\t\t'06-responsive',\n\t\t\t\t\t\t\t\t'07-prevent-collision',\n\t\t\t\t\t\t\t\t'08-responsive-predefined-layouts',\n\t\t\t\t\t\t\t\t'09-dynamic-add-remove',\n\t\t\t\t\t\t\t\t'10-drag-from-outside',\n\t\t\t\t\t\t\t\t'11-bounded',\n\t\t\t\t\t\t\t]\n\t\t\t\t\t\t}\n\t\t\t\t\t]\n\t\t\t\t},\n\t\t\t\tnav: [\n\t\t\t\t\t{text: 'Home', link: '/'},\n\t\t\t\t\t{text: 'Guide', link: '/guide/'},\n\t\t\t\t\t{text: 'Changelog', link: '/changelog/'}\n\t\t\t\t],\n\t\t\t\tsearchPlaceholder: 'Search...',\n\t\t\t\teditLinkText: 'Help improve this page!',\n\t\t\t\tlastUpdated: 'Last Updated'\n\t\t\t},\n\t\t\t'/zh/': {\n\t\t\t\tselectText: '选择语言',\n\t\t\t\tlabel: '简体中文',\n\t\t\t\tariaLabel: '选择语言',\n\t\t\t\tsidebar: {\n\t\t\t\t\t'/zh/guide/': [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttitle: \"首页\",\n\t\t\t\t\t\t\tcollapsable: false,\n\t\t\t\t\t\t\tchildren: [\n\t\t\t\t\t\t\t\t'',\n\t\t\t\t\t\t\t\t'usage',\n\t\t\t\t\t\t\t\t'properties',\n\t\t\t\t\t\t\t\t'events',\n\t\t\t\t\t\t\t\t'styling',\n\t\t\t\t\t\t\t]\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttitle: \"例子\",\n\t\t\t\t\t\t\tcollapsable: false,\n\t\t\t\t\t\t\tchildren: [\n\t\t\t\t\t\t\t\t'01-basic',\n\t\t\t\t\t\t\t\t'02-events',\n\t\t\t\t\t\t\t\t'03-multiple-grids',\n\t\t\t\t\t\t\t\t'04-allow-ignore',\n\t\t\t\t\t\t\t\t'05-mirrored',\n\t\t\t\t\t\t\t\t'06-responsive',\n\t\t\t\t\t\t\t\t'07-prevent-collision',\n\t\t\t\t\t\t\t\t'08-responsive-predefined-layouts',\n\t\t\t\t\t\t\t\t'09-dynamic-add-remove',\n\t\t\t\t\t\t\t\t'10-drag-from-outside',\n\t\t\t\t\t\t\t\t'11-bounded',\n\t\t\t\t\t\t\t]\n\t\t\t\t\t\t}\n\t\t\t\t\t]\n\t\t\t\t},\n\t\t\t\tnav: [\n\t\t\t\t\t{text: '首页', link: '/zh/'},\n\t\t\t\t\t{text: '指南', link: '/zh/guide/'},\n\t\t\t\t\t{text: '更新日志', link: '/zh/changelog/'}\n\t\t\t\t],\n\t\t\t\tsearchPlaceholder: '搜索...',\n\t\t\t\teditLinkText: '帮助改善此页面！',\n\t\t\t\tlastUpdated: '最后更新时间'\n\t\t\t}\n\t\t}\n\t},\n\tplugins: [\n\t\t'@vuepress/back-to-top',\n\t\t/*['@vuepress/google-analytics', {\n\t\t\tga: 'UA-37288388-24' // UA-00000000-0\n\t\t}],*/\n\t\t['seo', {\n\t\t\ttitle: $page => `${$page.title} — Vue Grid Layout`,\n\t\t\t// image: () => 'https://jbaysolutions.github.io/vue-grid-layout/assets/img/og.jpg',\n\t\t\tsiteTitle: (_, $site) => $site.title,\n\t\t\tdescription: $page => $page.frontmatter.description || description,\n\t\t\tauthor: (_, $site) => $site.themeConfig.author,\n\t\t\ttags: $page => $page.frontmatter.tags,\n\t\t\ttwitterCard: _ => 'summary_large_image',\n\t\t\ttype: () => 'article',\n\t\t\turl: (_, $site, path) => ($site.themeConfig.domain || '') + path,\n\t\t\tpublishedAt: $page => $page.frontmatter.date && new Date($page.frontmatter.date),\n\t\t\tmodifiedAt: $page => $page.lastUpdated && new Date($page.lastUpdated),\n\t\t}],\n\t\t['vuepress-plugin-serve', {\n\t\t\tport: 8080,\n\t\t\tstaticOptions: {\n\t\t\t\tdotfiles: 'allow',\n\t\t\t},\n\t\t\t/*beforeServer(app, server) {\n\t\t\t\tapp.get('/path/to/my/custom', function(req, res) {\n\t\t\t\t\tres.json({ custom: 'response' })\n\t\t\t\t})\n\t\t\t},*/\n\t\t}],\n\t],\n\tdest: 'public',\n}\n"
  },
  {
    "path": "website/docs/.vuepress/enhanceApp.js",
    "content": "/**\n * App level enhancements. Read more here:\n * https://vuepress.vuejs.org/guide/basic-config.html#app-level-enhancements\n */\n// import pageComponents from '@internal/page-components'\nimport Autocomplete from './Autocomplete'\n// import ArticleCard from './components/ArticleCard'\n// import GithubButton from 'vue-github-button'\n// import VTooltip from 'v-tooltip'\n\n// import '../../node_modules/@braid/vue-formulate/themes/snow/snow.scss'\n\nexport default ({ Vue }) => {\n\t/*Vue.prototype.$gridlayout = {\n\t\tasync load () {\n\t\t\tawait import('vue-grid-layout');\n\t\t\tconsole.log(\"LOADED!\")\n\t\t},\n\t};*/\n  /*Vue.use(VueFormulate, {\n    plugins: [ Autocomplete ]\n  })*/\n\n  // Vue.use(VTooltip)\n\n  // for (const [name, component] of Object.entries(pageComponents)) {\n  //   Vue.component(name, component)\n  // }\n  // Vue.component('github-button', GithubButton)\n  // Vue.component('ArticleCard', ArticleCard)\n}\n"
  },
  {
    "path": "website/docs/.vuepress/public/examples/01-basic.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"utf-8\">\n    <title>Vue Grid Layout Example 1 - Basic</title>\n    <meta name=\"viewport\" content=\"initial-scale=1, maximum-scale=1, user-scalable=no\">\n    <link rel=\"stylesheet\" href=\"app.css\">\n    <!--<link rel=\"stylesheet\" href=\"../dist/vue-grid-layout.css\">-->\n</head>\n<body>\n    <h1>Vue Grid Layout Example 1 - Basic</h1>\n\n    <a href=\"https://github.com/jbaysolutions/vue-grid-layout\">View project on Github</a>\n    <br/>\n    <a href=\"02-events.html\">Next example: Move and resize events</a>\n\n    <div id=\"app\" style=\"width: 100%;\">\n        <!--<pre>{{ $data | json }}</pre>-->\n        <div>\n            <div class=\"layoutJSON\">\n                Displayed as <code>[x, y, w, h]</code>:\n                <div class=\"columns\">\n                    <div class=\"layoutItem\" v-for=\"item in layout\">\n                        <b>{{item.i}}</b>: [{{item.x}}, {{item.y}}, {{item.w}}, {{item.h}}]\n                    </div>\n                </div>\n            </div>\n        </div>\n        <div id=\"content\">\n            <!--<button @click=\"decreaseWidth\">Decrease Width</button>\n            <button @click=\"increaseWidth\">Increase Width</button>\n            <button @click=\"addItem\">Add an item</button>-->\n            <input type=\"checkbox\" v-model=\"draggable\"/> Draggable\n            <input type=\"checkbox\" v-model=\"resizable\"/> Resizable\n            <br/>\n            <grid-layout :layout=\"layout\"\n                         :col-num=\"12\"\n                         :row-height=\"30\"\n                         :is-draggable=\"draggable\"\n                         :is-resizable=\"resizable\"\n                         :vertical-compact=\"true\"\n                         :use-css-transforms=\"true\"\n            >\n                <grid-item v-for=\"item in layout\"\n                           :static=\"item.static\"\n                           :x=\"item.x\"\n                           :y=\"item.y\"\n                           :w=\"item.w\"\n                           :h=\"item.h\"\n                           :i=\"item.i\"\n                        >\n                    <span class=\"text\">{{itemTitle(item)}}</span>\n                </grid-item>\n            </grid-layout>\n        </div>\n\n    </div>\n    <script src=\"vue.min.js\"></script>\n    <script src=\"../dist/vue-grid-layout.umd.min.js\"></script>\n    <script src=\"01-basic.js\"></script>\n</body>\n</html>\n"
  },
  {
    "path": "website/docs/.vuepress/public/examples/01-basic.js",
    "content": "var testLayout = [\n    {\"x\":0,\"y\":0,\"w\":2,\"h\":2,\"i\":\"0\", static: false},\n    {\"x\":2,\"y\":0,\"w\":2,\"h\":4,\"i\":\"1\", static: true},\n    {\"x\":4,\"y\":0,\"w\":2,\"h\":5,\"i\":\"2\", static: false},\n    {\"x\":6,\"y\":0,\"w\":2,\"h\":3,\"i\":\"3\", static: false},\n    {\"x\":8,\"y\":0,\"w\":2,\"h\":3,\"i\":\"4\", static: false},\n    {\"x\":10,\"y\":0,\"w\":2,\"h\":3,\"i\":\"5\", static: false},\n    {\"x\":0,\"y\":5,\"w\":2,\"h\":5,\"i\":\"6\", static: false},\n    {\"x\":2,\"y\":5,\"w\":2,\"h\":5,\"i\":\"7\", static: false},\n    {\"x\":4,\"y\":5,\"w\":2,\"h\":5,\"i\":\"8\", static: false},\n    {\"x\":6,\"y\":3,\"w\":2,\"h\":4,\"i\":\"9\", static: true},\n    {\"x\":8,\"y\":4,\"w\":2,\"h\":4,\"i\":\"10\", static: false},\n    {\"x\":10,\"y\":4,\"w\":2,\"h\":4,\"i\":\"11\", static: false},\n    {\"x\":0,\"y\":10,\"w\":2,\"h\":5,\"i\":\"12\", static: false},\n    {\"x\":2,\"y\":10,\"w\":2,\"h\":5,\"i\":\"13\", static: false},\n    {\"x\":4,\"y\":8,\"w\":2,\"h\":4,\"i\":\"14\", static: false},\n    {\"x\":6,\"y\":8,\"w\":2,\"h\":4,\"i\":\"15\", static: false},\n    {\"x\":8,\"y\":10,\"w\":2,\"h\":5,\"i\":\"16\", static: false},\n    {\"x\":10,\"y\":4,\"w\":2,\"h\":2,\"i\":\"17\", static: false},\n    {\"x\":0,\"y\":9,\"w\":2,\"h\":3,\"i\":\"18\", static: false},\n    {\"x\":2,\"y\":6,\"w\":2,\"h\":2,\"i\":\"19\", static: false}\n];\n\n// var GridLayout = VueGridLayout.GridLayout;\n// var GridItem = VueGridLayout.GridItem;\n\nnew Vue({\n    el: '#app',\n    // components: {\n    //     \"GridLayout\": GridLayout,\n    //     \"GridItem\": GridItem\n    // },\n    data: {\n        layout: testLayout,\n        draggable: true,\n        resizable: true,\n        index: 0\n    },\n\n/*\n    mounted: function () {\n        this.index = this.layout.length;\n    },\n    */\n    methods: {\n        itemTitle(item) {\n            var result = item.i;\n            if (item.static) {\n                result += \" - Static\";\n            }\n            return result;\n        }\n/*\n        increaseWidth: function(item) {\n            var width = document.getElementById(\"content\").offsetWidth;\n            width += 20;\n            document.getElementById(\"content\").style.width = width+\"px\";\n        },\n        decreaseWidth: function(item) {\n\n            var width = document.getElementById(\"content\").offsetWidth;\n            width -= 20;\n            document.getElementById(\"content\").style.width = width+\"px\";\n        },\n        removeItem: function(item) {\n            //console.log(\"### REMOVE \" + item.i);\n            this.layout.splice(this.layout.indexOf(item), 1);\n        },\n        addItem: function() {\n            var self = this;\n            //console.log(\"### LENGTH: \" + this.layout.length);\n            var item = {\"x\":0,\"y\":0,\"w\":2,\"h\":2,\"i\":this.index+\"\", whatever: \"bbb\"};\n            this.index++;\n            this.layout.push(item);\n        }\n*/\n    }\n});\n\n/*\nfunction generateLayout() {\n    return _.map(_.range(0, 25), function (item, i) {\n        var y = Math.ceil(Math.random() * 4) + 1;\n        return {\n            x: _.random(0, 5) * 2 % 12,\n            y: Math.floor(i / 6) * y,\n            w: 2,\n            h: y,\n            i: i.toString(),\n            static: Math.random() < 0.05\n        };\n    });\n}*/\n\n\n\n"
  },
  {
    "path": "website/docs/.vuepress/public/examples/02-events.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"utf-8\">\n    <title>Vue Grid Layout Example 2 - Move and resize events</title>\n    <meta name=\"viewport\" content=\"initial-scale=1, maximum-scale=1, user-scalable=no\">\n    <link rel=\"stylesheet\" href=\"app.css\">\n    <!--<link rel=\"stylesheet\" href=\"../dist/vue-grid-layout.css\">-->\n</head>\n<body>\n    <h1>Vue Grid Layout Example 2 - Move and resize events</h1>\n\n    <a href=\"https://github.com/jbaysolutions/vue-grid-layout\">View project on Github</a>\n    <br/>\n    <a href=\"01-basic.html\">Previous example: Basic</a>\n    <br/>\n    <a href=\"03-multiple-grids.html\">Next example: Multiple grids</a>\n\n    <div id=\"app\" style=\"width: 100%;\">\n        <!--<pre>{{ $data | json }}</pre>-->\n        <div>\n            <div class=\"layoutJSON\">\n                Displayed as <code>[x, y, w, h]</code>:\n                <div class=\"columns\">\n                    <div class=\"layoutItem\" v-for=\"item in layout\">\n                        <b>{{item.i}}</b>: [{{item.x}}, {{item.y}}, {{item.w}}, {{item.h}}]\n                    </div>\n                </div>\n            </div>\n            <div ref=\"eventsDiv\" class=\"eventsJSON\">\n                Events:\n                <div v-for=\"event in eventLog\">\n                    {{event}}\n                </div>\n            </div>\n        </div>\n        <div id=\"content\">\n            <!--<button @click=\"decreaseWidth\">Decrease Width</button>\n            <button @click=\"increaseWidth\">Increase Width</button>\n            <button @click=\"addItem\">Add an item</button>-->\n            <grid-layout :layout=\"layout\"\n                         :col-num=\"12\"\n                         :row-height=\"30\"\n                         :is-draggable=\"true\"\n                         :is-resizable=\"true\"\n                         :vertical-compact=\"true\"\n                         :use-css-transforms=\"true\"\n                         @layout-created=\"layoutCreatedEvent\"\n                         @layout-before-mount=\"layoutBeforeMountEvent\"\n                         @layout-mounted=\"layoutMountedEvent\"\n                         @layout-ready=\"layoutReadyEvent\"\n                         @layout-updated=\"layoutUpdatedEvent\"\n            >\n                <grid-item v-for=\"item in layout\"\n                           :x=\"item.x\"\n                           :y=\"item.y\"\n                           :w=\"item.w\"\n                           :h=\"item.h\"\n                           :i=\"item.i\"\n                           @resize=\"resizeEvent\"\n                           @move=\"moveEvent\"\n                           @resized=\"resizedEvent\"\n                           @container-resized=\"containerResizedEvent\"\n                           @moved=\"movedEvent\"\n                >\n                    <span class=\"text\">{{item.i}}</span>\n                </grid-item>\n            </grid-layout>\n        </div>\n        <!--<pre>{{eventLog | json}}</pre>-->\n\n    </div>\n    <script src=\"vue.min.js\"></script>\n    <script src=\"../dist/vue-grid-layout.umd.min.js\"></script>\n    <script src=\"02-events.js\"></script>\n</body>\n</html>\n"
  },
  {
    "path": "website/docs/.vuepress/public/examples/02-events.js",
    "content": "var testLayout = [\n    {\"x\":0,\"y\":0,\"w\":2,\"h\":2,\"i\":\"0\"},\n    {\"x\":2,\"y\":0,\"w\":2,\"h\":4,\"i\":\"1\"},\n    {\"x\":4,\"y\":0,\"w\":2,\"h\":5,\"i\":\"2\"},\n    {\"x\":6,\"y\":0,\"w\":2,\"h\":3,\"i\":\"3\"},\n    {\"x\":8,\"y\":0,\"w\":2,\"h\":3,\"i\":\"4\"},\n    {\"x\":10,\"y\":0,\"w\":2,\"h\":3,\"i\":\"5\"},\n    {\"x\":0,\"y\":5,\"w\":2,\"h\":5,\"i\":\"6\"},\n    {\"x\":2,\"y\":5,\"w\":2,\"h\":5,\"i\":\"7\"},\n    {\"x\":4,\"y\":5,\"w\":2,\"h\":5,\"i\":\"8\"},\n    {\"x\":6,\"y\":4,\"w\":2,\"h\":4,\"i\":\"9\"},\n    {\"x\":8,\"y\":4,\"w\":2,\"h\":4,\"i\":\"10\"},\n    {\"x\":10,\"y\":4,\"w\":2,\"h\":4,\"i\":\"11\"},\n    {\"x\":0,\"y\":10,\"w\":2,\"h\":5,\"i\":\"12\"},\n    {\"x\":2,\"y\":10,\"w\":2,\"h\":5,\"i\":\"13\"},\n    {\"x\":4,\"y\":8,\"w\":2,\"h\":4,\"i\":\"14\"},\n    {\"x\":6,\"y\":8,\"w\":2,\"h\":4,\"i\":\"15\"},\n    {\"x\":8,\"y\":10,\"w\":2,\"h\":5,\"i\":\"16\"},\n    {\"x\":10,\"y\":4,\"w\":2,\"h\":2,\"i\":\"17\"},\n    {\"x\":0,\"y\":9,\"w\":2,\"h\":3,\"i\":\"18\"},\n    {\"x\":2,\"y\":6,\"w\":2,\"h\":2,\"i\":\"19\"}\n];\n\nnew Vue({\n    el: '#app',\n    data: {\n        layout: testLayout,\n        index: 0,\n        eventLog: []\n    },\n    watch: {\n        eventLog: function() {\n            var eventsDiv = this.$refs.eventsDiv;\n            eventsDiv.scrollTop = eventsDiv.scrollHeight;\n        }\n    },\n    methods: {\n        moveEvent: function(i, newX, newY){\n            var msg = \"MOVE i=\" + i + \", X=\" + newX + \", Y=\" + newY;\n            this.eventLog.push(msg);\n            console.log(msg);\n\n        },\n        movedEvent: function(i, newX, newY){\n            var msg = \"MOVED i=\" + i + \", X=\" + newX + \", Y=\" + newY;\n            this.eventLog.push(msg);\n            console.log(msg);\n\n        },\n        resizeEvent: function(i, newH, newW, newHPx, newWPx){\n            var msg = \"RESIZE i=\" + i + \", H=\" + newH + \", W=\" + newW + \", H(px)=\" + newHPx + \", W(px)=\" + newWPx;\n            this.eventLog.push(msg);\n            console.log(msg);\n        },\n        resizedEvent: function(i, newX, newY, newHPx, newWPx){\n            var msg = \"RESIZED i=\" + i + \", X=\" + newX + \", Y=\" + newY + \", H(px)=\" + newHPx + \", W(px)=\" + newWPx;\n            this.eventLog.push(msg);\n            console.log(msg);\n\n        },\n        containerResizedEvent: function(i, newH, newW, newHPx, newWPx){\n            var msg = \"CONTAINER RESIZED i=\" + i + \", H=\" + newH + \", W=\" + newW + \", H(px)=\" + newHPx + \", W(px)=\" + newWPx;\n            this.eventLog.push(msg);\n            console.log(msg);\n        },\n        /**\n         *\n         * @param i the item id/index\n         * @param newH new height in grid rows\n         * @param newW new width in grid columns\n         * @param newHPx new height in pixels\n         * @param newWPx new width in pixels\n         *\n         */\n        resizedEvent: function(i, newH, newW, newHPx, newWPx){\n            var msg = \"RESIZED i=\" + i + \", H=\" + newH + \", W=\" + newW + \", H(px)=\" + newHPx + \", W(px)=\" + newWPx;\n            this.eventLog.push(msg);\n            console.log(msg);\n        },\n\n        layoutCreatedEvent: function(newLayout){\n            this.eventLog.push(\"Created layout\");\n            console.log(\"Created layout: \", newLayout)\n        },\n        layoutBeforeMountEvent: function(newLayout){\n            this.eventLog.push(\"beforeMount layout\");\n            console.log(\"beforeMount layout: \", newLayout)\n        },\n        layoutMountedEvent: function(newLayout){\n            this.eventLog.push(\"Mounted layout\");\n            console.log(\"Mounted layout: \", newLayout)\n        },\n        layoutReadyEvent: function(newLayout){\n            this.eventLog.push(\"Ready layout\");\n            console.log(\"Ready layout: \", newLayout)\n        },\n        layoutUpdatedEvent: function(newLayout){\n            this.eventLog.push(\"Updated layout\");\n            console.log(\"Updated layout: \", newLayout)\n        },\n    }\n});\n\n"
  },
  {
    "path": "website/docs/.vuepress/public/examples/03-multiple-grids.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"utf-8\">\n    <title>Vue Grid Layout Example 3 - Multiple grids</title>\n    <meta name=\"viewport\" content=\"initial-scale=1, maximum-scale=1, user-scalable=no\">\n    <!--<link rel=\"stylesheet\" href=\"../dist/vue-grid-layout.css\">-->\n    <link rel=\"stylesheet\" href=\"app.css\">\n</head>\n<body>\n<h1>Vue Grid Layout Example 3 - Multiple grids</h1>\n\n<a href=\"https://github.com/jbaysolutions/vue-grid-layout\">View project on Github</a>\n<br/>\n<a href=\"02-events.html\">Previous example: Move and resize events</a>\n<br/>\n<a href=\"04-allow-ignore.html\">Next example: Drag allow/ignore elements</a>\n\n\n<div id=\"app1\" style=\"width: 100%;\">\n    <h3>Grid 1</h3>\n    <div>\n        <div class=\"layoutJSON\">\n            Displayed as <code>[x, y, w, h]</code>:\n            <div class=\"columns\">\n                <div class=\"layoutItem\" v-for=\"item in layout\">\n                    <b>{{item.i}}</b>: [{{item.x}}, {{item.y}}, {{item.w}}, {{item.h}}]\n                </div>\n            </div>\n        </div>\n    </div>\n    <grid-layout :layout=\"layout\"\n                 :col-num=\"12\"\n                 :row-height=\"30\"\n                 :is-draggable=\"true\"\n                 :is-resizable=\"true\"\n                 :vertical-compact=\"true\"\n                 :use-css-transforms=\"true\"\n    >\n        <grid-item v-for=\"item in layout\"\n                   :x=\"item.x\"\n                   :y=\"item.y\"\n                   :w=\"item.w\"\n                   :h=\"item.h\"\n                   :i=\"item.i\"\n        >\n            <span class=\"text\">{{item.i}}</span>\n        </grid-item>\n    </grid-layout>\n</div>\n<hr/>\n<div id=\"app2\" style=\"width: 100%;\">\n    <h3>Grid 2</h3>\n    <div>\n        <div class=\"layoutJSON\">\n            Displayed as <code>[x, y, w, h]</code>:\n            <div class=\"columns\">\n                <div class=\"layoutItem\" v-for=\"item in layout\">\n                    <b>{{item.i}}</b>: [{{item.x}}, {{item.y}}, {{item.w}}, {{item.h}}]\n                </div>\n            </div>\n        </div>\n    </div>\n    <grid-layout :layout=\"layout\"\n                 :col-num=\"12\"\n                 :row-height=\"30\"\n                 :is-draggable=\"true\"\n                 :is-resizable=\"true\"\n                 :vertical-compact=\"true\"\n                 :use-css-transforms=\"true\"\n    >\n        <grid-item v-for=\"item in layout\"\n                   :x=\"item.x\"\n                   :y=\"item.y\"\n                   :w=\"item.w\"\n                   :h=\"item.h\"\n                   :i=\"item.i\"\n        >\n            <span class=\"text\">{{item.i}}</span>\n        </grid-item>\n    </grid-layout>\n</div>\n\n<script src=\"vue.min.js\"></script>\n<script src=\"../dist/vue-grid-layout.umd.min.js\"></script>\n<script type=\"text/javascript\">\n    new Vue({\n        el: '#app1',\n        data: {\n            layout: [\n                {\"x\":0,\"y\":0,\"w\":2,\"h\":2,\"i\":\"0\"},\n                {\"x\":2,\"y\":0,\"w\":2,\"h\":4,\"i\":\"1\"},\n            ],\n            index: 0\n        },\n    });\n\n    new Vue({\n        el: '#app2',\n        data: {\n            layout: [\n                {\"x\":0,\"y\":0,\"w\":2,\"h\":2,\"i\":\"0\"},\n                {\"x\":2,\"y\":0,\"w\":2,\"h\":4,\"i\":\"1\"},\n                {\"x\":4,\"y\":0,\"w\":2,\"h\":2,\"i\":\"2\"},\n            ],\n            index: 0\n        },\n    });\n\n\n\n</script>\n</body>\n</html>"
  },
  {
    "path": "website/docs/.vuepress/public/examples/04-allow-ignore.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"utf-8\">\n    <title>Vue Grid Layout Example 4 - Drag allow/ignore elements</title>\n    <meta name=\"viewport\" content=\"initial-scale=1, maximum-scale=1, user-scalable=no\">\n    <!--<link rel=\"stylesheet\" href=\"../dist/vue-grid-layout.css\">-->\n    <link rel=\"stylesheet\" href=\"app.css\">\n</head>\n<body>\n<h1>Vue Grid Layout Example 4 - Drag allow/ignore elements</h1>\n\n<a href=\"https://github.com/jbaysolutions/vue-grid-layout\">View project on Github</a>\n<br/>\n<a href=\"03-multiple-grids.html\">Previous example: Multiple grids</a>\n<br/>\n<a href=\"05-mirrored.html\">Next example: Mirrored grid layout</a>\n\n\n<div id=\"app\" style=\"width: 100%;\">\n    <!--<pre>{{ $data | json }}</pre>-->\n    <div>\n        <br/>\n        Ignore drag on certain elements and allow on on others.\n        <br/>\n        Click and drag the dots on the corner of each item to reposition\n        <div class=\"layoutJSON\">\n            Displayed as <code>[x, y, w, h]</code>:\n            <div class=\"columns\">\n                <div class=\"layoutItem\" v-for=\"item in layout\">\n                    <b>{{item.i}}</b>: [{{item.x}}, {{item.y}}, {{item.w}}, {{item.h}}]\n                </div>\n            </div>\n        </div>\n    </div>\n    <div id=\"content\">\n        <!--<button @click=\"addItem\">Add an item</button>-->\n        <grid-layout :layout=\"layout\"\n                     :col-num=\"12\"\n                     :row-height=\"30\"\n                     :is-draggable=\"true\"\n                     :is-resizable=\"true\"\n                     :vertical-compact=\"true\"\n                     :use-css-transforms=\"true\"\n        >\n            <grid-item v-for=\"item in layout\"\n                       :x=\"item.x\"\n                       :y=\"item.y\"\n                       :w=\"item.w\"\n                       :h=\"item.h\"\n                       :i=\"item.i\"\n                       drag-allow-from=\".vue-draggable-handle\"\n                       drag-ignore-from=\".no-drag\"\n            >\n                <div class=\"text\">\n                    <div class=\"vue-draggable-handle\"></div>\n                    <div class=\"no-drag\">\n                        <span>{{item.i}}</span>\n                        <br/>\n                        <button>test</button>\n                    </div>\n                </div>\n            </grid-item>\n        </grid-layout>\n    </div>\n\n</div>\n\n<script src=\"vue.min.js\"></script>\n<script src=\"../dist/vue-grid-layout.umd.min.js\"></script>\n<script type=\"text/javascript\">\n    new Vue({\n        el: '#app',\n        data: {\n            layout: [\n                {\"x\":0,\"y\":0,\"w\":2,\"h\":2,\"i\":\"0\"},\n                {\"x\":2,\"y\":0,\"w\":2,\"h\":4,\"i\":\"1\"},\n                {\"x\":4,\"y\":0,\"w\":2,\"h\":5,\"i\":\"2\"},\n                {\"x\":6,\"y\":0,\"w\":2,\"h\":3,\"i\":\"3\"},\n                {\"x\":8,\"y\":0,\"w\":2,\"h\":3,\"i\":\"4\"},\n                {\"x\":10,\"y\":0,\"w\":2,\"h\":3,\"i\":\"5\"},\n                {\"x\":0,\"y\":5,\"w\":2,\"h\":5,\"i\":\"6\"},\n                {\"x\":2,\"y\":5,\"w\":2,\"h\":5,\"i\":\"7\"},\n                {\"x\":4,\"y\":5,\"w\":2,\"h\":5,\"i\":\"8\"},\n                {\"x\":6,\"y\":4,\"w\":2,\"h\":4,\"i\":\"9\"},\n                {\"x\":8,\"y\":4,\"w\":2,\"h\":4,\"i\":\"10\"},\n                {\"x\":10,\"y\":4,\"w\":2,\"h\":4,\"i\":\"11\"},\n                {\"x\":0,\"y\":10,\"w\":2,\"h\":5,\"i\":\"12\"},\n                {\"x\":2,\"y\":10,\"w\":2,\"h\":5,\"i\":\"13\"},\n                {\"x\":4,\"y\":8,\"w\":2,\"h\":4,\"i\":\"14\"},\n                {\"x\":6,\"y\":8,\"w\":2,\"h\":4,\"i\":\"15\"},\n                {\"x\":8,\"y\":10,\"w\":2,\"h\":5,\"i\":\"16\"},\n                {\"x\":10,\"y\":4,\"w\":2,\"h\":2,\"i\":\"17\"},\n                {\"x\":0,\"y\":9,\"w\":2,\"h\":3,\"i\":\"18\"},\n                {\"x\":2,\"y\":6,\"w\":2,\"h\":2,\"i\":\"19\"}\n            ],\n            index: 0\n        },\n    });\n\n\n\n</script>\n</body>\n</html>"
  },
  {
    "path": "website/docs/.vuepress/public/examples/05-mirrored.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"utf-8\">\n    <title>Vue Grid Layout Example 4 - Mirrored grid layout</title>\n    <meta name=\"viewport\" content=\"initial-scale=1, maximum-scale=1, user-scalable=no\">\n    <!--<link rel=\"stylesheet\" href=\"../dist/vue-grid-layout.css\">-->\n    <link rel=\"stylesheet\" href=\"app.css\">\n</head>\n<body>\n<h1>Vue Grid Layout Example 5 - Mirrored grid layout</h1>\n\n<a href=\"https://github.com/jbaysolutions/vue-grid-layout\">View project on Github</a>\n<br/>\n<a href=\"04-allow-ignore.html\">Previous example: Drag allow/ignore elements</a>\n<br/>\n<a href=\"06-responsive.html\">Next example: Responsive</a>\n\n\n<div id=\"app\" style=\"width: 100%;\">\n    <!--<pre>{{ $data | json }}</pre>-->\n    <div>\n        <div class=\"layoutJSON\">\n            Displayed as <code>[x, y, w, h]</code>:\n            <div class=\"columns\">\n                <div class=\"layoutItem\" v-for=\"item in layout\">\n                    <b>{{item.i}}</b>: [{{item.x}}, {{item.y}}, {{item.w}}, {{item.h}}]\n                </div>\n            </div>\n        </div>\n    </div>\n    <div id=\"content\">\n        <!--<button @click=\"decreaseWidth\">Decrease Width</button>\n        <button @click=\"increaseWidth\">Increase Width</button>\n        <button @click=\"addItem\">Add an item</button>-->\n        <input type=\"checkbox\" v-model=\"draggable\"/> Draggable\n        <input type=\"checkbox\" v-model=\"resizable\"/> Resizable\n        <input type=\"checkbox\" v-model=\"mirrored\"/> Mirrored\n        <br/>\n        <grid-layout :layout=\"layout\"\n                     :col-num=\"12\"\n                     :row-height=\"30\"\n                     :is-draggable=\"draggable\"\n                     :is-resizable=\"resizable\"\n                     :is-mirrored=\"mirrored\"\n                     :vertical-compact=\"true\"\n                     :use-css-transforms=\"true\"\n        >\n            <grid-item v-for=\"item in layout\"\n                       :x=\"item.x\"\n                       :y=\"item.y\"\n                       :w=\"item.w\"\n                       :h=\"item.h\"\n                       :i=\"item.i\"\n            >\n                <span class=\"text\">{{item.i}}</span>\n            </grid-item>\n        </grid-layout>\n    </div>\n\n</div>\n<script src=\"vue.min.js\"></script>\n<script src=\"../dist/vue-grid-layout.umd.min.js\"></script>\n<script type=\"text/javascript\">\n    const testLayout = [\n        {\"x\":0,\"y\":0,\"w\":2,\"h\":2,\"i\":\"0\"},\n        {\"x\":2,\"y\":0,\"w\":2,\"h\":4,\"i\":\"1\"},\n        {\"x\":4,\"y\":0,\"w\":2,\"h\":5,\"i\":\"2\"},\n        {\"x\":6,\"y\":0,\"w\":2,\"h\":3,\"i\":\"3\"},\n        {\"x\":8,\"y\":0,\"w\":2,\"h\":3,\"i\":\"4\"},\n        {\"x\":10,\"y\":0,\"w\":2,\"h\":3,\"i\":\"5\"},\n        {\"x\":0,\"y\":5,\"w\":2,\"h\":5,\"i\":\"6\"},\n        {\"x\":2,\"y\":5,\"w\":2,\"h\":5,\"i\":\"7\"},\n        {\"x\":4,\"y\":5,\"w\":2,\"h\":5,\"i\":\"8\"},\n        {\"x\":6,\"y\":4,\"w\":2,\"h\":4,\"i\":\"9\"},\n        {\"x\":8,\"y\":4,\"w\":2,\"h\":4,\"i\":\"10\"},\n        {\"x\":10,\"y\":4,\"w\":2,\"h\":4,\"i\":\"11\"},\n        {\"x\":0,\"y\":10,\"w\":2,\"h\":5,\"i\":\"12\"},\n        {\"x\":2,\"y\":10,\"w\":2,\"h\":5,\"i\":\"13\"},\n        {\"x\":4,\"y\":8,\"w\":2,\"h\":4,\"i\":\"14\"},\n        {\"x\":6,\"y\":8,\"w\":2,\"h\":4,\"i\":\"15\"},\n        {\"x\":8,\"y\":10,\"w\":2,\"h\":5,\"i\":\"16\"},\n        {\"x\":10,\"y\":4,\"w\":2,\"h\":2,\"i\":\"17\"},\n        {\"x\":0,\"y\":9,\"w\":2,\"h\":3,\"i\":\"18\"},\n        {\"x\":2,\"y\":6,\"w\":2,\"h\":2,\"i\":\"19\"}\n    ];\n\n    new Vue({\n        el: '#app',\n        data: {\n            layout: testLayout,\n            draggable: true,\n            resizable: true,\n            mirrored: true,\n            index: 0\n        },\n    });\n</script>\n</body>\n</html>\n"
  },
  {
    "path": "website/docs/.vuepress/public/examples/06-responsive.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"utf-8\">\n    <title>Vue Grid Layout Example 1 - Basic Responsive</title>\n    <meta name=\"viewport\" content=\"initial-scale=1, maximum-scale=1, user-scalable=no\">\n    <link rel=\"stylesheet\" href=\"app.css\">\n    <!--<link rel=\"stylesheet\" href=\"../dist/vue-grid-layout.css\">-->\n</head>\n<body>\n    <div id=\"app\" style=\"width: 100%;\">\n        <!--<pre>{{ $data | json }}</pre>-->\n        <div>\n            <div class=\"layoutJSON\">\n                Displayed as <code>[x, y, w, h]</code>:\n                <div class=\"columns\">\n                    <div class=\"layoutItem\" v-for=\"item in layout\">\n                        <b>{{item.i}}</b>: [{{item.x}}, {{item.y}}, {{item.w}}, {{item.h}}]\n                    </div>\n                </div>\n            </div>\n        </div>\n        <div id=\"content\">\n            <!--<button @click=\"decreaseWidth\">Decrease Width</button>\n            <button @click=\"increaseWidth\">Increase Width</button>\n            <button @click=\"addItem\">Add an item</button>-->\n            <input type=\"checkbox\" v-model=\"draggable\"/> Draggable\n            <input type=\"checkbox\" v-model=\"resizable\"/> Resizable\n            <input type=\"checkbox\" v-model=\"responsive\"/> Responsive\n            <br/>\n            <grid-layout v-if=\"show\"\n                         :layout.sync=\"layout\"\n                         :col-num=\"12\"\n                         :row-height=\"30\"\n                         :is-draggable=\"draggable\"\n                         :is-resizable=\"resizable\"\n                         :vertical-compact=\"true\"\n                         :use-css-transforms=\"true\"\n                         :responsive=\"responsive\"\n            >\n                <grid-item v-for=\"item in layout\"\n                           :x=\"item.x\"\n                           :y=\"item.y\"\n                           :w=\"item.w\"\n                           :h=\"item.h\"\n                           :i=\"item.i\"\n                        >\n                    <span class=\"text\">{{item.i}}</span>\n                </grid-item>\n            </grid-layout>\n        </div>\n\n    </div>\n    <script src=\"https://cdn.jsdelivr.net/npm/vue@2.6.12/dist/vue.min.js\"></script>\n    <script src=\"https://cdn.jsdelivr.net/npm/vue-grid-layout@2.3.11/dist/vue-grid-layout.umd.min.js\"></script>\n    <script src=\"06-responsive.js\"></script>\n</body>\n</html>\n"
  },
  {
    "path": "website/docs/.vuepress/public/examples/06-responsive.js",
    "content": "var testLayout = [\n    {\"x\":0,\"y\":0,\"w\":2,\"h\":2,\"i\":\"0\"},\n    {\"x\":2,\"y\":0,\"w\":2,\"h\":4,\"i\":\"1\"},\n    {\"x\":4,\"y\":0,\"w\":2,\"h\":5,\"i\":\"2\"},\n    {\"x\":6,\"y\":0,\"w\":2,\"h\":3,\"i\":\"3\"},\n    {\"x\":8,\"y\":0,\"w\":2,\"h\":3,\"i\":\"4\"},\n    {\"x\":10,\"y\":0,\"w\":2,\"h\":3,\"i\":\"5\"},\n    {\"x\":0,\"y\":5,\"w\":2,\"h\":5,\"i\":\"6\"},\n    {\"x\":2,\"y\":5,\"w\":2,\"h\":5,\"i\":\"7\"},\n    {\"x\":4,\"y\":5,\"w\":2,\"h\":5,\"i\":\"8\"},\n    {\"x\":6,\"y\":4,\"w\":2,\"h\":4,\"i\":\"9\"},\n    {\"x\":8,\"y\":4,\"w\":2,\"h\":4,\"i\":\"10\"},\n    {\"x\":10,\"y\":4,\"w\":2,\"h\":4,\"i\":\"11\"},\n    {\"x\":0,\"y\":10,\"w\":2,\"h\":5,\"i\":\"12\"},\n    {\"x\":2,\"y\":10,\"w\":2,\"h\":5,\"i\":\"13\"},\n    {\"x\":4,\"y\":8,\"w\":2,\"h\":4,\"i\":\"14\"},\n    {\"x\":6,\"y\":8,\"w\":2,\"h\":4,\"i\":\"15\"},\n    {\"x\":8,\"y\":10,\"w\":2,\"h\":5,\"i\":\"16\"},\n    {\"x\":10,\"y\":4,\"w\":2,\"h\":2,\"i\":\"17\"},\n    {\"x\":0,\"y\":9,\"w\":2,\"h\":3,\"i\":\"18\"},\n    {\"x\":2,\"y\":6,\"w\":2,\"h\":2,\"i\":\"19\"}\n];\n\n// var GridLayout = VueGridLayout.GridLayout;\n// var GridItem = VueGridLayout.GridItem;\n\nnew Vue({\n    el: '#app',\n    // components: {\n    //     \"GridLayout\": GridLayout,\n    //     \"GridItem\": GridItem\n    // },\n    data: {\n        layout: testLayout,\n        draggable: true,\n        resizable: true,\n        responsive: true,\n        index: 0,\n        show: false,\n    },\n    mounted: function () {\n        this.index = this.layout.length;\n        this.$nextTick(function () {\n            this.show = true;\n        })\n    },\n/*    methods: {\n        increaseWidth: function(item) {\n            var width = document.getElementById(\"content\").offsetWidth;\n            width += 20;\n            document.getElementById(\"content\").style.width = width+\"px\";\n        },\n        decreaseWidth: function(item) {\n\n            var width = document.getElementById(\"content\").offsetWidth;\n            width -= 20;\n            document.getElementById(\"content\").style.width = width+\"px\";\n        },\n        removeItem: function(item) {\n            //console.log(\"### REMOVE \" + item.i);\n            this.layout.splice(this.layout.indexOf(item), 1);\n        },\n        addItem: function() {\n            var self = this;\n            //console.log(\"### LENGTH: \" + this.layout.length);\n            var item = {\"x\":0,\"y\":0,\"w\":2,\"h\":2,\"i\":this.index+\"\", whatever: \"bbb\"};\n            this.index++;\n            this.layout.push(item);\n        }\n    }\n*/\n});\n\n/*\nfunction generateLayout() {\n    return _.map(_.range(0, 25), function (item, i) {\n        var y = Math.ceil(Math.random() * 4) + 1;\n        return {\n            x: _.random(0, 5) * 2 % 12,\n            y: Math.floor(i / 6) * y,\n            w: 2,\n            h: y,\n            i: i.toString(),\n            static: Math.random() < 0.05\n        };\n    });\n}*/\n\n\n\n"
  },
  {
    "path": "website/docs/.vuepress/public/examples/07-prevent-collision.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n  <meta charset=\"utf-8\">\n  <title>Vue Grid Layout Example 7 - Prevent Collision</title>\n  <meta name=\"viewport\" content=\"initial-scale=1, maximum-scale=1, user-scalable=no\">\n  <link rel=\"stylesheet\" href=\"app.css\">\n  <!--<link rel=\"stylesheet\" href=\"../dist/vue-grid-layout.css\">-->\n</head>\n\n<body>\n  <div id=\"app\" style=\"width: 100%;\">\n    <!--<pre>{{ $data | json }}</pre>-->\n    <div>\n      <div class=\"layoutJSON\">\n        Displayed as <code>[x, y, w, h]</code>:\n        <div class=\"columns\">\n          <div class=\"layoutItem\" v-for=\"item in layout\">\n            <b>{{item.i}}</b>: [{{item.x}}, {{item.y}}, {{item.w}}, {{item.h}}]\n          </div>\n        </div>\n      </div>\n    </div>\n    <div id=\"content\">\n      <!--<button @click=\"decreaseWidth\">Decrease Width</button>\n            <button @click=\"increaseWidth\">Increase Width</button>\n            <button @click=\"addItem\">Add an item</button>-->\n      <br />\n      <grid-layout :layout.sync=\"layout\"\n                   :col-num=\"12\"\n                   :row-height=\"30\"\n                   :is-draggable=\"draggable\"\n                   :is-resizable=\"resizable\"\n                   :vertical-compact=\"false\"\n                   :prevent-collision=\"true\"\n                   :use-css-transforms=\"true\"\n                   :responsive=\"false\">\n        <grid-item v-for=\"item in layout\"\n                   :x=\"item.x\"\n                   :y=\"item.y\"\n                   :w=\"item.w\"\n                   :h=\"item.h\"\n                   :i=\"item.i\"\n        >\n          <span class=\"text\">{{item.i}}</span>\n        </grid-item>\n      </grid-layout>\n    </div>\n\n  </div>\n  <script src=\"https://cdn.jsdelivr.net/npm/vue@2.6.12/dist/vue.min.js\"></script>\n  <script src=\"https://cdn.jsdelivr.net/npm/vue-grid-layout@2.3.11/dist/vue-grid-layout.umd.min.js\"></script>\n  <script src=\"07-prevent-collision.js\"></script>\n</body>\n\n</html>\n"
  },
  {
    "path": "website/docs/.vuepress/public/examples/07-prevent-collision.js",
    "content": "var testLayout = [\n  {\"x\":0,\"y\":0,\"w\":2,\"h\":5,\"i\":\"0\", static: false},\n  {\"x\":2,\"y\":0,\"w\":2,\"h\":2,\"i\":\"1\", static: false},\n  {\"x\":4,\"y\":0,\"w\":2,\"h\":5,\"i\":\"2\", static: false},\n  {\"x\":6,\"y\":0,\"w\":2,\"h\":3,\"i\":\"3\", static: false},\n  {\"x\":8,\"y\":0,\"w\":2,\"h\":3,\"i\":\"4\", static: false},\n  {\"x\":10,\"y\":0,\"w\":2,\"h\":3,\"i\":\"5\", static: false},\n  {\"x\":0,\"y\":5,\"w\":2,\"h\":5,\"i\":\"6\", static: false},\n  {\"x\":2,\"y\":5,\"w\":2,\"h\":5,\"i\":\"7\", static: false},\n  {\"x\":4,\"y\":5,\"w\":2,\"h\":5,\"i\":\"8\", static: false},\n  {\"x\":6,\"y\":3,\"w\":2,\"h\":4,\"i\":\"9\", static: false},\n  {\"x\":8,\"y\":4,\"w\":2,\"h\":4,\"i\":\"10\", static: false},\n  {\"x\":10,\"y\":4,\"w\":2,\"h\":4,\"i\":\"11\", static: false},\n  {\"x\":0,\"y\":10,\"w\":2,\"h\":5,\"i\":\"12\", static: false},\n  {\"x\":2,\"y\":10,\"w\":2,\"h\":5,\"i\":\"13\", static: false},\n  {\"x\":4,\"y\":8,\"w\":2,\"h\":4,\"i\":\"14\", static: false},\n  {\"x\":6,\"y\":8,\"w\":2,\"h\":4,\"i\":\"15\", static: false},\n  {\"x\":8,\"y\":10,\"w\":2,\"h\":5,\"i\":\"16\", static: false},\n  {\"x\":10,\"y\":4,\"w\":2,\"h\":2,\"i\":\"17\", static: false},\n  {\"x\":0,\"y\":9,\"w\":2,\"h\":3,\"i\":\"18\", static: false},\n  {\"x\":2,\"y\":6,\"w\":2,\"h\":2,\"i\":\"19\", static: false}\n];\n\n// var GridLayout = VueGridLayout.GridLayout;\n// var GridItem = VueGridLayout.GridItem;\n\nnew Vue({\n  el: '#app',\n  // components: {\n  //     \"GridLayout\": GridLayout,\n  //     \"GridItem\": GridItem\n  // },\n  data: {\n      layout: testLayout,\n      draggable: true,\n      resizable: true,\n      index: 0\n  },\n\n/*\n  mounted: function () {\n      this.index = this.layout.length;\n  },\n  */\n  methods: {\n      itemTitle(item) {\n          var result = item.i;\n          if (item.static) {\n              result += \" - Static\";\n          }\n          return result;\n      }\n  }\n});\n\n\n"
  },
  {
    "path": "website/docs/.vuepress/public/examples/08-responsive-predefined-layouts.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n  <meta charset=\"utf-8\">\n  <title>Vue Grid Layout Example 8 - Responsive with predefined layouts</title>\n  <meta name=\"viewport\" content=\"initial-scale=1, maximum-scale=1, user-scalable=no\">\n  <link rel=\"stylesheet\" href=\"app.css\">\n  <!--<link rel=\"stylesheet\" href=\"../dist/vue-grid-layout.css\">-->\n</head>\n\n<body>\n  <h1>Vue Grid Layout Example 8 - Responsive with predefined layouts</h1>\n\n  <a href=\"https://github.com/jbaysolutions/vue-grid-layout\">View project on Github</a>\n  <br />\n  <a href=\"07-prevent-collision.html\">Previous example: Prevent collision</a>\n  <br />\n  <a href=\"09-dynamic-add-remove.html\">Next example: Dynamic Add/Remove</a>\n\n  <div id=\"app\" style=\"width: 100%;\">\n    <!--<pre>{{ $data | json }}</pre>-->\n    <div>\n      <div class=\"layoutJSON\">\n        Displayed as <code>[x, y, w, h]</code>:\n        <div class=\"columns\">\n          <div class=\"layoutItem\" v-for=\"item in layout\">\n            <b>{{item.i}}</b>: [{{item.x}}, {{item.y}}, {{item.w}}, {{item.h}}]\n          </div>\n        </div>\n      </div>\n    </div>\n    <div id=\"content\">\n      <!--<button @click=\"decreaseWidth\">Decrease Width</button>\n            <button @click=\"increaseWidth\">Increase Width</button>\n            <button @click=\"addItem\">Add an item</button>-->\n      <input type=\"checkbox\" v-model=\"draggable\" /> Draggable\n      <input type=\"checkbox\" v-model=\"resizable\" /> Resizable\n      <input type=\"checkbox\" v-model=\"responsive\" /> Responsive\n      <br />\n      <grid-layout :layout.sync=\"layout\"\n                   :responsive-layouts=\"layouts\"\n                   :col-num=\"12\"\n                   :row-height=\"30\"\n                   :is-draggable=\"draggable\"\n                   :is-resizable=\"resizable\"\n                   :vertical-compact=\"true\"\n                   :use-css-transforms=\"true\"\n                   :responsive=\"responsive\"\n                   @breakpoint-changed=\"breakpointChangedEvent\"\n      >\n        <grid-item v-for=\"item in layout\"\n                   :x=\"item.x\"\n                   :y=\"item.y\"\n                   :w=\"item.w\"\n                   :h=\"item.h\"\n                   :i=\"item.i\"\n        >\n          <span class=\"text\">{{item.i}}</span>\n        </grid-item>\n      </grid-layout>\n    </div>\n\n  </div>\n  <script src=\"vue.min.js\"></script>\n  <script src=\"../dist/vue-grid-layout.umd.min.js\"></script>\n  <script src=\"08-responsive-predefined-layouts.js\"></script>\n</body>\n\n</html>\n"
  },
  {
    "path": "website/docs/.vuepress/public/examples/08-responsive-predefined-layouts.js",
    "content": "var testLayouts = {\n    md: [\n        {\"x\":0, \"y\":0, \"w\":2, \"h\":2, \"i\":\"0\"},\n        {\"x\":2, \"y\":0, \"w\":2, \"h\":4, \"i\":\"1\"},\n        {\"x\":4, \"y\":0, \"w\":2, \"h\":5, \"i\":\"2\"},\n        {\"x\":6, \"y\":0, \"w\":2, \"h\":3, \"i\":\"3\"},\n        {\"x\":2, \"y\":4, \"w\":2, \"h\":3, \"i\":\"4\"},\n        {\"x\":4, \"y\":5, \"w\":2, \"h\":3, \"i\":\"5\"},\n        {\"x\":0, \"y\":2, \"w\":2, \"h\":5, \"i\":\"6\"},\n        {\"x\":2, \"y\":7, \"w\":2, \"h\":5, \"i\":\"7\"},\n        {\"x\":4, \"y\":8, \"w\":2, \"h\":5, \"i\":\"8\"},\n        {\"x\":6, \"y\":3, \"w\":2, \"h\":4, \"i\":\"9\"},\n        {\"x\":0, \"y\":7, \"w\":2, \"h\":4, \"i\":\"10\"},\n        {\"x\":2, \"y\":19, \"w\":2, \"h\":4, \"i\":\"11\"},\n        {\"x\":0, \"y\":14, \"w\":2, \"h\":5, \"i\":\"12\"},\n        {\"x\":2, \"y\":14, \"w\":2, \"h\":5, \"i\":\"13\"},\n        {\"x\":4, \"y\":13, \"w\":2, \"h\":4, \"i\":\"14\"},\n        {\"x\":6, \"y\":7, \"w\":2, \"h\":4, \"i\":\"15\"},\n        {\"x\":0, \"y\":19, \"w\":2, \"h\":5, \"i\":\"16\"},\n        {\"x\":8, \"y\":0, \"w\":2, \"h\":2, \"i\":\"17\"},\n        {\"x\":0, \"y\":11, \"w\":2, \"h\":3, \"i\":\"18\"},\n        {\"x\":2, \"y\":12, \"w\":2, \"h\":2, \"i\":\"19\"}\n        ],\n    lg: [\n        {\"x\":0,\"y\":0,\"w\":2,\"h\":2,\"i\":\"0\"},\n        {\"x\":2,\"y\":0,\"w\":2,\"h\":4,\"i\":\"1\"},\n        {\"x\":4,\"y\":0,\"w\":2,\"h\":5,\"i\":\"2\"},\n        {\"x\":6,\"y\":0,\"w\":2,\"h\":3,\"i\":\"3\"},\n        {\"x\":8,\"y\":0,\"w\":2,\"h\":3,\"i\":\"4\"},\n        {\"x\":10,\"y\":0,\"w\":2,\"h\":3,\"i\":\"5\"},\n        {\"x\":0,\"y\":5,\"w\":2,\"h\":5,\"i\":\"6\"},\n        {\"x\":2,\"y\":5,\"w\":2,\"h\":5,\"i\":\"7\"},\n        {\"x\":4,\"y\":5,\"w\":2,\"h\":5,\"i\":\"8\"},\n        {\"x\":6,\"y\":4,\"w\":2,\"h\":4,\"i\":\"9\"},\n        {\"x\":8,\"y\":4,\"w\":2,\"h\":4,\"i\":\"10\"},\n        {\"x\":10,\"y\":4,\"w\":2,\"h\":4,\"i\":\"11\"},\n        {\"x\":0,\"y\":10,\"w\":2,\"h\":5,\"i\":\"12\"},\n        {\"x\":2,\"y\":10,\"w\":2,\"h\":5,\"i\":\"13\"},\n        {\"x\":4,\"y\":8,\"w\":2,\"h\":4,\"i\":\"14\"},\n        {\"x\":6,\"y\":8,\"w\":2,\"h\":4,\"i\":\"15\"},\n        {\"x\":8,\"y\":10,\"w\":2,\"h\":5,\"i\":\"16\"},\n        {\"x\":10,\"y\":4,\"w\":2,\"h\":2,\"i\":\"17\"},\n        {\"x\":0,\"y\":9,\"w\":2,\"h\":3,\"i\":\"18\"},\n        {\"x\":2,\"y\":6,\"w\":2,\"h\":2,\"i\":\"19\"}\n    ],\n};\n\n// var GridLayout = VueGridLayout.GridLayout;\n// var GridItem = VueGridLayout.GridItem;\n\nnew Vue({\n    el: '#app',\n    // components: {\n    //     \"GridLayout\": GridLayout,\n    //     \"GridItem\": GridItem\n    // },\n    data: {\n        layouts: testLayouts,\n        layout: testLayouts[\"lg\"],\n        draggable: true,\n        resizable: true,\n        responsive: true,\n        index: 0\n    },\n    mounted: function () {\n        // this.index = this.layout.length;\n    },\n    methods: {\n        breakpointChangedEvent: function(newBreakpoint, newLayout){\n            console.log(\"BREAKPOINT CHANGED breakpoint=\", newBreakpoint, \", layout: \", newLayout );\n        }\n    }\n});\n\n\n\n"
  },
  {
    "path": "website/docs/.vuepress/public/examples/09-dynamic-add-remove.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n  <meta charset=\"utf-8\" />\n  <title>Vue Grid Layout Example 9 - Dynamic Add/Remove</title>\n  <meta name=\"viewport\" content=\"initial-scale=1, maximum-scale=1, user-scalable=no\" />\n  <link rel=\"stylesheet\" href=\"app.css\" />\n</head>\n\n<style>\n  .remove {\n    position: absolute;\n    right: 2px;\n    top: 0;\n    cursor: pointer;\n  }\n</style>\n\n<body>\n  <!--<a href=\"https://github.com/jbaysolutions/vue-grid-layout\">View project on Github</a>\n  <br />\n  <a href=\"08-responsive-predefined-layouts.html\">Previous example: Responsive - predefined layouts</a>\n  <br />\n  <a href=\"10-drag-from-outside.html\">Next example: Drag from outside</a>-->\n\n  <div id=\"app\" style=\"width: 100%;\">\n    <!--<pre>{{ $data | json }}</pre>-->\n    <div>\n      <div class=\"layoutJSON\">\n        Displayed as <code>[x, y, w, h]</code>:\n        <div class=\"columns\">\n          <div class=\"layoutItem\" v-for=\"item in layout\">\n            <b>{{item.i}}</b>: [{{item.x}}, {{item.y}}, {{item.w}},\n            {{item.h}}]\n          </div>\n        </div>\n      </div>\n    </div>\n    <div id=\"content\">\n      <button @click=\"addItem\">Add an item dynamically</button>\n      <input type=\"checkbox\" v-model=\"draggable\" /> Draggable\n      <input type=\"checkbox\" v-model=\"resizable\" /> Resizable\n      <br />\n      <grid-layout :layout=\"layout\"\n                   :col-num=\"colNum\"\n                   :row-height=\"30\"\n                   :is-draggable=\"draggable\"\n                   :is-resizable=\"resizable\"\n                   :vertical-compact=\"true\"\n                   :use-css-transforms=\"true\"\n      >\n        <grid-item v-for=\"item in layout\"\n                   :static=\"item.static\"\n                   :x=\"item.x\"\n                   :y=\"item.y\"\n                   :w=\"item.w\"\n                   :h=\"item.h\"\n                   :i=\"item.i\"\n        >\n          <span class=\"text\">{{item.i}}</span>\n          <span class=\"remove\" @click=\"removeItem(item.i)\">x</span>\n        </grid-item>\n      </grid-layout>\n    </div>\n  </div>\n  <script src=\"https://cdn.jsdelivr.net/npm/vue@2.6.12/dist/vue.min.js\"></script>\n  <script src=\"https://cdn.jsdelivr.net/npm/vue-grid-layout@2.3.11/dist/vue-grid-layout.umd.min.js\"></script>\n  <script src=\"09-dynamic-add-remove.js\"></script>\n</body>\n\n</html>\n"
  },
  {
    "path": "website/docs/.vuepress/public/examples/09-dynamic-add-remove.js",
    "content": "var testLayout = [\n  { x: 0, y: 0, w: 2, h: 2, i: \"0\" },\n  { x: 2, y: 0, w: 2, h: 2, i: \"1\" },\n  { x: 4, y: 0, w: 2, h: 2, i: \"2\" },\n  { x: 6, y: 0, w: 2, h: 2, i: \"3\" },\n  { x: 8, y: 0, w: 2, h: 2, i: \"4\" },\n];\n\n// var GridLayout = VueGridLayout.GridLayout;\n// var GridItem = VueGridLayout.GridItem;\n\nnew Vue({\n  el: \"#app\",\n  // components: {\n  //     \"GridLayout\": GridLayout,\n  //     \"GridItem\": GridItem\n  // },\n  data: {\n    layout: testLayout,\n    draggable: true,\n    resizable: true,\n    responsive: true,\n    colNum: 12,\n    index: 0,\n  },\n  mounted: function () {\n    this.index = this.layout.length;\n  },\n  methods: {\n    addItem: function () {\n      // Add a new item. It must have a unique key!\n      this.layout.push({\n        x: (this.layout.length * 2) % (this.colNum || 12),\n        y: this.layout.length + (this.colNum || 12), // puts it at the bottom\n        w: 2,\n        h: 2,\n        i: this.index,\n      });\n      // Increment the counter to ensure key is always unique.\n      this.index++;\n    },\n    removeItem: function (val) {\n      const index = this.layout.map(item => item.i).indexOf(val);\n      this.layout.splice(index, 1);\n    },\n  },\n});\n"
  },
  {
    "path": "website/docs/.vuepress/public/examples/10-drag-from-outside.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"utf-8\">\n    <title>Vue Grid Layout Example 10 - Drag From Outside</title>\n    <meta name=\"viewport\" content=\"initial-scale=1, maximum-scale=1, user-scalable=no\">\n    <link rel=\"stylesheet\" href=\"app.css\">\n\n\t<style>\n\t.droppable-element {\n        width: 150px;\n        text-align: center;\n        background: #fdd;\n        border: 1px solid black;\n        margin: 10px 0;\n        padding: 10px;\n    }\n    </style>\n\n</head>\n<body @dragover=\"dragover\">\n    <h1>Vue Grid Layout Example 09 - Drag From Outside</h1>\n\n    <a href=\"https://github.com/jbaysolutions/vue-grid-layout\">View project on Github</a>\n    <br/>\n    <a href=\"09-dynamic-add-remove.html\">Previous example: Dynamic Add/Remove</a>\n    <br/>\n    <a href=\"11-bounded.html\">Next example: Bounded</a>\n\n    <br/>\n    This demo shows what happens when an item is added from outside of the grid.\n    <br/>\n    <br/>\n    Once you drop the item within the grid you'll get its coordinates/properties and can perform actions with it accordingly.\n    <br/>\n    <br/>\n\n    <div id=\"app\" style=\"width: 100%;\">\n        <!--<pre>{{ $data | json }}</pre>-->\n        <div>\n            <div class=\"layoutJSON\">\n                Displayed as <code>[x, y, w, h]</code>:\n                <div class=\"columns\">\n                    <div class=\"layoutItem\" v-for=\"item in layout\">\n                        <b>{{item.i}}</b>: [{{item.x}}, {{item.y}}, {{item.w}}, {{item.h}}]\n                    </div>\n                </div>\n            </div>\n        </div>\n        <br/>\n        <div @drag=\"drag\" @dragend=\"dragend\" class=\"droppable-element\" draggable=\"true\" unselectable=\"on\">Droppable Element (Drag me!)</div>\n        <div id=\"content\">\n            <grid-layout  ref=\"gridLayout\" :layout.sync=\"layout\"\n                         :col-num=\"12\"\n                         :row-height=\"30\"\n                         :is-draggable=\"true\"\n                         :is-resizable=\"true\"\n                         :vertical-compact=\"true\"\n                         :use-css-transforms=\"true\"\n\n            >\n                <grid-item :key=\"item.i\" v-for=\"item in layout\"\n                           :x=\"item.x\"\n                           :y=\"item.y\"\n                           :w=\"item.w\"\n                           :h=\"item.h\"\n                           :i=\"item.i\"\n                >\n                    <span class=\"text\">{{item.i}}</span>\n                </grid-item>\n            </grid-layout>\n        </div>\n    </div>\n    <script src=\"vue.min.js\"></script>\n    <script src=\"../dist/vue-grid-layout.umd.min.js\"></script>\n    <script src=\"10-drag-from-outside.js\"></script>\n</body>\n</html>\n"
  },
  {
    "path": "website/docs/.vuepress/public/examples/10-drag-from-outside.js",
    "content": "var testLayout = [\n    {\"x\":0,\"y\":0,\"w\":2,\"h\":2,\"i\":\"0\"},\n    {\"x\":2,\"y\":0,\"w\":2,\"h\":4,\"i\":\"1\"},\n    {\"x\":4,\"y\":0,\"w\":2,\"h\":5,\"i\":\"2\"},\n    {\"x\":6,\"y\":0,\"w\":2,\"h\":3,\"i\":\"3\"},\n    {\"x\":8,\"y\":0,\"w\":2,\"h\":3,\"i\":\"4\"},\n    {\"x\":10,\"y\":0,\"w\":2,\"h\":3,\"i\":\"5\"},\n    {\"x\":0,\"y\":5,\"w\":2,\"h\":5,\"i\":\"6\"},\n    {\"x\":2,\"y\":5,\"w\":2,\"h\":5,\"i\":\"7\"},\n    {\"x\":4,\"y\":5,\"w\":2,\"h\":5,\"i\":\"8\"}, \n    {\"x\":5,\"y\":10,\"w\":4,\"h\":3,\"i\":\"9\"},\n];\nvar mouseXY={\"x\":null,\"y\":null};\nvar DragPos = {\"x\":null,\"y\":null,\"w\":1,\"h\":1,\"i\":null};\n\ndocument.addEventListener(\"dragover\", function(e) {\n    mouseXY.x=e.clientX;\n    mouseXY.y=e.clientY;\n}, false);\n\nnew Vue({\n    el: '#app',\n    data: {\n        layout: testLayout,\n    },\n    methods: {\n        drag:function(e){\n            let parentRect = document.getElementById('content').getBoundingClientRect();\n            let mouseInGrid=false;\n            if (((mouseXY.x>parentRect.left) && (mouseXY.x<parentRect.right)) && ((mouseXY.y>parentRect.top)  && (mouseXY.y<parentRect.bottom))){\n                mouseInGrid=true;\n            }\n            if (mouseInGrid==true && (this.layout.findIndex(item => item.i === 'drop')) == -1){\n                this.layout.push({\n                    x: (this.layout.length * 2) % (this.colNum || 12),\n                    y: this.layout.length + (this.colNum || 12), // puts it at the bottom\n                    w: 1,\n                    h: 1,\n                    i: 'drop',\n                }); \n            }\n            let index=this.layout.findIndex(item => item.i === 'drop');\n            if (index!=-1){\n                try {  \n                    this.$refs.gridLayout.$children[this.layout.length].$refs.item.style.display=\"none\";\n                } catch {\n                }\n                let el=this.$refs.gridLayout.$children[index]; \n                el.dragging={\"top\":mouseXY.y-parentRect.top,\"left\":mouseXY.x-parentRect.left};\n                let new_pos=el.calcXY(mouseXY.y-parentRect.top, mouseXY.x-parentRect.left);\n               \n                if (mouseInGrid==true){\n                    this.$refs.gridLayout.dragEvent('dragstart', 'drop', new_pos.x,new_pos.y,1,1); \n                    DragPos.i=String(index); DragPos.x=this.layout[index].x; DragPos.y=this.layout[index].y;  \n                }\n                if (mouseInGrid==false){\n                    this.$refs.gridLayout.dragEvent('dragend', 'drop', new_pos.x,new_pos.y,1,1);\n                    this.layout = this.layout.filter(obj => obj.i !=='drop');\n                }\n            }  \n        },  \n        dragend:function(e){\n            let parentRect = document.getElementById('content').getBoundingClientRect();\n            let mouseInGrid=false;\n            if (((mouseXY.x>parentRect.left) && (mouseXY.x<parentRect.right)) && ((mouseXY.y>parentRect.top)  && (mouseXY.y<parentRect.bottom))){\n                mouseInGrid=true;\n            }\n            if (mouseInGrid==true){\n                    alert(`Dropped element props:\\n${JSON.stringify(DragPos, ['x', 'y', 'w', 'h'], 2)}`); \n                    this.$refs.gridLayout.dragEvent('dragend', 'drop', DragPos.x,DragPos.y,1,1);\n                    this.layout = this.layout.filter(obj => obj.i !=='drop');\n                    \n                    // UNCOMMENT below if you want to add a grid-item\n                    /*\n                    this.layout.push({\n                        x: DragPos.x,\n                        y: DragPos.y,\n                        w: 1,\n                        h: 1,\n                        i: DragPos.i,\n                    }); \n                    this.$refs.gridLayout.dragEvent('dragend', DragPos.i, DragPos.x,DragPos.y,1,1);\n                    try {  \n                        this.$refs.gridLayout.$children[this.layout.length].$refs.item.style.display=\"block\";\n                    } catch {\n                    }  \n                    */   \n            }\n        },  \n    },  \n});\n\n"
  },
  {
    "path": "website/docs/.vuepress/public/examples/11-bounded.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n  <meta charset=\"utf-8\">\n  <title>Vue Grid Layout Example 11 - Bounded</title>\n  <meta name=\"viewport\" content=\"initial-scale=1, maximum-scale=1, user-scalable=no\">\n  <link rel=\"stylesheet\" href=\"app.css\">\n  <!--<link rel=\"stylesheet\" href=\"../dist/vue-grid-layout.css\">-->\n</head>\n\n<body>\n  <h1>Vue Grid Layout Example 11 - Bounded</h1>\n\n  <a href=\"https://github.com/jbaysolutions/vue-grid-layout\">View project on Github</a>\n  <br />\n  <a href=\"10-drag-from-outside.html\">Previous example: Drag From Outside</a>\n  <br />\n  <!-- <a href=\"09-dynamic-add-remove.html\">Next example: Dynamic Add/Remove</a> -->\n\n  <div id=\"app\" style=\"width: 100%;\">\n    <!--<pre>{{ $data | json }}</pre>-->\n    <div>\n        <div class=\"layoutJSON\">\n            Displayed as <code>[x, y, w, h]</code>:\n            <div class=\"columns\">\n            <div class=\"layoutItem\" v-for=\"item in layout\">\n                <b>{{item.i}}</b>: [{{item.x}}, {{item.y}}, {{item.w}}, {{item.h}}]\n            </div>\n            </div>\n        </div>\n    </div>\n    <div id=\"content\">\n        <input type=\"checkbox\" v-model=\"draggable\" /> Draggable\n        <input type=\"checkbox\" v-model=\"resizable\" /> Resizable\n        <input type=\"checkbox\" v-model=\"bounded\" /> Bounded\n        <br />\n        <grid-layout  :layout.sync=\"layout\"\n                      :col-num=\"12\"\n                      :row-height=\"30\"\n                      :is-draggable=\"draggable\"\n                      :is-resizable=\"resizable\"\n                      :is-bounded=\"bounded\"\n                      :vertical-compact=\"true\"\n                      :use-css-transforms=\"true\"\n        >\n            <grid-item  v-for=\"item in layout\"\n                        :x=\"item.x\"\n                        :y=\"item.y\"\n                        :w=\"item.w\"\n                        :h=\"item.h\"\n                        :i=\"item.i\"\n            >\n            <span class=\"text\">{{item.i}}</span>\n            </grid-item>\n        </grid-layout>\n    </div>\n  </div>\n  <script src=\"vue.min.js\"></script>\n  <script src=\"../dist/vue-grid-layout.umd.min.js\"></script>\n  <script src=\"11-bounded.js\"></script>\n</body>\n\n</html>\n"
  },
  {
    "path": "website/docs/.vuepress/public/examples/11-bounded.js",
    "content": "var testLayout = [\n    {\"x\":0,\"y\":0,\"w\":2,\"h\":2,\"i\":\"0\"},\n    {\"x\":2,\"y\":0,\"w\":2,\"h\":4,\"i\":\"1\"},\n    {\"x\":4,\"y\":0,\"w\":2,\"h\":5,\"i\":\"2\"},\n    {\"x\":6,\"y\":0,\"w\":2,\"h\":3,\"i\":\"3\"},\n    {\"x\":8,\"y\":0,\"w\":2,\"h\":3,\"i\":\"4\"},\n    {\"x\":10,\"y\":0,\"w\":2,\"h\":3,\"i\":\"5\"},\n    {\"x\":0,\"y\":5,\"w\":2,\"h\":5,\"i\":\"6\"},\n    {\"x\":2,\"y\":5,\"w\":2,\"h\":5,\"i\":\"7\"},\n    {\"x\":4,\"y\":5,\"w\":2,\"h\":5,\"i\":\"8\"},\n    {\"x\":6,\"y\":4,\"w\":2,\"h\":4,\"i\":\"9\"},\n    {\"x\":8,\"y\":4,\"w\":2,\"h\":4,\"i\":\"10\"},\n    {\"x\":10,\"y\":4,\"w\":2,\"h\":4,\"i\":\"11\"},\n    {\"x\":0,\"y\":10,\"w\":2,\"h\":5,\"i\":\"12\"},\n    {\"x\":2,\"y\":10,\"w\":2,\"h\":5,\"i\":\"13\"},\n    {\"x\":4,\"y\":8,\"w\":2,\"h\":4,\"i\":\"14\"},\n    {\"x\":6,\"y\":8,\"w\":2,\"h\":4,\"i\":\"15\"},\n    {\"x\":8,\"y\":10,\"w\":2,\"h\":5,\"i\":\"16\"},\n    {\"x\":10,\"y\":4,\"w\":2,\"h\":2,\"i\":\"17\"},\n    {\"x\":0,\"y\":9,\"w\":2,\"h\":3,\"i\":\"18\"},\n    {\"x\":2,\"y\":6,\"w\":2,\"h\":2,\"i\":\"19\"}\n];\n\nnew Vue({\n    el: '#app',\n    data: {\n        layout: testLayout,\n        draggable: true,\n        resizable: true,\n        bounded: true\n    }\n});\n\n\n\n"
  },
  {
    "path": "website/docs/.vuepress/public/examples/app.css",
    "content": "/*** EXAMPLE ***/\n#content {\n    width: 100%;\n}\n\n.vue-grid-layout {\n    background: #eee;\n}\n\n.layoutJSON {\n    background: #ddd;\n    border: 1px solid black;\n    margin-top: 10px;\n    padding: 10px;\n}\n\n.eventsJSON {\n    background: #ddd;\n    border: 1px solid black;\n    margin-top: 10px;\n    padding: 10px;\n    height: 100px;\n    overflow-y: scroll;\n}\n\n.columns {\n    -moz-columns: 120px;\n    -webkit-columns: 120px;\n    columns: 120px;\n}\n\n\n\n/*.vue-resizable-handle {\n    z-index: 5000;\n    position: absolute;\n    width: 20px;\n    height: 20px;\n    bottom: 0;\n    right: 0;\n    background: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBzdGFuZGFsb25lPSJubyI/Pg08IS0tIEdlbmVyYXRvcjogQWRvYmUgRmlyZXdvcmtzIENTNiwgRXhwb3J0IFNWRyBFeHRlbnNpb24gYnkgQWFyb24gQmVhbGwgKGh0dHA6Ly9maXJld29ya3MuYWJlYWxsLmNvbSkgLiBWZXJzaW9uOiAwLjYuMSAgLS0+DTwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DTxzdmcgaWQ9IlVudGl0bGVkLVBhZ2UlMjAxIiB2aWV3Qm94PSIwIDAgNiA2IiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjojZmZmZmZmMDAiIHZlcnNpb249IjEuMSINCXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHhtbDpzcGFjZT0icHJlc2VydmUiDQl4PSIwcHgiIHk9IjBweCIgd2lkdGg9IjZweCIgaGVpZ2h0PSI2cHgiDT4NCTxnIG9wYWNpdHk9IjAuMzAyIj4NCQk8cGF0aCBkPSJNIDYgNiBMIDAgNiBMIDAgNC4yIEwgNCA0LjIgTCA0LjIgNC4yIEwgNC4yIDAgTCA2IDAgTCA2IDYgTCA2IDYgWiIgZmlsbD0iIzAwMDAwMCIvPg0JPC9nPg08L3N2Zz4=');\n    background-position: bottom right;\n    padding: 0 3px 3px 0;\n    background-repeat: no-repeat;\n    background-origin: content-box;\n    box-sizing: border-box;\n    cursor: se-resize;\n}*/\n\n.vue-grid-item:not(.vue-grid-placeholder) {\n    background: #ccc;\n    border: 1px solid black;\n}\n\n.vue-grid-item.resizing {\n    opacity: 0.9;\n}\n\n.vue-grid-item.static {\n    background: #cce;\n}\n\n.vue-grid-item .text {\n    font-size: 24px;\n    text-align: center;\n    position: absolute;\n    top: 0;\n    bottom: 0;\n    left: 0;\n    right: 0;\n    margin: auto;\n    height: 100%;\n    width: 100%;\n}\n\n.vue-grid-item .no-drag {\n    height: 100%;\n    width: 100%;\n}\n\n.vue-grid-item .minMax {\n    font-size: 12px;\n}\n\n.vue-grid-item .add {\n    cursor: pointer;\n}\n\n.vue-draggable-handle {\n    position: absolute;\n    width: 20px;\n    height: 20px;\n    top: 0;\n    left: 0;\n    background: url(\"data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='10' height='10'><circle cx='5' cy='5' r='5' fill='#999999'/></svg>\") no-repeat;\n    background-position: bottom right;\n    padding: 0 8px 8px 0;\n    background-repeat: no-repeat;\n    background-origin: content-box;\n    box-sizing: border-box;\n    cursor: pointer;\n}\n"
  },
  {
    "path": "website/docs/.vuepress/public/examples/vue.js",
    "content": "/*!\n * Vue.js v2.6.7\n * (c) 2014-2019 Evan You\n * Released under the MIT License.\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 = global || self, global.Vue = factory());\n}(this, function () { 'use strict';\n\n  /*  */\n\n  var emptyObject = Object.freeze({});\n\n  // These helpers produce better VM code in JS engines due to their\n  // explicitness and function inlining.\n  function isUndef (v) {\n    return v === undefined || v === null\n  }\n\n  function isDef (v) {\n    return v !== undefined && v !== null\n  }\n\n  function isTrue (v) {\n    return v === true\n  }\n\n  function isFalse (v) {\n    return v === false\n  }\n\n  /**\n   * Check if value is primitive.\n   */\n  function isPrimitive (value) {\n    return (\n      typeof value === 'string' ||\n      typeof value === 'number' ||\n      // $flow-disable-line\n      typeof value === 'symbol' ||\n      typeof value === 'boolean'\n    )\n  }\n\n  /**\n   * Quick object check - this is primarily used to tell\n   * Objects from primitive values when we know the value\n   * is a JSON-compliant type.\n   */\n  function isObject (obj) {\n    return obj !== null && typeof obj === 'object'\n  }\n\n  /**\n   * Get the raw type string of a value, e.g., [object Object].\n   */\n  var _toString = Object.prototype.toString;\n\n  function toRawType (value) {\n    return _toString.call(value).slice(8, -1)\n  }\n\n  /**\n   * Strict object type check. Only returns true\n   * for plain JavaScript objects.\n   */\n  function isPlainObject (obj) {\n    return _toString.call(obj) === '[object Object]'\n  }\n\n  function isRegExp (v) {\n    return _toString.call(v) === '[object RegExp]'\n  }\n\n  /**\n   * Check if val is a valid array index.\n   */\n  function isValidArrayIndex (val) {\n    var n = parseFloat(String(val));\n    return n >= 0 && Math.floor(n) === n && isFinite(val)\n  }\n\n  function isPromise (val) {\n    return (\n      isDef(val) &&\n      typeof val.then === 'function' &&\n      typeof val.catch === 'function'\n    )\n  }\n\n  /**\n   * Convert a value to a string that is actually rendered.\n   */\n  function toString (val) {\n    return val == null\n      ? ''\n      : Array.isArray(val) || (isPlainObject(val) && val.toString === _toString)\n        ? JSON.stringify(val, null, 2)\n        : String(val)\n  }\n\n  /**\n   * Convert an input value to a number for persistence.\n   * If the conversion fails, return original string.\n   */\n  function toNumber (val) {\n    var n = parseFloat(val);\n    return isNaN(n) ? val : n\n  }\n\n  /**\n   * Make a map and return a function for checking if a key\n   * is in that map.\n   */\n  function makeMap (\n    str,\n    expectsLowerCase\n  ) {\n    var map = Object.create(null);\n    var list = str.split(',');\n    for (var i = 0; i < list.length; i++) {\n      map[list[i]] = true;\n    }\n    return expectsLowerCase\n      ? function (val) { return map[val.toLowerCase()]; }\n      : function (val) { return map[val]; }\n  }\n\n  /**\n   * Check if a tag is a built-in tag.\n   */\n  var isBuiltInTag = makeMap('slot,component', true);\n\n  /**\n   * Check if an attribute is a reserved attribute.\n   */\n  var isReservedAttribute = makeMap('key,ref,slot,slot-scope,is');\n\n  /**\n   * Remove an item from an array.\n   */\n  function remove (arr, item) {\n    if (arr.length) {\n      var index = arr.indexOf(item);\n      if (index > -1) {\n        return arr.splice(index, 1)\n      }\n    }\n  }\n\n  /**\n   * Check whether an object has the property.\n   */\n  var hasOwnProperty = Object.prototype.hasOwnProperty;\n  function hasOwn (obj, key) {\n    return hasOwnProperty.call(obj, key)\n  }\n\n  /**\n   * Create a cached version of a pure function.\n   */\n  function cached (fn) {\n    var cache = Object.create(null);\n    return (function cachedFn (str) {\n      var hit = cache[str];\n      return hit || (cache[str] = fn(str))\n    })\n  }\n\n  /**\n   * Camelize a hyphen-delimited string.\n   */\n  var camelizeRE = /-(\\w)/g;\n  var camelize = cached(function (str) {\n    return str.replace(camelizeRE, function (_, c) { return c ? c.toUpperCase() : ''; })\n  });\n\n  /**\n   * Capitalize a string.\n   */\n  var capitalize = cached(function (str) {\n    return str.charAt(0).toUpperCase() + str.slice(1)\n  });\n\n  /**\n   * Hyphenate a camelCase string.\n   */\n  var hyphenateRE = /\\B([A-Z])/g;\n  var hyphenate = cached(function (str) {\n    return str.replace(hyphenateRE, '-$1').toLowerCase()\n  });\n\n  /**\n   * Simple bind polyfill for environments that do not support it,\n   * e.g., PhantomJS 1.x. Technically, we don't need this anymore\n   * since native bind is now performant enough in most browsers.\n   * But removing it would mean breaking code that was able to run in\n   * PhantomJS 1.x, so this must be kept for backward compatibility.\n   */\n\n  /* istanbul ignore next */\n  function polyfillBind (fn, ctx) {\n    function boundFn (a) {\n      var l = arguments.length;\n      return l\n        ? l > 1\n          ? fn.apply(ctx, arguments)\n          : fn.call(ctx, a)\n        : fn.call(ctx)\n    }\n\n    boundFn._length = fn.length;\n    return boundFn\n  }\n\n  function nativeBind (fn, ctx) {\n    return fn.bind(ctx)\n  }\n\n  var bind = Function.prototype.bind\n    ? nativeBind\n    : polyfillBind;\n\n  /**\n   * Convert an Array-like object to a real Array.\n   */\n  function toArray (list, start) {\n    start = start || 0;\n    var i = list.length - start;\n    var ret = new Array(i);\n    while (i--) {\n      ret[i] = list[i + start];\n    }\n    return ret\n  }\n\n  /**\n   * Mix properties into target object.\n   */\n  function extend (to, _from) {\n    for (var key in _from) {\n      to[key] = _from[key];\n    }\n    return to\n  }\n\n  /**\n   * Merge an Array of Objects into a single Object.\n   */\n  function toObject (arr) {\n    var res = {};\n    for (var i = 0; i < arr.length; i++) {\n      if (arr[i]) {\n        extend(res, arr[i]);\n      }\n    }\n    return res\n  }\n\n  /* eslint-disable no-unused-vars */\n\n  /**\n   * Perform no operation.\n   * Stubbing args to make Flow happy without leaving useless transpiled code\n   * with ...rest (https://flow.org/blog/2017/05/07/Strict-Function-Call-Arity/).\n   */\n  function noop (a, b, c) {}\n\n  /**\n   * Always return false.\n   */\n  var no = function (a, b, c) { return false; };\n\n  /* eslint-enable no-unused-vars */\n\n  /**\n   * Return the same value.\n   */\n  var identity = function (_) { return _; };\n\n  /**\n   * Generate a string containing static keys from compiler modules.\n   */\n  function genStaticKeys (modules) {\n    return modules.reduce(function (keys, m) {\n      return keys.concat(m.staticKeys || [])\n    }, []).join(',')\n  }\n\n  /**\n   * Check if two values are loosely equal - that is,\n   * if they are plain objects, do they have the same shape?\n   */\n  function looseEqual (a, b) {\n    if (a === b) { return true }\n    var isObjectA = isObject(a);\n    var isObjectB = isObject(b);\n    if (isObjectA && isObjectB) {\n      try {\n        var isArrayA = Array.isArray(a);\n        var isArrayB = Array.isArray(b);\n        if (isArrayA && isArrayB) {\n          return a.length === b.length && a.every(function (e, i) {\n            return looseEqual(e, b[i])\n          })\n        } else if (a instanceof Date && b instanceof Date) {\n          return a.getTime() === b.getTime()\n        } else if (!isArrayA && !isArrayB) {\n          var keysA = Object.keys(a);\n          var keysB = Object.keys(b);\n          return keysA.length === keysB.length && keysA.every(function (key) {\n            return looseEqual(a[key], b[key])\n          })\n        } else {\n          /* istanbul ignore next */\n          return false\n        }\n      } catch (e) {\n        /* istanbul ignore next */\n        return false\n      }\n    } else if (!isObjectA && !isObjectB) {\n      return String(a) === String(b)\n    } else {\n      return false\n    }\n  }\n\n  /**\n   * Return the first index at which a loosely equal value can be\n   * found in the array (if value is a plain object, the array must\n   * contain an object of the same shape), or -1 if it is not present.\n   */\n  function looseIndexOf (arr, val) {\n    for (var i = 0; i < arr.length; i++) {\n      if (looseEqual(arr[i], val)) { return i }\n    }\n    return -1\n  }\n\n  /**\n   * Ensure a function is called only once.\n   */\n  function once (fn) {\n    var called = false;\n    return function () {\n      if (!called) {\n        called = true;\n        fn.apply(this, arguments);\n      }\n    }\n  }\n\n  var SSR_ATTR = 'data-server-rendered';\n\n  var ASSET_TYPES = [\n    'component',\n    'directive',\n    'filter'\n  ];\n\n  var LIFECYCLE_HOOKS = [\n    'beforeCreate',\n    'created',\n    'beforeMount',\n    'mounted',\n    'beforeUpdate',\n    'updated',\n    'beforeDestroy',\n    'destroyed',\n    'activated',\n    'deactivated',\n    'errorCaptured',\n    'serverPrefetch'\n  ];\n\n  /*  */\n\n\n\n  var config = ({\n    /**\n     * Option merge strategies (used in core/util/options)\n     */\n    // $flow-disable-line\n    optionMergeStrategies: Object.create(null),\n\n    /**\n     * Whether to suppress warnings.\n     */\n    silent: false,\n\n    /**\n     * Show production mode tip message on boot?\n     */\n    productionTip: \"development\" !== 'production',\n\n    /**\n     * Whether to enable devtools\n     */\n    devtools: \"development\" !== 'production',\n\n    /**\n     * Whether to record perf\n     */\n    performance: false,\n\n    /**\n     * Error handler for watcher errors\n     */\n    errorHandler: null,\n\n    /**\n     * Warn handler for watcher warns\n     */\n    warnHandler: null,\n\n    /**\n     * Ignore certain custom elements\n     */\n    ignoredElements: [],\n\n    /**\n     * Custom user key aliases for v-on\n     */\n    // $flow-disable-line\n    keyCodes: Object.create(null),\n\n    /**\n     * Check if a tag is reserved so that it cannot be registered as a\n     * component. This is platform-dependent and may be overwritten.\n     */\n    isReservedTag: no,\n\n    /**\n     * Check if an attribute is reserved so that it cannot be used as a component\n     * prop. This is platform-dependent and may be overwritten.\n     */\n    isReservedAttr: no,\n\n    /**\n     * Check if a tag is an unknown element.\n     * Platform-dependent.\n     */\n    isUnknownElement: no,\n\n    /**\n     * Get the namespace of an element\n     */\n    getTagNamespace: noop,\n\n    /**\n     * Parse the real tag name for the specific platform.\n     */\n    parsePlatformTagName: identity,\n\n    /**\n     * Check if an attribute must be bound using property, e.g. value\n     * Platform-dependent.\n     */\n    mustUseProp: no,\n\n    /**\n     * Perform updates asynchronously. Intended to be used by Vue Test Utils\n     * This will significantly reduce performance if set to false.\n     */\n    async: true,\n\n    /**\n     * Exposed for legacy reasons\n     */\n    _lifecycleHooks: LIFECYCLE_HOOKS\n  });\n\n  /*  */\n\n  /**\n   * unicode letters used for parsing html tags, component names and property paths.\n   * using https://www.w3.org/TR/html53/semantics-scripting.html#potentialcustomelementname\n   * skipping \\u10000-\\uEFFFF due to it freezing up PhantomJS\n   */\n  var unicodeLetters = 'a-zA-Z\\u00B7\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u203F-\\u2040\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD';\n\n  /**\n   * Check if a string starts with $ or _\n   */\n  function isReserved (str) {\n    var c = (str + '').charCodeAt(0);\n    return c === 0x24 || c === 0x5F\n  }\n\n  /**\n   * Define a property.\n   */\n  function def (obj, key, val, enumerable) {\n    Object.defineProperty(obj, key, {\n      value: val,\n      enumerable: !!enumerable,\n      writable: true,\n      configurable: true\n    });\n  }\n\n  /**\n   * Parse simple path.\n   */\n  var bailRE = new RegExp((\"[^\" + unicodeLetters + \".$_\\\\d]\"));\n  function parsePath (path) {\n    if (bailRE.test(path)) {\n      return\n    }\n    var segments = path.split('.');\n    return function (obj) {\n      for (var i = 0; i < segments.length; i++) {\n        if (!obj) { return }\n        obj = obj[segments[i]];\n      }\n      return obj\n    }\n  }\n\n  /*  */\n\n  // can we use __proto__?\n  var hasProto = '__proto__' in {};\n\n  // Browser environment sniffing\n  var inBrowser = typeof window !== 'undefined';\n  var inWeex = typeof WXEnvironment !== 'undefined' && !!WXEnvironment.platform;\n  var weexPlatform = inWeex && WXEnvironment.platform.toLowerCase();\n  var UA = inBrowser && window.navigator.userAgent.toLowerCase();\n  var isIE = UA && /msie|trident/.test(UA);\n  var isIE9 = UA && UA.indexOf('msie 9.0') > 0;\n  var isEdge = UA && UA.indexOf('edge/') > 0;\n  var isAndroid = (UA && UA.indexOf('android') > 0) || (weexPlatform === 'android');\n  var isIOS = (UA && /iphone|ipad|ipod|ios/.test(UA)) || (weexPlatform === 'ios');\n  var isChrome = UA && /chrome\\/\\d+/.test(UA) && !isEdge;\n  var isPhantomJS = UA && /phantomjs/.test(UA);\n  var isFF = UA && UA.match(/firefox\\/(\\d+)/);\n\n  // Firefox has a \"watch\" function on Object.prototype...\n  var nativeWatch = ({}).watch;\n\n  var supportsPassive = false;\n  if (inBrowser) {\n    try {\n      var opts = {};\n      Object.defineProperty(opts, 'passive', ({\n        get: function get () {\n          /* istanbul ignore next */\n          supportsPassive = true;\n        }\n      })); // https://github.com/facebook/flow/issues/285\n      window.addEventListener('test-passive', null, opts);\n    } catch (e) {}\n  }\n\n  // this needs to be lazy-evaled because vue may be required before\n  // vue-server-renderer can set VUE_ENV\n  var _isServer;\n  var isServerRendering = function () {\n    if (_isServer === undefined) {\n      /* istanbul ignore if */\n      if (!inBrowser && !inWeex && typeof global !== 'undefined') {\n        // detect presence of vue-server-renderer and avoid\n        // Webpack shimming the process\n        _isServer = global['process'] && global['process'].env.VUE_ENV === 'server';\n      } else {\n        _isServer = false;\n      }\n    }\n    return _isServer\n  };\n\n  // detect devtools\n  var devtools = inBrowser && window.__VUE_DEVTOOLS_GLOBAL_HOOK__;\n\n  /* istanbul ignore next */\n  function isNative (Ctor) {\n    return typeof Ctor === 'function' && /native code/.test(Ctor.toString())\n  }\n\n  var hasSymbol =\n    typeof Symbol !== 'undefined' && isNative(Symbol) &&\n    typeof Reflect !== 'undefined' && isNative(Reflect.ownKeys);\n\n  var _Set;\n  /* istanbul ignore if */ // $flow-disable-line\n  if (typeof Set !== 'undefined' && isNative(Set)) {\n    // use native Set when available.\n    _Set = Set;\n  } else {\n    // a non-standard Set polyfill that only works with primitive keys.\n    _Set = /*@__PURE__*/(function () {\n      function Set () {\n        this.set = Object.create(null);\n      }\n      Set.prototype.has = function has (key) {\n        return this.set[key] === true\n      };\n      Set.prototype.add = function add (key) {\n        this.set[key] = true;\n      };\n      Set.prototype.clear = function clear () {\n        this.set = Object.create(null);\n      };\n\n      return Set;\n    }());\n  }\n\n  /*  */\n\n  var warn = noop;\n  var tip = noop;\n  var generateComponentTrace = (noop); // work around flow check\n  var formatComponentName = (noop);\n\n  {\n    var hasConsole = typeof console !== 'undefined';\n    var classifyRE = /(?:^|[-_])(\\w)/g;\n    var classify = function (str) { return str\n      .replace(classifyRE, function (c) { return c.toUpperCase(); })\n      .replace(/[-_]/g, ''); };\n\n    warn = function (msg, vm) {\n      var trace = vm ? generateComponentTrace(vm) : '';\n\n      if (config.warnHandler) {\n        config.warnHandler.call(null, msg, vm, trace);\n      } else if (hasConsole && (!config.silent)) {\n        console.error((\"[Vue warn]: \" + msg + trace));\n      }\n    };\n\n    tip = function (msg, vm) {\n      if (hasConsole && (!config.silent)) {\n        console.warn(\"[Vue tip]: \" + msg + (\n          vm ? generateComponentTrace(vm) : ''\n        ));\n      }\n    };\n\n    formatComponentName = function (vm, includeFile) {\n      if (vm.$root === vm) {\n        return '<Root>'\n      }\n      var options = typeof vm === 'function' && vm.cid != null\n        ? vm.options\n        : vm._isVue\n          ? vm.$options || vm.constructor.options\n          : vm;\n      var name = options.name || options._componentTag;\n      var file = options.__file;\n      if (!name && file) {\n        var match = file.match(/([^/\\\\]+)\\.vue$/);\n        name = match && match[1];\n      }\n\n      return (\n        (name ? (\"<\" + (classify(name)) + \">\") : \"<Anonymous>\") +\n        (file && includeFile !== false ? (\" at \" + file) : '')\n      )\n    };\n\n    var repeat = function (str, n) {\n      var res = '';\n      while (n) {\n        if (n % 2 === 1) { res += str; }\n        if (n > 1) { str += str; }\n        n >>= 1;\n      }\n      return res\n    };\n\n    generateComponentTrace = function (vm) {\n      if (vm._isVue && vm.$parent) {\n        var tree = [];\n        var currentRecursiveSequence = 0;\n        while (vm) {\n          if (tree.length > 0) {\n            var last = tree[tree.length - 1];\n            if (last.constructor === vm.constructor) {\n              currentRecursiveSequence++;\n              vm = vm.$parent;\n              continue\n            } else if (currentRecursiveSequence > 0) {\n              tree[tree.length - 1] = [last, currentRecursiveSequence];\n              currentRecursiveSequence = 0;\n            }\n          }\n          tree.push(vm);\n          vm = vm.$parent;\n        }\n        return '\\n\\nfound in\\n\\n' + tree\n          .map(function (vm, i) { return (\"\" + (i === 0 ? '---> ' : repeat(' ', 5 + i * 2)) + (Array.isArray(vm)\n              ? ((formatComponentName(vm[0])) + \"... (\" + (vm[1]) + \" recursive calls)\")\n              : formatComponentName(vm))); })\n          .join('\\n')\n      } else {\n        return (\"\\n\\n(found in \" + (formatComponentName(vm)) + \")\")\n      }\n    };\n  }\n\n  /*  */\n\n  var uid = 0;\n\n  /**\n   * A dep is an observable that can have multiple\n   * directives subscribing to it.\n   */\n  var Dep = function Dep () {\n    this.id = uid++;\n    this.subs = [];\n  };\n\n  Dep.prototype.addSub = function addSub (sub) {\n    this.subs.push(sub);\n  };\n\n  Dep.prototype.removeSub = function removeSub (sub) {\n    remove(this.subs, sub);\n  };\n\n  Dep.prototype.depend = function depend () {\n    if (Dep.target) {\n      Dep.target.addDep(this);\n    }\n  };\n\n  Dep.prototype.notify = function notify () {\n    // stabilize the subscriber list first\n    var subs = this.subs.slice();\n    if (!config.async) {\n      // subs aren't sorted in scheduler if not running async\n      // we need to sort them now to make sure they fire in correct\n      // order\n      subs.sort(function (a, b) { return a.id - b.id; });\n    }\n    for (var i = 0, l = subs.length; i < l; i++) {\n      subs[i].update();\n    }\n  };\n\n  // The current target watcher being evaluated.\n  // This is globally unique because only one watcher\n  // can be evaluated at a time.\n  Dep.target = null;\n  var targetStack = [];\n\n  function pushTarget (target) {\n    targetStack.push(target);\n    Dep.target = target;\n  }\n\n  function popTarget () {\n    targetStack.pop();\n    Dep.target = targetStack[targetStack.length - 1];\n  }\n\n  /*  */\n\n  var VNode = function VNode (\n    tag,\n    data,\n    children,\n    text,\n    elm,\n    context,\n    componentOptions,\n    asyncFactory\n  ) {\n    this.tag = tag;\n    this.data = data;\n    this.children = children;\n    this.text = text;\n    this.elm = elm;\n    this.ns = undefined;\n    this.context = context;\n    this.fnContext = undefined;\n    this.fnOptions = undefined;\n    this.fnScopeId = undefined;\n    this.key = data && data.key;\n    this.componentOptions = componentOptions;\n    this.componentInstance = undefined;\n    this.parent = undefined;\n    this.raw = false;\n    this.isStatic = false;\n    this.isRootInsert = true;\n    this.isComment = false;\n    this.isCloned = false;\n    this.isOnce = false;\n    this.asyncFactory = asyncFactory;\n    this.asyncMeta = undefined;\n    this.isAsyncPlaceholder = false;\n  };\n\n  var prototypeAccessors = { child: { configurable: true } };\n\n  // DEPRECATED: alias for componentInstance for backwards compat.\n  /* istanbul ignore next */\n  prototypeAccessors.child.get = function () {\n    return this.componentInstance\n  };\n\n  Object.defineProperties( VNode.prototype, prototypeAccessors );\n\n  var createEmptyVNode = function (text) {\n    if ( text === void 0 ) text = '';\n\n    var node = new VNode();\n    node.text = text;\n    node.isComment = true;\n    return node\n  };\n\n  function createTextVNode (val) {\n    return new VNode(undefined, undefined, undefined, String(val))\n  }\n\n  // optimized shallow clone\n  // used for static nodes and slot nodes because they may be reused across\n  // multiple renders, cloning them avoids errors when DOM manipulations rely\n  // on their elm reference.\n  function cloneVNode (vnode) {\n    var cloned = new VNode(\n      vnode.tag,\n      vnode.data,\n      // #7975\n      // clone children array to avoid mutating original in case of cloning\n      // a child.\n      vnode.children && vnode.children.slice(),\n      vnode.text,\n      vnode.elm,\n      vnode.context,\n      vnode.componentOptions,\n      vnode.asyncFactory\n    );\n    cloned.ns = vnode.ns;\n    cloned.isStatic = vnode.isStatic;\n    cloned.key = vnode.key;\n    cloned.isComment = vnode.isComment;\n    cloned.fnContext = vnode.fnContext;\n    cloned.fnOptions = vnode.fnOptions;\n    cloned.fnScopeId = vnode.fnScopeId;\n    cloned.asyncMeta = vnode.asyncMeta;\n    cloned.isCloned = true;\n    return cloned\n  }\n\n  /*\n   * not type checking this file because flow doesn't play well with\n   * dynamically accessing methods on Array prototype\n   */\n\n  var arrayProto = Array.prototype;\n  var arrayMethods = Object.create(arrayProto);\n\n  var methodsToPatch = [\n    'push',\n    'pop',\n    'shift',\n    'unshift',\n    'splice',\n    'sort',\n    'reverse'\n  ];\n\n  /**\n   * Intercept mutating methods and emit events\n   */\n  methodsToPatch.forEach(function (method) {\n    // cache original method\n    var original = arrayProto[method];\n    def(arrayMethods, method, function mutator () {\n      var args = [], len = arguments.length;\n      while ( len-- ) args[ len ] = arguments[ len ];\n\n      var result = original.apply(this, args);\n      var ob = this.__ob__;\n      var inserted;\n      switch (method) {\n        case 'push':\n        case 'unshift':\n          inserted = args;\n          break\n        case 'splice':\n          inserted = args.slice(2);\n          break\n      }\n      if (inserted) { ob.observeArray(inserted); }\n      // notify change\n      ob.dep.notify();\n      return result\n    });\n  });\n\n  /*  */\n\n  var arrayKeys = Object.getOwnPropertyNames(arrayMethods);\n\n  /**\n   * In some cases we may want to disable observation inside a component's\n   * update computation.\n   */\n  var shouldObserve = true;\n\n  function toggleObserving (value) {\n    shouldObserve = value;\n  }\n\n  /**\n   * Observer class that is attached to each observed\n   * object. Once attached, the observer converts the target\n   * object's property keys into getter/setters that\n   * collect dependencies and dispatch updates.\n   */\n  var Observer = function Observer (value) {\n    this.value = value;\n    this.dep = new Dep();\n    this.vmCount = 0;\n    def(value, '__ob__', this);\n    if (Array.isArray(value)) {\n      if (hasProto) {\n        protoAugment(value, arrayMethods);\n      } else {\n        copyAugment(value, arrayMethods, arrayKeys);\n      }\n      this.observeArray(value);\n    } else {\n      this.walk(value);\n    }\n  };\n\n  /**\n   * Walk through all properties and convert them into\n   * getter/setters. This method should only be called when\n   * value type is Object.\n   */\n  Observer.prototype.walk = function walk (obj) {\n    var keys = Object.keys(obj);\n    for (var i = 0; i < keys.length; i++) {\n      defineReactive$$1(obj, keys[i]);\n    }\n  };\n\n  /**\n   * Observe a list of Array items.\n   */\n  Observer.prototype.observeArray = function observeArray (items) {\n    for (var i = 0, l = items.length; i < l; i++) {\n      observe(items[i]);\n    }\n  };\n\n  // helpers\n\n  /**\n   * Augment a target Object or Array by intercepting\n   * the prototype chain using __proto__\n   */\n  function protoAugment (target, src) {\n    /* eslint-disable no-proto */\n    target.__proto__ = src;\n    /* eslint-enable no-proto */\n  }\n\n  /**\n   * Augment a target Object or Array by defining\n   * hidden properties.\n   */\n  /* istanbul ignore next */\n  function copyAugment (target, src, keys) {\n    for (var i = 0, l = keys.length; i < l; i++) {\n      var key = keys[i];\n      def(target, key, src[key]);\n    }\n  }\n\n  /**\n   * Attempt to create an observer instance for a value,\n   * returns the new observer if successfully observed,\n   * or the existing observer if the value already has one.\n   */\n  function observe (value, asRootData) {\n    if (!isObject(value) || value instanceof VNode) {\n      return\n    }\n    var ob;\n    if (hasOwn(value, '__ob__') && value.__ob__ instanceof Observer) {\n      ob = value.__ob__;\n    } else if (\n      shouldObserve &&\n      !isServerRendering() &&\n      (Array.isArray(value) || isPlainObject(value)) &&\n      Object.isExtensible(value) &&\n      !value._isVue\n    ) {\n      ob = new Observer(value);\n    }\n    if (asRootData && ob) {\n      ob.vmCount++;\n    }\n    return ob\n  }\n\n  /**\n   * Define a reactive property on an Object.\n   */\n  function defineReactive$$1 (\n    obj,\n    key,\n    val,\n    customSetter,\n    shallow\n  ) {\n    var dep = new Dep();\n\n    var property = Object.getOwnPropertyDescriptor(obj, key);\n    if (property && property.configurable === false) {\n      return\n    }\n\n    // cater for pre-defined getter/setters\n    var getter = property && property.get;\n    var setter = property && property.set;\n    if ((!getter || setter) && arguments.length === 2) {\n      val = obj[key];\n    }\n\n    var childOb = !shallow && observe(val);\n    Object.defineProperty(obj, key, {\n      enumerable: true,\n      configurable: true,\n      get: function reactiveGetter () {\n        var value = getter ? getter.call(obj) : val;\n        if (Dep.target) {\n          dep.depend();\n          if (childOb) {\n            childOb.dep.depend();\n            if (Array.isArray(value)) {\n              dependArray(value);\n            }\n          }\n        }\n        return value\n      },\n      set: function reactiveSetter (newVal) {\n        var value = getter ? getter.call(obj) : val;\n        /* eslint-disable no-self-compare */\n        if (newVal === value || (newVal !== newVal && value !== value)) {\n          return\n        }\n        /* eslint-enable no-self-compare */\n        if (customSetter) {\n          customSetter();\n        }\n        // #7981: for accessor properties without setter\n        if (getter && !setter) { return }\n        if (setter) {\n          setter.call(obj, newVal);\n        } else {\n          val = newVal;\n        }\n        childOb = !shallow && observe(newVal);\n        dep.notify();\n      }\n    });\n  }\n\n  /**\n   * Set a property on an object. Adds the new property and\n   * triggers change notification if the property doesn't\n   * already exist.\n   */\n  function set (target, key, val) {\n    if (isUndef(target) || isPrimitive(target)\n    ) {\n      warn((\"Cannot set reactive property on undefined, null, or primitive value: \" + ((target))));\n    }\n    if (Array.isArray(target) && isValidArrayIndex(key)) {\n      target.length = Math.max(target.length, key);\n      target.splice(key, 1, val);\n      return val\n    }\n    if (key in target && !(key in Object.prototype)) {\n      target[key] = val;\n      return val\n    }\n    var ob = (target).__ob__;\n    if (target._isVue || (ob && ob.vmCount)) {\n      warn(\n        'Avoid adding reactive properties to a Vue instance or its root $data ' +\n        'at runtime - declare it upfront in the data option.'\n      );\n      return val\n    }\n    if (!ob) {\n      target[key] = val;\n      return val\n    }\n    defineReactive$$1(ob.value, key, val);\n    ob.dep.notify();\n    return val\n  }\n\n  /**\n   * Delete a property and trigger change if necessary.\n   */\n  function del (target, key) {\n    if (isUndef(target) || isPrimitive(target)\n    ) {\n      warn((\"Cannot delete reactive property on undefined, null, or primitive value: \" + ((target))));\n    }\n    if (Array.isArray(target) && isValidArrayIndex(key)) {\n      target.splice(key, 1);\n      return\n    }\n    var ob = (target).__ob__;\n    if (target._isVue || (ob && ob.vmCount)) {\n      warn(\n        'Avoid deleting properties on a Vue instance or its root $data ' +\n        '- just set it to null.'\n      );\n      return\n    }\n    if (!hasOwn(target, key)) {\n      return\n    }\n    delete target[key];\n    if (!ob) {\n      return\n    }\n    ob.dep.notify();\n  }\n\n  /**\n   * Collect dependencies on array elements when the array is touched, since\n   * we cannot intercept array element access like property getters.\n   */\n  function dependArray (value) {\n    for (var e = (void 0), i = 0, l = value.length; i < l; i++) {\n      e = value[i];\n      e && e.__ob__ && e.__ob__.dep.depend();\n      if (Array.isArray(e)) {\n        dependArray(e);\n      }\n    }\n  }\n\n  /*  */\n\n  /**\n   * Option overwriting strategies are functions that handle\n   * how to merge a parent option value and a child option\n   * value into the final value.\n   */\n  var strats = config.optionMergeStrategies;\n\n  /**\n   * Options with restrictions\n   */\n  {\n    strats.el = strats.propsData = function (parent, child, vm, key) {\n      if (!vm) {\n        warn(\n          \"option \\\"\" + key + \"\\\" can only be used during instance \" +\n          'creation with the `new` keyword.'\n        );\n      }\n      return defaultStrat(parent, child)\n    };\n  }\n\n  /**\n   * Helper that recursively merges two data objects together.\n   */\n  function mergeData (to, from) {\n    if (!from) { return to }\n    var key, toVal, fromVal;\n\n    var keys = hasSymbol\n      ? Reflect.ownKeys(from)\n      : Object.keys(from);\n\n    for (var i = 0; i < keys.length; i++) {\n      key = keys[i];\n      // in case the object is already observed...\n      if (key === '__ob__') { continue }\n      toVal = to[key];\n      fromVal = from[key];\n      if (!hasOwn(to, key)) {\n        set(to, key, fromVal);\n      } else if (\n        toVal !== fromVal &&\n        isPlainObject(toVal) &&\n        isPlainObject(fromVal)\n      ) {\n        mergeData(toVal, fromVal);\n      }\n    }\n    return to\n  }\n\n  /**\n   * Data\n   */\n  function mergeDataOrFn (\n    parentVal,\n    childVal,\n    vm\n  ) {\n    if (!vm) {\n      // in a Vue.extend merge, both should be functions\n      if (!childVal) {\n        return parentVal\n      }\n      if (!parentVal) {\n        return childVal\n      }\n      // when parentVal & childVal are both present,\n      // we need to return a function that returns the\n      // merged result of both functions... no need to\n      // check if parentVal is a function here because\n      // it has to be a function to pass previous merges.\n      return function mergedDataFn () {\n        return mergeData(\n          typeof childVal === 'function' ? childVal.call(this, this) : childVal,\n          typeof parentVal === 'function' ? parentVal.call(this, this) : parentVal\n        )\n      }\n    } else {\n      return function mergedInstanceDataFn () {\n        // instance merge\n        var instanceData = typeof childVal === 'function'\n          ? childVal.call(vm, vm)\n          : childVal;\n        var defaultData = typeof parentVal === 'function'\n          ? parentVal.call(vm, vm)\n          : parentVal;\n        if (instanceData) {\n          return mergeData(instanceData, defaultData)\n        } else {\n          return defaultData\n        }\n      }\n    }\n  }\n\n  strats.data = function (\n    parentVal,\n    childVal,\n    vm\n  ) {\n    if (!vm) {\n      if (childVal && typeof childVal !== 'function') {\n        warn(\n          'The \"data\" option should be a function ' +\n          'that returns a per-instance value in component ' +\n          'definitions.',\n          vm\n        );\n\n        return parentVal\n      }\n      return mergeDataOrFn(parentVal, childVal)\n    }\n\n    return mergeDataOrFn(parentVal, childVal, vm)\n  };\n\n  /**\n   * Hooks and props are merged as arrays.\n   */\n  function mergeHook (\n    parentVal,\n    childVal\n  ) {\n    var res = childVal\n      ? parentVal\n        ? parentVal.concat(childVal)\n        : Array.isArray(childVal)\n          ? childVal\n          : [childVal]\n      : parentVal;\n    return res\n      ? dedupeHooks(res)\n      : res\n  }\n\n  function dedupeHooks (hooks) {\n    var res = [];\n    for (var i = 0; i < hooks.length; i++) {\n      if (res.indexOf(hooks[i]) === -1) {\n        res.push(hooks[i]);\n      }\n    }\n    return res\n  }\n\n  LIFECYCLE_HOOKS.forEach(function (hook) {\n    strats[hook] = mergeHook;\n  });\n\n  /**\n   * Assets\n   *\n   * When a vm is present (instance creation), we need to do\n   * a three-way merge between constructor options, instance\n   * options and parent options.\n   */\n  function mergeAssets (\n    parentVal,\n    childVal,\n    vm,\n    key\n  ) {\n    var res = Object.create(parentVal || null);\n    if (childVal) {\n      assertObjectType(key, childVal, vm);\n      return extend(res, childVal)\n    } else {\n      return res\n    }\n  }\n\n  ASSET_TYPES.forEach(function (type) {\n    strats[type + 's'] = mergeAssets;\n  });\n\n  /**\n   * Watchers.\n   *\n   * Watchers hashes should not overwrite one\n   * another, so we merge them as arrays.\n   */\n  strats.watch = function (\n    parentVal,\n    childVal,\n    vm,\n    key\n  ) {\n    // work around Firefox's Object.prototype.watch...\n    if (parentVal === nativeWatch) { parentVal = undefined; }\n    if (childVal === nativeWatch) { childVal = undefined; }\n    /* istanbul ignore if */\n    if (!childVal) { return Object.create(parentVal || null) }\n    {\n      assertObjectType(key, childVal, vm);\n    }\n    if (!parentVal) { return childVal }\n    var ret = {};\n    extend(ret, parentVal);\n    for (var key$1 in childVal) {\n      var parent = ret[key$1];\n      var child = childVal[key$1];\n      if (parent && !Array.isArray(parent)) {\n        parent = [parent];\n      }\n      ret[key$1] = parent\n        ? parent.concat(child)\n        : Array.isArray(child) ? child : [child];\n    }\n    return ret\n  };\n\n  /**\n   * Other object hashes.\n   */\n  strats.props =\n  strats.methods =\n  strats.inject =\n  strats.computed = function (\n    parentVal,\n    childVal,\n    vm,\n    key\n  ) {\n    if (childVal && \"development\" !== 'production') {\n      assertObjectType(key, childVal, vm);\n    }\n    if (!parentVal) { return childVal }\n    var ret = Object.create(null);\n    extend(ret, parentVal);\n    if (childVal) { extend(ret, childVal); }\n    return ret\n  };\n  strats.provide = mergeDataOrFn;\n\n  /**\n   * Default strategy.\n   */\n  var defaultStrat = function (parentVal, childVal) {\n    return childVal === undefined\n      ? parentVal\n      : childVal\n  };\n\n  /**\n   * Validate component names\n   */\n  function checkComponents (options) {\n    for (var key in options.components) {\n      validateComponentName(key);\n    }\n  }\n\n  function validateComponentName (name) {\n    if (!new RegExp((\"^[a-zA-Z][\\\\-\\\\.0-9_\" + unicodeLetters + \"]*$\")).test(name)) {\n      warn(\n        'Invalid component name: \"' + name + '\". Component names ' +\n        'should conform to valid custom element name in html5 specification.'\n      );\n    }\n    if (isBuiltInTag(name) || config.isReservedTag(name)) {\n      warn(\n        'Do not use built-in or reserved HTML elements as component ' +\n        'id: ' + name\n      );\n    }\n  }\n\n  /**\n   * Ensure all props option syntax are normalized into the\n   * Object-based format.\n   */\n  function normalizeProps (options, vm) {\n    var props = options.props;\n    if (!props) { return }\n    var res = {};\n    var i, val, name;\n    if (Array.isArray(props)) {\n      i = props.length;\n      while (i--) {\n        val = props[i];\n        if (typeof val === 'string') {\n          name = camelize(val);\n          res[name] = { type: null };\n        } else {\n          warn('props must be strings when using array syntax.');\n        }\n      }\n    } else if (isPlainObject(props)) {\n      for (var key in props) {\n        val = props[key];\n        name = camelize(key);\n        res[name] = isPlainObject(val)\n          ? val\n          : { type: val };\n      }\n    } else {\n      warn(\n        \"Invalid value for option \\\"props\\\": expected an Array or an Object, \" +\n        \"but got \" + (toRawType(props)) + \".\",\n        vm\n      );\n    }\n    options.props = res;\n  }\n\n  /**\n   * Normalize all injections into Object-based format\n   */\n  function normalizeInject (options, vm) {\n    var inject = options.inject;\n    if (!inject) { return }\n    var normalized = options.inject = {};\n    if (Array.isArray(inject)) {\n      for (var i = 0; i < inject.length; i++) {\n        normalized[inject[i]] = { from: inject[i] };\n      }\n    } else if (isPlainObject(inject)) {\n      for (var key in inject) {\n        var val = inject[key];\n        normalized[key] = isPlainObject(val)\n          ? extend({ from: key }, val)\n          : { from: val };\n      }\n    } else {\n      warn(\n        \"Invalid value for option \\\"inject\\\": expected an Array or an Object, \" +\n        \"but got \" + (toRawType(inject)) + \".\",\n        vm\n      );\n    }\n  }\n\n  /**\n   * Normalize raw function directives into object format.\n   */\n  function normalizeDirectives (options) {\n    var dirs = options.directives;\n    if (dirs) {\n      for (var key in dirs) {\n        var def$$1 = dirs[key];\n        if (typeof def$$1 === 'function') {\n          dirs[key] = { bind: def$$1, update: def$$1 };\n        }\n      }\n    }\n  }\n\n  function assertObjectType (name, value, vm) {\n    if (!isPlainObject(value)) {\n      warn(\n        \"Invalid value for option \\\"\" + name + \"\\\": expected an Object, \" +\n        \"but got \" + (toRawType(value)) + \".\",\n        vm\n      );\n    }\n  }\n\n  /**\n   * Merge two option objects into a new one.\n   * Core utility used in both instantiation and inheritance.\n   */\n  function mergeOptions (\n    parent,\n    child,\n    vm\n  ) {\n    {\n      checkComponents(child);\n    }\n\n    if (typeof child === 'function') {\n      child = child.options;\n    }\n\n    normalizeProps(child, vm);\n    normalizeInject(child, vm);\n    normalizeDirectives(child);\n\n    // Apply extends and mixins on the child options,\n    // but only if it is a raw options object that isn't\n    // the result of another mergeOptions call.\n    // Only merged options has the _base property.\n    if (!child._base) {\n      if (child.extends) {\n        parent = mergeOptions(parent, child.extends, vm);\n      }\n      if (child.mixins) {\n        for (var i = 0, l = child.mixins.length; i < l; i++) {\n          parent = mergeOptions(parent, child.mixins[i], vm);\n        }\n      }\n    }\n\n    var options = {};\n    var key;\n    for (key in parent) {\n      mergeField(key);\n    }\n    for (key in child) {\n      if (!hasOwn(parent, key)) {\n        mergeField(key);\n      }\n    }\n    function mergeField (key) {\n      var strat = strats[key] || defaultStrat;\n      options[key] = strat(parent[key], child[key], vm, key);\n    }\n    return options\n  }\n\n  /**\n   * Resolve an asset.\n   * This function is used because child instances need access\n   * to assets defined in its ancestor chain.\n   */\n  function resolveAsset (\n    options,\n    type,\n    id,\n    warnMissing\n  ) {\n    /* istanbul ignore if */\n    if (typeof id !== 'string') {\n      return\n    }\n    var assets = options[type];\n    // check local registration variations first\n    if (hasOwn(assets, id)) { return assets[id] }\n    var camelizedId = camelize(id);\n    if (hasOwn(assets, camelizedId)) { return assets[camelizedId] }\n    var PascalCaseId = capitalize(camelizedId);\n    if (hasOwn(assets, PascalCaseId)) { return assets[PascalCaseId] }\n    // fallback to prototype chain\n    var res = assets[id] || assets[camelizedId] || assets[PascalCaseId];\n    if (warnMissing && !res) {\n      warn(\n        'Failed to resolve ' + type.slice(0, -1) + ': ' + id,\n        options\n      );\n    }\n    return res\n  }\n\n  /*  */\n\n\n\n  function validateProp (\n    key,\n    propOptions,\n    propsData,\n    vm\n  ) {\n    var prop = propOptions[key];\n    var absent = !hasOwn(propsData, key);\n    var value = propsData[key];\n    // boolean casting\n    var booleanIndex = getTypeIndex(Boolean, prop.type);\n    if (booleanIndex > -1) {\n      if (absent && !hasOwn(prop, 'default')) {\n        value = false;\n      } else if (value === '' || value === hyphenate(key)) {\n        // only cast empty string / same name to boolean if\n        // boolean has higher priority\n        var stringIndex = getTypeIndex(String, prop.type);\n        if (stringIndex < 0 || booleanIndex < stringIndex) {\n          value = true;\n        }\n      }\n    }\n    // check default value\n    if (value === undefined) {\n      value = getPropDefaultValue(vm, prop, key);\n      // since the default value is a fresh copy,\n      // make sure to observe it.\n      var prevShouldObserve = shouldObserve;\n      toggleObserving(true);\n      observe(value);\n      toggleObserving(prevShouldObserve);\n    }\n    {\n      assertProp(prop, key, value, vm, absent);\n    }\n    return value\n  }\n\n  /**\n   * Get the default value of a prop.\n   */\n  function getPropDefaultValue (vm, prop, key) {\n    // no default, return undefined\n    if (!hasOwn(prop, 'default')) {\n      return undefined\n    }\n    var def = prop.default;\n    // warn against non-factory defaults for Object & Array\n    if (isObject(def)) {\n      warn(\n        'Invalid default value for prop \"' + key + '\": ' +\n        'Props with type Object/Array must use a factory function ' +\n        'to return the default value.',\n        vm\n      );\n    }\n    // the raw prop value was also undefined from previous render,\n    // return previous default value to avoid unnecessary watcher trigger\n    if (vm && vm.$options.propsData &&\n      vm.$options.propsData[key] === undefined &&\n      vm._props[key] !== undefined\n    ) {\n      return vm._props[key]\n    }\n    // call factory function for non-Function types\n    // a value is Function if its prototype is function even across different execution context\n    return typeof def === 'function' && getType(prop.type) !== 'Function'\n      ? def.call(vm)\n      : def\n  }\n\n  /**\n   * Assert whether a prop is valid.\n   */\n  function assertProp (\n    prop,\n    name,\n    value,\n    vm,\n    absent\n  ) {\n    if (prop.required && absent) {\n      warn(\n        'Missing required prop: \"' + name + '\"',\n        vm\n      );\n      return\n    }\n    if (value == null && !prop.required) {\n      return\n    }\n    var type = prop.type;\n    var valid = !type || type === true;\n    var expectedTypes = [];\n    if (type) {\n      if (!Array.isArray(type)) {\n        type = [type];\n      }\n      for (var i = 0; i < type.length && !valid; i++) {\n        var assertedType = assertType(value, type[i]);\n        expectedTypes.push(assertedType.expectedType || '');\n        valid = assertedType.valid;\n      }\n    }\n\n    if (!valid) {\n      warn(\n        getInvalidTypeMessage(name, value, expectedTypes),\n        vm\n      );\n      return\n    }\n    var validator = prop.validator;\n    if (validator) {\n      if (!validator(value)) {\n        warn(\n          'Invalid prop: custom validator check failed for prop \"' + name + '\".',\n          vm\n        );\n      }\n    }\n  }\n\n  var simpleCheckRE = /^(String|Number|Boolean|Function|Symbol)$/;\n\n  function assertType (value, type) {\n    var valid;\n    var expectedType = getType(type);\n    if (simpleCheckRE.test(expectedType)) {\n      var t = typeof value;\n      valid = t === expectedType.toLowerCase();\n      // for primitive wrapper objects\n      if (!valid && t === 'object') {\n        valid = value instanceof type;\n      }\n    } else if (expectedType === 'Object') {\n      valid = isPlainObject(value);\n    } else if (expectedType === 'Array') {\n      valid = Array.isArray(value);\n    } else {\n      valid = value instanceof type;\n    }\n    return {\n      valid: valid,\n      expectedType: expectedType\n    }\n  }\n\n  /**\n   * Use function string name to check built-in types,\n   * because a simple equality check will fail when running\n   * across different vms / iframes.\n   */\n  function getType (fn) {\n    var match = fn && fn.toString().match(/^\\s*function (\\w+)/);\n    return match ? match[1] : ''\n  }\n\n  function isSameType (a, b) {\n    return getType(a) === getType(b)\n  }\n\n  function getTypeIndex (type, expectedTypes) {\n    if (!Array.isArray(expectedTypes)) {\n      return isSameType(expectedTypes, type) ? 0 : -1\n    }\n    for (var i = 0, len = expectedTypes.length; i < len; i++) {\n      if (isSameType(expectedTypes[i], type)) {\n        return i\n      }\n    }\n    return -1\n  }\n\n  function getInvalidTypeMessage (name, value, expectedTypes) {\n    var message = \"Invalid prop: type check failed for prop \\\"\" + name + \"\\\".\" +\n      \" Expected \" + (expectedTypes.map(capitalize).join(', '));\n    var expectedType = expectedTypes[0];\n    var receivedType = toRawType(value);\n    var expectedValue = styleValue(value, expectedType);\n    var receivedValue = styleValue(value, receivedType);\n    // check if we need to specify expected value\n    if (expectedTypes.length === 1 &&\n        isExplicable(expectedType) &&\n        !isBoolean(expectedType, receivedType)) {\n      message += \" with value \" + expectedValue;\n    }\n    message += \", got \" + receivedType + \" \";\n    // check if we need to specify received value\n    if (isExplicable(receivedType)) {\n      message += \"with value \" + receivedValue + \".\";\n    }\n    return message\n  }\n\n  function styleValue (value, type) {\n    if (type === 'String') {\n      return (\"\\\"\" + value + \"\\\"\")\n    } else if (type === 'Number') {\n      return (\"\" + (Number(value)))\n    } else {\n      return (\"\" + value)\n    }\n  }\n\n  function isExplicable (value) {\n    var explicitTypes = ['string', 'number', 'boolean'];\n    return explicitTypes.some(function (elem) { return value.toLowerCase() === elem; })\n  }\n\n  function isBoolean () {\n    var args = [], len = arguments.length;\n    while ( len-- ) args[ len ] = arguments[ len ];\n\n    return args.some(function (elem) { return elem.toLowerCase() === 'boolean'; })\n  }\n\n  /*  */\n\n  function handleError (err, vm, info) {\n    // Deactivate deps tracking while processing error handler to avoid possible infinite rendering.\n    // See: https://github.com/vuejs/vuex/issues/1505\n    pushTarget();\n    try {\n      if (vm) {\n        var cur = vm;\n        while ((cur = cur.$parent)) {\n          var hooks = cur.$options.errorCaptured;\n          if (hooks) {\n            for (var i = 0; i < hooks.length; i++) {\n              try {\n                var capture = hooks[i].call(cur, err, vm, info) === false;\n                if (capture) { return }\n              } catch (e) {\n                globalHandleError(e, cur, 'errorCaptured hook');\n              }\n            }\n          }\n        }\n      }\n      globalHandleError(err, vm, info);\n    } finally {\n      popTarget();\n    }\n  }\n\n  function invokeWithErrorHandling (\n    handler,\n    context,\n    args,\n    vm,\n    info\n  ) {\n    var res;\n    try {\n      res = args ? handler.apply(context, args) : handler.call(context);\n      if (res && !res._isVue && isPromise(res)) {\n        // issue #9511\n        // reassign to res to avoid catch triggering multiple times when nested calls\n        res = res.catch(function (e) { return handleError(e, vm, info + \" (Promise/async)\"); });\n      }\n    } catch (e) {\n      handleError(e, vm, info);\n    }\n    return res\n  }\n\n  function globalHandleError (err, vm, info) {\n    if (config.errorHandler) {\n      try {\n        return config.errorHandler.call(null, err, vm, info)\n      } catch (e) {\n        // if the user intentionally throws the original error in the handler,\n        // do not log it twice\n        if (e !== err) {\n          logError(e, null, 'config.errorHandler');\n        }\n      }\n    }\n    logError(err, vm, info);\n  }\n\n  function logError (err, vm, info) {\n    {\n      warn((\"Error in \" + info + \": \\\"\" + (err.toString()) + \"\\\"\"), vm);\n    }\n    /* istanbul ignore else */\n    if ((inBrowser || inWeex) && typeof console !== 'undefined') {\n      console.error(err);\n    } else {\n      throw err\n    }\n  }\n\n  /*  */\n\n  var isUsingMicroTask = false;\n\n  var callbacks = [];\n  var pending = false;\n\n  function flushCallbacks () {\n    pending = false;\n    var copies = callbacks.slice(0);\n    callbacks.length = 0;\n    for (var i = 0; i < copies.length; i++) {\n      copies[i]();\n    }\n  }\n\n  // Here we have async deferring wrappers using microtasks.\n  // In 2.5 we used (macro) tasks (in combination with microtasks).\n  // However, it has subtle problems when state is changed right before repaint\n  // (e.g. #6813, out-in transitions).\n  // Also, using (macro) tasks in event handler would cause some weird behaviors\n  // that cannot be circumvented (e.g. #7109, #7153, #7546, #7834, #8109).\n  // So we now use microtasks everywhere, again.\n  // A major drawback of this tradeoff is that there are some scenarios\n  // where microtasks have too high a priority and fire in between supposedly\n  // sequential events (e.g. #4521, #6690, which have workarounds)\n  // or even between bubbling of the same event (#6566).\n  var timerFunc;\n\n  // The nextTick behavior leverages the microtask queue, which can be accessed\n  // via either native Promise.then or MutationObserver.\n  // MutationObserver has wider support, however it is seriously bugged in\n  // UIWebView in iOS >= 9.3.3 when triggered in touch event handlers. It\n  // completely stops working after triggering a few times... so, if native\n  // Promise is available, we will use it:\n  /* istanbul ignore next, $flow-disable-line */\n  if (typeof Promise !== 'undefined' && isNative(Promise)) {\n    var p = Promise.resolve();\n    timerFunc = function () {\n      p.then(flushCallbacks);\n      // In problematic UIWebViews, Promise.then doesn't completely break, but\n      // it can get stuck in a weird state where callbacks are pushed into the\n      // microtask queue but the queue isn't being flushed, until the browser\n      // needs to do some other work, e.g. handle a timer. Therefore we can\n      // \"force\" the microtask queue to be flushed by adding an empty timer.\n      if (isIOS) { setTimeout(noop); }\n    };\n    isUsingMicroTask = true;\n  } else if (!isIE && typeof MutationObserver !== 'undefined' && (\n    isNative(MutationObserver) ||\n    // PhantomJS and iOS 7.x\n    MutationObserver.toString() === '[object MutationObserverConstructor]'\n  )) {\n    // Use MutationObserver where native Promise is not available,\n    // e.g. PhantomJS, iOS7, Android 4.4\n    // (#6466 MutationObserver is unreliable in IE11)\n    var counter = 1;\n    var observer = new MutationObserver(flushCallbacks);\n    var textNode = document.createTextNode(String(counter));\n    observer.observe(textNode, {\n      characterData: true\n    });\n    timerFunc = function () {\n      counter = (counter + 1) % 2;\n      textNode.data = String(counter);\n    };\n    isUsingMicroTask = true;\n  } else if (typeof setImmediate !== 'undefined' && isNative(setImmediate)) {\n    // Fallback to setImmediate.\n    // Techinically it leverages the (macro) task queue,\n    // but it is still a better choice than setTimeout.\n    timerFunc = function () {\n      setImmediate(flushCallbacks);\n    };\n  } else {\n    // Fallback to setTimeout.\n    timerFunc = function () {\n      setTimeout(flushCallbacks, 0);\n    };\n  }\n\n  function nextTick (cb, ctx) {\n    var _resolve;\n    callbacks.push(function () {\n      if (cb) {\n        try {\n          cb.call(ctx);\n        } catch (e) {\n          handleError(e, ctx, 'nextTick');\n        }\n      } else if (_resolve) {\n        _resolve(ctx);\n      }\n    });\n    if (!pending) {\n      pending = true;\n      timerFunc();\n    }\n    // $flow-disable-line\n    if (!cb && typeof Promise !== 'undefined') {\n      return new Promise(function (resolve) {\n        _resolve = resolve;\n      })\n    }\n  }\n\n  /*  */\n\n  var mark;\n  var measure;\n\n  {\n    var perf = inBrowser && window.performance;\n    /* istanbul ignore if */\n    if (\n      perf &&\n      perf.mark &&\n      perf.measure &&\n      perf.clearMarks &&\n      perf.clearMeasures\n    ) {\n      mark = function (tag) { return perf.mark(tag); };\n      measure = function (name, startTag, endTag) {\n        perf.measure(name, startTag, endTag);\n        perf.clearMarks(startTag);\n        perf.clearMarks(endTag);\n        // perf.clearMeasures(name)\n      };\n    }\n  }\n\n  /* not type checking this file because flow doesn't play well with Proxy */\n\n  var initProxy;\n\n  {\n    var allowedGlobals = makeMap(\n      'Infinity,undefined,NaN,isFinite,isNaN,' +\n      'parseFloat,parseInt,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,' +\n      'Math,Number,Date,Array,Object,Boolean,String,RegExp,Map,Set,JSON,Intl,' +\n      'require' // for Webpack/Browserify\n    );\n\n    var warnNonPresent = function (target, key) {\n      warn(\n        \"Property or method \\\"\" + key + \"\\\" is not defined on the instance but \" +\n        'referenced during render. Make sure that this property is reactive, ' +\n        'either in the data option, or for class-based components, by ' +\n        'initializing the property. ' +\n        'See: https://vuejs.org/v2/guide/reactivity.html#Declaring-Reactive-Properties.',\n        target\n      );\n    };\n\n    var warnReservedPrefix = function (target, key) {\n      warn(\n        \"Property \\\"\" + key + \"\\\" must be accessed with \\\"$data.\" + key + \"\\\" because \" +\n        'properties starting with \"$\" or \"_\" are not proxied in the Vue instance to ' +\n        'prevent conflicts with Vue internals' +\n        'See: https://vuejs.org/v2/api/#data',\n        target\n      );\n    };\n\n    var hasProxy =\n      typeof Proxy !== 'undefined' && isNative(Proxy);\n\n    if (hasProxy) {\n      var isBuiltInModifier = makeMap('stop,prevent,self,ctrl,shift,alt,meta,exact');\n      config.keyCodes = new Proxy(config.keyCodes, {\n        set: function set (target, key, value) {\n          if (isBuiltInModifier(key)) {\n            warn((\"Avoid overwriting built-in modifier in config.keyCodes: .\" + key));\n            return false\n          } else {\n            target[key] = value;\n            return true\n          }\n        }\n      });\n    }\n\n    var hasHandler = {\n      has: function has (target, key) {\n        var has = key in target;\n        var isAllowed = allowedGlobals(key) ||\n          (typeof key === 'string' && key.charAt(0) === '_' && !(key in target.$data));\n        if (!has && !isAllowed) {\n          if (key in target.$data) { warnReservedPrefix(target, key); }\n          else { warnNonPresent(target, key); }\n        }\n        return has || !isAllowed\n      }\n    };\n\n    var getHandler = {\n      get: function get (target, key) {\n        if (typeof key === 'string' && !(key in target)) {\n          if (key in target.$data) { warnReservedPrefix(target, key); }\n          else { warnNonPresent(target, key); }\n        }\n        return target[key]\n      }\n    };\n\n    initProxy = function initProxy (vm) {\n      if (hasProxy) {\n        // determine which proxy handler to use\n        var options = vm.$options;\n        var handlers = options.render && options.render._withStripped\n          ? getHandler\n          : hasHandler;\n        vm._renderProxy = new Proxy(vm, handlers);\n      } else {\n        vm._renderProxy = vm;\n      }\n    };\n  }\n\n  /*  */\n\n  var seenObjects = new _Set();\n\n  /**\n   * Recursively traverse an object to evoke all converted\n   * getters, so that every nested property inside the object\n   * is collected as a \"deep\" dependency.\n   */\n  function traverse (val) {\n    _traverse(val, seenObjects);\n    seenObjects.clear();\n  }\n\n  function _traverse (val, seen) {\n    var i, keys;\n    var isA = Array.isArray(val);\n    if ((!isA && !isObject(val)) || Object.isFrozen(val) || val instanceof VNode) {\n      return\n    }\n    if (val.__ob__) {\n      var depId = val.__ob__.dep.id;\n      if (seen.has(depId)) {\n        return\n      }\n      seen.add(depId);\n    }\n    if (isA) {\n      i = val.length;\n      while (i--) { _traverse(val[i], seen); }\n    } else {\n      keys = Object.keys(val);\n      i = keys.length;\n      while (i--) { _traverse(val[keys[i]], seen); }\n    }\n  }\n\n  /*  */\n\n  var normalizeEvent = cached(function (name) {\n    var passive = name.charAt(0) === '&';\n    name = passive ? name.slice(1) : name;\n    var once$$1 = name.charAt(0) === '~'; // Prefixed last, checked first\n    name = once$$1 ? name.slice(1) : name;\n    var capture = name.charAt(0) === '!';\n    name = capture ? name.slice(1) : name;\n    return {\n      name: name,\n      once: once$$1,\n      capture: capture,\n      passive: passive\n    }\n  });\n\n  function createFnInvoker (fns, vm) {\n    function invoker () {\n      var arguments$1 = arguments;\n\n      var fns = invoker.fns;\n      if (Array.isArray(fns)) {\n        var cloned = fns.slice();\n        for (var i = 0; i < cloned.length; i++) {\n          invokeWithErrorHandling(cloned[i], null, arguments$1, vm, \"v-on handler\");\n        }\n      } else {\n        // return handler return value for single handlers\n        return invokeWithErrorHandling(fns, null, arguments, vm, \"v-on handler\")\n      }\n    }\n    invoker.fns = fns;\n    return invoker\n  }\n\n  function updateListeners (\n    on,\n    oldOn,\n    add,\n    remove$$1,\n    createOnceHandler,\n    vm\n  ) {\n    var name, def$$1, cur, old, event;\n    for (name in on) {\n      def$$1 = cur = on[name];\n      old = oldOn[name];\n      event = normalizeEvent(name);\n      if (isUndef(cur)) {\n        warn(\n          \"Invalid handler for event \\\"\" + (event.name) + \"\\\": got \" + String(cur),\n          vm\n        );\n      } else if (isUndef(old)) {\n        if (isUndef(cur.fns)) {\n          cur = on[name] = createFnInvoker(cur, vm);\n        }\n        if (isTrue(event.once)) {\n          cur = on[name] = createOnceHandler(event.name, cur, event.capture);\n        }\n        add(event.name, cur, event.capture, event.passive, event.params);\n      } else if (cur !== old) {\n        old.fns = cur;\n        on[name] = old;\n      }\n    }\n    for (name in oldOn) {\n      if (isUndef(on[name])) {\n        event = normalizeEvent(name);\n        remove$$1(event.name, oldOn[name], event.capture);\n      }\n    }\n  }\n\n  /*  */\n\n  function mergeVNodeHook (def, hookKey, hook) {\n    if (def instanceof VNode) {\n      def = def.data.hook || (def.data.hook = {});\n    }\n    var invoker;\n    var oldHook = def[hookKey];\n\n    function wrappedHook () {\n      hook.apply(this, arguments);\n      // important: remove merged hook to ensure it's called only once\n      // and prevent memory leak\n      remove(invoker.fns, wrappedHook);\n    }\n\n    if (isUndef(oldHook)) {\n      // no existing hook\n      invoker = createFnInvoker([wrappedHook]);\n    } else {\n      /* istanbul ignore if */\n      if (isDef(oldHook.fns) && isTrue(oldHook.merged)) {\n        // already a merged invoker\n        invoker = oldHook;\n        invoker.fns.push(wrappedHook);\n      } else {\n        // existing plain hook\n        invoker = createFnInvoker([oldHook, wrappedHook]);\n      }\n    }\n\n    invoker.merged = true;\n    def[hookKey] = invoker;\n  }\n\n  /*  */\n\n  function extractPropsFromVNodeData (\n    data,\n    Ctor,\n    tag\n  ) {\n    // we are only extracting raw values here.\n    // validation and default values are handled in the child\n    // component itself.\n    var propOptions = Ctor.options.props;\n    if (isUndef(propOptions)) {\n      return\n    }\n    var res = {};\n    var attrs = data.attrs;\n    var props = data.props;\n    if (isDef(attrs) || isDef(props)) {\n      for (var key in propOptions) {\n        var altKey = hyphenate(key);\n        {\n          var keyInLowerCase = key.toLowerCase();\n          if (\n            key !== keyInLowerCase &&\n            attrs && hasOwn(attrs, keyInLowerCase)\n          ) {\n            tip(\n              \"Prop \\\"\" + keyInLowerCase + \"\\\" is passed to component \" +\n              (formatComponentName(tag || Ctor)) + \", but the declared prop name is\" +\n              \" \\\"\" + key + \"\\\". \" +\n              \"Note that HTML attributes are case-insensitive and camelCased \" +\n              \"props need to use their kebab-case equivalents when using in-DOM \" +\n              \"templates. You should probably use \\\"\" + altKey + \"\\\" instead of \\\"\" + key + \"\\\".\"\n            );\n          }\n        }\n        checkProp(res, props, key, altKey, true) ||\n        checkProp(res, attrs, key, altKey, false);\n      }\n    }\n    return res\n  }\n\n  function checkProp (\n    res,\n    hash,\n    key,\n    altKey,\n    preserve\n  ) {\n    if (isDef(hash)) {\n      if (hasOwn(hash, key)) {\n        res[key] = hash[key];\n        if (!preserve) {\n          delete hash[key];\n        }\n        return true\n      } else if (hasOwn(hash, altKey)) {\n        res[key] = hash[altKey];\n        if (!preserve) {\n          delete hash[altKey];\n        }\n        return true\n      }\n    }\n    return false\n  }\n\n  /*  */\n\n  // The template compiler attempts to minimize the need for normalization by\n  // statically analyzing the template at compile time.\n  //\n  // For plain HTML markup, normalization can be completely skipped because the\n  // generated render function is guaranteed to return Array<VNode>. There are\n  // two cases where extra normalization is needed:\n\n  // 1. When the children contains components - because a functional component\n  // may return an Array instead of a single root. In this case, just a simple\n  // normalization is needed - if any child is an Array, we flatten the whole\n  // thing with Array.prototype.concat. It is guaranteed to be only 1-level deep\n  // because functional components already normalize their own children.\n  function simpleNormalizeChildren (children) {\n    for (var i = 0; i < children.length; i++) {\n      if (Array.isArray(children[i])) {\n        return Array.prototype.concat.apply([], children)\n      }\n    }\n    return children\n  }\n\n  // 2. When the children contains constructs that always generated nested Arrays,\n  // e.g. <template>, <slot>, v-for, or when the children is provided by user\n  // with hand-written render functions / JSX. In such cases a full normalization\n  // is needed to cater to all possible types of children values.\n  function normalizeChildren (children) {\n    return isPrimitive(children)\n      ? [createTextVNode(children)]\n      : Array.isArray(children)\n        ? normalizeArrayChildren(children)\n        : undefined\n  }\n\n  function isTextNode (node) {\n    return isDef(node) && isDef(node.text) && isFalse(node.isComment)\n  }\n\n  function normalizeArrayChildren (children, nestedIndex) {\n    var res = [];\n    var i, c, lastIndex, last;\n    for (i = 0; i < children.length; i++) {\n      c = children[i];\n      if (isUndef(c) || typeof c === 'boolean') { continue }\n      lastIndex = res.length - 1;\n      last = res[lastIndex];\n      //  nested\n      if (Array.isArray(c)) {\n        if (c.length > 0) {\n          c = normalizeArrayChildren(c, ((nestedIndex || '') + \"_\" + i));\n          // merge adjacent text nodes\n          if (isTextNode(c[0]) && isTextNode(last)) {\n            res[lastIndex] = createTextVNode(last.text + (c[0]).text);\n            c.shift();\n          }\n          res.push.apply(res, c);\n        }\n      } else if (isPrimitive(c)) {\n        if (isTextNode(last)) {\n          // merge adjacent text nodes\n          // this is necessary for SSR hydration because text nodes are\n          // essentially merged when rendered to HTML strings\n          res[lastIndex] = createTextVNode(last.text + c);\n        } else if (c !== '') {\n          // convert primitive to vnode\n          res.push(createTextVNode(c));\n        }\n      } else {\n        if (isTextNode(c) && isTextNode(last)) {\n          // merge adjacent text nodes\n          res[lastIndex] = createTextVNode(last.text + c.text);\n        } else {\n          // default key for nested array children (likely generated by v-for)\n          if (isTrue(children._isVList) &&\n            isDef(c.tag) &&\n            isUndef(c.key) &&\n            isDef(nestedIndex)) {\n            c.key = \"__vlist\" + nestedIndex + \"_\" + i + \"__\";\n          }\n          res.push(c);\n        }\n      }\n    }\n    return res\n  }\n\n  /*  */\n\n  function initProvide (vm) {\n    var provide = vm.$options.provide;\n    if (provide) {\n      vm._provided = typeof provide === 'function'\n        ? provide.call(vm)\n        : provide;\n    }\n  }\n\n  function initInjections (vm) {\n    var result = resolveInject(vm.$options.inject, vm);\n    if (result) {\n      toggleObserving(false);\n      Object.keys(result).forEach(function (key) {\n        /* istanbul ignore else */\n        {\n          defineReactive$$1(vm, key, result[key], function () {\n            warn(\n              \"Avoid mutating an injected value directly since the changes will be \" +\n              \"overwritten whenever the provided component re-renders. \" +\n              \"injection being mutated: \\\"\" + key + \"\\\"\",\n              vm\n            );\n          });\n        }\n      });\n      toggleObserving(true);\n    }\n  }\n\n  function resolveInject (inject, vm) {\n    if (inject) {\n      // inject is :any because flow is not smart enough to figure out cached\n      var result = Object.create(null);\n      var keys = hasSymbol\n        ? Reflect.ownKeys(inject)\n        : Object.keys(inject);\n\n      for (var i = 0; i < keys.length; i++) {\n        var key = keys[i];\n        // #6574 in case the inject object is observed...\n        if (key === '__ob__') { continue }\n        var provideKey = inject[key].from;\n        var source = vm;\n        while (source) {\n          if (source._provided && hasOwn(source._provided, provideKey)) {\n            result[key] = source._provided[provideKey];\n            break\n          }\n          source = source.$parent;\n        }\n        if (!source) {\n          if ('default' in inject[key]) {\n            var provideDefault = inject[key].default;\n            result[key] = typeof provideDefault === 'function'\n              ? provideDefault.call(vm)\n              : provideDefault;\n          } else {\n            warn((\"Injection \\\"\" + key + \"\\\" not found\"), vm);\n          }\n        }\n      }\n      return result\n    }\n  }\n\n  /*  */\n\n\n\n  /**\n   * Runtime helper for resolving raw children VNodes into a slot object.\n   */\n  function resolveSlots (\n    children,\n    context\n  ) {\n    if (!children || !children.length) {\n      return {}\n    }\n    var slots = {};\n    for (var i = 0, l = children.length; i < l; i++) {\n      var child = children[i];\n      var data = child.data;\n      // remove slot attribute if the node is resolved as a Vue slot node\n      if (data && data.attrs && data.attrs.slot) {\n        delete data.attrs.slot;\n      }\n      // named slots should only be respected if the vnode was rendered in the\n      // same context.\n      if ((child.context === context || child.fnContext === context) &&\n        data && data.slot != null\n      ) {\n        var name = data.slot;\n        var slot = (slots[name] || (slots[name] = []));\n        if (child.tag === 'template') {\n          slot.push.apply(slot, child.children || []);\n        } else {\n          slot.push(child);\n        }\n      } else {\n        (slots.default || (slots.default = [])).push(child);\n      }\n    }\n    // ignore slots that contains only whitespace\n    for (var name$1 in slots) {\n      if (slots[name$1].every(isWhitespace)) {\n        delete slots[name$1];\n      }\n    }\n    return slots\n  }\n\n  function isWhitespace (node) {\n    return (node.isComment && !node.asyncFactory) || node.text === ' '\n  }\n\n  /*  */\n\n  function normalizeScopedSlots (\n    slots,\n    normalSlots,\n    prevSlots\n  ) {\n    var res;\n    var isStable = slots ? !!slots.$stable : true;\n    var key = slots && slots.$key;\n    if (!slots) {\n      res = {};\n    } else if (slots._normalized) {\n      // fast path 1: child component re-render only, parent did not change\n      return slots._normalized\n    } else if (\n      isStable &&\n      prevSlots &&\n      prevSlots !== emptyObject &&\n      key === prevSlots.$key &&\n      Object.keys(normalSlots).length === 0\n    ) {\n      // fast path 2: stable scoped slots w/ no normal slots to proxy,\n      // only need to normalize once\n      return prevSlots\n    } else {\n      res = {};\n      for (var key$1 in slots) {\n        if (slots[key$1] && key$1[0] !== '$') {\n          res[key$1] = normalizeScopedSlot(normalSlots, key$1, slots[key$1]);\n        }\n      }\n    }\n    // expose normal slots on scopedSlots\n    for (var key$2 in normalSlots) {\n      if (!(key$2 in res)) {\n        res[key$2] = proxyNormalSlot(normalSlots, key$2);\n      }\n    }\n    // avoriaz seems to mock a non-extensible $scopedSlots object\n    // and when that is passed down this would cause an error\n    if (slots && Object.isExtensible(slots)) {\n      (slots)._normalized = res;\n    }\n    def(res, '$stable', isStable);\n    def(res, '$key', key);\n    return res\n  }\n\n  function normalizeScopedSlot(normalSlots, key, fn) {\n    var normalized = function () {\n      var res = arguments.length ? fn.apply(null, arguments) : fn({});\n      res = res && typeof res === 'object' && !Array.isArray(res)\n        ? [res] // single vnode\n        : normalizeChildren(res);\n      return res && res.length === 0\n        ? undefined\n        : res\n    };\n    // this is a slot using the new v-slot syntax without scope. although it is\n    // compiled as a scoped slot, render fn users would expect it to be present\n    // on this.$slots because the usage is semantically a normal slot.\n    if (fn.proxy) {\n      Object.defineProperty(normalSlots, key, {\n        get: normalized,\n        enumerable: true,\n        configurable: true\n      });\n    }\n    return normalized\n  }\n\n  function proxyNormalSlot(slots, key) {\n    return function () { return slots[key]; }\n  }\n\n  /*  */\n\n  /**\n   * Runtime helper for rendering v-for lists.\n   */\n  function renderList (\n    val,\n    render\n  ) {\n    var ret, i, l, keys, key;\n    if (Array.isArray(val) || typeof val === 'string') {\n      ret = new Array(val.length);\n      for (i = 0, l = val.length; i < l; i++) {\n        ret[i] = render(val[i], i);\n      }\n    } else if (typeof val === 'number') {\n      ret = new Array(val);\n      for (i = 0; i < val; i++) {\n        ret[i] = render(i + 1, i);\n      }\n    } else if (isObject(val)) {\n      if (hasSymbol && val[Symbol.iterator]) {\n        ret = [];\n        var iterator = val[Symbol.iterator]();\n        var result = iterator.next();\n        while (!result.done) {\n          ret.push(render(result.value, ret.length));\n          result = iterator.next();\n        }\n      } else {\n        keys = Object.keys(val);\n        ret = new Array(keys.length);\n        for (i = 0, l = keys.length; i < l; i++) {\n          key = keys[i];\n          ret[i] = render(val[key], key, i);\n        }\n      }\n    }\n    if (!isDef(ret)) {\n      ret = [];\n    }\n    (ret)._isVList = true;\n    return ret\n  }\n\n  /*  */\n\n  /**\n   * Runtime helper for rendering <slot>\n   */\n  function renderSlot (\n    name,\n    fallback,\n    props,\n    bindObject\n  ) {\n    var scopedSlotFn = this.$scopedSlots[name];\n    var nodes;\n    if (scopedSlotFn) { // scoped slot\n      props = props || {};\n      if (bindObject) {\n        if (!isObject(bindObject)) {\n          warn(\n            'slot v-bind without argument expects an Object',\n            this\n          );\n        }\n        props = extend(extend({}, bindObject), props);\n      }\n      nodes = scopedSlotFn(props) || fallback;\n    } else {\n      nodes = this.$slots[name] || fallback;\n    }\n\n    var target = props && props.slot;\n    if (target) {\n      return this.$createElement('template', { slot: target }, nodes)\n    } else {\n      return nodes\n    }\n  }\n\n  /*  */\n\n  /**\n   * Runtime helper for resolving filters\n   */\n  function resolveFilter (id) {\n    return resolveAsset(this.$options, 'filters', id, true) || identity\n  }\n\n  /*  */\n\n  function isKeyNotMatch (expect, actual) {\n    if (Array.isArray(expect)) {\n      return expect.indexOf(actual) === -1\n    } else {\n      return expect !== actual\n    }\n  }\n\n  /**\n   * Runtime helper for checking keyCodes from config.\n   * exposed as Vue.prototype._k\n   * passing in eventKeyName as last argument separately for backwards compat\n   */\n  function checkKeyCodes (\n    eventKeyCode,\n    key,\n    builtInKeyCode,\n    eventKeyName,\n    builtInKeyName\n  ) {\n    var mappedKeyCode = config.keyCodes[key] || builtInKeyCode;\n    if (builtInKeyName && eventKeyName && !config.keyCodes[key]) {\n      return isKeyNotMatch(builtInKeyName, eventKeyName)\n    } else if (mappedKeyCode) {\n      return isKeyNotMatch(mappedKeyCode, eventKeyCode)\n    } else if (eventKeyName) {\n      return hyphenate(eventKeyName) !== key\n    }\n  }\n\n  /*  */\n\n  /**\n   * Runtime helper for merging v-bind=\"object\" into a VNode's data.\n   */\n  function bindObjectProps (\n    data,\n    tag,\n    value,\n    asProp,\n    isSync\n  ) {\n    if (value) {\n      if (!isObject(value)) {\n        warn(\n          'v-bind without argument expects an Object or Array value',\n          this\n        );\n      } else {\n        if (Array.isArray(value)) {\n          value = toObject(value);\n        }\n        var hash;\n        var loop = function ( key ) {\n          if (\n            key === 'class' ||\n            key === 'style' ||\n            isReservedAttribute(key)\n          ) {\n            hash = data;\n          } else {\n            var type = data.attrs && data.attrs.type;\n            hash = asProp || config.mustUseProp(tag, type, key)\n              ? data.domProps || (data.domProps = {})\n              : data.attrs || (data.attrs = {});\n          }\n          var camelizedKey = camelize(key);\n          if (!(key in hash) && !(camelizedKey in hash)) {\n            hash[key] = value[key];\n\n            if (isSync) {\n              var on = data.on || (data.on = {});\n              on[(\"update:\" + camelizedKey)] = function ($event) {\n                value[key] = $event;\n              };\n            }\n          }\n        };\n\n        for (var key in value) loop( key );\n      }\n    }\n    return data\n  }\n\n  /*  */\n\n  /**\n   * Runtime helper for rendering static trees.\n   */\n  function renderStatic (\n    index,\n    isInFor\n  ) {\n    var cached = this._staticTrees || (this._staticTrees = []);\n    var tree = cached[index];\n    // if has already-rendered static tree and not inside v-for,\n    // we can reuse the same tree.\n    if (tree && !isInFor) {\n      return tree\n    }\n    // otherwise, render a fresh tree.\n    tree = cached[index] = this.$options.staticRenderFns[index].call(\n      this._renderProxy,\n      null,\n      this // for render fns generated for functional component templates\n    );\n    markStatic(tree, (\"__static__\" + index), false);\n    return tree\n  }\n\n  /**\n   * Runtime helper for v-once.\n   * Effectively it means marking the node as static with a unique key.\n   */\n  function markOnce (\n    tree,\n    index,\n    key\n  ) {\n    markStatic(tree, (\"__once__\" + index + (key ? (\"_\" + key) : \"\")), true);\n    return tree\n  }\n\n  function markStatic (\n    tree,\n    key,\n    isOnce\n  ) {\n    if (Array.isArray(tree)) {\n      for (var i = 0; i < tree.length; i++) {\n        if (tree[i] && typeof tree[i] !== 'string') {\n          markStaticNode(tree[i], (key + \"_\" + i), isOnce);\n        }\n      }\n    } else {\n      markStaticNode(tree, key, isOnce);\n    }\n  }\n\n  function markStaticNode (node, key, isOnce) {\n    node.isStatic = true;\n    node.key = key;\n    node.isOnce = isOnce;\n  }\n\n  /*  */\n\n  function bindObjectListeners (data, value) {\n    if (value) {\n      if (!isPlainObject(value)) {\n        warn(\n          'v-on without argument expects an Object value',\n          this\n        );\n      } else {\n        var on = data.on = data.on ? extend({}, data.on) : {};\n        for (var key in value) {\n          var existing = on[key];\n          var ours = value[key];\n          on[key] = existing ? [].concat(existing, ours) : ours;\n        }\n      }\n    }\n    return data\n  }\n\n  /*  */\n\n  function resolveScopedSlots (\n    fns, // see flow/vnode\n    res,\n    // the following are added in 2.6\n    hasDynamicKeys,\n    contentHashKey\n  ) {\n    res = res || { $stable: !hasDynamicKeys };\n    for (var i = 0; i < fns.length; i++) {\n      var slot = fns[i];\n      if (Array.isArray(slot)) {\n        resolveScopedSlots(slot, res, hasDynamicKeys);\n      } else if (slot) {\n        // marker for reverse proxying v-slot without scope on this.$slots\n        if (slot.proxy) {\n          slot.fn.proxy = true;\n        }\n        res[slot.key] = slot.fn;\n      }\n    }\n    if (contentHashKey) {\n      (res).$key = contentHashKey;\n    }\n    return res\n  }\n\n  /*  */\n\n  function bindDynamicKeys (baseObj, values) {\n    for (var i = 0; i < values.length; i += 2) {\n      var key = values[i];\n      if (typeof key === 'string' && key) {\n        baseObj[values[i]] = values[i + 1];\n      } else if (key !== '' && key !== null) {\n        // null is a speical value for explicitly removing a binding\n        warn(\n          (\"Invalid value for dynamic directive argument (expected string or null): \" + key),\n          this\n        );\n      }\n    }\n    return baseObj\n  }\n\n  // helper to dynamically append modifier runtime markers to event names.\n  // ensure only append when value is already string, otherwise it will be cast\n  // to string and cause the type check to miss.\n  function prependModifier (value, symbol) {\n    return typeof value === 'string' ? symbol + value : value\n  }\n\n  /*  */\n\n  function installRenderHelpers (target) {\n    target._o = markOnce;\n    target._n = toNumber;\n    target._s = toString;\n    target._l = renderList;\n    target._t = renderSlot;\n    target._q = looseEqual;\n    target._i = looseIndexOf;\n    target._m = renderStatic;\n    target._f = resolveFilter;\n    target._k = checkKeyCodes;\n    target._b = bindObjectProps;\n    target._v = createTextVNode;\n    target._e = createEmptyVNode;\n    target._u = resolveScopedSlots;\n    target._g = bindObjectListeners;\n    target._d = bindDynamicKeys;\n    target._p = prependModifier;\n  }\n\n  /*  */\n\n  function FunctionalRenderContext (\n    data,\n    props,\n    children,\n    parent,\n    Ctor\n  ) {\n    var this$1 = this;\n\n    var options = Ctor.options;\n    // ensure the createElement function in functional components\n    // gets a unique context - this is necessary for correct named slot check\n    var contextVm;\n    if (hasOwn(parent, '_uid')) {\n      contextVm = Object.create(parent);\n      // $flow-disable-line\n      contextVm._original = parent;\n    } else {\n      // the context vm passed in is a functional context as well.\n      // in this case we want to make sure we are able to get a hold to the\n      // real context instance.\n      contextVm = parent;\n      // $flow-disable-line\n      parent = parent._original;\n    }\n    var isCompiled = isTrue(options._compiled);\n    var needNormalization = !isCompiled;\n\n    this.data = data;\n    this.props = props;\n    this.children = children;\n    this.parent = parent;\n    this.listeners = data.on || emptyObject;\n    this.injections = resolveInject(options.inject, parent);\n    this.slots = function () {\n      if (!this$1.$slots) {\n        normalizeScopedSlots(\n          data.scopedSlots,\n          this$1.$slots = resolveSlots(children, parent)\n        );\n      }\n      return this$1.$slots\n    };\n\n    Object.defineProperty(this, 'scopedSlots', ({\n      enumerable: true,\n      get: function get () {\n        return normalizeScopedSlots(data.scopedSlots, this.slots())\n      }\n    }));\n\n    // support for compiled functional template\n    if (isCompiled) {\n      // exposing $options for renderStatic()\n      this.$options = options;\n      // pre-resolve slots for renderSlot()\n      this.$slots = this.slots();\n      this.$scopedSlots = normalizeScopedSlots(data.scopedSlots, this.$slots);\n    }\n\n    if (options._scopeId) {\n      this._c = function (a, b, c, d) {\n        var vnode = createElement(contextVm, a, b, c, d, needNormalization);\n        if (vnode && !Array.isArray(vnode)) {\n          vnode.fnScopeId = options._scopeId;\n          vnode.fnContext = parent;\n        }\n        return vnode\n      };\n    } else {\n      this._c = function (a, b, c, d) { return createElement(contextVm, a, b, c, d, needNormalization); };\n    }\n  }\n\n  installRenderHelpers(FunctionalRenderContext.prototype);\n\n  function createFunctionalComponent (\n    Ctor,\n    propsData,\n    data,\n    contextVm,\n    children\n  ) {\n    var options = Ctor.options;\n    var props = {};\n    var propOptions = options.props;\n    if (isDef(propOptions)) {\n      for (var key in propOptions) {\n        props[key] = validateProp(key, propOptions, propsData || emptyObject);\n      }\n    } else {\n      if (isDef(data.attrs)) { mergeProps(props, data.attrs); }\n      if (isDef(data.props)) { mergeProps(props, data.props); }\n    }\n\n    var renderContext = new FunctionalRenderContext(\n      data,\n      props,\n      children,\n      contextVm,\n      Ctor\n    );\n\n    var vnode = options.render.call(null, renderContext._c, renderContext);\n\n    if (vnode instanceof VNode) {\n      return cloneAndMarkFunctionalResult(vnode, data, renderContext.parent, options, renderContext)\n    } else if (Array.isArray(vnode)) {\n      var vnodes = normalizeChildren(vnode) || [];\n      var res = new Array(vnodes.length);\n      for (var i = 0; i < vnodes.length; i++) {\n        res[i] = cloneAndMarkFunctionalResult(vnodes[i], data, renderContext.parent, options, renderContext);\n      }\n      return res\n    }\n  }\n\n  function cloneAndMarkFunctionalResult (vnode, data, contextVm, options, renderContext) {\n    // #7817 clone node before setting fnContext, otherwise if the node is reused\n    // (e.g. it was from a cached normal slot) the fnContext causes named slots\n    // that should not be matched to match.\n    var clone = cloneVNode(vnode);\n    clone.fnContext = contextVm;\n    clone.fnOptions = options;\n    {\n      (clone.devtoolsMeta = clone.devtoolsMeta || {}).renderContext = renderContext;\n    }\n    if (data.slot) {\n      (clone.data || (clone.data = {})).slot = data.slot;\n    }\n    return clone\n  }\n\n  function mergeProps (to, from) {\n    for (var key in from) {\n      to[camelize(key)] = from[key];\n    }\n  }\n\n  /*  */\n\n  /*  */\n\n  /*  */\n\n  /*  */\n\n  // inline hooks to be invoked on component VNodes during patch\n  var componentVNodeHooks = {\n    init: function init (vnode, hydrating) {\n      if (\n        vnode.componentInstance &&\n        !vnode.componentInstance._isDestroyed &&\n        vnode.data.keepAlive\n      ) {\n        // kept-alive components, treat as a patch\n        var mountedNode = vnode; // work around flow\n        componentVNodeHooks.prepatch(mountedNode, mountedNode);\n      } else {\n        var child = vnode.componentInstance = createComponentInstanceForVnode(\n          vnode,\n          activeInstance\n        );\n        child.$mount(hydrating ? vnode.elm : undefined, hydrating);\n      }\n    },\n\n    prepatch: function prepatch (oldVnode, vnode) {\n      var options = vnode.componentOptions;\n      var child = vnode.componentInstance = oldVnode.componentInstance;\n      updateChildComponent(\n        child,\n        options.propsData, // updated props\n        options.listeners, // updated listeners\n        vnode, // new parent vnode\n        options.children // new children\n      );\n    },\n\n    insert: function insert (vnode) {\n      var context = vnode.context;\n      var componentInstance = vnode.componentInstance;\n      if (!componentInstance._isMounted) {\n        componentInstance._isMounted = true;\n        callHook(componentInstance, 'mounted');\n      }\n      if (vnode.data.keepAlive) {\n        if (context._isMounted) {\n          // vue-router#1212\n          // During updates, a kept-alive component's child components may\n          // change, so directly walking the tree here may call activated hooks\n          // on incorrect children. Instead we push them into a queue which will\n          // be processed after the whole patch process ended.\n          queueActivatedComponent(componentInstance);\n        } else {\n          activateChildComponent(componentInstance, true /* direct */);\n        }\n      }\n    },\n\n    destroy: function destroy (vnode) {\n      var componentInstance = vnode.componentInstance;\n      if (!componentInstance._isDestroyed) {\n        if (!vnode.data.keepAlive) {\n          componentInstance.$destroy();\n        } else {\n          deactivateChildComponent(componentInstance, true /* direct */);\n        }\n      }\n    }\n  };\n\n  var hooksToMerge = Object.keys(componentVNodeHooks);\n\n  function createComponent (\n    Ctor,\n    data,\n    context,\n    children,\n    tag\n  ) {\n    if (isUndef(Ctor)) {\n      return\n    }\n\n    var baseCtor = context.$options._base;\n\n    // plain options object: turn it into a constructor\n    if (isObject(Ctor)) {\n      Ctor = baseCtor.extend(Ctor);\n    }\n\n    // if at this stage it's not a constructor or an async component factory,\n    // reject.\n    if (typeof Ctor !== 'function') {\n      {\n        warn((\"Invalid Component definition: \" + (String(Ctor))), context);\n      }\n      return\n    }\n\n    // async component\n    var asyncFactory;\n    if (isUndef(Ctor.cid)) {\n      asyncFactory = Ctor;\n      Ctor = resolveAsyncComponent(asyncFactory, baseCtor);\n      if (Ctor === undefined) {\n        // return a placeholder node for async component, which is rendered\n        // as a comment node but preserves all the raw information for the node.\n        // the information will be used for async server-rendering and hydration.\n        return createAsyncPlaceholder(\n          asyncFactory,\n          data,\n          context,\n          children,\n          tag\n        )\n      }\n    }\n\n    data = data || {};\n\n    // resolve constructor options in case global mixins are applied after\n    // component constructor creation\n    resolveConstructorOptions(Ctor);\n\n    // transform component v-model data into props & events\n    if (isDef(data.model)) {\n      transformModel(Ctor.options, data);\n    }\n\n    // extract props\n    var propsData = extractPropsFromVNodeData(data, Ctor, tag);\n\n    // functional component\n    if (isTrue(Ctor.options.functional)) {\n      return createFunctionalComponent(Ctor, propsData, data, context, children)\n    }\n\n    // extract listeners, since these needs to be treated as\n    // child component listeners instead of DOM listeners\n    var listeners = data.on;\n    // replace with listeners with .native modifier\n    // so it gets processed during parent component patch.\n    data.on = data.nativeOn;\n\n    if (isTrue(Ctor.options.abstract)) {\n      // abstract components do not keep anything\n      // other than props & listeners & slot\n\n      // work around flow\n      var slot = data.slot;\n      data = {};\n      if (slot) {\n        data.slot = slot;\n      }\n    }\n\n    // install component management hooks onto the placeholder node\n    installComponentHooks(data);\n\n    // return a placeholder vnode\n    var name = Ctor.options.name || tag;\n    var vnode = new VNode(\n      (\"vue-component-\" + (Ctor.cid) + (name ? (\"-\" + name) : '')),\n      data, undefined, undefined, undefined, context,\n      { Ctor: Ctor, propsData: propsData, listeners: listeners, tag: tag, children: children },\n      asyncFactory\n    );\n\n    return vnode\n  }\n\n  function createComponentInstanceForVnode (\n    vnode, // we know it's MountedComponentVNode but flow doesn't\n    parent // activeInstance in lifecycle state\n  ) {\n    var options = {\n      _isComponent: true,\n      _parentVnode: vnode,\n      parent: parent\n    };\n    // check inline-template render functions\n    var inlineTemplate = vnode.data.inlineTemplate;\n    if (isDef(inlineTemplate)) {\n      options.render = inlineTemplate.render;\n      options.staticRenderFns = inlineTemplate.staticRenderFns;\n    }\n    return new vnode.componentOptions.Ctor(options)\n  }\n\n  function installComponentHooks (data) {\n    var hooks = data.hook || (data.hook = {});\n    for (var i = 0; i < hooksToMerge.length; i++) {\n      var key = hooksToMerge[i];\n      var existing = hooks[key];\n      var toMerge = componentVNodeHooks[key];\n      if (existing !== toMerge && !(existing && existing._merged)) {\n        hooks[key] = existing ? mergeHook$1(toMerge, existing) : toMerge;\n      }\n    }\n  }\n\n  function mergeHook$1 (f1, f2) {\n    var merged = function (a, b) {\n      // flow complains about extra args which is why we use any\n      f1(a, b);\n      f2(a, b);\n    };\n    merged._merged = true;\n    return merged\n  }\n\n  // transform component v-model info (value and callback) into\n  // prop and event handler respectively.\n  function transformModel (options, data) {\n    var prop = (options.model && options.model.prop) || 'value';\n    var event = (options.model && options.model.event) || 'input'\n    ;(data.attrs || (data.attrs = {}))[prop] = data.model.value;\n    var on = data.on || (data.on = {});\n    var existing = on[event];\n    var callback = data.model.callback;\n    if (isDef(existing)) {\n      if (\n        Array.isArray(existing)\n          ? existing.indexOf(callback) === -1\n          : existing !== callback\n      ) {\n        on[event] = [callback].concat(existing);\n      }\n    } else {\n      on[event] = callback;\n    }\n  }\n\n  /*  */\n\n  var SIMPLE_NORMALIZE = 1;\n  var ALWAYS_NORMALIZE = 2;\n\n  // wrapper function for providing a more flexible interface\n  // without getting yelled at by flow\n  function createElement (\n    context,\n    tag,\n    data,\n    children,\n    normalizationType,\n    alwaysNormalize\n  ) {\n    if (Array.isArray(data) || isPrimitive(data)) {\n      normalizationType = children;\n      children = data;\n      data = undefined;\n    }\n    if (isTrue(alwaysNormalize)) {\n      normalizationType = ALWAYS_NORMALIZE;\n    }\n    return _createElement(context, tag, data, children, normalizationType)\n  }\n\n  function _createElement (\n    context,\n    tag,\n    data,\n    children,\n    normalizationType\n  ) {\n    if (isDef(data) && isDef((data).__ob__)) {\n      warn(\n        \"Avoid using observed data object as vnode data: \" + (JSON.stringify(data)) + \"\\n\" +\n        'Always create fresh vnode data objects in each render!',\n        context\n      );\n      return createEmptyVNode()\n    }\n    // object syntax in v-bind\n    if (isDef(data) && isDef(data.is)) {\n      tag = data.is;\n    }\n    if (!tag) {\n      // in case of component :is set to falsy value\n      return createEmptyVNode()\n    }\n    // warn against non-primitive key\n    if (isDef(data) && isDef(data.key) && !isPrimitive(data.key)\n    ) {\n      {\n        warn(\n          'Avoid using non-primitive value as key, ' +\n          'use string/number value instead.',\n          context\n        );\n      }\n    }\n    // support single function children as default scoped slot\n    if (Array.isArray(children) &&\n      typeof children[0] === 'function'\n    ) {\n      data = data || {};\n      data.scopedSlots = { default: children[0] };\n      children.length = 0;\n    }\n    if (normalizationType === ALWAYS_NORMALIZE) {\n      children = normalizeChildren(children);\n    } else if (normalizationType === SIMPLE_NORMALIZE) {\n      children = simpleNormalizeChildren(children);\n    }\n    var vnode, ns;\n    if (typeof tag === 'string') {\n      var Ctor;\n      ns = (context.$vnode && context.$vnode.ns) || config.getTagNamespace(tag);\n      if (config.isReservedTag(tag)) {\n        // platform built-in elements\n        vnode = new VNode(\n          config.parsePlatformTagName(tag), data, children,\n          undefined, undefined, context\n        );\n      } else if ((!data || !data.pre) && isDef(Ctor = resolveAsset(context.$options, 'components', tag))) {\n        // component\n        vnode = createComponent(Ctor, data, context, children, tag);\n      } else {\n        // unknown or unlisted namespaced elements\n        // check at runtime because it may get assigned a namespace when its\n        // parent normalizes children\n        vnode = new VNode(\n          tag, data, children,\n          undefined, undefined, context\n        );\n      }\n    } else {\n      // direct component options / constructor\n      vnode = createComponent(tag, data, context, children);\n    }\n    if (Array.isArray(vnode)) {\n      return vnode\n    } else if (isDef(vnode)) {\n      if (isDef(ns)) { applyNS(vnode, ns); }\n      if (isDef(data)) { registerDeepBindings(data); }\n      return vnode\n    } else {\n      return createEmptyVNode()\n    }\n  }\n\n  function applyNS (vnode, ns, force) {\n    vnode.ns = ns;\n    if (vnode.tag === 'foreignObject') {\n      // use default namespace inside foreignObject\n      ns = undefined;\n      force = true;\n    }\n    if (isDef(vnode.children)) {\n      for (var i = 0, l = vnode.children.length; i < l; i++) {\n        var child = vnode.children[i];\n        if (isDef(child.tag) && (\n          isUndef(child.ns) || (isTrue(force) && child.tag !== 'svg'))) {\n          applyNS(child, ns, force);\n        }\n      }\n    }\n  }\n\n  // ref #5318\n  // necessary to ensure parent re-render when deep bindings like :style and\n  // :class are used on slot nodes\n  function registerDeepBindings (data) {\n    if (isObject(data.style)) {\n      traverse(data.style);\n    }\n    if (isObject(data.class)) {\n      traverse(data.class);\n    }\n  }\n\n  /*  */\n\n  function initRender (vm) {\n    vm._vnode = null; // the root of the child tree\n    vm._staticTrees = null; // v-once cached trees\n    var options = vm.$options;\n    var parentVnode = vm.$vnode = options._parentVnode; // the placeholder node in parent tree\n    var renderContext = parentVnode && parentVnode.context;\n    vm.$slots = resolveSlots(options._renderChildren, renderContext);\n    vm.$scopedSlots = emptyObject;\n    // bind the createElement fn to this instance\n    // so that we get proper render context inside it.\n    // args order: tag, data, children, normalizationType, alwaysNormalize\n    // internal version is used by render functions compiled from templates\n    vm._c = function (a, b, c, d) { return createElement(vm, a, b, c, d, false); };\n    // normalization is always applied for the public version, used in\n    // user-written render functions.\n    vm.$createElement = function (a, b, c, d) { return createElement(vm, a, b, c, d, true); };\n\n    // $attrs & $listeners are exposed for easier HOC creation.\n    // they need to be reactive so that HOCs using them are always updated\n    var parentData = parentVnode && parentVnode.data;\n\n    /* istanbul ignore else */\n    {\n      defineReactive$$1(vm, '$attrs', parentData && parentData.attrs || emptyObject, function () {\n        !isUpdatingChildComponent && warn(\"$attrs is readonly.\", vm);\n      }, true);\n      defineReactive$$1(vm, '$listeners', options._parentListeners || emptyObject, function () {\n        !isUpdatingChildComponent && warn(\"$listeners is readonly.\", vm);\n      }, true);\n    }\n  }\n\n  var currentRenderingInstance = null;\n\n  function renderMixin (Vue) {\n    // install runtime convenience helpers\n    installRenderHelpers(Vue.prototype);\n\n    Vue.prototype.$nextTick = function (fn) {\n      return nextTick(fn, this)\n    };\n\n    Vue.prototype._render = function () {\n      var vm = this;\n      var ref = vm.$options;\n      var render = ref.render;\n      var _parentVnode = ref._parentVnode;\n\n      if (_parentVnode) {\n        vm.$scopedSlots = normalizeScopedSlots(\n          _parentVnode.data.scopedSlots,\n          vm.$slots,\n          vm.$scopedSlots\n        );\n      }\n\n      // set parent vnode. this allows render functions to have access\n      // to the data on the placeholder node.\n      vm.$vnode = _parentVnode;\n      // render self\n      var vnode;\n      try {\n        // There's no need to maintain a stack becaues all render fns are called\n        // separately from one another. Nested component's render fns are called\n        // when parent component is patched.\n        currentRenderingInstance = vm;\n        vnode = render.call(vm._renderProxy, vm.$createElement);\n      } catch (e) {\n        handleError(e, vm, \"render\");\n        // return error render result,\n        // or previous vnode to prevent render error causing blank component\n        /* istanbul ignore else */\n        if (vm.$options.renderError) {\n          try {\n            vnode = vm.$options.renderError.call(vm._renderProxy, vm.$createElement, e);\n          } catch (e) {\n            handleError(e, vm, \"renderError\");\n            vnode = vm._vnode;\n          }\n        } else {\n          vnode = vm._vnode;\n        }\n      } finally {\n        currentRenderingInstance = null;\n      }\n      // if the returned array contains only a single node, allow it\n      if (Array.isArray(vnode) && vnode.length === 1) {\n        vnode = vnode[0];\n      }\n      // return empty vnode in case the render function errored out\n      if (!(vnode instanceof VNode)) {\n        if (Array.isArray(vnode)) {\n          warn(\n            'Multiple root nodes returned from render function. Render function ' +\n            'should return a single root node.',\n            vm\n          );\n        }\n        vnode = createEmptyVNode();\n      }\n      // set parent\n      vnode.parent = _parentVnode;\n      return vnode\n    };\n  }\n\n  /*  */\n\n  function ensureCtor (comp, base) {\n    if (\n      comp.__esModule ||\n      (hasSymbol && comp[Symbol.toStringTag] === 'Module')\n    ) {\n      comp = comp.default;\n    }\n    return isObject(comp)\n      ? base.extend(comp)\n      : comp\n  }\n\n  function createAsyncPlaceholder (\n    factory,\n    data,\n    context,\n    children,\n    tag\n  ) {\n    var node = createEmptyVNode();\n    node.asyncFactory = factory;\n    node.asyncMeta = { data: data, context: context, children: children, tag: tag };\n    return node\n  }\n\n  function resolveAsyncComponent (\n    factory,\n    baseCtor\n  ) {\n    if (isTrue(factory.error) && isDef(factory.errorComp)) {\n      return factory.errorComp\n    }\n\n    if (isDef(factory.resolved)) {\n      return factory.resolved\n    }\n\n    if (isTrue(factory.loading) && isDef(factory.loadingComp)) {\n      return factory.loadingComp\n    }\n\n    var owner = currentRenderingInstance;\n    if (isDef(factory.owners)) {\n      // already pending\n      factory.owners.push(owner);\n    } else {\n      var owners = factory.owners = [owner];\n      var sync = true;\n\n      var forceRender = function (renderCompleted) {\n        for (var i = 0, l = owners.length; i < l; i++) {\n          (owners[i]).$forceUpdate();\n        }\n\n        if (renderCompleted) {\n          owners.length = 0;\n        }\n      };\n\n      var resolve = once(function (res) {\n        // cache resolved\n        factory.resolved = ensureCtor(res, baseCtor);\n        // invoke callbacks only if this is not a synchronous resolve\n        // (async resolves are shimmed as synchronous during SSR)\n        if (!sync) {\n          forceRender(true);\n        } else {\n          owners.length = 0;\n        }\n      });\n\n      var reject = once(function (reason) {\n        warn(\n          \"Failed to resolve async component: \" + (String(factory)) +\n          (reason ? (\"\\nReason: \" + reason) : '')\n        );\n        if (isDef(factory.errorComp)) {\n          factory.error = true;\n          forceRender(true);\n        }\n      });\n\n      var res = factory(resolve, reject);\n\n      if (isObject(res)) {\n        if (isPromise(res)) {\n          // () => Promise\n          if (isUndef(factory.resolved)) {\n            res.then(resolve, reject);\n          }\n        } else if (isPromise(res.component)) {\n          res.component.then(resolve, reject);\n\n          if (isDef(res.error)) {\n            factory.errorComp = ensureCtor(res.error, baseCtor);\n          }\n\n          if (isDef(res.loading)) {\n            factory.loadingComp = ensureCtor(res.loading, baseCtor);\n            if (res.delay === 0) {\n              factory.loading = true;\n            } else {\n              setTimeout(function () {\n                if (isUndef(factory.resolved) && isUndef(factory.error)) {\n                  factory.loading = true;\n                  forceRender(false);\n                }\n              }, res.delay || 200);\n            }\n          }\n\n          if (isDef(res.timeout)) {\n            setTimeout(function () {\n              if (isUndef(factory.resolved)) {\n                reject(\n                  \"timeout (\" + (res.timeout) + \"ms)\"\n                );\n              }\n            }, res.timeout);\n          }\n        }\n      }\n\n      sync = false;\n      // return in case resolved synchronously\n      return factory.loading\n        ? factory.loadingComp\n        : factory.resolved\n    }\n  }\n\n  /*  */\n\n  function isAsyncPlaceholder (node) {\n    return node.isComment && node.asyncFactory\n  }\n\n  /*  */\n\n  function getFirstComponentChild (children) {\n    if (Array.isArray(children)) {\n      for (var i = 0; i < children.length; i++) {\n        var c = children[i];\n        if (isDef(c) && (isDef(c.componentOptions) || isAsyncPlaceholder(c))) {\n          return c\n        }\n      }\n    }\n  }\n\n  /*  */\n\n  /*  */\n\n  function initEvents (vm) {\n    vm._events = Object.create(null);\n    vm._hasHookEvent = false;\n    // init parent attached events\n    var listeners = vm.$options._parentListeners;\n    if (listeners) {\n      updateComponentListeners(vm, listeners);\n    }\n  }\n\n  var target;\n\n  function add (event, fn) {\n    target.$on(event, fn);\n  }\n\n  function remove$1 (event, fn) {\n    target.$off(event, fn);\n  }\n\n  function createOnceHandler (event, fn) {\n    var _target = target;\n    return function onceHandler () {\n      var res = fn.apply(null, arguments);\n      if (res !== null) {\n        _target.$off(event, onceHandler);\n      }\n    }\n  }\n\n  function updateComponentListeners (\n    vm,\n    listeners,\n    oldListeners\n  ) {\n    target = vm;\n    updateListeners(listeners, oldListeners || {}, add, remove$1, createOnceHandler, vm);\n    target = undefined;\n  }\n\n  function eventsMixin (Vue) {\n    var hookRE = /^hook:/;\n    Vue.prototype.$on = function (event, fn) {\n      var vm = this;\n      if (Array.isArray(event)) {\n        for (var i = 0, l = event.length; i < l; i++) {\n          vm.$on(event[i], fn);\n        }\n      } else {\n        (vm._events[event] || (vm._events[event] = [])).push(fn);\n        // optimize hook:event cost by using a boolean flag marked at registration\n        // instead of a hash lookup\n        if (hookRE.test(event)) {\n          vm._hasHookEvent = true;\n        }\n      }\n      return vm\n    };\n\n    Vue.prototype.$once = function (event, fn) {\n      var vm = this;\n      function on () {\n        vm.$off(event, on);\n        fn.apply(vm, arguments);\n      }\n      on.fn = fn;\n      vm.$on(event, on);\n      return vm\n    };\n\n    Vue.prototype.$off = function (event, fn) {\n      var vm = this;\n      // all\n      if (!arguments.length) {\n        vm._events = Object.create(null);\n        return vm\n      }\n      // array of events\n      if (Array.isArray(event)) {\n        for (var i$1 = 0, l = event.length; i$1 < l; i$1++) {\n          vm.$off(event[i$1], fn);\n        }\n        return vm\n      }\n      // specific event\n      var cbs = vm._events[event];\n      if (!cbs) {\n        return vm\n      }\n      if (!fn) {\n        vm._events[event] = null;\n        return vm\n      }\n      // specific handler\n      var cb;\n      var i = cbs.length;\n      while (i--) {\n        cb = cbs[i];\n        if (cb === fn || cb.fn === fn) {\n          cbs.splice(i, 1);\n          break\n        }\n      }\n      return vm\n    };\n\n    Vue.prototype.$emit = function (event) {\n      var vm = this;\n      {\n        var lowerCaseEvent = event.toLowerCase();\n        if (lowerCaseEvent !== event && vm._events[lowerCaseEvent]) {\n          tip(\n            \"Event \\\"\" + lowerCaseEvent + \"\\\" is emitted in component \" +\n            (formatComponentName(vm)) + \" but the handler is registered for \\\"\" + event + \"\\\". \" +\n            \"Note that HTML attributes are case-insensitive and you cannot use \" +\n            \"v-on to listen to camelCase events when using in-DOM templates. \" +\n            \"You should probably use \\\"\" + (hyphenate(event)) + \"\\\" instead of \\\"\" + event + \"\\\".\"\n          );\n        }\n      }\n      var cbs = vm._events[event];\n      if (cbs) {\n        cbs = cbs.length > 1 ? toArray(cbs) : cbs;\n        var args = toArray(arguments, 1);\n        var info = \"event handler for \\\"\" + event + \"\\\"\";\n        for (var i = 0, l = cbs.length; i < l; i++) {\n          invokeWithErrorHandling(cbs[i], vm, args, vm, info);\n        }\n      }\n      return vm\n    };\n  }\n\n  /*  */\n\n  var activeInstance = null;\n  var isUpdatingChildComponent = false;\n\n  function setActiveInstance(vm) {\n    var prevActiveInstance = activeInstance;\n    activeInstance = vm;\n    return function () {\n      activeInstance = prevActiveInstance;\n    }\n  }\n\n  function initLifecycle (vm) {\n    var options = vm.$options;\n\n    // locate first non-abstract parent\n    var parent = options.parent;\n    if (parent && !options.abstract) {\n      while (parent.$options.abstract && parent.$parent) {\n        parent = parent.$parent;\n      }\n      parent.$children.push(vm);\n    }\n\n    vm.$parent = parent;\n    vm.$root = parent ? parent.$root : vm;\n\n    vm.$children = [];\n    vm.$refs = {};\n\n    vm._watcher = null;\n    vm._inactive = null;\n    vm._directInactive = false;\n    vm._isMounted = false;\n    vm._isDestroyed = false;\n    vm._isBeingDestroyed = false;\n  }\n\n  function lifecycleMixin (Vue) {\n    Vue.prototype._update = function (vnode, hydrating) {\n      var vm = this;\n      var prevEl = vm.$el;\n      var prevVnode = vm._vnode;\n      var restoreActiveInstance = setActiveInstance(vm);\n      vm._vnode = vnode;\n      // Vue.prototype.__patch__ is injected in entry points\n      // based on the rendering backend used.\n      if (!prevVnode) {\n        // initial render\n        vm.$el = vm.__patch__(vm.$el, vnode, hydrating, false /* removeOnly */);\n      } else {\n        // updates\n        vm.$el = vm.__patch__(prevVnode, vnode);\n      }\n      restoreActiveInstance();\n      // update __vue__ reference\n      if (prevEl) {\n        prevEl.__vue__ = null;\n      }\n      if (vm.$el) {\n        vm.$el.__vue__ = vm;\n      }\n      // if parent is an HOC, update its $el as well\n      if (vm.$vnode && vm.$parent && vm.$vnode === vm.$parent._vnode) {\n        vm.$parent.$el = vm.$el;\n      }\n      // updated hook is called by the scheduler to ensure that children are\n      // updated in a parent's updated hook.\n    };\n\n    Vue.prototype.$forceUpdate = function () {\n      var vm = this;\n      if (vm._watcher) {\n        vm._watcher.update();\n      }\n    };\n\n    Vue.prototype.$destroy = function () {\n      var vm = this;\n      if (vm._isBeingDestroyed) {\n        return\n      }\n      callHook(vm, 'beforeDestroy');\n      vm._isBeingDestroyed = true;\n      // remove self from parent\n      var parent = vm.$parent;\n      if (parent && !parent._isBeingDestroyed && !vm.$options.abstract) {\n        remove(parent.$children, vm);\n      }\n      // teardown watchers\n      if (vm._watcher) {\n        vm._watcher.teardown();\n      }\n      var i = vm._watchers.length;\n      while (i--) {\n        vm._watchers[i].teardown();\n      }\n      // remove reference from data ob\n      // frozen object may not have observer.\n      if (vm._data.__ob__) {\n        vm._data.__ob__.vmCount--;\n      }\n      // call the last hook...\n      vm._isDestroyed = true;\n      // invoke destroy hooks on current rendered tree\n      vm.__patch__(vm._vnode, null);\n      // fire destroyed hook\n      callHook(vm, 'destroyed');\n      // turn off all instance listeners.\n      vm.$off();\n      // remove __vue__ reference\n      if (vm.$el) {\n        vm.$el.__vue__ = null;\n      }\n      // release circular reference (#6759)\n      if (vm.$vnode) {\n        vm.$vnode.parent = null;\n      }\n    };\n  }\n\n  function mountComponent (\n    vm,\n    el,\n    hydrating\n  ) {\n    vm.$el = el;\n    if (!vm.$options.render) {\n      vm.$options.render = createEmptyVNode;\n      {\n        /* istanbul ignore if */\n        if ((vm.$options.template && vm.$options.template.charAt(0) !== '#') ||\n          vm.$options.el || el) {\n          warn(\n            'You are using the runtime-only build of Vue where the template ' +\n            'compiler is not available. Either pre-compile the templates into ' +\n            'render functions, or use the compiler-included build.',\n            vm\n          );\n        } else {\n          warn(\n            'Failed to mount component: template or render function not defined.',\n            vm\n          );\n        }\n      }\n    }\n    callHook(vm, 'beforeMount');\n\n    var updateComponent;\n    /* istanbul ignore if */\n    if (config.performance && mark) {\n      updateComponent = function () {\n        var name = vm._name;\n        var id = vm._uid;\n        var startTag = \"vue-perf-start:\" + id;\n        var endTag = \"vue-perf-end:\" + id;\n\n        mark(startTag);\n        var vnode = vm._render();\n        mark(endTag);\n        measure((\"vue \" + name + \" render\"), startTag, endTag);\n\n        mark(startTag);\n        vm._update(vnode, hydrating);\n        mark(endTag);\n        measure((\"vue \" + name + \" patch\"), startTag, endTag);\n      };\n    } else {\n      updateComponent = function () {\n        vm._update(vm._render(), hydrating);\n      };\n    }\n\n    // we set this to vm._watcher inside the watcher's constructor\n    // since the watcher's initial patch may call $forceUpdate (e.g. inside child\n    // component's mounted hook), which relies on vm._watcher being already defined\n    new Watcher(vm, updateComponent, noop, {\n      before: function before () {\n        if (vm._isMounted && !vm._isDestroyed) {\n          callHook(vm, 'beforeUpdate');\n        }\n      }\n    }, true /* isRenderWatcher */);\n    hydrating = false;\n\n    // manually mounted instance, call mounted on self\n    // mounted is called for render-created child components in its inserted hook\n    if (vm.$vnode == null) {\n      vm._isMounted = true;\n      callHook(vm, 'mounted');\n    }\n    return vm\n  }\n\n  function updateChildComponent (\n    vm,\n    propsData,\n    listeners,\n    parentVnode,\n    renderChildren\n  ) {\n    {\n      isUpdatingChildComponent = true;\n    }\n\n    // determine whether component has slot children\n    // we need to do this before overwriting $options._renderChildren.\n\n    // check if there are dynamic scopedSlots (hand-written or compiled but with\n    // dynamic slot names). Static scoped slots compiled from template has the\n    // \"$stable\" marker.\n    var newScopedSlots = parentVnode.data.scopedSlots;\n    var oldScopedSlots = vm.$scopedSlots;\n    var hasDynamicScopedSlot = !!(\n      (newScopedSlots && !newScopedSlots.$stable) ||\n      (oldScopedSlots !== emptyObject && !oldScopedSlots.$stable) ||\n      (newScopedSlots && vm.$scopedSlots.$key !== newScopedSlots.$key)\n    );\n\n    // Any static slot children from the parent may have changed during parent's\n    // update. Dynamic scoped slots may also have changed. In such cases, a forced\n    // update is necessary to ensure correctness.\n    var needsForceUpdate = !!(\n      renderChildren ||               // has new static slots\n      vm.$options._renderChildren ||  // has old static slots\n      hasDynamicScopedSlot\n    );\n\n    vm.$options._parentVnode = parentVnode;\n    vm.$vnode = parentVnode; // update vm's placeholder node without re-render\n\n    if (vm._vnode) { // update child tree's parent\n      vm._vnode.parent = parentVnode;\n    }\n    vm.$options._renderChildren = renderChildren;\n\n    // update $attrs and $listeners hash\n    // these are also reactive so they may trigger child update if the child\n    // used them during render\n    vm.$attrs = parentVnode.data.attrs || emptyObject;\n    vm.$listeners = listeners || emptyObject;\n\n    // update props\n    if (propsData && vm.$options.props) {\n      toggleObserving(false);\n      var props = vm._props;\n      var propKeys = vm.$options._propKeys || [];\n      for (var i = 0; i < propKeys.length; i++) {\n        var key = propKeys[i];\n        var propOptions = vm.$options.props; // wtf flow?\n        props[key] = validateProp(key, propOptions, propsData, vm);\n      }\n      toggleObserving(true);\n      // keep a copy of raw propsData\n      vm.$options.propsData = propsData;\n    }\n\n    // update listeners\n    listeners = listeners || emptyObject;\n    var oldListeners = vm.$options._parentListeners;\n    vm.$options._parentListeners = listeners;\n    updateComponentListeners(vm, listeners, oldListeners);\n\n    // resolve slots + force update if has children\n    if (needsForceUpdate) {\n      vm.$slots = resolveSlots(renderChildren, parentVnode.context);\n      vm.$forceUpdate();\n    }\n\n    {\n      isUpdatingChildComponent = false;\n    }\n  }\n\n  function isInInactiveTree (vm) {\n    while (vm && (vm = vm.$parent)) {\n      if (vm._inactive) { return true }\n    }\n    return false\n  }\n\n  function activateChildComponent (vm, direct) {\n    if (direct) {\n      vm._directInactive = false;\n      if (isInInactiveTree(vm)) {\n        return\n      }\n    } else if (vm._directInactive) {\n      return\n    }\n    if (vm._inactive || vm._inactive === null) {\n      vm._inactive = false;\n      for (var i = 0; i < vm.$children.length; i++) {\n        activateChildComponent(vm.$children[i]);\n      }\n      callHook(vm, 'activated');\n    }\n  }\n\n  function deactivateChildComponent (vm, direct) {\n    if (direct) {\n      vm._directInactive = true;\n      if (isInInactiveTree(vm)) {\n        return\n      }\n    }\n    if (!vm._inactive) {\n      vm._inactive = true;\n      for (var i = 0; i < vm.$children.length; i++) {\n        deactivateChildComponent(vm.$children[i]);\n      }\n      callHook(vm, 'deactivated');\n    }\n  }\n\n  function callHook (vm, hook) {\n    // #7573 disable dep collection when invoking lifecycle hooks\n    pushTarget();\n    var handlers = vm.$options[hook];\n    var info = hook + \" hook\";\n    if (handlers) {\n      for (var i = 0, j = handlers.length; i < j; i++) {\n        invokeWithErrorHandling(handlers[i], vm, null, vm, info);\n      }\n    }\n    if (vm._hasHookEvent) {\n      vm.$emit('hook:' + hook);\n    }\n    popTarget();\n  }\n\n  /*  */\n\n  var MAX_UPDATE_COUNT = 100;\n\n  var queue = [];\n  var activatedChildren = [];\n  var has = {};\n  var circular = {};\n  var waiting = false;\n  var flushing = false;\n  var index = 0;\n\n  /**\n   * Reset the scheduler's state.\n   */\n  function resetSchedulerState () {\n    index = queue.length = activatedChildren.length = 0;\n    has = {};\n    {\n      circular = {};\n    }\n    waiting = flushing = false;\n  }\n\n  // Async edge case #6566 requires saving the timestamp when event listeners are\n  // attached. However, calling performance.now() has a perf overhead especially\n  // if the page has thousands of event listeners. Instead, we take a timestamp\n  // every time the scheduler flushes and use that for all event listeners\n  // attached during that flush.\n  var currentFlushTimestamp = 0;\n\n  // Async edge case fix requires storing an event listener's attach timestamp.\n  var getNow = Date.now;\n\n  // Determine what event timestamp the browser is using. Annoyingly, the\n  // timestamp can either be hi-res (relative to page load) or low-res\n  // (relative to UNIX epoch), so in order to compare time we have to use the\n  // same timestamp type when saving the flush timestamp.\n  if (inBrowser && getNow() > document.createEvent('Event').timeStamp) {\n    // if the low-res timestamp which is bigger than the event timestamp\n    // (which is evaluated AFTER) it means the event is using a hi-res timestamp,\n    // and we need to use the hi-res version for event listeners as well.\n    getNow = function () { return performance.now(); };\n  }\n\n  /**\n   * Flush both queues and run the watchers.\n   */\n  function flushSchedulerQueue () {\n    currentFlushTimestamp = getNow();\n    flushing = true;\n    var watcher, id;\n\n    // Sort queue before flush.\n    // This ensures that:\n    // 1. Components are updated from parent to child. (because parent is always\n    //    created before the child)\n    // 2. A component's user watchers are run before its render watcher (because\n    //    user watchers are created before the render watcher)\n    // 3. If a component is destroyed during a parent component's watcher run,\n    //    its watchers can be skipped.\n    queue.sort(function (a, b) { return a.id - b.id; });\n\n    // do not cache length because more watchers might be pushed\n    // as we run existing watchers\n    for (index = 0; index < queue.length; index++) {\n      watcher = queue[index];\n      if (watcher.before) {\n        watcher.before();\n      }\n      id = watcher.id;\n      has[id] = null;\n      watcher.run();\n      // in dev build, check and stop circular updates.\n      if (has[id] != null) {\n        circular[id] = (circular[id] || 0) + 1;\n        if (circular[id] > MAX_UPDATE_COUNT) {\n          warn(\n            'You may have an infinite update loop ' + (\n              watcher.user\n                ? (\"in watcher with expression \\\"\" + (watcher.expression) + \"\\\"\")\n                : \"in a component render function.\"\n            ),\n            watcher.vm\n          );\n          break\n        }\n      }\n    }\n\n    // keep copies of post queues before resetting state\n    var activatedQueue = activatedChildren.slice();\n    var updatedQueue = queue.slice();\n\n    resetSchedulerState();\n\n    // call component updated and activated hooks\n    callActivatedHooks(activatedQueue);\n    callUpdatedHooks(updatedQueue);\n\n    // devtool hook\n    /* istanbul ignore if */\n    if (devtools && config.devtools) {\n      devtools.emit('flush');\n    }\n  }\n\n  function callUpdatedHooks (queue) {\n    var i = queue.length;\n    while (i--) {\n      var watcher = queue[i];\n      var vm = watcher.vm;\n      if (vm._watcher === watcher && vm._isMounted && !vm._isDestroyed) {\n        callHook(vm, 'updated');\n      }\n    }\n  }\n\n  /**\n   * Queue a kept-alive component that was activated during patch.\n   * The queue will be processed after the entire tree has been patched.\n   */\n  function queueActivatedComponent (vm) {\n    // setting _inactive to false here so that a render function can\n    // rely on checking whether it's in an inactive tree (e.g. router-view)\n    vm._inactive = false;\n    activatedChildren.push(vm);\n  }\n\n  function callActivatedHooks (queue) {\n    for (var i = 0; i < queue.length; i++) {\n      queue[i]._inactive = true;\n      activateChildComponent(queue[i], true /* true */);\n    }\n  }\n\n  /**\n   * Push a watcher into the watcher queue.\n   * Jobs with duplicate IDs will be skipped unless it's\n   * pushed when the queue is being flushed.\n   */\n  function queueWatcher (watcher) {\n    var id = watcher.id;\n    if (has[id] == null) {\n      has[id] = true;\n      if (!flushing) {\n        queue.push(watcher);\n      } else {\n        // if already flushing, splice the watcher based on its id\n        // if already past its id, it will be run next immediately.\n        var i = queue.length - 1;\n        while (i > index && queue[i].id > watcher.id) {\n          i--;\n        }\n        queue.splice(i + 1, 0, watcher);\n      }\n      // queue the flush\n      if (!waiting) {\n        waiting = true;\n\n        if (!config.async) {\n          flushSchedulerQueue();\n          return\n        }\n        nextTick(flushSchedulerQueue);\n      }\n    }\n  }\n\n  /*  */\n\n\n\n  var uid$2 = 0;\n\n  /**\n   * A watcher parses an expression, collects dependencies,\n   * and fires callback when the expression value changes.\n   * This is used for both the $watch() api and directives.\n   */\n  var Watcher = function Watcher (\n    vm,\n    expOrFn,\n    cb,\n    options,\n    isRenderWatcher\n  ) {\n    this.vm = vm;\n    if (isRenderWatcher) {\n      vm._watcher = this;\n    }\n    vm._watchers.push(this);\n    // options\n    if (options) {\n      this.deep = !!options.deep;\n      this.user = !!options.user;\n      this.lazy = !!options.lazy;\n      this.sync = !!options.sync;\n      this.before = options.before;\n    } else {\n      this.deep = this.user = this.lazy = this.sync = false;\n    }\n    this.cb = cb;\n    this.id = ++uid$2; // uid for batching\n    this.active = true;\n    this.dirty = this.lazy; // for lazy watchers\n    this.deps = [];\n    this.newDeps = [];\n    this.depIds = new _Set();\n    this.newDepIds = new _Set();\n    this.expression = expOrFn.toString();\n    // parse expression for getter\n    if (typeof expOrFn === 'function') {\n      this.getter = expOrFn;\n    } else {\n      this.getter = parsePath(expOrFn);\n      if (!this.getter) {\n        this.getter = noop;\n        warn(\n          \"Failed watching path: \\\"\" + expOrFn + \"\\\" \" +\n          'Watcher only accepts simple dot-delimited paths. ' +\n          'For full control, use a function instead.',\n          vm\n        );\n      }\n    }\n    this.value = this.lazy\n      ? undefined\n      : this.get();\n  };\n\n  /**\n   * Evaluate the getter, and re-collect dependencies.\n   */\n  Watcher.prototype.get = function get () {\n    pushTarget(this);\n    var value;\n    var vm = this.vm;\n    try {\n      value = this.getter.call(vm, vm);\n    } catch (e) {\n      if (this.user) {\n        handleError(e, vm, (\"getter for watcher \\\"\" + (this.expression) + \"\\\"\"));\n      } else {\n        throw e\n      }\n    } finally {\n      // \"touch\" every property so they are all tracked as\n      // dependencies for deep watching\n      if (this.deep) {\n        traverse(value);\n      }\n      popTarget();\n      this.cleanupDeps();\n    }\n    return value\n  };\n\n  /**\n   * Add a dependency to this directive.\n   */\n  Watcher.prototype.addDep = function addDep (dep) {\n    var id = dep.id;\n    if (!this.newDepIds.has(id)) {\n      this.newDepIds.add(id);\n      this.newDeps.push(dep);\n      if (!this.depIds.has(id)) {\n        dep.addSub(this);\n      }\n    }\n  };\n\n  /**\n   * Clean up for dependency collection.\n   */\n  Watcher.prototype.cleanupDeps = function cleanupDeps () {\n    var i = this.deps.length;\n    while (i--) {\n      var dep = this.deps[i];\n      if (!this.newDepIds.has(dep.id)) {\n        dep.removeSub(this);\n      }\n    }\n    var tmp = this.depIds;\n    this.depIds = this.newDepIds;\n    this.newDepIds = tmp;\n    this.newDepIds.clear();\n    tmp = this.deps;\n    this.deps = this.newDeps;\n    this.newDeps = tmp;\n    this.newDeps.length = 0;\n  };\n\n  /**\n   * Subscriber interface.\n   * Will be called when a dependency changes.\n   */\n  Watcher.prototype.update = function update () {\n    /* istanbul ignore else */\n    if (this.lazy) {\n      this.dirty = true;\n    } else if (this.sync) {\n      this.run();\n    } else {\n      queueWatcher(this);\n    }\n  };\n\n  /**\n   * Scheduler job interface.\n   * Will be called by the scheduler.\n   */\n  Watcher.prototype.run = function run () {\n    if (this.active) {\n      var value = this.get();\n      if (\n        value !== this.value ||\n        // Deep watchers and watchers on Object/Arrays should fire even\n        // when the value is the same, because the value may\n        // have mutated.\n        isObject(value) ||\n        this.deep\n      ) {\n        // set new value\n        var oldValue = this.value;\n        this.value = value;\n        if (this.user) {\n          try {\n            this.cb.call(this.vm, value, oldValue);\n          } catch (e) {\n            handleError(e, this.vm, (\"callback for watcher \\\"\" + (this.expression) + \"\\\"\"));\n          }\n        } else {\n          this.cb.call(this.vm, value, oldValue);\n        }\n      }\n    }\n  };\n\n  /**\n   * Evaluate the value of the watcher.\n   * This only gets called for lazy watchers.\n   */\n  Watcher.prototype.evaluate = function evaluate () {\n    this.value = this.get();\n    this.dirty = false;\n  };\n\n  /**\n   * Depend on all deps collected by this watcher.\n   */\n  Watcher.prototype.depend = function depend () {\n    var i = this.deps.length;\n    while (i--) {\n      this.deps[i].depend();\n    }\n  };\n\n  /**\n   * Remove self from all dependencies' subscriber list.\n   */\n  Watcher.prototype.teardown = function teardown () {\n    if (this.active) {\n      // remove self from vm's watcher list\n      // this is a somewhat expensive operation so we skip it\n      // if the vm is being destroyed.\n      if (!this.vm._isBeingDestroyed) {\n        remove(this.vm._watchers, this);\n      }\n      var i = this.deps.length;\n      while (i--) {\n        this.deps[i].removeSub(this);\n      }\n      this.active = false;\n    }\n  };\n\n  /*  */\n\n  var sharedPropertyDefinition = {\n    enumerable: true,\n    configurable: true,\n    get: noop,\n    set: noop\n  };\n\n  function proxy (target, sourceKey, key) {\n    sharedPropertyDefinition.get = function proxyGetter () {\n      return this[sourceKey][key]\n    };\n    sharedPropertyDefinition.set = function proxySetter (val) {\n      this[sourceKey][key] = val;\n    };\n    Object.defineProperty(target, key, sharedPropertyDefinition);\n  }\n\n  function initState (vm) {\n    vm._watchers = [];\n    var opts = vm.$options;\n    if (opts.props) { initProps(vm, opts.props); }\n    if (opts.methods) { initMethods(vm, opts.methods); }\n    if (opts.data) {\n      initData(vm);\n    } else {\n      observe(vm._data = {}, true /* asRootData */);\n    }\n    if (opts.computed) { initComputed(vm, opts.computed); }\n    if (opts.watch && opts.watch !== nativeWatch) {\n      initWatch(vm, opts.watch);\n    }\n  }\n\n  function initProps (vm, propsOptions) {\n    var propsData = vm.$options.propsData || {};\n    var props = vm._props = {};\n    // cache prop keys so that future props updates can iterate using Array\n    // instead of dynamic object key enumeration.\n    var keys = vm.$options._propKeys = [];\n    var isRoot = !vm.$parent;\n    // root instance props should be converted\n    if (!isRoot) {\n      toggleObserving(false);\n    }\n    var loop = function ( key ) {\n      keys.push(key);\n      var value = validateProp(key, propsOptions, propsData, vm);\n      /* istanbul ignore else */\n      {\n        var hyphenatedKey = hyphenate(key);\n        if (isReservedAttribute(hyphenatedKey) ||\n            config.isReservedAttr(hyphenatedKey)) {\n          warn(\n            (\"\\\"\" + hyphenatedKey + \"\\\" is a reserved attribute and cannot be used as component prop.\"),\n            vm\n          );\n        }\n        defineReactive$$1(props, key, value, function () {\n          if (!isRoot && !isUpdatingChildComponent) {\n            warn(\n              \"Avoid mutating a prop directly since the value will be \" +\n              \"overwritten whenever the parent component re-renders. \" +\n              \"Instead, use a data or computed property based on the prop's \" +\n              \"value. Prop being mutated: \\\"\" + key + \"\\\"\",\n              vm\n            );\n          }\n        });\n      }\n      // static props are already proxied on the component's prototype\n      // during Vue.extend(). We only need to proxy props defined at\n      // instantiation here.\n      if (!(key in vm)) {\n        proxy(vm, \"_props\", key);\n      }\n    };\n\n    for (var key in propsOptions) loop( key );\n    toggleObserving(true);\n  }\n\n  function initData (vm) {\n    var data = vm.$options.data;\n    data = vm._data = typeof data === 'function'\n      ? getData(data, vm)\n      : data || {};\n    if (!isPlainObject(data)) {\n      data = {};\n      warn(\n        'data functions should return an object:\\n' +\n        'https://vuejs.org/v2/guide/components.html#data-Must-Be-a-Function',\n        vm\n      );\n    }\n    // proxy data on instance\n    var keys = Object.keys(data);\n    var props = vm.$options.props;\n    var methods = vm.$options.methods;\n    var i = keys.length;\n    while (i--) {\n      var key = keys[i];\n      {\n        if (methods && hasOwn(methods, key)) {\n          warn(\n            (\"Method \\\"\" + key + \"\\\" has already been defined as a data property.\"),\n            vm\n          );\n        }\n      }\n      if (props && hasOwn(props, key)) {\n        warn(\n          \"The data property \\\"\" + key + \"\\\" is already declared as a prop. \" +\n          \"Use prop default value instead.\",\n          vm\n        );\n      } else if (!isReserved(key)) {\n        proxy(vm, \"_data\", key);\n      }\n    }\n    // observe data\n    observe(data, true /* asRootData */);\n  }\n\n  function getData (data, vm) {\n    // #7573 disable dep collection when invoking data getters\n    pushTarget();\n    try {\n      return data.call(vm, vm)\n    } catch (e) {\n      handleError(e, vm, \"data()\");\n      return {}\n    } finally {\n      popTarget();\n    }\n  }\n\n  var computedWatcherOptions = { lazy: true };\n\n  function initComputed (vm, computed) {\n    // $flow-disable-line\n    var watchers = vm._computedWatchers = Object.create(null);\n    // computed properties are just getters during SSR\n    var isSSR = isServerRendering();\n\n    for (var key in computed) {\n      var userDef = computed[key];\n      var getter = typeof userDef === 'function' ? userDef : userDef.get;\n      if (getter == null) {\n        warn(\n          (\"Getter is missing for computed property \\\"\" + key + \"\\\".\"),\n          vm\n        );\n      }\n\n      if (!isSSR) {\n        // create internal watcher for the computed property.\n        watchers[key] = new Watcher(\n          vm,\n          getter || noop,\n          noop,\n          computedWatcherOptions\n        );\n      }\n\n      // component-defined computed properties are already defined on the\n      // component prototype. We only need to define computed properties defined\n      // at instantiation here.\n      if (!(key in vm)) {\n        defineComputed(vm, key, userDef);\n      } else {\n        if (key in vm.$data) {\n          warn((\"The computed property \\\"\" + key + \"\\\" is already defined in data.\"), vm);\n        } else if (vm.$options.props && key in vm.$options.props) {\n          warn((\"The computed property \\\"\" + key + \"\\\" is already defined as a prop.\"), vm);\n        }\n      }\n    }\n  }\n\n  function defineComputed (\n    target,\n    key,\n    userDef\n  ) {\n    var shouldCache = !isServerRendering();\n    if (typeof userDef === 'function') {\n      sharedPropertyDefinition.get = shouldCache\n        ? createComputedGetter(key)\n        : createGetterInvoker(userDef);\n      sharedPropertyDefinition.set = noop;\n    } else {\n      sharedPropertyDefinition.get = userDef.get\n        ? shouldCache && userDef.cache !== false\n          ? createComputedGetter(key)\n          : createGetterInvoker(userDef.get)\n        : noop;\n      sharedPropertyDefinition.set = userDef.set || noop;\n    }\n    if (sharedPropertyDefinition.set === noop) {\n      sharedPropertyDefinition.set = function () {\n        warn(\n          (\"Computed property \\\"\" + key + \"\\\" was assigned to but it has no setter.\"),\n          this\n        );\n      };\n    }\n    Object.defineProperty(target, key, sharedPropertyDefinition);\n  }\n\n  function createComputedGetter (key) {\n    return function computedGetter () {\n      var watcher = this._computedWatchers && this._computedWatchers[key];\n      if (watcher) {\n        if (watcher.dirty) {\n          watcher.evaluate();\n        }\n        if (Dep.target) {\n          watcher.depend();\n        }\n        return watcher.value\n      }\n    }\n  }\n\n  function createGetterInvoker(fn) {\n    return function computedGetter () {\n      return fn.call(this, this)\n    }\n  }\n\n  function initMethods (vm, methods) {\n    var props = vm.$options.props;\n    for (var key in methods) {\n      {\n        if (typeof methods[key] !== 'function') {\n          warn(\n            \"Method \\\"\" + key + \"\\\" has type \\\"\" + (typeof methods[key]) + \"\\\" in the component definition. \" +\n            \"Did you reference the function correctly?\",\n            vm\n          );\n        }\n        if (props && hasOwn(props, key)) {\n          warn(\n            (\"Method \\\"\" + key + \"\\\" has already been defined as a prop.\"),\n            vm\n          );\n        }\n        if ((key in vm) && isReserved(key)) {\n          warn(\n            \"Method \\\"\" + key + \"\\\" conflicts with an existing Vue instance method. \" +\n            \"Avoid defining component methods that start with _ or $.\"\n          );\n        }\n      }\n      vm[key] = typeof methods[key] !== 'function' ? noop : bind(methods[key], vm);\n    }\n  }\n\n  function initWatch (vm, watch) {\n    for (var key in watch) {\n      var handler = watch[key];\n      if (Array.isArray(handler)) {\n        for (var i = 0; i < handler.length; i++) {\n          createWatcher(vm, key, handler[i]);\n        }\n      } else {\n        createWatcher(vm, key, handler);\n      }\n    }\n  }\n\n  function createWatcher (\n    vm,\n    expOrFn,\n    handler,\n    options\n  ) {\n    if (isPlainObject(handler)) {\n      options = handler;\n      handler = handler.handler;\n    }\n    if (typeof handler === 'string') {\n      handler = vm[handler];\n    }\n    return vm.$watch(expOrFn, handler, options)\n  }\n\n  function stateMixin (Vue) {\n    // flow somehow has problems with directly declared definition object\n    // when using Object.defineProperty, so we have to procedurally build up\n    // the object here.\n    var dataDef = {};\n    dataDef.get = function () { return this._data };\n    var propsDef = {};\n    propsDef.get = function () { return this._props };\n    {\n      dataDef.set = function () {\n        warn(\n          'Avoid replacing instance root $data. ' +\n          'Use nested data properties instead.',\n          this\n        );\n      };\n      propsDef.set = function () {\n        warn(\"$props is readonly.\", this);\n      };\n    }\n    Object.defineProperty(Vue.prototype, '$data', dataDef);\n    Object.defineProperty(Vue.prototype, '$props', propsDef);\n\n    Vue.prototype.$set = set;\n    Vue.prototype.$delete = del;\n\n    Vue.prototype.$watch = function (\n      expOrFn,\n      cb,\n      options\n    ) {\n      var vm = this;\n      if (isPlainObject(cb)) {\n        return createWatcher(vm, expOrFn, cb, options)\n      }\n      options = options || {};\n      options.user = true;\n      var watcher = new Watcher(vm, expOrFn, cb, options);\n      if (options.immediate) {\n        try {\n          cb.call(vm, watcher.value);\n        } catch (error) {\n          handleError(error, vm, (\"callback for immediate watcher \\\"\" + (watcher.expression) + \"\\\"\"));\n        }\n      }\n      return function unwatchFn () {\n        watcher.teardown();\n      }\n    };\n  }\n\n  /*  */\n\n  var uid$3 = 0;\n\n  function initMixin (Vue) {\n    Vue.prototype._init = function (options) {\n      var vm = this;\n      // a uid\n      vm._uid = uid$3++;\n\n      var startTag, endTag;\n      /* istanbul ignore if */\n      if (config.performance && mark) {\n        startTag = \"vue-perf-start:\" + (vm._uid);\n        endTag = \"vue-perf-end:\" + (vm._uid);\n        mark(startTag);\n      }\n\n      // a flag to avoid this being observed\n      vm._isVue = true;\n      // merge options\n      if (options && options._isComponent) {\n        // optimize internal component instantiation\n        // since dynamic options merging is pretty slow, and none of the\n        // internal component options needs special treatment.\n        initInternalComponent(vm, options);\n      } else {\n        vm.$options = mergeOptions(\n          resolveConstructorOptions(vm.constructor),\n          options || {},\n          vm\n        );\n      }\n      /* istanbul ignore else */\n      {\n        initProxy(vm);\n      }\n      // expose real self\n      vm._self = vm;\n      initLifecycle(vm);\n      initEvents(vm);\n      initRender(vm);\n      callHook(vm, 'beforeCreate');\n      initInjections(vm); // resolve injections before data/props\n      initState(vm);\n      initProvide(vm); // resolve provide after data/props\n      callHook(vm, 'created');\n\n      /* istanbul ignore if */\n      if (config.performance && mark) {\n        vm._name = formatComponentName(vm, false);\n        mark(endTag);\n        measure((\"vue \" + (vm._name) + \" init\"), startTag, endTag);\n      }\n\n      if (vm.$options.el) {\n        vm.$mount(vm.$options.el);\n      }\n    };\n  }\n\n  function initInternalComponent (vm, options) {\n    var opts = vm.$options = Object.create(vm.constructor.options);\n    // doing this because it's faster than dynamic enumeration.\n    var parentVnode = options._parentVnode;\n    opts.parent = options.parent;\n    opts._parentVnode = parentVnode;\n\n    var vnodeComponentOptions = parentVnode.componentOptions;\n    opts.propsData = vnodeComponentOptions.propsData;\n    opts._parentListeners = vnodeComponentOptions.listeners;\n    opts._renderChildren = vnodeComponentOptions.children;\n    opts._componentTag = vnodeComponentOptions.tag;\n\n    if (options.render) {\n      opts.render = options.render;\n      opts.staticRenderFns = options.staticRenderFns;\n    }\n  }\n\n  function resolveConstructorOptions (Ctor) {\n    var options = Ctor.options;\n    if (Ctor.super) {\n      var superOptions = resolveConstructorOptions(Ctor.super);\n      var cachedSuperOptions = Ctor.superOptions;\n      if (superOptions !== cachedSuperOptions) {\n        // super option changed,\n        // need to resolve new options.\n        Ctor.superOptions = superOptions;\n        // check if there are any late-modified/attached options (#4976)\n        var modifiedOptions = resolveModifiedOptions(Ctor);\n        // update base extend options\n        if (modifiedOptions) {\n          extend(Ctor.extendOptions, modifiedOptions);\n        }\n        options = Ctor.options = mergeOptions(superOptions, Ctor.extendOptions);\n        if (options.name) {\n          options.components[options.name] = Ctor;\n        }\n      }\n    }\n    return options\n  }\n\n  function resolveModifiedOptions (Ctor) {\n    var modified;\n    var latest = Ctor.options;\n    var sealed = Ctor.sealedOptions;\n    for (var key in latest) {\n      if (latest[key] !== sealed[key]) {\n        if (!modified) { modified = {}; }\n        modified[key] = latest[key];\n      }\n    }\n    return modified\n  }\n\n  function Vue (options) {\n    if (!(this instanceof Vue)\n    ) {\n      warn('Vue is a constructor and should be called with the `new` keyword');\n    }\n    this._init(options);\n  }\n\n  initMixin(Vue);\n  stateMixin(Vue);\n  eventsMixin(Vue);\n  lifecycleMixin(Vue);\n  renderMixin(Vue);\n\n  /*  */\n\n  function initUse (Vue) {\n    Vue.use = function (plugin) {\n      var installedPlugins = (this._installedPlugins || (this._installedPlugins = []));\n      if (installedPlugins.indexOf(plugin) > -1) {\n        return this\n      }\n\n      // additional parameters\n      var args = toArray(arguments, 1);\n      args.unshift(this);\n      if (typeof plugin.install === 'function') {\n        plugin.install.apply(plugin, args);\n      } else if (typeof plugin === 'function') {\n        plugin.apply(null, args);\n      }\n      installedPlugins.push(plugin);\n      return this\n    };\n  }\n\n  /*  */\n\n  function initMixin$1 (Vue) {\n    Vue.mixin = function (mixin) {\n      this.options = mergeOptions(this.options, mixin);\n      return this\n    };\n  }\n\n  /*  */\n\n  function initExtend (Vue) {\n    /**\n     * Each instance constructor, including Vue, has a unique\n     * cid. This enables us to create wrapped \"child\n     * constructors\" for prototypal inheritance and cache them.\n     */\n    Vue.cid = 0;\n    var cid = 1;\n\n    /**\n     * Class inheritance\n     */\n    Vue.extend = function (extendOptions) {\n      extendOptions = extendOptions || {};\n      var Super = this;\n      var SuperId = Super.cid;\n      var cachedCtors = extendOptions._Ctor || (extendOptions._Ctor = {});\n      if (cachedCtors[SuperId]) {\n        return cachedCtors[SuperId]\n      }\n\n      var name = extendOptions.name || Super.options.name;\n      if (name) {\n        validateComponentName(name);\n      }\n\n      var Sub = function VueComponent (options) {\n        this._init(options);\n      };\n      Sub.prototype = Object.create(Super.prototype);\n      Sub.prototype.constructor = Sub;\n      Sub.cid = cid++;\n      Sub.options = mergeOptions(\n        Super.options,\n        extendOptions\n      );\n      Sub['super'] = Super;\n\n      // For props and computed properties, we define the proxy getters on\n      // the Vue instances at extension time, on the extended prototype. This\n      // avoids Object.defineProperty calls for each instance created.\n      if (Sub.options.props) {\n        initProps$1(Sub);\n      }\n      if (Sub.options.computed) {\n        initComputed$1(Sub);\n      }\n\n      // allow further extension/mixin/plugin usage\n      Sub.extend = Super.extend;\n      Sub.mixin = Super.mixin;\n      Sub.use = Super.use;\n\n      // create asset registers, so extended classes\n      // can have their private assets too.\n      ASSET_TYPES.forEach(function (type) {\n        Sub[type] = Super[type];\n      });\n      // enable recursive self-lookup\n      if (name) {\n        Sub.options.components[name] = Sub;\n      }\n\n      // keep a reference to the super options at extension time.\n      // later at instantiation we can check if Super's options have\n      // been updated.\n      Sub.superOptions = Super.options;\n      Sub.extendOptions = extendOptions;\n      Sub.sealedOptions = extend({}, Sub.options);\n\n      // cache constructor\n      cachedCtors[SuperId] = Sub;\n      return Sub\n    };\n  }\n\n  function initProps$1 (Comp) {\n    var props = Comp.options.props;\n    for (var key in props) {\n      proxy(Comp.prototype, \"_props\", key);\n    }\n  }\n\n  function initComputed$1 (Comp) {\n    var computed = Comp.options.computed;\n    for (var key in computed) {\n      defineComputed(Comp.prototype, key, computed[key]);\n    }\n  }\n\n  /*  */\n\n  function initAssetRegisters (Vue) {\n    /**\n     * Create asset registration methods.\n     */\n    ASSET_TYPES.forEach(function (type) {\n      Vue[type] = function (\n        id,\n        definition\n      ) {\n        if (!definition) {\n          return this.options[type + 's'][id]\n        } else {\n          /* istanbul ignore if */\n          if (type === 'component') {\n            validateComponentName(id);\n          }\n          if (type === 'component' && isPlainObject(definition)) {\n            definition.name = definition.name || id;\n            definition = this.options._base.extend(definition);\n          }\n          if (type === 'directive' && typeof definition === 'function') {\n            definition = { bind: definition, update: definition };\n          }\n          this.options[type + 's'][id] = definition;\n          return definition\n        }\n      };\n    });\n  }\n\n  /*  */\n\n\n\n  function getComponentName (opts) {\n    return opts && (opts.Ctor.options.name || opts.tag)\n  }\n\n  function matches (pattern, name) {\n    if (Array.isArray(pattern)) {\n      return pattern.indexOf(name) > -1\n    } else if (typeof pattern === 'string') {\n      return pattern.split(',').indexOf(name) > -1\n    } else if (isRegExp(pattern)) {\n      return pattern.test(name)\n    }\n    /* istanbul ignore next */\n    return false\n  }\n\n  function pruneCache (keepAliveInstance, filter) {\n    var cache = keepAliveInstance.cache;\n    var keys = keepAliveInstance.keys;\n    var _vnode = keepAliveInstance._vnode;\n    for (var key in cache) {\n      var cachedNode = cache[key];\n      if (cachedNode) {\n        var name = getComponentName(cachedNode.componentOptions);\n        if (name && !filter(name)) {\n          pruneCacheEntry(cache, key, keys, _vnode);\n        }\n      }\n    }\n  }\n\n  function pruneCacheEntry (\n    cache,\n    key,\n    keys,\n    current\n  ) {\n    var cached$$1 = cache[key];\n    if (cached$$1 && (!current || cached$$1.tag !== current.tag)) {\n      cached$$1.componentInstance.$destroy();\n    }\n    cache[key] = null;\n    remove(keys, key);\n  }\n\n  var patternTypes = [String, RegExp, Array];\n\n  var KeepAlive = {\n    name: 'keep-alive',\n    abstract: true,\n\n    props: {\n      include: patternTypes,\n      exclude: patternTypes,\n      max: [String, Number]\n    },\n\n    created: function created () {\n      this.cache = Object.create(null);\n      this.keys = [];\n    },\n\n    destroyed: function destroyed () {\n      for (var key in this.cache) {\n        pruneCacheEntry(this.cache, key, this.keys);\n      }\n    },\n\n    mounted: function mounted () {\n      var this$1 = this;\n\n      this.$watch('include', function (val) {\n        pruneCache(this$1, function (name) { return matches(val, name); });\n      });\n      this.$watch('exclude', function (val) {\n        pruneCache(this$1, function (name) { return !matches(val, name); });\n      });\n    },\n\n    render: function render () {\n      var slot = this.$slots.default;\n      var vnode = getFirstComponentChild(slot);\n      var componentOptions = vnode && vnode.componentOptions;\n      if (componentOptions) {\n        // check pattern\n        var name = getComponentName(componentOptions);\n        var ref = this;\n        var include = ref.include;\n        var exclude = ref.exclude;\n        if (\n          // not included\n          (include && (!name || !matches(include, name))) ||\n          // excluded\n          (exclude && name && matches(exclude, name))\n        ) {\n          return vnode\n        }\n\n        var ref$1 = this;\n        var cache = ref$1.cache;\n        var keys = ref$1.keys;\n        var key = vnode.key == null\n          // same constructor may get registered as different local components\n          // so cid alone is not enough (#3269)\n          ? componentOptions.Ctor.cid + (componentOptions.tag ? (\"::\" + (componentOptions.tag)) : '')\n          : vnode.key;\n        if (cache[key]) {\n          vnode.componentInstance = cache[key].componentInstance;\n          // make current key freshest\n          remove(keys, key);\n          keys.push(key);\n        } else {\n          cache[key] = vnode;\n          keys.push(key);\n          // prune oldest entry\n          if (this.max && keys.length > parseInt(this.max)) {\n            pruneCacheEntry(cache, keys[0], keys, this._vnode);\n          }\n        }\n\n        vnode.data.keepAlive = true;\n      }\n      return vnode || (slot && slot[0])\n    }\n  };\n\n  var builtInComponents = {\n    KeepAlive: KeepAlive\n  };\n\n  /*  */\n\n  function initGlobalAPI (Vue) {\n    // config\n    var configDef = {};\n    configDef.get = function () { return config; };\n    {\n      configDef.set = function () {\n        warn(\n          'Do not replace the Vue.config object, set individual fields instead.'\n        );\n      };\n    }\n    Object.defineProperty(Vue, 'config', configDef);\n\n    // exposed util methods.\n    // NOTE: these are not considered part of the public API - avoid relying on\n    // them unless you are aware of the risk.\n    Vue.util = {\n      warn: warn,\n      extend: extend,\n      mergeOptions: mergeOptions,\n      defineReactive: defineReactive$$1\n    };\n\n    Vue.set = set;\n    Vue.delete = del;\n    Vue.nextTick = nextTick;\n\n    // 2.6 explicit observable API\n    Vue.observable = function (obj) {\n      observe(obj);\n      return obj\n    };\n\n    Vue.options = Object.create(null);\n    ASSET_TYPES.forEach(function (type) {\n      Vue.options[type + 's'] = Object.create(null);\n    });\n\n    // this is used to identify the \"base\" constructor to extend all plain-object\n    // components with in Weex's multi-instance scenarios.\n    Vue.options._base = Vue;\n\n    extend(Vue.options.components, builtInComponents);\n\n    initUse(Vue);\n    initMixin$1(Vue);\n    initExtend(Vue);\n    initAssetRegisters(Vue);\n  }\n\n  initGlobalAPI(Vue);\n\n  Object.defineProperty(Vue.prototype, '$isServer', {\n    get: isServerRendering\n  });\n\n  Object.defineProperty(Vue.prototype, '$ssrContext', {\n    get: function get () {\n      /* istanbul ignore next */\n      return this.$vnode && this.$vnode.ssrContext\n    }\n  });\n\n  // expose FunctionalRenderContext for ssr runtime helper installation\n  Object.defineProperty(Vue, 'FunctionalRenderContext', {\n    value: FunctionalRenderContext\n  });\n\n  Vue.version = '2.6.7';\n\n  /*  */\n\n  // these are reserved for web because they are directly compiled away\n  // during template compilation\n  var isReservedAttr = makeMap('style,class');\n\n  // attributes that should be using props for binding\n  var acceptValue = makeMap('input,textarea,option,select,progress');\n  var mustUseProp = function (tag, type, attr) {\n    return (\n      (attr === 'value' && acceptValue(tag)) && type !== 'button' ||\n      (attr === 'selected' && tag === 'option') ||\n      (attr === 'checked' && tag === 'input') ||\n      (attr === 'muted' && tag === 'video')\n    )\n  };\n\n  var isEnumeratedAttr = makeMap('contenteditable,draggable,spellcheck');\n\n  var isValidContentEditableValue = makeMap('events,caret,typing,plaintext-only');\n\n  var convertEnumeratedValue = function (key, value) {\n    return isFalsyAttrValue(value) || value === 'false'\n      ? 'false'\n      // allow arbitrary string value for contenteditable\n      : key === 'contenteditable' && isValidContentEditableValue(value)\n        ? value\n        : 'true'\n  };\n\n  var isBooleanAttr = makeMap(\n    'allowfullscreen,async,autofocus,autoplay,checked,compact,controls,declare,' +\n    'default,defaultchecked,defaultmuted,defaultselected,defer,disabled,' +\n    'enabled,formnovalidate,hidden,indeterminate,inert,ismap,itemscope,loop,multiple,' +\n    'muted,nohref,noresize,noshade,novalidate,nowrap,open,pauseonexit,readonly,' +\n    'required,reversed,scoped,seamless,selected,sortable,translate,' +\n    'truespeed,typemustmatch,visible'\n  );\n\n  var xlinkNS = 'http://www.w3.org/1999/xlink';\n\n  var isXlink = function (name) {\n    return name.charAt(5) === ':' && name.slice(0, 5) === 'xlink'\n  };\n\n  var getXlinkProp = function (name) {\n    return isXlink(name) ? name.slice(6, name.length) : ''\n  };\n\n  var isFalsyAttrValue = function (val) {\n    return val == null || val === false\n  };\n\n  /*  */\n\n  function genClassForVnode (vnode) {\n    var data = vnode.data;\n    var parentNode = vnode;\n    var childNode = vnode;\n    while (isDef(childNode.componentInstance)) {\n      childNode = childNode.componentInstance._vnode;\n      if (childNode && childNode.data) {\n        data = mergeClassData(childNode.data, data);\n      }\n    }\n    while (isDef(parentNode = parentNode.parent)) {\n      if (parentNode && parentNode.data) {\n        data = mergeClassData(data, parentNode.data);\n      }\n    }\n    return renderClass(data.staticClass, data.class)\n  }\n\n  function mergeClassData (child, parent) {\n    return {\n      staticClass: concat(child.staticClass, parent.staticClass),\n      class: isDef(child.class)\n        ? [child.class, parent.class]\n        : parent.class\n    }\n  }\n\n  function renderClass (\n    staticClass,\n    dynamicClass\n  ) {\n    if (isDef(staticClass) || isDef(dynamicClass)) {\n      return concat(staticClass, stringifyClass(dynamicClass))\n    }\n    /* istanbul ignore next */\n    return ''\n  }\n\n  function concat (a, b) {\n    return a ? b ? (a + ' ' + b) : a : (b || '')\n  }\n\n  function stringifyClass (value) {\n    if (Array.isArray(value)) {\n      return stringifyArray(value)\n    }\n    if (isObject(value)) {\n      return stringifyObject(value)\n    }\n    if (typeof value === 'string') {\n      return value\n    }\n    /* istanbul ignore next */\n    return ''\n  }\n\n  function stringifyArray (value) {\n    var res = '';\n    var stringified;\n    for (var i = 0, l = value.length; i < l; i++) {\n      if (isDef(stringified = stringifyClass(value[i])) && stringified !== '') {\n        if (res) { res += ' '; }\n        res += stringified;\n      }\n    }\n    return res\n  }\n\n  function stringifyObject (value) {\n    var res = '';\n    for (var key in value) {\n      if (value[key]) {\n        if (res) { res += ' '; }\n        res += key;\n      }\n    }\n    return res\n  }\n\n  /*  */\n\n  var namespaceMap = {\n    svg: 'http://www.w3.org/2000/svg',\n    math: 'http://www.w3.org/1998/Math/MathML'\n  };\n\n  var isHTMLTag = makeMap(\n    'html,body,base,head,link,meta,style,title,' +\n    'address,article,aside,footer,header,h1,h2,h3,h4,h5,h6,hgroup,nav,section,' +\n    'div,dd,dl,dt,figcaption,figure,picture,hr,img,li,main,ol,p,pre,ul,' +\n    'a,b,abbr,bdi,bdo,br,cite,code,data,dfn,em,i,kbd,mark,q,rp,rt,rtc,ruby,' +\n    's,samp,small,span,strong,sub,sup,time,u,var,wbr,area,audio,map,track,video,' +\n    'embed,object,param,source,canvas,script,noscript,del,ins,' +\n    'caption,col,colgroup,table,thead,tbody,td,th,tr,' +\n    'button,datalist,fieldset,form,input,label,legend,meter,optgroup,option,' +\n    'output,progress,select,textarea,' +\n    'details,dialog,menu,menuitem,summary,' +\n    'content,element,shadow,template,blockquote,iframe,tfoot'\n  );\n\n  // this map is intentionally selective, only covering SVG elements that may\n  // contain child elements.\n  var isSVG = makeMap(\n    'svg,animate,circle,clippath,cursor,defs,desc,ellipse,filter,font-face,' +\n    'foreignObject,g,glyph,image,line,marker,mask,missing-glyph,path,pattern,' +\n    'polygon,polyline,rect,switch,symbol,text,textpath,tspan,use,view',\n    true\n  );\n\n  var isPreTag = function (tag) { return tag === 'pre'; };\n\n  var isReservedTag = function (tag) {\n    return isHTMLTag(tag) || isSVG(tag)\n  };\n\n  function getTagNamespace (tag) {\n    if (isSVG(tag)) {\n      return 'svg'\n    }\n    // basic support for MathML\n    // note it doesn't support other MathML elements being component roots\n    if (tag === 'math') {\n      return 'math'\n    }\n  }\n\n  var unknownElementCache = Object.create(null);\n  function isUnknownElement (tag) {\n    /* istanbul ignore if */\n    if (!inBrowser) {\n      return true\n    }\n    if (isReservedTag(tag)) {\n      return false\n    }\n    tag = tag.toLowerCase();\n    /* istanbul ignore if */\n    if (unknownElementCache[tag] != null) {\n      return unknownElementCache[tag]\n    }\n    var el = document.createElement(tag);\n    if (tag.indexOf('-') > -1) {\n      // http://stackoverflow.com/a/28210364/1070244\n      return (unknownElementCache[tag] = (\n        el.constructor === window.HTMLUnknownElement ||\n        el.constructor === window.HTMLElement\n      ))\n    } else {\n      return (unknownElementCache[tag] = /HTMLUnknownElement/.test(el.toString()))\n    }\n  }\n\n  var isTextInputType = makeMap('text,number,password,search,email,tel,url');\n\n  /*  */\n\n  /**\n   * Query an element selector if it's not an element already.\n   */\n  function query (el) {\n    if (typeof el === 'string') {\n      var selected = document.querySelector(el);\n      if (!selected) {\n        warn(\n          'Cannot find element: ' + el\n        );\n        return document.createElement('div')\n      }\n      return selected\n    } else {\n      return el\n    }\n  }\n\n  /*  */\n\n  function createElement$1 (tagName, vnode) {\n    var elm = document.createElement(tagName);\n    if (tagName !== 'select') {\n      return elm\n    }\n    // false or null will remove the attribute but undefined will not\n    if (vnode.data && vnode.data.attrs && vnode.data.attrs.multiple !== undefined) {\n      elm.setAttribute('multiple', 'multiple');\n    }\n    return elm\n  }\n\n  function createElementNS (namespace, tagName) {\n    return document.createElementNS(namespaceMap[namespace], tagName)\n  }\n\n  function createTextNode (text) {\n    return document.createTextNode(text)\n  }\n\n  function createComment (text) {\n    return document.createComment(text)\n  }\n\n  function insertBefore (parentNode, newNode, referenceNode) {\n    parentNode.insertBefore(newNode, referenceNode);\n  }\n\n  function removeChild (node, child) {\n    node.removeChild(child);\n  }\n\n  function appendChild (node, child) {\n    node.appendChild(child);\n  }\n\n  function parentNode (node) {\n    return node.parentNode\n  }\n\n  function nextSibling (node) {\n    return node.nextSibling\n  }\n\n  function tagName (node) {\n    return node.tagName\n  }\n\n  function setTextContent (node, text) {\n    node.textContent = text;\n  }\n\n  function setStyleScope (node, scopeId) {\n    node.setAttribute(scopeId, '');\n  }\n\n  var nodeOps = /*#__PURE__*/Object.freeze({\n    createElement: createElement$1,\n    createElementNS: createElementNS,\n    createTextNode: createTextNode,\n    createComment: createComment,\n    insertBefore: insertBefore,\n    removeChild: removeChild,\n    appendChild: appendChild,\n    parentNode: parentNode,\n    nextSibling: nextSibling,\n    tagName: tagName,\n    setTextContent: setTextContent,\n    setStyleScope: setStyleScope\n  });\n\n  /*  */\n\n  var ref = {\n    create: function create (_, vnode) {\n      registerRef(vnode);\n    },\n    update: function update (oldVnode, vnode) {\n      if (oldVnode.data.ref !== vnode.data.ref) {\n        registerRef(oldVnode, true);\n        registerRef(vnode);\n      }\n    },\n    destroy: function destroy (vnode) {\n      registerRef(vnode, true);\n    }\n  };\n\n  function registerRef (vnode, isRemoval) {\n    var key = vnode.data.ref;\n    if (!isDef(key)) { return }\n\n    var vm = vnode.context;\n    var ref = vnode.componentInstance || vnode.elm;\n    var refs = vm.$refs;\n    if (isRemoval) {\n      if (Array.isArray(refs[key])) {\n        remove(refs[key], ref);\n      } else if (refs[key] === ref) {\n        refs[key] = undefined;\n      }\n    } else {\n      if (vnode.data.refInFor) {\n        if (!Array.isArray(refs[key])) {\n          refs[key] = [ref];\n        } else if (refs[key].indexOf(ref) < 0) {\n          // $flow-disable-line\n          refs[key].push(ref);\n        }\n      } else {\n        refs[key] = ref;\n      }\n    }\n  }\n\n  /**\n   * Virtual DOM patching algorithm based on Snabbdom by\n   * Simon Friis Vindum (@paldepind)\n   * Licensed under the MIT License\n   * https://github.com/paldepind/snabbdom/blob/master/LICENSE\n   *\n   * modified by Evan You (@yyx990803)\n   *\n   * Not type-checking this because this file is perf-critical and the cost\n   * of making flow understand it is not worth it.\n   */\n\n  var emptyNode = new VNode('', {}, []);\n\n  var hooks = ['create', 'activate', 'update', 'remove', 'destroy'];\n\n  function sameVnode (a, b) {\n    return (\n      a.key === b.key && (\n        (\n          a.tag === b.tag &&\n          a.isComment === b.isComment &&\n          isDef(a.data) === isDef(b.data) &&\n          sameInputType(a, b)\n        ) || (\n          isTrue(a.isAsyncPlaceholder) &&\n          a.asyncFactory === b.asyncFactory &&\n          isUndef(b.asyncFactory.error)\n        )\n      )\n    )\n  }\n\n  function sameInputType (a, b) {\n    if (a.tag !== 'input') { return true }\n    var i;\n    var typeA = isDef(i = a.data) && isDef(i = i.attrs) && i.type;\n    var typeB = isDef(i = b.data) && isDef(i = i.attrs) && i.type;\n    return typeA === typeB || isTextInputType(typeA) && isTextInputType(typeB)\n  }\n\n  function createKeyToOldIdx (children, beginIdx, endIdx) {\n    var i, key;\n    var map = {};\n    for (i = beginIdx; i <= endIdx; ++i) {\n      key = children[i].key;\n      if (isDef(key)) { map[key] = i; }\n    }\n    return map\n  }\n\n  function createPatchFunction (backend) {\n    var i, j;\n    var cbs = {};\n\n    var modules = backend.modules;\n    var nodeOps = backend.nodeOps;\n\n    for (i = 0; i < hooks.length; ++i) {\n      cbs[hooks[i]] = [];\n      for (j = 0; j < modules.length; ++j) {\n        if (isDef(modules[j][hooks[i]])) {\n          cbs[hooks[i]].push(modules[j][hooks[i]]);\n        }\n      }\n    }\n\n    function emptyNodeAt (elm) {\n      return new VNode(nodeOps.tagName(elm).toLowerCase(), {}, [], undefined, elm)\n    }\n\n    function createRmCb (childElm, listeners) {\n      function remove$$1 () {\n        if (--remove$$1.listeners === 0) {\n          removeNode(childElm);\n        }\n      }\n      remove$$1.listeners = listeners;\n      return remove$$1\n    }\n\n    function removeNode (el) {\n      var parent = nodeOps.parentNode(el);\n      // element may have already been removed due to v-html / v-text\n      if (isDef(parent)) {\n        nodeOps.removeChild(parent, el);\n      }\n    }\n\n    function isUnknownElement$$1 (vnode, inVPre) {\n      return (\n        !inVPre &&\n        !vnode.ns &&\n        !(\n          config.ignoredElements.length &&\n          config.ignoredElements.some(function (ignore) {\n            return isRegExp(ignore)\n              ? ignore.test(vnode.tag)\n              : ignore === vnode.tag\n          })\n        ) &&\n        config.isUnknownElement(vnode.tag)\n      )\n    }\n\n    var creatingElmInVPre = 0;\n\n    function createElm (\n      vnode,\n      insertedVnodeQueue,\n      parentElm,\n      refElm,\n      nested,\n      ownerArray,\n      index\n    ) {\n      if (isDef(vnode.elm) && isDef(ownerArray)) {\n        // This vnode was used in a previous render!\n        // now it's used as a new node, overwriting its elm would cause\n        // potential patch errors down the road when it's used as an insertion\n        // reference node. Instead, we clone the node on-demand before creating\n        // associated DOM element for it.\n        vnode = ownerArray[index] = cloneVNode(vnode);\n      }\n\n      vnode.isRootInsert = !nested; // for transition enter check\n      if (createComponent(vnode, insertedVnodeQueue, parentElm, refElm)) {\n        return\n      }\n\n      var data = vnode.data;\n      var children = vnode.children;\n      var tag = vnode.tag;\n      if (isDef(tag)) {\n        {\n          if (data && data.pre) {\n            creatingElmInVPre++;\n          }\n          if (isUnknownElement$$1(vnode, creatingElmInVPre)) {\n            warn(\n              'Unknown custom element: <' + tag + '> - did you ' +\n              'register the component correctly? For recursive components, ' +\n              'make sure to provide the \"name\" option.',\n              vnode.context\n            );\n          }\n        }\n\n        vnode.elm = vnode.ns\n          ? nodeOps.createElementNS(vnode.ns, tag)\n          : nodeOps.createElement(tag, vnode);\n        setScope(vnode);\n\n        /* istanbul ignore if */\n        {\n          createChildren(vnode, children, insertedVnodeQueue);\n          if (isDef(data)) {\n            invokeCreateHooks(vnode, insertedVnodeQueue);\n          }\n          insert(parentElm, vnode.elm, refElm);\n        }\n\n        if (data && data.pre) {\n          creatingElmInVPre--;\n        }\n      } else if (isTrue(vnode.isComment)) {\n        vnode.elm = nodeOps.createComment(vnode.text);\n        insert(parentElm, vnode.elm, refElm);\n      } else {\n        vnode.elm = nodeOps.createTextNode(vnode.text);\n        insert(parentElm, vnode.elm, refElm);\n      }\n    }\n\n    function createComponent (vnode, insertedVnodeQueue, parentElm, refElm) {\n      var i = vnode.data;\n      if (isDef(i)) {\n        var isReactivated = isDef(vnode.componentInstance) && i.keepAlive;\n        if (isDef(i = i.hook) && isDef(i = i.init)) {\n          i(vnode, false /* hydrating */);\n        }\n        // after calling the init hook, if the vnode is a child component\n        // it should've created a child instance and mounted it. the child\n        // component also has set the placeholder vnode's elm.\n        // in that case we can just return the element and be done.\n        if (isDef(vnode.componentInstance)) {\n          initComponent(vnode, insertedVnodeQueue);\n          insert(parentElm, vnode.elm, refElm);\n          if (isTrue(isReactivated)) {\n            reactivateComponent(vnode, insertedVnodeQueue, parentElm, refElm);\n          }\n          return true\n        }\n      }\n    }\n\n    function initComponent (vnode, insertedVnodeQueue) {\n      if (isDef(vnode.data.pendingInsert)) {\n        insertedVnodeQueue.push.apply(insertedVnodeQueue, vnode.data.pendingInsert);\n        vnode.data.pendingInsert = null;\n      }\n      vnode.elm = vnode.componentInstance.$el;\n      if (isPatchable(vnode)) {\n        invokeCreateHooks(vnode, insertedVnodeQueue);\n        setScope(vnode);\n      } else {\n        // empty component root.\n        // skip all element-related modules except for ref (#3455)\n        registerRef(vnode);\n        // make sure to invoke the insert hook\n        insertedVnodeQueue.push(vnode);\n      }\n    }\n\n    function reactivateComponent (vnode, insertedVnodeQueue, parentElm, refElm) {\n      var i;\n      // hack for #4339: a reactivated component with inner transition\n      // does not trigger because the inner node's created hooks are not called\n      // again. It's not ideal to involve module-specific logic in here but\n      // there doesn't seem to be a better way to do it.\n      var innerNode = vnode;\n      while (innerNode.componentInstance) {\n        innerNode = innerNode.componentInstance._vnode;\n        if (isDef(i = innerNode.data) && isDef(i = i.transition)) {\n          for (i = 0; i < cbs.activate.length; ++i) {\n            cbs.activate[i](emptyNode, innerNode);\n          }\n          insertedVnodeQueue.push(innerNode);\n          break\n        }\n      }\n      // unlike a newly created component,\n      // a reactivated keep-alive component doesn't insert itself\n      insert(parentElm, vnode.elm, refElm);\n    }\n\n    function insert (parent, elm, ref$$1) {\n      if (isDef(parent)) {\n        if (isDef(ref$$1)) {\n          if (nodeOps.parentNode(ref$$1) === parent) {\n            nodeOps.insertBefore(parent, elm, ref$$1);\n          }\n        } else {\n          nodeOps.appendChild(parent, elm);\n        }\n      }\n    }\n\n    function createChildren (vnode, children, insertedVnodeQueue) {\n      if (Array.isArray(children)) {\n        {\n          checkDuplicateKeys(children);\n        }\n        for (var i = 0; i < children.length; ++i) {\n          createElm(children[i], insertedVnodeQueue, vnode.elm, null, true, children, i);\n        }\n      } else if (isPrimitive(vnode.text)) {\n        nodeOps.appendChild(vnode.elm, nodeOps.createTextNode(String(vnode.text)));\n      }\n    }\n\n    function isPatchable (vnode) {\n      while (vnode.componentInstance) {\n        vnode = vnode.componentInstance._vnode;\n      }\n      return isDef(vnode.tag)\n    }\n\n    function invokeCreateHooks (vnode, insertedVnodeQueue) {\n      for (var i$1 = 0; i$1 < cbs.create.length; ++i$1) {\n        cbs.create[i$1](emptyNode, vnode);\n      }\n      i = vnode.data.hook; // Reuse variable\n      if (isDef(i)) {\n        if (isDef(i.create)) { i.create(emptyNode, vnode); }\n        if (isDef(i.insert)) { insertedVnodeQueue.push(vnode); }\n      }\n    }\n\n    // set scope id attribute for scoped CSS.\n    // this is implemented as a special case to avoid the overhead\n    // of going through the normal attribute patching process.\n    function setScope (vnode) {\n      var i;\n      if (isDef(i = vnode.fnScopeId)) {\n        nodeOps.setStyleScope(vnode.elm, i);\n      } else {\n        var ancestor = vnode;\n        while (ancestor) {\n          if (isDef(i = ancestor.context) && isDef(i = i.$options._scopeId)) {\n            nodeOps.setStyleScope(vnode.elm, i);\n          }\n          ancestor = ancestor.parent;\n        }\n      }\n      // for slot content they should also get the scopeId from the host instance.\n      if (isDef(i = activeInstance) &&\n        i !== vnode.context &&\n        i !== vnode.fnContext &&\n        isDef(i = i.$options._scopeId)\n      ) {\n        nodeOps.setStyleScope(vnode.elm, i);\n      }\n    }\n\n    function addVnodes (parentElm, refElm, vnodes, startIdx, endIdx, insertedVnodeQueue) {\n      for (; startIdx <= endIdx; ++startIdx) {\n        createElm(vnodes[startIdx], insertedVnodeQueue, parentElm, refElm, false, vnodes, startIdx);\n      }\n    }\n\n    function invokeDestroyHook (vnode) {\n      var i, j;\n      var data = vnode.data;\n      if (isDef(data)) {\n        if (isDef(i = data.hook) && isDef(i = i.destroy)) { i(vnode); }\n        for (i = 0; i < cbs.destroy.length; ++i) { cbs.destroy[i](vnode); }\n      }\n      if (isDef(i = vnode.children)) {\n        for (j = 0; j < vnode.children.length; ++j) {\n          invokeDestroyHook(vnode.children[j]);\n        }\n      }\n    }\n\n    function removeVnodes (parentElm, vnodes, startIdx, endIdx) {\n      for (; startIdx <= endIdx; ++startIdx) {\n        var ch = vnodes[startIdx];\n        if (isDef(ch)) {\n          if (isDef(ch.tag)) {\n            removeAndInvokeRemoveHook(ch);\n            invokeDestroyHook(ch);\n          } else { // Text node\n            removeNode(ch.elm);\n          }\n        }\n      }\n    }\n\n    function removeAndInvokeRemoveHook (vnode, rm) {\n      if (isDef(rm) || isDef(vnode.data)) {\n        var i;\n        var listeners = cbs.remove.length + 1;\n        if (isDef(rm)) {\n          // we have a recursively passed down rm callback\n          // increase the listeners count\n          rm.listeners += listeners;\n        } else {\n          // directly removing\n          rm = createRmCb(vnode.elm, listeners);\n        }\n        // recursively invoke hooks on child component root node\n        if (isDef(i = vnode.componentInstance) && isDef(i = i._vnode) && isDef(i.data)) {\n          removeAndInvokeRemoveHook(i, rm);\n        }\n        for (i = 0; i < cbs.remove.length; ++i) {\n          cbs.remove[i](vnode, rm);\n        }\n        if (isDef(i = vnode.data.hook) && isDef(i = i.remove)) {\n          i(vnode, rm);\n        } else {\n          rm();\n        }\n      } else {\n        removeNode(vnode.elm);\n      }\n    }\n\n    function updateChildren (parentElm, oldCh, newCh, insertedVnodeQueue, removeOnly) {\n      var oldStartIdx = 0;\n      var newStartIdx = 0;\n      var oldEndIdx = oldCh.length - 1;\n      var oldStartVnode = oldCh[0];\n      var oldEndVnode = oldCh[oldEndIdx];\n      var newEndIdx = newCh.length - 1;\n      var newStartVnode = newCh[0];\n      var newEndVnode = newCh[newEndIdx];\n      var oldKeyToIdx, idxInOld, vnodeToMove, refElm;\n\n      // removeOnly is a special flag used only by <transition-group>\n      // to ensure removed elements stay in correct relative positions\n      // during leaving transitions\n      var canMove = !removeOnly;\n\n      {\n        checkDuplicateKeys(newCh);\n      }\n\n      while (oldStartIdx <= oldEndIdx && newStartIdx <= newEndIdx) {\n        if (isUndef(oldStartVnode)) {\n          oldStartVnode = oldCh[++oldStartIdx]; // Vnode has been moved left\n        } else if (isUndef(oldEndVnode)) {\n          oldEndVnode = oldCh[--oldEndIdx];\n        } else if (sameVnode(oldStartVnode, newStartVnode)) {\n          patchVnode(oldStartVnode, newStartVnode, insertedVnodeQueue, newCh, newStartIdx);\n          oldStartVnode = oldCh[++oldStartIdx];\n          newStartVnode = newCh[++newStartIdx];\n        } else if (sameVnode(oldEndVnode, newEndVnode)) {\n          patchVnode(oldEndVnode, newEndVnode, insertedVnodeQueue, newCh, newEndIdx);\n          oldEndVnode = oldCh[--oldEndIdx];\n          newEndVnode = newCh[--newEndIdx];\n        } else if (sameVnode(oldStartVnode, newEndVnode)) { // Vnode moved right\n          patchVnode(oldStartVnode, newEndVnode, insertedVnodeQueue, newCh, newEndIdx);\n          canMove && nodeOps.insertBefore(parentElm, oldStartVnode.elm, nodeOps.nextSibling(oldEndVnode.elm));\n          oldStartVnode = oldCh[++oldStartIdx];\n          newEndVnode = newCh[--newEndIdx];\n        } else if (sameVnode(oldEndVnode, newStartVnode)) { // Vnode moved left\n          patchVnode(oldEndVnode, newStartVnode, insertedVnodeQueue, newCh, newStartIdx);\n          canMove && nodeOps.insertBefore(parentElm, oldEndVnode.elm, oldStartVnode.elm);\n          oldEndVnode = oldCh[--oldEndIdx];\n          newStartVnode = newCh[++newStartIdx];\n        } else {\n          if (isUndef(oldKeyToIdx)) { oldKeyToIdx = createKeyToOldIdx(oldCh, oldStartIdx, oldEndIdx); }\n          idxInOld = isDef(newStartVnode.key)\n            ? oldKeyToIdx[newStartVnode.key]\n            : findIdxInOld(newStartVnode, oldCh, oldStartIdx, oldEndIdx);\n          if (isUndef(idxInOld)) { // New element\n            createElm(newStartVnode, insertedVnodeQueue, parentElm, oldStartVnode.elm, false, newCh, newStartIdx);\n          } else {\n            vnodeToMove = oldCh[idxInOld];\n            if (sameVnode(vnodeToMove, newStartVnode)) {\n              patchVnode(vnodeToMove, newStartVnode, insertedVnodeQueue, newCh, newStartIdx);\n              oldCh[idxInOld] = undefined;\n              canMove && nodeOps.insertBefore(parentElm, vnodeToMove.elm, oldStartVnode.elm);\n            } else {\n              // same key but different element. treat as new element\n              createElm(newStartVnode, insertedVnodeQueue, parentElm, oldStartVnode.elm, false, newCh, newStartIdx);\n            }\n          }\n          newStartVnode = newCh[++newStartIdx];\n        }\n      }\n      if (oldStartIdx > oldEndIdx) {\n        refElm = isUndef(newCh[newEndIdx + 1]) ? null : newCh[newEndIdx + 1].elm;\n        addVnodes(parentElm, refElm, newCh, newStartIdx, newEndIdx, insertedVnodeQueue);\n      } else if (newStartIdx > newEndIdx) {\n        removeVnodes(parentElm, oldCh, oldStartIdx, oldEndIdx);\n      }\n    }\n\n    function checkDuplicateKeys (children) {\n      var seenKeys = {};\n      for (var i = 0; i < children.length; i++) {\n        var vnode = children[i];\n        var key = vnode.key;\n        if (isDef(key)) {\n          if (seenKeys[key]) {\n            warn(\n              (\"Duplicate keys detected: '\" + key + \"'. This may cause an update error.\"),\n              vnode.context\n            );\n          } else {\n            seenKeys[key] = true;\n          }\n        }\n      }\n    }\n\n    function findIdxInOld (node, oldCh, start, end) {\n      for (var i = start; i < end; i++) {\n        var c = oldCh[i];\n        if (isDef(c) && sameVnode(node, c)) { return i }\n      }\n    }\n\n    function patchVnode (\n      oldVnode,\n      vnode,\n      insertedVnodeQueue,\n      ownerArray,\n      index,\n      removeOnly\n    ) {\n      if (oldVnode === vnode) {\n        return\n      }\n\n      if (isDef(vnode.elm) && isDef(ownerArray)) {\n        // clone reused vnode\n        vnode = ownerArray[index] = cloneVNode(vnode);\n      }\n\n      var elm = vnode.elm = oldVnode.elm;\n\n      if (isTrue(oldVnode.isAsyncPlaceholder)) {\n        if (isDef(vnode.asyncFactory.resolved)) {\n          hydrate(oldVnode.elm, vnode, insertedVnodeQueue);\n        } else {\n          vnode.isAsyncPlaceholder = true;\n        }\n        return\n      }\n\n      // reuse element for static trees.\n      // note we only do this if the vnode is cloned -\n      // if the new node is not cloned it means the render functions have been\n      // reset by the hot-reload-api and we need to do a proper re-render.\n      if (isTrue(vnode.isStatic) &&\n        isTrue(oldVnode.isStatic) &&\n        vnode.key === oldVnode.key &&\n        (isTrue(vnode.isCloned) || isTrue(vnode.isOnce))\n      ) {\n        vnode.componentInstance = oldVnode.componentInstance;\n        return\n      }\n\n      var i;\n      var data = vnode.data;\n      if (isDef(data) && isDef(i = data.hook) && isDef(i = i.prepatch)) {\n        i(oldVnode, vnode);\n      }\n\n      var oldCh = oldVnode.children;\n      var ch = vnode.children;\n      if (isDef(data) && isPatchable(vnode)) {\n        for (i = 0; i < cbs.update.length; ++i) { cbs.update[i](oldVnode, vnode); }\n        if (isDef(i = data.hook) && isDef(i = i.update)) { i(oldVnode, vnode); }\n      }\n      if (isUndef(vnode.text)) {\n        if (isDef(oldCh) && isDef(ch)) {\n          if (oldCh !== ch) { updateChildren(elm, oldCh, ch, insertedVnodeQueue, removeOnly); }\n        } else if (isDef(ch)) {\n          {\n            checkDuplicateKeys(ch);\n          }\n          if (isDef(oldVnode.text)) { nodeOps.setTextContent(elm, ''); }\n          addVnodes(elm, null, ch, 0, ch.length - 1, insertedVnodeQueue);\n        } else if (isDef(oldCh)) {\n          removeVnodes(elm, oldCh, 0, oldCh.length - 1);\n        } else if (isDef(oldVnode.text)) {\n          nodeOps.setTextContent(elm, '');\n        }\n      } else if (oldVnode.text !== vnode.text) {\n        nodeOps.setTextContent(elm, vnode.text);\n      }\n      if (isDef(data)) {\n        if (isDef(i = data.hook) && isDef(i = i.postpatch)) { i(oldVnode, vnode); }\n      }\n    }\n\n    function invokeInsertHook (vnode, queue, initial) {\n      // delay insert hooks for component root nodes, invoke them after the\n      // element is really inserted\n      if (isTrue(initial) && isDef(vnode.parent)) {\n        vnode.parent.data.pendingInsert = queue;\n      } else {\n        for (var i = 0; i < queue.length; ++i) {\n          queue[i].data.hook.insert(queue[i]);\n        }\n      }\n    }\n\n    var hydrationBailed = false;\n    // list of modules that can skip create hook during hydration because they\n    // are already rendered on the client or has no need for initialization\n    // Note: style is excluded because it relies on initial clone for future\n    // deep updates (#7063).\n    var isRenderedModule = makeMap('attrs,class,staticClass,staticStyle,key');\n\n    // Note: this is a browser-only function so we can assume elms are DOM nodes.\n    function hydrate (elm, vnode, insertedVnodeQueue, inVPre) {\n      var i;\n      var tag = vnode.tag;\n      var data = vnode.data;\n      var children = vnode.children;\n      inVPre = inVPre || (data && data.pre);\n      vnode.elm = elm;\n\n      if (isTrue(vnode.isComment) && isDef(vnode.asyncFactory)) {\n        vnode.isAsyncPlaceholder = true;\n        return true\n      }\n      // assert node match\n      {\n        if (!assertNodeMatch(elm, vnode, inVPre)) {\n          return false\n        }\n      }\n      if (isDef(data)) {\n        if (isDef(i = data.hook) && isDef(i = i.init)) { i(vnode, true /* hydrating */); }\n        if (isDef(i = vnode.componentInstance)) {\n          // child component. it should have hydrated its own tree.\n          initComponent(vnode, insertedVnodeQueue);\n          return true\n        }\n      }\n      if (isDef(tag)) {\n        if (isDef(children)) {\n          // empty element, allow client to pick up and populate children\n          if (!elm.hasChildNodes()) {\n            createChildren(vnode, children, insertedVnodeQueue);\n          } else {\n            // v-html and domProps: innerHTML\n            if (isDef(i = data) && isDef(i = i.domProps) && isDef(i = i.innerHTML)) {\n              if (i !== elm.innerHTML) {\n                /* istanbul ignore if */\n                if (typeof console !== 'undefined' &&\n                  !hydrationBailed\n                ) {\n                  hydrationBailed = true;\n                  console.warn('Parent: ', elm);\n                  console.warn('server innerHTML: ', i);\n                  console.warn('client innerHTML: ', elm.innerHTML);\n                }\n                return false\n              }\n            } else {\n              // iterate and compare children lists\n              var childrenMatch = true;\n              var childNode = elm.firstChild;\n              for (var i$1 = 0; i$1 < children.length; i$1++) {\n                if (!childNode || !hydrate(childNode, children[i$1], insertedVnodeQueue, inVPre)) {\n                  childrenMatch = false;\n                  break\n                }\n                childNode = childNode.nextSibling;\n              }\n              // if childNode is not null, it means the actual childNodes list is\n              // longer than the virtual children list.\n              if (!childrenMatch || childNode) {\n                /* istanbul ignore if */\n                if (typeof console !== 'undefined' &&\n                  !hydrationBailed\n                ) {\n                  hydrationBailed = true;\n                  console.warn('Parent: ', elm);\n                  console.warn('Mismatching childNodes vs. VNodes: ', elm.childNodes, children);\n                }\n                return false\n              }\n            }\n          }\n        }\n        if (isDef(data)) {\n          var fullInvoke = false;\n          for (var key in data) {\n            if (!isRenderedModule(key)) {\n              fullInvoke = true;\n              invokeCreateHooks(vnode, insertedVnodeQueue);\n              break\n            }\n          }\n          if (!fullInvoke && data['class']) {\n            // ensure collecting deps for deep class bindings for future updates\n            traverse(data['class']);\n          }\n        }\n      } else if (elm.data !== vnode.text) {\n        elm.data = vnode.text;\n      }\n      return true\n    }\n\n    function assertNodeMatch (node, vnode, inVPre) {\n      if (isDef(vnode.tag)) {\n        return vnode.tag.indexOf('vue-component') === 0 || (\n          !isUnknownElement$$1(vnode, inVPre) &&\n          vnode.tag.toLowerCase() === (node.tagName && node.tagName.toLowerCase())\n        )\n      } else {\n        return node.nodeType === (vnode.isComment ? 8 : 3)\n      }\n    }\n\n    return function patch (oldVnode, vnode, hydrating, removeOnly) {\n      if (isUndef(vnode)) {\n        if (isDef(oldVnode)) { invokeDestroyHook(oldVnode); }\n        return\n      }\n\n      var isInitialPatch = false;\n      var insertedVnodeQueue = [];\n\n      if (isUndef(oldVnode)) {\n        // empty mount (likely as component), create new root element\n        isInitialPatch = true;\n        createElm(vnode, insertedVnodeQueue);\n      } else {\n        var isRealElement = isDef(oldVnode.nodeType);\n        if (!isRealElement && sameVnode(oldVnode, vnode)) {\n          // patch existing root node\n          patchVnode(oldVnode, vnode, insertedVnodeQueue, null, null, removeOnly);\n        } else {\n          if (isRealElement) {\n            // mounting to a real element\n            // check if this is server-rendered content and if we can perform\n            // a successful hydration.\n            if (oldVnode.nodeType === 1 && oldVnode.hasAttribute(SSR_ATTR)) {\n              oldVnode.removeAttribute(SSR_ATTR);\n              hydrating = true;\n            }\n            if (isTrue(hydrating)) {\n              if (hydrate(oldVnode, vnode, insertedVnodeQueue)) {\n                invokeInsertHook(vnode, insertedVnodeQueue, true);\n                return oldVnode\n              } else {\n                warn(\n                  'The client-side rendered virtual DOM tree is not matching ' +\n                  'server-rendered content. This is likely caused by incorrect ' +\n                  'HTML markup, for example nesting block-level elements inside ' +\n                  '<p>, or missing <tbody>. Bailing hydration and performing ' +\n                  'full client-side render.'\n                );\n              }\n            }\n            // either not server-rendered, or hydration failed.\n            // create an empty node and replace it\n            oldVnode = emptyNodeAt(oldVnode);\n          }\n\n          // replacing existing element\n          var oldElm = oldVnode.elm;\n          var parentElm = nodeOps.parentNode(oldElm);\n\n          // create new node\n          createElm(\n            vnode,\n            insertedVnodeQueue,\n            // extremely rare edge case: do not insert if old element is in a\n            // leaving transition. Only happens when combining transition +\n            // keep-alive + HOCs. (#4590)\n            oldElm._leaveCb ? null : parentElm,\n            nodeOps.nextSibling(oldElm)\n          );\n\n          // update parent placeholder node element, recursively\n          if (isDef(vnode.parent)) {\n            var ancestor = vnode.parent;\n            var patchable = isPatchable(vnode);\n            while (ancestor) {\n              for (var i = 0; i < cbs.destroy.length; ++i) {\n                cbs.destroy[i](ancestor);\n              }\n              ancestor.elm = vnode.elm;\n              if (patchable) {\n                for (var i$1 = 0; i$1 < cbs.create.length; ++i$1) {\n                  cbs.create[i$1](emptyNode, ancestor);\n                }\n                // #6513\n                // invoke insert hooks that may have been merged by create hooks.\n                // e.g. for directives that uses the \"inserted\" hook.\n                var insert = ancestor.data.hook.insert;\n                if (insert.merged) {\n                  // start at index 1 to avoid re-invoking component mounted hook\n                  for (var i$2 = 1; i$2 < insert.fns.length; i$2++) {\n                    insert.fns[i$2]();\n                  }\n                }\n              } else {\n                registerRef(ancestor);\n              }\n              ancestor = ancestor.parent;\n            }\n          }\n\n          // destroy old node\n          if (isDef(parentElm)) {\n            removeVnodes(parentElm, [oldVnode], 0, 0);\n          } else if (isDef(oldVnode.tag)) {\n            invokeDestroyHook(oldVnode);\n          }\n        }\n      }\n\n      invokeInsertHook(vnode, insertedVnodeQueue, isInitialPatch);\n      return vnode.elm\n    }\n  }\n\n  /*  */\n\n  var directives = {\n    create: updateDirectives,\n    update: updateDirectives,\n    destroy: function unbindDirectives (vnode) {\n      updateDirectives(vnode, emptyNode);\n    }\n  };\n\n  function updateDirectives (oldVnode, vnode) {\n    if (oldVnode.data.directives || vnode.data.directives) {\n      _update(oldVnode, vnode);\n    }\n  }\n\n  function _update (oldVnode, vnode) {\n    var isCreate = oldVnode === emptyNode;\n    var isDestroy = vnode === emptyNode;\n    var oldDirs = normalizeDirectives$1(oldVnode.data.directives, oldVnode.context);\n    var newDirs = normalizeDirectives$1(vnode.data.directives, vnode.context);\n\n    var dirsWithInsert = [];\n    var dirsWithPostpatch = [];\n\n    var key, oldDir, dir;\n    for (key in newDirs) {\n      oldDir = oldDirs[key];\n      dir = newDirs[key];\n      if (!oldDir) {\n        // new directive, bind\n        callHook$1(dir, 'bind', vnode, oldVnode);\n        if (dir.def && dir.def.inserted) {\n          dirsWithInsert.push(dir);\n        }\n      } else {\n        // existing directive, update\n        dir.oldValue = oldDir.value;\n        dir.oldArg = oldDir.arg;\n        callHook$1(dir, 'update', vnode, oldVnode);\n        if (dir.def && dir.def.componentUpdated) {\n          dirsWithPostpatch.push(dir);\n        }\n      }\n    }\n\n    if (dirsWithInsert.length) {\n      var callInsert = function () {\n        for (var i = 0; i < dirsWithInsert.length; i++) {\n          callHook$1(dirsWithInsert[i], 'inserted', vnode, oldVnode);\n        }\n      };\n      if (isCreate) {\n        mergeVNodeHook(vnode, 'insert', callInsert);\n      } else {\n        callInsert();\n      }\n    }\n\n    if (dirsWithPostpatch.length) {\n      mergeVNodeHook(vnode, 'postpatch', function () {\n        for (var i = 0; i < dirsWithPostpatch.length; i++) {\n          callHook$1(dirsWithPostpatch[i], 'componentUpdated', vnode, oldVnode);\n        }\n      });\n    }\n\n    if (!isCreate) {\n      for (key in oldDirs) {\n        if (!newDirs[key]) {\n          // no longer present, unbind\n          callHook$1(oldDirs[key], 'unbind', oldVnode, oldVnode, isDestroy);\n        }\n      }\n    }\n  }\n\n  var emptyModifiers = Object.create(null);\n\n  function normalizeDirectives$1 (\n    dirs,\n    vm\n  ) {\n    var res = Object.create(null);\n    if (!dirs) {\n      // $flow-disable-line\n      return res\n    }\n    var i, dir;\n    for (i = 0; i < dirs.length; i++) {\n      dir = dirs[i];\n      if (!dir.modifiers) {\n        // $flow-disable-line\n        dir.modifiers = emptyModifiers;\n      }\n      res[getRawDirName(dir)] = dir;\n      dir.def = resolveAsset(vm.$options, 'directives', dir.name, true);\n    }\n    // $flow-disable-line\n    return res\n  }\n\n  function getRawDirName (dir) {\n    return dir.rawName || ((dir.name) + \".\" + (Object.keys(dir.modifiers || {}).join('.')))\n  }\n\n  function callHook$1 (dir, hook, vnode, oldVnode, isDestroy) {\n    var fn = dir.def && dir.def[hook];\n    if (fn) {\n      try {\n        fn(vnode.elm, dir, vnode, oldVnode, isDestroy);\n      } catch (e) {\n        handleError(e, vnode.context, (\"directive \" + (dir.name) + \" \" + hook + \" hook\"));\n      }\n    }\n  }\n\n  var baseModules = [\n    ref,\n    directives\n  ];\n\n  /*  */\n\n  function updateAttrs (oldVnode, vnode) {\n    var opts = vnode.componentOptions;\n    if (isDef(opts) && opts.Ctor.options.inheritAttrs === false) {\n      return\n    }\n    if (isUndef(oldVnode.data.attrs) && isUndef(vnode.data.attrs)) {\n      return\n    }\n    var key, cur, old;\n    var elm = vnode.elm;\n    var oldAttrs = oldVnode.data.attrs || {};\n    var attrs = vnode.data.attrs || {};\n    // clone observed objects, as the user probably wants to mutate it\n    if (isDef(attrs.__ob__)) {\n      attrs = vnode.data.attrs = extend({}, attrs);\n    }\n\n    for (key in attrs) {\n      cur = attrs[key];\n      old = oldAttrs[key];\n      if (old !== cur) {\n        setAttr(elm, key, cur);\n      }\n    }\n    // #4391: in IE9, setting type can reset value for input[type=radio]\n    // #6666: IE/Edge forces progress value down to 1 before setting a max\n    /* istanbul ignore if */\n    if ((isIE || isEdge) && attrs.value !== oldAttrs.value) {\n      setAttr(elm, 'value', attrs.value);\n    }\n    for (key in oldAttrs) {\n      if (isUndef(attrs[key])) {\n        if (isXlink(key)) {\n          elm.removeAttributeNS(xlinkNS, getXlinkProp(key));\n        } else if (!isEnumeratedAttr(key)) {\n          elm.removeAttribute(key);\n        }\n      }\n    }\n  }\n\n  function setAttr (el, key, value) {\n    if (el.tagName.indexOf('-') > -1) {\n      baseSetAttr(el, key, value);\n    } else if (isBooleanAttr(key)) {\n      // set attribute for blank value\n      // e.g. <option disabled>Select one</option>\n      if (isFalsyAttrValue(value)) {\n        el.removeAttribute(key);\n      } else {\n        // technically allowfullscreen is a boolean attribute for <iframe>,\n        // but Flash expects a value of \"true\" when used on <embed> tag\n        value = key === 'allowfullscreen' && el.tagName === 'EMBED'\n          ? 'true'\n          : key;\n        el.setAttribute(key, value);\n      }\n    } else if (isEnumeratedAttr(key)) {\n      el.setAttribute(key, convertEnumeratedValue(key, value));\n    } else if (isXlink(key)) {\n      if (isFalsyAttrValue(value)) {\n        el.removeAttributeNS(xlinkNS, getXlinkProp(key));\n      } else {\n        el.setAttributeNS(xlinkNS, key, value);\n      }\n    } else {\n      baseSetAttr(el, key, value);\n    }\n  }\n\n  function baseSetAttr (el, key, value) {\n    if (isFalsyAttrValue(value)) {\n      el.removeAttribute(key);\n    } else {\n      // #7138: IE10 & 11 fires input event when setting placeholder on\n      // <textarea>... block the first input event and remove the blocker\n      // immediately.\n      /* istanbul ignore if */\n      if (\n        isIE && !isIE9 &&\n        el.tagName === 'TEXTAREA' &&\n        key === 'placeholder' && value !== '' && !el.__ieph\n      ) {\n        var blocker = function (e) {\n          e.stopImmediatePropagation();\n          el.removeEventListener('input', blocker);\n        };\n        el.addEventListener('input', blocker);\n        // $flow-disable-line\n        el.__ieph = true; /* IE placeholder patched */\n      }\n      el.setAttribute(key, value);\n    }\n  }\n\n  var attrs = {\n    create: updateAttrs,\n    update: updateAttrs\n  };\n\n  /*  */\n\n  function updateClass (oldVnode, vnode) {\n    var el = vnode.elm;\n    var data = vnode.data;\n    var oldData = oldVnode.data;\n    if (\n      isUndef(data.staticClass) &&\n      isUndef(data.class) && (\n        isUndef(oldData) || (\n          isUndef(oldData.staticClass) &&\n          isUndef(oldData.class)\n        )\n      )\n    ) {\n      return\n    }\n\n    var cls = genClassForVnode(vnode);\n\n    // handle transition classes\n    var transitionClass = el._transitionClasses;\n    if (isDef(transitionClass)) {\n      cls = concat(cls, stringifyClass(transitionClass));\n    }\n\n    // set the class\n    if (cls !== el._prevClass) {\n      el.setAttribute('class', cls);\n      el._prevClass = cls;\n    }\n  }\n\n  var klass = {\n    create: updateClass,\n    update: updateClass\n  };\n\n  /*  */\n\n  var validDivisionCharRE = /[\\w).+\\-_$\\]]/;\n\n  function parseFilters (exp) {\n    var inSingle = false;\n    var inDouble = false;\n    var inTemplateString = false;\n    var inRegex = false;\n    var curly = 0;\n    var square = 0;\n    var paren = 0;\n    var lastFilterIndex = 0;\n    var c, prev, i, expression, filters;\n\n    for (i = 0; i < exp.length; i++) {\n      prev = c;\n      c = exp.charCodeAt(i);\n      if (inSingle) {\n        if (c === 0x27 && prev !== 0x5C) { inSingle = false; }\n      } else if (inDouble) {\n        if (c === 0x22 && prev !== 0x5C) { inDouble = false; }\n      } else if (inTemplateString) {\n        if (c === 0x60 && prev !== 0x5C) { inTemplateString = false; }\n      } else if (inRegex) {\n        if (c === 0x2f && prev !== 0x5C) { inRegex = false; }\n      } else if (\n        c === 0x7C && // pipe\n        exp.charCodeAt(i + 1) !== 0x7C &&\n        exp.charCodeAt(i - 1) !== 0x7C &&\n        !curly && !square && !paren\n      ) {\n        if (expression === undefined) {\n          // first filter, end of expression\n          lastFilterIndex = i + 1;\n          expression = exp.slice(0, i).trim();\n        } else {\n          pushFilter();\n        }\n      } else {\n        switch (c) {\n          case 0x22: inDouble = true; break         // \"\n          case 0x27: inSingle = true; break         // '\n          case 0x60: inTemplateString = true; break // `\n          case 0x28: paren++; break                 // (\n          case 0x29: paren--; break                 // )\n          case 0x5B: square++; break                // [\n          case 0x5D: square--; break                // ]\n          case 0x7B: curly++; break                 // {\n          case 0x7D: curly--; break                 // }\n        }\n        if (c === 0x2f) { // /\n          var j = i - 1;\n          var p = (void 0);\n          // find first non-whitespace prev char\n          for (; j >= 0; j--) {\n            p = exp.charAt(j);\n            if (p !== ' ') { break }\n          }\n          if (!p || !validDivisionCharRE.test(p)) {\n            inRegex = true;\n          }\n        }\n      }\n    }\n\n    if (expression === undefined) {\n      expression = exp.slice(0, i).trim();\n    } else if (lastFilterIndex !== 0) {\n      pushFilter();\n    }\n\n    function pushFilter () {\n      (filters || (filters = [])).push(exp.slice(lastFilterIndex, i).trim());\n      lastFilterIndex = i + 1;\n    }\n\n    if (filters) {\n      for (i = 0; i < filters.length; i++) {\n        expression = wrapFilter(expression, filters[i]);\n      }\n    }\n\n    return expression\n  }\n\n  function wrapFilter (exp, filter) {\n    var i = filter.indexOf('(');\n    if (i < 0) {\n      // _f: resolveFilter\n      return (\"_f(\\\"\" + filter + \"\\\")(\" + exp + \")\")\n    } else {\n      var name = filter.slice(0, i);\n      var args = filter.slice(i + 1);\n      return (\"_f(\\\"\" + name + \"\\\")(\" + exp + (args !== ')' ? ',' + args : args))\n    }\n  }\n\n  /*  */\n\n\n\n  /* eslint-disable no-unused-vars */\n  function baseWarn (msg, range) {\n    console.error((\"[Vue compiler]: \" + msg));\n  }\n  /* eslint-enable no-unused-vars */\n\n  function pluckModuleFunction (\n    modules,\n    key\n  ) {\n    return modules\n      ? modules.map(function (m) { return m[key]; }).filter(function (_) { return _; })\n      : []\n  }\n\n  function addProp (el, name, value, range, dynamic) {\n    (el.props || (el.props = [])).push(rangeSetItem({ name: name, value: value, dynamic: dynamic }, range));\n    el.plain = false;\n  }\n\n  function addAttr (el, name, value, range, dynamic) {\n    var attrs = dynamic\n      ? (el.dynamicAttrs || (el.dynamicAttrs = []))\n      : (el.attrs || (el.attrs = []));\n    attrs.push(rangeSetItem({ name: name, value: value, dynamic: dynamic }, range));\n    el.plain = false;\n  }\n\n  // add a raw attr (use this in preTransforms)\n  function addRawAttr (el, name, value, range) {\n    el.attrsMap[name] = value;\n    el.attrsList.push(rangeSetItem({ name: name, value: value }, range));\n  }\n\n  function addDirective (\n    el,\n    name,\n    rawName,\n    value,\n    arg,\n    isDynamicArg,\n    modifiers,\n    range\n  ) {\n    (el.directives || (el.directives = [])).push(rangeSetItem({\n      name: name,\n      rawName: rawName,\n      value: value,\n      arg: arg,\n      isDynamicArg: isDynamicArg,\n      modifiers: modifiers\n    }, range));\n    el.plain = false;\n  }\n\n  function prependModifierMarker (symbol, name, dynamic) {\n    return dynamic\n      ? (\"_p(\" + name + \",\\\"\" + symbol + \"\\\")\")\n      : symbol + name // mark the event as captured\n  }\n\n  function addHandler (\n    el,\n    name,\n    value,\n    modifiers,\n    important,\n    warn,\n    range,\n    dynamic\n  ) {\n    modifiers = modifiers || emptyObject;\n    // warn prevent and passive modifier\n    /* istanbul ignore if */\n    if (\n      warn &&\n      modifiers.prevent && modifiers.passive\n    ) {\n      warn(\n        'passive and prevent can\\'t be used together. ' +\n        'Passive handler can\\'t prevent default event.',\n        range\n      );\n    }\n\n    // normalize click.right and click.middle since they don't actually fire\n    // this is technically browser-specific, but at least for now browsers are\n    // the only target envs that have right/middle clicks.\n    if (modifiers.right) {\n      if (dynamic) {\n        name = \"(\" + name + \")==='click'?'contextmenu':(\" + name + \")\";\n      } else if (name === 'click') {\n        name = 'contextmenu';\n        delete modifiers.right;\n      }\n    } else if (modifiers.middle) {\n      if (dynamic) {\n        name = \"(\" + name + \")==='click'?'mouseup':(\" + name + \")\";\n      } else if (name === 'click') {\n        name = 'mouseup';\n      }\n    }\n\n    // check capture modifier\n    if (modifiers.capture) {\n      delete modifiers.capture;\n      name = prependModifierMarker('!', name, dynamic);\n    }\n    if (modifiers.once) {\n      delete modifiers.once;\n      name = prependModifierMarker('~', name, dynamic);\n    }\n    /* istanbul ignore if */\n    if (modifiers.passive) {\n      delete modifiers.passive;\n      name = prependModifierMarker('&', name, dynamic);\n    }\n\n    var events;\n    if (modifiers.native) {\n      delete modifiers.native;\n      events = el.nativeEvents || (el.nativeEvents = {});\n    } else {\n      events = el.events || (el.events = {});\n    }\n\n    var newHandler = rangeSetItem({ value: value.trim(), dynamic: dynamic }, range);\n    if (modifiers !== emptyObject) {\n      newHandler.modifiers = modifiers;\n    }\n\n    var handlers = events[name];\n    /* istanbul ignore if */\n    if (Array.isArray(handlers)) {\n      important ? handlers.unshift(newHandler) : handlers.push(newHandler);\n    } else if (handlers) {\n      events[name] = important ? [newHandler, handlers] : [handlers, newHandler];\n    } else {\n      events[name] = newHandler;\n    }\n\n    el.plain = false;\n  }\n\n  function getRawBindingAttr (\n    el,\n    name\n  ) {\n    return el.rawAttrsMap[':' + name] ||\n      el.rawAttrsMap['v-bind:' + name] ||\n      el.rawAttrsMap[name]\n  }\n\n  function getBindingAttr (\n    el,\n    name,\n    getStatic\n  ) {\n    var dynamicValue =\n      getAndRemoveAttr(el, ':' + name) ||\n      getAndRemoveAttr(el, 'v-bind:' + name);\n    if (dynamicValue != null) {\n      return parseFilters(dynamicValue)\n    } else if (getStatic !== false) {\n      var staticValue = getAndRemoveAttr(el, name);\n      if (staticValue != null) {\n        return JSON.stringify(staticValue)\n      }\n    }\n  }\n\n  // note: this only removes the attr from the Array (attrsList) so that it\n  // doesn't get processed by processAttrs.\n  // By default it does NOT remove it from the map (attrsMap) because the map is\n  // needed during codegen.\n  function getAndRemoveAttr (\n    el,\n    name,\n    removeFromMap\n  ) {\n    var val;\n    if ((val = el.attrsMap[name]) != null) {\n      var list = el.attrsList;\n      for (var i = 0, l = list.length; i < l; i++) {\n        if (list[i].name === name) {\n          list.splice(i, 1);\n          break\n        }\n      }\n    }\n    if (removeFromMap) {\n      delete el.attrsMap[name];\n    }\n    return val\n  }\n\n  function getAndRemoveAttrByRegex (\n    el,\n    name\n  ) {\n    var list = el.attrsList;\n    for (var i = 0, l = list.length; i < l; i++) {\n      var attr = list[i];\n      if (name.test(attr.name)) {\n        list.splice(i, 1);\n        return attr\n      }\n    }\n  }\n\n  function rangeSetItem (\n    item,\n    range\n  ) {\n    if (range) {\n      if (range.start != null) {\n        item.start = range.start;\n      }\n      if (range.end != null) {\n        item.end = range.end;\n      }\n    }\n    return item\n  }\n\n  /*  */\n\n  /**\n   * Cross-platform code generation for component v-model\n   */\n  function genComponentModel (\n    el,\n    value,\n    modifiers\n  ) {\n    var ref = modifiers || {};\n    var number = ref.number;\n    var trim = ref.trim;\n\n    var baseValueExpression = '$$v';\n    var valueExpression = baseValueExpression;\n    if (trim) {\n      valueExpression =\n        \"(typeof \" + baseValueExpression + \" === 'string'\" +\n        \"? \" + baseValueExpression + \".trim()\" +\n        \": \" + baseValueExpression + \")\";\n    }\n    if (number) {\n      valueExpression = \"_n(\" + valueExpression + \")\";\n    }\n    var assignment = genAssignmentCode(value, valueExpression);\n\n    el.model = {\n      value: (\"(\" + value + \")\"),\n      expression: JSON.stringify(value),\n      callback: (\"function (\" + baseValueExpression + \") {\" + assignment + \"}\")\n    };\n  }\n\n  /**\n   * Cross-platform codegen helper for generating v-model value assignment code.\n   */\n  function genAssignmentCode (\n    value,\n    assignment\n  ) {\n    var res = parseModel(value);\n    if (res.key === null) {\n      return (value + \"=\" + assignment)\n    } else {\n      return (\"$set(\" + (res.exp) + \", \" + (res.key) + \", \" + assignment + \")\")\n    }\n  }\n\n  /**\n   * Parse a v-model expression into a base path and a final key segment.\n   * Handles both dot-path and possible square brackets.\n   *\n   * Possible cases:\n   *\n   * - test\n   * - test[key]\n   * - test[test1[key]]\n   * - test[\"a\"][key]\n   * - xxx.test[a[a].test1[key]]\n   * - test.xxx.a[\"asa\"][test1[key]]\n   *\n   */\n\n  var len, str, chr, index$1, expressionPos, expressionEndPos;\n\n\n\n  function parseModel (val) {\n    // Fix https://github.com/vuejs/vue/pull/7730\n    // allow v-model=\"obj.val \" (trailing whitespace)\n    val = val.trim();\n    len = val.length;\n\n    if (val.indexOf('[') < 0 || val.lastIndexOf(']') < len - 1) {\n      index$1 = val.lastIndexOf('.');\n      if (index$1 > -1) {\n        return {\n          exp: val.slice(0, index$1),\n          key: '\"' + val.slice(index$1 + 1) + '\"'\n        }\n      } else {\n        return {\n          exp: val,\n          key: null\n        }\n      }\n    }\n\n    str = val;\n    index$1 = expressionPos = expressionEndPos = 0;\n\n    while (!eof()) {\n      chr = next();\n      /* istanbul ignore if */\n      if (isStringStart(chr)) {\n        parseString(chr);\n      } else if (chr === 0x5B) {\n        parseBracket(chr);\n      }\n    }\n\n    return {\n      exp: val.slice(0, expressionPos),\n      key: val.slice(expressionPos + 1, expressionEndPos)\n    }\n  }\n\n  function next () {\n    return str.charCodeAt(++index$1)\n  }\n\n  function eof () {\n    return index$1 >= len\n  }\n\n  function isStringStart (chr) {\n    return chr === 0x22 || chr === 0x27\n  }\n\n  function parseBracket (chr) {\n    var inBracket = 1;\n    expressionPos = index$1;\n    while (!eof()) {\n      chr = next();\n      if (isStringStart(chr)) {\n        parseString(chr);\n        continue\n      }\n      if (chr === 0x5B) { inBracket++; }\n      if (chr === 0x5D) { inBracket--; }\n      if (inBracket === 0) {\n        expressionEndPos = index$1;\n        break\n      }\n    }\n  }\n\n  function parseString (chr) {\n    var stringQuote = chr;\n    while (!eof()) {\n      chr = next();\n      if (chr === stringQuote) {\n        break\n      }\n    }\n  }\n\n  /*  */\n\n  var warn$1;\n\n  // in some cases, the event used has to be determined at runtime\n  // so we used some reserved tokens during compile.\n  var RANGE_TOKEN = '__r';\n  var CHECKBOX_RADIO_TOKEN = '__c';\n\n  function model (\n    el,\n    dir,\n    _warn\n  ) {\n    warn$1 = _warn;\n    var value = dir.value;\n    var modifiers = dir.modifiers;\n    var tag = el.tag;\n    var type = el.attrsMap.type;\n\n    {\n      // inputs with type=\"file\" are read only and setting the input's\n      // value will throw an error.\n      if (tag === 'input' && type === 'file') {\n        warn$1(\n          \"<\" + (el.tag) + \" v-model=\\\"\" + value + \"\\\" type=\\\"file\\\">:\\n\" +\n          \"File inputs are read only. Use a v-on:change listener instead.\",\n          el.rawAttrsMap['v-model']\n        );\n      }\n    }\n\n    if (el.component) {\n      genComponentModel(el, value, modifiers);\n      // component v-model doesn't need extra runtime\n      return false\n    } else if (tag === 'select') {\n      genSelect(el, value, modifiers);\n    } else if (tag === 'input' && type === 'checkbox') {\n      genCheckboxModel(el, value, modifiers);\n    } else if (tag === 'input' && type === 'radio') {\n      genRadioModel(el, value, modifiers);\n    } else if (tag === 'input' || tag === 'textarea') {\n      genDefaultModel(el, value, modifiers);\n    } else if (!config.isReservedTag(tag)) {\n      genComponentModel(el, value, modifiers);\n      // component v-model doesn't need extra runtime\n      return false\n    } else {\n      warn$1(\n        \"<\" + (el.tag) + \" v-model=\\\"\" + value + \"\\\">: \" +\n        \"v-model is not supported on this element type. \" +\n        'If you are working with contenteditable, it\\'s recommended to ' +\n        'wrap a library dedicated for that purpose inside a custom component.',\n        el.rawAttrsMap['v-model']\n      );\n    }\n\n    // ensure runtime directive metadata\n    return true\n  }\n\n  function genCheckboxModel (\n    el,\n    value,\n    modifiers\n  ) {\n    var number = modifiers && modifiers.number;\n    var valueBinding = getBindingAttr(el, 'value') || 'null';\n    var trueValueBinding = getBindingAttr(el, 'true-value') || 'true';\n    var falseValueBinding = getBindingAttr(el, 'false-value') || 'false';\n    addProp(el, 'checked',\n      \"Array.isArray(\" + value + \")\" +\n      \"?_i(\" + value + \",\" + valueBinding + \")>-1\" + (\n        trueValueBinding === 'true'\n          ? (\":(\" + value + \")\")\n          : (\":_q(\" + value + \",\" + trueValueBinding + \")\")\n      )\n    );\n    addHandler(el, 'change',\n      \"var $$a=\" + value + \",\" +\n          '$$el=$event.target,' +\n          \"$$c=$$el.checked?(\" + trueValueBinding + \"):(\" + falseValueBinding + \");\" +\n      'if(Array.isArray($$a)){' +\n        \"var $$v=\" + (number ? '_n(' + valueBinding + ')' : valueBinding) + \",\" +\n            '$$i=_i($$a,$$v);' +\n        \"if($$el.checked){$$i<0&&(\" + (genAssignmentCode(value, '$$a.concat([$$v])')) + \")}\" +\n        \"else{$$i>-1&&(\" + (genAssignmentCode(value, '$$a.slice(0,$$i).concat($$a.slice($$i+1))')) + \")}\" +\n      \"}else{\" + (genAssignmentCode(value, '$$c')) + \"}\",\n      null, true\n    );\n  }\n\n  function genRadioModel (\n    el,\n    value,\n    modifiers\n  ) {\n    var number = modifiers && modifiers.number;\n    var valueBinding = getBindingAttr(el, 'value') || 'null';\n    valueBinding = number ? (\"_n(\" + valueBinding + \")\") : valueBinding;\n    addProp(el, 'checked', (\"_q(\" + value + \",\" + valueBinding + \")\"));\n    addHandler(el, 'change', genAssignmentCode(value, valueBinding), null, true);\n  }\n\n  function genSelect (\n    el,\n    value,\n    modifiers\n  ) {\n    var number = modifiers && modifiers.number;\n    var selectedVal = \"Array.prototype.filter\" +\n      \".call($event.target.options,function(o){return o.selected})\" +\n      \".map(function(o){var val = \\\"_value\\\" in o ? o._value : o.value;\" +\n      \"return \" + (number ? '_n(val)' : 'val') + \"})\";\n\n    var assignment = '$event.target.multiple ? $$selectedVal : $$selectedVal[0]';\n    var code = \"var $$selectedVal = \" + selectedVal + \";\";\n    code = code + \" \" + (genAssignmentCode(value, assignment));\n    addHandler(el, 'change', code, null, true);\n  }\n\n  function genDefaultModel (\n    el,\n    value,\n    modifiers\n  ) {\n    var type = el.attrsMap.type;\n\n    // warn if v-bind:value conflicts with v-model\n    // except for inputs with v-bind:type\n    {\n      var value$1 = el.attrsMap['v-bind:value'] || el.attrsMap[':value'];\n      var typeBinding = el.attrsMap['v-bind:type'] || el.attrsMap[':type'];\n      if (value$1 && !typeBinding) {\n        var binding = el.attrsMap['v-bind:value'] ? 'v-bind:value' : ':value';\n        warn$1(\n          binding + \"=\\\"\" + value$1 + \"\\\" conflicts with v-model on the same element \" +\n          'because the latter already expands to a value binding internally',\n          el.rawAttrsMap[binding]\n        );\n      }\n    }\n\n    var ref = modifiers || {};\n    var lazy = ref.lazy;\n    var number = ref.number;\n    var trim = ref.trim;\n    var needCompositionGuard = !lazy && type !== 'range';\n    var event = lazy\n      ? 'change'\n      : type === 'range'\n        ? RANGE_TOKEN\n        : 'input';\n\n    var valueExpression = '$event.target.value';\n    if (trim) {\n      valueExpression = \"$event.target.value.trim()\";\n    }\n    if (number) {\n      valueExpression = \"_n(\" + valueExpression + \")\";\n    }\n\n    var code = genAssignmentCode(value, valueExpression);\n    if (needCompositionGuard) {\n      code = \"if($event.target.composing)return;\" + code;\n    }\n\n    addProp(el, 'value', (\"(\" + value + \")\"));\n    addHandler(el, event, code, null, true);\n    if (trim || number) {\n      addHandler(el, 'blur', '$forceUpdate()');\n    }\n  }\n\n  /*  */\n\n  // normalize v-model event tokens that can only be determined at runtime.\n  // it's important to place the event as the first in the array because\n  // the whole point is ensuring the v-model callback gets called before\n  // user-attached handlers.\n  function normalizeEvents (on) {\n    /* istanbul ignore if */\n    if (isDef(on[RANGE_TOKEN])) {\n      // IE input[type=range] only supports `change` event\n      var event = isIE ? 'change' : 'input';\n      on[event] = [].concat(on[RANGE_TOKEN], on[event] || []);\n      delete on[RANGE_TOKEN];\n    }\n    // This was originally intended to fix #4521 but no longer necessary\n    // after 2.5. Keeping it for backwards compat with generated code from < 2.4\n    /* istanbul ignore if */\n    if (isDef(on[CHECKBOX_RADIO_TOKEN])) {\n      on.change = [].concat(on[CHECKBOX_RADIO_TOKEN], on.change || []);\n      delete on[CHECKBOX_RADIO_TOKEN];\n    }\n  }\n\n  var target$1;\n\n  function createOnceHandler$1 (event, handler, capture) {\n    var _target = target$1; // save current target element in closure\n    return function onceHandler () {\n      var res = handler.apply(null, arguments);\n      if (res !== null) {\n        remove$2(event, onceHandler, capture, _target);\n      }\n    }\n  }\n\n  // #9446: Firefox <= 53 (in particular, ESR 52) has incorrect Event.timeStamp\n  // implementation and does not fire microtasks in between event propagation, so\n  // safe to exclude.\n  var useMicrotaskFix = isUsingMicroTask && !(isFF && Number(isFF[1]) <= 53);\n\n  function add$1 (\n    name,\n    handler,\n    capture,\n    passive\n  ) {\n    // async edge case #6566: inner click event triggers patch, event handler\n    // attached to outer element during patch, and triggered again. This\n    // happens because browsers fire microtask ticks between event propagation.\n    // the solution is simple: we save the timestamp when a handler is attached,\n    // and the handler would only fire if the event passed to it was fired\n    // AFTER it was attached.\n    if (useMicrotaskFix) {\n      var attachedTimestamp = currentFlushTimestamp;\n      var original = handler;\n      handler = original._wrapper = function (e) {\n        if (\n          // no bubbling, should always fire.\n          // this is just a safety net in case event.timeStamp is unreliable in\n          // certain weird environments...\n          e.target === e.currentTarget ||\n          // event is fired after handler attachment\n          e.timeStamp >= attachedTimestamp ||\n          // #9462 bail for iOS 9 bug: event.timeStamp is 0 after history.pushState\n          e.timeStamp === 0 ||\n          // #9448 bail if event is fired in another document in a multi-page\n          // electron/nw.js app, since event.timeStamp will be using a different\n          // starting reference\n          e.target.ownerDocument !== document\n        ) {\n          return original.apply(this, arguments)\n        }\n      };\n    }\n    target$1.addEventListener(\n      name,\n      handler,\n      supportsPassive\n        ? { capture: capture, passive: passive }\n        : capture\n    );\n  }\n\n  function remove$2 (\n    name,\n    handler,\n    capture,\n    _target\n  ) {\n    (_target || target$1).removeEventListener(\n      name,\n      handler._wrapper || handler,\n      capture\n    );\n  }\n\n  function updateDOMListeners (oldVnode, vnode) {\n    if (isUndef(oldVnode.data.on) && isUndef(vnode.data.on)) {\n      return\n    }\n    var on = vnode.data.on || {};\n    var oldOn = oldVnode.data.on || {};\n    target$1 = vnode.elm;\n    normalizeEvents(on);\n    updateListeners(on, oldOn, add$1, remove$2, createOnceHandler$1, vnode.context);\n    target$1 = undefined;\n  }\n\n  var events = {\n    create: updateDOMListeners,\n    update: updateDOMListeners\n  };\n\n  /*  */\n\n  var svgContainer;\n\n  function updateDOMProps (oldVnode, vnode) {\n    if (isUndef(oldVnode.data.domProps) && isUndef(vnode.data.domProps)) {\n      return\n    }\n    var key, cur;\n    var elm = vnode.elm;\n    var oldProps = oldVnode.data.domProps || {};\n    var props = vnode.data.domProps || {};\n    // clone observed objects, as the user probably wants to mutate it\n    if (isDef(props.__ob__)) {\n      props = vnode.data.domProps = extend({}, props);\n    }\n\n    for (key in oldProps) {\n      if (isUndef(props[key])) {\n        elm[key] = '';\n      }\n    }\n    for (key in props) {\n      cur = props[key];\n      // ignore children if the node has textContent or innerHTML,\n      // as these will throw away existing DOM nodes and cause removal errors\n      // on subsequent patches (#3360)\n      if (key === 'textContent' || key === 'innerHTML') {\n        if (vnode.children) { vnode.children.length = 0; }\n        if (cur === oldProps[key]) { continue }\n        // #6601 work around Chrome version <= 55 bug where single textNode\n        // replaced by innerHTML/textContent retains its parentNode property\n        if (elm.childNodes.length === 1) {\n          elm.removeChild(elm.childNodes[0]);\n        }\n      }\n\n      if (key === 'value' && elm.tagName !== 'PROGRESS') {\n        // store value as _value as well since\n        // non-string values will be stringified\n        elm._value = cur;\n        // avoid resetting cursor position when value is the same\n        var strCur = isUndef(cur) ? '' : String(cur);\n        if (shouldUpdateValue(elm, strCur)) {\n          elm.value = strCur;\n        }\n      } else if (key === 'innerHTML' && isSVG(elm.tagName) && isUndef(elm.innerHTML)) {\n        // IE doesn't support innerHTML for SVG elements\n        svgContainer = svgContainer || document.createElement('div');\n        svgContainer.innerHTML = \"<svg>\" + cur + \"</svg>\";\n        var svg = svgContainer.firstChild;\n        while (elm.firstChild) {\n          elm.removeChild(elm.firstChild);\n        }\n        while (svg.firstChild) {\n          elm.appendChild(svg.firstChild);\n        }\n      } else if (\n        // skip the update if old and new VDOM state is the same.\n        // `value` is handled separately because the DOM value may be temporarily\n        // out of sync with VDOM state due to focus, composition and modifiers.\n        // This  #4521 by skipping the unnecesarry `checked` update.\n        cur !== oldProps[key]\n      ) {\n        // some property updates can throw\n        // e.g. `value` on <progress> w/ non-finite value\n        try {\n          elm[key] = cur;\n        } catch (e) {}\n      }\n    }\n  }\n\n  // check platforms/web/util/attrs.js acceptValue\n\n\n  function shouldUpdateValue (elm, checkVal) {\n    return (!elm.composing && (\n      elm.tagName === 'OPTION' ||\n      isNotInFocusAndDirty(elm, checkVal) ||\n      isDirtyWithModifiers(elm, checkVal)\n    ))\n  }\n\n  function isNotInFocusAndDirty (elm, checkVal) {\n    // return true when textbox (.number and .trim) loses focus and its value is\n    // not equal to the updated value\n    var notInFocus = true;\n    // #6157\n    // work around IE bug when accessing document.activeElement in an iframe\n    try { notInFocus = document.activeElement !== elm; } catch (e) {}\n    return notInFocus && elm.value !== checkVal\n  }\n\n  function isDirtyWithModifiers (elm, newVal) {\n    var value = elm.value;\n    var modifiers = elm._vModifiers; // injected by v-model runtime\n    if (isDef(modifiers)) {\n      if (modifiers.number) {\n        return toNumber(value) !== toNumber(newVal)\n      }\n      if (modifiers.trim) {\n        return value.trim() !== newVal.trim()\n      }\n    }\n    return value !== newVal\n  }\n\n  var domProps = {\n    create: updateDOMProps,\n    update: updateDOMProps\n  };\n\n  /*  */\n\n  var parseStyleText = cached(function (cssText) {\n    var res = {};\n    var listDelimiter = /;(?![^(]*\\))/g;\n    var propertyDelimiter = /:(.+)/;\n    cssText.split(listDelimiter).forEach(function (item) {\n      if (item) {\n        var tmp = item.split(propertyDelimiter);\n        tmp.length > 1 && (res[tmp[0].trim()] = tmp[1].trim());\n      }\n    });\n    return res\n  });\n\n  // merge static and dynamic style data on the same vnode\n  function normalizeStyleData (data) {\n    var style = normalizeStyleBinding(data.style);\n    // static style is pre-processed into an object during compilation\n    // and is always a fresh object, so it's safe to merge into it\n    return data.staticStyle\n      ? extend(data.staticStyle, style)\n      : style\n  }\n\n  // normalize possible array / string values into Object\n  function normalizeStyleBinding (bindingStyle) {\n    if (Array.isArray(bindingStyle)) {\n      return toObject(bindingStyle)\n    }\n    if (typeof bindingStyle === 'string') {\n      return parseStyleText(bindingStyle)\n    }\n    return bindingStyle\n  }\n\n  /**\n   * parent component style should be after child's\n   * so that parent component's style could override it\n   */\n  function getStyle (vnode, checkChild) {\n    var res = {};\n    var styleData;\n\n    if (checkChild) {\n      var childNode = vnode;\n      while (childNode.componentInstance) {\n        childNode = childNode.componentInstance._vnode;\n        if (\n          childNode && childNode.data &&\n          (styleData = normalizeStyleData(childNode.data))\n        ) {\n          extend(res, styleData);\n        }\n      }\n    }\n\n    if ((styleData = normalizeStyleData(vnode.data))) {\n      extend(res, styleData);\n    }\n\n    var parentNode = vnode;\n    while ((parentNode = parentNode.parent)) {\n      if (parentNode.data && (styleData = normalizeStyleData(parentNode.data))) {\n        extend(res, styleData);\n      }\n    }\n    return res\n  }\n\n  /*  */\n\n  var cssVarRE = /^--/;\n  var importantRE = /\\s*!important$/;\n  var setProp = function (el, name, val) {\n    /* istanbul ignore if */\n    if (cssVarRE.test(name)) {\n      el.style.setProperty(name, val);\n    } else if (importantRE.test(val)) {\n      el.style.setProperty(hyphenate(name), val.replace(importantRE, ''), 'important');\n    } else {\n      var normalizedName = normalize(name);\n      if (Array.isArray(val)) {\n        // Support values array created by autoprefixer, e.g.\n        // {display: [\"-webkit-box\", \"-ms-flexbox\", \"flex\"]}\n        // Set them one by one, and the browser will only set those it can recognize\n        for (var i = 0, len = val.length; i < len; i++) {\n          el.style[normalizedName] = val[i];\n        }\n      } else {\n        el.style[normalizedName] = val;\n      }\n    }\n  };\n\n  var vendorNames = ['Webkit', 'Moz', 'ms'];\n\n  var emptyStyle;\n  var normalize = cached(function (prop) {\n    emptyStyle = emptyStyle || document.createElement('div').style;\n    prop = camelize(prop);\n    if (prop !== 'filter' && (prop in emptyStyle)) {\n      return prop\n    }\n    var capName = prop.charAt(0).toUpperCase() + prop.slice(1);\n    for (var i = 0; i < vendorNames.length; i++) {\n      var name = vendorNames[i] + capName;\n      if (name in emptyStyle) {\n        return name\n      }\n    }\n  });\n\n  function updateStyle (oldVnode, vnode) {\n    var data = vnode.data;\n    var oldData = oldVnode.data;\n\n    if (isUndef(data.staticStyle) && isUndef(data.style) &&\n      isUndef(oldData.staticStyle) && isUndef(oldData.style)\n    ) {\n      return\n    }\n\n    var cur, name;\n    var el = vnode.elm;\n    var oldStaticStyle = oldData.staticStyle;\n    var oldStyleBinding = oldData.normalizedStyle || oldData.style || {};\n\n    // if static style exists, stylebinding already merged into it when doing normalizeStyleData\n    var oldStyle = oldStaticStyle || oldStyleBinding;\n\n    var style = normalizeStyleBinding(vnode.data.style) || {};\n\n    // store normalized style under a different key for next diff\n    // make sure to clone it if it's reactive, since the user likely wants\n    // to mutate it.\n    vnode.data.normalizedStyle = isDef(style.__ob__)\n      ? extend({}, style)\n      : style;\n\n    var newStyle = getStyle(vnode, true);\n\n    for (name in oldStyle) {\n      if (isUndef(newStyle[name])) {\n        setProp(el, name, '');\n      }\n    }\n    for (name in newStyle) {\n      cur = newStyle[name];\n      if (cur !== oldStyle[name]) {\n        // ie9 setting to null has no effect, must use empty string\n        setProp(el, name, cur == null ? '' : cur);\n      }\n    }\n  }\n\n  var style = {\n    create: updateStyle,\n    update: updateStyle\n  };\n\n  /*  */\n\n  var whitespaceRE = /\\s+/;\n\n  /**\n   * Add class with compatibility for SVG since classList is not supported on\n   * SVG elements in IE\n   */\n  function addClass (el, cls) {\n    /* istanbul ignore if */\n    if (!cls || !(cls = cls.trim())) {\n      return\n    }\n\n    /* istanbul ignore else */\n    if (el.classList) {\n      if (cls.indexOf(' ') > -1) {\n        cls.split(whitespaceRE).forEach(function (c) { return el.classList.add(c); });\n      } else {\n        el.classList.add(cls);\n      }\n    } else {\n      var cur = \" \" + (el.getAttribute('class') || '') + \" \";\n      if (cur.indexOf(' ' + cls + ' ') < 0) {\n        el.setAttribute('class', (cur + cls).trim());\n      }\n    }\n  }\n\n  /**\n   * Remove class with compatibility for SVG since classList is not supported on\n   * SVG elements in IE\n   */\n  function removeClass (el, cls) {\n    /* istanbul ignore if */\n    if (!cls || !(cls = cls.trim())) {\n      return\n    }\n\n    /* istanbul ignore else */\n    if (el.classList) {\n      if (cls.indexOf(' ') > -1) {\n        cls.split(whitespaceRE).forEach(function (c) { return el.classList.remove(c); });\n      } else {\n        el.classList.remove(cls);\n      }\n      if (!el.classList.length) {\n        el.removeAttribute('class');\n      }\n    } else {\n      var cur = \" \" + (el.getAttribute('class') || '') + \" \";\n      var tar = ' ' + cls + ' ';\n      while (cur.indexOf(tar) >= 0) {\n        cur = cur.replace(tar, ' ');\n      }\n      cur = cur.trim();\n      if (cur) {\n        el.setAttribute('class', cur);\n      } else {\n        el.removeAttribute('class');\n      }\n    }\n  }\n\n  /*  */\n\n  function resolveTransition (def$$1) {\n    if (!def$$1) {\n      return\n    }\n    /* istanbul ignore else */\n    if (typeof def$$1 === 'object') {\n      var res = {};\n      if (def$$1.css !== false) {\n        extend(res, autoCssTransition(def$$1.name || 'v'));\n      }\n      extend(res, def$$1);\n      return res\n    } else if (typeof def$$1 === 'string') {\n      return autoCssTransition(def$$1)\n    }\n  }\n\n  var autoCssTransition = cached(function (name) {\n    return {\n      enterClass: (name + \"-enter\"),\n      enterToClass: (name + \"-enter-to\"),\n      enterActiveClass: (name + \"-enter-active\"),\n      leaveClass: (name + \"-leave\"),\n      leaveToClass: (name + \"-leave-to\"),\n      leaveActiveClass: (name + \"-leave-active\")\n    }\n  });\n\n  var hasTransition = inBrowser && !isIE9;\n  var TRANSITION = 'transition';\n  var ANIMATION = 'animation';\n\n  // Transition property/event sniffing\n  var transitionProp = 'transition';\n  var transitionEndEvent = 'transitionend';\n  var animationProp = 'animation';\n  var animationEndEvent = 'animationend';\n  if (hasTransition) {\n    /* istanbul ignore if */\n    if (window.ontransitionend === undefined &&\n      window.onwebkittransitionend !== undefined\n    ) {\n      transitionProp = 'WebkitTransition';\n      transitionEndEvent = 'webkitTransitionEnd';\n    }\n    if (window.onanimationend === undefined &&\n      window.onwebkitanimationend !== undefined\n    ) {\n      animationProp = 'WebkitAnimation';\n      animationEndEvent = 'webkitAnimationEnd';\n    }\n  }\n\n  // binding to window is necessary to make hot reload work in IE in strict mode\n  var raf = inBrowser\n    ? window.requestAnimationFrame\n      ? window.requestAnimationFrame.bind(window)\n      : setTimeout\n    : /* istanbul ignore next */ function (fn) { return fn(); };\n\n  function nextFrame (fn) {\n    raf(function () {\n      raf(fn);\n    });\n  }\n\n  function addTransitionClass (el, cls) {\n    var transitionClasses = el._transitionClasses || (el._transitionClasses = []);\n    if (transitionClasses.indexOf(cls) < 0) {\n      transitionClasses.push(cls);\n      addClass(el, cls);\n    }\n  }\n\n  function removeTransitionClass (el, cls) {\n    if (el._transitionClasses) {\n      remove(el._transitionClasses, cls);\n    }\n    removeClass(el, cls);\n  }\n\n  function whenTransitionEnds (\n    el,\n    expectedType,\n    cb\n  ) {\n    var ref = getTransitionInfo(el, expectedType);\n    var type = ref.type;\n    var timeout = ref.timeout;\n    var propCount = ref.propCount;\n    if (!type) { return cb() }\n    var event = type === TRANSITION ? transitionEndEvent : animationEndEvent;\n    var ended = 0;\n    var end = function () {\n      el.removeEventListener(event, onEnd);\n      cb();\n    };\n    var onEnd = function (e) {\n      if (e.target === el) {\n        if (++ended >= propCount) {\n          end();\n        }\n      }\n    };\n    setTimeout(function () {\n      if (ended < propCount) {\n        end();\n      }\n    }, timeout + 1);\n    el.addEventListener(event, onEnd);\n  }\n\n  var transformRE = /\\b(transform|all)(,|$)/;\n\n  function getTransitionInfo (el, expectedType) {\n    var styles = window.getComputedStyle(el);\n    // JSDOM may return undefined for transition properties\n    var transitionDelays = (styles[transitionProp + 'Delay'] || '').split(', ');\n    var transitionDurations = (styles[transitionProp + 'Duration'] || '').split(', ');\n    var transitionTimeout = getTimeout(transitionDelays, transitionDurations);\n    var animationDelays = (styles[animationProp + 'Delay'] || '').split(', ');\n    var animationDurations = (styles[animationProp + 'Duration'] || '').split(', ');\n    var animationTimeout = getTimeout(animationDelays, animationDurations);\n\n    var type;\n    var timeout = 0;\n    var propCount = 0;\n    /* istanbul ignore if */\n    if (expectedType === TRANSITION) {\n      if (transitionTimeout > 0) {\n        type = TRANSITION;\n        timeout = transitionTimeout;\n        propCount = transitionDurations.length;\n      }\n    } else if (expectedType === ANIMATION) {\n      if (animationTimeout > 0) {\n        type = ANIMATION;\n        timeout = animationTimeout;\n        propCount = animationDurations.length;\n      }\n    } else {\n      timeout = Math.max(transitionTimeout, animationTimeout);\n      type = timeout > 0\n        ? transitionTimeout > animationTimeout\n          ? TRANSITION\n          : ANIMATION\n        : null;\n      propCount = type\n        ? type === TRANSITION\n          ? transitionDurations.length\n          : animationDurations.length\n        : 0;\n    }\n    var hasTransform =\n      type === TRANSITION &&\n      transformRE.test(styles[transitionProp + 'Property']);\n    return {\n      type: type,\n      timeout: timeout,\n      propCount: propCount,\n      hasTransform: hasTransform\n    }\n  }\n\n  function getTimeout (delays, durations) {\n    /* istanbul ignore next */\n    while (delays.length < durations.length) {\n      delays = delays.concat(delays);\n    }\n\n    return Math.max.apply(null, durations.map(function (d, i) {\n      return toMs(d) + toMs(delays[i])\n    }))\n  }\n\n  // Old versions of Chromium (below 61.0.3163.100) formats floating pointer numbers\n  // in a locale-dependent way, using a comma instead of a dot.\n  // If comma is not replaced with a dot, the input will be rounded down (i.e. acting\n  // as a floor function) causing unexpected behaviors\n  function toMs (s) {\n    return Number(s.slice(0, -1).replace(',', '.')) * 1000\n  }\n\n  /*  */\n\n  function enter (vnode, toggleDisplay) {\n    var el = vnode.elm;\n\n    // call leave callback now\n    if (isDef(el._leaveCb)) {\n      el._leaveCb.cancelled = true;\n      el._leaveCb();\n    }\n\n    var data = resolveTransition(vnode.data.transition);\n    if (isUndef(data)) {\n      return\n    }\n\n    /* istanbul ignore if */\n    if (isDef(el._enterCb) || el.nodeType !== 1) {\n      return\n    }\n\n    var css = data.css;\n    var type = data.type;\n    var enterClass = data.enterClass;\n    var enterToClass = data.enterToClass;\n    var enterActiveClass = data.enterActiveClass;\n    var appearClass = data.appearClass;\n    var appearToClass = data.appearToClass;\n    var appearActiveClass = data.appearActiveClass;\n    var beforeEnter = data.beforeEnter;\n    var enter = data.enter;\n    var afterEnter = data.afterEnter;\n    var enterCancelled = data.enterCancelled;\n    var beforeAppear = data.beforeAppear;\n    var appear = data.appear;\n    var afterAppear = data.afterAppear;\n    var appearCancelled = data.appearCancelled;\n    var duration = data.duration;\n\n    // activeInstance will always be the <transition> component managing this\n    // transition. One edge case to check is when the <transition> is placed\n    // as the root node of a child component. In that case we need to check\n    // <transition>'s parent for appear check.\n    var context = activeInstance;\n    var transitionNode = activeInstance.$vnode;\n    while (transitionNode && transitionNode.parent) {\n      transitionNode = transitionNode.parent;\n      context = transitionNode.context;\n    }\n\n    var isAppear = !context._isMounted || !vnode.isRootInsert;\n\n    if (isAppear && !appear && appear !== '') {\n      return\n    }\n\n    var startClass = isAppear && appearClass\n      ? appearClass\n      : enterClass;\n    var activeClass = isAppear && appearActiveClass\n      ? appearActiveClass\n      : enterActiveClass;\n    var toClass = isAppear && appearToClass\n      ? appearToClass\n      : enterToClass;\n\n    var beforeEnterHook = isAppear\n      ? (beforeAppear || beforeEnter)\n      : beforeEnter;\n    var enterHook = isAppear\n      ? (typeof appear === 'function' ? appear : enter)\n      : enter;\n    var afterEnterHook = isAppear\n      ? (afterAppear || afterEnter)\n      : afterEnter;\n    var enterCancelledHook = isAppear\n      ? (appearCancelled || enterCancelled)\n      : enterCancelled;\n\n    var explicitEnterDuration = toNumber(\n      isObject(duration)\n        ? duration.enter\n        : duration\n    );\n\n    if (explicitEnterDuration != null) {\n      checkDuration(explicitEnterDuration, 'enter', vnode);\n    }\n\n    var expectsCSS = css !== false && !isIE9;\n    var userWantsControl = getHookArgumentsLength(enterHook);\n\n    var cb = el._enterCb = once(function () {\n      if (expectsCSS) {\n        removeTransitionClass(el, toClass);\n        removeTransitionClass(el, activeClass);\n      }\n      if (cb.cancelled) {\n        if (expectsCSS) {\n          removeTransitionClass(el, startClass);\n        }\n        enterCancelledHook && enterCancelledHook(el);\n      } else {\n        afterEnterHook && afterEnterHook(el);\n      }\n      el._enterCb = null;\n    });\n\n    if (!vnode.data.show) {\n      // remove pending leave element on enter by injecting an insert hook\n      mergeVNodeHook(vnode, 'insert', function () {\n        var parent = el.parentNode;\n        var pendingNode = parent && parent._pending && parent._pending[vnode.key];\n        if (pendingNode &&\n          pendingNode.tag === vnode.tag &&\n          pendingNode.elm._leaveCb\n        ) {\n          pendingNode.elm._leaveCb();\n        }\n        enterHook && enterHook(el, cb);\n      });\n    }\n\n    // start enter transition\n    beforeEnterHook && beforeEnterHook(el);\n    if (expectsCSS) {\n      addTransitionClass(el, startClass);\n      addTransitionClass(el, activeClass);\n      nextFrame(function () {\n        removeTransitionClass(el, startClass);\n        if (!cb.cancelled) {\n          addTransitionClass(el, toClass);\n          if (!userWantsControl) {\n            if (isValidDuration(explicitEnterDuration)) {\n              setTimeout(cb, explicitEnterDuration);\n            } else {\n              whenTransitionEnds(el, type, cb);\n            }\n          }\n        }\n      });\n    }\n\n    if (vnode.data.show) {\n      toggleDisplay && toggleDisplay();\n      enterHook && enterHook(el, cb);\n    }\n\n    if (!expectsCSS && !userWantsControl) {\n      cb();\n    }\n  }\n\n  function leave (vnode, rm) {\n    var el = vnode.elm;\n\n    // call enter callback now\n    if (isDef(el._enterCb)) {\n      el._enterCb.cancelled = true;\n      el._enterCb();\n    }\n\n    var data = resolveTransition(vnode.data.transition);\n    if (isUndef(data) || el.nodeType !== 1) {\n      return rm()\n    }\n\n    /* istanbul ignore if */\n    if (isDef(el._leaveCb)) {\n      return\n    }\n\n    var css = data.css;\n    var type = data.type;\n    var leaveClass = data.leaveClass;\n    var leaveToClass = data.leaveToClass;\n    var leaveActiveClass = data.leaveActiveClass;\n    var beforeLeave = data.beforeLeave;\n    var leave = data.leave;\n    var afterLeave = data.afterLeave;\n    var leaveCancelled = data.leaveCancelled;\n    var delayLeave = data.delayLeave;\n    var duration = data.duration;\n\n    var expectsCSS = css !== false && !isIE9;\n    var userWantsControl = getHookArgumentsLength(leave);\n\n    var explicitLeaveDuration = toNumber(\n      isObject(duration)\n        ? duration.leave\n        : duration\n    );\n\n    if (isDef(explicitLeaveDuration)) {\n      checkDuration(explicitLeaveDuration, 'leave', vnode);\n    }\n\n    var cb = el._leaveCb = once(function () {\n      if (el.parentNode && el.parentNode._pending) {\n        el.parentNode._pending[vnode.key] = null;\n      }\n      if (expectsCSS) {\n        removeTransitionClass(el, leaveToClass);\n        removeTransitionClass(el, leaveActiveClass);\n      }\n      if (cb.cancelled) {\n        if (expectsCSS) {\n          removeTransitionClass(el, leaveClass);\n        }\n        leaveCancelled && leaveCancelled(el);\n      } else {\n        rm();\n        afterLeave && afterLeave(el);\n      }\n      el._leaveCb = null;\n    });\n\n    if (delayLeave) {\n      delayLeave(performLeave);\n    } else {\n      performLeave();\n    }\n\n    function performLeave () {\n      // the delayed leave may have already been cancelled\n      if (cb.cancelled) {\n        return\n      }\n      // record leaving element\n      if (!vnode.data.show && el.parentNode) {\n        (el.parentNode._pending || (el.parentNode._pending = {}))[(vnode.key)] = vnode;\n      }\n      beforeLeave && beforeLeave(el);\n      if (expectsCSS) {\n        addTransitionClass(el, leaveClass);\n        addTransitionClass(el, leaveActiveClass);\n        nextFrame(function () {\n          removeTransitionClass(el, leaveClass);\n          if (!cb.cancelled) {\n            addTransitionClass(el, leaveToClass);\n            if (!userWantsControl) {\n              if (isValidDuration(explicitLeaveDuration)) {\n                setTimeout(cb, explicitLeaveDuration);\n              } else {\n                whenTransitionEnds(el, type, cb);\n              }\n            }\n          }\n        });\n      }\n      leave && leave(el, cb);\n      if (!expectsCSS && !userWantsControl) {\n        cb();\n      }\n    }\n  }\n\n  // only used in dev mode\n  function checkDuration (val, name, vnode) {\n    if (typeof val !== 'number') {\n      warn(\n        \"<transition> explicit \" + name + \" duration is not a valid number - \" +\n        \"got \" + (JSON.stringify(val)) + \".\",\n        vnode.context\n      );\n    } else if (isNaN(val)) {\n      warn(\n        \"<transition> explicit \" + name + \" duration is NaN - \" +\n        'the duration expression might be incorrect.',\n        vnode.context\n      );\n    }\n  }\n\n  function isValidDuration (val) {\n    return typeof val === 'number' && !isNaN(val)\n  }\n\n  /**\n   * Normalize a transition hook's argument length. The hook may be:\n   * - a merged hook (invoker) with the original in .fns\n   * - a wrapped component method (check ._length)\n   * - a plain function (.length)\n   */\n  function getHookArgumentsLength (fn) {\n    if (isUndef(fn)) {\n      return false\n    }\n    var invokerFns = fn.fns;\n    if (isDef(invokerFns)) {\n      // invoker\n      return getHookArgumentsLength(\n        Array.isArray(invokerFns)\n          ? invokerFns[0]\n          : invokerFns\n      )\n    } else {\n      return (fn._length || fn.length) > 1\n    }\n  }\n\n  function _enter (_, vnode) {\n    if (vnode.data.show !== true) {\n      enter(vnode);\n    }\n  }\n\n  var transition = inBrowser ? {\n    create: _enter,\n    activate: _enter,\n    remove: function remove$$1 (vnode, rm) {\n      /* istanbul ignore else */\n      if (vnode.data.show !== true) {\n        leave(vnode, rm);\n      } else {\n        rm();\n      }\n    }\n  } : {};\n\n  var platformModules = [\n    attrs,\n    klass,\n    events,\n    domProps,\n    style,\n    transition\n  ];\n\n  /*  */\n\n  // the directive module should be applied last, after all\n  // built-in modules have been applied.\n  var modules = platformModules.concat(baseModules);\n\n  var patch = createPatchFunction({ nodeOps: nodeOps, modules: modules });\n\n  /**\n   * Not type checking this file because flow doesn't like attaching\n   * properties to Elements.\n   */\n\n  /* istanbul ignore if */\n  if (isIE9) {\n    // http://www.matts411.com/post/internet-explorer-9-oninput/\n    document.addEventListener('selectionchange', function () {\n      var el = document.activeElement;\n      if (el && el.vmodel) {\n        trigger(el, 'input');\n      }\n    });\n  }\n\n  var directive = {\n    inserted: function inserted (el, binding, vnode, oldVnode) {\n      if (vnode.tag === 'select') {\n        // #6903\n        if (oldVnode.elm && !oldVnode.elm._vOptions) {\n          mergeVNodeHook(vnode, 'postpatch', function () {\n            directive.componentUpdated(el, binding, vnode);\n          });\n        } else {\n          setSelected(el, binding, vnode.context);\n        }\n        el._vOptions = [].map.call(el.options, getValue);\n      } else if (vnode.tag === 'textarea' || isTextInputType(el.type)) {\n        el._vModifiers = binding.modifiers;\n        if (!binding.modifiers.lazy) {\n          el.addEventListener('compositionstart', onCompositionStart);\n          el.addEventListener('compositionend', onCompositionEnd);\n          // Safari < 10.2 & UIWebView doesn't fire compositionend when\n          // switching focus before confirming composition choice\n          // this also fixes the issue where some browsers e.g. iOS Chrome\n          // fires \"change\" instead of \"input\" on autocomplete.\n          el.addEventListener('change', onCompositionEnd);\n          /* istanbul ignore if */\n          if (isIE9) {\n            el.vmodel = true;\n          }\n        }\n      }\n    },\n\n    componentUpdated: function componentUpdated (el, binding, vnode) {\n      if (vnode.tag === 'select') {\n        setSelected(el, binding, vnode.context);\n        // in case the options rendered by v-for have changed,\n        // it's possible that the value is out-of-sync with the rendered options.\n        // detect such cases and filter out values that no longer has a matching\n        // option in the DOM.\n        var prevOptions = el._vOptions;\n        var curOptions = el._vOptions = [].map.call(el.options, getValue);\n        if (curOptions.some(function (o, i) { return !looseEqual(o, prevOptions[i]); })) {\n          // trigger change event if\n          // no matching option found for at least one value\n          var needReset = el.multiple\n            ? binding.value.some(function (v) { return hasNoMatchingOption(v, curOptions); })\n            : binding.value !== binding.oldValue && hasNoMatchingOption(binding.value, curOptions);\n          if (needReset) {\n            trigger(el, 'change');\n          }\n        }\n      }\n    }\n  };\n\n  function setSelected (el, binding, vm) {\n    actuallySetSelected(el, binding, vm);\n    /* istanbul ignore if */\n    if (isIE || isEdge) {\n      setTimeout(function () {\n        actuallySetSelected(el, binding, vm);\n      }, 0);\n    }\n  }\n\n  function actuallySetSelected (el, binding, vm) {\n    var value = binding.value;\n    var isMultiple = el.multiple;\n    if (isMultiple && !Array.isArray(value)) {\n      warn(\n        \"<select multiple v-model=\\\"\" + (binding.expression) + \"\\\"> \" +\n        \"expects an Array value for its binding, but got \" + (Object.prototype.toString.call(value).slice(8, -1)),\n        vm\n      );\n      return\n    }\n    var selected, option;\n    for (var i = 0, l = el.options.length; i < l; i++) {\n      option = el.options[i];\n      if (isMultiple) {\n        selected = looseIndexOf(value, getValue(option)) > -1;\n        if (option.selected !== selected) {\n          option.selected = selected;\n        }\n      } else {\n        if (looseEqual(getValue(option), value)) {\n          if (el.selectedIndex !== i) {\n            el.selectedIndex = i;\n          }\n          return\n        }\n      }\n    }\n    if (!isMultiple) {\n      el.selectedIndex = -1;\n    }\n  }\n\n  function hasNoMatchingOption (value, options) {\n    return options.every(function (o) { return !looseEqual(o, value); })\n  }\n\n  function getValue (option) {\n    return '_value' in option\n      ? option._value\n      : option.value\n  }\n\n  function onCompositionStart (e) {\n    e.target.composing = true;\n  }\n\n  function onCompositionEnd (e) {\n    // prevent triggering an input event for no reason\n    if (!e.target.composing) { return }\n    e.target.composing = false;\n    trigger(e.target, 'input');\n  }\n\n  function trigger (el, type) {\n    var e = document.createEvent('HTMLEvents');\n    e.initEvent(type, true, true);\n    el.dispatchEvent(e);\n  }\n\n  /*  */\n\n  // recursively search for possible transition defined inside the component root\n  function locateNode (vnode) {\n    return vnode.componentInstance && (!vnode.data || !vnode.data.transition)\n      ? locateNode(vnode.componentInstance._vnode)\n      : vnode\n  }\n\n  var show = {\n    bind: function bind (el, ref, vnode) {\n      var value = ref.value;\n\n      vnode = locateNode(vnode);\n      var transition$$1 = vnode.data && vnode.data.transition;\n      var originalDisplay = el.__vOriginalDisplay =\n        el.style.display === 'none' ? '' : el.style.display;\n      if (value && transition$$1) {\n        vnode.data.show = true;\n        enter(vnode, function () {\n          el.style.display = originalDisplay;\n        });\n      } else {\n        el.style.display = value ? originalDisplay : 'none';\n      }\n    },\n\n    update: function update (el, ref, vnode) {\n      var value = ref.value;\n      var oldValue = ref.oldValue;\n\n      /* istanbul ignore if */\n      if (!value === !oldValue) { return }\n      vnode = locateNode(vnode);\n      var transition$$1 = vnode.data && vnode.data.transition;\n      if (transition$$1) {\n        vnode.data.show = true;\n        if (value) {\n          enter(vnode, function () {\n            el.style.display = el.__vOriginalDisplay;\n          });\n        } else {\n          leave(vnode, function () {\n            el.style.display = 'none';\n          });\n        }\n      } else {\n        el.style.display = value ? el.__vOriginalDisplay : 'none';\n      }\n    },\n\n    unbind: function unbind (\n      el,\n      binding,\n      vnode,\n      oldVnode,\n      isDestroy\n    ) {\n      if (!isDestroy) {\n        el.style.display = el.__vOriginalDisplay;\n      }\n    }\n  };\n\n  var platformDirectives = {\n    model: directive,\n    show: show\n  };\n\n  /*  */\n\n  var transitionProps = {\n    name: String,\n    appear: Boolean,\n    css: Boolean,\n    mode: String,\n    type: String,\n    enterClass: String,\n    leaveClass: String,\n    enterToClass: String,\n    leaveToClass: String,\n    enterActiveClass: String,\n    leaveActiveClass: String,\n    appearClass: String,\n    appearActiveClass: String,\n    appearToClass: String,\n    duration: [Number, String, Object]\n  };\n\n  // in case the child is also an abstract component, e.g. <keep-alive>\n  // we want to recursively retrieve the real component to be rendered\n  function getRealChild (vnode) {\n    var compOptions = vnode && vnode.componentOptions;\n    if (compOptions && compOptions.Ctor.options.abstract) {\n      return getRealChild(getFirstComponentChild(compOptions.children))\n    } else {\n      return vnode\n    }\n  }\n\n  function extractTransitionData (comp) {\n    var data = {};\n    var options = comp.$options;\n    // props\n    for (var key in options.propsData) {\n      data[key] = comp[key];\n    }\n    // events.\n    // extract listeners and pass them directly to the transition methods\n    var listeners = options._parentListeners;\n    for (var key$1 in listeners) {\n      data[camelize(key$1)] = listeners[key$1];\n    }\n    return data\n  }\n\n  function placeholder (h, rawChild) {\n    if (/\\d-keep-alive$/.test(rawChild.tag)) {\n      return h('keep-alive', {\n        props: rawChild.componentOptions.propsData\n      })\n    }\n  }\n\n  function hasParentTransition (vnode) {\n    while ((vnode = vnode.parent)) {\n      if (vnode.data.transition) {\n        return true\n      }\n    }\n  }\n\n  function isSameChild (child, oldChild) {\n    return oldChild.key === child.key && oldChild.tag === child.tag\n  }\n\n  var isNotTextNode = function (c) { return c.tag || isAsyncPlaceholder(c); };\n\n  var isVShowDirective = function (d) { return d.name === 'show'; };\n\n  var Transition = {\n    name: 'transition',\n    props: transitionProps,\n    abstract: true,\n\n    render: function render (h) {\n      var this$1 = this;\n\n      var children = this.$slots.default;\n      if (!children) {\n        return\n      }\n\n      // filter out text nodes (possible whitespaces)\n      children = children.filter(isNotTextNode);\n      /* istanbul ignore if */\n      if (!children.length) {\n        return\n      }\n\n      // warn multiple elements\n      if (children.length > 1) {\n        warn(\n          '<transition> can only be used on a single element. Use ' +\n          '<transition-group> for lists.',\n          this.$parent\n        );\n      }\n\n      var mode = this.mode;\n\n      // warn invalid mode\n      if (mode && mode !== 'in-out' && mode !== 'out-in'\n      ) {\n        warn(\n          'invalid <transition> mode: ' + mode,\n          this.$parent\n        );\n      }\n\n      var rawChild = children[0];\n\n      // if this is a component root node and the component's\n      // parent container node also has transition, skip.\n      if (hasParentTransition(this.$vnode)) {\n        return rawChild\n      }\n\n      // apply transition data to child\n      // use getRealChild() to ignore abstract components e.g. keep-alive\n      var child = getRealChild(rawChild);\n      /* istanbul ignore if */\n      if (!child) {\n        return rawChild\n      }\n\n      if (this._leaving) {\n        return placeholder(h, rawChild)\n      }\n\n      // ensure a key that is unique to the vnode type and to this transition\n      // component instance. This key will be used to remove pending leaving nodes\n      // during entering.\n      var id = \"__transition-\" + (this._uid) + \"-\";\n      child.key = child.key == null\n        ? child.isComment\n          ? id + 'comment'\n          : id + child.tag\n        : isPrimitive(child.key)\n          ? (String(child.key).indexOf(id) === 0 ? child.key : id + child.key)\n          : child.key;\n\n      var data = (child.data || (child.data = {})).transition = extractTransitionData(this);\n      var oldRawChild = this._vnode;\n      var oldChild = getRealChild(oldRawChild);\n\n      // mark v-show\n      // so that the transition module can hand over the control to the directive\n      if (child.data.directives && child.data.directives.some(isVShowDirective)) {\n        child.data.show = true;\n      }\n\n      if (\n        oldChild &&\n        oldChild.data &&\n        !isSameChild(child, oldChild) &&\n        !isAsyncPlaceholder(oldChild) &&\n        // #6687 component root is a comment node\n        !(oldChild.componentInstance && oldChild.componentInstance._vnode.isComment)\n      ) {\n        // replace old child transition data with fresh one\n        // important for dynamic transitions!\n        var oldData = oldChild.data.transition = extend({}, data);\n        // handle transition mode\n        if (mode === 'out-in') {\n          // return placeholder node and queue update when leave finishes\n          this._leaving = true;\n          mergeVNodeHook(oldData, 'afterLeave', function () {\n            this$1._leaving = false;\n            this$1.$forceUpdate();\n          });\n          return placeholder(h, rawChild)\n        } else if (mode === 'in-out') {\n          if (isAsyncPlaceholder(child)) {\n            return oldRawChild\n          }\n          var delayedLeave;\n          var performLeave = function () { delayedLeave(); };\n          mergeVNodeHook(data, 'afterEnter', performLeave);\n          mergeVNodeHook(data, 'enterCancelled', performLeave);\n          mergeVNodeHook(oldData, 'delayLeave', function (leave) { delayedLeave = leave; });\n        }\n      }\n\n      return rawChild\n    }\n  };\n\n  /*  */\n\n  var props = extend({\n    tag: String,\n    moveClass: String\n  }, transitionProps);\n\n  delete props.mode;\n\n  var TransitionGroup = {\n    props: props,\n\n    beforeMount: function beforeMount () {\n      var this$1 = this;\n\n      var update = this._update;\n      this._update = function (vnode, hydrating) {\n        var restoreActiveInstance = setActiveInstance(this$1);\n        // force removing pass\n        this$1.__patch__(\n          this$1._vnode,\n          this$1.kept,\n          false, // hydrating\n          true // removeOnly (!important, avoids unnecessary moves)\n        );\n        this$1._vnode = this$1.kept;\n        restoreActiveInstance();\n        update.call(this$1, vnode, hydrating);\n      };\n    },\n\n    render: function render (h) {\n      var tag = this.tag || this.$vnode.data.tag || 'span';\n      var map = Object.create(null);\n      var prevChildren = this.prevChildren = this.children;\n      var rawChildren = this.$slots.default || [];\n      var children = this.children = [];\n      var transitionData = extractTransitionData(this);\n\n      for (var i = 0; i < rawChildren.length; i++) {\n        var c = rawChildren[i];\n        if (c.tag) {\n          if (c.key != null && String(c.key).indexOf('__vlist') !== 0) {\n            children.push(c);\n            map[c.key] = c\n            ;(c.data || (c.data = {})).transition = transitionData;\n          } else {\n            var opts = c.componentOptions;\n            var name = opts ? (opts.Ctor.options.name || opts.tag || '') : c.tag;\n            warn((\"<transition-group> children must be keyed: <\" + name + \">\"));\n          }\n        }\n      }\n\n      if (prevChildren) {\n        var kept = [];\n        var removed = [];\n        for (var i$1 = 0; i$1 < prevChildren.length; i$1++) {\n          var c$1 = prevChildren[i$1];\n          c$1.data.transition = transitionData;\n          c$1.data.pos = c$1.elm.getBoundingClientRect();\n          if (map[c$1.key]) {\n            kept.push(c$1);\n          } else {\n            removed.push(c$1);\n          }\n        }\n        this.kept = h(tag, null, kept);\n        this.removed = removed;\n      }\n\n      return h(tag, null, children)\n    },\n\n    updated: function updated () {\n      var children = this.prevChildren;\n      var moveClass = this.moveClass || ((this.name || 'v') + '-move');\n      if (!children.length || !this.hasMove(children[0].elm, moveClass)) {\n        return\n      }\n\n      // we divide the work into three loops to avoid mixing DOM reads and writes\n      // in each iteration - which helps prevent layout thrashing.\n      children.forEach(callPendingCbs);\n      children.forEach(recordPosition);\n      children.forEach(applyTranslation);\n\n      // force reflow to put everything in position\n      // assign to this to avoid being removed in tree-shaking\n      // $flow-disable-line\n      this._reflow = document.body.offsetHeight;\n\n      children.forEach(function (c) {\n        if (c.data.moved) {\n          var el = c.elm;\n          var s = el.style;\n          addTransitionClass(el, moveClass);\n          s.transform = s.WebkitTransform = s.transitionDuration = '';\n          el.addEventListener(transitionEndEvent, el._moveCb = function cb (e) {\n            if (e && e.target !== el) {\n              return\n            }\n            if (!e || /transform$/.test(e.propertyName)) {\n              el.removeEventListener(transitionEndEvent, cb);\n              el._moveCb = null;\n              removeTransitionClass(el, moveClass);\n            }\n          });\n        }\n      });\n    },\n\n    methods: {\n      hasMove: function hasMove (el, moveClass) {\n        /* istanbul ignore if */\n        if (!hasTransition) {\n          return false\n        }\n        /* istanbul ignore if */\n        if (this._hasMove) {\n          return this._hasMove\n        }\n        // Detect whether an element with the move class applied has\n        // CSS transitions. Since the element may be inside an entering\n        // transition at this very moment, we make a clone of it and remove\n        // all other transition classes applied to ensure only the move class\n        // is applied.\n        var clone = el.cloneNode();\n        if (el._transitionClasses) {\n          el._transitionClasses.forEach(function (cls) { removeClass(clone, cls); });\n        }\n        addClass(clone, moveClass);\n        clone.style.display = 'none';\n        this.$el.appendChild(clone);\n        var info = getTransitionInfo(clone);\n        this.$el.removeChild(clone);\n        return (this._hasMove = info.hasTransform)\n      }\n    }\n  };\n\n  function callPendingCbs (c) {\n    /* istanbul ignore if */\n    if (c.elm._moveCb) {\n      c.elm._moveCb();\n    }\n    /* istanbul ignore if */\n    if (c.elm._enterCb) {\n      c.elm._enterCb();\n    }\n  }\n\n  function recordPosition (c) {\n    c.data.newPos = c.elm.getBoundingClientRect();\n  }\n\n  function applyTranslation (c) {\n    var oldPos = c.data.pos;\n    var newPos = c.data.newPos;\n    var dx = oldPos.left - newPos.left;\n    var dy = oldPos.top - newPos.top;\n    if (dx || dy) {\n      c.data.moved = true;\n      var s = c.elm.style;\n      s.transform = s.WebkitTransform = \"translate(\" + dx + \"px,\" + dy + \"px)\";\n      s.transitionDuration = '0s';\n    }\n  }\n\n  var platformComponents = {\n    Transition: Transition,\n    TransitionGroup: TransitionGroup\n  };\n\n  /*  */\n\n  // install platform specific utils\n  Vue.config.mustUseProp = mustUseProp;\n  Vue.config.isReservedTag = isReservedTag;\n  Vue.config.isReservedAttr = isReservedAttr;\n  Vue.config.getTagNamespace = getTagNamespace;\n  Vue.config.isUnknownElement = isUnknownElement;\n\n  // install platform runtime directives & components\n  extend(Vue.options.directives, platformDirectives);\n  extend(Vue.options.components, platformComponents);\n\n  // install platform patch function\n  Vue.prototype.__patch__ = inBrowser ? patch : noop;\n\n  // public mount method\n  Vue.prototype.$mount = function (\n    el,\n    hydrating\n  ) {\n    el = el && inBrowser ? query(el) : undefined;\n    return mountComponent(this, el, hydrating)\n  };\n\n  // devtools global hook\n  /* istanbul ignore next */\n  if (inBrowser) {\n    setTimeout(function () {\n      if (config.devtools) {\n        if (devtools) {\n          devtools.emit('init', Vue);\n        } else {\n          console[console.info ? 'info' : 'log'](\n            'Download the Vue Devtools extension for a better development experience:\\n' +\n            'https://github.com/vuejs/vue-devtools'\n          );\n        }\n      }\n      if (config.productionTip !== false &&\n        typeof console !== 'undefined'\n      ) {\n        console[console.info ? 'info' : 'log'](\n          \"You are running Vue in development mode.\\n\" +\n          \"Make sure to turn on production mode when deploying for production.\\n\" +\n          \"See more tips at https://vuejs.org/guide/deployment.html\"\n        );\n      }\n    }, 0);\n  }\n\n  /*  */\n\n  var defaultTagRE = /\\{\\{((?:.|\\r?\\n)+?)\\}\\}/g;\n  var regexEscapeRE = /[-.*+?^${}()|[\\]\\/\\\\]/g;\n\n  var buildRegex = cached(function (delimiters) {\n    var open = delimiters[0].replace(regexEscapeRE, '\\\\$&');\n    var close = delimiters[1].replace(regexEscapeRE, '\\\\$&');\n    return new RegExp(open + '((?:.|\\\\n)+?)' + close, 'g')\n  });\n\n\n\n  function parseText (\n    text,\n    delimiters\n  ) {\n    var tagRE = delimiters ? buildRegex(delimiters) : defaultTagRE;\n    if (!tagRE.test(text)) {\n      return\n    }\n    var tokens = [];\n    var rawTokens = [];\n    var lastIndex = tagRE.lastIndex = 0;\n    var match, index, tokenValue;\n    while ((match = tagRE.exec(text))) {\n      index = match.index;\n      // push text token\n      if (index > lastIndex) {\n        rawTokens.push(tokenValue = text.slice(lastIndex, index));\n        tokens.push(JSON.stringify(tokenValue));\n      }\n      // tag token\n      var exp = parseFilters(match[1].trim());\n      tokens.push((\"_s(\" + exp + \")\"));\n      rawTokens.push({ '@binding': exp });\n      lastIndex = index + match[0].length;\n    }\n    if (lastIndex < text.length) {\n      rawTokens.push(tokenValue = text.slice(lastIndex));\n      tokens.push(JSON.stringify(tokenValue));\n    }\n    return {\n      expression: tokens.join('+'),\n      tokens: rawTokens\n    }\n  }\n\n  /*  */\n\n  function transformNode (el, options) {\n    var warn = options.warn || baseWarn;\n    var staticClass = getAndRemoveAttr(el, 'class');\n    if (staticClass) {\n      var res = parseText(staticClass, options.delimiters);\n      if (res) {\n        warn(\n          \"class=\\\"\" + staticClass + \"\\\": \" +\n          'Interpolation inside attributes has been removed. ' +\n          'Use v-bind or the colon shorthand instead. For example, ' +\n          'instead of <div class=\"{{ val }}\">, use <div :class=\"val\">.',\n          el.rawAttrsMap['class']\n        );\n      }\n    }\n    if (staticClass) {\n      el.staticClass = JSON.stringify(staticClass);\n    }\n    var classBinding = getBindingAttr(el, 'class', false /* getStatic */);\n    if (classBinding) {\n      el.classBinding = classBinding;\n    }\n  }\n\n  function genData (el) {\n    var data = '';\n    if (el.staticClass) {\n      data += \"staticClass:\" + (el.staticClass) + \",\";\n    }\n    if (el.classBinding) {\n      data += \"class:\" + (el.classBinding) + \",\";\n    }\n    return data\n  }\n\n  var klass$1 = {\n    staticKeys: ['staticClass'],\n    transformNode: transformNode,\n    genData: genData\n  };\n\n  /*  */\n\n  function transformNode$1 (el, options) {\n    var warn = options.warn || baseWarn;\n    var staticStyle = getAndRemoveAttr(el, 'style');\n    if (staticStyle) {\n      /* istanbul ignore if */\n      {\n        var res = parseText(staticStyle, options.delimiters);\n        if (res) {\n          warn(\n            \"style=\\\"\" + staticStyle + \"\\\": \" +\n            'Interpolation inside attributes has been removed. ' +\n            'Use v-bind or the colon shorthand instead. For example, ' +\n            'instead of <div style=\"{{ val }}\">, use <div :style=\"val\">.',\n            el.rawAttrsMap['style']\n          );\n        }\n      }\n      el.staticStyle = JSON.stringify(parseStyleText(staticStyle));\n    }\n\n    var styleBinding = getBindingAttr(el, 'style', false /* getStatic */);\n    if (styleBinding) {\n      el.styleBinding = styleBinding;\n    }\n  }\n\n  function genData$1 (el) {\n    var data = '';\n    if (el.staticStyle) {\n      data += \"staticStyle:\" + (el.staticStyle) + \",\";\n    }\n    if (el.styleBinding) {\n      data += \"style:(\" + (el.styleBinding) + \"),\";\n    }\n    return data\n  }\n\n  var style$1 = {\n    staticKeys: ['staticStyle'],\n    transformNode: transformNode$1,\n    genData: genData$1\n  };\n\n  /*  */\n\n  var decoder;\n\n  var he = {\n    decode: function decode (html) {\n      decoder = decoder || document.createElement('div');\n      decoder.innerHTML = html;\n      return decoder.textContent\n    }\n  };\n\n  /*  */\n\n  var isUnaryTag = makeMap(\n    'area,base,br,col,embed,frame,hr,img,input,isindex,keygen,' +\n    'link,meta,param,source,track,wbr'\n  );\n\n  // Elements that you can, intentionally, leave open\n  // (and which close themselves)\n  var canBeLeftOpenTag = makeMap(\n    'colgroup,dd,dt,li,options,p,td,tfoot,th,thead,tr,source'\n  );\n\n  // HTML5 tags https://html.spec.whatwg.org/multipage/indices.html#elements-3\n  // Phrasing Content https://html.spec.whatwg.org/multipage/dom.html#phrasing-content\n  var isNonPhrasingTag = makeMap(\n    'address,article,aside,base,blockquote,body,caption,col,colgroup,dd,' +\n    'details,dialog,div,dl,dt,fieldset,figcaption,figure,footer,form,' +\n    'h1,h2,h3,h4,h5,h6,head,header,hgroup,hr,html,legend,li,menuitem,meta,' +\n    'optgroup,option,param,rp,rt,source,style,summary,tbody,td,tfoot,th,thead,' +\n    'title,tr,track'\n  );\n\n  /**\n   * Not type-checking this file because it's mostly vendor code.\n   */\n\n  // Regular Expressions for parsing tags and attributes\n  var attribute = /^\\s*([^\\s\"'<>\\/=]+)(?:\\s*(=)\\s*(?:\"([^\"]*)\"+|'([^']*)'+|([^\\s\"'=<>`]+)))?/;\n  var dynamicArgAttribute = /^\\s*((?:v-[\\w-]+:|@|:|#)\\[[^=]+\\][^\\s\"'<>\\/=]*)(?:\\s*(=)\\s*(?:\"([^\"]*)\"+|'([^']*)'+|([^\\s\"'=<>`]+)))?/;\n  var ncname = \"[a-zA-Z_][\\\\-\\\\.0-9_a-zA-Z\" + unicodeLetters + \"]*\";\n  var qnameCapture = \"((?:\" + ncname + \"\\\\:)?\" + ncname + \")\";\n  var startTagOpen = new RegExp((\"^<\" + qnameCapture));\n  var startTagClose = /^\\s*(\\/?)>/;\n  var endTag = new RegExp((\"^<\\\\/\" + qnameCapture + \"[^>]*>\"));\n  var doctype = /^<!DOCTYPE [^>]+>/i;\n  // #7298: escape - to avoid being pased as HTML comment when inlined in page\n  var comment = /^<!\\--/;\n  var conditionalComment = /^<!\\[/;\n\n  // Special Elements (can contain anything)\n  var isPlainTextElement = makeMap('script,style,textarea', true);\n  var reCache = {};\n\n  var decodingMap = {\n    '&lt;': '<',\n    '&gt;': '>',\n    '&quot;': '\"',\n    '&amp;': '&',\n    '&#10;': '\\n',\n    '&#9;': '\\t',\n    '&#39;': \"'\"\n  };\n  var encodedAttr = /&(?:lt|gt|quot|amp|#39);/g;\n  var encodedAttrWithNewLines = /&(?:lt|gt|quot|amp|#39|#10|#9);/g;\n\n  // #5992\n  var isIgnoreNewlineTag = makeMap('pre,textarea', true);\n  var shouldIgnoreFirstNewline = function (tag, html) { return tag && isIgnoreNewlineTag(tag) && html[0] === '\\n'; };\n\n  function decodeAttr (value, shouldDecodeNewlines) {\n    var re = shouldDecodeNewlines ? encodedAttrWithNewLines : encodedAttr;\n    return value.replace(re, function (match) { return decodingMap[match]; })\n  }\n\n  function parseHTML (html, options) {\n    var stack = [];\n    var expectHTML = options.expectHTML;\n    var isUnaryTag$$1 = options.isUnaryTag || no;\n    var canBeLeftOpenTag$$1 = options.canBeLeftOpenTag || no;\n    var index = 0;\n    var last, lastTag;\n    while (html) {\n      last = html;\n      // Make sure we're not in a plaintext content element like script/style\n      if (!lastTag || !isPlainTextElement(lastTag)) {\n        var textEnd = html.indexOf('<');\n        if (textEnd === 0) {\n          // Comment:\n          if (comment.test(html)) {\n            var commentEnd = html.indexOf('-->');\n\n            if (commentEnd >= 0) {\n              if (options.shouldKeepComment) {\n                options.comment(html.substring(4, commentEnd), index, index + commentEnd + 3);\n              }\n              advance(commentEnd + 3);\n              continue\n            }\n          }\n\n          // http://en.wikipedia.org/wiki/Conditional_comment#Downlevel-revealed_conditional_comment\n          if (conditionalComment.test(html)) {\n            var conditionalEnd = html.indexOf(']>');\n\n            if (conditionalEnd >= 0) {\n              advance(conditionalEnd + 2);\n              continue\n            }\n          }\n\n          // Doctype:\n          var doctypeMatch = html.match(doctype);\n          if (doctypeMatch) {\n            advance(doctypeMatch[0].length);\n            continue\n          }\n\n          // End tag:\n          var endTagMatch = html.match(endTag);\n          if (endTagMatch) {\n            var curIndex = index;\n            advance(endTagMatch[0].length);\n            parseEndTag(endTagMatch[1], curIndex, index);\n            continue\n          }\n\n          // Start tag:\n          var startTagMatch = parseStartTag();\n          if (startTagMatch) {\n            handleStartTag(startTagMatch);\n            if (shouldIgnoreFirstNewline(startTagMatch.tagName, html)) {\n              advance(1);\n            }\n            continue\n          }\n        }\n\n        var text = (void 0), rest = (void 0), next = (void 0);\n        if (textEnd >= 0) {\n          rest = html.slice(textEnd);\n          while (\n            !endTag.test(rest) &&\n            !startTagOpen.test(rest) &&\n            !comment.test(rest) &&\n            !conditionalComment.test(rest)\n          ) {\n            // < in plain text, be forgiving and treat it as text\n            next = rest.indexOf('<', 1);\n            if (next < 0) { break }\n            textEnd += next;\n            rest = html.slice(textEnd);\n          }\n          text = html.substring(0, textEnd);\n        }\n\n        if (textEnd < 0) {\n          text = html;\n        }\n\n        if (text) {\n          advance(text.length);\n        }\n\n        if (options.chars && text) {\n          options.chars(text, index - text.length, index);\n        }\n      } else {\n        var endTagLength = 0;\n        var stackedTag = lastTag.toLowerCase();\n        var reStackedTag = reCache[stackedTag] || (reCache[stackedTag] = new RegExp('([\\\\s\\\\S]*?)(</' + stackedTag + '[^>]*>)', 'i'));\n        var rest$1 = html.replace(reStackedTag, function (all, text, endTag) {\n          endTagLength = endTag.length;\n          if (!isPlainTextElement(stackedTag) && stackedTag !== 'noscript') {\n            text = text\n              .replace(/<!\\--([\\s\\S]*?)-->/g, '$1') // #7298\n              .replace(/<!\\[CDATA\\[([\\s\\S]*?)]]>/g, '$1');\n          }\n          if (shouldIgnoreFirstNewline(stackedTag, text)) {\n            text = text.slice(1);\n          }\n          if (options.chars) {\n            options.chars(text);\n          }\n          return ''\n        });\n        index += html.length - rest$1.length;\n        html = rest$1;\n        parseEndTag(stackedTag, index - endTagLength, index);\n      }\n\n      if (html === last) {\n        options.chars && options.chars(html);\n        if (!stack.length && options.warn) {\n          options.warn((\"Mal-formatted tag at end of template: \\\"\" + html + \"\\\"\"), { start: index + html.length });\n        }\n        break\n      }\n    }\n\n    // Clean up any remaining tags\n    parseEndTag();\n\n    function advance (n) {\n      index += n;\n      html = html.substring(n);\n    }\n\n    function parseStartTag () {\n      var start = html.match(startTagOpen);\n      if (start) {\n        var match = {\n          tagName: start[1],\n          attrs: [],\n          start: index\n        };\n        advance(start[0].length);\n        var end, attr;\n        while (!(end = html.match(startTagClose)) && (attr = html.match(dynamicArgAttribute) || html.match(attribute))) {\n          attr.start = index;\n          advance(attr[0].length);\n          attr.end = index;\n          match.attrs.push(attr);\n        }\n        if (end) {\n          match.unarySlash = end[1];\n          advance(end[0].length);\n          match.end = index;\n          return match\n        }\n      }\n    }\n\n    function handleStartTag (match) {\n      var tagName = match.tagName;\n      var unarySlash = match.unarySlash;\n\n      if (expectHTML) {\n        if (lastTag === 'p' && isNonPhrasingTag(tagName)) {\n          parseEndTag(lastTag);\n        }\n        if (canBeLeftOpenTag$$1(tagName) && lastTag === tagName) {\n          parseEndTag(tagName);\n        }\n      }\n\n      var unary = isUnaryTag$$1(tagName) || !!unarySlash;\n\n      var l = match.attrs.length;\n      var attrs = new Array(l);\n      for (var i = 0; i < l; i++) {\n        var args = match.attrs[i];\n        var value = args[3] || args[4] || args[5] || '';\n        var shouldDecodeNewlines = tagName === 'a' && args[1] === 'href'\n          ? options.shouldDecodeNewlinesForHref\n          : options.shouldDecodeNewlines;\n        attrs[i] = {\n          name: args[1],\n          value: decodeAttr(value, shouldDecodeNewlines)\n        };\n        if (options.outputSourceRange) {\n          attrs[i].start = args.start + args[0].match(/^\\s*/).length;\n          attrs[i].end = args.end;\n        }\n      }\n\n      if (!unary) {\n        stack.push({ tag: tagName, lowerCasedTag: tagName.toLowerCase(), attrs: attrs, start: match.start, end: match.end });\n        lastTag = tagName;\n      }\n\n      if (options.start) {\n        options.start(tagName, attrs, unary, match.start, match.end);\n      }\n    }\n\n    function parseEndTag (tagName, start, end) {\n      var pos, lowerCasedTagName;\n      if (start == null) { start = index; }\n      if (end == null) { end = index; }\n\n      // Find the closest opened tag of the same type\n      if (tagName) {\n        lowerCasedTagName = tagName.toLowerCase();\n        for (pos = stack.length - 1; pos >= 0; pos--) {\n          if (stack[pos].lowerCasedTag === lowerCasedTagName) {\n            break\n          }\n        }\n      } else {\n        // If no tag name is provided, clean shop\n        pos = 0;\n      }\n\n      if (pos >= 0) {\n        // Close all the open elements, up the stack\n        for (var i = stack.length - 1; i >= pos; i--) {\n          if (i > pos || !tagName &&\n            options.warn\n          ) {\n            options.warn(\n              (\"tag <\" + (stack[i].tag) + \"> has no matching end tag.\"),\n              { start: stack[i].start }\n            );\n          }\n          if (options.end) {\n            options.end(stack[i].tag, start, end);\n          }\n        }\n\n        // Remove the open elements from the stack\n        stack.length = pos;\n        lastTag = pos && stack[pos - 1].tag;\n      } else if (lowerCasedTagName === 'br') {\n        if (options.start) {\n          options.start(tagName, [], true, start, end);\n        }\n      } else if (lowerCasedTagName === 'p') {\n        if (options.start) {\n          options.start(tagName, [], false, start, end);\n        }\n        if (options.end) {\n          options.end(tagName, start, end);\n        }\n      }\n    }\n  }\n\n  /*  */\n\n  var onRE = /^@|^v-on:/;\n  var dirRE = /^v-|^@|^:/;\n  var forAliasRE = /([\\s\\S]*?)\\s+(?:in|of)\\s+([\\s\\S]*)/;\n  var forIteratorRE = /,([^,\\}\\]]*)(?:,([^,\\}\\]]*))?$/;\n  var stripParensRE = /^\\(|\\)$/g;\n  var dynamicArgRE = /^\\[.*\\]$/;\n\n  var argRE = /:(.*)$/;\n  var bindRE = /^:|^\\.|^v-bind:/;\n  var modifierRE = /\\.[^.]+/g;\n\n  var slotRE = /^v-slot(:|$)|^#/;\n\n  var lineBreakRE = /[\\r\\n]/;\n  var whitespaceRE$1 = /\\s+/g;\n\n  var invalidAttributeRE = /[\\s\"'<>\\/=]/;\n\n  var decodeHTMLCached = cached(he.decode);\n\n  var emptySlotScopeToken = \"_empty_\";\n\n  // configurable state\n  var warn$2;\n  var delimiters;\n  var transforms;\n  var preTransforms;\n  var postTransforms;\n  var platformIsPreTag;\n  var platformMustUseProp;\n  var platformGetTagNamespace;\n  var maybeComponent;\n\n  function createASTElement (\n    tag,\n    attrs,\n    parent\n  ) {\n    return {\n      type: 1,\n      tag: tag,\n      attrsList: attrs,\n      attrsMap: makeAttrsMap(attrs),\n      rawAttrsMap: {},\n      parent: parent,\n      children: []\n    }\n  }\n\n  /**\n   * Convert HTML string to AST.\n   */\n  function parse (\n    template,\n    options\n  ) {\n    warn$2 = options.warn || baseWarn;\n\n    platformIsPreTag = options.isPreTag || no;\n    platformMustUseProp = options.mustUseProp || no;\n    platformGetTagNamespace = options.getTagNamespace || no;\n    var isReservedTag = options.isReservedTag || no;\n    maybeComponent = function (el) { return !!el.component || !isReservedTag(el.tag); };\n\n    transforms = pluckModuleFunction(options.modules, 'transformNode');\n    preTransforms = pluckModuleFunction(options.modules, 'preTransformNode');\n    postTransforms = pluckModuleFunction(options.modules, 'postTransformNode');\n\n    delimiters = options.delimiters;\n\n    var stack = [];\n    var preserveWhitespace = options.preserveWhitespace !== false;\n    var whitespaceOption = options.whitespace;\n    var root;\n    var currentParent;\n    var inVPre = false;\n    var inPre = false;\n    var warned = false;\n\n    function warnOnce (msg, range) {\n      if (!warned) {\n        warned = true;\n        warn$2(msg, range);\n      }\n    }\n\n    function closeElement (element) {\n      trimEndingWhitespace(element);\n      if (!inVPre && !element.processed) {\n        element = processElement(element, options);\n      }\n      // tree management\n      if (!stack.length && element !== root) {\n        // allow root elements with v-if, v-else-if and v-else\n        if (root.if && (element.elseif || element.else)) {\n          {\n            checkRootConstraints(element);\n          }\n          addIfCondition(root, {\n            exp: element.elseif,\n            block: element\n          });\n        } else {\n          warnOnce(\n            \"Component template should contain exactly one root element. \" +\n            \"If you are using v-if on multiple elements, \" +\n            \"use v-else-if to chain them instead.\",\n            { start: element.start }\n          );\n        }\n      }\n      if (currentParent && !element.forbidden) {\n        if (element.elseif || element.else) {\n          processIfConditions(element, currentParent);\n        } else {\n          if (element.slotScope) {\n            // scoped slot\n            // keep it in the children list so that v-else(-if) conditions can\n            // find it as the prev node.\n            var name = element.slotTarget || '\"default\"'\n            ;(currentParent.scopedSlots || (currentParent.scopedSlots = {}))[name] = element;\n          }\n          currentParent.children.push(element);\n          element.parent = currentParent;\n        }\n      }\n\n      // final children cleanup\n      // filter out scoped slots\n      element.children = element.children.filter(function (c) { return !(c).slotScope; });\n      // remove trailing whitespace node again\n      trimEndingWhitespace(element);\n\n      // check pre state\n      if (element.pre) {\n        inVPre = false;\n      }\n      if (platformIsPreTag(element.tag)) {\n        inPre = false;\n      }\n      // apply post-transforms\n      for (var i = 0; i < postTransforms.length; i++) {\n        postTransforms[i](element, options);\n      }\n    }\n\n    function trimEndingWhitespace (el) {\n      // remove trailing whitespace node\n      if (!inPre) {\n        var lastNode;\n        while (\n          (lastNode = el.children[el.children.length - 1]) &&\n          lastNode.type === 3 &&\n          lastNode.text === ' '\n        ) {\n          el.children.pop();\n        }\n      }\n    }\n\n    function checkRootConstraints (el) {\n      if (el.tag === 'slot' || el.tag === 'template') {\n        warnOnce(\n          \"Cannot use <\" + (el.tag) + \"> as component root element because it may \" +\n          'contain multiple nodes.',\n          { start: el.start }\n        );\n      }\n      if (el.attrsMap.hasOwnProperty('v-for')) {\n        warnOnce(\n          'Cannot use v-for on stateful component root element because ' +\n          'it renders multiple elements.',\n          el.rawAttrsMap['v-for']\n        );\n      }\n    }\n\n    parseHTML(template, {\n      warn: warn$2,\n      expectHTML: options.expectHTML,\n      isUnaryTag: options.isUnaryTag,\n      canBeLeftOpenTag: options.canBeLeftOpenTag,\n      shouldDecodeNewlines: options.shouldDecodeNewlines,\n      shouldDecodeNewlinesForHref: options.shouldDecodeNewlinesForHref,\n      shouldKeepComment: options.comments,\n      outputSourceRange: options.outputSourceRange,\n      start: function start (tag, attrs, unary, start$1) {\n        // check namespace.\n        // inherit parent ns if there is one\n        var ns = (currentParent && currentParent.ns) || platformGetTagNamespace(tag);\n\n        // handle IE svg bug\n        /* istanbul ignore if */\n        if (isIE && ns === 'svg') {\n          attrs = guardIESVGBug(attrs);\n        }\n\n        var element = createASTElement(tag, attrs, currentParent);\n        if (ns) {\n          element.ns = ns;\n        }\n\n        {\n          if (options.outputSourceRange) {\n            element.start = start$1;\n            element.rawAttrsMap = element.attrsList.reduce(function (cumulated, attr) {\n              cumulated[attr.name] = attr;\n              return cumulated\n            }, {});\n          }\n          attrs.forEach(function (attr) {\n            if (invalidAttributeRE.test(attr.name)) {\n              warn$2(\n                \"Invalid dynamic argument expression: attribute names cannot contain \" +\n                \"spaces, quotes, <, >, / or =.\",\n                {\n                  start: attr.start + attr.name.indexOf(\"[\"),\n                  end: attr.start + attr.name.length\n                }\n              );\n            }\n          });\n        }\n\n        if (isForbiddenTag(element) && !isServerRendering()) {\n          element.forbidden = true;\n          warn$2(\n            'Templates should only be responsible for mapping the state to the ' +\n            'UI. Avoid placing tags with side-effects in your templates, such as ' +\n            \"<\" + tag + \">\" + ', as they will not be parsed.',\n            { start: element.start }\n          );\n        }\n\n        // apply pre-transforms\n        for (var i = 0; i < preTransforms.length; i++) {\n          element = preTransforms[i](element, options) || element;\n        }\n\n        if (!inVPre) {\n          processPre(element);\n          if (element.pre) {\n            inVPre = true;\n          }\n        }\n        if (platformIsPreTag(element.tag)) {\n          inPre = true;\n        }\n        if (inVPre) {\n          processRawAttrs(element);\n        } else if (!element.processed) {\n          // structural directives\n          processFor(element);\n          processIf(element);\n          processOnce(element);\n        }\n\n        if (!root) {\n          root = element;\n          {\n            checkRootConstraints(root);\n          }\n        }\n\n        if (!unary) {\n          currentParent = element;\n          stack.push(element);\n        } else {\n          closeElement(element);\n        }\n      },\n\n      end: function end (tag, start, end$1) {\n        var element = stack[stack.length - 1];\n        // pop stack\n        stack.length -= 1;\n        currentParent = stack[stack.length - 1];\n        if (options.outputSourceRange) {\n          element.end = end$1;\n        }\n        closeElement(element);\n      },\n\n      chars: function chars (text, start, end) {\n        if (!currentParent) {\n          {\n            if (text === template) {\n              warnOnce(\n                'Component template requires a root element, rather than just text.',\n                { start: start }\n              );\n            } else if ((text = text.trim())) {\n              warnOnce(\n                (\"text \\\"\" + text + \"\\\" outside root element will be ignored.\"),\n                { start: start }\n              );\n            }\n          }\n          return\n        }\n        // IE textarea placeholder bug\n        /* istanbul ignore if */\n        if (isIE &&\n          currentParent.tag === 'textarea' &&\n          currentParent.attrsMap.placeholder === text\n        ) {\n          return\n        }\n        var children = currentParent.children;\n        if (inPre || text.trim()) {\n          text = isTextTag(currentParent) ? text : decodeHTMLCached(text);\n        } else if (!children.length) {\n          // remove the whitespace-only node right after an opening tag\n          text = '';\n        } else if (whitespaceOption) {\n          if (whitespaceOption === 'condense') {\n            // in condense mode, remove the whitespace node if it contains\n            // line break, otherwise condense to a single space\n            text = lineBreakRE.test(text) ? '' : ' ';\n          } else {\n            text = ' ';\n          }\n        } else {\n          text = preserveWhitespace ? ' ' : '';\n        }\n        if (text) {\n          if (whitespaceOption === 'condense') {\n            // condense consecutive whitespaces into single space\n            text = text.replace(whitespaceRE$1, ' ');\n          }\n          var res;\n          var child;\n          if (!inVPre && text !== ' ' && (res = parseText(text, delimiters))) {\n            child = {\n              type: 2,\n              expression: res.expression,\n              tokens: res.tokens,\n              text: text\n            };\n          } else if (text !== ' ' || !children.length || children[children.length - 1].text !== ' ') {\n            child = {\n              type: 3,\n              text: text\n            };\n          }\n          if (child) {\n            if (options.outputSourceRange) {\n              child.start = start;\n              child.end = end;\n            }\n            children.push(child);\n          }\n        }\n      },\n      comment: function comment (text, start, end) {\n        // adding anyting as a sibling to the root node is forbidden\n        // comments should still be allowed, but ignored\n        if (currentParent) {\n          var child = {\n            type: 3,\n            text: text,\n            isComment: true\n          };\n          if (options.outputSourceRange) {\n            child.start = start;\n            child.end = end;\n          }\n          currentParent.children.push(child);\n        }\n      }\n    });\n    return root\n  }\n\n  function processPre (el) {\n    if (getAndRemoveAttr(el, 'v-pre') != null) {\n      el.pre = true;\n    }\n  }\n\n  function processRawAttrs (el) {\n    var list = el.attrsList;\n    var len = list.length;\n    if (len) {\n      var attrs = el.attrs = new Array(len);\n      for (var i = 0; i < len; i++) {\n        attrs[i] = {\n          name: list[i].name,\n          value: JSON.stringify(list[i].value)\n        };\n        if (list[i].start != null) {\n          attrs[i].start = list[i].start;\n          attrs[i].end = list[i].end;\n        }\n      }\n    } else if (!el.pre) {\n      // non root node in pre blocks with no attributes\n      el.plain = true;\n    }\n  }\n\n  function processElement (\n    element,\n    options\n  ) {\n    processKey(element);\n\n    // determine whether this is a plain element after\n    // removing structural attributes\n    element.plain = (\n      !element.key &&\n      !element.scopedSlots &&\n      !element.attrsList.length\n    );\n\n    processRef(element);\n    processSlotContent(element);\n    processSlotOutlet(element);\n    processComponent(element);\n    for (var i = 0; i < transforms.length; i++) {\n      element = transforms[i](element, options) || element;\n    }\n    processAttrs(element);\n    return element\n  }\n\n  function processKey (el) {\n    var exp = getBindingAttr(el, 'key');\n    if (exp) {\n      {\n        if (el.tag === 'template') {\n          warn$2(\n            \"<template> cannot be keyed. Place the key on real elements instead.\",\n            getRawBindingAttr(el, 'key')\n          );\n        }\n        if (el.for) {\n          var iterator = el.iterator2 || el.iterator1;\n          var parent = el.parent;\n          if (iterator && iterator === exp && parent && parent.tag === 'transition-group') {\n            warn$2(\n              \"Do not use v-for index as key on <transition-group> children, \" +\n              \"this is the same as not using keys.\",\n              getRawBindingAttr(el, 'key'),\n              true /* tip */\n            );\n          }\n        }\n      }\n      el.key = exp;\n    }\n  }\n\n  function processRef (el) {\n    var ref = getBindingAttr(el, 'ref');\n    if (ref) {\n      el.ref = ref;\n      el.refInFor = checkInFor(el);\n    }\n  }\n\n  function processFor (el) {\n    var exp;\n    if ((exp = getAndRemoveAttr(el, 'v-for'))) {\n      var res = parseFor(exp);\n      if (res) {\n        extend(el, res);\n      } else {\n        warn$2(\n          (\"Invalid v-for expression: \" + exp),\n          el.rawAttrsMap['v-for']\n        );\n      }\n    }\n  }\n\n\n\n  function parseFor (exp) {\n    var inMatch = exp.match(forAliasRE);\n    if (!inMatch) { return }\n    var res = {};\n    res.for = inMatch[2].trim();\n    var alias = inMatch[1].trim().replace(stripParensRE, '');\n    var iteratorMatch = alias.match(forIteratorRE);\n    if (iteratorMatch) {\n      res.alias = alias.replace(forIteratorRE, '').trim();\n      res.iterator1 = iteratorMatch[1].trim();\n      if (iteratorMatch[2]) {\n        res.iterator2 = iteratorMatch[2].trim();\n      }\n    } else {\n      res.alias = alias;\n    }\n    return res\n  }\n\n  function processIf (el) {\n    var exp = getAndRemoveAttr(el, 'v-if');\n    if (exp) {\n      el.if = exp;\n      addIfCondition(el, {\n        exp: exp,\n        block: el\n      });\n    } else {\n      if (getAndRemoveAttr(el, 'v-else') != null) {\n        el.else = true;\n      }\n      var elseif = getAndRemoveAttr(el, 'v-else-if');\n      if (elseif) {\n        el.elseif = elseif;\n      }\n    }\n  }\n\n  function processIfConditions (el, parent) {\n    var prev = findPrevElement(parent.children);\n    if (prev && prev.if) {\n      addIfCondition(prev, {\n        exp: el.elseif,\n        block: el\n      });\n    } else {\n      warn$2(\n        \"v-\" + (el.elseif ? ('else-if=\"' + el.elseif + '\"') : 'else') + \" \" +\n        \"used on element <\" + (el.tag) + \"> without corresponding v-if.\",\n        el.rawAttrsMap[el.elseif ? 'v-else-if' : 'v-else']\n      );\n    }\n  }\n\n  function findPrevElement (children) {\n    var i = children.length;\n    while (i--) {\n      if (children[i].type === 1) {\n        return children[i]\n      } else {\n        if (children[i].text !== ' ') {\n          warn$2(\n            \"text \\\"\" + (children[i].text.trim()) + \"\\\" between v-if and v-else(-if) \" +\n            \"will be ignored.\",\n            children[i]\n          );\n        }\n        children.pop();\n      }\n    }\n  }\n\n  function addIfCondition (el, condition) {\n    if (!el.ifConditions) {\n      el.ifConditions = [];\n    }\n    el.ifConditions.push(condition);\n  }\n\n  function processOnce (el) {\n    var once$$1 = getAndRemoveAttr(el, 'v-once');\n    if (once$$1 != null) {\n      el.once = true;\n    }\n  }\n\n  // handle content being passed to a component as slot,\n  // e.g. <template slot=\"xxx\">, <div slot-scope=\"xxx\">\n  function processSlotContent (el) {\n    var slotScope;\n    if (el.tag === 'template') {\n      slotScope = getAndRemoveAttr(el, 'scope');\n      /* istanbul ignore if */\n      if (slotScope) {\n        warn$2(\n          \"the \\\"scope\\\" attribute for scoped slots have been deprecated and \" +\n          \"replaced by \\\"slot-scope\\\" since 2.5. The new \\\"slot-scope\\\" attribute \" +\n          \"can also be used on plain elements in addition to <template> to \" +\n          \"denote scoped slots.\",\n          el.rawAttrsMap['scope'],\n          true\n        );\n      }\n      el.slotScope = slotScope || getAndRemoveAttr(el, 'slot-scope');\n    } else if ((slotScope = getAndRemoveAttr(el, 'slot-scope'))) {\n      /* istanbul ignore if */\n      if (el.attrsMap['v-for']) {\n        warn$2(\n          \"Ambiguous combined usage of slot-scope and v-for on <\" + (el.tag) + \"> \" +\n          \"(v-for takes higher priority). Use a wrapper <template> for the \" +\n          \"scoped slot to make it clearer.\",\n          el.rawAttrsMap['slot-scope'],\n          true\n        );\n      }\n      el.slotScope = slotScope;\n    }\n\n    // slot=\"xxx\"\n    var slotTarget = getBindingAttr(el, 'slot');\n    if (slotTarget) {\n      el.slotTarget = slotTarget === '\"\"' ? '\"default\"' : slotTarget;\n      el.slotTargetDynamic = !!(el.attrsMap[':slot'] || el.attrsMap['v-bind:slot']);\n      // preserve slot as an attribute for native shadow DOM compat\n      // only for non-scoped slots.\n      if (el.tag !== 'template' && !el.slotScope) {\n        addAttr(el, 'slot', slotTarget, getRawBindingAttr(el, 'slot'));\n      }\n    }\n\n    // 2.6 v-slot syntax\n    {\n      if (el.tag === 'template') {\n        // v-slot on <template>\n        var slotBinding = getAndRemoveAttrByRegex(el, slotRE);\n        if (slotBinding) {\n          {\n            if (el.slotTarget || el.slotScope) {\n              warn$2(\n                \"Unexpected mixed usage of different slot syntaxes.\",\n                el\n              );\n            }\n            if (el.parent && !maybeComponent(el.parent)) {\n              warn$2(\n                \"<template v-slot> can only appear at the root level inside \" +\n                \"the receiving the component\",\n                el\n              );\n            }\n          }\n          var ref = getSlotName(slotBinding);\n          var name = ref.name;\n          var dynamic = ref.dynamic;\n          el.slotTarget = name;\n          el.slotTargetDynamic = dynamic;\n          el.slotScope = slotBinding.value || emptySlotScopeToken; // force it into a scoped slot for perf\n        }\n      } else {\n        // v-slot on component, denotes default slot\n        var slotBinding$1 = getAndRemoveAttrByRegex(el, slotRE);\n        if (slotBinding$1) {\n          {\n            if (!maybeComponent(el)) {\n              warn$2(\n                \"v-slot can only be used on components or <template>.\",\n                slotBinding$1\n              );\n            }\n            if (el.slotScope || el.slotTarget) {\n              warn$2(\n                \"Unexpected mixed usage of different slot syntaxes.\",\n                el\n              );\n            }\n            if (el.scopedSlots) {\n              warn$2(\n                \"To avoid scope ambiguity, the default slot should also use \" +\n                \"<template> syntax when there are other named slots.\",\n                slotBinding$1\n              );\n            }\n          }\n          // add the component's children to its default slot\n          var slots = el.scopedSlots || (el.scopedSlots = {});\n          var ref$1 = getSlotName(slotBinding$1);\n          var name$1 = ref$1.name;\n          var dynamic$1 = ref$1.dynamic;\n          var slotContainer = slots[name$1] = createASTElement('template', [], el);\n          slotContainer.slotTarget = name$1;\n          slotContainer.slotTargetDynamic = dynamic$1;\n          slotContainer.children = el.children.filter(function (c) {\n            if (!c.slotScope) {\n              c.parent = slotContainer;\n              return true\n            }\n          });\n          slotContainer.slotScope = slotBinding$1.value || emptySlotScopeToken;\n          // remove children as they are returned from scopedSlots now\n          el.children = [];\n          // mark el non-plain so data gets generated\n          el.plain = false;\n        }\n      }\n    }\n  }\n\n  function getSlotName (binding) {\n    var name = binding.name.replace(slotRE, '');\n    if (!name) {\n      if (binding.name[0] !== '#') {\n        name = 'default';\n      } else {\n        warn$2(\n          \"v-slot shorthand syntax requires a slot name.\",\n          binding\n        );\n      }\n    }\n    return dynamicArgRE.test(name)\n      // dynamic [name]\n      ? { name: name.slice(1, -1), dynamic: true }\n      // static name\n      : { name: (\"\\\"\" + name + \"\\\"\"), dynamic: false }\n  }\n\n  // handle <slot/> outlets\n  function processSlotOutlet (el) {\n    if (el.tag === 'slot') {\n      el.slotName = getBindingAttr(el, 'name');\n      if (el.key) {\n        warn$2(\n          \"`key` does not work on <slot> because slots are abstract outlets \" +\n          \"and can possibly expand into multiple elements. \" +\n          \"Use the key on a wrapping element instead.\",\n          getRawBindingAttr(el, 'key')\n        );\n      }\n    }\n  }\n\n  function processComponent (el) {\n    var binding;\n    if ((binding = getBindingAttr(el, 'is'))) {\n      el.component = binding;\n    }\n    if (getAndRemoveAttr(el, 'inline-template') != null) {\n      el.inlineTemplate = true;\n    }\n  }\n\n  function processAttrs (el) {\n    var list = el.attrsList;\n    var i, l, name, rawName, value, modifiers, syncGen, isDynamic;\n    for (i = 0, l = list.length; i < l; i++) {\n      name = rawName = list[i].name;\n      value = list[i].value;\n      if (dirRE.test(name)) {\n        // mark element as dynamic\n        el.hasBindings = true;\n        // modifiers\n        modifiers = parseModifiers(name.replace(dirRE, ''));\n        // support .foo shorthand syntax for the .prop modifier\n        if (modifiers) {\n          name = name.replace(modifierRE, '');\n        }\n        if (bindRE.test(name)) { // v-bind\n          name = name.replace(bindRE, '');\n          value = parseFilters(value);\n          isDynamic = dynamicArgRE.test(name);\n          if (isDynamic) {\n            name = name.slice(1, -1);\n          }\n          if (\n            value.trim().length === 0\n          ) {\n            warn$2(\n              (\"The value for a v-bind expression cannot be empty. Found in \\\"v-bind:\" + name + \"\\\"\")\n            );\n          }\n          if (modifiers) {\n            if (modifiers.prop && !isDynamic) {\n              name = camelize(name);\n              if (name === 'innerHtml') { name = 'innerHTML'; }\n            }\n            if (modifiers.camel && !isDynamic) {\n              name = camelize(name);\n            }\n            if (modifiers.sync) {\n              syncGen = genAssignmentCode(value, \"$event\");\n              if (!isDynamic) {\n                addHandler(\n                  el,\n                  (\"update:\" + (camelize(name))),\n                  syncGen,\n                  null,\n                  false,\n                  warn$2,\n                  list[i]\n                );\n                if (hyphenate(name) !== camelize(name)) {\n                  addHandler(\n                    el,\n                    (\"update:\" + (hyphenate(name))),\n                    syncGen,\n                    null,\n                    false,\n                    warn$2,\n                    list[i]\n                  );\n                }\n              } else {\n                // handler w/ dynamic event name\n                addHandler(\n                  el,\n                  (\"\\\"update:\\\"+(\" + name + \")\"),\n                  syncGen,\n                  null,\n                  false,\n                  warn$2,\n                  list[i],\n                  true // dynamic\n                );\n              }\n            }\n          }\n          if ((modifiers && modifiers.prop) || (\n            !el.component && platformMustUseProp(el.tag, el.attrsMap.type, name)\n          )) {\n            addProp(el, name, value, list[i], isDynamic);\n          } else {\n            addAttr(el, name, value, list[i], isDynamic);\n          }\n        } else if (onRE.test(name)) { // v-on\n          name = name.replace(onRE, '');\n          isDynamic = dynamicArgRE.test(name);\n          if (isDynamic) {\n            name = name.slice(1, -1);\n          }\n          addHandler(el, name, value, modifiers, false, warn$2, list[i], isDynamic);\n        } else { // normal directives\n          name = name.replace(dirRE, '');\n          // parse arg\n          var argMatch = name.match(argRE);\n          var arg = argMatch && argMatch[1];\n          isDynamic = false;\n          if (arg) {\n            name = name.slice(0, -(arg.length + 1));\n            if (dynamicArgRE.test(arg)) {\n              arg = arg.slice(1, -1);\n              isDynamic = true;\n            }\n          }\n          addDirective(el, name, rawName, value, arg, isDynamic, modifiers, list[i]);\n          if (name === 'model') {\n            checkForAliasModel(el, value);\n          }\n        }\n      } else {\n        // literal attribute\n        {\n          var res = parseText(value, delimiters);\n          if (res) {\n            warn$2(\n              name + \"=\\\"\" + value + \"\\\": \" +\n              'Interpolation inside attributes has been removed. ' +\n              'Use v-bind or the colon shorthand instead. For example, ' +\n              'instead of <div id=\"{{ val }}\">, use <div :id=\"val\">.',\n              list[i]\n            );\n          }\n        }\n        addAttr(el, name, JSON.stringify(value), list[i]);\n        // #6887 firefox doesn't update muted state if set via attribute\n        // even immediately after element creation\n        if (!el.component &&\n            name === 'muted' &&\n            platformMustUseProp(el.tag, el.attrsMap.type, name)) {\n          addProp(el, name, 'true', list[i]);\n        }\n      }\n    }\n  }\n\n  function checkInFor (el) {\n    var parent = el;\n    while (parent) {\n      if (parent.for !== undefined) {\n        return true\n      }\n      parent = parent.parent;\n    }\n    return false\n  }\n\n  function parseModifiers (name) {\n    var match = name.match(modifierRE);\n    if (match) {\n      var ret = {};\n      match.forEach(function (m) { ret[m.slice(1)] = true; });\n      return ret\n    }\n  }\n\n  function makeAttrsMap (attrs) {\n    var map = {};\n    for (var i = 0, l = attrs.length; i < l; i++) {\n      if (\n        map[attrs[i].name] && !isIE && !isEdge\n      ) {\n        warn$2('duplicate attribute: ' + attrs[i].name, attrs[i]);\n      }\n      map[attrs[i].name] = attrs[i].value;\n    }\n    return map\n  }\n\n  // for script (e.g. type=\"x/template\") or style, do not decode content\n  function isTextTag (el) {\n    return el.tag === 'script' || el.tag === 'style'\n  }\n\n  function isForbiddenTag (el) {\n    return (\n      el.tag === 'style' ||\n      (el.tag === 'script' && (\n        !el.attrsMap.type ||\n        el.attrsMap.type === 'text/javascript'\n      ))\n    )\n  }\n\n  var ieNSBug = /^xmlns:NS\\d+/;\n  var ieNSPrefix = /^NS\\d+:/;\n\n  /* istanbul ignore next */\n  function guardIESVGBug (attrs) {\n    var res = [];\n    for (var i = 0; i < attrs.length; i++) {\n      var attr = attrs[i];\n      if (!ieNSBug.test(attr.name)) {\n        attr.name = attr.name.replace(ieNSPrefix, '');\n        res.push(attr);\n      }\n    }\n    return res\n  }\n\n  function checkForAliasModel (el, value) {\n    var _el = el;\n    while (_el) {\n      if (_el.for && _el.alias === value) {\n        warn$2(\n          \"<\" + (el.tag) + \" v-model=\\\"\" + value + \"\\\">: \" +\n          \"You are binding v-model directly to a v-for iteration alias. \" +\n          \"This will not be able to modify the v-for source array because \" +\n          \"writing to the alias is like modifying a function local variable. \" +\n          \"Consider using an array of objects and use v-model on an object property instead.\",\n          el.rawAttrsMap['v-model']\n        );\n      }\n      _el = _el.parent;\n    }\n  }\n\n  /*  */\n\n  function preTransformNode (el, options) {\n    if (el.tag === 'input') {\n      var map = el.attrsMap;\n      if (!map['v-model']) {\n        return\n      }\n\n      var typeBinding;\n      if (map[':type'] || map['v-bind:type']) {\n        typeBinding = getBindingAttr(el, 'type');\n      }\n      if (!map.type && !typeBinding && map['v-bind']) {\n        typeBinding = \"(\" + (map['v-bind']) + \").type\";\n      }\n\n      if (typeBinding) {\n        var ifCondition = getAndRemoveAttr(el, 'v-if', true);\n        var ifConditionExtra = ifCondition ? (\"&&(\" + ifCondition + \")\") : \"\";\n        var hasElse = getAndRemoveAttr(el, 'v-else', true) != null;\n        var elseIfCondition = getAndRemoveAttr(el, 'v-else-if', true);\n        // 1. checkbox\n        var branch0 = cloneASTElement(el);\n        // process for on the main node\n        processFor(branch0);\n        addRawAttr(branch0, 'type', 'checkbox');\n        processElement(branch0, options);\n        branch0.processed = true; // prevent it from double-processed\n        branch0.if = \"(\" + typeBinding + \")==='checkbox'\" + ifConditionExtra;\n        addIfCondition(branch0, {\n          exp: branch0.if,\n          block: branch0\n        });\n        // 2. add radio else-if condition\n        var branch1 = cloneASTElement(el);\n        getAndRemoveAttr(branch1, 'v-for', true);\n        addRawAttr(branch1, 'type', 'radio');\n        processElement(branch1, options);\n        addIfCondition(branch0, {\n          exp: \"(\" + typeBinding + \")==='radio'\" + ifConditionExtra,\n          block: branch1\n        });\n        // 3. other\n        var branch2 = cloneASTElement(el);\n        getAndRemoveAttr(branch2, 'v-for', true);\n        addRawAttr(branch2, ':type', typeBinding);\n        processElement(branch2, options);\n        addIfCondition(branch0, {\n          exp: ifCondition,\n          block: branch2\n        });\n\n        if (hasElse) {\n          branch0.else = true;\n        } else if (elseIfCondition) {\n          branch0.elseif = elseIfCondition;\n        }\n\n        return branch0\n      }\n    }\n  }\n\n  function cloneASTElement (el) {\n    return createASTElement(el.tag, el.attrsList.slice(), el.parent)\n  }\n\n  var model$1 = {\n    preTransformNode: preTransformNode\n  };\n\n  var modules$1 = [\n    klass$1,\n    style$1,\n    model$1\n  ];\n\n  /*  */\n\n  function text (el, dir) {\n    if (dir.value) {\n      addProp(el, 'textContent', (\"_s(\" + (dir.value) + \")\"), dir);\n    }\n  }\n\n  /*  */\n\n  function html (el, dir) {\n    if (dir.value) {\n      addProp(el, 'innerHTML', (\"_s(\" + (dir.value) + \")\"), dir);\n    }\n  }\n\n  var directives$1 = {\n    model: model,\n    text: text,\n    html: html\n  };\n\n  /*  */\n\n  var baseOptions = {\n    expectHTML: true,\n    modules: modules$1,\n    directives: directives$1,\n    isPreTag: isPreTag,\n    isUnaryTag: isUnaryTag,\n    mustUseProp: mustUseProp,\n    canBeLeftOpenTag: canBeLeftOpenTag,\n    isReservedTag: isReservedTag,\n    getTagNamespace: getTagNamespace,\n    staticKeys: genStaticKeys(modules$1)\n  };\n\n  /*  */\n\n  var isStaticKey;\n  var isPlatformReservedTag;\n\n  var genStaticKeysCached = cached(genStaticKeys$1);\n\n  /**\n   * Goal of the optimizer: walk the generated template AST tree\n   * and detect sub-trees that are purely static, i.e. parts of\n   * the DOM that never needs to change.\n   *\n   * Once we detect these sub-trees, we can:\n   *\n   * 1. Hoist them into constants, so that we no longer need to\n   *    create fresh nodes for them on each re-render;\n   * 2. Completely skip them in the patching process.\n   */\n  function optimize (root, options) {\n    if (!root) { return }\n    isStaticKey = genStaticKeysCached(options.staticKeys || '');\n    isPlatformReservedTag = options.isReservedTag || no;\n    // first pass: mark all non-static nodes.\n    markStatic$1(root);\n    // second pass: mark static roots.\n    markStaticRoots(root, false);\n  }\n\n  function genStaticKeys$1 (keys) {\n    return makeMap(\n      'type,tag,attrsList,attrsMap,plain,parent,children,attrs,start,end,rawAttrsMap' +\n      (keys ? ',' + keys : '')\n    )\n  }\n\n  function markStatic$1 (node) {\n    node.static = isStatic(node);\n    if (node.type === 1) {\n      // do not make component slot content static. this avoids\n      // 1. components not able to mutate slot nodes\n      // 2. static slot content fails for hot-reloading\n      if (\n        !isPlatformReservedTag(node.tag) &&\n        node.tag !== 'slot' &&\n        node.attrsMap['inline-template'] == null\n      ) {\n        return\n      }\n      for (var i = 0, l = node.children.length; i < l; i++) {\n        var child = node.children[i];\n        markStatic$1(child);\n        if (!child.static) {\n          node.static = false;\n        }\n      }\n      if (node.ifConditions) {\n        for (var i$1 = 1, l$1 = node.ifConditions.length; i$1 < l$1; i$1++) {\n          var block = node.ifConditions[i$1].block;\n          markStatic$1(block);\n          if (!block.static) {\n            node.static = false;\n          }\n        }\n      }\n    }\n  }\n\n  function markStaticRoots (node, isInFor) {\n    if (node.type === 1) {\n      if (node.static || node.once) {\n        node.staticInFor = isInFor;\n      }\n      // For a node to qualify as a static root, it should have children that\n      // are not just static text. Otherwise the cost of hoisting out will\n      // outweigh the benefits and it's better off to just always render it fresh.\n      if (node.static && node.children.length && !(\n        node.children.length === 1 &&\n        node.children[0].type === 3\n      )) {\n        node.staticRoot = true;\n        return\n      } else {\n        node.staticRoot = false;\n      }\n      if (node.children) {\n        for (var i = 0, l = node.children.length; i < l; i++) {\n          markStaticRoots(node.children[i], isInFor || !!node.for);\n        }\n      }\n      if (node.ifConditions) {\n        for (var i$1 = 1, l$1 = node.ifConditions.length; i$1 < l$1; i$1++) {\n          markStaticRoots(node.ifConditions[i$1].block, isInFor);\n        }\n      }\n    }\n  }\n\n  function isStatic (node) {\n    if (node.type === 2) { // expression\n      return false\n    }\n    if (node.type === 3) { // text\n      return true\n    }\n    return !!(node.pre || (\n      !node.hasBindings && // no dynamic bindings\n      !node.if && !node.for && // not v-if or v-for or v-else\n      !isBuiltInTag(node.tag) && // not a built-in\n      isPlatformReservedTag(node.tag) && // not a component\n      !isDirectChildOfTemplateFor(node) &&\n      Object.keys(node).every(isStaticKey)\n    ))\n  }\n\n  function isDirectChildOfTemplateFor (node) {\n    while (node.parent) {\n      node = node.parent;\n      if (node.tag !== 'template') {\n        return false\n      }\n      if (node.for) {\n        return true\n      }\n    }\n    return false\n  }\n\n  /*  */\n\n  var fnExpRE = /^([\\w$_]+|\\([^)]*?\\))\\s*=>|^function\\s*\\(/;\n  var fnInvokeRE = /\\([^)]*?\\);*$/;\n  var simplePathRE = /^[A-Za-z_$][\\w$]*(?:\\.[A-Za-z_$][\\w$]*|\\['[^']*?']|\\[\"[^\"]*?\"]|\\[\\d+]|\\[[A-Za-z_$][\\w$]*])*$/;\n\n  // KeyboardEvent.keyCode aliases\n  var keyCodes = {\n    esc: 27,\n    tab: 9,\n    enter: 13,\n    space: 32,\n    up: 38,\n    left: 37,\n    right: 39,\n    down: 40,\n    'delete': [8, 46]\n  };\n\n  // KeyboardEvent.key aliases\n  var keyNames = {\n    // #7880: IE11 and Edge use `Esc` for Escape key name.\n    esc: ['Esc', 'Escape'],\n    tab: 'Tab',\n    enter: 'Enter',\n    // #9112: IE11 uses `Spacebar` for Space key name.\n    space: [' ', 'Spacebar'],\n    // #7806: IE11 uses key names without `Arrow` prefix for arrow keys.\n    up: ['Up', 'ArrowUp'],\n    left: ['Left', 'ArrowLeft'],\n    right: ['Right', 'ArrowRight'],\n    down: ['Down', 'ArrowDown'],\n    // #9112: IE11 uses `Del` for Delete key name.\n    'delete': ['Backspace', 'Delete', 'Del']\n  };\n\n  // #4868: modifiers that prevent the execution of the listener\n  // need to explicitly return null so that we can determine whether to remove\n  // the listener for .once\n  var genGuard = function (condition) { return (\"if(\" + condition + \")return null;\"); };\n\n  var modifierCode = {\n    stop: '$event.stopPropagation();',\n    prevent: '$event.preventDefault();',\n    self: genGuard(\"$event.target !== $event.currentTarget\"),\n    ctrl: genGuard(\"!$event.ctrlKey\"),\n    shift: genGuard(\"!$event.shiftKey\"),\n    alt: genGuard(\"!$event.altKey\"),\n    meta: genGuard(\"!$event.metaKey\"),\n    left: genGuard(\"'button' in $event && $event.button !== 0\"),\n    middle: genGuard(\"'button' in $event && $event.button !== 1\"),\n    right: genGuard(\"'button' in $event && $event.button !== 2\")\n  };\n\n  function genHandlers (\n    events,\n    isNative\n  ) {\n    var prefix = isNative ? 'nativeOn:' : 'on:';\n    var staticHandlers = \"\";\n    var dynamicHandlers = \"\";\n    for (var name in events) {\n      var handlerCode = genHandler(events[name]);\n      if (events[name] && events[name].dynamic) {\n        dynamicHandlers += name + \",\" + handlerCode + \",\";\n      } else {\n        staticHandlers += \"\\\"\" + name + \"\\\":\" + handlerCode + \",\";\n      }\n    }\n    staticHandlers = \"{\" + (staticHandlers.slice(0, -1)) + \"}\";\n    if (dynamicHandlers) {\n      return prefix + \"_d(\" + staticHandlers + \",[\" + (dynamicHandlers.slice(0, -1)) + \"])\"\n    } else {\n      return prefix + staticHandlers\n    }\n  }\n\n  function genHandler (handler) {\n    if (!handler) {\n      return 'function(){}'\n    }\n\n    if (Array.isArray(handler)) {\n      return (\"[\" + (handler.map(function (handler) { return genHandler(handler); }).join(',')) + \"]\")\n    }\n\n    var isMethodPath = simplePathRE.test(handler.value);\n    var isFunctionExpression = fnExpRE.test(handler.value);\n    var isFunctionInvocation = simplePathRE.test(handler.value.replace(fnInvokeRE, ''));\n\n    if (!handler.modifiers) {\n      if (isMethodPath || isFunctionExpression) {\n        return handler.value\n      }\n      return (\"function($event){\" + (isFunctionInvocation ? (\"return \" + (handler.value)) : handler.value) + \"}\") // inline statement\n    } else {\n      var code = '';\n      var genModifierCode = '';\n      var keys = [];\n      for (var key in handler.modifiers) {\n        if (modifierCode[key]) {\n          genModifierCode += modifierCode[key];\n          // left/right\n          if (keyCodes[key]) {\n            keys.push(key);\n          }\n        } else if (key === 'exact') {\n          var modifiers = (handler.modifiers);\n          genModifierCode += genGuard(\n            ['ctrl', 'shift', 'alt', 'meta']\n              .filter(function (keyModifier) { return !modifiers[keyModifier]; })\n              .map(function (keyModifier) { return (\"$event.\" + keyModifier + \"Key\"); })\n              .join('||')\n          );\n        } else {\n          keys.push(key);\n        }\n      }\n      if (keys.length) {\n        code += genKeyFilter(keys);\n      }\n      // Make sure modifiers like prevent and stop get executed after key filtering\n      if (genModifierCode) {\n        code += genModifierCode;\n      }\n      var handlerCode = isMethodPath\n        ? (\"return \" + (handler.value) + \"($event)\")\n        : isFunctionExpression\n          ? (\"return (\" + (handler.value) + \")($event)\")\n          : isFunctionInvocation\n            ? (\"return \" + (handler.value))\n            : handler.value;\n      return (\"function($event){\" + code + handlerCode + \"}\")\n    }\n  }\n\n  function genKeyFilter (keys) {\n    return (\n      // make sure the key filters only apply to KeyboardEvents\n      // #9441: can't use 'keyCode' in $event because Chrome autofill fires fake\n      // key events that do not have keyCode property...\n      \"if(!$event.type.indexOf('key')&&\" +\n      (keys.map(genFilterCode).join('&&')) + \")return null;\"\n    )\n  }\n\n  function genFilterCode (key) {\n    var keyVal = parseInt(key, 10);\n    if (keyVal) {\n      return (\"$event.keyCode!==\" + keyVal)\n    }\n    var keyCode = keyCodes[key];\n    var keyName = keyNames[key];\n    return (\n      \"_k($event.keyCode,\" +\n      (JSON.stringify(key)) + \",\" +\n      (JSON.stringify(keyCode)) + \",\" +\n      \"$event.key,\" +\n      \"\" + (JSON.stringify(keyName)) +\n      \")\"\n    )\n  }\n\n  /*  */\n\n  function on (el, dir) {\n    if (dir.modifiers) {\n      warn(\"v-on without argument does not support modifiers.\");\n    }\n    el.wrapListeners = function (code) { return (\"_g(\" + code + \",\" + (dir.value) + \")\"); };\n  }\n\n  /*  */\n\n  function bind$1 (el, dir) {\n    el.wrapData = function (code) {\n      return (\"_b(\" + code + \",'\" + (el.tag) + \"',\" + (dir.value) + \",\" + (dir.modifiers && dir.modifiers.prop ? 'true' : 'false') + (dir.modifiers && dir.modifiers.sync ? ',true' : '') + \")\")\n    };\n  }\n\n  /*  */\n\n  var baseDirectives = {\n    on: on,\n    bind: bind$1,\n    cloak: noop\n  };\n\n  /*  */\n\n\n\n\n\n  var CodegenState = function CodegenState (options) {\n    this.options = options;\n    this.warn = options.warn || baseWarn;\n    this.transforms = pluckModuleFunction(options.modules, 'transformCode');\n    this.dataGenFns = pluckModuleFunction(options.modules, 'genData');\n    this.directives = extend(extend({}, baseDirectives), options.directives);\n    var isReservedTag = options.isReservedTag || no;\n    this.maybeComponent = function (el) { return !!el.component || !isReservedTag(el.tag); };\n    this.onceId = 0;\n    this.staticRenderFns = [];\n    this.pre = false;\n  };\n\n\n\n  function generate (\n    ast,\n    options\n  ) {\n    var state = new CodegenState(options);\n    var code = ast ? genElement(ast, state) : '_c(\"div\")';\n    return {\n      render: (\"with(this){return \" + code + \"}\"),\n      staticRenderFns: state.staticRenderFns\n    }\n  }\n\n  function genElement (el, state) {\n    if (el.parent) {\n      el.pre = el.pre || el.parent.pre;\n    }\n\n    if (el.staticRoot && !el.staticProcessed) {\n      return genStatic(el, state)\n    } else if (el.once && !el.onceProcessed) {\n      return genOnce(el, state)\n    } else if (el.for && !el.forProcessed) {\n      return genFor(el, state)\n    } else if (el.if && !el.ifProcessed) {\n      return genIf(el, state)\n    } else if (el.tag === 'template' && !el.slotTarget && !state.pre) {\n      return genChildren(el, state) || 'void 0'\n    } else if (el.tag === 'slot') {\n      return genSlot(el, state)\n    } else {\n      // component or element\n      var code;\n      if (el.component) {\n        code = genComponent(el.component, el, state);\n      } else {\n        var data;\n        if (!el.plain || (el.pre && state.maybeComponent(el))) {\n          data = genData$2(el, state);\n        }\n\n        var children = el.inlineTemplate ? null : genChildren(el, state, true);\n        code = \"_c('\" + (el.tag) + \"'\" + (data ? (\",\" + data) : '') + (children ? (\",\" + children) : '') + \")\";\n      }\n      // module transforms\n      for (var i = 0; i < state.transforms.length; i++) {\n        code = state.transforms[i](el, code);\n      }\n      return code\n    }\n  }\n\n  // hoist static sub-trees out\n  function genStatic (el, state) {\n    el.staticProcessed = true;\n    // Some elements (templates) need to behave differently inside of a v-pre\n    // node.  All pre nodes are static roots, so we can use this as a location to\n    // wrap a state change and reset it upon exiting the pre node.\n    var originalPreState = state.pre;\n    if (el.pre) {\n      state.pre = el.pre;\n    }\n    state.staticRenderFns.push((\"with(this){return \" + (genElement(el, state)) + \"}\"));\n    state.pre = originalPreState;\n    return (\"_m(\" + (state.staticRenderFns.length - 1) + (el.staticInFor ? ',true' : '') + \")\")\n  }\n\n  // v-once\n  function genOnce (el, state) {\n    el.onceProcessed = true;\n    if (el.if && !el.ifProcessed) {\n      return genIf(el, state)\n    } else if (el.staticInFor) {\n      var key = '';\n      var parent = el.parent;\n      while (parent) {\n        if (parent.for) {\n          key = parent.key;\n          break\n        }\n        parent = parent.parent;\n      }\n      if (!key) {\n        state.warn(\n          \"v-once can only be used inside v-for that is keyed. \",\n          el.rawAttrsMap['v-once']\n        );\n        return genElement(el, state)\n      }\n      return (\"_o(\" + (genElement(el, state)) + \",\" + (state.onceId++) + \",\" + key + \")\")\n    } else {\n      return genStatic(el, state)\n    }\n  }\n\n  function genIf (\n    el,\n    state,\n    altGen,\n    altEmpty\n  ) {\n    el.ifProcessed = true; // avoid recursion\n    return genIfConditions(el.ifConditions.slice(), state, altGen, altEmpty)\n  }\n\n  function genIfConditions (\n    conditions,\n    state,\n    altGen,\n    altEmpty\n  ) {\n    if (!conditions.length) {\n      return altEmpty || '_e()'\n    }\n\n    var condition = conditions.shift();\n    if (condition.exp) {\n      return (\"(\" + (condition.exp) + \")?\" + (genTernaryExp(condition.block)) + \":\" + (genIfConditions(conditions, state, altGen, altEmpty)))\n    } else {\n      return (\"\" + (genTernaryExp(condition.block)))\n    }\n\n    // v-if with v-once should generate code like (a)?_m(0):_m(1)\n    function genTernaryExp (el) {\n      return altGen\n        ? altGen(el, state)\n        : el.once\n          ? genOnce(el, state)\n          : genElement(el, state)\n    }\n  }\n\n  function genFor (\n    el,\n    state,\n    altGen,\n    altHelper\n  ) {\n    var exp = el.for;\n    var alias = el.alias;\n    var iterator1 = el.iterator1 ? (\",\" + (el.iterator1)) : '';\n    var iterator2 = el.iterator2 ? (\",\" + (el.iterator2)) : '';\n\n    if (state.maybeComponent(el) &&\n      el.tag !== 'slot' &&\n      el.tag !== 'template' &&\n      !el.key\n    ) {\n      state.warn(\n        \"<\" + (el.tag) + \" v-for=\\\"\" + alias + \" in \" + exp + \"\\\">: component lists rendered with \" +\n        \"v-for should have explicit keys. \" +\n        \"See https://vuejs.org/guide/list.html#key for more info.\",\n        el.rawAttrsMap['v-for'],\n        true /* tip */\n      );\n    }\n\n    el.forProcessed = true; // avoid recursion\n    return (altHelper || '_l') + \"((\" + exp + \"),\" +\n      \"function(\" + alias + iterator1 + iterator2 + \"){\" +\n        \"return \" + ((altGen || genElement)(el, state)) +\n      '})'\n  }\n\n  function genData$2 (el, state) {\n    var data = '{';\n\n    // directives first.\n    // directives may mutate the el's other properties before they are generated.\n    var dirs = genDirectives(el, state);\n    if (dirs) { data += dirs + ','; }\n\n    // key\n    if (el.key) {\n      data += \"key:\" + (el.key) + \",\";\n    }\n    // ref\n    if (el.ref) {\n      data += \"ref:\" + (el.ref) + \",\";\n    }\n    if (el.refInFor) {\n      data += \"refInFor:true,\";\n    }\n    // pre\n    if (el.pre) {\n      data += \"pre:true,\";\n    }\n    // record original tag name for components using \"is\" attribute\n    if (el.component) {\n      data += \"tag:\\\"\" + (el.tag) + \"\\\",\";\n    }\n    // module data generation functions\n    for (var i = 0; i < state.dataGenFns.length; i++) {\n      data += state.dataGenFns[i](el);\n    }\n    // attributes\n    if (el.attrs) {\n      data += \"attrs:\" + (genProps(el.attrs)) + \",\";\n    }\n    // DOM props\n    if (el.props) {\n      data += \"domProps:\" + (genProps(el.props)) + \",\";\n    }\n    // event handlers\n    if (el.events) {\n      data += (genHandlers(el.events, false)) + \",\";\n    }\n    if (el.nativeEvents) {\n      data += (genHandlers(el.nativeEvents, true)) + \",\";\n    }\n    // slot target\n    // only for non-scoped slots\n    if (el.slotTarget && !el.slotScope) {\n      data += \"slot:\" + (el.slotTarget) + \",\";\n    }\n    // scoped slots\n    if (el.scopedSlots) {\n      data += (genScopedSlots(el, el.scopedSlots, state)) + \",\";\n    }\n    // component v-model\n    if (el.model) {\n      data += \"model:{value:\" + (el.model.value) + \",callback:\" + (el.model.callback) + \",expression:\" + (el.model.expression) + \"},\";\n    }\n    // inline-template\n    if (el.inlineTemplate) {\n      var inlineTemplate = genInlineTemplate(el, state);\n      if (inlineTemplate) {\n        data += inlineTemplate + \",\";\n      }\n    }\n    data = data.replace(/,$/, '') + '}';\n    // v-bind dynamic argument wrap\n    // v-bind with dynamic arguments must be applied using the same v-bind object\n    // merge helper so that class/style/mustUseProp attrs are handled correctly.\n    if (el.dynamicAttrs) {\n      data = \"_b(\" + data + \",\\\"\" + (el.tag) + \"\\\",\" + (genProps(el.dynamicAttrs)) + \")\";\n    }\n    // v-bind data wrap\n    if (el.wrapData) {\n      data = el.wrapData(data);\n    }\n    // v-on data wrap\n    if (el.wrapListeners) {\n      data = el.wrapListeners(data);\n    }\n    return data\n  }\n\n  function genDirectives (el, state) {\n    var dirs = el.directives;\n    if (!dirs) { return }\n    var res = 'directives:[';\n    var hasRuntime = false;\n    var i, l, dir, needRuntime;\n    for (i = 0, l = dirs.length; i < l; i++) {\n      dir = dirs[i];\n      needRuntime = true;\n      var gen = state.directives[dir.name];\n      if (gen) {\n        // compile-time directive that manipulates AST.\n        // returns true if it also needs a runtime counterpart.\n        needRuntime = !!gen(el, dir, state.warn);\n      }\n      if (needRuntime) {\n        hasRuntime = true;\n        res += \"{name:\\\"\" + (dir.name) + \"\\\",rawName:\\\"\" + (dir.rawName) + \"\\\"\" + (dir.value ? (\",value:(\" + (dir.value) + \"),expression:\" + (JSON.stringify(dir.value))) : '') + (dir.arg ? (\",arg:\" + (dir.isDynamicArg ? dir.arg : (\"\\\"\" + (dir.arg) + \"\\\"\"))) : '') + (dir.modifiers ? (\",modifiers:\" + (JSON.stringify(dir.modifiers))) : '') + \"},\";\n      }\n    }\n    if (hasRuntime) {\n      return res.slice(0, -1) + ']'\n    }\n  }\n\n  function genInlineTemplate (el, state) {\n    var ast = el.children[0];\n    if (el.children.length !== 1 || ast.type !== 1) {\n      state.warn(\n        'Inline-template components must have exactly one child element.',\n        { start: el.start }\n      );\n    }\n    if (ast && ast.type === 1) {\n      var inlineRenderFns = generate(ast, state.options);\n      return (\"inlineTemplate:{render:function(){\" + (inlineRenderFns.render) + \"},staticRenderFns:[\" + (inlineRenderFns.staticRenderFns.map(function (code) { return (\"function(){\" + code + \"}\"); }).join(',')) + \"]}\")\n    }\n  }\n\n  function genScopedSlots (\n    el,\n    slots,\n    state\n  ) {\n    // by default scoped slots are considered \"stable\", this allows child\n    // components with only scoped slots to skip forced updates from parent.\n    // but in some cases we have to bail-out of this optimization\n    // for example if the slot contains dynamic names, has v-if or v-for on them...\n    var needsForceUpdate = Object.keys(slots).some(function (key) {\n      var slot = slots[key];\n      return (\n        slot.slotTargetDynamic ||\n        slot.if ||\n        slot.for ||\n        containsSlotChild(slot) // is passing down slot from parent which may be dynamic\n      )\n    });\n\n    // #9534: if a component with scoped slots is inside a conditional branch,\n    // it's possible for the same component to be reused but with different\n    // compiled slot content. To avoid that, we generate a unique key based on\n    // the generated code of all the slot contents.\n    var needsKey = !!el.if;\n\n    // OR when it is inside another scoped slot or v-for (the reactivity may be\n    // disconnected due to the intermediate scope variable)\n    // #9438, #9506\n    // TODO: this can be further optimized by properly analyzing in-scope bindings\n    // and skip force updating ones that do not actually use scope variables.\n    if (!needsForceUpdate) {\n      var parent = el.parent;\n      while (parent) {\n        if (\n          (parent.slotScope && parent.slotScope !== emptySlotScopeToken) ||\n          parent.for\n        ) {\n          needsForceUpdate = true;\n          break\n        }\n        if (parent.if) {\n          needsKey = true;\n        }\n        parent = parent.parent;\n      }\n    }\n\n    var generatedSlots = Object.keys(slots)\n      .map(function (key) { return genScopedSlot(slots[key], state); })\n      .join(',');\n\n    return (\"scopedSlots:_u([\" + generatedSlots + \"]\" + (needsForceUpdate ? \",null,true\" : \"\") + (!needsForceUpdate && needsKey ? (\",null,false,\" + (hash(generatedSlots))) : \"\") + \")\")\n  }\n\n  function hash(str) {\n    var hash = 5381;\n    var i = str.length;\n    while(i) {\n      hash = (hash * 33) ^ str.charCodeAt(--i);\n    }\n    return hash >>> 0\n  }\n\n  function containsSlotChild (el) {\n    if (el.type === 1) {\n      if (el.tag === 'slot') {\n        return true\n      }\n      return el.children.some(containsSlotChild)\n    }\n    return false\n  }\n\n  function genScopedSlot (\n    el,\n    state\n  ) {\n    var isLegacySyntax = el.attrsMap['slot-scope'];\n    if (el.if && !el.ifProcessed && !isLegacySyntax) {\n      return genIf(el, state, genScopedSlot, \"null\")\n    }\n    if (el.for && !el.forProcessed) {\n      return genFor(el, state, genScopedSlot)\n    }\n    var slotScope = el.slotScope === emptySlotScopeToken\n      ? \"\"\n      : String(el.slotScope);\n    var fn = \"function(\" + slotScope + \"){\" +\n      \"return \" + (el.tag === 'template'\n        ? el.if && isLegacySyntax\n          ? (\"(\" + (el.if) + \")?\" + (genChildren(el, state) || 'undefined') + \":undefined\")\n          : genChildren(el, state) || 'undefined'\n        : genElement(el, state)) + \"}\";\n    // reverse proxy v-slot without scope on this.$slots\n    var reverseProxy = slotScope ? \"\" : \",proxy:true\";\n    return (\"{key:\" + (el.slotTarget || \"\\\"default\\\"\") + \",fn:\" + fn + reverseProxy + \"}\")\n  }\n\n  function genChildren (\n    el,\n    state,\n    checkSkip,\n    altGenElement,\n    altGenNode\n  ) {\n    var children = el.children;\n    if (children.length) {\n      var el$1 = children[0];\n      // optimize single v-for\n      if (children.length === 1 &&\n        el$1.for &&\n        el$1.tag !== 'template' &&\n        el$1.tag !== 'slot'\n      ) {\n        var normalizationType = checkSkip\n          ? state.maybeComponent(el$1) ? \",1\" : \",0\"\n          : \"\";\n        return (\"\" + ((altGenElement || genElement)(el$1, state)) + normalizationType)\n      }\n      var normalizationType$1 = checkSkip\n        ? getNormalizationType(children, state.maybeComponent)\n        : 0;\n      var gen = altGenNode || genNode;\n      return (\"[\" + (children.map(function (c) { return gen(c, state); }).join(',')) + \"]\" + (normalizationType$1 ? (\",\" + normalizationType$1) : ''))\n    }\n  }\n\n  // determine the normalization needed for the children array.\n  // 0: no normalization needed\n  // 1: simple normalization needed (possible 1-level deep nested array)\n  // 2: full normalization needed\n  function getNormalizationType (\n    children,\n    maybeComponent\n  ) {\n    var res = 0;\n    for (var i = 0; i < children.length; i++) {\n      var el = children[i];\n      if (el.type !== 1) {\n        continue\n      }\n      if (needsNormalization(el) ||\n          (el.ifConditions && el.ifConditions.some(function (c) { return needsNormalization(c.block); }))) {\n        res = 2;\n        break\n      }\n      if (maybeComponent(el) ||\n          (el.ifConditions && el.ifConditions.some(function (c) { return maybeComponent(c.block); }))) {\n        res = 1;\n      }\n    }\n    return res\n  }\n\n  function needsNormalization (el) {\n    return el.for !== undefined || el.tag === 'template' || el.tag === 'slot'\n  }\n\n  function genNode (node, state) {\n    if (node.type === 1) {\n      return genElement(node, state)\n    } else if (node.type === 3 && node.isComment) {\n      return genComment(node)\n    } else {\n      return genText(node)\n    }\n  }\n\n  function genText (text) {\n    return (\"_v(\" + (text.type === 2\n      ? text.expression // no need for () because already wrapped in _s()\n      : transformSpecialNewlines(JSON.stringify(text.text))) + \")\")\n  }\n\n  function genComment (comment) {\n    return (\"_e(\" + (JSON.stringify(comment.text)) + \")\")\n  }\n\n  function genSlot (el, state) {\n    var slotName = el.slotName || '\"default\"';\n    var children = genChildren(el, state);\n    var res = \"_t(\" + slotName + (children ? (\",\" + children) : '');\n    var attrs = el.attrs || el.dynamicAttrs\n      ? genProps((el.attrs || []).concat(el.dynamicAttrs || []).map(function (attr) { return ({\n          // slot props are camelized\n          name: camelize(attr.name),\n          value: attr.value,\n          dynamic: attr.dynamic\n        }); }))\n      : null;\n    var bind$$1 = el.attrsMap['v-bind'];\n    if ((attrs || bind$$1) && !children) {\n      res += \",null\";\n    }\n    if (attrs) {\n      res += \",\" + attrs;\n    }\n    if (bind$$1) {\n      res += (attrs ? '' : ',null') + \",\" + bind$$1;\n    }\n    return res + ')'\n  }\n\n  // componentName is el.component, take it as argument to shun flow's pessimistic refinement\n  function genComponent (\n    componentName,\n    el,\n    state\n  ) {\n    var children = el.inlineTemplate ? null : genChildren(el, state, true);\n    return (\"_c(\" + componentName + \",\" + (genData$2(el, state)) + (children ? (\",\" + children) : '') + \")\")\n  }\n\n  function genProps (props) {\n    var staticProps = \"\";\n    var dynamicProps = \"\";\n    for (var i = 0; i < props.length; i++) {\n      var prop = props[i];\n      var value = transformSpecialNewlines(prop.value);\n      if (prop.dynamic) {\n        dynamicProps += (prop.name) + \",\" + value + \",\";\n      } else {\n        staticProps += \"\\\"\" + (prop.name) + \"\\\":\" + value + \",\";\n      }\n    }\n    staticProps = \"{\" + (staticProps.slice(0, -1)) + \"}\";\n    if (dynamicProps) {\n      return (\"_d(\" + staticProps + \",[\" + (dynamicProps.slice(0, -1)) + \"])\")\n    } else {\n      return staticProps\n    }\n  }\n\n  // #3895, #4268\n  function transformSpecialNewlines (text) {\n    return text\n      .replace(/\\u2028/g, '\\\\u2028')\n      .replace(/\\u2029/g, '\\\\u2029')\n  }\n\n  /*  */\n\n\n\n  // these keywords should not appear inside expressions, but operators like\n  // typeof, instanceof and in are allowed\n  var prohibitedKeywordRE = new RegExp('\\\\b' + (\n    'do,if,for,let,new,try,var,case,else,with,await,break,catch,class,const,' +\n    'super,throw,while,yield,delete,export,import,return,switch,default,' +\n    'extends,finally,continue,debugger,function,arguments'\n  ).split(',').join('\\\\b|\\\\b') + '\\\\b');\n\n  // these unary operators should not be used as property/method names\n  var unaryOperatorsRE = new RegExp('\\\\b' + (\n    'delete,typeof,void'\n  ).split(',').join('\\\\s*\\\\([^\\\\)]*\\\\)|\\\\b') + '\\\\s*\\\\([^\\\\)]*\\\\)');\n\n  // strip strings in expressions\n  var stripStringRE = /'(?:[^'\\\\]|\\\\.)*'|\"(?:[^\"\\\\]|\\\\.)*\"|`(?:[^`\\\\]|\\\\.)*\\$\\{|\\}(?:[^`\\\\]|\\\\.)*`|`(?:[^`\\\\]|\\\\.)*`/g;\n\n  // detect problematic expressions in a template\n  function detectErrors (ast, warn) {\n    if (ast) {\n      checkNode(ast, warn);\n    }\n  }\n\n  function checkNode (node, warn) {\n    if (node.type === 1) {\n      for (var name in node.attrsMap) {\n        if (dirRE.test(name)) {\n          var value = node.attrsMap[name];\n          if (value) {\n            var range = node.rawAttrsMap[name];\n            if (name === 'v-for') {\n              checkFor(node, (\"v-for=\\\"\" + value + \"\\\"\"), warn, range);\n            } else if (onRE.test(name)) {\n              checkEvent(value, (name + \"=\\\"\" + value + \"\\\"\"), warn, range);\n            } else {\n              checkExpression(value, (name + \"=\\\"\" + value + \"\\\"\"), warn, range);\n            }\n          }\n        }\n      }\n      if (node.children) {\n        for (var i = 0; i < node.children.length; i++) {\n          checkNode(node.children[i], warn);\n        }\n      }\n    } else if (node.type === 2) {\n      checkExpression(node.expression, node.text, warn, node);\n    }\n  }\n\n  function checkEvent (exp, text, warn, range) {\n    var stipped = exp.replace(stripStringRE, '');\n    var keywordMatch = stipped.match(unaryOperatorsRE);\n    if (keywordMatch && stipped.charAt(keywordMatch.index - 1) !== '$') {\n      warn(\n        \"avoid using JavaScript unary operator as property name: \" +\n        \"\\\"\" + (keywordMatch[0]) + \"\\\" in expression \" + (text.trim()),\n        range\n      );\n    }\n    checkExpression(exp, text, warn, range);\n  }\n\n  function checkFor (node, text, warn, range) {\n    checkExpression(node.for || '', text, warn, range);\n    checkIdentifier(node.alias, 'v-for alias', text, warn, range);\n    checkIdentifier(node.iterator1, 'v-for iterator', text, warn, range);\n    checkIdentifier(node.iterator2, 'v-for iterator', text, warn, range);\n  }\n\n  function checkIdentifier (\n    ident,\n    type,\n    text,\n    warn,\n    range\n  ) {\n    if (typeof ident === 'string') {\n      try {\n        new Function((\"var \" + ident + \"=_\"));\n      } catch (e) {\n        warn((\"invalid \" + type + \" \\\"\" + ident + \"\\\" in expression: \" + (text.trim())), range);\n      }\n    }\n  }\n\n  function checkExpression (exp, text, warn, range) {\n    try {\n      new Function((\"return \" + exp));\n    } catch (e) {\n      var keywordMatch = exp.replace(stripStringRE, '').match(prohibitedKeywordRE);\n      if (keywordMatch) {\n        warn(\n          \"avoid using JavaScript keyword as property name: \" +\n          \"\\\"\" + (keywordMatch[0]) + \"\\\"\\n  Raw expression: \" + (text.trim()),\n          range\n        );\n      } else {\n        warn(\n          \"invalid expression: \" + (e.message) + \" in\\n\\n\" +\n          \"    \" + exp + \"\\n\\n\" +\n          \"  Raw expression: \" + (text.trim()) + \"\\n\",\n          range\n        );\n      }\n    }\n  }\n\n  /*  */\n\n  var range = 2;\n\n  function generateCodeFrame (\n    source,\n    start,\n    end\n  ) {\n    if ( start === void 0 ) start = 0;\n    if ( end === void 0 ) end = source.length;\n\n    var lines = source.split(/\\r?\\n/);\n    var count = 0;\n    var res = [];\n    for (var i = 0; i < lines.length; i++) {\n      count += lines[i].length + 1;\n      if (count >= start) {\n        for (var j = i - range; j <= i + range || end > count; j++) {\n          if (j < 0 || j >= lines.length) { continue }\n          res.push((\"\" + (j + 1) + (repeat$1(\" \", 3 - String(j + 1).length)) + \"|  \" + (lines[j])));\n          var lineLength = lines[j].length;\n          if (j === i) {\n            // push underline\n            var pad = start - (count - lineLength) + 1;\n            var length = end > count ? lineLength - pad : end - start;\n            res.push(\"   |  \" + repeat$1(\" \", pad) + repeat$1(\"^\", length));\n          } else if (j > i) {\n            if (end > count) {\n              var length$1 = Math.min(end - count, lineLength);\n              res.push(\"   |  \" + repeat$1(\"^\", length$1));\n            }\n            count += lineLength + 1;\n          }\n        }\n        break\n      }\n    }\n    return res.join('\\n')\n  }\n\n  function repeat$1 (str, n) {\n    var result = '';\n    if (n > 0) {\n      while (true) { // eslint-disable-line\n        if (n & 1) { result += str; }\n        n >>>= 1;\n        if (n <= 0) { break }\n        str += str;\n      }\n    }\n    return result\n  }\n\n  /*  */\n\n\n\n  function createFunction (code, errors) {\n    try {\n      return new Function(code)\n    } catch (err) {\n      errors.push({ err: err, code: code });\n      return noop\n    }\n  }\n\n  function createCompileToFunctionFn (compile) {\n    var cache = Object.create(null);\n\n    return function compileToFunctions (\n      template,\n      options,\n      vm\n    ) {\n      options = extend({}, options);\n      var warn$$1 = options.warn || warn;\n      delete options.warn;\n\n      /* istanbul ignore if */\n      {\n        // detect possible CSP restriction\n        try {\n          new Function('return 1');\n        } catch (e) {\n          if (e.toString().match(/unsafe-eval|CSP/)) {\n            warn$$1(\n              'It seems you are using the standalone build of Vue.js in an ' +\n              'environment with Content Security Policy that prohibits unsafe-eval. ' +\n              'The template compiler cannot work in this environment. Consider ' +\n              'relaxing the policy to allow unsafe-eval or pre-compiling your ' +\n              'templates into render functions.'\n            );\n          }\n        }\n      }\n\n      // check cache\n      var key = options.delimiters\n        ? String(options.delimiters) + template\n        : template;\n      if (cache[key]) {\n        return cache[key]\n      }\n\n      // compile\n      var compiled = compile(template, options);\n\n      // check compilation errors/tips\n      {\n        if (compiled.errors && compiled.errors.length) {\n          if (options.outputSourceRange) {\n            compiled.errors.forEach(function (e) {\n              warn$$1(\n                \"Error compiling template:\\n\\n\" + (e.msg) + \"\\n\\n\" +\n                generateCodeFrame(template, e.start, e.end),\n                vm\n              );\n            });\n          } else {\n            warn$$1(\n              \"Error compiling template:\\n\\n\" + template + \"\\n\\n\" +\n              compiled.errors.map(function (e) { return (\"- \" + e); }).join('\\n') + '\\n',\n              vm\n            );\n          }\n        }\n        if (compiled.tips && compiled.tips.length) {\n          if (options.outputSourceRange) {\n            compiled.tips.forEach(function (e) { return tip(e.msg, vm); });\n          } else {\n            compiled.tips.forEach(function (msg) { return tip(msg, vm); });\n          }\n        }\n      }\n\n      // turn code into functions\n      var res = {};\n      var fnGenErrors = [];\n      res.render = createFunction(compiled.render, fnGenErrors);\n      res.staticRenderFns = compiled.staticRenderFns.map(function (code) {\n        return createFunction(code, fnGenErrors)\n      });\n\n      // check function generation errors.\n      // this should only happen if there is a bug in the compiler itself.\n      // mostly for codegen development use\n      /* istanbul ignore if */\n      {\n        if ((!compiled.errors || !compiled.errors.length) && fnGenErrors.length) {\n          warn$$1(\n            \"Failed to generate render function:\\n\\n\" +\n            fnGenErrors.map(function (ref) {\n              var err = ref.err;\n              var code = ref.code;\n\n              return ((err.toString()) + \" in\\n\\n\" + code + \"\\n\");\n          }).join('\\n'),\n            vm\n          );\n        }\n      }\n\n      return (cache[key] = res)\n    }\n  }\n\n  /*  */\n\n  function createCompilerCreator (baseCompile) {\n    return function createCompiler (baseOptions) {\n      function compile (\n        template,\n        options\n      ) {\n        var finalOptions = Object.create(baseOptions);\n        var errors = [];\n        var tips = [];\n\n        var warn = function (msg, range, tip) {\n          (tip ? tips : errors).push(msg);\n        };\n\n        if (options) {\n          if (options.outputSourceRange) {\n            // $flow-disable-line\n            var leadingSpaceLength = template.match(/^\\s*/)[0].length;\n\n            warn = function (msg, range, tip) {\n              var data = { msg: msg };\n              if (range) {\n                if (range.start != null) {\n                  data.start = range.start + leadingSpaceLength;\n                }\n                if (range.end != null) {\n                  data.end = range.end + leadingSpaceLength;\n                }\n              }\n              (tip ? tips : errors).push(data);\n            };\n          }\n          // merge custom modules\n          if (options.modules) {\n            finalOptions.modules =\n              (baseOptions.modules || []).concat(options.modules);\n          }\n          // merge custom directives\n          if (options.directives) {\n            finalOptions.directives = extend(\n              Object.create(baseOptions.directives || null),\n              options.directives\n            );\n          }\n          // copy other options\n          for (var key in options) {\n            if (key !== 'modules' && key !== 'directives') {\n              finalOptions[key] = options[key];\n            }\n          }\n        }\n\n        finalOptions.warn = warn;\n\n        var compiled = baseCompile(template.trim(), finalOptions);\n        {\n          detectErrors(compiled.ast, warn);\n        }\n        compiled.errors = errors;\n        compiled.tips = tips;\n        return compiled\n      }\n\n      return {\n        compile: compile,\n        compileToFunctions: createCompileToFunctionFn(compile)\n      }\n    }\n  }\n\n  /*  */\n\n  // `createCompilerCreator` allows creating compilers that use alternative\n  // parser/optimizer/codegen, e.g the SSR optimizing compiler.\n  // Here we just export a default compiler using the default parts.\n  var createCompiler = createCompilerCreator(function baseCompile (\n    template,\n    options\n  ) {\n    var ast = parse(template.trim(), options);\n    if (options.optimize !== false) {\n      optimize(ast, options);\n    }\n    var code = generate(ast, options);\n    return {\n      ast: ast,\n      render: code.render,\n      staticRenderFns: code.staticRenderFns\n    }\n  });\n\n  /*  */\n\n  var ref$1 = createCompiler(baseOptions);\n  var compile = ref$1.compile;\n  var compileToFunctions = ref$1.compileToFunctions;\n\n  /*  */\n\n  // check whether current browser encodes a char inside attribute values\n  var div;\n  function getShouldDecode (href) {\n    div = div || document.createElement('div');\n    div.innerHTML = href ? \"<a href=\\\"\\n\\\"/>\" : \"<div a=\\\"\\n\\\"/>\";\n    return div.innerHTML.indexOf('&#10;') > 0\n  }\n\n  // #3663: IE encodes newlines inside attribute values while other browsers don't\n  var shouldDecodeNewlines = inBrowser ? getShouldDecode(false) : false;\n  // #6828: chrome encodes content in a[href]\n  var shouldDecodeNewlinesForHref = inBrowser ? getShouldDecode(true) : false;\n\n  /*  */\n\n  var idToTemplate = cached(function (id) {\n    var el = query(id);\n    return el && el.innerHTML\n  });\n\n  var mount = Vue.prototype.$mount;\n  Vue.prototype.$mount = function (\n    el,\n    hydrating\n  ) {\n    el = el && query(el);\n\n    /* istanbul ignore if */\n    if (el === document.body || el === document.documentElement) {\n      warn(\n        \"Do not mount Vue to <html> or <body> - mount to normal elements instead.\"\n      );\n      return this\n    }\n\n    var options = this.$options;\n    // resolve template/el and convert to render function\n    if (!options.render) {\n      var template = options.template;\n      if (template) {\n        if (typeof template === 'string') {\n          if (template.charAt(0) === '#') {\n            template = idToTemplate(template);\n            /* istanbul ignore if */\n            if (!template) {\n              warn(\n                (\"Template element not found or is empty: \" + (options.template)),\n                this\n              );\n            }\n          }\n        } else if (template.nodeType) {\n          template = template.innerHTML;\n        } else {\n          {\n            warn('invalid template option:' + template, this);\n          }\n          return this\n        }\n      } else if (el) {\n        template = getOuterHTML(el);\n      }\n      if (template) {\n        /* istanbul ignore if */\n        if (config.performance && mark) {\n          mark('compile');\n        }\n\n        var ref = compileToFunctions(template, {\n          outputSourceRange: \"development\" !== 'production',\n          shouldDecodeNewlines: shouldDecodeNewlines,\n          shouldDecodeNewlinesForHref: shouldDecodeNewlinesForHref,\n          delimiters: options.delimiters,\n          comments: options.comments\n        }, this);\n        var render = ref.render;\n        var staticRenderFns = ref.staticRenderFns;\n        options.render = render;\n        options.staticRenderFns = staticRenderFns;\n\n        /* istanbul ignore if */\n        if (config.performance && mark) {\n          mark('compile end');\n          measure((\"vue \" + (this._name) + \" compile\"), 'compile', 'compile end');\n        }\n      }\n    }\n    return mount.call(this, el, hydrating)\n  };\n\n  /**\n   * Get outerHTML of elements, taking care\n   * of SVG elements in IE as well.\n   */\n  function getOuterHTML (el) {\n    if (el.outerHTML) {\n      return el.outerHTML\n    } else {\n      var container = document.createElement('div');\n      container.appendChild(el.cloneNode(true));\n      return container.innerHTML\n    }\n  }\n\n  Vue.compile = compileToFunctions;\n\n  return Vue;\n\n}));\n"
  },
  {
    "path": "website/docs/.vuepress/styles/index.styl",
    "content": "// placeholder for test, dont't remove it.\n\n//.content {\n//  font-size 30px;\n//}\n\n//div.theme-default-content:not(.custom) { max-width: 100%; }\ndiv.theme-default-content:not(.custom) { max-width: 1024px; }\n\n\n/*\npre.vue-container\n  border-left-width: .5rem;\n  border-left-style: solid;\n  border-color: #42b983;\n  border-radius: 0px;\n  & > code\n    font-size: 14px !important;\n    & > p\n      margin: -5px 0 -20px 0;\n    code\n      background-color: #42b983 !important;\n      padding: 3px 5px;\n      border-radius: 3px;\n      color #000\n    em\n      color #808080\n      font-weight light\n\n*/\n"
  },
  {
    "path": "website/docs/.vuepress/theme/components/CarbonAds.vue",
    "content": "<script>\nexport default {\n    name: 'CarbonAds',\n\n    watch: {\n        '$route' (to, from) {\n            if (\n                to.path !== from.path\n                // Only reload if the ad has been loaded\n                // otherwise it's possible that the script is appended but\n                // the ads are not loaded yet. This would result in duplicated ads.\n                && this.$el.querySelector('#carbonads')\n            ) {\n                this.$el.innerHTML = ''\n                this.load()\n            }\n        }\n    },\n\n    mounted () {\n        this.load()\n    },\n\n    methods: {\n        load () {\n            const s = document.createElement('script')\n            s.id = '_carbonads_js'\n            s.src = `//cdn.carbonads.com/carbon.js?serve=CEBITKQJ&placement=jbaysolutionsgithubio`\n            this.$el.appendChild(s)\n        }\n    },\n\n    render (h) {\n        return h('div', { class: 'carbon-ads' })\n    }\n}\n</script>\n\n<style lang=\"stylus\">\n.carbon-ads\n    min-height 102px\n    padding 1.5rem 1.5rem 0\n    margin-bottom -0.5rem\n    font-size 0.75rem\n    a\n        color #444\n        font-weight normal\n        display inline\n    .carbon-img\n        float left\n        margin-right 1rem\n        border 1px solid $borderColor\n        img\n            display block\n    .carbon-poweredby\n        color #999\n        display block\n        margin-top 0.5em\n\n@media (max-width: $MQMobile)\n    .carbon-ads\n        .carbon-img img\n            width 100px\n            height 77px\n</style>\n\n<!--\n<style lang=\"css\">\n#carbonads {\n    font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Oxygen-Sans, Ubuntu,\n    Cantarell, \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n}\n\n#carbonads {\n    display: flex;\n    max-width: 330px;\n    background-color: hsl(0, 0%, 98%);\n    box-shadow: 0 1px 4px 1px hsla(0, 0%, 0%, .1);\n}\n\n#carbonads a {\n    color: inherit;\n    text-decoration: none;\n}\n\n#carbonads a:hover {\n    color: inherit;\n}\n\n#carbonads span {\n    position: relative;\n    display: block;\n    overflow: hidden;\n}\n\n#carbonads .carbon-wrap {\n    display: flex;\n}\n\n.carbon-img {\n    display: block;\n    margin: 0;\n    line-height: 1;\n}\n\n.carbon-img img {\n    display: block;\n}\n\n.carbon-text {\n    font-size: 13px;\n    padding: 10px;\n    line-height: 1.5;\n    text-align: left;\n}\n\n.carbon-poweredby {\n    display: block;\n    padding: 8px 10px;\n    background: repeating-linear-gradient(-45deg, transparent, transparent 5px, hsla(0, 0%, 0%, .025) 5px, hsla(0, 0%, 0%, .025) 10px) hsla(203, 11%, 95%, .4);\n    text-align: center;\n    text-transform: uppercase;\n    letter-spacing: .5px;\n    font-weight: 600;\n    font-size: 9px;\n    line-height: 1;\n}\n</style>\n-->\n"
  },
  {
    "path": "website/docs/.vuepress/theme/components/Home.vue",
    "content": "<template>\n  <main\n    class=\"home\"\n    :aria-labelledby=\"data.heroText !== null ? 'main-title' : null\"\n  >\n    <header class=\"hero\">\n      <img\n        v-if=\"data.heroImage\"\n        :src=\"$withBase(data.heroImage)\"\n        :alt=\"data.heroAlt || 'hero'\"\n      >\n\n        <div>\n            <h1\n                v-if=\"data.heroText !== null\"\n                id=\"main-title\"\n            >\n                {{ data.heroText || $title || 'Hello' }}\n            </h1>\n            <p\n\n                v-if=\"data.tagline !== null\"\n                class=\"description\"\n                v-html=\"data.tagline || $description || 'Welcome to your VuePress site'\"\n            >\n            </p>\n            <p\n\n                v-if=\"data.actionText && data.actionLink\"\n                class=\"action\"\n            >\n                <NavLink\n                    class=\"action-button\"\n                    :item=\"actionLink\"\n                />\n            </p>\n        </div>\n    </header>\n\n      <ClientOnly>\n          <HomepageGrid></HomepageGrid>\n      </ClientOnly>\n\n    <div\n      v-if=\"data.features && data.features.length\"\n      class=\"features\"\n    >\n      <div\n        v-for=\"(feature, index) in data.features\"\n        :key=\"index\"\n        class=\"feature\"\n      >\n        <h2>{{ feature.title }}</h2>\n        <p>{{ feature.details }}</p>\n      </div>\n    </div>\n\n    <Content class=\"theme-default-content custom\" />\n\n  </main>\n</template>\n\n<script>\nimport NavLink from '@parent-theme/components/NavLink.vue'\n\nexport default {\n  name: 'Home',\n\n  components: { NavLink },\n\n  computed: {\n    data () {\n      return this.$page.frontmatter\n    },\n\n    actionLink () {\n      return {\n        link: this.data.actionLink,\n        text: this.data.actionText\n      }\n    }\n  }\n}\n</script>\n\n<style lang=\"stylus\">\n.home\n  padding $navbarHeight 2rem 0\n  max-width $homePageWidth\n  margin 0px auto\n  display block\n  .hero\n    //text-align center\n    display flex\n    //align-items center\n    align-items flex-start\n    justify-content center\n    text-align left\n    img\n      max-width: 100%\n      max-height 280px\n      display block\n      margin 3rem auto 1.5rem\n    h1\n      font-size 3rem\n    h1, .description, .action\n      margin 1.8rem auto\n    .description\n      max-width 35rem\n      font-size 1.6rem\n      line-height 1.3\n      color lighten($textColor, 40%)\n    .action-button\n      display inline-block\n      font-size 1.2rem\n      color #fff\n      background-color $accentColor\n      padding 0.8rem 1.6rem\n      border-radius 4px\n      transition background-color .1s ease\n      box-sizing border-box\n      border-bottom 1px solid darken($accentColor, 10%)\n      &:hover\n        background-color lighten($accentColor, 10%)\n  .features\n    border-top 1px solid $borderColor\n    padding 1.2rem 0\n    margin-top 2.5rem\n    display flex\n    flex-wrap wrap\n    align-items flex-start\n    align-content stretch\n    justify-content space-between\n  .feature\n    flex-grow 1\n    flex-basis 30%\n    max-width 30%\n    h2\n      font-size 1.4rem\n      font-weight 500\n      border-bottom none\n      padding-bottom 0\n      color lighten($textColor, 10%)\n    p\n      color lighten($textColor, 25%)\n  .footer\n    padding 2.5rem\n    border-top 1px solid $borderColor\n    text-align center\n    color lighten($textColor, 25%)\n\n@media (max-width: $MQMobile)\n  .home\n    .features\n      flex-direction column\n    .feature\n      max-width 100%\n      padding 0 2.5rem\n\n@media (max-width: $MQMobileNarrow)\n  .home\n    padding-left 1.5rem\n    padding-right 1.5rem\n    .hero\n        flex-direction column\n        text-align center\n      img\n        max-height 210px !important\n        margin 2rem auto 1.2rem !important\n      h1\n        font-size 2rem\n        margin-top 0 !important\n      h1, .description, .action\n        margin 1.2rem auto\n      .description\n        font-size 1.2rem\n      .action-button\n        font-size 1rem\n        padding 0.6rem 1.2rem\n    .feature\n      h2\n        font-size 1.25rem\n</style>\n"
  },
  {
    "path": "website/docs/.vuepress/theme/index.js",
    "content": "module.exports = {\n\textend: '@vuepress/theme-default'\n}\n"
  },
  {
    "path": "website/docs/.vuepress/theme/layouts/Layout.vue",
    "content": "<template>\n    <ParentLayout>\n        <template #sidebar-top>\n            <CarbonAds/>\n        </template>\n        <template #sidebar-bottom>\n            <footer class=\"footer\">\n                A product by:\n                <a href=\"https://www.jbaysolutions.com/\" target=\"_blank\" rel=\"noopener\" class=\"footer-card\">\n                    <img :src=\"$withBase('/assets/img/logo-jbay.png')\" alt=\"JBay Solutions\"/>\n                </a>\n            </footer>\n        </template>\n    </ParentLayout>\n</template>\n\n<script>\nimport ParentLayout from '@parent-theme/layouts/Layout.vue'\nimport CarbonAds from '../components/CarbonAds'\n\nexport default {\n    name: 'Layout',\n\n    components: {\n        ParentLayout,\n        CarbonAds,\n    }\n}\n</script>\n\n<style scoped>\n.footer {\n    box-sizing: border-box;\n    padding: 1em 1em 1em 2em;\n    margin-top: auto;\n    width: 100%;\n    font-size: .8em;\n    color: #647d96;\n}\n\n.footer-card {\n    display: block;\n    max-width: 120px;\n    width: 90%;\n    margin-bottom: 1em;\n    margin-top: 1em;\n}\n\n</style>\n"
  },
  {
    "path": "website/docs/README.md",
    "content": "---\nlayout: HomeLayout\nhome: true\nheroImage: /assets/img/logo.png\nheroText: Vue Grid Layout\ntagline: A grid layout system for Vue.js, like <a href=\"http://dsmorse.github.io/gridster.js/\" target=\"_blank\">Gridster</a>, for Vue.js. Heavily inspired by <a href='https://github.com/STRML/react-grid-layout' target='_blank'>React-Grid-Layout</a> \nactionText: Get Started →\nactionLink: /guide/\nfeatures:\n- title: ✥ Draggable widgets\n  details:\n- title: ⇲ Resizable widgets\n  details:\n- title: Static widgets\n  details: \n- title: Bounds checking for dragging and resizing\n  details: \n- title: Widgets can be added or removed without rebuilding grid\n  details: \n- title: Layout can be serialized and restored\n  details: \n- title: Automatic RTL support (resizing not working with RTL on 2.2.0)\n  details: \n- title: Responsive\n  details: \n- title: Min/max w/h per item\n  details: \n---\n\n<HomeFooter></HomeFooter>\n\n"
  },
  {
    "path": "website/docs/changelog/README.md",
    "content": "---\nsidebar: auto\n---\n# Changelog\n\n## 2.4.0 (Aug 3, 2022)\n\n* GridLayout transformScale prop, to allow proper dragging and resizing when scaled (#430) (thanks [adt-hgkim](https://github.com/adt-hgkim))\n* GridLayout and GridItem isBounded prop, to prevent draging outside of the parent element (#523) (thanks [rin4ik](https://github.com/rin4ik))\n* Added GridItem passthrough options for interact resizable and draggable (#181) (thanks [llezenelrahc](https://github.com/llezenelrahc))\n* Change function call order for responsive features (thanks [william8012](https://github.com/william8012))\n* Added GridLayout restoreOnDrag prop, to generate less gaps on drag when verticalCompact is false (thanks [jledentu](https://github.com/jledentu))\n* added unit tests (thanks [ygj6](https://github.com/ygj6))\n* layout key extra validations (thanks [ygj6](https://github.com/ygj6))\n* Fix grid items overlapping when using autoSize() (thanks [ygj6](https://github.com/ygj6) and [savandriy](https://github.com/savandriy))\n\n## 2.3.12 (Jan 15, 2020)\n\n* Bumped interact.js to 1.10.2\n* Added 'preserveAspectRatio' property to GridItem (thanks [validide](https://github.com/validide))\n\n## 2.3.11 (Oct 13, 2020)\n\n* fix: regression when using responsive layout (#487)\n\n## 2.3.10 (Oct 12, 2020)\n\n* Bumped interact.js to 1.10.0, now imported as ES6 modules to optimize size \n* fix: resizing a grid item in RTL mode wasn't working (thanks [or-lat](https://github.com/or-lat)) \n* Added GridLayout.useStyleCursor property to fix possible browser freezes (thanks [mosuzi](https://github.com/mosuzi)) \n* fix: wrong parent layout when GridItem is not the child of GridLayout (thanks [lzq4047](https://github.com/lzq4047)) \n* Fix: Item's size changes when hiding/displaying it again in responsive mode (thanks [lustan3216](https://github.com/lustan3216)) \n\n## 2.3.9 (Sep 28, 2020)\n\n* Fix plugin installation (fixes #311) (thanks [yfwz100](https://github.com/yfwz100))\n* Bumped interact.js to 1.9.22\n\n## 2.3.8 (July 31, 2020)\n\n* Make margins reactive (thanks [yfwz100](https://github.com/yfwz100))\n* Added missing 'layout-updated' events (thanks [ben-lau](https://github.com/ben-lau))\n* Support for initial responsive layouts and breakpoint change event (thanks [ftylitak](https://github.com/ftylitak))\n* Bugfix for possible error when layout items get removed and interactObj is not set (thanks [Tofandel](https://github.com/Tofandel))\n* Fix wrong grid item sorting in responsive mode (thanks [pieterbeulque](https://github.com/pieterbeulque))\n\n## 2.3.7 (Oct 31, 2019)\n\n* renamed 'resized' event emitted when the container changes size (browser window or other), introduced in #337, fixes #358 \n* bugfix on layout-ready event\n\n## 2.3.6 (Sep 11, 2019)\n\n* reverted grid item w and h previous rounding change, fixes #355\n\n## 2.3.5 (Sep 7, 2019)\n\n* Fix: no-touch on mobile and only if item is draggable or resizable (thanks [DGoms](https://github.com/DGoms)).\n* Prevent collision feature (thanks [SheanDe](https://github.com/SheanDe)).\n* Simplified Chinese README (thanks [harrywangchina](https://github.com/harrywangchina)).\n* 'resized' event now emitted if grid item is resized due to changes other than a manual resize (e.g. browser window resize) (thanks [pmorch](https://github.com/pmorch)).\n* Improvement on 'layout-ready' event emit (thanks [pmorch](https://github.com/pmorch)).\n* Added watchers for min/max height and width (thanks [grinat](https://github.com/grinat)).\n* Improvement: make sure the size of grid-item is bigger than the slot-item (thanks [ywmail](https://github.com/ywmail)).\n\n## 2.3.4 (Mar 5, 2019)\n\n* Support for static items (thanks [panjiangyi](https://github.com/panjiangyi)).\n* RTL bugfix (thanks [irvingwa](https://github.com/irvingwa)).\n* Memory leak fixes (thanks [aiankile](https://github.com/aiankile)).\n* Fixed exception on grid layout mount (thanks [BenoitZugmeyer](https://github.com/BenoitZugmeyer)).\n* Fixed overlapping and resizing bugs on responsive mode (thanks [shpfive](https://github.com/shpfive)).\n* Added new events emited by GridLayout (layout-created, layout-before-mount, layout-mounted, layout-ready) (thanks [samuelmolinski](https://github.com/samuelmolinski)).\n\n## 2.3.3 (Dec 26, 2018)\n\n* Reverted adding vue as external, which caused problems loading umd.\n\n## 2.3.2 (Dec 13, 2018)\n\n* Added vue as externals webpack config to fix startup problems (thanks [Micene9](https://github.com/Micene09))\n\n## 2.3.1 (Nov 6, 2018)\n\n* Previous fix for touch dragging on Android broke dragging on other mobile browsers (thanks [onx2](https://github.com/onx2))\n\n\n## 2.3.0 (Oct 26, 2018)\n\n* Responsive layout support (thanks [shpfive](https://github.com/shpfive))\n* Fix for touch dragging on Android (thanks [pbabey](https://github.com/pbabey))\n\n## 2.2.0 (Sep 10, 2018)\n\n* changed project structure and build using Vue CLI\n* GridItem new autosize method. For now, need to be called from child component with this.$parent.autoSize() (thanks[mech01nc01](https://github.com/mech01nc01)) \n* Abstract DOM related calls for initial SSR Support (thanks[Kukks](https://github.com/Kukks)) \n* GridItem.i can now be a number or a string (thanks[xch1029](https://github.com/xch1029)) \n* Use interactjs size restrictions to limit resizing (thanks[LuisCarreras](https://github.com/LuisCarreras)) \n* Fixed interactjs instance leak on instance release (thanks[zzuligy](https://github.com/zzuligy)) \n\n## 2.1.13 (May 2, 2018)\n\n* Resize event now also emits dimensions in pixels (thanks [buremba](https://github.com/buremba)) \n* Support for dynamic col-num (#121) (thanks [ittus](https://github.com/ittus)) \n\n## 2.1.12 (Fev 27, 2018)\n\n* Updated interact.js to 1.3.3 (#144) \n\n## 2.1.11 (Jan 5, 2018)\n\n* Fixed issue with multiple grids on same vm (#134) (thanks [Suen](https://github.com/sunzongzheng))\n* Fixed issue with layout update on reassignment (#130) (thanks [daizengyu](https://github.com/daizengyu123))\n\n## 2.1.10 (Dec 15, 2017)\n\n* Fixed possible bug related with #119\n* Changed css translate to translate3d (#96)\n* Added is-mirrored config, allowing the grid items to be rendered from right to left (horizontal flip) (thanks [kweij](https://github.com/kweij))\n* Added grid updated event for easier integration with vuex (thanks [SergeyKhval](https://github.com/SergeyKhval))\n\n## 2.1.9 (Aug 17, 2017)\n\n* Fixed local module reference to interact.js\n\n## 2.1.8 (Aug 17, 2017)\n\n* Fixed #61 and #37\n* Fixed #82\n* Fixed #87\n\n## 2.1.7 (Aug 17, 2017)\n\n* Fixed #59\n* Fixed #83\n* Implemented support for dragAllowFrom and dragIgnoreFrom props on GridItem (thanks [ThePlastic](https://github.com/ThePlastic))\n\n## 2.1.6 (Apr 6, 2017)\n\n* Fixed #43, configurable drag elements ignore on grid item contents (thanks [neithere](https://github.com/neithere)) \n* Fix for getLayoutItem, sometimes returns null elements (thanks [pbabey](https://github.com/pbabey))\n\n## 2.1.5 (Mar 24, 2017)\n\n* Really fixed #22 #32, multiple grid instances were not working properly in 2.1.4\n* resizedEvent now also returns item width and height in pixels (implements #34)\n\n\n## 2.1.4 (Mar 20, 2017)\n\n* Implemented #32, support for multiple grid instances on the same page\n\n## 2.1.3 (Mar 9, 2017)\n\n* Fixed #27, props mutation warnings\n\n\n## 2.1.2 (Fev 16, 2017)\n\n* Implemented #12, buttons on GridItems would trigger drag on mobile\n* Implemented #24, listeners removal beforeDestroy (thanks [pbabey](https://github.com/pbabey))\n\n\n## 2.1.1 (Fev 9, 2017)\n\n* Implemented #13, dynamic row height update support\n* Implemented #23, dynamic enable/disable dragging and resizing support\n* Implemented #21, moved and resized events\n\n\n## 2.1.0 (Fev 6, 2017)\n\n* RTL support (thanks [easteregg](https://github.com/easteregg))\n* Move and resize events (thanks [ThePlastic](https://github.com/ThePlastic))\n"
  },
  {
    "path": "website/docs/guide/01-basic.md",
    "content": "# 01 - Basic \n\n[View source](https://github.com/jbaysolutions/vue-grid-layout/blob/master/website/docs/.vuepress/components/Example01Basic.vue)\n\n<ClientOnly>\n<Example01Basic></Example01Basic>\n</ClientOnly>\n\n"
  },
  {
    "path": "website/docs/guide/02-events.md",
    "content": "# 02 - Move and resize events \n\n[View source](https://github.com/jbaysolutions/vue-grid-layout/blob/master/website/docs/.vuepress/components/Example02Events.vue)\n\n<ClientOnly>\n<Example02Events></Example02Events>\n</ClientOnly>\n"
  },
  {
    "path": "website/docs/guide/03-multiple-grids.md",
    "content": "# 03 - Multiple grids \n\n[View source](https://github.com/jbaysolutions/vue-grid-layout/blob/master/website/docs/.vuepress/components/Example03MultipleGrids.vue)\n\n<ClientOnly>\n<Example03MultipleGrids></Example03MultipleGrids>\n</ClientOnly>\n\n"
  },
  {
    "path": "website/docs/guide/04-allow-ignore.md",
    "content": "# 04 - Drag allow/ignore elements \n\nIgnore drag on certain elements and allow on others.\n\nClick and drag the dots on the corner of each item to reposition\n\n[View source](https://github.com/jbaysolutions/vue-grid-layout/blob/master/website/docs/.vuepress/components/Example04AllowIgnore.vue)\n\n<ClientOnly>\n<Example04AllowIgnore></Example04AllowIgnore>\n</ClientOnly>\n\n"
  },
  {
    "path": "website/docs/guide/05-mirrored.md",
    "content": "# 05 - Mirrored grid layout \n\n[View source](https://github.com/jbaysolutions/vue-grid-layout/blob/master/website/docs/.vuepress/components/Example05Mirrored.vue)\n\n<ClientOnly>\n<Example05Mirrored></Example05Mirrored>\n</ClientOnly>\n\n"
  },
  {
    "path": "website/docs/guide/06-responsive.md",
    "content": "# 06 - Responsive \n\n[View source](https://github.com/jbaysolutions/vue-grid-layout/blob/master/website/docs/.vuepress/components/Example06Responsive.vue)\n\n<ClientOnly>\n<!--iframe style=\"border:0;width: 100%;height:3000px;\" src=\"../examples/06-responsive.html\"></iframe-->\n<Example06Responsive></Example06Responsive>\n</ClientOnly>\n\n"
  },
  {
    "path": "website/docs/guide/07-prevent-collision.md",
    "content": "# 07 - Prevent Collision \n\n[View source](https://github.com/jbaysolutions/vue-grid-layout/blob/master/website/docs/.vuepress/components/Example07PreventCollision.vue)\n\n<ClientOnly>\n<!--iframe style=\"border:0;width: 100%;height:1000px;\" src=\"../examples/07-prevent-collision.html\"></iframe-->\n<Example07PreventCollision></Example07PreventCollision>\n</ClientOnly>\n"
  },
  {
    "path": "website/docs/guide/08-responsive-predefined-layouts.md",
    "content": "# 08 - Responsive with predefined layouts \n\n[View source](https://github.com/jbaysolutions/vue-grid-layout/blob/master/website/docs/.vuepress/components/Example08ResponsivePredefinedLayouts.vue)\n\n<ClientOnly>\n<Example08ResponsivePredefinedLayouts></Example08ResponsivePredefinedLayouts>\n</ClientOnly>\n"
  },
  {
    "path": "website/docs/guide/09-dynamic-add-remove.md",
    "content": "# 09 - Dynamic Add/Remove \n\n[View source](https://github.com/jbaysolutions/vue-grid-layout/blob/master/website/docs/.vuepress/components/Example09DynamicAddRemove.vue)\n\n<ClientOnly>\n<!--iframe style=\"border:0;width: 100%;height:800px;\" src=\"../examples/09-dynamic-add-remove.html\">\n</iframe-->\n<Example09DynamicAddRemove></Example09DynamicAddRemove>\n</ClientOnly>\n"
  },
  {
    "path": "website/docs/guide/10-drag-from-outside.md",
    "content": "# 10 - Drag From Outside \n\nThis demo shows what happens when an item is added from outside of the grid.\n<br/>\nOnce you drop the item within the grid you'll get its coordinates/properties and can perform actions with it accordingly.\n\n[View source](https://github.com/jbaysolutions/vue-grid-layout/blob/master/website/docs/.vuepress/components/Example10DragFromOutside.vue)\n\n<ClientOnly>\n<Example10DragFromOutside></Example10DragFromOutside>\n</ClientOnly>\n"
  },
  {
    "path": "website/docs/guide/11-bounded.md",
    "content": "# 11 - Dragging grid items bounded to grid container\n\n[View source](https://github.com/jbaysolutions/vue-grid-layout/blob/master/website/docs/.vuepress/components/Example11Bounded.vue)\n\n<ClientOnly>\n<Example11Bounded></Example11Bounded>\n</ClientOnly>\n"
  },
  {
    "path": "website/docs/guide/README.md",
    "content": "# Installation\n\n## NPM\n\n\tnpm install vue-grid-layout --save\n    \n## Yarn\n\n    yarn add vue-grid-layout\n\n\nImport the library\n\n```javascript\n    import VueGridLayout from 'vue-grid-layout';\n```\n\nAdd to other Vue components \n\n ```javascript\n    export default {\n        components: {\n            GridLayout: VueGridLayout.GridLayout,\n            GridItem: VueGridLayout.GridItem\n        },\n    // ... data, methods, mounted (), etc.\n    }\n    \n```    \n\n## browser\n\nInclude the browser-ready bundle (download from [releases](https://github.com/jbaysolutions/vue-grid-layout/releases)) in your page. The components will be automatically available.\n\n```html\n    <script src=\"vue-grid-layout.umd.min.js\"></script>\n```\n\n"
  },
  {
    "path": "website/docs/guide/auto-size.md",
    "content": "# Auto Sizing Grid Items\n\nTODO: https://github.com/jbaysolutions/vue-grid-layout/issues/351\n"
  },
  {
    "path": "website/docs/guide/events.md",
    "content": "# Events\n\nMove and resize event listeners can be added to each grid-item, so that the parent Vue can be notified when a grid element is being moved or resized.\nMoved and resized event listeners can be added, if the only notification needed is when an item is finished moving or resizing.\n\nWorking example [here](../guide/02-events.md)   \n\n````html\n\n    <grid-layout\n            :layout=\"layout\"\n            :col-num=\"12\"\n            :row-height=\"30\"\n            :is-draggable=\"true\"\n            :is-resizable=\"true\"\n            :vertical-compact=\"true\"\n            :margin=\"[10, 10]\"\n            :use-css-transforms=\"true\"\n            @layout-created=\"layoutCreatedEvent\"\n            @layout-before-mount=\"layoutBeforeMountEvent\"\n            @layout-mounted=\"layoutMountedEvent\"\n            @layout-ready=\"layoutReadyEvent\"\n            @layout-updated=\"layoutUpdatedEvent\"\n            @breakpoint-changed=\"breakpointChangedEvent\"\n    >\n\n        <grid-item v-for=\"item in layout\"\n                   :x=\"item.x\"\n                   :y=\"item.y\"\n                   :w=\"item.w\"\n                   :h=\"item.h\"\n                   :i=\"item.i\"\n                   :key=\"item.i\"\n                   @resize=\"resizeEvent\"\n                   @move=\"moveEvent\"\n                   @resized=\"resizedEvent\"\n                   @container-resized=\"containerResizedEvent\"\n                   @moved=\"movedEvent\">\n            {{item.i}}\n        </grid-item>\n    </grid-layout>\n```` \n\n## GridLayout\n\n### layoutCreatedEvent\n\nLayout created event\n\nEmited on the component created lifecycle hook\n\n```javascript\n    layoutCreatedEvent: function(newLayout){\n      console.log(\"Created layout: \", newLayout)\n    }\n```\n\n### layoutBeforeMountEvent\n\nLayout beforeMount event\n\nEmited on the component beforeMount lifecycle hook\n\n```javascript\n    layoutBeforeMountEvent: function(newLayout){\n      console.log(\"beforeMount layout: \", newLayout)\n    }\n```\n\n### layoutMountedEvent\n\nLayout mounted event\n\nEmited on the component mounted lifecycle hook\n\n```javascript\n    layoutMountedEvent: function(newLayout){\n      console.log(\"Mounted layout: \", newLayout)\n    }\n```\n\n### layoutReadyEvent\n\nLayout ready event\n\nEmited when all the operations on the mount hook finish\n\n```javascript\n    layoutReadyEvent: function(newLayout){\n      console.log(\"Ready layout: \", newLayout)\n    }\n```\n\n### layoutUpdatedEvent\n\nLayout updated event\n\nEvery time the layout has finished updating and positions of all grid-items are recalculated\n\n```javascript\n    layoutUpdatedEvent: function(newLayout){\n      console.log(\"Updated layout: \", newLayout)\n    }\n```\n\n\n### breakpointChangedEvent\n\nBreakpoint Changed event\n\nEvery time the breakpoint value changes due to window resize\n \n```javascript\n    /**\n     * \n     * @param newBreakpoint the breakpoint name\n     * @param newLayout the chosen layout for the breakpoint\n     * \n     */\n    breakpointChangedEvent: function(newBreakpoint, newLayout){\n        console.log(\"BREAKPOINT CHANGED breakpoint=\", newBreakpoint, \", layout: \", newLayout );\n    },\n``` \n\n\n## GridItem\n\n### moveEvent\n\nMove event\n\nEvery time an item is being moved and changes position\n\n```javascript\n    moveEvent: function(i, newX, newY){\n        console.log(\"MOVE i=\" + i + \", X=\" + newX + \", Y=\" + newY);\n    },\n```\n\n### resizeEvent\n\nResize event\n\nEvery time an item is being resized and changes size\n \n```javascript\n    resizeEvent: function(i, newH, newW, newHPx, newWPx){\n        console.log(\"RESIZE i=\" + i + \", H=\" + newH + \", W=\" + newW + \", H(px)=\" + newHPx + \", W(px)=\" + newWPx);\n    },\n``` \n\n### movedEvent\n\nMoved event\n\nEvery time an item is finished being moved and changes position\n\n```javascript\n    movedEvent: function(i, newX, newY){\n        console.log(\"MOVED i=\" + i + \", X=\" + newX + \", Y=\" + newY);\n    },\n```\n\n### resizedEvent\n\nResized event\n\nEvery time an item is finished being resized and changes size\n \n```javascript\n    /**\n     * \n     * @param i the item id/index\n     * @param newH new height in grid rows \n     * @param newW new width in grid columns\n     * @param newHPx new height in pixels\n     * @param newWPx new width in pixels\n     * \n     */\n    resizedEvent: function(i, newH, newW, newHPx, newWPx){\n        console.log(\"RESIZED i=\" + i + \", H=\" + newH + \", W=\" + newW + \", H(px)=\" + newHPx + \", W(px)=\" + newWPx);\n    },\n``` \n\n### containerResizedEvent\n\nContainer Resized event\n\nEvery time the grid item/layout container changes size (browser window or other)\n \n```javascript\n    /**\n     * \n     * @param i the item id/index\n     * @param newH new height in grid rows \n     * @param newW new width in grid columns\n     * @param newHPx new height in pixels\n     * @param newWPx new width in pixels\n     * \n     */\n    containerResizedEvent: function(i, newH, newW, newHPx, newWPx){\n        console.log(\"CONTAINER RESIZED i=\" + i + \", H=\" + newH + \", W=\" + newW + \", H(px)=\" + newHPx + \", W(px)=\" + newWPx);\n    },\n``` \n\n"
  },
  {
    "path": "website/docs/guide/examples.md",
    "content": "# Examples\n\n## Basic\n\n<Grid01Basic></Grid01Basic>\n\n## Events\n\n<Grid02Events></Grid02Events>\n\n## Multiple Grids\n\n<Grid03MultipleGrids></Grid03MultipleGrids>\n\n## Drag allow/ignore elements\n\nIgnore drag on certain elements and allow on on others.\n\nClick and drag the dots on the corner of each item to reposition\n\n<Grid04AllowIgnore></Grid04AllowIgnore>\n"
  },
  {
    "path": "website/docs/guide/properties.md",
    "content": "# Properties\n\n## GridLayout\n\n### layout\n\n   \n* type: `Array`\n* required: `true`\n\nThis is the initial layout of the grid.\n\nThe value must be an `Array` of `Object` items. Each item must have `i`, `x`, `y`, `w` and `h` properties. Please refer to the documentation for `GridItem` below for more information.\n\n### responsiveLayouts\n\n* type: `Object`\n* required: `false`\n* default : `{}`\n\nThis is the initial layouts of the grid per breakpoint if `responsive` is set to `true`.\nThe keys of the `Object` are breakpoint names and each value is an `Array` of `Object` items as defined by `layout` prop. eg:{ lg:[layout items], md:[layout items] }.\nSetting the prop after the creation of the GridLayout has no effect.\n\nSee also [responsive](#responsive), [breakpoints](#breakpoints) and [cols](#cols)\n\n### colNum\n    \n* type: `Number`\n* required: `false`\n* default: `12`\n\nSays how many columns the grid has.\n\nThe value should be a _natural number_. \n\n### rowHeight\n    \n* type: `Number`\n* required: `false`\n* default: `150`\n\nSays what is a height of a single row in pixels.\n\n### maxRows\n    \n* type: `Number`\n* required: `false`\n* default: `Infinity`\n\nSays what is a maximal number of rows in the grid.\n\n### margin\n    \n* type: `Array`\n* required: `false`\n* default: `[10, 10]`\n\nSays what are the margins of elements inside the grid.\n\nThe value must be a two-element `Array` of `Number`. Each value is expressed in pixels. The first element is a margin horizontally, the second element is a vertical margin.\n\n### isDraggable\n    \n* type: `Boolean`\n* required: `false`\n* default: `true`\n\nSays if the grids items are draggable.\n\n### isResizable\n    \n* type: `Boolean`\n* required: `false`\n* default: `true`\n\nSays if the grids items are resizable.\n\n### isMirrored\n    \n* type: `Boolean`\n* required: `false`\n* default: `false`\n\nSays if the RTL/LTR should be reversed.\n\n### isBounded\n    \n* type: `Boolean`\n* required: `false`\n* default: `false`\n\nSays if the grid items are bounded to the container when dragging\n\n### autoSize\n    \n* type: `Boolean`\n* required: `false`\n* default: `true`\n\nSays if the container height should swells and contracts to fit contents.\n\n### verticalCompact\n    \n* type: `Boolean`\n* required: `false`\n* default: `true`\n\nSays if the layout should be compact vertically.\n\n### restoreOnDrag\n    \n* type: `Boolean`\n* required: `false`\n* default: `false`\n\nSays if the moved grid items should be restored after an item has been dragged over.\n\n### preventCollision\n    \n* type: `Boolean`\n* required: `false`\n* default: `false`\n\nSays if grid items will move when being dragged over.\n\n### useCssTransforms\n    \n* type: `Boolean`\n* required: `false`\n* default: `true`\n\nSays if the CSS `transition-property: transform;` should be used.\n\n### responsive\n    \n* type: `Boolean`\n* required: `false`\n* default: `false`\n\nSays if the layout should be responsive to window width\n\nSee also [responsiveLayouts](#responsivelayouts), [breakpoints](#breakpoints) and [cols](#cols)\n\n\n### breakpoints\n\n* type: `Object`\n* required: `false`\n* default: { lg: 1200, md: 996, sm: 768, xs: 480, xxs: 0 }\n\nBreakpoints defined for responsive layout, the parameter represents the width of different devices:lg(large), md(medium), sm(small), xs(extra small). Sets widths on wich column number changes\n\nSee also [responsiveLayouts](#responsivelayouts) and [cols](#cols)\n\n### cols\n\n* type: `Object`\n* required: `false`\n* default: { lg: 12, md: 10, sm: 6, xs: 4, xxs: 2 }\n\nDefines number of columns for each breakpoint\n\n### useStyleCursor\n\n* type: `Boolean`\n* required: `false`\n* default: `true`\n\nSays if set the `styleCursor` option to true. When dragging freezes, setting this value to `false` may alleviate problems. \n**This property is not reactive**\n           \n\n### transformScale\n\n* type: `Number`\n* required: `false`\n* default: 1\n\nSets a scaling factor to the size of the grid items, 1 is 100%\n\n## GridItem\n\n### i\n    \n* type: `String`\n* required: `true`\n\nThis is the unique identifier of the item.\n\n### x\n    \n* type: `Number`\n* required: `true`\n\nSays what is a initial horizontal position of the item (in which column it should be placed).\n\nThe value must be a _whole number_. \n\n### y\n    \n* type: `Number`\n* required: `true`\n\nSays what is a initial vertical position of the item (in which row it should be placed).\n\nThe value must be a _whole number_. \n\n### w\n    \n* type: `Number`\n* required: `true`\n\nSays what is a initial width of the item.\n\nThe value is a number that is multiplied by `colWidth`.\n\n### h\n    \n* type: `Number`\n* required: `true`\n\nSays what is a initial height of the item.\n\nThe value is a number that is multiplied by `rowHeight`.\n\n### minW\n    \n* type: `Number`\n* required: `false`\n* default: `1`\n\nSays what is a minimal width of the item. If `w` will be smaller then `minW` then `w` will be set to `minW`.\n\nThe value is a number that is multiplied by `colWidth`.\n\n### minH\n    \n* type: `Number`\n* required: `false`\n* default: `1`\n\nSays what is a minimal hieght of the item. If `h` will be smaller then `minH` then `h` will be set to `minH`.\n\nThe value is a number that is multiplied by `rowHeight`.\n\n### maxW\n    \n* type: `Number`\n* required: `false`\n* default: `Infinity`\n\nSays what is a maximal width of the item. If `w` will be bigger then `maxW` then `w` will be set to `maxW`.\n\nThe value is a number that is multiplied by `colWidth`.\n\n### maxH\n    \n* type: `Number`\n* required: `false`\n* default: `Infinity`\n\nSays what is a maximal height of the item. If `h` will be bigger then `maxH` then `h` will be set to `maxH`.\n\nThe value is a number that is multiplied by `rowHeight`\n\n### isDraggable\n    \n* type: `Boolean`\n* required: `false`\n* default: `null`\n\nSays if item is draggable.\n\nIf default value is `null` then it's inherited from parent.\n\n### isResizable\n    \n* type: `Boolean`\n* required: `false`\n* default: `null`\n\nSays if item is resizable.\n\nIf default value is `null` then it's inherited from parent.\n\n### isBounded\n\n* type: `Boolean`\n* required: `false`\n* default: `null`\n\nSays if the item is bounded to the container when dragging.\n\nIf default value is `null` then it's inherited from parent.\n\n### static\n    \n* type: `Boolean`\n* required: `false`\n* default: `false`\n\nSays if item is static (won't be draggable, resizable or moved by other items).\n\n\n### dragIgnoreFrom\n\n* type: `String`\n* required: `false`\n* default: `'a, button'`\n\nSays which elements of the item shouldn't trigger drag event of the item.\n\nThe value is `css-like` selector string.\n\nFor more info please refer to `ignoreFrom` in [interact.js docs](http://interactjs.io/docs/#ignorable-selectors).\n\n### dragAllowFrom\n    \n* type: `String`\n* required: `false`\n* default: `null`\n\nSays which elements of the item should trigger drag event of the item.\n\nThe value is `css-like` selector string.\n\nIf `null` then one can drag by any (excluding `dragIgnoreFrom`) element of the item.\n\nFor more info please refer to `allowFrom` in [interact.js docs](http://interactjs.io/docs/#ignorable-selectors).\n\n### resizeIgnoreFrom\n    \n* type: `String`\n* required: `false`\n* default: `'a, button'`\n\nSays which elements of the item shouldn't trigger resize event of the item.\n\nThe value is `css-like` selector string.\n\nFor more info please refer to `ignoreFrom` in [interact.js docs](http://interactjs.io/docs/#ignorable-selectors).\n\n\n### preserveAspectRatio\n\n* type: `Boolean`\n* required: `false`\n* default: `false`\n\nIf 'true', forces the GridItem to preserve its aspect ratio when resizing. \n         \n\n### dragOption\n\n* type: `Object`\n* required: `false`\n* default: `{}`\n\nPassthrough object for the grid item [interact.js draggable configuration](https://interactjs.io/docs/draggable/)   \n         \n### resizeOption\n\n* type: `Object`\n* required: `false`\n* default: `{}`\n\nPassthrough object for the grid item [interact.js resizable configuration](https://interactjs.io/docs/resizable/)   \n         \n"
  },
  {
    "path": "website/docs/guide/styling.md",
    "content": "# Styling\n\nGrid styling can be customized to fit your needs. Below is a list of the classes you can override.\n\n## Placeholder \n  \nThe default css for the placeholder is:\n\n````css\n.vue-grid-item.vue-grid-placeholder {\n    background: red;\n    opacity: 0.2;\n    transition-duration: 100ms;\n    z-index: 2;\n    -webkit-user-select: none;\n    -moz-user-select: none;\n    -ms-user-select: none;\n    -o-user-select: none;\n    user-select: none;\n}  \n````\n  \nYou can override the properties using the !important rule:  \n  \n````css\n.vue-grid-item.vue-grid-placeholder {\n    background: green !important;\n}\n````\n\nOr by wrapping your grid with a more [specific](https://developer.mozilla.org/en-US/docs/Web/CSS/Specificity) class:\n\n````css\n.container .vue-grid-item.vue-grid-placeholder {\n    background: green;\n}\n````\n\nIn this example we change the placeholder background color to green:\n\n[View source](https://github.com/jbaysolutions/vue-grid-layout/blob/master/website/docs/.vuepress/components/ExampleStylingPlaceholder.vue)\n\n<ClientOnly>\n<ExampleStylingPlaceholder></ExampleStylingPlaceholder>\n</ClientOnly>\n\n\n## Grid lines\n     \nTo add grid lines to the layout, add the ``grid`` class to the grid-layout element and use the css:\n\n````css\n.grid::before {\n    content: '';\n    background-size: calc(calc(100% - 5px) / 12) 40px;\n    background-image: linear-gradient(\n            to right,\n            lightgrey 1px,\n            transparent 1px\n    ),\n    linear-gradient(to bottom, lightgrey 1px, transparent 1px);\n    height: calc(100% - 5px);\n    width: calc(100% - 5px);\n    position: absolute;\n    background-repeat: repeat;\n    margin:5px;\n}\n````\n\nCSS calculations for grid lines: \n\n* background size = calc(calc(100% - (margin/2)) / colNum) rowHeight + margin;\n* height: calc(100% - (margin/2))\n* width: calc(100% - (margin/2))\n* margin: margin / 2\n\n[View source](https://github.com/jbaysolutions/vue-grid-layout/blob/master/website/docs/.vuepress/components/ExampleStylingGridLines.vue)\n\n<ClientOnly>\n<ExampleStylingGridLines></ExampleStylingGridLines>\n</ClientOnly>\n\n\n\nWork in progress...\n"
  },
  {
    "path": "website/docs/guide/usage.md",
    "content": "# Usage\n\n```javascript\n\tnew Vue({\n\t    el: '#app',\n\t    data: {\n\t        layout: [\n                {\"x\":0,\"y\":0,\"w\":2,\"h\":2,\"i\":\"0\"},\n                {\"x\":2,\"y\":0,\"w\":2,\"h\":4,\"i\":\"1\"},\n                {\"x\":4,\"y\":0,\"w\":2,\"h\":5,\"i\":\"2\"},\n                {\"x\":6,\"y\":0,\"w\":2,\"h\":3,\"i\":\"3\"},\n                {\"x\":8,\"y\":0,\"w\":2,\"h\":3,\"i\":\"4\"},\n                {\"x\":10,\"y\":0,\"w\":2,\"h\":3,\"i\":\"5\"},\n                {\"x\":0,\"y\":5,\"w\":2,\"h\":5,\"i\":\"6\"},\n                {\"x\":2,\"y\":5,\"w\":2,\"h\":5,\"i\":\"7\"},\n                {\"x\":4,\"y\":5,\"w\":2,\"h\":5,\"i\":\"8\"},\n                {\"x\":6,\"y\":3,\"w\":2,\"h\":4,\"i\":\"9\"},\n                {\"x\":8,\"y\":4,\"w\":2,\"h\":4,\"i\":\"10\"},\n                {\"x\":10,\"y\":4,\"w\":2,\"h\":4,\"i\":\"11\"},\n                {\"x\":0,\"y\":10,\"w\":2,\"h\":5,\"i\":\"12\"},\n                {\"x\":2,\"y\":10,\"w\":2,\"h\":5,\"i\":\"13\"},\n                {\"x\":4,\"y\":8,\"w\":2,\"h\":4,\"i\":\"14\"},\n                {\"x\":6,\"y\":8,\"w\":2,\"h\":4,\"i\":\"15\"},\n                {\"x\":8,\"y\":10,\"w\":2,\"h\":5,\"i\":\"16\"},\n                {\"x\":10,\"y\":4,\"w\":2,\"h\":2,\"i\":\"17\"},\n                {\"x\":0,\"y\":9,\"w\":2,\"h\":3,\"i\":\"18\"},\n                {\"x\":2,\"y\":6,\"w\":2,\"h\":2,\"i\":\"19\"}\n            ],\n\t    },\n\t});\n``` \n\n\n```html\n\n    <grid-layout\n            :layout.sync=\"layout\"\n            :col-num=\"12\"\n            :row-height=\"30\"\n            :is-draggable=\"true\"\n            :is-resizable=\"true\"\n            :is-mirrored=\"false\"\n            :vertical-compact=\"true\"\n            :margin=\"[10, 10]\"\n            :use-css-transforms=\"true\"\n    >\n\n        <grid-item v-for=\"item in layout\"\n                   :x=\"item.x\"\n                   :y=\"item.y\"\n                   :w=\"item.w\"\n                   :h=\"item.h\"\n                   :i=\"item.i\"\n                   :key=\"item.i\">\n            {{item.i}}\n        </grid-item>\n    </grid-layout>\n```\n"
  },
  {
    "path": "website/docs/zh/README.md",
    "content": "---\nlayout: HomeLayout\nhome: true\nheroImage: /assets/img/logo.png\nheroText: Vue Grid Layout\ntagline: 一个类似于<a href=\"http://dsmorse.github.io/gridster.js/\" target=\"_blank\">Gridster</a>的栅格布局系统, 适用于Vue.js。灵感源自于<a href='https://github.com/STRML/react-grid-layout' target='_blank'>React-Grid-Layout</a> \nactionText: 开始 →\nactionLink: /zh/guide/\nfeatures:\n- title: ✥ 可拖拽\n  details:\n- title: ⇲ 可调整大小\n  details:\n- title: 静态部件（不可拖拽、调整大小）\n  details: \n- title: 拖拽和调整大小时进行边界检查\n  details: \n- title: 增减部件时避免重建栅格\n  details: \n- title: 可序列化和还原的布局\n  details: \n- title: 自动化 RTL 支持\n  details: \n- title: 响应式\n  details: \n- title: Min/max w/h per item\n  details: \n---\n\n<HomeFooter></HomeFooter>\n\n"
  },
  {
    "path": "website/docs/zh/changelog/README.md",
    "content": "---\nsidebar: auto\n---\n# 更新日志\n\n## 2.4.0（2022年08月03日）\n\n* TODO\n\n## 2.3.12（2021年01月15日）\n\n* 将interact.js升级到1.10.2\n* 向GridItem添加了'preserveAspectRatio'属性 （感谢 [validide](https://github.com/validide)）\n\n## 2.3.11（2020年10月13日）\n\n* 已修复：使用响应式布局时的回归（＃487）\n\n## 2.3.10（2020年10月12日）\n\n* 将interact.js升级到1.10.0，现在作为ES6模块导入以优化大小 \n* 已修复：在RTL模式下无法调整栅格元素的大小 （感谢 [or-lat](https://github.com/or-lat)）\n* 添加了GridLayout.useStyleCursor属性以修复可能的浏览器冻结 （感谢 [mosuzi](https://github.com/mosuzi)）\n* 已修复：当GridItem不是GridLayout的子级时，父布局错误 （感谢 [lzq4047](https://github.com/lzq4047)） \n* 已修复：在响应模式下再次隐藏/显示元素时，元素的大小发生变化 （感谢 [lustan3216](https://github.com/lustan3216))）\n\n## 2.3.9（2020年9月28日）\n\n* 已修复插件安装（已修复＃311） （感谢 [yfwz100](https://github.com/yfwz100)）\n* interact.js升级版本至1.9.22\n\n## 2.3.8（2020年7月31日）\n\n* 支持动态修改margin属性 （感谢 [yfwz100](https://github.com/yfwz100)）\n* 添加了丢失的“布局更新”事件 （感谢 [ben-lau](https://github.com/ben-lau)）\n* 支持初始响应式布局和断点更改事件 （感谢 [ftylitak](https://github.com/ftylitak)）\n* 修正了布局项被删除且未设置interactObj时可能出现的错误 （感谢 [Tofandel](https://github.com/Tofandel)）\n* 在响应模式下修复错误的栅格元素排序 （感谢 [pieterbeulque](https://github.com/pieterbeulque)）\n\n## 2.3.7（2019年10月31日）\n\n* 在＃337中引入容器更改大小（浏览器窗口或其他大小）时发出的重命名“调整大小”事件，在＃358已修复\n* 已修复layout-ready事件\n\n## 2.3.6（2019年9月11日）\n\n* 恢复栅格元素w和h先前的舍入更改，已修复＃355\n\n## 2.3.5（2019年9月7日）\n\n* 已修复：在移动设备上无触摸，并且仅当元素可拖动或可调整大小时 （感谢 [DGoms](https://github.com/DGoms)）。\n* 防止碰撞功能 （感谢  [SheanDe](https://github.com/SheanDe)）。\n* 简体中文README （感谢 [harrywangchina](https://github.com/harrywangchina)）。\n* 如果由于除手动调整大小（例如，浏览器窗口调整大小）以外的更改而调整了栅格项的大小，则此时将发出`resized`事件 （感谢 [pmorch](https://github.com/pmorch)）。\n* 改进`layout-ready`触发事件 （感谢 [pmorch](https://github.com/pmorch)）。\n* 添加了min/max height and width的监视程序 （感谢 [grinat](https://github.com/grinat)）。\n* 改进：确保grid-item的大小大于slot-item （感谢 [ywmail](https://github.com/ywmail)）。\n\n## 2.3.4（2019年3月5日）\n\n* 支持静态部件 （感谢 [panjiangyi](https://github.com/panjiangyi)）。\n* RTL错误修正 （感谢 [irvingwa](https://github.com/irvingwa)）。\n* 内存泄漏修复 （感谢 [aiankile](https://github.com/aiankile)）。\n* 已修复了栅格布局安装上的异常 （感谢 [BenoitZugmeyer](https://github.com/BenoitZugmeyer)）。\n* 已修复了响应模式下重叠和调整大小的错误 （感谢 [shpfive](https://github.com/shpfive)）。\n* 添加了GridLayout发出的新事件 （layout-created， layout-before-mount，layout-mounted，layout-ready） （感谢 [samuelmolinski](https://github.com/samuelmolinski)）。\n\n## 2.3.3（2018年12月26日）\n\n* 恢复了将vue作为外部添加，这导致加载umd时出现问题。\n\n## 2.3.2（2018年12月13日）\n\n* 添加了vue作为外部webpack配置以修复启动问题 （感谢 [Micene9](https://github.com/Micene09)）\n\n## 2.3.1（2018年11月6日）\n\n* 之前在Android上进行触摸拖动的修复方法打破了在其他移动浏览器上的拖动 （感谢 [onx2](https://github.com/onx2)）\n\n\n## 2.3.0（2018年10月26日）\n\n* 响应式布局支持 （感谢  [shpfive](https://github.com/shpfive)）\n* 已修复了在Android上进行触摸拖动的问题 （感谢 [pbabey](https://github.com/pbabey)）\n\n## 2.2.0（2018年9月10日）\n\n* 使用Vue CLI更改了项目结构并进行了构建\n* GridItem新的autosize方法。现在，需要使用this.$parent.autoSize()从子组件中调用  （感谢 [mech01nc01](https://github.com/mech01nc01)）\n* 抽象的DOM相关要求提供初始SSR支持 （感谢 [Kukks](https://github.com/Kukks)）\n* GridItem.i现在可以是数字或字符串 （感谢 [xch1029](https://github.com/xch1029)）\n* 使用interactjs大小来限制调整大小 （感谢 [LuisCarreras](https://github.com/LuisCarreras)）\n* 已修复了实例释放时的interactjs实例泄漏 （感谢 [zzuligy](https://github.com/zzuligy)）\n\n## 2.1.13（2018年5月2日）\n\n* 调整大小事件现在也发出以像素为单位的尺寸 （感谢 [buremba](https://github.com/buremba)）\n* 支持动态列修改（#121） （感谢 [ittus](https://github.com/ittus)）\n\n## 2.1.12（2018年2月27日）\n\n* 将interact.js更新为1.3.3 （#144）\n\n## 2.1.11（2018年1月5日）\n\n* 解决了同一个虚拟机（＃134）上有多个栅格的问题 （感谢 [Suen](https://github.com/sunzongzheng)）\n* 解决了重新分配时布局更新的问题（＃130） （感谢 [daizengyu](https://github.com/daizengyu123)）\n\n## 2.1.10（2017年12月15日）\n\n* 已修复了与＃119相关的可能错误\n* 将CSS转换为Translation3D（＃96）\n* 添加了is-mirrored配置，允许从右向左渲染栅格元素（水平翻转） （感谢 [kweij](https://github.com/kweij)）\n* 添加了栅格更新事件，可以更轻松地与vuex集成 （感谢 [SergeyKhval](https://github.com/SergeyKhval)）\n\n## 2.1.9（2017年8月17日）\n\n* 已修复了对interact.js的本地模块引用\n\n## 2.1.8（2017年8月17日）\n\n* 已修复#61、#37\n* 已修复#82\n* 已修复#87\n\n## 2.1.7（2017年8月17日）\n\n* 已修复#59\n* 已修复#83\n* 对GridItem中props的dragAllowFrom和dragIgnoreFrom实现了支持 （感谢 [ThePlastic](https://github.com/ThePlastic)）\n\n## 2.1.6（2017年4月6日）\n\n* 已修复＃43，配置拖曳元件上的栅格项内容忽略 （感谢 [neithere](https://github.com/neithere)）\n* 已修复了getLayoutItem，有时返回null元素 （感谢 [pbabey](https://github.com/pbabey)）\n\n## 2.1.5（2017年3月24日）\n\n* 真正修复＃22、＃32，多个栅格实例在2.1.4中无法正常工作\n* resizeEvent现在还以像素为单位返回元素的宽度和高度（实现＃34）\n\n\n## 2.1.4（2017年3月20日）\n\n* 实现＃32，在同一页面上支持多个栅格实例\n\n## 2.1.3（2017年3月9日）\n\n* 已修复#27, props属性突变告警\n\n\n## 2.1.2（2017年2月16日）\n\n* 实现＃12，GridItems上的按钮将触发移动设备上的拖动\n* 实现＃24，在销毁之前删除监听 （感谢  [pbabey](https://github.com/pbabey)）\n\n\n## 2.1.1（2017年2月9日）\n\n* 实现＃13，支持行高动态更新\n* 实现＃23，支持动态启用/禁用拖动和调整大小\n* 实现＃21，移动并调整大小的事件\n\n\n## 2.1.0（2017年2月6日）\n\n* RTL支持 （感谢 [easteregg](https://github.com/easteregg)）\n* 移动和调整事件大小 （感谢 [ThePlastic](https://github.com/ThePlastic)）\n"
  },
  {
    "path": "website/docs/zh/guide/01-basic.md",
    "content": "# 01 - 基本\n\n[查看资料](https://github.com/jbaysolutions/vue-grid-layout/blob/master/website/docs/.vuepress/components/Example01Basic.vue)\n\n<ClientOnly>\n<Example01Basic></Example01Basic>\n</ClientOnly>\n\n"
  },
  {
    "path": "website/docs/zh/guide/02-events.md",
    "content": "# 02 - 移动事件并调整大小\n\n[查看资料](https://github.com/jbaysolutions/vue-grid-layout/blob/master/website/docs/.vuepress/components/Example02Events.vue)\n\n<ClientOnly>\n<Example02Events></Example02Events>\n</ClientOnly>\n"
  },
  {
    "path": "website/docs/zh/guide/03-multiple-grids.md",
    "content": "# 03 - 多个栅格\n\n[查看资料](https://github.com/jbaysolutions/vue-grid-layout/blob/master/website/docs/.vuepress/components/Example03MultipleGrids.vue)\n\n<ClientOnly>\n<Example03MultipleGrids></Example03MultipleGrids>\n</ClientOnly>\n\n"
  },
  {
    "path": "website/docs/zh/guide/04-allow-ignore.md",
    "content": "# 04 - 拖动允许/忽略元素\n\n忽略对某些元素的拖动而对其他元素的允许。\n\n单击并拖动每个项目角上的点以重新定位\n\n[查看资料](https://github.com/jbaysolutions/vue-grid-layout/blob/master/website/docs/.vuepress/components/Example04AllowIgnore.vue)\n\n<ClientOnly>\n<Example04AllowIgnore></Example04AllowIgnore>\n</ClientOnly>\n\n"
  },
  {
    "path": "website/docs/zh/guide/05-mirrored.md",
    "content": "# 05 - 镜像反转栅格布局\n\n[查看资料](https://github.com/jbaysolutions/vue-grid-layout/blob/master/website/docs/.vuepress/components/Example05Mirrored.vue)\n\n<ClientOnly>\n<Example05Mirrored></Example05Mirrored>\n</ClientOnly>\n\n"
  },
  {
    "path": "website/docs/zh/guide/06-responsive.md",
    "content": "# 06 - 响应式\n\n[查看资料](https://github.com/jbaysolutions/vue-grid-layout/blob/master/website/docs/.vuepress/components/Example06Responsive.vue)\n\n<ClientOnly>\n<!--iframe style=\"border:0;width: 100%;height:3000px;\" src=\"../examples/06-responsive.html\"></iframe-->\n<Example06Responsive></Example06Responsive>\n</ClientOnly>\n\n"
  },
  {
    "path": "website/docs/zh/guide/07-prevent-collision.md",
    "content": "# 07 - 防止碰撞\n\n[查看资料](https://github.com/jbaysolutions/vue-grid-layout/blob/master/website/docs/.vuepress/components/Example07PreventCollision.vue)\n\n<ClientOnly>\n<!--iframe style=\"border:0;width: 100%;height:1000px;\" src=\"../examples/07-prevent-collision.html\"></iframe-->\n<Example07PreventCollision></Example07PreventCollision>\n</ClientOnly>\n"
  },
  {
    "path": "website/docs/zh/guide/08-responsive-predefined-layouts.md",
    "content": "# 08 - 响应预定义的布局\n\n[查看资料](https://github.com/jbaysolutions/vue-grid-layout/blob/master/website/docs/.vuepress/components/Example08ResponsivePredefinedLayouts.vue)\n\n<ClientOnly>\n<Example08ResponsivePredefinedLayouts></Example08ResponsivePredefinedLayouts>\n</ClientOnly>\n"
  },
  {
    "path": "website/docs/zh/guide/09-dynamic-add-remove.md",
    "content": "# 09 - 动态添加/删除\n\n[查看资料](https://github.com/jbaysolutions/vue-grid-layout/blob/master/website/docs/.vuepress/components/Example09DynamicAddRemove.vue)\n\n<ClientOnly>\n<!--iframe style=\"border:0;width: 100%;height:800px;\" src=\"../examples/09-dynamic-add-remove.html\">\n</iframe-->\n<Example09DynamicAddRemove></Example09DynamicAddRemove>\n</ClientOnly>\n"
  },
  {
    "path": "website/docs/zh/guide/10-drag-from-outside.md",
    "content": "# 10 - 从外面拖动\n\n该演示演示了从栅格外部添加部件时发生的情况。\n<br/>\n将部件放到栅格中后，您将获得其坐标/属性，并可以据此执行操作。\n\n[查看资料](https://github.com/jbaysolutions/vue-grid-layout/blob/master/website/docs/.vuepress/components/Example10DragFromOutside.vue)\n\n<ClientOnly>\n<Example10DragFromOutside></Example10DragFromOutside>\n</ClientOnly>\n"
  },
  {
    "path": "website/docs/zh/guide/11-bounded.md",
    "content": "# 11 - 拖动栅格元素绑定到容器\n\n可以获得栅格元素的坐标与容器间的绑定关系。\n\n[查看资料](https://github.com/jbaysolutions/vue-grid-layout/blob/master/website/docs/.vuepress/components/Example11Bounded.vue)\n\n<ClientOnly>\n<Example11Bounded></Example11Bounded>\n</ClientOnly>\n"
  },
  {
    "path": "website/docs/zh/guide/README.md",
    "content": "# 安装\n\n## NPM\n\n\tnpm install vue-grid-layout --save\n    \n## Yarn\n\n    yarn add vue-grid-layout\n\n\n导入库\n\n```javascript\n    import VueGridLayout from 'vue-grid-layout';\n```\n\n添加到其他Vue组件\n\n ```javascript\n    export default {\n        components: {\n            GridLayout: VueGridLayout.GridLayout,\n            GridItem: VueGridLayout.GridItem\n        },\n    // ... data, methods, mounted (), etc.\n    }\n    \n```\n\n## 浏览器\n\n包括可用于浏览器的软件包（[从发布版本](https://github.com/jbaysolutions/vue-grid-layout/releases)下载）。组件将自动可用。\n\n```html\n    <script src=\"vue-grid-layout.umd.min.js\"></script>\n```\n\n"
  },
  {
    "path": "website/docs/zh/guide/auto-size.md",
    "content": "# 自动调整栅格元素\n\n待办： https://github.com/jbaysolutions/vue-grid-layout/issues/351\n"
  },
  {
    "path": "website/docs/zh/guide/events.md",
    "content": "# 事件\n\n每一个栅格元素grid-item上都可以添加监听器，用于监听移动和调整大小事件，这样父级Vue对象就可以收到通知。\n\n示例 [点击这里](../guide/02-events.md)   \n\n````html\n\n    <grid-layout\n            :layout=\"layout\"\n            :col-num=\"12\"\n            :row-height=\"30\"\n            :is-draggable=\"true\"\n            :is-resizable=\"true\"\n            :vertical-compact=\"true\"\n            :margin=\"[10, 10]\"\n            :use-css-transforms=\"true\"\n            @layout-created=\"layoutCreatedEvent\"\n            @layout-before-mount=\"layoutBeforeMountEvent\"\n            @layout-mounted=\"layoutMountedEvent\"\n            @layout-ready=\"layoutReadyEvent\"\n            @layout-updated=\"layoutUpdatedEvent\"\n            @breakpoint-changed=\"breakpointChangedEvent\"\n    >\n\n        <grid-item v-for=\"item in layout\"\n                   :x=\"item.x\"\n                   :y=\"item.y\"\n                   :w=\"item.w\"\n                   :h=\"item.h\"\n                   :i=\"item.i\"\n                   :key=\"item.i\"\n                   @resize=\"resizeEvent\"\n                   @move=\"moveEvent\"\n                   @resized=\"resizedEvent\"\n                   @container-resized=\"containerResizedEvent\"\n                   @moved=\"movedEvent\">\n            {{item.i}}\n        </grid-item>\n    </grid-layout>\n```` \n\n## GridLayout\n\n### layoutCreatedEvent\n\n对应Vue生命周期的created\n\n```javascript\n    layoutCreatedEvent: function(newLayout){\n      console.log(\"Created layout: \", newLayout)\n    }\n```\n\n### layoutBeforeMountEvent\n\n对应Vue生命周期的beforeMount\n\n```javascript\n    layoutBeforeMountEvent: function(newLayout){\n      console.log(\"beforeMount layout: \", newLayout)\n    }\n```\n\n### layoutMountedEvent\n\n对应Vue生命周期的mounted\n\n```javascript\n    layoutMountedEvent: function(newLayout){\n      console.log(\"Mounted layout: \", newLayout)\n    }\n```\n\n### layoutReadyEvent\n\n当完成mount中的所有操作时生成的事件\n\n```javascript\n    layoutReadyEvent: function(newLayout){\n      console.log(\"Ready layout: \", newLayout)\n    }\n```\n\n### layoutUpdatedEvent\n\n布局updated事件\n\n更新事件（布局更新或栅格元素的位置重新计算）\n\n```javascript\n    layoutUpdatedEvent: function(newLayout){\n      console.log(\"Updated layout: \", newLayout)\n    }\n```\n\n\n### breakpointChangedEvent\n\n断点更改事件\n\n每次断点值由于窗口调整大小而改变\n\n```javascript\n    /**\n     * \n     * @param newBreakpoint the breakpoint name\n     * @param newLayout the chosen layout for the breakpoint\n     * \n     */\n    breakpointChangedEvent: function(newBreakpoint, newLayout){\n        console.log(\"BREAKPOINT CHANGED breakpoint=\", newBreakpoint, \", layout: \", newLayout );\n    },\n``` \n\n\n## GridItem\n\n### moveEvent\n\n移动时的事件\n\n```javascript\n    moveEvent: function(i, newX, newY){\n        console.log(\"MOVE i=\" + i + \", X=\" + newX + \", Y=\" + newY);\n    },\n```\n\n### resizeEvent\n\n调整大小时的事件\n \n```javascript\n    resizeEvent: function(i, newH, newW, newHPx, newWPx){\n        console.log(\"RESIZE i=\" + i + \", H=\" + newH + \", W=\" + newW + \", H(px)=\" + newHPx + \", W(px)=\" + newWPx);\n    },\n``` \n\n### movedEvent\n\n移动后的事件\n\n```javascript\n    movedEvent: function(i, newX, newY){\n        console.log(\"MOVED i=\" + i + \", X=\" + newX + \", Y=\" + newY);\n    },\n```\n\n### resizedEvent\n\n调整大小后的事件\n \n```javascript\n    /**\n     * \n     * @param i the item id/index\n     * @param newH new height in grid rows \n     * @param newW new width in grid columns\n     * @param newHPx new height in pixels\n     * @param newWPx new width in pixels\n     * \n     */\n    resizedEvent: function(i, newH, newW, newHPx, newWPx){\n        console.log(\"RESIZED i=\" + i + \", H=\" + newH + \", W=\" + newW + \", H(px)=\" + newHPx + \", W(px)=\" + newWPx);\n    },\n``` \n\n### containerResizedEvent\n\n栅格元素/栅格容器更改大小的事件（浏览器窗口或其他）\n\n \n```javascript\n    /**\n     * \n     * @param i the item id/index\n     * @param newH new height in grid rows \n     * @param newW new width in grid columns\n     * @param newHPx new height in pixels\n     * @param newWPx new width in pixels\n     * \n     */\n    containerResizedEvent: function(i, newH, newW, newHPx, newWPx){\n        console.log(\"CONTAINER RESIZED i=\" + i + \", H=\" + newH + \", W=\" + newW + \", H(px)=\" + newHPx + \", W(px)=\" + newWPx);\n    },\n``` \n\n"
  },
  {
    "path": "website/docs/zh/guide/examples.md",
    "content": "# 例子\n\n## 基本\n\n<Grid01Basic></Grid01Basic>\n\n## 事件\n\n<Grid02Events></Grid02Events>\n\n## 多个网格\n\n<Grid03MultipleGrids></Grid03MultipleGrids>\n\n## 拖动允许/忽略元素\n\n忽略对某些元素的拖动，而对其他元素允许。\n\n单击并拖动每个栅格角上的点以重新定位\n\n<Grid04AllowIgnore></Grid04AllowIgnore>\n"
  },
  {
    "path": "website/docs/zh/guide/properties.md",
    "content": "# 属性\n\n## GridLayout\n\n### layout\n\n   \n* type: `Array`\n* required: `true`\n\n这是栅格的初始布局。\n\n数据源。值必须为 `Array`，其数据项为 `Object`。 每条数据项必须有 `i, x, y, w 和 h` 属性。 请参考下面的 `GridItem`。\n\n### responsiveLayouts\n\n* type: `Object`\n* required: `false`\n* default : `{}`\n\n如果 `responsive` 设置为 `true`，该配置将作为栅格中每个断点的初始布局。键值是断点名称，每项的值都是类似 `layout` 属性定义的数据结构，值必须为 `Array`，其数据项为 `Object`。例如： `{lg: [layout items], md: [layout items]}`。需要注意的是，在创建栅格布局后设置该属性无效。\n在创建GridLayout之后设置prop无效。\n\n可以查看 [responsive](#responsive), [breakpoints](#breakpoints) 和 [cols](#cols)\n\n### colNum\n    \n* type: `Number`\n* required: `false`\n* default: `12`\n\n定义栅格系统的列数，其值需为自然数。\n\n### rowHeight\n    \n* type: `Number`\n* required: `false`\n* default: `150`\n\n每行的高度，单位像素。\n\n### maxRows\n    \n* type: `Number`\n* required: `false`\n* default: `Infinity`\n\n定义最大行数。\n\n### margin\n    \n* type: `Array`\n* required: `false`\n* default: `[10, 10]`\n\n定义栅格中的元素边距。\n\n值必须是包含两个 `Number`的数组，数组中第一个元素表示水平边距，第二个表示垂直边距，单位为像素。\n\n### isDraggable\n    \n* type: `Boolean`\n* required: `false`\n* default: `true`\n\n标识栅格中的元素是否可拖拽。\n\n### isResizable\n    \n* type: `Boolean`\n* required: `false`\n* default: `true`\n\n标识栅格中的元素是否可调整大小。\n\n### isMirrored\n    \n* type: `Boolean`\n* required: `false`\n* default: `false`\n\n标识栅格中的元素是否可镜像反转。\n\n### autoSize\n    \n* type: `Boolean`\n* required: `false`\n* default: `true`\n\n标识容器是否自动调整大小。\n\n### verticalCompact\n    \n* type: `Boolean`\n* required: `false`\n* default: `true`\n\n标识布局是否垂直压缩。\n\n### preventCollision\n    \n* type: `Boolean`\n* required: `false`\n* default: `false`\n\n防止碰撞属性，值设置为`ture`时，栅格只能拖动至空白处。\n\n### useCssTransforms\n    \n* type: `Boolean`\n* required: `false`\n* default: `true`\n\n标识是否使用CSS属性 `transition-property: transform;`。\n\n### responsive\n    \n* type: `Boolean`\n* required: `false`\n* default: `false`\n\n标识布局是否为响应式。\n\n可以查看 [responsiveLayouts](#responsivelayouts)、[breakpoints](#breakpoints)和 [cols](#cols)\n\n\n### breakpoints\n\n* type: `Object`\n* required: `false`\n* default: { lg: 1200, md: 996, sm: 768, xs: 480, xxs: 0 }\n\n为响应式布局设置断点。\n\n可以查看 [responsiveLayouts](#responsivelayouts) 和 [cols](#cols)\n\n### cols\n\n* type: `Object`\n* required: `false`\n* default: { lg: 12, md: 10, sm: 6, xs: 4, xxs: 2 }\n\n设置每个断点对应的列数。\n\n### useStyleCursor\n\n* type: `Boolean`\n* required: `false`\n* default: `true`\n\n标识是否使用动态鼠标指针样式。当拖动出现卡顿时，将此值设为 `false`也许可以缓解布局问题。 \n**此属性无效**\n\n## GridItem\n\n### i\n    \n* type: `String`\n* required: `true`\n\n栅格中元素的ID。\n\n### x\n    \n* type: `Number`\n* required: `true`\n\n标识栅格元素位于第几列，需为自然数。\n\n### y\n    \n* type: `Number`\n* required: `true`\n\n标识栅格元素位于第几行，需为自然数。\n\n### w\n    \n* type: `Number`\n* required: `true`\n\n标识栅格元素的初始宽度，值为`colWidth`的倍数。\n\n### h\n    \n* type: `Number`\n* required: `true`\n\n标识栅格元素的初始高度，值为`rowHeight`的倍数。\n\n### minW\n    \n* type: `Number`\n* required: `false`\n* default: `1`\n\n栅格元素的最小宽度，值为`colWidth`的倍数。\n\n如果`w`小于`minW`，则`minW`的值会被`w`覆盖。\n\n### minH\n    \n* type: `Number`\n* required: `false`\n* default: `1`\n\n栅格元素的最小高度，值为`rowHeight`的倍数。\n\n如果`h`小于`minH`，则`minH`的值会被h覆盖。\n\n### maxW\n    \n* type: `Number`\n* required: `false`\n* default: `Infinity`\n\n栅格元素的最大宽度，值为`colWidth`的倍数。\n\n如果`w`大于`maxW`，则`maxW`的值会被`w`覆盖。\n\n### maxH\n    \n* type: `Number`\n* required: `false`\n* default: `Infinity`\n\n栅格元素的最大高度，值为`rowHeight`的倍数。\n\n如果`h`大于`maxH`，则`maxH`的值会被`h`覆盖。\n\n### isDraggable\n    \n* type: `Boolean`\n* required: `false`\n* default: `null`\n\n标识栅格元素是否可拖拽。如果值为`null`则取决于父容器。\n\n### isResizable\n    \n* type: `Boolean`\n* required: `false`\n* default: `null`\n\n标识栅格元素是否可调整大小。如果值为`null`则取决于父容器。\n\n### static\n    \n* type: `Boolean`\n* required: `false`\n* default: `false`\n\n标识栅格元素是否为静态的（无法拖拽、调整大小或被其他元素移动）。\n\n### dragIgnoreFrom\n\n* type: `String`\n* required: `false`\n* default: `'a, button'`\n\n标识栅格元素中哪些子元素无法触发拖拽事件，值为`css-like`选择器。\n\n请参考[interact.js docs](http://interactjs.io/docs/#ignorable-selectors)中的`ignoreFrom`。\n\n### dragAllowFrom\n    \n* type: `String`\n* required: `false`\n* default: `null`\n\n标识栅格元素中哪些子元素可以触发拖拽事件，值为`css-like`选择器。\n\n如果值为`null`则表示所有子元素（`dragIgnoreFrom`的除外）。\n\n请参考[interact.js docs](http://interactjs.io/docs/#ignorable-selectors)中的`allowFrom`。\n\n### resizeIgnoreFrom\n    \n* type: `String`\n* required: `false`\n* default: `'a, button'`\n\n标识栅格元素中哪些子元素无法触发调整大小的事件，值为`css-like`选择器。\n\n请参考[interact.js docs](http://interactjs.io/docs/#ignorable-selectors)中的`ignoreFrom`。\n"
  },
  {
    "path": "website/docs/zh/guide/styling.md",
    "content": "# 样式\n\n可以定制栅格样式以适合您的需求。以下是可以覆盖的类的列表。\n\n## 占位符 \n  \n占位符的默认css为：\n\n````css\n.vue-grid-item.vue-grid-placeholder {\n    background: red;\n    opacity: 0.2;\n    transition-duration: 100ms;\n    z-index: 2;\n    -webkit-user-select: none;\n    -moz-user-select: none;\n    -ms-user-select: none;\n    -o-user-select: none;\n    user-select: none;\n}  \n````\n  \n您可以使用`!important`规则覆盖属性：\n  \n````css\n.vue-grid-item.vue-grid-placeholder {\n    background: green !important;\n}\n````\n\n或者通过用更[具体的](https://developer.mozilla.org/en-US/docs/Web/CSS/Specificity)方式包装栅格类：\n\n````css\n.container .vue-grid-item.vue-grid-placeholder {\n    background: green;\n}\n````\n\n在此示例中，我们将占位符的背景色更改为绿色：\n\n[查看资料](https://github.com/jbaysolutions/vue-grid-layout/blob/master/website/docs/.vuepress/components/ExampleStylingPlaceholder.vue)\n\n<ClientOnly>\n<ExampleStylingPlaceholder></ExampleStylingPlaceholder>\n</ClientOnly>\n\n\n工作正在进行中...\n"
  },
  {
    "path": "website/docs/zh/guide/usage.md",
    "content": "# 用法\n\n```javascript\n\tnew Vue({\n\t    el: '#app',\n\t    data: {\n\t        layout: [\n                {\"x\":0,\"y\":0,\"w\":2,\"h\":2,\"i\":\"0\"},\n                {\"x\":2,\"y\":0,\"w\":2,\"h\":4,\"i\":\"1\"},\n                {\"x\":4,\"y\":0,\"w\":2,\"h\":5,\"i\":\"2\"},\n                {\"x\":6,\"y\":0,\"w\":2,\"h\":3,\"i\":\"3\"},\n                {\"x\":8,\"y\":0,\"w\":2,\"h\":3,\"i\":\"4\"},\n                {\"x\":10,\"y\":0,\"w\":2,\"h\":3,\"i\":\"5\"},\n                {\"x\":0,\"y\":5,\"w\":2,\"h\":5,\"i\":\"6\"},\n                {\"x\":2,\"y\":5,\"w\":2,\"h\":5,\"i\":\"7\"},\n                {\"x\":4,\"y\":5,\"w\":2,\"h\":5,\"i\":\"8\"},\n                {\"x\":6,\"y\":3,\"w\":2,\"h\":4,\"i\":\"9\"},\n                {\"x\":8,\"y\":4,\"w\":2,\"h\":4,\"i\":\"10\"},\n                {\"x\":10,\"y\":4,\"w\":2,\"h\":4,\"i\":\"11\"},\n                {\"x\":0,\"y\":10,\"w\":2,\"h\":5,\"i\":\"12\"},\n                {\"x\":2,\"y\":10,\"w\":2,\"h\":5,\"i\":\"13\"},\n                {\"x\":4,\"y\":8,\"w\":2,\"h\":4,\"i\":\"14\"},\n                {\"x\":6,\"y\":8,\"w\":2,\"h\":4,\"i\":\"15\"},\n                {\"x\":8,\"y\":10,\"w\":2,\"h\":5,\"i\":\"16\"},\n                {\"x\":10,\"y\":4,\"w\":2,\"h\":2,\"i\":\"17\"},\n                {\"x\":0,\"y\":9,\"w\":2,\"h\":3,\"i\":\"18\"},\n                {\"x\":2,\"y\":6,\"w\":2,\"h\":2,\"i\":\"19\"}\n            ],\n\t    },\n\t});\n``` \n\n\n```html\n\n    <grid-layout\n            :layout.sync=\"layout\"\n            :col-num=\"12\"\n            :row-height=\"30\"\n            :is-draggable=\"true\"\n            :is-resizable=\"true\"\n            :is-mirrored=\"false\"\n            :vertical-compact=\"true\"\n            :margin=\"[10, 10]\"\n            :use-css-transforms=\"true\"\n    >\n\n        <grid-item v-for=\"item in layout\"\n                   :x=\"item.x\"\n                   :y=\"item.y\"\n                   :w=\"item.w\"\n                   :h=\"item.h\"\n                   :i=\"item.i\"\n                   :key=\"item.i\">\n            {{item.i}}\n        </grid-item>\n    </grid-layout>\n```\n"
  },
  {
    "path": "website/package.json",
    "content": "{\n  \"name\": \"vue-grid-layout-website\",\n  \"version\": \"1.0.0\",\n  \"description\": \"vue-grid-layout website\",\n  \"author\": \"Gustavo Santos (gustavo@jbaysolutions.com)\",\n  \"license\": \"MIT\",\n  \"private\": false,\n  \"scripts\": {\n    \"dev\": \"cross-env NODE_OPTIONS=--openssl-legacy-provider vuepress dev docs\",\n    \"build\": \"vuepress build docs\",\n    \"serve\": \"cross-env NODE_OPTIONS=--openssl-legacy-provider vuepress serve docs\"\n  },\n  \"dependencies\": {\n  },\n  \"devDependencies\": {\n    \"cross-env\": \"^7.0.3\",\n    \"@vuepress/plugin-back-to-top\": \"^1.9.9\",\n    \"@vuepress/plugin-google-analytics\": \"^1.9.9\",\n    \"vue-grid-layout\": \"^2.4.0\",\n    \"vuepress-plugin-seo\": \"^0.1.4\",\n    \"vuepress-plugin-sitemap\": \"^2.3.1\",\n    \"vuepress\": \"^1.9.9\",\n    \"vuepress-plugin-serve\": \"^2.0.4\"\n  },\n  \"resolutions\": {\n    \"watchpack\": \"1.6.1\"\n  }\n}\n"
  }
]