diff --git a/themes/grav/app/forms/fields/files.js b/themes/grav/app/forms/fields/files.js index 2cce55e6..1b899495 100644 --- a/themes/grav/app/forms/fields/files.js +++ b/themes/grav/app/forms/fields/files.js @@ -144,6 +144,7 @@ export default class FilesField { this.dropzone = new Dropzone(container, this.options); this.dropzone.on('complete', this.onDropzoneComplete.bind(this)); this.dropzone.on('success', this.onDropzoneSuccess.bind(this)); + this.dropzone.on('addedfile', this.onDropzoneAddedFile.bind(this)); this.dropzone.on('removedfile', this.onDropzoneRemovedFile.bind(this)); this.dropzone.on('sending', this.onDropzoneSending.bind(this)); this.dropzone.on('error', this.onDropzoneError.bind(this)); @@ -260,6 +261,10 @@ export default class FilesField { return decodeURIComponent(escape(window.atob(str))); } + onDropzoneAddedFile(file, ...extra) { + return this.dropzone.options.addedfile(file); + } + onDropzoneRemovedFile(file, ...extra) { if (!file.accepted || file.rejected) { return; } let url = file.removeUrl || this.urls.delete || this.options.url; diff --git a/themes/grav/app/pages/page/media.js b/themes/grav/app/pages/page/media.js index e23e015a..283ffb01 100644 --- a/themes/grav/app/pages/page/media.js +++ b/themes/grav/app/pages/page/media.js @@ -91,13 +91,7 @@ export default class PageMedia extends FilesField { this.dropzone.options.thumbnail.call(this.dropzone, mock, data.url); }); - const status = JSON.parse(Cookies.get('grav-admin-pagemedia') || '{}'); - - if (status.width) { - const input = this.container.closest('.pagemedia-field').find('.media-resizer'); - updateMediaSizes(input, status.width, false); - } - + this.updateThumbsSize(); this.container.find('.dz-preview').prop('draggable', 'true'); }); } @@ -121,16 +115,16 @@ export default class PageMedia extends FilesField { } // accepted - const status = JSON.parse(Cookies.get('grav-admin-pagemedia') || '{}'); - - if (status.width) { - const input = this.container.closest('.pagemedia-field').find('.media-resizer'); - updateMediaSizes(input, status.width, false); - } - + this.updateThumbsSize(); $('.dz-preview').prop('draggable', 'true'); } + onDropzoneAddedFile(file, ...extra) { + super.onDropzoneAddedFile(file, extra); + + this.updateThumbsSize(); + } + onDropzoneRemovedFile(file, ...extra) { super.onDropzoneRemovedFile(file, ...extra); if (this.sortable) { @@ -138,6 +132,15 @@ export default class PageMedia extends FilesField { } } + updateThumbsSize() { + const status = JSON.parse(Cookies.get('grav-admin-pagemedia') || '{}'); + + if (status.width) { + const input = this.container.closest('.pagemedia-field').find('.media-resizer'); + updateMediaSizes(input, status.width, false); + } + } + attachDragDrop() { this.container.delegate('[data-dz-insert]', 'click', (e) => { let target = $(e.currentTarget).parent('.dz-preview').find('.dz-filename'); diff --git a/themes/grav/js/admin.min.js b/themes/grav/js/admin.min.js index fc4446c8..00477788 100644 --- a/themes/grav/js/admin.min.js +++ b/themes/grav/js/admin.min.js @@ -171,7 +171,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ FilesField),\n/* harmony export */ \"UriToMarkdown\": () => (/* binding */ UriToMarkdown),\n/* harmony export */ \"Instance\": () => (/* binding */ Instance)\n/* harmony export */ });\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jquery */ \"jquery\");\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var dropzone__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! dropzone */ \"./node_modules/dropzone/dist/dropzone.js\");\n/* harmony import */ var dropzone__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(dropzone__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _utils_request__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../utils/request */ \"./app/utils/request.js\");\n/* harmony import */ var grav_config__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! grav-config */ \"grav-config\");\n/* harmony import */ var grav_config__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(grav_config__WEBPACK_IMPORTED_MODULE_3__);\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\n\n\n // import EXIF from 'exif-js';\n\n\n // translations\n\nvar Dictionary = {\n dictCancelUpload: grav_config__WEBPACK_IMPORTED_MODULE_3__.translations.PLUGIN_ADMIN.DROPZONE_CANCEL_UPLOAD,\n dictCancelUploadConfirmation: grav_config__WEBPACK_IMPORTED_MODULE_3__.translations.PLUGIN_ADMIN.DROPZONE_CANCEL_UPLOAD_CONFIRMATION,\n dictDefaultMessage: grav_config__WEBPACK_IMPORTED_MODULE_3__.translations.PLUGIN_ADMIN.DROPZONE_DEFAULT_MESSAGE,\n dictFallbackMessage: grav_config__WEBPACK_IMPORTED_MODULE_3__.translations.PLUGIN_ADMIN.DROPZONE_FALLBACK_MESSAGE,\n dictFallbackText: grav_config__WEBPACK_IMPORTED_MODULE_3__.translations.PLUGIN_ADMIN.DROPZONE_FALLBACK_TEXT,\n dictFileTooBig: grav_config__WEBPACK_IMPORTED_MODULE_3__.translations.PLUGIN_ADMIN.DROPZONE_FILE_TOO_BIG,\n dictInvalidFileType: grav_config__WEBPACK_IMPORTED_MODULE_3__.translations.PLUGIN_ADMIN.DROPZONE_INVALID_FILE_TYPE,\n dictMaxFilesExceeded: grav_config__WEBPACK_IMPORTED_MODULE_3__.translations.PLUGIN_ADMIN.DROPZONE_MAX_FILES_EXCEEDED,\n dictRemoveFile: grav_config__WEBPACK_IMPORTED_MODULE_3__.translations.PLUGIN_ADMIN.DROPZONE_REMOVE_FILE,\n dictResponseError: grav_config__WEBPACK_IMPORTED_MODULE_3__.translations.PLUGIN_ADMIN.DROPZONE_RESPONSE_ERROR\n};\n(dropzone__WEBPACK_IMPORTED_MODULE_1___default().autoDiscover) = false;\n(dropzone__WEBPACK_IMPORTED_MODULE_1___default().options.gravPageDropzone) = {};\n\n(dropzone__WEBPACK_IMPORTED_MODULE_1___default().confirm) = function (question, accepted, rejected) {\n var doc = jquery__WEBPACK_IMPORTED_MODULE_0___default()(document);\n var modalSelector = '[data-remodal-id=\"delete-media\"]';\n\n var removeEvents = function removeEvents() {\n doc.off('confirmation', modalSelector, accept);\n doc.off('cancellation', modalSelector, reject);\n jquery__WEBPACK_IMPORTED_MODULE_0___default()(modalSelector).find('.remodal-confirm').removeClass('pointer-events-disabled');\n };\n\n var accept = function accept() {\n accepted && accepted();\n removeEvents();\n };\n\n var reject = function reject() {\n rejected && rejected();\n removeEvents();\n };\n\n (jquery__WEBPACK_IMPORTED_MODULE_0___default().remodal.lookup)[jquery__WEBPACK_IMPORTED_MODULE_0___default()(modalSelector).data('remodal')].open();\n doc.on('confirmation', modalSelector, accept);\n doc.on('cancellation', modalSelector, reject);\n};\n\nvar DropzoneMediaConfig = {\n timeout: 0,\n thumbnailWidth: 200,\n thumbnailHeight: 150,\n addRemoveLinks: false,\n dictDefaultMessage: grav_config__WEBPACK_IMPORTED_MODULE_3__.translations.PLUGIN_ADMIN.DROP_FILES_HERE_TO_UPLOAD.replace(/</g, '<').replace(/>/g, '>'),\n dictRemoveFileConfirmation: '[placeholder]',\n previewTemplate: \"\\n
\\n
\\n
\\n
\\n \\n
\\n
\\n
\\u2714
\\n
\\u2718
\\n
\\n \").concat(grav_config__WEBPACK_IMPORTED_MODULE_3__.translations.PLUGIN_ADMIN.UNSET, \"\\n \").concat(grav_config__WEBPACK_IMPORTED_MODULE_3__.translations.PLUGIN_ADMIN.DELETE, \"\\n \").concat(grav_config__WEBPACK_IMPORTED_MODULE_3__.translations.PLUGIN_ADMIN.METADATA, \"\\n \").concat(grav_config__WEBPACK_IMPORTED_MODULE_3__.translations.PLUGIN_ADMIN.VIEW, \"\\n
\").trim()\n}; // global.EXIF = EXIF;\n\nvar ACCEPT_FUNC = function ACCEPT_FUNC(file, done, settings) {\n var resolution = settings.resolution;\n if (!resolution) return done();\n var reader = new FileReader();\n var error = '';\n var hasMin = resolution.min && (resolution.min.width || resolution.min.height);\n var hasMax = resolution.max && (resolution.max.width || resolution.max.height);\n\n if (hasMin || !(settings.resizeWidth || settings.resizeHeight) && hasMax) {\n reader.onload = function (event) {\n if (!/image\\//.test(file.type)) {\n done();\n return;\n }\n\n var image = new Image();\n image.src = event.target.result;\n\n image.onerror = function () {\n done(grav_config__WEBPACK_IMPORTED_MODULE_3__.translations.PLUGIN_ADMIN.FILE_ERROR_UPLOAD);\n };\n\n image.onload = function () {\n var _this = this;\n\n if (resolution.min) {\n Object.keys(resolution.min).forEach(function (attr) {\n if (resolution.min[attr] && _this[attr] < resolution.min[attr]) {\n error += grav_config__WEBPACK_IMPORTED_MODULE_3__.translations.PLUGIN_FORM.RESOLUTION_MIN.replace(/{{attr}}/g, attr).replace(/{{min}}/g, resolution.min[attr]);\n }\n });\n }\n\n if (!(settings.resizeWidth || settings.resizeHeight)) {\n if (resolution.max) {\n Object.keys(resolution.max).forEach(function (attr) {\n if (resolution.max[attr] && _this[attr] > resolution.max[attr]) {\n error += grav_config__WEBPACK_IMPORTED_MODULE_3__.translations.PLUGIN_FORM.RESOLUTION_MAX.replace(/{{attr}}/g, attr).replace(/{{max}}/g, resolution.max[attr]);\n }\n });\n }\n }\n\n URL.revokeObjectURL(image.src); // release memory\n\n return error ? done(error) : done();\n };\n };\n\n reader.readAsDataURL(file);\n } else {\n return error ? done(error) : done();\n }\n};\n\nvar FilesField = /*#__PURE__*/function () {\n function FilesField() {\n var _this2 = this;\n\n var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},\n _ref$container = _ref.container,\n container = _ref$container === void 0 ? '.dropzone.files-upload' : _ref$container,\n _ref$options = _ref.options,\n options = _ref$options === void 0 ? {} : _ref$options;\n\n _classCallCheck(this, FilesField);\n\n this.container = jquery__WEBPACK_IMPORTED_MODULE_0___default()(container);\n\n if (!this.container.length) {\n return;\n }\n\n this.urls = {};\n this.customPost = this.container.data('filePostAdd') || {};\n this.options = Object.assign({}, Dictionary, DropzoneMediaConfig, {\n klass: this,\n url: this.container.data('file-url-add') || grav_config__WEBPACK_IMPORTED_MODULE_3__.config.current_url,\n acceptedFiles: this.container.data('media-types'),\n init: this.initDropzone\n }, this.container.data('dropzone-options'), options);\n this.options = Object.assign({}, this.options, {\n accept: function accept(file, done) {\n ACCEPT_FUNC(file, done, this.options);\n }\n });\n this.dropzone = new (dropzone__WEBPACK_IMPORTED_MODULE_1___default())(container, this.options);\n this.dropzone.on('complete', this.onDropzoneComplete.bind(this));\n this.dropzone.on('success', this.onDropzoneSuccess.bind(this));\n this.dropzone.on('removedfile', this.onDropzoneRemovedFile.bind(this));\n this.dropzone.on('sending', this.onDropzoneSending.bind(this));\n this.dropzone.on('error', this.onDropzoneError.bind(this));\n this.container.on('mouseenter', '[data-dz-view]', function (e) {\n var value = JSON.parse(_this2.container.find('[name][type=\"hidden\"]').val() || '{}');\n var target = jquery__WEBPACK_IMPORTED_MODULE_0___default()(e.currentTarget);\n var file = target.parent('.dz-preview').find('.dz-filename');\n var filename = encodeURI(file.text());\n var URL = Object.keys(value).filter(function (key) {\n return value[key].name === filename;\n }).shift();\n target.attr('href', \"\".concat(grav_config__WEBPACK_IMPORTED_MODULE_3__.config.base_url_simple, \"/\").concat(URL));\n });\n }\n\n _createClass(FilesField, [{\n key: \"initDropzone\",\n value: function initDropzone() {\n var _this3 = this;\n\n var files = this.options.klass.container.find('[data-file]');\n var dropzone = this;\n\n if (!files.length) {\n return;\n }\n\n files.each(function (index, file) {\n file = jquery__WEBPACK_IMPORTED_MODULE_0___default()(file);\n var data = file.data('file');\n var mock = {\n name: data.name,\n size: data.size,\n type: data.type,\n status: (dropzone__WEBPACK_IMPORTED_MODULE_1___default().ADDED),\n accepted: true,\n url: _this3.options.url,\n removeUrl: data.remove\n };\n dropzone.files.push(mock);\n dropzone.options.addedfile.call(dropzone, mock);\n\n if (mock.type.match(/^image\\//)) {\n dropzone.options.thumbnail.call(dropzone, mock, data.path);\n dropzone.createThumbnailFromUrl(mock, data.path);\n }\n\n file.remove();\n });\n }\n }, {\n key: \"getURI\",\n value: function getURI() {\n return this.container.data('mediaUri') || '';\n }\n }, {\n key: \"onDropzoneSending\",\n value: function onDropzoneSending(file, xhr, formData) {\n var _this4 = this;\n\n if (Object.keys(this.customPost).length) {\n Object.keys(this.customPost).forEach(function (key) {\n formData.append(key, _this4.customPost[key]);\n });\n } else {\n formData.append('name', this.options.dotNotation);\n formData.append('task', 'filesupload');\n formData.append('uri', this.getURI());\n }\n\n formData.append('admin-nonce', grav_config__WEBPACK_IMPORTED_MODULE_3__.config.admin_nonce);\n }\n }, {\n key: \"onDropzoneSuccess\",\n value: function onDropzoneSuccess(file, response, xhr) {\n response = typeof response === 'string' ? JSON.parse(response) : response;\n\n if (this.options.reloadPage) {\n __webpack_require__.g.location.reload();\n } // store params for removing file from session before it gets saved\n\n\n if (response.session) {\n file.sessionParams = response.session;\n file.removeUrl = this.options.url; // Touch field value to force a mutation detection\n\n var input = this.container.find('[name][type=\"hidden\"]');\n var value = input.val();\n input.val(value + ' ');\n }\n\n return this.handleError({\n file: file,\n data: response,\n mode: 'removeFile',\n msg: \"

\".concat(grav_config__WEBPACK_IMPORTED_MODULE_3__.translations.PLUGIN_ADMIN.FILE_ERROR_UPLOAD, \" {{fileName}}

\\n
\").concat(response.message, \"
\")\n });\n }\n }, {\n key: \"onDropzoneComplete\",\n value: function onDropzoneComplete(file) {\n if (!file.accepted && !file.rejected) {\n var data = {\n status: 'error',\n message: \"\".concat(grav_config__WEBPACK_IMPORTED_MODULE_3__.translations.PLUGIN_ADMIN.FILE_UNSUPPORTED, \": \").concat(file.name.match(/\\..+/).join(''))\n };\n return this.handleError({\n file: file,\n data: data,\n mode: 'removeFile',\n msg: \"

\".concat(grav_config__WEBPACK_IMPORTED_MODULE_3__.translations.PLUGIN_ADMIN.FILE_ERROR_ADD, \" {{fileName}}

