@webhandle/tree-file-browser 1.0.2 → 1.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tree-file-browser.js","mappings":"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","sources":["webpack://@webhandle/tree-file-browser/./node_modules/@dankolz/escape-html-attribute-value/index.js","webpack://@webhandle/tree-file-browser/./node_modules/@dankolz/webhandle-admin-icons/client-js/ensure-styles-are-loaded.js","webpack://@webhandle/tree-file-browser/./node_modules/@dankolz/webp-detection/lib/condense-image-variants.js","webpack://@webhandle/tree-file-browser/./node_modules/@dankolz/webp-detection/lib/definitions.js","webpack://@webhandle/tree-file-browser/./node_modules/@dankolz/webp-detection/lib/file-basename.js","webpack://@webhandle/tree-file-browser/./node_modules/@dankolz/webp-detection/lib/find-preview-variant.js","webpack://@webhandle/tree-file-browser/./node_modules/@dankolz/webp-detection/lib/find-primary-variant.js","webpack://@webhandle/tree-file-browser/./node_modules/@dankolz/webp-detection/lib/is-file-image-name.js","webpack://@webhandle/tree-file-browser/./node_modules/@dankolz/webp-detection/lib/is-file-image.js","webpack://@webhandle/tree-file-browser/./node_modules/@dankolz/webp-detection/lib/make-variant-image.js","webpack://@webhandle/tree-file-browser/./node_modules/ei-dialog/dialog.js","webpack://@webhandle/tree-file-browser/./node_modules/form-value-injector/form-value-injector.js","webpack://@webhandle/tree-file-browser/./node_modules/input-value-injector/input-value-injector.js","webpack://@webhandle/tree-file-browser/./node_modules/kalpa-tree-on-page/client-js/icons.js","webpack://@webhandle/tree-file-browser/./node_modules/kalpa-tree-on-page/client-js/kalpa-tree-loader.js","webpack://@webhandle/tree-file-browser/./node_modules/kalpa-tree-on-page/client-js/serialize-a-node.js","webpack://@webhandle/tree-file-browser/./node_modules/kalpa-tree-on-page/client-js/serialize-tree-nodes.js","webpack://@webhandle/tree-file-browser/./node_modules/kalpa-tree-on-page/client-js/streamish.js","webpack://@webhandle/tree-file-browser/./node_modules/ei-dialog/dialog-styles.txt","webpack://@webhandle/tree-file-browser/./node_modules/select-value-injector/select-value-injector.js","webpack://@webhandle/tree-file-browser/./node_modules/textarea-value-injector/textarea-value-injector.js","webpack://@webhandle/tree-file-browser/./node_modules/tripartite/active-element.js","webpack://@webhandle/tree-file-browser/./node_modules/tripartite/calculate-relative-path.js","webpack://@webhandle/tree-file-browser/./node_modules/tripartite/evaluate-in-context.js","webpack://@webhandle/tree-file-browser/./node_modules/tripartite/execution-context.js","webpack://@webhandle/tree-file-browser/./node_modules/tripartite/resolve-data-path.js","webpack://@webhandle/tree-file-browser/./node_modules/tripartite/tripartite.js","webpack://@webhandle/tree-file-browser/./views/webhandle-tree-image-browser/extension-pill.tri","webpack://@webhandle/tree-file-browser/./views/webhandle-tree-image-browser/guilded-file-upload-form.tri","webpack://@webhandle/tree-file-browser/./views/webhandle-tree-image-browser/guilded-image-upload-form.tri","webpack://@webhandle/tree-file-browser/./views/webhandle-tree-image-browser/image-browser-frame.tri","webpack://@webhandle/tree-file-browser/./views/webhandle-tree-image-browser/variant-choice-box.tri","webpack://@webhandle/tree-file-browser/webpack/bootstrap","webpack://@webhandle/tree-file-browser/webpack/runtime/define property getters","webpack://@webhandle/tree-file-browser/webpack/runtime/global","webpack://@webhandle/tree-file-browser/webpack/runtime/hasOwnProperty shorthand","webpack://@webhandle/tree-file-browser/webpack/runtime/make namespace object","webpack://@webhandle/tree-file-browser/./node_modules/@webhandle/backbone-view/client-js/event-entry-mapper.js","webpack://@webhandle/tree-file-browser/./node_modules/@webhandle/backbone-view/client-js/view.js","webpack://@webhandle/tree-file-browser/./node_modules/@webhandle/backbone-view/client-js/generate-id.js","webpack://@webhandle/tree-file-browser/./node_modules/@webhandle/backbone-view/client-js/extract-event-names.js","webpack://@webhandle/tree-file-browser/./views/load-browser-views.js","webpack://@webhandle/tree-file-browser/./client-lib/format-bytes.mjs","webpack://@webhandle/tree-file-browser/./node_modules/@webhandle/minimal-browser-event-emitter/client-js/event-emitter.mjs","webpack://@webhandle/tree-file-browser/./node_modules/@webhandle/minimal-browser-event-emitter/client-js/index.js","webpack://@webhandle/tree-file-browser/./node_modules/@webhandle/minimal-browser-event-emitter/client-js/streamish.mjs","webpack://@webhandle/tree-file-browser/./client-lib/form-answer-dialog.mjs","webpack://@webhandle/tree-file-browser/./node_modules/@webhandle/gather-form-data/gather-form-data.mjs","webpack://@webhandle/tree-file-browser/./client-lib/image-browser-view-methods/delete.mjs","webpack://@webhandle/tree-file-browser/./client-lib/image-browser-view-methods/utils.mjs","webpack://@webhandle/tree-file-browser/./client-lib/info-dialog.mjs","webpack://@webhandle/tree-file-browser/./client-lib/image-browser-view-methods/view-interactions.mjs","webpack://@webhandle/tree-file-browser/./client-lib/image-browser-view-methods/drag-and-drop.mjs","webpack://@webhandle/tree-file-browser/./client-lib/image-browser-view-methods/create-directory.mjs","webpack://@webhandle/tree-file-browser/./client-lib/add-soft-breaks.mjs","webpack://@webhandle/tree-file-browser/./client-lib/image-browser-view-methods/file-obj-manipulation.mjs","webpack://@webhandle/tree-file-browser/./client-lib/base-image-name.mjs","webpack://@webhandle/tree-file-browser/./client-lib/data-to-image.mjs","webpack://@webhandle/tree-file-browser/./client-lib/image-resize.mjs","webpack://@webhandle/tree-file-browser/./client-lib/get-image-stats.mjs","webpack://@webhandle/tree-file-browser/./client-lib/get-extension-from-mime.mjs","webpack://@webhandle/tree-file-browser/./client-lib/make-image-set.mjs","webpack://@webhandle/tree-file-browser/./client-lib/name-parts.mjs","webpack://@webhandle/tree-file-browser/./client-lib/image-browser-view-methods/upload.mjs","webpack://@webhandle/tree-file-browser/./client-lib/get-file-image-stats.mjs","webpack://@webhandle/tree-file-browser/./client-lib/image-browser-view-methods/sink.mjs","webpack://@webhandle/tree-file-browser/./client-lib/image-browser-view.mjs","webpack://@webhandle/tree-file-browser/./client-lib/dynamic-load.mjs","webpack://@webhandle/tree-file-browser/./client-lib/file-select-dialog.mjs","webpack://@webhandle/tree-file-browser/./client-lib/load-styles.mjs","webpack://@webhandle/tree-file-browser/./client-lib/styles-loaded.mjs"],"sourcesContent":["function escapeHtmlAttributeValue(s, preserveCR) {\n preserveCR = preserveCR ? ' ' : '\\n';\n return ('' + s) \n .replace(/&/g, '&') \n .replace(/'/g, ''') \n .replace(/\"/g, '"')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\\r\\n/g, preserveCR) \n .replace(/[\\r\\n]/g, preserveCR)\n}\n\nmodule.exports = escapeHtmlAttributeValue\n",";\nfunction ensureStylesAreLoaded() {\n\tfunction test() {\n\t\tlet d = document.createElement('div');\n\t\td.classList.add('material-icons-styles-marker');\n\t\tdocument.body.appendChild(d);\n\t\tlet content = window.getComputedStyle(d).content;\n\t\t\n\t\tif(content.indexOf('loaded') < 0) {\n\t\t\tdocument.head.insertAdjacentHTML('beforeend', '<link rel=\"stylesheet\" href=\"/@dankolz/webhandle-admin-icons/resources/css/admin-icons.css\">');\n\t\t}\n\t\td.remove();\n\t};\n\tif(document.body) {\n\t\ttest();\n\t}\n\telse {\n\t\tdocument.addEventListener(\"DOMContentLoaded\", test);\n\t}\n};\n\nmodule.exports = ensureStylesAreLoaded\n;\n","let {imageExtensions, smallerSizeExt, imageSizeExt} = require('./definitions')\nconst findPreviewVariant = require('./find-preview-variant')\nconst isFileImage = require('./is-file-image')\nconst makeVariantImage = require('./make-variant-image')\nconst fileBasename = require('./file-basename')\nconst findPrimaryVariant = require('./find-primary-variant')\n\n/**\n * Condenses an array of files into logical images with their variants. This works on a set of image files which all share\n * a base name, but have different extensions depending on how much larger or smaller they are compared to\n * the \"natural\" size of that image and what format they use (png, jpg, webp). There may also exist an additional json\n * file which shares the base name which contains information about description or other attributes.\n * \n * @param {array} directoryContents An array of file objects like those returned from FileSink.getFullFileInfo\n * That is, they have a `name` attribute which is the file name and a `directory` attribute which is true if a directory.\n * @returns A map of variants keyed by the image's base name.\n */\nfunction condenseImageVaraints(directoryContents) {\n\tlet files = directoryContents.filter(child => !child.directory)\n\tlet definitions = files.filter(child => child.name.toLowerCase().endsWith('.json'))\n\tlet imageFiles = files.filter(isFileImage)\n\n\tlet variants = {}\n\tfunction getVariant(baseName) {\n\t\tif (baseName in variants) {\n\t\t\treturn variants[baseName]\n\t\t}\n\t\tlet variant = {\n\t\t\tbaseName: baseName\n\t\t\t, variants: []\n\t\t}\n\t\tvariants[baseName] = variant\n\t\treturn variant\n\t}\n\n\t// create variants for all the definitions. Images don't have to have\n\t// defintions but if they do, we want to do them first.\n\tfor (let definition of definitions) {\n\t\tlet baseName = fileBasename(definition.name)\n\t\tlet variant = getVariant(baseName)\n\t\tvariant.definitionFile = definition\n\t}\n\t\n\t// match up all the image files to their variant definitions\n\tfor(let imageVariant of imageFiles.map(makeVariantImage)) {\n\t\tlet variant = getVariant(imageVariant.baseName)\n\t\tvariant.variants.push(imageVariant)\n\t}\n\t\n\t// remove those without images\n\tfor(let baseName of Array.from(Object.keys(variants))) {\n\t\tif(variants[baseName].variants.length == 0) {\n\t\t\tdelete variants[baseName]\n\t\t}\n\t}\n\t\n\t// set the preview variant\n\tObject.values(variants).forEach(setSpecialVariants)\n\n\treturn variants\n}\n\nfunction setSpecialVariants(variantDefinition) {\n\tlet preview = findPreviewVariant(variantDefinition.variants)\n\tvariantDefinition.preview = preview\n\t\n\tlet primary = findPrimaryVariant(variantDefinition.variants)\n\tvariantDefinition.primary = primary\n}\n\n\nmodule.exports = condenseImageVaraints","let definitions = {\n\timageExtensions: ['jpg', 'jpeg', 'png', 'gif', 'tiff', 'webp']\n\t, smallerSizeExt: ['quarter', 'half']\n}\ndefinitions.imageSizeExt = [...definitions.smallerSizeExt, 'std', '2x']\n\nmodule.exports = definitions","\nfunction fileBasename(name) {\n\treturn name.substring(0, name.lastIndexOf('.'))\n}\n\nmodule.exports = fileBasename","let {imageExtensions, smallerSizeExt, imageSizeExt} = require('./definitions')\n\nfunction findPreviewVariant(variants) {\n\tfor(let size of imageSizeExt) {\n\t\tfor(let img of imageExtensions) {\n\t\t\tfor(let variant of variants) {\n\t\t\t\tif(variant.size == size && variant.ext == img) {\n\t\t\t\t\treturn variant\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nmodule.exports = findPreviewVariant","let {imageExtensions, smallerSizeExt, imageSizeExt} = require('./definitions')\n\nlet fallbackSizeExt = ['std', '2x', ...smallerSizeExt]\nlet fallbackImgageExtensions = imageExtensions.filter(item => item != 'webp')\n\nfunction findPrimaryVariant(variants) {\n\tfor(let size of fallbackSizeExt) {\n\t\tfor(let img of fallbackImgageExtensions) {\n\t\t\tfor(let variant of variants) {\n\t\t\t\tif(variant.size == size && variant.ext == img) {\n\t\t\t\t\treturn variant\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nmodule.exports = findPrimaryVariant","\nlet {imageExtensions, smallerSizeExt, imageSizeExt} = require('./definitions')\n\nfunction isFileImageName(name) {\n\tlet nameLower = name.toLowerCase()\n\tfor (let ext of imageExtensions) {\n\t\tif (nameLower.endsWith('.' + ext)) {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\nmodule.exports = isFileImageName","const isFileImageName = require('./is-file-image-name')\n\nfunction isFileImage(file) {\n\treturn isFileImageName(file.name)\n}\n\nmodule.exports = isFileImage","let {imageExtensions, smallerSizeExt, imageSizeExt} = require('./definitions')\n\nfunction makeVariantImage(file) {\n\tlet info = {\n\t\tsize: 'std'\n\t\t, file: file\n\t}\n\tlet name = file.name\n\n\tinfo.ext = name.substring(name.lastIndexOf('.') + 1)\n\tlet noExt = name.substring(0, name.lastIndexOf('.'))\n\tinfo.baseName = noExt\n\tfor (let size of imageSizeExt) {\n\t\tlet sizeString = '-' + size\n\t\tif (noExt.endsWith(sizeString)) {\n\t\t\tinfo.size = size\n\t\t\tinfo.baseName = noExt.substring(0, noExt.length - sizeString.length)\n\t\t\tbreak\n\t\t}\n\t}\n\treturn info\n}\n\nmodule.exports = makeVariantImage","let dialogStyles = require('./dialog-styles.txt')\nlet sequence = 0\n\n// If we're loading via a module system or packed by webpack, we may\n// have a module here instead of the value. We need to check for default\n// and use that if it exists.\nif(typeof dialogStyles !== 'string' && dialogStyles.default) {\n\tdialogStyles = dialogStyles.default\t\n}\n\n\n/**\n * A button definition.\n * @typedef {Object} Button\n * @property {string} classes Classes to add to the button\n * @property {string} label Text shown to the user\n */\n\n\n\n/**\n * A whole page dialog. \n * @param {object} options \n * @param {string,function} options.body The contents of the body section. This can be a string,\n * in which case it will just be inserted into the body. It can be a function, in which case\n * it is expected to return a string (which will be inserted) or a Promise, which should resolve to\n * a string, which will be inserted. However, this function is passed the body element and dialog\n * object as arguments, so it can also modify content directory and return an empty string.\n * @param {object} options.on An object which the key is the selector and the value is a funtion\n * which is called when the object with that selector is clicked. If the function returns false the\n * dialog will not be closed. If it returns a Promise, the promise will be resolved and if the resolved\n * value is false, it will not be closed. Any other return condition will result in the dialog being\n * closed.\n * @param {Button[]} options.buttons The buttons that will show up in the footer of the dialog. If buttons are not\n * specified, \"OK\" and \"Cancel\" buttons will be added.\n * @param {string} options.title The title of the dialog\n * @param {string} options.dialogFrameClass An additional string inserted into the class attribute for\n * specific styling of specific types of dialog boxes.\n * @param {function} options.afterOpen A function which is called after open with the body element and dialog object\n * as arguments.\n */\nvar Dialog = function(options) {\n\tthis.id = \"dialog\" + (new Date().getTime()) + (sequence++)\n\tObject.assign(this, options)\n\tif(!this.on) {\n\t\tthis.on = {}\n\t}\n\tif(!this.on['.btn-cancel']) {\n\t\tthis.on['.btn-cancel'] = function() {\n\t\t}\n\t}\n\tif(!this.on['.btn-close']) {\n\t\tthis.on['.btn-close'] = function() {\n\t\t}\n\t}\n\t\n\tif(!options.buttons) {\n\t\tthis.buttons = [\n\t\t\t{\n\t\t\t\tclasses: 'btn btn-primary btn-ok',\n\t\t\t\tlabel: 'OK'\n\t\t\t},\n\t\t\t{\n\t\t\t\tclasses: 'btn btn-cancel',\n\t\t\t\tlabel: 'Cancel'\n\t\t\t}\n\t\t]\n\t}\n\t\n\tthis.body = options.body\n}\n\nDialog.prototype.getBodySelector = function() {\n\treturn '#' + this.id + ' .body'\n}\n\nDialog.prototype.getFrameSelector = function() {\n\treturn '#' + this.id \n}\n\nDialog.prototype.addStylesIfNeeded = function() {\n\tif(!document.querySelector('#dialog-frame-styles')) {\n\t\tdocument.querySelector('head').insertAdjacentHTML('beforeend', \n\t\t\t'<style type=\"text/css\" id=\"dialog-frame-styles\">' +\n\t\t\tdialogStyles + \n\t\t\t'</style>')\n\t}\n}\n\nDialog.prototype.renderButton = function(button) {\n\treturn `<button class=\"${button.classes}\" type=\"button\">${button.label}</button>`\n}\n\nDialog.prototype.generateFrame = function() {\n\tlet buttons = this.buttons.map(this.renderButton).join('')\n\t\n\treturn `\n<div class=\"dialog-frame ${this.dialogFrameClass || ''}\" id=\"${this.id}\" >\n\t<div class=\"mask\">\n\t</div>\n\t<div class=\"the-dialog\">\n\t\t<div class=\"close btn-close\">×</div>\n\t\t<div class=\"head\">\n\t\t\t${this.title}\n\t\t</div>\n\t\t<div class=\"body\">\n\t\t</div>\n\t\t<div class=\"foot\">\n\t\t\t${buttons}\n\t\t</div>\n\t</div>\n</div>\n\t`\n}\n\nDialog.prototype.open = function() {\n\tlet self = this\n\tthis.addStylesIfNeeded()\n\tdocument.querySelector('body').insertAdjacentHTML('beforeend', this.generateFrame())\n\t\n\tlet bodySelector = this.getBodySelector()\n\tlet frameSelector = this.getFrameSelector()\n\t\n\tlet bodyContent\n\tlet bodyElement = document.querySelector(bodySelector)\n\tlet frameElement = document.querySelector(frameSelector)\n\n\t\n\t\n\tframeElement.addEventListener('click', function(evt) {\n\t\tfor(let selector in self.on) {\n\t\t\tlet target = frameElement.querySelector(selector)\n\t\t\tif(evt.target == target) {\n\t\t\t\tlet result = self.on[selector]()\n\t\t\t\tif(typeof result === 'boolean') {\n\t\t\t\t\tif(result) {\n\t\t\t\t\t\tself.close()\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if(typeof Promise === 'function' && result instanceof Promise) {\n\t\t\t\t\tresult.then(function(result) {\n\t\t\t\t\t\tif(result !== false) {\n\t\t\t\t\t\t\tself.close()\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tself.close()\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t})\n\t\n\tfunction afterOpenResizeSetup() {\n\t\tsetTimeout(function() {\n\t\t\tlet head = document.querySelector(frameSelector + ' .head').clientHeight \n\t\t\tlet foot = document.querySelector(frameSelector + ' .foot').clientHeight\n\t\t\tlet topAndBottom = head + foot\n\n\t\t\tbodyElement.style.maxHeight = 'calc(90vh - ' + topAndBottom + 'px)'\n\t\t\tframeElement.classList.add('open')\n\t\t\t\n\t\t\tif(self.afterOpen) {\n\t\t\t\tself.afterOpen(bodyElement, self)\n\t\t\t}\n\t\t})\n\t}\n\t\n\tif(typeof this.body === 'function') {\n\t\tbodyContent = this.body(bodyElement, this)\n\t}\n\telse if(typeof this.body == 'string') {\n\t\tbodyContent = this.body\n\t}\n\n\tif(typeof bodyContent === 'string') {\n\t\tbodyElement.insertAdjacentHTML('beforeend', bodyContent)\n\t\tafterOpenResizeSetup()\n\t}\n\telse if(typeof Promise === 'function' && bodyContent instanceof Promise) {\n\t\tbodyContent.then(function(content) {\n\t\t\tbodyElement.insertAdjacentHTML('beforeend', content)\n\t\t\tafterOpenResizeSetup()\n\t\t})\n\t}\n\t\n\n\treturn this\n}\n\nDialog.prototype.close = function() {\n\tlet frame = document.querySelector(this.getFrameSelector())\n\tframe.remove()\n\treturn this\n}\n\nmodule.exports = Dialog\n\n","\nconst inputInjector = require('input-value-injector')\nconst textareaInjector = require('textarea-value-injector')\nconst selectInjector = require('select-value-injector')\n\nlet injectValues = function(text, values) {\n\t\n\tlet result = inputInjector(text, values)\n\tresult = textareaInjector(result, values)\n\tresult = selectInjector(result, values)\n\t\n\t\n\treturn result\n}\n\nmodule.exports = injectValues","\nfunction makeDate(date) {\n\tif(date instanceof Date) {\n\t\treturn date\n\t}\n\treturn new Date(date)\n}\n\nfunction pad(value, len, pad) {\n\tvalue = '' + value\n\twhile(value.length < len) {\n\t\tvalue = pad + value\n\t}\n\treturn value\n}\n\nfunction formatDate(date) {\n\tdate = makeDate(date)\n\tlet year = date.getFullYear()\n\tlet month = pad(date.getMonth() + 1, 2, '0')\n\tlet day = pad(date.getDate(), 2, '0')\n\n\treturn `${year}-${month}-${day}`\n}\nfunction formatTime(date) {\n\tdate = makeDate(date)\n\tlet hour = pad(date.getHours(), 2, '0')\n\tlet minute = pad(date.getMinutes(), 2, '0')\n\tlet sec = pad(date.getSeconds(), 2, '0')\n\tlet milli = pad(date.getMilliseconds(), 4, '0')\n\treturn `${hour}:${minute}`\n}\n\nfunction formatCombined(date) {\n\treturn formatDate(date) + 'T' + formatTime(date)\n}\n\nlet nameAttrPattern = /\\sname=[\"'](.*?)[\"']/i\nlet valAttrPattern = /\\svalue=[\"'](.*?)[\"']/i\nlet typeAttrPattern = /\\stype=[\"'](.*?)[\"']/i\nlet inputPattern = /(<input.*?>)/i\nlet checkedAttrPattern = /\\schecked(=[\"'](.*?)[\"'])?/i\n\nlet attributeEscapes = {\n\t'&': '&'\n\t, '\"': '"'\n\t, '<': '<'\n}\n\nfunction escapeAttributeValue(attr) {\n\tif(attr === null || attr === undefined) {\n\t\tattr = ''\n\t}\n\tif(typeof attr !== 'string') {\n\t\tattr = '' + attr\n\t}\n\tfor(let [key, value] of Object.entries(attributeEscapes)) {\n\t\tattr = attr.split(key).join(value)\n\t}\n\treturn attr\n}\n\nlet evalFunction = new Function('data',\n\t`with (data.context) {\n\t\ttry {\n\t\t\treturn eval(data.expression);\n\t\t} catch (e) {\n\t\t\treturn null;\n\t\t}\n\t}`\n)\n\nfunction fetchValue(obj, path) {\n\treturn evalFunction.call(this, {\n\t\tcontext: obj\n\t\t, expression: path\n\t})\n}\n\nfunction isOrContains(target, possible) {\n\tif(Array.isArray(possible)) {\n\t\treturn possible.includes(target)\n\t}\n\telse {\n\t\treturn target == possible\n\t}\n}\n\n\nlet injectValues = function(text, values) {\n\t\n\tlet result = ''\n\t\n\ttext.split(inputPattern).forEach((item) => {\n\t\tif(item.toLowerCase().indexOf('<input') == 0) {\n\t\t\tlet r = item.match(nameAttrPattern)\n\t\t\tlet name = r ? r[1] : null\n\t\t\t\n\t\t\tr = item.match(typeAttrPattern)\n\t\t\tlet type = (r ? r[1] : 'text').toLowerCase()\n\t\t\t\n\t\t\t\n\t\t\tif(type === 'text' || type === 'hidden' || type === 'date' || type === 'time' || type === 'datetime-local'\n\t\t\t|| type === 'search' || type === 'email' || type === 'number' || type === 'tel' || type === 'url' \n\t\t\t|| type === 'month' || type === 'week' || type === 'color' || type === 'week'\n\t\t\t) {\n\t\t\t\tr = item.match(valAttrPattern)\n\t\t\t\tlet value = r ? r[1] : null\n\t\t\t\t\n\t\t\t\tlet newVal = fetchValue(values, name)\n\t\t\t\tif(type === 'date') {\n\t\t\t\t\tif(newVal) {\n\t\t\t\t\t\tlet orgValue = newVal\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tnewVal = formatDate(newVal)\n\t\t\t\t\t\t} catch(e) {\n\t\t\t\t\t\t\tnewVal = orgValue\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif(newVal == 'Invalid date') {\n\t\t\t\t\t\t\tnewVal = orgValue\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if(type === 'time') {\n\t\t\t\t\tif(newVal) {\n\t\t\t\t\t\tlet orgValue = newVal\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tnewVal = formatTime(newVal)\n\t\t\t\t\t\t} catch(e) {\n\t\t\t\t\t\t\tnewVal = orgValue\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif(newVal == 'Invalid date') {\n\t\t\t\t\t\t\tnewVal = orgValue\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if(type === 'datetime-local') {\n\t\t\t\t\tif(newVal) {\n\t\t\t\t\t\tlet orgValue = newVal\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tnewVal = formatCombined(newValue)\n\t\t\t\t\t\t} catch(e) {}\n\t\t\t\t\t\tif(newVal == 'Invalid date') {\n\t\t\t\t\t\t\tnewVal = orgValue\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tlet replacementText\n\t\t\t\tif(newVal === null || newVal === undefined) {\n\t\t\t\t\treplacementText = ''\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tnewVal = escapeAttributeValue(newVal)\n\t\t\t\t\treplacementText = ' value=\"' + newVal + '\"'\n\t\t\t\t}\n\n\n\t\t\t\tif(value != null) {\n\t\t\t\t\tif(newVal != null) {\n\t\t\t\t\t\titem = item.replace(valAttrPattern, replacementText)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tif(item.endsWith('/>')) {\n\t\t\t\t\t\titem = item.slice(0, -2)\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\titem = item.slice(0, -1)\n\t\t\t\t\t}\n\t\t\t\t\titem = item + replacementText + ' />'\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tresult += item\n\t\t\t}\n\t\t\telse if(type === 'radio') {\n\t\t\t\tr = item.match(valAttrPattern)\n\t\t\t\tlet value = r ? r[1] : null\n\t\t\t\tlet newVal = fetchValue(values, name)\n\t\t\t\t\n\t\t\t\tif(!value) {\n\t\t\t\t\t// We don't have a specific value, so we'll say it's checked\n\t\t\t\t\t// if the new value is truthy.\n\t\t\t\t\t\n\t\t\t\t\tif(!newVal || newVal == 'false' || newVal == 'off') {\n\t\t\t\t\t\titem = item.replace(checkedAttrPattern, '')\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\t// so we should have it checked\n\t\t\t\t\t\tif(!item.match(checkedAttrPattern)) {\n\t\t\t\t\t\t\tif(item.endsWith('/>')) {\n\t\t\t\t\t\t\t\titem = item.slice(0, -2)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\titem = item.slice(0, -1)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\titem = item + ' checked=\"checked\" />' \n\t\t\t\t\t\t}\n\t\t\t\t\t\t// if the above were not true, it's because it's already checked\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tif(!newVal || newVal != value) {\n\t\t\t\t\t\t// if the new value is blank or does not equal the value in\n\t\t\t\t\t\t// in the value attribute, we'll make it unchecked\n\t\t\t\t\t\titem = item.replace(checkedAttrPattern, '')\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\t// so we should have it checked\n\t\t\t\t\t\tif(!item.match(checkedAttrPattern)) {\n\t\t\t\t\t\t\tif(item.endsWith('/>')) {\n\t\t\t\t\t\t\t\titem = item.slice(0, -2)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\titem = item.slice(0, -1)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\titem = item + ' checked=\"checked\" />' \n\t\t\t\t\t\t}\n\t\t\t\t\t\t// if the above were not true, it's because it's already checked\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tresult += item\n\t\t\t}\n\t\t\telse if(type === 'checkbox') {\n\t\t\t\tr = item.match(valAttrPattern)\n\t\t\t\tlet value = r ? r[1] : null\n\t\t\t\tlet newVal = fetchValue(values, name)\n\t\t\t\t\n\t\t\t\tif(!value) {\n\t\t\t\t\t// We don't have a specific value, so we'll say it's checked\n\t\t\t\t\t// if the new value is truthy.\n\t\t\t\t\t\n\t\t\t\t\tif(!newVal || isOrContains('false', newVal) || isOrContains('off', newVal)) {\n\t\t\t\t\t\titem = item.replace(checkedAttrPattern, '')\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\t// so we should have it checked\n\t\t\t\t\t\tif(!item.match(checkedAttrPattern)) {\n\t\t\t\t\t\t\tif(item.endsWith('/>')) {\n\t\t\t\t\t\t\t\titem = item.slice(0, -2)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\titem = item.slice(0, -1)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\titem = item + ' checked=\"checked\" />' \n\t\t\t\t\t\t}\n\t\t\t\t\t\t// if the above were not true, it's because it's already checked\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tif(!newVal || !isOrContains(value, newVal)) {\n\t\t\t\t\t\t// if the new value is blank or does not equal the value in\n\t\t\t\t\t\t// in the value attribute, we'll make it unchecked\n\t\t\t\t\t\titem = item.replace(checkedAttrPattern, '')\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\t// so we should have it checked\n\t\t\t\t\t\tif(!item.match(checkedAttrPattern)) {\n\t\t\t\t\t\t\tif(item.endsWith('/>')) {\n\t\t\t\t\t\t\t\titem = item.slice(0, -2)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\titem = item.slice(0, -1)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\titem = item + ' checked=\"checked\" />' \n\t\t\t\t\t\t}\n\t\t\t\t\t\t// if the above were not true, it's because it's already checked\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tresult += item\n\t\t\t}\n\t\t\telse {\n\t\t\t\tresult += item\n\t\t\t}\n\t\t\t\n\t\t}\n\t\telse {\n\t\t\tresult += item\n\t\t}\n\t})\n\t\n\treturn result\n}\n\n\nmodule.exports = injectValues\n","module.exports = `<div id=\"kalpa-tree-icons\" style=\"position: absolute; left: -10000px; width: 0; height: 0;\">\n\t<svg xmlns=\"http://www.w3.org/2000/svg\">\n\t\t<symbol id=\"icon-generic\" viewBox=\"0 0 12 12\">\n\t\t\t<path\n\t\t\t\td=\"M9.7 12H2.3C1 12 0 11 0 9.7V2.3C0 1 1 0 2.3 0h7.5C11 0 12 1 12 2.3v7.5C12 11 11 12 9.7 12zM8 5.3C8 4.6 7.4 4 6.6 4H5.3C4.6 4 4 4.6 4 5.3v1.3C4 7.4 4.6 8 5.3 8h1.3C7.4 8 8 7.4 8 6.6V5.3z\" />\n\t\t</symbol>\n\t\t<symbol id=\"icon-root\" viewBox=\"0 0 16 16\">\n\t\t\t<path d=\"M9 16V9h7v7H9zM9 0h7v7H9V0zM0 9h7v7H0V9zm0-9h7v7H0V0z\" />\n\t\t</symbol>\n\t\t<symbol id=\"icon-metric\" viewBox=\"0 0 100 100\">\n\t\t\t<path\n\t\t\t\td=\"M50 100C22.4 100 0 77.6 0 50S22.4 0 50 0s50 22.4 50 50-22.4 50-50 50zm0-76.9c-14.8 0-26.9 12.1-26.9 26.9S35.2 76.9 50 76.9 76.9 64.8 76.9 50 64.8 23.1 50 23.1zm0 38.4c-6.4 0-11.5-5.2-11.5-11.5S43.6 38.4 50 38.4s11.5 5.2 11.5 11.5S56.4 61.5 50 61.5z\" />\n\t\t</symbol>\n\t\t<symbol id=\"icon-perspective\" viewBox=\"0 0 12 11\">\n\t\t\t<path d=\"M12 11H0L5.9 0 12 11z\" />\n\t\t</symbol>\n\t\t<symbol id=\"icon-objective\" viewBox=\"0 0 12 10\">\n\t\t\t<ellipse cx=\"6\" cy=\"5\" rx=\"6\" ry=\"5\" />\n\t\t</symbol>\n\t\t<symbol id=\"icon-find\">\n\t\t\t<path\n\t\t\t\td=\"m 13.497323,12.433608 c 0.08422,0.978628 -1.417295,1.469942 -1.954282,0.657234 C 10.369384,11.968141 9.2411696,10.799391 8.087323,9.6566079 5.7875518,11.20515 2.2596241,10.270797 1.051352,7.7662065 -0.1027543,5.5922068 0.61269436,2.5743169 2.7539681,1.2885899 4.6322082,0.06461011 7.3623548,0.26924656 8.9286688,1.9183502 c 1.5121032,1.4872335 1.9726552,4.001359 0.8885116,5.8618536 -0.2008407,0.7179057 0.6439246,1.0286413 1.0395966,1.4627471 0.79551,0.9178591 1.752248,1.6943191 2.51171,2.6495761 0.08347,0.167322 0.129284,0.353872 0.128836,0.541081 z m -8.047,-9.7420001 C 3.5991559,2.6059751 2.107634,4.7815577 2.8684439,6.4772182 3.4629388,8.0470383 5.6500695,8.7859958 7.0177529,7.7488936 8.3664062,6.8424394 8.6521549,4.6587499 7.425963,3.52989 6.9118115,3.0069548 6.1883031,2.6803036 5.450323,2.6916079 z\" />\n\t\t</symbol>\n\t\t<symbol id=\"icon-collapsed\" viewBox=\"0 0 9 6\">\n\t\t\t<path\n\t\t\t\td=\"M4.4 6c-.2 0-.5-.1-.9-.5L.3 1.8C-.1 1.4-.1.7.3.3s1.1-.4 1.5 0l2.7 3.2L7.1.4C7.5 0 8.2 0 8.6.4c.4.4.4 1.1 0 1.5L5.4 5.5c-.3.4-.8.5-1 .5z\" />\n\t\t</symbol>\n\t</svg>\n</div>`\n","\nconst Streamish = require('./streamish')\nconst serializeTreeNodes = require('./serialize-tree-nodes')\nconst serializeANode = require('./serialize-a-node')\n\nconst icons = require('./icons')\n\nlet loadedStyles = []\n\n\nasync function loadKalpaTree(scriptLocation) {\n\treturn new Promise((resolve, reject) => {\n\t\tif (window.KalpaTree) {\n\t\t\tresolve(window.KalpaTree)\n\t\t}\n\t\telse {\n\t\t\tlet ckscript = document.createElement('script');\n\t\t\tckscript.setAttribute('src', scriptLocation);\n\t\t\tckscript.onload = async function () {\n\t\t\t\tresolve(window.KalpaTree)\n\t\t\t}\n\t\t\tdocument.head.appendChild(ckscript)\n\t\t}\n\t})\n}\n\nasync function createTree(options = {}) {\n\tlet plan = Object.assign({\n\t\ttreeContainerSelector: '#kalpa-tree'\n\t\t, stream: new Streamish()\n\t\t, loadStyles: true\n\t\t, styleLocation: '/kalpa-tree-on-page/css/white-page-tree.css'\n\t\t, scriptLocation: '/kalpa-tree-on-page/js/kalpa-tree.js'\n\t\t, data: null\n\n\t}, options)\n\treturn new Promise((resolve, reject) => {\n\t\t// Add the icon svgs if they haven't been added yet\n\t\tif(!document.querySelector('#kalpa-tree-icons')) {\n\t\t\tdocument.body.insertAdjacentHTML('beforeend', icons)\n\t\t}\n\n\t\t// Load the kalpa-tree script dependency then configure it\n\t\tloadKalpaTree(plan.scriptLocation).then(KalpaTree => {\n\n\t\t\tconst Tree = KalpaTree.default\n\t\t\tlet tree = new Tree({\n\t\t\t\tstream: plan.stream,\n\t\t\t\taccessors: {\n\t\t\t\t\ticon: 'nodeType'\n\t\t\t\t},\n\t\t\t\tinitialSelection: 0\n\t\t\t})\n\n\t\t\ttree.on('error', function (e) {\n\t\t\t\tconsole.log('tree error', e)\n\t\t\t})\n\n\t\t\ttree.on('move', function (node, newParent, previousParent, newIndex, prevIndex) {\n\t\t\t\tnode.parentId = newParent.id\n\t\t\t})\n\t\t\ttree.serializeTree = function() {\n\t\t\t\tlet result = []\n\t\t\t\tresult.push(tree.root)\n\t\t\t\tserializeTreeNodes(this, tree.root.id, result)\n\t\t\t\treturn result\n\t\t\t}\n\t\t\ttree.serialize = function () {\n\t\t\t\tvar result = []\n\t\t\t\tresult.push(tree.get(0))\n\t\t\t\tserializeANode(tree, 0, result)\n\t\t\t\treturn JSON.stringify(result)\n\t\t\t}\n\t\t\t\n\t\t\tif(plan.treeContainerSelector) {\n\t\t\t\tdocument.querySelector(plan.treeContainerSelector).appendChild(tree.render().el.node())\n\t\t\t}\n\t\t\t\n\t\t\tif(plan.data && Array.isArray(plan.data)) {\n\t\t\t\tfor(let node of plan.data) {\n\t\t\t\t\ttree.options.stream.emit('data', node)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tresolve(tree)\n\t\t})\n\t\t\n\t\t// Load the stylesheet for minimal formatting\n\t\tif(plan.loadStyles && plan.styleLocation) {\n\t\t\tif(!loadedStyles.includes(plan.styleLocation)) {\n\t\t\t\tloadedStyles.push(plan.styleLocation)\n\t\t\t\tdocument.head.insertAdjacentHTML('beforeend', `<link href=\"${plan.styleLocation}\" rel=\"stylesheet\">`)\n\t\t\t}\n\t\t}\n\t})\n\n}\n\nmodule.exports = createTree","function serializeANode (tree, rootId, result) {\n\ttree.children(rootId).forEach(function (child) {\n\t\tchild.parentId = rootId\n\t\tresult.push(child)\n\t\tserializeANode(tree, child.id, result)\n\t})\n}\n\nmodule.exports = serializeANode","\nfunction serializeTreeNodes(tree, rootId, result) {\n\ttree.children(rootId).forEach(function (child) {\n\t\tchild.parentId = rootId\n\t\tresult.push(child)\n\t\tserializeTreeNodes(tree, child.id, result)\n\t})\n}\n\nmodule.exports = serializeTreeNodes","\nclass Streamish {\n\tconstructor() {\n\t\tthis.handles = {}\n\t}\n\ton(evt, handle) {\n\t\tlet handles = this.handles[evt]\n\t\tif (!handles) {\n\t\t\thandles = this.handles[evt] = []\n\t\t}\n\t\thandles.push(handle)\n\t\treturn this\n\t}\n\temit(evt, ...args) {\n\t\tif (evt in this.handles) {\n\t\t\tfor (let handle of this.handles[evt]) {\n\t\t\t\thandle.apply(this, args)\n\t\t\t}\n\t\t}\n\t}\n}\nmodule.exports = Streamish","export default \".dialog-frame {\\n\\tposition: fixed;\\n\\ttop: 0;\\n\\tbottom: 0;\\n\\tleft: 0;\\n\\tright: 0;\\n\\tz-index: 10000;\\n\\topacity: 0;\\n\\ttransition: opacity .3s;\\n\\toverflow: hidden;\\n\\t\\n\\t\\n\\tdisplay: grid;\\n\\tjustify-content: center;\\n\\talign-content: center;\\n\\tpadding: 5vh 5%;\\n}\\n\\n.dialog-frame.open {\\n\\topacity: 1;\\n}\\n\\n.dialog-frame .mask {\\n\\tposition: absolute;\\n\\tbox-sizing: border-box;\\n\\ttop: 0;\\n\\tbottom: 0;\\n\\tleft: 0;\\n\\tright: 0;\\n\\tbackground-color: #333333;\\n\\topacity: .7;\\n\\theight: 100%;\\n\\tz-index: 0;\\n\\t\\n}\\n\\n\\n.dialog-frame .the-dialog {\\n\\tposition: relative;\\n\\tdisplay: inline-block;\\n\\tz-index: 1;\\n\\tborder-radius: 5px;\\n\\tbackground-color: white;\\n\\toverflow: hidden;\\n\\ttransform: scale(.84);\\n\\ttransition: transform 0.262s cubic-bezier(.77,-1.72,.08,1);\\n}\\n\\n.dialog-frame.open .the-dialog {\\n\\ttransform: scale(1);\\n}\\n\\n.dialog-frame .the-dialog .close {\\n\\tposition: absolute;\\n\\ttop: 0px;\\n\\tright: 0px;\\n\\tpadding: 8px 10px 10px 10px;\\n\\tcursor: pointer;\\n}\\n\\n.dialog-frame .the-dialog .head {\\n\\tborder-bottom: solid #aaaaaa 1px;\\n\\tline-height: 2em;\\n\\tpadding: 0 10px;\\n}\\n\\n.dialog-frame .the-dialog .body {\\n\\tbox-sizing: border-box;\\n\\tpadding: 20px;\\n\\toverflow: auto;\\n\\tmax-height: calc(90vh - 75px);\\n}\\n\\n.dialog-frame .the-dialog .foot {\\n\\tborder-top: solid #aaaaaa 1px;\\n\\tpadding: 10px;\\n}\\n\\n.dialog-frame .the-dialog .foot button {\\n\\tmargin-right: 15px;\\n}\";","\n\nlet nameAttrPattern = /\\sname=[\"'](.*?)[\"']/i\nlet valAttrPattern = /\\svalue=[\"'](.*?)[\"']/i\nlet typeAttrPattern = /\\stype=[\"'](.*?)[\"']/i\nlet selectPattern = /(<select[\\w\\W]*?select\\w*>)/im\nlet selectedAttrPattern = /\\sselected(=[\"'](.*?)[\"'])?/i\n\n\nlet evalFunction = new Function('data',\n\t`with (data.context) {\n\t\ttry {\n\t\t\treturn eval(data.expression);\n\t\t} catch (e) {\n\t\t\treturn null;\n\t\t}\n\t}`\n)\n\nfunction fetchValue(obj, path) {\n\treturn evalFunction.call(this, {\n\t\tcontext: obj\n\t\t, expression: path\n\t})\n}\n\nfunction escForRegex(val) {\n\tif(val && val.replace) {\n\t\treturn val.replace(/[\\-\\[\\]\\/\\{\\}\\(\\)\\*\\+\\?\\.\\\\\\^\\$\\|]/g, \"\\\\$&\")\n\t}\n\telse {\n\t\treturn val;\n\t}\n}\n\nfunction isOrContains(target, possible) {\n\tif(typeof possible == 'array') {\n\t\tpossible.includes(target)\n\t}\n\telse {\n\t\treturn target == possible\n\t}\n}\n\n\nlet injectValues = function(text, values) {\n\t\n\tlet result = ''\n\t\n\ttext.split(selectPattern).forEach((item) => {\n\t\tif(item.toLowerCase().indexOf('<select') == 0) {\n\t\t\tlet r = item.match(nameAttrPattern)\n\t\t\tlet name = r ? r[1] : null\n\t\t\t\n\t\t\tlet newVal = fetchValue(values, name)\n\t\t\tif(typeof newVal != 'undefined' && newVal !== null) {\n\t\t\t\titem = item.replace(selectedAttrPattern, '')\n\t\t\t\tlet optionMatch = item.match( new RegExp('value=[\"\\']' + escForRegex(newVal) + '[\"\\']', 'i'))\n\t\t\t\tif(optionMatch) {\n\t\t\t\t\tlet breakIndex = item.indexOf(optionMatch[0]) + optionMatch[0].length\n\t\t\t\t\titem = item.slice(0, breakIndex) + ' selected=\"selected\" ' + item.substring(breakIndex)\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tresult += item\n\t\t}\n\t\telse {\n\t\t\tresult += item\n\t\t}\n\t})\n\t\n\treturn result\n}\n\n\nmodule.exports = injectValues\n","\n\nlet nameAttrPattern = /\\sname=[\"'](.*?)[\"']/i\nlet valAttrPattern = /\\svalue=[\"'](.*?)[\"']/i\nlet typeAttrPattern = /\\stype=[\"'](.*?)[\"']/i\nlet textareaPattern = /(<textarea[\\w\\W]*?textarea\\w*>)/im\nlet selectedAttrPattern = /\\sselected(=[\"'](.*?)[\"'])?/i\n\n\nlet evalFunction = new Function('data',\n\t`with (data.context) {\n\t\ttry {\n\t\t\treturn eval(data.expression);\n\t\t} catch (e) {\n\t\t\treturn null;\n\t\t}\n\t}`\n)\n\nfunction fetchValue(obj, path) {\n\treturn evalFunction.call(this, {\n\t\tcontext: obj\n\t\t, expression: path\n\t})\n}\n\nfunction escForRegex(val) {\n\tif(val && val.replace) {\n\t\treturn val.replace(/[\\-\\[\\]\\/\\{\\}\\(\\)\\*\\+\\?\\.\\\\\\^\\$\\|]/g, \"\\\\$&\")\n\t}\n\telse {\n\t\treturn val;\n\t}\n}\n\nfunction isOrContains(target, possible) {\n\tif(typeof possible == 'array') {\n\t\tpossible.includes(target)\n\t}\n\telse {\n\t\treturn target == possible\n\t}\n}\n\n\nlet injectValues = function(text, values) {\n\t\n\tlet result = ''\n\t\n\ttext.split(textareaPattern).forEach((item) => {\n\t\tif(item.toLowerCase().indexOf('<textarea') == 0) {\n\t\t\tlet r = item.match(nameAttrPattern)\n\t\t\tlet name = r ? r[1] : null\n\t\t\t\n\t\t\tif(name) {\n\t\t\t\tlet newVal = fetchValue(values, name)\n\t\t\t\tif(typeof newVal != 'undefined' && newVal !== null) {\n\t\t\t\t\tlet startTagEnd = item.indexOf('>')\n\t\t\t\t\tlet endTagStart = item.lastIndexOf('<')\n\t\t\t\t\titem = item.substring(0, startTagEnd + 1) + newVal + item.substring(endTagStart)\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tresult += item\n\t\t}\n\t\telse {\n\t\t\tresult += item\n\t\t}\n\t})\n\t\n\treturn result\n}\n\n\nmodule.exports = injectValues","\nconst defaultTemplateName = 'defaultTemplate'\n\nclass ActiveElement {\n\tconstructor(conditionalExpression, dataExpression, handlingExpression, tripartite) {\n\t\tthis.conditionalExpression = conditionalExpression\n\t\tthis.dataExpression = dataExpression\n\t\tthis.handlingExpression = handlingExpression || defaultTemplateName\n\t\tthis.tripartite = tripartite\n\t}\n}\n\nmodule.exports = ActiveElement","var calculateRelativePath = function(parentPath, currentPath) {\n\tif(!parentPath) {\n\t\treturn currentPath\n\t}\n\tif(!currentPath) {\n\t\treturn currentPath\n\t}\n\t\n\tif(currentPath.indexOf('../') != 0 && currentPath.indexOf('./') != 0) {\n\t\treturn currentPath\n\t}\n\t\n\tvar pparts = parentPath.split('/')\n\tvar cparts = currentPath.split('/')\n\t\n\t// trim any starting blank sections\n\twhile(pparts.length && !pparts[0]) {\n\t\tpparts.shift()\n\t}\n\twhile(cparts.length && !cparts[0]) {\n\t\tcparts.shift()\n\t}\n\t\n\tif(currentPath.indexOf('../') == 0 ) {\n\t\twhile(cparts.length && cparts[0] == '..') {\n\t\t\tpparts.pop()\n\t\t\tcparts.shift()\n\t\t}\n\t\tpparts.pop()\n\t\t\n\t\twhile(cparts.length) {\n\t\t\tpparts.push(cparts.shift())\n\t\t}\n\t\treturn pparts.join('/')\n\t}\n\tif(currentPath.indexOf('./') == 0 ) {\n\t\tcparts.shift()\n\t\tpparts.pop()\n\t\twhile(cparts.length) {\n\t\t\tpparts.push(cparts.shift())\n\t\t}\n\t\treturn pparts.join('/')\n\t}\n\t\n\treturn currentPath\n}\n\nmodule.exports = calculateRelativePath","\nconst resolveDataPath = require('./resolve-data-path')\nfunction evaluateInContext(context, expression, dataFunctions, globalData) {\n\tif (!expression) {\n\t\treturn null\n\t}\n\tif (typeof expression === 'string') {\n\t\texpression = expression.trim()\n\t}\n\n\tif (expression === '$this' || expression === 'this') {\n\t\treturn context\n\t}\n\tif (typeof context === 'object' && expression in context) {\n\t\treturn context[expression]\n\t}\n\tif (expression === '\"\"' || expression === \"''\") {\n\t\treturn ''\n\t}\n\tlet resolved = resolveDataPath(context, expression)\n\tif (resolved === null || resolved === undefined) {\n\t\tresolved = resolveDataPath({\n\t\t\t'$globals': globalData\n\t\t}, expression)\n\t}\n\tif (resolved === null || resolved === undefined) {\n\t\tresolved = _evaluateInContext.call(context, context, expression, dataFunctions, globalData)\n\t}\n\treturn resolved\n}\n\nlet evalFunction = new Function('additionalContexts',\n\t`with ({\n\t\t'$globals': additionalContexts.globalData\n\t}) {\n\t\twith (additionalContexts.dataFunctions) {\n\t\t\twith (additionalContexts.context) {\n\t\t\t\ttry {\n\t\t\t\t\treturn eval(additionalContexts.expression);\n\t\t\t\t} catch (e) {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}`\n)\n\nfunction _evaluateInContext(context, expression, dataFunctions, globalData) {\n\tdataFunctions = dataFunctions || {}\n\tglobalData = globalData || {}\n\n\n\tlet result = evalFunction.call(this, {\n\t\tglobalData: globalData\n\t\t, dataFunctions: dataFunctions\n\t\t, context: context\n\t\t, expression: expression\n\t})\n\treturn result\n}\n\nmodule.exports = evaluateInContext","\nlet ActiveElement = require('./active-element')\nvar calculateRelativePath = require('./calculate-relative-path')\nlet evaluateInContext = require('./evaluate-in-context')\n\nclass ExecutionContext {\n\t/**\n\t * \n\t * @param {Tripartite} tripartite \n\t * @param {function} template \n\t * @param {stream} [destination]\n\t */\n\tconstructor(tripartite, template, data = {}, destination = '', dataFunctions = {}) {\n\t\tthis.tripartite = tripartite\n\t\tthis.template = template\n\t\tthis.destination = destination\n\t\tthis.initialData = data\n\t\tthis.currentData = []\n\t\tthis.dataFunctions = dataFunctions\n\t\tthis.continueOnTripartiteError = true\n\t\t\n\t\t// Sometimes large pages have so many elements that we exceed\n\t\t// the maximum call depth. This happens when we have a lot of elements all being\n\t\t// rendered by the same templates. That is, there's no async callback when a template\n\t\t// is loaded, only instant callbacks.\n\t\t// The downside to doing very frequent async calls is that it takes a lot longer to\n\t\t// to get called from a setTimeout than it does to call directly. We want ot keep\n\t\t// the time between needing to do that reasonably long. Unfortunately, there's no\n\t\t// easy/fast way to detect the call stack depth, so we rely on this proxy.\n\t\tthis.callCount = 0\n\t\tthis.callDepthLimit = 1000\n\t}\n\n\t/**\n\t * \n\t * @param {function} [callback] called when done\n\t * @returns Returns the string of stream as the result of the operation\n\t */\n\trun(callback) {\n\t\tlet ourCallback\n\t\tif (callback) {\n\t\t\tourCallback = () => {\n\t\t\t\tcallback(null, this.destination)\n\t\t\t}\n\t\t}\n\n\t\tthis._run(this.template, this.initialData, ourCallback)\n\n\t\treturn this.destination\n\t}\n\n\t_resolveHandlingExpression(template, handlingExpression, data) {\n\t\tif (!handlingExpression) {\n\t\t\thandlingExpression = defaultTemplateName\n\t\t}\n\t\tif (handlingExpression.charAt(0) == '$') {\n\t\t\t// Indicates the handling espression is not a literal template name but is a string which should\n\t\t\t// be evaluated to determine the template name\n\t\t\thandlingExpression = evaluateInContext(data, handlingExpression.substring(1), this.dataFunctions, this.initialData)\n\t\t}\n\t\t// resolve relative template paths\n\t\tif (handlingExpression.indexOf('./') == 0 || handlingExpression.indexOf('../') == 0) {\n\t\t\thandlingExpression = calculateRelativePath(template.templateMeta.name, handlingExpression)\n\t\t}\n\n\t\treturn handlingExpression\n\t}\n\n\t_run(template, data, callback) {\n\t\tlet parts = [...template.parts].reverse()\n\t\tconst processParts = () => {\n\t\t\t\n\t\t\t// check to see how far down in the call stack we are. If too far down,\n\t\t\t// come back in the next tick.\n\t\t\tthis.callCount++\n\t\t\tif(this.callCount++ > this.callDepthLimit) {\n\t\t\t\tsetTimeout(()=> {\n\t\t\t\t\tthis.callCount = 0\n\t\t\t\t\tprocessParts()\n\t\t\t\t})\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tif (parts.length > 0) {\n\t\t\t\tlet part = parts.pop()\n\t\t\t\tif (typeof part === 'string') {\n\t\t\t\t\tthis.output(part)\n\t\t\t\t\tprocessParts()\n\t\t\t\t}\n\t\t\t\telse if (part instanceof ActiveElement) {\n\t\t\t\t\tlet conditional = part.conditionalExpression || part.dataExpression\n\t\t\t\t\tlet conditionalResult = false\n\t\t\t\t\tlet resultData\n\t\t\t\t\tif (conditional == null || conditional == undefined || conditional === '') {\n\t\t\t\t\t\t// Because if they didn't specify a condition or data, they probably \n\t\t\t\t\t\t// just want the template to be run as is\n\t\t\t\t\t\tconditionalResult = true\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tif(part.conditionalExpression) {\n\t\t\t\t\t\t\tlet result = evaluateInContext(data, part.conditionalExpression, this.dataFunctions, this.initialData)\n\t\t\t\t\t\t\tif (result) {\n\t\t\t\t\t\t\t\tconditionalResult = true\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t// This means we're evaluating the data expression to see if we should run the template\n\t\t\t\t\t\t\tresultData = evaluateInContext(data, part.dataExpression, this.dataFunctions, this.initialData)\n\t\t\t\t\t\t\tif(resultData === null || resultData === undefined) {\n\t\t\t\t\t\t\t\tconditionalResult = false\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse if (typeof resultData === 'number') {\n\t\t\t\t\t\t\t\t// if the result is a number, any number, we want to output it\n\t\t\t\t\t\t\t\t// unless the number is from the conditional expression, in which\n\t\t\t\t\t\t\t\t// case we want to evaluate it as truthy\n\t\t\t\t\t\t\t\tconditionalResult = true\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse if(Array.isArray(resultData) && resultData.length > 0) {\n\t\t\t\t\t\t\t\tconditionalResult = true\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse if(resultData) {\n\t\t\t\t\t\t\t\tconditionalResult = true\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\n\t\t\t\t\tif (conditionalResult) {\n\t\t\t\t\t\tif (part.dataExpression && resultData === undefined) {\n\t\t\t\t\t\t\tresultData = evaluateInContext(data, part.dataExpression, this.dataFunctions, this.initialData)\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif(resultData === null || resultData === undefined) {\n\t\t\t\t\t\t\tresultData = data\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tlet handlingExpression = this._resolveHandlingExpression(template, part.handlingExpression, data)\n\t\t\t\t\t\tlet handlingTemplate\n\t\t\t\t\t\tlet children = (Array.isArray(resultData) ? [...resultData] : [resultData]).reverse()\n\t\t\t\t\t\tconst applyTemplate = () => {\n\t\t\t\t\t\t\tif (children.length > 0) {\n\t\t\t\t\t\t\t\tlet child = children.pop()\n\t\t\t\t\t\t\t\tthis._run(handlingTemplate, child, () => {\n\t\t\t\t\t\t\t\t\tapplyTemplate()\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\tprocessParts()\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif(handlingExpression in this.tripartite.templates) {\n\t\t\t\t\t\t\thandlingTemplate = this.tripartite.getTemplate(handlingExpression)\n\t\t\t\t\t\t\tif (handlingTemplate) {\n\t\t\t\t\t\t\t\tapplyTemplate()\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t// the template has been loaded before but is empty\n\t\t\t\t\t\t\t\tif (this.continueOnTripartiteError) {\n\t\t\t\t\t\t\t\t\tprocessParts()\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tthis.tripartite.loadTemplate(handlingExpression, (template) => {\n\t\t\t\t\t\t\t\tif (!template) {\n\t\t\t\t\t\t\t\t\tlet msg = 'Could not load template: ' + handlingExpression\n\t\t\t\t\t\t\t\t\tconsole.error(msg)\n\t\t\t\t\t\t\t\t\tif (this.continueOnTripartiteError) {\n\t\t\t\t\t\t\t\t\t\tprocessParts()\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\t\tlet err = new Error(msg)\n\t\t\t\t\t\t\t\t\t\tif (callback) {\n\t\t\t\t\t\t\t\t\t\t\tcallback(err)\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\t\t\tthrow err\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\thandlingTemplate = template\n\t\t\t\t\t\t\t\t\tapplyTemplate()\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tprocessParts()\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if (typeof part === 'function') {\n\t\t\t\t\tif(part.write) {\n\t\t\t\t\t\tpart.write(data, this.destination, () => {\n\t\t\t\t\t\t\tprocessParts()\n\t\t\t\t\t\t})\n\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tthis.output(part(data))\n\t\t\t\t\t\tprocessParts()\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif (callback) {\n\t\t\t\t\tcallback()\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tprocessParts()\n\t}\n\n\t/**\n\t * \n\t * @param {string} value \n\t */\n\toutput(value) {\n\t\tif(value === null || value === undefined) {\n\t\t\treturn\n\t\t}\n\t\tif (typeof this.destination === 'string') {\n\t\t\tthis.destination += value\n\t\t}\n\t\telse if (this.destination.write) {\n\t\t\tthis.destination.write(value)\n\t\t}\n\t}\n}\n\n\nmodule.exports = ExecutionContext","/*\nfunction resolveDataPath(data, path) {\n\tif(data === null || data === undefined) {\n\t\treturn data\n\t}\n\tlet parts\n\tif(typeof path === 'string') {\n\t\tparts = path.trim().split('.')\n\t}\n\telse if(Array.isArray(path)) {\n\t\tparts = path\n\t}\n\t\n\tlet name = parts.shift()\n\tif(name.indexOf(' ') > -1) {\n\t\t// there's a space, which means it's really unlikely it's a property\n\t\treturn null\n\t}\n\tlet child\n\tif(name === 'this' || name === '$this') {\n\t\tchild = data\n\t}\n\telse if(typeof data === 'object') {\n\t\tif(name in data) {\n\t\t\tchild = data[name]\n\t\t}\n\t}\n\tif(parts.length > 0) {\n\t\treturn resolveDataPath(child, parts)\n\t}\n\telse {\n\t\treturn child\n\t}\n} */\nfunction resolveDataPath(data, path) {\n\tif (data === null || data === undefined) {\n\t\treturn data\n\t}\n\tlet parts\n\tif (typeof path === 'string') {\n\t\tparts = path.trim().split('.')\n\t}\n\telse if (Array.isArray(path)) {\n\t\tparts = path\n\t}\n\n\twhile (parts.length > 0) {\n\t\tlet name = parts.shift()\n\t\tif (name.indexOf(' ') > -1) {\n\t\t\t// there's a space, which means it's really unlikely it's a property\n\t\t\treturn null\n\t\t}\n\t\tlet child\n\t\tif (name === 'this' || name === '$this') {\n\t\t\tchild = data\n\t\t}\n\t\telse if (typeof data === 'object') {\n\t\t\tif (name in data) {\n\t\t\t\tchild = data[name]\n\t\t\t}\n\t\t}\n\t\tif (parts.length == 0) {\n\t\t\treturn child\n\t\t}\n\t\tdata = child\n\t}\n}\n\nmodule.exports = resolveDataPath","\n\n\nif (typeof String.prototype.trim !== 'function') {\n\tString.prototype.trim = function () {\n\t\treturn this.replace(/^\\s+|\\s+$/g, '');\n\t}\n}\n\n\nfunction isStream(stream) {\n\treturn stream !== null\n\t\t&& typeof stream === 'object'\n\t\t&& typeof stream.pipe === 'function';\n}\n\n\nfunction isTemplate(obj) {\n\tif (!obj) {\n\t\treturn false\n\t}\n\tif (typeof obj !== 'function') {\n\t\treturn false\n\t}\n\tif (!obj.write) {\n\t\treturn false\n\t}\n\tif (!obj.parts) {\n\t\treturn false\n\t}\n\tif (!obj.templateMeta) {\n\t\treturn false\n\t}\n\n\treturn true\n}\n\nlet ExecutionContext = require('./execution-context')\nlet ActiveElement = require('./active-element')\n\n\nclass Tripartite {\n\tconstructor(options = {}) {\n\t\tthis.templates = {\n\t\t\tdefaultTemplate: this._makeTemplate(function (thedata) {\n\t\t\t\treturn '' + thedata;\n\t\t\t})\n\t\t}\n\t\tlet { constants = {\n\t\t\ttemplateBoundary: '__',\n\t\t\ttemplateNameBoundary: '##'\n\t\t} } = options\n\t\tthis.constants = constants\n\n\t\t// This object (if set) will receive the template functions parsed from a script\n\t\t// I want to be able to call my templates as global functions, so I've set it\n\t\t// to be the window object\n\t\tthis.secondaryTemplateFunctionObject = options.secondaryTemplateFunctionObject\n\n\t\tthis.loaders = options.loaders || []\n\n\t\tthis.dataFunctions = options.dataFunction || {}\n\t}\n\n\t_makeTemplate(transformationFunction) {\n\t\tif (isTemplate(transformationFunction)) {\n\t\t\treturn transformationFunction\n\t\t}\n\t\tlet tri = this\n\t\tlet f = function (thedata) {\n\t\t\tlet stream = null\n\t\t\tlet options = null\n\t\t\tlet callback = null\n\t\t\tfor (let i = 1; i < arguments.length; i++) {\n\t\t\t\tlet arg = arguments[i]\n\t\t\t\tif (isStream(arg)) {\n\t\t\t\t\tstream = arg\n\t\t\t\t}\n\t\t\t\telse if(typeof arg === 'function') {\n\t\t\t\t\tcallback = arg\n\t\t\t\t}\n\t\t\t\telse if(typeof arg === 'object') {\n\t\t\t\t\toptions = arg\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn f.write(thedata, stream, callback, options)\n\t\t}\n\t\tf.write = function (thedata, stream, callback, options = {}) {\n\t\t\tif(transformationFunction && transformationFunction.write) {\n\t\t\t\t// if it's not a template, but has a write method, invoke the right method directly\n\t\t\t\treturn transformationFunction.write.apply(transformationFunction, arguments)\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlet dest = stream || ''\n\n\t\t\t\tlet context = new ExecutionContext(tri, f, thedata, dest, tri.dataFunctions)\n\t\t\t\tif (options && 'continueOnTripartiteError' in options) {\n\t\t\t\t\tcontext.continueOnTripartiteError = options.continueOnTripartiteError\n\t\t\t\t}\n\n\t\t\t\treturn context.run(callback)\n\t\t\t}\n\t\t}\n\t\tf.parts = []\n\t\tif (transformationFunction && typeof transformationFunction === 'function') {\n\t\t\tf.parts.push(transformationFunction)\n\t\t}\n\t\tf.templateMeta = {}\n\t\treturn f\n\t}\n\n\taddTemplate(name, template) {\n\t\tif (typeof template === 'string') {\n\t\t\ttemplate = this.parseTemplate(template);\n\t\t}\n\t\telse if (typeof template === 'function') {\n\t\t\ttemplate = this._makeTemplate(template)\n\t\t}\n\n\t\tthis.templates[name] = template;\n\t\ttemplate.templateMeta = template.templateMeta || {}\n\t\ttemplate.templateMeta.name = name\n\t\treturn template;\n\t}\n\n\tcreateBlank() {\n\t\treturn new Tripartite()\n\t}\n\n\tgetTemplate(name) {\n\t\treturn this.templates[name]\n\t}\n\n\tloadTemplate(name, callback) {\n\t\tif (name in this.templates) {\n\t\t\tcallback(this.templates[name])\n\t\t}\n\t\telse {\n\t\t\tlet tri = this\n\t\t\tlet count = this.loaders.length\n\t\t\tlet done = false\n\n\t\t\tif (count == 0) {\n\t\t\t\ttri.templates[name] = null\n\t\t\t\tcallback(tri.getTemplate(name))\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis.loaders.forEach(loader => {\n\t\t\t\t\tif (done) {\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t\tloader(name, template => {\n\t\t\t\t\t\tif (done) {\n\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcount--\n\t\t\t\t\t\tif (template) {\n\t\t\t\t\t\t\tdone = true\n\t\t\t\t\t\t\ttri.addTemplate(name, template)\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (count == 0) {\n\t\t\t\t\t\t\tdone = true\n\t\t\t\t\t\t\ttri.templates[name] = null\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (done) {\n\t\t\t\t\t\t\tcallback(tri.getTemplate(name))\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\t}\n\tparseTemplateScript(tx) {\n\t\tvar tks = this.tokenizeTemplateScript(tx);\n\t\t/* current template name */\n\t\tvar ctn = null;\n\t\tfor (var i = 0; i < tks.length; i++) {\n\t\t\tvar token = tks[i];\n\t\t\tif (token.active) {\n\t\t\t\tctn = token.content;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif (ctn) {\n\t\t\t\t\tvar template = this.addTemplate(ctn, this.stripTemplateWhitespace(token.content));\n\t\t\t\t\tif (this.secondaryTemplateFunctionObject) {\n\t\t\t\t\t\tthis.secondaryTemplateFunctionObject[ctn] = template;\n\t\t\t\t\t}\n\t\t\t\t\tctn = null;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tstripTemplateWhitespace(txt) {\n\t\tvar i = txt.indexOf('\\n');\n\t\tif (i > -1 && txt.substring(0, i).trim() == '') {\n\t\t\ttxt = txt.substring(i + 1);\n\t\t}\n\t\ti = txt.lastIndexOf('\\n');\n\t\tif (i > -1 && txt.substring(i).trim() == '') {\n\t\t\ttxt = txt.substring(0, i);\n\t\t}\n\t\treturn txt;\n\t}\n\n\t/* simple template */\n\t_createActiveElement(/* conditional expression */ cd, data, /* handling expression */ hd, tripartite, templateMeta) {\n\t\tlet el = new ActiveElement(cd, data, hd, tripartite);\n\t\tel.templateMeta = templateMeta\n\t\treturn el\n\t}\n\tpt(tx) {\n\t\treturn this.parseTemplate(tx)\n\t}\n\t/* parse template */\n\tparseTemplate(tx) {\n\t\tvar tks = this.tokenizeTemplate(tx);\n\t\tlet t = this._makeTemplate()\n\t\tvar templateMeta = t.templateMeta\n\n\t\tfor (let tk of tks) {\n\t\t\tif (tk.active) {\n\t\t\t\tt.parts.push(this.tokenizeActivePart(tk.content, templateMeta));\n\t\t\t}\n\t\t\telse if (tk.content) {\n\t\t\t\tt.parts.push(tk.content);\n\t\t\t}\n\t\t}\n\n\t\treturn t\n\t}\n\n\ttokenizeActivePart(tx, templateMeta) {\n\t\tvar con = null;\n\t\tvar dat = null;\n\t\tvar han = null;\n\n\t\t/* condition index */\n\t\tvar ci = tx.indexOf('??');\n\t\tif (ci > -1) {\n\t\t\tcon = tx.substring(0, ci);\n\t\t\tci += 2;\n\t\t}\n\t\telse {\n\t\t\tci = 0;\n\t\t}\n\n\t\t/* handler index */\n\t\tvar hi = tx.indexOf('::');\n\t\tif (hi > -1) {\n\t\t\tdat = tx.substring(ci, hi);\n\t\t\than = tx.substring(hi + 2);\n\t\t}\n\t\telse {\n\t\t\tdat = tx.substring(ci);\n\t\t}\n\t\treturn this._createActiveElement(con, dat, han, this, templateMeta);\n\t}\n\n\ttokenizeTemplate(tx) {\n\t\treturn this.tokenizeActiveAndInactiveBlocks(tx, this.constants.templateBoundary);\n\t}\n\n\n\t/** tokenize template script */\n\ttokenizeTemplateScript(tx) {\n\t\treturn this.tokenizeActiveAndInactiveBlocks(tx, this.constants.templateNameBoundary);\n\t}\n\n\t/* tokenize active and inactive blocks */\n\ttokenizeActiveAndInactiveBlocks(text, /*Active Region Boundary */ boundary) {\n\t\t/* whole length */\n\t\tlet length = text.length\n\n\t\t/* current position */\n\t\tlet position = 0\n\n\t\t/* are we in an active region */\n\t\tlet act = false\n\n\t\tlet tokens = []\n\n\t\twhile (position < length) {\n\t\t\tlet i = text.indexOf(boundary, position);\n\t\t\tif (i == -1) {\n\t\t\t\ti = length;\n\t\t\t}\n\t\t\tvar tk = { active: act, content: text.substring(position, i) };\n\t\t\ttokens.push(tk);\n\t\t\tposition = i + boundary.length;\n\t\t\tact = !act;\n\t\t}\n\n\t\treturn tokens;\n\t}\n\n}\nvar tripartiteInstance = new Tripartite()\n\nif (typeof window != 'undefined') {\n\ttripartiteInstance.secondaryTemplateFunctionObject = window\n}\n\n\nif (typeof module !== 'undefined') {\n\tmodule.exports = tripartiteInstance\n}\nelse {\n\twindow.Tripartite = tripartiteInstance\n}\n\nif (typeof global != 'undefined') {\n\tif (!global.Tripartite) {\n\t\tglobal.Tripartite = Tripartite\n\t}\n\tif (!global.tripartite) {\n\t\tglobal.tripartite = tripartiteInstance\n\t}\n}\n\n","var tri = require(\"tripartite\"); var t = \"<span class=\\\"extension-pill\\\">__this__<\\/span>\"; \nmodule.exports = tri.addTemplate(\"webhandle-tree-image-browser/extension-pill\", t); ","var tri = require(\"tripartite\"); var t = \"<div class=\\\"guided-image-upload-form ei-form\\\">\\n\\t<label>\\n\\t\\tSource file name:<br>\\n\\t\\t__nativeName__\\n\\t<\\/label>\\n\\t<label>\\n\\t\\tAfter uploaded name (with extension):\\n\\t\\t<input name=\\\"name\\\" type=\\\"text\\\" \\/>\\n\\t<\\/label>\\n\\t\\n<\\/div>\"; \nmodule.exports = tri.addTemplate(\"webhandle-tree-image-browser/guilded-file-upload-form\", t); ","var tri = require(\"tripartite\"); var t = \"<div class=\\\"guided-image-upload-form ei-form\\\">\\n\\t<label>\\n\\t\\tSource file name:<br>\\n\\t\\t__nativeName__\\n\\t<\\/label>\\n\\t<label>\\n\\t\\tNative resolution:<br>\\n\\t\\t__stats.width__ x __stats.height__\\n\\t<\\/label>\\n\\t<label>\\n\\t\\tAfter uploaded name (no extension):\\n\\t\\t<input name=\\\"name\\\" type=\\\"text\\\" \\/>\\n\\t<\\/label>\\n\\t<div class=\\\"radio-options\\\">\\n\\t\\tOutput format:\\n\\t\\t<label>\\n\\t\\t\\t<input type=\\\"radio\\\" name=\\\"outputFormat\\\" value=\\\"image\\/png\\\" \\/> <span class=\\\"extension-pill\\\">PNG<\\/span>\\n\\t\\t<\\/label>\\n\\t\\t<label>\\n\\t\\t\\t<input type=\\\"radio\\\" name=\\\"outputFormat\\\" value=\\\"image\\/jpeg\\\" \\/> <span class=\\\"extension-pill\\\">JPG<\\/span>\\n\\t\\t<\\/label>\\n\\t<\\/div>\\n\\t<label>\\n\\t\\tOn screen width (px):\\n\\t\\t<input name=\\\"width\\\" type=\\\"number\\\" \\/>\\n\\t<\\/label>\\n\\t<label>\\n\\t\\tOutput quality (0 to 1):\\n\\t\\t<input name=\\\"quality\\\" value=\\\"0.7\\\" type=\\\"number\\\" min=\\\"0\\\" max=\\\"1\\\" step=\\\".01\\\" \\/>\\n\\t<\\/label>\\n\\t\\n\\t<label>\\n\\t\\tAlt text:\\n\\t\\t<textarea name=\\\"altText\\\"><\\/textarea>\\n\\t<\\/label>\\n\\t\\n<\\/div>\"; \nmodule.exports = tri.addTemplate(\"webhandle-tree-image-browser/guilded-image-upload-form\", t); ","var tri = require(\"tripartite\"); var t = \"<div class=\\\"image-browser-frame\\\">\\n\\t<div class=\\\"directory-side\\\">\\n\\t\\t<div class=\\\"treebox\\\">\\n\\n\\t\\t<\\/div>\\n\\t\\t<div class=\\\"directory-controls\\\">\\n\\t\\t\\t<button type=\\\"button\\\" class=\\\"btn create-directory\\\" title=\\\"create new directory\\\">\\n\\t\\t\\t\\t<span class=\\\"material-icons thumbnail-icon\\\">\\n\\t\\t\\t\\t\\tcreate_new_folder\\n\\t\\t\\t\\t<\\/span>\\n\\t\\t\\t<\\/button>\\n\\t\\t\\t<button type=\\\"button\\\" class=\\\"btn delete-directory\\\" title=\\\"delete selected directory\\\">\\n\\t\\t\\t\\t<span class=\\\"material-icons thumbnail-icon\\\">\\n\\t\\t\\t\\t\\tfolder_delete\\n\\t\\t\\t\\t<\\/span>\\n\\t\\t\\t<\\/button>\\n\\t\\t<\\/div>\\n\\t<\\/div>\\n\\t<div class=\\\"node-view\\\">\\n\\t\\t<div class=\\\"view-controls\\\">\\n\\t\\t\\t<div class=\\\"left\\\">\\n\\t\\t\\t\\t<input name=\\\"filter\\\" type=\\\"text\\\" placeholder=\\\"filter\\\" \\/>\\n\\t\\t\\t\\t<button class=\\\"clear-filter\\\">×<\\/button>\\n\\t\\t\\t<\\/div>\\n\\t\\t\\t<div class=\\\"right\\\">\\n\\t\\t\\t\\t<span class=\\\"view-icons\\\">\\n\\t\\t\\t\\t\\t<button type=\\\"button\\\" class=\\\"show-large-tiles\\\" title=\\\"show big tiles\\\" data-show-class=\\\"grid-large\\\">\\n\\t\\t\\t\\t\\t\\t<span class=\\\"material-icons thumbnail-icon\\\">\\n\\t\\t\\t\\t\\t\\t\\tgrid_view\\n\\t\\t\\t\\t\\t\\t<\\/span>\\n\\t\\t\\t\\t\\t<\\/button>\\n\\t\\t\\t\\t\\t<button type=\\\"button\\\" class=\\\"show-small-tiles\\\" title=\\\"show small tiles\\\"\\n\\t\\t\\t\\t\\t\\tdata-show-class=\\\"grid-small\\\">\\n\\t\\t\\t\\t\\t\\t<span class=\\\"material-icons thumbnail-icon\\\">\\n\\t\\t\\t\\t\\t\\t\\tgrid_on\\n\\t\\t\\t\\t\\t\\t<\\/span>\\n\\t\\t\\t\\t\\t<\\/button>\\n\\t\\t\\t\\t\\t<button type=\\\"button\\\" class=\\\"show-list-rows\\\" title=\\\"show as rows\\\" data-show-class=\\\"rows\\\">\\n\\t\\t\\t\\t\\t\\t<span class=\\\"material-icons thumbnail-icon\\\">\\n\\t\\t\\t\\t\\t\\t\\tlist\\n\\t\\t\\t\\t\\t\\t<\\/span>\\n\\t\\t\\t\\t\\t<\\/button>\\n\\t\\t\\t\\t\\t<button type=\\\"button\\\" class=\\\"show-list-text\\\" title=\\\"show as list\\\" data-show-class=\\\"list-text\\\">\\n\\t\\t\\t\\t\\t\\t<span class=\\\"material-icons thumbnail-icon\\\">\\n\\t\\t\\t\\t\\t\\t\\ttable_rows\\n\\t\\t\\t\\t\\t\\t<\\/span>\\n\\t\\t\\t\\t\\t<\\/button>\\n\\t\\t\\t\\t<\\/span>\\n\\n\\t\\t\\t<\\/div>\\n\\t\\t<\\/div>\\n\\t\\t<div class=\\\"node-content\\\">\\n\\t\\t\\t<div class=\\\"box-holder\\\">\\n\\t\\t\\t\\t<div class=\\\"choice-boxes\\\">\\n\\t\\t\\t\\t<\\/div>\\n\\t\\t\\t<\\/div>\\n\\t\\t<\\/div>\\n\\t\\t<div class=\\\"bottom-controls\\\">\\n\\t\\t\\t<div class=\\\"file-controls\\\">\\n\\t\\t\\t\\t<button type=\\\"button\\\" class=\\\"btn delete-file\\\" title=\\\"delete selected file(s)\\\">\\n\\t\\t\\t\\t\\t<span class=\\\"material-icons thumbnail-icon\\\">\\n\\t\\t\\t\\t\\t\\tdelete\\n\\t\\t\\t\\t\\t<\\/span>\\n\\t\\t\\t\\t<\\/button>\\n\\t\\t\\t\\t<button type=\\\"button\\\" class=\\\"btn upload-file\\\" title=\\\"upload file(s)\\\">\\n\\t\\t\\t\\t\\t<span class=\\\"material-icons thumbnail-icon\\\">\\n\\t\\t\\t\\t\\t\\tupload\\n\\t\\t\\t\\t\\t<\\/span>\\n\\t\\t\\t\\t<\\/button>\\n\\t\\t\\t<\\/div>\\n\\t\\t\\t<div class=\\\"folder-info\\\">\\n\\t\\t\\t\\t\\n\\t\\t\\t<\\/div>\\n\\n\\t\\t<\\/div>\\n\\t<\\/div>\\n\\t<div class=\\\"drop-cover file-drop-cover\\\">\\n\\t\\t<div class=\\\"drop-type literal\\\">\\n\\t\\t\\t<div class=\\\"msg\\\">\\n\\t\\t\\t\\t<h2>\\n\\t\\t\\t\\t\\tJust Do It\\n\\t\\t\\t\\t<\\/h2>\\n\\t\\t\\t\\t<p>\\n\\t\\t\\t\\t\\tWe won't mess the files at all, just upload them.\\n\\t\\t\\t\\t<\\/p>\\n\\t\\t\\t<\\/div>\\n\\t\\t<\\/div>\\n\\t<\\/div>\\n\\t<div class=\\\"drop-cover img-drop-cover\\\">\\n\\t\\t<div class=\\\"drop-type guided-upload\\\">\\n\\t\\t\\t<div class=\\\"msg\\\">\\n\\t\\t\\t\\t<h2>Guided Upload<\\/h2>\\n\\t\\t\\t\\t<p>\\n\\t\\t\\t\\t\\tLet us help you rename, and resize (if needed), the files by asking you questions\\n\\t\\t\\t\\t<\\/p>\\n\\t\\t\\t<\\/div>\\n\\t\\t<\\/div>\\n\\t\\t<div class=\\\"drop-type automatic\\\">\\n\\t\\t\\t<div class=\\\"msg\\\">\\n\\t\\t\\t\\t<h2>\\n\\t\\t\\t\\t\\tWeb Safe\\n\\t\\t\\t\\t<\\/h2>\\n\\t\\t\\t\\t<p>\\n\\t\\t\\t\\t\\tWe'll rename the files so they fit better with the web and create multiple formats images.\\n\\t\\t\\t\\t<\\/p>\\n\\t\\t\\t<\\/div>\\n\\t\\t<\\/div>\\n\\t\\t<div class=\\\"drop-type literal\\\">\\n\\t\\t\\t<div class=\\\"msg\\\">\\n\\t\\t\\t\\t<h2>\\n\\t\\t\\t\\t\\tJust Do It\\n\\t\\t\\t\\t<\\/h2>\\n\\t\\t\\t\\t<p>\\n\\t\\t\\t\\t\\tWe won't mess the files at all, just upload them.\\n\\t\\t\\t\\t<\\/p>\\n\\t\\t\\t<\\/div>\\n\\t\\t<\\/div>\\n\\n\\t<\\/div>\\n\\t<div class=\\\"hidden-elements\\\">\\n\\t\\t<input name=\\\"fileUpload\\\" type=\\\"file\\\" placeholder=\\\"Upload a file\\\" \\/>\\n\\t\\t\\n\\t<\\/div>\\n\\n<\\/div>\"; \nmodule.exports = tri.addTemplate(\"webhandle-tree-image-browser/image-browser-frame\", t); ","var tri = require(\"tripartite\"); var t = \"<div class=\\\"variant-choice-box\\\">\\n\\t<div class=\\\"img\\\">\\n\\t\\t__!this.thumbnail??'<span class=\\\"material-icons thumbnail-icon\\\">' + thumbnailIcon + '<\\/span>'__\\n\\t\\t__this.thumbnail??'<img loading=\\\"lazy\\\" class=\\\"thumbnail-image\\\" src=\\\"' + safeThumbnail + '\\\" \\/>'__\\n\\t<\\/div>\\n\\t<div class=\\\"size-line\\\">\\n\\t\\t__size__\\n\\t<\\/div>\\n\\t<div class=\\\"bottom\\\">\\n\\t\\t<div class=\\\"content\\\">\\n\\t\\t\\t<div class=\\\"basename\\\">\\n\\t\\t\\t\\t__safeBaseName__\\n\\t\\t\\t<\\/div>\\n\\t\\t\\t<div class=\\\"extensions\\\">\\n\\t\\t\\t\\t__extensions::.\\/extension-pill__\\n\\t\\t\\t<\\/div>\\n\\t\\t<\\/div>\\n\\t\\t<div class=\\\"actions\\\">\\n\\t\\t\\t<button class=\\\"details\\\">\\n\\t\\t\\t\\t<span class=\\\"material-icons\\\">more_vert<\\/span>\\n\\t\\t\\t<\\/button>\\n\\t\\t<\\/div>\\n\\t<\\/div>\\n\\n<\\/div>\"; \nmodule.exports = tri.addTemplate(\"webhandle-tree-image-browser/variant-choice-box\", t); ","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","export default function eventEntryMapper([key, value]) {\n\tkey = key.trim()\n\tlet parts = key.split(' ')\n\tlet event = parts.shift().trim()\n\tlet selector = parts.join(' ').trim()\n\t\n\tif(typeof value === 'string') {\n\t\tvalue = value.trim()\n\t}\t\n\t\n\treturn {\n\t\tevent: event,\n\t\tselector: selector,\n\t\thandler: value\n\t}\n}","import generateId from \"./generate-id.js\"\n// import pick from \"./pick.js\"\nimport eventEntryMapper from \"./event-entry-mapper.js\"\nimport extractEventNames from \"./extract-event-names.js\"\n\nlet defaultOptions = {\n\t// The default `tagName` of a View's element is `\"div\"`.\n\ttagName: 'div'\n\t\n\t, events: {}\n\n}\nlet viewOptions = ['model', 'el', 'id', 'attributes', 'className', 'tagName', 'events'];\n\n/**\n * A way to connect data to be displayed, a way to display it, and an organization\n * of functions to handle events.\n */\nexport class View {\n\tconstructor(options) {\n\t\tthis.id = generateId()\n\t\tObject.assign(this, defaultOptions)\n\t\tthis.preinitialize.apply(this, arguments);\n\t\tObject.assign(this, options)\n\t\tthis._ensureElement()\n\t\tthis.initialize.apply(this, arguments);\n\t}\n\n\n\t/**\n\t * preinitialize is an empty function by default. You can override it with a function\n\t * or object. preinitialize will run before any instantiation logic is run in the View\n\t */\n\tpreinitialize() { }\n\n\t/**\n\t * Initialize is an empty function by default. Override it with your own\n\t * initialization logic.\n\t */\n\tinitialize() { }\n\n\t/**\n\t * **render** is the core function that your view should override, in order\n\t * to populate its element (`this.el`), with the appropriate HTML. The\n\t * convention is for **render** to always return `this`.\n\t * @returns this\n\t */\n\trender() {\n\t\treturn this\n\t}\n\t\n\t/**\n\t * Removes the element from the dom. Does not disable event listeners\n\t */\n\tremove() {\n\t\tthis.el.parentElement.removeChild(this.el)\n\t}\n\t\n\t/**\n\t * Adds this view as a child to a containing element. Nothing special is going on here.\n\t * This is just a shortcut for container.appendChild\n\t * @param {Element} container \n\t */\n\tappendTo(container) {\n\t\tcontainer.appendChild(this.el)\n\t}\n\n\t/**\n\t * Clears the contents of the container and adds this view.\n\t * @param {Element} container \n\t */\n\treplaceContentsOf(container) {\n\t\tcontainer.innerHTML = ''\n\t\tthis.appendTo(container)\n\t}\n\n\t/**\n\t * Set the element for this view, and if new, adds listeners to it in accordance\n\t * with the \"events\" member.\n\t * @param {Element} el The dom element which will be the root of this view\n\t * @returns this\n\t */\n\tsetElement(el) {\n\t\tif (this.el !== el) {\n\t\t\tthis.el = el\n\t\t\tthis._addListeners()\n\t\t}\n\t\treturn this\n\t}\n\n\t/**\n\t * Produces a DOM element to be assigned to your view. Exposed for\n\t * subclasses using an alternative DOM manipulation API.\n\t * @param {string} name The element tag name\n\t * @returns The dom element\n\t */\n\t_createElement(name) {\n\t\tlet el = document.createElement(name)\n\t\tel.setAttribute('id', this.id)\n\t\tel.view = this\n\t\treturn el\n\t}\n\n\t/**\n\t * Ensures that the element exists. Applies attributes and className\n\t * to it regardless\n\t */\n\t_ensureElement() {\n\t\tif (!this.el) {\n\t\t\tthis.setElement(this._createElement(this.tagName))\n\t\t}\n\t\tthis._setAttributes()\n\t\tif (this.className) {\n\t\t\tthis.el.classList.add(this.className)\n\t\t}\n\t}\n\n\t/**\n\t * Set attributes from a hash on this view's element. Exposed for\n\t * subclasses using an alternative DOM manipulation API.\n\t * @param {object} attributes \n\t */\n\t_setAttributes(attributes) {\n\t\tif (this.attributes) {\n\t\t\tfor (let [key, value] of Object.entries(this.attributes)) {\n\t\t\t\tthis.el.setAttribute(key, value)\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * \n\t * Set callbacks, where `this.events` is a hash of\n\t * *{\"event selector\": \"callback\"}*\n\t *\n\t * {\n\t * 'mousedown .title': 'edit',\n\t * 'click .button': 'save',\n\t * 'click .open': function(e) { ... },\n\t * 'keydown .': \t 'handleKey'\n\t * }\n\t * pairs. Callbacks will be bound to the view, with `this` set properly.\n\t * \n\t * \n\t * Note that the selector `.` will match the root element and can be used\n\t * as a final chance to handle events or for events like an escape key\n\t * which are essentially global to the widget.\n\t * \n\t */\n\t_addListeners() {\n\t\tthis.eventTriggers = Object.entries(this.events).map(eventEntryMapper)\n\t\tlet eventNames = extractEventNames(this.eventTriggers)\t\t\n\n\t\tfor(let eventName of eventNames) {\n\t\t\tthis.el.addEventListener(eventName, this._eventHandler.bind(this))\n\t\t}\n\t}\n\t\n\t/**\n\t * Get the elements from the view which match the selector\n\t * @param {string} selector A css selector. `.` will select the root element\n\t * @returns An array of elements\n\t */\n\t_getCandidates(selector) {\n\t\tif(selector === '.') {\n\t\t\treturn [this.el]\n\t\t}\n\t\treturn Array.from(this.el.querySelectorAll(selector))\n\t}\n\t\n\t/**\n\t * Handles all events for all elements within the view. It attempts to find a\n\t * trigger matching the event and then process it. It will match and invoke\n\t * only one trigger.\n\t * @param {Event} evt \n\t */\n\t_eventHandler(evt) {\n\t\tfor(let trigger of this.eventTriggers) {\n\t\t\tif(evt.type == trigger.event) {\n\t\t\t\tlet candidates = this._getCandidates(trigger.selector)\n\t\t\t\tlet found = null\n\t\t\t\tfor(let candidate of candidates) {\n\t\t\t\t\tif(candidate === evt.target || candidate.contains(evt.target)) {\n\t\t\t\t\t\tfound = candidate\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif(found) {\n\t\t\t\t\tif(typeof trigger.handler === 'string') {\n\t\t\t\t\t\tthis[trigger.handler].call(this, evt, found)\n\t\t\t\t\t}\t\n\t\t\t\t\telse if(typeof trigger.handler === 'function') {\n\t\t\t\t\t\ttrigger.handler.call(this, evt, found)\n\t\t\t\t\t}\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n","/**\n * Generates a random string id in the browser. Will probably not work\n * on the server.\n * @returns A base64 web url safe string\n */\nexport default function generateId() {\n\tlet array = new Uint8Array(32)\n\twindow.crypto.getRandomValues(array)\n\tlet value = btoa(array)\n\tvalue = value.replace(/\\//g, \"_\").replace(/\\+/g, \"-\").replace(/=+$/, \"\")\n\treturn value\n}","export default function extractEventNames(eventTriggers) {\n\tlet eventNames = Array.from(eventTriggers.reduce((acc, trigger) => {\n\t\tacc.add(trigger.event)\n\t\treturn acc\n\t}, new Set()))\n\treturn eventNames\n}","\nimport t3 from './webhandle-tree-image-browser/image-browser-frame.tri';\nimport t4 from './webhandle-tree-image-browser/variant-choice-box.tri'\nimport t5 from './webhandle-tree-image-browser/extension-pill.tri'\nimport t6 from './webhandle-tree-image-browser/guilded-image-upload-form.tri'\nimport t7 from './webhandle-tree-image-browser/guilded-file-upload-form.tri'\n\n\nexport let imageBrowserFrame = t3\nexport let variantChoiceBox = t4\nexport let extensionPill = t5\nexport let guidedImageUploadForm = t6\nexport let guidedFileUploadForm = t7\n","\nexport default function formatBytes(bytes, decimals) {\n\tif (bytes == 0)\n\t\treturn '0 Bytes'\n\tvar k = 1024,\n\t\tdm = decimals || 2,\n\t\tsizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'],\n\t\ti = Math.floor(Math.log(bytes) / Math.log(k))\n\treturn parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i]\n}","\n/**\n * Add this most basic of the EventEmitter functions (on, emit, removeListener) to the browser's\n * EventTarget functionality.\n * \n * The eventEmitter.emit() method allows an arbitrary set of arguments to be passed to the listener \n * functions. Keep in mind that when an ordinary listener function is called, the standard this \n * keyword is intentionally set to reference the EventEmitter instance to which the listener is attached.\n */\nlet base = typeof EventTarget === 'undefined' ? {} : EventTarget\nexport default class EventEmitter extends base {\n\tconstructor(target) {\n\t\tsuper(target)\n\t\tif(target) {\n\t\t\tthis.innerEventTarget = target\n\t\t}\n\t\telse {\n\t\t\tthis.innerEventTarget = this\n\t\t}\n\t}\n\t/**\n\t * Adds the listener function to the end of the listeners array for the event named eventName. No checks \n\t * are made to see if the listener has already been added. Multiple calls passing the same combination \n\t * of eventName and listener will result in the listener being added, and called, multiple times.\n\t * @param {string} eventName The event type name\n\t * @param {*} listener The listener function where has arbitrary arguments\n\t */\n\ton(eventName, listener) {\n\t\tlet nativeListener = (event) => {\n\t\t\tlistener.apply(this, event.detail)\n\t\t}\n\t\tlistener.nativeListener = nativeListener\n\t\tthis.innerEventTarget.addEventListener(eventName, nativeListener)\n\t\treturn this\n\t}\n\n\t/**\n\t * Synchronously calls each of the listeners registered for the event named eventName, in the order \n\t * they were registered, passing the supplied arguments to each.\n\t * \n\t * @param {string} eventName The event type name\n\t * @param {...any} args \n\t */\n\temit(eventName, ...args) {\n\t\tthis.innerEventTarget.dispatchEvent(new CustomEvent(eventName, {\n\t\t\tdetail: args\n\t\t}))\n\t\treturn this\n\t}\n\n\t/**\n\t * Removes the specified listener from the listener array for the event named eventName.\n\t * @param {string} eventName The event type name\n\t * @param {function} listener The listener function\n\t */\n\tremoveListener(eventName, listener) {\n\t\tlistener = listener.nativeListener || listener\n\t\tthis.innerEventTarget.removeEventListener(eventName, listener)\n\t\treturn this\n\t}\n}","let Emitter\nimport Streamish from \"./streamish.mjs\"\nimport EventEmitter from \"./event-emitter.mjs\"\n\nif (typeof EventTarget !== 'undefined') {\n\tEmitter = EventEmitter\n}\nelse {\n\tEmitter = Streamish\n}\n\n\nexport default Emitter","\nexport default class Streamish {\n\tconstructor() {\n\t\tthis.handles = {}\n\t}\n\n\ton(evt, handle) {\n\t\tlet handles = this.handles[evt]\n\t\tif (!handles) {\n\t\t\thandles = this.handles[evt] = []\n\t\t}\n\t\thandles.push(handle)\n\t\treturn this\n\t}\n\n\temit(evt, ...args) {\n\t\tif (evt in this.handles) {\n\t\t\tfor (let handle of this.handles[evt]) {\n\t\t\t\thandle.apply(this, args)\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Removes the specified listener from the listener array for the event named eventName.\n\t * @param {string} eventName The event type name\n\t * @param {function} listener The listener function\n\t */\n\tremoveListener(eventName, listener) {\n\t\tif (eventName in this.handles) {\n\t\t\tthis.handles[eventName] = this.handles[eventName].filter(func => {\n\t\t\t\treturn func !== listener\n\t\t\t})\n\t\t}\n\t}\n}","import Dialog from 'ei-dialog'\nimport formValueInjector from 'form-value-injector'\nimport gatherFormData from '@webhandle/gather-form-data'\n\n\nexport class FormAnswerDialog extends Dialog {\n\t/**\n\t * \n\t * @param {Object} options Properties to create the dialog box. In addition to the properties from Dialog\n\t * there those below.\n\t * @param {Object} options.data The data which will be used to populate the controls in the dialog\n\t */\n\tconstructor(options) {\n\t\tsuper(Object.assign({}, options,\n\t\t\t{\n\t\t\t\ton: {\n\t\t\t\t\t'.btn-ok': () => {\n\t\t\t\t\t\tthis.resolve(this.gatherData())\n\t\t\t\t\t\treturn true\n\t\t\t\t\t},\n\t\t\t\t\t'.mask': () => {\n\t\t\t\t\t\tthis.resolve()\n\t\t\t\t\t\treturn true\n\t\t\t\t\t},\n\t\t\t\t\t'.btn-cancel': () => {\n\t\t\t\t\t\tthis.resolve()\n\t\t\t\t\t\treturn true\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t}\n\t\t))\n\t\tif (this.afterOpen) {\n\t\t\tthis.afterOpenOriginal = this.afterOpen\n\t\t}\n\t\tthis.afterOpen = function (bodyElement, self) {\n\t\t\tif (this.data) {\n\t\t\t\tbodyElement.innerHTML = formValueInjector(bodyElement.innerHTML, this.data)\n\t\t\t}\n\t\t\tlet firstInput = bodyElement.querySelector('input, textarea')\n\t\t\tif (firstInput) {\n\t\t\t\tfirstInput.focus()\n\t\t\t}\n\n\t\t\tif (this.afterOpenOriginal) {\n\t\t\t\tthis.afterOpenOriginal(bodyElement, self)\n\t\t\t}\n\t\t}\n\t}\n\tgatherData() {\n\t\tlet dialogBody = document.querySelector(this.getBodySelector())\n\t\treturn gatherFormData(dialogBody)\n\t}\n\n\tasync open() {\n\t\tthis.promise = new Promise((resolve, reject) => {\n\t\t\tthis.resolve = resolve\n\t\t\tthis.reject = reject\n\t\t})\n\t\tsuper.open()\n\n\t\treturn this.promise\n\t}\n\n}","/**\n * Gathers the data from the form controls.\n * @param {HTMLElement} formBody The html element containing the controls. Probably\n * a form tag element, but it really doesn't matter.\n */\nexport default function gatherFormData(formBody) {\n\tlet result = {}\n\tlet controls = formBody.querySelectorAll('input, textarea, select')\n\tfor (let control of controls) {\n\t\tif (control.type === 'checkbox') {\n\t\t\tif (!control.checked) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t}\n\t\telse if (control.type === 'radio') {\n\t\t\tif (!control.checked) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t}\n\t\tresult[control.getAttribute('name')] = control.value\n\t}\n\treturn result\n}\n\n","import { FormAnswerDialog } from '../form-answer-dialog.mjs'\n\nexport async function deleteFile(evt, selected) {\n\tlet sel = this.getSelectedFiles()\n\n\tif (sel.files.length > 0) {\n\n\t\tlet files = sel.files\n\t\tlet names = sel.names\n\n\t\tif (!this.deleteWithoutConfirm) {\n\t\t\tlet dialog = new FormAnswerDialog({\n\t\t\t\ttitle: 'Delete File' + (files.length > 1 ? 's' : '')\n\t\t\t\t, body: '<p>' + names.join(', ') + '</p>'\n\t\t\t})\n\t\t\tlet prom = dialog.open()\n\t\t\tlet ans = await prom\n\t\t\tif (!ans) {\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\n\t\tfor (let file of files) {\n\t\t\tlet path = file.relPath\n\t\t\tlet note\n\t\t\tif (this.eventNotificationPanel) {\n\t\t\t\tnote = this.eventNotificationPanel.addNotification({\n\t\t\t\t\tmodel: {\n\t\t\t\t\t\tstatus: 'pending',\n\t\t\t\t\t\theadline: `deleting ${file.name}`\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t}\n\t\t\tawait this.sink.rm(path)\n\t\t\tif (this.eventNotificationPanel) {\n\t\t\t\tnote.remove()\n\t\t\t\tnote = this.eventNotificationPanel.addNotification({\n\t\t\t\t\tmodel: {\n\t\t\t\t\t\tstatus: 'success',\n\t\t\t\t\t\theadline: `removed ${file.name}`\n\t\t\t\t\t}\n\t\t\t\t\t, ttl: 2000\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\t\tfor (let item of sel.boxes) {\n\t\t\titem.remove()\n\t\t}\n\t}\n\tthis.emitter.emit('delete', {\n\t\ttype: 'delete'\n\t\t, selected: sel\n\t})\n}\n\nexport async function deleteDirectory(evt, selected) {\n\tlet path = this.currentNode.file.relPath\n\tlet name = this.currentNode.file.name\n\n\tif (!path) {\n\t\t// probably the root, just cancel\n\t\treturn\n\t}\n\n\tlet dialog = new FormAnswerDialog({\n\t\ttitle: 'Delete Directory'\n\t\t, body: '<p>' + name + '</p>'\n\t})\n\tlet prom = dialog.open()\n\tlet ans = await prom\n\tif (!ans) {\n\t\treturn\n\t}\n\tlet note\n\tif (this.eventNotificationPanel) {\n\t\tnote = this.eventNotificationPanel.addNotification({\n\t\t\tmodel: {\n\t\t\t\tstatus: 'pending',\n\t\t\t\theadline: `deleting ${name}`\n\t\t\t}\n\t\t})\n\t}\n\tawait this.sink.rm(path, { recursive: true })\n\tlet curSelected = this.tree.selected()\n\tlet parent = this.tree.parent(curSelected)\n\n\tthis.tree.removeNode(curSelected)\n\tthis.tree.select(parent.id)\n\n\tif (this.eventNotificationPanel) {\n\t\tnote.remove()\n\t\tnote = this.eventNotificationPanel.addNotification({\n\t\t\tmodel: {\n\t\t\t\tstatus: 'success',\n\t\t\t\theadline: `removed ${name}`\n\t\t\t}\n\t\t\t, ttl: 2000\n\t\t})\n\t}\n}\n","\nexport function _join(...parts) {\n\tparts = parts.filter(part => !!part)\n\tlet path = parts.join('/')\n\treturn path\n}\n\nexport function _determineParentPath(path) {\n\tif(!path) {\n\t\treturn ''\n\t}\n\tlet parts = path.split('/')\n\tparts.pop()\n\treturn parts.join('/')\n}\n\nexport function _fileToKalpaNode(file) {\n\tlet node = {\n\t\tid: this.idInd++\n\t\t, label: file.name\n\t\t, directory: file.directory\n\t\t, file: file\n\t\t, loaded: false\n\t}\n\n\tlet parent = this.nodes[this._determineParentPath(file.relPath)]\n\tthis.nodes[file.relPath] = node\n\n\tif (parent) {\n\t\tnode.parentId = parent.id\n\t\tnode.path = file.relPath\n\t}\n\n\tfile.path = node.path\n\treturn node\n}\n\nexport function _determineExtensions(variant) {\n\tlet extensions = new Set()\n\tif (variant.variants) {\n\t\tfor (let imgVariant of variant.variants) {\n\t\t\textensions.add(imgVariant.ext)\n\t\t}\n\t}\n\telse {\n\t\textensions.add(variant.ext)\n\t}\n\n\tlet result = Array.from(extensions).filter(item => !!item)\n\tresult.sort((a, b) => {\n\t\treturn a.toLowerCase().localeCompare(b.toLowerCase())\n\t})\n\n\treturn result\n}\n\nexport function _determineSizes(variant) {\n\tlet min = 2000000000\n\tlet max = 0\n\tif (variant.variants) {\n\t\tfor (let imgVariant of variant.variants) {\n\t\t\tlet size = imgVariant.file.stat.size\n\t\t\tif (size > max) {\n\t\t\t\tmax = size\n\t\t\t}\n\t\t\tif (size < min) {\n\t\t\t\tmin = size\n\t\t\t}\n\t\t}\n\t}\n\telse {\n\t\tlet size = variant.file.stat.size\n\t\tif (size > max) {\n\t\t\tmax = size\n\t\t}\n\t\tif (size < min) {\n\t\t\tmin = size\n\t\t}\n\t}\n\treturn [min, max]\n}\n\nexport function _sortFiles(files) {\n\tfiles.sort((one, two) => {\n\t\treturn one.relPath.toLowerCase().localeCompare(two.relPath.toLowerCase())\n\t})\n\n\treturn files\n}\n\nexport function _compareVariants(one, two) {\n\treturn one.baseName.toLowerCase().localeCompare(two.baseName.toLowerCase())\n}\n\nexport function sanitizeFileName(name) {\n\treturn name.split('/').join('-').split('..').join('-')\n}\n\n\nexport function _isImageFile(file) {\n\tif (!file.type.startsWith('image')) {\n\t\treturn false\n\t}\n\tif (file.type.includes('jpeg') || file.type.includes('png') || file.type.includes('webp')) {\n\t\treturn true\n\t}\n\treturn false\n}\n\nexport function setIfNotSet(key, value) {\n\tif (!(key in this)) {\n\t\tthis[key] = value\n\t}\n}\n\nexport function _addPending(file) {\n\tlet note\n\tif (this.eventNotificationPanel) {\n\t\tnote = this.eventNotificationPanel.addNotification({\n\t\t\tmodel: {\n\t\t\t\tstatus: 'pending',\n\t\t\t\theadline: `uploading ${file.name}`\n\t\t\t}\n\t\t})\n\t}\n\treturn note\n}\n","import Dialog from 'ei-dialog'\n\nexport class InfoDialog extends Dialog {\n\tconstructor(options) {\n\t\tsuper(Object.assign({}, options,\n\t\t\t{\n\t\t\t\ton: {\n\t\t\t\t\t'.btn-ok': () => {\n\t\t\t\t\t\tthis.resolve()\n\t\t\t\t\t\treturn true\n\t\t\t\t\t},\n\t\t\t\t\t'.mask': () => {\n\t\t\t\t\t\tthis.resolve()\n\t\t\t\t\t\treturn true\n\t\t\t\t\t},\n\t\t\t\t\t'.btn-cancel': () => {\n\t\t\t\t\t\tthis.resolve()\n\t\t\t\t\t\treturn true\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t}\n\t\t))\n\t}\n\n\tasync open() {\n\t\tthis.promise = new Promise((resolve, reject) => {\n\t\t\tthis.resolve = resolve\n\t\t\tthis.reject = reject\n\t\t})\n\t\tsuper.open()\n\n\t\treturn this.promise\n\t}\n\n}","import { InfoDialog } from '../info-dialog.mjs'\nimport escapeHtmlAttributeValue from '@dankolz/escape-html-attribute-value'\n\nexport function changeFilesView(evt, selected) {\n\tlet className = selected.getAttribute('data-show-class')\n\tthis.changeFilesViewToClass(className)\n}\n\nexport function changeFilesViewToClass(className) {\n\tlet choiceBoxes = this.el.querySelector('.choice-boxes')\n\tlet classes = [...this.el.querySelector('.view-icons').querySelectorAll('button')].map(button => button.getAttribute('data-show-class'))\n\tclasses.forEach(item => {\n\t\tchoiceBoxes.classList.remove(item)\n\t})\n\tchoiceBoxes.classList.add(className)\n}\n\nexport function applyFilter(evt, selected) {\n\tsetTimeout(() => {\n\t\tlet value = this.el.querySelector('[name=\"filter\"]').value\n\t\tlet allVariants = this.el.querySelectorAll('.choice-boxes .variant-choice-box')\n\t\tfor (let variant of allVariants) {\n\t\t\tvariant.classList.remove('hidden')\n\t\t\tif (value) {\n\t\t\t\tvalue = value.toLowerCase()\n\t\t\t\tlet searchString = variant.variant.baseName.toLowerCase() + variant.variant.extensions.map(ext => ext.toLowerCase()).join()\n\t\t\t\tif (searchString.indexOf(value) < 0) {\n\t\t\t\t\tvariant.classList.add('hidden')\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tthis.setFolderInfo()\n\t})\n}\n\nexport function clearFilter(evt, selected) {\n\tthis.el.querySelector('[name=\"filter\"]').value = ''\n\tthis.applyFilter()\n}\n\nexport function selectVariant(evt, selected) {\n\tlet currentSelected = this.el.querySelectorAll('.choice-boxes .variant-choice-box.selected')\n\tif (!evt.ctrlKey && !evt.shiftKey) {\n\t\tfor (let sel of currentSelected) {\n\t\t\tsel.classList.remove('selected')\n\t\t}\n\t}\n\n\tif (evt.shiftKey) {\n\t\tlet cur = selected\n\t\tdo {\n\t\t\tif (cur.classList.contains('selected')) {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tcur.classList.add('selected')\n\t\t\tcur = cur.previousElementSibling\n\t\t}\n\t\twhile (cur);\n\t}\n\telse {\n\t\tselected.classList.toggle('selected')\n\t}\n\n\n\tlet sel = this.getSelectedFiles()\n\tthis.emitter.emit('select', {\n\t\ttype: 'select'\n\t\t, selected: sel\n\t})\n}\n\n\n\nexport function showVariantDetails(evt, selected) {\n\tlet choiceBox = selected.closest('.variant-choice-box')\n\tlet variant = choiceBox.variant\n\n\tlet files = this._getAssociatedRealFiles(variant)\n\n\tlet content = '<div class=\"variant-details-information\">'\n\tif (variant.safeThumbnail) {\n\t\tcontent += `<div class=\"details-preview-image\">\n\t\t<img loading=\"lazy\" src=\"${variant.safeThumbnail}\" />\n\t\t</div>`\n\t}\n\n\tcontent += '<ul class=\"variants\">'\n\tfor (let file of files) {\n\t\tcontent += '<li><a target=\"_blank\" href=\"' + escapeHtmlAttributeValue(this.escapeAccessUrl(file.accessUrl)) + '\">'\n\t\tcontent += escapeHtmlAttributeValue(file.name) + '</a> - ' + this._formatBytes(file.stat.size)\n\t\tcontent += '</li>'\n\t}\n\tcontent += '</ul>'\n\n\tcontent += '</div>'\n\n\tlet dialog = new InfoDialog({\n\t\ttitle: 'File Details: ' + variant.baseName\n\t\t, body: content\n\t\t, buttons: [\n\t\t\t{\n\t\t\t\tclasses: 'btn btn-primary btn-ok',\n\t\t\t\tlabel: 'OK'\n\t\t\t}\n\t\t]\n\t})\n\tlet prom = dialog.open()\n\tprom.then(async data => {\n\t\tif (data) {\n\t\t}\n\t})\n}\n\nexport function setFolderInfo() {\n\tlet fileCount = 0\n\tlet variantCount = 0\n\tlet byteCount = 0\n\tlet nonImages = 0\n\tlet allVariants = this.el.querySelectorAll('.choice-boxes .variant-choice-box')\n\tfor (let variant of allVariants) {\n\t\tif (variant.classList.contains('hidden')) {\n\t\t\tcontinue\n\t\t}\n\t\tvariantCount++\n\n\t\tif (variant.variant.variants) {\n\t\t\tvariant.variant.variants.forEach(variant => {\n\t\t\t\tfileCount++\n\t\t\t\tbyteCount += variant.file.stat.size\n\t\t\t})\n\n\t\t}\n\t\telse {\n\t\t\tfileCount++\n\t\t\tbyteCount += variant.variant.file.stat.size\n\t\t\tnonImages++\n\t\t}\n\t}\n\tthis.el.querySelector('.folder-info').innerHTML = `${variantCount} items / ${fileCount} files / ${this._formatBytes(byteCount)} `\n\tif (variantCount > this.listTriggerSize) {\n\t\tthis.changeFilesViewToClass('list-text')\n\t}\n\tthis.el.querySelector('.view-icons').classList.remove('no-img')\n\tif (variantCount - nonImages > this.listLockSize) {\n\t\tthis.el.querySelector('.view-icons').classList.add('no-img')\n\t}\n}\n\nexport function cleanFileInfo() {\n\tthis.el.querySelector('.folder-info').innerHTML = ''\n\tlet choicesBoxes = this.el.querySelector('.choice-boxes')\n\tchoicesBoxes.innerHTML = '<div class=\"loading-info\">Loading Information Now</div>'\n\tthis.el.querySelector('.view-icons').classList.add('no-img')\n}\n","\nexport function getDropCoverSelector() {\n\treturn '.img-drop-cover'\n}\n\nexport async function handleDrop(evt, selected) {\n\tlet uploadType = 'literal'\n\tlet dropSquare = evt.target.closest('.drop-type')\n\tif (dropSquare) {\n\t\tif (dropSquare.classList.contains('guided-upload')) {\n\t\t\tuploadType = 'guided'\n\t\t}\n\t\telse if (dropSquare.classList.contains('automatic')) {\n\t\t\tuploadType = 'automatic'\n\t\t}\n\t}\n\n\tthis._cleanupDropDone()\n\tevt.preventDefault()\n\tlet files = await this._getFilesFromEvent(evt)\n\tthis.uploadFiles(files, { uploadType })\n}\n\nexport function isFileTypeDrag(evt) {\n\tlet fileType = true\n\tif (evt.dataTransfer) {\n\t\tif (evt.dataTransfer.items[0].kind === 'string') {\n\t\t\tfileType = false\n\t\t}\n\t}\n\n\treturn fileType\n}\n\nexport function dragEnter(evt, selected) {\n\tlet overlay = this.isFileTypeDrag(evt)\n\tif (overlay) {\n\t\tthis.overCount++\n\t\tthis.el.querySelector(this.getDropCoverSelector()).classList.add('file-dropping')\n\t}\n}\nexport function dragLeave(evt, selected) {\n\tif (this.isFileTypeDrag(evt)) {\n\t\tthis.overCount--\n\t\tif (this.overCount == 0) {\n\t\t\tthis._cleanupDropDone()\n\t\t}\n\t}\n}\nexport function dragOver(evt, selected) {\n\tevt.preventDefault()\n}\n\nexport function _cleanupDropDone() {\n\tthis.overCount = 0;\n\t[...this.el.querySelectorAll('.file-dropping')].forEach(cover => cover.classList.remove('file-dropping'))\n}\n\nexport async function handlePaste(evt) {\n\tif (this.ignoreGlobalEvents) {\n\t\treturn\n\t}\n\tevt.preventDefault()\n\tif (evt.clipboardData && evt.clipboardData.files && evt.clipboardData.files.length > 0) {\n\t\tthis.uploadFiles(evt.clipboardData.files, { uploadType: 'guided' })\n\t}\n}","import { FormAnswerDialog } from '../form-answer-dialog.mjs'\n\nexport function createDirectory(evt, selected) {\n\tlet dialog = new FormAnswerDialog({\n\t\ttitle: 'Create Directory'\n\t\t, body: '<label>Directory name <input type=\"text\" name=\"name\" /></label>'\n\t})\n\tlet prom = dialog.open()\n\tprom.then(async data => {\n\t\tif (data) {\n\t\t\tlet directoryPath = this.currentNode.file.relPath + '/' + data.name\n\t\t\tawait this.sink.mkdir(directoryPath)\n\t\t\tlet file = await this.sink.getFullFileInfo(directoryPath)\n\t\t\tlet node = this._fileToKalpaNode(file)\n\t\t\tthis.tree.options.stream.emit('data', node)\n\t\t\tlet cur = this.tree.selected()\n\t\t\tif (cur) {\n\t\t\t\tthis.tree.expand(cur.id)\n\t\t\t}\n\t\t}\n\t})\n\n}","\nfunction breakOnChars(chrs, txt) {\n\tfor (let c of chrs) {\n\t\ttxt = txt.split(c).join('<wbr>' + c)\n\t}\n\treturn txt\n}\n\nexport default function addSoftBreaks(txt) {\n\tif(!txt || typeof txt !== 'string') {\n\t\treturn txt\n\t}\n\t\n\tlet chars = [...txt]\n\ttxt = ''\n\tfor(let i = 0; i < chars.length; i++) {\n\t\ttxt += chars[i]\n\t\tif(i % 10 === 0) {\n\t\t\ttxt += '<wbr>'\n\t\t}\n\t}\n\ttxt = breakOnChars(['_'], txt)\n\n\treturn txt\n}","import condense from '@dankolz/webp-detection/lib/condense-image-variants.js'\nimport escapeHtmlAttributeValue from '@dankolz/escape-html-attribute-value'\nimport addSoftBreaks from '../add-soft-breaks.mjs'\n\nexport function createVariantValues(info) {\n\tlet variants = condense(info.children)\n\tlet variantValues = Object.values(variants)\n\n\tlet used = []\n\tfor (let variant of variantValues) {\n\t\tused.push(...this._getAssociatedRealFiles(variant).map(variant => variant.name))\n\t}\n\n\tlet remainingChildren = info.children.filter(item => {\n\t\treturn !used.includes(item.name)\n\t})\n\t\t.filter(item => !item.directory)\n\n\t// Add thumbnails\n\tfor (let child of variantValues) {\n\t\tchild.thumbnailIcon = 'image'\n\t\tif (child.preview) {\n\t\t\tchild.thumbnail = this._createAccessUrl(child.preview.file)\n\t\t\tchild.safeThumbnail = escapeHtmlAttributeValue(child.thumbnail)\n\t\t}\n\t}\n\n\tif (!this.imagesOnly) {\n\t\tfor (let file of remainingChildren) {\n\t\t\tlet info = {\n\t\t\t\tfile: file\n\t\t\t\t, thumbnailIcon: 'description'\n\t\t\t}\n\t\t\tlet name = file.name\n\t\t\tinfo.ext = name.substring(name.lastIndexOf('.') + 1)\n\t\t\tinfo.baseName = name.substring(0, name.lastIndexOf('.'))\n\t\t\tvariantValues.push(info)\n\t\t}\n\t}\n\n\n\t// Determine extensions, add additional top level info (safeBaseName)\n\tfor (let item of variantValues) {\n\t\titem.extensions = this._determineExtensions(item)\n\t\titem.sizes = this._determineSizes(item)\n\t\tif (item.sizes[0] == item.sizes[1]) {\n\t\t\titem.size = this._formatBytes(item.sizes[0])\n\t\t}\n\t\telse {\n\t\t\titem.size = this._formatBytes(item.sizes[0]) + ' - ' + this._formatBytes(item.sizes[1])\n\t\t}\n\t\titem.safeBaseName = addSoftBreaks(escapeHtmlAttributeValue(item.baseName))\n\t}\n\n\tvariantValues.sort(this._compareVariants)\n\treturn variantValues\n}\n\nexport async function _getFilesFromEvent(evt) {\n\tlet files = []\n\n\t// items is the new interface we should use if that's available\n\tif (evt.dataTransfer.items) {\n\t\tlet foundItems = [];\n\t\t[...evt.dataTransfer.items].forEach((item, i) => {\n\t\t\tfoundItems.push(item)\n\t\t})\n\t\tfor (let item of foundItems) {\n\t\t\tif (item.kind === \"file\") {\n\t\t\t\tif (item.webkitGetAsEntry) {\n\t\t\t\t\tlet entry = item.webkitGetAsEntry()\n\t\t\t\t\tif (entry) {\n\t\t\t\t\t\t// if there's no entry, it's probably not a file, so we'll just ignore\n\t\t\t\t\t\tif (entry.isDirectory) {\n\t\t\t\t\t\t\tcontinue\n\n\t\t\t\t\t\t\t// Evenually we'll want to handle directories too, but for now we'll just go\n\t\t\t\t\t\t\t// on with the other items\n\n\t\t\t\t\t\t\t// var dirReader = entry.createReader()\n\t\t\t\t\t\t\t// dirReader.readEntries(function (entries) {\n\t\t\t\t\t\t\t// \tconsole.log(entries)\n\t\t\t\t\t\t\t// })\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tfiles.push(item.getAsFile())\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tfiles.push(item.getAsFile())\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (item instanceof File) {\n\t\t\t\t// Maybe from a file input element\n\t\t\t\tfiles.push(item)\n\t\t\t}\n\t\t}\n\t} else {\n\t\t[...evt.dataTransfer.files].forEach((file, i) => {\n\t\t\tfiles.push(file)\n\t\t})\n\t}\n\treturn files\n}\n\nexport function _getAssociatedRealFiles(variant) {\n\tlet files = []\n\tif (variant.variants) {\n\t\tfiles.push(...variant.variants.map(variant => variant.file))\n\t}\n\telse {\n\t\tfiles.push(variant.file)\n\t}\n\tif (variant.definitionFile) {\n\t\tfiles.push(variant.definitionFile)\n\t}\n\n\treturn files\n}\n\nexport function _createAccessUrl(file) {\n\treturn this.escapeAccessUrl(file.accessUrl)\n}\n\nfunction urlEscapeChars(chrs, url) {\n\tfor (let c of chrs) {\n\t\turl = url.split(c).join(encodeURIComponent(c))\n\t}\n\treturn url\n}\n\nexport function escapeAccessUrl(url) {\n\treturn urlEscapeChars(['%', ' ', '#', '?', '<', '>', '$', '@', '^', '&'], url)\n}\n\n\nexport function getSelectedFiles() {\n\tlet result = {\n\t\tboxes: []\n\t\t, variants: []\n\t\t, files: []\n\t\t, names: []\n\t}\n\tlet currentSelected = this.el.querySelectorAll('.choice-boxes .variant-choice-box.selected')\n\tif (currentSelected.length > 0) {\n\t\tfor (let sel of currentSelected) {\n\t\t\tresult.boxes.push(sel)\n\t\t\tresult.variants.push(sel.variant)\n\t\t\tresult.files.push(...this._getAssociatedRealFiles(sel.variant))\n\t\t}\n\t\tlet names = result.files.map(file => file.name)\n\t\tresult.names.push(...names)\n\t}\n\n\treturn result\n}\n\nexport function _transformRelativeUrlToPublic(url) {\n\tif(url.startsWith('/') == false) {\n\t\turl = '/' + url\n\t}\n\treturn url\t\n}\n\nexport async function getSelectedUrl(selectedFiles) {\n\tif(!selectedFiles) {\n\t\tselectedFiles = this.getSelectedFiles()\n\t}\n\t\n\tif(selectedFiles.variants.length == 0) {\n\t\treturn\n\t}\n\t\n\tlet variant = selectedFiles.variants[0]\n\tlet chosen\n\tif(variant.primary) {\n\t\tchosen = variant.primary.file\n\t}\n\telse {\n\t\tchosen = variant.file\n\t}\n\t\n\tlet base = this._transformRelativeUrlToPublic(chosen.relPath)\n\t\n\tif(variant.definitionFile) {\n\t\tlet defData = await this.sink.read(variant.definitionFile.relPath)\n\t\ttry {\n\t\t\tlet data = JSON.parse(defData)\n\t\t\tbase += this.getSelectedUrlExtFromMeta(data)\n\t\t}\n\t\tcatch(e) {\n\n\t\t}\n\t}\n\t\n\treturn base\n\n}\n\nexport function getSelectedUrlExtFromMeta(data) {\n\tlet url = ''\n\tlet sizes = data.displaySize.split('x')\n\turl += `#format=webp2x&width=${sizes[0]}&height=${sizes[1]}`\n\t\n\tif(data.altText) {\n\t\turl += '&alt=' + encodeURIComponent(data.altText)\n\t}\n\t\n\treturn url\n}\n","\n/**\n * \n * @param {File,string} file \n */\nexport default function baseImageName(file) {\n\tlet name\n\tif(typeof file === 'string') {\n\t\tname = file\n\t}\n\telse if(file instanceof File) {\n\t\tname = file.name\n\t}\n\t\n\tlet parts = name.split('.')\n\t\n\tif(parts.length > 1) {\n\t\tparts.pop()\n\t}\n\tname = parts.join('.')\n\tname = name.replace(/-@2x$/, '')\n\tname = name.replace(/@2x$/, '')\n\tname = name.replace(/-2x$/, '')\n\tname = name.replace(/2x$/, '')\n\n\tlet chars = [name.substring(0, 1)]\n\tfor(let char of name.substring(1)) {\n\t\tif(char.match(/[A-Z]/)) {\n\t\t\tchars.push('-')\n\t\t}\n\t\tchars.push(char)\n\t}\n\tname = chars.join('')\n\n\tname = name.toLowerCase()\n\tname = name.replace(/[^1234567890a-z-]/g, '-')\n\tname = name.replace(/--+/g, '-')\n\t\n\n\treturn name\n}","\n/**\n * Takes data, perhaps even an image, and resolves to a fully \n * loaded image.\n * @param {Blob,ArrayBuffer,string,Image} data \n */\nexport default async function dataToImage(data) {\n\treturn new Promise((resolve, reject) => {\n\t\tlet finalImage\n\t\tlet objectUrl\n\t\tif (data instanceof Image) {\n\t\t\tfinalImage = data\n\t\t}\n\t\telse if (typeof data === 'string') {\n\t\t\tfinalImage = new Image();\n\t\t\tfinalImage.src = data;\n\t\t}\n\t\t// ArrayBuffer.isView(data) might be true or could be a Blob or File\n\t\telse {\n\t\t\t// let's make a blob first. This works if it's an ArrayBuffer of a Blob\n\t\t\tlet imageBlob = new Blob([data])\n\t\t\tobjectUrl = URL.createObjectURL(imageBlob)\n\n\t\t\tfinalImage = new Image()\n\t\t\tfinalImage.src = objectUrl\n\t\t}\n\n\t\tfunction finish() {\n\t\t\tif (objectUrl) {\n\t\t\t\tURL.revokeObjectURL(objectUrl)\n\t\t\t}\n\t\t\tresolve(finalImage)\n\t\t}\n\t\tif (finalImage.complete) {\n\t\t\tfinish()\n\t\t}\n\t\telse {\n\t\t\t// we'll have to wait till it's loaded\n\t\t\tfinalImage.addEventListener('load', () => {\n\t\t\t\tfinish()\n\t\t\t})\n\t\t}\n\t})\n\n}","import dataToImage from \"./data-to-image.mjs\"\n\n/*image, base64 encoded data of image, blob, file, or arraybuffer */\nexport default async function resizeImage(imageData,\n\t{ maxWidth = 1920, quality = .7, outputFormat = \"image/png\" } = {}) {\n\treturn new Promise(async (resolve, reject) => {\n\n\t\ttry {\n\t\t\tlet resizeImg = await dataToImage(imageData)\n\t\t\tlet ratio = resizeImg.naturalWidth / maxWidth\n\t\t\tlet maxHeight = resizeImg.naturalHeight / ratio\n\n\t\t\tvar resizeCanvas = document.createElement('canvas');\n\t\t\tresizeCanvas.width = maxWidth;\n\t\t\tresizeCanvas.height = maxHeight;\n\n\t\t\tvar ctx = resizeCanvas.getContext('2d');\n\t\t\tctx.clearRect(0, 0, resizeCanvas.width, resizeCanvas.height);\n\t\t\tctx.drawImage(resizeImg, 0, 0, resizeCanvas.width, resizeCanvas.height);\n\n\n\t\t\tresizeCanvas.toBlob((blob) => {\n\t\t\t\tresolve(blob)\n\t\t\t}, outputFormat, quality);\n\t\t} catch (e) {\n\t\t\tif (console && console.log) {\n\t\t\t\tconsole.log('error resizing image: ' + e);\n\t\t\t}\n\t\t\treject(e)\n\t\t}\n\t})\n}\n","import dataToImage from \"./data-to-image.mjs\";\n\nexport default async function getImageStats(data) {\n\tlet img = await dataToImage(data)\n\treturn {\n\t\twidth: img.naturalWidth\n\t\t, height: img.naturalHeight\n\n\t}\n\n}","\nlet types = {\n\t\"image/png\": \"png\"\n\t, \"image/jpeg\": \"jpg\"\n\t, \"image/jpg\": \"jpg\"\n\t, \"image/webp\": \"webp\"\n}\n\n\nexport default function getExtension(mime) {\n\tif (mime in types) {\n\t\treturn types[mime]\n\t}\n\n\tlet ext = mime.split('/').pop()\n\treturn ext\n}\n","import resizeImage from '../client-lib/image-resize.mjs'\nimport dataToImage from '../client-lib/data-to-image.mjs'\nimport getImageStats from '../client-lib/get-image-stats.mjs'\nimport getExtension from './get-extension-from-mime.mjs'\n\nlet webpMime = 'image/webp'\n\nexport default async function makeImageSet(data,\n\t{ \n\t\tsingleDensityWidth = null\n\t\t, quality = .7\n\t\t, outputFormat = \"image/png\"\n\t\t, doubleDensityInput = true\n\t\t, baseFileName \n\t\t, altText\t\t\n\t} = {}\n) {\n\tlet source = await dataToImage(data)\n\tlet stats = await getImageStats(source)\n\tlet ratio = stats.width / stats.height\n\n\tif (!baseFileName) {\n\t\tbaseFileName = \"\" + (new Date().getTime())\n\t}\n\tif (!singleDensityWidth) {\n\t\tif (doubleDensityInput) {\n\t\t\tsingleDensityWidth = stats.width / 2\n\t\t}\n\t\telse {\n\t\t\tsingleDensityWidth = stats.width\n\t\t}\n\t}\n\tlet doubleDensityWidth = singleDensityWidth * 2\n\n\tlet suffixes = {\n\t\t'-2x': doubleDensityWidth\n\t\t, '': singleDensityWidth\n\t\t, '-half': Math.floor(singleDensityWidth / 2)\n\t\t, '-quarter': Math.floor(singleDensityWidth / 4)\n\t}\n\n\tlet files = {}\n\n\tfor (let key of Object.keys(suffixes)) {\n\t\tlet width = suffixes[key]\n\t\tlet data = await resizeImage(source, {\n\t\t\tmaxWidth: width\n\t\t\t, quality: quality\n\t\t\t, outputFormat: outputFormat\n\t\t})\n\t\tfiles[baseFileName + key + '.' + getExtension(outputFormat)] = data\n\n\t\tdata = await resizeImage(source, {\n\t\t\tmaxWidth: width\n\t\t\t, quality: quality\n\t\t\t, outputFormat: webpMime\n\t\t})\n\t\tfiles[baseFileName + key + '.' + getExtension(webpMime)] = data\n\t}\n\n\n\tlet info = {\n\t\t\"name\": baseFileName,\n\t\t\"size\": doubleDensityWidth + \"x\" + (doubleDensityWidth / ratio),\n\t\t\"displaySize\": singleDensityWidth + \"x\" + (singleDensityWidth / ratio),\n\t\t\"fallback\": getExtension(outputFormat),\n\t\t\"altText\": altText || baseFileName\n\t}\n\t\n\t\n\tfiles[baseFileName + '.json'] = JSON.stringify(info, null, '\\t')\n\n\treturn files\n\n}","import baseImageName from \"./base-image-name.mjs\"\n\n/**\n * \n * @param {File,string} file \n */\nexport default function nameParts(file) {\n\tlet name\n\tif(typeof file === 'string') {\n\t\tname = file\n\t}\n\telse if(file instanceof File) {\n\t\tname = file.name\n\t}\n\t\n\tlet result = [baseImageName(name)]\n\t\n\tlet parts = name.split('.')\n\tif(parts.length > 1) {\n\t\tresult.push(parts.pop())\n\t}\n\t\n\treturn result\n}","import { FormAnswerDialog } from '../form-answer-dialog.mjs'\nimport baseImageName from '../base-image-name.mjs'\nimport makeImageSet from '../make-image-set.mjs'\nimport nameParts from '../name-parts.mjs'\nimport getFileImageStats from '../get-file-image-stats.mjs'\nimport { guidedImageUploadForm, guidedFileUploadForm } from '../../views/load-browser-views.js'\n\n\nexport async function _uploadGuidedImageFile(file) {\n\tlet baseFileName = baseImageName(file)\n\tlet stats = await getFileImageStats(file)\n\n\tlet data = {\n\t\tnativeName: file.name\n\t\t, name: baseFileName\n\t\t, outputFormat: file.type\n\t\t, stats: stats\n\t\t, width: Math.floor(stats.width / 2)\n\t}\n\n\n\tlet dialog = new FormAnswerDialog({\n\t\ttitle: 'Upload File'\n\t\t, body: guidedImageUploadForm(data)\n\t\t, data: data\n\t\t, dialogFrameClass: 'webhandle-file-tree-image-browser'\n\t})\n\tlet prom = dialog.open()\n\tlet result = await prom\n\n\tif (result) {\n\t\tlet makeImageData = {\n\t\t\tbaseFileName: result.name\n\t\t\t, outputFormat: result.outputFormat\n\t\t\t, singleDensityWidth: parseInt(result.width)\n\t\t\t, quality: parseFloat(result.quality)\n\t\t\t, altText: result.altText\n\t\t}\n\n\t\tlet note = this._addPending(file)\n\t\tlet files = await makeImageSet(file, makeImageData)\n\t\tlet meta = JSON.parse(files[baseFileName + '.json'])\n\n\t\tlet mainUrl\n\t\tfor (let fileName of Object.keys(files)) {\n\t\t\tlet path = await this._uploadData(fileName, files[fileName])\n\t\t\tif(fileName === meta.name + '.' + meta.fallback) {\n\t\t\t\tmainUrl = path\n\t\t\t}\n\t\t}\n\n\t\tlet base = this._transformRelativeUrlToPublic(mainUrl)\n\t\t\n\t\tlet ext = this.getSelectedUrlExtFromMeta(meta)\n\t\tbase += ext\n\n\t\tif (note) {\n\t\t\tnote.remove()\n\t\t}\n\n\t\treturn base\n\t}\n}\n\nexport async function _uploadGuidedFile(file) {\n\tlet parts = nameParts(file)\n\n\tlet data = {\n\t\tnativeName: file.name\n\t\t, name: parts.join('.')\n\t}\n\n\n\tlet dialog = new FormAnswerDialog({\n\t\ttitle: 'Upload File'\n\t\t, body: guidedFileUploadForm(data)\n\t\t, data: data\n\t\t, dialogFrameClass: 'webhandle-file-tree-image-browser'\n\t})\n\tlet prom = dialog.open()\n\tlet result = await prom\n\n\tif (result) {\n\t\tlet note = this._addPending(file)\n\n\t\tlet mainUrl = await this._uploadData(result.name, file)\n\t\tlet base = this._transformRelativeUrlToPublic(mainUrl)\n\n\t\tif (note) {\n\t\t\tnote.remove()\n\t\t}\n\t\treturn base\n\t}\n}\n\nexport async function _uploadAutomaticImageFile(file) {\n\tlet note = this._addPending(file)\n\tlet parts = nameParts(file)\n\tlet baseFileName = parts[0]\n\n\tlet files = await makeImageSet(file, {\n\t\tbaseFileName: baseFileName,\n\t\toutputFormat: file.type\n\t})\n\tlet meta = JSON.parse(files[baseFileName + '.json'])\n\n\tlet mainUrl\n\tfor (let fileName of Object.keys(files)) {\n\t\tlet path = await this._uploadData(fileName, files[fileName])\n\t\tif(fileName === meta.name + '.' + meta.fallback) {\n\t\t\tmainUrl = path\n\t\t}\n\t}\n\tlet base = this._transformRelativeUrlToPublic(mainUrl)\n\tlet ext = this.getSelectedUrlExtFromMeta(meta)\n\tbase += ext\n\n\tif (note) {\n\t\tnote.remove()\n\t}\n\treturn base\n}\n\nexport async function uploadFiles(files, { uploadType } = {}) {\n\tlet uploadedAccessUrls = []\n\tfor (let file of files) {\n\n\t\tlet uploaded = false\n\t\tif (uploadType === 'guided' && this._isImageFile(file)) {\n\t\t\tuploaded = await this._uploadGuidedImageFile(file)\n\t\t}\n\t\telse if (uploadType === 'guided') {\n\t\t\tuploaded = await this._uploadGuidedFile(file)\n\t\t}\n\t\telse if (uploadType === 'automatic' && this._isImageFile(file)) {\n\t\t\tuploaded = await this._uploadAutomaticImageFile(file)\n\t\t}\n\t\telse {\n\t\t\tlet note = this._addPending(file)\n\t\t\tlet path\n\t\t\tif (uploadType === 'automatic') {\n\t\t\t\tlet parts = nameParts(file)\n\t\t\t\tpath = await this._uploadData(parts.join('.'), file)\n\t\t\t}\n\t\t\telse {\n\t\t\t\tpath = await this._uploadData(file.name, file)\n\t\t\t}\n\t\t\tuploaded = this._transformRelativeUrlToPublic(path)\n\t\t\t\n\t\t\tif (note) {\n\t\t\t\tnote.remove()\n\t\t\t}\n\t\t}\n\t\tif (this.eventNotificationPanel && uploaded) {\n\t\t\tthis.eventNotificationPanel.addNotification({\n\t\t\t\tmodel: {\n\t\t\t\t\tstatus: 'success',\n\t\t\t\t\theadline: `uploaded ${file.name}`\n\t\t\t\t}\n\t\t\t\t, ttl: 2000\n\t\t\t})\n\t\t}\n\t\tuploadedAccessUrls.push(uploaded)\n\t}\n\tthis.setCurrentNode(this.currentNode)\n\tthis.emitter.emit('upload', {\n\t\ttype: 'upload'\n\t\t, accessUrls: uploadedAccessUrls\n\t})\n\treturn uploadedAccessUrls\n}\n\n\nexport function _uploadFileButton(evt, selected) {\n\tthis.el.querySelector(this.fileUploadSelector).click()\n}\n\nexport async function _uploadFile(evt, selected) {\n\tevt.preventDefault()\n\tlet input = this.el.querySelector(this.fileUploadSelector)\n\tevt.dataTransfer = {\n\t\tfiles: input.files\n\t}\n\tlet files = await this._getFilesFromEvent(evt)\n\tif(files.length > 0) {\n\t\tlet result = this.uploadFiles(files, { uploadType: 'guided' })\n\t\tinput.value = ''\n\t\treturn result\n\t}\n}\n","import dataToImage from './data-to-image.mjs'\nimport getImageStats from './get-image-stats.mjs'\nimport getExtension from './get-extension-from-mime.mjs'\n\n/**\n * \n * @param {File} file \n * @returns \n */\nexport default async function getFileImageStats(file) {\n\tlet source = await dataToImage(file)\n\tlet stats = await getImageStats(source)\n\tstats.ratio = stats.width / stats.height\n\tstats.ext = getExtension(file.type)\n\n\treturn stats\n}","\nexport async function _uploadData(name, data) {\n\tlet path = this.currentNode.file.relPath + '/' + this.sanitizeFileName(name)\n\tawait this.sink.write(path, data)\n\treturn path\n}\n\nexport async function findDirectories() {\n\treturn new Promise((resolve, reject) => {\n\t\tlet results = []\n\t\tlet events = this.sink.find({\n\t\t\tfile: false\n\t\t})\n\t\tevents.on('data', (item) => {\n\t\t\tresults.push(item)\n\t\t})\n\t\tevents.on('done', () => {\n\t\t\tresolve(results)\n\t\t})\n\t})\n}","import { View } from '@webhandle/backbone-view'\nimport { imageBrowserFrame, variantChoiceBox } from '../views/load-browser-views.js'\nimport KalpaTreeOnPage from 'kalpa-tree-on-page'\nimport formatBytes from './format-bytes.mjs'\n\nimport Emitter from '@webhandle/minimal-browser-event-emitter'\n\n// method imports\nimport { deleteFile, deleteDirectory } from './image-browser-view-methods/delete.mjs'\nimport {\n\t_join, _determineParentPath, _fileToKalpaNode, _determineExtensions, _addPending,\n\t_determineSizes, _sortFiles, _compareVariants, sanitizeFileName, _isImageFile, setIfNotSet\n} from './image-browser-view-methods/utils.mjs'\nimport { changeFilesView, changeFilesViewToClass, applyFilter, clearFilter, selectVariant, showVariantDetails, setFolderInfo, cleanFileInfo } from './image-browser-view-methods/view-interactions.mjs'\nimport { getDropCoverSelector, handleDrop, isFileTypeDrag, dragEnter, dragLeave, dragOver, _cleanupDropDone, handlePaste } from './image-browser-view-methods/drag-and-drop.mjs'\nimport { createDirectory } from './image-browser-view-methods/create-directory.mjs'\nimport { createVariantValues, _getFilesFromEvent, _getAssociatedRealFiles, _createAccessUrl, escapeAccessUrl,\n\tgetSelectedFiles, _transformRelativeUrlToPublic, getSelectedUrl, getSelectedUrlExtFromMeta } from './image-browser-view-methods/file-obj-manipulation.mjs'\nimport { _uploadGuidedImageFile, _uploadGuidedFile, _uploadAutomaticImageFile, uploadFiles, _uploadFileButton, _uploadFile } from './image-browser-view-methods/upload.mjs'\nimport { _uploadData, findDirectories } from './image-browser-view-methods/sink.mjs'\n\n\nexport default class ImageBrowserView extends View {\n\t/**\n\t * Construct a new file browser\n\t * @param {object} options \n\t * @param {FileSink} options.sink The file to use as a file source\n\t * @param {boolean} [options.imagesOnly] Set to true if you would like to display only images\n\t * @param {boolean} [options.allowFileSelection] Set to true so that selected files are marked\n\t * @param {EventNotificationPanel} [options.eventNotificationPanel] The panel which status messages will be added to.\n\t * @param {string} [options.startingDirectory] Opens to that directory path if it exists\n\t * @param {boolean} [options.deleteWithoutConfirm] False by default\n\t * @param {boolean} [options.ignoreGlobalEvents] False by default, if true it will not listen to events like paste or keypresses\n\t * which occur on the document\n\t * @param {Emitter} [options.emitter] Emitter for various file events\n\t * @param {int} [options.listTriggerSize] If the number of items are over this limit, they are shown as a plain list by default\n\t * @param {int} [options.listLockSize] If the number of items are over this limit, they can't use anyting other than the plain list\n\t */\n\tconstructor(options) {\n\t\tsuper(options)\n\t\tthis.setIfNotSet('overCount', 0)\n\t\tthis.setIfNotSet('emitter', new Emitter())\n\t\tthis.setIfNotSet('fileUploadSelector', 'input[name=\"fileUpload\"]')\n\t\tthis.setIfNotSet('listTriggerSize', 100)\n\t\tthis.setIfNotSet('listLockSize', 200)\n\t}\n\n\tpreinitialize() {\n\t\tthis.className = 'image-browser'\n\t\tthis.idInd = 1\n\t\tthis.nodes = {}\n\t\tthis.events = {\n\t\t\t'click .create-directory': 'createDirectory'\n\t\t\t, 'click .upload-file': '_uploadFileButton'\n\t\t\t, 'change [name=\"fileUpload\"]': '_uploadFile'\n\t\t\t, 'click .delete-file': 'deleteFile'\n\t\t\t, 'click .delete-directory': 'deleteDirectory'\n\t\t\t, 'click .variant-choice-box .details': 'showVariantDetails'\n\t\t\t, 'dblclick .variant-choice-box': 'showVariantDetails'\n\t\t\t, 'click .variant-choice-box': 'selectVariant'\n\t\t\t, 'click .view-icons button': 'changeFilesView'\n\t\t\t, 'keyup [name=\"filter\"]': 'applyFilter'\n\t\t\t, 'change [name=\"filter\"]': 'applyFilter'\n\t\t\t, 'click .clear-filter': 'clearFilter'\n\t\t\t, 'dragenter .': 'dragEnter'\n\t\t\t, 'dragleave .': 'dragLeave'\n\t\t\t, 'dragover .': 'dragOver'\n\t\t\t, 'drop .': 'handleDrop'\n\t\t}\n\t\tdocument.addEventListener('paste', handlePaste.bind(this))\n\t}\n\t\n\t\n\n\tasync render() {\n\t\tthis.el.innerHTML = imageBrowserFrame(this.model)\n\t\tthis.data = []\n\n\t\tthis.rootDirectory = await this.sink.getFullFileInfo('')\n\t\tthis.rootDirectory.name = \"Files\"\n\t\tlet rootNode = this.rootNode = this._fileToKalpaNode(this.rootDirectory)\n\t\tthis.data.push(rootNode)\n\n\t\tlet directories = await this.findDirectories()\n\t\tthis._sortFiles(directories)\n\n\t\tthis.data.push(...directories.map(this._fileToKalpaNode.bind(this)))\n\t\tKalpaTreeOnPage({\n\t\t\ttreeContainerSelector: `#${this.id} .treebox`\n\t\t\t, data: this.data\n\t\t}).then(tree => {\n\t\t\tthis.tree = tree\n\t\t\ttree.on('select', (node) => {\n\t\t\t\tthis.setCurrentNode(node)\n\t\t\t})\n\t\t\ttree.on('selected', (node) => {\n\t\t\t\t// There's a bug, either in the browser or kalpa tree that causes it\n\t\t\t\t// not to examine if a scroll bar is needed for the tree if the content\n\t\t\t\t// area changes in a big way. Part of this bug may be that it's being\n\t\t\t\t// used in a grid which has some weird width/height effects\n\t\t\t\t// Anyway, we need to make sure the browser knows to examine the tree so\n\t\t\t\t// we change the height then change it back.\n\t\t\t\t// This event is triggered when kalpa-tree thinks it's done with transitions\n\n\t\t\t\tlet tree = this.el.querySelector('.tree')\n\t\t\t\ttree.style.height = '99.99999%'\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\ttree.style.height = '100%'\n\t\t\t\t}, 100)\n\t\t\t})\n\t\t\tif (this.startingDirectory) {\n\t\t\t\tfor (let node of Object.values(this.tree.nodes)) {\n\t\t\t\t\tif (node.file && node.file.relPath && node.file.relPath == this.startingDirectory) {\n\t\t\t\t\t\ttree.select(node.id)\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\ttree.select(1)\n\t\t\t}\n\t\t})\n\t}\n\n\tasync setCurrentNode(node) {\n\t\tthis.currentNode = node\n\t\tthis.cleanFileInfo()\n\t\tlet choicesBoxes = this.el.querySelector('.choice-boxes')\n\t\tlet info = await this.sink.getFullFileInfo(node.file.relPath)\n\t\tlet variantValues = this.createVariantValues(info)\n\n\n\t\tif(variantValues.length > this.listTriggerSize) {\n\t\t\tthis.changeFilesViewToClass('list-text')\n\t\t}\t\n\n\t\tlet content = ''\n\t\tfor (let child of variantValues) {\n\t\t\tcontent += variantChoiceBox(child)\n\t\t}\n\n\n\t\tchoicesBoxes.innerHTML = ''\n\t\tchoicesBoxes.insertAdjacentHTML('beforeend', content)\n\n\t\tfor (let i = 0; i < choicesBoxes.children.length; i++) {\n\t\t\tchoicesBoxes.children[i].variant = variantValues[i]\n\t\t}\n\t\tthis.el.querySelector('.box-holder').scrollTop = 0\n\t\tthis.applyFilter()\n\t}\n\n\t// uploads\n\t_uploadGuidedImageFile = _uploadGuidedImageFile\n\t_uploadGuidedFile = _uploadGuidedFile\n\t_uploadAutomaticImageFile = _uploadAutomaticImageFile\n\tuploadFiles = uploadFiles\n\t_uploadFileButton = _uploadFileButton\n\t_uploadFile = _uploadFile\n\n\t// file-obj-manipulation\n\tcreateVariantValues = createVariantValues\n\t_getFilesFromEvent = _getFilesFromEvent\n\t_getAssociatedRealFiles = _getAssociatedRealFiles\n\t_createAccessUrl = _createAccessUrl\n\tescapeAccessUrl = escapeAccessUrl\n\tgetSelectedFiles = getSelectedFiles\n\t_transformRelativeUrlToPublic = _transformRelativeUrlToPublic\n\tgetSelectedUrl = getSelectedUrl\n\tgetSelectedUrlExtFromMeta = getSelectedUrlExtFromMeta\n\n\t// create-directory \n\tcreateDirectory = createDirectory\n\n\t// drag-and-drop\n\tgetDropCoverSelector = getDropCoverSelector\n\thandleDrop = handleDrop\n\tisFileTypeDrag = isFileTypeDrag\n\tdragEnter = dragEnter\n\tdragLeave = dragLeave\n\tdragOver = dragOver\n\thandlePaste = handlePaste\n\t_cleanupDropDone = _cleanupDropDone\n\n\t// view-interactions\n\tchangeFilesView = changeFilesView\n\tchangeFilesViewToClass = changeFilesViewToClass\n\tapplyFilter = applyFilter\n\tclearFilter = clearFilter\n\tselectVariant = selectVariant\n\tshowVariantDetails = showVariantDetails\n\tsetFolderInfo = setFolderInfo\n\tcleanFileInfo = cleanFileInfo\n\n\t// utils\n\tsanitizeFileName = sanitizeFileName\n\t_sortFiles = _sortFiles\n\t_compareVariants = _compareVariants\n\t_determineExtensions = _determineExtensions\n\t_determineSizes = _determineSizes\n\t_join = _join\n\t_determineParentPath = _determineParentPath\n\t_fileToKalpaNode = _fileToKalpaNode\n\t_formatBytes = formatBytes\n\t_isImageFile = _isImageFile\n\tsetIfNotSet = setIfNotSet\n\t_addPending = _addPending\n\n\t// delete\n\tdeleteFile = deleteFile\n\tdeleteDirectory = deleteDirectory\n\n\t// sink\n\t_uploadData = _uploadData\n\tfindDirectories = findDirectories\n\n}\n","import ibv from './image-browser-view.mjs';\nimport { FileSelectDialog as fsd } from './file-select-dialog.mjs'\n\nimport ls from './load-styles.mjs'\n\n\n\nexport let ImageBrowserView = ibv\nexport let FileSelectDialog = fsd\nexport let loadStyles = ls\n\nif(typeof window !== 'undefined') {\n\twindow['@webhandle/tree-file-browser'] = {\n\t\tImageBrowserView\n\t\t, FileSelectDialog\n\t\t, loadStyles\n\t}\n}\nexport default ImageBrowserView\n\n\n","import Dialog from 'ei-dialog'\nimport ImageBrowserView from './image-browser-view.mjs'\n\n/**\n * Selects a file.\n * @param {Object} [options]\n * @param {string} [options.title] The dialog box title\n * @param {boolean} [options.chooseOnUpload] If true, uploading a file causes the dialog to close and the URL of uploaded\n * file to be returned\n */\nexport class FileSelectDialog extends Dialog {\n\tconstructor(options) {\n\t\tsuper(Object.assign({\n\t\t\ttitle: 'Select A File'\n\t\t\t, body: `<div class=\"webhandle-file-tree-image-browser\" style=\"width: 87vw;\"> </div>`\n\t\t\t, afterOpen: function (bodyElement, dialog) {\n\n\t\t\t\tlet treeHolder = bodyElement.querySelector('.webhandle-file-tree-image-browser')\n\t\t\t\tif (treeHolder) {\n\t\t\t\t\tlet options = {\n\t\t\t\t\t\tsink: dialog.sink\n\t\t\t\t\t\t, imagesOnly: dialog.imagesOnly\n\t\t\t\t\t\t, eventNotificationPanel: dialog.eventNotificationPanel\n\t\t\t\t\t\t, startingDirectory: dialog.startingDirectory\n\t\t\t\t\t\t, deleteWithoutConfirm: dialog.deleteWithoutConfirm\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tlet imageBrowserView = this.imageBrowserView = new ImageBrowserView(options)\n\t\t\t\t\tif(dialog._createAccessUrl) {\n\t\t\t\t\t\timageBrowserView._createAccessUrl = dialog._createAccessUrl\n\t\t\t\t\t}\n\t\t\t\t\tif(dialog._transformRelativeUrlToPublic) {\n\t\t\t\t\t\timageBrowserView._transformRelativeUrlToPublic = dialog._transformRelativeUrlToPublic\n\t\t\t\t\t}\n\t\t\t\t\timageBrowserView.appendTo(treeHolder)\n\t\t\t\t\timageBrowserView.render()\n\n\t\t\t\t\timageBrowserView.emitter.on('select', async function (evt) {\n\n\t\t\t\t\t})\n\t\t\t\t\timageBrowserView.emitter.on('upload', async function (evt) {\n\t\t\t\t\t\tif(dialog.chooseOnUpload) {\n\t\t\t\t\t\t\tdialog.close()\n\t\t\t\t\t\t\tdialog.resolve({\n\t\t\t\t\t\t\t\turl: evt.accessUrls[0]\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t}\n\t\t\t, chooseOnUpload: true\n\t\t}, options,\n\t\t\t{\n\t\t\t\ton: {\n\t\t\t\t\t'.btn-ok': async () => {\n\t\t\t\t\t\tlet result = {\n\t\t\t\t\t\t\tselection: this.imageBrowserView.getSelectedFiles()\n\t\t\t\t\t\t}\n\t\t\t\t\t\tresult.url = await this.imageBrowserView.getSelectedUrl(result.selection)\n\t\t\t\t\t\tthis.resolve(result)\n\n\t\t\t\t\t\treturn true\n\t\t\t\t\t},\n\t\t\t\t\t'.mask': () => {\n\t\t\t\t\t\tthis.resolve()\n\t\t\t\t\t\treturn true\n\t\t\t\t\t},\n\t\t\t\t\t'.btn-cancel': () => {\n\t\t\t\t\t\tthis.resolve()\n\t\t\t\t\t\treturn true\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t))\n\t}\n\n\tasync open() {\n\t\tthis.promise = new Promise((resolve, reject) => {\n\t\t\tthis.resolve = resolve\n\t\t\tthis.reject = reject\n\t\t})\n\t\tsuper.open()\n\n\t\treturn this.promise\n\t}\n}","import areStylesLoaded from \"./styles-loaded.mjs\";\nimport ensureIcons from '@dankolz/webhandle-admin-icons/client-js/ensure-styles-are-loaded.js'\n\nexport default function loadStyles() {\n\tif(!areStylesLoaded()) {\n\t\tlet link = document.createElement('link')\n\t\tlink.href = '/@webhandle/tree-file-browser/resources/css/tree-browser.css'\n\t\tlink.rel = 'stylesheet'\n\t\tdocument.head.appendChild(link)\n\t\t\n\t}\n\tensureIcons()\n\n}","\n/**\n * Returns true if the styles for the image browser have been loaded\n */\nexport default function areStylesLoaded() {\n\tlet d = document.createElement('div')\n\td.classList.add('webhandle-file-tree-image-browser-test')\n\t\n\td.style.position = 'absolute'\n\td.style.left = '-10000px'\n\t\n\t\n\tdocument.body.appendChild(d)\n\tlet color = window.getComputedStyle(d)['background-color'] \n\td.remove()\n\n\treturn color === 'rgb(101, 105, 99)'\n}"],"names":["module","exports","s","preserveCR","replace","test","d","document","createElement","classList","add","body","appendChild","window","getComputedStyle","content","indexOf","head","insertAdjacentHTML","remove","addEventListener","imageExtensions","smallerSizeExt","imageSizeExt","findPreviewVariant","isFileImage","makeVariantImage","fileBasename","findPrimaryVariant","setSpecialVariants","variantDefinition","preview","variants","primary","directoryContents","files","filter","child","directory","definitions","name","toLowerCase","endsWith","imageFiles","getVariant","baseName","variant","definition","definitionFile","imageVariant","map","push","Array","from","Object","keys","length","values","forEach","substring","lastIndexOf","size","img","ext","fallbackSizeExt","fallbackImgageExtensions","item","nameLower","isFileImageName","file","info","noExt","sizeString","dialogStyles","sequence","default","Dialog","options","this","id","Date","getTime","assign","on","buttons","classes","label","prototype","getBodySelector","getFrameSelector","addStylesIfNeeded","querySelector","renderButton","button","generateFrame","join","dialogFrameClass","title","open","self","bodyContent","bodySelector","frameSelector","bodyElement","frameElement","afterOpenResizeSetup","setTimeout","topAndBottom","clientHeight","style","maxHeight","afterOpen","evt","selector","target","result","close","Promise","then","inputInjector","textareaInjector","selectInjector","text","makeDate","date","pad","value","len","formatDate","getFullYear","getMonth","getDate","formatTime","hour","getHours","minute","getMinutes","getSeconds","getMilliseconds","nameAttrPattern","valAttrPattern","typeAttrPattern","inputPattern","checkedAttrPattern","attributeEscapes","evalFunction","Function","fetchValue","obj","path","call","context","expression","isOrContains","possible","isArray","includes","split","r","match","type","replacementText","newVal","orgValue","e","newValue","attr","key","entries","escapeAttributeValue","slice","Streamish","serializeTreeNodes","serializeANode","icons","loadedStyles","async","plan","treeContainerSelector","stream","loadStyles","styleLocation","scriptLocation","data","resolve","reject","KalpaTree","ckscript","setAttribute","onload","loadKalpaTree","tree","Tree","accessors","icon","initialSelection","console","log","node","newParent","previousParent","newIndex","prevIndex","parentId","serializeTree","root","serialize","get","JSON","stringify","render","el","emit","rootId","children","constructor","handles","handle","args","apply","selectPattern","selectedAttrPattern","optionMatch","RegExp","val","breakIndex","textareaPattern","startTagEnd","endTagStart","conditionalExpression","dataExpression","handlingExpression","tripartite","parentPath","currentPath","pparts","cparts","shift","pop","resolveDataPath","_evaluateInContext","dataFunctions","globalData","trim","resolved","ActiveElement","calculateRelativePath","evaluateInContext","template","destination","initialData","currentData","continueOnTripartiteError","callCount","callDepthLimit","run","callback","ourCallback","_run","_resolveHandlingExpression","defaultTemplateName","charAt","templateMeta","parts","reverse","processParts","part","output","resultData","conditional","conditionalResult","undefined","handlingTemplate","applyTemplate","templates","getTemplate","loadTemplate","msg","error","err","Error","write","isStream","pipe","String","ExecutionContext","Tripartite","defaultTemplate","_makeTemplate","thedata","constants","templateBoundary","templateNameBoundary","secondaryTemplateFunctionObject","loaders","dataFunction","transformationFunction","tri","f","i","arguments","arg","addTemplate","parseTemplate","createBlank","count","done","loader","parseTemplateScript","tx","tks","tokenizeTemplateScript","ctn","token","active","stripTemplateWhitespace","txt","_createActiveElement","cd","hd","pt","tokenizeTemplate","t","tk","tokenizeActivePart","con","dat","han","ci","hi","tokenizeActiveAndInactiveBlocks","boundary","position","act","tokens","tripartiteInstance","g","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","o","defineProperty","enumerable","globalThis","prop","hasOwnProperty","Symbol","toStringTag","eventEntryMapper","event","handler","defaultOptions","tagName","events","View","array","Uint8Array","crypto","getRandomValues","btoa","generateId","preinitialize","_ensureElement","initialize","parentElement","removeChild","appendTo","container","replaceContentsOf","innerHTML","setElement","_addListeners","_createElement","view","_setAttributes","className","attributes","eventTriggers","eventNames","reduce","acc","trigger","Set","eventName","_eventHandler","bind","_getCandidates","querySelectorAll","candidates","found","candidate","contains","imageBrowserFrame","variantChoiceBox","guidedImageUploadForm","guidedFileUploadForm","formatBytes","bytes","decimals","dm","Math","floor","parseFloat","pow","toFixed","Emitter","base","EventTarget","super","innerEventTarget","listener","nativeListener","detail","dispatchEvent","CustomEvent","removeListener","removeEventListener","func","FormAnswerDialog","gatherData","afterOpenOriginal","firstInput","focus","formBody","controls","control","checked","getAttribute","gatherFormData","promise","deleteFile","selected","sel","getSelectedFiles","names","deleteWithoutConfirm","prom","note","relPath","eventNotificationPanel","addNotification","model","status","headline","sink","rm","ttl","boxes","emitter","deleteDirectory","currentNode","recursive","curSelected","parent","removeNode","select","_join","_determineParentPath","_fileToKalpaNode","idInd","loaded","nodes","_determineExtensions","extensions","imgVariant","sort","a","b","localeCompare","_determineSizes","min","max","stat","_sortFiles","one","two","_compareVariants","sanitizeFileName","_isImageFile","startsWith","setIfNotSet","_addPending","InfoDialog","changeFilesView","changeFilesViewToClass","choiceBoxes","applyFilter","allVariants","setFolderInfo","clearFilter","selectVariant","currentSelected","ctrlKey","shiftKey","cur","previousElementSibling","toggle","showVariantDetails","closest","_getAssociatedRealFiles","safeThumbnail","escapeAccessUrl","accessUrl","_formatBytes","fileCount","variantCount","byteCount","nonImages","listTriggerSize","listLockSize","cleanFileInfo","getDropCoverSelector","handleDrop","uploadType","dropSquare","_cleanupDropDone","preventDefault","_getFilesFromEvent","uploadFiles","isFileTypeDrag","fileType","dataTransfer","items","kind","dragEnter","overCount","dragLeave","dragOver","cover","handlePaste","ignoreGlobalEvents","clipboardData","createDirectory","directoryPath","mkdir","getFullFileInfo","expand","addSoftBreaks","chars","chrs","c","breakOnChars","createVariantValues","variantValues","used","remainingChildren","thumbnailIcon","thumbnail","_createAccessUrl","imagesOnly","sizes","safeBaseName","foundItems","webkitGetAsEntry","entry","isDirectory","getAsFile","File","url","encodeURIComponent","urlEscapeChars","_transformRelativeUrlToPublic","getSelectedUrl","selectedFiles","chosen","defData","read","parse","getSelectedUrlExtFromMeta","displaySize","altText","baseImageName","char","dataToImage","finalImage","objectUrl","Image","src","imageBlob","Blob","URL","createObjectURL","finish","revokeObjectURL","complete","resizeImage","imageData","maxWidth","quality","outputFormat","resizeImg","ratio","naturalWidth","naturalHeight","resizeCanvas","width","height","ctx","getContext","clearRect","drawImage","toBlob","blob","getImageStats","types","getExtension","mime","webpMime","makeImageSet","singleDensityWidth","doubleDensityInput","baseFileName","source","stats","doubleDensityWidth","suffixes","nameParts","_uploadGuidedImageFile","getFileImageStats","nativeName","mainUrl","makeImageData","parseInt","meta","fileName","_uploadData","fallback","_uploadGuidedFile","_uploadAutomaticImageFile","uploadedAccessUrls","uploaded","setCurrentNode","accessUrls","_uploadFileButton","fileUploadSelector","click","_uploadFile","input","findDirectories","results","find","ImageBrowserView","rootDirectory","rootNode","directories","startingDirectory","choicesBoxes","scrollTop","dialog","treeHolder","imageBrowserView","chooseOnUpload","selection","left","color","areStylesLoaded","link","href","rel","FileSelectDialog"],"sourceRoot":""}
|
|
1
|
+
{"version":3,"file":"tree-file-browser.js","mappings":"eAYAA,EAAOC,QAZP,SAAkCC,EAAGC,GAEjC,OADAA,EAAaA,EAAa,QAAU,MAC5B,GAAKD,GACRE,QAAQ,KAAM,SACdA,QAAQ,KAAM,UACdA,QAAQ,KAAM,UACdA,QAAQ,KAAM,QACdA,QAAQ,KAAM,QACdA,QAAQ,QAASD,GACjBC,QAAQ,UAAWD,EAC5B,C,UCWAH,EAAOC,QApBP,WACC,SAASI,IACR,IAAIC,EAAIC,SAASC,cAAc,OAC/BF,EAAEG,UAAUC,IAAI,gCAChBH,SAASI,KAAKC,YAAYN,GACZO,OAAOC,iBAAiBR,GAAGS,QAE9BC,QAAQ,UAAY,GAC9BT,SAASU,KAAKC,mBAAmB,YAAa,gGAE/CZ,EAAEa,QACH,CACGZ,SAASI,KACXN,IAGAE,SAASa,iBAAiB,mBAAoBf,EAEhD,C,gBCnBA,IAAI,gBAACgB,EAAe,eAAEC,EAAc,aAAEC,GAAgB,EAAQ,KAC9D,MAAMC,EAAqB,EAAQ,IAC7BC,EAAc,EAAQ,KACtBC,EAAmB,EAAQ,IAC3BC,EAAe,EAAQ,IACvBC,EAAqB,EAAQ,KAyDnC,SAASC,EAAmBC,GAC3B,IAAIC,EAAUP,EAAmBM,EAAkBE,UACnDF,EAAkBC,QAAUA,EAE5B,IAAIE,EAAUL,EAAmBE,EAAkBE,UACnDF,EAAkBG,QAAUA,CAC7B,CAGAjC,EAAOC,QAtDP,SAA+BiC,GAC9B,IAAIC,EAAQD,EAAkBE,QAAOC,IAAUA,EAAMC,YACjDC,EAAcJ,EAAMC,QAAOC,GAASA,EAAMG,KAAKC,cAAcC,SAAS,WACtEC,EAAaR,EAAMC,OAAOX,GAE1BO,EAAW,CAAC,EAChB,SAASY,EAAWC,GACnB,GAAIA,KAAYb,EACf,OAAOA,EAASa,GAEjB,IAAIC,EAAU,CACbD,SAAUA,EACRb,SAAU,IAGb,OADAA,EAASa,GAAYC,EACdA,CACR,CAIA,IAAK,IAAIC,KAAcR,EAERK,EADCjB,EAAaoB,EAAWP,OAE/BQ,eAAiBD,EAI1B,IAAI,IAAIE,KAAgBN,EAAWO,IAAIxB,GACxBkB,EAAWK,EAAaJ,UAC9Bb,SAASmB,KAAKF,GAIvB,IAAI,IAAIJ,KAAYO,MAAMC,KAAKC,OAAOC,KAAKvB,IACD,GAAtCA,EAASa,GAAUb,SAASwB,eACvBxB,EAASa,GAOlB,OAFAS,OAAOG,OAAOzB,GAAU0B,QAAQ7B,GAEzBG,CACR,C,UC5DA,IAAIO,EAAc,CACjBlB,gBAAiB,CAAC,MAAO,OAAQ,MAAO,MAAO,OAAQ,QACrDC,eAAgB,CAAC,UAAW,SAE/BiB,EAAYhB,aAAe,IAAIgB,EAAYjB,eAAgB,MAAO,MAElEtB,EAAOC,QAAUsC,C,SCDjBvC,EAAOC,QAJP,SAAsBuC,GACrB,OAAOA,EAAKmB,UAAU,EAAGnB,EAAKoB,YAAY,KAC3C,C,eCHA,IAAI,gBAACvC,EAAe,eAAEC,EAAc,aAAEC,GAAgB,EAAQ,KAc9DvB,EAAOC,QAZP,SAA4B+B,GAC3B,IAAI,IAAI6B,KAAQtC,EACf,IAAI,IAAIuC,KAAOzC,EACd,IAAI,IAAIyB,KAAWd,EAClB,GAAGc,EAAQe,MAAQA,GAAQf,EAAQiB,KAAOD,EACzC,OAAOhB,CAKZ,C,gBCZA,IAAI,gBAACzB,EAAe,eAAEC,EAAc,aAAEC,GAAgB,EAAQ,KAE1DyC,EAAkB,CAAC,MAAO,QAAS1C,GACnC2C,EAA2B5C,EAAgBe,QAAO8B,GAAgB,QAARA,IAc9DlE,EAAOC,QAZP,SAA4B+B,GAC3B,IAAI,IAAI6B,KAAQG,EACf,IAAI,IAAIF,KAAOG,EACd,IAAI,IAAInB,KAAWd,EAClB,GAAGc,EAAQe,MAAQA,GAAQf,EAAQiB,KAAOD,EACzC,OAAOhB,CAKZ,C,gBCdA,IAAI,gBAACzB,EAAe,eAAEC,EAAc,aAAEC,GAAgB,EAAQ,KAY9DvB,EAAOC,QAVP,SAAyBuC,GACxB,IAAI2B,EAAY3B,EAAKC,cACrB,IAAK,IAAIsB,KAAO1C,EACf,GAAI8C,EAAUzB,SAAS,IAAMqB,GAC5B,OAAO,EAGT,OAAO,CACR,C,gBCXA,MAAMK,EAAkB,EAAQ,KAMhCpE,EAAOC,QAJP,SAAqBoE,GACpB,OAAOD,EAAgBC,EAAK7B,KAC7B,C,eCJA,IAAI,gBAACnB,EAAe,eAAEC,EAAc,aAAEC,GAAgB,EAAQ,KAuB9DvB,EAAOC,QArBP,SAA0BoE,GACzB,IAAIC,EAAO,CACVT,KAAM,MACJQ,KAAMA,GAEL7B,EAAO6B,EAAK7B,KAEhB8B,EAAKP,IAAMvB,EAAKmB,UAAUnB,EAAKoB,YAAY,KAAO,GAClD,IAAIW,EAAQ/B,EAAKmB,UAAU,EAAGnB,EAAKoB,YAAY,MAC/CU,EAAKzB,SAAW0B,EAChB,IAAK,IAAIV,KAAQtC,EAAc,CAC9B,IAAIiD,EAAa,IAAMX,EACvB,GAAIU,EAAM7B,SAAS8B,GAAa,CAC/BF,EAAKT,KAAOA,EACZS,EAAKzB,SAAW0B,EAAMZ,UAAU,EAAGY,EAAMf,OAASgB,EAAWhB,QAC7D,KACD,CACD,CACA,OAAOc,CACR,C,gBCrBA,IAAIG,EAAe,EAAQ,KACvBC,EAAW,EAKY,iBAAjBD,GAA6BA,EAAaE,UACnDF,EAAeA,EAAaE,SAkC7B,IAAIC,EAAS,SAASC,GACrBC,KAAKC,GAAK,UAAY,IAAIC,MAAOC,UAAcP,IAC/CpB,OAAO4B,OAAOJ,KAAMD,GAChBC,KAAKK,KACRL,KAAKK,GAAK,CAAC,GAERL,KAAKK,GAAG,iBACXL,KAAKK,GAAG,eAAiB,WACzB,GAEGL,KAAKK,GAAG,gBACXL,KAAKK,GAAG,cAAgB,WACxB,GAGGN,EAAQO,UACXN,KAAKM,QAAU,CACd,CACCC,QAAS,yBACTC,MAAO,MAER,CACCD,QAAS,iBACTC,MAAO,YAKVR,KAAKnE,KAAOkE,EAAQlE,IACrB,EAEAiE,EAAOW,UAAUC,gBAAkB,WAClC,MAAO,IAAMV,KAAKC,GAAK,QACxB,EAEAH,EAAOW,UAAUE,iBAAmB,WACnC,MAAO,IAAMX,KAAKC,EACnB,EAEAH,EAAOW,UAAUG,kBAAoB,WAChCnF,SAASoF,cAAc,yBAC1BpF,SAASoF,cAAc,QAAQzE,mBAAmB,YACjD,mDACAuD,EACA,WAEH,EAEAG,EAAOW,UAAUK,aAAe,SAASC,GACxC,MAAO,kBAAkBA,EAAOR,0BAA0BQ,EAAOP,gBAClE,EAEAV,EAAOW,UAAUO,cAAgB,WAChC,IAAIV,EAAUN,KAAKM,QAAQlC,IAAI4B,KAAKc,cAAcG,KAAK,IAEvD,MAAO,8BACmBjB,KAAKkB,kBAAoB,WAAWlB,KAAKC,oJAM/DD,KAAKmB,wFAKLb,qCAKL,EAEAR,EAAOW,UAAUW,KAAO,WACvB,IAAIC,EAAOrB,KACXA,KAAKY,oBACLnF,SAASoF,cAAc,QAAQzE,mBAAmB,YAAa4D,KAAKgB,iBAEpE,IAGIM,EAHAC,EAAevB,KAAKU,kBACpBc,EAAgBxB,KAAKW,mBAGrBc,EAAchG,SAASoF,cAAcU,GACrCG,EAAejG,SAASoF,cAAcW,GA8B1C,SAASG,IACRC,YAAW,WACV,IAEIC,EAFOpG,SAASoF,cAAcW,EAAgB,UAAUM,aACjDrG,SAASoF,cAAcW,EAAgB,UAAUM,aAG5DL,EAAYM,MAAMC,UAAY,eAAiBH,EAAe,MAC9DH,EAAa/F,UAAUC,IAAI,QAExByF,EAAKY,WACPZ,EAAKY,UAAUR,EAAaJ,EAE9B,GACD,CAqBA,OA5DAK,EAAapF,iBAAiB,SAAS,SAAS4F,GAC/C,IAAI,IAAIC,KAAYd,EAAKhB,GAAI,CAC5B,IAAI+B,EAASV,EAAab,cAAcsB,GACxC,GAAGD,EAAIE,QAAUA,EAAQ,CACxB,IAAIC,EAAShB,EAAKhB,GAAG8B,KACA,kBAAXE,EACNA,GACFhB,EAAKiB,QAGoB,mBAAZC,SAA0BF,aAAkBE,QAC1DF,EAAOG,MAAK,SAASH,IACN,IAAXA,GACFhB,EAAKiB,OAEP,IAGAjB,EAAKiB,QAGN,KACD,CACD,CACD,IAiBwB,mBAAdtC,KAAKnE,KACdyF,EAActB,KAAKnE,KAAK4F,EAAazB,MAEV,iBAAbA,KAAKnE,OACnByF,EAActB,KAAKnE,MAGM,iBAAhByF,GACTG,EAAYrF,mBAAmB,YAAakF,GAC5CK,KAE0B,mBAAZY,SAA0BjB,aAAuBiB,SAC/DjB,EAAYkB,MAAK,SAASvG,GACzBwF,EAAYrF,mBAAmB,YAAaH,GAC5C0F,GACD,IAIM3B,IACR,EAEAF,EAAOW,UAAU6B,MAAQ,WAGxB,OAFY7G,SAASoF,cAAcb,KAAKW,oBAClCtE,SACC2D,IACR,EAEA9E,EAAOC,QAAU2E,C,eCrMjB,MAAM2C,EAAgB,EAAQ,KACxBC,EAAmB,EAAQ,KAC3BC,EAAiB,EAAQ,KAY/BzH,EAAOC,QAVY,SAASyH,EAAMjE,GAEjC,IAAI0D,EAASI,EAAcG,EAAMjE,GAKjC,OAJA0D,EAASK,EAAiBL,EAAQ1D,GAClC0D,EAASM,EAAeN,EAAQ1D,GAGzB0D,CACR,C,UCZA,SAASQ,EAASC,GACjB,OAAGA,aAAgB5C,KACX4C,EAED,IAAI5C,KAAK4C,EACjB,CAEA,SAASC,EAAIC,EAAOC,EAAKF,GAExB,IADAC,EAAQ,GAAKA,EACPA,EAAMtE,OAASuE,GACpBD,EAAQD,EAAMC,EAEf,OAAOA,CACR,CAEA,SAASE,EAAWJ,GAMnB,MAAO,IALPA,EAAOD,EAASC,IACAK,iBACJJ,EAAID,EAAKM,WAAa,EAAG,EAAG,QAC9BL,EAAID,EAAKO,UAAW,EAAG,MAGlC,CACA,SAASC,EAAWR,GAEnB,IAAIS,EAAOR,GADXD,EAAOD,EAASC,IACIU,WAAY,EAAG,KAC/BC,EAASV,EAAID,EAAKY,aAAc,EAAG,KAGvC,OAFUX,EAAID,EAAKa,aAAc,EAAG,KACxBZ,EAAID,EAAKc,kBAAmB,EAAG,KACpC,GAAGL,KAAQE,GACnB,CAMA,IAAII,EAAkB,wBAClBC,EAAiB,yBACjBC,EAAkB,wBAClBC,EAAe,gBACfC,EAAqB,8BAErBC,EAAmB,CACtB,IAAK,QACH,IAAK,SACL,IAAK,QAgBJC,EAAe,IAAIC,SAAS,OAC/B,4HASD,SAASC,EAAWC,EAAKC,GACxB,OAAOJ,EAAaK,KAAKxE,KAAM,CAC9ByE,QAASH,EACPI,WAAYH,GAEhB,CAEA,SAASI,EAAavC,EAAQwC,GAC7B,OAAGtG,MAAMuG,QAAQD,GACTA,EAASE,SAAS1C,GAGlBA,GAAUwC,CAEnB,CAyMA1J,EAAOC,QAtMY,SAASyH,EAAMjE,GAEjC,IAAI0D,EAAS,GAgMb,OA9LAO,EAAKmC,MAAMf,GAAcpF,SAASQ,IACjC,GAA2C,GAAxCA,EAAKzB,cAAczB,QAAQ,UAAgB,CAC7C,IAAI8I,EAAI5F,EAAK6F,MAAMpB,GACfnG,EAAOsH,EAAIA,EAAE,GAAK,KAEtBA,EAAI5F,EAAK6F,MAAMlB,GACf,IAAImB,GAAQF,EAAIA,EAAE,GAAK,QAAQrH,cAG/B,GAAY,SAATuH,GAA4B,WAATA,GAA8B,SAATA,GAA4B,SAATA,GAA4B,mBAATA,GACrE,WAATA,GAA8B,UAATA,GAA6B,WAATA,GAA8B,QAATA,GAA2B,QAATA,GACvE,UAATA,GAA6B,SAATA,GAA4B,UAATA,GAA6B,SAATA,EAC5D,CACDF,EAAI5F,EAAK6F,MAAMnB,GACf,IAyCIqB,EAzCAnC,EAAQgC,EAAIA,EAAE,GAAK,KAEnBI,EAASf,EAAW1F,EAAQjB,GAChC,GAAY,SAATwH,GACF,GAAGE,EAAQ,CACV,IAAIC,EAAWD,EACf,IACCA,EAASlC,EAAWkC,EACrB,CAAE,MAAME,GACPF,EAASC,CACV,CACa,gBAAVD,IACFA,EAASC,EAEX,OAEI,GAAY,SAATH,GACP,GAAGE,EAAQ,CACV,IAAIC,EAAWD,EACf,IACCA,EAAS9B,EAAW8B,EACrB,CAAE,MAAME,GACPF,EAASC,CACV,CACa,gBAAVD,IACFA,EAASC,EAEX,OAEI,GAAY,mBAATH,GACJE,EAAQ,CACV,IAAIC,EAAWD,EACf,IACCA,EA1GClC,EADgBJ,EA2GOyC,UA1GJ,IAAMjC,EAAWR,EA2GtC,CAAE,MAAMwC,GAAI,CACC,gBAAVF,IACFA,EAASC,EAEX,CAIED,QACFD,EAAkB,IAGlBC,EAxGL,SAA8BI,GAC1BA,UACFA,EAAO,IAEW,iBAATA,IACTA,EAAO,GAAKA,GAEb,IAAI,IAAKC,EAAKzC,KAAUxE,OAAOkH,QAAQxB,GACtCsB,EAAOA,EAAKT,MAAMU,GAAKxE,KAAK+B,GAE7B,OAAOwC,CACR,CA6FcG,CAAqBP,GAC9BD,EAAkB,WAAaC,EAAS,KAI7B,MAATpC,EACW,MAAVoC,IACFhG,EAAOA,EAAK9D,QAAQwI,EAAgBqB,IAUrC/F,GALCA,EADEA,EAAKxB,SAAS,MACTwB,EAAKwG,MAAM,GAAI,GAGfxG,EAAKwG,MAAM,GAAI,IAETT,EAAkB,MAGjC9C,GAAUjD,CACX,MACK,GAAY,UAAT8F,EAAkB,CACzBF,EAAI5F,EAAK6F,MAAMnB,GACf,IAAId,EAAQgC,EAAIA,EAAE,GAAK,KACnBI,EAASf,EAAW1F,EAAQjB,GAE5BsF,EAsBCoC,GAAUA,GAAUpC,EAOnB5D,EAAK6F,MAAMhB,KAEb7E,EADEA,EAAKxB,SAAS,MACTwB,EAAKwG,MAAM,GAAI,GAGfxG,EAAKwG,MAAM,GAAI,GAEvBxG,GAAc,yBAXfA,EAAOA,EAAK9D,QAAQ2I,EAAoB,IArBrCmB,GAAoB,SAAVA,GAA+B,OAAVA,EAK9BhG,EAAK6F,MAAMhB,KAEb7E,EADEA,EAAKxB,SAAS,MACTwB,EAAKwG,MAAM,GAAI,GAGfxG,EAAKwG,MAAM,GAAI,GAEvBxG,GAAc,yBAXfA,EAAOA,EAAK9D,QAAQ2I,EAAoB,IAqC1C5B,GAAUjD,CACX,MACK,GAAY,aAAT8F,EAAqB,CAC5BF,EAAI5F,EAAK6F,MAAMnB,GACf,IAAId,EAAQgC,EAAIA,EAAE,GAAK,KACnBI,EAASf,EAAW1F,EAAQjB,GAE5BsF,EAsBCoC,GAAWT,EAAa3B,EAAOoC,GAO9BhG,EAAK6F,MAAMhB,KAEb7E,EADEA,EAAKxB,SAAS,MACTwB,EAAKwG,MAAM,GAAI,GAGfxG,EAAKwG,MAAM,GAAI,GAEvBxG,GAAc,yBAXfA,EAAOA,EAAK9D,QAAQ2I,EAAoB,KArBrCmB,GAAUT,EAAa,QAASS,IAAWT,EAAa,MAAOS,GAClEhG,EAAOA,EAAK9D,QAAQ2I,EAAoB,IAIpC7E,EAAK6F,MAAMhB,KAEb7E,EADEA,EAAKxB,SAAS,MACTwB,EAAKwG,MAAM,GAAI,GAGfxG,EAAKwG,MAAM,GAAI,GAEvBxG,GAAc,yBA0BjBiD,GAAUjD,CACX,MAECiD,GAAUjD,CAGZ,MAECiD,GAAUjD,EAtPb,IAAwB0D,CAuPtB,IAGMT,CACR,C,SC5RAnH,EAAOC,QAAU,6tE,gBCCjB,MAAM0K,EAAY,EAAQ,KACpBC,EAAqB,EAAQ,KAC7BC,EAAiB,EAAQ,KAEzBC,EAAQ,EAAQ,IAEtB,IAAIC,EAAe,GA2FnB/K,EAAOC,QAxEP+K,eAA0BnG,EAAU,CAAC,GACpC,IAAIoG,EAAO3H,OAAO4B,OAAO,CACxBgG,sBAAuB,cACrBC,OAAQ,IAAIR,EACZS,YAAY,EACZC,cAAe,8CACfC,eAAgB,uCAChBC,KAAM,MAEN1G,GACH,OAAO,IAAIwC,SAAQ,CAACmE,EAASC,KAExBlL,SAASoF,cAAc,sBAC1BpF,SAASI,KAAKO,mBAAmB,YAAa4J,GA7BjDE,eAA6BM,GAC5B,OAAO,IAAIjE,SAAQ,CAACmE,EAASC,KAC5B,GAAI5K,OAAO6K,UACVF,EAAQ3K,OAAO6K,eAEX,CACJ,IAAIC,EAAWpL,SAASC,cAAc,UACtCmL,EAASC,aAAa,MAAON,GAC7BK,EAASE,OAASb,iBACjBQ,EAAQ3K,OAAO6K,UAChB,EACAnL,SAASU,KAAKL,YAAY+K,EAC3B,IAEF,CAmBEG,CAAcb,EAAKK,gBAAgBhE,MAAKoE,IAGvC,IAAIK,EAAO,IAAIC,EADFN,EAAU/G,SACH,CACnBwG,OAAQF,EAAKE,OACbc,UAAW,CACVC,KAAM,YAEPC,iBAAkB,IA2BnB,GAxBAJ,EAAK5G,GAAG,SAAS,SAAUiF,GAC1BgC,QAAQC,IAAI,aAAcjC,EAC3B,IAEA2B,EAAK5G,GAAG,QAAQ,SAAUmH,EAAMC,EAAWC,EAAgBC,EAAUC,GACpEJ,EAAKK,SAAWJ,EAAUxH,EAC3B,IACAgH,EAAKa,cAAgB,WACpB,IAAIzF,EAAS,GAGb,OAFAA,EAAOhE,KAAK4I,EAAKc,MACjBjC,EAAmB9F,KAAMiH,EAAKc,KAAK9H,GAAIoC,GAChCA,CACR,EACA4E,EAAKe,UAAY,WAChB,IAAI3F,EAAS,GAGb,OAFAA,EAAOhE,KAAK4I,EAAKgB,IAAI,IACrBlC,EAAekB,EAAM,EAAG5E,GACjB6F,KAAKC,UAAU9F,EACvB,EAEG8D,EAAKC,uBACP3K,SAASoF,cAAcsF,EAAKC,uBAAuBtK,YAAYmL,EAAKmB,SAASC,GAAGb,QAG9ErB,EAAKM,MAAQnI,MAAMuG,QAAQsB,EAAKM,MAClC,IAAI,IAAIe,KAAQrB,EAAKM,KACpBQ,EAAKlH,QAAQsG,OAAOiC,KAAK,OAAQd,GAInCd,EAAQO,EAAI,IAIVd,EAAKG,YAAcH,EAAKI,gBACtBN,EAAanB,SAASqB,EAAKI,iBAC9BN,EAAa5H,KAAK8H,EAAKI,eACvB9K,SAASU,KAAKC,mBAAmB,YAAa,eAAe+J,EAAKI,qCAEpE,GAGF,C,UCxFArL,EAAOC,QARP,SAAS4K,EAAgBkB,EAAMsB,EAAQlG,GACtC4E,EAAKuB,SAASD,GAAQ3J,SAAQ,SAAUrB,GACvCA,EAAMsK,SAAWU,EACjBlG,EAAOhE,KAAKd,GACZwI,EAAekB,EAAM1J,EAAM0C,GAAIoC,EAChC,GACD,C,UCGAnH,EAAOC,QARP,SAAS2K,EAAmBmB,EAAMsB,EAAQlG,GACzC4E,EAAKuB,SAASD,GAAQ3J,SAAQ,SAAUrB,GACvCA,EAAMsK,SAAWU,EACjBlG,EAAOhE,KAAKd,GACZuI,EAAmBmB,EAAM1J,EAAM0C,GAAIoC,EACpC,GACD,C,UCcAnH,EAAOC,QApBP,MACC,WAAAsN,GACCzI,KAAK0I,QAAU,CAAC,CACjB,CACA,EAAArI,CAAG6B,EAAKyG,GACP,IAAID,EAAU1I,KAAK0I,QAAQxG,GAK3B,OAJKwG,IACJA,EAAU1I,KAAK0I,QAAQxG,GAAO,IAE/BwG,EAAQrK,KAAKsK,GACN3I,IACR,CACA,IAAAsI,CAAKpG,KAAQ0G,GACZ,GAAI1G,KAAOlC,KAAK0I,QACf,IAAK,IAAIC,KAAU3I,KAAK0I,QAAQxG,GAC/ByG,EAAOE,MAAM7I,KAAM4I,EAGtB,E,8CCnBD,24C,UCEA,IAAI/E,EAAkB,wBAGlBiF,EAAgB,gCAChBC,EAAsB,+BAGtB5E,EAAe,IAAIC,SAAS,OAC/B,4HAiEDlJ,EAAOC,QA9BY,SAASyH,EAAMjE,GAEjC,IAAI0D,EAAS,GAwBb,OAtBAO,EAAKmC,MAAM+D,GAAelK,SAASQ,IAClC,GAA4C,GAAzCA,EAAKzB,cAAczB,QAAQ,WAAiB,CAC9C,IAAI8I,EAAI5F,EAAK6F,MAAMpB,GACfnG,EAAOsH,EAAIA,EAAE,GAAK,KAElBI,EAnCP,SAAoBd,EAAKC,GACxB,OAAOJ,EAAaK,KAAKxE,KAAM,CAC9ByE,QAASH,EACPI,WAAYH,GAEhB,CA8BgBF,CAAW1F,EAAQjB,GAChC,GAAG,MAAO0H,EAA0C,CAEnD,IAAI4D,GADJ5J,EAAOA,EAAK9D,QAAQyN,EAAqB,KAClB9D,MAAO,IAAIgE,OAAO,gBA/BxBC,EA+BoD9D,IA9B9D8D,EAAI5N,QACN4N,EAAI5N,QAAQ,sCAAuC,QAGnD4N,GA0B0E,QAAS,MACxF,GAAGF,EAAa,CACf,IAAIG,EAAa/J,EAAKlD,QAAQ8M,EAAY,IAAMA,EAAY,GAAGtK,OAC/DU,EAAOA,EAAKwG,MAAM,EAAGuD,GAAc,wBAA0B/J,EAAKP,UAAUsK,EAC7E,CACD,CAEA9G,GAAUjD,CACX,MAECiD,GAAUjD,EAzCb,IAAqB8J,CA0CnB,IAGM7G,CACR,C,UCtEA,IAAIwB,EAAkB,wBAGlBuF,EAAkB,oCAIlBjF,EAAe,IAAIC,SAAS,OAC/B,4HAgEDlJ,EAAOC,QA7BY,SAASyH,EAAMjE,GAEjC,IAAI0D,EAAS,GAuBb,OArBAO,EAAKmC,MAAMqE,GAAiBxK,SAASQ,IACpC,GAA8C,GAA3CA,EAAKzB,cAAczB,QAAQ,aAAmB,CAChD,IAAI8I,EAAI5F,EAAK6F,MAAMpB,GACfnG,EAAOsH,EAAIA,EAAE,GAAK,KAEtB,GAAGtH,EAAM,CACR,IAAI0H,EApCR,SAAoBd,EAAKC,GACxB,OAAOJ,EAAaK,KAAKxE,KAAM,CAC9ByE,QAASH,EACPI,WAAYH,GAEhB,CA+BiBF,CAAW1F,EAAQjB,GAChC,GAAG,MAAO0H,EAA0C,CACnD,IAAIiE,EAAcjK,EAAKlD,QAAQ,KAC3BoN,EAAclK,EAAKN,YAAY,KACnCM,EAAOA,EAAKP,UAAU,EAAGwK,EAAc,GAAKjE,EAAShG,EAAKP,UAAUyK,EACrE,CACD,CAEAjH,GAAUjD,CACX,MAECiD,GAAUjD,CACX,IAGMiD,CACR,C,UC3DAnH,EAAOC,QATP,MACC,WAAAsN,CAAYc,EAAuBC,EAAgBC,EAAoBC,GACtE1J,KAAKuJ,sBAAwBA,EAC7BvJ,KAAKwJ,eAAiBA,EACtBxJ,KAAKyJ,mBAAqBA,GANA,kBAO1BzJ,KAAK0J,WAAaA,CACnB,E,UCsCDxO,EAAOC,QA/CqB,SAASwO,EAAYC,GAChD,IAAID,EACH,OAAOC,EAER,IAAIA,EACH,OAAOA,EAGR,GAAiC,GAA9BA,EAAY1N,QAAQ,QAA4C,GAA7B0N,EAAY1N,QAAQ,MACzD,OAAO0N,EAOR,IAJA,IAAIC,EAASF,EAAW5E,MAAM,KAC1B+E,EAASF,EAAY7E,MAAM,KAGzB8E,EAAOnL,SAAWmL,EAAO,IAC9BA,EAAOE,QAER,KAAMD,EAAOpL,SAAWoL,EAAO,IAC9BA,EAAOC,QAGR,GAAiC,GAA9BH,EAAY1N,QAAQ,OAAc,CACpC,KAAM4N,EAAOpL,QAAuB,MAAboL,EAAO,IAC7BD,EAAOG,MACPF,EAAOC,QAIR,IAFAF,EAAOG,MAEDF,EAAOpL,QACZmL,EAAOxL,KAAKyL,EAAOC,SAEpB,OAAOF,EAAO5I,KAAK,IACpB,CACA,GAAgC,GAA7B2I,EAAY1N,QAAQ,MAAa,CAGnC,IAFA4N,EAAOC,QACPF,EAAOG,MACDF,EAAOpL,QACZmL,EAAOxL,KAAKyL,EAAOC,SAEpB,OAAOF,EAAO5I,KAAK,IACpB,CAEA,OAAO2I,CACR,C,gBC5CA,MAAMK,EAAkB,EAAQ,KA8BhC,IAAI9F,EAAe,IAAIC,SAAS,qBAC/B,iTAeD,SAAS8F,EAAmBzF,EAASC,EAAYyF,EAAeC,GAW/D,OAVAD,EAAgBA,GAAiB,CAAC,EAClCC,EAAaA,GAAc,CAAC,EAGfjG,EAAaK,KAAKxE,KAAM,CACpCoK,WAAYA,EACVD,cAAeA,EACf1F,QAASA,EACTC,WAAYA,GAGhB,CAEAxJ,EAAOC,QA3DP,SAA2BsJ,EAASC,EAAYyF,EAAeC,GAC9D,IAAK1F,EACJ,OAAO,KAMR,GAJ0B,iBAAfA,IACVA,EAAaA,EAAW2F,QAGN,UAAf3F,GAAyC,SAAfA,EAC7B,OAAOD,EAER,GAAuB,iBAAZA,GAAwBC,KAAcD,EAChD,OAAOA,EAAQC,GAEhB,GAAmB,OAAfA,GAAsC,OAAfA,EAC1B,MAAO,GAER,IAAI4F,EAAWL,EAAgBxF,EAASC,GASxC,OARI4F,UACHA,EAAWL,EAAgB,CAC1B,SAAYG,GACV1F,IAEA4F,UACHA,EAAWJ,EAAmB1F,KAAKC,EAASA,EAASC,EAAYyF,EAAeC,IAE1EE,CACR,C,gBC5BA,IAAIC,EAAgB,EAAQ,KAC5B,IAAIC,EAAwB,EAAQ,KACpC,IAAIC,EAAoB,EAAQ,KAuOhCvP,EAAOC,QArOP,MAOC,WAAAsN,CAAYiB,EAAYgB,EAAUjE,EAAO,CAAC,EAAGkE,EAAc,GAAIR,EAAgB,CAAC,GAC/EnK,KAAK0J,WAAaA,EAClB1J,KAAK0K,SAAWA,EAChB1K,KAAK2K,YAAcA,EACnB3K,KAAK4K,YAAcnE,EACnBzG,KAAK6K,YAAc,GACnB7K,KAAKmK,cAAgBA,EACrBnK,KAAK8K,2BAA4B,EAUjC9K,KAAK+K,UAAY,EACjB/K,KAAKgL,eAAiB,GACvB,CAOA,GAAAC,CAAIC,GACH,IAAIC,EASJ,OARID,IACHC,EAAc,KACbD,EAAS,KAAMlL,KAAK2K,YAAW,GAIjC3K,KAAKoL,KAAKpL,KAAK0K,SAAU1K,KAAK4K,YAAaO,GAEpCnL,KAAK2K,WACb,CAEA,0BAAAU,CAA2BX,EAAUjB,EAAoBhD,GAcxD,OAbKgD,IACJA,EAAqB6B,qBAEc,KAAhC7B,EAAmB8B,OAAO,KAG7B9B,EAAqBgB,EAAkBhE,EAAMgD,EAAmB5K,UAAU,GAAImB,KAAKmK,cAAenK,KAAK4K,cAGhE,GAApCnB,EAAmBvN,QAAQ,OAAmD,GAArCuN,EAAmBvN,QAAQ,SACvEuN,EAAqBe,EAAsBE,EAASc,aAAa9N,KAAM+L,IAGjEA,CACR,CAEA,IAAA2B,CAAKV,EAAUjE,EAAMyE,GACpB,IAAIO,EAAQ,IAAIf,EAASe,OAAOC,UAChC,MAAMC,EAAe,KAKpB,GADA3L,KAAK+K,YACF/K,KAAK+K,YAAc/K,KAAKgL,eAC1BpJ,YAAW,KACV5B,KAAK+K,UAAY,EACjBY,GAAa,SAKf,GAAIF,EAAM/M,OAAS,EAAG,CACrB,IAAIkN,EAAOH,EAAMzB,MACjB,GAAoB,iBAAT4B,EACV5L,KAAK6L,OAAOD,GACZD,SAEI,GAAIC,aAAgBrB,EAAe,CACvC,IAEIuB,EAFAC,EAAcH,EAAKrC,uBAAyBqC,EAAKpC,eACjDwC,GAAoB,EAoCxB,GAlCmB,MAAfD,GAAsCE,MAAfF,GAA4C,KAAhBA,EAGtDC,GAAoB,EAGjBJ,EAAKrC,sBACMkB,EAAkBhE,EAAMmF,EAAKrC,sBAAuBvJ,KAAKmK,cAAenK,KAAK4K,eAEzFoB,GAAoB,IAKrBF,EAAarB,EAAkBhE,EAAMmF,EAAKpC,eAAgBxJ,KAAKmK,cAAenK,KAAK4K,aAChFkB,QACFE,GAAoB,GAEU,iBAAfF,GAMRxN,MAAMuG,QAAQiH,IAAeA,EAAWpN,OAAS,GAGjDoN,KALPE,GAAoB,IAYnBA,EAAmB,CAClBJ,EAAKpC,qBAAiCyC,IAAfH,IAC1BA,EAAarB,EAAkBhE,EAAMmF,EAAKpC,eAAgBxJ,KAAKmK,cAAenK,KAAK4K,cAEjFkB,UACFA,EAAarF,GAGd,IACIyF,EADAzC,EAAqBzJ,KAAKqL,2BAA2BX,EAAUkB,EAAKnC,mBAAoBhD,GAExF+B,GAAYlK,MAAMuG,QAAQiH,GAAc,IAAIA,GAAc,CAACA,IAAaJ,UAC5E,MAAMS,EAAgB,KACrB,GAAI3D,EAAS9J,OAAS,EAAG,CACxB,IAAInB,EAAQiL,EAASwB,MACrBhK,KAAKoL,KAAKc,EAAkB3O,GAAO,KAClC4O,GAAc,GAEhB,MAECR,GACD,EAGElC,KAAsBzJ,KAAK0J,WAAW0C,WACxCF,EAAmBlM,KAAK0J,WAAW2C,YAAY5C,GAC3CyC,EACHC,IAIInM,KAAK8K,2BACRa,KAMF3L,KAAK0J,WAAW4C,aAAa7C,GAAqBiB,IACjD,GAAKA,EAiBJwB,EAAmBxB,EACnByB,QAlBc,CACd,IAAII,EAAM,4BAA8B9C,EAExC,GADAnC,QAAQkF,MAAMD,GACVvM,KAAK8K,0BACRa,QAEI,CACJ,IAAIc,EAAM,IAAIC,MAAMH,GACpB,IAAIrB,EAIH,MAAMuB,EAHNvB,EAASuB,EAKX,CACD,CAIA,GAGH,MAECd,GAEF,KACyB,mBAATC,IACZA,EAAKe,MACPf,EAAKe,MAAMlG,EAAMzG,KAAK2K,aAAa,KAClCgB,GAAa,KAKd3L,KAAK6L,OAAOD,EAAKnF,IACjBkF,KAIH,MAEKT,GACHA,GAEF,EAGDS,GACD,CAMA,MAAAE,CAAO7I,GACHA,UAG6B,iBAArBhD,KAAK2K,YACf3K,KAAK2K,aAAe3H,EAEZhD,KAAK2K,YAAYgC,OACzB3M,KAAK2K,YAAYgC,MAAM3J,GAEzB,E,UClKD9H,EAAOC,QAlCP,SAAyBsL,EAAMlC,GAC9B,GAAIkC,QACH,OAAOA,EAER,IAAIgF,EAQJ,IAPoB,iBAATlH,EACVkH,EAAQlH,EAAK8F,OAAOtF,MAAM,KAElBzG,MAAMuG,QAAQN,KACtBkH,EAAQlH,GAGFkH,EAAM/M,OAAS,GAAG,CACxB,IAKInB,EALAG,EAAO+N,EAAM1B,QACjB,GAAIrM,EAAKxB,QAAQ,MAAQ,EAExB,OAAO,KAWR,GARa,SAATwB,GAA4B,UAATA,EACtBH,EAAQkJ,EAEgB,iBAATA,GACX/I,KAAQ+I,IACXlJ,EAAQkJ,EAAK/I,IAGK,GAAhB+N,EAAM/M,OACT,OAAOnB,EAERkJ,EAAOlJ,CACR,CACD,C,gBCxDA,SAASqP,EAASvG,GACjB,OAAkB,OAAXA,GACe,iBAAXA,GACgB,mBAAhBA,EAAOwG,IACnB,CAXqC,mBAA1BC,OAAOrM,UAAU4J,OAC3ByC,OAAOrM,UAAU4J,KAAO,WACvB,OAAOrK,KAAK1E,QAAQ,aAAc,GACnC,GA+BD,IAAIyR,EAAmB,EAAQ,KAC3BxC,EAAgB,EAAQ,KAG5B,MAAMyC,EACL,WAAAvE,CAAY1I,EAAU,CAAC,GACtBC,KAAKoM,UAAY,CAChBa,gBAAiBjN,KAAKkN,eAAc,SAAUC,GAC7C,MAAO,GAAKA,CACb,KAED,IAAI,UAAEC,EAAY,CACjBC,iBAAkB,KAClBC,qBAAsB,OACjBvN,EACNC,KAAKoN,UAAYA,EAKjBpN,KAAKuN,gCAAkCxN,EAAQwN,gCAE/CvN,KAAKwN,QAAUzN,EAAQyN,SAAW,GAElCxN,KAAKmK,cAAgBpK,EAAQ0N,cAAgB,CAAC,CAC/C,CAEA,aAAAP,CAAcQ,GACb,IAhDkBpJ,EAgDHoJ,IA5CG,mBAARpJ,GAGNA,EAAIqI,OAGJrI,EAAImH,OAGJnH,EAAIkH,aAoCP,OAAOkC,EAjDV,IAAoBpJ,EAmDlB,IAAIqJ,EAAM3N,KACN4N,EAAI,SAAUT,GACjB,IAAI9G,EAAS,KACTtG,EAAU,KACVmL,EAAW,KACf,IAAK,IAAI2C,EAAI,EAAGA,EAAIC,UAAUpP,OAAQmP,IAAK,CAC1C,IAAIE,EAAMD,UAAUD,GAChBjB,EAASmB,GACZ1H,EAAS0H,EAEa,mBAARA,EACd7C,EAAW6C,EAEW,iBAARA,IACdhO,EAAUgO,EAEZ,CAEA,OAAOH,EAAEjB,MAAMQ,EAAS9G,EAAQ6E,EAAUnL,EAC3C,EAsBA,OArBA6N,EAAEjB,MAAQ,SAAUQ,EAAS9G,EAAQ6E,EAAUnL,EAAU,CAAC,GACzD,GAAG2N,GAA0BA,EAAuBf,MAEnD,OAAOe,EAAuBf,MAAM9D,MAAM6E,EAAwBI,WAE9D,CACJ,IAEIrJ,EAAU,IAAIsI,EAAiBY,EAAKC,EAAGT,EAFhC9G,GAAU,GAEqCsH,EAAIxD,eAK9D,OAJIpK,GAAW,8BAA+BA,IAC7C0E,EAAQqG,0BAA4B/K,EAAQ+K,2BAGtCrG,EAAQwG,IAAIC,EACpB,CACD,EACA0C,EAAEnC,MAAQ,GACNiC,GAA4D,mBAA3BA,GACpCE,EAAEnC,MAAMpN,KAAKqP,GAEdE,EAAEpC,aAAe,CAAC,EACXoC,CACR,CAEA,WAAAI,CAAYtQ,EAAMgN,GAWjB,MAVwB,iBAAbA,EACVA,EAAW1K,KAAKiO,cAAcvD,GAEF,mBAAbA,IACfA,EAAW1K,KAAKkN,cAAcxC,IAG/B1K,KAAKoM,UAAU1O,GAAQgN,EACvBA,EAASc,aAAed,EAASc,cAAgB,CAAC,EAClDd,EAASc,aAAa9N,KAAOA,EACtBgN,CACR,CAEA,WAAAwD,GACC,OAAO,IAAIlB,CACZ,CAEA,WAAAX,CAAY3O,GACX,OAAOsC,KAAKoM,UAAU1O,EACvB,CAEA,YAAA4O,CAAa5O,EAAMwN,GAClB,GAAIxN,KAAQsC,KAAKoM,UAChBlB,EAASlL,KAAKoM,UAAU1O,QAEpB,CACJ,IAAIiQ,EAAM3N,KACNmO,EAAQnO,KAAKwN,QAAQ9O,OACrB0P,GAAO,EAEE,GAATD,GACHR,EAAIvB,UAAU1O,GAAQ,KACtBwN,EAASyC,EAAItB,YAAY3O,KAGzBsC,KAAKwN,QAAQ5O,SAAQyP,IAChBD,GAGJC,EAAO3Q,GAAMgN,IACR0D,IAGJD,IACIzD,GACH0D,GAAO,EACPT,EAAIK,YAAYtQ,EAAMgN,IAEL,GAATyD,IACRC,GAAO,EACPT,EAAIvB,UAAU1O,GAAQ,MAEnB0Q,GACHlD,EAASyC,EAAItB,YAAY3O,IAC1B,GACA,GAGJ,CACD,CACA,mBAAA4Q,CAAoBC,GAInB,IAHA,IAAIC,EAAMxO,KAAKyO,uBAAuBF,GAElCG,EAAM,KACDb,EAAI,EAAGA,EAAIW,EAAI9P,OAAQmP,IAAK,CACpC,IAAIc,EAAQH,EAAIX,GAChB,GAAIc,EAAMC,OACTF,EAAMC,EAAM1S,aAGZ,GAAIyS,EAAK,CACR,IAAIhE,EAAW1K,KAAKgO,YAAYU,EAAK1O,KAAK6O,wBAAwBF,EAAM1S,UACpE+D,KAAKuN,kCACRvN,KAAKuN,gCAAgCmB,GAAOhE,GAE7CgE,EAAM,IACP,CAEF,CACD,CAEA,uBAAAG,CAAwBC,GACvB,IAAIjB,EAAIiB,EAAI5S,QAAQ,MAQpB,OAPI2R,GAAK,GAAmC,IAA9BiB,EAAIjQ,UAAU,EAAGgP,GAAGxD,SACjCyE,EAAMA,EAAIjQ,UAAUgP,EAAI,KAEzBA,EAAIiB,EAAIhQ,YAAY,QACX,GAAgC,IAA3BgQ,EAAIjQ,UAAUgP,GAAGxD,SAC9ByE,EAAMA,EAAIjQ,UAAU,EAAGgP,IAEjBiB,CACR,CAGA,oBAAAC,CAAkDC,EAAIvI,EAAgCwI,EAAIvF,EAAY8B,GACrG,IAAInD,EAAK,IAAIkC,EAAcyE,EAAIvI,EAAMwI,EAAIvF,GAEzC,OADArB,EAAGmD,aAAeA,EACXnD,CACR,CACA,EAAA6G,CAAGX,GACF,OAAOvO,KAAKiO,cAAcM,EAC3B,CAEA,aAAAN,CAAcM,GACb,IAAIC,EAAMxO,KAAKmP,iBAAiBZ,GAChC,IAAIa,EAAIpP,KAAKkN,gBACb,IAAI1B,EAAe4D,EAAE5D,aAErB,IAAK,IAAI6D,KAAMb,EACVa,EAAGT,OACNQ,EAAE3D,MAAMpN,KAAK2B,KAAKsP,mBAAmBD,EAAGpT,QAASuP,IAEzC6D,EAAGpT,SACXmT,EAAE3D,MAAMpN,KAAKgR,EAAGpT,SAIlB,OAAOmT,CACR,CAEA,kBAAAE,CAAmBf,EAAI/C,GACtB,IAAI+D,EAAM,KACNC,EAAM,KACNC,EAAM,KAGNC,EAAKnB,EAAGrS,QAAQ,MAChBwT,GAAM,GACTH,EAAMhB,EAAG1P,UAAU,EAAG6Q,GACtBA,GAAM,GAGNA,EAAK,EAIN,IAAIC,EAAKpB,EAAGrS,QAAQ,MAQpB,OAPIyT,GAAM,GACTH,EAAMjB,EAAG1P,UAAU6Q,EAAIC,GACvBF,EAAMlB,EAAG1P,UAAU8Q,EAAK,IAGxBH,EAAMjB,EAAG1P,UAAU6Q,GAEb1P,KAAK+O,qBAAqBQ,EAAKC,EAAKC,EAAKzP,KAAMwL,EACvD,CAEA,gBAAA2D,CAAiBZ,GAChB,OAAOvO,KAAK4P,gCAAgCrB,EAAIvO,KAAKoN,UAAUC,iBAChE,CAIA,sBAAAoB,CAAuBF,GACtB,OAAOvO,KAAK4P,gCAAgCrB,EAAIvO,KAAKoN,UAAUE,qBAChE,CAGA,+BAAAsC,CAAgChN,EAAkCiN,GAEjE,IAAInR,EAASkE,EAAKlE,OAGdoR,EAAW,EAGXC,GAAM,EAENC,EAAS,GAEb,KAAOF,EAAWpR,GAAQ,CACzB,IAAImP,EAAIjL,EAAK1G,QAAQ2T,EAAUC,IACrB,GAANjC,IACHA,EAAInP,GAEL,IAAI2Q,EAAK,CAAET,OAAQmB,EAAK9T,QAAS2G,EAAK/D,UAAUiR,EAAUjC,IAC1DmC,EAAO3R,KAAKgR,GACZS,EAAWjC,EAAIgC,EAASnR,OACxBqR,GAAOA,CACR,CAEA,OAAOC,CACR,EAGD,IAAIC,EAAqB,IAAIjD,EAER,oBAAVjR,SACVkU,EAAmB1C,gCAAkCxR,QAKrDb,EAAOC,QAAU8U,OAMG,IAAV,EAAAC,IACL,EAAAA,EAAOlD,aACX,EAAAkD,EAAOlD,WAAaA,GAEhB,EAAAkD,EAAOxG,aACX,EAAAwG,EAAOxG,WAAauG,G,gBC7TtB,IAAItC,EAAM,EAAQ,KAClBzS,EAAOC,QAAUwS,EAAIK,YAAY,8CADQ,+C,gBCAzC,IAAIL,EAAM,EAAQ,KAClBzS,EAAOC,QAAUwS,EAAIK,YAAY,wDADQ,4O,gBCAzC,IAAIL,EAAM,EAAQ,KAClBzS,EAAOC,QAAUwS,EAAIK,YAAY,yDADQ,y8B,eCAzC,IAAIL,EAAM,EAAQ,KAClBzS,EAAOC,QAAUwS,EAAIK,YAAY,mDADQ,grH,gBCAzC,IAAIL,EAAM,EAAQ,KAClBzS,EAAOC,QAAUwS,EAAIK,YAAY,kDADQ,wsB,GCCrCmC,EAA2B,CAAC,EAGhC,SAASC,EAAoBC,GAE5B,IAAIC,EAAeH,EAAyBE,GAC5C,QAAqBpE,IAAjBqE,EACH,OAAOA,EAAanV,QAGrB,IAAID,EAASiV,EAAyBE,GAAY,CAGjDlV,QAAS,CAAC,GAOX,OAHAoV,EAAoBF,GAAUnV,EAAQA,EAAOC,QAASiV,GAG/ClV,EAAOC,OACf,CCrBAiV,EAAoB5U,EAAI,CAACL,EAAS8C,KACjC,IAAI,IAAIwH,KAAOxH,EACXmS,EAAoBI,EAAEvS,EAAYwH,KAAS2K,EAAoBI,EAAErV,EAASsK,IAC5EjH,OAAOiS,eAAetV,EAASsK,EAAK,CAAEiL,YAAY,EAAMzI,IAAKhK,EAAWwH,IAE1E,ECND2K,EAAoBF,EAAI,WACvB,GAA0B,iBAAfS,WAAyB,OAAOA,WAC3C,IACC,OAAO3Q,MAAQ,IAAIoE,SAAS,cAAb,EAChB,CAAE,MAAOkB,GACR,GAAsB,iBAAXvJ,OAAqB,OAAOA,MACxC,CACA,CAPuB,GCAxBqU,EAAoBI,EAAI,CAAClM,EAAKsM,IAAUpS,OAAOiC,UAAUoQ,eAAerM,KAAKF,EAAKsM,GCClFR,EAAoBpL,EAAK7J,IACH,oBAAX2V,QAA0BA,OAAOC,aAC1CvS,OAAOiS,eAAetV,EAAS2V,OAAOC,YAAa,CAAE/N,MAAO,WAE7DxE,OAAOiS,eAAetV,EAAS,aAAc,CAAE6H,OAAO,GAAO,E,eCL/C,SAASgO,GAAkBvL,EAAKzC,IAE9C,IAAIyI,GADJhG,EAAMA,EAAI4E,QACMtF,MAAM,KAClBkM,EAAQxF,EAAM1B,QAAQM,OACtBlI,EAAWsJ,EAAMxK,KAAK,KAAKoJ,OAM/B,MAJoB,iBAAVrH,IACTA,EAAQA,EAAMqH,QAGR,CACN4G,MAAOA,EACP9O,SAAUA,EACV+O,QAASlO,EAEX,C,iDCVA,IAAImO,EAAiB,CAEpBC,QAAS,MAEPC,OAAQ,CAAC,GASL,MAAMC,EACZ,WAAA7I,CAAY1I,GACXC,KAAKC,GCfQ,WACd,IAAIsR,EAAQ,IAAIC,WAAW,IAC3BzV,OAAO0V,OAAOC,gBAAgBH,GAC9B,IAAIvO,EAAQ2O,KAAKJ,GAEjB,OADAvO,EAAQA,EAAM1H,QAAQ,MAAO,KAAKA,QAAQ,MAAO,KAAKA,QAAQ,MAAO,IAC9D0H,CACR,CDSY4O,GACVpT,OAAO4B,OAAOJ,KAAMmR,GACpBnR,KAAK6R,cAAchJ,MAAM7I,KAAM8N,WAC/BtP,OAAO4B,OAAOJ,KAAMD,GACpBC,KAAK8R,iBACL9R,KAAK+R,WAAWlJ,MAAM7I,KAAM8N,UAC7B,CAOA,aAAA+D,GAAkB,CAMlB,UAAAE,GAAe,CAQf,MAAA3J,GACC,OAAOpI,IACR,CAKA,MAAA3D,GACC2D,KAAKqI,GAAG2J,cAAcC,YAAYjS,KAAKqI,GACxC,CAOA,QAAA6J,CAASC,GACRA,EAAUrW,YAAYkE,KAAKqI,GAC5B,CAMA,iBAAA+J,CAAkBD,GACjBA,EAAUE,UAAY,GACtBrS,KAAKkS,SAASC,EACf,CAQA,UAAAG,CAAWjK,GAKV,OAJIrI,KAAKqI,KAAOA,IACfrI,KAAKqI,GAAKA,EACVrI,KAAKuS,iBAECvS,IACR,CAQA,cAAAwS,CAAe9U,GACd,IAAI2K,EAAK5M,SAASC,cAAcgC,GAGhC,OAFA2K,EAAGvB,aAAa,KAAM9G,KAAKC,IAC3BoI,EAAGoK,KAAOzS,KACHqI,CACR,CAMA,cAAAyJ,GACM9R,KAAKqI,IACTrI,KAAKsS,WAAWtS,KAAKwS,eAAexS,KAAKoR,UAE1CpR,KAAK0S,iBACD1S,KAAK2S,WACR3S,KAAKqI,GAAG1M,UAAUC,IAAIoE,KAAK2S,UAE7B,CAOA,cAAAD,CAAeE,GACd,GAAI5S,KAAK4S,WACR,IAAK,IAAKnN,EAAKzC,KAAUxE,OAAOkH,QAAQ1F,KAAK4S,YAC5C5S,KAAKqI,GAAGvB,aAAarB,EAAKzC,EAG7B,CAqBA,aAAAuP,GACCvS,KAAK6S,cAAgBrU,OAAOkH,QAAQ1F,KAAKqR,QAAQjT,IAAI4S,GACrD,IAAI8B,GEvJoCD,EFuJL7S,KAAK6S,cEtJxBvU,MAAMC,KAAKsU,EAAcE,QAAO,CAACC,EAAKC,KACtDD,EAAIpX,IAAIqX,EAAQhC,OACT+B,IACL,IAAIE,OAJO,IAA2BL,EFyJxC,IAAI,IAAIM,KAAaL,EACpB9S,KAAKqI,GAAG/L,iBAAiB6W,EAAWnT,KAAKoT,cAAcC,KAAKrT,MAE9D,CAOA,cAAAsT,CAAenR,GACd,MAAgB,MAAbA,EACK,CAACnC,KAAKqI,IAEP/J,MAAMC,KAAKyB,KAAKqI,GAAGkL,iBAAiBpR,GAC5C,CAQA,aAAAiR,CAAclR,GACb,IAAI,IAAI+Q,KAAWjT,KAAK6S,cACvB,GAAG3Q,EAAIgD,MAAQ+N,EAAQhC,MAAO,CAC7B,IAAIuC,EAAaxT,KAAKsT,eAAeL,EAAQ9Q,UACzCsR,EAAQ,KACZ,IAAI,IAAIC,KAAaF,EACpB,GAAGE,IAAcxR,EAAIE,QAAUsR,EAAUC,SAASzR,EAAIE,QAAS,CAC9DqR,EAAQC,EACR,KACD,CAED,GAAGD,EAAO,CACqB,iBAApBR,EAAQ/B,QACjBlR,KAAKiT,EAAQ/B,SAAS1M,KAAKxE,KAAMkC,EAAKuR,GAEJ,mBAApBR,EAAQ/B,SACtB+B,EAAQ/B,QAAQ1M,KAAKxE,KAAMkC,EAAKuR,GAEjC,KACD,CACD,CAEF,E,gDG9LM,IAAIG,EAAoB,EACpBC,EAAmB,EAEnBC,EAAwB,EACxBC,EAAuB,E,aCXnB,SAASC,EAAYC,EAAOC,GAC1C,GAAa,GAATD,EACH,MAAO,UACR,IACCE,EAAKD,GAAY,EAEjBrG,EAAIuG,KAAKC,MAAMD,KAAK7M,IAAI0M,GAASG,KAAK7M,IAH/B,OAIR,OAAO+M,YAAYL,EAAQG,KAAKG,IAJxB,KAI+B1G,IAAI2G,QAAQL,IAAO,IAFjD,CAAC,QAAS,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,MAEStG,EACvE,CCAA,ICTI4G,EDSAC,EAA8B,oBAAhBC,YAA8B,CAAC,EAAIA,YCJpDF,EAD0B,oBAAhBE,YDMI,cAA2BD,EACzC,WAAAjM,CAAYrG,GACXwS,MAAMxS,GAELpC,KAAK6U,iBADHzS,GAIsBpC,IAE1B,CAQA,EAAAK,CAAG8S,EAAW2B,GACb,IAAIC,EAAkB9D,IACrB6D,EAASjM,MAAM7I,KAAMiR,EAAM+D,OAAM,EAIlC,OAFAF,EAASC,eAAiBA,EAC1B/U,KAAK6U,iBAAiBvY,iBAAiB6W,EAAW4B,GAC3C/U,IACR,CASA,IAAAsI,CAAK6K,KAAcvK,GAIlB,OAHA5I,KAAK6U,iBAAiBI,cAAc,IAAIC,YAAY/B,EAAW,CAC9D6B,OAAQpM,KAEF5I,IACR,CAOA,cAAAmV,CAAehC,EAAW2B,GAGzB,OAFAA,EAAWA,EAASC,gBAAkBD,EACtC9U,KAAK6U,iBAAiBO,oBAAoBjC,EAAW2B,GAC9C9U,IACR,GE1Dc,MACd,WAAAyI,GACCzI,KAAK0I,QAAU,CAAC,CACjB,CAEA,EAAArI,CAAG6B,EAAKyG,GACP,IAAID,EAAU1I,KAAK0I,QAAQxG,GAK3B,OAJKwG,IACJA,EAAU1I,KAAK0I,QAAQxG,GAAO,IAE/BwG,EAAQrK,KAAKsK,GACN3I,IACR,CAEA,IAAAsI,CAAKpG,KAAQ0G,GACZ,GAAI1G,KAAOlC,KAAK0I,QACf,IAAK,IAAIC,KAAU3I,KAAK0I,QAAQxG,GAC/ByG,EAAOE,MAAM7I,KAAM4I,EAGtB,CAOA,cAAAuM,CAAehC,EAAW2B,GACrB3B,KAAanT,KAAK0I,UACrB1I,KAAK0I,QAAQyK,GAAanT,KAAK0I,QAAQyK,GAAW7V,QAAO+X,GACjDA,IAASP,IAGnB,GDtBD,U,qBEPO,MAAMQ,UAAyB,EAOrC,WAAA7M,CAAY1I,GACX6U,MAAMpW,OAAO4B,OAAO,CAAC,EAAGL,EACvB,CACCM,GAAI,CACH,UAAW,KACVL,KAAK0G,QAAQ1G,KAAKuV,eACX,GAER,QAAS,KACRvV,KAAK0G,WACE,GAER,cAAe,KACd1G,KAAK0G,WACE,OAMP1G,KAAKiC,YACRjC,KAAKwV,kBAAoBxV,KAAKiC,WAE/BjC,KAAKiC,UAAY,SAAUR,EAAaJ,GACnCrB,KAAKyG,OACRhF,EAAY4Q,UAAY,EAAkB5Q,EAAY4Q,UAAWrS,KAAKyG,OAEvE,IAAIgP,EAAahU,EAAYZ,cAAc,mBACvC4U,GACHA,EAAWC,QAGR1V,KAAKwV,mBACRxV,KAAKwV,kBAAkB/T,EAAaJ,EAEtC,CACD,CACA,UAAAkU,GAEC,OC9Ca,SAAwBI,GACtC,IAAItT,EAAS,CAAC,EACVuT,EAAWD,EAASpC,iBAAiB,2BACzC,IAAK,IAAIsC,KAAWD,EAAU,CAC7B,GAAqB,aAAjBC,EAAQ3Q,MACX,IAAK2Q,EAAQC,QACZ,cAGG,GAAqB,UAAjBD,EAAQ3Q,OACX2Q,EAAQC,QACZ,SAGFzT,EAAOwT,EAAQE,aAAa,SAAWF,EAAQ7S,KAChD,CACA,OAAOX,CACR,CD6BS2T,CADUva,SAASoF,cAAcb,KAAKU,mBAE9C,CAEA,UAAMU,GAOL,OANApB,KAAKiW,QAAU,IAAI1T,SAAQ,CAACmE,EAASC,KACpC3G,KAAK0G,QAAUA,EACf1G,KAAK2G,OAASA,KAEfiO,MAAMxT,OAECpB,KAAKiW,OACb,EE5DM/P,eAAegQ,EAAWhU,EAAKiU,GACrC,IAAIC,EAAMpW,KAAKqW,mBAEf,GAAID,EAAI/Y,MAAMqB,OAAS,EAAG,CAEzB,IAAIrB,EAAQ+Y,EAAI/Y,MACZiZ,EAAQF,EAAIE,MAEhB,IAAKtW,KAAKuW,qBAAsB,CAC/B,IAIIC,EAJS,IAAIlB,EAAiB,CACjCnU,MAAO,eAAiB9D,EAAMqB,OAAS,EAAI,IAAM,IAC/C7C,KAAM,MAAQya,EAAMrV,KAAK,MAAQ,SAElBG,OAElB,UADgBoV,EAEf,MAEF,CAEA,IAAK,IAAIjX,KAAQlC,EAAO,CACvB,IACIoZ,EADAlS,EAAOhF,EAAKmX,QAEZ1W,KAAK2W,yBACRF,EAAOzW,KAAK2W,uBAAuBC,gBAAgB,CAClDC,MAAO,CACNC,OAAQ,UACRC,SAAU,YAAYxX,EAAK7B,iBAIxBsC,KAAKgX,KAAKC,GAAG1S,GACfvE,KAAK2W,yBACRF,EAAKpa,SACLoa,EAAOzW,KAAK2W,uBAAuBC,gBAAgB,CAClDC,MAAO,CACNC,OAAQ,UACRC,SAAU,WAAWxX,EAAK7B,QAEzBwZ,IAAK,MAGV,CACA,IAAK,IAAI9X,KAAQgX,EAAIe,MACpB/X,EAAK/C,QAEP,CACA2D,KAAKoX,QAAQ9O,KAAK,SAAU,CAC3BpD,KAAM,SACJiR,SAAUC,GAEd,CAEOlQ,eAAemR,EAAgBnV,EAAKiU,GAC1C,IAAI5R,EAAOvE,KAAKsX,YAAY/X,KAAKmX,QAC7BhZ,EAAOsC,KAAKsX,YAAY/X,KAAK7B,KAEjC,IAAK6G,EAEJ,OAGD,IASIkS,EALAD,EAJS,IAAIlB,EAAiB,CACjCnU,MAAO,mBACLtF,KAAM,MAAQ6B,EAAO,SAEN0D,OAElB,UADgBoV,EAEf,OAGGxW,KAAK2W,yBACRF,EAAOzW,KAAK2W,uBAAuBC,gBAAgB,CAClDC,MAAO,CACNC,OAAQ,UACRC,SAAU,YAAYrZ,cAInBsC,KAAKgX,KAAKC,GAAG1S,EAAM,CAAEgT,WAAW,IACtC,IAAIC,EAAcxX,KAAKiH,KAAKkP,WACxBsB,EAASzX,KAAKiH,KAAKwQ,OAAOD,GAE9BxX,KAAKiH,KAAKyQ,WAAWF,GACrBxX,KAAKiH,KAAK0Q,OAAOF,EAAOxX,IAEpBD,KAAK2W,yBACRF,EAAKpa,SACLoa,EAAOzW,KAAK2W,uBAAuBC,gBAAgB,CAClDC,MAAO,CACNC,OAAQ,UACRC,SAAU,WAAWrZ,KAEpBwZ,IAAK,MAGV,CClGO,SAASU,KAASnM,GAGxB,OAFAA,EAAQA,EAAMnO,QAAOsO,KAAUA,KACd3K,KAAK,IAEvB,CAEO,SAAS4W,EAAqBtT,GACpC,IAAIA,EACH,MAAO,GAER,IAAIkH,EAAQlH,EAAKQ,MAAM,KAEvB,OADA0G,EAAMzB,MACCyB,EAAMxK,KAAK,IACnB,CAEO,SAAS6W,EAAiBvY,GAChC,IAAIiI,EAAO,CACVvH,GAAID,KAAK+X,QACPvX,MAAOjB,EAAK7B,KACZF,UAAW+B,EAAK/B,UAChB+B,KAAMA,EACNyY,QAAQ,GAGPP,EAASzX,KAAKiY,MAAMjY,KAAK6X,qBAAqBtY,EAAKmX,UASvD,OARA1W,KAAKiY,MAAM1Y,EAAKmX,SAAWlP,EAEvBiQ,IACHjQ,EAAKK,SAAW4P,EAAOxX,GACvBuH,EAAKjD,KAAOhF,EAAKmX,SAGlBnX,EAAKgF,KAAOiD,EAAKjD,KACViD,CACR,CAEO,SAAS0Q,EAAqBla,GACpC,IAAIma,EAAa,IAAIjF,IACrB,GAAIlV,EAAQd,SACX,IAAK,IAAIkb,KAAcpa,EAAQd,SAC9Bib,EAAWvc,IAAIwc,EAAWnZ,UAI3BkZ,EAAWvc,IAAIoC,EAAQiB,KAGxB,IAAIoD,EAAS/D,MAAMC,KAAK4Z,GAAY7a,QAAO8B,KAAUA,IAKrD,OAJAiD,EAAOgW,MAAK,CAACC,EAAGC,IACRD,EAAE3a,cAAc6a,cAAcD,EAAE5a,iBAGjC0E,CACR,CAEO,SAASoW,EAAgBza,GAC/B,IAAI0a,EAAM,IACNC,EAAM,EACV,GAAI3a,EAAQd,SACX,IAAK,IAAIkb,KAAcpa,EAAQd,SAAU,CACxC,IAAI6B,EAAOqZ,EAAW7Y,KAAKqZ,KAAK7Z,KAC5BA,EAAO4Z,IACVA,EAAM5Z,GAEHA,EAAO2Z,IACVA,EAAM3Z,EAER,KAEI,CACJ,IAAIA,EAAOf,EAAQuB,KAAKqZ,KAAK7Z,KACzBA,EAAO4Z,IACVA,EAAM5Z,GAEHA,EAAO2Z,IACVA,EAAM3Z,EAER,CACA,MAAO,CAAC2Z,EAAKC,EACd,CAEO,SAASE,EAAWxb,GAK1B,OAJAA,EAAMgb,MAAK,CAACS,EAAKC,IACTD,EAAIpC,QAAQ/Y,cAAc6a,cAAcO,EAAIrC,QAAQ/Y,iBAGrDN,CACR,CAEO,SAAS2b,EAAiBF,EAAKC,GACrC,OAAOD,EAAI/a,SAASJ,cAAc6a,cAAcO,EAAIhb,SAASJ,cAC9D,CAEO,SAASsb,EAAiBvb,GAChC,OAAOA,EAAKqH,MAAM,KAAK9D,KAAK,KAAK8D,MAAM,MAAM9D,KAAK,IACnD,CAGO,SAASiY,EAAa3Z,GAC5B,QAAKA,EAAK2F,KAAKiU,WAAW,aAGtB5Z,EAAK2F,KAAKJ,SAAS,SAAWvF,EAAK2F,KAAKJ,SAAS,QAAUvF,EAAK2F,KAAKJ,SAAS,QAInF,CAEO,SAASsU,EAAY3T,EAAKzC,GAC1ByC,KAAOzF,OACZA,KAAKyF,GAAOzC,EAEd,CAEO,SAASqW,EAAY9Z,GAC3B,IAAIkX,EASJ,OARIzW,KAAK2W,yBACRF,EAAOzW,KAAK2W,uBAAuBC,gBAAgB,CAClDC,MAAO,CACNC,OAAQ,UACRC,SAAU,aAAaxX,EAAK7B,WAIxB+Y,CACR,CC5HO,MAAM6C,UAAmB,EAC/B,WAAA7Q,CAAY1I,GACX6U,MAAMpW,OAAO4B,OAAO,CAAC,EAAGL,EACvB,CACCM,GAAI,CACH,UAAW,KACVL,KAAK0G,WACE,GAER,QAAS,KACR1G,KAAK0G,WACE,GAER,cAAe,KACd1G,KAAK0G,WACE,MAMZ,CAEA,UAAMtF,GAOL,OANApB,KAAKiW,QAAU,IAAI1T,SAAQ,CAACmE,EAASC,KACpC3G,KAAK0G,QAAUA,EACf1G,KAAK2G,OAASA,KAEfiO,MAAMxT,OAECpB,KAAKiW,OACb,E,aC9BM,SAASsD,EAAgBrX,EAAKiU,GACpC,IAAIxD,EAAYwD,EAASJ,aAAa,mBACtC/V,KAAKwZ,uBAAuB7G,EAC7B,CAEO,SAAS6G,EAAuB7G,GACtC,IAAI8G,EAAczZ,KAAKqI,GAAGxH,cAAc,iBAC1B,IAAIb,KAAKqI,GAAGxH,cAAc,eAAe0S,iBAAiB,WAAWnV,KAAI2C,GAAUA,EAAOgV,aAAa,qBAC7GnX,SAAQQ,IACfqa,EAAY9d,UAAUU,OAAO+C,EAAI,IAElCqa,EAAY9d,UAAUC,IAAI+W,EAC3B,CAEO,SAAS+G,EAAYxX,EAAKiU,GAChCvU,YAAW,KACV,IAAIoB,EAAQhD,KAAKqI,GAAGxH,cAAc,mBAAmBmC,MACjD2W,EAAc3Z,KAAKqI,GAAGkL,iBAAiB,qCAC3C,IAAK,IAAIvV,KAAW2b,EACnB3b,EAAQrC,UAAUU,OAAO,UACrB2G,IACHA,EAAQA,EAAMrF,eACKK,EAAQA,QAAQD,SAASJ,cAAgBK,EAAQA,QAAQma,WAAW/Z,KAAIa,GAAOA,EAAItB,gBAAesD,QACpG/E,QAAQ8G,GAAS,GACjChF,EAAQrC,UAAUC,IAAI,WAIzBoE,KAAK4Z,eAAc,GAErB,CAEO,SAASC,EAAY3X,EAAKiU,GAChCnW,KAAKqI,GAAGxH,cAAc,mBAAmBmC,MAAQ,GACjDhD,KAAK0Z,aACN,CAEO,SAASI,EAAc5X,EAAKiU,GAClC,IAAI4D,EAAkB/Z,KAAKqI,GAAGkL,iBAAiB,8CAC/C,IAAKrR,EAAI8X,UAAY9X,EAAI+X,SACxB,IAAK,IAAI7D,KAAO2D,EACf3D,EAAIza,UAAUU,OAAO,YAIvB,GAAI6F,EAAI+X,SAAU,CACjB,IAAIC,EAAM/D,EACV,EAAG,CACF,GAAI+D,EAAIve,UAAUgY,SAAS,YAC1B,MAEDuG,EAAIve,UAAUC,IAAI,YAClBse,EAAMA,EAAIC,sBACX,OACOD,EACR,MAEC/D,EAASxa,UAAUye,OAAO,YAI3B,IAAIhE,EAAMpW,KAAKqW,mBACfrW,KAAKoX,QAAQ9O,KAAK,SAAU,CAC3BpD,KAAM,SACJiR,SAAUC,GAEd,CAIO,SAASiE,EAAmBnY,EAAKiU,GACvC,IACInY,EADYmY,EAASmE,QAAQ,uBACTtc,QAEpBX,EAAQ2C,KAAKua,wBAAwBvc,GAErC/B,EAAU,4CACV+B,EAAQwc,gBACXve,GAAW,qEACgB+B,EAAQwc,iCAIpCve,GAAW,wBACX,IAAK,IAAIsD,KAAQlC,EAChBpB,GAAW,gCAAkC,EAAyB+D,KAAKya,gBAAgBlb,EAAKmb,YAAc,KAC9Gze,GAAW,EAAyBsD,EAAK7B,MAAQ,UAAYsC,KAAK2a,aAAapb,EAAKqZ,KAAK7Z,MACzF9C,GAAW,QAEZA,GAAW,QAEXA,GAAW,SAEE,IAAIqd,EAAW,CAC3BnY,MAAO,iBAAmBnD,EAAQD,SAChClC,KAAMI,EACNqE,QAAS,CACV,CACCC,QAAS,yBACTC,MAAO,SAIQY,OACboB,MAAK0D,UAET,GAEF,CAEO,SAAS0T,IACf,IAAIgB,EAAY,EACZC,EAAe,EACfC,EAAY,EACZC,EAAY,EACZpB,EAAc3Z,KAAKqI,GAAGkL,iBAAiB,qCAC3C,IAAK,IAAIvV,KAAW2b,EACf3b,EAAQrC,UAAUgY,SAAS,YAG/BkH,IAEI7c,EAAQA,QAAQd,SACnBc,EAAQA,QAAQd,SAAS0B,SAAQZ,IAChC4c,IACAE,GAAa9c,EAAQuB,KAAKqZ,KAAK7Z,SAKhC6b,IACAE,GAAa9c,EAAQA,QAAQuB,KAAKqZ,KAAK7Z,KACvCgc,MAGF/a,KAAKqI,GAAGxH,cAAc,gBAAgBwR,UAAY,GAAGwI,aAAwBD,aAAqB5a,KAAK2a,aAAaG,MAChHD,EAAe7a,KAAKgb,iBACvBhb,KAAKwZ,uBAAuB,aAE7BxZ,KAAKqI,GAAGxH,cAAc,eAAelF,UAAUU,OAAO,UAClDwe,EAAeE,EAAY/a,KAAKib,cACnCjb,KAAKqI,GAAGxH,cAAc,eAAelF,UAAUC,IAAI,SAErD,CAEO,SAASsf,IACflb,KAAKqI,GAAGxH,cAAc,gBAAgBwR,UAAY,GAC/BrS,KAAKqI,GAAGxH,cAAc,iBAC5BwR,UAAY,0DACzBrS,KAAKqI,GAAGxH,cAAc,eAAelF,UAAUC,IAAI,SACpD,CCxJO,SAASuf,IACf,MAAO,iBACR,CAEOjV,eAAekV,EAAWlZ,EAAKiU,GACrC,IAAIkF,EAAa,UACbC,EAAapZ,EAAIE,OAAOkY,QAAQ,cAChCgB,IACCA,EAAW3f,UAAUgY,SAAS,iBACjC0H,EAAa,SAELC,EAAW3f,UAAUgY,SAAS,eACtC0H,EAAa,cAIfrb,KAAKub,mBACLrZ,EAAIsZ,iBACJ,IAAIne,QAAc2C,KAAKyb,mBAAmBvZ,GAC1ClC,KAAK0b,YAAYre,EAAO,CAAEge,cAC3B,CAEO,SAASM,EAAezZ,GAC9B,IAAI0Z,GAAW,EAOf,OANI1Z,EAAI2Z,cACgC,WAAnC3Z,EAAI2Z,aAAaC,MAAM,GAAGC,OAC7BH,GAAW,GAINA,CACR,CAEO,SAASI,EAAU9Z,EAAKiU,GAChBnW,KAAK2b,eAAezZ,KAEjClC,KAAKic,YACLjc,KAAKqI,GAAGxH,cAAcb,KAAKmb,wBAAwBxf,UAAUC,IAAI,iBAEnE,CACO,SAASsgB,EAAUha,EAAKiU,GAC1BnW,KAAK2b,eAAezZ,KACvBlC,KAAKic,YACiB,GAAlBjc,KAAKic,WACRjc,KAAKub,mBAGR,CACO,SAASY,EAASja,EAAKiU,GAC7BjU,EAAIsZ,gBACL,CAEO,SAASD,IACfvb,KAAKic,UAAY,EACjB,IAAIjc,KAAKqI,GAAGkL,iBAAiB,mBAAmB3U,SAAQwd,GAASA,EAAMzgB,UAAUU,OAAO,kBACzF,CAEO6J,eAAemW,EAAYna,GAC7BlC,KAAKsc,qBAGTpa,EAAIsZ,iBACAtZ,EAAIqa,eAAiBra,EAAIqa,cAAclf,OAAS6E,EAAIqa,cAAclf,MAAMqB,OAAS,GACpFsB,KAAK0b,YAAYxZ,EAAIqa,cAAclf,MAAO,CAAEge,WAAY,WAE1D,CChEO,SAASmB,EAAgBta,EAAKiU,GACvB,IAAIb,EAAiB,CACjCnU,MAAO,mBACLtF,KAAM,oEAESuF,OACboB,MAAK0D,UACT,GAAIO,EAAM,CACT,IAAIgW,EAAgBzc,KAAKsX,YAAY/X,KAAKmX,QAAU,IAAMjQ,EAAK/I,WACzDsC,KAAKgX,KAAK0F,MAAMD,GACtB,IAAIld,QAAaS,KAAKgX,KAAK2F,gBAAgBF,GACvCjV,EAAOxH,KAAK8X,iBAAiBvY,GACjCS,KAAKiH,KAAKlH,QAAQsG,OAAOiC,KAAK,OAAQd,GACtC,IAAI0S,EAAMla,KAAKiH,KAAKkP,WAChB+D,GACHla,KAAKiH,KAAK2V,OAAO1C,EAAIja,GAEvB,IAGF,C,aCde,SAAS4c,GAAc/N,GACrC,IAAIA,GAAsB,iBAARA,EACjB,OAAOA,EAGR,IAAIgO,EAAQ,IAAIhO,GAChBA,EAAM,GACN,IAAI,IAAIjB,EAAI,EAAGA,EAAIiP,EAAMpe,OAAQmP,IAChCiB,GAAOgO,EAAMjP,GACVA,EAAI,IAAO,IACbiB,GAAO,SAKT,OAtBD,SAAsBiO,EAAMjO,GAC3B,IAAK,IAAIkO,IAmBU,CAAC,KAlBnBlO,EAAMA,EAAI/J,MAAMiY,GAAG/b,KAAK,QAAU+b,GAEnC,OAAOlO,CACR,CAeOmO,CAAa,EAAOnO,EAG3B,CCpBO,SAASoO,GAAoB1d,GACnC,IAAItC,EAAW,EAASsC,EAAKgJ,UACzB2U,EAAgB3e,OAAOG,OAAOzB,GAE9BkgB,EAAO,GACX,IAAK,IAAIpf,KAAWmf,EACnBC,EAAK/e,QAAQ2B,KAAKua,wBAAwBvc,GAASI,KAAIJ,GAAWA,EAAQN,QAG3E,IAAI2f,EAAoB7d,EAAKgJ,SAASlL,QAAO8B,IACpCge,EAAKtY,SAAS1F,EAAK1B,QAE1BJ,QAAO8B,IAASA,EAAK5B,YAGvB,IAAK,IAAID,KAAS4f,EACjB5f,EAAM+f,cAAgB,QAClB/f,EAAMN,UACTM,EAAMggB,UAAYvd,KAAKwd,iBAAiBjgB,EAAMN,QAAQsC,MACtDhC,EAAMid,cAAgB,EAAyBjd,EAAMggB,YAIvD,IAAKvd,KAAKyd,WACT,IAAK,IAAIle,KAAQ8d,EAAmB,CACnC,IAAI7d,EAAO,CACVD,KAAMA,EACJ+d,cAAe,eAEd5f,EAAO6B,EAAK7B,KAChB8B,EAAKP,IAAMvB,EAAKmB,UAAUnB,EAAKoB,YAAY,KAAO,GAClDU,EAAKzB,SAAWL,EAAKmB,UAAU,EAAGnB,EAAKoB,YAAY,MACnDqe,EAAc9e,KAAKmB,EACpB,CAKD,IAAK,IAAIJ,KAAQ+d,EAChB/d,EAAK+Y,WAAanY,KAAKkY,qBAAqB9Y,GAC5CA,EAAKse,MAAQ1d,KAAKyY,gBAAgBrZ,GAC9BA,EAAKse,MAAM,IAAMte,EAAKse,MAAM,GAC/Bte,EAAKL,KAAOiB,KAAK2a,aAAavb,EAAKse,MAAM,IAGzCte,EAAKL,KAAOiB,KAAK2a,aAAavb,EAAKse,MAAM,IAAM,MAAQ1d,KAAK2a,aAAavb,EAAKse,MAAM,IAErFte,EAAKue,aAAed,GAAc,EAAyBzd,EAAKrB,WAIjE,OADAof,EAAc9E,KAAKrY,KAAKgZ,kBACjBmE,CACR,CAEOjX,eAAeuV,GAAmBvZ,GACxC,IAAI7E,EAAQ,GAGZ,GAAI6E,EAAI2Z,aAAaC,MAAO,CAC3B,IAAI8B,EAAa,GACjB,IAAI1b,EAAI2Z,aAAaC,OAAOld,SAAQ,CAACQ,EAAMyO,KAC1C+P,EAAWvf,KAAKe,EAAI,IAErB,IAAK,IAAIA,KAAQwe,EAChB,GAAkB,SAAdxe,EAAK2c,KACR,GAAI3c,EAAKye,iBAAkB,CAC1B,IAAIC,EAAQ1e,EAAKye,mBACjB,GAAIC,EAAO,CAEV,GAAIA,EAAMC,YACT,SAWA1gB,EAAMgB,KAAKe,EAAK4e,YAGlB,CACD,MAEC3gB,EAAMgB,KAAKe,EAAK4e,kBAGT5e,aAAgB6e,MAExB5gB,EAAMgB,KAAKe,EAGd,KACC,IAAI8C,EAAI2Z,aAAaxe,OAAOuB,SAAQ,CAACW,EAAMsO,KAC1CxQ,EAAMgB,KAAKkB,EAAI,IAGjB,OAAOlC,CACR,CAEO,SAASkd,GAAwBvc,GACvC,IAAIX,EAAQ,GAWZ,OAVIW,EAAQd,SACXG,EAAMgB,QAAQL,EAAQd,SAASkB,KAAIJ,GAAWA,EAAQuB,QAGtDlC,EAAMgB,KAAKL,EAAQuB,MAEhBvB,EAAQE,gBACXb,EAAMgB,KAAKL,EAAQE,gBAGbb,CACR,CAEO,SAASmgB,GAAiBje,GAChC,OAAOS,KAAKya,gBAAgBlb,EAAKmb,UAClC,CASO,SAASD,GAAgByD,GAC/B,OARD,SAAwBnB,EAAMmB,GAC7B,IAAK,IAAIlB,IAOa,CAAC,IAAK,IAAK,IAAK,IAAM,IAAK,IAAK,IAAK,IAAK,IAAK,KANpEkB,EAAMA,EAAInZ,MAAMiY,GAAG/b,KAAKkd,mBAAmBnB,IAE5C,OAAOkB,CACR,CAGQE,CAAe,EAAqDF,EAC5E,CAGO,SAAS7H,KACf,IAAIhU,EAAS,CACZ8U,MAAO,GACLja,SAAU,GACVG,MAAO,GACPiZ,MAAO,IAENyD,EAAkB/Z,KAAKqI,GAAGkL,iBAAiB,8CAC/C,GAAIwG,EAAgBrb,OAAS,EAAG,CAC/B,IAAK,IAAI0X,KAAO2D,EACf1X,EAAO8U,MAAM9Y,KAAK+X,GAClB/T,EAAOnF,SAASmB,KAAK+X,EAAIpY,SACzBqE,EAAOhF,MAAMgB,QAAQ2B,KAAKua,wBAAwBnE,EAAIpY,UAEvD,IAAIsY,EAAQjU,EAAOhF,MAAMe,KAAImB,GAAQA,EAAK7B,OAC1C2E,EAAOiU,MAAMjY,QAAQiY,EACtB,CAEA,OAAOjU,CACR,CAEO,SAASgc,GAA8BH,GAI7C,OAH0B,GAAvBA,EAAI/E,WAAW,OACjB+E,EAAM,IAAMA,GAENA,CACR,CAEOhY,eAAeoY,GAAeC,GAKpC,GAJIA,IACHA,EAAgBve,KAAKqW,oBAGc,GAAjCkI,EAAcrhB,SAASwB,OACzB,OAGD,IACI8f,EADAxgB,EAAUugB,EAAcrhB,SAAS,GAGpCshB,EADExgB,EAAQb,QACDa,EAAQb,QAAQoC,KAGhBvB,EAAQuB,KAGlB,IAAImV,EAAO1U,KAAKqe,8BAA8BG,EAAO9H,SAErD,GAAG1Y,EAAQE,eAAgB,CAC1B,IAAIugB,QAAgBze,KAAKgX,KAAK0H,KAAK1gB,EAAQE,eAAewY,SAC1D,IACC,IAAIjQ,EAAOyB,KAAKyW,MAAMF,GACtB/J,GAAQ1U,KAAK4e,0BAA0BnY,EACxC,CACA,MAAMnB,GAEN,CACD,CAEA,OAAOoP,CAER,CAEO,SAASkK,GAA0BnY,GACzC,IAAIyX,EAAM,GACNR,EAAQjX,EAAKoY,YAAY9Z,MAAM,KAOnC,OANAmZ,GAAO,wBAAwBR,EAAM,aAAaA,EAAM,KAErDjX,EAAKqY,UACPZ,GAAO,QAAUC,mBAAmB1X,EAAKqY,UAGnCZ,CACR,CC9Me,SAASa,GAAcxf,GACrC,IAAI7B,EACe,iBAAT6B,EACT7B,EAAO6B,EAEAA,aAAgB0e,OACvBvgB,EAAO6B,EAAK7B,MAGb,IAAI+N,EAAQ/N,EAAKqH,MAAM,KAEpB0G,EAAM/M,OAAS,GACjB+M,EAAMzB,MAEPtM,EAAO+N,EAAMxK,KAAK,KAClBvD,EAAOA,EAAKpC,QAAQ,QAAS,IAC7BoC,EAAOA,EAAKpC,QAAQ,OAAQ,IAC5BoC,EAAOA,EAAKpC,QAAQ,OAAQ,IAC5BoC,EAAOA,EAAKpC,QAAQ,MAAO,IAE3B,IAAIwhB,EAAQ,CAACpf,EAAKmB,UAAU,EAAG,IAC/B,IAAI,IAAImgB,KAAQthB,EAAKmB,UAAU,GAC3BmgB,EAAK/Z,MAAM,UACb6X,EAAMze,KAAK,KAEZye,EAAMze,KAAK2gB,GASZ,OAPAthB,EAAOof,EAAM7b,KAAK,IAElBvD,EAAOA,EAAKC,cACZD,EAAOA,EAAKpC,QAAQ,qBAAsB,KAC1CoC,EAAOA,EAAKpC,QAAQ,OAAQ,KAGrBoC,CACR,CClCewI,eAAe+Y,GAAYxY,GACzC,OAAO,IAAIlE,SAAQ,CAACmE,EAASC,KAC5B,IAAIuY,EACAC,EACJ,GAAI1Y,aAAgB2Y,MACnBF,EAAazY,OAET,GAAoB,iBAATA,EACfyY,EAAa,IAAIE,MACjBF,EAAWG,IAAM5Y,MAGb,CAEJ,IAAI6Y,EAAY,IAAIC,KAAK,CAAC9Y,IAC1B0Y,EAAYK,IAAIC,gBAAgBH,GAEhCJ,EAAa,IAAIE,MACjBF,EAAWG,IAAMF,CAClB,CAEA,SAASO,IACJP,GACHK,IAAIG,gBAAgBR,GAErBzY,EAAQwY,EACT,CACIA,EAAWU,SACdF,IAIAR,EAAW5iB,iBAAiB,QAAQ,KACnCojB,GAAO,GAET,GAGF,CCzCexZ,eAAe2Z,GAAYC,GACzC,SAAEC,EAAW,KAAI,QAAEC,EAAU,GAAE,aAAEC,EAAe,aAAgB,CAAC,GACjE,OAAO,IAAI1d,SAAQ2D,MAAOQ,EAASC,KAElC,IACC,IAAIuZ,QAAkBjB,GAAYa,GAC9BK,EAAQD,EAAUE,aAAeL,EACjC/d,EAAYke,EAAUG,cAAgBF,EAE1C,IAAIG,EAAe7kB,SAASC,cAAc,UAC1C4kB,EAAaC,MAAQR,EACrBO,EAAaE,OAASxe,EAEtB,IAAIye,EAAMH,EAAaI,WAAW,MAClCD,EAAIE,UAAU,EAAG,EAAGL,EAAaC,MAAOD,EAAaE,QACrDC,EAAIG,UAAUV,EAAW,EAAG,EAAGI,EAAaC,MAAOD,EAAaE,QAGhEF,EAAaO,QAAQC,IACpBpa,EAAQoa,EAAI,GACVb,EAAcD,EAClB,CAAE,MAAO1a,GACJgC,SAAWA,QAAQC,KACtBD,QAAQC,IAAI,yBAA2BjC,GAExCqB,EAAOrB,EACR,IAEF,CC7BeY,eAAe6a,GAActa,GAC3C,IAAIzH,QAAYigB,GAAYxY,GAC5B,MAAO,CACN8Z,MAAOvhB,EAAIohB,aACTI,OAAQxhB,EAAIqhB,cAIhB,CCTA,IAAIW,GAAQ,CACX,YAAa,MACX,aAAc,MACd,YAAa,MACb,aAAc,QAIF,SAASC,GAAaC,GACpC,OAAIA,KAAQF,GACJA,GAAME,GAGJA,EAAKnc,MAAM,KAAKiF,KAE3B,CCXA,IAAImX,GAAW,aAEAjb,eAAekb,GAAa3a,GAC1C,mBACC4a,EAAqB,KACrB,QAAErB,EAAU,GACZ,aAAEC,EAAe,YACjB,mBAAEqB,GAAqB,EACvB,aAAEC,EACF,QAAEzC,GACC,CAAC,GAEL,IAAI0C,QAAevC,GAAYxY,GAC3Bgb,QAAcV,GAAcS,GAC5BrB,EAAQsB,EAAMlB,MAAQkB,EAAMjB,OAE3Be,IACJA,EAAe,IAAM,IAAIrhB,MAAOC,WAE5BkhB,IAEHA,EADGC,EACkBG,EAAMlB,MAAQ,EAGdkB,EAAMlB,OAG7B,IAAImB,EAA0C,EAArBL,EAErBM,EAAW,CACd,MAAOD,EACL,GAAIL,EACJ,QAASjN,KAAKC,MAAMgN,EAAqB,GACzC,WAAYjN,KAAKC,MAAMgN,EAAqB,IAG3ChkB,EAAQ,CAAC,EAEb,IAAK,IAAIoI,KAAOjH,OAAOC,KAAKkjB,GAAW,CACtC,IAAIpB,EAAQoB,EAASlc,GACjBgB,QAAaoZ,GAAY2B,EAAQ,CACpCzB,SAAUQ,EACRP,QAASA,EACTC,aAAcA,IAEjB5iB,EAAMkkB,EAAe9b,EAAM,IAAMwb,GAAahB,IAAiBxZ,EAE/DA,QAAaoZ,GAAY2B,EAAQ,CAChCzB,SAAUQ,EACRP,QAASA,EACTC,aAAckB,KAEjB9jB,EAAMkkB,EAAe9b,EAAM,IAAMwb,GAAaE,KAAa1a,CAC5D,CAGA,IAAIjH,EAAO,CACV,KAAQ+hB,EACR,KAAQG,EAAqB,IAAOA,EAAqBvB,EACzD,YAAekB,EAAqB,IAAOA,EAAqBlB,EAChE,SAAYc,GAAahB,GACzB,QAAWnB,GAAWyC,GAMvB,OAFAlkB,EAAMkkB,EAAe,SAAWrZ,KAAKC,UAAU3I,EAAM,KAAM,MAEpDnC,CAER,CCpEe,SAASukB,GAAUriB,GACjC,IAAI7B,EACe,iBAAT6B,EACT7B,EAAO6B,EAEAA,aAAgB0e,OACvBvgB,EAAO6B,EAAK7B,MAGb,IAAI2E,EAAS,CAAC0c,GAAcrhB,IAExB+N,EAAQ/N,EAAKqH,MAAM,KAKvB,OAJG0G,EAAM/M,OAAS,GACjB2D,EAAOhE,KAAKoN,EAAMzB,OAGZ3H,CACR,CCfO6D,eAAe2b,GAAuBtiB,GAC5C,IAAIgiB,EAAexC,GAAcxf,GAC7BkiB,QCDUvb,eAAiC3G,GAC/C,IAAIiiB,QAAevC,GAAY1f,GAC3BkiB,QAAcV,GAAcS,GAIhC,OAHAC,EAAMtB,MAAQsB,EAAMlB,MAAQkB,EAAMjB,OAClCiB,EAAMxiB,IAAMgiB,GAAa1hB,EAAK2F,MAEvBuc,CACR,CDNmBK,CAAkBviB,GAEhCkH,EAAO,CACVsb,WAAYxiB,EAAK7B,KACfA,KAAM6jB,EACNtB,aAAc1gB,EAAK2F,KACnBuc,MAAOA,EACPlB,MAAOnM,KAAKC,MAAMoN,EAAMlB,MAAQ,IAU/B/J,EANS,IAAIlB,EAAiB,CACjCnU,MAAO,cACLtF,KAAMiY,EAAsBrN,GAC5BA,KAAMA,EACNvF,iBAAkB,sCAEHE,OACdiB,QAAemU,EAEnB,GAAInU,EAAQ,CACX,IAYI2f,EAZAC,EAAgB,CACnBV,aAAclf,EAAO3E,KACnBuiB,aAAc5d,EAAO4d,aACrBoB,mBAAoBa,SAAS7f,EAAOke,OACpCP,QAAS1L,WAAWjS,EAAO2d,SAC3BlB,QAASzc,EAAOyc,SAGfrI,EAAOzW,KAAKqZ,YAAY9Z,GACxBlC,QAAc+jB,GAAa7hB,EAAM0iB,GACjCE,EAAOja,KAAKyW,MAAMthB,EAAM4kB,EAAcV,aAAe,UAGzD,IAAK,IAAIa,KAAY5jB,OAAOC,KAAKpB,GAAQ,CACxC,IAAIkH,QAAavE,KAAKqiB,YAAYD,EAAU/kB,EAAM+kB,IAC/CA,IAAaD,EAAKzkB,KAAO,IAAMykB,EAAKG,WACtCN,EAAUzd,EAEZ,CAEA,IAAImQ,EAAO1U,KAAKqe,8BAA8B2D,GAS9C,OANAtN,GADU1U,KAAK4e,0BAA0BuD,GAGrC1L,GACHA,EAAKpa,SAGCqY,CACR,CACD,CAEOxO,eAAeqc,GAAkBhjB,GACvC,IAAIkM,EAAQmW,GAAUriB,GAElBkH,EAAO,CACVsb,WAAYxiB,EAAK7B,KACfA,KAAM+N,EAAMxK,KAAK,MAUhBuV,EANS,IAAIlB,EAAiB,CACjCnU,MAAO,cACLtF,KAAMkY,EAAqBtN,GAC3BA,KAAMA,EACNvF,iBAAkB,sCAEHE,OACdiB,QAAemU,EAEnB,GAAInU,EAAQ,CACX,IAAIoU,EAAOzW,KAAKqZ,YAAY9Z,GAExByiB,QAAgBhiB,KAAKqiB,YAAYhgB,EAAO3E,KAAM6B,GAC9CmV,EAAO1U,KAAKqe,8BAA8B2D,GAK9C,OAHIvL,GACHA,EAAKpa,SAECqY,CACR,CACD,CAEOxO,eAAesc,GAA0BjjB,GAC/C,IAUIyiB,EAVAvL,EAAOzW,KAAKqZ,YAAY9Z,GAExBgiB,EADQK,GAAUriB,GACG,GAErBlC,QAAc+jB,GAAa7hB,EAAM,CACpCgiB,aAAcA,EACdtB,aAAc1gB,EAAK2F,OAEhBid,EAAOja,KAAKyW,MAAMthB,EAAMkkB,EAAe,UAG3C,IAAK,IAAIa,KAAY5jB,OAAOC,KAAKpB,GAAQ,CACxC,IAAIkH,QAAavE,KAAKqiB,YAAYD,EAAU/kB,EAAM+kB,IAC/CA,IAAaD,EAAKzkB,KAAO,IAAMykB,EAAKG,WACtCN,EAAUzd,EAEZ,CACA,IAAImQ,EAAO1U,KAAKqe,8BAA8B2D,GAO9C,OALAtN,GADU1U,KAAK4e,0BAA0BuD,GAGrC1L,GACHA,EAAKpa,SAECqY,CACR,CAEOxO,eAAewV,GAAYre,GAAO,WAAEge,GAAe,CAAC,GAC1D,IAAIoH,EAAqB,GACzB,IAAK,IAAIljB,KAAQlC,EAAO,CAEvB,IAAIqlB,GAAW,EACf,GAAmB,WAAfrH,GAA2Brb,KAAKkZ,aAAa3Z,GAChDmjB,QAAiB1iB,KAAK6hB,uBAAuBtiB,QAEzC,GAAmB,WAAf8b,EACRqH,QAAiB1iB,KAAKuiB,kBAAkBhjB,QAEpC,GAAmB,cAAf8b,GAA8Brb,KAAKkZ,aAAa3Z,GACxDmjB,QAAiB1iB,KAAKwiB,0BAA0BjjB,OAE5C,CACJ,IACIgF,EADAkS,EAAOzW,KAAKqZ,YAAY9Z,GAE5B,GAAmB,cAAf8b,EAA4B,CAC/B,IAAI5P,EAAQmW,GAAUriB,GACtBgF,QAAavE,KAAKqiB,YAAY5W,EAAMxK,KAAK,KAAM1B,EAChD,MAECgF,QAAavE,KAAKqiB,YAAY9iB,EAAK7B,KAAM6B,GAE1CmjB,EAAW1iB,KAAKqe,8BAA8B9Z,GAE1CkS,GACHA,EAAKpa,QAEP,CACI2D,KAAK2W,wBAA0B+L,GAClC1iB,KAAK2W,uBAAuBC,gBAAgB,CAC3CC,MAAO,CACNC,OAAQ,UACRC,SAAU,YAAYxX,EAAK7B,QAE1BwZ,IAAK,MAGTuL,EAAmBpkB,KAAKqkB,EACzB,CAMA,OALA1iB,KAAK2iB,eAAe3iB,KAAKsX,aACzBtX,KAAKoX,QAAQ9O,KAAK,SAAU,CAC3BpD,KAAM,SACJ0d,WAAYH,IAERA,CACR,CAGO,SAASI,GAAkB3gB,EAAKiU,GACtCnW,KAAKqI,GAAGxH,cAAcb,KAAK8iB,oBAAoBC,OAChD,CAEO7c,eAAe8c,GAAY9gB,EAAKiU,GACtCjU,EAAIsZ,iBACJ,IAAIyH,EAAQjjB,KAAKqI,GAAGxH,cAAcb,KAAK8iB,oBACvC5gB,EAAI2Z,aAAe,CAClBxe,MAAO4lB,EAAM5lB,OAEd,IAAIA,QAAc2C,KAAKyb,mBAAmBvZ,GAC1C,GAAG7E,EAAMqB,OAAS,EAAG,CACpB,IAAI2D,EAASrC,KAAK0b,YAAYre,EAAO,CAAEge,WAAY,WAEnD,OADA4H,EAAMjgB,MAAQ,GACPX,CACR,CACD,CE5LO6D,eAAemc,GAAY3kB,EAAM+I,GACvC,IAAIlC,EAAOvE,KAAKsX,YAAY/X,KAAKmX,QAAU,IAAM1W,KAAKiZ,iBAAiBvb,GAEvE,aADMsC,KAAKgX,KAAKrK,MAAMpI,EAAMkC,GACrBlC,CACR,CAEO2B,eAAegd,KACrB,OAAO,IAAI3gB,SAAQ,CAACmE,EAASC,KAC5B,IAAIwc,EAAU,GACV9R,EAASrR,KAAKgX,KAAKoM,KAAK,CAC3B7jB,MAAM,IAEP8R,EAAOhR,GAAG,QAASjB,IAClB+jB,EAAQ9kB,KAAKe,EAAI,IAElBiS,EAAOhR,GAAG,QAAQ,KACjBqG,EAAQyc,EAAO,GACf,GAEH,CCEe,MAAME,WAAyB/R,EAgB7C,WAAA7I,CAAY1I,GACX6U,MAAM7U,GACNC,KAAKoZ,YAAY,YAAa,GAC9BpZ,KAAKoZ,YAAY,UAAW,IAAI,GAChCpZ,KAAKoZ,YAAY,qBAAsB,4BACvCpZ,KAAKoZ,YAAY,kBAAmB,KACpCpZ,KAAKoZ,YAAY,eAAgB,IAClC,CAEA,aAAAvH,GACC7R,KAAK2S,UAAY,gBACjB3S,KAAK+X,MAAQ,EACb/X,KAAKiY,MAAQ,CAAC,EACdjY,KAAKqR,OAAS,CACb,0BAA2B,kBACzB,qBAAsB,oBACtB,6BAA8B,cAC9B,qBAAsB,aACtB,0BAA2B,kBAC3B,qCAAsC,qBACtC,+BAAgC,qBAChC,4BAA6B,gBAC7B,2BAA4B,kBAC5B,wBAAyB,cACzB,yBAA0B,cAC1B,sBAAuB,cACvB,cAAe,YACf,cAAe,YACf,aAAc,WACd,SAAU,cAEb5V,SAASa,iBAAiB,QAAS+f,EAAYhJ,KAAKrT,MACrD,CAIA,YAAMoI,GACLpI,KAAKqI,GAAGgK,UAAYuB,EAAkB5T,KAAK6W,OAC3C7W,KAAKyG,KAAO,GAEZzG,KAAKsjB,oBAAsBtjB,KAAKgX,KAAK2F,gBAAgB,IACrD3c,KAAKsjB,cAAc5lB,KAAO,QAC1B,IAAI6lB,EAAWvjB,KAAKujB,SAAWvjB,KAAK8X,iBAAiB9X,KAAKsjB,eAC1DtjB,KAAKyG,KAAKpI,KAAKklB,GAEf,IAAIC,QAAoBxjB,KAAKkjB,kBAC7BljB,KAAK6Y,WAAW2K,GAEhBxjB,KAAKyG,KAAKpI,QAAQmlB,EAAYplB,IAAI4B,KAAK8X,iBAAiBzE,KAAKrT,QAC7D,EAAgB,CACfoG,sBAAuB,IAAIpG,KAAKC,cAC9BwG,KAAMzG,KAAKyG,OACXjE,MAAKyE,IAoBP,GAnBAjH,KAAKiH,KAAOA,EACZA,EAAK5G,GAAG,UAAWmH,IAClBxH,KAAK2iB,eAAenb,EAAI,IAEzBP,EAAK5G,GAAG,YAAamH,IASpB,IAAIP,EAAOjH,KAAKqI,GAAGxH,cAAc,SACjCoG,EAAKlF,MAAMye,OAAS,YACpB5e,YAAW,KACVqF,EAAKlF,MAAMye,OAAS,SAClB,IAAG,IAEHxgB,KAAKyjB,mBACR,IAAK,IAAIjc,KAAQhJ,OAAOG,OAAOqB,KAAKiH,KAAKgR,OACxC,GAAIzQ,EAAKjI,MAAQiI,EAAKjI,KAAKmX,SAAWlP,EAAKjI,KAAKmX,SAAW1W,KAAKyjB,kBAAmB,CAClFxc,EAAK0Q,OAAOnQ,EAAKvH,IACjB,KACD,OAIDgH,EAAK0Q,OAAO,EACb,GAEF,CAEA,oBAAMgL,CAAenb,GACpBxH,KAAKsX,YAAc9P,EACnBxH,KAAKkb,gBACL,IAAIwI,EAAe1jB,KAAKqI,GAAGxH,cAAc,iBACrCrB,QAAaQ,KAAKgX,KAAK2F,gBAAgBnV,EAAKjI,KAAKmX,SACjDyG,EAAgBnd,KAAKkd,oBAAoB1d,GAG1C2d,EAAcze,OAASsB,KAAKgb,iBAC9Bhb,KAAKwZ,uBAAuB,aAG7B,IAAIvd,EAAU,GACd,IAAK,IAAIsB,KAAS4f,EACjBlhB,GAAW4X,EAAiBtW,GAI7BmmB,EAAarR,UAAY,GACzBqR,EAAatnB,mBAAmB,YAAaH,GAE7C,IAAK,IAAI4R,EAAI,EAAGA,EAAI6V,EAAalb,SAAS9J,OAAQmP,IACjD6V,EAAalb,SAASqF,GAAG7P,QAAUmf,EAActP,GAElD7N,KAAKqI,GAAGxH,cAAc,eAAe8iB,UAAY,EACjD3jB,KAAK0Z,aACN,CAGAmI,uBAAyBA,GACzBU,kBAAoBA,GACpBC,0BAA4BA,GAC5B9G,YAAcA,GACdmH,kBAAoBA,GACpBG,YAAcA,GAGd9F,oBAAsBA,GACtBzB,mBAAqBA,GACrBlB,wBAA0BA,GAC1BiD,iBAAmBA,GACnB/C,gBAAkBA,GAClBpE,iBAAmBA,GACnBgI,8BAAgCA,GAChCC,eAAiBA,GACjBM,0BAA4BA,GAG5BpC,gBAAkBA,EAGlBrB,qBAAuBA,EACvBC,WAAaA,EACbO,eAAiBA,EACjBK,UAAYA,EACZE,UAAYA,EACZC,SAAWA,EACXE,YAAcA,EACdd,iBAAmBA,EAGnBhC,gBAAkBA,EAClBC,uBAAyBA,EACzBE,YAAcA,EACdG,YAAcA,EACdC,cAAgBA,EAChBO,mBAAqBA,EACrBT,cAAgBA,EAChBsB,cAAgBA,EAGhBjC,iBAAmBA,EACnBJ,WAAaA,EACbG,iBAAmBA,EACnBd,qBAAuBA,EACvBO,gBAAkBA,EAClBb,MAAQA,EACRC,qBAAuBA,EACvBC,iBAAmBA,EACnB6C,aAAe3G,EACfkF,aAAeA,EACfE,YAAcA,EACdC,YAAcA,EAGdnD,WAAaA,EACbmB,gBAAkBA,EAGlBgL,YAAcA,GACda,gBAAkBA,G,cC/MZ,IAAI,GAAmB,GACnB,GCEJ,cAA+B,EACrC,WAAAza,CAAY1I,GACX6U,MAAMpW,OAAO4B,OAAO,CACnBe,MAAO,gBACLtF,KAAM,8EACNoG,UAAW,SAAUR,EAAamiB,GAEnC,IAAIC,EAAapiB,EAAYZ,cAAc,sCAC3C,GAAIgjB,EAAY,CACf,IAAI9jB,EAAU,CACbiX,KAAM4M,EAAO5M,KACXyG,WAAYmG,EAAOnG,WACnB9G,uBAAwBiN,EAAOjN,uBAC/B8M,kBAAmBG,EAAOH,kBAC1BlN,qBAAsBqN,EAAOrN,sBAG5BuN,EAAmB9jB,KAAK8jB,iBAAmB,IAAIT,GAAiBtjB,GACjE6jB,EAAOpG,mBACTsG,EAAiBtG,iBAAmBoG,EAAOpG,kBAEzCoG,EAAOvF,gCACTyF,EAAiBzF,8BAAgCuF,EAAOvF,+BAEzDyF,EAAiB5R,SAAS2R,GAC1BC,EAAiB1b,SAEjB0b,EAAiB1M,QAAQ/W,GAAG,UAAU6F,eAAgBhE,GAEtD,IACA4hB,EAAiB1M,QAAQ/W,GAAG,UAAU6F,eAAgBhE,GAClD0hB,EAAOG,iBACTH,EAAOthB,QACPshB,EAAOld,QAAQ,CACdwX,IAAKhc,EAAI0gB,WAAW,KAGvB,GACD,CACD,EACEmB,gBAAgB,GAChBhkB,EACF,CACCM,GAAI,CACH,UAAW6F,UACV,IAAI7D,EAAS,CACZ2hB,UAAWhkB,KAAK8jB,iBAAiBzN,oBAKlC,OAHAhU,EAAO6b,UAAYle,KAAK8jB,iBAAiBxF,eAAejc,EAAO2hB,WAC/DhkB,KAAK0G,QAAQrE,IAEN,GAER,QAAS,KACRrC,KAAK0G,WACE,GAER,cAAe,KACd1G,KAAK0G,WACE,MAKZ,CAEA,UAAMtF,GAOL,OANApB,KAAKiW,QAAU,IAAI1T,SAAQ,CAACmE,EAASC,KACpC3G,KAAK0G,QAAUA,EACf1G,KAAK2G,OAASA,KAEfiO,MAAMxT,OAECpB,KAAKiW,OACb,GD3EU,GENI,WACd,ICAc,WACd,IAAIza,EAAIC,SAASC,cAAc,OAC/BF,EAAEG,UAAUC,IAAI,0CAEhBJ,EAAEuG,MAAM+N,SAAW,WACnBtU,EAAEuG,MAAMkiB,KAAO,WAGfxoB,SAASI,KAAKC,YAAYN,GAC1B,IAAI0oB,EAAQnoB,OAAOC,iBAAiBR,GAAG,oBAGvC,OAFAA,EAAEa,SAEe,sBAAV6nB,CACR,CDbKC,GAAmB,CACtB,IAAIC,EAAO3oB,SAASC,cAAc,QAClC0oB,EAAKC,KAAO,+DACZD,EAAKE,IAAM,aACX7oB,SAASU,KAAKL,YAAYsoB,EAE3B,CACA,IAED,EFFqB,oBAAXroB,SACTA,OAAO,gCAAkC,CACxCsnB,iBAAgB,GACdkB,iBAAgB,GAChBje,WAAU,KAGd,W","sources":["webpack://@webhandle/tree-file-browser/./node_modules/@dankolz/escape-html-attribute-value/index.js","webpack://@webhandle/tree-file-browser/./node_modules/@dankolz/webhandle-admin-icons/client-js/ensure-styles-are-loaded.js","webpack://@webhandle/tree-file-browser/./node_modules/@dankolz/webp-detection/lib/condense-image-variants.js","webpack://@webhandle/tree-file-browser/./node_modules/@dankolz/webp-detection/lib/definitions.js","webpack://@webhandle/tree-file-browser/./node_modules/@dankolz/webp-detection/lib/file-basename.js","webpack://@webhandle/tree-file-browser/./node_modules/@dankolz/webp-detection/lib/find-preview-variant.js","webpack://@webhandle/tree-file-browser/./node_modules/@dankolz/webp-detection/lib/find-primary-variant.js","webpack://@webhandle/tree-file-browser/./node_modules/@dankolz/webp-detection/lib/is-file-image-name.js","webpack://@webhandle/tree-file-browser/./node_modules/@dankolz/webp-detection/lib/is-file-image.js","webpack://@webhandle/tree-file-browser/./node_modules/@dankolz/webp-detection/lib/make-variant-image.js","webpack://@webhandle/tree-file-browser/./node_modules/ei-dialog/dialog.js","webpack://@webhandle/tree-file-browser/./node_modules/form-value-injector/form-value-injector.js","webpack://@webhandle/tree-file-browser/./node_modules/input-value-injector/input-value-injector.js","webpack://@webhandle/tree-file-browser/./node_modules/kalpa-tree-on-page/client-js/icons.js","webpack://@webhandle/tree-file-browser/./node_modules/kalpa-tree-on-page/client-js/kalpa-tree-loader.js","webpack://@webhandle/tree-file-browser/./node_modules/kalpa-tree-on-page/client-js/serialize-a-node.js","webpack://@webhandle/tree-file-browser/./node_modules/kalpa-tree-on-page/client-js/serialize-tree-nodes.js","webpack://@webhandle/tree-file-browser/./node_modules/kalpa-tree-on-page/client-js/streamish.js","webpack://@webhandle/tree-file-browser/./node_modules/ei-dialog/dialog-styles.txt","webpack://@webhandle/tree-file-browser/./node_modules/select-value-injector/select-value-injector.js","webpack://@webhandle/tree-file-browser/./node_modules/textarea-value-injector/textarea-value-injector.js","webpack://@webhandle/tree-file-browser/./node_modules/tripartite/active-element.js","webpack://@webhandle/tree-file-browser/./node_modules/tripartite/calculate-relative-path.js","webpack://@webhandle/tree-file-browser/./node_modules/tripartite/evaluate-in-context.js","webpack://@webhandle/tree-file-browser/./node_modules/tripartite/execution-context.js","webpack://@webhandle/tree-file-browser/./node_modules/tripartite/resolve-data-path.js","webpack://@webhandle/tree-file-browser/./node_modules/tripartite/tripartite.js","webpack://@webhandle/tree-file-browser/./views/webhandle-tree-image-browser/extension-pill.tri","webpack://@webhandle/tree-file-browser/./views/webhandle-tree-image-browser/guilded-file-upload-form.tri","webpack://@webhandle/tree-file-browser/./views/webhandle-tree-image-browser/guilded-image-upload-form.tri","webpack://@webhandle/tree-file-browser/./views/webhandle-tree-image-browser/image-browser-frame.tri","webpack://@webhandle/tree-file-browser/./views/webhandle-tree-image-browser/variant-choice-box.tri","webpack://@webhandle/tree-file-browser/webpack/bootstrap","webpack://@webhandle/tree-file-browser/webpack/runtime/define property getters","webpack://@webhandle/tree-file-browser/webpack/runtime/global","webpack://@webhandle/tree-file-browser/webpack/runtime/hasOwnProperty shorthand","webpack://@webhandle/tree-file-browser/webpack/runtime/make namespace object","webpack://@webhandle/tree-file-browser/./node_modules/@webhandle/backbone-view/client-js/event-entry-mapper.js","webpack://@webhandle/tree-file-browser/./node_modules/@webhandle/backbone-view/client-js/view.js","webpack://@webhandle/tree-file-browser/./node_modules/@webhandle/backbone-view/client-js/generate-id.js","webpack://@webhandle/tree-file-browser/./node_modules/@webhandle/backbone-view/client-js/extract-event-names.js","webpack://@webhandle/tree-file-browser/./views/load-browser-views.js","webpack://@webhandle/tree-file-browser/./client-lib/format-bytes.mjs","webpack://@webhandle/tree-file-browser/./node_modules/@webhandle/minimal-browser-event-emitter/client-js/event-emitter.mjs","webpack://@webhandle/tree-file-browser/./node_modules/@webhandle/minimal-browser-event-emitter/client-js/index.js","webpack://@webhandle/tree-file-browser/./node_modules/@webhandle/minimal-browser-event-emitter/client-js/streamish.mjs","webpack://@webhandle/tree-file-browser/./client-lib/form-answer-dialog.mjs","webpack://@webhandle/tree-file-browser/./node_modules/@webhandle/gather-form-data/gather-form-data.mjs","webpack://@webhandle/tree-file-browser/./client-lib/image-browser-view-methods/delete.mjs","webpack://@webhandle/tree-file-browser/./client-lib/image-browser-view-methods/utils.mjs","webpack://@webhandle/tree-file-browser/./client-lib/info-dialog.mjs","webpack://@webhandle/tree-file-browser/./client-lib/image-browser-view-methods/view-interactions.mjs","webpack://@webhandle/tree-file-browser/./client-lib/image-browser-view-methods/drag-and-drop.mjs","webpack://@webhandle/tree-file-browser/./client-lib/image-browser-view-methods/create-directory.mjs","webpack://@webhandle/tree-file-browser/./client-lib/add-soft-breaks.mjs","webpack://@webhandle/tree-file-browser/./client-lib/image-browser-view-methods/file-obj-manipulation.mjs","webpack://@webhandle/tree-file-browser/./client-lib/base-image-name.mjs","webpack://@webhandle/tree-file-browser/./client-lib/data-to-image.mjs","webpack://@webhandle/tree-file-browser/./client-lib/image-resize.mjs","webpack://@webhandle/tree-file-browser/./client-lib/get-image-stats.mjs","webpack://@webhandle/tree-file-browser/./client-lib/get-extension-from-mime.mjs","webpack://@webhandle/tree-file-browser/./client-lib/make-image-set.mjs","webpack://@webhandle/tree-file-browser/./client-lib/name-parts.mjs","webpack://@webhandle/tree-file-browser/./client-lib/image-browser-view-methods/upload.mjs","webpack://@webhandle/tree-file-browser/./client-lib/get-file-image-stats.mjs","webpack://@webhandle/tree-file-browser/./client-lib/image-browser-view-methods/sink.mjs","webpack://@webhandle/tree-file-browser/./client-lib/image-browser-view.mjs","webpack://@webhandle/tree-file-browser/./client-lib/dynamic-load.mjs","webpack://@webhandle/tree-file-browser/./client-lib/file-select-dialog.mjs","webpack://@webhandle/tree-file-browser/./client-lib/load-styles.mjs","webpack://@webhandle/tree-file-browser/./client-lib/styles-loaded.mjs"],"sourcesContent":["function escapeHtmlAttributeValue(s, preserveCR) {\n preserveCR = preserveCR ? ' ' : '\\n';\n return ('' + s) \n .replace(/&/g, '&') \n .replace(/'/g, ''') \n .replace(/\"/g, '"')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\\r\\n/g, preserveCR) \n .replace(/[\\r\\n]/g, preserveCR)\n}\n\nmodule.exports = escapeHtmlAttributeValue\n",";\nfunction ensureStylesAreLoaded() {\n\tfunction test() {\n\t\tlet d = document.createElement('div');\n\t\td.classList.add('material-icons-styles-marker');\n\t\tdocument.body.appendChild(d);\n\t\tlet content = window.getComputedStyle(d).content;\n\t\t\n\t\tif(content.indexOf('loaded') < 0) {\n\t\t\tdocument.head.insertAdjacentHTML('beforeend', '<link rel=\"stylesheet\" href=\"/@dankolz/webhandle-admin-icons/resources/css/admin-icons.css\">');\n\t\t}\n\t\td.remove();\n\t};\n\tif(document.body) {\n\t\ttest();\n\t}\n\telse {\n\t\tdocument.addEventListener(\"DOMContentLoaded\", test);\n\t}\n};\n\nmodule.exports = ensureStylesAreLoaded\n;\n","let {imageExtensions, smallerSizeExt, imageSizeExt} = require('./definitions')\nconst findPreviewVariant = require('./find-preview-variant')\nconst isFileImage = require('./is-file-image')\nconst makeVariantImage = require('./make-variant-image')\nconst fileBasename = require('./file-basename')\nconst findPrimaryVariant = require('./find-primary-variant')\n\n/**\n * Condenses an array of files into logical images with their variants. This works on a set of image files which all share\n * a base name, but have different extensions depending on how much larger or smaller they are compared to\n * the \"natural\" size of that image and what format they use (png, jpg, webp). There may also exist an additional json\n * file which shares the base name which contains information about description or other attributes.\n * \n * @param {array} directoryContents An array of file objects like those returned from FileSink.getFullFileInfo\n * That is, they have a `name` attribute which is the file name and a `directory` attribute which is true if a directory.\n * @returns A map of variants keyed by the image's base name.\n */\nfunction condenseImageVaraints(directoryContents) {\n\tlet files = directoryContents.filter(child => !child.directory)\n\tlet definitions = files.filter(child => child.name.toLowerCase().endsWith('.json'))\n\tlet imageFiles = files.filter(isFileImage)\n\n\tlet variants = {}\n\tfunction getVariant(baseName) {\n\t\tif (baseName in variants) {\n\t\t\treturn variants[baseName]\n\t\t}\n\t\tlet variant = {\n\t\t\tbaseName: baseName\n\t\t\t, variants: []\n\t\t}\n\t\tvariants[baseName] = variant\n\t\treturn variant\n\t}\n\n\t// create variants for all the definitions. Images don't have to have\n\t// defintions but if they do, we want to do them first.\n\tfor (let definition of definitions) {\n\t\tlet baseName = fileBasename(definition.name)\n\t\tlet variant = getVariant(baseName)\n\t\tvariant.definitionFile = definition\n\t}\n\t\n\t// match up all the image files to their variant definitions\n\tfor(let imageVariant of imageFiles.map(makeVariantImage)) {\n\t\tlet variant = getVariant(imageVariant.baseName)\n\t\tvariant.variants.push(imageVariant)\n\t}\n\t\n\t// remove those without images\n\tfor(let baseName of Array.from(Object.keys(variants))) {\n\t\tif(variants[baseName].variants.length == 0) {\n\t\t\tdelete variants[baseName]\n\t\t}\n\t}\n\t\n\t// set the preview variant\n\tObject.values(variants).forEach(setSpecialVariants)\n\n\treturn variants\n}\n\nfunction setSpecialVariants(variantDefinition) {\n\tlet preview = findPreviewVariant(variantDefinition.variants)\n\tvariantDefinition.preview = preview\n\t\n\tlet primary = findPrimaryVariant(variantDefinition.variants)\n\tvariantDefinition.primary = primary\n}\n\n\nmodule.exports = condenseImageVaraints","let definitions = {\n\timageExtensions: ['jpg', 'jpeg', 'png', 'gif', 'tiff', 'webp']\n\t, smallerSizeExt: ['quarter', 'half']\n}\ndefinitions.imageSizeExt = [...definitions.smallerSizeExt, 'std', '2x']\n\nmodule.exports = definitions","\nfunction fileBasename(name) {\n\treturn name.substring(0, name.lastIndexOf('.'))\n}\n\nmodule.exports = fileBasename","let {imageExtensions, smallerSizeExt, imageSizeExt} = require('./definitions')\n\nfunction findPreviewVariant(variants) {\n\tfor(let size of imageSizeExt) {\n\t\tfor(let img of imageExtensions) {\n\t\t\tfor(let variant of variants) {\n\t\t\t\tif(variant.size == size && variant.ext == img) {\n\t\t\t\t\treturn variant\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nmodule.exports = findPreviewVariant","let {imageExtensions, smallerSizeExt, imageSizeExt} = require('./definitions')\n\nlet fallbackSizeExt = ['std', '2x', ...smallerSizeExt]\nlet fallbackImgageExtensions = imageExtensions.filter(item => item != 'webp')\n\nfunction findPrimaryVariant(variants) {\n\tfor(let size of fallbackSizeExt) {\n\t\tfor(let img of fallbackImgageExtensions) {\n\t\t\tfor(let variant of variants) {\n\t\t\t\tif(variant.size == size && variant.ext == img) {\n\t\t\t\t\treturn variant\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nmodule.exports = findPrimaryVariant","\nlet {imageExtensions, smallerSizeExt, imageSizeExt} = require('./definitions')\n\nfunction isFileImageName(name) {\n\tlet nameLower = name.toLowerCase()\n\tfor (let ext of imageExtensions) {\n\t\tif (nameLower.endsWith('.' + ext)) {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\nmodule.exports = isFileImageName","const isFileImageName = require('./is-file-image-name')\n\nfunction isFileImage(file) {\n\treturn isFileImageName(file.name)\n}\n\nmodule.exports = isFileImage","let {imageExtensions, smallerSizeExt, imageSizeExt} = require('./definitions')\n\nfunction makeVariantImage(file) {\n\tlet info = {\n\t\tsize: 'std'\n\t\t, file: file\n\t}\n\tlet name = file.name\n\n\tinfo.ext = name.substring(name.lastIndexOf('.') + 1)\n\tlet noExt = name.substring(0, name.lastIndexOf('.'))\n\tinfo.baseName = noExt\n\tfor (let size of imageSizeExt) {\n\t\tlet sizeString = '-' + size\n\t\tif (noExt.endsWith(sizeString)) {\n\t\t\tinfo.size = size\n\t\t\tinfo.baseName = noExt.substring(0, noExt.length - sizeString.length)\n\t\t\tbreak\n\t\t}\n\t}\n\treturn info\n}\n\nmodule.exports = makeVariantImage","let dialogStyles = require('./dialog-styles.txt')\nlet sequence = 0\n\n// If we're loading via a module system or packed by webpack, we may\n// have a module here instead of the value. We need to check for default\n// and use that if it exists.\nif(typeof dialogStyles !== 'string' && dialogStyles.default) {\n\tdialogStyles = dialogStyles.default\t\n}\n\n\n/**\n * A button definition.\n * @typedef {Object} Button\n * @property {string} classes Classes to add to the button\n * @property {string} label Text shown to the user\n */\n\n\n\n/**\n * A whole page dialog. \n * @param {object} options \n * @param {string,function} options.body The contents of the body section. This can be a string,\n * in which case it will just be inserted into the body. It can be a function, in which case\n * it is expected to return a string (which will be inserted) or a Promise, which should resolve to\n * a string, which will be inserted. However, this function is passed the body element and dialog\n * object as arguments, so it can also modify content directory and return an empty string.\n * @param {object} options.on An object which the key is the selector and the value is a funtion\n * which is called when the object with that selector is clicked. If the function returns false the\n * dialog will not be closed. If it returns a Promise, the promise will be resolved and if the resolved\n * value is false, it will not be closed. Any other return condition will result in the dialog being\n * closed.\n * @param {Button[]} options.buttons The buttons that will show up in the footer of the dialog. If buttons are not\n * specified, \"OK\" and \"Cancel\" buttons will be added.\n * @param {string} options.title The title of the dialog\n * @param {string} options.dialogFrameClass An additional string inserted into the class attribute for\n * specific styling of specific types of dialog boxes.\n * @param {function} options.afterOpen A function which is called after open with the body element and dialog object\n * as arguments.\n */\nvar Dialog = function(options) {\n\tthis.id = \"dialog\" + (new Date().getTime()) + (sequence++)\n\tObject.assign(this, options)\n\tif(!this.on) {\n\t\tthis.on = {}\n\t}\n\tif(!this.on['.btn-cancel']) {\n\t\tthis.on['.btn-cancel'] = function() {\n\t\t}\n\t}\n\tif(!this.on['.btn-close']) {\n\t\tthis.on['.btn-close'] = function() {\n\t\t}\n\t}\n\t\n\tif(!options.buttons) {\n\t\tthis.buttons = [\n\t\t\t{\n\t\t\t\tclasses: 'btn btn-primary btn-ok',\n\t\t\t\tlabel: 'OK'\n\t\t\t},\n\t\t\t{\n\t\t\t\tclasses: 'btn btn-cancel',\n\t\t\t\tlabel: 'Cancel'\n\t\t\t}\n\t\t]\n\t}\n\t\n\tthis.body = options.body\n}\n\nDialog.prototype.getBodySelector = function() {\n\treturn '#' + this.id + ' .body'\n}\n\nDialog.prototype.getFrameSelector = function() {\n\treturn '#' + this.id \n}\n\nDialog.prototype.addStylesIfNeeded = function() {\n\tif(!document.querySelector('#dialog-frame-styles')) {\n\t\tdocument.querySelector('head').insertAdjacentHTML('beforeend', \n\t\t\t'<style type=\"text/css\" id=\"dialog-frame-styles\">' +\n\t\t\tdialogStyles + \n\t\t\t'</style>')\n\t}\n}\n\nDialog.prototype.renderButton = function(button) {\n\treturn `<button class=\"${button.classes}\" type=\"button\">${button.label}</button>`\n}\n\nDialog.prototype.generateFrame = function() {\n\tlet buttons = this.buttons.map(this.renderButton).join('')\n\t\n\treturn `\n<div class=\"dialog-frame ${this.dialogFrameClass || ''}\" id=\"${this.id}\" >\n\t<div class=\"mask\">\n\t</div>\n\t<div class=\"the-dialog\">\n\t\t<div class=\"close btn-close\">×</div>\n\t\t<div class=\"head\">\n\t\t\t${this.title}\n\t\t</div>\n\t\t<div class=\"body\">\n\t\t</div>\n\t\t<div class=\"foot\">\n\t\t\t${buttons}\n\t\t</div>\n\t</div>\n</div>\n\t`\n}\n\nDialog.prototype.open = function() {\n\tlet self = this\n\tthis.addStylesIfNeeded()\n\tdocument.querySelector('body').insertAdjacentHTML('beforeend', this.generateFrame())\n\t\n\tlet bodySelector = this.getBodySelector()\n\tlet frameSelector = this.getFrameSelector()\n\t\n\tlet bodyContent\n\tlet bodyElement = document.querySelector(bodySelector)\n\tlet frameElement = document.querySelector(frameSelector)\n\n\t\n\t\n\tframeElement.addEventListener('click', function(evt) {\n\t\tfor(let selector in self.on) {\n\t\t\tlet target = frameElement.querySelector(selector)\n\t\t\tif(evt.target == target) {\n\t\t\t\tlet result = self.on[selector]()\n\t\t\t\tif(typeof result === 'boolean') {\n\t\t\t\t\tif(result) {\n\t\t\t\t\t\tself.close()\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if(typeof Promise === 'function' && result instanceof Promise) {\n\t\t\t\t\tresult.then(function(result) {\n\t\t\t\t\t\tif(result !== false) {\n\t\t\t\t\t\t\tself.close()\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tself.close()\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t})\n\t\n\tfunction afterOpenResizeSetup() {\n\t\tsetTimeout(function() {\n\t\t\tlet head = document.querySelector(frameSelector + ' .head').clientHeight \n\t\t\tlet foot = document.querySelector(frameSelector + ' .foot').clientHeight\n\t\t\tlet topAndBottom = head + foot\n\n\t\t\tbodyElement.style.maxHeight = 'calc(90vh - ' + topAndBottom + 'px)'\n\t\t\tframeElement.classList.add('open')\n\t\t\t\n\t\t\tif(self.afterOpen) {\n\t\t\t\tself.afterOpen(bodyElement, self)\n\t\t\t}\n\t\t})\n\t}\n\t\n\tif(typeof this.body === 'function') {\n\t\tbodyContent = this.body(bodyElement, this)\n\t}\n\telse if(typeof this.body == 'string') {\n\t\tbodyContent = this.body\n\t}\n\n\tif(typeof bodyContent === 'string') {\n\t\tbodyElement.insertAdjacentHTML('beforeend', bodyContent)\n\t\tafterOpenResizeSetup()\n\t}\n\telse if(typeof Promise === 'function' && bodyContent instanceof Promise) {\n\t\tbodyContent.then(function(content) {\n\t\t\tbodyElement.insertAdjacentHTML('beforeend', content)\n\t\t\tafterOpenResizeSetup()\n\t\t})\n\t}\n\t\n\n\treturn this\n}\n\nDialog.prototype.close = function() {\n\tlet frame = document.querySelector(this.getFrameSelector())\n\tframe.remove()\n\treturn this\n}\n\nmodule.exports = Dialog\n\n","\nconst inputInjector = require('input-value-injector')\nconst textareaInjector = require('textarea-value-injector')\nconst selectInjector = require('select-value-injector')\n\nlet injectValues = function(text, values) {\n\t\n\tlet result = inputInjector(text, values)\n\tresult = textareaInjector(result, values)\n\tresult = selectInjector(result, values)\n\t\n\t\n\treturn result\n}\n\nmodule.exports = injectValues","\nfunction makeDate(date) {\n\tif(date instanceof Date) {\n\t\treturn date\n\t}\n\treturn new Date(date)\n}\n\nfunction pad(value, len, pad) {\n\tvalue = '' + value\n\twhile(value.length < len) {\n\t\tvalue = pad + value\n\t}\n\treturn value\n}\n\nfunction formatDate(date) {\n\tdate = makeDate(date)\n\tlet year = date.getFullYear()\n\tlet month = pad(date.getMonth() + 1, 2, '0')\n\tlet day = pad(date.getDate(), 2, '0')\n\n\treturn `${year}-${month}-${day}`\n}\nfunction formatTime(date) {\n\tdate = makeDate(date)\n\tlet hour = pad(date.getHours(), 2, '0')\n\tlet minute = pad(date.getMinutes(), 2, '0')\n\tlet sec = pad(date.getSeconds(), 2, '0')\n\tlet milli = pad(date.getMilliseconds(), 4, '0')\n\treturn `${hour}:${minute}`\n}\n\nfunction formatCombined(date) {\n\treturn formatDate(date) + 'T' + formatTime(date)\n}\n\nlet nameAttrPattern = /\\sname=[\"'](.*?)[\"']/i\nlet valAttrPattern = /\\svalue=[\"'](.*?)[\"']/i\nlet typeAttrPattern = /\\stype=[\"'](.*?)[\"']/i\nlet inputPattern = /(<input.*?>)/i\nlet checkedAttrPattern = /\\schecked(=[\"'](.*?)[\"'])?/i\n\nlet attributeEscapes = {\n\t'&': '&'\n\t, '\"': '"'\n\t, '<': '<'\n}\n\nfunction escapeAttributeValue(attr) {\n\tif(attr === null || attr === undefined) {\n\t\tattr = ''\n\t}\n\tif(typeof attr !== 'string') {\n\t\tattr = '' + attr\n\t}\n\tfor(let [key, value] of Object.entries(attributeEscapes)) {\n\t\tattr = attr.split(key).join(value)\n\t}\n\treturn attr\n}\n\nlet evalFunction = new Function('data',\n\t`with (data.context) {\n\t\ttry {\n\t\t\treturn eval(data.expression);\n\t\t} catch (e) {\n\t\t\treturn null;\n\t\t}\n\t}`\n)\n\nfunction fetchValue(obj, path) {\n\treturn evalFunction.call(this, {\n\t\tcontext: obj\n\t\t, expression: path\n\t})\n}\n\nfunction isOrContains(target, possible) {\n\tif(Array.isArray(possible)) {\n\t\treturn possible.includes(target)\n\t}\n\telse {\n\t\treturn target == possible\n\t}\n}\n\n\nlet injectValues = function(text, values) {\n\t\n\tlet result = ''\n\t\n\ttext.split(inputPattern).forEach((item) => {\n\t\tif(item.toLowerCase().indexOf('<input') == 0) {\n\t\t\tlet r = item.match(nameAttrPattern)\n\t\t\tlet name = r ? r[1] : null\n\t\t\t\n\t\t\tr = item.match(typeAttrPattern)\n\t\t\tlet type = (r ? r[1] : 'text').toLowerCase()\n\t\t\t\n\t\t\t\n\t\t\tif(type === 'text' || type === 'hidden' || type === 'date' || type === 'time' || type === 'datetime-local'\n\t\t\t|| type === 'search' || type === 'email' || type === 'number' || type === 'tel' || type === 'url' \n\t\t\t|| type === 'month' || type === 'week' || type === 'color' || type === 'week'\n\t\t\t) {\n\t\t\t\tr = item.match(valAttrPattern)\n\t\t\t\tlet value = r ? r[1] : null\n\t\t\t\t\n\t\t\t\tlet newVal = fetchValue(values, name)\n\t\t\t\tif(type === 'date') {\n\t\t\t\t\tif(newVal) {\n\t\t\t\t\t\tlet orgValue = newVal\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tnewVal = formatDate(newVal)\n\t\t\t\t\t\t} catch(e) {\n\t\t\t\t\t\t\tnewVal = orgValue\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif(newVal == 'Invalid date') {\n\t\t\t\t\t\t\tnewVal = orgValue\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if(type === 'time') {\n\t\t\t\t\tif(newVal) {\n\t\t\t\t\t\tlet orgValue = newVal\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tnewVal = formatTime(newVal)\n\t\t\t\t\t\t} catch(e) {\n\t\t\t\t\t\t\tnewVal = orgValue\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif(newVal == 'Invalid date') {\n\t\t\t\t\t\t\tnewVal = orgValue\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if(type === 'datetime-local') {\n\t\t\t\t\tif(newVal) {\n\t\t\t\t\t\tlet orgValue = newVal\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tnewVal = formatCombined(newValue)\n\t\t\t\t\t\t} catch(e) {}\n\t\t\t\t\t\tif(newVal == 'Invalid date') {\n\t\t\t\t\t\t\tnewVal = orgValue\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tlet replacementText\n\t\t\t\tif(newVal === null || newVal === undefined) {\n\t\t\t\t\treplacementText = ''\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tnewVal = escapeAttributeValue(newVal)\n\t\t\t\t\treplacementText = ' value=\"' + newVal + '\"'\n\t\t\t\t}\n\n\n\t\t\t\tif(value != null) {\n\t\t\t\t\tif(newVal != null) {\n\t\t\t\t\t\titem = item.replace(valAttrPattern, replacementText)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tif(item.endsWith('/>')) {\n\t\t\t\t\t\titem = item.slice(0, -2)\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\titem = item.slice(0, -1)\n\t\t\t\t\t}\n\t\t\t\t\titem = item + replacementText + ' />'\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tresult += item\n\t\t\t}\n\t\t\telse if(type === 'radio') {\n\t\t\t\tr = item.match(valAttrPattern)\n\t\t\t\tlet value = r ? r[1] : null\n\t\t\t\tlet newVal = fetchValue(values, name)\n\t\t\t\t\n\t\t\t\tif(!value) {\n\t\t\t\t\t// We don't have a specific value, so we'll say it's checked\n\t\t\t\t\t// if the new value is truthy.\n\t\t\t\t\t\n\t\t\t\t\tif(!newVal || newVal == 'false' || newVal == 'off') {\n\t\t\t\t\t\titem = item.replace(checkedAttrPattern, '')\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\t// so we should have it checked\n\t\t\t\t\t\tif(!item.match(checkedAttrPattern)) {\n\t\t\t\t\t\t\tif(item.endsWith('/>')) {\n\t\t\t\t\t\t\t\titem = item.slice(0, -2)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\titem = item.slice(0, -1)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\titem = item + ' checked=\"checked\" />' \n\t\t\t\t\t\t}\n\t\t\t\t\t\t// if the above were not true, it's because it's already checked\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tif(!newVal || newVal != value) {\n\t\t\t\t\t\t// if the new value is blank or does not equal the value in\n\t\t\t\t\t\t// in the value attribute, we'll make it unchecked\n\t\t\t\t\t\titem = item.replace(checkedAttrPattern, '')\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\t// so we should have it checked\n\t\t\t\t\t\tif(!item.match(checkedAttrPattern)) {\n\t\t\t\t\t\t\tif(item.endsWith('/>')) {\n\t\t\t\t\t\t\t\titem = item.slice(0, -2)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\titem = item.slice(0, -1)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\titem = item + ' checked=\"checked\" />' \n\t\t\t\t\t\t}\n\t\t\t\t\t\t// if the above were not true, it's because it's already checked\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tresult += item\n\t\t\t}\n\t\t\telse if(type === 'checkbox') {\n\t\t\t\tr = item.match(valAttrPattern)\n\t\t\t\tlet value = r ? r[1] : null\n\t\t\t\tlet newVal = fetchValue(values, name)\n\t\t\t\t\n\t\t\t\tif(!value) {\n\t\t\t\t\t// We don't have a specific value, so we'll say it's checked\n\t\t\t\t\t// if the new value is truthy.\n\t\t\t\t\t\n\t\t\t\t\tif(!newVal || isOrContains('false', newVal) || isOrContains('off', newVal)) {\n\t\t\t\t\t\titem = item.replace(checkedAttrPattern, '')\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\t// so we should have it checked\n\t\t\t\t\t\tif(!item.match(checkedAttrPattern)) {\n\t\t\t\t\t\t\tif(item.endsWith('/>')) {\n\t\t\t\t\t\t\t\titem = item.slice(0, -2)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\titem = item.slice(0, -1)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\titem = item + ' checked=\"checked\" />' \n\t\t\t\t\t\t}\n\t\t\t\t\t\t// if the above were not true, it's because it's already checked\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tif(!newVal || !isOrContains(value, newVal)) {\n\t\t\t\t\t\t// if the new value is blank or does not equal the value in\n\t\t\t\t\t\t// in the value attribute, we'll make it unchecked\n\t\t\t\t\t\titem = item.replace(checkedAttrPattern, '')\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\t// so we should have it checked\n\t\t\t\t\t\tif(!item.match(checkedAttrPattern)) {\n\t\t\t\t\t\t\tif(item.endsWith('/>')) {\n\t\t\t\t\t\t\t\titem = item.slice(0, -2)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\titem = item.slice(0, -1)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\titem = item + ' checked=\"checked\" />' \n\t\t\t\t\t\t}\n\t\t\t\t\t\t// if the above were not true, it's because it's already checked\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tresult += item\n\t\t\t}\n\t\t\telse {\n\t\t\t\tresult += item\n\t\t\t}\n\t\t\t\n\t\t}\n\t\telse {\n\t\t\tresult += item\n\t\t}\n\t})\n\t\n\treturn result\n}\n\n\nmodule.exports = injectValues\n","module.exports = `<div id=\"kalpa-tree-icons\" style=\"position: absolute; left: -10000px; width: 0; height: 0;\">\n\t<svg xmlns=\"http://www.w3.org/2000/svg\">\n\t\t<symbol id=\"icon-generic\" viewBox=\"0 0 12 12\">\n\t\t\t<path\n\t\t\t\td=\"M9.7 12H2.3C1 12 0 11 0 9.7V2.3C0 1 1 0 2.3 0h7.5C11 0 12 1 12 2.3v7.5C12 11 11 12 9.7 12zM8 5.3C8 4.6 7.4 4 6.6 4H5.3C4.6 4 4 4.6 4 5.3v1.3C4 7.4 4.6 8 5.3 8h1.3C7.4 8 8 7.4 8 6.6V5.3z\" />\n\t\t</symbol>\n\t\t<symbol id=\"icon-root\" viewBox=\"0 0 16 16\">\n\t\t\t<path d=\"M9 16V9h7v7H9zM9 0h7v7H9V0zM0 9h7v7H0V9zm0-9h7v7H0V0z\" />\n\t\t</symbol>\n\t\t<symbol id=\"icon-metric\" viewBox=\"0 0 100 100\">\n\t\t\t<path\n\t\t\t\td=\"M50 100C22.4 100 0 77.6 0 50S22.4 0 50 0s50 22.4 50 50-22.4 50-50 50zm0-76.9c-14.8 0-26.9 12.1-26.9 26.9S35.2 76.9 50 76.9 76.9 64.8 76.9 50 64.8 23.1 50 23.1zm0 38.4c-6.4 0-11.5-5.2-11.5-11.5S43.6 38.4 50 38.4s11.5 5.2 11.5 11.5S56.4 61.5 50 61.5z\" />\n\t\t</symbol>\n\t\t<symbol id=\"icon-perspective\" viewBox=\"0 0 12 11\">\n\t\t\t<path d=\"M12 11H0L5.9 0 12 11z\" />\n\t\t</symbol>\n\t\t<symbol id=\"icon-objective\" viewBox=\"0 0 12 10\">\n\t\t\t<ellipse cx=\"6\" cy=\"5\" rx=\"6\" ry=\"5\" />\n\t\t</symbol>\n\t\t<symbol id=\"icon-find\">\n\t\t\t<path\n\t\t\t\td=\"m 13.497323,12.433608 c 0.08422,0.978628 -1.417295,1.469942 -1.954282,0.657234 C 10.369384,11.968141 9.2411696,10.799391 8.087323,9.6566079 5.7875518,11.20515 2.2596241,10.270797 1.051352,7.7662065 -0.1027543,5.5922068 0.61269436,2.5743169 2.7539681,1.2885899 4.6322082,0.06461011 7.3623548,0.26924656 8.9286688,1.9183502 c 1.5121032,1.4872335 1.9726552,4.001359 0.8885116,5.8618536 -0.2008407,0.7179057 0.6439246,1.0286413 1.0395966,1.4627471 0.79551,0.9178591 1.752248,1.6943191 2.51171,2.6495761 0.08347,0.167322 0.129284,0.353872 0.128836,0.541081 z m -8.047,-9.7420001 C 3.5991559,2.6059751 2.107634,4.7815577 2.8684439,6.4772182 3.4629388,8.0470383 5.6500695,8.7859958 7.0177529,7.7488936 8.3664062,6.8424394 8.6521549,4.6587499 7.425963,3.52989 6.9118115,3.0069548 6.1883031,2.6803036 5.450323,2.6916079 z\" />\n\t\t</symbol>\n\t\t<symbol id=\"icon-collapsed\" viewBox=\"0 0 9 6\">\n\t\t\t<path\n\t\t\t\td=\"M4.4 6c-.2 0-.5-.1-.9-.5L.3 1.8C-.1 1.4-.1.7.3.3s1.1-.4 1.5 0l2.7 3.2L7.1.4C7.5 0 8.2 0 8.6.4c.4.4.4 1.1 0 1.5L5.4 5.5c-.3.4-.8.5-1 .5z\" />\n\t\t</symbol>\n\t</svg>\n</div>`\n","\nconst Streamish = require('./streamish')\nconst serializeTreeNodes = require('./serialize-tree-nodes')\nconst serializeANode = require('./serialize-a-node')\n\nconst icons = require('./icons')\n\nlet loadedStyles = []\n\n\nasync function loadKalpaTree(scriptLocation) {\n\treturn new Promise((resolve, reject) => {\n\t\tif (window.KalpaTree) {\n\t\t\tresolve(window.KalpaTree)\n\t\t}\n\t\telse {\n\t\t\tlet ckscript = document.createElement('script');\n\t\t\tckscript.setAttribute('src', scriptLocation);\n\t\t\tckscript.onload = async function () {\n\t\t\t\tresolve(window.KalpaTree)\n\t\t\t}\n\t\t\tdocument.head.appendChild(ckscript)\n\t\t}\n\t})\n}\n\nasync function createTree(options = {}) {\n\tlet plan = Object.assign({\n\t\ttreeContainerSelector: '#kalpa-tree'\n\t\t, stream: new Streamish()\n\t\t, loadStyles: true\n\t\t, styleLocation: '/kalpa-tree-on-page/css/white-page-tree.css'\n\t\t, scriptLocation: '/kalpa-tree-on-page/js/kalpa-tree.js'\n\t\t, data: null\n\n\t}, options)\n\treturn new Promise((resolve, reject) => {\n\t\t// Add the icon svgs if they haven't been added yet\n\t\tif(!document.querySelector('#kalpa-tree-icons')) {\n\t\t\tdocument.body.insertAdjacentHTML('beforeend', icons)\n\t\t}\n\n\t\t// Load the kalpa-tree script dependency then configure it\n\t\tloadKalpaTree(plan.scriptLocation).then(KalpaTree => {\n\n\t\t\tconst Tree = KalpaTree.default\n\t\t\tlet tree = new Tree({\n\t\t\t\tstream: plan.stream,\n\t\t\t\taccessors: {\n\t\t\t\t\ticon: 'nodeType'\n\t\t\t\t},\n\t\t\t\tinitialSelection: 0\n\t\t\t})\n\n\t\t\ttree.on('error', function (e) {\n\t\t\t\tconsole.log('tree error', e)\n\t\t\t})\n\n\t\t\ttree.on('move', function (node, newParent, previousParent, newIndex, prevIndex) {\n\t\t\t\tnode.parentId = newParent.id\n\t\t\t})\n\t\t\ttree.serializeTree = function() {\n\t\t\t\tlet result = []\n\t\t\t\tresult.push(tree.root)\n\t\t\t\tserializeTreeNodes(this, tree.root.id, result)\n\t\t\t\treturn result\n\t\t\t}\n\t\t\ttree.serialize = function () {\n\t\t\t\tvar result = []\n\t\t\t\tresult.push(tree.get(0))\n\t\t\t\tserializeANode(tree, 0, result)\n\t\t\t\treturn JSON.stringify(result)\n\t\t\t}\n\t\t\t\n\t\t\tif(plan.treeContainerSelector) {\n\t\t\t\tdocument.querySelector(plan.treeContainerSelector).appendChild(tree.render().el.node())\n\t\t\t}\n\t\t\t\n\t\t\tif(plan.data && Array.isArray(plan.data)) {\n\t\t\t\tfor(let node of plan.data) {\n\t\t\t\t\ttree.options.stream.emit('data', node)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tresolve(tree)\n\t\t})\n\t\t\n\t\t// Load the stylesheet for minimal formatting\n\t\tif(plan.loadStyles && plan.styleLocation) {\n\t\t\tif(!loadedStyles.includes(plan.styleLocation)) {\n\t\t\t\tloadedStyles.push(plan.styleLocation)\n\t\t\t\tdocument.head.insertAdjacentHTML('beforeend', `<link href=\"${plan.styleLocation}\" rel=\"stylesheet\">`)\n\t\t\t}\n\t\t}\n\t})\n\n}\n\nmodule.exports = createTree","function serializeANode (tree, rootId, result) {\n\ttree.children(rootId).forEach(function (child) {\n\t\tchild.parentId = rootId\n\t\tresult.push(child)\n\t\tserializeANode(tree, child.id, result)\n\t})\n}\n\nmodule.exports = serializeANode","\nfunction serializeTreeNodes(tree, rootId, result) {\n\ttree.children(rootId).forEach(function (child) {\n\t\tchild.parentId = rootId\n\t\tresult.push(child)\n\t\tserializeTreeNodes(tree, child.id, result)\n\t})\n}\n\nmodule.exports = serializeTreeNodes","\nclass Streamish {\n\tconstructor() {\n\t\tthis.handles = {}\n\t}\n\ton(evt, handle) {\n\t\tlet handles = this.handles[evt]\n\t\tif (!handles) {\n\t\t\thandles = this.handles[evt] = []\n\t\t}\n\t\thandles.push(handle)\n\t\treturn this\n\t}\n\temit(evt, ...args) {\n\t\tif (evt in this.handles) {\n\t\t\tfor (let handle of this.handles[evt]) {\n\t\t\t\thandle.apply(this, args)\n\t\t\t}\n\t\t}\n\t}\n}\nmodule.exports = Streamish","export default \".dialog-frame {\\n\\tposition: fixed;\\n\\ttop: 0;\\n\\tbottom: 0;\\n\\tleft: 0;\\n\\tright: 0;\\n\\tz-index: 10000;\\n\\topacity: 0;\\n\\ttransition: opacity .3s;\\n\\toverflow: hidden;\\n\\t\\n\\t\\n\\tdisplay: grid;\\n\\tjustify-content: center;\\n\\talign-content: center;\\n\\tpadding: 5vh 5%;\\n}\\n\\n.dialog-frame.open {\\n\\topacity: 1;\\n}\\n\\n.dialog-frame .mask {\\n\\tposition: absolute;\\n\\tbox-sizing: border-box;\\n\\ttop: 0;\\n\\tbottom: 0;\\n\\tleft: 0;\\n\\tright: 0;\\n\\tbackground-color: #333333;\\n\\topacity: .7;\\n\\theight: 100%;\\n\\tz-index: 0;\\n\\t\\n}\\n\\n\\n.dialog-frame .the-dialog {\\n\\tposition: relative;\\n\\tdisplay: inline-block;\\n\\tz-index: 1;\\n\\tborder-radius: 5px;\\n\\tbackground-color: white;\\n\\toverflow: hidden;\\n\\ttransform: scale(.84);\\n\\ttransition: transform 0.262s cubic-bezier(.77,-1.72,.08,1);\\n}\\n\\n.dialog-frame.open .the-dialog {\\n\\ttransform: scale(1);\\n}\\n\\n.dialog-frame .the-dialog .close {\\n\\tposition: absolute;\\n\\ttop: 0px;\\n\\tright: 0px;\\n\\tpadding: 8px 10px 10px 10px;\\n\\tcursor: pointer;\\n}\\n\\n.dialog-frame .the-dialog .head {\\n\\tborder-bottom: solid #aaaaaa 1px;\\n\\tline-height: 2em;\\n\\tpadding: 0 10px;\\n}\\n\\n.dialog-frame .the-dialog .body {\\n\\tbox-sizing: border-box;\\n\\tpadding: 20px;\\n\\toverflow: auto;\\n\\tmax-height: calc(90vh - 75px);\\n}\\n\\n.dialog-frame .the-dialog .foot {\\n\\tborder-top: solid #aaaaaa 1px;\\n\\tpadding: 10px;\\n}\\n\\n.dialog-frame .the-dialog .foot button {\\n\\tmargin-right: 15px;\\n}\";","\n\nlet nameAttrPattern = /\\sname=[\"'](.*?)[\"']/i\nlet valAttrPattern = /\\svalue=[\"'](.*?)[\"']/i\nlet typeAttrPattern = /\\stype=[\"'](.*?)[\"']/i\nlet selectPattern = /(<select[\\w\\W]*?select\\w*>)/im\nlet selectedAttrPattern = /\\sselected(=[\"'](.*?)[\"'])?/i\n\n\nlet evalFunction = new Function('data',\n\t`with (data.context) {\n\t\ttry {\n\t\t\treturn eval(data.expression);\n\t\t} catch (e) {\n\t\t\treturn null;\n\t\t}\n\t}`\n)\n\nfunction fetchValue(obj, path) {\n\treturn evalFunction.call(this, {\n\t\tcontext: obj\n\t\t, expression: path\n\t})\n}\n\nfunction escForRegex(val) {\n\tif(val && val.replace) {\n\t\treturn val.replace(/[\\-\\[\\]\\/\\{\\}\\(\\)\\*\\+\\?\\.\\\\\\^\\$\\|]/g, \"\\\\$&\")\n\t}\n\telse {\n\t\treturn val;\n\t}\n}\n\nfunction isOrContains(target, possible) {\n\tif(typeof possible == 'array') {\n\t\tpossible.includes(target)\n\t}\n\telse {\n\t\treturn target == possible\n\t}\n}\n\n\nlet injectValues = function(text, values) {\n\t\n\tlet result = ''\n\t\n\ttext.split(selectPattern).forEach((item) => {\n\t\tif(item.toLowerCase().indexOf('<select') == 0) {\n\t\t\tlet r = item.match(nameAttrPattern)\n\t\t\tlet name = r ? r[1] : null\n\t\t\t\n\t\t\tlet newVal = fetchValue(values, name)\n\t\t\tif(typeof newVal != 'undefined' && newVal !== null) {\n\t\t\t\titem = item.replace(selectedAttrPattern, '')\n\t\t\t\tlet optionMatch = item.match( new RegExp('value=[\"\\']' + escForRegex(newVal) + '[\"\\']', 'i'))\n\t\t\t\tif(optionMatch) {\n\t\t\t\t\tlet breakIndex = item.indexOf(optionMatch[0]) + optionMatch[0].length\n\t\t\t\t\titem = item.slice(0, breakIndex) + ' selected=\"selected\" ' + item.substring(breakIndex)\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tresult += item\n\t\t}\n\t\telse {\n\t\t\tresult += item\n\t\t}\n\t})\n\t\n\treturn result\n}\n\n\nmodule.exports = injectValues\n","\n\nlet nameAttrPattern = /\\sname=[\"'](.*?)[\"']/i\nlet valAttrPattern = /\\svalue=[\"'](.*?)[\"']/i\nlet typeAttrPattern = /\\stype=[\"'](.*?)[\"']/i\nlet textareaPattern = /(<textarea[\\w\\W]*?textarea\\w*>)/im\nlet selectedAttrPattern = /\\sselected(=[\"'](.*?)[\"'])?/i\n\n\nlet evalFunction = new Function('data',\n\t`with (data.context) {\n\t\ttry {\n\t\t\treturn eval(data.expression);\n\t\t} catch (e) {\n\t\t\treturn null;\n\t\t}\n\t}`\n)\n\nfunction fetchValue(obj, path) {\n\treturn evalFunction.call(this, {\n\t\tcontext: obj\n\t\t, expression: path\n\t})\n}\n\nfunction escForRegex(val) {\n\tif(val && val.replace) {\n\t\treturn val.replace(/[\\-\\[\\]\\/\\{\\}\\(\\)\\*\\+\\?\\.\\\\\\^\\$\\|]/g, \"\\\\$&\")\n\t}\n\telse {\n\t\treturn val;\n\t}\n}\n\nfunction isOrContains(target, possible) {\n\tif(typeof possible == 'array') {\n\t\tpossible.includes(target)\n\t}\n\telse {\n\t\treturn target == possible\n\t}\n}\n\n\nlet injectValues = function(text, values) {\n\t\n\tlet result = ''\n\t\n\ttext.split(textareaPattern).forEach((item) => {\n\t\tif(item.toLowerCase().indexOf('<textarea') == 0) {\n\t\t\tlet r = item.match(nameAttrPattern)\n\t\t\tlet name = r ? r[1] : null\n\t\t\t\n\t\t\tif(name) {\n\t\t\t\tlet newVal = fetchValue(values, name)\n\t\t\t\tif(typeof newVal != 'undefined' && newVal !== null) {\n\t\t\t\t\tlet startTagEnd = item.indexOf('>')\n\t\t\t\t\tlet endTagStart = item.lastIndexOf('<')\n\t\t\t\t\titem = item.substring(0, startTagEnd + 1) + newVal + item.substring(endTagStart)\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tresult += item\n\t\t}\n\t\telse {\n\t\t\tresult += item\n\t\t}\n\t})\n\t\n\treturn result\n}\n\n\nmodule.exports = injectValues","\nconst defaultTemplateName = 'defaultTemplate'\n\nclass ActiveElement {\n\tconstructor(conditionalExpression, dataExpression, handlingExpression, tripartite) {\n\t\tthis.conditionalExpression = conditionalExpression\n\t\tthis.dataExpression = dataExpression\n\t\tthis.handlingExpression = handlingExpression || defaultTemplateName\n\t\tthis.tripartite = tripartite\n\t}\n}\n\nmodule.exports = ActiveElement","var calculateRelativePath = function(parentPath, currentPath) {\n\tif(!parentPath) {\n\t\treturn currentPath\n\t}\n\tif(!currentPath) {\n\t\treturn currentPath\n\t}\n\t\n\tif(currentPath.indexOf('../') != 0 && currentPath.indexOf('./') != 0) {\n\t\treturn currentPath\n\t}\n\t\n\tvar pparts = parentPath.split('/')\n\tvar cparts = currentPath.split('/')\n\t\n\t// trim any starting blank sections\n\twhile(pparts.length && !pparts[0]) {\n\t\tpparts.shift()\n\t}\n\twhile(cparts.length && !cparts[0]) {\n\t\tcparts.shift()\n\t}\n\t\n\tif(currentPath.indexOf('../') == 0 ) {\n\t\twhile(cparts.length && cparts[0] == '..') {\n\t\t\tpparts.pop()\n\t\t\tcparts.shift()\n\t\t}\n\t\tpparts.pop()\n\t\t\n\t\twhile(cparts.length) {\n\t\t\tpparts.push(cparts.shift())\n\t\t}\n\t\treturn pparts.join('/')\n\t}\n\tif(currentPath.indexOf('./') == 0 ) {\n\t\tcparts.shift()\n\t\tpparts.pop()\n\t\twhile(cparts.length) {\n\t\t\tpparts.push(cparts.shift())\n\t\t}\n\t\treturn pparts.join('/')\n\t}\n\t\n\treturn currentPath\n}\n\nmodule.exports = calculateRelativePath","\nconst resolveDataPath = require('./resolve-data-path')\nfunction evaluateInContext(context, expression, dataFunctions, globalData) {\n\tif (!expression) {\n\t\treturn null\n\t}\n\tif (typeof expression === 'string') {\n\t\texpression = expression.trim()\n\t}\n\n\tif (expression === '$this' || expression === 'this') {\n\t\treturn context\n\t}\n\tif (typeof context === 'object' && expression in context) {\n\t\treturn context[expression]\n\t}\n\tif (expression === '\"\"' || expression === \"''\") {\n\t\treturn ''\n\t}\n\tlet resolved = resolveDataPath(context, expression)\n\tif (resolved === null || resolved === undefined) {\n\t\tresolved = resolveDataPath({\n\t\t\t'$globals': globalData\n\t\t}, expression)\n\t}\n\tif (resolved === null || resolved === undefined) {\n\t\tresolved = _evaluateInContext.call(context, context, expression, dataFunctions, globalData)\n\t}\n\treturn resolved\n}\n\nlet evalFunction = new Function('additionalContexts',\n\t`with ({\n\t\t'$globals': additionalContexts.globalData\n\t}) {\n\t\twith (additionalContexts.dataFunctions) {\n\t\t\twith (additionalContexts.context) {\n\t\t\t\ttry {\n\t\t\t\t\treturn eval(additionalContexts.expression);\n\t\t\t\t} catch (e) {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}`\n)\n\nfunction _evaluateInContext(context, expression, dataFunctions, globalData) {\n\tdataFunctions = dataFunctions || {}\n\tglobalData = globalData || {}\n\n\n\tlet result = evalFunction.call(this, {\n\t\tglobalData: globalData\n\t\t, dataFunctions: dataFunctions\n\t\t, context: context\n\t\t, expression: expression\n\t})\n\treturn result\n}\n\nmodule.exports = evaluateInContext","\nlet ActiveElement = require('./active-element')\nvar calculateRelativePath = require('./calculate-relative-path')\nlet evaluateInContext = require('./evaluate-in-context')\n\nclass ExecutionContext {\n\t/**\n\t * \n\t * @param {Tripartite} tripartite \n\t * @param {function} template \n\t * @param {stream} [destination]\n\t */\n\tconstructor(tripartite, template, data = {}, destination = '', dataFunctions = {}) {\n\t\tthis.tripartite = tripartite\n\t\tthis.template = template\n\t\tthis.destination = destination\n\t\tthis.initialData = data\n\t\tthis.currentData = []\n\t\tthis.dataFunctions = dataFunctions\n\t\tthis.continueOnTripartiteError = true\n\t\t\n\t\t// Sometimes large pages have so many elements that we exceed\n\t\t// the maximum call depth. This happens when we have a lot of elements all being\n\t\t// rendered by the same templates. That is, there's no async callback when a template\n\t\t// is loaded, only instant callbacks.\n\t\t// The downside to doing very frequent async calls is that it takes a lot longer to\n\t\t// to get called from a setTimeout than it does to call directly. We want ot keep\n\t\t// the time between needing to do that reasonably long. Unfortunately, there's no\n\t\t// easy/fast way to detect the call stack depth, so we rely on this proxy.\n\t\tthis.callCount = 0\n\t\tthis.callDepthLimit = 1000\n\t}\n\n\t/**\n\t * \n\t * @param {function} [callback] called when done\n\t * @returns Returns the string of stream as the result of the operation\n\t */\n\trun(callback) {\n\t\tlet ourCallback\n\t\tif (callback) {\n\t\t\tourCallback = () => {\n\t\t\t\tcallback(null, this.destination)\n\t\t\t}\n\t\t}\n\n\t\tthis._run(this.template, this.initialData, ourCallback)\n\n\t\treturn this.destination\n\t}\n\n\t_resolveHandlingExpression(template, handlingExpression, data) {\n\t\tif (!handlingExpression) {\n\t\t\thandlingExpression = defaultTemplateName\n\t\t}\n\t\tif (handlingExpression.charAt(0) == '$') {\n\t\t\t// Indicates the handling espression is not a literal template name but is a string which should\n\t\t\t// be evaluated to determine the template name\n\t\t\thandlingExpression = evaluateInContext(data, handlingExpression.substring(1), this.dataFunctions, this.initialData)\n\t\t}\n\t\t// resolve relative template paths\n\t\tif (handlingExpression.indexOf('./') == 0 || handlingExpression.indexOf('../') == 0) {\n\t\t\thandlingExpression = calculateRelativePath(template.templateMeta.name, handlingExpression)\n\t\t}\n\n\t\treturn handlingExpression\n\t}\n\n\t_run(template, data, callback) {\n\t\tlet parts = [...template.parts].reverse()\n\t\tconst processParts = () => {\n\t\t\t\n\t\t\t// check to see how far down in the call stack we are. If too far down,\n\t\t\t// come back in the next tick.\n\t\t\tthis.callCount++\n\t\t\tif(this.callCount++ > this.callDepthLimit) {\n\t\t\t\tsetTimeout(()=> {\n\t\t\t\t\tthis.callCount = 0\n\t\t\t\t\tprocessParts()\n\t\t\t\t})\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tif (parts.length > 0) {\n\t\t\t\tlet part = parts.pop()\n\t\t\t\tif (typeof part === 'string') {\n\t\t\t\t\tthis.output(part)\n\t\t\t\t\tprocessParts()\n\t\t\t\t}\n\t\t\t\telse if (part instanceof ActiveElement) {\n\t\t\t\t\tlet conditional = part.conditionalExpression || part.dataExpression\n\t\t\t\t\tlet conditionalResult = false\n\t\t\t\t\tlet resultData\n\t\t\t\t\tif (conditional == null || conditional == undefined || conditional === '') {\n\t\t\t\t\t\t// Because if they didn't specify a condition or data, they probably \n\t\t\t\t\t\t// just want the template to be run as is\n\t\t\t\t\t\tconditionalResult = true\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tif(part.conditionalExpression) {\n\t\t\t\t\t\t\tlet result = evaluateInContext(data, part.conditionalExpression, this.dataFunctions, this.initialData)\n\t\t\t\t\t\t\tif (result) {\n\t\t\t\t\t\t\t\tconditionalResult = true\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t// This means we're evaluating the data expression to see if we should run the template\n\t\t\t\t\t\t\tresultData = evaluateInContext(data, part.dataExpression, this.dataFunctions, this.initialData)\n\t\t\t\t\t\t\tif(resultData === null || resultData === undefined) {\n\t\t\t\t\t\t\t\tconditionalResult = false\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse if (typeof resultData === 'number') {\n\t\t\t\t\t\t\t\t// if the result is a number, any number, we want to output it\n\t\t\t\t\t\t\t\t// unless the number is from the conditional expression, in which\n\t\t\t\t\t\t\t\t// case we want to evaluate it as truthy\n\t\t\t\t\t\t\t\tconditionalResult = true\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse if(Array.isArray(resultData) && resultData.length > 0) {\n\t\t\t\t\t\t\t\tconditionalResult = true\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse if(resultData) {\n\t\t\t\t\t\t\t\tconditionalResult = true\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\n\t\t\t\t\tif (conditionalResult) {\n\t\t\t\t\t\tif (part.dataExpression && resultData === undefined) {\n\t\t\t\t\t\t\tresultData = evaluateInContext(data, part.dataExpression, this.dataFunctions, this.initialData)\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif(resultData === null || resultData === undefined) {\n\t\t\t\t\t\t\tresultData = data\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tlet handlingExpression = this._resolveHandlingExpression(template, part.handlingExpression, data)\n\t\t\t\t\t\tlet handlingTemplate\n\t\t\t\t\t\tlet children = (Array.isArray(resultData) ? [...resultData] : [resultData]).reverse()\n\t\t\t\t\t\tconst applyTemplate = () => {\n\t\t\t\t\t\t\tif (children.length > 0) {\n\t\t\t\t\t\t\t\tlet child = children.pop()\n\t\t\t\t\t\t\t\tthis._run(handlingTemplate, child, () => {\n\t\t\t\t\t\t\t\t\tapplyTemplate()\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\tprocessParts()\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif(handlingExpression in this.tripartite.templates) {\n\t\t\t\t\t\t\thandlingTemplate = this.tripartite.getTemplate(handlingExpression)\n\t\t\t\t\t\t\tif (handlingTemplate) {\n\t\t\t\t\t\t\t\tapplyTemplate()\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t// the template has been loaded before but is empty\n\t\t\t\t\t\t\t\tif (this.continueOnTripartiteError) {\n\t\t\t\t\t\t\t\t\tprocessParts()\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tthis.tripartite.loadTemplate(handlingExpression, (template) => {\n\t\t\t\t\t\t\t\tif (!template) {\n\t\t\t\t\t\t\t\t\tlet msg = 'Could not load template: ' + handlingExpression\n\t\t\t\t\t\t\t\t\tconsole.error(msg)\n\t\t\t\t\t\t\t\t\tif (this.continueOnTripartiteError) {\n\t\t\t\t\t\t\t\t\t\tprocessParts()\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\t\tlet err = new Error(msg)\n\t\t\t\t\t\t\t\t\t\tif (callback) {\n\t\t\t\t\t\t\t\t\t\t\tcallback(err)\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\t\t\tthrow err\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\thandlingTemplate = template\n\t\t\t\t\t\t\t\t\tapplyTemplate()\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tprocessParts()\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if (typeof part === 'function') {\n\t\t\t\t\tif(part.write) {\n\t\t\t\t\t\tpart.write(data, this.destination, () => {\n\t\t\t\t\t\t\tprocessParts()\n\t\t\t\t\t\t})\n\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tthis.output(part(data))\n\t\t\t\t\t\tprocessParts()\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif (callback) {\n\t\t\t\t\tcallback()\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tprocessParts()\n\t}\n\n\t/**\n\t * \n\t * @param {string} value \n\t */\n\toutput(value) {\n\t\tif(value === null || value === undefined) {\n\t\t\treturn\n\t\t}\n\t\tif (typeof this.destination === 'string') {\n\t\t\tthis.destination += value\n\t\t}\n\t\telse if (this.destination.write) {\n\t\t\tthis.destination.write(value)\n\t\t}\n\t}\n}\n\n\nmodule.exports = ExecutionContext","/*\nfunction resolveDataPath(data, path) {\n\tif(data === null || data === undefined) {\n\t\treturn data\n\t}\n\tlet parts\n\tif(typeof path === 'string') {\n\t\tparts = path.trim().split('.')\n\t}\n\telse if(Array.isArray(path)) {\n\t\tparts = path\n\t}\n\t\n\tlet name = parts.shift()\n\tif(name.indexOf(' ') > -1) {\n\t\t// there's a space, which means it's really unlikely it's a property\n\t\treturn null\n\t}\n\tlet child\n\tif(name === 'this' || name === '$this') {\n\t\tchild = data\n\t}\n\telse if(typeof data === 'object') {\n\t\tif(name in data) {\n\t\t\tchild = data[name]\n\t\t}\n\t}\n\tif(parts.length > 0) {\n\t\treturn resolveDataPath(child, parts)\n\t}\n\telse {\n\t\treturn child\n\t}\n} */\nfunction resolveDataPath(data, path) {\n\tif (data === null || data === undefined) {\n\t\treturn data\n\t}\n\tlet parts\n\tif (typeof path === 'string') {\n\t\tparts = path.trim().split('.')\n\t}\n\telse if (Array.isArray(path)) {\n\t\tparts = path\n\t}\n\n\twhile (parts.length > 0) {\n\t\tlet name = parts.shift()\n\t\tif (name.indexOf(' ') > -1) {\n\t\t\t// there's a space, which means it's really unlikely it's a property\n\t\t\treturn null\n\t\t}\n\t\tlet child\n\t\tif (name === 'this' || name === '$this') {\n\t\t\tchild = data\n\t\t}\n\t\telse if (typeof data === 'object') {\n\t\t\tif (name in data) {\n\t\t\t\tchild = data[name]\n\t\t\t}\n\t\t}\n\t\tif (parts.length == 0) {\n\t\t\treturn child\n\t\t}\n\t\tdata = child\n\t}\n}\n\nmodule.exports = resolveDataPath","\n\n\nif (typeof String.prototype.trim !== 'function') {\n\tString.prototype.trim = function () {\n\t\treturn this.replace(/^\\s+|\\s+$/g, '');\n\t}\n}\n\n\nfunction isStream(stream) {\n\treturn stream !== null\n\t\t&& typeof stream === 'object'\n\t\t&& typeof stream.pipe === 'function';\n}\n\n\nfunction isTemplate(obj) {\n\tif (!obj) {\n\t\treturn false\n\t}\n\tif (typeof obj !== 'function') {\n\t\treturn false\n\t}\n\tif (!obj.write) {\n\t\treturn false\n\t}\n\tif (!obj.parts) {\n\t\treturn false\n\t}\n\tif (!obj.templateMeta) {\n\t\treturn false\n\t}\n\n\treturn true\n}\n\nlet ExecutionContext = require('./execution-context')\nlet ActiveElement = require('./active-element')\n\n\nclass Tripartite {\n\tconstructor(options = {}) {\n\t\tthis.templates = {\n\t\t\tdefaultTemplate: this._makeTemplate(function (thedata) {\n\t\t\t\treturn '' + thedata;\n\t\t\t})\n\t\t}\n\t\tlet { constants = {\n\t\t\ttemplateBoundary: '__',\n\t\t\ttemplateNameBoundary: '##'\n\t\t} } = options\n\t\tthis.constants = constants\n\n\t\t// This object (if set) will receive the template functions parsed from a script\n\t\t// I want to be able to call my templates as global functions, so I've set it\n\t\t// to be the window object\n\t\tthis.secondaryTemplateFunctionObject = options.secondaryTemplateFunctionObject\n\n\t\tthis.loaders = options.loaders || []\n\n\t\tthis.dataFunctions = options.dataFunction || {}\n\t}\n\n\t_makeTemplate(transformationFunction) {\n\t\tif (isTemplate(transformationFunction)) {\n\t\t\treturn transformationFunction\n\t\t}\n\t\tlet tri = this\n\t\tlet f = function (thedata) {\n\t\t\tlet stream = null\n\t\t\tlet options = null\n\t\t\tlet callback = null\n\t\t\tfor (let i = 1; i < arguments.length; i++) {\n\t\t\t\tlet arg = arguments[i]\n\t\t\t\tif (isStream(arg)) {\n\t\t\t\t\tstream = arg\n\t\t\t\t}\n\t\t\t\telse if(typeof arg === 'function') {\n\t\t\t\t\tcallback = arg\n\t\t\t\t}\n\t\t\t\telse if(typeof arg === 'object') {\n\t\t\t\t\toptions = arg\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn f.write(thedata, stream, callback, options)\n\t\t}\n\t\tf.write = function (thedata, stream, callback, options = {}) {\n\t\t\tif(transformationFunction && transformationFunction.write) {\n\t\t\t\t// if it's not a template, but has a write method, invoke the right method directly\n\t\t\t\treturn transformationFunction.write.apply(transformationFunction, arguments)\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlet dest = stream || ''\n\n\t\t\t\tlet context = new ExecutionContext(tri, f, thedata, dest, tri.dataFunctions)\n\t\t\t\tif (options && 'continueOnTripartiteError' in options) {\n\t\t\t\t\tcontext.continueOnTripartiteError = options.continueOnTripartiteError\n\t\t\t\t}\n\n\t\t\t\treturn context.run(callback)\n\t\t\t}\n\t\t}\n\t\tf.parts = []\n\t\tif (transformationFunction && typeof transformationFunction === 'function') {\n\t\t\tf.parts.push(transformationFunction)\n\t\t}\n\t\tf.templateMeta = {}\n\t\treturn f\n\t}\n\n\taddTemplate(name, template) {\n\t\tif (typeof template === 'string') {\n\t\t\ttemplate = this.parseTemplate(template);\n\t\t}\n\t\telse if (typeof template === 'function') {\n\t\t\ttemplate = this._makeTemplate(template)\n\t\t}\n\n\t\tthis.templates[name] = template;\n\t\ttemplate.templateMeta = template.templateMeta || {}\n\t\ttemplate.templateMeta.name = name\n\t\treturn template;\n\t}\n\n\tcreateBlank() {\n\t\treturn new Tripartite()\n\t}\n\n\tgetTemplate(name) {\n\t\treturn this.templates[name]\n\t}\n\n\tloadTemplate(name, callback) {\n\t\tif (name in this.templates) {\n\t\t\tcallback(this.templates[name])\n\t\t}\n\t\telse {\n\t\t\tlet tri = this\n\t\t\tlet count = this.loaders.length\n\t\t\tlet done = false\n\n\t\t\tif (count == 0) {\n\t\t\t\ttri.templates[name] = null\n\t\t\t\tcallback(tri.getTemplate(name))\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis.loaders.forEach(loader => {\n\t\t\t\t\tif (done) {\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t\tloader(name, template => {\n\t\t\t\t\t\tif (done) {\n\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcount--\n\t\t\t\t\t\tif (template) {\n\t\t\t\t\t\t\tdone = true\n\t\t\t\t\t\t\ttri.addTemplate(name, template)\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (count == 0) {\n\t\t\t\t\t\t\tdone = true\n\t\t\t\t\t\t\ttri.templates[name] = null\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (done) {\n\t\t\t\t\t\t\tcallback(tri.getTemplate(name))\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\t}\n\tparseTemplateScript(tx) {\n\t\tvar tks = this.tokenizeTemplateScript(tx);\n\t\t/* current template name */\n\t\tvar ctn = null;\n\t\tfor (var i = 0; i < tks.length; i++) {\n\t\t\tvar token = tks[i];\n\t\t\tif (token.active) {\n\t\t\t\tctn = token.content;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif (ctn) {\n\t\t\t\t\tvar template = this.addTemplate(ctn, this.stripTemplateWhitespace(token.content));\n\t\t\t\t\tif (this.secondaryTemplateFunctionObject) {\n\t\t\t\t\t\tthis.secondaryTemplateFunctionObject[ctn] = template;\n\t\t\t\t\t}\n\t\t\t\t\tctn = null;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tstripTemplateWhitespace(txt) {\n\t\tvar i = txt.indexOf('\\n');\n\t\tif (i > -1 && txt.substring(0, i).trim() == '') {\n\t\t\ttxt = txt.substring(i + 1);\n\t\t}\n\t\ti = txt.lastIndexOf('\\n');\n\t\tif (i > -1 && txt.substring(i).trim() == '') {\n\t\t\ttxt = txt.substring(0, i);\n\t\t}\n\t\treturn txt;\n\t}\n\n\t/* simple template */\n\t_createActiveElement(/* conditional expression */ cd, data, /* handling expression */ hd, tripartite, templateMeta) {\n\t\tlet el = new ActiveElement(cd, data, hd, tripartite);\n\t\tel.templateMeta = templateMeta\n\t\treturn el\n\t}\n\tpt(tx) {\n\t\treturn this.parseTemplate(tx)\n\t}\n\t/* parse template */\n\tparseTemplate(tx) {\n\t\tvar tks = this.tokenizeTemplate(tx);\n\t\tlet t = this._makeTemplate()\n\t\tvar templateMeta = t.templateMeta\n\n\t\tfor (let tk of tks) {\n\t\t\tif (tk.active) {\n\t\t\t\tt.parts.push(this.tokenizeActivePart(tk.content, templateMeta));\n\t\t\t}\n\t\t\telse if (tk.content) {\n\t\t\t\tt.parts.push(tk.content);\n\t\t\t}\n\t\t}\n\n\t\treturn t\n\t}\n\n\ttokenizeActivePart(tx, templateMeta) {\n\t\tvar con = null;\n\t\tvar dat = null;\n\t\tvar han = null;\n\n\t\t/* condition index */\n\t\tvar ci = tx.indexOf('??');\n\t\tif (ci > -1) {\n\t\t\tcon = tx.substring(0, ci);\n\t\t\tci += 2;\n\t\t}\n\t\telse {\n\t\t\tci = 0;\n\t\t}\n\n\t\t/* handler index */\n\t\tvar hi = tx.indexOf('::');\n\t\tif (hi > -1) {\n\t\t\tdat = tx.substring(ci, hi);\n\t\t\than = tx.substring(hi + 2);\n\t\t}\n\t\telse {\n\t\t\tdat = tx.substring(ci);\n\t\t}\n\t\treturn this._createActiveElement(con, dat, han, this, templateMeta);\n\t}\n\n\ttokenizeTemplate(tx) {\n\t\treturn this.tokenizeActiveAndInactiveBlocks(tx, this.constants.templateBoundary);\n\t}\n\n\n\t/** tokenize template script */\n\ttokenizeTemplateScript(tx) {\n\t\treturn this.tokenizeActiveAndInactiveBlocks(tx, this.constants.templateNameBoundary);\n\t}\n\n\t/* tokenize active and inactive blocks */\n\ttokenizeActiveAndInactiveBlocks(text, /*Active Region Boundary */ boundary) {\n\t\t/* whole length */\n\t\tlet length = text.length\n\n\t\t/* current position */\n\t\tlet position = 0\n\n\t\t/* are we in an active region */\n\t\tlet act = false\n\n\t\tlet tokens = []\n\n\t\twhile (position < length) {\n\t\t\tlet i = text.indexOf(boundary, position);\n\t\t\tif (i == -1) {\n\t\t\t\ti = length;\n\t\t\t}\n\t\t\tvar tk = { active: act, content: text.substring(position, i) };\n\t\t\ttokens.push(tk);\n\t\t\tposition = i + boundary.length;\n\t\t\tact = !act;\n\t\t}\n\n\t\treturn tokens;\n\t}\n\n}\nvar tripartiteInstance = new Tripartite()\n\nif (typeof window != 'undefined') {\n\ttripartiteInstance.secondaryTemplateFunctionObject = window\n}\n\n\nif (typeof module !== 'undefined') {\n\tmodule.exports = tripartiteInstance\n}\nelse {\n\twindow.Tripartite = tripartiteInstance\n}\n\nif (typeof global != 'undefined') {\n\tif (!global.Tripartite) {\n\t\tglobal.Tripartite = Tripartite\n\t}\n\tif (!global.tripartite) {\n\t\tglobal.tripartite = tripartiteInstance\n\t}\n}\n\n","var tri = require(\"tripartite\"); var t = \"<span class=\\\"extension-pill\\\">__this__<\\/span>\"; \nmodule.exports = tri.addTemplate(\"webhandle-tree-image-browser/extension-pill\", t); ","var tri = require(\"tripartite\"); var t = \"<div class=\\\"guided-image-upload-form ei-form\\\">\\n\\t<label>\\n\\t\\tSource file name:<br>\\n\\t\\t__nativeName__\\n\\t<\\/label>\\n\\t<label>\\n\\t\\tAfter uploaded name (with extension):\\n\\t\\t<input name=\\\"name\\\" type=\\\"text\\\" \\/>\\n\\t<\\/label>\\n\\t\\n<\\/div>\"; \nmodule.exports = tri.addTemplate(\"webhandle-tree-image-browser/guilded-file-upload-form\", t); ","var tri = require(\"tripartite\"); var t = \"<div class=\\\"guided-image-upload-form ei-form\\\">\\n\\t<label>\\n\\t\\tSource file name:<br>\\n\\t\\t__nativeName__\\n\\t<\\/label>\\n\\t<label>\\n\\t\\tNative resolution:<br>\\n\\t\\t__stats.width__ x __stats.height__\\n\\t<\\/label>\\n\\t<label>\\n\\t\\tAfter uploaded name (no extension):\\n\\t\\t<input name=\\\"name\\\" type=\\\"text\\\" \\/>\\n\\t<\\/label>\\n\\t<div class=\\\"radio-options\\\">\\n\\t\\tOutput format:\\n\\t\\t<label>\\n\\t\\t\\t<input type=\\\"radio\\\" name=\\\"outputFormat\\\" value=\\\"image\\/png\\\" \\/> <span class=\\\"extension-pill\\\">PNG<\\/span>\\n\\t\\t<\\/label>\\n\\t\\t<label>\\n\\t\\t\\t<input type=\\\"radio\\\" name=\\\"outputFormat\\\" value=\\\"image\\/jpeg\\\" \\/> <span class=\\\"extension-pill\\\">JPG<\\/span>\\n\\t\\t<\\/label>\\n\\t<\\/div>\\n\\t<label>\\n\\t\\tOn screen width (px):\\n\\t\\t<input name=\\\"width\\\" type=\\\"number\\\" \\/>\\n\\t<\\/label>\\n\\t<label>\\n\\t\\tOutput quality (0 to 1):\\n\\t\\t<input name=\\\"quality\\\" value=\\\"0.7\\\" type=\\\"number\\\" min=\\\"0\\\" max=\\\"1\\\" step=\\\".01\\\" \\/>\\n\\t<\\/label>\\n\\t\\n\\t<label>\\n\\t\\tAlt text:\\n\\t\\t<textarea name=\\\"altText\\\"><\\/textarea>\\n\\t<\\/label>\\n\\t\\n<\\/div>\"; \nmodule.exports = tri.addTemplate(\"webhandle-tree-image-browser/guilded-image-upload-form\", t); ","var tri = require(\"tripartite\"); var t = \"<div class=\\\"image-browser-frame\\\">\\n\\t<div class=\\\"directory-side\\\">\\n\\t\\t<div class=\\\"treebox\\\">\\n\\n\\t\\t<\\/div>\\n\\t\\t<div class=\\\"directory-controls\\\">\\n\\t\\t\\t<button type=\\\"button\\\" class=\\\"btn create-directory\\\" title=\\\"create new directory\\\">\\n\\t\\t\\t\\t<span class=\\\"material-icons thumbnail-icon\\\">\\n\\t\\t\\t\\t\\tcreate_new_folder\\n\\t\\t\\t\\t<\\/span>\\n\\t\\t\\t<\\/button>\\n\\t\\t\\t<button type=\\\"button\\\" class=\\\"btn delete-directory\\\" title=\\\"delete selected directory\\\">\\n\\t\\t\\t\\t<span class=\\\"material-icons thumbnail-icon\\\">\\n\\t\\t\\t\\t\\tfolder_delete\\n\\t\\t\\t\\t<\\/span>\\n\\t\\t\\t<\\/button>\\n\\t\\t<\\/div>\\n\\t<\\/div>\\n\\t<div class=\\\"node-view\\\">\\n\\t\\t<div class=\\\"view-controls\\\">\\n\\t\\t\\t<div class=\\\"left\\\">\\n\\t\\t\\t\\t<input name=\\\"filter\\\" type=\\\"text\\\" placeholder=\\\"filter\\\" \\/>\\n\\t\\t\\t\\t<button class=\\\"clear-filter\\\">×<\\/button>\\n\\t\\t\\t<\\/div>\\n\\t\\t\\t<div class=\\\"right\\\">\\n\\t\\t\\t\\t<span class=\\\"view-icons\\\">\\n\\t\\t\\t\\t\\t<button type=\\\"button\\\" class=\\\"show-large-tiles\\\" title=\\\"show big tiles\\\" data-show-class=\\\"grid-large\\\">\\n\\t\\t\\t\\t\\t\\t<span class=\\\"material-icons thumbnail-icon\\\">\\n\\t\\t\\t\\t\\t\\t\\tgrid_view\\n\\t\\t\\t\\t\\t\\t<\\/span>\\n\\t\\t\\t\\t\\t<\\/button>\\n\\t\\t\\t\\t\\t<button type=\\\"button\\\" class=\\\"show-small-tiles\\\" title=\\\"show small tiles\\\"\\n\\t\\t\\t\\t\\t\\tdata-show-class=\\\"grid-small\\\">\\n\\t\\t\\t\\t\\t\\t<span class=\\\"material-icons thumbnail-icon\\\">\\n\\t\\t\\t\\t\\t\\t\\tgrid_on\\n\\t\\t\\t\\t\\t\\t<\\/span>\\n\\t\\t\\t\\t\\t<\\/button>\\n\\t\\t\\t\\t\\t<button type=\\\"button\\\" class=\\\"show-list-rows\\\" title=\\\"show as rows\\\" data-show-class=\\\"rows\\\">\\n\\t\\t\\t\\t\\t\\t<span class=\\\"material-icons thumbnail-icon\\\">\\n\\t\\t\\t\\t\\t\\t\\tlist\\n\\t\\t\\t\\t\\t\\t<\\/span>\\n\\t\\t\\t\\t\\t<\\/button>\\n\\t\\t\\t\\t\\t<button type=\\\"button\\\" class=\\\"show-list-text\\\" title=\\\"show as list\\\" data-show-class=\\\"list-text\\\">\\n\\t\\t\\t\\t\\t\\t<span class=\\\"material-icons thumbnail-icon\\\">\\n\\t\\t\\t\\t\\t\\t\\ttable_rows\\n\\t\\t\\t\\t\\t\\t<\\/span>\\n\\t\\t\\t\\t\\t<\\/button>\\n\\t\\t\\t\\t<\\/span>\\n\\n\\t\\t\\t<\\/div>\\n\\t\\t<\\/div>\\n\\t\\t<div class=\\\"node-content\\\">\\n\\t\\t\\t<div class=\\\"box-holder\\\">\\n\\t\\t\\t\\t<div class=\\\"choice-boxes\\\">\\n\\t\\t\\t\\t<\\/div>\\n\\t\\t\\t<\\/div>\\n\\t\\t<\\/div>\\n\\t\\t<div class=\\\"bottom-controls\\\">\\n\\t\\t\\t<div class=\\\"file-controls\\\">\\n\\t\\t\\t\\t<button type=\\\"button\\\" class=\\\"btn delete-file\\\" title=\\\"delete selected file(s)\\\">\\n\\t\\t\\t\\t\\t<span class=\\\"material-icons thumbnail-icon\\\">\\n\\t\\t\\t\\t\\t\\tdelete\\n\\t\\t\\t\\t\\t<\\/span>\\n\\t\\t\\t\\t<\\/button>\\n\\t\\t\\t\\t<button type=\\\"button\\\" class=\\\"btn upload-file\\\" title=\\\"upload file(s)\\\">\\n\\t\\t\\t\\t\\t<span class=\\\"material-icons thumbnail-icon\\\">\\n\\t\\t\\t\\t\\t\\tupload\\n\\t\\t\\t\\t\\t<\\/span>\\n\\t\\t\\t\\t<\\/button>\\n\\t\\t\\t<\\/div>\\n\\t\\t\\t<div class=\\\"folder-info\\\">\\n\\t\\t\\t\\t\\n\\t\\t\\t<\\/div>\\n\\n\\t\\t<\\/div>\\n\\t<\\/div>\\n\\t<div class=\\\"drop-cover file-drop-cover\\\">\\n\\t\\t<div class=\\\"drop-type literal\\\">\\n\\t\\t\\t<div class=\\\"msg\\\">\\n\\t\\t\\t\\t<h2>\\n\\t\\t\\t\\t\\tJust Do It\\n\\t\\t\\t\\t<\\/h2>\\n\\t\\t\\t\\t<p>\\n\\t\\t\\t\\t\\tWe won't mess the files at all, just upload them.\\n\\t\\t\\t\\t<\\/p>\\n\\t\\t\\t<\\/div>\\n\\t\\t<\\/div>\\n\\t<\\/div>\\n\\t<div class=\\\"drop-cover img-drop-cover\\\">\\n\\t\\t<div class=\\\"drop-type guided-upload\\\">\\n\\t\\t\\t<div class=\\\"msg\\\">\\n\\t\\t\\t\\t<h2>Guided Upload<\\/h2>\\n\\t\\t\\t\\t<p>\\n\\t\\t\\t\\t\\tLet us help you rename, and resize (if needed), the files by asking you questions\\n\\t\\t\\t\\t<\\/p>\\n\\t\\t\\t<\\/div>\\n\\t\\t<\\/div>\\n\\t\\t<div class=\\\"drop-type automatic\\\">\\n\\t\\t\\t<div class=\\\"msg\\\">\\n\\t\\t\\t\\t<h2>\\n\\t\\t\\t\\t\\tWeb Safe\\n\\t\\t\\t\\t<\\/h2>\\n\\t\\t\\t\\t<p>\\n\\t\\t\\t\\t\\tWe'll rename the files so they fit better with the web and create multiple formats images.\\n\\t\\t\\t\\t<\\/p>\\n\\t\\t\\t<\\/div>\\n\\t\\t<\\/div>\\n\\t\\t<div class=\\\"drop-type literal\\\">\\n\\t\\t\\t<div class=\\\"msg\\\">\\n\\t\\t\\t\\t<h2>\\n\\t\\t\\t\\t\\tJust Do It\\n\\t\\t\\t\\t<\\/h2>\\n\\t\\t\\t\\t<p>\\n\\t\\t\\t\\t\\tWe won't mess the files at all, just upload them.\\n\\t\\t\\t\\t<\\/p>\\n\\t\\t\\t<\\/div>\\n\\t\\t<\\/div>\\n\\n\\t<\\/div>\\n\\t<div class=\\\"hidden-elements\\\">\\n\\t\\t<input name=\\\"fileUpload\\\" type=\\\"file\\\" placeholder=\\\"Upload a file\\\" \\/>\\n\\t\\t\\n\\t<\\/div>\\n\\n<\\/div>\"; \nmodule.exports = tri.addTemplate(\"webhandle-tree-image-browser/image-browser-frame\", t); ","var tri = require(\"tripartite\"); var t = \"<div class=\\\"variant-choice-box\\\">\\n\\t<div class=\\\"img\\\">\\n\\t\\t__!this.thumbnail??'<span class=\\\"material-icons thumbnail-icon\\\">' + thumbnailIcon + '<\\/span>'__\\n\\t\\t__this.thumbnail??'<img loading=\\\"lazy\\\" class=\\\"thumbnail-image\\\" src=\\\"' + safeThumbnail + '\\\" \\/>'__\\n\\t<\\/div>\\n\\t<div class=\\\"size-line\\\">\\n\\t\\t__size__\\n\\t<\\/div>\\n\\t<div class=\\\"bottom\\\">\\n\\t\\t<div class=\\\"content\\\">\\n\\t\\t\\t<div class=\\\"basename\\\">\\n\\t\\t\\t\\t__safeBaseName__\\n\\t\\t\\t<\\/div>\\n\\t\\t\\t<div class=\\\"extensions\\\">\\n\\t\\t\\t\\t__extensions::.\\/extension-pill__\\n\\t\\t\\t<\\/div>\\n\\t\\t<\\/div>\\n\\t\\t<div class=\\\"actions\\\">\\n\\t\\t\\t<button class=\\\"details\\\">\\n\\t\\t\\t\\t<span class=\\\"material-icons\\\">more_vert<\\/span>\\n\\t\\t\\t<\\/button>\\n\\t\\t<\\/div>\\n\\t<\\/div>\\n\\n<\\/div>\"; \nmodule.exports = tri.addTemplate(\"webhandle-tree-image-browser/variant-choice-box\", t); ","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","export default function eventEntryMapper([key, value]) {\n\tkey = key.trim()\n\tlet parts = key.split(' ')\n\tlet event = parts.shift().trim()\n\tlet selector = parts.join(' ').trim()\n\t\n\tif(typeof value === 'string') {\n\t\tvalue = value.trim()\n\t}\t\n\t\n\treturn {\n\t\tevent: event,\n\t\tselector: selector,\n\t\thandler: value\n\t}\n}","import generateId from \"./generate-id.js\"\n// import pick from \"./pick.js\"\nimport eventEntryMapper from \"./event-entry-mapper.js\"\nimport extractEventNames from \"./extract-event-names.js\"\n\nlet defaultOptions = {\n\t// The default `tagName` of a View's element is `\"div\"`.\n\ttagName: 'div'\n\t\n\t, events: {}\n\n}\nlet viewOptions = ['model', 'el', 'id', 'attributes', 'className', 'tagName', 'events'];\n\n/**\n * A way to connect data to be displayed, a way to display it, and an organization\n * of functions to handle events.\n */\nexport class View {\n\tconstructor(options) {\n\t\tthis.id = generateId()\n\t\tObject.assign(this, defaultOptions)\n\t\tthis.preinitialize.apply(this, arguments);\n\t\tObject.assign(this, options)\n\t\tthis._ensureElement()\n\t\tthis.initialize.apply(this, arguments);\n\t}\n\n\n\t/**\n\t * preinitialize is an empty function by default. You can override it with a function\n\t * or object. preinitialize will run before any instantiation logic is run in the View\n\t */\n\tpreinitialize() { }\n\n\t/**\n\t * Initialize is an empty function by default. Override it with your own\n\t * initialization logic.\n\t */\n\tinitialize() { }\n\n\t/**\n\t * **render** is the core function that your view should override, in order\n\t * to populate its element (`this.el`), with the appropriate HTML. The\n\t * convention is for **render** to always return `this`.\n\t * @returns this\n\t */\n\trender() {\n\t\treturn this\n\t}\n\t\n\t/**\n\t * Removes the element from the dom. Does not disable event listeners\n\t */\n\tremove() {\n\t\tthis.el.parentElement.removeChild(this.el)\n\t}\n\t\n\t/**\n\t * Adds this view as a child to a containing element. Nothing special is going on here.\n\t * This is just a shortcut for container.appendChild\n\t * @param {Element} container \n\t */\n\tappendTo(container) {\n\t\tcontainer.appendChild(this.el)\n\t}\n\n\t/**\n\t * Clears the contents of the container and adds this view.\n\t * @param {Element} container \n\t */\n\treplaceContentsOf(container) {\n\t\tcontainer.innerHTML = ''\n\t\tthis.appendTo(container)\n\t}\n\n\t/**\n\t * Set the element for this view, and if new, adds listeners to it in accordance\n\t * with the \"events\" member.\n\t * @param {Element} el The dom element which will be the root of this view\n\t * @returns this\n\t */\n\tsetElement(el) {\n\t\tif (this.el !== el) {\n\t\t\tthis.el = el\n\t\t\tthis._addListeners()\n\t\t}\n\t\treturn this\n\t}\n\n\t/**\n\t * Produces a DOM element to be assigned to your view. Exposed for\n\t * subclasses using an alternative DOM manipulation API.\n\t * @param {string} name The element tag name\n\t * @returns The dom element\n\t */\n\t_createElement(name) {\n\t\tlet el = document.createElement(name)\n\t\tel.setAttribute('id', this.id)\n\t\tel.view = this\n\t\treturn el\n\t}\n\n\t/**\n\t * Ensures that the element exists. Applies attributes and className\n\t * to it regardless\n\t */\n\t_ensureElement() {\n\t\tif (!this.el) {\n\t\t\tthis.setElement(this._createElement(this.tagName))\n\t\t}\n\t\tthis._setAttributes()\n\t\tif (this.className) {\n\t\t\tthis.el.classList.add(this.className)\n\t\t}\n\t}\n\n\t/**\n\t * Set attributes from a hash on this view's element. Exposed for\n\t * subclasses using an alternative DOM manipulation API.\n\t * @param {object} attributes \n\t */\n\t_setAttributes(attributes) {\n\t\tif (this.attributes) {\n\t\t\tfor (let [key, value] of Object.entries(this.attributes)) {\n\t\t\t\tthis.el.setAttribute(key, value)\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * \n\t * Set callbacks, where `this.events` is a hash of\n\t * *{\"event selector\": \"callback\"}*\n\t *\n\t * {\n\t * 'mousedown .title': 'edit',\n\t * 'click .button': 'save',\n\t * 'click .open': function(e) { ... },\n\t * 'keydown .': \t 'handleKey'\n\t * }\n\t * pairs. Callbacks will be bound to the view, with `this` set properly.\n\t * \n\t * \n\t * Note that the selector `.` will match the root element and can be used\n\t * as a final chance to handle events or for events like an escape key\n\t * which are essentially global to the widget.\n\t * \n\t */\n\t_addListeners() {\n\t\tthis.eventTriggers = Object.entries(this.events).map(eventEntryMapper)\n\t\tlet eventNames = extractEventNames(this.eventTriggers)\t\t\n\n\t\tfor(let eventName of eventNames) {\n\t\t\tthis.el.addEventListener(eventName, this._eventHandler.bind(this))\n\t\t}\n\t}\n\t\n\t/**\n\t * Get the elements from the view which match the selector\n\t * @param {string} selector A css selector. `.` will select the root element\n\t * @returns An array of elements\n\t */\n\t_getCandidates(selector) {\n\t\tif(selector === '.') {\n\t\t\treturn [this.el]\n\t\t}\n\t\treturn Array.from(this.el.querySelectorAll(selector))\n\t}\n\t\n\t/**\n\t * Handles all events for all elements within the view. It attempts to find a\n\t * trigger matching the event and then process it. It will match and invoke\n\t * only one trigger.\n\t * @param {Event} evt \n\t */\n\t_eventHandler(evt) {\n\t\tfor(let trigger of this.eventTriggers) {\n\t\t\tif(evt.type == trigger.event) {\n\t\t\t\tlet candidates = this._getCandidates(trigger.selector)\n\t\t\t\tlet found = null\n\t\t\t\tfor(let candidate of candidates) {\n\t\t\t\t\tif(candidate === evt.target || candidate.contains(evt.target)) {\n\t\t\t\t\t\tfound = candidate\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif(found) {\n\t\t\t\t\tif(typeof trigger.handler === 'string') {\n\t\t\t\t\t\tthis[trigger.handler].call(this, evt, found)\n\t\t\t\t\t}\t\n\t\t\t\t\telse if(typeof trigger.handler === 'function') {\n\t\t\t\t\t\ttrigger.handler.call(this, evt, found)\n\t\t\t\t\t}\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n","/**\n * Generates a random string id in the browser. Will probably not work\n * on the server.\n * @returns A base64 web url safe string\n */\nexport default function generateId() {\n\tlet array = new Uint8Array(32)\n\twindow.crypto.getRandomValues(array)\n\tlet value = btoa(array)\n\tvalue = value.replace(/\\//g, \"_\").replace(/\\+/g, \"-\").replace(/=+$/, \"\")\n\treturn value\n}","export default function extractEventNames(eventTriggers) {\n\tlet eventNames = Array.from(eventTriggers.reduce((acc, trigger) => {\n\t\tacc.add(trigger.event)\n\t\treturn acc\n\t}, new Set()))\n\treturn eventNames\n}","\nimport t3 from './webhandle-tree-image-browser/image-browser-frame.tri';\nimport t4 from './webhandle-tree-image-browser/variant-choice-box.tri'\nimport t5 from './webhandle-tree-image-browser/extension-pill.tri'\nimport t6 from './webhandle-tree-image-browser/guilded-image-upload-form.tri'\nimport t7 from './webhandle-tree-image-browser/guilded-file-upload-form.tri'\n\n\nexport let imageBrowserFrame = t3\nexport let variantChoiceBox = t4\nexport let extensionPill = t5\nexport let guidedImageUploadForm = t6\nexport let guidedFileUploadForm = t7\n","\nexport default function formatBytes(bytes, decimals) {\n\tif (bytes == 0)\n\t\treturn '0 Bytes'\n\tvar k = 1024,\n\t\tdm = decimals || 2,\n\t\tsizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'],\n\t\ti = Math.floor(Math.log(bytes) / Math.log(k))\n\treturn parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i]\n}","\n/**\n * Add this most basic of the EventEmitter functions (on, emit, removeListener) to the browser's\n * EventTarget functionality.\n * \n * The eventEmitter.emit() method allows an arbitrary set of arguments to be passed to the listener \n * functions. Keep in mind that when an ordinary listener function is called, the standard this \n * keyword is intentionally set to reference the EventEmitter instance to which the listener is attached.\n */\nlet base = typeof EventTarget === 'undefined' ? {} : EventTarget\nexport default class EventEmitter extends base {\n\tconstructor(target) {\n\t\tsuper(target)\n\t\tif(target) {\n\t\t\tthis.innerEventTarget = target\n\t\t}\n\t\telse {\n\t\t\tthis.innerEventTarget = this\n\t\t}\n\t}\n\t/**\n\t * Adds the listener function to the end of the listeners array for the event named eventName. No checks \n\t * are made to see if the listener has already been added. Multiple calls passing the same combination \n\t * of eventName and listener will result in the listener being added, and called, multiple times.\n\t * @param {string} eventName The event type name\n\t * @param {*} listener The listener function where has arbitrary arguments\n\t */\n\ton(eventName, listener) {\n\t\tlet nativeListener = (event) => {\n\t\t\tlistener.apply(this, event.detail)\n\t\t}\n\t\tlistener.nativeListener = nativeListener\n\t\tthis.innerEventTarget.addEventListener(eventName, nativeListener)\n\t\treturn this\n\t}\n\n\t/**\n\t * Synchronously calls each of the listeners registered for the event named eventName, in the order \n\t * they were registered, passing the supplied arguments to each.\n\t * \n\t * @param {string} eventName The event type name\n\t * @param {...any} args \n\t */\n\temit(eventName, ...args) {\n\t\tthis.innerEventTarget.dispatchEvent(new CustomEvent(eventName, {\n\t\t\tdetail: args\n\t\t}))\n\t\treturn this\n\t}\n\n\t/**\n\t * Removes the specified listener from the listener array for the event named eventName.\n\t * @param {string} eventName The event type name\n\t * @param {function} listener The listener function\n\t */\n\tremoveListener(eventName, listener) {\n\t\tlistener = listener.nativeListener || listener\n\t\tthis.innerEventTarget.removeEventListener(eventName, listener)\n\t\treturn this\n\t}\n}","let Emitter\nimport Streamish from \"./streamish.mjs\"\nimport EventEmitter from \"./event-emitter.mjs\"\n\nif (typeof EventTarget !== 'undefined') {\n\tEmitter = EventEmitter\n}\nelse {\n\tEmitter = Streamish\n}\n\n\nexport default Emitter","\nexport default class Streamish {\n\tconstructor() {\n\t\tthis.handles = {}\n\t}\n\n\ton(evt, handle) {\n\t\tlet handles = this.handles[evt]\n\t\tif (!handles) {\n\t\t\thandles = this.handles[evt] = []\n\t\t}\n\t\thandles.push(handle)\n\t\treturn this\n\t}\n\n\temit(evt, ...args) {\n\t\tif (evt in this.handles) {\n\t\t\tfor (let handle of this.handles[evt]) {\n\t\t\t\thandle.apply(this, args)\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Removes the specified listener from the listener array for the event named eventName.\n\t * @param {string} eventName The event type name\n\t * @param {function} listener The listener function\n\t */\n\tremoveListener(eventName, listener) {\n\t\tif (eventName in this.handles) {\n\t\t\tthis.handles[eventName] = this.handles[eventName].filter(func => {\n\t\t\t\treturn func !== listener\n\t\t\t})\n\t\t}\n\t}\n}","import Dialog from 'ei-dialog'\nimport formValueInjector from 'form-value-injector'\nimport gatherFormData from '@webhandle/gather-form-data'\n\n\nexport class FormAnswerDialog extends Dialog {\n\t/**\n\t * \n\t * @param {Object} options Properties to create the dialog box. In addition to the properties from Dialog\n\t * there those below.\n\t * @param {Object} options.data The data which will be used to populate the controls in the dialog\n\t */\n\tconstructor(options) {\n\t\tsuper(Object.assign({}, options,\n\t\t\t{\n\t\t\t\ton: {\n\t\t\t\t\t'.btn-ok': () => {\n\t\t\t\t\t\tthis.resolve(this.gatherData())\n\t\t\t\t\t\treturn true\n\t\t\t\t\t},\n\t\t\t\t\t'.mask': () => {\n\t\t\t\t\t\tthis.resolve()\n\t\t\t\t\t\treturn true\n\t\t\t\t\t},\n\t\t\t\t\t'.btn-cancel': () => {\n\t\t\t\t\t\tthis.resolve()\n\t\t\t\t\t\treturn true\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t}\n\t\t))\n\t\tif (this.afterOpen) {\n\t\t\tthis.afterOpenOriginal = this.afterOpen\n\t\t}\n\t\tthis.afterOpen = function (bodyElement, self) {\n\t\t\tif (this.data) {\n\t\t\t\tbodyElement.innerHTML = formValueInjector(bodyElement.innerHTML, this.data)\n\t\t\t}\n\t\t\tlet firstInput = bodyElement.querySelector('input, textarea')\n\t\t\tif (firstInput) {\n\t\t\t\tfirstInput.focus()\n\t\t\t}\n\n\t\t\tif (this.afterOpenOriginal) {\n\t\t\t\tthis.afterOpenOriginal(bodyElement, self)\n\t\t\t}\n\t\t}\n\t}\n\tgatherData() {\n\t\tlet dialogBody = document.querySelector(this.getBodySelector())\n\t\treturn gatherFormData(dialogBody)\n\t}\n\n\tasync open() {\n\t\tthis.promise = new Promise((resolve, reject) => {\n\t\t\tthis.resolve = resolve\n\t\t\tthis.reject = reject\n\t\t})\n\t\tsuper.open()\n\n\t\treturn this.promise\n\t}\n\n}","/**\n * Gathers the data from the form controls.\n * @param {HTMLElement} formBody The html element containing the controls. Probably\n * a form tag element, but it really doesn't matter.\n */\nexport default function gatherFormData(formBody) {\n\tlet result = {}\n\tlet controls = formBody.querySelectorAll('input, textarea, select')\n\tfor (let control of controls) {\n\t\tif (control.type === 'checkbox') {\n\t\t\tif (!control.checked) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t}\n\t\telse if (control.type === 'radio') {\n\t\t\tif (!control.checked) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t}\n\t\tresult[control.getAttribute('name')] = control.value\n\t}\n\treturn result\n}\n\n","import { FormAnswerDialog } from '../form-answer-dialog.mjs'\n\nexport async function deleteFile(evt, selected) {\n\tlet sel = this.getSelectedFiles()\n\n\tif (sel.files.length > 0) {\n\n\t\tlet files = sel.files\n\t\tlet names = sel.names\n\n\t\tif (!this.deleteWithoutConfirm) {\n\t\t\tlet dialog = new FormAnswerDialog({\n\t\t\t\ttitle: 'Delete File' + (files.length > 1 ? 's' : '')\n\t\t\t\t, body: '<p>' + names.join(', ') + '</p>'\n\t\t\t})\n\t\t\tlet prom = dialog.open()\n\t\t\tlet ans = await prom\n\t\t\tif (!ans) {\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\n\t\tfor (let file of files) {\n\t\t\tlet path = file.relPath\n\t\t\tlet note\n\t\t\tif (this.eventNotificationPanel) {\n\t\t\t\tnote = this.eventNotificationPanel.addNotification({\n\t\t\t\t\tmodel: {\n\t\t\t\t\t\tstatus: 'pending',\n\t\t\t\t\t\theadline: `deleting ${file.name}`\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t}\n\t\t\tawait this.sink.rm(path)\n\t\t\tif (this.eventNotificationPanel) {\n\t\t\t\tnote.remove()\n\t\t\t\tnote = this.eventNotificationPanel.addNotification({\n\t\t\t\t\tmodel: {\n\t\t\t\t\t\tstatus: 'success',\n\t\t\t\t\t\theadline: `removed ${file.name}`\n\t\t\t\t\t}\n\t\t\t\t\t, ttl: 2000\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\t\tfor (let item of sel.boxes) {\n\t\t\titem.remove()\n\t\t}\n\t}\n\tthis.emitter.emit('delete', {\n\t\ttype: 'delete'\n\t\t, selected: sel\n\t})\n}\n\nexport async function deleteDirectory(evt, selected) {\n\tlet path = this.currentNode.file.relPath\n\tlet name = this.currentNode.file.name\n\n\tif (!path) {\n\t\t// probably the root, just cancel\n\t\treturn\n\t}\n\n\tlet dialog = new FormAnswerDialog({\n\t\ttitle: 'Delete Directory'\n\t\t, body: '<p>' + name + '</p>'\n\t})\n\tlet prom = dialog.open()\n\tlet ans = await prom\n\tif (!ans) {\n\t\treturn\n\t}\n\tlet note\n\tif (this.eventNotificationPanel) {\n\t\tnote = this.eventNotificationPanel.addNotification({\n\t\t\tmodel: {\n\t\t\t\tstatus: 'pending',\n\t\t\t\theadline: `deleting ${name}`\n\t\t\t}\n\t\t})\n\t}\n\tawait this.sink.rm(path, { recursive: true })\n\tlet curSelected = this.tree.selected()\n\tlet parent = this.tree.parent(curSelected)\n\n\tthis.tree.removeNode(curSelected)\n\tthis.tree.select(parent.id)\n\n\tif (this.eventNotificationPanel) {\n\t\tnote.remove()\n\t\tnote = this.eventNotificationPanel.addNotification({\n\t\t\tmodel: {\n\t\t\t\tstatus: 'success',\n\t\t\t\theadline: `removed ${name}`\n\t\t\t}\n\t\t\t, ttl: 2000\n\t\t})\n\t}\n}\n","\nexport function _join(...parts) {\n\tparts = parts.filter(part => !!part)\n\tlet path = parts.join('/')\n\treturn path\n}\n\nexport function _determineParentPath(path) {\n\tif(!path) {\n\t\treturn ''\n\t}\n\tlet parts = path.split('/')\n\tparts.pop()\n\treturn parts.join('/')\n}\n\nexport function _fileToKalpaNode(file) {\n\tlet node = {\n\t\tid: this.idInd++\n\t\t, label: file.name\n\t\t, directory: file.directory\n\t\t, file: file\n\t\t, loaded: false\n\t}\n\n\tlet parent = this.nodes[this._determineParentPath(file.relPath)]\n\tthis.nodes[file.relPath] = node\n\n\tif (parent) {\n\t\tnode.parentId = parent.id\n\t\tnode.path = file.relPath\n\t}\n\n\tfile.path = node.path\n\treturn node\n}\n\nexport function _determineExtensions(variant) {\n\tlet extensions = new Set()\n\tif (variant.variants) {\n\t\tfor (let imgVariant of variant.variants) {\n\t\t\textensions.add(imgVariant.ext)\n\t\t}\n\t}\n\telse {\n\t\textensions.add(variant.ext)\n\t}\n\n\tlet result = Array.from(extensions).filter(item => !!item)\n\tresult.sort((a, b) => {\n\t\treturn a.toLowerCase().localeCompare(b.toLowerCase())\n\t})\n\n\treturn result\n}\n\nexport function _determineSizes(variant) {\n\tlet min = 2000000000\n\tlet max = 0\n\tif (variant.variants) {\n\t\tfor (let imgVariant of variant.variants) {\n\t\t\tlet size = imgVariant.file.stat.size\n\t\t\tif (size > max) {\n\t\t\t\tmax = size\n\t\t\t}\n\t\t\tif (size < min) {\n\t\t\t\tmin = size\n\t\t\t}\n\t\t}\n\t}\n\telse {\n\t\tlet size = variant.file.stat.size\n\t\tif (size > max) {\n\t\t\tmax = size\n\t\t}\n\t\tif (size < min) {\n\t\t\tmin = size\n\t\t}\n\t}\n\treturn [min, max]\n}\n\nexport function _sortFiles(files) {\n\tfiles.sort((one, two) => {\n\t\treturn one.relPath.toLowerCase().localeCompare(two.relPath.toLowerCase())\n\t})\n\n\treturn files\n}\n\nexport function _compareVariants(one, two) {\n\treturn one.baseName.toLowerCase().localeCompare(two.baseName.toLowerCase())\n}\n\nexport function sanitizeFileName(name) {\n\treturn name.split('/').join('-').split('..').join('-')\n}\n\n\nexport function _isImageFile(file) {\n\tif (!file.type.startsWith('image')) {\n\t\treturn false\n\t}\n\tif (file.type.includes('jpeg') || file.type.includes('png') || file.type.includes('webp')) {\n\t\treturn true\n\t}\n\treturn false\n}\n\nexport function setIfNotSet(key, value) {\n\tif (!(key in this)) {\n\t\tthis[key] = value\n\t}\n}\n\nexport function _addPending(file) {\n\tlet note\n\tif (this.eventNotificationPanel) {\n\t\tnote = this.eventNotificationPanel.addNotification({\n\t\t\tmodel: {\n\t\t\t\tstatus: 'pending',\n\t\t\t\theadline: `uploading ${file.name}`\n\t\t\t}\n\t\t})\n\t}\n\treturn note\n}\n","import Dialog from 'ei-dialog'\n\nexport class InfoDialog extends Dialog {\n\tconstructor(options) {\n\t\tsuper(Object.assign({}, options,\n\t\t\t{\n\t\t\t\ton: {\n\t\t\t\t\t'.btn-ok': () => {\n\t\t\t\t\t\tthis.resolve()\n\t\t\t\t\t\treturn true\n\t\t\t\t\t},\n\t\t\t\t\t'.mask': () => {\n\t\t\t\t\t\tthis.resolve()\n\t\t\t\t\t\treturn true\n\t\t\t\t\t},\n\t\t\t\t\t'.btn-cancel': () => {\n\t\t\t\t\t\tthis.resolve()\n\t\t\t\t\t\treturn true\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t}\n\t\t))\n\t}\n\n\tasync open() {\n\t\tthis.promise = new Promise((resolve, reject) => {\n\t\t\tthis.resolve = resolve\n\t\t\tthis.reject = reject\n\t\t})\n\t\tsuper.open()\n\n\t\treturn this.promise\n\t}\n\n}","import { InfoDialog } from '../info-dialog.mjs'\nimport escapeHtmlAttributeValue from '@dankolz/escape-html-attribute-value'\n\nexport function changeFilesView(evt, selected) {\n\tlet className = selected.getAttribute('data-show-class')\n\tthis.changeFilesViewToClass(className)\n}\n\nexport function changeFilesViewToClass(className) {\n\tlet choiceBoxes = this.el.querySelector('.choice-boxes')\n\tlet classes = [...this.el.querySelector('.view-icons').querySelectorAll('button')].map(button => button.getAttribute('data-show-class'))\n\tclasses.forEach(item => {\n\t\tchoiceBoxes.classList.remove(item)\n\t})\n\tchoiceBoxes.classList.add(className)\n}\n\nexport function applyFilter(evt, selected) {\n\tsetTimeout(() => {\n\t\tlet value = this.el.querySelector('[name=\"filter\"]').value\n\t\tlet allVariants = this.el.querySelectorAll('.choice-boxes .variant-choice-box')\n\t\tfor (let variant of allVariants) {\n\t\t\tvariant.classList.remove('hidden')\n\t\t\tif (value) {\n\t\t\t\tvalue = value.toLowerCase()\n\t\t\t\tlet searchString = variant.variant.baseName.toLowerCase() + variant.variant.extensions.map(ext => ext.toLowerCase()).join()\n\t\t\t\tif (searchString.indexOf(value) < 0) {\n\t\t\t\t\tvariant.classList.add('hidden')\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tthis.setFolderInfo()\n\t})\n}\n\nexport function clearFilter(evt, selected) {\n\tthis.el.querySelector('[name=\"filter\"]').value = ''\n\tthis.applyFilter()\n}\n\nexport function selectVariant(evt, selected) {\n\tlet currentSelected = this.el.querySelectorAll('.choice-boxes .variant-choice-box.selected')\n\tif (!evt.ctrlKey && !evt.shiftKey) {\n\t\tfor (let sel of currentSelected) {\n\t\t\tsel.classList.remove('selected')\n\t\t}\n\t}\n\n\tif (evt.shiftKey) {\n\t\tlet cur = selected\n\t\tdo {\n\t\t\tif (cur.classList.contains('selected')) {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tcur.classList.add('selected')\n\t\t\tcur = cur.previousElementSibling\n\t\t}\n\t\twhile (cur);\n\t}\n\telse {\n\t\tselected.classList.toggle('selected')\n\t}\n\n\n\tlet sel = this.getSelectedFiles()\n\tthis.emitter.emit('select', {\n\t\ttype: 'select'\n\t\t, selected: sel\n\t})\n}\n\n\n\nexport function showVariantDetails(evt, selected) {\n\tlet choiceBox = selected.closest('.variant-choice-box')\n\tlet variant = choiceBox.variant\n\n\tlet files = this._getAssociatedRealFiles(variant)\n\n\tlet content = '<div class=\"variant-details-information\">'\n\tif (variant.safeThumbnail) {\n\t\tcontent += `<div class=\"details-preview-image\">\n\t\t<img loading=\"lazy\" src=\"${variant.safeThumbnail}\" />\n\t\t</div>`\n\t}\n\n\tcontent += '<ul class=\"variants\">'\n\tfor (let file of files) {\n\t\tcontent += '<li><a target=\"_blank\" href=\"' + escapeHtmlAttributeValue(this.escapeAccessUrl(file.accessUrl)) + '\">'\n\t\tcontent += escapeHtmlAttributeValue(file.name) + '</a> - ' + this._formatBytes(file.stat.size)\n\t\tcontent += '</li>'\n\t}\n\tcontent += '</ul>'\n\n\tcontent += '</div>'\n\n\tlet dialog = new InfoDialog({\n\t\ttitle: 'File Details: ' + variant.baseName\n\t\t, body: content\n\t\t, buttons: [\n\t\t\t{\n\t\t\t\tclasses: 'btn btn-primary btn-ok',\n\t\t\t\tlabel: 'OK'\n\t\t\t}\n\t\t]\n\t})\n\tlet prom = dialog.open()\n\tprom.then(async data => {\n\t\tif (data) {\n\t\t}\n\t})\n}\n\nexport function setFolderInfo() {\n\tlet fileCount = 0\n\tlet variantCount = 0\n\tlet byteCount = 0\n\tlet nonImages = 0\n\tlet allVariants = this.el.querySelectorAll('.choice-boxes .variant-choice-box')\n\tfor (let variant of allVariants) {\n\t\tif (variant.classList.contains('hidden')) {\n\t\t\tcontinue\n\t\t}\n\t\tvariantCount++\n\n\t\tif (variant.variant.variants) {\n\t\t\tvariant.variant.variants.forEach(variant => {\n\t\t\t\tfileCount++\n\t\t\t\tbyteCount += variant.file.stat.size\n\t\t\t})\n\n\t\t}\n\t\telse {\n\t\t\tfileCount++\n\t\t\tbyteCount += variant.variant.file.stat.size\n\t\t\tnonImages++\n\t\t}\n\t}\n\tthis.el.querySelector('.folder-info').innerHTML = `${variantCount} items / ${fileCount} files / ${this._formatBytes(byteCount)} `\n\tif (variantCount > this.listTriggerSize) {\n\t\tthis.changeFilesViewToClass('list-text')\n\t}\n\tthis.el.querySelector('.view-icons').classList.remove('no-img')\n\tif (variantCount - nonImages > this.listLockSize) {\n\t\tthis.el.querySelector('.view-icons').classList.add('no-img')\n\t}\n}\n\nexport function cleanFileInfo() {\n\tthis.el.querySelector('.folder-info').innerHTML = ''\n\tlet choicesBoxes = this.el.querySelector('.choice-boxes')\n\tchoicesBoxes.innerHTML = '<div class=\"loading-info\">Loading Information Now</div>'\n\tthis.el.querySelector('.view-icons').classList.add('no-img')\n}\n","\nexport function getDropCoverSelector() {\n\treturn '.img-drop-cover'\n}\n\nexport async function handleDrop(evt, selected) {\n\tlet uploadType = 'literal'\n\tlet dropSquare = evt.target.closest('.drop-type')\n\tif (dropSquare) {\n\t\tif (dropSquare.classList.contains('guided-upload')) {\n\t\t\tuploadType = 'guided'\n\t\t}\n\t\telse if (dropSquare.classList.contains('automatic')) {\n\t\t\tuploadType = 'automatic'\n\t\t}\n\t}\n\n\tthis._cleanupDropDone()\n\tevt.preventDefault()\n\tlet files = await this._getFilesFromEvent(evt)\n\tthis.uploadFiles(files, { uploadType })\n}\n\nexport function isFileTypeDrag(evt) {\n\tlet fileType = true\n\tif (evt.dataTransfer) {\n\t\tif (evt.dataTransfer.items[0].kind === 'string') {\n\t\t\tfileType = false\n\t\t}\n\t}\n\n\treturn fileType\n}\n\nexport function dragEnter(evt, selected) {\n\tlet overlay = this.isFileTypeDrag(evt)\n\tif (overlay) {\n\t\tthis.overCount++\n\t\tthis.el.querySelector(this.getDropCoverSelector()).classList.add('file-dropping')\n\t}\n}\nexport function dragLeave(evt, selected) {\n\tif (this.isFileTypeDrag(evt)) {\n\t\tthis.overCount--\n\t\tif (this.overCount == 0) {\n\t\t\tthis._cleanupDropDone()\n\t\t}\n\t}\n}\nexport function dragOver(evt, selected) {\n\tevt.preventDefault()\n}\n\nexport function _cleanupDropDone() {\n\tthis.overCount = 0;\n\t[...this.el.querySelectorAll('.file-dropping')].forEach(cover => cover.classList.remove('file-dropping'))\n}\n\nexport async function handlePaste(evt) {\n\tif (this.ignoreGlobalEvents) {\n\t\treturn\n\t}\n\tevt.preventDefault()\n\tif (evt.clipboardData && evt.clipboardData.files && evt.clipboardData.files.length > 0) {\n\t\tthis.uploadFiles(evt.clipboardData.files, { uploadType: 'guided' })\n\t}\n}","import { FormAnswerDialog } from '../form-answer-dialog.mjs'\n\nexport function createDirectory(evt, selected) {\n\tlet dialog = new FormAnswerDialog({\n\t\ttitle: 'Create Directory'\n\t\t, body: '<label>Directory name <input type=\"text\" name=\"name\" /></label>'\n\t})\n\tlet prom = dialog.open()\n\tprom.then(async data => {\n\t\tif (data) {\n\t\t\tlet directoryPath = this.currentNode.file.relPath + '/' + data.name\n\t\t\tawait this.sink.mkdir(directoryPath)\n\t\t\tlet file = await this.sink.getFullFileInfo(directoryPath)\n\t\t\tlet node = this._fileToKalpaNode(file)\n\t\t\tthis.tree.options.stream.emit('data', node)\n\t\t\tlet cur = this.tree.selected()\n\t\t\tif (cur) {\n\t\t\t\tthis.tree.expand(cur.id)\n\t\t\t}\n\t\t}\n\t})\n\n}","\nfunction breakOnChars(chrs, txt) {\n\tfor (let c of chrs) {\n\t\ttxt = txt.split(c).join('<wbr>' + c)\n\t}\n\treturn txt\n}\n\nexport default function addSoftBreaks(txt) {\n\tif(!txt || typeof txt !== 'string') {\n\t\treturn txt\n\t}\n\t\n\tlet chars = [...txt]\n\ttxt = ''\n\tfor(let i = 0; i < chars.length; i++) {\n\t\ttxt += chars[i]\n\t\tif(i % 10 === 0) {\n\t\t\ttxt += '<wbr>'\n\t\t}\n\t}\n\ttxt = breakOnChars(['_'], txt)\n\n\treturn txt\n}","import condense from '@dankolz/webp-detection/lib/condense-image-variants.js'\nimport escapeHtmlAttributeValue from '@dankolz/escape-html-attribute-value'\nimport addSoftBreaks from '../add-soft-breaks.mjs'\n\nexport function createVariantValues(info) {\n\tlet variants = condense(info.children)\n\tlet variantValues = Object.values(variants)\n\n\tlet used = []\n\tfor (let variant of variantValues) {\n\t\tused.push(...this._getAssociatedRealFiles(variant).map(variant => variant.name))\n\t}\n\n\tlet remainingChildren = info.children.filter(item => {\n\t\treturn !used.includes(item.name)\n\t})\n\t\t.filter(item => !item.directory)\n\n\t// Add thumbnails\n\tfor (let child of variantValues) {\n\t\tchild.thumbnailIcon = 'image'\n\t\tif (child.preview) {\n\t\t\tchild.thumbnail = this._createAccessUrl(child.preview.file)\n\t\t\tchild.safeThumbnail = escapeHtmlAttributeValue(child.thumbnail)\n\t\t}\n\t}\n\n\tif (!this.imagesOnly) {\n\t\tfor (let file of remainingChildren) {\n\t\t\tlet info = {\n\t\t\t\tfile: file\n\t\t\t\t, thumbnailIcon: 'description'\n\t\t\t}\n\t\t\tlet name = file.name\n\t\t\tinfo.ext = name.substring(name.lastIndexOf('.') + 1)\n\t\t\tinfo.baseName = name.substring(0, name.lastIndexOf('.'))\n\t\t\tvariantValues.push(info)\n\t\t}\n\t}\n\n\n\t// Determine extensions, add additional top level info (safeBaseName)\n\tfor (let item of variantValues) {\n\t\titem.extensions = this._determineExtensions(item)\n\t\titem.sizes = this._determineSizes(item)\n\t\tif (item.sizes[0] == item.sizes[1]) {\n\t\t\titem.size = this._formatBytes(item.sizes[0])\n\t\t}\n\t\telse {\n\t\t\titem.size = this._formatBytes(item.sizes[0]) + ' - ' + this._formatBytes(item.sizes[1])\n\t\t}\n\t\titem.safeBaseName = addSoftBreaks(escapeHtmlAttributeValue(item.baseName))\n\t}\n\n\tvariantValues.sort(this._compareVariants)\n\treturn variantValues\n}\n\nexport async function _getFilesFromEvent(evt) {\n\tlet files = []\n\n\t// items is the new interface we should use if that's available\n\tif (evt.dataTransfer.items) {\n\t\tlet foundItems = [];\n\t\t[...evt.dataTransfer.items].forEach((item, i) => {\n\t\t\tfoundItems.push(item)\n\t\t})\n\t\tfor (let item of foundItems) {\n\t\t\tif (item.kind === \"file\") {\n\t\t\t\tif (item.webkitGetAsEntry) {\n\t\t\t\t\tlet entry = item.webkitGetAsEntry()\n\t\t\t\t\tif (entry) {\n\t\t\t\t\t\t// if there's no entry, it's probably not a file, so we'll just ignore\n\t\t\t\t\t\tif (entry.isDirectory) {\n\t\t\t\t\t\t\tcontinue\n\n\t\t\t\t\t\t\t// Evenually we'll want to handle directories too, but for now we'll just go\n\t\t\t\t\t\t\t// on with the other items\n\n\t\t\t\t\t\t\t// var dirReader = entry.createReader()\n\t\t\t\t\t\t\t// dirReader.readEntries(function (entries) {\n\t\t\t\t\t\t\t// \tconsole.log(entries)\n\t\t\t\t\t\t\t// })\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tfiles.push(item.getAsFile())\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tfiles.push(item.getAsFile())\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (item instanceof File) {\n\t\t\t\t// Maybe from a file input element\n\t\t\t\tfiles.push(item)\n\t\t\t}\n\t\t}\n\t} else {\n\t\t[...evt.dataTransfer.files].forEach((file, i) => {\n\t\t\tfiles.push(file)\n\t\t})\n\t}\n\treturn files\n}\n\nexport function _getAssociatedRealFiles(variant) {\n\tlet files = []\n\tif (variant.variants) {\n\t\tfiles.push(...variant.variants.map(variant => variant.file))\n\t}\n\telse {\n\t\tfiles.push(variant.file)\n\t}\n\tif (variant.definitionFile) {\n\t\tfiles.push(variant.definitionFile)\n\t}\n\n\treturn files\n}\n\nexport function _createAccessUrl(file) {\n\treturn this.escapeAccessUrl(file.accessUrl)\n}\n\nfunction urlEscapeChars(chrs, url) {\n\tfor (let c of chrs) {\n\t\turl = url.split(c).join(encodeURIComponent(c))\n\t}\n\treturn url\n}\n\nexport function escapeAccessUrl(url) {\n\treturn urlEscapeChars(['%', ' ', '#', '?', '<', '>', '$', '@', '^', '&'], url)\n}\n\n\nexport function getSelectedFiles() {\n\tlet result = {\n\t\tboxes: []\n\t\t, variants: []\n\t\t, files: []\n\t\t, names: []\n\t}\n\tlet currentSelected = this.el.querySelectorAll('.choice-boxes .variant-choice-box.selected')\n\tif (currentSelected.length > 0) {\n\t\tfor (let sel of currentSelected) {\n\t\t\tresult.boxes.push(sel)\n\t\t\tresult.variants.push(sel.variant)\n\t\t\tresult.files.push(...this._getAssociatedRealFiles(sel.variant))\n\t\t}\n\t\tlet names = result.files.map(file => file.name)\n\t\tresult.names.push(...names)\n\t}\n\n\treturn result\n}\n\nexport function _transformRelativeUrlToPublic(url) {\n\tif(url.startsWith('/') == false) {\n\t\turl = '/' + url\n\t}\n\treturn url\t\n}\n\nexport async function getSelectedUrl(selectedFiles) {\n\tif(!selectedFiles) {\n\t\tselectedFiles = this.getSelectedFiles()\n\t}\n\t\n\tif(selectedFiles.variants.length == 0) {\n\t\treturn\n\t}\n\t\n\tlet variant = selectedFiles.variants[0]\n\tlet chosen\n\tif(variant.primary) {\n\t\tchosen = variant.primary.file\n\t}\n\telse {\n\t\tchosen = variant.file\n\t}\n\t\n\tlet base = this._transformRelativeUrlToPublic(chosen.relPath)\n\t\n\tif(variant.definitionFile) {\n\t\tlet defData = await this.sink.read(variant.definitionFile.relPath)\n\t\ttry {\n\t\t\tlet data = JSON.parse(defData)\n\t\t\tbase += this.getSelectedUrlExtFromMeta(data)\n\t\t}\n\t\tcatch(e) {\n\n\t\t}\n\t}\n\t\n\treturn base\n\n}\n\nexport function getSelectedUrlExtFromMeta(data) {\n\tlet url = ''\n\tlet sizes = data.displaySize.split('x')\n\turl += `#format=webp2x&width=${sizes[0]}&height=${sizes[1]}`\n\t\n\tif(data.altText) {\n\t\turl += '&alt=' + encodeURIComponent(data.altText)\n\t}\n\t\n\treturn url\n}\n","\n/**\n * \n * @param {File,string} file \n */\nexport default function baseImageName(file) {\n\tlet name\n\tif(typeof file === 'string') {\n\t\tname = file\n\t}\n\telse if(file instanceof File) {\n\t\tname = file.name\n\t}\n\t\n\tlet parts = name.split('.')\n\t\n\tif(parts.length > 1) {\n\t\tparts.pop()\n\t}\n\tname = parts.join('.')\n\tname = name.replace(/-@2x$/, '')\n\tname = name.replace(/@2x$/, '')\n\tname = name.replace(/-2x$/, '')\n\tname = name.replace(/2x$/, '')\n\n\tlet chars = [name.substring(0, 1)]\n\tfor(let char of name.substring(1)) {\n\t\tif(char.match(/[A-Z]/)) {\n\t\t\tchars.push('-')\n\t\t}\n\t\tchars.push(char)\n\t}\n\tname = chars.join('')\n\n\tname = name.toLowerCase()\n\tname = name.replace(/[^1234567890a-z-]/g, '-')\n\tname = name.replace(/--+/g, '-')\n\t\n\n\treturn name\n}","\n/**\n * Takes data, perhaps even an image, and resolves to a fully \n * loaded image.\n * @param {Blob,ArrayBuffer,string,Image} data \n */\nexport default async function dataToImage(data) {\n\treturn new Promise((resolve, reject) => {\n\t\tlet finalImage\n\t\tlet objectUrl\n\t\tif (data instanceof Image) {\n\t\t\tfinalImage = data\n\t\t}\n\t\telse if (typeof data === 'string') {\n\t\t\tfinalImage = new Image();\n\t\t\tfinalImage.src = data;\n\t\t}\n\t\t// ArrayBuffer.isView(data) might be true or could be a Blob or File\n\t\telse {\n\t\t\t// let's make a blob first. This works if it's an ArrayBuffer of a Blob\n\t\t\tlet imageBlob = new Blob([data])\n\t\t\tobjectUrl = URL.createObjectURL(imageBlob)\n\n\t\t\tfinalImage = new Image()\n\t\t\tfinalImage.src = objectUrl\n\t\t}\n\n\t\tfunction finish() {\n\t\t\tif (objectUrl) {\n\t\t\t\tURL.revokeObjectURL(objectUrl)\n\t\t\t}\n\t\t\tresolve(finalImage)\n\t\t}\n\t\tif (finalImage.complete) {\n\t\t\tfinish()\n\t\t}\n\t\telse {\n\t\t\t// we'll have to wait till it's loaded\n\t\t\tfinalImage.addEventListener('load', () => {\n\t\t\t\tfinish()\n\t\t\t})\n\t\t}\n\t})\n\n}","import dataToImage from \"./data-to-image.mjs\"\n\n/*image, base64 encoded data of image, blob, file, or arraybuffer */\nexport default async function resizeImage(imageData,\n\t{ maxWidth = 1920, quality = .7, outputFormat = \"image/png\" } = {}) {\n\treturn new Promise(async (resolve, reject) => {\n\n\t\ttry {\n\t\t\tlet resizeImg = await dataToImage(imageData)\n\t\t\tlet ratio = resizeImg.naturalWidth / maxWidth\n\t\t\tlet maxHeight = resizeImg.naturalHeight / ratio\n\n\t\t\tvar resizeCanvas = document.createElement('canvas');\n\t\t\tresizeCanvas.width = maxWidth;\n\t\t\tresizeCanvas.height = maxHeight;\n\n\t\t\tvar ctx = resizeCanvas.getContext('2d');\n\t\t\tctx.clearRect(0, 0, resizeCanvas.width, resizeCanvas.height);\n\t\t\tctx.drawImage(resizeImg, 0, 0, resizeCanvas.width, resizeCanvas.height);\n\n\n\t\t\tresizeCanvas.toBlob((blob) => {\n\t\t\t\tresolve(blob)\n\t\t\t}, outputFormat, quality);\n\t\t} catch (e) {\n\t\t\tif (console && console.log) {\n\t\t\t\tconsole.log('error resizing image: ' + e);\n\t\t\t}\n\t\t\treject(e)\n\t\t}\n\t})\n}\n","import dataToImage from \"./data-to-image.mjs\";\n\nexport default async function getImageStats(data) {\n\tlet img = await dataToImage(data)\n\treturn {\n\t\twidth: img.naturalWidth\n\t\t, height: img.naturalHeight\n\n\t}\n\n}","\nlet types = {\n\t\"image/png\": \"png\"\n\t, \"image/jpeg\": \"jpg\"\n\t, \"image/jpg\": \"jpg\"\n\t, \"image/webp\": \"webp\"\n}\n\n\nexport default function getExtension(mime) {\n\tif (mime in types) {\n\t\treturn types[mime]\n\t}\n\n\tlet ext = mime.split('/').pop()\n\treturn ext\n}\n","import resizeImage from '../client-lib/image-resize.mjs'\nimport dataToImage from '../client-lib/data-to-image.mjs'\nimport getImageStats from '../client-lib/get-image-stats.mjs'\nimport getExtension from './get-extension-from-mime.mjs'\n\nlet webpMime = 'image/webp'\n\nexport default async function makeImageSet(data,\n\t{ \n\t\tsingleDensityWidth = null\n\t\t, quality = .7\n\t\t, outputFormat = \"image/png\"\n\t\t, doubleDensityInput = true\n\t\t, baseFileName \n\t\t, altText\t\t\n\t} = {}\n) {\n\tlet source = await dataToImage(data)\n\tlet stats = await getImageStats(source)\n\tlet ratio = stats.width / stats.height\n\n\tif (!baseFileName) {\n\t\tbaseFileName = \"\" + (new Date().getTime())\n\t}\n\tif (!singleDensityWidth) {\n\t\tif (doubleDensityInput) {\n\t\t\tsingleDensityWidth = stats.width / 2\n\t\t}\n\t\telse {\n\t\t\tsingleDensityWidth = stats.width\n\t\t}\n\t}\n\tlet doubleDensityWidth = singleDensityWidth * 2\n\n\tlet suffixes = {\n\t\t'-2x': doubleDensityWidth\n\t\t, '': singleDensityWidth\n\t\t, '-half': Math.floor(singleDensityWidth / 2)\n\t\t, '-quarter': Math.floor(singleDensityWidth / 4)\n\t}\n\n\tlet files = {}\n\n\tfor (let key of Object.keys(suffixes)) {\n\t\tlet width = suffixes[key]\n\t\tlet data = await resizeImage(source, {\n\t\t\tmaxWidth: width\n\t\t\t, quality: quality\n\t\t\t, outputFormat: outputFormat\n\t\t})\n\t\tfiles[baseFileName + key + '.' + getExtension(outputFormat)] = data\n\n\t\tdata = await resizeImage(source, {\n\t\t\tmaxWidth: width\n\t\t\t, quality: quality\n\t\t\t, outputFormat: webpMime\n\t\t})\n\t\tfiles[baseFileName + key + '.' + getExtension(webpMime)] = data\n\t}\n\n\n\tlet info = {\n\t\t\"name\": baseFileName,\n\t\t\"size\": doubleDensityWidth + \"x\" + (doubleDensityWidth / ratio),\n\t\t\"displaySize\": singleDensityWidth + \"x\" + (singleDensityWidth / ratio),\n\t\t\"fallback\": getExtension(outputFormat),\n\t\t\"altText\": altText || baseFileName\n\t}\n\t\n\t\n\tfiles[baseFileName + '.json'] = JSON.stringify(info, null, '\\t')\n\n\treturn files\n\n}","import baseImageName from \"./base-image-name.mjs\"\n\n/**\n * \n * @param {File,string} file \n */\nexport default function nameParts(file) {\n\tlet name\n\tif(typeof file === 'string') {\n\t\tname = file\n\t}\n\telse if(file instanceof File) {\n\t\tname = file.name\n\t}\n\t\n\tlet result = [baseImageName(name)]\n\t\n\tlet parts = name.split('.')\n\tif(parts.length > 1) {\n\t\tresult.push(parts.pop())\n\t}\n\t\n\treturn result\n}","import { FormAnswerDialog } from '../form-answer-dialog.mjs'\nimport baseImageName from '../base-image-name.mjs'\nimport makeImageSet from '../make-image-set.mjs'\nimport nameParts from '../name-parts.mjs'\nimport getFileImageStats from '../get-file-image-stats.mjs'\nimport { guidedImageUploadForm, guidedFileUploadForm } from '../../views/load-browser-views.js'\n\n\nexport async function _uploadGuidedImageFile(file) {\n\tlet baseFileName = baseImageName(file)\n\tlet stats = await getFileImageStats(file)\n\n\tlet data = {\n\t\tnativeName: file.name\n\t\t, name: baseFileName\n\t\t, outputFormat: file.type\n\t\t, stats: stats\n\t\t, width: Math.floor(stats.width / 2)\n\t}\n\n\n\tlet dialog = new FormAnswerDialog({\n\t\ttitle: 'Upload File'\n\t\t, body: guidedImageUploadForm(data)\n\t\t, data: data\n\t\t, dialogFrameClass: 'webhandle-file-tree-image-browser'\n\t})\n\tlet prom = dialog.open()\n\tlet result = await prom\n\n\tif (result) {\n\t\tlet makeImageData = {\n\t\t\tbaseFileName: result.name\n\t\t\t, outputFormat: result.outputFormat\n\t\t\t, singleDensityWidth: parseInt(result.width)\n\t\t\t, quality: parseFloat(result.quality)\n\t\t\t, altText: result.altText\n\t\t}\n\n\t\tlet note = this._addPending(file)\n\t\tlet files = await makeImageSet(file, makeImageData)\n\t\tlet meta = JSON.parse(files[makeImageData.baseFileName + '.json'])\n\n\t\tlet mainUrl\n\t\tfor (let fileName of Object.keys(files)) {\n\t\t\tlet path = await this._uploadData(fileName, files[fileName])\n\t\t\tif(fileName === meta.name + '.' + meta.fallback) {\n\t\t\t\tmainUrl = path\n\t\t\t}\n\t\t}\n\n\t\tlet base = this._transformRelativeUrlToPublic(mainUrl)\n\t\t\n\t\tlet ext = this.getSelectedUrlExtFromMeta(meta)\n\t\tbase += ext\n\n\t\tif (note) {\n\t\t\tnote.remove()\n\t\t}\n\n\t\treturn base\n\t}\n}\n\nexport async function _uploadGuidedFile(file) {\n\tlet parts = nameParts(file)\n\n\tlet data = {\n\t\tnativeName: file.name\n\t\t, name: parts.join('.')\n\t}\n\n\n\tlet dialog = new FormAnswerDialog({\n\t\ttitle: 'Upload File'\n\t\t, body: guidedFileUploadForm(data)\n\t\t, data: data\n\t\t, dialogFrameClass: 'webhandle-file-tree-image-browser'\n\t})\n\tlet prom = dialog.open()\n\tlet result = await prom\n\n\tif (result) {\n\t\tlet note = this._addPending(file)\n\n\t\tlet mainUrl = await this._uploadData(result.name, file)\n\t\tlet base = this._transformRelativeUrlToPublic(mainUrl)\n\n\t\tif (note) {\n\t\t\tnote.remove()\n\t\t}\n\t\treturn base\n\t}\n}\n\nexport async function _uploadAutomaticImageFile(file) {\n\tlet note = this._addPending(file)\n\tlet parts = nameParts(file)\n\tlet baseFileName = parts[0]\n\n\tlet files = await makeImageSet(file, {\n\t\tbaseFileName: baseFileName,\n\t\toutputFormat: file.type\n\t})\n\tlet meta = JSON.parse(files[baseFileName + '.json'])\n\n\tlet mainUrl\n\tfor (let fileName of Object.keys(files)) {\n\t\tlet path = await this._uploadData(fileName, files[fileName])\n\t\tif(fileName === meta.name + '.' + meta.fallback) {\n\t\t\tmainUrl = path\n\t\t}\n\t}\n\tlet base = this._transformRelativeUrlToPublic(mainUrl)\n\tlet ext = this.getSelectedUrlExtFromMeta(meta)\n\tbase += ext\n\n\tif (note) {\n\t\tnote.remove()\n\t}\n\treturn base\n}\n\nexport async function uploadFiles(files, { uploadType } = {}) {\n\tlet uploadedAccessUrls = []\n\tfor (let file of files) {\n\n\t\tlet uploaded = false\n\t\tif (uploadType === 'guided' && this._isImageFile(file)) {\n\t\t\tuploaded = await this._uploadGuidedImageFile(file)\n\t\t}\n\t\telse if (uploadType === 'guided') {\n\t\t\tuploaded = await this._uploadGuidedFile(file)\n\t\t}\n\t\telse if (uploadType === 'automatic' && this._isImageFile(file)) {\n\t\t\tuploaded = await this._uploadAutomaticImageFile(file)\n\t\t}\n\t\telse {\n\t\t\tlet note = this._addPending(file)\n\t\t\tlet path\n\t\t\tif (uploadType === 'automatic') {\n\t\t\t\tlet parts = nameParts(file)\n\t\t\t\tpath = await this._uploadData(parts.join('.'), file)\n\t\t\t}\n\t\t\telse {\n\t\t\t\tpath = await this._uploadData(file.name, file)\n\t\t\t}\n\t\t\tuploaded = this._transformRelativeUrlToPublic(path)\n\t\t\t\n\t\t\tif (note) {\n\t\t\t\tnote.remove()\n\t\t\t}\n\t\t}\n\t\tif (this.eventNotificationPanel && uploaded) {\n\t\t\tthis.eventNotificationPanel.addNotification({\n\t\t\t\tmodel: {\n\t\t\t\t\tstatus: 'success',\n\t\t\t\t\theadline: `uploaded ${file.name}`\n\t\t\t\t}\n\t\t\t\t, ttl: 2000\n\t\t\t})\n\t\t}\n\t\tuploadedAccessUrls.push(uploaded)\n\t}\n\tthis.setCurrentNode(this.currentNode)\n\tthis.emitter.emit('upload', {\n\t\ttype: 'upload'\n\t\t, accessUrls: uploadedAccessUrls\n\t})\n\treturn uploadedAccessUrls\n}\n\n\nexport function _uploadFileButton(evt, selected) {\n\tthis.el.querySelector(this.fileUploadSelector).click()\n}\n\nexport async function _uploadFile(evt, selected) {\n\tevt.preventDefault()\n\tlet input = this.el.querySelector(this.fileUploadSelector)\n\tevt.dataTransfer = {\n\t\tfiles: input.files\n\t}\n\tlet files = await this._getFilesFromEvent(evt)\n\tif(files.length > 0) {\n\t\tlet result = this.uploadFiles(files, { uploadType: 'guided' })\n\t\tinput.value = ''\n\t\treturn result\n\t}\n}\n","import dataToImage from './data-to-image.mjs'\nimport getImageStats from './get-image-stats.mjs'\nimport getExtension from './get-extension-from-mime.mjs'\n\n/**\n * \n * @param {File} file \n * @returns \n */\nexport default async function getFileImageStats(file) {\n\tlet source = await dataToImage(file)\n\tlet stats = await getImageStats(source)\n\tstats.ratio = stats.width / stats.height\n\tstats.ext = getExtension(file.type)\n\n\treturn stats\n}","\nexport async function _uploadData(name, data) {\n\tlet path = this.currentNode.file.relPath + '/' + this.sanitizeFileName(name)\n\tawait this.sink.write(path, data)\n\treturn path\n}\n\nexport async function findDirectories() {\n\treturn new Promise((resolve, reject) => {\n\t\tlet results = []\n\t\tlet events = this.sink.find({\n\t\t\tfile: false\n\t\t})\n\t\tevents.on('data', (item) => {\n\t\t\tresults.push(item)\n\t\t})\n\t\tevents.on('done', () => {\n\t\t\tresolve(results)\n\t\t})\n\t})\n}","import { View } from '@webhandle/backbone-view'\nimport { imageBrowserFrame, variantChoiceBox } from '../views/load-browser-views.js'\nimport KalpaTreeOnPage from 'kalpa-tree-on-page'\nimport formatBytes from './format-bytes.mjs'\n\nimport Emitter from '@webhandle/minimal-browser-event-emitter'\n\n// method imports\nimport { deleteFile, deleteDirectory } from './image-browser-view-methods/delete.mjs'\nimport {\n\t_join, _determineParentPath, _fileToKalpaNode, _determineExtensions, _addPending,\n\t_determineSizes, _sortFiles, _compareVariants, sanitizeFileName, _isImageFile, setIfNotSet\n} from './image-browser-view-methods/utils.mjs'\nimport { changeFilesView, changeFilesViewToClass, applyFilter, clearFilter, selectVariant, showVariantDetails, setFolderInfo, cleanFileInfo } from './image-browser-view-methods/view-interactions.mjs'\nimport { getDropCoverSelector, handleDrop, isFileTypeDrag, dragEnter, dragLeave, dragOver, _cleanupDropDone, handlePaste } from './image-browser-view-methods/drag-and-drop.mjs'\nimport { createDirectory } from './image-browser-view-methods/create-directory.mjs'\nimport { createVariantValues, _getFilesFromEvent, _getAssociatedRealFiles, _createAccessUrl, escapeAccessUrl,\n\tgetSelectedFiles, _transformRelativeUrlToPublic, getSelectedUrl, getSelectedUrlExtFromMeta } from './image-browser-view-methods/file-obj-manipulation.mjs'\nimport { _uploadGuidedImageFile, _uploadGuidedFile, _uploadAutomaticImageFile, uploadFiles, _uploadFileButton, _uploadFile } from './image-browser-view-methods/upload.mjs'\nimport { _uploadData, findDirectories } from './image-browser-view-methods/sink.mjs'\n\n\nexport default class ImageBrowserView extends View {\n\t/**\n\t * Construct a new file browser\n\t * @param {object} options \n\t * @param {FileSink} options.sink The file to use as a file source\n\t * @param {boolean} [options.imagesOnly] Set to true if you would like to display only images\n\t * @param {boolean} [options.allowFileSelection] Set to true so that selected files are marked\n\t * @param {EventNotificationPanel} [options.eventNotificationPanel] The panel which status messages will be added to.\n\t * @param {string} [options.startingDirectory] Opens to that directory path if it exists\n\t * @param {boolean} [options.deleteWithoutConfirm] False by default\n\t * @param {boolean} [options.ignoreGlobalEvents] False by default, if true it will not listen to events like paste or keypresses\n\t * which occur on the document\n\t * @param {Emitter} [options.emitter] Emitter for various file events\n\t * @param {int} [options.listTriggerSize] If the number of items are over this limit, they are shown as a plain list by default\n\t * @param {int} [options.listLockSize] If the number of items are over this limit, they can't use anyting other than the plain list\n\t */\n\tconstructor(options) {\n\t\tsuper(options)\n\t\tthis.setIfNotSet('overCount', 0)\n\t\tthis.setIfNotSet('emitter', new Emitter())\n\t\tthis.setIfNotSet('fileUploadSelector', 'input[name=\"fileUpload\"]')\n\t\tthis.setIfNotSet('listTriggerSize', 100)\n\t\tthis.setIfNotSet('listLockSize', 200)\n\t}\n\n\tpreinitialize() {\n\t\tthis.className = 'image-browser'\n\t\tthis.idInd = 1\n\t\tthis.nodes = {}\n\t\tthis.events = {\n\t\t\t'click .create-directory': 'createDirectory'\n\t\t\t, 'click .upload-file': '_uploadFileButton'\n\t\t\t, 'change [name=\"fileUpload\"]': '_uploadFile'\n\t\t\t, 'click .delete-file': 'deleteFile'\n\t\t\t, 'click .delete-directory': 'deleteDirectory'\n\t\t\t, 'click .variant-choice-box .details': 'showVariantDetails'\n\t\t\t, 'dblclick .variant-choice-box': 'showVariantDetails'\n\t\t\t, 'click .variant-choice-box': 'selectVariant'\n\t\t\t, 'click .view-icons button': 'changeFilesView'\n\t\t\t, 'keyup [name=\"filter\"]': 'applyFilter'\n\t\t\t, 'change [name=\"filter\"]': 'applyFilter'\n\t\t\t, 'click .clear-filter': 'clearFilter'\n\t\t\t, 'dragenter .': 'dragEnter'\n\t\t\t, 'dragleave .': 'dragLeave'\n\t\t\t, 'dragover .': 'dragOver'\n\t\t\t, 'drop .': 'handleDrop'\n\t\t}\n\t\tdocument.addEventListener('paste', handlePaste.bind(this))\n\t}\n\t\n\t\n\n\tasync render() {\n\t\tthis.el.innerHTML = imageBrowserFrame(this.model)\n\t\tthis.data = []\n\n\t\tthis.rootDirectory = await this.sink.getFullFileInfo('')\n\t\tthis.rootDirectory.name = \"Files\"\n\t\tlet rootNode = this.rootNode = this._fileToKalpaNode(this.rootDirectory)\n\t\tthis.data.push(rootNode)\n\n\t\tlet directories = await this.findDirectories()\n\t\tthis._sortFiles(directories)\n\n\t\tthis.data.push(...directories.map(this._fileToKalpaNode.bind(this)))\n\t\tKalpaTreeOnPage({\n\t\t\ttreeContainerSelector: `#${this.id} .treebox`\n\t\t\t, data: this.data\n\t\t}).then(tree => {\n\t\t\tthis.tree = tree\n\t\t\ttree.on('select', (node) => {\n\t\t\t\tthis.setCurrentNode(node)\n\t\t\t})\n\t\t\ttree.on('selected', (node) => {\n\t\t\t\t// There's a bug, either in the browser or kalpa tree that causes it\n\t\t\t\t// not to examine if a scroll bar is needed for the tree if the content\n\t\t\t\t// area changes in a big way. Part of this bug may be that it's being\n\t\t\t\t// used in a grid which has some weird width/height effects\n\t\t\t\t// Anyway, we need to make sure the browser knows to examine the tree so\n\t\t\t\t// we change the height then change it back.\n\t\t\t\t// This event is triggered when kalpa-tree thinks it's done with transitions\n\n\t\t\t\tlet tree = this.el.querySelector('.tree')\n\t\t\t\ttree.style.height = '99.99999%'\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\ttree.style.height = '100%'\n\t\t\t\t}, 100)\n\t\t\t})\n\t\t\tif (this.startingDirectory) {\n\t\t\t\tfor (let node of Object.values(this.tree.nodes)) {\n\t\t\t\t\tif (node.file && node.file.relPath && node.file.relPath == this.startingDirectory) {\n\t\t\t\t\t\ttree.select(node.id)\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\ttree.select(1)\n\t\t\t}\n\t\t})\n\t}\n\n\tasync setCurrentNode(node) {\n\t\tthis.currentNode = node\n\t\tthis.cleanFileInfo()\n\t\tlet choicesBoxes = this.el.querySelector('.choice-boxes')\n\t\tlet info = await this.sink.getFullFileInfo(node.file.relPath)\n\t\tlet variantValues = this.createVariantValues(info)\n\n\n\t\tif(variantValues.length > this.listTriggerSize) {\n\t\t\tthis.changeFilesViewToClass('list-text')\n\t\t}\t\n\n\t\tlet content = ''\n\t\tfor (let child of variantValues) {\n\t\t\tcontent += variantChoiceBox(child)\n\t\t}\n\n\n\t\tchoicesBoxes.innerHTML = ''\n\t\tchoicesBoxes.insertAdjacentHTML('beforeend', content)\n\n\t\tfor (let i = 0; i < choicesBoxes.children.length; i++) {\n\t\t\tchoicesBoxes.children[i].variant = variantValues[i]\n\t\t}\n\t\tthis.el.querySelector('.box-holder').scrollTop = 0\n\t\tthis.applyFilter()\n\t}\n\n\t// uploads\n\t_uploadGuidedImageFile = _uploadGuidedImageFile\n\t_uploadGuidedFile = _uploadGuidedFile\n\t_uploadAutomaticImageFile = _uploadAutomaticImageFile\n\tuploadFiles = uploadFiles\n\t_uploadFileButton = _uploadFileButton\n\t_uploadFile = _uploadFile\n\n\t// file-obj-manipulation\n\tcreateVariantValues = createVariantValues\n\t_getFilesFromEvent = _getFilesFromEvent\n\t_getAssociatedRealFiles = _getAssociatedRealFiles\n\t_createAccessUrl = _createAccessUrl\n\tescapeAccessUrl = escapeAccessUrl\n\tgetSelectedFiles = getSelectedFiles\n\t_transformRelativeUrlToPublic = _transformRelativeUrlToPublic\n\tgetSelectedUrl = getSelectedUrl\n\tgetSelectedUrlExtFromMeta = getSelectedUrlExtFromMeta\n\n\t// create-directory \n\tcreateDirectory = createDirectory\n\n\t// drag-and-drop\n\tgetDropCoverSelector = getDropCoverSelector\n\thandleDrop = handleDrop\n\tisFileTypeDrag = isFileTypeDrag\n\tdragEnter = dragEnter\n\tdragLeave = dragLeave\n\tdragOver = dragOver\n\thandlePaste = handlePaste\n\t_cleanupDropDone = _cleanupDropDone\n\n\t// view-interactions\n\tchangeFilesView = changeFilesView\n\tchangeFilesViewToClass = changeFilesViewToClass\n\tapplyFilter = applyFilter\n\tclearFilter = clearFilter\n\tselectVariant = selectVariant\n\tshowVariantDetails = showVariantDetails\n\tsetFolderInfo = setFolderInfo\n\tcleanFileInfo = cleanFileInfo\n\n\t// utils\n\tsanitizeFileName = sanitizeFileName\n\t_sortFiles = _sortFiles\n\t_compareVariants = _compareVariants\n\t_determineExtensions = _determineExtensions\n\t_determineSizes = _determineSizes\n\t_join = _join\n\t_determineParentPath = _determineParentPath\n\t_fileToKalpaNode = _fileToKalpaNode\n\t_formatBytes = formatBytes\n\t_isImageFile = _isImageFile\n\tsetIfNotSet = setIfNotSet\n\t_addPending = _addPending\n\n\t// delete\n\tdeleteFile = deleteFile\n\tdeleteDirectory = deleteDirectory\n\n\t// sink\n\t_uploadData = _uploadData\n\tfindDirectories = findDirectories\n\n}\n","import ibv from './image-browser-view.mjs';\nimport { FileSelectDialog as fsd } from './file-select-dialog.mjs'\n\nimport ls from './load-styles.mjs'\n\n\n\nexport let ImageBrowserView = ibv\nexport let FileSelectDialog = fsd\nexport let loadStyles = ls\n\nif(typeof window !== 'undefined') {\n\twindow['@webhandle/tree-file-browser'] = {\n\t\tImageBrowserView\n\t\t, FileSelectDialog\n\t\t, loadStyles\n\t}\n}\nexport default ImageBrowserView\n\n\n","import Dialog from 'ei-dialog'\nimport ImageBrowserView from './image-browser-view.mjs'\n\n/**\n * Selects a file.\n * @param {Object} [options]\n * @param {string} [options.title] The dialog box title\n * @param {boolean} [options.chooseOnUpload] If true, uploading a file causes the dialog to close and the URL of uploaded\n * file to be returned\n */\nexport class FileSelectDialog extends Dialog {\n\tconstructor(options) {\n\t\tsuper(Object.assign({\n\t\t\ttitle: 'Select A File'\n\t\t\t, body: `<div class=\"webhandle-file-tree-image-browser\" style=\"width: 87vw;\"> </div>`\n\t\t\t, afterOpen: function (bodyElement, dialog) {\n\n\t\t\t\tlet treeHolder = bodyElement.querySelector('.webhandle-file-tree-image-browser')\n\t\t\t\tif (treeHolder) {\n\t\t\t\t\tlet options = {\n\t\t\t\t\t\tsink: dialog.sink\n\t\t\t\t\t\t, imagesOnly: dialog.imagesOnly\n\t\t\t\t\t\t, eventNotificationPanel: dialog.eventNotificationPanel\n\t\t\t\t\t\t, startingDirectory: dialog.startingDirectory\n\t\t\t\t\t\t, deleteWithoutConfirm: dialog.deleteWithoutConfirm\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tlet imageBrowserView = this.imageBrowserView = new ImageBrowserView(options)\n\t\t\t\t\tif(dialog._createAccessUrl) {\n\t\t\t\t\t\timageBrowserView._createAccessUrl = dialog._createAccessUrl\n\t\t\t\t\t}\n\t\t\t\t\tif(dialog._transformRelativeUrlToPublic) {\n\t\t\t\t\t\timageBrowserView._transformRelativeUrlToPublic = dialog._transformRelativeUrlToPublic\n\t\t\t\t\t}\n\t\t\t\t\timageBrowserView.appendTo(treeHolder)\n\t\t\t\t\timageBrowserView.render()\n\n\t\t\t\t\timageBrowserView.emitter.on('select', async function (evt) {\n\n\t\t\t\t\t})\n\t\t\t\t\timageBrowserView.emitter.on('upload', async function (evt) {\n\t\t\t\t\t\tif(dialog.chooseOnUpload) {\n\t\t\t\t\t\t\tdialog.close()\n\t\t\t\t\t\t\tdialog.resolve({\n\t\t\t\t\t\t\t\turl: evt.accessUrls[0]\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t}\n\t\t\t, chooseOnUpload: true\n\t\t}, options,\n\t\t\t{\n\t\t\t\ton: {\n\t\t\t\t\t'.btn-ok': async () => {\n\t\t\t\t\t\tlet result = {\n\t\t\t\t\t\t\tselection: this.imageBrowserView.getSelectedFiles()\n\t\t\t\t\t\t}\n\t\t\t\t\t\tresult.url = await this.imageBrowserView.getSelectedUrl(result.selection)\n\t\t\t\t\t\tthis.resolve(result)\n\n\t\t\t\t\t\treturn true\n\t\t\t\t\t},\n\t\t\t\t\t'.mask': () => {\n\t\t\t\t\t\tthis.resolve()\n\t\t\t\t\t\treturn true\n\t\t\t\t\t},\n\t\t\t\t\t'.btn-cancel': () => {\n\t\t\t\t\t\tthis.resolve()\n\t\t\t\t\t\treturn true\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t))\n\t}\n\n\tasync open() {\n\t\tthis.promise = new Promise((resolve, reject) => {\n\t\t\tthis.resolve = resolve\n\t\t\tthis.reject = reject\n\t\t})\n\t\tsuper.open()\n\n\t\treturn this.promise\n\t}\n}","import areStylesLoaded from \"./styles-loaded.mjs\";\nimport ensureIcons from '@dankolz/webhandle-admin-icons/client-js/ensure-styles-are-loaded.js'\n\nexport default function loadStyles() {\n\tif(!areStylesLoaded()) {\n\t\tlet link = document.createElement('link')\n\t\tlink.href = '/@webhandle/tree-file-browser/resources/css/tree-browser.css'\n\t\tlink.rel = 'stylesheet'\n\t\tdocument.head.appendChild(link)\n\t\t\n\t}\n\tensureIcons()\n\n}","\n/**\n * Returns true if the styles for the image browser have been loaded\n */\nexport default function areStylesLoaded() {\n\tlet d = document.createElement('div')\n\td.classList.add('webhandle-file-tree-image-browser-test')\n\t\n\td.style.position = 'absolute'\n\td.style.left = '-10000px'\n\t\n\t\n\tdocument.body.appendChild(d)\n\tlet color = window.getComputedStyle(d)['background-color'] \n\td.remove()\n\n\treturn color === 'rgb(101, 105, 99)'\n}"],"names":["module","exports","s","preserveCR","replace","test","d","document","createElement","classList","add","body","appendChild","window","getComputedStyle","content","indexOf","head","insertAdjacentHTML","remove","addEventListener","imageExtensions","smallerSizeExt","imageSizeExt","findPreviewVariant","isFileImage","makeVariantImage","fileBasename","findPrimaryVariant","setSpecialVariants","variantDefinition","preview","variants","primary","directoryContents","files","filter","child","directory","definitions","name","toLowerCase","endsWith","imageFiles","getVariant","baseName","variant","definition","definitionFile","imageVariant","map","push","Array","from","Object","keys","length","values","forEach","substring","lastIndexOf","size","img","ext","fallbackSizeExt","fallbackImgageExtensions","item","nameLower","isFileImageName","file","info","noExt","sizeString","dialogStyles","sequence","default","Dialog","options","this","id","Date","getTime","assign","on","buttons","classes","label","prototype","getBodySelector","getFrameSelector","addStylesIfNeeded","querySelector","renderButton","button","generateFrame","join","dialogFrameClass","title","open","self","bodyContent","bodySelector","frameSelector","bodyElement","frameElement","afterOpenResizeSetup","setTimeout","topAndBottom","clientHeight","style","maxHeight","afterOpen","evt","selector","target","result","close","Promise","then","inputInjector","textareaInjector","selectInjector","text","makeDate","date","pad","value","len","formatDate","getFullYear","getMonth","getDate","formatTime","hour","getHours","minute","getMinutes","getSeconds","getMilliseconds","nameAttrPattern","valAttrPattern","typeAttrPattern","inputPattern","checkedAttrPattern","attributeEscapes","evalFunction","Function","fetchValue","obj","path","call","context","expression","isOrContains","possible","isArray","includes","split","r","match","type","replacementText","newVal","orgValue","e","newValue","attr","key","entries","escapeAttributeValue","slice","Streamish","serializeTreeNodes","serializeANode","icons","loadedStyles","async","plan","treeContainerSelector","stream","loadStyles","styleLocation","scriptLocation","data","resolve","reject","KalpaTree","ckscript","setAttribute","onload","loadKalpaTree","tree","Tree","accessors","icon","initialSelection","console","log","node","newParent","previousParent","newIndex","prevIndex","parentId","serializeTree","root","serialize","get","JSON","stringify","render","el","emit","rootId","children","constructor","handles","handle","args","apply","selectPattern","selectedAttrPattern","optionMatch","RegExp","val","breakIndex","textareaPattern","startTagEnd","endTagStart","conditionalExpression","dataExpression","handlingExpression","tripartite","parentPath","currentPath","pparts","cparts","shift","pop","resolveDataPath","_evaluateInContext","dataFunctions","globalData","trim","resolved","ActiveElement","calculateRelativePath","evaluateInContext","template","destination","initialData","currentData","continueOnTripartiteError","callCount","callDepthLimit","run","callback","ourCallback","_run","_resolveHandlingExpression","defaultTemplateName","charAt","templateMeta","parts","reverse","processParts","part","output","resultData","conditional","conditionalResult","undefined","handlingTemplate","applyTemplate","templates","getTemplate","loadTemplate","msg","error","err","Error","write","isStream","pipe","String","ExecutionContext","Tripartite","defaultTemplate","_makeTemplate","thedata","constants","templateBoundary","templateNameBoundary","secondaryTemplateFunctionObject","loaders","dataFunction","transformationFunction","tri","f","i","arguments","arg","addTemplate","parseTemplate","createBlank","count","done","loader","parseTemplateScript","tx","tks","tokenizeTemplateScript","ctn","token","active","stripTemplateWhitespace","txt","_createActiveElement","cd","hd","pt","tokenizeTemplate","t","tk","tokenizeActivePart","con","dat","han","ci","hi","tokenizeActiveAndInactiveBlocks","boundary","position","act","tokens","tripartiteInstance","g","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","o","defineProperty","enumerable","globalThis","prop","hasOwnProperty","Symbol","toStringTag","eventEntryMapper","event","handler","defaultOptions","tagName","events","View","array","Uint8Array","crypto","getRandomValues","btoa","generateId","preinitialize","_ensureElement","initialize","parentElement","removeChild","appendTo","container","replaceContentsOf","innerHTML","setElement","_addListeners","_createElement","view","_setAttributes","className","attributes","eventTriggers","eventNames","reduce","acc","trigger","Set","eventName","_eventHandler","bind","_getCandidates","querySelectorAll","candidates","found","candidate","contains","imageBrowserFrame","variantChoiceBox","guidedImageUploadForm","guidedFileUploadForm","formatBytes","bytes","decimals","dm","Math","floor","parseFloat","pow","toFixed","Emitter","base","EventTarget","super","innerEventTarget","listener","nativeListener","detail","dispatchEvent","CustomEvent","removeListener","removeEventListener","func","FormAnswerDialog","gatherData","afterOpenOriginal","firstInput","focus","formBody","controls","control","checked","getAttribute","gatherFormData","promise","deleteFile","selected","sel","getSelectedFiles","names","deleteWithoutConfirm","prom","note","relPath","eventNotificationPanel","addNotification","model","status","headline","sink","rm","ttl","boxes","emitter","deleteDirectory","currentNode","recursive","curSelected","parent","removeNode","select","_join","_determineParentPath","_fileToKalpaNode","idInd","loaded","nodes","_determineExtensions","extensions","imgVariant","sort","a","b","localeCompare","_determineSizes","min","max","stat","_sortFiles","one","two","_compareVariants","sanitizeFileName","_isImageFile","startsWith","setIfNotSet","_addPending","InfoDialog","changeFilesView","changeFilesViewToClass","choiceBoxes","applyFilter","allVariants","setFolderInfo","clearFilter","selectVariant","currentSelected","ctrlKey","shiftKey","cur","previousElementSibling","toggle","showVariantDetails","closest","_getAssociatedRealFiles","safeThumbnail","escapeAccessUrl","accessUrl","_formatBytes","fileCount","variantCount","byteCount","nonImages","listTriggerSize","listLockSize","cleanFileInfo","getDropCoverSelector","handleDrop","uploadType","dropSquare","_cleanupDropDone","preventDefault","_getFilesFromEvent","uploadFiles","isFileTypeDrag","fileType","dataTransfer","items","kind","dragEnter","overCount","dragLeave","dragOver","cover","handlePaste","ignoreGlobalEvents","clipboardData","createDirectory","directoryPath","mkdir","getFullFileInfo","expand","addSoftBreaks","chars","chrs","c","breakOnChars","createVariantValues","variantValues","used","remainingChildren","thumbnailIcon","thumbnail","_createAccessUrl","imagesOnly","sizes","safeBaseName","foundItems","webkitGetAsEntry","entry","isDirectory","getAsFile","File","url","encodeURIComponent","urlEscapeChars","_transformRelativeUrlToPublic","getSelectedUrl","selectedFiles","chosen","defData","read","parse","getSelectedUrlExtFromMeta","displaySize","altText","baseImageName","char","dataToImage","finalImage","objectUrl","Image","src","imageBlob","Blob","URL","createObjectURL","finish","revokeObjectURL","complete","resizeImage","imageData","maxWidth","quality","outputFormat","resizeImg","ratio","naturalWidth","naturalHeight","resizeCanvas","width","height","ctx","getContext","clearRect","drawImage","toBlob","blob","getImageStats","types","getExtension","mime","webpMime","makeImageSet","singleDensityWidth","doubleDensityInput","baseFileName","source","stats","doubleDensityWidth","suffixes","nameParts","_uploadGuidedImageFile","getFileImageStats","nativeName","mainUrl","makeImageData","parseInt","meta","fileName","_uploadData","fallback","_uploadGuidedFile","_uploadAutomaticImageFile","uploadedAccessUrls","uploaded","setCurrentNode","accessUrls","_uploadFileButton","fileUploadSelector","click","_uploadFile","input","findDirectories","results","find","ImageBrowserView","rootDirectory","rootNode","directories","startingDirectory","choicesBoxes","scrollTop","dialog","treeHolder","imageBrowserView","chooseOnUpload","selection","left","color","areStylesLoaded","link","href","rel","FileSelectDialog"],"sourceRoot":""}
|