diff --git a/CTFd/themes/admin/static/js/components.dev.js b/CTFd/themes/admin/static/js/components.dev.js
index 05242d5a9..1c4104db6 100644
--- a/CTFd/themes/admin/static/js/components.dev.js
+++ b/CTFd/themes/admin/static/js/components.dev.js
@@ -822,7 +822,7 @@ eval("// Imports\nvar ___CSS_LOADER_API_IMPORT___ = __webpack_require__(/*! ../.
/***/ (function(module, __webpack_exports__, __webpack_require__) {
;
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"div\", [\n _c(\"div\", { staticClass: \"row mb-3\" }, [\n _c(\"div\", { staticClass: \"col-md-12\" }, [\n _c(\"div\", { staticClass: \"comment\" }, [\n _c(\"textarea\", {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model.lazy\",\n value: _vm.comment,\n expression: \"comment\",\n modifiers: { lazy: true }\n }\n ],\n staticClass: \"form-control mb-2\",\n attrs: {\n rows: \"2\",\n id: \"comment-input\",\n placeholder: \"Add comment\"\n },\n domProps: { value: _vm.comment },\n on: {\n change: function($event) {\n _vm.comment = $event.target.value\n }\n }\n }),\n _vm._v(\" \"),\n _c(\n \"button\",\n {\n staticClass: \"btn btn-sm btn-success btn-outlined float-right\",\n attrs: { type: \"submit\" },\n on: {\n click: function($event) {\n return _vm.submitComment()\n }\n }\n },\n [_vm._v(\"\\n Comment\\n \")]\n )\n ])\n ])\n ]),\n _vm._v(\" \"),\n _vm.pages > 1\n ? _c(\"div\", { staticClass: \"row\" }, [\n _c(\"div\", { staticClass: \"col-md-12\" }, [\n _c(\"div\", { staticClass: \"text-center\" }, [\n _c(\n \"button\",\n {\n staticClass: \"btn btn-link p-0\",\n attrs: { type: \"button\", disabled: _vm.prev ? false : true },\n on: {\n click: function($event) {\n return _vm.prevPage()\n }\n }\n },\n [_vm._v(\"\\n <<<\\n \")]\n ),\n _vm._v(\" \"),\n _c(\n \"button\",\n {\n staticClass: \"btn btn-link p-0\",\n attrs: { type: \"button\", disabled: _vm.next ? false : true },\n on: {\n click: function($event) {\n return _vm.nextPage()\n }\n }\n },\n [_vm._v(\"\\n >>>\\n \")]\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-md-12\" }, [\n _c(\"div\", { staticClass: \"text-center\" }, [\n _c(\"small\", { staticClass: \"text-muted\" }, [\n _vm._v(\n \"Page \" +\n _vm._s(_vm.page) +\n \" of \" +\n _vm._s(_vm.total) +\n \" comments\"\n )\n ])\n ])\n ])\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _c(\n \"div\",\n { staticClass: \"comments\" },\n [\n _c(\n \"transition-group\",\n { attrs: { name: \"comment-card\" } },\n _vm._l(_vm.comments, function(comment) {\n return _c(\n \"div\",\n { key: comment.id, staticClass: \"comment-card card mb-2\" },\n [\n _c(\"div\", { staticClass: \"card-body pl-0 pb-0 pt-2 pr-2\" }, [\n _c(\n \"button\",\n {\n staticClass: \"close float-right\",\n attrs: { type: \"button\", \"aria-label\": \"Close\" },\n on: {\n click: function($event) {\n return _vm.deleteComment(comment.id)\n }\n }\n },\n [\n _c(\"span\", { attrs: { \"aria-hidden\": \"true\" } }, [\n _vm._v(\"×\")\n ])\n ]\n )\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"card-body\" }, [\n _c(\"div\", {\n staticClass: \"card-text\",\n domProps: { innerHTML: _vm._s(comment.html) }\n }),\n _vm._v(\" \"),\n _c(\"small\", { staticClass: \"text-muted float-left\" }, [\n _c(\"span\", [\n _c(\n \"a\",\n {\n attrs: {\n href:\n _vm.urlRoot + \"/admin/users/\" + comment.author_id\n }\n },\n [_vm._v(_vm._s(comment.author.name))]\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"small\", { staticClass: \"text-muted float-right\" }, [\n _c(\"span\", { staticClass: \"float-right\" }, [\n _vm._v(_vm._s(_vm.toLocalTime(comment.date)))\n ])\n ])\n ])\n ]\n )\n }),\n 0\n )\n ],\n 1\n ),\n _vm._v(\" \"),\n _vm.pages > 1\n ? _c(\"div\", { staticClass: \"row\" }, [\n _c(\"div\", { staticClass: \"col-md-12\" }, [\n _c(\"div\", { staticClass: \"text-center\" }, [\n _c(\n \"button\",\n {\n staticClass: \"btn btn-link p-0\",\n attrs: { type: \"button\", disabled: _vm.prev ? false : true },\n on: {\n click: function($event) {\n return _vm.prevPage()\n }\n }\n },\n [_vm._v(\"\\n <<<\\n \")]\n ),\n _vm._v(\" \"),\n _c(\n \"button\",\n {\n staticClass: \"btn btn-link p-0\",\n attrs: { type: \"button\", disabled: _vm.next ? false : true },\n on: {\n click: function($event) {\n return _vm.nextPage()\n }\n }\n },\n [_vm._v(\"\\n >>>\\n \")]\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-md-12\" }, [\n _c(\"div\", { staticClass: \"text-center\" }, [\n _c(\"small\", { staticClass: \"text-muted\" }, [\n _vm._v(\n \"Page \" +\n _vm._s(_vm.page) +\n \" of \" +\n _vm._s(_vm.total) +\n \" comments\"\n )\n ])\n ])\n ])\n ])\n : _vm._e()\n ])\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./CTFd/themes/admin/assets/js/components/comments/CommentBox.vue?./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options");
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function () {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"div\", [\n _c(\"div\", { staticClass: \"row mb-3\" }, [\n _c(\"div\", { staticClass: \"col-md-12\" }, [\n _c(\"div\", { staticClass: \"comment\" }, [\n _c(\"textarea\", {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model.lazy\",\n value: _vm.comment,\n expression: \"comment\",\n modifiers: { lazy: true },\n },\n ],\n staticClass: \"form-control mb-2\",\n attrs: {\n rows: \"2\",\n id: \"comment-input\",\n placeholder: \"Add comment\",\n },\n domProps: { value: _vm.comment },\n on: {\n change: function ($event) {\n _vm.comment = $event.target.value\n },\n },\n }),\n _vm._v(\" \"),\n _c(\n \"button\",\n {\n staticClass: \"btn btn-sm btn-success btn-outlined float-right\",\n attrs: { type: \"submit\" },\n on: {\n click: function ($event) {\n return _vm.submitComment()\n },\n },\n },\n [_vm._v(\"\\n Comment\\n \")]\n ),\n ]),\n ]),\n ]),\n _vm._v(\" \"),\n _vm.pages > 1\n ? _c(\"div\", { staticClass: \"row\" }, [\n _c(\"div\", { staticClass: \"col-md-12\" }, [\n _c(\"div\", { staticClass: \"text-center\" }, [\n _c(\n \"button\",\n {\n staticClass: \"btn btn-link p-0\",\n attrs: { type: \"button\", disabled: _vm.prev ? false : true },\n on: {\n click: function ($event) {\n return _vm.prevPage()\n },\n },\n },\n [_vm._v(\"\\n <<<\\n \")]\n ),\n _vm._v(\" \"),\n _c(\n \"button\",\n {\n staticClass: \"btn btn-link p-0\",\n attrs: { type: \"button\", disabled: _vm.next ? false : true },\n on: {\n click: function ($event) {\n return _vm.nextPage()\n },\n },\n },\n [_vm._v(\"\\n >>>\\n \")]\n ),\n ]),\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-md-12\" }, [\n _c(\"div\", { staticClass: \"text-center\" }, [\n _c(\"small\", { staticClass: \"text-muted\" }, [\n _vm._v(\n \"Page \" +\n _vm._s(_vm.page) +\n \" of \" +\n _vm._s(_vm.total) +\n \" comments\"\n ),\n ]),\n ]),\n ]),\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _c(\n \"div\",\n { staticClass: \"comments\" },\n [\n _c(\n \"transition-group\",\n { attrs: { name: \"comment-card\" } },\n _vm._l(_vm.comments, function (comment) {\n return _c(\n \"div\",\n { key: comment.id, staticClass: \"comment-card card mb-2\" },\n [\n _c(\"div\", { staticClass: \"card-body pl-0 pb-0 pt-2 pr-2\" }, [\n _c(\n \"button\",\n {\n staticClass: \"close float-right\",\n attrs: { type: \"button\", \"aria-label\": \"Close\" },\n on: {\n click: function ($event) {\n return _vm.deleteComment(comment.id)\n },\n },\n },\n [\n _c(\"span\", { attrs: { \"aria-hidden\": \"true\" } }, [\n _vm._v(\"×\"),\n ]),\n ]\n ),\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"card-body\" }, [\n _c(\"div\", {\n staticClass: \"card-text\",\n domProps: { innerHTML: _vm._s(comment.html) },\n }),\n _vm._v(\" \"),\n _c(\"small\", { staticClass: \"text-muted float-left\" }, [\n _c(\"span\", [\n _c(\n \"a\",\n {\n attrs: {\n href:\n _vm.urlRoot + \"/admin/users/\" + comment.author_id,\n },\n },\n [_vm._v(_vm._s(comment.author.name))]\n ),\n ]),\n ]),\n _vm._v(\" \"),\n _c(\"small\", { staticClass: \"text-muted float-right\" }, [\n _c(\"span\", { staticClass: \"float-right\" }, [\n _vm._v(_vm._s(_vm.toLocalTime(comment.date))),\n ]),\n ]),\n ]),\n ]\n )\n }),\n 0\n ),\n ],\n 1\n ),\n _vm._v(\" \"),\n _vm.pages > 1\n ? _c(\"div\", { staticClass: \"row\" }, [\n _c(\"div\", { staticClass: \"col-md-12\" }, [\n _c(\"div\", { staticClass: \"text-center\" }, [\n _c(\n \"button\",\n {\n staticClass: \"btn btn-link p-0\",\n attrs: { type: \"button\", disabled: _vm.prev ? false : true },\n on: {\n click: function ($event) {\n return _vm.prevPage()\n },\n },\n },\n [_vm._v(\"\\n <<<\\n \")]\n ),\n _vm._v(\" \"),\n _c(\n \"button\",\n {\n staticClass: \"btn btn-link p-0\",\n attrs: { type: \"button\", disabled: _vm.next ? false : true },\n on: {\n click: function ($event) {\n return _vm.nextPage()\n },\n },\n },\n [_vm._v(\"\\n >>>\\n \")]\n ),\n ]),\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-md-12\" }, [\n _c(\"div\", { staticClass: \"text-center\" }, [\n _c(\"small\", { staticClass: \"text-muted\" }, [\n _vm._v(\n \"Page \" +\n _vm._s(_vm.page) +\n \" of \" +\n _vm._s(_vm.total) +\n \" comments\"\n ),\n ]),\n ]),\n ]),\n ])\n : _vm._e(),\n ])\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./CTFd/themes/admin/assets/js/components/comments/CommentBox.vue?./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options");
/***/ }),
@@ -834,7 +834,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) *
/***/ (function(module, __webpack_exports__, __webpack_require__) {
;
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"div\", { staticClass: \"border-bottom\" }, [\n _c(\"div\", [\n _c(\n \"button\",\n {\n staticClass: \"close float-right\",\n attrs: { type: \"button\", \"aria-label\": \"Close\" },\n on: {\n click: function($event) {\n return _vm.deleteField()\n }\n }\n },\n [_c(\"span\", { attrs: { \"aria-hidden\": \"true\" } }, [_vm._v(\"×\")])]\n )\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row\" }, [\n _c(\"div\", { staticClass: \"col-md-3\" }, [\n _c(\"div\", { staticClass: \"form-group\" }, [\n _c(\"label\", [_vm._v(\"Field Type\")]),\n _vm._v(\" \"),\n _c(\n \"select\",\n {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model.lazy\",\n value: _vm.field.field_type,\n expression: \"field.field_type\",\n modifiers: { lazy: true }\n }\n ],\n staticClass: \"form-control custom-select\",\n on: {\n change: function($event) {\n var $$selectedVal = Array.prototype.filter\n .call($event.target.options, function(o) {\n return o.selected\n })\n .map(function(o) {\n var val = \"_value\" in o ? o._value : o.value\n return val\n })\n _vm.$set(\n _vm.field,\n \"field_type\",\n $event.target.multiple ? $$selectedVal : $$selectedVal[0]\n )\n }\n }\n },\n [\n _c(\"option\", { attrs: { value: \"text\" } }, [\n _vm._v(\"Text Field\")\n ]),\n _vm._v(\" \"),\n _c(\"option\", { attrs: { value: \"boolean\" } }, [\n _vm._v(\"Checkbox\")\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\"small\", { staticClass: \"form-text text-muted\" }, [\n _vm._v(\"Type of field shown to the user\")\n ])\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-md-9\" }, [\n _c(\"div\", { staticClass: \"form-group\" }, [\n _c(\"label\", [_vm._v(\"Field Name\")]),\n _vm._v(\" \"),\n _c(\"input\", {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model.lazy\",\n value: _vm.field.name,\n expression: \"field.name\",\n modifiers: { lazy: true }\n }\n ],\n staticClass: \"form-control\",\n attrs: { type: \"text\" },\n domProps: { value: _vm.field.name },\n on: {\n change: function($event) {\n return _vm.$set(_vm.field, \"name\", $event.target.value)\n }\n }\n }),\n _vm._v(\" \"),\n _c(\"small\", { staticClass: \"form-text text-muted\" }, [\n _vm._v(\"Field name\")\n ])\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-md-12\" }, [\n _c(\"div\", { staticClass: \"form-group\" }, [\n _c(\"label\", [_vm._v(\"Field Description\")]),\n _vm._v(\" \"),\n _c(\"input\", {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model.lazy\",\n value: _vm.field.description,\n expression: \"field.description\",\n modifiers: { lazy: true }\n }\n ],\n staticClass: \"form-control\",\n attrs: { type: \"text\" },\n domProps: { value: _vm.field.description },\n on: {\n change: function($event) {\n return _vm.$set(_vm.field, \"description\", $event.target.value)\n }\n }\n }),\n _vm._v(\" \"),\n _c(\n \"small\",\n { staticClass: \"form-text text-muted\", attrs: { id: \"emailHelp\" } },\n [_vm._v(\"Field Description\")]\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-md-12\" }, [\n _c(\"div\", { staticClass: \"form-check\" }, [\n _c(\"label\", { staticClass: \"form-check-label\" }, [\n _c(\"input\", {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model.lazy\",\n value: _vm.field.editable,\n expression: \"field.editable\",\n modifiers: { lazy: true }\n }\n ],\n staticClass: \"form-check-input\",\n attrs: { type: \"checkbox\" },\n domProps: {\n checked: Array.isArray(_vm.field.editable)\n ? _vm._i(_vm.field.editable, null) > -1\n : _vm.field.editable\n },\n on: {\n change: function($event) {\n var $$a = _vm.field.editable,\n $$el = $event.target,\n $$c = $$el.checked ? true : false\n if (Array.isArray($$a)) {\n var $$v = null,\n $$i = _vm._i($$a, $$v)\n if ($$el.checked) {\n $$i < 0 &&\n _vm.$set(_vm.field, \"editable\", $$a.concat([$$v]))\n } else {\n $$i > -1 &&\n _vm.$set(\n _vm.field,\n \"editable\",\n $$a.slice(0, $$i).concat($$a.slice($$i + 1))\n )\n }\n } else {\n _vm.$set(_vm.field, \"editable\", $$c)\n }\n }\n }\n }),\n _vm._v(\"\\n Editable by user in profile\\n \")\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"form-check\" }, [\n _c(\"label\", { staticClass: \"form-check-label\" }, [\n _c(\"input\", {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model.lazy\",\n value: _vm.field.required,\n expression: \"field.required\",\n modifiers: { lazy: true }\n }\n ],\n staticClass: \"form-check-input\",\n attrs: { type: \"checkbox\" },\n domProps: {\n checked: Array.isArray(_vm.field.required)\n ? _vm._i(_vm.field.required, null) > -1\n : _vm.field.required\n },\n on: {\n change: function($event) {\n var $$a = _vm.field.required,\n $$el = $event.target,\n $$c = $$el.checked ? true : false\n if (Array.isArray($$a)) {\n var $$v = null,\n $$i = _vm._i($$a, $$v)\n if ($$el.checked) {\n $$i < 0 &&\n _vm.$set(_vm.field, \"required\", $$a.concat([$$v]))\n } else {\n $$i > -1 &&\n _vm.$set(\n _vm.field,\n \"required\",\n $$a.slice(0, $$i).concat($$a.slice($$i + 1))\n )\n }\n } else {\n _vm.$set(_vm.field, \"required\", $$c)\n }\n }\n }\n }),\n _vm._v(\"\\n Required on registration\\n \")\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"form-check\" }, [\n _c(\"label\", { staticClass: \"form-check-label\" }, [\n _c(\"input\", {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model.lazy\",\n value: _vm.field.public,\n expression: \"field.public\",\n modifiers: { lazy: true }\n }\n ],\n staticClass: \"form-check-input\",\n attrs: { type: \"checkbox\" },\n domProps: {\n checked: Array.isArray(_vm.field.public)\n ? _vm._i(_vm.field.public, null) > -1\n : _vm.field.public\n },\n on: {\n change: function($event) {\n var $$a = _vm.field.public,\n $$el = $event.target,\n $$c = $$el.checked ? true : false\n if (Array.isArray($$a)) {\n var $$v = null,\n $$i = _vm._i($$a, $$v)\n if ($$el.checked) {\n $$i < 0 &&\n _vm.$set(_vm.field, \"public\", $$a.concat([$$v]))\n } else {\n $$i > -1 &&\n _vm.$set(\n _vm.field,\n \"public\",\n $$a.slice(0, $$i).concat($$a.slice($$i + 1))\n )\n }\n } else {\n _vm.$set(_vm.field, \"public\", $$c)\n }\n }\n }\n }),\n _vm._v(\"\\n Shown on public profile\\n \")\n ])\n ])\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row pb-3\" }, [\n _c(\"div\", { staticClass: \"col-md-12\" }, [\n _c(\"div\", { staticClass: \"d-block\" }, [\n _c(\n \"button\",\n {\n staticClass: \"btn btn-sm btn-success btn-outlined float-right\",\n attrs: { type: \"button\" },\n on: {\n click: function($event) {\n return _vm.saveField()\n }\n }\n },\n [_vm._v(\"\\n Save\\n \")]\n )\n ])\n ])\n ])\n ])\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./CTFd/themes/admin/assets/js/components/configs/fields/Field.vue?./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options");
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function () {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"div\", { staticClass: \"border-bottom\" }, [\n _c(\"div\", [\n _c(\n \"button\",\n {\n staticClass: \"close float-right\",\n attrs: { type: \"button\", \"aria-label\": \"Close\" },\n on: {\n click: function ($event) {\n return _vm.deleteField()\n },\n },\n },\n [_c(\"span\", { attrs: { \"aria-hidden\": \"true\" } }, [_vm._v(\"×\")])]\n ),\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row\" }, [\n _c(\"div\", { staticClass: \"col-md-3\" }, [\n _c(\"div\", { staticClass: \"form-group\" }, [\n _c(\"label\", [_vm._v(\"Field Type\")]),\n _vm._v(\" \"),\n _c(\n \"select\",\n {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model.lazy\",\n value: _vm.field.field_type,\n expression: \"field.field_type\",\n modifiers: { lazy: true },\n },\n ],\n staticClass: \"form-control custom-select\",\n on: {\n change: function ($event) {\n var $$selectedVal = Array.prototype.filter\n .call($event.target.options, function (o) {\n return o.selected\n })\n .map(function (o) {\n var val = \"_value\" in o ? o._value : o.value\n return val\n })\n _vm.$set(\n _vm.field,\n \"field_type\",\n $event.target.multiple ? $$selectedVal : $$selectedVal[0]\n )\n },\n },\n },\n [\n _c(\"option\", { attrs: { value: \"text\" } }, [\n _vm._v(\"Text Field\"),\n ]),\n _vm._v(\" \"),\n _c(\"option\", { attrs: { value: \"boolean\" } }, [\n _vm._v(\"Checkbox\"),\n ]),\n ]\n ),\n _vm._v(\" \"),\n _c(\"small\", { staticClass: \"form-text text-muted\" }, [\n _vm._v(\"Type of field shown to the user\"),\n ]),\n ]),\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-md-9\" }, [\n _c(\"div\", { staticClass: \"form-group\" }, [\n _c(\"label\", [_vm._v(\"Field Name\")]),\n _vm._v(\" \"),\n _c(\"input\", {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model.lazy\",\n value: _vm.field.name,\n expression: \"field.name\",\n modifiers: { lazy: true },\n },\n ],\n staticClass: \"form-control\",\n attrs: { type: \"text\" },\n domProps: { value: _vm.field.name },\n on: {\n change: function ($event) {\n return _vm.$set(_vm.field, \"name\", $event.target.value)\n },\n },\n }),\n _vm._v(\" \"),\n _c(\"small\", { staticClass: \"form-text text-muted\" }, [\n _vm._v(\"Field name\"),\n ]),\n ]),\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-md-12\" }, [\n _c(\"div\", { staticClass: \"form-group\" }, [\n _c(\"label\", [_vm._v(\"Field Description\")]),\n _vm._v(\" \"),\n _c(\"input\", {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model.lazy\",\n value: _vm.field.description,\n expression: \"field.description\",\n modifiers: { lazy: true },\n },\n ],\n staticClass: \"form-control\",\n attrs: { type: \"text\" },\n domProps: { value: _vm.field.description },\n on: {\n change: function ($event) {\n return _vm.$set(_vm.field, \"description\", $event.target.value)\n },\n },\n }),\n _vm._v(\" \"),\n _c(\n \"small\",\n { staticClass: \"form-text text-muted\", attrs: { id: \"emailHelp\" } },\n [_vm._v(\"Field Description\")]\n ),\n ]),\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-md-12\" }, [\n _c(\"div\", { staticClass: \"form-check\" }, [\n _c(\"label\", { staticClass: \"form-check-label\" }, [\n _c(\"input\", {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model.lazy\",\n value: _vm.field.editable,\n expression: \"field.editable\",\n modifiers: { lazy: true },\n },\n ],\n staticClass: \"form-check-input\",\n attrs: { type: \"checkbox\" },\n domProps: {\n checked: Array.isArray(_vm.field.editable)\n ? _vm._i(_vm.field.editable, null) > -1\n : _vm.field.editable,\n },\n on: {\n change: function ($event) {\n var $$a = _vm.field.editable,\n $$el = $event.target,\n $$c = $$el.checked ? true : false\n if (Array.isArray($$a)) {\n var $$v = null,\n $$i = _vm._i($$a, $$v)\n if ($$el.checked) {\n $$i < 0 &&\n _vm.$set(_vm.field, \"editable\", $$a.concat([$$v]))\n } else {\n $$i > -1 &&\n _vm.$set(\n _vm.field,\n \"editable\",\n $$a.slice(0, $$i).concat($$a.slice($$i + 1))\n )\n }\n } else {\n _vm.$set(_vm.field, \"editable\", $$c)\n }\n },\n },\n }),\n _vm._v(\"\\n Editable by user in profile\\n \"),\n ]),\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"form-check\" }, [\n _c(\"label\", { staticClass: \"form-check-label\" }, [\n _c(\"input\", {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model.lazy\",\n value: _vm.field.required,\n expression: \"field.required\",\n modifiers: { lazy: true },\n },\n ],\n staticClass: \"form-check-input\",\n attrs: { type: \"checkbox\" },\n domProps: {\n checked: Array.isArray(_vm.field.required)\n ? _vm._i(_vm.field.required, null) > -1\n : _vm.field.required,\n },\n on: {\n change: function ($event) {\n var $$a = _vm.field.required,\n $$el = $event.target,\n $$c = $$el.checked ? true : false\n if (Array.isArray($$a)) {\n var $$v = null,\n $$i = _vm._i($$a, $$v)\n if ($$el.checked) {\n $$i < 0 &&\n _vm.$set(_vm.field, \"required\", $$a.concat([$$v]))\n } else {\n $$i > -1 &&\n _vm.$set(\n _vm.field,\n \"required\",\n $$a.slice(0, $$i).concat($$a.slice($$i + 1))\n )\n }\n } else {\n _vm.$set(_vm.field, \"required\", $$c)\n }\n },\n },\n }),\n _vm._v(\"\\n Required on registration\\n \"),\n ]),\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"form-check\" }, [\n _c(\"label\", { staticClass: \"form-check-label\" }, [\n _c(\"input\", {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model.lazy\",\n value: _vm.field.public,\n expression: \"field.public\",\n modifiers: { lazy: true },\n },\n ],\n staticClass: \"form-check-input\",\n attrs: { type: \"checkbox\" },\n domProps: {\n checked: Array.isArray(_vm.field.public)\n ? _vm._i(_vm.field.public, null) > -1\n : _vm.field.public,\n },\n on: {\n change: function ($event) {\n var $$a = _vm.field.public,\n $$el = $event.target,\n $$c = $$el.checked ? true : false\n if (Array.isArray($$a)) {\n var $$v = null,\n $$i = _vm._i($$a, $$v)\n if ($$el.checked) {\n $$i < 0 &&\n _vm.$set(_vm.field, \"public\", $$a.concat([$$v]))\n } else {\n $$i > -1 &&\n _vm.$set(\n _vm.field,\n \"public\",\n $$a.slice(0, $$i).concat($$a.slice($$i + 1))\n )\n }\n } else {\n _vm.$set(_vm.field, \"public\", $$c)\n }\n },\n },\n }),\n _vm._v(\"\\n Shown on public profile\\n \"),\n ]),\n ]),\n ]),\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row pb-3\" }, [\n _c(\"div\", { staticClass: \"col-md-12\" }, [\n _c(\"div\", { staticClass: \"d-block\" }, [\n _c(\n \"button\",\n {\n staticClass: \"btn btn-sm btn-success btn-outlined float-right\",\n attrs: { type: \"button\" },\n on: {\n click: function ($event) {\n return _vm.saveField()\n },\n },\n },\n [_vm._v(\"\\n Save\\n \")]\n ),\n ]),\n ]),\n ]),\n ])\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./CTFd/themes/admin/assets/js/components/configs/fields/Field.vue?./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options");
/***/ }),
@@ -846,7 +846,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) *
/***/ (function(module, __webpack_exports__, __webpack_require__) {
;
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n \"div\",\n [\n _vm._l(_vm.fields, function(field, index) {\n return _c(\n \"div\",\n { key: field.id, staticClass: \"mb-5\" },\n [\n _c(\"Field\", {\n attrs: { index: index, initialField: _vm.fields[index] },\n on: {\n \"update:initialField\": function($event) {\n return _vm.$set(_vm.fields, index, $event)\n },\n \"update:initial-field\": function($event) {\n return _vm.$set(_vm.fields, index, $event)\n },\n \"remove-field\": _vm.removeField\n }\n })\n ],\n 1\n )\n }),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row\" }, [\n _c(\"div\", { staticClass: \"col text-center\" }, [\n _c(\n \"button\",\n {\n staticClass: \"btn btn-sm btn-success btn-outlined m-auto\",\n attrs: { type: \"button\" },\n on: {\n click: function($event) {\n return _vm.addField()\n }\n }\n },\n [_vm._v(\"\\n Add New Field\\n \")]\n )\n ])\n ])\n ],\n 2\n )\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./CTFd/themes/admin/assets/js/components/configs/fields/FieldList.vue?./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options");
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function () {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n \"div\",\n [\n _vm._l(_vm.fields, function (field, index) {\n return _c(\n \"div\",\n { key: field.id, staticClass: \"mb-5\" },\n [\n _c(\"Field\", {\n attrs: { index: index, initialField: _vm.fields[index] },\n on: {\n \"update:initialField\": function ($event) {\n return _vm.$set(_vm.fields, index, $event)\n },\n \"update:initial-field\": function ($event) {\n return _vm.$set(_vm.fields, index, $event)\n },\n \"remove-field\": _vm.removeField,\n },\n }),\n ],\n 1\n )\n }),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row\" }, [\n _c(\"div\", { staticClass: \"col text-center\" }, [\n _c(\n \"button\",\n {\n staticClass: \"btn btn-sm btn-success btn-outlined m-auto\",\n attrs: { type: \"button\" },\n on: {\n click: function ($event) {\n return _vm.addField()\n },\n },\n },\n [_vm._v(\"\\n Add New Field\\n \")]\n ),\n ]),\n ]),\n ],\n 2\n )\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./CTFd/themes/admin/assets/js/components/configs/fields/FieldList.vue?./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options");
/***/ }),
@@ -858,7 +858,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) *
/***/ (function(module, __webpack_exports__, __webpack_require__) {
;
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"div\", [\n _c(\n \"table\",\n { staticClass: \"table table-striped\", attrs: { id: \"filesboard\" } },\n [\n _vm._m(0),\n _vm._v(\" \"),\n _c(\n \"tbody\",\n _vm._l(_vm.files, function(file) {\n return _c(\"tr\", { key: file.id }, [\n _c(\"td\", { staticClass: \"text-center\" }, [\n _c(\n \"a\",\n { attrs: { href: _vm.urlRoot + \"/files/\" + file.location } },\n [_vm._v(_vm._s(file.location.split(\"/\").pop()))]\n )\n ]),\n _vm._v(\" \"),\n _c(\"td\", { staticClass: \"text-center\" }, [\n _c(\"i\", {\n staticClass: \"btn-fa fas fa-times delete-file\",\n attrs: { role: \"button\" },\n on: {\n click: function($event) {\n return _vm.deleteFile(file.id)\n }\n }\n })\n ])\n ])\n }),\n 0\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-md-12 mt-3\" }, [\n _c(\n \"form\",\n {\n ref: \"FileUploadForm\",\n attrs: { method: \"POST\" },\n on: {\n submit: function($event) {\n $event.preventDefault()\n return _vm.addFiles($event)\n }\n }\n },\n [_vm._m(1), _vm._v(\" \"), _vm._m(2)]\n )\n ])\n ])\n}\nvar staticRenderFns = [\n function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"thead\", [\n _c(\"tr\", [\n _c(\"td\", { staticClass: \"text-center\" }, [_c(\"b\", [_vm._v(\"File\")])]),\n _vm._v(\" \"),\n _c(\"td\", { staticClass: \"text-center\" }, [\n _c(\"b\", [_vm._v(\"Settings\")])\n ])\n ])\n ])\n },\n function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"div\", { staticClass: \"form-group\" }, [\n _c(\"input\", {\n staticClass: \"form-control-file\",\n attrs: {\n id: \"file\",\n multiple: \"\",\n name: \"file\",\n required: \"\",\n type: \"file\"\n }\n }),\n _vm._v(\" \"),\n _c(\"sub\", { staticClass: \"text-muted\" }, [\n _vm._v(\n \"\\n Attach multiple files using Control+Click or Cmd+Click.\\n \"\n )\n ])\n ])\n },\n function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"div\", { staticClass: \"form-group\" }, [\n _c(\"input\", {\n staticClass: \"btn btn-success float-right\",\n attrs: {\n id: \"_submit\",\n name: \"_submit\",\n type: \"submit\",\n value: \"Upload\"\n }\n })\n ])\n }\n]\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./CTFd/themes/admin/assets/js/components/files/ChallengeFilesList.vue?./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options");
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function () {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"div\", [\n _c(\n \"table\",\n { staticClass: \"table table-striped\", attrs: { id: \"filesboard\" } },\n [\n _vm._m(0),\n _vm._v(\" \"),\n _c(\n \"tbody\",\n _vm._l(_vm.files, function (file) {\n return _c(\"tr\", { key: file.id }, [\n _c(\"td\", { staticClass: \"text-center\" }, [\n _c(\n \"a\",\n { attrs: { href: _vm.urlRoot + \"/files/\" + file.location } },\n [_vm._v(_vm._s(file.location.split(\"/\").pop()))]\n ),\n ]),\n _vm._v(\" \"),\n _c(\"td\", { staticClass: \"text-center\" }, [\n _c(\"i\", {\n staticClass: \"btn-fa fas fa-times delete-file\",\n attrs: { role: \"button\" },\n on: {\n click: function ($event) {\n return _vm.deleteFile(file.id)\n },\n },\n }),\n ]),\n ])\n }),\n 0\n ),\n ]\n ),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-md-12 mt-3\" }, [\n _c(\n \"form\",\n {\n ref: \"FileUploadForm\",\n attrs: { method: \"POST\" },\n on: {\n submit: function ($event) {\n $event.preventDefault()\n return _vm.addFiles.apply(null, arguments)\n },\n },\n },\n [_vm._m(1), _vm._v(\" \"), _vm._m(2)]\n ),\n ]),\n ])\n}\nvar staticRenderFns = [\n function () {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"thead\", [\n _c(\"tr\", [\n _c(\"td\", { staticClass: \"text-center\" }, [_c(\"b\", [_vm._v(\"File\")])]),\n _vm._v(\" \"),\n _c(\"td\", { staticClass: \"text-center\" }, [\n _c(\"b\", [_vm._v(\"Settings\")]),\n ]),\n ]),\n ])\n },\n function () {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"div\", { staticClass: \"form-group\" }, [\n _c(\"input\", {\n staticClass: \"form-control-file\",\n attrs: {\n id: \"file\",\n multiple: \"\",\n name: \"file\",\n required: \"\",\n type: \"file\",\n },\n }),\n _vm._v(\" \"),\n _c(\"sub\", { staticClass: \"text-muted\" }, [\n _vm._v(\n \"\\n Attach multiple files using Control+Click or Cmd+Click.\\n \"\n ),\n ]),\n ])\n },\n function () {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"div\", { staticClass: \"form-group\" }, [\n _c(\"input\", {\n staticClass: \"btn btn-success float-right\",\n attrs: {\n id: \"_submit\",\n name: \"_submit\",\n type: \"submit\",\n value: \"Upload\",\n },\n }),\n ])\n },\n]\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./CTFd/themes/admin/assets/js/components/files/ChallengeFilesList.vue?./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options");
/***/ }),
@@ -870,7 +870,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) *
/***/ (function(module, __webpack_exports__, __webpack_require__) {
;
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n \"div\",\n { staticClass: \"modal fade\", attrs: { id: \"media-modal\", tabindex: \"-1\" } },\n [\n _c(\"div\", { staticClass: \"modal-dialog modal-xl\" }, [\n _c(\"div\", { staticClass: \"modal-content\" }, [\n _vm._m(0),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"modal-body\" }, [\n _c(\"div\", { staticClass: \"modal-header\" }, [\n _c(\"div\", { staticClass: \"container\" }, [\n _c(\"div\", { staticClass: \"row mh-100\" }, [\n _c(\n \"div\",\n {\n staticClass: \"col-md-6\",\n attrs: { id: \"media-library-list\" }\n },\n _vm._l(_vm.files, function(file) {\n return _c(\n \"div\",\n { key: file.id, staticClass: \"media-item-wrapper\" },\n [\n _c(\n \"a\",\n {\n attrs: { href: \"javascript:void(0)\" },\n on: {\n click: function($event) {\n _vm.selectFile(file)\n return false\n }\n }\n },\n [\n _c(\"i\", {\n class: _vm.getIconClass(file.location),\n attrs: { \"aria-hidden\": \"true\" }\n }),\n _vm._v(\" \"),\n _c(\"small\", { staticClass: \"media-item-title\" }, [\n _vm._v(_vm._s(file.location.split(\"/\").pop()))\n ])\n ]\n )\n ]\n )\n }),\n 0\n ),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass: \"col-md-6\",\n attrs: { id: \"media-library-details\" }\n },\n [\n _c(\"h4\", { staticClass: \"text-center\" }, [\n _vm._v(\"Media Details\")\n ]),\n _vm._v(\" \"),\n _c(\"div\", { attrs: { id: \"media-item\" } }, [\n _c(\n \"div\",\n {\n staticClass: \"text-center\",\n attrs: { id: \"media-icon\" }\n },\n [\n this.selectedFile\n ? _c(\"div\", [\n _vm.getIconClass(\n this.selectedFile.location\n ) === \"far fa-file-image\"\n ? _c(\"div\", [\n _c(\"img\", {\n staticStyle: {\n \"max-width\": \"100%\",\n \"max-height\": \"100%\",\n \"object-fit\": \"contain\"\n },\n attrs: {\n src: _vm.buildSelectedFileUrl()\n }\n })\n ])\n : _c(\"div\", [\n _c(\"i\", {\n class:\n _vm.getIconClass(\n this.selectedFile.location\n ) + \" fa-4x\",\n attrs: { \"aria-hidden\": \"true\" }\n })\n ])\n ])\n : _vm._e()\n ]\n ),\n _vm._v(\" \"),\n _c(\"br\"),\n _vm._v(\" \"),\n this.selectedFile\n ? _c(\n \"div\",\n {\n staticClass: \"text-center\",\n attrs: { id: \"media-filename\" }\n },\n [\n _c(\n \"a\",\n {\n attrs: {\n href: _vm.buildSelectedFileUrl(),\n target: \"_blank\"\n }\n },\n [\n _vm._v(\n \"\\n \" +\n _vm._s(\n this.selectedFile.location\n .split(\"/\")\n .pop()\n ) +\n \"\\n \"\n )\n ]\n )\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n _c(\"br\"),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"form-group\" }, [\n this.selectedFile\n ? _c(\"div\", [\n _vm._v(\n \"\\n Link:\\n \"\n ),\n _c(\"input\", {\n staticClass: \"form-control\",\n attrs: {\n type: \"text\",\n id: \"media-link\",\n readonly: \"\"\n },\n domProps: {\n value: _vm.buildSelectedFileUrl()\n }\n })\n ])\n : _c(\"div\", [\n _vm._v(\n \"\\n Link:\\n \"\n ),\n _c(\"input\", {\n staticClass: \"form-control\",\n attrs: {\n type: \"text\",\n id: \"media-link\",\n readonly: \"\"\n }\n })\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"form-group text-center\" }, [\n _c(\"div\", { staticClass: \"row\" }, [\n _c(\"div\", { staticClass: \"col-md-6\" }, [\n _c(\n \"button\",\n {\n staticClass: \"btn btn-success w-100\",\n attrs: {\n id: \"media-insert\",\n \"data-toggle\": \"tooltip\",\n \"data-placement\": \"top\",\n title: \"Insert link into editor\"\n },\n on: { click: _vm.insertSelectedFile }\n },\n [\n _vm._v(\n \"\\n Insert\\n \"\n )\n ]\n )\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-md-3\" }, [\n _c(\n \"button\",\n {\n staticClass: \"btn btn-primary w-100\",\n attrs: {\n id: \"media-download\",\n \"data-toggle\": \"tooltip\",\n \"data-placement\": \"top\",\n title: \"Download file\"\n },\n on: { click: _vm.downloadSelectedFile }\n },\n [_c(\"i\", { staticClass: \"fas fa-download\" })]\n )\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-md-3\" }, [\n _c(\n \"button\",\n {\n staticClass: \"btn btn-danger w-100\",\n attrs: {\n id: \"media-delete\",\n \"data-toggle\": \"tooltip\",\n \"data-placement\": \"top\",\n title: \"Delete file\"\n },\n on: { click: _vm.deleteSelectedFile }\n },\n [_c(\"i\", { staticClass: \"far fa-trash-alt\" })]\n )\n ])\n ])\n ])\n ])\n ]\n )\n ])\n ])\n ]),\n _vm._v(\" \"),\n _vm._m(1)\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"modal-footer\" }, [\n _c(\"div\", { staticClass: \"float-right\" }, [\n _c(\n \"button\",\n {\n staticClass: \"btn btn-primary media-upload-button\",\n attrs: { type: \"submit\" },\n on: { click: _vm.uploadChosenFiles }\n },\n [_vm._v(\"\\n Upload\\n \")]\n )\n ])\n ])\n ])\n ])\n ]\n )\n}\nvar staticRenderFns = [\n function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"div\", { staticClass: \"modal-header\" }, [\n _c(\"div\", { staticClass: \"container\" }, [\n _c(\"div\", { staticClass: \"row\" }, [\n _c(\"div\", { staticClass: \"col-md-12\" }, [\n _c(\"h3\", { staticClass: \"text-center\" }, [_vm._v(\"Media Library\")])\n ])\n ])\n ]),\n _vm._v(\" \"),\n _c(\n \"button\",\n {\n staticClass: \"close\",\n attrs: {\n type: \"button\",\n \"data-dismiss\": \"modal\",\n \"aria-label\": \"Close\"\n }\n },\n [_c(\"span\", { attrs: { \"aria-hidden\": \"true\" } }, [_vm._v(\"×\")])]\n )\n ])\n },\n function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n \"form\",\n { attrs: { id: \"media-library-upload\", enctype: \"multipart/form-data\" } },\n [\n _c(\"div\", { staticClass: \"form-group\" }, [\n _c(\"label\", { attrs: { for: \"media-files\" } }, [\n _vm._v(\"\\n Upload Files\\n \")\n ]),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"form-control-file\",\n attrs: {\n type: \"file\",\n name: \"file\",\n id: \"media-files\",\n multiple: \"\"\n }\n }),\n _vm._v(\" \"),\n _c(\"sub\", { staticClass: \"help-block\" }, [\n _vm._v(\n \"\\n Attach multiple files using Control+Click or Cmd+Click.\\n \"\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"input\", { attrs: { type: \"hidden\", value: \"page\", name: \"type\" } })\n ]\n )\n }\n]\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./CTFd/themes/admin/assets/js/components/files/MediaLibrary.vue?./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options");
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function () {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n \"div\",\n { staticClass: \"modal fade\", attrs: { id: \"media-modal\", tabindex: \"-1\" } },\n [\n _c(\"div\", { staticClass: \"modal-dialog modal-xl\" }, [\n _c(\"div\", { staticClass: \"modal-content\" }, [\n _vm._m(0),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"modal-body\" }, [\n _c(\"div\", { staticClass: \"modal-header\" }, [\n _c(\"div\", { staticClass: \"container\" }, [\n _c(\"div\", { staticClass: \"row mh-100\" }, [\n _c(\n \"div\",\n {\n staticClass: \"col-md-6\",\n attrs: { id: \"media-library-list\" },\n },\n _vm._l(_vm.files, function (file) {\n return _c(\n \"div\",\n { key: file.id, staticClass: \"media-item-wrapper\" },\n [\n _c(\n \"a\",\n {\n attrs: { href: \"javascript:void(0)\" },\n on: {\n click: function ($event) {\n _vm.selectFile(file)\n return false\n },\n },\n },\n [\n _c(\"i\", {\n class: _vm.getIconClass(file.location),\n attrs: { \"aria-hidden\": \"true\" },\n }),\n _vm._v(\" \"),\n _c(\"small\", { staticClass: \"media-item-title\" }, [\n _vm._v(_vm._s(file.location.split(\"/\").pop())),\n ]),\n ]\n ),\n ]\n )\n }),\n 0\n ),\n _vm._v(\" \"),\n _c(\n \"div\",\n {\n staticClass: \"col-md-6\",\n attrs: { id: \"media-library-details\" },\n },\n [\n _c(\"h4\", { staticClass: \"text-center\" }, [\n _vm._v(\"Media Details\"),\n ]),\n _vm._v(\" \"),\n _c(\"div\", { attrs: { id: \"media-item\" } }, [\n _c(\n \"div\",\n {\n staticClass: \"text-center\",\n attrs: { id: \"media-icon\" },\n },\n [\n this.selectedFile\n ? _c(\"div\", [\n _vm.getIconClass(\n this.selectedFile.location\n ) === \"far fa-file-image\"\n ? _c(\"div\", [\n _c(\"img\", {\n staticStyle: {\n \"max-width\": \"100%\",\n \"max-height\": \"100%\",\n \"object-fit\": \"contain\",\n },\n attrs: {\n src: _vm.buildSelectedFileUrl(),\n },\n }),\n ])\n : _c(\"div\", [\n _c(\"i\", {\n class:\n _vm.getIconClass(\n this.selectedFile.location\n ) + \" fa-4x\",\n attrs: { \"aria-hidden\": \"true\" },\n }),\n ]),\n ])\n : _vm._e(),\n ]\n ),\n _vm._v(\" \"),\n _c(\"br\"),\n _vm._v(\" \"),\n this.selectedFile\n ? _c(\n \"div\",\n {\n staticClass: \"text-center\",\n attrs: { id: \"media-filename\" },\n },\n [\n _c(\n \"a\",\n {\n attrs: {\n href: _vm.buildSelectedFileUrl(),\n target: \"_blank\",\n },\n },\n [\n _vm._v(\n \"\\n \" +\n _vm._s(\n this.selectedFile.location\n .split(\"/\")\n .pop()\n ) +\n \"\\n \"\n ),\n ]\n ),\n ]\n )\n : _vm._e(),\n _vm._v(\" \"),\n _c(\"br\"),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"form-group\" }, [\n this.selectedFile\n ? _c(\"div\", [\n _vm._v(\n \"\\n Link:\\n \"\n ),\n _c(\"input\", {\n staticClass: \"form-control\",\n attrs: {\n type: \"text\",\n id: \"media-link\",\n readonly: \"\",\n },\n domProps: {\n value: _vm.buildSelectedFileUrl(),\n },\n }),\n ])\n : _c(\"div\", [\n _vm._v(\n \"\\n Link:\\n \"\n ),\n _c(\"input\", {\n staticClass: \"form-control\",\n attrs: {\n type: \"text\",\n id: \"media-link\",\n readonly: \"\",\n },\n }),\n ]),\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"form-group text-center\" }, [\n _c(\"div\", { staticClass: \"row\" }, [\n _c(\"div\", { staticClass: \"col-md-6\" }, [\n _c(\n \"button\",\n {\n staticClass: \"btn btn-success w-100\",\n attrs: {\n id: \"media-insert\",\n \"data-toggle\": \"tooltip\",\n \"data-placement\": \"top\",\n title: \"Insert link into editor\",\n },\n on: { click: _vm.insertSelectedFile },\n },\n [\n _vm._v(\n \"\\n Insert\\n \"\n ),\n ]\n ),\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-md-3\" }, [\n _c(\n \"button\",\n {\n staticClass: \"btn btn-primary w-100\",\n attrs: {\n id: \"media-download\",\n \"data-toggle\": \"tooltip\",\n \"data-placement\": \"top\",\n title: \"Download file\",\n },\n on: { click: _vm.downloadSelectedFile },\n },\n [_c(\"i\", { staticClass: \"fas fa-download\" })]\n ),\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-md-3\" }, [\n _c(\n \"button\",\n {\n staticClass: \"btn btn-danger w-100\",\n attrs: {\n id: \"media-delete\",\n \"data-toggle\": \"tooltip\",\n \"data-placement\": \"top\",\n title: \"Delete file\",\n },\n on: { click: _vm.deleteSelectedFile },\n },\n [_c(\"i\", { staticClass: \"far fa-trash-alt\" })]\n ),\n ]),\n ]),\n ]),\n ]),\n ]\n ),\n ]),\n ]),\n ]),\n _vm._v(\" \"),\n _vm._m(1),\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"modal-footer\" }, [\n _c(\"div\", { staticClass: \"float-right\" }, [\n _c(\n \"button\",\n {\n staticClass: \"btn btn-primary media-upload-button\",\n attrs: { type: \"submit\" },\n on: { click: _vm.uploadChosenFiles },\n },\n [_vm._v(\"\\n Upload\\n \")]\n ),\n ]),\n ]),\n ]),\n ]),\n ]\n )\n}\nvar staticRenderFns = [\n function () {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"div\", { staticClass: \"modal-header\" }, [\n _c(\"div\", { staticClass: \"container\" }, [\n _c(\"div\", { staticClass: \"row\" }, [\n _c(\"div\", { staticClass: \"col-md-12\" }, [\n _c(\"h3\", { staticClass: \"text-center\" }, [_vm._v(\"Media Library\")]),\n ]),\n ]),\n ]),\n _vm._v(\" \"),\n _c(\n \"button\",\n {\n staticClass: \"close\",\n attrs: {\n type: \"button\",\n \"data-dismiss\": \"modal\",\n \"aria-label\": \"Close\",\n },\n },\n [_c(\"span\", { attrs: { \"aria-hidden\": \"true\" } }, [_vm._v(\"×\")])]\n ),\n ])\n },\n function () {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n \"form\",\n { attrs: { id: \"media-library-upload\", enctype: \"multipart/form-data\" } },\n [\n _c(\"div\", { staticClass: \"form-group\" }, [\n _c(\"label\", { attrs: { for: \"media-files\" } }, [\n _vm._v(\"\\n Upload Files\\n \"),\n ]),\n _vm._v(\" \"),\n _c(\"input\", {\n staticClass: \"form-control-file\",\n attrs: {\n type: \"file\",\n name: \"file\",\n id: \"media-files\",\n multiple: \"\",\n },\n }),\n _vm._v(\" \"),\n _c(\"sub\", { staticClass: \"help-block\" }, [\n _vm._v(\n \"\\n Attach multiple files using Control+Click or Cmd+Click.\\n \"\n ),\n ]),\n ]),\n _vm._v(\" \"),\n _c(\"input\", { attrs: { type: \"hidden\", value: \"page\", name: \"type\" } }),\n ]\n )\n },\n]\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./CTFd/themes/admin/assets/js/components/files/MediaLibrary.vue?./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options");
/***/ }),
@@ -882,7 +882,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) *
/***/ (function(module, __webpack_exports__, __webpack_require__) {
;
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n \"div\",\n {\n staticClass: \"modal fade\",\n attrs: { id: \"flag-create-modal\", tabindex: \"-1\" }\n },\n [\n _c(\"div\", { staticClass: \"modal-dialog modal-lg\" }, [\n _c(\"div\", { staticClass: \"modal-content\" }, [\n _vm._m(0),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"modal-body\" }, [\n _c(\"div\", { staticClass: \"create-keys-select-div\" }, [\n _c(\n \"label\",\n {\n staticClass: \"control-label\",\n attrs: { for: \"create-keys-select\" }\n },\n [_vm._v(\"\\n Choose Flag Type\\n \")]\n ),\n _vm._v(\" \"),\n _c(\n \"select\",\n {\n staticClass: \"form-control custom-select\",\n on: {\n change: function($event) {\n return _vm.selectType($event)\n }\n }\n },\n [\n _c(\"option\", [_vm._v(\" -- \")]),\n _vm._v(\" \"),\n _vm._l(Object.keys(_vm.types), function(type) {\n return _c(\n \"option\",\n { key: type, domProps: { value: type } },\n [_vm._v(_vm._s(type))]\n )\n })\n ],\n 2\n )\n ]),\n _vm._v(\" \"),\n _c(\"br\"),\n _vm._v(\" \"),\n _c(\n \"form\",\n {\n on: {\n submit: function($event) {\n $event.preventDefault()\n return _vm.submitFlag($event)\n }\n }\n },\n [\n _c(\"div\", {\n attrs: { id: \"create-flag-form\" },\n domProps: { innerHTML: _vm._s(_vm.createForm) }\n }),\n _vm._v(\" \"),\n _vm.createForm\n ? _c(\n \"button\",\n {\n staticClass: \"btn btn-success float-right\",\n attrs: { type: \"submit\" }\n },\n [_vm._v(\"\\n Create Flag\\n \")]\n )\n : _vm._e()\n ]\n )\n ])\n ])\n ])\n ]\n )\n}\nvar staticRenderFns = [\n function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"div\", { staticClass: \"modal-header text-center\" }, [\n _c(\"div\", { staticClass: \"container\" }, [\n _c(\"div\", { staticClass: \"row\" }, [\n _c(\"div\", { staticClass: \"col-md-12\" }, [\n _c(\"h3\", [_vm._v(\"Create Flag\")])\n ])\n ])\n ]),\n _vm._v(\" \"),\n _c(\n \"button\",\n {\n staticClass: \"close\",\n attrs: {\n type: \"button\",\n \"data-dismiss\": \"modal\",\n \"aria-label\": \"Close\"\n }\n },\n [_c(\"span\", { attrs: { \"aria-hidden\": \"true\" } }, [_vm._v(\"×\")])]\n )\n ])\n }\n]\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./CTFd/themes/admin/assets/js/components/flags/FlagCreationForm.vue?./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options");
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function () {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n \"div\",\n {\n staticClass: \"modal fade\",\n attrs: { id: \"flag-create-modal\", tabindex: \"-1\" },\n },\n [\n _c(\"div\", { staticClass: \"modal-dialog modal-lg\" }, [\n _c(\"div\", { staticClass: \"modal-content\" }, [\n _vm._m(0),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"modal-body\" }, [\n _c(\"div\", { staticClass: \"create-keys-select-div\" }, [\n _c(\n \"label\",\n {\n staticClass: \"control-label\",\n attrs: { for: \"create-keys-select\" },\n },\n [_vm._v(\"\\n Choose Flag Type\\n \")]\n ),\n _vm._v(\" \"),\n _c(\n \"select\",\n {\n staticClass: \"form-control custom-select\",\n on: {\n change: function ($event) {\n return _vm.selectType($event)\n },\n },\n },\n [\n _c(\"option\", [_vm._v(\" -- \")]),\n _vm._v(\" \"),\n _vm._l(Object.keys(_vm.types), function (type) {\n return _c(\n \"option\",\n { key: type, domProps: { value: type } },\n [_vm._v(_vm._s(type))]\n )\n }),\n ],\n 2\n ),\n ]),\n _vm._v(\" \"),\n _c(\"br\"),\n _vm._v(\" \"),\n _c(\n \"form\",\n {\n on: {\n submit: function ($event) {\n $event.preventDefault()\n return _vm.submitFlag.apply(null, arguments)\n },\n },\n },\n [\n _c(\"div\", {\n attrs: { id: \"create-flag-form\" },\n domProps: { innerHTML: _vm._s(_vm.createForm) },\n }),\n _vm._v(\" \"),\n _vm.createForm\n ? _c(\n \"button\",\n {\n staticClass: \"btn btn-success float-right\",\n attrs: { type: \"submit\" },\n },\n [_vm._v(\"\\n Create Flag\\n \")]\n )\n : _vm._e(),\n ]\n ),\n ]),\n ]),\n ]),\n ]\n )\n}\nvar staticRenderFns = [\n function () {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"div\", { staticClass: \"modal-header text-center\" }, [\n _c(\"div\", { staticClass: \"container\" }, [\n _c(\"div\", { staticClass: \"row\" }, [\n _c(\"div\", { staticClass: \"col-md-12\" }, [\n _c(\"h3\", [_vm._v(\"Create Flag\")]),\n ]),\n ]),\n ]),\n _vm._v(\" \"),\n _c(\n \"button\",\n {\n staticClass: \"close\",\n attrs: {\n type: \"button\",\n \"data-dismiss\": \"modal\",\n \"aria-label\": \"Close\",\n },\n },\n [_c(\"span\", { attrs: { \"aria-hidden\": \"true\" } }, [_vm._v(\"×\")])]\n ),\n ])\n },\n]\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./CTFd/themes/admin/assets/js/components/flags/FlagCreationForm.vue?./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options");
/***/ }),
@@ -894,7 +894,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) *
/***/ (function(module, __webpack_exports__, __webpack_require__) {
;
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n \"div\",\n {\n staticClass: \"modal fade\",\n attrs: { id: \"flag-edit-modal\", tabindex: \"-1\" }\n },\n [\n _c(\"div\", { staticClass: \"modal-dialog modal-lg\" }, [\n _c(\"div\", { staticClass: \"modal-content\" }, [\n _vm._m(0),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"modal-body\" }, [\n _c(\"form\", {\n attrs: { method: \"POST\" },\n domProps: { innerHTML: _vm._s(_vm.editForm) },\n on: {\n submit: function($event) {\n $event.preventDefault()\n return _vm.updateFlag($event)\n }\n }\n })\n ])\n ])\n ])\n ]\n )\n}\nvar staticRenderFns = [\n function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"div\", { staticClass: \"modal-header text-center\" }, [\n _c(\"div\", { staticClass: \"container\" }, [\n _c(\"div\", { staticClass: \"row\" }, [\n _c(\"div\", { staticClass: \"col-md-12\" }, [\n _c(\"h3\", { staticClass: \"text-center\" }, [_vm._v(\"Edit Flag\")])\n ])\n ])\n ]),\n _vm._v(\" \"),\n _c(\n \"button\",\n {\n staticClass: \"close\",\n attrs: {\n type: \"button\",\n \"data-dismiss\": \"modal\",\n \"aria-label\": \"Close\"\n }\n },\n [_c(\"span\", { attrs: { \"aria-hidden\": \"true\" } }, [_vm._v(\"×\")])]\n )\n ])\n }\n]\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./CTFd/themes/admin/assets/js/components/flags/FlagEditForm.vue?./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options");
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function () {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n \"div\",\n {\n staticClass: \"modal fade\",\n attrs: { id: \"flag-edit-modal\", tabindex: \"-1\" },\n },\n [\n _c(\"div\", { staticClass: \"modal-dialog modal-lg\" }, [\n _c(\"div\", { staticClass: \"modal-content\" }, [\n _vm._m(0),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"modal-body\" }, [\n _c(\"form\", {\n attrs: { method: \"POST\" },\n domProps: { innerHTML: _vm._s(_vm.editForm) },\n on: {\n submit: function ($event) {\n $event.preventDefault()\n return _vm.updateFlag.apply(null, arguments)\n },\n },\n }),\n ]),\n ]),\n ]),\n ]\n )\n}\nvar staticRenderFns = [\n function () {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"div\", { staticClass: \"modal-header text-center\" }, [\n _c(\"div\", { staticClass: \"container\" }, [\n _c(\"div\", { staticClass: \"row\" }, [\n _c(\"div\", { staticClass: \"col-md-12\" }, [\n _c(\"h3\", { staticClass: \"text-center\" }, [_vm._v(\"Edit Flag\")]),\n ]),\n ]),\n ]),\n _vm._v(\" \"),\n _c(\n \"button\",\n {\n staticClass: \"close\",\n attrs: {\n type: \"button\",\n \"data-dismiss\": \"modal\",\n \"aria-label\": \"Close\",\n },\n },\n [_c(\"span\", { attrs: { \"aria-hidden\": \"true\" } }, [_vm._v(\"×\")])]\n ),\n ])\n },\n]\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./CTFd/themes/admin/assets/js/components/flags/FlagEditForm.vue?./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options");
/***/ }),
@@ -906,7 +906,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) *
/***/ (function(module, __webpack_exports__, __webpack_require__) {
;
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"div\", [\n _c(\n \"div\",\n [\n _c(\"FlagCreationForm\", {\n ref: \"FlagCreationForm\",\n attrs: { challenge_id: _vm.challenge_id },\n on: { refreshFlags: _vm.refreshFlags }\n })\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\n \"div\",\n [\n _c(\"FlagEditForm\", {\n ref: \"FlagEditForm\",\n attrs: { flag_id: _vm.editing_flag_id },\n on: { refreshFlags: _vm.refreshFlags }\n })\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\n \"table\",\n { staticClass: \"table table-striped\", attrs: { id: \"flagsboard\" } },\n [\n _vm._m(0),\n _vm._v(\" \"),\n _c(\n \"tbody\",\n _vm._l(_vm.flags, function(flag) {\n return _c(\"tr\", { key: flag.id, attrs: { name: flag.id } }, [\n _c(\"td\", { staticClass: \"text-center\" }, [\n _vm._v(_vm._s(flag.type))\n ]),\n _vm._v(\" \"),\n _c(\"td\", { staticClass: \"text-break\" }, [\n _c(\"pre\", { staticClass: \"flag-content\" }, [\n _vm._v(_vm._s(flag.content))\n ])\n ]),\n _vm._v(\" \"),\n _c(\"td\", { staticClass: \"text-center\" }, [\n _c(\"i\", {\n staticClass: \"btn-fa fas fa-edit edit-flag\",\n attrs: {\n role: \"button\",\n \"flag-id\": flag.id,\n \"flag-type\": flag.type\n },\n on: {\n click: function($event) {\n return _vm.editFlag(flag.id)\n }\n }\n }),\n _vm._v(\" \"),\n _c(\"i\", {\n staticClass: \"btn-fa fas fa-times delete-flag\",\n attrs: { role: \"button\", \"flag-id\": flag.id },\n on: {\n click: function($event) {\n return _vm.deleteFlag(flag.id)\n }\n }\n })\n ])\n ])\n }),\n 0\n )\n ]\n ),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-md-12\" }, [\n _c(\n \"button\",\n {\n staticClass: \"btn btn-success d-inline-block float-right\",\n attrs: { id: \"flag-add-button\" },\n on: {\n click: function($event) {\n return _vm.addFlag()\n }\n }\n },\n [_vm._v(\"\\n Create Flag\\n \")]\n )\n ])\n ])\n}\nvar staticRenderFns = [\n function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"thead\", [\n _c(\"tr\", [\n _c(\"td\", { staticClass: \"text-center\" }, [_c(\"b\", [_vm._v(\"Type\")])]),\n _vm._v(\" \"),\n _c(\"td\", { staticClass: \"text-center\" }, [_c(\"b\", [_vm._v(\"Flag\")])]),\n _vm._v(\" \"),\n _c(\"td\", { staticClass: \"text-center\" }, [\n _c(\"b\", [_vm._v(\"Settings\")])\n ])\n ])\n ])\n }\n]\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./CTFd/themes/admin/assets/js/components/flags/FlagList.vue?./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options");
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function () {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"div\", [\n _c(\n \"div\",\n [\n _c(\"FlagCreationForm\", {\n ref: \"FlagCreationForm\",\n attrs: { challenge_id: _vm.challenge_id },\n on: { refreshFlags: _vm.refreshFlags },\n }),\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\n \"div\",\n [\n _c(\"FlagEditForm\", {\n ref: \"FlagEditForm\",\n attrs: { flag_id: _vm.editing_flag_id },\n on: { refreshFlags: _vm.refreshFlags },\n }),\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\n \"table\",\n { staticClass: \"table table-striped\", attrs: { id: \"flagsboard\" } },\n [\n _vm._m(0),\n _vm._v(\" \"),\n _c(\n \"tbody\",\n _vm._l(_vm.flags, function (flag) {\n return _c(\"tr\", { key: flag.id, attrs: { name: flag.id } }, [\n _c(\"td\", { staticClass: \"text-center\" }, [\n _vm._v(_vm._s(flag.type)),\n ]),\n _vm._v(\" \"),\n _c(\"td\", { staticClass: \"text-break\" }, [\n _c(\"pre\", { staticClass: \"flag-content\" }, [\n _vm._v(_vm._s(flag.content)),\n ]),\n ]),\n _vm._v(\" \"),\n _c(\"td\", { staticClass: \"text-center\" }, [\n _c(\"i\", {\n staticClass: \"btn-fa fas fa-edit edit-flag\",\n attrs: {\n role: \"button\",\n \"flag-id\": flag.id,\n \"flag-type\": flag.type,\n },\n on: {\n click: function ($event) {\n return _vm.editFlag(flag.id)\n },\n },\n }),\n _vm._v(\" \"),\n _c(\"i\", {\n staticClass: \"btn-fa fas fa-times delete-flag\",\n attrs: { role: \"button\", \"flag-id\": flag.id },\n on: {\n click: function ($event) {\n return _vm.deleteFlag(flag.id)\n },\n },\n }),\n ]),\n ])\n }),\n 0\n ),\n ]\n ),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-md-12\" }, [\n _c(\n \"button\",\n {\n staticClass: \"btn btn-success d-inline-block float-right\",\n attrs: { id: \"flag-add-button\" },\n on: {\n click: function ($event) {\n return _vm.addFlag()\n },\n },\n },\n [_vm._v(\"\\n Create Flag\\n \")]\n ),\n ]),\n ])\n}\nvar staticRenderFns = [\n function () {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"thead\", [\n _c(\"tr\", [\n _c(\"td\", { staticClass: \"text-center\" }, [_c(\"b\", [_vm._v(\"Type\")])]),\n _vm._v(\" \"),\n _c(\"td\", { staticClass: \"text-center\" }, [_c(\"b\", [_vm._v(\"Flag\")])]),\n _vm._v(\" \"),\n _c(\"td\", { staticClass: \"text-center\" }, [\n _c(\"b\", [_vm._v(\"Settings\")]),\n ]),\n ]),\n ])\n },\n]\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./CTFd/themes/admin/assets/js/components/flags/FlagList.vue?./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options");
/***/ }),
@@ -918,7 +918,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) *
/***/ (function(module, __webpack_exports__, __webpack_require__) {
;
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"div\", { staticClass: \"modal fade\", attrs: { tabindex: \"-1\" } }, [\n _c(\"div\", { staticClass: \"modal-dialog\" }, [\n _c(\"div\", { staticClass: \"modal-content\" }, [\n _vm._m(0),\n _vm._v(\" \"),\n _c(\n \"form\",\n {\n attrs: { method: \"POST\" },\n on: {\n submit: function($event) {\n $event.preventDefault()\n return _vm.submitHint($event)\n }\n }\n },\n [\n _c(\"div\", { staticClass: \"modal-body\" }, [\n _c(\"div\", { staticClass: \"container\" }, [\n _c(\"div\", { staticClass: \"row\" }, [\n _c(\"div\", { staticClass: \"col-md-12\" }, [\n _c(\"div\", { staticClass: \"form-group\" }, [\n _vm._m(1),\n _vm._v(\" \"),\n _c(\"textarea\", {\n ref: \"content\",\n staticClass: \"form-control markdown\",\n attrs: { type: \"text\", name: \"content\", rows: \"7\" }\n })\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"form-group\" }, [\n _vm._m(2),\n _vm._v(\" \"),\n _c(\"input\", {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model.lazy\",\n value: _vm.cost,\n expression: \"cost\",\n modifiers: { lazy: true }\n }\n ],\n staticClass: \"form-control\",\n attrs: { type: \"number\", name: \"cost\" },\n domProps: { value: _vm.cost },\n on: {\n change: function($event) {\n _vm.cost = $event.target.value\n }\n }\n })\n ]),\n _vm._v(\" \"),\n _c(\"input\", {\n attrs: {\n type: \"hidden\",\n id: \"hint-id-for-hint\",\n name: \"id\"\n }\n })\n ])\n ])\n ])\n ]),\n _vm._v(\" \"),\n _vm._m(3)\n ]\n )\n ])\n ])\n ])\n}\nvar staticRenderFns = [\n function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"div\", { staticClass: \"modal-header text-center\" }, [\n _c(\"div\", { staticClass: \"container\" }, [\n _c(\"div\", { staticClass: \"row\" }, [\n _c(\"div\", { staticClass: \"col-md-12\" }, [_c(\"h3\", [_vm._v(\"Hint\")])])\n ])\n ]),\n _vm._v(\" \"),\n _c(\n \"button\",\n {\n staticClass: \"close\",\n attrs: {\n type: \"button\",\n \"data-dismiss\": \"modal\",\n \"aria-label\": \"Close\"\n }\n },\n [_c(\"span\", { attrs: { \"aria-hidden\": \"true\" } }, [_vm._v(\"×\")])]\n )\n ])\n },\n function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"label\", { staticClass: \"text-muted\" }, [\n _vm._v(\"\\n Hint\"),\n _c(\"br\"),\n _vm._v(\" \"),\n _c(\"small\", [_vm._v(\"Markdown & HTML are supported\")])\n ])\n },\n function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"label\", [\n _vm._v(\"\\n Cost\"),\n _c(\"br\"),\n _vm._v(\" \"),\n _c(\"small\", [_vm._v(\"How many points it costs to see your hint.\")])\n ])\n },\n function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"div\", { staticClass: \"modal-footer\" }, [\n _c(\"div\", { staticClass: \"container\" }, [\n _c(\"div\", { staticClass: \"row\" }, [\n _c(\"div\", { staticClass: \"col-md-12\" }, [\n _c(\"button\", { staticClass: \"btn btn-primary float-right\" }, [\n _vm._v(\"Submit\")\n ])\n ])\n ])\n ])\n ])\n }\n]\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./CTFd/themes/admin/assets/js/components/hints/HintCreationForm.vue?./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options");
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function () {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"div\", { staticClass: \"modal fade\", attrs: { tabindex: \"-1\" } }, [\n _c(\"div\", { staticClass: \"modal-dialog\" }, [\n _c(\"div\", { staticClass: \"modal-content\" }, [\n _vm._m(0),\n _vm._v(\" \"),\n _c(\n \"form\",\n {\n attrs: { method: \"POST\" },\n on: {\n submit: function ($event) {\n $event.preventDefault()\n return _vm.submitHint.apply(null, arguments)\n },\n },\n },\n [\n _c(\"div\", { staticClass: \"modal-body\" }, [\n _c(\"div\", { staticClass: \"container\" }, [\n _c(\"div\", { staticClass: \"row\" }, [\n _c(\"div\", { staticClass: \"col-md-12\" }, [\n _c(\"div\", { staticClass: \"form-group\" }, [\n _vm._m(1),\n _vm._v(\" \"),\n _c(\"textarea\", {\n ref: \"content\",\n staticClass: \"form-control markdown\",\n attrs: { type: \"text\", name: \"content\", rows: \"7\" },\n }),\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"form-group\" }, [\n _vm._m(2),\n _vm._v(\" \"),\n _c(\"input\", {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model.lazy\",\n value: _vm.cost,\n expression: \"cost\",\n modifiers: { lazy: true },\n },\n ],\n staticClass: \"form-control\",\n attrs: { type: \"number\", name: \"cost\" },\n domProps: { value: _vm.cost },\n on: {\n change: function ($event) {\n _vm.cost = $event.target.value\n },\n },\n }),\n ]),\n _vm._v(\" \"),\n _c(\"input\", {\n attrs: {\n type: \"hidden\",\n id: \"hint-id-for-hint\",\n name: \"id\",\n },\n }),\n ]),\n ]),\n ]),\n ]),\n _vm._v(\" \"),\n _vm._m(3),\n ]\n ),\n ]),\n ]),\n ])\n}\nvar staticRenderFns = [\n function () {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"div\", { staticClass: \"modal-header text-center\" }, [\n _c(\"div\", { staticClass: \"container\" }, [\n _c(\"div\", { staticClass: \"row\" }, [\n _c(\"div\", { staticClass: \"col-md-12\" }, [_c(\"h3\", [_vm._v(\"Hint\")])]),\n ]),\n ]),\n _vm._v(\" \"),\n _c(\n \"button\",\n {\n staticClass: \"close\",\n attrs: {\n type: \"button\",\n \"data-dismiss\": \"modal\",\n \"aria-label\": \"Close\",\n },\n },\n [_c(\"span\", { attrs: { \"aria-hidden\": \"true\" } }, [_vm._v(\"×\")])]\n ),\n ])\n },\n function () {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"label\", { staticClass: \"text-muted\" }, [\n _vm._v(\"\\n Hint\"),\n _c(\"br\"),\n _vm._v(\" \"),\n _c(\"small\", [_vm._v(\"Markdown & HTML are supported\")]),\n ])\n },\n function () {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"label\", [\n _vm._v(\"\\n Cost\"),\n _c(\"br\"),\n _vm._v(\" \"),\n _c(\"small\", [_vm._v(\"How many points it costs to see your hint.\")]),\n ])\n },\n function () {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"div\", { staticClass: \"modal-footer\" }, [\n _c(\"div\", { staticClass: \"container\" }, [\n _c(\"div\", { staticClass: \"row\" }, [\n _c(\"div\", { staticClass: \"col-md-12\" }, [\n _c(\"button\", { staticClass: \"btn btn-primary float-right\" }, [\n _vm._v(\"Submit\"),\n ]),\n ]),\n ]),\n ]),\n ])\n },\n]\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./CTFd/themes/admin/assets/js/components/hints/HintCreationForm.vue?./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options");
/***/ }),
@@ -930,7 +930,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) *
/***/ (function(module, __webpack_exports__, __webpack_require__) {
;
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"div\", { staticClass: \"modal fade\", attrs: { tabindex: \"-1\" } }, [\n _c(\"div\", { staticClass: \"modal-dialog\" }, [\n _c(\"div\", { staticClass: \"modal-content\" }, [\n _vm._m(0),\n _vm._v(\" \"),\n _c(\n \"form\",\n {\n attrs: { method: \"POST\" },\n on: {\n submit: function($event) {\n $event.preventDefault()\n return _vm.updateHint($event)\n }\n }\n },\n [\n _c(\"div\", { staticClass: \"modal-body\" }, [\n _c(\"div\", { staticClass: \"container\" }, [\n _c(\"div\", { staticClass: \"row\" }, [\n _c(\"div\", { staticClass: \"col-md-12\" }, [\n _c(\"div\", { staticClass: \"form-group\" }, [\n _vm._m(1),\n _vm._v(\" \"),\n _c(\"textarea\", {\n ref: \"content\",\n staticClass: \"form-control\",\n attrs: { type: \"text\", name: \"content\", rows: \"7\" },\n domProps: { value: this.content }\n })\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"form-group\" }, [\n _vm._m(2),\n _vm._v(\" \"),\n _c(\"input\", {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model.lazy\",\n value: _vm.cost,\n expression: \"cost\",\n modifiers: { lazy: true }\n }\n ],\n staticClass: \"form-control\",\n attrs: { type: \"number\", name: \"cost\" },\n domProps: { value: _vm.cost },\n on: {\n change: function($event) {\n _vm.cost = $event.target.value\n }\n }\n })\n ])\n ])\n ])\n ])\n ]),\n _vm._v(\" \"),\n _vm._m(3)\n ]\n )\n ])\n ])\n ])\n}\nvar staticRenderFns = [\n function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"div\", { staticClass: \"modal-header text-center\" }, [\n _c(\"div\", { staticClass: \"container\" }, [\n _c(\"div\", { staticClass: \"row\" }, [\n _c(\"div\", { staticClass: \"col-md-12\" }, [_c(\"h3\", [_vm._v(\"Hint\")])])\n ])\n ]),\n _vm._v(\" \"),\n _c(\n \"button\",\n {\n staticClass: \"close\",\n attrs: {\n type: \"button\",\n \"data-dismiss\": \"modal\",\n \"aria-label\": \"Close\"\n }\n },\n [_c(\"span\", { attrs: { \"aria-hidden\": \"true\" } }, [_vm._v(\"×\")])]\n )\n ])\n },\n function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"label\", { staticClass: \"text-muted\" }, [\n _vm._v(\"\\n Hint\"),\n _c(\"br\"),\n _vm._v(\" \"),\n _c(\"small\", [_vm._v(\"Markdown & HTML are supported\")])\n ])\n },\n function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"label\", [\n _vm._v(\"\\n Cost\"),\n _c(\"br\"),\n _vm._v(\" \"),\n _c(\"small\", [_vm._v(\"How many points it costs to see your hint.\")])\n ])\n },\n function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"div\", { staticClass: \"modal-footer\" }, [\n _c(\"div\", { staticClass: \"container\" }, [\n _c(\"div\", { staticClass: \"row\" }, [\n _c(\"div\", { staticClass: \"col-md-12\" }, [\n _c(\"button\", { staticClass: \"btn btn-primary float-right\" }, [\n _vm._v(\"Submit\")\n ])\n ])\n ])\n ])\n ])\n }\n]\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./CTFd/themes/admin/assets/js/components/hints/HintEditForm.vue?./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options");
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function () {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"div\", { staticClass: \"modal fade\", attrs: { tabindex: \"-1\" } }, [\n _c(\"div\", { staticClass: \"modal-dialog\" }, [\n _c(\"div\", { staticClass: \"modal-content\" }, [\n _vm._m(0),\n _vm._v(\" \"),\n _c(\n \"form\",\n {\n attrs: { method: \"POST\" },\n on: {\n submit: function ($event) {\n $event.preventDefault()\n return _vm.updateHint.apply(null, arguments)\n },\n },\n },\n [\n _c(\"div\", { staticClass: \"modal-body\" }, [\n _c(\"div\", { staticClass: \"container\" }, [\n _c(\"div\", { staticClass: \"row\" }, [\n _c(\"div\", { staticClass: \"col-md-12\" }, [\n _c(\"div\", { staticClass: \"form-group\" }, [\n _vm._m(1),\n _vm._v(\" \"),\n _c(\"textarea\", {\n ref: \"content\",\n staticClass: \"form-control\",\n attrs: { type: \"text\", name: \"content\", rows: \"7\" },\n domProps: { value: this.content },\n }),\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"form-group\" }, [\n _vm._m(2),\n _vm._v(\" \"),\n _c(\"input\", {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model.lazy\",\n value: _vm.cost,\n expression: \"cost\",\n modifiers: { lazy: true },\n },\n ],\n staticClass: \"form-control\",\n attrs: { type: \"number\", name: \"cost\" },\n domProps: { value: _vm.cost },\n on: {\n change: function ($event) {\n _vm.cost = $event.target.value\n },\n },\n }),\n ]),\n ]),\n ]),\n ]),\n ]),\n _vm._v(\" \"),\n _vm._m(3),\n ]\n ),\n ]),\n ]),\n ])\n}\nvar staticRenderFns = [\n function () {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"div\", { staticClass: \"modal-header text-center\" }, [\n _c(\"div\", { staticClass: \"container\" }, [\n _c(\"div\", { staticClass: \"row\" }, [\n _c(\"div\", { staticClass: \"col-md-12\" }, [_c(\"h3\", [_vm._v(\"Hint\")])]),\n ]),\n ]),\n _vm._v(\" \"),\n _c(\n \"button\",\n {\n staticClass: \"close\",\n attrs: {\n type: \"button\",\n \"data-dismiss\": \"modal\",\n \"aria-label\": \"Close\",\n },\n },\n [_c(\"span\", { attrs: { \"aria-hidden\": \"true\" } }, [_vm._v(\"×\")])]\n ),\n ])\n },\n function () {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"label\", { staticClass: \"text-muted\" }, [\n _vm._v(\"\\n Hint\"),\n _c(\"br\"),\n _vm._v(\" \"),\n _c(\"small\", [_vm._v(\"Markdown & HTML are supported\")]),\n ])\n },\n function () {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"label\", [\n _vm._v(\"\\n Cost\"),\n _c(\"br\"),\n _vm._v(\" \"),\n _c(\"small\", [_vm._v(\"How many points it costs to see your hint.\")]),\n ])\n },\n function () {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"div\", { staticClass: \"modal-footer\" }, [\n _c(\"div\", { staticClass: \"container\" }, [\n _c(\"div\", { staticClass: \"row\" }, [\n _c(\"div\", { staticClass: \"col-md-12\" }, [\n _c(\"button\", { staticClass: \"btn btn-primary float-right\" }, [\n _vm._v(\"Submit\"),\n ]),\n ]),\n ]),\n ]),\n ])\n },\n]\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./CTFd/themes/admin/assets/js/components/hints/HintEditForm.vue?./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options");
/***/ }),
@@ -942,7 +942,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) *
/***/ (function(module, __webpack_exports__, __webpack_require__) {
;
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"div\", [\n _c(\n \"div\",\n [\n _c(\"HintCreationForm\", {\n ref: \"HintCreationForm\",\n attrs: { challenge_id: _vm.challenge_id },\n on: { refreshHints: _vm.refreshHints }\n })\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\n \"div\",\n [\n _c(\"HintEditForm\", {\n ref: \"HintEditForm\",\n attrs: { hint_id: _vm.editing_hint_id },\n on: { refreshHints: _vm.refreshHints }\n })\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"table\", { staticClass: \"table table-striped\" }, [\n _vm._m(0),\n _vm._v(\" \"),\n _c(\n \"tbody\",\n _vm._l(_vm.hints, function(hint) {\n return _c(\"tr\", { key: hint.id }, [\n _c(\"td\", { staticClass: \"text-center\" }, [\n _vm._v(_vm._s(hint.type))\n ]),\n _vm._v(\" \"),\n _c(\"td\", { staticClass: \"text-break\" }, [\n _c(\"pre\", [_vm._v(_vm._s(hint.content))])\n ]),\n _vm._v(\" \"),\n _c(\"td\", { staticClass: \"text-center\" }, [\n _vm._v(_vm._s(hint.cost))\n ]),\n _vm._v(\" \"),\n _c(\"td\", { staticClass: \"text-center\" }, [\n _c(\"i\", {\n staticClass: \"btn-fa fas fa-edit\",\n attrs: { role: \"button\" },\n on: {\n click: function($event) {\n return _vm.editHint(hint.id)\n }\n }\n }),\n _vm._v(\" \"),\n _c(\"i\", {\n staticClass: \"btn-fa fas fa-times\",\n attrs: { role: \"button\" },\n on: {\n click: function($event) {\n return _vm.deleteHint(hint.id)\n }\n }\n })\n ])\n ])\n }),\n 0\n )\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-md-12\" }, [\n _c(\n \"button\",\n {\n staticClass: \"btn btn-success float-right\",\n on: { click: _vm.addHint }\n },\n [_vm._v(\"\\n Create Hint\\n \")]\n )\n ])\n ])\n}\nvar staticRenderFns = [\n function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"thead\", [\n _c(\"tr\", [\n _c(\"td\", { staticClass: \"text-center\" }, [_c(\"b\", [_vm._v(\"ID\")])]),\n _vm._v(\" \"),\n _c(\"td\", { staticClass: \"text-center\" }, [_c(\"b\", [_vm._v(\"Hint\")])]),\n _vm._v(\" \"),\n _c(\"td\", { staticClass: \"text-center\" }, [_c(\"b\", [_vm._v(\"Cost\")])]),\n _vm._v(\" \"),\n _c(\"td\", { staticClass: \"text-center\" }, [\n _c(\"b\", [_vm._v(\"Settings\")])\n ])\n ])\n ])\n }\n]\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./CTFd/themes/admin/assets/js/components/hints/HintsList.vue?./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options");
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function () {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"div\", [\n _c(\n \"div\",\n [\n _c(\"HintCreationForm\", {\n ref: \"HintCreationForm\",\n attrs: { challenge_id: _vm.challenge_id },\n on: { refreshHints: _vm.refreshHints },\n }),\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\n \"div\",\n [\n _c(\"HintEditForm\", {\n ref: \"HintEditForm\",\n attrs: { hint_id: _vm.editing_hint_id },\n on: { refreshHints: _vm.refreshHints },\n }),\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"table\", { staticClass: \"table table-striped\" }, [\n _vm._m(0),\n _vm._v(\" \"),\n _c(\n \"tbody\",\n _vm._l(_vm.hints, function (hint) {\n return _c(\"tr\", { key: hint.id }, [\n _c(\"td\", { staticClass: \"text-center\" }, [\n _vm._v(_vm._s(hint.type)),\n ]),\n _vm._v(\" \"),\n _c(\"td\", { staticClass: \"text-break\" }, [\n _c(\"pre\", [_vm._v(_vm._s(hint.content))]),\n ]),\n _vm._v(\" \"),\n _c(\"td\", { staticClass: \"text-center\" }, [\n _vm._v(_vm._s(hint.cost)),\n ]),\n _vm._v(\" \"),\n _c(\"td\", { staticClass: \"text-center\" }, [\n _c(\"i\", {\n staticClass: \"btn-fa fas fa-edit\",\n attrs: { role: \"button\" },\n on: {\n click: function ($event) {\n return _vm.editHint(hint.id)\n },\n },\n }),\n _vm._v(\" \"),\n _c(\"i\", {\n staticClass: \"btn-fa fas fa-times\",\n attrs: { role: \"button\" },\n on: {\n click: function ($event) {\n return _vm.deleteHint(hint.id)\n },\n },\n }),\n ]),\n ])\n }),\n 0\n ),\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-md-12\" }, [\n _c(\n \"button\",\n {\n staticClass: \"btn btn-success float-right\",\n on: { click: _vm.addHint },\n },\n [_vm._v(\"\\n Create Hint\\n \")]\n ),\n ]),\n ])\n}\nvar staticRenderFns = [\n function () {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"thead\", [\n _c(\"tr\", [\n _c(\"td\", { staticClass: \"text-center\" }, [_c(\"b\", [_vm._v(\"ID\")])]),\n _vm._v(\" \"),\n _c(\"td\", { staticClass: \"text-center\" }, [_c(\"b\", [_vm._v(\"Hint\")])]),\n _vm._v(\" \"),\n _c(\"td\", { staticClass: \"text-center\" }, [_c(\"b\", [_vm._v(\"Cost\")])]),\n _vm._v(\" \"),\n _c(\"td\", { staticClass: \"text-center\" }, [\n _c(\"b\", [_vm._v(\"Settings\")]),\n ]),\n ]),\n ])\n },\n]\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./CTFd/themes/admin/assets/js/components/hints/HintsList.vue?./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options");
/***/ }),
@@ -954,7 +954,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) *
/***/ (function(module, __webpack_exports__, __webpack_require__) {
;
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"div\", { staticClass: \"card bg-light mb-4\" }, [\n _c(\n \"button\",\n {\n staticClass: \"delete-notification close position-absolute p-3\",\n staticStyle: { right: \"0\" },\n attrs: {\n type: \"button\",\n \"data-notif-id\": this.id,\n \"data-dismiss\": \"alert\",\n \"aria-label\": \"Close\"\n },\n on: {\n click: function($event) {\n return _vm.deleteNotification()\n }\n }\n },\n [_c(\"span\", { attrs: { \"aria-hidden\": \"true\" } }, [_vm._v(\"×\")])]\n ),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"card-body\" }, [\n _c(\"h3\", { staticClass: \"card-title\" }, [_vm._v(_vm._s(_vm.title))]),\n _vm._v(\" \"),\n _c(\"blockquote\", { staticClass: \"blockquote mb-0\" }, [\n _c(\"p\", { domProps: { innerHTML: _vm._s(this.html) } }),\n _vm._v(\" \"),\n _c(\"small\", { staticClass: \"text-muted\" }, [\n _c(\"span\", { attrs: { \"data-time\": this.date } }, [\n _vm._v(_vm._s(this.localDate()))\n ])\n ])\n ])\n ])\n ])\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./CTFd/themes/admin/assets/js/components/notifications/Notification.vue?./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options");
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function () {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"div\", { staticClass: \"card bg-light mb-4\" }, [\n _c(\n \"button\",\n {\n staticClass: \"delete-notification close position-absolute p-3\",\n staticStyle: { right: \"0\" },\n attrs: {\n type: \"button\",\n \"data-notif-id\": this.id,\n \"data-dismiss\": \"alert\",\n \"aria-label\": \"Close\",\n },\n on: {\n click: function ($event) {\n return _vm.deleteNotification()\n },\n },\n },\n [_c(\"span\", { attrs: { \"aria-hidden\": \"true\" } }, [_vm._v(\"×\")])]\n ),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"card-body\" }, [\n _c(\"h3\", { staticClass: \"card-title\" }, [_vm._v(_vm._s(_vm.title))]),\n _vm._v(\" \"),\n _c(\"blockquote\", { staticClass: \"blockquote mb-0\" }, [\n _c(\"p\", { domProps: { innerHTML: _vm._s(this.html) } }),\n _vm._v(\" \"),\n _c(\"small\", { staticClass: \"text-muted\" }, [\n _c(\"span\", { attrs: { \"data-time\": this.date } }, [\n _vm._v(_vm._s(this.localDate())),\n ]),\n ]),\n ]),\n ]),\n ])\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./CTFd/themes/admin/assets/js/components/notifications/Notification.vue?./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options");
/***/ }),
@@ -966,7 +966,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) *
/***/ (function(module, __webpack_exports__, __webpack_require__) {
;
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"div\", [\n _c(\n \"form\",\n {\n on: {\n submit: function($event) {\n $event.preventDefault()\n return _vm.updateRequirements($event)\n }\n }\n },\n [\n _c(\n \"div\",\n { staticClass: \"form-group scrollbox\" },\n [\n _c(\n \"transition-group\",\n { attrs: { name: \"flip-list\" } },\n [\n _vm._l(_vm.requiredChallenges, function(challenge) {\n return _c(\n \"div\",\n { key: challenge.id, staticClass: \"form-check\" },\n [\n _c(\n \"label\",\n { staticClass: \"form-check-label cursor-pointer\" },\n [\n _c(\"input\", {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.selectedRequirements,\n expression: \"selectedRequirements\"\n }\n ],\n staticClass: \"form-check-input\",\n attrs: { type: \"checkbox\" },\n domProps: {\n value: challenge.id,\n checked: Array.isArray(_vm.selectedRequirements)\n ? _vm._i(\n _vm.selectedRequirements,\n challenge.id\n ) > -1\n : _vm.selectedRequirements\n },\n on: {\n change: function($event) {\n var $$a = _vm.selectedRequirements,\n $$el = $event.target,\n $$c = $$el.checked ? true : false\n if (Array.isArray($$a)) {\n var $$v = challenge.id,\n $$i = _vm._i($$a, $$v)\n if ($$el.checked) {\n $$i < 0 &&\n (_vm.selectedRequirements = $$a.concat([\n $$v\n ]))\n } else {\n $$i > -1 &&\n (_vm.selectedRequirements = $$a\n .slice(0, $$i)\n .concat($$a.slice($$i + 1)))\n }\n } else {\n _vm.selectedRequirements = $$c\n }\n }\n }\n }),\n _vm._v(\n \"\\n \" +\n _vm._s(challenge.name) +\n \"\\n \"\n )\n ]\n )\n ]\n )\n }),\n _vm._v(\" \"),\n _vm._l(_vm.otherChallenges, function(challenge) {\n return _c(\n \"div\",\n { key: challenge.id, staticClass: \"form-check\" },\n [\n _c(\n \"label\",\n { staticClass: \"form-check-label cursor-pointer\" },\n [\n _c(\"input\", {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.selectedRequirements,\n expression: \"selectedRequirements\"\n }\n ],\n staticClass: \"form-check-input\",\n attrs: { type: \"checkbox\" },\n domProps: {\n value: challenge.id,\n checked: Array.isArray(_vm.selectedRequirements)\n ? _vm._i(\n _vm.selectedRequirements,\n challenge.id\n ) > -1\n : _vm.selectedRequirements\n },\n on: {\n change: function($event) {\n var $$a = _vm.selectedRequirements,\n $$el = $event.target,\n $$c = $$el.checked ? true : false\n if (Array.isArray($$a)) {\n var $$v = challenge.id,\n $$i = _vm._i($$a, $$v)\n if ($$el.checked) {\n $$i < 0 &&\n (_vm.selectedRequirements = $$a.concat([\n $$v\n ]))\n } else {\n $$i > -1 &&\n (_vm.selectedRequirements = $$a\n .slice(0, $$i)\n .concat($$a.slice($$i + 1)))\n }\n } else {\n _vm.selectedRequirements = $$c\n }\n }\n }\n }),\n _vm._v(\n \"\\n \" +\n _vm._s(challenge.name) +\n \"\\n \"\n )\n ]\n )\n ]\n )\n })\n ],\n 2\n )\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"form-group\" }, [\n _vm._m(0),\n _vm._v(\" \"),\n _c(\n \"select\",\n {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.selectedAnonymize,\n expression: \"selectedAnonymize\"\n }\n ],\n staticClass: \"form-control custom-select\",\n attrs: { name: \"anonymize\" },\n on: {\n change: function($event) {\n var $$selectedVal = Array.prototype.filter\n .call($event.target.options, function(o) {\n return o.selected\n })\n .map(function(o) {\n var val = \"_value\" in o ? o._value : o.value\n return val\n })\n _vm.selectedAnonymize = $event.target.multiple\n ? $$selectedVal\n : $$selectedVal[0]\n }\n }\n },\n [\n _c(\"option\", { domProps: { value: false } }, [_vm._v(\"Hidden\")]),\n _vm._v(\" \"),\n _c(\"option\", { domProps: { value: true } }, [\n _vm._v(\"Anonymized\")\n ])\n ]\n )\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"form-group\" }, [\n _c(\n \"button\",\n {\n staticClass: \"btn btn-success float-right\",\n attrs: { disabled: !_vm.newRequirements }\n },\n [_vm._v(\"\\n Save\\n \")]\n )\n ])\n ]\n )\n ])\n}\nvar staticRenderFns = [\n function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"label\", [_c(\"b\", [_vm._v(\"Behavior if not unlocked\")])])\n }\n]\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./CTFd/themes/admin/assets/js/components/requirements/Requirements.vue?./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options");
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function () {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"div\", [\n _c(\n \"form\",\n {\n on: {\n submit: function ($event) {\n $event.preventDefault()\n return _vm.updateRequirements.apply(null, arguments)\n },\n },\n },\n [\n _c(\n \"div\",\n { staticClass: \"form-group scrollbox\" },\n [\n _c(\n \"transition-group\",\n { attrs: { name: \"flip-list\" } },\n [\n _vm._l(_vm.requiredChallenges, function (challenge) {\n return _c(\n \"div\",\n { key: challenge.id, staticClass: \"form-check\" },\n [\n _c(\n \"label\",\n { staticClass: \"form-check-label cursor-pointer\" },\n [\n _c(\"input\", {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.selectedRequirements,\n expression: \"selectedRequirements\",\n },\n ],\n staticClass: \"form-check-input\",\n attrs: { type: \"checkbox\" },\n domProps: {\n value: challenge.id,\n checked: Array.isArray(_vm.selectedRequirements)\n ? _vm._i(\n _vm.selectedRequirements,\n challenge.id\n ) > -1\n : _vm.selectedRequirements,\n },\n on: {\n change: function ($event) {\n var $$a = _vm.selectedRequirements,\n $$el = $event.target,\n $$c = $$el.checked ? true : false\n if (Array.isArray($$a)) {\n var $$v = challenge.id,\n $$i = _vm._i($$a, $$v)\n if ($$el.checked) {\n $$i < 0 &&\n (_vm.selectedRequirements = $$a.concat([\n $$v,\n ]))\n } else {\n $$i > -1 &&\n (_vm.selectedRequirements = $$a\n .slice(0, $$i)\n .concat($$a.slice($$i + 1)))\n }\n } else {\n _vm.selectedRequirements = $$c\n }\n },\n },\n }),\n _vm._v(\n \"\\n \" +\n _vm._s(challenge.name) +\n \"\\n \"\n ),\n ]\n ),\n ]\n )\n }),\n _vm._v(\" \"),\n _vm._l(_vm.otherChallenges, function (challenge) {\n return _c(\n \"div\",\n { key: challenge.id, staticClass: \"form-check\" },\n [\n _c(\n \"label\",\n { staticClass: \"form-check-label cursor-pointer\" },\n [\n _c(\"input\", {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.selectedRequirements,\n expression: \"selectedRequirements\",\n },\n ],\n staticClass: \"form-check-input\",\n attrs: { type: \"checkbox\" },\n domProps: {\n value: challenge.id,\n checked: Array.isArray(_vm.selectedRequirements)\n ? _vm._i(\n _vm.selectedRequirements,\n challenge.id\n ) > -1\n : _vm.selectedRequirements,\n },\n on: {\n change: function ($event) {\n var $$a = _vm.selectedRequirements,\n $$el = $event.target,\n $$c = $$el.checked ? true : false\n if (Array.isArray($$a)) {\n var $$v = challenge.id,\n $$i = _vm._i($$a, $$v)\n if ($$el.checked) {\n $$i < 0 &&\n (_vm.selectedRequirements = $$a.concat([\n $$v,\n ]))\n } else {\n $$i > -1 &&\n (_vm.selectedRequirements = $$a\n .slice(0, $$i)\n .concat($$a.slice($$i + 1)))\n }\n } else {\n _vm.selectedRequirements = $$c\n }\n },\n },\n }),\n _vm._v(\n \"\\n \" +\n _vm._s(challenge.name) +\n \"\\n \"\n ),\n ]\n ),\n ]\n )\n }),\n ],\n 2\n ),\n ],\n 1\n ),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"form-group\" }, [\n _vm._m(0),\n _vm._v(\" \"),\n _c(\n \"select\",\n {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.selectedAnonymize,\n expression: \"selectedAnonymize\",\n },\n ],\n staticClass: \"form-control custom-select\",\n attrs: { name: \"anonymize\" },\n on: {\n change: function ($event) {\n var $$selectedVal = Array.prototype.filter\n .call($event.target.options, function (o) {\n return o.selected\n })\n .map(function (o) {\n var val = \"_value\" in o ? o._value : o.value\n return val\n })\n _vm.selectedAnonymize = $event.target.multiple\n ? $$selectedVal\n : $$selectedVal[0]\n },\n },\n },\n [\n _c(\"option\", { domProps: { value: false } }, [_vm._v(\"Hidden\")]),\n _vm._v(\" \"),\n _c(\"option\", { domProps: { value: true } }, [\n _vm._v(\"Anonymized\"),\n ]),\n ]\n ),\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"form-group\" }, [\n _c(\n \"button\",\n {\n staticClass: \"btn btn-success float-right\",\n attrs: { disabled: !_vm.newRequirements },\n },\n [_vm._v(\"\\n Save\\n \")]\n ),\n ]),\n ]\n ),\n ])\n}\nvar staticRenderFns = [\n function () {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"label\", [_c(\"b\", [_vm._v(\"Behavior if not unlocked\")])])\n },\n]\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./CTFd/themes/admin/assets/js/components/requirements/Requirements.vue?./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options");
/***/ }),
@@ -978,7 +978,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) *
/***/ (function(module, __webpack_exports__, __webpack_require__) {
;
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"div\", { staticClass: \"col-md-12\" }, [\n _c(\n \"div\",\n { staticClass: \"my-3\", attrs: { id: \"challenge-tags\" } },\n _vm._l(_vm.tags, function(tag) {\n return _c(\n \"span\",\n {\n key: tag.id,\n staticClass: \"badge badge-primary mx-1 challenge-tag\"\n },\n [\n _c(\"span\", [_vm._v(_vm._s(tag.value))]),\n _vm._v(\" \"),\n _c(\n \"a\",\n {\n staticClass: \"btn-fa delete-tag\",\n on: {\n click: function($event) {\n return _vm.deleteTag(tag.id)\n }\n }\n },\n [_vm._v(\" ×\")]\n )\n ]\n )\n }),\n 0\n ),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"form-group\" }, [\n _vm._m(0),\n _vm._v(\" \"),\n _c(\"input\", {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model.lazy\",\n value: _vm.tagValue,\n expression: \"tagValue\",\n modifiers: { lazy: true }\n }\n ],\n staticClass: \"form-control\",\n attrs: { id: \"tags-add-input\", maxlength: \"80\", type: \"text\" },\n domProps: { value: _vm.tagValue },\n on: {\n keyup: function($event) {\n if (\n !$event.type.indexOf(\"key\") &&\n _vm._k($event.keyCode, \"enter\", 13, $event.key, \"Enter\")\n ) {\n return null\n }\n return _vm.addTag()\n },\n change: function($event) {\n _vm.tagValue = $event.target.value\n }\n }\n })\n ])\n ])\n}\nvar staticRenderFns = [\n function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"label\", [\n _vm._v(\"Tag\\n \"),\n _c(\"br\"),\n _vm._v(\" \"),\n _c(\"small\", { staticClass: \"text-muted\" }, [\n _vm._v(\"Type tag and press Enter\")\n ])\n ])\n }\n]\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./CTFd/themes/admin/assets/js/components/tags/TagsList.vue?./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options");
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function () {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"div\", { staticClass: \"col-md-12\" }, [\n _c(\n \"div\",\n { staticClass: \"my-3\", attrs: { id: \"challenge-tags\" } },\n _vm._l(_vm.tags, function (tag) {\n return _c(\n \"span\",\n {\n key: tag.id,\n staticClass: \"badge badge-primary mx-1 challenge-tag\",\n },\n [\n _c(\"span\", [_vm._v(_vm._s(tag.value))]),\n _vm._v(\" \"),\n _c(\n \"a\",\n {\n staticClass: \"btn-fa delete-tag\",\n on: {\n click: function ($event) {\n return _vm.deleteTag(tag.id)\n },\n },\n },\n [_vm._v(\" ×\")]\n ),\n ]\n )\n }),\n 0\n ),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"form-group\" }, [\n _vm._m(0),\n _vm._v(\" \"),\n _c(\"input\", {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model.lazy\",\n value: _vm.tagValue,\n expression: \"tagValue\",\n modifiers: { lazy: true },\n },\n ],\n staticClass: \"form-control\",\n attrs: { id: \"tags-add-input\", maxlength: \"80\", type: \"text\" },\n domProps: { value: _vm.tagValue },\n on: {\n keyup: function ($event) {\n if (\n !$event.type.indexOf(\"key\") &&\n _vm._k($event.keyCode, \"enter\", 13, $event.key, \"Enter\")\n ) {\n return null\n }\n return _vm.addTag()\n },\n change: function ($event) {\n _vm.tagValue = $event.target.value\n },\n },\n }),\n ]),\n ])\n}\nvar staticRenderFns = [\n function () {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"label\", [\n _vm._v(\"Tag\\n \"),\n _c(\"br\"),\n _vm._v(\" \"),\n _c(\"small\", { staticClass: \"text-muted\" }, [\n _vm._v(\"Type tag and press Enter\"),\n ]),\n ])\n },\n]\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./CTFd/themes/admin/assets/js/components/tags/TagsList.vue?./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options");
/***/ }),
@@ -990,7 +990,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) *
/***/ (function(module, __webpack_exports__, __webpack_require__) {
;
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"div\", [\n _c(\"div\", { staticClass: \"form-group\" }, [\n _c(\"label\", [_vm._v(\"Search Users\")]),\n _vm._v(\" \"),\n _c(\"input\", {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.searchedName,\n expression: \"searchedName\"\n }\n ],\n staticClass: \"form-control\",\n attrs: { type: \"text\", placeholder: \"Search for users\" },\n domProps: { value: _vm.searchedName },\n on: {\n keyup: [\n function($event) {\n if (\n !$event.type.indexOf(\"key\") &&\n _vm._k($event.keyCode, \"down\", 40, $event.key, [\n \"Down\",\n \"ArrowDown\"\n ])\n ) {\n return null\n }\n return _vm.moveCursor(\"down\")\n },\n function($event) {\n if (\n !$event.type.indexOf(\"key\") &&\n _vm._k($event.keyCode, \"up\", 38, $event.key, [\"Up\", \"ArrowUp\"])\n ) {\n return null\n }\n return _vm.moveCursor(\"up\")\n },\n function($event) {\n if (\n !$event.type.indexOf(\"key\") &&\n _vm._k($event.keyCode, \"enter\", 13, $event.key, \"Enter\")\n ) {\n return null\n }\n return _vm.selectUser()\n }\n ],\n input: function($event) {\n if ($event.target.composing) {\n return\n }\n _vm.searchedName = $event.target.value\n }\n }\n })\n ]),\n _vm._v(\" \"),\n _c(\n \"div\",\n { staticClass: \"form-group\" },\n _vm._l(_vm.selectedUsers, function(user) {\n return _c(\n \"span\",\n { key: user.id, staticClass: \"badge badge-primary mr-1\" },\n [\n _vm._v(\"\\n \" + _vm._s(user.name) + \"\\n \"),\n _c(\n \"a\",\n {\n staticClass: \"btn-fa\",\n on: {\n click: function($event) {\n return _vm.removeSelectedUser(user.id)\n }\n }\n },\n [_vm._v(\" ×\")]\n )\n ]\n )\n }),\n 0\n ),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"form-group\" }, [\n _vm.userResults.length == 0 &&\n this.searchedName != \"\" &&\n _vm.awaitingSearch == false\n ? _c(\"div\", { staticClass: \"text-center\" }, [\n _c(\"span\", { staticClass: \"text-muted\" }, [\n _vm._v(\"\\n No users found\\n \")\n ])\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _c(\n \"ul\",\n { staticClass: \"list-group\" },\n _vm._l(_vm.userResults, function(user, idx) {\n return _c(\n \"li\",\n {\n key: user.id,\n class: {\n \"list-group-item\": true,\n active: idx === _vm.selectedResultIdx\n },\n on: {\n click: function($event) {\n return _vm.selectUser(idx)\n }\n }\n },\n [\n _vm._v(\"\\n \" + _vm._s(user.name) + \"\\n \"),\n user.team_id\n ? _c(\n \"small\",\n {\n class: {\n \"float-right\": true,\n \"text-white\": idx === _vm.selectedResultIdx,\n \"text-muted\": idx !== _vm.selectedResultIdx\n }\n },\n [_vm._v(\"\\n already in a team\\n \")]\n )\n : _vm._e()\n ]\n )\n }),\n 0\n )\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"form-group\" }, [\n _c(\n \"button\",\n {\n staticClass: \"btn btn-success d-inline-block float-right\",\n on: {\n click: function($event) {\n return _vm.addUsers()\n }\n }\n },\n [_vm._v(\"\\n Add Users\\n \")]\n )\n ])\n ])\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./CTFd/themes/admin/assets/js/components/teams/UserAddForm.vue?./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options");
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function () {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"div\", [\n _c(\"div\", { staticClass: \"form-group\" }, [\n _c(\"label\", [_vm._v(\"Search Users\")]),\n _vm._v(\" \"),\n _c(\"input\", {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.searchedName,\n expression: \"searchedName\",\n },\n ],\n staticClass: \"form-control\",\n attrs: { type: \"text\", placeholder: \"Search for users\" },\n domProps: { value: _vm.searchedName },\n on: {\n keyup: [\n function ($event) {\n if (\n !$event.type.indexOf(\"key\") &&\n _vm._k($event.keyCode, \"down\", 40, $event.key, [\n \"Down\",\n \"ArrowDown\",\n ])\n ) {\n return null\n }\n return _vm.moveCursor(\"down\")\n },\n function ($event) {\n if (\n !$event.type.indexOf(\"key\") &&\n _vm._k($event.keyCode, \"up\", 38, $event.key, [\"Up\", \"ArrowUp\"])\n ) {\n return null\n }\n return _vm.moveCursor(\"up\")\n },\n function ($event) {\n if (\n !$event.type.indexOf(\"key\") &&\n _vm._k($event.keyCode, \"enter\", 13, $event.key, \"Enter\")\n ) {\n return null\n }\n return _vm.selectUser()\n },\n ],\n input: function ($event) {\n if ($event.target.composing) {\n return\n }\n _vm.searchedName = $event.target.value\n },\n },\n }),\n ]),\n _vm._v(\" \"),\n _c(\n \"div\",\n { staticClass: \"form-group\" },\n _vm._l(_vm.selectedUsers, function (user) {\n return _c(\n \"span\",\n { key: user.id, staticClass: \"badge badge-primary mr-1\" },\n [\n _vm._v(\"\\n \" + _vm._s(user.name) + \"\\n \"),\n _c(\n \"a\",\n {\n staticClass: \"btn-fa\",\n on: {\n click: function ($event) {\n return _vm.removeSelectedUser(user.id)\n },\n },\n },\n [_vm._v(\" ×\")]\n ),\n ]\n )\n }),\n 0\n ),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"form-group\" }, [\n _vm.userResults.length == 0 &&\n this.searchedName != \"\" &&\n _vm.awaitingSearch == false\n ? _c(\"div\", { staticClass: \"text-center\" }, [\n _c(\"span\", { staticClass: \"text-muted\" }, [\n _vm._v(\"\\n No users found\\n \"),\n ]),\n ])\n : _vm._e(),\n _vm._v(\" \"),\n _c(\n \"ul\",\n { staticClass: \"list-group\" },\n _vm._l(_vm.userResults, function (user, idx) {\n return _c(\n \"li\",\n {\n key: user.id,\n class: {\n \"list-group-item\": true,\n active: idx === _vm.selectedResultIdx,\n },\n on: {\n click: function ($event) {\n return _vm.selectUser(idx)\n },\n },\n },\n [\n _vm._v(\"\\n \" + _vm._s(user.name) + \"\\n \"),\n user.team_id\n ? _c(\n \"small\",\n {\n class: {\n \"float-right\": true,\n \"text-white\": idx === _vm.selectedResultIdx,\n \"text-muted\": idx !== _vm.selectedResultIdx,\n },\n },\n [_vm._v(\"\\n already in a team\\n \")]\n )\n : _vm._e(),\n ]\n )\n }),\n 0\n ),\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"form-group\" }, [\n _c(\n \"button\",\n {\n staticClass: \"btn btn-success d-inline-block float-right\",\n on: {\n click: function ($event) {\n return _vm.addUsers()\n },\n },\n },\n [_vm._v(\"\\n Add Users\\n \")]\n ),\n ]),\n ])\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./CTFd/themes/admin/assets/js/components/teams/UserAddForm.vue?./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options");
/***/ }),
@@ -1002,7 +1002,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) *
/***/ (function(module, __webpack_exports__, __webpack_require__) {
;
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"div\", { staticClass: \"col-md-12\" }, [\n _c(\n \"div\",\n { staticClass: \"my-3\", attrs: { id: \"challenge-topics\" } },\n _vm._l(_vm.topics, function(topic) {\n return _c(\"h5\", { key: topic.id, staticClass: \"challenge-tag\" }, [\n _c(\"span\", { staticClass: \"mr-1\" }, [_vm._v(_vm._s(topic.value))]),\n _vm._v(\" \"),\n _c(\n \"a\",\n {\n staticClass: \"btn-fa delete-tag\",\n on: {\n click: function($event) {\n return _vm.deleteTopic(topic.id)\n }\n }\n },\n [_vm._v(\" ×\")]\n )\n ])\n }),\n 0\n ),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"form-group\" }, [\n _vm._m(0),\n _vm._v(\" \"),\n _c(\"input\", {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.topicValue,\n expression: \"topicValue\"\n }\n ],\n staticClass: \"form-control\",\n attrs: { id: \"tags-add-input\", maxlength: \"255\", type: \"text\" },\n domProps: { value: _vm.topicValue },\n on: {\n keyup: [\n function($event) {\n if (\n !$event.type.indexOf(\"key\") &&\n _vm._k($event.keyCode, \"down\", 40, $event.key, [\n \"Down\",\n \"ArrowDown\"\n ])\n ) {\n return null\n }\n return _vm.moveCursor(\"down\")\n },\n function($event) {\n if (\n !$event.type.indexOf(\"key\") &&\n _vm._k($event.keyCode, \"up\", 38, $event.key, [\"Up\", \"ArrowUp\"])\n ) {\n return null\n }\n return _vm.moveCursor(\"up\")\n },\n function($event) {\n if (\n !$event.type.indexOf(\"key\") &&\n _vm._k($event.keyCode, \"enter\", 13, $event.key, \"Enter\")\n ) {\n return null\n }\n return _vm.addTopic()\n }\n ],\n input: function($event) {\n if ($event.target.composing) {\n return\n }\n _vm.topicValue = $event.target.value\n }\n }\n })\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"form-group\" }, [\n _c(\n \"ul\",\n { staticClass: \"list-group\" },\n _vm._l(_vm.topicResults, function(topic, idx) {\n return _c(\n \"li\",\n {\n key: topic.id,\n class: {\n \"list-group-item\": true,\n active: idx + 1 === _vm.selectedResultIdx\n },\n on: {\n click: function($event) {\n return _vm.selectTopic(idx)\n }\n }\n },\n [_vm._v(\"\\n \" + _vm._s(topic.value) + \"\\n \")]\n )\n }),\n 0\n )\n ])\n ])\n}\nvar staticRenderFns = [\n function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"label\", [\n _vm._v(\"\\n Topic\\n \"),\n _c(\"br\"),\n _vm._v(\" \"),\n _c(\"small\", { staticClass: \"text-muted\" }, [\n _vm._v(\"Type topic and press Enter\")\n ])\n ])\n }\n]\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./CTFd/themes/admin/assets/js/components/topics/TopicsList.vue?./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options");
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function () {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"div\", { staticClass: \"col-md-12\" }, [\n _c(\n \"div\",\n { staticClass: \"my-3\", attrs: { id: \"challenge-topics\" } },\n _vm._l(_vm.topics, function (topic) {\n return _c(\"h5\", { key: topic.id, staticClass: \"challenge-tag\" }, [\n _c(\"span\", { staticClass: \"mr-1\" }, [_vm._v(_vm._s(topic.value))]),\n _vm._v(\" \"),\n _c(\n \"a\",\n {\n staticClass: \"btn-fa delete-tag\",\n on: {\n click: function ($event) {\n return _vm.deleteTopic(topic.id)\n },\n },\n },\n [_vm._v(\" ×\")]\n ),\n ])\n }),\n 0\n ),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"form-group\" }, [\n _vm._m(0),\n _vm._v(\" \"),\n _c(\"input\", {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model\",\n value: _vm.topicValue,\n expression: \"topicValue\",\n },\n ],\n staticClass: \"form-control\",\n attrs: { id: \"tags-add-input\", maxlength: \"255\", type: \"text\" },\n domProps: { value: _vm.topicValue },\n on: {\n keyup: [\n function ($event) {\n if (\n !$event.type.indexOf(\"key\") &&\n _vm._k($event.keyCode, \"down\", 40, $event.key, [\n \"Down\",\n \"ArrowDown\",\n ])\n ) {\n return null\n }\n return _vm.moveCursor(\"down\")\n },\n function ($event) {\n if (\n !$event.type.indexOf(\"key\") &&\n _vm._k($event.keyCode, \"up\", 38, $event.key, [\"Up\", \"ArrowUp\"])\n ) {\n return null\n }\n return _vm.moveCursor(\"up\")\n },\n function ($event) {\n if (\n !$event.type.indexOf(\"key\") &&\n _vm._k($event.keyCode, \"enter\", 13, $event.key, \"Enter\")\n ) {\n return null\n }\n return _vm.addTopic()\n },\n ],\n input: function ($event) {\n if ($event.target.composing) {\n return\n }\n _vm.topicValue = $event.target.value\n },\n },\n }),\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"form-group\" }, [\n _c(\n \"ul\",\n { staticClass: \"list-group\" },\n _vm._l(_vm.topicResults, function (topic, idx) {\n return _c(\n \"li\",\n {\n key: topic.id,\n class: {\n \"list-group-item\": true,\n active: idx + 1 === _vm.selectedResultIdx,\n },\n on: {\n click: function ($event) {\n return _vm.selectTopic(idx)\n },\n },\n },\n [_vm._v(\"\\n \" + _vm._s(topic.value) + \"\\n \")]\n )\n }),\n 0\n ),\n ]),\n ])\n}\nvar staticRenderFns = [\n function () {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"label\", [\n _vm._v(\"\\n Topic\\n \"),\n _c(\"br\"),\n _vm._v(\" \"),\n _c(\"small\", { staticClass: \"text-muted\" }, [\n _vm._v(\"Type topic and press Enter\"),\n ]),\n ])\n },\n]\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./CTFd/themes/admin/assets/js/components/topics/TopicsList.vue?./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options");
/***/ }),
@@ -1013,7 +1013,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) *
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
-eval("// style-loader: Adds some css to the DOM by adding a in svg, where nodeName is 'style',\n// CSS classes is defined globally wherever the style tags are declared.\nif(nodeName==='defs'){// define flag\nthis._isDefine=true;}else if(nodeName==='text'){this._isText=true;}var el;if(this._isDefine){var parser=defineParsers[nodeName];if(parser){var def=parser.call(this,xmlNode);var id=xmlNode.getAttribute('id');if(id){this._defs[id]=def;}}}else{var parser=nodeParsers[nodeName];if(parser){el=parser.call(this,xmlNode,parentGroup);parentGroup.add(el);}}var child=xmlNode.firstChild;while(child){if(child.nodeType===1){this._parseNode(child,el);}// Is text\nif(child.nodeType===3&&this._isText){this._parseText(child,el);}child=child.nextSibling;}// Quit define\nif(nodeName==='defs'){this._isDefine=false;}else if(nodeName==='text'){this._isText=false;}};SVGParser.prototype._parseText=function(xmlNode,parentGroup){if(xmlNode.nodeType===1){var dx=xmlNode.getAttribute('dx')||0;var dy=xmlNode.getAttribute('dy')||0;this._textX+=parseFloat(dx);this._textY+=parseFloat(dy);}var text=new Text({style:{text:xmlNode.textContent,transformText:true},position:[this._textX||0,this._textY||0]});inheritStyle(parentGroup,text);parseAttributes(xmlNode,text,this._defs);var fontSize=text.style.fontSize;if(fontSize&&fontSize<9){// PENDING\ntext.style.fontSize=9;text.scale=text.scale||[1,1];text.scale[0]*=fontSize/9;text.scale[1]*=fontSize/9;}var rect=text.getBoundingRect();this._textX+=rect.width;parentGroup.add(text);return text;};var nodeParsers={'g':function g(xmlNode,parentGroup){var g=new Group();inheritStyle(parentGroup,g);parseAttributes(xmlNode,g,this._defs);return g;},'rect':function rect(xmlNode,parentGroup){var rect=new Rect();inheritStyle(parentGroup,rect);parseAttributes(xmlNode,rect,this._defs);rect.setShape({x:parseFloat(xmlNode.getAttribute('x')||0),y:parseFloat(xmlNode.getAttribute('y')||0),width:parseFloat(xmlNode.getAttribute('width')||0),height:parseFloat(xmlNode.getAttribute('height')||0)});// console.log(xmlNode.getAttribute('transform'));\n// console.log(rect.transform);\nreturn rect;},'circle':function circle(xmlNode,parentGroup){var circle=new Circle();inheritStyle(parentGroup,circle);parseAttributes(xmlNode,circle,this._defs);circle.setShape({cx:parseFloat(xmlNode.getAttribute('cx')||0),cy:parseFloat(xmlNode.getAttribute('cy')||0),r:parseFloat(xmlNode.getAttribute('r')||0)});return circle;},'line':function line(xmlNode,parentGroup){var line=new Line();inheritStyle(parentGroup,line);parseAttributes(xmlNode,line,this._defs);line.setShape({x1:parseFloat(xmlNode.getAttribute('x1')||0),y1:parseFloat(xmlNode.getAttribute('y1')||0),x2:parseFloat(xmlNode.getAttribute('x2')||0),y2:parseFloat(xmlNode.getAttribute('y2')||0)});return line;},'ellipse':function ellipse(xmlNode,parentGroup){var ellipse=new Ellipse();inheritStyle(parentGroup,ellipse);parseAttributes(xmlNode,ellipse,this._defs);ellipse.setShape({cx:parseFloat(xmlNode.getAttribute('cx')||0),cy:parseFloat(xmlNode.getAttribute('cy')||0),rx:parseFloat(xmlNode.getAttribute('rx')||0),ry:parseFloat(xmlNode.getAttribute('ry')||0)});return ellipse;},'polygon':function polygon(xmlNode,parentGroup){var points=xmlNode.getAttribute('points');if(points){points=parsePoints(points);}var polygon=new Polygon({shape:{points:points||[]}});inheritStyle(parentGroup,polygon);parseAttributes(xmlNode,polygon,this._defs);return polygon;},'polyline':function polyline(xmlNode,parentGroup){var path=new Path();inheritStyle(parentGroup,path);parseAttributes(xmlNode,path,this._defs);var points=xmlNode.getAttribute('points');if(points){points=parsePoints(points);}var polyline=new Polyline({shape:{points:points||[]}});return polyline;},'image':function image(xmlNode,parentGroup){var img=new ZImage();inheritStyle(parentGroup,img);parseAttributes(xmlNode,img,this._defs);img.setStyle({image:xmlNode.getAttribute('xlink:href'),x:xmlNode.getAttribute('x'),y:xmlNode.getAttribute('y'),width:xmlNode.getAttribute('width'),height:xmlNode.getAttribute('height')});return img;},'text':function text(xmlNode,parentGroup){var x=xmlNode.getAttribute('x')||0;var y=xmlNode.getAttribute('y')||0;var dx=xmlNode.getAttribute('dx')||0;var dy=xmlNode.getAttribute('dy')||0;this._textX=parseFloat(x)+parseFloat(dx);this._textY=parseFloat(y)+parseFloat(dy);var g=new Group();inheritStyle(parentGroup,g);parseAttributes(xmlNode,g,this._defs);return g;},'tspan':function tspan(xmlNode,parentGroup){var x=xmlNode.getAttribute('x');var y=xmlNode.getAttribute('y');if(x!=null){// new offset x\nthis._textX=parseFloat(x);}if(y!=null){// new offset y\nthis._textY=parseFloat(y);}var dx=xmlNode.getAttribute('dx')||0;var dy=xmlNode.getAttribute('dy')||0;var g=new Group();inheritStyle(parentGroup,g);parseAttributes(xmlNode,g,this._defs);this._textX+=dx;this._textY+=dy;return g;},'path':function path(xmlNode,parentGroup){// TODO svg fill rule\n// https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/fill-rule\n// path.style.globalCompositeOperation = 'xor';\nvar d=xmlNode.getAttribute('d')||'';// Performance sensitive.\nvar path=createFromString(d);inheritStyle(parentGroup,path);parseAttributes(xmlNode,path,this._defs);return path;}};var defineParsers={'lineargradient':function lineargradient(xmlNode){var x1=parseInt(xmlNode.getAttribute('x1')||0,10);var y1=parseInt(xmlNode.getAttribute('y1')||0,10);var x2=parseInt(xmlNode.getAttribute('x2')||10,10);var y2=parseInt(xmlNode.getAttribute('y2')||0,10);var gradient=new LinearGradient(x1,y1,x2,y2);_parseGradientColorStops(xmlNode,gradient);return gradient;},'radialgradient':function radialgradient(xmlNode){}};function _parseGradientColorStops(xmlNode,gradient){var stop=xmlNode.firstChild;while(stop){if(stop.nodeType===1){var offset=stop.getAttribute('offset');if(offset.indexOf('%')>0){// percentage\noffset=parseInt(offset,10)/100;}else if(offset){// number from 0 to 1\noffset=parseFloat(offset);}else{offset=0;}var stopColor=stop.getAttribute('stop-color')||'#000000';gradient.addColorStop(offset,stopColor);}stop=stop.nextSibling;}}function inheritStyle(parent,child){if(parent&&parent.__inheritedStyle){if(!child.__inheritedStyle){child.__inheritedStyle={};}defaults(child.__inheritedStyle,parent.__inheritedStyle);}}function parsePoints(pointsString){var list=trim(pointsString).split(DILIMITER_REG);var points=[];for(var i=0;i0;i-=2){var value=transformOps[i];var type=transformOps[i-1];m=m||create$1();switch(type){case'translate':value=trim(value).split(DILIMITER_REG);translate(m,m,[parseFloat(value[0]),parseFloat(value[1]||0)]);break;case'scale':value=trim(value).split(DILIMITER_REG);scale$1(m,m,[parseFloat(value[0]),parseFloat(value[1]||value[0])]);break;case'rotate':value=trim(value).split(DILIMITER_REG);rotate(m,m,parseFloat(value[0]));break;case'skew':value=trim(value).split(DILIMITER_REG);console.warn('Skew transform is not supported yet');break;case'matrix':var value=trim(value).split(DILIMITER_REG);m[0]=parseFloat(value[0]);m[1]=parseFloat(value[1]);m[2]=parseFloat(value[2]);m[3]=parseFloat(value[3]);m[4]=parseFloat(value[4]);m[5]=parseFloat(value[5]);break;}}node.setLocalTransform(m);}}// Value may contain space.\nvar styleRegex=/([^\\s:;]+)\\s*:\\s*([^:;]+)/g;function parseStyleAttribute(xmlNode){var style=xmlNode.getAttribute('style');var result={};if(!style){return result;}var styleList={};styleRegex.lastIndex=0;var styleRegResult;while((styleRegResult=styleRegex.exec(style))!=null){styleList[styleRegResult[1]]=styleRegResult[2];}for(var svgAttrName in attributesMap){if(attributesMap.hasOwnProperty(svgAttrName)&&styleList[svgAttrName]!=null){result[attributesMap[svgAttrName]]=styleList[svgAttrName];}}return result;}/**\n * @param {Array.} viewBoxRect\n * @param {number} width\n * @param {number} height\n * @return {Object} {scale, position}\n */function makeViewBoxTransform(viewBoxRect,width,height){var scaleX=width/viewBoxRect.width;var scaleY=height/viewBoxRect.height;var scale=Math.min(scaleX,scaleY);// preserveAspectRatio 'xMidYMid'\nvar viewBoxScale=[scale,scale];var viewBoxPosition=[-(viewBoxRect.x+viewBoxRect.width/2)*scale+width/2,-(viewBoxRect.y+viewBoxRect.height/2)*scale+height/2];return{scale:viewBoxScale,position:viewBoxPosition};}/**\n * @param {string|XMLElement} xml\n * @param {Object} [opt]\n * @param {number} [opt.width] Default width if svg width not specified or is a percent value.\n * @param {number} [opt.height] Default height if svg height not specified or is a percent value.\n * @param {boolean} [opt.ignoreViewBox]\n * @param {boolean} [opt.ignoreRootClip]\n * @return {Object} result:\n * {\n * root: Group, The root of the the result tree of zrender shapes,\n * width: number, the viewport width of the SVG,\n * height: number, the viewport height of the SVG,\n * viewBoxRect: {x, y, width, height}, the declared viewBox rect of the SVG, if exists,\n * viewBoxTransform: the {scale, position} calculated by viewBox and viewport, is exists.\n * }\n */ /*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements. See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership. The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License. You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied. See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/var storage=createHashMap();// For minimize the code size of common echarts package,\n// do not put too much logic in this module.\nvar mapDataStorage={// The format of record: see `echarts.registerMap`.\n// Compatible with previous `echarts.registerMap`.\nregisterMap:function registerMap(mapName,rawGeoJson,rawSpecialAreas){var records;if(isArray(rawGeoJson)){records=rawGeoJson;}else if(rawGeoJson.svg){records=[{type:'svg',source:rawGeoJson.svg,specialAreas:rawGeoJson.specialAreas}];}else{// Backward compatibility.\nif(rawGeoJson.geoJson&&!rawGeoJson.features){rawSpecialAreas=rawGeoJson.specialAreas;rawGeoJson=rawGeoJson.geoJson;}records=[{type:'geoJSON',source:rawGeoJson,specialAreas:rawSpecialAreas}];}each$1(records,function(record){var type=record.type;type==='geoJson'&&(type=record.type='geoJSON');var parse=parsers[type];if(__DEV__){assert$1(parse,'Illegal map type: '+type);}parse(record);});return storage.set(mapName,records);},retrieveMap:function retrieveMap(mapName){return storage.get(mapName);}};var parsers={geoJSON:function geoJSON(record){var source=record.source;record.geoJSON=!isString(source)?source:typeof JSON!=='undefined'&&JSON.parse?JSON.parse(source):new Function('return ('+source+');')();},// Only perform parse to XML object here, which might be time\n// consiming for large SVG.\n// Although convert XML to zrender element is also time consiming,\n// if we do it here, the clone of zrender elements has to be\n// required. So we do it once for each geo instance, util real\n// performance issues call for optimizing it.\nsvg:function svg(record){record.svgXML=parseXML(record.source);}};/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements. See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership. The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License. You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied. See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/var assert=assert$1;var each=each$1;var isFunction=isFunction$1;var isObject=isObject$1;var parseClassType=ComponentModel.parseClassType;var version='4.9.0';var dependencies={zrender:'4.3.2'};var TEST_FRAME_REMAIN_TIME=1;var PRIORITY_PROCESSOR_FILTER=1000;var PRIORITY_PROCESSOR_SERIES_FILTER=800;var PRIORITY_PROCESSOR_DATASTACK=900;var PRIORITY_PROCESSOR_STATISTIC=5000;var PRIORITY_VISUAL_LAYOUT=1000;var PRIORITY_VISUAL_PROGRESSIVE_LAYOUT=1100;var PRIORITY_VISUAL_GLOBAL=2000;var PRIORITY_VISUAL_CHART=3000;var PRIORITY_VISUAL_POST_CHART_LAYOUT=3500;var PRIORITY_VISUAL_COMPONENT=4000;// FIXME\n// necessary?\nvar PRIORITY_VISUAL_BRUSH=5000;var PRIORITY={PROCESSOR:{FILTER:PRIORITY_PROCESSOR_FILTER,SERIES_FILTER:PRIORITY_PROCESSOR_SERIES_FILTER,STATISTIC:PRIORITY_PROCESSOR_STATISTIC},VISUAL:{LAYOUT:PRIORITY_VISUAL_LAYOUT,PROGRESSIVE_LAYOUT:PRIORITY_VISUAL_PROGRESSIVE_LAYOUT,GLOBAL:PRIORITY_VISUAL_GLOBAL,CHART:PRIORITY_VISUAL_CHART,POST_CHART_LAYOUT:PRIORITY_VISUAL_POST_CHART_LAYOUT,COMPONENT:PRIORITY_VISUAL_COMPONENT,BRUSH:PRIORITY_VISUAL_BRUSH}};// Main process have three entries: `setOption`, `dispatchAction` and `resize`,\n// where they must not be invoked nestedly, except the only case: invoke\n// dispatchAction with updateMethod \"none\" in main process.\n// This flag is used to carry out this rule.\n// All events will be triggered out side main process (i.e. when !this[IN_MAIN_PROCESS]).\nvar IN_MAIN_PROCESS='__flagInMainProcess';var OPTION_UPDATED='__optionUpdated';var ACTION_REG=/^[a-zA-Z0-9_]+$/;function createRegisterEventWithLowercaseName(method,ignoreDisposed){return function(eventName,handler,context){if(!ignoreDisposed&&this._disposed){disposedWarning(this.id);return;}// Event name is all lowercase\neventName=eventName&&eventName.toLowerCase();Eventful.prototype[method].call(this,eventName,handler,context);};}/**\n * @module echarts~MessageCenter\n */function MessageCenter(){Eventful.call(this);}MessageCenter.prototype.on=createRegisterEventWithLowercaseName('on',true);MessageCenter.prototype.off=createRegisterEventWithLowercaseName('off',true);MessageCenter.prototype.one=createRegisterEventWithLowercaseName('one',true);mixin(MessageCenter,Eventful);/**\n * @module echarts~ECharts\n */function ECharts(dom,theme$$1,opts){opts=opts||{};// Get theme by name\nif(typeof theme$$1==='string'){theme$$1=themeStorage[theme$$1];}/**\n * @type {string}\n */this.id;/**\n * Group id\n * @type {string}\n */this.group;/**\n * @type {HTMLElement}\n * @private\n */this._dom=dom;var defaultRenderer='canvas';if(__DEV__){defaultRenderer=(typeof window==='undefined'?global:window).__ECHARTS__DEFAULT__RENDERER__||defaultRenderer;}/**\n * @type {module:zrender/ZRender}\n * @private\n */var zr=this._zr=init$1(dom,{renderer:opts.renderer||defaultRenderer,devicePixelRatio:opts.devicePixelRatio,width:opts.width,height:opts.height});/**\n * Expect 60 fps.\n * @type {Function}\n * @private\n */this._throttledZrFlush=throttle(bind(zr.flush,zr),17);var theme$$1=_clone(theme$$1);theme$$1&&backwardCompat(theme$$1,true);/**\n * @type {Object}\n * @private\n */this._theme=theme$$1;/**\n * @type {Array.}\n * @private\n */this._chartsViews=[];/**\n * @type {Object.}\n * @private\n */this._chartsMap={};/**\n * @type {Array.}\n * @private\n */this._componentsViews=[];/**\n * @type {Object.}\n * @private\n */this._componentsMap={};/**\n * @type {module:echarts/CoordinateSystem}\n * @private\n */this._coordSysMgr=new CoordinateSystemManager();/**\n * @type {module:echarts/ExtensionAPI}\n * @private\n */var api=this._api=createExtensionAPI(this);// Sort on demand\nfunction prioritySortFunc(a,b){return a.__prio-b.__prio;}sort(visualFuncs,prioritySortFunc);sort(dataProcessorFuncs,prioritySortFunc);/**\n * @type {module:echarts/stream/Scheduler}\n */this._scheduler=new Scheduler(this,api,dataProcessorFuncs,visualFuncs);Eventful.call(this,this._ecEventProcessor=new EventProcessor());/**\n * @type {module:echarts~MessageCenter}\n * @private\n */this._messageCenter=new MessageCenter();// Init mouse events\nthis._initEvents();// In case some people write `window.onresize = chart.resize`\nthis.resize=bind(this.resize,this);// Can't dispatch action during rendering procedure\nthis._pendingActions=[];zr.animation.on('frame',this._onframe,this);bindRenderedEvent(zr,this);// ECharts instance can be used as value.\nsetAsPrimitive(this);}var echartsProto=ECharts.prototype;echartsProto._onframe=function(){if(this._disposed){return;}var scheduler=this._scheduler;// Lazy update\nif(this[OPTION_UPDATED]){var silent=this[OPTION_UPDATED].silent;this[IN_MAIN_PROCESS]=true;prepare(this);updateMethods.update.call(this);this[IN_MAIN_PROCESS]=false;this[OPTION_UPDATED]=false;flushPendingActions.call(this,silent);triggerUpdatedEvent.call(this,silent);}// Avoid do both lazy update and progress in one frame.\nelse if(scheduler.unfinished){// Stream progress.\nvar remainTime=TEST_FRAME_REMAIN_TIME;var ecModel=this._model;var api=this._api;scheduler.unfinished=false;do{var startTime=+new Date();scheduler.performSeriesTasks(ecModel);// Currently dataProcessorFuncs do not check threshold.\nscheduler.performDataProcessorTasks(ecModel);updateStreamModes(this,ecModel);// Do not update coordinate system here. Because that coord system update in\n// each frame is not a good user experience. So we follow the rule that\n// the extent of the coordinate system is determin in the first frame (the\n// frame is executed immedietely after task reset.\n// this._coordSysMgr.update(ecModel, api);\n// console.log('--- ec frame visual ---', remainTime);\nscheduler.performVisualTasks(ecModel);renderSeries(this,this._model,api,'remain');remainTime-=+new Date()-startTime;}while(remainTime>0&&scheduler.unfinished);// Call flush explicitly for trigger finished event.\nif(!scheduler.unfinished){this._zr.flush();}// Else, zr flushing be ensue within the same frame,\n// because zr flushing is after onframe event.\n}};/**\n * @return {HTMLElement}\n */echartsProto.getDom=function(){return this._dom;};/**\n * @return {module:zrender~ZRender}\n */echartsProto.getZr=function(){return this._zr;};/**\n * Usage:\n * chart.setOption(option, notMerge, lazyUpdate);\n * chart.setOption(option, {\n * notMerge: ...,\n * lazyUpdate: ...,\n * silent: ...\n * });\n *\n * @param {Object} option\n * @param {Object|boolean} [opts] opts or notMerge.\n * @param {boolean} [opts.notMerge=false]\n * @param {boolean} [opts.lazyUpdate=false] Useful when setOption frequently.\n */echartsProto.setOption=function(option,notMerge,lazyUpdate){if(__DEV__){assert(!this[IN_MAIN_PROCESS],'`setOption` should not be called during main process.');}if(this._disposed){disposedWarning(this.id);return;}var silent;if(isObject(notMerge)){lazyUpdate=notMerge.lazyUpdate;silent=notMerge.silent;notMerge=notMerge.notMerge;}this[IN_MAIN_PROCESS]=true;if(!this._model||notMerge){var optionManager=new OptionManager(this._api);var theme$$1=this._theme;var ecModel=this._model=new GlobalModel();ecModel.scheduler=this._scheduler;ecModel.init(null,null,theme$$1,optionManager);}this._model.setOption(option,optionPreprocessorFuncs);if(lazyUpdate){this[OPTION_UPDATED]={silent:silent};this[IN_MAIN_PROCESS]=false;}else{prepare(this);updateMethods.update.call(this);// Ensure zr refresh sychronously, and then pixel in canvas can be\n// fetched after `setOption`.\nthis._zr.flush();this[OPTION_UPDATED]=false;this[IN_MAIN_PROCESS]=false;flushPendingActions.call(this,silent);triggerUpdatedEvent.call(this,silent);}};/**\n * @DEPRECATED\n */echartsProto.setTheme=function(){console.error('ECharts#setTheme() is DEPRECATED in ECharts 3.0');};/**\n * @return {module:echarts/model/Global}\n */echartsProto.getModel=function(){return this._model;};/**\n * @return {Object}\n */echartsProto.getOption=function(){return this._model&&this._model.getOption();};/**\n * @return {number}\n */echartsProto.getWidth=function(){return this._zr.getWidth();};/**\n * @return {number}\n */echartsProto.getHeight=function(){return this._zr.getHeight();};/**\n * @return {number}\n */echartsProto.getDevicePixelRatio=function(){return this._zr.painter.dpr||window.devicePixelRatio||1;};/**\n * Get canvas which has all thing rendered\n * @param {Object} opts\n * @param {string} [opts.backgroundColor]\n * @return {string}\n */echartsProto.getRenderedCanvas=function(opts){if(!env$1.canvasSupported){return;}opts=opts||{};opts.pixelRatio=opts.pixelRatio||1;opts.backgroundColor=opts.backgroundColor||this._model.get('backgroundColor');var zr=this._zr;// var list = zr.storage.getDisplayList();\n// Stop animations\n// Never works before in init animation, so remove it.\n// zrUtil.each(list, function (el) {\n// el.stopAnimation(true);\n// });\nreturn zr.painter.getRenderedCanvas(opts);};/**\n * Get svg data url\n * @return {string}\n */echartsProto.getSvgDataURL=function(){if(!env$1.svgSupported){return;}var zr=this._zr;var list=zr.storage.getDisplayList();// Stop animations\neach$1(list,function(el){el.stopAnimation(true);});return zr.painter.toDataURL();};/**\n * @return {string}\n * @param {Object} opts\n * @param {string} [opts.type='png']\n * @param {string} [opts.pixelRatio=1]\n * @param {string} [opts.backgroundColor]\n * @param {string} [opts.excludeComponents]\n */echartsProto.getDataURL=function(opts){if(this._disposed){disposedWarning(this.id);return;}opts=opts||{};var excludeComponents=opts.excludeComponents;var ecModel=this._model;var excludesComponentViews=[];var self=this;each(excludeComponents,function(componentType){ecModel.eachComponent({mainType:componentType},function(component){var view=self._componentsMap[component.__viewId];if(!view.group.ignore){excludesComponentViews.push(view);view.group.ignore=true;}});});var url=this._zr.painter.getType()==='svg'?this.getSvgDataURL():this.getRenderedCanvas(opts).toDataURL('image/'+(opts&&opts.type||'png'));each(excludesComponentViews,function(view){view.group.ignore=false;});return url;};/**\n * @return {string}\n * @param {Object} opts\n * @param {string} [opts.type='png']\n * @param {string} [opts.pixelRatio=1]\n * @param {string} [opts.backgroundColor]\n */echartsProto.getConnectedDataURL=function(opts){if(this._disposed){disposedWarning(this.id);return;}if(!env$1.canvasSupported){return;}var isSvg=opts.type==='svg';var groupId=this.group;var mathMin=Math.min;var mathMax=Math.max;var MAX_NUMBER=Infinity;if(connectedGroups[groupId]){var left=MAX_NUMBER;var top=MAX_NUMBER;var right=-MAX_NUMBER;var bottom=-MAX_NUMBER;var canvasList=[];var dpr=opts&&opts.pixelRatio||1;each$1(instances,function(chart,id){if(chart.group===groupId){var canvas=isSvg?chart.getZr().painter.getSvgDom().innerHTML:chart.getRenderedCanvas(_clone(opts));var boundingRect=chart.getDom().getBoundingClientRect();left=mathMin(boundingRect.left,left);top=mathMin(boundingRect.top,top);right=mathMax(boundingRect.right,right);bottom=mathMax(boundingRect.bottom,bottom);canvasList.push({dom:canvas,left:boundingRect.left,top:boundingRect.top});}});left*=dpr;top*=dpr;right*=dpr;bottom*=dpr;var width=right-left;var height=bottom-top;var targetCanvas=createCanvas();var zr=init$1(targetCanvas,{renderer:isSvg?'svg':'canvas'});zr.resize({width:width,height:height});if(isSvg){var content='';each(canvasList,function(item){var x=item.left-left;var y=item.top-top;content+=''+item.dom+'';});zr.painter.getSvgRoot().innerHTML=content;if(opts.connectedBackgroundColor){zr.painter.setBackgroundColor(opts.connectedBackgroundColor);}zr.refreshImmediately();return zr.painter.toDataURL();}else{// Background between the charts\nif(opts.connectedBackgroundColor){zr.add(new Rect({shape:{x:0,y:0,width:width,height:height},style:{fill:opts.connectedBackgroundColor}}));}each(canvasList,function(item){var img=new ZImage({style:{x:item.left*dpr-left,y:item.top*dpr-top,image:item.dom}});zr.add(img);});zr.refreshImmediately();return targetCanvas.toDataURL('image/'+(opts&&opts.type||'png'));}}else{return this.getDataURL(opts);}};/**\n * Convert from logical coordinate system to pixel coordinate system.\n * See CoordinateSystem#convertToPixel.\n * @param {string|Object} finder\n * If string, e.g., 'geo', means {geoIndex: 0}.\n * If Object, could contain some of these properties below:\n * {\n * seriesIndex / seriesId / seriesName,\n * geoIndex / geoId, geoName,\n * bmapIndex / bmapId / bmapName,\n * xAxisIndex / xAxisId / xAxisName,\n * yAxisIndex / yAxisId / yAxisName,\n * gridIndex / gridId / gridName,\n * ... (can be extended)\n * }\n * @param {Array|number} value\n * @return {Array|number} result\n */echartsProto.convertToPixel=curry(doConvertPixel,'convertToPixel');/**\n * Convert from pixel coordinate system to logical coordinate system.\n * See CoordinateSystem#convertFromPixel.\n * @param {string|Object} finder\n * If string, e.g., 'geo', means {geoIndex: 0}.\n * If Object, could contain some of these properties below:\n * {\n * seriesIndex / seriesId / seriesName,\n * geoIndex / geoId / geoName,\n * bmapIndex / bmapId / bmapName,\n * xAxisIndex / xAxisId / xAxisName,\n * yAxisIndex / yAxisId / yAxisName\n * gridIndex / gridId / gridName,\n * ... (can be extended)\n * }\n * @param {Array|number} value\n * @return {Array|number} result\n */echartsProto.convertFromPixel=curry(doConvertPixel,'convertFromPixel');function doConvertPixel(methodName,finder,value){if(this._disposed){disposedWarning(this.id);return;}var ecModel=this._model;var coordSysList=this._coordSysMgr.getCoordinateSystems();var result;finder=parseFinder(ecModel,finder);for(var i=0;i=0&&each$1(models,function(model){var coordSys=model.coordinateSystem;if(coordSys&&coordSys.containPoint){result|=!!coordSys.containPoint(value);}else if(key==='seriesModels'){var view=this._chartsMap[model.__viewId];if(view&&view.containPoint){result|=view.containPoint(value,model);}else{if(__DEV__){console.warn(key+': '+(view?'The found component do not support containPoint.':'No view mapping to the found component.'));}}}else{if(__DEV__){console.warn(key+': containPoint is not supported');}}},this);},this);return!!result;};/**\n * Get visual from series or data.\n * @param {string|Object} finder\n * If string, e.g., 'series', means {seriesIndex: 0}.\n * If Object, could contain some of these properties below:\n * {\n * seriesIndex / seriesId / seriesName,\n * dataIndex / dataIndexInside\n * }\n * If dataIndex is not specified, series visual will be fetched,\n * but not data item visual.\n * If all of seriesIndex, seriesId, seriesName are not specified,\n * visual will be fetched from first series.\n * @param {string} visualType 'color', 'symbol', 'symbolSize'\n */echartsProto.getVisual=function(finder,visualType){var ecModel=this._model;finder=parseFinder(ecModel,finder,{defaultMainType:'series'});var seriesModel=finder.seriesModel;if(__DEV__){if(!seriesModel){console.warn('There is no specified seires model');}}var data=seriesModel.getData();var dataIndexInside=finder.hasOwnProperty('dataIndexInside')?finder.dataIndexInside:finder.hasOwnProperty('dataIndex')?data.indexOfRawIndex(finder.dataIndex):null;return dataIndexInside!=null?data.getItemVisual(dataIndexInside,visualType):data.getVisual(visualType);};/**\n * Get view of corresponding component model\n * @param {module:echarts/model/Component} componentModel\n * @return {module:echarts/view/Component}\n */echartsProto.getViewOfComponentModel=function(componentModel){return this._componentsMap[componentModel.__viewId];};/**\n * Get view of corresponding series model\n * @param {module:echarts/model/Series} seriesModel\n * @return {module:echarts/view/Chart}\n */echartsProto.getViewOfSeriesModel=function(seriesModel){return this._chartsMap[seriesModel.__viewId];};var updateMethods={prepareAndUpdate:function prepareAndUpdate(payload){prepare(this);updateMethods.update.call(this,payload);},/**\n * @param {Object} payload\n * @private\n */update:function update(payload){// console.profile && console.profile('update');\nvar ecModel=this._model;var api=this._api;var zr=this._zr;var coordSysMgr=this._coordSysMgr;var scheduler=this._scheduler;// update before setOption\nif(!ecModel){return;}scheduler.restoreData(ecModel,payload);scheduler.performSeriesTasks(ecModel);// TODO\n// Save total ecModel here for undo/redo (after restoring data and before processing data).\n// Undo (restoration of total ecModel) can be carried out in 'action' or outside API call.\n// Create new coordinate system each update\n// In LineView may save the old coordinate system and use it to get the orignal point\ncoordSysMgr.create(ecModel,api);scheduler.performDataProcessorTasks(ecModel,payload);// Current stream render is not supported in data process. So we can update\n// stream modes after data processing, where the filtered data is used to\n// deteming whether use progressive rendering.\nupdateStreamModes(this,ecModel);// We update stream modes before coordinate system updated, then the modes info\n// can be fetched when coord sys updating (consider the barGrid extent fix). But\n// the drawback is the full coord info can not be fetched. Fortunately this full\n// coord is not requied in stream mode updater currently.\ncoordSysMgr.update(ecModel,api);clearColorPalette(ecModel);scheduler.performVisualTasks(ecModel,payload);render(this,ecModel,api,payload);// Set background\nvar backgroundColor=ecModel.get('backgroundColor')||'transparent';// In IE8\nif(!env$1.canvasSupported){var colorArr=parse(backgroundColor);backgroundColor=stringify(colorArr,'rgb');if(colorArr[3]===0){backgroundColor='transparent';}}else{zr.setBackgroundColor(backgroundColor);}performPostUpdateFuncs(ecModel,api);// console.profile && console.profileEnd('update');\n},/**\n * @param {Object} payload\n * @private\n */updateTransform:function updateTransform(payload){var ecModel=this._model;var ecIns=this;var api=this._api;// update before setOption\nif(!ecModel){return;}// ChartView.markUpdateMethod(payload, 'updateTransform');\nvar componentDirtyList=[];ecModel.eachComponent(function(componentType,componentModel){var componentView=ecIns.getViewOfComponentModel(componentModel);if(componentView&&componentView.__alive){if(componentView.updateTransform){var result=componentView.updateTransform(componentModel,ecModel,api,payload);result&&result.update&&componentDirtyList.push(componentView);}else{componentDirtyList.push(componentView);}}});var seriesDirtyMap=createHashMap();ecModel.eachSeries(function(seriesModel){var chartView=ecIns._chartsMap[seriesModel.__viewId];if(chartView.updateTransform){var result=chartView.updateTransform(seriesModel,ecModel,api,payload);result&&result.update&&seriesDirtyMap.set(seriesModel.uid,1);}else{seriesDirtyMap.set(seriesModel.uid,1);}});clearColorPalette(ecModel);// Keep pipe to the exist pipeline because it depends on the render task of the full pipeline.\n// this._scheduler.performVisualTasks(ecModel, payload, 'layout', true);\nthis._scheduler.performVisualTasks(ecModel,payload,{setDirty:true,dirtyMap:seriesDirtyMap});// Currently, not call render of components. Geo render cost a lot.\n// renderComponents(ecIns, ecModel, api, payload, componentDirtyList);\nrenderSeries(ecIns,ecModel,api,payload,seriesDirtyMap);performPostUpdateFuncs(ecModel,this._api);},/**\n * @param {Object} payload\n * @private\n */updateView:function updateView(payload){var ecModel=this._model;// update before setOption\nif(!ecModel){return;}Chart.markUpdateMethod(payload,'updateView');clearColorPalette(ecModel);// Keep pipe to the exist pipeline because it depends on the render task of the full pipeline.\nthis._scheduler.performVisualTasks(ecModel,payload,{setDirty:true});render(this,this._model,this._api,payload);performPostUpdateFuncs(ecModel,this._api);},/**\n * @param {Object} payload\n * @private\n */updateVisual:function updateVisual(payload){updateMethods.update.call(this,payload);// var ecModel = this._model;\n// // update before setOption\n// if (!ecModel) {\n// return;\n// }\n// ChartView.markUpdateMethod(payload, 'updateVisual');\n// clearColorPalette(ecModel);\n// // Keep pipe to the exist pipeline because it depends on the render task of the full pipeline.\n// this._scheduler.performVisualTasks(ecModel, payload, {visualType: 'visual', setDirty: true});\n// render(this, this._model, this._api, payload);\n// performPostUpdateFuncs(ecModel, this._api);\n},/**\n * @param {Object} payload\n * @private\n */updateLayout:function updateLayout(payload){updateMethods.update.call(this,payload);// var ecModel = this._model;\n// // update before setOption\n// if (!ecModel) {\n// return;\n// }\n// ChartView.markUpdateMethod(payload, 'updateLayout');\n// // Keep pipe to the exist pipeline because it depends on the render task of the full pipeline.\n// // this._scheduler.performVisualTasks(ecModel, payload, 'layout', true);\n// this._scheduler.performVisualTasks(ecModel, payload, {setDirty: true});\n// render(this, this._model, this._api, payload);\n// performPostUpdateFuncs(ecModel, this._api);\n}};function prepare(ecIns){var ecModel=ecIns._model;var scheduler=ecIns._scheduler;scheduler.restorePipelines(ecModel);scheduler.prepareStageTasks();prepareView(ecIns,'component',ecModel,scheduler);prepareView(ecIns,'chart',ecModel,scheduler);scheduler.plan();}/**\n * @private\n */function updateDirectly(ecIns,method,payload,mainType,subType){var ecModel=ecIns._model;// broadcast\nif(!mainType){// FIXME\n// Chart will not be update directly here, except set dirty.\n// But there is no such scenario now.\neach(ecIns._componentsViews.concat(ecIns._chartsViews),callView);return;}var query={};query[mainType+'Id']=payload[mainType+'Id'];query[mainType+'Index']=payload[mainType+'Index'];query[mainType+'Name']=payload[mainType+'Name'];var condition={mainType:mainType,query:query};subType&&(condition.subType=subType);// subType may be '' by parseClassType;\nvar excludeSeriesId=payload.excludeSeriesId;if(excludeSeriesId!=null){excludeSeriesId=createHashMap(normalizeToArray(excludeSeriesId));}// If dispatchAction before setOption, do nothing.\necModel&&ecModel.eachComponent(condition,function(model){if(!excludeSeriesId||excludeSeriesId.get(model.id)==null){callView(ecIns[mainType==='series'?'_chartsMap':'_componentsMap'][model.__viewId]);}},ecIns);function callView(view){view&&view.__alive&&view[method]&&view[method](view.__model,ecModel,ecIns._api,payload);}}/**\n * Resize the chart\n * @param {Object} opts\n * @param {number} [opts.width] Can be 'auto' (the same as null/undefined)\n * @param {number} [opts.height] Can be 'auto' (the same as null/undefined)\n * @param {boolean} [opts.silent=false]\n */echartsProto.resize=function(opts){if(__DEV__){assert(!this[IN_MAIN_PROCESS],'`resize` should not be called during main process.');}if(this._disposed){disposedWarning(this.id);return;}this._zr.resize(opts);var ecModel=this._model;// Resize loading effect\nthis._loadingFX&&this._loadingFX.resize();if(!ecModel){return;}var optionChanged=ecModel.resetOption('media');var silent=opts&&opts.silent;this[IN_MAIN_PROCESS]=true;optionChanged&&prepare(this);updateMethods.update.call(this);this[IN_MAIN_PROCESS]=false;flushPendingActions.call(this,silent);triggerUpdatedEvent.call(this,silent);};function updateStreamModes(ecIns,ecModel){var chartsMap=ecIns._chartsMap;var scheduler=ecIns._scheduler;ecModel.eachSeries(function(seriesModel){scheduler.updateStreamModes(seriesModel,chartsMap[seriesModel.__viewId]);});}/**\n * Show loading effect\n * @param {string} [name='default']\n * @param {Object} [cfg]\n */echartsProto.showLoading=function(name,cfg){if(this._disposed){disposedWarning(this.id);return;}if(isObject(name)){cfg=name;name='';}name=name||'default';this.hideLoading();if(!loadingEffects[name]){if(__DEV__){console.warn('Loading effects '+name+' not exists.');}return;}var el=loadingEffects[name](this._api,cfg);var zr=this._zr;this._loadingFX=el;zr.add(el);};/**\n * Hide loading effect\n */echartsProto.hideLoading=function(){if(this._disposed){disposedWarning(this.id);return;}this._loadingFX&&this._zr.remove(this._loadingFX);this._loadingFX=null;};/**\n * @param {Object} eventObj\n * @return {Object}\n */echartsProto.makeActionFromEvent=function(eventObj){var payload=extend({},eventObj);payload.type=eventActionMap[eventObj.type];return payload;};/**\n * @pubilc\n * @param {Object} payload\n * @param {string} [payload.type] Action type\n * @param {Object|boolean} [opt] If pass boolean, means opt.silent\n * @param {boolean} [opt.silent=false] Whether trigger events.\n * @param {boolean} [opt.flush=undefined]\n * true: Flush immediately, and then pixel in canvas can be fetched\n * immediately. Caution: it might affect performance.\n * false: Not flush.\n * undefined: Auto decide whether perform flush.\n */echartsProto.dispatchAction=function(payload,opt){if(this._disposed){disposedWarning(this.id);return;}if(!isObject(opt)){opt={silent:!!opt};}if(!actions[payload.type]){return;}// Avoid dispatch action before setOption. Especially in `connect`.\nif(!this._model){return;}// May dispatchAction in rendering procedure\nif(this[IN_MAIN_PROCESS]){this._pendingActions.push(payload);return;}doDispatchAction.call(this,payload,opt.silent);if(opt.flush){this._zr.flush(true);}else if(opt.flush!==false&&env$1.browser.weChat){// In WeChat embeded browser, `requestAnimationFrame` and `setInterval`\n// hang when sliding page (on touch event), which cause that zr does not\n// refresh util user interaction finished, which is not expected.\n// But `dispatchAction` may be called too frequently when pan on touch\n// screen, which impacts performance if do not throttle them.\nthis._throttledZrFlush();}flushPendingActions.call(this,opt.silent);triggerUpdatedEvent.call(this,opt.silent);};function doDispatchAction(payload,silent){var payloadType=payload.type;var escapeConnect=payload.escapeConnect;var actionWrap=actions[payloadType];var actionInfo=actionWrap.actionInfo;var cptType=(actionInfo.update||'update').split(':');var updateMethod=cptType.pop();cptType=cptType[0]!=null&&parseClassType(cptType[0]);this[IN_MAIN_PROCESS]=true;var payloads=[payload];var batched=false;// Batch action\nif(payload.batch){batched=true;payloads=map(payload.batch,function(item){item=defaults(extend({},item),payload);item.batch=null;return item;});}var eventObjBatch=[];var eventObj;var isHighDown=payloadType==='highlight'||payloadType==='downplay';each(payloads,function(batchItem){// Action can specify the event by return it.\neventObj=actionWrap.action(batchItem,this._model,this._api);// Emit event outside\neventObj=eventObj||extend({},batchItem);// Convert type to eventType\neventObj.type=actionInfo.event||eventObj.type;eventObjBatch.push(eventObj);// light update does not perform data process, layout and visual.\nif(isHighDown){// method, payload, mainType, subType\nupdateDirectly(this,updateMethod,batchItem,'series');}else if(cptType){updateDirectly(this,updateMethod,batchItem,cptType.main,cptType.sub);}},this);if(updateMethod!=='none'&&!isHighDown&&!cptType){// Still dirty\nif(this[OPTION_UPDATED]){// FIXME Pass payload ?\nprepare(this);updateMethods.update.call(this,payload);this[OPTION_UPDATED]=false;}else{updateMethods[updateMethod].call(this,payload);}}// Follow the rule of action batch\nif(batched){eventObj={type:actionInfo.event||payloadType,escapeConnect:escapeConnect,batch:eventObjBatch};}else{eventObj=eventObjBatch[0];}this[IN_MAIN_PROCESS]=false;!silent&&this._messageCenter.trigger(eventObj.type,eventObj);}function flushPendingActions(silent){var pendingActions=this._pendingActions;while(pendingActions.length){var payload=pendingActions.shift();doDispatchAction.call(this,payload,silent);}}function triggerUpdatedEvent(silent){!silent&&this.trigger('updated');}/**\n * Event `rendered` is triggered when zr\n * rendered. It is useful for realtime\n * snapshot (reflect animation).\n *\n * Event `finished` is triggered when:\n * (1) zrender rendering finished.\n * (2) initial animation finished.\n * (3) progressive rendering finished.\n * (4) no pending action.\n * (5) no delayed setOption needs to be processed.\n */function bindRenderedEvent(zr,ecIns){zr.on('rendered',function(){ecIns.trigger('rendered');// The `finished` event should not be triggered repeatly,\n// so it should only be triggered when rendering indeed happend\n// in zrender. (Consider the case that dipatchAction is keep\n// triggering when mouse move).\nif(// Although zr is dirty if initial animation is not finished\n// and this checking is called on frame, we also check\n// animation finished for robustness.\nzr.animation.isFinished()&&!ecIns[OPTION_UPDATED]&&!ecIns._scheduler.unfinished&&!ecIns._pendingActions.length){ecIns.trigger('finished');}});}/**\n * @param {Object} params\n * @param {number} params.seriesIndex\n * @param {Array|TypedArray} params.data\n */echartsProto.appendData=function(params){if(this._disposed){disposedWarning(this.id);return;}var seriesIndex=params.seriesIndex;var ecModel=this.getModel();var seriesModel=ecModel.getSeriesByIndex(seriesIndex);if(__DEV__){assert(params.data&&seriesModel);}seriesModel.appendData(params);// Note: `appendData` does not support that update extent of coordinate\n// system, util some scenario require that. In the expected usage of\n// `appendData`, the initial extent of coordinate system should better\n// be fixed by axis `min`/`max` setting or initial data, otherwise if\n// the extent changed while `appendData`, the location of the painted\n// graphic elements have to be changed, which make the usage of\n// `appendData` meaningless.\nthis._scheduler.unfinished=true;};/**\n * Register event\n * @method\n */echartsProto.on=createRegisterEventWithLowercaseName('on',false);echartsProto.off=createRegisterEventWithLowercaseName('off',false);echartsProto.one=createRegisterEventWithLowercaseName('one',false);/**\n * Prepare view instances of charts and components\n * @param {module:echarts/model/Global} ecModel\n * @private\n */function prepareView(ecIns,type,ecModel,scheduler){var isComponent=type==='component';var viewList=isComponent?ecIns._componentsViews:ecIns._chartsViews;var viewMap=isComponent?ecIns._componentsMap:ecIns._chartsMap;var zr=ecIns._zr;var api=ecIns._api;for(var i=0;iecModel.get('hoverLayerThreshold')&&!env$1.node){ecModel.eachSeries(function(seriesModel){if(seriesModel.preventUsingHoverLayer){return;}var chartView=ecIns._chartsMap[seriesModel.__viewId];if(chartView.__alive){chartView.group.traverse(function(el){// Don't switch back.\nel.useHoverLayer=true;});}});}}/**\n * Update chart progressive and blend.\n * @param {module:echarts/model/Series|module:echarts/model/Component} model\n * @param {module:echarts/view/Component|module:echarts/view/Chart} view\n */function updateBlend(seriesModel,chartView){var blendMode=seriesModel.get('blendMode')||null;if(__DEV__){if(!env$1.canvasSupported&&blendMode&&blendMode!=='source-over'){console.warn('Only canvas support blendMode');}}chartView.group.traverse(function(el){// FIXME marker and other components\nif(!el.isGroup){// Only set if blendMode is changed. In case element is incremental and don't wan't to rerender.\nif(el.style.blend!==blendMode){el.setStyle('blend',blendMode);}}if(el.eachPendingDisplayable){el.eachPendingDisplayable(function(displayable){displayable.setStyle('blend',blendMode);});}});}/**\n * @param {module:echarts/model/Series|module:echarts/model/Component} model\n * @param {module:echarts/view/Component|module:echarts/view/Chart} view\n */function updateZ(model,view){var z=model.get('z');var zlevel=model.get('zlevel');// Set z and zlevel\nview.group.traverse(function(el){if(el.type!=='group'){z!=null&&(el.z=z);zlevel!=null&&(el.zlevel=zlevel);}});}function createExtensionAPI(ecInstance){var coordSysMgr=ecInstance._coordSysMgr;return extend(new ExtensionAPI(ecInstance),{// Inject methods\ngetCoordinateSystems:bind(coordSysMgr.getCoordinateSystems,coordSysMgr),getComponentByElement:function getComponentByElement(el){while(el){var modelInfo=el.__ecComponentInfo;if(modelInfo!=null){return ecInstance._model.getComponent(modelInfo.mainType,modelInfo.index);}el=el.parent;}}});}/**\n * @class\n * Usage of query:\n * `chart.on('click', query, handler);`\n * The `query` can be:\n * + The component type query string, only `mainType` or `mainType.subType`,\n * like: 'xAxis', 'series', 'xAxis.category' or 'series.line'.\n * + The component query object, like:\n * `{seriesIndex: 2}`, `{seriesName: 'xx'}`, `{seriesId: 'some'}`,\n * `{xAxisIndex: 2}`, `{xAxisName: 'xx'}`, `{xAxisId: 'some'}`.\n * + The data query object, like:\n * `{dataIndex: 123}`, `{dataType: 'link'}`, `{name: 'some'}`.\n * + The other query object (cmponent customized query), like:\n * `{element: 'some'}` (only available in custom series).\n *\n * Caveat: If a prop in the `query` object is `null/undefined`, it is the\n * same as there is no such prop in the `query` object.\n */function EventProcessor(){// These info required: targetEl, packedEvent, model, view\nthis.eventInfo;}EventProcessor.prototype={constructor:EventProcessor,normalizeQuery:function normalizeQuery(query){var cptQuery={};var dataQuery={};var otherQuery={};// `query` is `mainType` or `mainType.subType` of component.\nif(isString(query)){var condCptType=parseClassType(query);// `.main` and `.sub` may be ''.\ncptQuery.mainType=condCptType.main||null;cptQuery.subType=condCptType.sub||null;}// `query` is an object, convert to {mainType, index, name, id}.\nelse{// `xxxIndex`, `xxxName`, `xxxId`, `name`, `dataIndex`, `dataType` is reserved,\n// can not be used in `compomentModel.filterForExposedEvent`.\nvar suffixes=['Index','Name','Id'];var dataKeys={name:1,dataIndex:1,dataType:1};each$1(query,function(val,key){var reserved=false;for(var i=0;i0&&suffixPos===key.length-propSuffix.length){var mainType=key.slice(0,suffixPos);// Consider `dataIndex`.\nif(mainType!=='data'){cptQuery.mainType=mainType;cptQuery[propSuffix.toLowerCase()]=val;reserved=true;}}}if(dataKeys.hasOwnProperty(key)){dataQuery[key]=val;reserved=true;}if(!reserved){otherQuery[key]=val;}});}return{cptQuery:cptQuery,dataQuery:dataQuery,otherQuery:otherQuery};},filter:function filter(eventType,query,args){// They should be assigned before each trigger call.\nvar eventInfo=this.eventInfo;if(!eventInfo){return true;}var targetEl=eventInfo.targetEl;var packedEvent=eventInfo.packedEvent;var model=eventInfo.model;var view=eventInfo.view;// For event like 'globalout'.\nif(!model||!view){return true;}var cptQuery=query.cptQuery;var dataQuery=query.dataQuery;return check(cptQuery,model,'mainType')&&check(cptQuery,model,'subType')&&check(cptQuery,model,'index','componentIndex')&&check(cptQuery,model,'name')&&check(cptQuery,model,'id')&&check(dataQuery,packedEvent,'name')&&check(dataQuery,packedEvent,'dataIndex')&&check(dataQuery,packedEvent,'dataType')&&(!view.filterForExposedEvent||view.filterForExposedEvent(eventType,query.otherQuery,targetEl,packedEvent));function check(query,host,prop,propOnHost){return query[prop]==null||host[propOnHost||prop]===query[prop];}},afterTrigger:function afterTrigger(){// Make sure the eventInfo wont be used in next trigger.\nthis.eventInfo=null;}};/**\n * @type {Object} key: actionType.\n * @inner\n */var actions={};/**\n * Map eventType to actionType\n * @type {Object}\n */var eventActionMap={};/**\n * Data processor functions of each stage\n * @type {Array.>}\n * @inner\n */var dataProcessorFuncs=[];/**\n * @type {Array.}\n * @inner\n */var optionPreprocessorFuncs=[];/**\n * @type {Array.}\n * @inner\n */var postUpdateFuncs=[];/**\n * Visual encoding functions of each stage\n * @type {Array.>}\n */var visualFuncs=[];/**\n * Theme storage\n * @type {Object.}\n */var themeStorage={};/**\n * Loading effects\n */var loadingEffects={};var instances={};var connectedGroups={};var idBase=new Date()-0;var groupIdBase=new Date()-0;var DOM_ATTRIBUTE_KEY='_echarts_instance_';function enableConnect(chart){var STATUS_PENDING=0;var STATUS_UPDATING=1;var STATUS_UPDATED=2;var STATUS_KEY='__connectUpdateStatus';function updateConnectedChartsStatus(charts,status){for(var i=0;i} groupId\n */function connect(groupId){// Is array of charts\nif(isArray(groupId)){var charts=groupId;groupId=null;// If any chart has group\neach(charts,function(chart){if(chart.group!=null){groupId=chart.group;}});groupId=groupId||'g_'+groupIdBase++;each(charts,function(chart){chart.group=groupId;});}connectedGroups[groupId]=true;return groupId;}/**\n * @DEPRECATED\n * @return {string} groupId\n */function disConnect(groupId){connectedGroups[groupId]=false;}/**\n * @return {string} groupId\n */var disconnect=disConnect;/**\n * Dispose a chart instance\n * @param {module:echarts~ECharts|HTMLDomElement|string} chart\n */function dispose(chart){if(typeof chart==='string'){chart=instances[chart];}else if(!(chart instanceof ECharts)){// Try to treat as dom\nchart=getInstanceByDom(chart);}if(chart instanceof ECharts&&!chart.isDisposed()){chart.dispose();}}/**\n * @param {HTMLElement} dom\n * @return {echarts~ECharts}\n */function getInstanceByDom(dom){return instances[getAttribute(dom,DOM_ATTRIBUTE_KEY)];}/**\n * @param {string} key\n * @return {echarts~ECharts}\n */function getInstanceById(key){return instances[key];}/**\n * Register theme\n */function registerTheme(name,theme$$1){themeStorage[name]=theme$$1;}/**\n * Register option preprocessor\n * @param {Function} preprocessorFunc\n */function registerPreprocessor(preprocessorFunc){optionPreprocessorFuncs.push(preprocessorFunc);}/**\n * @param {number} [priority=1000]\n * @param {Object|Function} processor\n */function registerProcessor(priority,processor){normalizeRegister(dataProcessorFuncs,priority,processor,PRIORITY_PROCESSOR_FILTER);}/**\n * Register postUpdater\n * @param {Function} postUpdateFunc\n */function registerPostUpdate(postUpdateFunc){postUpdateFuncs.push(postUpdateFunc);}/**\n * Usage:\n * registerAction('someAction', 'someEvent', function () { ... });\n * registerAction('someAction', function () { ... });\n * registerAction(\n * {type: 'someAction', event: 'someEvent', update: 'updateView'},\n * function () { ... }\n * );\n *\n * @param {(string|Object)} actionInfo\n * @param {string} actionInfo.type\n * @param {string} [actionInfo.event]\n * @param {string} [actionInfo.update]\n * @param {string} [eventName]\n * @param {Function} action\n */function registerAction(actionInfo,eventName,action){if(typeof eventName==='function'){action=eventName;eventName='';}var actionType=isObject(actionInfo)?actionInfo.type:[actionInfo,actionInfo={event:eventName}][0];// Event name is all lowercase\nactionInfo.event=(actionInfo.event||actionType).toLowerCase();eventName=actionInfo.event;// Validate action type and event name.\nassert(ACTION_REG.test(actionType)&&ACTION_REG.test(eventName));if(!actions[actionType]){actions[actionType]={action:action,actionInfo:actionInfo};}eventActionMap[eventName]=actionType;}/**\n * @param {string} type\n * @param {*} CoordinateSystem\n */function registerCoordinateSystem(type,CoordinateSystem$$1){CoordinateSystemManager.register(type,CoordinateSystem$$1);}/**\n * Get dimensions of specified coordinate system.\n * @param {string} type\n * @return {Array.}\n */function getCoordinateSystemDimensions(type){var coordSysCreator=CoordinateSystemManager.get(type);if(coordSysCreator){return coordSysCreator.getDimensionsInfo?coordSysCreator.getDimensionsInfo():coordSysCreator.dimensions.slice();}}/**\n * Layout is a special stage of visual encoding\n * Most visual encoding like color are common for different chart\n * But each chart has it's own layout algorithm\n *\n * @param {number} [priority=1000]\n * @param {Function} layoutTask\n */function registerLayout(priority,layoutTask){normalizeRegister(visualFuncs,priority,layoutTask,PRIORITY_VISUAL_LAYOUT,'layout');}/**\n * @param {number} [priority=3000]\n * @param {module:echarts/stream/Task} visualTask\n */function registerVisual(priority,visualTask){normalizeRegister(visualFuncs,priority,visualTask,PRIORITY_VISUAL_CHART,'visual');}/**\n * @param {Object|Function} fn: {seriesType, createOnAllSeries, performRawSeries, reset}\n */function normalizeRegister(targetList,priority,fn,defaultPriority,visualType){if(isFunction(priority)||isObject(priority)){fn=priority;priority=defaultPriority;}if(__DEV__){if(isNaN(priority)||priority==null){throw new Error('Illegal priority');}// Check duplicate\neach(targetList,function(wrap){assert(wrap.__raw!==fn);});}var stageHandler=Scheduler.wrapStageHandler(fn,visualType);stageHandler.__prio=priority;stageHandler.__raw=fn;targetList.push(stageHandler);return stageHandler;}/**\n * @param {string} name\n */function registerLoading(name,loadingFx){loadingEffects[name]=loadingFx;}/**\n * @param {Object} opts\n * @param {string} [superClass]\n */function extendComponentModel(opts/*, superClass*/){// var Clazz = ComponentModel;\n// if (superClass) {\n// var classType = parseClassType(superClass);\n// Clazz = ComponentModel.getClass(classType.main, classType.sub, true);\n// }\nreturn ComponentModel.extend(opts);}/**\n * @param {Object} opts\n * @param {string} [superClass]\n */function extendComponentView(opts/*, superClass*/){// var Clazz = ComponentView;\n// if (superClass) {\n// var classType = parseClassType(superClass);\n// Clazz = ComponentView.getClass(classType.main, classType.sub, true);\n// }\nreturn Component$1.extend(opts);}/**\n * @param {Object} opts\n * @param {string} [superClass]\n */function extendSeriesModel(opts/*, superClass*/){// var Clazz = SeriesModel;\n// if (superClass) {\n// superClass = 'series.' + superClass.replace('series.', '');\n// var classType = parseClassType(superClass);\n// Clazz = ComponentModel.getClass(classType.main, classType.sub, true);\n// }\nreturn SeriesModel.extend(opts);}/**\n * @param {Object} opts\n * @param {string} [superClass]\n */function extendChartView(opts/*, superClass*/){// var Clazz = ChartView;\n// if (superClass) {\n// superClass = superClass.replace('series.', '');\n// var classType = parseClassType(superClass);\n// Clazz = ChartView.getClass(classType.main, true);\n// }\nreturn Chart.extend(opts);}/**\n * ZRender need a canvas context to do measureText.\n * But in node environment canvas may be created by node-canvas.\n * So we need to specify how to create a canvas instead of using document.createElement('canvas')\n *\n * Be careful of using it in the browser.\n *\n * @param {Function} creator\n * @example\n * var Canvas = require('canvas');\n * var echarts = require('echarts');\n * echarts.setCanvasCreator(function () {\n * // Small size is enough.\n * return new Canvas(32, 32);\n * });\n */function setCanvasCreator(creator){$override('createCanvas',creator);}/**\n * @param {string} mapName\n * @param {Array.