\\n
\").concat(data.message, \"
\")\n });\n }\n\n if (this.options.reloadPage) {\n __webpack_require__.g.location.reload();\n }\n }\n }, {\n key: \"b64_to_utf8\",\n value: function b64_to_utf8(str) {\n str = str.replace(/\\s/g, '');\n return decodeURIComponent(escape(window.atob(str)));\n }\n }, {\n key: \"onDropzoneRemovedFile\",\n value: function onDropzoneRemovedFile(file) {\n var _this5 = this;\n\n if (!file.accepted || file.rejected) {\n return;\n }\n\n var url = file.removeUrl || this.urls[\"delete\"] || this.options.url;\n var path = (url || '').match(/path:(.*)\\//);\n var body = {\n filename: file.name,\n uri: this.getURI()\n };\n\n if (file.sessionParams) {\n body.task = 'filessessionremove';\n body.session = file.sessionParams;\n }\n\n var customPost = this.container.data('filePostRemove') || {};\n\n if (Object.keys(customPost).length) {\n body = {};\n Object.keys(customPost).forEach(function (key) {\n body[key] = customPost[key];\n });\n }\n\n body['filename'] = file.name;\n body['admin-nonce'] = grav_config__WEBPACK_IMPORTED_MODULE_3__.config.admin_nonce;\n (0,_utils_request__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(url, {\n method: 'post',\n body: body\n }, function () {\n if (!path) {\n return;\n }\n\n path = _this5.b64_to_utf8(path[1]);\n\n var input = _this5.container.find('[name][type=\"hidden\"]');\n\n var data = JSON.parse(input.val() || '{}');\n delete data[path];\n input.val(JSON.stringify(data));\n });\n }\n }, {\n key: \"onDropzoneError\",\n value: function onDropzoneError(file, response, xhr) {\n var message = xhr ? response.error.message : response;\n jquery__WEBPACK_IMPORTED_MODULE_0___default()(file.previewElement).find('[data-dz-errormessage]').html(message);\n return this.handleError({\n file: file,\n data: {\n status: 'error'\n },\n msg: \"
\".concat(message, \"
\")\n });\n }\n }, {\n key: \"handleError\",\n value: function handleError(options) {\n var file = options.file,\n data = options.data,\n mode = options.mode,\n msg = options.msg;\n\n if (data.status !== 'error' && data.status !== 'unauthorized') {\n return;\n }\n\n switch (mode) {\n case 'addBack':\n if (file instanceof File) {\n this.dropzone.addFile.call(this.dropzone, file);\n } else {\n this.dropzone.files.push(file);\n this.dropzone.options.addedfile.call(this.dropzone, file);\n this.dropzone.options.thumbnail.call(this.dropzone, file, file.extras.url);\n }\n\n break;\n\n case 'removeFile':\n default:\n if (~this.dropzone.files.indexOf(file)) {\n file.rejected = true;\n this.dropzone.removeFile.call(this.dropzone, file, {\n silent: true\n });\n }\n\n break;\n }\n\n var modal = jquery__WEBPACK_IMPORTED_MODULE_0___default()('[data-remodal-id=\"generic\"]');\n var cleanName = file.name.replace('<', '<').replace('>', '>');\n modal.find('.error-content').html(msg.replace('{{fileName}}', cleanName));\n (jquery__WEBPACK_IMPORTED_MODULE_0___default().remodal.lookup)[modal.data('remodal')].open();\n }\n }]);\n\n return FilesField;\n}();\n\n\nfunction UriToMarkdown(uri) {\n uri = uri.replace(/@3x|@2x|@1x/, '');\n uri = uri.replace(/\\(/g, '%28');\n uri = uri.replace(/\\)/g, '%29');\n var title = uri.split('.').slice(0, -1).join('.');\n return uri.match(/\\.(jpe?g|png|gif|svg|webp|mp4|webm|ogv|mov)$/i) ? \"![\".concat(title, \"](\").concat(uri, \" \\\"\").concat(title, \"\\\")\") : \"[\".concat(decodeURI(uri), \"](\").concat(uri, \")\");\n}\nvar instances = [];\nvar cache = jquery__WEBPACK_IMPORTED_MODULE_0___default()();\n\nvar onAddedNodes = function onAddedNodes(event, target\n/* , record, instance */\n) {\n var files = jquery__WEBPACK_IMPORTED_MODULE_0___default()(target).find('.dropzone.files-upload');\n\n if (!files.length) {\n return;\n }\n\n files.each(function (index, file) {\n file = jquery__WEBPACK_IMPORTED_MODULE_0___default()(file);\n\n if (!~cache.index(file)) {\n addNode(file);\n }\n });\n};\n\nvar addNode = function addNode(container) {\n container = jquery__WEBPACK_IMPORTED_MODULE_0___default()(container);\n var input = container.find('input[type=\"file\"]');\n var settings = container.data('grav-file-settings') || {};\n\n if (settings.accept && ~settings.accept.indexOf('*')) {\n settings.accept = [''];\n }\n\n var options = {\n url: container.data('file-url-add') || (container.closest('form').attr('action') || grav_config__WEBPACK_IMPORTED_MODULE_3__.config.current_url) + '.json',\n paramName: settings.paramName || 'file',\n dotNotation: settings.name || 'file',\n acceptedFiles: settings.accept ? settings.accept.join(',') : input.attr('accept') || container.data('media-types'),\n maxFilesize: typeof settings.filesize !== 'undefined' ? settings.filesize : 256,\n maxFiles: settings.limit || null,\n resizeWidth: settings.resizeWidth || null,\n resizeHeight: settings.resizeHeight || null,\n resizeQuality: settings.resizeQuality || null,\n resolution: settings.resolution || null,\n accept: function accept(file, done) {\n ACCEPT_FUNC(file, done, settings);\n }\n };\n cache = cache.add(container);\n container = container[0];\n instances.push(new FilesField({\n container: container,\n options: options\n }));\n};\n\nvar Instance = function () {\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('.dropzone.files-upload').each(function (i, container) {\n return addNode(container);\n });\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('body').on('mutation._grav', onAddedNodes);\n return instances;\n}();//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QjtBQU9WakksSUFBQUEsV0FBVyxFQUFFWCxRQUFRLENBQUNXLFdBQVQsSUFBd0IsSUFQM0I7QUFRVkMsSUFBQUEsWUFBWSxFQUFFWixRQUFRLENBQUNZLFlBQVQsSUFBeUIsSUFSN0I7QUFTVmlJLElBQUFBLGFBQWEsRUFBRTdJLFFBQVEsQ0FBQzZJLGFBQVQsSUFBMEIsSUFUL0I7QUFVVjVJLElBQUFBLFVBQVUsRUFBRUQsUUFBUSxDQUFDQyxVQUFULElBQXVCLElBVnpCO0FBV1YzQixJQUFBQSxNQUFNLEVBQUUsZ0JBQVN3QixJQUFULEVBQWVDLElBQWYsRUFBcUI7QUFBRUYsTUFBQUEsV0FBVyxDQUFDQyxJQUFELEVBQU9DLElBQVAsRUFBYUMsUUFBYixDQUFYO0FBQW9DO0FBWHpELEdBQWQ7QUFjQW9JLEVBQUFBLEtBQUssR0FBR0EsS0FBSyxDQUFDVSxHQUFOLENBQVUzRyxTQUFWLENBQVI7QUFDQUEsRUFBQUEsU0FBUyxHQUFHQSxTQUFTLENBQUMsQ0FBRCxDQUFyQjtBQUNBZ0csRUFBQUEsU0FBUyxDQUFDdEQsSUFBVixDQUFlLElBQUkzQyxVQUFKLENBQWU7QUFBRUMsSUFBQUEsU0FBUyxFQUFUQSxTQUFGO0FBQWF4RSxJQUFBQSxPQUFPLEVBQVBBO0FBQWIsR0FBZixDQUFmO0FBQ0gsQ0ExQkQ7O0FBNEJPLElBQUlvTCxRQUFRLEdBQUksWUFBTTtBQUN6QmhOLEVBQUFBLDZDQUFDLENBQUMsd0JBQUQsQ0FBRCxDQUE0QnNJLElBQTVCLENBQWlDLFVBQUMyRSxDQUFELEVBQUk3RyxTQUFKO0FBQUEsV0FBa0JtRyxPQUFPLENBQUNuRyxTQUFELENBQXpCO0FBQUEsR0FBakM7QUFDQXBHLEVBQUFBLDZDQUFDLENBQUMsTUFBRCxDQUFELENBQVUrQyxFQUFWLENBQWEsZ0JBQWIsRUFBK0J1SixZQUEvQjtBQUVBLFNBQU9GLFNBQVA7QUFDSCxDQUxxQixFQUFmIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vR3Jhdi8uL2FwcC9mb3Jtcy9maWVsZHMvZmlsZXMuanM/NjE3OSJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgJCBmcm9tICdqcXVlcnknO1xuaW1wb3J0IERyb3B6b25lIGZyb20gJ2Ryb3B6b25lJztcbi8vIGltcG9ydCBFWElGIGZyb20gJ2V4aWYtanMnO1xuaW1wb3J0IHJlcXVlc3QgZnJvbSAnLi4vLi4vdXRpbHMvcmVxdWVzdCc7XG5pbXBvcnQgeyBjb25maWcsIHRyYW5zbGF0aW9ucyB9IGZyb20gJ2dyYXYtY29uZmlnJztcblxuLy8gdHJhbnNsYXRpb25zXG5jb25zdCBEaWN0aW9uYXJ5ID0ge1xuICAgIGRpY3RDYW5jZWxVcGxvYWQ6IHRyYW5zbGF0aW9ucy5QTFVHSU5fQURNSU4uRFJPUFpPTkVfQ0FOQ0VMX1VQTE9BRCxcbiAgICBkaWN0Q2FuY2VsVXBsb2FkQ29uZmlybWF0aW9uOiB0cmFuc2xhdGlvbnMuUExVR0lOX0FETUlOLkRST1BaT05FX0NBTkNFTF9VUExPQURfQ09ORklSTUFUSU9OLFxuICAgIGRpY3REZWZhdWx0TWVzc2FnZTogdHJhbnNsYXRpb25zLlBMVUdJTl9BRE1JTi5EUk9QWk9ORV9ERUZBVUxUX01FU1NBR0UsXG4gICAgZGljdEZhbGxiYWNrTWVzc2FnZTogdHJhbnNsYXRpb25zLlBMVUdJTl9BRE1JTi5EUk9QWk9ORV9GQUxMQkFDS19NRVNTQUdFLFxuICAgIGRpY3RGYWxsYmFja1RleHQ6IHRyYW5zbGF0aW9ucy5QTFVHSU5fQURNSU4uRFJPUFpPTkVfRkFMTEJBQ0tfVEVYVCxcbiAgICBkaWN0RmlsZVRvb0JpZzogdHJhbnNsYXRpb25zLlBMVUdJTl9BRE1JTi5EUk9QWk9ORV9GSUxFX1RPT19CSUcsXG4gICAgZGljdEludmFsaWRGaWxlVHlwZTogdHJhbnNsYXRpb25zLlBMVUdJTl9BRE1JTi5EUk9QWk9ORV9JTlZBTElEX0ZJTEVfVFlQRSxcbiAgICBkaWN0TWF4RmlsZXNFeGNlZWRlZDogdHJhbnNsYXRpb25zLlBMVUdJTl9BRE1JTi5EUk9QWk9ORV9NQVhfRklMRVNfRVhDRUVERUQsXG4gICAgZGljdFJlbW92ZUZpbGU6IHRyYW5zbGF0aW9ucy5QTFVHSU5fQURNSU4uRFJPUFpPTkVfUkVNT1ZFX0ZJTEUsXG4gICAgZGljdFJlc3BvbnNlRXJyb3I6IHRyYW5zbGF0aW9ucy5QTFVHSU5fQURNSU4uRFJPUFpPTkVfUkVTUE9OU0VfRVJST1Jcbn07XG5cbkRyb3B6b25lLmF1dG9EaXNjb3ZlciA9IGZhbHNlO1xuRHJvcHpvbmUub3B0aW9ucy5ncmF2UGFnZURyb3B6b25lID0ge307XG5Ecm9wem9uZS5jb25maXJtID0gKHF1ZXN0aW9uLCBhY2NlcHRlZCwgcmVqZWN0ZWQpID0+IHtcbiAgICBsZXQgZG9jID0gJChkb2N1bWVudCk7XG4gICAgbGV0IG1vZGFsU2VsZWN0b3IgPSAnW2RhdGEtcmVtb2RhbC1pZD1cImRlbGV0ZS1tZWRpYVwiXSc7XG5cbiAgICBsZXQgcmVtb3ZlRXZlbnRzID0gKCkgPT4ge1xuICAgICAgICBkb2Mub2ZmKCdjb25maXJtYXRpb24nLCBtb2RhbFNlbGVjdG9yLCBhY2NlcHQpO1xuICAgICAgICBkb2Mub2ZmKCdjYW5jZWxsYXRpb24nLCBtb2RhbFNlbGVjdG9yLCByZWplY3QpO1xuXG4gICAgICAgICQobW9kYWxTZWxlY3RvcikuZmluZCgnLnJlbW9kYWwtY29uZmlybScpLnJlbW92ZUNsYXNzKCdwb2ludGVyLWV2ZW50cy1kaXNhYmxlZCcpO1xuICAgIH07XG5cbiAgICBsZXQgYWNjZXB0ID0gKCkgPT4ge1xuICAgICAgICBhY2NlcHRlZCAmJiBhY2NlcHRlZCgpO1xuICAgICAgICByZW1vdmVFdmVudHMoKTtcbiAgICB9O1xuXG4gICAgbGV0IHJlamVjdCA9ICgpID0+IHtcbiAgICAgICAgcmVqZWN0ZWQgJiYgcmVqZWN0ZWQoKTtcbiAgICAgICAgcmVtb3ZlRXZlbnRzKCk7XG4gICAgfTtcblxuICAgICQucmVtb2RhbC5sb29rdXBbJChtb2RhbFNlbGVjdG9yKS5kYXRhKCdyZW1vZGFsJyldLm9wZW4oKTtcbiAgICBkb2Mub24oJ2NvbmZpcm1hdGlvbicsIG1vZGFsU2VsZWN0b3IsIGFjY2VwdCk7XG4gICAgZG9jLm9uKCdjYW5jZWxsYXRpb24nLCBtb2RhbFNlbGVjdG9yLCByZWplY3QpO1xufTtcblxuY29uc3QgRHJvcHpvbmVNZWRpYUNvbmZpZyA9IHtcbiAgICB0aW1lb3V0OiAwLFxuICAgIHRodW1ibmFpbFdpZHRoOiAyMDAsXG4gICAgdGh1bWJuYWlsSGVpZ2h0OiAxNTAsXG4gICAgYWRkUmVtb3ZlTGlua3M6IGZhbHNlLFxuICAgIGRpY3REZWZhdWx0TWVzc2FnZTogdHJhbnNsYXRpb25zLlBMVUdJTl9BRE1JTi5EUk9QX0ZJTEVTX0hFUkVfVE9fVVBMT0FELnJlcGxhY2UoLyZsdDsvZywgJzwnKS5yZXBsYWNlKC8mZ3Q7L2csICc+JyksXG4gICAgZGljdFJlbW92ZUZpbGVDb25maXJtYXRpb246ICdbcGxhY2Vob2xkZXJdJyxcbiAgICBwcmV2aWV3VGVtcGxhdGU6IGBcbiAgICAgICAgPGRpdiBjbGFzcz1cImR6LXByZXZpZXcgZHotZmlsZS1wcmV2aWV3IGR6LW5vLWVkaXRvclwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkei1kZXRhaWxzXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHotZmlsZW5hbWVcIj48c3BhbiBkYXRhLWR6LW5hbWU+PC9zcGFuPjwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR6LXNpemVcIiBkYXRhLWR6LXNpemU+PC9kaXY+XG4gICAgICAgICAgICA8aW1nIGRhdGEtZHotdGh1bWJuYWlsIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImR6LXByb2dyZXNzXCI+PHNwYW4gY2xhc3M9XCJkei11cGxvYWRcIiBkYXRhLWR6LXVwbG9hZHByb2dyZXNzPjwvc3Bhbj48L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHotc3VjY2Vzcy1tYXJrXCI+PHNwYW4+4pyUPC9zcGFuPjwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkei1lcnJvci1tYXJrXCI+PHNwYW4+4pyYPC9zcGFuPjwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkei1lcnJvci1tZXNzYWdlXCI+PHNwYW4gZGF0YS1kei1lcnJvcm1lc3NhZ2U+PC9zcGFuPjwvZGl2PlxuICAgICAgICAgIDxhIGNsYXNzPVwiZHotdW5zZXRcIiB0aXRsZT1cIiR7dHJhbnNsYXRpb25zLlBMVUdJTl9BRE1JTi5VTlNFVH1cIiBocmVmPVwiI1wiIGRhdGEtZHotdW5zZXQ+JHt0cmFuc2xhdGlvbnMuUExVR0lOX0FETUlOLlVOU0VUfTwvYT5cbiAgICAgICAgICA8YSBjbGFzcz1cImR6LXJlbW92ZVwiIHRpdGxlPVwiJHt0cmFuc2xhdGlvbnMuUExVR0lOX0FETUlOLkRFTEVURX1cIiBocmVmPVwiamF2YXNjcmlwdDp1bmRlZmluZWQ7XCIgZGF0YS1kei1yZW1vdmU+JHt0cmFuc2xhdGlvbnMuUExVR0lOX0FETUlOLkRFTEVURX08L2E+XG4gICAgICAgICAgPGEgY2xhc3M9XCJkei1tZXRhZGF0YVwiIHRpdGxlPVwiJHt0cmFuc2xhdGlvbnMuUExVR0lOX0FETUlOLk1FVEFEQVRBfVwiIGhyZWY9XCIjXCIgdGFyZ2V0PVwiX2JsYW5rXCIgZGF0YS1kei1tZXRhZGF0YT4ke3RyYW5zbGF0aW9ucy5QTFVHSU5fQURNSU4uTUVUQURBVEF9PC9hPlxuICAgICAgICAgIDxhIGNsYXNzPVwiZHotdmlld1wiIHRpdGxlPVwiJHt0cmFuc2xhdGlvbnMuUExVR0lOX0FETUlOLlZJRVd9XCIgaHJlZj1cIiNcIiB0YXJnZXQ9XCJfYmxhbmtcIiBkYXRhLWR6LXZpZXc+JHt0cmFuc2xhdGlvbnMuUExVR0lOX0FETUlOLlZJRVd9PC9hPlxuICAgICAgICA8L2Rpdj5gLnRyaW0oKVxufTtcblxuLy8gZ2xvYmFsLkVYSUYgPSBFWElGO1xuXG5jb25zdCBBQ0NFUFRfRlVOQyA9IGZ1bmN0aW9uKGZpbGUsIGRvbmUsIHNldHRpbmdzKSB7XG4gICAgY29uc3QgcmVzb2x1dGlvbiA9IHNldHRpbmdzLnJlc29sdXRpb247XG4gICAgaWYgKCFyZXNvbHV0aW9uKSByZXR1cm4gZG9uZSgpO1xuXG4gICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICBsZXQgZXJyb3IgPSAnJztcbiAgICBjb25zdCBoYXNNaW4gPSAocmVzb2x1dGlvbi5taW4gJiYgKHJlc29sdXRpb24ubWluLndpZHRoIHx8IHJlc29sdXRpb24ubWluLmhlaWdodCkpO1xuICAgIGNvbnN0IGhhc01heCA9IChyZXNvbHV0aW9uLm1heCAmJiAocmVzb2x1dGlvbi5tYXgud2lkdGggfHwgcmVzb2x1dGlvbi5tYXguaGVpZ2h0KSk7XG4gICAgaWYgKGhhc01pbiB8fCAoIShzZXR0aW5ncy5yZXNpemVXaWR0aCB8fCBzZXR0aW5ncy5yZXNpemVIZWlnaHQpICYmIGhhc01heCkpIHtcbiAgICAgICAgcmVhZGVyLm9ubG9hZCA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgICAgICBpZiAoIS9pbWFnZVxcLy8udGVzdChmaWxlLnR5cGUpKSB7XG4gICAgICAgICAgICAgIGRvbmUoKTtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBpbWFnZSA9IG5ldyBJbWFnZSgpO1xuICAgICAgICAgICAgaW1hZ2Uuc3JjID0gZXZlbnQudGFyZ2V0LnJlc3VsdDtcbiAgICAgICAgICAgIGltYWdlLm9uZXJyb3IgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICBkb25lKHRyYW5zbGF0aW9ucy5QTFVHSU5fQURNSU4uRklMRV9FUlJPUl9VUExPQUQpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGltYWdlLm9ubG9hZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIGlmIChyZXNvbHV0aW9uLm1pbikge1xuICAgICAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhyZXNvbHV0aW9uLm1pbikuZm9yRWFjaCgoYXR0cikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc29sdXRpb24ubWluW2F0dHJdICYmIHRoaXNbYXR0cl0gPCByZXNvbHV0aW9uLm1pblthdHRyXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yICs9IHRyYW5zbGF0aW9ucy5QTFVHSU5fRk9STS5SRVNPTFVUSU9OX01JTi5yZXBsYWNlKC97e2F0dHJ9fS9nLCBhdHRyKS5yZXBsYWNlKC97e21pbn19L2csIHJlc29sdXRpb24ubWluW2F0dHJdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKCEoc2V0dGluZ3MucmVzaXplV2lkdGggfHwgc2V0dGluZ3MucmVzaXplSGVpZ2h0KSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzb2x1dGlvbi5tYXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKHJlc29sdXRpb24ubWF4KS5mb3JFYWNoKChhdHRyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc29sdXRpb24ubWF4W2F0dHJdICYmIHRoaXNbYXR0cl0gPiByZXNvbHV0aW9uLm1heFthdHRyXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvciArPSB0cmFuc2xhdGlvbnMuUExVR0lOX0ZPUk0uUkVTT0xVVElPTl9NQVgucmVwbGFjZSgve3thdHRyfX0vZywgYXR0cikucmVwbGFjZSgve3ttYXh9fS9nLCByZXNvbHV0aW9uLm1heFthdHRyXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBVUkwucmV2b2tlT2JqZWN0VVJMKGltYWdlLnNyYyk7IC8vIHJlbGVhc2UgbWVtb3J5XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yID8gZG9uZShlcnJvcikgOiBkb25lKCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9O1xuXG4gICAgICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGZpbGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBlcnJvciA/IGRvbmUoZXJyb3IpIDogZG9uZSgpO1xuICAgIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEZpbGVzRmllbGQge1xuICAgIGNvbnN0cnVjdG9yKHsgY29udGFpbmVyID0gJy5kcm9wem9uZS5maWxlcy11cGxvYWQnLCBvcHRpb25zID0ge30gfSA9IHt9KSB7XG4gICAgICAgIHRoaXMuY29udGFpbmVyID0gJChjb250YWluZXIpO1xuICAgICAgICBpZiAoIXRoaXMuY29udGFpbmVyLmxlbmd0aCkgeyByZXR1cm47IH1cblxuICAgICAgICB0aGlzLnVybHMgPSB7fTtcbiAgICAgICAgdGhpcy5jdXN0b21Qb3N0ID0gdGhpcy5jb250YWluZXIuZGF0YSgnZmlsZVBvc3RBZGQnKSB8fCB7fTtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgRGljdGlvbmFyeSwgRHJvcHpvbmVNZWRpYUNvbmZpZywge1xuICAgICAgICAgICAga2xhc3M6IHRoaXMsXG4gICAgICAgICAgICB1cmw6IHRoaXMuY29udGFpbmVyLmRhdGEoJ2ZpbGUtdXJsLWFkZCcpIHx8IGNvbmZpZy5jdXJyZW50X3VybCxcbiAgICAgICAgICAgIGFjY2VwdGVkRmlsZXM6IHRoaXMuY29udGFpbmVyLmRhdGEoJ21lZGlhLXR5cGVzJyksXG4gICAgICAgICAgICBpbml0OiB0aGlzLmluaXREcm9wem9uZVxuICAgICAgICB9LCB0aGlzLmNvbnRhaW5lci5kYXRhKCdkcm9wem9uZS1vcHRpb25zJyksIG9wdGlvbnMpO1xuXG4gICAgICAgIHRoaXMub3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMub3B0aW9ucywge1xuICAgICAgICAgICAgYWNjZXB0OiBmdW5jdGlvbihmaWxlLCBkb25lKSB7IEFDQ0VQVF9GVU5DKGZpbGUsIGRvbmUsIHRoaXMub3B0aW9ucyk7IH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5kcm9wem9uZSA9IG5ldyBEcm9wem9uZShjb250YWluZXIsIHRoaXMub3B0aW9ucyk7XG4gICAgICAgIHRoaXMuZHJvcHpvbmUub24oJ2NvbXBsZXRlJywgdGhpcy5vbkRyb3B6b25lQ29tcGxldGUuYmluZCh0aGlzKSk7XG4gICAgICAgIHRoaXMuZHJvcHpvbmUub24oJ3N1Y2Nlc3MnLCB0aGlzLm9uRHJvcHpvbmVTdWNjZXNzLmJpbmQodGhpcykpO1xuICAgICAgICB0aGlzLmRyb3B6b25lLm9uKCdyZW1vdmVkZmlsZScsIHRoaXMub25Ecm9wem9uZVJlbW92ZWRGaWxlLmJpbmQodGhpcykpO1xuICAgICAgICB0aGlzLmRyb3B6b25lLm9uKCdzZW5kaW5nJywgdGhpcy5vbkRyb3B6b25lU2VuZGluZy5iaW5kKHRoaXMpKTtcbiAgICAgICAgdGhpcy5kcm9wem9uZS5vbignZXJyb3InLCB0aGlzLm9uRHJvcHpvbmVFcnJvci5iaW5kKHRoaXMpKTtcblxuICAgICAgICB0aGlzLmNvbnRhaW5lci5vbignbW91c2VlbnRlcicsICdbZGF0YS1kei12aWV3XScsIChlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IEpTT04ucGFyc2UodGhpcy5jb250YWluZXIuZmluZCgnW25hbWVdW3R5cGU9XCJoaWRkZW5cIl0nKS52YWwoKSB8fCAne30nKTtcbiAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9ICQoZS5jdXJyZW50VGFyZ2V0KTtcbiAgICAgICAgICAgIGNvbnN0IGZpbGUgPSB0YXJnZXQucGFyZW50KCcuZHotcHJldmlldycpLmZpbmQoJy5kei1maWxlbmFtZScpO1xuICAgICAgICAgICAgY29uc3QgZmlsZW5hbWUgPSBlbmNvZGVVUkkoZmlsZS50ZXh0KCkpO1xuXG4gICAgICAgICAgICBjb25zdCBVUkwgPSBPYmplY3Qua2V5cyh2YWx1ZSkuZmlsdGVyKChrZXkpID0+IHZhbHVlW2tleV0ubmFtZSA9PT0gZmlsZW5hbWUpLnNoaWZ0KCk7XG4gICAgICAgICAgICB0YXJnZXQuYXR0cignaHJlZicsIGAke2NvbmZpZy5iYXNlX3VybF9zaW1wbGV9LyR7VVJMfWApO1xuICAgICAgICB9KTtcblxuICAgIH1cblxuICAgIGluaXREcm9wem9uZSgpIHtcbiAgICAgICAgbGV0IGZpbGVzID0gdGhpcy5vcHRpb25zLmtsYXNzLmNvbnRhaW5lci5maW5kKCdbZGF0YS1maWxlXScpO1xuICAgICAgICBsZXQgZHJvcHpvbmUgPSB0aGlzO1xuICAgICAgICBpZiAoIWZpbGVzLmxlbmd0aCkgeyByZXR1cm47IH1cblxuICAgICAgICBmaWxlcy5lYWNoKChpbmRleCwgZmlsZSkgPT4ge1xuICAgICAgICAgICAgZmlsZSA9ICQoZmlsZSk7XG4gICAgICAgICAgICBsZXQgZGF0YSA9IGZpbGUuZGF0YSgnZmlsZScpO1xuICAgICAgICAgICAgbGV0IG1vY2sgPSB7XG4gICAgICAgICAgICAgICAgbmFtZTogZGF0YS5uYW1lLFxuICAgICAgICAgICAgICAgIHNpemU6IGRhdGEuc2l6ZSxcbiAgICAgICAgICAgICAgICB0eXBlOiBkYXRhLnR5cGUsXG4gICAgICAgICAgICAgICAgc3RhdHVzOiBEcm9wem9uZS5BRERFRCxcbiAgICAgICAgICAgICAgICBhY2NlcHRlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICB1cmw6IHRoaXMub3B0aW9ucy51cmwsXG4gICAgICAgICAgICAgICAgcmVtb3ZlVXJsOiBkYXRhLnJlbW92ZVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgZHJvcHpvbmUuZmlsZXMucHVzaChtb2NrKTtcbiAgICAgICAgICAgIGRyb3B6b25lLm9wdGlvbnMuYWRkZWRmaWxlLmNhbGwoZHJvcHpvbmUsIG1vY2spO1xuICAgICAgICAgICAgaWYgKG1vY2sudHlwZS5tYXRjaCgvXmltYWdlXFwvLykpIHtcbiAgICAgICAgICAgICAgICBkcm9wem9uZS5vcHRpb25zLnRodW1ibmFpbC5jYWxsKGRyb3B6b25lLCBtb2NrLCBkYXRhLnBhdGgpO1xuICAgICAgICAgICAgICAgIGRyb3B6b25lLmNyZWF0ZVRodW1ibmFpbEZyb21VcmwobW9jaywgZGF0YS5wYXRoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZmlsZS5yZW1vdmUoKTtcbiAgICAgICAgfSk7XG5cbiAgICB9XG5cbiAgICBnZXRVUkkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRhaW5lci5kYXRhKCdtZWRpYVVyaScpIHx8ICcnO1xuICAgIH1cblxuICAgIG9uRHJvcHpvbmVTZW5kaW5nKGZpbGUsIHhociwgZm9ybURhdGEpIHtcbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKHRoaXMuY3VzdG9tUG9zdCkubGVuZ3RoKSB7XG4gICAgICAgICAgICBPYmplY3Qua2V5cyh0aGlzLmN1c3RvbVBvc3QpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZChrZXksIHRoaXMuY3VzdG9tUG9zdFtrZXldKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZm9ybURhdGEuYXBwZW5kKCduYW1lJywgdGhpcy5vcHRpb25zLmRvdE5vdGF0aW9uKTtcbiAgICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZCgndGFzaycsICdmaWxlc3VwbG9hZCcpO1xuICAgICAgICAgICAgZm9ybURhdGEuYXBwZW5kKCd1cmknLCB0aGlzLmdldFVSSSgpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvcm1EYXRhLmFwcGVuZCgnYWRtaW4tbm9uY2UnLCBjb25maWcuYWRtaW5fbm9uY2UpO1xuICAgIH1cblxuICAgIG9uRHJvcHpvbmVTdWNjZXNzKGZpbGUsIHJlc3BvbnNlLCB4aHIpIHtcbiAgICAgICAgcmVzcG9uc2UgPSB0eXBlb2YgcmVzcG9uc2UgPT09ICdzdHJpbmcnID8gSlNPTi5wYXJzZShyZXNwb25zZSkgOiByZXNwb25zZTtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5yZWxvYWRQYWdlKSB7XG4gICAgICAgICAgICBnbG9iYWwubG9jYXRpb24ucmVsb2FkKCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBzdG9yZSBwYXJhbXMgZm9yIHJlbW92aW5nIGZpbGUgZnJvbSBzZXNzaW9uIGJlZm9yZSBpdCBnZXRzIHNhdmVkXG4gICAgICAgIGlmIChyZXNwb25zZS5zZXNzaW9uKSB7XG4gICAgICAgICAgICBmaWxlLnNlc3Npb25QYXJhbXMgPSByZXNwb25zZS5zZXNzaW9uO1xuICAgICAgICAgICAgZmlsZS5yZW1vdmVVcmwgPSB0aGlzLm9wdGlvbnMudXJsO1xuXG4gICAgICAgICAgICAvLyBUb3VjaCBmaWVsZCB2YWx1ZSB0byBmb3JjZSBhIG11dGF0aW9uIGRldGVjdGlvblxuICAgICAgICAgICAgY29uc3QgaW5wdXQgPSB0aGlzLmNvbnRhaW5lci5maW5kKCdbbmFtZV1bdHlwZT1cImhpZGRlblwiXScpO1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBpbnB1dC52YWwoKTtcbiAgICAgICAgICAgIGlucHV0LnZhbCh2YWx1ZSArICcgJyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5oYW5kbGVFcnJvcih7XG4gICAgICAgICAgICBmaWxlLFxuICAgICAgICAgICAgZGF0YTogcmVzcG9uc2UsXG4gICAgICAgICAgICBtb2RlOiAncmVtb3ZlRmlsZScsXG4gICAgICAgICAgICBtc2c6IGA8cD4ke3RyYW5zbGF0aW9ucy5QTFVHSU5fQURNSU4uRklMRV9FUlJPUl9VUExPQUR9IDxzdHJvbmc+e3tmaWxlTmFtZX19PC9zdHJvbmc+PC9wPlxuICAgICAgICAgICAgPHByZT4ke3Jlc3BvbnNlLm1lc3NhZ2V9PC9wcmU+YFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBvbkRyb3B6b25lQ29tcGxldGUoZmlsZSkge1xuICAgICAgICBpZiAoIWZpbGUuYWNjZXB0ZWQgJiYgIWZpbGUucmVqZWN0ZWQpIHtcbiAgICAgICAgICAgIGxldCBkYXRhID0ge1xuICAgICAgICAgICAgICAgIHN0YXR1czogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBgJHt0cmFuc2xhdGlvbnMuUExVR0lOX0FETUlOLkZJTEVfVU5TVVBQT1JURUR9OiAke2ZpbGUubmFtZS5tYXRjaCgvXFwuLisvKS5qb2luKCcnKX1gXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5oYW5kbGVFcnJvcih7XG4gICAgICAgICAgICAgICAgZmlsZSxcbiAgICAgICAgICAgICAgICBkYXRhLFxuICAgICAgICAgICAgICAgIG1vZGU6ICdyZW1vdmVGaWxlJyxcbiAgICAgICAgICAgICAgICBtc2c6IGA8cD4ke3RyYW5zbGF0aW9ucy5QTFVHSU5fQURNSU4uRklMRV9FUlJPUl9BRER9IDxzdHJvbmc+e3tmaWxlTmFtZX19PC9zdHJvbmc+PC9wPlxuICAgICAgICAgICAgICAgIDxwcmU+JHtkYXRhLm1lc3NhZ2V9PC9wcmU+YFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnJlbG9hZFBhZ2UpIHtcbiAgICAgICAgICAgIGdsb2JhbC5sb2NhdGlvbi5yZWxvYWQoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGI2NF90b191dGY4KHN0cikge1xuICAgICAgICBzdHIgPSBzdHIucmVwbGFjZSgvXFxzL2csICcnKTtcbiAgICAgICAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChlc2NhcGUod2luZG93LmF0b2Ioc3RyKSkpO1xuICAgIH1cblxuICAgIG9uRHJvcHpvbmVSZW1vdmVkRmlsZShmaWxlLCAuLi5leHRyYSkge1xuICAgICAgICBpZiAoIWZpbGUuYWNjZXB0ZWQgfHwgZmlsZS5yZWplY3RlZCkgeyByZXR1cm47IH1cbiAgICAgICAgbGV0IHVybCA9IGZpbGUucmVtb3ZlVXJsIHx8IHRoaXMudXJscy5kZWxldGUgfHwgdGhpcy5vcHRpb25zLnVybDtcbiAgICAgICAgbGV0IHBhdGggPSAodXJsIHx8ICcnKS5tYXRjaCgvcGF0aDooLiopXFwvLyk7XG4gICAgICAgIGxldCBib2R5ID0geyBmaWxlbmFtZTogZmlsZS5uYW1lLCB1cmk6IHRoaXMuZ2V0VVJJKCkgfTtcblxuICAgICAgICBpZiAoZmlsZS5zZXNzaW9uUGFyYW1zKSB7XG4gICAgICAgICAgICBib2R5LnRhc2sgPSAnZmlsZXNzZXNzaW9ucmVtb3ZlJztcbiAgICAgICAgICAgIGJvZHkuc2Vzc2lvbiA9IGZpbGUuc2Vzc2lvblBhcmFtcztcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGN1c3RvbVBvc3QgPSB0aGlzLmNvbnRhaW5lci5kYXRhKCdmaWxlUG9zdFJlbW92ZScpIHx8IHt9O1xuICAgICAgICBpZiAoT2JqZWN0LmtleXMoY3VzdG9tUG9zdCkubGVuZ3RoKSB7XG4gICAgICAgICAgICBib2R5ID0ge307XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhjdXN0b21Qb3N0KS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgICAgICAgICBib2R5W2tleV0gPSBjdXN0b21Qb3N0W2tleV07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGJvZHlbJ2ZpbGVuYW1lJ10gPSBmaWxlLm5hbWU7XG4gICAgICAgIGJvZHlbJ2FkbWluLW5vbmNlJ10gPSBjb25maWcuYWRtaW5fbm9uY2U7XG5cbiAgICAgICAgcmVxdWVzdCh1cmwsIHsgbWV0aG9kOiAncG9zdCcsIGJvZHkgfSwgKCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFwYXRoKSB7IHJldHVybjsgfVxuXG4gICAgICAgICAgICBwYXRoID0gdGhpcy5iNjRfdG9fdXRmOChwYXRoWzFdKTtcbiAgICAgICAgICAgIGxldCBpbnB1dCA9IHRoaXMuY29udGFpbmVyLmZpbmQoJ1tuYW1lXVt0eXBlPVwiaGlkZGVuXCJdJyk7XG4gICAgICAgICAgICBsZXQgZGF0YSA9IEpTT04ucGFyc2UoaW5wdXQudmFsKCkgfHwgJ3t9Jyk7XG4gICAgICAgICAgICBkZWxldGUgZGF0YVtwYXRoXTtcbiAgICAgICAgICAgIGlucHV0LnZhbChKU09OLnN0cmluZ2lmeShkYXRhKSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIG9uRHJvcHpvbmVFcnJvcihmaWxlLCByZXNwb25zZSwgeGhyKSB7XG4gICAgICAgIGxldCBtZXNzYWdlID0geGhyID8gcmVzcG9uc2UuZXJyb3IubWVzc2FnZSA6IHJlc3BvbnNlO1xuICAgICAgICAkKGZpbGUucHJldmlld0VsZW1lbnQpLmZpbmQoJ1tkYXRhLWR6LWVycm9ybWVzc2FnZV0nKS5odG1sKG1lc3NhZ2UpO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmhhbmRsZUVycm9yKHtcbiAgICAgICAgICAgIGZpbGUsXG4gICAgICAgICAgICBkYXRhOiB7IHN0YXR1czogJ2Vycm9yJyB9LFxuICAgICAgICAgICAgbXNnOiBgPHByZT4ke21lc3NhZ2V9PC9wcmU+YFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBoYW5kbGVFcnJvcihvcHRpb25zKSB7XG4gICAgICAgIGxldCB7IGZpbGUsIGRhdGEsIG1vZGUsIG1zZyB9ID0gb3B0aW9ucztcbiAgICAgICAgaWYgKGRhdGEuc3RhdHVzICE9PSAnZXJyb3InICYmIGRhdGEuc3RhdHVzICE9PSAndW5hdXRob3JpemVkJykgeyByZXR1cm47IH1cblxuICAgICAgICBzd2l0Y2ggKG1vZGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ2FkZEJhY2snOlxuICAgICAgICAgICAgICAgIGlmIChmaWxlIGluc3RhbmNlb2YgRmlsZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRyb3B6b25lLmFkZEZpbGUuY2FsbCh0aGlzLmRyb3B6b25lLCBmaWxlKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRyb3B6b25lLmZpbGVzLnB1c2goZmlsZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZHJvcHpvbmUub3B0aW9ucy5hZGRlZGZpbGUuY2FsbCh0aGlzLmRyb3B6b25lLCBmaWxlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kcm9wem9uZS5vcHRpb25zLnRodW1ibmFpbC5jYWxsKHRoaXMuZHJvcHpvbmUsIGZpbGUsIGZpbGUuZXh0cmFzLnVybCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdyZW1vdmVGaWxlJzpcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgaWYgKH50aGlzLmRyb3B6b25lLmZpbGVzLmluZGV4T2YoZmlsZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgZmlsZS5yZWplY3RlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZHJvcHpvbmUucmVtb3ZlRmlsZS5jYWxsKHRoaXMuZHJvcHpvbmUsIGZpbGUsIHsgc2lsZW50OiB0cnVlIH0pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IG1vZGFsID0gJCgnW2RhdGEtcmVtb2RhbC1pZD1cImdlbmVyaWNcIl0nKTtcbiAgICAgICAgY29uc3QgY2xlYW5OYW1lID0gZmlsZS5uYW1lLnJlcGxhY2UoJzwnLCAnJmx0OycpLnJlcGxhY2UoJz4nLCAnJmd0OycpO1xuXG4gICAgICAgIG1vZGFsLmZpbmQoJy5lcnJvci1jb250ZW50JykuaHRtbChtc2cucmVwbGFjZSgne3tmaWxlTmFtZX19JywgY2xlYW5OYW1lKSk7XG4gICAgICAgICQucmVtb2RhbC5sb29rdXBbbW9kYWwuZGF0YSgncmVtb2RhbCcpXS5vcGVuKCk7XG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gVXJpVG9NYXJrZG93bih1cmkpIHtcbiAgICB1cmkgPSB1cmkucmVwbGFjZSgvQDN4fEAyeHxAMXgvLCAnJyk7XG4gICAgdXJpID0gdXJpLnJlcGxhY2UoL1xcKC9nLCAnJTI4Jyk7XG4gICAgdXJpID0gdXJpLnJlcGxhY2UoL1xcKS9nLCAnJTI5Jyk7XG5cbiAgICBjb25zdCB0aXRsZSA9IHVyaS5zcGxpdCgnLicpLnNsaWNlKDAsIC0xKS5qb2luKCcuJyk7XG5cbiAgICByZXR1cm4gdXJpLm1hdGNoKC9cXC4oanBlP2d8cG5nfGdpZnxzdmd8d2VicHxtcDR8d2VibXxvZ3Z8bW92KSQvaSkgPyBgIVske3RpdGxlfV0oJHt1cml9IFwiJHt0aXRsZX1cIilgIDogYFske2RlY29kZVVSSSh1cmkpfV0oJHt1cml9KWA7XG59XG5cbmxldCBpbnN0YW5jZXMgPSBbXTtcbmxldCBjYWNoZSA9ICQoKTtcbmNvbnN0IG9uQWRkZWROb2RlcyA9IChldmVudCwgdGFyZ2V0LyogLCByZWNvcmQsIGluc3RhbmNlICovKSA9PiB7XG4gICAgbGV0IGZpbGVzID0gJCh0YXJnZXQpLmZpbmQoJy5kcm9wem9uZS5maWxlcy11cGxvYWQnKTtcbiAgICBpZiAoIWZpbGVzLmxlbmd0aCkgeyByZXR1cm47IH1cblxuICAgIGZpbGVzLmVhY2goKGluZGV4LCBmaWxlKSA9PiB7XG4gICAgICAgIGZpbGUgPSAkKGZpbGUpO1xuICAgICAgICBpZiAoIX5jYWNoZS5pbmRleChmaWxlKSkge1xuICAgICAgICAgICAgYWRkTm9kZShmaWxlKTtcbiAgICAgICAgfVxuICAgIH0pO1xufTtcblxuY29uc3QgYWRkTm9kZSA9IChjb250YWluZXIpID0+IHtcbiAgICBjb250YWluZXIgPSAkKGNvbnRhaW5lcik7XG4gICAgbGV0IGlucHV0ID0gY29udGFpbmVyLmZpbmQoJ2lucHV0W3R5cGU9XCJmaWxlXCJdJyk7XG4gICAgbGV0IHNldHRpbmdzID0gY29udGFpbmVyLmRhdGEoJ2dyYXYtZmlsZS1zZXR0aW5ncycpIHx8IHt9O1xuXG4gICAgaWYgKHNldHRpbmdzLmFjY2VwdCAmJiB+c2V0dGluZ3MuYWNjZXB0LmluZGV4T2YoJyonKSkge1xuICAgICAgICBzZXR0aW5ncy5hY2NlcHQgPSBbJyddO1xuICAgIH1cblxuICAgIGxldCBvcHRpb25zID0ge1xuICAgICAgICB1cmw6IGNvbnRhaW5lci5kYXRhKCdmaWxlLXVybC1hZGQnKSB8fCAoY29udGFpbmVyLmNsb3Nlc3QoJ2Zvcm0nKS5hdHRyKCdhY3Rpb24nKSB8fCBjb25maWcuY3VycmVudF91cmwpICsgJy5qc29uJyxcbiAgICAgICAgcGFyYW1OYW1lOiBzZXR0aW5ncy5wYXJhbU5hbWUgfHwgJ2ZpbGUnLFxuICAgICAgICBkb3ROb3RhdGlvbjogc2V0dGluZ3MubmFtZSB8fCAnZmlsZScsXG4gICAgICAgIGFjY2VwdGVkRmlsZXM6IHNldHRpbmdzLmFjY2VwdCA/IHNldHRpbmdzLmFjY2VwdC5qb2luKCcsJykgOiBpbnB1dC5hdHRyKCdhY2NlcHQnKSB8fCBjb250YWluZXIuZGF0YSgnbWVkaWEtdHlwZXMnKSxcbiAgICAgICAgbWF4RmlsZXNpemU6IHR5cGVvZiBzZXR0aW5ncy5maWxlc2l6ZSAhPT0gJ3VuZGVmaW5lZCcgPyBzZXR0aW5ncy5maWxlc2l6ZSA6IDI1NixcbiAgICAgICAgbWF4RmlsZXM6IHNldHRpbmdzLmxpbWl0IHx8IG51bGwsXG4gICAgICAgIHJlc2l6ZVdpZHRoOiBzZXR0aW5ncy5yZXNpemVXaWR0aCB8fCBudWxsLFxuICAgICAgICByZXNpemVIZWlnaHQ6IHNldHRpbmdzLnJlc2l6ZUhlaWdodCB8fCBudWxsLFxuICAgICAgICByZXNpemVRdWFsaXR5OiBzZXR0aW5ncy5yZXNpemVRdWFsaXR5IHx8IG51bGwsXG4gICAgICAgIHJlc29sdXRpb246IHNldHRpbmdzLnJlc29sdXRpb24gfHwgbnVsbCxcbiAgICAgICAgYWNjZXB0OiBmdW5jdGlvbihmaWxlLCBkb25lKSB7IEFDQ0VQVF9GVU5DKGZpbGUsIGRvbmUsIHNldHRpbmdzKTsgfVxuICAgIH07XG5cbiAgICBjYWNoZSA9IGNhY2hlLmFkZChjb250YWluZXIpO1xuICAgIGNvbnRhaW5lciA9IGNvbnRhaW5lclswXTtcbiAgICBpbnN0YW5jZXMucHVzaChuZXcgRmlsZXNGaWVsZCh7IGNvbnRhaW5lciwgb3B0aW9ucyB9KSk7XG59O1xuXG5leHBvcnQgbGV0IEluc3RhbmNlID0gKCgpID0+IHtcbiAgICAkKCcuZHJvcHpvbmUuZmlsZXMtdXBsb2FkJykuZWFjaCgoaSwgY29udGFpbmVyKSA9PiBhZGROb2RlKGNvbnRhaW5lcikpO1xuICAgICQoJ2JvZHknKS5vbignbXV0YXRpb24uX2dyYXYnLCBvbkFkZGVkTm9kZXMpO1xuXG4gICAgcmV0dXJuIGluc3RhbmNlcztcbn0pKCk7XG4iXSwibmFtZXMiOlsiJCIsIkRyb3B6b25lIiwicmVxdWVzdCIsImNvbmZpZyIsInRyYW5zbGF0aW9ucyIsIkRpY3Rpb25hcnkiLCJkaWN0Q2FuY2VsVXBsb2FkIiwiUExVR0lOX0FETUlOIiwiRFJPUFpPTkVfQ0FOQ0VMX1VQTE9BRCIsImRpY3RDYW5jZWxVcGxvYWRDb25maXJtYXRpb24iLCJEUk9QWk9ORV9DQU5DRUxfVVBMT0FEX0NPTkZJUk1BVElPTiIsImRpY3REZWZhdWx0TWVzc2FnZSIsIkRST1BaT05FX0RFRkFVTFRfTUVTU0FHRSIsImRpY3RGYWxsYmFja01lc3NhZ2UiLCJEUk9QWk9ORV9GQUxMQkFDS19NRVNTQUdFIiwiZGljdEZhbGxiYWNrVGV4dCIsIkRST1BaT05FX0ZBTExCQUNLX1RFWFQiLCJkaWN0RmlsZVRvb0JpZyIsIkRST1BaT05FX0ZJTEVfVE9PX0JJRyIsImRpY3RJbnZhbGlkRmlsZVR5cGUiLCJEUk9QWk9ORV9JTlZBTElEX0ZJTEVfVFlQRSIsImRpY3RNYXhGaWxlc0V4Y2VlZGVkIiwiRFJPUFpPTkVfTUFYX0ZJTEVTX0VYQ0VFREVEIiwiZGljdFJlbW92ZUZpbGUiLCJEUk9QWk9ORV9SRU1PVkVfRklMRSIsImRpY3RSZXNwb25zZUVycm9yIiwiRFJPUFpPTkVfUkVTUE9OU0VfRVJST1IiLCJhdXRvRGlzY292ZXIiLCJvcHRpb25zIiwiZ3JhdlBhZ2VEcm9wem9uZSIsImNvbmZpcm0iLCJxdWVzdGlvbiIsImFjY2VwdGVkIiwicmVqZWN0ZWQiLCJkb2MiLCJkb2N1bWVudCIsIm1vZGFsU2VsZWN0b3IiLCJyZW1vdmVFdmVudHMiLCJvZmYiLCJhY2NlcHQiLCJyZWplY3QiLCJmaW5kIiwicmVtb3ZlQ2xhc3MiLCJyZW1vZGFsIiwibG9va3VwIiwiZGF0YSIsIm9wZW4iLCJvbiIsIkRyb3B6b25lTWVkaWFDb25maWciLCJ0aW1lb3V0IiwidGh1bWJuYWlsV2lkdGgiLCJ0aHVtYm5haWxIZWlnaHQiLCJhZGRSZW1vdmVMaW5rcyIsIkRST1BfRklMRVNfSEVSRV9UT19VUExPQUQiLCJyZXBsYWNlIiwiZGljdFJlbW92ZUZpbGVDb25maXJtYXRpb24iLCJwcmV2aWV3VGVtcGxhdGUiLCJVTlNFVCIsIkRFTEVURSIsIk1FVEFEQVRBIiwiVklFVyIsInRyaW0iLCJBQ0NFUFRfRlVOQyIsImZpbGUiLCJkb25lIiwic2V0dGluZ3MiLCJyZXNvbHV0aW9uIiwicmVhZGVyIiwiRmlsZVJlYWRlciIsImVycm9yIiwiaGFzTWluIiwibWluIiwid2lkdGgiLCJoZWlnaHQiLCJoYXNNYXgiLCJtYXgiLCJyZXNpemVXaWR0aCIsInJlc2l6ZUhlaWdodCIsIm9ubG9hZCIsImV2ZW50IiwidGVzdCIsInR5cGUiLCJpbWFnZSIsIkltYWdlIiwic3JjIiwidGFyZ2V0IiwicmVzdWx0Iiwib25lcnJvciIsIkZJTEVfRVJST1JfVVBMT0FEIiwiT2JqZWN0Iiwia2V5cyIsImZvckVhY2giLCJhdHRyIiwiUExVR0lOX0ZPUk0iLCJSRVNPTFVUSU9OX01JTiIsIlJFU09MVVRJT05fTUFYIiwiVVJMIiwicmV2b2tlT2JqZWN0VVJMIiwicmVhZEFzRGF0YVVSTCIsIkZpbGVzRmllbGQiLCJjb250YWluZXIiLCJsZW5ndGgiLCJ1cmxzIiwiY3VzdG9tUG9zdCIsImFzc2lnbiIsImtsYXNzIiwidXJsIiwiY3VycmVudF91cmwiLCJhY2NlcHRlZEZpbGVzIiwiaW5pdCIsImluaXREcm9wem9uZSIsImRyb3B6b25lIiwib25Ecm9wem9uZUNvbXBsZXRlIiwiYmluZCIsIm9uRHJvcHpvbmVTdWNjZXNzIiwib25Ecm9wem9uZVJlbW92ZWRGaWxlIiwib25Ecm9wem9uZVNlbmRpbmciLCJvbkRyb3B6b25lRXJyb3IiLCJlIiwidmFsdWUiLCJKU09OIiwicGFyc2UiLCJ2YWwiLCJjdXJyZW50VGFyZ2V0IiwicGFyZW50IiwiZmlsZW5hbWUiLCJlbmNvZGVVUkkiLCJ0ZXh0IiwiZmlsdGVyIiwia2V5IiwibmFtZSIsInNoaWZ0IiwiYmFzZV91cmxfc2ltcGxlIiwiZmlsZXMiLCJlYWNoIiwiaW5kZXgiLCJtb2NrIiwic2l6ZSIsInN0YXR1cyIsIkFEREVEIiwicmVtb3ZlVXJsIiwicmVtb3ZlIiwicHVzaCIsImFkZGVkZmlsZSIsImNhbGwiLCJtYXRjaCIsInRodW1ibmFpbCIsInBhdGgiLCJjcmVhdGVUaHVtYm5haWxGcm9tVXJsIiwieGhyIiwiZm9ybURhdGEiLCJhcHBlbmQiLCJkb3ROb3RhdGlvbiIsImdldFVSSSIsImFkbWluX25vbmNlIiwicmVzcG9uc2UiLCJyZWxvYWRQYWdlIiwiZ2xvYmFsIiwibG9jYXRpb24iLCJyZWxvYWQiLCJzZXNzaW9uIiwic2Vzc2lvblBhcmFtcyIsImlucHV0IiwiaGFuZGxlRXJyb3IiLCJtb2RlIiwibXNnIiwibWVzc2FnZSIsIkZJTEVfVU5TVVBQT1JURUQiLCJqb2luIiwiRklMRV9FUlJPUl9BREQiLCJzdHIiLCJkZWNvZGVVUklDb21wb25lbnQiLCJlc2NhcGUiLCJ3aW5kb3ciLCJhdG9iIiwiYm9keSIsInVyaSIsInRhc2siLCJtZXRob2QiLCJiNjRfdG9fdXRmOCIsInN0cmluZ2lmeSIsInByZXZpZXdFbGVtZW50IiwiaHRtbCIsIkZpbGUiLCJhZGRGaWxlIiwiZXh0cmFzIiwiaW5kZXhPZiIsInJlbW92ZUZpbGUiLCJzaWxlbnQiLCJtb2RhbCIsImNsZWFuTmFtZSIsIlVyaVRvTWFya2Rvd24iLCJ0aXRsZSIsInNwbGl0Iiwic2xpY2UiLCJkZWNvZGVVUkkiLCJpbnN0YW5jZXMiLCJjYWNoZSIsIm9uQWRkZWROb2RlcyIsImFkZE5vZGUiLCJjbG9zZXN0IiwicGFyYW1OYW1lIiwibWF4RmlsZXNpemUiLCJmaWxlc2l6ZSIsIm1heEZpbGVzIiwibGltaXQiLCJyZXNpemVRdWFsaXR5IiwiYWRkIiwiSW5zdGFuY2UiLCJpIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./app/forms/fields/files.js\n"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ FilesField),\n/* harmony export */ \"UriToMarkdown\": () => (/* binding */ UriToMarkdown),\n/* harmony export */ \"Instance\": () => (/* binding */ Instance)\n/* harmony export */ });\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jquery */ \"jquery\");\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var dropzone__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! dropzone */ \"./node_modules/dropzone/dist/dropzone.js\");\n/* harmony import */ var dropzone__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(dropzone__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _utils_request__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../utils/request */ \"./app/utils/request.js\");\n/* harmony import */ var grav_config__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! grav-config */ \"grav-config\");\n/* harmony import */ var grav_config__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(grav_config__WEBPACK_IMPORTED_MODULE_3__);\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\n\n\n // import EXIF from 'exif-js';\n\n\n // translations\n\nvar Dictionary = {\n dictCancelUpload: grav_config__WEBPACK_IMPORTED_MODULE_3__.translations.PLUGIN_ADMIN.DROPZONE_CANCEL_UPLOAD,\n dictCancelUploadConfirmation: grav_config__WEBPACK_IMPORTED_MODULE_3__.translations.PLUGIN_ADMIN.DROPZONE_CANCEL_UPLOAD_CONFIRMATION,\n dictDefaultMessage: grav_config__WEBPACK_IMPORTED_MODULE_3__.translations.PLUGIN_ADMIN.DROPZONE_DEFAULT_MESSAGE,\n dictFallbackMessage: grav_config__WEBPACK_IMPORTED_MODULE_3__.translations.PLUGIN_ADMIN.DROPZONE_FALLBACK_MESSAGE,\n dictFallbackText: grav_config__WEBPACK_IMPORTED_MODULE_3__.translations.PLUGIN_ADMIN.DROPZONE_FALLBACK_TEXT,\n dictFileTooBig: grav_config__WEBPACK_IMPORTED_MODULE_3__.translations.PLUGIN_ADMIN.DROPZONE_FILE_TOO_BIG,\n dictInvalidFileType: grav_config__WEBPACK_IMPORTED_MODULE_3__.translations.PLUGIN_ADMIN.DROPZONE_INVALID_FILE_TYPE,\n dictMaxFilesExceeded: grav_config__WEBPACK_IMPORTED_MODULE_3__.translations.PLUGIN_ADMIN.DROPZONE_MAX_FILES_EXCEEDED,\n dictRemoveFile: grav_config__WEBPACK_IMPORTED_MODULE_3__.translations.PLUGIN_ADMIN.DROPZONE_REMOVE_FILE,\n dictResponseError: grav_config__WEBPACK_IMPORTED_MODULE_3__.translations.PLUGIN_ADMIN.DROPZONE_RESPONSE_ERROR\n};\n(dropzone__WEBPACK_IMPORTED_MODULE_1___default().autoDiscover) = false;\n(dropzone__WEBPACK_IMPORTED_MODULE_1___default().options.gravPageDropzone) = {};\n\n(dropzone__WEBPACK_IMPORTED_MODULE_1___default().confirm) = function (question, accepted, rejected) {\n var doc = jquery__WEBPACK_IMPORTED_MODULE_0___default()(document);\n var modalSelector = '[data-remodal-id=\"delete-media\"]';\n\n var removeEvents = function removeEvents() {\n doc.off('confirmation', modalSelector, accept);\n doc.off('cancellation', modalSelector, reject);\n jquery__WEBPACK_IMPORTED_MODULE_0___default()(modalSelector).find('.remodal-confirm').removeClass('pointer-events-disabled');\n };\n\n var accept = function accept() {\n accepted && accepted();\n removeEvents();\n };\n\n var reject = function reject() {\n rejected && rejected();\n removeEvents();\n };\n\n (jquery__WEBPACK_IMPORTED_MODULE_0___default().remodal.lookup)[jquery__WEBPACK_IMPORTED_MODULE_0___default()(modalSelector).data('remodal')].open();\n doc.on('confirmation', modalSelector, accept);\n doc.on('cancellation', modalSelector, reject);\n};\n\nvar DropzoneMediaConfig = {\n timeout: 0,\n thumbnailWidth: 200,\n thumbnailHeight: 150,\n addRemoveLinks: false,\n dictDefaultMessage: grav_config__WEBPACK_IMPORTED_MODULE_3__.translations.PLUGIN_ADMIN.DROP_FILES_HERE_TO_UPLOAD.replace(/</g, '<').replace(/>/g, '>'),\n dictRemoveFileConfirmation: '[placeholder]',\n previewTemplate: \"\\n
\\n
\\n
\\n
\\n \\n
\\n
\\n
\\u2714
\\n
\\u2718
\\n
\\n \").concat(grav_config__WEBPACK_IMPORTED_MODULE_3__.translations.PLUGIN_ADMIN.UNSET, \"\\n \").concat(grav_config__WEBPACK_IMPORTED_MODULE_3__.translations.PLUGIN_ADMIN.DELETE, \"\\n \").concat(grav_config__WEBPACK_IMPORTED_MODULE_3__.translations.PLUGIN_ADMIN.METADATA, \"\\n \").concat(grav_config__WEBPACK_IMPORTED_MODULE_3__.translations.PLUGIN_ADMIN.VIEW, \"\\n
\").trim()\n}; // global.EXIF = EXIF;\n\nvar ACCEPT_FUNC = function ACCEPT_FUNC(file, done, settings) {\n var resolution = settings.resolution;\n if (!resolution) return done();\n var reader = new FileReader();\n var error = '';\n var hasMin = resolution.min && (resolution.min.width || resolution.min.height);\n var hasMax = resolution.max && (resolution.max.width || resolution.max.height);\n\n if (hasMin || !(settings.resizeWidth || settings.resizeHeight) && hasMax) {\n reader.onload = function (event) {\n if (!/image\\//.test(file.type)) {\n done();\n return;\n }\n\n var image = new Image();\n image.src = event.target.result;\n\n image.onerror = function () {\n done(grav_config__WEBPACK_IMPORTED_MODULE_3__.translations.PLUGIN_ADMIN.FILE_ERROR_UPLOAD);\n };\n\n image.onload = function () {\n var _this = this;\n\n if (resolution.min) {\n Object.keys(resolution.min).forEach(function (attr) {\n if (resolution.min[attr] && _this[attr] < resolution.min[attr]) {\n error += grav_config__WEBPACK_IMPORTED_MODULE_3__.translations.PLUGIN_FORM.RESOLUTION_MIN.replace(/{{attr}}/g, attr).replace(/{{min}}/g, resolution.min[attr]);\n }\n });\n }\n\n if (!(settings.resizeWidth || settings.resizeHeight)) {\n if (resolution.max) {\n Object.keys(resolution.max).forEach(function (attr) {\n if (resolution.max[attr] && _this[attr] > resolution.max[attr]) {\n error += grav_config__WEBPACK_IMPORTED_MODULE_3__.translations.PLUGIN_FORM.RESOLUTION_MAX.replace(/{{attr}}/g, attr).replace(/{{max}}/g, resolution.max[attr]);\n }\n });\n }\n }\n\n URL.revokeObjectURL(image.src); // release memory\n\n return error ? done(error) : done();\n };\n };\n\n reader.readAsDataURL(file);\n } else {\n return error ? done(error) : done();\n }\n};\n\nvar FilesField = /*#__PURE__*/function () {\n function FilesField() {\n var _this2 = this;\n\n var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},\n _ref$container = _ref.container,\n container = _ref$container === void 0 ? '.dropzone.files-upload' : _ref$container,\n _ref$options = _ref.options,\n options = _ref$options === void 0 ? {} : _ref$options;\n\n _classCallCheck(this, FilesField);\n\n this.container = jquery__WEBPACK_IMPORTED_MODULE_0___default()(container);\n\n if (!this.container.length) {\n return;\n }\n\n this.urls = {};\n this.customPost = this.container.data('filePostAdd') || {};\n this.options = Object.assign({}, Dictionary, DropzoneMediaConfig, {\n klass: this,\n url: this.container.data('file-url-add') || grav_config__WEBPACK_IMPORTED_MODULE_3__.config.current_url,\n acceptedFiles: this.container.data('media-types'),\n init: this.initDropzone\n }, this.container.data('dropzone-options'), options);\n this.options = Object.assign({}, this.options, {\n accept: function accept(file, done) {\n ACCEPT_FUNC(file, done, this.options);\n }\n });\n this.dropzone = new (dropzone__WEBPACK_IMPORTED_MODULE_1___default())(container, this.options);\n this.dropzone.on('complete', this.onDropzoneComplete.bind(this));\n this.dropzone.on('success', this.onDropzoneSuccess.bind(this));\n this.dropzone.on('addedfile', this.onDropzoneAddedFile.bind(this));\n this.dropzone.on('removedfile', this.onDropzoneRemovedFile.bind(this));\n this.dropzone.on('sending', this.onDropzoneSending.bind(this));\n this.dropzone.on('error', this.onDropzoneError.bind(this));\n this.container.on('mouseenter', '[data-dz-view]', function (e) {\n var value = JSON.parse(_this2.container.find('[name][type=\"hidden\"]').val() || '{}');\n var target = jquery__WEBPACK_IMPORTED_MODULE_0___default()(e.currentTarget);\n var file = target.parent('.dz-preview').find('.dz-filename');\n var filename = encodeURI(file.text());\n var URL = Object.keys(value).filter(function (key) {\n return value[key].name === filename;\n }).shift();\n target.attr('href', \"\".concat(grav_config__WEBPACK_IMPORTED_MODULE_3__.config.base_url_simple, \"/\").concat(URL));\n });\n }\n\n _createClass(FilesField, [{\n key: \"initDropzone\",\n value: function initDropzone() {\n var _this3 = this;\n\n var files = this.options.klass.container.find('[data-file]');\n var dropzone = this;\n\n if (!files.length) {\n return;\n }\n\n files.each(function (index, file) {\n file = jquery__WEBPACK_IMPORTED_MODULE_0___default()(file);\n var data = file.data('file');\n var mock = {\n name: data.name,\n size: data.size,\n type: data.type,\n status: (dropzone__WEBPACK_IMPORTED_MODULE_1___default().ADDED),\n accepted: true,\n url: _this3.options.url,\n removeUrl: data.remove\n };\n dropzone.files.push(mock);\n dropzone.options.addedfile.call(dropzone, mock);\n\n if (mock.type.match(/^image\\//)) {\n dropzone.options.thumbnail.call(dropzone, mock, data.path);\n dropzone.createThumbnailFromUrl(mock, data.path);\n }\n\n file.remove();\n });\n }\n }, {\n key: \"getURI\",\n value: function getURI() {\n return this.container.data('mediaUri') || '';\n }\n }, {\n key: \"onDropzoneSending\",\n value: function onDropzoneSending(file, xhr, formData) {\n var _this4 = this;\n\n if (Object.keys(this.customPost).length) {\n Object.keys(this.customPost).forEach(function (key) {\n formData.append(key, _this4.customPost[key]);\n });\n } else {\n formData.append('name', this.options.dotNotation);\n formData.append('task', 'filesupload');\n formData.append('uri', this.getURI());\n }\n\n formData.append('admin-nonce', grav_config__WEBPACK_IMPORTED_MODULE_3__.config.admin_nonce);\n }\n }, {\n key: \"onDropzoneSuccess\",\n value: function onDropzoneSuccess(file, response, xhr) {\n response = typeof response === 'string' ? JSON.parse(response) : response;\n\n if (this.options.reloadPage) {\n __webpack_require__.g.location.reload();\n } // store params for removing file from session before it gets saved\n\n\n if (response.session) {\n file.sessionParams = response.session;\n file.removeUrl = this.options.url; // Touch field value to force a mutation detection\n\n var input = this.container.find('[name][type=\"hidden\"]');\n var value = input.val();\n input.val(value + ' ');\n }\n\n return this.handleError({\n file: file,\n data: response,\n mode: 'removeFile',\n msg: \"

\".concat(grav_config__WEBPACK_IMPORTED_MODULE_3__.translations.PLUGIN_ADMIN.FILE_ERROR_UPLOAD, \" {{fileName}}

\\n
\").concat(response.message, \"
\")\n });\n }\n }, {\n key: \"onDropzoneComplete\",\n value: function onDropzoneComplete(file) {\n if (!file.accepted && !file.rejected) {\n var data = {\n status: 'error',\n message: \"\".concat(grav_config__WEBPACK_IMPORTED_MODULE_3__.translations.PLUGIN_ADMIN.FILE_UNSUPPORTED, \": \").concat(file.name.match(/\\..+/).join(''))\n };\n return this.handleError({\n file: file,\n data: data,\n mode: 'removeFile',\n msg: \"

\".concat(grav_config__WEBPACK_IMPORTED_MODULE_3__.translations.PLUGIN_ADMIN.FILE_ERROR_ADD, \" {{fileName}}

\\n
\").concat(data.message, \"
\")\n });\n }\n\n if (this.options.reloadPage) {\n __webpack_require__.g.location.reload();\n }\n }\n }, {\n key: \"b64_to_utf8\",\n value: function b64_to_utf8(str) {\n str = str.replace(/\\s/g, '');\n return decodeURIComponent(escape(window.atob(str)));\n }\n }, {\n key: \"onDropzoneAddedFile\",\n value: function onDropzoneAddedFile(file) {\n return this.dropzone.options.addedfile(file);\n }\n }, {\n key: \"onDropzoneRemovedFile\",\n value: function onDropzoneRemovedFile(file) {\n var _this5 = this;\n\n if (!file.accepted || file.rejected) {\n return;\n }\n\n var url = file.removeUrl || this.urls[\"delete\"] || this.options.url;\n var path = (url || '').match(/path:(.*)\\//);\n var body = {\n filename: file.name,\n uri: this.getURI()\n };\n\n if (file.sessionParams) {\n body.task = 'filessessionremove';\n body.session = file.sessionParams;\n }\n\n var customPost = this.container.data('filePostRemove') || {};\n\n if (Object.keys(customPost).length) {\n body = {};\n Object.keys(customPost).forEach(function (key) {\n body[key] = customPost[key];\n });\n }\n\n body['filename'] = file.name;\n body['admin-nonce'] = grav_config__WEBPACK_IMPORTED_MODULE_3__.config.admin_nonce;\n (0,_utils_request__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(url, {\n method: 'post',\n body: body\n }, function () {\n if (!path) {\n return;\n }\n\n path = _this5.b64_to_utf8(path[1]);\n\n var input = _this5.container.find('[name][type=\"hidden\"]');\n\n var data = JSON.parse(input.val() || '{}');\n delete data[path];\n input.val(JSON.stringify(data));\n });\n }\n }, {\n key: \"onDropzoneError\",\n value: function onDropzoneError(file, response, xhr) {\n var message = xhr ? response.error.message : response;\n jquery__WEBPACK_IMPORTED_MODULE_0___default()(file.previewElement).find('[data-dz-errormessage]').html(message);\n return this.handleError({\n file: file,\n data: {\n status: 'error'\n },\n msg: \"
\".concat(message, \"
\")\n });\n }\n }, {\n key: \"handleError\",\n value: function handleError(options) {\n var file = options.file,\n data = options.data,\n mode = options.mode,\n msg = options.msg;\n\n if (data.status !== 'error' && data.status !== 'unauthorized') {\n return;\n }\n\n switch (mode) {\n case 'addBack':\n if (file instanceof File) {\n this.dropzone.addFile.call(this.dropzone, file);\n } else {\n this.dropzone.files.push(file);\n this.dropzone.options.addedfile.call(this.dropzone, file);\n this.dropzone.options.thumbnail.call(this.dropzone, file, file.extras.url);\n }\n\n break;\n\n case 'removeFile':\n default:\n if (~this.dropzone.files.indexOf(file)) {\n file.rejected = true;\n this.dropzone.removeFile.call(this.dropzone, file, {\n silent: true\n });\n }\n\n break;\n }\n\n var modal = jquery__WEBPACK_IMPORTED_MODULE_0___default()('[data-remodal-id=\"generic\"]');\n var cleanName = file.name.replace('<', '<').replace('>', '>');\n modal.find('.error-content').html(msg.replace('{{fileName}}', cleanName));\n (jquery__WEBPACK_IMPORTED_MODULE_0___default().remodal.lookup)[modal.data('remodal')].open();\n }\n }]);\n\n return FilesField;\n}();\n\n\nfunction UriToMarkdown(uri) {\n uri = uri.replace(/@3x|@2x|@1x/, '');\n uri = uri.replace(/\\(/g, '%28');\n uri = uri.replace(/\\)/g, '%29');\n var title = uri.split('.').slice(0, -1).join('.');\n return uri.match(/\\.(jpe?g|png|gif|svg|webp|mp4|webm|ogv|mov)$/i) ? \"![\".concat(title, \"](\").concat(uri, \" \\\"\").concat(title, \"\\\")\") : \"[\".concat(decodeURI(uri), \"](\").concat(uri, \")\");\n}\nvar instances = [];\nvar cache = jquery__WEBPACK_IMPORTED_MODULE_0___default()();\n\nvar onAddedNodes = function onAddedNodes(event, target\n/* , record, instance */\n) {\n var files = jquery__WEBPACK_IMPORTED_MODULE_0___default()(target).find('.dropzone.files-upload');\n\n if (!files.length) {\n return;\n }\n\n files.each(function (index, file) {\n file = jquery__WEBPACK_IMPORTED_MODULE_0___default()(file);\n\n if (!~cache.index(file)) {\n addNode(file);\n }\n });\n};\n\nvar addNode = function addNode(container) {\n container = jquery__WEBPACK_IMPORTED_MODULE_0___default()(container);\n var input = container.find('input[type=\"file\"]');\n var settings = container.data('grav-file-settings') || {};\n\n if (settings.accept && ~settings.accept.indexOf('*')) {\n settings.accept = [''];\n }\n\n var options = {\n url: container.data('file-url-add') || (container.closest('form').attr('action') || grav_config__WEBPACK_IMPORTED_MODULE_3__.config.current_url) + '.json',\n paramName: settings.paramName || 'file',\n dotNotation: settings.name || 'file',\n acceptedFiles: settings.accept ? settings.accept.join(',') : input.attr('accept') || container.data('media-types'),\n maxFilesize: typeof settings.filesize !== 'undefined' ? settings.filesize : 256,\n maxFiles: settings.limit || null,\n resizeWidth: settings.resizeWidth || null,\n resizeHeight: settings.resizeHeight || null,\n resizeQuality: settings.resizeQuality || null,\n resolution: settings.resolution || null,\n accept: function accept(file, done) {\n ACCEPT_FUNC(file, done, settings);\n }\n };\n cache = cache.add(container);\n container = container[0];\n instances.push(new FilesField({\n container: container,\n options: options\n }));\n};\n\nvar Instance = function () {\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('.dropzone.files-upload').each(function (i, container) {\n return addNode(container);\n });\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('body').on('mutation._grav', onAddedNodes);\n return instances;\n}();//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QjtBQUFBLEdBQWpDO0FBQ0FwRyxFQUFBQSw2Q0FBQyxDQUFDLE1BQUQsQ0FBRCxDQUFVK0MsRUFBVixDQUFhLGdCQUFiLEVBQStCd0osWUFBL0I7QUFFQSxTQUFPRixTQUFQO0FBQ0gsQ0FMcUIsRUFBZiIsInNvdXJjZXMiOlsid2VicGFjazovL0dyYXYvLi9hcHAvZm9ybXMvZmllbGRzL2ZpbGVzLmpzPzYxNzkiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICQgZnJvbSAnanF1ZXJ5JztcbmltcG9ydCBEcm9wem9uZSBmcm9tICdkcm9wem9uZSc7XG4vLyBpbXBvcnQgRVhJRiBmcm9tICdleGlmLWpzJztcbmltcG9ydCByZXF1ZXN0IGZyb20gJy4uLy4uL3V0aWxzL3JlcXVlc3QnO1xuaW1wb3J0IHsgY29uZmlnLCB0cmFuc2xhdGlvbnMgfSBmcm9tICdncmF2LWNvbmZpZyc7XG5cbi8vIHRyYW5zbGF0aW9uc1xuY29uc3QgRGljdGlvbmFyeSA9IHtcbiAgICBkaWN0Q2FuY2VsVXBsb2FkOiB0cmFuc2xhdGlvbnMuUExVR0lOX0FETUlOLkRST1BaT05FX0NBTkNFTF9VUExPQUQsXG4gICAgZGljdENhbmNlbFVwbG9hZENvbmZpcm1hdGlvbjogdHJhbnNsYXRpb25zLlBMVUdJTl9BRE1JTi5EUk9QWk9ORV9DQU5DRUxfVVBMT0FEX0NPTkZJUk1BVElPTixcbiAgICBkaWN0RGVmYXVsdE1lc3NhZ2U6IHRyYW5zbGF0aW9ucy5QTFVHSU5fQURNSU4uRFJPUFpPTkVfREVGQVVMVF9NRVNTQUdFLFxuICAgIGRpY3RGYWxsYmFja01lc3NhZ2U6IHRyYW5zbGF0aW9ucy5QTFVHSU5fQURNSU4uRFJPUFpPTkVfRkFMTEJBQ0tfTUVTU0FHRSxcbiAgICBkaWN0RmFsbGJhY2tUZXh0OiB0cmFuc2xhdGlvbnMuUExVR0lOX0FETUlOLkRST1BaT05FX0ZBTExCQUNLX1RFWFQsXG4gICAgZGljdEZpbGVUb29CaWc6IHRyYW5zbGF0aW9ucy5QTFVHSU5fQURNSU4uRFJPUFpPTkVfRklMRV9UT09fQklHLFxuICAgIGRpY3RJbnZhbGlkRmlsZVR5cGU6IHRyYW5zbGF0aW9ucy5QTFVHSU5fQURNSU4uRFJPUFpPTkVfSU5WQUxJRF9GSUxFX1RZUEUsXG4gICAgZGljdE1heEZpbGVzRXhjZWVkZWQ6IHRyYW5zbGF0aW9ucy5QTFVHSU5fQURNSU4uRFJPUFpPTkVfTUFYX0ZJTEVTX0VYQ0VFREVELFxuICAgIGRpY3RSZW1vdmVGaWxlOiB0cmFuc2xhdGlvbnMuUExVR0lOX0FETUlOLkRST1BaT05FX1JFTU9WRV9GSUxFLFxuICAgIGRpY3RSZXNwb25zZUVycm9yOiB0cmFuc2xhdGlvbnMuUExVR0lOX0FETUlOLkRST1BaT05FX1JFU1BPTlNFX0VSUk9SXG59O1xuXG5Ecm9wem9uZS5hdXRvRGlzY292ZXIgPSBmYWxzZTtcbkRyb3B6b25lLm9wdGlvbnMuZ3JhdlBhZ2VEcm9wem9uZSA9IHt9O1xuRHJvcHpvbmUuY29uZmlybSA9IChxdWVzdGlvbiwgYWNjZXB0ZWQsIHJlamVjdGVkKSA9PiB7XG4gICAgbGV0IGRvYyA9ICQoZG9jdW1lbnQpO1xuICAgIGxldCBtb2RhbFNlbGVjdG9yID0gJ1tkYXRhLXJlbW9kYWwtaWQ9XCJkZWxldGUtbWVkaWFcIl0nO1xuXG4gICAgbGV0IHJlbW92ZUV2ZW50cyA9ICgpID0+IHtcbiAgICAgICAgZG9jLm9mZignY29uZmlybWF0aW9uJywgbW9kYWxTZWxlY3RvciwgYWNjZXB0KTtcbiAgICAgICAgZG9jLm9mZignY2FuY2VsbGF0aW9uJywgbW9kYWxTZWxlY3RvciwgcmVqZWN0KTtcblxuICAgICAgICAkKG1vZGFsU2VsZWN0b3IpLmZpbmQoJy5yZW1vZGFsLWNvbmZpcm0nKS5yZW1vdmVDbGFzcygncG9pbnRlci1ldmVudHMtZGlzYWJsZWQnKTtcbiAgICB9O1xuXG4gICAgbGV0IGFjY2VwdCA9ICgpID0+IHtcbiAgICAgICAgYWNjZXB0ZWQgJiYgYWNjZXB0ZWQoKTtcbiAgICAgICAgcmVtb3ZlRXZlbnRzKCk7XG4gICAgfTtcblxuICAgIGxldCByZWplY3QgPSAoKSA9PiB7XG4gICAgICAgIHJlamVjdGVkICYmIHJlamVjdGVkKCk7XG4gICAgICAgIHJlbW92ZUV2ZW50cygpO1xuICAgIH07XG5cbiAgICAkLnJlbW9kYWwubG9va3VwWyQobW9kYWxTZWxlY3RvcikuZGF0YSgncmVtb2RhbCcpXS5vcGVuKCk7XG4gICAgZG9jLm9uKCdjb25maXJtYXRpb24nLCBtb2RhbFNlbGVjdG9yLCBhY2NlcHQpO1xuICAgIGRvYy5vbignY2FuY2VsbGF0aW9uJywgbW9kYWxTZWxlY3RvciwgcmVqZWN0KTtcbn07XG5cbmNvbnN0IERyb3B6b25lTWVkaWFDb25maWcgPSB7XG4gICAgdGltZW91dDogMCxcbiAgICB0aHVtYm5haWxXaWR0aDogMjAwLFxuICAgIHRodW1ibmFpbEhlaWdodDogMTUwLFxuICAgIGFkZFJlbW92ZUxpbmtzOiBmYWxzZSxcbiAgICBkaWN0RGVmYXVsdE1lc3NhZ2U6IHRyYW5zbGF0aW9ucy5QTFVHSU5fQURNSU4uRFJPUF9GSUxFU19IRVJFX1RPX1VQTE9BRC5yZXBsYWNlKC8mbHQ7L2csICc8JykucmVwbGFjZSgvJmd0Oy9nLCAnPicpLFxuICAgIGRpY3RSZW1vdmVGaWxlQ29uZmlybWF0aW9uOiAnW3BsYWNlaG9sZGVyXScsXG4gICAgcHJldmlld1RlbXBsYXRlOiBgXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkei1wcmV2aWV3IGR6LWZpbGUtcHJldmlldyBkei1uby1lZGl0b3JcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHotZGV0YWlsc1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR6LWZpbGVuYW1lXCI+PHNwYW4gZGF0YS1kei1uYW1lPjwvc3Bhbj48L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkei1zaXplXCIgZGF0YS1kei1zaXplPjwvZGl2PlxuICAgICAgICAgICAgPGltZyBkYXRhLWR6LXRodW1ibmFpbCAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkei1wcm9ncmVzc1wiPjxzcGFuIGNsYXNzPVwiZHotdXBsb2FkXCIgZGF0YS1kei11cGxvYWRwcm9ncmVzcz48L3NwYW4+PC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImR6LXN1Y2Nlc3MtbWFya1wiPjxzcGFuPuKclDwvc3Bhbj48L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHotZXJyb3ItbWFya1wiPjxzcGFuPuKcmDwvc3Bhbj48L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHotZXJyb3ItbWVzc2FnZVwiPjxzcGFuIGRhdGEtZHotZXJyb3JtZXNzYWdlPjwvc3Bhbj48L2Rpdj5cbiAgICAgICAgICA8YSBjbGFzcz1cImR6LXVuc2V0XCIgdGl0bGU9XCIke3RyYW5zbGF0aW9ucy5QTFVHSU5fQURNSU4uVU5TRVR9XCIgaHJlZj1cIiNcIiBkYXRhLWR6LXVuc2V0PiR7dHJhbnNsYXRpb25zLlBMVUdJTl9BRE1JTi5VTlNFVH08L2E+XG4gICAgICAgICAgPGEgY2xhc3M9XCJkei1yZW1vdmVcIiB0aXRsZT1cIiR7dHJhbnNsYXRpb25zLlBMVUdJTl9BRE1JTi5ERUxFVEV9XCIgaHJlZj1cImphdmFzY3JpcHQ6dW5kZWZpbmVkO1wiIGRhdGEtZHotcmVtb3ZlPiR7dHJhbnNsYXRpb25zLlBMVUdJTl9BRE1JTi5ERUxFVEV9PC9hPlxuICAgICAgICAgIDxhIGNsYXNzPVwiZHotbWV0YWRhdGFcIiB0aXRsZT1cIiR7dHJhbnNsYXRpb25zLlBMVUdJTl9BRE1JTi5NRVRBREFUQX1cIiBocmVmPVwiI1wiIHRhcmdldD1cIl9ibGFua1wiIGRhdGEtZHotbWV0YWRhdGE+JHt0cmFuc2xhdGlvbnMuUExVR0lOX0FETUlOLk1FVEFEQVRBfTwvYT5cbiAgICAgICAgICA8YSBjbGFzcz1cImR6LXZpZXdcIiB0aXRsZT1cIiR7dHJhbnNsYXRpb25zLlBMVUdJTl9BRE1JTi5WSUVXfVwiIGhyZWY9XCIjXCIgdGFyZ2V0PVwiX2JsYW5rXCIgZGF0YS1kei12aWV3PiR7dHJhbnNsYXRpb25zLlBMVUdJTl9BRE1JTi5WSUVXfTwvYT5cbiAgICAgICAgPC9kaXY+YC50cmltKClcbn07XG5cbi8vIGdsb2JhbC5FWElGID0gRVhJRjtcblxuY29uc3QgQUNDRVBUX0ZVTkMgPSBmdW5jdGlvbihmaWxlLCBkb25lLCBzZXR0aW5ncykge1xuICAgIGNvbnN0IHJlc29sdXRpb24gPSBzZXR0aW5ncy5yZXNvbHV0aW9uO1xuICAgIGlmICghcmVzb2x1dGlvbikgcmV0dXJuIGRvbmUoKTtcblxuICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gICAgbGV0IGVycm9yID0gJyc7XG4gICAgY29uc3QgaGFzTWluID0gKHJlc29sdXRpb24ubWluICYmIChyZXNvbHV0aW9uLm1pbi53aWR0aCB8fCByZXNvbHV0aW9uLm1pbi5oZWlnaHQpKTtcbiAgICBjb25zdCBoYXNNYXggPSAocmVzb2x1dGlvbi5tYXggJiYgKHJlc29sdXRpb24ubWF4LndpZHRoIHx8IHJlc29sdXRpb24ubWF4LmhlaWdodCkpO1xuICAgIGlmIChoYXNNaW4gfHwgKCEoc2V0dGluZ3MucmVzaXplV2lkdGggfHwgc2V0dGluZ3MucmVzaXplSGVpZ2h0KSAmJiBoYXNNYXgpKSB7XG4gICAgICAgIHJlYWRlci5vbmxvYWQgPSBmdW5jdGlvbihldmVudCkge1xuICAgICAgICAgICAgaWYgKCEvaW1hZ2VcXC8vLnRlc3QoZmlsZS50eXBlKSkge1xuICAgICAgICAgICAgICBkb25lKCk7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgaW1hZ2UgPSBuZXcgSW1hZ2UoKTtcbiAgICAgICAgICAgIGltYWdlLnNyYyA9IGV2ZW50LnRhcmdldC5yZXN1bHQ7XG4gICAgICAgICAgICBpbWFnZS5vbmVycm9yID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgZG9uZSh0cmFuc2xhdGlvbnMuUExVR0lOX0FETUlOLkZJTEVfRVJST1JfVVBMT0FEKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpbWFnZS5vbmxvYWQgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICBpZiAocmVzb2x1dGlvbi5taW4pIHtcbiAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmtleXMocmVzb2x1dGlvbi5taW4pLmZvckVhY2goKGF0dHIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNvbHV0aW9uLm1pblthdHRyXSAmJiB0aGlzW2F0dHJdIDwgcmVzb2x1dGlvbi5taW5bYXR0cl0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvciArPSB0cmFuc2xhdGlvbnMuUExVR0lOX0ZPUk0uUkVTT0xVVElPTl9NSU4ucmVwbGFjZSgve3thdHRyfX0vZywgYXR0cikucmVwbGFjZSgve3ttaW59fS9nLCByZXNvbHV0aW9uLm1pblthdHRyXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICghKHNldHRpbmdzLnJlc2l6ZVdpZHRoIHx8IHNldHRpbmdzLnJlc2l6ZUhlaWdodCkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc29sdXRpb24ubWF4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhyZXNvbHV0aW9uLm1heCkuZm9yRWFjaCgoYXR0cikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNvbHV0aW9uLm1heFthdHRyXSAmJiB0aGlzW2F0dHJdID4gcmVzb2x1dGlvbi5tYXhbYXR0cl0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IgKz0gdHJhbnNsYXRpb25zLlBMVUdJTl9GT1JNLlJFU09MVVRJT05fTUFYLnJlcGxhY2UoL3t7YXR0cn19L2csIGF0dHIpLnJlcGxhY2UoL3t7bWF4fX0vZywgcmVzb2x1dGlvbi5tYXhbYXR0cl0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgVVJMLnJldm9rZU9iamVjdFVSTChpbWFnZS5zcmMpOyAvLyByZWxlYXNlIG1lbW9yeVxuICAgICAgICAgICAgICAgIHJldHVybiBlcnJvciA/IGRvbmUoZXJyb3IpIDogZG9uZSgpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfTtcblxuICAgICAgICByZWFkZXIucmVhZEFzRGF0YVVSTChmaWxlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZXJyb3IgPyBkb25lKGVycm9yKSA6IGRvbmUoKTtcbiAgICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBGaWxlc0ZpZWxkIHtcbiAgICBjb25zdHJ1Y3Rvcih7IGNvbnRhaW5lciA9ICcuZHJvcHpvbmUuZmlsZXMtdXBsb2FkJywgb3B0aW9ucyA9IHt9IH0gPSB7fSkge1xuICAgICAgICB0aGlzLmNvbnRhaW5lciA9ICQoY29udGFpbmVyKTtcbiAgICAgICAgaWYgKCF0aGlzLmNvbnRhaW5lci5sZW5ndGgpIHsgcmV0dXJuOyB9XG5cbiAgICAgICAgdGhpcy51cmxzID0ge307XG4gICAgICAgIHRoaXMuY3VzdG9tUG9zdCA9IHRoaXMuY29udGFpbmVyLmRhdGEoJ2ZpbGVQb3N0QWRkJykgfHwge307XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIERpY3Rpb25hcnksIERyb3B6b25lTWVkaWFDb25maWcsIHtcbiAgICAgICAgICAgIGtsYXNzOiB0aGlzLFxuICAgICAgICAgICAgdXJsOiB0aGlzLmNvbnRhaW5lci5kYXRhKCdmaWxlLXVybC1hZGQnKSB8fCBjb25maWcuY3VycmVudF91cmwsXG4gICAgICAgICAgICBhY2NlcHRlZEZpbGVzOiB0aGlzLmNvbnRhaW5lci5kYXRhKCdtZWRpYS10eXBlcycpLFxuICAgICAgICAgICAgaW5pdDogdGhpcy5pbml0RHJvcHpvbmVcbiAgICAgICAgfSwgdGhpcy5jb250YWluZXIuZGF0YSgnZHJvcHpvbmUtb3B0aW9ucycpLCBvcHRpb25zKTtcblxuICAgICAgICB0aGlzLm9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLm9wdGlvbnMsIHtcbiAgICAgICAgICAgIGFjY2VwdDogZnVuY3Rpb24oZmlsZSwgZG9uZSkgeyBBQ0NFUFRfRlVOQyhmaWxlLCBkb25lLCB0aGlzLm9wdGlvbnMpOyB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuZHJvcHpvbmUgPSBuZXcgRHJvcHpvbmUoY29udGFpbmVyLCB0aGlzLm9wdGlvbnMpO1xuICAgICAgICB0aGlzLmRyb3B6b25lLm9uKCdjb21wbGV0ZScsIHRoaXMub25Ecm9wem9uZUNvbXBsZXRlLmJpbmQodGhpcykpO1xuICAgICAgICB0aGlzLmRyb3B6b25lLm9uKCdzdWNjZXNzJywgdGhpcy5vbkRyb3B6b25lU3VjY2Vzcy5iaW5kKHRoaXMpKTtcbiAgICAgICAgdGhpcy5kcm9wem9uZS5vbignYWRkZWRmaWxlJywgdGhpcy5vbkRyb3B6b25lQWRkZWRGaWxlLmJpbmQodGhpcykpO1xuICAgICAgICB0aGlzLmRyb3B6b25lLm9uKCdyZW1vdmVkZmlsZScsIHRoaXMub25Ecm9wem9uZVJlbW92ZWRGaWxlLmJpbmQodGhpcykpO1xuICAgICAgICB0aGlzLmRyb3B6b25lLm9uKCdzZW5kaW5nJywgdGhpcy5vbkRyb3B6b25lU2VuZGluZy5iaW5kKHRoaXMpKTtcbiAgICAgICAgdGhpcy5kcm9wem9uZS5vbignZXJyb3InLCB0aGlzLm9uRHJvcHpvbmVFcnJvci5iaW5kKHRoaXMpKTtcblxuICAgICAgICB0aGlzLmNvbnRhaW5lci5vbignbW91c2VlbnRlcicsICdbZGF0YS1kei12aWV3XScsIChlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IEpTT04ucGFyc2UodGhpcy5jb250YWluZXIuZmluZCgnW25hbWVdW3R5cGU9XCJoaWRkZW5cIl0nKS52YWwoKSB8fCAne30nKTtcbiAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9ICQoZS5jdXJyZW50VGFyZ2V0KTtcbiAgICAgICAgICAgIGNvbnN0IGZpbGUgPSB0YXJnZXQucGFyZW50KCcuZHotcHJldmlldycpLmZpbmQoJy5kei1maWxlbmFtZScpO1xuICAgICAgICAgICAgY29uc3QgZmlsZW5hbWUgPSBlbmNvZGVVUkkoZmlsZS50ZXh0KCkpO1xuXG4gICAgICAgICAgICBjb25zdCBVUkwgPSBPYmplY3Qua2V5cyh2YWx1ZSkuZmlsdGVyKChrZXkpID0+IHZhbHVlW2tleV0ubmFtZSA9PT0gZmlsZW5hbWUpLnNoaWZ0KCk7XG4gICAgICAgICAgICB0YXJnZXQuYXR0cignaHJlZicsIGAke2NvbmZpZy5iYXNlX3VybF9zaW1wbGV9LyR7VVJMfWApO1xuICAgICAgICB9KTtcblxuICAgIH1cblxuICAgIGluaXREcm9wem9uZSgpIHtcbiAgICAgICAgbGV0IGZpbGVzID0gdGhpcy5vcHRpb25zLmtsYXNzLmNvbnRhaW5lci5maW5kKCdbZGF0YS1maWxlXScpO1xuICAgICAgICBsZXQgZHJvcHpvbmUgPSB0aGlzO1xuICAgICAgICBpZiAoIWZpbGVzLmxlbmd0aCkgeyByZXR1cm47IH1cblxuICAgICAgICBmaWxlcy5lYWNoKChpbmRleCwgZmlsZSkgPT4ge1xuICAgICAgICAgICAgZmlsZSA9ICQoZmlsZSk7XG4gICAgICAgICAgICBsZXQgZGF0YSA9IGZpbGUuZGF0YSgnZmlsZScpO1xuICAgICAgICAgICAgbGV0IG1vY2sgPSB7XG4gICAgICAgICAgICAgICAgbmFtZTogZGF0YS5uYW1lLFxuICAgICAgICAgICAgICAgIHNpemU6IGRhdGEuc2l6ZSxcbiAgICAgICAgICAgICAgICB0eXBlOiBkYXRhLnR5cGUsXG4gICAgICAgICAgICAgICAgc3RhdHVzOiBEcm9wem9uZS5BRERFRCxcbiAgICAgICAgICAgICAgICBhY2NlcHRlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICB1cmw6IHRoaXMub3B0aW9ucy51cmwsXG4gICAgICAgICAgICAgICAgcmVtb3ZlVXJsOiBkYXRhLnJlbW92ZVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgZHJvcHpvbmUuZmlsZXMucHVzaChtb2NrKTtcbiAgICAgICAgICAgIGRyb3B6b25lLm9wdGlvbnMuYWRkZWRmaWxlLmNhbGwoZHJvcHpvbmUsIG1vY2spO1xuICAgICAgICAgICAgaWYgKG1vY2sudHlwZS5tYXRjaCgvXmltYWdlXFwvLykpIHtcbiAgICAgICAgICAgICAgICBkcm9wem9uZS5vcHRpb25zLnRodW1ibmFpbC5jYWxsKGRyb3B6b25lLCBtb2NrLCBkYXRhLnBhdGgpO1xuICAgICAgICAgICAgICAgIGRyb3B6b25lLmNyZWF0ZVRodW1ibmFpbEZyb21VcmwobW9jaywgZGF0YS5wYXRoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZmlsZS5yZW1vdmUoKTtcbiAgICAgICAgfSk7XG5cbiAgICB9XG5cbiAgICBnZXRVUkkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRhaW5lci5kYXRhKCdtZWRpYVVyaScpIHx8ICcnO1xuICAgIH1cblxuICAgIG9uRHJvcHpvbmVTZW5kaW5nKGZpbGUsIHhociwgZm9ybURhdGEpIHtcbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKHRoaXMuY3VzdG9tUG9zdCkubGVuZ3RoKSB7XG4gICAgICAgICAgICBPYmplY3Qua2V5cyh0aGlzLmN1c3RvbVBvc3QpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZChrZXksIHRoaXMuY3VzdG9tUG9zdFtrZXldKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZm9ybURhdGEuYXBwZW5kKCduYW1lJywgdGhpcy5vcHRpb25zLmRvdE5vdGF0aW9uKTtcbiAgICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZCgndGFzaycsICdmaWxlc3VwbG9hZCcpO1xuICAgICAgICAgICAgZm9ybURhdGEuYXBwZW5kKCd1cmknLCB0aGlzLmdldFVSSSgpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvcm1EYXRhLmFwcGVuZCgnYWRtaW4tbm9uY2UnLCBjb25maWcuYWRtaW5fbm9uY2UpO1xuICAgIH1cblxuICAgIG9uRHJvcHpvbmVTdWNjZXNzKGZpbGUsIHJlc3BvbnNlLCB4aHIpIHtcbiAgICAgICAgcmVzcG9uc2UgPSB0eXBlb2YgcmVzcG9uc2UgPT09ICdzdHJpbmcnID8gSlNPTi5wYXJzZShyZXNwb25zZSkgOiByZXNwb25zZTtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5yZWxvYWRQYWdlKSB7XG4gICAgICAgICAgICBnbG9iYWwubG9jYXRpb24ucmVsb2FkKCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBzdG9yZSBwYXJhbXMgZm9yIHJlbW92aW5nIGZpbGUgZnJvbSBzZXNzaW9uIGJlZm9yZSBpdCBnZXRzIHNhdmVkXG4gICAgICAgIGlmIChyZXNwb25zZS5zZXNzaW9uKSB7XG4gICAgICAgICAgICBmaWxlLnNlc3Npb25QYXJhbXMgPSByZXNwb25zZS5zZXNzaW9uO1xuICAgICAgICAgICAgZmlsZS5yZW1vdmVVcmwgPSB0aGlzLm9wdGlvbnMudXJsO1xuXG4gICAgICAgICAgICAvLyBUb3VjaCBmaWVsZCB2YWx1ZSB0byBmb3JjZSBhIG11dGF0aW9uIGRldGVjdGlvblxuICAgICAgICAgICAgY29uc3QgaW5wdXQgPSB0aGlzLmNvbnRhaW5lci5maW5kKCdbbmFtZV1bdHlwZT1cImhpZGRlblwiXScpO1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBpbnB1dC52YWwoKTtcbiAgICAgICAgICAgIGlucHV0LnZhbCh2YWx1ZSArICcgJyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5oYW5kbGVFcnJvcih7XG4gICAgICAgICAgICBmaWxlLFxuICAgICAgICAgICAgZGF0YTogcmVzcG9uc2UsXG4gICAgICAgICAgICBtb2RlOiAncmVtb3ZlRmlsZScsXG4gICAgICAgICAgICBtc2c6IGA8cD4ke3RyYW5zbGF0aW9ucy5QTFVHSU5fQURNSU4uRklMRV9FUlJPUl9VUExPQUR9IDxzdHJvbmc+e3tmaWxlTmFtZX19PC9zdHJvbmc+PC9wPlxuICAgICAgICAgICAgPHByZT4ke3Jlc3BvbnNlLm1lc3NhZ2V9PC9wcmU+YFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBvbkRyb3B6b25lQ29tcGxldGUoZmlsZSkge1xuICAgICAgICBpZiAoIWZpbGUuYWNjZXB0ZWQgJiYgIWZpbGUucmVqZWN0ZWQpIHtcbiAgICAgICAgICAgIGxldCBkYXRhID0ge1xuICAgICAgICAgICAgICAgIHN0YXR1czogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBgJHt0cmFuc2xhdGlvbnMuUExVR0lOX0FETUlOLkZJTEVfVU5TVVBQT1JURUR9OiAke2ZpbGUubmFtZS5tYXRjaCgvXFwuLisvKS5qb2luKCcnKX1gXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5oYW5kbGVFcnJvcih7XG4gICAgICAgICAgICAgICAgZmlsZSxcbiAgICAgICAgICAgICAgICBkYXRhLFxuICAgICAgICAgICAgICAgIG1vZGU6ICdyZW1vdmVGaWxlJyxcbiAgICAgICAgICAgICAgICBtc2c6IGA8cD4ke3RyYW5zbGF0aW9ucy5QTFVHSU5fQURNSU4uRklMRV9FUlJPUl9BRER9IDxzdHJvbmc+e3tmaWxlTmFtZX19PC9zdHJvbmc+PC9wPlxuICAgICAgICAgICAgICAgIDxwcmU+JHtkYXRhLm1lc3NhZ2V9PC9wcmU+YFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnJlbG9hZFBhZ2UpIHtcbiAgICAgICAgICAgIGdsb2JhbC5sb2NhdGlvbi5yZWxvYWQoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGI2NF90b191dGY4KHN0cikge1xuICAgICAgICBzdHIgPSBzdHIucmVwbGFjZSgvXFxzL2csICcnKTtcbiAgICAgICAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChlc2NhcGUod2luZG93LmF0b2Ioc3RyKSkpO1xuICAgIH1cblxuICAgIG9uRHJvcHpvbmVBZGRlZEZpbGUoZmlsZSwgLi4uZXh0cmEpIHtcbiAgICAgIHJldHVybiB0aGlzLmRyb3B6b25lLm9wdGlvbnMuYWRkZWRmaWxlKGZpbGUpO1xuICAgIH1cblxuICAgIG9uRHJvcHpvbmVSZW1vdmVkRmlsZShmaWxlLCAuLi5leHRyYSkge1xuICAgICAgICBpZiAoIWZpbGUuYWNjZXB0ZWQgfHwgZmlsZS5yZWplY3RlZCkgeyByZXR1cm47IH1cbiAgICAgICAgbGV0IHVybCA9IGZpbGUucmVtb3ZlVXJsIHx8IHRoaXMudXJscy5kZWxldGUgfHwgdGhpcy5vcHRpb25zLnVybDtcbiAgICAgICAgbGV0IHBhdGggPSAodXJsIHx8ICcnKS5tYXRjaCgvcGF0aDooLiopXFwvLyk7XG4gICAgICAgIGxldCBib2R5ID0geyBmaWxlbmFtZTogZmlsZS5uYW1lLCB1cmk6IHRoaXMuZ2V0VVJJKCkgfTtcblxuICAgICAgICBpZiAoZmlsZS5zZXNzaW9uUGFyYW1zKSB7XG4gICAgICAgICAgICBib2R5LnRhc2sgPSAnZmlsZXNzZXNzaW9ucmVtb3ZlJztcbiAgICAgICAgICAgIGJvZHkuc2Vzc2lvbiA9IGZpbGUuc2Vzc2lvblBhcmFtcztcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGN1c3RvbVBvc3QgPSB0aGlzLmNvbnRhaW5lci5kYXRhKCdmaWxlUG9zdFJlbW92ZScpIHx8IHt9O1xuICAgICAgICBpZiAoT2JqZWN0LmtleXMoY3VzdG9tUG9zdCkubGVuZ3RoKSB7XG4gICAgICAgICAgICBib2R5ID0ge307XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhjdXN0b21Qb3N0KS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgICAgICAgICBib2R5W2tleV0gPSBjdXN0b21Qb3N0W2tleV07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGJvZHlbJ2ZpbGVuYW1lJ10gPSBmaWxlLm5hbWU7XG4gICAgICAgIGJvZHlbJ2FkbWluLW5vbmNlJ10gPSBjb25maWcuYWRtaW5fbm9uY2U7XG5cbiAgICAgICAgcmVxdWVzdCh1cmwsIHsgbWV0aG9kOiAncG9zdCcsIGJvZHkgfSwgKCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFwYXRoKSB7IHJldHVybjsgfVxuXG4gICAgICAgICAgICBwYXRoID0gdGhpcy5iNjRfdG9fdXRmOChwYXRoWzFdKTtcbiAgICAgICAgICAgIGxldCBpbnB1dCA9IHRoaXMuY29udGFpbmVyLmZpbmQoJ1tuYW1lXVt0eXBlPVwiaGlkZGVuXCJdJyk7XG4gICAgICAgICAgICBsZXQgZGF0YSA9IEpTT04ucGFyc2UoaW5wdXQudmFsKCkgfHwgJ3t9Jyk7XG4gICAgICAgICAgICBkZWxldGUgZGF0YVtwYXRoXTtcbiAgICAgICAgICAgIGlucHV0LnZhbChKU09OLnN0cmluZ2lmeShkYXRhKSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIG9uRHJvcHpvbmVFcnJvcihmaWxlLCByZXNwb25zZSwgeGhyKSB7XG4gICAgICAgIGxldCBtZXNzYWdlID0geGhyID8gcmVzcG9uc2UuZXJyb3IubWVzc2FnZSA6IHJlc3BvbnNlO1xuICAgICAgICAkKGZpbGUucHJldmlld0VsZW1lbnQpLmZpbmQoJ1tkYXRhLWR6LWVycm9ybWVzc2FnZV0nKS5odG1sKG1lc3NhZ2UpO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmhhbmRsZUVycm9yKHtcbiAgICAgICAgICAgIGZpbGUsXG4gICAgICAgICAgICBkYXRhOiB7IHN0YXR1czogJ2Vycm9yJyB9LFxuICAgICAgICAgICAgbXNnOiBgPHByZT4ke21lc3NhZ2V9PC9wcmU+YFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBoYW5kbGVFcnJvcihvcHRpb25zKSB7XG4gICAgICAgIGxldCB7IGZpbGUsIGRhdGEsIG1vZGUsIG1zZyB9ID0gb3B0aW9ucztcbiAgICAgICAgaWYgKGRhdGEuc3RhdHVzICE9PSAnZXJyb3InICYmIGRhdGEuc3RhdHVzICE9PSAndW5hdXRob3JpemVkJykgeyByZXR1cm47IH1cblxuICAgICAgICBzd2l0Y2ggKG1vZGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ2FkZEJhY2snOlxuICAgICAgICAgICAgICAgIGlmIChmaWxlIGluc3RhbmNlb2YgRmlsZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRyb3B6b25lLmFkZEZpbGUuY2FsbCh0aGlzLmRyb3B6b25lLCBmaWxlKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRyb3B6b25lLmZpbGVzLnB1c2goZmlsZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZHJvcHpvbmUub3B0aW9ucy5hZGRlZGZpbGUuY2FsbCh0aGlzLmRyb3B6b25lLCBmaWxlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kcm9wem9uZS5vcHRpb25zLnRodW1ibmFpbC5jYWxsKHRoaXMuZHJvcHpvbmUsIGZpbGUsIGZpbGUuZXh0cmFzLnVybCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdyZW1vdmVGaWxlJzpcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgaWYgKH50aGlzLmRyb3B6b25lLmZpbGVzLmluZGV4T2YoZmlsZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgZmlsZS5yZWplY3RlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZHJvcHpvbmUucmVtb3ZlRmlsZS5jYWxsKHRoaXMuZHJvcHpvbmUsIGZpbGUsIHsgc2lsZW50OiB0cnVlIH0pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IG1vZGFsID0gJCgnW2RhdGEtcmVtb2RhbC1pZD1cImdlbmVyaWNcIl0nKTtcbiAgICAgICAgY29uc3QgY2xlYW5OYW1lID0gZmlsZS5uYW1lLnJlcGxhY2UoJzwnLCAnJmx0OycpLnJlcGxhY2UoJz4nLCAnJmd0OycpO1xuXG4gICAgICAgIG1vZGFsLmZpbmQoJy5lcnJvci1jb250ZW50JykuaHRtbChtc2cucmVwbGFjZSgne3tmaWxlTmFtZX19JywgY2xlYW5OYW1lKSk7XG4gICAgICAgICQucmVtb2RhbC5sb29rdXBbbW9kYWwuZGF0YSgncmVtb2RhbCcpXS5vcGVuKCk7XG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gVXJpVG9NYXJrZG93bih1cmkpIHtcbiAgICB1cmkgPSB1cmkucmVwbGFjZSgvQDN4fEAyeHxAMXgvLCAnJyk7XG4gICAgdXJpID0gdXJpLnJlcGxhY2UoL1xcKC9nLCAnJTI4Jyk7XG4gICAgdXJpID0gdXJpLnJlcGxhY2UoL1xcKS9nLCAnJTI5Jyk7XG5cbiAgICBjb25zdCB0aXRsZSA9IHVyaS5zcGxpdCgnLicpLnNsaWNlKDAsIC0xKS5qb2luKCcuJyk7XG5cbiAgICByZXR1cm4gdXJpLm1hdGNoKC9cXC4oanBlP2d8cG5nfGdpZnxzdmd8d2VicHxtcDR8d2VibXxvZ3Z8bW92KSQvaSkgPyBgIVske3RpdGxlfV0oJHt1cml9IFwiJHt0aXRsZX1cIilgIDogYFske2RlY29kZVVSSSh1cmkpfV0oJHt1cml9KWA7XG59XG5cbmxldCBpbnN0YW5jZXMgPSBbXTtcbmxldCBjYWNoZSA9ICQoKTtcbmNvbnN0IG9uQWRkZWROb2RlcyA9IChldmVudCwgdGFyZ2V0LyogLCByZWNvcmQsIGluc3RhbmNlICovKSA9PiB7XG4gICAgbGV0IGZpbGVzID0gJCh0YXJnZXQpLmZpbmQoJy5kcm9wem9uZS5maWxlcy11cGxvYWQnKTtcbiAgICBpZiAoIWZpbGVzLmxlbmd0aCkgeyByZXR1cm47IH1cblxuICAgIGZpbGVzLmVhY2goKGluZGV4LCBmaWxlKSA9PiB7XG4gICAgICAgIGZpbGUgPSAkKGZpbGUpO1xuICAgICAgICBpZiAoIX5jYWNoZS5pbmRleChmaWxlKSkge1xuICAgICAgICAgICAgYWRkTm9kZShmaWxlKTtcbiAgICAgICAgfVxuICAgIH0pO1xufTtcblxuY29uc3QgYWRkTm9kZSA9IChjb250YWluZXIpID0+IHtcbiAgICBjb250YWluZXIgPSAkKGNvbnRhaW5lcik7XG4gICAgbGV0IGlucHV0ID0gY29udGFpbmVyLmZpbmQoJ2lucHV0W3R5cGU9XCJmaWxlXCJdJyk7XG4gICAgbGV0IHNldHRpbmdzID0gY29udGFpbmVyLmRhdGEoJ2dyYXYtZmlsZS1zZXR0aW5ncycpIHx8IHt9O1xuXG4gICAgaWYgKHNldHRpbmdzLmFjY2VwdCAmJiB+c2V0dGluZ3MuYWNjZXB0LmluZGV4T2YoJyonKSkge1xuICAgICAgICBzZXR0aW5ncy5hY2NlcHQgPSBbJyddO1xuICAgIH1cblxuICAgIGxldCBvcHRpb25zID0ge1xuICAgICAgICB1cmw6IGNvbnRhaW5lci5kYXRhKCdmaWxlLXVybC1hZGQnKSB8fCAoY29udGFpbmVyLmNsb3Nlc3QoJ2Zvcm0nKS5hdHRyKCdhY3Rpb24nKSB8fCBjb25maWcuY3VycmVudF91cmwpICsgJy5qc29uJyxcbiAgICAgICAgcGFyYW1OYW1lOiBzZXR0aW5ncy5wYXJhbU5hbWUgfHwgJ2ZpbGUnLFxuICAgICAgICBkb3ROb3RhdGlvbjogc2V0dGluZ3MubmFtZSB8fCAnZmlsZScsXG4gICAgICAgIGFjY2VwdGVkRmlsZXM6IHNldHRpbmdzLmFjY2VwdCA/IHNldHRpbmdzLmFjY2VwdC5qb2luKCcsJykgOiBpbnB1dC5hdHRyKCdhY2NlcHQnKSB8fCBjb250YWluZXIuZGF0YSgnbWVkaWEtdHlwZXMnKSxcbiAgICAgICAgbWF4RmlsZXNpemU6IHR5cGVvZiBzZXR0aW5ncy5maWxlc2l6ZSAhPT0gJ3VuZGVmaW5lZCcgPyBzZXR0aW5ncy5maWxlc2l6ZSA6IDI1NixcbiAgICAgICAgbWF4RmlsZXM6IHNldHRpbmdzLmxpbWl0IHx8IG51bGwsXG4gICAgICAgIHJlc2l6ZVdpZHRoOiBzZXR0aW5ncy5yZXNpemVXaWR0aCB8fCBudWxsLFxuICAgICAgICByZXNpemVIZWlnaHQ6IHNldHRpbmdzLnJlc2l6ZUhlaWdodCB8fCBudWxsLFxuICAgICAgICByZXNpemVRdWFsaXR5OiBzZXR0aW5ncy5yZXNpemVRdWFsaXR5IHx8IG51bGwsXG4gICAgICAgIHJlc29sdXRpb246IHNldHRpbmdzLnJlc29sdXRpb24gfHwgbnVsbCxcbiAgICAgICAgYWNjZXB0OiBmdW5jdGlvbihmaWxlLCBkb25lKSB7IEFDQ0VQVF9GVU5DKGZpbGUsIGRvbmUsIHNldHRpbmdzKTsgfVxuICAgIH07XG5cbiAgICBjYWNoZSA9IGNhY2hlLmFkZChjb250YWluZXIpO1xuICAgIGNvbnRhaW5lciA9IGNvbnRhaW5lclswXTtcbiAgICBpbnN0YW5jZXMucHVzaChuZXcgRmlsZXNGaWVsZCh7IGNvbnRhaW5lciwgb3B0aW9ucyB9KSk7XG59O1xuXG5leHBvcnQgbGV0IEluc3RhbmNlID0gKCgpID0+IHtcbiAgICAkKCcuZHJvcHpvbmUuZmlsZXMtdXBsb2FkJykuZWFjaCgoaSwgY29udGFpbmVyKSA9PiBhZGROb2RlKGNvbnRhaW5lcikpO1xuICAgICQoJ2JvZHknKS5vbignbXV0YXRpb24uX2dyYXYnLCBvbkFkZGVkTm9kZXMpO1xuXG4gICAgcmV0dXJuIGluc3RhbmNlcztcbn0pKCk7XG4iXSwibmFtZXMiOlsiJCIsIkRyb3B6b25lIiwicmVxdWVzdCIsImNvbmZpZyIsInRyYW5zbGF0aW9ucyIsIkRpY3Rpb25hcnkiLCJkaWN0Q2FuY2VsVXBsb2FkIiwiUExVR0lOX0FETUlOIiwiRFJPUFpPTkVfQ0FOQ0VMX1VQTE9BRCIsImRpY3RDYW5jZWxVcGxvYWRDb25maXJtYXRpb24iLCJEUk9QWk9ORV9DQU5DRUxfVVBMT0FEX0NPTkZJUk1BVElPTiIsImRpY3REZWZhdWx0TWVzc2FnZSIsIkRST1BaT05FX0RFRkFVTFRfTUVTU0FHRSIsImRpY3RGYWxsYmFja01lc3NhZ2UiLCJEUk9QWk9ORV9GQUxMQkFDS19NRVNTQUdFIiwiZGljdEZhbGxiYWNrVGV4dCIsIkRST1BaT05FX0ZBTExCQUNLX1RFWFQiLCJkaWN0RmlsZVRvb0JpZyIsIkRST1BaT05FX0ZJTEVfVE9PX0JJRyIsImRpY3RJbnZhbGlkRmlsZVR5cGUiLCJEUk9QWk9ORV9JTlZBTElEX0ZJTEVfVFlQRSIsImRpY3RNYXhGaWxlc0V4Y2VlZGVkIiwiRFJPUFpPTkVfTUFYX0ZJTEVTX0VYQ0VFREVEIiwiZGljdFJlbW92ZUZpbGUiLCJEUk9QWk9ORV9SRU1PVkVfRklMRSIsImRpY3RSZXNwb25zZUVycm9yIiwiRFJPUFpPTkVfUkVTUE9OU0VfRVJST1IiLCJhdXRvRGlzY292ZXIiLCJvcHRpb25zIiwiZ3JhdlBhZ2VEcm9wem9uZSIsImNvbmZpcm0iLCJxdWVzdGlvbiIsImFjY2VwdGVkIiwicmVqZWN0ZWQiLCJkb2MiLCJkb2N1bWVudCIsIm1vZGFsU2VsZWN0b3IiLCJyZW1vdmVFdmVudHMiLCJvZmYiLCJhY2NlcHQiLCJyZWplY3QiLCJmaW5kIiwicmVtb3ZlQ2xhc3MiLCJyZW1vZGFsIiwibG9va3VwIiwiZGF0YSIsIm9wZW4iLCJvbiIsIkRyb3B6b25lTWVkaWFDb25maWciLCJ0aW1lb3V0IiwidGh1bWJuYWlsV2lkdGgiLCJ0aHVtYm5haWxIZWlnaHQiLCJhZGRSZW1vdmVMaW5rcyIsIkRST1BfRklMRVNfSEVSRV9UT19VUExPQUQiLCJyZXBsYWNlIiwiZGljdFJlbW92ZUZpbGVDb25maXJtYXRpb24iLCJwcmV2aWV3VGVtcGxhdGUiLCJVTlNFVCIsIkRFTEVURSIsIk1FVEFEQVRBIiwiVklFVyIsInRyaW0iLCJBQ0NFUFRfRlVOQyIsImZpbGUiLCJkb25lIiwic2V0dGluZ3MiLCJyZXNvbHV0aW9uIiwicmVhZGVyIiwiRmlsZVJlYWRlciIsImVycm9yIiwiaGFzTWluIiwibWluIiwid2lkdGgiLCJoZWlnaHQiLCJoYXNNYXgiLCJtYXgiLCJyZXNpemVXaWR0aCIsInJlc2l6ZUhlaWdodCIsIm9ubG9hZCIsImV2ZW50IiwidGVzdCIsInR5cGUiLCJpbWFnZSIsIkltYWdlIiwic3JjIiwidGFyZ2V0IiwicmVzdWx0Iiwib25lcnJvciIsIkZJTEVfRVJST1JfVVBMT0FEIiwiT2JqZWN0Iiwia2V5cyIsImZvckVhY2giLCJhdHRyIiwiUExVR0lOX0ZPUk0iLCJSRVNPTFVUSU9OX01JTiIsIlJFU09MVVRJT05fTUFYIiwiVVJMIiwicmV2b2tlT2JqZWN0VVJMIiwicmVhZEFzRGF0YVVSTCIsIkZpbGVzRmllbGQiLCJjb250YWluZXIiLCJsZW5ndGgiLCJ1cmxzIiwiY3VzdG9tUG9zdCIsImFzc2lnbiIsImtsYXNzIiwidXJsIiwiY3VycmVudF91cmwiLCJhY2NlcHRlZEZpbGVzIiwiaW5pdCIsImluaXREcm9wem9uZSIsImRyb3B6b25lIiwib25Ecm9wem9uZUNvbXBsZXRlIiwiYmluZCIsIm9uRHJvcHpvbmVTdWNjZXNzIiwib25Ecm9wem9uZUFkZGVkRmlsZSIsIm9uRHJvcHpvbmVSZW1vdmVkRmlsZSIsIm9uRHJvcHpvbmVTZW5kaW5nIiwib25Ecm9wem9uZUVycm9yIiwiZSIsInZhbHVlIiwiSlNPTiIsInBhcnNlIiwidmFsIiwiY3VycmVudFRhcmdldCIsInBhcmVudCIsImZpbGVuYW1lIiwiZW5jb2RlVVJJIiwidGV4dCIsImZpbHRlciIsImtleSIsIm5hbWUiLCJzaGlmdCIsImJhc2VfdXJsX3NpbXBsZSIsImZpbGVzIiwiZWFjaCIsImluZGV4IiwibW9jayIsInNpemUiLCJzdGF0dXMiLCJBRERFRCIsInJlbW92ZVVybCIsInJlbW92ZSIsInB1c2giLCJhZGRlZGZpbGUiLCJjYWxsIiwibWF0Y2giLCJ0aHVtYm5haWwiLCJwYXRoIiwiY3JlYXRlVGh1bWJuYWlsRnJvbVVybCIsInhociIsImZvcm1EYXRhIiwiYXBwZW5kIiwiZG90Tm90YXRpb24iLCJnZXRVUkkiLCJhZG1pbl9ub25jZSIsInJlc3BvbnNlIiwicmVsb2FkUGFnZSIsImdsb2JhbCIsImxvY2F0aW9uIiwicmVsb2FkIiwic2Vzc2lvbiIsInNlc3Npb25QYXJhbXMiLCJpbnB1dCIsImhhbmRsZUVycm9yIiwibW9kZSIsIm1zZyIsIm1lc3NhZ2UiLCJGSUxFX1VOU1VQUE9SVEVEIiwiam9pbiIsIkZJTEVfRVJST1JfQUREIiwic3RyIiwiZGVjb2RlVVJJQ29tcG9uZW50IiwiZXNjYXBlIiwid2luZG93IiwiYXRvYiIsImJvZHkiLCJ1cmkiLCJ0YXNrIiwibWV0aG9kIiwiYjY0X3RvX3V0ZjgiLCJzdHJpbmdpZnkiLCJwcmV2aWV3RWxlbWVudCIsImh0bWwiLCJGaWxlIiwiYWRkRmlsZSIsImV4dHJhcyIsImluZGV4T2YiLCJyZW1vdmVGaWxlIiwic2lsZW50IiwibW9kYWwiLCJjbGVhbk5hbWUiLCJVcmlUb01hcmtkb3duIiwidGl0bGUiLCJzcGxpdCIsInNsaWNlIiwiZGVjb2RlVVJJIiwiaW5zdGFuY2VzIiwiY2FjaGUiLCJvbkFkZGVkTm9kZXMiLCJhZGROb2RlIiwiY2xvc2VzdCIsInBhcmFtTmFtZSIsIm1heEZpbGVzaXplIiwiZmlsZXNpemUiLCJtYXhGaWxlcyIsImxpbWl0IiwicmVzaXplUXVhbGl0eSIsImFkZCIsIkluc3RhbmNlIiwiaSJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./app/forms/fields/files.js\n"); /***/ }), @@ -435,7 +435,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ PageMedia),\n/* harmony export */ \"updateMediaSizes\": () => (/* binding */ updateMediaSizes),\n/* harmony export */ \"updateMediaCollapseStatus\": () => (/* binding */ updateMediaCollapseStatus),\n/* harmony export */ \"Instance\": () => (/* binding */ Instance)\n/* harmony export */ });\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jquery */ \"jquery\");\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _utils_cookies_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../utils/cookies.js */ \"./app/utils/cookies.js\");\n/* harmony import */ var _utils_request__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../utils/request */ \"./app/utils/request.js\");\n/* harmony import */ var _forms_fields_files__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../forms/fields/files */ \"./app/forms/fields/files.js\");\n/* harmony import */ var grav_config__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! grav-config */ \"grav-config\");\n/* harmony import */ var grav_config__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(grav_config__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var _forms_fields_editor__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../forms/fields/editor */ \"./app/forms/fields/editor.js\");\n/* harmony import */ var sortablejs__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! sortablejs */ \"./node_modules/sortablejs/modular/sortable.esm.js\");\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\n\nfunction _get() { if (typeof Reflect !== \"undefined\" && Reflect.get) { _get = Reflect.get; } else { _get = function _get(target, property, receiver) { var base = _superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return _get.apply(this, arguments); }\n\nfunction _superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = _getPrototypeOf(object); if (object === null) break; } return object; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, \"prototype\", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nfunction _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } else if (call !== void 0) { throw new TypeError(\"Derived constructors may only return object or undefined\"); } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _isNativeReflectConstruct() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\n\n\n\n\n\n\n\nvar previewTemplate = \"\\n
\\n
\\n
\\n
\\n \\n
\\n
\\n
\\u2714
\\n
\\u2718
\\n
\\n \").concat(grav_config__WEBPACK_IMPORTED_MODULE_4__.translations.PLUGIN_ADMIN.DELETE, \"\\n \").concat(grav_config__WEBPACK_IMPORTED_MODULE_4__.translations.PLUGIN_ADMIN.METADATA, \"\\n \").concat(grav_config__WEBPACK_IMPORTED_MODULE_4__.translations.PLUGIN_ADMIN.VIEW, \"\\n \").concat(grav_config__WEBPACK_IMPORTED_MODULE_4__.translations.PLUGIN_ADMIN.INSERT, \"\\n
\").trim();\n\nvar PageMedia = /*#__PURE__*/function (_FilesField) {\n _inherits(PageMedia, _FilesField);\n\n var _super = _createSuper(PageMedia);\n\n function PageMedia() {\n var _this;\n\n var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},\n _ref$container = _ref.container,\n container = _ref$container === void 0 ? '#grav-dropzone' : _ref$container,\n _ref$options = _ref.options,\n options = _ref$options === void 0 ? {} : _ref$options;\n\n _classCallCheck(this, PageMedia);\n\n options = Object.assign(options, {\n previewTemplate: previewTemplate\n });\n _this = _super.call(this, {\n container: container,\n options: options\n });\n\n if (!_this.container.length) {\n return _possibleConstructorReturn(_this);\n }\n\n _this.urls = {\n fetch: \"\".concat(_this.container.data('media-url'), \"/task\").concat(grav_config__WEBPACK_IMPORTED_MODULE_4__.config.param_sep, \"listmedia\"),\n add: \"\".concat(_this.container.data('media-url'), \"/task\").concat(grav_config__WEBPACK_IMPORTED_MODULE_4__.config.param_sep, \"addmedia\"),\n \"delete\": \"\".concat(_this.container.data('media-url'), \"/task\").concat(grav_config__WEBPACK_IMPORTED_MODULE_4__.config.param_sep, \"delmedia\")\n };\n _this.dropzone.options.url = _this.urls.add;\n\n if (typeof _this.options.fetchMedia === 'undefined' || _this.options.fetchMedia) {\n _this.fetchMedia();\n }\n\n if (typeof _this.options.attachDragDrop === 'undefined' || _this.options.attachDragDrop) {\n _this.attachDragDrop();\n }\n\n var field = jquery__WEBPACK_IMPORTED_MODULE_0___default()(\"[name=\\\"\".concat(_this.container.data('dropzone-field'), \"\\\"]\"));\n\n if (field.length) {\n _this.sortable = new sortablejs__WEBPACK_IMPORTED_MODULE_6__[\"default\"](_this.container.get(0), {\n animation: 150,\n // forceFallback: true,\n setData: function setData(dataTransfer, target) {\n target = jquery__WEBPACK_IMPORTED_MODULE_0___default()(target);\n var uri = encodeURI(target.find('.dz-filename').text());\n var shortcode = (0,_forms_fields_files__WEBPACK_IMPORTED_MODULE_3__.UriToMarkdown)(uri);\n\n _this.dropzone.disable();\n\n target.addClass('hide-backface');\n dataTransfer.effectAllowed = 'copy';\n dataTransfer.setData('text', shortcode);\n },\n onSort: function onSort() {\n var names = [];\n\n _this.container.find('[data-dz-name]').each(function (index, file) {\n file = jquery__WEBPACK_IMPORTED_MODULE_0___default()(file);\n var name = file.text().trim();\n names.push(name);\n });\n\n field.val(names.join(','));\n }\n });\n }\n\n return _this;\n }\n\n _createClass(PageMedia, [{\n key: \"fetchMedia\",\n value: function fetchMedia() {\n var _this2 = this;\n\n var order = this.container.closest('.form-field').find('[name=\"data[header][media_order]\"]').val();\n var body = {\n uri: this.getURI(),\n order: order\n };\n var url = this.urls.fetch;\n (0,_utils_request__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(url, {\n method: 'post',\n body: body\n }, function (response) {\n var results = response.results;\n Object.keys(results).forEach(function (name) {\n var data = results[name];\n var mock = {\n name: name,\n size: data.size,\n accepted: true,\n extras: data\n };\n\n _this2.dropzone.files.push(mock);\n\n _this2.dropzone.options.addedfile.call(_this2.dropzone, mock);\n\n _this2.dropzone.options.thumbnail.call(_this2.dropzone, mock, data.url);\n });\n var status = JSON.parse(_utils_cookies_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"].get('grav-admin-pagemedia') || '{}');\n\n if (status.width) {\n var input = _this2.container.closest('.pagemedia-field').find('.media-resizer');\n\n updateMediaSizes(input, status.width, false);\n }\n\n _this2.container.find('.dz-preview').prop('draggable', 'true');\n });\n }\n }, {\n key: \"onDropzoneSending\",\n value: function onDropzoneSending(file, xhr, formData) {\n /*\n // Cannot call super because Safari and IE API don't implement `delete`\n super.onDropzoneSending(file, xhr, formData);\n formData.delete('task');\n */\n formData.append('name', this.options.dotNotation || file.name);\n formData.append('admin-nonce', grav_config__WEBPACK_IMPORTED_MODULE_4__.config.admin_nonce);\n formData.append('uri', this.getURI());\n }\n }, {\n key: \"onDropzoneComplete\",\n value: function onDropzoneComplete(file) {\n _get(_getPrototypeOf(PageMedia.prototype), \"onDropzoneComplete\", this).call(this, file);\n\n if (this.sortable) {\n this.sortable.options.onSort();\n } // accepted\n\n\n var status = JSON.parse(_utils_cookies_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"].get('grav-admin-pagemedia') || '{}');\n\n if (status.width) {\n var input = this.container.closest('.pagemedia-field').find('.media-resizer');\n updateMediaSizes(input, status.width, false);\n }\n\n jquery__WEBPACK_IMPORTED_MODULE_0___default()('.dz-preview').prop('draggable', 'true');\n }\n }, {\n key: \"onDropzoneRemovedFile\",\n value: function onDropzoneRemovedFile(file) {\n var _get2;\n\n for (var _len = arguments.length, extra = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n extra[_key - 1] = arguments[_key];\n }\n\n (_get2 = _get(_getPrototypeOf(PageMedia.prototype), \"onDropzoneRemovedFile\", this)).call.apply(_get2, [this, file].concat(extra));\n\n if (this.sortable) {\n this.sortable.options.onSort();\n }\n }\n }, {\n key: \"attachDragDrop\",\n value: function attachDragDrop() {\n var _this3 = this;\n\n this.container.delegate('[data-dz-insert]', 'click', function (e) {\n var target = jquery__WEBPACK_IMPORTED_MODULE_0___default()(e.currentTarget).parent('.dz-preview').find('.dz-filename');\n var editor = _forms_fields_editor__WEBPACK_IMPORTED_MODULE_5__.Instance.editors.filter(function (index, editor) {\n return jquery__WEBPACK_IMPORTED_MODULE_0___default()(editor).attr('name') === 'data[content]';\n });\n\n if (editor.length) {\n editor = editor.data('codemirror');\n editor.focus();\n var filename = encodeURI(target.text());\n var shortcode = (0,_forms_fields_files__WEBPACK_IMPORTED_MODULE_3__.UriToMarkdown)(filename);\n editor.doc.replaceSelection(shortcode);\n }\n });\n this.container.delegate('[data-dz-view]', 'mouseenter', function (e) {\n var target = jquery__WEBPACK_IMPORTED_MODULE_0___default()(e.currentTarget);\n var file = target.parent('.dz-preview').find('.dz-filename');\n var filename = encodeURI(file.text());\n var URL = target.closest('[data-media-path]').data('media-path');\n\n var original = _this3.dropzone.files.filter(function (file) {\n return encodeURI(file.name) === filename;\n }).shift();\n\n original = original && (original.extras && original.extras.original || encodeURI(original.name));\n target.attr('href', \"\".concat(URL, \"/\").concat(original));\n });\n this.container.delegate('[data-dz-metadata]', 'click', function (e) {\n e.preventDefault();\n var target = jquery__WEBPACK_IMPORTED_MODULE_0___default()(e.currentTarget);\n var file = target.parent('.dz-preview').find('.dz-filename');\n var filename = encodeURI(file.text());\n var cleanName = file.text().replace('<', '<').replace('>', '>');\n var fileObj = _this3.dropzone.files.filter(function (file) {\n return file.name === __webpack_require__.g.decodeURI(filename);\n }).shift() || {};\n\n if (!fileObj.extras) {\n fileObj.extras = {\n metadata: []\n };\n }\n\n if (Array.isArray(fileObj.extras.metadata) && !fileObj.extras.metadata.length) {\n fileObj.extras.metadata = {\n '': \"\".concat(cleanName, \".meta.yaml doesn't exist\")\n };\n }\n\n fileObj = fileObj.extras;\n var modal_element = jquery__WEBPACK_IMPORTED_MODULE_0___default()('body').find('[data-remodal-id=\"metadata\"]');\n var modal = (jquery__WEBPACK_IMPORTED_MODULE_0___default().remodal.lookup)[modal_element.data('remodal')];\n modal_element.find('h1 strong').html(cleanName);\n\n if (fileObj.url) {\n modal_element.find('.meta-preview').html(\"\"));\n }\n\n var container = modal_element.find('.meta-content').html('