lakelib 0.0.4 → 0.0.5

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":"lake.min.js","sources":["../../src/elements/box.ts","../../src/elements/bookmark.ts","../../src/icons/index.ts","../../src/utils/template.ts","../../src/utils/encode.ts","../../src/utils/safe-template.ts","../../src/utils/camel-case.ts","../../src/utils/in-string.ts","../../src/utils/to-hex.ts","../../src/utils/parse-style.ts","../../src/utils/normalize-value.ts","../../src/utils/denormalize-value.ts","../../src/utils/modifier-text.ts","../../src/utils/for-each.ts","../../src/utils/get-css.ts","../../src/utils/to-node-list.ts","../../src/types/native.ts","../../src/config/tag-names.ts","../../src/utils/debug.ts","../../src/models/nodes.ts","../../src/utils/query.ts","../../src/models/range.ts","../../src/utils/split-nodes.ts","../../src/utils/append-deepest.ts","../../src/utils/remove-br.ts","../../src/utils/merge-nodes.ts","../../src/utils/get-deepest.ts","../../src/utils/wrap-node-list.ts","../../src/utils/remove-zws.ts","../../src/utils/change-tag-name.ts","../../src/utils/fix-numbered-list.ts","../../src/utils/set-block-indent.ts","../../src/utils/morph.ts","../../src/utils/request.ts","../../src/models/fragment.ts","../node_modules/.pnpm/js-base64@3.7.7/node_modules/js-base64/base64.mjs","../node_modules/.pnpm/eventemitter3@5.0.1/node_modules/eventemitter3/index.js","../../src/storage/boxes.ts","../../src/storage/editors.ts","../../src/models/box.ts","../../src/config/element-rules.ts","../../src/parsers/html-parser.ts","../../src/parsers/text-parser.ts","../../src/operations/insert-node.ts","../../src/operations/insert-bookmark.ts","../../src/operations/to-bookmark.ts","../../src/operations/fix-list.ts","../../src/operations/delete-contents.ts","../../src/operations/insert-fragment.ts","../../src/operations/insert-contents.ts","../../src/operations/set-blocks.ts","../../src/operations/split-block.ts","../../src/operations/split-marks.ts","../../src/operations/add-mark.ts","../../src/operations/remove-mark.ts","../../src/operations/insert-link.ts","../../src/ui/button.ts","../../src/ui/dropdown.ts","../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/isObject.js","../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_root.js","../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_freeGlobal.js","../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/now.js","../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_trimmedEndIndex.js","../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_baseTrim.js","../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_Symbol.js","../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_getRawTag.js","../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_objectToString.js","../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_baseGetTag.js","../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/isObjectLike.js","../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/isSymbol.js","../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/toNumber.js","../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/debounce.js","../../src/managers/selection.ts","../../src/managers/command.ts","../node_modules/.pnpm/blueimp-md5@2.19.0/node_modules/blueimp-md5/js/md5.js","../../src/storage/box-instances.ts","../../src/managers/history.ts","../node_modules/.pnpm/tinykeys@2.1.0/node_modules/tinykeys/dist/tinykeys.module.js","../../src/managers/keystroke.ts","../../src/editor.ts","../../src/operations/insert-box.ts","../../src/operations/remove-box.ts","../../src/managers/box-manager.ts","../../src/managers/plugin.ts","../node_modules/.pnpm/typesafe-i18n@5.26.2_typescript@5.4.4/node_modules/typesafe-i18n/runtime/esm/parser/src/basic.mjs","../node_modules/.pnpm/typesafe-i18n@5.26.2_typescript@5.4.4/node_modules/typesafe-i18n/runtime/esm/runtime/src/core.mjs","../node_modules/.pnpm/typesafe-i18n@5.26.2_typescript@5.4.4/node_modules/typesafe-i18n/runtime/esm/runtime/src/util.object.mjs","../node_modules/.pnpm/typesafe-i18n@5.26.2_typescript@5.4.4/node_modules/typesafe-i18n/runtime/esm/runtime/src/util.string.mjs","../../src/i18n/index.ts","../../src/i18n/en-US/index.ts","../../src/i18n/zh-CN/index.ts","../../src/i18n/ja/index.ts","../../src/i18n/ko/index.ts","../../src/config/menu-items.ts","../../src/config/toolbar-items.ts","../../src/ui/upload.ts","../../src/ui/toolbar.ts","../node_modules/.pnpm/@rollup+plugin-typescript@11.1.6_rollup@4.14.0_tslib@2.6.2_typescript@5.4.4/node_modules/tslib/tslib.es6.js","../node_modules/.pnpm/photoswipe@5.4.3/node_modules/photoswipe/dist/photoswipe-lightbox.esm.js","../node_modules/.pnpm/photoswipe@5.4.3/node_modules/photoswipe/dist/photoswipe.esm.js","../../src/boxes/image.ts","../../src/boxes/code-block.ts","../../src/plugins/paste.ts","../../src/plugins/list.ts","../../src/plugins/align.ts","../../src/plugins/bold.ts","../../src/plugins/subscript.ts","../../src/plugins/superscript.ts","../../src/plugins/code.ts","../../src/plugins/format-painter.ts","../../src/ui/link-popup.ts","../../src/plugins/markdown.ts","../../src/plugins/enter-key.ts","../../src/plugins/shift-enter-key.ts","../../src/plugins/backspace-key.ts","../../src/plugins/delete-key.ts","../../src/index.ts","../../src/boxes/hr.ts","../../src/plugins/copy.ts","../../src/plugins/cut.ts","../../src/plugins/undo.ts","../../src/plugins/redo.ts","../../src/plugins/select-all.ts","../../src/plugins/heading.ts","../../src/plugins/block-quote.ts","../../src/plugins/indent.ts","../../src/plugins/italic.ts","../../src/plugins/underline.ts","../../src/plugins/strikethrough.ts","../../src/plugins/font-family.ts","../../src/plugins/font-size.ts","../../src/plugins/font-color.ts","../../src/plugins/highlight.ts","../../src/plugins/remove-format.ts","../../src/plugins/link.ts","../../src/plugins/hr.ts","../../src/plugins/image.ts","../../src/plugins/code-block.ts","../../src/plugins/tab-key.ts","../../src/plugins/arrow-keys.ts"],"sourcesContent":["class BoxElement extends HTMLElement {\n\n}\n\ncustomElements.define('lake-box', BoxElement);\n","class BookmarkElement extends HTMLElement {\n\n}\n\ncustomElements.define('lake-bookmark', BookmarkElement);\n","// These icons are from open source projects.\n//\n// Fluent Icons by Microsoft (https://fluenticons.co/).\n// - superscript.svg\n// - subscript.svg\n// - highlight.svg\n// - highlight-accent.svg\n// - open.svg\n//\n// Phosphor Icons (https://phosphoricons.com/).\n// - other icons\n\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-nocheck\n// basic\nimport plus from './plus.svg';\nimport more from './more.svg';\nimport left from './left.svg';\nimport right from './right.svg';\nimport down from './down.svg';\nimport check from './check.svg';\nimport checkCircle from './check-circle.svg';\nimport warningCircle from './warning-circle.svg';\nimport open from './open.svg';\nimport copy from './copy.svg';\nimport remove from './remove.svg';\nimport maximize from './maximize.svg';\nimport close from './close.svg';\nimport zoomIn from './zoom-in.svg';\nimport zoomOut from './zoom-out.svg';\nimport circleNotch from './circle-notch.svg';\nimport selectAll from './select-all.svg';\nimport undo from './undo.svg';\nimport redo from './redo.svg';\n// block format\nimport heading from './heading.svg';\nimport heading1 from './heading1.svg';\nimport heading2 from './heading2.svg';\nimport heading3 from './heading3.svg';\nimport heading4 from './heading4.svg';\nimport heading5 from './heading5.svg';\nimport heading6 from './heading6.svg';\nimport paragraph from './paragraph.svg';\nimport blockQuote from './block-quote.svg';\nimport list from './list.svg';\nimport numberedList from './numbered-list.svg';\nimport bulletedList from './bulleted-list.svg';\nimport checklist from './checklist.svg';\nimport alignLeft from './align-left.svg';\nimport alignCenter from './align-center.svg';\nimport alignRight from './align-right.svg';\nimport alignJustify from './align-justify.svg';\nimport increaseIndent from './increase-indent.svg';\nimport decreaseIndent from './decrease-indent.svg';\n// mark format\nimport formatPainter from './format-painter.svg';\nimport bold from './bold.svg';\nimport italic from './italic.svg';\nimport underline from './underline.svg';\nimport strikethrough from './strikethrough.svg';\nimport superscript from './superscript.svg';\nimport subscript from './subscript.svg';\nimport code from './code.svg';\nimport removeFormat from './remove-format.svg';\nimport moreStyle from './more-style.svg';\nimport fontColor from './font-color.svg';\nimport fontColorAccent from './font-color-accent.svg';\nimport highlight from './highlight.svg';\nimport highlightAccent from './highlight-accent.svg';\n// items that can be inserted\nimport link from './link.svg';\nimport unlink from './unlink.svg';\nimport hr from './hr.svg';\nimport image from './image.svg';\nimport codeBlock from './code-block.svg';\nimport table from './table.svg';\n\nexport const icons: Map<string, string> = new Map([\n ['plus', plus],\n ['more', more],\n ['left', left],\n ['right', right],\n ['down', down],\n ['check', check],\n ['checkCircle', checkCircle],\n ['warningCircle', warningCircle],\n ['open', open],\n ['copy', copy],\n ['remove', remove],\n ['maximize', maximize],\n ['close', close],\n ['zoomIn', zoomIn],\n ['zoomOut', zoomOut],\n ['circleNotch', circleNotch],\n ['selectAll', selectAll],\n ['undo', undo],\n ['redo', redo],\n ['heading', heading],\n ['heading1', heading1],\n ['heading2', heading2],\n ['heading3', heading3],\n ['heading4', heading4],\n ['heading5', heading5],\n ['heading6', heading6],\n ['paragraph', paragraph],\n ['blockQuote', blockQuote],\n ['list', list],\n ['numberedList', numberedList],\n ['bulletedList', bulletedList],\n ['checklist', checklist],\n ['alignLeft', alignLeft],\n ['alignCenter', alignCenter],\n ['alignRight', alignRight],\n ['alignJustify', alignJustify],\n ['increaseIndent', increaseIndent],\n ['decreaseIndent', decreaseIndent],\n ['formatPainter', formatPainter],\n ['bold', bold],\n ['italic', italic],\n ['underline', underline],\n ['strikethrough', strikethrough],\n ['superscript', superscript],\n ['subscript', subscript],\n ['code', code],\n ['removeFormat', removeFormat],\n ['moreStyle', moreStyle],\n ['fontColor', fontColor],\n ['fontColorAccent', fontColorAccent],\n ['highlight', highlight],\n ['highlightAccent', highlightAccent],\n ['link', link],\n ['unlink', unlink],\n ['hr', hr],\n ['image', image],\n ['codeBlock', codeBlock],\n ['table', table],\n]);\n","export function template(strings: TemplateStringsArray, ...keys: any[]): string {\n let content = strings[0];\n for (let i = 0; i < keys.length; i++) {\n const key = String(keys[i]);\n content += key;\n content += strings[i + 1];\n }\n content = content.\n replace(/^\\s+/gm, '').\n replace(/\\s+$/gm, '').\n replace(/[\\r\\n]/g, '');\n return content;\n}\n","const characterMap = new Map([\n ['&', '&amp;'],\n ['<', '&lt;'],\n ['>', '&gt;'],\n ['\"', '&quot;'],\n ['\\xA0', '&nbsp;'],\n]);\n\n// Converts all of the reserved characters in the specified string to HTML entities.\nexport function encode(value: string): string {\n return value.replace(/[&<>\"\\xA0]/g, match => characterMap.get(match) ?? '');\n}\n","import { encode } from './encode';\n\nexport function safeTemplate(strings: TemplateStringsArray, ...keys: any[]): string {\n let content = strings[0];\n for (let i = 0; i < keys.length; i++) {\n const key = String(keys[i]);\n // Escape special characters in the substitution.\n content += encode(key);\n // Don't escape special characters in the template.\n content += strings[i + 1];\n }\n content = content.\n replace(/^\\s+/gm, '').\n replace(/\\s+$/gm, '').\n replace(/[\\r\\n]/g, '');\n return content;\n}\n","export function camelCase(value: string): string {\n const valueList = value.split('-');\n let camelString = '';\n valueList.forEach((val, index) => {\n camelString += (index > 0) ? val.charAt(0).toUpperCase() + val.substring(1) : val;\n });\n return camelString;\n}\n","// Search for a specified value within an string and return true or false (false if not found).\nexport function inString(string: string, value: string, delimiter?: string): boolean {\n if (delimiter === undefined) {\n delimiter = ',';\n }\n return (delimiter + string + delimiter).indexOf(delimiter + value + delimiter) >= 0;\n}\n","// Converts an alpha value to a hex value.\nfunction alphaToHex(value: string): string {\n const hexString = Math.round(Number.parseFloat(value) * 255).toString(16);\n return hexString.length > 1 ? hexString : `0${hexString}`;\n}\n\n// Converts a decimal to a hex value.\nfunction hex(value: string): string {\n const hexString = Number.parseInt(value, 10).toString(16).toLowerCase();\n return hexString.length > 1 ? hexString : `0${hexString}`;\n}\n\n// Converting colors in RGB or RGBA format to hex format.\nexport function toHex(value: string): string {\n return value.replace(\n /rgba?\\s*\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*(?:,\\s*([\\d.]+)\\s*)?\\)/ig,\n (match, p1, p2, p3, p4) => {\n if (p4 === undefined) {\n return `#${hex(p1)}${hex(p2)}${hex(p3)}`;\n }\n return `#${hex(p1)}${hex(p2)}${hex(p3)}${alphaToHex(p4)}`;\n },\n );\n}\n","import { KeyValue } from '../types/object';\nimport { toHex } from './to-hex';\n\nexport function parseStyle(styleValue: string): KeyValue {\n styleValue = styleValue.replace(/&quot;/ig, '\"');\n const properties: KeyValue = {};\n const re = /\\s*([\\w-]+)\\s*:([^;]*)(;|$)/g;\n let result;\n while ((result = re.exec(styleValue)) !== null) {\n const key = result[1].toLowerCase().trim();\n const val = toHex(result[2]).trim();\n properties[key] = val;\n }\n return properties;\n}\n","// Converts the special tags to ordinary HTML tags that can be parsed by browser.\nexport function normalizeValue(value: string): string {\n return value.\n replace(/(<lake-box[^>]+>)[\\s\\S]*?(<\\/lake-box>)/ig, '$1$2').\n replace(/<anchor\\s*\\/>/ig, '<lake-bookmark type=\"anchor\"></lake-bookmark>').\n replace(/<focus\\s*\\/>/ig, '<lake-bookmark type=\"focus\"></lake-bookmark>');\n}\n","// Converts the custom HTML tags to the special tags that can not be parsed by browser.\nexport function denormalizeValue(value: string): string {\n return value.\n replace(/(<lake-box[^>]+>)[\\s\\S]*?(<\\/lake-box>)/ig, '$1$2').\n replace(/<lake-bookmark\\s+type=\"anchor\">\\s*<\\/lake-bookmark>/ig, '<anchor />').\n replace(/<lake-bookmark\\s+type=\"focus\">\\s*<\\/lake-bookmark>/ig, '<focus />');\n}\n","// Returns the text of keyboard shortcuts used for a tooltip or help.\n// Mac: mod+Z returns ⌘+Z\n// Windows / Linux: mod+Z returns Ctrl+Z\nexport function modifierText(value: string, userAgent?: string): string {\n userAgent = userAgent ?? navigator.userAgent;\n const isMac = userAgent.indexOf('Mac OS X') >= 0;\n const modText = isMac ? '⌘' : 'Ctrl';\n return value.replace(/(^|\\+|\\s)mod(\\+|\\s|$)/g, `$1${modText}$2`);\n}\n","type CallbackFunction = (key: string, value: any) => boolean | void;\n\nexport function forEach(map: { [key: string]: any }, callback: CallbackFunction): void {\n for (const key in map) {\n if (callback(key, map[key]) === false) {\n break;\n }\n }\n}\n","import { camelCase } from './camel-case';\nimport { toHex } from './to-hex';\n\n// Returns a property value of all CSS properties of an element\nexport function getCSS(element: Element, propertyName: string): string {\n const camelPropertyName = camelCase(propertyName);\n const computedStyle = window.getComputedStyle(element, null);\n const propertyValue = element.style[camelPropertyName] || computedStyle.getPropertyValue(propertyName) || '';\n return toHex(propertyValue);\n}\n","import { NativeNode } from '../types/native';\n\nexport function toNodeList(content: string | NativeNode, valueType?: 'text' | 'html'): NativeNode[] {\n const nodeList: NativeNode[] = [];\n // a node\n if (typeof content !== 'string') {\n nodeList.push(content);\n return nodeList;\n }\n // empty string\n if (content === '') {\n return nodeList;\n }\n // text string\n if (valueType === 'text') {\n const textNode = document.createTextNode(content);\n nodeList.push(textNode);\n return nodeList;\n }\n // HTML string\n if (valueType === 'html' || /<.+>/.test(content)) {\n const container = document.createElement('div');\n container.innerHTML = content;\n for (const child of container.childNodes) {\n nodeList.push(child);\n }\n return nodeList;\n }\n // selector string\n const elements = document.querySelectorAll(content);\n for (const child of elements) {\n nodeList.push(child);\n }\n return nodeList;\n}\n","export type NativeNode = Node;\nexport const NativeNode = Node;\n\nexport type NativeRange = Range;\nexport const NativeRange = Range;\n\nexport type NativeSelection = Selection;\n","export const blockTagNames: Set<string> = new Set([\n 'h1',\n 'h2',\n 'h3',\n 'h4',\n 'h5',\n 'h6',\n 'div',\n 'p',\n 'blockquote',\n 'ul',\n 'ol',\n 'li',\n 'table',\n 'tr',\n 'th',\n 'td',\n]);\n\nexport const markTagNames: Set<string> = new Set([\n 'span',\n 'strong',\n 'em',\n 'i',\n 'u',\n 's',\n 'sup',\n 'sub',\n 'code',\n]);\n\n// https://developer.mozilla.org/en-US/docs/Glossary/Void_element\nexport const voidTagNames: Set<string> = new Set([\n 'area',\n 'base',\n 'br',\n 'col',\n 'embed',\n 'hr',\n 'img',\n 'input',\n 'link',\n 'meta',\n 'param',\n 'source',\n 'track',\n 'wbr',\n]);\n\nexport const headingTagNames: Set<string> = new Set([\n 'h1',\n 'h2',\n 'h3',\n 'h4',\n 'h5',\n 'h6',\n]);\n\n\nexport const listTagNames: Set<string> = new Set([\n 'ol',\n 'ul',\n 'li',\n]);\n\nexport const tableTagNames: Set<string> = new Set([\n 'table',\n 'tr',\n 'td',\n]);\n","/* eslint no-console: \"off\" */\n\nexport function debug(...data: any[]): void {\n if (window.LAKE_DEBUG) {\n console.log.apply(console.log, data);\n }\n}\n","import { KeyValue } from '../types/object';\nimport {\n NativeNode,\n} from '../types/native';\nimport { NodePath } from '../types/node';\nimport {\n blockTagNames, markTagNames, voidTagNames,\n headingTagNames, listTagNames, tableTagNames,\n} from '../config/tag-names';\nimport { forEach } from '../utils/for-each';\nimport { inString } from '../utils/in-string';\nimport { camelCase } from '../utils/camel-case';\nimport { getCSS } from '../utils/get-css';\nimport { toHex } from '../utils/to-hex';\nimport { toNodeList } from '../utils/to-node-list';\nimport { debug } from '../utils/debug';\n\ntype EachCallback = (element: NativeNode, index: number) => boolean | void;\ntype EachElementCallback = (element: Element, index: number) => boolean | void;\n\ntype EventItem = {\n type: string;\n listener: EventListener;\n};\n\n// Is a key-value object for storing all events.\n// value is an array which include types and listeners.\nconst eventData: { [key: number]: EventItem[] } = {};\n\nlet lastNodeId = 0;\n\nexport class Nodes {\n // Returns native nodes that includes element, text node.\n private nodeList: NativeNode[];\n\n // Represents the number of nodes in nodeList.\n public length: number;\n\n constructor(node?: NativeNode | NativeNode[] | null) {\n node = node ?? [];\n this.nodeList = Array.isArray(node) ? node : [node];\n for (let i = 0; i < this.nodeList.length; i++) {\n // lakeId is an expando for preserving node ID.\n // https://developer.mozilla.org/en-US/docs/Glossary/Expando\n if (!this.nodeList[i].lakeId) {\n this.nodeList[i].lakeId = ++lastNodeId;\n }\n }\n this.length = this.nodeList.length;\n }\n\n // Returns node ID at the first index.\n public get id(): number {\n const node = this.get(0);\n return node.lakeId;\n }\n\n // Returns node name at the first index.\n public get name(): string {\n if (this.length === 0) {\n return '';\n }\n const node = this.get(0);\n return node.nodeName.toLowerCase();\n }\n\n // Returns a boolean value indicating whether the node is an element.\n public get isElement(): boolean {\n if (this.length === 0) {\n return false;\n }\n const node = this.get(0);\n return node.nodeType === NativeNode.ELEMENT_NODE;\n }\n\n // Returns a boolean value indicating whether the node is a text node.\n public get isText(): boolean {\n if (this.length === 0) {\n return false;\n }\n const node = this.get(0);\n return node.nodeType === NativeNode.TEXT_NODE;\n }\n\n // Returns a boolean value indicating whether the node is a block element.\n public get isBlock(): boolean {\n if (this.length === 0) {\n return false;\n }\n return blockTagNames.has(this.name);\n }\n\n // Returns a boolean value indicating whether the node is a mark element.\n public get isMark(): boolean {\n if (this.length === 0) {\n return false;\n }\n return markTagNames.has(this.name);\n }\n\n // Returns a boolean value indicating whether the node is a void element.\n public get isVoid(): boolean {\n if (this.length === 0) {\n return false;\n }\n return voidTagNames.has(this.name);\n }\n\n // Returns a boolean value indicating whether the node is a heading element.\n public get isHeading(): boolean {\n if (this.length === 0) {\n return false;\n }\n return headingTagNames.has(this.name);\n }\n\n // Returns a boolean value indicating whether the node is a list element.\n public get isList(): boolean {\n if (this.length === 0) {\n return false;\n }\n return listTagNames.has(this.name);\n }\n\n // Returns a boolean value indicating whether the node is a table element.\n public get isTable(): boolean {\n if (this.length === 0) {\n return false;\n }\n return tableTagNames.has(this.name);\n }\n\n // Returns a boolean value indicating whether the node is a bookmark element.\n public get isBookmark(): boolean {\n return this.name === 'lake-bookmark';\n }\n\n // Returns a boolean value indicating whether the node is a box element.\n public get isBox(): boolean {\n return this.name === 'lake-box';\n }\n\n // Returns a boolean value indicating whether the node is a inline box element.\n public get isInlineBox(): boolean {\n return this.isBox && this.attr('type') === 'inline';\n }\n\n // Returns a boolean value indicating whether the node is a block box element.\n public get isBlockBox(): boolean {\n return this.isBox && this.attr('type') === 'block';\n }\n\n // Returns a boolean value indicating whether the element is a root element of contenteditable area.\n public get isContainer(): boolean {\n if (this.length === 0) {\n return false;\n }\n const node = this.get(0) as HTMLElement;\n return this.isElement && node.getAttribute('contenteditable') === 'true';\n }\n\n // Returns a boolean value indicating whether the node is ouside the container.\n public get isOutside(): boolean {\n return this.closest('[contenteditable=\"true\"]').length === 0;\n }\n\n // Returns a boolean value indicating whether the node is inside the container.\n public get isInside(): boolean {\n return !this.isOutside && !this.isContainer;\n }\n\n // Returns a boolean value indicating whether the node is a top element inside the container.\n public get isTopInside(): boolean {\n if (this.length === 0) {\n return false;\n }\n const parentNode = this.parent();\n if (parentNode.length === 0) {\n return false;\n }\n return this.isInside && parentNode.isContainer;\n }\n\n // Returns a boolean value indicating whether the node is editable or the node is a container.\n public get isContentEditable(): boolean {\n if (this.length === 0) {\n return false;\n }\n if (this.isText) {\n const element = this.get(0).parentNode as HTMLElement;\n if (!element) {\n return false;\n }\n return element.isContentEditable;\n }\n if (!this.isElement) {\n return false;\n }\n const element = this.get(0) as HTMLElement;\n return element.isContentEditable;\n }\n\n // Returns a boolean value indicating whether the node is indivisible.\n public get isIndivisible(): boolean {\n return this.isContainer || this.isTable;\n }\n\n // Returns a boolean value indicating whether the node is empty.\n public get isEmpty(): boolean {\n if (this.isBox) {\n return false;\n }\n const nodeText = this.text();\n const isEmptyText = nodeText === '' || /^[\\r\\n\\u200B\\u2060]+$/.test(nodeText);\n if (this.isElement && isEmptyText) {\n return this.find('lake-box').length === 0;\n }\n return isEmptyText;\n }\n\n // Returns a boolean value indicating whether the node and the target node are siblings.\n public isSibling(target: Nodes): boolean {\n if (this.length === 0) {\n return false;\n }\n const parent = this.get(0).parentNode as HTMLElement;\n return parent && parent === target.parent().get(0);\n }\n\n // Gets a native node at the specified index.\n public get(index: number): NativeNode {\n return this.nodeList[index];\n }\n\n // Gets all native nodes\n public getAll(): NativeNode[] {\n return this.nodeList;\n }\n\n // Reduces the nodes of a Nodes object to the one at the specified index.\n public eq(index: number): Nodes {\n const node = this.get(index);\n return new Nodes(node);\n }\n\n // Iterates over a Nodes object, executing a function for each node.\n public each(callback: EachCallback): this {\n const nodes = this.getAll();\n for (let i = 0; i < nodes.length; i++) {\n if (callback(nodes[i], i) === false) {\n return this;\n }\n }\n return this;\n }\n\n // Iterates over a Nodes object, executing a function for each element.\n public eachElement(callback: EachElementCallback): this {\n const nodes = this.getAll();\n for (let i = 0; i < nodes.length; i++) {\n if (nodes[i].nodeType === NativeNode.ELEMENT_NODE) {\n if (callback(nodes[i] as Element, i) === false) {\n return this;\n }\n }\n }\n return this;\n }\n\n // Reverses the nodes of a Nodes object.\n public reverse(): Nodes {\n const nodes = this.getAll().reverse();\n return new Nodes(nodes);\n }\n\n // Tests whether the element would be selected by the specified CSS selector.\n public matches(selector: string): boolean {\n if (!this.isElement) {\n return false;\n }\n const element = this.get(0) as Element;\n return element.matches(selector);\n }\n\n // Returns the descendants of the first element which are selected by the specified CSS selector.\n public find(selector: string | NodePath): Nodes {\n if (typeof selector === 'string') {\n const element = this.get(0) as Element;\n const nodeList = element.querySelectorAll(selector);\n return new Nodes(Array.from(nodeList));\n }\n let node = this.eq(0);\n for (const index of selector) {\n node = node.children()[index];\n if (!node) {\n return new Nodes();\n }\n }\n return node;\n }\n\n // Traverses the first node and its parents (heading toward the document root)\n // until it finds a element that matches the specified CSS selector.\n public closest(selector: string): Nodes {\n if (this.isText) {\n const element = this.get(0).parentNode;\n if (!element) {\n return new Nodes();\n }\n return new Nodes((element as Element).closest(selector));\n }\n if (!this.isElement) {\n return new Nodes();\n }\n const element = this.get(0) as Element;\n return new Nodes(element.closest(selector));\n }\n\n // Traverses the first node and its parents until it finds a block element.\n public closestBlock() {\n let node = this.eq(0);\n while (node.length > 0) {\n if (node.isTopInside || node.isBlock) {\n break;\n }\n node = node.parent();\n }\n if (!node.isBlock) {\n return new Nodes();\n }\n return node;\n }\n\n // Traverses the first node and its parents until it finds an operable block.\n public closestOperableBlock(): Nodes {\n const boxNode = this.closest('lake-box');\n const block = boxNode.length > 0 ? boxNode.closestBlock() : this.closestBlock();\n if (block.length === 0) {\n return block;\n }\n if (block.isTable) {\n return new Nodes();\n }\n const parentBlock = block.parent();\n if (block.name === 'li' && parentBlock.isList) {\n return parentBlock;\n }\n return block;\n }\n\n // Traverses the first node and its parents until it finds a root element which has contenteditable=\"true\" attribute..\n public closestContainer(): Nodes {\n return this.closest('div[contenteditable=\"true\"]');\n }\n\n // Returns the parent of the first node.\n public parent(): Nodes {\n const node = this.get(0);\n return new Nodes(node.parentNode);\n }\n\n // Returns the immediately preceding sibling of the first node.\n public prev(): Nodes {\n const node = this.get(0);\n return new Nodes(node.previousSibling);\n }\n\n // Returns the immediately following sibling of the first node.\n public next(): Nodes {\n const node = this.get(0);\n return new Nodes(node.nextSibling);\n }\n\n // Returns the first child of the first element.\n public first(): Nodes {\n const element = this.get(0);\n return new Nodes(element.firstChild);\n }\n\n // Returns the last child of the first element.\n public last(): Nodes {\n const element = this.get(0);\n return new Nodes(element.lastChild);\n }\n\n // Returns a number indicating the position of the first node relative to its sibling nodes.\n public index(): number {\n let i = -1;\n let sibling: NativeNode | null = this.get(0);\n while (sibling) {\n i++;\n sibling = sibling.previousSibling;\n }\n return i;\n }\n\n // Returns a path of the first element.\n public path(): NodePath {\n const path: NodePath = [];\n let node = this.eq(0);\n if (node.isContainer) {\n return path;\n }\n while (node.length > 0) {\n const parent = node.parent();\n if (parent.length === 0) {\n break;\n }\n path.push(node.index());\n if (parent.isContainer) {\n break;\n }\n node = parent;\n }\n return path.reverse();\n }\n\n // Returns a list of child nodes of the first element.\n public children(): Nodes[] {\n const childList: Nodes[] = [];\n let child = this.first();\n while (child.length > 0) {\n childList.push(child);\n child = child.next();\n }\n return childList;\n }\n\n // Returns a node generator that iterates over the descendants of the first element.\n public * getWalker(): Generator<Nodes> {\n function * iterate(node: Nodes): Generator<Nodes> {\n if (node.isBox) {\n return;\n }\n let child = node.first();\n while (child.length > 0) {\n const nextNode = child.next();\n yield child;\n yield * iterate(child);\n child = nextNode;\n }\n }\n for (const node of iterate(this.eq(0))) {\n yield node;\n }\n }\n\n // Attaches an event listener for the elements.\n public on(type: string, listener: EventListener): this {\n return this.eachElement(element => {\n element.addEventListener(type, listener, false);\n const elementId = element.lakeId;\n if (!eventData[elementId]) {\n eventData[elementId] = [];\n }\n eventData[elementId].push({\n type,\n listener,\n });\n });\n }\n\n // Removes event handlers that were attached with .on() method.\n public off(type?: string, listener?: EventListener): this {\n return this.eachElement(element => {\n const elementId = element.lakeId;\n const eventItems = eventData[elementId] ?? [];\n eventItems.forEach((item, index) => {\n if (!type || type === item.type && (!listener || listener === item.listener)) {\n element.removeEventListener(item.type, item.listener, false);\n eventItems[index] = {\n type: '',\n listener: () => {},\n };\n }\n });\n eventData[elementId] = eventItems.filter((item: EventItem) => item.type !== '');\n });\n }\n\n // Executes all event listeners attached to the Nodes object for the given event type.\n public emit(type: string, event?: Event): this {\n return this.eachElement(element => {\n const elementId = element.lakeId;\n const eventItems = eventData[elementId];\n eventItems.forEach(item => {\n if (item.type === type) {\n item.listener(event ?? new Event(type));\n }\n });\n });\n }\n\n // Gets all event listeners attached to the Nodes object.\n public getEventListeners(index: number): EventItem[] {\n const elementId = this.get(index).lakeId;\n return eventData[elementId];\n }\n\n // Sets focus on the specified element, if it can be focused.\n public focus(): this {\n const element = this.get(0) as HTMLElement;\n element.focus();\n return this;\n }\n\n // Removes focus from the specified element.\n public blur(): this {\n const element = this.get(0) as HTMLElement;\n element.blur();\n return this;\n }\n\n // Returns a duplicate of the first node.\n public clone(deep: boolean = false): Nodes {\n const node = this.get(0);\n return new Nodes(node.cloneNode(deep));\n }\n\n public hasAttr(attributeName: string): boolean {\n const element = this.get(0) as Element;\n return element.hasAttribute(attributeName);\n }\n\n public attr(attributeName: string): string;\n\n public attr(attributeName: string, value: string): this;\n\n public attr(attributeName: KeyValue): this;\n\n public attr(attributeName: any, value?: any): any {\n if (typeof attributeName === 'object') {\n forEach(attributeName, (name, val) => {\n this.attr(name, val);\n });\n return this;\n }\n if (value === undefined) {\n const element = this.get(0) as Element;\n return element.getAttribute(attributeName) ?? '';\n }\n return this.eachElement(element => {\n element.setAttribute(attributeName, value);\n });\n }\n\n public removeAttr(attributeName: string): this {\n return this.eachElement(element => {\n element.removeAttribute(attributeName);\n });\n }\n\n public hasClass(className: string): boolean {\n const element = this.get(0) as Element;\n return inString(element.className, className, ' ');\n }\n\n public addClass(className: string | string[]): this {\n if (Array.isArray(className)) {\n className.forEach(name => {\n this.addClass(name);\n });\n return this;\n }\n return this.eachElement(element => {\n if (inString(element.className, className, ' ')) {\n return;\n }\n element.classList.add(className);\n });\n }\n\n public removeClass(className: string | string[]): this {\n if (Array.isArray(className)) {\n className.forEach(name => {\n this.removeClass(name);\n });\n return this;\n }\n return this.eachElement(element => {\n if (!inString(element.className, className, ' ')) {\n return;\n }\n element.classList.remove(className);\n if (element.className === '') {\n element.removeAttribute('class');\n }\n });\n }\n\n public computedCSS(propertyName: string): string {\n const element = this.get(0) as Element;\n return getCSS(element, propertyName);\n }\n\n public css(propertyName: string): string;\n\n public css(propertyName: KeyValue): this;\n\n public css(propertyName: string, value: string): this;\n\n public css(propertyName: any, value?: any): any {\n if (typeof propertyName === 'object') {\n forEach(propertyName, (name, val) => {\n this.css(name, val);\n });\n return this;\n }\n if (value === undefined) {\n const element = this.get(0) as Element;\n return toHex(element.style[camelCase(propertyName)]);\n }\n return this.eachElement(element => {\n element.style[camelCase(propertyName)] = value;\n if (element.getAttribute('style') === '') {\n element.removeAttribute('style');\n }\n });\n }\n\n // Returns the width of of the first element.\n public width(): number {\n const element = this.get(0) as HTMLElement;\n return element.offsetWidth;\n }\n\n // Returns the interior width of the first element, which does not include padding.\n public innerWidth() {\n const paddingLeft = parseInt(this.computedCSS('padding-left'), 10) || 0;\n const paddingRight = parseInt(this.computedCSS('padding-right'), 10) || 0;\n return this.width() - paddingLeft - paddingRight;\n }\n\n // Returns the height of of the first element.\n public height(): number {\n const element = this.get(0) as HTMLElement;\n return element.offsetHeight;\n }\n\n public show(displayType: string = 'block'): this {\n this.css('display', displayType);\n return this;\n }\n\n public hide(): this {\n this.css('display', 'none');\n return this;\n }\n\n public html(): string;\n\n public html(value: string): this;\n\n public html(value?: any): any {\n if (value === undefined) {\n const element = this.get(0) as Element;\n return element.innerHTML;\n }\n return this.eachElement(element => {\n element.innerHTML = value;\n });\n }\n\n public text(): string;\n\n public text(value: string): this;\n\n public text(value?: string): any {\n if (value === undefined) {\n const node = this.get(0);\n if (this.isText) {\n return node.nodeValue ?? '';\n }\n const element = node as HTMLElement;\n // https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/innerText\n return element.innerText.replace(/^\\n+|\\n+$/, '');\n }\n return this.eachElement(element => {\n (element as HTMLElement).innerText = value;\n });\n }\n\n public outerHTML(): string {\n const element = this.get(0) as Element;\n return element.outerHTML;\n }\n\n // Removes all child nodes of each element.\n public empty(): this {\n this.html('');\n return this;\n }\n\n // Inserts the specified content as the first child of each element.\n public prepend(content: string | NativeNode | DocumentFragment | Nodes): this {\n if (typeof content === 'string') {\n return this.eachElement(element => {\n const list = toNodeList(content as string).reverse();\n list.forEach((node: NativeNode) => {\n if (element.firstChild) {\n element.insertBefore(node, element.firstChild);\n } else {\n element.appendChild(node);\n }\n });\n });\n }\n const element = this.get(0);\n if (content instanceof Nodes) {\n content = content.get(0);\n }\n if (element.firstChild) {\n element.insertBefore(content, element.firstChild);\n } else {\n element.appendChild(content);\n }\n return this;\n }\n\n // Inserts the specified content as the last child of each element.\n public append(content: string | NativeNode | DocumentFragment | Nodes): this {\n if (typeof content === 'string') {\n return this.eachElement(element => {\n const list = toNodeList(content as string);\n list.forEach((node: NativeNode) => {\n element.appendChild(node);\n });\n });\n }\n const element = this.get(0);\n if (content instanceof Nodes) {\n content = content.get(0);\n }\n element.appendChild(content);\n return this;\n }\n\n // Inserts the specified content before each node.\n public before(content: string | NativeNode | DocumentFragment | Nodes): this {\n if (typeof content === 'string') {\n return this.each(node => {\n const list = toNodeList(content as string);\n list.forEach(target => {\n if (!node.parentNode) {\n return;\n }\n node.parentNode.insertBefore(target, node);\n });\n });\n }\n const node = this.get(0);\n if (content instanceof Nodes) {\n content = content.get(0);\n }\n if (!node.parentNode) {\n return this;\n }\n node.parentNode.insertBefore(content, node);\n return this;\n }\n\n // Inserts the specified content after each node.\n public after(content: string | NativeNode | DocumentFragment | Nodes): this {\n if (typeof content === 'string') {\n return this.each(node => {\n const list = toNodeList(content as string).reverse();\n list.forEach(target => {\n if (!node.parentNode) {\n return;\n }\n if (node.nextSibling) {\n node.parentNode.insertBefore(target, node.nextSibling);\n } else {\n node.parentNode.appendChild(target);\n }\n });\n });\n }\n const node = this.get(0);\n if (content instanceof Nodes) {\n content = content.get(0);\n }\n if (!node.parentNode) {\n return this;\n }\n if (node.nextSibling) {\n node.parentNode.insertBefore(content, node.nextSibling);\n } else {\n node.parentNode.appendChild(content);\n }\n return this;\n }\n\n // Replaces each node with the provided new content.\n public replaceWith(newContent: string | NativeNode | Nodes): this {\n return this.each(node => {\n let target: NativeNode;\n if (newContent instanceof Nodes) {\n target = newContent.get(0);\n } else {\n target = toNodeList(newContent)[0];\n }\n if (!node.parentNode) {\n return;\n }\n node.parentNode.replaceChild(target, node);\n });\n }\n\n // Removes each node from the DOM.\n // keepChildren parameter:\n // A boolean value; true only removes each node and keeps all descended nodes; false removes the descendants; if omitted, it defaults to false.\n public remove(keepChildren: boolean = false): this {\n this.each(node => {\n if (!node.parentNode) {\n return;\n }\n if (keepChildren) {\n let child = node.firstChild;\n while (child) {\n const next = child.nextSibling;\n node.parentNode.insertBefore(child, node);\n child = next;\n }\n }\n node.parentNode.removeChild(node);\n });\n return this;\n }\n\n // Breaks the first text node into two nodes at the specified offset, keeping both nodes in the tree as siblings.\n public splitText(offset: number): Nodes {\n if (!this.isText) {\n return new Nodes();\n }\n const node = this.get(0) as Text;\n const newNode = node.splitText(offset);\n return new Nodes(newNode);\n }\n\n // Returns information of the first node.\n public toString(): string {\n if (this.length === 0) {\n return '';\n }\n const node = this.get(0);\n let nodeValue = this.isText ? node.nodeValue : this.outerHTML();\n if (nodeValue && nodeValue.length > 50) {\n nodeValue = `${nodeValue.substring(0, 50)} ...`;\n }\n return `node (${node.lakeId}): ${nodeValue}`;\n }\n\n // Prints information of the first node.\n public debug(): void {\n debug(this.toString());\n }\n}\n","import { NativeNode } from '../types/native';\nimport { toNodeList } from './to-node-list';\nimport { Nodes } from '../models/nodes';\n\nexport function query(content: string | NativeNode | Nodes): Nodes {\n if (content instanceof Nodes) {\n return content;\n }\n const nodes = toNodeList(content);\n return new Nodes(nodes);\n}\n","import { NativeRange } from '../types/native';\nimport { debug } from '../utils/debug';\nimport { query } from '../utils/query';\nimport { Nodes } from './nodes';\n\n// The Range class represents a fragment of a document that can contain nodes and parts of text nodes.\nexport class Range {\n // native range\n private range: NativeRange;\n\n constructor(range?: NativeRange) {\n this.range = range ?? document.createRange();\n }\n\n // Returns a node within which the range starts.\n public get startNode(): Nodes {\n return new Nodes(this.range.startContainer);\n }\n\n // Returns a number representing where in the startNode the range starts.\n public get startOffset(): number {\n return this.range.startOffset;\n }\n\n // Returns a node within which the range ends.\n public get endNode(): Nodes {\n return new Nodes(this.range.endContainer);\n }\n\n // Returns a number representing where in the endNode the range ends.\n public get endOffset(): number {\n return this.range.endOffset;\n }\n\n // Returns the closest node that contains both the startNode and endNode.\n public get commonAncestor(): Nodes {\n return new Nodes(this.range.commonAncestorContainer);\n }\n\n // Returns a boolean value indicating whether the range's start and end points are at the same position.\n public get isCollapsed(): boolean {\n return this.range.collapsed;\n }\n\n // Returns a boolean value indicating whether the range's start point is in the box.\n public get isBox(): boolean {\n const boxNode = this.commonAncestor.closest('lake-box');\n return boxNode.length > 0;\n }\n\n // Returns a boolean value indicating whether the range's common ancestor node is in the left strip of the box.\n // case 1: <lake-box><span class=\"lake-box-strip\">|</span><div class=\"lake-box-container\"></div> ...\n // case 2: <lake-box><span class=\"lake-box-strip\"></span>|<div class=\"lake-box-container\"></div> ...\n // case 3: <lake-box>|<span class=\"lake-box-strip\"></span><div class=\"lake-box-container\"></div> ...\n public get isBoxLeft(): boolean {\n const boxNode = this.commonAncestor.closest('lake-box');\n if (boxNode.length === 0) {\n return false;\n }\n const boxContainer = boxNode.find('.lake-box-container');\n return this.compareBeforeNode(boxContainer) >= 0;\n }\n\n // Returns a boolean value indicating whether the range's common ancestor node is in the center of the box.\n // case 1: ... <div class=\"lake-box-container\"><div>|</div></div> ...\n // case 2: ... <div class=\"lake-box-container\"><div></div>|</div> ...\n public get isBoxCenter(): boolean {\n const boxNode = this.commonAncestor.closest('lake-box');\n if (boxNode.length === 0) {\n return false;\n }\n const boxContainer = boxNode.find('.lake-box-container');\n // Returns true when the box was selected.\n // case: ... <div class=\"lake-box-container\">|<div></div></div> ...\n return this.isCollapsed && this.startNode.get(0) === boxContainer.get(0) && this.startOffset === 0;\n }\n\n // Returns a boolean value indicating whether the range's common ancestor node is in the right strip of the box.\n // case 1: ... <div class=\"lake-box-container\"></div><span class=\"lake-box-strip\">|</span></lake-box>\n // case 2: ... <div class=\"lake-box-container\"></div>|<span class=\"lake-box-strip\"></span></lake-box>\n // case 3: ... <div class=\"lake-box-container\"></div><span class=\"lake-box-strip\"></span>|</lake-box>\n public get isBoxRight(): boolean {\n const boxNode = this.commonAncestor.closest('lake-box');\n if (boxNode.length === 0) {\n return false;\n }\n const boxContainer = boxNode.find('.lake-box-container');\n return this.compareAfterNode(boxContainer) <= 0;\n }\n\n // Returns a boolean value indicating whether the range's common ancestor node is inside the container of the box.\n // case 1: ... <div class=\"lake-box-container\"><div>|</div></div> ...\n // case 2: ... <div class=\"lake-box-container\"><div></div>|</div> ...\n public get isInsideBox(): boolean {\n const boxNode = this.commonAncestor.closest('lake-box');\n if (boxNode.length === 0) {\n return false;\n }\n const boxContainer = boxNode.find('.lake-box-container');\n // Returns false when the box was selected.\n // case: ... <div class=\"lake-box-container\">|<div></div></div> ...\n if (\n this.isCollapsed &&\n this.startNode.get(0) === boxContainer.get(0) &&\n this.startOffset === 0\n ) {\n return false;\n }\n return this.compareBeforeNode(boxContainer) < 0 && this.compareAfterNode(boxContainer) > 0;\n }\n\n // Returns a boolean value indicating whether the range is inoperative.\n public get isInoperative(): boolean {\n if (this.commonAncestor.isOutside) {\n return true;\n }\n const startBlock = this.startNode.closest('td');\n const endBlock = this.endNode.closest('td');\n if (\n startBlock.length > 0 &&\n endBlock.length > 0 &&\n startBlock.get(0) !== endBlock.get(0)\n ) {\n return true;\n }\n return false;\n }\n\n // Gets a native range.\n public get(): NativeRange {\n return this.range;\n }\n\n // Returns −1 if the point is before the range, 0 if the point is in the range, and 1 if the point is after the range.\n public comparePoint(node: Nodes, offset: number): number {\n return this.range.comparePoint(node.get(0), offset);\n }\n\n // Returns -1, 0, or 1 depending on whether the beginning of the specified node is before, the same as, or after the range.\n public compareBeforeNode(node: Nodes): number {\n const targetRange = new Range();\n if (node.isText) {\n targetRange.setStart(node, 0);\n } else {\n targetRange.setStartBefore(node);\n }\n targetRange.collapseToStart();\n return this.comparePoint(targetRange.startNode, targetRange.startOffset);\n }\n\n // Returns -1, 0, or 1 depending on whether the end of the specified node is before, the same as, or after the range.\n public compareAfterNode(node: Nodes): number {\n const targetRange = new Range();\n if (node.isText) {\n const nodeValue = node.get(0).nodeValue ?? '';\n targetRange.setStart(node, nodeValue.length);\n } else {\n targetRange.setStartAfter(node);\n }\n targetRange.collapseToStart();\n return this.comparePoint(targetRange.startNode, targetRange.startOffset);\n }\n\n // Indicates whether a specified node is part of the range or intersects the range.\n public intersectsNode(node: Nodes): boolean {\n return this.range.intersectsNode(node.get(0));\n }\n\n // Sets the start position of the range.\n public setStart(node: Nodes, offset: number): void {\n this.range.setStart(node.get(0), offset);\n }\n\n // Sets the start position of the range before a node.\n public setStartBefore(node: Nodes): void {\n this.range.setStartBefore(node.get(0));\n }\n\n // Sets the start position of the range after a node.\n public setStartAfter(node: Nodes): void {\n this.range.setStartAfter(node.get(0));\n }\n\n // Sets the end position of the range.\n public setEnd(node: Nodes, offset: number): void {\n this.range.setEnd(node.get(0), offset);\n }\n\n // Sets the end position of the range before a node.\n public setEndBefore(node: Nodes): void {\n this.range.setEndBefore(node.get(0));\n }\n\n // Sets the end position of the range after a node.\n public setEndAfter(node: Nodes): void {\n this.range.setEndAfter(node.get(0));\n }\n\n // Collapses the range to the start of it.\n public collapseToStart(): void {\n this.range.collapse(true);\n }\n\n // Collapses the range to the end of it.\n public collapseToEnd(): void {\n this.range.collapse(false);\n }\n\n // Sets the range to contain the specified node and its contents.\n public selectNode(node: Nodes): void {\n this.range.selectNode(node.get(0));\n }\n\n // Sets the range to contain the contents of the specified node.\n public selectNodeContents(node: Nodes): void {\n this.range.selectNodeContents(node.get(0));\n }\n\n // Sets the range to the center position of the box.\n public selectBox(boxNode: Nodes): void {\n const boxContainer = boxNode.find('.lake-box-container');\n if (boxContainer.length === 0) {\n throw new Error(`The box cannot be selected because the box '${boxNode.attr('name')}' (id=${boxNode.id}) has not been rendered yet.`);\n }\n this.setStart(boxContainer, 0);\n this.collapseToStart();\n }\n\n // Sets the range to the left position of the box.\n public selectBoxLeft(boxNode: Nodes): void {\n const boxStrip = boxNode.find('.lake-box-strip');\n if (boxStrip.length === 0) {\n throw new Error(`The box cannot be selected because the box '${boxNode.attr('name')}' (id=${boxNode.id}) has not been rendered yet.`);\n }\n this.selectNodeContents(boxStrip.eq(0));\n this.collapseToEnd();\n }\n\n // Sets the range to the left position of the box.\n public selectBoxRight(boxNode: Nodes): void {\n const boxStrip = boxNode.find('.lake-box-strip');\n if (boxStrip.length === 0) {\n throw new Error(`The box cannot be selected because the box '${boxNode.attr('name')}' (id=${boxNode.id}) has not been rendered yet.`);\n }\n this.selectNodeContents(boxStrip.eq(1));\n this.collapseToEnd();\n }\n\n // Collapses the range and sets the range to the beginning of the contents of the specified node.\n public shrinkBefore(node: Nodes): void {\n if (node.isBox) {\n this.selectBoxLeft(node);\n return;\n }\n if (node.isText) {\n this.setStartBefore(node);\n this.collapseToStart();\n return;\n }\n this.setStart(node, 0);\n let child;\n while (\n this.startNode.isElement &&\n (child = this.startNode.children()[0]) &&\n child.isElement && !child.isVoid\n ) {\n if (child.isBox) {\n this.selectBoxLeft(child);\n return;\n }\n this.setStart(child, 0);\n }\n this.collapseToStart();\n }\n\n // Collapses the range and sets the range to the end of the contents of the specified node.\n public shrinkAfter(node: Nodes): void {\n if (node.isBox) {\n this.selectBoxRight(node);\n return;\n }\n if (node.isText) {\n this.setEndAfter(node);\n this.collapseToEnd();\n return;\n }\n this.setEnd(node, node.children().length);\n let child;\n while (\n this.endNode.isElement &&\n this.endOffset > 0 &&\n (child = this.endNode.children()[this.endOffset - 1]) &&\n child.isElement && !child.isVoid\n ) {\n if (child.isBox) {\n this.selectBoxRight(child);\n return;\n }\n this.setEnd(child, child.children().length);\n }\n this.collapseToEnd();\n }\n\n // Reduces the boundary of the range.\n // <div>[<p><strong>foo</strong></p>]</div>\n // to\n // <div><p><strong>[foo]</strong></p></div>\n public shrink(): void {\n const isCollapsed = this.isCollapsed;\n let child;\n while (\n this.startNode.isElement &&\n (child = this.startNode.children()[this.startOffset]) &&\n child.isElement && !child.isVoid && !child.isBox\n ) {\n this.setStart(child, 0);\n }\n if (isCollapsed) {\n this.collapseToStart();\n return;\n }\n while (\n this.endNode.isElement &&\n this.endOffset > 0 &&\n (child = this.endNode.children()[this.endOffset - 1]) &&\n child.isElement && !child.isVoid && !child.isBox\n ) {\n this.setEnd(child, child.children().length);\n }\n }\n\n // Relocates the start and end points of the range for the box.\n public adaptBox(): void {\n const startBoxNode = this.startNode.closest('lake-box');\n if (startBoxNode.length > 0) {\n const startRange = this.clone();\n startRange.collapseToStart();\n if (startRange.isBoxRight) {\n this.setStartAfter(startBoxNode);\n } else {\n this.setStartBefore(startBoxNode);\n }\n }\n const endBoxNode = this.endNode.closest('lake-box');\n if (endBoxNode.length > 0) {\n const endRange = this.clone();\n endRange.collapseToEnd();\n if (endRange.isBoxLeft) {\n this.setEndBefore(endBoxNode);\n } else {\n this.setEndAfter(endBoxNode);\n }\n }\n }\n\n // Relocates the beginning or end position of the range for table.\n public adaptTable(): void {\n const startTable = this.startNode.closest('table');\n const endTable = this.endNode.closest('table');\n if (startTable.length === 0 && endTable.length > 0 && endTable.isInside) {\n this.setEndBefore(endTable);\n this.shrink();\n return;\n }\n if (endTable.length === 0 && startTable.length > 0 && startTable.isInside) {\n this.setStartAfter(startTable);\n this.shrink();\n }\n }\n\n // Relocates the start point of the range for the block.\n // case 1:\n // <p>foo</p>|<p>bar</p>\n // to\n // <p>foo</p><p>|bar</p>\n // case 2:\n // [<p>foo</p>]<p>bar</p>\n // to\n // <p>[foo]</p><p>bar</p>\n // case 3:\n // [<p>foo</p><p>]bar</p>\n // to\n // <p>[foo]</p><p>bar</p>\n public adaptBlock(): void {\n if (!this.isCollapsed) {\n // [<p>foo</p><p>]bar</p> to [<p>foo</p>]<p>bar</p>\n if (this.endNode.isElement && this.endOffset === 0) {\n let node = this.endNode;\n while (node.prev().length === 0) {\n node = node.parent();\n }\n this.setEndBefore(node);\n }\n this.shrink();\n return;\n }\n if (this.startNode.isText) {\n return;\n }\n const nextBlock = this.startNode.children()[this.startOffset];\n if (nextBlock && (nextBlock.isBlockBox || nextBlock.isBlock)) {\n this.shrinkBefore(nextBlock);\n }\n }\n\n // Relocates the start and end points of the range.\n public adapt(): void {\n this.adaptBox();\n this.adaptTable();\n this.adaptBlock();\n }\n\n // Returns the previous node of the beginning point of the range.\n public getPrevNode(): Nodes {\n let prevNode;\n if (this.startNode.isText) {\n if (this.startOffset === 0) {\n prevNode = this.startNode.prev();\n } else {\n prevNode = this.startNode;\n }\n } else {\n prevNode = this.startNode.children()[this.startOffset - 1];\n }\n return prevNode ?? new Nodes();\n }\n\n // Returns the next node of the beginning point of the range.\n public getNextNode(): Nodes {\n let nextNode;\n if (this.endNode.isText) {\n if (this.endOffset === this.endNode.text().length) {\n nextNode = this.endNode.next();\n } else {\n nextNode = this.endNode;\n }\n } else {\n nextNode = this.endNode.children()[this.endOffset];\n }\n return nextNode ?? new Nodes();\n }\n\n // Returns target boxes relating to the range.\n public getBoxes(): Nodes[] {\n if (this.isCollapsed) {\n const startBox = this.startNode.closest('lake-box');\n return startBox.length > 0 ? [ startBox ] : [];\n }\n const nodeList: Nodes[] = [];\n const clonedRange = this.clone();\n clonedRange.adaptBox();\n for (const child of clonedRange.commonAncestor.getWalker()) {\n if (child.isBox && clonedRange.intersectsNode(child)) {\n nodeList.push(child);\n }\n }\n return nodeList;\n }\n\n // Returns target blocks relating to the range.\n public getBlocks(): Nodes[] {\n if (this.isCollapsed) {\n const startBlock = this.startNode.closestOperableBlock();\n if (startBlock.isTable) {\n return [];\n }\n return startBlock.isInside ? [ startBlock ] : [];\n }\n const startBlock = this.startNode.closestOperableBlock();\n const endBlock = this.endNode.closestOperableBlock();\n if (\n startBlock.isInside &&\n startBlock.get(0) &&\n startBlock.get(0) === endBlock.get(0)\n ) {\n return startBlock.isTable ? [] : [ startBlock ];\n }\n const blocks: Nodes[] = [];\n const clonedRange = this.clone();\n clonedRange.collapseToEnd();\n for (const child of this.commonAncestor.getWalker()) {\n if (child.isBlock && !child.isTable && child.isTopInside &&\n // the range doesn't end at the start of a block\n clonedRange.comparePoint(child, 0) !== 0 &&\n this.intersectsNode(child)\n ) {\n blocks.push(child);\n }\n }\n if (blocks.length > 0) {\n return blocks;\n }\n for (const child of this.commonAncestor.getWalker()) {\n if (child.isBlock && !child.isTable &&\n (startBlock.isSibling(child) || endBlock.isSibling(child)) &&\n this.intersectsNode(child)) {\n blocks.push(child);\n }\n }\n return blocks;\n }\n\n // Returns target marks and text nodes relating to the range.\n public getMarks(hasText = false): Nodes[] {\n const marks: Nodes[] = [];\n if (this.commonAncestor.isText && hasText) {\n if (\n this.startOffset === 0 &&\n this.endOffset === this.commonAncestor.text().length\n ) {\n marks.push(this.commonAncestor);\n return marks;\n }\n }\n const stratRange = this.clone();\n stratRange.collapseToStart();\n const endRange = this.clone();\n endRange.collapseToEnd();\n for (const node of this.commonAncestor.getWalker()) {\n const targetRange = document.createRange();\n targetRange.setStartAfter(node.get(0));\n targetRange.collapse(true);\n if (endRange.compareBeforeNode(node) >= 0) {\n break;\n }\n if (stratRange.compareAfterNode(node) > 0) {\n if (node.isMark) {\n marks.push(node);\n } else if (node.isText && hasText) {\n marks.push(node);\n }\n }\n }\n return marks;\n }\n\n // Returns the text of the left part of the closest block divided into two parts by the start point of the range.\n // \"<p>one<anchor />two<focus />three</p>\" returns \"three\".\n public getLeftText(): string {\n const node = this.startNode;\n const offset = this.startOffset;\n let block = node.closestBlock();\n if (block.isOutside) {\n block = node.closestContainer();\n }\n if (block.length === 0) {\n return '';\n }\n const leftRange = new Range();\n leftRange.setStartBefore(block);\n leftRange.setEnd(node, offset);\n const container = query('<div />');\n container.append(leftRange.cloneContents());\n const text = container.text();\n if (text === '' && container.find('lake-box').length > 0) {\n return '\\u200B';\n }\n return text;\n }\n\n // Returns the text of the right part of the closest block divided into two parts by the end point of the range.\n // \"<p>one<anchor />two<focus />three</p>\" returns \"three\".\n public getRightText(): string {\n const node = this.endNode;\n const offset = this.endOffset;\n let block = node.closestBlock();\n if (block.isOutside) {\n block = node.closestContainer();\n }\n if (block.length === 0) {\n return '';\n }\n const rightRange = new Range();\n rightRange.setStart(node, offset);\n rightRange.setEndAfter(block);\n const container = query('<div />');\n container.append(rightRange.cloneContents());\n const text = container.text();\n if (text === '' && container.find('lake-box').length > 0) {\n return '\\u200B';\n }\n return text;\n }\n\n // Returns a range object with boundary points identical to the cloned range.\n public clone(): Range {\n return new Range(this.range.cloneRange());\n }\n\n // Returns a document fragment copying the nodes included in the range.\n public cloneContents(): DocumentFragment {\n return this.range.cloneContents();\n }\n\n // Prints information of the range.\n public debug(): void {\n debug('--- range information ---');\n debug('start node:', this.startNode.toString(), ', offset:', this.startOffset);\n debug('end node:', this.endNode.toString(), ', offset:', this.endOffset);\n }\n}\n","import type { Nodes } from '../models/nodes';\nimport { Range } from '../models/range';\n\n// Splits nodes upwards according to the position until a limiting element is encountered.\n// Case 1:\n// <p><strong><i>foo|bar</i></strong></p>\n// to\n// <p><strong><i>foo</i></strong>|<strong><i>bar</i></strong></p>\n//\n// Case 2:\n// <p><strong>beginning<i>one|two</i>end</strong></p>\n// to\n// <p><strong>beginning<i>one</i></strong>|<strong><i>two</i>end</strong></p>\nexport function splitNodes(node: Nodes, offset: number, limitNode: Nodes): { left: Nodes, right: Nodes } | null {\n const range = new Range();\n let parent;\n if (node.isText) {\n parent = node.parent();\n const newNode = node.splitText(offset);\n range.setStartAfter(node);\n if (node.text() === '') {\n node.remove();\n }\n if (newNode.text() === '') {\n newNode.remove();\n }\n } else {\n range.setStart(node, offset);\n parent = node;\n }\n if (parent.name === 'body' || parent.name === 'html') {\n return null;\n }\n if (parent.get(0) === limitNode.get(0)) {\n return null;\n }\n range.collapseToStart();\n const leftPart = parent.clone();\n let child = parent.first();\n while (child.length > 0) {\n if (range.compareBeforeNode(child) >= 0) {\n break;\n }\n const nextNode = child.next();\n leftPart.append(child);\n child = nextNode;\n }\n parent.before(leftPart);\n if (parent.parent().length > 0 && parent.parent().get(0) !== limitNode.get(0)) {\n return splitNodes(parent.parent(), parent.index(), limitNode);\n }\n return {\n left: leftPart,\n right: parent,\n };\n}\n","import type { Nodes } from '../models/nodes';\n\n// Appends a node to the deepest element of the specified element.\nexport function appendDeepest(element: Nodes, node: Nodes): void {\n let child = element;\n while (child.length > 0) {\n let firstChild = child.first();\n while (firstChild.isText && firstChild.isEmpty) {\n firstChild = firstChild.next();\n }\n if (child.isText || child.isBox) {\n break;\n }\n if (child.isElement && child.children().length === 1 && firstChild.isBookmark) {\n child.prepend(node);\n break;\n }\n if (child.isElement && !child.isVoid && firstChild.length === 0) {\n child.append(node);\n break;\n }\n child = firstChild;\n }\n}\n","import type { Nodes } from '../models/nodes';\n\n// Removes The <br /> element in the specified block which is empty.\nexport function removeBr(block: Nodes): void {\n if (block.length === 0) {\n return;\n }\n const nodeList: Nodes[] = [];\n let child = block.first();\n while (child.length > 0) {\n const nextNode = child.next();\n if (!child.isText || child.text() !== '') {\n nodeList.push(child);\n }\n child = nextNode;\n }\n if (\n nodeList.length === 1 &&nodeList[0].name === 'br' ||\n nodeList.length === 2 && nodeList[0].name === 'br' && nodeList[1].isBookmark\n ) {\n nodeList[0].remove();\n }\n if (nodeList.length === 2 && nodeList[0].isBookmark && nodeList[1].name === 'br') {\n nodeList[1].remove();\n }\n}\n","import type { Nodes } from '../models/nodes';\nimport { Range } from '../models/range';\nimport { appendDeepest } from './append-deepest';\nimport { query } from './query';\nimport { removeBr } from './remove-br';\n\n// Returns a point after the specified node.\nfunction getAfterPoint(node: Nodes): { node: Nodes, offset: number } {\n if (node.isText) {\n return {\n node,\n offset: node.text().length,\n };\n }\n const range = new Range();\n range.setEndAfter(node);\n return {\n node: range.endNode,\n offset: range.endOffset,\n };\n}\n\n// Merges two nodes into one node.\n// Case 1:\n// <p><strong><i>foo</i></strong></p>\n// <p>|bar</p>\n// to\n// <p><strong><i>foo</i></strong>|bar</p>\n//\n// Case 2:\n// <p><strong><i>foo</i></strong></p>\n// <p>|<strong><i>bar</i></strong></p>\n// to\n// <p><strong><i>foo|bar</i></strong></p>\nexport function mergeNodes(node: Nodes, otherNode: Nodes): { node: Nodes, offset: number } {\n const originalOtherNode = otherNode;\n if (['ul', 'ol'].indexOf(node.name) >= 0) {\n const list = node.find('li');\n node = list.eq(list.length - 1);\n }\n if (['ul', 'ol'].indexOf(otherNode.name) >= 0) {\n const list = otherNode.find('li');\n otherNode = list.eq(0);\n }\n if (node.isText || otherNode.isText || node.isVoid || otherNode.isVoid) {\n return getAfterPoint(node);\n }\n removeBr(node);\n removeBr(otherNode);\n if (node.isBlock && node.isEmpty && otherNode.isEmpty) {\n appendDeepest(node, query('<br />'));\n }\n const nextNode = node.last();\n const nextOtherNode = otherNode.first();\n let child = nextOtherNode;\n while (child.length > 0) {\n const next = child.next();\n node.append(child);\n child = next;\n }\n originalOtherNode.remove();\n if (\n nextNode.length > 0 &&\n nextOtherNode.length > 0 &&\n nextNode.isElement &&\n !nextNode.isBox &&\n nextNode.clone(false).get(0).isEqualNode(nextOtherNode.clone(false).get(0))\n ) {\n return mergeNodes(nextNode, nextOtherNode);\n }\n if (nextNode.length === 0) {\n return {\n node,\n offset: 0,\n };\n }\n return getAfterPoint(nextNode);\n}\n","import type { Nodes } from '../models/nodes';\n\n// Returns the deepest element of the specified element.\nexport function getDeepest(element: Nodes): Nodes {\n let child = element;\n while (child.length > 0) {\n let firstChild = child.first();\n if (firstChild.isText && firstChild.isEmpty) {\n firstChild = firstChild.next();\n }\n if (child.isElement && !child.isVoid && firstChild.length === 0) {\n break;\n }\n child = firstChild;\n }\n return child;\n}\n","import type { Nodes } from '../models/nodes';\nimport { getDeepest } from './get-deepest';\nimport { query } from './query';\n\nexport function wrapNodeList(nodeList: Nodes[], wrapper?: Nodes): Nodes {\n wrapper = wrapper ?? query('<p />');\n if (nodeList.length === 0) {\n return wrapper;\n }\n wrapper = wrapper.clone(true);\n const deepestElement = getDeepest(wrapper);\n nodeList[0].before(wrapper);\n nodeList.forEach(node => {\n deepestElement.append(node);\n });\n return wrapper;\n}\n","import type { Nodes } from '../models/nodes';\n\n// Removes Zero-width spaces that are dependent on some other text nodes.\nexport function removeZWS(node: Nodes): void {\n for (const child of node.getWalker()) {\n if (child.isText && child.text().length > 1) {\n const nodeValue = child.text();\n if (/\\u200B/.test(child.text())) {\n child.get(0).nodeValue = nodeValue.replace(/\\u200B/g, '');\n }\n }\n }\n}\n","import type { Nodes } from '../models/nodes';\nimport { query } from './query';\nimport { safeTemplate } from './safe-template';\n\nexport function changeTagName(element: Nodes, newTagName: string): Nodes {\n const nativeElement = element.get(0) as Element;\n const newElement = query(safeTemplate`<${newTagName} />`);\n for (const attr of nativeElement.attributes) {\n newElement.attr(attr.name, attr.value);\n }\n let child = element.first();\n while(child.length > 0) {\n const nextNode = child.next();\n newElement.append(child);\n child = nextNode;\n }\n element.replaceWith(newElement);\n return newElement;\n}\n","import type { Nodes } from '../models/nodes';\n\nexport function fixNumberedList(blocks: Nodes[]): void {\n if (blocks.length === 0) {\n return;\n }\n const firstBlock = blocks[0];\n const lastBlock = blocks[blocks.length - 1];\n const targetBlocks: Nodes[] = [];\n // to find all numbered list before current blocks\n let prevNode = firstBlock.prev();\n while (prevNode.length > 0) {\n if (prevNode.name !== 'ol') {\n break;\n }\n targetBlocks.push(prevNode);\n prevNode = prevNode.prev();\n }\n targetBlocks.reverse();\n targetBlocks.push(...blocks);\n // to find all numbered list after current blocks\n let nextNode = lastBlock.next();\n while (nextNode.length > 0) {\n if (nextNode.name !== 'ol') {\n break;\n }\n targetBlocks.push(nextNode);\n nextNode = nextNode.next();\n }\n // to reset start number\n let index = 1;\n for (const block of targetBlocks) {\n const prev = block.prev();\n if (prev.length === 0 || prev.name !== 'ol') {\n index = 1;\n }\n if (block.name === 'ol') {\n if (prev.name === 'ol' && prev.attr('indent') !== block.attr('indent')) {\n index = 1;\n }\n const currentStart = block.attr('start');\n const expectedStart = index.toString(10);\n if (currentStart !== expectedStart) {\n block.attr('start', expectedStart);\n }\n index++;\n }\n }\n}\n","import type { Nodes } from '../models/nodes';\nimport { fixNumberedList } from './fix-numbered-list';\n\nexport function setBlockIndent(block: Nodes, type: 'increase' | 'decrease'): void {\n if (block.isList) {\n let indent = Number.parseInt(block.attr('indent'), 10) || 0;\n if (type === 'increase') {\n indent++;\n } else {\n indent--;\n }\n if (indent <= 0) {\n indent = 0;\n } else if (indent > 10) {\n return;\n }\n if (indent === 0) {\n block.removeAttr('indent');\n } else {\n block.attr('indent', indent.toString(10));\n }\n fixNumberedList([ block ]);\n return;\n }\n let value = Number.parseInt(block.css('margin-left'), 10) || 0;\n if (type === 'decrease' && value === 0 && block.css('text-indent') !== '') {\n block.css('text-indent', '');\n return;\n }\n if (type === 'increase') {\n value += 40;\n } else {\n value -= 40;\n }\n if (value <= 0) {\n value = 0;\n }\n if (value === 0) {\n block.css('margin-left', '');\n } else {\n block.css('margin-left', `${value}px`);\n }\n}\n","/**\nBSD 2-Clause License\n\nCopyright (c) 2022, Big Sky Software\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n1. Redistributions of source code must retain the above copyright notice, this\n list of conditions and the following disclaimer.\n\n2. Redistributions in binary form must reproduce the above copyright notice,\n this list of conditions and the following disclaimer in the documentation\n and/or other materials provided with the distribution.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\nRepository: https://github.com/bigskysoftware/idiomorph\n*/\n\n/* eslint-disable no-throw-literal */\n/* eslint-disable no-use-before-define */\n/* eslint-disable no-continue */\n\nimport type { Nodes } from '../models/nodes';\n\ndeclare global {\n interface Node {\n generatedByIdiomorph: boolean;\n }\n}\n\ndeclare type configType = {\n morphStyle?: 'innerHTML' | 'outerHTML';\n ignoreActive?: boolean;\n ignoreActiveValue?: boolean;\n head?: {\n style?: 'merge' | 'append' | 'morph' | 'none';\n };\n callbacks?: {\n beforeNodeAdded?: (node: Node) => void | boolean;\n afterNodeAdded?: (node: Node) => void;\n beforeNodeMorphed?: (oldNode: Node, newNode: Node) => void | boolean;\n afterNodeMorphed?: (oldNode: Node, newNode: Node) => void;\n beforeNodeRemoved?: (node: Node) => void | boolean;\n afterNodeRemoved?: (node: Node) => void;\n beforeAttributeUpdated?: (attributeName: string, node: Node, mutationType: string) => void | boolean;\n afterAttributeUpdated?: (attributeName: string, node: Node, mutationType: string) => void;\n beforeChildrenUpdated?: (oldNode: Node, newNode: Node) => void | boolean;\n };\n};\n\ntype KeyValue = { [key: string]: any };\n\nconst EMPTY_SET = new Set();\n\nfunction noOp() {}\n\n// default configuration values, updatable by users now\nconst defaults = {\n morphStyle: 'outerHTML',\n callbacks: {\n beforeNodeAdded: noOp,\n afterNodeAdded: noOp,\n beforeNodeMorphed: noOp,\n afterNodeMorphed: noOp,\n beforeNodeRemoved: noOp,\n afterNodeRemoved: noOp,\n beforeAttributeUpdated: noOp,\n afterAttributeUpdated: noOp,\n beforeChildrenUpdated: noOp,\n\n },\n head: {\n style: 'merge',\n shouldPreserve: (elt: Element) => elt.getAttribute('im-preserve') === 'true',\n shouldReAppend: (elt: Element) => elt.getAttribute('im-re-append') === 'true',\n shouldRemove: noOp,\n afterHeadMorphed: noOp,\n },\n};\n\n/*\n Deep merges the config object and the Idiomoroph.defaults object to\n produce a final configuration object\n */\nfunction mergeDefaults(config: KeyValue) {\n const finalConfig: KeyValue = {};\n // copy top level stuff into final config\n Object.assign(finalConfig, defaults);\n Object.assign(finalConfig, config);\n\n // copy callbacks into final config (do this to deep merge the callbacks)\n finalConfig.callbacks = {};\n Object.assign(finalConfig.callbacks, defaults.callbacks);\n Object.assign(finalConfig.callbacks, config.callbacks);\n\n // copy head config into final config (do this to deep merge the head)\n finalConfig.head = {};\n Object.assign(finalConfig.head, defaults.head);\n Object.assign(finalConfig.head, config.head);\n return finalConfig;\n}\n\n// =============================================================================\n// ID Set Functions\n// =============================================================================\n\nfunction isIdInConsideration(ctx: KeyValue, id: string) {\n return !ctx.deadIds.has(id);\n}\n\nfunction idIsWithinNode(ctx: KeyValue, id: string, targetNode: Node) {\n const idSet = ctx.idMap.get(targetNode) || EMPTY_SET;\n return idSet.has(id);\n}\n\nfunction removeIdsFromConsideration(ctx: KeyValue, node: Node) {\n const idSet = ctx.idMap.get(node) || EMPTY_SET;\n for (const id of idSet) {\n ctx.deadIds.add(id);\n }\n}\n\nfunction getIdIntersectionCount(ctx: KeyValue, node1: Node, node2: Node) {\n const sourceSet = ctx.idMap.get(node1) || EMPTY_SET;\n let matchCount = 0;\n for (const id of sourceSet) {\n // a potential match is an id in the source and potentialIdsSet, but\n // that has not already been merged into the DOM\n if (isIdInConsideration(ctx, id) && idIsWithinNode(ctx, id, node2)) {\n ++matchCount;\n }\n }\n return matchCount;\n}\n\n/**\n * A bottom up algorithm that finds all elements with ids inside of the node\n * argument and populates id sets for those nodes and all their parents, generating\n * a set of ids contained within all nodes for the entire hierarchy in the DOM\n *\n * @param node {Element}\n * @param {Map<Node, Set<String>>} idMap\n */\nfunction populateIdMapForNode(node: Element, idMap: Map<Node, Set<string>>) {\n const nodeParent = node.parentElement;\n // find all elements with an id property\n const idElements = node.querySelectorAll('[id]');\n for (const elt of idElements) {\n let current: Element | null = elt;\n // walk up the parent hierarchy of that element, adding the id\n // of element to the parent's id set\n while (current !== nodeParent && current != null) {\n let idSet = idMap.get(current);\n // if the id set does not exist, create it and insert it in the map\n if (idSet == null) {\n idSet = new Set();\n idMap.set(current, idSet);\n }\n idSet.add(elt.id);\n current = current.parentElement;\n }\n }\n}\n\n/**\n * This function computes a map of nodes to all ids contained within that node (inclusive of the\n * node). This map can be used to ask if two nodes have intersecting sets of ids, which allows\n * for a looser definition of \"matching\" than tradition id matching, and allows child nodes\n * to contribute to a parent nodes matching.\n *\n * @param {Element} oldContent the old content that will be morphed\n * @param {Element} newContent the new content to morph to\n * @returns {Map<Node, Set<String>>} a map of nodes to id sets for the\n */\nfunction createIdMap(oldContent: Element, newContent: Element) {\n const idMap = new Map();\n populateIdMapForNode(oldContent, idMap);\n populateIdMapForNode(newContent, idMap);\n return idMap;\n}\n\nfunction createMorphContext(oldNode: Element, newContent: Element, config: KeyValue) {\n config = mergeDefaults(config);\n return {\n target: oldNode,\n newContent,\n config,\n morphStyle: config.morphStyle,\n ignoreActive: config.ignoreActive,\n ignoreActiveValue: config.ignoreActiveValue,\n idMap: createIdMap(oldNode, newContent),\n deadIds: new Set(),\n callbacks: config.callbacks,\n head: config.head,\n };\n}\n\nfunction isIdSetMatch(node1: Element, node2: Element, ctx: KeyValue) {\n if (node1 == null || node2 == null) {\n return false;\n }\n if (node1.nodeType === node2.nodeType && node1.tagName === node2.tagName) {\n if (node1.id !== '' && node1.id === node2.id) {\n return true;\n }\n return getIdIntersectionCount(ctx, node1, node2) > 0;\n }\n return false;\n}\n\nfunction isSoftMatch(node1: Element, node2: Element) {\n if (node1 == null || node2 == null) {\n return false;\n }\n return node1.nodeType === node2.nodeType && node1.tagName === node2.tagName;\n}\n\nfunction removeNode(tempNode: Node, ctx: KeyValue) {\n removeIdsFromConsideration(ctx, tempNode);\n if (ctx.callbacks.beforeNodeRemoved(tempNode) === false) return;\n\n (tempNode as Element).remove();\n ctx.callbacks.afterNodeRemoved(tempNode);\n}\n\nfunction removeNodesBetween(startInclusive: Node, endExclusive: Node, ctx: KeyValue) {\n let start: Node | null = startInclusive;\n while (start && start !== endExclusive) {\n const tempNode = start;\n start = start.nextSibling;\n removeNode(tempNode, ctx);\n }\n removeIdsFromConsideration(ctx, endExclusive);\n return endExclusive.nextSibling;\n}\n\n// =============================================================================\n// Scans forward from the insertionPoint in the old parent looking for a potential id match\n// for the newChild. We stop if we find a potential id match for the new child OR\n// if the number of potential id matches we are discarding is greater than the\n// potential id matches for the new child\n// =============================================================================\nfunction findIdSetMatch(newContent: Element, oldParent: Element, newChild: Element, insertionPoint: Node, ctx: KeyValue) {\n\n // max id matches we are willing to discard in our search\n const newChildPotentialIdCount = getIdIntersectionCount(ctx, newChild, oldParent);\n\n let potentialMatch = null;\n\n // only search forward if there is a possibility of an id match\n if (newChildPotentialIdCount > 0) {\n potentialMatch = insertionPoint;\n // if there is a possibility of an id match, scan forward\n // keep track of the potential id match count we are discarding (the\n // newChildPotentialIdCount must be greater than this to make it likely\n // worth it)\n let otherMatchCount = 0;\n while (potentialMatch != null) {\n\n // If we have an id match, return the current potential match\n if (isIdSetMatch(newChild, potentialMatch as Element, ctx)) {\n return potentialMatch;\n }\n\n // computer the other potential matches of this new content\n otherMatchCount += getIdIntersectionCount(ctx, potentialMatch, newContent);\n if (otherMatchCount > newChildPotentialIdCount) {\n // if we have more potential id matches in _other_ content, we\n // do not have a good candidate for an id match, so return null\n return null;\n }\n\n // advanced to the next old content child\n potentialMatch = potentialMatch.nextSibling;\n }\n }\n return potentialMatch;\n}\n\n// =============================================================================\n// Scans forward from the insertionPoint in the old parent looking for a potential soft match\n// for the newChild. We stop if we find a potential soft match for the new child OR\n// if we find a potential id match in the old parents children OR if we find two\n// potential soft matches for the next two pieces of new content\n// =============================================================================\nfunction findSoftMatch(newContent: Element, oldParent: Element, newChild: Node, insertionPoint: Node, ctx: KeyValue) {\n\n let potentialSoftMatch: Node | null = insertionPoint;\n let nextSibling = newChild.nextSibling;\n let siblingSoftMatchCount = 0;\n\n while (potentialSoftMatch != null) {\n\n if (getIdIntersectionCount(ctx, potentialSoftMatch, newContent) > 0) {\n // the current potential soft match has a potential id set match with the remaining new\n // content so bail out of looking\n return null;\n }\n\n // if we have a soft match with the current node, return it\n if (isSoftMatch(newChild as Element, potentialSoftMatch as Element)) {\n return potentialSoftMatch;\n }\n\n if (isSoftMatch(nextSibling as Element, potentialSoftMatch as Element)) {\n // the next new node has a soft match with this node, so\n // increment the count of future soft matches\n siblingSoftMatchCount++;\n nextSibling = nextSibling ? nextSibling.nextSibling : null;\n\n // If there are two future soft matches, bail to allow the siblings to soft match\n // so that we don't consume future soft matches for the sake of the current node\n if (siblingSoftMatchCount >= 2) {\n return null;\n }\n }\n\n // advanced to the next old content child\n potentialSoftMatch = potentialSoftMatch ? potentialSoftMatch.nextSibling : null;\n }\n\n return potentialSoftMatch;\n}\n\nfunction normalizeContent(newContent: Node[] | Node | null) {\n if (newContent == null) {\n // noinspection UnnecessaryLocalVariableJS\n const dummyParent = document.createElement('div');\n return dummyParent;\n }\n if (newContent instanceof Node) {\n if (newContent.generatedByIdiomorph) {\n // the template tag created by idiomorph parsing can serve as a dummy parent\n return newContent;\n }\n // a single node is added as a child to a dummy parent\n const dummyParent = document.createElement('div');\n dummyParent.append(newContent);\n return dummyParent;\n }\n // all nodes in the array or HTMLElement collection are consolidated under\n // a single dummy parent element\n const dummyParent = document.createElement('div');\n for (const elt of [...newContent]) {\n dummyParent.append(elt);\n }\n return dummyParent;\n}\n\nfunction insertSiblings(previousSibling: Node, morphedNode: Node, nextSibling: Node) {\n const stack = [];\n const added = [];\n let prev: Node | null = previousSibling;\n while (prev != null) {\n stack.push(prev);\n prev = prev.previousSibling;\n }\n while (stack.length > 0) {\n const node = stack.pop();\n added.push(node); // push added preceding siblings on in order and insert\n if (node) {\n morphedNode.parentElement?.insertBefore(node, morphedNode);\n }\n }\n added.push(morphedNode);\n let next: Node | null = nextSibling;\n while (next != null) {\n stack.push(next);\n added.push(next); // here we are going in order, so push on as we scan, rather than add\n next = next.nextSibling;\n }\n while (stack.length > 0) {\n const node = stack.pop();\n if (node) {\n morphedNode.parentElement?.insertBefore(node, morphedNode.nextSibling);\n }\n }\n return added;\n}\n\nfunction scoreElement(node1: Node, node2: Node, ctx: KeyValue) {\n if (isSoftMatch(node1 as Element, node2 as Element)) {\n return .5 + getIdIntersectionCount(ctx, node1, node2);\n }\n return 0;\n}\n\nfunction findBestNodeMatch(newContent: Node, oldNode: Node, ctx: KeyValue) {\n let currentElement;\n currentElement = newContent.firstChild;\n let bestElement = currentElement;\n let score = 0;\n while (currentElement) {\n const newScore = scoreElement(currentElement, oldNode, ctx);\n if (newScore > score) {\n bestElement = currentElement;\n score = newScore;\n }\n currentElement = currentElement.nextSibling;\n }\n return bestElement;\n}\n\n// =============================================================================\n// Attribute Syncing Code\n// =============================================================================\n\n/*\n * @param attr {String} the attribute to be mutated\n * @param to {Element} the element that is going to be updated\n * @param updateType {(\"update\"|\"remove\")}\n * @param ctx the merge context\n * @returns {boolean} true if the attribute should be ignored, false otherwise\n */\nfunction ignoreAttribute(attr: string, to: Element, updateType: string, ctx: KeyValue) {\n if (attr === 'value' && ctx.ignoreActiveValue && to === document.activeElement) {\n return true;\n }\n return ctx.callbacks.beforeAttributeUpdated(attr, to, updateType) === false;\n}\n\n/**\n * @param possibleActiveElement\n * @param ctx\n * @returns {boolean}\n */\nfunction ignoreValueOfActiveElement(possibleActiveElement: Node, ctx: KeyValue) {\n return ctx.ignoreActiveValue && possibleActiveElement === document.activeElement;\n}\n\n/**\n * syncs a given node with another node, copying over all attributes and\n * inner element state from the 'from' node to the 'to' node\n *\n * @param {Element} from the element to copy attributes & state from\n * @param {Element} to the element to copy attributes & state to\n * @param ctx the merge context\n */\nfunction syncNodeFrom(from: Element, to: Element, ctx: KeyValue) {\n const type = from.nodeType;\n\n // if is an element type, sync the attributes from the\n // new node into the new node\n if (type === 1 /* element type */) {\n const fromAttributes = from.attributes;\n const toAttributes = to.attributes;\n for (const fromAttribute of fromAttributes) {\n if (ignoreAttribute(fromAttribute.name, to, 'update', ctx)) {\n continue;\n }\n if (to.getAttribute(fromAttribute.name) !== fromAttribute.value) {\n to.setAttribute(fromAttribute.name, fromAttribute.value);\n ctx.callbacks.afterAttributeUpdated(fromAttribute.name, to, 'update');\n }\n }\n // iterate backwards to avoid skipping over items when a delete occurs\n for (let i = toAttributes.length - 1; i >= 0; i--) {\n const toAttribute = toAttributes[i];\n if (ignoreAttribute(toAttribute.name, to, 'remove', ctx)) {\n continue;\n }\n if (!from.hasAttribute(toAttribute.name)) {\n to.removeAttribute(toAttribute.name);\n ctx.callbacks.afterAttributeUpdated(toAttribute.name, to, 'remove');\n }\n }\n }\n // sync text nodes\n if (type === 8 /* comment */ || type === 3 /* text */) {\n if (to.nodeValue !== from.nodeValue) {\n to.nodeValue = from.nodeValue;\n }\n }\n}\n\n/**\n * @param oldNode root node to merge content into\n * @param newContent new content to merge\n * @param ctx the merge context\n * @returns {Element} the element that ended up in the DOM\n */\nfunction morphOldNodeTo(oldNode: Node, newContent: Node, ctx: KeyValue) {\n if (ctx.ignoreActive && oldNode === document.activeElement) {\n // don't morph focused element\n } else if (newContent == null) {\n if (ctx.callbacks.beforeNodeRemoved(oldNode) === false) return oldNode;\n\n (oldNode as Element).remove();\n ctx.callbacks.afterNodeRemoved(oldNode);\n return null;\n } else if (!isSoftMatch(oldNode as Element, newContent as Element)) {\n if (ctx.callbacks.beforeNodeRemoved(oldNode) === false) return oldNode;\n if (ctx.callbacks.beforeNodeAdded(newContent) === false) return oldNode;\n\n oldNode.parentElement?.replaceChild(newContent, oldNode);\n ctx.callbacks.afterNodeAdded(newContent);\n ctx.callbacks.afterNodeRemoved(oldNode);\n return newContent;\n } else {\n if (ctx.callbacks.beforeNodeMorphed(oldNode, newContent) === false) return oldNode;\n syncNodeFrom(newContent as Element, oldNode as Element, ctx);\n if (ctx.callbacks.beforeChildrenUpdated(oldNode, newContent) !== false && !ignoreValueOfActiveElement(oldNode, ctx)) {\n morphChildren(newContent, oldNode, ctx);\n }\n ctx.callbacks.afterNodeMorphed(oldNode, newContent);\n return oldNode;\n }\n}\n\n/**\n * This is the core algorithm for matching up children. The idea is to use id sets to try to match up\n * nodes as faithfully as possible. We greedily match, which allows us to keep the algorithm fast, but\n * by using id sets, we are able to better match up with content deeper in the DOM.\n *\n * Basic algorithm is, for each node in the new content:\n *\n * - if we have reached the end of the old parent, append the new content\n * - if the new content has an id set match with the current insertion point, morph\n * - search for an id set match\n * - if id set match found, morph\n * - otherwise search for a \"soft\" match\n * - if a soft match is found, morph\n * - otherwise, prepend the new node before the current insertion point\n *\n * The two search algorithms terminate if competing node matches appear to outweigh what can be achieved\n * with the current node. See findIdSetMatch() and findSoftMatch() for details.\n *\n * @param {Element} newParent the parent element of the new content\n * @param {Element } oldParent the old content that we are merging the new content into\n * @param ctx the merge context\n */\nfunction morphChildren(newParent: Node, oldParent: Node, ctx: KeyValue) {\n\n let nextNewChild = newParent.firstChild;\n let insertionPoint = oldParent.firstChild;\n let newChild;\n\n // run through all the new content\n while (nextNewChild) {\n\n newChild = nextNewChild;\n nextNewChild = newChild.nextSibling;\n\n // if we are at the end of the exiting parent's children, just append\n if (insertionPoint == null) {\n if (ctx.callbacks.beforeNodeAdded(newChild) === false) return;\n\n oldParent.appendChild(newChild);\n ctx.callbacks.afterNodeAdded(newChild);\n removeIdsFromConsideration(ctx, newChild);\n continue;\n }\n\n // if the current node has an id set match then morph\n if (isIdSetMatch(newChild as Element, insertionPoint as Element, ctx)) {\n morphOldNodeTo(insertionPoint, newChild, ctx);\n insertionPoint = insertionPoint.nextSibling;\n removeIdsFromConsideration(ctx, newChild);\n continue;\n }\n\n // otherwise search forward in the existing old children for an id set match\n const idSetMatch = findIdSetMatch(newParent as Element, oldParent as Element, newChild as Element, insertionPoint, ctx);\n\n // if we found a potential match, remove the nodes until that point and morph\n if (idSetMatch) {\n insertionPoint = removeNodesBetween(insertionPoint, idSetMatch, ctx);\n morphOldNodeTo(idSetMatch, newChild, ctx);\n removeIdsFromConsideration(ctx, newChild);\n continue;\n }\n\n // no id set match found, so scan forward for a soft match for the current node\n const softMatch = findSoftMatch(newParent as Element, oldParent as Element, newChild, insertionPoint, ctx);\n\n // if we found a soft match for the current node, morph\n if (softMatch) {\n insertionPoint = removeNodesBetween(insertionPoint, softMatch, ctx);\n morphOldNodeTo(softMatch, newChild, ctx);\n removeIdsFromConsideration(ctx, newChild);\n continue;\n }\n\n // abandon all hope of morphing, just insert the new child before the insertion point\n // and move on\n if (ctx.callbacks.beforeNodeAdded(newChild) === false) return;\n\n oldParent.insertBefore(newChild, insertionPoint);\n ctx.callbacks.afterNodeAdded(newChild);\n removeIdsFromConsideration(ctx, newChild);\n }\n\n // remove any remaining old nodes that didn't match up with new content\n while (insertionPoint !== null) {\n\n const tempNode = insertionPoint;\n insertionPoint = insertionPoint.nextSibling;\n removeNode(tempNode, ctx);\n }\n}\n\nfunction morphNormalizedContent(oldNode: Element, normalizedNewContent: Element, ctx: KeyValue) {\n if (ctx.morphStyle === 'innerHTML') {\n\n // innerHTML, so we are only updating the children\n morphChildren(normalizedNewContent, oldNode, ctx);\n return oldNode.children;\n\n }\n if (ctx.morphStyle === 'outerHTML' || ctx.morphStyle == null) {\n // otherwise find the best element match in the new content, morph that, and merge its siblings\n // into either side of the best match\n const bestMatch = findBestNodeMatch(normalizedNewContent, oldNode, ctx);\n\n // stash the siblings that will need to be inserted on either side of the best match\n const previousSibling = bestMatch?.previousSibling;\n const nextSibling = bestMatch?.nextSibling;\n\n // morph it\n const morphedNode = morphOldNodeTo(oldNode, bestMatch as Node, ctx);\n\n if (bestMatch) {\n // if there was a best match, merge the siblings in too and return the\n // whole bunch\n return insertSiblings(previousSibling as Node, morphedNode as Node, nextSibling as Node);\n }\n // otherwise nothing was added to the DOM\n return [];\n }\n throw `Do not understand how to morph style ${ ctx.morphStyle}`;\n}\n\n// =============================================================================\n// Core Morphing Algorithm - morph, morphNormalizedContent, morphOldNodeTo, morphChildren\n// =============================================================================\nexport function morph(node: Nodes, otherNode: Nodes, config: configType = {}): void {\n const normalizedContent = normalizeContent(otherNode.get(0)) as Element;\n const ctx = createMorphContext(node.get(0) as Element, normalizedContent, config);\n morphNormalizedContent(node.get(0) as Element, normalizedContent, ctx);\n}\n","/**\nThe MIT License (MIT)\n\nCopyright (c) 2016-present react-component\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\nOR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nRepository: https://github.com/react-component/upload\n*/\n\nimport { UploadRequestError, UploadRequestOption } from '../types/request';\n\nfunction getError(option: UploadRequestOption, xhr: XMLHttpRequest) {\n const msg = `Cannot ${option.method} ${option.action} ${xhr.status}'`;\n const err = new Error(msg) as UploadRequestError;\n err.status = xhr.status;\n err.method = option.method;\n err.url = option.action;\n return err;\n}\n\nfunction getBody(xhr: XMLHttpRequest) {\n const text = xhr.responseText || xhr.response;\n if (!text) {\n return text;\n }\n\n try {\n return JSON.parse(text);\n } catch (e) {\n return text;\n }\n}\n\nexport function request(option: UploadRequestOption): XMLHttpRequest {\n const xhr = new XMLHttpRequest();\n\n if (option.onProgress && xhr.upload) {\n xhr.upload.onprogress = (e) => {\n if (e.total > 0) {\n e.percent = (e.loaded / e.total) * 100;\n }\n if (option.onProgress) {\n option.onProgress(e);\n }\n };\n }\n\n const formData = new FormData();\n\n const data = option.data || {};\n Object.keys(data).forEach(key => {\n const value = data[key];\n // support key-value array data\n if (Array.isArray(value)) {\n value.forEach(item => {\n // { list: [ 11, 22 ] }\n // formData.append('list[]', 11);\n formData.append(`${key}[]`, item);\n });\n return;\n }\n\n formData.append(key, value as string | Blob);\n });\n\n const filename = option.filename || 'file';\n if (option.file instanceof Blob) {\n formData.append(filename, option.file, (option.file as any).name);\n } else {\n formData.append(filename, option.file);\n }\n\n xhr.onerror = (e) => {\n if (option.onError) {\n option.onError(e);\n }\n };\n\n xhr.onload = () => {\n // allow success when 2xx status\n // see https://github.com/react-component/upload/issues/34\n if (xhr.status < 200 || xhr.status >= 300) {\n if (!option.onError) {\n return;\n }\n return option.onError(getError(option, xhr), getBody(xhr));\n }\n if (!option.onSuccess) {\n return;\n }\n return option.onSuccess(getBody(xhr), xhr);\n };\n\n xhr.open(option.method, option.action, true);\n\n // Has to be after `.open()`. See https://github.com/enyo/dropzone/issues/179\n if (option.withCredentials && 'withCredentials' in xhr) {\n xhr.withCredentials = true;\n }\n\n const headers = option.headers || {};\n\n // when set headers['X-Requested-With'] = null , can close default XHR header\n // see https://github.com/react-component/upload/issues/33\n if (headers['X-Requested-With'] !== null) {\n xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');\n }\n\n Object.keys(headers).forEach(h => {\n if (headers[h] !== null) {\n xhr.setRequestHeader(h, headers[h]);\n }\n });\n\n xhr.send(formData);\n\n return xhr;\n}\n","import { NativeNode } from '../types/native';\nimport { Nodes } from './nodes';\n\nexport class Fragment {\n // native document fragment\n private fragment: DocumentFragment;\n\n constructor(fragment?: DocumentFragment) {\n this.fragment = fragment ?? document.createDocumentFragment();\n }\n\n // Returns the descendants of the fragment which are selected by the specified CSS selector.\n public find(selector: string): Nodes {\n const nodeList: NativeNode[] = [];\n let child = new Nodes(this.fragment.firstChild);\n while (child.length > 0) {\n if (child.matches(selector)) {\n nodeList.push(child.get(0));\n } else if (child.isElement) {\n child.find(selector).each(node => {\n nodeList.push(node);\n });\n }\n child = child.next();\n }\n return new Nodes(nodeList);\n }\n\n // Inserts the specified node as the last child.\n public append(node: Nodes): void {\n node.each(nativeNode => {\n this.fragment.appendChild(nativeNode);\n });\n }\n}\n","/**\n * base64.ts\n *\n * Licensed under the BSD 3-Clause License.\n * http://opensource.org/licenses/BSD-3-Clause\n *\n * References:\n * http://en.wikipedia.org/wiki/Base64\n *\n * @author Dan Kogai (https://github.com/dankogai)\n */\nconst version = '3.7.7';\n/**\n * @deprecated use lowercase `version`.\n */\nconst VERSION = version;\nconst _hasBuffer = typeof Buffer === 'function';\nconst _TD = typeof TextDecoder === 'function' ? new TextDecoder() : undefined;\nconst _TE = typeof TextEncoder === 'function' ? new TextEncoder() : undefined;\nconst b64ch = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';\nconst b64chs = Array.prototype.slice.call(b64ch);\nconst b64tab = ((a) => {\n let tab = {};\n a.forEach((c, i) => tab[c] = i);\n return tab;\n})(b64chs);\nconst b64re = /^(?:[A-Za-z\\d+\\/]{4})*?(?:[A-Za-z\\d+\\/]{2}(?:==)?|[A-Za-z\\d+\\/]{3}=?)?$/;\nconst _fromCC = String.fromCharCode.bind(String);\nconst _U8Afrom = typeof Uint8Array.from === 'function'\n ? Uint8Array.from.bind(Uint8Array)\n : (it) => new Uint8Array(Array.prototype.slice.call(it, 0));\nconst _mkUriSafe = (src) => src\n .replace(/=/g, '').replace(/[+\\/]/g, (m0) => m0 == '+' ? '-' : '_');\nconst _tidyB64 = (s) => s.replace(/[^A-Za-z0-9\\+\\/]/g, '');\n/**\n * polyfill version of `btoa`\n */\nconst btoaPolyfill = (bin) => {\n // console.log('polyfilled');\n let u32, c0, c1, c2, asc = '';\n const pad = bin.length % 3;\n for (let i = 0; i < bin.length;) {\n if ((c0 = bin.charCodeAt(i++)) > 255 ||\n (c1 = bin.charCodeAt(i++)) > 255 ||\n (c2 = bin.charCodeAt(i++)) > 255)\n throw new TypeError('invalid character found');\n u32 = (c0 << 16) | (c1 << 8) | c2;\n asc += b64chs[u32 >> 18 & 63]\n + b64chs[u32 >> 12 & 63]\n + b64chs[u32 >> 6 & 63]\n + b64chs[u32 & 63];\n }\n return pad ? asc.slice(0, pad - 3) + \"===\".substring(pad) : asc;\n};\n/**\n * does what `window.btoa` of web browsers do.\n * @param {String} bin binary string\n * @returns {string} Base64-encoded string\n */\nconst _btoa = typeof btoa === 'function' ? (bin) => btoa(bin)\n : _hasBuffer ? (bin) => Buffer.from(bin, 'binary').toString('base64')\n : btoaPolyfill;\nconst _fromUint8Array = _hasBuffer\n ? (u8a) => Buffer.from(u8a).toString('base64')\n : (u8a) => {\n // cf. https://stackoverflow.com/questions/12710001/how-to-convert-uint8-array-to-base64-encoded-string/12713326#12713326\n const maxargs = 0x1000;\n let strs = [];\n for (let i = 0, l = u8a.length; i < l; i += maxargs) {\n strs.push(_fromCC.apply(null, u8a.subarray(i, i + maxargs)));\n }\n return _btoa(strs.join(''));\n };\n/**\n * converts a Uint8Array to a Base64 string.\n * @param {boolean} [urlsafe] URL-and-filename-safe a la RFC4648 §5\n * @returns {string} Base64 string\n */\nconst fromUint8Array = (u8a, urlsafe = false) => urlsafe ? _mkUriSafe(_fromUint8Array(u8a)) : _fromUint8Array(u8a);\n// This trick is found broken https://github.com/dankogai/js-base64/issues/130\n// const utob = (src: string) => unescape(encodeURIComponent(src));\n// reverting good old fationed regexp\nconst cb_utob = (c) => {\n if (c.length < 2) {\n var cc = c.charCodeAt(0);\n return cc < 0x80 ? c\n : cc < 0x800 ? (_fromCC(0xc0 | (cc >>> 6))\n + _fromCC(0x80 | (cc & 0x3f)))\n : (_fromCC(0xe0 | ((cc >>> 12) & 0x0f))\n + _fromCC(0x80 | ((cc >>> 6) & 0x3f))\n + _fromCC(0x80 | (cc & 0x3f)));\n }\n else {\n var cc = 0x10000\n + (c.charCodeAt(0) - 0xD800) * 0x400\n + (c.charCodeAt(1) - 0xDC00);\n return (_fromCC(0xf0 | ((cc >>> 18) & 0x07))\n + _fromCC(0x80 | ((cc >>> 12) & 0x3f))\n + _fromCC(0x80 | ((cc >>> 6) & 0x3f))\n + _fromCC(0x80 | (cc & 0x3f)));\n }\n};\nconst re_utob = /[\\uD800-\\uDBFF][\\uDC00-\\uDFFFF]|[^\\x00-\\x7F]/g;\n/**\n * @deprecated should have been internal use only.\n * @param {string} src UTF-8 string\n * @returns {string} UTF-16 string\n */\nconst utob = (u) => u.replace(re_utob, cb_utob);\n//\nconst _encode = _hasBuffer\n ? (s) => Buffer.from(s, 'utf8').toString('base64')\n : _TE\n ? (s) => _fromUint8Array(_TE.encode(s))\n : (s) => _btoa(utob(s));\n/**\n * converts a UTF-8-encoded string to a Base64 string.\n * @param {boolean} [urlsafe] if `true` make the result URL-safe\n * @returns {string} Base64 string\n */\nconst encode = (src, urlsafe = false) => urlsafe\n ? _mkUriSafe(_encode(src))\n : _encode(src);\n/**\n * converts a UTF-8-encoded string to URL-safe Base64 RFC4648 §5.\n * @returns {string} Base64 string\n */\nconst encodeURI = (src) => encode(src, true);\n// This trick is found broken https://github.com/dankogai/js-base64/issues/130\n// const btou = (src: string) => decodeURIComponent(escape(src));\n// reverting good old fationed regexp\nconst re_btou = /[\\xC0-\\xDF][\\x80-\\xBF]|[\\xE0-\\xEF][\\x80-\\xBF]{2}|[\\xF0-\\xF7][\\x80-\\xBF]{3}/g;\nconst cb_btou = (cccc) => {\n switch (cccc.length) {\n case 4:\n var cp = ((0x07 & cccc.charCodeAt(0)) << 18)\n | ((0x3f & cccc.charCodeAt(1)) << 12)\n | ((0x3f & cccc.charCodeAt(2)) << 6)\n | (0x3f & cccc.charCodeAt(3)), offset = cp - 0x10000;\n return (_fromCC((offset >>> 10) + 0xD800)\n + _fromCC((offset & 0x3FF) + 0xDC00));\n case 3:\n return _fromCC(((0x0f & cccc.charCodeAt(0)) << 12)\n | ((0x3f & cccc.charCodeAt(1)) << 6)\n | (0x3f & cccc.charCodeAt(2)));\n default:\n return _fromCC(((0x1f & cccc.charCodeAt(0)) << 6)\n | (0x3f & cccc.charCodeAt(1)));\n }\n};\n/**\n * @deprecated should have been internal use only.\n * @param {string} src UTF-16 string\n * @returns {string} UTF-8 string\n */\nconst btou = (b) => b.replace(re_btou, cb_btou);\n/**\n * polyfill version of `atob`\n */\nconst atobPolyfill = (asc) => {\n // console.log('polyfilled');\n asc = asc.replace(/\\s+/g, '');\n if (!b64re.test(asc))\n throw new TypeError('malformed base64.');\n asc += '=='.slice(2 - (asc.length & 3));\n let u24, bin = '', r1, r2;\n for (let i = 0; i < asc.length;) {\n u24 = b64tab[asc.charAt(i++)] << 18\n | b64tab[asc.charAt(i++)] << 12\n | (r1 = b64tab[asc.charAt(i++)]) << 6\n | (r2 = b64tab[asc.charAt(i++)]);\n bin += r1 === 64 ? _fromCC(u24 >> 16 & 255)\n : r2 === 64 ? _fromCC(u24 >> 16 & 255, u24 >> 8 & 255)\n : _fromCC(u24 >> 16 & 255, u24 >> 8 & 255, u24 & 255);\n }\n return bin;\n};\n/**\n * does what `window.atob` of web browsers do.\n * @param {String} asc Base64-encoded string\n * @returns {string} binary string\n */\nconst _atob = typeof atob === 'function' ? (asc) => atob(_tidyB64(asc))\n : _hasBuffer ? (asc) => Buffer.from(asc, 'base64').toString('binary')\n : atobPolyfill;\n//\nconst _toUint8Array = _hasBuffer\n ? (a) => _U8Afrom(Buffer.from(a, 'base64'))\n : (a) => _U8Afrom(_atob(a).split('').map(c => c.charCodeAt(0)));\n/**\n * converts a Base64 string to a Uint8Array.\n */\nconst toUint8Array = (a) => _toUint8Array(_unURI(a));\n//\nconst _decode = _hasBuffer\n ? (a) => Buffer.from(a, 'base64').toString('utf8')\n : _TD\n ? (a) => _TD.decode(_toUint8Array(a))\n : (a) => btou(_atob(a));\nconst _unURI = (a) => _tidyB64(a.replace(/[-_]/g, (m0) => m0 == '-' ? '+' : '/'));\n/**\n * converts a Base64 string to a UTF-8 string.\n * @param {String} src Base64 string. Both normal and URL-safe are supported\n * @returns {string} UTF-8 string\n */\nconst decode = (src) => _decode(_unURI(src));\n/**\n * check if a value is a valid Base64 string\n * @param {String} src a value to check\n */\nconst isValid = (src) => {\n if (typeof src !== 'string')\n return false;\n const s = src.replace(/\\s+/g, '').replace(/={0,2}$/, '');\n return !/[^\\s0-9a-zA-Z\\+/]/.test(s) || !/[^\\s0-9a-zA-Z\\-_]/.test(s);\n};\n//\nconst _noEnum = (v) => {\n return {\n value: v, enumerable: false, writable: true, configurable: true\n };\n};\n/**\n * extend String.prototype with relevant methods\n */\nconst extendString = function () {\n const _add = (name, body) => Object.defineProperty(String.prototype, name, _noEnum(body));\n _add('fromBase64', function () { return decode(this); });\n _add('toBase64', function (urlsafe) { return encode(this, urlsafe); });\n _add('toBase64URI', function () { return encode(this, true); });\n _add('toBase64URL', function () { return encode(this, true); });\n _add('toUint8Array', function () { return toUint8Array(this); });\n};\n/**\n * extend Uint8Array.prototype with relevant methods\n */\nconst extendUint8Array = function () {\n const _add = (name, body) => Object.defineProperty(Uint8Array.prototype, name, _noEnum(body));\n _add('toBase64', function (urlsafe) { return fromUint8Array(this, urlsafe); });\n _add('toBase64URI', function () { return fromUint8Array(this, true); });\n _add('toBase64URL', function () { return fromUint8Array(this, true); });\n};\n/**\n * extend Builtin prototypes with relevant methods\n */\nconst extendBuiltins = () => {\n extendString();\n extendUint8Array();\n};\nconst gBase64 = {\n version: version,\n VERSION: VERSION,\n atob: _atob,\n atobPolyfill: atobPolyfill,\n btoa: _btoa,\n btoaPolyfill: btoaPolyfill,\n fromBase64: decode,\n toBase64: encode,\n encode: encode,\n encodeURI: encodeURI,\n encodeURL: encodeURI,\n utob: utob,\n btou: btou,\n decode: decode,\n isValid: isValid,\n fromUint8Array: fromUint8Array,\n toUint8Array: toUint8Array,\n extendString: extendString,\n extendUint8Array: extendUint8Array,\n extendBuiltins: extendBuiltins\n};\n// makecjs:CUT //\nexport { version };\nexport { VERSION };\nexport { _atob as atob };\nexport { atobPolyfill };\nexport { _btoa as btoa };\nexport { btoaPolyfill };\nexport { decode as fromBase64 };\nexport { encode as toBase64 };\nexport { utob };\nexport { encode };\nexport { encodeURI };\nexport { encodeURI as encodeURL };\nexport { btou };\nexport { decode };\nexport { isValid };\nexport { fromUint8Array };\nexport { toUint8Array };\nexport { extendString };\nexport { extendUint8Array };\nexport { extendBuiltins };\n// and finally,\nexport { gBase64 as Base64 };\n","'use strict';\n\nvar has = Object.prototype.hasOwnProperty\n , prefix = '~';\n\n/**\n * Constructor to create a storage for our `EE` objects.\n * An `Events` instance is a plain object whose properties are event names.\n *\n * @constructor\n * @private\n */\nfunction Events() {}\n\n//\n// We try to not inherit from `Object.prototype`. In some engines creating an\n// instance in this way is faster than calling `Object.create(null)` directly.\n// If `Object.create(null)` is not supported we prefix the event names with a\n// character to make sure that the built-in object properties are not\n// overridden or used as an attack vector.\n//\nif (Object.create) {\n Events.prototype = Object.create(null);\n\n //\n // This hack is needed because the `__proto__` property is still inherited in\n // some old browsers like Android 4, iPhone 5.1, Opera 11 and Safari 5.\n //\n if (!new Events().__proto__) prefix = false;\n}\n\n/**\n * Representation of a single event listener.\n *\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} [once=false] Specify if the listener is a one-time listener.\n * @constructor\n * @private\n */\nfunction EE(fn, context, once) {\n this.fn = fn;\n this.context = context;\n this.once = once || false;\n}\n\n/**\n * Add a listener for a given event.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} once Specify if the listener is a one-time listener.\n * @returns {EventEmitter}\n * @private\n */\nfunction addListener(emitter, event, fn, context, once) {\n if (typeof fn !== 'function') {\n throw new TypeError('The listener must be a function');\n }\n\n var listener = new EE(fn, context || emitter, once)\n , evt = prefix ? prefix + event : event;\n\n if (!emitter._events[evt]) emitter._events[evt] = listener, emitter._eventsCount++;\n else if (!emitter._events[evt].fn) emitter._events[evt].push(listener);\n else emitter._events[evt] = [emitter._events[evt], listener];\n\n return emitter;\n}\n\n/**\n * Clear event by name.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} evt The Event name.\n * @private\n */\nfunction clearEvent(emitter, evt) {\n if (--emitter._eventsCount === 0) emitter._events = new Events();\n else delete emitter._events[evt];\n}\n\n/**\n * Minimal `EventEmitter` interface that is molded against the Node.js\n * `EventEmitter` interface.\n *\n * @constructor\n * @public\n */\nfunction EventEmitter() {\n this._events = new Events();\n this._eventsCount = 0;\n}\n\n/**\n * Return an array listing the events for which the emitter has registered\n * listeners.\n *\n * @returns {Array}\n * @public\n */\nEventEmitter.prototype.eventNames = function eventNames() {\n var names = []\n , events\n , name;\n\n if (this._eventsCount === 0) return names;\n\n for (name in (events = this._events)) {\n if (has.call(events, name)) names.push(prefix ? name.slice(1) : name);\n }\n\n if (Object.getOwnPropertySymbols) {\n return names.concat(Object.getOwnPropertySymbols(events));\n }\n\n return names;\n};\n\n/**\n * Return the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Array} The registered listeners.\n * @public\n */\nEventEmitter.prototype.listeners = function listeners(event) {\n var evt = prefix ? prefix + event : event\n , handlers = this._events[evt];\n\n if (!handlers) return [];\n if (handlers.fn) return [handlers.fn];\n\n for (var i = 0, l = handlers.length, ee = new Array(l); i < l; i++) {\n ee[i] = handlers[i].fn;\n }\n\n return ee;\n};\n\n/**\n * Return the number of listeners listening to a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Number} The number of listeners.\n * @public\n */\nEventEmitter.prototype.listenerCount = function listenerCount(event) {\n var evt = prefix ? prefix + event : event\n , listeners = this._events[evt];\n\n if (!listeners) return 0;\n if (listeners.fn) return 1;\n return listeners.length;\n};\n\n/**\n * Calls each of the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Boolean} `true` if the event had listeners, else `false`.\n * @public\n */\nEventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) {\n var evt = prefix ? prefix + event : event;\n\n if (!this._events[evt]) return false;\n\n var listeners = this._events[evt]\n , len = arguments.length\n , args\n , i;\n\n if (listeners.fn) {\n if (listeners.once) this.removeListener(event, listeners.fn, undefined, true);\n\n switch (len) {\n case 1: return listeners.fn.call(listeners.context), true;\n case 2: return listeners.fn.call(listeners.context, a1), true;\n case 3: return listeners.fn.call(listeners.context, a1, a2), true;\n case 4: return listeners.fn.call(listeners.context, a1, a2, a3), true;\n case 5: return listeners.fn.call(listeners.context, a1, a2, a3, a4), true;\n case 6: return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true;\n }\n\n for (i = 1, args = new Array(len -1); i < len; i++) {\n args[i - 1] = arguments[i];\n }\n\n listeners.fn.apply(listeners.context, args);\n } else {\n var length = listeners.length\n , j;\n\n for (i = 0; i < length; i++) {\n if (listeners[i].once) this.removeListener(event, listeners[i].fn, undefined, true);\n\n switch (len) {\n case 1: listeners[i].fn.call(listeners[i].context); break;\n case 2: listeners[i].fn.call(listeners[i].context, a1); break;\n case 3: listeners[i].fn.call(listeners[i].context, a1, a2); break;\n case 4: listeners[i].fn.call(listeners[i].context, a1, a2, a3); break;\n default:\n if (!args) for (j = 1, args = new Array(len -1); j < len; j++) {\n args[j - 1] = arguments[j];\n }\n\n listeners[i].fn.apply(listeners[i].context, args);\n }\n }\n }\n\n return true;\n};\n\n/**\n * Add a listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.on = function on(event, fn, context) {\n return addListener(this, event, fn, context, false);\n};\n\n/**\n * Add a one-time listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.once = function once(event, fn, context) {\n return addListener(this, event, fn, context, true);\n};\n\n/**\n * Remove the listeners of a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn Only remove the listeners that match this function.\n * @param {*} context Only remove the listeners that have this context.\n * @param {Boolean} once Only remove one-time listeners.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.removeListener = function removeListener(event, fn, context, once) {\n var evt = prefix ? prefix + event : event;\n\n if (!this._events[evt]) return this;\n if (!fn) {\n clearEvent(this, evt);\n return this;\n }\n\n var listeners = this._events[evt];\n\n if (listeners.fn) {\n if (\n listeners.fn === fn &&\n (!once || listeners.once) &&\n (!context || listeners.context === context)\n ) {\n clearEvent(this, evt);\n }\n } else {\n for (var i = 0, events = [], length = listeners.length; i < length; i++) {\n if (\n listeners[i].fn !== fn ||\n (once && !listeners[i].once) ||\n (context && listeners[i].context !== context)\n ) {\n events.push(listeners[i]);\n }\n }\n\n //\n // Reset the array, or remove it completely if we have no more listeners.\n //\n if (events.length) this._events[evt] = events.length === 1 ? events[0] : events;\n else clearEvent(this, evt);\n }\n\n return this;\n};\n\n/**\n * Remove all listeners, or those of the specified event.\n *\n * @param {(String|Symbol)} [event] The event name.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.removeAllListeners = function removeAllListeners(event) {\n var evt;\n\n if (event) {\n evt = prefix ? prefix + event : event;\n if (this._events[evt]) clearEvent(this, evt);\n } else {\n this._events = new Events();\n this._eventsCount = 0;\n }\n\n return this;\n};\n\n//\n// Alias methods names because people roll like that.\n//\nEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\nEventEmitter.prototype.addListener = EventEmitter.prototype.on;\n\n//\n// Expose the prefix.\n//\nEventEmitter.prefixed = prefix;\n\n//\n// Allow `EventEmitter` to be imported as module namespace.\n//\nEventEmitter.EventEmitter = EventEmitter;\n\n//\n// Expose the module.\n//\nif ('undefined' !== typeof module) {\n module.exports = EventEmitter;\n}\n","import type { BoxComponent } from '../types/box';\n\nexport const boxes: Map<string, BoxComponent> = new Map();\n","import type { Editor } from '..';\n\nexport const editors: Map<number, Editor> = new Map();\n","import { Base64 } from 'js-base64';\nimport EventEmitter from 'eventemitter3';\nimport type { Editor } from '../editor';\nimport { NativeNode } from '../types/native';\nimport { BoxType, BoxValue } from '../types/box';\nimport { boxes } from '../storage/boxes';\nimport { editors } from '../storage/editors';\nimport { debug } from '../utils/debug';\nimport { forEach } from '../utils/for-each';\nimport { safeTemplate } from '../utils/safe-template';\nimport { encode } from '../utils/encode';\nimport { query } from '../utils/query';\nimport { morph } from '../utils/morph';\nimport { Nodes } from './nodes';\n\ntype CleanupFunction = () => void;\ntype SetupFunction = () => CleanupFunction | void;\n\n// Is a key-value object for storing data about box.\nconst boxData: { [key: number]: { [key: string]: any } } = {};\n\n// Is a key-value object for storing all effects.\nconst effectData: { [key: number]: { setup: SetupFunction[], cleanup: CleanupFunction[] } } = {};\n\nconst framework = safeTemplate`\n <span class=\"lake-box-strip\"><br /></span>\n <div class=\"lake-box-container\" contenteditable=\"false\"></div>\n <span class=\"lake-box-strip\"><br /></span>\n`;\n\nexport class Box {\n // <lake-box> element\n public node: Nodes;\n\n public event: EventEmitter = new EventEmitter();\n\n constructor(node: string | Nodes | NativeNode) {\n if (typeof node === 'string') {\n const component = boxes.get(node);\n if (component === undefined) {\n throw new Error(`Box '${node}' has not been defined yet.`);\n }\n const type = encode(component.type);\n const name = encode(component.name);\n this.node = query(safeTemplate`<lake-box type=\"${type}\" name=\"${name}\"></lake-box>`);\n if (component.value) {\n this.value = component.value;\n }\n } else {\n this.node = query(node);\n const component = boxes.get(this.name);\n if (component === undefined) {\n throw new Error(`Box '${this.name}' has not been defined yet.`);\n }\n if (component.value && !this.node.hasAttr('value')) {\n this.value = component.value;\n }\n }\n if (!boxData[this.node.id]) {\n boxData[this.node.id] = {};\n }\n if (!effectData[this.node.id]) {\n effectData[this.node.id] = {\n setup: [],\n cleanup: [],\n };\n }\n }\n\n // Adds the framework of the box.\n private addFramework(): void {\n let container = this.getContainer();\n if (container.length === 0) {\n this.node.html(framework);\n container = this.getContainer();\n } else {\n container.off('mouseenter');\n container.off('mouseleave');\n container.off('click');\n }\n container.on('mouseenter', () => {\n if (\n container.hasClass('lake-box-selected') ||\n container.hasClass('lake-box-focused') ||\n container.hasClass('lake-box-activated')\n ) {\n return;\n }\n container.addClass('lake-box-hovered');\n });\n container.on('mouseleave', () => {\n container.removeClass('lake-box-hovered');\n });\n container.on('click', () => {\n debug(`Box '${this.name}' (id = ${this.node.id}) value:`);\n debug(this.value);\n });\n }\n\n // Returns the type of the box.\n public get type(): BoxType {\n return this.node.attr('type') as BoxType;\n }\n\n // Returns the name of the box.\n public get name(): string {\n return this.node.attr('name');\n }\n\n // Returns the value of the box.\n public get value(): BoxValue {\n const value = this.node.attr('value');\n if (value === '') {\n return {};\n }\n return JSON.parse(Base64.decode(value));\n }\n\n // Sets the value of the box.\n public set value(value: BoxValue) {\n this.node.attr('value', Base64.encode(JSON.stringify(value)));\n }\n\n // Updates part of the value of the box.\n public updateValue(valueKey: string, valueValue: string): void;\n\n public updateValue(valueKey: BoxValue): void;\n\n public updateValue(valueKey: any, valueValue?: any): void {\n const value = this.value;\n if (typeof valueKey === 'string') {\n value[valueKey] = valueValue;\n } else {\n forEach(valueKey, (key, val) => {\n value[key] = val;\n });\n }\n this.value = value;\n }\n\n // Returns data of the box.\n public getData(key: string): any {\n return boxData[this.node.id][key];\n }\n\n // Updates data of the box.\n public setData(key: string, value: any): void {\n boxData[this.node.id][key] = value;\n }\n\n // Returns the editor instance of the box.\n public getEditor(): Editor | undefined {\n const container = this.node.closest('div[contenteditable]');\n return container.length > 0 ? editors.get(container.id) : undefined;\n }\n\n // Returns the container node of the box.\n public getContainer(): Nodes {\n return this.node.find('.lake-box-container');\n }\n\n public useEffect(setup: SetupFunction): void {\n effectData[this.node.id].setup.push(setup);\n }\n\n // Renders the contents of the box.\n public render(): void {\n effectData[this.node.id].setup = [];\n effectData[this.node.id].cleanup = [];\n const component = boxes.get(this.name);\n if (component === undefined) {\n return;\n }\n this.addFramework();\n const content = component.render(this);\n if (content !== undefined) {\n const container = this.getContainer();\n const newContainer = container.clone(false);\n newContainer.append(content);\n morph(container, newContainer);\n }\n for (const setup of effectData[this.node.id].setup) {\n const result = setup();\n if (result !== undefined) {\n effectData[this.node.id].cleanup.push(result);\n }\n }\n debug(`Box '${this.name}' (id = ${this.node.id}) rendered`);\n }\n\n // Destroys a rendered box.\n public unmount(): void {\n for (const cleanup of effectData[this.node.id].cleanup) {\n cleanup();\n }\n boxData[this.node.id] = {};\n effectData[this.node.id].setup = [];\n effectData[this.node.id].cleanup = [];\n this.node.empty();\n debug(`Box '${this.name}' (id = ${this.node.id}) unmounted`);\n }\n\n // Returns a HTML string of the box.\n public getHTML(): string {\n const component = boxes.get(this.name);\n if (component === undefined) {\n return '';\n }\n if (component.html === undefined) {\n return this.node.outerHTML();\n }\n return component.html(this);\n }\n}\n","const blockAttributeRules: any = {\n id: /^[\\w-]+$/,\n class: /^[\\w-]+$/,\n style: {\n 'text-align': ['left', 'center', 'right', 'justify', 'start', 'end'],\n 'margin-left': /^-?\\d+px$/i,\n 'text-indent': /^-?\\d+em$/i,\n },\n};\n\nexport function getElementRules(): any {\n return {\n h1: {\n ...blockAttributeRules,\n },\n h2: {\n ...blockAttributeRules,\n },\n h3: {\n ...blockAttributeRules,\n },\n h4: {\n ...blockAttributeRules,\n },\n h5: {\n ...blockAttributeRules,\n },\n h6: {\n ...blockAttributeRules,\n },\n p: {\n ...blockAttributeRules,\n },\n blockquote: {\n ...blockAttributeRules,\n type: ['success', 'info', 'warning', 'error'],\n },\n ul: {\n ...blockAttributeRules,\n type: 'checklist',\n indent: /^\\d+$/,\n },\n ol: {\n ...blockAttributeRules,\n start: /^\\d+$/,\n indent: /^\\d+$/,\n },\n li: {\n value: ['true', 'false'],\n },\n table: {\n style: {\n width: /^-?\\d+(px|%)$/i,\n height: /^-?\\d+(px|%)$/i,\n border: /^[^\"]+$/,\n 'border-width': /^-?\\d+px$/i,\n 'border-style': /^[\\w-]+$/,\n 'border-color': /^[^\"]+$/,\n 'background-color': /^[^\"]+$/,\n },\n },\n tr: {\n style: {\n height: /^-?\\d+(px|%)$/i,\n },\n },\n th: 'td',\n td: {\n colspan: /^\\d+$/,\n rowspan: /^\\d+$/,\n style: {\n width: /^-?\\d+(px|%)$/i,\n height: /^-?\\d+(px|%)$/i,\n border: /^[^\"]+$/,\n 'border-width': /^-?\\d+px$/i,\n 'border-style': /^[\\w-]+$/,\n 'border-color': /^[^\"]+$/,\n 'background-color': /^[^\"]+$/,\n 'text-align': ['left', 'center', 'right', 'justify'],\n },\n },\n 'lake-box': {\n type: ['inline', 'block'],\n name: /^[\\w-]+$/,\n value: /^[^\"]+$/,\n focus: ['left', 'center', 'right'],\n },\n br: {},\n hr: {},\n img : {\n src: /^[^\"]+$/,\n width: /^-?\\d+px$/i,\n height: /^-?\\d+px$/i,\n 'data-lake-value': /^[^\"]+$/,\n alt: /^[^\"]+$/,\n style: {\n width: /^-?\\d+px$/i,\n height: /^-?\\d+px$/i,\n },\n },\n span: {\n class: /^[\\w-]+$/,\n style: {\n color: /^[^\"]+$/,\n 'background-color': /^[^\"]+$/,\n 'font-family': /^[^;]+$/,\n 'font-size': /^[^\"]+$/,\n },\n },\n b: 'strong',\n strong: {},\n em: 'i',\n i: {},\n u: {},\n s: {},\n sub: {},\n sup: {},\n code: {},\n a: {\n class: /^[\\w-]+$/,\n name: /^[\\w-]+$/,\n href: /^[^\"]+$/,\n target: /^[\\w-]+$/,\n rel: /^[^\"]+$/,\n download: /^[^\"]+$/,\n },\n 'lake-bookmark': {\n type: ['anchor', 'focus'],\n },\n };\n}\n","import { getElementRules } from '../config/element-rules';\nimport { forEach, parseStyle, encode } from '../utils';\nimport { Nodes } from '../models/nodes';\n\nexport class HTMLParser {\n\n private rules: any;\n\n private source: Nodes;\n\n constructor(content: string | Nodes, rules = getElementRules()) {\n this.rules = rules;\n if (typeof content === 'string') {\n this.source = this.parseHTML(content);\n } else {\n this.source = content;\n }\n }\n\n // Parses HTML string and returns the resulting body element.\n private parseHTML(html: string): Nodes {\n const parser = new DOMParser();\n const doc = parser.parseFromString(html, 'text/html');\n return new Nodes(doc.querySelector('body'));\n }\n\n // Returns a boolean indicating whether a value matches the specified rule.\n private static matchRule(rule: any, value: string): boolean {\n if (typeof rule === 'string') {\n return rule === value;\n }\n if (Array.isArray(rule)) {\n return rule.indexOf(value) >= 0;\n }\n if (rule instanceof RegExp) {\n return rule.test(value);\n }\n return false;\n }\n\n // Returns an open tag string of the specified element.\n private static getOpenTagString(element: Nodes, rules: any) : string {\n let tagName = element.name;\n let attributeRules = rules[tagName];\n if (!attributeRules) {\n return '';\n }\n if (typeof attributeRules === 'string') {\n tagName = attributeRules;\n attributeRules = rules[tagName];\n }\n const nativeNode = element.get(0) as Element;\n if (!nativeNode.hasAttributes()) {\n return tagName;\n }\n const attributeMap: Map<string, string | Map<string, string>> = new Map();\n for (const attr of nativeNode.attributes) {\n if (attributeRules[attr.name]) {\n if (attr.name !== 'style' && HTMLParser.matchRule(attributeRules[attr.name], attr.value)) {\n attributeMap.set(attr.name, attr.value);\n }\n if (attr.name === 'style') {\n const styleRules = attributeRules.style;\n const styleMap: Map<string, string> = new Map();\n forEach(parseStyle(attr.value), (key, value) => {\n if (styleRules[key] && HTMLParser.matchRule(styleRules[key], value)) {\n styleMap.set(key, value);\n }\n });\n attributeMap.set('style', styleMap);\n }\n }\n }\n let openTag = tagName;\n for (const [attrName, attrValue] of attributeMap) {\n if (attrName === 'style') {\n let styleString = '';\n for (const [styleName, styleValue] of attrValue) {\n styleString += `${styleName}: ${styleValue.replace(/\"/g, '&quot;')}; `;\n }\n if (styleString !== '') {\n openTag += ` style=\"${styleString.trim()}\"`;\n }\n } else {\n openTag += ` ${attrName}=\"${attrValue}\"`;\n }\n }\n return openTag;\n }\n\n // Returns a closed tag string of the specified element.\n private static getClosedTagString(element: Nodes, rules: any) : string {\n let tagName = element.name;\n const attributeRules = rules[tagName];\n if (!attributeRules) {\n return '';\n }\n if (typeof attributeRules === 'string') {\n tagName = attributeRules;\n }\n return tagName;\n }\n\n // Returns the value of the text node with trimming invisible whitespace.\n // <p>foo</p>\\n<p>bar</p>\n // or\n // <p>\\nfoo\\n</p>\n private static getTrimmedText(textNode: Nodes): string {\n const parentNode = textNode.parent();\n const prevSibling = textNode.prev();\n const nextSibling = textNode.next();\n let nodeValue = textNode.text();\n if (\n (prevSibling.isBlock || prevSibling.isBlockBox) &&\n (nextSibling.isBlock || nextSibling.isBlockBox) ||\n prevSibling.length === 0 && nextSibling.length === 0 && parentNode.isBlock\n ) {\n nodeValue = nodeValue.replace(/^[\\u0020\\t\\r\\n]+|[\\u0020\\t\\r\\n]+$/g, '');\n } else if (\n (prevSibling.isBlock || prevSibling.isBlockBox) ||\n prevSibling.length === 0 && parentNode.isBlock)\n {\n nodeValue = nodeValue.replace(/^[\\u0020\\t\\r\\n]+/, '');\n } else if (\n (nextSibling.isBlock || nextSibling.isBlockBox) ||\n nextSibling.length === 0 && parentNode.isBlock\n ) {\n nodeValue = nodeValue.replace(/[\\u0020\\t\\r\\n]+$/, '');\n }\n return nodeValue;\n }\n\n // Returns the result as HTML format.\n public getHTML(): string {\n const rules = this.rules;\n function * iterate(node: Nodes): Generator<string> {\n let child = node.first();\n while (child.length > 0) {\n const nextNode = child.next();\n if (child.isText) {\n yield encode(HTMLParser.getTrimmedText(child));\n } else if (child.isVoid) {\n const openTag = HTMLParser.getOpenTagString(child, rules);\n if (openTag !== '') {\n yield `<${openTag} />`;\n }\n } else if (child.isElement) {\n const openTag = HTMLParser.getOpenTagString(child, rules);\n const closedTag = HTMLParser.getClosedTagString(child, rules);\n if (openTag !== '') {\n yield `<${openTag}>`;\n }\n if (!child.isBox) {\n yield * iterate(child);\n }\n if (closedTag !== '') {\n yield `</${closedTag}>`;\n }\n }\n child = nextNode;\n }\n }\n let html = '';\n for (const value of iterate(this.source)) {\n html += value;\n }\n return html.trim();\n }\n\n // Returns the result as node list.\n public getNodeList(): Nodes[] {\n const html = this.getHTML();\n const body = this.parseHTML(html);\n return body.children();\n }\n\n // Returns the result as document fragment.\n public getFragment(): DocumentFragment {\n const html = this.getHTML();\n const body = this.parseHTML(html);\n const fragment = document.createDocumentFragment();\n let child = body.first();\n while (child.length > 0) {\n const nextNode = child.next();\n fragment.appendChild(child.get(0));\n child = nextNode;\n }\n return fragment;\n }\n}\n","import { encode } from '../utils';\nimport { HTMLParser } from './html-parser';\n\nexport class TextParser {\n\n private content: string;\n\n constructor(content: string) {\n this.content = content;\n }\n\n public getHTML(): string {\n let html = this.content;\n html = html.replace(/ {2}/g, ' \\xA0');\n html = encode(html.trim());\n html = `<p>${html}</p>`;\n html = html.replace(/(\\r\\n){2,}/g, '</p><p><br /></p><p>');\n html = html.replace(/\\r\\n/g, '</p><p>');\n html = html.replace(/[\\r\\n]{2,}/g, '</p><p><br /></p><p>');\n html = html.replace(/[\\r\\n]/g, '</p><p>');\n return html;\n }\n\n public getFragment(): DocumentFragment {\n const htmlParser = new HTMLParser(this.getHTML());\n return htmlParser.getFragment();\n }\n}\n","import { NativeNode } from '../types/native';\nimport { query } from '../utils/query';\nimport { Nodes } from '../models/nodes';\nimport { Range } from '../models/range';\n\n// Inserts a node into the specified range.\nexport function insertNode(range: Range, node: NativeNode | Nodes): void {\n if (range.commonAncestor.isOutside) {\n return;\n }\n node = query(node);\n const nativeNode = node.get(0);\n const nativeRange = range.get();\n nativeRange.insertNode(nativeNode);\n nativeRange.setEndAfter(nativeNode);\n nativeRange.collapse(false);\n}\n","import { query } from '../utils';\nimport { Nodes } from '../models/nodes';\nimport { Range } from '../models/range';\nimport { insertNode } from './insert-node';\n\n// Either the method inserts a bookmark into the current position of the collapsed range\n// or the method inserts a pair of bookmarks into the beginning and the end of the range.\n// case 1: foo<lake-bookmark type=\"focus\" />bar\n// case 2: <lake-bookmark type=\"anchor\" />foo<lake-bookmark type=\"focus\" />\n// case 3: foo<lake-box type=\"inline\" name=\"image\" focus=\"left\"></lake-box>bar\n// case 4: foo<lake-box type=\"inline\" name=\"image\" focus=\"right\"></lake-box>bar\n// case 5: <lake-bookmark type=\"anchor\" /><lake-box type=\"inline\" name=\"image\"></lake-box>foo<lake-bookmark type=\"focus\" />\nexport function insertBookmark(range: Range): { anchor: Nodes, focus: Nodes } {\n if (range.commonAncestor.isOutside) {\n return {\n anchor: new Nodes(),\n focus: new Nodes(),\n };\n }\n // box\n const boxNode = range.startNode.closest('lake-box');\n if (boxNode.length > 0) {\n if (range.isBoxLeft) {\n boxNode.attr('focus', 'left');\n } else if (range.isBoxRight) {\n boxNode.attr('focus', 'right');\n } else {\n boxNode.attr('focus', 'center');\n }\n return {\n anchor: new Nodes(),\n focus: boxNode,\n };\n }\n // collapsed range\n if (range.isCollapsed) {\n const endRange = range.clone();\n endRange.collapseToEnd();\n const focus = query('<lake-bookmark type=\"focus\" />');\n insertNode(endRange, focus);\n return {\n anchor: new Nodes(),\n focus,\n };\n }\n // expanded range\n const startRange = range.clone();\n startRange.collapseToStart();\n const anchor = query('<lake-bookmark type=\"anchor\" />');\n insertNode(startRange, anchor);\n const endRange = range.clone();\n endRange.collapseToEnd();\n const focus = query('<lake-bookmark type=\"focus\" />');\n insertNode(endRange, focus);\n return {\n anchor,\n focus,\n };\n}\n","import { removeZWS } from '../utils/remove-zws';\nimport { Nodes } from '../models/nodes';\nimport { Range } from '../models/range';\nimport { Box } from '../models/box';\n\nfunction removeAndNormalizeNode(node: Nodes, range?: Range) {\n const previousNode = node.prev();\n const nextNode = node.next();\n if (previousNode.isText && nextNode.isText) {\n const parentNode = node.parent();\n removeZWS(parentNode);\n node.remove();\n parentNode.get(0).normalize();\n } else if (previousNode.length === 0 && nextNode.length === 0) {\n if (node.parent().isMark && range) {\n const zeroWidthSpace = new Nodes(document.createTextNode('\\u200B'));\n node.before(zeroWidthSpace);\n range.setStartAfter(zeroWidthSpace);\n range.collapseToStart();\n }\n node.remove();\n } else {\n node.remove();\n }\n}\n\n// Sets the specified range to the range represented by the bookmark.\nexport function toBookmark(range: Range, bookmark: { anchor: Nodes, focus: Nodes }): void {\n const anchor = bookmark.anchor;\n const focus = bookmark.focus;\n // Only the anchor is removed because the focus does not exist, which is not correct case.\n if (anchor.length > 0 && focus.length === 0) {\n removeAndNormalizeNode(anchor);\n return;\n }\n if (focus.length > 0 && anchor.length === 0) {\n if (focus.isBox) {\n const box = new Box(focus);\n if (box.getContainer().length === 0) {\n box.render();\n }\n const focusValue = focus.attr('focus');\n if (focusValue === 'left') {\n range.selectBoxLeft(focus);\n } else if (focusValue === 'center') {\n range.selectBox(focus);\n } else {\n range.selectBoxRight(focus);\n }\n focus.removeAttr('focus');\n return;\n }\n range.setStartBefore(focus);\n range.collapseToStart();\n removeAndNormalizeNode(focus, range);\n return;\n }\n if (anchor.length > 0 && focus.length > 0) {\n const anchorRange = new Range();\n anchorRange.selectNode(anchor);\n anchorRange.collapseToEnd();\n // The anchor node is after the focus node.\n if (anchorRange.compareAfterNode(focus) === -1) {\n range.setStartBefore(focus);\n removeAndNormalizeNode(focus);\n range.setEndBefore(anchor);\n removeAndNormalizeNode(anchor);\n } else {\n range.setStartBefore(anchor);\n removeAndNormalizeNode(anchor);\n range.setEndBefore(focus);\n removeAndNormalizeNode(focus);\n }\n }\n}\n","import { fixNumberedList } from '../utils';\nimport { Range } from '../models/range';\n\nexport function fixList(range: Range): void {\n if (range.commonAncestor.isOutside) {\n return;\n }\n const blocks = range.getBlocks();\n fixNumberedList(blocks);\n}\n","import { query } from '../utils/query';\nimport { appendDeepest } from '../utils/append-deepest';\nimport { mergeNodes } from '../utils/merge-nodes';\nimport { Range } from '../models/range';\nimport { fixList } from './fix-list';\nimport { insertBookmark } from './insert-bookmark';\nimport { toBookmark } from './to-bookmark';\n\n// Removes the contents of the specified range.\nexport function deleteContents(range: Range): void {\n if (range.isCollapsed) {\n return;\n }\n range.adapt();\n if (range.isInoperative) {\n return;\n }\n const startBlock = range.startNode.closestBlock();\n const endBlock = range.endNode.closestBlock();\n const noMerge = startBlock.get(0) === endBlock.get(0);\n const nativeRange = range.get();\n nativeRange.deleteContents();\n range.adaptBlock();\n if (noMerge) {\n const block = range.getBlocks()[0];\n if (block && block.isEmpty) {\n appendDeepest(block, query('<br />'));\n range.shrinkAfter(block);\n }\n return;\n }\n const block = range.getBlocks()[0];\n if (!block) {\n return;\n }\n const prevBlock = block.prev();\n if (prevBlock.length === 0) {\n return;\n }\n const bookmark = insertBookmark(range);\n mergeNodes(prevBlock, block);\n toBookmark(range, bookmark);\n fixList(range);\n}\n","import { removeBr } from '../utils/remove-br';\nimport { Range } from '../models/range';\nimport { deleteContents } from './delete-contents';\nimport { insertBookmark } from './insert-bookmark';\nimport { toBookmark } from './to-bookmark';\n\n// Inserts a DocumentFragment object into the specified range.\nexport function insertFragment(range: Range, fragment: DocumentFragment): void {\n if (range.commonAncestor.isOutside) {\n return;\n }\n if (range.isCollapsed) {\n range.adaptBox();\n } else {\n deleteContents(range);\n }\n const block = range.startNode.closestBlock();\n removeBr(block);\n const bookmark = insertBookmark(range);\n bookmark.focus.before(fragment);\n toBookmark(range, bookmark);\n range.adaptBlock();\n}\n","import { query } from '../utils';\nimport { Range } from '../models/range';\nimport { insertFragment } from './insert-fragment';\n\n// Inserts a HTML string into the specified range.\nexport function insertContents(range: Range, value: string): void {\n const nodes = query(value);\n const fragment = document.createDocumentFragment();\n nodes.each(nativeNode => {\n fragment.appendChild(nativeNode);\n });\n insertFragment(range, fragment);\n}\n","import { KeyValue } from '../types/object';\nimport { query, getDeepest, wrapNodeList, appendDeepest } from '../utils';\nimport { Nodes } from '../models/nodes';\nimport { Range } from '../models/range';\nimport { insertBookmark } from './insert-bookmark';\nimport { toBookmark } from './to-bookmark';\nimport { fixList } from './fix-list';\n\nfunction getTopNonBlockNodes(range: Range): Nodes[] {\n const container = range.commonAncestor.closest('div[contenteditable=\"true\"],td');\n let nodeList: Nodes[] = [];\n if (container.length === 0) {\n return nodeList;\n }\n let node = container.first();\n let isBeforeRange = true;\n while (node.length > 0) {\n if (node.isMark || node.isText || node.isBookmark || node.isInlineBox) {\n nodeList.push(node);\n } else {\n if (!isBeforeRange) {\n break;\n }\n nodeList = [];\n }\n if (range.intersectsNode(node)) {\n isBeforeRange = false;\n }\n node = node.next();\n }\n return nodeList;\n}\n\n// Adds new blocks or changes target blocks relating to the specified range.\nexport function setBlocks(range: Range, value: string | KeyValue): void {\n if (range.commonAncestor.isOutside) {\n return;\n }\n if (range.isCollapsed) {\n if (range.isBox) {\n return;\n }\n }\n // changes the attributes of target blocks\n if (typeof value !== 'string') {\n const blockList = range.getBlocks();\n for (const block of blockList) {\n block.css(value);\n }\n return;\n }\n // adds or replace blocks\n const valueNode = query(value);\n const tagName = valueNode.name;\n const nativeValueNode = valueNode.get(0) as Element;\n const attributes = nativeValueNode.attributes;\n const blockList = range.getBlocks();\n // has blocks\n if (blockList.length > 0) {\n const bookmark = insertBookmark(range);\n for (const node of blockList) {\n if (node.name === tagName && valueNode.first().length === 0) {\n for (const attr of attributes) {\n node.attr(attr.name, attr.value);\n }\n } else {\n const block = valueNode.clone(true);\n if (node.isList && node.attr('indent') !== '') {\n block.attr('indent', node.attr('indent'));\n }\n const deepestBlock = getDeepest(block);\n let child = node.first();\n while(child.length > 0) {\n const nextNode = child.next();\n deepestBlock.append(child);\n if (deepestBlock.name === child.name || child.name === 'li') {\n child.remove(true);\n }\n child = nextNode;\n }\n node.replaceWith(block);\n }\n }\n toBookmark(range, bookmark);\n fixList(range);\n return;\n }\n // no block\n const bookmark = insertBookmark(range);\n const nonBlockNodes = getTopNonBlockNodes(range);\n const block = wrapNodeList(nonBlockNodes, valueNode);\n toBookmark(range, bookmark);\n fixList(range);\n if (block.isEmpty) {\n appendDeepest(block, query('<br />'));\n range.shrinkAfter(block);\n }\n}\n","import { TwoParts } from '../types/object';\nimport { query, splitNodes, appendDeepest } from '../utils';\nimport { Range } from '../models/range';\nimport { fixList } from './fix-list';\nimport { deleteContents } from './delete-contents';\n\n// Removes the contents of the specified range and then splits the block node at the point of the collapsed range.\n// <p>one<anchor />two<focus />three</p>\n// to\n// <p>one</p>\n// <p><focus />three</p>\nexport function splitBlock(range: Range): TwoParts {\n if (range.commonAncestor.isOutside) {\n return {\n left: null,\n right: null,\n };\n }\n if (range.isCollapsed) {\n range.adaptBox();\n } else {\n deleteContents(range);\n }\n const node = range.startNode;\n const closestBlock = node.closestOperableBlock();\n if (closestBlock.length === 0) {\n return {\n left: null,\n right: null,\n };\n }\n let limitBlock = closestBlock.parent();\n if (limitBlock.isOutside) {\n limitBlock = node.closestContainer();\n }\n const parts = splitNodes(node, range.startOffset, limitBlock);\n let left = null;\n let right = null;\n if (parts) {\n left = parts.left;\n right = parts.right;\n }\n if (!parts && node.isBlock) {\n if (range.startOffset > 0) {\n left = node.children()[range.startOffset - 1];\n }\n right = node.children()[range.startOffset];\n if (right && !right.isBlock) {\n right = null;\n }\n }\n if (left && left.isEmpty) {\n appendDeepest(left, query('<br />'));\n }\n if (right) {\n if (right.isEmpty) {\n appendDeepest(right, query('<br />'));\n range.shrinkAfter(right);\n } else {\n range.shrinkBefore(right);\n }\n }\n fixList(range);\n return {\n left,\n right,\n };\n}\n","import { TwoParts, ThreeParts } from '../types/object';\nimport { splitNodes } from '../utils';\nimport { Nodes } from '../models/nodes';\nimport { Range } from '../models/range';\n\n// Removes empty marks that contain no content.\nfunction removeEmptyMarks(node: Nodes): void {\n if (node.isMark && node.isEmpty) {\n node.remove();\n return;\n }\n for (const child of node.getWalker()) {\n if (child.isMark && child.isEmpty) {\n child.remove();\n }\n }\n}\n\n// Splits text nodes or mark nodes at a specified position.\nfunction splitMarksAtPoint(node: Nodes, offset: number, removeEmptyMark: boolean): TwoParts {\n let left = null;\n let right = null;\n let limitBlock = node.closestBlock();\n if (limitBlock.length === 0) {\n limitBlock = node.closestContainer();\n }\n const parts = splitNodes(node, offset, limitBlock);\n if (parts) {\n if (removeEmptyMark) {\n removeEmptyMarks(parts.left);\n removeEmptyMarks(parts.right);\n if (!parts.left.isEmpty) {\n left = parts.left;\n }\n if (!parts.right.isEmpty) {\n right = parts.right;\n }\n } else {\n left = parts.left;\n right = parts.right;\n }\n }\n return {\n left,\n right,\n };\n}\n\n// Splits text nodes or mark nodes.\n// <p><strong>one<anchor />two<focus />three</strong></p>\n// to\n// <p><strong>one</strong><strong><anchor />two<focus /></strong><strong>three</strong></p>\nexport function splitMarks(range: Range, removeEmptyMark: boolean = true): ThreeParts {\n if (range.commonAncestor.isOutside) {\n return {\n left: null,\n center: null,\n right: null,\n };\n }\n range.adaptBox();\n if (range.isCollapsed) {\n const parts = splitMarksAtPoint(range.startNode, range.startOffset, removeEmptyMark);\n if (parts.left) {\n range.setStartAfter(parts.left);\n range.collapseToStart();\n } else if (parts.right) {\n range.setStartBefore(parts.right);\n range.collapseToStart();\n }\n return {\n left: parts.left,\n center: null,\n right: parts.right,\n };\n }\n const startParts = splitMarksAtPoint(range.startNode, range.startOffset, removeEmptyMark);\n if (startParts.left) {\n range.setStartAfter(startParts.left);\n } else if (startParts.right) {\n range.setStartBefore(startParts.right);\n }\n const endParts = splitMarksAtPoint(range.endNode, range.endOffset, removeEmptyMark);\n if (endParts.left) {\n range.setEndAfter(endParts.left);\n } else if (endParts.right) {\n range.setEndBefore(endParts.right);\n }\n return {\n left: startParts.left,\n center: endParts.left,\n right: endParts.right,\n };\n}\n","import { parseStyle, query, appendDeepest, removeBr } from '../utils';\nimport { Nodes } from '../models/nodes';\nimport { Range } from '../models/range';\nimport { Box } from '../models/box';\nimport { insertBookmark } from './insert-bookmark';\nimport { toBookmark } from './to-bookmark';\nimport { splitMarks } from './split-marks';\nimport { insertNode } from './insert-node';\n\n// Removes zero-width space before or after the node.\nfunction removePreviousOrNextZWS(node: Nodes): void {\n const prevNode = node.prev();\n if (prevNode.length > 0 && prevNode.isText && prevNode.isEmpty) {\n prevNode.remove();\n }\n const nextNode = node.next();\n if (nextNode.length > 0 && nextNode.isText && nextNode.isEmpty) {\n nextNode.remove();\n }\n}\n\n// Returns an element copied from each last child of the descendants of the specified node.\nfunction copyNestedMarks(node: Nodes): Nodes | null {\n if (!node.isMark) {\n return null;\n }\n let newMark = node.clone();\n let child = node.last();\n while (child.length > 0) {\n if (child.isMark) {\n const newChild = child.clone();\n newMark.append(newChild);\n newMark = newChild;\n }\n child = child.last();\n }\n return newMark;\n}\n\n// Returns the topmost mark element or the closest element with the same tag name as the specified node.\nfunction getUpperMark(node: Nodes, tagName: string): Nodes {\n const nodeText = node.text();\n let parent = node;\n while(parent.length > 0) {\n const nextParent = parent.parent();\n if (\n !nextParent.isMark ||\n nodeText !== nextParent.text() ||\n !parent.isText && parent.name === tagName && parent.attr('style') !== ''\n ) {\n break;\n }\n parent = nextParent;\n }\n return parent;\n}\n\n// Adds the specified mark to the texts of the range.\nexport function addMark(range: Range, value: string | Nodes): void {\n if (range.commonAncestor.isOutside) {\n return;\n }\n let valueNode = query(value);\n const tagName = valueNode.name;\n const styleValue = valueNode.attr('style');\n const cssProperties = parseStyle(styleValue);\n if (range.isCollapsed) {\n if (range.isBox) {\n const boxNode = range.startNode.closest('lake-box');\n const box = new Box(boxNode);\n if (box.type === 'block') {\n const newBlock = query('<p><br /></p>');\n if (range.isBoxLeft) {\n boxNode.before(newBlock);\n } else {\n boxNode.after(newBlock);\n }\n range.shrinkAfter(newBlock);\n } else {\n range.adaptBox();\n }\n }\n const block = range.startNode.closestBlock();\n removeBr(block);\n // https://en.wikipedia.org/wiki/Zero-width_space\n const zeroWidthSpace = new Nodes(document.createTextNode('\\u200B'));\n const parts = splitMarks(range);\n if (parts.left) {\n const newMark = copyNestedMarks(parts.left);\n if (newMark) {\n if (newMark.name === tagName) {\n newMark.css(cssProperties);\n valueNode = newMark;\n } else {\n appendDeepest(newMark, zeroWidthSpace);\n valueNode.append(newMark);\n }\n }\n }\n if (valueNode.text() === '') {\n valueNode.append(zeroWidthSpace);\n }\n insertNode(range, valueNode);\n removePreviousOrNextZWS(valueNode);\n range.shrinkAfter(valueNode);\n return;\n }\n splitMarks(range);\n const nodeList = range.getMarks(true);\n const bookmark = insertBookmark(range);\n for (const node of nodeList) {\n if (!node.isEmpty) {\n if (node.isText) {\n const upperMark = getUpperMark(node, tagName);\n if (upperMark.isMark && upperMark.name === tagName) {\n upperMark.css(cssProperties);\n } else {\n const newValueNode = valueNode.clone();\n upperMark.before(newValueNode);\n newValueNode.append(upperMark);\n }\n }\n }\n }\n toBookmark(range, bookmark);\n}\n","import { appendDeepest, query, removeZWS } from '../utils';\nimport { Nodes } from '../models/nodes';\nimport { Range } from '../models/range';\nimport { insertBookmark } from './insert-bookmark';\nimport { toBookmark } from './to-bookmark';\nimport { splitMarks } from './split-marks';\n\n// Removes empty marks that contain no content.\nfunction removeEmptyMarks(node: Nodes): void {\n if (node.isMark && node.isEmpty) {\n node.remove();\n return;\n }\n for (const child of node.getWalker()) {\n if (child.isMark && child.isEmpty) {\n child.remove();\n }\n }\n}\n\n// Returns an element copied from each last child of the descendants of the specified node.\nfunction copyNestedMarks(node: Nodes, tagName?: string): Nodes | null {\n if (!node.isMark || !tagName) {\n return null;\n }\n let newMark = node.clone();\n let child = node.last();\n while (child.length > 0) {\n if (child.isMark && child.name !== tagName) {\n const newChild = child.clone();\n newMark.append(newChild);\n newMark = newChild;\n }\n child = child.last();\n }\n if (newMark.name === tagName) {\n if (newMark.first().length > 0) {\n newMark = newMark.first();\n } else {\n return null;\n }\n }\n return newMark;\n}\n\n// Removes the specified marks from the range.\nexport function removeMark(range: Range, value?: string): void {\n if (range.commonAncestor.isOutside) {\n return;\n }\n let tagName;\n if (value) {\n const valueNode = query(value);\n tagName = valueNode.name;\n }\n if (range.isCollapsed) {\n if (range.isBox) {\n return;\n }\n if (tagName && range.commonAncestor.closest(tagName).length === 0) {\n return;\n }\n const parts = splitMarks(range, false);\n if (!parts.left) {\n return;\n }\n if (parts.right) {\n removeEmptyMarks(parts.right);\n }\n const zeroWidthSpace = new Nodes(document.createTextNode('\\u200B'));\n const newMark = copyNestedMarks(parts.left, tagName);\n if (!newMark) {\n parts.left.after(zeroWidthSpace);\n removeEmptyMarks(parts.left);\n if (zeroWidthSpace.prev().isText) {\n range.setStartAfter(zeroWidthSpace.prev());\n range.collapseToStart();\n zeroWidthSpace.remove();\n return;\n }\n range.setStartAfter(zeroWidthSpace);\n range.collapseToStart();\n return;\n }\n appendDeepest(newMark, zeroWidthSpace);\n parts.left.after(newMark);\n removeEmptyMarks(parts.left);\n range.shrinkAfter(newMark);\n return;\n }\n splitMarks(range);\n const marks = range.getMarks();\n const bookmark = insertBookmark(range);\n for (const mark of marks) {\n if (!tagName || mark.name === tagName) {\n const parentNode = mark.parent();\n mark.remove(!mark.isEmpty);\n if (parentNode.length > 0) {\n parentNode.get(0).normalize();\n }\n }\n }\n removeZWS(range.commonAncestor);\n toBookmark(range, bookmark);\n}\n","import { query } from '../utils/query';\nimport { removeBr } from '../utils/remove-br';\nimport { Nodes } from '../models/nodes';\nimport { Range } from '../models/range';\nimport { insertNode } from './insert-node';\nimport { splitMarks } from './split-marks';\nimport { insertBookmark } from './insert-bookmark';\nimport { toBookmark } from './to-bookmark';\n\n// Inserts a link element into the specified range.\nexport function insertLink(range: Range, value: string | Nodes): Nodes | null {\n if (range.commonAncestor.isOutside) {\n return null;\n }\n const valueNode = query(value);\n if (range.isCollapsed) {\n let linkNode = range.commonAncestor.closest('a');\n if (linkNode.length === 0) {\n linkNode = valueNode.clone(true);\n const block = range.startNode.closestBlock();\n removeBr(block);\n insertNode(range, linkNode);\n return linkNode;\n }\n const url = valueNode.attr('href');\n if (url !== '') {\n linkNode.attr({\n href: valueNode.attr('href'),\n });\n }\n return linkNode;\n }\n splitMarks(range);\n const bookmark = insertBookmark(range);\n for (const child of range.commonAncestor.getWalker()) {\n if (child.name === 'a' && range.intersectsNode(child)) {\n child.remove(true);\n }\n }\n const linkNode = valueNode.clone(false);\n bookmark.anchor.after(linkNode);\n let node = linkNode.next();\n while(node.length > 0) {\n const nextNode = node.next();\n if (!node.isMark && !node.isText) {\n break;\n }\n linkNode.append(node);\n node = nextNode;\n }\n if (linkNode.first().length === 0) {\n linkNode.remove();\n }\n toBookmark(range, bookmark);\n return linkNode;\n}\n","import { safeTemplate } from '../utils/safe-template';\nimport { query } from '../utils/query';\nimport { Nodes } from '../models/nodes';\n\nexport type ButtonConfig = {\n root: Nodes;\n name: string;\n icon?: string;\n text?: string;\n tooltip?: string;\n tabIndex?: number,\n onClick: () => void;\n}\n\nexport class Button {\n private config: ButtonConfig;\n\n private root: Nodes;\n\n public node: Nodes;\n\n constructor(config: ButtonConfig) {\n this.config = config;\n this.root = config.root;\n this.node = query(safeTemplate`\n <button type=\"button\" name=\"${config.name}\" class=\"lake-button\" />\n `);\n if (config.tabIndex !== undefined) {\n this.node.attr('tabindex', config.tabIndex.toString());\n }\n }\n\n public render(): void {\n const config = this.config;\n const buttonNode = this.node;\n buttonNode.addClass(`lake-${config.text ? 'text' : 'icon'}-button`);\n if (config.tooltip) {\n buttonNode.attr('title', config.tooltip);\n }\n if (config.icon) {\n buttonNode.append(config.icon);\n }\n if (config.text) {\n buttonNode.append(`<span>${config.text}</span>`);\n }\n this.root.append(buttonNode);\n buttonNode.on('mouseenter', () => {\n if (buttonNode.attr('disabled')) {\n return;\n }\n if (buttonNode.hasClass('lake-button-selected')) {\n return;\n }\n buttonNode.addClass('lake-button-hovered');\n });\n buttonNode.on('mouseleave', () => {\n if (buttonNode.attr('disabled')) {\n return;\n }\n buttonNode.removeClass('lake-button-hovered');\n });\n buttonNode.on('click', event => {\n event.preventDefault();\n config.onClick();\n });\n }\n}\n","import { Base64 } from 'js-base64';\nimport { NativeNode } from '../types/native';\nimport { DropdownItem, DropdownMenuItem } from '../types/dropdown';\nimport { icons } from '../icons';\nimport { encode } from '../utils/encode';\nimport { template } from '../utils/template';\nimport { safeTemplate } from '../utils/safe-template';\nimport { query } from '../utils/query';\nimport { Nodes } from '../models/nodes';\n\nexport type DropdownConfig = DropdownItem & {\n root: Nodes;\n tabIndex?: number;\n onSelect: (value: string) => void;\n}\n\nexport class Dropdown {\n private config: DropdownConfig;\n\n private root: Nodes;\n\n public node: Nodes;\n\n constructor(config: DropdownConfig) {\n this.config = config;\n this.root = config.root;\n this.node = query(safeTemplate`\n <div class=\"lake-dropdown lake-${config.menuType}-dropdown\" name=\"${config.name}\">\n <button type=\"button\" name=\"${config.name}\" class=\"lake-dropdown-title\">\n <div class=\"lake-dropdown-${config.icon ? 'icon' : 'text'}\"></div>\n <div class=\"lake-dropdown-down-icon\"></div>\n </button>\n </div>\n `);\n if (config.tabIndex !== undefined) {\n const titleNode = this.node.find('.lake-dropdown-title');\n titleNode.attr('tabindex', config.tabIndex.toString());\n }\n }\n\n // Returns the value of the node.\n public static getValue(node: Nodes): string[] {\n const value = node.attr('value');\n if (value === '') {\n return [];\n }\n return JSON.parse(Base64.decode(value));\n }\n\n // Updates the value of the node.\n public static setValue(node: Nodes, value: string[]): void {\n node.attr('value', Base64.encode(JSON.stringify(value)));\n }\n\n public static getMenuMap(menuItems: DropdownMenuItem[]): Map<string, string> {\n const menuMap: Map<string, string> = new Map();\n for (const menuItem of menuItems) {\n // remove HTML tags\n const text = menuItem.text.replace(/<[^>]*>/g, '');\n menuMap.set(menuItem.value, text);\n }\n return menuMap;\n }\n\n private updateColorAccent(titleNode: Nodes, value: string): void {\n const svgNode = titleNode.find('.lake-dropdown-icon svg').eq(1);\n const lineNode = svgNode.find('line');\n if (lineNode.length > 0) {\n lineNode.attr('stroke', value);\n } else {\n svgNode.find('path').attr('fill', value);\n }\n }\n\n private apppendMenuItems(menuNode: Nodes): void {\n const config = this.config;\n for (const menuItem of config.menuItems) {\n const listContent = template`\n <li value=\"${encode(menuItem.value)}\">\n <div class=\"lake-dropdown-menu-text\">${menuItem.text}</div>\n </li>\n `;\n const listNode = query(listContent);\n menuNode.append(listNode);\n if (config.menuType === 'color') {\n listNode.attr('title', menuItem.text);\n listNode.find('.lake-dropdown-menu-text').css('background-color', menuItem.value);\n }\n if (menuItem.icon) {\n const menuIconNode = query('<div class=\"lake-dropdown-menu-icon\"></div>');\n menuIconNode.append(menuItem.icon);\n listNode.prepend(menuIconNode);\n }\n const checkIcon = icons.get('check');\n if (checkIcon) {\n const checkNode = query('<div class=\"lake-dropdown-menu-check\"></div>');\n checkNode.append(checkIcon);\n listNode.prepend(checkNode);\n }\n }\n }\n\n private documentClickListener = (event: Event) => {\n const targetNode = new Nodes(event.target as Element);\n const titleNode = this.node.find('.lake-dropdown-title');\n const menuNode = this.node.find('.lake-dropdown-menu');\n if (targetNode.closest('.lake-dropdown-title').get(0) === titleNode.get(0)) {\n return;\n }\n menuNode.hide();\n document.removeEventListener('click', this.documentClickListener);\n };\n\n private showMenu(): void {\n const config = this.config;\n const dropdownNode = this.node;\n const menuNode = dropdownNode.find('.lake-dropdown-menu');\n if (dropdownNode.attr('disabled')) {\n return;\n }\n const currentValues = Dropdown.getValue(dropdownNode);\n menuNode.find('.lake-dropdown-menu-check').css('visibility', 'hidden');\n menuNode.find('li').each(node => {\n const listNode = query(node);\n listNode.on('mouseenter', () => {\n if (listNode.hasClass('lake-dropdown-item-selected')) {\n return;\n }\n listNode.addClass('lake-dropdown-item-hovered');\n });\n listNode.on('mouseleave', () => {\n listNode.removeClass('lake-dropdown-item-hovered');\n });\n if (currentValues.indexOf(listNode.attr('value')) >= 0) {\n listNode.find('.lake-dropdown-menu-check').css('visibility', 'visible');\n }\n });\n menuNode.css('visibility', 'hidden');\n menuNode.show(config.menuType === 'color' ? 'flex' : 'block');\n const dropdownNativeNode = dropdownNode.get(0) as HTMLElement;\n const dropdownRect = dropdownNativeNode.getBoundingClientRect();\n if (dropdownRect.x + menuNode.width() + 50 > window.innerWidth) {\n menuNode.css('left', 'auto');\n menuNode.css('right', '0');\n } else {\n menuNode.css('left', '');\n menuNode.css('right', '');\n }\n menuNode.css('visibility', '');\n document.addEventListener('click', this.documentClickListener);\n }\n\n private bindEvents(): void {\n const config = this.config;\n const dropdownNode = this.node;\n const titleNode = dropdownNode.find('.lake-dropdown-title');\n const textNode = titleNode.find('.lake-dropdown-text');\n const iconNode = titleNode.find('.lake-dropdown-icon');\n const downIconNode = titleNode.find('.lake-dropdown-down-icon');\n const menuNode = dropdownNode.find('.lake-dropdown-menu');\n if (config.menuType === 'color') {\n iconNode.on('mouseenter', () => {\n if (dropdownNode.attr('disabled')) {\n return;\n }\n iconNode.addClass('lake-dropdown-icon-hovered');\n });\n iconNode.on('mouseleave', () => {\n iconNode.removeClass('lake-dropdown-icon-hovered');\n });\n downIconNode.on('mouseenter', () => {\n if (dropdownNode.attr('disabled')) {\n return;\n }\n downIconNode.addClass('lake-dropdown-down-icon-hovered');\n });\n downIconNode.on('mouseleave', () => {\n downIconNode.removeClass('lake-dropdown-down-icon-hovered');\n });\n } else {\n titleNode.on('mouseenter', () => {\n if (dropdownNode.attr('disabled')) {\n return;\n }\n titleNode.addClass('lake-dropdown-title-hovered');\n });\n titleNode.on('mouseleave', () => {\n titleNode.removeClass('lake-dropdown-title-hovered');\n });\n }\n if (config.menuType === 'color') {\n iconNode.on('click', event => {\n event.preventDefault();\n if (dropdownNode.attr('disabled')) {\n return;\n }\n const value = dropdownNode.attr('color') || config.defaultValue;\n config.onSelect(value);\n });\n }\n const triggerNode = (config.menuType === 'color' && downIconNode) ? downIconNode : titleNode;\n triggerNode.on('click', event => {\n event.preventDefault();\n this.showMenu();\n });\n menuNode.on('click', event => {\n event.preventDefault();\n const listItem = query(event.target as NativeNode).closest('li');\n const value = listItem.attr('value');\n Dropdown.setValue(dropdownNode, [value]);\n if (textNode.length > 0) {\n textNode.text(listItem.text());\n }\n if (config.menuType === 'color' && value !== '') {\n dropdownNode.attr('color', value);\n this.updateColorAccent(titleNode, value);\n }\n config.onSelect(value);\n menuNode.hide();\n document.removeEventListener('click', this.documentClickListener);\n });\n }\n\n public render(): void {\n const config = this.config;\n const dropdownNode = this.node;\n const titleNode = dropdownNode.find('.lake-dropdown-title');\n if (!config.downIcon) {\n titleNode.addClass('lake-dropdown-title-no-down');\n }\n titleNode.css('width', config.width);\n titleNode.attr('title', config.tooltip);\n const textNode = titleNode.find('.lake-dropdown-text');\n const iconNode = titleNode.find('.lake-dropdown-icon');\n if (config.icon) {\n iconNode.append(config.icon);\n }\n if (config.accentIcon) {\n iconNode.append(config.accentIcon);\n }\n const downIconNode = titleNode.find('.lake-dropdown-down-icon');\n if (config.downIcon) {\n downIconNode.append(config.downIcon);\n }\n const menuNode = query('<ul class=\"lake-dropdown-menu\" />');\n menuNode.addClass(`lake-${config.menuType}-dropdown-menu`);\n Dropdown.setValue(dropdownNode, [config.defaultValue]);\n if (textNode.length > 0) {\n const menuMap = Dropdown.getMenuMap(config.menuItems);\n textNode.text(menuMap.get(config.defaultValue) ?? config.defaultValue);\n }\n if (config.menuType === 'color') {\n this.updateColorAccent(titleNode, config.defaultValue);\n }\n this.apppendMenuItems(menuNode);\n dropdownNode.append(titleNode);\n dropdownNode.append(menuNode);\n this.root.append(dropdownNode);\n this.bindEvents();\n }\n\n public unmount(): void {\n this.node.remove();\n document.removeEventListener('click', this.documentClickListener);\n }\n}\n","/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return value != null && (type == 'object' || type == 'function');\n}\n\nmodule.exports = isObject;\n","var freeGlobal = require('./_freeGlobal');\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\nmodule.exports = root;\n","/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\nmodule.exports = freeGlobal;\n","var root = require('./_root');\n\n/**\n * Gets the timestamp of the number of milliseconds that have elapsed since\n * the Unix epoch (1 January 1970 00:00:00 UTC).\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Date\n * @returns {number} Returns the timestamp.\n * @example\n *\n * _.defer(function(stamp) {\n * console.log(_.now() - stamp);\n * }, _.now());\n * // => Logs the number of milliseconds it took for the deferred invocation.\n */\nvar now = function() {\n return root.Date.now();\n};\n\nmodule.exports = now;\n","/** Used to match a single whitespace character. */\nvar reWhitespace = /\\s/;\n\n/**\n * Used by `_.trim` and `_.trimEnd` to get the index of the last non-whitespace\n * character of `string`.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {number} Returns the index of the last non-whitespace character.\n */\nfunction trimmedEndIndex(string) {\n var index = string.length;\n\n while (index-- && reWhitespace.test(string.charAt(index))) {}\n return index;\n}\n\nmodule.exports = trimmedEndIndex;\n","var trimmedEndIndex = require('./_trimmedEndIndex');\n\n/** Used to match leading whitespace. */\nvar reTrimStart = /^\\s+/;\n\n/**\n * The base implementation of `_.trim`.\n *\n * @private\n * @param {string} string The string to trim.\n * @returns {string} Returns the trimmed string.\n */\nfunction baseTrim(string) {\n return string\n ? string.slice(0, trimmedEndIndex(string) + 1).replace(reTrimStart, '')\n : string;\n}\n\nmodule.exports = baseTrim;\n","var root = require('./_root');\n\n/** Built-in value references. */\nvar Symbol = root.Symbol;\n\nmodule.exports = Symbol;\n","var Symbol = require('./_Symbol');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */\nfunction getRawTag(value) {\n var isOwn = hasOwnProperty.call(value, symToStringTag),\n tag = value[symToStringTag];\n\n try {\n value[symToStringTag] = undefined;\n var unmasked = true;\n } catch (e) {}\n\n var result = nativeObjectToString.call(value);\n if (unmasked) {\n if (isOwn) {\n value[symToStringTag] = tag;\n } else {\n delete value[symToStringTag];\n }\n }\n return result;\n}\n\nmodule.exports = getRawTag;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\nfunction objectToString(value) {\n return nativeObjectToString.call(value);\n}\n\nmodule.exports = objectToString;\n","var Symbol = require('./_Symbol'),\n getRawTag = require('./_getRawTag'),\n objectToString = require('./_objectToString');\n\n/** `Object#toString` result references. */\nvar nullTag = '[object Null]',\n undefinedTag = '[object Undefined]';\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction baseGetTag(value) {\n if (value == null) {\n return value === undefined ? undefinedTag : nullTag;\n }\n return (symToStringTag && symToStringTag in Object(value))\n ? getRawTag(value)\n : objectToString(value);\n}\n\nmodule.exports = baseGetTag;\n","/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return value != null && typeof value == 'object';\n}\n\nmodule.exports = isObjectLike;\n","var baseGetTag = require('./_baseGetTag'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar symbolTag = '[object Symbol]';\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n return typeof value == 'symbol' ||\n (isObjectLike(value) && baseGetTag(value) == symbolTag);\n}\n\nmodule.exports = isSymbol;\n","var baseTrim = require('./_baseTrim'),\n isObject = require('./isObject'),\n isSymbol = require('./isSymbol');\n\n/** Used as references for various `Number` constants. */\nvar NAN = 0 / 0;\n\n/** Used to detect bad signed hexadecimal string values. */\nvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n/** Used to detect binary string values. */\nvar reIsBinary = /^0b[01]+$/i;\n\n/** Used to detect octal string values. */\nvar reIsOctal = /^0o[0-7]+$/i;\n\n/** Built-in method references without a dependency on `root`. */\nvar freeParseInt = parseInt;\n\n/**\n * Converts `value` to a number.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n * @example\n *\n * _.toNumber(3.2);\n * // => 3.2\n *\n * _.toNumber(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toNumber(Infinity);\n * // => Infinity\n *\n * _.toNumber('3.2');\n * // => 3.2\n */\nfunction toNumber(value) {\n if (typeof value == 'number') {\n return value;\n }\n if (isSymbol(value)) {\n return NAN;\n }\n if (isObject(value)) {\n var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n value = isObject(other) ? (other + '') : other;\n }\n if (typeof value != 'string') {\n return value === 0 ? value : +value;\n }\n value = baseTrim(value);\n var isBinary = reIsBinary.test(value);\n return (isBinary || reIsOctal.test(value))\n ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n : (reIsBadHex.test(value) ? NAN : +value);\n}\n\nmodule.exports = toNumber;\n","var isObject = require('./isObject'),\n now = require('./now'),\n toNumber = require('./toNumber');\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max,\n nativeMin = Math.min;\n\n/**\n * Creates a debounced function that delays invoking `func` until after `wait`\n * milliseconds have elapsed since the last time the debounced function was\n * invoked. The debounced function comes with a `cancel` method to cancel\n * delayed `func` invocations and a `flush` method to immediately invoke them.\n * Provide `options` to indicate whether `func` should be invoked on the\n * leading and/or trailing edge of the `wait` timeout. The `func` is invoked\n * with the last arguments provided to the debounced function. Subsequent\n * calls to the debounced function return the result of the last `func`\n * invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\n * invoked on the trailing edge of the timeout only if the debounced function\n * is invoked more than once during the `wait` timeout.\n *\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between `_.debounce` and `_.throttle`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to debounce.\n * @param {number} [wait=0] The number of milliseconds to delay.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=false]\n * Specify invoking on the leading edge of the timeout.\n * @param {number} [options.maxWait]\n * The maximum time `func` is allowed to be delayed before it's invoked.\n * @param {boolean} [options.trailing=true]\n * Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new debounced function.\n * @example\n *\n * // Avoid costly calculations while the window size is in flux.\n * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\n *\n * // Invoke `sendMail` when clicked, debouncing subsequent calls.\n * jQuery(element).on('click', _.debounce(sendMail, 300, {\n * 'leading': true,\n * 'trailing': false\n * }));\n *\n * // Ensure `batchLog` is invoked once after 1 second of debounced calls.\n * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });\n * var source = new EventSource('/stream');\n * jQuery(source).on('message', debounced);\n *\n * // Cancel the trailing debounced invocation.\n * jQuery(window).on('popstate', debounced.cancel);\n */\nfunction debounce(func, wait, options) {\n var lastArgs,\n lastThis,\n maxWait,\n result,\n timerId,\n lastCallTime,\n lastInvokeTime = 0,\n leading = false,\n maxing = false,\n trailing = true;\n\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n wait = toNumber(wait) || 0;\n if (isObject(options)) {\n leading = !!options.leading;\n maxing = 'maxWait' in options;\n maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;\n trailing = 'trailing' in options ? !!options.trailing : trailing;\n }\n\n function invokeFunc(time) {\n var args = lastArgs,\n thisArg = lastThis;\n\n lastArgs = lastThis = undefined;\n lastInvokeTime = time;\n result = func.apply(thisArg, args);\n return result;\n }\n\n function leadingEdge(time) {\n // Reset any `maxWait` timer.\n lastInvokeTime = time;\n // Start the timer for the trailing edge.\n timerId = setTimeout(timerExpired, wait);\n // Invoke the leading edge.\n return leading ? invokeFunc(time) : result;\n }\n\n function remainingWait(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime,\n timeWaiting = wait - timeSinceLastCall;\n\n return maxing\n ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke)\n : timeWaiting;\n }\n\n function shouldInvoke(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime;\n\n // Either this is the first call, activity has stopped and we're at the\n // trailing edge, the system time has gone backwards and we're treating\n // it as the trailing edge, or we've hit the `maxWait` limit.\n return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||\n (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));\n }\n\n function timerExpired() {\n var time = now();\n if (shouldInvoke(time)) {\n return trailingEdge(time);\n }\n // Restart the timer.\n timerId = setTimeout(timerExpired, remainingWait(time));\n }\n\n function trailingEdge(time) {\n timerId = undefined;\n\n // Only invoke if we have `lastArgs` which means `func` has been\n // debounced at least once.\n if (trailing && lastArgs) {\n return invokeFunc(time);\n }\n lastArgs = lastThis = undefined;\n return result;\n }\n\n function cancel() {\n if (timerId !== undefined) {\n clearTimeout(timerId);\n }\n lastInvokeTime = 0;\n lastArgs = lastCallTime = lastThis = timerId = undefined;\n }\n\n function flush() {\n return timerId === undefined ? result : trailingEdge(now());\n }\n\n function debounced() {\n var time = now(),\n isInvoking = shouldInvoke(time);\n\n lastArgs = arguments;\n lastThis = this;\n lastCallTime = time;\n\n if (isInvoking) {\n if (timerId === undefined) {\n return leadingEdge(lastCallTime);\n }\n if (maxing) {\n // Handle invocations in a tight loop.\n clearTimeout(timerId);\n timerId = setTimeout(timerExpired, wait);\n return invokeFunc(lastCallTime);\n }\n }\n if (timerId === undefined) {\n timerId = setTimeout(timerExpired, wait);\n }\n return result;\n }\n debounced.cancel = cancel;\n debounced.flush = flush;\n return debounced;\n}\n\nmodule.exports = debounce;\n","import { NativeSelection } from '../types/native';\nimport { KeyValue, AppliedItem } from '../types/object';\nimport { parseStyle } from '../utils/parse-style';\nimport { Nodes } from '../models/nodes';\nimport { Range } from '../models/range';\nimport { insertBookmark } from '../operations/insert-bookmark';\nimport { toBookmark } from '../operations/to-bookmark';\nimport { insertNode } from '../operations/insert-node';\nimport { insertFragment } from '../operations/insert-fragment';\nimport { insertContents } from '../operations/insert-contents';\nimport { deleteContents } from '../operations/delete-contents';\nimport { setBlocks } from '../operations/set-blocks';\nimport { splitBlock } from '../operations/split-block';\nimport { splitMarks } from '../operations/split-marks';\nimport { addMark } from '../operations/add-mark';\nimport { removeMark } from '../operations/remove-mark';\nimport { fixList } from '../operations/fix-list';\nimport { insertLink } from '../operations/insert-link';\n\n// Returns the attributes of the element as an key-value object.\nfunction getAttributes(node: Nodes): KeyValue {\n const nativeNode = node.get(0) as Element;\n const attributes: KeyValue = {};\n if (nativeNode.hasAttributes()) {\n for (const attr of nativeNode.attributes) {\n attributes[attr.name] = attr.value;\n }\n }\n return attributes;\n}\n\nfunction pushAncestralNodes(appliedItems: AppliedItem[], range: Range): void {\n let parentNode = range.startNode;\n if (parentNode.isText) {\n parentNode = parentNode.parent();\n }\n while (parentNode.length > 0) {\n if (!parentNode.isInside) {\n break;\n }\n appliedItems.push({\n node: parentNode,\n name: parentNode.name,\n attributes: getAttributes(parentNode),\n styles: parseStyle(parentNode.attr('style')),\n });\n parentNode = parentNode.parent();\n }\n}\n\nfunction pushNextNestedNodes(appliedItems: AppliedItem[], range: Range): void {\n const startNode = range.startNode;\n let nextNode;\n if (startNode.isText && startNode.text().length === range.startOffset) {\n const node = startNode.next();\n if (node.length > 0 && node.isElement) {\n nextNode = node;\n }\n }\n if (startNode.isElement) {\n const children = startNode.children();\n if (children.length > 0) {\n const node = children[range.startOffset];\n if (node && node.isElement) {\n nextNode = node;\n }\n }\n }\n if (nextNode) {\n let child = nextNode;\n while (child.length > 0) {\n if (child.isElement) {\n appliedItems.push({\n node: child,\n name: child.name,\n attributes: getAttributes(child),\n styles: parseStyle(child.attr('style')),\n });\n }\n child = child.first();\n }\n }\n}\n\nexport class Selection {\n // Represents the range of text selected by the user or the current position of the caret.\n private selection: NativeSelection;\n\n // Is the root element which has contenteditable=\"true\" attribute.\n public container: Nodes;\n\n // Is a saved range which is used to add it to the native selection later.\n public range: Range;\n\n constructor(container: Nodes) {\n const selection = window.getSelection();\n // When called on an <iframe> that is not displayed (e.g., where 'display: none' is set) Firefox will return null,\n // whereas other browsers will return a selection object with Selection.type set to None.\n if (!selection) {\n throw new Error('Selection object is null.');\n }\n this.selection = selection;\n this.container = container;\n this.range = this.getRangeFromNativeSelection();\n }\n\n // Returns the current selected range from the native selection.\n private getRangeFromNativeSelection(): Range {\n if (this.selection.rangeCount > 0) {\n const range = this.selection.getRangeAt(0);\n return new Range(range);\n }\n return new Range();\n }\n\n // Adds the saved range to the native selection.\n public addRangeToNativeSelection(): void {\n this.selection.removeAllRanges();\n this.selection.addRange(this.range.get());\n }\n\n // Synchronizes the saved range with the range of the native selection.\n public syncByRange(): void {\n const newRange = this.getRangeFromNativeSelection();\n if (this.range.get() === newRange.get()) {\n return;\n }\n this.range = newRange;\n }\n\n // Synchronizes the saved range with the range represented by the bookmark.\n public synByBookmark(): void {\n const range = this.range;\n const container = this.container;\n const boxFocus = container.find('lake-box[focus]');\n if (boxFocus.length > 0) {\n toBookmark(range, {\n anchor: new Nodes(),\n focus: boxFocus,\n });\n this.addRangeToNativeSelection();\n return;\n }\n const anchor = container.find('lake-bookmark[type=\"anchor\"]');\n const focus = container.find('lake-bookmark[type=\"focus\"]');\n toBookmark(range, {\n anchor,\n focus,\n });\n this.addRangeToNativeSelection();\n }\n\n public getAppliedItems(): AppliedItem[] {\n const appliedItems: AppliedItem[] = [];\n pushAncestralNodes(appliedItems, this.range);\n pushNextNestedNodes(appliedItems, this.range);\n return appliedItems;\n }\n\n public insertBookmark(): ReturnType<typeof insertBookmark> {\n return insertBookmark(this.range);\n }\n\n public toBookmark(bookmark: Parameters<typeof toBookmark>[1]): ReturnType<typeof toBookmark> {\n return toBookmark(this.range, bookmark);\n }\n\n public insertNode(node: Parameters<typeof insertNode>[1]): ReturnType<typeof insertNode> {\n return insertNode(this.range, node);\n }\n\n public insertFragment(fragment: Parameters<typeof insertFragment>[1]): ReturnType<typeof insertFragment> {\n return insertFragment(this.range, fragment);\n }\n\n public insertContents(value: Parameters<typeof insertContents>[1]): ReturnType<typeof insertContents> {\n return insertContents(this.range, value);\n }\n\n public deleteContents(): ReturnType<typeof deleteContents> {\n return deleteContents(this.range);\n }\n\n public setBlocks(value: Parameters<typeof setBlocks>[1]): ReturnType<typeof setBlocks> {\n return setBlocks(this.range, value);\n }\n\n public splitBlock(): ReturnType<typeof splitBlock> {\n return splitBlock(this.range);\n }\n\n public splitMarks(removeEmptyMark?: Parameters<typeof splitMarks>[1]): ReturnType<typeof splitMarks> {\n return splitMarks(this.range, removeEmptyMark);\n }\n\n public addMark(value: Parameters<typeof addMark>[1]): ReturnType<typeof addMark> {\n return addMark(this.range, value);\n }\n\n public removeMark(value?: Parameters<typeof removeMark>[1]): ReturnType<typeof removeMark> {\n return removeMark(this.range, value);\n }\n\n public fixList(): ReturnType<typeof fixList> {\n return fixList(this.range);\n }\n\n public insertLink(value: Parameters<typeof insertLink>[1]): ReturnType<typeof insertLink> {\n return insertLink(this.range, value);\n }\n}\n","import EventEmitter from 'eventemitter3';\nimport { AppliedItem } from '../types/object';\nimport { debug } from '../utils/debug';\nimport { Selection } from './selection';\n\ntype CommmandItem = {\n isDisabled?: (AppliedItems: AppliedItem[]) => boolean;\n isSelected?: (appliedItems: AppliedItem[]) => boolean;\n selectedValues?: (AppliedItems: AppliedItem[]) => string[];\n execute: (...data: any[]) => void;\n};\n\nexport class Command {\n private selection: Selection;\n\n private commandMap: Map<string, CommmandItem> = new Map();\n\n public event: EventEmitter = new EventEmitter();\n\n constructor(selection: Selection) {\n this.selection = selection;\n }\n\n public add(name: string, handler: CommmandItem) {\n this.commandMap.set(name, handler);\n }\n\n public getNames(): string[] {\n return Array.from(this.commandMap.keys());\n }\n\n public getItem(name: string): CommmandItem {\n const commandItem = this.commandMap.get(name);\n if (commandItem === undefined) {\n throw new Error(`Command '${name}' does not exist.`);\n }\n return commandItem;\n }\n\n public isDisabled(name: string): boolean {\n const commandItem = this.getItem(name);\n if (!commandItem.isDisabled) {\n return false;\n }\n const appliedItems = this.selection.getAppliedItems();\n return commandItem.isDisabled(appliedItems);\n }\n\n public isSelected(name: string): boolean {\n const commandItem = this.getItem(name);\n if (!commandItem.isSelected) {\n return false;\n }\n const appliedItems = this.selection.getAppliedItems();\n return commandItem.isSelected(appliedItems);\n }\n\n public selectedValues(name: string): string[] {\n const commandItem = this.getItem(name);\n if (!commandItem.selectedValues) {\n return [];\n }\n const appliedItems = this.selection.getAppliedItems();\n return commandItem.selectedValues(appliedItems);\n }\n\n public execute(name: string, ...data: any[]): void {\n const commandItem = this.getItem(name);\n this.event.emit('beforeexecute', name);\n commandItem.execute.apply(this, data);\n this.event.emit('execute', name);\n debug(`Command '${name}' executed`);\n }\n}\n","/*\n * JavaScript MD5\n * https://github.com/blueimp/JavaScript-MD5\n *\n * Copyright 2011, Sebastian Tschan\n * https://blueimp.net\n *\n * Licensed under the MIT license:\n * https://opensource.org/licenses/MIT\n *\n * Based on\n * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message\n * Digest Algorithm, as defined in RFC 1321.\n * Version 2.2 Copyright (C) Paul Johnston 1999 - 2009\n * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet\n * Distributed under the BSD License\n * See http://pajhome.org.uk/crypt/md5 for more info.\n */\n\n/* global define */\n\n/* eslint-disable strict */\n\n;(function ($) {\n 'use strict'\n\n /**\n * Add integers, wrapping at 2^32.\n * This uses 16-bit operations internally to work around bugs in interpreters.\n *\n * @param {number} x First integer\n * @param {number} y Second integer\n * @returns {number} Sum\n */\n function safeAdd(x, y) {\n var lsw = (x & 0xffff) + (y & 0xffff)\n var msw = (x >> 16) + (y >> 16) + (lsw >> 16)\n return (msw << 16) | (lsw & 0xffff)\n }\n\n /**\n * Bitwise rotate a 32-bit number to the left.\n *\n * @param {number} num 32-bit number\n * @param {number} cnt Rotation count\n * @returns {number} Rotated number\n */\n function bitRotateLeft(num, cnt) {\n return (num << cnt) | (num >>> (32 - cnt))\n }\n\n /**\n * Basic operation the algorithm uses.\n *\n * @param {number} q q\n * @param {number} a a\n * @param {number} b b\n * @param {number} x x\n * @param {number} s s\n * @param {number} t t\n * @returns {number} Result\n */\n function md5cmn(q, a, b, x, s, t) {\n return safeAdd(bitRotateLeft(safeAdd(safeAdd(a, q), safeAdd(x, t)), s), b)\n }\n /**\n * Basic operation the algorithm uses.\n *\n * @param {number} a a\n * @param {number} b b\n * @param {number} c c\n * @param {number} d d\n * @param {number} x x\n * @param {number} s s\n * @param {number} t t\n * @returns {number} Result\n */\n function md5ff(a, b, c, d, x, s, t) {\n return md5cmn((b & c) | (~b & d), a, b, x, s, t)\n }\n /**\n * Basic operation the algorithm uses.\n *\n * @param {number} a a\n * @param {number} b b\n * @param {number} c c\n * @param {number} d d\n * @param {number} x x\n * @param {number} s s\n * @param {number} t t\n * @returns {number} Result\n */\n function md5gg(a, b, c, d, x, s, t) {\n return md5cmn((b & d) | (c & ~d), a, b, x, s, t)\n }\n /**\n * Basic operation the algorithm uses.\n *\n * @param {number} a a\n * @param {number} b b\n * @param {number} c c\n * @param {number} d d\n * @param {number} x x\n * @param {number} s s\n * @param {number} t t\n * @returns {number} Result\n */\n function md5hh(a, b, c, d, x, s, t) {\n return md5cmn(b ^ c ^ d, a, b, x, s, t)\n }\n /**\n * Basic operation the algorithm uses.\n *\n * @param {number} a a\n * @param {number} b b\n * @param {number} c c\n * @param {number} d d\n * @param {number} x x\n * @param {number} s s\n * @param {number} t t\n * @returns {number} Result\n */\n function md5ii(a, b, c, d, x, s, t) {\n return md5cmn(c ^ (b | ~d), a, b, x, s, t)\n }\n\n /**\n * Calculate the MD5 of an array of little-endian words, and a bit length.\n *\n * @param {Array} x Array of little-endian words\n * @param {number} len Bit length\n * @returns {Array<number>} MD5 Array\n */\n function binlMD5(x, len) {\n /* append padding */\n x[len >> 5] |= 0x80 << len % 32\n x[(((len + 64) >>> 9) << 4) + 14] = len\n\n var i\n var olda\n var oldb\n var oldc\n var oldd\n var a = 1732584193\n var b = -271733879\n var c = -1732584194\n var d = 271733878\n\n for (i = 0; i < x.length; i += 16) {\n olda = a\n oldb = b\n oldc = c\n oldd = d\n\n a = md5ff(a, b, c, d, x[i], 7, -680876936)\n d = md5ff(d, a, b, c, x[i + 1], 12, -389564586)\n c = md5ff(c, d, a, b, x[i + 2], 17, 606105819)\n b = md5ff(b, c, d, a, x[i + 3], 22, -1044525330)\n a = md5ff(a, b, c, d, x[i + 4], 7, -176418897)\n d = md5ff(d, a, b, c, x[i + 5], 12, 1200080426)\n c = md5ff(c, d, a, b, x[i + 6], 17, -1473231341)\n b = md5ff(b, c, d, a, x[i + 7], 22, -45705983)\n a = md5ff(a, b, c, d, x[i + 8], 7, 1770035416)\n d = md5ff(d, a, b, c, x[i + 9], 12, -1958414417)\n c = md5ff(c, d, a, b, x[i + 10], 17, -42063)\n b = md5ff(b, c, d, a, x[i + 11], 22, -1990404162)\n a = md5ff(a, b, c, d, x[i + 12], 7, 1804603682)\n d = md5ff(d, a, b, c, x[i + 13], 12, -40341101)\n c = md5ff(c, d, a, b, x[i + 14], 17, -1502002290)\n b = md5ff(b, c, d, a, x[i + 15], 22, 1236535329)\n\n a = md5gg(a, b, c, d, x[i + 1], 5, -165796510)\n d = md5gg(d, a, b, c, x[i + 6], 9, -1069501632)\n c = md5gg(c, d, a, b, x[i + 11], 14, 643717713)\n b = md5gg(b, c, d, a, x[i], 20, -373897302)\n a = md5gg(a, b, c, d, x[i + 5], 5, -701558691)\n d = md5gg(d, a, b, c, x[i + 10], 9, 38016083)\n c = md5gg(c, d, a, b, x[i + 15], 14, -660478335)\n b = md5gg(b, c, d, a, x[i + 4], 20, -405537848)\n a = md5gg(a, b, c, d, x[i + 9], 5, 568446438)\n d = md5gg(d, a, b, c, x[i + 14], 9, -1019803690)\n c = md5gg(c, d, a, b, x[i + 3], 14, -187363961)\n b = md5gg(b, c, d, a, x[i + 8], 20, 1163531501)\n a = md5gg(a, b, c, d, x[i + 13], 5, -1444681467)\n d = md5gg(d, a, b, c, x[i + 2], 9, -51403784)\n c = md5gg(c, d, a, b, x[i + 7], 14, 1735328473)\n b = md5gg(b, c, d, a, x[i + 12], 20, -1926607734)\n\n a = md5hh(a, b, c, d, x[i + 5], 4, -378558)\n d = md5hh(d, a, b, c, x[i + 8], 11, -2022574463)\n c = md5hh(c, d, a, b, x[i + 11], 16, 1839030562)\n b = md5hh(b, c, d, a, x[i + 14], 23, -35309556)\n a = md5hh(a, b, c, d, x[i + 1], 4, -1530992060)\n d = md5hh(d, a, b, c, x[i + 4], 11, 1272893353)\n c = md5hh(c, d, a, b, x[i + 7], 16, -155497632)\n b = md5hh(b, c, d, a, x[i + 10], 23, -1094730640)\n a = md5hh(a, b, c, d, x[i + 13], 4, 681279174)\n d = md5hh(d, a, b, c, x[i], 11, -358537222)\n c = md5hh(c, d, a, b, x[i + 3], 16, -722521979)\n b = md5hh(b, c, d, a, x[i + 6], 23, 76029189)\n a = md5hh(a, b, c, d, x[i + 9], 4, -640364487)\n d = md5hh(d, a, b, c, x[i + 12], 11, -421815835)\n c = md5hh(c, d, a, b, x[i + 15], 16, 530742520)\n b = md5hh(b, c, d, a, x[i + 2], 23, -995338651)\n\n a = md5ii(a, b, c, d, x[i], 6, -198630844)\n d = md5ii(d, a, b, c, x[i + 7], 10, 1126891415)\n c = md5ii(c, d, a, b, x[i + 14], 15, -1416354905)\n b = md5ii(b, c, d, a, x[i + 5], 21, -57434055)\n a = md5ii(a, b, c, d, x[i + 12], 6, 1700485571)\n d = md5ii(d, a, b, c, x[i + 3], 10, -1894986606)\n c = md5ii(c, d, a, b, x[i + 10], 15, -1051523)\n b = md5ii(b, c, d, a, x[i + 1], 21, -2054922799)\n a = md5ii(a, b, c, d, x[i + 8], 6, 1873313359)\n d = md5ii(d, a, b, c, x[i + 15], 10, -30611744)\n c = md5ii(c, d, a, b, x[i + 6], 15, -1560198380)\n b = md5ii(b, c, d, a, x[i + 13], 21, 1309151649)\n a = md5ii(a, b, c, d, x[i + 4], 6, -145523070)\n d = md5ii(d, a, b, c, x[i + 11], 10, -1120210379)\n c = md5ii(c, d, a, b, x[i + 2], 15, 718787259)\n b = md5ii(b, c, d, a, x[i + 9], 21, -343485551)\n\n a = safeAdd(a, olda)\n b = safeAdd(b, oldb)\n c = safeAdd(c, oldc)\n d = safeAdd(d, oldd)\n }\n return [a, b, c, d]\n }\n\n /**\n * Convert an array of little-endian words to a string\n *\n * @param {Array<number>} input MD5 Array\n * @returns {string} MD5 string\n */\n function binl2rstr(input) {\n var i\n var output = ''\n var length32 = input.length * 32\n for (i = 0; i < length32; i += 8) {\n output += String.fromCharCode((input[i >> 5] >>> i % 32) & 0xff)\n }\n return output\n }\n\n /**\n * Convert a raw string to an array of little-endian words\n * Characters >255 have their high-byte silently ignored.\n *\n * @param {string} input Raw input string\n * @returns {Array<number>} Array of little-endian words\n */\n function rstr2binl(input) {\n var i\n var output = []\n output[(input.length >> 2) - 1] = undefined\n for (i = 0; i < output.length; i += 1) {\n output[i] = 0\n }\n var length8 = input.length * 8\n for (i = 0; i < length8; i += 8) {\n output[i >> 5] |= (input.charCodeAt(i / 8) & 0xff) << i % 32\n }\n return output\n }\n\n /**\n * Calculate the MD5 of a raw string\n *\n * @param {string} s Input string\n * @returns {string} Raw MD5 string\n */\n function rstrMD5(s) {\n return binl2rstr(binlMD5(rstr2binl(s), s.length * 8))\n }\n\n /**\n * Calculates the HMAC-MD5 of a key and some data (raw strings)\n *\n * @param {string} key HMAC key\n * @param {string} data Raw input string\n * @returns {string} Raw MD5 string\n */\n function rstrHMACMD5(key, data) {\n var i\n var bkey = rstr2binl(key)\n var ipad = []\n var opad = []\n var hash\n ipad[15] = opad[15] = undefined\n if (bkey.length > 16) {\n bkey = binlMD5(bkey, key.length * 8)\n }\n for (i = 0; i < 16; i += 1) {\n ipad[i] = bkey[i] ^ 0x36363636\n opad[i] = bkey[i] ^ 0x5c5c5c5c\n }\n hash = binlMD5(ipad.concat(rstr2binl(data)), 512 + data.length * 8)\n return binl2rstr(binlMD5(opad.concat(hash), 512 + 128))\n }\n\n /**\n * Convert a raw string to a hex string\n *\n * @param {string} input Raw input string\n * @returns {string} Hex encoded string\n */\n function rstr2hex(input) {\n var hexTab = '0123456789abcdef'\n var output = ''\n var x\n var i\n for (i = 0; i < input.length; i += 1) {\n x = input.charCodeAt(i)\n output += hexTab.charAt((x >>> 4) & 0x0f) + hexTab.charAt(x & 0x0f)\n }\n return output\n }\n\n /**\n * Encode a string as UTF-8\n *\n * @param {string} input Input string\n * @returns {string} UTF8 string\n */\n function str2rstrUTF8(input) {\n return unescape(encodeURIComponent(input))\n }\n\n /**\n * Encodes input string as raw MD5 string\n *\n * @param {string} s Input string\n * @returns {string} Raw MD5 string\n */\n function rawMD5(s) {\n return rstrMD5(str2rstrUTF8(s))\n }\n /**\n * Encodes input string as Hex encoded string\n *\n * @param {string} s Input string\n * @returns {string} Hex encoded string\n */\n function hexMD5(s) {\n return rstr2hex(rawMD5(s))\n }\n /**\n * Calculates the raw HMAC-MD5 for the given key and data\n *\n * @param {string} k HMAC key\n * @param {string} d Input string\n * @returns {string} Raw MD5 string\n */\n function rawHMACMD5(k, d) {\n return rstrHMACMD5(str2rstrUTF8(k), str2rstrUTF8(d))\n }\n /**\n * Calculates the Hex encoded HMAC-MD5 for the given key and data\n *\n * @param {string} k HMAC key\n * @param {string} d Input string\n * @returns {string} Raw MD5 string\n */\n function hexHMACMD5(k, d) {\n return rstr2hex(rawHMACMD5(k, d))\n }\n\n /**\n * Calculates MD5 value for a given string.\n * If a key is provided, calculates the HMAC-MD5 value.\n * Returns a Hex encoded string unless the raw argument is given.\n *\n * @param {string} string Input string\n * @param {string} [key] HMAC key\n * @param {boolean} [raw] Raw output switch\n * @returns {string} MD5 output\n */\n function md5(string, key, raw) {\n if (!key) {\n if (!raw) {\n return hexMD5(string)\n }\n return rawMD5(string)\n }\n if (!raw) {\n return hexHMACMD5(key, string)\n }\n return rawHMACMD5(key, string)\n }\n\n if (typeof define === 'function' && define.amd) {\n define(function () {\n return md5\n })\n } else if (typeof module === 'object' && module.exports) {\n module.exports = md5\n } else {\n $.md5 = md5\n }\n})(this)\n","import type { Box } from '../models/box';\n\nexport const boxInstances: Map<number, Map<number, Box>> = new Map();\n","import md5 from 'blueimp-md5';\nimport EventEmitter from 'eventemitter3';\nimport { NativeNode } from '../types/native';\nimport { boxInstances } from '../storage/box-instances';\nimport { debug } from '../utils/debug';\nimport { morph } from '../utils/morph';\nimport { Nodes } from '../models/nodes';\nimport { Box } from '../models/box';\nimport { HTMLParser } from '../parsers/html-parser';\nimport { insertBookmark } from '../operations/insert-bookmark';\nimport { Selection } from './selection';\n\n// Saves and controls the history of the value of the editor.\n// Example:\n// before initialization: value: 'a', list: [], index: 0, canUndo: false\n// after initialization: value: 'a', list: ['a'], index: 1, canUndo: false\n// inputs 'b': value: 'ab', list: ['a', 'ab'], index: 2, canUndo: true\n// inputs 'c': value: 'abc', list: ['a', 'ab', 'abc'], index: 3\n// inputs 'd': value: 'abcd', list: ['a', 'ab', 'abc', 'abcd'], index: 4\n// undoes: value: 'abc', list: ['a', 'ab', 'abc', 'abcd'], index: 3\n// undoes: value: 'ab', list: ['a', 'ab', 'abc', 'abcd'], index: 2\n// undoes: value: 'a', list: ['a', 'ab', 'abc', 'abcd'], index: 1, canUndo: false\n// redoes: value: 'ab', list: ['a', 'ab', 'abc', 'abcd'], index: 2, canRedo: true\n// inputs 'e': value: 'abe', list: ['a', 'ab', 'abe'], index: 3, canRedo: false\nexport class History {\n private selection: Selection;\n\n private container: Nodes;\n\n // an array for storing the history items\n private list: Nodes[] = [];\n\n // the next index of the list\n private index: number = 0;\n\n private canSave: boolean = true;\n\n public limit: number = 100;\n\n public event: EventEmitter = new EventEmitter();\n\n constructor(selection: Selection) {\n this.selection = selection;\n this.container = selection.container;\n }\n\n private removeBookmark(value: string): string {\n return value.replace(/(<lake-box[^>]+)\\s+focus=\"\\w+\"([^>]*>)/ig, '$1$2').\n replace(/<lake-bookmark\\s+type=\"anchor\">\\s*<\\/lake-bookmark>/ig, '').\n replace(/<lake-bookmark\\s+type=\"focus\">\\s*<\\/lake-bookmark>/ig, '');\n }\n\n private getValue(container: Nodes): string {\n return new HTMLParser(container).getHTML();\n }\n\n private addIdToBoxes(node: Nodes): void {\n node.find('lake-box').each(nativeNode => {\n const boxNode = new Nodes(nativeNode);\n const id = md5(`${boxNode.attr('type')}-${boxNode.attr('name')}-${boxNode.attr('value')}`);\n boxNode.attr('id', id);\n });\n }\n\n private removeIdfromBoxes(node: Nodes): void {\n node.find('lake-box').each(nativeNode => {\n const boxNode = new Nodes(nativeNode);\n boxNode.removeAttr('id');\n });\n }\n\n private morphContainer(sourceItem: Nodes): void {\n const container = this.container;\n const callbacks = {\n beforeChildrenUpdated: (oldNode: NativeNode) => {\n if (new Nodes(oldNode).name === 'lake-box') {\n return false;\n }\n },\n afterAttributeUpdated: (attributeName: string, nativeNode: NativeNode) => {\n const node = new Nodes(nativeNode);\n if (attributeName === 'value' && node.name === 'lake-box') {\n const instanceMap = boxInstances.get(container.id);\n if (!instanceMap) {\n return;\n }\n instanceMap.delete(node.id);\n }\n },\n };\n const otherContainer = sourceItem.clone(true);\n this.addIdToBoxes(container);\n this.addIdToBoxes(otherContainer);\n morph(container, otherContainer, {\n callbacks,\n });\n this.removeIdfromBoxes(container);\n this.removeIdfromBoxes(otherContainer);\n }\n\n private cloneContainer(): Nodes {\n const range = this.selection.range;\n const newContainer = this.container.clone(true);\n newContainer.find('lake-box').each(nativeNode => {\n const box = new Box(nativeNode);\n box.getContainer().empty();\n });\n if (range.commonAncestor.isOutside) {\n return newContainer;\n }\n if (range.isInsideBox) {\n return newContainer;\n }\n const startNodePath = range.startNode.path();\n const endNodePath = range.endNode.path();\n const newStartNode = newContainer.find(startNodePath);\n const newEndNode = newContainer.find(endNodePath);\n const newRange = range.clone();\n newRange.setStart(newStartNode, range.startOffset);\n newRange.setEnd(newEndNode, range.endOffset);\n insertBookmark(newRange);\n return newContainer;\n }\n\n public get count(): number {\n return this.list.length;\n }\n\n public get canUndo(): boolean {\n return this.index > 1 && !!this.list[this.index - 1];\n }\n\n public get canRedo(): boolean {\n return !!this.list[this.index];\n }\n\n public undo(): void {\n if (!this.list[this.index - 1]) {\n return;\n }\n this.selection.insertBookmark();\n const value = this.getValue(this.container);\n while (this.index > 0) {\n const prevItem = this.list[this.index - 1];\n if (!prevItem) {\n break;\n }\n const prevValue = this.getValue(prevItem);\n if (this.removeBookmark(prevValue) !== this.removeBookmark(value)) {\n this.morphContainer(prevItem);\n this.event.emit('undo', prevValue);\n break;\n }\n if (this.index === 1) {\n break;\n }\n this.index--;\n }\n this.selection.synByBookmark();\n debug(`History undone, the last index is ${this.index}`);\n }\n\n public redo(): void {\n if (!this.list[this.index]) {\n return;\n }\n this.selection.insertBookmark();\n const value = this.getValue(this.container);\n while (this.index < this.list.length) {\n const nextItem = this.list[this.index];\n if (!nextItem) {\n break;\n }\n this.index++;\n const nextValue = this.getValue(nextItem);\n if (this.removeBookmark(nextValue) !== this.removeBookmark(value)) {\n this.morphContainer(nextItem);\n this.event.emit('redo', nextValue);\n break;\n }\n }\n this.selection.synByBookmark();\n debug(`History redone, the last index is ${this.index}`);\n }\n\n public continue(): void {\n this.canSave = true;\n }\n\n public pause(): void {\n this.canSave = false;\n }\n\n public save(): void {\n if (!this.canSave) {\n return;\n }\n const item = this.cloneContainer();\n const value = this.getValue(item);\n if (\n this.list[this.index - 1] &&\n this.removeBookmark(this.getValue(this.list[this.index - 1])) === this.removeBookmark(value)\n ) {\n return;\n }\n this.list.splice(this.index, Infinity, item);\n this.index++;\n if (this.list.length > this.limit) {\n this.list.shift();\n this.index = this.list.length;\n }\n this.event.emit('save', value);\n debug(`History saved, the last index is ${this.index}`);\n }\n}\n","var t=[\"Shift\",\"Meta\",\"Alt\",\"Control\"],e=\"object\"==typeof navigator?navigator.platform:\"\",n=/Mac|iPod|iPhone|iPad/.test(e),r=n?\"Meta\":\"Control\",o=\"Win32\"===e?[\"Control\",\"Alt\"]:n?[\"Alt\"]:[];function i(t,e){return\"function\"==typeof t.getModifierState&&(t.getModifierState(e)||o.includes(e)&&t.getModifierState(\"AltGraph\"))}function a(t){return t.trim().split(\" \").map(function(t){var e=t.split(/\\b\\+/),n=e.pop();return[e=e.map(function(t){return\"$mod\"===t?r:t}),n]})}function u(e,n){var r;void 0===n&&(n={});var o=null!=(r=n.timeout)?r:1e3,u=Object.keys(e).map(function(t){return[a(t),e[t]]}),c=new Map,f=null;return function(e){e instanceof KeyboardEvent&&(u.forEach(function(n){var r=n[0],o=n[1],a=c.get(r)||r;!function(e,n){return!(n[1].toUpperCase()!==e.key.toUpperCase()&&n[1]!==e.code||n[0].find(function(t){return!i(e,t)})||t.find(function(t){return!n[0].includes(t)&&n[1]!==t&&i(e,t)}))}(e,a[0])?i(e,e.key)||c.delete(r):a.length>1?c.set(r,a.slice(1)):(c.delete(r),o(e))}),f&&clearTimeout(f),f=setTimeout(c.clear.bind(c),o))}}function c(t,e,n){var r;void 0===n&&(n={});var o=null!=(r=n.event)?r:\"keydown\",i=u(e,n);return t.addEventListener(o,i),function(){t.removeEventListener(o,i)}}export{u as createKeybindingsHandler,a as parseKeybinding,c as tinykeys};\n//# sourceMappingURL=tinykeys.module.js.map\n","import { createKeybindingsHandler } from 'tinykeys';\nimport { camelCase } from '../utils/camel-case';\nimport { Nodes } from '../models/nodes';\n\ntype EventItem = {\n type: string;\n listener: (event: Event) => void | boolean;\n};\n\nconst shortenedTypeMap = new Map([\n ['#', 'shift+#'],\n]);\n\nexport class Keystroke {\n private container: Nodes;\n\n private keydownEventList: EventItem[] = [];\n\n private keyupEventList: EventItem[] = [];\n\n constructor(container: Nodes) {\n this.container = container;\n }\n\n private normalizeType(type: string) {\n type = shortenedTypeMap.get(type) ?? type;\n type = type.replace(/(^|\\+|\\s)mod(\\+|\\s|$)/g, '$1$mod$2').\n replace(/shift|control|alt|meta|enter|tab|backspace|delete|space|escape|arrow-left|arrow-right|arrow-up|arrow-down/,\n (match: string) => match.charAt(0).toUpperCase() + camelCase(match.substring(1))).\n replace(/(^|\\+|\\s)([a-z])(\\+|\\s|$)/g,\n (match: string, p1: string, p2: string, p3: string) => `${p1}Key${p2.toUpperCase()}${p3}`);\n return type;\n }\n\n // Sets a keydown shortcut.\n public setKeydown(type: string, listener: EventListener) {\n type = this.normalizeType(type);\n const handler = createKeybindingsHandler({\n [type]: event => listener(event),\n });\n this.keydownEventList.push({\n type,\n listener,\n });\n this.container.on('keydown', handler);\n }\n\n // Sets a keyup shortcut.\n public setKeyup(type: string, listener: EventListener) {\n type = this.normalizeType(type);\n const handler = createKeybindingsHandler({\n [type]: event => listener(event),\n });\n this.keyupEventList.push({\n type,\n listener,\n });\n this.container.on('keyup', handler);\n }\n\n // Executes the keydown shortcuts.\n public keydown(type: string) {\n type = this.normalizeType(type);\n for (const item of this.keydownEventList) {\n if (item.type === type) {\n if (item.listener(new Event(type)) === false) {\n break;\n }\n }\n }\n }\n\n // Executes the keyup shortcuts.\n public keyup(type: string) {\n type = this.normalizeType(type);\n for (const item of this.keyupEventList) {\n if (item.type === type) {\n if (item.listener(new Event(type)) === false) {\n break;\n }\n }\n }\n }\n}\n","import debounce from 'lodash/debounce';\nimport EventEmitter from 'eventemitter3';\nimport { version } from '../package.json';\nimport { NativeNode } from './types/native';\nimport { UploadRequestMethod } from './types/request';\nimport { editors } from './storage/editors';\nimport { denormalizeValue, normalizeValue, query, debug } from './utils';\nimport { Nodes } from './models/nodes';\nimport { Box } from './models/box';\nimport { HTMLParser } from './parsers/html-parser';\nimport { insertBox } from './operations/insert-box';\nimport { removeBox } from './operations/remove-box';\nimport { Selection } from './managers/selection';\nimport { Command } from './managers/command';\nimport { History } from './managers/history';\nimport { Keystroke } from './managers/keystroke';\nimport { BoxManager } from './managers/box-manager';\nimport { Plugin } from './managers/plugin';\n\ntype EditorConfig = {\n root: string | Nodes | NativeNode;\n value?: string;\n readonly?: boolean;\n spellcheck?: boolean;\n tabIndex?: number;\n indentWithTab?: boolean;\n minChangeSize?: number;\n imageRequestMethod?: UploadRequestMethod;\n imageRequestAction?: string;\n imageRequestTypes?: string[];\n};\n\nconst defaultConfig = {\n value: '<p><br /><focus /></p>',\n readonly: false,\n spellcheck: false,\n tabIndex: 0,\n indentWithTab: true,\n minChangeSize: 5,\n imageRequestMethod: 'POST' as UploadRequestMethod,\n imageRequestAction: '/upload',\n imageRequestTypes: ['image/gif', 'image/jpeg', 'image/png', 'image/svg+xml'],\n};\n\nexport class Editor {\n public static version: string = version;\n\n public static box = new BoxManager();\n\n public static plugin = new Plugin();\n\n private unsavedInputData: string = '';\n\n public root: Nodes;\n\n public config: typeof defaultConfig;\n\n public containerWrapper: Nodes;\n\n public container: Nodes;\n\n public overlayContainer: Nodes;\n\n public popupContainer: Nodes;\n\n public isComposing: boolean = false;\n\n public readonly: boolean;\n\n public event: EventEmitter = new EventEmitter();\n\n public selection: Selection;\n\n public command: Command;\n\n public history: History;\n\n public keystroke: Keystroke;\n\n public box: BoxManager = Editor.box;\n\n constructor(config: EditorConfig) {\n if (!config.root) {\n throw new Error('The root of the config must be specified.');\n }\n this.root = query(config.root);\n this.config = {...defaultConfig, ...config};\n this.containerWrapper = query('<div class=\"lake-container-wrapper\" />');\n this.container = query('<div class=\"lake-container\" />');\n this.overlayContainer = query('<div class=\"lake-overlay\" />');\n this.popupContainer = query('<div class=\"lake-popup lake-custom-properties\" />');\n this.readonly = this.config.readonly;\n\n this.root.addClass('lake-custom-properties');\n this.container.attr({\n contenteditable: this.readonly ? 'false' : 'true',\n spellcheck: this.config.spellcheck ? 'true' : 'false',\n tabindex: this.config.tabIndex.toString(),\n });\n\n this.selection = new Selection(this.container);\n this.command = new Command(this.selection);\n this.history = new History(this.selection);\n this.keystroke = new Keystroke(this.container);\n\n editors.set(this.container.id, this);\n }\n\n private beforeunloadListener: EventListener = () => {\n this.commitUnsavedInputData();\n };\n\n private selectionchangeListener: EventListener = () => {\n this.selection.syncByRange();\n this.updateBoxSelectionStyle();\n this.emitStateChangeEvent();\n };\n\n private clickListener: EventListener = event => {\n const targetNode = new Nodes(event.target as Element);\n if (targetNode.closest('.lake-popup').length > 0) {\n return;\n }\n this.event.emit('click', targetNode);\n };\n\n private resizeListener: EventListener = () => {\n this.event.emit('resize');\n };\n\n private updateBoxSelectionStyle = debounce(() => {\n // The editor has been unmounted.\n if (this.root.first().length === 0) {\n return;\n }\n const range = this.selection.range;\n const clonedRange = range.clone();\n clonedRange.adaptBox();\n this.box.findAll(this).each(boxNode => {\n const box = new Box(boxNode);\n const boxContainer = box.getContainer();\n if (boxContainer.length === 0) {\n return;\n }\n if (range.compareBeforeNode(boxContainer) < 0 && range.compareAfterNode(boxContainer) > 0) {\n if (!(range.isCollapsed && range.startNode.get(0) === boxContainer.get(0) && range.startOffset === 0)) {\n boxContainer.removeClass('lake-box-selected');\n boxContainer.removeClass('lake-box-focused');\n boxContainer.addClass('lake-box-activated');\n return;\n }\n }\n if (clonedRange.intersectsNode(box.node)) {\n boxContainer.removeClass('lake-box-activated');\n if (range.isCollapsed) {\n boxContainer.removeClass('lake-box-selected');\n boxContainer.addClass('lake-box-focused');\n } else {\n boxContainer.removeClass('lake-box-focused');\n boxContainer.addClass('lake-box-selected');\n }\n return;\n }\n boxContainer.removeClass('lake-box-activated');\n boxContainer.removeClass('lake-box-focused');\n boxContainer.removeClass('lake-box-selected');\n });\n this.event.emit('boxselectionstylechange');\n }, 50, {\n leading: false,\n trailing: true,\n maxWait: 50,\n });\n\n private emitStateChangeEvent = debounce(() => {\n const commandNames = this.command.getNames();\n let appliedItems = this.selection.getAppliedItems();\n if (\n appliedItems.length > 0 &&\n appliedItems[0].node.closestContainer().get(0) !== this.container.get(0)\n ) {\n appliedItems = [];\n }\n const disabledNameMap: Map<string, boolean> = new Map();\n const selectedNameMap: Map<string, boolean> = new Map();\n const selectedValuesMap: Map<string, string[]> = new Map();\n if (appliedItems.length > 0) {\n for (const name of commandNames) {\n const commandItem = this.command.getItem(name);\n if (commandItem.isDisabled && commandItem.isDisabled(appliedItems)) {\n disabledNameMap.set(name, true);\n }\n if (commandItem.isSelected && commandItem.isSelected(appliedItems)) {\n selectedNameMap.set(name, true);\n }\n if (commandItem.selectedValues) {\n const values = commandItem.selectedValues(appliedItems);\n if (values.length > 0) {\n selectedValuesMap.set(name, values);\n }\n }\n }\n }\n this.event.emit('statechange', {\n appliedItems,\n disabledNameMap,\n selectedNameMap,\n selectedValuesMap,\n });\n }, 100, {\n leading: false,\n trailing: true,\n maxWait: 100,\n });\n\n private emitChangeEvent = (value: string) => {\n this.rectifyContent();\n this.emitStateChangeEvent();\n this.event.emit('change', value);\n };\n\n private inputInBoxStrip(): void {\n const selection = this.selection;\n const range = selection.range;\n const stripNode = range.startNode.closest('.lake-box-strip');\n const boxNode = stripNode.closest('lake-box');\n const box = new Box(boxNode);\n if (box.type === 'inline') {\n if (range.isBoxLeft) {\n range.setStartBefore(boxNode);\n range.collapseToStart();\n } else {\n range.setStartAfter(boxNode);\n range.collapseToStart();\n }\n } else {\n const paragraph = query('<p />');\n if (range.isBoxLeft) {\n boxNode.before(paragraph);\n } else {\n boxNode.after(paragraph);\n }\n range.shrinkAfter(paragraph);\n }\n const text = stripNode.text();\n stripNode.html('<br />');\n selection.insertNode(document.createTextNode(text));\n }\n\n private bindInputEvents(): void {\n this.container.on('compositionstart', () => {\n this.isComposing = true;\n });\n this.container.on('compositionend', () => {\n this.isComposing = false;\n });\n this.container.on('beforeinput', () => {\n const range = this.selection.range;\n if (range.isBoxLeft || range.isBoxRight) {\n this.commitUnsavedInputData();\n }\n });\n this.container.on('input', event => {\n const inputEvent = event as InputEvent;\n // Here setTimeout is necessary because isComposing is not false after ending composition.\n window.setTimeout(() => {\n const range = this.selection.range;\n if (range.isInsideBox) {\n return;\n }\n // isComposing is false after ending composition because compositionend event has been emitted.\n if (this.isComposing) {\n this.event.emit('input', inputEvent);\n return;\n }\n if (\n inputEvent.inputType === 'insertText' ||\n inputEvent.inputType === 'insertCompositionText'\n ) {\n if (range.isBoxLeft || range.isBoxRight) {\n this.inputInBoxStrip();\n } else {\n this.unsavedInputData += inputEvent.data ?? '';\n if (this.unsavedInputData.length < this.config.minChangeSize) {\n this.event.emit('input', inputEvent);\n return;\n }\n }\n }\n this.history.save();\n this.unsavedInputData = '';\n this.event.emit('input', inputEvent);\n }, 0);\n });\n this.command.event.on('beforeexecute', () => this.commitUnsavedInputData());\n }\n\n private bindHistoryEvents(): void {\n this.history.event.on('undo', value => {\n this.box.renderAll(this);\n this.emitChangeEvent(value);\n });\n this.history.event.on('redo', value => {\n this.box.renderAll(this);\n this.emitChangeEvent(value);\n });\n this.history.event.on('save', value => {\n this.box.rectifyInstances(this);\n this.emitChangeEvent(value);\n });\n }\n\n private bindFocusEvents(): void {\n this.container.on('focus', ()=> {\n this.root.addClass('lake-root-focused');\n });\n this.container.on('blur', ()=> {\n this.root.removeClass('lake-root-focused');\n });\n }\n\n // Fixes wrong content, especially empty tag.\n public rectifyContent(): void {\n let children = this.container.children();\n for (const child of children) {\n if ((child.isBlock || child.isMark) && child.html() === '') {\n child.remove();\n debug('Rectifying content: empty tag was removed');\n }\n }\n children = this.container.children();\n if (children.length === 0) {\n this.container.html('<p><br /></p>');\n this.selection.range.shrinkAfter(this.container);\n debug('Rectifying content: default paragraph was added');\n return;\n }\n if (children.length === 1) {\n const child = children[0];\n if (child.isVoid) {\n const paragraph = query('<p />');\n child.before(paragraph);\n paragraph.append(child);\n this.selection.range.shrinkAfter(paragraph);\n debug('Rectifying content: void element was wrapped in paragraph');\n }\n }\n }\n\n // Saves the input data which is unsaved.\n public commitUnsavedInputData(): void {\n if (this.unsavedInputData.length > 0) {\n this.history.save();\n this.unsavedInputData = '';\n }\n }\n\n // Updates some state before custom modifications.\n public prepareOperation(): void {\n this.commitUnsavedInputData();\n this.history.pause();\n }\n\n // Saves custom modifications to the history.\n public commitOperation(): void {\n this.history.continue();\n this.history.save();\n }\n\n // Sets focus on the editor area.\n public focus(): void {\n this.container.focus();\n }\n\n // Removes focus from the editor area.\n public blur(): void {\n this.container.blur();\n }\n\n // Sets the specified HTML string to the editor area.\n public setValue(value: string): void {\n value = normalizeValue(value);\n const htmlParser = new HTMLParser(value);\n const fragment = htmlParser.getFragment();\n this.container.empty();\n this.container.append(fragment);\n Editor.box.renderAll(this);\n this.selection.synByBookmark();\n }\n\n // Returns the contents from the editor.\n public getValue(): string {\n const bookmark = this.selection.insertBookmark();\n let value = new HTMLParser(this.container).getHTML();\n value = denormalizeValue(value);\n this.selection.toBookmark(bookmark);\n return value;\n }\n\n // Inserts a box into the position of the selection.\n public insertBox(\n boxName: Parameters<typeof insertBox>[1],\n boxValue?: Parameters<typeof insertBox>[2],\n ): Box {\n const box = insertBox(this.selection.range, boxName, boxValue);\n if (!box) {\n throw new Error(`Box '${boxName}' cannot be inserted outside the editor.`);\n }\n const instanceMap = this.box.getInstances(this);\n instanceMap.set(box.node.id, box);\n return box;\n }\n\n // Removes the selected box.\n public removeBox(): ReturnType<typeof removeBox> {\n const box = removeBox(this.selection.range);\n if (box) {\n const instanceMap = this.box.getInstances(this);\n instanceMap.delete(box.node.id);\n }\n return box;\n }\n\n // Renders an editor area and set default value to it.\n public render(): void {\n const value = normalizeValue(this.config.value);\n const htmlParser = new HTMLParser(value);\n const fragment = htmlParser.getFragment();\n this.root.empty();\n this.root.append(this.containerWrapper);\n this.containerWrapper.append(this.container);\n this.containerWrapper.append(this.overlayContainer);\n query(document.body).append(this.popupContainer);\n this.container.append(fragment);\n if (!this.readonly) {\n this.bindFocusEvents();\n this.focus();\n this.selection.synByBookmark();\n this.history.save();\n Editor.plugin.loadAll(this);\n }\n Editor.box.renderAll(this);\n if (!this.readonly) {\n window.addEventListener('beforeunload', this.beforeunloadListener);\n document.addEventListener('selectionchange', this.selectionchangeListener);\n this.bindInputEvents();\n this.bindHistoryEvents();\n }\n document.addEventListener('click', this.clickListener);\n window.addEventListener('resize', this.resizeListener);\n }\n\n // Destroys a rendered editor.\n public unmount(): void {\n this.root.empty();\n this.popupContainer.remove();\n if (!this.readonly) {\n window.removeEventListener('beforeunload', this.beforeunloadListener);\n document.removeEventListener('selectionchange', this.selectionchangeListener);\n }\n document.removeEventListener('click', this.clickListener);\n window.removeEventListener('resize', this.resizeListener);\n }\n}\n","import { BoxValue } from '../types/box';\nimport { Range } from '../models/range';\nimport { Box } from '../models/box';\nimport { insertFragment } from './insert-fragment';\nimport { splitBlock } from './split-block';\n\n// Inserts a box into the specified range.\nexport function insertBox(range: Range, boxName: string, boxValue?: BoxValue): Box | null {\n if (range.commonAncestor.isOutside) {\n return null;\n }\n const box = new Box(boxName);\n if (boxValue) {\n box.value = boxValue;\n }\n const fragment = document.createDocumentFragment();\n fragment.appendChild(box.node.get(0));\n // inline box\n if (box.type === 'inline') {\n insertFragment(range, fragment);\n box.render();\n range.selectBoxRight(box.node);\n return box;\n }\n // block box\n const parts = splitBlock(range);\n if (parts.left) {\n range.setEndAfter(parts.left);\n range.collapseToEnd();\n }\n if (parts.right && parts.right.isEmpty) {\n parts.right.remove();\n }\n insertFragment(range, fragment);\n box.render();\n range.selectBoxRight(box.node);\n if (parts.left && parts.left.isEmpty) {\n parts.left.remove();\n }\n return box;\n}\n","import { appendDeepest, query } from '../utils';\nimport { Range } from '../models/range';\nimport { Box } from '../models/box';\n\nexport function removeBox(range: Range): Box | null {\n if (range.commonAncestor.isOutside) {\n return null;\n }\n const boxNode = range.commonAncestor.closest('lake-box');\n if (boxNode.length === 0) {\n return null;\n }\n const box = new Box(boxNode);\n if (box.type === 'block') {\n const paragraph = query('<p><br /></p>');\n boxNode.before(paragraph);\n range.shrinkAfter(paragraph);\n box.unmount();\n boxNode.remove();\n return box;\n }\n range.setStartBefore(boxNode);\n range.collapseToStart();\n const parentNode = boxNode.parent();\n box.unmount();\n boxNode.remove();\n if (parentNode.isEmpty) {\n appendDeepest(parentNode, query('<br />'));\n range.shrinkAfter(parentNode);\n }\n return box;\n}\n","import type { Editor } from '../editor';\nimport { BoxComponent } from '../types/box';\nimport { boxes } from '../storage/boxes';\nimport { boxInstances } from '../storage/box-instances';\nimport { Nodes } from '../models/nodes';\nimport { Box } from '../models/box';\n\nexport class BoxManager {\n public add(component: BoxComponent) {\n boxes.set(component.name, component);\n }\n\n public remove(name: string) {\n boxes.delete(name);\n }\n\n public getNames(): string[] {\n return Array.from(boxes.keys());\n }\n\n public getInstances(editor: Editor): Map<number, Box> {\n let instanceMap = boxInstances.get(editor.container.id);\n if (!instanceMap) {\n instanceMap = new Map();\n boxInstances.set(editor.container.id, instanceMap);\n return instanceMap;\n }\n return instanceMap;\n }\n\n public rectifyInstances(editor: Editor) {\n const instanceMap = this.getInstances(editor);\n for (const box of instanceMap.values()) {\n if (!box.node.get(0).isConnected) {\n box.unmount();\n instanceMap.delete(box.node.id);\n }\n }\n }\n\n public findAll(editor: Editor): Nodes {\n return editor.container.find('lake-box');\n }\n\n public renderAll(editor: Editor): void {\n this.rectifyInstances(editor);\n const instanceMap = this.getInstances(editor);\n this.findAll(editor).each(boxNativeNode => {\n const boxNode = new Nodes(boxNativeNode);\n if (instanceMap.get(boxNode.id)) {\n return;\n }\n const box = new Box(boxNode);\n box.render();\n instanceMap.set(box.node.id, box);\n });\n }\n}\n","import type { Editor } from '../editor';\n\ntype PluginFunction = (editor: Editor) => void;\n\nexport class Plugin {\n private pluginList: PluginFunction[] = [];\n\n public add(plugin: PluginFunction) {\n this.pluginList.push(plugin);\n }\n\n public loadAll(editor: Editor) {\n this.pluginList.forEach(plugin => {\n plugin(editor);\n });\n }\n}\n","// --------------------------------------------------------------------------------------------------------------------\n// types --------------------------------------------------------------------------------------------------------------\n// --------------------------------------------------------------------------------------------------------------------\n// --------------------------------------------------------------------------------------------------------------------\n// implementation -----------------------------------------------------------------------------------------------------\n// --------------------------------------------------------------------------------------------------------------------\n// eslint-disable-next-line prettier/prettier\nconst removeEmptyValues = (object) => Object.fromEntries(\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nObject.entries(object)\n .map(([key, value]) => key !== 'i' && value && value != '0' && [key, value])\n .filter(Boolean));\n// --------------------------------------------------------------------------------------------------------------------\nconst trimAllValues = (part) => Object.fromEntries(Object.keys(part).map((key) => {\n const val = part[key];\n return [\n key,\n Array.isArray(val) ? val.map((v) => v === null || v === void 0 ? void 0 : v.trim()) : val === !!val ? val : val === null || val === void 0 ? void 0 : val.trim(),\n ];\n}));\n// --------------------------------------------------------------------------------------------------------------------\nconst parseArgumentPart = (text) => {\n const [keyPart = '', ...formatterKeys] = text.split('|');\n const [keyWithoutType = '', type] = keyPart.split(':');\n const [key, isOptional] = keyWithoutType.split('?');\n return { k: key, i: type, n: isOptional === '', f: formatterKeys };\n};\n// --------------------------------------------------------------------------------------------------------------------\nexport const isBasicPluralPart = (part) => !!(part.o || part.r);\nconst parsePluralPart = (content, lastAccessor) => {\n let [key, values] = content.split(':');\n if (!values) {\n values = key;\n key = lastAccessor;\n }\n const entries = values.split('|');\n const [zero, one, two, few, many, rest] = entries;\n const nrOfEntries = entries.filter((entry) => entry !== undefined).length;\n if (nrOfEntries === 1) {\n return { k: key, r: zero };\n }\n if (nrOfEntries === 2) {\n return { k: key, o: zero, r: one };\n }\n if (nrOfEntries === 3) {\n return { k: key, z: zero, o: one, r: two };\n }\n return { k: key, z: zero, o: one, t: two, f: few, m: many, r: rest };\n};\n// --------------------------------------------------------------------------------------------------------------------\nexport const REGEX_SWITCH_CASE = /^\\{.*\\}$/;\nexport const parseCases = (text) => Object.fromEntries(removeOuterBrackets(text)\n .split(',')\n .map((part) => part.split(':'))\n .reduce((accumulator, entry) => {\n if (entry.length === 2) {\n return [...accumulator, entry.map((entry) => entry.trim())];\n }\n // if we have a single part, this means that a comma `,` was present in the string and we need to combine the strings again\n ;\n accumulator[accumulator.length - 1][1] += ',' + entry[0];\n return accumulator;\n}, []));\n// --------------------------------------------------------------------------------------------------------------------\nconst REGEX_BRACKETS_SPLIT = /(\\{(?:[^{}]+|\\{(?:[^{}]+)*\\})*\\})/g;\nexport const removeOuterBrackets = (text) => text.substring(1, text.length - 1);\nexport const parseRawText = (rawText, optimize = true, firstKey = '', lastKey = '') => rawText\n .split(REGEX_BRACKETS_SPLIT)\n .map((part) => {\n if (!part.match(REGEX_BRACKETS_SPLIT)) {\n return part;\n }\n const content = removeOuterBrackets(part);\n if (content.startsWith('{')) {\n return parsePluralPart(removeOuterBrackets(content), lastKey);\n }\n const parsedPart = parseArgumentPart(content);\n lastKey = parsedPart.k || lastKey;\n !firstKey && (firstKey = lastKey);\n return parsedPart;\n})\n .map((part) => {\n if (typeof part === 'string')\n return part;\n if (!part.k)\n part.k = firstKey || '0';\n const trimmed = trimAllValues(part);\n return optimize ? removeEmptyValues(trimmed) : trimmed;\n});\n","import { REGEX_SWITCH_CASE, isBasicPluralPart, parseCases, } from '../../parser/src/basic.mjs';\n// --------------------------------------------------------------------------------------------------------------------\n// implementation -----------------------------------------------------------------------------------------------------\n// --------------------------------------------------------------------------------------------------------------------\nconst applyFormatters = (formatters, formatterKeys, initialValue) => formatterKeys.reduce((value, formatterKey) => {\n var _a, _b;\n return (_b = (formatterKey.match(REGEX_SWITCH_CASE)\n ? ((cases) => { var _a; return (_a = cases[value]) !== null && _a !== void 0 ? _a : cases['*']; })(parseCases(formatterKey))\n : (_a = formatters[formatterKey]) === null || _a === void 0 ? void 0 : _a.call(formatters, value))) !== null && _b !== void 0 ? _b : value;\n}, initialValue);\nconst getPlural = (pluralRules, { z, o, t, f, m, r }, value) => {\n switch (z && value == 0 ? 'zero' : pluralRules.select(value)) {\n case 'zero':\n return z;\n case 'one':\n return o;\n case 'two':\n return t;\n case 'few':\n return f !== null && f !== void 0 ? f : r;\n case 'many':\n return m !== null && m !== void 0 ? m : r;\n default:\n return r;\n }\n};\nconst REGEX_PLURAL_VALUE_INJECTION = /\\?\\?/g;\nconst applyArguments = (textParts, pluralRules, formatters, args) => textParts\n .map((part) => {\n if (typeof part === 'string') {\n return part;\n }\n const { k: key = '0', f: formatterKeys = [] } = part;\n const value = args[key];\n if (isBasicPluralPart(part)) {\n return ((typeof value === 'boolean' ? (value ? part.o : part.r) : getPlural(pluralRules, part, value)) || '').replace(REGEX_PLURAL_VALUE_INJECTION, value);\n }\n const formattedValue = formatterKeys.length ? applyFormatters(formatters, formatterKeys, value) : value;\n return ('' + (formattedValue !== null && formattedValue !== void 0 ? formattedValue : '')).trim();\n})\n .join('');\nexport const translate = (textParts, pluralRules, formatters, args) => {\n const firstArg = args[0];\n const isObject = firstArg && typeof firstArg === 'object' && firstArg.constructor === Object;\n const transformedArgs = (args.length === 1 && isObject ? firstArg : args);\n return applyArguments(textParts, pluralRules, formatters, transformedArgs);\n};\n// type TransformArgsArray<A extends Array<Record<string, unknown>>> = keyof A[0] extends `${number}`\n// \t? ToIndexBasedArgs<A>\n// \t: A\n// type ToIndexBasedArgs<A extends Array<Record<string, unknown>>, B extends keyof A[0] = keyof A[0]> = GetTypesFromRecord<\n// \tA[0],\n// \tSort<ToNumberArray<ToTuple<B>>>\n// >\n// type GetTypesFromRecordAsArray<A extends Record<string, unknown>, B extends unknown[]> = B extends [infer Item, ...infer Rest]\n// \t? [A[Item], ...XX<A, Rest>]\n// \t: []\n// type UnionToParm<U> = U extends any ? (k: U) => void : never\n// type UnionToSect<U> = UnionToParm<U> extends (k: infer I) => void ? I : never\n// type ExtractParm<F> = F extends { (a: infer A): void } ? A : never\n// type SpliceOne<Union> = Exclude<Union, ExtractOne<Union>>\n// type ExtractOne<Union> = ExtractParm<UnionToSect<UnionToParm<Union>>>\n// type ToTuple<Union> = ToTupleRec<Union, []>\n// type ToTupleRec<Union, Rslt extends any[]> = SpliceOne<Union> extends never\n// \t? [ExtractOne<Union>, ...Rslt]\n// \t: ToTupleRec<SpliceOne<Union>, [ExtractOne<Union>, ...Rslt]>\n// type GenList<N, A extends any[] = []> = N extends A['length'] ? A : GenList<N, [0, ...A]>\n// // Add lists of size: [1, 2] -> [[1, [_]], [2, [_, _]]]\n// type Expand<T extends any[]> = T extends [infer Head, ...infer Rest] ? [[Head, GenList<Head>], ...Expand<Rest>] : []\n// // Drop one from each list, remove whole pair for empty: [[1, [_]], [0, []], [2, [_, _]]] -> [[1, []], [2, [_]]]\n// type DropAndFilter<T> = T extends [infer First, ...infer Rest]\n// \t? First extends [any, []]\n// \t\t? DropAndFilter<Rest>\n// \t\t: First extends [infer N, [any, ...infer NREST]]\n// \t\t? [[N, NREST], ...DropAndFilter<Rest>]\n// \t\t: []\n// \t: []\n// // [[1, []], [2, [_]]] -> [1]\n// type FindEmpty<T> = T extends [infer First, ...infer Rest]\n// \t? First extends [infer N, []]\n// \t\t? [N, ...FindEmpty<Rest>]\n// \t\t: FindEmpty<Rest>\n// \t: []\n// // Sort expanded\n// type Condense<T extends [number, any[]][], Result extends number[] = []> = T extends []\n// \t? Result\n// \t: Condense<DropAndFilter<T>, [...Result, ...FindEmpty<T>]>\n// type Reverse<A extends any[]> = A extends [infer H, ...infer T] ? [...Reverse<T>, H] : []\n// type Sort<T extends any[], R = false> = R extends true ? Reverse<Condense<Expand<T>>> : Condense<Expand<T>>\n// type ToNumberArray<T extends unknown[]> = T extends [infer Item, ...infer Rest]\n// \t? [ToNumber<Item>, ...ToNumberArray<Rest>]\n// \t: []\n// type ToNumber<S, L extends number[] = []> = `${L['length']}` extends S ? L['length'] : ToNumber<S, [...L, 0]>\n","import { translate } from './core.mjs';\nimport { getPartsFromString } from './util.string.mjs';\nconst getTranslateInstance = (locale, formatters) => {\n const cache = {};\n const pluralRules = new Intl.PluralRules(locale);\n return (text, ...args) => translate(getPartsFromString(cache, text), pluralRules, formatters, args);\n};\n// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types, @typescript-eslint/no-explicit-any\nexport function i18nObject(locale, translations, formatters = {}) {\n return createProxy(translations, getTranslateInstance(locale, formatters));\n}\n// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types, @typescript-eslint/no-explicit-any\nexport function typesafeI18nObject(locale, translations, formatters = {}) {\n return createProxy(translations, getTranslateInstance(locale, formatters));\n}\nconst wrap = (proxyObject = {}, translateFn) => (typeof proxyObject === 'string'\n ? translateFn.bind(null, proxyObject)\n : Object.assign(Object.defineProperty(() => '', 'name', { writable: true }), proxyObject));\n/* PROXY-START */\nconst createProxy = (proxyObject, translateFn) => new Proxy(wrap(proxyObject, translateFn), {\n get: (target, key) => {\n if (key === Symbol.iterator)\n return [][Symbol.iterator].bind(Object.values(target).map((entry) => wrap(entry, translateFn)));\n return createProxy(target[key], translateFn);\n },\n});\n/* PROXY-END */\n\n","import { parseRawText } from '../../parser/src/basic.mjs';\nimport { translate } from './core.mjs';\nexport const getPartsFromString = (cache, text) => cache[text] || (cache[text] = parseRawText(text));\nconst translateString = (cache, pluralRules, formatters, text, ...args) => translate(getPartsFromString(cache, text), pluralRules, formatters, args);\nexport const i18nString = (locale, formatters = {}) => translateString.bind(null, {}, new Intl.PluralRules(locale), formatters);\nexport const typesafeI18nString = (locale, formatters = {}) => translateString.bind(null, {}, new Intl.PluralRules(locale), formatters);\n","import { i18nObject as initI18nObject, type FormattersInitializer } from 'typesafe-i18n';\nimport type { Formatters, Locales, Translations, TranslationFunctions } from './types';\n\nimport enUS from './en-US';\nimport zhCN from './zh-CN';\nimport ja from './ja';\nimport ko from './ko';\n\nconst localeTranslations = {\n 'en-US': enUS,\n 'zh-CN': zhCN,\n ja,\n ko,\n};\n\nconst locales: Locales[] = Object.keys(localeTranslations) as Locales[];\n\nconst loadedLocales: Record<Locales, Translations> = {} as Record<Locales, Translations>;\nconst loadedFormatters: Record<Locales, Formatters> = {} as Record<Locales, Formatters>;\n\nconst initFormatters: FormattersInitializer<Locales, Formatters> = () => {\n const formatters: Formatters = {\n // add your formatter functions here\n };\n return formatters;\n};\n\nconst loadFormatters = (locale: Locales): void => {\n loadedFormatters[locale] = initFormatters(locale);\n};\n\nconst loadLocale = (locale: Locales): void => {\n if (loadedLocales[locale]) {\n return;\n }\n loadedLocales[locale] = localeTranslations[locale] as Translations;\n loadFormatters(locale);\n};\n\nconst loadAllLocales = (): void => locales.forEach(loadLocale);\n\nconst i18nObject = (locale: Locales): TranslationFunctions =>\n initI18nObject<Locales, Translations, TranslationFunctions, Formatters>(\n locale,\n loadedLocales[locale],\n loadedFormatters[locale],\n );\n\nloadAllLocales();\n\nconst language = locales.indexOf(window.LAKE_LANGUAGE) >= 0 ? window.LAKE_LANGUAGE : 'en-US';\n\nexport const locale = i18nObject(language);\n","import type { BaseTranslation } from '../types';\nimport { modifierText } from '../../utils/modifier-text';\n\nexport default {\n toolbar: {\n undo: `Undo (${modifierText('mod+Z')})`,\n redo: `Redo (${modifierText('mod+Y')})`,\n selectAll: `Select all (${modifierText('mod+A')})`,\n paragraph: 'Paragraph',\n blockQuote: 'Block quotation',\n numberedList: 'Numbered list',\n bulletedList: 'Bulleted list',\n checklist: 'Checklist',\n alignLeft: 'Align left',\n alignCenter: 'Align center',\n alignRight: 'Align right',\n alignJustify: 'Align justify',\n increaseIndent: 'Increase indent',\n decreaseIndent: 'Decrease indent',\n bold: `Bold (${modifierText('mod+B')})`,\n italic: `Italic (${modifierText('mod+I')})`,\n underline: `Underline (${modifierText('mod+U')})`,\n strikethrough: 'Strikethrough',\n superscript: 'Superscript',\n subscript: 'Subscript',\n code: 'Inline code',\n removeFormat: 'Remove format',\n formatPainter: 'Format painter',\n link: 'Link',\n hr: 'Horizontal line',\n codeBlock: 'Code block',\n heading: 'Heading',\n heading1: 'Heading 1',\n heading2: 'Heading 2',\n heading3: 'Heading 3',\n heading4: 'Heading 4',\n heading5: 'Heading 5',\n heading6: 'Heading 6',\n list: 'List',\n align: 'Alignment',\n indent: 'Indent',\n fontFamily: 'Font family',\n fontSize: 'Font size',\n moreStyle: 'More style',\n fontColor: 'Font color',\n highlight: 'Highlight',\n image: 'Image',\n removeColor: 'Remove color',\n },\n link: {\n newLink: 'New link',\n url: 'Link URL',\n title: 'Link title',\n copy: 'Copy link to clipboard',\n open: 'Open link in new tab',\n save: 'Save',\n unlink: 'Remove link',\n },\n image: {\n view: 'Full screen',\n remove: 'Delete',\n previous: 'Previous',\n next: 'Next',\n close: 'Close (Esc)',\n loadingError: 'The image cannot be loaded',\n zoomOut: 'Zoom out',\n zoomIn: 'Zoom in',\n },\n codeBlock: {\n langType: 'Select language',\n },\n} satisfies BaseTranslation;\n","import type { Translation } from '../types';\nimport { modifierText } from '../../utils/modifier-text';\n\nexport default {\n toolbar: {\n undo: `撤消 (${modifierText('mod+Z')})`,\n redo: `重做 (${modifierText('mod+Y')})`,\n selectAll: `全选 (${modifierText('mod+A')})`,\n paragraph: '正文',\n blockQuote: '引用',\n numberedList: '编号',\n bulletedList: '项目符号',\n checklist: '任务列表',\n alignLeft: '左对齐',\n alignCenter: '居中',\n alignRight: '右对齐',\n alignJustify: '两端对齐',\n increaseIndent: '增加缩进',\n decreaseIndent: '减少缩进',\n bold: `粗体 (${modifierText('mod+B')})`,\n italic: `斜体 (${modifierText('mod+I')})`,\n underline: `下划线 (${modifierText('mod+U')})`,\n strikethrough: '删除线',\n superscript: '上标',\n subscript: '下标',\n code: '行内代码',\n removeFormat: '清除格式',\n formatPainter: '格式刷',\n link: '链接',\n hr: '分割线',\n codeBlock: '代码块',\n heading: '标题',\n heading1: '标题 1',\n heading2: '标题 2',\n heading3: '标题 3',\n heading4: '标题 4',\n heading5: '标题 5',\n heading6: '标题 6',\n list: '列表',\n align: '对齐方式',\n indent: '缩进',\n fontFamily: '字体',\n fontSize: '文字大小',\n moreStyle: '更多样式',\n fontColor: '文字颜色',\n highlight: '文字背景',\n image: '图片',\n removeColor: '默认',\n },\n link: {\n newLink: '新链接',\n url: '链接 URL',\n title: '链接文本',\n copy: '复制到剪贴板',\n open: '打开链接',\n save: '确定',\n unlink: '取消链接',\n },\n image: {\n view: '查看大图',\n remove: '删除',\n previous: '上一张',\n next: '下一张',\n close: '关闭 (Esc)',\n loadingError: '图片加载失败',\n zoomOut: '缩小',\n zoomIn: '放大',\n },\n codeBlock: {\n langType: '选择代码语言',\n },\n} satisfies Translation;\n","import type { Translation } from '../types';\nimport { modifierText } from '../../utils/modifier-text';\n\nexport default {\n toolbar: {\n undo: `元に戻す (${modifierText('mod+Z')})`,\n redo: `やり直し (${modifierText('mod+Y')})`,\n selectAll: `すべて選択 (${modifierText('mod+A')})`,\n paragraph: 'テキスト',\n blockQuote: 'ブロック引用',\n numberedList: '番号付きリスト',\n bulletedList: '箇条書きリスト',\n checklist: 'タスクリスト',\n alignLeft: '左揃え',\n alignCenter: '中心揃え',\n alignRight: '右揃え',\n alignJustify: '左右に並べ替え',\n increaseIndent: 'インデントを増やす',\n decreaseIndent: 'インデントを減らす',\n bold: `太字 (${modifierText('mod+B')})`,\n italic: `斜体 (${modifierText('mod+I')})`,\n underline: `下線 (${modifierText('mod+U')})`,\n strikethrough: '取り消し線',\n superscript: '上付き文字',\n subscript: '下付き文字',\n code: 'インラインコード',\n removeFormat: '形式を削除',\n formatPainter: '形式ペインタ',\n link: 'リンク',\n hr: '区切り線',\n codeBlock: 'コードブロック',\n heading: 'タイトル',\n heading1: 'タイトル 1',\n heading2: 'タイトル 2',\n heading3: 'タイトル 3',\n heading4: 'タイトル 4',\n heading5: 'タイトル 5',\n heading6: 'タイトル 6',\n list: 'リスト',\n align: '文字揃え',\n indent: 'インデント',\n fontFamily: 'フォント',\n fontSize: '文字サイズ',\n moreStyle: 'その他のスタイル',\n fontColor: '文字色',\n highlight: '文字の背景',\n image: '画像',\n removeColor: 'デフォルト',\n },\n link: {\n newLink: '新しいリンク',\n url: 'リンク URL',\n title: 'リンク文字',\n copy: 'クリップボードにコピー',\n open: 'リンクを開く',\n save: '確認',\n unlink: 'リンクを削除',\n },\n image: {\n view: '大きな画像を見る',\n remove: '削除',\n previous: '前の画像',\n next: '次の画像',\n close: '閉じる (Esc)',\n loadingError: '画像を読み込めません',\n zoomOut: '縮小',\n zoomIn: '拡大',\n },\n codeBlock: {\n langType: 'コード言語を選択',\n },\n} satisfies Translation;\n","import type { Translation } from '../types';\nimport { modifierText } from '../../utils/modifier-text';\n\nexport default {\n toolbar: {\n undo: `작업취소 (${modifierText('mod+Z')})`,\n redo: `작업재개 (${modifierText('mod+Y')})`,\n selectAll: `전체 선택 (${modifierText('mod+A')})`,\n paragraph: '텍스트',\n blockQuote: '인용문',\n numberedList: '순서 목록',\n bulletedList: '비순서 목록',\n checklist: '체크리스트',\n alignLeft: '왼쪽 정렬',\n alignCenter: '가운데 정렬',\n alignRight: '오른쪽 정렬',\n alignJustify: '좌우로 정렬',\n increaseIndent: '들여쓰기 증가',\n decreaseIndent: '들여쓰기 줄이기',\n bold: `굵게 (${modifierText('mod+B')})`,\n italic: `기울임꼴 (${modifierText('mod+I')})`,\n underline: `밑줄 (${modifierText('mod+U')})`,\n strikethrough: '취소선',\n superscript: '위첨자',\n subscript: '아래 첨자',\n code: '인라인 코드',\n removeFormat: '형식 지우기',\n formatPainter: '형식 페인터',\n link: '링크',\n hr: '구분선',\n codeBlock: '코드 블록',\n heading: '제목',\n heading1: '제목 1',\n heading2: '제목 2',\n heading3: '제목 3',\n heading4: '제목 4',\n heading5: '제목 5',\n heading6: '제목 6',\n list: '목록',\n align: '정렬',\n indent: '들여쓰기',\n fontFamily: '글꼴',\n fontSize: '글자 크기',\n moreStyle: '더 많은 스타일',\n fontColor: '글자 색상',\n highlight: '글자 배경',\n image: '이미지',\n removeColor: '기본색',\n },\n link: {\n newLink: '새 링크',\n url: '링크 URL',\n title: '링크 텍스트',\n copy: '클립보드에 복사',\n open: '링크 열기',\n save: '확인',\n unlink: '링크 제거',\n },\n image: {\n view: '큰 이미지 보기',\n remove: '삭제',\n previous: '이전 이미지',\n next: '다음 이미지',\n close: '닫기 (Esc)',\n loadingError: '이미지를 로드할 수 없습니다',\n zoomOut: '축소',\n zoomIn: '확대',\n },\n codeBlock: {\n langType: '코드언어 선택',\n },\n} satisfies Translation;\n","import { DropdownMenuItem } from '../types/dropdown';\nimport { icons } from '../icons';\nimport { locale } from '../i18n';\n\nexport const headingMenuItems: DropdownMenuItem[] = [\n {\n value: 'h1',\n text: `<span style=\"font-weight: bold; font-size: 26px;\">${locale.toolbar.heading1()}</span>`,\n },\n {\n value: 'h2',\n text: `<span style=\"font-weight: bold; font-size: 24px;\">${locale.toolbar.heading2()}</span>`,\n },\n {\n value: 'h3',\n text: `<span style=\"font-weight: bold; font-size: 22px;\">${locale.toolbar.heading3()}</span>`,\n },\n {\n value: 'h4',\n text: `<span style=\"font-weight: bold; font-size: 20px;\">${locale.toolbar.heading4()}</span>`,\n },\n {\n value: 'h5',\n text: `<span style=\"font-weight: bold; font-size: 18px;\">${locale.toolbar.heading5()}</span>`,\n },\n {\n value: 'h6',\n text: `<span style=\"font-weight: bold; font-size: 16px;\">${locale.toolbar.heading6()}</span>`,\n },\n {\n value: 'p',\n text: locale.toolbar.paragraph(),\n },\n];\n\nexport const listMenuItems: DropdownMenuItem[] = [\n {\n icon: icons.get('numberedList'),\n value: 'numbered',\n text: locale.toolbar.numberedList(),\n },\n {\n icon: icons.get('bulletedList'),\n value: 'bulleted',\n text: locale.toolbar.bulletedList(),\n },\n {\n icon: icons.get('checklist'),\n value: 'checklist',\n text: locale.toolbar.checklist(),\n },\n];\n\nexport const alignMenuItems: DropdownMenuItem[] = [\n {\n icon: icons.get('alignLeft'),\n value: 'left',\n text: locale.toolbar.alignLeft(),\n },\n {\n icon: icons.get('alignCenter'),\n value: 'center',\n text: locale.toolbar.alignCenter(),\n },\n {\n icon: icons.get('alignRight'),\n value: 'right',\n text: locale.toolbar.alignRight(),\n },\n {\n icon: icons.get('alignJustify'),\n value: 'justify',\n text: locale.toolbar.alignJustify(),\n },\n];\n\nexport const indentMenuItems: DropdownMenuItem[] = [\n {\n icon: icons.get('increaseIndent'),\n value: 'increase',\n text: locale.toolbar.increaseIndent(),\n },\n {\n icon: icons.get('decreaseIndent'),\n value: 'decrease',\n text: locale.toolbar.decreaseIndent(),\n },\n];\n\nexport const fontFamilyMenuItems: DropdownMenuItem[] = [\n {\n value: 'Arial',\n text: '<span style=\"font-family: Arial;\">Arial</span>',\n },\n {\n value: 'Arial Black',\n text: '<span style=\"font-family: \\'Arial Black\\';\">Arial Black</span>',\n },\n {\n value: 'Comic Sans MS',\n text: '<span style=\"font-family: \\'Comic Sans MS\\';\">Comic Sans MS</span>',\n },\n {\n value: 'Courier New',\n text: '<span style=\"font-family: \\'Courier New\\';\">Courier New</span>',\n },\n {\n value: 'Georgia',\n text: '<span style=\"font-family: Georgia;\">Georgia</span>',\n },\n {\n value: 'Helvetica',\n text: '<span style=\"font-family: Helvetica;\">Helvetica</span>',\n },\n {\n value: 'Impact',\n text: '<span style=\"font-family: Impact;\">Impact</span>',\n },\n {\n value: 'Segoe UI',\n text: '<span style=\"font-family: \\'Segoe UI\\';\">Segoe UI</span>',\n },\n {\n value: 'Tahoma',\n text: '<span style=\"font-family: Tahoma;\">Tahoma</span>',\n },\n {\n value: 'Times New Roman',\n text: '<span style=\"font-family: \\'Times New Roman\\';\">Times New Roman</span>',\n },\n {\n value: 'Trebuchet MS',\n text: '<span style=\"font-family: \\'Trebuchet MS\\';\">Trebuchet MS</span>',\n },\n {\n value: 'Verdana',\n text: '<span style=\"font-family: Verdana;\">Verdana</span>',\n },\n];\n\nexport const fontSizeMenuItems: DropdownMenuItem[] = [\n {\n value: '12px',\n text: '12px',\n },\n {\n value: '14px',\n text: '14px',\n },\n {\n value: '16px',\n text: '16px',\n },\n {\n value: '18px',\n text: '18px',\n },\n {\n value: '22px',\n text: '22px',\n },\n {\n value: '24px',\n text: '24px',\n },\n {\n value: '32px',\n text: '32px',\n },\n];\n\nexport const moreStyleMenuItems: DropdownMenuItem[] = [\n {\n icon: icons.get('italic'),\n value: 'italic',\n text: locale.toolbar.italic(),\n },\n {\n icon: icons.get('underline'),\n value: 'underline',\n text: locale.toolbar.underline(),\n },\n {\n icon: icons.get('strikethrough'),\n value: 'strikethrough',\n text: locale.toolbar.strikethrough(),\n },\n {\n icon: icons.get('superscript'),\n value: 'superscript',\n text: locale.toolbar.superscript(),\n },\n {\n icon: icons.get('subscript'),\n value: 'subscript',\n text: locale.toolbar.subscript(),\n },\n {\n icon: icons.get('code'),\n value: 'code',\n text: locale.toolbar.code(),\n },\n];\n\n// These colors are from Ant Design (https://ant.design/docs/spec/colors)\nconst colors: string[] = [\n // Dust Red, Volcano, Sunset Orange, Calendula Gold, Sunrise Yellow, Lime, Polar Green, Cyan, Daybreak Blue, Geek Blue, Golden Purple, Magenta\n '#f5222d', '#fa541c', '#fa8c16', '#faad14', '#fadb14', '#a0d911', '#52c41a', '#13c2c2', '#1677ff', '#2f54eb', '#722ed1', '#eb2f96', // color 6\n '#fff1f0', '#fff2e8', '#fff7e6', '#fffbe6', '#feffe6', '#fcffe6', '#f6ffed', '#e6fffb', '#e6f4ff', '#f0f5ff', '#f9f0ff', '#fff0f6', // color 1\n '#ffccc7', '#ffd8bf', '#ffe7ba', '#fff1b8', '#ffffb8', '#f4ffb8', '#d9f7be', '#b5f5ec', '#bae0ff', '#d6e4ff', '#efdbff', '#ffd6e7', // color 2\n '#ffa39e', '#ffbb96', '#ffd591', '#ffe58f', '#fffb8f', '#eaff8f', '#b7eb8f', '#87e8de', '#91caff', '#adc6ff', '#d3adf7', '#ffadd2', // color 3\n '#ff7875', '#ff9c6e', '#ffc069', '#ffd666', '#fff566', '#d3f261', '#95de64', '#5cdbd3', '#69b1ff', '#85a5ff', '#b37feb', '#ff85c0', // color 4\n '#ff4d4f', '#ff7a45', '#ffa940', '#ffc53d', '#ffec3d', '#bae637', '#73d13d', '#36cfc9', '#4096ff', '#597ef7', '#9254de', '#f759ab', // color 5\n '#cf1322', '#d4380d', '#d46b08', '#d48806', '#d4b106', '#7cb305', '#389e0d', '#08979c', '#0958d9', '#1d39c4', '#531dab', '#c41d7f', // color 7\n '#a8071a', '#ad2102', '#ad4e00', '#ad6800', '#ad8b00', '#5b8c00', '#237804', '#006d75', '#003eb3', '#10239e', '#391085', '#9e1068', // color 8\n '#820014', '#871400', '#873800', '#874d00', '#876800', '#3f6600', '#135200', '#00474f', '#002c8c', '#061178', '#22075e', '#780650', // color 9\n '#5c0011', '#610b00', '#612500', '#613400', '#614700', '#254000', '#092b00', '#002329', '#001d66', '#030852', '#120338', '#520339', // color 10\n // from gray-1 to gray-11, and gray-13\n '#000000', '#1f1f1f', '#262626', '#434343', '#595959', '#8c8c8c', '#bfbfbf', '#d9d9d9', '#f0f0f0', '#f5f5f5', '#fafafa', '#ffffff', // Neutral Color\n];\nexport const colorMenuItems: DropdownMenuItem[] = [\n {\n icon: icons.get('removeFormat'),\n value: '',\n text: locale.toolbar.removeColor(),\n },\n];\nfor (const color of colors) {\n colorMenuItems.push({\n value: color.toLowerCase(),\n text: color.toUpperCase(),\n });\n}\n","import { ToolbarItem } from '../types/toolbar';\nimport { icons } from '../icons';\nimport { locale } from '../i18n';\nimport {\n headingMenuItems,\n listMenuItems,\n alignMenuItems,\n indentMenuItems,\n fontFamilyMenuItems,\n fontSizeMenuItems,\n moreStyleMenuItems,\n colorMenuItems,\n} from './menu-items';\n\nconst tagPluginNameMap: Map<string, string> = new Map([\n ['strong', 'bold'],\n ['em', 'italic'],\n ['i', 'italic'],\n ['u', 'underline'],\n ['s', 'strikethrough'],\n ['sup', 'superscript'],\n ['sub', 'subscript'],\n ['code', 'code'],\n]);\n\nexport const toolbarItems: ToolbarItem[] = [\n {\n name: 'undo',\n type: 'button',\n icon: icons.get('undo'),\n tooltip: locale.toolbar.undo(),\n onClick: (editor, value) => {\n editor.command.execute(value);\n },\n },\n {\n name: 'redo',\n type: 'button',\n icon: icons.get('redo'),\n tooltip: locale.toolbar.redo(),\n onClick: (editor, value) => {\n editor.command.execute(value);\n },\n },\n {\n name: 'selectAll',\n type: 'button',\n icon: icons.get('selectAll'),\n tooltip: locale.toolbar.selectAll(),\n onClick: (editor, value) => {\n editor.command.execute(value);\n },\n },\n {\n name: 'paragraph',\n type: 'button',\n icon: icons.get('paragraph'),\n tooltip: locale.toolbar.paragraph(),\n isSelected: appliedItems => !!appliedItems.find(item => item.name === 'p'),\n onClick: editor => {\n editor.command.execute('heading', 'p');\n },\n },\n {\n name: 'blockQuote',\n type: 'button',\n icon: icons.get('blockQuote'),\n tooltip: locale.toolbar.blockQuote(),\n onClick: (editor, value) => {\n editor.command.execute(value);\n },\n },\n {\n name: 'numberedList',\n type: 'button',\n icon: icons.get('numberedList'),\n tooltip: locale.toolbar.numberedList(),\n isSelected: appliedItems => !!appliedItems.find(item => item.name === 'ol'),\n onClick: editor => {\n editor.command.execute('list', 'numbered');\n },\n },\n {\n name: 'bulletedList',\n type: 'button',\n icon: icons.get('bulletedList'),\n tooltip: locale.toolbar.bulletedList(),\n isSelected: appliedItems => !!appliedItems.find(item => item.name === 'ul' && !item.node.hasAttr('type')),\n onClick: editor => {\n editor.command.execute('list', 'bulleted');\n },\n },\n {\n name: 'checklist',\n type: 'button',\n icon: icons.get('checklist'),\n tooltip: locale.toolbar.checklist(),\n isSelected: appliedItems => !!appliedItems.find(item => item.name === 'ul' && item.node.attr('type') === 'checklist'),\n onClick: editor => {\n editor.command.execute('list', 'checklist');\n },\n },\n {\n name: 'alignLeft',\n type: 'button',\n icon: icons.get('alignLeft'),\n tooltip: locale.toolbar.alignLeft(),\n isSelected: appliedItems => !!appliedItems.find(item => item.node.isBlock && item.node.css('text-align') === 'left'),\n onClick: editor => {\n editor.command.execute('align', 'left');\n },\n },\n {\n name: 'alignCenter',\n type: 'button',\n icon: icons.get('alignCenter'),\n tooltip: locale.toolbar.alignCenter(),\n isSelected: appliedItems => !!appliedItems.find(item => item.node.isBlock && item.node.css('text-align') === 'center'),\n onClick: editor => {\n editor.command.execute('align', 'center');\n },\n },\n {\n name: 'alignRight',\n type: 'button',\n icon: icons.get('alignRight'),\n tooltip: locale.toolbar.alignRight(),\n isSelected: appliedItems => !!appliedItems.find(item => item.node.isBlock && item.node.css('text-align') === 'right'),\n onClick: editor => {\n editor.command.execute('align', 'right');\n },\n },\n {\n name: 'alignJustify',\n type: 'button',\n icon: icons.get('alignJustify'),\n tooltip: locale.toolbar.alignJustify(),\n isSelected: appliedItems => !!appliedItems.find(item => item.node.isBlock && item.node.css('text-align') === 'justify'),\n onClick: editor => {\n editor.command.execute('align', 'justify');\n },\n },\n {\n name: 'increaseIndent',\n type: 'button',\n icon: icons.get('increaseIndent'),\n tooltip: locale.toolbar.increaseIndent(),\n onClick: editor => {\n editor.command.execute('indent', 'increase');\n },\n },\n {\n name: 'decreaseIndent',\n type: 'button',\n icon: icons.get('decreaseIndent'),\n tooltip: locale.toolbar.decreaseIndent(),\n onClick: editor => {\n editor.command.execute('indent', 'decrease');\n },\n },\n {\n name: 'bold',\n type: 'button',\n icon: icons.get('bold'),\n tooltip: locale.toolbar.bold(),\n onClick: (editor, value) => {\n editor.command.execute(value);\n },\n },\n {\n name: 'italic',\n type: 'button',\n icon: icons.get('italic'),\n tooltip: locale.toolbar.italic(),\n onClick: (editor, value) => {\n editor.command.execute(value);\n },\n },\n {\n name: 'underline',\n type: 'button',\n icon: icons.get('underline'),\n tooltip: locale.toolbar.underline(),\n onClick: (editor, value) => {\n editor.command.execute(value);\n },\n },\n {\n name: 'strikethrough',\n type: 'button',\n icon: icons.get('strikethrough'),\n tooltip: locale.toolbar.strikethrough(),\n onClick: (editor, value) => {\n editor.command.execute(value);\n },\n },\n {\n name: 'superscript',\n type: 'button',\n icon: icons.get('superscript'),\n tooltip: locale.toolbar.superscript(),\n onClick: (editor, value) => {\n editor.command.execute(value);\n },\n },\n {\n name: 'subscript',\n type: 'button',\n icon: icons.get('subscript'),\n tooltip: locale.toolbar.subscript(),\n onClick: (editor, value) => {\n editor.command.execute(value);\n },\n },\n {\n name: 'code',\n type: 'button',\n icon: icons.get('code'),\n tooltip: locale.toolbar.code(),\n onClick: (editor, value) => {\n editor.command.execute(value);\n },\n },\n {\n name: 'removeFormat',\n type: 'button',\n icon: icons.get('removeFormat'),\n tooltip: locale.toolbar.removeFormat(),\n onClick: (editor, value) => {\n editor.command.execute(value);\n },\n },\n {\n name: 'formatPainter',\n type: 'button',\n icon: icons.get('formatPainter'),\n tooltip: locale.toolbar.formatPainter(),\n onClick: (editor, value) => {\n editor.command.execute(value);\n },\n },\n {\n name: 'link',\n type: 'button',\n icon: icons.get('link'),\n tooltip: locale.toolbar.link(),\n onClick: (editor, value) => {\n editor.command.execute(value);\n },\n },\n {\n name: 'hr',\n type: 'button',\n icon: icons.get('hr'),\n tooltip: locale.toolbar.hr(),\n onClick: (editor, value) => {\n editor.command.execute(value);\n },\n },\n {\n name: 'codeBlock',\n type: 'button',\n icon: icons.get('codeBlock'),\n tooltip: locale.toolbar.codeBlock(),\n onClick: (editor, value) => {\n editor.command.execute(value);\n },\n },\n {\n name: 'heading',\n type: 'dropdown',\n downIcon: icons.get('down'),\n defaultValue: 'p',\n tooltip: locale.toolbar.heading(),\n width: '100px',\n menuType: 'list',\n menuItems: headingMenuItems,\n onSelect: (editor, value) => {\n editor.command.execute('heading', value);\n },\n },\n {\n name: 'list',\n type: 'dropdown',\n downIcon: icons.get('down'),\n icon: icons.get('list'),\n defaultValue: '',\n tooltip: locale.toolbar.list(),\n width: 'auto',\n menuType: 'list',\n menuItems: listMenuItems,\n onSelect: (editor, value) => {\n editor.command.execute('list', value);\n },\n },\n {\n name: 'align',\n type: 'dropdown',\n downIcon: icons.get('down'),\n icon: icons.get('alignLeft'),\n defaultValue: '',\n tooltip: locale.toolbar.align(),\n width: 'auto',\n menuType: 'list',\n menuItems: alignMenuItems,\n onSelect: (editor, value) => {\n editor.command.execute('align', value);\n },\n },\n {\n name: 'indent',\n type: 'dropdown',\n downIcon: icons.get('down'),\n icon: icons.get('increaseIndent'),\n defaultValue: '',\n tooltip: locale.toolbar.indent(),\n width: 'auto',\n menuType: 'list',\n menuItems: indentMenuItems,\n onSelect: (editor, value) => {\n editor.command.execute('indent', value);\n },\n },\n {\n name: 'fontFamily',\n type: 'dropdown',\n downIcon: icons.get('down'),\n defaultValue: 'Segoe UI',\n tooltip: locale.toolbar.fontFamily(),\n width: '100px',\n menuType: 'list',\n menuItems: fontFamilyMenuItems,\n onSelect: (editor, value) => {\n editor.command.execute('fontFamily', value);\n },\n },\n {\n name: 'fontSize',\n type: 'dropdown',\n downIcon: icons.get('down'),\n defaultValue: '16px',\n tooltip: locale.toolbar.fontSize(),\n width: '65px',\n menuType: 'list',\n menuItems: fontSizeMenuItems,\n onSelect: (editor, value) => {\n editor.command.execute('fontSize', value);\n },\n },\n {\n name: 'moreStyle',\n type: 'dropdown',\n icon: icons.get('more'),\n defaultValue: '',\n tooltip: locale.toolbar.moreStyle(),\n width: 'auto',\n menuType: 'list',\n menuItems: moreStyleMenuItems,\n selectedValues: appliedItems => {\n const currentValues = [];\n for (const item of appliedItems) {\n if (item.node.isMark) {\n const name = tagPluginNameMap.get(item.name) ?? item.name;\n currentValues.push(name);\n }\n }\n return currentValues;\n },\n onSelect: (editor, value) => {\n editor.command.execute(value);\n },\n },\n {\n name: 'fontColor',\n type: 'dropdown',\n downIcon: icons.get('down'),\n icon: icons.get('fontColor'),\n accentIcon: icons.get('fontColorAccent'),\n defaultValue: '#f5222d',\n tooltip: locale.toolbar.fontColor(),\n width: 'auto',\n menuType: 'color',\n menuItems: colorMenuItems,\n onSelect: (editor, value) => {\n editor.command.execute('fontColor', value);\n },\n },\n {\n name: 'highlight',\n type: 'dropdown',\n downIcon: icons.get('down'),\n icon: icons.get('highlight'),\n accentIcon: icons.get('highlightAccent'),\n defaultValue: '#fadb14',\n tooltip: locale.toolbar.highlight(),\n width: 'auto',\n menuType: 'color',\n menuItems: colorMenuItems,\n onSelect: (editor, value) => {\n editor.command.execute('highlight', value);\n },\n },\n {\n name: 'image',\n type: 'upload',\n icon: icons.get('image'),\n tooltip: locale.toolbar.image(),\n accept: 'image/*',\n multiple: true,\n },\n];\n","import type { Editor } from '../editor';\nimport { debug } from '../utils/debug';\nimport { request } from '../utils/request';\nimport { Box } from '../models/box';\n\ntype Config = {\n editor: Editor;\n file: File;\n onError?: ()=> void;\n onSuccess?: ()=> void;\n};\n\nexport function uploadImage(config: Config): Box {\n const { editor, file, onError, onSuccess} = config;\n const { imageRequestMethod, imageRequestAction, imageRequestTypes } = editor.config;\n if (imageRequestTypes.indexOf(file.type) < 0) {\n throw new Error(`Cannot upload file because its type '${file.type}' is not found in ['${imageRequestTypes.join('\\', \\'')}'].`);\n }\n const box = editor.insertBox('image', {\n url: URL.createObjectURL(file),\n status: 'uploading',\n name: file.name,\n size: file.size,\n type: file.type,\n lastModified: file.lastModified,\n });\n const xhr = request({\n onProgress: e => {\n const percentNode = box.node.find('.lake-percent');\n const percent = Math.round(e.percent);\n percentNode.text(`${percent < 100 ? percent : 99} %`);\n },\n onError: (error, body) => {\n debug(error.toString(), body);\n box.updateValue('status', 'error');\n box.render();\n if (onError) {\n onError();\n }\n },\n onSuccess: body => {\n if (!body.url) {\n box.updateValue('status', 'error');\n box.render();\n if (onError) {\n onError();\n }\n return;\n }\n box.updateValue({\n status: 'done',\n url: body.url,\n });\n box.render();\n editor.history.save();\n if (onSuccess) {\n onSuccess();\n }\n },\n file,\n action: imageRequestAction,\n method: imageRequestMethod,\n });\n box.setData('xhr', xhr);\n return box;\n}\n","import type { Editor } from '../editor';\nimport { NativeNode } from '../types/native';\nimport { ToolbarButtonItem, ToolbarDropdownItem, ToolbarUploadItem, ToolbarItem } from '../types/toolbar';\nimport { toolbarItems } from '../config/toolbar-items';\nimport { safeTemplate } from '../utils/safe-template';\nimport { query } from '../utils/query';\nimport { Nodes } from '../models/nodes';\nimport { Button } from './button';\nimport { Dropdown } from './dropdown';\nimport { uploadImage } from './upload';\n\nconst defaultItems: string[] = [\n 'undo',\n 'redo',\n '|',\n 'heading',\n 'fontSize',\n '|',\n 'formatPainter',\n 'removeFormat',\n 'bold',\n 'moreStyle',\n '|',\n 'fontColor',\n 'highlight',\n '|',\n 'align',\n 'list',\n 'indent',\n 'link',\n 'blockQuote',\n 'hr',\n];\n\ntype ToolbarConfig = {\n editor: Editor;\n root: string | Nodes | NativeNode;\n items?: (string | ToolbarItem)[];\n};\n\nconst toolbarItemMap: Map<string, ToolbarItem> = new Map();\n\ntoolbarItems.forEach(item => {\n toolbarItemMap.set(item.name, item);\n});\n\nexport class Toolbar {\n\n private items: (string | ToolbarItem)[];\n\n private editor: Editor;\n\n private root: Nodes;\n\n public container: Nodes;\n\n constructor(config: ToolbarConfig) {\n this.items = config.items || defaultItems;\n this.editor = config.editor;\n this.root = query(config.root);\n this.container = query('<div class=\"lake-toolbar\" />');\n\n this.root.addClass('lake-custom-properties');\n }\n\n private appendDivider(): void {\n this.container.append('<div class=\"lake-toolbar-divider\" />');\n }\n\n private appendButton(item: ToolbarButtonItem): void {\n const editor = this.editor;\n const button = new Button({\n root: this.container,\n name: item.name,\n icon: item.icon,\n tooltip: item.tooltip,\n tabIndex: -1,\n onClick: () => {\n editor.focus();\n item.onClick(editor, item.name);\n },\n });\n button.render();\n }\n\n private appendDropdown(item: ToolbarDropdownItem) {\n const editor = this.editor;\n const dropdown = new Dropdown({\n root: this.container,\n name: item.name,\n icon: item.icon,\n accentIcon: item.accentIcon,\n downIcon: item.downIcon,\n defaultValue: item.defaultValue,\n tooltip:item.tooltip,\n width: item.width,\n menuType: item.menuType,\n menuItems: item.menuItems,\n tabIndex: -1,\n onSelect: value => {\n editor.focus();\n item.onSelect(editor, value);\n },\n });\n dropdown.render();\n }\n\n private appendUpload(item: ToolbarUploadItem): void {\n const editor = this.editor;\n const uploadNode = query(safeTemplate`\n <div class=\"lake-upload\" name=\"${item.name}\">\n <input type=\"file\" />\n </div>\n `);\n const fileNode = uploadNode.find('input[type=\"file\"]');\n const fileNativeNode = fileNode.get(0) as HTMLInputElement;\n if (item.accept) {\n fileNode.attr('accept', item.accept);\n }\n if (item.multiple === true) {\n fileNode.attr('multiple', 'true');\n }\n const button = new Button({\n root: uploadNode,\n name: item.name,\n icon: item.icon,\n tooltip: item.tooltip,\n tabIndex: -1,\n onClick: () => {\n editor.focus();\n fileNativeNode.click();\n },\n });\n button.render();\n this.container.append(uploadNode);\n fileNode.on('click', event => event.stopPropagation());\n fileNode.on('change', event => {\n const target = event.target as HTMLInputElement;\n const files = target.files || [];\n for (const file of files) {\n uploadImage({\n editor,\n file,\n });\n }\n });\n }\n\n // Renders a toolbar for the specified editor.\n public render() {\n const editor = this.editor;\n this.root.empty();\n this.root.append(this.container);\n const allMenuMap: Map<string, Map<string, string>> = new Map();\n const buttonItemList: ToolbarButtonItem[] = [];\n const dropdownItemList: ToolbarDropdownItem[] = [];\n this.items.forEach(name => {\n if (name === '|') {\n this.appendDivider();\n return;\n }\n let item;\n if (typeof name === 'string') {\n item = toolbarItemMap.get(name);\n if (!item) {\n return;\n }\n } else {\n item = name;\n }\n if (item.type === 'button') {\n buttonItemList.push(item);\n this.appendButton(item);\n return;\n }\n if (item.type === 'dropdown') {\n allMenuMap.set(item.name, Dropdown.getMenuMap(item.menuItems));\n dropdownItemList.push(item);\n this.appendDropdown(item);\n return;\n }\n if (item.type === 'upload') {\n this.appendUpload(item);\n }\n });\n editor.event.on('statechange', data => {\n const { appliedItems, disabledNameMap, selectedNameMap, selectedValuesMap } = data;\n for (const item of buttonItemList) {\n const selectedClass = 'lake-button-selected';\n const buttonNode = this.container.find(`button[name=\"${item.name}\"]`);\n let isDisabled = disabledNameMap.get(item.name);\n if (isDisabled === undefined) {\n isDisabled = item.isDisabled && appliedItems.length > 0 ? item.isDisabled(appliedItems) : false;\n }\n if (isDisabled) {\n buttonNode.attr('disabled', 'true');\n buttonNode.removeClass(selectedClass);\n } else {\n buttonNode.removeAttr('disabled');\n }\n if (!isDisabled) {\n let isSelected = selectedNameMap.get(item.name);\n if (isSelected === undefined) {\n isSelected = item.isSelected && appliedItems.length > 0 ? item.isSelected(appliedItems) : false;\n }\n if (isSelected) {\n buttonNode.addClass(selectedClass);\n } else {\n buttonNode.removeClass(selectedClass);\n }\n }\n }\n for (const item of dropdownItemList) {\n let selectedValues = selectedValuesMap.get(item.name);\n if (selectedValues === undefined) {\n selectedValues = item.selectedValues && appliedItems.length > 0 ? item.selectedValues(appliedItems) : [];\n }\n const dropdownNode = this.container.find(`div.lake-dropdown[name=\"${item.name}\"]`);\n let isDisabled = disabledNameMap.get(item.name);\n if (isDisabled === undefined) {\n isDisabled = item.isDisabled && appliedItems.length > 0 ? item.isDisabled(appliedItems) : false;\n }\n if (isDisabled) {\n dropdownNode.attr('disabled', 'true');\n } else {\n dropdownNode.removeAttr('disabled');\n }\n if (!isDisabled) {\n Dropdown.setValue(dropdownNode, selectedValues);\n const textNode = dropdownNode.find('.lake-dropdown-text');\n if (textNode.length > 0) {\n const key = selectedValues[0] || item.defaultValue;\n const menuMap = allMenuMap.get(item.name);\n const text = (menuMap && menuMap.get(key)) ?? key;\n textNode.text(text);\n }\n }\n }\n });\n }\n}\n","/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise, SuppressedError, Symbol */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\r\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\r\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\r\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\r\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\r\n var _, done = false;\r\n for (var i = decorators.length - 1; i >= 0; i--) {\r\n var context = {};\r\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\r\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\r\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\r\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\r\n if (kind === \"accessor\") {\r\n if (result === void 0) continue;\r\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\r\n if (_ = accept(result.get)) descriptor.get = _;\r\n if (_ = accept(result.set)) descriptor.set = _;\r\n if (_ = accept(result.init)) initializers.unshift(_);\r\n }\r\n else if (_ = accept(result)) {\r\n if (kind === \"field\") initializers.unshift(_);\r\n else descriptor[key] = _;\r\n }\r\n }\r\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\r\n done = true;\r\n};\r\n\r\nexport function __runInitializers(thisArg, initializers, value) {\r\n var useValue = arguments.length > 2;\r\n for (var i = 0; i < initializers.length; i++) {\r\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\r\n }\r\n return useValue ? value : void 0;\r\n};\r\n\r\nexport function __propKey(x) {\r\n return typeof x === \"symbol\" ? x : \"\".concat(x);\r\n};\r\n\r\nexport function __setFunctionName(f, name, prefix) {\r\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\r\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\r\n};\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n var desc = Object.getOwnPropertyDescriptor(m, k);\r\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n desc = { enumerable: true, get: function() { return m[k]; } };\r\n }\r\n Object.defineProperty(o, k2, desc);\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\nexport function __classPrivateFieldIn(state, receiver) {\r\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n}\r\n\r\nexport function __addDisposableResource(env, value, async) {\r\n if (value !== null && value !== void 0) {\r\n if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\r\n var dispose;\r\n if (async) {\r\n if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\r\n dispose = value[Symbol.asyncDispose];\r\n }\r\n if (dispose === void 0) {\r\n if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\r\n dispose = value[Symbol.dispose];\r\n }\r\n if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\r\n env.stack.push({ value: value, dispose: dispose, async: async });\r\n }\r\n else if (async) {\r\n env.stack.push({ async: true });\r\n }\r\n return value;\r\n}\r\n\r\nvar _SuppressedError = typeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\r\n var e = new Error(message);\r\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\r\n};\r\n\r\nexport function __disposeResources(env) {\r\n function fail(e) {\r\n env.error = env.hasError ? new _SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\r\n env.hasError = true;\r\n }\r\n function next() {\r\n while (env.stack.length) {\r\n var rec = env.stack.pop();\r\n try {\r\n var result = rec.dispose && rec.dispose.call(rec.value);\r\n if (rec.async) return Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\r\n }\r\n catch (e) {\r\n fail(e);\r\n }\r\n }\r\n if (env.hasError) throw env.error;\r\n }\r\n return next();\r\n}\r\n\r\nexport default {\r\n __extends: __extends,\r\n __assign: __assign,\r\n __rest: __rest,\r\n __decorate: __decorate,\r\n __param: __param,\r\n __metadata: __metadata,\r\n __awaiter: __awaiter,\r\n __generator: __generator,\r\n __createBinding: __createBinding,\r\n __exportStar: __exportStar,\r\n __values: __values,\r\n __read: __read,\r\n __spread: __spread,\r\n __spreadArrays: __spreadArrays,\r\n __spreadArray: __spreadArray,\r\n __await: __await,\r\n __asyncGenerator: __asyncGenerator,\r\n __asyncDelegator: __asyncDelegator,\r\n __asyncValues: __asyncValues,\r\n __makeTemplateObject: __makeTemplateObject,\r\n __importStar: __importStar,\r\n __importDefault: __importDefault,\r\n __classPrivateFieldGet: __classPrivateFieldGet,\r\n __classPrivateFieldSet: __classPrivateFieldSet,\r\n __classPrivateFieldIn: __classPrivateFieldIn,\r\n __addDisposableResource: __addDisposableResource,\r\n __disposeResources: __disposeResources,\r\n};\r\n","/*!\n * PhotoSwipe Lightbox 5.4.3 - https://photoswipe.com\n * (c) 2023 Dmytro Semenov\n */\n/** @typedef {import('../photoswipe.js').Point} Point */\n\n/**\r\n * @template {keyof HTMLElementTagNameMap} T\r\n * @param {string} className\r\n * @param {T} tagName\r\n * @param {Node} [appendToEl]\r\n * @returns {HTMLElementTagNameMap[T]}\r\n */\nfunction createElement(className, tagName, appendToEl) {\n const el = document.createElement(tagName);\n\n if (className) {\n el.className = className;\n }\n\n if (appendToEl) {\n appendToEl.appendChild(el);\n }\n\n return el;\n}\n/**\r\n * Get transform string\r\n *\r\n * @param {number} x\r\n * @param {number} [y]\r\n * @param {number} [scale]\r\n * @returns {string}\r\n */\n\nfunction toTransformString(x, y, scale) {\n let propValue = `translate3d(${x}px,${y || 0}px,0)`;\n\n if (scale !== undefined) {\n propValue += ` scale3d(${scale},${scale},1)`;\n }\n\n return propValue;\n}\n/**\r\n * Apply width and height CSS properties to element\r\n *\r\n * @param {HTMLElement} el\r\n * @param {string | number} w\r\n * @param {string | number} h\r\n */\n\nfunction setWidthHeight(el, w, h) {\n el.style.width = typeof w === 'number' ? `${w}px` : w;\n el.style.height = typeof h === 'number' ? `${h}px` : h;\n}\n/** @typedef {LOAD_STATE[keyof LOAD_STATE]} LoadState */\n\n/** @type {{ IDLE: 'idle'; LOADING: 'loading'; LOADED: 'loaded'; ERROR: 'error' }} */\n\nconst LOAD_STATE = {\n IDLE: 'idle',\n LOADING: 'loading',\n LOADED: 'loaded',\n ERROR: 'error'\n};\n/**\r\n * Check if click or keydown event was dispatched\r\n * with a special key or via mouse wheel.\r\n *\r\n * @param {MouseEvent | KeyboardEvent} e\r\n * @returns {boolean}\r\n */\n\nfunction specialKeyUsed(e) {\n return 'button' in e && e.button === 1 || e.ctrlKey || e.metaKey || e.altKey || e.shiftKey;\n}\n/**\r\n * Parse `gallery` or `children` options.\r\n *\r\n * @param {import('../photoswipe.js').ElementProvider} [option]\r\n * @param {string} [legacySelector]\r\n * @param {HTMLElement | Document} [parent]\r\n * @returns HTMLElement[]\r\n */\n\nfunction getElementsFromOption(option, legacySelector, parent = document) {\n /** @type {HTMLElement[]} */\n let elements = [];\n\n if (option instanceof Element) {\n elements = [option];\n } else if (option instanceof NodeList || Array.isArray(option)) {\n elements = Array.from(option);\n } else {\n const selector = typeof option === 'string' ? option : legacySelector;\n\n if (selector) {\n elements = Array.from(parent.querySelectorAll(selector));\n }\n }\n\n return elements;\n}\n/**\r\n * Check if variable is PhotoSwipe class\r\n *\r\n * @param {any} fn\r\n * @returns {boolean}\r\n */\n\nfunction isPswpClass(fn) {\n return typeof fn === 'function' && fn.prototype && fn.prototype.goTo;\n}\n/**\r\n * Check if browser is Safari\r\n *\r\n * @returns {boolean}\r\n */\n\nfunction isSafari() {\n return !!(navigator.vendor && navigator.vendor.match(/apple/i));\n}\n\n/** @typedef {import('../lightbox/lightbox.js').default} PhotoSwipeLightbox */\n\n/** @typedef {import('../photoswipe.js').default} PhotoSwipe */\n\n/** @typedef {import('../photoswipe.js').PhotoSwipeOptions} PhotoSwipeOptions */\n\n/** @typedef {import('../photoswipe.js').DataSource} DataSource */\n\n/** @typedef {import('../ui/ui-element.js').UIElementData} UIElementData */\n\n/** @typedef {import('../slide/content.js').default} ContentDefault */\n\n/** @typedef {import('../slide/slide.js').default} Slide */\n\n/** @typedef {import('../slide/slide.js').SlideData} SlideData */\n\n/** @typedef {import('../slide/zoom-level.js').default} ZoomLevel */\n\n/** @typedef {import('../slide/get-thumb-bounds.js').Bounds} Bounds */\n\n/**\r\n * Allow adding an arbitrary props to the Content\r\n * https://photoswipe.com/custom-content/#using-webp-image-format\r\n * @typedef {ContentDefault & Record<string, any>} Content\r\n */\n\n/** @typedef {{ x?: number; y?: number }} Point */\n\n/**\r\n * @typedef {Object} PhotoSwipeEventsMap https://photoswipe.com/events/\r\n *\r\n *\r\n * https://photoswipe.com/adding-ui-elements/\r\n *\r\n * @prop {undefined} uiRegister\r\n * @prop {{ data: UIElementData }} uiElementCreate\r\n *\r\n *\r\n * https://photoswipe.com/events/#initialization-events\r\n *\r\n * @prop {undefined} beforeOpen\r\n * @prop {undefined} firstUpdate\r\n * @prop {undefined} initialLayout\r\n * @prop {undefined} change\r\n * @prop {undefined} afterInit\r\n * @prop {undefined} bindEvents\r\n *\r\n *\r\n * https://photoswipe.com/events/#opening-or-closing-transition-events\r\n *\r\n * @prop {undefined} openingAnimationStart\r\n * @prop {undefined} openingAnimationEnd\r\n * @prop {undefined} closingAnimationStart\r\n * @prop {undefined} closingAnimationEnd\r\n *\r\n *\r\n * https://photoswipe.com/events/#closing-events\r\n *\r\n * @prop {undefined} close\r\n * @prop {undefined} destroy\r\n *\r\n *\r\n * https://photoswipe.com/events/#pointer-and-gesture-events\r\n *\r\n * @prop {{ originalEvent: PointerEvent }} pointerDown\r\n * @prop {{ originalEvent: PointerEvent }} pointerMove\r\n * @prop {{ originalEvent: PointerEvent }} pointerUp\r\n * @prop {{ bgOpacity: number }} pinchClose can be default prevented\r\n * @prop {{ panY: number }} verticalDrag can be default prevented\r\n *\r\n *\r\n * https://photoswipe.com/events/#slide-content-events\r\n *\r\n * @prop {{ content: Content }} contentInit\r\n * @prop {{ content: Content; isLazy: boolean }} contentLoad can be default prevented\r\n * @prop {{ content: Content; isLazy: boolean }} contentLoadImage can be default prevented\r\n * @prop {{ content: Content; slide: Slide; isError?: boolean }} loadComplete\r\n * @prop {{ content: Content; slide: Slide }} loadError\r\n * @prop {{ content: Content; width: number; height: number }} contentResize can be default prevented\r\n * @prop {{ content: Content; width: number; height: number; slide: Slide }} imageSizeChange\r\n * @prop {{ content: Content }} contentLazyLoad can be default prevented\r\n * @prop {{ content: Content }} contentAppend can be default prevented\r\n * @prop {{ content: Content }} contentActivate can be default prevented\r\n * @prop {{ content: Content }} contentDeactivate can be default prevented\r\n * @prop {{ content: Content }} contentRemove can be default prevented\r\n * @prop {{ content: Content }} contentDestroy can be default prevented\r\n *\r\n *\r\n * undocumented\r\n *\r\n * @prop {{ point: Point; originalEvent: PointerEvent }} imageClickAction can be default prevented\r\n * @prop {{ point: Point; originalEvent: PointerEvent }} bgClickAction can be default prevented\r\n * @prop {{ point: Point; originalEvent: PointerEvent }} tapAction can be default prevented\r\n * @prop {{ point: Point; originalEvent: PointerEvent }} doubleTapAction can be default prevented\r\n *\r\n * @prop {{ originalEvent: KeyboardEvent }} keydown can be default prevented\r\n * @prop {{ x: number; dragging: boolean }} moveMainScroll\r\n * @prop {{ slide: Slide }} firstZoomPan\r\n * @prop {{ slide: Slide | undefined, data: SlideData, index: number }} gettingData\r\n * @prop {undefined} beforeResize\r\n * @prop {undefined} resize\r\n * @prop {undefined} viewportSize\r\n * @prop {undefined} updateScrollOffset\r\n * @prop {{ slide: Slide }} slideInit\r\n * @prop {{ slide: Slide }} afterSetContent\r\n * @prop {{ slide: Slide }} slideLoad\r\n * @prop {{ slide: Slide }} appendHeavy can be default prevented\r\n * @prop {{ slide: Slide }} appendHeavyContent\r\n * @prop {{ slide: Slide }} slideActivate\r\n * @prop {{ slide: Slide }} slideDeactivate\r\n * @prop {{ slide: Slide }} slideDestroy\r\n * @prop {{ destZoomLevel: number, centerPoint: Point | undefined, transitionDuration: number | false | undefined }} beforeZoomTo\r\n * @prop {{ slide: Slide }} zoomPanUpdate\r\n * @prop {{ slide: Slide }} initialZoomPan\r\n * @prop {{ slide: Slide }} calcSlideSize\r\n * @prop {undefined} resolutionChanged\r\n * @prop {{ originalEvent: WheelEvent }} wheel can be default prevented\r\n * @prop {{ content: Content }} contentAppendImage can be default prevented\r\n * @prop {{ index: number; itemData: SlideData }} lazyLoadSlide can be default prevented\r\n * @prop {undefined} lazyLoad\r\n * @prop {{ slide: Slide }} calcBounds\r\n * @prop {{ zoomLevels: ZoomLevel, slideData: SlideData }} zoomLevelsUpdate\r\n *\r\n *\r\n * legacy\r\n *\r\n * @prop {undefined} init\r\n * @prop {undefined} initialZoomIn\r\n * @prop {undefined} initialZoomOut\r\n * @prop {undefined} initialZoomInEnd\r\n * @prop {undefined} initialZoomOutEnd\r\n * @prop {{ dataSource: DataSource | undefined, numItems: number }} numItems\r\n * @prop {{ itemData: SlideData; index: number }} itemData\r\n * @prop {{ index: number, itemData: SlideData, instance: PhotoSwipe }} thumbBounds\r\n */\n\n/**\r\n * @typedef {Object} PhotoSwipeFiltersMap https://photoswipe.com/filters/\r\n *\r\n * @prop {(numItems: number, dataSource: DataSource | undefined) => number} numItems\r\n * Modify the total amount of slides. Example on Data sources page.\r\n * https://photoswipe.com/filters/#numitems\r\n *\r\n * @prop {(itemData: SlideData, index: number) => SlideData} itemData\r\n * Modify slide item data. Example on Data sources page.\r\n * https://photoswipe.com/filters/#itemdata\r\n *\r\n * @prop {(itemData: SlideData, element: HTMLElement, linkEl: HTMLAnchorElement) => SlideData} domItemData\r\n * Modify item data when it's parsed from DOM element. Example on Data sources page.\r\n * https://photoswipe.com/filters/#domitemdata\r\n *\r\n * @prop {(clickedIndex: number, e: MouseEvent, instance: PhotoSwipeLightbox) => number} clickedIndex\r\n * Modify clicked gallery item index.\r\n * https://photoswipe.com/filters/#clickedindex\r\n *\r\n * @prop {(placeholderSrc: string | false, content: Content) => string | false} placeholderSrc\r\n * Modify placeholder image source.\r\n * https://photoswipe.com/filters/#placeholdersrc\r\n *\r\n * @prop {(isContentLoading: boolean, content: Content) => boolean} isContentLoading\r\n * Modify if the content is currently loading.\r\n * https://photoswipe.com/filters/#iscontentloading\r\n *\r\n * @prop {(isContentZoomable: boolean, content: Content) => boolean} isContentZoomable\r\n * Modify if the content can be zoomed.\r\n * https://photoswipe.com/filters/#iscontentzoomable\r\n *\r\n * @prop {(useContentPlaceholder: boolean, content: Content) => boolean} useContentPlaceholder\r\n * Modify if the placeholder should be used for the content.\r\n * https://photoswipe.com/filters/#usecontentplaceholder\r\n *\r\n * @prop {(isKeepingPlaceholder: boolean, content: Content) => boolean} isKeepingPlaceholder\r\n * Modify if the placeholder should be kept after the content is loaded.\r\n * https://photoswipe.com/filters/#iskeepingplaceholder\r\n *\r\n *\r\n * @prop {(contentErrorElement: HTMLElement, content: Content) => HTMLElement} contentErrorElement\r\n * Modify an element when the content has error state (for example, if image cannot be loaded).\r\n * https://photoswipe.com/filters/#contenterrorelement\r\n *\r\n * @prop {(element: HTMLElement, data: UIElementData) => HTMLElement} uiElement\r\n * Modify a UI element that's being created.\r\n * https://photoswipe.com/filters/#uielement\r\n *\r\n * @prop {(thumbnail: HTMLElement | null | undefined, itemData: SlideData, index: number) => HTMLElement} thumbEl\r\n * Modify the thumbnail element from which opening zoom animation starts or ends.\r\n * https://photoswipe.com/filters/#thumbel\r\n *\r\n * @prop {(thumbBounds: Bounds | undefined, itemData: SlideData, index: number) => Bounds} thumbBounds\r\n * Modify the thumbnail bounds from which opening zoom animation starts or ends.\r\n * https://photoswipe.com/filters/#thumbbounds\r\n *\r\n * @prop {(srcsetSizesWidth: number, content: Content) => number} srcsetSizesWidth\r\n *\r\n * @prop {(preventPointerEvent: boolean, event: PointerEvent, pointerType: string) => boolean} preventPointerEvent\r\n *\r\n */\n\n/**\r\n * @template {keyof PhotoSwipeFiltersMap} T\r\n * @typedef {{ fn: PhotoSwipeFiltersMap[T], priority: number }} Filter\r\n */\n\n/**\r\n * @template {keyof PhotoSwipeEventsMap} T\r\n * @typedef {PhotoSwipeEventsMap[T] extends undefined ? PhotoSwipeEvent<T> : PhotoSwipeEvent<T> & PhotoSwipeEventsMap[T]} AugmentedEvent\r\n */\n\n/**\r\n * @template {keyof PhotoSwipeEventsMap} T\r\n * @typedef {(event: AugmentedEvent<T>) => void} EventCallback\r\n */\n\n/**\r\n * Base PhotoSwipe event object\r\n *\r\n * @template {keyof PhotoSwipeEventsMap} T\r\n */\nclass PhotoSwipeEvent {\n /**\r\n * @param {T} type\r\n * @param {PhotoSwipeEventsMap[T]} [details]\r\n */\n constructor(type, details) {\n this.type = type;\n this.defaultPrevented = false;\n\n if (details) {\n Object.assign(this, details);\n }\n }\n\n preventDefault() {\n this.defaultPrevented = true;\n }\n\n}\n/**\r\n * PhotoSwipe base class that can listen and dispatch for events.\r\n * Shared by PhotoSwipe Core and PhotoSwipe Lightbox, extended by base.js\r\n */\n\n\nclass Eventable {\n constructor() {\n /**\r\n * @type {{ [T in keyof PhotoSwipeEventsMap]?: ((event: AugmentedEvent<T>) => void)[] }}\r\n */\n this._listeners = {};\n /**\r\n * @type {{ [T in keyof PhotoSwipeFiltersMap]?: Filter<T>[] }}\r\n */\n\n this._filters = {};\n /** @type {PhotoSwipe | undefined} */\n\n this.pswp = undefined;\n /** @type {PhotoSwipeOptions | undefined} */\n\n this.options = undefined;\n }\n /**\r\n * @template {keyof PhotoSwipeFiltersMap} T\r\n * @param {T} name\r\n * @param {PhotoSwipeFiltersMap[T]} fn\r\n * @param {number} priority\r\n */\n\n\n addFilter(name, fn, priority = 100) {\n var _this$_filters$name, _this$_filters$name2, _this$pswp;\n\n if (!this._filters[name]) {\n this._filters[name] = [];\n }\n\n (_this$_filters$name = this._filters[name]) === null || _this$_filters$name === void 0 || _this$_filters$name.push({\n fn,\n priority\n });\n (_this$_filters$name2 = this._filters[name]) === null || _this$_filters$name2 === void 0 || _this$_filters$name2.sort((f1, f2) => f1.priority - f2.priority);\n (_this$pswp = this.pswp) === null || _this$pswp === void 0 || _this$pswp.addFilter(name, fn, priority);\n }\n /**\r\n * @template {keyof PhotoSwipeFiltersMap} T\r\n * @param {T} name\r\n * @param {PhotoSwipeFiltersMap[T]} fn\r\n */\n\n\n removeFilter(name, fn) {\n if (this._filters[name]) {\n // @ts-expect-error\n this._filters[name] = this._filters[name].filter(filter => filter.fn !== fn);\n }\n\n if (this.pswp) {\n this.pswp.removeFilter(name, fn);\n }\n }\n /**\r\n * @template {keyof PhotoSwipeFiltersMap} T\r\n * @param {T} name\r\n * @param {Parameters<PhotoSwipeFiltersMap[T]>} args\r\n * @returns {Parameters<PhotoSwipeFiltersMap[T]>[0]}\r\n */\n\n\n applyFilters(name, ...args) {\n var _this$_filters$name3;\n\n (_this$_filters$name3 = this._filters[name]) === null || _this$_filters$name3 === void 0 || _this$_filters$name3.forEach(filter => {\n // @ts-expect-error\n args[0] = filter.fn.apply(this, args);\n });\n return args[0];\n }\n /**\r\n * @template {keyof PhotoSwipeEventsMap} T\r\n * @param {T} name\r\n * @param {EventCallback<T>} fn\r\n */\n\n\n on(name, fn) {\n var _this$_listeners$name, _this$pswp2;\n\n if (!this._listeners[name]) {\n this._listeners[name] = [];\n }\n\n (_this$_listeners$name = this._listeners[name]) === null || _this$_listeners$name === void 0 || _this$_listeners$name.push(fn); // When binding events to lightbox,\n // also bind events to PhotoSwipe Core,\n // if it's open.\n\n (_this$pswp2 = this.pswp) === null || _this$pswp2 === void 0 || _this$pswp2.on(name, fn);\n }\n /**\r\n * @template {keyof PhotoSwipeEventsMap} T\r\n * @param {T} name\r\n * @param {EventCallback<T>} fn\r\n */\n\n\n off(name, fn) {\n var _this$pswp3;\n\n if (this._listeners[name]) {\n // @ts-expect-error\n this._listeners[name] = this._listeners[name].filter(listener => fn !== listener);\n }\n\n (_this$pswp3 = this.pswp) === null || _this$pswp3 === void 0 || _this$pswp3.off(name, fn);\n }\n /**\r\n * @template {keyof PhotoSwipeEventsMap} T\r\n * @param {T} name\r\n * @param {PhotoSwipeEventsMap[T]} [details]\r\n * @returns {AugmentedEvent<T>}\r\n */\n\n\n dispatch(name, details) {\n var _this$_listeners$name2;\n\n if (this.pswp) {\n return this.pswp.dispatch(name, details);\n }\n\n const event =\n /** @type {AugmentedEvent<T>} */\n new PhotoSwipeEvent(name, details);\n (_this$_listeners$name2 = this._listeners[name]) === null || _this$_listeners$name2 === void 0 || _this$_listeners$name2.forEach(listener => {\n listener.call(this, event);\n });\n return event;\n }\n\n}\n\nclass Placeholder {\n /**\r\n * @param {string | false} imageSrc\r\n * @param {HTMLElement} container\r\n */\n constructor(imageSrc, container) {\n // Create placeholder\n // (stretched thumbnail or simple div behind the main image)\n\n /** @type {HTMLImageElement | HTMLDivElement | null} */\n this.element = createElement('pswp__img pswp__img--placeholder', imageSrc ? 'img' : 'div', container);\n\n if (imageSrc) {\n const imgEl =\n /** @type {HTMLImageElement} */\n this.element;\n imgEl.decoding = 'async';\n imgEl.alt = '';\n imgEl.src = imageSrc;\n imgEl.setAttribute('role', 'presentation');\n }\n\n this.element.setAttribute('aria-hidden', 'true');\n }\n /**\r\n * @param {number} width\r\n * @param {number} height\r\n */\n\n\n setDisplayedSize(width, height) {\n if (!this.element) {\n return;\n }\n\n if (this.element.tagName === 'IMG') {\n // Use transform scale() to modify img placeholder size\n // (instead of changing width/height directly).\n // This helps with performance, specifically in iOS15 Safari.\n setWidthHeight(this.element, 250, 'auto');\n this.element.style.transformOrigin = '0 0';\n this.element.style.transform = toTransformString(0, 0, width / 250);\n } else {\n setWidthHeight(this.element, width, height);\n }\n }\n\n destroy() {\n var _this$element;\n\n if ((_this$element = this.element) !== null && _this$element !== void 0 && _this$element.parentNode) {\n this.element.remove();\n }\n\n this.element = null;\n }\n\n}\n\n/** @typedef {import('./slide.js').default} Slide */\n\n/** @typedef {import('./slide.js').SlideData} SlideData */\n\n/** @typedef {import('../core/base.js').default} PhotoSwipeBase */\n\n/** @typedef {import('../util/util.js').LoadState} LoadState */\n\nclass Content {\n /**\r\n * @param {SlideData} itemData Slide data\r\n * @param {PhotoSwipeBase} instance PhotoSwipe or PhotoSwipeLightbox instance\r\n * @param {number} index\r\n */\n constructor(itemData, instance, index) {\n this.instance = instance;\n this.data = itemData;\n this.index = index;\n /** @type {HTMLImageElement | HTMLDivElement | undefined} */\n\n this.element = undefined;\n /** @type {Placeholder | undefined} */\n\n this.placeholder = undefined;\n /** @type {Slide | undefined} */\n\n this.slide = undefined;\n this.displayedImageWidth = 0;\n this.displayedImageHeight = 0;\n this.width = Number(this.data.w) || Number(this.data.width) || 0;\n this.height = Number(this.data.h) || Number(this.data.height) || 0;\n this.isAttached = false;\n this.hasSlide = false;\n this.isDecoding = false;\n /** @type {LoadState} */\n\n this.state = LOAD_STATE.IDLE;\n\n if (this.data.type) {\n this.type = this.data.type;\n } else if (this.data.src) {\n this.type = 'image';\n } else {\n this.type = 'html';\n }\n\n this.instance.dispatch('contentInit', {\n content: this\n });\n }\n\n removePlaceholder() {\n if (this.placeholder && !this.keepPlaceholder()) {\n // With delay, as image might be loaded, but not rendered\n setTimeout(() => {\n if (this.placeholder) {\n this.placeholder.destroy();\n this.placeholder = undefined;\n }\n }, 1000);\n }\n }\n /**\r\n * Preload content\r\n *\r\n * @param {boolean} isLazy\r\n * @param {boolean} [reload]\r\n */\n\n\n load(isLazy, reload) {\n if (this.slide && this.usePlaceholder()) {\n if (!this.placeholder) {\n const placeholderSrc = this.instance.applyFilters('placeholderSrc', // use image-based placeholder only for the first slide,\n // as rendering (even small stretched thumbnail) is an expensive operation\n this.data.msrc && this.slide.isFirstSlide ? this.data.msrc : false, this);\n this.placeholder = new Placeholder(placeholderSrc, this.slide.container);\n } else {\n const placeholderEl = this.placeholder.element; // Add placeholder to DOM if it was already created\n\n if (placeholderEl && !placeholderEl.parentElement) {\n this.slide.container.prepend(placeholderEl);\n }\n }\n }\n\n if (this.element && !reload) {\n return;\n }\n\n if (this.instance.dispatch('contentLoad', {\n content: this,\n isLazy\n }).defaultPrevented) {\n return;\n }\n\n if (this.isImageContent()) {\n this.element = createElement('pswp__img', 'img'); // Start loading only after width is defined, as sizes might depend on it.\n // Due to Safari feature, we must define sizes before srcset.\n\n if (this.displayedImageWidth) {\n this.loadImage(isLazy);\n }\n } else {\n this.element = createElement('pswp__content', 'div');\n this.element.innerHTML = this.data.html || '';\n }\n\n if (reload && this.slide) {\n this.slide.updateContentSize(true);\n }\n }\n /**\r\n * Preload image\r\n *\r\n * @param {boolean} isLazy\r\n */\n\n\n loadImage(isLazy) {\n var _this$data$src, _this$data$alt;\n\n if (!this.isImageContent() || !this.element || this.instance.dispatch('contentLoadImage', {\n content: this,\n isLazy\n }).defaultPrevented) {\n return;\n }\n\n const imageElement =\n /** @type HTMLImageElement */\n this.element;\n this.updateSrcsetSizes();\n\n if (this.data.srcset) {\n imageElement.srcset = this.data.srcset;\n }\n\n imageElement.src = (_this$data$src = this.data.src) !== null && _this$data$src !== void 0 ? _this$data$src : '';\n imageElement.alt = (_this$data$alt = this.data.alt) !== null && _this$data$alt !== void 0 ? _this$data$alt : '';\n this.state = LOAD_STATE.LOADING;\n\n if (imageElement.complete) {\n this.onLoaded();\n } else {\n imageElement.onload = () => {\n this.onLoaded();\n };\n\n imageElement.onerror = () => {\n this.onError();\n };\n }\n }\n /**\r\n * Assign slide to content\r\n *\r\n * @param {Slide} slide\r\n */\n\n\n setSlide(slide) {\n this.slide = slide;\n this.hasSlide = true;\n this.instance = slide.pswp; // todo: do we need to unset slide?\n }\n /**\r\n * Content load success handler\r\n */\n\n\n onLoaded() {\n this.state = LOAD_STATE.LOADED;\n\n if (this.slide && this.element) {\n this.instance.dispatch('loadComplete', {\n slide: this.slide,\n content: this\n }); // if content is reloaded\n\n if (this.slide.isActive && this.slide.heavyAppended && !this.element.parentNode) {\n this.append();\n this.slide.updateContentSize(true);\n }\n\n if (this.state === LOAD_STATE.LOADED || this.state === LOAD_STATE.ERROR) {\n this.removePlaceholder();\n }\n }\n }\n /**\r\n * Content load error handler\r\n */\n\n\n onError() {\n this.state = LOAD_STATE.ERROR;\n\n if (this.slide) {\n this.displayError();\n this.instance.dispatch('loadComplete', {\n slide: this.slide,\n isError: true,\n content: this\n });\n this.instance.dispatch('loadError', {\n slide: this.slide,\n content: this\n });\n }\n }\n /**\r\n * @returns {Boolean} If the content is currently loading\r\n */\n\n\n isLoading() {\n return this.instance.applyFilters('isContentLoading', this.state === LOAD_STATE.LOADING, this);\n }\n /**\r\n * @returns {Boolean} If the content is in error state\r\n */\n\n\n isError() {\n return this.state === LOAD_STATE.ERROR;\n }\n /**\r\n * @returns {boolean} If the content is image\r\n */\n\n\n isImageContent() {\n return this.type === 'image';\n }\n /**\r\n * Update content size\r\n *\r\n * @param {Number} width\r\n * @param {Number} height\r\n */\n\n\n setDisplayedSize(width, height) {\n if (!this.element) {\n return;\n }\n\n if (this.placeholder) {\n this.placeholder.setDisplayedSize(width, height);\n }\n\n if (this.instance.dispatch('contentResize', {\n content: this,\n width,\n height\n }).defaultPrevented) {\n return;\n }\n\n setWidthHeight(this.element, width, height);\n\n if (this.isImageContent() && !this.isError()) {\n const isInitialSizeUpdate = !this.displayedImageWidth && width;\n this.displayedImageWidth = width;\n this.displayedImageHeight = height;\n\n if (isInitialSizeUpdate) {\n this.loadImage(false);\n } else {\n this.updateSrcsetSizes();\n }\n\n if (this.slide) {\n this.instance.dispatch('imageSizeChange', {\n slide: this.slide,\n width,\n height,\n content: this\n });\n }\n }\n }\n /**\r\n * @returns {boolean} If the content can be zoomed\r\n */\n\n\n isZoomable() {\n return this.instance.applyFilters('isContentZoomable', this.isImageContent() && this.state !== LOAD_STATE.ERROR, this);\n }\n /**\r\n * Update image srcset sizes attribute based on width and height\r\n */\n\n\n updateSrcsetSizes() {\n // Handle srcset sizes attribute.\n //\n // Never lower quality, if it was increased previously.\n // Chrome does this automatically, Firefox and Safari do not,\n // so we store largest used size in dataset.\n if (!this.isImageContent() || !this.element || !this.data.srcset) {\n return;\n }\n\n const image =\n /** @type HTMLImageElement */\n this.element;\n const sizesWidth = this.instance.applyFilters('srcsetSizesWidth', this.displayedImageWidth, this);\n\n if (!image.dataset.largestUsedSize || sizesWidth > parseInt(image.dataset.largestUsedSize, 10)) {\n image.sizes = sizesWidth + 'px';\n image.dataset.largestUsedSize = String(sizesWidth);\n }\n }\n /**\r\n * @returns {boolean} If content should use a placeholder (from msrc by default)\r\n */\n\n\n usePlaceholder() {\n return this.instance.applyFilters('useContentPlaceholder', this.isImageContent(), this);\n }\n /**\r\n * Preload content with lazy-loading param\r\n */\n\n\n lazyLoad() {\n if (this.instance.dispatch('contentLazyLoad', {\n content: this\n }).defaultPrevented) {\n return;\n }\n\n this.load(true);\n }\n /**\r\n * @returns {boolean} If placeholder should be kept after content is loaded\r\n */\n\n\n keepPlaceholder() {\n return this.instance.applyFilters('isKeepingPlaceholder', this.isLoading(), this);\n }\n /**\r\n * Destroy the content\r\n */\n\n\n destroy() {\n this.hasSlide = false;\n this.slide = undefined;\n\n if (this.instance.dispatch('contentDestroy', {\n content: this\n }).defaultPrevented) {\n return;\n }\n\n this.remove();\n\n if (this.placeholder) {\n this.placeholder.destroy();\n this.placeholder = undefined;\n }\n\n if (this.isImageContent() && this.element) {\n this.element.onload = null;\n this.element.onerror = null;\n this.element = undefined;\n }\n }\n /**\r\n * Display error message\r\n */\n\n\n displayError() {\n if (this.slide) {\n var _this$instance$option, _this$instance$option2;\n\n let errorMsgEl = createElement('pswp__error-msg', 'div');\n errorMsgEl.innerText = (_this$instance$option = (_this$instance$option2 = this.instance.options) === null || _this$instance$option2 === void 0 ? void 0 : _this$instance$option2.errorMsg) !== null && _this$instance$option !== void 0 ? _this$instance$option : '';\n errorMsgEl =\n /** @type {HTMLDivElement} */\n this.instance.applyFilters('contentErrorElement', errorMsgEl, this);\n this.element = createElement('pswp__content pswp__error-msg-container', 'div');\n this.element.appendChild(errorMsgEl);\n this.slide.container.innerText = '';\n this.slide.container.appendChild(this.element);\n this.slide.updateContentSize(true);\n this.removePlaceholder();\n }\n }\n /**\r\n * Append the content\r\n */\n\n\n append() {\n if (this.isAttached || !this.element) {\n return;\n }\n\n this.isAttached = true;\n\n if (this.state === LOAD_STATE.ERROR) {\n this.displayError();\n return;\n }\n\n if (this.instance.dispatch('contentAppend', {\n content: this\n }).defaultPrevented) {\n return;\n }\n\n const supportsDecode = ('decode' in this.element);\n\n if (this.isImageContent()) {\n // Use decode() on nearby slides\n //\n // Nearby slide images are in DOM and not hidden via display:none.\n // However, they are placed offscreen (to the left and right side).\n //\n // Some browsers do not composite the image until it's actually visible,\n // using decode() helps.\n //\n // You might ask \"why dont you just decode() and then append all images\",\n // that's because I want to show image before it's fully loaded,\n // as browser can render parts of image while it is loading.\n // We do not do this in Safari due to partial loading bug.\n if (supportsDecode && this.slide && (!this.slide.isActive || isSafari())) {\n this.isDecoding = true; // purposefully using finally instead of then,\n // as if srcset sizes changes dynamically - it may cause decode error\n\n /** @type {HTMLImageElement} */\n\n this.element.decode().catch(() => {}).finally(() => {\n this.isDecoding = false;\n this.appendImage();\n });\n } else {\n this.appendImage();\n }\n } else if (this.slide && !this.element.parentNode) {\n this.slide.container.appendChild(this.element);\n }\n }\n /**\r\n * Activate the slide,\r\n * active slide is generally the current one,\r\n * meaning the user can see it.\r\n */\n\n\n activate() {\n if (this.instance.dispatch('contentActivate', {\n content: this\n }).defaultPrevented || !this.slide) {\n return;\n }\n\n if (this.isImageContent() && this.isDecoding && !isSafari()) {\n // add image to slide when it becomes active,\n // even if it's not finished decoding\n this.appendImage();\n } else if (this.isError()) {\n this.load(false, true); // try to reload\n }\n\n if (this.slide.holderElement) {\n this.slide.holderElement.setAttribute('aria-hidden', 'false');\n }\n }\n /**\r\n * Deactivate the content\r\n */\n\n\n deactivate() {\n this.instance.dispatch('contentDeactivate', {\n content: this\n });\n\n if (this.slide && this.slide.holderElement) {\n this.slide.holderElement.setAttribute('aria-hidden', 'true');\n }\n }\n /**\r\n * Remove the content from DOM\r\n */\n\n\n remove() {\n this.isAttached = false;\n\n if (this.instance.dispatch('contentRemove', {\n content: this\n }).defaultPrevented) {\n return;\n }\n\n if (this.element && this.element.parentNode) {\n this.element.remove();\n }\n\n if (this.placeholder && this.placeholder.element) {\n this.placeholder.element.remove();\n }\n }\n /**\r\n * Append the image content to slide container\r\n */\n\n\n appendImage() {\n if (!this.isAttached) {\n return;\n }\n\n if (this.instance.dispatch('contentAppendImage', {\n content: this\n }).defaultPrevented) {\n return;\n } // ensure that element exists and is not already appended\n\n\n if (this.slide && this.element && !this.element.parentNode) {\n this.slide.container.appendChild(this.element);\n }\n\n if (this.state === LOAD_STATE.LOADED || this.state === LOAD_STATE.ERROR) {\n this.removePlaceholder();\n }\n }\n\n}\n\n/** @typedef {import('../photoswipe.js').PhotoSwipeOptions} PhotoSwipeOptions */\n\n/** @typedef {import('../core/base.js').default} PhotoSwipeBase */\n\n/** @typedef {import('../photoswipe.js').Point} Point */\n\n/** @typedef {import('../slide/slide.js').SlideData} SlideData */\n\n/**\r\n * @param {PhotoSwipeOptions} options\r\n * @param {PhotoSwipeBase} pswp\r\n * @returns {Point}\r\n */\nfunction getViewportSize(options, pswp) {\n if (options.getViewportSizeFn) {\n const newViewportSize = options.getViewportSizeFn(options, pswp);\n\n if (newViewportSize) {\n return newViewportSize;\n }\n }\n\n return {\n x: document.documentElement.clientWidth,\n // TODO: height on mobile is very incosistent due to toolbar\n // find a way to improve this\n //\n // document.documentElement.clientHeight - doesn't seem to work well\n y: window.innerHeight\n };\n}\n/**\r\n * Parses padding option.\r\n * Supported formats:\r\n *\r\n * // Object\r\n * padding: {\r\n * top: 0,\r\n * bottom: 0,\r\n * left: 0,\r\n * right: 0\r\n * }\r\n *\r\n * // A function that returns the object\r\n * paddingFn: (viewportSize, itemData, index) => {\r\n * return {\r\n * top: 0,\r\n * bottom: 0,\r\n * left: 0,\r\n * right: 0\r\n * };\r\n * }\r\n *\r\n * // Legacy variant\r\n * paddingLeft: 0,\r\n * paddingRight: 0,\r\n * paddingTop: 0,\r\n * paddingBottom: 0,\r\n *\r\n * @param {'left' | 'top' | 'bottom' | 'right'} prop\r\n * @param {PhotoSwipeOptions} options PhotoSwipe options\r\n * @param {Point} viewportSize PhotoSwipe viewport size, for example: { x:800, y:600 }\r\n * @param {SlideData} itemData Data about the slide\r\n * @param {number} index Slide index\r\n * @returns {number}\r\n */\n\nfunction parsePaddingOption(prop, options, viewportSize, itemData, index) {\n let paddingValue = 0;\n\n if (options.paddingFn) {\n paddingValue = options.paddingFn(viewportSize, itemData, index)[prop];\n } else if (options.padding) {\n paddingValue = options.padding[prop];\n } else {\n const legacyPropName = 'padding' + prop[0].toUpperCase() + prop.slice(1); // @ts-expect-error\n\n if (options[legacyPropName]) {\n // @ts-expect-error\n paddingValue = options[legacyPropName];\n }\n }\n\n return Number(paddingValue) || 0;\n}\n/**\r\n * @param {PhotoSwipeOptions} options\r\n * @param {Point} viewportSize\r\n * @param {SlideData} itemData\r\n * @param {number} index\r\n * @returns {Point}\r\n */\n\nfunction getPanAreaSize(options, viewportSize, itemData, index) {\n return {\n x: viewportSize.x - parsePaddingOption('left', options, viewportSize, itemData, index) - parsePaddingOption('right', options, viewportSize, itemData, index),\n y: viewportSize.y - parsePaddingOption('top', options, viewportSize, itemData, index) - parsePaddingOption('bottom', options, viewportSize, itemData, index)\n };\n}\n\nconst MAX_IMAGE_WIDTH = 4000;\n/** @typedef {import('../photoswipe.js').default} PhotoSwipe */\n\n/** @typedef {import('../photoswipe.js').PhotoSwipeOptions} PhotoSwipeOptions */\n\n/** @typedef {import('../photoswipe.js').Point} Point */\n\n/** @typedef {import('../slide/slide.js').SlideData} SlideData */\n\n/** @typedef {'fit' | 'fill' | number | ((zoomLevelObject: ZoomLevel) => number)} ZoomLevelOption */\n\n/**\r\n * Calculates zoom levels for specific slide.\r\n * Depends on viewport size and image size.\r\n */\n\nclass ZoomLevel {\n /**\r\n * @param {PhotoSwipeOptions} options PhotoSwipe options\r\n * @param {SlideData} itemData Slide data\r\n * @param {number} index Slide index\r\n * @param {PhotoSwipe} [pswp] PhotoSwipe instance, can be undefined if not initialized yet\r\n */\n constructor(options, itemData, index, pswp) {\n this.pswp = pswp;\n this.options = options;\n this.itemData = itemData;\n this.index = index;\n /** @type { Point | null } */\n\n this.panAreaSize = null;\n /** @type { Point | null } */\n\n this.elementSize = null;\n this.fit = 1;\n this.fill = 1;\n this.vFill = 1;\n this.initial = 1;\n this.secondary = 1;\n this.max = 1;\n this.min = 1;\n }\n /**\r\n * Calculate initial, secondary and maximum zoom level for the specified slide.\r\n *\r\n * It should be called when either image or viewport size changes.\r\n *\r\n * @param {number} maxWidth\r\n * @param {number} maxHeight\r\n * @param {Point} panAreaSize\r\n */\n\n\n update(maxWidth, maxHeight, panAreaSize) {\n /** @type {Point} */\n const elementSize = {\n x: maxWidth,\n y: maxHeight\n };\n this.elementSize = elementSize;\n this.panAreaSize = panAreaSize;\n const hRatio = panAreaSize.x / elementSize.x;\n const vRatio = panAreaSize.y / elementSize.y;\n this.fit = Math.min(1, hRatio < vRatio ? hRatio : vRatio);\n this.fill = Math.min(1, hRatio > vRatio ? hRatio : vRatio); // zoom.vFill defines zoom level of the image\n // when it has 100% of viewport vertical space (height)\n\n this.vFill = Math.min(1, vRatio);\n this.initial = this._getInitial();\n this.secondary = this._getSecondary();\n this.max = Math.max(this.initial, this.secondary, this._getMax());\n this.min = Math.min(this.fit, this.initial, this.secondary);\n\n if (this.pswp) {\n this.pswp.dispatch('zoomLevelsUpdate', {\n zoomLevels: this,\n slideData: this.itemData\n });\n }\n }\n /**\r\n * Parses user-defined zoom option.\r\n *\r\n * @private\r\n * @param {'initial' | 'secondary' | 'max'} optionPrefix Zoom level option prefix (initial, secondary, max)\r\n * @returns { number | undefined }\r\n */\n\n\n _parseZoomLevelOption(optionPrefix) {\n const optionName =\n /** @type {'initialZoomLevel' | 'secondaryZoomLevel' | 'maxZoomLevel'} */\n optionPrefix + 'ZoomLevel';\n const optionValue = this.options[optionName];\n\n if (!optionValue) {\n return;\n }\n\n if (typeof optionValue === 'function') {\n return optionValue(this);\n }\n\n if (optionValue === 'fill') {\n return this.fill;\n }\n\n if (optionValue === 'fit') {\n return this.fit;\n }\n\n return Number(optionValue);\n }\n /**\r\n * Get zoom level to which image will be zoomed after double-tap gesture,\r\n * or when user clicks on zoom icon,\r\n * or mouse-click on image itself.\r\n * If you return 1 image will be zoomed to its original size.\r\n *\r\n * @private\r\n * @return {number}\r\n */\n\n\n _getSecondary() {\n let currZoomLevel = this._parseZoomLevelOption('secondary');\n\n if (currZoomLevel) {\n return currZoomLevel;\n } // 3x of \"fit\" state, but not larger than original\n\n\n currZoomLevel = Math.min(1, this.fit * 3);\n\n if (this.elementSize && currZoomLevel * this.elementSize.x > MAX_IMAGE_WIDTH) {\n currZoomLevel = MAX_IMAGE_WIDTH / this.elementSize.x;\n }\n\n return currZoomLevel;\n }\n /**\r\n * Get initial image zoom level.\r\n *\r\n * @private\r\n * @return {number}\r\n */\n\n\n _getInitial() {\n return this._parseZoomLevelOption('initial') || this.fit;\n }\n /**\r\n * Maximum zoom level when user zooms\r\n * via zoom/pinch gesture,\r\n * via cmd/ctrl-wheel or via trackpad.\r\n *\r\n * @private\r\n * @return {number}\r\n */\n\n\n _getMax() {\n // max zoom level is x4 from \"fit state\",\n // used for zoom gesture and ctrl/trackpad zoom\n return this._parseZoomLevelOption('max') || Math.max(1, this.fit * 4);\n }\n\n}\n\n/**\r\n * Lazy-load an image\r\n * This function is used both by Lightbox and PhotoSwipe core,\r\n * thus it can be called before dialog is opened.\r\n *\r\n * @param {SlideData} itemData Data about the slide\r\n * @param {PhotoSwipeBase} instance PhotoSwipe or PhotoSwipeLightbox instance\r\n * @param {number} index\r\n * @returns {Content} Image that is being decoded or false.\r\n */\n\nfunction lazyLoadData(itemData, instance, index) {\n const content = instance.createContentFromData(itemData, index);\n /** @type {ZoomLevel | undefined} */\n\n let zoomLevel;\n const {\n options\n } = instance; // We need to know dimensions of the image to preload it,\n // as it might use srcset, and we need to define sizes\n\n if (options) {\n zoomLevel = new ZoomLevel(options, itemData, -1);\n let viewportSize;\n\n if (instance.pswp) {\n viewportSize = instance.pswp.viewportSize;\n } else {\n viewportSize = getViewportSize(options, instance);\n }\n\n const panAreaSize = getPanAreaSize(options, viewportSize, itemData, index);\n zoomLevel.update(content.width, content.height, panAreaSize);\n }\n\n content.lazyLoad();\n\n if (zoomLevel) {\n content.setDisplayedSize(Math.ceil(content.width * zoomLevel.initial), Math.ceil(content.height * zoomLevel.initial));\n }\n\n return content;\n}\n/**\r\n * Lazy-loads specific slide.\r\n * This function is used both by Lightbox and PhotoSwipe core,\r\n * thus it can be called before dialog is opened.\r\n *\r\n * By default, it loads image based on viewport size and initial zoom level.\r\n *\r\n * @param {number} index Slide index\r\n * @param {PhotoSwipeBase} instance PhotoSwipe or PhotoSwipeLightbox eventable instance\r\n * @returns {Content | undefined}\r\n */\n\nfunction lazyLoadSlide(index, instance) {\n const itemData = instance.getItemData(index);\n\n if (instance.dispatch('lazyLoadSlide', {\n index,\n itemData\n }).defaultPrevented) {\n return;\n }\n\n return lazyLoadData(itemData, instance, index);\n}\n\n/** @typedef {import(\"../photoswipe.js\").default} PhotoSwipe */\n\n/** @typedef {import(\"../slide/slide.js\").SlideData} SlideData */\n\n/**\r\n * PhotoSwipe base class that can retrieve data about every slide.\r\n * Shared by PhotoSwipe Core and PhotoSwipe Lightbox\r\n */\n\nclass PhotoSwipeBase extends Eventable {\n /**\r\n * Get total number of slides\r\n *\r\n * @returns {number}\r\n */\n getNumItems() {\n var _this$options;\n\n let numItems = 0;\n const dataSource = (_this$options = this.options) === null || _this$options === void 0 ? void 0 : _this$options.dataSource;\n\n if (dataSource && 'length' in dataSource) {\n // may be an array or just object with length property\n numItems = dataSource.length;\n } else if (dataSource && 'gallery' in dataSource) {\n // query DOM elements\n if (!dataSource.items) {\n dataSource.items = this._getGalleryDOMElements(dataSource.gallery);\n }\n\n if (dataSource.items) {\n numItems = dataSource.items.length;\n }\n } // legacy event, before filters were introduced\n\n\n const event = this.dispatch('numItems', {\n dataSource,\n numItems\n });\n return this.applyFilters('numItems', event.numItems, dataSource);\n }\n /**\r\n * @param {SlideData} slideData\r\n * @param {number} index\r\n * @returns {Content}\r\n */\n\n\n createContentFromData(slideData, index) {\n return new Content(slideData, this, index);\n }\n /**\r\n * Get item data by index.\r\n *\r\n * \"item data\" should contain normalized information that PhotoSwipe needs to generate a slide.\r\n * For example, it may contain properties like\r\n * `src`, `srcset`, `w`, `h`, which will be used to generate a slide with image.\r\n *\r\n * @param {number} index\r\n * @returns {SlideData}\r\n */\n\n\n getItemData(index) {\n var _this$options2;\n\n const dataSource = (_this$options2 = this.options) === null || _this$options2 === void 0 ? void 0 : _this$options2.dataSource;\n /** @type {SlideData | HTMLElement} */\n\n let dataSourceItem = {};\n\n if (Array.isArray(dataSource)) {\n // Datasource is an array of elements\n dataSourceItem = dataSource[index];\n } else if (dataSource && 'gallery' in dataSource) {\n // dataSource has gallery property,\n // thus it was created by Lightbox, based on\n // gallery and children options\n // query DOM elements\n if (!dataSource.items) {\n dataSource.items = this._getGalleryDOMElements(dataSource.gallery);\n }\n\n dataSourceItem = dataSource.items[index];\n }\n\n let itemData = dataSourceItem;\n\n if (itemData instanceof Element) {\n itemData = this._domElementToItemData(itemData);\n } // Dispatching the itemData event,\n // it's a legacy verion before filters were introduced\n\n\n const event = this.dispatch('itemData', {\n itemData: itemData || {},\n index\n });\n return this.applyFilters('itemData', event.itemData, index);\n }\n /**\r\n * Get array of gallery DOM elements,\r\n * based on childSelector and gallery element.\r\n *\r\n * @param {HTMLElement} galleryElement\r\n * @returns {HTMLElement[]}\r\n */\n\n\n _getGalleryDOMElements(galleryElement) {\n var _this$options3, _this$options4;\n\n if ((_this$options3 = this.options) !== null && _this$options3 !== void 0 && _this$options3.children || (_this$options4 = this.options) !== null && _this$options4 !== void 0 && _this$options4.childSelector) {\n return getElementsFromOption(this.options.children, this.options.childSelector, galleryElement) || [];\n }\n\n return [galleryElement];\n }\n /**\r\n * Converts DOM element to item data object.\r\n *\r\n * @param {HTMLElement} element DOM element\r\n * @returns {SlideData}\r\n */\n\n\n _domElementToItemData(element) {\n /** @type {SlideData} */\n const itemData = {\n element\n };\n const linkEl =\n /** @type {HTMLAnchorElement} */\n element.tagName === 'A' ? element : element.querySelector('a');\n\n if (linkEl) {\n // src comes from data-pswp-src attribute,\n // if it's empty link href is used\n itemData.src = linkEl.dataset.pswpSrc || linkEl.href;\n\n if (linkEl.dataset.pswpSrcset) {\n itemData.srcset = linkEl.dataset.pswpSrcset;\n }\n\n itemData.width = linkEl.dataset.pswpWidth ? parseInt(linkEl.dataset.pswpWidth, 10) : 0;\n itemData.height = linkEl.dataset.pswpHeight ? parseInt(linkEl.dataset.pswpHeight, 10) : 0; // support legacy w & h properties\n\n itemData.w = itemData.width;\n itemData.h = itemData.height;\n\n if (linkEl.dataset.pswpType) {\n itemData.type = linkEl.dataset.pswpType;\n }\n\n const thumbnailEl = element.querySelector('img');\n\n if (thumbnailEl) {\n var _thumbnailEl$getAttri;\n\n // msrc is URL to placeholder image that's displayed before large image is loaded\n // by default it's displayed only for the first slide\n itemData.msrc = thumbnailEl.currentSrc || thumbnailEl.src;\n itemData.alt = (_thumbnailEl$getAttri = thumbnailEl.getAttribute('alt')) !== null && _thumbnailEl$getAttri !== void 0 ? _thumbnailEl$getAttri : '';\n }\n\n if (linkEl.dataset.pswpCropped || linkEl.dataset.cropped) {\n itemData.thumbCropped = true;\n }\n }\n\n return this.applyFilters('domItemData', itemData, element, linkEl);\n }\n /**\r\n * Lazy-load by slide data\r\n *\r\n * @param {SlideData} itemData Data about the slide\r\n * @param {number} index\r\n * @returns {Content} Image that is being decoded or false.\r\n */\n\n\n lazyLoadData(itemData, index) {\n return lazyLoadData(itemData, this, index);\n }\n\n}\n\n/**\r\n * @template T\r\n * @typedef {import('../types.js').Type<T>} Type<T>\r\n */\n\n/** @typedef {import('../photoswipe.js').default} PhotoSwipe */\n\n/** @typedef {import('../photoswipe.js').PhotoSwipeOptions} PhotoSwipeOptions */\n\n/** @typedef {import('../photoswipe.js').DataSource} DataSource */\n\n/** @typedef {import('../photoswipe.js').Point} Point */\n\n/** @typedef {import('../slide/content.js').default} Content */\n\n/** @typedef {import('../core/eventable.js').PhotoSwipeEventsMap} PhotoSwipeEventsMap */\n\n/** @typedef {import('../core/eventable.js').PhotoSwipeFiltersMap} PhotoSwipeFiltersMap */\n\n/**\r\n * @template {keyof PhotoSwipeEventsMap} T\r\n * @typedef {import('../core/eventable.js').EventCallback<T>} EventCallback<T>\r\n */\n\n/**\r\n * PhotoSwipe Lightbox\r\n *\r\n * - If user has unsupported browser it falls back to default browser action (just opens URL)\r\n * - Binds click event to links that should open PhotoSwipe\r\n * - parses DOM strcture for PhotoSwipe (retrieves large image URLs and sizes)\r\n * - Initializes PhotoSwipe\r\n *\r\n *\r\n * Loader options use the same object as PhotoSwipe, and supports such options:\r\n *\r\n * gallery - Element | Element[] | NodeList | string selector for the gallery element\r\n * children - Element | Element[] | NodeList | string selector for the gallery children\r\n *\r\n */\n\nclass PhotoSwipeLightbox extends PhotoSwipeBase {\n /**\r\n * @param {PhotoSwipeOptions} [options]\r\n */\n constructor(options) {\n super();\n /** @type {PhotoSwipeOptions} */\n\n this.options = options || {};\n this._uid = 0;\n this.shouldOpen = false;\n /**\r\n * @private\r\n * @type {Content | undefined}\r\n */\n\n this._preloadedContent = undefined;\n this.onThumbnailsClick = this.onThumbnailsClick.bind(this);\n }\n /**\r\n * Initialize lightbox, should be called only once.\r\n * It's not included in the main constructor, so you may bind events before it.\r\n */\n\n\n init() {\n // Bind click events to each gallery\n getElementsFromOption(this.options.gallery, this.options.gallerySelector).forEach(galleryElement => {\n galleryElement.addEventListener('click', this.onThumbnailsClick, false);\n });\n }\n /**\r\n * @param {MouseEvent} e\r\n */\n\n\n onThumbnailsClick(e) {\n // Exit and allow default browser action if:\n if (specialKeyUsed(e) // ... if clicked with a special key (ctrl/cmd...)\n || window.pswp) {\n // ... if PhotoSwipe is already open\n return;\n } // If both clientX and clientY are 0 or not defined,\n // the event is likely triggered by keyboard,\n // so we do not pass the initialPoint\n //\n // Note that some screen readers emulate the mouse position,\n // so it's not the ideal way to detect them.\n //\n\n /** @type {Point | null} */\n\n\n let initialPoint = {\n x: e.clientX,\n y: e.clientY\n };\n\n if (!initialPoint.x && !initialPoint.y) {\n initialPoint = null;\n }\n\n let clickedIndex = this.getClickedIndex(e);\n clickedIndex = this.applyFilters('clickedIndex', clickedIndex, e, this);\n /** @type {DataSource} */\n\n const dataSource = {\n gallery:\n /** @type {HTMLElement} */\n e.currentTarget\n };\n\n if (clickedIndex >= 0) {\n e.preventDefault();\n this.loadAndOpen(clickedIndex, dataSource, initialPoint);\n }\n }\n /**\r\n * Get index of gallery item that was clicked.\r\n *\r\n * @param {MouseEvent} e click event\r\n * @returns {number}\r\n */\n\n\n getClickedIndex(e) {\n // legacy option\n if (this.options.getClickedIndexFn) {\n return this.options.getClickedIndexFn.call(this, e);\n }\n\n const clickedTarget =\n /** @type {HTMLElement} */\n e.target;\n const childElements = getElementsFromOption(this.options.children, this.options.childSelector,\n /** @type {HTMLElement} */\n e.currentTarget);\n const clickedChildIndex = childElements.findIndex(child => child === clickedTarget || child.contains(clickedTarget));\n\n if (clickedChildIndex !== -1) {\n return clickedChildIndex;\n } else if (this.options.children || this.options.childSelector) {\n // click wasn't on a child element\n return -1;\n } // There is only one item (which is the gallery)\n\n\n return 0;\n }\n /**\r\n * Load and open PhotoSwipe\r\n *\r\n * @param {number} index\r\n * @param {DataSource} [dataSource]\r\n * @param {Point | null} [initialPoint]\r\n * @returns {boolean}\r\n */\n\n\n loadAndOpen(index, dataSource, initialPoint) {\n // Check if the gallery is already open\n if (window.pswp || !this.options) {\n return false;\n } // Use the first gallery element if dataSource is not provided\n\n\n if (!dataSource && this.options.gallery && this.options.children) {\n const galleryElements = getElementsFromOption(this.options.gallery);\n\n if (galleryElements[0]) {\n dataSource = {\n gallery: galleryElements[0]\n };\n }\n } // set initial index\n\n\n this.options.index = index; // define options for PhotoSwipe constructor\n\n this.options.initialPointerPos = initialPoint;\n this.shouldOpen = true;\n this.preload(index, dataSource);\n return true;\n }\n /**\r\n * Load the main module and the slide content by index\r\n *\r\n * @param {number} index\r\n * @param {DataSource} [dataSource]\r\n */\n\n\n preload(index, dataSource) {\n const {\n options\n } = this;\n\n if (dataSource) {\n options.dataSource = dataSource;\n } // Add the main module\n\n /** @type {Promise<Type<PhotoSwipe>>[]} */\n\n\n const promiseArray = [];\n const pswpModuleType = typeof options.pswpModule;\n\n if (isPswpClass(options.pswpModule)) {\n promiseArray.push(Promise.resolve(\n /** @type {Type<PhotoSwipe>} */\n options.pswpModule));\n } else if (pswpModuleType === 'string') {\n throw new Error('pswpModule as string is no longer supported');\n } else if (pswpModuleType === 'function') {\n promiseArray.push(\n /** @type {() => Promise<Type<PhotoSwipe>>} */\n options.pswpModule());\n } else {\n throw new Error('pswpModule is not valid');\n } // Add custom-defined promise, if any\n\n\n if (typeof options.openPromise === 'function') {\n // allow developers to perform some task before opening\n promiseArray.push(options.openPromise());\n }\n\n if (options.preloadFirstSlide !== false && index >= 0) {\n this._preloadedContent = lazyLoadSlide(index, this);\n } // Wait till all promises resolve and open PhotoSwipe\n\n\n const uid = ++this._uid;\n Promise.all(promiseArray).then(iterableModules => {\n if (this.shouldOpen) {\n const mainModule = iterableModules[0];\n\n this._openPhotoswipe(mainModule, uid);\n }\n });\n }\n /**\r\n * @private\r\n * @param {Type<PhotoSwipe> | { default: Type<PhotoSwipe> }} module\r\n * @param {number} uid\r\n */\n\n\n _openPhotoswipe(module, uid) {\n // Cancel opening if UID doesn't match the current one\n // (if user clicked on another gallery item before current was loaded).\n //\n // Or if shouldOpen flag is set to false\n // (developer may modify it via public API)\n if (uid !== this._uid && this.shouldOpen) {\n return;\n }\n\n this.shouldOpen = false; // PhotoSwipe is already open\n\n if (window.pswp) {\n return;\n }\n /**\r\n * Pass data to PhotoSwipe and open init\r\n *\r\n * @type {PhotoSwipe}\r\n */\n\n\n const pswp = typeof module === 'object' ? new module.default(this.options) // eslint-disable-line\n : new module(this.options); // eslint-disable-line\n\n this.pswp = pswp;\n window.pswp = pswp; // map listeners from Lightbox to PhotoSwipe Core\n\n /** @type {(keyof PhotoSwipeEventsMap)[]} */\n\n Object.keys(this._listeners).forEach(name => {\n var _this$_listeners$name;\n\n (_this$_listeners$name = this._listeners[name]) === null || _this$_listeners$name === void 0 || _this$_listeners$name.forEach(fn => {\n pswp.on(name,\n /** @type {EventCallback<typeof name>} */\n fn);\n });\n }); // same with filters\n\n /** @type {(keyof PhotoSwipeFiltersMap)[]} */\n\n Object.keys(this._filters).forEach(name => {\n var _this$_filters$name;\n\n (_this$_filters$name = this._filters[name]) === null || _this$_filters$name === void 0 || _this$_filters$name.forEach(filter => {\n pswp.addFilter(name, filter.fn, filter.priority);\n });\n });\n\n if (this._preloadedContent) {\n pswp.contentLoader.addToCache(this._preloadedContent);\n this._preloadedContent = undefined;\n }\n\n pswp.on('destroy', () => {\n // clean up public variables\n this.pswp = undefined;\n delete window.pswp;\n });\n pswp.init();\n }\n /**\r\n * Unbinds all events, closes PhotoSwipe if it's open.\r\n */\n\n\n destroy() {\n var _this$pswp;\n\n (_this$pswp = this.pswp) === null || _this$pswp === void 0 || _this$pswp.destroy();\n this.shouldOpen = false;\n this._listeners = {};\n getElementsFromOption(this.options.gallery, this.options.gallerySelector).forEach(galleryElement => {\n galleryElement.removeEventListener('click', this.onThumbnailsClick, false);\n });\n }\n\n}\n\nexport { PhotoSwipeLightbox as default };\n//# sourceMappingURL=photoswipe-lightbox.esm.js.map\n","/*!\n * PhotoSwipe 5.4.3 - https://photoswipe.com\n * (c) 2023 Dmytro Semenov\n */\n/** @typedef {import('../photoswipe.js').Point} Point */\n\n/**\r\n * @template {keyof HTMLElementTagNameMap} T\r\n * @param {string} className\r\n * @param {T} tagName\r\n * @param {Node} [appendToEl]\r\n * @returns {HTMLElementTagNameMap[T]}\r\n */\nfunction createElement(className, tagName, appendToEl) {\n const el = document.createElement(tagName);\n\n if (className) {\n el.className = className;\n }\n\n if (appendToEl) {\n appendToEl.appendChild(el);\n }\n\n return el;\n}\n/**\r\n * @param {Point} p1\r\n * @param {Point} p2\r\n * @returns {Point}\r\n */\n\nfunction equalizePoints(p1, p2) {\n p1.x = p2.x;\n p1.y = p2.y;\n\n if (p2.id !== undefined) {\n p1.id = p2.id;\n }\n\n return p1;\n}\n/**\r\n * @param {Point} p\r\n */\n\nfunction roundPoint(p) {\n p.x = Math.round(p.x);\n p.y = Math.round(p.y);\n}\n/**\r\n * Returns distance between two points.\r\n *\r\n * @param {Point} p1\r\n * @param {Point} p2\r\n * @returns {number}\r\n */\n\nfunction getDistanceBetween(p1, p2) {\n const x = Math.abs(p1.x - p2.x);\n const y = Math.abs(p1.y - p2.y);\n return Math.sqrt(x * x + y * y);\n}\n/**\r\n * Whether X and Y positions of points are equal\r\n *\r\n * @param {Point} p1\r\n * @param {Point} p2\r\n * @returns {boolean}\r\n */\n\nfunction pointsEqual(p1, p2) {\n return p1.x === p2.x && p1.y === p2.y;\n}\n/**\r\n * The float result between the min and max values.\r\n *\r\n * @param {number} val\r\n * @param {number} min\r\n * @param {number} max\r\n * @returns {number}\r\n */\n\nfunction clamp(val, min, max) {\n return Math.min(Math.max(val, min), max);\n}\n/**\r\n * Get transform string\r\n *\r\n * @param {number} x\r\n * @param {number} [y]\r\n * @param {number} [scale]\r\n * @returns {string}\r\n */\n\nfunction toTransformString(x, y, scale) {\n let propValue = `translate3d(${x}px,${y || 0}px,0)`;\n\n if (scale !== undefined) {\n propValue += ` scale3d(${scale},${scale},1)`;\n }\n\n return propValue;\n}\n/**\r\n * Apply transform:translate(x, y) scale(scale) to element\r\n *\r\n * @param {HTMLElement} el\r\n * @param {number} x\r\n * @param {number} [y]\r\n * @param {number} [scale]\r\n */\n\nfunction setTransform(el, x, y, scale) {\n el.style.transform = toTransformString(x, y, scale);\n}\nconst defaultCSSEasing = 'cubic-bezier(.4,0,.22,1)';\n/**\r\n * Apply CSS transition to element\r\n *\r\n * @param {HTMLElement} el\r\n * @param {string} [prop] CSS property to animate\r\n * @param {number} [duration] in ms\r\n * @param {string} [ease] CSS easing function\r\n */\n\nfunction setTransitionStyle(el, prop, duration, ease) {\n // inOut: 'cubic-bezier(.4, 0, .22, 1)', // for \"toggle state\" transitions\n // out: 'cubic-bezier(0, 0, .22, 1)', // for \"show\" transitions\n // in: 'cubic-bezier(.4, 0, 1, 1)'// for \"hide\" transitions\n el.style.transition = prop ? `${prop} ${duration}ms ${ease || defaultCSSEasing}` : 'none';\n}\n/**\r\n * Apply width and height CSS properties to element\r\n *\r\n * @param {HTMLElement} el\r\n * @param {string | number} w\r\n * @param {string | number} h\r\n */\n\nfunction setWidthHeight(el, w, h) {\n el.style.width = typeof w === 'number' ? `${w}px` : w;\n el.style.height = typeof h === 'number' ? `${h}px` : h;\n}\n/**\r\n * @param {HTMLElement} el\r\n */\n\nfunction removeTransitionStyle(el) {\n setTransitionStyle(el);\n}\n/**\r\n * @param {HTMLImageElement} img\r\n * @returns {Promise<HTMLImageElement | void>}\r\n */\n\nfunction decodeImage(img) {\n if ('decode' in img) {\n return img.decode().catch(() => {});\n }\n\n if (img.complete) {\n return Promise.resolve(img);\n }\n\n return new Promise((resolve, reject) => {\n img.onload = () => resolve(img);\n\n img.onerror = reject;\n });\n}\n/** @typedef {LOAD_STATE[keyof LOAD_STATE]} LoadState */\n\n/** @type {{ IDLE: 'idle'; LOADING: 'loading'; LOADED: 'loaded'; ERROR: 'error' }} */\n\nconst LOAD_STATE = {\n IDLE: 'idle',\n LOADING: 'loading',\n LOADED: 'loaded',\n ERROR: 'error'\n};\n/**\r\n * Check if click or keydown event was dispatched\r\n * with a special key or via mouse wheel.\r\n *\r\n * @param {MouseEvent | KeyboardEvent} e\r\n * @returns {boolean}\r\n */\n\nfunction specialKeyUsed(e) {\n return 'button' in e && e.button === 1 || e.ctrlKey || e.metaKey || e.altKey || e.shiftKey;\n}\n/**\r\n * Parse `gallery` or `children` options.\r\n *\r\n * @param {import('../photoswipe.js').ElementProvider} [option]\r\n * @param {string} [legacySelector]\r\n * @param {HTMLElement | Document} [parent]\r\n * @returns HTMLElement[]\r\n */\n\nfunction getElementsFromOption(option, legacySelector, parent = document) {\n /** @type {HTMLElement[]} */\n let elements = [];\n\n if (option instanceof Element) {\n elements = [option];\n } else if (option instanceof NodeList || Array.isArray(option)) {\n elements = Array.from(option);\n } else {\n const selector = typeof option === 'string' ? option : legacySelector;\n\n if (selector) {\n elements = Array.from(parent.querySelectorAll(selector));\n }\n }\n\n return elements;\n}\n/**\r\n * Check if browser is Safari\r\n *\r\n * @returns {boolean}\r\n */\n\nfunction isSafari() {\n return !!(navigator.vendor && navigator.vendor.match(/apple/i));\n}\n\n// Detect passive event listener support\nlet supportsPassive = false;\n/* eslint-disable */\n\ntry {\n /* @ts-ignore */\n window.addEventListener('test', null, Object.defineProperty({}, 'passive', {\n get: () => {\n supportsPassive = true;\n }\n }));\n} catch (e) {}\n/* eslint-enable */\n\n/**\r\n * @typedef {Object} PoolItem\r\n * @prop {HTMLElement | Window | Document | undefined | null} target\r\n * @prop {string} type\r\n * @prop {EventListenerOrEventListenerObject} listener\r\n * @prop {boolean} [passive]\r\n */\n\n\nclass DOMEvents {\n constructor() {\n /**\r\n * @type {PoolItem[]}\r\n * @private\r\n */\n this._pool = [];\n }\n /**\r\n * Adds event listeners\r\n *\r\n * @param {PoolItem['target']} target\r\n * @param {PoolItem['type']} type Can be multiple, separated by space.\r\n * @param {PoolItem['listener']} listener\r\n * @param {PoolItem['passive']} [passive]\r\n */\n\n\n add(target, type, listener, passive) {\n this._toggleListener(target, type, listener, passive);\n }\n /**\r\n * Removes event listeners\r\n *\r\n * @param {PoolItem['target']} target\r\n * @param {PoolItem['type']} type\r\n * @param {PoolItem['listener']} listener\r\n * @param {PoolItem['passive']} [passive]\r\n */\n\n\n remove(target, type, listener, passive) {\n this._toggleListener(target, type, listener, passive, true);\n }\n /**\r\n * Removes all bound events\r\n */\n\n\n removeAll() {\n this._pool.forEach(poolItem => {\n this._toggleListener(poolItem.target, poolItem.type, poolItem.listener, poolItem.passive, true, true);\n });\n\n this._pool = [];\n }\n /**\r\n * Adds or removes event\r\n *\r\n * @private\r\n * @param {PoolItem['target']} target\r\n * @param {PoolItem['type']} type\r\n * @param {PoolItem['listener']} listener\r\n * @param {PoolItem['passive']} [passive]\r\n * @param {boolean} [unbind] Whether the event should be added or removed\r\n * @param {boolean} [skipPool] Whether events pool should be skipped\r\n */\n\n\n _toggleListener(target, type, listener, passive, unbind, skipPool) {\n if (!target) {\n return;\n }\n\n const methodName = unbind ? 'removeEventListener' : 'addEventListener';\n const types = type.split(' ');\n types.forEach(eType => {\n if (eType) {\n // Events pool is used to easily unbind all events when PhotoSwipe is closed,\n // so developer doesn't need to do this manually\n if (!skipPool) {\n if (unbind) {\n // Remove from the events pool\n this._pool = this._pool.filter(poolItem => {\n return poolItem.type !== eType || poolItem.listener !== listener || poolItem.target !== target;\n });\n } else {\n // Add to the events pool\n this._pool.push({\n target,\n type: eType,\n listener,\n passive\n });\n }\n } // most PhotoSwipe events call preventDefault,\n // and we do not need browser to scroll the page\n\n\n const eventOptions = supportsPassive ? {\n passive: passive || false\n } : false;\n target[methodName](eType, listener, eventOptions);\n }\n });\n }\n\n}\n\n/** @typedef {import('../photoswipe.js').PhotoSwipeOptions} PhotoSwipeOptions */\n\n/** @typedef {import('../core/base.js').default} PhotoSwipeBase */\n\n/** @typedef {import('../photoswipe.js').Point} Point */\n\n/** @typedef {import('../slide/slide.js').SlideData} SlideData */\n\n/**\r\n * @param {PhotoSwipeOptions} options\r\n * @param {PhotoSwipeBase} pswp\r\n * @returns {Point}\r\n */\nfunction getViewportSize(options, pswp) {\n if (options.getViewportSizeFn) {\n const newViewportSize = options.getViewportSizeFn(options, pswp);\n\n if (newViewportSize) {\n return newViewportSize;\n }\n }\n\n return {\n x: document.documentElement.clientWidth,\n // TODO: height on mobile is very incosistent due to toolbar\n // find a way to improve this\n //\n // document.documentElement.clientHeight - doesn't seem to work well\n y: window.innerHeight\n };\n}\n/**\r\n * Parses padding option.\r\n * Supported formats:\r\n *\r\n * // Object\r\n * padding: {\r\n * top: 0,\r\n * bottom: 0,\r\n * left: 0,\r\n * right: 0\r\n * }\r\n *\r\n * // A function that returns the object\r\n * paddingFn: (viewportSize, itemData, index) => {\r\n * return {\r\n * top: 0,\r\n * bottom: 0,\r\n * left: 0,\r\n * right: 0\r\n * };\r\n * }\r\n *\r\n * // Legacy variant\r\n * paddingLeft: 0,\r\n * paddingRight: 0,\r\n * paddingTop: 0,\r\n * paddingBottom: 0,\r\n *\r\n * @param {'left' | 'top' | 'bottom' | 'right'} prop\r\n * @param {PhotoSwipeOptions} options PhotoSwipe options\r\n * @param {Point} viewportSize PhotoSwipe viewport size, for example: { x:800, y:600 }\r\n * @param {SlideData} itemData Data about the slide\r\n * @param {number} index Slide index\r\n * @returns {number}\r\n */\n\nfunction parsePaddingOption(prop, options, viewportSize, itemData, index) {\n let paddingValue = 0;\n\n if (options.paddingFn) {\n paddingValue = options.paddingFn(viewportSize, itemData, index)[prop];\n } else if (options.padding) {\n paddingValue = options.padding[prop];\n } else {\n const legacyPropName = 'padding' + prop[0].toUpperCase() + prop.slice(1); // @ts-expect-error\n\n if (options[legacyPropName]) {\n // @ts-expect-error\n paddingValue = options[legacyPropName];\n }\n }\n\n return Number(paddingValue) || 0;\n}\n/**\r\n * @param {PhotoSwipeOptions} options\r\n * @param {Point} viewportSize\r\n * @param {SlideData} itemData\r\n * @param {number} index\r\n * @returns {Point}\r\n */\n\nfunction getPanAreaSize(options, viewportSize, itemData, index) {\n return {\n x: viewportSize.x - parsePaddingOption('left', options, viewportSize, itemData, index) - parsePaddingOption('right', options, viewportSize, itemData, index),\n y: viewportSize.y - parsePaddingOption('top', options, viewportSize, itemData, index) - parsePaddingOption('bottom', options, viewportSize, itemData, index)\n };\n}\n\n/** @typedef {import('./slide.js').default} Slide */\n\n/** @typedef {Record<Axis, number>} Point */\n\n/** @typedef {'x' | 'y'} Axis */\n\n/**\r\n * Calculates minimum, maximum and initial (center) bounds of a slide\r\n */\n\nclass PanBounds {\n /**\r\n * @param {Slide} slide\r\n */\n constructor(slide) {\n this.slide = slide;\n this.currZoomLevel = 1;\n this.center =\n /** @type {Point} */\n {\n x: 0,\n y: 0\n };\n this.max =\n /** @type {Point} */\n {\n x: 0,\n y: 0\n };\n this.min =\n /** @type {Point} */\n {\n x: 0,\n y: 0\n };\n }\n /**\r\n * _getItemBounds\r\n *\r\n * @param {number} currZoomLevel\r\n */\n\n\n update(currZoomLevel) {\n this.currZoomLevel = currZoomLevel;\n\n if (!this.slide.width) {\n this.reset();\n } else {\n this._updateAxis('x');\n\n this._updateAxis('y');\n\n this.slide.pswp.dispatch('calcBounds', {\n slide: this.slide\n });\n }\n }\n /**\r\n * _calculateItemBoundsForAxis\r\n *\r\n * @param {Axis} axis\r\n */\n\n\n _updateAxis(axis) {\n const {\n pswp\n } = this.slide;\n const elSize = this.slide[axis === 'x' ? 'width' : 'height'] * this.currZoomLevel;\n const paddingProp = axis === 'x' ? 'left' : 'top';\n const padding = parsePaddingOption(paddingProp, pswp.options, pswp.viewportSize, this.slide.data, this.slide.index);\n const panAreaSize = this.slide.panAreaSize[axis]; // Default position of element.\n // By default, it is center of viewport:\n\n this.center[axis] = Math.round((panAreaSize - elSize) / 2) + padding; // maximum pan position\n\n this.max[axis] = elSize > panAreaSize ? Math.round(panAreaSize - elSize) + padding : this.center[axis]; // minimum pan position\n\n this.min[axis] = elSize > panAreaSize ? padding : this.center[axis];\n } // _getZeroBounds\n\n\n reset() {\n this.center.x = 0;\n this.center.y = 0;\n this.max.x = 0;\n this.max.y = 0;\n this.min.x = 0;\n this.min.y = 0;\n }\n /**\r\n * Correct pan position if it's beyond the bounds\r\n *\r\n * @param {Axis} axis x or y\r\n * @param {number} panOffset\r\n * @returns {number}\r\n */\n\n\n correctPan(axis, panOffset) {\n // checkPanBounds\n return clamp(panOffset, this.max[axis], this.min[axis]);\n }\n\n}\n\nconst MAX_IMAGE_WIDTH = 4000;\n/** @typedef {import('../photoswipe.js').default} PhotoSwipe */\n\n/** @typedef {import('../photoswipe.js').PhotoSwipeOptions} PhotoSwipeOptions */\n\n/** @typedef {import('../photoswipe.js').Point} Point */\n\n/** @typedef {import('../slide/slide.js').SlideData} SlideData */\n\n/** @typedef {'fit' | 'fill' | number | ((zoomLevelObject: ZoomLevel) => number)} ZoomLevelOption */\n\n/**\r\n * Calculates zoom levels for specific slide.\r\n * Depends on viewport size and image size.\r\n */\n\nclass ZoomLevel {\n /**\r\n * @param {PhotoSwipeOptions} options PhotoSwipe options\r\n * @param {SlideData} itemData Slide data\r\n * @param {number} index Slide index\r\n * @param {PhotoSwipe} [pswp] PhotoSwipe instance, can be undefined if not initialized yet\r\n */\n constructor(options, itemData, index, pswp) {\n this.pswp = pswp;\n this.options = options;\n this.itemData = itemData;\n this.index = index;\n /** @type { Point | null } */\n\n this.panAreaSize = null;\n /** @type { Point | null } */\n\n this.elementSize = null;\n this.fit = 1;\n this.fill = 1;\n this.vFill = 1;\n this.initial = 1;\n this.secondary = 1;\n this.max = 1;\n this.min = 1;\n }\n /**\r\n * Calculate initial, secondary and maximum zoom level for the specified slide.\r\n *\r\n * It should be called when either image or viewport size changes.\r\n *\r\n * @param {number} maxWidth\r\n * @param {number} maxHeight\r\n * @param {Point} panAreaSize\r\n */\n\n\n update(maxWidth, maxHeight, panAreaSize) {\n /** @type {Point} */\n const elementSize = {\n x: maxWidth,\n y: maxHeight\n };\n this.elementSize = elementSize;\n this.panAreaSize = panAreaSize;\n const hRatio = panAreaSize.x / elementSize.x;\n const vRatio = panAreaSize.y / elementSize.y;\n this.fit = Math.min(1, hRatio < vRatio ? hRatio : vRatio);\n this.fill = Math.min(1, hRatio > vRatio ? hRatio : vRatio); // zoom.vFill defines zoom level of the image\n // when it has 100% of viewport vertical space (height)\n\n this.vFill = Math.min(1, vRatio);\n this.initial = this._getInitial();\n this.secondary = this._getSecondary();\n this.max = Math.max(this.initial, this.secondary, this._getMax());\n this.min = Math.min(this.fit, this.initial, this.secondary);\n\n if (this.pswp) {\n this.pswp.dispatch('zoomLevelsUpdate', {\n zoomLevels: this,\n slideData: this.itemData\n });\n }\n }\n /**\r\n * Parses user-defined zoom option.\r\n *\r\n * @private\r\n * @param {'initial' | 'secondary' | 'max'} optionPrefix Zoom level option prefix (initial, secondary, max)\r\n * @returns { number | undefined }\r\n */\n\n\n _parseZoomLevelOption(optionPrefix) {\n const optionName =\n /** @type {'initialZoomLevel' | 'secondaryZoomLevel' | 'maxZoomLevel'} */\n optionPrefix + 'ZoomLevel';\n const optionValue = this.options[optionName];\n\n if (!optionValue) {\n return;\n }\n\n if (typeof optionValue === 'function') {\n return optionValue(this);\n }\n\n if (optionValue === 'fill') {\n return this.fill;\n }\n\n if (optionValue === 'fit') {\n return this.fit;\n }\n\n return Number(optionValue);\n }\n /**\r\n * Get zoom level to which image will be zoomed after double-tap gesture,\r\n * or when user clicks on zoom icon,\r\n * or mouse-click on image itself.\r\n * If you return 1 image will be zoomed to its original size.\r\n *\r\n * @private\r\n * @return {number}\r\n */\n\n\n _getSecondary() {\n let currZoomLevel = this._parseZoomLevelOption('secondary');\n\n if (currZoomLevel) {\n return currZoomLevel;\n } // 3x of \"fit\" state, but not larger than original\n\n\n currZoomLevel = Math.min(1, this.fit * 3);\n\n if (this.elementSize && currZoomLevel * this.elementSize.x > MAX_IMAGE_WIDTH) {\n currZoomLevel = MAX_IMAGE_WIDTH / this.elementSize.x;\n }\n\n return currZoomLevel;\n }\n /**\r\n * Get initial image zoom level.\r\n *\r\n * @private\r\n * @return {number}\r\n */\n\n\n _getInitial() {\n return this._parseZoomLevelOption('initial') || this.fit;\n }\n /**\r\n * Maximum zoom level when user zooms\r\n * via zoom/pinch gesture,\r\n * via cmd/ctrl-wheel or via trackpad.\r\n *\r\n * @private\r\n * @return {number}\r\n */\n\n\n _getMax() {\n // max zoom level is x4 from \"fit state\",\n // used for zoom gesture and ctrl/trackpad zoom\n return this._parseZoomLevelOption('max') || Math.max(1, this.fit * 4);\n }\n\n}\n\n/** @typedef {import('../photoswipe.js').default} PhotoSwipe */\n/**\r\n * Renders and allows to control a single slide\r\n */\n\nclass Slide {\n /**\r\n * @param {SlideData} data\r\n * @param {number} index\r\n * @param {PhotoSwipe} pswp\r\n */\n constructor(data, index, pswp) {\n this.data = data;\n this.index = index;\n this.pswp = pswp;\n this.isActive = index === pswp.currIndex;\n this.currentResolution = 0;\n /** @type {Point} */\n\n this.panAreaSize = {\n x: 0,\n y: 0\n };\n /** @type {Point} */\n\n this.pan = {\n x: 0,\n y: 0\n };\n this.isFirstSlide = this.isActive && !pswp.opener.isOpen;\n this.zoomLevels = new ZoomLevel(pswp.options, data, index, pswp);\n this.pswp.dispatch('gettingData', {\n slide: this,\n data: this.data,\n index\n });\n this.content = this.pswp.contentLoader.getContentBySlide(this);\n this.container = createElement('pswp__zoom-wrap', 'div');\n /** @type {HTMLElement | null} */\n\n this.holderElement = null;\n this.currZoomLevel = 1;\n /** @type {number} */\n\n this.width = this.content.width;\n /** @type {number} */\n\n this.height = this.content.height;\n this.heavyAppended = false;\n this.bounds = new PanBounds(this);\n this.prevDisplayedWidth = -1;\n this.prevDisplayedHeight = -1;\n this.pswp.dispatch('slideInit', {\n slide: this\n });\n }\n /**\r\n * If this slide is active/current/visible\r\n *\r\n * @param {boolean} isActive\r\n */\n\n\n setIsActive(isActive) {\n if (isActive && !this.isActive) {\n // slide just became active\n this.activate();\n } else if (!isActive && this.isActive) {\n // slide just became non-active\n this.deactivate();\n }\n }\n /**\r\n * Appends slide content to DOM\r\n *\r\n * @param {HTMLElement} holderElement\r\n */\n\n\n append(holderElement) {\n this.holderElement = holderElement;\n this.container.style.transformOrigin = '0 0'; // Slide appended to DOM\n\n if (!this.data) {\n return;\n }\n\n this.calculateSize();\n this.load();\n this.updateContentSize();\n this.appendHeavy();\n this.holderElement.appendChild(this.container);\n this.zoomAndPanToInitial();\n this.pswp.dispatch('firstZoomPan', {\n slide: this\n });\n this.applyCurrentZoomPan();\n this.pswp.dispatch('afterSetContent', {\n slide: this\n });\n\n if (this.isActive) {\n this.activate();\n }\n }\n\n load() {\n this.content.load(false);\n this.pswp.dispatch('slideLoad', {\n slide: this\n });\n }\n /**\r\n * Append \"heavy\" DOM elements\r\n *\r\n * This may depend on a type of slide,\r\n * but generally these are large images.\r\n */\n\n\n appendHeavy() {\n const {\n pswp\n } = this;\n const appendHeavyNearby = true; // todo\n // Avoid appending heavy elements during animations\n\n if (this.heavyAppended || !pswp.opener.isOpen || pswp.mainScroll.isShifted() || !this.isActive && !appendHeavyNearby) {\n return;\n }\n\n if (this.pswp.dispatch('appendHeavy', {\n slide: this\n }).defaultPrevented) {\n return;\n }\n\n this.heavyAppended = true;\n this.content.append();\n this.pswp.dispatch('appendHeavyContent', {\n slide: this\n });\n }\n /**\r\n * Triggered when this slide is active (selected).\r\n *\r\n * If it's part of opening/closing transition -\r\n * activate() will trigger after the transition is ended.\r\n */\n\n\n activate() {\n this.isActive = true;\n this.appendHeavy();\n this.content.activate();\n this.pswp.dispatch('slideActivate', {\n slide: this\n });\n }\n /**\r\n * Triggered when this slide becomes inactive.\r\n *\r\n * Slide can become inactive only after it was active.\r\n */\n\n\n deactivate() {\n this.isActive = false;\n this.content.deactivate();\n\n if (this.currZoomLevel !== this.zoomLevels.initial) {\n // allow filtering\n this.calculateSize();\n } // reset zoom level\n\n\n this.currentResolution = 0;\n this.zoomAndPanToInitial();\n this.applyCurrentZoomPan();\n this.updateContentSize();\n this.pswp.dispatch('slideDeactivate', {\n slide: this\n });\n }\n /**\r\n * The slide should destroy itself, it will never be used again.\r\n * (unbind all events and destroy internal components)\r\n */\n\n\n destroy() {\n this.content.hasSlide = false;\n this.content.remove();\n this.container.remove();\n this.pswp.dispatch('slideDestroy', {\n slide: this\n });\n }\n\n resize() {\n if (this.currZoomLevel === this.zoomLevels.initial || !this.isActive) {\n // Keep initial zoom level if it was before the resize,\n // as well as when this slide is not active\n // Reset position and scale to original state\n this.calculateSize();\n this.currentResolution = 0;\n this.zoomAndPanToInitial();\n this.applyCurrentZoomPan();\n this.updateContentSize();\n } else {\n // readjust pan position if it's beyond the bounds\n this.calculateSize();\n this.bounds.update(this.currZoomLevel);\n this.panTo(this.pan.x, this.pan.y);\n }\n }\n /**\r\n * Apply size to current slide content,\r\n * based on the current resolution and scale.\r\n *\r\n * @param {boolean} [force] if size should be updated even if dimensions weren't changed\r\n */\n\n\n updateContentSize(force) {\n // Use initial zoom level\n // if resolution is not defined (user didn't zoom yet)\n const scaleMultiplier = this.currentResolution || this.zoomLevels.initial;\n\n if (!scaleMultiplier) {\n return;\n }\n\n const width = Math.round(this.width * scaleMultiplier) || this.pswp.viewportSize.x;\n const height = Math.round(this.height * scaleMultiplier) || this.pswp.viewportSize.y;\n\n if (!this.sizeChanged(width, height) && !force) {\n return;\n }\n\n this.content.setDisplayedSize(width, height);\n }\n /**\r\n * @param {number} width\r\n * @param {number} height\r\n */\n\n\n sizeChanged(width, height) {\n if (width !== this.prevDisplayedWidth || height !== this.prevDisplayedHeight) {\n this.prevDisplayedWidth = width;\n this.prevDisplayedHeight = height;\n return true;\n }\n\n return false;\n }\n /** @returns {HTMLImageElement | HTMLDivElement | null | undefined} */\n\n\n getPlaceholderElement() {\n var _this$content$placeho;\n\n return (_this$content$placeho = this.content.placeholder) === null || _this$content$placeho === void 0 ? void 0 : _this$content$placeho.element;\n }\n /**\r\n * Zoom current slide image to...\r\n *\r\n * @param {number} destZoomLevel Destination zoom level.\r\n * @param {Point} [centerPoint]\r\n * Transform origin center point, or false if viewport center should be used.\r\n * @param {number | false} [transitionDuration] Transition duration, may be set to 0.\r\n * @param {boolean} [ignoreBounds] Minimum and maximum zoom levels will be ignored.\r\n */\n\n\n zoomTo(destZoomLevel, centerPoint, transitionDuration, ignoreBounds) {\n const {\n pswp\n } = this;\n\n if (!this.isZoomable() || pswp.mainScroll.isShifted()) {\n return;\n }\n\n pswp.dispatch('beforeZoomTo', {\n destZoomLevel,\n centerPoint,\n transitionDuration\n }); // stop all pan and zoom transitions\n\n pswp.animations.stopAllPan(); // if (!centerPoint) {\n // centerPoint = pswp.getViewportCenterPoint();\n // }\n\n const prevZoomLevel = this.currZoomLevel;\n\n if (!ignoreBounds) {\n destZoomLevel = clamp(destZoomLevel, this.zoomLevels.min, this.zoomLevels.max);\n } // if (transitionDuration === undefined) {\n // transitionDuration = this.pswp.options.zoomAnimationDuration;\n // }\n\n\n this.setZoomLevel(destZoomLevel);\n this.pan.x = this.calculateZoomToPanOffset('x', centerPoint, prevZoomLevel);\n this.pan.y = this.calculateZoomToPanOffset('y', centerPoint, prevZoomLevel);\n roundPoint(this.pan);\n\n const finishTransition = () => {\n this._setResolution(destZoomLevel);\n\n this.applyCurrentZoomPan();\n };\n\n if (!transitionDuration) {\n finishTransition();\n } else {\n pswp.animations.startTransition({\n isPan: true,\n name: 'zoomTo',\n target: this.container,\n transform: this.getCurrentTransform(),\n onComplete: finishTransition,\n duration: transitionDuration,\n easing: pswp.options.easing\n });\n }\n }\n /**\r\n * @param {Point} [centerPoint]\r\n */\n\n\n toggleZoom(centerPoint) {\n this.zoomTo(this.currZoomLevel === this.zoomLevels.initial ? this.zoomLevels.secondary : this.zoomLevels.initial, centerPoint, this.pswp.options.zoomAnimationDuration);\n }\n /**\r\n * Updates zoom level property and recalculates new pan bounds,\r\n * unlike zoomTo it does not apply transform (use applyCurrentZoomPan)\r\n *\r\n * @param {number} currZoomLevel\r\n */\n\n\n setZoomLevel(currZoomLevel) {\n this.currZoomLevel = currZoomLevel;\n this.bounds.update(this.currZoomLevel);\n }\n /**\r\n * Get pan position after zoom at a given `point`.\r\n *\r\n * Always call setZoomLevel(newZoomLevel) beforehand to recalculate\r\n * pan bounds according to the new zoom level.\r\n *\r\n * @param {'x' | 'y'} axis\r\n * @param {Point} [point]\r\n * point based on which zoom is performed, usually refers to the current mouse position,\r\n * if false - viewport center will be used.\r\n * @param {number} [prevZoomLevel] Zoom level before new zoom was applied.\r\n * @returns {number}\r\n */\n\n\n calculateZoomToPanOffset(axis, point, prevZoomLevel) {\n const totalPanDistance = this.bounds.max[axis] - this.bounds.min[axis];\n\n if (totalPanDistance === 0) {\n return this.bounds.center[axis];\n }\n\n if (!point) {\n point = this.pswp.getViewportCenterPoint();\n }\n\n if (!prevZoomLevel) {\n prevZoomLevel = this.zoomLevels.initial;\n }\n\n const zoomFactor = this.currZoomLevel / prevZoomLevel;\n return this.bounds.correctPan(axis, (this.pan[axis] - point[axis]) * zoomFactor + point[axis]);\n }\n /**\r\n * Apply pan and keep it within bounds.\r\n *\r\n * @param {number} panX\r\n * @param {number} panY\r\n */\n\n\n panTo(panX, panY) {\n this.pan.x = this.bounds.correctPan('x', panX);\n this.pan.y = this.bounds.correctPan('y', panY);\n this.applyCurrentZoomPan();\n }\n /**\r\n * If the slide in the current state can be panned by the user\r\n * @returns {boolean}\r\n */\n\n\n isPannable() {\n return Boolean(this.width) && this.currZoomLevel > this.zoomLevels.fit;\n }\n /**\r\n * If the slide can be zoomed\r\n * @returns {boolean}\r\n */\n\n\n isZoomable() {\n return Boolean(this.width) && this.content.isZoomable();\n }\n /**\r\n * Apply transform and scale based on\r\n * the current pan position (this.pan) and zoom level (this.currZoomLevel)\r\n */\n\n\n applyCurrentZoomPan() {\n this._applyZoomTransform(this.pan.x, this.pan.y, this.currZoomLevel);\n\n if (this === this.pswp.currSlide) {\n this.pswp.dispatch('zoomPanUpdate', {\n slide: this\n });\n }\n }\n\n zoomAndPanToInitial() {\n this.currZoomLevel = this.zoomLevels.initial; // pan according to the zoom level\n\n this.bounds.update(this.currZoomLevel);\n equalizePoints(this.pan, this.bounds.center);\n this.pswp.dispatch('initialZoomPan', {\n slide: this\n });\n }\n /**\r\n * Set translate and scale based on current resolution\r\n *\r\n * @param {number} x\r\n * @param {number} y\r\n * @param {number} zoom\r\n * @private\r\n */\n\n\n _applyZoomTransform(x, y, zoom) {\n zoom /= this.currentResolution || this.zoomLevels.initial;\n setTransform(this.container, x, y, zoom);\n }\n\n calculateSize() {\n const {\n pswp\n } = this;\n equalizePoints(this.panAreaSize, getPanAreaSize(pswp.options, pswp.viewportSize, this.data, this.index));\n this.zoomLevels.update(this.width, this.height, this.panAreaSize);\n pswp.dispatch('calcSlideSize', {\n slide: this\n });\n }\n /** @returns {string} */\n\n\n getCurrentTransform() {\n const scale = this.currZoomLevel / (this.currentResolution || this.zoomLevels.initial);\n return toTransformString(this.pan.x, this.pan.y, scale);\n }\n /**\r\n * Set resolution and re-render the image.\r\n *\r\n * For example, if the real image size is 2000x1500,\r\n * and resolution is 0.5 - it will be rendered as 1000x750.\r\n *\r\n * Image with zoom level 2 and resolution 0.5 is\r\n * the same as image with zoom level 1 and resolution 1.\r\n *\r\n * Used to optimize animations and make\r\n * sure that browser renders image in the highest quality.\r\n * Also used by responsive images to load the correct one.\r\n *\r\n * @param {number} newResolution\r\n */\n\n\n _setResolution(newResolution) {\n if (newResolution === this.currentResolution) {\n return;\n }\n\n this.currentResolution = newResolution;\n this.updateContentSize();\n this.pswp.dispatch('resolutionChanged');\n }\n\n}\n\n/** @typedef {import('../photoswipe.js').Point} Point */\n\n/** @typedef {import('./gestures.js').default} Gestures */\n\nconst PAN_END_FRICTION = 0.35;\nconst VERTICAL_DRAG_FRICTION = 0.6; // 1 corresponds to the third of viewport height\n\nconst MIN_RATIO_TO_CLOSE = 0.4; // Minimum speed required to navigate\n// to next or previous slide\n\nconst MIN_NEXT_SLIDE_SPEED = 0.5;\n/**\r\n * @param {number} initialVelocity\r\n * @param {number} decelerationRate\r\n * @returns {number}\r\n */\n\nfunction project(initialVelocity, decelerationRate) {\n return initialVelocity * decelerationRate / (1 - decelerationRate);\n}\n/**\r\n * Handles single pointer dragging\r\n */\n\n\nclass DragHandler {\n /**\r\n * @param {Gestures} gestures\r\n */\n constructor(gestures) {\n this.gestures = gestures;\n this.pswp = gestures.pswp;\n /** @type {Point} */\n\n this.startPan = {\n x: 0,\n y: 0\n };\n }\n\n start() {\n if (this.pswp.currSlide) {\n equalizePoints(this.startPan, this.pswp.currSlide.pan);\n }\n\n this.pswp.animations.stopAll();\n }\n\n change() {\n const {\n p1,\n prevP1,\n dragAxis\n } = this.gestures;\n const {\n currSlide\n } = this.pswp;\n\n if (dragAxis === 'y' && this.pswp.options.closeOnVerticalDrag && currSlide && currSlide.currZoomLevel <= currSlide.zoomLevels.fit && !this.gestures.isMultitouch) {\n // Handle vertical drag to close\n const panY = currSlide.pan.y + (p1.y - prevP1.y);\n\n if (!this.pswp.dispatch('verticalDrag', {\n panY\n }).defaultPrevented) {\n this._setPanWithFriction('y', panY, VERTICAL_DRAG_FRICTION);\n\n const bgOpacity = 1 - Math.abs(this._getVerticalDragRatio(currSlide.pan.y));\n this.pswp.applyBgOpacity(bgOpacity);\n currSlide.applyCurrentZoomPan();\n }\n } else {\n const mainScrollChanged = this._panOrMoveMainScroll('x');\n\n if (!mainScrollChanged) {\n this._panOrMoveMainScroll('y');\n\n if (currSlide) {\n roundPoint(currSlide.pan);\n currSlide.applyCurrentZoomPan();\n }\n }\n }\n }\n\n end() {\n const {\n velocity\n } = this.gestures;\n const {\n mainScroll,\n currSlide\n } = this.pswp;\n let indexDiff = 0;\n this.pswp.animations.stopAll(); // Handle main scroll if it's shifted\n\n if (mainScroll.isShifted()) {\n // Position of the main scroll relative to the viewport\n const mainScrollShiftDiff = mainScroll.x - mainScroll.getCurrSlideX(); // Ratio between 0 and 1:\n // 0 - slide is not visible at all,\n // 0.5 - half of the slide is visible\n // 1 - slide is fully visible\n\n const currentSlideVisibilityRatio = mainScrollShiftDiff / this.pswp.viewportSize.x; // Go next slide.\n //\n // - if velocity and its direction is matched,\n // and we see at least tiny part of the next slide\n //\n // - or if we see less than 50% of the current slide\n // and velocity is close to 0\n //\n\n if (velocity.x < -MIN_NEXT_SLIDE_SPEED && currentSlideVisibilityRatio < 0 || velocity.x < 0.1 && currentSlideVisibilityRatio < -0.5) {\n // Go to next slide\n indexDiff = 1;\n velocity.x = Math.min(velocity.x, 0);\n } else if (velocity.x > MIN_NEXT_SLIDE_SPEED && currentSlideVisibilityRatio > 0 || velocity.x > -0.1 && currentSlideVisibilityRatio > 0.5) {\n // Go to prev slide\n indexDiff = -1;\n velocity.x = Math.max(velocity.x, 0);\n }\n\n mainScroll.moveIndexBy(indexDiff, true, velocity.x);\n } // Restore zoom level\n\n\n if (currSlide && currSlide.currZoomLevel > currSlide.zoomLevels.max || this.gestures.isMultitouch) {\n this.gestures.zoomLevels.correctZoomPan(true);\n } else {\n // we run two animations instead of one,\n // as each axis has own pan boundaries and thus different spring function\n // (correctZoomPan does not have this functionality,\n // it animates all properties with single timing function)\n this._finishPanGestureForAxis('x');\n\n this._finishPanGestureForAxis('y');\n }\n }\n /**\r\n * @private\r\n * @param {'x' | 'y'} axis\r\n */\n\n\n _finishPanGestureForAxis(axis) {\n const {\n velocity\n } = this.gestures;\n const {\n currSlide\n } = this.pswp;\n\n if (!currSlide) {\n return;\n }\n\n const {\n pan,\n bounds\n } = currSlide;\n const panPos = pan[axis];\n const restoreBgOpacity = this.pswp.bgOpacity < 1 && axis === 'y'; // 0.995 means - scroll view loses 0.5% of its velocity per millisecond\n // Increasing this number will reduce travel distance\n\n const decelerationRate = 0.995; // 0.99\n // Pan position if there is no bounds\n\n const projectedPosition = panPos + project(velocity[axis], decelerationRate);\n\n if (restoreBgOpacity) {\n const vDragRatio = this._getVerticalDragRatio(panPos);\n\n const projectedVDragRatio = this._getVerticalDragRatio(projectedPosition); // If we are above and moving upwards,\n // or if we are below and moving downwards\n\n\n if (vDragRatio < 0 && projectedVDragRatio < -MIN_RATIO_TO_CLOSE || vDragRatio > 0 && projectedVDragRatio > MIN_RATIO_TO_CLOSE) {\n this.pswp.close();\n return;\n }\n } // Pan position with corrected bounds\n\n\n const correctedPanPosition = bounds.correctPan(axis, projectedPosition); // Exit if pan position should not be changed\n // or if speed it too low\n\n if (panPos === correctedPanPosition) {\n return;\n } // Overshoot if the final position is out of pan bounds\n\n\n const dampingRatio = correctedPanPosition === projectedPosition ? 1 : 0.82;\n const initialBgOpacity = this.pswp.bgOpacity;\n const totalPanDist = correctedPanPosition - panPos;\n this.pswp.animations.startSpring({\n name: 'panGesture' + axis,\n isPan: true,\n start: panPos,\n end: correctedPanPosition,\n velocity: velocity[axis],\n dampingRatio,\n onUpdate: pos => {\n // Animate opacity of background relative to Y pan position of an image\n if (restoreBgOpacity && this.pswp.bgOpacity < 1) {\n // 0 - start of animation, 1 - end of animation\n const animationProgressRatio = 1 - (correctedPanPosition - pos) / totalPanDist; // We clamp opacity to keep it between 0 and 1.\n // As progress ratio can be larger than 1 due to overshoot,\n // and we do not want to bounce opacity.\n\n this.pswp.applyBgOpacity(clamp(initialBgOpacity + (1 - initialBgOpacity) * animationProgressRatio, 0, 1));\n }\n\n pan[axis] = Math.floor(pos);\n currSlide.applyCurrentZoomPan();\n }\n });\n }\n /**\r\n * Update position of the main scroll,\r\n * or/and update pan position of the current slide.\r\n *\r\n * Should return true if it changes (or can change) main scroll.\r\n *\r\n * @private\r\n * @param {'x' | 'y'} axis\r\n * @returns {boolean}\r\n */\n\n\n _panOrMoveMainScroll(axis) {\n const {\n p1,\n dragAxis,\n prevP1,\n isMultitouch\n } = this.gestures;\n const {\n currSlide,\n mainScroll\n } = this.pswp;\n const delta = p1[axis] - prevP1[axis];\n const newMainScrollX = mainScroll.x + delta;\n\n if (!delta || !currSlide) {\n return false;\n } // Always move main scroll if image can not be panned\n\n\n if (axis === 'x' && !currSlide.isPannable() && !isMultitouch) {\n mainScroll.moveTo(newMainScrollX, true);\n return true; // changed main scroll\n }\n\n const {\n bounds\n } = currSlide;\n const newPan = currSlide.pan[axis] + delta;\n\n if (this.pswp.options.allowPanToNext && dragAxis === 'x' && axis === 'x' && !isMultitouch) {\n const currSlideMainScrollX = mainScroll.getCurrSlideX(); // Position of the main scroll relative to the viewport\n\n const mainScrollShiftDiff = mainScroll.x - currSlideMainScrollX;\n const isLeftToRight = delta > 0;\n const isRightToLeft = !isLeftToRight;\n\n if (newPan > bounds.min[axis] && isLeftToRight) {\n // Panning from left to right, beyond the left edge\n // Wether the image was at minimum pan position (or less)\n // when this drag gesture started.\n // Minimum pan position refers to the left edge of the image.\n const wasAtMinPanPosition = bounds.min[axis] <= this.startPan[axis];\n\n if (wasAtMinPanPosition) {\n mainScroll.moveTo(newMainScrollX, true);\n return true;\n } else {\n this._setPanWithFriction(axis, newPan); //currSlide.pan[axis] = newPan;\n\n }\n } else if (newPan < bounds.max[axis] && isRightToLeft) {\n // Paning from right to left, beyond the right edge\n // Maximum pan position refers to the right edge of the image.\n const wasAtMaxPanPosition = this.startPan[axis] <= bounds.max[axis];\n\n if (wasAtMaxPanPosition) {\n mainScroll.moveTo(newMainScrollX, true);\n return true;\n } else {\n this._setPanWithFriction(axis, newPan); //currSlide.pan[axis] = newPan;\n\n }\n } else {\n // If main scroll is shifted\n if (mainScrollShiftDiff !== 0) {\n // If main scroll is shifted right\n if (mainScrollShiftDiff > 0\n /*&& isRightToLeft*/\n ) {\n mainScroll.moveTo(Math.max(newMainScrollX, currSlideMainScrollX), true);\n return true;\n } else if (mainScrollShiftDiff < 0\n /*&& isLeftToRight*/\n ) {\n // Main scroll is shifted left (Position is less than 0 comparing to the viewport 0)\n mainScroll.moveTo(Math.min(newMainScrollX, currSlideMainScrollX), true);\n return true;\n }\n } else {\n // We are within pan bounds, so just pan\n this._setPanWithFriction(axis, newPan);\n }\n }\n } else {\n if (axis === 'y') {\n // Do not pan vertically if main scroll is shifted o\n if (!mainScroll.isShifted() && bounds.min.y !== bounds.max.y) {\n this._setPanWithFriction(axis, newPan);\n }\n } else {\n this._setPanWithFriction(axis, newPan);\n }\n }\n\n return false;\n } // If we move above - the ratio is negative\n // If we move below the ratio is positive\n\n /**\r\n * Relation between pan Y position and third of viewport height.\r\n *\r\n * When we are at initial position (center bounds) - the ratio is 0,\r\n * if position is shifted upwards - the ratio is negative,\r\n * if position is shifted downwards - the ratio is positive.\r\n *\r\n * @private\r\n * @param {number} panY The current pan Y position.\r\n * @returns {number}\r\n */\n\n\n _getVerticalDragRatio(panY) {\n var _this$pswp$currSlide$, _this$pswp$currSlide;\n\n return (panY - ((_this$pswp$currSlide$ = (_this$pswp$currSlide = this.pswp.currSlide) === null || _this$pswp$currSlide === void 0 ? void 0 : _this$pswp$currSlide.bounds.center.y) !== null && _this$pswp$currSlide$ !== void 0 ? _this$pswp$currSlide$ : 0)) / (this.pswp.viewportSize.y / 3);\n }\n /**\r\n * Set pan position of the current slide.\r\n * Apply friction if the position is beyond the pan bounds,\r\n * or if custom friction is defined.\r\n *\r\n * @private\r\n * @param {'x' | 'y'} axis\r\n * @param {number} potentialPan\r\n * @param {number} [customFriction] (0.1 - 1)\r\n */\n\n\n _setPanWithFriction(axis, potentialPan, customFriction) {\n const {\n currSlide\n } = this.pswp;\n\n if (!currSlide) {\n return;\n }\n\n const {\n pan,\n bounds\n } = currSlide;\n const correctedPan = bounds.correctPan(axis, potentialPan); // If we are out of pan bounds\n\n if (correctedPan !== potentialPan || customFriction) {\n const delta = Math.round(potentialPan - pan[axis]);\n pan[axis] += delta * (customFriction || PAN_END_FRICTION);\n } else {\n pan[axis] = potentialPan;\n }\n }\n\n}\n\n/** @typedef {import('../photoswipe.js').Point} Point */\n\n/** @typedef {import('./gestures.js').default} Gestures */\n\nconst UPPER_ZOOM_FRICTION = 0.05;\nconst LOWER_ZOOM_FRICTION = 0.15;\n/**\r\n * Get center point between two points\r\n *\r\n * @param {Point} p\r\n * @param {Point} p1\r\n * @param {Point} p2\r\n * @returns {Point}\r\n */\n\nfunction getZoomPointsCenter(p, p1, p2) {\n p.x = (p1.x + p2.x) / 2;\n p.y = (p1.y + p2.y) / 2;\n return p;\n}\n\nclass ZoomHandler {\n /**\r\n * @param {Gestures} gestures\r\n */\n constructor(gestures) {\n this.gestures = gestures;\n /**\r\n * @private\r\n * @type {Point}\r\n */\n\n this._startPan = {\n x: 0,\n y: 0\n };\n /**\r\n * @private\r\n * @type {Point}\r\n */\n\n this._startZoomPoint = {\n x: 0,\n y: 0\n };\n /**\r\n * @private\r\n * @type {Point}\r\n */\n\n this._zoomPoint = {\n x: 0,\n y: 0\n };\n /** @private */\n\n this._wasOverFitZoomLevel = false;\n /** @private */\n\n this._startZoomLevel = 1;\n }\n\n start() {\n const {\n currSlide\n } = this.gestures.pswp;\n\n if (currSlide) {\n this._startZoomLevel = currSlide.currZoomLevel;\n equalizePoints(this._startPan, currSlide.pan);\n }\n\n this.gestures.pswp.animations.stopAllPan();\n this._wasOverFitZoomLevel = false;\n }\n\n change() {\n const {\n p1,\n startP1,\n p2,\n startP2,\n pswp\n } = this.gestures;\n const {\n currSlide\n } = pswp;\n\n if (!currSlide) {\n return;\n }\n\n const minZoomLevel = currSlide.zoomLevels.min;\n const maxZoomLevel = currSlide.zoomLevels.max;\n\n if (!currSlide.isZoomable() || pswp.mainScroll.isShifted()) {\n return;\n }\n\n getZoomPointsCenter(this._startZoomPoint, startP1, startP2);\n getZoomPointsCenter(this._zoomPoint, p1, p2);\n\n let currZoomLevel = 1 / getDistanceBetween(startP1, startP2) * getDistanceBetween(p1, p2) * this._startZoomLevel; // slightly over the zoom.fit\n\n\n if (currZoomLevel > currSlide.zoomLevels.initial + currSlide.zoomLevels.initial / 15) {\n this._wasOverFitZoomLevel = true;\n }\n\n if (currZoomLevel < minZoomLevel) {\n if (pswp.options.pinchToClose && !this._wasOverFitZoomLevel && this._startZoomLevel <= currSlide.zoomLevels.initial) {\n // fade out background if zooming out\n const bgOpacity = 1 - (minZoomLevel - currZoomLevel) / (minZoomLevel / 1.2);\n\n if (!pswp.dispatch('pinchClose', {\n bgOpacity\n }).defaultPrevented) {\n pswp.applyBgOpacity(bgOpacity);\n }\n } else {\n // Apply the friction if zoom level is below the min\n currZoomLevel = minZoomLevel - (minZoomLevel - currZoomLevel) * LOWER_ZOOM_FRICTION;\n }\n } else if (currZoomLevel > maxZoomLevel) {\n // Apply the friction if zoom level is above the max\n currZoomLevel = maxZoomLevel + (currZoomLevel - maxZoomLevel) * UPPER_ZOOM_FRICTION;\n }\n\n currSlide.pan.x = this._calculatePanForZoomLevel('x', currZoomLevel);\n currSlide.pan.y = this._calculatePanForZoomLevel('y', currZoomLevel);\n currSlide.setZoomLevel(currZoomLevel);\n currSlide.applyCurrentZoomPan();\n }\n\n end() {\n const {\n pswp\n } = this.gestures;\n const {\n currSlide\n } = pswp;\n\n if ((!currSlide || currSlide.currZoomLevel < currSlide.zoomLevels.initial) && !this._wasOverFitZoomLevel && pswp.options.pinchToClose) {\n pswp.close();\n } else {\n this.correctZoomPan();\n }\n }\n /**\r\n * @private\r\n * @param {'x' | 'y'} axis\r\n * @param {number} currZoomLevel\r\n * @returns {number}\r\n */\n\n\n _calculatePanForZoomLevel(axis, currZoomLevel) {\n const zoomFactor = currZoomLevel / this._startZoomLevel;\n return this._zoomPoint[axis] - (this._startZoomPoint[axis] - this._startPan[axis]) * zoomFactor;\n }\n /**\r\n * Correct currZoomLevel and pan if they are\r\n * beyond minimum or maximum values.\r\n * With animation.\r\n *\r\n * @param {boolean} [ignoreGesture]\r\n * Wether gesture coordinates should be ignored when calculating destination pan position.\r\n */\n\n\n correctZoomPan(ignoreGesture) {\n const {\n pswp\n } = this.gestures;\n const {\n currSlide\n } = pswp;\n\n if (!(currSlide !== null && currSlide !== void 0 && currSlide.isZoomable())) {\n return;\n }\n\n if (this._zoomPoint.x === 0) {\n ignoreGesture = true;\n }\n\n const prevZoomLevel = currSlide.currZoomLevel;\n /** @type {number} */\n\n let destinationZoomLevel;\n let currZoomLevelNeedsChange = true;\n\n if (prevZoomLevel < currSlide.zoomLevels.initial) {\n destinationZoomLevel = currSlide.zoomLevels.initial; // zoom to min\n } else if (prevZoomLevel > currSlide.zoomLevels.max) {\n destinationZoomLevel = currSlide.zoomLevels.max; // zoom to max\n } else {\n currZoomLevelNeedsChange = false;\n destinationZoomLevel = prevZoomLevel;\n }\n\n const initialBgOpacity = pswp.bgOpacity;\n const restoreBgOpacity = pswp.bgOpacity < 1;\n const initialPan = equalizePoints({\n x: 0,\n y: 0\n }, currSlide.pan);\n let destinationPan = equalizePoints({\n x: 0,\n y: 0\n }, initialPan);\n\n if (ignoreGesture) {\n this._zoomPoint.x = 0;\n this._zoomPoint.y = 0;\n this._startZoomPoint.x = 0;\n this._startZoomPoint.y = 0;\n this._startZoomLevel = prevZoomLevel;\n equalizePoints(this._startPan, initialPan);\n }\n\n if (currZoomLevelNeedsChange) {\n destinationPan = {\n x: this._calculatePanForZoomLevel('x', destinationZoomLevel),\n y: this._calculatePanForZoomLevel('y', destinationZoomLevel)\n };\n } // set zoom level, so pan bounds are updated according to it\n\n\n currSlide.setZoomLevel(destinationZoomLevel);\n destinationPan = {\n x: currSlide.bounds.correctPan('x', destinationPan.x),\n y: currSlide.bounds.correctPan('y', destinationPan.y)\n }; // return zoom level and its bounds to initial\n\n currSlide.setZoomLevel(prevZoomLevel);\n const panNeedsChange = !pointsEqual(destinationPan, initialPan);\n\n if (!panNeedsChange && !currZoomLevelNeedsChange && !restoreBgOpacity) {\n // update resolution after gesture\n currSlide._setResolution(destinationZoomLevel);\n\n currSlide.applyCurrentZoomPan(); // nothing to animate\n\n return;\n }\n\n pswp.animations.stopAllPan();\n pswp.animations.startSpring({\n isPan: true,\n start: 0,\n end: 1000,\n velocity: 0,\n dampingRatio: 1,\n naturalFrequency: 40,\n onUpdate: now => {\n now /= 1000; // 0 - start, 1 - end\n\n if (panNeedsChange || currZoomLevelNeedsChange) {\n if (panNeedsChange) {\n currSlide.pan.x = initialPan.x + (destinationPan.x - initialPan.x) * now;\n currSlide.pan.y = initialPan.y + (destinationPan.y - initialPan.y) * now;\n }\n\n if (currZoomLevelNeedsChange) {\n const newZoomLevel = prevZoomLevel + (destinationZoomLevel - prevZoomLevel) * now;\n currSlide.setZoomLevel(newZoomLevel);\n }\n\n currSlide.applyCurrentZoomPan();\n } // Restore background opacity\n\n\n if (restoreBgOpacity && pswp.bgOpacity < 1) {\n // We clamp opacity to keep it between 0 and 1.\n // As progress ratio can be larger than 1 due to overshoot,\n // and we do not want to bounce opacity.\n pswp.applyBgOpacity(clamp(initialBgOpacity + (1 - initialBgOpacity) * now, 0, 1));\n }\n },\n onComplete: () => {\n // update resolution after transition ends\n currSlide._setResolution(destinationZoomLevel);\n\n currSlide.applyCurrentZoomPan();\n }\n });\n }\n\n}\n\n/**\r\n * @template {string} T\r\n * @template {string} P\r\n * @typedef {import('../types.js').AddPostfix<T, P>} AddPostfix<T, P>\r\n */\n\n/** @typedef {import('./gestures.js').default} Gestures */\n\n/** @typedef {import('../photoswipe.js').Point} Point */\n\n/** @typedef {'imageClick' | 'bgClick' | 'tap' | 'doubleTap'} Actions */\n\n/**\r\n * Whether the tap was performed on the main slide\r\n * (rather than controls or caption).\r\n *\r\n * @param {PointerEvent} event\r\n * @returns {boolean}\r\n */\nfunction didTapOnMainContent(event) {\n return !!\n /** @type {HTMLElement} */\n event.target.closest('.pswp__container');\n}\n/**\r\n * Tap, double-tap handler.\r\n */\n\n\nclass TapHandler {\n /**\r\n * @param {Gestures} gestures\r\n */\n constructor(gestures) {\n this.gestures = gestures;\n }\n /**\r\n * @param {Point} point\r\n * @param {PointerEvent} originalEvent\r\n */\n\n\n click(point, originalEvent) {\n const targetClassList =\n /** @type {HTMLElement} */\n originalEvent.target.classList;\n const isImageClick = targetClassList.contains('pswp__img');\n const isBackgroundClick = targetClassList.contains('pswp__item') || targetClassList.contains('pswp__zoom-wrap');\n\n if (isImageClick) {\n this._doClickOrTapAction('imageClick', point, originalEvent);\n } else if (isBackgroundClick) {\n this._doClickOrTapAction('bgClick', point, originalEvent);\n }\n }\n /**\r\n * @param {Point} point\r\n * @param {PointerEvent} originalEvent\r\n */\n\n\n tap(point, originalEvent) {\n if (didTapOnMainContent(originalEvent)) {\n this._doClickOrTapAction('tap', point, originalEvent);\n }\n }\n /**\r\n * @param {Point} point\r\n * @param {PointerEvent} originalEvent\r\n */\n\n\n doubleTap(point, originalEvent) {\n if (didTapOnMainContent(originalEvent)) {\n this._doClickOrTapAction('doubleTap', point, originalEvent);\n }\n }\n /**\r\n * @private\r\n * @param {Actions} actionName\r\n * @param {Point} point\r\n * @param {PointerEvent} originalEvent\r\n */\n\n\n _doClickOrTapAction(actionName, point, originalEvent) {\n var _this$gestures$pswp$e;\n\n const {\n pswp\n } = this.gestures;\n const {\n currSlide\n } = pswp;\n const actionFullName =\n /** @type {AddPostfix<Actions, 'Action'>} */\n actionName + 'Action';\n const optionValue = pswp.options[actionFullName];\n\n if (pswp.dispatch(actionFullName, {\n point,\n originalEvent\n }).defaultPrevented) {\n return;\n }\n\n if (typeof optionValue === 'function') {\n optionValue.call(pswp, point, originalEvent);\n return;\n }\n\n switch (optionValue) {\n case 'close':\n case 'next':\n pswp[optionValue]();\n break;\n\n case 'zoom':\n currSlide === null || currSlide === void 0 || currSlide.toggleZoom(point);\n break;\n\n case 'zoom-or-close':\n // by default click zooms current image,\n // if it can not be zoomed - gallery will be closed\n if (currSlide !== null && currSlide !== void 0 && currSlide.isZoomable() && currSlide.zoomLevels.secondary !== currSlide.zoomLevels.initial) {\n currSlide.toggleZoom(point);\n } else if (pswp.options.clickToCloseNonZoomable) {\n pswp.close();\n }\n\n break;\n\n case 'toggle-controls':\n (_this$gestures$pswp$e = this.gestures.pswp.element) === null || _this$gestures$pswp$e === void 0 || _this$gestures$pswp$e.classList.toggle('pswp--ui-visible'); // if (_controlsVisible) {\n // _ui.hideControls();\n // } else {\n // _ui.showControls();\n // }\n\n break;\n }\n }\n\n}\n\n/** @typedef {import('../photoswipe.js').default} PhotoSwipe */\n\n/** @typedef {import('../photoswipe.js').Point} Point */\n// How far should user should drag\n// until we can determine that the gesture is swipe and its direction\n\nconst AXIS_SWIPE_HYSTERISIS = 10; //const PAN_END_FRICTION = 0.35;\n\nconst DOUBLE_TAP_DELAY = 300; // ms\n\nconst MIN_TAP_DISTANCE = 25; // px\n\n/**\r\n * Gestures class bind touch, pointer or mouse events\r\n * and emits drag to drag-handler and zoom events zoom-handler.\r\n *\r\n * Drag and zoom events are emited in requestAnimationFrame,\r\n * and only when one of pointers was actually changed.\r\n */\n\nclass Gestures {\n /**\r\n * @param {PhotoSwipe} pswp\r\n */\n constructor(pswp) {\n this.pswp = pswp;\n /** @type {'x' | 'y' | null} */\n\n this.dragAxis = null; // point objects are defined once and reused\n // PhotoSwipe keeps track only of two pointers, others are ignored\n\n /** @type {Point} */\n\n this.p1 = {\n x: 0,\n y: 0\n }; // the first pressed pointer\n\n /** @type {Point} */\n\n this.p2 = {\n x: 0,\n y: 0\n }; // the second pressed pointer\n\n /** @type {Point} */\n\n this.prevP1 = {\n x: 0,\n y: 0\n };\n /** @type {Point} */\n\n this.prevP2 = {\n x: 0,\n y: 0\n };\n /** @type {Point} */\n\n this.startP1 = {\n x: 0,\n y: 0\n };\n /** @type {Point} */\n\n this.startP2 = {\n x: 0,\n y: 0\n };\n /** @type {Point} */\n\n this.velocity = {\n x: 0,\n y: 0\n };\n /** @type {Point}\r\n * @private\r\n */\n\n this._lastStartP1 = {\n x: 0,\n y: 0\n };\n /** @type {Point}\r\n * @private\r\n */\n\n this._intervalP1 = {\n x: 0,\n y: 0\n };\n /** @private */\n\n this._numActivePoints = 0;\n /** @type {Point[]}\r\n * @private\r\n */\n\n this._ongoingPointers = [];\n /** @private */\n\n this._touchEventEnabled = 'ontouchstart' in window;\n /** @private */\n\n this._pointerEventEnabled = !!window.PointerEvent;\n this.supportsTouch = this._touchEventEnabled || this._pointerEventEnabled && navigator.maxTouchPoints > 1;\n /** @private */\n\n this._numActivePoints = 0;\n /** @private */\n\n this._intervalTime = 0;\n /** @private */\n\n this._velocityCalculated = false;\n this.isMultitouch = false;\n this.isDragging = false;\n this.isZooming = false;\n /** @type {number | null} */\n\n this.raf = null;\n /** @type {NodeJS.Timeout | null}\r\n * @private\r\n */\n\n this._tapTimer = null;\n\n if (!this.supportsTouch) {\n // disable pan to next slide for non-touch devices\n pswp.options.allowPanToNext = false;\n }\n\n this.drag = new DragHandler(this);\n this.zoomLevels = new ZoomHandler(this);\n this.tapHandler = new TapHandler(this);\n pswp.on('bindEvents', () => {\n pswp.events.add(pswp.scrollWrap, 'click',\n /** @type EventListener */\n this._onClick.bind(this));\n\n if (this._pointerEventEnabled) {\n this._bindEvents('pointer', 'down', 'up', 'cancel');\n } else if (this._touchEventEnabled) {\n this._bindEvents('touch', 'start', 'end', 'cancel'); // In previous versions we also bound mouse event here,\n // in case device supports both touch and mouse events,\n // but newer versions of browsers now support PointerEvent.\n // on iOS10 if you bind touchmove/end after touchstart,\n // and you don't preventDefault touchstart (which PhotoSwipe does),\n // preventDefault will have no effect on touchmove and touchend.\n // Unless you bind it previously.\n\n\n if (pswp.scrollWrap) {\n pswp.scrollWrap.ontouchmove = () => {};\n\n pswp.scrollWrap.ontouchend = () => {};\n }\n } else {\n this._bindEvents('mouse', 'down', 'up');\n }\n });\n }\n /**\r\n * @private\r\n * @param {'mouse' | 'touch' | 'pointer'} pref\r\n * @param {'down' | 'start'} down\r\n * @param {'up' | 'end'} up\r\n * @param {'cancel'} [cancel]\r\n */\n\n\n _bindEvents(pref, down, up, cancel) {\n const {\n pswp\n } = this;\n const {\n events\n } = pswp;\n const cancelEvent = cancel ? pref + cancel : '';\n events.add(pswp.scrollWrap, pref + down,\n /** @type EventListener */\n this.onPointerDown.bind(this));\n events.add(window, pref + 'move',\n /** @type EventListener */\n this.onPointerMove.bind(this));\n events.add(window, pref + up,\n /** @type EventListener */\n this.onPointerUp.bind(this));\n\n if (cancelEvent) {\n events.add(pswp.scrollWrap, cancelEvent,\n /** @type EventListener */\n this.onPointerUp.bind(this));\n }\n }\n /**\r\n * @param {PointerEvent} e\r\n */\n\n\n onPointerDown(e) {\n // We do not call preventDefault for touch events\n // to allow browser to show native dialog on longpress\n // (the one that allows to save image or open it in new tab).\n //\n // Desktop Safari allows to drag images when preventDefault isn't called on mousedown,\n // even though preventDefault IS called on mousemove. That's why we preventDefault mousedown.\n const isMousePointer = e.type === 'mousedown' || e.pointerType === 'mouse'; // Allow dragging only via left mouse button.\n // http://www.quirksmode.org/js/events_properties.html\n // https://developer.mozilla.org/en-US/docs/Web/API/event.button\n\n if (isMousePointer && e.button > 0) {\n return;\n }\n\n const {\n pswp\n } = this; // if PhotoSwipe is opening or closing\n\n if (!pswp.opener.isOpen) {\n e.preventDefault();\n return;\n }\n\n if (pswp.dispatch('pointerDown', {\n originalEvent: e\n }).defaultPrevented) {\n return;\n }\n\n if (isMousePointer) {\n pswp.mouseDetected(); // preventDefault mouse event to prevent\n // browser image drag feature\n\n this._preventPointerEventBehaviour(e, 'down');\n }\n\n pswp.animations.stopAll();\n\n this._updatePoints(e, 'down');\n\n if (this._numActivePoints === 1) {\n this.dragAxis = null; // we need to store initial point to determine the main axis,\n // drag is activated only after the axis is determined\n\n equalizePoints(this.startP1, this.p1);\n }\n\n if (this._numActivePoints > 1) {\n // Tap or double tap should not trigger if more than one pointer\n this._clearTapTimer();\n\n this.isMultitouch = true;\n } else {\n this.isMultitouch = false;\n }\n }\n /**\r\n * @param {PointerEvent} e\r\n */\n\n\n onPointerMove(e) {\n this._preventPointerEventBehaviour(e, 'move');\n\n if (!this._numActivePoints) {\n return;\n }\n\n this._updatePoints(e, 'move');\n\n if (this.pswp.dispatch('pointerMove', {\n originalEvent: e\n }).defaultPrevented) {\n return;\n }\n\n if (this._numActivePoints === 1 && !this.isDragging) {\n if (!this.dragAxis) {\n this._calculateDragDirection();\n } // Drag axis was detected, emit drag.start\n\n\n if (this.dragAxis && !this.isDragging) {\n if (this.isZooming) {\n this.isZooming = false;\n this.zoomLevels.end();\n }\n\n this.isDragging = true;\n\n this._clearTapTimer(); // Tap can not trigger after drag\n // Adjust starting point\n\n\n this._updateStartPoints();\n\n this._intervalTime = Date.now(); //this._startTime = this._intervalTime;\n\n this._velocityCalculated = false;\n equalizePoints(this._intervalP1, this.p1);\n this.velocity.x = 0;\n this.velocity.y = 0;\n this.drag.start();\n\n this._rafStopLoop();\n\n this._rafRenderLoop();\n }\n } else if (this._numActivePoints > 1 && !this.isZooming) {\n this._finishDrag();\n\n this.isZooming = true; // Adjust starting points\n\n this._updateStartPoints();\n\n this.zoomLevels.start();\n\n this._rafStopLoop();\n\n this._rafRenderLoop();\n }\n }\n /**\r\n * @private\r\n */\n\n\n _finishDrag() {\n if (this.isDragging) {\n this.isDragging = false; // Try to calculate velocity,\n // if it wasn't calculated yet in drag.change\n\n if (!this._velocityCalculated) {\n this._updateVelocity(true);\n }\n\n this.drag.end();\n this.dragAxis = null;\n }\n }\n /**\r\n * @param {PointerEvent} e\r\n */\n\n\n onPointerUp(e) {\n if (!this._numActivePoints) {\n return;\n }\n\n this._updatePoints(e, 'up');\n\n if (this.pswp.dispatch('pointerUp', {\n originalEvent: e\n }).defaultPrevented) {\n return;\n }\n\n if (this._numActivePoints === 0) {\n this._rafStopLoop();\n\n if (this.isDragging) {\n this._finishDrag();\n } else if (!this.isZooming && !this.isMultitouch) {\n //this.zoomLevels.correctZoomPan();\n this._finishTap(e);\n }\n }\n\n if (this._numActivePoints < 2 && this.isZooming) {\n this.isZooming = false;\n this.zoomLevels.end();\n\n if (this._numActivePoints === 1) {\n // Since we have 1 point left, we need to reinitiate drag\n this.dragAxis = null;\n\n this._updateStartPoints();\n }\n }\n }\n /**\r\n * @private\r\n */\n\n\n _rafRenderLoop() {\n if (this.isDragging || this.isZooming) {\n this._updateVelocity();\n\n if (this.isDragging) {\n // make sure that pointer moved since the last update\n if (!pointsEqual(this.p1, this.prevP1)) {\n this.drag.change();\n }\n } else\n /* if (this.isZooming) */\n {\n if (!pointsEqual(this.p1, this.prevP1) || !pointsEqual(this.p2, this.prevP2)) {\n this.zoomLevels.change();\n }\n }\n\n this._updatePrevPoints();\n\n this.raf = requestAnimationFrame(this._rafRenderLoop.bind(this));\n }\n }\n /**\r\n * Update velocity at 50ms interval\r\n *\r\n * @private\r\n * @param {boolean} [force]\r\n */\n\n\n _updateVelocity(force) {\n const time = Date.now();\n const duration = time - this._intervalTime;\n\n if (duration < 50 && !force) {\n return;\n }\n\n this.velocity.x = this._getVelocity('x', duration);\n this.velocity.y = this._getVelocity('y', duration);\n this._intervalTime = time;\n equalizePoints(this._intervalP1, this.p1);\n this._velocityCalculated = true;\n }\n /**\r\n * @private\r\n * @param {PointerEvent} e\r\n */\n\n\n _finishTap(e) {\n const {\n mainScroll\n } = this.pswp; // Do not trigger tap events if main scroll is shifted\n\n if (mainScroll.isShifted()) {\n // restore main scroll position\n // (usually happens if stopped in the middle of animation)\n mainScroll.moveIndexBy(0, true);\n return;\n } // Do not trigger tap for touchcancel or pointercancel\n\n\n if (e.type.indexOf('cancel') > 0) {\n return;\n } // Trigger click instead of tap for mouse events\n\n\n if (e.type === 'mouseup' || e.pointerType === 'mouse') {\n this.tapHandler.click(this.startP1, e);\n return;\n } // Disable delay if there is no doubleTapAction\n\n\n const tapDelay = this.pswp.options.doubleTapAction ? DOUBLE_TAP_DELAY : 0; // If tapTimer is defined - we tapped recently,\n // check if the current tap is close to the previous one,\n // if yes - trigger double tap\n\n if (this._tapTimer) {\n this._clearTapTimer(); // Check if two taps were more or less on the same place\n\n\n if (getDistanceBetween(this._lastStartP1, this.startP1) < MIN_TAP_DISTANCE) {\n this.tapHandler.doubleTap(this.startP1, e);\n }\n } else {\n equalizePoints(this._lastStartP1, this.startP1);\n this._tapTimer = setTimeout(() => {\n this.tapHandler.tap(this.startP1, e);\n\n this._clearTapTimer();\n }, tapDelay);\n }\n }\n /**\r\n * @private\r\n */\n\n\n _clearTapTimer() {\n if (this._tapTimer) {\n clearTimeout(this._tapTimer);\n this._tapTimer = null;\n }\n }\n /**\r\n * Get velocity for axis\r\n *\r\n * @private\r\n * @param {'x' | 'y'} axis\r\n * @param {number} duration\r\n * @returns {number}\r\n */\n\n\n _getVelocity(axis, duration) {\n // displacement is like distance, but can be negative.\n const displacement = this.p1[axis] - this._intervalP1[axis];\n\n if (Math.abs(displacement) > 1 && duration > 5) {\n return displacement / duration;\n }\n\n return 0;\n }\n /**\r\n * @private\r\n */\n\n\n _rafStopLoop() {\n if (this.raf) {\n cancelAnimationFrame(this.raf);\n this.raf = null;\n }\n }\n /**\r\n * @private\r\n * @param {PointerEvent} e\r\n * @param {'up' | 'down' | 'move'} pointerType Normalized pointer type\r\n */\n\n\n _preventPointerEventBehaviour(e, pointerType) {\n const preventPointerEvent = this.pswp.applyFilters('preventPointerEvent', true, e, pointerType);\n\n if (preventPointerEvent) {\n e.preventDefault();\n }\n }\n /**\r\n * Parses and normalizes points from the touch, mouse or pointer event.\r\n * Updates p1 and p2.\r\n *\r\n * @private\r\n * @param {PointerEvent | TouchEvent} e\r\n * @param {'up' | 'down' | 'move'} pointerType Normalized pointer type\r\n */\n\n\n _updatePoints(e, pointerType) {\n if (this._pointerEventEnabled) {\n const pointerEvent =\n /** @type {PointerEvent} */\n e; // Try to find the current pointer in ongoing pointers by its ID\n\n const pointerIndex = this._ongoingPointers.findIndex(ongoingPointer => {\n return ongoingPointer.id === pointerEvent.pointerId;\n });\n\n if (pointerType === 'up' && pointerIndex > -1) {\n // release the pointer - remove it from ongoing\n this._ongoingPointers.splice(pointerIndex, 1);\n } else if (pointerType === 'down' && pointerIndex === -1) {\n // add new pointer\n this._ongoingPointers.push(this._convertEventPosToPoint(pointerEvent, {\n x: 0,\n y: 0\n }));\n } else if (pointerIndex > -1) {\n // update existing pointer\n this._convertEventPosToPoint(pointerEvent, this._ongoingPointers[pointerIndex]);\n }\n\n this._numActivePoints = this._ongoingPointers.length; // update points that PhotoSwipe uses\n // to calculate position and scale\n\n if (this._numActivePoints > 0) {\n equalizePoints(this.p1, this._ongoingPointers[0]);\n }\n\n if (this._numActivePoints > 1) {\n equalizePoints(this.p2, this._ongoingPointers[1]);\n }\n } else {\n const touchEvent =\n /** @type {TouchEvent} */\n e;\n this._numActivePoints = 0;\n\n if (touchEvent.type.indexOf('touch') > -1) {\n // Touch Event\n // https://developer.mozilla.org/en-US/docs/Web/API/TouchEvent\n if (touchEvent.touches && touchEvent.touches.length > 0) {\n this._convertEventPosToPoint(touchEvent.touches[0], this.p1);\n\n this._numActivePoints++;\n\n if (touchEvent.touches.length > 1) {\n this._convertEventPosToPoint(touchEvent.touches[1], this.p2);\n\n this._numActivePoints++;\n }\n }\n } else {\n // Mouse Event\n this._convertEventPosToPoint(\n /** @type {PointerEvent} */\n e, this.p1);\n\n if (pointerType === 'up') {\n // clear all points on mouseup\n this._numActivePoints = 0;\n } else {\n this._numActivePoints++;\n }\n }\n }\n }\n /** update points that were used during previous rAF tick\r\n * @private\r\n */\n\n\n _updatePrevPoints() {\n equalizePoints(this.prevP1, this.p1);\n equalizePoints(this.prevP2, this.p2);\n }\n /** update points at the start of gesture\r\n * @private\r\n */\n\n\n _updateStartPoints() {\n equalizePoints(this.startP1, this.p1);\n equalizePoints(this.startP2, this.p2);\n\n this._updatePrevPoints();\n }\n /** @private */\n\n\n _calculateDragDirection() {\n if (this.pswp.mainScroll.isShifted()) {\n // if main scroll position is shifted – direction is always horizontal\n this.dragAxis = 'x';\n } else {\n // calculate delta of the last touchmove tick\n const diff = Math.abs(this.p1.x - this.startP1.x) - Math.abs(this.p1.y - this.startP1.y);\n\n if (diff !== 0) {\n // check if pointer was shifted horizontally or vertically\n const axisToCheck = diff > 0 ? 'x' : 'y';\n\n if (Math.abs(this.p1[axisToCheck] - this.startP1[axisToCheck]) >= AXIS_SWIPE_HYSTERISIS) {\n this.dragAxis = axisToCheck;\n }\n }\n }\n }\n /**\r\n * Converts touch, pointer or mouse event\r\n * to PhotoSwipe point.\r\n *\r\n * @private\r\n * @param {Touch | PointerEvent} e\r\n * @param {Point} p\r\n * @returns {Point}\r\n */\n\n\n _convertEventPosToPoint(e, p) {\n p.x = e.pageX - this.pswp.offset.x;\n p.y = e.pageY - this.pswp.offset.y;\n\n if ('pointerId' in e) {\n p.id = e.pointerId;\n } else if (e.identifier !== undefined) {\n p.id = e.identifier;\n }\n\n return p;\n }\n /**\r\n * @private\r\n * @param {PointerEvent} e\r\n */\n\n\n _onClick(e) {\n // Do not allow click event to pass through after drag\n if (this.pswp.mainScroll.isShifted()) {\n e.preventDefault();\n e.stopPropagation();\n }\n }\n\n}\n\n/** @typedef {import('./photoswipe.js').default} PhotoSwipe */\n\n/** @typedef {import('./slide/slide.js').default} Slide */\n\n/** @typedef {{ el: HTMLDivElement; slide?: Slide }} ItemHolder */\n\nconst MAIN_SCROLL_END_FRICTION = 0.35; // const MIN_SWIPE_TRANSITION_DURATION = 250;\n// const MAX_SWIPE_TRABSITION_DURATION = 500;\n// const DEFAULT_SWIPE_TRANSITION_DURATION = 333;\n\n/**\r\n * Handles movement of the main scrolling container\r\n * (for example, it repositions when user swipes left or right).\r\n *\r\n * Also stores its state.\r\n */\n\nclass MainScroll {\n /**\r\n * @param {PhotoSwipe} pswp\r\n */\n constructor(pswp) {\n this.pswp = pswp;\n this.x = 0;\n this.slideWidth = 0;\n /** @private */\n\n this._currPositionIndex = 0;\n /** @private */\n\n this._prevPositionIndex = 0;\n /** @private */\n\n this._containerShiftIndex = -1;\n /** @type {ItemHolder[]} */\n\n this.itemHolders = [];\n }\n /**\r\n * Position the scroller and slide containers\r\n * according to viewport size.\r\n *\r\n * @param {boolean} [resizeSlides] Whether slides content should resized\r\n */\n\n\n resize(resizeSlides) {\n const {\n pswp\n } = this;\n const newSlideWidth = Math.round(pswp.viewportSize.x + pswp.viewportSize.x * pswp.options.spacing); // Mobile browsers might trigger a resize event during a gesture.\n // (due to toolbar appearing or hiding).\n // Avoid re-adjusting main scroll position if width wasn't changed\n\n const slideWidthChanged = newSlideWidth !== this.slideWidth;\n\n if (slideWidthChanged) {\n this.slideWidth = newSlideWidth;\n this.moveTo(this.getCurrSlideX());\n }\n\n this.itemHolders.forEach((itemHolder, index) => {\n if (slideWidthChanged) {\n setTransform(itemHolder.el, (index + this._containerShiftIndex) * this.slideWidth);\n }\n\n if (resizeSlides && itemHolder.slide) {\n itemHolder.slide.resize();\n }\n });\n }\n /**\r\n * Reset X position of the main scroller to zero\r\n */\n\n\n resetPosition() {\n // Position on the main scroller (offset)\n // it is independent from slide index\n this._currPositionIndex = 0;\n this._prevPositionIndex = 0; // This will force recalculation of size on next resize()\n\n this.slideWidth = 0; // _containerShiftIndex*viewportSize will give you amount of transform of the current slide\n\n this._containerShiftIndex = -1;\n }\n /**\r\n * Create and append array of three items\r\n * that hold data about slides in DOM\r\n */\n\n\n appendHolders() {\n this.itemHolders = []; // append our three slide holders -\n // previous, current, and next\n\n for (let i = 0; i < 3; i++) {\n const el = createElement('pswp__item', 'div', this.pswp.container);\n el.setAttribute('role', 'group');\n el.setAttribute('aria-roledescription', 'slide');\n el.setAttribute('aria-hidden', 'true'); // hide nearby item holders until initial zoom animation finishes (to avoid extra Paints)\n\n el.style.display = i === 1 ? 'block' : 'none';\n this.itemHolders.push({\n el //index: -1\n\n });\n }\n }\n /**\r\n * Whether the main scroll can be horizontally swiped to the next or previous slide.\r\n * @returns {boolean}\r\n */\n\n\n canBeSwiped() {\n return this.pswp.getNumItems() > 1;\n }\n /**\r\n * Move main scroll by X amount of slides.\r\n * For example:\r\n * `-1` will move to the previous slide,\r\n * `0` will reset the scroll position of the current slide,\r\n * `3` will move three slides forward\r\n *\r\n * If loop option is enabled - index will be automatically looped too,\r\n * (for example `-1` will move to the last slide of the gallery).\r\n *\r\n * @param {number} diff\r\n * @param {boolean} [animate]\r\n * @param {number} [velocityX]\r\n * @returns {boolean} whether index was changed or not\r\n */\n\n\n moveIndexBy(diff, animate, velocityX) {\n const {\n pswp\n } = this;\n let newIndex = pswp.potentialIndex + diff;\n const numSlides = pswp.getNumItems();\n\n if (pswp.canLoop()) {\n newIndex = pswp.getLoopedIndex(newIndex);\n const distance = (diff + numSlides) % numSlides;\n\n if (distance <= numSlides / 2) {\n // go forward\n diff = distance;\n } else {\n // go backwards\n diff = distance - numSlides;\n }\n } else {\n if (newIndex < 0) {\n newIndex = 0;\n } else if (newIndex >= numSlides) {\n newIndex = numSlides - 1;\n }\n\n diff = newIndex - pswp.potentialIndex;\n }\n\n pswp.potentialIndex = newIndex;\n this._currPositionIndex -= diff;\n pswp.animations.stopMainScroll();\n const destinationX = this.getCurrSlideX();\n\n if (!animate) {\n this.moveTo(destinationX);\n this.updateCurrItem();\n } else {\n pswp.animations.startSpring({\n isMainScroll: true,\n start: this.x,\n end: destinationX,\n velocity: velocityX || 0,\n naturalFrequency: 30,\n dampingRatio: 1,\n //0.7,\n onUpdate: x => {\n this.moveTo(x);\n },\n onComplete: () => {\n this.updateCurrItem();\n pswp.appendHeavy();\n }\n });\n let currDiff = pswp.potentialIndex - pswp.currIndex;\n\n if (pswp.canLoop()) {\n const currDistance = (currDiff + numSlides) % numSlides;\n\n if (currDistance <= numSlides / 2) {\n // go forward\n currDiff = currDistance;\n } else {\n // go backwards\n currDiff = currDistance - numSlides;\n }\n } // Force-append new slides during transition\n // if difference between slides is more than 1\n\n\n if (Math.abs(currDiff) > 1) {\n this.updateCurrItem();\n }\n }\n\n return Boolean(diff);\n }\n /**\r\n * X position of the main scroll for the current slide\r\n * (ignores position during dragging)\r\n * @returns {number}\r\n */\n\n\n getCurrSlideX() {\n return this.slideWidth * this._currPositionIndex;\n }\n /**\r\n * Whether scroll position is shifted.\r\n * For example, it will return true if the scroll is being dragged or animated.\r\n * @returns {boolean}\r\n */\n\n\n isShifted() {\n return this.x !== this.getCurrSlideX();\n }\n /**\r\n * Update slides X positions and set their content\r\n */\n\n\n updateCurrItem() {\n var _this$itemHolders$;\n\n const {\n pswp\n } = this;\n const positionDifference = this._prevPositionIndex - this._currPositionIndex;\n\n if (!positionDifference) {\n return;\n }\n\n this._prevPositionIndex = this._currPositionIndex;\n pswp.currIndex = pswp.potentialIndex;\n let diffAbs = Math.abs(positionDifference);\n /** @type {ItemHolder | undefined} */\n\n let tempHolder;\n\n if (diffAbs >= 3) {\n this._containerShiftIndex += positionDifference + (positionDifference > 0 ? -3 : 3);\n diffAbs = 3;\n }\n\n for (let i = 0; i < diffAbs; i++) {\n if (positionDifference > 0) {\n tempHolder = this.itemHolders.shift();\n\n if (tempHolder) {\n this.itemHolders[2] = tempHolder; // move first to last\n\n this._containerShiftIndex++;\n setTransform(tempHolder.el, (this._containerShiftIndex + 2) * this.slideWidth);\n pswp.setContent(tempHolder, pswp.currIndex - diffAbs + i + 2);\n }\n } else {\n tempHolder = this.itemHolders.pop();\n\n if (tempHolder) {\n this.itemHolders.unshift(tempHolder); // move last to first\n\n this._containerShiftIndex--;\n setTransform(tempHolder.el, this._containerShiftIndex * this.slideWidth);\n pswp.setContent(tempHolder, pswp.currIndex + diffAbs - i - 2);\n }\n }\n } // Reset transfrom every 50ish navigations in one direction.\n //\n // Otherwise transform will keep growing indefinitely,\n // which might cause issues as browsers have a maximum transform limit.\n // I wasn't able to reach it, but just to be safe.\n // This should not cause noticable lag.\n\n\n if (Math.abs(this._containerShiftIndex) > 50 && !this.isShifted()) {\n this.resetPosition();\n this.resize();\n } // Pan transition might be running (and consntantly updating pan position)\n\n\n pswp.animations.stopAllPan();\n this.itemHolders.forEach((itemHolder, i) => {\n if (itemHolder.slide) {\n // Slide in the 2nd holder is always active\n itemHolder.slide.setIsActive(i === 1);\n }\n });\n pswp.currSlide = (_this$itemHolders$ = this.itemHolders[1]) === null || _this$itemHolders$ === void 0 ? void 0 : _this$itemHolders$.slide;\n pswp.contentLoader.updateLazy(positionDifference);\n\n if (pswp.currSlide) {\n pswp.currSlide.applyCurrentZoomPan();\n }\n\n pswp.dispatch('change');\n }\n /**\r\n * Move the X position of the main scroll container\r\n *\r\n * @param {number} x\r\n * @param {boolean} [dragging]\r\n */\n\n\n moveTo(x, dragging) {\n if (!this.pswp.canLoop() && dragging) {\n // Apply friction\n let newSlideIndexOffset = (this.slideWidth * this._currPositionIndex - x) / this.slideWidth;\n newSlideIndexOffset += this.pswp.currIndex;\n const delta = Math.round(x - this.x);\n\n if (newSlideIndexOffset < 0 && delta > 0 || newSlideIndexOffset >= this.pswp.getNumItems() - 1 && delta < 0) {\n x = this.x + delta * MAIN_SCROLL_END_FRICTION;\n }\n }\n\n this.x = x;\n\n if (this.pswp.container) {\n setTransform(this.pswp.container, x);\n }\n\n this.pswp.dispatch('moveMainScroll', {\n x,\n dragging: dragging !== null && dragging !== void 0 ? dragging : false\n });\n }\n\n}\n\n/** @typedef {import('./photoswipe.js').default} PhotoSwipe */\n\n/**\r\n * @template T\r\n * @typedef {import('./types.js').Methods<T>} Methods<T>\r\n */\n\nconst KeyboardKeyCodesMap = {\n Escape: 27,\n z: 90,\n ArrowLeft: 37,\n ArrowUp: 38,\n ArrowRight: 39,\n ArrowDown: 40,\n Tab: 9\n};\n/**\r\n * @template {keyof KeyboardKeyCodesMap} T\r\n * @param {T} key\r\n * @param {boolean} isKeySupported\r\n * @returns {T | number | undefined}\r\n */\n\nconst getKeyboardEventKey = (key, isKeySupported) => {\n return isKeySupported ? key : KeyboardKeyCodesMap[key];\n};\n/**\r\n * - Manages keyboard shortcuts.\r\n * - Helps trap focus within photoswipe.\r\n */\n\n\nclass Keyboard {\n /**\r\n * @param {PhotoSwipe} pswp\r\n */\n constructor(pswp) {\n this.pswp = pswp;\n /** @private */\n\n this._wasFocused = false;\n pswp.on('bindEvents', () => {\n if (pswp.options.trapFocus) {\n // Dialog was likely opened by keyboard if initial point is not defined\n if (!pswp.options.initialPointerPos) {\n // focus causes layout,\n // which causes lag during the animation,\n // that's why we delay it until the opener transition ends\n this._focusRoot();\n }\n\n pswp.events.add(document, 'focusin',\n /** @type EventListener */\n this._onFocusIn.bind(this));\n }\n\n pswp.events.add(document, 'keydown',\n /** @type EventListener */\n this._onKeyDown.bind(this));\n });\n const lastActiveElement =\n /** @type {HTMLElement} */\n document.activeElement;\n pswp.on('destroy', () => {\n if (pswp.options.returnFocus && lastActiveElement && this._wasFocused) {\n lastActiveElement.focus();\n }\n });\n }\n /** @private */\n\n\n _focusRoot() {\n if (!this._wasFocused && this.pswp.element) {\n this.pswp.element.focus();\n this._wasFocused = true;\n }\n }\n /**\r\n * @private\r\n * @param {KeyboardEvent} e\r\n */\n\n\n _onKeyDown(e) {\n const {\n pswp\n } = this;\n\n if (pswp.dispatch('keydown', {\n originalEvent: e\n }).defaultPrevented) {\n return;\n }\n\n if (specialKeyUsed(e)) {\n // don't do anything if special key pressed\n // to prevent from overriding default browser actions\n // for example, in Chrome on Mac cmd+arrow-left returns to previous page\n return;\n }\n /** @type {Methods<PhotoSwipe> | undefined} */\n\n\n let keydownAction;\n /** @type {'x' | 'y' | undefined} */\n\n let axis;\n let isForward = false;\n const isKeySupported = ('key' in e);\n\n switch (isKeySupported ? e.key : e.keyCode) {\n case getKeyboardEventKey('Escape', isKeySupported):\n if (pswp.options.escKey) {\n keydownAction = 'close';\n }\n\n break;\n\n case getKeyboardEventKey('z', isKeySupported):\n keydownAction = 'toggleZoom';\n break;\n\n case getKeyboardEventKey('ArrowLeft', isKeySupported):\n axis = 'x';\n break;\n\n case getKeyboardEventKey('ArrowUp', isKeySupported):\n axis = 'y';\n break;\n\n case getKeyboardEventKey('ArrowRight', isKeySupported):\n axis = 'x';\n isForward = true;\n break;\n\n case getKeyboardEventKey('ArrowDown', isKeySupported):\n isForward = true;\n axis = 'y';\n break;\n\n case getKeyboardEventKey('Tab', isKeySupported):\n this._focusRoot();\n\n break;\n } // if left/right/top/bottom key\n\n\n if (axis) {\n // prevent page scroll\n e.preventDefault();\n const {\n currSlide\n } = pswp;\n\n if (pswp.options.arrowKeys && axis === 'x' && pswp.getNumItems() > 1) {\n keydownAction = isForward ? 'next' : 'prev';\n } else if (currSlide && currSlide.currZoomLevel > currSlide.zoomLevels.fit) {\n // up/down arrow keys pan the image vertically\n // left/right arrow keys pan horizontally.\n // Unless there is only one image,\n // or arrowKeys option is disabled\n currSlide.pan[axis] += isForward ? -80 : 80;\n currSlide.panTo(currSlide.pan.x, currSlide.pan.y);\n }\n }\n\n if (keydownAction) {\n e.preventDefault(); // @ts-ignore\n\n pswp[keydownAction]();\n }\n }\n /**\r\n * Trap focus inside photoswipe\r\n *\r\n * @private\r\n * @param {FocusEvent} e\r\n */\n\n\n _onFocusIn(e) {\n const {\n template\n } = this.pswp;\n\n if (template && document !== e.target && template !== e.target && !template.contains(\n /** @type {Node} */\n e.target)) {\n // focus root element\n template.focus();\n }\n }\n\n}\n\nconst DEFAULT_EASING = 'cubic-bezier(.4,0,.22,1)';\n/** @typedef {import('./animations.js').SharedAnimationProps} SharedAnimationProps */\n\n/** @typedef {Object} DefaultCssAnimationProps\r\n *\r\n * @prop {HTMLElement} target\r\n * @prop {number} [duration]\r\n * @prop {string} [easing]\r\n * @prop {string} [transform]\r\n * @prop {string} [opacity]\r\n * */\n\n/** @typedef {SharedAnimationProps & DefaultCssAnimationProps} CssAnimationProps */\n\n/**\r\n * Runs CSS transition.\r\n */\n\nclass CSSAnimation {\n /**\r\n * onComplete can be unpredictable, be careful about current state\r\n *\r\n * @param {CssAnimationProps} props\r\n */\n constructor(props) {\n var _props$prop;\n\n this.props = props;\n const {\n target,\n onComplete,\n transform,\n onFinish = () => {},\n duration = 333,\n easing = DEFAULT_EASING\n } = props;\n this.onFinish = onFinish; // support only transform and opacity\n\n const prop = transform ? 'transform' : 'opacity';\n const propValue = (_props$prop = props[prop]) !== null && _props$prop !== void 0 ? _props$prop : '';\n /** @private */\n\n this._target = target;\n /** @private */\n\n this._onComplete = onComplete;\n /** @private */\n\n this._finished = false;\n /** @private */\n\n this._onTransitionEnd = this._onTransitionEnd.bind(this); // Using timeout hack to make sure that animation\n // starts even if the animated property was changed recently,\n // otherwise transitionend might not fire or transition won't start.\n // https://drafts.csswg.org/css-transitions/#starting\n //\n // ¯\\_(ツ)_/¯\n\n /** @private */\n\n this._helperTimeout = setTimeout(() => {\n setTransitionStyle(target, prop, duration, easing);\n this._helperTimeout = setTimeout(() => {\n target.addEventListener('transitionend', this._onTransitionEnd, false);\n target.addEventListener('transitioncancel', this._onTransitionEnd, false); // Safari occasionally does not emit transitionend event\n // if element property was modified during the transition,\n // which may be caused by resize or third party component,\n // using timeout as a safety fallback\n\n this._helperTimeout = setTimeout(() => {\n this._finalizeAnimation();\n }, duration + 500);\n target.style[prop] = propValue;\n }, 30); // Do not reduce this number\n }, 0);\n }\n /**\r\n * @private\r\n * @param {TransitionEvent} e\r\n */\n\n\n _onTransitionEnd(e) {\n if (e.target === this._target) {\n this._finalizeAnimation();\n }\n }\n /**\r\n * @private\r\n */\n\n\n _finalizeAnimation() {\n if (!this._finished) {\n this._finished = true;\n this.onFinish();\n\n if (this._onComplete) {\n this._onComplete();\n }\n }\n } // Destroy is called automatically onFinish\n\n\n destroy() {\n if (this._helperTimeout) {\n clearTimeout(this._helperTimeout);\n }\n\n removeTransitionStyle(this._target);\n\n this._target.removeEventListener('transitionend', this._onTransitionEnd, false);\n\n this._target.removeEventListener('transitioncancel', this._onTransitionEnd, false);\n\n if (!this._finished) {\n this._finalizeAnimation();\n }\n }\n\n}\n\nconst DEFAULT_NATURAL_FREQUENCY = 12;\nconst DEFAULT_DAMPING_RATIO = 0.75;\n/**\r\n * Spring easing helper\r\n */\n\nclass SpringEaser {\n /**\r\n * @param {number} initialVelocity Initial velocity, px per ms.\r\n *\r\n * @param {number} [dampingRatio]\r\n * Determines how bouncy animation will be.\r\n * From 0 to 1, 0 - always overshoot, 1 - do not overshoot.\r\n * \"overshoot\" refers to part of animation that\r\n * goes beyond the final value.\r\n *\r\n * @param {number} [naturalFrequency]\r\n * Determines how fast animation will slow down.\r\n * The higher value - the stiffer the transition will be,\r\n * and the faster it will slow down.\r\n * Recommended value from 10 to 50\r\n */\n constructor(initialVelocity, dampingRatio, naturalFrequency) {\n this.velocity = initialVelocity * 1000; // convert to \"pixels per second\"\n // https://en.wikipedia.org/wiki/Damping_ratio\n\n this._dampingRatio = dampingRatio || DEFAULT_DAMPING_RATIO; // https://en.wikipedia.org/wiki/Natural_frequency\n\n this._naturalFrequency = naturalFrequency || DEFAULT_NATURAL_FREQUENCY;\n this._dampedFrequency = this._naturalFrequency;\n\n if (this._dampingRatio < 1) {\n this._dampedFrequency *= Math.sqrt(1 - this._dampingRatio * this._dampingRatio);\n }\n }\n /**\r\n * @param {number} deltaPosition Difference between current and end position of the animation\r\n * @param {number} deltaTime Frame duration in milliseconds\r\n *\r\n * @returns {number} Displacement, relative to the end position.\r\n */\n\n\n easeFrame(deltaPosition, deltaTime) {\n // Inspired by Apple Webkit and Android spring function implementation\n // https://en.wikipedia.org/wiki/Oscillation\n // https://en.wikipedia.org/wiki/Damping_ratio\n // we ignore mass (assume that it's 1kg)\n let displacement = 0;\n let coeff;\n deltaTime /= 1000;\n const naturalDumpingPow = Math.E ** (-this._dampingRatio * this._naturalFrequency * deltaTime);\n\n if (this._dampingRatio === 1) {\n coeff = this.velocity + this._naturalFrequency * deltaPosition;\n displacement = (deltaPosition + coeff * deltaTime) * naturalDumpingPow;\n this.velocity = displacement * -this._naturalFrequency + coeff * naturalDumpingPow;\n } else if (this._dampingRatio < 1) {\n coeff = 1 / this._dampedFrequency * (this._dampingRatio * this._naturalFrequency * deltaPosition + this.velocity);\n const dumpedFCos = Math.cos(this._dampedFrequency * deltaTime);\n const dumpedFSin = Math.sin(this._dampedFrequency * deltaTime);\n displacement = naturalDumpingPow * (deltaPosition * dumpedFCos + coeff * dumpedFSin);\n this.velocity = displacement * -this._naturalFrequency * this._dampingRatio + naturalDumpingPow * (-this._dampedFrequency * deltaPosition * dumpedFSin + this._dampedFrequency * coeff * dumpedFCos);\n } // Overdamped (>1) damping ratio is not supported\n\n\n return displacement;\n }\n\n}\n\n/** @typedef {import('./animations.js').SharedAnimationProps} SharedAnimationProps */\n\n/**\r\n * @typedef {Object} DefaultSpringAnimationProps\r\n *\r\n * @prop {number} start\r\n * @prop {number} end\r\n * @prop {number} velocity\r\n * @prop {number} [dampingRatio]\r\n * @prop {number} [naturalFrequency]\r\n * @prop {(end: number) => void} onUpdate\r\n */\n\n/** @typedef {SharedAnimationProps & DefaultSpringAnimationProps} SpringAnimationProps */\n\nclass SpringAnimation {\n /**\r\n * @param {SpringAnimationProps} props\r\n */\n constructor(props) {\n this.props = props;\n this._raf = 0;\n const {\n start,\n end,\n velocity,\n onUpdate,\n onComplete,\n onFinish = () => {},\n dampingRatio,\n naturalFrequency\n } = props;\n this.onFinish = onFinish;\n const easer = new SpringEaser(velocity, dampingRatio, naturalFrequency);\n let prevTime = Date.now();\n let deltaPosition = start - end;\n\n const animationLoop = () => {\n if (this._raf) {\n deltaPosition = easer.easeFrame(deltaPosition, Date.now() - prevTime); // Stop the animation if velocity is low and position is close to end\n\n if (Math.abs(deltaPosition) < 1 && Math.abs(easer.velocity) < 50) {\n // Finalize the animation\n onUpdate(end);\n\n if (onComplete) {\n onComplete();\n }\n\n this.onFinish();\n } else {\n prevTime = Date.now();\n onUpdate(deltaPosition + end);\n this._raf = requestAnimationFrame(animationLoop);\n }\n }\n };\n\n this._raf = requestAnimationFrame(animationLoop);\n } // Destroy is called automatically onFinish\n\n\n destroy() {\n if (this._raf >= 0) {\n cancelAnimationFrame(this._raf);\n }\n\n this._raf = 0;\n }\n\n}\n\n/** @typedef {import('./css-animation.js').CssAnimationProps} CssAnimationProps */\n\n/** @typedef {import('./spring-animation.js').SpringAnimationProps} SpringAnimationProps */\n\n/** @typedef {Object} SharedAnimationProps\r\n * @prop {string} [name]\r\n * @prop {boolean} [isPan]\r\n * @prop {boolean} [isMainScroll]\r\n * @prop {VoidFunction} [onComplete]\r\n * @prop {VoidFunction} [onFinish]\r\n */\n\n/** @typedef {SpringAnimation | CSSAnimation} Animation */\n\n/** @typedef {SpringAnimationProps | CssAnimationProps} AnimationProps */\n\n/**\r\n * Manages animations\r\n */\n\nclass Animations {\n constructor() {\n /** @type {Animation[]} */\n this.activeAnimations = [];\n }\n /**\r\n * @param {SpringAnimationProps} props\r\n */\n\n\n startSpring(props) {\n this._start(props, true);\n }\n /**\r\n * @param {CssAnimationProps} props\r\n */\n\n\n startTransition(props) {\n this._start(props);\n }\n /**\r\n * @private\r\n * @param {AnimationProps} props\r\n * @param {boolean} [isSpring]\r\n * @returns {Animation}\r\n */\n\n\n _start(props, isSpring) {\n const animation = isSpring ? new SpringAnimation(\n /** @type SpringAnimationProps */\n props) : new CSSAnimation(\n /** @type CssAnimationProps */\n props);\n this.activeAnimations.push(animation);\n\n animation.onFinish = () => this.stop(animation);\n\n return animation;\n }\n /**\r\n * @param {Animation} animation\r\n */\n\n\n stop(animation) {\n animation.destroy();\n const index = this.activeAnimations.indexOf(animation);\n\n if (index > -1) {\n this.activeAnimations.splice(index, 1);\n }\n }\n\n stopAll() {\n // _stopAllAnimations\n this.activeAnimations.forEach(animation => {\n animation.destroy();\n });\n this.activeAnimations = [];\n }\n /**\r\n * Stop all pan or zoom transitions\r\n */\n\n\n stopAllPan() {\n this.activeAnimations = this.activeAnimations.filter(animation => {\n if (animation.props.isPan) {\n animation.destroy();\n return false;\n }\n\n return true;\n });\n }\n\n stopMainScroll() {\n this.activeAnimations = this.activeAnimations.filter(animation => {\n if (animation.props.isMainScroll) {\n animation.destroy();\n return false;\n }\n\n return true;\n });\n }\n /**\r\n * Returns true if main scroll transition is running\r\n */\n // isMainScrollRunning() {\n // return this.activeAnimations.some((animation) => {\n // return animation.props.isMainScroll;\n // });\n // }\n\n /**\r\n * Returns true if any pan or zoom transition is running\r\n */\n\n\n isPanRunning() {\n return this.activeAnimations.some(animation => {\n return animation.props.isPan;\n });\n }\n\n}\n\n/** @typedef {import('./photoswipe.js').default} PhotoSwipe */\n\n/**\r\n * Handles scroll wheel.\r\n * Can pan and zoom current slide image.\r\n */\nclass ScrollWheel {\n /**\r\n * @param {PhotoSwipe} pswp\r\n */\n constructor(pswp) {\n this.pswp = pswp;\n pswp.events.add(pswp.element, 'wheel',\n /** @type EventListener */\n this._onWheel.bind(this));\n }\n /**\r\n * @private\r\n * @param {WheelEvent} e\r\n */\n\n\n _onWheel(e) {\n e.preventDefault();\n const {\n currSlide\n } = this.pswp;\n let {\n deltaX,\n deltaY\n } = e;\n\n if (!currSlide) {\n return;\n }\n\n if (this.pswp.dispatch('wheel', {\n originalEvent: e\n }).defaultPrevented) {\n return;\n }\n\n if (e.ctrlKey || this.pswp.options.wheelToZoom) {\n // zoom\n if (currSlide.isZoomable()) {\n let zoomFactor = -deltaY;\n\n if (e.deltaMode === 1\n /* DOM_DELTA_LINE */\n ) {\n zoomFactor *= 0.05;\n } else {\n zoomFactor *= e.deltaMode ? 1 : 0.002;\n }\n\n zoomFactor = 2 ** zoomFactor;\n const destZoomLevel = currSlide.currZoomLevel * zoomFactor;\n currSlide.zoomTo(destZoomLevel, {\n x: e.clientX,\n y: e.clientY\n });\n }\n } else {\n // pan\n if (currSlide.isPannable()) {\n if (e.deltaMode === 1\n /* DOM_DELTA_LINE */\n ) {\n // 18 - average line height\n deltaX *= 18;\n deltaY *= 18;\n }\n\n currSlide.panTo(currSlide.pan.x - deltaX, currSlide.pan.y - deltaY);\n }\n }\n }\n\n}\n\n/** @typedef {import('../photoswipe.js').default} PhotoSwipe */\n\n/**\r\n * @template T\r\n * @typedef {import('../types.js').Methods<T>} Methods<T>\r\n */\n\n/**\r\n * @typedef {Object} UIElementMarkupProps\r\n * @prop {boolean} [isCustomSVG]\r\n * @prop {string} inner\r\n * @prop {string} [outlineID]\r\n * @prop {number | string} [size]\r\n */\n\n/**\r\n * @typedef {Object} UIElementData\r\n * @prop {DefaultUIElements | string} [name]\r\n * @prop {string} [className]\r\n * @prop {UIElementMarkup} [html]\r\n * @prop {boolean} [isButton]\r\n * @prop {keyof HTMLElementTagNameMap} [tagName]\r\n * @prop {string} [title]\r\n * @prop {string} [ariaLabel]\r\n * @prop {(element: HTMLElement, pswp: PhotoSwipe) => void} [onInit]\r\n * @prop {Methods<PhotoSwipe> | ((e: MouseEvent, element: HTMLElement, pswp: PhotoSwipe) => void)} [onClick]\r\n * @prop {'bar' | 'wrapper' | 'root'} [appendTo]\r\n * @prop {number} [order]\r\n */\n\n/** @typedef {'arrowPrev' | 'arrowNext' | 'close' | 'zoom' | 'counter'} DefaultUIElements */\n\n/** @typedef {string | UIElementMarkupProps} UIElementMarkup */\n\n/**\r\n * @param {UIElementMarkup} [htmlData]\r\n * @returns {string}\r\n */\n\nfunction addElementHTML(htmlData) {\n if (typeof htmlData === 'string') {\n // Allow developers to provide full svg,\n // For example:\n // <svg viewBox=\"0 0 32 32\" width=\"32\" height=\"32\" aria-hidden=\"true\" class=\"pswp__icn\">\n // <path d=\"...\" />\n // <circle ... />\n // </svg>\n // Can also be any HTML string.\n return htmlData;\n }\n\n if (!htmlData || !htmlData.isCustomSVG) {\n return '';\n }\n\n const svgData = htmlData;\n let out = '<svg aria-hidden=\"true\" class=\"pswp__icn\" viewBox=\"0 0 %d %d\" width=\"%d\" height=\"%d\">'; // replace all %d with size\n\n out = out.split('%d').join(\n /** @type {string} */\n svgData.size || 32); // Icons may contain outline/shadow,\n // to make it we \"clone\" base icon shape and add border to it.\n // Icon itself and border are styled via CSS.\n //\n // Property shadowID defines ID of element that should be cloned.\n\n if (svgData.outlineID) {\n out += '<use class=\"pswp__icn-shadow\" xlink:href=\"#' + svgData.outlineID + '\"/>';\n }\n\n out += svgData.inner;\n out += '</svg>';\n return out;\n}\n\nclass UIElement {\n /**\r\n * @param {PhotoSwipe} pswp\r\n * @param {UIElementData} data\r\n */\n constructor(pswp, data) {\n var _container;\n\n const name = data.name || data.className;\n let elementHTML = data.html; // @ts-expect-error lookup only by `data.name` maybe?\n\n if (pswp.options[name] === false) {\n // exit if element is disabled from options\n return;\n } // Allow to override SVG icons from options\n // @ts-expect-error lookup only by `data.name` maybe?\n\n\n if (typeof pswp.options[name + 'SVG'] === 'string') {\n // arrowPrevSVG\n // arrowNextSVG\n // closeSVG\n // zoomSVG\n // @ts-expect-error lookup only by `data.name` maybe?\n elementHTML = pswp.options[name + 'SVG'];\n }\n\n pswp.dispatch('uiElementCreate', {\n data\n });\n let className = '';\n\n if (data.isButton) {\n className += 'pswp__button ';\n className += data.className || `pswp__button--${data.name}`;\n } else {\n className += data.className || `pswp__${data.name}`;\n }\n\n let tagName = data.isButton ? data.tagName || 'button' : data.tagName || 'div';\n tagName =\n /** @type {keyof HTMLElementTagNameMap} */\n tagName.toLowerCase();\n /** @type {HTMLElement} */\n\n const element = createElement(className, tagName);\n\n if (data.isButton) {\n if (tagName === 'button') {\n /** @type {HTMLButtonElement} */\n element.type = 'button';\n }\n\n let {\n title\n } = data;\n const {\n ariaLabel\n } = data; // @ts-expect-error lookup only by `data.name` maybe?\n\n if (typeof pswp.options[name + 'Title'] === 'string') {\n // @ts-expect-error lookup only by `data.name` maybe?\n title = pswp.options[name + 'Title'];\n }\n\n if (title) {\n element.title = title;\n }\n\n const ariaText = ariaLabel || title;\n\n if (ariaText) {\n element.setAttribute('aria-label', ariaText);\n }\n }\n\n element.innerHTML = addElementHTML(elementHTML);\n\n if (data.onInit) {\n data.onInit(element, pswp);\n }\n\n if (data.onClick) {\n element.onclick = e => {\n if (typeof data.onClick === 'string') {\n // @ts-ignore\n pswp[data.onClick]();\n } else if (typeof data.onClick === 'function') {\n data.onClick(e, element, pswp);\n }\n };\n } // Top bar is default position\n\n\n const appendTo = data.appendTo || 'bar';\n /** @type {HTMLElement | undefined} root element by default */\n\n let container = pswp.element;\n\n if (appendTo === 'bar') {\n if (!pswp.topBar) {\n pswp.topBar = createElement('pswp__top-bar pswp__hide-on-close', 'div', pswp.scrollWrap);\n }\n\n container = pswp.topBar;\n } else {\n // element outside of top bar gets a secondary class\n // that makes element fade out on close\n element.classList.add('pswp__hide-on-close');\n\n if (appendTo === 'wrapper') {\n container = pswp.scrollWrap;\n }\n }\n\n (_container = container) === null || _container === void 0 || _container.appendChild(pswp.applyFilters('uiElement', element, data));\n }\n\n}\n\n/*\r\n Backward and forward arrow buttons\r\n */\n\n/** @typedef {import('./ui-element.js').UIElementData} UIElementData */\n\n/** @typedef {import('../photoswipe.js').default} PhotoSwipe */\n\n/**\r\n *\r\n * @param {HTMLElement} element\r\n * @param {PhotoSwipe} pswp\r\n * @param {boolean} [isNextButton]\r\n */\nfunction initArrowButton(element, pswp, isNextButton) {\n element.classList.add('pswp__button--arrow'); // TODO: this should point to a unique id for this instance\n\n element.setAttribute('aria-controls', 'pswp__items');\n pswp.on('change', () => {\n if (!pswp.options.loop) {\n if (isNextButton) {\n /** @type {HTMLButtonElement} */\n element.disabled = !(pswp.currIndex < pswp.getNumItems() - 1);\n } else {\n /** @type {HTMLButtonElement} */\n element.disabled = !(pswp.currIndex > 0);\n }\n }\n });\n}\n/** @type {UIElementData} */\n\n\nconst arrowPrev = {\n name: 'arrowPrev',\n className: 'pswp__button--arrow--prev',\n title: 'Previous',\n order: 10,\n isButton: true,\n appendTo: 'wrapper',\n html: {\n isCustomSVG: true,\n size: 60,\n inner: '<path d=\"M29 43l-3 3-16-16 16-16 3 3-13 13 13 13z\" id=\"pswp__icn-arrow\"/>',\n outlineID: 'pswp__icn-arrow'\n },\n onClick: 'prev',\n onInit: initArrowButton\n};\n/** @type {UIElementData} */\n\nconst arrowNext = {\n name: 'arrowNext',\n className: 'pswp__button--arrow--next',\n title: 'Next',\n order: 11,\n isButton: true,\n appendTo: 'wrapper',\n html: {\n isCustomSVG: true,\n size: 60,\n inner: '<use xlink:href=\"#pswp__icn-arrow\"/>',\n outlineID: 'pswp__icn-arrow'\n },\n onClick: 'next',\n onInit: (el, pswp) => {\n initArrowButton(el, pswp, true);\n }\n};\n\n/** @type {import('./ui-element.js').UIElementData} UIElementData */\nconst closeButton = {\n name: 'close',\n title: 'Close',\n order: 20,\n isButton: true,\n html: {\n isCustomSVG: true,\n inner: '<path d=\"M24 10l-2-2-6 6-6-6-2 2 6 6-6 6 2 2 6-6 6 6 2-2-6-6z\" id=\"pswp__icn-close\"/>',\n outlineID: 'pswp__icn-close'\n },\n onClick: 'close'\n};\n\n/** @type {import('./ui-element.js').UIElementData} UIElementData */\nconst zoomButton = {\n name: 'zoom',\n title: 'Zoom',\n order: 10,\n isButton: true,\n html: {\n isCustomSVG: true,\n // eslint-disable-next-line max-len\n inner: '<path d=\"M17.426 19.926a6 6 0 1 1 1.5-1.5L23 22.5 21.5 24l-4.074-4.074z\" id=\"pswp__icn-zoom\"/>' + '<path fill=\"currentColor\" class=\"pswp__zoom-icn-bar-h\" d=\"M11 16v-2h6v2z\"/>' + '<path fill=\"currentColor\" class=\"pswp__zoom-icn-bar-v\" d=\"M13 12h2v6h-2z\"/>',\n outlineID: 'pswp__icn-zoom'\n },\n onClick: 'toggleZoom'\n};\n\n/** @type {import('./ui-element.js').UIElementData} UIElementData */\nconst loadingIndicator = {\n name: 'preloader',\n appendTo: 'bar',\n order: 7,\n html: {\n isCustomSVG: true,\n // eslint-disable-next-line max-len\n inner: '<path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M21.2 16a5.2 5.2 0 1 1-5.2-5.2V8a8 8 0 1 0 8 8h-2.8Z\" id=\"pswp__icn-loading\"/>',\n outlineID: 'pswp__icn-loading'\n },\n onInit: (indicatorElement, pswp) => {\n /** @type {boolean | undefined} */\n let isVisible;\n /** @type {NodeJS.Timeout | null} */\n\n let delayTimeout = null;\n /**\r\n * @param {string} className\r\n * @param {boolean} add\r\n */\n\n const toggleIndicatorClass = (className, add) => {\n indicatorElement.classList.toggle('pswp__preloader--' + className, add);\n };\n /**\r\n * @param {boolean} visible\r\n */\n\n\n const setIndicatorVisibility = visible => {\n if (isVisible !== visible) {\n isVisible = visible;\n toggleIndicatorClass('active', visible);\n }\n };\n\n const updatePreloaderVisibility = () => {\n var _pswp$currSlide;\n\n if (!((_pswp$currSlide = pswp.currSlide) !== null && _pswp$currSlide !== void 0 && _pswp$currSlide.content.isLoading())) {\n setIndicatorVisibility(false);\n\n if (delayTimeout) {\n clearTimeout(delayTimeout);\n delayTimeout = null;\n }\n\n return;\n }\n\n if (!delayTimeout) {\n // display loading indicator with delay\n delayTimeout = setTimeout(() => {\n var _pswp$currSlide2;\n\n setIndicatorVisibility(Boolean((_pswp$currSlide2 = pswp.currSlide) === null || _pswp$currSlide2 === void 0 ? void 0 : _pswp$currSlide2.content.isLoading()));\n delayTimeout = null;\n }, pswp.options.preloaderDelay);\n }\n };\n\n pswp.on('change', updatePreloaderVisibility);\n pswp.on('loadComplete', e => {\n if (pswp.currSlide === e.slide) {\n updatePreloaderVisibility();\n }\n }); // expose the method\n\n if (pswp.ui) {\n pswp.ui.updatePreloaderVisibility = updatePreloaderVisibility;\n }\n }\n};\n\n/** @type {import('./ui-element.js').UIElementData} UIElementData */\nconst counterIndicator = {\n name: 'counter',\n order: 5,\n onInit: (counterElement, pswp) => {\n pswp.on('change', () => {\n counterElement.innerText = pswp.currIndex + 1 + pswp.options.indexIndicatorSep + pswp.getNumItems();\n });\n }\n};\n\n/** @typedef {import('../photoswipe.js').default} PhotoSwipe */\n\n/** @typedef {import('./ui-element.js').UIElementData} UIElementData */\n\n/**\r\n * Set special class on element when image is zoomed.\r\n *\r\n * By default, it is used to adjust\r\n * zoom icon and zoom cursor via CSS.\r\n *\r\n * @param {HTMLElement} el\r\n * @param {boolean} isZoomedIn\r\n */\n\nfunction setZoomedIn(el, isZoomedIn) {\n el.classList.toggle('pswp--zoomed-in', isZoomedIn);\n}\n\nclass UI {\n /**\r\n * @param {PhotoSwipe} pswp\r\n */\n constructor(pswp) {\n this.pswp = pswp;\n this.isRegistered = false;\n /** @type {UIElementData[]} */\n\n this.uiElementsData = [];\n /** @type {(UIElement | UIElementData)[]} */\n\n this.items = [];\n /** @type {() => void} */\n\n this.updatePreloaderVisibility = () => {};\n /**\r\n * @private\r\n * @type {number | undefined}\r\n */\n\n\n this._lastUpdatedZoomLevel = undefined;\n }\n\n init() {\n const {\n pswp\n } = this;\n this.isRegistered = false;\n this.uiElementsData = [closeButton, arrowPrev, arrowNext, zoomButton, loadingIndicator, counterIndicator];\n pswp.dispatch('uiRegister'); // sort by order\n\n this.uiElementsData.sort((a, b) => {\n // default order is 0\n return (a.order || 0) - (b.order || 0);\n });\n this.items = [];\n this.isRegistered = true;\n this.uiElementsData.forEach(uiElementData => {\n this.registerElement(uiElementData);\n });\n pswp.on('change', () => {\n var _pswp$element;\n\n (_pswp$element = pswp.element) === null || _pswp$element === void 0 || _pswp$element.classList.toggle('pswp--one-slide', pswp.getNumItems() === 1);\n });\n pswp.on('zoomPanUpdate', () => this._onZoomPanUpdate());\n }\n /**\r\n * @param {UIElementData} elementData\r\n */\n\n\n registerElement(elementData) {\n if (this.isRegistered) {\n this.items.push(new UIElement(this.pswp, elementData));\n } else {\n this.uiElementsData.push(elementData);\n }\n }\n /**\r\n * Fired each time zoom or pan position is changed.\r\n * Update classes that control visibility of zoom button and cursor icon.\r\n *\r\n * @private\r\n */\n\n\n _onZoomPanUpdate() {\n const {\n template,\n currSlide,\n options\n } = this.pswp;\n\n if (this.pswp.opener.isClosing || !template || !currSlide) {\n return;\n }\n\n let {\n currZoomLevel\n } = currSlide; // if not open yet - check against initial zoom level\n\n if (!this.pswp.opener.isOpen) {\n currZoomLevel = currSlide.zoomLevels.initial;\n }\n\n if (currZoomLevel === this._lastUpdatedZoomLevel) {\n return;\n }\n\n this._lastUpdatedZoomLevel = currZoomLevel;\n const currZoomLevelDiff = currSlide.zoomLevels.initial - currSlide.zoomLevels.secondary; // Initial and secondary zoom levels are almost equal\n\n if (Math.abs(currZoomLevelDiff) < 0.01 || !currSlide.isZoomable()) {\n // disable zoom\n setZoomedIn(template, false);\n template.classList.remove('pswp--zoom-allowed');\n return;\n }\n\n template.classList.add('pswp--zoom-allowed');\n const potentialZoomLevel = currZoomLevel === currSlide.zoomLevels.initial ? currSlide.zoomLevels.secondary : currSlide.zoomLevels.initial;\n setZoomedIn(template, potentialZoomLevel <= currZoomLevel);\n\n if (options.imageClickAction === 'zoom' || options.imageClickAction === 'zoom-or-close') {\n template.classList.add('pswp--click-to-zoom');\n }\n }\n\n}\n\n/** @typedef {import('./slide.js').SlideData} SlideData */\n\n/** @typedef {import('../photoswipe.js').default} PhotoSwipe */\n\n/** @typedef {{ x: number; y: number; w: number; innerRect?: { w: number; h: number; x: number; y: number } }} Bounds */\n\n/**\r\n * @param {HTMLElement} el\r\n * @returns Bounds\r\n */\nfunction getBoundsByElement(el) {\n const thumbAreaRect = el.getBoundingClientRect();\n return {\n x: thumbAreaRect.left,\n y: thumbAreaRect.top,\n w: thumbAreaRect.width\n };\n}\n/**\r\n * @param {HTMLElement} el\r\n * @param {number} imageWidth\r\n * @param {number} imageHeight\r\n * @returns Bounds\r\n */\n\n\nfunction getCroppedBoundsByElement(el, imageWidth, imageHeight) {\n const thumbAreaRect = el.getBoundingClientRect(); // fill image into the area\n // (do they same as object-fit:cover does to retrieve coordinates)\n\n const hRatio = thumbAreaRect.width / imageWidth;\n const vRatio = thumbAreaRect.height / imageHeight;\n const fillZoomLevel = hRatio > vRatio ? hRatio : vRatio;\n const offsetX = (thumbAreaRect.width - imageWidth * fillZoomLevel) / 2;\n const offsetY = (thumbAreaRect.height - imageHeight * fillZoomLevel) / 2;\n /**\r\n * Coordinates of the image,\r\n * as if it was not cropped,\r\n * height is calculated automatically\r\n *\r\n * @type {Bounds}\r\n */\n\n const bounds = {\n x: thumbAreaRect.left + offsetX,\n y: thumbAreaRect.top + offsetY,\n w: imageWidth * fillZoomLevel\n }; // Coordinates of inner crop area\n // relative to the image\n\n bounds.innerRect = {\n w: thumbAreaRect.width,\n h: thumbAreaRect.height,\n x: offsetX,\n y: offsetY\n };\n return bounds;\n}\n/**\r\n * Get dimensions of thumbnail image\r\n * (click on which opens photoswipe or closes photoswipe to)\r\n *\r\n * @param {number} index\r\n * @param {SlideData} itemData\r\n * @param {PhotoSwipe} instance PhotoSwipe instance\r\n * @returns {Bounds | undefined}\r\n */\n\n\nfunction getThumbBounds(index, itemData, instance) {\n // legacy event, before filters were introduced\n const event = instance.dispatch('thumbBounds', {\n index,\n itemData,\n instance\n }); // @ts-expect-error\n\n if (event.thumbBounds) {\n // @ts-expect-error\n return event.thumbBounds;\n }\n\n const {\n element\n } = itemData;\n /** @type {Bounds | undefined} */\n\n let thumbBounds;\n /** @type {HTMLElement | null | undefined} */\n\n let thumbnail;\n\n if (element && instance.options.thumbSelector !== false) {\n const thumbSelector = instance.options.thumbSelector || 'img';\n thumbnail = element.matches(thumbSelector) ? element :\n /** @type {HTMLElement | null} */\n element.querySelector(thumbSelector);\n }\n\n thumbnail = instance.applyFilters('thumbEl', thumbnail, itemData, index);\n\n if (thumbnail) {\n if (!itemData.thumbCropped) {\n thumbBounds = getBoundsByElement(thumbnail);\n } else {\n thumbBounds = getCroppedBoundsByElement(thumbnail, itemData.width || itemData.w || 0, itemData.height || itemData.h || 0);\n }\n }\n\n return instance.applyFilters('thumbBounds', thumbBounds, itemData, index);\n}\n\n/** @typedef {import('../lightbox/lightbox.js').default} PhotoSwipeLightbox */\n\n/** @typedef {import('../photoswipe.js').default} PhotoSwipe */\n\n/** @typedef {import('../photoswipe.js').PhotoSwipeOptions} PhotoSwipeOptions */\n\n/** @typedef {import('../photoswipe.js').DataSource} DataSource */\n\n/** @typedef {import('../ui/ui-element.js').UIElementData} UIElementData */\n\n/** @typedef {import('../slide/content.js').default} ContentDefault */\n\n/** @typedef {import('../slide/slide.js').default} Slide */\n\n/** @typedef {import('../slide/slide.js').SlideData} SlideData */\n\n/** @typedef {import('../slide/zoom-level.js').default} ZoomLevel */\n\n/** @typedef {import('../slide/get-thumb-bounds.js').Bounds} Bounds */\n\n/**\r\n * Allow adding an arbitrary props to the Content\r\n * https://photoswipe.com/custom-content/#using-webp-image-format\r\n * @typedef {ContentDefault & Record<string, any>} Content\r\n */\n\n/** @typedef {{ x?: number; y?: number }} Point */\n\n/**\r\n * @typedef {Object} PhotoSwipeEventsMap https://photoswipe.com/events/\r\n *\r\n *\r\n * https://photoswipe.com/adding-ui-elements/\r\n *\r\n * @prop {undefined} uiRegister\r\n * @prop {{ data: UIElementData }} uiElementCreate\r\n *\r\n *\r\n * https://photoswipe.com/events/#initialization-events\r\n *\r\n * @prop {undefined} beforeOpen\r\n * @prop {undefined} firstUpdate\r\n * @prop {undefined} initialLayout\r\n * @prop {undefined} change\r\n * @prop {undefined} afterInit\r\n * @prop {undefined} bindEvents\r\n *\r\n *\r\n * https://photoswipe.com/events/#opening-or-closing-transition-events\r\n *\r\n * @prop {undefined} openingAnimationStart\r\n * @prop {undefined} openingAnimationEnd\r\n * @prop {undefined} closingAnimationStart\r\n * @prop {undefined} closingAnimationEnd\r\n *\r\n *\r\n * https://photoswipe.com/events/#closing-events\r\n *\r\n * @prop {undefined} close\r\n * @prop {undefined} destroy\r\n *\r\n *\r\n * https://photoswipe.com/events/#pointer-and-gesture-events\r\n *\r\n * @prop {{ originalEvent: PointerEvent }} pointerDown\r\n * @prop {{ originalEvent: PointerEvent }} pointerMove\r\n * @prop {{ originalEvent: PointerEvent }} pointerUp\r\n * @prop {{ bgOpacity: number }} pinchClose can be default prevented\r\n * @prop {{ panY: number }} verticalDrag can be default prevented\r\n *\r\n *\r\n * https://photoswipe.com/events/#slide-content-events\r\n *\r\n * @prop {{ content: Content }} contentInit\r\n * @prop {{ content: Content; isLazy: boolean }} contentLoad can be default prevented\r\n * @prop {{ content: Content; isLazy: boolean }} contentLoadImage can be default prevented\r\n * @prop {{ content: Content; slide: Slide; isError?: boolean }} loadComplete\r\n * @prop {{ content: Content; slide: Slide }} loadError\r\n * @prop {{ content: Content; width: number; height: number }} contentResize can be default prevented\r\n * @prop {{ content: Content; width: number; height: number; slide: Slide }} imageSizeChange\r\n * @prop {{ content: Content }} contentLazyLoad can be default prevented\r\n * @prop {{ content: Content }} contentAppend can be default prevented\r\n * @prop {{ content: Content }} contentActivate can be default prevented\r\n * @prop {{ content: Content }} contentDeactivate can be default prevented\r\n * @prop {{ content: Content }} contentRemove can be default prevented\r\n * @prop {{ content: Content }} contentDestroy can be default prevented\r\n *\r\n *\r\n * undocumented\r\n *\r\n * @prop {{ point: Point; originalEvent: PointerEvent }} imageClickAction can be default prevented\r\n * @prop {{ point: Point; originalEvent: PointerEvent }} bgClickAction can be default prevented\r\n * @prop {{ point: Point; originalEvent: PointerEvent }} tapAction can be default prevented\r\n * @prop {{ point: Point; originalEvent: PointerEvent }} doubleTapAction can be default prevented\r\n *\r\n * @prop {{ originalEvent: KeyboardEvent }} keydown can be default prevented\r\n * @prop {{ x: number; dragging: boolean }} moveMainScroll\r\n * @prop {{ slide: Slide }} firstZoomPan\r\n * @prop {{ slide: Slide | undefined, data: SlideData, index: number }} gettingData\r\n * @prop {undefined} beforeResize\r\n * @prop {undefined} resize\r\n * @prop {undefined} viewportSize\r\n * @prop {undefined} updateScrollOffset\r\n * @prop {{ slide: Slide }} slideInit\r\n * @prop {{ slide: Slide }} afterSetContent\r\n * @prop {{ slide: Slide }} slideLoad\r\n * @prop {{ slide: Slide }} appendHeavy can be default prevented\r\n * @prop {{ slide: Slide }} appendHeavyContent\r\n * @prop {{ slide: Slide }} slideActivate\r\n * @prop {{ slide: Slide }} slideDeactivate\r\n * @prop {{ slide: Slide }} slideDestroy\r\n * @prop {{ destZoomLevel: number, centerPoint: Point | undefined, transitionDuration: number | false | undefined }} beforeZoomTo\r\n * @prop {{ slide: Slide }} zoomPanUpdate\r\n * @prop {{ slide: Slide }} initialZoomPan\r\n * @prop {{ slide: Slide }} calcSlideSize\r\n * @prop {undefined} resolutionChanged\r\n * @prop {{ originalEvent: WheelEvent }} wheel can be default prevented\r\n * @prop {{ content: Content }} contentAppendImage can be default prevented\r\n * @prop {{ index: number; itemData: SlideData }} lazyLoadSlide can be default prevented\r\n * @prop {undefined} lazyLoad\r\n * @prop {{ slide: Slide }} calcBounds\r\n * @prop {{ zoomLevels: ZoomLevel, slideData: SlideData }} zoomLevelsUpdate\r\n *\r\n *\r\n * legacy\r\n *\r\n * @prop {undefined} init\r\n * @prop {undefined} initialZoomIn\r\n * @prop {undefined} initialZoomOut\r\n * @prop {undefined} initialZoomInEnd\r\n * @prop {undefined} initialZoomOutEnd\r\n * @prop {{ dataSource: DataSource | undefined, numItems: number }} numItems\r\n * @prop {{ itemData: SlideData; index: number }} itemData\r\n * @prop {{ index: number, itemData: SlideData, instance: PhotoSwipe }} thumbBounds\r\n */\n\n/**\r\n * @typedef {Object} PhotoSwipeFiltersMap https://photoswipe.com/filters/\r\n *\r\n * @prop {(numItems: number, dataSource: DataSource | undefined) => number} numItems\r\n * Modify the total amount of slides. Example on Data sources page.\r\n * https://photoswipe.com/filters/#numitems\r\n *\r\n * @prop {(itemData: SlideData, index: number) => SlideData} itemData\r\n * Modify slide item data. Example on Data sources page.\r\n * https://photoswipe.com/filters/#itemdata\r\n *\r\n * @prop {(itemData: SlideData, element: HTMLElement, linkEl: HTMLAnchorElement) => SlideData} domItemData\r\n * Modify item data when it's parsed from DOM element. Example on Data sources page.\r\n * https://photoswipe.com/filters/#domitemdata\r\n *\r\n * @prop {(clickedIndex: number, e: MouseEvent, instance: PhotoSwipeLightbox) => number} clickedIndex\r\n * Modify clicked gallery item index.\r\n * https://photoswipe.com/filters/#clickedindex\r\n *\r\n * @prop {(placeholderSrc: string | false, content: Content) => string | false} placeholderSrc\r\n * Modify placeholder image source.\r\n * https://photoswipe.com/filters/#placeholdersrc\r\n *\r\n * @prop {(isContentLoading: boolean, content: Content) => boolean} isContentLoading\r\n * Modify if the content is currently loading.\r\n * https://photoswipe.com/filters/#iscontentloading\r\n *\r\n * @prop {(isContentZoomable: boolean, content: Content) => boolean} isContentZoomable\r\n * Modify if the content can be zoomed.\r\n * https://photoswipe.com/filters/#iscontentzoomable\r\n *\r\n * @prop {(useContentPlaceholder: boolean, content: Content) => boolean} useContentPlaceholder\r\n * Modify if the placeholder should be used for the content.\r\n * https://photoswipe.com/filters/#usecontentplaceholder\r\n *\r\n * @prop {(isKeepingPlaceholder: boolean, content: Content) => boolean} isKeepingPlaceholder\r\n * Modify if the placeholder should be kept after the content is loaded.\r\n * https://photoswipe.com/filters/#iskeepingplaceholder\r\n *\r\n *\r\n * @prop {(contentErrorElement: HTMLElement, content: Content) => HTMLElement} contentErrorElement\r\n * Modify an element when the content has error state (for example, if image cannot be loaded).\r\n * https://photoswipe.com/filters/#contenterrorelement\r\n *\r\n * @prop {(element: HTMLElement, data: UIElementData) => HTMLElement} uiElement\r\n * Modify a UI element that's being created.\r\n * https://photoswipe.com/filters/#uielement\r\n *\r\n * @prop {(thumbnail: HTMLElement | null | undefined, itemData: SlideData, index: number) => HTMLElement} thumbEl\r\n * Modify the thumbnail element from which opening zoom animation starts or ends.\r\n * https://photoswipe.com/filters/#thumbel\r\n *\r\n * @prop {(thumbBounds: Bounds | undefined, itemData: SlideData, index: number) => Bounds} thumbBounds\r\n * Modify the thumbnail bounds from which opening zoom animation starts or ends.\r\n * https://photoswipe.com/filters/#thumbbounds\r\n *\r\n * @prop {(srcsetSizesWidth: number, content: Content) => number} srcsetSizesWidth\r\n *\r\n * @prop {(preventPointerEvent: boolean, event: PointerEvent, pointerType: string) => boolean} preventPointerEvent\r\n *\r\n */\n\n/**\r\n * @template {keyof PhotoSwipeFiltersMap} T\r\n * @typedef {{ fn: PhotoSwipeFiltersMap[T], priority: number }} Filter\r\n */\n\n/**\r\n * @template {keyof PhotoSwipeEventsMap} T\r\n * @typedef {PhotoSwipeEventsMap[T] extends undefined ? PhotoSwipeEvent<T> : PhotoSwipeEvent<T> & PhotoSwipeEventsMap[T]} AugmentedEvent\r\n */\n\n/**\r\n * @template {keyof PhotoSwipeEventsMap} T\r\n * @typedef {(event: AugmentedEvent<T>) => void} EventCallback\r\n */\n\n/**\r\n * Base PhotoSwipe event object\r\n *\r\n * @template {keyof PhotoSwipeEventsMap} T\r\n */\nclass PhotoSwipeEvent {\n /**\r\n * @param {T} type\r\n * @param {PhotoSwipeEventsMap[T]} [details]\r\n */\n constructor(type, details) {\n this.type = type;\n this.defaultPrevented = false;\n\n if (details) {\n Object.assign(this, details);\n }\n }\n\n preventDefault() {\n this.defaultPrevented = true;\n }\n\n}\n/**\r\n * PhotoSwipe base class that can listen and dispatch for events.\r\n * Shared by PhotoSwipe Core and PhotoSwipe Lightbox, extended by base.js\r\n */\n\n\nclass Eventable {\n constructor() {\n /**\r\n * @type {{ [T in keyof PhotoSwipeEventsMap]?: ((event: AugmentedEvent<T>) => void)[] }}\r\n */\n this._listeners = {};\n /**\r\n * @type {{ [T in keyof PhotoSwipeFiltersMap]?: Filter<T>[] }}\r\n */\n\n this._filters = {};\n /** @type {PhotoSwipe | undefined} */\n\n this.pswp = undefined;\n /** @type {PhotoSwipeOptions | undefined} */\n\n this.options = undefined;\n }\n /**\r\n * @template {keyof PhotoSwipeFiltersMap} T\r\n * @param {T} name\r\n * @param {PhotoSwipeFiltersMap[T]} fn\r\n * @param {number} priority\r\n */\n\n\n addFilter(name, fn, priority = 100) {\n var _this$_filters$name, _this$_filters$name2, _this$pswp;\n\n if (!this._filters[name]) {\n this._filters[name] = [];\n }\n\n (_this$_filters$name = this._filters[name]) === null || _this$_filters$name === void 0 || _this$_filters$name.push({\n fn,\n priority\n });\n (_this$_filters$name2 = this._filters[name]) === null || _this$_filters$name2 === void 0 || _this$_filters$name2.sort((f1, f2) => f1.priority - f2.priority);\n (_this$pswp = this.pswp) === null || _this$pswp === void 0 || _this$pswp.addFilter(name, fn, priority);\n }\n /**\r\n * @template {keyof PhotoSwipeFiltersMap} T\r\n * @param {T} name\r\n * @param {PhotoSwipeFiltersMap[T]} fn\r\n */\n\n\n removeFilter(name, fn) {\n if (this._filters[name]) {\n // @ts-expect-error\n this._filters[name] = this._filters[name].filter(filter => filter.fn !== fn);\n }\n\n if (this.pswp) {\n this.pswp.removeFilter(name, fn);\n }\n }\n /**\r\n * @template {keyof PhotoSwipeFiltersMap} T\r\n * @param {T} name\r\n * @param {Parameters<PhotoSwipeFiltersMap[T]>} args\r\n * @returns {Parameters<PhotoSwipeFiltersMap[T]>[0]}\r\n */\n\n\n applyFilters(name, ...args) {\n var _this$_filters$name3;\n\n (_this$_filters$name3 = this._filters[name]) === null || _this$_filters$name3 === void 0 || _this$_filters$name3.forEach(filter => {\n // @ts-expect-error\n args[0] = filter.fn.apply(this, args);\n });\n return args[0];\n }\n /**\r\n * @template {keyof PhotoSwipeEventsMap} T\r\n * @param {T} name\r\n * @param {EventCallback<T>} fn\r\n */\n\n\n on(name, fn) {\n var _this$_listeners$name, _this$pswp2;\n\n if (!this._listeners[name]) {\n this._listeners[name] = [];\n }\n\n (_this$_listeners$name = this._listeners[name]) === null || _this$_listeners$name === void 0 || _this$_listeners$name.push(fn); // When binding events to lightbox,\n // also bind events to PhotoSwipe Core,\n // if it's open.\n\n (_this$pswp2 = this.pswp) === null || _this$pswp2 === void 0 || _this$pswp2.on(name, fn);\n }\n /**\r\n * @template {keyof PhotoSwipeEventsMap} T\r\n * @param {T} name\r\n * @param {EventCallback<T>} fn\r\n */\n\n\n off(name, fn) {\n var _this$pswp3;\n\n if (this._listeners[name]) {\n // @ts-expect-error\n this._listeners[name] = this._listeners[name].filter(listener => fn !== listener);\n }\n\n (_this$pswp3 = this.pswp) === null || _this$pswp3 === void 0 || _this$pswp3.off(name, fn);\n }\n /**\r\n * @template {keyof PhotoSwipeEventsMap} T\r\n * @param {T} name\r\n * @param {PhotoSwipeEventsMap[T]} [details]\r\n * @returns {AugmentedEvent<T>}\r\n */\n\n\n dispatch(name, details) {\n var _this$_listeners$name2;\n\n if (this.pswp) {\n return this.pswp.dispatch(name, details);\n }\n\n const event =\n /** @type {AugmentedEvent<T>} */\n new PhotoSwipeEvent(name, details);\n (_this$_listeners$name2 = this._listeners[name]) === null || _this$_listeners$name2 === void 0 || _this$_listeners$name2.forEach(listener => {\n listener.call(this, event);\n });\n return event;\n }\n\n}\n\nclass Placeholder {\n /**\r\n * @param {string | false} imageSrc\r\n * @param {HTMLElement} container\r\n */\n constructor(imageSrc, container) {\n // Create placeholder\n // (stretched thumbnail or simple div behind the main image)\n\n /** @type {HTMLImageElement | HTMLDivElement | null} */\n this.element = createElement('pswp__img pswp__img--placeholder', imageSrc ? 'img' : 'div', container);\n\n if (imageSrc) {\n const imgEl =\n /** @type {HTMLImageElement} */\n this.element;\n imgEl.decoding = 'async';\n imgEl.alt = '';\n imgEl.src = imageSrc;\n imgEl.setAttribute('role', 'presentation');\n }\n\n this.element.setAttribute('aria-hidden', 'true');\n }\n /**\r\n * @param {number} width\r\n * @param {number} height\r\n */\n\n\n setDisplayedSize(width, height) {\n if (!this.element) {\n return;\n }\n\n if (this.element.tagName === 'IMG') {\n // Use transform scale() to modify img placeholder size\n // (instead of changing width/height directly).\n // This helps with performance, specifically in iOS15 Safari.\n setWidthHeight(this.element, 250, 'auto');\n this.element.style.transformOrigin = '0 0';\n this.element.style.transform = toTransformString(0, 0, width / 250);\n } else {\n setWidthHeight(this.element, width, height);\n }\n }\n\n destroy() {\n var _this$element;\n\n if ((_this$element = this.element) !== null && _this$element !== void 0 && _this$element.parentNode) {\n this.element.remove();\n }\n\n this.element = null;\n }\n\n}\n\n/** @typedef {import('./slide.js').default} Slide */\n\n/** @typedef {import('./slide.js').SlideData} SlideData */\n\n/** @typedef {import('../core/base.js').default} PhotoSwipeBase */\n\n/** @typedef {import('../util/util.js').LoadState} LoadState */\n\nclass Content {\n /**\r\n * @param {SlideData} itemData Slide data\r\n * @param {PhotoSwipeBase} instance PhotoSwipe or PhotoSwipeLightbox instance\r\n * @param {number} index\r\n */\n constructor(itemData, instance, index) {\n this.instance = instance;\n this.data = itemData;\n this.index = index;\n /** @type {HTMLImageElement | HTMLDivElement | undefined} */\n\n this.element = undefined;\n /** @type {Placeholder | undefined} */\n\n this.placeholder = undefined;\n /** @type {Slide | undefined} */\n\n this.slide = undefined;\n this.displayedImageWidth = 0;\n this.displayedImageHeight = 0;\n this.width = Number(this.data.w) || Number(this.data.width) || 0;\n this.height = Number(this.data.h) || Number(this.data.height) || 0;\n this.isAttached = false;\n this.hasSlide = false;\n this.isDecoding = false;\n /** @type {LoadState} */\n\n this.state = LOAD_STATE.IDLE;\n\n if (this.data.type) {\n this.type = this.data.type;\n } else if (this.data.src) {\n this.type = 'image';\n } else {\n this.type = 'html';\n }\n\n this.instance.dispatch('contentInit', {\n content: this\n });\n }\n\n removePlaceholder() {\n if (this.placeholder && !this.keepPlaceholder()) {\n // With delay, as image might be loaded, but not rendered\n setTimeout(() => {\n if (this.placeholder) {\n this.placeholder.destroy();\n this.placeholder = undefined;\n }\n }, 1000);\n }\n }\n /**\r\n * Preload content\r\n *\r\n * @param {boolean} isLazy\r\n * @param {boolean} [reload]\r\n */\n\n\n load(isLazy, reload) {\n if (this.slide && this.usePlaceholder()) {\n if (!this.placeholder) {\n const placeholderSrc = this.instance.applyFilters('placeholderSrc', // use image-based placeholder only for the first slide,\n // as rendering (even small stretched thumbnail) is an expensive operation\n this.data.msrc && this.slide.isFirstSlide ? this.data.msrc : false, this);\n this.placeholder = new Placeholder(placeholderSrc, this.slide.container);\n } else {\n const placeholderEl = this.placeholder.element; // Add placeholder to DOM if it was already created\n\n if (placeholderEl && !placeholderEl.parentElement) {\n this.slide.container.prepend(placeholderEl);\n }\n }\n }\n\n if (this.element && !reload) {\n return;\n }\n\n if (this.instance.dispatch('contentLoad', {\n content: this,\n isLazy\n }).defaultPrevented) {\n return;\n }\n\n if (this.isImageContent()) {\n this.element = createElement('pswp__img', 'img'); // Start loading only after width is defined, as sizes might depend on it.\n // Due to Safari feature, we must define sizes before srcset.\n\n if (this.displayedImageWidth) {\n this.loadImage(isLazy);\n }\n } else {\n this.element = createElement('pswp__content', 'div');\n this.element.innerHTML = this.data.html || '';\n }\n\n if (reload && this.slide) {\n this.slide.updateContentSize(true);\n }\n }\n /**\r\n * Preload image\r\n *\r\n * @param {boolean} isLazy\r\n */\n\n\n loadImage(isLazy) {\n var _this$data$src, _this$data$alt;\n\n if (!this.isImageContent() || !this.element || this.instance.dispatch('contentLoadImage', {\n content: this,\n isLazy\n }).defaultPrevented) {\n return;\n }\n\n const imageElement =\n /** @type HTMLImageElement */\n this.element;\n this.updateSrcsetSizes();\n\n if (this.data.srcset) {\n imageElement.srcset = this.data.srcset;\n }\n\n imageElement.src = (_this$data$src = this.data.src) !== null && _this$data$src !== void 0 ? _this$data$src : '';\n imageElement.alt = (_this$data$alt = this.data.alt) !== null && _this$data$alt !== void 0 ? _this$data$alt : '';\n this.state = LOAD_STATE.LOADING;\n\n if (imageElement.complete) {\n this.onLoaded();\n } else {\n imageElement.onload = () => {\n this.onLoaded();\n };\n\n imageElement.onerror = () => {\n this.onError();\n };\n }\n }\n /**\r\n * Assign slide to content\r\n *\r\n * @param {Slide} slide\r\n */\n\n\n setSlide(slide) {\n this.slide = slide;\n this.hasSlide = true;\n this.instance = slide.pswp; // todo: do we need to unset slide?\n }\n /**\r\n * Content load success handler\r\n */\n\n\n onLoaded() {\n this.state = LOAD_STATE.LOADED;\n\n if (this.slide && this.element) {\n this.instance.dispatch('loadComplete', {\n slide: this.slide,\n content: this\n }); // if content is reloaded\n\n if (this.slide.isActive && this.slide.heavyAppended && !this.element.parentNode) {\n this.append();\n this.slide.updateContentSize(true);\n }\n\n if (this.state === LOAD_STATE.LOADED || this.state === LOAD_STATE.ERROR) {\n this.removePlaceholder();\n }\n }\n }\n /**\r\n * Content load error handler\r\n */\n\n\n onError() {\n this.state = LOAD_STATE.ERROR;\n\n if (this.slide) {\n this.displayError();\n this.instance.dispatch('loadComplete', {\n slide: this.slide,\n isError: true,\n content: this\n });\n this.instance.dispatch('loadError', {\n slide: this.slide,\n content: this\n });\n }\n }\n /**\r\n * @returns {Boolean} If the content is currently loading\r\n */\n\n\n isLoading() {\n return this.instance.applyFilters('isContentLoading', this.state === LOAD_STATE.LOADING, this);\n }\n /**\r\n * @returns {Boolean} If the content is in error state\r\n */\n\n\n isError() {\n return this.state === LOAD_STATE.ERROR;\n }\n /**\r\n * @returns {boolean} If the content is image\r\n */\n\n\n isImageContent() {\n return this.type === 'image';\n }\n /**\r\n * Update content size\r\n *\r\n * @param {Number} width\r\n * @param {Number} height\r\n */\n\n\n setDisplayedSize(width, height) {\n if (!this.element) {\n return;\n }\n\n if (this.placeholder) {\n this.placeholder.setDisplayedSize(width, height);\n }\n\n if (this.instance.dispatch('contentResize', {\n content: this,\n width,\n height\n }).defaultPrevented) {\n return;\n }\n\n setWidthHeight(this.element, width, height);\n\n if (this.isImageContent() && !this.isError()) {\n const isInitialSizeUpdate = !this.displayedImageWidth && width;\n this.displayedImageWidth = width;\n this.displayedImageHeight = height;\n\n if (isInitialSizeUpdate) {\n this.loadImage(false);\n } else {\n this.updateSrcsetSizes();\n }\n\n if (this.slide) {\n this.instance.dispatch('imageSizeChange', {\n slide: this.slide,\n width,\n height,\n content: this\n });\n }\n }\n }\n /**\r\n * @returns {boolean} If the content can be zoomed\r\n */\n\n\n isZoomable() {\n return this.instance.applyFilters('isContentZoomable', this.isImageContent() && this.state !== LOAD_STATE.ERROR, this);\n }\n /**\r\n * Update image srcset sizes attribute based on width and height\r\n */\n\n\n updateSrcsetSizes() {\n // Handle srcset sizes attribute.\n //\n // Never lower quality, if it was increased previously.\n // Chrome does this automatically, Firefox and Safari do not,\n // so we store largest used size in dataset.\n if (!this.isImageContent() || !this.element || !this.data.srcset) {\n return;\n }\n\n const image =\n /** @type HTMLImageElement */\n this.element;\n const sizesWidth = this.instance.applyFilters('srcsetSizesWidth', this.displayedImageWidth, this);\n\n if (!image.dataset.largestUsedSize || sizesWidth > parseInt(image.dataset.largestUsedSize, 10)) {\n image.sizes = sizesWidth + 'px';\n image.dataset.largestUsedSize = String(sizesWidth);\n }\n }\n /**\r\n * @returns {boolean} If content should use a placeholder (from msrc by default)\r\n */\n\n\n usePlaceholder() {\n return this.instance.applyFilters('useContentPlaceholder', this.isImageContent(), this);\n }\n /**\r\n * Preload content with lazy-loading param\r\n */\n\n\n lazyLoad() {\n if (this.instance.dispatch('contentLazyLoad', {\n content: this\n }).defaultPrevented) {\n return;\n }\n\n this.load(true);\n }\n /**\r\n * @returns {boolean} If placeholder should be kept after content is loaded\r\n */\n\n\n keepPlaceholder() {\n return this.instance.applyFilters('isKeepingPlaceholder', this.isLoading(), this);\n }\n /**\r\n * Destroy the content\r\n */\n\n\n destroy() {\n this.hasSlide = false;\n this.slide = undefined;\n\n if (this.instance.dispatch('contentDestroy', {\n content: this\n }).defaultPrevented) {\n return;\n }\n\n this.remove();\n\n if (this.placeholder) {\n this.placeholder.destroy();\n this.placeholder = undefined;\n }\n\n if (this.isImageContent() && this.element) {\n this.element.onload = null;\n this.element.onerror = null;\n this.element = undefined;\n }\n }\n /**\r\n * Display error message\r\n */\n\n\n displayError() {\n if (this.slide) {\n var _this$instance$option, _this$instance$option2;\n\n let errorMsgEl = createElement('pswp__error-msg', 'div');\n errorMsgEl.innerText = (_this$instance$option = (_this$instance$option2 = this.instance.options) === null || _this$instance$option2 === void 0 ? void 0 : _this$instance$option2.errorMsg) !== null && _this$instance$option !== void 0 ? _this$instance$option : '';\n errorMsgEl =\n /** @type {HTMLDivElement} */\n this.instance.applyFilters('contentErrorElement', errorMsgEl, this);\n this.element = createElement('pswp__content pswp__error-msg-container', 'div');\n this.element.appendChild(errorMsgEl);\n this.slide.container.innerText = '';\n this.slide.container.appendChild(this.element);\n this.slide.updateContentSize(true);\n this.removePlaceholder();\n }\n }\n /**\r\n * Append the content\r\n */\n\n\n append() {\n if (this.isAttached || !this.element) {\n return;\n }\n\n this.isAttached = true;\n\n if (this.state === LOAD_STATE.ERROR) {\n this.displayError();\n return;\n }\n\n if (this.instance.dispatch('contentAppend', {\n content: this\n }).defaultPrevented) {\n return;\n }\n\n const supportsDecode = ('decode' in this.element);\n\n if (this.isImageContent()) {\n // Use decode() on nearby slides\n //\n // Nearby slide images are in DOM and not hidden via display:none.\n // However, they are placed offscreen (to the left and right side).\n //\n // Some browsers do not composite the image until it's actually visible,\n // using decode() helps.\n //\n // You might ask \"why dont you just decode() and then append all images\",\n // that's because I want to show image before it's fully loaded,\n // as browser can render parts of image while it is loading.\n // We do not do this in Safari due to partial loading bug.\n if (supportsDecode && this.slide && (!this.slide.isActive || isSafari())) {\n this.isDecoding = true; // purposefully using finally instead of then,\n // as if srcset sizes changes dynamically - it may cause decode error\n\n /** @type {HTMLImageElement} */\n\n this.element.decode().catch(() => {}).finally(() => {\n this.isDecoding = false;\n this.appendImage();\n });\n } else {\n this.appendImage();\n }\n } else if (this.slide && !this.element.parentNode) {\n this.slide.container.appendChild(this.element);\n }\n }\n /**\r\n * Activate the slide,\r\n * active slide is generally the current one,\r\n * meaning the user can see it.\r\n */\n\n\n activate() {\n if (this.instance.dispatch('contentActivate', {\n content: this\n }).defaultPrevented || !this.slide) {\n return;\n }\n\n if (this.isImageContent() && this.isDecoding && !isSafari()) {\n // add image to slide when it becomes active,\n // even if it's not finished decoding\n this.appendImage();\n } else if (this.isError()) {\n this.load(false, true); // try to reload\n }\n\n if (this.slide.holderElement) {\n this.slide.holderElement.setAttribute('aria-hidden', 'false');\n }\n }\n /**\r\n * Deactivate the content\r\n */\n\n\n deactivate() {\n this.instance.dispatch('contentDeactivate', {\n content: this\n });\n\n if (this.slide && this.slide.holderElement) {\n this.slide.holderElement.setAttribute('aria-hidden', 'true');\n }\n }\n /**\r\n * Remove the content from DOM\r\n */\n\n\n remove() {\n this.isAttached = false;\n\n if (this.instance.dispatch('contentRemove', {\n content: this\n }).defaultPrevented) {\n return;\n }\n\n if (this.element && this.element.parentNode) {\n this.element.remove();\n }\n\n if (this.placeholder && this.placeholder.element) {\n this.placeholder.element.remove();\n }\n }\n /**\r\n * Append the image content to slide container\r\n */\n\n\n appendImage() {\n if (!this.isAttached) {\n return;\n }\n\n if (this.instance.dispatch('contentAppendImage', {\n content: this\n }).defaultPrevented) {\n return;\n } // ensure that element exists and is not already appended\n\n\n if (this.slide && this.element && !this.element.parentNode) {\n this.slide.container.appendChild(this.element);\n }\n\n if (this.state === LOAD_STATE.LOADED || this.state === LOAD_STATE.ERROR) {\n this.removePlaceholder();\n }\n }\n\n}\n\n/** @typedef {import('./content.js').default} Content */\n\n/** @typedef {import('./slide.js').default} Slide */\n\n/** @typedef {import('./slide.js').SlideData} SlideData */\n\n/** @typedef {import('../core/base.js').default} PhotoSwipeBase */\n\n/** @typedef {import('../photoswipe.js').default} PhotoSwipe */\n\nconst MIN_SLIDES_TO_CACHE = 5;\n/**\r\n * Lazy-load an image\r\n * This function is used both by Lightbox and PhotoSwipe core,\r\n * thus it can be called before dialog is opened.\r\n *\r\n * @param {SlideData} itemData Data about the slide\r\n * @param {PhotoSwipeBase} instance PhotoSwipe or PhotoSwipeLightbox instance\r\n * @param {number} index\r\n * @returns {Content} Image that is being decoded or false.\r\n */\n\nfunction lazyLoadData(itemData, instance, index) {\n const content = instance.createContentFromData(itemData, index);\n /** @type {ZoomLevel | undefined} */\n\n let zoomLevel;\n const {\n options\n } = instance; // We need to know dimensions of the image to preload it,\n // as it might use srcset, and we need to define sizes\n\n if (options) {\n zoomLevel = new ZoomLevel(options, itemData, -1);\n let viewportSize;\n\n if (instance.pswp) {\n viewportSize = instance.pswp.viewportSize;\n } else {\n viewportSize = getViewportSize(options, instance);\n }\n\n const panAreaSize = getPanAreaSize(options, viewportSize, itemData, index);\n zoomLevel.update(content.width, content.height, panAreaSize);\n }\n\n content.lazyLoad();\n\n if (zoomLevel) {\n content.setDisplayedSize(Math.ceil(content.width * zoomLevel.initial), Math.ceil(content.height * zoomLevel.initial));\n }\n\n return content;\n}\n/**\r\n * Lazy-loads specific slide.\r\n * This function is used both by Lightbox and PhotoSwipe core,\r\n * thus it can be called before dialog is opened.\r\n *\r\n * By default, it loads image based on viewport size and initial zoom level.\r\n *\r\n * @param {number} index Slide index\r\n * @param {PhotoSwipeBase} instance PhotoSwipe or PhotoSwipeLightbox eventable instance\r\n * @returns {Content | undefined}\r\n */\n\nfunction lazyLoadSlide(index, instance) {\n const itemData = instance.getItemData(index);\n\n if (instance.dispatch('lazyLoadSlide', {\n index,\n itemData\n }).defaultPrevented) {\n return;\n }\n\n return lazyLoadData(itemData, instance, index);\n}\n\nclass ContentLoader {\n /**\r\n * @param {PhotoSwipe} pswp\r\n */\n constructor(pswp) {\n this.pswp = pswp; // Total amount of cached images\n\n this.limit = Math.max(pswp.options.preload[0] + pswp.options.preload[1] + 1, MIN_SLIDES_TO_CACHE);\n /** @type {Content[]} */\n\n this._cachedItems = [];\n }\n /**\r\n * Lazy load nearby slides based on `preload` option.\r\n *\r\n * @param {number} [diff] Difference between slide indexes that was changed recently, or 0.\r\n */\n\n\n updateLazy(diff) {\n const {\n pswp\n } = this;\n\n if (pswp.dispatch('lazyLoad').defaultPrevented) {\n return;\n }\n\n const {\n preload\n } = pswp.options;\n const isForward = diff === undefined ? true : diff >= 0;\n let i; // preload[1] - num items to preload in forward direction\n\n for (i = 0; i <= preload[1]; i++) {\n this.loadSlideByIndex(pswp.currIndex + (isForward ? i : -i));\n } // preload[0] - num items to preload in backward direction\n\n\n for (i = 1; i <= preload[0]; i++) {\n this.loadSlideByIndex(pswp.currIndex + (isForward ? -i : i));\n }\n }\n /**\r\n * @param {number} initialIndex\r\n */\n\n\n loadSlideByIndex(initialIndex) {\n const index = this.pswp.getLoopedIndex(initialIndex); // try to get cached content\n\n let content = this.getContentByIndex(index);\n\n if (!content) {\n // no cached content, so try to load from scratch:\n content = lazyLoadSlide(index, this.pswp); // if content can be loaded, add it to cache:\n\n if (content) {\n this.addToCache(content);\n }\n }\n }\n /**\r\n * @param {Slide} slide\r\n * @returns {Content}\r\n */\n\n\n getContentBySlide(slide) {\n let content = this.getContentByIndex(slide.index);\n\n if (!content) {\n // create content if not found in cache\n content = this.pswp.createContentFromData(slide.data, slide.index);\n this.addToCache(content);\n } // assign slide to content\n\n\n content.setSlide(slide);\n return content;\n }\n /**\r\n * @param {Content} content\r\n */\n\n\n addToCache(content) {\n // move to the end of array\n this.removeByIndex(content.index);\n\n this._cachedItems.push(content);\n\n if (this._cachedItems.length > this.limit) {\n // Destroy the first content that's not attached\n const indexToRemove = this._cachedItems.findIndex(item => {\n return !item.isAttached && !item.hasSlide;\n });\n\n if (indexToRemove !== -1) {\n const removedItem = this._cachedItems.splice(indexToRemove, 1)[0];\n\n removedItem.destroy();\n }\n }\n }\n /**\r\n * Removes an image from cache, does not destroy() it, just removes.\r\n *\r\n * @param {number} index\r\n */\n\n\n removeByIndex(index) {\n const indexToRemove = this._cachedItems.findIndex(item => item.index === index);\n\n if (indexToRemove !== -1) {\n this._cachedItems.splice(indexToRemove, 1);\n }\n }\n /**\r\n * @param {number} index\r\n * @returns {Content | undefined}\r\n */\n\n\n getContentByIndex(index) {\n return this._cachedItems.find(content => content.index === index);\n }\n\n destroy() {\n this._cachedItems.forEach(content => content.destroy());\n\n this._cachedItems = [];\n }\n\n}\n\n/** @typedef {import(\"../photoswipe.js\").default} PhotoSwipe */\n\n/** @typedef {import(\"../slide/slide.js\").SlideData} SlideData */\n\n/**\r\n * PhotoSwipe base class that can retrieve data about every slide.\r\n * Shared by PhotoSwipe Core and PhotoSwipe Lightbox\r\n */\n\nclass PhotoSwipeBase extends Eventable {\n /**\r\n * Get total number of slides\r\n *\r\n * @returns {number}\r\n */\n getNumItems() {\n var _this$options;\n\n let numItems = 0;\n const dataSource = (_this$options = this.options) === null || _this$options === void 0 ? void 0 : _this$options.dataSource;\n\n if (dataSource && 'length' in dataSource) {\n // may be an array or just object with length property\n numItems = dataSource.length;\n } else if (dataSource && 'gallery' in dataSource) {\n // query DOM elements\n if (!dataSource.items) {\n dataSource.items = this._getGalleryDOMElements(dataSource.gallery);\n }\n\n if (dataSource.items) {\n numItems = dataSource.items.length;\n }\n } // legacy event, before filters were introduced\n\n\n const event = this.dispatch('numItems', {\n dataSource,\n numItems\n });\n return this.applyFilters('numItems', event.numItems, dataSource);\n }\n /**\r\n * @param {SlideData} slideData\r\n * @param {number} index\r\n * @returns {Content}\r\n */\n\n\n createContentFromData(slideData, index) {\n return new Content(slideData, this, index);\n }\n /**\r\n * Get item data by index.\r\n *\r\n * \"item data\" should contain normalized information that PhotoSwipe needs to generate a slide.\r\n * For example, it may contain properties like\r\n * `src`, `srcset`, `w`, `h`, which will be used to generate a slide with image.\r\n *\r\n * @param {number} index\r\n * @returns {SlideData}\r\n */\n\n\n getItemData(index) {\n var _this$options2;\n\n const dataSource = (_this$options2 = this.options) === null || _this$options2 === void 0 ? void 0 : _this$options2.dataSource;\n /** @type {SlideData | HTMLElement} */\n\n let dataSourceItem = {};\n\n if (Array.isArray(dataSource)) {\n // Datasource is an array of elements\n dataSourceItem = dataSource[index];\n } else if (dataSource && 'gallery' in dataSource) {\n // dataSource has gallery property,\n // thus it was created by Lightbox, based on\n // gallery and children options\n // query DOM elements\n if (!dataSource.items) {\n dataSource.items = this._getGalleryDOMElements(dataSource.gallery);\n }\n\n dataSourceItem = dataSource.items[index];\n }\n\n let itemData = dataSourceItem;\n\n if (itemData instanceof Element) {\n itemData = this._domElementToItemData(itemData);\n } // Dispatching the itemData event,\n // it's a legacy verion before filters were introduced\n\n\n const event = this.dispatch('itemData', {\n itemData: itemData || {},\n index\n });\n return this.applyFilters('itemData', event.itemData, index);\n }\n /**\r\n * Get array of gallery DOM elements,\r\n * based on childSelector and gallery element.\r\n *\r\n * @param {HTMLElement} galleryElement\r\n * @returns {HTMLElement[]}\r\n */\n\n\n _getGalleryDOMElements(galleryElement) {\n var _this$options3, _this$options4;\n\n if ((_this$options3 = this.options) !== null && _this$options3 !== void 0 && _this$options3.children || (_this$options4 = this.options) !== null && _this$options4 !== void 0 && _this$options4.childSelector) {\n return getElementsFromOption(this.options.children, this.options.childSelector, galleryElement) || [];\n }\n\n return [galleryElement];\n }\n /**\r\n * Converts DOM element to item data object.\r\n *\r\n * @param {HTMLElement} element DOM element\r\n * @returns {SlideData}\r\n */\n\n\n _domElementToItemData(element) {\n /** @type {SlideData} */\n const itemData = {\n element\n };\n const linkEl =\n /** @type {HTMLAnchorElement} */\n element.tagName === 'A' ? element : element.querySelector('a');\n\n if (linkEl) {\n // src comes from data-pswp-src attribute,\n // if it's empty link href is used\n itemData.src = linkEl.dataset.pswpSrc || linkEl.href;\n\n if (linkEl.dataset.pswpSrcset) {\n itemData.srcset = linkEl.dataset.pswpSrcset;\n }\n\n itemData.width = linkEl.dataset.pswpWidth ? parseInt(linkEl.dataset.pswpWidth, 10) : 0;\n itemData.height = linkEl.dataset.pswpHeight ? parseInt(linkEl.dataset.pswpHeight, 10) : 0; // support legacy w & h properties\n\n itemData.w = itemData.width;\n itemData.h = itemData.height;\n\n if (linkEl.dataset.pswpType) {\n itemData.type = linkEl.dataset.pswpType;\n }\n\n const thumbnailEl = element.querySelector('img');\n\n if (thumbnailEl) {\n var _thumbnailEl$getAttri;\n\n // msrc is URL to placeholder image that's displayed before large image is loaded\n // by default it's displayed only for the first slide\n itemData.msrc = thumbnailEl.currentSrc || thumbnailEl.src;\n itemData.alt = (_thumbnailEl$getAttri = thumbnailEl.getAttribute('alt')) !== null && _thumbnailEl$getAttri !== void 0 ? _thumbnailEl$getAttri : '';\n }\n\n if (linkEl.dataset.pswpCropped || linkEl.dataset.cropped) {\n itemData.thumbCropped = true;\n }\n }\n\n return this.applyFilters('domItemData', itemData, element, linkEl);\n }\n /**\r\n * Lazy-load by slide data\r\n *\r\n * @param {SlideData} itemData Data about the slide\r\n * @param {number} index\r\n * @returns {Content} Image that is being decoded or false.\r\n */\n\n\n lazyLoadData(itemData, index) {\n return lazyLoadData(itemData, this, index);\n }\n\n}\n\n/** @typedef {import('./photoswipe.js').default} PhotoSwipe */\n\n/** @typedef {import('./slide/get-thumb-bounds.js').Bounds} Bounds */\n\n/** @typedef {import('./util/animations.js').AnimationProps} AnimationProps */\n// some browsers do not paint\n// elements which opacity is set to 0,\n// since we need to pre-render elements for the animation -\n// we set it to the minimum amount\n\nconst MIN_OPACITY = 0.003;\n/**\r\n * Manages opening and closing transitions of the PhotoSwipe.\r\n *\r\n * It can perform zoom, fade or no transition.\r\n */\n\nclass Opener {\n /**\r\n * @param {PhotoSwipe} pswp\r\n */\n constructor(pswp) {\n this.pswp = pswp;\n this.isClosed = true;\n this.isOpen = false;\n this.isClosing = false;\n this.isOpening = false;\n /**\r\n * @private\r\n * @type {number | false | undefined}\r\n */\n\n this._duration = undefined;\n /** @private */\n\n this._useAnimation = false;\n /** @private */\n\n this._croppedZoom = false;\n /** @private */\n\n this._animateRootOpacity = false;\n /** @private */\n\n this._animateBgOpacity = false;\n /**\r\n * @private\r\n * @type { HTMLDivElement | HTMLImageElement | null | undefined }\r\n */\n\n this._placeholder = undefined;\n /**\r\n * @private\r\n * @type { HTMLDivElement | undefined }\r\n */\n\n this._opacityElement = undefined;\n /**\r\n * @private\r\n * @type { HTMLDivElement | undefined }\r\n */\n\n this._cropContainer1 = undefined;\n /**\r\n * @private\r\n * @type { HTMLElement | null | undefined }\r\n */\n\n this._cropContainer2 = undefined;\n /**\r\n * @private\r\n * @type {Bounds | undefined}\r\n */\n\n this._thumbBounds = undefined;\n this._prepareOpen = this._prepareOpen.bind(this); // Override initial zoom and pan position\n\n pswp.on('firstZoomPan', this._prepareOpen);\n }\n\n open() {\n this._prepareOpen();\n\n this._start();\n }\n\n close() {\n if (this.isClosed || this.isClosing || this.isOpening) {\n // if we close during opening animation\n // for now do nothing,\n // browsers aren't good at changing the direction of the CSS transition\n return;\n }\n\n const slide = this.pswp.currSlide;\n this.isOpen = false;\n this.isOpening = false;\n this.isClosing = true;\n this._duration = this.pswp.options.hideAnimationDuration;\n\n if (slide && slide.currZoomLevel * slide.width >= this.pswp.options.maxWidthToAnimate) {\n this._duration = 0;\n }\n\n this._applyStartProps();\n\n setTimeout(() => {\n this._start();\n }, this._croppedZoom ? 30 : 0);\n }\n /** @private */\n\n\n _prepareOpen() {\n this.pswp.off('firstZoomPan', this._prepareOpen);\n\n if (!this.isOpening) {\n const slide = this.pswp.currSlide;\n this.isOpening = true;\n this.isClosing = false;\n this._duration = this.pswp.options.showAnimationDuration;\n\n if (slide && slide.zoomLevels.initial * slide.width >= this.pswp.options.maxWidthToAnimate) {\n this._duration = 0;\n }\n\n this._applyStartProps();\n }\n }\n /** @private */\n\n\n _applyStartProps() {\n const {\n pswp\n } = this;\n const slide = this.pswp.currSlide;\n const {\n options\n } = pswp;\n\n if (options.showHideAnimationType === 'fade') {\n options.showHideOpacity = true;\n this._thumbBounds = undefined;\n } else if (options.showHideAnimationType === 'none') {\n options.showHideOpacity = false;\n this._duration = 0;\n this._thumbBounds = undefined;\n } else if (this.isOpening && pswp._initialThumbBounds) {\n // Use initial bounds if defined\n this._thumbBounds = pswp._initialThumbBounds;\n } else {\n this._thumbBounds = this.pswp.getThumbBounds();\n }\n\n this._placeholder = slide === null || slide === void 0 ? void 0 : slide.getPlaceholderElement();\n pswp.animations.stopAll(); // Discard animations when duration is less than 50ms\n\n this._useAnimation = Boolean(this._duration && this._duration > 50);\n this._animateZoom = Boolean(this._thumbBounds) && (slide === null || slide === void 0 ? void 0 : slide.content.usePlaceholder()) && (!this.isClosing || !pswp.mainScroll.isShifted());\n\n if (!this._animateZoom) {\n this._animateRootOpacity = true;\n\n if (this.isOpening && slide) {\n slide.zoomAndPanToInitial();\n slide.applyCurrentZoomPan();\n }\n } else {\n var _options$showHideOpac;\n\n this._animateRootOpacity = (_options$showHideOpac = options.showHideOpacity) !== null && _options$showHideOpac !== void 0 ? _options$showHideOpac : false;\n }\n\n this._animateBgOpacity = !this._animateRootOpacity && this.pswp.options.bgOpacity > MIN_OPACITY;\n this._opacityElement = this._animateRootOpacity ? pswp.element : pswp.bg;\n\n if (!this._useAnimation) {\n this._duration = 0;\n this._animateZoom = false;\n this._animateBgOpacity = false;\n this._animateRootOpacity = true;\n\n if (this.isOpening) {\n if (pswp.element) {\n pswp.element.style.opacity = String(MIN_OPACITY);\n }\n\n pswp.applyBgOpacity(1);\n }\n\n return;\n }\n\n if (this._animateZoom && this._thumbBounds && this._thumbBounds.innerRect) {\n var _this$pswp$currSlide;\n\n // Properties are used when animation from cropped thumbnail\n this._croppedZoom = true;\n this._cropContainer1 = this.pswp.container;\n this._cropContainer2 = (_this$pswp$currSlide = this.pswp.currSlide) === null || _this$pswp$currSlide === void 0 ? void 0 : _this$pswp$currSlide.holderElement;\n\n if (pswp.container) {\n pswp.container.style.overflow = 'hidden';\n pswp.container.style.width = pswp.viewportSize.x + 'px';\n }\n } else {\n this._croppedZoom = false;\n }\n\n if (this.isOpening) {\n // Apply styles before opening transition\n if (this._animateRootOpacity) {\n if (pswp.element) {\n pswp.element.style.opacity = String(MIN_OPACITY);\n }\n\n pswp.applyBgOpacity(1);\n } else {\n if (this._animateBgOpacity && pswp.bg) {\n pswp.bg.style.opacity = String(MIN_OPACITY);\n }\n\n if (pswp.element) {\n pswp.element.style.opacity = '1';\n }\n }\n\n if (this._animateZoom) {\n this._setClosedStateZoomPan();\n\n if (this._placeholder) {\n // tell browser that we plan to animate the placeholder\n this._placeholder.style.willChange = 'transform'; // hide placeholder to allow hiding of\n // elements that overlap it (such as icons over the thumbnail)\n\n this._placeholder.style.opacity = String(MIN_OPACITY);\n }\n }\n } else if (this.isClosing) {\n // hide nearby slides to make sure that\n // they are not painted during the transition\n if (pswp.mainScroll.itemHolders[0]) {\n pswp.mainScroll.itemHolders[0].el.style.display = 'none';\n }\n\n if (pswp.mainScroll.itemHolders[2]) {\n pswp.mainScroll.itemHolders[2].el.style.display = 'none';\n }\n\n if (this._croppedZoom) {\n if (pswp.mainScroll.x !== 0) {\n // shift the main scroller to zero position\n pswp.mainScroll.resetPosition();\n pswp.mainScroll.resize();\n }\n }\n }\n }\n /** @private */\n\n\n _start() {\n if (this.isOpening && this._useAnimation && this._placeholder && this._placeholder.tagName === 'IMG') {\n // To ensure smooth animation\n // we wait till the current slide image placeholder is decoded,\n // but no longer than 250ms,\n // and no shorter than 50ms\n // (just using requestanimationframe is not enough in Firefox,\n // for some reason)\n new Promise(resolve => {\n let decoded = false;\n let isDelaying = true;\n decodeImage(\n /** @type {HTMLImageElement} */\n this._placeholder).finally(() => {\n decoded = true;\n\n if (!isDelaying) {\n resolve(true);\n }\n });\n setTimeout(() => {\n isDelaying = false;\n\n if (decoded) {\n resolve(true);\n }\n }, 50);\n setTimeout(resolve, 250);\n }).finally(() => this._initiate());\n } else {\n this._initiate();\n }\n }\n /** @private */\n\n\n _initiate() {\n var _this$pswp$element, _this$pswp$element2;\n\n (_this$pswp$element = this.pswp.element) === null || _this$pswp$element === void 0 || _this$pswp$element.style.setProperty('--pswp-transition-duration', this._duration + 'ms');\n this.pswp.dispatch(this.isOpening ? 'openingAnimationStart' : 'closingAnimationStart'); // legacy event\n\n this.pswp.dispatch(\n /** @type {'initialZoomIn' | 'initialZoomOut'} */\n 'initialZoom' + (this.isOpening ? 'In' : 'Out'));\n (_this$pswp$element2 = this.pswp.element) === null || _this$pswp$element2 === void 0 || _this$pswp$element2.classList.toggle('pswp--ui-visible', this.isOpening);\n\n if (this.isOpening) {\n if (this._placeholder) {\n // unhide the placeholder\n this._placeholder.style.opacity = '1';\n }\n\n this._animateToOpenState();\n } else if (this.isClosing) {\n this._animateToClosedState();\n }\n\n if (!this._useAnimation) {\n this._onAnimationComplete();\n }\n }\n /** @private */\n\n\n _onAnimationComplete() {\n const {\n pswp\n } = this;\n this.isOpen = this.isOpening;\n this.isClosed = this.isClosing;\n this.isOpening = false;\n this.isClosing = false;\n pswp.dispatch(this.isOpen ? 'openingAnimationEnd' : 'closingAnimationEnd'); // legacy event\n\n pswp.dispatch(\n /** @type {'initialZoomInEnd' | 'initialZoomOutEnd'} */\n 'initialZoom' + (this.isOpen ? 'InEnd' : 'OutEnd'));\n\n if (this.isClosed) {\n pswp.destroy();\n } else if (this.isOpen) {\n var _pswp$currSlide;\n\n if (this._animateZoom && pswp.container) {\n pswp.container.style.overflow = 'visible';\n pswp.container.style.width = '100%';\n }\n\n (_pswp$currSlide = pswp.currSlide) === null || _pswp$currSlide === void 0 || _pswp$currSlide.applyCurrentZoomPan();\n }\n }\n /** @private */\n\n\n _animateToOpenState() {\n const {\n pswp\n } = this;\n\n if (this._animateZoom) {\n if (this._croppedZoom && this._cropContainer1 && this._cropContainer2) {\n this._animateTo(this._cropContainer1, 'transform', 'translate3d(0,0,0)');\n\n this._animateTo(this._cropContainer2, 'transform', 'none');\n }\n\n if (pswp.currSlide) {\n pswp.currSlide.zoomAndPanToInitial();\n\n this._animateTo(pswp.currSlide.container, 'transform', pswp.currSlide.getCurrentTransform());\n }\n }\n\n if (this._animateBgOpacity && pswp.bg) {\n this._animateTo(pswp.bg, 'opacity', String(pswp.options.bgOpacity));\n }\n\n if (this._animateRootOpacity && pswp.element) {\n this._animateTo(pswp.element, 'opacity', '1');\n }\n }\n /** @private */\n\n\n _animateToClosedState() {\n const {\n pswp\n } = this;\n\n if (this._animateZoom) {\n this._setClosedStateZoomPan(true);\n } // do not animate opacity if it's already at 0\n\n\n if (this._animateBgOpacity && pswp.bgOpacity > 0.01 && pswp.bg) {\n this._animateTo(pswp.bg, 'opacity', '0');\n }\n\n if (this._animateRootOpacity && pswp.element) {\n this._animateTo(pswp.element, 'opacity', '0');\n }\n }\n /**\r\n * @private\r\n * @param {boolean} [animate]\r\n */\n\n\n _setClosedStateZoomPan(animate) {\n if (!this._thumbBounds) return;\n const {\n pswp\n } = this;\n const {\n innerRect\n } = this._thumbBounds;\n const {\n currSlide,\n viewportSize\n } = pswp;\n\n if (this._croppedZoom && innerRect && this._cropContainer1 && this._cropContainer2) {\n const containerOnePanX = -viewportSize.x + (this._thumbBounds.x - innerRect.x) + innerRect.w;\n const containerOnePanY = -viewportSize.y + (this._thumbBounds.y - innerRect.y) + innerRect.h;\n const containerTwoPanX = viewportSize.x - innerRect.w;\n const containerTwoPanY = viewportSize.y - innerRect.h;\n\n if (animate) {\n this._animateTo(this._cropContainer1, 'transform', toTransformString(containerOnePanX, containerOnePanY));\n\n this._animateTo(this._cropContainer2, 'transform', toTransformString(containerTwoPanX, containerTwoPanY));\n } else {\n setTransform(this._cropContainer1, containerOnePanX, containerOnePanY);\n setTransform(this._cropContainer2, containerTwoPanX, containerTwoPanY);\n }\n }\n\n if (currSlide) {\n equalizePoints(currSlide.pan, innerRect || this._thumbBounds);\n currSlide.currZoomLevel = this._thumbBounds.w / currSlide.width;\n\n if (animate) {\n this._animateTo(currSlide.container, 'transform', currSlide.getCurrentTransform());\n } else {\n currSlide.applyCurrentZoomPan();\n }\n }\n }\n /**\r\n * @private\r\n * @param {HTMLElement} target\r\n * @param {'transform' | 'opacity'} prop\r\n * @param {string} propValue\r\n */\n\n\n _animateTo(target, prop, propValue) {\n if (!this._duration) {\n target.style[prop] = propValue;\n return;\n }\n\n const {\n animations\n } = this.pswp;\n /** @type {AnimationProps} */\n\n const animProps = {\n duration: this._duration,\n easing: this.pswp.options.easing,\n onComplete: () => {\n if (!animations.activeAnimations.length) {\n this._onAnimationComplete();\n }\n },\n target\n };\n animProps[prop] = propValue;\n animations.startTransition(animProps);\n }\n\n}\n\n/**\r\n * @template T\r\n * @typedef {import('./types.js').Type<T>} Type<T>\r\n */\n\n/** @typedef {import('./slide/slide.js').SlideData} SlideData */\n\n/** @typedef {import('./slide/zoom-level.js').ZoomLevelOption} ZoomLevelOption */\n\n/** @typedef {import('./ui/ui-element.js').UIElementData} UIElementData */\n\n/** @typedef {import('./main-scroll.js').ItemHolder} ItemHolder */\n\n/** @typedef {import('./core/eventable.js').PhotoSwipeEventsMap} PhotoSwipeEventsMap */\n\n/** @typedef {import('./core/eventable.js').PhotoSwipeFiltersMap} PhotoSwipeFiltersMap */\n\n/** @typedef {import('./slide/get-thumb-bounds').Bounds} Bounds */\n\n/**\r\n * @template {keyof PhotoSwipeEventsMap} T\r\n * @typedef {import('./core/eventable.js').EventCallback<T>} EventCallback<T>\r\n */\n\n/**\r\n * @template {keyof PhotoSwipeEventsMap} T\r\n * @typedef {import('./core/eventable.js').AugmentedEvent<T>} AugmentedEvent<T>\r\n */\n\n/** @typedef {{ x: number; y: number; id?: string | number }} Point */\n\n/** @typedef {{ top: number; bottom: number; left: number; right: number }} Padding */\n\n/** @typedef {SlideData[]} DataSourceArray */\n\n/** @typedef {{ gallery: HTMLElement; items?: HTMLElement[] }} DataSourceObject */\n\n/** @typedef {DataSourceArray | DataSourceObject} DataSource */\n\n/** @typedef {(point: Point, originalEvent: PointerEvent) => void} ActionFn */\n\n/** @typedef {'close' | 'next' | 'zoom' | 'zoom-or-close' | 'toggle-controls'} ActionType */\n\n/** @typedef {Type<PhotoSwipe> | { default: Type<PhotoSwipe> }} PhotoSwipeModule */\n\n/** @typedef {PhotoSwipeModule | Promise<PhotoSwipeModule> | (() => Promise<PhotoSwipeModule>)} PhotoSwipeModuleOption */\n\n/**\r\n * @typedef {string | NodeListOf<HTMLElement> | HTMLElement[] | HTMLElement} ElementProvider\r\n */\n\n/** @typedef {Partial<PreparedPhotoSwipeOptions>} PhotoSwipeOptions https://photoswipe.com/options/ */\n\n/**\r\n * @typedef {Object} PreparedPhotoSwipeOptions\r\n *\r\n * @prop {DataSource} [dataSource]\r\n * Pass an array of any items via dataSource option. Its length will determine amount of slides\r\n * (which may be modified further from numItems event).\r\n *\r\n * Each item should contain data that you need to generate slide\r\n * (for image slide it would be src (image URL), width (image width), height, srcset, alt).\r\n *\r\n * If these properties are not present in your initial array, you may \"pre-parse\" each item from itemData filter.\r\n *\r\n * @prop {number} bgOpacity\r\n * Background backdrop opacity, always define it via this option and not via CSS rgba color.\r\n *\r\n * @prop {number} spacing\r\n * Spacing between slides. Defined as ratio relative to the viewport width (0.1 = 10% of viewport).\r\n *\r\n * @prop {boolean} allowPanToNext\r\n * Allow swipe navigation to the next slide when the current slide is zoomed. Does not apply to mouse events.\r\n *\r\n * @prop {boolean} loop\r\n * If set to true you'll be able to swipe from the last to the first image.\r\n * Option is always false when there are less than 3 slides.\r\n *\r\n * @prop {boolean} [wheelToZoom]\r\n * By default PhotoSwipe zooms image with ctrl-wheel, if you enable this option - image will zoom just via wheel.\r\n *\r\n * @prop {boolean} pinchToClose\r\n * Pinch touch gesture to close the gallery.\r\n *\r\n * @prop {boolean} closeOnVerticalDrag\r\n * Vertical drag gesture to close the PhotoSwipe.\r\n *\r\n * @prop {Padding} [padding]\r\n * Slide area padding (in pixels).\r\n *\r\n * @prop {(viewportSize: Point, itemData: SlideData, index: number) => Padding} [paddingFn]\r\n * The option is checked frequently, so make sure it's performant. Overrides padding option if defined. For example:\r\n *\r\n * @prop {number | false} hideAnimationDuration\r\n * Transition duration in milliseconds, can be 0.\r\n *\r\n * @prop {number | false} showAnimationDuration\r\n * Transition duration in milliseconds, can be 0.\r\n *\r\n * @prop {number | false} zoomAnimationDuration\r\n * Transition duration in milliseconds, can be 0.\r\n *\r\n * @prop {string} easing\r\n * String, 'cubic-bezier(.4,0,.22,1)'. CSS easing function for open/close/zoom transitions.\r\n *\r\n * @prop {boolean} escKey\r\n * Esc key to close.\r\n *\r\n * @prop {boolean} arrowKeys\r\n * Left/right arrow keys for navigation.\r\n *\r\n * @prop {boolean} trapFocus\r\n * Trap focus within PhotoSwipe element while it's open.\r\n *\r\n * @prop {boolean} returnFocus\r\n * Restore focus the last active element after PhotoSwipe is closed.\r\n *\r\n * @prop {boolean} clickToCloseNonZoomable\r\n * If image is not zoomable (for example, smaller than viewport) it can be closed by clicking on it.\r\n *\r\n * @prop {ActionType | ActionFn | false} imageClickAction\r\n * Refer to click and tap actions page.\r\n *\r\n * @prop {ActionType | ActionFn | false} bgClickAction\r\n * Refer to click and tap actions page.\r\n *\r\n * @prop {ActionType | ActionFn | false} tapAction\r\n * Refer to click and tap actions page.\r\n *\r\n * @prop {ActionType | ActionFn | false} doubleTapAction\r\n * Refer to click and tap actions page.\r\n *\r\n * @prop {number} preloaderDelay\r\n * Delay before the loading indicator will be displayed,\r\n * if image is loaded during it - the indicator will not be displayed at all. Can be zero.\r\n *\r\n * @prop {string} indexIndicatorSep\r\n * Used for slide count indicator (\"1 of 10 \").\r\n *\r\n * @prop {(options: PhotoSwipeOptions, pswp: PhotoSwipeBase) => Point} [getViewportSizeFn]\r\n * A function that should return slide viewport width and height, in format {x: 100, y: 100}.\r\n *\r\n * @prop {string} errorMsg\r\n * Message to display when the image wasn't able to load. If you need to display HTML - use contentErrorElement filter.\r\n *\r\n * @prop {[number, number]} preload\r\n * Lazy loading of nearby slides based on direction of movement. Should be an array with two integers,\r\n * first one - number of items to preload before the current image, second one - after the current image.\r\n * Two nearby images are always loaded.\r\n *\r\n * @prop {string} [mainClass]\r\n * Class that will be added to the root element of PhotoSwipe, may contain multiple separated by space.\r\n * Example on Styling page.\r\n *\r\n * @prop {HTMLElement} [appendToEl]\r\n * Element to which PhotoSwipe dialog will be appended when it opens.\r\n *\r\n * @prop {number} maxWidthToAnimate\r\n * Maximum width of image to animate, if initial rendered image width\r\n * is larger than this value - the opening/closing transition will be automatically disabled.\r\n *\r\n * @prop {string} [closeTitle]\r\n * Translating\r\n *\r\n * @prop {string} [zoomTitle]\r\n * Translating\r\n *\r\n * @prop {string} [arrowPrevTitle]\r\n * Translating\r\n *\r\n * @prop {string} [arrowNextTitle]\r\n * Translating\r\n *\r\n * @prop {'zoom' | 'fade' | 'none'} [showHideAnimationType]\r\n * To adjust opening or closing transition type use lightbox option `showHideAnimationType` (`String`).\r\n * It supports three values - `zoom` (default), `fade` (default if there is no thumbnail) and `none`.\r\n *\r\n * Animations are automatically disabled if user `(prefers-reduced-motion: reduce)`.\r\n *\r\n * @prop {number} index\r\n * Defines start slide index.\r\n *\r\n * @prop {(e: MouseEvent) => number} [getClickedIndexFn]\r\n *\r\n * @prop {boolean} [arrowPrev]\r\n * @prop {boolean} [arrowNext]\r\n * @prop {boolean} [zoom]\r\n * @prop {boolean} [close]\r\n * @prop {boolean} [counter]\r\n *\r\n * @prop {string} [arrowPrevSVG]\r\n * @prop {string} [arrowNextSVG]\r\n * @prop {string} [zoomSVG]\r\n * @prop {string} [closeSVG]\r\n * @prop {string} [counterSVG]\r\n *\r\n * @prop {string} [arrowPrevTitle]\r\n * @prop {string} [arrowNextTitle]\r\n * @prop {string} [zoomTitle]\r\n * @prop {string} [closeTitle]\r\n * @prop {string} [counterTitle]\r\n *\r\n * @prop {ZoomLevelOption} [initialZoomLevel]\r\n * @prop {ZoomLevelOption} [secondaryZoomLevel]\r\n * @prop {ZoomLevelOption} [maxZoomLevel]\r\n *\r\n * @prop {boolean} [mouseMovePan]\r\n * @prop {Point | null} [initialPointerPos]\r\n * @prop {boolean} [showHideOpacity]\r\n *\r\n * @prop {PhotoSwipeModuleOption} [pswpModule]\r\n * @prop {() => Promise<any>} [openPromise]\r\n * @prop {boolean} [preloadFirstSlide]\r\n * @prop {ElementProvider} [gallery]\r\n * @prop {string} [gallerySelector]\r\n * @prop {ElementProvider} [children]\r\n * @prop {string} [childSelector]\r\n * @prop {string | false} [thumbSelector]\r\n */\n\n/** @type {PreparedPhotoSwipeOptions} */\n\nconst defaultOptions = {\n allowPanToNext: true,\n spacing: 0.1,\n loop: true,\n pinchToClose: true,\n closeOnVerticalDrag: true,\n hideAnimationDuration: 333,\n showAnimationDuration: 333,\n zoomAnimationDuration: 333,\n escKey: true,\n arrowKeys: true,\n trapFocus: true,\n returnFocus: true,\n maxWidthToAnimate: 4000,\n clickToCloseNonZoomable: true,\n imageClickAction: 'zoom-or-close',\n bgClickAction: 'close',\n tapAction: 'toggle-controls',\n doubleTapAction: 'zoom',\n indexIndicatorSep: ' / ',\n preloaderDelay: 2000,\n bgOpacity: 0.8,\n index: 0,\n errorMsg: 'The image cannot be loaded',\n preload: [1, 2],\n easing: 'cubic-bezier(.4,0,.22,1)'\n};\n/**\r\n * PhotoSwipe Core\r\n */\n\nclass PhotoSwipe extends PhotoSwipeBase {\n /**\r\n * @param {PhotoSwipeOptions} [options]\r\n */\n constructor(options) {\n super();\n this.options = this._prepareOptions(options || {});\n /**\r\n * offset of viewport relative to document\r\n *\r\n * @type {Point}\r\n */\n\n this.offset = {\n x: 0,\n y: 0\n };\n /**\r\n * @type {Point}\r\n * @private\r\n */\n\n this._prevViewportSize = {\n x: 0,\n y: 0\n };\n /**\r\n * Size of scrollable PhotoSwipe viewport\r\n *\r\n * @type {Point}\r\n */\n\n this.viewportSize = {\n x: 0,\n y: 0\n };\n /**\r\n * background (backdrop) opacity\r\n */\n\n this.bgOpacity = 1;\n this.currIndex = 0;\n this.potentialIndex = 0;\n this.isOpen = false;\n this.isDestroying = false;\n this.hasMouse = false;\n /**\r\n * @private\r\n * @type {SlideData}\r\n */\n\n this._initialItemData = {};\n /** @type {Bounds | undefined} */\n\n this._initialThumbBounds = undefined;\n /** @type {HTMLDivElement | undefined} */\n\n this.topBar = undefined;\n /** @type {HTMLDivElement | undefined} */\n\n this.element = undefined;\n /** @type {HTMLDivElement | undefined} */\n\n this.template = undefined;\n /** @type {HTMLDivElement | undefined} */\n\n this.container = undefined;\n /** @type {HTMLElement | undefined} */\n\n this.scrollWrap = undefined;\n /** @type {Slide | undefined} */\n\n this.currSlide = undefined;\n this.events = new DOMEvents();\n this.animations = new Animations();\n this.mainScroll = new MainScroll(this);\n this.gestures = new Gestures(this);\n this.opener = new Opener(this);\n this.keyboard = new Keyboard(this);\n this.contentLoader = new ContentLoader(this);\n }\n /** @returns {boolean} */\n\n\n init() {\n if (this.isOpen || this.isDestroying) {\n return false;\n }\n\n this.isOpen = true;\n this.dispatch('init'); // legacy\n\n this.dispatch('beforeOpen');\n\n this._createMainStructure(); // add classes to the root element of PhotoSwipe\n\n\n let rootClasses = 'pswp--open';\n\n if (this.gestures.supportsTouch) {\n rootClasses += ' pswp--touch';\n }\n\n if (this.options.mainClass) {\n rootClasses += ' ' + this.options.mainClass;\n }\n\n if (this.element) {\n this.element.className += ' ' + rootClasses;\n }\n\n this.currIndex = this.options.index || 0;\n this.potentialIndex = this.currIndex;\n this.dispatch('firstUpdate'); // starting index can be modified here\n // initialize scroll wheel handler to block the scroll\n\n this.scrollWheel = new ScrollWheel(this); // sanitize index\n\n if (Number.isNaN(this.currIndex) || this.currIndex < 0 || this.currIndex >= this.getNumItems()) {\n this.currIndex = 0;\n }\n\n if (!this.gestures.supportsTouch) {\n // enable mouse features if no touch support detected\n this.mouseDetected();\n } // causes forced synchronous layout\n\n\n this.updateSize();\n this.offset.y = window.pageYOffset;\n this._initialItemData = this.getItemData(this.currIndex);\n this.dispatch('gettingData', {\n index: this.currIndex,\n data: this._initialItemData,\n slide: undefined\n }); // *Layout* - calculate size and position of elements here\n\n this._initialThumbBounds = this.getThumbBounds();\n this.dispatch('initialLayout');\n this.on('openingAnimationEnd', () => {\n const {\n itemHolders\n } = this.mainScroll; // Add content to the previous and next slide\n\n if (itemHolders[0]) {\n itemHolders[0].el.style.display = 'block';\n this.setContent(itemHolders[0], this.currIndex - 1);\n }\n\n if (itemHolders[2]) {\n itemHolders[2].el.style.display = 'block';\n this.setContent(itemHolders[2], this.currIndex + 1);\n }\n\n this.appendHeavy();\n this.contentLoader.updateLazy();\n this.events.add(window, 'resize', this._handlePageResize.bind(this));\n this.events.add(window, 'scroll', this._updatePageScrollOffset.bind(this));\n this.dispatch('bindEvents');\n }); // set content for center slide (first time)\n\n if (this.mainScroll.itemHolders[1]) {\n this.setContent(this.mainScroll.itemHolders[1], this.currIndex);\n }\n\n this.dispatch('change');\n this.opener.open();\n this.dispatch('afterInit');\n return true;\n }\n /**\r\n * Get looped slide index\r\n * (for example, -1 will return the last slide)\r\n *\r\n * @param {number} index\r\n * @returns {number}\r\n */\n\n\n getLoopedIndex(index) {\n const numSlides = this.getNumItems();\n\n if (this.options.loop) {\n if (index > numSlides - 1) {\n index -= numSlides;\n }\n\n if (index < 0) {\n index += numSlides;\n }\n }\n\n return clamp(index, 0, numSlides - 1);\n }\n\n appendHeavy() {\n this.mainScroll.itemHolders.forEach(itemHolder => {\n var _itemHolder$slide;\n\n (_itemHolder$slide = itemHolder.slide) === null || _itemHolder$slide === void 0 || _itemHolder$slide.appendHeavy();\n });\n }\n /**\r\n * Change the slide\r\n * @param {number} index New index\r\n */\n\n\n goTo(index) {\n this.mainScroll.moveIndexBy(this.getLoopedIndex(index) - this.potentialIndex);\n }\n /**\r\n * Go to the next slide.\r\n */\n\n\n next() {\n this.goTo(this.potentialIndex + 1);\n }\n /**\r\n * Go to the previous slide.\r\n */\n\n\n prev() {\n this.goTo(this.potentialIndex - 1);\n }\n /**\r\n * @see slide/slide.js zoomTo\r\n *\r\n * @param {Parameters<Slide['zoomTo']>} args\r\n */\n\n\n zoomTo(...args) {\n var _this$currSlide;\n\n (_this$currSlide = this.currSlide) === null || _this$currSlide === void 0 || _this$currSlide.zoomTo(...args);\n }\n /**\r\n * @see slide/slide.js toggleZoom\r\n */\n\n\n toggleZoom() {\n var _this$currSlide2;\n\n (_this$currSlide2 = this.currSlide) === null || _this$currSlide2 === void 0 || _this$currSlide2.toggleZoom();\n }\n /**\r\n * Close the gallery.\r\n * After closing transition ends - destroy it\r\n */\n\n\n close() {\n if (!this.opener.isOpen || this.isDestroying) {\n return;\n }\n\n this.isDestroying = true;\n this.dispatch('close');\n this.events.removeAll();\n this.opener.close();\n }\n /**\r\n * Destroys the gallery:\r\n * - instantly closes the gallery\r\n * - unbinds events,\r\n * - cleans intervals and timeouts\r\n * - removes elements from DOM\r\n */\n\n\n destroy() {\n var _this$element;\n\n if (!this.isDestroying) {\n this.options.showHideAnimationType = 'none';\n this.close();\n return;\n }\n\n this.dispatch('destroy');\n this._listeners = {};\n\n if (this.scrollWrap) {\n this.scrollWrap.ontouchmove = null;\n this.scrollWrap.ontouchend = null;\n }\n\n (_this$element = this.element) === null || _this$element === void 0 || _this$element.remove();\n this.mainScroll.itemHolders.forEach(itemHolder => {\n var _itemHolder$slide2;\n\n (_itemHolder$slide2 = itemHolder.slide) === null || _itemHolder$slide2 === void 0 || _itemHolder$slide2.destroy();\n });\n this.contentLoader.destroy();\n this.events.removeAll();\n }\n /**\r\n * Refresh/reload content of a slide by its index\r\n *\r\n * @param {number} slideIndex\r\n */\n\n\n refreshSlideContent(slideIndex) {\n this.contentLoader.removeByIndex(slideIndex);\n this.mainScroll.itemHolders.forEach((itemHolder, i) => {\n var _this$currSlide$index, _this$currSlide3;\n\n let potentialHolderIndex = ((_this$currSlide$index = (_this$currSlide3 = this.currSlide) === null || _this$currSlide3 === void 0 ? void 0 : _this$currSlide3.index) !== null && _this$currSlide$index !== void 0 ? _this$currSlide$index : 0) - 1 + i;\n\n if (this.canLoop()) {\n potentialHolderIndex = this.getLoopedIndex(potentialHolderIndex);\n }\n\n if (potentialHolderIndex === slideIndex) {\n // set the new slide content\n this.setContent(itemHolder, slideIndex, true); // activate the new slide if it's current\n\n if (i === 1) {\n var _itemHolder$slide3;\n\n this.currSlide = itemHolder.slide;\n (_itemHolder$slide3 = itemHolder.slide) === null || _itemHolder$slide3 === void 0 || _itemHolder$slide3.setIsActive(true);\n }\n }\n });\n this.dispatch('change');\n }\n /**\r\n * Set slide content\r\n *\r\n * @param {ItemHolder} holder mainScroll.itemHolders array item\r\n * @param {number} index Slide index\r\n * @param {boolean} [force] If content should be set even if index wasn't changed\r\n */\n\n\n setContent(holder, index, force) {\n if (this.canLoop()) {\n index = this.getLoopedIndex(index);\n }\n\n if (holder.slide) {\n if (holder.slide.index === index && !force) {\n // exit if holder already contains this slide\n // this could be common when just three slides are used\n return;\n } // destroy previous slide\n\n\n holder.slide.destroy();\n holder.slide = undefined;\n } // exit if no loop and index is out of bounds\n\n\n if (!this.canLoop() && (index < 0 || index >= this.getNumItems())) {\n return;\n }\n\n const itemData = this.getItemData(index);\n holder.slide = new Slide(itemData, index, this); // set current slide\n\n if (index === this.currIndex) {\n this.currSlide = holder.slide;\n }\n\n holder.slide.append(holder.el);\n }\n /** @returns {Point} */\n\n\n getViewportCenterPoint() {\n return {\n x: this.viewportSize.x / 2,\n y: this.viewportSize.y / 2\n };\n }\n /**\r\n * Update size of all elements.\r\n * Executed on init and on page resize.\r\n *\r\n * @param {boolean} [force] Update size even if size of viewport was not changed.\r\n */\n\n\n updateSize(force) {\n // let item;\n // let itemIndex;\n if (this.isDestroying) {\n // exit if PhotoSwipe is closed or closing\n // (to avoid errors, as resize event might be delayed)\n return;\n } //const newWidth = this.scrollWrap.clientWidth;\n //const newHeight = this.scrollWrap.clientHeight;\n\n\n const newViewportSize = getViewportSize(this.options, this);\n\n if (!force && pointsEqual(newViewportSize, this._prevViewportSize)) {\n // Exit if dimensions were not changed\n return;\n } //this._prevViewportSize.x = newWidth;\n //this._prevViewportSize.y = newHeight;\n\n\n equalizePoints(this._prevViewportSize, newViewportSize);\n this.dispatch('beforeResize');\n equalizePoints(this.viewportSize, this._prevViewportSize);\n\n this._updatePageScrollOffset();\n\n this.dispatch('viewportSize'); // Resize slides only after opener animation is finished\n // and don't re-calculate size on inital size update\n\n this.mainScroll.resize(this.opener.isOpen);\n\n if (!this.hasMouse && window.matchMedia('(any-hover: hover)').matches) {\n this.mouseDetected();\n }\n\n this.dispatch('resize');\n }\n /**\r\n * @param {number} opacity\r\n */\n\n\n applyBgOpacity(opacity) {\n this.bgOpacity = Math.max(opacity, 0);\n\n if (this.bg) {\n this.bg.style.opacity = String(this.bgOpacity * this.options.bgOpacity);\n }\n }\n /**\r\n * Whether mouse is detected\r\n */\n\n\n mouseDetected() {\n if (!this.hasMouse) {\n var _this$element2;\n\n this.hasMouse = true;\n (_this$element2 = this.element) === null || _this$element2 === void 0 || _this$element2.classList.add('pswp--has_mouse');\n }\n }\n /**\r\n * Page resize event handler\r\n *\r\n * @private\r\n */\n\n\n _handlePageResize() {\n this.updateSize(); // In iOS webview, if element size depends on document size,\n // it'll be measured incorrectly in resize event\n //\n // https://bugs.webkit.org/show_bug.cgi?id=170595\n // https://hackernoon.com/onresize-event-broken-in-mobile-safari-d8469027bf4d\n\n if (/iPhone|iPad|iPod/i.test(window.navigator.userAgent)) {\n setTimeout(() => {\n this.updateSize();\n }, 500);\n }\n }\n /**\r\n * Page scroll offset is used\r\n * to get correct coordinates\r\n * relative to PhotoSwipe viewport.\r\n *\r\n * @private\r\n */\n\n\n _updatePageScrollOffset() {\n this.setScrollOffset(0, window.pageYOffset);\n }\n /**\r\n * @param {number} x\r\n * @param {number} y\r\n */\n\n\n setScrollOffset(x, y) {\n this.offset.x = x;\n this.offset.y = y;\n this.dispatch('updateScrollOffset');\n }\n /**\r\n * Create main HTML structure of PhotoSwipe,\r\n * and add it to DOM\r\n *\r\n * @private\r\n */\n\n\n _createMainStructure() {\n // root DOM element of PhotoSwipe (.pswp)\n this.element = createElement('pswp', 'div');\n this.element.setAttribute('tabindex', '-1');\n this.element.setAttribute('role', 'dialog'); // template is legacy prop\n\n this.template = this.element; // Background is added as a separate element,\n // as animating opacity is faster than animating rgba()\n\n this.bg = createElement('pswp__bg', 'div', this.element);\n this.scrollWrap = createElement('pswp__scroll-wrap', 'section', this.element);\n this.container = createElement('pswp__container', 'div', this.scrollWrap); // aria pattern: carousel\n\n this.scrollWrap.setAttribute('aria-roledescription', 'carousel');\n this.container.setAttribute('aria-live', 'off');\n this.container.setAttribute('id', 'pswp__items');\n this.mainScroll.appendHolders();\n this.ui = new UI(this);\n this.ui.init(); // append to DOM\n\n (this.options.appendToEl || document.body).appendChild(this.element);\n }\n /**\r\n * Get position and dimensions of small thumbnail\r\n * {x:,y:,w:}\r\n *\r\n * Height is optional (calculated based on the large image)\r\n *\r\n * @returns {Bounds | undefined}\r\n */\n\n\n getThumbBounds() {\n return getThumbBounds(this.currIndex, this.currSlide ? this.currSlide.data : this._initialItemData, this);\n }\n /**\r\n * If the PhotoSwipe can have continuous loop\r\n * @returns Boolean\r\n */\n\n\n canLoop() {\n return this.options.loop && this.getNumItems() > 2;\n }\n /**\r\n * @private\r\n * @param {PhotoSwipeOptions} options\r\n * @returns {PreparedPhotoSwipeOptions}\r\n */\n\n\n _prepareOptions(options) {\n if (window.matchMedia('(prefers-reduced-motion), (update: slow)').matches) {\n options.showHideAnimationType = 'none';\n options.zoomAnimationDuration = 0;\n }\n /** @type {PreparedPhotoSwipeOptions} */\n\n\n return { ...defaultOptions,\n ...options\n };\n }\n\n}\n\nexport { PhotoSwipe as default };\n//# sourceMappingURL=photoswipe.esm.js.map\n","import 'photoswipe/style.css';\nimport PhotoSwipeLightbox, { DataSource } from 'photoswipe/lightbox';\nimport PhotoSwipe from 'photoswipe';\nimport { BoxComponent } from '../types/box';\nimport { icons } from '../icons';\nimport { query } from '../utils/query';\nimport { safeTemplate } from '../utils/safe-template';\nimport { Nodes } from '../models/nodes';\nimport { Box } from '../models/box';\nimport { locale } from '../i18n';\n\ntype ImageInfo = {\n node: Nodes;\n width?: number;\n height?: number;\n};\n\nfunction bindResizerEvents(pointerNode: Nodes, box: Box): void {\n const editor = box.getEditor();\n if (!editor) {\n return;\n }\n const boxContainer = box.getContainer();\n const resizerNode = pointerNode.closest('.lake-resizer');\n const infoNode = resizerNode.find('.lake-resizer-info');\n const isPlus = pointerNode.attr('class').indexOf('-right') >= 0;\n const initialWidth = boxContainer.width();\n const initialHeight = boxContainer.height();\n const rate = initialHeight / initialWidth;\n let clientX = 0;\n let width = 0;\n // resizing box\n const pointermoveListener = (event: Event) => {\n const pointerEvent = event as PointerEvent;\n const diffX = pointerEvent.clientX - clientX;\n const newWidth = Math.round(isPlus ? width + diffX : width - diffX);\n const newHeight = Math.round(rate * newWidth);\n boxContainer.css({\n width: `${newWidth}px`,\n height: `${newHeight}px`,\n });\n infoNode.text(`${newWidth} x ${newHeight}`);\n };\n // start resizing\n const pointerdownListener = (event: Event) => {\n const pointerEvent = event as PointerEvent;\n const pointerNativeNode = pointerNode.get(0) as Element;\n // The capture will be implicitly released after a pointerup or pointercancel event.\n // https://developer.mozilla.org/en-US/docs/Web/API/Element/setPointerCapture\n pointerNativeNode.setPointerCapture(pointerEvent.pointerId);\n clientX = pointerEvent.clientX;\n width = boxContainer.width();\n infoNode.show();\n pointerNode.on('pointermove', pointermoveListener);\n };\n // stop resizing\n const pointerupListner = () => {\n pointerNode.off('pointermove');\n infoNode.hide();\n width = box.getContainer().width();\n const height = Math.round(rate * width);\n box.updateValue({\n width,\n height,\n });\n editor.history.save();\n };\n // cancel resizing\n const pointercancelListner = () => {\n pointerNode.off('pointermove');\n infoNode.hide();\n };\n pointerNode.on('pointerdown', pointerdownListener);\n pointerNode.on('pointerup', pointerupListner);\n pointerNode.on('pointercancel', pointercancelListner);\n}\n\n// Loads an image and get its width and height.\nasync function getImageInfo(url: string): Promise<ImageInfo> {\n const node = query('<img />');\n node.css({\n position: 'absolute',\n top: '0',\n left: '-8888px',\n 'z-index': '-1',\n visibility: 'hidden',\n });\n return new Promise(resolve => {\n node.on('load', () => {\n const imgNativeNode = node.get(0) as HTMLImageElement;\n const width = imgNativeNode.width;\n const height = imgNativeNode.height;\n node.remove();\n node.removeAttr('style');\n resolve({\n node,\n width,\n height,\n });\n });\n node.on('error', () => {\n node.remove();\n resolve({\n node,\n });\n });\n node.attr('src', url);\n query(document.body).append(node);\n });\n}\n\n// Opens full screen view.\nfunction openFullScreen(box: Box): void {\n const editor = box.getEditor();\n if (!editor) {\n return;\n }\n const dataSource: DataSource = [];\n let currentIndex = 0;\n const allImageBox = editor.container.find('lake-box[name=\"image\"]');\n allImageBox.each((node, index) => {\n const imageBox = new Box(node);\n const imageValue = imageBox.value;\n if (imageValue.status !== 'done') {\n return;\n }\n dataSource.push({\n id: index,\n src: imageValue.originalUrl || imageValue.url,\n width: imageValue.originalWidth || imageValue.width,\n height: imageValue.originalHeight || imageValue.height,\n alt: imageValue.name,\n });\n if (box.node.id === imageBox.node.id) {\n currentIndex = index;\n }\n });\n const lightbox = new PhotoSwipeLightbox({\n pswpModule: PhotoSwipe,\n dataSource,\n mainClass: 'lake-pswp',\n zoom: false,\n arrowPrevSVG: icons.get('left'),\n arrowNextSVG: icons.get('right'),\n closeSVG: icons.get('close'),\n arrowPrevTitle: locale.image.previous(),\n arrowNextTitle: locale.image.next(),\n closeTitle: locale.image.close(),\n errorMsg: locale.image.loadingError(),\n });\n lightbox.on('uiRegister', () => {\n const pswp: any = lightbox.pswp;\n pswp.ui.registerElement({\n name: 'zoom-out-button',\n order: 8,\n isButton: true,\n title: locale.image.zoomOut(),\n html: icons.get('zoomOut'),\n onClick: () => {\n const currSlide = pswp.currSlide;\n const step = (currSlide.zoomLevels.max - currSlide.zoomLevels.min) / 5;\n const destZoomLevel = currSlide.currZoomLevel - step;\n currSlide.zoomTo(destZoomLevel, undefined, 333);\n },\n });\n pswp.ui.registerElement({\n name: 'zoom-in-button',\n order: 9,\n isButton: true,\n title: locale.image.zoomIn(),\n html: icons.get('zoomIn'),\n onClick: () => {\n const currSlide = pswp.currSlide;\n const step = (currSlide.zoomLevels.max - currSlide.zoomLevels.min) / 5;\n const destZoomLevel = currSlide.currZoomLevel + step;\n currSlide.zoomTo(destZoomLevel, undefined, 333);\n },\n });\n });\n lightbox.addFilter('thumbEl', (thumbnail, itemData) => {\n const imgNode = allImageBox.eq(itemData.id).find('.lake-image-img');\n if (imgNode.length > 0) {\n return imgNode.get(0) as HTMLElement;\n }\n return thumbnail as HTMLElement;\n });\n lightbox.addFilter('placeholderSrc', (placeholderSrc, slide) => {\n const imgNode = allImageBox.eq(slide.data.id).find('.lake-image-img');\n if (imgNode.length > 0) {\n return imgNode.attr('src');\n }\n return placeholderSrc;\n });\n lightbox.on('openingAnimationEnd', () => {\n box.event.emit('openfullscreen');\n });\n lightbox.init();\n lightbox.loadAndOpen(currentIndex);\n}\n\n// Removes current box.\nfunction removeImageBox(box: Box): void {\n const editor = box.getEditor();\n if (!editor) {\n return;\n }\n const xhr = box.getData('xhr');\n if (xhr) {\n xhr.abort();\n }\n editor.selection.range.selectBox(box.node);\n editor.removeBox();\n editor.history.save();\n}\n\n// Displays error icon and filename.\nasync function renderError(imageNode: Nodes, box: Box): Promise<void> {\n const value = box.value;\n box.getContainer().css({\n width: '',\n height: '',\n });\n const buttonGroupNode = query(safeTemplate`\n <div class=\"lake-button-group\">\n <button type=\"button\" tabindex=\"-1\" class=\"lake-button-remove\" title=\"${locale.image.remove()}\"></button>\n </div>\n `);\n const removeButton = buttonGroupNode.find('.lake-button-remove');\n const removeIcon = icons.get('remove');\n if (removeIcon) {\n removeButton.append(removeIcon);\n }\n const errorNode = query(safeTemplate`\n <div class=\"lake-error\">\n <div class=\"lake-error-icon\"></div>\n <div class=\"lake-error-name\">${value.name || ''}</div>\n </div>\n `);\n const imageIcon = icons.get('image');\n if (imageIcon) {\n errorNode.find('.lake-error-icon').append(imageIcon);\n }\n imageNode.append(buttonGroupNode);\n imageNode.append(errorNode);\n}\n\n// Displays an image with uplaoding progress.\nasync function renderUploading(imageNode: Nodes, box: Box): Promise<void> {\n const editor = box.getEditor();\n if (!editor) {\n return;\n }\n const value = box.value;\n const imageInfo = await getImageInfo(value.url);\n if (!imageInfo.width || !imageInfo.height) {\n await renderError(imageNode, box);\n return;\n }\n const maxWidth = editor.container.innerWidth() - 2;\n const width = imageInfo.width < maxWidth ? imageInfo.width : maxWidth;\n const height = Math.round(width * imageInfo.height / imageInfo.width);\n box.updateValue({\n width,\n height,\n originalWidth: imageInfo.width,\n originalHeight: imageInfo.height,\n });\n box.getContainer().css({\n width: `${width}px`,\n height: `${height}px`,\n });\n const buttonGroupNode = query(safeTemplate`\n <div class=\"lake-button-group\">\n <button type=\"button\" tabindex=\"-1\" class=\"lake-button-remove\" title=\"${locale.image.remove()}\"></button>\n </div>\n `);\n const removeButton = buttonGroupNode.find('.lake-button-remove');\n const removeIcon = icons.get('remove');\n if (removeIcon) {\n removeButton.append(removeIcon);\n }\n const percent = Math.round(value.percent || 0);\n const progressNode = query(safeTemplate`\n <div class=\"lake-progress\">\n <div class=\"lake-percent\">${percent} %</div>\n </div>\n `);\n if (width < 80) {\n progressNode.find('.lake-percent').hide();\n }\n const circleNotchIcon = icons.get('circleNotch');\n if (circleNotchIcon) {\n progressNode.prepend(circleNotchIcon);\n }\n const imgNode = imageInfo.node;\n imageInfo.node.addClass('lake-image-img');\n imgNode.attr({\n draggable: 'false',\n alt: value.name,\n });\n imageNode.append(buttonGroupNode);\n imageNode.append(progressNode);\n imageNode.append(imgNode);\n}\n\n// Displays an image that can be previewed or removed.\nasync function renderDone(imageNode: Nodes, box: Box): Promise<void> {\n const editor = box.getEditor();\n if (!editor) {\n return;\n }\n const value = box.value;\n const imageInfo = await getImageInfo(value.url);\n if (!imageInfo.width || !imageInfo.height) {\n await renderError(imageNode, box);\n return;\n }\n let width = value.width;\n let height = value.height;\n if (!width || !height) {\n const maxWidth = editor.container.innerWidth() - 2;\n width = Math.round(imageInfo.width < maxWidth ? imageInfo.width : maxWidth);\n height = Math.round(width * imageInfo.height / imageInfo.width);\n box.updateValue({\n width,\n height,\n });\n }\n box.getContainer().css({\n width: `${width}px`,\n height: `${height}px`,\n });\n const buttonGroupNode = query(safeTemplate`\n <div class=\"lake-button-group\">\n <button type=\"button\" tabindex=\"-1\" class=\"lake-button-view\" title=\"${locale.image.view()}\"></button>\n <button type=\"button\" tabindex=\"-1\" class=\"lake-button-remove\" title=\"${locale.image.remove()}\"></button>\n </div>\n `);\n const viewButton = buttonGroupNode.find('.lake-button-view');\n const maximizeIcon = icons.get('maximize');\n if (maximizeIcon) {\n viewButton.append(maximizeIcon);\n }\n if (width < 80 || PhotoSwipeLightbox === null) {\n viewButton.hide();\n }\n const removeButton = buttonGroupNode.find('.lake-button-remove');\n const removeIcon = icons.get('remove');\n if (removeIcon) {\n removeButton.append(removeIcon);\n }\n const resizerNode = query(safeTemplate`\n <div class=\"lake-resizer\">\n <div class=\"lake-resizer-top-left\"></div>\n <div class=\"lake-resizer-top-right\"></div>\n <div class=\"lake-resizer-bottom-left\"></div>\n <div class=\"lake-resizer-bottom-right\"></div>\n <div class=\"lake-resizer-info\">${width} x ${height}</div>\n </div>\n `);\n const imgNode = imageInfo.node;\n imgNode.addClass('lake-image-img');\n imgNode.attr({\n draggable: 'false',\n alt: value.name,\n });\n bindResizerEvents(resizerNode.find('.lake-resizer-top-left'), box);\n bindResizerEvents(resizerNode.find('.lake-resizer-top-right'), box);\n bindResizerEvents(resizerNode.find('.lake-resizer-bottom-left'), box);\n bindResizerEvents(resizerNode.find('.lake-resizer-bottom-right'), box);\n imageNode.append(buttonGroupNode);\n imageNode.append(resizerNode);\n imageNode.append(imgNode);\n}\n\nexport const imageBox: BoxComponent = {\n type: 'inline',\n name: 'image',\n render: box => {\n const editor = box.getEditor();\n if (!editor) {\n return;\n }\n const value = box.value;\n const container = box.getContainer();\n if (value.width && value.height && container.find('.lake-progress').length === 0) {\n container.css({\n width: `${value.width}px`,\n height: `${value.height}px`,\n });\n container.empty();\n const placeholderNode = query('<div class=\"lake-image-placeholder\" />');\n container.append(placeholderNode);\n const imageIcon = icons.get('image');\n if (imageIcon) {\n placeholderNode.append(imageIcon);\n }\n }\n if (container.first().length === 0) {\n // The code below is for unit testing because some test cases need to\n // select the content of the box before it is completely loaded.\n // Example:\n // range.setStart(box.getContainer(), 1);\n container.append('<div />');\n }\n // for test\n if (value.status === 'loading') {\n return;\n }\n const imageNode = query('<div class=\"lake-image\" />');\n imageNode.addClass(`lake-image-${value.status}`);\n let promise: Promise<void>;\n if (value.status === 'uploading') {\n promise = renderUploading(imageNode, box);\n } else if (value.status === 'error') {\n promise = renderError(imageNode, box);\n } else {\n promise = renderDone(imageNode, box);\n }\n promise.then(() => {\n container.empty();\n container.append(imageNode);\n imageNode.find('.lake-button-view').on('click', () => openFullScreen(box));\n imageNode.find('.lake-button-remove').on('click', event => {\n event.stopPropagation();\n removeImageBox(box);\n });\n box.event.emit('render');\n });\n imageNode.on('click', () => {\n editor.selection.range.selectBox(box.node);\n });\n },\n html: box => {\n const value = box.node.attr('value');\n return safeTemplate`<img src=\"${box.value.url}\" data-lake-value=\"${value}\" />`;\n },\n};\n","import { BoxComponent } from '../types/box';\nimport { icons } from '../icons';\nimport { debug, query } from '../utils';\nimport { Dropdown } from '../ui/dropdown';\nimport { locale } from '../i18n';\n\nconst config = {\n defaultLang: 'text',\n background: '#0000000a',\n foreground: '#444d56',\n selection: '#1ba2e333',\n cursor: '#044289',\n keyword: '#cf222e',\n variable: '#1f2328',\n parameter: '#24292e',\n function: '#005cc5',\n string: '#0a3069',\n constant: '#0550ae',\n type: '#24292f',\n class: '#24292e',\n number: '#0550ae',\n comment: '#57606a',\n heading: '#0550ae',\n invalid: '#f6f8fa',\n regexp: '#116329',\n};\n\nfunction getHighlightStyle(CodeMirror: any) {\n const { HighlightStyle, tags } = CodeMirror;\n return HighlightStyle.define([\n { tag: tags.keyword, color: config.keyword },\n { tag: [tags.name, tags.deleted, tags.character, tags.macroName], color: config.variable },\n { tag: [tags.propertyName], color: config.function },\n { tag: [tags.processingInstruction, tags.string, tags.inserted, tags.special(tags.string)], color: config.string },\n { tag: [tags.function(tags.variableName), tags.labelName], color: config.function },\n { tag: [tags.color, tags.constant(tags.name), tags.standard(tags.name)], color: config.constant },\n { tag: [tags.definition(tags.name), tags.separator], color: config.variable },\n { tag: [tags.className], color: config.class },\n { tag: [tags.number, tags.changed, tags.annotation, tags.modifier, tags.self, tags.namespace], color: config.number },\n { tag: [tags.typeName], color: config.type },\n { tag: [tags.operator, tags.operatorKeyword], color: config.keyword },\n { tag: [tags.url, tags.escape, tags.regexp, tags.link], color: config.regexp },\n { tag: [tags.meta, tags.comment], color: config.comment },\n { tag: tags.strong, fontWeight: 'bold' },\n { tag: tags.emphasis, fontStyle: 'italic' },\n { tag: tags.link, textDecoration: 'underline' },\n { tag: tags.heading, fontWeight: 'bold', color: config.heading },\n { tag: [tags.atom, tags.bool, tags.special(tags.variableName)], color: config.variable },\n { tag: tags.invalid, color: config.invalid },\n { tag: tags.strikethrough, textDecoration: 'line-through' },\n ]);\n}\n\nexport const codeBlockBox: BoxComponent = {\n type: 'block',\n name: 'codeBlock',\n render: box => {\n const editor = box.getEditor();\n if (!editor) {\n return;\n }\n const codeBlockNode = query('<div class=\"lake-code-block\" />');\n const container = box.getContainer();\n container.empty();\n container.append(codeBlockNode);\n const codeBlockNativeNode = codeBlockNode.get(0) as HTMLElement;\n if (!codeBlockNativeNode) {\n return;\n }\n // begin to create CodeMirror\n const CodeMirror = window.CodeMirror;\n if (!CodeMirror) {\n codeBlockNode.addClass('lake-code-block-error');\n codeBlockNode.text('The code cannot be displayed because window.CodeMirror is not found. Please check if the CodeMirror file is added to this page.');\n codeBlockNode.on('click', () => {\n editor.selection.range.selectBox(box.node);\n });\n return;\n }\n const {\n EditorState, Compartment, EditorView,\n keymap, history, defaultKeymap, historyKeymap,\n indentWithTab, syntaxHighlighting, langItems,\n } = CodeMirror;\n // language menu items\n const langItemMap: Map<string, any> = new Map();\n for (const item of langItems) {\n langItemMap.set(item.value, item);\n }\n const boxValue = box.value;\n const langItem = langItemMap.get(boxValue.lang);\n const language = new Compartment();\n const changeHandler = (value: string) => {\n // Here setTimeout is necessary because isComposing is not false after ending composition.\n window.setTimeout(() => {\n if (editor.isComposing) {\n return;\n }\n box.updateValue('code', value);\n editor.history.save();\n }, 0);\n };\n const updateListener = EditorView.updateListener.of((update: any) => {\n if (!update.docChanged) {\n return;\n }\n changeHandler(update.state.doc.toString());\n });\n const codeEditor = new EditorView({\n parent: codeBlockNativeNode,\n doc: boxValue.code ?? '',\n extensions: [\n EditorState.readOnly.of(editor.readonly),\n history(),\n keymap.of([\n ...defaultKeymap,\n ...historyKeymap,\n indentWithTab,\n ]),\n syntaxHighlighting(getHighlightStyle(CodeMirror)),\n language.of(langItem && langItem.component ? langItem.component() : []),\n updateListener,\n ],\n });\n codeBlockNode.find('[contenteditable=\"true\"]').attr('tabindex', '-1');\n const dropdown = new Dropdown({\n root: codeBlockNode,\n name: 'langType',\n downIcon: icons.get('down'),\n defaultValue: langItem ? boxValue.lang : config.defaultLang,\n tooltip: locale.codeBlock.langType(),\n width: 'auto',\n menuType: 'list',\n menuItems: langItems.map((item: any) => ({\n value: item.value,\n text: item.text,\n })),\n onSelect: value => {\n const item = langItemMap.get(value);\n codeEditor.dispatch({\n effects: language.reconfigure(item && item.component ? item.component() : []),\n });\n box.updateValue({\n lang: value,\n });\n editor.history.save();\n },\n });\n dropdown.render();\n box.setData('codeEditor', codeEditor);\n box.useEffect(() => () => {\n codeEditor.destroy();\n debug('CodeMirror destroyed');\n });\n },\n};\n","import type { Editor } from '..';\nimport { blockTagNames } from '../config/tag-names';\nimport { getElementRules } from '../config/element-rules';\nimport {\n forEach, wrapNodeList, changeTagName,\n fixNumberedList, removeBr, query, normalizeValue,\n} from '../utils';\nimport { Nodes } from '../models/nodes';\nimport { Box } from '../models/box';\nimport { HTMLParser } from '../parsers/html-parser';\nimport { TextParser } from '../parsers/text-parser';\nimport { uploadImage } from '../ui/upload';\n\nconst blockSelector = Array.from(blockTagNames).join(',');\n\nfunction getPasteElementRules(): any {\n const rules = getElementRules();\n rules.div = rules.p;\n forEach(rules, (key, attributeRules) => {\n delete attributeRules.id;\n delete attributeRules.class;\n });\n return rules;\n}\n\nfunction fixNestedBlocks(block: Nodes): void {\n const nodeList = [ block ];\n for (const node of block.getWalker()) {\n nodeList.push(node);\n }\n for (const node of nodeList) {\n if (node.name === 'div') {\n if (node.find(blockSelector).length > 0) {\n node.remove(true);\n } else {\n changeTagName(node, 'p');\n }\n } else if (node.isHeading || ['blockquote', 'li'].indexOf(node.name) >= 0) {\n node.find(blockSelector).remove(true);\n }\n }\n}\n\nfunction fixClipboardData(fragment: DocumentFragment): void {\n let node = new Nodes(fragment.firstChild);\n while (node.length > 0) {\n const nextNode = node.next();\n if (node.isBlock) {\n fixNestedBlocks(node);\n }\n node = nextNode;\n }\n let nodeList: Nodes[] = [];\n node = new Nodes(fragment.firstChild);\n while (node.length > 0) {\n const nextNode = node.next();\n if (node.isMark || node.isText || node.isBookmark || node.isInlineBox) {\n nodeList.push(node);\n } else {\n wrapNodeList(nodeList);\n nodeList = [];\n }\n node = nextNode;\n }\n wrapNodeList(nodeList);\n}\n\nfunction insertFirstNode(editor: Editor, otherNode: Nodes): void {\n const range = editor.selection.range;\n const boxNode = range.startNode.closest('lake-box');\n if (boxNode.length > 0) {\n const box = new Box(boxNode);\n if (box.type === 'inline') {\n if (range.isBoxLeft) {\n range.setStartBefore(boxNode);\n range.collapseToStart();\n } else if (range.isBoxRight) {\n range.setStartAfter(boxNode);\n range.collapseToStart();\n } else {\n editor.removeBox();\n }\n } else {\n const paragraph = query('<p />');\n if (range.isBoxLeft) {\n boxNode.before(paragraph);\n range.shrinkAfter(paragraph);\n } else if (range.isBoxRight) {\n boxNode.after(paragraph);\n range.shrinkAfter(paragraph);\n } else {\n editor.removeBox();\n }\n }\n }\n const block = range.startNode.closestBlock();\n if (otherNode.isBlockBox) {\n const box = new Box(otherNode);\n const value = otherNode.attr('value') !== '' ? box.value : undefined;\n editor.insertBox(box.name, value);\n otherNode.remove();\n return;\n }\n if (otherNode.first().length > 0) {\n removeBr(block);\n }\n if (block.isEmpty && block.name === 'p') {\n block.replaceWith(otherNode);\n otherNode.find('lake-box').each(node => {\n new Box(node).render();\n });\n range.shrinkAfter(otherNode);\n return;\n }\n let child = otherNode.first();\n while(child.length > 0) {\n if (child.name === 'li') {\n child = child.first();\n }\n const nextSibling = child.next();\n editor.selection.insertNode(child);\n child = nextSibling;\n }\n otherNode.remove();\n}\n\nfunction pasteFragment(editor: Editor, fragment: DocumentFragment): void {\n const selection = editor.selection;\n const range = selection.range;\n if (fragment.childNodes.length === 0) {\n return;\n }\n const firstNode = new Nodes(fragment.firstChild);\n let lastNode = new Nodes(fragment.lastChild);\n if (range.getBlocks().length === 0) {\n selection.setBlocks('<p />');\n }\n insertFirstNode(editor, firstNode);\n // remove br\n let child = new Nodes(fragment.firstChild);\n while (child.length > 0) {\n const next = child.next();\n if (child.name === 'br') {\n child.remove();\n }\n child = next;\n }\n lastNode = new Nodes(fragment.lastChild);\n // insert fragment\n if (fragment.childNodes.length > 0) {\n const parts = selection.splitBlock();\n if (parts.left) {\n range.setEndAfter(parts.left);\n range.collapseToEnd();\n }\n if (parts.right && parts.right.isEmpty) {\n parts.right.remove();\n }\n selection.insertFragment(fragment);\n range.shrinkAfter(lastNode);\n }\n fixNumberedList(editor.container.children().filter(node => node.isBlock));\n editor.history.save();\n}\n\nexport default (editor: Editor) => {\n const { imageRequestTypes } = editor.config;\n editor.container.on('paste', event => {\n const range = editor.selection.range;\n if (range.isInsideBox) {\n return;\n }\n event.preventDefault();\n const dataTransfer = (event as ClipboardEvent).clipboardData;\n if (!dataTransfer) {\n return;\n }\n editor.selection.deleteContents();\n // upload file\n if (dataTransfer.files.length > 0) {\n for (const file of dataTransfer.files) {\n if (imageRequestTypes.indexOf(file.type) >= 0) {\n uploadImage({\n editor,\n file,\n });\n }\n }\n return;\n }\n const types = dataTransfer.types;\n const isPlainText = (types.length === 1 && types[0] === 'text/plain');\n if (isPlainText) {\n const content = dataTransfer.getData('text/plain');\n const textParser = new TextParser(content);\n const fragment = textParser.getFragment();\n editor.event.emit('beforepaste', fragment);\n pasteFragment(editor, fragment);\n return;\n }\n const content = normalizeValue(dataTransfer.getData('text/html'));\n const rules = getPasteElementRules();\n const htmlParser = new HTMLParser(content, rules);\n const fragment = htmlParser.getFragment();\n editor.event.emit('beforepaste', fragment);\n fixClipboardData(fragment);\n pasteFragment(editor, fragment);\n editor.box.renderAll(editor);\n });\n};\n","import type { Editor } from '..';\nimport { query } from '../utils/query';\n\nfunction setParagraph(editor: Editor) {\n editor.selection.setBlocks('<p />');\n}\n\nfunction setNumberedList(editor: Editor) {\n editor.selection.setBlocks('<ol><li></li></ol>');\n}\n\nfunction setBulletedList(editor: Editor) {\n editor.selection.setBlocks('<ul><li></li></ul>');\n}\n\nfunction setChecklist(editor: Editor, value: boolean) {\n editor.selection.setBlocks(`<ul type=\"checklist\"><li value=\"${value}\"></li></ul>`);\n}\n\nexport default (editor: Editor) => {\n editor.command.add('list', {\n selectedValues: appliedItems => {\n let currentValue;\n for (const item of appliedItems) {\n if (item.name === 'ol') {\n currentValue = 'numbered';\n break;\n }\n if (item.name === 'ul' && !item.node.hasAttr('type')) {\n currentValue = 'bulleted';\n break;\n }\n if (item.name === 'ul' && item.node.attr('type') === 'checklist') {\n currentValue = 'checklist';\n break;\n }\n }\n return currentValue ? [currentValue] : [];\n },\n execute: (type: 'numbered' | 'bulleted' | 'checklist', value: boolean = false) => {\n const blocks = editor.selection.range.getBlocks();\n let isNumberedList = false;\n let isBulletedList = false;\n let isChecklist = false;\n for (const block of blocks) {\n if (!isNumberedList && block.name === 'ol') {\n isNumberedList = true;\n }\n if (!isBulletedList && block.name === 'ul' && !block.hasAttr('type')) {\n isBulletedList = true;\n }\n if (!isChecklist && block.name === 'ul' && block.attr('type') === 'checklist') {\n isChecklist = true;\n }\n }\n if (isNumberedList) {\n if (type === 'numbered') {\n setParagraph(editor);\n }\n if (type === 'bulleted') {\n setBulletedList(editor);\n }\n if (type === 'checklist') {\n setChecklist(editor, value);\n }\n } else if (isBulletedList) {\n if (type === 'numbered') {\n setNumberedList(editor);\n }\n if (type === 'bulleted') {\n setParagraph(editor);\n }\n if (type === 'checklist') {\n setChecklist(editor, value);\n }\n } else if (isChecklist) {\n if (type === 'numbered') {\n setNumberedList(editor);\n }\n if (type === 'bulleted') {\n setBulletedList(editor);\n }\n if (type === 'checklist') {\n setParagraph(editor);\n }\n } else {\n if (type === 'numbered') {\n setNumberedList(editor);\n }\n if (type === 'bulleted') {\n setBulletedList(editor);\n }\n if (type === 'checklist') {\n setChecklist(editor, value);\n }\n }\n editor.history.save();\n },\n });\n editor.container.on('click', event => {\n const mouseEvent = event as MouseEvent;\n if (!mouseEvent.target) {\n return;\n }\n const target = query(mouseEvent.target as Element);\n if (target.name === 'li' && target.attr('value') !== '' && mouseEvent.offsetX <= 18) {\n target.attr('value', (target.attr('value') !== 'true').toString());\n editor.history.save();\n }\n });\n};\n","import type { Editor } from '..';\n\nconst alignValueMap: {[key: string]: string} = {\n start: 'left',\n end: 'right',\n};\n\nexport default (editor: Editor) => {\n editor.command.add('align', {\n selectedValues: appliedItems => {\n let currentValue;\n for (const item of appliedItems) {\n if (item.node.isBlock) {\n currentValue = item.node.computedCSS('text-align');\n break;\n }\n }\n if (!currentValue) {\n return [];\n }\n return [alignValueMap[currentValue] || currentValue];\n },\n execute: (type: 'left' | 'center' | 'right' | 'justify') => {\n editor.selection.setBlocks({\n 'text-align': type,\n });\n editor.history.save();\n },\n });\n};\n","import type { Editor } from '..';\n\nconst tagName = 'strong';\n\nexport default (editor: Editor) => {\n editor.command.add('bold', {\n isDisabled: appliedItems => !!appliedItems.find(item => item.node.isHeading),\n isSelected: appliedItems => !!appliedItems.find(item => item.name === tagName),\n execute: () => {\n if (editor.command.isSelected('bold')) {\n editor.selection.removeMark(`<${tagName} />`);\n } else {\n editor.selection.addMark(`<${tagName} />`);\n }\n editor.history.save();\n },\n });\n editor.keystroke.setKeydown('mod+b', event => {\n event.preventDefault();\n editor.command.execute('bold');\n });\n};\n","import type { Editor } from '..';\n\nconst tagName = 'sub';\n\nexport default (editor: Editor) => {\n editor.command.add('subscript', {\n isSelected: appliedItems => !!appliedItems.find(item => item.name === tagName),\n execute: () => {\n if (editor.command.isSelected('subscript')) {\n editor.selection.removeMark(`<${tagName} />`);\n } else {\n editor.selection.addMark(`<${tagName} />`);\n }\n editor.history.save();\n },\n });\n};\n","import type { Editor } from '..';\n\nconst tagName = 'sup';\n\nexport default (editor: Editor) => {\n editor.command.add('superscript', {\n isSelected: appliedItems => !!appliedItems.find(item => item.name === tagName),\n execute: () => {\n if (editor.command.isSelected('superscript')) {\n editor.selection.removeMark(`<${tagName} />`);\n } else {\n editor.selection.addMark(`<${tagName} />`);\n }\n editor.history.save();\n },\n });\n};\n","import type { Editor } from '..';\n\nconst tagName = 'code';\n\nexport default (editor: Editor) => {\n editor.command.add('code', {\n isSelected: appliedItems => !!appliedItems.find(item => item.name === tagName),\n execute: () => {\n if (editor.command.isSelected('code')) {\n editor.selection.removeMark(`<${tagName} />`);\n } else {\n editor.selection.addMark(`<${tagName} />`);\n }\n editor.history.save();\n },\n });\n};\n","import type { Editor } from '..';\nimport { Nodes } from '../models/nodes';\n\nlet markList: Nodes[] = [];\n\nconst formatPainterClassName = 'lake-format-painter';\n\nexport default (editor: Editor) => {\n editor.command.add('formatPainter', {\n execute: () => {\n editor.container.addClass(formatPainterClassName);\n const appliedItems = editor.selection.getAppliedItems();\n for (const item of appliedItems) {\n const node = item.node.clone();\n if (node.isMark && node.name !== 'a') {\n markList.push(node);\n }\n }\n },\n });\n editor.container.on('click', () => {\n editor.container.removeClass(formatPainterClassName);\n if (markList.length === 0) {\n return;\n }\n for (const mark of markList) {\n editor.selection.addMark(mark);\n }\n markList = [];\n editor.history.save();\n });\n editor.event.on('click', (tagetNode: Nodes) => {\n if (tagetNode.isInside) {\n return;\n }\n const buttonNode = tagetNode.closest('button[name=\"formatPainter\"]');\n if (buttonNode.length > 0) {\n return;\n }\n editor.container.removeClass(formatPainterClassName);\n markList = [];\n });\n};\n","import EventEmitter from 'eventemitter3';\nimport { icons } from '../icons';\nimport { safeTemplate } from '../utils/safe-template';\nimport { query } from '../utils/query';\nimport { Nodes } from '../models/nodes';\nimport { Button } from './button';\nimport { locale } from '../i18n';\n\nexport class LinkPopup {\n private linkNode: Nodes | null = null;\n\n private root: Nodes;\n\n public container: Nodes;\n\n public event: EventEmitter = new EventEmitter();\n\n constructor(root: Nodes) {\n this.root = root;\n this.container = query(safeTemplate`\n <div class=\"lake-link-popup\">\n <div class=\"lake-row\">${locale.link.url()}</div>\n <div class=\"lake-row lake-url-row\">\n <input type=\"text\" name=\"url\" />\n </div>\n <div class=\"lake-row\">${locale.link.title()}</div>\n <div class=\"lake-row\">\n <input type=\"text\" name=\"title\" />\n </div>\n <div class=\"lake-row lake-button-row\"></div>\n </div>\n `);\n }\n\n // Writes the specified text to the system clipboard\n private async writeClipboardText(text: string): Promise<boolean> {\n let error = false;\n try {\n if (window.LAKE_TEST) {\n error = window.LAKE_ERROR;\n } else {\n await navigator.clipboard.writeText(text);\n }\n } catch {\n error = true;\n }\n return new Promise(resolve => {\n resolve(error);\n });\n }\n\n // Copy link to clipboard\n private appendCopyButton(): void {\n let timeoutId: number | null = null;\n const button = new Button({\n root: this.container.find('.lake-url-row'),\n name: 'copy',\n icon: icons.get('copy'),\n tooltip: locale.link.copy(),\n onClick: () => {\n if (!this.linkNode) {\n return;\n }\n const url = this.getInputValue('url');\n this.writeClipboardText(url).then((error: boolean) => {\n const svgNode = this.container.find('button[name=\"copy\"] svg');\n svgNode.hide();\n if (error) {\n svgNode.eq(2).show('inline');\n this.event.emit('copy', error);\n return;\n }\n svgNode.eq(1).show('inline');\n this.event.emit('copy', error);\n if (timeoutId) {\n window.clearTimeout(timeoutId);\n }\n timeoutId = window.setTimeout(() => {\n svgNode.hide();\n svgNode.eq(0).show('inline');\n }, 2000);\n });\n },\n });\n button.render();\n const copyDoneIcon = icons.get('checkCircle');\n if (copyDoneIcon) {\n button.node.append(copyDoneIcon);\n }\n const copyErrorIcon = icons.get('warningCircle');\n if (copyErrorIcon) {\n button.node.append(copyErrorIcon);\n }\n }\n\n // Open link in new tab\n private appendOpenButton(): void {\n const button = new Button({\n root: this.container.find('.lake-url-row'),\n name: 'open',\n icon: icons.get('open'),\n tooltip: locale.link.open(),\n onClick: () => {\n if (!this.linkNode) {\n return;\n }\n const url = this.getInputValue('url');\n window.open(url);\n },\n });\n button.render();\n }\n\n // Save link\n private appendSaveButton(): void {\n const button = new Button({\n root: this.container.find('.lake-button-row'),\n name: 'save',\n icon: icons.get('check'),\n text: locale.link.save(),\n onClick: () => {\n if (!this.linkNode) {\n return;\n }\n this.save();\n this.hide();\n this.event.emit('save');\n },\n });\n button.render();\n }\n\n // Remove link\n private appendUnlinkButton(): void {\n const button = new Button({\n root: this.container.find('.lake-button-row'),\n name: 'unlink',\n icon: icons.get('unlink'),\n text: locale.link.unlink(),\n onClick: () => {\n if (!this.linkNode) {\n return;\n }\n this.linkNode.remove(true);\n this.hide();\n this.event.emit('remove');\n },\n });\n button.render();\n }\n\n public getInputValue(name: string): string {\n const inputElement = this.container.find(`input[name=\"${name}\"]`);\n const nativeInputElement = inputElement.get(0) as HTMLInputElement;\n return nativeInputElement.value;\n }\n\n public setInputValue(name: string, value: string): void {\n const inputElement = this.container.find(`input[name=\"${name}\"]`);\n const nativeInputElement = inputElement.get(0) as HTMLInputElement;\n nativeInputElement.value = value;\n }\n\n public save(): void {\n if (!this.linkNode) {\n return;\n }\n const url = this.getInputValue('url');\n let title = this.getInputValue('title');\n if (url === '' && title === '') {\n this.linkNode.remove();\n return;\n }\n if (title === '') {\n title = url;\n }\n this.linkNode.attr('href', url);\n this.linkNode.text(title);\n }\n\n public updatePosition(): void {\n if (!this.linkNode) {\n return;\n }\n const linkNativeNode = this.linkNode.get(0) as HTMLElement;\n // Returns a DOMRect object providing information about the size of an element and its position relative to the viewport.\n const linkRect = linkNativeNode.getBoundingClientRect();\n const linkX = linkRect.x + window.scrollX;\n const linkY = linkRect.y + window.scrollY;\n if (linkX < 0 || linkY < 0) {\n this.hide();\n return;\n }\n // link.x + popup.width > window.width\n if (linkRect.x + this.container.width() > window.innerWidth) {\n // link.x + window.scrollX - (popup.width - link.width)\n this.container.css('left', `${linkX - this.container.width() + linkRect.width}px`);\n } else {\n this.container.css('left', `${linkX}px`);\n }\n // link.y + link.height + popup.height > window.height\n if (linkRect.y + linkRect.height + this.container.height() > window.innerHeight) {\n // link.y + window.scrollY - popup.height\n this.container.css('top', `${linkY - this.container.height()}px`);\n } else {\n this.container.css('top', `${linkY + linkRect.height}px`);\n }\n }\n\n public render(): void {\n this.appendCopyButton();\n this.appendOpenButton();\n this.appendSaveButton();\n this.appendUnlinkButton();\n this.root.append(this.container);\n }\n\n public show(linkNode: Nodes): void {\n if (this.root.find('.lake-link-popup').length === 0) {\n this.render();\n }\n if (this.linkNode && this.linkNode.get(0) === linkNode.get(0)) {\n return;\n }\n this.linkNode = linkNode;\n const url = linkNode.attr('href');\n const title = linkNode.text();\n this.setInputValue('url', url);\n if (title !== url) {\n this.setInputValue('title', title);\n }\n this.container.css('visibility', 'hidden');\n this.container.show();\n this.updatePosition();\n this.container.css('visibility', '');\n this.container.find('input[name=\"url\"]').focus();\n }\n\n public hide(): void {\n this.linkNode = null;\n this.container.hide();\n }\n}\n","import type { Editor } from '..';\nimport { Point } from '../types/object';\nimport { Nodes } from '../models/nodes';\n\ntype MarkItem = {\n re: RegExp;\n getParameters: () => string[];\n};\n\ntype BlockItem = {\n re: RegExp;\n getParameters: () => (string | boolean)[];\n} | {\n re: RegExp;\n getParameters: (results: RegExpExecArray) => (string | boolean | object)[];\n};\n\nconst headingTypeMap = new Map([\n ['#', 'h1'],\n ['##', 'h2'],\n ['###', 'h3'],\n ['####', 'h4'],\n ['#####', 'h5'],\n ['######', 'h6'],\n]);\n\nconst markItemList: MarkItem[] = [\n {\n re: /\\*\\*(.+?)\\*\\*$/,\n getParameters: () => [\n 'bold',\n ],\n },\n {\n re: /__(.+?)__$/,\n getParameters: () => [\n 'bold',\n ],\n },\n {\n re: /_(.+?)_$/,\n getParameters: () => [\n 'italic',\n ],\n },\n {\n re: /\\*(.+?)\\*$/,\n getParameters: () => [\n 'italic',\n ],\n },\n {\n re: /==(.+?)==$/,\n getParameters: () => [\n 'highlight',\n '#fff566', // yellow-4, from https://ant.design/docs/spec/colors\n ],\n },\n {\n re: /~~(.+?)~~$/,\n getParameters: () => [\n 'strikethrough',\n ],\n },\n {\n re: /`(.+?)`$/,\n getParameters: () => [\n 'code',\n ],\n },\n];\n\nconst blockItemListForSpaceKey: BlockItem[] = [\n {\n re: /^#+$/,\n getParameters: (results: RegExpExecArray) => [\n 'heading',\n headingTypeMap.get(results[0]) ?? 'h6',\n ],\n },\n {\n re: /^\\d+\\.$/,\n getParameters: () => [\n 'list',\n 'numbered',\n ],\n },\n {\n re: /^[*\\-+]$/,\n getParameters: () => [\n 'list',\n 'bulleted',\n ],\n },\n {\n re: /^\\[\\s?\\]$/,\n getParameters: () => [\n 'list',\n 'checklist',\n false,\n ],\n },\n {\n re: /^\\[x\\]$/i,\n getParameters: () => [\n 'list',\n 'checklist',\n true,\n ],\n },\n {\n re: /^>$/,\n getParameters: () => [\n 'blockQuote',\n ],\n },\n];\n\nconst blockItemListForEnterKey: BlockItem[] = [\n {\n re: /^-+$/,\n getParameters: () => [\n 'hr',\n ],\n },\n {\n re: /^`+([a-z]*)$/i,\n getParameters: (results: RegExpExecArray) => {\n if (!results[1]) {\n return [\n 'codeBlock',\n ];\n }\n return [\n 'codeBlock',\n {\n lang: results[1],\n },\n ];\n },\n },\n];\n\nfunction getMarkdownPoint(editor: Editor): Point | void {\n const selection = editor.selection;\n const range = selection.range;\n let node = range.startNode;\n let offset = range.startOffset;\n if (offset === 0) {\n return;\n }\n if (node.isElement) {\n const child = node.children()[offset - 1];\n if (!child || !child.isText) {\n return;\n }\n node = child;\n offset = node.text().length;\n }\n if (offset < 1) {\n return;\n }\n return {\n node,\n offset,\n };\n}\n\n// case 1: <p></p> to <p><br /></p>\n// case 2: <p><focus /></p> to <p><br /><focus /></p>\nfunction fixEmptyBlock(block: Nodes): void {\n const newBlock = block.clone(true);\n newBlock.find('lake-bookmark').remove();\n if (newBlock.html() !== '') {\n return;\n }\n block.prepend('<br />');\n}\n\nfunction executeMarkCommand(editor: Editor, point: Point): boolean {\n const selection = editor.selection;\n const range = selection.range;\n const offset = point.offset;\n const text = point.node.text().slice(0, offset);\n for (const item of markItemList) {\n const results = item.re.exec(text);\n if (results !== null) {\n // <p>foo**bold**<focus /></p>, offset = 11\n // to\n // <p>foobold\\u200B<focus /></p>,\n // to\n // <p>foo[bold]\\u200B<focus /></p>, startOffset = 3, endOffset = 7\n editor.prepareOperation();\n const bookmark = selection.insertBookmark();\n const node = bookmark.focus.prev();\n const oldValue = node.text();\n const newValue = `${oldValue.replace(item.re, '$1')}\\u200B`;\n node.get(0).nodeValue = newValue;\n range.setStart(node, offset - results[0].length);\n range.setEnd(node, offset - (oldValue.length - newValue.length) - 1);\n const parameters = item.getParameters();\n editor.command.execute(parameters.shift() as string, ...parameters);\n selection.toBookmark(bookmark);\n editor.commitOperation();\n return true;\n }\n }\n return false;\n}\n\nfunction spaceKeyExecutesBlockCommand(editor: Editor, point: Point): boolean {\n const selection = editor.selection;\n const offset = point.offset;\n let text = point.node.text().slice(0, offset);\n text = text.replace(/[\\u200B\\u2060]/g, '');\n for (const item of blockItemListForSpaceKey) {\n const results = item.re.exec(text);\n if (results !== null) {\n // <p>#<focus />foo</p>\n // to\n // <h1><focus />foo</h1>\n editor.prepareOperation();\n const bookmark = selection.insertBookmark();\n const node = bookmark.focus.prev();\n node.remove();\n const block = bookmark.focus.closestBlock();\n fixEmptyBlock(block);\n selection.range.shrinkAfter(block);\n const parameters = item.getParameters(results);\n editor.command.execute(parameters.shift() as string, ...parameters);\n selection.toBookmark(bookmark);\n editor.commitOperation();\n return true;\n }\n }\n return false;\n}\n\nfunction enterKeyExecutesBlockCommand(editor: Editor, block: Nodes): boolean {\n const selection = editor.selection;\n let text = block.text();\n text = text.replace(/[\\u200B\\u2060]/g, '');\n for (const item of blockItemListForEnterKey) {\n const results = item.re.exec(text);\n if (results !== null) {\n // <p>---<focus /></p>\n // to\n // <lake-box type=\"block\" name=\"hr\" focus=\"right\"></lake-box>\n editor.prepareOperation();\n block.empty();\n fixEmptyBlock(block);\n selection.range.shrinkAfter(block);\n const parameters = item.getParameters(results);\n editor.command.execute(parameters.shift() as string, ...parameters);\n editor.commitOperation();\n return true;\n }\n }\n return false;\n}\n\nexport default (editor: Editor) => {\n editor.keystroke.setKeydown('space', event => {\n const selection = editor.selection;\n const range = selection.range;\n if (range.isBox) {\n return;\n }\n const point = getMarkdownPoint(editor);\n if (!point) {\n return;\n }\n if (executeMarkCommand(editor, point)) {\n event.preventDefault();\n return;\n }\n const block = range.getBlocks()[0];\n if (!block) {\n return;\n }\n if (!(block.isHeading || block.name === 'p')) {\n return;\n }\n if (spaceKeyExecutesBlockCommand(editor, point)) {\n event.preventDefault();\n }\n });\n editor.keystroke.setKeydown('enter', event => {\n const selection = editor.selection;\n const range = selection.range;\n if (range.isBox) {\n return;\n }\n const block = range.getBlocks()[0];\n if (!block) {\n return;\n }\n if (!(block.isHeading || block.name === 'p')) {\n return;\n }\n if (block.find('lake-box').length > 0) {\n return;\n }\n if (range.getRightText() !== '') {\n return;\n }\n if (enterKeyExecutesBlockCommand(editor, block)) {\n event.preventDefault();\n event.stopImmediatePropagation();\n // returning false is for unit test\n return false;\n }\n });\n};\n","import type { Editor } from '..';\nimport { query } from '../utils';\nimport { Nodes } from '../models/nodes';\n\nfunction splitBlock(editor: Editor, block: Nodes): void {\n const range = editor.selection.range;\n const rightText = range.getRightText();\n editor.selection.splitBlock();\n block = range.getBlocks()[0];\n if (!block) {\n editor.history.save();\n return;\n }\n if (rightText === '' && (block.isHeading || block.name === 'blockquote')) {\n editor.selection.setBlocks('<p />');\n editor.history.save();\n return;\n }\n if (block.isList && block.attr('type') === 'checklist') {\n block.find('li').attr('value', 'false');\n }\n}\n\nfunction addBlockOrSplitBlockForBox(editor: Editor): void {\n const range = editor.selection.range;\n const boxNode = range.startNode.closest('lake-box');\n const block = boxNode.closestBlock();\n if (block.length > 0 && !block.isContainer) {\n if (range.isBoxLeft) {\n range.setStartBefore(boxNode);\n range.collapseToStart();\n splitBlock(editor, block);\n } else if (range.isBoxRight) {\n range.setStartAfter(boxNode);\n range.collapseToStart();\n splitBlock(editor, block);\n } else {\n editor.removeBox();\n }\n return;\n }\n const newBlock = query('<p><br /></p>');\n if (range.isBoxLeft) {\n boxNode.before(newBlock);\n } else if (range.isBoxRight) {\n boxNode.after(newBlock);\n range.shrinkAfter(newBlock);\n } else {\n editor.removeBox();\n }\n}\n\nexport default (editor: Editor) => {\n editor.keystroke.setKeydown('enter', event => {\n const range = editor.selection.range;\n if (range.isInsideBox) {\n return;\n }\n event.preventDefault();\n editor.rectifyContent();\n if (range.isBox) {\n addBlockOrSplitBlockForBox(editor);\n editor.history.save();\n return;\n }\n range.adapt();\n if (range.isInoperative) {\n return;\n }\n if (range.isBox) {\n addBlockOrSplitBlockForBox(editor);\n editor.history.save();\n return;\n }\n let block = range.getBlocks()[0];\n if (!block) {\n editor.selection.setBlocks('<p />');\n block = range.getBlocks()[0];\n }\n if (block.isEmpty && block.name !== 'p') {\n editor.selection.setBlocks('<p />');\n editor.history.save();\n return;\n }\n splitBlock(editor, block);\n editor.history.save();\n });\n};\n","import type { Editor } from '..';\nimport { query } from '../utils';\n\nfunction addLineBreak(editor: Editor): void {\n const range = editor.selection.range;\n const block = range.startNode.closestBlock();\n if (block.length > 0 && !block.isContainer) {\n const prevNode = range.getPrevNode();\n const rightText = range.getRightText();\n if (prevNode.name !== 'br' && rightText === '') {\n editor.selection.insertContents('<br /><br />');\n editor.history.save();\n return;\n }\n }\n editor.selection.insertNode(query('<br />'));\n}\n\nfunction addBlockOrLineBreakForBox(editor: Editor): void {\n const range = editor.selection.range;\n const boxNode = range.startNode.closest('lake-box');\n const block = boxNode.closestBlock();\n if (block.length > 0 && !block.isContainer) {\n if (range.isBoxLeft) {\n range.setStartBefore(boxNode);\n range.collapseToStart();\n addLineBreak(editor);\n } else if (range.isBoxRight) {\n range.setStartAfter(boxNode);\n range.collapseToStart();\n addLineBreak(editor);\n } else {\n editor.removeBox();\n }\n return;\n }\n const newBlock = query('<p><br /></p>');\n if (range.isBoxLeft) {\n boxNode.before(newBlock);\n } else if (range.isBoxRight) {\n boxNode.after(newBlock);\n range.shrinkAfter(newBlock);\n } else {\n editor.removeBox();\n }\n}\n\nexport default (editor: Editor) => {\n editor.keystroke.setKeydown('shift+enter', event => {\n const range = editor.selection.range;\n if (range.isInsideBox) {\n return;\n }\n editor.rectifyContent();\n event.preventDefault();\n if (range.isBox) {\n addBlockOrLineBreakForBox(editor);\n editor.history.save();\n return;\n }\n range.adapt();\n if (range.isInoperative) {\n return;\n }\n if (range.isBox) {\n addBlockOrLineBreakForBox(editor);\n editor.history.save();\n return;\n }\n addLineBreak(editor);\n editor.history.save();\n });\n};\n","import type { Editor } from '..';\nimport { mergeNodes, setBlockIndent } from '../utils';\nimport { Nodes } from '../models/nodes';\nimport { Range } from '../models/range';\nimport { setBlocks } from '../operations/set-blocks';\n\nfunction mergeWithPreviousBlock(editor: Editor, block: Nodes): void {\n const range = editor.selection.range;\n let prevBlock = block.prev();\n if (prevBlock.length === 0) {\n if (block.name !== 'p') {\n editor.selection.setBlocks('<p />');\n }\n return;\n }\n if (prevBlock.isBox) {\n if (block.isEmpty) {\n block.remove();\n }\n range.selectBoxRight(prevBlock);\n return;\n }\n if (prevBlock.name === 'br') {\n prevBlock.remove();\n return;\n }\n if (!prevBlock.isBlock) {\n const prevRange = new Range();\n prevRange.selectNodeContents(prevBlock);\n setBlocks(prevRange, '<p />');\n prevBlock = prevRange.startNode.closestBlock();\n }\n if (prevBlock.isEmpty) {\n prevBlock.remove();\n return;\n }\n const bookmark = editor.selection.insertBookmark();\n mergeNodes(prevBlock, block);\n editor.selection.toBookmark(bookmark);\n editor.selection.fixList();\n}\n\nexport default (editor: Editor) => {\n editor.keystroke.setKeydown('backspace', event => {\n const range = editor.selection.range;\n if (range.isInsideBox) {\n return;\n }\n editor.rectifyContent();\n if (range.isBoxLeft) {\n const boxNode = range.startNode.closest('lake-box');\n const prevNode = boxNode.prev();\n if (prevNode.length === 0) {\n const block = boxNode.closestBlock();\n if (block.length > 0 && !block.isContainer) {\n event.preventDefault();\n mergeWithPreviousBlock(editor, block);\n editor.history.save();\n }\n return;\n }\n if (prevNode.isBlock) {\n if (prevNode.isEmpty) {\n event.preventDefault();\n prevNode.remove();\n editor.selection.fixList();\n editor.history.save();\n return;\n }\n event.preventDefault();\n range.shrinkAfter(prevNode);\n return;\n }\n range.adaptBox();\n }\n if (range.isBox) {\n event.preventDefault();\n editor.removeBox();\n editor.history.save();\n return;\n }\n if (!range.isCollapsed) {\n event.preventDefault();\n editor.selection.deleteContents();\n if (editor.container.html().trim() === '') {\n editor.setValue('<p><br /><focus /></p>');\n }\n editor.history.save();\n return;\n }\n range.adapt();\n const prevNode = range.getPrevNode();\n if (prevNode.isBox) {\n event.preventDefault();\n range.selectBox(prevNode);\n editor.removeBox();\n editor.history.save();\n return;\n }\n if (prevNode.name === 'br' && prevNode.prev().length > 0) {\n event.preventDefault();\n range.setStartBefore(prevNode);\n range.collapseToStart();\n prevNode.remove();\n editor.history.save();\n return;\n }\n const leftText = range.getLeftText();\n if (leftText === '') {\n event.preventDefault();\n let block = range.getBlocks()[0];\n if (!block) {\n editor.selection.setBlocks('<p />');\n block = range.getBlocks()[0];\n }\n if(\n block.css('margin-left') !== '' ||\n block.css('text-indent') !== '' ||\n block.attr('indent') !== ''\n ) {\n setBlockIndent(block, 'decrease');\n editor.history.save();\n return;\n }\n if (block.isList || block.name === 'blockquote') {\n editor.selection.setBlocks('<p />');\n editor.history.save();\n return;\n }\n mergeWithPreviousBlock(editor, block);\n editor.history.save();\n }\n });\n};\n","import type { Editor } from '..';\nimport { mergeNodes } from '../utils';\nimport { Nodes } from '../models/nodes';\nimport { Range } from '../models/range';\nimport { setBlocks } from '../operations/set-blocks';\n\nfunction mergeWithNextBlock(editor: Editor, block: Nodes): void {\n const range = editor.selection.range;\n let nextBlock = block.next();\n if (nextBlock.length === 0) {\n editor.history.save();\n return;\n }\n if (nextBlock.isBox) {\n if (block.isEmpty) {\n block.remove();\n }\n range.selectBoxLeft(nextBlock);\n editor.history.save();\n return;\n }\n if (!nextBlock.isBlock) {\n const nextRange = new Range();\n nextRange.selectNodeContents(nextBlock);\n setBlocks(nextRange, '<p />');\n nextBlock = nextBlock.closestBlock();\n }\n const bookmark = editor.selection.insertBookmark();\n mergeNodes(block, nextBlock);\n editor.selection.toBookmark(bookmark);\n editor.selection.fixList();\n}\n\nexport default (editor: Editor) => {\n editor.keystroke.setKeydown('delete', event => {\n const range = editor.selection.range;\n if (range.isInsideBox) {\n return;\n }\n editor.rectifyContent();\n if (range.isBoxRight) {\n const boxNode = range.startNode.closest('lake-box');\n const nextNode = boxNode.next();\n if (nextNode.length === 0) {\n const block = boxNode.closestBlock();\n if (block.length > 0 && !block.isContainer) {\n event.preventDefault();\n mergeWithNextBlock(editor, block);\n editor.history.save();\n }\n return;\n }\n if (nextNode.isBlock) {\n if (nextNode.isEmpty) {\n event.preventDefault();\n nextNode.remove();\n editor.selection.fixList();\n editor.history.save();\n return;\n }\n event.preventDefault();\n range.shrinkBefore(nextNode);\n return;\n }\n range.adaptBox();\n }\n if (range.isBox) {\n event.preventDefault();\n editor.removeBox();\n editor.history.save();\n return;\n }\n if (!range.isCollapsed) {\n event.preventDefault();\n editor.selection.deleteContents();\n if (editor.container.html().trim() === '') {\n editor.setValue('<p><br /><focus /></p>');\n }\n editor.history.save();\n return;\n }\n range.adapt();\n const nextNode = range.getNextNode();\n if (nextNode.isBox) {\n event.preventDefault();\n range.selectBox(nextNode);\n editor.removeBox();\n editor.history.save();\n return;\n }\n if (nextNode.name === 'br' && nextNode.next().length > 0) {\n event.preventDefault();\n range.setStartBefore(nextNode);\n range.collapseToStart();\n nextNode.remove();\n editor.history.save();\n }\n const rightText = range.getRightText();\n if (rightText === '') {\n event.preventDefault();\n let block = range.getBlocks()[0];\n if (!block) {\n editor.selection.setBlocks('<p />');\n block = range.getBlocks()[0];\n }\n mergeWithNextBlock(editor, block);\n editor.history.save();\n }\n });\n};\n","import './css';\nimport './elements/box';\nimport './elements/bookmark';\nimport { BoxComponent } from './types/box';\nimport { ToolbarItem } from './types/toolbar';\nimport { icons } from './icons';\nimport * as Utils from './utils';\nimport { Nodes } from './models/nodes';\nimport { Fragment } from './models/fragment';\nimport { Range } from './models/range';\nimport { Box } from './models/box';\nimport { HTMLParser } from './parsers/html-parser';\nimport { TextParser } from './parsers/text-parser';\nimport { insertBookmark } from './operations/insert-bookmark';\nimport { toBookmark } from './operations/to-bookmark';\nimport { insertNode } from './operations/insert-node';\nimport { insertFragment} from './operations/insert-fragment';\nimport { insertContents} from './operations/insert-contents';\nimport { deleteContents} from './operations/delete-contents';\nimport { setBlocks} from './operations/set-blocks';\nimport { splitBlock} from './operations/split-block';\nimport { splitMarks} from './operations/split-marks';\nimport { addMark} from './operations/add-mark';\nimport { removeMark} from './operations/remove-mark';\nimport { fixList} from './operations/fix-list';\nimport { insertLink } from './operations/insert-link';\nimport { Button } from './ui/button';\nimport { Dropdown } from './ui/dropdown';\nimport { Editor } from './editor';\nimport { Toolbar } from './ui/toolbar';\nimport { hrBox } from './boxes/hr';\nimport { imageBox } from './boxes/image';\nimport { codeBlockBox } from './boxes/code-block';\nimport copy from './plugins/copy';\nimport cut from './plugins/cut';\nimport paste from './plugins/paste';\nimport undo from './plugins/undo';\nimport redo from './plugins/redo';\nimport selectAll from './plugins/select-all';\nimport heading from './plugins/heading';\nimport blockQuote from './plugins/block-quote';\nimport list from './plugins/list';\nimport align from './plugins/align';\nimport indent from './plugins/indent';\nimport bold from './plugins/bold';\nimport italic from './plugins/italic';\nimport underline from './plugins/underline';\nimport strikethrough from './plugins/strikethrough';\nimport subscript from './plugins/subscript';\nimport superscript from './plugins/superscript';\nimport code from './plugins/code';\nimport fontFamily from './plugins/font-family';\nimport fontSize from './plugins/font-size';\nimport fontColor from './plugins/font-color';\nimport highlight from './plugins/highlight';\nimport removeFormat from './plugins/remove-format';\nimport formatPainter from './plugins/format-painter';\nimport link from './plugins/link';\nimport hr from './plugins/hr';\nimport image from './plugins/image';\nimport codeBlock from './plugins/code-block';\nimport markdown from './plugins/markdown';\nimport enterKey from './plugins/enter-key';\nimport shiftEnterKey from './plugins/shift-enter-key';\nimport backspaceKey from './plugins/backspace-key';\nimport deleteKey from './plugins/delete-key';\nimport tabKey from './plugins/tab-key';\nimport arrowKeys from './plugins/arrow-keys';\n\nEditor.box.add(hrBox);\nEditor.box.add(imageBox);\nEditor.box.add(codeBlockBox);\n\nEditor.plugin.add(copy);\nEditor.plugin.add(cut);\nEditor.plugin.add(paste);\nEditor.plugin.add(undo);\nEditor.plugin.add(redo);\nEditor.plugin.add(selectAll);\nEditor.plugin.add(heading);\nEditor.plugin.add(blockQuote);\nEditor.plugin.add(list);\nEditor.plugin.add(align);\nEditor.plugin.add(indent);\nEditor.plugin.add(bold);\nEditor.plugin.add(italic);\nEditor.plugin.add(underline);\nEditor.plugin.add(strikethrough);\nEditor.plugin.add(subscript);\nEditor.plugin.add(superscript);\nEditor.plugin.add(code);\nEditor.plugin.add(fontFamily);\nEditor.plugin.add(fontSize);\nEditor.plugin.add(fontColor);\nEditor.plugin.add(highlight);\nEditor.plugin.add(removeFormat);\nEditor.plugin.add(formatPainter);\nEditor.plugin.add(link);\nEditor.plugin.add(hr);\nEditor.plugin.add(image);\nEditor.plugin.add(codeBlock);\nEditor.plugin.add(markdown);\nEditor.plugin.add(enterKey);\nEditor.plugin.add(shiftEnterKey);\nEditor.plugin.add(backspaceKey);\nEditor.plugin.add(deleteKey);\nEditor.plugin.add(tabKey);\nEditor.plugin.add(arrowKeys);\n\nexport {\n Editor,\n Toolbar,\n ToolbarItem,\n BoxComponent,\n icons,\n Utils,\n Nodes,\n Fragment,\n Range,\n Box,\n HTMLParser,\n TextParser,\n insertBookmark,\n toBookmark,\n insertNode,\n insertFragment,\n insertContents,\n deleteContents,\n setBlocks,\n splitBlock,\n splitMarks,\n addMark,\n removeMark,\n fixList,\n insertLink,\n Button,\n Dropdown,\n};\n","import type { BoxComponent } from '..';\n\nexport const hrBox: BoxComponent = {\n type: 'block',\n name: 'hr',\n render: box => {\n const editor = box.getEditor();\n if (!editor) {\n return;\n }\n box.useEffect(() => {\n const hrNode = box.getContainer().find('.lake-hr');\n hrNode.on('click', () => {\n editor.selection.range.selectBox(box.node);\n });\n });\n return '<div class=\"lake-hr\"><hr /></div>';\n },\n html: () => '<hr />',\n};\n","import type { Editor } from '..';\nimport { Box } from '../models/box';\n\nexport default (editor: Editor) => {\n editor.container.on('copy', event => {\n const range = editor.selection.range;\n if (range.isInsideBox) {\n return;\n }\n const boxNode = range.startNode.closest('lake-box');\n if (boxNode.length === 0) {\n return;\n }\n if (range.isBoxLeft || range.isBoxRight) {\n return;\n }\n event.preventDefault();\n const dataTransfer = (event as ClipboardEvent).clipboardData;\n if (!dataTransfer) {\n return;\n }\n const box = new Box(boxNode);\n const content = box.getHTML();\n dataTransfer.setData('text/html', content);\n });\n};\n","import type { Editor } from '..';\nimport { Box } from '../models/box';\n\nexport default (editor: Editor) => {\n editor.container.on('cut', event => {\n const range = editor.selection.range;\n if (range.isInsideBox) {\n return;\n }\n const boxNode = range.startNode.closest('lake-box');\n if (boxNode.length === 0) {\n return;\n }\n if (range.isBoxLeft || range.isBoxRight) {\n return;\n }\n event.preventDefault();\n const dataTransfer = (event as ClipboardEvent).clipboardData;\n if (!dataTransfer) {\n return;\n }\n const box = new Box(boxNode);\n const content = box.getHTML();\n dataTransfer.setData('text/html', content);\n editor.removeBox();\n editor.history.save();\n });\n};\n","import type { Editor } from '..';\n\nexport default (editor: Editor) => {\n editor.command.add('undo', {\n execute: () => {\n editor.history.undo();\n },\n });\n editor.keystroke.setKeydown('mod+z', event => {\n const range = editor.selection.range;\n if (range.isInsideBox) {\n return;\n }\n event.preventDefault();\n editor.command.execute('undo');\n });\n};\n","import type { Editor } from '..';\n\nexport default (editor: Editor) => {\n editor.command.add('redo', {\n execute: () => {\n editor.history.redo();\n },\n });\n const redoHandler = (event: Event) => {\n const range = editor.selection.range;\n if (range.isInsideBox) {\n return;\n }\n event.preventDefault();\n editor.command.execute('redo');\n };\n editor.keystroke.setKeydown('mod+y', redoHandler);\n editor.keystroke.setKeydown('mod+shift+z', redoHandler);\n};\n","import type { Editor } from '..';\n\nexport default (editor: Editor) => {\n editor.command.add('selectAll', {\n execute: () => {\n const range = editor.selection.range;\n range.selectNodeContents(editor.container);\n range.shrink();\n },\n });\n};\n","import type { Editor } from '..';\n\nexport default (editor: Editor) => {\n editor.command.add('heading', {\n selectedValues: appliedItems => {\n const currentItem = appliedItems.find(item => item.node.isHeading || item.name === 'p');\n return currentItem ? [currentItem.name] : [];\n },\n execute: (type: string) => {\n editor.selection.setBlocks(`<${type} />`);\n editor.history.save();\n },\n });\n};\n","import type { Editor } from '..';\n\nexport default (editor: Editor) => {\n editor.command.add('blockQuote', {\n isSelected: appliedItems => !!appliedItems.find(item => item.name === 'blockquote'),\n execute: () => {\n editor.selection.setBlocks('<blockquote />');\n editor.history.save();\n },\n });\n};\n","import type { Editor } from '..';\nimport { setBlockIndent } from '../utils';\n\nexport default (editor: Editor) => {\n editor.command.add('indent', {\n execute: (type: 'increase' | 'decrease') => {\n const blocks = editor.selection.range.getBlocks();\n for (const block of blocks) {\n setBlockIndent(block, type);\n }\n editor.history.save();\n },\n });\n};\n","import type { Editor } from '..';\n\nconst tagName = 'i';\n\nexport default (editor: Editor) => {\n editor.command.add('italic', {\n isSelected: appliedItems => !!appliedItems.find(item => item.name === tagName),\n execute: () => {\n if (editor.command.isSelected('italic')) {\n editor.selection.removeMark(`<${tagName} />`);\n } else {\n editor.selection.addMark(`<${tagName} />`);\n }\n editor.history.save();\n },\n });\n editor.keystroke.setKeydown('mod+i', event => {\n event.preventDefault();\n editor.command.execute('italic');\n });\n};\n","import type { Editor } from '..';\n\nconst tagName = 'u';\n\nexport default (editor: Editor) => {\n editor.command.add('underline', {\n isSelected: appliedItems => !!appliedItems.find(item => item.name === tagName),\n execute: () => {\n if (editor.command.isSelected('underline')) {\n editor.selection.removeMark(`<${tagName} />`);\n } else {\n editor.selection.addMark(`<${tagName} />`);\n }\n editor.history.save();\n },\n });\n editor.keystroke.setKeydown('mod+u', event => {\n event.preventDefault();\n editor.command.execute('underline');\n });\n};\n","import type { Editor } from '..';\n\nconst tagName = 's';\n\nexport default (editor: Editor) => {\n editor.command.add('strikethrough', {\n isSelected: appliedItems => !!appliedItems.find(item => item.name === tagName),\n execute: () => {\n if (editor.command.isSelected('strikethrough')) {\n editor.selection.removeMark(`<${tagName} />`);\n } else {\n editor.selection.addMark(`<${tagName} />`);\n }\n editor.history.save();\n },\n });\n editor.keystroke.setKeydown('mod+shift+x', event => {\n event.preventDefault();\n editor.command.execute('strikethrough');\n });\n};\n","import type { Editor } from '..';\n\nexport default (editor: Editor) => {\n editor.command.add('fontFamily', {\n selectedValues: appliedItems => {\n for (const item of appliedItems) {\n if (item.name === 'span') {\n const currentValue = item.node.css('font-family');\n return [currentValue.replace(/['\"]/g, '')];\n }\n }\n return [];\n },\n execute: (value: string) => {\n editor.selection.addMark(`<span style=\"font-family: ${value};\" />`);\n editor.history.save();\n },\n });\n};\n","import type { Editor } from '..';\n\nexport default (editor: Editor) => {\n editor.command.add('fontSize', {\n isDisabled: appliedItems => !!appliedItems.find(item => item.node.isHeading),\n selectedValues: appliedItems => {\n for (const item of appliedItems) {\n if (item.name === 'span') {\n const currentValue = item.node.css('font-size');\n return [currentValue.replace(/\\.\\d+/, '')];\n }\n }\n return [];\n },\n execute: (value: string) => {\n editor.selection.addMark(`<span style=\"font-size: ${value};\" />`);\n editor.history.save();\n },\n });\n};\n","import type { Editor } from '..';\nimport { toHex } from '../utils';\n\nexport default (editor: Editor) => {\n editor.command.add('fontColor', {\n selectedValues: appliedItems => {\n for (const item of appliedItems) {\n if (item.name === 'span') {\n const currentValue = item.node.computedCSS('color');\n return [toHex(currentValue)];\n }\n }\n return [];\n },\n execute: (value: string) => {\n editor.selection.addMark(`<span style=\"color: ${value};\" />`);\n editor.history.save();\n },\n });\n};\n","import type { Editor } from '..';\nimport { toHex } from '../utils';\n\nexport default (editor: Editor) => {\n editor.command.add('highlight', {\n selectedValues: appliedItems => {\n for (const item of appliedItems) {\n if (item.name === 'span') {\n const currentValue = item.node.computedCSS('background-color');\n return [toHex(currentValue)];\n }\n }\n return [];\n },\n execute: (value: string) => {\n editor.selection.addMark(`<span style=\"background-color: ${value};\" />`);\n editor.history.save();\n },\n });\n};\n","import type { Editor } from '..';\n\nexport default (editor: Editor) => {\n editor.command.add('removeFormat', {\n execute: () => {\n editor.selection.removeMark();\n editor.history.save();\n },\n });\n};\n","import { type Editor } from '..';\nimport { Nodes } from '../models/nodes';\nimport { LinkPopup } from '../ui/link-popup';\nimport { locale } from '../i18n';\n\nexport default (editor: Editor) => {\n const popup = new LinkPopup(editor.popupContainer);\n popup.event.on('save', () => {\n editor.history.save();\n });\n popup.event.on('remove', () => {\n editor.history.save();\n });\n editor.root.on('scroll', () => {\n popup.updatePosition();\n });\n editor.event.on('resize', () => {\n popup.updatePosition();\n });\n editor.event.on('click', (targetNode: Nodes) => {\n if (targetNode.closest('button[name=\"link\"]').length > 0) {\n return;\n }\n const linkNode = targetNode.closest('a');\n if (linkNode.length === 0) {\n popup.hide();\n return;\n }\n if (\n linkNode.isOutside ||\n linkNode.closest('lake-box').length > 0\n ) {\n return;\n }\n popup.show(linkNode);\n });\n editor.command.add('link', {\n execute: () => {\n const linkNode = editor.selection.insertLink(`<a href=\"\">${locale.link.newLink()}</a>`);\n if (!linkNode) {\n return;\n }\n editor.history.save();\n popup.show(linkNode);\n },\n });\n};\n","import type { Editor } from '..';\nimport { query } from '../utils';\nimport { Fragment } from '../models/fragment';\nimport { Box } from '../models/box';\n\nexport default (editor: Editor) => {\n editor.event.on('beforepaste', (nativeFragment: DocumentFragment) => {\n const fragment = new Fragment(nativeFragment);\n fragment.find('hr').each(nativeNode => {\n const node = query(nativeNode);\n const box = new Box('hr');\n node.replaceWith(box.node);\n });\n });\n editor.command.add('hr', {\n execute: () => {\n editor.insertBox('hr');\n editor.history.save();\n },\n });\n};\n","import type { Editor } from '..';\nimport { BoxValue } from '../types/box';\nimport { query } from '../utils';\nimport { Box } from '../models/box';\nimport { Fragment } from '../models/fragment';\n\nexport default (editor: Editor) => {\n editor.event.on('beforepaste', (nativeFragment: DocumentFragment) => {\n const fragment = new Fragment(nativeFragment);\n fragment.find('img').each(nativeNode => {\n const node = query(nativeNode);\n const box = new Box('image');\n const value = node.attr('data-lake-value');\n if (value === '') {\n box.value = {\n url: node.attr('src'),\n status: 'done',\n };\n } else {\n box.node.attr('value', value);\n }\n node.replaceWith(box.node);\n });\n });\n editor.command.add('image', {\n execute: (value: BoxValue) => {\n editor.insertBox('image', value);\n editor.history.save();\n },\n });\n};\n","import { type Editor } from '..';\nimport { BoxValue } from '../types/box';\n\nexport default (editor: Editor) => {\n editor.command.add('codeBlock', {\n execute: (value: BoxValue) => {\n const box = editor.insertBox('codeBlock', value);\n editor.history.save();\n const codeEditor = box.getData('codeEditor');\n codeEditor.focus();\n },\n });\n};\n","import type { Editor } from '..';\nimport { setBlockIndent } from '../utils';\n\nexport default (editor: Editor) => {\n editor.keystroke.setKeydown('tab', event => {\n if (editor.config.indentWithTab === false) {\n return;\n }\n event.preventDefault();\n const blocks = editor.selection.range.getBlocks();\n blocks.forEach(block => {\n if (block.name !== 'p' || block.css('text-indent') === '2em') {\n setBlockIndent(block, 'increase');\n return;\n }\n block.css('text-indent', '2em');\n });\n editor.history.save();\n });\n};\n","import type { Editor } from '..';\n\nexport default (editor: Editor) => {\n editor.keystroke.setKeydown('arrow-left', event => {\n const range = editor.selection.range;\n if (range.isInsideBox) {\n return;\n }\n const boxNode = range.commonAncestor.closest('lake-box');\n if (boxNode.length > 0) {\n if (range.isBoxLeft) {\n const prevNode = boxNode.prev();\n if (prevNode.isBlock || prevNode.isBox) {\n event.preventDefault();\n if (prevNode.isInlineBox) {\n range.selectBox(prevNode);\n return;\n }\n range.shrinkAfter(prevNode);\n return;\n }\n range.setStartBefore(boxNode);\n range.collapseToStart();\n return;\n }\n if (range.isBoxRight) {\n event.preventDefault();\n range.selectBox(boxNode);\n return;\n }\n event.preventDefault();\n range.selectBoxLeft(boxNode);\n return;\n }\n if (!range.isCollapsed) {\n return;\n }\n const prevNode = range.getPrevNode();\n if (prevNode.isBox) {\n event.preventDefault();\n range.selectBox(prevNode);\n }\n });\n editor.keystroke.setKeydown('arrow-right', event => {\n const range = editor.selection.range;\n if (range.isInsideBox) {\n return;\n }\n const boxNode = range.commonAncestor.closest('lake-box');\n if (boxNode.length > 0) {\n if (range.isBoxLeft) {\n event.preventDefault();\n range.selectBox(boxNode);\n return;\n }\n if (range.isBoxRight) {\n const nextNode = boxNode.next();\n if (nextNode.isBlock || nextNode.isBox) {\n event.preventDefault();\n if (nextNode.isInlineBox) {\n range.selectBox(nextNode);\n return;\n }\n range.shrinkBefore(nextNode);\n return;\n }\n range.setStartAfter(boxNode);\n range.collapseToStart();\n return;\n }\n event.preventDefault();\n range.selectBoxRight(boxNode);\n return;\n }\n if (!range.isCollapsed) {\n return;\n }\n const nextNode = range.getNextNode();\n if (nextNode.isBox) {\n event.preventDefault();\n range.selectBox(nextNode);\n }\n });\n editor.keystroke.setKeydown('arrow-up', event => {\n const range = editor.selection.range;\n if (range.isInsideBox) {\n return;\n }\n const boxNode = range.commonAncestor.closest('lake-box');\n if (boxNode.length > 0) {\n if (boxNode.isBlockBox) {\n const prevNode = boxNode.prev();\n if (prevNode.isBlock || prevNode.isBox) {\n event.preventDefault();\n range.shrinkAfter(prevNode);\n return;\n }\n }\n range.setStartBefore(boxNode);\n range.collapseToStart();\n }\n });\n editor.keystroke.setKeydown('arrow-down', event => {\n const range = editor.selection.range;\n if (range.isInsideBox) {\n return;\n }\n const boxNode = range.commonAncestor.closest('lake-box');\n if (boxNode.length > 0) {\n if (boxNode.isBlockBox) {\n const nextNode = boxNode.next();\n if (nextNode.isBlock || nextNode.isBox) {\n event.preventDefault();\n range.shrinkBefore(nextNode);\n return;\n }\n }\n range.setStartAfter(boxNode);\n range.collapseToStart();\n }\n });\n};\n"],"names":["BoxElement","HTMLElement","customElements","define","BookmarkElement","icons","Map","template","strings","keys","content","i","length","String","replace","characterMap","encode","value","match","_a","get","safeTemplate","camelCase","valueList","split","camelString","forEach","val","index","charAt","toUpperCase","substring","inString","string","delimiter","undefined","indexOf","hex","hexString","Number","parseInt","toString","toLowerCase","toHex","p1","p2","p3","p4","Math","round","parseFloat","alphaToHex","parseStyle","styleValue","properties","re","result","exec","key","trim","normalizeValue","denormalizeValue","modifierText","userAgent","modText","navigator","map","callback","getCSS","element","propertyName","camelPropertyName","computedStyle","window","getComputedStyle","style","getPropertyValue","toNodeList","valueType","nodeList","push","textNode","document","createTextNode","test","container","createElement","innerHTML","child","childNodes","elements","querySelectorAll","NativeNode","Node","blockTagNames","Set","markTagNames","voidTagNames","headingTagNames","listTagNames","tableTagNames","debug","data","LAKE_DEBUG","console","log","apply","eventData","lastNodeId","Nodes","constructor","node","this","Array","isArray","lakeId","id","name","nodeName","isElement","nodeType","ELEMENT_NODE","isText","TEXT_NODE","isBlock","has","isMark","isVoid","isHeading","isList","isTable","isBookmark","isBox","isInlineBox","attr","isBlockBox","isContainer","getAttribute","isOutside","closest","isInside","isTopInside","parentNode","parent","isContentEditable","isIndivisible","isEmpty","nodeText","text","isEmptyText","find","isSibling","target","getAll","eq","each","nodes","eachElement","reverse","matches","selector","from","children","closestBlock","closestOperableBlock","boxNode","block","parentBlock","closestContainer","prev","previousSibling","next","nextSibling","first","firstChild","last","lastChild","sibling","path","childList","getWalker","iterate","nextNode","on","type","listener","addEventListener","elementId","off","eventItems","item","removeEventListener","filter","emit","event","Event","getEventListeners","focus","blur","clone","deep","cloneNode","hasAttr","attributeName","hasAttribute","setAttribute","removeAttr","removeAttribute","hasClass","className","addClass","classList","add","removeClass","remove","computedCSS","css","width","offsetWidth","innerWidth","paddingLeft","paddingRight","height","offsetHeight","show","displayType","hide","html","nodeValue","innerText","outerHTML","empty","prepend","insertBefore","appendChild","append","before","after","replaceWith","newContent","replaceChild","keepChildren","removeChild","splitText","offset","newNode","query","Range","range","createRange","startNode","startContainer","startOffset","endNode","endContainer","endOffset","commonAncestor","commonAncestorContainer","isCollapsed","collapsed","isBoxLeft","boxContainer","compareBeforeNode","isBoxCenter","isBoxRight","compareAfterNode","isInsideBox","isInoperative","startBlock","endBlock","comparePoint","targetRange","setStart","setStartBefore","collapseToStart","setStartAfter","intersectsNode","setEnd","setEndBefore","setEndAfter","collapse","collapseToEnd","selectNode","selectNodeContents","selectBox","Error","selectBoxLeft","boxStrip","selectBoxRight","shrinkBefore","shrinkAfter","shrink","adaptBox","startBoxNode","startRange","endBoxNode","endRange","adaptTable","startTable","endTable","adaptBlock","nextBlock","adapt","getPrevNode","prevNode","getNextNode","getBoxes","startBox","clonedRange","getBlocks","blocks","getMarks","hasText","marks","stratRange","getLeftText","leftRange","cloneContents","getRightText","rightRange","cloneRange","splitNodes","limitNode","leftPart","left","right","appendDeepest","removeBr","getAfterPoint","mergeNodes","otherNode","originalOtherNode","list","nextOtherNode","isEqualNode","getDeepest","wrapNodeList","wrapper","deepestElement","removeZWS","changeTagName","newTagName","nativeElement","newElement","attributes","fixNumberedList","firstBlock","lastBlock","targetBlocks","currentStart","expectedStart","setBlockIndent","indent","EMPTY_SET","noOp","defaults","morphStyle","callbacks","beforeNodeAdded","afterNodeAdded","beforeNodeMorphed","afterNodeMorphed","beforeNodeRemoved","afterNodeRemoved","beforeAttributeUpdated","afterAttributeUpdated","beforeChildrenUpdated","head","shouldPreserve","elt","shouldReAppend","shouldRemove","afterHeadMorphed","isIdInConsideration","ctx","deadIds","idIsWithinNode","targetNode","idMap","removeIdsFromConsideration","idSet","getIdIntersectionCount","node1","node2","sourceSet","matchCount","populateIdMapForNode","nodeParent","parentElement","idElements","current","set","createIdMap","oldContent","createMorphContext","oldNode","config","finalConfig","Object","assign","mergeDefaults","ignoreActive","ignoreActiveValue","isIdSetMatch","tagName","isSoftMatch","removeNode","tempNode","removeNodesBetween","startInclusive","endExclusive","start","findIdSetMatch","oldParent","newChild","insertionPoint","newChildPotentialIdCount","potentialMatch","otherMatchCount","findSoftMatch","potentialSoftMatch","siblingSoftMatchCount","scoreElement","ignoreAttribute","to","updateType","activeElement","morphOldNodeTo","fromAttributes","toAttributes","fromAttribute","toAttribute","syncNodeFrom","possibleActiveElement","ignoreValueOfActiveElement","morphChildren","newParent","nextNewChild","idSetMatch","softMatch","morphNormalizedContent","normalizedNewContent","bestMatch","currentElement","bestElement","score","newScore","findBestNodeMatch","morphedNode","stack","added","pop","_b","insertSiblings","morph","normalizedContent","generatedByIdiomorph","dummyParent","normalizeContent","getBody","xhr","responseText","response","JSON","parse","e","request","option","XMLHttpRequest","onProgress","upload","onprogress","total","percent","loaded","formData","FormData","filename","file","Blob","onerror","onError","onload","status","msg","method","action","err","url","getError","onSuccess","open","withCredentials","headers","setRequestHeader","h","send","Fragment","fragment","createDocumentFragment","nativeNode","_hasBuffer","Buffer","_TD","TextDecoder","_TE","TextEncoder","b64chs","prototype","slice","call","b64tab","a","tab","c","b64re","_fromCC","fromCharCode","bind","_U8Afrom","Uint8Array","it","_mkUriSafe","src","m0","_tidyB64","s","btoaPolyfill","bin","u32","c0","c1","c2","asc","pad","charCodeAt","TypeError","_btoa","btoa","_fromUint8Array","u8a","strs","l","subarray","join","cb_utob","cc","re_utob","utob","u","_encode","urlsafe","re_btou","cb_btou","cccc","btou","b","atobPolyfill","u24","r1","r2","_atob","atob","_toUint8Array","_decode","decode","_unURI","gBase64","hasOwnProperty","prefix","Events","EE","fn","context","once","addListener","emitter","evt","_events","_eventsCount","clearEvent","EventEmitter","create","__proto__","eventNames","events","names","getOwnPropertySymbols","concat","listeners","handlers","ee","listenerCount","a1","a2","a3","a4","a5","args","len","arguments","removeListener","j","removeAllListeners","prefixed","module","exports","boxes","editors","boxData","effectData","framework","Box","component","setup","cleanup","addFramework","getContainer","Base64","stringify","updateValue","valueKey","valueValue","getData","setData","getEditor","useEffect","render","newContainer","unmount","getHTML","blockAttributeRules","class","getElementRules","h1","h2","h3","h4","h5","h6","p","blockquote","ul","ol","li","table","border","tr","th","td","colspan","rowspan","br","hr","img","alt","span","color","strong","em","sub","sup","code","href","rel","download","HTMLParser","rules","source","parseHTML","doc","DOMParser","parseFromString","querySelector","matchRule","rule","RegExp","getOpenTagString","attributeRules","hasAttributes","attributeMap","styleRules","styleMap","openTag","attrName","attrValue","styleString","styleName","getClosedTagString","getTrimmedText","prevSibling","closedTag","getNodeList","getFragment","body","TextParser","insertNode","nativeRange","insertBookmark","anchor","removeAndNormalizeNode","previousNode","normalize","zeroWidthSpace","toBookmark","bookmark","box","focusValue","anchorRange","fixList","deleteContents","noMerge","prevBlock","insertFragment","insertContents","setBlocks","blockList","valueNode","deepestBlock","nonBlockNodes","isBeforeRange","getTopNonBlockNodes","splitBlock","limitBlock","parts","removeEmptyMarks","splitMarksAtPoint","removeEmptyMark","splitMarks","center","startParts","endParts","getUpperMark","nextParent","addMark","cssProperties","newBlock","newMark","copyNestedMarks","removePreviousOrNextZWS","upperMark","newValueNode","removeMark","mark","insertLink","linkNode","Button","root","tabIndex","buttonNode","tooltip","icon","preventDefault","onClick","Dropdown","documentClickListener","titleNode","menuNode","menuType","getValue","setValue","getMenuMap","menuItems","menuMap","menuItem","updateColorAccent","svgNode","lineNode","apppendMenuItems","listNode","menuIconNode","checkIcon","checkNode","showMenu","dropdownNode","currentValues","getBoundingClientRect","x","bindEvents","iconNode","downIconNode","defaultValue","onSelect","listItem","downIcon","accentIcon","isObject_1","freeGlobal","global","freeSelf","self","Function","now_1","Date","now","reWhitespace","_trimmedEndIndex","trimmedEndIndex","require$$0","reTrimStart","_baseTrim","_Symbol","Symbol","objectProto","nativeObjectToString","symToStringTag","toStringTag","_getRawTag","isOwn","tag","unmasked","getRawTag","require$$1","objectToString","baseGetTag","isObjectLike","baseTrim","isObject","isSymbol","reIsBadHex","reIsBinary","reIsOctal","freeParseInt","toNumber","other","valueOf","isBinary","nativeMax","max","nativeMin","min","debounce_1","func","wait","options","lastArgs","lastThis","maxWait","timerId","lastCallTime","lastInvokeTime","leading","maxing","trailing","invokeFunc","time","thisArg","shouldInvoke","timeSinceLastCall","timerExpired","trailingEdge","setTimeout","timeWaiting","remainingWait","debounced","isInvoking","leadingEdge","clearTimeout","cancel","flush","getAttributes","Selection","selection","getSelection","getRangeFromNativeSelection","rangeCount","getRangeAt","addRangeToNativeSelection","removeAllRanges","addRange","syncByRange","newRange","synByBookmark","boxFocus","getAppliedItems","appliedItems","styles","pushAncestralNodes","pushNextNestedNodes","Command","commandMap","handler","getNames","getItem","commandItem","isDisabled","isSelected","selectedValues","execute","$","safeAdd","y","lsw","md5cmn","q","t","num","cnt","md5ff","d","md5gg","md5hh","md5ii","binlMD5","olda","oldb","oldc","oldd","binl2rstr","input","output","length32","rstr2binl","length8","rstr2hex","hexTab","str2rstrUTF8","unescape","encodeURIComponent","rawMD5","rstrMD5","rawHMACMD5","k","hash","bkey","ipad","opad","rstrHMACMD5","md5","raw","boxInstances","History","canSave","limit","removeBookmark","addIdToBoxes","removeIdfromBoxes","morphContainer","sourceItem","instanceMap","delete","otherContainer","cloneContainer","startNodePath","endNodePath","newStartNode","newEndNode","count","canUndo","canRedo","undo","prevItem","prevValue","redo","nextItem","nextValue","pause","save","splice","Infinity","shift","platform","n","r","o","getModifierState","includes","timeout","f","KeyboardEvent","clear","shortenedTypeMap","Keystroke","keydownEventList","keyupEventList","normalizeType","setKeydown","createKeybindingsHandler","setKeyup","keydown","keyup","defaultConfig","readonly","spellcheck","indentWithTab","minChangeSize","imageRequestMethod","imageRequestAction","imageRequestTypes","Editor","unsavedInputData","isComposing","beforeunloadListener","commitUnsavedInputData","selectionchangeListener","updateBoxSelectionStyle","emitStateChangeEvent","clickListener","resizeListener","debounce","findAll","commandNames","command","disabledNameMap","selectedNameMap","selectedValuesMap","values","emitChangeEvent","rectifyContent","containerWrapper","overlayContainer","popupContainer","contenteditable","tabindex","history","keystroke","inputInBoxStrip","stripNode","paragraph","bindInputEvents","inputEvent","inputType","bindHistoryEvents","renderAll","rectifyInstances","bindFocusEvents","prepareOperation","commitOperation","continue","insertBox","boxName","boxValue","getInstances","removeBox","plugin","loadAll","version","editor","isConnected","boxNativeNode","pluginList","REGEX_SWITCH_CASE","REGEX_BRACKETS_SPLIT","removeOuterBrackets","parseRawText","rawText","optimize","firstKey","lastKey","part","startsWith","lastAccessor","entries","zero","one","two","few","many","rest","nrOfEntries","entry","z","m","parsePluralPart","parsedPart","keyPart","formatterKeys","keyWithoutType","isOptional","parseArgumentPart","trimmed","fromEntries","v","trimAllValues","object","Boolean","applyFormatters","formatters","initialValue","reduce","formatterKey","cases","accumulator","REGEX_PLURAL_VALUE_INJECTION","translate","textParts","pluralRules","firstArg","isBasicPluralPart","select","getPlural","formattedValue","applyArguments","getTranslateInstance","locale","cache","Intl","PluralRules","getPartsFromString","wrap","proxyObject","translateFn","defineProperty","writable","createProxy","Proxy","iterator","localeTranslations","toolbar","selectAll","blockQuote","numberedList","bulletedList","checklist","alignLeft","alignCenter","alignRight","alignJustify","increaseIndent","decreaseIndent","bold","italic","underline","strikethrough","superscript","subscript","removeFormat","formatPainter","link","codeBlock","heading","heading1","heading2","heading3","heading4","heading5","heading6","align","fontFamily","fontSize","moreStyle","fontColor","highlight","image","removeColor","newLink","title","copy","unlink","view","previous","close","loadingError","zoomOut","zoomIn","langType","ja","ko","locales","loadedLocales","loadedFormatters","loadLocale","loadFormatters","translations","initI18nObject","i18nObject","LAKE_LANGUAGE","headingMenuItems","listMenuItems","alignMenuItems","indentMenuItems","moreStyleMenuItems","colors","colorMenuItems","tagPluginNameMap","toolbarItems","accept","multiple","uploadImage","URL","createObjectURL","size","lastModified","percentNode","error","defaultItems","toolbarItemMap","__awaiter","_arguments","P","generator","Promise","resolve","reject","fulfilled","step","rejected","done","then","appendToEl","el","setWidthHeight","w","SuppressedError","LOAD_STATE","getElementsFromOption","legacySelector","Element","NodeList","isSafari","vendor","PhotoSwipeEvent$1","details","defaultPrevented","Eventable$1","_listeners","_filters","pswp","addFilter","priority","_this$_filters$name","_this$_filters$name2","_this$pswp","sort","f1","f2","removeFilter","applyFilters","_this$_filters$name3","_this$_listeners$name","_this$pswp2","_this$pswp3","dispatch","_this$_listeners$name2","PhotoSwipeEvent","Placeholder$1","imageSrc","imgEl","decoding","setDisplayedSize","transformOrigin","transform","scale","propValue","toTransformString","destroy","_this$element","Content$1","itemData","instance","placeholder","slide","displayedImageWidth","displayedImageHeight","isAttached","hasSlide","isDecoding","state","removePlaceholder","keepPlaceholder","load","isLazy","reload","usePlaceholder","placeholderEl","placeholderSrc","msrc","isFirstSlide","Placeholder","isImageContent","loadImage","updateContentSize","_this$data$src","_this$data$alt","imageElement","updateSrcsetSizes","srcset","complete","onLoaded","setSlide","isActive","heavyAppended","displayError","isError","isLoading","isInitialSizeUpdate","isZoomable","sizesWidth","dataset","largestUsedSize","sizes","lazyLoad","_this$instance$option","_this$instance$option2","errorMsgEl","errorMsg","supportsDecode","catch","finally","appendImage","activate","holderElement","deactivate","parsePaddingOption","prop","viewportSize","paddingValue","paddingFn","padding","legacyPropName","ZoomLevel$1","panAreaSize","elementSize","fit","fill","vFill","initial","secondary","update","maxWidth","maxHeight","hRatio","vRatio","_getInitial","_getSecondary","_getMax","zoomLevels","slideData","_parseZoomLevelOption","optionPrefix","optionName","optionValue","currZoomLevel","lazyLoadData","createContentFromData","zoomLevel","ZoomLevel","getViewportSizeFn","newViewportSize","documentElement","clientWidth","innerHeight","getViewportSize","getPanAreaSize","ceil","Eventable","getNumItems","_this$options","numItems","dataSource","items","_getGalleryDOMElements","gallery","Content","getItemData","_this$options2","dataSourceItem","_domElementToItemData","galleryElement","_this$options3","_this$options4","childSelector","linkEl","pswpSrc","pswpSrcset","pswpWidth","pswpHeight","pswpType","thumbnailEl","_thumbnailEl$getAttri","currentSrc","pswpCropped","cropped","thumbCropped","PhotoSwipeLightbox","PhotoSwipeBase","super","_uid","shouldOpen","_preloadedContent","onThumbnailsClick","init","gallerySelector","button","ctrlKey","metaKey","altKey","shiftKey","specialKeyUsed","initialPoint","clientX","clientY","clickedIndex","getClickedIndex","currentTarget","loadAndOpen","getClickedIndexFn","clickedTarget","clickedChildIndex","findIndex","contains","galleryElements","initialPointerPos","preload","promiseArray","pswpModuleType","pswpModule","goTo","openPromise","preloadFirstSlide","lazyLoadSlide","uid","all","iterableModules","mainModule","_openPhotoswipe","default","contentLoader","addToCache","equalizePoints","roundPoint","getDistanceBetween","abs","sqrt","pointsEqual","clamp","setTransform","defaultCSSEasing","setTransitionStyle","duration","ease","transition","supportsPassive","DOMEvents","_pool","passive","_toggleListener","removeAll","poolItem","unbind","skipPool","methodName","eType","eventOptions","PanBounds","_updateAxis","reset","axis","elSize","correctPan","panOffset","Slide","currIndex","currentResolution","pan","opener","isOpen","getContentBySlide","bounds","prevDisplayedWidth","prevDisplayedHeight","setIsActive","calculateSize","appendHeavy","zoomAndPanToInitial","applyCurrentZoomPan","mainScroll","isShifted","resize","panTo","force","scaleMultiplier","sizeChanged","getPlaceholderElement","_this$content$placeho","zoomTo","destZoomLevel","centerPoint","transitionDuration","ignoreBounds","animations","stopAllPan","prevZoomLevel","setZoomLevel","calculateZoomToPanOffset","finishTransition","_setResolution","startTransition","isPan","getCurrentTransform","onComplete","easing","toggleZoom","zoomAnimationDuration","point","getViewportCenterPoint","zoomFactor","panX","panY","isPannable","_applyZoomTransform","currSlide","zoom","newResolution","DragHandler","gestures","startPan","stopAll","change","prevP1","dragAxis","closeOnVerticalDrag","isMultitouch","_setPanWithFriction","bgOpacity","_getVerticalDragRatio","applyBgOpacity","_panOrMoveMainScroll","end","velocity","indexDiff","currentSlideVisibilityRatio","getCurrSlideX","moveIndexBy","correctZoomPan","_finishPanGestureForAxis","panPos","restoreBgOpacity","projectedPosition","initialVelocity","decelerationRate","project","vDragRatio","projectedVDragRatio","correctedPanPosition","dampingRatio","initialBgOpacity","totalPanDist","startSpring","onUpdate","pos","animationProgressRatio","floor","delta","newMainScrollX","moveTo","newPan","allowPanToNext","currSlideMainScrollX","mainScrollShiftDiff","isLeftToRight","isRightToLeft","_this$pswp$currSlide$","_this$pswp$currSlide","potentialPan","customFriction","getZoomPointsCenter","ZoomHandler","_startPan","_startZoomPoint","_zoomPoint","_wasOverFitZoomLevel","_startZoomLevel","startP1","startP2","minZoomLevel","maxZoomLevel","pinchToClose","_calculatePanForZoomLevel","ignoreGesture","destinationZoomLevel","currZoomLevelNeedsChange","initialPan","destinationPan","panNeedsChange","naturalFrequency","newZoomLevel","didTapOnMainContent","TapHandler","click","originalEvent","targetClassList","isImageClick","isBackgroundClick","_doClickOrTapAction","tap","doubleTap","actionName","_this$gestures$pswp$e","actionFullName","clickToCloseNonZoomable","toggle","Gestures","prevP2","_lastStartP1","_intervalP1","_numActivePoints","_ongoingPointers","_touchEventEnabled","_pointerEventEnabled","PointerEvent","supportsTouch","maxTouchPoints","_intervalTime","_velocityCalculated","isDragging","isZooming","raf","_tapTimer","drag","tapHandler","scrollWrap","_onClick","_bindEvents","ontouchmove","ontouchend","pref","down","up","cancelEvent","onPointerDown","onPointerMove","onPointerUp","isMousePointer","pointerType","mouseDetected","_preventPointerEventBehaviour","_updatePoints","_clearTapTimer","_finishDrag","_updateStartPoints","_rafStopLoop","_rafRenderLoop","_calculateDragDirection","_updateVelocity","_finishTap","_updatePrevPoints","requestAnimationFrame","_getVelocity","tapDelay","doubleTapAction","displacement","cancelAnimationFrame","pointerEvent","pointerIndex","ongoingPointer","pointerId","_convertEventPosToPoint","touchEvent","touches","diff","axisToCheck","pageX","pageY","identifier","stopPropagation","MainScroll","slideWidth","_currPositionIndex","_prevPositionIndex","_containerShiftIndex","itemHolders","resizeSlides","newSlideWidth","spacing","slideWidthChanged","itemHolder","resetPosition","appendHolders","display","canBeSwiped","animate","velocityX","newIndex","potentialIndex","numSlides","canLoop","getLoopedIndex","distance","stopMainScroll","destinationX","isMainScroll","updateCurrItem","currDiff","currDistance","_this$itemHolders$","positionDifference","tempHolder","diffAbs","setContent","unshift","updateLazy","dragging","newSlideIndexOffset","KeyboardKeyCodesMap","Escape","ArrowLeft","ArrowUp","ArrowRight","ArrowDown","Tab","getKeyboardEventKey","isKeySupported","Keyboard","_wasFocused","trapFocus","_focusRoot","_onFocusIn","_onKeyDown","lastActiveElement","returnFocus","keydownAction","isForward","keyCode","escKey","arrowKeys","DEFAULT_EASING","CSSAnimation","props","_props$prop","onFinish","_target","_onComplete","_finished","_onTransitionEnd","_helperTimeout","_finalizeAnimation","SpringEaser","_dampingRatio","_naturalFrequency","_dampedFrequency","easeFrame","deltaPosition","deltaTime","coeff","naturalDumpingPow","E","dumpedFCos","cos","dumpedFSin","sin","SpringAnimation","_raf","easer","prevTime","animationLoop","Animations","activeAnimations","_start","isSpring","animation","stop","isPanRunning","some","ScrollWheel","_onWheel","deltaX","deltaY","wheelToZoom","deltaMode","UIElement","_container","elementHTML","isButton","ariaLabel","ariaText","htmlData","isCustomSVG","svgData","out","outlineID","inner","addElementHTML","onInit","onclick","appendTo","topBar","initArrowButton","isNextButton","loop","disabled","arrowPrev","order","arrowNext","closeButton","zoomButton","loadingIndicator","indicatorElement","isVisible","delayTimeout","setIndicatorVisibility","visible","updatePreloaderVisibility","_pswp$currSlide","_pswp$currSlide2","preloaderDelay","ui","counterIndicator","counterElement","indexIndicatorSep","setZoomedIn","isZoomedIn","UI","isRegistered","uiElementsData","_lastUpdatedZoomLevel","uiElementData","registerElement","_pswp$element","_onZoomPanUpdate","elementData","isClosing","currZoomLevelDiff","imageClickAction","ContentLoader","_cachedItems","loadSlideByIndex","initialIndex","getContentByIndex","removeByIndex","indexToRemove","MIN_OPACITY","Opener","isClosed","isOpening","_duration","_useAnimation","_croppedZoom","_animateRootOpacity","_animateBgOpacity","_placeholder","_opacityElement","_cropContainer1","_cropContainer2","_thumbBounds","_prepareOpen","hideAnimationDuration","maxWidthToAnimate","_applyStartProps","showAnimationDuration","_options$showHideOpac","showHideAnimationType","showHideOpacity","_initialThumbBounds","getThumbBounds","_animateZoom","bg","opacity","innerRect","overflow","_setClosedStateZoomPan","willChange","decoded","isDelaying","_initiate","_this$pswp$element","_this$pswp$element2","setProperty","_animateToOpenState","_animateToClosedState","_onAnimationComplete","_animateTo","containerOnePanX","containerOnePanY","containerTwoPanX","containerTwoPanY","animProps","defaultOptions","bgClickAction","tapAction","PhotoSwipe","_prepareOptions","_prevViewportSize","isDestroying","hasMouse","_initialItemData","keyboard","_createMainStructure","rootClasses","mainClass","scrollWheel","isNaN","updateSize","pageYOffset","_handlePageResize","_updatePageScrollOffset","_itemHolder$slide","_this$currSlide","_this$currSlide2","_itemHolder$slide2","refreshSlideContent","slideIndex","_this$currSlide$index","_this$currSlide3","potentialHolderIndex","_itemHolder$slide3","holder","matchMedia","_this$element2","setScrollOffset","thumbBounds","thumbnail","thumbSelector","imageWidth","imageHeight","thumbAreaRect","fillZoomLevel","offsetX","offsetY","top","getCroppedBoundsByElement","getBoundsByElement","bindResizerEvents","pointerNode","infoNode","isPlus","initialWidth","rate","pointermoveListener","diffX","newWidth","newHeight","setPointerCapture","getImageInfo","position","visibility","imgNativeNode","renderError","imageNode","buttonGroupNode","removeButton","removeIcon","errorNode","imageIcon","imageBox","placeholderNode","promise","imageInfo","originalWidth","originalHeight","progressNode","circleNotchIcon","imgNode","draggable","renderUploading","viewButton","maximizeIcon","resizerNode","renderDone","currentIndex","allImageBox","imageValue","originalUrl","lightbox","arrowPrevSVG","arrowNextSVG","closeSVG","arrowPrevTitle","arrowNextTitle","closeTitle","openFullScreen","abort","removeImageBox","getHighlightStyle","CodeMirror","HighlightStyle","tags","keyword","deleted","character","macroName","processingInstruction","inserted","special","function","variableName","labelName","constant","standard","definition","separator","number","changed","annotation","modifier","namespace","typeName","operator","operatorKeyword","escape","regexp","meta","comment","fontWeight","emphasis","fontStyle","textDecoration","atom","bool","invalid","codeBlockBox","codeBlockNode","codeBlockNativeNode","EditorState","Compartment","EditorView","keymap","defaultKeymap","historyKeymap","syntaxHighlighting","langItems","langItemMap","langItem","lang","language","updateListener","of","docChanged","codeEditor","extensions","readOnly","effects","reconfigure","blockSelector","fixNestedBlocks","pasteFragment","firstNode","lastNode","insertFirstNode","setParagraph","setNumberedList","setBulletedList","setChecklist","alignValueMap","markList","formatPainterClassName","LinkPopup","writeClipboardText","LAKE_TEST","LAKE_ERROR","clipboard","writeText","appendCopyButton","timeoutId","getInputValue","copyDoneIcon","copyErrorIcon","appendOpenButton","appendSaveButton","appendUnlinkButton","setInputValue","updatePosition","linkRect","linkX","scrollX","linkY","scrollY","headingTypeMap","markItemList","getParameters","blockItemListForSpaceKey","results","blockItemListForEnterKey","fixEmptyBlock","rightText","addBlockOrSplitBlockForBox","addLineBreak","addBlockOrLineBreakForBox","mergeWithPreviousBlock","prevRange","mergeWithNextBlock","nextRange","dataTransfer","clipboardData","files","types","div","getPasteElementRules","fixClipboardData","redoHandler","currentItem","currentValue","isNumberedList","isBulletedList","isChecklist","mouseEvent","tagetNode","popup","nativeFragment","getMarkdownPoint","oldValue","newValue","parameters","executeMarkCommand","spaceKeyExecutesBlockCommand","enterKeyExecutesBlockCommand","stopImmediatePropagation","appendDivider","appendButton","appendDropdown","appendUpload","uploadNode","fileNode","fileNativeNode","allMenuMap","buttonItemList","dropdownItemList","selectedClass"],"mappings":"kCAAA,MAAMA,UAAmBC,aAIzBC,eAAeC,OAAO,WAAYH,GCJlC,MAAMI,UAAwBH,aAI9BC,eAAeC,OAAO,gBAAiBC,GCyE1B,MAAAC,EAA6B,IAAIC,IAAI,CAChD,CAAC,+VACD,CAAC,6QACD,CAAC,2OACD,CAAC,+PACD,CAAC,6OACD,CAAC,2PACD,CAAC,6XACD,CAAC,kVACD,CAAC,ugBACD,CAAC,0TACD,CAAC,4aACD,CAAC,sYACD,CAAC,gUACD,CAAC,6ZACD,CAAC,4WACD,CAAC,4VACD,CAAC,iwBACD,CAAC,kVACD,CAAC,0TACD,CAAC,yOACD,CAAC,qVACD,CAAC,iZACD,CAAC,qaACD,CAAC,oXACD,CAAC,ieACD,CAAC,8ZACD,CAAC,4QACD,CAAC,ybACD,CAAC,yZACD,CAAC,itBACD,CAAC,maACD,CAAC,+lBACD,CAAC,4UACD,CAAC,4UACD,CAAC,2UACD,CAAC,6UACD,CAAC,+aACD,CAAC,qaACD,CAAC,kaACD,CAAC,sSACD,CAAC,2QACD,CAAC,gUACD,CAAC,6pBACD,CAAC,q1BACD,CAAC,01BACD,CAAC,8TACD,CAAC,4cACD,CAAC,kRACD,CAAC,gaACD,CAAC,mRACD,CAAC,qvBACD,CAAC,6SACD,CAAC,+hBACD,CAAC,6vBACD,CAAC,oMACD,CAAC,obACD,CAAC,6eACD,CAAC,qUCvIaC,EAASC,KAAkCC,GACzD,IAAIC,EAAUF,EAAQ,GACtB,IAAK,IAAIG,EAAI,EAAGA,EAAIF,EAAKG,OAAQD,IAAK,CAEpCD,GADYG,OAAOJ,EAAKE,IAExBD,GAAWF,EAAQG,EAAI,EACxB,CAKD,OAJAD,EAAUA,EACRI,QAAQ,SAAU,IAClBA,QAAQ,SAAU,IAClBA,QAAQ,UAAW,IACdJ,CACT,CCZA,MAAMK,EAAe,IAAIT,IAAI,CAC3B,CAAC,IAAK,SACN,CAAC,IAAK,QACN,CAAC,IAAK,QACN,CAAC,IAAK,UACN,CAAC,IAAQ,YAIL,SAAUU,EAAOC,GACrB,OAAOA,EAAMH,QAAQ,eAAeI,IAAS,IAAAC,EAAA,iBAAAJ,EAAaK,IAAIF,kBAAU,EAAE,GAC5E,UCTgBG,EAAab,KAAkCC,GAC7D,IAAIC,EAAUF,EAAQ,GACtB,IAAK,IAAIG,EAAI,EAAGA,EAAIF,EAAKG,OAAQD,IAAK,CAGpCD,GAAWM,EAFCH,OAAOJ,EAAKE,KAIxBD,GAAWF,EAAQG,EAAI,EACxB,CAKD,OAJAD,EAAUA,EACRI,QAAQ,SAAU,IAClBA,QAAQ,SAAU,IAClBA,QAAQ,UAAW,IACdJ,CACT,CChBM,SAAUY,EAAUL,GACxB,MAAMM,EAAYN,EAAMO,MAAM,KAC9B,IAAIC,EAAc,GAIlB,OAHAF,EAAUG,SAAQ,CAACC,EAAKC,KACtBH,GAAgBG,EAAQ,EAAKD,EAAIE,OAAO,GAAGC,cAAgBH,EAAII,UAAU,GAAKJ,CAAG,IAE5EF,CACT,UCNgBO,EAASC,EAAgBhB,EAAeiB,GAItD,YAHkBC,IAAdD,IACFA,EAAY,MAENA,EAAYD,EAASC,GAAWE,QAAQF,EAAYjB,EAAQiB,IAAc,CACpF,CCCA,SAASG,EAAIpB,GACX,MAAMqB,EAAYC,OAAOC,SAASvB,EAAO,IAAIwB,SAAS,IAAIC,cAC1D,OAAOJ,EAAU1B,OAAS,EAAI0B,EAAY,IAAIA,GAChD,CAGM,SAAUK,EAAM1B,GACpB,OAAOA,EAAMH,QACX,yEACA,CAACI,EAAO0B,EAAIC,EAAIC,EAAIC,SACPZ,IAAPY,EACK,IAAIV,EAAIO,KAAMP,EAAIQ,KAAMR,EAAIS,KAE9B,IAAIT,EAAIO,KAAMP,EAAIQ,KAAMR,EAAIS,KAnBzC,SAAoB7B,GAClB,MAAMqB,EAAYU,KAAKC,MAAiC,IAA3BV,OAAOW,WAAWjC,IAAcwB,SAAS,IACtE,OAAOH,EAAU1B,OAAS,EAAI0B,EAAY,IAAIA,GAChD,CAgB+Ca,CAAWJ,MAG1D,CCpBM,SAAUK,EAAWC,GACzBA,EAAaA,EAAWvC,QAAQ,WAAY,KAC5C,MAAMwC,EAAuB,CAAA,EACvBC,EAAK,+BACX,IAAIC,EACJ,KAA0C,QAAlCA,EAASD,EAAGE,KAAKJ,KAAuB,CAC9C,MAAMK,EAAMF,EAAO,GAAGd,cAAciB,OAC9BhC,EAAMgB,EAAMa,EAAO,IAAIG,OAC7BL,EAAWI,GAAO/B,CACnB,CACD,OAAO2B,CACT,CCbM,SAAUM,EAAe3C,GAC7B,OAAOA,EACLH,QAAQ,4CAA6C,QACrDA,QAAQ,kBAAmB,iDAC3BA,QAAQ,iBAAkB,+CAC9B,CCLM,SAAU+C,EAAiB5C,GAC/B,OAAOA,EACLH,QAAQ,4CAA6C,QACrDA,QAAQ,wDAAyD,cACjEA,QAAQ,uDAAwD,YACpE,CCHgB,SAAAgD,EAAa7C,EAAe8C,GAE1C,MACMC,GAFND,EAAYA,QAAAA,EAAaE,UAAUF,WACX3B,QAAQ,aAAe,EACvB,IAAM,OAC9B,OAAOnB,EAAMH,QAAQ,yBAA0B,KAAKkD,MACtD,CCNgB,SAAAtC,EAAQwC,EAA6BC,GACnD,IAAK,MAAMT,KAAOQ,EAChB,IAAgC,IAA5BC,EAAST,EAAKQ,EAAIR,IACpB,KAGN,CCJgB,SAAAU,EAAOC,EAAkBC,GACvC,MAAMC,EAAoBjD,EAAUgD,GAC9BE,EAAgBC,OAAOC,iBAAiBL,EAAS,MAEvD,OAAO1B,EADe0B,EAAQM,MAAMJ,IAAsBC,EAAcI,iBAAiBN,IAAiB,GAE5G,CCPgB,SAAAO,EAAWnE,EAA8BoE,GACvD,MAAMC,EAAyB,GAE/B,GAAuB,iBAAZrE,EAET,OADAqE,EAASC,KAAKtE,GACPqE,EAGT,GAAgB,KAAZrE,EACF,OAAOqE,EAGT,GAAkB,SAAdD,EAAsB,CACxB,MAAMG,EAAWC,SAASC,eAAezE,GAEzC,OADAqE,EAASC,KAAKC,GACPF,CACR,CAED,GAAkB,SAAdD,GAAwB,OAAOM,KAAK1E,GAAU,CAChD,MAAM2E,EAAYH,SAASI,cAAc,OACzCD,EAAUE,UAAY7E,EACtB,IAAK,MAAM8E,KAASH,EAAUI,WAC5BV,EAASC,KAAKQ,GAEhB,OAAOT,CACR,CAED,MAAMW,EAAWR,SAASS,iBAAiBjF,GAC3C,IAAK,MAAM8E,KAASE,EAClBX,EAASC,KAAKQ,GAEhB,OAAOT,CACT,CCjCO,MAAMa,EAAaC,KCDbC,EAA6B,IAAIC,IAAI,CAChD,KACA,KACA,KACA,KACA,KACA,KACA,MACA,IACA,aACA,KACA,KACA,KACA,QACA,KACA,KACA,OAGWC,EAA4B,IAAID,IAAI,CAC/C,OACA,SACA,KACA,IACA,IACA,IACA,MACA,MACA,SAIWE,EAA4B,IAAIF,IAAI,CAC/C,OACA,OACA,KACA,MACA,QACA,KACA,MACA,QACA,OACA,OACA,QACA,SACA,QACA,QAGWG,EAA+B,IAAIH,IAAI,CAClD,KACA,KACA,KACA,KACA,KACA,OAIWI,EAA4B,IAAIJ,IAAI,CAC/C,KACA,KACA,OAGWK,EAA6B,IAAIL,IAAI,CAChD,QACA,KACA,OClEc,SAAAM,KAASC,GACnB7B,OAAO8B,YACTC,QAAQC,IAAIC,MAAMF,QAAQC,IAAKH,EAEnC,CCqBA,MAAMK,EAA4C,CAAA,EAElD,IAAIC,EAAa,QAEJC,EAOX,WAAAC,CAAYC,GACVA,EAAOA,QAAAA,EAAQ,GACfC,KAAKjC,SAAWkC,MAAMC,QAAQH,GAAQA,EAAO,CAACA,GAC9C,IAAK,IAAIpG,EAAI,EAAGA,EAAIqG,KAAKjC,SAASnE,OAAQD,IAGnCqG,KAAKjC,SAASpE,GAAGwG,SACpBH,KAAKjC,SAASpE,GAAGwG,SAAWP,GAGhCI,KAAKpG,OAASoG,KAAKjC,SAASnE,MAC7B,CAGD,MAAWwG,GAET,OADaJ,KAAK5F,IAAI,GACV+F,MACb,CAGD,QAAWE,GACT,GAAoB,IAAhBL,KAAKpG,OACP,MAAO,GAGT,OADaoG,KAAK5F,IAAI,GACVkG,SAAS5E,aACtB,CAGD,aAAW6E,GACT,GAAoB,IAAhBP,KAAKpG,OACP,OAAO,EAGT,OADaoG,KAAK5F,IAAI,GACVoG,WAAa5B,EAAW6B,YACrC,CAGD,UAAWC,GACT,GAAoB,IAAhBV,KAAKpG,OACP,OAAO,EAGT,OADaoG,KAAK5F,IAAI,GACVoG,WAAa5B,EAAW+B,SACrC,CAGD,WAAWC,GACT,OAAoB,IAAhBZ,KAAKpG,QAGFkF,EAAc+B,IAAIb,KAAKK,KAC/B,CAGD,UAAWS,GACT,OAAoB,IAAhBd,KAAKpG,QAGFoF,EAAa6B,IAAIb,KAAKK,KAC9B,CAGD,UAAWU,GACT,OAAoB,IAAhBf,KAAKpG,QAGFqF,EAAa4B,IAAIb,KAAKK,KAC9B,CAGD,aAAWW,GACT,OAAoB,IAAhBhB,KAAKpG,QAGFsF,EAAgB2B,IAAIb,KAAKK,KACjC,CAGD,UAAWY,GACT,OAAoB,IAAhBjB,KAAKpG,QAGFuF,EAAa0B,IAAIb,KAAKK,KAC9B,CAGD,WAAWa,GACT,OAAoB,IAAhBlB,KAAKpG,QAGFwF,EAAcyB,IAAIb,KAAKK,KAC/B,CAGD,cAAWc,GACT,MAAqB,kBAAdnB,KAAKK,IACb,CAGD,SAAWe,GACT,MAAqB,aAAdpB,KAAKK,IACb,CAGD,eAAWgB,GACT,OAAOrB,KAAKoB,OAA+B,WAAtBpB,KAAKsB,KAAK,OAChC,CAGD,cAAWC,GACT,OAAOvB,KAAKoB,OAA+B,UAAtBpB,KAAKsB,KAAK,OAChC,CAGD,eAAWE,GACT,GAAoB,IAAhBxB,KAAKpG,OACP,OAAO,EAET,MAAMmG,EAAOC,KAAK5F,IAAI,GACtB,OAAO4F,KAAKO,WAAsD,SAAzCR,EAAK0B,aAAa,kBAC5C,CAGD,aAAWC,GACT,OAA2D,IAApD1B,KAAK2B,QAAQ,4BAA4B/H,MACjD,CAGD,YAAWgI,GACT,OAAQ5B,KAAK0B,YAAc1B,KAAKwB,WACjC,CAGD,eAAWK,GACT,GAAoB,IAAhB7B,KAAKpG,OACP,OAAO,EAET,MAAMkI,EAAa9B,KAAK+B,SACxB,OAA0B,IAAtBD,EAAWlI,SAGRoG,KAAK4B,UAAYE,EAAWN,YACpC,CAGD,qBAAWQ,GACT,GAAoB,IAAhBhC,KAAKpG,OACP,OAAO,EAET,GAAIoG,KAAKU,OAAQ,CACf,MAAMrD,EAAU2C,KAAK5F,IAAI,GAAG0H,WAC5B,QAAKzE,GAGEA,EAAQ2E,iBAChB,CACD,IAAKhC,KAAKO,UACR,OAAO,EAGT,OADgBP,KAAK5F,IAAI,GACV4H,iBAChB,CAGD,iBAAWC,GACT,OAAOjC,KAAKwB,aAAexB,KAAKkB,OACjC,CAGD,WAAWgB,GACT,GAAIlC,KAAKoB,MACP,OAAO,EAET,MAAMe,EAAWnC,KAAKoC,OAChBC,EAA2B,KAAbF,GAAmB,wBAAwB/D,KAAK+D,GACpE,OAAInC,KAAKO,WAAa8B,EACoB,IAAjCrC,KAAKsC,KAAK,YAAY1I,OAExByI,CACR,CAGM,SAAAE,CAAUC,GACf,GAAoB,IAAhBxC,KAAKpG,OACP,OAAO,EAET,MAAMmI,EAAS/B,KAAK5F,IAAI,GAAG0H,WAC3B,OAAOC,GAAUA,IAAWS,EAAOT,SAAS3H,IAAI,EACjD,CAGM,GAAAA,CAAIQ,GACT,OAAOoF,KAAKjC,SAASnD,EACtB,CAGM,MAAA6H,GACL,OAAOzC,KAAKjC,QACb,CAGM,EAAA2E,CAAG9H,GACR,MAAMmF,EAAOC,KAAK5F,IAAIQ,GACtB,OAAO,IAAIiF,EAAME,EAClB,CAGM,IAAA4C,CAAKxF,GACV,MAAMyF,EAAQ5C,KAAKyC,SACnB,IAAK,IAAI9I,EAAI,EAAGA,EAAIiJ,EAAMhJ,OAAQD,IAChC,IAA8B,IAA1BwD,EAASyF,EAAMjJ,GAAIA,GACrB,OAAOqG,KAGX,OAAOA,IACR,CAGM,WAAA6C,CAAY1F,GACjB,MAAMyF,EAAQ5C,KAAKyC,SACnB,IAAK,IAAI9I,EAAI,EAAGA,EAAIiJ,EAAMhJ,OAAQD,IAChC,GAAIiJ,EAAMjJ,GAAG6G,WAAa5B,EAAW6B,eACM,IAArCtD,EAASyF,EAAMjJ,GAAeA,GAChC,OAAOqG,KAIb,OAAOA,IACR,CAGM,OAAA8C,GACL,MAAMF,EAAQ5C,KAAKyC,SAASK,UAC5B,OAAO,IAAIjD,EAAM+C,EAClB,CAGM,OAAAG,CAAQC,GACb,IAAKhD,KAAKO,UACR,OAAO,EAGT,OADgBP,KAAK5F,IAAI,GACV2I,QAAQC,EACxB,CAGM,IAAAV,CAAKU,GACV,GAAwB,iBAAbA,EAAuB,CAChC,MACMjF,EADUiC,KAAK5F,IAAI,GACAuE,iBAAiBqE,GAC1C,OAAO,IAAInD,EAAMI,MAAMgD,KAAKlF,GAC7B,CACD,IAAIgC,EAAOC,KAAK0C,GAAG,GACnB,IAAK,MAAM9H,KAASoI,EAElB,GADAjD,EAAOA,EAAKmD,WAAWtI,IAClBmF,EACH,OAAO,IAAIF,EAGf,OAAOE,CACR,CAIM,OAAA4B,CAAQqB,GACb,GAAIhD,KAAKU,OAAQ,CACf,MAAMrD,EAAU2C,KAAK5F,IAAI,GAAG0H,WAC5B,OAAKzE,EAGE,IAAIwC,EAAOxC,EAAoBsE,QAAQqB,IAFrC,IAAInD,CAGd,CACD,IAAKG,KAAKO,UACR,OAAO,IAAIV,EAEb,MAAMxC,EAAU2C,KAAK5F,IAAI,GACzB,OAAO,IAAIyF,EAAMxC,EAAQsE,QAAQqB,GAClC,CAGM,YAAAG,GACL,IAAIpD,EAAOC,KAAK0C,GAAG,GACnB,KAAO3C,EAAKnG,OAAS,IACfmG,EAAK8B,cAAe9B,EAAKa,SAG7Bb,EAAOA,EAAKgC,SAEd,OAAKhC,EAAKa,QAGHb,EAFE,IAAIF,CAGd,CAGM,oBAAAuD,GACL,MAAMC,EAAUrD,KAAK2B,QAAQ,YACvB2B,EAAQD,EAAQzJ,OAAS,EAAIyJ,EAAQF,eAAiBnD,KAAKmD,eACjE,GAAqB,IAAjBG,EAAM1J,OACR,OAAO0J,EAET,GAAIA,EAAMpC,QACR,OAAO,IAAIrB,EAEb,MAAM0D,EAAcD,EAAMvB,SAC1B,MAAmB,OAAfuB,EAAMjD,MAAiBkD,EAAYtC,OAC9BsC,EAEFD,CACR,CAGM,gBAAAE,GACL,OAAOxD,KAAK2B,QAAQ,8BACrB,CAGM,MAAAI,GACL,MAAMhC,EAAOC,KAAK5F,IAAI,GACtB,OAAO,IAAIyF,EAAME,EAAK+B,WACvB,CAGM,IAAA2B,GACL,MAAM1D,EAAOC,KAAK5F,IAAI,GACtB,OAAO,IAAIyF,EAAME,EAAK2D,gBACvB,CAGM,IAAAC,GACL,MAAM5D,EAAOC,KAAK5F,IAAI,GACtB,OAAO,IAAIyF,EAAME,EAAK6D,YACvB,CAGM,KAAAC,GACL,MAAMxG,EAAU2C,KAAK5F,IAAI,GACzB,OAAO,IAAIyF,EAAMxC,EAAQyG,WAC1B,CAGM,IAAAC,GACL,MAAM1G,EAAU2C,KAAK5F,IAAI,GACzB,OAAO,IAAIyF,EAAMxC,EAAQ2G,UAC1B,CAGM,KAAApJ,GACL,IAAIjB,GAAK,EACLsK,EAA6BjE,KAAK5F,IAAI,GAC1C,KAAO6J,GACLtK,IACAsK,EAAUA,EAAQP,gBAEpB,OAAO/J,CACR,CAGM,IAAAuK,GACL,MAAMA,EAAiB,GACvB,IAAInE,EAAOC,KAAK0C,GAAG,GACnB,GAAI3C,EAAKyB,YACP,OAAO0C,EAET,KAAOnE,EAAKnG,OAAS,GAAG,CACtB,MAAMmI,EAAShC,EAAKgC,SACpB,GAAsB,IAAlBA,EAAOnI,OACT,MAGF,GADAsK,EAAKlG,KAAK+B,EAAKnF,SACXmH,EAAOP,YACT,MAEFzB,EAAOgC,CACR,CACD,OAAOmC,EAAKpB,SACb,CAGM,QAAAI,GACL,MAAMiB,EAAqB,GAC3B,IAAI3F,EAAQwB,KAAK6D,QACjB,KAAOrF,EAAM5E,OAAS,GACpBuK,EAAUnG,KAAKQ,GACfA,EAAQA,EAAMmF,OAEhB,OAAOQ,CACR,CAGM,UAAEC,GAaP,IAAK,MAAMrE,KAZX,SAAWsE,EAAQtE,GACjB,GAAIA,EAAKqB,MACP,OAEF,IAAI5C,EAAQuB,EAAK8D,QACjB,KAAOrF,EAAM5E,OAAS,GAAG,CACvB,MAAM0K,EAAW9F,EAAMmF,aACjBnF,QACE6F,EAAQ7F,GAChBA,EAAQ8F,CACT,CACF,CACkBD,CAAQrE,KAAK0C,GAAG,UAC3B3C,CAET,CAGM,EAAAwE,CAAGC,EAAcC,GACtB,OAAOzE,KAAK6C,aAAYxF,IACtBA,EAAQqH,iBAAiBF,EAAMC,GAAU,GACzC,MAAME,EAAYtH,EAAQ8C,OACrBR,EAAUgF,KACbhF,EAAUgF,GAAa,IAEzBhF,EAAUgF,GAAW3G,KAAK,CACxBwG,OACAC,YACA,GAEL,CAGM,GAAAG,CAAIJ,EAAeC,GACxB,OAAOzE,KAAK6C,aAAYxF,UACtB,MAAMsH,EAAYtH,EAAQ8C,OACpB0E,EAAqC,QAAxB1K,EAAAwF,EAAUgF,UAAc,IAAAxK,EAAAA,EAAA,GAC3C0K,EAAWnK,SAAQ,CAACoK,EAAMlK,KACnB4J,IAAQA,IAASM,EAAKN,MAAUC,GAAYA,IAAaK,EAAKL,YACjEpH,EAAQ0H,oBAAoBD,EAAKN,KAAMM,EAAKL,UAAU,GACtDI,EAAWjK,GAAS,CAClB4J,KAAM,GACNC,SAAU,QAEb,IAEH9E,EAAUgF,GAAaE,EAAWG,QAAQF,GAAkC,KAAdA,EAAKN,MAAY,GAElF,CAGM,IAAAS,CAAKT,EAAcU,GACxB,OAAOlF,KAAK6C,aAAYxF,IACtB,MAAMsH,EAAYtH,EAAQ8C,OACPR,EAAUgF,GAClBjK,SAAQoK,IACbA,EAAKN,OAASA,GAChBM,EAAKL,SAASS,QAAAA,EAAS,IAAIC,MAAMX,GAClC,GACD,GAEL,CAGM,iBAAAY,CAAkBxK,GACvB,MAAM+J,EAAY3E,KAAK5F,IAAIQ,GAAOuF,OAClC,OAAOR,EAAUgF,EAClB,CAGM,KAAAU,GAGL,OAFgBrF,KAAK5F,IAAI,GACjBiL,QACDrF,IACR,CAGM,IAAAsF,GAGL,OAFgBtF,KAAK5F,IAAI,GACjBkL,OACDtF,IACR,CAGM,KAAAuF,CAAMC,GAAgB,GAC3B,MAAMzF,EAAOC,KAAK5F,IAAI,GACtB,OAAO,IAAIyF,EAAME,EAAK0F,UAAUD,GACjC,CAEM,OAAAE,CAAQC,GAEb,OADgB3F,KAAK5F,IAAI,GACVwL,aAAaD,EAC7B,CAQM,IAAArE,CAAKqE,EAAoB1L,SAC9B,GAA6B,iBAAlB0L,EAIT,OAHAjL,EAAQiL,GAAe,CAACtF,EAAM1F,KAC5BqF,KAAKsB,KAAKjB,EAAM1F,EAAI,IAEfqF,KAET,QAAc7E,IAAVlB,EAAqB,CAEvB,OAA8C,QAAvCE,EADS6F,KAAK5F,IAAI,GACVqH,aAAakE,UAAkB,IAAAxL,EAAAA,EAAA,EAC/C,CACD,OAAO6F,KAAK6C,aAAYxF,IACtBA,EAAQwI,aAAaF,EAAe1L,EAAM,GAE7C,CAEM,UAAA6L,CAAWH,GAChB,OAAO3F,KAAK6C,aAAYxF,IACtBA,EAAQ0I,gBAAgBJ,EAAc,GAEzC,CAEM,QAAAK,CAASC,GAEd,OAAOjL,EADSgF,KAAK5F,IAAI,GACD6L,UAAWA,EAAW,IAC/C,CAEM,QAAAC,CAASD,GACd,OAAIhG,MAAMC,QAAQ+F,IAChBA,EAAUvL,SAAQ2F,IAChBL,KAAKkG,SAAS7F,EAAK,IAEdL,MAEFA,KAAK6C,aAAYxF,IAClBrC,EAASqC,EAAQ4I,UAAWA,EAAW,MAG3C5I,EAAQ8I,UAAUC,IAAIH,EAAU,GAEnC,CAEM,WAAAI,CAAYJ,GACjB,OAAIhG,MAAMC,QAAQ+F,IAChBA,EAAUvL,SAAQ2F,IAChBL,KAAKqG,YAAYhG,EAAK,IAEjBL,MAEFA,KAAK6C,aAAYxF,IACjBrC,EAASqC,EAAQ4I,UAAWA,EAAW,OAG5C5I,EAAQ8I,UAAUG,OAAOL,GACC,KAAtB5I,EAAQ4I,WACV5I,EAAQ0I,gBAAgB,SACzB,GAEJ,CAEM,WAAAQ,CAAYjJ,GAEjB,OAAOF,EADS4C,KAAK5F,IAAI,GACFkD,EACxB,CAQM,GAAAkJ,CAAIlJ,EAAmBrD,GAC5B,GAA4B,iBAAjBqD,EAIT,OAHA5C,EAAQ4C,GAAc,CAAC+C,EAAM1F,KAC3BqF,KAAKwG,IAAInG,EAAM1F,EAAI,IAEdqF,KAET,QAAc7E,IAAVlB,EAAqB,CAEvB,OAAO0B,EADSqE,KAAK5F,IAAI,GACJuD,MAAMrD,EAAUgD,IACtC,CACD,OAAO0C,KAAK6C,aAAYxF,IACtBA,EAAQM,MAAMrD,EAAUgD,IAAiBrD,EACH,KAAlCoD,EAAQoE,aAAa,UACvBpE,EAAQ0I,gBAAgB,QACzB,GAEJ,CAGM,KAAAU,GAEL,OADgBzG,KAAK5F,IAAI,GACVsM,WAChB,CAGM,UAAAC,GACL,MAAMC,EAAcpL,SAASwE,KAAKuG,YAAY,gBAAiB,KAAO,EAChEM,EAAerL,SAASwE,KAAKuG,YAAY,iBAAkB,KAAO,EACxE,OAAOvG,KAAKyG,QAAUG,EAAcC,CACrC,CAGM,MAAAC,GAEL,OADgB9G,KAAK5F,IAAI,GACV2M,YAChB,CAEM,IAAAC,CAAKC,EAAsB,SAEhC,OADAjH,KAAKwG,IAAI,UAAWS,GACbjH,IACR,CAEM,IAAAkH,GAEL,OADAlH,KAAKwG,IAAI,UAAW,QACbxG,IACR,CAMM,IAAAmH,CAAKlN,GACV,QAAckB,IAAVlB,EAAqB,CAEvB,OADgB+F,KAAK5F,IAAI,GACVmE,SAChB,CACD,OAAOyB,KAAK6C,aAAYxF,IACtBA,EAAQkB,UAAYtE,CAAK,GAE5B,CAMM,IAAAmI,CAAKnI,SACV,QAAckB,IAAVlB,EAAqB,CACvB,MAAM8F,EAAOC,KAAK5F,IAAI,GACtB,GAAI4F,KAAKU,OACP,OAAqB,UAAdX,EAAKqH,iBAAS,IAAAjN,EAAAA,EAAI,GAI3B,OAFgB4F,EAEDsH,UAAUvN,QAAQ,YAAa,GAC/C,CACD,OAAOkG,KAAK6C,aAAYxF,IACrBA,EAAwBgK,UAAYpN,CAAK,GAE7C,CAEM,SAAAqN,GAEL,OADgBtH,KAAK5F,IAAI,GACVkN,SAChB,CAGM,KAAAC,GAEL,OADAvH,KAAKmH,KAAK,IACHnH,IACR,CAGM,OAAAwH,CAAQ9N,GACb,GAAuB,iBAAZA,EACT,OAAOsG,KAAK6C,aAAYxF,IACTQ,EAAWnE,GAAmBoJ,UACtCpI,SAASqF,IACR1C,EAAQyG,WACVzG,EAAQoK,aAAa1H,EAAM1C,EAAQyG,YAEnCzG,EAAQqK,YAAY3H,EACrB,GACD,IAGN,MAAM1C,EAAU2C,KAAK5F,IAAI,GASzB,OARIV,aAAmBmG,IACrBnG,EAAUA,EAAQU,IAAI,IAEpBiD,EAAQyG,WACVzG,EAAQoK,aAAa/N,EAAS2D,EAAQyG,YAEtCzG,EAAQqK,YAAYhO,GAEfsG,IACR,CAGM,MAAA2H,CAAOjO,GACZ,GAAuB,iBAAZA,EACT,OAAOsG,KAAK6C,aAAYxF,IACTQ,EAAWnE,GACnBgB,SAASqF,IACZ1C,EAAQqK,YAAY3H,EAAK,GACzB,IAGN,MAAM1C,EAAU2C,KAAK5F,IAAI,GAKzB,OAJIV,aAAmBmG,IACrBnG,EAAUA,EAAQU,IAAI,IAExBiD,EAAQqK,YAAYhO,GACbsG,IACR,CAGM,MAAA4H,CAAOlO,GACZ,GAAuB,iBAAZA,EACT,OAAOsG,KAAK2C,MAAK5C,IACFlC,EAAWnE,GACnBgB,SAAQ8H,IACNzC,EAAK+B,YAGV/B,EAAK+B,WAAW2F,aAAajF,EAAQzC,EAAK,GAC1C,IAGN,MAAMA,EAAOC,KAAK5F,IAAI,GAItB,OAHIV,aAAmBmG,IACrBnG,EAAUA,EAAQU,IAAI,IAEnB2F,EAAK+B,YAGV/B,EAAK+B,WAAW2F,aAAa/N,EAASqG,GAC/BC,MAHEA,IAIV,CAGM,KAAA6H,CAAMnO,GACX,GAAuB,iBAAZA,EACT,OAAOsG,KAAK2C,MAAK5C,IACFlC,EAAWnE,GAAmBoJ,UACtCpI,SAAQ8H,IACNzC,EAAK+B,aAGN/B,EAAK6D,YACP7D,EAAK+B,WAAW2F,aAAajF,EAAQzC,EAAK6D,aAE1C7D,EAAK+B,WAAW4F,YAAYlF,GAC7B,GACD,IAGN,MAAMzC,EAAOC,KAAK5F,IAAI,GAItB,OAHIV,aAAmBmG,IACrBnG,EAAUA,EAAQU,IAAI,IAEnB2F,EAAK+B,YAGN/B,EAAK6D,YACP7D,EAAK+B,WAAW2F,aAAa/N,EAASqG,EAAK6D,aAE3C7D,EAAK+B,WAAW4F,YAAYhO,GAEvBsG,MAPEA,IAQV,CAGM,WAAA8H,CAAYC,GACjB,OAAO/H,KAAK2C,MAAK5C,IACf,IAAIyC,EAEFA,EADEuF,aAAsBlI,EACfkI,EAAW3N,IAAI,GAEfyD,EAAWkK,GAAY,GAE7BhI,EAAK+B,YAGV/B,EAAK+B,WAAWkG,aAAaxF,EAAQzC,EAAK,GAE7C,CAKM,MAAAuG,CAAO2B,GAAwB,GAepC,OAdAjI,KAAK2C,MAAK5C,IACR,GAAKA,EAAK+B,WAAV,CAGA,GAAImG,EAAc,CAChB,IAAIzJ,EAAQuB,EAAK+D,WACjB,KAAOtF,GAAO,CACZ,MAAMmF,EAAOnF,EAAMoF,YACnB7D,EAAK+B,WAAW2F,aAAajJ,EAAOuB,GACpCvB,EAAQmF,CACT,CACF,CACD5D,EAAK+B,WAAWoG,YAAYnI,EAT3B,CASgC,IAE5BC,IACR,CAGM,SAAAmI,CAAUC,GACf,IAAKpI,KAAKU,OACR,OAAO,IAAIb,EAEb,MACMwI,EADOrI,KAAK5F,IAAI,GACD+N,UAAUC,GAC/B,OAAO,IAAIvI,EAAMwI,EAClB,CAGM,QAAA5M,GACL,GAAoB,IAAhBuE,KAAKpG,OACP,MAAO,GAET,MAAMmG,EAAOC,KAAK5F,IAAI,GACtB,IAAIgN,EAAYpH,KAAKU,OAASX,EAAKqH,UAAYpH,KAAKsH,YAIpD,OAHIF,GAAaA,EAAUxN,OAAS,KAClCwN,EAAY,GAAGA,EAAUrM,UAAU,EAAG,WAEjC,SAASgF,EAAKI,YAAYiH,GAClC,CAGM,KAAA/H,GACLA,EAAMW,KAAKvE,WACZ,ECp1BG,SAAU6M,EAAM5O,GACpB,GAAIA,aAAmBmG,EACrB,OAAOnG,EAET,MAAMkJ,EAAQ/E,EAAWnE,GACzB,OAAO,IAAImG,EAAM+C,EACnB,OCJa2F,EAIX,WAAAzI,CAAY0I,GACVxI,KAAKwI,MAAQA,QAAAA,EAAStK,SAASuK,aAChC,CAGD,aAAWC,GACT,OAAO,IAAI7I,EAAMG,KAAKwI,MAAMG,eAC7B,CAGD,eAAWC,GACT,OAAO5I,KAAKwI,MAAMI,WACnB,CAGD,WAAWC,GACT,OAAO,IAAIhJ,EAAMG,KAAKwI,MAAMM,aAC7B,CAGD,aAAWC,GACT,OAAO/I,KAAKwI,MAAMO,SACnB,CAGD,kBAAWC,GACT,OAAO,IAAInJ,EAAMG,KAAKwI,MAAMS,wBAC7B,CAGD,eAAWC,GACT,OAAOlJ,KAAKwI,MAAMW,SACnB,CAGD,SAAW/H,GAET,OADgBpB,KAAKgJ,eAAerH,QAAQ,YAC7B/H,OAAS,CACzB,CAMD,aAAWwP,GACT,MAAM/F,EAAUrD,KAAKgJ,eAAerH,QAAQ,YAC5C,GAAuB,IAAnB0B,EAAQzJ,OACV,OAAO,EAET,MAAMyP,EAAehG,EAAQf,KAAK,uBAClC,OAAOtC,KAAKsJ,kBAAkBD,IAAiB,CAChD,CAKD,eAAWE,GACT,MAAMlG,EAAUrD,KAAKgJ,eAAerH,QAAQ,YAC5C,GAAuB,IAAnB0B,EAAQzJ,OACV,OAAO,EAET,MAAMyP,EAAehG,EAAQf,KAAK,uBAGlC,OAAOtC,KAAKkJ,aAAelJ,KAAK0I,UAAUtO,IAAI,KAAOiP,EAAajP,IAAI,IAA2B,IAArB4F,KAAK4I,WAClF,CAMD,cAAWY,GACT,MAAMnG,EAAUrD,KAAKgJ,eAAerH,QAAQ,YAC5C,GAAuB,IAAnB0B,EAAQzJ,OACV,OAAO,EAET,MAAMyP,EAAehG,EAAQf,KAAK,uBAClC,OAAOtC,KAAKyJ,iBAAiBJ,IAAiB,CAC/C,CAKD,eAAWK,GACT,MAAMrG,EAAUrD,KAAKgJ,eAAerH,QAAQ,YAC5C,GAAuB,IAAnB0B,EAAQzJ,OACV,OAAO,EAET,MAAMyP,EAAehG,EAAQf,KAAK,uBAGlC,QACEtC,KAAKkJ,aACLlJ,KAAK0I,UAAUtO,IAAI,KAAOiP,EAAajP,IAAI,IACtB,IAArB4F,KAAK4I,eAIA5I,KAAKsJ,kBAAkBD,GAAgB,GAAKrJ,KAAKyJ,iBAAiBJ,GAAgB,EAC1F,CAGD,iBAAWM,GACT,GAAI3J,KAAKgJ,eAAetH,UACtB,OAAO,EAET,MAAMkI,EAAa5J,KAAK0I,UAAU/G,QAAQ,MACpCkI,EAAW7J,KAAK6I,QAAQlH,QAAQ,MACtC,OACEiI,EAAWhQ,OAAS,GACpBiQ,EAASjQ,OAAS,GAClBgQ,EAAWxP,IAAI,KAAOyP,EAASzP,IAAI,EAKtC,CAGM,GAAAA,GACL,OAAO4F,KAAKwI,KACb,CAGM,YAAAsB,CAAa/J,EAAaqI,GAC/B,OAAOpI,KAAKwI,MAAMsB,aAAa/J,EAAK3F,IAAI,GAAIgO,EAC7C,CAGM,iBAAAkB,CAAkBvJ,GACvB,MAAMgK,EAAc,IAAIxB,EAOxB,OANIxI,EAAKW,OACPqJ,EAAYC,SAASjK,EAAM,GAE3BgK,EAAYE,eAAelK,GAE7BgK,EAAYG,kBACLlK,KAAK8J,aAAaC,EAAYrB,UAAWqB,EAAYnB,YAC7D,CAGM,gBAAAa,CAAiB1J,SACtB,MAAMgK,EAAc,IAAIxB,EACxB,GAAIxI,EAAKW,OAAQ,CACf,MAAM0G,EAAiC,QAArBjN,EAAA4F,EAAK3F,IAAI,GAAGgN,iBAAS,IAAAjN,EAAAA,EAAI,GAC3C4P,EAAYC,SAASjK,EAAMqH,EAAUxN,OACtC,MACCmQ,EAAYI,cAAcpK,GAG5B,OADAgK,EAAYG,kBACLlK,KAAK8J,aAAaC,EAAYrB,UAAWqB,EAAYnB,YAC7D,CAGM,cAAAwB,CAAerK,GACpB,OAAOC,KAAKwI,MAAM4B,eAAerK,EAAK3F,IAAI,GAC3C,CAGM,QAAA4P,CAASjK,EAAaqI,GAC3BpI,KAAKwI,MAAMwB,SAASjK,EAAK3F,IAAI,GAAIgO,EAClC,CAGM,cAAA6B,CAAelK,GACpBC,KAAKwI,MAAMyB,eAAelK,EAAK3F,IAAI,GACpC,CAGM,aAAA+P,CAAcpK,GACnBC,KAAKwI,MAAM2B,cAAcpK,EAAK3F,IAAI,GACnC,CAGM,MAAAiQ,CAAOtK,EAAaqI,GACzBpI,KAAKwI,MAAM6B,OAAOtK,EAAK3F,IAAI,GAAIgO,EAChC,CAGM,YAAAkC,CAAavK,GAClBC,KAAKwI,MAAM8B,aAAavK,EAAK3F,IAAI,GAClC,CAGM,WAAAmQ,CAAYxK,GACjBC,KAAKwI,MAAM+B,YAAYxK,EAAK3F,IAAI,GACjC,CAGM,eAAA8P,GACLlK,KAAKwI,MAAMgC,UAAS,EACrB,CAGM,aAAAC,GACLzK,KAAKwI,MAAMgC,UAAS,EACrB,CAGM,UAAAE,CAAW3K,GAChBC,KAAKwI,MAAMkC,WAAW3K,EAAK3F,IAAI,GAChC,CAGM,kBAAAuQ,CAAmB5K,GACxBC,KAAKwI,MAAMmC,mBAAmB5K,EAAK3F,IAAI,GACxC,CAGM,SAAAwQ,CAAUvH,GACf,MAAMgG,EAAehG,EAAQf,KAAK,uBAClC,GAA4B,IAAxB+G,EAAazP,OACf,MAAM,IAAIiR,MAAM,+CAA+CxH,EAAQ/B,KAAK,gBAAgB+B,EAAQjD,kCAEtGJ,KAAKgK,SAASX,EAAc,GAC5BrJ,KAAKkK,iBACN,CAGM,aAAAY,CAAczH,GACnB,MAAM0H,EAAW1H,EAAQf,KAAK,mBAC9B,GAAwB,IAApByI,EAASnR,OACX,MAAM,IAAIiR,MAAM,+CAA+CxH,EAAQ/B,KAAK,gBAAgB+B,EAAQjD,kCAEtGJ,KAAK2K,mBAAmBI,EAASrI,GAAG,IACpC1C,KAAKyK,eACN,CAGM,cAAAO,CAAe3H,GACpB,MAAM0H,EAAW1H,EAAQf,KAAK,mBAC9B,GAAwB,IAApByI,EAASnR,OACX,MAAM,IAAIiR,MAAM,+CAA+CxH,EAAQ/B,KAAK,gBAAgB+B,EAAQjD,kCAEtGJ,KAAK2K,mBAAmBI,EAASrI,GAAG,IACpC1C,KAAKyK,eACN,CAGM,YAAAQ,CAAalL,GAClB,GAAIA,EAAKqB,MAEP,YADApB,KAAK8K,cAAc/K,GAGrB,GAAIA,EAAKW,OAGP,OAFAV,KAAKiK,eAAelK,QACpBC,KAAKkK,kBAIP,IAAI1L,EACJ,IAFAwB,KAAKgK,SAASjK,EAAM,GAGlBC,KAAK0I,UAAUnI,YACd/B,EAAQwB,KAAK0I,UAAUxF,WAAW,KACnC1E,EAAM+B,YAAc/B,EAAMuC,QAC1B,CACA,GAAIvC,EAAM4C,MAER,YADApB,KAAK8K,cAActM,GAGrBwB,KAAKgK,SAASxL,EAAO,EACtB,CACDwB,KAAKkK,iBACN,CAGM,WAAAgB,CAAYnL,GACjB,GAAIA,EAAKqB,MAEP,YADApB,KAAKgL,eAAejL,GAGtB,GAAIA,EAAKW,OAGP,OAFAV,KAAKuK,YAAYxK,QACjBC,KAAKyK,gBAIP,IAAIjM,EACJ,IAFAwB,KAAKqK,OAAOtK,EAAMA,EAAKmD,WAAWtJ,QAGhCoG,KAAK6I,QAAQtI,WACbP,KAAK+I,UAAY,IAChBvK,EAAQwB,KAAK6I,QAAQ3F,WAAWlD,KAAK+I,UAAY,KAClDvK,EAAM+B,YAAc/B,EAAMuC,QAC1B,CACA,GAAIvC,EAAM4C,MAER,YADApB,KAAKgL,eAAexM,GAGtBwB,KAAKqK,OAAO7L,EAAOA,EAAM0E,WAAWtJ,OACrC,CACDoG,KAAKyK,eACN,CAMM,MAAAU,GACL,MAAMjC,EAAclJ,KAAKkJ,YACzB,IAAI1K,EACJ,KACEwB,KAAK0I,UAAUnI,YACd/B,EAAQwB,KAAK0I,UAAUxF,WAAWlD,KAAK4I,eACxCpK,EAAM+B,YAAc/B,EAAMuC,SAAWvC,EAAM4C,OAE3CpB,KAAKgK,SAASxL,EAAO,GAEvB,GAAI0K,EACFlJ,KAAKkK,uBAGP,KACElK,KAAK6I,QAAQtI,WACbP,KAAK+I,UAAY,IAChBvK,EAAQwB,KAAK6I,QAAQ3F,WAAWlD,KAAK+I,UAAY,KAClDvK,EAAM+B,YAAc/B,EAAMuC,SAAWvC,EAAM4C,OAE3CpB,KAAKqK,OAAO7L,EAAOA,EAAM0E,WAAWtJ,OAEvC,CAGM,QAAAwR,GACL,MAAMC,EAAerL,KAAK0I,UAAU/G,QAAQ,YAC5C,GAAI0J,EAAazR,OAAS,EAAG,CAC3B,MAAM0R,EAAatL,KAAKuF,QACxB+F,EAAWpB,kBACPoB,EAAW9B,WACbxJ,KAAKmK,cAAckB,GAEnBrL,KAAKiK,eAAeoB,EAEvB,CACD,MAAME,EAAavL,KAAK6I,QAAQlH,QAAQ,YACxC,GAAI4J,EAAW3R,OAAS,EAAG,CACzB,MAAM4R,EAAWxL,KAAKuF,QACtBiG,EAASf,gBACLe,EAASpC,UACXpJ,KAAKsK,aAAaiB,GAElBvL,KAAKuK,YAAYgB,EAEpB,CACF,CAGM,UAAAE,GACL,MAAMC,EAAa1L,KAAK0I,UAAU/G,QAAQ,SACpCgK,EAAW3L,KAAK6I,QAAQlH,QAAQ,SACtC,GAA0B,IAAtB+J,EAAW9R,QAAgB+R,EAAS/R,OAAS,GAAK+R,EAAS/J,SAG7D,OAFA5B,KAAKsK,aAAaqB,QAClB3L,KAAKmL,SAGiB,IAApBQ,EAAS/R,QAAgB8R,EAAW9R,OAAS,GAAK8R,EAAW9J,WAC/D5B,KAAKmK,cAAcuB,GACnB1L,KAAKmL,SAER,CAeM,UAAAS,GACL,IAAK5L,KAAKkJ,YAAa,CAErB,GAAIlJ,KAAK6I,QAAQtI,WAAgC,IAAnBP,KAAK+I,UAAiB,CAClD,IAAIhJ,EAAOC,KAAK6I,QAChB,KAA8B,IAAvB9I,EAAK0D,OAAO7J,QACjBmG,EAAOA,EAAKgC,SAEd/B,KAAKsK,aAAavK,EACnB,CAED,YADAC,KAAKmL,QAEN,CACD,GAAInL,KAAK0I,UAAUhI,OACjB,OAEF,MAAMmL,EAAY7L,KAAK0I,UAAUxF,WAAWlD,KAAK4I,aAC7CiD,IAAcA,EAAUtK,YAAcsK,EAAUjL,UAClDZ,KAAKiL,aAAaY,EAErB,CAGM,KAAAC,GACL9L,KAAKoL,WACLpL,KAAKyL,aACLzL,KAAK4L,YACN,CAGM,WAAAG,GACL,IAAIC,EAUJ,OAPIA,EAFAhM,KAAK0I,UAAUhI,OACQ,IAArBV,KAAK4I,YACI5I,KAAK0I,UAAUjF,OAEfzD,KAAK0I,UAGP1I,KAAK0I,UAAUxF,WAAWlD,KAAK4I,YAAc,GAEnDoD,QAAAA,EAAY,IAAInM,CACxB,CAGM,WAAAoM,GACL,IAAI3H,EAUJ,OAPIA,EAFAtE,KAAK6I,QAAQnI,OACXV,KAAK+I,YAAc/I,KAAK6I,QAAQzG,OAAOxI,OAC9BoG,KAAK6I,QAAQlF,OAEb3D,KAAK6I,QAGP7I,KAAK6I,QAAQ3F,WAAWlD,KAAK+I,WAEnCzE,QAAAA,EAAY,IAAIzE,CACxB,CAGM,QAAAqM,GACL,GAAIlM,KAAKkJ,YAAa,CACpB,MAAMiD,EAAWnM,KAAK0I,UAAU/G,QAAQ,YACxC,OAAOwK,EAASvS,OAAS,EAAI,CAAEuS,GAAa,EAC7C,CACD,MAAMpO,EAAoB,GACpBqO,EAAcpM,KAAKuF,QACzB6G,EAAYhB,WACZ,IAAK,MAAM5M,KAAS4N,EAAYpD,eAAe5E,YACzC5F,EAAM4C,OAASgL,EAAYhC,eAAe5L,IAC5CT,EAASC,KAAKQ,GAGlB,OAAOT,CACR,CAGM,SAAAsO,GACL,GAAIrM,KAAKkJ,YAAa,CACpB,MAAMU,EAAa5J,KAAK0I,UAAUtF,uBAClC,OAAIwG,EAAW1I,QACN,GAEF0I,EAAWhI,SAAW,CAAEgI,GAAe,EAC/C,CACD,MAAMA,EAAa5J,KAAK0I,UAAUtF,uBAC5ByG,EAAW7J,KAAK6I,QAAQzF,uBAC9B,GACEwG,EAAWhI,UACXgI,EAAWxP,IAAI,IACfwP,EAAWxP,IAAI,KAAOyP,EAASzP,IAAI,GAEnC,OAAOwP,EAAW1I,QAAU,GAAK,CAAE0I,GAErC,MAAM0C,EAAkB,GAClBF,EAAcpM,KAAKuF,QACzB6G,EAAY3B,gBACZ,IAAK,MAAMjM,KAASwB,KAAKgJ,eAAe5E,YAClC5F,EAAMoC,UAAYpC,EAAM0C,SAAW1C,EAAMqD,aAEJ,IAAvCuK,EAAYtC,aAAatL,EAAO,IAChCwB,KAAKoK,eAAe5L,IAEpB8N,EAAOtO,KAAKQ,GAGhB,GAAI8N,EAAO1S,OAAS,EAClB,OAAO0S,EAET,IAAK,MAAM9N,KAASwB,KAAKgJ,eAAe5E,YAClC5F,EAAMoC,UAAYpC,EAAM0C,UACzB0I,EAAWrH,UAAU/D,IAAUqL,EAAStH,UAAU/D,KACnDwB,KAAKoK,eAAe5L,IACpB8N,EAAOtO,KAAKQ,GAGhB,OAAO8N,CACR,CAGM,QAAAC,CAASC,GAAU,GACxB,MAAMC,EAAiB,GACvB,GAAIzM,KAAKgJ,eAAetI,QAAU8L,GAET,IAArBxM,KAAK4I,aACL5I,KAAK+I,YAAc/I,KAAKgJ,eAAe5G,OAAOxI,OAG9C,OADA6S,EAAMzO,KAAKgC,KAAKgJ,gBACTyD,EAGX,MAAMC,EAAa1M,KAAKuF,QACxBmH,EAAWxC,kBACX,MAAMsB,EAAWxL,KAAKuF,QACtBiG,EAASf,gBACT,IAAK,MAAM1K,KAAQC,KAAKgJ,eAAe5E,YAAa,CAClD,MAAM2F,EAAc7L,SAASuK,cAG7B,GAFAsB,EAAYI,cAAcpK,EAAK3F,IAAI,IACnC2P,EAAYS,UAAS,GACjBgB,EAASlC,kBAAkBvJ,IAAS,EACtC,MAEE2M,EAAWjD,iBAAiB1J,GAAQ,IAClCA,EAAKe,QAEEf,EAAKW,QAAU8L,IADxBC,EAAMzO,KAAK+B,EAKhB,CACD,OAAO0M,CACR,CAIM,WAAAE,GACL,MAAM5M,EAAOC,KAAK0I,UACZN,EAASpI,KAAK4I,YACpB,IAAItF,EAAQvD,EAAKoD,eAIjB,GAHIG,EAAM5B,YACR4B,EAAQvD,EAAKyD,oBAEM,IAAjBF,EAAM1J,OACR,MAAO,GAET,MAAMgT,EAAY,IAAIrE,EACtBqE,EAAU3C,eAAe3G,GACzBsJ,EAAUvC,OAAOtK,EAAMqI,GACvB,MAAM/J,EAAYiK,EAAM,WACxBjK,EAAUsJ,OAAOiF,EAAUC,iBAC3B,MAAMzK,EAAO/D,EAAU+D,OACvB,MAAa,KAATA,GAAe/D,EAAUiE,KAAK,YAAY1I,OAAS,EAC9C,IAEFwI,CACR,CAIM,YAAA0K,GACL,MAAM/M,EAAOC,KAAK6I,QACZT,EAASpI,KAAK+I,UACpB,IAAIzF,EAAQvD,EAAKoD,eAIjB,GAHIG,EAAM5B,YACR4B,EAAQvD,EAAKyD,oBAEM,IAAjBF,EAAM1J,OACR,MAAO,GAET,MAAMmT,EAAa,IAAIxE,EACvBwE,EAAW/C,SAASjK,EAAMqI,GAC1B2E,EAAWxC,YAAYjH,GACvB,MAAMjF,EAAYiK,EAAM,WACxBjK,EAAUsJ,OAAOoF,EAAWF,iBAC5B,MAAMzK,EAAO/D,EAAU+D,OACvB,MAAa,KAATA,GAAe/D,EAAUiE,KAAK,YAAY1I,OAAS,EAC9C,IAEFwI,CACR,CAGM,KAAAmD,GACL,OAAO,IAAIgD,EAAMvI,KAAKwI,MAAMwE,aAC7B,CAGM,aAAAH,GACL,OAAO7M,KAAKwI,MAAMqE,eACnB,CAGM,KAAAxN,GACLA,EAAM,6BACNA,EAAM,cAAeW,KAAK0I,UAAUjN,WAAY,YAAauE,KAAK4I,aAClEvJ,EAAM,YAAaW,KAAK6I,QAAQpN,WAAY,YAAauE,KAAK+I,UAC/D,WC1kBakE,EAAWlN,EAAaqI,EAAgB8E,GACtD,MAAM1E,EAAQ,IAAID,EAClB,IAAIxG,EACJ,GAAIhC,EAAKW,OAAQ,CACfqB,EAAShC,EAAKgC,SACd,MAAMsG,EAAUtI,EAAKoI,UAAUC,GAC/BI,EAAM2B,cAAcpK,GACA,KAAhBA,EAAKqC,QACPrC,EAAKuG,SAEgB,KAAnB+B,EAAQjG,QACViG,EAAQ/B,QAEX,MACCkC,EAAMwB,SAASjK,EAAMqI,GACrBrG,EAAShC,EAEX,GAAoB,SAAhBgC,EAAO1B,MAAmC,SAAhB0B,EAAO1B,KACnC,OAAO,KAET,GAAI0B,EAAO3H,IAAI,KAAO8S,EAAU9S,IAAI,GAClC,OAAO,KAEToO,EAAM0B,kBACN,MAAMiD,EAAWpL,EAAOwD,QACxB,IAAI/G,EAAQuD,EAAO8B,QACnB,KAAOrF,EAAM5E,OAAS,KAChB4O,EAAMc,kBAAkB9K,IAAU,IADf,CAIvB,MAAM8F,EAAW9F,EAAMmF,OACvBwJ,EAASxF,OAAOnJ,GAChBA,EAAQ8F,CACT,CAED,OADAvC,EAAO6F,OAAOuF,GACVpL,EAAOA,SAASnI,OAAS,GAAKmI,EAAOA,SAAS3H,IAAI,KAAO8S,EAAU9S,IAAI,GAClE6S,EAAWlL,EAAOA,SAAUA,EAAOnH,QAASsS,GAE9C,CACLE,KAAMD,EACNE,MAAOtL,EAEX,CCpDgB,SAAAuL,EAAcjQ,EAAgB0C,GAC5C,IAAIvB,EAAQnB,EACZ,KAAOmB,EAAM5E,OAAS,GAAG,CACvB,IAAIkK,EAAatF,EAAMqF,QACvB,KAAOC,EAAWpD,QAAUoD,EAAW5B,SACrC4B,EAAaA,EAAWH,OAE1B,GAAInF,EAAMkC,QAAUlC,EAAM4C,MACxB,MAEF,GAAI5C,EAAM+B,WAAyC,IAA5B/B,EAAM0E,WAAWtJ,QAAgBkK,EAAW3C,WAAY,CAC7E3C,EAAMgJ,QAAQzH,GACd,KACD,CACD,GAAIvB,EAAM+B,YAAc/B,EAAMuC,QAAgC,IAAtB+C,EAAWlK,OAAc,CAC/D4E,EAAMmJ,OAAO5H,GACb,KACD,CACDvB,EAAQsF,CACT,CACH,CCpBM,SAAUyJ,EAASjK,GACvB,GAAqB,IAAjBA,EAAM1J,OACR,OAEF,MAAMmE,EAAoB,GAC1B,IAAIS,EAAQ8E,EAAMO,QAClB,KAAOrF,EAAM5E,OAAS,GAAG,CACvB,MAAM0K,EAAW9F,EAAMmF,OAClBnF,EAAMkC,QAA2B,KAAjBlC,EAAM4D,QACzBrE,EAASC,KAAKQ,GAEhBA,EAAQ8F,CACT,EAEqB,IAApBvG,EAASnE,QAAoC,OAArBmE,EAAS,GAAGsC,MAChB,IAApBtC,EAASnE,QAAqC,OAArBmE,EAAS,GAAGsC,MAAiBtC,EAAS,GAAGoD,aAElEpD,EAAS,GAAGuI,SAEU,IAApBvI,EAASnE,QAAgBmE,EAAS,GAAGoD,YAAmC,OAArBpD,EAAS,GAAGsC,MACjEtC,EAAS,GAAGuI,QAEhB,CClBA,SAASkH,EAAczN,GACrB,GAAIA,EAAKW,OACP,MAAO,CACLX,OACAqI,OAAQrI,EAAKqC,OAAOxI,QAGxB,MAAM4O,EAAQ,IAAID,EAElB,OADAC,EAAM+B,YAAYxK,GACX,CACLA,KAAMyI,EAAMK,QACZT,OAAQI,EAAMO,UAElB,CAcgB,SAAA0E,EAAW1N,EAAa2N,GACtC,MAAMC,EAAoBD,EAC1B,GAAI,CAAC,KAAM,MAAMtS,QAAQ2E,EAAKM,OAAS,EAAG,CACxC,MAAMuN,EAAO7N,EAAKuC,KAAK,MACvBvC,EAAO6N,EAAKlL,GAAGkL,EAAKhU,OAAS,EAC9B,CACD,GAAI,CAAC,KAAM,MAAMwB,QAAQsS,EAAUrN,OAAS,EAAG,CAC7C,MAAMuN,EAAOF,EAAUpL,KAAK,MAC5BoL,EAAYE,EAAKlL,GAAG,EACrB,CACD,GAAI3C,EAAKW,QAAUgN,EAAUhN,QAAUX,EAAKgB,QAAU2M,EAAU3M,OAC9D,OAAOyM,EAAczN,GAEvBwN,EAASxN,GACTwN,EAASG,GACL3N,EAAKa,SAAWb,EAAKmC,SAAWwL,EAAUxL,SAC5CoL,EAAcvN,EAAMuI,EAAM,WAE5B,MAAMhE,EAAWvE,EAAKgE,OAChB8J,EAAgBH,EAAU7J,QAChC,IAAIrF,EAAQqP,EACZ,KAAOrP,EAAM5E,OAAS,GAAG,CACvB,MAAM+J,EAAOnF,EAAMmF,OACnB5D,EAAK4H,OAAOnJ,GACZA,EAAQmF,CACT,CAED,OADAgK,EAAkBrH,SAEhBhC,EAAS1K,OAAS,GAClBiU,EAAcjU,OAAS,GACvB0K,EAAS/D,YACR+D,EAASlD,OACVkD,EAASiB,OAAM,GAAOnL,IAAI,GAAG0T,YAAYD,EAActI,OAAM,GAAOnL,IAAI,IAEjEqT,EAAWnJ,EAAUuJ,GAEN,IAApBvJ,EAAS1K,OACJ,CACLmG,OACAqI,OAAQ,GAGLoF,EAAclJ,EACvB,CC1EM,SAAUyJ,EAAW1Q,GACzB,IAAImB,EAAQnB,EACZ,KAAOmB,EAAM5E,OAAS,GAAG,CACvB,IAAIkK,EAAatF,EAAMqF,QAIvB,GAHIC,EAAWpD,QAAUoD,EAAW5B,UAClC4B,EAAaA,EAAWH,QAEtBnF,EAAM+B,YAAc/B,EAAMuC,QAAgC,IAAtB+C,EAAWlK,OACjD,MAEF4E,EAAQsF,CACT,CACD,OAAOtF,CACT,CCZgB,SAAAwP,EAAajQ,EAAmBkQ,GAE9C,GADAA,EAAUA,QAAAA,EAAW3F,EAAM,SACH,IAApBvK,EAASnE,OACX,OAAOqU,EAGT,MAAMC,EAAiBH,EADvBE,EAAUA,EAAQ1I,OAAM,IAMxB,OAJAxH,EAAS,GAAG6J,OAAOqG,GACnBlQ,EAASrD,SAAQqF,IACfmO,EAAevG,OAAO5H,EAAK,IAEtBkO,CACT,CCbM,SAAUE,EAAUpO,GACxB,IAAK,MAAMvB,KAASuB,EAAKqE,YACvB,GAAI5F,EAAMkC,QAAUlC,EAAM4D,OAAOxI,OAAS,EAAG,CAC3C,MAAMwN,EAAY5I,EAAM4D,OACpB,SAAShE,KAAKI,EAAM4D,UACtB5D,EAAMpE,IAAI,GAAGgN,UAAYA,EAAUtN,QAAQ,UAAW,IAEzD,CAEL,CCRgB,SAAAsU,EAAc/Q,EAAgBgR,GAC5C,MAAMC,EAAgBjR,EAAQjD,IAAI,GAC5BmU,EAAajG,EAAMjO,CAAY,IAAIgU,QACzC,IAAK,MAAM/M,KAAQgN,EAAcE,WAC/BD,EAAWjN,KAAKA,EAAKjB,KAAMiB,EAAKrH,OAElC,IAAIuE,EAAQnB,EAAQwG,QACpB,KAAMrF,EAAM5E,OAAS,GAAG,CACtB,MAAM0K,EAAW9F,EAAMmF,OACvB4K,EAAW5G,OAAOnJ,GAClBA,EAAQ8F,CACT,CAED,OADAjH,EAAQyK,YAAYyG,GACbA,CACT,CChBM,SAAUE,EAAgBnC,GAC9B,GAAsB,IAAlBA,EAAO1S,OACT,OAEF,MAAM8U,EAAapC,EAAO,GACpBqC,EAAYrC,EAAOA,EAAO1S,OAAS,GACnCgV,EAAwB,GAE9B,IAAI5C,EAAW0C,EAAWjL,OAC1B,KAAOuI,EAASpS,OAAS,GACD,OAAlBoS,EAAS3L,MAGbuO,EAAa5Q,KAAKgO,GAClBA,EAAWA,EAASvI,OAEtBmL,EAAa9L,UACb8L,EAAa5Q,QAAQsO,GAErB,IAAIhI,EAAWqK,EAAUhL,OACzB,KAAOW,EAAS1K,OAAS,GACD,OAAlB0K,EAASjE,MAGbuO,EAAa5Q,KAAKsG,GAClBA,EAAWA,EAASX,OAGtB,IAAI/I,EAAQ,EACZ,IAAK,MAAM0I,KAASsL,EAAc,CAChC,MAAMnL,EAAOH,EAAMG,OAInB,GAHoB,IAAhBA,EAAK7J,QAA8B,OAAd6J,EAAKpD,OAC5BzF,EAAQ,GAES,OAAf0I,EAAMjD,KAAe,CACL,OAAdoD,EAAKpD,MAAiBoD,EAAKnC,KAAK,YAAcgC,EAAMhC,KAAK,YAC3D1G,EAAQ,GAEV,MAAMiU,EAAevL,EAAMhC,KAAK,SAC1BwN,EAAgBlU,EAAMa,SAAS,IACjCoT,IAAiBC,GACnBxL,EAAMhC,KAAK,QAASwN,GAEtBlU,GACD,CACF,CACH,CC7CgB,SAAAmU,EAAezL,EAAckB,GAC3C,GAAIlB,EAAMrC,OAAQ,CAChB,IAAI+N,EAASzT,OAAOC,SAAS8H,EAAMhC,KAAK,UAAW,KAAO,EAM1D,GALa,aAATkD,EACFwK,IAEAA,IAEEA,GAAU,EACZA,EAAS,OACJ,GAAIA,EAAS,GAClB,OAQF,OANe,IAAXA,EACF1L,EAAMwC,WAAW,UAEjBxC,EAAMhC,KAAK,SAAU0N,EAAOvT,SAAS,UAEvCgT,EAAgB,CAAEnL,GAEnB,CACD,IAAIrJ,EAAQsB,OAAOC,SAAS8H,EAAMkD,IAAI,eAAgB,KAAO,EAChD,aAAThC,GAAiC,IAAVvK,GAA4C,KAA7BqJ,EAAMkD,IAAI,gBAIvC,aAAThC,EACFvK,GAAS,GAETA,GAAS,GAEPA,GAAS,IACXA,EAAQ,GAEI,IAAVA,EACFqJ,EAAMkD,IAAI,cAAe,IAEzBlD,EAAMkD,IAAI,cAAe,GAAGvM,QAd5BqJ,EAAMkD,IAAI,cAAe,GAgB7B,CCsBA,MAAMyI,EAAY,IAAIlQ,IAEtB,SAASmQ,IAAS,CAGlB,MAAMC,EAAW,CACfC,WAAY,YACZC,UAAW,CACTC,gBAAiBJ,EACjBK,eAAgBL,EAChBM,kBAAmBN,EACnBO,iBAAkBP,EAClBQ,kBAAmBR,EACnBS,iBAAkBT,EAClBU,uBAAwBV,EACxBW,sBAAuBX,EACvBY,sBAAuBZ,GAGzBa,KAAM,CACJpS,MAAO,QACPqS,eAAiBC,GAAqD,SAApCA,EAAIxO,aAAa,eACnDyO,eAAiBD,GAAsD,SAArCA,EAAIxO,aAAa,gBACnD0O,aAAcjB,EACdkB,iBAAkBlB,IA8BtB,SAASmB,EAAoBC,EAAelQ,GAC1C,OAAQkQ,EAAIC,QAAQ1P,IAAIT,EAC1B,CAEA,SAASoQ,EAAeF,EAAelQ,EAAYqQ,GAEjD,OADcH,EAAII,MAAMtW,IAAIqW,IAAexB,GAC9BpO,IAAIT,EACnB,CAEA,SAASuQ,EAA2BL,EAAevQ,GACjD,MAAM6Q,EAAQN,EAAII,MAAMtW,IAAI2F,IAASkP,EACrC,IAAK,MAAM7O,KAAMwQ,EACfN,EAAIC,QAAQnK,IAAIhG,EAEpB,CAEA,SAASyQ,EAAuBP,EAAeQ,EAAaC,GAC1D,MAAMC,EAAYV,EAAII,MAAMtW,IAAI0W,IAAU7B,EAC1C,IAAIgC,EAAa,EACjB,IAAK,MAAM7Q,KAAM4Q,EAGXX,EAAoBC,EAAKlQ,IAAOoQ,EAAeF,EAAKlQ,EAAI2Q,MACxDE,EAGN,OAAOA,CACT,CAUA,SAASC,EAAqBnR,EAAe2Q,GAC3C,MAAMS,EAAapR,EAAKqR,cAElBC,EAAatR,EAAKpB,iBAAiB,QACzC,IAAK,MAAMsR,KAAOoB,EAAY,CAC5B,IAAIC,EAA0BrB,EAG9B,KAAOqB,IAAYH,GAAyB,MAAXG,GAAiB,CAChD,IAAIV,EAAQF,EAAMtW,IAAIkX,GAET,MAATV,IACFA,EAAQ,IAAI7R,IACZ2R,EAAMa,IAAID,EAASV,IAErBA,EAAMxK,IAAI6J,EAAI7P,IACdkR,EAAUA,EAAQF,aACnB,CACF,CACH,CAYA,SAASI,EAAYC,EAAqB1J,GACxC,MAAM2I,EAAQ,IAAIpX,IAGlB,OAFA4X,EAAqBO,EAAYf,GACjCQ,EAAqBnJ,EAAY2I,GAC1BA,CACT,CAEA,SAASgB,EAAmBC,EAAkB5J,EAAqB6J,GAEjE,MAAO,CACLpP,OAAQmP,EACR5J,aACA6J,OAJFA,EAlGF,SAAuBA,GACrB,MAAMC,EAAwB,CAAA,EAc9B,OAZAC,OAAOC,OAAOF,EAAa1C,GAC3B2C,OAAOC,OAAOF,EAAaD,GAG3BC,EAAYxC,UAAY,GACxByC,OAAOC,OAAOF,EAAYxC,UAAWF,EAASE,WAC9CyC,OAAOC,OAAOF,EAAYxC,UAAWuC,EAAOvC,WAG5CwC,EAAY9B,KAAO,GACnB+B,OAAOC,OAAOF,EAAY9B,KAAMZ,EAASY,MACzC+B,OAAOC,OAAOF,EAAY9B,KAAM6B,EAAO7B,MAChC8B,CACT,CAkFWG,CAAcJ,GAKrBxC,WAAYwC,EAAOxC,WACnB6C,aAAcL,EAAOK,aACrBC,kBAAmBN,EAAOM,kBAC1BxB,MAAOc,EAAYG,EAAS5J,GAC5BwI,QAAS,IAAIxR,IACbsQ,UAAWuC,EAAOvC,UAClBU,KAAM6B,EAAO7B,KAEjB,CAEA,SAASoC,EAAarB,EAAgBC,EAAgBT,GACpD,OAAa,MAATQ,GAA0B,MAATC,IAGjBD,EAAMtQ,WAAauQ,EAAMvQ,UAAYsQ,EAAMsB,UAAYrB,EAAMqB,UAC9C,KAAbtB,EAAM1Q,IAAa0Q,EAAM1Q,KAAO2Q,EAAM3Q,IAGnCyQ,EAAuBP,EAAKQ,EAAOC,GAAS,GAGvD,CAEA,SAASsB,GAAYvB,EAAgBC,GACnC,OAAa,MAATD,GAA0B,MAATC,IAGdD,EAAMtQ,WAAauQ,EAAMvQ,UAAYsQ,EAAMsB,UAAYrB,EAAMqB,QACtE,CAEA,SAASE,GAAWC,EAAgBjC,GAClCK,EAA2BL,EAAKiC,IACkB,IAA9CjC,EAAIjB,UAAUK,kBAAkB6C,KAEnCA,EAAqBjM,SACtBgK,EAAIjB,UAAUM,iBAAiB4C,GACjC,CAEA,SAASC,GAAmBC,EAAsBC,EAAoBpC,GACpE,IAAIqC,EAAqBF,EACzB,KAAOE,GAASA,IAAUD,GAAc,CACtC,MAAMH,EAAWI,EACjBA,EAAQA,EAAM/O,YACd0O,GAAWC,EAAUjC,EACtB,CAED,OADAK,EAA2BL,EAAKoC,GACzBA,EAAa9O,WACtB,CAQA,SAASgP,GAAe7K,EAAqB8K,EAAoBC,EAAmBC,EAAsBzC,GAGxG,MAAM0C,EAA2BnC,EAAuBP,EAAKwC,EAAUD,GAEvE,IAAII,EAAiB,KAGrB,GAAID,EAA2B,EAAG,CAChCC,EAAiBF,EAKjB,IAAIG,EAAkB,EACtB,KAAyB,MAAlBD,GAAwB,CAG7B,GAAId,EAAaW,EAAUG,EAA2B3C,GACpD,OAAO2C,EAKT,GADAC,GAAmBrC,EAAuBP,EAAK2C,EAAgBlL,GAC3DmL,EAAkBF,EAGpB,OAAO,KAITC,EAAiBA,EAAerP,WACjC,CACF,CACD,OAAOqP,CACT,CAQA,SAASE,GAAcpL,EAAqB8K,EAAoBC,EAAgBC,EAAsBzC,GAEpG,IAAI8C,EAAkCL,EAClCnP,EAAckP,EAASlP,YACvByP,EAAwB,EAE5B,KAA6B,MAAtBD,GAA4B,CAEjC,GAAIvC,EAAuBP,EAAK8C,EAAoBrL,GAAc,EAGhE,OAAO,KAIT,GAAIsK,GAAYS,EAAqBM,GACnC,OAAOA,EAGT,GAAIf,GAAYzO,EAAwBwP,KAGtCC,IACAzP,EAAcA,EAAcA,EAAYA,YAAc,KAIlDyP,GAAyB,GAC3B,OAAO,KAKXD,EAAqBA,EAAqBA,EAAmBxP,YAAc,IAC5E,CAED,OAAOwP,CACT,CA0DA,SAASE,GAAaxC,EAAaC,EAAaT,GAC9C,OAAI+B,GAAYvB,EAAkBC,GACzB,GAAKF,EAAuBP,EAAKQ,EAAOC,GAE1C,CACT,CA6BA,SAASwC,GAAgBjS,EAAckS,EAAaC,EAAoBnD,GACtE,QAAa,UAAThP,IAAoBgP,EAAI4B,mBAAqBsB,IAAOtV,SAASwV,iBAGK,IAA/DpD,EAAIjB,UAAUO,uBAAuBtO,EAAMkS,EAAIC,EACxD,CA8DA,SAASE,GAAehC,EAAe5J,EAAkBuI,SACvD,IAAIA,EAAI2B,cAAgBN,IAAYzT,SAASwV,cAEtC,OAAkB,MAAd3L,GACwC,IAA7CuI,EAAIjB,UAAUK,kBAAkBiC,GAA2BA,GAE9DA,EAAoBrL,SACrBgK,EAAIjB,UAAUM,iBAAiBgC,GACxB,MACGU,GAAYV,EAAoB5J,KASmB,IAAzDuI,EAAIjB,UAAUG,kBAAkBmC,EAAS5J,KA7DjD,SAAsB9E,EAAeuQ,EAAalD,GAChD,MAAM9L,EAAOvB,EAAKzC,SAIlB,GAAa,IAATgE,EAA+B,CACjC,MAAMoP,EAAiB3Q,EAAKuL,WACtBqF,EAAeL,EAAGhF,WACxB,IAAK,MAAMsF,KAAiBF,EACtBL,GAAgBO,EAAczT,KAAMmT,EAAI,SAAUlD,IAGlDkD,EAAG/R,aAAaqS,EAAczT,QAAUyT,EAAc7Z,QACxDuZ,EAAG3N,aAAaiO,EAAczT,KAAMyT,EAAc7Z,OAClDqW,EAAIjB,UAAUQ,sBAAsBiE,EAAczT,KAAMmT,EAAI,WAIhE,IAAK,IAAI7Z,EAAIka,EAAaja,OAAS,EAAGD,GAAK,EAAGA,IAAK,CACjD,MAAMoa,EAAcF,EAAala,GAC7B4Z,GAAgBQ,EAAY1T,KAAMmT,EAAI,SAAUlD,IAG/CrN,EAAK2C,aAAamO,EAAY1T,QACjCmT,EAAGzN,gBAAgBgO,EAAY1T,MAC/BiQ,EAAIjB,UAAUQ,sBAAsBkE,EAAY1T,KAAMmT,EAAI,UAE7D,CACF,CAEY,IAAThP,GAAqC,IAATA,GAC1BgP,EAAGpM,YAAcnE,EAAKmE,YACxBoM,EAAGpM,UAAYnE,EAAKmE,UAG1B,CA2BI4M,CAAajM,EAAuB4J,EAAoBrB,IACS,IAA7DA,EAAIjB,UAAUS,sBAAsB6B,EAAS5J,IA3ErD,SAAoCkM,EAA6B3D,GAC/D,OAAOA,EAAI4B,mBAAqB+B,IAA0B/V,SAASwV,aACrE,CAyE+EQ,CAA2BvC,EAASrB,IAC7G6D,GAAcpM,EAAY4J,EAASrB,GAErCA,EAAIjB,UAAUI,iBAAiBkC,EAAS5J,IALmC4J,IAR1B,IAA7CrB,EAAIjB,UAAUK,kBAAkBiC,KACc,IAA9CrB,EAAIjB,UAAUC,gBAAgBvH,GAD6B4J,GAGxC,QAAvBxX,EAAAwX,EAAQP,qBAAe,IAAAjX,GAAAA,EAAA6N,aAAaD,EAAY4J,GAChDrB,EAAIjB,UAAUE,eAAexH,GAC7BuI,EAAIjB,UAAUM,iBAAiBgC,GACxB5J,EAUX,CAwBA,SAASoM,GAAcC,EAAiBvB,EAAiBvC,GAEvD,IAEIwC,EAFAuB,EAAeD,EAAUtQ,WACzBiP,EAAiBF,EAAU/O,WAI/B,KAAOuQ,GAAc,CAMnB,GAJAvB,EAAWuB,EACXA,EAAevB,EAASlP,YAGF,MAAlBmP,EAAwB,CAC1B,IAAgD,IAA5CzC,EAAIjB,UAAUC,gBAAgBwD,GAAqB,OAEvDD,EAAUnL,YAAYoL,GACtBxC,EAAIjB,UAAUE,eAAeuD,GAC7BnC,EAA2BL,EAAKwC,GAChC,QACD,CAGD,GAAIX,EAAaW,EAAqBC,EAA2BzC,GAAM,CACrEqD,GAAeZ,EAAgBD,EAAUxC,GACzCyC,EAAiBA,EAAenP,YAChC+M,EAA2BL,EAAKwC,GAChC,QACD,CAGD,MAAMwB,EAAa1B,GAAewB,EAAsBvB,EAAsBC,EAAqBC,EAAgBzC,GAGnH,GAAIgE,EAAY,CACdvB,EAAiBP,GAAmBO,EAAgBuB,EAAYhE,GAChEqD,GAAeW,EAAYxB,EAAUxC,GACrCK,EAA2BL,EAAKwC,GAChC,QACD,CAGD,MAAMyB,EAAYpB,GAAciB,EAAsBvB,EAAsBC,EAAUC,EAAgBzC,GAGtG,GAAIiE,EACFxB,EAAiBP,GAAmBO,EAAgBwB,EAAWjE,GAC/DqD,GAAeY,EAAWzB,EAAUxC,GACpCK,EAA2BL,EAAKwC,OAHlC,CASA,IAAgD,IAA5CxC,EAAIjB,UAAUC,gBAAgBwD,GAAqB,OAEvDD,EAAUpL,aAAaqL,EAAUC,GACjCzC,EAAIjB,UAAUE,eAAeuD,GAC7BnC,EAA2BL,EAAKwC,EAR/B,CASF,CAGD,KAA0B,OAAnBC,GAAyB,CAE9B,MAAMR,EAAWQ,EACjBA,EAAiBA,EAAenP,YAChC0O,GAAWC,EAAUjC,EACtB,CACH,CAEA,SAASkE,GAAuB7C,EAAkB8C,EAA+BnE,GAC/E,GAAuB,cAAnBA,EAAIlB,WAIN,OADA+E,GAAcM,EAAsB9C,EAASrB,GACtCqB,EAAQzO,SAGjB,GAAuB,cAAnBoN,EAAIlB,YAAgD,MAAlBkB,EAAIlB,WAAoB,CAG5D,MAAMsF,EAjOV,SAA2B3M,EAAkB4J,EAAerB,GAC1D,IAAIqE,EACJA,EAAiB5M,EAAWjE,WAC5B,IAAI8Q,EAAcD,EACdE,EAAQ,EACZ,KAAOF,GAAgB,CACrB,MAAMG,EAAWxB,GAAaqB,EAAgBhD,EAASrB,GACnDwE,EAAWD,IACbD,EAAcD,EACdE,EAAQC,GAEVH,EAAiBA,EAAe/Q,WACjC,CACD,OAAOgR,CACT,CAmNsBG,CAAkBN,EAAsB9C,EAASrB,GAG7D5M,EAAkBgR,aAAA,EAAAA,EAAWhR,gBAC7BE,EAAc8Q,aAAA,EAAAA,EAAW9Q,YAGzBoR,EAAcrB,GAAehC,EAAS+C,EAAmBpE,GAE/D,OAAIoE,EAhRR,SAAwBhR,EAAuBsR,EAAmBpR,WAChE,MAAMqR,EAAQ,GACRC,EAAQ,GACd,IAAIzR,EAAoBC,EACxB,KAAe,MAARD,GACLwR,EAAMjX,KAAKyF,GACXA,EAAOA,EAAKC,gBAEd,KAAOuR,EAAMrb,OAAS,GAAG,CACvB,MAAMmG,EAAOkV,EAAME,MACnBD,EAAMlX,KAAK+B,GACPA,IACyB,QAA3B5F,EAAA6a,EAAY5D,qBAAe,IAAAjX,GAAAA,EAAAsN,aAAa1H,EAAMiV,GAEjD,CACDE,EAAMlX,KAAKgX,GACX,IAAIrR,EAAoBC,EACxB,KAAe,MAARD,GACLsR,EAAMjX,KAAK2F,GACXuR,EAAMlX,KAAK2F,GACXA,EAAOA,EAAKC,YAEd,KAAOqR,EAAMrb,OAAS,GAAG,CACvB,MAAMmG,EAAOkV,EAAME,MACfpV,IACuB,QAAzBqV,EAAAJ,EAAY5D,qBAAa,IAAAgE,GAAAA,EAAE3N,aAAa1H,EAAMiV,EAAYpR,aAE7D,CACD,OAAOsR,CACT,CAsPaG,CAAe3R,EAAyBsR,EAAqBpR,GAG/D,EACR,CACD,KAAM,wCAA0C0M,EAAIlB,YACtD,CAKM,SAAUkG,GAAMvV,EAAa2N,EAAkBkE,EAAqB,CAAA,GACxE,MAAM2D,EAxTR,SAA0BxN,GACxB,GAAkB,MAAdA,EAGF,OADoB7J,SAASI,cAAc,OAG7C,GAAIyJ,aAAsBlJ,KAAM,CAC9B,GAAIkJ,EAAWyN,qBAEb,OAAOzN,EAGT,MAAM0N,EAAcvX,SAASI,cAAc,OAE3C,OADAmX,EAAY9N,OAAOI,GACZ0N,CACR,CAGD,MAAMA,EAAcvX,SAASI,cAAc,OAC3C,IAAK,MAAM2R,IAAO,IAAIlI,GACpB0N,EAAY9N,OAAOsI,GAErB,OAAOwF,CACT,CAiS4BC,CAAiBhI,EAAUtT,IAAI,IACnDkW,EAAMoB,EAAmB3R,EAAK3F,IAAI,GAAemb,EAAmB3D,GAC1E4C,GAAuBzU,EAAK3F,IAAI,GAAemb,EAAmBjF,EACpE,CCtmBA,SAASqF,GAAQC,GACf,MAAMxT,EAAOwT,EAAIC,cAAgBD,EAAIE,SACrC,IAAK1T,EACH,OAAOA,EAGT,IACE,OAAO2T,KAAKC,MAAM5T,EACnB,CAAC,MAAO6T,GACP,OAAO7T,CACR,CACH,CAEM,SAAU8T,GAAQC,GACtB,MAAMP,EAAM,IAAIQ,eAEZD,EAAOE,YAAcT,EAAIU,SAC3BV,EAAIU,OAAOC,WAAcN,IACnBA,EAAEO,MAAQ,IACZP,EAAEQ,QAAWR,EAAES,OAAST,EAAEO,MAAS,KAEjCL,EAAOE,YACTF,EAAOE,WAAWJ,EACnB,GAIL,MAAMU,EAAW,IAAIC,SAEftX,EAAO6W,EAAO7W,MAAQ,GAC5BwS,OAAOrY,KAAK6F,GAAM5E,SAAQgC,IACxB,MAAMzC,EAAQqF,EAAK5C,GAEfuD,MAAMC,QAAQjG,GAChBA,EAAMS,SAAQoK,IAGZ6R,EAAShP,OAAO,GAAGjL,MAASoI,EAAK,IAKrC6R,EAAShP,OAAOjL,EAAKzC,EAAuB,IAG9C,MAAM4c,EAAWV,EAAOU,UAAY,OAChCV,EAAOW,gBAAgBC,KACzBJ,EAAShP,OAAOkP,EAAUV,EAAOW,KAAOX,EAAOW,KAAazW,MAE5DsW,EAAShP,OAAOkP,EAAUV,EAAOW,MAGnClB,EAAIoB,QAAWf,IACTE,EAAOc,SACTd,EAAOc,QAAQhB,EAChB,EAGHL,EAAIsB,OAAS,KAGX,GAAItB,EAAIuB,OAAS,KAAOvB,EAAIuB,QAAU,IAAK,CACzC,IAAKhB,EAAOc,QACV,OAEF,OAAOd,EAAOc,QA1EpB,SAAkBd,EAA6BP,GAC7C,MAAMwB,EAAM,UAAUjB,EAAOkB,UAAUlB,EAAOmB,UAAU1B,EAAIuB,UACtDI,EAAM,IAAI1M,MAAMuM,GAItB,OAHAG,EAAIJ,OAASvB,EAAIuB,OACjBI,EAAIF,OAASlB,EAAOkB,OACpBE,EAAIC,IAAMrB,EAAOmB,OACVC,CACT,CAmE4BE,CAAStB,EAAQP,GAAMD,GAAQC,GACtD,CACD,GAAKO,EAAOuB,UAGZ,OAAOvB,EAAOuB,UAAU/B,GAAQC,GAAMA,EAAI,EAG5CA,EAAI+B,KAAKxB,EAAOkB,OAAQlB,EAAOmB,QAAQ,GAGnCnB,EAAOyB,iBAAmB,oBAAqBhC,IACjDA,EAAIgC,iBAAkB,GAGxB,MAAMC,EAAU1B,EAAO0B,SAAW,GAgBlC,OAZoC,OAAhCA,EAAQ,qBACVjC,EAAIkC,iBAAiB,mBAAoB,kBAG3ChG,OAAOrY,KAAKoe,GAASnd,SAAQqd,IACR,OAAfF,EAAQE,IACVnC,EAAIkC,iBAAiBC,EAAGF,EAAQE,GACjC,IAGHnC,EAAIoC,KAAKrB,GAEFf,CACT,oYCnIaqC,GAIX,WAAAnY,CAAYoY,GACVlY,KAAKkY,SAAWA,QAAAA,EAAYha,SAASia,wBACtC,CAGM,IAAA7V,CAAKU,GACV,MAAMjF,EAAyB,GAC/B,IAAIS,EAAQ,IAAIqB,EAAMG,KAAKkY,SAASpU,YACpC,KAAOtF,EAAM5E,OAAS,GAChB4E,EAAMuE,QAAQC,GAChBjF,EAASC,KAAKQ,EAAMpE,IAAI,IACfoE,EAAM+B,WACf/B,EAAM8D,KAAKU,GAAUL,MAAK5C,IACxBhC,EAASC,KAAK+B,EAAK,IAGvBvB,EAAQA,EAAMmF,OAEhB,OAAO,IAAI9D,EAAM9B,EAClB,CAGM,MAAA4J,CAAO5H,GACZA,EAAK4C,MAAKyV,IACRpY,KAAKkY,SAASxQ,YAAY0Q,EAAW,GAExC,ECtBH,MAKMC,GAA+B,mBAAXC,OACpBC,GAA6B,mBAAhBC,YAA6B,IAAIA,iBAAgBrd,EAC9Dsd,GAA6B,mBAAhBC,YAA6B,IAAIA,iBAAgBvd,EAE9Dwd,GAAS1Y,MAAM2Y,UAAUC,MAAMC,KADvB,qEAERC,GAAS,CAAEC,IACb,IAAIC,EAAM,CAAA,EAEV,OADAD,EAAEte,SAAQ,CAACwe,EAAGvf,IAAMsf,EAAIC,GAAKvf,IACtBsf,CACV,EAJc,CAIZN,IACGQ,GAAQ,0EACRC,GAAUvf,OAAOwf,aAAaC,KAAKzf,QACnC0f,GAAsC,mBAApBC,WAAWvW,KAC7BuW,WAAWvW,KAAKqW,KAAKE,YACpBC,GAAO,IAAID,WAAWvZ,MAAM2Y,UAAUC,MAAMC,KAAKW,EAAI,IACtDC,GAAcC,GAAQA,EACvB7f,QAAQ,KAAM,IAAIA,QAAQ,UAAW8f,GAAa,KAANA,EAAY,IAAM,MAC7DC,GAAYC,GAAMA,EAAEhgB,QAAQ,oBAAqB,IAIjDigB,GAAgBC,IAElB,IAAIC,EAAKC,EAAIC,EAAIC,EAAIC,EAAM,GAC3B,MAAMC,EAAMN,EAAIpgB,OAAS,EACzB,IAAK,IAAID,EAAI,EAAGA,EAAIqgB,EAAIpgB,QAAS,CAC7B,IAAKsgB,EAAKF,EAAIO,WAAW5gB,MAAQ,MAC5BwgB,EAAKH,EAAIO,WAAW5gB,MAAQ,MAC5BygB,EAAKJ,EAAIO,WAAW5gB,MAAQ,IAC7B,MAAM,IAAI6gB,UAAU,2BACxBP,EAAOC,GAAM,GAAOC,GAAM,EAAKC,EAC/BC,GAAO1B,GAAOsB,GAAO,GAAK,IACpBtB,GAAOsB,GAAO,GAAK,IACnBtB,GAAOsB,GAAO,EAAI,IAClBtB,GAAa,GAANsB,EAChB,CACD,OAAOK,EAAMD,EAAIxB,MAAM,EAAGyB,EAAM,GAAK,MAAMvf,UAAUuf,GAAOD,CAAG,EAO7DI,GAAwB,mBAATC,KAAuBV,GAAQU,KAAKV,GACnD3B,GAAc2B,GAAQ1B,OAAOrV,KAAK+W,EAAK,UAAUve,SAAS,UACtDse,GACJY,GAAkBtC,GACjBuC,GAAQtC,OAAOrV,KAAK2X,GAAKnf,SAAS,UAClCmf,IAGC,IAAIC,EAAO,GACX,IAAK,IAAIlhB,EAAI,EAAGmhB,EAAIF,EAAIhhB,OAAQD,EAAImhB,EAAGnhB,GAFvB,KAGZkhB,EAAK7c,KAAKob,GAAQ1Z,MAAM,KAAMkb,EAAIG,SAASphB,EAAGA,EAHlC,QAKhB,OAAO8gB,GAAMI,EAAKG,KAAK,IAAI,EAW7BC,GAAW/B,IACb,GAAIA,EAAEtf,OAAS,EAEX,OADIshB,EAAKhC,EAAEqB,WAAW,IACV,IAAOrB,EACbgC,EAAK,KAAS9B,GAAQ,IAAQ8B,IAAO,GACjC9B,GAAQ,IAAa,GAAL8B,GACf9B,GAAQ,IAAS8B,IAAO,GAAM,IAC3B9B,GAAQ,IAAS8B,IAAO,EAAK,IAC7B9B,GAAQ,IAAa,GAAL8B,GAG9B,IAAIA,EAAK,MAC0B,MAA5BhC,EAAEqB,WAAW,GAAK,QAClBrB,EAAEqB,WAAW,GAAK,OACzB,OAAQnB,GAAQ,IAAS8B,IAAO,GAAM,GAChC9B,GAAQ,IAAS8B,IAAO,GAAM,IAC9B9B,GAAQ,IAAS8B,IAAO,EAAK,IAC7B9B,GAAQ,IAAa,GAAL8B,EACzB,EAECC,GAAU,gDAMVC,GAAQC,GAAMA,EAAEvhB,QAAQqhB,GAASF,IAEjCK,GAAUjD,GACTyB,GAAMxB,OAAOrV,KAAK6W,EAAG,QAAQre,SAAS,UACvCgd,GACKqB,GAAMa,GAAgBlC,GAAIze,OAAO8f,IACjCA,GAAMW,GAAMW,GAAKtB,IAMtB9f,GAAS,CAAC2f,EAAK4B,GAAU,IAAUA,EACnC7B,GAAW4B,GAAQ3B,IACnB2B,GAAQ3B,GASR6B,GAAU,8EACVC,GAAWC,IACb,OAAQA,EAAK9hB,QACT,KAAK,EACD,IAGmCwO,IAHxB,EAAOsT,EAAKnB,WAAW,KAAO,IACjC,GAAOmB,EAAKnB,WAAW,KAAO,IAC9B,GAAOmB,EAAKnB,WAAW,KAAO,EAC/B,GAAOmB,EAAKnB,WAAW,IAAmB,MACjD,OAAQnB,GAA0B,OAAjBhR,IAAW,KACtBgR,GAA2B,OAAT,KAAThR,IACnB,KAAK,EACD,OAAOgR,IAAU,GAAOsC,EAAKnB,WAAW,KAAO,IACvC,GAAOmB,EAAKnB,WAAW,KAAO,EAC/B,GAAOmB,EAAKnB,WAAW,IAClC,QACI,OAAOnB,IAAU,GAAOsC,EAAKnB,WAAW,KAAO,EACxC,GAAOmB,EAAKnB,WAAW,IACrC,EAOCoB,GAAQC,GAAMA,EAAE9hB,QAAQ0hB,GAASC,IAIjCI,GAAgBxB,IAGlB,GADAA,EAAMA,EAAIvgB,QAAQ,OAAQ,KACrBqf,GAAM/a,KAAKic,GACZ,MAAM,IAAIG,UAAU,qBACxBH,GAAO,KAAKxB,MAAM,GAAkB,EAAbwB,EAAIzgB,SAC3B,IAAIkiB,EAAeC,EAAIC,EAAdhC,EAAM,GACf,IAAK,IAAIrgB,EAAI,EAAGA,EAAI0gB,EAAIzgB,QACpBkiB,EAAM/C,GAAOsB,EAAIxf,OAAOlB,OAAS,GAC3Bof,GAAOsB,EAAIxf,OAAOlB,OAAS,IAC1BoiB,EAAKhD,GAAOsB,EAAIxf,OAAOlB,QAAU,GACjCqiB,EAAKjD,GAAOsB,EAAIxf,OAAOlB,OAC9BqgB,GAAc,KAAP+B,EAAY3C,GAAQ0C,GAAO,GAAK,KAC1B,KAAPE,EAAY5C,GAAQ0C,GAAO,GAAK,IAAKA,GAAO,EAAI,KAC5C1C,GAAQ0C,GAAO,GAAK,IAAKA,GAAO,EAAI,IAAW,IAANA,GAEvD,OAAO9B,CAAG,EAORiC,GAAwB,mBAATC,KAAuB7B,GAAQ6B,KAAKrC,GAASQ,IAC5DhC,GAAcgC,GAAQ/B,OAAOrV,KAAKoX,EAAK,UAAU5e,SAAS,UACtDogB,GAEJM,GAAgB9D,GACfW,GAAMO,GAASjB,OAAOrV,KAAK+V,EAAG,WAC9BA,GAAMO,GAAS0C,GAAMjD,GAAGxe,MAAM,IAAI0C,KAAIgc,GAAKA,EAAEqB,WAAW,MAMzD6B,GAAU/D,GACTW,GAAMV,OAAOrV,KAAK+V,EAAG,UAAUvd,SAAS,QACzC8c,GACKS,GAAMT,GAAI8D,OAAOF,GAAcnD,IAC/BA,GAAM2C,GAAKM,GAAMjD,IACtBsD,GAAUtD,GAAMa,GAASb,EAAElf,QAAQ,SAAU8f,GAAa,KAANA,EAAY,IAAM,OAMtEyC,GAAU1C,GAAQyC,GAAQE,GAAO3C,IA4CjC4C,GASMviB,GATNuiB,GAcMF,+RCrQZ,IAAIxb,EAAMiR,OAAO8G,UAAU4D,eACvBC,EAAS,IASb,SAASC,IAAW,CA4BpB,SAASC,EAAGC,EAAIC,EAASC,GACvB9c,KAAK4c,GAAKA,EACV5c,KAAK6c,QAAUA,EACf7c,KAAK8c,KAAOA,IAAQ,CACrB,CAaD,SAASC,EAAYC,EAAS9X,EAAO0X,EAAIC,EAASC,GAChD,GAAkB,mBAAPF,EACT,MAAM,IAAIpC,UAAU,mCAGtB,IAAI/V,EAAW,IAAIkY,EAAGC,EAAIC,GAAWG,EAASF,GAC1CG,EAAMR,EAASA,EAASvX,EAAQA,EAMpC,OAJK8X,EAAQE,QAAQD,GACXD,EAAQE,QAAQD,GAAKL,GAC1BI,EAAQE,QAAQD,GAAO,CAACD,EAAQE,QAAQD,GAAMxY,GADhBuY,EAAQE,QAAQD,GAAKjf,KAAKyG,IADlCuY,EAAQE,QAAQD,GAAOxY,EAAUuY,EAAQG,gBAI7DH,CACR,CASD,SAASI,EAAWJ,EAASC,GACI,KAAzBD,EAAQG,aAAoBH,EAAQE,QAAU,IAAIR,SAC5CM,EAAQE,QAAQD,EAC7B,CASD,SAASI,IACPrd,KAAKkd,QAAU,IAAIR,EACnB1c,KAAKmd,aAAe,CACrB,CAzEGrL,OAAOwL,SACTZ,EAAO9D,UAAY9G,OAAOwL,OAAO,OAM5B,IAAIZ,GAASa,YAAWd,GAAS,IA2ExCY,EAAazE,UAAU4E,WAAa,WAClC,IACIC,EACApd,EAFAqd,EAAQ,GAIZ,GAA0B,IAAtB1d,KAAKmd,aAAoB,OAAOO,EAEpC,IAAKrd,KAASod,EAASzd,KAAKkd,QACtBrc,EAAIiY,KAAK2E,EAAQpd,IAAOqd,EAAM1f,KAAKye,EAASpc,EAAKwY,MAAM,GAAKxY,GAGlE,OAAIyR,OAAO6L,sBACFD,EAAME,OAAO9L,OAAO6L,sBAAsBF,IAG5CC,CACT,EASAL,EAAazE,UAAUiF,UAAY,SAAmB3Y,GACpD,IAAI+X,EAAMR,EAASA,EAASvX,EAAQA,EAChC4Y,EAAW9d,KAAKkd,QAAQD,GAE5B,IAAKa,EAAU,MAAO,GACtB,GAAIA,EAASlB,GAAI,MAAO,CAACkB,EAASlB,IAElC,IAAK,IAAIjjB,EAAI,EAAGmhB,EAAIgD,EAASlkB,OAAQmkB,EAAK,IAAI9d,MAAM6a,GAAInhB,EAAImhB,EAAGnhB,IAC7DokB,EAAGpkB,GAAKmkB,EAASnkB,GAAGijB,GAGtB,OAAOmB,CACT,EASAV,EAAazE,UAAUoF,cAAgB,SAAuB9Y,GAC5D,IAAI+X,EAAMR,EAASA,EAASvX,EAAQA,EAChC2Y,EAAY7d,KAAKkd,QAAQD,GAE7B,OAAKY,EACDA,EAAUjB,GAAW,EAClBiB,EAAUjkB,OAFM,CAGzB,EASAyjB,EAAazE,UAAU3T,KAAO,SAAcC,EAAO+Y,EAAIC,EAAIC,EAAIC,EAAIC,GACjE,IAAIpB,EAAMR,EAASA,EAASvX,EAAQA,EAEpC,IAAKlF,KAAKkd,QAAQD,GAAM,OAAO,EAE/B,IAEIqB,EACA3kB,EAHAkkB,EAAY7d,KAAKkd,QAAQD,GACzBsB,EAAMC,UAAU5kB,OAIpB,GAAIikB,EAAUjB,GAAI,CAGhB,OAFIiB,EAAUf,MAAM9c,KAAKye,eAAevZ,EAAO2Y,EAAUjB,QAAIzhB,GAAW,GAEhEojB,GACN,KAAK,EAAG,OAAOV,EAAUjB,GAAG9D,KAAK+E,EAAUhB,UAAU,EACrD,KAAK,EAAG,OAAOgB,EAAUjB,GAAG9D,KAAK+E,EAAUhB,QAASoB,IAAK,EACzD,KAAK,EAAG,OAAOJ,EAAUjB,GAAG9D,KAAK+E,EAAUhB,QAASoB,EAAIC,IAAK,EAC7D,KAAK,EAAG,OAAOL,EAAUjB,GAAG9D,KAAK+E,EAAUhB,QAASoB,EAAIC,EAAIC,IAAK,EACjE,KAAK,EAAG,OAAON,EAAUjB,GAAG9D,KAAK+E,EAAUhB,QAASoB,EAAIC,EAAIC,EAAIC,IAAK,EACrE,KAAK,EAAG,OAAOP,EAAUjB,GAAG9D,KAAK+E,EAAUhB,QAASoB,EAAIC,EAAIC,EAAIC,EAAIC,IAAK,EAG3E,IAAK1kB,EAAI,EAAG2kB,EAAO,IAAIre,MAAMse,EAAK,GAAI5kB,EAAI4kB,EAAK5kB,IAC7C2kB,EAAK3kB,EAAI,GAAK6kB,UAAU7kB,GAG1BkkB,EAAUjB,GAAGld,MAAMme,EAAUhB,QAASyB,EAC1C,KAAS,CACL,IACII,EADA9kB,EAASikB,EAAUjkB,OAGvB,IAAKD,EAAI,EAAGA,EAAIC,EAAQD,IAGtB,OAFIkkB,EAAUlkB,GAAGmjB,MAAM9c,KAAKye,eAAevZ,EAAO2Y,EAAUlkB,GAAGijB,QAAIzhB,GAAW,GAEtEojB,GACN,KAAK,EAAGV,EAAUlkB,GAAGijB,GAAG9D,KAAK+E,EAAUlkB,GAAGkjB,SAAU,MACpD,KAAK,EAAGgB,EAAUlkB,GAAGijB,GAAG9D,KAAK+E,EAAUlkB,GAAGkjB,QAASoB,GAAK,MACxD,KAAK,EAAGJ,EAAUlkB,GAAGijB,GAAG9D,KAAK+E,EAAUlkB,GAAGkjB,QAASoB,EAAIC,GAAK,MAC5D,KAAK,EAAGL,EAAUlkB,GAAGijB,GAAG9D,KAAK+E,EAAUlkB,GAAGkjB,QAASoB,EAAIC,EAAIC,GAAK,MAChE,QACE,IAAKG,EAAM,IAAKI,EAAI,EAAGJ,EAAO,IAAIre,MAAMse,EAAK,GAAIG,EAAIH,EAAKG,IACxDJ,EAAKI,EAAI,GAAKF,UAAUE,GAG1Bb,EAAUlkB,GAAGijB,GAAGld,MAAMme,EAAUlkB,GAAGkjB,QAASyB,GAGnD,CAED,OAAO,CACT,EAWAjB,EAAazE,UAAUrU,GAAK,SAAYW,EAAO0X,EAAIC,GACjD,OAAOE,EAAY/c,KAAMkF,EAAO0X,EAAIC,GAAS,EAC/C,EAWAQ,EAAazE,UAAUkE,KAAO,SAAc5X,EAAO0X,EAAIC,GACrD,OAAOE,EAAY/c,KAAMkF,EAAO0X,EAAIC,GAAS,EAC/C,EAYAQ,EAAazE,UAAU6F,eAAiB,SAAwBvZ,EAAO0X,EAAIC,EAASC,GAClF,IAAIG,EAAMR,EAASA,EAASvX,EAAQA,EAEpC,IAAKlF,KAAKkd,QAAQD,GAAM,OAAOjd,KAC/B,IAAK4c,EAEH,OADAQ,EAAWpd,KAAMid,GACVjd,KAGT,IAAI6d,EAAY7d,KAAKkd,QAAQD,GAE7B,GAAIY,EAAUjB,GAEViB,EAAUjB,KAAOA,GACfE,IAAQe,EAAUf,MAClBD,GAAWgB,EAAUhB,UAAYA,GAEnCO,EAAWpd,KAAMid,OAEd,CACL,IAAK,IAAItjB,EAAI,EAAG8jB,EAAS,GAAI7jB,EAASikB,EAAUjkB,OAAQD,EAAIC,EAAQD,KAEhEkkB,EAAUlkB,GAAGijB,KAAOA,GACnBE,IAASe,EAAUlkB,GAAGmjB,MACtBD,GAAWgB,EAAUlkB,GAAGkjB,UAAYA,IAErCY,EAAOzf,KAAK6f,EAAUlkB,IAOtB8jB,EAAO7jB,OAAQoG,KAAKkd,QAAQD,GAAyB,IAAlBQ,EAAO7jB,OAAe6jB,EAAO,GAAKA,EACpEL,EAAWpd,KAAMid,EACvB,CAED,OAAOjd,IACT,EASAqd,EAAazE,UAAU+F,mBAAqB,SAA4BzZ,GACtE,IAAI+X,EAUJ,OARI/X,GACF+X,EAAMR,EAASA,EAASvX,EAAQA,EAC5BlF,KAAKkd,QAAQD,IAAMG,EAAWpd,KAAMid,KAExCjd,KAAKkd,QAAU,IAAIR,EACnB1c,KAAKmd,aAAe,GAGfnd,IACT,EAKAqd,EAAazE,UAAUhU,IAAMyY,EAAazE,UAAU6F,eACpDpB,EAAazE,UAAUmE,YAAcM,EAAazE,UAAUrU,GAK5D8Y,EAAauB,SAAWnC,EAKxBY,EAAaA,aAAeA,EAM1BwB,EAAAC,QAAiBzB,6BC5UZ,MAAM0B,GAAmC,IAAIzlB,ICAvC0lB,GAA+B,IAAI1lB,ICiB1C2lB,GAAqD,CAAA,EAGrDC,GAAwF,CAAA,EAExFC,GAAY9kB,CAAY;;;;QAMjB+kB,GAMX,WAAAtf,CAAYC,GACV,GAHKC,KAAAkF,MAAsB,IAAImY,GAGX,iBAATtd,EAAmB,CAC5B,MAAMsf,EAAYN,GAAM3kB,IAAI2F,GAC5B,QAAkB5E,IAAdkkB,EACF,MAAM,IAAIxU,MAAM,QAAQ9K,gCAE1B,MAAMyE,EAAOxK,EAAOqlB,EAAU7a,MACxBnE,EAAOrG,EAAOqlB,EAAUhf,MAC9BL,KAAKD,KAAOuI,EAAMjO,CAAY,mBAAmBmK,YAAenE,kBAC5Dgf,EAAUplB,QACZ+F,KAAK/F,MAAQolB,EAAUplB,MAE1B,KAAM,CACL+F,KAAKD,KAAOuI,EAAMvI,GAClB,MAAMsf,EAAYN,GAAM3kB,IAAI4F,KAAKK,MACjC,QAAkBlF,IAAdkkB,EACF,MAAM,IAAIxU,MAAM,QAAQ7K,KAAKK,mCAE3Bgf,EAAUplB,QAAU+F,KAAKD,KAAK2F,QAAQ,WACxC1F,KAAK/F,MAAQolB,EAAUplB,MAE1B,CACIglB,GAAQjf,KAAKD,KAAKK,MACrB6e,GAAQjf,KAAKD,KAAKK,IAAM,CAAA,GAErB8e,GAAWlf,KAAKD,KAAKK,MACxB8e,GAAWlf,KAAKD,KAAKK,IAAM,CACzBkf,MAAO,GACPC,QAAS,IAGd,CAGO,YAAAC,GACN,IAAInhB,EAAY2B,KAAKyf,eACI,IAArBphB,EAAUzE,QACZoG,KAAKD,KAAKoH,KAAKgY,IACf9gB,EAAY2B,KAAKyf,iBAEjBphB,EAAUuG,IAAI,cACdvG,EAAUuG,IAAI,cACdvG,EAAUuG,IAAI,UAEhBvG,EAAUkG,GAAG,cAAc,KAEvBlG,EAAU2H,SAAS,sBACnB3H,EAAU2H,SAAS,qBACnB3H,EAAU2H,SAAS,uBAIrB3H,EAAU6H,SAAS,mBAAmB,IAExC7H,EAAUkG,GAAG,cAAc,KACzBlG,EAAUgI,YAAY,mBAAmB,IAE3ChI,EAAUkG,GAAG,SAAS,KACpBlF,EAAM,QAAQW,KAAKK,eAAeL,KAAKD,KAAKK,cAC5Cf,EAAMW,KAAK/F,MAAM,GAEpB,CAGD,QAAWuK,GACT,OAAOxE,KAAKD,KAAKuB,KAAK,OACvB,CAGD,QAAWjB,GACT,OAAOL,KAAKD,KAAKuB,KAAK,OACvB,CAGD,SAAWrH,GACT,MAAMA,EAAQ+F,KAAKD,KAAKuB,KAAK,SAC7B,MAAc,KAAVrH,EACK,GAEF8b,KAAKC,MAAM0J,GAAczlB,GACjC,CAGD,SAAWA,CAAMA,GACf+F,KAAKD,KAAKuB,KAAK,QAASoe,GAAc3J,KAAK4J,UAAU1lB,IACtD,CAOM,WAAA2lB,CAAYC,EAAeC,GAChC,MAAM7lB,EAAQ+F,KAAK/F,MACK,iBAAb4lB,EACT5lB,EAAM4lB,GAAYC,EAElBplB,EAAQmlB,GAAU,CAACnjB,EAAK/B,KACtBV,EAAMyC,GAAO/B,CAAG,IAGpBqF,KAAK/F,MAAQA,CACd,CAGM,OAAA8lB,CAAQrjB,GACb,OAAOuiB,GAAQjf,KAAKD,KAAKK,IAAI1D,EAC9B,CAGM,OAAAsjB,CAAQtjB,EAAazC,GAC1BglB,GAAQjf,KAAKD,KAAKK,IAAI1D,GAAOzC,CAC9B,CAGM,SAAAgmB,GACL,MAAM5hB,EAAY2B,KAAKD,KAAK4B,QAAQ,wBACpC,OAAOtD,EAAUzE,OAAS,EAAIolB,GAAQ5kB,IAAIiE,EAAU+B,SAAMjF,CAC3D,CAGM,YAAAskB,GACL,OAAOzf,KAAKD,KAAKuC,KAAK,sBACvB,CAEM,SAAA4d,CAAUZ,GACfJ,GAAWlf,KAAKD,KAAKK,IAAIkf,MAAMthB,KAAKshB,EACrC,CAGM,MAAAa,GACLjB,GAAWlf,KAAKD,KAAKK,IAAIkf,MAAQ,GACjCJ,GAAWlf,KAAKD,KAAKK,IAAImf,QAAU,GACnC,MAAMF,EAAYN,GAAM3kB,IAAI4F,KAAKK,MACjC,QAAkBlF,IAAdkkB,EACF,OAEFrf,KAAKwf,eACL,MAAM9lB,EAAU2lB,EAAUc,OAAOngB,MACjC,QAAgB7E,IAAZzB,EAAuB,CACzB,MAAM2E,EAAY2B,KAAKyf,eACjBW,EAAe/hB,EAAUkH,OAAM,GACrC6a,EAAazY,OAAOjO,GACpB4b,GAAMjX,EAAW+hB,EAClB,CACD,IAAK,MAAMd,KAASJ,GAAWlf,KAAKD,KAAKK,IAAIkf,MAAO,CAClD,MAAM9iB,EAAS8iB,SACAnkB,IAAXqB,GACF0iB,GAAWlf,KAAKD,KAAKK,IAAImf,QAAQvhB,KAAKxB,EAEzC,CACD6C,EAAM,QAAQW,KAAKK,eAAeL,KAAKD,KAAKK,eAC7C,CAGM,OAAAigB,GACL,IAAK,MAAMd,KAAWL,GAAWlf,KAAKD,KAAKK,IAAImf,QAC7CA,IAEFN,GAAQjf,KAAKD,KAAKK,IAAM,CAAA,EACxB8e,GAAWlf,KAAKD,KAAKK,IAAIkf,MAAQ,GACjCJ,GAAWlf,KAAKD,KAAKK,IAAImf,QAAU,GACnCvf,KAAKD,KAAKwH,QACVlI,EAAM,QAAQW,KAAKK,eAAeL,KAAKD,KAAKK,gBAC7C,CAGM,OAAAkgB,GACL,MAAMjB,EAAYN,GAAM3kB,IAAI4F,KAAKK,MACjC,YAAkBlF,IAAdkkB,EACK,QAEclkB,IAAnBkkB,EAAUlY,KACLnH,KAAKD,KAAKuH,YAEZ+X,EAAUlY,KAAKnH,KACvB,ECpNH,MAAMugB,GAA2B,CAC/BngB,GAAI,WACJogB,MAAO,WACP7iB,MAAO,CACL,aAAc,CAAC,OAAQ,SAAU,QAAS,UAAW,QAAS,OAC9D,cAAe,aACf,cAAe,wBAIH8iB,KACd,MAAO,CACLC,GAAE5O,OAAAC,OAAA,CAAA,EACGwO,IAELI,GAAE7O,OAAAC,OAAA,CAAA,EACGwO,IAELK,GAAE9O,OAAAC,OAAA,CAAA,EACGwO,IAELM,GAAE/O,OAAAC,OAAA,CAAA,EACGwO,IAELO,GAAEhP,OAAAC,OAAA,CAAA,EACGwO,IAELQ,GAAEjP,OAAAC,OAAA,CAAA,EACGwO,IAELS,EAAClP,OAAAC,OAAA,CAAA,EACIwO,IAELU,WACKnP,OAAAC,OAAAD,OAAAC,OAAA,CAAA,EAAAwO,IACH,CAAA/b,KAAM,CAAC,UAAW,OAAQ,UAAW,WAEvC0c,GAAEpP,OAAAC,OAAAD,OAAAC,OAAA,CAAA,EACGwO,IAAmB,CACtB/b,KAAM,YACNwK,OAAQ,UAEVmS,GAAErP,OAAAC,OAAAD,OAAAC,OAAA,CAAA,EACGwO,IAAmB,CACtB5N,MAAO,QACP3D,OAAQ,UAEVoS,GAAI,CACFnnB,MAAO,CAAC,OAAQ,UAElBonB,MAAO,CACL1jB,MAAO,CACL8I,MAAO,iBACPK,OAAQ,iBACRwa,OAAQ,UACR,eAAgB,aAChB,eAAgB,WAChB,eAAgB,UAChB,mBAAoB,YAGxBC,GAAI,CACF5jB,MAAO,CACLmJ,OAAQ,mBAGZ0a,GAAI,KACJC,GAAI,CACFC,QAAS,QACTC,QAAS,QACThkB,MAAO,CACL8I,MAAO,iBACPK,OAAQ,iBACRwa,OAAQ,UACR,eAAgB,aAChB,eAAgB,WAChB,eAAgB,UAChB,mBAAoB,UACpB,aAAc,CAAC,OAAQ,SAAU,QAAS,aAG9C,WAAY,CACV9c,KAAM,CAAC,SAAU,SACjBnE,KAAM,WACNpG,MAAO,UACPoL,MAAO,CAAC,OAAQ,SAAU,UAE5Buc,GAAI,CAAE,EACNC,GAAI,CAAE,EACNC,IAAM,CACJnI,IAAK,UACLlT,MAAO,aACPK,OAAQ,aACR,kBAAmB,UACnBib,IAAK,UACLpkB,MAAO,CACL8I,MAAO,aACPK,OAAQ,eAGZkb,KAAM,CACJxB,MAAO,WACP7iB,MAAO,CACLskB,MAAO,UACP,mBAAoB,UACpB,cAAe,UACf,YAAa,YAGjBrG,EAAG,SACHsG,OAAQ,CAAE,EACVC,GAAI,IACJxoB,EAAG,CAAE,EACL0hB,EAAG,CAAE,EACLvB,EAAG,CAAE,EACLsI,IAAK,CAAE,EACPC,IAAK,CAAE,EACPC,KAAM,CAAE,EACRtJ,EAAG,CACDwH,MAAO,WACPngB,KAAM,WACNkiB,KAAM,UACN/f,OAAQ,WACRggB,IAAK,UACLC,SAAU,WAEZ,gBAAiB,CACfje,KAAM,CAAC,SAAU,UAGvB,OC9Hake,GAMX,WAAA5iB,CAAYpG,EAAyBipB,EAAQlC,MAC3CzgB,KAAK2iB,MAAQA,EAEX3iB,KAAK4iB,OADgB,iBAAZlpB,EACKsG,KAAK6iB,UAAUnpB,GAEfA,CAEjB,CAGO,SAAAmpB,CAAU1b,GAChB,MACM2b,GADS,IAAIC,WACAC,gBAAgB7b,EAAM,aACzC,OAAO,IAAItH,EAAMijB,EAAIG,cAAc,QACpC,CAGO,gBAAOC,CAAUC,EAAWlpB,GAClC,MAAoB,iBAATkpB,EACFA,IAASlpB,EAEdgG,MAAMC,QAAQijB,GACTA,EAAK/nB,QAAQnB,IAAU,EAE5BkpB,aAAgBC,QACXD,EAAK/kB,KAAKnE,EAGpB,CAGO,uBAAOopB,CAAiBhmB,EAAgBslB,GAC9C,IAAIvQ,EAAU/U,EAAQgD,KAClBijB,EAAiBX,EAAMvQ,GAC3B,IAAKkR,EACH,MAAO,GAEqB,iBAAnBA,IACTlR,EAAUkR,EACVA,EAAiBX,EAAMvQ,IAEzB,MAAMgG,EAAa/a,EAAQjD,IAAI,GAC/B,IAAKge,EAAWmL,gBACd,OAAOnR,EAET,MAAMoR,EAA0D,IAAIlqB,IACpE,IAAK,MAAMgI,KAAQ8W,EAAW5J,WAC5B,GAAI8U,EAAehiB,EAAKjB,QACJ,UAAdiB,EAAKjB,MAAoBqiB,GAAWQ,UAAUI,EAAehiB,EAAKjB,MAAOiB,EAAKrH,QAChFupB,EAAajS,IAAIjQ,EAAKjB,KAAMiB,EAAKrH,OAEjB,UAAdqH,EAAKjB,MAAkB,CACzB,MAAMojB,EAAaH,EAAe3lB,MAC5B+lB,EAAgC,IAAIpqB,IAC1CoB,EAAQ0B,EAAWkF,EAAKrH,QAAQ,CAACyC,EAAKzC,KAChCwpB,EAAW/mB,IAAQgmB,GAAWQ,UAAUO,EAAW/mB,GAAMzC,IAC3DypB,EAASnS,IAAI7U,EAAKzC,EACnB,IAEHupB,EAAajS,IAAI,QAASmS,EAC3B,CAGL,IAAIC,EAAUvR,EACd,IAAK,MAAOwR,EAAUC,KAAcL,EAClC,GAAiB,UAAbI,EAAsB,CACxB,IAAIE,EAAc,GAClB,IAAK,MAAOC,EAAW1nB,KAAewnB,EACpCC,GAAe,GAAGC,MAAc1nB,EAAWvC,QAAQ,KAAM,cAEvC,KAAhBgqB,IACFH,GAAW,WAAWG,EAAYnnB,UAErC,MACCgnB,GAAW,IAAIC,MAAaC,KAGhC,OAAOF,CACR,CAGO,yBAAOK,CAAmB3mB,EAAgBslB,GAChD,IAAIvQ,EAAU/U,EAAQgD,KACtB,MAAMijB,EAAiBX,EAAMvQ,GAC7B,OAAKkR,GAGyB,iBAAnBA,IACTlR,EAAUkR,GAELlR,GALE,EAMV,CAMO,qBAAO6R,CAAehmB,GAC5B,MAAM6D,EAAa7D,EAAS8D,SACtBmiB,EAAcjmB,EAASwF,OACvBG,EAAc3F,EAAS0F,OAC7B,IAAIyD,EAAYnJ,EAASmE,OAkBzB,OAhBG8hB,EAAYtjB,SAAWsjB,EAAY3iB,cACnCqC,EAAYhD,SAAWgD,EAAYrC,aACb,IAAvB2iB,EAAYtqB,QAAuC,IAAvBgK,EAAYhK,QAAgBkI,EAAWlB,QAEnEwG,EAAYA,EAAUtN,QAAQ,qCAAsC,IAEnEoqB,EAAYtjB,SAAWsjB,EAAY3iB,YACb,IAAvB2iB,EAAYtqB,QAAgBkI,EAAWlB,QAEvCwG,EAAYA,EAAUtN,QAAQ,mBAAoB,KAEjD8J,EAAYhD,SAAWgD,EAAYrC,YACb,IAAvBqC,EAAYhK,QAAgBkI,EAAWlB,WAEvCwG,EAAYA,EAAUtN,QAAQ,mBAAoB,KAE7CsN,CACR,CAGM,OAAAkZ,GACL,MAAMqC,EAAQ3iB,KAAK2iB,MA4BnB,IAAIxb,EAAO,GACX,IAAK,MAAMlN,KA5BX,SAAWoK,EAAQtE,GACjB,IAAIvB,EAAQuB,EAAK8D,QACjB,KAAOrF,EAAM5E,OAAS,GAAG,CACvB,MAAM0K,EAAW9F,EAAMmF,OACvB,GAAInF,EAAMkC,aACF1G,EAAO0oB,GAAWuB,eAAezlB,SAClC,GAAIA,EAAMuC,OAAQ,CACvB,MAAM4iB,EAAUjB,GAAWW,iBAAiB7kB,EAAOmkB,GACnC,KAAZgB,SACI,IAAIA,OAEb,MAAM,GAAInlB,EAAM+B,UAAW,CAC1B,MAAMojB,EAAUjB,GAAWW,iBAAiB7kB,EAAOmkB,GAC7CwB,EAAYzB,GAAWsB,mBAAmBxlB,EAAOmkB,GACvC,KAAZgB,SACI,IAAIA,MAEPnlB,EAAM4C,cACDiD,EAAQ7F,IAEA,KAAd2lB,SACI,KAAKA,KAEd,CACD3lB,EAAQ8F,CACT,CACF,CAEmBD,CAAQrE,KAAK4iB,QAC/Bzb,GAAQlN,EAEV,OAAOkN,EAAKxK,MACb,CAGM,WAAAynB,GACL,MAAMjd,EAAOnH,KAAKsgB,UAElB,OADatgB,KAAK6iB,UAAU1b,GAChBjE,UACb,CAGM,WAAAmhB,GACL,MAAMld,EAAOnH,KAAKsgB,UACZgE,EAAOtkB,KAAK6iB,UAAU1b,GACtB+Q,EAAWha,SAASia,yBAC1B,IAAI3Z,EAAQ8lB,EAAKzgB,QACjB,KAAOrF,EAAM5E,OAAS,GAAG,CACvB,MAAM0K,EAAW9F,EAAMmF,OACvBuU,EAASxQ,YAAYlJ,EAAMpE,IAAI,IAC/BoE,EAAQ8F,CACT,CACD,OAAO4T,CACR,QCzLUqM,GAIX,WAAAzkB,CAAYpG,GACVsG,KAAKtG,QAAUA,CAChB,CAEM,OAAA4mB,GACL,IAAInZ,EAAOnH,KAAKtG,QAQhB,OAPAyN,EAAOA,EAAKrN,QAAQ,QAAS,MAC7BqN,EAAOnN,EAAOmN,EAAKxK,QACnBwK,EAAO,MAAMA,QACbA,EAAOA,EAAKrN,QAAQ,cAAe,wBACnCqN,EAAOA,EAAKrN,QAAQ,QAAS,WAC7BqN,EAAOA,EAAKrN,QAAQ,cAAe,wBACnCqN,EAAOA,EAAKrN,QAAQ,UAAW,WACxBqN,CACR,CAEM,WAAAkd,GAEL,OADmB,IAAI3B,GAAW1iB,KAAKsgB,WACrB+D,aACnB,ECpBa,SAAAG,GAAWhc,EAAczI,GACvC,GAAIyI,EAAMQ,eAAetH,UACvB,OAGF,MAAM0W,GADNrY,EAAOuI,EAAMvI,IACW3F,IAAI,GACtBqqB,EAAcjc,EAAMpO,MAC1BqqB,EAAYD,WAAWpM,GACvBqM,EAAYla,YAAY6N,GACxBqM,EAAYja,UAAS,EACvB,CCJM,SAAUka,GAAelc,GAC7B,GAAIA,EAAMQ,eAAetH,UACvB,MAAO,CACLijB,OAAQ,IAAI9kB,EACZwF,MAAO,IAAIxF,GAIf,MAAMwD,EAAUmF,EAAME,UAAU/G,QAAQ,YACxC,GAAI0B,EAAQzJ,OAAS,EAQnB,OAPI4O,EAAMY,UACR/F,EAAQ/B,KAAK,QAAS,QACbkH,EAAMgB,WACfnG,EAAQ/B,KAAK,QAAS,SAEtB+B,EAAQ/B,KAAK,QAAS,UAEjB,CACLqjB,OAAQ,IAAI9kB,EACZwF,MAAOhC,GAIX,GAAImF,EAAMU,YAAa,CACrB,MAAMsC,EAAWhD,EAAMjD,QACvBiG,EAASf,gBACT,MAAMpF,EAAQiD,EAAM,kCAEpB,OADAkc,GAAWhZ,EAAUnG,GACd,CACLsf,OAAQ,IAAI9kB,EACZwF,QAEH,CAED,MAAMiG,EAAa9C,EAAMjD,QACzB+F,EAAWpB,kBACX,MAAMya,EAASrc,EAAM,mCACrBkc,GAAWlZ,EAAYqZ,GACvB,MAAMnZ,EAAWhD,EAAMjD,QACvBiG,EAASf,gBACT,MAAMpF,EAAQiD,EAAM,kCAEpB,OADAkc,GAAWhZ,EAAUnG,GACd,CACLsf,SACAtf,QAEJ,CCrDA,SAASuf,GAAuB7kB,EAAayI,GAC3C,MAAMqc,EAAe9kB,EAAK0D,OACpBa,EAAWvE,EAAK4D,OACtB,GAAIkhB,EAAankB,QAAU4D,EAAS5D,OAAQ,CAC1C,MAAMoB,EAAa/B,EAAKgC,SACxBoM,EAAUrM,GACV/B,EAAKuG,SACLxE,EAAW1H,IAAI,GAAG0qB,WACnB,MAAM,GAA4B,IAAxBD,EAAajrB,QAAoC,IAApB0K,EAAS1K,OAAc,CAC7D,GAAImG,EAAKgC,SAASjB,QAAU0H,EAAO,CACjC,MAAMuc,EAAiB,IAAIllB,EAAM3B,SAASC,eAAe,MACzD4B,EAAK6H,OAAOmd,GACZvc,EAAM2B,cAAc4a,GACpBvc,EAAM0B,iBACP,CACDnK,EAAKuG,QACN,MACCvG,EAAKuG,QAET,CAGgB,SAAA0e,GAAWxc,EAAcyc,GACvC,MAAMN,EAASM,EAASN,OAClBtf,EAAQ4f,EAAS5f,MAEvB,GAAIsf,EAAO/qB,OAAS,GAAsB,IAAjByL,EAAMzL,OAC7BgrB,GAAuBD,OADzB,CAIA,GAAItf,EAAMzL,OAAS,GAAuB,IAAlB+qB,EAAO/qB,OAAc,CAC3C,GAAIyL,EAAMjE,MAAO,CACf,MAAM8jB,EAAM,IAAI9F,GAAI/Z,GACc,IAA9B6f,EAAIzF,eAAe7lB,QACrBsrB,EAAI/E,SAEN,MAAMgF,EAAa9f,EAAM/D,KAAK,SAS9B,MARmB,SAAf6jB,EACF3c,EAAMsC,cAAczF,GACI,WAAf8f,EACT3c,EAAMoC,UAAUvF,GAEhBmD,EAAMwC,eAAe3F,QAEvBA,EAAMS,WAAW,QAElB,CAID,OAHA0C,EAAMyB,eAAe5E,GACrBmD,EAAM0B,uBACN0a,GAAuBvf,EAAOmD,EAE/B,CACD,GAAImc,EAAO/qB,OAAS,GAAKyL,EAAMzL,OAAS,EAAG,CACzC,MAAMwrB,EAAc,IAAI7c,EACxB6c,EAAY1a,WAAWia,GACvBS,EAAY3a,iBAEiC,IAAzC2a,EAAY3b,iBAAiBpE,IAC/BmD,EAAMyB,eAAe5E,GACrBuf,GAAuBvf,GACvBmD,EAAM8B,aAAaqa,GACnBC,GAAuBD,KAEvBnc,EAAMyB,eAAe0a,GACrBC,GAAuBD,GACvBnc,EAAM8B,aAAajF,GACnBuf,GAAuBvf,GAE1B,CAvCA,CAwCH,CCvEM,SAAUggB,GAAQ7c,GACtB,GAAIA,EAAMQ,eAAetH,UACvB,OAGF+M,EADejG,EAAM6D,YAEvB,CCAM,SAAUiZ,GAAe9c,GAC7B,GAAIA,EAAMU,YACR,OAGF,GADAV,EAAMsD,QACFtD,EAAMmB,cACR,OAEF,MAAMC,EAAapB,EAAME,UAAUvF,eAC7B0G,EAAWrB,EAAMK,QAAQ1F,eACzBoiB,EAAU3b,EAAWxP,IAAI,KAAOyP,EAASzP,IAAI,GAInD,GAHoBoO,EAAMpO,MACdkrB,iBACZ9c,EAAMoD,aACF2Z,EAAS,CACX,MAAMjiB,EAAQkF,EAAM6D,YAAY,GAKhC,YAJI/I,GAASA,EAAMpB,UACjBoL,EAAchK,EAAOgF,EAAM,WAC3BE,EAAM0C,YAAY5H,IAGrB,CACD,MAAMA,EAAQkF,EAAM6D,YAAY,GAChC,IAAK/I,EACH,OAEF,MAAMkiB,EAAYliB,EAAMG,OACxB,GAAyB,IAArB+hB,EAAU5rB,OACZ,OAEF,MAAMqrB,EAAWP,GAAelc,GAChCiF,EAAW+X,EAAWliB,GACtB0hB,GAAWxc,EAAOyc,GAClBI,GAAQ7c,EACV,CCpCgB,SAAAid,GAAejd,EAAc0P,GAC3C,GAAI1P,EAAMQ,eAAetH,UACvB,OAEE8G,EAAMU,YACRV,EAAM4C,WAENka,GAAe9c,GAGjB+E,EADc/E,EAAME,UAAUvF,gBAE9B,MAAM8hB,EAAWP,GAAelc,GAChCyc,EAAS5f,MAAMuC,OAAOsQ,GACtB8M,GAAWxc,EAAOyc,GAClBzc,EAAMoD,YACR,CCjBgB,SAAA8Z,GAAeld,EAAcvO,GAC3C,MAAM2I,EAAQ0F,EAAMrO,GACdie,EAAWha,SAASia,yBAC1BvV,EAAMD,MAAKyV,IACTF,EAASxQ,YAAY0Q,EAAW,IAElCqN,GAAejd,EAAO0P,EACxB,CCsBgB,SAAAyN,GAAUnd,EAAcvO,GACtC,GAAIuO,EAAMQ,eAAetH,UACvB,OAEF,GAAI8G,EAAMU,aACJV,EAAMpH,MACR,OAIJ,GAAqB,iBAAVnH,EAAoB,CAC7B,MAAM2rB,EAAYpd,EAAM6D,YACxB,IAAK,MAAM/I,KAASsiB,EAClBtiB,EAAMkD,IAAIvM,GAEZ,MACD,CAED,MAAM4rB,EAAYvd,EAAMrO,GAClBmY,EAAUyT,EAAUxlB,KAEpBmO,EADkBqX,EAAUzrB,IAAI,GACHoU,WAC7BoX,EAAYpd,EAAM6D,YAExB,GAAIuZ,EAAUhsB,OAAS,EAAG,CACxB,MAAMqrB,EAAWP,GAAelc,GAChC,IAAK,MAAMzI,KAAQ6lB,EACjB,GAAI7lB,EAAKM,OAAS+R,GAAwC,IAA7ByT,EAAUhiB,QAAQjK,OAC7C,IAAK,MAAM0H,KAAQkN,EACjBzO,EAAKuB,KAAKA,EAAKjB,KAAMiB,EAAKrH,WAEvB,CACL,MAAMqJ,EAAQuiB,EAAUtgB,OAAM,GAC1BxF,EAAKkB,QAAkC,KAAxBlB,EAAKuB,KAAK,WAC3BgC,EAAMhC,KAAK,SAAUvB,EAAKuB,KAAK,WAEjC,MAAMwkB,EAAe/X,EAAWzK,GAChC,IAAI9E,EAAQuB,EAAK8D,QACjB,KAAMrF,EAAM5E,OAAS,GAAG,CACtB,MAAM0K,EAAW9F,EAAMmF,OACvBmiB,EAAane,OAAOnJ,GAChBsnB,EAAazlB,OAAS7B,EAAM6B,MAAuB,OAAf7B,EAAM6B,MAC5C7B,EAAM8H,QAAO,GAEf9H,EAAQ8F,CACT,CACDvE,EAAK+H,YAAYxE,EAClB,CAIH,OAFA0hB,GAAWxc,EAAOyc,QAClBI,GAAQ7c,EAET,CAED,MAAMyc,EAAWP,GAAelc,GAC1Bud,EAjFR,SAA6Bvd,GAC3B,MAAMnK,EAAYmK,EAAMQ,eAAerH,QAAQ,kCAC/C,IAAI5D,EAAoB,GACxB,GAAyB,IAArBM,EAAUzE,OACZ,OAAOmE,EAET,IAAIgC,EAAO1B,EAAUwF,QACjBmiB,GAAgB,EACpB,KAAOjmB,EAAKnG,OAAS,GAAG,CACtB,GAAImG,EAAKe,QAAUf,EAAKW,QAAUX,EAAKoB,YAAcpB,EAAKsB,YACxDtD,EAASC,KAAK+B,OACT,CACL,IAAKimB,EACH,MAEFjoB,EAAW,EACZ,CACGyK,EAAM4B,eAAerK,KACvBimB,GAAgB,GAElBjmB,EAAOA,EAAK4D,MACb,CACD,OAAO5F,CACT,CA0DwBkoB,CAAoBzd,GACpClF,EAAQ0K,EAAa+X,EAAeF,GAC1Cb,GAAWxc,EAAOyc,GAClBI,GAAQ7c,GACJlF,EAAMpB,UACRoL,EAAchK,EAAOgF,EAAM,WAC3BE,EAAM0C,YAAY5H,GAEtB,CCtFM,SAAU4iB,GAAW1d,GACzB,GAAIA,EAAMQ,eAAetH,UACvB,MAAO,CACL0L,KAAM,KACNC,MAAO,MAGP7E,EAAMU,YACRV,EAAM4C,WAENka,GAAe9c,GAEjB,MAAMzI,EAAOyI,EAAME,UACbvF,EAAepD,EAAKqD,uBAC1B,GAA4B,IAAxBD,EAAavJ,OACf,MAAO,CACLwT,KAAM,KACNC,MAAO,MAGX,IAAI8Y,EAAahjB,EAAapB,SAC1BokB,EAAWzkB,YACbykB,EAAapmB,EAAKyD,oBAEpB,MAAM4iB,EAAQnZ,EAAWlN,EAAMyI,EAAMI,YAAaud,GAClD,IAAI/Y,EAAO,KACPC,EAAQ,KA0BZ,OAzBI+Y,IACFhZ,EAAOgZ,EAAMhZ,KACbC,EAAQ+Y,EAAM/Y,QAEX+Y,GAASrmB,EAAKa,UACb4H,EAAMI,YAAc,IACtBwE,EAAOrN,EAAKmD,WAAWsF,EAAMI,YAAc,IAE7CyE,EAAQtN,EAAKmD,WAAWsF,EAAMI,aAC1ByE,IAAUA,EAAMzM,UAClByM,EAAQ,OAGRD,GAAQA,EAAKlL,SACfoL,EAAcF,EAAM9E,EAAM,WAExB+E,IACEA,EAAMnL,SACRoL,EAAcD,EAAO/E,EAAM,WAC3BE,EAAM0C,YAAYmC,IAElB7E,EAAMyC,aAAaoC,IAGvBgY,GAAQ7c,GACD,CACL4E,OACAC,QAEJ,CC7DA,SAASgZ,GAAiBtmB,GACxB,GAAIA,EAAKe,QAAUf,EAAKmC,QACtBnC,EAAKuG,cAGP,IAAK,MAAM9H,KAASuB,EAAKqE,YACnB5F,EAAMsC,QAAUtC,EAAM0D,SACxB1D,EAAM8H,QAGZ,CAGA,SAASggB,GAAkBvmB,EAAaqI,EAAgBme,GACtD,IAAInZ,EAAO,KACPC,EAAQ,KACR8Y,EAAapmB,EAAKoD,eACI,IAAtBgjB,EAAWvsB,SACbusB,EAAapmB,EAAKyD,oBAEpB,MAAM4iB,EAAQnZ,EAAWlN,EAAMqI,EAAQ+d,GAgBvC,OAfIC,IACEG,GACFF,GAAiBD,EAAMhZ,MACvBiZ,GAAiBD,EAAM/Y,OAClB+Y,EAAMhZ,KAAKlL,UACdkL,EAAOgZ,EAAMhZ,MAEVgZ,EAAM/Y,MAAMnL,UACfmL,EAAQ+Y,EAAM/Y,SAGhBD,EAAOgZ,EAAMhZ,KACbC,EAAQ+Y,EAAM/Y,QAGX,CACLD,OACAC,QAEJ,UAMgBmZ,GAAWhe,EAAc+d,GAA2B,GAClE,GAAI/d,EAAMQ,eAAetH,UACvB,MAAO,CACL0L,KAAM,KACNqZ,OAAQ,KACRpZ,MAAO,MAIX,GADA7E,EAAM4C,WACF5C,EAAMU,YAAa,CACrB,MAAMkd,EAAQE,GAAkB9d,EAAME,UAAWF,EAAMI,YAAa2d,GAQpE,OAPIH,EAAMhZ,MACR5E,EAAM2B,cAAcic,EAAMhZ,MAC1B5E,EAAM0B,mBACGkc,EAAM/Y,QACf7E,EAAMyB,eAAemc,EAAM/Y,OAC3B7E,EAAM0B,mBAED,CACLkD,KAAMgZ,EAAMhZ,KACZqZ,OAAQ,KACRpZ,MAAO+Y,EAAM/Y,MAEhB,CACD,MAAMqZ,EAAaJ,GAAkB9d,EAAME,UAAWF,EAAMI,YAAa2d,GACrEG,EAAWtZ,KACb5E,EAAM2B,cAAcuc,EAAWtZ,MACtBsZ,EAAWrZ,OACpB7E,EAAMyB,eAAeyc,EAAWrZ,OAElC,MAAMsZ,EAAWL,GAAkB9d,EAAMK,QAASL,EAAMO,UAAWwd,GAMnE,OALII,EAASvZ,KACX5E,EAAM+B,YAAYoc,EAASvZ,MAClBuZ,EAAStZ,OAClB7E,EAAM8B,aAAaqc,EAAStZ,OAEvB,CACLD,KAAMsZ,EAAWtZ,KACjBqZ,OAAQE,EAASvZ,KACjBC,MAAOsZ,EAAStZ,MAEpB,CCrDA,SAASuZ,GAAa7mB,EAAaqS,GACjC,MAAMjQ,EAAWpC,EAAKqC,OACtB,IAAIL,EAAShC,EACb,KAAMgC,EAAOnI,OAAS,GAAG,CACvB,MAAMitB,EAAa9kB,EAAOA,SAC1B,IACG8kB,EAAW/lB,QACZqB,IAAa0kB,EAAWzkB,SACvBL,EAAOrB,QAAUqB,EAAO1B,OAAS+R,GAAoC,KAAzBrQ,EAAOT,KAAK,SAEzD,MAEFS,EAAS8kB,CACV,CACD,OAAO9kB,CACT,CAGgB,SAAA+kB,GAAQte,EAAcvO,GACpC,GAAIuO,EAAMQ,eAAetH,UACvB,OAEF,IAAImkB,EAAYvd,EAAMrO,GACtB,MAAMmY,EAAUyT,EAAUxlB,KAEpB0mB,EAAgB3qB,EADHypB,EAAUvkB,KAAK,UAElC,GAAIkH,EAAMU,YAAa,CACrB,GAAIV,EAAMpH,MAAO,CACf,MAAMiC,EAAUmF,EAAME,UAAU/G,QAAQ,YAExC,GAAiB,UADL,IAAIyd,GAAI/b,GACZmB,KAAkB,CACxB,MAAMwiB,EAAW1e,EAAM,iBACnBE,EAAMY,UACR/F,EAAQuE,OAAOof,GAEf3jB,EAAQwE,MAAMmf,GAEhBxe,EAAM0C,YAAY8b,EACnB,MACCxe,EAAM4C,UAET,CAEDmC,EADc/E,EAAME,UAAUvF,gBAG9B,MAAM4hB,EAAiB,IAAIllB,EAAM3B,SAASC,eAAe,MACnDioB,EAAQI,GAAWhe,GACzB,GAAI4d,EAAMhZ,KAAM,CACd,MAAM6Z,EAlEZ,SAAyBlnB,GACvB,IAAKA,EAAKe,OACR,OAAO,KAET,IAAImmB,EAAUlnB,EAAKwF,QACf/G,EAAQuB,EAAKgE,OACjB,KAAOvF,EAAM5E,OAAS,GAAG,CACvB,GAAI4E,EAAMsC,OAAQ,CAChB,MAAMgS,EAAWtU,EAAM+G,QACvB0hB,EAAQtf,OAAOmL,GACfmU,EAAUnU,CACX,CACDtU,EAAQA,EAAMuF,MACf,CACD,OAAOkjB,CACT,CAmDsBC,CAAgBd,EAAMhZ,MAClC6Z,IACEA,EAAQ5mB,OAAS+R,GACnB6U,EAAQzgB,IAAIugB,GACZlB,EAAYoB,IAEZ3Z,EAAc2Z,EAASlC,GACvBc,EAAUle,OAAOsf,IAGtB,CAOD,MANyB,KAArBpB,EAAUzjB,QACZyjB,EAAUle,OAAOod,GAEnBP,GAAWhc,EAAOqd,GA5FtB,SAAiC9lB,GAC/B,MAAMiM,EAAWjM,EAAK0D,OAClBuI,EAASpS,OAAS,GAAKoS,EAAStL,QAAUsL,EAAS9J,SACrD8J,EAAS1F,SAEX,MAAMhC,EAAWvE,EAAK4D,OAClBW,EAAS1K,OAAS,GAAK0K,EAAS5D,QAAU4D,EAASpC,SACrDoC,EAASgC,QAEb,CAoFI6gB,CAAwBtB,QACxBrd,EAAM0C,YAAY2a,EAEnB,CACDW,GAAWhe,GACX,MAAMzK,EAAWyK,EAAM+D,UAAS,GAC1B0Y,EAAWP,GAAelc,GAChC,IAAK,MAAMzI,KAAQhC,EACjB,IAAKgC,EAAKmC,SACJnC,EAAKW,OAAQ,CACf,MAAM0mB,EAAYR,GAAa7mB,EAAMqS,GACrC,GAAIgV,EAAUtmB,QAAUsmB,EAAU/mB,OAAS+R,EACzCgV,EAAU5gB,IAAIugB,OACT,CACL,MAAMM,EAAexB,EAAUtgB,QAC/B6hB,EAAUxf,OAAOyf,GACjBA,EAAa1f,OAAOyf,EACrB,CACF,CAGLpC,GAAWxc,EAAOyc,EACpB,CCrHA,SAASoB,GAAiBtmB,GACxB,GAAIA,EAAKe,QAAUf,EAAKmC,QACtBnC,EAAKuG,cAGP,IAAK,MAAM9H,KAASuB,EAAKqE,YACnB5F,EAAMsC,QAAUtC,EAAM0D,SACxB1D,EAAM8H,QAGZ,CA4BgB,SAAAghB,GAAW9e,EAAcvO,GACvC,GAAIuO,EAAMQ,eAAetH,UACvB,OAEF,IAAI0Q,EACJ,GAAInY,EAAO,CAETmY,EADkB9J,EAAMrO,GACJoG,IACrB,CACD,GAAImI,EAAMU,YAAa,CACrB,GAAIV,EAAMpH,MACR,OAEF,GAAIgR,GAA4D,IAAjD5J,EAAMQ,eAAerH,QAAQyQ,GAASxY,OACnD,OAEF,MAAMwsB,EAAQI,GAAWhe,GAAO,GAChC,IAAK4d,EAAMhZ,KACT,OAEEgZ,EAAM/Y,OACRgZ,GAAiBD,EAAM/Y,OAEzB,MAAM0X,EAAiB,IAAIllB,EAAM3B,SAASC,eAAe,MACnD8oB,EAjDV,SAAyBlnB,EAAaqS,GACpC,IAAKrS,EAAKe,SAAWsR,EACnB,OAAO,KAET,IAAI6U,EAAUlnB,EAAKwF,QACf/G,EAAQuB,EAAKgE,OACjB,KAAOvF,EAAM5E,OAAS,GAAG,CACvB,GAAI4E,EAAMsC,QAAUtC,EAAM6B,OAAS+R,EAAS,CAC1C,MAAMU,EAAWtU,EAAM+G,QACvB0hB,EAAQtf,OAAOmL,GACfmU,EAAUnU,CACX,CACDtU,EAAQA,EAAMuF,MACf,CACD,GAAIkjB,EAAQ5mB,OAAS+R,EAAS,CAC5B,KAAI6U,EAAQpjB,QAAQjK,OAAS,GAG3B,OAAO,KAFPqtB,EAAUA,EAAQpjB,OAIrB,CACD,OAAOojB,CACT,CA2BoBC,CAAgBd,EAAMhZ,KAAMgF,GAC5C,OAAK6U,GAaL3Z,EAAc2Z,EAASlC,GACvBqB,EAAMhZ,KAAKvF,MAAMof,GACjBZ,GAAiBD,EAAMhZ,WACvB5E,EAAM0C,YAAY+b,KAfhBb,EAAMhZ,KAAKvF,MAAMkd,GACjBsB,GAAiBD,EAAMhZ,MACnB2X,EAAethB,OAAO/C,QACxB8H,EAAM2B,cAAc4a,EAAethB,QACnC+E,EAAM0B,uBACN6a,EAAeze,WAGjBkC,EAAM2B,cAAc4a,QACpBvc,EAAM0B,mBAQT,CACDsc,GAAWhe,GACX,MAAMiE,EAAQjE,EAAM+D,WACd0Y,EAAWP,GAAelc,GAChC,IAAK,MAAM+e,KAAQ9a,EACjB,IAAK2F,GAAWmV,EAAKlnB,OAAS+R,EAAS,CACrC,MAAMtQ,EAAaylB,EAAKxlB,SACxBwlB,EAAKjhB,QAAQihB,EAAKrlB,SACdJ,EAAWlI,OAAS,GACtBkI,EAAW1H,IAAI,GAAG0qB,WAErB,CAEH3W,EAAU3F,EAAMQ,gBAChBgc,GAAWxc,EAAOyc,EACpB,CC9FgB,SAAAuC,GAAWhf,EAAcvO,GACvC,GAAIuO,EAAMQ,eAAetH,UACvB,OAAO,KAET,MAAMmkB,EAAYvd,EAAMrO,GACxB,GAAIuO,EAAMU,YAAa,CACrB,IAAIue,EAAWjf,EAAMQ,eAAerH,QAAQ,KAC5C,GAAwB,IAApB8lB,EAAS7tB,OAAc,CACzB6tB,EAAW5B,EAAUtgB,OAAM,GAI3B,OAFAgI,EADc/E,EAAME,UAAUvF,gBAE9BqhB,GAAWhc,EAAOif,GACXA,CACR,CAOD,MALY,KADA5B,EAAUvkB,KAAK,SAEzBmmB,EAASnmB,KAAK,CACZihB,KAAMsD,EAAUvkB,KAAK,UAGlBmmB,CACR,CACDjB,GAAWhe,GACX,MAAMyc,EAAWP,GAAelc,GAChC,IAAK,MAAMhK,KAASgK,EAAMQ,eAAe5E,YACpB,MAAf5F,EAAM6B,MAAgBmI,EAAM4B,eAAe5L,IAC7CA,EAAM8H,QAAO,GAGjB,MAAMmhB,EAAW5B,EAAUtgB,OAAM,GACjC0f,EAASN,OAAO9c,MAAM4f,GACtB,IAAI1nB,EAAO0nB,EAAS9jB,OACpB,KAAM5D,EAAKnG,OAAS,GAAG,CACrB,MAAM0K,EAAWvE,EAAK4D,OACtB,IAAK5D,EAAKe,SAAWf,EAAKW,OACxB,MAEF+mB,EAAS9f,OAAO5H,GAChBA,EAAOuE,CACR,CAKD,OAJgC,IAA5BmjB,EAAS5jB,QAAQjK,QACnB6tB,EAASnhB,SAEX0e,GAAWxc,EAAOyc,GACXwC,CACT,OCzCaC,GAOX,WAAA5nB,CAAY8R,GACV5R,KAAK4R,OAASA,EACd5R,KAAK2nB,KAAO/V,EAAO+V,KACnB3nB,KAAKD,KAAOuI,EAAMjO,CAAY;oCACEuX,EAAOvR;YAEflF,IAApByW,EAAOgW,UACT5nB,KAAKD,KAAKuB,KAAK,WAAYsQ,EAAOgW,SAASnsB,WAE9C,CAEM,MAAA0kB,GACL,MAAMvO,EAAS5R,KAAK4R,OACdiW,EAAa7nB,KAAKD,KACxB8nB,EAAW3hB,SAAS,QAAQ0L,EAAOxP,KAAO,OAAS,iBAC/CwP,EAAOkW,SACTD,EAAWvmB,KAAK,QAASsQ,EAAOkW,SAE9BlW,EAAOmW,MACTF,EAAWlgB,OAAOiK,EAAOmW,MAEvBnW,EAAOxP,MACTylB,EAAWlgB,OAAO,SAASiK,EAAOxP,eAEpCpC,KAAK2nB,KAAKhgB,OAAOkgB,GACjBA,EAAWtjB,GAAG,cAAc,KACtBsjB,EAAWvmB,KAAK,aAGhBumB,EAAW7hB,SAAS,yBAGxB6hB,EAAW3hB,SAAS,sBAAsB,IAE5C2hB,EAAWtjB,GAAG,cAAc,KACtBsjB,EAAWvmB,KAAK,aAGpBumB,EAAWxhB,YAAY,sBAAsB,IAE/CwhB,EAAWtjB,GAAG,SAASW,IACrBA,EAAM8iB,iBACNpW,EAAOqW,SAAS,GAEnB,QCjDUC,GAOX,WAAApoB,CAAY8R,GAWV,GAoEM5R,KAAAmoB,sBAAyBjjB,IAC/B,MAAMuL,EAAa,IAAI5Q,EAAMqF,EAAM1C,QAC7B4lB,EAAYpoB,KAAKD,KAAKuC,KAAK,wBAC3B+lB,EAAWroB,KAAKD,KAAKuC,KAAK,uBAC5BmO,EAAW9O,QAAQ,wBAAwBvH,IAAI,KAAOguB,EAAUhuB,IAAI,KAGxEiuB,EAASnhB,OACThJ,SAAS6G,oBAAoB,QAAS/E,KAAKmoB,uBAAsB,EAtFjEnoB,KAAK4R,OAASA,EACd5R,KAAK2nB,KAAO/V,EAAO+V,KACnB3nB,KAAKD,KAAOuI,EAAMjO,CAAY;uCACKuX,EAAO0W,4BAA4B1W,EAAOvR;sCAC3CuR,EAAOvR;sCACPuR,EAAOmW,KAAO,OAAS;;;;YAKjC5sB,IAApByW,EAAOgW,SAAwB,CACf5nB,KAAKD,KAAKuC,KAAK,wBACvBhB,KAAK,WAAYsQ,EAAOgW,SAASnsB,WAC5C,CACF,CAGM,eAAO8sB,CAASxoB,GACrB,MAAM9F,EAAQ8F,EAAKuB,KAAK,SACxB,MAAc,KAAVrH,EACK,GAEF8b,KAAKC,MAAM0J,GAAczlB,GACjC,CAGM,eAAOuuB,CAASzoB,EAAa9F,GAClC8F,EAAKuB,KAAK,QAASoe,GAAc3J,KAAK4J,UAAU1lB,IACjD,CAEM,iBAAOwuB,CAAWC,GACvB,MAAMC,EAA+B,IAAIrvB,IACzC,IAAK,MAAMsvB,KAAYF,EAAW,CAEhC,MAAMtmB,EAAOwmB,EAASxmB,KAAKtI,QAAQ,WAAY,IAC/C6uB,EAAQpX,IAAIqX,EAAS3uB,MAAOmI,EAC7B,CACD,OAAOumB,CACR,CAEO,iBAAAE,CAAkBT,EAAkBnuB,GAC1C,MAAM6uB,EAAUV,EAAU9lB,KAAK,2BAA2BI,GAAG,GACvDqmB,EAAWD,EAAQxmB,KAAK,QAC1BymB,EAASnvB,OAAS,EACpBmvB,EAASznB,KAAK,SAAUrH,GAExB6uB,EAAQxmB,KAAK,QAAQhB,KAAK,OAAQrH,EAErC,CAEO,gBAAA+uB,CAAiBX,GACvB,MAAMzW,EAAS5R,KAAK4R,OACpB,IAAK,MAAMgX,KAAYhX,EAAO8W,UAAW,CACvC,MAKMO,EAAW3gB,EALG/O,CAAQ;qBACbS,EAAO4uB,EAAS3uB;iDACY2uB,EAASxmB;;SASpD,GALAimB,EAAS1gB,OAAOshB,GACQ,UAApBrX,EAAO0W,WACTW,EAAS3nB,KAAK,QAASsnB,EAASxmB,MAChC6mB,EAAS3mB,KAAK,4BAA4BkE,IAAI,mBAAoBoiB,EAAS3uB,QAEzE2uB,EAASb,KAAM,CACjB,MAAMmB,EAAe5gB,EAAM,+CAC3B4gB,EAAavhB,OAAOihB,EAASb,MAC7BkB,EAASzhB,QAAQ0hB,EAClB,CACD,MAAMC,EAAY9vB,EAAMe,IAAI,SAC5B,GAAI+uB,EAAW,CACb,MAAMC,EAAY9gB,EAAM,gDACxB8gB,EAAUzhB,OAAOwhB,GACjBF,EAASzhB,QAAQ4hB,EAClB,CACF,CACF,CAaO,QAAAC,GACN,MAAMzX,EAAS5R,KAAK4R,OACd0X,EAAetpB,KAAKD,KACpBsoB,EAAWiB,EAAahnB,KAAK,uBACnC,GAAIgnB,EAAahoB,KAAK,YACpB,OAEF,MAAMioB,EAAgBrB,GAASK,SAASe,GACxCjB,EAAS/lB,KAAK,6BAA6BkE,IAAI,aAAc,UAC7D6hB,EAAS/lB,KAAK,MAAMK,MAAK5C,IACvB,MAAMkpB,EAAW3gB,EAAMvI,GACvBkpB,EAAS1kB,GAAG,cAAc,KACpB0kB,EAASjjB,SAAS,gCAGtBijB,EAAS/iB,SAAS,6BAA6B,IAEjD+iB,EAAS1kB,GAAG,cAAc,KACxB0kB,EAAS5iB,YAAY,6BAA6B,IAEhDkjB,EAAcnuB,QAAQ6tB,EAAS3nB,KAAK,WAAa,GACnD2nB,EAAS3mB,KAAK,6BAA6BkE,IAAI,aAAc,UAC9D,IAEH6hB,EAAS7hB,IAAI,aAAc,UAC3B6hB,EAASrhB,KAAyB,UAApB4K,EAAO0W,SAAuB,OAAS,SAC1BgB,EAAalvB,IAAI,GACJovB,wBACvBC,EAAIpB,EAAS5hB,QAAU,GAAKhJ,OAAOkJ,YAClD0hB,EAAS7hB,IAAI,OAAQ,QACrB6hB,EAAS7hB,IAAI,QAAS,OAEtB6hB,EAAS7hB,IAAI,OAAQ,IACrB6hB,EAAS7hB,IAAI,QAAS,KAExB6hB,EAAS7hB,IAAI,aAAc,IAC3BtI,SAASwG,iBAAiB,QAAS1E,KAAKmoB,sBACzC,CAEO,UAAAuB,GACN,MAAM9X,EAAS5R,KAAK4R,OACd0X,EAAetpB,KAAKD,KACpBqoB,EAAYkB,EAAahnB,KAAK,wBAC9BrE,EAAWmqB,EAAU9lB,KAAK,uBAC1BqnB,EAAWvB,EAAU9lB,KAAK,uBAC1BsnB,EAAexB,EAAU9lB,KAAK,4BAC9B+lB,EAAWiB,EAAahnB,KAAK,uBACX,UAApBsP,EAAO0W,UACTqB,EAASplB,GAAG,cAAc,KACpB+kB,EAAahoB,KAAK,aAGtBqoB,EAASzjB,SAAS,6BAA6B,IAEjDyjB,EAASplB,GAAG,cAAc,KACxBolB,EAAStjB,YAAY,6BAA6B,IAEpDujB,EAAarlB,GAAG,cAAc,KACxB+kB,EAAahoB,KAAK,aAGtBsoB,EAAa1jB,SAAS,kCAAkC,IAE1D0jB,EAAarlB,GAAG,cAAc,KAC5BqlB,EAAavjB,YAAY,kCAAkC,MAG7D+hB,EAAU7jB,GAAG,cAAc,KACrB+kB,EAAahoB,KAAK,aAGtB8mB,EAAUliB,SAAS,8BAA8B,IAEnDkiB,EAAU7jB,GAAG,cAAc,KACzB6jB,EAAU/hB,YAAY,8BAA8B,KAGhC,UAApBuL,EAAO0W,UACTqB,EAASplB,GAAG,SAASW,IAEnB,GADAA,EAAM8iB,iBACFsB,EAAahoB,KAAK,YACpB,OAEF,MAAMrH,EAAQqvB,EAAahoB,KAAK,UAAYsQ,EAAOiY,aACnDjY,EAAOkY,SAAS7vB,EAAM,KAGe,UAApB2X,EAAO0W,UAAwBsB,EAAgBA,EAAexB,GACvE7jB,GAAG,SAASW,IACtBA,EAAM8iB,iBACNhoB,KAAKqpB,UAAU,IAEjBhB,EAAS9jB,GAAG,SAASW,IACnBA,EAAM8iB,iBACN,MAAM+B,EAAWzhB,EAAMpD,EAAM1C,QAAsBb,QAAQ,MACrD1H,EAAQ8vB,EAASzoB,KAAK,SAC5B4mB,GAASM,SAASc,EAAc,CAACrvB,IAC7BgE,EAASrE,OAAS,GACpBqE,EAASmE,KAAK2nB,EAAS3nB,QAED,UAApBwP,EAAO0W,UAAkC,KAAVruB,IACjCqvB,EAAahoB,KAAK,QAASrH,GAC3B+F,KAAK6oB,kBAAkBT,EAAWnuB,IAEpC2X,EAAOkY,SAAS7vB,GAChBouB,EAASnhB,OACThJ,SAAS6G,oBAAoB,QAAS/E,KAAKmoB,sBAAsB,GAEpE,CAEM,MAAAhI,SACL,MAAMvO,EAAS5R,KAAK4R,OACd0X,EAAetpB,KAAKD,KACpBqoB,EAAYkB,EAAahnB,KAAK,wBAC/BsP,EAAOoY,UACV5B,EAAUliB,SAAS,+BAErBkiB,EAAU5hB,IAAI,QAASoL,EAAOnL,OAC9B2hB,EAAU9mB,KAAK,QAASsQ,EAAOkW,SAC/B,MAAM7pB,EAAWmqB,EAAU9lB,KAAK,uBAC1BqnB,EAAWvB,EAAU9lB,KAAK,uBAC5BsP,EAAOmW,MACT4B,EAAShiB,OAAOiK,EAAOmW,MAErBnW,EAAOqY,YACTN,EAAShiB,OAAOiK,EAAOqY,YAEzB,MAAML,EAAexB,EAAU9lB,KAAK,4BAChCsP,EAAOoY,UACTJ,EAAajiB,OAAOiK,EAAOoY,UAE7B,MAAM3B,EAAW/f,EAAM,qCAGvB,GAFA+f,EAASniB,SAAS,QAAQ0L,EAAO0W,0BACjCJ,GAASM,SAASc,EAAc,CAAC1X,EAAOiY,eACpC5rB,EAASrE,OAAS,EAAG,CACvB,MAAM+uB,EAAUT,GAASO,WAAW7W,EAAO8W,WAC3CzqB,EAASmE,KAAqC,QAAhCjI,EAAAwuB,EAAQvuB,IAAIwX,EAAOiY,qBAAa,IAAA1vB,EAAAA,EAAIyX,EAAOiY,aAC1D,CACuB,UAApBjY,EAAO0W,UACTtoB,KAAK6oB,kBAAkBT,EAAWxW,EAAOiY,cAE3C7pB,KAAKgpB,iBAAiBX,GACtBiB,EAAa3hB,OAAOygB,GACpBkB,EAAa3hB,OAAO0gB,GACpBroB,KAAK2nB,KAAKhgB,OAAO2hB,GACjBtpB,KAAK0pB,YACN,CAEM,OAAArJ,GACLrgB,KAAKD,KAAKuG,SACVpI,SAAS6G,oBAAoB,QAAS/E,KAAKmoB,sBAC5C,EC1OH,IAAA+B,GALA,SAAkBjwB,GAChB,IAAIuK,SAAcvK,EAClB,OAAgB,MAATA,IAA0B,UAARuK,GAA4B,YAARA,EAC/C,EC5BI2lB,GCC8B,iBAAVC,IAAsBA,IAAUA,GAAOtY,SAAWA,QAAUsY,GDEhFC,GAA0B,iBAARC,MAAoBA,MAAQA,KAAKxY,SAAWA,QAAUwY,KAGxE3C,GAAOwC,IAAcE,IAAYE,SAAS,cAATA,GENjC5C,GFQaA,GEcjB6C,GAJU,WACR,OAAO7C,GAAK8C,KAAKC,KACnB,ECnBIC,GAAe,KAiBnB,IAAAC,GAPA,SAAyB3vB,GAGvB,IAFA,IAAIL,EAAQK,EAAOrB,OAEZgB,KAAW+vB,GAAavsB,KAAKnD,EAAOJ,OAAOD,MAClD,OAAOA,CACT,EChBIiwB,GAAkBC,GAGlBC,GAAc,OAelB,IAAAC,GANA,SAAkB/vB,GAChB,OAAOA,EACHA,EAAO4d,MAAM,EAAGgS,GAAgB5vB,GAAU,GAAGnB,QAAQixB,GAAa,IAClE9vB,CACN,ECXAgwB,GLGiBtD,GKLCuD,OCHdA,GAASJ,GAGTK,GAAcrZ,OAAO8G,UAGrB4D,GAAiB2O,GAAY3O,eAO7B4O,GAAuBD,GAAY1vB,SAGnC4vB,GAAiBH,GAASA,GAAOI,iBAAcnwB,EA6BnD,IAAAowB,GApBA,SAAmBtxB,GACjB,IAAIuxB,EAAQhP,GAAe1D,KAAK7e,EAAOoxB,IACnCI,EAAMxxB,EAAMoxB,IAEhB,IACEpxB,EAAMoxB,SAAkBlwB,EACxB,IAAIuwB,GAAW,CACnB,CAAI,MAAOzV,GAAK,CAEd,IAAIzZ,EAAS4uB,GAAqBtS,KAAK7e,GAQvC,OAPIyxB,IACEF,EACFvxB,EAAMoxB,IAAkBI,SAEjBxxB,EAAMoxB,KAGV7uB,CACT,ECnCI4uB,GAPctZ,OAAO8G,UAOcnd,SAavC,ICpBIkwB,GAAYC,GACZC,GDeJ,SAAwB5xB,GACtB,OAAOmxB,GAAqBtS,KAAK7e,EACnC,ECVIoxB,GATSP,MASwBQ,iBAAcnwB,ECmBnD,IC5BI2wB,GFkBJ,SAAoB7xB,GAClB,OAAa,MAATA,OACekB,IAAVlB,EAdQ,qBADL,gBAiBJoxB,IAAkBA,MAAkBvZ,OAAO7X,GAC/C0xB,GAAU1xB,GACV4xB,GAAe5xB,EACrB,EExBI8xB,GDuBJ,SAAsB9xB,GACpB,OAAgB,MAATA,GAAiC,iBAATA,CACjC,ECEA,IC5BI+xB,GAAWlB,GACXmB,GAAWL,GACXM,GDqBJ,SAAkBjyB,GAChB,MAAuB,iBAATA,GACX8xB,GAAa9xB,IArBF,mBAqBY6xB,GAAW7xB,EACvC,EClBIkyB,GAAa,qBAGbC,GAAa,aAGbC,GAAY,cAGZC,GAAe9wB,SA8CnB,IC/DIywB,GAAWnB,GACXJ,GAAMkB,GACNW,GDwCJ,SAAkBtyB,GAChB,GAAoB,iBAATA,EACT,OAAOA,EAET,GAAIiyB,GAASjyB,GACX,OA1CM,IA4CR,GAAIgyB,GAAShyB,GAAQ,CACnB,IAAIuyB,EAAgC,mBAAjBvyB,EAAMwyB,QAAwBxyB,EAAMwyB,UAAYxyB,EACnEA,EAAQgyB,GAASO,GAAUA,EAAQ,GAAMA,CAC1C,CACD,GAAoB,iBAATvyB,EACT,OAAiB,IAAVA,EAAcA,GAASA,EAEhCA,EAAQ+xB,GAAS/xB,GACjB,IAAIyyB,EAAWN,GAAWhuB,KAAKnE,GAC/B,OAAQyyB,GAAYL,GAAUjuB,KAAKnE,GAC/BqyB,GAAaryB,EAAM4e,MAAM,GAAI6T,EAAW,EAAI,GAC3CP,GAAW/tB,KAAKnE,GAvDb,KAuD6BA,CACvC,ECrDI0yB,GAAY3wB,KAAK4wB,IACjBC,GAAY7wB,KAAK8wB,IAqLrB,IAAAC,GA7HA,SAAkBC,EAAMC,EAAMC,GAC5B,IAAIC,EACAC,EACAC,EACA7wB,EACA8wB,EACAC,EACAC,EAAiB,EACjBC,GAAU,EACVC,GAAS,EACTC,GAAW,EAEf,GAAmB,mBAARX,EACT,MAAM,IAAIxS,UAzEQ,uBAmFpB,SAASoT,EAAWC,GAClB,IAAIvP,EAAO6O,EACPW,EAAUV,EAKd,OAHAD,EAAWC,OAAWjyB,EACtBqyB,EAAiBK,EACjBrxB,EAASwwB,EAAKttB,MAAMouB,EAASxP,EAE9B,CAqBD,SAASyP,EAAaF,GACpB,IAAIG,EAAoBH,EAAON,EAM/B,YAAyBpyB,IAAjBoyB,GAA+BS,GAAqBf,GACzDe,EAAoB,GAAON,GANJG,EAAOL,GAM8BH,CAChE,CAED,SAASY,IACP,IAAIJ,EAAOnD,KACX,GAAIqD,EAAaF,GACf,OAAOK,EAAaL,GAGtBP,EAAUa,WAAWF,EA3BvB,SAAuBJ,GACrB,IAEIO,EAAcnB,GAFMY,EAAON,GAI/B,OAAOG,EACHb,GAAUuB,EAAaf,GAJDQ,EAAOL,IAK7BY,CACL,CAmBoCC,CAAcR,GAClD,CAED,SAASK,EAAaL,GAKpB,OAJAP,OAAUnyB,EAINwyB,GAAYR,EACPS,EAAWC,IAEpBV,EAAWC,OAAWjyB,EACfqB,EACR,CAcD,SAAS8xB,IACP,IAAIT,EAAOnD,KACP6D,EAAaR,EAAaF,GAM9B,GAJAV,EAAW3O,UACX4O,EAAWptB,KACXutB,EAAeM,EAEXU,EAAY,CACd,QAAgBpzB,IAAZmyB,EACF,OAzEN,SAAqBO,GAMnB,OAJAL,EAAiBK,EAEjBP,EAAUa,WAAWF,EAAchB,GAE5BQ,EAAUG,EAAWC,GAAQrxB,CACrC,CAkEYgyB,CAAYjB,GAErB,GAAIG,EAIF,OAFAe,aAAanB,GACbA,EAAUa,WAAWF,EAAchB,GAC5BW,EAAWL,EAErB,CAID,YAHgBpyB,IAAZmyB,IACFA,EAAUa,WAAWF,EAAchB,IAE9BzwB,CACR,CAGD,OA3GAywB,EAAOV,GAASU,IAAS,EACrBhB,GAASiB,KACXO,IAAYP,EAAQO,QAEpBJ,GADAK,EAAS,YAAaR,GACHP,GAAUJ,GAASW,EAAQG,UAAY,EAAGJ,GAAQI,EACrEM,EAAW,aAAcT,IAAYA,EAAQS,SAAWA,GAoG1DW,EAAUI,OApCV,gBACkBvzB,IAAZmyB,GACFmB,aAAanB,GAEfE,EAAiB,EACjBL,EAAWI,EAAeH,EAAWE,OAAUnyB,CAChD,EA+BDmzB,EAAUK,MA7BV,WACE,YAAmBxzB,IAAZmyB,EAAwB9wB,EAAS0xB,EAAaxD,KACtD,EA4BM4D,CACT,YCxKA,SAASM,GAAc7uB,GACrB,MAAMqY,EAAarY,EAAK3F,IAAI,GACtBoU,EAAuB,CAAA,EAC7B,GAAI4J,EAAWmL,gBACb,IAAK,MAAMjiB,KAAQ8W,EAAW5J,WAC5BA,EAAWlN,EAAKjB,MAAQiB,EAAKrH,MAGjC,OAAOuU,CACT,OAuDaqgB,GAUX,WAAA/uB,CAAYzB,GACV,MAAMywB,EAAYrxB,OAAOsxB,eAGzB,IAAKD,EACH,MAAM,IAAIjkB,MAAM,6BAElB7K,KAAK8uB,UAAYA,EACjB9uB,KAAK3B,UAAYA,EACjB2B,KAAKwI,MAAQxI,KAAKgvB,6BACnB,CAGO,2BAAAA,GACN,GAAIhvB,KAAK8uB,UAAUG,WAAa,EAAG,CACjC,MAAMzmB,EAAQxI,KAAK8uB,UAAUI,WAAW,GACxC,OAAO,IAAI3mB,EAAMC,EAClB,CACD,OAAO,IAAID,CACZ,CAGM,yBAAA4mB,GACLnvB,KAAK8uB,UAAUM,kBACfpvB,KAAK8uB,UAAUO,SAASrvB,KAAKwI,MAAMpO,MACpC,CAGM,WAAAk1B,GACL,MAAMC,EAAWvvB,KAAKgvB,8BAClBhvB,KAAKwI,MAAMpO,QAAUm1B,EAASn1B,QAGlC4F,KAAKwI,MAAQ+mB,EACd,CAGM,aAAAC,GACL,MAAMhnB,EAAQxI,KAAKwI,MACbnK,EAAY2B,KAAK3B,UACjBoxB,EAAWpxB,EAAUiE,KAAK,mBAChC,GAAImtB,EAAS71B,OAAS,EAMpB,OALAorB,GAAWxc,EAAO,CAChBmc,OAAQ,IAAI9kB,EACZwF,MAAOoqB,SAETzvB,KAAKmvB,4BAKPnK,GAAWxc,EAAO,CAChBmc,OAHatmB,EAAUiE,KAAK,gCAI5B+C,MAHYhH,EAAUiE,KAAK,iCAK7BtC,KAAKmvB,2BACN,CAEM,eAAAO,GACL,MAAMC,EAA8B,GAGpC,OA7HJ,SAA4BA,EAA6BnnB,GACvD,IAAI1G,EAAa0G,EAAME,UAIvB,IAHI5G,EAAWpB,SACboB,EAAaA,EAAWC,UAEnBD,EAAWlI,OAAS,GACpBkI,EAAWF,UAGhB+tB,EAAa3xB,KAAK,CAChB+B,KAAM+B,EACNzB,KAAMyB,EAAWzB,KACjBmO,WAAYogB,GAAc9sB,GAC1B8tB,OAAQxzB,EAAW0F,EAAWR,KAAK,YAErCQ,EAAaA,EAAWC,QAE5B,CA0GI8tB,CAAmBF,EAAc3vB,KAAKwI,OAxG1C,SAA6BmnB,EAA6BnnB,GACxD,MAAME,EAAYF,EAAME,UACxB,IAAIpE,EACJ,GAAIoE,EAAUhI,QAAUgI,EAAUtG,OAAOxI,SAAW4O,EAAMI,YAAa,CACrE,MAAM7I,EAAO2I,EAAU/E,OACnB5D,EAAKnG,OAAS,GAAKmG,EAAKQ,YAC1B+D,EAAWvE,EAEd,CACD,GAAI2I,EAAUnI,UAAW,CACvB,MAAM2C,EAAWwF,EAAUxF,WAC3B,GAAIA,EAAStJ,OAAS,EAAG,CACvB,MAAMmG,EAAOmD,EAASsF,EAAMI,aACxB7I,GAAQA,EAAKQ,YACf+D,EAAWvE,EAEd,CACF,CACD,GAAIuE,EAAU,CACZ,IAAI9F,EAAQ8F,EACZ,KAAO9F,EAAM5E,OAAS,GAChB4E,EAAM+B,WACRovB,EAAa3xB,KAAK,CAChB+B,KAAMvB,EACN6B,KAAM7B,EAAM6B,KACZmO,WAAYogB,GAAcpwB,GAC1BoxB,OAAQxzB,EAAWoC,EAAM8C,KAAK,YAGlC9C,EAAQA,EAAMqF,OAEjB,CACH,CAyEIisB,CAAoBH,EAAc3vB,KAAKwI,OAChCmnB,CACR,CAEM,cAAAjL,GACL,OAAOA,GAAe1kB,KAAKwI,MAC5B,CAEM,UAAAwc,CAAWC,GAChB,OAAOD,GAAWhlB,KAAKwI,MAAOyc,EAC/B,CAEM,UAAAT,CAAWzkB,GAChB,OAAOykB,GAAWxkB,KAAKwI,MAAOzI,EAC/B,CAEM,cAAA0lB,CAAevN,GACpB,OAAOuN,GAAezlB,KAAKwI,MAAO0P,EACnC,CAEM,cAAAwN,CAAezrB,GACpB,OAAOyrB,GAAe1lB,KAAKwI,MAAOvO,EACnC,CAEM,cAAAqrB,GACL,OAAOA,GAAetlB,KAAKwI,MAC5B,CAEM,SAAAmd,CAAU1rB,GACf,OAAO0rB,GAAU3lB,KAAKwI,MAAOvO,EAC9B,CAEM,UAAAisB,GACL,OAAOA,GAAWlmB,KAAKwI,MACxB,CAEM,UAAAge,CAAWD,GAChB,OAAOC,GAAWxmB,KAAKwI,MAAO+d,EAC/B,CAEM,OAAAO,CAAQ7sB,GACb,OAAO6sB,GAAQ9mB,KAAKwI,MAAOvO,EAC5B,CAEM,UAAAqtB,CAAWrtB,GAChB,OAAOqtB,GAAWtnB,KAAKwI,MAAOvO,EAC/B,CAEM,OAAAorB,GACL,OAAOA,GAAQrlB,KAAKwI,MACrB,CAEM,UAAAgf,CAAWvtB,GAChB,OAAOutB,GAAWxnB,KAAKwI,MAAOvO,EAC/B,QCrMU81B,GAOX,WAAAjwB,CAAYgvB,GAJJ9uB,KAAAgwB,WAAwC,IAAI12B,IAE7C0G,KAAAkF,MAAsB,IAAImY,GAG/Brd,KAAK8uB,UAAYA,CAClB,CAEM,GAAA1oB,CAAI/F,EAAc4vB,GACvBjwB,KAAKgwB,WAAWze,IAAIlR,EAAM4vB,EAC3B,CAEM,QAAAC,GACL,OAAOjwB,MAAMgD,KAAKjD,KAAKgwB,WAAWv2B,OACnC,CAEM,OAAA02B,CAAQ9vB,GACb,MAAM+vB,EAAcpwB,KAAKgwB,WAAW51B,IAAIiG,GACxC,QAAoBlF,IAAhBi1B,EACF,MAAM,IAAIvlB,MAAM,YAAYxK,sBAE9B,OAAO+vB,CACR,CAEM,UAAAC,CAAWhwB,GAChB,MAAM+vB,EAAcpwB,KAAKmwB,QAAQ9vB,GACjC,IAAK+vB,EAAYC,WACf,OAAO,EAET,MAAMV,EAAe3vB,KAAK8uB,UAAUY,kBACpC,OAAOU,EAAYC,WAAWV,EAC/B,CAEM,UAAAW,CAAWjwB,GAChB,MAAM+vB,EAAcpwB,KAAKmwB,QAAQ9vB,GACjC,IAAK+vB,EAAYE,WACf,OAAO,EAET,MAAMX,EAAe3vB,KAAK8uB,UAAUY,kBACpC,OAAOU,EAAYE,WAAWX,EAC/B,CAEM,cAAAY,CAAelwB,GACpB,MAAM+vB,EAAcpwB,KAAKmwB,QAAQ9vB,GACjC,IAAK+vB,EAAYG,eACf,MAAO,GAET,MAAMZ,EAAe3vB,KAAK8uB,UAAUY,kBACpC,OAAOU,EAAYG,eAAeZ,EACnC,CAEM,OAAAa,CAAQnwB,KAAiBf,GAC9B,MAAM8wB,EAAcpwB,KAAKmwB,QAAQ9vB,GACjCL,KAAKkF,MAAMD,KAAK,gBAAiB5E,GACjC+vB,EAAYI,QAAQ9wB,MAAMM,KAAMV,GAChCU,KAAKkF,MAAMD,KAAK,UAAW5E,GAC3BhB,EAAM,YAAYgB,cACnB,+BCjDF,SAAWowB,GAWV,SAASC,EAAQjH,EAAGkH,GAClB,IAAIC,GAAW,MAAJnH,IAAmB,MAAJkH,GAE1B,OADWlH,GAAK,KAAOkH,GAAK,KAAOC,GAAO,KAC3B,GAAa,MAANA,CACvB,CAwBD,SAASC,EAAOC,EAAG9X,EAAG4C,EAAG6N,EAAG3P,EAAGiX,GAC7B,OAAOL,GAhBcM,EAgBQN,EAAQA,EAAQ1X,EAAG8X,GAAIJ,EAAQjH,EAAGsH,OAhBrCE,EAgB0CnX,GAf7CkX,IAAS,GAAKC,EAemCrV,GAhB1E,IAAuBoV,EAAKC,CAiB3B,CAaD,SAASC,EAAMlY,EAAG4C,EAAG1C,EAAGiY,EAAG1H,EAAG3P,EAAGiX,GAC/B,OAAOF,EAAQjV,EAAI1C,GAAO0C,EAAIuV,EAAInY,EAAG4C,EAAG6N,EAAG3P,EAAGiX,EAC/C,CAaD,SAASK,EAAMpY,EAAG4C,EAAG1C,EAAGiY,EAAG1H,EAAG3P,EAAGiX,GAC/B,OAAOF,EAAQjV,EAAIuV,EAAMjY,GAAKiY,EAAInY,EAAG4C,EAAG6N,EAAG3P,EAAGiX,EAC/C,CAaD,SAASM,EAAMrY,EAAG4C,EAAG1C,EAAGiY,EAAG1H,EAAG3P,EAAGiX,GAC/B,OAAOF,EAAOjV,EAAI1C,EAAIiY,EAAGnY,EAAG4C,EAAG6N,EAAG3P,EAAGiX,EACtC,CAaD,SAASO,EAAMtY,EAAG4C,EAAG1C,EAAGiY,EAAG1H,EAAG3P,EAAGiX,GAC/B,OAAOF,EAAO3X,GAAK0C,GAAKuV,GAAInY,EAAG4C,EAAG6N,EAAG3P,EAAGiX,EACzC,CASD,SAASQ,EAAQ9H,EAAGlL,GAKlB,IAAI5kB,EACA63B,EACAC,EACAC,EACAC,EAPJlI,EAAElL,GAAO,IAAM,KAAQA,EAAM,GAC7BkL,EAA8B,IAAzBlL,EAAM,KAAQ,GAAM,IAAWA,EAOpC,IAAIvF,EAAI,WACJ4C,GAAK,UACL1C,GAAK,WACLiY,EAAI,UAER,IAAKx3B,EAAI,EAAGA,EAAI8vB,EAAE7vB,OAAQD,GAAK,GAC7B63B,EAAOxY,EACPyY,EAAO7V,EACP8V,EAAOxY,EACPyY,EAAOR,EAEPnY,EAAIkY,EAAMlY,EAAG4C,EAAG1C,EAAGiY,EAAG1H,EAAE9vB,GAAI,GAAI,WAChCw3B,EAAID,EAAMC,EAAGnY,EAAG4C,EAAG1C,EAAGuQ,EAAE9vB,EAAI,GAAI,IAAK,WACrCuf,EAAIgY,EAAMhY,EAAGiY,EAAGnY,EAAG4C,EAAG6N,EAAE9vB,EAAI,GAAI,GAAI,WACpCiiB,EAAIsV,EAAMtV,EAAG1C,EAAGiY,EAAGnY,EAAGyQ,EAAE9vB,EAAI,GAAI,IAAK,YACrCqf,EAAIkY,EAAMlY,EAAG4C,EAAG1C,EAAGiY,EAAG1H,EAAE9vB,EAAI,GAAI,GAAI,WACpCw3B,EAAID,EAAMC,EAAGnY,EAAG4C,EAAG1C,EAAGuQ,EAAE9vB,EAAI,GAAI,GAAI,YACpCuf,EAAIgY,EAAMhY,EAAGiY,EAAGnY,EAAG4C,EAAG6N,EAAE9vB,EAAI,GAAI,IAAK,YACrCiiB,EAAIsV,EAAMtV,EAAG1C,EAAGiY,EAAGnY,EAAGyQ,EAAE9vB,EAAI,GAAI,IAAK,UACrCqf,EAAIkY,EAAMlY,EAAG4C,EAAG1C,EAAGiY,EAAG1H,EAAE9vB,EAAI,GAAI,EAAG,YACnCw3B,EAAID,EAAMC,EAAGnY,EAAG4C,EAAG1C,EAAGuQ,EAAE9vB,EAAI,GAAI,IAAK,YACrCuf,EAAIgY,EAAMhY,EAAGiY,EAAGnY,EAAG4C,EAAG6N,EAAE9vB,EAAI,IAAK,IAAK,OACtCiiB,EAAIsV,EAAMtV,EAAG1C,EAAGiY,EAAGnY,EAAGyQ,EAAE9vB,EAAI,IAAK,IAAK,YACtCqf,EAAIkY,EAAMlY,EAAG4C,EAAG1C,EAAGiY,EAAG1H,EAAE9vB,EAAI,IAAK,EAAG,YACpCw3B,EAAID,EAAMC,EAAGnY,EAAG4C,EAAG1C,EAAGuQ,EAAE9vB,EAAI,IAAK,IAAK,UACtCuf,EAAIgY,EAAMhY,EAAGiY,EAAGnY,EAAG4C,EAAG6N,EAAE9vB,EAAI,IAAK,IAAK,YAGtCqf,EAAIoY,EAAMpY,EAFV4C,EAAIsV,EAAMtV,EAAG1C,EAAGiY,EAAGnY,EAAGyQ,EAAE9vB,EAAI,IAAK,GAAI,YAErBuf,EAAGiY,EAAG1H,EAAE9vB,EAAI,GAAI,GAAI,WACpCw3B,EAAIC,EAAMD,EAAGnY,EAAG4C,EAAG1C,EAAGuQ,EAAE9vB,EAAI,GAAI,GAAI,YACpCuf,EAAIkY,EAAMlY,EAAGiY,EAAGnY,EAAG4C,EAAG6N,EAAE9vB,EAAI,IAAK,GAAI,WACrCiiB,EAAIwV,EAAMxV,EAAG1C,EAAGiY,EAAGnY,EAAGyQ,EAAE9vB,GAAI,IAAK,WACjCqf,EAAIoY,EAAMpY,EAAG4C,EAAG1C,EAAGiY,EAAG1H,EAAE9vB,EAAI,GAAI,GAAI,WACpCw3B,EAAIC,EAAMD,EAAGnY,EAAG4C,EAAG1C,EAAGuQ,EAAE9vB,EAAI,IAAK,EAAG,UACpCuf,EAAIkY,EAAMlY,EAAGiY,EAAGnY,EAAG4C,EAAG6N,EAAE9vB,EAAI,IAAK,IAAK,WACtCiiB,EAAIwV,EAAMxV,EAAG1C,EAAGiY,EAAGnY,EAAGyQ,EAAE9vB,EAAI,GAAI,IAAK,WACrCqf,EAAIoY,EAAMpY,EAAG4C,EAAG1C,EAAGiY,EAAG1H,EAAE9vB,EAAI,GAAI,EAAG,WACnCw3B,EAAIC,EAAMD,EAAGnY,EAAG4C,EAAG1C,EAAGuQ,EAAE9vB,EAAI,IAAK,GAAI,YACrCuf,EAAIkY,EAAMlY,EAAGiY,EAAGnY,EAAG4C,EAAG6N,EAAE9vB,EAAI,GAAI,IAAK,WACrCiiB,EAAIwV,EAAMxV,EAAG1C,EAAGiY,EAAGnY,EAAGyQ,EAAE9vB,EAAI,GAAI,GAAI,YACpCqf,EAAIoY,EAAMpY,EAAG4C,EAAG1C,EAAGiY,EAAG1H,EAAE9vB,EAAI,IAAK,GAAI,YACrCw3B,EAAIC,EAAMD,EAAGnY,EAAG4C,EAAG1C,EAAGuQ,EAAE9vB,EAAI,GAAI,GAAI,UACpCuf,EAAIkY,EAAMlY,EAAGiY,EAAGnY,EAAG4C,EAAG6N,EAAE9vB,EAAI,GAAI,GAAI,YAGpCqf,EAAIqY,EAAMrY,EAFV4C,EAAIwV,EAAMxV,EAAG1C,EAAGiY,EAAGnY,EAAGyQ,EAAE9vB,EAAI,IAAK,IAAK,YAEtBuf,EAAGiY,EAAG1H,EAAE9vB,EAAI,GAAI,GAAI,QACpCw3B,EAAIE,EAAMF,EAAGnY,EAAG4C,EAAG1C,EAAGuQ,EAAE9vB,EAAI,GAAI,IAAK,YACrCuf,EAAImY,EAAMnY,EAAGiY,EAAGnY,EAAG4C,EAAG6N,EAAE9vB,EAAI,IAAK,GAAI,YACrCiiB,EAAIyV,EAAMzV,EAAG1C,EAAGiY,EAAGnY,EAAGyQ,EAAE9vB,EAAI,IAAK,IAAK,UACtCqf,EAAIqY,EAAMrY,EAAG4C,EAAG1C,EAAGiY,EAAG1H,EAAE9vB,EAAI,GAAI,GAAI,YACpCw3B,EAAIE,EAAMF,EAAGnY,EAAG4C,EAAG1C,EAAGuQ,EAAE9vB,EAAI,GAAI,GAAI,YACpCuf,EAAImY,EAAMnY,EAAGiY,EAAGnY,EAAG4C,EAAG6N,EAAE9vB,EAAI,GAAI,IAAK,WACrCiiB,EAAIyV,EAAMzV,EAAG1C,EAAGiY,EAAGnY,EAAGyQ,EAAE9vB,EAAI,IAAK,IAAK,YACtCqf,EAAIqY,EAAMrY,EAAG4C,EAAG1C,EAAGiY,EAAG1H,EAAE9vB,EAAI,IAAK,EAAG,WACpCw3B,EAAIE,EAAMF,EAAGnY,EAAG4C,EAAG1C,EAAGuQ,EAAE9vB,GAAI,IAAK,WACjCuf,EAAImY,EAAMnY,EAAGiY,EAAGnY,EAAG4C,EAAG6N,EAAE9vB,EAAI,GAAI,IAAK,WACrCiiB,EAAIyV,EAAMzV,EAAG1C,EAAGiY,EAAGnY,EAAGyQ,EAAE9vB,EAAI,GAAI,GAAI,UACpCqf,EAAIqY,EAAMrY,EAAG4C,EAAG1C,EAAGiY,EAAG1H,EAAE9vB,EAAI,GAAI,GAAI,WACpCw3B,EAAIE,EAAMF,EAAGnY,EAAG4C,EAAG1C,EAAGuQ,EAAE9vB,EAAI,IAAK,IAAK,WACtCuf,EAAImY,EAAMnY,EAAGiY,EAAGnY,EAAG4C,EAAG6N,EAAE9vB,EAAI,IAAK,GAAI,WAGrCqf,EAAIsY,EAAMtY,EAFV4C,EAAIyV,EAAMzV,EAAG1C,EAAGiY,EAAGnY,EAAGyQ,EAAE9vB,EAAI,GAAI,IAAK,WAErBuf,EAAGiY,EAAG1H,EAAE9vB,GAAI,GAAI,WAChCw3B,EAAIG,EAAMH,EAAGnY,EAAG4C,EAAG1C,EAAGuQ,EAAE9vB,EAAI,GAAI,GAAI,YACpCuf,EAAIoY,EAAMpY,EAAGiY,EAAGnY,EAAG4C,EAAG6N,EAAE9vB,EAAI,IAAK,IAAK,YACtCiiB,EAAI0V,EAAM1V,EAAG1C,EAAGiY,EAAGnY,EAAGyQ,EAAE9vB,EAAI,GAAI,IAAK,UACrCqf,EAAIsY,EAAMtY,EAAG4C,EAAG1C,EAAGiY,EAAG1H,EAAE9vB,EAAI,IAAK,EAAG,YACpCw3B,EAAIG,EAAMH,EAAGnY,EAAG4C,EAAG1C,EAAGuQ,EAAE9vB,EAAI,GAAI,IAAK,YACrCuf,EAAIoY,EAAMpY,EAAGiY,EAAGnY,EAAG4C,EAAG6N,EAAE9vB,EAAI,IAAK,IAAK,SACtCiiB,EAAI0V,EAAM1V,EAAG1C,EAAGiY,EAAGnY,EAAGyQ,EAAE9vB,EAAI,GAAI,IAAK,YACrCqf,EAAIsY,EAAMtY,EAAG4C,EAAG1C,EAAGiY,EAAG1H,EAAE9vB,EAAI,GAAI,EAAG,YACnCw3B,EAAIG,EAAMH,EAAGnY,EAAG4C,EAAG1C,EAAGuQ,EAAE9vB,EAAI,IAAK,IAAK,UACtCuf,EAAIoY,EAAMpY,EAAGiY,EAAGnY,EAAG4C,EAAG6N,EAAE9vB,EAAI,GAAI,IAAK,YACrCiiB,EAAI0V,EAAM1V,EAAG1C,EAAGiY,EAAGnY,EAAGyQ,EAAE9vB,EAAI,IAAK,GAAI,YACrCqf,EAAIsY,EAAMtY,EAAG4C,EAAG1C,EAAGiY,EAAG1H,EAAE9vB,EAAI,GAAI,GAAI,WACpCw3B,EAAIG,EAAMH,EAAGnY,EAAG4C,EAAG1C,EAAGuQ,EAAE9vB,EAAI,IAAK,IAAK,YACtCuf,EAAIoY,EAAMpY,EAAGiY,EAAGnY,EAAG4C,EAAG6N,EAAE9vB,EAAI,GAAI,GAAI,WACpCiiB,EAAI0V,EAAM1V,EAAG1C,EAAGiY,EAAGnY,EAAGyQ,EAAE9vB,EAAI,GAAI,IAAK,WAErCqf,EAAI0X,EAAQ1X,EAAGwY,GACf5V,EAAI8U,EAAQ9U,EAAG6V,GACfvY,EAAIwX,EAAQxX,EAAGwY,GACfP,EAAIT,EAAQS,EAAGQ,GAEjB,MAAO,CAAC3Y,EAAG4C,EAAG1C,EAAGiY,EAClB,CAQD,SAASS,EAAUC,GACjB,IAAIl4B,EACAm4B,EAAS,GACTC,EAA0B,GAAfF,EAAMj4B,OACrB,IAAKD,EAAI,EAAGA,EAAIo4B,EAAUp4B,GAAK,EAC7Bm4B,GAAUj4B,OAAOwf,aAAcwY,EAAMl4B,GAAK,KAAOA,EAAI,GAAM,KAE7D,OAAOm4B,CACR,CASD,SAASE,EAAUH,GACjB,IAAIl4B,EACAm4B,EAAS,GAEb,IADAA,GAAQD,EAAMj4B,QAAU,GAAK,QAAKuB,EAC7BxB,EAAI,EAAGA,EAAIm4B,EAAOl4B,OAAQD,GAAK,EAClCm4B,EAAOn4B,GAAK,EAEd,IAAIs4B,EAAyB,EAAfJ,EAAMj4B,OACpB,IAAKD,EAAI,EAAGA,EAAIs4B,EAASt4B,GAAK,EAC5Bm4B,EAAOn4B,GAAK,KAAiC,IAA1Bk4B,EAAMtX,WAAW5gB,EAAI,KAAcA,EAAI,GAE5D,OAAOm4B,CACR,CA2CD,SAASI,EAASL,GAChB,IAEIpI,EACA9vB,EAHAw4B,EAAS,mBACTL,EAAS,GAGb,IAAKn4B,EAAI,EAAGA,EAAIk4B,EAAMj4B,OAAQD,GAAK,EACjC8vB,EAAIoI,EAAMtX,WAAW5gB,GACrBm4B,GAAUK,EAAOt3B,OAAQ4uB,IAAM,EAAK,IAAQ0I,EAAOt3B,OAAW,GAAJ4uB,GAE5D,OAAOqI,CACR,CAQD,SAASM,EAAaP,GACpB,OAAOQ,SAASC,mBAAmBT,GACpC,CAQD,SAASU,EAAOzY,GACd,OAhEF,SAAiBA,GACf,OAAO8X,EAAUL,EAAQS,EAAUlY,GAAe,EAAXA,EAAElgB,QAC1C,CA8DQ44B,CAAQJ,EAAatY,GAC7B,CAiBD,SAAS2Y,EAAWC,EAAGvB,GACrB,OAxEF,SAAqBz0B,EAAK4C,GACxB,IAAI3F,EAIAg5B,EAHAC,EAAOZ,EAAUt1B,GACjBm2B,EAAO,GACPC,EAAO,GAMX,IAJAD,EAAK,IAAMC,EAAK,SAAM33B,EAClBy3B,EAAKh5B,OAAS,KAChBg5B,EAAOrB,EAAQqB,EAAmB,EAAbl2B,EAAI9C,SAEtBD,EAAI,EAAGA,EAAI,GAAIA,GAAK,EACvBk5B,EAAKl5B,GAAe,UAAVi5B,EAAKj5B,GACfm5B,EAAKn5B,GAAe,WAAVi5B,EAAKj5B,GAGjB,OADAg5B,EAAOpB,EAAQsB,EAAKjV,OAAOoU,EAAU1yB,IAAQ,IAAoB,EAAdA,EAAK1F,QACjDg4B,EAAUL,EAAQuB,EAAKlV,OAAO+U,GAAO,KAC7C,CAwDQI,CAAYX,EAAaM,GAAIN,EAAajB,GAClD,CAsBD,SAAS6B,EAAI/3B,EAAQyB,EAAKu2B,GACxB,OAAKv2B,EAMAu2B,EAGER,EAAW/1B,EAAKzB,GAvBhBi3B,EAASO,EAqBI/1B,EAAKzB,IANlBg4B,EAGEV,EAAOt3B,GAtCTi3B,EAASK,EAoCEt3B,GAQnB,CAMwC4jB,GAAOC,QAC9CD,WAAiBmU,EAEjBvC,EAAEuC,IAAMA,CAEX,CA1XA,CA0XEhzB,0BC/YI,MAAMkzB,GAA8C,IAAI55B,UCsBlD65B,GAiBX,WAAArzB,CAAYgvB,GAXJ9uB,KAAI4N,KAAY,GAGhB5N,KAAKpF,MAAW,EAEhBoF,KAAOozB,SAAY,EAEpBpzB,KAAKqzB,MAAW,IAEhBrzB,KAAAkF,MAAsB,IAAImY,GAG/Brd,KAAK8uB,UAAYA,EACjB9uB,KAAK3B,UAAYywB,EAAUzwB,SAC5B,CAEO,cAAAi1B,CAAer5B,GACrB,OAAOA,EAAMH,QAAQ,2CAA4C,QAC/DA,QAAQ,wDAAyD,IACjEA,QAAQ,uDAAwD,GACnE,CAEO,QAAAyuB,CAASlqB,GACf,OAAO,IAAIqkB,GAAWrkB,GAAWiiB,SAClC,CAEO,YAAAiT,CAAaxzB,GACnBA,EAAKuC,KAAK,YAAYK,MAAKyV,IACzB,MAAM/U,EAAU,IAAIxD,EAAMuY,GACpBhY,EAAK4yB,GAAI,GAAG3vB,EAAQ/B,KAAK,WAAW+B,EAAQ/B,KAAK,WAAW+B,EAAQ/B,KAAK,YAC/E+B,EAAQ/B,KAAK,KAAMlB,EAAG,GAEzB,CAEO,iBAAAozB,CAAkBzzB,GACxBA,EAAKuC,KAAK,YAAYK,MAAKyV,IACT,IAAIvY,EAAMuY,GAClBtS,WAAW,KAAK,GAE3B,CAEO,cAAA2tB,CAAeC,GACrB,MAAMr1B,EAAY2B,KAAK3B,UACjBgR,EAAY,CAChBS,sBAAwB6B,IACtB,GAAgC,aAA5B,IAAI9R,EAAM8R,GAAStR,KACrB,OAAO,CACR,EAEHwP,sBAAuB,CAAClK,EAAuByS,KAC7C,MAAMrY,EAAO,IAAIF,EAAMuY,GACvB,GAAsB,UAAlBzS,GAA2C,aAAd5F,EAAKM,KAAqB,CACzD,MAAMszB,EAAcT,GAAa94B,IAAIiE,EAAU+B,IAC/C,IAAKuzB,EACH,OAEFA,EAAYC,OAAO7zB,EAAKK,GACzB,IAGCyzB,EAAiBH,EAAWnuB,OAAM,GACxCvF,KAAKuzB,aAAal1B,GAClB2B,KAAKuzB,aAAaM,GAClBve,GAAMjX,EAAWw1B,EAAgB,CAC/BxkB,cAEFrP,KAAKwzB,kBAAkBn1B,GACvB2B,KAAKwzB,kBAAkBK,EACxB,CAEO,cAAAC,GACN,MAAMtrB,EAAQxI,KAAK8uB,UAAUtmB,MACvB4X,EAAepgB,KAAK3B,UAAUkH,OAAM,GAK1C,GAJA6a,EAAa9d,KAAK,YAAYK,MAAKyV,IACrB,IAAIgH,GAAIhH,GAChBqH,eAAelY,OAAO,IAExBiB,EAAMQ,eAAetH,UACvB,OAAO0e,EAET,GAAI5X,EAAMkB,YACR,OAAO0W,EAET,MAAM2T,EAAgBvrB,EAAME,UAAUxE,OAChC8vB,EAAcxrB,EAAMK,QAAQ3E,OAC5B+vB,EAAe7T,EAAa9d,KAAKyxB,GACjCG,EAAa9T,EAAa9d,KAAK0xB,GAC/BzE,EAAW/mB,EAAMjD,QAIvB,OAHAgqB,EAASvlB,SAASiqB,EAAczrB,EAAMI,aACtC2mB,EAASllB,OAAO6pB,EAAY1rB,EAAMO,WAClC2b,GAAe6K,GACRnP,CACR,CAED,SAAW+T,GACT,OAAOn0B,KAAK4N,KAAKhU,MAClB,CAED,WAAWw6B,GACT,OAAOp0B,KAAKpF,MAAQ,KAAOoF,KAAK4N,KAAK5N,KAAKpF,MAAQ,EACnD,CAED,WAAWy5B,GACT,QAASr0B,KAAK4N,KAAK5N,KAAKpF,MACzB,CAEM,IAAA05B,GACL,IAAKt0B,KAAK4N,KAAK5N,KAAKpF,MAAQ,GAC1B,OAEFoF,KAAK8uB,UAAUpK,iBACf,MAAMzqB,EAAQ+F,KAAKuoB,SAASvoB,KAAK3B,WACjC,KAAO2B,KAAKpF,MAAQ,GAAG,CACrB,MAAM25B,EAAWv0B,KAAK4N,KAAK5N,KAAKpF,MAAQ,GACxC,IAAK25B,EACH,MAEF,MAAMC,EAAYx0B,KAAKuoB,SAASgM,GAChC,GAAIv0B,KAAKszB,eAAekB,KAAex0B,KAAKszB,eAAer5B,GAAQ,CACjE+F,KAAKyzB,eAAec,GACpBv0B,KAAKkF,MAAMD,KAAK,OAAQuvB,GACxB,KACD,CACD,GAAmB,IAAfx0B,KAAKpF,MACP,MAEFoF,KAAKpF,OACN,CACDoF,KAAK8uB,UAAUU,gBACfnwB,EAAM,qCAAqCW,KAAKpF,QACjD,CAEM,IAAA65B,GACL,IAAKz0B,KAAK4N,KAAK5N,KAAKpF,OAClB,OAEFoF,KAAK8uB,UAAUpK,iBACf,MAAMzqB,EAAQ+F,KAAKuoB,SAASvoB,KAAK3B,WACjC,KAAO2B,KAAKpF,MAAQoF,KAAK4N,KAAKhU,QAAQ,CACpC,MAAM86B,EAAW10B,KAAK4N,KAAK5N,KAAKpF,OAChC,IAAK85B,EACH,MAEF10B,KAAKpF,QACL,MAAM+5B,EAAY30B,KAAKuoB,SAASmM,GAChC,GAAI10B,KAAKszB,eAAeqB,KAAe30B,KAAKszB,eAAer5B,GAAQ,CACjE+F,KAAKyzB,eAAeiB,GACpB10B,KAAKkF,MAAMD,KAAK,OAAQ0vB,GACxB,KACD,CACF,CACD30B,KAAK8uB,UAAUU,gBACfnwB,EAAM,qCAAqCW,KAAKpF,QACjD,CAEM,WACLoF,KAAKozB,SAAU,CAChB,CAEM,KAAAwB,GACL50B,KAAKozB,SAAU,CAChB,CAEM,IAAAyB,GACL,IAAK70B,KAAKozB,QACR,OAEF,MAAMtuB,EAAO9E,KAAK8zB,iBACZ75B,EAAQ+F,KAAKuoB,SAASzjB,GAE1B9E,KAAK4N,KAAK5N,KAAKpF,MAAQ,IACvBoF,KAAKszB,eAAetzB,KAAKuoB,SAASvoB,KAAK4N,KAAK5N,KAAKpF,MAAQ,OAASoF,KAAKszB,eAAer5B,KAIxF+F,KAAK4N,KAAKknB,OAAO90B,KAAKpF,MAAOm6B,IAAUjwB,GACvC9E,KAAKpF,QACDoF,KAAK4N,KAAKhU,OAASoG,KAAKqzB,QAC1BrzB,KAAK4N,KAAKonB,QACVh1B,KAAKpF,MAAQoF,KAAK4N,KAAKhU,QAEzBoG,KAAKkF,MAAMD,KAAK,OAAQhL,GACxBoF,EAAM,oCAAoCW,KAAKpF,SAChD,ECrNH,IAAIm2B,GAAE,CAAC,QAAQ,OAAO,MAAM,WAAW9a,GAAE,iBAAiBhZ,UAAUA,UAAUg4B,SAAS,GAAGC,GAAE,uBAAuB92B,KAAK6X,IAAGkf,GAAED,GAAE,OAAO,UAAUE,GAAE,UAAUnf,GAAE,CAAC,UAAU,OAAOif,GAAE,CAAC,OAAO,GAAG,SAASv7B,GAAEo3B,EAAE9a,GAAG,MAAM,mBAAmB8a,EAAEsE,mBAAmBtE,EAAEsE,iBAAiBpf,IAAImf,GAAEE,SAASrf,IAAI8a,EAAEsE,iBAAiB,YAAY,CAAC,SAASrc,GAAE+X,GAAG,OAAOA,EAAEp0B,OAAOnC,MAAM,KAAK0C,KAAI,SAAS6zB,GAAG,IAAI9a,EAAE8a,EAAEv2B,MAAM,QAAQ06B,EAAEjf,EAAEd,MAAM,MAAM,CAACc,EAAEA,EAAE/Y,KAAI,SAAS6zB,GAAG,MAAM,SAASA,EAAEoE,GAAEpE,CAAC,IAAGmE,EAAE,GAAE,CAAC,SAAS7Z,GAAEpF,EAAEif,GAAG,IAAIC,OAAE,IAASD,IAAIA,EAAE,IAAI,IAAIE,EAAE,OAAOD,EAAED,EAAEK,SAASJ,EAAE,IAAI9Z,EAAEvJ,OAAOrY,KAAKwc,GAAG/Y,KAAI,SAAS6zB,GAAG,MAAM,CAAC/X,GAAE+X,GAAG9a,EAAE8a,GAAG,IAAG7X,EAAE,IAAI5f,IAAIk8B,EAAE,KAAK,OAAO,SAASvf,GAAGA,aAAawf,gBAAgBpa,EAAE3gB,SAAQ,SAASw6B,GAAG,IAAIC,EAAED,EAAE,GAAGE,EAAEF,EAAE,GAAGlc,EAAEE,EAAE9e,IAAI+6B,IAAIA,GAAG,SAASlf,EAAEif,GAAG,QAAQA,EAAE,GAAGp6B,gBAAgBmb,EAAEvZ,IAAI5B,eAAeo6B,EAAE,KAAKjf,EAAEqM,MAAM4S,EAAE,GAAG5yB,MAAK,SAASyuB,GAAG,OAAOp3B,GAAEsc,EAAE8a,EAAE,KAAIA,GAAEzuB,MAAK,SAASyuB,GAAG,OAAOmE,EAAE,GAAGI,SAASvE,IAAImE,EAAE,KAAKnE,GAAGp3B,GAAEsc,EAAE8a,EAAE,IAAG,CAArL,CAAuL9a,EAAE+C,EAAE,IAAIrf,GAAEsc,EAAEA,EAAEvZ,MAAMwc,EAAE0a,OAAOuB,GAAGnc,EAAEpf,OAAO,EAAEsf,EAAE3H,IAAI4jB,EAAEnc,EAAEH,MAAM,KAAKK,EAAE0a,OAAOuB,GAAGC,EAAEnf,GAAG,IAAGuf,GAAG/G,aAAa+G,GAAGA,EAAErH,WAAWjV,EAAEwc,MAAMpc,KAAKJ,GAAGkc,GAAG,CAAC,CCStgC,MAAMO,GAAmB,IAAIr8B,IAAI,CAC/B,CAAC,IAAK,mBAGKs8B,GAOX,WAAA91B,CAAYzB,GAJJ2B,KAAgB61B,iBAAgB,GAEhC71B,KAAc81B,eAAgB,GAGpC91B,KAAK3B,UAAYA,CAClB,CAEO,aAAA03B,CAAcvxB,SAOpB,OALAA,GADAA,EAAqC,QAA9BrK,EAAAw7B,GAAiBv7B,IAAIoK,UAAS,IAAArK,EAAAA,EAAAqK,GACzB1K,QAAQ,yBAA0B,YAC5CA,QAAQ,6GACLI,GAAkBA,EAAMW,OAAO,GAAGC,cAAgBR,EAAUJ,EAAMa,UAAU,MAC/EjB,QAAQ,8BACN,CAACI,EAAe0B,EAAYC,EAAYC,IAAe,GAAGF,OAAQC,EAAGf,gBAAgBgB,KAE1F,CAGM,UAAAk6B,CAAWxxB,EAAcC,GAC9BD,EAAOxE,KAAK+1B,cAAcvxB,GAC1B,MAAMyrB,EAAUgG,GAAyB,CACvCzxB,CAACA,GAAOU,GAAST,EAASS,KAE5BlF,KAAK61B,iBAAiB73B,KAAK,CACzBwG,OACAC,aAEFzE,KAAK3B,UAAUkG,GAAG,UAAW0rB,EAC9B,CAGM,QAAAiG,CAAS1xB,EAAcC,GAC5BD,EAAOxE,KAAK+1B,cAAcvxB,GAC1B,MAAMyrB,EAAUgG,GAAyB,CACvCzxB,CAACA,GAAOU,GAAST,EAASS,KAE5BlF,KAAK81B,eAAe93B,KAAK,CACvBwG,OACAC,aAEFzE,KAAK3B,UAAUkG,GAAG,QAAS0rB,EAC5B,CAGM,OAAAkG,CAAQ3xB,GACbA,EAAOxE,KAAK+1B,cAAcvxB,GAC1B,IAAK,MAAMM,KAAQ9E,KAAK61B,iBACtB,GAAI/wB,EAAKN,OAASA,IACuB,IAAnCM,EAAKL,SAAS,IAAIU,MAAMX,IAC1B,KAIP,CAGM,KAAA4xB,CAAM5xB,GACXA,EAAOxE,KAAK+1B,cAAcvxB,GAC1B,IAAK,MAAMM,KAAQ9E,KAAK81B,eACtB,GAAIhxB,EAAKN,OAASA,IACuB,IAAnCM,EAAKL,SAAS,IAAIU,MAAMX,IAC1B,KAIP,EClDH,MAAM6xB,GAAgB,CACpBp8B,MAAO,yBACPq8B,UAAU,EACVC,YAAY,EACZ3O,SAAU,EACV4O,eAAe,EACfC,cAAe,EACfC,mBAAoB,OACpBC,mBAAoB,UACpBC,kBAAmB,CAAC,YAAa,aAAc,YAAa,wBAGjDC,GAqCX,WAAA/2B,CAAY8R,GACV,GA/BM5R,KAAgB82B,iBAAW,GAc5B92B,KAAW+2B,aAAY,EAIvB/2B,KAAAkF,MAAsB,IAAImY,GAU1Brd,KAAAklB,IAAkB2R,GAAO3R,IA6BxBllB,KAAoBg3B,qBAAkB,KAC5Ch3B,KAAKi3B,wBAAwB,EAGvBj3B,KAAuBk3B,wBAAkB,KAC/Cl3B,KAAK8uB,UAAUQ,cACftvB,KAAKm3B,0BACLn3B,KAAKo3B,sBAAsB,EAGrBp3B,KAAaq3B,cAAkBnyB,IACrC,MAAMuL,EAAa,IAAI5Q,EAAMqF,EAAM1C,QAC/BiO,EAAW9O,QAAQ,eAAe/H,OAAS,GAG/CoG,KAAKkF,MAAMD,KAAK,QAASwL,EAAW,EAG9BzQ,KAAcs3B,eAAkB,KACtCt3B,KAAKkF,MAAMD,KAAK,SAAS,EAGnBjF,KAAAm3B,wBAA0BI,IAAS,KAEzC,GAAiC,IAA7Bv3B,KAAK2nB,KAAK9jB,QAAQjK,OACpB,OAEF,MAAM4O,EAAQxI,KAAK8uB,UAAUtmB,MACvB4D,EAAc5D,EAAMjD,QAC1B6G,EAAYhB,WACZpL,KAAKklB,IAAIsS,QAAQx3B,MAAM2C,MAAKU,IAC1B,MAAM6hB,EAAM,IAAI9F,GAAI/b,GACdgG,EAAe6b,EAAIzF,eACzB,GAA4B,IAAxBpW,EAAazP,OAAjB,CAGA,GAAI4O,EAAMc,kBAAkBD,GAAgB,GAAKb,EAAMiB,iBAAiBJ,GAAgB,KAChFb,EAAMU,aAAeV,EAAME,UAAUtO,IAAI,KAAOiP,EAAajP,IAAI,IAA4B,IAAtBoO,EAAMI,aAIjF,OAHAS,EAAahD,YAAY,qBACzBgD,EAAahD,YAAY,yBACzBgD,EAAanD,SAAS,sBAI1B,GAAIkG,EAAYhC,eAAe8a,EAAInlB,MASjC,OARAsJ,EAAahD,YAAY,2BACrBmC,EAAMU,aACRG,EAAahD,YAAY,qBACzBgD,EAAanD,SAAS,sBAEtBmD,EAAahD,YAAY,oBACzBgD,EAAanD,SAAS,uBAI1BmD,EAAahD,YAAY,sBACzBgD,EAAahD,YAAY,oBACzBgD,EAAahD,YAAY,oBAtBxB,CAsB4C,IAE/CrG,KAAKkF,MAAMD,KAAK,0BAA0B,GACzC,GAAI,CACLwoB,SAAS,EACTE,UAAU,EACVN,QAAS,KAGHrtB,KAAAo3B,qBAAuBG,IAAS,KACtC,MAAME,EAAez3B,KAAK03B,QAAQxH,WAClC,IAAIP,EAAe3vB,KAAK8uB,UAAUY,kBAEhCC,EAAa/1B,OAAS,GACtB+1B,EAAa,GAAG5vB,KAAKyD,mBAAmBpJ,IAAI,KAAO4F,KAAK3B,UAAUjE,IAAI,KAEtEu1B,EAAe,IAEjB,MAAMgI,EAAwC,IAAIr+B,IAC5Cs+B,EAAwC,IAAIt+B,IAC5Cu+B,EAA2C,IAAIv+B,IACrD,GAAIq2B,EAAa/1B,OAAS,EACxB,IAAK,MAAMyG,KAAQo3B,EAAc,CAC/B,MAAMrH,EAAcpwB,KAAK03B,QAAQvH,QAAQ9vB,GAOzC,GANI+vB,EAAYC,YAAcD,EAAYC,WAAWV,IACnDgI,EAAgBpmB,IAAIlR,GAAM,GAExB+vB,EAAYE,YAAcF,EAAYE,WAAWX,IACnDiI,EAAgBrmB,IAAIlR,GAAM,GAExB+vB,EAAYG,eAAgB,CAC9B,MAAMuH,EAAS1H,EAAYG,eAAeZ,GACtCmI,EAAOl+B,OAAS,GAClBi+B,EAAkBtmB,IAAIlR,EAAMy3B,EAE/B,CACF,CAEH93B,KAAKkF,MAAMD,KAAK,cAAe,CAC7B0qB,eACAgI,kBACAC,kBACAC,qBACA,GACD,IAAK,CACNpK,SAAS,EACTE,UAAU,EACVN,QAAS,MAGHrtB,KAAA+3B,gBAAmB99B,IACzB+F,KAAKg4B,iBACLh4B,KAAKo3B,uBACLp3B,KAAKkF,MAAMD,KAAK,SAAUhL,EAAM,GAxI3B2X,EAAO+V,KACV,MAAM,IAAI9c,MAAM,6CAElB7K,KAAK2nB,KAAOrf,EAAMsJ,EAAO+V,MACzB3nB,KAAK4R,OAAME,OAAAC,OAAAD,OAAAC,OAAA,GAAOskB,IAAkBzkB,GACpC5R,KAAKi4B,iBAAmB3vB,EAAM,0CAC9BtI,KAAK3B,UAAYiK,EAAM,kCACvBtI,KAAKk4B,iBAAmB5vB,EAAM,gCAC9BtI,KAAKm4B,eAAiB7vB,EAAM,qDAC5BtI,KAAKs2B,SAAWt2B,KAAK4R,OAAO0kB,SAE5Bt2B,KAAK2nB,KAAKzhB,SAAS,0BACnBlG,KAAK3B,UAAUiD,KAAK,CAClB82B,gBAAiBp4B,KAAKs2B,SAAW,QAAU,OAC3CC,WAAYv2B,KAAK4R,OAAO2kB,WAAa,OAAS,QAC9C8B,SAAUr4B,KAAK4R,OAAOgW,SAASnsB,aAGjCuE,KAAK8uB,UAAY,IAAID,GAAU7uB,KAAK3B,WACpC2B,KAAK03B,QAAU,IAAI3H,GAAQ/vB,KAAK8uB,WAChC9uB,KAAKs4B,QAAU,IAAInF,GAAQnzB,KAAK8uB,WAChC9uB,KAAKu4B,UAAY,IAAI3C,GAAU51B,KAAK3B,WAEpC2gB,GAAQzN,IAAIvR,KAAK3B,UAAU+B,GAAIJ,KAChC,CAmHO,eAAAw4B,GACN,MAAM1J,EAAY9uB,KAAK8uB,UACjBtmB,EAAQsmB,EAAUtmB,MAClBiwB,EAAYjwB,EAAME,UAAU/G,QAAQ,mBACpC0B,EAAUo1B,EAAU92B,QAAQ,YAElC,GAAiB,WADL,IAAIyd,GAAI/b,GACZmB,KACFgE,EAAMY,WACRZ,EAAMyB,eAAe5G,GACrBmF,EAAM0B,oBAEN1B,EAAM2B,cAAc9G,GACpBmF,EAAM0B,uBAEH,CACL,MAAMwuB,EAAYpwB,EAAM,SACpBE,EAAMY,UACR/F,EAAQuE,OAAO8wB,GAEfr1B,EAAQwE,MAAM6wB,GAEhBlwB,EAAM0C,YAAYwtB,EACnB,CACD,MAAMt2B,EAAOq2B,EAAUr2B,OACvBq2B,EAAUtxB,KAAK,UACf2nB,EAAUtK,WAAWtmB,SAASC,eAAeiE,GAC9C,CAEO,eAAAu2B,GACN34B,KAAK3B,UAAUkG,GAAG,oBAAoB,KACpCvE,KAAK+2B,aAAc,CAAI,IAEzB/2B,KAAK3B,UAAUkG,GAAG,kBAAkB,KAClCvE,KAAK+2B,aAAc,CAAK,IAE1B/2B,KAAK3B,UAAUkG,GAAG,eAAe,KAC/B,MAAMiE,EAAQxI,KAAK8uB,UAAUtmB,OACzBA,EAAMY,WAAaZ,EAAMgB,aAC3BxJ,KAAKi3B,wBACN,IAEHj3B,KAAK3B,UAAUkG,GAAG,SAASW,IACzB,MAAM0zB,EAAa1zB,EAEnBzH,OAAO0wB,YAAW,WAChB,MAAM3lB,EAAQxI,KAAK8uB,UAAUtmB,MAC7B,IAAIA,EAAMkB,YAIV,GAAI1J,KAAK+2B,YACP/2B,KAAKkF,MAAMD,KAAK,QAAS2zB,OAD3B,CAIA,GAC2B,eAAzBA,EAAWC,WACc,0BAAzBD,EAAWC,UAEX,GAAIrwB,EAAMY,WAAaZ,EAAMgB,WAC3BxJ,KAAKw4B,uBAGL,GADAx4B,KAAK82B,kBAAuC,QAAnB38B,EAAAy+B,EAAWt5B,YAAQ,IAAAnF,EAAAA,EAAA,GACxC6F,KAAK82B,iBAAiBl9B,OAASoG,KAAK4R,OAAO6kB,cAE7C,YADAz2B,KAAKkF,MAAMD,KAAK,QAAS2zB,GAK/B54B,KAAKs4B,QAAQzD,OACb70B,KAAK82B,iBAAmB,GACxB92B,KAAKkF,MAAMD,KAAK,QAAS2zB,EAjBxB,CAiBmC,GACnC,EAAE,IAEP54B,KAAK03B,QAAQxyB,MAAMX,GAAG,iBAAiB,IAAMvE,KAAKi3B,0BACnD,CAEO,iBAAA6B,GACN94B,KAAKs4B,QAAQpzB,MAAMX,GAAG,QAAQtK,IAC5B+F,KAAKklB,IAAI6T,UAAU/4B,MACnBA,KAAK+3B,gBAAgB99B,EAAM,IAE7B+F,KAAKs4B,QAAQpzB,MAAMX,GAAG,QAAQtK,IAC5B+F,KAAKklB,IAAI6T,UAAU/4B,MACnBA,KAAK+3B,gBAAgB99B,EAAM,IAE7B+F,KAAKs4B,QAAQpzB,MAAMX,GAAG,QAAQtK,IAC5B+F,KAAKklB,IAAI8T,iBAAiBh5B,MAC1BA,KAAK+3B,gBAAgB99B,EAAM,GAE9B,CAEO,eAAAg/B,GACNj5B,KAAK3B,UAAUkG,GAAG,SAAS,KACzBvE,KAAK2nB,KAAKzhB,SAAS,oBAAoB,IAEzClG,KAAK3B,UAAUkG,GAAG,QAAQ,KACxBvE,KAAK2nB,KAAKthB,YAAY,oBAAoB,GAE7C,CAGM,cAAA2xB,GACL,IAAI90B,EAAWlD,KAAK3B,UAAU6E,WAC9B,IAAK,MAAM1E,KAAS0E,GACb1E,EAAMoC,SAAWpC,EAAMsC,SAA4B,KAAjBtC,EAAM2I,SAC3C3I,EAAM8H,SACNjH,EAAM,8CAIV,GADA6D,EAAWlD,KAAK3B,UAAU6E,WACF,IAApBA,EAAStJ,OAIX,OAHAoG,KAAK3B,UAAU8I,KAAK,iBACpBnH,KAAK8uB,UAAUtmB,MAAM0C,YAAYlL,KAAK3B,gBACtCgB,EAAM,mDAGR,GAAwB,IAApB6D,EAAStJ,OAAc,CACzB,MAAM4E,EAAQ0E,EAAS,GACvB,GAAI1E,EAAMuC,OAAQ,CAChB,MAAM23B,EAAYpwB,EAAM,SACxB9J,EAAMoJ,OAAO8wB,GACbA,EAAU/wB,OAAOnJ,GACjBwB,KAAK8uB,UAAUtmB,MAAM0C,YAAYwtB,GACjCr5B,EAAM,4DACP,CACF,CACF,CAGM,sBAAA43B,GACDj3B,KAAK82B,iBAAiBl9B,OAAS,IACjCoG,KAAKs4B,QAAQzD,OACb70B,KAAK82B,iBAAmB,GAE3B,CAGM,gBAAAoC,GACLl5B,KAAKi3B,yBACLj3B,KAAKs4B,QAAQ1D,OACd,CAGM,eAAAuE,GACLn5B,KAAKs4B,QAAQc,WACbp5B,KAAKs4B,QAAQzD,MACd,CAGM,KAAAxvB,GACLrF,KAAK3B,UAAUgH,OAChB,CAGM,IAAAC,GACLtF,KAAK3B,UAAUiH,MAChB,CAGM,QAAAkjB,CAASvuB,GACdA,EAAQ2C,EAAe3C,GACvB,MACMie,EADa,IAAIwK,GAAWzoB,GACNoqB,cAC5BrkB,KAAK3B,UAAUkJ,QACfvH,KAAK3B,UAAUsJ,OAAOuQ,GACtB2e,GAAO3R,IAAI6T,UAAU/4B,MACrBA,KAAK8uB,UAAUU,eAChB,CAGM,QAAAjH,GACL,MAAMtD,EAAWjlB,KAAK8uB,UAAUpK,iBAChC,IAAIzqB,EAAQ,IAAIyoB,GAAW1iB,KAAK3B,WAAWiiB,UAG3C,OAFArmB,EAAQ4C,EAAiB5C,GACzB+F,KAAK8uB,UAAU9J,WAAWC,GACnBhrB,CACR,CAGM,SAAAo/B,CACLC,EACAC,GAEA,MAAMrU,WC7YgB1c,EAAc8wB,EAAiBC,GACvD,GAAI/wB,EAAMQ,eAAetH,UACvB,OAAO,KAET,MAAMwjB,EAAM,IAAI9F,GAAIka,GAChBC,IACFrU,EAAIjrB,MAAQs/B,GAEd,MAAMrhB,EAAWha,SAASia,yBAG1B,GAFAD,EAASxQ,YAAYwd,EAAInlB,KAAK3F,IAAI,IAEjB,WAAb8qB,EAAI1gB,KAIN,OAHAihB,GAAejd,EAAO0P,GACtBgN,EAAI/E,SACJ3X,EAAMwC,eAAeka,EAAInlB,MAClBmlB,EAGT,MAAMkB,EAAQF,GAAW1d,GAczB,OAbI4d,EAAMhZ,OACR5E,EAAM+B,YAAY6b,EAAMhZ,MACxB5E,EAAMiC,iBAEJ2b,EAAM/Y,OAAS+Y,EAAM/Y,MAAMnL,SAC7BkkB,EAAM/Y,MAAM/G,SAEdmf,GAAejd,EAAO0P,GACtBgN,EAAI/E,SACJ3X,EAAMwC,eAAeka,EAAInlB,MACrBqmB,EAAMhZ,MAAQgZ,EAAMhZ,KAAKlL,SAC3BkkB,EAAMhZ,KAAK9G,SAEN4e,CACT,CD4WgBmU,CAAUr5B,KAAK8uB,UAAUtmB,MAAO8wB,EAASC,GACrD,IAAKrU,EACH,MAAM,IAAIra,MAAM,QAAQyuB,6CAI1B,OAFoBt5B,KAAKklB,IAAIsU,aAAax5B,MAC9BuR,IAAI2T,EAAInlB,KAAKK,GAAI8kB,GACtBA,CACR,CAGM,SAAAuU,GACL,MAAMvU,EE3ZJ,SAAoB1c,GACxB,GAAIA,EAAMQ,eAAetH,UACvB,OAAO,KAET,MAAM2B,EAAUmF,EAAMQ,eAAerH,QAAQ,YAC7C,GAAuB,IAAnB0B,EAAQzJ,OACV,OAAO,KAET,MAAMsrB,EAAM,IAAI9F,GAAI/b,GACpB,GAAiB,UAAb6hB,EAAI1gB,KAAkB,CACxB,MAAMk0B,EAAYpwB,EAAM,iBAKxB,OAJAjF,EAAQuE,OAAO8wB,GACflwB,EAAM0C,YAAYwtB,GAClBxT,EAAI7E,UACJhd,EAAQiD,SACD4e,CACR,CACD1c,EAAMyB,eAAe5G,GACrBmF,EAAM0B,kBACN,MAAMpI,EAAauB,EAAQtB,SAO3B,OANAmjB,EAAI7E,UACJhd,EAAQiD,SACJxE,EAAWI,UACboL,EAAcxL,EAAYwG,EAAM,WAChCE,EAAM0C,YAAYpJ,IAEbojB,CACT,CFgYgBuU,CAAUz5B,KAAK8uB,UAAUtmB,OACrC,GAAI0c,EAAK,CACallB,KAAKklB,IAAIsU,aAAax5B,MAC9B4zB,OAAO1O,EAAInlB,KAAKK,GAC7B,CACD,OAAO8kB,CACR,CAGM,MAAA/E,GACL,MAAMlmB,EAAQ2C,EAAeoD,KAAK4R,OAAO3X,OAEnCie,EADa,IAAIwK,GAAWzoB,GACNoqB,cAC5BrkB,KAAK2nB,KAAKpgB,QACVvH,KAAK2nB,KAAKhgB,OAAO3H,KAAKi4B,kBACtBj4B,KAAKi4B,iBAAiBtwB,OAAO3H,KAAK3B,WAClC2B,KAAKi4B,iBAAiBtwB,OAAO3H,KAAKk4B,kBAClC5vB,EAAMpK,SAASomB,MAAM3c,OAAO3H,KAAKm4B,gBACjCn4B,KAAK3B,UAAUsJ,OAAOuQ,GACjBlY,KAAKs2B,WACRt2B,KAAKi5B,kBACLj5B,KAAKqF,QACLrF,KAAK8uB,UAAUU,gBACfxvB,KAAKs4B,QAAQzD,OACbgC,GAAO6C,OAAOC,QAAQ35B,OAExB62B,GAAO3R,IAAI6T,UAAU/4B,MAChBA,KAAKs2B,WACR74B,OAAOiH,iBAAiB,eAAgB1E,KAAKg3B,sBAC7C94B,SAASwG,iBAAiB,kBAAmB1E,KAAKk3B,yBAClDl3B,KAAK24B,kBACL34B,KAAK84B,qBAEP56B,SAASwG,iBAAiB,QAAS1E,KAAKq3B,eACxC55B,OAAOiH,iBAAiB,SAAU1E,KAAKs3B,eACxC,CAGM,OAAAjX,GACLrgB,KAAK2nB,KAAKpgB,QACVvH,KAAKm4B,eAAe7xB,SACftG,KAAKs2B,WACR74B,OAAOsH,oBAAoB,eAAgB/E,KAAKg3B,sBAChD94B,SAAS6G,oBAAoB,kBAAmB/E,KAAKk3B,0BAEvDh5B,SAAS6G,oBAAoB,QAAS/E,KAAKq3B,eAC3C55B,OAAOsH,oBAAoB,SAAU/E,KAAKs3B,eAC3C,EAjaaT,GAAO+C,gBAEP/C,GAAA3R,IAAM,UGvCb,GAAA9e,CAAIiZ,GACTN,GAAMxN,IAAI8N,EAAUhf,KAAMgf,EAC3B,CAEM,MAAA/Y,CAAOjG,GACZ0e,GAAM6U,OAAOvzB,EACd,CAEM,QAAA6vB,GACL,OAAOjwB,MAAMgD,KAAK8b,GAAMtlB,OACzB,CAEM,YAAA+/B,CAAaK,GAClB,IAAIlG,EAAcT,GAAa94B,IAAIy/B,EAAOx7B,UAAU+B,IACpD,OAAKuzB,IACHA,EAAc,IAAIr6B,IAClB45B,GAAa3hB,IAAIsoB,EAAOx7B,UAAU+B,GAAIuzB,GAC/BA,EAGV,CAEM,gBAAAqF,CAAiBa,GACtB,MAAMlG,EAAc3zB,KAAKw5B,aAAaK,GACtC,IAAK,MAAM3U,KAAOyO,EAAYmE,SACvB5S,EAAInlB,KAAK3F,IAAI,GAAG0/B,cACnB5U,EAAI7E,UACJsT,EAAYC,OAAO1O,EAAInlB,KAAKK,IAGjC,CAEM,OAAAo3B,CAAQqC,GACb,OAAOA,EAAOx7B,UAAUiE,KAAK,WAC9B,CAEM,SAAAy2B,CAAUc,GACf75B,KAAKg5B,iBAAiBa,GACtB,MAAMlG,EAAc3zB,KAAKw5B,aAAaK,GACtC75B,KAAKw3B,QAAQqC,GAAQl3B,MAAKo3B,IACxB,MAAM12B,EAAU,IAAIxD,EAAMk6B,GAC1B,GAAIpG,EAAYv5B,IAAIiJ,EAAQjD,IAC1B,OAEF,MAAM8kB,EAAM,IAAI9F,GAAI/b,GACpB6hB,EAAI/E,SACJwT,EAAYpiB,IAAI2T,EAAInlB,KAAKK,GAAI8kB,EAAI,GAEpC,GHPa2R,GAAA6C,OAAS,UI7CzB,WAAA55B,GACUE,KAAUg6B,WAAqB,EAWxC,CATQ,GAAA5zB,CAAIszB,GACT15B,KAAKg6B,WAAWh8B,KAAK07B,EACtB,CAEM,OAAAC,CAAQE,GACb75B,KAAKg6B,WAAWt/B,SAAQg/B,IACtBA,EAAOG,EAAO,GAEjB,GCRH,MA2CaI,GAAoB,WAc3BC,GAAuB,qCAChBC,GAAuB/3B,GAASA,EAAKrH,UAAU,EAAGqH,EAAKxI,OAAS,GAChEwgC,GAAe,CAACC,EAASC,GAAW,EAAMC,EAAW,GAAIC,EAAU,KAAOH,EAClF7/B,MAAM0/B,IACNh9B,KAAKu9B,IACN,IAAKA,EAAKvgC,MAAMggC,IACZ,OAAOO,EAEX,MAAM/gC,EAAUygC,GAAoBM,GACpC,GAAI/gC,EAAQghC,WAAW,KACnB,MA7CgB,EAAChhC,EAASihC,KAC9B,IAAKj+B,EAAKo7B,GAAUp+B,EAAQc,MAAM,KAC7Bs9B,IACDA,EAASp7B,EACTA,EAAMi+B,GAEV,MAAMC,EAAU9C,EAAOt9B,MAAM,MACtBqgC,EAAMC,EAAKC,EAAKC,EAAKC,EAAMC,GAAQN,EACpCO,EAAcP,EAAQ51B,QAAQo2B,QAAoBjgC,IAAVigC,IAAqBxhC,OACnE,OAAoB,IAAhBuhC,EACO,CAAEzI,EAAGh2B,EAAKy4B,EAAG0F,GAEJ,IAAhBM,EACO,CAAEzI,EAAGh2B,EAAK04B,EAAGyF,EAAM1F,EAAG2F,GAEb,IAAhBK,EACO,CAAEzI,EAAGh2B,EAAK2+B,EAAGR,EAAMzF,EAAG0F,EAAK3F,EAAG4F,GAElC,CAAErI,EAAGh2B,EAAK2+B,EAAGR,EAAMzF,EAAG0F,EAAK/J,EAAGgK,EAAKvF,EAAGwF,EAAKM,EAAGL,EAAM9F,EAAG+F,EAAM,EA2BzDK,CAAgBpB,GAAoBzgC,GAAU8gC,GAEzD,MAAMgB,EAvDgB,CAACp5B,IACvB,MAAOq5B,EAAU,MAAOC,GAAiBt5B,EAAK5H,MAAM,MAC7CmhC,EAAiB,GAAIn3B,GAAQi3B,EAAQjhC,MAAM,MAC3CkC,EAAKk/B,GAAcD,EAAenhC,MAAM,KAC/C,MAAO,CAAEk4B,EAAGh2B,EAAK/C,EAAG6K,EAAM0wB,EAAkB,KAAf0G,EAAmBpG,EAAGkG,EAAe,EAmD/CG,CAAkBniC,GAGrC,OAFA8gC,EAAUgB,EAAW9I,GAAK8H,GACzBD,IAAaA,EAAWC,GAClBgB,CAAU,IAEhBt+B,KAAKu9B,IACN,GAAoB,iBAATA,EACP,OAAOA,EACNA,EAAK/H,IACN+H,EAAK/H,EAAI6H,GAAY,KACzB,MAAMuB,EAzEY,CAACrB,GAAS3oB,OAAOiqB,YAAYjqB,OAAOrY,KAAKghC,GAAMv9B,KAAKR,IACtE,MAAM/B,EAAM8/B,EAAK/9B,GACjB,MAAO,CACHA,EACAuD,MAAMC,QAAQvF,GAAOA,EAAIuC,KAAK8+B,GAAMA,aAA6B,EAASA,EAAEr/B,SAAUhC,MAAUA,EAAMA,EAAMA,aAAiC,EAASA,EAAIgC,OAC7J,KAoEes/B,CAAcxB,GAC9B,OAAOH,GAhFgB4B,EAgFaJ,EAhFFhqB,OAAOiqB,YAE7CjqB,OAAO8oB,QAAQsB,GACVh/B,KAAI,EAAER,EAAKzC,KAAmB,MAARyC,GAAezC,GAAkB,KAATA,GAAgB,CAACyC,EAAKzC,KACpE+K,OAAOm3B,WA4EuCL,EAhFzB,IAACI,CAgF+B,ICnFpDE,GAAkB,CAACC,EAAYX,EAAeY,IAAiBZ,EAAca,QAAO,CAACtiC,EAAOuiC,KAC9F,IAAIriC,EAAIib,ED8CehT,EC7CvB,OAE4G,QAFpGgT,EAAMonB,EAAatiC,MAAM+/B,IAC3B,CAAEwC,IAAY,IAAItiC,EAAI,OAA+B,QAAvBA,EAAKsiC,EAAMxiC,UAA2B,IAAPE,EAAgBA,EAAKsiC,EAAM,IAAO,EAA/F,ED4CiBr6B,EC5C2Fo6B,ED4ClF1qB,OAAOiqB,YAAY5B,GAAoB/3B,GACtE5H,MAAM,KACN0C,KAAKu9B,GAASA,EAAKjgC,MAAM,OACzB+hC,QAAO,CAACG,EAAatB,IACD,IAAjBA,EAAMxhC,OACC,IAAI8iC,EAAatB,EAAMl+B,KAAKk+B,GAAUA,EAAMz+B,WAIvD+/B,EAAYA,EAAY9iC,OAAS,GAAG,IAAM,IAAMwhC,EAAM,GAC/CsB,IACR,OCtD2C,QAAnCviC,EAAKkiC,EAAWG,UAAkC,IAAPriC,OAAgB,EAASA,EAAG2e,KAAKujB,EAAYpiC,UAA4B,IAAPmb,EAAgBA,EAAKnb,CAAK,GAC/IqiC,GAiBGK,GAA+B,QAexBC,GAAY,CAACC,EAAWC,EAAaT,EAAY/d,KAC1D,MAAMye,EAAWze,EAAK,GAChB2N,EAAW8Q,GAAgC,iBAAbA,GAAyBA,EAASj9B,cAAgBgS,OAEtF,MAlBmB,EAAC+qB,EAAWC,EAAaT,EAAY/d,IAASue,EAChE3/B,KAAKu9B,IACN,GAAoB,iBAATA,EACP,OAAOA,EAEX,MAAQ/H,EAAGh2B,EAAM,IAAK84B,EAAGkG,EAAgB,IAAOjB,EAC1CxgC,EAAQqkB,EAAK5hB,GACnB,GDN6B,CAAC+9B,MAAYA,EAAKrF,IAAKqF,EAAKtF,GCMrD6H,CAAkBvC,GAClB,QAA0B,kBAAVxgC,EAAuBA,EAAQwgC,EAAKrF,EAAIqF,EAAKtF,EAzBnD,EAAC2H,GAAezB,IAAGjG,IAAGrE,IAAGyE,IAAG8F,IAAGnG,KAAKl7B,KAClD,OAAQohC,GAAc,GAATphC,EAAa,OAAS6iC,EAAYG,OAAOhjC,IAClD,IAAK,OACD,OAAOohC,EACX,IAAK,MACD,OAAOjG,EACX,IAAK,MACD,OAAOrE,EACX,IAAK,MACD,OAAOyE,QAA6BA,EAAIL,EAC5C,IAAK,OACD,OAAOmG,QAA6BA,EAAInG,EAC5C,QACI,OAAOA,EACd,EAWqE+H,CAAUJ,EAAarC,EAAMxgC,KAAW,IAAIH,QAAQ6iC,GAA8B1iC,GAExJ,MAAMkjC,EAAiBzB,EAAc9hC,OAASwiC,GAAgBC,EAAYX,EAAezhC,GAASA,EAClG,OAAQ,IAAMkjC,QAAuDA,EAAiB,KAAKxgC,MAAM,IAEhGqe,KAAK,IAKCoiB,CAAeP,EAAWC,EAAaT,EADL,IAAhB/d,EAAK1kB,QAAgBqyB,EAAW8Q,EAAWze,EACM,EC3CxE+e,GAAuB,CAACC,EAAQjB,KAClC,MAAMkB,EAAQ,CAAA,EACRT,EAAc,IAAIU,KAAKC,YAAYH,GACzC,MAAO,CAACl7B,KAASkc,IAASse,GCHI,EAACW,EAAOn7B,IAASm7B,EAAMn7B,KAAUm7B,EAAMn7B,GAAQg4B,GAAah4B,IDGtDs7B,CAAmBH,EAAOn7B,GAAO06B,EAAaT,EAAY/d,EAAK,EAUvG,MAAMqf,GAAO,CAACC,EAAc,CAAA,EAAIC,IAAwC,iBAAhBD,EAClDC,EAAYvkB,KAAK,KAAMskB,GACvB9rB,OAAOC,OAAOD,OAAOgsB,gBAAe,IAAM,IAAI,OAAQ,CAAEC,UAAU,IAASH,GAE3EI,GAAc,CAACJ,EAAaC,IAAgB,IAAII,MAAMN,GAAKC,EAAaC,GAAc,CACxFzjC,IAAK,CAACoI,EAAQ9F,IACNA,IAAQwuB,OAAOgT,SACR,GAAGhT,OAAOgT,UAAU5kB,KAAKxH,OAAOgmB,OAAOt1B,GAAQtF,KAAKk+B,GAAUuC,GAAKvC,EAAOyC,MAC9EG,GAAYx7B,EAAO9F,GAAMmhC,KEfxC,MAAMM,GAAqB,CACzB,QCNa,CACbC,QAAS,CACP9J,KAAM,SAASx3B,EAAa,YAC5B23B,KAAM,SAAS33B,EAAa,YAC5BuhC,UAAW,eAAevhC,EAAa,YACvC47B,UAAW,YACX4F,WAAY,kBACZC,aAAc,gBACdC,aAAc,gBACdC,UAAW,YACXC,UAAW,aACXC,YAAa,eACbC,WAAY,cACZC,aAAc,gBACdC,eAAgB,kBAChBC,eAAgB,kBAChBC,KAAM,SAASliC,EAAa,YAC5BmiC,OAAQ,WAAWniC,EAAa,YAChCoiC,UAAW,cAAcpiC,EAAa,YACtCqiC,cAAe,gBACfC,YAAa,cACbC,UAAW,YACX/c,KAAM,cACNgd,aAAc,gBACdC,cAAe,iBACfC,KAAM,OACN3d,GAAI,kBACJ4d,UAAW,aACXC,QAAS,UACTC,SAAU,YACVC,SAAU,YACVC,SAAU,YACVC,SAAU,YACVC,SAAU,YACVC,SAAU,YACVpyB,KAAM,OACNqyB,MAAO,YACPjxB,OAAQ,SACRkxB,WAAY,cACZC,SAAU,YACVC,UAAW,aACXC,UAAW,aACXC,UAAW,YACXC,MAAO,QACPC,YAAa,gBAEfhB,KAAM,CACJiB,QAAS,WACTjpB,IAAK,WACLkpB,MAAO,aACPC,KAAM,yBACNhpB,KAAM,uBACNkd,KAAM,OACN+L,OAAQ,eAEVL,MAAO,CACLM,KAAM,cACNv6B,OAAQ,SACRw6B,SAAU,WACVn9B,KAAM,OACNo9B,MAAO,cACPC,aAAc,6BACdC,QAAS,WACTC,OAAQ,WAEVzB,UAAW,CACT0B,SAAU,oBD3DZ,QEPa,CACb/C,QAAS,CACP9J,KAAM,OAAOx3B,EAAa,YAC1B23B,KAAM,OAAO33B,EAAa,YAC1BuhC,UAAW,OAAOvhC,EAAa,YAC/B47B,UAAW,KACX4F,WAAY,KACZC,aAAc,KACdC,aAAc,OACdC,UAAW,OACXC,UAAW,MACXC,YAAa,KACbC,WAAY,MACZC,aAAc,OACdC,eAAgB,OAChBC,eAAgB,OAChBC,KAAM,OAAOliC,EAAa,YAC1BmiC,OAAQ,OAAOniC,EAAa,YAC5BoiC,UAAW,QAAQpiC,EAAa,YAChCqiC,cAAe,MACfC,YAAa,KACbC,UAAW,KACX/c,KAAM,OACNgd,aAAc,OACdC,cAAe,MACfC,KAAM,KACN3d,GAAI,MACJ4d,UAAW,MACXC,QAAS,KACTC,SAAU,OACVC,SAAU,OACVC,SAAU,OACVC,SAAU,OACVC,SAAU,OACVC,SAAU,OACVpyB,KAAM,KACNqyB,MAAO,OACPjxB,OAAQ,KACRkxB,WAAY,KACZC,SAAU,OACVC,UAAW,OACXC,UAAW,OACXC,UAAW,OACXC,MAAO,KACPC,YAAa,MAEfhB,KAAM,CACJiB,QAAS,MACTjpB,IAAK,SACLkpB,MAAO,OACPC,KAAM,SACNhpB,KAAM,OACNkd,KAAM,KACN+L,OAAQ,QAEVL,MAAO,CACLM,KAAM,OACNv6B,OAAQ,KACRw6B,SAAU,MACVn9B,KAAM,MACNo9B,MAAO,WACPC,aAAc,SACdC,QAAS,KACTC,OAAQ,MAEVzB,UAAW,CACT0B,SAAU,WF1DZC,GGRa,CACbhD,QAAS,CACP9J,KAAM,SAASx3B,EAAa,YAC5B23B,KAAM,SAAS33B,EAAa,YAC5BuhC,UAAW,UAAUvhC,EAAa,YAClC47B,UAAW,OACX4F,WAAY,SACZC,aAAc,UACdC,aAAc,UACdC,UAAW,SACXC,UAAW,MACXC,YAAa,OACbC,WAAY,MACZC,aAAc,UACdC,eAAgB,YAChBC,eAAgB,YAChBC,KAAM,OAAOliC,EAAa,YAC1BmiC,OAAQ,OAAOniC,EAAa,YAC5BoiC,UAAW,OAAOpiC,EAAa,YAC/BqiC,cAAe,QACfC,YAAa,QACbC,UAAW,QACX/c,KAAM,WACNgd,aAAc,QACdC,cAAe,SACfC,KAAM,MACN3d,GAAI,OACJ4d,UAAW,UACXC,QAAS,OACTC,SAAU,SACVC,SAAU,SACVC,SAAU,SACVC,SAAU,SACVC,SAAU,SACVC,SAAU,SACVpyB,KAAM,MACNqyB,MAAO,OACPjxB,OAAQ,QACRkxB,WAAY,OACZC,SAAU,QACVC,UAAW,WACXC,UAAW,MACXC,UAAW,QACXC,MAAO,KACPC,YAAa,SAEfhB,KAAM,CACJiB,QAAS,SACTjpB,IAAK,UACLkpB,MAAO,QACPC,KAAM,cACNhpB,KAAM,SACNkd,KAAM,KACN+L,OAAQ,UAEVL,MAAO,CACLM,KAAM,WACNv6B,OAAQ,KACRw6B,SAAU,OACVn9B,KAAM,OACNo9B,MAAO,YACPC,aAAc,aACdC,QAAS,KACTC,OAAQ,MAEVzB,UAAW,CACT0B,SAAU,aHzDZE,GITa,CACbjD,QAAS,CACP9J,KAAM,SAASx3B,EAAa,YAC5B23B,KAAM,SAAS33B,EAAa,YAC5BuhC,UAAW,UAAUvhC,EAAa,YAClC47B,UAAW,MACX4F,WAAY,MACZC,aAAc,QACdC,aAAc,SACdC,UAAW,QACXC,UAAW,QACXC,YAAa,SACbC,WAAY,SACZC,aAAc,SACdC,eAAgB,UAChBC,eAAgB,WAChBC,KAAM,OAAOliC,EAAa,YAC1BmiC,OAAQ,SAASniC,EAAa,YAC9BoiC,UAAW,OAAOpiC,EAAa,YAC/BqiC,cAAe,MACfC,YAAa,MACbC,UAAW,QACX/c,KAAM,SACNgd,aAAc,SACdC,cAAe,SACfC,KAAM,KACN3d,GAAI,MACJ4d,UAAW,QACXC,QAAS,KACTC,SAAU,OACVC,SAAU,OACVC,SAAU,OACVC,SAAU,OACVC,SAAU,OACVC,SAAU,OACVpyB,KAAM,KACNqyB,MAAO,KACPjxB,OAAQ,OACRkxB,WAAY,KACZC,SAAU,QACVC,UAAW,WACXC,UAAW,QACXC,UAAW,QACXC,MAAO,MACPC,YAAa,OAEfhB,KAAM,CACJiB,QAAS,OACTjpB,IAAK,SACLkpB,MAAO,SACPC,KAAM,WACNhpB,KAAM,QACNkd,KAAM,KACN+L,OAAQ,SAEVL,MAAO,CACLM,KAAM,WACNv6B,OAAQ,KACRw6B,SAAU,SACVn9B,KAAM,SACNo9B,MAAO,WACPC,aAAc,kBACdC,QAAS,KACTC,OAAQ,MAEVzB,UAAW,CACT0B,SAAU,aJtDRG,GAAqBxvB,OAAOrY,KAAK0kC,IAEjCoD,GAA+C,CAAA,EAC/CC,GAAgD,CAAA,EAahDC,GAAcnE,IACdiE,GAAcjE,KAGlBiE,GAAcjE,GAAUa,GAAmBb,GARtB,CAACA,IACtBkE,GAAiBlE,GAPc,EAOkB,EAQjDoE,CAAepE,GAAO,EAGWgE,GAAQ5mC,QAAQ+mC,IAWnD,MAEanE,GAXM,CAACA,GFjCb,SAAoBA,EAAQqE,EAActF,EAAa,CAAA,GAC1D,OAAO2B,GAAY2D,EAActE,GAAqBC,EAAQjB,GAClE,CEgCEuF,CACEtE,EACAiE,GAAcjE,GACdkE,GAAiBlE,IAOCuE,CAFLP,GAAQlmC,QAAQqC,OAAOqkC,gBAAkB,EAAIrkC,OAAOqkC,cAAgB,SK9CvEC,GAAuC,CACnD,CACE9nC,MAAO,KACPmI,KAAM,qDAAqDk7B,GAAOc,QAAQuB,qBAE5E,CACE1lC,MAAO,KACPmI,KAAM,qDAAqDk7B,GAAOc,QAAQwB,qBAE5E,CACE3lC,MAAO,KACPmI,KAAM,qDAAqDk7B,GAAOc,QAAQyB,qBAE5E,CACE5lC,MAAO,KACPmI,KAAM,qDAAqDk7B,GAAOc,QAAQ0B,qBAE5E,CACE7lC,MAAO,KACPmI,KAAM,qDAAqDk7B,GAAOc,QAAQ2B,qBAE5E,CACE9lC,MAAO,KACPmI,KAAM,qDAAqDk7B,GAAOc,QAAQ4B,qBAE5E,CACE/lC,MAAO,IACPmI,KAAMk7B,GAAOc,QAAQ1F,cAIZsJ,GAAoC,CAC/C,CACEja,KAAM1uB,EAAMe,IAAI,gBAChBH,MAAO,WACPmI,KAAMk7B,GAAOc,QAAQG,gBAEvB,CACExW,KAAM1uB,EAAMe,IAAI,gBAChBH,MAAO,WACPmI,KAAMk7B,GAAOc,QAAQI,gBAEvB,CACEzW,KAAM1uB,EAAMe,IAAI,aAChBH,MAAO,YACPmI,KAAMk7B,GAAOc,QAAQK,cAIZwD,GAAqC,CAChD,CACEla,KAAM1uB,EAAMe,IAAI,aAChBH,MAAO,OACPmI,KAAMk7B,GAAOc,QAAQM,aAEvB,CACE3W,KAAM1uB,EAAMe,IAAI,eAChBH,MAAO,SACPmI,KAAMk7B,GAAOc,QAAQO,eAEvB,CACE5W,KAAM1uB,EAAMe,IAAI,cAChBH,MAAO,QACPmI,KAAMk7B,GAAOc,QAAQQ,cAEvB,CACE7W,KAAM1uB,EAAMe,IAAI,gBAChBH,MAAO,UACPmI,KAAMk7B,GAAOc,QAAQS,iBAIZqD,GAAsC,CACjD,CACEna,KAAM1uB,EAAMe,IAAI,kBAChBH,MAAO,WACPmI,KAAMk7B,GAAOc,QAAQU,kBAEvB,CACE/W,KAAM1uB,EAAMe,IAAI,kBAChBH,MAAO,WACPmI,KAAMk7B,GAAOc,QAAQW,mBAsFZoD,GAAyC,CACpD,CACEpa,KAAM1uB,EAAMe,IAAI,UAChBH,MAAO,SACPmI,KAAMk7B,GAAOc,QAAQa,UAEvB,CACElX,KAAM1uB,EAAMe,IAAI,aAChBH,MAAO,YACPmI,KAAMk7B,GAAOc,QAAQc,aAEvB,CACEnX,KAAM1uB,EAAMe,IAAI,iBAChBH,MAAO,gBACPmI,KAAMk7B,GAAOc,QAAQe,iBAEvB,CACEpX,KAAM1uB,EAAMe,IAAI,eAChBH,MAAO,cACPmI,KAAMk7B,GAAOc,QAAQgB,eAEvB,CACErX,KAAM1uB,EAAMe,IAAI,aAChBH,MAAO,YACPmI,KAAMk7B,GAAOc,QAAQiB,aAEvB,CACEtX,KAAM1uB,EAAMe,IAAI,QAChBH,MAAO,OACPmI,KAAMk7B,GAAOc,QAAQ9b,SAKnB8f,GAAmB,CAEvB,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UACzH,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UACzH,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UACzH,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UACzH,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UACzH,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UACzH,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UACzH,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UACzH,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UACzH,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAEzH,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,WAE9GC,GAAqC,CAChD,CACEta,KAAM1uB,EAAMe,IAAI,gBAChBH,MAAO,GACPmI,KAAMk7B,GAAOc,QAAQoC,gBAGzB,IAAK,MAAMve,KAASmgB,GAClBC,GAAerkC,KAAK,CAClB/D,MAAOgoB,EAAMvmB,cACb0G,KAAM6f,EAAMnnB,gBCxNhB,MAAMwnC,GAAwC,IAAIhpC,IAAI,CACpD,CAAC,SAAU,QACX,CAAC,KAAM,UACP,CAAC,IAAK,UACN,CAAC,IAAK,aACN,CAAC,IAAK,iBACN,CAAC,MAAO,eACR,CAAC,MAAO,aACR,CAAC,OAAQ,UAGEipC,GAA8B,CACzC,CACEliC,KAAM,OACNmE,KAAM,SACNujB,KAAM1uB,EAAMe,IAAI,QAChB0tB,QAASwV,GAAOc,QAAQ9J,OACxBrM,QAAS,CAAC4R,EAAQ5/B,KAChB4/B,EAAOnC,QAAQlH,QAAQv2B,EAAM,GAGjC,CACEoG,KAAM,OACNmE,KAAM,SACNujB,KAAM1uB,EAAMe,IAAI,QAChB0tB,QAASwV,GAAOc,QAAQ3J,OACxBxM,QAAS,CAAC4R,EAAQ5/B,KAChB4/B,EAAOnC,QAAQlH,QAAQv2B,EAAM,GAGjC,CACEoG,KAAM,YACNmE,KAAM,SACNujB,KAAM1uB,EAAMe,IAAI,aAChB0tB,QAASwV,GAAOc,QAAQC,YACxBpW,QAAS,CAAC4R,EAAQ5/B,KAChB4/B,EAAOnC,QAAQlH,QAAQv2B,EAAM,GAGjC,CACEoG,KAAM,YACNmE,KAAM,SACNujB,KAAM1uB,EAAMe,IAAI,aAChB0tB,QAASwV,GAAOc,QAAQ1F,YACxBpI,WAAYX,KAAkBA,EAAartB,MAAKwC,GAAsB,MAAdA,EAAKzE,OAC7D4nB,QAAS4R,IACPA,EAAOnC,QAAQlH,QAAQ,UAAW,IAAI,GAG1C,CACEnwB,KAAM,aACNmE,KAAM,SACNujB,KAAM1uB,EAAMe,IAAI,cAChB0tB,QAASwV,GAAOc,QAAQE,aACxBrW,QAAS,CAAC4R,EAAQ5/B,KAChB4/B,EAAOnC,QAAQlH,QAAQv2B,EAAM,GAGjC,CACEoG,KAAM,eACNmE,KAAM,SACNujB,KAAM1uB,EAAMe,IAAI,gBAChB0tB,QAASwV,GAAOc,QAAQG,eACxBjO,WAAYX,KAAkBA,EAAartB,MAAKwC,GAAsB,OAAdA,EAAKzE,OAC7D4nB,QAAS4R,IACPA,EAAOnC,QAAQlH,QAAQ,OAAQ,WAAW,GAG9C,CACEnwB,KAAM,eACNmE,KAAM,SACNujB,KAAM1uB,EAAMe,IAAI,gBAChB0tB,QAASwV,GAAOc,QAAQI,eACxBlO,WAAYX,KAAkBA,EAAartB,MAAKwC,GAAsB,OAAdA,EAAKzE,OAAkByE,EAAK/E,KAAK2F,QAAQ,UACjGuiB,QAAS4R,IACPA,EAAOnC,QAAQlH,QAAQ,OAAQ,WAAW,GAG9C,CACEnwB,KAAM,YACNmE,KAAM,SACNujB,KAAM1uB,EAAMe,IAAI,aAChB0tB,QAASwV,GAAOc,QAAQK,YACxBnO,WAAYX,KAAkBA,EAAartB,MAAKwC,GAAsB,OAAdA,EAAKzE,MAA4C,cAA3ByE,EAAK/E,KAAKuB,KAAK,UAC7F2mB,QAAS4R,IACPA,EAAOnC,QAAQlH,QAAQ,OAAQ,YAAY,GAG/C,CACEnwB,KAAM,YACNmE,KAAM,SACNujB,KAAM1uB,EAAMe,IAAI,aAChB0tB,QAASwV,GAAOc,QAAQM,YACxBpO,WAAYX,KAAkBA,EAAartB,MAAKwC,GAAQA,EAAK/E,KAAKa,SAA2C,SAAhCkE,EAAK/E,KAAKyG,IAAI,gBAC3FyhB,QAAS4R,IACPA,EAAOnC,QAAQlH,QAAQ,QAAS,OAAO,GAG3C,CACEnwB,KAAM,cACNmE,KAAM,SACNujB,KAAM1uB,EAAMe,IAAI,eAChB0tB,QAASwV,GAAOc,QAAQO,cACxBrO,WAAYX,KAAkBA,EAAartB,MAAKwC,GAAQA,EAAK/E,KAAKa,SAA2C,WAAhCkE,EAAK/E,KAAKyG,IAAI,gBAC3FyhB,QAAS4R,IACPA,EAAOnC,QAAQlH,QAAQ,QAAS,SAAS,GAG7C,CACEnwB,KAAM,aACNmE,KAAM,SACNujB,KAAM1uB,EAAMe,IAAI,cAChB0tB,QAASwV,GAAOc,QAAQQ,aACxBtO,WAAYX,KAAkBA,EAAartB,MAAKwC,GAAQA,EAAK/E,KAAKa,SAA2C,UAAhCkE,EAAK/E,KAAKyG,IAAI,gBAC3FyhB,QAAS4R,IACPA,EAAOnC,QAAQlH,QAAQ,QAAS,QAAQ,GAG5C,CACEnwB,KAAM,eACNmE,KAAM,SACNujB,KAAM1uB,EAAMe,IAAI,gBAChB0tB,QAASwV,GAAOc,QAAQS,eACxBvO,WAAYX,KAAkBA,EAAartB,MAAKwC,GAAQA,EAAK/E,KAAKa,SAA2C,YAAhCkE,EAAK/E,KAAKyG,IAAI,gBAC3FyhB,QAAS4R,IACPA,EAAOnC,QAAQlH,QAAQ,QAAS,UAAU,GAG9C,CACEnwB,KAAM,iBACNmE,KAAM,SACNujB,KAAM1uB,EAAMe,IAAI,kBAChB0tB,QAASwV,GAAOc,QAAQU,iBACxB7W,QAAS4R,IACPA,EAAOnC,QAAQlH,QAAQ,SAAU,WAAW,GAGhD,CACEnwB,KAAM,iBACNmE,KAAM,SACNujB,KAAM1uB,EAAMe,IAAI,kBAChB0tB,QAASwV,GAAOc,QAAQW,iBACxB9W,QAAS4R,IACPA,EAAOnC,QAAQlH,QAAQ,SAAU,WAAW,GAGhD,CACEnwB,KAAM,OACNmE,KAAM,SACNujB,KAAM1uB,EAAMe,IAAI,QAChB0tB,QAASwV,GAAOc,QAAQY,OACxB/W,QAAS,CAAC4R,EAAQ5/B,KAChB4/B,EAAOnC,QAAQlH,QAAQv2B,EAAM,GAGjC,CACEoG,KAAM,SACNmE,KAAM,SACNujB,KAAM1uB,EAAMe,IAAI,UAChB0tB,QAASwV,GAAOc,QAAQa,SACxBhX,QAAS,CAAC4R,EAAQ5/B,KAChB4/B,EAAOnC,QAAQlH,QAAQv2B,EAAM,GAGjC,CACEoG,KAAM,YACNmE,KAAM,SACNujB,KAAM1uB,EAAMe,IAAI,aAChB0tB,QAASwV,GAAOc,QAAQc,YACxBjX,QAAS,CAAC4R,EAAQ5/B,KAChB4/B,EAAOnC,QAAQlH,QAAQv2B,EAAM,GAGjC,CACEoG,KAAM,gBACNmE,KAAM,SACNujB,KAAM1uB,EAAMe,IAAI,iBAChB0tB,QAASwV,GAAOc,QAAQe,gBACxBlX,QAAS,CAAC4R,EAAQ5/B,KAChB4/B,EAAOnC,QAAQlH,QAAQv2B,EAAM,GAGjC,CACEoG,KAAM,cACNmE,KAAM,SACNujB,KAAM1uB,EAAMe,IAAI,eAChB0tB,QAASwV,GAAOc,QAAQgB,cACxBnX,QAAS,CAAC4R,EAAQ5/B,KAChB4/B,EAAOnC,QAAQlH,QAAQv2B,EAAM,GAGjC,CACEoG,KAAM,YACNmE,KAAM,SACNujB,KAAM1uB,EAAMe,IAAI,aAChB0tB,QAASwV,GAAOc,QAAQiB,YACxBpX,QAAS,CAAC4R,EAAQ5/B,KAChB4/B,EAAOnC,QAAQlH,QAAQv2B,EAAM,GAGjC,CACEoG,KAAM,OACNmE,KAAM,SACNujB,KAAM1uB,EAAMe,IAAI,QAChB0tB,QAASwV,GAAOc,QAAQ9b,OACxB2F,QAAS,CAAC4R,EAAQ5/B,KAChB4/B,EAAOnC,QAAQlH,QAAQv2B,EAAM,GAGjC,CACEoG,KAAM,eACNmE,KAAM,SACNujB,KAAM1uB,EAAMe,IAAI,gBAChB0tB,QAASwV,GAAOc,QAAQkB,eACxBrX,QAAS,CAAC4R,EAAQ5/B,KAChB4/B,EAAOnC,QAAQlH,QAAQv2B,EAAM,GAGjC,CACEoG,KAAM,gBACNmE,KAAM,SACNujB,KAAM1uB,EAAMe,IAAI,iBAChB0tB,QAASwV,GAAOc,QAAQmB,gBACxBtX,QAAS,CAAC4R,EAAQ5/B,KAChB4/B,EAAOnC,QAAQlH,QAAQv2B,EAAM,GAGjC,CACEoG,KAAM,OACNmE,KAAM,SACNujB,KAAM1uB,EAAMe,IAAI,QAChB0tB,QAASwV,GAAOc,QAAQoB,OACxBvX,QAAS,CAAC4R,EAAQ5/B,KAChB4/B,EAAOnC,QAAQlH,QAAQv2B,EAAM,GAGjC,CACEoG,KAAM,KACNmE,KAAM,SACNujB,KAAM1uB,EAAMe,IAAI,MAChB0tB,QAASwV,GAAOc,QAAQvc,KACxBoG,QAAS,CAAC4R,EAAQ5/B,KAChB4/B,EAAOnC,QAAQlH,QAAQv2B,EAAM,GAGjC,CACEoG,KAAM,YACNmE,KAAM,SACNujB,KAAM1uB,EAAMe,IAAI,aAChB0tB,QAASwV,GAAOc,QAAQqB,YACxBxX,QAAS,CAAC4R,EAAQ5/B,KAChB4/B,EAAOnC,QAAQlH,QAAQv2B,EAAM,GAGjC,CACEoG,KAAM,UACNmE,KAAM,WACNwlB,SAAU3wB,EAAMe,IAAI,QACpByvB,aAAc,IACd/B,QAASwV,GAAOc,QAAQsB,UACxBj5B,MAAO,QACP6hB,SAAU,OACVI,UAAWqZ,GACXjY,SAAU,CAAC+P,EAAQ5/B,KACjB4/B,EAAOnC,QAAQlH,QAAQ,UAAWv2B,EAAM,GAG5C,CACEoG,KAAM,OACNmE,KAAM,WACNwlB,SAAU3wB,EAAMe,IAAI,QACpB2tB,KAAM1uB,EAAMe,IAAI,QAChByvB,aAAc,GACd/B,QAASwV,GAAOc,QAAQxwB,OACxBnH,MAAO,OACP6hB,SAAU,OACVI,UAAWsZ,GACXlY,SAAU,CAAC+P,EAAQ5/B,KACjB4/B,EAAOnC,QAAQlH,QAAQ,OAAQv2B,EAAM,GAGzC,CACEoG,KAAM,QACNmE,KAAM,WACNwlB,SAAU3wB,EAAMe,IAAI,QACpB2tB,KAAM1uB,EAAMe,IAAI,aAChByvB,aAAc,GACd/B,QAASwV,GAAOc,QAAQ6B,QACxBx5B,MAAO,OACP6hB,SAAU,OACVI,UAAWuZ,GACXnY,SAAU,CAAC+P,EAAQ5/B,KACjB4/B,EAAOnC,QAAQlH,QAAQ,QAASv2B,EAAM,GAG1C,CACEoG,KAAM,SACNmE,KAAM,WACNwlB,SAAU3wB,EAAMe,IAAI,QACpB2tB,KAAM1uB,EAAMe,IAAI,kBAChByvB,aAAc,GACd/B,QAASwV,GAAOc,QAAQpvB,SACxBvI,MAAO,OACP6hB,SAAU,OACVI,UAAWwZ,GACXpY,SAAU,CAAC+P,EAAQ5/B,KACjB4/B,EAAOnC,QAAQlH,QAAQ,SAAUv2B,EAAM,GAG3C,CACEoG,KAAM,aACNmE,KAAM,WACNwlB,SAAU3wB,EAAMe,IAAI,QACpByvB,aAAc,WACd/B,QAASwV,GAAOc,QAAQ8B,aACxBz5B,MAAO,QACP6hB,SAAU,OACVI,UDlPmD,CACrD,CACEzuB,MAAO,QACPmI,KAAM,kDAER,CACEnI,MAAO,cACPmI,KAAM,kEAER,CACEnI,MAAO,gBACPmI,KAAM,sEAER,CACEnI,MAAO,cACPmI,KAAM,kEAER,CACEnI,MAAO,UACPmI,KAAM,sDAER,CACEnI,MAAO,YACPmI,KAAM,0DAER,CACEnI,MAAO,SACPmI,KAAM,oDAER,CACEnI,MAAO,WACPmI,KAAM,4DAER,CACEnI,MAAO,SACPmI,KAAM,oDAER,CACEnI,MAAO,kBACPmI,KAAM,0EAER,CACEnI,MAAO,eACPmI,KAAM,oEAER,CACEnI,MAAO,UACPmI,KAAM,uDCoMN0nB,SAAU,CAAC+P,EAAQ5/B,KACjB4/B,EAAOnC,QAAQlH,QAAQ,aAAcv2B,EAAM,GAG/C,CACEoG,KAAM,WACNmE,KAAM,WACNwlB,SAAU3wB,EAAMe,IAAI,QACpByvB,aAAc,OACd/B,QAASwV,GAAOc,QAAQ+B,WACxB15B,MAAO,OACP6hB,SAAU,OACVI,UD5MiD,CACnD,CACEzuB,MAAO,OACPmI,KAAM,QAER,CACEnI,MAAO,OACPmI,KAAM,QAER,CACEnI,MAAO,OACPmI,KAAM,QAER,CACEnI,MAAO,OACPmI,KAAM,QAER,CACEnI,MAAO,OACPmI,KAAM,QAER,CACEnI,MAAO,OACPmI,KAAM,QAER,CACEnI,MAAO,OACPmI,KAAM,SCkLN0nB,SAAU,CAAC+P,EAAQ5/B,KACjB4/B,EAAOnC,QAAQlH,QAAQ,WAAYv2B,EAAM,GAG7C,CACEoG,KAAM,YACNmE,KAAM,WACNujB,KAAM1uB,EAAMe,IAAI,QAChByvB,aAAc,GACd/B,QAASwV,GAAOc,QAAQgC,YACxB35B,MAAO,OACP6hB,SAAU,OACVI,UAAWyZ,GACX5R,eAAgBZ,UACd,MAAMpG,EAAgB,GACtB,IAAK,MAAMzkB,KAAQ6qB,EACjB,GAAI7qB,EAAK/E,KAAKe,OAAQ,CACpB,MAAMT,EAAsC,QAA/BlG,EAAAmoC,GAAiBloC,IAAI0K,EAAKzE,aAAK,IAAAlG,EAAAA,EAAI2K,EAAKzE,KACrDkpB,EAAcvrB,KAAKqC,EACpB,CAEH,OAAOkpB,CAAa,EAEtBO,SAAU,CAAC+P,EAAQ5/B,KACjB4/B,EAAOnC,QAAQlH,QAAQv2B,EAAM,GAGjC,CACEoG,KAAM,YACNmE,KAAM,WACNwlB,SAAU3wB,EAAMe,IAAI,QACpB2tB,KAAM1uB,EAAMe,IAAI,aAChB6vB,WAAY5wB,EAAMe,IAAI,mBACtByvB,aAAc,UACd/B,QAASwV,GAAOc,QAAQiC,YACxB55B,MAAO,OACP6hB,SAAU,QACVI,UAAW2Z,GACXvY,SAAU,CAAC+P,EAAQ5/B,KACjB4/B,EAAOnC,QAAQlH,QAAQ,YAAav2B,EAAM,GAG9C,CACEoG,KAAM,YACNmE,KAAM,WACNwlB,SAAU3wB,EAAMe,IAAI,QACpB2tB,KAAM1uB,EAAMe,IAAI,aAChB6vB,WAAY5wB,EAAMe,IAAI,mBACtByvB,aAAc,UACd/B,QAASwV,GAAOc,QAAQkC,YACxB75B,MAAO,OACP6hB,SAAU,QACVI,UAAW2Z,GACXvY,SAAU,CAAC+P,EAAQ5/B,KACjB4/B,EAAOnC,QAAQlH,QAAQ,YAAav2B,EAAM,GAG9C,CACEoG,KAAM,QACNmE,KAAM,SACNujB,KAAM1uB,EAAMe,IAAI,SAChB0tB,QAASwV,GAAOc,QAAQmC,QACxBiC,OAAQ,UACRC,UAAU,IC5YR,SAAUC,GAAY9wB,GAC1B,MAAMioB,OAAEA,EAAM/iB,KAAEA,EAAIG,QAAEA,EAAOS,UAAEA,GAAa9F,GACtC8kB,mBAAEA,EAAkBC,mBAAEA,EAAkBC,kBAAEA,GAAsBiD,EAAOjoB,OAC7E,GAAIglB,EAAkBx7B,QAAQ0b,EAAKtS,MAAQ,EACzC,MAAM,IAAIqG,MAAM,wCAAwCiM,EAAKtS,2BAA2BoyB,EAAkB5b,KAAK,cAEjH,MAAMkK,EAAM2U,EAAOR,UAAU,QAAS,CACpC7hB,IAAKmrB,IAAIC,gBAAgB9rB,GACzBK,OAAQ,YACR9W,KAAMyW,EAAKzW,KACXwiC,KAAM/rB,EAAK+rB,KACXr+B,KAAMsS,EAAKtS,KACXs+B,aAAchsB,EAAKgsB,eAEfltB,EAAMM,GAAQ,CAClBG,WAAYJ,IACV,MAAM8sB,EAAc7d,EAAInlB,KAAKuC,KAAK,iBAC5BmU,EAAUza,KAAKC,MAAMga,EAAEQ,SAC7BssB,EAAY3gC,KAAK,GAAGqU,EAAU,IAAMA,EAAU,OAAO,EAEvDQ,QAAS,CAAC+rB,EAAO1e,KACfjlB,EAAM2jC,EAAMvnC,WAAY6oB,GACxBY,EAAItF,YAAY,SAAU,SAC1BsF,EAAI/E,SACAlJ,GACFA,GACD,EAEHS,UAAW4M,IACT,IAAKA,EAAK9M,IAMR,OALA0N,EAAItF,YAAY,SAAU,SAC1BsF,EAAI/E,cACAlJ,GACFA,KAIJiO,EAAItF,YAAY,CACdzI,OAAQ,OACRK,IAAK8M,EAAK9M,MAEZ0N,EAAI/E,SACJ0Z,EAAOvB,QAAQzD,OACXnd,GACFA,GACD,EAEHZ,OACAQ,OAAQqf,EACRtf,OAAQqf,IAGV,OADAxR,EAAIlF,QAAQ,MAAOpK,GACZsP,CACT,CCtDA,MAAM+d,GAAyB,CAC7B,OACA,OACA,IACA,UACA,WACA,IACA,gBACA,eACA,OACA,YACA,IACA,YACA,YACA,IACA,QACA,OACA,SACA,OACA,aACA,MASIC,GAA2C,IAAI5pC,IAErDipC,GAAa7nC,SAAQoK,IACnBo+B,GAAe3xB,IAAIzM,EAAKzE,KAAMyE,EAAK,ICuE9B,SAASq+B,GAAUrV,EAASsV,EAAYC,EAAGC,GAE9C,OAAO,IAAKD,IAAMA,EAAIE,WAAU,SAAUC,EAASC,GAC/C,SAASC,EAAUzpC,GAAS,IAAM0pC,EAAKL,EAAU3/B,KAAK1J,GAAQ,CAAG,MAAOgc,GAAKwtB,EAAOxtB,GAAO,CAC3F,SAAS2tB,EAAS3pC,GAAS,IAAM0pC,EAAKL,EAAiB,MAAErpC,GAAU,CAAC,MAAOgc,GAAKwtB,EAAOxtB,GAAO,CAC9F,SAAS0tB,EAAKnnC,GAJlB,IAAevC,EAIauC,EAAOqnC,KAAOL,EAAQhnC,EAAOvC,QAJ1CA,EAIyDuC,EAAOvC,MAJhDA,aAAiBopC,EAAIppC,EAAQ,IAAIopC,GAAE,SAAUG,GAAWA,EAAQvpC,EAAO,KAIhB6pC,KAAKJ,EAAWE,EAAY,CAC9GD,GAAML,EAAYA,EAAU5jC,MAAMouB,EAASsV,GAAc,KAAKz/B,OACtE,GACA;;;;;AC7GA,SAASrF,GAAc2H,EAAWmM,EAAS2xB,GACzC,MAAMC,EAAK9lC,SAASI,cAAc8T,GAUlC,OARInM,IACF+9B,EAAG/9B,UAAYA,GAGb89B,GACFA,EAAWr8B,YAAYs8B,GAGlBA,CACT,CA2BA,SAASC,GAAeD,EAAIE,EAAGnsB,GAC7BisB,EAAGrmC,MAAM8I,MAAqB,iBAANy9B,EAAiB,GAAGA,MAAQA,EACpDF,EAAGrmC,MAAMmJ,OAAsB,iBAANiR,EAAiB,GAAGA,MAAQA,CACvD,CDoQkD,mBAApBosB,iBAAiCA,gBC/P/D,MAAMC,GACE,OADFA,GAEK,UAFLA,GAGI,SAHJA,GAIG,QAsBT,SAASC,GAAsBluB,EAAQmuB,EAAgBviC,EAAS7D,UAE9D,IAAIQ,EAAW,GAEf,GAAIyX,aAAkBouB,QACpB7lC,EAAW,CAACyX,QACP,GAAIA,aAAkBquB,UAAYvkC,MAAMC,QAAQiW,GACrDzX,EAAWuB,MAAMgD,KAAKkT,OACjB,CACL,MAAMnT,EAA6B,iBAAXmT,EAAsBA,EAASmuB,EAEnDthC,IACFtE,EAAWuB,MAAMgD,KAAKlB,EAAOpD,iBAAiBqE,IAEjD,CAED,OAAOtE,CACT,CAiBA,SAAS+lC,KACP,SAAUxnC,UAAUynC,SAAUznC,UAAUynC,OAAOxqC,MAAM,UACvD,CA4NA,IAAAyqC,GAAA,MAKE,WAAA7kC,CAAY0E,EAAMogC,GAChB5kC,KAAKwE,KAAOA,EACZxE,KAAK6kC,kBAAmB,EAEpBD,GACF9yB,OAAOC,OAAO/R,KAAM4kC,EAEvB,CAED,cAAA5c,GACEhoB,KAAK6kC,kBAAmB,CACzB,GASHC,GAAA,MACE,WAAAhlC,GAIEE,KAAK+kC,WAAa,GAKlB/kC,KAAKglC,SAAW,GAGhBhlC,KAAKilC,UAAO9pC,EAGZ6E,KAAKktB,aAAU/xB,CAChB,CASD,SAAA+pC,CAAU7kC,EAAMuc,EAAIuoB,EAAW,KAC7B,IAAIC,EAAqBC,EAAsBC,EAE1CtlC,KAAKglC,SAAS3kC,KACjBL,KAAKglC,SAAS3kC,GAAQ,IAGwB,QAA/C+kC,EAAsBplC,KAAKglC,SAAS3kC,UAA2C,IAAxB+kC,GAAkCA,EAAoBpnC,KAAK,CACjH4e,KACAuoB,aAE+C,QAAhDE,EAAuBrlC,KAAKglC,SAAS3kC,UAA4C,IAAzBglC,GAAmCA,EAAqBE,MAAK,CAACC,EAAIC,IAAOD,EAAGL,SAAWM,EAAGN,WACtH,QAA5BG,EAAatlC,KAAKilC,YAAiC,IAAfK,GAAyBA,EAAWJ,UAAU7kC,EAAMuc,EAAIuoB,EAC9F,CAQD,YAAAO,CAAarlC,EAAMuc,GACb5c,KAAKglC,SAAS3kC,KAEhBL,KAAKglC,SAAS3kC,GAAQL,KAAKglC,SAAS3kC,GAAM2E,QAAOA,GAAUA,EAAO4X,KAAOA,KAGvE5c,KAAKilC,MACPjlC,KAAKilC,KAAKS,aAAarlC,EAAMuc,EAEhC,CASD,YAAA+oB,CAAatlC,KAASie,GACpB,IAAIsnB,EAMJ,OAJiD,QAAhDA,EAAuB5lC,KAAKglC,SAAS3kC,UAA4C,IAAzBulC,GAAmCA,EAAqBlrC,SAAQsK,IAEvHsZ,EAAK,GAAKtZ,EAAO4X,GAAGld,MAAMM,KAAMse,EAAK,IAEhCA,EAAK,EACb,CAQD,EAAA/Z,CAAGlE,EAAMuc,GACP,IAAIipB,EAAuBC,EAEtB9lC,KAAK+kC,WAAW1kC,KACnBL,KAAK+kC,WAAW1kC,GAAQ,IAG0B,QAAnDwlC,EAAwB7lC,KAAK+kC,WAAW1kC,UAA6C,IAA1BwlC,GAAoCA,EAAsB7nC,KAAK4e,GAI7F,QAA7BkpB,EAAc9lC,KAAKilC,YAAkC,IAAhBa,GAA0BA,EAAYvhC,GAAGlE,EAAMuc,EACtF,CAQD,GAAAhY,CAAIvE,EAAMuc,GACR,IAAImpB,EAEA/lC,KAAK+kC,WAAW1kC,KAElBL,KAAK+kC,WAAW1kC,GAAQL,KAAK+kC,WAAW1kC,GAAM2E,QAAOP,GAAYmY,IAAOnY,KAG5C,QAA7BshC,EAAc/lC,KAAKilC,YAAkC,IAAhBc,GAA0BA,EAAYnhC,IAAIvE,EAAMuc,EACvF,CASD,QAAAopB,CAAS3lC,EAAMukC,GACb,IAAIqB,EAEJ,GAAIjmC,KAAKilC,KACP,OAAOjlC,KAAKilC,KAAKe,SAAS3lC,EAAMukC,GAGlC,MAAM1/B,EAEN,IAAIghC,GAAgB7lC,EAAMukC,GAI1B,OAHqD,QAApDqB,EAAyBjmC,KAAK+kC,WAAW1kC,UAA8C,IAA3B4lC,GAAqCA,EAAuBvrC,SAAQ+J,IAC/HA,EAASqU,KAAK9Y,KAAMkF,EAAM,IAErBA,CACR,GAIHihC,GAAA,MAKE,WAAArmC,CAAYsmC,EAAU/nC,GAOpB,GAFA2B,KAAK3C,QAAUiB,GAAc,mCAAoC8nC,EAAW,MAAQ,MAAO/nC,GAEvF+nC,EAAU,CACZ,MAAMC,EAENrmC,KAAK3C,QACLgpC,EAAMC,SAAW,QACjBD,EAAMtkB,IAAM,GACZskB,EAAM1sB,IAAMysB,EACZC,EAAMxgC,aAAa,OAAQ,eAC5B,CAED7F,KAAK3C,QAAQwI,aAAa,cAAe,OAC1C,CAOD,gBAAA0gC,CAAiB9/B,EAAOK,GACjB9G,KAAK3C,UAImB,QAAzB2C,KAAK3C,QAAQ+U,SAIf6xB,GAAejkC,KAAK3C,QAAS,IAAK,QAClC2C,KAAK3C,QAAQM,MAAM6oC,gBAAkB,MACrCxmC,KAAK3C,QAAQM,MAAM8oC,UA9fzB,SAA2Bhd,EAAGkH,EAAG+V,GAC/B,IAAIC,EAAY,eAAeld,OAAOkH,GAAK,SAM3C,YAJcx1B,IAAVurC,IACFC,GAAa,YAAYD,KAASA,QAG7BC,CACT,CAsfqCC,CAAkB,EAAG,EAAGngC,EAAQ,MAE/Dw9B,GAAejkC,KAAK3C,QAASoJ,EAAOK,GAEvC,CAED,OAAA+/B,GACE,IAAIC,EAEmC,QAAlCA,EAAgB9mC,KAAK3C,eAAuC,IAAlBypC,GAA4BA,EAAchlC,YACvF9B,KAAK3C,QAAQiJ,SAGftG,KAAK3C,QAAU,IAChB,GAYH0pC,GAAA,MAME,WAAAjnC,CAAYknC,EAAUC,EAAUrsC,GAC9BoF,KAAKinC,SAAWA,EAChBjnC,KAAKV,KAAO0nC,EACZhnC,KAAKpF,MAAQA,EAGboF,KAAK3C,aAAUlC,EAGf6E,KAAKknC,iBAAc/rC,EAGnB6E,KAAKmnC,WAAQhsC,EACb6E,KAAKonC,oBAAsB,EAC3BpnC,KAAKqnC,qBAAuB,EAC5BrnC,KAAKyG,MAAQlL,OAAOyE,KAAKV,KAAK4kC,IAAM3oC,OAAOyE,KAAKV,KAAKmH,QAAU,EAC/DzG,KAAK8G,OAASvL,OAAOyE,KAAKV,KAAKyY,IAAMxc,OAAOyE,KAAKV,KAAKwH,SAAW,EACjE9G,KAAKsnC,YAAa,EAClBtnC,KAAKunC,UAAW,EAChBvnC,KAAKwnC,YAAa,EAGlBxnC,KAAKynC,MAAQrD,GAETpkC,KAAKV,KAAKkF,KACZxE,KAAKwE,KAAOxE,KAAKV,KAAKkF,KACbxE,KAAKV,KAAKqa,IACnB3Z,KAAKwE,KAAO,QAEZxE,KAAKwE,KAAO,OAGdxE,KAAKinC,SAASjB,SAAS,cAAe,CACpCtsC,QAASsG,MAEZ,CAED,iBAAA0nC,GACM1nC,KAAKknC,cAAgBlnC,KAAK2nC,mBAE5BxZ,YAAW,KACLnuB,KAAKknC,cACPlnC,KAAKknC,YAAYL,UACjB7mC,KAAKknC,iBAAc/rC,EACpB,GACA,IAEN,CASD,IAAAysC,CAAKC,EAAQC,GACX,GAAI9nC,KAAKmnC,OAASnnC,KAAK+nC,iBACrB,GAAK/nC,KAAKknC,YAKH,CACL,MAAMc,EAAgBhoC,KAAKknC,YAAY7pC,QAEnC2qC,IAAkBA,EAAc52B,eAClCpR,KAAKmnC,MAAM9oC,UAAUmJ,QAAQwgC,EAEhC,KAXsB,CACrB,MAAMC,EAAiBjoC,KAAKinC,SAAStB,aAAa,oBAElD3lC,KAAKV,KAAK4oC,OAAQloC,KAAKmnC,MAAMgB,eAAenoC,KAAKV,KAAK4oC,KAAcloC,MACpEA,KAAKknC,YAAc,IAAIkB,GAAYH,EAAgBjoC,KAAKmnC,MAAM9oC,UACtE,CASQ2B,KAAK3C,UAAYyqC,GAIjB9nC,KAAKinC,SAASjB,SAAS,cAAe,CACxCtsC,QAASsG,KACT6nC,WACChD,mBAIC7kC,KAAKqoC,kBACProC,KAAK3C,QAAUiB,GAAc,YAAa,OAGtC0B,KAAKonC,qBACPpnC,KAAKsoC,UAAUT,KAGjB7nC,KAAK3C,QAAUiB,GAAc,gBAAiB,OAC9C0B,KAAK3C,QAAQkB,UAAYyB,KAAKV,KAAK6H,MAAQ,IAGzC2gC,GAAU9nC,KAAKmnC,OACjBnnC,KAAKmnC,MAAMoB,mBAAkB,GAEhC,CAQD,SAAAD,CAAUT,GACR,IAAIW,EAAgBC,EAEpB,IAAKzoC,KAAKqoC,mBAAqBroC,KAAK3C,SAAW2C,KAAKinC,SAASjB,SAAS,mBAAoB,CACxFtsC,QAASsG,KACT6nC,WACChD,iBACD,OAGF,MAAM6D,EAEN1oC,KAAK3C,QACL2C,KAAK2oC,oBAED3oC,KAAKV,KAAKspC,SACZF,EAAaE,OAAS5oC,KAAKV,KAAKspC,QAGlCF,EAAa/uB,IAA2C,QAApC6uB,EAAiBxoC,KAAKV,KAAKqa,WAAoC,IAAnB6uB,EAA4BA,EAAiB,GAC7GE,EAAa3mB,IAA2C,QAApC0mB,EAAiBzoC,KAAKV,KAAKyiB,WAAoC,IAAnB0mB,EAA4BA,EAAiB,GAC7GzoC,KAAKynC,MAAQrD,GAETsE,EAAaG,SACf7oC,KAAK8oC,YAELJ,EAAaxxB,OAAS,KACpBlX,KAAK8oC,UAAU,EAGjBJ,EAAa1xB,QAAU,KACrBhX,KAAKiX,SAAS,EAGnB,CAQD,QAAA8xB,CAAS5B,GACPnnC,KAAKmnC,MAAQA,EACbnnC,KAAKunC,UAAW,EAChBvnC,KAAKinC,SAAWE,EAAMlC,IACvB,CAMD,QAAA6D,GACE9oC,KAAKynC,MAAQrD,GAETpkC,KAAKmnC,OAASnnC,KAAK3C,UACrB2C,KAAKinC,SAASjB,SAAS,eAAgB,CACrCmB,MAAOnnC,KAAKmnC,MACZztC,QAASsG,OAGPA,KAAKmnC,MAAM6B,UAAYhpC,KAAKmnC,MAAM8B,gBAAkBjpC,KAAK3C,QAAQyE,aACnE9B,KAAK2H,SACL3H,KAAKmnC,MAAMoB,mBAAkB,IAG3BvoC,KAAKynC,QAAUrD,IAAqBpkC,KAAKynC,QAAUrD,IACrDpkC,KAAK0nC,oBAGV,CAMD,OAAAzwB,GACEjX,KAAKynC,MAAQrD,GAETpkC,KAAKmnC,QACPnnC,KAAKkpC,eACLlpC,KAAKinC,SAASjB,SAAS,eAAgB,CACrCmB,MAAOnnC,KAAKmnC,MACZgC,SAAS,EACTzvC,QAASsG,OAEXA,KAAKinC,SAASjB,SAAS,YAAa,CAClCmB,MAAOnnC,KAAKmnC,MACZztC,QAASsG,OAGd,CAMD,SAAAopC,GACE,OAAOppC,KAAKinC,SAAStB,aAAa,mBAAoB3lC,KAAKynC,QAAUrD,GAAoBpkC,KAC1F,CAMD,OAAAmpC,GACE,OAAOnpC,KAAKynC,QAAUrD,EACvB,CAMD,cAAAiE,GACE,MAAqB,UAAdroC,KAAKwE,IACb,CASD,gBAAA+hC,CAAiB9/B,EAAOK,GACtB,GAAK9G,KAAK3C,UAIN2C,KAAKknC,aACPlnC,KAAKknC,YAAYX,iBAAiB9/B,EAAOK,IAGvC9G,KAAKinC,SAASjB,SAAS,gBAAiB,CAC1CtsC,QAASsG,KACTyG,QACAK,WACC+9B,mBAIHZ,GAAejkC,KAAK3C,QAASoJ,EAAOK,GAEhC9G,KAAKqoC,mBAAqBroC,KAAKmpC,YAAW,CAC5C,MAAME,GAAuBrpC,KAAKonC,qBAAuB3gC,EACzDzG,KAAKonC,oBAAsB3gC,EAC3BzG,KAAKqnC,qBAAuBvgC,EAExBuiC,EACFrpC,KAAKsoC,WAAU,GAEftoC,KAAK2oC,oBAGH3oC,KAAKmnC,OACPnnC,KAAKinC,SAASjB,SAAS,kBAAmB,CACxCmB,MAAOnnC,KAAKmnC,MACZ1gC,QACAK,SACApN,QAASsG,MAGd,CACF,CAMD,UAAAspC,GACE,OAAOtpC,KAAKinC,SAAStB,aAAa,oBAAqB3lC,KAAKqoC,kBAAoBroC,KAAKynC,QAAUrD,GAAkBpkC,KAClH,CAMD,iBAAA2oC,GAME,IAAK3oC,KAAKqoC,mBAAqBroC,KAAK3C,UAAY2C,KAAKV,KAAKspC,OACxD,OAGF,MAAMrI,EAENvgC,KAAK3C,QACCksC,EAAavpC,KAAKinC,SAAStB,aAAa,mBAAoB3lC,KAAKonC,oBAAqBpnC,QAEvFugC,EAAMiJ,QAAQC,iBAAmBF,EAAa/tC,SAAS+kC,EAAMiJ,QAAQC,gBAAiB,OACzFlJ,EAAMmJ,MAAQH,EAAa,KAC3BhJ,EAAMiJ,QAAQC,gBAAkB5vC,OAAO0vC,GAE1C,CAMD,cAAAxB,GACE,OAAO/nC,KAAKinC,SAAStB,aAAa,wBAAyB3lC,KAAKqoC,iBAAkBroC,KACnF,CAMD,QAAA2pC,GACM3pC,KAAKinC,SAASjB,SAAS,kBAAmB,CAC5CtsC,QAASsG,OACR6kC,kBAIH7kC,KAAK4nC,MAAK,EACX,CAMD,eAAAD,GACE,OAAO3nC,KAAKinC,SAAStB,aAAa,uBAAwB3lC,KAAKopC,YAAappC,KAC7E,CAMD,OAAA6mC,GACE7mC,KAAKunC,UAAW,EAChBvnC,KAAKmnC,WAAQhsC,EAET6E,KAAKinC,SAASjB,SAAS,iBAAkB,CAC3CtsC,QAASsG,OACR6kC,mBAIH7kC,KAAKsG,SAEDtG,KAAKknC,cACPlnC,KAAKknC,YAAYL,UACjB7mC,KAAKknC,iBAAc/rC,GAGjB6E,KAAKqoC,kBAAoBroC,KAAK3C,UAChC2C,KAAK3C,QAAQ6Z,OAAS,KACtBlX,KAAK3C,QAAQ2Z,QAAU,KACvBhX,KAAK3C,aAAUlC,GAElB,CAMD,YAAA+tC,GACE,GAAIlpC,KAAKmnC,MAAO,CACd,IAAIyC,EAAuBC,EAE3B,IAAIC,EAAaxrC,GAAc,kBAAmB,OAClDwrC,EAAWziC,UAAoL,QAAvKuiC,EAA6E,QAApDC,EAAyB7pC,KAAKinC,SAAS/Z,eAAgD,IAA3B2c,OAAoC,EAASA,EAAuBE,gBAAgD,IAA1BH,EAAmCA,EAAwB,GAClQE,EAEA9pC,KAAKinC,SAAStB,aAAa,sBAAuBmE,EAAY9pC,MAC9DA,KAAK3C,QAAUiB,GAAc,0CAA2C,OACxE0B,KAAK3C,QAAQqK,YAAYoiC,GACzB9pC,KAAKmnC,MAAM9oC,UAAUgJ,UAAY,GACjCrH,KAAKmnC,MAAM9oC,UAAUqJ,YAAY1H,KAAK3C,SACtC2C,KAAKmnC,MAAMoB,mBAAkB,GAC7BvoC,KAAK0nC,mBACN,CACF,CAMD,MAAA//B,GACE,GAAI3H,KAAKsnC,aAAetnC,KAAK3C,QAC3B,OAKF,GAFA2C,KAAKsnC,YAAa,EAEdtnC,KAAKynC,QAAUrD,GAEjB,YADApkC,KAAKkpC,eAIP,GAAIlpC,KAAKinC,SAASjB,SAAS,gBAAiB,CAC1CtsC,QAASsG,OACR6kC,iBACD,OAGF,MAAMmF,EAAkB,WAAYhqC,KAAK3C,QAErC2C,KAAKqoC,iBAaH2B,GAAkBhqC,KAAKmnC,SAAWnnC,KAAKmnC,MAAM6B,UAAYvE,OAC3DzkC,KAAKwnC,YAAa,EAKlBxnC,KAAK3C,QAAQgf,SAAS4tB,OAAM,SAAUC,SAAQ,KAC5ClqC,KAAKwnC,YAAa,EAClBxnC,KAAKmqC,aAAa,KAGpBnqC,KAAKmqC,cAEEnqC,KAAKmnC,QAAUnnC,KAAK3C,QAAQyE,YACrC9B,KAAKmnC,MAAM9oC,UAAUqJ,YAAY1H,KAAK3C,QAEzC,CAQD,QAAA+sC,IACMpqC,KAAKinC,SAASjB,SAAS,kBAAmB,CAC5CtsC,QAASsG,OACR6kC,kBAAqB7kC,KAAKmnC,QAIzBnnC,KAAKqoC,kBAAoBroC,KAAKwnC,aAAe/C,KAG/CzkC,KAAKmqC,cACInqC,KAAKmpC,WACdnpC,KAAK4nC,MAAK,GAAO,GAGf5nC,KAAKmnC,MAAMkD,eACbrqC,KAAKmnC,MAAMkD,cAAcxkC,aAAa,cAAe,SAExD,CAMD,UAAAykC,GACEtqC,KAAKinC,SAASjB,SAAS,oBAAqB,CAC1CtsC,QAASsG,OAGPA,KAAKmnC,OAASnnC,KAAKmnC,MAAMkD,eAC3BrqC,KAAKmnC,MAAMkD,cAAcxkC,aAAa,cAAe,OAExD,CAMD,MAAAS,GACEtG,KAAKsnC,YAAa,EAEdtnC,KAAKinC,SAASjB,SAAS,gBAAiB,CAC1CtsC,QAASsG,OACR6kC,mBAIC7kC,KAAK3C,SAAW2C,KAAK3C,QAAQyE,YAC/B9B,KAAK3C,QAAQiJ,SAGXtG,KAAKknC,aAAelnC,KAAKknC,YAAY7pC,SACvC2C,KAAKknC,YAAY7pC,QAAQiJ,SAE5B,CAMD,WAAA6jC,GACOnqC,KAAKsnC,aAINtnC,KAAKinC,SAASjB,SAAS,qBAAsB,CAC/CtsC,QAASsG,OACR6kC,mBAKC7kC,KAAKmnC,OAASnnC,KAAK3C,UAAY2C,KAAK3C,QAAQyE,YAC9C9B,KAAKmnC,MAAM9oC,UAAUqJ,YAAY1H,KAAK3C,SAGpC2C,KAAKynC,QAAUrD,IAAqBpkC,KAAKynC,QAAUrD,IACrDpkC,KAAK0nC,qBAER,GAuEH,SAAS6C,GAAmBC,EAAMtd,EAASud,EAAczD,EAAUpsC,GACjE,IAAI8vC,EAAe,EAEnB,GAAIxd,EAAQyd,UACVD,EAAexd,EAAQyd,UAAUF,EAAczD,EAAUpsC,GAAO4vC,QAC3D,GAAItd,EAAQ0d,QACjBF,EAAexd,EAAQ0d,QAAQJ,OAC1B,CACL,MAAMK,EAAiB,UAAYL,EAAK,GAAG1vC,cAAgB0vC,EAAK3xB,MAAM,GAElEqU,EAAQ2d,KAEVH,EAAexd,EAAQ2d,GAE1B,CAED,OAAOtvC,OAAOmvC,IAAiB,CACjC,CAgCA,IAAAI,GAAA,MAOE,WAAAhrC,CAAYotB,EAAS8Z,EAAUpsC,EAAOqqC,GACpCjlC,KAAKilC,KAAOA,EACZjlC,KAAKktB,QAAUA,EACfltB,KAAKgnC,SAAWA,EAChBhnC,KAAKpF,MAAQA,EAGboF,KAAK+qC,YAAc,KAGnB/qC,KAAKgrC,YAAc,KACnBhrC,KAAKirC,IAAM,EACXjrC,KAAKkrC,KAAO,EACZlrC,KAAKmrC,MAAQ,EACbnrC,KAAKorC,QAAU,EACfprC,KAAKqrC,UAAY,EACjBrrC,KAAK4sB,IAAM,EACX5sB,KAAK8sB,IAAM,CACZ,CAYD,MAAAwe,CAAOC,EAAUC,EAAWT,GAE1B,MAAMC,EAAc,CAClBvhB,EAAG8hB,EACH5a,EAAG6a,GAELxrC,KAAKgrC,YAAcA,EACnBhrC,KAAK+qC,YAAcA,EACnB,MAAMU,EAASV,EAAYthB,EAAIuhB,EAAYvhB,EACrCiiB,EAASX,EAAYpa,EAAIqa,EAAYra,EAC3C3wB,KAAKirC,IAAMjvC,KAAK8wB,IAAI,EAAG2e,EAASC,EAASD,EAASC,GAClD1rC,KAAKkrC,KAAOlvC,KAAK8wB,IAAI,EAAG2e,EAASC,EAASD,EAASC,GAGnD1rC,KAAKmrC,MAAQnvC,KAAK8wB,IAAI,EAAG4e,GACzB1rC,KAAKorC,QAAUprC,KAAK2rC,cACpB3rC,KAAKqrC,UAAYrrC,KAAK4rC,gBACtB5rC,KAAK4sB,IAAM5wB,KAAK4wB,IAAI5sB,KAAKorC,QAASprC,KAAKqrC,UAAWrrC,KAAK6rC,WACvD7rC,KAAK8sB,IAAM9wB,KAAK8wB,IAAI9sB,KAAKirC,IAAKjrC,KAAKorC,QAASprC,KAAKqrC,WAE7CrrC,KAAKilC,MACPjlC,KAAKilC,KAAKe,SAAS,mBAAoB,CACrC8F,WAAY9rC,KACZ+rC,UAAW/rC,KAAKgnC,UAGrB,CAUD,qBAAAgF,CAAsBC,GACpB,MAAMC,EAEND,EAAe,YACTE,EAAcnsC,KAAKktB,QAAQgf,GAEjC,GAAKC,EAIL,MAA2B,mBAAhBA,EACFA,EAAYnsC,MAGD,SAAhBmsC,EACKnsC,KAAKkrC,KAGM,QAAhBiB,EACKnsC,KAAKirC,IAGP1vC,OAAO4wC,EACf,CAYD,aAAAP,GACE,IAAIQ,EAAgBpsC,KAAKgsC,sBAAsB,aAE/C,OAAII,IAKJA,EAAgBpwC,KAAK8wB,IAAI,EAAc,EAAX9sB,KAAKirC,KAE7BjrC,KAAKgrC,aAAeoB,EAAgBpsC,KAAKgrC,YAAYvhB,EAtIrC,MAuIlB2iB,EAvIkB,IAuIgBpsC,KAAKgrC,YAAYvhB,GAG9C2iB,EACR,CASD,WAAAT,GACE,OAAO3rC,KAAKgsC,sBAAsB,YAAchsC,KAAKirC,GACtD,CAWD,OAAAY,GAGE,OAAO7rC,KAAKgsC,sBAAsB,QAAUhwC,KAAK4wB,IAAI,EAAc,EAAX5sB,KAAKirC,IAC9D,GAeH,SAASoB,GAAarF,EAAUC,EAAUrsC,GACxC,MAAMlB,EAAUutC,EAASqF,sBAAsBtF,EAAUpsC,GAGzD,IAAI2xC,EACJ,MAAMrf,QACJA,GACE+Z,EAGJ,GAAI/Z,EAAS,CAEX,IAAIud,EADJ8B,EAAY,IAAIC,GAAUtf,EAAS8Z,GAAW,GAI5CyD,EADExD,EAAShC,KACIgC,EAAShC,KAAKwF,aA1RnC,SAAyBvd,EAAS+X,GAChC,GAAI/X,EAAQuf,kBAAmB,CAC7B,MAAMC,EAAkBxf,EAAQuf,kBAAkBvf,EAAS+X,GAE3D,GAAIyH,EACF,OAAOA,CAEV,CAED,MAAO,CACLjjB,EAAGvrB,SAASyuC,gBAAgBC,YAK5Bjc,EAAGlzB,OAAOovC,YAEd,CA2QqBC,CAAgB5f,EAAS+Z,GAG1C,MAAM8D,EA/MV,SAAwB7d,EAASud,EAAczD,EAAUpsC,GACvD,MAAO,CACL6uB,EAAGghB,EAAahhB,EAAI8gB,GAAmB,OAAQrd,EAASud,EAAczD,EAAUpsC,GAAS2vC,GAAmB,QAASrd,EAASud,EAAczD,EAAUpsC,GACtJ+1B,EAAG8Z,EAAa9Z,EAAI4Z,GAAmB,MAAOrd,EAASud,EAAczD,EAAUpsC,GAAS2vC,GAAmB,SAAUrd,EAASud,EAAczD,EAAUpsC,GAE1J,CA0MwBmyC,CAAe7f,EAASud,EAAczD,EAAUpsC,GACpE2xC,EAAUjB,OAAO5xC,EAAQ+M,MAAO/M,EAAQoN,OAAQikC,EACjD,CAQD,OANArxC,EAAQiwC,WAEJ4C,GACF7yC,EAAQ6sC,iBAAiBvqC,KAAKgxC,KAAKtzC,EAAQ+M,MAAQ8lC,EAAUnB,SAAUpvC,KAAKgxC,KAAKtzC,EAAQoN,OAASylC,EAAUnB,UAGvG1xC,CACT,QAmCA,cAA6BuzC,GAM3B,WAAAC,GACE,IAAIC,EAEJ,IAAIC,EAAW,EACf,MAAMC,EAAgD,QAAlCF,EAAgBntC,KAAKktB,eAAuC,IAAlBigB,OAA2B,EAASA,EAAcE,WAE5GA,GAAc,WAAYA,EAE5BD,EAAWC,EAAWzzC,OACbyzC,GAAc,YAAaA,IAE/BA,EAAWC,QACdD,EAAWC,MAAQttC,KAAKutC,uBAAuBF,EAAWG,UAGxDH,EAAWC,QACbF,EAAWC,EAAWC,MAAM1zC,SAKhC,MAAMsL,EAAQlF,KAAKgmC,SAAS,WAAY,CACtCqH,aACAD,aAEF,OAAOptC,KAAK2lC,aAAa,WAAYzgC,EAAMkoC,SAAUC,EACtD,CAQD,qBAAAf,CAAsBP,EAAWnxC,GAC/B,OAAO,IAAI6yC,GAAQ1B,EAAW/rC,KAAMpF,EACrC,CAaD,WAAA8yC,CAAY9yC,GACV,IAAI+yC,EAEJ,MAAMN,EAAiD,QAAnCM,EAAiB3tC,KAAKktB,eAAwC,IAAnBygB,OAA4B,EAASA,EAAeN,WAGnH,IAAIO,EAAiB,CAAA,EAEjB3tC,MAAMC,QAAQmtC,GAEhBO,EAAiBP,EAAWzyC,GACnByyC,GAAc,YAAaA,IAK/BA,EAAWC,QACdD,EAAWC,MAAQttC,KAAKutC,uBAAuBF,EAAWG,UAG5DI,EAAiBP,EAAWC,MAAM1yC,IAGpC,IAAIosC,EAAW4G,EAEX5G,aAAoBzC,UACtByC,EAAWhnC,KAAK6tC,sBAAsB7G,IAKxC,MAAM9hC,EAAQlF,KAAKgmC,SAAS,WAAY,CACtCgB,SAAUA,GAAY,CAAE,EACxBpsC,UAEF,OAAOoF,KAAK2lC,aAAa,WAAYzgC,EAAM8hC,SAAUpsC,EACtD,CAUD,sBAAA2yC,CAAuBO,GACrB,IAAIC,EAAgBC,EAEpB,OAAwC,QAAnCD,EAAiB/tC,KAAKktB,eAAwC,IAAnB6gB,GAA6BA,EAAe7qC,UAAgD,QAAnC8qC,EAAiBhuC,KAAKktB,eAAwC,IAAnB8gB,GAA6BA,EAAeC,cACvL5J,GAAsBrkC,KAAKktB,QAAQhqB,SAAUlD,KAAKktB,QAAQ+gB,cAAeH,IAAmB,GAG9F,CAACA,EACT,CASD,qBAAAD,CAAsBxwC,GAEpB,MAAM2pC,EAAW,CACf3pC,WAEI6wC,EAEc,MAApB7wC,EAAQ+U,QAAkB/U,EAAUA,EAAQ4lB,cAAc,KAE1D,GAAIirB,EAAQ,CAGVlH,EAASrtB,IAAMu0B,EAAO1E,QAAQ2E,SAAWD,EAAO3rB,KAE5C2rB,EAAO1E,QAAQ4E,aACjBpH,EAAS4B,OAASsF,EAAO1E,QAAQ4E,YAGnCpH,EAASvgC,MAAQynC,EAAO1E,QAAQ6E,UAAY7yC,SAAS0yC,EAAO1E,QAAQ6E,UAAW,IAAM,EACrFrH,EAASlgC,OAASonC,EAAO1E,QAAQ8E,WAAa9yC,SAAS0yC,EAAO1E,QAAQ8E,WAAY,IAAM,EAExFtH,EAAS9C,EAAI8C,EAASvgC,MACtBugC,EAASjvB,EAAIivB,EAASlgC,OAElBonC,EAAO1E,QAAQ+E,WACjBvH,EAASxiC,KAAO0pC,EAAO1E,QAAQ+E,UAGjC,MAAMC,EAAcnxC,EAAQ4lB,cAAc,OAGxC,IAAIwrB,EADN,GAAID,EAKFxH,EAASkB,KAAOsG,EAAYE,YAAcF,EAAY70B,IACtDqtB,EAASjlB,IAAoE,QAA7D0sB,EAAwBD,EAAY/sC,aAAa,cAA8C,IAA1BgtC,EAAmCA,EAAwB,IAG9IP,EAAO1E,QAAQmF,aAAeT,EAAO1E,QAAQoF,WAC/C5H,EAAS6H,cAAe,EAE3B,CAED,OAAO7uC,KAAK2lC,aAAa,cAAeqB,EAAU3pC,EAAS6wC,EAC5D,CAUD,YAAA7B,CAAarF,EAAUpsC,GACrB,OAAOyxC,GAAarF,EAAUhnC,KAAMpF,EACrC,GA4CH,MAAMk0C,WAA2BC,GAI/B,WAAAjvC,CAAYotB,GACV8hB,QAGAhvC,KAAKktB,QAAUA,GAAW,GAC1BltB,KAAKivC,KAAO,EACZjvC,KAAKkvC,YAAa,EAMlBlvC,KAAKmvC,uBAAoBh0C,EACzB6E,KAAKovC,kBAAoBpvC,KAAKovC,kBAAkB91B,KAAKtZ,KACtD,CAOD,IAAAqvC,GAEEhL,GAAsBrkC,KAAKktB,QAAQsgB,QAASxtC,KAAKktB,QAAQoiB,iBAAiB50C,SAAQozC,IAChFA,EAAeppC,iBAAiB,QAAS1E,KAAKovC,mBAAmB,EAAM,GAE1E,CAMD,iBAAAA,CAAkBn5B,GAEhB,GAlmDJ,SAAwBA,GACtB,MAAO,WAAYA,GAAkB,IAAbA,EAAEs5B,QAAgBt5B,EAAEu5B,SAAWv5B,EAAEw5B,SAAWx5B,EAAEy5B,QAAUz5B,EAAE05B,QACpF,CAgmDQC,CAAe35B,IAChBxY,OAAOwnC,KAER,OAYF,IAAI4K,EAAe,CACjBpmB,EAAGxT,EAAE65B,QACLnf,EAAG1a,EAAE85B,SAGFF,EAAapmB,GAAMomB,EAAalf,IACnCkf,EAAe,MAGjB,IAAIG,EAAehwC,KAAKiwC,gBAAgBh6B,GACxC+5B,EAAehwC,KAAK2lC,aAAa,eAAgBqK,EAAc/5B,EAAGjW,MAGlE,MAAMqtC,EAAa,CACjBG,QAEAv3B,EAAEi6B,eAGAF,GAAgB,IAClB/5B,EAAE+R,iBACFhoB,KAAKmwC,YAAYH,EAAc3C,EAAYwC,GAE9C,CASD,eAAAI,CAAgBh6B,GAEd,GAAIjW,KAAKktB,QAAQkjB,kBACf,OAAOpwC,KAAKktB,QAAQkjB,kBAAkBt3B,KAAK9Y,KAAMiW,GAGnD,MAAMo6B,EAENp6B,EAAEzT,OAII8tC,EAHgBjM,GAAsBrkC,KAAKktB,QAAQhqB,SAAUlD,KAAKktB,QAAQ+gB,cAEhFh4B,EAAEi6B,eACsCK,WAAU/xC,GAASA,IAAU6xC,GAAiB7xC,EAAMgyC,SAASH,KAErG,OAA2B,IAAvBC,EACKA,EACEtwC,KAAKktB,QAAQhqB,UAAYlD,KAAKktB,QAAQ+gB,eAEvC,EAIH,CACR,CAWD,WAAAkC,CAAYv1C,EAAOyyC,EAAYwC,GAE7B,GAAIpyC,OAAOwnC,OAASjlC,KAAKktB,QACvB,OAAO,EAIT,IAAKmgB,GAAcrtC,KAAKktB,QAAQsgB,SAAWxtC,KAAKktB,QAAQhqB,SAAU,CAChE,MAAMutC,EAAkBpM,GAAsBrkC,KAAKktB,QAAQsgB,SAEvDiD,EAAgB,KAClBpD,EAAa,CACXG,QAASiD,EAAgB,IAG9B,CAQD,OALAzwC,KAAKktB,QAAQtyB,MAAQA,EAErBoF,KAAKktB,QAAQwjB,kBAAoBb,EACjC7vC,KAAKkvC,YAAa,EAClBlvC,KAAK2wC,QAAQ/1C,EAAOyyC,IACb,CACR,CASD,OAAAsD,CAAQ/1C,EAAOyyC,GACb,MAAMngB,QACJA,GACEltB,KAEAqtC,IACFngB,EAAQmgB,WAAaA,GAMvB,MAAMuD,EAAe,GACfC,SAAwB3jB,EAAQ4jB,WAEtC,GA7rDmB,mBADFl0B,EA8rDDsQ,EAAQ4jB,aA7rDSl0B,EAAGhE,WAAagE,EAAGhE,UAAUm4B,KA8rD5DH,EAAa5yC,KAAKulC,QAAQC,QAE1BtW,EAAQ4jB,iBACH,IAAuB,WAAnBD,EACT,MAAM,IAAIhmC,MAAM,+CACX,GAAuB,aAAnBgmC,EAKT,MAAM,IAAIhmC,MAAM,2BAJhB+lC,EAAa5yC,KAEbkvB,EAAQ4jB,aAGT,CA1sDL,IAAqBl0B,EA6sDkB,mBAAxBsQ,EAAQ8jB,aAEjBJ,EAAa5yC,KAAKkvB,EAAQ8jB,gBAGM,IAA9B9jB,EAAQ+jB,mBAA+Br2C,GAAS,IAClDoF,KAAKmvC,kBA7aX,SAAuBv0C,EAAOqsC,GAC5B,MAAMD,EAAWC,EAASyG,YAAY9yC,GAEtC,IAAIqsC,EAASjB,SAAS,gBAAiB,CACrCprC,QACAosC,aACCnC,iBAIH,OAAOwH,GAAarF,EAAUC,EAAUrsC,EAC1C,CAka+Bs2C,CAAct2C,EAAOoF,OAIhD,MAAMmxC,IAAQnxC,KAAKivC,KACnB1L,QAAQ6N,IAAIR,GAAc9M,MAAKuN,IAC7B,GAAIrxC,KAAKkvC,WAAY,CACnB,MAAMoC,EAAaD,EAAgB,GAEnCrxC,KAAKuxC,gBAAgBD,EAAYH,EAClC,IAEJ,CAQD,eAAAI,CAAgB1yB,EAAQsyB,GAMtB,GAAIA,IAAQnxC,KAAKivC,MAAQjvC,KAAKkvC,WAC5B,OAKF,GAFAlvC,KAAKkvC,YAAa,EAEdzxC,OAAOwnC,KACT,OASF,MAAMA,EAAyB,iBAAXpmB,EAAsB,IAAIA,EAAO2yB,QAAQxxC,KAAKktB,SAChE,IAAIrO,EAAO7e,KAAKktB,SAElBltB,KAAKilC,KAAOA,EACZxnC,OAAOwnC,KAAOA,EAIdnzB,OAAOrY,KAAKuG,KAAK+kC,YAAYrqC,SAAQ2F,IACnC,IAAIwlC,EAEgD,QAAnDA,EAAwB7lC,KAAK+kC,WAAW1kC,UAA6C,IAA1BwlC,GAAoCA,EAAsBnrC,SAAQkiB,IAC5HqoB,EAAK1gC,GAAGlE,EAERuc,EAAG,GACH,IAKJ9K,OAAOrY,KAAKuG,KAAKglC,UAAUtqC,SAAQ2F,IACjC,IAAI+kC,EAE4C,QAA/CA,EAAsBplC,KAAKglC,SAAS3kC,UAA2C,IAAxB+kC,GAAkCA,EAAoB1qC,SAAQsK,IACpHigC,EAAKC,UAAU7kC,EAAM2E,EAAO4X,GAAI5X,EAAOmgC,SAAS,GAChD,IAGAnlC,KAAKmvC,oBACPlK,EAAKwM,cAAcC,WAAW1xC,KAAKmvC,mBACnCnvC,KAAKmvC,uBAAoBh0C,GAG3B8pC,EAAK1gC,GAAG,WAAW,KAEjBvE,KAAKilC,UAAO9pC,SACLsC,OAAOwnC,IAAI,IAEpBA,EAAKoK,MACN,CAMD,OAAAxI,GACE,IAAIvB,EAEyB,QAA5BA,EAAatlC,KAAKilC,YAAiC,IAAfK,GAAyBA,EAAWuB,UACzE7mC,KAAKkvC,YAAa,EAClBlvC,KAAK+kC,WAAa,GAClBV,GAAsBrkC,KAAKktB,QAAQsgB,QAASxtC,KAAKktB,QAAQoiB,iBAAiB50C,SAAQozC,IAChFA,EAAe/oC,oBAAoB,QAAS/E,KAAKovC,mBAAmB,EAAM,GAE7E;;;;QCr5DH,SAAS9wC,GAAc2H,EAAWmM,EAAS2xB,GACzC,MAAMC,EAAK9lC,SAASI,cAAc8T,GAUlC,OARInM,IACF+9B,EAAG/9B,UAAYA,GAGb89B,GACFA,EAAWr8B,YAAYs8B,GAGlBA,CACT,CAOA,SAAS2N,GAAe/1C,EAAIC,GAQ1B,OAPAD,EAAG6tB,EAAI5tB,EAAG4tB,EACV7tB,EAAG+0B,EAAI90B,EAAG80B,OAEIx1B,IAAVU,EAAGuE,KACLxE,EAAGwE,GAAKvE,EAAGuE,IAGNxE,CACT,CAKA,SAASg2C,GAAW5wB,GAClBA,EAAEyI,EAAIztB,KAAKC,MAAM+kB,EAAEyI,GACnBzI,EAAE2P,EAAI30B,KAAKC,MAAM+kB,EAAE2P,EACrB,CASA,SAASkhB,GAAmBj2C,EAAIC,GAC9B,MAAM4tB,EAAIztB,KAAK81C,IAAIl2C,EAAG6tB,EAAI5tB,EAAG4tB,GACvBkH,EAAI30B,KAAK81C,IAAIl2C,EAAG+0B,EAAI90B,EAAG80B,GAC7B,OAAO30B,KAAK+1C,KAAKtoB,EAAIA,EAAIkH,EAAIA,EAC/B,CASA,SAASqhB,GAAYp2C,EAAIC,GACvB,OAAOD,EAAG6tB,IAAM5tB,EAAG4tB,GAAK7tB,EAAG+0B,IAAM90B,EAAG80B,CACtC,CAUA,SAASshB,GAAMt3C,EAAKmyB,EAAKF,GACvB,OAAO5wB,KAAK8wB,IAAI9wB,KAAK4wB,IAAIjyB,EAAKmyB,GAAMF,EACtC,CAUA,SAASga,GAAkBnd,EAAGkH,EAAG+V,GAC/B,IAAIC,EAAY,eAAeld,OAAOkH,GAAK,SAM3C,YAJcx1B,IAAVurC,IACFC,GAAa,YAAYD,KAASA,QAG7BC,CACT,CAUA,SAASuL,GAAalO,EAAIva,EAAGkH,EAAG+V,GAC9B1C,EAAGrmC,MAAM8oC,UAAYG,GAAkBnd,EAAGkH,EAAG+V,EAC/C,CACA,MAAMyL,GAAmB,2BAUzB,SAASC,GAAmBpO,EAAIwG,EAAM6H,EAAUC,GAI9CtO,EAAGrmC,MAAM40C,WAAa/H,EAAO,GAAGA,KAAQ6H,OAAcC,GAAQH,KAAqB,MACrF,CASA,SAASlO,GAAeD,EAAIE,EAAGnsB,GAC7BisB,EAAGrmC,MAAM8I,MAAqB,iBAANy9B,EAAiB,GAAGA,MAAQA,EACpDF,EAAGrmC,MAAMmJ,OAAsB,iBAANiR,EAAiB,GAAGA,MAAQA,CACvD,CAgCA,MAAMqsB,GACE,OADFA,GAEK,UAFLA,GAGI,SAHJA,GAIG,QA8CT,SAASK,KACP,SAAUxnC,UAAUynC,SAAUznC,UAAUynC,OAAOxqC,MAAM,UACvD,CAGA,IAAIs4C,IAAkB,EAGtB,IAEE/0C,OAAOiH,iBAAiB,OAAQ,KAAMoN,OAAOgsB,eAAe,CAAE,EAAE,UAAW,CACzE1jC,IAAK,KACHo4C,IAAkB,CAAI,IAG5B,CAAE,MAAOv8B,IAAK,CAYd,MAAMw8B,GACJ,WAAA3yC,GAKEE,KAAK0yC,MAAQ,EACd,CAWD,GAAAtsC,CAAI5D,EAAQgC,EAAMC,EAAUkuC,GAC1B3yC,KAAK4yC,gBAAgBpwC,EAAQgC,EAAMC,EAAUkuC,EAC9C,CAWD,MAAArsC,CAAO9D,EAAQgC,EAAMC,EAAUkuC,GAC7B3yC,KAAK4yC,gBAAgBpwC,EAAQgC,EAAMC,EAAUkuC,GAAS,EACvD,CAMD,SAAAE,GACE7yC,KAAK0yC,MAAMh4C,SAAQo4C,IACjB9yC,KAAK4yC,gBAAgBE,EAAStwC,OAAQswC,EAAStuC,KAAMsuC,EAASruC,SAAUquC,EAASH,SAAS,GAAM,EAAK,IAGvG3yC,KAAK0yC,MAAQ,EACd,CAcD,eAAAE,CAAgBpwC,EAAQgC,EAAMC,EAAUkuC,EAASI,EAAQC,GACvD,IAAKxwC,EACH,OAGF,MAAMywC,EAAaF,EAAS,sBAAwB,mBACtCvuC,EAAKhK,MAAM,KACnBE,SAAQw4C,IACZ,GAAIA,EAAO,CAGJF,IACCD,EAEF/yC,KAAK0yC,MAAQ1yC,KAAK0yC,MAAM1tC,QAAO8tC,GACtBA,EAAStuC,OAAS0uC,GAASJ,EAASruC,WAAaA,GAAYquC,EAAStwC,SAAWA,IAI1FxC,KAAK0yC,MAAM10C,KAAK,CACdwE,SACAgC,KAAM0uC,EACNzuC,WACAkuC,aAON,MAAMQ,IAAeX,IAAkB,CACrCG,QAASA,IAAW,GAEtBnwC,EAAOywC,GAAYC,EAAOzuC,EAAU0uC,EACrC,IAEJ,EAiBH,SAASrG,GAAgB5f,EAAS+X,GAChC,GAAI/X,EAAQuf,kBAAmB,CAC7B,MAAMC,EAAkBxf,EAAQuf,kBAAkBvf,EAAS+X,GAE3D,GAAIyH,EACF,OAAOA,CAEV,CAED,MAAO,CACLjjB,EAAGvrB,SAASyuC,gBAAgBC,YAK5Bjc,EAAGlzB,OAAOovC,YAEd,CAqCA,SAAStC,GAAmBC,EAAMtd,EAASud,EAAczD,EAAUpsC,GACjE,IAAI8vC,EAAe,EAEnB,GAAIxd,EAAQyd,UACVD,EAAexd,EAAQyd,UAAUF,EAAczD,EAAUpsC,GAAO4vC,QAC3D,GAAItd,EAAQ0d,QACjBF,EAAexd,EAAQ0d,QAAQJ,OAC1B,CACL,MAAMK,EAAiB,UAAYL,EAAK,GAAG1vC,cAAgB0vC,EAAK3xB,MAAM,GAElEqU,EAAQ2d,KAEVH,EAAexd,EAAQ2d,GAE1B,CAED,OAAOtvC,OAAOmvC,IAAiB,CACjC,CASA,SAASqC,GAAe7f,EAASud,EAAczD,EAAUpsC,GACvD,MAAO,CACL6uB,EAAGghB,EAAahhB,EAAI8gB,GAAmB,OAAQrd,EAASud,EAAczD,EAAUpsC,GAAS2vC,GAAmB,QAASrd,EAASud,EAAczD,EAAUpsC,GACtJ+1B,EAAG8Z,EAAa9Z,EAAI4Z,GAAmB,MAAOrd,EAASud,EAAczD,EAAUpsC,GAAS2vC,GAAmB,SAAUrd,EAASud,EAAczD,EAAUpsC,GAE1J,CAYA,MAAMw4C,GAIJ,WAAAtzC,CAAYqnC,GACVnnC,KAAKmnC,MAAQA,EACbnnC,KAAKosC,cAAgB,EACrBpsC,KAAKymB,OAEL,CACEgD,EAAG,EACHkH,EAAG,GAEL3wB,KAAK4sB,IAEL,CACEnD,EAAG,EACHkH,EAAG,GAEL3wB,KAAK8sB,IAEL,CACErD,EAAG,EACHkH,EAAG,EAEN,CAQD,MAAA2a,CAAOc,GACLpsC,KAAKosC,cAAgBA,EAEhBpsC,KAAKmnC,MAAM1gC,OAGdzG,KAAKqzC,YAAY,KAEjBrzC,KAAKqzC,YAAY,KAEjBrzC,KAAKmnC,MAAMlC,KAAKe,SAAS,aAAc,CACrCmB,MAAOnnC,KAAKmnC,SAPdnnC,KAAKszC,OAUR,CAQD,WAAAD,CAAYE,GACV,MAAMtO,KACJA,GACEjlC,KAAKmnC,MACHqM,EAASxzC,KAAKmnC,MAAe,MAAToM,EAAe,QAAU,UAAYvzC,KAAKosC,cAE9DxB,EAAUL,GADa,MAATgJ,EAAe,OAAS,MACItO,EAAK/X,QAAS+X,EAAKwF,aAAczqC,KAAKmnC,MAAM7nC,KAAMU,KAAKmnC,MAAMvsC,OACvGmwC,EAAc/qC,KAAKmnC,MAAM4D,YAAYwI,GAG3CvzC,KAAKymB,OAAO8sB,GAAQv3C,KAAKC,OAAO8uC,EAAcyI,GAAU,GAAK5I,EAE7D5qC,KAAK4sB,IAAI2mB,GAAQC,EAASzI,EAAc/uC,KAAKC,MAAM8uC,EAAcyI,GAAU5I,EAAU5qC,KAAKymB,OAAO8sB,GAEjGvzC,KAAK8sB,IAAIymB,GAAQC,EAASzI,EAAcH,EAAU5qC,KAAKymB,OAAO8sB,EAC/D,CAGD,KAAAD,GACEtzC,KAAKymB,OAAOgD,EAAI,EAChBzpB,KAAKymB,OAAOkK,EAAI,EAChB3wB,KAAK4sB,IAAInD,EAAI,EACbzpB,KAAK4sB,IAAI+D,EAAI,EACb3wB,KAAK8sB,IAAIrD,EAAI,EACbzpB,KAAK8sB,IAAI6D,EAAI,CACd,CAUD,UAAA8iB,CAAWF,EAAMG,GAEf,OAAOzB,GAAMyB,EAAW1zC,KAAK4sB,IAAI2mB,GAAOvzC,KAAK8sB,IAAIymB,GAClD,EAoBH,MAAM/G,GAOJ,WAAA1sC,CAAYotB,EAAS8Z,EAAUpsC,EAAOqqC,GACpCjlC,KAAKilC,KAAOA,EACZjlC,KAAKktB,QAAUA,EACfltB,KAAKgnC,SAAWA,EAChBhnC,KAAKpF,MAAQA,EAGboF,KAAK+qC,YAAc,KAGnB/qC,KAAKgrC,YAAc,KACnBhrC,KAAKirC,IAAM,EACXjrC,KAAKkrC,KAAO,EACZlrC,KAAKmrC,MAAQ,EACbnrC,KAAKorC,QAAU,EACfprC,KAAKqrC,UAAY,EACjBrrC,KAAK4sB,IAAM,EACX5sB,KAAK8sB,IAAM,CACZ,CAYD,MAAAwe,CAAOC,EAAUC,EAAWT,GAE1B,MAAMC,EAAc,CAClBvhB,EAAG8hB,EACH5a,EAAG6a,GAELxrC,KAAKgrC,YAAcA,EACnBhrC,KAAK+qC,YAAcA,EACnB,MAAMU,EAASV,EAAYthB,EAAIuhB,EAAYvhB,EACrCiiB,EAASX,EAAYpa,EAAIqa,EAAYra,EAC3C3wB,KAAKirC,IAAMjvC,KAAK8wB,IAAI,EAAG2e,EAASC,EAASD,EAASC,GAClD1rC,KAAKkrC,KAAOlvC,KAAK8wB,IAAI,EAAG2e,EAASC,EAASD,EAASC,GAGnD1rC,KAAKmrC,MAAQnvC,KAAK8wB,IAAI,EAAG4e,GACzB1rC,KAAKorC,QAAUprC,KAAK2rC,cACpB3rC,KAAKqrC,UAAYrrC,KAAK4rC,gBACtB5rC,KAAK4sB,IAAM5wB,KAAK4wB,IAAI5sB,KAAKorC,QAASprC,KAAKqrC,UAAWrrC,KAAK6rC,WACvD7rC,KAAK8sB,IAAM9wB,KAAK8wB,IAAI9sB,KAAKirC,IAAKjrC,KAAKorC,QAASprC,KAAKqrC,WAE7CrrC,KAAKilC,MACPjlC,KAAKilC,KAAKe,SAAS,mBAAoB,CACrC8F,WAAY9rC,KACZ+rC,UAAW/rC,KAAKgnC,UAGrB,CAUD,qBAAAgF,CAAsBC,GACpB,MAAMC,EAEND,EAAe,YACTE,EAAcnsC,KAAKktB,QAAQgf,GAEjC,GAAKC,EAIL,MAA2B,mBAAhBA,EACFA,EAAYnsC,MAGD,SAAhBmsC,EACKnsC,KAAKkrC,KAGM,QAAhBiB,EACKnsC,KAAKirC,IAGP1vC,OAAO4wC,EACf,CAYD,aAAAP,GACE,IAAIQ,EAAgBpsC,KAAKgsC,sBAAsB,aAE/C,OAAII,IAKJA,EAAgBpwC,KAAK8wB,IAAI,EAAc,EAAX9sB,KAAKirC,KAE7BjrC,KAAKgrC,aAAeoB,EAAgBpsC,KAAKgrC,YAAYvhB,EAtIrC,MAuIlB2iB,EAvIkB,IAuIgBpsC,KAAKgrC,YAAYvhB,GAG9C2iB,EACR,CASD,WAAAT,GACE,OAAO3rC,KAAKgsC,sBAAsB,YAAchsC,KAAKirC,GACtD,CAWD,OAAAY,GAGE,OAAO7rC,KAAKgsC,sBAAsB,QAAUhwC,KAAK4wB,IAAI,EAAc,EAAX5sB,KAAKirC,IAC9D,EASH,MAAM0I,GAMJ,WAAA7zC,CAAYR,EAAM1E,EAAOqqC,GACvBjlC,KAAKV,KAAOA,EACZU,KAAKpF,MAAQA,EACboF,KAAKilC,KAAOA,EACZjlC,KAAKgpC,SAAWpuC,IAAUqqC,EAAK2O,UAC/B5zC,KAAK6zC,kBAAoB,EAGzB7zC,KAAK+qC,YAAc,CACjBthB,EAAG,EACHkH,EAAG,GAIL3wB,KAAK8zC,IAAM,CACTrqB,EAAG,EACHkH,EAAG,GAEL3wB,KAAKmoC,aAAenoC,KAAKgpC,WAAa/D,EAAK8O,OAAOC,OAClDh0C,KAAK8rC,WAAa,IAAIU,GAAUvH,EAAK/X,QAAS5tB,EAAM1E,EAAOqqC,GAC3DjlC,KAAKilC,KAAKe,SAAS,cAAe,CAChCmB,MAAOnnC,KACPV,KAAMU,KAAKV,KACX1E,UAEFoF,KAAKtG,QAAUsG,KAAKilC,KAAKwM,cAAcwC,kBAAkBj0C,MACzDA,KAAK3B,UAAYC,GAAc,kBAAmB,OAGlD0B,KAAKqqC,cAAgB,KACrBrqC,KAAKosC,cAAgB,EAGrBpsC,KAAKyG,MAAQzG,KAAKtG,QAAQ+M,MAG1BzG,KAAK8G,OAAS9G,KAAKtG,QAAQoN,OAC3B9G,KAAKipC,eAAgB,EACrBjpC,KAAKk0C,OAAS,IAAId,GAAUpzC,MAC5BA,KAAKm0C,oBAAsB,EAC3Bn0C,KAAKo0C,qBAAuB,EAC5Bp0C,KAAKilC,KAAKe,SAAS,YAAa,CAC9BmB,MAAOnnC,MAEV,CAQD,WAAAq0C,CAAYrL,GACNA,IAAahpC,KAAKgpC,SAEpBhpC,KAAKoqC,YACKpB,GAAYhpC,KAAKgpC,UAE3BhpC,KAAKsqC,YAER,CAQD,MAAA3iC,CAAO0iC,GACLrqC,KAAKqqC,cAAgBA,EACrBrqC,KAAK3B,UAAUV,MAAM6oC,gBAAkB,MAElCxmC,KAAKV,OAIVU,KAAKs0C,gBACLt0C,KAAK4nC,OACL5nC,KAAKuoC,oBACLvoC,KAAKu0C,cACLv0C,KAAKqqC,cAAc3iC,YAAY1H,KAAK3B,WACpC2B,KAAKw0C,sBACLx0C,KAAKilC,KAAKe,SAAS,eAAgB,CACjCmB,MAAOnnC,OAETA,KAAKy0C,sBACLz0C,KAAKilC,KAAKe,SAAS,kBAAmB,CACpCmB,MAAOnnC,OAGLA,KAAKgpC,UACPhpC,KAAKoqC,WAER,CAED,IAAAxC,GACE5nC,KAAKtG,QAAQkuC,MAAK,GAClB5nC,KAAKilC,KAAKe,SAAS,YAAa,CAC9BmB,MAAOnnC,MAEV,CASD,WAAAu0C,GACE,MAAMtP,KACJA,GACEjlC,MAIAA,KAAKipC,eAAkBhE,EAAK8O,OAAOC,SAAU/O,EAAKyP,WAAWC,cAAgB30C,KAAKgpC,SAAN,KAI5EhpC,KAAKilC,KAAKe,SAAS,cAAe,CACpCmB,MAAOnnC,OACN6kC,mBAIH7kC,KAAKipC,eAAgB,EACrBjpC,KAAKtG,QAAQiO,SACb3H,KAAKilC,KAAKe,SAAS,qBAAsB,CACvCmB,MAAOnnC,QAEV,CASD,QAAAoqC,GACEpqC,KAAKgpC,UAAW,EAChBhpC,KAAKu0C,cACLv0C,KAAKtG,QAAQ0wC,WACbpqC,KAAKilC,KAAKe,SAAS,gBAAiB,CAClCmB,MAAOnnC,MAEV,CAQD,UAAAsqC,GACEtqC,KAAKgpC,UAAW,EAChBhpC,KAAKtG,QAAQ4wC,aAETtqC,KAAKosC,gBAAkBpsC,KAAK8rC,WAAWV,SAEzCprC,KAAKs0C,gBAIPt0C,KAAK6zC,kBAAoB,EACzB7zC,KAAKw0C,sBACLx0C,KAAKy0C,sBACLz0C,KAAKuoC,oBACLvoC,KAAKilC,KAAKe,SAAS,kBAAmB,CACpCmB,MAAOnnC,MAEV,CAOD,OAAA6mC,GACE7mC,KAAKtG,QAAQ6tC,UAAW,EACxBvnC,KAAKtG,QAAQ4M,SACbtG,KAAK3B,UAAUiI,SACftG,KAAKilC,KAAKe,SAAS,eAAgB,CACjCmB,MAAOnnC,MAEV,CAED,MAAA40C,GACM50C,KAAKosC,gBAAkBpsC,KAAK8rC,WAAWV,SAAYprC,KAAKgpC,UAW1DhpC,KAAKs0C,gBACLt0C,KAAKk0C,OAAO5I,OAAOtrC,KAAKosC,eACxBpsC,KAAK60C,MAAM70C,KAAK8zC,IAAIrqB,EAAGzpB,KAAK8zC,IAAInjB,KAThC3wB,KAAKs0C,gBACLt0C,KAAK6zC,kBAAoB,EACzB7zC,KAAKw0C,sBACLx0C,KAAKy0C,sBACLz0C,KAAKuoC,oBAOR,CASD,iBAAAA,CAAkBuM,GAGhB,MAAMC,EAAkB/0C,KAAK6zC,mBAAqB7zC,KAAK8rC,WAAWV,QAElE,IAAK2J,EACH,OAGF,MAAMtuC,EAAQzK,KAAKC,MAAM+D,KAAKyG,MAAQsuC,IAAoB/0C,KAAKilC,KAAKwF,aAAahhB,EAC3E3iB,EAAS9K,KAAKC,MAAM+D,KAAK8G,OAASiuC,IAAoB/0C,KAAKilC,KAAKwF,aAAa9Z,GAE9E3wB,KAAKg1C,YAAYvuC,EAAOK,IAAYguC,IAIzC90C,KAAKtG,QAAQ6sC,iBAAiB9/B,EAAOK,EACtC,CAOD,WAAAkuC,CAAYvuC,EAAOK,GACjB,OAAIL,IAAUzG,KAAKm0C,oBAAsBrtC,IAAW9G,KAAKo0C,uBACvDp0C,KAAKm0C,mBAAqB1tC,EAC1BzG,KAAKo0C,oBAAsBttC,GACpB,EAIV,CAID,qBAAAmuC,GACE,IAAIC,EAEJ,OAA8D,QAAtDA,EAAwBl1C,KAAKtG,QAAQwtC,mBAAmD,IAA1BgO,OAAmC,EAASA,EAAsB73C,OACzI,CAYD,MAAA83C,CAAOC,EAAeC,EAAaC,EAAoBC,GACrD,MAAMtQ,KACJA,GACEjlC,KAEJ,IAAKA,KAAKspC,cAAgBrE,EAAKyP,WAAWC,YACxC,OAGF1P,EAAKe,SAAS,eAAgB,CAC5BoP,gBACAC,cACAC,uBAGFrQ,EAAKuQ,WAAWC,aAIhB,MAAMC,EAAgB11C,KAAKosC,cAEtBmJ,IACHH,EAAgBnD,GAAMmD,EAAep1C,KAAK8rC,WAAWhf,IAAK9sB,KAAK8rC,WAAWlf,MAM5E5sB,KAAK21C,aAAaP,GAClBp1C,KAAK8zC,IAAIrqB,EAAIzpB,KAAK41C,yBAAyB,IAAKP,EAAaK,GAC7D11C,KAAK8zC,IAAInjB,EAAI3wB,KAAK41C,yBAAyB,IAAKP,EAAaK,GAC7D9D,GAAW5xC,KAAK8zC,KAEhB,MAAM+B,EAAmB,KACvB71C,KAAK81C,eAAeV,GAEpBp1C,KAAKy0C,qBAAqB,EAGvBa,EAGHrQ,EAAKuQ,WAAWO,gBAAgB,CAC9BC,OAAO,EACP31C,KAAM,SACNmC,OAAQxC,KAAK3B,UACbooC,UAAWzmC,KAAKi2C,sBAChBC,WAAYL,EACZxD,SAAUiD,EACVa,OAAQlR,EAAK/X,QAAQipB,SATvBN,GAYH,CAMD,UAAAO,CAAWf,GACTr1C,KAAKm1C,OAAOn1C,KAAKosC,gBAAkBpsC,KAAK8rC,WAAWV,QAAUprC,KAAK8rC,WAAWT,UAAYrrC,KAAK8rC,WAAWV,QAASiK,EAAar1C,KAAKilC,KAAK/X,QAAQmpB,sBAClJ,CASD,YAAAV,CAAavJ,GACXpsC,KAAKosC,cAAgBA,EACrBpsC,KAAKk0C,OAAO5I,OAAOtrC,KAAKosC,cACzB,CAgBD,wBAAAwJ,CAAyBrC,EAAM+C,EAAOZ,GAGpC,GAAyB,IAFA11C,KAAKk0C,OAAOtnB,IAAI2mB,GAAQvzC,KAAKk0C,OAAOpnB,IAAIymB,GAG/D,OAAOvzC,KAAKk0C,OAAOztB,OAAO8sB,GAGvB+C,IACHA,EAAQt2C,KAAKilC,KAAKsR,0BAGfb,IACHA,EAAgB11C,KAAK8rC,WAAWV,SAGlC,MAAMoL,EAAax2C,KAAKosC,cAAgBsJ,EACxC,OAAO11C,KAAKk0C,OAAOT,WAAWF,GAAOvzC,KAAK8zC,IAAIP,GAAQ+C,EAAM/C,IAASiD,EAAaF,EAAM/C,GACzF,CASD,KAAAsB,CAAM4B,EAAMC,GACV12C,KAAK8zC,IAAIrqB,EAAIzpB,KAAKk0C,OAAOT,WAAW,IAAKgD,GACzCz2C,KAAK8zC,IAAInjB,EAAI3wB,KAAKk0C,OAAOT,WAAW,IAAKiD,GACzC12C,KAAKy0C,qBACN,CAOD,UAAAkC,GACE,OAAOxa,QAAQn8B,KAAKyG,QAAUzG,KAAKosC,cAAgBpsC,KAAK8rC,WAAWb,GACpE,CAOD,UAAA3B,GACE,OAAOnN,QAAQn8B,KAAKyG,QAAUzG,KAAKtG,QAAQ4vC,YAC5C,CAOD,mBAAAmL,GACEz0C,KAAK42C,oBAAoB52C,KAAK8zC,IAAIrqB,EAAGzpB,KAAK8zC,IAAInjB,EAAG3wB,KAAKosC,eAElDpsC,OAASA,KAAKilC,KAAK4R,WACrB72C,KAAKilC,KAAKe,SAAS,gBAAiB,CAClCmB,MAAOnnC,MAGZ,CAED,mBAAAw0C,GACEx0C,KAAKosC,cAAgBpsC,KAAK8rC,WAAWV,QAErCprC,KAAKk0C,OAAO5I,OAAOtrC,KAAKosC,eACxBuF,GAAe3xC,KAAK8zC,IAAK9zC,KAAKk0C,OAAOztB,QACrCzmB,KAAKilC,KAAKe,SAAS,iBAAkB,CACnCmB,MAAOnnC,MAEV,CAWD,mBAAA42C,CAAoBntB,EAAGkH,EAAGmmB,GACxBA,GAAQ92C,KAAK6zC,mBAAqB7zC,KAAK8rC,WAAWV,QAClD8G,GAAalyC,KAAK3B,UAAWorB,EAAGkH,EAAGmmB,EACpC,CAED,aAAAxC,GACE,MAAMrP,KACJA,GACEjlC,KACJ2xC,GAAe3xC,KAAK+qC,YAAagC,GAAe9H,EAAK/X,QAAS+X,EAAKwF,aAAczqC,KAAKV,KAAMU,KAAKpF,QACjGoF,KAAK8rC,WAAWR,OAAOtrC,KAAKyG,MAAOzG,KAAK8G,OAAQ9G,KAAK+qC,aACrD9F,EAAKe,SAAS,gBAAiB,CAC7BmB,MAAOnnC,MAEV,CAID,mBAAAi2C,GACE,MAAMvP,EAAQ1mC,KAAKosC,eAAiBpsC,KAAK6zC,mBAAqB7zC,KAAK8rC,WAAWV,SAC9E,OAAOxE,GAAkB5mC,KAAK8zC,IAAIrqB,EAAGzpB,KAAK8zC,IAAInjB,EAAG+V,EAClD,CAkBD,cAAAoP,CAAeiB,GACTA,IAAkB/2C,KAAK6zC,oBAI3B7zC,KAAK6zC,kBAAoBkD,EACzB/2C,KAAKuoC,oBACLvoC,KAAKilC,KAAKe,SAAS,qBACpB,EA6BH,MAAMgR,GAIJ,WAAAl3C,CAAYm3C,GACVj3C,KAAKi3C,SAAWA,EAChBj3C,KAAKilC,KAAOgS,EAAShS,KAGrBjlC,KAAKk3C,SAAW,CACdztB,EAAG,EACHkH,EAAG,EAEN,CAED,KAAAhe,GACM3S,KAAKilC,KAAK4R,WACZlF,GAAe3xC,KAAKk3C,SAAUl3C,KAAKilC,KAAK4R,UAAU/C,KAGpD9zC,KAAKilC,KAAKuQ,WAAW2B,SACtB,CAED,MAAAC,GACE,MAAMx7C,GACJA,EAAEy7C,OACFA,EAAMC,SACNA,GACEt3C,KAAKi3C,UACHJ,UACJA,GACE72C,KAAKilC,KAET,GAAiB,MAAbqS,GAAoBt3C,KAAKilC,KAAK/X,QAAQqqB,qBAAuBV,GAAaA,EAAUzK,eAAiByK,EAAU/K,WAAWb,MAAQjrC,KAAKi3C,SAASO,aAAc,CAEhK,MAAMd,EAAOG,EAAU/C,IAAInjB,GAAK/0B,EAAG+0B,EAAI0mB,EAAO1mB,GAE9C,IAAK3wB,KAAKilC,KAAKe,SAAS,eAAgB,CACtC0Q,SACC7R,iBAAkB,CACnB7kC,KAAKy3C,oBAAoB,IAAKf,EA5DP,IA8DvB,MAAMgB,EAAY,EAAI17C,KAAK81C,IAAI9xC,KAAK23C,sBAAsBd,EAAU/C,IAAInjB,IACxE3wB,KAAKilC,KAAK2S,eAAeF,GACzBb,EAAUpC,qBACX,CACP,KAAW,CACqBz0C,KAAK63C,qBAAqB,OAGlD73C,KAAK63C,qBAAqB,KAEtBhB,IACFjF,GAAWiF,EAAU/C,KACrB+C,EAAUpC,uBAGf,CACF,CAED,GAAAqD,GACE,MAAMC,SACJA,GACE/3C,KAAKi3C,UACHvC,WACJA,EAAUmC,UACVA,GACE72C,KAAKilC,KACT,IAAI+S,EAAY,EAGhB,GAFAh4C,KAAKilC,KAAKuQ,WAAW2B,UAEjBzC,EAAWC,YAAa,CAE1B,MAKMsD,GALsBvD,EAAWjrB,EAAIirB,EAAWwD,iBAKIl4C,KAAKilC,KAAKwF,aAAahhB,EAS7EsuB,EAAStuB,GAtGU,IAsGmBwuB,EAA8B,GAAKF,EAAStuB,EAAI,IAAOwuB,GAA+B,IAE9HD,EAAY,EACZD,EAAStuB,EAAIztB,KAAK8wB,IAAIirB,EAAStuB,EAAG,KACzBsuB,EAAStuB,EA1GG,IA0GyBwuB,EAA8B,GAAKF,EAAStuB,GAAK,IAAOwuB,EAA8B,MAEpID,GAAa,EACbD,EAAStuB,EAAIztB,KAAK4wB,IAAImrB,EAAStuB,EAAG,IAGpCirB,EAAWyD,YAAYH,GAAW,EAAMD,EAAStuB,EAClD,CAGGotB,GAAaA,EAAUzK,cAAgByK,EAAU/K,WAAWlf,KAAO5sB,KAAKi3C,SAASO,aACnFx3C,KAAKi3C,SAASnL,WAAWsM,gBAAe,IAMxCp4C,KAAKq4C,yBAAyB,KAE9Br4C,KAAKq4C,yBAAyB,KAEjC,CAOD,wBAAAA,CAAyB9E,GACvB,MAAMwE,SACJA,GACE/3C,KAAKi3C,UACHJ,UACJA,GACE72C,KAAKilC,KAET,IAAK4R,EACH,OAGF,MAAM/C,IACJA,EAAGI,OACHA,GACE2C,EACEyB,EAASxE,EAAIP,GACbgF,EAAmBv4C,KAAKilC,KAAKyS,UAAY,GAAc,MAATnE,EAM9CiF,EAAoBF,EAtJ9B,SAAiBG,EAAiBC,GAChC,OAAOD,EAAkBC,GAAoB,EAAIA,EACnD,CAoJuCC,CAAQZ,EAASxE,GAH3B,MAKzB,GAAIgF,EAAkB,CACpB,MAAMK,EAAa54C,KAAK23C,sBAAsBW,GAExCO,EAAsB74C,KAAK23C,sBAAsBa,GAIvD,GAAII,EAAa,GAAKC,GAzKD,IAyK8CD,EAAa,GAAKC,EAzKhE,GA2KnB,YADA74C,KAAKilC,KAAKlE,OAGb,CAGD,MAAM+X,EAAuB5E,EAAOT,WAAWF,EAAMiF,GAGrD,GAAIF,IAAWQ,EACb,OAIF,MAAMC,EAAeD,IAAyBN,EAAoB,EAAI,IAChEQ,EAAmBh5C,KAAKilC,KAAKyS,UAC7BuB,EAAeH,EAAuBR,EAC5Ct4C,KAAKilC,KAAKuQ,WAAW0D,YAAY,CAC/B74C,KAAM,aAAekzC,EACrByC,OAAO,EACPrjC,MAAO2lC,EACPR,IAAKgB,EACLf,SAAUA,EAASxE,GACnBwF,eACAI,SAAUC,IAER,GAAIb,GAAoBv4C,KAAKilC,KAAKyS,UAAY,EAAG,CAE/C,MAAM2B,EAAyB,GAAKP,EAAuBM,GAAOH,EAIlEj5C,KAAKilC,KAAK2S,eAAe3F,GAAM+G,GAAoB,EAAIA,GAAoBK,EAAwB,EAAG,GACvG,CAEDvF,EAAIP,GAAQv3C,KAAKs9C,MAAMF,GACvBvC,EAAUpC,qBAAqB,GAGpC,CAaD,oBAAAoD,CAAqBtE,GACnB,MAAM33C,GACJA,EAAE07C,SACFA,EAAQD,OACRA,EAAMG,aACNA,GACEx3C,KAAKi3C,UACHJ,UACJA,EAASnC,WACTA,GACE10C,KAAKilC,KACHsU,EAAQ39C,EAAG23C,GAAQ8D,EAAO9D,GAC1BiG,EAAiB9E,EAAWjrB,EAAI8vB,EAEtC,IAAKA,IAAU1C,EACb,OAAO,EAIT,GAAa,MAATtD,IAAiBsD,EAAUF,eAAiBa,EAE9C,OADA9C,EAAW+E,OAAOD,GAAgB,IAC3B,EAGT,MAAMtF,OACJA,GACE2C,EACE6C,EAAS7C,EAAU/C,IAAIP,GAAQgG,EAErC,GAAIv5C,KAAKilC,KAAK/X,QAAQysB,gBAA+B,MAAbrC,GAA6B,MAAT/D,IAAiBiE,EAAc,CACzF,MAAMoC,EAAuBlF,EAAWwD,gBAElC2B,EAAsBnF,EAAWjrB,EAAImwB,EACrCE,EAAgBP,EAAQ,EACxBQ,GAAiBD,EAEvB,GAAIJ,EAASxF,EAAOpnB,IAAIymB,IAASuG,EAAe,CAO9C,GAF4B5F,EAAOpnB,IAAIymB,IAASvzC,KAAKk3C,SAAS3D,GAI5D,OADAmB,EAAW+E,OAAOD,GAAgB,IAC3B,EAEPx5C,KAAKy3C,oBAAoBlE,EAAMmG,EAGzC,MAAa,GAAIA,EAASxF,EAAOtnB,IAAI2mB,IAASwG,EAAe,CAKrD,GAF4B/5C,KAAKk3C,SAAS3D,IAASW,EAAOtnB,IAAI2mB,GAI5D,OADAmB,EAAW+E,OAAOD,GAAgB,IAC3B,EAEPx5C,KAAKy3C,oBAAoBlE,EAAMmG,EAGzC,MAEQ,GAA4B,IAAxBG,EAA2B,CAE7B,GAAIA,EAAsB,EAIxB,OADAnF,EAAW+E,OAAOz9C,KAAK4wB,IAAI4sB,EAAgBI,IAAuB,IAC3D,EACF,GAAIC,EAAsB,EAK/B,OADAnF,EAAW+E,OAAOz9C,KAAK8wB,IAAI0sB,EAAgBI,IAAuB,IAC3D,CAEnB,MAEU55C,KAAKy3C,oBAAoBlE,EAAMmG,EAGzC,KACmB,MAATnG,IAEGmB,EAAWC,aAAeT,EAAOpnB,IAAI6D,IAAMujB,EAAOtnB,IAAI+D,IAI3D3wB,KAAKy3C,oBAAoBlE,EAAMmG,GAInC,OAAO,CACR,CAgBD,qBAAA/B,CAAsBjB,GACpB,IAAIsD,EAAuBC,EAE3B,OAAQvD,GAA+K,QAAtKsD,EAAyE,QAAhDC,EAAuBj6C,KAAKilC,KAAK4R,iBAAgD,IAAzBoD,OAAkC,EAASA,EAAqB/F,OAAOztB,OAAOkK,SAAyC,IAA1BqpB,EAAmCA,EAAwB,KAAOh6C,KAAKilC,KAAKwF,aAAa9Z,EAAI,EAC7R,CAaD,mBAAA8mB,CAAoBlE,EAAM2G,EAAcC,GACtC,MAAMtD,UACJA,GACE72C,KAAKilC,KAET,IAAK4R,EACH,OAGF,MAAM/C,IACJA,EAAGI,OACHA,GACE2C,EAGJ,GAFqB3C,EAAOT,WAAWF,EAAM2G,KAExBA,GAAgBC,EAAgB,CACnD,MAAMZ,EAAQv9C,KAAKC,MAAMi+C,EAAepG,EAAIP,IAC5CO,EAAIP,IAASgG,GAASY,GAlXH,IAmXzB,MACMrG,EAAIP,GAAQ2G,CAEf,EAmBH,SAASE,GAAoBp5B,EAAGplB,EAAIC,GAGlC,OAFAmlB,EAAEyI,GAAK7tB,EAAG6tB,EAAI5tB,EAAG4tB,GAAK,EACtBzI,EAAE2P,GAAK/0B,EAAG+0B,EAAI90B,EAAG80B,GAAK,EACf3P,CACT,CAEA,MAAMq5B,GAIJ,WAAAv6C,CAAYm3C,GACVj3C,KAAKi3C,SAAWA,EAMhBj3C,KAAKs6C,UAAY,CACf7wB,EAAG,EACHkH,EAAG,GAOL3wB,KAAKu6C,gBAAkB,CACrB9wB,EAAG,EACHkH,EAAG,GAOL3wB,KAAKw6C,WAAa,CAChB/wB,EAAG,EACHkH,EAAG,GAIL3wB,KAAKy6C,sBAAuB,EAG5Bz6C,KAAK06C,gBAAkB,CACxB,CAED,KAAA/nC,GACE,MAAMkkC,UACJA,GACE72C,KAAKi3C,SAAShS,KAEd4R,IACF72C,KAAK06C,gBAAkB7D,EAAUzK,cACjCuF,GAAe3xC,KAAKs6C,UAAWzD,EAAU/C,MAG3C9zC,KAAKi3C,SAAShS,KAAKuQ,WAAWC,aAC9Bz1C,KAAKy6C,sBAAuB,CAC7B,CAED,MAAArD,GACE,MAAMx7C,GACJA,EAAE++C,QACFA,EAAO9+C,GACPA,EAAE++C,QACFA,EAAO3V,KACPA,GACEjlC,KAAKi3C,UACHJ,UACJA,GACE5R,EAEJ,IAAK4R,EACH,OAGF,MAAMgE,EAAehE,EAAU/K,WAAWhf,IACpCguB,EAAejE,EAAU/K,WAAWlf,IAE1C,IAAKiqB,EAAUvN,cAAgBrE,EAAKyP,WAAWC,YAC7C,OAGFyF,GAAoBp6C,KAAKu6C,gBAAiBI,EAASC,GACnDR,GAAoBp6C,KAAKw6C,WAAY5+C,EAAIC,GAEzC,IAAIuwC,EAAgB,EAAIyF,GAAmB8I,EAASC,GAAW/I,GAAmBj2C,EAAIC,GAAMmE,KAAK06C,gBAOjG,GAJItO,EAAgByK,EAAU/K,WAAWV,QAAUyL,EAAU/K,WAAWV,QAAU,KAChFprC,KAAKy6C,sBAAuB,GAG1BrO,EAAgByO,EAClB,GAAI5V,EAAK/X,QAAQ6tB,eAAiB/6C,KAAKy6C,sBAAwBz6C,KAAK06C,iBAAmB7D,EAAU/K,WAAWV,QAAS,CAEnH,MAAMsM,EAAY,GAAKmD,EAAezO,IAAkByO,EAAe,KAElE5V,EAAKe,SAAS,aAAc,CAC/B0R,cACC7S,kBACDI,EAAK2S,eAAeF,EAE9B,MAEQtL,EAAgByO,EApHI,KAoHYA,EAAezO,QAExCA,EAAgB0O,IAEzB1O,EAAgB0O,EAzHM,KAyHU1O,EAAgB0O,IAGlDjE,EAAU/C,IAAIrqB,EAAIzpB,KAAKg7C,0BAA0B,IAAK5O,GACtDyK,EAAU/C,IAAInjB,EAAI3wB,KAAKg7C,0BAA0B,IAAK5O,GACtDyK,EAAUlB,aAAavJ,GACvByK,EAAUpC,qBACX,CAED,GAAAqD,GACE,MAAM7S,KACJA,GACEjlC,KAAKi3C,UACHJ,UACJA,GACE5R,IAEE4R,GAAaA,EAAUzK,cAAgByK,EAAU/K,WAAWV,WAAaprC,KAAKy6C,sBAAwBxV,EAAK/X,QAAQ6tB,aACvH9V,EAAKlE,QAEL/gC,KAAKo4C,gBAER,CASD,yBAAA4C,CAA0BzH,EAAMnH,GAC9B,MAAMoK,EAAapK,EAAgBpsC,KAAK06C,gBACxC,OAAO16C,KAAKw6C,WAAWjH,IAASvzC,KAAKu6C,gBAAgBhH,GAAQvzC,KAAKs6C,UAAU/G,IAASiD,CACtF,CAWD,cAAA4B,CAAe6C,GACb,MAAMhW,KACJA,GACEjlC,KAAKi3C,UACHJ,UACJA,GACE5R,EAEJ,GAAM4R,UAA8CA,EAAUvN,aAC5D,OAGwB,IAAtBtpC,KAAKw6C,WAAW/wB,IAClBwxB,GAAgB,GAGlB,MAAMvF,EAAgBmB,EAAUzK,cAGhC,IAAI8O,EACAC,GAA2B,EAE3BzF,EAAgBmB,EAAU/K,WAAWV,QACvC8P,EAAuBrE,EAAU/K,WAAWV,QACnCsK,EAAgBmB,EAAU/K,WAAWlf,IAC9CsuB,EAAuBrE,EAAU/K,WAAWlf,KAE5CuuB,GAA2B,EAC3BD,EAAuBxF,GAGzB,MAAMsD,EAAmB/T,EAAKyS,UACxBa,EAAmBtT,EAAKyS,UAAY,EACpC0D,EAAazJ,GAAe,CAChCloB,EAAG,EACHkH,EAAG,GACFkmB,EAAU/C,KACb,IAAIuH,EAAiB1J,GAAe,CAClCloB,EAAG,EACHkH,EAAG,GACFyqB,GAECH,IACFj7C,KAAKw6C,WAAW/wB,EAAI,EACpBzpB,KAAKw6C,WAAW7pB,EAAI,EACpB3wB,KAAKu6C,gBAAgB9wB,EAAI,EACzBzpB,KAAKu6C,gBAAgB5pB,EAAI,EACzB3wB,KAAK06C,gBAAkBhF,EACvB/D,GAAe3xC,KAAKs6C,UAAWc,IAG7BD,IACFE,EAAiB,CACf5xB,EAAGzpB,KAAKg7C,0BAA0B,IAAKE,GACvCvqB,EAAG3wB,KAAKg7C,0BAA0B,IAAKE,KAK3CrE,EAAUlB,aAAauF,GACvBG,EAAiB,CACf5xB,EAAGotB,EAAU3C,OAAOT,WAAW,IAAK4H,EAAe5xB,GACnDkH,EAAGkmB,EAAU3C,OAAOT,WAAW,IAAK4H,EAAe1qB,IAGrDkmB,EAAUlB,aAAaD,GACvB,MAAM4F,GAAkBtJ,GAAYqJ,EAAgBD,GAEpD,IAAKE,IAAmBH,IAA6B5C,EAMnD,OAJA1B,EAAUf,eAAeoF,QAEzBrE,EAAUpC,sBAKZxP,EAAKuQ,WAAWC,aAChBxQ,EAAKuQ,WAAW0D,YAAY,CAC1BlD,OAAO,EACPrjC,MAAO,EACPmlC,IAAK,IACLC,SAAU,EACVgB,aAAc,EACdwC,iBAAkB,GAClBpC,SAAUzuB,IAGR,GAFAA,GAAO,IAEH4wB,GAAkBH,EAA0B,CAM9C,GALIG,IACFzE,EAAU/C,IAAIrqB,EAAI2xB,EAAW3xB,GAAK4xB,EAAe5xB,EAAI2xB,EAAW3xB,GAAKiB,EACrEmsB,EAAU/C,IAAInjB,EAAIyqB,EAAWzqB,GAAK0qB,EAAe1qB,EAAIyqB,EAAWzqB,GAAKjG,GAGnEywB,EAA0B,CAC5B,MAAMK,EAAe9F,GAAiBwF,EAAuBxF,GAAiBhrB,EAC9EmsB,EAAUlB,aAAa6F,EACxB,CAED3E,EAAUpC,qBACX,CAGG8D,GAAoBtT,EAAKyS,UAAY,GAIvCzS,EAAK2S,eAAe3F,GAAM+G,GAAoB,EAAIA,GAAoBtuB,EAAK,EAAG,GAC/E,EAEHwrB,WAAY,KAEVW,EAAUf,eAAeoF,GAEzBrE,EAAUpC,qBAAqB,GAGpC,EAuBH,SAASgH,GAAoBv2C,GAC3B,QAEAA,EAAM1C,OAAOb,QAAQ,mBACvB,CAMA,MAAM+5C,GAIJ,WAAA57C,CAAYm3C,GACVj3C,KAAKi3C,SAAWA,CACjB,CAOD,KAAA0E,CAAMrF,EAAOsF,GACX,MAAMC,EAEND,EAAcp5C,OAAO2D,UACf21C,EAAeD,EAAgBrL,SAAS,aACxCuL,EAAoBF,EAAgBrL,SAAS,eAAiBqL,EAAgBrL,SAAS,mBAEzFsL,EACF97C,KAAKg8C,oBAAoB,aAAc1F,EAAOsF,GACrCG,GACT/7C,KAAKg8C,oBAAoB,UAAW1F,EAAOsF,EAE9C,CAOD,GAAAK,CAAI3F,EAAOsF,GACLH,GAAoBG,IACtB57C,KAAKg8C,oBAAoB,MAAO1F,EAAOsF,EAE1C,CAOD,SAAAM,CAAU5F,EAAOsF,GACXH,GAAoBG,IACtB57C,KAAKg8C,oBAAoB,YAAa1F,EAAOsF,EAEhD,CASD,mBAAAI,CAAoBG,EAAY7F,EAAOsF,GACrC,IAAIQ,EAEJ,MAAMnX,KACJA,GACEjlC,KAAKi3C,UACHJ,UACJA,GACE5R,EACEoX,EAENF,EAAa,SACPhQ,EAAclH,EAAK/X,QAAQmvB,GAEjC,IAAIpX,EAAKe,SAASqW,EAAgB,CAChC/F,QACAsF,kBACC/W,iBAIH,GAA2B,mBAAhBsH,EAKX,OAAQA,GACN,IAAK,QACL,IAAK,OACHlH,EAAKkH,KACL,MAEF,IAAK,OACH0K,SAA8CA,EAAUT,WAAWE,GACnE,MAEF,IAAK,gBAGCO,SAA8CA,EAAUvN,cAAgBuN,EAAU/K,WAAWT,YAAcwL,EAAU/K,WAAWV,QAClIyL,EAAUT,WAAWE,GACZrR,EAAK/X,QAAQovB,yBACtBrX,EAAKlE,QAGP,MAEF,IAAK,kBACsD,QAAxDqb,EAAwBp8C,KAAKi3C,SAAShS,KAAK5nC,eAA+C,IAA1B++C,GAAoCA,EAAsBj2C,UAAUo2C,OAAO,yBA1B9IpQ,EAAYrzB,KAAKmsB,EAAMqR,EAAOsF,EAkCjC,EAwBH,MAAMY,GAIJ,WAAA18C,CAAYmlC,GACVjlC,KAAKilC,KAAOA,EAGZjlC,KAAKs3C,SAAW,KAKhBt3C,KAAKpE,GAAK,CACR6tB,EAAG,EACHkH,EAAG,GAKL3wB,KAAKnE,GAAK,CACR4tB,EAAG,EACHkH,EAAG,GAKL3wB,KAAKq3C,OAAS,CACZ5tB,EAAG,EACHkH,EAAG,GAIL3wB,KAAKy8C,OAAS,CACZhzB,EAAG,EACHkH,EAAG,GAIL3wB,KAAK26C,QAAU,CACblxB,EAAG,EACHkH,EAAG,GAIL3wB,KAAK46C,QAAU,CACbnxB,EAAG,EACHkH,EAAG,GAIL3wB,KAAK+3C,SAAW,CACdtuB,EAAG,EACHkH,EAAG,GAML3wB,KAAK08C,aAAe,CAClBjzB,EAAG,EACHkH,EAAG,GAML3wB,KAAK28C,YAAc,CACjBlzB,EAAG,EACHkH,EAAG,GAIL3wB,KAAK48C,iBAAmB,EAKxB58C,KAAK68C,iBAAmB,GAGxB78C,KAAK88C,mBAAqB,iBAAkBr/C,OAG5CuC,KAAK+8C,uBAAyBt/C,OAAOu/C,aACrCh9C,KAAKi9C,cAAgBj9C,KAAK88C,oBAAsB98C,KAAK+8C,sBAAwB9/C,UAAUigD,eAAiB,EAGxGl9C,KAAK48C,iBAAmB,EAGxB58C,KAAKm9C,cAAgB,EAGrBn9C,KAAKo9C,qBAAsB,EAC3Bp9C,KAAKw3C,cAAe,EACpBx3C,KAAKq9C,YAAa,EAClBr9C,KAAKs9C,WAAY,EAGjBt9C,KAAKu9C,IAAM,KAKXv9C,KAAKw9C,UAAY,KAEZx9C,KAAKi9C,gBAERhY,EAAK/X,QAAQysB,gBAAiB,GAGhC35C,KAAKy9C,KAAO,IAAIzG,GAAYh3C,MAC5BA,KAAK8rC,WAAa,IAAIuO,GAAYr6C,MAClCA,KAAK09C,WAAa,IAAIhC,GAAW17C,MACjCilC,EAAK1gC,GAAG,cAAc,KACpB0gC,EAAKxnB,OAAOrX,IAAI6+B,EAAK0Y,WAAY,QAEjC39C,KAAK49C,SAAStkC,KAAKtZ,OAEfA,KAAK+8C,qBACP/8C,KAAK69C,YAAY,UAAW,OAAQ,KAAM,UACjC79C,KAAK88C,oBACd98C,KAAK69C,YAAY,QAAS,QAAS,MAAO,UAStC5Y,EAAK0Y,aACP1Y,EAAK0Y,WAAWG,YAAc,OAE9B7Y,EAAK0Y,WAAWI,WAAa,SAG/B/9C,KAAK69C,YAAY,QAAS,OAAQ,KACnC,GAEJ,CAUD,WAAAA,CAAYG,EAAMC,EAAMC,EAAIxvB,GAC1B,MAAMuW,KACJA,GACEjlC,MACEyd,OACJA,GACEwnB,EACEkZ,EAAczvB,EAASsvB,EAAOtvB,EAAS,GAC7CjR,EAAOrX,IAAI6+B,EAAK0Y,WAAYK,EAAOC,EAEnCj+C,KAAKo+C,cAAc9kC,KAAKtZ,OACxByd,EAAOrX,IAAI3I,OAAQugD,EAAO,OAE1Bh+C,KAAKq+C,cAAc/kC,KAAKtZ,OACxByd,EAAOrX,IAAI3I,OAAQugD,EAAOE,EAE1Bl+C,KAAKs+C,YAAYhlC,KAAKtZ,OAElBm+C,GACF1gC,EAAOrX,IAAI6+B,EAAK0Y,WAAYQ,EAE5Bn+C,KAAKs+C,YAAYhlC,KAAKtZ,MAEzB,CAMD,aAAAo+C,CAAcnoC,GAOZ,MAAMsoC,EAA4B,cAAXtoC,EAAEzR,MAA0C,UAAlByR,EAAEuoC,YAInD,GAAID,GAAkBtoC,EAAEs5B,OAAS,EAC/B,OAGF,MAAMtK,KACJA,GACEjlC,KAECilC,EAAK8O,OAAOC,OAKb/O,EAAKe,SAAS,cAAe,CAC/B4V,cAAe3lC,IACd4uB,mBAIC0Z,IACFtZ,EAAKwZ,gBAGLz+C,KAAK0+C,8BAA8BzoC,EAAG,SAGxCgvB,EAAKuQ,WAAW2B,UAEhBn3C,KAAK2+C,cAAc1oC,EAAG,QAEQ,IAA1BjW,KAAK48C,mBACP58C,KAAKs3C,SAAW,KAGhB3F,GAAe3xC,KAAK26C,QAAS36C,KAAKpE,KAGhCoE,KAAK48C,iBAAmB,GAE1B58C,KAAK4+C,iBAEL5+C,KAAKw3C,cAAe,GAEpBx3C,KAAKw3C,cAAe,GAlCpBvhC,EAAE+R,gBAoCL,CAMD,aAAAq2B,CAAcpoC,GACZjW,KAAK0+C,8BAA8BzoC,EAAG,QAEjCjW,KAAK48C,mBAIV58C,KAAK2+C,cAAc1oC,EAAG,QAElBjW,KAAKilC,KAAKe,SAAS,cAAe,CACpC4V,cAAe3lC,IACd4uB,mBAI2B,IAA1B7kC,KAAK48C,kBAA2B58C,KAAKq9C,WAgC9Br9C,KAAK48C,iBAAmB,IAAM58C,KAAKs9C,YAC5Ct9C,KAAK6+C,cAEL7+C,KAAKs9C,WAAY,EAEjBt9C,KAAK8+C,qBAEL9+C,KAAK8rC,WAAWn5B,QAEhB3S,KAAK++C,eAEL/+C,KAAKg/C,mBA1CAh/C,KAAKs3C,UACRt3C,KAAKi/C,0BAIHj/C,KAAKs3C,WAAat3C,KAAKq9C,aACrBr9C,KAAKs9C,YACPt9C,KAAKs9C,WAAY,EACjBt9C,KAAK8rC,WAAWgM,OAGlB93C,KAAKq9C,YAAa,EAElBr9C,KAAK4+C,iBAIL5+C,KAAK8+C,qBAEL9+C,KAAKm9C,cAAgB1yB,KAAKC,MAE1B1qB,KAAKo9C,qBAAsB,EAC3BzL,GAAe3xC,KAAK28C,YAAa38C,KAAKpE,IACtCoE,KAAK+3C,SAAStuB,EAAI,EAClBzpB,KAAK+3C,SAASpnB,EAAI,EAClB3wB,KAAKy9C,KAAK9qC,QAEV3S,KAAK++C,eAEL/+C,KAAKg/C,oBAeV,CAMD,WAAAH,GACM7+C,KAAKq9C,aACPr9C,KAAKq9C,YAAa,EAGbr9C,KAAKo9C,qBACRp9C,KAAKk/C,iBAAgB,GAGvBl/C,KAAKy9C,KAAK3F,MACV93C,KAAKs3C,SAAW,KAEnB,CAMD,WAAAgH,CAAYroC,GACLjW,KAAK48C,mBAIV58C,KAAK2+C,cAAc1oC,EAAG,MAElBjW,KAAKilC,KAAKe,SAAS,YAAa,CAClC4V,cAAe3lC,IACd4uB,mBAI2B,IAA1B7kC,KAAK48C,mBACP58C,KAAK++C,eAED/+C,KAAKq9C,WACPr9C,KAAK6+C,cACK7+C,KAAKs9C,WAAct9C,KAAKw3C,cAElCx3C,KAAKm/C,WAAWlpC,IAIhBjW,KAAK48C,iBAAmB,GAAK58C,KAAKs9C,YACpCt9C,KAAKs9C,WAAY,EACjBt9C,KAAK8rC,WAAWgM,MAEc,IAA1B93C,KAAK48C,mBAEP58C,KAAKs3C,SAAW,KAEhBt3C,KAAK8+C,wBAGV,CAMD,cAAAE,IACMh/C,KAAKq9C,YAAcr9C,KAAKs9C,aAC1Bt9C,KAAKk/C,kBAEDl/C,KAAKq9C,WAEFrL,GAAYhyC,KAAKpE,GAAIoE,KAAKq3C,SAC7Br3C,KAAKy9C,KAAKrG,SAKLpF,GAAYhyC,KAAKpE,GAAIoE,KAAKq3C,SAAYrF,GAAYhyC,KAAKnE,GAAImE,KAAKy8C,SACnEz8C,KAAK8rC,WAAWsL,SAItBp3C,KAAKo/C,oBAELp/C,KAAKu9C,IAAM8B,sBAAsBr/C,KAAKg/C,eAAe1lC,KAAKtZ,OAE7D,CASD,eAAAk/C,CAAgBpK,GACd,MAAMjnB,EAAOpD,KAAKC,MACZ2nB,EAAWxkB,EAAO7tB,KAAKm9C,cAEzB9K,EAAW,KAAOyC,IAItB90C,KAAK+3C,SAAStuB,EAAIzpB,KAAKs/C,aAAa,IAAKjN,GACzCryC,KAAK+3C,SAASpnB,EAAI3wB,KAAKs/C,aAAa,IAAKjN,GACzCryC,KAAKm9C,cAAgBtvB,EACrB8jB,GAAe3xC,KAAK28C,YAAa38C,KAAKpE,IACtCoE,KAAKo9C,qBAAsB,EAC5B,CAOD,UAAA+B,CAAWlpC,GACT,MAAMy+B,WACJA,GACE10C,KAAKilC,KAET,GAAIyP,EAAWC,YAIb,YADAD,EAAWyD,YAAY,GAAG,GAK5B,GAAIliC,EAAEzR,KAAKpJ,QAAQ,UAAY,EAC7B,OAIF,GAAe,YAAX6a,EAAEzR,MAAwC,UAAlByR,EAAEuoC,YAE5B,YADAx+C,KAAK09C,WAAW/B,MAAM37C,KAAK26C,QAAS1kC,GAKtC,MAAMspC,EAAWv/C,KAAKilC,KAAK/X,QAAQsyB,gBArcd,IAqcmD,EAIpEx/C,KAAKw9C,WACPx9C,KAAK4+C,iBAGD/M,GAAmB7xC,KAAK08C,aAAc18C,KAAK26C,SA3c5B,IA4cjB36C,KAAK09C,WAAWxB,UAAUl8C,KAAK26C,QAAS1kC,KAG1C07B,GAAe3xC,KAAK08C,aAAc18C,KAAK26C,SACvC36C,KAAKw9C,UAAYrvB,YAAW,KAC1BnuB,KAAK09C,WAAWzB,IAAIj8C,KAAK26C,QAAS1kC,GAElCjW,KAAK4+C,gBAAgB,GACpBW,GAEN,CAMD,cAAAX,GACM5+C,KAAKw9C,YACP/uB,aAAazuB,KAAKw9C,WAClBx9C,KAAKw9C,UAAY,KAEpB,CAWD,YAAA8B,CAAa/L,EAAMlB,GAEjB,MAAMoN,EAAez/C,KAAKpE,GAAG23C,GAAQvzC,KAAK28C,YAAYpJ,GAEtD,OAAIv3C,KAAK81C,IAAI2N,GAAgB,GAAKpN,EAAW,EACpCoN,EAAepN,EAGjB,CACR,CAMD,YAAA0M,GACM/+C,KAAKu9C,MACPmC,qBAAqB1/C,KAAKu9C,KAC1Bv9C,KAAKu9C,IAAM,KAEd,CAQD,6BAAAmB,CAA8BzoC,EAAGuoC,GACHx+C,KAAKilC,KAAKU,aAAa,uBAAuB,EAAM1vB,EAAGuoC,IAGjFvoC,EAAE+R,gBAEL,CAWD,aAAA22B,CAAc1oC,EAAGuoC,GACf,GAAIx+C,KAAK+8C,qBAAsB,CAC7B,MAAM4C,EAEN1pC,EAEM2pC,EAAe5/C,KAAK68C,iBAAiBtM,WAAUsP,GAC5CA,EAAez/C,KAAOu/C,EAAaG,YAGxB,OAAhBtB,GAAwBoB,GAAgB,EAE1C5/C,KAAK68C,iBAAiB/nB,OAAO8qB,EAAc,GAClB,SAAhBpB,IAA4C,IAAlBoB,EAEnC5/C,KAAK68C,iBAAiB7+C,KAAKgC,KAAK+/C,wBAAwBJ,EAAc,CACpEl2B,EAAG,EACHkH,EAAG,KAEIivB,GAAgB,GAEzB5/C,KAAK+/C,wBAAwBJ,EAAc3/C,KAAK68C,iBAAiB+C,IAGnE5/C,KAAK48C,iBAAmB58C,KAAK68C,iBAAiBjjD,OAG1CoG,KAAK48C,iBAAmB,GAC1BjL,GAAe3xC,KAAKpE,GAAIoE,KAAK68C,iBAAiB,IAG5C78C,KAAK48C,iBAAmB,GAC1BjL,GAAe3xC,KAAKnE,GAAImE,KAAK68C,iBAAiB,GAEtD,KAAW,CACL,MAAMmD,EAEN/pC,EACAjW,KAAK48C,iBAAmB,EAEpBoD,EAAWx7C,KAAKpJ,QAAQ,UAAY,EAGlC4kD,EAAWC,SAAWD,EAAWC,QAAQrmD,OAAS,IACpDoG,KAAK+/C,wBAAwBC,EAAWC,QAAQ,GAAIjgD,KAAKpE,IAEzDoE,KAAK48C,mBAEDoD,EAAWC,QAAQrmD,OAAS,IAC9BoG,KAAK+/C,wBAAwBC,EAAWC,QAAQ,GAAIjgD,KAAKnE,IAEzDmE,KAAK48C,sBAKT58C,KAAK+/C,wBAEL9pC,EAAGjW,KAAKpE,IAEY,OAAhB4iD,EAEFx+C,KAAK48C,iBAAmB,EAExB58C,KAAK48C,mBAGV,CACF,CAMD,iBAAAwC,GACEzN,GAAe3xC,KAAKq3C,OAAQr3C,KAAKpE,IACjC+1C,GAAe3xC,KAAKy8C,OAAQz8C,KAAKnE,GAClC,CAMD,kBAAAijD,GACEnN,GAAe3xC,KAAK26C,QAAS36C,KAAKpE,IAClC+1C,GAAe3xC,KAAK46C,QAAS56C,KAAKnE,IAElCmE,KAAKo/C,mBACN,CAID,uBAAAH,GACE,GAAIj/C,KAAKilC,KAAKyP,WAAWC,YAEvB30C,KAAKs3C,SAAW,QACX,CAEL,MAAM4I,EAAOlkD,KAAK81C,IAAI9xC,KAAKpE,GAAG6tB,EAAIzpB,KAAK26C,QAAQlxB,GAAKztB,KAAK81C,IAAI9xC,KAAKpE,GAAG+0B,EAAI3wB,KAAK26C,QAAQhqB,GAEtF,GAAa,IAATuvB,EAAY,CAEd,MAAMC,EAAcD,EAAO,EAAI,IAAM,IAEjClkD,KAAK81C,IAAI9xC,KAAKpE,GAAGukD,GAAengD,KAAK26C,QAAQwF,KAroB3B,KAsoBpBngD,KAAKs3C,SAAW6I,EAEnB,CACF,CACF,CAYD,uBAAAJ,CAAwB9pC,EAAG+K,GAUzB,OATAA,EAAEyI,EAAIxT,EAAEmqC,MAAQpgD,KAAKilC,KAAK78B,OAAOqhB,EACjCzI,EAAE2P,EAAI1a,EAAEoqC,MAAQrgD,KAAKilC,KAAK78B,OAAOuoB,EAE7B,cAAe1a,EACjB+K,EAAE5gB,GAAK6V,EAAE6pC,eACiB3kD,IAAjB8a,EAAEqqC,aACXt/B,EAAE5gB,GAAK6V,EAAEqqC,YAGJt/B,CACR,CAOD,QAAA48B,CAAS3nC,GAEHjW,KAAKilC,KAAKyP,WAAWC,cACvB1+B,EAAE+R,iBACF/R,EAAEsqC,kBAEL,EAqBH,MAAMC,GAIJ,WAAA1gD,CAAYmlC,GACVjlC,KAAKilC,KAAOA,EACZjlC,KAAKypB,EAAI,EACTzpB,KAAKygD,WAAa,EAGlBzgD,KAAK0gD,mBAAqB,EAG1B1gD,KAAK2gD,mBAAqB,EAG1B3gD,KAAK4gD,sBAAwB,EAG7B5gD,KAAK6gD,YAAc,EACpB,CASD,MAAAjM,CAAOkM,GACL,MAAM7b,KACJA,GACEjlC,KACE+gD,EAAgB/kD,KAAKC,MAAMgpC,EAAKwF,aAAahhB,EAAIwb,EAAKwF,aAAahhB,EAAIwb,EAAK/X,QAAQ8zB,SAIpFC,EAAoBF,IAAkB/gD,KAAKygD,WAE7CQ,IACFjhD,KAAKygD,WAAaM,EAClB/gD,KAAKy5C,OAAOz5C,KAAKk4C,kBAGnBl4C,KAAK6gD,YAAYnmD,SAAQ,CAACwmD,EAAYtmD,KAChCqmD,GACF/O,GAAagP,EAAWld,IAAKppC,EAAQoF,KAAK4gD,sBAAwB5gD,KAAKygD,YAGrEK,GAAgBI,EAAW/Z,OAC7B+Z,EAAW/Z,MAAMyN,QAClB,GAEJ,CAMD,aAAAuM,GAGEnhD,KAAK0gD,mBAAqB,EAC1B1gD,KAAK2gD,mBAAqB,EAE1B3gD,KAAKygD,WAAa,EAElBzgD,KAAK4gD,sBAAwB,CAC9B,CAOD,aAAAQ,GACEphD,KAAK6gD,YAAc,GAGnB,IAAK,IAAIlnD,EAAI,EAAGA,EAAI,EAAGA,IAAK,CAC1B,MAAMqqC,EAAK1lC,GAAc,aAAc,MAAO0B,KAAKilC,KAAK5mC,WACxD2lC,EAAGn+B,aAAa,OAAQ,SACxBm+B,EAAGn+B,aAAa,uBAAwB,SACxCm+B,EAAGn+B,aAAa,cAAe,QAE/Bm+B,EAAGrmC,MAAM0jD,QAAgB,IAAN1nD,EAAU,QAAU,OACvCqG,KAAK6gD,YAAY7iD,KAAK,CACpBgmC,MAGH,CACF,CAOD,WAAAsd,GACE,OAAOthD,KAAKilC,KAAKiI,cAAgB,CAClC,CAkBD,WAAAiL,CAAY+H,EAAMqB,EAASC,GACzB,MAAMvc,KACJA,GACEjlC,KACJ,IAAIyhD,EAAWxc,EAAKyc,eAAiBxB,EACrC,MAAMyB,EAAY1c,EAAKiI,cAEvB,GAAIjI,EAAK2c,UAAW,CAClBH,EAAWxc,EAAK4c,eAAeJ,GAC/B,MAAMK,GAAY5B,EAAOyB,GAAaA,EAIpCzB,EAFE4B,GAAYH,EAAY,EAEnBG,EAGAA,EAAWH,CAE1B,MACUF,EAAW,EACbA,EAAW,EACFA,GAAYE,IACrBF,EAAWE,EAAY,GAGzBzB,EAAOuB,EAAWxc,EAAKyc,eAGzBzc,EAAKyc,eAAiBD,EACtBzhD,KAAK0gD,oBAAsBR,EAC3Bjb,EAAKuQ,WAAWuM,iBAChB,MAAMC,EAAehiD,KAAKk4C,gBAE1B,GAAKqJ,EAGE,CACLtc,EAAKuQ,WAAW0D,YAAY,CAC1B+I,cAAc,EACdtvC,MAAO3S,KAAKypB,EACZquB,IAAKkK,EACLjK,SAAUyJ,GAAa,EACvBjG,iBAAkB,GAClBxC,aAAc,EAEdI,SAAU1vB,IACRzpB,KAAKy5C,OAAOhwB,EAAE,EAEhBysB,WAAY,KACVl2C,KAAKkiD,iBACLjd,EAAKsP,aAAa,IAGtB,IAAI4N,EAAWld,EAAKyc,eAAiBzc,EAAK2O,UAE1C,GAAI3O,EAAK2c,UAAW,CAClB,MAAMQ,GAAgBD,EAAWR,GAAaA,EAI5CQ,EAFEC,GAAgBT,EAAY,EAEnBS,EAGAA,EAAeT,CAE7B,CAIG3lD,KAAK81C,IAAIqQ,GAAY,GACvBniD,KAAKkiD,gBAER,MAtCCliD,KAAKy5C,OAAOuI,GACZhiD,KAAKkiD,iBAuCP,OAAO/lB,QAAQ+jB,EAChB,CAQD,aAAAhI,GACE,OAAOl4C,KAAKygD,WAAazgD,KAAK0gD,kBAC/B,CAQD,SAAA/L,GACE,OAAO30C,KAAKypB,IAAMzpB,KAAKk4C,eACxB,CAMD,cAAAgK,GACE,IAAIG,EAEJ,MAAMpd,KACJA,GACEjlC,KACEsiD,EAAqBtiD,KAAK2gD,mBAAqB3gD,KAAK0gD,mBAE1D,IAAK4B,EACH,OAGFtiD,KAAK2gD,mBAAqB3gD,KAAK0gD,mBAC/Bzb,EAAK2O,UAAY3O,EAAKyc,eACtB,IAGIa,EAHAC,EAAUxmD,KAAK81C,IAAIwQ,GAKnBE,GAAW,IACbxiD,KAAK4gD,sBAAwB0B,GAAsBA,EAAqB,GAAK,EAAI,GACjFE,EAAU,GAGZ,IAAK,IAAI7oD,EAAI,EAAGA,EAAI6oD,EAAS7oD,IACvB2oD,EAAqB,GACvBC,EAAaviD,KAAK6gD,YAAY7rB,QAE1ButB,IACFviD,KAAK6gD,YAAY,GAAK0B,EAEtBviD,KAAK4gD,uBACL1O,GAAaqQ,EAAWve,IAAKhkC,KAAK4gD,qBAAuB,GAAK5gD,KAAKygD,YACnExb,EAAKwd,WAAWF,EAAYtd,EAAK2O,UAAY4O,EAAU7oD,EAAI,MAG7D4oD,EAAaviD,KAAK6gD,YAAY1rC,MAE1BotC,IACFviD,KAAK6gD,YAAY6B,QAAQH,GAEzBviD,KAAK4gD,uBACL1O,GAAaqQ,EAAWve,GAAIhkC,KAAK4gD,qBAAuB5gD,KAAKygD,YAC7Dxb,EAAKwd,WAAWF,EAAYtd,EAAK2O,UAAY4O,EAAU7oD,EAAI,KAW7DqC,KAAK81C,IAAI9xC,KAAK4gD,sBAAwB,KAAO5gD,KAAK20C,cACpD30C,KAAKmhD,gBACLnhD,KAAK40C,UAIP3P,EAAKuQ,WAAWC,aAChBz1C,KAAK6gD,YAAYnmD,SAAQ,CAACwmD,EAAYvnD,KAChCunD,EAAW/Z,OAEb+Z,EAAW/Z,MAAMkN,YAAkB,IAAN16C,EAC9B,IAEHsrC,EAAK4R,UAA2D,QAA9CwL,EAAqBriD,KAAK6gD,YAAY,UAAuC,IAAvBwB,OAAgC,EAASA,EAAmBlb,MACpIlC,EAAKwM,cAAckR,WAAWL,GAE1Brd,EAAK4R,WACP5R,EAAK4R,UAAUpC,sBAGjBxP,EAAKe,SAAS,SACf,CASD,MAAAyT,CAAOhwB,EAAGm5B,GACR,IAAK5iD,KAAKilC,KAAK2c,WAAagB,EAAU,CAEpC,IAAIC,GAAuB7iD,KAAKygD,WAAazgD,KAAK0gD,mBAAqBj3B,GAAKzpB,KAAKygD,WACjFoC,GAAuB7iD,KAAKilC,KAAK2O,UACjC,MAAM2F,EAAQv9C,KAAKC,MAAMwtB,EAAIzpB,KAAKypB,IAE9Bo5B,EAAsB,GAAKtJ,EAAQ,GAAKsJ,GAAuB7iD,KAAKilC,KAAKiI,cAAgB,GAAKqM,EAAQ,KACxG9vB,EAAIzpB,KAAKypB,EAlUgB,IAkUZ8vB,EAEhB,CAEDv5C,KAAKypB,EAAIA,EAELzpB,KAAKilC,KAAK5mC,WACZ6zC,GAAalyC,KAAKilC,KAAK5mC,UAAWorB,GAGpCzpB,KAAKilC,KAAKe,SAAS,iBAAkB,CACnCvc,IACAm5B,SAAUA,SAA2CA,GAExD,EAWH,MAAME,GAAsB,CAC1BC,OAAQ,GACR1nB,EAAG,GACH2nB,UAAW,GACXC,QAAS,GACTC,WAAY,GACZC,UAAW,GACXC,IAAK,GASDC,GAAsB,CAAC3mD,EAAK4mD,IACzBA,EAAiB5mD,EAAMomD,GAAoBpmD,GAQpD,MAAM6mD,GAIJ,WAAAzjD,CAAYmlC,GACVjlC,KAAKilC,KAAOA,EAGZjlC,KAAKwjD,aAAc,EACnBve,EAAK1gC,GAAG,cAAc,KAChB0gC,EAAK/X,QAAQu2B,YAEVxe,EAAK/X,QAAQwjB,mBAIhB1wC,KAAK0jD,aAGPze,EAAKxnB,OAAOrX,IAAIlI,SAAU,UAE1B8B,KAAK2jD,WAAWrqC,KAAKtZ,QAGvBilC,EAAKxnB,OAAOrX,IAAIlI,SAAU,UAE1B8B,KAAK4jD,WAAWtqC,KAAKtZ,MAAM,IAE7B,MAAM6jD,EAEN3lD,SAASwV,cACTuxB,EAAK1gC,GAAG,WAAW,KACb0gC,EAAK/X,QAAQ42B,aAAeD,GAAqB7jD,KAAKwjD,aACxDK,EAAkBx+C,OACnB,GAEJ,CAID,UAAAq+C,IACO1jD,KAAKwjD,aAAexjD,KAAKilC,KAAK5nC,UACjC2C,KAAKilC,KAAK5nC,QAAQgI,QAClBrF,KAAKwjD,aAAc,EAEtB,CAOD,UAAAI,CAAW3tC,GACT,MAAMgvB,KACJA,GACEjlC,KAEJ,GAAIilC,EAAKe,SAAS,UAAW,CAC3B4V,cAAe3lC,IACd4uB,iBACD,OAGF,GAh7FJ,SAAwB5uB,GACtB,MAAO,WAAYA,GAAkB,IAAbA,EAAEs5B,QAAgBt5B,EAAEu5B,SAAWv5B,EAAEw5B,SAAWx5B,EAAEy5B,QAAUz5B,EAAE05B,QACpF,CA86FQC,CAAe35B,GAIjB,OAKF,IAAI8tC,EAGAxQ,EACAyQ,GAAY,EAChB,MAAMV,EAAkB,QAASrtC,EAEjC,OAAQqtC,EAAiBrtC,EAAEvZ,IAAMuZ,EAAEguC,SACjC,KAAKZ,GAAoB,SAAUC,GAC7Bre,EAAK/X,QAAQg3B,SACfH,EAAgB,SAGlB,MAEF,KAAKV,GAAoB,IAAKC,GAC5BS,EAAgB,aAChB,MAEF,KAAKV,GAAoB,YAAaC,GACpC/P,EAAO,IACP,MAEF,KAAK8P,GAAoB,UAAWC,GAClC/P,EAAO,IACP,MAEF,KAAK8P,GAAoB,aAAcC,GACrC/P,EAAO,IACPyQ,GAAY,EACZ,MAEF,KAAKX,GAAoB,YAAaC,GACpCU,GAAY,EACZzQ,EAAO,IACP,MAEF,KAAK8P,GAAoB,MAAOC,GAC9BtjD,KAAK0jD,aAMT,GAAInQ,EAAM,CAERt9B,EAAE+R,iBACF,MAAM6uB,UACJA,GACE5R,EAEAA,EAAK/X,QAAQi3B,WAAsB,MAAT5Q,GAAgBtO,EAAKiI,cAAgB,EACjE6W,EAAgBC,EAAY,OAAS,OAC5BnN,GAAaA,EAAUzK,cAAgByK,EAAU/K,WAAWb,MAKrE4L,EAAU/C,IAAIP,IAASyQ,GAAa,GAAK,GACzCnN,EAAUhC,MAAMgC,EAAU/C,IAAIrqB,EAAGotB,EAAU/C,IAAInjB,GAElD,CAEGozB,IACF9tC,EAAE+R,iBAEFid,EAAK8e,KAER,CASD,UAAAJ,CAAW1tC,GACT,MAAM1c,SACJA,GACEyG,KAAKilC,KAEL1rC,GAAY2E,WAAa+X,EAAEzT,QAAUjJ,IAAa0c,EAAEzT,SAAWjJ,EAASi3C,SAE5Ev6B,EAAEzT,SAEAjJ,EAAS8L,OAEZ,EAIH,MAAM++C,GAAiB,2BAkBvB,MAAMC,GAMJ,WAAAvkD,CAAYwkD,GACV,IAAIC,EAEJvkD,KAAKskD,MAAQA,EACb,MAAM9hD,OACJA,EAAM0zC,WACNA,EAAUzP,UACVA,EAAS+d,SACTA,EAAW,SAAQnS,SACnBA,EAAW,IAAG8D,OACdA,EAASiO,IACPE,EACJtkD,KAAKwkD,SAAWA,EAEhB,MAAMha,EAAO/D,EAAY,YAAc,UACjCE,EAA4C,QAA/B4d,EAAcD,EAAM9Z,UAAmC,IAAhB+Z,EAAyBA,EAAc,GAGjGvkD,KAAKykD,QAAUjiD,EAGfxC,KAAK0kD,YAAcxO,EAGnBl2C,KAAK2kD,WAAY,EAGjB3kD,KAAK4kD,iBAAmB5kD,KAAK4kD,iBAAiBtrC,KAAKtZ,MASnDA,KAAK6kD,eAAiB12B,YAAW,KAC/BikB,GAAmB5vC,EAAQgoC,EAAM6H,EAAU8D,GAC3Cn2C,KAAK6kD,eAAiB12B,YAAW,KAC/B3rB,EAAOkC,iBAAiB,gBAAiB1E,KAAK4kD,kBAAkB,GAChEpiD,EAAOkC,iBAAiB,mBAAoB1E,KAAK4kD,kBAAkB,GAKnE5kD,KAAK6kD,eAAiB12B,YAAW,KAC/BnuB,KAAK8kD,oBAAoB,GACxBzS,EAAW,KACd7vC,EAAO7E,MAAM6sC,GAAQ7D,CAAS,GAC7B,GAAG,GACL,EACJ,CAOD,gBAAAie,CAAiB3uC,GACXA,EAAEzT,SAAWxC,KAAKykD,SACpBzkD,KAAK8kD,oBAER,CAMD,kBAAAA,GACO9kD,KAAK2kD,YACR3kD,KAAK2kD,WAAY,EACjB3kD,KAAKwkD,WAEDxkD,KAAK0kD,aACP1kD,KAAK0kD,cAGV,CAGD,OAAA7d,GACM7mC,KAAK6kD,gBACPp2B,aAAazuB,KAAK6kD,gBAvqGtBzS,GA0qGwBpyC,KAAKykD,SAE3BzkD,KAAKykD,QAAQ1/C,oBAAoB,gBAAiB/E,KAAK4kD,kBAAkB,GAEzE5kD,KAAKykD,QAAQ1/C,oBAAoB,mBAAoB/E,KAAK4kD,kBAAkB,GAEvE5kD,KAAK2kD,WACR3kD,KAAK8kD,oBAER,EAUH,MAAMC,GAgBJ,WAAAjlD,CAAY24C,EAAiBM,EAAcwC,GACzCv7C,KAAK+3C,SAA6B,IAAlBU,EAGhBz4C,KAAKglD,cAAgBjM,GAzBK,IA2B1B/4C,KAAKilD,kBAAoB1J,GA5BK,GA6B9Bv7C,KAAKklD,iBAAmBllD,KAAKilD,kBAEzBjlD,KAAKglD,cAAgB,IACvBhlD,KAAKklD,kBAAoBlpD,KAAK+1C,KAAK,EAAI/xC,KAAKglD,cAAgBhlD,KAAKglD,eAEpE,CASD,SAAAG,CAAUC,EAAeC,GAKvB,IACIC,EADA7F,EAAe,EAEnB4F,GAAa,IACb,MAAME,EAAoBvpD,KAAKwpD,KAAOxlD,KAAKglD,cAAgBhlD,KAAKilD,kBAAoBI,GAEpF,GAA2B,IAAvBrlD,KAAKglD,cACPM,EAAQtlD,KAAK+3C,SAAW/3C,KAAKilD,kBAAoBG,EACjD3F,GAAgB2F,EAAgBE,EAAQD,GAAaE,EACrDvlD,KAAK+3C,SAAW0H,GAAgBz/C,KAAKilD,kBAAoBK,EAAQC,OAC5D,GAAIvlD,KAAKglD,cAAgB,EAAG,CACjCM,EAAQ,EAAItlD,KAAKklD,kBAAoBllD,KAAKglD,cAAgBhlD,KAAKilD,kBAAoBG,EAAgBplD,KAAK+3C,UACxG,MAAM0N,EAAazpD,KAAK0pD,IAAI1lD,KAAKklD,iBAAmBG,GAC9CM,EAAa3pD,KAAK4pD,IAAI5lD,KAAKklD,iBAAmBG,GACpD5F,EAAe8F,GAAqBH,EAAgBK,EAAaH,EAAQK,GACzE3lD,KAAK+3C,SAAW0H,GAAgBz/C,KAAKilD,kBAAoBjlD,KAAKglD,cAAgBO,IAAsBvlD,KAAKklD,iBAAmBE,EAAgBO,EAAa3lD,KAAKklD,iBAAmBI,EAAQG,EAC1L,CAGD,OAAOhG,CACR,EAmBH,MAAMoG,GAIJ,WAAA/lD,CAAYwkD,GACVtkD,KAAKskD,MAAQA,EACbtkD,KAAK8lD,KAAO,EACZ,MAAMnzC,MACJA,EAAKmlC,IACLA,EAAGC,SACHA,EAAQoB,SACRA,EAAQjD,WACRA,EAAUsO,SACVA,EAAW,SAAQzL,aACnBA,EAAYwC,iBACZA,GACE+I,EACJtkD,KAAKwkD,SAAWA,EAChB,MAAMuB,EAAQ,IAAIhB,GAAYhN,EAAUgB,EAAcwC,GACtD,IAAIyK,EAAWv7B,KAAKC,MAChB06B,EAAgBzyC,EAAQmlC,EAE5B,MAAMmO,EAAgB,KAChBjmD,KAAK8lD,OACPV,EAAgBW,EAAMZ,UAAUC,EAAe36B,KAAKC,MAAQs7B,GAExDhqD,KAAK81C,IAAIsT,GAAiB,GAAKppD,KAAK81C,IAAIiU,EAAMhO,UAAY,IAE5DoB,EAASrB,GAEL5B,GACFA,IAGFl2C,KAAKwkD,aAELwB,EAAWv7B,KAAKC,MAChByuB,EAASiM,EAAgBtN,GACzB93C,KAAK8lD,KAAOzG,sBAAsB4G,IAErC,EAGHjmD,KAAK8lD,KAAOzG,sBAAsB4G,EACnC,CAGD,OAAApf,GACM7mC,KAAK8lD,MAAQ,GACfpG,qBAAqB1/C,KAAK8lD,MAG5B9lD,KAAK8lD,KAAO,CACb,EAwBH,MAAMI,GACJ,WAAApmD,GAEEE,KAAKmmD,iBAAmB,EACzB,CAMD,WAAAjN,CAAYoL,GACVtkD,KAAKomD,OAAO9B,GAAO,EACpB,CAMD,eAAAvO,CAAgBuO,GACdtkD,KAAKomD,OAAO9B,EACb,CASD,MAAA8B,CAAO9B,EAAO+B,GACZ,MAAMC,EAAYD,EAAW,IAAIR,GAEjCvB,GAAS,IAAID,GAEbC,GAKA,OAJAtkD,KAAKmmD,iBAAiBnoD,KAAKsoD,GAE3BA,EAAU9B,SAAW,IAAMxkD,KAAKumD,KAAKD,GAE9BA,CACR,CAMD,IAAAC,CAAKD,GACHA,EAAUzf,UACV,MAAMjsC,EAAQoF,KAAKmmD,iBAAiB/qD,QAAQkrD,GAExC1rD,GAAS,GACXoF,KAAKmmD,iBAAiBrxB,OAAOl6B,EAAO,EAEvC,CAED,OAAAu8C,GAEEn3C,KAAKmmD,iBAAiBzrD,SAAQ4rD,IAC5BA,EAAUzf,SAAS,IAErB7mC,KAAKmmD,iBAAmB,EACzB,CAMD,UAAA1Q,GACEz1C,KAAKmmD,iBAAmBnmD,KAAKmmD,iBAAiBnhD,QAAOshD,IAC/CA,EAAUhC,MAAMtO,QAClBsQ,EAAUzf,WACH,IAKZ,CAED,cAAAkb,GACE/hD,KAAKmmD,iBAAmBnmD,KAAKmmD,iBAAiBnhD,QAAOshD,IAC/CA,EAAUhC,MAAMrC,eAClBqE,EAAUzf,WACH,IAKZ,CAeD,YAAA2f,GACE,OAAOxmD,KAAKmmD,iBAAiBM,MAAKH,GACzBA,EAAUhC,MAAMtO,OAE1B,EAUH,MAAM0Q,GAIJ,WAAA5mD,CAAYmlC,GACVjlC,KAAKilC,KAAOA,EACZA,EAAKxnB,OAAOrX,IAAI6+B,EAAK5nC,QAAS,QAE9B2C,KAAK2mD,SAASrtC,KAAKtZ,MACpB,CAOD,QAAA2mD,CAAS1wC,GACPA,EAAE+R,iBACF,MAAM6uB,UACJA,GACE72C,KAAKilC,KACT,IAAI2hB,OACFA,EAAMC,OACNA,GACE5wC,EAEJ,GAAK4gC,IAID72C,KAAKilC,KAAKe,SAAS,QAAS,CAC9B4V,cAAe3lC,IACd4uB,iBAIH,GAAI5uB,EAAEu5B,SAAWxvC,KAAKilC,KAAK/X,QAAQ45B,aAEjC,GAAIjQ,EAAUvN,aAAc,CAC1B,IAAIkN,GAAcqQ,EAEE,IAAhB5wC,EAAE8wC,UAGJvQ,GAAc,IAEdA,GAAcvgC,EAAE8wC,UAAY,EAAI,KAGlCvQ,EAAa,GAAKA,EAClB,MAAMpB,EAAgByB,EAAUzK,cAAgBoK,EAChDK,EAAU1B,OAAOC,EAAe,CAC9B3rB,EAAGxT,EAAE65B,QACLnf,EAAG1a,EAAE85B,SAER,OAGG8G,EAAUF,eACQ,IAAhB1gC,EAAE8wC,YAIJH,GAAU,GACVC,GAAU,IAGZhQ,EAAUhC,MAAMgC,EAAU/C,IAAIrqB,EAAIm9B,EAAQ/P,EAAU/C,IAAInjB,EAAIk2B,GAGjE,EA+EH,MAAMG,GAKJ,WAAAlnD,CAAYmlC,EAAM3lC,GAChB,IAAI2nD,EAEJ,MAAM5mD,EAAOf,EAAKe,MAAQf,EAAK2G,UAC/B,IAAIihD,EAAc5nD,EAAK6H,KAEvB,IAA2B,IAAvB89B,EAAK/X,QAAQ7sB,GAEf,OAKwC,iBAA/B4kC,EAAK/X,QAAQ7sB,EAAO,SAM7B6mD,EAAcjiB,EAAK/X,QAAQ7sB,EAAO,QAGpC4kC,EAAKe,SAAS,kBAAmB,CAC/B1mC,SAEF,IAAI2G,EAAY,GAEZ3G,EAAK6nD,UACPlhD,GAAa,gBACbA,GAAa3G,EAAK2G,WAAa,iBAAiB3G,EAAKe,QAErD4F,GAAa3G,EAAK2G,WAAa,SAAS3G,EAAKe,OAG/C,IAAI+R,EAAU9S,EAAK6nD,SAAW7nD,EAAK8S,SAAW,SAAW9S,EAAK8S,SAAW,MACzEA,EAEAA,EAAQ1W,cAGR,MAAM2B,EAAUiB,GAAc2H,EAAWmM,GAEzC,GAAI9S,EAAK6nD,SAAU,CACD,WAAZ/0C,IAEF/U,EAAQmH,KAAO,UAGjB,IAAIk8B,MACFA,GACEphC,EACJ,MAAM8nD,UACJA,GACE9nD,EAEwC,iBAAjC2lC,EAAK/X,QAAQ7sB,EAAO,WAE7BqgC,EAAQuE,EAAK/X,QAAQ7sB,EAAO,UAG1BqgC,IACFrjC,EAAQqjC,MAAQA,GAGlB,MAAM2mB,EAAWD,GAAa1mB,EAE1B2mB,GACFhqD,EAAQwI,aAAa,aAAcwhD,EAEtC,CAEDhqD,EAAQkB,UAhHZ,SAAwB+oD,GACtB,GAAwB,iBAAbA,EAQT,OAAOA,EAGT,IAAKA,IAAaA,EAASC,YACzB,MAAO,GAGT,MAAMC,EAAUF,EAChB,IAAIG,EAAM,wFAgBV,OAdAA,EAAMA,EAAIjtD,MAAM,MAAMwgB,KAEtBwsC,EAAQ3kB,MAAQ,IAMZ2kB,EAAQE,YACVD,GAAO,8CAAgDD,EAAQE,UAAY,OAG7ED,GAAOD,EAAQG,MACfF,GAAO,SACAA,CACT,CA8EwBG,CAAeV,GAE/B5nD,EAAKuoD,QACPvoD,EAAKuoD,OAAOxqD,EAAS4nC,GAGnB3lC,EAAK2oB,UACP5qB,EAAQyqD,QAAU7xC,IACY,iBAAjB3W,EAAK2oB,QAEdgd,EAAK3lC,EAAK2oB,WACuB,mBAAjB3oB,EAAK2oB,SACrB3oB,EAAK2oB,QAAQhS,EAAG5Y,EAAS4nC,EAC1B,GAKL,MAAM8iB,EAAWzoD,EAAKyoD,UAAY,MAGlC,IAAI1pD,EAAY4mC,EAAK5nC,QAEJ,QAAb0qD,GACG9iB,EAAK+iB,SACR/iB,EAAK+iB,OAAS1pD,GAAc,oCAAqC,MAAO2mC,EAAK0Y,aAG/Et/C,EAAY4mC,EAAK+iB,SAIjB3qD,EAAQ8I,UAAUC,IAAI,uBAEL,YAAb2hD,IACF1pD,EAAY4mC,EAAK0Y,aAIQ,QAA5BsJ,EAAa5oD,SAAsC,IAAf4oD,GAAyBA,EAAWv/C,YAAYu9B,EAAKU,aAAa,YAAatoC,EAASiC,GAC9H,EAkBH,SAAS2oD,GAAgB5qD,EAAS4nC,EAAMijB,GACtC7qD,EAAQ8I,UAAUC,IAAI,uBAEtB/I,EAAQwI,aAAa,gBAAiB,eACtCo/B,EAAK1gC,GAAG,UAAU,KACX0gC,EAAK/X,QAAQi7B,OAGd9qD,EAAQ+qD,SAFNF,IAEmBjjB,EAAK2O,UAAY3O,EAAKiI,cAAgB,KAGtCjI,EAAK2O,UAAY,GAEzC,GAEL,CAIA,MAAMyU,GAAY,CAChBhoD,KAAM,YACN4F,UAAW,4BACXy6B,MAAO,WACP4nB,MAAO,GACPnB,UAAU,EACVY,SAAU,UACV5gD,KAAM,CACJogD,aAAa,EACb1kB,KAAM,GACN8kB,MAAO,4EACPD,UAAW,mBAEbz/B,QAAS,OACT4/B,OAAQI,IAIJM,GAAY,CAChBloD,KAAM,YACN4F,UAAW,4BACXy6B,MAAO,OACP4nB,MAAO,GACPnB,UAAU,EACVY,SAAU,UACV5gD,KAAM,CACJogD,aAAa,EACb1kB,KAAM,GACN8kB,MAAO,uCACPD,UAAW,mBAEbz/B,QAAS,OACT4/B,OAAQ,CAAC7jB,EAAIiB,KACXgjB,GAAgBjkB,EAAIiB,GAAM,EAAK,GAK7BujB,GAAc,CAClBnoD,KAAM,QACNqgC,MAAO,QACP4nB,MAAO,GACPnB,UAAU,EACVhgD,KAAM,CACJogD,aAAa,EACbI,MAAO,wFACPD,UAAW,mBAEbz/B,QAAS,SAILwgC,GAAa,CACjBpoD,KAAM,OACNqgC,MAAO,OACP4nB,MAAO,GACPnB,UAAU,EACVhgD,KAAM,CACJogD,aAAa,EAEbI,MAAO,uPACPD,UAAW,kBAEbz/B,QAAS,cAILygC,GAAmB,CACvBroD,KAAM,YACN0nD,SAAU,MACVO,MAAO,EACPnhD,KAAM,CACJogD,aAAa,EAEbI,MAAO,kIACPD,UAAW,qBAEbG,OAAQ,CAACc,EAAkB1jB,KAEzB,IAAI2jB,EAGAC,EAAe,KAMnB,MAQMC,EAAyBC,IARF,IAAC9iD,EAAWG,EASnCwiD,IAAcG,IAChBH,EAAYG,EAVc9iD,EAWL,SAXgBG,EAWN2iD,EAVjCJ,EAAiBxiD,UAAUo2C,OAAO,oBAAsBt2C,EAAWG,GAWlE,EAGG4iD,EAA4B,KAChC,IAAIC,EAEJ,GAA6C,QAAtCA,EAAkBhkB,EAAK4R,iBAA2C,IAApBoS,IAA8BA,EAAgBvvD,QAAQ0vC,YAQzG,OAPA0f,GAAuB,QAEnBD,IACFp6B,aAAao6B,GACbA,EAAe,OAMdA,IAEHA,EAAe16B,YAAW,KACxB,IAAI+6B,EAEJJ,EAAuB3sB,QAAgD,QAAvC+sB,EAAmBjkB,EAAK4R,iBAA4C,IAArBqS,OAA8B,EAASA,EAAiBxvD,QAAQ0vC,cAC/Iyf,EAAe,IAAI,GAClB5jB,EAAK/X,QAAQi8B,gBACjB,EAGHlkB,EAAK1gC,GAAG,SAAUykD,GAClB/jB,EAAK1gC,GAAG,gBAAgB0R,IAClBgvB,EAAK4R,YAAc5gC,EAAEkxB,OACvB6hB,GACD,IAGC/jB,EAAKmkB,KACPnkB,EAAKmkB,GAAGJ,0BAA4BA,EACrC,GAKCK,GAAmB,CACvBhpD,KAAM,UACNioD,MAAO,EACPT,OAAQ,CAACyB,EAAgBrkB,KACvBA,EAAK1gC,GAAG,UAAU,KAChB+kD,EAAejiD,UAAY49B,EAAK2O,UAAY,EAAI3O,EAAK/X,QAAQq8B,kBAAoBtkB,EAAKiI,aAAa,GACnG,GAkBN,SAASsc,GAAYxlB,EAAIylB,GACvBzlB,EAAG79B,UAAUo2C,OAAO,kBAAmBkN,EACzC,CAEA,MAAMC,GAIJ,WAAA5pD,CAAYmlC,GACVjlC,KAAKilC,KAAOA,EACZjlC,KAAK2pD,cAAe,EAGpB3pD,KAAK4pD,eAAiB,GAGtB5pD,KAAKstC,MAAQ,GAGbttC,KAAKgpD,0BAA4B,OAOjChpD,KAAK6pD,2BAAwB1uD,CAC9B,CAED,IAAAk0C,GACE,MAAMpK,KACJA,GACEjlC,KACJA,KAAK2pD,cAAe,EACpB3pD,KAAK4pD,eAAiB,CAACpB,GAAaH,GAAWE,GAAWE,GAAYC,GAAkBW,IACxFpkB,EAAKe,SAAS,cAEdhmC,KAAK4pD,eAAerkB,MAAK,CAACvsB,EAAG4C,KAEnB5C,EAAEsvC,OAAS,IAAM1sC,EAAE0sC,OAAS,KAEtCtoD,KAAKstC,MAAQ,GACbttC,KAAK2pD,cAAe,EACpB3pD,KAAK4pD,eAAelvD,SAAQovD,IAC1B9pD,KAAK+pD,gBAAgBD,EAAc,IAErC7kB,EAAK1gC,GAAG,UAAU,KAChB,IAAIylD,EAE+B,QAAlCA,EAAgB/kB,EAAK5nC,eAAuC,IAAlB2sD,GAA4BA,EAAc7jD,UAAUo2C,OAAO,kBAA0C,IAAvBtX,EAAKiI,cAAoB,IAEpJjI,EAAK1gC,GAAG,iBAAiB,IAAMvE,KAAKiqD,oBACrC,CAMD,eAAAF,CAAgBG,GACVlqD,KAAK2pD,aACP3pD,KAAKstC,MAAMtvC,KAAK,IAAIgpD,GAAUhnD,KAAKilC,KAAMilB,IAEzClqD,KAAK4pD,eAAe5rD,KAAKksD,EAE5B,CASD,gBAAAD,GACE,MAAM1wD,SACJA,EAAQs9C,UACRA,EAAS3pB,QACTA,GACEltB,KAAKilC,KAET,GAAIjlC,KAAKilC,KAAK8O,OAAOoW,YAAc5wD,IAAas9C,EAC9C,OAGF,IAAIzK,cACFA,GACEyK,EAMJ,GAJK72C,KAAKilC,KAAK8O,OAAOC,SACpB5H,EAAgByK,EAAU/K,WAAWV,SAGnCgB,IAAkBpsC,KAAK6pD,sBACzB,OAGF7pD,KAAK6pD,sBAAwBzd,EAC7B,MAAMge,EAAoBvT,EAAU/K,WAAWV,QAAUyL,EAAU/K,WAAWT,UAE9E,GAAIrvC,KAAK81C,IAAIsY,GAAqB,MAASvT,EAAUvN,aAInD,OAFAkgB,GAAYjwD,GAAU,QACtBA,EAAS4M,UAAUG,OAAO,sBAI5B/M,EAAS4M,UAAUC,IAAI,sBAEvBojD,GAAYjwD,GADe6yC,IAAkByK,EAAU/K,WAAWV,QAAUyL,EAAU/K,WAAWT,UAAYwL,EAAU/K,WAAWV,UACtFgB,GAEX,SAA7Blf,EAAQm9B,kBAA4D,kBAA7Bn9B,EAAQm9B,kBACjD9wD,EAAS4M,UAAUC,IAAI,sBAE1B,EA8UH,MAAM8/B,GAKJ,WAAApmC,CAAY0E,EAAMogC,GAChB5kC,KAAKwE,KAAOA,EACZxE,KAAK6kC,kBAAmB,EAEpBD,GACF9yB,OAAOC,OAAO/R,KAAM4kC,EAEvB,CAED,cAAA5c,GACEhoB,KAAK6kC,kBAAmB,CACzB,EASH,MAAMoI,GACJ,WAAAntC,GAIEE,KAAK+kC,WAAa,GAKlB/kC,KAAKglC,SAAW,GAGhBhlC,KAAKilC,UAAO9pC,EAGZ6E,KAAKktB,aAAU/xB,CAChB,CASD,SAAA+pC,CAAU7kC,EAAMuc,EAAIuoB,EAAW,KAC7B,IAAIC,EAAqBC,EAAsBC,EAE1CtlC,KAAKglC,SAAS3kC,KACjBL,KAAKglC,SAAS3kC,GAAQ,IAGwB,QAA/C+kC,EAAsBplC,KAAKglC,SAAS3kC,UAA2C,IAAxB+kC,GAAkCA,EAAoBpnC,KAAK,CACjH4e,KACAuoB,aAE+C,QAAhDE,EAAuBrlC,KAAKglC,SAAS3kC,UAA4C,IAAzBglC,GAAmCA,EAAqBE,MAAK,CAACC,EAAIC,IAAOD,EAAGL,SAAWM,EAAGN,WACtH,QAA5BG,EAAatlC,KAAKilC,YAAiC,IAAfK,GAAyBA,EAAWJ,UAAU7kC,EAAMuc,EAAIuoB,EAC9F,CAQD,YAAAO,CAAarlC,EAAMuc,GACb5c,KAAKglC,SAAS3kC,KAEhBL,KAAKglC,SAAS3kC,GAAQL,KAAKglC,SAAS3kC,GAAM2E,QAAOA,GAAUA,EAAO4X,KAAOA,KAGvE5c,KAAKilC,MACPjlC,KAAKilC,KAAKS,aAAarlC,EAAMuc,EAEhC,CASD,YAAA+oB,CAAatlC,KAASie,GACpB,IAAIsnB,EAMJ,OAJiD,QAAhDA,EAAuB5lC,KAAKglC,SAAS3kC,UAA4C,IAAzBulC,GAAmCA,EAAqBlrC,SAAQsK,IAEvHsZ,EAAK,GAAKtZ,EAAO4X,GAAGld,MAAMM,KAAMse,EAAK,IAEhCA,EAAK,EACb,CAQD,EAAA/Z,CAAGlE,EAAMuc,GACP,IAAIipB,EAAuBC,EAEtB9lC,KAAK+kC,WAAW1kC,KACnBL,KAAK+kC,WAAW1kC,GAAQ,IAG0B,QAAnDwlC,EAAwB7lC,KAAK+kC,WAAW1kC,UAA6C,IAA1BwlC,GAAoCA,EAAsB7nC,KAAK4e,GAI7F,QAA7BkpB,EAAc9lC,KAAKilC,YAAkC,IAAhBa,GAA0BA,EAAYvhC,GAAGlE,EAAMuc,EACtF,CAQD,GAAAhY,CAAIvE,EAAMuc,GACR,IAAImpB,EAEA/lC,KAAK+kC,WAAW1kC,KAElBL,KAAK+kC,WAAW1kC,GAAQL,KAAK+kC,WAAW1kC,GAAM2E,QAAOP,GAAYmY,IAAOnY,KAG5C,QAA7BshC,EAAc/lC,KAAKilC,YAAkC,IAAhBc,GAA0BA,EAAYnhC,IAAIvE,EAAMuc,EACvF,CASD,QAAAopB,CAAS3lC,EAAMukC,GACb,IAAIqB,EAEJ,GAAIjmC,KAAKilC,KACP,OAAOjlC,KAAKilC,KAAKe,SAAS3lC,EAAMukC,GAGlC,MAAM1/B,EAEN,IAAIghC,GAAgB7lC,EAAMukC,GAI1B,OAHqD,QAApDqB,EAAyBjmC,KAAK+kC,WAAW1kC,UAA8C,IAA3B4lC,GAAqCA,EAAuBvrC,SAAQ+J,IAC/HA,EAASqU,KAAK9Y,KAAMkF,EAAM,IAErBA,CACR,EAIH,MAAMkjC,GAKJ,WAAAtoC,CAAYsmC,EAAU/nC,GAOpB,GAFA2B,KAAK3C,QAAUiB,GAAc,mCAAoC8nC,EAAW,MAAQ,MAAO/nC,GAEvF+nC,EAAU,CACZ,MAAMC,EAENrmC,KAAK3C,QACLgpC,EAAMC,SAAW,QACjBD,EAAMtkB,IAAM,GACZskB,EAAM1sB,IAAMysB,EACZC,EAAMxgC,aAAa,OAAQ,eAC5B,CAED7F,KAAK3C,QAAQwI,aAAa,cAAe,OAC1C,CAOD,gBAAA0gC,CAAiB9/B,EAAOK,GACjB9G,KAAK3C,UAImB,QAAzB2C,KAAK3C,QAAQ+U,SAIf6xB,GAAejkC,KAAK3C,QAAS,IAAK,QAClC2C,KAAK3C,QAAQM,MAAM6oC,gBAAkB,MACrCxmC,KAAK3C,QAAQM,MAAM8oC,UAAYG,GAAkB,EAAG,EAAGngC,EAAQ,MAE/Dw9B,GAAejkC,KAAK3C,QAASoJ,EAAOK,GAEvC,CAED,OAAA+/B,GACE,IAAIC,EAEmC,QAAlCA,EAAgB9mC,KAAK3C,eAAuC,IAAlBypC,GAA4BA,EAAchlC,YACvF9B,KAAK3C,QAAQiJ,SAGftG,KAAK3C,QAAU,IAChB,EAYH,MAAMowC,GAMJ,WAAA3tC,CAAYknC,EAAUC,EAAUrsC,GAC9BoF,KAAKinC,SAAWA,EAChBjnC,KAAKV,KAAO0nC,EACZhnC,KAAKpF,MAAQA,EAGboF,KAAK3C,aAAUlC,EAGf6E,KAAKknC,iBAAc/rC,EAGnB6E,KAAKmnC,WAAQhsC,EACb6E,KAAKonC,oBAAsB,EAC3BpnC,KAAKqnC,qBAAuB,EAC5BrnC,KAAKyG,MAAQlL,OAAOyE,KAAKV,KAAK4kC,IAAM3oC,OAAOyE,KAAKV,KAAKmH,QAAU,EAC/DzG,KAAK8G,OAASvL,OAAOyE,KAAKV,KAAKyY,IAAMxc,OAAOyE,KAAKV,KAAKwH,SAAW,EACjE9G,KAAKsnC,YAAa,EAClBtnC,KAAKunC,UAAW,EAChBvnC,KAAKwnC,YAAa,EAGlBxnC,KAAKynC,MAAQrD,GAETpkC,KAAKV,KAAKkF,KACZxE,KAAKwE,KAAOxE,KAAKV,KAAKkF,KACbxE,KAAKV,KAAKqa,IACnB3Z,KAAKwE,KAAO,QAEZxE,KAAKwE,KAAO,OAGdxE,KAAKinC,SAASjB,SAAS,cAAe,CACpCtsC,QAASsG,MAEZ,CAED,iBAAA0nC,GACM1nC,KAAKknC,cAAgBlnC,KAAK2nC,mBAE5BxZ,YAAW,KACLnuB,KAAKknC,cACPlnC,KAAKknC,YAAYL,UACjB7mC,KAAKknC,iBAAc/rC,EACpB,GACA,IAEN,CASD,IAAAysC,CAAKC,EAAQC,GACX,GAAI9nC,KAAKmnC,OAASnnC,KAAK+nC,iBACrB,GAAK/nC,KAAKknC,YAKH,CACL,MAAMc,EAAgBhoC,KAAKknC,YAAY7pC,QAEnC2qC,IAAkBA,EAAc52B,eAClCpR,KAAKmnC,MAAM9oC,UAAUmJ,QAAQwgC,EAEhC,KAXsB,CACrB,MAAMC,EAAiBjoC,KAAKinC,SAAStB,aAAa,oBAElD3lC,KAAKV,KAAK4oC,OAAQloC,KAAKmnC,MAAMgB,eAAenoC,KAAKV,KAAK4oC,KAAcloC,MACpEA,KAAKknC,YAAc,IAAIkB,GAAYH,EAAgBjoC,KAAKmnC,MAAM9oC,UACtE,CASQ2B,KAAK3C,UAAYyqC,GAIjB9nC,KAAKinC,SAASjB,SAAS,cAAe,CACxCtsC,QAASsG,KACT6nC,WACChD,mBAIC7kC,KAAKqoC,kBACProC,KAAK3C,QAAUiB,GAAc,YAAa,OAGtC0B,KAAKonC,qBACPpnC,KAAKsoC,UAAUT,KAGjB7nC,KAAK3C,QAAUiB,GAAc,gBAAiB,OAC9C0B,KAAK3C,QAAQkB,UAAYyB,KAAKV,KAAK6H,MAAQ,IAGzC2gC,GAAU9nC,KAAKmnC,OACjBnnC,KAAKmnC,MAAMoB,mBAAkB,GAEhC,CAQD,SAAAD,CAAUT,GACR,IAAIW,EAAgBC,EAEpB,IAAKzoC,KAAKqoC,mBAAqBroC,KAAK3C,SAAW2C,KAAKinC,SAASjB,SAAS,mBAAoB,CACxFtsC,QAASsG,KACT6nC,WACChD,iBACD,OAGF,MAAM6D,EAEN1oC,KAAK3C,QACL2C,KAAK2oC,oBAED3oC,KAAKV,KAAKspC,SACZF,EAAaE,OAAS5oC,KAAKV,KAAKspC,QAGlCF,EAAa/uB,IAA2C,QAApC6uB,EAAiBxoC,KAAKV,KAAKqa,WAAoC,IAAnB6uB,EAA4BA,EAAiB,GAC7GE,EAAa3mB,IAA2C,QAApC0mB,EAAiBzoC,KAAKV,KAAKyiB,WAAoC,IAAnB0mB,EAA4BA,EAAiB,GAC7GzoC,KAAKynC,MAAQrD,GAETsE,EAAaG,SACf7oC,KAAK8oC,YAELJ,EAAaxxB,OAAS,KACpBlX,KAAK8oC,UAAU,EAGjBJ,EAAa1xB,QAAU,KACrBhX,KAAKiX,SAAS,EAGnB,CAQD,QAAA8xB,CAAS5B,GACPnnC,KAAKmnC,MAAQA,EACbnnC,KAAKunC,UAAW,EAChBvnC,KAAKinC,SAAWE,EAAMlC,IACvB,CAMD,QAAA6D,GACE9oC,KAAKynC,MAAQrD,GAETpkC,KAAKmnC,OAASnnC,KAAK3C,UACrB2C,KAAKinC,SAASjB,SAAS,eAAgB,CACrCmB,MAAOnnC,KAAKmnC,MACZztC,QAASsG,OAGPA,KAAKmnC,MAAM6B,UAAYhpC,KAAKmnC,MAAM8B,gBAAkBjpC,KAAK3C,QAAQyE,aACnE9B,KAAK2H,SACL3H,KAAKmnC,MAAMoB,mBAAkB,IAG3BvoC,KAAKynC,QAAUrD,IAAqBpkC,KAAKynC,QAAUrD,IACrDpkC,KAAK0nC,oBAGV,CAMD,OAAAzwB,GACEjX,KAAKynC,MAAQrD,GAETpkC,KAAKmnC,QACPnnC,KAAKkpC,eACLlpC,KAAKinC,SAASjB,SAAS,eAAgB,CACrCmB,MAAOnnC,KAAKmnC,MACZgC,SAAS,EACTzvC,QAASsG,OAEXA,KAAKinC,SAASjB,SAAS,YAAa,CAClCmB,MAAOnnC,KAAKmnC,MACZztC,QAASsG,OAGd,CAMD,SAAAopC,GACE,OAAOppC,KAAKinC,SAAStB,aAAa,mBAAoB3lC,KAAKynC,QAAUrD,GAAoBpkC,KAC1F,CAMD,OAAAmpC,GACE,OAAOnpC,KAAKynC,QAAUrD,EACvB,CAMD,cAAAiE,GACE,MAAqB,UAAdroC,KAAKwE,IACb,CASD,gBAAA+hC,CAAiB9/B,EAAOK,GACtB,GAAK9G,KAAK3C,UAIN2C,KAAKknC,aACPlnC,KAAKknC,YAAYX,iBAAiB9/B,EAAOK,IAGvC9G,KAAKinC,SAASjB,SAAS,gBAAiB,CAC1CtsC,QAASsG,KACTyG,QACAK,WACC+9B,mBAIHZ,GAAejkC,KAAK3C,QAASoJ,EAAOK,GAEhC9G,KAAKqoC,mBAAqBroC,KAAKmpC,YAAW,CAC5C,MAAME,GAAuBrpC,KAAKonC,qBAAuB3gC,EACzDzG,KAAKonC,oBAAsB3gC,EAC3BzG,KAAKqnC,qBAAuBvgC,EAExBuiC,EACFrpC,KAAKsoC,WAAU,GAEftoC,KAAK2oC,oBAGH3oC,KAAKmnC,OACPnnC,KAAKinC,SAASjB,SAAS,kBAAmB,CACxCmB,MAAOnnC,KAAKmnC,MACZ1gC,QACAK,SACApN,QAASsG,MAGd,CACF,CAMD,UAAAspC,GACE,OAAOtpC,KAAKinC,SAAStB,aAAa,oBAAqB3lC,KAAKqoC,kBAAoBroC,KAAKynC,QAAUrD,GAAkBpkC,KAClH,CAMD,iBAAA2oC,GAME,IAAK3oC,KAAKqoC,mBAAqBroC,KAAK3C,UAAY2C,KAAKV,KAAKspC,OACxD,OAGF,MAAMrI,EAENvgC,KAAK3C,QACCksC,EAAavpC,KAAKinC,SAAStB,aAAa,mBAAoB3lC,KAAKonC,oBAAqBpnC,QAEvFugC,EAAMiJ,QAAQC,iBAAmBF,EAAa/tC,SAAS+kC,EAAMiJ,QAAQC,gBAAiB,OACzFlJ,EAAMmJ,MAAQH,EAAa,KAC3BhJ,EAAMiJ,QAAQC,gBAAkB5vC,OAAO0vC,GAE1C,CAMD,cAAAxB,GACE,OAAO/nC,KAAKinC,SAAStB,aAAa,wBAAyB3lC,KAAKqoC,iBAAkBroC,KACnF,CAMD,QAAA2pC,GACM3pC,KAAKinC,SAASjB,SAAS,kBAAmB,CAC5CtsC,QAASsG,OACR6kC,kBAIH7kC,KAAK4nC,MAAK,EACX,CAMD,eAAAD,GACE,OAAO3nC,KAAKinC,SAAStB,aAAa,uBAAwB3lC,KAAKopC,YAAappC,KAC7E,CAMD,OAAA6mC,GACE7mC,KAAKunC,UAAW,EAChBvnC,KAAKmnC,WAAQhsC,EAET6E,KAAKinC,SAASjB,SAAS,iBAAkB,CAC3CtsC,QAASsG,OACR6kC,mBAIH7kC,KAAKsG,SAEDtG,KAAKknC,cACPlnC,KAAKknC,YAAYL,UACjB7mC,KAAKknC,iBAAc/rC,GAGjB6E,KAAKqoC,kBAAoBroC,KAAK3C,UAChC2C,KAAK3C,QAAQ6Z,OAAS,KACtBlX,KAAK3C,QAAQ2Z,QAAU,KACvBhX,KAAK3C,aAAUlC,GAElB,CAMD,YAAA+tC,GACE,GAAIlpC,KAAKmnC,MAAO,CACd,IAAIyC,EAAuBC,EAE3B,IAAIC,EAAaxrC,GAAc,kBAAmB,OAClDwrC,EAAWziC,UAAoL,QAAvKuiC,EAA6E,QAApDC,EAAyB7pC,KAAKinC,SAAS/Z,eAAgD,IAA3B2c,OAAoC,EAASA,EAAuBE,gBAAgD,IAA1BH,EAAmCA,EAAwB,GAClQE,EAEA9pC,KAAKinC,SAAStB,aAAa,sBAAuBmE,EAAY9pC,MAC9DA,KAAK3C,QAAUiB,GAAc,0CAA2C,OACxE0B,KAAK3C,QAAQqK,YAAYoiC,GACzB9pC,KAAKmnC,MAAM9oC,UAAUgJ,UAAY,GACjCrH,KAAKmnC,MAAM9oC,UAAUqJ,YAAY1H,KAAK3C,SACtC2C,KAAKmnC,MAAMoB,mBAAkB,GAC7BvoC,KAAK0nC,mBACN,CACF,CAMD,MAAA//B,GACE,GAAI3H,KAAKsnC,aAAetnC,KAAK3C,QAC3B,OAKF,GAFA2C,KAAKsnC,YAAa,EAEdtnC,KAAKynC,QAAUrD,GAEjB,YADApkC,KAAKkpC,eAIP,GAAIlpC,KAAKinC,SAASjB,SAAS,gBAAiB,CAC1CtsC,QAASsG,OACR6kC,iBACD,OAGF,MAAMmF,EAAkB,WAAYhqC,KAAK3C,QAErC2C,KAAKqoC,iBAaH2B,GAAkBhqC,KAAKmnC,SAAWnnC,KAAKmnC,MAAM6B,UAAYvE,OAC3DzkC,KAAKwnC,YAAa,EAKlBxnC,KAAK3C,QAAQgf,SAAS4tB,OAAM,SAAUC,SAAQ,KAC5ClqC,KAAKwnC,YAAa,EAClBxnC,KAAKmqC,aAAa,KAGpBnqC,KAAKmqC,cAEEnqC,KAAKmnC,QAAUnnC,KAAK3C,QAAQyE,YACrC9B,KAAKmnC,MAAM9oC,UAAUqJ,YAAY1H,KAAK3C,QAEzC,CAQD,QAAA+sC,IACMpqC,KAAKinC,SAASjB,SAAS,kBAAmB,CAC5CtsC,QAASsG,OACR6kC,kBAAqB7kC,KAAKmnC,QAIzBnnC,KAAKqoC,kBAAoBroC,KAAKwnC,aAAe/C,KAG/CzkC,KAAKmqC,cACInqC,KAAKmpC,WACdnpC,KAAK4nC,MAAK,GAAO,GAGf5nC,KAAKmnC,MAAMkD,eACbrqC,KAAKmnC,MAAMkD,cAAcxkC,aAAa,cAAe,SAExD,CAMD,UAAAykC,GACEtqC,KAAKinC,SAASjB,SAAS,oBAAqB,CAC1CtsC,QAASsG,OAGPA,KAAKmnC,OAASnnC,KAAKmnC,MAAMkD,eAC3BrqC,KAAKmnC,MAAMkD,cAAcxkC,aAAa,cAAe,OAExD,CAMD,MAAAS,GACEtG,KAAKsnC,YAAa,EAEdtnC,KAAKinC,SAASjB,SAAS,gBAAiB,CAC1CtsC,QAASsG,OACR6kC,mBAIC7kC,KAAK3C,SAAW2C,KAAK3C,QAAQyE,YAC/B9B,KAAK3C,QAAQiJ,SAGXtG,KAAKknC,aAAelnC,KAAKknC,YAAY7pC,SACvC2C,KAAKknC,YAAY7pC,QAAQiJ,SAE5B,CAMD,WAAA6jC,GACOnqC,KAAKsnC,aAINtnC,KAAKinC,SAASjB,SAAS,qBAAsB,CAC/CtsC,QAASsG,OACR6kC,mBAKC7kC,KAAKmnC,OAASnnC,KAAK3C,UAAY2C,KAAK3C,QAAQyE,YAC9C9B,KAAKmnC,MAAM9oC,UAAUqJ,YAAY1H,KAAK3C,SAGpC2C,KAAKynC,QAAUrD,IAAqBpkC,KAAKynC,QAAUrD,IACrDpkC,KAAK0nC,qBAER,EA0BH,SAAS2E,GAAarF,EAAUC,EAAUrsC,GACxC,MAAMlB,EAAUutC,EAASqF,sBAAsBtF,EAAUpsC,GAGzD,IAAI2xC,EACJ,MAAMrf,QACJA,GACE+Z,EAGJ,GAAI/Z,EAAS,CAEX,IAAIud,EADJ8B,EAAY,IAAIC,GAAUtf,EAAS8Z,GAAW,GAI5CyD,EADExD,EAAShC,KACIgC,EAAShC,KAAKwF,aAEdqC,GAAgB5f,EAAS+Z,GAG1C,MAAM8D,EAAcgC,GAAe7f,EAASud,EAAczD,EAAUpsC,GACpE2xC,EAAUjB,OAAO5xC,EAAQ+M,MAAO/M,EAAQoN,OAAQikC,EACjD,CAQD,OANArxC,EAAQiwC,WAEJ4C,GACF7yC,EAAQ6sC,iBAAiBvqC,KAAKgxC,KAAKtzC,EAAQ+M,MAAQ8lC,EAAUnB,SAAUpvC,KAAKgxC,KAAKtzC,EAAQoN,OAASylC,EAAUnB,UAGvG1xC,CACT,CA0BA,MAAM4wD,GAIJ,WAAAxqD,CAAYmlC,GACVjlC,KAAKilC,KAAOA,EAEZjlC,KAAKqzB,MAAQr3B,KAAK4wB,IAAIqY,EAAK/X,QAAQyjB,QAAQ,GAAK1L,EAAK/X,QAAQyjB,QAAQ,GAAK,EA5ElD,GA+ExB3wC,KAAKuqD,aAAe,EACrB,CAQD,UAAA5H,CAAWzC,GACT,MAAMjb,KACJA,GACEjlC,KAEJ,GAAIilC,EAAKe,SAAS,YAAYnB,iBAC5B,OAGF,MAAM8L,QACJA,GACE1L,EAAK/X,QACH82B,OAAqB7oD,IAAT+kD,GAA4BA,GAAQ,EACtD,IAAIvmD,EAEJ,IAAKA,EAAI,EAAGA,GAAKg3C,EAAQ,GAAIh3C,IAC3BqG,KAAKwqD,iBAAiBvlB,EAAK2O,WAAaoQ,EAAYrqD,GAAKA,IAI3D,IAAKA,EAAI,EAAGA,GAAKg3C,EAAQ,GAAIh3C,IAC3BqG,KAAKwqD,iBAAiBvlB,EAAK2O,WAAaoQ,GAAarqD,EAAIA,GAE5D,CAMD,gBAAA6wD,CAAiBC,GACf,MAAM7vD,EAAQoF,KAAKilC,KAAK4c,eAAe4I,GAEvC,IAAI/wD,EAAUsG,KAAK0qD,kBAAkB9vD,GAEhClB,IAEHA,EApEN,SAAuBkB,EAAOqsC,GAC5B,MAAMD,EAAWC,EAASyG,YAAY9yC,GAEtC,IAAIqsC,EAASjB,SAAS,gBAAiB,CACrCprC,QACAosC,aACCnC,iBAIH,OAAOwH,GAAarF,EAAUC,EAAUrsC,EAC1C,CAyDgBs2C,CAAct2C,EAAOoF,KAAKilC,MAEhCvrC,GACFsG,KAAK0xC,WAAWh4C,GAGrB,CAOD,iBAAAu6C,CAAkB9M,GAChB,IAAIztC,EAAUsG,KAAK0qD,kBAAkBvjB,EAAMvsC,OAU3C,OARKlB,IAEHA,EAAUsG,KAAKilC,KAAKqH,sBAAsBnF,EAAM7nC,KAAM6nC,EAAMvsC,OAC5DoF,KAAK0xC,WAAWh4C,IAIlBA,EAAQqvC,SAAS5B,GACVztC,CACR,CAMD,UAAAg4C,CAAWh4C,GAMT,GAJAsG,KAAK2qD,cAAcjxD,EAAQkB,OAE3BoF,KAAKuqD,aAAavsD,KAAKtE,GAEnBsG,KAAKuqD,aAAa3wD,OAASoG,KAAKqzB,MAAO,CAEzC,MAAMu3B,EAAgB5qD,KAAKuqD,aAAaha,WAAUzrC,IACxCA,EAAKwiC,aAAexiC,EAAKyiC,WAGnC,IAAuB,IAAnBqjB,EAAsB,CACJ5qD,KAAKuqD,aAAaz1B,OAAO81B,EAAe,GAAG,GAEnD/jB,SACb,CACF,CACF,CAQD,aAAA8jB,CAAc/vD,GACZ,MAAMgwD,EAAgB5qD,KAAKuqD,aAAaha,WAAUzrC,GAAQA,EAAKlK,QAAUA,KAElD,IAAnBgwD,GACF5qD,KAAKuqD,aAAaz1B,OAAO81B,EAAe,EAE3C,CAOD,iBAAAF,CAAkB9vD,GAChB,OAAOoF,KAAKuqD,aAAajoD,MAAK5I,GAAWA,EAAQkB,QAAUA,GAC5D,CAED,OAAAisC,GACE7mC,KAAKuqD,aAAa7vD,SAAQhB,GAAWA,EAAQmtC,YAE7C7mC,KAAKuqD,aAAe,EACrB,EAaH,MAAMxb,WAAuB9B,GAM3B,WAAAC,GACE,IAAIC,EAEJ,IAAIC,EAAW,EACf,MAAMC,EAAgD,QAAlCF,EAAgBntC,KAAKktB,eAAuC,IAAlBigB,OAA2B,EAASA,EAAcE,WAE5GA,GAAc,WAAYA,EAE5BD,EAAWC,EAAWzzC,OACbyzC,GAAc,YAAaA,IAE/BA,EAAWC,QACdD,EAAWC,MAAQttC,KAAKutC,uBAAuBF,EAAWG,UAGxDH,EAAWC,QACbF,EAAWC,EAAWC,MAAM1zC,SAKhC,MAAMsL,EAAQlF,KAAKgmC,SAAS,WAAY,CACtCqH,aACAD,aAEF,OAAOptC,KAAK2lC,aAAa,WAAYzgC,EAAMkoC,SAAUC,EACtD,CAQD,qBAAAf,CAAsBP,EAAWnxC,GAC/B,OAAO,IAAI6yC,GAAQ1B,EAAW/rC,KAAMpF,EACrC,CAaD,WAAA8yC,CAAY9yC,GACV,IAAI+yC,EAEJ,MAAMN,EAAiD,QAAnCM,EAAiB3tC,KAAKktB,eAAwC,IAAnBygB,OAA4B,EAASA,EAAeN,WAGnH,IAAIO,EAAiB,CAAA,EAEjB3tC,MAAMC,QAAQmtC,GAEhBO,EAAiBP,EAAWzyC,GACnByyC,GAAc,YAAaA,IAK/BA,EAAWC,QACdD,EAAWC,MAAQttC,KAAKutC,uBAAuBF,EAAWG,UAG5DI,EAAiBP,EAAWC,MAAM1yC,IAGpC,IAAIosC,EAAW4G,EAEX5G,aAAoBzC,UACtByC,EAAWhnC,KAAK6tC,sBAAsB7G,IAKxC,MAAM9hC,EAAQlF,KAAKgmC,SAAS,WAAY,CACtCgB,SAAUA,GAAY,CAAE,EACxBpsC,UAEF,OAAOoF,KAAK2lC,aAAa,WAAYzgC,EAAM8hC,SAAUpsC,EACtD,CAUD,sBAAA2yC,CAAuBO,GACrB,IAAIC,EAAgBC,EAEpB,OAAwC,QAAnCD,EAAiB/tC,KAAKktB,eAAwC,IAAnB6gB,GAA6BA,EAAe7qC,UAAgD,QAAnC8qC,EAAiBhuC,KAAKktB,eAAwC,IAAnB8gB,GAA6BA,EAAeC,cAj3KpM,SAA+B93B,EAAQmuB,EAAgBviC,EAAS7D,UAE9D,IAAIQ,EAAW,GAEf,GAAIyX,aAAkBouB,QACpB7lC,EAAW,CAACyX,QACP,GAAIA,aAAkBquB,UAAYvkC,MAAMC,QAAQiW,GACrDzX,EAAWuB,MAAMgD,KAAKkT,OACjB,CACL,MAAMnT,EAA6B,iBAAXmT,EAAsBA,EAASmuB,EAEnDthC,IACFtE,EAAWuB,MAAMgD,KAAKlB,EAAOpD,iBAAiBqE,IAEjD,CAED,OAAOtE,CACT,CAi2Ka2lC,CAAsBrkC,KAAKktB,QAAQhqB,SAAUlD,KAAKktB,QAAQ+gB,cAAeH,IAAmB,GAG9F,CAACA,EACT,CASD,qBAAAD,CAAsBxwC,GAEpB,MAAM2pC,EAAW,CACf3pC,WAEI6wC,EAEc,MAApB7wC,EAAQ+U,QAAkB/U,EAAUA,EAAQ4lB,cAAc,KAE1D,GAAIirB,EAAQ,CAGVlH,EAASrtB,IAAMu0B,EAAO1E,QAAQ2E,SAAWD,EAAO3rB,KAE5C2rB,EAAO1E,QAAQ4E,aACjBpH,EAAS4B,OAASsF,EAAO1E,QAAQ4E,YAGnCpH,EAASvgC,MAAQynC,EAAO1E,QAAQ6E,UAAY7yC,SAAS0yC,EAAO1E,QAAQ6E,UAAW,IAAM,EACrFrH,EAASlgC,OAASonC,EAAO1E,QAAQ8E,WAAa9yC,SAAS0yC,EAAO1E,QAAQ8E,WAAY,IAAM,EAExFtH,EAAS9C,EAAI8C,EAASvgC,MACtBugC,EAASjvB,EAAIivB,EAASlgC,OAElBonC,EAAO1E,QAAQ+E,WACjBvH,EAASxiC,KAAO0pC,EAAO1E,QAAQ+E,UAGjC,MAAMC,EAAcnxC,EAAQ4lB,cAAc,OAGxC,IAAIwrB,EADN,GAAID,EAKFxH,EAASkB,KAAOsG,EAAYE,YAAcF,EAAY70B,IACtDqtB,EAASjlB,IAAoE,QAA7D0sB,EAAwBD,EAAY/sC,aAAa,cAA8C,IAA1BgtC,EAAmCA,EAAwB,IAG9IP,EAAO1E,QAAQmF,aAAeT,EAAO1E,QAAQoF,WAC/C5H,EAAS6H,cAAe,EAE3B,CAED,OAAO7uC,KAAK2lC,aAAa,cAAeqB,EAAU3pC,EAAS6wC,EAC5D,CAUD,YAAA7B,CAAarF,EAAUpsC,GACrB,OAAOyxC,GAAarF,EAAUhnC,KAAMpF,EACrC,EAcH,MAAMiwD,GAAc,KAOpB,MAAMC,GAIJ,WAAAhrD,CAAYmlC,GACVjlC,KAAKilC,KAAOA,EACZjlC,KAAK+qD,UAAW,EAChB/qD,KAAKg0C,QAAS,EACdh0C,KAAKmqD,WAAY,EACjBnqD,KAAKgrD,WAAY,EAMjBhrD,KAAKirD,eAAY9vD,EAGjB6E,KAAKkrD,eAAgB,EAGrBlrD,KAAKmrD,cAAe,EAGpBnrD,KAAKorD,qBAAsB,EAG3BprD,KAAKqrD,mBAAoB,EAMzBrrD,KAAKsrD,kBAAenwD,EAMpB6E,KAAKurD,qBAAkBpwD,EAMvB6E,KAAKwrD,qBAAkBrwD,EAMvB6E,KAAKyrD,qBAAkBtwD,EAMvB6E,KAAK0rD,kBAAevwD,EACpB6E,KAAK2rD,aAAe3rD,KAAK2rD,aAAaryC,KAAKtZ,MAE3CilC,EAAK1gC,GAAG,eAAgBvE,KAAK2rD,aAC9B,CAED,IAAAh0C,GACE3X,KAAK2rD,eAEL3rD,KAAKomD,QACN,CAED,KAAArlB,GACE,GAAI/gC,KAAK+qD,UAAY/qD,KAAKmqD,WAAanqD,KAAKgrD,UAI1C,OAGF,MAAM7jB,EAAQnnC,KAAKilC,KAAK4R,UACxB72C,KAAKg0C,QAAS,EACdh0C,KAAKgrD,WAAY,EACjBhrD,KAAKmqD,WAAY,EACjBnqD,KAAKirD,UAAYjrD,KAAKilC,KAAK/X,QAAQ0+B,sBAE/BzkB,GAASA,EAAMiF,cAAgBjF,EAAM1gC,OAASzG,KAAKilC,KAAK/X,QAAQ2+B,oBAClE7rD,KAAKirD,UAAY,GAGnBjrD,KAAK8rD,mBAEL39B,YAAW,KACTnuB,KAAKomD,QAAQ,GACZpmD,KAAKmrD,aAAe,GAAK,EAC7B,CAID,YAAAQ,GAGE,GAFA3rD,KAAKilC,KAAKrgC,IAAI,eAAgB5E,KAAK2rD,eAE9B3rD,KAAKgrD,UAAW,CACnB,MAAM7jB,EAAQnnC,KAAKilC,KAAK4R,UACxB72C,KAAKgrD,WAAY,EACjBhrD,KAAKmqD,WAAY,EACjBnqD,KAAKirD,UAAYjrD,KAAKilC,KAAK/X,QAAQ6+B,sBAE/B5kB,GAASA,EAAM2E,WAAWV,QAAUjE,EAAM1gC,OAASzG,KAAKilC,KAAK/X,QAAQ2+B,oBACvE7rD,KAAKirD,UAAY,GAGnBjrD,KAAK8rD,kBACN,CACF,CAID,gBAAAA,GACE,MAAM7mB,KACJA,GACEjlC,KACEmnC,EAAQnnC,KAAKilC,KAAK4R,WAClB3pB,QACJA,GACE+X,EA8BF,IAAI+mB,EA0BA/R,GAtDgC,SAAlC/sB,EAAQ++B,uBACV/+B,EAAQg/B,iBAAkB,EAC1BlsD,KAAK0rD,kBAAevwD,GACuB,SAAlC+xB,EAAQ++B,uBACjB/+B,EAAQg/B,iBAAkB,EAC1BlsD,KAAKirD,UAAY,EACjBjrD,KAAK0rD,kBAAevwD,GACX6E,KAAKgrD,WAAa/lB,EAAKknB,oBAEhCnsD,KAAK0rD,aAAezmB,EAAKknB,oBAEzBnsD,KAAK0rD,aAAe1rD,KAAKilC,KAAKmnB,iBAGhCpsD,KAAKsrD,aAAenkB,aAAqC,EAASA,EAAM8N,wBACxEhQ,EAAKuQ,WAAW2B,UAEhBn3C,KAAKkrD,cAAgB/uB,QAAQn8B,KAAKirD,WAAajrD,KAAKirD,UAAY,IAChEjrD,KAAKqsD,aAAelwB,QAAQn8B,KAAK0rD,gBAAkBvkB,aAAqC,EAASA,EAAMztC,QAAQquC,qBAAuB/nC,KAAKmqD,YAAcllB,EAAKyP,WAAWC,aAEpK30C,KAAKqsD,cAURrsD,KAAKorD,oBAA4E,QAArDY,EAAwB9+B,EAAQg/B,uBAAuD,IAA1BF,GAAmCA,GAT5HhsD,KAAKorD,qBAAsB,EAEvBprD,KAAKgrD,WAAa7jB,IACpBA,EAAMqN,sBACNrN,EAAMsN,wBAWV,GAHAz0C,KAAKqrD,mBAAqBrrD,KAAKorD,qBAAuBprD,KAAKilC,KAAK/X,QAAQwqB,UAAYmT,GACpF7qD,KAAKurD,gBAAkBvrD,KAAKorD,oBAAsBnmB,EAAK5nC,QAAU4nC,EAAKqnB,IAEjEtsD,KAAKkrD,cAcR,OAbAlrD,KAAKirD,UAAY,EACjBjrD,KAAKqsD,cAAe,EACpBrsD,KAAKqrD,mBAAoB,EACzBrrD,KAAKorD,qBAAsB,OAEvBprD,KAAKgrD,YACH/lB,EAAK5nC,UACP4nC,EAAK5nC,QAAQM,MAAM4uD,QAAU1yD,OAAOgxD,KAGtC5lB,EAAK2S,eAAe,KAMpB53C,KAAKqsD,cAAgBrsD,KAAK0rD,cAAgB1rD,KAAK0rD,aAAac,WAI9DxsD,KAAKmrD,cAAe,EACpBnrD,KAAKwrD,gBAAkBxrD,KAAKilC,KAAK5mC,UACjC2B,KAAKyrD,gBAAmE,QAAhDxR,EAAuBj6C,KAAKilC,KAAK4R,iBAAgD,IAAzBoD,OAAkC,EAASA,EAAqB5P,cAE5IpF,EAAK5mC,YACP4mC,EAAK5mC,UAAUV,MAAM8uD,SAAW,SAChCxnB,EAAK5mC,UAAUV,MAAM8I,MAAQw+B,EAAKwF,aAAahhB,EAAI,OAGrDzpB,KAAKmrD,cAAe,EAGlBnrD,KAAKgrD,WAEHhrD,KAAKorD,qBACHnmB,EAAK5nC,UACP4nC,EAAK5nC,QAAQM,MAAM4uD,QAAU1yD,OAAOgxD,KAGtC5lB,EAAK2S,eAAe,KAEhB53C,KAAKqrD,mBAAqBpmB,EAAKqnB,KACjCrnB,EAAKqnB,GAAG3uD,MAAM4uD,QAAU1yD,OAAOgxD,KAG7B5lB,EAAK5nC,UACP4nC,EAAK5nC,QAAQM,MAAM4uD,QAAU,MAI7BvsD,KAAKqsD,eACPrsD,KAAK0sD,yBAED1sD,KAAKsrD,eAEPtrD,KAAKsrD,aAAa3tD,MAAMgvD,WAAa,YAGrC3sD,KAAKsrD,aAAa3tD,MAAM4uD,QAAU1yD,OAAOgxD,OAGpC7qD,KAAKmqD,YAGVllB,EAAKyP,WAAWmM,YAAY,KAC9B5b,EAAKyP,WAAWmM,YAAY,GAAG7c,GAAGrmC,MAAM0jD,QAAU,QAGhDpc,EAAKyP,WAAWmM,YAAY,KAC9B5b,EAAKyP,WAAWmM,YAAY,GAAG7c,GAAGrmC,MAAM0jD,QAAU,QAGhDrhD,KAAKmrD,cACmB,IAAtBlmB,EAAKyP,WAAWjrB,IAElBwb,EAAKyP,WAAWyM,gBAChBlc,EAAKyP,WAAWE,UAIvB,CAID,MAAAwR,GACMpmD,KAAKgrD,WAAahrD,KAAKkrD,eAAiBlrD,KAAKsrD,cAA8C,QAA9BtrD,KAAKsrD,aAAal5C,QAOjF,IAAImxB,SAAQC,IACV,IAAIopB,GAAU,EACVC,GAAa,EAzvLzB,IAAqB/qC,KA4vLb9hB,KAAKsrD,aA3vLP,WAAYxpC,EACPA,EAAIzF,SAAS4tB,OAAM,SAGxBnoB,EAAI+mB,SACCtF,QAAQC,QAAQ1hB,GAGlB,IAAIyhB,SAAQ,CAACC,EAASC,KAC3B3hB,EAAI5K,OAAS,IAAMssB,EAAQ1hB,GAE3BA,EAAI9K,QAAUysB,CAAM,KAgvLGyG,SAAQ,KACzB0iB,GAAU,EAELC,GACHrpB,GAAQ,EACT,IAEHrV,YAAW,KACT0+B,GAAa,EAETD,GACFppB,GAAQ,EACT,GACA,IACHrV,WAAWqV,EAAS,IAAI,IACvB0G,SAAQ,IAAMlqC,KAAK8sD,cAEtB9sD,KAAK8sD,WAER,CAID,SAAAA,GACE,IAAIC,EAAoBC,EAEqB,QAA5CD,EAAqB/sD,KAAKilC,KAAK5nC,eAA4C,IAAvB0vD,GAAiCA,EAAmBpvD,MAAMsvD,YAAY,6BAA8BjtD,KAAKirD,UAAY,MAC1KjrD,KAAKilC,KAAKe,SAAShmC,KAAKgrD,UAAY,wBAA0B,yBAE9DhrD,KAAKilC,KAAKe,SAEV,eAAiBhmC,KAAKgrD,UAAY,KAAO,QACK,QAA7CgC,EAAsBhtD,KAAKilC,KAAK5nC,eAA6C,IAAxB2vD,GAAkCA,EAAoB7mD,UAAUo2C,OAAO,mBAAoBv8C,KAAKgrD,WAElJhrD,KAAKgrD,WACHhrD,KAAKsrD,eAEPtrD,KAAKsrD,aAAa3tD,MAAM4uD,QAAU,KAGpCvsD,KAAKktD,uBACIltD,KAAKmqD,WACdnqD,KAAKmtD,wBAGFntD,KAAKkrD,eACRlrD,KAAKotD,sBAER,CAID,oBAAAA,GACE,MAAMnoB,KACJA,GACEjlC,KAWJ,GAVAA,KAAKg0C,OAASh0C,KAAKgrD,UACnBhrD,KAAK+qD,SAAW/qD,KAAKmqD,UACrBnqD,KAAKgrD,WAAY,EACjBhrD,KAAKmqD,WAAY,EACjBllB,EAAKe,SAAShmC,KAAKg0C,OAAS,sBAAwB,uBAEpD/O,EAAKe,SAEL,eAAiBhmC,KAAKg0C,OAAS,QAAU,WAErCh0C,KAAK+qD,SACP9lB,EAAK4B,eACA,GAAI7mC,KAAKg0C,OAAQ,CACtB,IAAIiV,EAEAjpD,KAAKqsD,cAAgBpnB,EAAK5mC,YAC5B4mC,EAAK5mC,UAAUV,MAAM8uD,SAAW,UAChCxnB,EAAK5mC,UAAUV,MAAM8I,MAAQ,QAGQ,QAAtCwiD,EAAkBhkB,EAAK4R,iBAA2C,IAApBoS,GAA8BA,EAAgBxU,qBAC9F,CACF,CAID,mBAAAyY,GACE,MAAMjoB,KACJA,GACEjlC,KAEAA,KAAKqsD,eACHrsD,KAAKmrD,cAAgBnrD,KAAKwrD,iBAAmBxrD,KAAKyrD,kBACpDzrD,KAAKqtD,WAAWrtD,KAAKwrD,gBAAiB,YAAa,sBAEnDxrD,KAAKqtD,WAAWrtD,KAAKyrD,gBAAiB,YAAa,SAGjDxmB,EAAK4R,YACP5R,EAAK4R,UAAUrC,sBAEfx0C,KAAKqtD,WAAWpoB,EAAK4R,UAAUx4C,UAAW,YAAa4mC,EAAK4R,UAAUZ,yBAItEj2C,KAAKqrD,mBAAqBpmB,EAAKqnB,IACjCtsD,KAAKqtD,WAAWpoB,EAAKqnB,GAAI,UAAWzyD,OAAOorC,EAAK/X,QAAQwqB,YAGtD13C,KAAKorD,qBAAuBnmB,EAAK5nC,SACnC2C,KAAKqtD,WAAWpoB,EAAK5nC,QAAS,UAAW,IAE5C,CAID,qBAAA8vD,GACE,MAAMloB,KACJA,GACEjlC,KAEAA,KAAKqsD,cACPrsD,KAAK0sD,wBAAuB,GAI1B1sD,KAAKqrD,mBAAqBpmB,EAAKyS,UAAY,KAAQzS,EAAKqnB,IAC1DtsD,KAAKqtD,WAAWpoB,EAAKqnB,GAAI,UAAW,KAGlCtsD,KAAKorD,qBAAuBnmB,EAAK5nC,SACnC2C,KAAKqtD,WAAWpoB,EAAK5nC,QAAS,UAAW,IAE5C,CAOD,sBAAAqvD,CAAuBnL,GACrB,IAAKvhD,KAAK0rD,aAAc,OACxB,MAAMzmB,KACJA,GACEjlC,MACEwsD,UACJA,GACExsD,KAAK0rD,cACH7U,UACJA,EAASpM,aACTA,GACExF,EAEJ,GAAIjlC,KAAKmrD,cAAgBqB,GAAaxsD,KAAKwrD,iBAAmBxrD,KAAKyrD,gBAAiB,CAClF,MAAM6B,GAAoB7iB,EAAahhB,GAAKzpB,KAAK0rD,aAAajiC,EAAI+iC,EAAU/iC,GAAK+iC,EAAUtoB,EACrFqpB,GAAoB9iB,EAAa9Z,GAAK3wB,KAAK0rD,aAAa/6B,EAAI67B,EAAU77B,GAAK67B,EAAUz0C,EACrFy1C,EAAmB/iB,EAAahhB,EAAI+iC,EAAUtoB,EAC9CupB,EAAmBhjB,EAAa9Z,EAAI67B,EAAUz0C,EAEhDwpC,GACFvhD,KAAKqtD,WAAWrtD,KAAKwrD,gBAAiB,YAAa5kB,GAAkB0mB,EAAkBC,IAEvFvtD,KAAKqtD,WAAWrtD,KAAKyrD,gBAAiB,YAAa7kB,GAAkB4mB,EAAkBC,MAEvFvb,GAAalyC,KAAKwrD,gBAAiB8B,EAAkBC,GACrDrb,GAAalyC,KAAKyrD,gBAAiB+B,EAAkBC,GAExD,CAEG5W,IACFlF,GAAekF,EAAU/C,IAAK0Y,GAAaxsD,KAAK0rD,cAChD7U,EAAUzK,cAAgBpsC,KAAK0rD,aAAaxnB,EAAI2S,EAAUpwC,MAEtD86C,EACFvhD,KAAKqtD,WAAWxW,EAAUx4C,UAAW,YAAaw4C,EAAUZ,uBAE5DY,EAAUpC,sBAGf,CASD,UAAA4Y,CAAW7qD,EAAQgoC,EAAM7D,GACvB,IAAK3mC,KAAKirD,UAER,YADAzoD,EAAO7E,MAAM6sC,GAAQ7D,GAIvB,MAAM6O,WACJA,GACEx1C,KAAKilC,KAGHyoB,EAAY,CAChBrb,SAAUryC,KAAKirD,UACf9U,OAAQn2C,KAAKilC,KAAK/X,QAAQipB,OAC1BD,WAAY,KACLV,EAAW2Q,iBAAiBvsD,QAC/BoG,KAAKotD,sBACN,EAEH5qD,UAEFkrD,EAAUljB,GAAQ7D,EAClB6O,EAAWO,gBAAgB2X,EAC5B,EAkOH,MAAMC,GAAiB,CACrBhU,gBAAgB,EAChBqH,QAAS,GACTmH,MAAM,EACNpN,cAAc,EACdxD,qBAAqB,EACrBqU,sBAAuB,IACvBG,sBAAuB,IACvB1V,sBAAuB,IACvB6N,QAAQ,EACRC,WAAW,EACXV,WAAW,EACXK,aAAa,EACb+H,kBAAmB,IACnBvP,yBAAyB,EACzB+N,iBAAkB,gBAClBuD,cAAe,QACfC,UAAW,kBACXrO,gBAAiB,OACjB+J,kBAAmB,MACnBJ,eAAgB,IAChBzR,UAAW,GACX98C,MAAO,EACPmvC,SAAU,6BACV4G,QAAS,CAAC,EAAG,GACbwF,OAAQ,4BAMV,MAAM2X,WAAmB/e,GAIvB,WAAAjvC,CAAYotB,GACV8hB,QACAhvC,KAAKktB,QAAUltB,KAAK+tD,gBAAgB7gC,GAAW,CAAE,GAOjDltB,KAAKoI,OAAS,CACZqhB,EAAG,EACHkH,EAAG,GAOL3wB,KAAKguD,kBAAoB,CACvBvkC,EAAG,EACHkH,EAAG,GAQL3wB,KAAKyqC,aAAe,CAClBhhB,EAAG,EACHkH,EAAG,GAML3wB,KAAK03C,UAAY,EACjB13C,KAAK4zC,UAAY,EACjB5zC,KAAK0hD,eAAiB,EACtB1hD,KAAKg0C,QAAS,EACdh0C,KAAKiuD,cAAe,EACpBjuD,KAAKkuD,UAAW,EAMhBluD,KAAKmuD,iBAAmB,GAGxBnuD,KAAKmsD,yBAAsBhxD,EAG3B6E,KAAKgoD,YAAS7sD,EAGd6E,KAAK3C,aAAUlC,EAGf6E,KAAKzG,cAAW4B,EAGhB6E,KAAK3B,eAAYlD,EAGjB6E,KAAK29C,gBAAaxiD,EAGlB6E,KAAK62C,eAAY17C,EACjB6E,KAAKyd,OAAS,IAAIg1B,GAClBzyC,KAAKw1C,WAAa,IAAI0Q,GACtBlmD,KAAK00C,WAAa,IAAI8L,GAAWxgD,MACjCA,KAAKi3C,SAAW,IAAIuF,GAASx8C,MAC7BA,KAAK+zC,OAAS,IAAI+W,GAAO9qD,MACzBA,KAAKouD,SAAW,IAAI7K,GAASvjD,MAC7BA,KAAKyxC,cAAgB,IAAI6Y,GAActqD,KACxC,CAID,IAAAqvC,GACE,GAAIrvC,KAAKg0C,QAAUh0C,KAAKiuD,aACtB,OAAO,EAGTjuD,KAAKg0C,QAAS,EACdh0C,KAAKgmC,SAAS,QAEdhmC,KAAKgmC,SAAS,cAEdhmC,KAAKquD,uBAGL,IAAIC,EAAc,aAuElB,OArEItuD,KAAKi3C,SAASgG,gBAChBqR,GAAe,gBAGbtuD,KAAKktB,QAAQqhC,YACfD,GAAe,IAAMtuD,KAAKktB,QAAQqhC,WAGhCvuD,KAAK3C,UACP2C,KAAK3C,QAAQ4I,WAAa,IAAMqoD,GAGlCtuD,KAAK4zC,UAAY5zC,KAAKktB,QAAQtyB,OAAS,EACvCoF,KAAK0hD,eAAiB1hD,KAAK4zC,UAC3B5zC,KAAKgmC,SAAS,eAGdhmC,KAAKwuD,YAAc,IAAI9H,GAAY1mD,OAE/BzE,OAAOkzD,MAAMzuD,KAAK4zC,YAAc5zC,KAAK4zC,UAAY,GAAK5zC,KAAK4zC,WAAa5zC,KAAKktC,iBAC/EltC,KAAK4zC,UAAY,GAGd5zC,KAAKi3C,SAASgG,eAEjBj9C,KAAKy+C,gBAIPz+C,KAAK0uD,aACL1uD,KAAKoI,OAAOuoB,EAAIlzB,OAAOkxD,YACvB3uD,KAAKmuD,iBAAmBnuD,KAAK0tC,YAAY1tC,KAAK4zC,WAC9C5zC,KAAKgmC,SAAS,cAAe,CAC3BprC,MAAOoF,KAAK4zC,UACZt0C,KAAMU,KAAKmuD,iBACXhnB,WAAOhsC,IAGT6E,KAAKmsD,oBAAsBnsD,KAAKosD,iBAChCpsD,KAAKgmC,SAAS,iBACdhmC,KAAKuE,GAAG,uBAAuB,KAC7B,MAAMs8C,YACJA,GACE7gD,KAAK00C,WAELmM,EAAY,KACdA,EAAY,GAAG7c,GAAGrmC,MAAM0jD,QAAU,QAClCrhD,KAAKyiD,WAAW5B,EAAY,GAAI7gD,KAAK4zC,UAAY,IAG/CiN,EAAY,KACdA,EAAY,GAAG7c,GAAGrmC,MAAM0jD,QAAU,QAClCrhD,KAAKyiD,WAAW5B,EAAY,GAAI7gD,KAAK4zC,UAAY,IAGnD5zC,KAAKu0C,cACLv0C,KAAKyxC,cAAckR,aACnB3iD,KAAKyd,OAAOrX,IAAI3I,OAAQ,SAAUuC,KAAK4uD,kBAAkBt1C,KAAKtZ,OAC9DA,KAAKyd,OAAOrX,IAAI3I,OAAQ,SAAUuC,KAAK6uD,wBAAwBv1C,KAAKtZ,OACpEA,KAAKgmC,SAAS,aAAa,IAGzBhmC,KAAK00C,WAAWmM,YAAY,IAC9B7gD,KAAKyiD,WAAWziD,KAAK00C,WAAWmM,YAAY,GAAI7gD,KAAK4zC,WAGvD5zC,KAAKgmC,SAAS,UACdhmC,KAAK+zC,OAAOp8B,OACZ3X,KAAKgmC,SAAS,cACP,CACR,CAUD,cAAA6b,CAAejnD,GACb,MAAM+mD,EAAY3hD,KAAKktC,cAYvB,OAVIltC,KAAKktB,QAAQi7B,OACXvtD,EAAQ+mD,EAAY,IACtB/mD,GAAS+mD,GAGP/mD,EAAQ,IACVA,GAAS+mD,IAIN1P,GAAMr3C,EAAO,EAAG+mD,EAAY,EACpC,CAED,WAAApN,GACEv0C,KAAK00C,WAAWmM,YAAYnmD,SAAQwmD,IAClC,IAAI4N,EAEuC,QAA1CA,EAAoB5N,EAAW/Z,aAAyC,IAAtB2nB,GAAgCA,EAAkBva,aAAa,GAErH,CAOD,IAAAxD,CAAKn2C,GACHoF,KAAK00C,WAAWyD,YAAYn4C,KAAK6hD,eAAejnD,GAASoF,KAAK0hD,eAC/D,CAMD,IAAA/9C,GACE3D,KAAK+wC,KAAK/wC,KAAK0hD,eAAiB,EACjC,CAMD,IAAAj+C,GACEzD,KAAK+wC,KAAK/wC,KAAK0hD,eAAiB,EACjC,CAQD,MAAAvM,IAAU72B,GACR,IAAIywC,EAEmC,QAAtCA,EAAkB/uD,KAAK62C,iBAA2C,IAApBkY,GAA8BA,EAAgB5Z,UAAU72B,EACxG,CAMD,UAAA83B,GACE,IAAI4Y,EAEoC,QAAvCA,EAAmBhvD,KAAK62C,iBAA4C,IAArBmY,GAA+BA,EAAiB5Y,YACjG,CAOD,KAAArV,GACO/gC,KAAK+zC,OAAOC,SAAUh0C,KAAKiuD,eAIhCjuD,KAAKiuD,cAAe,EACpBjuD,KAAKgmC,SAAS,SACdhmC,KAAKyd,OAAOo1B,YACZ7yC,KAAK+zC,OAAOhT,QACb,CAUD,OAAA8F,GACE,IAAIC,EAEJ,IAAK9mC,KAAKiuD,aAGR,OAFAjuD,KAAKktB,QAAQ++B,sBAAwB,YACrCjsD,KAAK+gC,QAIP/gC,KAAKgmC,SAAS,WACdhmC,KAAK+kC,WAAa,GAEd/kC,KAAK29C,aACP39C,KAAK29C,WAAWG,YAAc,KAC9B99C,KAAK29C,WAAWI,WAAa,MAGI,QAAlCjX,EAAgB9mC,KAAK3C,eAAuC,IAAlBypC,GAA4BA,EAAcxgC,SACrFtG,KAAK00C,WAAWmM,YAAYnmD,SAAQwmD,IAClC,IAAI+N,EAEwC,QAA3CA,EAAqB/N,EAAW/Z,aAA0C,IAAvB8nB,GAAiCA,EAAmBpoB,SAAS,IAEnH7mC,KAAKyxC,cAAc5K,UACnB7mC,KAAKyd,OAAOo1B,WACb,CAQD,mBAAAqc,CAAoBC,GAClBnvD,KAAKyxC,cAAckZ,cAAcwE,GACjCnvD,KAAK00C,WAAWmM,YAAYnmD,SAAQ,CAACwmD,EAAYvnD,KAC/C,IAAIy1D,EAAuBC,EAE3B,IAAIC,GAAoK,QAA3IF,EAAgE,QAAvCC,EAAmBrvD,KAAK62C,iBAA4C,IAArBwY,OAA8B,EAASA,EAAiBz0D,aAA6C,IAA1Bw0D,EAAmCA,EAAwB,GAAK,EAAIz1D,EAWhP,IAAI41D,GATJvvD,KAAK4hD,YACP0N,EAAuBtvD,KAAK6hD,eAAeyN,IAGzCA,IAAyBH,KAE3BnvD,KAAKyiD,WAAWvB,EAAYiO,GAAY,GAE9B,IAANx1D,IAGFqG,KAAK62C,UAAYqK,EAAW/Z,MACgB,QAA3CooB,EAAqBrO,EAAW/Z,aAA0C,IAAvBooB,GAAiCA,EAAmBlb,aAAY,IAEvH,IAEHr0C,KAAKgmC,SAAS,SACf,CAUD,UAAAyc,CAAW+M,EAAQ50D,EAAOk6C,GAKxB,GAJI90C,KAAK4hD,YACPhnD,EAAQoF,KAAK6hD,eAAejnD,IAG1B40D,EAAOroB,MAAO,CAChB,GAAIqoB,EAAOroB,MAAMvsC,QAAUA,IAAUk6C,EAGnC,OAIF0a,EAAOroB,MAAMN,UACb2oB,EAAOroB,WAAQhsC,CAChB,CAGD,IAAK6E,KAAK4hD,YAAchnD,EAAQ,GAAKA,GAASoF,KAAKktC,eACjD,OAGF,MAAMlG,EAAWhnC,KAAK0tC,YAAY9yC,GAClC40D,EAAOroB,MAAQ,IAAIwM,GAAM3M,EAAUpsC,EAAOoF,MAEtCpF,IAAUoF,KAAK4zC,YACjB5zC,KAAK62C,UAAY2Y,EAAOroB,OAG1BqoB,EAAOroB,MAAMx/B,OAAO6nD,EAAOxrB,GAC5B,CAID,sBAAAuS,GACE,MAAO,CACL9sB,EAAGzpB,KAAKyqC,aAAahhB,EAAI,EACzBkH,EAAG3wB,KAAKyqC,aAAa9Z,EAAI,EAE5B,CASD,UAAA+9B,CAAW5Z,GAGT,GAAI90C,KAAKiuD,aAGP,OAKF,MAAMvhB,EAAkBI,GAAgB9sC,KAAKktB,QAASltB,OAEjD80C,GAAS9C,GAAYtF,EAAiB1sC,KAAKguD,qBAOhDrc,GAAe3xC,KAAKguD,kBAAmBthB,GACvC1sC,KAAKgmC,SAAS,gBACd2L,GAAe3xC,KAAKyqC,aAAczqC,KAAKguD,mBAEvChuD,KAAK6uD,0BAEL7uD,KAAKgmC,SAAS,gBAGdhmC,KAAK00C,WAAWE,OAAO50C,KAAK+zC,OAAOC,SAE9Bh0C,KAAKkuD,UAAYzwD,OAAOgyD,WAAW,sBAAsB1sD,SAC5D/C,KAAKy+C,gBAGPz+C,KAAKgmC,SAAS,UACf,CAMD,cAAA4R,CAAe2U,GACbvsD,KAAK03C,UAAY17C,KAAK4wB,IAAI2/B,EAAS,GAE/BvsD,KAAKssD,KACPtsD,KAAKssD,GAAG3uD,MAAM4uD,QAAU1yD,OAAOmG,KAAK03C,UAAY13C,KAAKktB,QAAQwqB,WAEhE,CAMD,aAAA+G,GAEI,IAAIiR,EADD1vD,KAAKkuD,WAGRluD,KAAKkuD,UAAW,EACoB,QAAnCwB,EAAiB1vD,KAAK3C,eAAwC,IAAnBqyD,GAA6BA,EAAevpD,UAAUC,IAAI,mBAEzG,CAQD,iBAAAwoD,GACE5uD,KAAK0uD,aAMD,oBAAoBtwD,KAAKX,OAAOR,UAAUF,YAC5CoxB,YAAW,KACTnuB,KAAK0uD,YAAY,GAChB,IAEN,CAUD,uBAAAG,GACE7uD,KAAK2vD,gBAAgB,EAAGlyD,OAAOkxD,YAChC,CAOD,eAAAgB,CAAgBlmC,EAAGkH,GACjB3wB,KAAKoI,OAAOqhB,EAAIA,EAChBzpB,KAAKoI,OAAOuoB,EAAIA,EAChB3wB,KAAKgmC,SAAS,qBACf,CASD,oBAAAqoB,GAEEruD,KAAK3C,QAAUiB,GAAc,OAAQ,OACrC0B,KAAK3C,QAAQwI,aAAa,WAAY,MACtC7F,KAAK3C,QAAQwI,aAAa,OAAQ,UAElC7F,KAAKzG,SAAWyG,KAAK3C,QAGrB2C,KAAKssD,GAAKhuD,GAAc,WAAY,MAAO0B,KAAK3C,SAChD2C,KAAK29C,WAAar/C,GAAc,oBAAqB,UAAW0B,KAAK3C,SACrE2C,KAAK3B,UAAYC,GAAc,kBAAmB,MAAO0B,KAAK29C,YAE9D39C,KAAK29C,WAAW93C,aAAa,uBAAwB,YACrD7F,KAAK3B,UAAUwH,aAAa,YAAa,OACzC7F,KAAK3B,UAAUwH,aAAa,KAAM,eAClC7F,KAAK00C,WAAW0M,gBAChBphD,KAAKopD,GAAK,IAAIM,GAAG1pD,MACjBA,KAAKopD,GAAG/Z,QAEPrvC,KAAKktB,QAAQ6W,YAAc7lC,SAASomB,MAAM5c,YAAY1H,KAAK3C,QAC7D,CAWD,cAAA+uD,GACE,OA9oFJ,SAAwBxxD,EAAOosC,EAAUC,GAEvC,MAAM/hC,EAAQ+hC,EAASjB,SAAS,cAAe,CAC7CprC,QACAosC,WACAC,aAGF,GAAI/hC,EAAM0qD,YAER,OAAO1qD,EAAM0qD,YAGf,MAAMvyD,QACJA,GACE2pC,EAGJ,IAAI4oB,EAGAC,EAEJ,GAAIxyD,IAA8C,IAAnC4pC,EAAS/Z,QAAQ4iC,cAAyB,CACvD,MAAMA,EAAgB7oB,EAAS/Z,QAAQ4iC,eAAiB,MACxDD,EAAYxyD,EAAQ0F,QAAQ+sD,GAAiBzyD,EAE7CA,EAAQ4lB,cAAc6sC,EACvB,CAYD,OAVAD,EAAY5oB,EAAStB,aAAa,UAAWkqB,EAAW7oB,EAAUpsC,GAE9Di1D,IAIAD,EAHG5oB,EAAS6H,aA5ElB,SAAmC7K,EAAI+rB,EAAYC,GACjD,MAAMC,EAAgBjsB,EAAGxa,wBAGnBiiB,EAASwkB,EAAcxpD,MAAQspD,EAC/BrkB,EAASukB,EAAcnpD,OAASkpD,EAChCE,EAAgBzkB,EAASC,EAASD,EAASC,EAC3CykB,GAAWF,EAAcxpD,MAAQspD,EAAaG,GAAiB,EAC/DE,GAAWH,EAAcnpD,OAASkpD,EAAcE,GAAiB,EASjEhc,EAAS,CACbzqB,EAAGwmC,EAAc7iD,KAAO+iD,EACxBx/B,EAAGs/B,EAAcI,IAAMD,EACvBlsB,EAAG6rB,EAAaG,GAUlB,OANAhc,EAAOsY,UAAY,CACjBtoB,EAAG+rB,EAAcxpD,MACjBsR,EAAGk4C,EAAcnpD,OACjB2iB,EAAG0mC,EACHx/B,EAAGy/B,GAEElc,CACT,CAgDoBoc,CAA0BT,EAAW7oB,EAASvgC,OAASugC,EAAS9C,GAAK,EAAG8C,EAASlgC,QAAUkgC,EAASjvB,GAAK,GA/F7H,SAA4BisB,GAC1B,MAAMisB,EAAgBjsB,EAAGxa,wBACzB,MAAO,CACLC,EAAGwmC,EAAc7iD,KACjBujB,EAAGs/B,EAAcI,IACjBnsB,EAAG+rB,EAAcxpD,MAErB,CAsFoB8pD,CAAmBV,IAM9B5oB,EAAStB,aAAa,cAAeiqB,EAAa5oB,EAAUpsC,EACrE,CAqmFWwxD,CAAepsD,KAAK4zC,UAAW5zC,KAAK62C,UAAY72C,KAAK62C,UAAUv3C,KAAOU,KAAKmuD,iBAAkBnuD,KACrG,CAOD,OAAA4hD,GACE,OAAO5hD,KAAKktB,QAAQi7B,MAAQnoD,KAAKktC,cAAgB,CAClD,CAQD,eAAA6gB,CAAgB7gC,GAQd,OAPIzvB,OAAOgyD,WAAW,4CAA4C1sD,UAChEmqB,EAAQ++B,sBAAwB,OAChC/+B,EAAQmpB,sBAAwB,GAK3B,IAAKsX,MACPzgC,EAEN,EC34NH,SAASsjC,GAAkBC,EAAoBvrC,GAC7C,MAAM2U,EAAS3U,EAAIjF,YACnB,IAAK4Z,EACH,OAEF,MAAMxwB,EAAe6b,EAAIzF,eAEnBixC,EADcD,EAAY9uD,QAAQ,iBACXW,KAAK,sBAC5BquD,EAASF,EAAYnvD,KAAK,SAASlG,QAAQ,WAAa,EACxDw1D,EAAevnD,EAAa5C,QAE5BoqD,EADgBxnD,EAAavC,SACN8pD,EAC7B,IAAI9gB,EAAU,EACVrpC,EAAQ,EAEZ,MAAMqqD,EAAuB5rD,IAC3B,MACM6rD,EADe7rD,EACM4qC,QAAUA,EAC/BkhB,EAAWh1D,KAAKC,MAAM00D,EAASlqD,EAAQsqD,EAAQtqD,EAAQsqD,GACvDE,EAAYj1D,KAAKC,MAAM40D,EAAOG,GACpC3nD,EAAa7C,IAAI,CACfC,MAAO,GAAGuqD,MACVlqD,OAAQ,GAAGmqD,QAEbP,EAAStuD,KAAK,GAAG4uD,OAAcC,IAAY,EA+B7CR,EAAYlsD,GAAG,eA5BcW,IAC3B,MAAMy6C,EAAez6C,EACKurD,EAAYr2D,IAAI,GAGxB82D,kBAAkBvR,EAAaG,WACjDhQ,EAAU6P,EAAa7P,QACvBrpC,EAAQ4C,EAAa5C,QACrBiqD,EAAS1pD,OACTypD,EAAYlsD,GAAG,cAAeusD,EAAoB,IAoBpDL,EAAYlsD,GAAG,aAjBU,KACvBksD,EAAY7rD,IAAI,eAChB8rD,EAASxpD,OACTT,EAAQye,EAAIzF,eAAehZ,QAC3B,MAAMK,EAAS9K,KAAKC,MAAM40D,EAAOpqD,GACjCye,EAAItF,YAAY,CACdnZ,QACAK,WAEF+yB,EAAOvB,QAAQzD,MAAM,IASvB47B,EAAYlsD,GAAG,iBANc,KAC3BksD,EAAY7rD,IAAI,eAChB8rD,EAASxpD,MAAM,GAKnB,CAGA,SAAeiqD,GAAa35C,6CAC1B,MAAMzX,EAAOuI,EAAM,WAQnB,OAPAvI,EAAKyG,IAAI,CACP4qD,SAAU,WACVf,IAAK,IACLjjD,KAAM,UACN,UAAW,KACXikD,WAAY,WAEP,IAAI9tB,SAAQC,IACjBzjC,EAAKwE,GAAG,QAAQ,KACd,MAAM+sD,EAAgBvxD,EAAK3F,IAAI,GACzBqM,EAAQ6qD,EAAc7qD,MACtBK,EAASwqD,EAAcxqD,OAC7B/G,EAAKuG,SACLvG,EAAK+F,WAAW,SAChB09B,EAAQ,CACNzjC,OACA0G,QACAK,UACA,IAEJ/G,EAAKwE,GAAG,SAAS,KACfxE,EAAKuG,SACLk9B,EAAQ,CACNzjC,QACA,IAEJA,EAAKuB,KAAK,MAAOkW,GACjBlP,EAAMpK,SAASomB,MAAM3c,OAAO5H,EAAK,MAEpC,CA2GD,SAAewxD,GAAYC,EAAkBtsC,6CAC3C,MAAMjrB,EAAQirB,EAAIjrB,MAClBirB,EAAIzF,eAAejZ,IAAI,CACrBC,MAAO,GACPK,OAAQ,KAEV,MAAM2qD,EAAkBnpD,EAAMjO,CAAY;;8EAEkCijC,GAAOiD,MAAMj6B;;KAGnForD,EAAeD,EAAgBnvD,KAAK,uBACpCqvD,EAAat4D,EAAMe,IAAI,UACzBu3D,GACFD,EAAa/pD,OAAOgqD,GAEtB,MAAMC,EAAYtpD,EAAMjO,CAAY;;;qCAGDJ,EAAMoG,MAAQ;;KAG3CwxD,EAAYx4D,EAAMe,IAAI,SACxBy3D,GACFD,EAAUtvD,KAAK,oBAAoBqF,OAAOkqD,GAE5CL,EAAU7pD,OAAO8pD,GACjBD,EAAU7pD,OAAOiqD,KAClB,CAmIM,MAAME,GAAyB,CACpCttD,KAAM,SACNnE,KAAM,QACN8f,OAAQ+E,IACN,MAAM2U,EAAS3U,EAAIjF,YACnB,IAAK4Z,EACH,OAEF,MAAM5/B,EAAQirB,EAAIjrB,MACZoE,EAAY6mB,EAAIzF,eACtB,GAAIxlB,EAAMwM,OAASxM,EAAM6M,QAAsD,IAA5CzI,EAAUiE,KAAK,kBAAkB1I,OAAc,CAChFyE,EAAUmI,IAAI,CACZC,MAAO,GAAGxM,EAAMwM,UAChBK,OAAQ,GAAG7M,EAAM6M,aAEnBzI,EAAUkJ,QACV,MAAMwqD,EAAkBzpD,EAAM,0CAC9BjK,EAAUsJ,OAAOoqD,GACjB,MAAMF,EAAYx4D,EAAMe,IAAI,SACxBy3D,GACFE,EAAgBpqD,OAAOkqD,EAE1B,CASD,GARiC,IAA7BxzD,EAAUwF,QAAQjK,QAKpByE,EAAUsJ,OAAO,WAGE,YAAjB1N,EAAMkd,OACR,OAEF,MAAMq6C,EAAYlpD,EAAM,8BAExB,IAAI0pD,EADJR,EAAUtrD,SAAS,cAAcjM,EAAMkd,UAGrC66C,EADmB,cAAjB/3D,EAAMkd,OArKd,SAA+Bq6C,EAAkBtsC,6CAC/C,MAAM2U,EAAS3U,EAAIjF,YACnB,IAAK4Z,EACH,OAEF,MAAM5/B,EAAQirB,EAAIjrB,MACZg4D,QAAkBd,GAAal3D,EAAMud,KAC3C,IAAKy6C,EAAUxrD,QAAUwrD,EAAUnrD,OAEjC,kBADMyqD,GAAYC,EAAWtsC,IAG/B,MAAMqmB,EAAW1R,EAAOx7B,UAAUsI,aAAe,EAC3CF,EAAQwrD,EAAUxrD,MAAQ8kC,EAAW0mB,EAAUxrD,MAAQ8kC,EACvDzkC,EAAS9K,KAAKC,MAAMwK,EAAQwrD,EAAUnrD,OAASmrD,EAAUxrD,OAC/Dye,EAAItF,YAAY,CACdnZ,QACAK,SACAorD,cAAeD,EAAUxrD,MACzB0rD,eAAgBF,EAAUnrD,SAE5Boe,EAAIzF,eAAejZ,IAAI,CACrBC,MAAO,GAAGA,MACVK,OAAQ,GAAGA,QAEb,MAAM2qD,EAAkBnpD,EAAMjO,CAAY;;8EAEkCijC,GAAOiD,MAAMj6B;;KAGnForD,EAAeD,EAAgBnvD,KAAK,uBACpCqvD,EAAat4D,EAAMe,IAAI,UACzBu3D,GACFD,EAAa/pD,OAAOgqD,GAEtB,MACMS,EAAe9pD,EAAMjO,CAAY;;kCADvB2B,KAAKC,MAAMhC,EAAMwc,SAAW;;KAMxChQ,EAAQ,IACV2rD,EAAa9vD,KAAK,iBAAiB4E,OAErC,MAAMmrD,EAAkBh5D,EAAMe,IAAI,eAC9Bi4D,GACFD,EAAa5qD,QAAQ6qD,GAEvB,MAAMC,EAAUL,EAAUlyD,KAC1BkyD,EAAUlyD,KAAKmG,SAAS,kBACxBosD,EAAQhxD,KAAK,CACXixD,UAAW,QACXxwC,IAAK9nB,EAAMoG,OAEbmxD,EAAU7pD,OAAO8pD,GACjBD,EAAU7pD,OAAOyqD,GACjBZ,EAAU7pD,OAAO2qD,KAClB,CA8GeE,CAAgBhB,EAAWtsC,GACX,UAAjBjrB,EAAMkd,OACLo6C,GAAYC,EAAWtsC,GA7GvC,SAA0BssC,EAAkBtsC,6CAC1C,MAAM2U,EAAS3U,EAAIjF,YACnB,IAAK4Z,EACH,OAEF,MAAM5/B,EAAQirB,EAAIjrB,MACZg4D,QAAkBd,GAAal3D,EAAMud,KAC3C,IAAKy6C,EAAUxrD,QAAUwrD,EAAUnrD,OAEjC,kBADMyqD,GAAYC,EAAWtsC,IAG/B,IAAIze,EAAQxM,EAAMwM,MACdK,EAAS7M,EAAM6M,OACnB,IAAKL,IAAUK,EAAQ,CACrB,MAAMykC,EAAW1R,EAAOx7B,UAAUsI,aAAe,EACjDF,EAAQzK,KAAKC,MAAMg2D,EAAUxrD,MAAQ8kC,EAAW0mB,EAAUxrD,MAAQ8kC,GAClEzkC,EAAS9K,KAAKC,MAAMwK,EAAQwrD,EAAUnrD,OAASmrD,EAAUxrD,OACzDye,EAAItF,YAAY,CACdnZ,QACAK,UAEH,CACDoe,EAAIzF,eAAejZ,IAAI,CACrBC,MAAO,GAAGA,MACVK,OAAQ,GAAGA,QAEb,MAAM2qD,EAAkBnpD,EAAMjO,CAAY;;4EAEgCijC,GAAOiD,MAAMM;8EACXvD,GAAOiD,MAAMj6B;;KAGnFmsD,EAAahB,EAAgBnvD,KAAK,qBAClCowD,EAAer5D,EAAMe,IAAI,YAC3Bs4D,GACFD,EAAW9qD,OAAO+qD,IAEhBjsD,EAAQ,IAA6B,OAAvBqoC,KAChB2jB,EAAWvrD,OAEb,MAAMwqD,EAAeD,EAAgBnvD,KAAK,uBACpCqvD,EAAat4D,EAAMe,IAAI,UACzBu3D,GACFD,EAAa/pD,OAAOgqD,GAEtB,MAAMgB,EAAcrqD,EAAMjO,CAAY;;;;;;uCAMDoM,OAAWK;;KAG1CwrD,EAAUL,EAAUlyD,KAC1BuyD,EAAQpsD,SAAS,kBACjBosD,EAAQhxD,KAAK,CACXixD,UAAW,QACXxwC,IAAK9nB,EAAMoG,OAEbmwD,GAAkBmC,EAAYrwD,KAAK,0BAA2B4iB,GAC9DsrC,GAAkBmC,EAAYrwD,KAAK,2BAA4B4iB,GAC/DsrC,GAAkBmC,EAAYrwD,KAAK,6BAA8B4iB,GACjEsrC,GAAkBmC,EAAYrwD,KAAK,8BAA+B4iB,GAClEssC,EAAU7pD,OAAO8pD,GACjBD,EAAU7pD,OAAOgrD,GACjBnB,EAAU7pD,OAAO2qD,KAClB,CA4CeM,CAAWpB,EAAWtsC,GAElC8sC,EAAQluB,MAAK,KACXzlC,EAAUkJ,QACVlJ,EAAUsJ,OAAO6pD,GACjBA,EAAUlvD,KAAK,qBAAqBiC,GAAG,SAAS,IAtTtD,SAAwB2gB,GACtB,MAAM2U,EAAS3U,EAAIjF,YACnB,IAAK4Z,EACH,OAEF,MAAMwT,EAAyB,GAC/B,IAAIwlB,EAAe,EACnB,MAAMC,EAAcj5B,EAAOx7B,UAAUiE,KAAK,0BAC1CwwD,EAAYnwD,MAAK,CAAC5C,EAAMnF,KACtB,MAAMk3D,EAAW,IAAI1yC,GAAIrf,GACnBgzD,EAAajB,EAAS73D,MACF,SAAtB84D,EAAW57C,SAGfk2B,EAAWrvC,KAAK,CACdoC,GAAIxF,EACJ+e,IAAKo5C,EAAWC,aAAeD,EAAWv7C,IAC1C/Q,MAAOssD,EAAWb,eAAiBa,EAAWtsD,MAC9CK,OAAQisD,EAAWZ,gBAAkBY,EAAWjsD,OAChDib,IAAKgxC,EAAW1yD,OAEd6kB,EAAInlB,KAAKK,KAAO0xD,EAAS/xD,KAAKK,KAChCyyD,EAAej4D,GAChB,IAEH,MAAMq4D,EAAW,IAAInkB,GAAmB,CACtCgC,WAAYgd,GACZzgB,aACAkhB,UAAW,YACXzX,MAAM,EACNoc,aAAc75D,EAAMe,IAAI,QACxB+4D,aAAc95D,EAAMe,IAAI,SACxBg5D,SAAU/5D,EAAMe,IAAI,SACpBi5D,eAAgB/1B,GAAOiD,MAAMO,WAC7BwyB,eAAgBh2B,GAAOiD,MAAM58B,OAC7B4vD,WAAYj2B,GAAOiD,MAAMQ,QACzBgJ,SAAUzM,GAAOiD,MAAMS,iBAEzBiyB,EAAS1uD,GAAG,cAAc,KACxB,MAAM0gC,EAAYguB,EAAShuB,KAC3BA,EAAKmkB,GAAGW,gBAAgB,CACtB1pD,KAAM,kBACNioD,MAAO,EACPnB,UAAU,EACVzmB,MAAOpD,GAAOiD,MAAMU,UACpB95B,KAAM9N,EAAMe,IAAI,WAChB6tB,QAAS,KACP,MAAM4uB,EAAY5R,EAAK4R,UACjBlT,GAAQkT,EAAU/K,WAAWlf,IAAMiqB,EAAU/K,WAAWhf,KAAO,EAC/DsoB,EAAgByB,EAAUzK,cAAgBzI,EAChDkT,EAAU1B,OAAOC,OAAej6C,EAAW,IAAI,IAGnD8pC,EAAKmkB,GAAGW,gBAAgB,CACtB1pD,KAAM,iBACNioD,MAAO,EACPnB,UAAU,EACVzmB,MAAOpD,GAAOiD,MAAMW,SACpB/5B,KAAM9N,EAAMe,IAAI,UAChB6tB,QAAS,KACP,MAAM4uB,EAAY5R,EAAK4R,UACjBlT,GAAQkT,EAAU/K,WAAWlf,IAAMiqB,EAAU/K,WAAWhf,KAAO,EAC/DsoB,EAAgByB,EAAUzK,cAAgBzI,EAChDkT,EAAU1B,OAAOC,OAAej6C,EAAW,IAAI,GAEjD,IAEJ83D,EAAS/tB,UAAU,WAAW,CAAC2qB,EAAW7oB,KACxC,MAAMsrB,EAAUQ,EAAYpwD,GAAGskC,EAAS5mC,IAAIkC,KAAK,mBACjD,OAAIgwD,EAAQ14D,OAAS,EACZ04D,EAAQl4D,IAAI,GAEdy1D,CAAwB,IAEjCoD,EAAS/tB,UAAU,kBAAkB,CAAC+C,EAAgBd,KACpD,MAAMmrB,EAAUQ,EAAYpwD,GAAGykC,EAAM7nC,KAAKc,IAAIkC,KAAK,mBACnD,OAAIgwD,EAAQ14D,OAAS,EACZ04D,EAAQhxD,KAAK,OAEf2mC,CAAc,IAEvBgrB,EAAS1uD,GAAG,uBAAuB,KACjC2gB,EAAIhgB,MAAMD,KAAK,iBAAiB,IAElCguD,EAAS5jB,OACT4jB,EAAS9iB,YAAY0iB,EACvB,CAgO4DW,CAAetuC,KACrEssC,EAAUlvD,KAAK,uBAAuBiC,GAAG,SAASW,IAChDA,EAAMq7C,kBA/Nd,SAAwBr7B,GACtB,MAAM2U,EAAS3U,EAAIjF,YACnB,IAAK4Z,EACH,OAEF,MAAMjkB,EAAMsP,EAAInF,QAAQ,OACpBnK,GACFA,EAAI69C,QAEN55B,EAAO/K,UAAUtmB,MAAMoC,UAAUsa,EAAInlB,MACrC85B,EAAOJ,YACPI,EAAOvB,QAAQzD,MACjB,CAoNQ6+B,CAAexuC,EAAI,IAErBA,EAAIhgB,MAAMD,KAAK,SAAS,IAE1BusD,EAAUjtD,GAAG,SAAS,KACpBs1B,EAAO/K,UAAUtmB,MAAMoC,UAAUsa,EAAInlB,KAAK,GAC1C,EAEJoH,KAAM+d,IACJ,MAAMjrB,EAAQirB,EAAInlB,KAAKuB,KAAK,SAC5B,OAAOjH,CAAY,aAAa6qB,EAAIjrB,MAAMud,yBAAyBvd,OAAW,GC7a5E2X,GACS,OADTA,GAMK,UANLA,GAOM,UAPNA,GASM,UATNA,GAUI,UAVJA,GAWM,UAXNA,GAYE,UAZFA,GAaG,UAbHA,GAcI,UAdJA,GAeK,UAfLA,GAgBK,UAhBLA,GAiBK,UAjBLA,GAkBI,UAGV,SAAS+hD,GAAkBC,GACzB,MAAMC,eAAEA,EAAcC,KAAEA,GAASF,EACjC,OAAOC,EAAe16D,OAAO,CAC3B,CAAEsyB,IAAKqoC,EAAKC,QAAS9xC,MAAOrQ,IAC5B,CAAE6Z,IAAK,CAACqoC,EAAKzzD,KAAMyzD,EAAKE,QAASF,EAAKG,UAAWH,EAAKI,WAAYjyC,MAAOrQ,IACzE,CAAE6Z,IAAK,CAACqoC,EAAKx2D,cAAe2kB,MAAOrQ,IACnC,CAAE6Z,IAAK,CAACqoC,EAAKK,sBAAuBL,EAAK74D,OAAQ64D,EAAKM,SAAUN,EAAKO,QAAQP,EAAK74D,SAAUgnB,MAAOrQ,IACnG,CAAE6Z,IAAK,CAACqoC,EAAKQ,SAASR,EAAKS,cAAeT,EAAKU,WAAYvyC,MAAOrQ,IAClE,CAAE6Z,IAAK,CAACqoC,EAAK7xC,MAAO6xC,EAAKW,SAASX,EAAKzzD,MAAOyzD,EAAKY,SAASZ,EAAKzzD,OAAQ4hB,MAAOrQ,IAChF,CAAE6Z,IAAK,CAACqoC,EAAKa,WAAWb,EAAKzzD,MAAOyzD,EAAKc,WAAY3yC,MAAOrQ,IAC5D,CAAE6Z,IAAK,CAACqoC,EAAK7tD,WAAYgc,MAAOrQ,IAChC,CAAE6Z,IAAK,CAACqoC,EAAKe,OAAQf,EAAKgB,QAAShB,EAAKiB,WAAYjB,EAAKkB,SAAUlB,EAAKxpC,KAAMwpC,EAAKmB,WAAYhzC,MAAOrQ,IACtG,CAAE6Z,IAAK,CAACqoC,EAAKoB,UAAWjzC,MAAOrQ,IAC/B,CAAE6Z,IAAK,CAACqoC,EAAKqB,SAAUrB,EAAKsB,iBAAkBnzC,MAAOrQ,IACrD,CAAE6Z,IAAK,CAACqoC,EAAKt8C,IAAKs8C,EAAKuB,OAAQvB,EAAKwB,OAAQxB,EAAKt0B,MAAOvd,MAAOrQ,IAC/D,CAAE6Z,IAAK,CAACqoC,EAAKyB,KAAMzB,EAAK0B,SAAUvzC,MAAOrQ,IACzC,CAAE6Z,IAAKqoC,EAAK5xC,OAAQuzC,WAAY,QAChC,CAAEhqC,IAAKqoC,EAAK4B,SAAUC,UAAW,UACjC,CAAElqC,IAAKqoC,EAAKt0B,KAAMo2B,eAAgB,aAClC,CAAEnqC,IAAKqoC,EAAKp0B,QAAS+1B,WAAY,OAAQxzC,MAAOrQ,IAChD,CAAE6Z,IAAK,CAACqoC,EAAK+B,KAAM/B,EAAKgC,KAAMhC,EAAKO,QAAQP,EAAKS,eAAgBtyC,MAAOrQ,IACvE,CAAE6Z,IAAKqoC,EAAKiC,QAAS9zC,MAAOrQ,IAC5B,CAAE6Z,IAAKqoC,EAAK30B,cAAey2B,eAAgB,iBAE/C,CAEO,MAAMI,GAA6B,CACxCxxD,KAAM,QACNnE,KAAM,YACN8f,OAAQ+E,UACN,MAAM2U,EAAS3U,EAAIjF,YACnB,IAAK4Z,EACH,OAEF,MAAMo8B,EAAgB3tD,EAAM,mCACtBjK,EAAY6mB,EAAIzF,eACtBphB,EAAUkJ,QACVlJ,EAAUsJ,OAAOsuD,GACjB,MAAMC,EAAsBD,EAAc77D,IAAI,GAC9C,IAAK87D,EACH,OAGF,MAAMtC,EAAan2D,OAAOm2D,WAC1B,IAAKA,EAMH,OALAqC,EAAc/vD,SAAS,yBACvB+vD,EAAc7zD,KAAK,wIACnB6zD,EAAc1xD,GAAG,SAAS,KACxBs1B,EAAO/K,UAAUtmB,MAAMoC,UAAUsa,EAAInlB,KAAK,IAI9C,MAAMo2D,YACJA,EAAWC,YAAEA,EAAWC,WAAEA,EAAUC,OACpCA,EAAMh+B,QAAEA,EAAOi+B,cAAEA,EAAaC,cAAEA,EAAahgC,cAC7CA,EAAaigC,mBAAEA,EAAkBC,UAAEA,GACjC9C,EAEE+C,EAAgC,IAAIr9D,IAC1C,IAAK,MAAMwL,KAAQ4xD,EACjBC,EAAYplD,IAAIzM,EAAK7K,MAAO6K,GAE9B,MAAMy0B,EAAWrU,EAAIjrB,MACf28D,EAAWD,EAAYv8D,IAAIm/B,EAASs9B,MACpCC,EAAW,IAAIV,EAWfW,EAAiBV,EAAWU,eAAeC,IAAI1rB,IAV/B,IAACrxC,EAWhBqxC,EAAO2rB,aAXSh9D,EAcPqxC,EAAO7D,MAAM3kB,IAAIrnB,WAZ/BgC,OAAO0wB,YAAW,KACZ0L,EAAO9C,cAGX7R,EAAItF,YAAY,OAAQ3lB,GACxB4/B,EAAOvB,QAAQzD,OAAM,GACpB,GAMuC,IAEtCqiC,EAAa,IAAIb,EAAW,CAChCt0D,OAAQm0D,EACRpzC,YAAK3oB,EAAAo/B,EAASjX,oBAAQ,GACtB60C,WAAY,CACVhB,EAAYiB,SAASJ,GAAGn9B,EAAOvD,UAC/BgC,IACAg+B,EAAOU,GAAG,IACLT,KACAC,EACHhgC,IAEFigC,EAAmB9C,GAAkBC,IACrCkD,EAASE,GAAGJ,GAAYA,EAASv3C,UAAYu3C,EAASv3C,YAAc,IACpE03C,KAGJd,EAAc3zD,KAAK,4BAA4BhB,KAAK,WAAY,MAC/C,IAAI4mB,GAAS,CAC5BP,KAAMsuC,EACN51D,KAAM,WACN2pB,SAAU3wB,EAAMe,IAAI,QACpByvB,aAAc+sC,EAAWr9B,EAASs9B,KAAOjlD,GACzCkW,QAASwV,GAAOmC,UAAU0B,WAC1B16B,MAAO,OACP6hB,SAAU,OACVI,UAAWguC,EAAUx5D,KAAK4H,IAAe,CACvC7K,MAAO6K,EAAK7K,MACZmI,KAAM0C,EAAK1C,SAEb0nB,SAAU7vB,IACR,MAAM6K,EAAO6xD,EAAYv8D,IAAIH,GAC7Bi9D,EAAWlxB,SAAS,CAClBqxB,QAASP,EAASQ,YAAYxyD,GAAQA,EAAKua,UAAYva,EAAKua,YAAc,MAE5E6F,EAAItF,YAAY,CACdi3C,KAAM58D,IAER4/B,EAAOvB,QAAQzD,MAAM,IAGhB1U,SACT+E,EAAIlF,QAAQ,aAAck3C,GAC1BhyC,EAAIhF,WAAU,IAAM,KAClBg3C,EAAWrwB,UACXxnC,EAAM,uBAAuB,GAC7B,GC5IN,MAAMk4D,GAAgBt3D,MAAMgD,KAAKnE,GAAekc,KAAK,KAYrD,SAASw8C,GAAgBl0D,GACvB,MAAMvF,EAAW,CAAEuF,GACnB,IAAM,MAAMvD,KAAQuD,EAAMc,YACxBrG,EAASC,KAAK+B,GAEhB,IAAK,MAAMA,KAAQhC,EACC,QAAdgC,EAAKM,KACHN,EAAKuC,KAAKi1D,IAAe39D,OAAS,EACpCmG,EAAKuG,QAAO,GAEZ8H,EAAcrO,EAAM,MAEbA,EAAKiB,WAAa,CAAC,aAAc,MAAM5F,QAAQ2E,EAAKM,OAAS,IACtEN,EAAKuC,KAAKi1D,IAAejxD,QAAO,EAGtC,CAqFA,SAASmxD,GAAc59B,EAAgB3hB,GACrC,MAAM4W,EAAY+K,EAAO/K,UACnBtmB,EAAQsmB,EAAUtmB,MACxB,GAAmC,IAA/B0P,EAASzZ,WAAW7E,OACtB,OAEF,MAAM89D,EAAY,IAAI73D,EAAMqY,EAASpU,YACrC,IAAI6zD,EAAW,IAAI93D,EAAMqY,EAASlU,WACD,IAA7BwE,EAAM6D,YAAYzS,QACpBk1B,EAAUnJ,UAAU,SApExB,SAAyBkU,EAAgBnsB,GACvC,MAAMlF,EAAQqxB,EAAO/K,UAAUtmB,MACzBnF,EAAUmF,EAAME,UAAU/G,QAAQ,YACxC,GAAI0B,EAAQzJ,OAAS,EAEnB,GAAiB,WADL,IAAIwlB,GAAI/b,GACZmB,KACFgE,EAAMY,WACRZ,EAAMyB,eAAe5G,GACrBmF,EAAM0B,mBACG1B,EAAMgB,YACfhB,EAAM2B,cAAc9G,GACpBmF,EAAM0B,mBAEN2vB,EAAOJ,gBAEJ,CACL,MAAMf,EAAYpwB,EAAM,SACpBE,EAAMY,WACR/F,EAAQuE,OAAO8wB,GACflwB,EAAM0C,YAAYwtB,IACTlwB,EAAMgB,YACfnG,EAAQwE,MAAM6wB,GACdlwB,EAAM0C,YAAYwtB,IAElBmB,EAAOJ,WAEV,CAEH,MAAMn2B,EAAQkF,EAAME,UAAUvF,eAC9B,GAAIuK,EAAUnM,WAAY,CACxB,MAAM2jB,EAAM,IAAI9F,GAAI1R,GACdzT,EAAoC,KAA5ByT,EAAUpM,KAAK,SAAkB4jB,EAAIjrB,WAAQkB,EAG3D,OAFA0+B,EAAOR,UAAUnU,EAAI7kB,KAAMpG,QAC3ByT,EAAUpH,QAEX,CAID,GAHIoH,EAAU7J,QAAQjK,OAAS,GAC7B2T,EAASjK,GAEPA,EAAMpB,SAA0B,MAAfoB,EAAMjD,KAMzB,OALAiD,EAAMwE,YAAY4F,GAClBA,EAAUpL,KAAK,YAAYK,MAAK5C,IAC9B,IAAIqf,GAAIrf,GAAMogB,QAAQ,SAExB3X,EAAM0C,YAAYwC,GAGpB,IAAIlP,EAAQkP,EAAU7J,QACtB,KAAMrF,EAAM5E,OAAS,GAAG,CACH,OAAf4E,EAAM6B,OACR7B,EAAQA,EAAMqF,SAEhB,MAAMD,EAAcpF,EAAMmF,OAC1Bk2B,EAAO/K,UAAUtK,WAAWhmB,GAC5BA,EAAQoF,CACT,CACD8J,EAAUpH,QACZ,CAaEsxD,CAAgB/9B,EAAQ69B,GAExB,IAAIl5D,EAAQ,IAAIqB,EAAMqY,EAASpU,YAC/B,KAAOtF,EAAM5E,OAAS,GAAG,CACvB,MAAM+J,EAAOnF,EAAMmF,OACA,OAAfnF,EAAM6B,MACR7B,EAAM8H,SAER9H,EAAQmF,CACT,CAGD,GAFAg0D,EAAW,IAAI93D,EAAMqY,EAASlU,WAE1BkU,EAASzZ,WAAW7E,OAAS,EAAG,CAClC,MAAMwsB,EAAQ0I,EAAU5I,aACpBE,EAAMhZ,OACR5E,EAAM+B,YAAY6b,EAAMhZ,MACxB5E,EAAMiC,iBAEJ2b,EAAM/Y,OAAS+Y,EAAM/Y,MAAMnL,SAC7BkkB,EAAM/Y,MAAM/G,SAEdwoB,EAAUrJ,eAAevN,GACzB1P,EAAM0C,YAAYysD,EACnB,CACDlpD,EAAgBorB,EAAOx7B,UAAU6E,WAAW8B,QAAOjF,GAAQA,EAAKa,WAChEi5B,EAAOvB,QAAQzD,MACjB,CChKA,SAASgjC,GAAah+B,GACpBA,EAAO/K,UAAUnJ,UAAU,QAC7B,CAEA,SAASmyC,GAAgBj+B,GACvBA,EAAO/K,UAAUnJ,UAAU,qBAC7B,CAEA,SAASoyC,GAAgBl+B,GACvBA,EAAO/K,UAAUnJ,UAAU,qBAC7B,CAEA,SAASqyC,GAAan+B,EAAgB5/B,GACpC4/B,EAAO/K,UAAUnJ,UAAU,mCAAmC1rB,gBAChE,CCfA,MAAMg+D,GAAyC,CAC7CtlD,MAAO,OACPmlC,IAAK,SCFP,MAAM1lC,GAAU,SCAhB,MAAMA,GAAU,MCAhB,MAAMA,GAAU,MCAhB,MAAMA,GAAU,OCChB,IAAI8lD,GAAoB,GAExB,MAAMC,GAAyB,4BCGlBC,GASX,WAAAt4D,CAAY6nB,GARJ3nB,KAAQynB,SAAiB,KAM1BznB,KAAAkF,MAAsB,IAAImY,GAG/Brd,KAAK2nB,KAAOA,EACZ3nB,KAAK3B,UAAYiK,EAAMjO,CAAY;;gCAEPijC,GAAOkC,KAAKhoB;;;;gCAIZ8lB,GAAOkC,KAAKkB;;;;;;MAOzC,CAGa,kBAAA23B,CAAmBj2D,6CAC/B,IAAI4gC,GAAQ,EACZ,IACMvlC,OAAO66D,UACTt1B,EAAQvlC,OAAO86D,iBAETt7D,UAAUu7D,UAAUC,UAAUr2D,EAEvC,CAAC,MAAAjI,GACA6oC,GAAQ,CACT,CACD,OAAO,IAAIO,SAAQC,IACjBA,EAAQR,EAAM,MAEjB,CAGO,gBAAA01B,GACN,IAAIC,EAA2B,KAC/B,MAAMppB,EAAS,IAAI7nB,GAAO,CACxBC,KAAM3nB,KAAK3B,UAAUiE,KAAK,iBAC1BjC,KAAM,OACN0nB,KAAM1uB,EAAMe,IAAI,QAChB0tB,QAASwV,GAAOkC,KAAKmB,OACrB1Y,QAAS,KACP,IAAKjoB,KAAKynB,SACR,OAEF,MAAMjQ,EAAMxX,KAAK44D,cAAc,OAC/B54D,KAAKq4D,mBAAmB7gD,GAAKssB,MAAMd,IACjC,MAAMla,EAAU9oB,KAAK3B,UAAUiE,KAAK,2BAEpC,GADAwmB,EAAQ5hB,OACJ87B,EAGF,OAFAla,EAAQpmB,GAAG,GAAGsE,KAAK,eACnBhH,KAAKkF,MAAMD,KAAK,OAAQ+9B,GAG1Bla,EAAQpmB,GAAG,GAAGsE,KAAK,UACnBhH,KAAKkF,MAAMD,KAAK,OAAQ+9B,GACpB21B,GACFl7D,OAAOgxB,aAAakqC,GAEtBA,EAAYl7D,OAAO0wB,YAAW,KAC5BrF,EAAQ5hB,OACR4hB,EAAQpmB,GAAG,GAAGsE,KAAK,SAAS,GAC3B,IAAK,GACR,IAGNuoC,EAAOpvB,SACP,MAAM04C,EAAex/D,EAAMe,IAAI,eAC3By+D,GACFtpB,EAAOxvC,KAAK4H,OAAOkxD,GAErB,MAAMC,EAAgBz/D,EAAMe,IAAI,iBAC5B0+D,GACFvpB,EAAOxvC,KAAK4H,OAAOmxD,EAEtB,CAGO,gBAAAC,GACS,IAAIrxC,GAAO,CACxBC,KAAM3nB,KAAK3B,UAAUiE,KAAK,iBAC1BjC,KAAM,OACN0nB,KAAM1uB,EAAMe,IAAI,QAChB0tB,QAASwV,GAAOkC,KAAK7nB,OACrBsQ,QAAS,KACP,IAAKjoB,KAAKynB,SACR,OAEF,MAAMjQ,EAAMxX,KAAK44D,cAAc,OAC/Bn7D,OAAOka,KAAKH,EAAI,IAGb2I,QACR,CAGO,gBAAA64C,GACS,IAAItxC,GAAO,CACxBC,KAAM3nB,KAAK3B,UAAUiE,KAAK,oBAC1BjC,KAAM,OACN0nB,KAAM1uB,EAAMe,IAAI,SAChBgI,KAAMk7B,GAAOkC,KAAK3K,OAClB5M,QAAS,KACFjoB,KAAKynB,WAGVznB,KAAK60B,OACL70B,KAAKkH,OACLlH,KAAKkF,MAAMD,KAAK,QAAO,IAGpBkb,QACR,CAGO,kBAAA84C,GACS,IAAIvxC,GAAO,CACxBC,KAAM3nB,KAAK3B,UAAUiE,KAAK,oBAC1BjC,KAAM,SACN0nB,KAAM1uB,EAAMe,IAAI,UAChBgI,KAAMk7B,GAAOkC,KAAKoB,SAClB3Y,QAAS,KACFjoB,KAAKynB,WAGVznB,KAAKynB,SAASnhB,QAAO,GACrBtG,KAAKkH,OACLlH,KAAKkF,MAAMD,KAAK,UAAS,IAGtBkb,QACR,CAEM,aAAAy4C,CAAcv4D,GAGnB,OAFqBL,KAAK3B,UAAUiE,KAAK,eAAejC,OAChBjG,IAAI,GAClBH,KAC3B,CAEM,aAAAi/D,CAAc74D,EAAcpG,GACZ+F,KAAK3B,UAAUiE,KAAK,eAAejC,OAChBjG,IAAI,GACzBH,MAAQA,CAC5B,CAEM,IAAA46B,GACL,IAAK70B,KAAKynB,SACR,OAEF,MAAMjQ,EAAMxX,KAAK44D,cAAc,OAC/B,IAAIl4B,EAAQ1gC,KAAK44D,cAAc,SACnB,KAARphD,GAAwB,KAAVkpB,GAIJ,KAAVA,IACFA,EAAQlpB,GAEVxX,KAAKynB,SAASnmB,KAAK,OAAQkW,GAC3BxX,KAAKynB,SAASrlB,KAAKs+B,IAPjB1gC,KAAKynB,SAASnhB,QAQjB,CAEM,cAAA6yD,GACL,IAAKn5D,KAAKynB,SACR,OAEF,MAEM2xC,EAFiBp5D,KAAKynB,SAASrtB,IAAI,GAETovB,wBAC1B6vC,EAAQD,EAAS3vC,EAAIhsB,OAAO67D,QAC5BC,EAAQH,EAASzoC,EAAIlzB,OAAO+7D,QAC9BH,EAAQ,GAAKE,EAAQ,EACvBv5D,KAAKkH,QAIHkyD,EAAS3vC,EAAIzpB,KAAK3B,UAAUoI,QAAUhJ,OAAOkJ,WAE/C3G,KAAK3B,UAAUmI,IAAI,OAAQ,GAAG6yD,EAAQr5D,KAAK3B,UAAUoI,QAAU2yD,EAAS3yD,WAExEzG,KAAK3B,UAAUmI,IAAI,OAAQ,GAAG6yD,OAG5BD,EAASzoC,EAAIyoC,EAAStyD,OAAS9G,KAAK3B,UAAUyI,SAAWrJ,OAAOovC,YAElE7sC,KAAK3B,UAAUmI,IAAI,MAAU+yD,EAAQv5D,KAAK3B,UAAUyI,SAA1B,MAE1B9G,KAAK3B,UAAUmI,IAAI,MAAO,GAAG+yD,EAAQH,EAAStyD,YAEjD,CAEM,MAAAqZ,GACLngB,KAAK04D,mBACL14D,KAAK+4D,mBACL/4D,KAAKg5D,mBACLh5D,KAAKi5D,qBACLj5D,KAAK2nB,KAAKhgB,OAAO3H,KAAK3B,UACvB,CAEM,IAAA2I,CAAKygB,GAIV,GAHkD,IAA9CznB,KAAK2nB,KAAKrlB,KAAK,oBAAoB1I,QACrCoG,KAAKmgB,SAEHngB,KAAKynB,UAAYznB,KAAKynB,SAASrtB,IAAI,KAAOqtB,EAASrtB,IAAI,GACzD,OAEF4F,KAAKynB,SAAWA,EAChB,MAAMjQ,EAAMiQ,EAASnmB,KAAK,QACpBo/B,EAAQjZ,EAASrlB,OACvBpC,KAAKk5D,cAAc,MAAO1hD,GACtBkpB,IAAUlpB,GACZxX,KAAKk5D,cAAc,QAASx4B,GAE9B1gC,KAAK3B,UAAUmI,IAAI,aAAc,UACjCxG,KAAK3B,UAAU2I,OACfhH,KAAKm5D,iBACLn5D,KAAK3B,UAAUmI,IAAI,aAAc,IACjCxG,KAAK3B,UAAUiE,KAAK,qBAAqB+C,OAC1C,CAEM,IAAA6B,GACLlH,KAAKynB,SAAW,KAChBznB,KAAK3B,UAAU6I,MAChB,EChOH,MAAMuyD,GAAiB,IAAIngE,IAAI,CAC7B,CAAC,IAAK,MACN,CAAC,KAAM,MACP,CAAC,MAAO,MACR,CAAC,OAAQ,MACT,CAAC,QAAS,MACV,CAAC,SAAU,QAGPogE,GAA2B,CAC/B,CACEn9D,GAAI,iBACJo9D,cAAe,IAAM,CACnB,SAGJ,CACEp9D,GAAI,aACJo9D,cAAe,IAAM,CACnB,SAGJ,CACEp9D,GAAI,WACJo9D,cAAe,IAAM,CACnB,WAGJ,CACEp9D,GAAI,aACJo9D,cAAe,IAAM,CACnB,WAGJ,CACEp9D,GAAI,aACJo9D,cAAe,IAAM,CACnB,YACA,YAGJ,CACEp9D,GAAI,aACJo9D,cAAe,IAAM,CACnB,kBAGJ,CACEp9D,GAAI,WACJo9D,cAAe,IAAM,CACnB,UAKAC,GAAwC,CAC5C,CACEr9D,GAAI,OACJo9D,cAAgBE,UAA6B,MAAA,CAC3C,UAC8B,QAA9B1/D,EAAAs/D,GAAer/D,IAAIy/D,EAAQ,WAAG,IAAA1/D,EAAAA,EAAI,KACnC,GAEH,CACEoC,GAAI,UACJo9D,cAAe,IAAM,CACnB,OACA,aAGJ,CACEp9D,GAAI,WACJo9D,cAAe,IAAM,CACnB,OACA,aAGJ,CACEp9D,GAAI,YACJo9D,cAAe,IAAM,CACnB,OACA,aACA,IAGJ,CACEp9D,GAAI,WACJo9D,cAAe,IAAM,CACnB,OACA,aACA,IAGJ,CACEp9D,GAAI,MACJo9D,cAAe,IAAM,CACnB,gBAKAG,GAAwC,CAC5C,CACEv9D,GAAI,OACJo9D,cAAe,IAAM,CACnB,OAGJ,CACEp9D,GAAI,gBACJo9D,cAAgBE,GACTA,EAAQ,GAKN,CACL,YACA,CACEhD,KAAMgD,EAAQ,KAPT,CACL,eAwCV,SAASE,GAAcz2D,GACrB,MAAM0jB,EAAW1jB,EAAMiC,OAAM,GAC7ByhB,EAAS1kB,KAAK,iBAAiBgE,SACP,KAApB0gB,EAAS7f,QAGb7D,EAAMkE,QAAQ,SAChB,CC7KA,SAAS0e,GAAW2T,EAAgBv2B,GAClC,MAAMkF,EAAQqxB,EAAO/K,UAAUtmB,MACzBwxD,EAAYxxD,EAAMsE,eAGxB,GAFA+sB,EAAO/K,UAAU5I,aACjB5iB,EAAQkF,EAAM6D,YAAY,GAK1B,MAAkB,KAAd2tD,IAAqB12D,EAAMtC,WAA4B,eAAfsC,EAAMjD,UAK9CiD,EAAMrC,QAAiC,cAAvBqC,EAAMhC,KAAK,SAC7BgC,EAAMhB,KAAK,MAAMhB,KAAK,QAAS,WAL/Bu4B,EAAO/K,UAAUnJ,UAAU,cAC3BkU,EAAOvB,QAAQzD,QALfgF,EAAOvB,QAAQzD,MAWnB,CAEA,SAASolC,GAA2BpgC,GAClC,MAAMrxB,EAAQqxB,EAAO/K,UAAUtmB,MACzBnF,EAAUmF,EAAME,UAAU/G,QAAQ,YAClC2B,EAAQD,EAAQF,eACtB,GAAIG,EAAM1J,OAAS,IAAM0J,EAAM9B,YAY7B,YAXIgH,EAAMY,WACRZ,EAAMyB,eAAe5G,GACrBmF,EAAM0B,kBACNgc,GAAW2T,EAAQv2B,IACVkF,EAAMgB,YACfhB,EAAM2B,cAAc9G,GACpBmF,EAAM0B,kBACNgc,GAAW2T,EAAQv2B,IAEnBu2B,EAAOJ,aAIX,MAAMzS,EAAW1e,EAAM,iBACnBE,EAAMY,UACR/F,EAAQuE,OAAOof,GACNxe,EAAMgB,YACfnG,EAAQwE,MAAMmf,GACdxe,EAAM0C,YAAY8b,IAElB6S,EAAOJ,WAEX,CC/CA,SAASygC,GAAargC,GACpB,MAAMrxB,EAAQqxB,EAAO/K,UAAUtmB,MACzBlF,EAAQkF,EAAME,UAAUvF,eAC9B,GAAIG,EAAM1J,OAAS,IAAM0J,EAAM9B,YAAa,CAC1C,MAAMwK,EAAWxD,EAAMuD,cACjBiuD,EAAYxxD,EAAMsE,eACxB,GAAsB,OAAlBd,EAAS3L,MAA+B,KAAd25D,EAG5B,OAFAngC,EAAO/K,UAAUpJ,eAAe,qBAChCmU,EAAOvB,QAAQzD,MAGlB,CACDgF,EAAO/K,UAAUtK,WAAWlc,EAAM,UACpC,CAEA,SAAS6xD,GAA0BtgC,GACjC,MAAMrxB,EAAQqxB,EAAO/K,UAAUtmB,MACzBnF,EAAUmF,EAAME,UAAU/G,QAAQ,YAClC2B,EAAQD,EAAQF,eACtB,GAAIG,EAAM1J,OAAS,IAAM0J,EAAM9B,YAY7B,YAXIgH,EAAMY,WACRZ,EAAMyB,eAAe5G,GACrBmF,EAAM0B,kBACNgwD,GAAargC,IACJrxB,EAAMgB,YACfhB,EAAM2B,cAAc9G,GACpBmF,EAAM0B,kBACNgwD,GAAargC,IAEbA,EAAOJ,aAIX,MAAMzS,EAAW1e,EAAM,iBACnBE,EAAMY,UACR/F,EAAQuE,OAAOof,GACNxe,EAAMgB,YACfnG,EAAQwE,MAAMmf,GACdxe,EAAM0C,YAAY8b,IAElB6S,EAAOJ,WAEX,CCvCA,SAAS2gC,GAAuBvgC,EAAgBv2B,GAC9C,MAAMkF,EAAQqxB,EAAO/K,UAAUtmB,MAC/B,IAAIgd,EAAYliB,EAAMG,OACtB,GAAyB,IAArB+hB,EAAU5rB,OAIZ,YAHmB,MAAf0J,EAAMjD,MACRw5B,EAAO/K,UAAUnJ,UAAU,UAI/B,GAAIH,EAAUpkB,MAKZ,OAJIkC,EAAMpB,SACRoB,EAAMgD,cAERkC,EAAMwC,eAAewa,GAGvB,GAAwB,OAApBA,EAAUnlB,KAEZ,YADAmlB,EAAUlf,SAGZ,IAAKkf,EAAU5kB,QAAS,CACtB,MAAMy5D,EAAY,IAAI9xD,EACtB8xD,EAAU1vD,mBAAmB6a,GAC7BG,GAAU00C,EAAW,SACrB70C,EAAY60C,EAAU3xD,UAAUvF,cACjC,CACD,GAAIqiB,EAAUtjB,QAEZ,YADAsjB,EAAUlf,SAGZ,MAAM2e,EAAW4U,EAAO/K,UAAUpK,iBAClCjX,EAAW+X,EAAWliB,GACtBu2B,EAAO/K,UAAU9J,WAAWC,GAC5B4U,EAAO/K,UAAUzJ,SACnB,CClCA,SAASi1C,GAAmBzgC,EAAgBv2B,GAC1C,MAAMkF,EAAQqxB,EAAO/K,UAAUtmB,MAC/B,IAAIqD,EAAYvI,EAAMK,OACtB,GAAyB,IAArBkI,EAAUjS,OAEZ,YADAigC,EAAOvB,QAAQzD,OAGjB,GAAIhpB,EAAUzK,MAMZ,OALIkC,EAAMpB,SACRoB,EAAMgD,SAERkC,EAAMsC,cAAce,QACpBguB,EAAOvB,QAAQzD,OAGjB,IAAKhpB,EAAUjL,QAAS,CACtB,MAAM25D,EAAY,IAAIhyD,EACtBgyD,EAAU5vD,mBAAmBkB,GAC7B8Z,GAAU40C,EAAW,SACrB1uD,EAAYA,EAAU1I,cACvB,CACD,MAAM8hB,EAAW4U,EAAO/K,UAAUpK,iBAClCjX,EAAWnK,EAAOuI,GAClBguB,EAAO/K,UAAU9J,WAAWC,GAC5B4U,EAAO/K,UAAUzJ,SACnB,QCsCAwR,GAAO3R,IAAI9e,ICnEwB,CACjC5B,KAAM,QACNnE,KAAM,KACN8f,OAAQ+E,IACN,MAAM2U,EAAS3U,EAAIjF,YACnB,GAAK4Z,EASL,OANA3U,EAAIhF,WAAU,KACGgF,EAAIzF,eAAend,KAAK,YAChCiC,GAAG,SAAS,KACjBs1B,EAAO/K,UAAUtmB,MAAMoC,UAAUsa,EAAInlB,KAAK,GAC1C,IAEG,mCAAmC,EAE5CoH,KAAM,IAAM,WDoDd0vB,GAAO3R,IAAI9e,IAAI0rD,IACfj7B,GAAO3R,IAAI9e,IAAI4vD,IAEfn/B,GAAO6C,OAAOtzB,KEtEEyzB,IACdA,EAAOx7B,UAAUkG,GAAG,QAAQW,IAC1B,MAAMsD,EAAQqxB,EAAO/K,UAAUtmB,MAC/B,GAAIA,EAAMkB,YACR,OAEF,MAAMrG,EAAUmF,EAAME,UAAU/G,QAAQ,YACxC,GAAuB,IAAnB0B,EAAQzJ,OACV,OAEF,GAAI4O,EAAMY,WAAaZ,EAAMgB,WAC3B,OAEFtE,EAAM8iB,iBACN,MAAMwyC,EAAgBt1D,EAAyBu1D,cAC/C,IAAKD,EACH,OAEF,MACM9gE,EADM,IAAI0lB,GAAI/b,GACAid,UACpBk6C,EAAax6C,QAAQ,YAAatmB,EAAQ,GAC1C,IFkDJm9B,GAAO6C,OAAOtzB,KGvEEyzB,IACdA,EAAOx7B,UAAUkG,GAAG,OAAOW,IACzB,MAAMsD,EAAQqxB,EAAO/K,UAAUtmB,MAC/B,GAAIA,EAAMkB,YACR,OAEF,MAAMrG,EAAUmF,EAAME,UAAU/G,QAAQ,YACxC,GAAuB,IAAnB0B,EAAQzJ,OACV,OAEF,GAAI4O,EAAMY,WAAaZ,EAAMgB,WAC3B,OAEFtE,EAAM8iB,iBACN,MAAMwyC,EAAgBt1D,EAAyBu1D,cAC/C,IAAKD,EACH,OAEF,MACM9gE,EADM,IAAI0lB,GAAI/b,GACAid,UACpBk6C,EAAax6C,QAAQ,YAAatmB,GAClCmgC,EAAOJ,YACPI,EAAOvB,QAAQzD,MAAM,GACrB,IHiDJgC,GAAO6C,OAAOtzB,Kd0FEyzB,IACd,MAAMjD,kBAAEA,GAAsBiD,EAAOjoB,OACrCioB,EAAOx7B,UAAUkG,GAAG,SAASW,IAE3B,GADc20B,EAAO/K,UAAUtmB,MACrBkB,YACR,OAEFxE,EAAM8iB,iBACN,MAAMwyC,EAAgBt1D,EAAyBu1D,cAC/C,IAAKD,EACH,OAIF,GAFA3gC,EAAO/K,UAAUxJ,iBAEbk1C,EAAaE,MAAM9gE,OAAS,EAAG,CACjC,IAAK,MAAMkd,KAAQ0jD,EAAaE,MAC1B9jC,EAAkBx7B,QAAQ0b,EAAKtS,OAAS,GAC1Ck+B,GAAY,CACV7I,SACA/iB,SAIN,MACD,CACD,MAAM6jD,EAAQH,EAAaG,MAE3B,GADsC,IAAjBA,EAAM/gE,QAA6B,eAAb+gE,EAAM,GAChC,CACf,MAAMjhE,EAAU8gE,EAAaz6C,QAAQ,cAE/B7H,EADa,IAAIqM,GAAW7qB,GACN2qB,cAG5B,OAFAwV,EAAO30B,MAAMD,KAAK,cAAeiT,QACjCu/C,GAAc59B,EAAQ3hB,EAEvB,CACD,MAAMxe,EAAUkD,EAAe49D,EAAaz6C,QAAQ,cAC9C4C,EA1LV,WACE,MAAMA,EAAQlC,KAMd,OALAkC,EAAMi4C,IAAMj4C,EAAM3B,EAClBtmB,EAAQioB,GAAO,CAACjmB,EAAK4mB,YACZA,EAAeljB,UACfkjB,EAAe9C,KAAK,IAEtBmC,CACT,CAkLkBk4C,GAER3iD,EADa,IAAIwK,GAAWhpB,EAASipB,GACf0B,cAC5BwV,EAAO30B,MAAMD,KAAK,cAAeiT,GAjKrC,SAA0BA,GACxB,IAAInY,EAAO,IAAIF,EAAMqY,EAASpU,YAC9B,KAAO/D,EAAKnG,OAAS,GAAG,CACtB,MAAM0K,EAAWvE,EAAK4D,OAClB5D,EAAKa,SACP42D,GAAgBz3D,GAElBA,EAAOuE,CACR,CACD,IAAIvG,EAAoB,GAExB,IADAgC,EAAO,IAAIF,EAAMqY,EAASpU,YACnB/D,EAAKnG,OAAS,GAAG,CACtB,MAAM0K,EAAWvE,EAAK4D,OAClB5D,EAAKe,QAAUf,EAAKW,QAAUX,EAAKoB,YAAcpB,EAAKsB,YACxDtD,EAASC,KAAK+B,IAEdiO,EAAajQ,GACbA,EAAW,IAEbgC,EAAOuE,CACR,CACD0J,EAAajQ,EACf,CA4II+8D,CAAiB5iD,GACjBu/C,GAAc59B,EAAQ3hB,GACtB2hB,EAAO3U,IAAI6T,UAAUc,EAAO,GAC5B,IcpIJhD,GAAO6C,OAAOtzB,KI1EEyzB,IACdA,EAAOnC,QAAQtxB,IAAI,OAAQ,CACzBoqB,QAAS,KACPqJ,EAAOvB,QAAQhE,MAAM,IAGzBuF,EAAOtB,UAAUvC,WAAW,SAAS9wB,IACrB20B,EAAO/K,UAAUtmB,MACrBkB,cAGVxE,EAAM8iB,iBACN6R,EAAOnC,QAAQlH,QAAQ,QAAO,GAC9B,IJ8DJqG,GAAO6C,OAAOtzB,KK3EEyzB,IACdA,EAAOnC,QAAQtxB,IAAI,OAAQ,CACzBoqB,QAAS,KACPqJ,EAAOvB,QAAQ7D,MAAM,IAGzB,MAAMsmC,EAAe71D,IACL20B,EAAO/K,UAAUtmB,MACrBkB,cAGVxE,EAAM8iB,iBACN6R,EAAOnC,QAAQlH,QAAQ,QAAO,EAEhCqJ,EAAOtB,UAAUvC,WAAW,QAAS+kC,GACrClhC,EAAOtB,UAAUvC,WAAW,cAAe+kC,EAAY,IL6DzDlkC,GAAO6C,OAAOtzB,KM5EEyzB,IACdA,EAAOnC,QAAQtxB,IAAI,YAAa,CAC9BoqB,QAAS,KACP,MAAMhoB,EAAQqxB,EAAO/K,UAAUtmB,MAC/BA,EAAMmC,mBAAmBkvB,EAAOx7B,WAChCmK,EAAM2C,QAAQ,GAEhB,INsEJ0rB,GAAO6C,OAAOtzB,KO7EEyzB,IACdA,EAAOnC,QAAQtxB,IAAI,UAAW,CAC5BmqB,eAAgBZ,IACd,MAAMqrC,EAAcrrC,EAAartB,MAAKwC,GAAQA,EAAK/E,KAAKiB,WAA2B,MAAd8D,EAAKzE,OAC1E,OAAO26D,EAAc,CAACA,EAAY36D,MAAQ,EAAE,EAE9CmwB,QAAUhsB,IACRq1B,EAAO/K,UAAUnJ,UAAU,IAAInhB,QAC/Bq1B,EAAOvB,QAAQzD,MAAM,GAEvB,IPoEJgC,GAAO6C,OAAOtzB,KQ9EEyzB,IACdA,EAAOnC,QAAQtxB,IAAI,aAAc,CAC/BkqB,WAAYX,KAAkBA,EAAartB,MAAKwC,GAAsB,eAAdA,EAAKzE,OAC7DmwB,QAAS,KACPqJ,EAAO/K,UAAUnJ,UAAU,kBAC3BkU,EAAOvB,QAAQzD,MAAM,GAEvB,IRwEJgC,GAAO6C,OAAOtzB,Kb9DEyzB,IACdA,EAAOnC,QAAQtxB,IAAI,OAAQ,CACzBmqB,eAAgBZ,IACd,IAAIsrC,EACJ,IAAK,MAAMn2D,KAAQ6qB,EAAc,CAC/B,GAAkB,OAAd7qB,EAAKzE,KAAe,CACtB46D,EAAe,WACf,KACD,CACD,GAAkB,OAAdn2D,EAAKzE,OAAkByE,EAAK/E,KAAK2F,QAAQ,QAAS,CACpDu1D,EAAe,WACf,KACD,CACD,GAAkB,OAAdn2D,EAAKzE,MAA4C,cAA3ByE,EAAK/E,KAAKuB,KAAK,QAAyB,CAChE25D,EAAe,YACf,KACD,CACF,CACD,OAAOA,EAAe,CAACA,GAAgB,EAAE,EAE3CzqC,QAAS,CAAChsB,EAA6CvK,GAAiB,KACtE,MAAMqS,EAASutB,EAAO/K,UAAUtmB,MAAM6D,YACtC,IAAI6uD,GAAiB,EACjBC,GAAiB,EACjBC,GAAc,EAClB,IAAK,MAAM93D,KAASgJ,EACb4uD,GAAiC,OAAf53D,EAAMjD,OAC3B66D,GAAiB,GAEdC,GAAiC,OAAf73D,EAAMjD,MAAkBiD,EAAMoC,QAAQ,UAC3Dy1D,GAAiB,GAEdC,GAA8B,OAAf93D,EAAMjD,MAAwC,cAAvBiD,EAAMhC,KAAK,UACpD85D,GAAc,GAGdF,GACW,aAAT12D,GACFqzD,GAAah+B,GAEF,aAATr1B,GACFuzD,GAAgBl+B,GAEL,cAATr1B,GACFwzD,GAAan+B,EAAQ5/B,IAEdkhE,GACI,aAAT32D,GACFszD,GAAgBj+B,GAEL,aAATr1B,GACFqzD,GAAah+B,GAEF,cAATr1B,GACFwzD,GAAan+B,EAAQ5/B,IAEdmhE,GACI,aAAT52D,GACFszD,GAAgBj+B,GAEL,aAATr1B,GACFuzD,GAAgBl+B,GAEL,cAATr1B,GACFqzD,GAAah+B,KAGF,aAATr1B,GACFszD,GAAgBj+B,GAEL,aAATr1B,GACFuzD,GAAgBl+B,GAEL,cAATr1B,GACFwzD,GAAan+B,EAAQ5/B,IAGzB4/B,EAAOvB,QAAQzD,MAAM,IAGzBgF,EAAOx7B,UAAUkG,GAAG,SAASW,IAC3B,MAAMm2D,EAAan2D,EACnB,IAAKm2D,EAAW74D,OACd,OAEF,MAAMA,EAAS8F,EAAM+yD,EAAW74D,QACZ,OAAhBA,EAAOnC,MAA0C,KAAzBmC,EAAOlB,KAAK,UAAmB+5D,EAAWlL,SAAW,KAC/E3tD,EAAOlB,KAAK,SAAmC,SAAzBkB,EAAOlB,KAAK,UAAqB7F,YACvDo+B,EAAOvB,QAAQzD,OAChB,GACD,Ia3BJgC,GAAO6C,OAAOtzB,KZ3EEyzB,IACdA,EAAOnC,QAAQtxB,IAAI,QAAS,CAC1BmqB,eAAgBZ,IACd,IAAIsrC,EACJ,IAAK,MAAMn2D,KAAQ6qB,EACjB,GAAI7qB,EAAK/E,KAAKa,QAAS,CACrBq6D,EAAen2D,EAAK/E,KAAKwG,YAAY,cACrC,KACD,CAEH,OAAK00D,EAGE,CAAChD,GAAcgD,IAAiBA,GAF9B,EAE2C,EAEtDzqC,QAAUhsB,IACRq1B,EAAO/K,UAAUnJ,UAAU,CACzB,aAAcnhB,IAEhBq1B,EAAOvB,QAAQzD,MAAM,GAEvB,IYuDJgC,GAAO6C,OAAOtzB,KShFEyzB,IACdA,EAAOnC,QAAQtxB,IAAI,SAAU,CAC3BoqB,QAAUhsB,IACR,MAAM8H,EAASutB,EAAO/K,UAAUtmB,MAAM6D,YACtC,IAAK,MAAM/I,KAASgJ,EAClByC,EAAezL,EAAOkB,GAExBq1B,EAAOvB,QAAQzD,MAAM,GAEvB,ITwEJgC,GAAO6C,OAAOtzB,KXhFEyzB,IACdA,EAAOnC,QAAQtxB,IAAI,OAAQ,CACzBiqB,WAAYV,KAAkBA,EAAartB,MAAKwC,GAAQA,EAAK/E,KAAKiB,YAClEsvB,WAAYX,KAAkBA,EAAartB,MAAKwC,GAAQA,EAAKzE,OAAS+R,KACtEoe,QAAS,KACHqJ,EAAOnC,QAAQpH,WAAW,QAC5BuJ,EAAO/K,UAAUxH,WAAW,IAAIlV,SAEhCynB,EAAO/K,UAAUhI,QAAQ,IAAI1U,SAE/BynB,EAAOvB,QAAQzD,MAAM,IAGzBgF,EAAOtB,UAAUvC,WAAW,SAAS9wB,IACnCA,EAAM8iB,iBACN6R,EAAOnC,QAAQlH,QAAQ,OAAO,GAC9B,IWiEJqG,GAAO6C,OAAOtzB,KUjFEyzB,IACdA,EAAOnC,QAAQtxB,IAAI,SAAU,CAC3BkqB,WAAYX,KAAkBA,EAAartB,MAAKwC,GAJpC,MAI4CA,EAAKzE,OAC7DmwB,QAAS,KACHqJ,EAAOnC,QAAQpH,WAAW,UAC5BuJ,EAAO/K,UAAUxH,WAAW,SAE5BuS,EAAO/K,UAAUhI,QAAQ,SAE3B+S,EAAOvB,QAAQzD,MAAM,IAGzBgF,EAAOtB,UAAUvC,WAAW,SAAS9wB,IACnCA,EAAM8iB,iBACN6R,EAAOnC,QAAQlH,QAAQ,SAAS,GAChC,IVmEJqG,GAAO6C,OAAOtzB,KWlFEyzB,IACdA,EAAOnC,QAAQtxB,IAAI,YAAa,CAC9BkqB,WAAYX,KAAkBA,EAAartB,MAAKwC,GAJpC,MAI4CA,EAAKzE,OAC7DmwB,QAAS,KACHqJ,EAAOnC,QAAQpH,WAAW,aAC5BuJ,EAAO/K,UAAUxH,WAAW,SAE5BuS,EAAO/K,UAAUhI,QAAQ,SAE3B+S,EAAOvB,QAAQzD,MAAM,IAGzBgF,EAAOtB,UAAUvC,WAAW,SAAS9wB,IACnCA,EAAM8iB,iBACN6R,EAAOnC,QAAQlH,QAAQ,YAAY,GACnC,IXoEJqG,GAAO6C,OAAOtzB,KYnFEyzB,IACdA,EAAOnC,QAAQtxB,IAAI,gBAAiB,CAClCkqB,WAAYX,KAAkBA,EAAartB,MAAKwC,GAJpC,MAI4CA,EAAKzE,OAC7DmwB,QAAS,KACHqJ,EAAOnC,QAAQpH,WAAW,iBAC5BuJ,EAAO/K,UAAUxH,WAAW,SAE5BuS,EAAO/K,UAAUhI,QAAQ,SAE3B+S,EAAOvB,QAAQzD,MAAM,IAGzBgF,EAAOtB,UAAUvC,WAAW,eAAe9wB,IACzCA,EAAM8iB,iBACN6R,EAAOnC,QAAQlH,QAAQ,gBAAgB,GACvC,IZqEJqG,GAAO6C,OAAOtzB,KVpFEyzB,IACdA,EAAOnC,QAAQtxB,IAAI,YAAa,CAC9BkqB,WAAYX,KAAkBA,EAAartB,MAAKwC,GAAQA,EAAKzE,OAAS+R,KACtEoe,QAAS,KACHqJ,EAAOnC,QAAQpH,WAAW,aAC5BuJ,EAAO/K,UAAUxH,WAAW,IAAIlV,SAEhCynB,EAAO/K,UAAUhI,QAAQ,IAAI1U,SAE/BynB,EAAOvB,QAAQzD,MAAM,GAEvB,IU0EJgC,GAAO6C,OAAOtzB,KTrFEyzB,IACdA,EAAOnC,QAAQtxB,IAAI,cAAe,CAChCkqB,WAAYX,KAAkBA,EAAartB,MAAKwC,GAAQA,EAAKzE,OAAS+R,KACtEoe,QAAS,KACHqJ,EAAOnC,QAAQpH,WAAW,eAC5BuJ,EAAO/K,UAAUxH,WAAW,IAAIlV,SAEhCynB,EAAO/K,UAAUhI,QAAQ,IAAI1U,SAE/BynB,EAAOvB,QAAQzD,MAAM,GAEvB,IS2EJgC,GAAO6C,OAAOtzB,KRtFEyzB,IACdA,EAAOnC,QAAQtxB,IAAI,OAAQ,CACzBkqB,WAAYX,KAAkBA,EAAartB,MAAKwC,GAAQA,EAAKzE,OAAS+R,KACtEoe,QAAS,KACHqJ,EAAOnC,QAAQpH,WAAW,QAC5BuJ,EAAO/K,UAAUxH,WAAW,IAAIlV,SAEhCynB,EAAO/K,UAAUhI,QAAQ,IAAI1U,SAE/BynB,EAAOvB,QAAQzD,MAAM,GAEvB,IQ4EJgC,GAAO6C,OAAOtzB,KazFEyzB,IACdA,EAAOnC,QAAQtxB,IAAI,aAAc,CAC/BmqB,eAAgBZ,IACd,IAAK,MAAM7qB,KAAQ6qB,EACjB,GAAkB,SAAd7qB,EAAKzE,KAAiB,CAExB,MAAO,CADcyE,EAAK/E,KAAKyG,IAAI,eACd1M,QAAQ,QAAS,IACvC,CAEH,MAAO,EAAE,EAEX02B,QAAUv2B,IACR4/B,EAAO/K,UAAUhI,QAAQ,6BAA6B7sB,UACtD4/B,EAAOvB,QAAQzD,MAAM,GAEvB,Ib2EJgC,GAAO6C,OAAOtzB,Kc1FEyzB,IACdA,EAAOnC,QAAQtxB,IAAI,WAAY,CAC7BiqB,WAAYV,KAAkBA,EAAartB,MAAKwC,GAAQA,EAAK/E,KAAKiB,YAClEuvB,eAAgBZ,IACd,IAAK,MAAM7qB,KAAQ6qB,EACjB,GAAkB,SAAd7qB,EAAKzE,KAAiB,CAExB,MAAO,CADcyE,EAAK/E,KAAKyG,IAAI,aACd1M,QAAQ,QAAS,IACvC,CAEH,MAAO,EAAE,EAEX02B,QAAUv2B,IACR4/B,EAAO/K,UAAUhI,QAAQ,2BAA2B7sB,UACpD4/B,EAAOvB,QAAQzD,MAAM,GAEvB,Id2EJgC,GAAO6C,OAAOtzB,Ke1FEyzB,IACdA,EAAOnC,QAAQtxB,IAAI,YAAa,CAC9BmqB,eAAgBZ,IACd,IAAK,MAAM7qB,KAAQ6qB,EACjB,GAAkB,SAAd7qB,EAAKzE,KAAiB,CAExB,MAAO,CAAC1E,EADamJ,EAAK/E,KAAKwG,YAAY,UAE5C,CAEH,MAAO,EAAE,EAEXiqB,QAAUv2B,IACR4/B,EAAO/K,UAAUhI,QAAQ,uBAAuB7sB,UAChD4/B,EAAOvB,QAAQzD,MAAM,GAEvB,If4EJgC,GAAO6C,OAAOtzB,KgB3FEyzB,IACdA,EAAOnC,QAAQtxB,IAAI,YAAa,CAC9BmqB,eAAgBZ,IACd,IAAK,MAAM7qB,KAAQ6qB,EACjB,GAAkB,SAAd7qB,EAAKzE,KAAiB,CAExB,MAAO,CAAC1E,EADamJ,EAAK/E,KAAKwG,YAAY,qBAE5C,CAEH,MAAO,EAAE,EAEXiqB,QAAUv2B,IACR4/B,EAAO/K,UAAUhI,QAAQ,kCAAkC7sB,UAC3D4/B,EAAOvB,QAAQzD,MAAM,GAEvB,IhB6EJgC,GAAO6C,OAAOtzB,KiB7FEyzB,IACdA,EAAOnC,QAAQtxB,IAAI,eAAgB,CACjCoqB,QAAS,KACPqJ,EAAO/K,UAAUxH,aACjBuS,EAAOvB,QAAQzD,MAAM,GAEvB,IjBwFJgC,GAAO6C,OAAOtzB,KPzFEyzB,IACdA,EAAOnC,QAAQtxB,IAAI,gBAAiB,CAClCoqB,QAAS,KACPqJ,EAAOx7B,UAAU6H,SAASiyD,IAC1B,MAAMxoC,EAAekK,EAAO/K,UAAUY,kBACtC,IAAK,MAAM5qB,KAAQ6qB,EAAc,CAC/B,MAAM5vB,EAAO+E,EAAK/E,KAAKwF,QACnBxF,EAAKe,QAAwB,MAAdf,EAAKM,MACtB63D,GAASl6D,KAAK+B,EAEjB,KAGL85B,EAAOx7B,UAAUkG,GAAG,SAAS,KAE3B,GADAs1B,EAAOx7B,UAAUgI,YAAY8xD,IACL,IAApBD,GAASt+D,OAAb,CAGA,IAAK,MAAM2tB,KAAQ2wC,GACjBr+B,EAAO/K,UAAUhI,QAAQS,GAE3B2wC,GAAW,GACXr+B,EAAOvB,QAAQzD,MALd,CAKoB,IAEvBgF,EAAO30B,MAAMX,GAAG,SAAU+2D,IACxB,GAAIA,EAAU15D,SACZ,OAEiB05D,EAAU35D,QAAQ,gCACtB/H,OAAS,IAGxBigC,EAAOx7B,UAAUgI,YAAY8xD,IAC7BD,GAAW,GAAE,GACb,IOwDJrhC,GAAO6C,OAAOtzB,KkB5FEyzB,IACd,MAAM0hC,EAAQ,IAAInD,GAAUv+B,EAAO1B,gBACnCojC,EAAMr2D,MAAMX,GAAG,QAAQ,KACrBs1B,EAAOvB,QAAQzD,MAAM,IAEvB0mC,EAAMr2D,MAAMX,GAAG,UAAU,KACvBs1B,EAAOvB,QAAQzD,MAAM,IAEvBgF,EAAOlS,KAAKpjB,GAAG,UAAU,KACvBg3D,EAAMpC,gBAAgB,IAExBt/B,EAAO30B,MAAMX,GAAG,UAAU,KACxBg3D,EAAMpC,gBAAgB,IAExBt/B,EAAO30B,MAAMX,GAAG,SAAUkM,IACxB,GAAIA,EAAW9O,QAAQ,uBAAuB/H,OAAS,EACrD,OAEF,MAAM6tB,EAAWhX,EAAW9O,QAAQ,KACZ,IAApB8lB,EAAS7tB,OAKX6tB,EAAS/lB,WACT+lB,EAAS9lB,QAAQ,YAAY/H,OAAS,GAIxC2hE,EAAMv0D,KAAKygB,GATT8zC,EAAMr0D,MASY,IAEtB2yB,EAAOnC,QAAQtxB,IAAI,OAAQ,CACzBoqB,QAAS,KACP,MAAM/I,EAAWoS,EAAO/K,UAAUtH,WAAW,cAAc8V,GAAOkC,KAAKiB,iBAClEhZ,IAGLoS,EAAOvB,QAAQzD,OACf0mC,EAAMv0D,KAAKygB,GAAS,GAEtB,IlBqDJoP,GAAO6C,OAAOtzB,KmB7FEyzB,IACdA,EAAO30B,MAAMX,GAAG,eAAgBi3D,IACb,IAAIvjD,GAASujD,GACrBl5D,KAAK,MAAMK,MAAKyV,IACvB,MAAMrY,EAAOuI,EAAM8P,GACb8M,EAAM,IAAI9F,GAAI,MACpBrf,EAAK+H,YAAYod,EAAInlB,KAAK,GAC1B,IAEJ85B,EAAOnC,QAAQtxB,IAAI,KAAM,CACvBoqB,QAAS,KACPqJ,EAAOR,UAAU,MACjBQ,EAAOvB,QAAQzD,MAAM,GAEvB,InBgFJgC,GAAO6C,OAAOtzB,KoB7FEyzB,IACdA,EAAO30B,MAAMX,GAAG,eAAgBi3D,IACb,IAAIvjD,GAASujD,GACrBl5D,KAAK,OAAOK,MAAKyV,IACxB,MAAMrY,EAAOuI,EAAM8P,GACb8M,EAAM,IAAI9F,GAAI,SACdnlB,EAAQ8F,EAAKuB,KAAK,mBACV,KAAVrH,EACFirB,EAAIjrB,MAAQ,CACVud,IAAKzX,EAAKuB,KAAK,OACf6V,OAAQ,QAGV+N,EAAInlB,KAAKuB,KAAK,QAASrH,GAEzB8F,EAAK+H,YAAYod,EAAInlB,KAAK,GAC1B,IAEJ85B,EAAOnC,QAAQtxB,IAAI,QAAS,CAC1BoqB,QAAUv2B,IACR4/B,EAAOR,UAAU,QAASp/B,GAC1B4/B,EAAOvB,QAAQzD,MAAM,GAEvB,IpBuEJgC,GAAO6C,OAAOtzB,KqBjGEyzB,IACdA,EAAOnC,QAAQtxB,IAAI,YAAa,CAC9BoqB,QAAUv2B,IACR,MAAMirB,EAAM2U,EAAOR,UAAU,YAAap/B,GAC1C4/B,EAAOvB,QAAQzD,OACI3P,EAAInF,QAAQ,cACpB1a,OAAO,GAEpB,IrB0FJwxB,GAAO6C,OAAOtzB,KLgKEyzB,IACdA,EAAOtB,UAAUvC,WAAW,SAAS9wB,IACnC,MACMsD,EADYqxB,EAAO/K,UACDtmB,MACxB,GAAIA,EAAMpH,MACR,OAEF,MAAMk1C,EA7HV,SAA0Bzc,GACxB,MACMrxB,EADYqxB,EAAO/K,UACDtmB,MACxB,IAAIzI,EAAOyI,EAAME,UACbN,EAASI,EAAMI,YACnB,GAAe,IAAXR,EAAJ,CAGA,GAAIrI,EAAKQ,UAAW,CAClB,MAAM/B,EAAQuB,EAAKmD,WAAWkF,EAAS,GACvC,IAAK5J,IAAUA,EAAMkC,OACnB,OAEFX,EAAOvB,EACP4J,EAASrI,EAAKqC,OAAOxI,MACtB,CACD,KAAIwO,EAAS,GAGb,MAAO,CACLrI,OACAqI,SAdD,CAgBH,CAsGkBqzD,CAAiB5hC,GAC/B,IAAKyc,EACH,OAEF,GA7FJ,SAA4Bzc,EAAgByc,GAC1C,MAAMxnB,EAAY+K,EAAO/K,UACnBtmB,EAAQsmB,EAAUtmB,MAClBJ,EAASkuC,EAAMluC,OACfhG,EAAOk0C,EAAMv2C,KAAKqC,OAAOyW,MAAM,EAAGzQ,GACxC,IAAK,MAAMtD,KAAQ40D,GAAc,CAC/B,MAAMG,EAAU/0D,EAAKvI,GAAGE,KAAK2F,GAC7B,GAAgB,OAAZy3D,EAAkB,CAMpBhgC,EAAOX,mBACP,MAAMjU,EAAW6J,EAAUpK,iBACrB3kB,EAAOklB,EAAS5f,MAAM5B,OACtBi4D,EAAW37D,EAAKqC,OAChBu5D,EAAW,GAAGD,EAAS5hE,QAAQgL,EAAKvI,GAAI,SAC9CwD,EAAK3F,IAAI,GAAGgN,UAAYu0D,EACxBnzD,EAAMwB,SAASjK,EAAMqI,EAASyxD,EAAQ,GAAGjgE,QACzC4O,EAAM6B,OAAOtK,EAAMqI,GAAUszD,EAAS9hE,OAAS+hE,EAAS/hE,QAAU,GAClE,MAAMgiE,EAAa92D,EAAK60D,gBAIxB,OAHA9/B,EAAOnC,QAAQlH,QAAQorC,EAAW5mC,WAAsB4mC,GACxD9sC,EAAU9J,WAAWC,GACrB4U,EAAOV,mBACA,CACR,CACF,CACD,OAAO,CACT,CAgEQ0iC,CAAmBhiC,EAAQyc,GAE7B,YADApxC,EAAM8iB,iBAGR,MAAM1kB,EAAQkF,EAAM6D,YAAY,GAC3B/I,IAGCA,EAAMtC,WAA4B,MAAfsC,EAAMjD,OAtEnC,SAAsCw5B,EAAgByc,GACpD,MAAMxnB,EAAY+K,EAAO/K,UACnB1mB,EAASkuC,EAAMluC,OACrB,IAAIhG,EAAOk0C,EAAMv2C,KAAKqC,OAAOyW,MAAM,EAAGzQ,GACtChG,EAAOA,EAAKtI,QAAQ,kBAAmB,IACvC,IAAK,MAAMgL,KAAQ80D,GAA0B,CAC3C,MAAMC,EAAU/0D,EAAKvI,GAAGE,KAAK2F,GAC7B,GAAgB,OAAZy3D,EAAkB,CAIpBhgC,EAAOX,mBACP,MAAMjU,EAAW6J,EAAUpK,iBACdO,EAAS5f,MAAM5B,OACvB6C,SACL,MAAMhD,EAAQ2hB,EAAS5f,MAAMlC,eAC7B42D,GAAcz2D,GACdwrB,EAAUtmB,MAAM0C,YAAY5H,GAC5B,MAAMs4D,EAAa92D,EAAK60D,cAAcE,GAItC,OAHAhgC,EAAOnC,QAAQlH,QAAQorC,EAAW5mC,WAAsB4mC,GACxD9sC,EAAU9J,WAAWC,GACrB4U,EAAOV,mBACA,CACR,CACF,CACD,OAAO,CACT,CA+CQ2iC,CAA6BjiC,EAAQyc,IACvCpxC,EAAM8iB,gBACP,IAEH6R,EAAOtB,UAAUvC,WAAW,SAAS9wB,IACnC,MACMsD,EADYqxB,EAAO/K,UACDtmB,MACxB,GAAIA,EAAMpH,MACR,OAEF,MAAMkC,EAAQkF,EAAM6D,YAAY,GAChC,OAAK/I,IAGCA,EAAMtC,WAA4B,MAAfsC,EAAMjD,MAG3BiD,EAAMhB,KAAK,YAAY1I,OAAS,GAGP,KAAzB4O,EAAMsE,oBATV,EAxDJ,SAAsC+sB,EAAgBv2B,GACpD,MAAMwrB,EAAY+K,EAAO/K,UACzB,IAAI1sB,EAAOkB,EAAMlB,OACjBA,EAAOA,EAAKtI,QAAQ,kBAAmB,IACvC,IAAK,MAAMgL,KAAQg1D,GAA0B,CAC3C,MAAMD,EAAU/0D,EAAKvI,GAAGE,KAAK2F,GAC7B,GAAgB,OAAZy3D,EAAkB,CAIpBhgC,EAAOX,mBACP51B,EAAMiE,QACNwyD,GAAcz2D,GACdwrB,EAAUtmB,MAAM0C,YAAY5H,GAC5B,MAAMs4D,EAAa92D,EAAK60D,cAAcE,GAGtC,OAFAhgC,EAAOnC,QAAQlH,QAAQorC,EAAW5mC,WAAsB4mC,GACxD/hC,EAAOV,mBACA,CACR,CACF,CACD,OAAO,CACT,CA+CQ4iC,CAA6BliC,EAAQv2B,IACvC4B,EAAM8iB,iBACN9iB,EAAM82D,4BAEC,QAJT,CAKC,GACD,IKlNJnlC,GAAO6C,OAAOtzB,KJlDEyzB,IACdA,EAAOtB,UAAUvC,WAAW,SAAS9wB,IACnC,MAAMsD,EAAQqxB,EAAO/K,UAAUtmB,MAC/B,GAAIA,EAAMkB,YACR,OAIF,GAFAxE,EAAM8iB,iBACN6R,EAAO7B,iBACHxvB,EAAMpH,MAGR,OAFA64D,GAA2BpgC,QAC3BA,EAAOvB,QAAQzD,OAIjB,GADArsB,EAAMsD,QACFtD,EAAMmB,cACR,OAEF,GAAInB,EAAMpH,MAGR,OAFA64D,GAA2BpgC,QAC3BA,EAAOvB,QAAQzD,OAGjB,IAAIvxB,EAAQkF,EAAM6D,YAAY,GAK9B,GAJK/I,IACHu2B,EAAO/K,UAAUnJ,UAAU,SAC3BriB,EAAQkF,EAAM6D,YAAY,IAExB/I,EAAMpB,SAA0B,MAAfoB,EAAMjD,KAGzB,OAFAw5B,EAAO/K,UAAUnJ,UAAU,cAC3BkU,EAAOvB,QAAQzD,OAGjB3O,GAAW2T,EAAQv2B,GACnBu2B,EAAOvB,QAAQzD,MAAM,GACrB,IIiBJgC,GAAO6C,OAAOtzB,KHxDEyzB,IACdA,EAAOtB,UAAUvC,WAAW,eAAe9wB,IACzC,MAAMsD,EAAQqxB,EAAO/K,UAAUtmB,MAC/B,IAAIA,EAAMkB,YAAV,CAKA,GAFAmwB,EAAO7B,iBACP9yB,EAAM8iB,iBACFxf,EAAMpH,MAGR,OAFA+4D,GAA0BtgC,QAC1BA,EAAOvB,QAAQzD,OAIjB,GADArsB,EAAMsD,SACFtD,EAAMmB,cAAV,CAGA,GAAInB,EAAMpH,MAGR,OAFA+4D,GAA0BtgC,QAC1BA,EAAOvB,QAAQzD,OAGjBqlC,GAAargC,GACbA,EAAOvB,QAAQzD,MAPd,CAXA,CAkBoB,GACrB,IGiCJgC,GAAO6C,OAAOtzB,KF9DEyzB,IACdA,EAAOtB,UAAUvC,WAAW,aAAa9wB,IACvC,MAAMsD,EAAQqxB,EAAO/K,UAAUtmB,MAC/B,GAAIA,EAAMkB,YACR,OAGF,GADAmwB,EAAO7B,iBACHxvB,EAAMY,UAAW,CACnB,MAAM/F,EAAUmF,EAAME,UAAU/G,QAAQ,YAClCqK,EAAW3I,EAAQI,OACzB,GAAwB,IAApBuI,EAASpS,OAAc,CACzB,MAAM0J,EAAQD,EAAQF,eAMtB,YALIG,EAAM1J,OAAS,IAAM0J,EAAM9B,cAC7B0D,EAAM8iB,iBACNoyC,GAAuBvgC,EAAQv2B,GAC/Bu2B,EAAOvB,QAAQzD,QAGlB,CACD,GAAI7oB,EAASpL,QACX,OAAIoL,EAAS9J,SACXgD,EAAM8iB,iBACNhc,EAAS1F,SACTuzB,EAAO/K,UAAUzJ,eACjBwU,EAAOvB,QAAQzD,SAGjB3vB,EAAM8iB,sBACNxf,EAAM0C,YAAYc,IAGpBxD,EAAM4C,UACP,CACD,GAAI5C,EAAMpH,MAIR,OAHA8D,EAAM8iB,iBACN6R,EAAOJ,iBACPI,EAAOvB,QAAQzD,OAGjB,IAAKrsB,EAAMU,YAOT,OANAhE,EAAM8iB,iBACN6R,EAAO/K,UAAUxJ,iBACsB,KAAnCuU,EAAOx7B,UAAU8I,OAAOxK,QAC1Bk9B,EAAOrR,SAAS,+BAElBqR,EAAOvB,QAAQzD,OAGjBrsB,EAAMsD,QACN,MAAME,EAAWxD,EAAMuD,cACvB,GAAIC,EAAS5K,MAKX,OAJA8D,EAAM8iB,iBACNxf,EAAMoC,UAAUoB,GAChB6tB,EAAOJ,iBACPI,EAAOvB,QAAQzD,OAGjB,GAAsB,OAAlB7oB,EAAS3L,MAAiB2L,EAASvI,OAAO7J,OAAS,EAMrD,OALAsL,EAAM8iB,iBACNxf,EAAMyB,eAAe+B,GACrBxD,EAAM0B,kBACN8B,EAAS1F,cACTuzB,EAAOvB,QAAQzD,OAIjB,GAAiB,KADArsB,EAAMmE,cACF,CACnBzH,EAAM8iB,iBACN,IAAI1kB,EAAQkF,EAAM6D,YAAY,GAK9B,GAJK/I,IACHu2B,EAAO/K,UAAUnJ,UAAU,SAC3BriB,EAAQkF,EAAM6D,YAAY,IAGG,KAA7B/I,EAAMkD,IAAI,gBACmB,KAA7BlD,EAAMkD,IAAI,gBACe,KAAzBlD,EAAMhC,KAAK,UAIX,OAFAyN,EAAezL,EAAO,iBACtBu2B,EAAOvB,QAAQzD,OAGjB,GAAIvxB,EAAMrC,QAAyB,eAAfqC,EAAMjD,KAGxB,OAFAw5B,EAAO/K,UAAUnJ,UAAU,cAC3BkU,EAAOvB,QAAQzD,OAGjBulC,GAAuBvgC,EAAQv2B,GAC/Bu2B,EAAOvB,QAAQzD,MAChB,IACD,IE3BJgC,GAAO6C,OAAOtzB,KDxEEyzB,IACdA,EAAOtB,UAAUvC,WAAW,UAAU9wB,IACpC,MAAMsD,EAAQqxB,EAAO/K,UAAUtmB,MAC/B,GAAIA,EAAMkB,YACR,OAGF,GADAmwB,EAAO7B,iBACHxvB,EAAMgB,WAAY,CACpB,MAAMnG,EAAUmF,EAAME,UAAU/G,QAAQ,YAClC2C,EAAWjB,EAAQM,OACzB,GAAwB,IAApBW,EAAS1K,OAAc,CACzB,MAAM0J,EAAQD,EAAQF,eAMtB,YALIG,EAAM1J,OAAS,IAAM0J,EAAM9B,cAC7B0D,EAAM8iB,iBACNsyC,GAAmBzgC,EAAQv2B,GAC3Bu2B,EAAOvB,QAAQzD,QAGlB,CACD,GAAIvwB,EAAS1D,QACX,OAAI0D,EAASpC,SACXgD,EAAM8iB,iBACN1jB,EAASgC,SACTuzB,EAAO/K,UAAUzJ,eACjBwU,EAAOvB,QAAQzD,SAGjB3vB,EAAM8iB,sBACNxf,EAAMyC,aAAa3G,IAGrBkE,EAAM4C,UACP,CACD,GAAI5C,EAAMpH,MAIR,OAHA8D,EAAM8iB,iBACN6R,EAAOJ,iBACPI,EAAOvB,QAAQzD,OAGjB,IAAKrsB,EAAMU,YAOT,OANAhE,EAAM8iB,iBACN6R,EAAO/K,UAAUxJ,iBACsB,KAAnCuU,EAAOx7B,UAAU8I,OAAOxK,QAC1Bk9B,EAAOrR,SAAS,+BAElBqR,EAAOvB,QAAQzD,OAGjBrsB,EAAMsD,QACN,MAAMxH,EAAWkE,EAAMyD,cACvB,GAAI3H,EAASlD,MAKX,OAJA8D,EAAM8iB,iBACNxf,EAAMoC,UAAUtG,GAChBu1B,EAAOJ,iBACPI,EAAOvB,QAAQzD,OAGK,OAAlBvwB,EAASjE,MAAiBiE,EAASX,OAAO/J,OAAS,IACrDsL,EAAM8iB,iBACNxf,EAAMyB,eAAe3F,GACrBkE,EAAM0B,kBACN5F,EAASgC,SACTuzB,EAAOvB,QAAQzD,QAGjB,GAAkB,KADArsB,EAAMsE,eACF,CACpB5H,EAAM8iB,iBACN,IAAI1kB,EAAQkF,EAAM6D,YAAY,GACzB/I,IACHu2B,EAAO/K,UAAUnJ,UAAU,SAC3BriB,EAAQkF,EAAM6D,YAAY,IAE5BiuD,GAAmBzgC,EAAQv2B,GAC3Bu2B,EAAOvB,QAAQzD,MAChB,IACD,ICFJgC,GAAO6C,OAAOtzB,KsBvGEyzB,IACdA,EAAOtB,UAAUvC,WAAW,OAAO9wB,IACjC,IAAoC,IAAhC20B,EAAOjoB,OAAO4kB,cAChB,OAEFtxB,EAAM8iB,iBACS6R,EAAO/K,UAAUtmB,MAAM6D,YAC/B3R,SAAQ4I,IACM,MAAfA,EAAMjD,MAA6C,QAA7BiD,EAAMkD,IAAI,eAIpClD,EAAMkD,IAAI,cAAe,OAHvBuI,EAAezL,EAAO,WAGO,IAEjCu2B,EAAOvB,QAAQzD,MAAM,GACrB,ItByFJgC,GAAO6C,OAAOtzB,KuBzGEyzB,IACdA,EAAOtB,UAAUvC,WAAW,cAAc9wB,IACxC,MAAMsD,EAAQqxB,EAAO/K,UAAUtmB,MAC/B,GAAIA,EAAMkB,YACR,OAEF,MAAMrG,EAAUmF,EAAMQ,eAAerH,QAAQ,YAC7C,GAAI0B,EAAQzJ,OAAS,EAAG,CACtB,GAAI4O,EAAMY,UAAW,CACnB,MAAM4C,EAAW3I,EAAQI,OACzB,OAAIuI,EAASpL,SAAWoL,EAAS5K,OAC/B8D,EAAM8iB,iBACFhc,EAAS3K,iBACXmH,EAAMoC,UAAUoB,QAGlBxD,EAAM0C,YAAYc,KAGpBxD,EAAMyB,eAAe5G,QACrBmF,EAAM0B,kBAEP,CACD,OAAI1B,EAAMgB,YACRtE,EAAM8iB,sBACNxf,EAAMoC,UAAUvH,KAGlB6B,EAAM8iB,sBACNxf,EAAMsC,cAAczH,GAErB,CACD,IAAKmF,EAAMU,YACT,OAEF,MAAM8C,EAAWxD,EAAMuD,cACnBC,EAAS5K,QACX8D,EAAM8iB,iBACNxf,EAAMoC,UAAUoB,GACjB,IAEH6tB,EAAOtB,UAAUvC,WAAW,eAAe9wB,IACzC,MAAMsD,EAAQqxB,EAAO/K,UAAUtmB,MAC/B,GAAIA,EAAMkB,YACR,OAEF,MAAMrG,EAAUmF,EAAMQ,eAAerH,QAAQ,YAC7C,GAAI0B,EAAQzJ,OAAS,EAAG,CACtB,GAAI4O,EAAMY,UAGR,OAFAlE,EAAM8iB,sBACNxf,EAAMoC,UAAUvH,GAGlB,GAAImF,EAAMgB,WAAY,CACpB,MAAMlF,EAAWjB,EAAQM,OACzB,OAAIW,EAAS1D,SAAW0D,EAASlD,OAC/B8D,EAAM8iB,iBACF1jB,EAASjD,iBACXmH,EAAMoC,UAAUtG,QAGlBkE,EAAMyC,aAAa3G,KAGrBkE,EAAM2B,cAAc9G,QACpBmF,EAAM0B,kBAEP,CAGD,OAFAhF,EAAM8iB,sBACNxf,EAAMwC,eAAe3H,EAEtB,CACD,IAAKmF,EAAMU,YACT,OAEF,MAAM5E,EAAWkE,EAAMyD,cACnB3H,EAASlD,QACX8D,EAAM8iB,iBACNxf,EAAMoC,UAAUtG,GACjB,IAEHu1B,EAAOtB,UAAUvC,WAAW,YAAY9wB,IACtC,MAAMsD,EAAQqxB,EAAO/K,UAAUtmB,MAC/B,GAAIA,EAAMkB,YACR,OAEF,MAAMrG,EAAUmF,EAAMQ,eAAerH,QAAQ,YAC7C,GAAI0B,EAAQzJ,OAAS,EAAG,CACtB,GAAIyJ,EAAQ9B,WAAY,CACtB,MAAMyK,EAAW3I,EAAQI,OACzB,GAAIuI,EAASpL,SAAWoL,EAAS5K,MAG/B,OAFA8D,EAAM8iB,sBACNxf,EAAM0C,YAAYc,EAGrB,CACDxD,EAAMyB,eAAe5G,GACrBmF,EAAM0B,iBACP,KAEH2vB,EAAOtB,UAAUvC,WAAW,cAAc9wB,IACxC,MAAMsD,EAAQqxB,EAAO/K,UAAUtmB,MAC/B,GAAIA,EAAMkB,YACR,OAEF,MAAMrG,EAAUmF,EAAMQ,eAAerH,QAAQ,YAC7C,GAAI0B,EAAQzJ,OAAS,EAAG,CACtB,GAAIyJ,EAAQ9B,WAAY,CACtB,MAAM+C,EAAWjB,EAAQM,OACzB,GAAIW,EAAS1D,SAAW0D,EAASlD,MAG/B,OAFA8D,EAAM8iB,sBACNxf,EAAMyC,aAAa3G,EAGtB,CACDkE,EAAM2B,cAAc9G,GACpBmF,EAAM0B,iBACP,IACD,qI3ChEF,WAAApK,CAAY8R,GACV5R,KAAKstC,MAAQ17B,EAAO07B,OAASrK,GAC7BjjC,KAAK65B,OAASjoB,EAAOioB,OACrB75B,KAAK2nB,KAAOrf,EAAMsJ,EAAO+V,MACzB3nB,KAAK3B,UAAYiK,EAAM,gCAEvBtI,KAAK2nB,KAAKzhB,SAAS,yBACpB,CAEO,aAAA+1D,GACNj8D,KAAK3B,UAAUsJ,OAAO,uCACvB,CAEO,YAAAu0D,CAAap3D,GACnB,MAAM+0B,EAAS75B,KAAK65B,OACL,IAAInS,GAAO,CACxBC,KAAM3nB,KAAK3B,UACXgC,KAAMyE,EAAKzE,KACX0nB,KAAMjjB,EAAKijB,KACXD,QAAShjB,EAAKgjB,QACdF,UAAW,EACXK,QAAS,KACP4R,EAAOx0B,QACPP,EAAKmjB,QAAQ4R,EAAQ/0B,EAAKzE,KAAK,IAG5B8f,QACR,CAEO,cAAAg8C,CAAer3D,GACrB,MAAM+0B,EAAS75B,KAAK65B,OACH,IAAI3R,GAAS,CAC5BP,KAAM3nB,KAAK3B,UACXgC,KAAMyE,EAAKzE,KACX0nB,KAAMjjB,EAAKijB,KACXkC,WAAYnlB,EAAKmlB,WACjBD,SAAUllB,EAAKklB,SACfH,aAAc/kB,EAAK+kB,aACnB/B,QAAQhjB,EAAKgjB,QACbrhB,MAAO3B,EAAK2B,MACZ6hB,SAAUxjB,EAAKwjB,SACfI,UAAW5jB,EAAK4jB,UAChBd,UAAW,EACXkC,SAAU7vB,IACR4/B,EAAOx0B,QACPP,EAAKglB,SAAS+P,EAAQ5/B,EAAM,IAGvBkmB,QACV,CAEO,YAAAi8C,CAAat3D,GACnB,MAAM+0B,EAAS75B,KAAK65B,OACdwiC,EAAa/zD,EAAMjO,CAAY;uCACFyK,EAAKzE;;;OAIlCi8D,EAAWD,EAAW/5D,KAAK,sBAC3Bi6D,EAAiBD,EAASliE,IAAI,GAChC0K,EAAK09B,QACP85B,EAASh7D,KAAK,SAAUwD,EAAK09B,SAET,IAAlB19B,EAAK29B,UACP65B,EAASh7D,KAAK,WAAY,QAEb,IAAIomB,GAAO,CACxBC,KAAM00C,EACNh8D,KAAMyE,EAAKzE,KACX0nB,KAAMjjB,EAAKijB,KACXD,QAAShjB,EAAKgjB,QACdF,UAAW,EACXK,QAAS,KACP4R,EAAOx0B,QACPk3D,EAAe5gB,OAAO,IAGnBx7B,SACPngB,KAAK3B,UAAUsJ,OAAO00D,GACtBC,EAAS/3D,GAAG,SAASW,GAASA,EAAMq7C,oBACpC+b,EAAS/3D,GAAG,UAAUW,IACpB,MACMw1D,EADSx1D,EAAM1C,OACAk4D,OAAS,GAC9B,IAAK,MAAM5jD,KAAQ4jD,EACjBh4B,GAAY,CACV7I,SACA/iB,QAEH,GAEJ,CAGM,MAAAqJ,GACL,MAAM0Z,EAAS75B,KAAK65B,OACpB75B,KAAK2nB,KAAKpgB,QACVvH,KAAK2nB,KAAKhgB,OAAO3H,KAAK3B,WACtB,MAAMm+D,EAA+C,IAAIljE,IACnDmjE,EAAsC,GACtCC,EAA0C,GAChD18D,KAAKstC,MAAM5yC,SAAQ2F,IACjB,GAAa,MAATA,EAEF,YADAL,KAAKi8D,gBAGP,IAAIn3D,EACJ,GAAoB,iBAATzE,GAET,GADAyE,EAAOo+B,GAAe9oC,IAAIiG,IACrByE,EACH,YAGFA,EAAOzE,EAET,MAAkB,WAAdyE,EAAKN,MACPi4D,EAAez+D,KAAK8G,QACpB9E,KAAKk8D,aAAap3D,IAGF,aAAdA,EAAKN,MACPg4D,EAAWjrD,IAAIzM,EAAKzE,KAAM6nB,GAASO,WAAW3jB,EAAK4jB,YACnDg0C,EAAiB1+D,KAAK8G,QACtB9E,KAAKm8D,eAAer3D,SAGJ,WAAdA,EAAKN,MACPxE,KAAKo8D,aAAat3D,GACnB,IAEH+0B,EAAO30B,MAAMX,GAAG,eAAejF,UAC7B,MAAMqwB,aAAEA,EAAYgI,gBAAEA,EAAeC,gBAAEA,EAAeC,kBAAEA,GAAsBv4B,EAC9E,IAAK,MAAMwF,KAAQ23D,EAAgB,CACjC,MAAME,EAAgB,uBAChB90C,EAAa7nB,KAAK3B,UAAUiE,KAAK,gBAAgBwC,EAAKzE,UAC5D,IAAIgwB,EAAasH,EAAgBv9B,IAAI0K,EAAKzE,MAU1C,QATmBlF,IAAfk1B,IACFA,KAAavrB,EAAKurB,YAAcV,EAAa/1B,OAAS,IAAIkL,EAAKurB,WAAWV,IAExEU,GACFxI,EAAWvmB,KAAK,WAAY,QAC5BumB,EAAWxhB,YAAYs2D,IAEvB90C,EAAW/hB,WAAW,aAEnBuqB,EAAY,CACf,IAAIC,EAAasH,EAAgBx9B,IAAI0K,EAAKzE,WACvBlF,IAAfm1B,IACFA,KAAaxrB,EAAKwrB,YAAcX,EAAa/1B,OAAS,IAAIkL,EAAKwrB,WAAWX,IAExEW,EACFzI,EAAW3hB,SAASy2D,GAEpB90C,EAAWxhB,YAAYs2D,EAE1B,CACF,CACD,IAAK,MAAM73D,KAAQ43D,EAAkB,CACnC,IAAInsC,EAAiBsH,EAAkBz9B,IAAI0K,EAAKzE,WACzBlF,IAAnBo1B,IACFA,EAAiBzrB,EAAKyrB,gBAAkBZ,EAAa/1B,OAAS,EAAIkL,EAAKyrB,eAAeZ,GAAgB,IAExG,MAAMrG,EAAetpB,KAAK3B,UAAUiE,KAAK,2BAA2BwC,EAAKzE,UACzE,IAAIgwB,EAAasH,EAAgBv9B,IAAI0K,EAAKzE,MAS1C,QARmBlF,IAAfk1B,IACFA,KAAavrB,EAAKurB,YAAcV,EAAa/1B,OAAS,IAAIkL,EAAKurB,WAAWV,IAExEU,EACF/G,EAAahoB,KAAK,WAAY,QAE9BgoB,EAAaxjB,WAAW,aAErBuqB,EAAY,CACfnI,GAASM,SAASc,EAAciH,GAChC,MAAMtyB,EAAWqrB,EAAahnB,KAAK,uBACnC,GAAIrE,EAASrE,OAAS,EAAG,CACvB,MAAM8C,EAAM6zB,EAAe,IAAMzrB,EAAK+kB,aAChClB,EAAU6zC,EAAWpiE,IAAI0K,EAAKzE,MAC9B+B,EAAoC,QAA7BjI,EAACwuB,GAAWA,EAAQvuB,IAAIsC,UAAK,IAAAvC,EAAAA,EAAIuC,EAC9CuB,EAASmE,KAAKA,EACf,CACF,CACF,IAEJ","x_google_ignoreList":[35,36,58,59,60,61,62,63,64,65,66,67,68,69,70,71,74,77,84,85,86,87,97,98,99]}
1
+ {"version":3,"file":"lake.min.js","sources":["../../src/elements/box.ts","../../src/elements/bookmark.ts","../../src/icons/index.ts","../../src/utils/template.ts","../../src/utils/encode.ts","../../src/utils/safe-template.ts","../../src/utils/camel-case.ts","../../src/utils/in-string.ts","../../src/utils/to-hex.ts","../../src/utils/parse-style.ts","../../src/utils/normalize-value.ts","../../src/utils/denormalize-value.ts","../../src/utils/modifier-text.ts","../../src/utils/for-each.ts","../../src/utils/get-css.ts","../../src/utils/to-node-list.ts","../../src/types/native.ts","../../src/config/tag-names.ts","../../src/utils/debug.ts","../../src/models/nodes.ts","../../src/utils/query.ts","../../src/models/range.ts","../../src/utils/split-nodes.ts","../../src/utils/append-deepest.ts","../../src/utils/remove-br.ts","../../src/utils/merge-nodes.ts","../../src/utils/get-deepest.ts","../../src/utils/wrap-node-list.ts","../../src/utils/remove-zws.ts","../../src/utils/change-tag-name.ts","../../src/utils/fix-numbered-list.ts","../../src/utils/set-block-indent.ts","../../src/utils/morph.ts","../../src/utils/request.ts","../../src/models/fragment.ts","../node_modules/.pnpm/js-base64@3.7.7/node_modules/js-base64/base64.mjs","../node_modules/.pnpm/eventemitter3@5.0.1/node_modules/eventemitter3/index.js","../../src/storage/boxes.ts","../../src/storage/editors.ts","../../src/models/box.ts","../../src/config/element-rules.ts","../../src/parsers/html-parser.ts","../../src/parsers/text-parser.ts","../../src/operations/insert-node.ts","../../src/operations/insert-bookmark.ts","../../src/operations/to-bookmark.ts","../../src/operations/fix-list.ts","../../src/operations/delete-contents.ts","../../src/operations/insert-fragment.ts","../../src/operations/insert-contents.ts","../../src/operations/set-blocks.ts","../../src/operations/split-block.ts","../../src/operations/split-marks.ts","../../src/operations/add-mark.ts","../../src/operations/remove-mark.ts","../../src/operations/insert-link.ts","../../src/ui/button.ts","../../src/ui/dropdown.ts","../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/isObject.js","../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_root.js","../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_freeGlobal.js","../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/now.js","../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_trimmedEndIndex.js","../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_baseTrim.js","../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_Symbol.js","../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_getRawTag.js","../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_objectToString.js","../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_baseGetTag.js","../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/isObjectLike.js","../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/isSymbol.js","../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/toNumber.js","../node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/debounce.js","../../src/managers/selection.ts","../../src/managers/command.ts","../node_modules/.pnpm/blueimp-md5@2.19.0/node_modules/blueimp-md5/js/md5.js","../../src/storage/box-instances.ts","../../src/managers/history.ts","../node_modules/.pnpm/tinykeys@2.1.0/node_modules/tinykeys/dist/tinykeys.module.js","../../src/managers/keystroke.ts","../../src/editor.ts","../../src/operations/insert-box.ts","../../src/operations/remove-box.ts","../../src/managers/box-manager.ts","../../src/managers/plugin.ts","../node_modules/.pnpm/typesafe-i18n@5.26.2_typescript@5.4.4/node_modules/typesafe-i18n/runtime/esm/parser/src/basic.mjs","../node_modules/.pnpm/typesafe-i18n@5.26.2_typescript@5.4.4/node_modules/typesafe-i18n/runtime/esm/runtime/src/core.mjs","../node_modules/.pnpm/typesafe-i18n@5.26.2_typescript@5.4.4/node_modules/typesafe-i18n/runtime/esm/runtime/src/util.object.mjs","../node_modules/.pnpm/typesafe-i18n@5.26.2_typescript@5.4.4/node_modules/typesafe-i18n/runtime/esm/runtime/src/util.string.mjs","../../src/i18n/index.ts","../../src/i18n/en-US/index.ts","../../src/i18n/zh-CN/index.ts","../../src/i18n/ja/index.ts","../../src/i18n/ko/index.ts","../../src/config/menu-items.ts","../../src/config/toolbar-items.ts","../../src/ui/upload.ts","../../src/ui/toolbar.ts","../node_modules/.pnpm/@rollup+plugin-typescript@11.1.6_rollup@4.14.0_tslib@2.6.2_typescript@5.4.4/node_modules/tslib/tslib.es6.js","../node_modules/.pnpm/photoswipe@5.4.3/node_modules/photoswipe/dist/photoswipe-lightbox.esm.js","../node_modules/.pnpm/photoswipe@5.4.3/node_modules/photoswipe/dist/photoswipe.esm.js","../../src/boxes/image.ts","../../src/boxes/code-block.ts","../../src/plugins/paste.ts","../../src/plugins/list.ts","../../src/plugins/align.ts","../../src/plugins/bold.ts","../../src/plugins/subscript.ts","../../src/plugins/superscript.ts","../../src/plugins/code.ts","../../src/plugins/format-painter.ts","../../src/ui/link-popup.ts","../../src/plugins/markdown.ts","../../src/plugins/enter-key.ts","../../src/plugins/shift-enter-key.ts","../../src/plugins/backspace-key.ts","../../src/plugins/delete-key.ts","../../src/index.ts","../../src/boxes/hr.ts","../../src/plugins/copy.ts","../../src/plugins/cut.ts","../../src/plugins/undo.ts","../../src/plugins/redo.ts","../../src/plugins/select-all.ts","../../src/plugins/heading.ts","../../src/plugins/block-quote.ts","../../src/plugins/indent.ts","../../src/plugins/italic.ts","../../src/plugins/underline.ts","../../src/plugins/strikethrough.ts","../../src/plugins/font-family.ts","../../src/plugins/font-size.ts","../../src/plugins/font-color.ts","../../src/plugins/highlight.ts","../../src/plugins/remove-format.ts","../../src/plugins/link.ts","../../src/plugins/hr.ts","../../src/plugins/image.ts","../../src/plugins/code-block.ts","../../src/plugins/tab-key.ts","../../src/plugins/arrow-keys.ts","../../src/plugins/escape-key.ts"],"sourcesContent":["class BoxElement extends HTMLElement {\n\n}\n\ncustomElements.define('lake-box', BoxElement);\n","class BookmarkElement extends HTMLElement {\n\n}\n\ncustomElements.define('lake-bookmark', BookmarkElement);\n","// These icons are from open source projects.\n//\n// Fluent Icons by Microsoft (https://fluenticons.co/).\n// - superscript.svg\n// - subscript.svg\n// - highlight.svg\n// - highlight-accent.svg\n// - open.svg\n//\n// Phosphor Icons (https://phosphoricons.com/).\n// - other icons\n\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-nocheck\n// basic\nimport plus from './plus.svg';\nimport more from './more.svg';\nimport left from './left.svg';\nimport right from './right.svg';\nimport down from './down.svg';\nimport check from './check.svg';\nimport checkCircle from './check-circle.svg';\nimport warningCircle from './warning-circle.svg';\nimport open from './open.svg';\nimport copy from './copy.svg';\nimport remove from './remove.svg';\nimport maximize from './maximize.svg';\nimport close from './close.svg';\nimport zoomIn from './zoom-in.svg';\nimport zoomOut from './zoom-out.svg';\nimport circleNotch from './circle-notch.svg';\nimport selectAll from './select-all.svg';\nimport undo from './undo.svg';\nimport redo from './redo.svg';\n// block format\nimport heading from './heading.svg';\nimport heading1 from './heading1.svg';\nimport heading2 from './heading2.svg';\nimport heading3 from './heading3.svg';\nimport heading4 from './heading4.svg';\nimport heading5 from './heading5.svg';\nimport heading6 from './heading6.svg';\nimport paragraph from './paragraph.svg';\nimport blockQuote from './block-quote.svg';\nimport list from './list.svg';\nimport numberedList from './numbered-list.svg';\nimport bulletedList from './bulleted-list.svg';\nimport checklist from './checklist.svg';\nimport alignLeft from './align-left.svg';\nimport alignCenter from './align-center.svg';\nimport alignRight from './align-right.svg';\nimport alignJustify from './align-justify.svg';\nimport increaseIndent from './increase-indent.svg';\nimport decreaseIndent from './decrease-indent.svg';\n// mark format\nimport formatPainter from './format-painter.svg';\nimport bold from './bold.svg';\nimport italic from './italic.svg';\nimport underline from './underline.svg';\nimport strikethrough from './strikethrough.svg';\nimport superscript from './superscript.svg';\nimport subscript from './subscript.svg';\nimport code from './code.svg';\nimport removeFormat from './remove-format.svg';\nimport moreStyle from './more-style.svg';\nimport fontColor from './font-color.svg';\nimport fontColorAccent from './font-color-accent.svg';\nimport highlight from './highlight.svg';\nimport highlightAccent from './highlight-accent.svg';\n// items that can be inserted\nimport link from './link.svg';\nimport unlink from './unlink.svg';\nimport hr from './hr.svg';\nimport image from './image.svg';\nimport codeBlock from './code-block.svg';\nimport table from './table.svg';\n\nexport const icons: Map<string, string> = new Map([\n ['plus', plus],\n ['more', more],\n ['left', left],\n ['right', right],\n ['down', down],\n ['check', check],\n ['checkCircle', checkCircle],\n ['warningCircle', warningCircle],\n ['open', open],\n ['copy', copy],\n ['remove', remove],\n ['maximize', maximize],\n ['close', close],\n ['zoomIn', zoomIn],\n ['zoomOut', zoomOut],\n ['circleNotch', circleNotch],\n ['selectAll', selectAll],\n ['undo', undo],\n ['redo', redo],\n ['heading', heading],\n ['heading1', heading1],\n ['heading2', heading2],\n ['heading3', heading3],\n ['heading4', heading4],\n ['heading5', heading5],\n ['heading6', heading6],\n ['paragraph', paragraph],\n ['blockQuote', blockQuote],\n ['list', list],\n ['numberedList', numberedList],\n ['bulletedList', bulletedList],\n ['checklist', checklist],\n ['alignLeft', alignLeft],\n ['alignCenter', alignCenter],\n ['alignRight', alignRight],\n ['alignJustify', alignJustify],\n ['increaseIndent', increaseIndent],\n ['decreaseIndent', decreaseIndent],\n ['formatPainter', formatPainter],\n ['bold', bold],\n ['italic', italic],\n ['underline', underline],\n ['strikethrough', strikethrough],\n ['superscript', superscript],\n ['subscript', subscript],\n ['code', code],\n ['removeFormat', removeFormat],\n ['moreStyle', moreStyle],\n ['fontColor', fontColor],\n ['fontColorAccent', fontColorAccent],\n ['highlight', highlight],\n ['highlightAccent', highlightAccent],\n ['link', link],\n ['unlink', unlink],\n ['hr', hr],\n ['image', image],\n ['codeBlock', codeBlock],\n ['table', table],\n]);\n","export function template(strings: TemplateStringsArray, ...keys: any[]): string {\n let content = strings[0];\n for (let i = 0; i < keys.length; i++) {\n const key = String(keys[i]);\n content += key;\n content += strings[i + 1];\n }\n content = content.\n replace(/^\\s+/gm, '').\n replace(/\\s+$/gm, '').\n replace(/[\\r\\n]/g, '');\n return content;\n}\n","const characterMap = new Map([\n ['&', '&amp;'],\n ['<', '&lt;'],\n ['>', '&gt;'],\n ['\"', '&quot;'],\n ['\\xA0', '&nbsp;'],\n]);\n\n// Converts all of the reserved characters in the specified string to HTML entities.\nexport function encode(value: string): string {\n return value.replace(/[&<>\"\\xA0]/g, match => characterMap.get(match) ?? '');\n}\n","import { encode } from './encode';\n\nexport function safeTemplate(strings: TemplateStringsArray, ...keys: any[]): string {\n let content = strings[0];\n for (let i = 0; i < keys.length; i++) {\n const key = String(keys[i]);\n // Escape special characters in the substitution.\n content += encode(key);\n // Don't escape special characters in the template.\n content += strings[i + 1];\n }\n content = content.\n replace(/^\\s+/gm, '').\n replace(/\\s+$/gm, '').\n replace(/[\\r\\n]/g, '');\n return content;\n}\n","export function camelCase(value: string): string {\n const valueList = value.split('-');\n let camelString = '';\n valueList.forEach((val, index) => {\n camelString += (index > 0) ? val.charAt(0).toUpperCase() + val.substring(1) : val;\n });\n return camelString;\n}\n","// Search for a specified value within an string and return true or false (false if not found).\nexport function inString(string: string, value: string, delimiter?: string): boolean {\n if (delimiter === undefined) {\n delimiter = ',';\n }\n return (delimiter + string + delimiter).indexOf(delimiter + value + delimiter) >= 0;\n}\n","// Converts an alpha value to a hex value.\nfunction alphaToHex(value: string): string {\n const hexString = Math.round(Number.parseFloat(value) * 255).toString(16);\n return hexString.length > 1 ? hexString : `0${hexString}`;\n}\n\n// Converts a decimal to a hex value.\nfunction hex(value: string): string {\n const hexString = Number.parseInt(value, 10).toString(16).toLowerCase();\n return hexString.length > 1 ? hexString : `0${hexString}`;\n}\n\n// Converting colors in RGB or RGBA format to hex format.\nexport function toHex(value: string): string {\n return value.replace(\n /rgba?\\s*\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*(?:,\\s*([\\d.]+)\\s*)?\\)/ig,\n (match, p1, p2, p3, p4) => {\n if (p4 === undefined) {\n return `#${hex(p1)}${hex(p2)}${hex(p3)}`;\n }\n return `#${hex(p1)}${hex(p2)}${hex(p3)}${alphaToHex(p4)}`;\n },\n );\n}\n","import { KeyValue } from '../types/object';\nimport { toHex } from './to-hex';\n\nexport function parseStyle(styleValue: string): KeyValue {\n styleValue = styleValue.replace(/&quot;/ig, '\"');\n const properties: KeyValue = {};\n const re = /\\s*([\\w-]+)\\s*:([^;]*)(;|$)/g;\n let result;\n while ((result = re.exec(styleValue)) !== null) {\n const key = result[1].toLowerCase().trim();\n const val = toHex(result[2]).trim();\n properties[key] = val;\n }\n return properties;\n}\n","// Converts the special tags to ordinary HTML tags that can be parsed by browser.\nexport function normalizeValue(value: string): string {\n return value.\n replace(/(<lake-box[^>]+>)[\\s\\S]*?(<\\/lake-box>)/ig, '$1$2').\n replace(/<anchor\\s*\\/>/ig, '<lake-bookmark type=\"anchor\"></lake-bookmark>').\n replace(/<focus\\s*\\/>/ig, '<lake-bookmark type=\"focus\"></lake-bookmark>');\n}\n","// Converts the custom HTML tags to the special tags that can not be parsed by browser.\nexport function denormalizeValue(value: string): string {\n return value.\n replace(/(<lake-box[^>]+>)[\\s\\S]*?(<\\/lake-box>)/ig, '$1$2').\n replace(/<lake-bookmark\\s+type=\"anchor\">\\s*<\\/lake-bookmark>/ig, '<anchor />').\n replace(/<lake-bookmark\\s+type=\"focus\">\\s*<\\/lake-bookmark>/ig, '<focus />');\n}\n","// Returns the text of keyboard shortcuts used for a tooltip or help.\n// Mac: mod+Z returns ⌘+Z\n// Windows / Linux: mod+Z returns Ctrl+Z\nexport function modifierText(value: string, userAgent?: string): string {\n userAgent = userAgent ?? navigator.userAgent;\n const isMac = userAgent.indexOf('Mac OS X') >= 0;\n const modText = isMac ? '⌘' : 'Ctrl';\n return value.replace(/(^|\\+|\\s)mod(\\+|\\s|$)/g, `$1${modText}$2`);\n}\n","type CallbackFunction = (key: string, value: any) => boolean | void;\n\nexport function forEach(map: { [key: string]: any }, callback: CallbackFunction): void {\n for (const key in map) {\n if (callback(key, map[key]) === false) {\n break;\n }\n }\n}\n","import { camelCase } from './camel-case';\nimport { toHex } from './to-hex';\n\n// Returns a property value of all CSS properties of an element\nexport function getCSS(element: Element, propertyName: string): string {\n const camelPropertyName = camelCase(propertyName);\n const computedStyle = window.getComputedStyle(element, null);\n const propertyValue = element.style[camelPropertyName] || computedStyle.getPropertyValue(propertyName) || '';\n return toHex(propertyValue);\n}\n","import { NativeNode } from '../types/native';\n\nexport function toNodeList(content: string | NativeNode, valueType?: 'text' | 'html'): NativeNode[] {\n const nodeList: NativeNode[] = [];\n // a node\n if (typeof content !== 'string') {\n nodeList.push(content);\n return nodeList;\n }\n // empty string\n if (content === '') {\n return nodeList;\n }\n // text string\n if (valueType === 'text') {\n const textNode = document.createTextNode(content);\n nodeList.push(textNode);\n return nodeList;\n }\n // HTML string\n if (valueType === 'html' || /<.+>/.test(content)) {\n const container = document.createElement('div');\n container.innerHTML = content;\n for (const child of container.childNodes) {\n nodeList.push(child);\n }\n return nodeList;\n }\n // selector string\n const elements = document.querySelectorAll(content);\n for (const child of elements) {\n nodeList.push(child);\n }\n return nodeList;\n}\n","export type NativeNode = Node;\nexport const NativeNode = Node;\n\nexport type NativeRange = Range;\nexport const NativeRange = Range;\n\nexport type NativeSelection = Selection;\n","export const blockTagNames: Set<string> = new Set([\n 'h1',\n 'h2',\n 'h3',\n 'h4',\n 'h5',\n 'h6',\n 'div',\n 'p',\n 'blockquote',\n 'ul',\n 'ol',\n 'li',\n 'table',\n 'tr',\n 'th',\n 'td',\n]);\n\nexport const markTagNames: Set<string> = new Set([\n 'span',\n 'strong',\n 'em',\n 'i',\n 'u',\n 's',\n 'sup',\n 'sub',\n 'code',\n]);\n\n// https://developer.mozilla.org/en-US/docs/Glossary/Void_element\nexport const voidTagNames: Set<string> = new Set([\n 'area',\n 'base',\n 'br',\n 'col',\n 'embed',\n 'hr',\n 'img',\n 'input',\n 'link',\n 'meta',\n 'param',\n 'source',\n 'track',\n 'wbr',\n]);\n\nexport const headingTagNames: Set<string> = new Set([\n 'h1',\n 'h2',\n 'h3',\n 'h4',\n 'h5',\n 'h6',\n]);\n\n\nexport const listTagNames: Set<string> = new Set([\n 'ol',\n 'ul',\n 'li',\n]);\n\nexport const tableTagNames: Set<string> = new Set([\n 'table',\n 'tr',\n 'td',\n]);\n","/* eslint no-console: \"off\" */\n\nexport function debug(...data: any[]): void {\n if (window.LAKE_DEBUG) {\n console.log.apply(console.log, data);\n }\n}\n","import { KeyValue } from '../types/object';\nimport {\n NativeNode,\n} from '../types/native';\nimport { NodePath } from '../types/node';\nimport {\n blockTagNames, markTagNames, voidTagNames,\n headingTagNames, listTagNames, tableTagNames,\n} from '../config/tag-names';\nimport { forEach } from '../utils/for-each';\nimport { inString } from '../utils/in-string';\nimport { camelCase } from '../utils/camel-case';\nimport { getCSS } from '../utils/get-css';\nimport { toHex } from '../utils/to-hex';\nimport { toNodeList } from '../utils/to-node-list';\nimport { debug } from '../utils/debug';\n\ntype EachCallback = (element: NativeNode, index: number) => boolean | void;\ntype EachElementCallback = (element: Element, index: number) => boolean | void;\n\ntype EventItem = {\n type: string;\n listener: EventListener;\n};\n\n// Is a key-value object for storing all events.\n// value is an array which include types and listeners.\nconst eventData: { [key: number]: EventItem[] } = {};\n\nlet lastNodeId = 0;\n\nexport class Nodes {\n // Returns native nodes that includes element, text node.\n private nodeList: NativeNode[];\n\n // Represents the number of nodes in nodeList.\n public length: number;\n\n constructor(node?: NativeNode | NativeNode[] | null) {\n node = node ?? [];\n this.nodeList = Array.isArray(node) ? node : [node];\n for (let i = 0; i < this.nodeList.length; i++) {\n // lakeId is an expando for preserving node ID.\n // https://developer.mozilla.org/en-US/docs/Glossary/Expando\n if (!this.nodeList[i].lakeId) {\n this.nodeList[i].lakeId = ++lastNodeId;\n }\n }\n this.length = this.nodeList.length;\n }\n\n // Returns node ID at the first index.\n public get id(): number {\n const node = this.get(0);\n return node.lakeId;\n }\n\n // Returns node name at the first index.\n public get name(): string {\n if (this.length === 0) {\n return '';\n }\n const node = this.get(0);\n return node.nodeName.toLowerCase();\n }\n\n // Returns a boolean value indicating whether the node is an element.\n public get isElement(): boolean {\n if (this.length === 0) {\n return false;\n }\n const node = this.get(0);\n return node.nodeType === NativeNode.ELEMENT_NODE;\n }\n\n // Returns a boolean value indicating whether the node is a text node.\n public get isText(): boolean {\n if (this.length === 0) {\n return false;\n }\n const node = this.get(0);\n return node.nodeType === NativeNode.TEXT_NODE;\n }\n\n // Returns a boolean value indicating whether the node is a block element.\n public get isBlock(): boolean {\n if (this.length === 0) {\n return false;\n }\n return blockTagNames.has(this.name);\n }\n\n // Returns a boolean value indicating whether the node is a mark element.\n public get isMark(): boolean {\n if (this.length === 0) {\n return false;\n }\n return markTagNames.has(this.name);\n }\n\n // Returns a boolean value indicating whether the node is a void element.\n public get isVoid(): boolean {\n if (this.length === 0) {\n return false;\n }\n return voidTagNames.has(this.name);\n }\n\n // Returns a boolean value indicating whether the node is a heading element.\n public get isHeading(): boolean {\n if (this.length === 0) {\n return false;\n }\n return headingTagNames.has(this.name);\n }\n\n // Returns a boolean value indicating whether the node is a list element.\n public get isList(): boolean {\n if (this.length === 0) {\n return false;\n }\n return listTagNames.has(this.name);\n }\n\n // Returns a boolean value indicating whether the node is a table element.\n public get isTable(): boolean {\n if (this.length === 0) {\n return false;\n }\n return tableTagNames.has(this.name);\n }\n\n // Returns a boolean value indicating whether the node is a bookmark element.\n public get isBookmark(): boolean {\n return this.name === 'lake-bookmark';\n }\n\n // Returns a boolean value indicating whether the node is a box element.\n public get isBox(): boolean {\n return this.name === 'lake-box';\n }\n\n // Returns a boolean value indicating whether the node is a inline box element.\n public get isInlineBox(): boolean {\n return this.isBox && this.attr('type') === 'inline';\n }\n\n // Returns a boolean value indicating whether the node is a block box element.\n public get isBlockBox(): boolean {\n return this.isBox && this.attr('type') === 'block';\n }\n\n // Returns a boolean value indicating whether the element is a root element of contenteditable area.\n public get isContainer(): boolean {\n if (this.length === 0) {\n return false;\n }\n const node = this.get(0) as HTMLElement;\n return this.isElement && node.getAttribute('contenteditable') === 'true';\n }\n\n // Returns a boolean value indicating whether the node is ouside the container.\n public get isOutside(): boolean {\n return this.closest('[contenteditable=\"true\"]').length === 0;\n }\n\n // Returns a boolean value indicating whether the node is inside the container.\n public get isInside(): boolean {\n return !this.isOutside && !this.isContainer;\n }\n\n // Returns a boolean value indicating whether the node is a top element inside the container.\n public get isTopInside(): boolean {\n if (this.length === 0) {\n return false;\n }\n const parentNode = this.parent();\n if (parentNode.length === 0) {\n return false;\n }\n return this.isInside && parentNode.isContainer;\n }\n\n // Returns a boolean value indicating whether the node is editable or the node is a container.\n public get isContentEditable(): boolean {\n if (this.length === 0) {\n return false;\n }\n if (this.isText) {\n const element = this.get(0).parentNode as HTMLElement;\n if (!element) {\n return false;\n }\n return element.isContentEditable;\n }\n if (!this.isElement) {\n return false;\n }\n const element = this.get(0) as HTMLElement;\n return element.isContentEditable;\n }\n\n // Returns a boolean value indicating whether the node is indivisible.\n public get isIndivisible(): boolean {\n return this.isContainer || this.isTable;\n }\n\n // Returns a boolean value indicating whether the node is empty.\n public get isEmpty(): boolean {\n if (this.isBox) {\n return false;\n }\n const nodeText = this.text();\n const isEmptyText = nodeText === '' || /^[\\r\\n\\u200B\\u2060]+$/.test(nodeText);\n if (this.isElement && isEmptyText) {\n return this.find('lake-box').length === 0;\n }\n return isEmptyText;\n }\n\n // Returns a boolean value indicating whether the node and the target node are siblings.\n public isSibling(target: Nodes): boolean {\n if (this.length === 0) {\n return false;\n }\n const parent = this.get(0).parentNode as HTMLElement;\n return parent && parent === target.parent().get(0);\n }\n\n // Gets a native node at the specified index.\n public get(index: number): NativeNode {\n return this.nodeList[index];\n }\n\n // Gets all native nodes\n public getAll(): NativeNode[] {\n return this.nodeList;\n }\n\n // Reduces the nodes of a Nodes object to the one at the specified index.\n public eq(index: number): Nodes {\n const node = this.get(index);\n return new Nodes(node);\n }\n\n // Iterates over a Nodes object, executing a function for each node.\n public each(callback: EachCallback): this {\n const nodes = this.getAll();\n for (let i = 0; i < nodes.length; i++) {\n if (callback(nodes[i], i) === false) {\n return this;\n }\n }\n return this;\n }\n\n // Iterates over a Nodes object, executing a function for each element.\n public eachElement(callback: EachElementCallback): this {\n const nodes = this.getAll();\n for (let i = 0; i < nodes.length; i++) {\n if (nodes[i].nodeType === NativeNode.ELEMENT_NODE) {\n if (callback(nodes[i] as Element, i) === false) {\n return this;\n }\n }\n }\n return this;\n }\n\n // Reverses the nodes of a Nodes object.\n public reverse(): Nodes {\n const nodes = this.getAll().reverse();\n return new Nodes(nodes);\n }\n\n // Tests whether the element would be selected by the specified CSS selector.\n public matches(selector: string): boolean {\n if (!this.isElement) {\n return false;\n }\n const element = this.get(0) as Element;\n return element.matches(selector);\n }\n\n // Returns the descendants of the first element which are selected by the specified CSS selector.\n public find(selector: string | NodePath): Nodes {\n if (typeof selector === 'string') {\n const element = this.get(0) as Element;\n const nodeList = element.querySelectorAll(selector);\n return new Nodes(Array.from(nodeList));\n }\n let node = this.eq(0);\n for (const index of selector) {\n node = node.children()[index];\n if (!node) {\n return new Nodes();\n }\n }\n return node;\n }\n\n // Traverses the first node and its parents (heading toward the document root)\n // until it finds a element that matches the specified CSS selector.\n public closest(selector: string): Nodes {\n if (this.isText) {\n const element = this.get(0).parentNode;\n if (!element) {\n return new Nodes();\n }\n return new Nodes((element as Element).closest(selector));\n }\n if (!this.isElement) {\n return new Nodes();\n }\n const element = this.get(0) as Element;\n return new Nodes(element.closest(selector));\n }\n\n // Traverses the first node and its parents until it finds a block element.\n public closestBlock() {\n let node = this.eq(0);\n while (node.length > 0) {\n if (node.isTopInside || node.isBlock) {\n break;\n }\n node = node.parent();\n }\n if (!node.isBlock) {\n return new Nodes();\n }\n return node;\n }\n\n // Traverses the first node and its parents until it finds an operable block.\n public closestOperableBlock(): Nodes {\n const boxNode = this.closest('lake-box');\n const block = boxNode.length > 0 ? boxNode.closestBlock() : this.closestBlock();\n if (block.length === 0) {\n return block;\n }\n if (block.isTable) {\n return new Nodes();\n }\n const parentBlock = block.parent();\n if (block.name === 'li' && parentBlock.isList) {\n return parentBlock;\n }\n return block;\n }\n\n // Traverses the first node and its parents until it finds a root element which has contenteditable=\"true\" attribute..\n public closestContainer(): Nodes {\n return this.closest('div[contenteditable=\"true\"]');\n }\n\n // Returns the parent of the first node.\n public parent(): Nodes {\n const node = this.get(0);\n return new Nodes(node.parentNode);\n }\n\n // Returns the immediately preceding sibling of the first node.\n public prev(): Nodes {\n const node = this.get(0);\n return new Nodes(node.previousSibling);\n }\n\n // Returns the immediately following sibling of the first node.\n public next(): Nodes {\n const node = this.get(0);\n return new Nodes(node.nextSibling);\n }\n\n // Returns the first child of the first element.\n public first(): Nodes {\n const element = this.get(0);\n return new Nodes(element.firstChild);\n }\n\n // Returns the last child of the first element.\n public last(): Nodes {\n const element = this.get(0);\n return new Nodes(element.lastChild);\n }\n\n // Returns a number indicating the position of the first node relative to its sibling nodes.\n public index(): number {\n let i = -1;\n let sibling: NativeNode | null = this.get(0);\n while (sibling) {\n i++;\n sibling = sibling.previousSibling;\n }\n return i;\n }\n\n // Returns a path of the first element.\n public path(): NodePath {\n const path: NodePath = [];\n let node = this.eq(0);\n if (node.isContainer) {\n return path;\n }\n while (node.length > 0) {\n const parent = node.parent();\n if (parent.length === 0) {\n break;\n }\n path.push(node.index());\n if (parent.isContainer) {\n break;\n }\n node = parent;\n }\n return path.reverse();\n }\n\n // Returns a list of child nodes of the first element.\n public children(): Nodes[] {\n const childList: Nodes[] = [];\n let child = this.first();\n while (child.length > 0) {\n childList.push(child);\n child = child.next();\n }\n return childList;\n }\n\n // Returns a node generator that iterates over the descendants of the first element.\n public * getWalker(): Generator<Nodes> {\n function * iterate(node: Nodes): Generator<Nodes> {\n if (node.isBox) {\n return;\n }\n let child = node.first();\n while (child.length > 0) {\n const nextNode = child.next();\n yield child;\n yield * iterate(child);\n child = nextNode;\n }\n }\n for (const node of iterate(this.eq(0))) {\n yield node;\n }\n }\n\n // Attaches an event listener for the elements.\n public on(type: string, listener: EventListener): this {\n return this.eachElement(element => {\n element.addEventListener(type, listener, false);\n const elementId = element.lakeId;\n if (!eventData[elementId]) {\n eventData[elementId] = [];\n }\n eventData[elementId].push({\n type,\n listener,\n });\n });\n }\n\n // Removes event handlers that were attached with .on() method.\n public off(type?: string, listener?: EventListener): this {\n return this.eachElement(element => {\n const elementId = element.lakeId;\n const eventItems = eventData[elementId] ?? [];\n eventItems.forEach((item, index) => {\n if (!type || type === item.type && (!listener || listener === item.listener)) {\n element.removeEventListener(item.type, item.listener, false);\n eventItems[index] = {\n type: '',\n listener: () => {},\n };\n }\n });\n eventData[elementId] = eventItems.filter((item: EventItem) => item.type !== '');\n });\n }\n\n // Executes all event listeners attached to the Nodes object for the given event type.\n public emit(type: string, event?: Event): this {\n return this.eachElement(element => {\n const elementId = element.lakeId;\n const eventItems = eventData[elementId];\n eventItems.forEach(item => {\n if (item.type === type) {\n item.listener(event ?? new Event(type));\n }\n });\n });\n }\n\n // Gets all event listeners attached to the Nodes object.\n public getEventListeners(index: number): EventItem[] {\n const elementId = this.get(index).lakeId;\n return eventData[elementId];\n }\n\n // Sets focus on the specified element, if it can be focused.\n public focus(): this {\n const element = this.get(0) as HTMLElement;\n element.focus();\n return this;\n }\n\n // Removes focus from the specified element.\n public blur(): this {\n const element = this.get(0) as HTMLElement;\n element.blur();\n return this;\n }\n\n // Returns a duplicate of the first node.\n public clone(deep: boolean = false): Nodes {\n const node = this.get(0);\n return new Nodes(node.cloneNode(deep));\n }\n\n public hasAttr(attributeName: string): boolean {\n const element = this.get(0) as Element;\n return element.hasAttribute(attributeName);\n }\n\n public attr(attributeName: string): string;\n\n public attr(attributeName: string, value: string): this;\n\n public attr(attributeName: KeyValue): this;\n\n public attr(attributeName: any, value?: any): any {\n if (typeof attributeName === 'object') {\n forEach(attributeName, (name, val) => {\n this.attr(name, val);\n });\n return this;\n }\n if (value === undefined) {\n const element = this.get(0) as Element;\n return element.getAttribute(attributeName) ?? '';\n }\n return this.eachElement(element => {\n element.setAttribute(attributeName, value);\n });\n }\n\n public removeAttr(attributeName: string): this {\n return this.eachElement(element => {\n element.removeAttribute(attributeName);\n });\n }\n\n public hasClass(className: string): boolean {\n const element = this.get(0) as Element;\n return inString(element.className, className, ' ');\n }\n\n public addClass(className: string | string[]): this {\n if (Array.isArray(className)) {\n className.forEach(name => {\n this.addClass(name);\n });\n return this;\n }\n return this.eachElement(element => {\n if (inString(element.className, className, ' ')) {\n return;\n }\n element.classList.add(className);\n });\n }\n\n public removeClass(className: string | string[]): this {\n if (Array.isArray(className)) {\n className.forEach(name => {\n this.removeClass(name);\n });\n return this;\n }\n return this.eachElement(element => {\n if (!inString(element.className, className, ' ')) {\n return;\n }\n element.classList.remove(className);\n if (element.className === '') {\n element.removeAttribute('class');\n }\n });\n }\n\n public computedCSS(propertyName: string): string {\n const element = this.get(0) as Element;\n return getCSS(element, propertyName);\n }\n\n public css(propertyName: string): string;\n\n public css(propertyName: KeyValue): this;\n\n public css(propertyName: string, value: string): this;\n\n public css(propertyName: any, value?: any): any {\n if (typeof propertyName === 'object') {\n forEach(propertyName, (name, val) => {\n this.css(name, val);\n });\n return this;\n }\n if (value === undefined) {\n const element = this.get(0) as Element;\n return toHex(element.style[camelCase(propertyName)]);\n }\n return this.eachElement(element => {\n element.style[camelCase(propertyName)] = value;\n if (element.getAttribute('style') === '') {\n element.removeAttribute('style');\n }\n });\n }\n\n // Returns the width of of the first element.\n public width(): number {\n const element = this.get(0) as HTMLElement;\n return element.offsetWidth;\n }\n\n // Returns the interior width of the first element, which does not include padding.\n public innerWidth() {\n const paddingLeft = parseInt(this.computedCSS('padding-left'), 10) || 0;\n const paddingRight = parseInt(this.computedCSS('padding-right'), 10) || 0;\n return this.width() - paddingLeft - paddingRight;\n }\n\n // Returns the height of of the first element.\n public height(): number {\n const element = this.get(0) as HTMLElement;\n return element.offsetHeight;\n }\n\n public show(displayType: string = 'block'): this {\n this.css('display', displayType);\n return this;\n }\n\n public hide(): this {\n this.css('display', 'none');\n return this;\n }\n\n public html(): string;\n\n public html(value: string): this;\n\n public html(value?: any): any {\n if (value === undefined) {\n const element = this.get(0) as Element;\n return element.innerHTML;\n }\n return this.eachElement(element => {\n element.innerHTML = value;\n });\n }\n\n public text(): string;\n\n public text(value: string): this;\n\n public text(value?: string): any {\n if (value === undefined) {\n const node = this.get(0);\n if (this.isText) {\n return node.nodeValue ?? '';\n }\n const element = node as HTMLElement;\n // https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/innerText\n return element.innerText.replace(/^\\n+|\\n+$/, '');\n }\n return this.eachElement(element => {\n (element as HTMLElement).innerText = value;\n });\n }\n\n public outerHTML(): string {\n const element = this.get(0) as Element;\n return element.outerHTML;\n }\n\n // Removes all child nodes of each element.\n public empty(): this {\n this.html('');\n return this;\n }\n\n // Inserts the specified content as the first child of each element.\n public prepend(content: string | NativeNode | DocumentFragment | Nodes): this {\n if (typeof content === 'string') {\n return this.eachElement(element => {\n const list = toNodeList(content as string).reverse();\n list.forEach((node: NativeNode) => {\n if (element.firstChild) {\n element.insertBefore(node, element.firstChild);\n } else {\n element.appendChild(node);\n }\n });\n });\n }\n const element = this.get(0);\n if (content instanceof Nodes) {\n content = content.get(0);\n }\n if (element.firstChild) {\n element.insertBefore(content, element.firstChild);\n } else {\n element.appendChild(content);\n }\n return this;\n }\n\n // Inserts the specified content as the last child of each element.\n public append(content: string | NativeNode | DocumentFragment | Nodes): this {\n if (typeof content === 'string') {\n return this.eachElement(element => {\n const list = toNodeList(content as string);\n list.forEach((node: NativeNode) => {\n element.appendChild(node);\n });\n });\n }\n const element = this.get(0);\n if (content instanceof Nodes) {\n content = content.get(0);\n }\n element.appendChild(content);\n return this;\n }\n\n // Inserts the specified content before each node.\n public before(content: string | NativeNode | DocumentFragment | Nodes): this {\n if (typeof content === 'string') {\n return this.each(node => {\n const list = toNodeList(content as string);\n list.forEach(target => {\n if (!node.parentNode) {\n return;\n }\n node.parentNode.insertBefore(target, node);\n });\n });\n }\n const node = this.get(0);\n if (content instanceof Nodes) {\n content = content.get(0);\n }\n if (!node.parentNode) {\n return this;\n }\n node.parentNode.insertBefore(content, node);\n return this;\n }\n\n // Inserts the specified content after each node.\n public after(content: string | NativeNode | DocumentFragment | Nodes): this {\n if (typeof content === 'string') {\n return this.each(node => {\n const list = toNodeList(content as string).reverse();\n list.forEach(target => {\n if (!node.parentNode) {\n return;\n }\n if (node.nextSibling) {\n node.parentNode.insertBefore(target, node.nextSibling);\n } else {\n node.parentNode.appendChild(target);\n }\n });\n });\n }\n const node = this.get(0);\n if (content instanceof Nodes) {\n content = content.get(0);\n }\n if (!node.parentNode) {\n return this;\n }\n if (node.nextSibling) {\n node.parentNode.insertBefore(content, node.nextSibling);\n } else {\n node.parentNode.appendChild(content);\n }\n return this;\n }\n\n // Replaces each node with the provided new content.\n public replaceWith(newContent: string | NativeNode | Nodes): this {\n return this.each(node => {\n let target: NativeNode;\n if (newContent instanceof Nodes) {\n target = newContent.get(0);\n } else {\n target = toNodeList(newContent)[0];\n }\n if (!node.parentNode) {\n return;\n }\n node.parentNode.replaceChild(target, node);\n });\n }\n\n // Removes each node from the DOM.\n // keepChildren parameter:\n // A boolean value; true only removes each node and keeps all descended nodes; false removes the descendants; if omitted, it defaults to false.\n public remove(keepChildren: boolean = false): this {\n this.each(node => {\n if (!node.parentNode) {\n return;\n }\n if (keepChildren) {\n let child = node.firstChild;\n while (child) {\n const next = child.nextSibling;\n node.parentNode.insertBefore(child, node);\n child = next;\n }\n }\n node.parentNode.removeChild(node);\n });\n return this;\n }\n\n // Breaks the first text node into two nodes at the specified offset, keeping both nodes in the tree as siblings.\n public splitText(offset: number): Nodes {\n if (!this.isText) {\n return new Nodes();\n }\n const node = this.get(0) as Text;\n const newNode = node.splitText(offset);\n return new Nodes(newNode);\n }\n\n // Returns information of the first node.\n public toString(): string {\n if (this.length === 0) {\n return '';\n }\n const node = this.get(0);\n let nodeValue = this.isText ? node.nodeValue : this.outerHTML();\n if (nodeValue && nodeValue.length > 50) {\n nodeValue = `${nodeValue.substring(0, 50)} ...`;\n }\n return `node (${node.lakeId}): ${nodeValue}`;\n }\n\n // Prints information of the first node.\n public debug(): void {\n debug(this.toString());\n }\n}\n","import { NativeNode } from '../types/native';\nimport { toNodeList } from './to-node-list';\nimport { Nodes } from '../models/nodes';\n\nexport function query(content: string | NativeNode | Nodes): Nodes {\n if (content instanceof Nodes) {\n return content;\n }\n const nodes = toNodeList(content);\n return new Nodes(nodes);\n}\n","import { NativeRange } from '../types/native';\nimport { debug } from '../utils/debug';\nimport { query } from '../utils/query';\nimport { Nodes } from './nodes';\n\n// The Range class represents a fragment of a document that can contain nodes and parts of text nodes.\nexport class Range {\n // native range\n private range: NativeRange;\n\n constructor(range?: NativeRange) {\n this.range = range ?? document.createRange();\n }\n\n // Returns a node within which the range starts.\n public get startNode(): Nodes {\n return new Nodes(this.range.startContainer);\n }\n\n // Returns a number representing where in the startNode the range starts.\n public get startOffset(): number {\n return this.range.startOffset;\n }\n\n // Returns a node within which the range ends.\n public get endNode(): Nodes {\n return new Nodes(this.range.endContainer);\n }\n\n // Returns a number representing where in the endNode the range ends.\n public get endOffset(): number {\n return this.range.endOffset;\n }\n\n // Returns the closest node that contains both the startNode and endNode.\n public get commonAncestor(): Nodes {\n return new Nodes(this.range.commonAncestorContainer);\n }\n\n // Returns a boolean value indicating whether the range's start and end points are at the same position.\n public get isCollapsed(): boolean {\n return this.range.collapsed;\n }\n\n // Returns a boolean value indicating whether the range's start point is in the box.\n public get isBox(): boolean {\n const boxNode = this.commonAncestor.closest('lake-box');\n return boxNode.length > 0;\n }\n\n // Returns a boolean value indicating whether the range's common ancestor node is in the start strip of the box.\n // case 1: <lake-box><span class=\"lake-box-strip\">|</span><div class=\"lake-box-container\"></div> ...\n // case 2: <lake-box><span class=\"lake-box-strip\"></span>|<div class=\"lake-box-container\"></div> ...\n // case 3: <lake-box>|<span class=\"lake-box-strip\"></span><div class=\"lake-box-container\"></div> ...\n public get isBoxStart(): boolean {\n const boxNode = this.commonAncestor.closest('lake-box');\n if (boxNode.length === 0) {\n return false;\n }\n const boxContainer = boxNode.find('.lake-box-container');\n return this.compareBeforeNode(boxContainer) >= 0;\n }\n\n // Returns a boolean value indicating whether the range's common ancestor node is in the center of the box.\n // case 1: ... <div class=\"lake-box-container\"><div>|</div></div> ...\n // case 2: ... <div class=\"lake-box-container\"><div></div>|</div> ...\n public get isBoxCenter(): boolean {\n const boxNode = this.commonAncestor.closest('lake-box');\n if (boxNode.length === 0) {\n return false;\n }\n const boxContainer = boxNode.find('.lake-box-container');\n // Returns true when the box was selected.\n // case: ... <div class=\"lake-box-container\">|<div></div></div> ...\n return this.isCollapsed && this.startNode.get(0) === boxContainer.get(0) && this.startOffset === 0;\n }\n\n // Returns a boolean value indicating whether the range's common ancestor node is in the end strip of the box.\n // case 1: ... <div class=\"lake-box-container\"></div><span class=\"lake-box-strip\">|</span></lake-box>\n // case 2: ... <div class=\"lake-box-container\"></div>|<span class=\"lake-box-strip\"></span></lake-box>\n // case 3: ... <div class=\"lake-box-container\"></div><span class=\"lake-box-strip\"></span>|</lake-box>\n public get isBoxEnd(): boolean {\n const boxNode = this.commonAncestor.closest('lake-box');\n if (boxNode.length === 0) {\n return false;\n }\n const boxContainer = boxNode.find('.lake-box-container');\n return this.compareAfterNode(boxContainer) <= 0;\n }\n\n // Returns a boolean value indicating whether the range's common ancestor node is inside the container of the box.\n // case 1: ... <div class=\"lake-box-container\"><div>|</div></div> ...\n // case 2: ... <div class=\"lake-box-container\"><div></div>|</div> ...\n public get isInsideBox(): boolean {\n const boxNode = this.commonAncestor.closest('lake-box');\n if (boxNode.length === 0) {\n return false;\n }\n const boxContainer = boxNode.find('.lake-box-container');\n // Returns false when the box was selected.\n // case: ... <div class=\"lake-box-container\">|<div></div></div> ...\n if (\n this.isCollapsed &&\n this.startNode.get(0) === boxContainer.get(0) &&\n this.startOffset === 0\n ) {\n return false;\n }\n return this.compareBeforeNode(boxContainer) < 0 && this.compareAfterNode(boxContainer) > 0;\n }\n\n // Returns a boolean value indicating whether the range is inoperative.\n public get isInoperative(): boolean {\n if (this.commonAncestor.isOutside) {\n return true;\n }\n const startBlock = this.startNode.closest('td');\n const endBlock = this.endNode.closest('td');\n if (\n startBlock.length > 0 &&\n endBlock.length > 0 &&\n startBlock.get(0) !== endBlock.get(0)\n ) {\n return true;\n }\n return false;\n }\n\n // Gets a native range.\n public get(): NativeRange {\n return this.range;\n }\n\n // Returns −1 if the point is before the range, 0 if the point is in the range, and 1 if the point is after the range.\n public comparePoint(node: Nodes, offset: number): number {\n return this.range.comparePoint(node.get(0), offset);\n }\n\n // Returns -1, 0, or 1 depending on whether the beginning of the specified node is before, the same as, or after the range.\n public compareBeforeNode(node: Nodes): number {\n const targetRange = new Range();\n if (node.isText) {\n targetRange.setStart(node, 0);\n } else {\n targetRange.setStartBefore(node);\n }\n targetRange.collapseToStart();\n return this.comparePoint(targetRange.startNode, targetRange.startOffset);\n }\n\n // Returns -1, 0, or 1 depending on whether the end of the specified node is before, the same as, or after the range.\n public compareAfterNode(node: Nodes): number {\n const targetRange = new Range();\n if (node.isText) {\n const nodeValue = node.get(0).nodeValue ?? '';\n targetRange.setStart(node, nodeValue.length);\n } else {\n targetRange.setStartAfter(node);\n }\n targetRange.collapseToStart();\n return this.comparePoint(targetRange.startNode, targetRange.startOffset);\n }\n\n // Indicates whether a specified node is part of the range or intersects the range.\n public intersectsNode(node: Nodes): boolean {\n return this.range.intersectsNode(node.get(0));\n }\n\n // Sets the start position of the range.\n public setStart(node: Nodes, offset: number): void {\n this.range.setStart(node.get(0), offset);\n }\n\n // Sets the start position of the range before a node.\n public setStartBefore(node: Nodes): void {\n this.range.setStartBefore(node.get(0));\n }\n\n // Sets the start position of the range after a node.\n public setStartAfter(node: Nodes): void {\n this.range.setStartAfter(node.get(0));\n }\n\n // Sets the end position of the range.\n public setEnd(node: Nodes, offset: number): void {\n this.range.setEnd(node.get(0), offset);\n }\n\n // Sets the end position of the range before a node.\n public setEndBefore(node: Nodes): void {\n this.range.setEndBefore(node.get(0));\n }\n\n // Sets the end position of the range after a node.\n public setEndAfter(node: Nodes): void {\n this.range.setEndAfter(node.get(0));\n }\n\n // Collapses the range to the start of it.\n public collapseToStart(): void {\n this.range.collapse(true);\n }\n\n // Collapses the range to the end of it.\n public collapseToEnd(): void {\n this.range.collapse(false);\n }\n\n // Sets the range to contain the specified node and its contents.\n public selectNode(node: Nodes): void {\n this.range.selectNode(node.get(0));\n }\n\n // Sets the range to contain the contents of the specified node.\n public selectNodeContents(node: Nodes): void {\n this.range.selectNodeContents(node.get(0));\n }\n\n // Sets the range to the center position of the box.\n public selectBox(boxNode: Nodes): void {\n const boxContainer = boxNode.find('.lake-box-container');\n if (boxContainer.length === 0) {\n throw new Error(`The box cannot be selected because the box '${boxNode.attr('name')}' (id=${boxNode.id}) has not been rendered yet.`);\n }\n this.setStart(boxContainer, 0);\n this.collapseToStart();\n }\n\n // Sets the range to the start position of the box.\n public selectBoxStart(boxNode: Nodes): void {\n const boxStrip = boxNode.find('.lake-box-strip');\n if (boxStrip.length === 0) {\n throw new Error(`The box cannot be selected because the box '${boxNode.attr('name')}' (id=${boxNode.id}) has not been rendered yet.`);\n }\n this.selectNodeContents(boxStrip.eq(0));\n this.collapseToEnd();\n }\n\n // Sets the range to the start position of the box.\n public selectBoxEnd(boxNode: Nodes): void {\n const boxStrip = boxNode.find('.lake-box-strip');\n if (boxStrip.length === 0) {\n throw new Error(`The box cannot be selected because the box '${boxNode.attr('name')}' (id=${boxNode.id}) has not been rendered yet.`);\n }\n this.selectNodeContents(boxStrip.eq(1));\n this.collapseToEnd();\n }\n\n // Collapses the range and sets the range to the beginning of the contents of the specified node.\n public shrinkBefore(node: Nodes): void {\n if (node.isBox) {\n this.selectBoxStart(node);\n return;\n }\n if (node.isText) {\n this.setStartBefore(node);\n this.collapseToStart();\n return;\n }\n this.setStart(node, 0);\n let child;\n while (\n this.startNode.isElement &&\n (child = this.startNode.children()[0]) &&\n child.isElement && !child.isVoid\n ) {\n if (child.isBox) {\n this.selectBoxStart(child);\n return;\n }\n this.setStart(child, 0);\n }\n this.collapseToStart();\n }\n\n // Collapses the range and sets the range to the end of the contents of the specified node.\n public shrinkAfter(node: Nodes): void {\n if (node.isBox) {\n this.selectBoxEnd(node);\n return;\n }\n if (node.isText) {\n this.setEndAfter(node);\n this.collapseToEnd();\n return;\n }\n this.setEnd(node, node.children().length);\n let child;\n while (\n this.endNode.isElement &&\n this.endOffset > 0 &&\n (child = this.endNode.children()[this.endOffset - 1]) &&\n child.isElement && !child.isVoid\n ) {\n if (child.isBox) {\n this.selectBoxEnd(child);\n return;\n }\n this.setEnd(child, child.children().length);\n }\n this.collapseToEnd();\n }\n\n // Reduces the boundary of the range.\n // <div>[<p><strong>foo</strong></p>]</div>\n // to\n // <div><p><strong>[foo]</strong></p></div>\n public shrink(): void {\n const isCollapsed = this.isCollapsed;\n let child;\n while (\n this.startNode.isElement &&\n (child = this.startNode.children()[this.startOffset]) &&\n child.isElement && !child.isVoid && !child.isBox\n ) {\n this.setStart(child, 0);\n }\n if (isCollapsed) {\n this.collapseToStart();\n return;\n }\n while (\n this.endNode.isElement &&\n this.endOffset > 0 &&\n (child = this.endNode.children()[this.endOffset - 1]) &&\n child.isElement && !child.isVoid && !child.isBox\n ) {\n this.setEnd(child, child.children().length);\n }\n }\n\n // Relocates the start and end points of the range for the box.\n public adaptBox(): void {\n const startBoxNode = this.startNode.closest('lake-box');\n if (startBoxNode.length > 0) {\n const startRange = this.clone();\n startRange.collapseToStart();\n if (startRange.isBoxEnd) {\n this.setStartAfter(startBoxNode);\n } else {\n this.setStartBefore(startBoxNode);\n }\n }\n const endBoxNode = this.endNode.closest('lake-box');\n if (endBoxNode.length > 0) {\n const endRange = this.clone();\n endRange.collapseToEnd();\n if (endRange.isBoxStart) {\n this.setEndBefore(endBoxNode);\n } else {\n this.setEndAfter(endBoxNode);\n }\n }\n }\n\n // Relocates the beginning or end position of the range for table.\n public adaptTable(): void {\n const startTable = this.startNode.closest('table');\n const endTable = this.endNode.closest('table');\n if (startTable.length === 0 && endTable.length > 0 && endTable.isInside) {\n this.setEndBefore(endTable);\n this.shrink();\n return;\n }\n if (endTable.length === 0 && startTable.length > 0 && startTable.isInside) {\n this.setStartAfter(startTable);\n this.shrink();\n }\n }\n\n // Relocates the start point of the range for the block.\n // case 1:\n // <p>foo</p>|<p>bar</p>\n // to\n // <p>foo</p><p>|bar</p>\n // case 2:\n // [<p>foo</p>]<p>bar</p>\n // to\n // <p>[foo]</p><p>bar</p>\n // case 3:\n // [<p>foo</p><p>]bar</p>\n // to\n // <p>[foo]</p><p>bar</p>\n public adaptBlock(): void {\n if (!this.isCollapsed) {\n // [<p>foo</p><p>]bar</p> to [<p>foo</p>]<p>bar</p>\n if (this.endNode.isElement && this.endOffset === 0) {\n let node = this.endNode;\n while (node.prev().length === 0) {\n node = node.parent();\n }\n this.setEndBefore(node);\n }\n this.shrink();\n return;\n }\n if (this.startNode.isText) {\n return;\n }\n const nextBlock = this.startNode.children()[this.startOffset];\n if (nextBlock && (nextBlock.isBlockBox || nextBlock.isBlock)) {\n this.shrinkBefore(nextBlock);\n }\n }\n\n // Relocates the start and end points of the range.\n public adapt(): void {\n this.adaptBox();\n this.adaptTable();\n this.adaptBlock();\n }\n\n // Returns the previous node of the beginning point of the range.\n public getPrevNode(): Nodes {\n let prevNode;\n if (this.startNode.isText) {\n if (this.startOffset === 0) {\n prevNode = this.startNode.prev();\n } else {\n prevNode = this.startNode;\n }\n } else {\n prevNode = this.startNode.children()[this.startOffset - 1];\n }\n return prevNode ?? new Nodes();\n }\n\n // Returns the next node of the beginning point of the range.\n public getNextNode(): Nodes {\n let nextNode;\n if (this.endNode.isText) {\n if (this.endOffset === this.endNode.text().length) {\n nextNode = this.endNode.next();\n } else {\n nextNode = this.endNode;\n }\n } else {\n nextNode = this.endNode.children()[this.endOffset];\n }\n return nextNode ?? new Nodes();\n }\n\n // Returns target boxes relating to the range.\n public getBoxes(): Nodes[] {\n if (this.isCollapsed) {\n const startBox = this.startNode.closest('lake-box');\n return startBox.length > 0 ? [ startBox ] : [];\n }\n const nodeList: Nodes[] = [];\n const clonedRange = this.clone();\n clonedRange.adaptBox();\n for (const child of clonedRange.commonAncestor.getWalker()) {\n if (child.isBox && clonedRange.intersectsNode(child)) {\n nodeList.push(child);\n }\n }\n return nodeList;\n }\n\n // Returns target blocks relating to the range.\n public getBlocks(): Nodes[] {\n if (this.isCollapsed) {\n const startBlock = this.startNode.closestOperableBlock();\n if (startBlock.isTable) {\n return [];\n }\n return startBlock.isInside ? [ startBlock ] : [];\n }\n const startBlock = this.startNode.closestOperableBlock();\n const endBlock = this.endNode.closestOperableBlock();\n if (\n startBlock.isInside &&\n startBlock.get(0) &&\n startBlock.get(0) === endBlock.get(0)\n ) {\n return startBlock.isTable ? [] : [ startBlock ];\n }\n const blocks: Nodes[] = [];\n const clonedRange = this.clone();\n clonedRange.collapseToEnd();\n for (const child of this.commonAncestor.getWalker()) {\n if (child.isBlock && !child.isTable && child.isTopInside &&\n // the range doesn't end at the start of a block\n clonedRange.comparePoint(child, 0) !== 0 &&\n this.intersectsNode(child)\n ) {\n blocks.push(child);\n }\n }\n if (blocks.length > 0) {\n return blocks;\n }\n for (const child of this.commonAncestor.getWalker()) {\n if (child.isBlock && !child.isTable &&\n (startBlock.isSibling(child) || endBlock.isSibling(child)) &&\n this.intersectsNode(child)) {\n blocks.push(child);\n }\n }\n return blocks;\n }\n\n // Returns target marks and text nodes relating to the range.\n public getMarks(hasText = false): Nodes[] {\n const marks: Nodes[] = [];\n if (this.commonAncestor.isText && hasText) {\n if (\n this.startOffset === 0 &&\n this.endOffset === this.commonAncestor.text().length\n ) {\n marks.push(this.commonAncestor);\n return marks;\n }\n }\n const stratRange = this.clone();\n stratRange.collapseToStart();\n const endRange = this.clone();\n endRange.collapseToEnd();\n for (const node of this.commonAncestor.getWalker()) {\n const targetRange = document.createRange();\n targetRange.setStartAfter(node.get(0));\n targetRange.collapse(true);\n if (endRange.compareBeforeNode(node) >= 0) {\n break;\n }\n if (stratRange.compareAfterNode(node) > 0) {\n if (node.isMark) {\n marks.push(node);\n } else if (node.isText && hasText) {\n marks.push(node);\n }\n }\n }\n return marks;\n }\n\n // Returns the text of the start part of the closest block divided into two parts by the start point of the range.\n // \"<p>one<anchor />two<focus />three</p>\" returns \"three\".\n public getStartText(): string {\n const node = this.startNode;\n const offset = this.startOffset;\n let block = node.closestBlock();\n if (block.isOutside) {\n block = node.closestContainer();\n }\n if (block.length === 0) {\n return '';\n }\n const startRange = new Range();\n startRange.setStartBefore(block);\n startRange.setEnd(node, offset);\n const container = query('<div />');\n container.append(startRange.cloneContents());\n const text = container.text();\n if (text === '' && container.find('lake-box').length > 0) {\n return '\\u200B';\n }\n return text;\n }\n\n // Returns the text of the end part of the closest block divided into two parts by the end point of the range.\n // \"<p>one<anchor />two<focus />three</p>\" returns \"three\".\n public getEndText(): string {\n const node = this.endNode;\n const offset = this.endOffset;\n let block = node.closestBlock();\n if (block.isOutside) {\n block = node.closestContainer();\n }\n if (block.length === 0) {\n return '';\n }\n const endRange = new Range();\n endRange.setStart(node, offset);\n endRange.setEndAfter(block);\n const container = query('<div />');\n container.append(endRange.cloneContents());\n const text = container.text();\n if (text === '' && container.find('lake-box').length > 0) {\n return '\\u200B';\n }\n return text;\n }\n\n // Returns a range object with boundary points identical to the cloned range.\n public clone(): Range {\n return new Range(this.range.cloneRange());\n }\n\n // Returns a document fragment copying the nodes included in the range.\n public cloneContents(): DocumentFragment {\n return this.range.cloneContents();\n }\n\n // Prints information of the range.\n public debug(): void {\n debug('--- range information ---');\n debug('start node:', this.startNode.toString(), ', offset:', this.startOffset);\n debug('end node:', this.endNode.toString(), ', offset:', this.endOffset);\n }\n}\n","import type { Nodes } from '../models/nodes';\nimport { Range } from '../models/range';\n\n// Splits nodes upwards according to the position until a limiting element is encountered.\n// Case 1:\n// <p><strong><i>foo|bar</i></strong></p>\n// to\n// <p><strong><i>foo</i></strong>|<strong><i>bar</i></strong></p>\n//\n// Case 2:\n// <p><strong>beginning<i>one|two</i>end</strong></p>\n// to\n// <p><strong>beginning<i>one</i></strong>|<strong><i>two</i>end</strong></p>\nexport function splitNodes(node: Nodes, offset: number, limitNode: Nodes): { start: Nodes, end: Nodes } | null {\n const range = new Range();\n let parent;\n if (node.isText) {\n parent = node.parent();\n const newNode = node.splitText(offset);\n range.setStartAfter(node);\n if (node.text() === '') {\n node.remove();\n }\n if (newNode.text() === '') {\n newNode.remove();\n }\n } else {\n range.setStart(node, offset);\n parent = node;\n }\n if (parent.name === 'body' || parent.name === 'html') {\n return null;\n }\n if (parent.get(0) === limitNode.get(0)) {\n return null;\n }\n range.collapseToStart();\n const startPart = parent.clone();\n let child = parent.first();\n while (child.length > 0) {\n if (range.compareBeforeNode(child) >= 0) {\n break;\n }\n const nextNode = child.next();\n startPart.append(child);\n child = nextNode;\n }\n parent.before(startPart);\n if (parent.parent().length > 0 && parent.parent().get(0) !== limitNode.get(0)) {\n return splitNodes(parent.parent(), parent.index(), limitNode);\n }\n return {\n start: startPart,\n end: parent,\n };\n}\n","import type { Nodes } from '../models/nodes';\n\n// Appends a node to the deepest element of the specified element.\nexport function appendDeepest(element: Nodes, node: Nodes): void {\n let child = element;\n while (child.length > 0) {\n let firstChild = child.first();\n while (firstChild.isText && firstChild.isEmpty) {\n firstChild = firstChild.next();\n }\n if (child.isText || child.isBox) {\n break;\n }\n if (child.isElement && child.children().length === 1 && firstChild.isBookmark) {\n child.prepend(node);\n break;\n }\n if (child.isElement && !child.isVoid && firstChild.length === 0) {\n child.append(node);\n break;\n }\n child = firstChild;\n }\n}\n","import type { Nodes } from '../models/nodes';\n\n// Removes The <br /> element in the specified block which is empty.\nexport function removeBr(block: Nodes): void {\n if (block.length === 0) {\n return;\n }\n const nodeList: Nodes[] = [];\n let child = block.first();\n while (child.length > 0) {\n const nextNode = child.next();\n if (!child.isText || child.text() !== '') {\n nodeList.push(child);\n }\n child = nextNode;\n }\n if (\n nodeList.length === 1 &&nodeList[0].name === 'br' ||\n nodeList.length === 2 && nodeList[0].name === 'br' && nodeList[1].isBookmark\n ) {\n nodeList[0].remove();\n }\n if (nodeList.length === 2 && nodeList[0].isBookmark && nodeList[1].name === 'br') {\n nodeList[1].remove();\n }\n}\n","import type { Nodes } from '../models/nodes';\nimport { Range } from '../models/range';\nimport { appendDeepest } from './append-deepest';\nimport { query } from './query';\nimport { removeBr } from './remove-br';\n\n// Returns a point after the specified node.\nfunction getAfterPoint(node: Nodes): { node: Nodes, offset: number } {\n if (node.isText) {\n return {\n node,\n offset: node.text().length,\n };\n }\n const range = new Range();\n range.setEndAfter(node);\n return {\n node: range.endNode,\n offset: range.endOffset,\n };\n}\n\n// Merges two nodes into one node.\n// Case 1:\n// <p><strong><i>foo</i></strong></p>\n// <p>|bar</p>\n// to\n// <p><strong><i>foo</i></strong>|bar</p>\n//\n// Case 2:\n// <p><strong><i>foo</i></strong></p>\n// <p>|<strong><i>bar</i></strong></p>\n// to\n// <p><strong><i>foo|bar</i></strong></p>\nexport function mergeNodes(node: Nodes, otherNode: Nodes): { node: Nodes, offset: number } {\n const originalOtherNode = otherNode;\n if (['ul', 'ol'].indexOf(node.name) >= 0) {\n const list = node.find('li');\n node = list.eq(list.length - 1);\n }\n if (['ul', 'ol'].indexOf(otherNode.name) >= 0) {\n const list = otherNode.find('li');\n otherNode = list.eq(0);\n }\n if (node.isText || otherNode.isText || node.isVoid || otherNode.isVoid) {\n return getAfterPoint(node);\n }\n removeBr(node);\n removeBr(otherNode);\n if (node.isBlock && node.isEmpty && otherNode.isEmpty) {\n appendDeepest(node, query('<br />'));\n }\n const nextNode = node.last();\n const nextOtherNode = otherNode.first();\n let child = nextOtherNode;\n while (child.length > 0) {\n const next = child.next();\n node.append(child);\n child = next;\n }\n originalOtherNode.remove();\n if (\n nextNode.length > 0 &&\n nextOtherNode.length > 0 &&\n nextNode.isElement &&\n !nextNode.isBox &&\n nextNode.clone(false).get(0).isEqualNode(nextOtherNode.clone(false).get(0))\n ) {\n return mergeNodes(nextNode, nextOtherNode);\n }\n if (nextNode.length === 0) {\n return {\n node,\n offset: 0,\n };\n }\n return getAfterPoint(nextNode);\n}\n","import type { Nodes } from '../models/nodes';\n\n// Returns the deepest element of the specified element.\nexport function getDeepest(element: Nodes): Nodes {\n let child = element;\n while (child.length > 0) {\n let firstChild = child.first();\n if (firstChild.isText && firstChild.isEmpty) {\n firstChild = firstChild.next();\n }\n if (child.isElement && !child.isVoid && firstChild.length === 0) {\n break;\n }\n child = firstChild;\n }\n return child;\n}\n","import type { Nodes } from '../models/nodes';\nimport { getDeepest } from './get-deepest';\nimport { query } from './query';\n\nexport function wrapNodeList(nodeList: Nodes[], wrapper?: Nodes): Nodes {\n wrapper = wrapper ?? query('<p />');\n if (nodeList.length === 0) {\n return wrapper;\n }\n wrapper = wrapper.clone(true);\n const deepestElement = getDeepest(wrapper);\n nodeList[0].before(wrapper);\n nodeList.forEach(node => {\n deepestElement.append(node);\n });\n return wrapper;\n}\n","import type { Nodes } from '../models/nodes';\n\n// Removes Zero-width spaces that are dependent on some other text nodes.\nexport function removeZWS(node: Nodes): void {\n for (const child of node.getWalker()) {\n if (child.isText && child.text().length > 1) {\n const nodeValue = child.text();\n if (/\\u200B/.test(child.text())) {\n child.get(0).nodeValue = nodeValue.replace(/\\u200B/g, '');\n }\n }\n }\n}\n","import type { Nodes } from '../models/nodes';\nimport { query } from './query';\nimport { safeTemplate } from './safe-template';\n\nexport function changeTagName(element: Nodes, newTagName: string): Nodes {\n const nativeElement = element.get(0) as Element;\n const newElement = query(safeTemplate`<${newTagName} />`);\n for (const attr of nativeElement.attributes) {\n newElement.attr(attr.name, attr.value);\n }\n let child = element.first();\n while(child.length > 0) {\n const nextNode = child.next();\n newElement.append(child);\n child = nextNode;\n }\n element.replaceWith(newElement);\n return newElement;\n}\n","import type { Nodes } from '../models/nodes';\n\nexport function fixNumberedList(blocks: Nodes[]): void {\n if (blocks.length === 0) {\n return;\n }\n const firstBlock = blocks[0];\n const lastBlock = blocks[blocks.length - 1];\n const targetBlocks: Nodes[] = [];\n // to find all numbered list before current blocks\n let prevNode = firstBlock.prev();\n while (prevNode.length > 0) {\n if (prevNode.name !== 'ol') {\n break;\n }\n targetBlocks.push(prevNode);\n prevNode = prevNode.prev();\n }\n targetBlocks.reverse();\n targetBlocks.push(...blocks);\n // to find all numbered list after current blocks\n let nextNode = lastBlock.next();\n while (nextNode.length > 0) {\n if (nextNode.name !== 'ol') {\n break;\n }\n targetBlocks.push(nextNode);\n nextNode = nextNode.next();\n }\n // to reset start number\n let index = 1;\n for (const block of targetBlocks) {\n const prev = block.prev();\n if (prev.length === 0 || prev.name !== 'ol') {\n index = 1;\n }\n if (block.name === 'ol') {\n if (prev.name === 'ol' && prev.attr('indent') !== block.attr('indent')) {\n index = 1;\n }\n const currentStart = block.attr('start');\n const expectedStart = index.toString(10);\n if (currentStart !== expectedStart) {\n block.attr('start', expectedStart);\n }\n index++;\n }\n }\n}\n","import type { Nodes } from '../models/nodes';\nimport { fixNumberedList } from './fix-numbered-list';\n\nexport function setBlockIndent(block: Nodes, type: 'increase' | 'decrease'): void {\n if (block.isList) {\n let indent = Number.parseInt(block.attr('indent'), 10) || 0;\n if (type === 'increase') {\n indent++;\n } else {\n indent--;\n }\n if (indent <= 0) {\n indent = 0;\n } else if (indent > 10) {\n return;\n }\n if (indent === 0) {\n block.removeAttr('indent');\n } else {\n block.attr('indent', indent.toString(10));\n }\n fixNumberedList([ block ]);\n return;\n }\n let value = Number.parseInt(block.css('margin-left'), 10) || 0;\n if (type === 'decrease' && value === 0 && block.css('text-indent') !== '') {\n block.css('text-indent', '');\n return;\n }\n if (type === 'increase') {\n value += 40;\n } else {\n value -= 40;\n }\n if (value <= 0) {\n value = 0;\n }\n if (value === 0) {\n block.css('margin-left', '');\n } else {\n block.css('margin-left', `${value}px`);\n }\n}\n","/**\nBSD 2-Clause License\n\nCopyright (c) 2022, Big Sky Software\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n1. Redistributions of source code must retain the above copyright notice, this\n list of conditions and the following disclaimer.\n\n2. Redistributions in binary form must reproduce the above copyright notice,\n this list of conditions and the following disclaimer in the documentation\n and/or other materials provided with the distribution.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\nRepository: https://github.com/bigskysoftware/idiomorph\n*/\n\n/* eslint-disable no-throw-literal */\n/* eslint-disable no-use-before-define */\n/* eslint-disable no-continue */\n\nimport type { Nodes } from '../models/nodes';\n\ndeclare global {\n interface Node {\n generatedByIdiomorph: boolean;\n }\n}\n\ndeclare type configType = {\n morphStyle?: 'innerHTML' | 'outerHTML';\n ignoreActive?: boolean;\n ignoreActiveValue?: boolean;\n head?: {\n style?: 'merge' | 'append' | 'morph' | 'none';\n };\n callbacks?: {\n beforeNodeAdded?: (node: Node) => void | boolean;\n afterNodeAdded?: (node: Node) => void;\n beforeNodeMorphed?: (oldNode: Node, newNode: Node) => void | boolean;\n afterNodeMorphed?: (oldNode: Node, newNode: Node) => void;\n beforeNodeRemoved?: (node: Node) => void | boolean;\n afterNodeRemoved?: (node: Node) => void;\n beforeAttributeUpdated?: (attributeName: string, node: Node, mutationType: string) => void | boolean;\n afterAttributeUpdated?: (attributeName: string, node: Node, mutationType: string) => void;\n beforeChildrenUpdated?: (oldNode: Node, newNode: Node) => void | boolean;\n };\n};\n\ntype KeyValue = { [key: string]: any };\n\nconst EMPTY_SET = new Set();\n\nfunction noOp() {}\n\n// default configuration values, updatable by users now\nconst defaults = {\n morphStyle: 'outerHTML',\n callbacks: {\n beforeNodeAdded: noOp,\n afterNodeAdded: noOp,\n beforeNodeMorphed: noOp,\n afterNodeMorphed: noOp,\n beforeNodeRemoved: noOp,\n afterNodeRemoved: noOp,\n beforeAttributeUpdated: noOp,\n afterAttributeUpdated: noOp,\n beforeChildrenUpdated: noOp,\n\n },\n head: {\n style: 'merge',\n shouldPreserve: (elt: Element) => elt.getAttribute('im-preserve') === 'true',\n shouldReAppend: (elt: Element) => elt.getAttribute('im-re-append') === 'true',\n shouldRemove: noOp,\n afterHeadMorphed: noOp,\n },\n};\n\n/*\n Deep merges the config object and the Idiomoroph.defaults object to\n produce a final configuration object\n */\nfunction mergeDefaults(config: KeyValue) {\n const finalConfig: KeyValue = {};\n // copy top level stuff into final config\n Object.assign(finalConfig, defaults);\n Object.assign(finalConfig, config);\n\n // copy callbacks into final config (do this to deep merge the callbacks)\n finalConfig.callbacks = {};\n Object.assign(finalConfig.callbacks, defaults.callbacks);\n Object.assign(finalConfig.callbacks, config.callbacks);\n\n // copy head config into final config (do this to deep merge the head)\n finalConfig.head = {};\n Object.assign(finalConfig.head, defaults.head);\n Object.assign(finalConfig.head, config.head);\n return finalConfig;\n}\n\n// =============================================================================\n// ID Set Functions\n// =============================================================================\n\nfunction isIdInConsideration(ctx: KeyValue, id: string) {\n return !ctx.deadIds.has(id);\n}\n\nfunction idIsWithinNode(ctx: KeyValue, id: string, targetNode: Node) {\n const idSet = ctx.idMap.get(targetNode) || EMPTY_SET;\n return idSet.has(id);\n}\n\nfunction removeIdsFromConsideration(ctx: KeyValue, node: Node) {\n const idSet = ctx.idMap.get(node) || EMPTY_SET;\n for (const id of idSet) {\n ctx.deadIds.add(id);\n }\n}\n\nfunction getIdIntersectionCount(ctx: KeyValue, node1: Node, node2: Node) {\n const sourceSet = ctx.idMap.get(node1) || EMPTY_SET;\n let matchCount = 0;\n for (const id of sourceSet) {\n // a potential match is an id in the source and potentialIdsSet, but\n // that has not already been merged into the DOM\n if (isIdInConsideration(ctx, id) && idIsWithinNode(ctx, id, node2)) {\n ++matchCount;\n }\n }\n return matchCount;\n}\n\n/**\n * A bottom up algorithm that finds all elements with ids inside of the node\n * argument and populates id sets for those nodes and all their parents, generating\n * a set of ids contained within all nodes for the entire hierarchy in the DOM\n *\n * @param node {Element}\n * @param {Map<Node, Set<String>>} idMap\n */\nfunction populateIdMapForNode(node: Element, idMap: Map<Node, Set<string>>) {\n const nodeParent = node.parentElement;\n // find all elements with an id property\n const idElements = node.querySelectorAll('[id]');\n for (const elt of idElements) {\n let current: Element | null = elt;\n // walk up the parent hierarchy of that element, adding the id\n // of element to the parent's id set\n while (current !== nodeParent && current != null) {\n let idSet = idMap.get(current);\n // if the id set does not exist, create it and insert it in the map\n if (idSet == null) {\n idSet = new Set();\n idMap.set(current, idSet);\n }\n idSet.add(elt.id);\n current = current.parentElement;\n }\n }\n}\n\n/**\n * This function computes a map of nodes to all ids contained within that node (inclusive of the\n * node). This map can be used to ask if two nodes have intersecting sets of ids, which allows\n * for a looser definition of \"matching\" than tradition id matching, and allows child nodes\n * to contribute to a parent nodes matching.\n *\n * @param {Element} oldContent the old content that will be morphed\n * @param {Element} newContent the new content to morph to\n * @returns {Map<Node, Set<String>>} a map of nodes to id sets for the\n */\nfunction createIdMap(oldContent: Element, newContent: Element) {\n const idMap = new Map();\n populateIdMapForNode(oldContent, idMap);\n populateIdMapForNode(newContent, idMap);\n return idMap;\n}\n\nfunction createMorphContext(oldNode: Element, newContent: Element, config: KeyValue) {\n config = mergeDefaults(config);\n return {\n target: oldNode,\n newContent,\n config,\n morphStyle: config.morphStyle,\n ignoreActive: config.ignoreActive,\n ignoreActiveValue: config.ignoreActiveValue,\n idMap: createIdMap(oldNode, newContent),\n deadIds: new Set(),\n callbacks: config.callbacks,\n head: config.head,\n };\n}\n\nfunction isIdSetMatch(node1: Element, node2: Element, ctx: KeyValue) {\n if (node1 == null || node2 == null) {\n return false;\n }\n if (node1.nodeType === node2.nodeType && node1.tagName === node2.tagName) {\n if (node1.id !== '' && node1.id === node2.id) {\n return true;\n }\n return getIdIntersectionCount(ctx, node1, node2) > 0;\n }\n return false;\n}\n\nfunction isSoftMatch(node1: Element, node2: Element) {\n if (node1 == null || node2 == null) {\n return false;\n }\n return node1.nodeType === node2.nodeType && node1.tagName === node2.tagName;\n}\n\nfunction removeNode(tempNode: Node, ctx: KeyValue) {\n removeIdsFromConsideration(ctx, tempNode);\n if (ctx.callbacks.beforeNodeRemoved(tempNode) === false) return;\n\n (tempNode as Element).remove();\n ctx.callbacks.afterNodeRemoved(tempNode);\n}\n\nfunction removeNodesBetween(startInclusive: Node, endExclusive: Node, ctx: KeyValue) {\n let start: Node | null = startInclusive;\n while (start && start !== endExclusive) {\n const tempNode = start;\n start = start.nextSibling;\n removeNode(tempNode, ctx);\n }\n removeIdsFromConsideration(ctx, endExclusive);\n return endExclusive.nextSibling;\n}\n\n// =============================================================================\n// Scans forward from the insertionPoint in the old parent looking for a potential id match\n// for the newChild. We stop if we find a potential id match for the new child OR\n// if the number of potential id matches we are discarding is greater than the\n// potential id matches for the new child\n// =============================================================================\nfunction findIdSetMatch(newContent: Element, oldParent: Element, newChild: Element, insertionPoint: Node, ctx: KeyValue) {\n\n // max id matches we are willing to discard in our search\n const newChildPotentialIdCount = getIdIntersectionCount(ctx, newChild, oldParent);\n\n let potentialMatch = null;\n\n // only search forward if there is a possibility of an id match\n if (newChildPotentialIdCount > 0) {\n potentialMatch = insertionPoint;\n // if there is a possibility of an id match, scan forward\n // keep track of the potential id match count we are discarding (the\n // newChildPotentialIdCount must be greater than this to make it likely\n // worth it)\n let otherMatchCount = 0;\n while (potentialMatch != null) {\n\n // If we have an id match, return the current potential match\n if (isIdSetMatch(newChild, potentialMatch as Element, ctx)) {\n return potentialMatch;\n }\n\n // computer the other potential matches of this new content\n otherMatchCount += getIdIntersectionCount(ctx, potentialMatch, newContent);\n if (otherMatchCount > newChildPotentialIdCount) {\n // if we have more potential id matches in _other_ content, we\n // do not have a good candidate for an id match, so return null\n return null;\n }\n\n // advanced to the next old content child\n potentialMatch = potentialMatch.nextSibling;\n }\n }\n return potentialMatch;\n}\n\n// =============================================================================\n// Scans forward from the insertionPoint in the old parent looking for a potential soft match\n// for the newChild. We stop if we find a potential soft match for the new child OR\n// if we find a potential id match in the old parents children OR if we find two\n// potential soft matches for the next two pieces of new content\n// =============================================================================\nfunction findSoftMatch(newContent: Element, oldParent: Element, newChild: Node, insertionPoint: Node, ctx: KeyValue) {\n\n let potentialSoftMatch: Node | null = insertionPoint;\n let nextSibling = newChild.nextSibling;\n let siblingSoftMatchCount = 0;\n\n while (potentialSoftMatch != null) {\n\n if (getIdIntersectionCount(ctx, potentialSoftMatch, newContent) > 0) {\n // the current potential soft match has a potential id set match with the remaining new\n // content so bail out of looking\n return null;\n }\n\n // if we have a soft match with the current node, return it\n if (isSoftMatch(newChild as Element, potentialSoftMatch as Element)) {\n return potentialSoftMatch;\n }\n\n if (isSoftMatch(nextSibling as Element, potentialSoftMatch as Element)) {\n // the next new node has a soft match with this node, so\n // increment the count of future soft matches\n siblingSoftMatchCount++;\n nextSibling = nextSibling ? nextSibling.nextSibling : null;\n\n // If there are two future soft matches, bail to allow the siblings to soft match\n // so that we don't consume future soft matches for the sake of the current node\n if (siblingSoftMatchCount >= 2) {\n return null;\n }\n }\n\n // advanced to the next old content child\n potentialSoftMatch = potentialSoftMatch ? potentialSoftMatch.nextSibling : null;\n }\n\n return potentialSoftMatch;\n}\n\nfunction normalizeContent(newContent: Node[] | Node | null) {\n if (newContent == null) {\n // noinspection UnnecessaryLocalVariableJS\n const dummyParent = document.createElement('div');\n return dummyParent;\n }\n if (newContent instanceof Node) {\n if (newContent.generatedByIdiomorph) {\n // the template tag created by idiomorph parsing can serve as a dummy parent\n return newContent;\n }\n // a single node is added as a child to a dummy parent\n const dummyParent = document.createElement('div');\n dummyParent.append(newContent);\n return dummyParent;\n }\n // all nodes in the array or HTMLElement collection are consolidated under\n // a single dummy parent element\n const dummyParent = document.createElement('div');\n for (const elt of [...newContent]) {\n dummyParent.append(elt);\n }\n return dummyParent;\n}\n\nfunction insertSiblings(previousSibling: Node, morphedNode: Node, nextSibling: Node) {\n const stack = [];\n const added = [];\n let prev: Node | null = previousSibling;\n while (prev != null) {\n stack.push(prev);\n prev = prev.previousSibling;\n }\n while (stack.length > 0) {\n const node = stack.pop();\n added.push(node); // push added preceding siblings on in order and insert\n if (node) {\n morphedNode.parentElement?.insertBefore(node, morphedNode);\n }\n }\n added.push(morphedNode);\n let next: Node | null = nextSibling;\n while (next != null) {\n stack.push(next);\n added.push(next); // here we are going in order, so push on as we scan, rather than add\n next = next.nextSibling;\n }\n while (stack.length > 0) {\n const node = stack.pop();\n if (node) {\n morphedNode.parentElement?.insertBefore(node, morphedNode.nextSibling);\n }\n }\n return added;\n}\n\nfunction scoreElement(node1: Node, node2: Node, ctx: KeyValue) {\n if (isSoftMatch(node1 as Element, node2 as Element)) {\n return .5 + getIdIntersectionCount(ctx, node1, node2);\n }\n return 0;\n}\n\nfunction findBestNodeMatch(newContent: Node, oldNode: Node, ctx: KeyValue) {\n let currentElement;\n currentElement = newContent.firstChild;\n let bestElement = currentElement;\n let score = 0;\n while (currentElement) {\n const newScore = scoreElement(currentElement, oldNode, ctx);\n if (newScore > score) {\n bestElement = currentElement;\n score = newScore;\n }\n currentElement = currentElement.nextSibling;\n }\n return bestElement;\n}\n\n// =============================================================================\n// Attribute Syncing Code\n// =============================================================================\n\n/*\n * @param attr {String} the attribute to be mutated\n * @param to {Element} the element that is going to be updated\n * @param updateType {(\"update\"|\"remove\")}\n * @param ctx the merge context\n * @returns {boolean} true if the attribute should be ignored, false otherwise\n */\nfunction ignoreAttribute(attr: string, to: Element, updateType: string, ctx: KeyValue) {\n if (attr === 'value' && ctx.ignoreActiveValue && to === document.activeElement) {\n return true;\n }\n return ctx.callbacks.beforeAttributeUpdated(attr, to, updateType) === false;\n}\n\n/**\n * @param possibleActiveElement\n * @param ctx\n * @returns {boolean}\n */\nfunction ignoreValueOfActiveElement(possibleActiveElement: Node, ctx: KeyValue) {\n return ctx.ignoreActiveValue && possibleActiveElement === document.activeElement;\n}\n\n/**\n * syncs a given node with another node, copying over all attributes and\n * inner element state from the 'from' node to the 'to' node\n *\n * @param {Element} from the element to copy attributes & state from\n * @param {Element} to the element to copy attributes & state to\n * @param ctx the merge context\n */\nfunction syncNodeFrom(from: Element, to: Element, ctx: KeyValue) {\n const type = from.nodeType;\n\n // if is an element type, sync the attributes from the\n // new node into the new node\n if (type === 1 /* element type */) {\n const fromAttributes = from.attributes;\n const toAttributes = to.attributes;\n for (const fromAttribute of fromAttributes) {\n if (ignoreAttribute(fromAttribute.name, to, 'update', ctx)) {\n continue;\n }\n if (to.getAttribute(fromAttribute.name) !== fromAttribute.value) {\n to.setAttribute(fromAttribute.name, fromAttribute.value);\n ctx.callbacks.afterAttributeUpdated(fromAttribute.name, to, 'update');\n }\n }\n // iterate backwards to avoid skipping over items when a delete occurs\n for (let i = toAttributes.length - 1; i >= 0; i--) {\n const toAttribute = toAttributes[i];\n if (ignoreAttribute(toAttribute.name, to, 'remove', ctx)) {\n continue;\n }\n if (!from.hasAttribute(toAttribute.name)) {\n to.removeAttribute(toAttribute.name);\n ctx.callbacks.afterAttributeUpdated(toAttribute.name, to, 'remove');\n }\n }\n }\n // sync text nodes\n if (type === 8 /* comment */ || type === 3 /* text */) {\n if (to.nodeValue !== from.nodeValue) {\n to.nodeValue = from.nodeValue;\n }\n }\n}\n\n/**\n * @param oldNode root node to merge content into\n * @param newContent new content to merge\n * @param ctx the merge context\n * @returns {Element} the element that ended up in the DOM\n */\nfunction morphOldNodeTo(oldNode: Node, newContent: Node, ctx: KeyValue) {\n if (ctx.ignoreActive && oldNode === document.activeElement) {\n // don't morph focused element\n } else if (newContent == null) {\n if (ctx.callbacks.beforeNodeRemoved(oldNode) === false) return oldNode;\n\n (oldNode as Element).remove();\n ctx.callbacks.afterNodeRemoved(oldNode);\n return null;\n } else if (!isSoftMatch(oldNode as Element, newContent as Element)) {\n if (ctx.callbacks.beforeNodeRemoved(oldNode) === false) return oldNode;\n if (ctx.callbacks.beforeNodeAdded(newContent) === false) return oldNode;\n\n oldNode.parentElement?.replaceChild(newContent, oldNode);\n ctx.callbacks.afterNodeAdded(newContent);\n ctx.callbacks.afterNodeRemoved(oldNode);\n return newContent;\n } else {\n if (ctx.callbacks.beforeNodeMorphed(oldNode, newContent) === false) return oldNode;\n syncNodeFrom(newContent as Element, oldNode as Element, ctx);\n if (ctx.callbacks.beforeChildrenUpdated(oldNode, newContent) !== false && !ignoreValueOfActiveElement(oldNode, ctx)) {\n morphChildren(newContent, oldNode, ctx);\n }\n ctx.callbacks.afterNodeMorphed(oldNode, newContent);\n return oldNode;\n }\n}\n\n/**\n * This is the core algorithm for matching up children. The idea is to use id sets to try to match up\n * nodes as faithfully as possible. We greedily match, which allows us to keep the algorithm fast, but\n * by using id sets, we are able to better match up with content deeper in the DOM.\n *\n * Basic algorithm is, for each node in the new content:\n *\n * - if we have reached the end of the old parent, append the new content\n * - if the new content has an id set match with the current insertion point, morph\n * - search for an id set match\n * - if id set match found, morph\n * - otherwise search for a \"soft\" match\n * - if a soft match is found, morph\n * - otherwise, prepend the new node before the current insertion point\n *\n * The two search algorithms terminate if competing node matches appear to outweigh what can be achieved\n * with the current node. See findIdSetMatch() and findSoftMatch() for details.\n *\n * @param {Element} newParent the parent element of the new content\n * @param {Element } oldParent the old content that we are merging the new content into\n * @param ctx the merge context\n */\nfunction morphChildren(newParent: Node, oldParent: Node, ctx: KeyValue) {\n\n let nextNewChild = newParent.firstChild;\n let insertionPoint = oldParent.firstChild;\n let newChild;\n\n // run through all the new content\n while (nextNewChild) {\n\n newChild = nextNewChild;\n nextNewChild = newChild.nextSibling;\n\n // if we are at the end of the exiting parent's children, just append\n if (insertionPoint == null) {\n if (ctx.callbacks.beforeNodeAdded(newChild) === false) return;\n\n oldParent.appendChild(newChild);\n ctx.callbacks.afterNodeAdded(newChild);\n removeIdsFromConsideration(ctx, newChild);\n continue;\n }\n\n // if the current node has an id set match then morph\n if (isIdSetMatch(newChild as Element, insertionPoint as Element, ctx)) {\n morphOldNodeTo(insertionPoint, newChild, ctx);\n insertionPoint = insertionPoint.nextSibling;\n removeIdsFromConsideration(ctx, newChild);\n continue;\n }\n\n // otherwise search forward in the existing old children for an id set match\n const idSetMatch = findIdSetMatch(newParent as Element, oldParent as Element, newChild as Element, insertionPoint, ctx);\n\n // if we found a potential match, remove the nodes until that point and morph\n if (idSetMatch) {\n insertionPoint = removeNodesBetween(insertionPoint, idSetMatch, ctx);\n morphOldNodeTo(idSetMatch, newChild, ctx);\n removeIdsFromConsideration(ctx, newChild);\n continue;\n }\n\n // no id set match found, so scan forward for a soft match for the current node\n const softMatch = findSoftMatch(newParent as Element, oldParent as Element, newChild, insertionPoint, ctx);\n\n // if we found a soft match for the current node, morph\n if (softMatch) {\n insertionPoint = removeNodesBetween(insertionPoint, softMatch, ctx);\n morphOldNodeTo(softMatch, newChild, ctx);\n removeIdsFromConsideration(ctx, newChild);\n continue;\n }\n\n // abandon all hope of morphing, just insert the new child before the insertion point\n // and move on\n if (ctx.callbacks.beforeNodeAdded(newChild) === false) return;\n\n oldParent.insertBefore(newChild, insertionPoint);\n ctx.callbacks.afterNodeAdded(newChild);\n removeIdsFromConsideration(ctx, newChild);\n }\n\n // remove any remaining old nodes that didn't match up with new content\n while (insertionPoint !== null) {\n\n const tempNode = insertionPoint;\n insertionPoint = insertionPoint.nextSibling;\n removeNode(tempNode, ctx);\n }\n}\n\nfunction morphNormalizedContent(oldNode: Element, normalizedNewContent: Element, ctx: KeyValue) {\n if (ctx.morphStyle === 'innerHTML') {\n\n // innerHTML, so we are only updating the children\n morphChildren(normalizedNewContent, oldNode, ctx);\n return oldNode.children;\n\n }\n if (ctx.morphStyle === 'outerHTML' || ctx.morphStyle == null) {\n // otherwise find the best element match in the new content, morph that, and merge its siblings\n // into either side of the best match\n const bestMatch = findBestNodeMatch(normalizedNewContent, oldNode, ctx);\n\n // stash the siblings that will need to be inserted on either side of the best match\n const previousSibling = bestMatch?.previousSibling;\n const nextSibling = bestMatch?.nextSibling;\n\n // morph it\n const morphedNode = morphOldNodeTo(oldNode, bestMatch as Node, ctx);\n\n if (bestMatch) {\n // if there was a best match, merge the siblings in too and return the\n // whole bunch\n return insertSiblings(previousSibling as Node, morphedNode as Node, nextSibling as Node);\n }\n // otherwise nothing was added to the DOM\n return [];\n }\n throw `Do not understand how to morph style ${ ctx.morphStyle}`;\n}\n\n// =============================================================================\n// Core Morphing Algorithm - morph, morphNormalizedContent, morphOldNodeTo, morphChildren\n// =============================================================================\nexport function morph(node: Nodes, otherNode: Nodes, config: configType = {}): void {\n const normalizedContent = normalizeContent(otherNode.get(0)) as Element;\n const ctx = createMorphContext(node.get(0) as Element, normalizedContent, config);\n morphNormalizedContent(node.get(0) as Element, normalizedContent, ctx);\n}\n","/**\nThe MIT License (MIT)\n\nCopyright (c) 2016-present react-component\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\nOR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nRepository: https://github.com/react-component/upload\n*/\n\nimport { UploadRequestError, UploadRequestOption } from '../types/request';\n\nfunction getError(option: UploadRequestOption, xhr: XMLHttpRequest) {\n const msg = `Cannot ${option.method} ${option.action} ${xhr.status}'`;\n const err = new Error(msg) as UploadRequestError;\n err.status = xhr.status;\n err.method = option.method;\n err.url = option.action;\n return err;\n}\n\nfunction getBody(xhr: XMLHttpRequest) {\n const text = xhr.responseText || xhr.response;\n if (!text) {\n return text;\n }\n\n try {\n return JSON.parse(text);\n } catch (e) {\n return text;\n }\n}\n\nexport function request(option: UploadRequestOption): XMLHttpRequest {\n const xhr = new XMLHttpRequest();\n\n if (option.onProgress && xhr.upload) {\n xhr.upload.onprogress = (e) => {\n if (e.total > 0) {\n e.percent = (e.loaded / e.total) * 100;\n }\n if (option.onProgress) {\n option.onProgress(e);\n }\n };\n }\n\n const formData = new FormData();\n\n const data = option.data || {};\n Object.keys(data).forEach(key => {\n const value = data[key];\n // support key-value array data\n if (Array.isArray(value)) {\n value.forEach(item => {\n // { list: [ 11, 22 ] }\n // formData.append('list[]', 11);\n formData.append(`${key}[]`, item);\n });\n return;\n }\n\n formData.append(key, value as string | Blob);\n });\n\n const filename = option.filename || 'file';\n if (option.file instanceof Blob) {\n formData.append(filename, option.file, (option.file as any).name);\n } else {\n formData.append(filename, option.file);\n }\n\n xhr.onerror = (e) => {\n if (option.onError) {\n option.onError(e);\n }\n };\n\n xhr.onload = () => {\n // allow success when 2xx status\n // see https://github.com/react-component/upload/issues/34\n if (xhr.status < 200 || xhr.status >= 300) {\n if (!option.onError) {\n return;\n }\n return option.onError(getError(option, xhr), getBody(xhr));\n }\n if (!option.onSuccess) {\n return;\n }\n return option.onSuccess(getBody(xhr), xhr);\n };\n\n xhr.open(option.method, option.action, true);\n\n // Has to be after `.open()`. See https://github.com/enyo/dropzone/issues/179\n if (option.withCredentials && 'withCredentials' in xhr) {\n xhr.withCredentials = true;\n }\n\n const headers = option.headers || {};\n\n // when set headers['X-Requested-With'] = null , can close default XHR header\n // see https://github.com/react-component/upload/issues/33\n if (headers['X-Requested-With'] !== null) {\n xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');\n }\n\n Object.keys(headers).forEach(h => {\n if (headers[h] !== null) {\n xhr.setRequestHeader(h, headers[h]);\n }\n });\n\n xhr.send(formData);\n\n return xhr;\n}\n","import { NativeNode } from '../types/native';\nimport { Nodes } from './nodes';\n\nexport class Fragment {\n // native document fragment\n private fragment: DocumentFragment;\n\n constructor(fragment?: DocumentFragment) {\n this.fragment = fragment ?? document.createDocumentFragment();\n }\n\n // Returns the descendants of the fragment which are selected by the specified CSS selector.\n public find(selector: string): Nodes {\n const nodeList: NativeNode[] = [];\n let child = new Nodes(this.fragment.firstChild);\n while (child.length > 0) {\n if (child.matches(selector)) {\n nodeList.push(child.get(0));\n } else if (child.isElement) {\n child.find(selector).each(node => {\n nodeList.push(node);\n });\n }\n child = child.next();\n }\n return new Nodes(nodeList);\n }\n\n // Inserts the specified node as the last child.\n public append(node: Nodes): void {\n node.each(nativeNode => {\n this.fragment.appendChild(nativeNode);\n });\n }\n}\n","/**\n * base64.ts\n *\n * Licensed under the BSD 3-Clause License.\n * http://opensource.org/licenses/BSD-3-Clause\n *\n * References:\n * http://en.wikipedia.org/wiki/Base64\n *\n * @author Dan Kogai (https://github.com/dankogai)\n */\nconst version = '3.7.7';\n/**\n * @deprecated use lowercase `version`.\n */\nconst VERSION = version;\nconst _hasBuffer = typeof Buffer === 'function';\nconst _TD = typeof TextDecoder === 'function' ? new TextDecoder() : undefined;\nconst _TE = typeof TextEncoder === 'function' ? new TextEncoder() : undefined;\nconst b64ch = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';\nconst b64chs = Array.prototype.slice.call(b64ch);\nconst b64tab = ((a) => {\n let tab = {};\n a.forEach((c, i) => tab[c] = i);\n return tab;\n})(b64chs);\nconst b64re = /^(?:[A-Za-z\\d+\\/]{4})*?(?:[A-Za-z\\d+\\/]{2}(?:==)?|[A-Za-z\\d+\\/]{3}=?)?$/;\nconst _fromCC = String.fromCharCode.bind(String);\nconst _U8Afrom = typeof Uint8Array.from === 'function'\n ? Uint8Array.from.bind(Uint8Array)\n : (it) => new Uint8Array(Array.prototype.slice.call(it, 0));\nconst _mkUriSafe = (src) => src\n .replace(/=/g, '').replace(/[+\\/]/g, (m0) => m0 == '+' ? '-' : '_');\nconst _tidyB64 = (s) => s.replace(/[^A-Za-z0-9\\+\\/]/g, '');\n/**\n * polyfill version of `btoa`\n */\nconst btoaPolyfill = (bin) => {\n // console.log('polyfilled');\n let u32, c0, c1, c2, asc = '';\n const pad = bin.length % 3;\n for (let i = 0; i < bin.length;) {\n if ((c0 = bin.charCodeAt(i++)) > 255 ||\n (c1 = bin.charCodeAt(i++)) > 255 ||\n (c2 = bin.charCodeAt(i++)) > 255)\n throw new TypeError('invalid character found');\n u32 = (c0 << 16) | (c1 << 8) | c2;\n asc += b64chs[u32 >> 18 & 63]\n + b64chs[u32 >> 12 & 63]\n + b64chs[u32 >> 6 & 63]\n + b64chs[u32 & 63];\n }\n return pad ? asc.slice(0, pad - 3) + \"===\".substring(pad) : asc;\n};\n/**\n * does what `window.btoa` of web browsers do.\n * @param {String} bin binary string\n * @returns {string} Base64-encoded string\n */\nconst _btoa = typeof btoa === 'function' ? (bin) => btoa(bin)\n : _hasBuffer ? (bin) => Buffer.from(bin, 'binary').toString('base64')\n : btoaPolyfill;\nconst _fromUint8Array = _hasBuffer\n ? (u8a) => Buffer.from(u8a).toString('base64')\n : (u8a) => {\n // cf. https://stackoverflow.com/questions/12710001/how-to-convert-uint8-array-to-base64-encoded-string/12713326#12713326\n const maxargs = 0x1000;\n let strs = [];\n for (let i = 0, l = u8a.length; i < l; i += maxargs) {\n strs.push(_fromCC.apply(null, u8a.subarray(i, i + maxargs)));\n }\n return _btoa(strs.join(''));\n };\n/**\n * converts a Uint8Array to a Base64 string.\n * @param {boolean} [urlsafe] URL-and-filename-safe a la RFC4648 §5\n * @returns {string} Base64 string\n */\nconst fromUint8Array = (u8a, urlsafe = false) => urlsafe ? _mkUriSafe(_fromUint8Array(u8a)) : _fromUint8Array(u8a);\n// This trick is found broken https://github.com/dankogai/js-base64/issues/130\n// const utob = (src: string) => unescape(encodeURIComponent(src));\n// reverting good old fationed regexp\nconst cb_utob = (c) => {\n if (c.length < 2) {\n var cc = c.charCodeAt(0);\n return cc < 0x80 ? c\n : cc < 0x800 ? (_fromCC(0xc0 | (cc >>> 6))\n + _fromCC(0x80 | (cc & 0x3f)))\n : (_fromCC(0xe0 | ((cc >>> 12) & 0x0f))\n + _fromCC(0x80 | ((cc >>> 6) & 0x3f))\n + _fromCC(0x80 | (cc & 0x3f)));\n }\n else {\n var cc = 0x10000\n + (c.charCodeAt(0) - 0xD800) * 0x400\n + (c.charCodeAt(1) - 0xDC00);\n return (_fromCC(0xf0 | ((cc >>> 18) & 0x07))\n + _fromCC(0x80 | ((cc >>> 12) & 0x3f))\n + _fromCC(0x80 | ((cc >>> 6) & 0x3f))\n + _fromCC(0x80 | (cc & 0x3f)));\n }\n};\nconst re_utob = /[\\uD800-\\uDBFF][\\uDC00-\\uDFFFF]|[^\\x00-\\x7F]/g;\n/**\n * @deprecated should have been internal use only.\n * @param {string} src UTF-8 string\n * @returns {string} UTF-16 string\n */\nconst utob = (u) => u.replace(re_utob, cb_utob);\n//\nconst _encode = _hasBuffer\n ? (s) => Buffer.from(s, 'utf8').toString('base64')\n : _TE\n ? (s) => _fromUint8Array(_TE.encode(s))\n : (s) => _btoa(utob(s));\n/**\n * converts a UTF-8-encoded string to a Base64 string.\n * @param {boolean} [urlsafe] if `true` make the result URL-safe\n * @returns {string} Base64 string\n */\nconst encode = (src, urlsafe = false) => urlsafe\n ? _mkUriSafe(_encode(src))\n : _encode(src);\n/**\n * converts a UTF-8-encoded string to URL-safe Base64 RFC4648 §5.\n * @returns {string} Base64 string\n */\nconst encodeURI = (src) => encode(src, true);\n// This trick is found broken https://github.com/dankogai/js-base64/issues/130\n// const btou = (src: string) => decodeURIComponent(escape(src));\n// reverting good old fationed regexp\nconst re_btou = /[\\xC0-\\xDF][\\x80-\\xBF]|[\\xE0-\\xEF][\\x80-\\xBF]{2}|[\\xF0-\\xF7][\\x80-\\xBF]{3}/g;\nconst cb_btou = (cccc) => {\n switch (cccc.length) {\n case 4:\n var cp = ((0x07 & cccc.charCodeAt(0)) << 18)\n | ((0x3f & cccc.charCodeAt(1)) << 12)\n | ((0x3f & cccc.charCodeAt(2)) << 6)\n | (0x3f & cccc.charCodeAt(3)), offset = cp - 0x10000;\n return (_fromCC((offset >>> 10) + 0xD800)\n + _fromCC((offset & 0x3FF) + 0xDC00));\n case 3:\n return _fromCC(((0x0f & cccc.charCodeAt(0)) << 12)\n | ((0x3f & cccc.charCodeAt(1)) << 6)\n | (0x3f & cccc.charCodeAt(2)));\n default:\n return _fromCC(((0x1f & cccc.charCodeAt(0)) << 6)\n | (0x3f & cccc.charCodeAt(1)));\n }\n};\n/**\n * @deprecated should have been internal use only.\n * @param {string} src UTF-16 string\n * @returns {string} UTF-8 string\n */\nconst btou = (b) => b.replace(re_btou, cb_btou);\n/**\n * polyfill version of `atob`\n */\nconst atobPolyfill = (asc) => {\n // console.log('polyfilled');\n asc = asc.replace(/\\s+/g, '');\n if (!b64re.test(asc))\n throw new TypeError('malformed base64.');\n asc += '=='.slice(2 - (asc.length & 3));\n let u24, bin = '', r1, r2;\n for (let i = 0; i < asc.length;) {\n u24 = b64tab[asc.charAt(i++)] << 18\n | b64tab[asc.charAt(i++)] << 12\n | (r1 = b64tab[asc.charAt(i++)]) << 6\n | (r2 = b64tab[asc.charAt(i++)]);\n bin += r1 === 64 ? _fromCC(u24 >> 16 & 255)\n : r2 === 64 ? _fromCC(u24 >> 16 & 255, u24 >> 8 & 255)\n : _fromCC(u24 >> 16 & 255, u24 >> 8 & 255, u24 & 255);\n }\n return bin;\n};\n/**\n * does what `window.atob` of web browsers do.\n * @param {String} asc Base64-encoded string\n * @returns {string} binary string\n */\nconst _atob = typeof atob === 'function' ? (asc) => atob(_tidyB64(asc))\n : _hasBuffer ? (asc) => Buffer.from(asc, 'base64').toString('binary')\n : atobPolyfill;\n//\nconst _toUint8Array = _hasBuffer\n ? (a) => _U8Afrom(Buffer.from(a, 'base64'))\n : (a) => _U8Afrom(_atob(a).split('').map(c => c.charCodeAt(0)));\n/**\n * converts a Base64 string to a Uint8Array.\n */\nconst toUint8Array = (a) => _toUint8Array(_unURI(a));\n//\nconst _decode = _hasBuffer\n ? (a) => Buffer.from(a, 'base64').toString('utf8')\n : _TD\n ? (a) => _TD.decode(_toUint8Array(a))\n : (a) => btou(_atob(a));\nconst _unURI = (a) => _tidyB64(a.replace(/[-_]/g, (m0) => m0 == '-' ? '+' : '/'));\n/**\n * converts a Base64 string to a UTF-8 string.\n * @param {String} src Base64 string. Both normal and URL-safe are supported\n * @returns {string} UTF-8 string\n */\nconst decode = (src) => _decode(_unURI(src));\n/**\n * check if a value is a valid Base64 string\n * @param {String} src a value to check\n */\nconst isValid = (src) => {\n if (typeof src !== 'string')\n return false;\n const s = src.replace(/\\s+/g, '').replace(/={0,2}$/, '');\n return !/[^\\s0-9a-zA-Z\\+/]/.test(s) || !/[^\\s0-9a-zA-Z\\-_]/.test(s);\n};\n//\nconst _noEnum = (v) => {\n return {\n value: v, enumerable: false, writable: true, configurable: true\n };\n};\n/**\n * extend String.prototype with relevant methods\n */\nconst extendString = function () {\n const _add = (name, body) => Object.defineProperty(String.prototype, name, _noEnum(body));\n _add('fromBase64', function () { return decode(this); });\n _add('toBase64', function (urlsafe) { return encode(this, urlsafe); });\n _add('toBase64URI', function () { return encode(this, true); });\n _add('toBase64URL', function () { return encode(this, true); });\n _add('toUint8Array', function () { return toUint8Array(this); });\n};\n/**\n * extend Uint8Array.prototype with relevant methods\n */\nconst extendUint8Array = function () {\n const _add = (name, body) => Object.defineProperty(Uint8Array.prototype, name, _noEnum(body));\n _add('toBase64', function (urlsafe) { return fromUint8Array(this, urlsafe); });\n _add('toBase64URI', function () { return fromUint8Array(this, true); });\n _add('toBase64URL', function () { return fromUint8Array(this, true); });\n};\n/**\n * extend Builtin prototypes with relevant methods\n */\nconst extendBuiltins = () => {\n extendString();\n extendUint8Array();\n};\nconst gBase64 = {\n version: version,\n VERSION: VERSION,\n atob: _atob,\n atobPolyfill: atobPolyfill,\n btoa: _btoa,\n btoaPolyfill: btoaPolyfill,\n fromBase64: decode,\n toBase64: encode,\n encode: encode,\n encodeURI: encodeURI,\n encodeURL: encodeURI,\n utob: utob,\n btou: btou,\n decode: decode,\n isValid: isValid,\n fromUint8Array: fromUint8Array,\n toUint8Array: toUint8Array,\n extendString: extendString,\n extendUint8Array: extendUint8Array,\n extendBuiltins: extendBuiltins\n};\n// makecjs:CUT //\nexport { version };\nexport { VERSION };\nexport { _atob as atob };\nexport { atobPolyfill };\nexport { _btoa as btoa };\nexport { btoaPolyfill };\nexport { decode as fromBase64 };\nexport { encode as toBase64 };\nexport { utob };\nexport { encode };\nexport { encodeURI };\nexport { encodeURI as encodeURL };\nexport { btou };\nexport { decode };\nexport { isValid };\nexport { fromUint8Array };\nexport { toUint8Array };\nexport { extendString };\nexport { extendUint8Array };\nexport { extendBuiltins };\n// and finally,\nexport { gBase64 as Base64 };\n","'use strict';\n\nvar has = Object.prototype.hasOwnProperty\n , prefix = '~';\n\n/**\n * Constructor to create a storage for our `EE` objects.\n * An `Events` instance is a plain object whose properties are event names.\n *\n * @constructor\n * @private\n */\nfunction Events() {}\n\n//\n// We try to not inherit from `Object.prototype`. In some engines creating an\n// instance in this way is faster than calling `Object.create(null)` directly.\n// If `Object.create(null)` is not supported we prefix the event names with a\n// character to make sure that the built-in object properties are not\n// overridden or used as an attack vector.\n//\nif (Object.create) {\n Events.prototype = Object.create(null);\n\n //\n // This hack is needed because the `__proto__` property is still inherited in\n // some old browsers like Android 4, iPhone 5.1, Opera 11 and Safari 5.\n //\n if (!new Events().__proto__) prefix = false;\n}\n\n/**\n * Representation of a single event listener.\n *\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} [once=false] Specify if the listener is a one-time listener.\n * @constructor\n * @private\n */\nfunction EE(fn, context, once) {\n this.fn = fn;\n this.context = context;\n this.once = once || false;\n}\n\n/**\n * Add a listener for a given event.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} once Specify if the listener is a one-time listener.\n * @returns {EventEmitter}\n * @private\n */\nfunction addListener(emitter, event, fn, context, once) {\n if (typeof fn !== 'function') {\n throw new TypeError('The listener must be a function');\n }\n\n var listener = new EE(fn, context || emitter, once)\n , evt = prefix ? prefix + event : event;\n\n if (!emitter._events[evt]) emitter._events[evt] = listener, emitter._eventsCount++;\n else if (!emitter._events[evt].fn) emitter._events[evt].push(listener);\n else emitter._events[evt] = [emitter._events[evt], listener];\n\n return emitter;\n}\n\n/**\n * Clear event by name.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} evt The Event name.\n * @private\n */\nfunction clearEvent(emitter, evt) {\n if (--emitter._eventsCount === 0) emitter._events = new Events();\n else delete emitter._events[evt];\n}\n\n/**\n * Minimal `EventEmitter` interface that is molded against the Node.js\n * `EventEmitter` interface.\n *\n * @constructor\n * @public\n */\nfunction EventEmitter() {\n this._events = new Events();\n this._eventsCount = 0;\n}\n\n/**\n * Return an array listing the events for which the emitter has registered\n * listeners.\n *\n * @returns {Array}\n * @public\n */\nEventEmitter.prototype.eventNames = function eventNames() {\n var names = []\n , events\n , name;\n\n if (this._eventsCount === 0) return names;\n\n for (name in (events = this._events)) {\n if (has.call(events, name)) names.push(prefix ? name.slice(1) : name);\n }\n\n if (Object.getOwnPropertySymbols) {\n return names.concat(Object.getOwnPropertySymbols(events));\n }\n\n return names;\n};\n\n/**\n * Return the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Array} The registered listeners.\n * @public\n */\nEventEmitter.prototype.listeners = function listeners(event) {\n var evt = prefix ? prefix + event : event\n , handlers = this._events[evt];\n\n if (!handlers) return [];\n if (handlers.fn) return [handlers.fn];\n\n for (var i = 0, l = handlers.length, ee = new Array(l); i < l; i++) {\n ee[i] = handlers[i].fn;\n }\n\n return ee;\n};\n\n/**\n * Return the number of listeners listening to a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Number} The number of listeners.\n * @public\n */\nEventEmitter.prototype.listenerCount = function listenerCount(event) {\n var evt = prefix ? prefix + event : event\n , listeners = this._events[evt];\n\n if (!listeners) return 0;\n if (listeners.fn) return 1;\n return listeners.length;\n};\n\n/**\n * Calls each of the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Boolean} `true` if the event had listeners, else `false`.\n * @public\n */\nEventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) {\n var evt = prefix ? prefix + event : event;\n\n if (!this._events[evt]) return false;\n\n var listeners = this._events[evt]\n , len = arguments.length\n , args\n , i;\n\n if (listeners.fn) {\n if (listeners.once) this.removeListener(event, listeners.fn, undefined, true);\n\n switch (len) {\n case 1: return listeners.fn.call(listeners.context), true;\n case 2: return listeners.fn.call(listeners.context, a1), true;\n case 3: return listeners.fn.call(listeners.context, a1, a2), true;\n case 4: return listeners.fn.call(listeners.context, a1, a2, a3), true;\n case 5: return listeners.fn.call(listeners.context, a1, a2, a3, a4), true;\n case 6: return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true;\n }\n\n for (i = 1, args = new Array(len -1); i < len; i++) {\n args[i - 1] = arguments[i];\n }\n\n listeners.fn.apply(listeners.context, args);\n } else {\n var length = listeners.length\n , j;\n\n for (i = 0; i < length; i++) {\n if (listeners[i].once) this.removeListener(event, listeners[i].fn, undefined, true);\n\n switch (len) {\n case 1: listeners[i].fn.call(listeners[i].context); break;\n case 2: listeners[i].fn.call(listeners[i].context, a1); break;\n case 3: listeners[i].fn.call(listeners[i].context, a1, a2); break;\n case 4: listeners[i].fn.call(listeners[i].context, a1, a2, a3); break;\n default:\n if (!args) for (j = 1, args = new Array(len -1); j < len; j++) {\n args[j - 1] = arguments[j];\n }\n\n listeners[i].fn.apply(listeners[i].context, args);\n }\n }\n }\n\n return true;\n};\n\n/**\n * Add a listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.on = function on(event, fn, context) {\n return addListener(this, event, fn, context, false);\n};\n\n/**\n * Add a one-time listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.once = function once(event, fn, context) {\n return addListener(this, event, fn, context, true);\n};\n\n/**\n * Remove the listeners of a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn Only remove the listeners that match this function.\n * @param {*} context Only remove the listeners that have this context.\n * @param {Boolean} once Only remove one-time listeners.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.removeListener = function removeListener(event, fn, context, once) {\n var evt = prefix ? prefix + event : event;\n\n if (!this._events[evt]) return this;\n if (!fn) {\n clearEvent(this, evt);\n return this;\n }\n\n var listeners = this._events[evt];\n\n if (listeners.fn) {\n if (\n listeners.fn === fn &&\n (!once || listeners.once) &&\n (!context || listeners.context === context)\n ) {\n clearEvent(this, evt);\n }\n } else {\n for (var i = 0, events = [], length = listeners.length; i < length; i++) {\n if (\n listeners[i].fn !== fn ||\n (once && !listeners[i].once) ||\n (context && listeners[i].context !== context)\n ) {\n events.push(listeners[i]);\n }\n }\n\n //\n // Reset the array, or remove it completely if we have no more listeners.\n //\n if (events.length) this._events[evt] = events.length === 1 ? events[0] : events;\n else clearEvent(this, evt);\n }\n\n return this;\n};\n\n/**\n * Remove all listeners, or those of the specified event.\n *\n * @param {(String|Symbol)} [event] The event name.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.removeAllListeners = function removeAllListeners(event) {\n var evt;\n\n if (event) {\n evt = prefix ? prefix + event : event;\n if (this._events[evt]) clearEvent(this, evt);\n } else {\n this._events = new Events();\n this._eventsCount = 0;\n }\n\n return this;\n};\n\n//\n// Alias methods names because people roll like that.\n//\nEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\nEventEmitter.prototype.addListener = EventEmitter.prototype.on;\n\n//\n// Expose the prefix.\n//\nEventEmitter.prefixed = prefix;\n\n//\n// Allow `EventEmitter` to be imported as module namespace.\n//\nEventEmitter.EventEmitter = EventEmitter;\n\n//\n// Expose the module.\n//\nif ('undefined' !== typeof module) {\n module.exports = EventEmitter;\n}\n","import type { BoxComponent } from '../types/box';\n\nexport const boxes: Map<string, BoxComponent> = new Map();\n","import type { Editor } from '..';\n\nexport const editors: Map<number, Editor> = new Map();\n","import { Base64 } from 'js-base64';\nimport EventEmitter from 'eventemitter3';\nimport type { Editor } from '../editor';\nimport { NativeNode } from '../types/native';\nimport { BoxType, BoxValue } from '../types/box';\nimport { boxes } from '../storage/boxes';\nimport { editors } from '../storage/editors';\nimport { debug } from '../utils/debug';\nimport { forEach } from '../utils/for-each';\nimport { safeTemplate } from '../utils/safe-template';\nimport { encode } from '../utils/encode';\nimport { query } from '../utils/query';\nimport { morph } from '../utils/morph';\nimport { Nodes } from './nodes';\n\ntype CleanupFunction = () => void;\ntype SetupFunction = () => CleanupFunction | void;\n\n// Is a key-value object for storing data about box.\nconst boxData: { [key: number]: { [key: string]: any } } = {};\n\n// Is a key-value object for storing all effects.\nconst effectData: { [key: number]: { setup: SetupFunction[], cleanup: CleanupFunction[] } } = {};\n\nconst framework = safeTemplate`\n <span class=\"lake-box-strip\"><br /></span>\n <div class=\"lake-box-container\" contenteditable=\"false\"></div>\n <span class=\"lake-box-strip\"><br /></span>\n`;\n\nexport class Box {\n // <lake-box> element\n public node: Nodes;\n\n public event: EventEmitter = new EventEmitter();\n\n constructor(node: string | Nodes | NativeNode) {\n if (typeof node === 'string') {\n const component = boxes.get(node);\n if (component === undefined) {\n throw new Error(`Box '${node}' has not been defined yet.`);\n }\n const type = encode(component.type);\n const name = encode(component.name);\n this.node = query(safeTemplate`<lake-box type=\"${type}\" name=\"${name}\"></lake-box>`);\n if (component.value) {\n this.value = component.value;\n }\n } else {\n this.node = query(node);\n const component = boxes.get(this.name);\n if (component === undefined) {\n throw new Error(`Box '${this.name}' has not been defined yet.`);\n }\n if (component.value && !this.node.hasAttr('value')) {\n this.value = component.value;\n }\n }\n if (!boxData[this.node.id]) {\n boxData[this.node.id] = {};\n }\n if (!effectData[this.node.id]) {\n effectData[this.node.id] = {\n setup: [],\n cleanup: [],\n };\n }\n }\n\n // Adds the framework of the box.\n private addFramework(): void {\n let container = this.getContainer();\n if (container.length === 0) {\n this.node.html(framework);\n container = this.getContainer();\n } else {\n container.off('mouseenter');\n container.off('mouseleave');\n container.off('click');\n }\n container.on('mousedown', event => {\n event.preventDefault();\n });\n container.on('mouseenter', () => {\n if (\n container.hasClass('lake-box-selected') ||\n container.hasClass('lake-box-focused') ||\n container.hasClass('lake-box-activated')\n ) {\n return;\n }\n container.addClass('lake-box-hovered');\n });\n container.on('mouseleave', () => {\n container.removeClass('lake-box-hovered');\n });\n container.on('click', () => {\n debug(`Box '${this.name}' (id = ${this.node.id}) value:`);\n debug(this.value);\n });\n }\n\n // Returns the type of the box.\n public get type(): BoxType {\n return this.node.attr('type') as BoxType;\n }\n\n // Returns the name of the box.\n public get name(): string {\n return this.node.attr('name');\n }\n\n // Returns the value of the box.\n public get value(): BoxValue {\n const value = this.node.attr('value');\n if (value === '') {\n return {};\n }\n return JSON.parse(Base64.decode(value));\n }\n\n // Sets the value of the box.\n public set value(value: BoxValue) {\n this.node.attr('value', Base64.encode(JSON.stringify(value)));\n }\n\n // Updates part of the value of the box.\n public updateValue(valueKey: string, valueValue: string): void;\n\n public updateValue(valueKey: BoxValue): void;\n\n public updateValue(valueKey: any, valueValue?: any): void {\n const value = this.value;\n if (typeof valueKey === 'string') {\n value[valueKey] = valueValue;\n } else {\n forEach(valueKey, (key, val) => {\n value[key] = val;\n });\n }\n this.value = value;\n }\n\n // Returns data of the box.\n public getData(key: string): any {\n return boxData[this.node.id][key];\n }\n\n // Updates data of the box.\n public setData(key: string, value: any): void {\n boxData[this.node.id][key] = value;\n }\n\n // Returns the editor instance of the box.\n public getEditor(): Editor | undefined {\n const container = this.node.closest('div[contenteditable]');\n return container.length > 0 ? editors.get(container.id) : undefined;\n }\n\n // Returns the container node of the box.\n public getContainer(): Nodes {\n return this.node.find('.lake-box-container');\n }\n\n public useEffect(setup: SetupFunction): void {\n effectData[this.node.id].setup.push(setup);\n }\n\n // Renders the contents of the box.\n public render(): void {\n effectData[this.node.id].setup = [];\n effectData[this.node.id].cleanup = [];\n const component = boxes.get(this.name);\n if (component === undefined) {\n return;\n }\n this.addFramework();\n const content = component.render(this);\n if (content !== undefined) {\n const container = this.getContainer();\n const newContainer = container.clone(false);\n newContainer.append(content);\n morph(container, newContainer);\n }\n for (const setup of effectData[this.node.id].setup) {\n const result = setup();\n if (result !== undefined) {\n effectData[this.node.id].cleanup.push(result);\n }\n }\n debug(`Box '${this.name}' (id = ${this.node.id}) rendered`);\n }\n\n // Destroys a rendered box.\n public unmount(): void {\n for (const cleanup of effectData[this.node.id].cleanup) {\n cleanup();\n }\n boxData[this.node.id] = {};\n effectData[this.node.id].setup = [];\n effectData[this.node.id].cleanup = [];\n this.node.empty();\n debug(`Box '${this.name}' (id = ${this.node.id}) unmounted`);\n }\n\n // Returns a HTML string of the box.\n public getHTML(): string {\n const component = boxes.get(this.name);\n if (component === undefined) {\n return '';\n }\n if (component.html === undefined) {\n return this.node.outerHTML();\n }\n return component.html(this);\n }\n}\n","const blockAttributeRules: any = {\n id: /^[\\w-]+$/,\n class: /^[\\w-]+$/,\n style: {\n 'text-align': ['left', 'center', 'right', 'justify', 'start', 'end'],\n 'margin-left': /^-?\\d+px$/i,\n 'text-indent': /^-?\\d+em$/i,\n },\n};\n\nexport function getElementRules(): any {\n return {\n h1: {\n ...blockAttributeRules,\n },\n h2: {\n ...blockAttributeRules,\n },\n h3: {\n ...blockAttributeRules,\n },\n h4: {\n ...blockAttributeRules,\n },\n h5: {\n ...blockAttributeRules,\n },\n h6: {\n ...blockAttributeRules,\n },\n p: {\n ...blockAttributeRules,\n },\n blockquote: {\n ...blockAttributeRules,\n type: ['success', 'info', 'warning', 'error'],\n },\n ul: {\n ...blockAttributeRules,\n type: 'checklist',\n indent: /^\\d+$/,\n },\n ol: {\n ...blockAttributeRules,\n start: /^\\d+$/,\n indent: /^\\d+$/,\n },\n li: {\n value: ['true', 'false'],\n },\n table: {\n style: {\n width: /^-?\\d+(px|%)$/i,\n height: /^-?\\d+(px|%)$/i,\n border: /^[^\"]+$/,\n 'border-width': /^-?\\d+px$/i,\n 'border-style': /^[\\w-]+$/,\n 'border-color': /^[^\"]+$/,\n 'background-color': /^[^\"]+$/,\n },\n },\n tr: {\n style: {\n height: /^-?\\d+(px|%)$/i,\n },\n },\n th: 'td',\n td: {\n colspan: /^\\d+$/,\n rowspan: /^\\d+$/,\n style: {\n width: /^-?\\d+(px|%)$/i,\n height: /^-?\\d+(px|%)$/i,\n border: /^[^\"]+$/,\n 'border-width': /^-?\\d+px$/i,\n 'border-style': /^[\\w-]+$/,\n 'border-color': /^[^\"]+$/,\n 'background-color': /^[^\"]+$/,\n 'text-align': ['left', 'center', 'right', 'justify'],\n },\n },\n 'lake-box': {\n type: ['inline', 'block'],\n name: /^[\\w-]+$/,\n value: /^[^\"]+$/,\n focus: ['start', 'center', 'end'],\n },\n br: {},\n hr: {},\n img : {\n src: /^[^\"]+$/,\n width: /^-?\\d+px$/i,\n height: /^-?\\d+px$/i,\n 'data-lake-value': /^[^\"]+$/,\n alt: /^[^\"]+$/,\n style: {\n width: /^-?\\d+px$/i,\n height: /^-?\\d+px$/i,\n },\n },\n span: {\n class: /^[\\w-]+$/,\n style: {\n color: /^[^\"]+$/,\n 'background-color': /^[^\"]+$/,\n 'font-family': /^[^;]+$/,\n 'font-size': /^[^\"]+$/,\n },\n },\n b: 'strong',\n strong: {},\n em: 'i',\n i: {},\n u: {},\n s: {},\n sub: {},\n sup: {},\n code: {},\n a: {\n class: /^[\\w-]+$/,\n name: /^[\\w-]+$/,\n href: /^[^\"]+$/,\n target: /^[\\w-]+$/,\n rel: /^[^\"]+$/,\n download: /^[^\"]+$/,\n },\n 'lake-bookmark': {\n type: ['anchor', 'focus'],\n },\n };\n}\n","import { getElementRules } from '../config/element-rules';\nimport { forEach, parseStyle, encode } from '../utils';\nimport { Nodes } from '../models/nodes';\n\nexport class HTMLParser {\n\n private rules: any;\n\n private source: Nodes;\n\n constructor(content: string | Nodes, rules = getElementRules()) {\n this.rules = rules;\n if (typeof content === 'string') {\n this.source = this.parseHTML(content);\n } else {\n this.source = content;\n }\n }\n\n // Parses HTML string and returns the resulting body element.\n private parseHTML(html: string): Nodes {\n const parser = new DOMParser();\n const doc = parser.parseFromString(html, 'text/html');\n return new Nodes(doc.querySelector('body'));\n }\n\n // Returns a boolean indicating whether a value matches the specified rule.\n private static matchRule(rule: any, value: string): boolean {\n if (typeof rule === 'string') {\n return rule === value;\n }\n if (Array.isArray(rule)) {\n return rule.indexOf(value) >= 0;\n }\n if (rule instanceof RegExp) {\n return rule.test(value);\n }\n return false;\n }\n\n // Returns an open tag string of the specified element.\n private static getOpenTagString(element: Nodes, rules: any) : string {\n let tagName = element.name;\n let attributeRules = rules[tagName];\n if (!attributeRules) {\n return '';\n }\n if (typeof attributeRules === 'string') {\n tagName = attributeRules;\n attributeRules = rules[tagName];\n }\n const nativeNode = element.get(0) as Element;\n if (!nativeNode.hasAttributes()) {\n return tagName;\n }\n const attributeMap: Map<string, string | Map<string, string>> = new Map();\n for (const attr of nativeNode.attributes) {\n if (attributeRules[attr.name]) {\n if (attr.name !== 'style' && HTMLParser.matchRule(attributeRules[attr.name], attr.value)) {\n attributeMap.set(attr.name, attr.value);\n }\n if (attr.name === 'style') {\n const styleRules = attributeRules.style;\n const styleMap: Map<string, string> = new Map();\n forEach(parseStyle(attr.value), (key, value) => {\n if (styleRules[key] && HTMLParser.matchRule(styleRules[key], value)) {\n styleMap.set(key, value);\n }\n });\n attributeMap.set('style', styleMap);\n }\n }\n }\n let openTag = tagName;\n for (const [attrName, attrValue] of attributeMap) {\n if (attrName === 'style') {\n let styleString = '';\n for (const [styleName, styleValue] of attrValue) {\n styleString += `${styleName}: ${styleValue.replace(/\"/g, '&quot;')}; `;\n }\n if (styleString !== '') {\n openTag += ` style=\"${styleString.trim()}\"`;\n }\n } else {\n openTag += ` ${attrName}=\"${attrValue}\"`;\n }\n }\n return openTag;\n }\n\n // Returns a closed tag string of the specified element.\n private static getClosedTagString(element: Nodes, rules: any) : string {\n let tagName = element.name;\n const attributeRules = rules[tagName];\n if (!attributeRules) {\n return '';\n }\n if (typeof attributeRules === 'string') {\n tagName = attributeRules;\n }\n return tagName;\n }\n\n // Returns the value of the text node with trimming invisible whitespace.\n // <p>foo</p>\\n<p>bar</p>\n // or\n // <p>\\nfoo\\n</p>\n private static getTrimmedText(textNode: Nodes): string {\n const parentNode = textNode.parent();\n const prevSibling = textNode.prev();\n const nextSibling = textNode.next();\n let nodeValue = textNode.text();\n if (\n (prevSibling.isBlock || prevSibling.isBlockBox) &&\n (nextSibling.isBlock || nextSibling.isBlockBox) ||\n prevSibling.length === 0 && nextSibling.length === 0 && parentNode.isBlock\n ) {\n nodeValue = nodeValue.replace(/^[\\u0020\\t\\r\\n]+|[\\u0020\\t\\r\\n]+$/g, '');\n } else if (\n (prevSibling.isBlock || prevSibling.isBlockBox) ||\n prevSibling.length === 0 && parentNode.isBlock)\n {\n nodeValue = nodeValue.replace(/^[\\u0020\\t\\r\\n]+/, '');\n } else if (\n (nextSibling.isBlock || nextSibling.isBlockBox) ||\n nextSibling.length === 0 && parentNode.isBlock\n ) {\n nodeValue = nodeValue.replace(/[\\u0020\\t\\r\\n]+$/, '');\n }\n return nodeValue;\n }\n\n // Returns the result as HTML format.\n public getHTML(): string {\n const rules = this.rules;\n function * iterate(node: Nodes): Generator<string> {\n let child = node.first();\n while (child.length > 0) {\n const nextNode = child.next();\n if (child.isText) {\n yield encode(HTMLParser.getTrimmedText(child));\n } else if (child.isVoid) {\n const openTag = HTMLParser.getOpenTagString(child, rules);\n if (openTag !== '') {\n yield `<${openTag} />`;\n }\n } else if (child.isElement) {\n const openTag = HTMLParser.getOpenTagString(child, rules);\n const closedTag = HTMLParser.getClosedTagString(child, rules);\n if (openTag !== '') {\n yield `<${openTag}>`;\n }\n if (!child.isBox) {\n yield * iterate(child);\n }\n if (closedTag !== '') {\n yield `</${closedTag}>`;\n }\n }\n child = nextNode;\n }\n }\n let html = '';\n for (const value of iterate(this.source)) {\n html += value;\n }\n return html.trim();\n }\n\n // Returns the result as node list.\n public getNodeList(): Nodes[] {\n const html = this.getHTML();\n const body = this.parseHTML(html);\n return body.children();\n }\n\n // Returns the result as document fragment.\n public getFragment(): DocumentFragment {\n const html = this.getHTML();\n const body = this.parseHTML(html);\n const fragment = document.createDocumentFragment();\n let child = body.first();\n while (child.length > 0) {\n const nextNode = child.next();\n fragment.appendChild(child.get(0));\n child = nextNode;\n }\n return fragment;\n }\n}\n","import { encode } from '../utils';\nimport { HTMLParser } from './html-parser';\n\nexport class TextParser {\n\n private content: string;\n\n constructor(content: string) {\n this.content = content;\n }\n\n public getHTML(): string {\n let html = this.content;\n html = html.replace(/ {2}/g, ' \\xA0');\n html = encode(html.trim());\n html = `<p>${html}</p>`;\n html = html.replace(/(\\r\\n){2,}/g, '</p><p><br /></p><p>');\n html = html.replace(/\\r\\n/g, '</p><p>');\n html = html.replace(/[\\r\\n]{2,}/g, '</p><p><br /></p><p>');\n html = html.replace(/[\\r\\n]/g, '</p><p>');\n return html;\n }\n\n public getFragment(): DocumentFragment {\n const htmlParser = new HTMLParser(this.getHTML());\n return htmlParser.getFragment();\n }\n}\n","import { NativeNode } from '../types/native';\nimport { query } from '../utils/query';\nimport { Nodes } from '../models/nodes';\nimport { Range } from '../models/range';\n\n// Inserts a node into the specified range.\nexport function insertNode(range: Range, node: NativeNode | Nodes): void {\n if (range.commonAncestor.isOutside) {\n return;\n }\n node = query(node);\n const nativeNode = node.get(0);\n const nativeRange = range.get();\n nativeRange.insertNode(nativeNode);\n nativeRange.setEndAfter(nativeNode);\n nativeRange.collapse(false);\n}\n","import { query } from '../utils';\nimport { Nodes } from '../models/nodes';\nimport { Range } from '../models/range';\nimport { insertNode } from './insert-node';\n\n// Either the method inserts a bookmark into the current position of the collapsed range\n// or the method inserts a pair of bookmarks into the beginning and the end of the range.\n// case 1: foo<lake-bookmark type=\"focus\" />bar\n// case 2: <lake-bookmark type=\"anchor\" />foo<lake-bookmark type=\"focus\" />\n// case 3: foo<lake-box type=\"inline\" name=\"image\" focus=\"start\"></lake-box>bar\n// case 4: foo<lake-box type=\"inline\" name=\"image\" focus=\"end\"></lake-box>bar\n// case 5: <lake-bookmark type=\"anchor\" /><lake-box type=\"inline\" name=\"image\"></lake-box>foo<lake-bookmark type=\"focus\" />\nexport function insertBookmark(range: Range): { anchor: Nodes, focus: Nodes } {\n if (range.commonAncestor.isOutside) {\n return {\n anchor: new Nodes(),\n focus: new Nodes(),\n };\n }\n // box\n const boxNode = range.startNode.closest('lake-box');\n if (boxNode.length > 0) {\n if (range.isBoxStart) {\n boxNode.attr('focus', 'start');\n } else if (range.isBoxEnd) {\n boxNode.attr('focus', 'end');\n } else {\n boxNode.attr('focus', 'center');\n }\n return {\n anchor: new Nodes(),\n focus: boxNode,\n };\n }\n // collapsed range\n if (range.isCollapsed) {\n const endRange = range.clone();\n endRange.collapseToEnd();\n const focus = query('<lake-bookmark type=\"focus\" />');\n insertNode(endRange, focus);\n return {\n anchor: new Nodes(),\n focus,\n };\n }\n // expanded range\n const startRange = range.clone();\n startRange.collapseToStart();\n const anchor = query('<lake-bookmark type=\"anchor\" />');\n insertNode(startRange, anchor);\n const endRange = range.clone();\n endRange.collapseToEnd();\n const focus = query('<lake-bookmark type=\"focus\" />');\n insertNode(endRange, focus);\n return {\n anchor,\n focus,\n };\n}\n","import { removeZWS } from '../utils/remove-zws';\nimport { Nodes } from '../models/nodes';\nimport { Range } from '../models/range';\nimport { Box } from '../models/box';\n\nfunction removeAndNormalizeNode(node: Nodes, range?: Range) {\n const previousNode = node.prev();\n const nextNode = node.next();\n if (previousNode.isText && nextNode.isText) {\n const parentNode = node.parent();\n removeZWS(parentNode);\n node.remove();\n parentNode.get(0).normalize();\n } else if (previousNode.length === 0 && nextNode.length === 0) {\n if (node.parent().isMark && range) {\n const zeroWidthSpace = new Nodes(document.createTextNode('\\u200B'));\n node.before(zeroWidthSpace);\n range.setStartAfter(zeroWidthSpace);\n range.collapseToStart();\n }\n node.remove();\n } else {\n node.remove();\n }\n}\n\n// Sets the specified range to the range represented by the bookmark.\nexport function toBookmark(range: Range, bookmark: { anchor: Nodes, focus: Nodes }): void {\n const anchor = bookmark.anchor;\n const focus = bookmark.focus;\n // Only the anchor is removed because the focus does not exist, which is not correct case.\n if (anchor.length > 0 && focus.length === 0) {\n removeAndNormalizeNode(anchor);\n return;\n }\n if (focus.length > 0 && anchor.length === 0) {\n if (focus.isBox) {\n const box = new Box(focus);\n if (box.getContainer().length === 0) {\n box.render();\n }\n const focusValue = focus.attr('focus');\n if (focusValue === 'start') {\n range.selectBoxStart(focus);\n } else if (focusValue === 'center') {\n range.selectBox(focus);\n } else {\n range.selectBoxEnd(focus);\n }\n focus.removeAttr('focus');\n return;\n }\n range.setStartBefore(focus);\n range.collapseToStart();\n removeAndNormalizeNode(focus, range);\n return;\n }\n if (anchor.length > 0 && focus.length > 0) {\n const anchorRange = new Range();\n anchorRange.selectNode(anchor);\n anchorRange.collapseToEnd();\n // The anchor node is after the focus node.\n if (anchorRange.compareAfterNode(focus) === -1) {\n range.setStartBefore(focus);\n removeAndNormalizeNode(focus);\n range.setEndBefore(anchor);\n removeAndNormalizeNode(anchor);\n } else {\n range.setStartBefore(anchor);\n removeAndNormalizeNode(anchor);\n range.setEndBefore(focus);\n removeAndNormalizeNode(focus);\n }\n }\n}\n","import { fixNumberedList } from '../utils';\nimport { Range } from '../models/range';\n\nexport function fixList(range: Range): void {\n if (range.commonAncestor.isOutside) {\n return;\n }\n const blocks = range.getBlocks();\n fixNumberedList(blocks);\n}\n","import { query } from '../utils/query';\nimport { appendDeepest } from '../utils/append-deepest';\nimport { mergeNodes } from '../utils/merge-nodes';\nimport { Range } from '../models/range';\nimport { fixList } from './fix-list';\nimport { insertBookmark } from './insert-bookmark';\nimport { toBookmark } from './to-bookmark';\n\n// Removes the contents of the specified range.\nexport function deleteContents(range: Range): void {\n if (range.isCollapsed) {\n return;\n }\n range.adapt();\n if (range.isInoperative) {\n return;\n }\n const startBlock = range.startNode.closestBlock();\n const endBlock = range.endNode.closestBlock();\n const noMerge = startBlock.get(0) === endBlock.get(0);\n const nativeRange = range.get();\n nativeRange.deleteContents();\n range.adaptBlock();\n if (noMerge) {\n const block = range.getBlocks()[0];\n if (block && block.isEmpty) {\n appendDeepest(block, query('<br />'));\n range.shrinkAfter(block);\n }\n return;\n }\n const block = range.getBlocks()[0];\n if (!block) {\n return;\n }\n const prevBlock = block.prev();\n if (prevBlock.length === 0) {\n return;\n }\n const bookmark = insertBookmark(range);\n mergeNodes(prevBlock, block);\n toBookmark(range, bookmark);\n fixList(range);\n}\n","import { removeBr } from '../utils/remove-br';\nimport { Range } from '../models/range';\nimport { deleteContents } from './delete-contents';\nimport { insertBookmark } from './insert-bookmark';\nimport { toBookmark } from './to-bookmark';\n\n// Inserts a DocumentFragment object into the specified range.\nexport function insertFragment(range: Range, fragment: DocumentFragment): void {\n if (range.commonAncestor.isOutside) {\n return;\n }\n if (range.isCollapsed) {\n range.adaptBox();\n } else {\n deleteContents(range);\n }\n const block = range.startNode.closestBlock();\n removeBr(block);\n const bookmark = insertBookmark(range);\n bookmark.focus.before(fragment);\n toBookmark(range, bookmark);\n range.adaptBlock();\n}\n","import { query } from '../utils';\nimport { Range } from '../models/range';\nimport { insertFragment } from './insert-fragment';\n\n// Inserts a HTML string into the specified range.\nexport function insertContents(range: Range, value: string): void {\n const nodes = query(value);\n const fragment = document.createDocumentFragment();\n nodes.each(nativeNode => {\n fragment.appendChild(nativeNode);\n });\n insertFragment(range, fragment);\n}\n","import { KeyValue } from '../types/object';\nimport { query, getDeepest, wrapNodeList, appendDeepest } from '../utils';\nimport { Nodes } from '../models/nodes';\nimport { Range } from '../models/range';\nimport { insertBookmark } from './insert-bookmark';\nimport { toBookmark } from './to-bookmark';\nimport { fixList } from './fix-list';\n\nfunction getTopNonBlockNodes(range: Range): Nodes[] {\n const container = range.commonAncestor.closest('div[contenteditable=\"true\"],td');\n let nodeList: Nodes[] = [];\n if (container.length === 0) {\n return nodeList;\n }\n let node = container.first();\n let isBeforeRange = true;\n while (node.length > 0) {\n if (node.isMark || node.isText || node.isBookmark || node.isInlineBox) {\n nodeList.push(node);\n } else {\n if (!isBeforeRange) {\n break;\n }\n nodeList = [];\n }\n if (range.intersectsNode(node)) {\n isBeforeRange = false;\n }\n node = node.next();\n }\n return nodeList;\n}\n\n// Adds new blocks or changes target blocks relating to the specified range.\nexport function setBlocks(range: Range, value: string | KeyValue): void {\n if (range.commonAncestor.isOutside) {\n return;\n }\n if (range.isCollapsed) {\n if (range.isBox) {\n return;\n }\n }\n // changes the attributes of target blocks\n if (typeof value !== 'string') {\n const blockList = range.getBlocks();\n for (const block of blockList) {\n block.css(value);\n }\n return;\n }\n // adds or replace blocks\n const valueNode = query(value);\n const tagName = valueNode.name;\n const nativeValueNode = valueNode.get(0) as Element;\n const attributes = nativeValueNode.attributes;\n const blockList = range.getBlocks();\n // has blocks\n if (blockList.length > 0) {\n const bookmark = insertBookmark(range);\n for (const node of blockList) {\n if (node.name === tagName && valueNode.first().length === 0) {\n for (const attr of attributes) {\n node.attr(attr.name, attr.value);\n }\n } else {\n const block = valueNode.clone(true);\n if (node.isList && node.attr('indent') !== '') {\n block.attr('indent', node.attr('indent'));\n }\n const deepestBlock = getDeepest(block);\n let child = node.first();\n while(child.length > 0) {\n const nextNode = child.next();\n deepestBlock.append(child);\n if (deepestBlock.name === child.name || child.name === 'li') {\n child.remove(true);\n }\n child = nextNode;\n }\n node.replaceWith(block);\n }\n }\n toBookmark(range, bookmark);\n fixList(range);\n return;\n }\n // no block\n const bookmark = insertBookmark(range);\n const nonBlockNodes = getTopNonBlockNodes(range);\n const block = wrapNodeList(nonBlockNodes, valueNode);\n toBookmark(range, bookmark);\n fixList(range);\n if (block.isEmpty) {\n appendDeepest(block, query('<br />'));\n range.shrinkAfter(block);\n }\n}\n","import { TwoParts } from '../types/object';\nimport { query, splitNodes, appendDeepest } from '../utils';\nimport { Range } from '../models/range';\nimport { fixList } from './fix-list';\nimport { deleteContents } from './delete-contents';\n\n// Removes the contents of the specified range and then splits the block node at the point of the collapsed range.\n// <p>one<anchor />two<focus />three</p>\n// to\n// <p>one</p>\n// <p><focus />three</p>\nexport function splitBlock(range: Range): TwoParts {\n if (range.commonAncestor.isOutside) {\n return {\n start: null,\n end: null,\n };\n }\n if (range.isCollapsed) {\n range.adaptBox();\n } else {\n deleteContents(range);\n }\n const node = range.startNode;\n const closestBlock = node.closestOperableBlock();\n if (closestBlock.length === 0) {\n return {\n start: null,\n end: null,\n };\n }\n let limitBlock = closestBlock.parent();\n if (limitBlock.isOutside) {\n limitBlock = node.closestContainer();\n }\n const parts = splitNodes(node, range.startOffset, limitBlock);\n let start = null;\n let end = null;\n if (parts) {\n start = parts.start;\n end = parts.end;\n }\n if (!parts && node.isBlock) {\n if (range.startOffset > 0) {\n start = node.children()[range.startOffset - 1];\n }\n end = node.children()[range.startOffset];\n if (end && !end.isBlock) {\n end = null;\n }\n }\n if (start && start.isEmpty) {\n appendDeepest(start, query('<br />'));\n }\n if (end) {\n if (end.isEmpty) {\n appendDeepest(end, query('<br />'));\n range.shrinkAfter(end);\n } else {\n range.shrinkBefore(end);\n }\n }\n fixList(range);\n return {\n start,\n end,\n };\n}\n","import { TwoParts, ThreeParts } from '../types/object';\nimport { splitNodes } from '../utils';\nimport { Nodes } from '../models/nodes';\nimport { Range } from '../models/range';\n\n// Removes empty marks that contain no content.\nfunction removeEmptyMarks(node: Nodes): void {\n if (node.isMark && node.isEmpty) {\n node.remove();\n return;\n }\n for (const child of node.getWalker()) {\n if (child.isMark && child.isEmpty) {\n child.remove();\n }\n }\n}\n\n// Splits text nodes or mark nodes at a specified position.\nfunction splitMarksAtPoint(node: Nodes, offset: number, removeEmptyMark: boolean): TwoParts {\n let start = null;\n let end = null;\n let limitBlock = node.closestBlock();\n if (limitBlock.length === 0) {\n limitBlock = node.closestContainer();\n }\n const parts = splitNodes(node, offset, limitBlock);\n if (parts) {\n if (removeEmptyMark) {\n removeEmptyMarks(parts.start);\n removeEmptyMarks(parts.end);\n if (!parts.start.isEmpty) {\n start = parts.start;\n }\n if (!parts.end.isEmpty) {\n end = parts.end;\n }\n } else {\n start = parts.start;\n end = parts.end;\n }\n }\n return {\n start,\n end,\n };\n}\n\n// Splits text nodes or mark nodes.\n// <p><strong>one<anchor />two<focus />three</strong></p>\n// to\n// <p><strong>one</strong><strong><anchor />two<focus /></strong><strong>three</strong></p>\nexport function splitMarks(range: Range, removeEmptyMark: boolean = true): ThreeParts {\n if (range.commonAncestor.isOutside) {\n return {\n start: null,\n center: null,\n end: null,\n };\n }\n range.adaptBox();\n if (range.isCollapsed) {\n const parts = splitMarksAtPoint(range.startNode, range.startOffset, removeEmptyMark);\n if (parts.start) {\n range.setStartAfter(parts.start);\n range.collapseToStart();\n } else if (parts.end) {\n range.setStartBefore(parts.end);\n range.collapseToStart();\n }\n return {\n start: parts.start,\n center: null,\n end: parts.end,\n };\n }\n const startParts = splitMarksAtPoint(range.startNode, range.startOffset, removeEmptyMark);\n if (startParts.start) {\n range.setStartAfter(startParts.start);\n } else if (startParts.end) {\n range.setStartBefore(startParts.end);\n }\n const endParts = splitMarksAtPoint(range.endNode, range.endOffset, removeEmptyMark);\n if (endParts.start) {\n range.setEndAfter(endParts.start);\n } else if (endParts.end) {\n range.setEndBefore(endParts.end);\n }\n return {\n start: startParts.start,\n center: endParts.start,\n end: endParts.end,\n };\n}\n","import { parseStyle, query, appendDeepest, removeBr } from '../utils';\nimport { Nodes } from '../models/nodes';\nimport { Range } from '../models/range';\nimport { Box } from '../models/box';\nimport { insertBookmark } from './insert-bookmark';\nimport { toBookmark } from './to-bookmark';\nimport { splitMarks } from './split-marks';\nimport { insertNode } from './insert-node';\n\n// Removes zero-width space before or after the node.\nfunction removePreviousOrNextZWS(node: Nodes): void {\n const prevNode = node.prev();\n if (prevNode.length > 0 && prevNode.isText && prevNode.isEmpty) {\n prevNode.remove();\n }\n const nextNode = node.next();\n if (nextNode.length > 0 && nextNode.isText && nextNode.isEmpty) {\n nextNode.remove();\n }\n}\n\n// Returns an element copied from each last child of the descendants of the specified node.\nfunction copyNestedMarks(node: Nodes): Nodes | null {\n if (!node.isMark) {\n return null;\n }\n let newMark = node.clone();\n let child = node.last();\n while (child.length > 0) {\n if (child.isMark) {\n const newChild = child.clone();\n newMark.append(newChild);\n newMark = newChild;\n }\n child = child.last();\n }\n return newMark;\n}\n\n// Returns the topmost mark element or the closest element with the same tag name as the specified node.\nfunction getUpperMark(node: Nodes, tagName: string): Nodes {\n const nodeText = node.text();\n let parent = node;\n while(parent.length > 0) {\n const nextParent = parent.parent();\n if (\n !nextParent.isMark ||\n nodeText !== nextParent.text() ||\n !parent.isText && parent.name === tagName && parent.attr('style') !== ''\n ) {\n break;\n }\n parent = nextParent;\n }\n return parent;\n}\n\n// Adds the specified mark to the texts of the range.\nexport function addMark(range: Range, value: string | Nodes): void {\n if (range.commonAncestor.isOutside) {\n return;\n }\n let valueNode = query(value);\n const tagName = valueNode.name;\n const styleValue = valueNode.attr('style');\n const cssProperties = parseStyle(styleValue);\n if (range.isCollapsed) {\n if (range.isBox) {\n const boxNode = range.startNode.closest('lake-box');\n const box = new Box(boxNode);\n if (box.type === 'block') {\n const newBlock = query('<p><br /></p>');\n if (range.isBoxStart) {\n boxNode.before(newBlock);\n } else {\n boxNode.after(newBlock);\n }\n range.shrinkAfter(newBlock);\n } else {\n range.adaptBox();\n }\n }\n const block = range.startNode.closestBlock();\n removeBr(block);\n // https://en.wikipedia.org/wiki/Zero-width_space\n const zeroWidthSpace = new Nodes(document.createTextNode('\\u200B'));\n const parts = splitMarks(range);\n if (parts.start) {\n const newMark = copyNestedMarks(parts.start);\n if (newMark) {\n if (newMark.name === tagName) {\n newMark.css(cssProperties);\n valueNode = newMark;\n } else {\n appendDeepest(newMark, zeroWidthSpace);\n valueNode.append(newMark);\n }\n }\n }\n if (valueNode.text() === '') {\n valueNode.append(zeroWidthSpace);\n }\n insertNode(range, valueNode);\n removePreviousOrNextZWS(valueNode);\n range.shrinkAfter(valueNode);\n return;\n }\n splitMarks(range);\n const nodeList = range.getMarks(true);\n const bookmark = insertBookmark(range);\n for (const node of nodeList) {\n if (!node.isEmpty) {\n if (node.isText) {\n const upperMark = getUpperMark(node, tagName);\n if (upperMark.isMark && upperMark.name === tagName) {\n upperMark.css(cssProperties);\n } else {\n const newValueNode = valueNode.clone();\n upperMark.before(newValueNode);\n newValueNode.append(upperMark);\n }\n }\n }\n }\n toBookmark(range, bookmark);\n}\n","import { appendDeepest, query, removeZWS } from '../utils';\nimport { Nodes } from '../models/nodes';\nimport { Range } from '../models/range';\nimport { insertBookmark } from './insert-bookmark';\nimport { toBookmark } from './to-bookmark';\nimport { splitMarks } from './split-marks';\n\n// Removes empty marks that contain no content.\nfunction removeEmptyMarks(node: Nodes): void {\n if (node.isMark && node.isEmpty) {\n node.remove();\n return;\n }\n for (const child of node.getWalker()) {\n if (child.isMark && child.isEmpty) {\n child.remove();\n }\n }\n}\n\n// Returns an element copied from each last child of the descendants of the specified node.\nfunction copyNestedMarks(node: Nodes, tagName?: string): Nodes | null {\n if (!node.isMark || !tagName) {\n return null;\n }\n let newMark = node.clone();\n let child = node.last();\n while (child.length > 0) {\n if (child.isMark && child.name !== tagName) {\n const newChild = child.clone();\n newMark.append(newChild);\n newMark = newChild;\n }\n child = child.last();\n }\n if (newMark.name === tagName) {\n if (newMark.first().length > 0) {\n newMark = newMark.first();\n } else {\n return null;\n }\n }\n return newMark;\n}\n\n// Removes the specified marks from the range.\nexport function removeMark(range: Range, value?: string): void {\n if (range.commonAncestor.isOutside) {\n return;\n }\n let tagName;\n if (value) {\n const valueNode = query(value);\n tagName = valueNode.name;\n }\n if (range.isCollapsed) {\n if (range.isBox) {\n return;\n }\n if (tagName && range.commonAncestor.closest(tagName).length === 0) {\n return;\n }\n const parts = splitMarks(range, false);\n if (!parts.start) {\n return;\n }\n if (parts.end) {\n removeEmptyMarks(parts.end);\n }\n const zeroWidthSpace = new Nodes(document.createTextNode('\\u200B'));\n const newMark = copyNestedMarks(parts.start, tagName);\n if (!newMark) {\n parts.start.after(zeroWidthSpace);\n removeEmptyMarks(parts.start);\n if (zeroWidthSpace.prev().isText) {\n range.setStartAfter(zeroWidthSpace.prev());\n range.collapseToStart();\n zeroWidthSpace.remove();\n return;\n }\n range.setStartAfter(zeroWidthSpace);\n range.collapseToStart();\n return;\n }\n appendDeepest(newMark, zeroWidthSpace);\n parts.start.after(newMark);\n removeEmptyMarks(parts.start);\n range.shrinkAfter(newMark);\n return;\n }\n splitMarks(range);\n const marks = range.getMarks();\n const bookmark = insertBookmark(range);\n for (const mark of marks) {\n if (!tagName || mark.name === tagName) {\n const parentNode = mark.parent();\n mark.remove(!mark.isEmpty);\n if (parentNode.length > 0) {\n parentNode.get(0).normalize();\n }\n }\n }\n removeZWS(range.commonAncestor);\n toBookmark(range, bookmark);\n}\n","import { query } from '../utils/query';\nimport { removeBr } from '../utils/remove-br';\nimport { Nodes } from '../models/nodes';\nimport { Range } from '../models/range';\nimport { insertNode } from './insert-node';\nimport { splitMarks } from './split-marks';\nimport { insertBookmark } from './insert-bookmark';\nimport { toBookmark } from './to-bookmark';\n\n// Inserts a link element into the specified range.\nexport function insertLink(range: Range, value: string | Nodes): Nodes | null {\n if (range.commonAncestor.isOutside) {\n return null;\n }\n const valueNode = query(value);\n if (range.isCollapsed) {\n let linkNode = range.commonAncestor.closest('a');\n if (linkNode.length === 0) {\n linkNode = valueNode.clone(true);\n const block = range.startNode.closestBlock();\n removeBr(block);\n insertNode(range, linkNode);\n return linkNode;\n }\n const url = valueNode.attr('href');\n if (url !== '') {\n linkNode.attr({\n href: valueNode.attr('href'),\n });\n }\n return linkNode;\n }\n splitMarks(range);\n const bookmark = insertBookmark(range);\n for (const child of range.commonAncestor.getWalker()) {\n if (child.name === 'a' && range.intersectsNode(child)) {\n child.remove(true);\n }\n }\n const linkNode = valueNode.clone(false);\n bookmark.anchor.after(linkNode);\n let node = linkNode.next();\n while(node.length > 0) {\n const nextNode = node.next();\n if (!node.isMark && !node.isText) {\n break;\n }\n linkNode.append(node);\n node = nextNode;\n }\n if (linkNode.first().length === 0) {\n linkNode.remove();\n }\n toBookmark(range, bookmark);\n return linkNode;\n}\n","import { safeTemplate } from '../utils/safe-template';\nimport { query } from '../utils/query';\nimport { Nodes } from '../models/nodes';\n\nexport type ButtonConfig = {\n root: Nodes;\n name: string;\n icon?: string;\n text?: string;\n tooltip?: string;\n tabIndex?: number,\n onClick: () => void;\n}\n\nexport class Button {\n private config: ButtonConfig;\n\n private root: Nodes;\n\n public node: Nodes;\n\n constructor(config: ButtonConfig) {\n this.config = config;\n this.root = config.root;\n this.node = query(safeTemplate`\n <button type=\"button\" name=\"${config.name}\" class=\"lake-button\" />\n `);\n if (config.tabIndex !== undefined) {\n this.node.attr('tabindex', config.tabIndex.toString());\n }\n }\n\n public render(): void {\n const config = this.config;\n const buttonNode = this.node;\n buttonNode.addClass(`lake-${config.text ? 'text' : 'icon'}-button`);\n if (config.tooltip) {\n buttonNode.attr('title', config.tooltip);\n }\n if (config.icon) {\n buttonNode.append(config.icon);\n }\n if (config.text) {\n buttonNode.append(`<span>${config.text}</span>`);\n }\n this.root.append(buttonNode);\n buttonNode.on('mouseenter', () => {\n if (buttonNode.attr('disabled')) {\n return;\n }\n if (buttonNode.hasClass('lake-button-selected')) {\n return;\n }\n buttonNode.addClass('lake-button-hovered');\n });\n buttonNode.on('mouseleave', () => {\n if (buttonNode.attr('disabled')) {\n return;\n }\n buttonNode.removeClass('lake-button-hovered');\n });\n buttonNode.on('click', event => {\n event.preventDefault();\n config.onClick();\n });\n }\n}\n","import { Base64 } from 'js-base64';\nimport { NativeNode } from '../types/native';\nimport { DropdownItem, DropdownMenuItem } from '../types/dropdown';\nimport { icons } from '../icons';\nimport { encode } from '../utils/encode';\nimport { template } from '../utils/template';\nimport { safeTemplate } from '../utils/safe-template';\nimport { query } from '../utils/query';\nimport { Nodes } from '../models/nodes';\n\nexport type DropdownConfig = DropdownItem & {\n root: Nodes;\n tabIndex?: number;\n onSelect: (value: string) => void;\n}\n\nexport class Dropdown {\n private config: DropdownConfig;\n\n private root: Nodes;\n\n public node: Nodes;\n\n constructor(config: DropdownConfig) {\n this.config = config;\n this.root = config.root;\n this.node = query(safeTemplate`\n <div class=\"lake-dropdown lake-${config.menuType}-dropdown\" name=\"${config.name}\">\n <button type=\"button\" name=\"${config.name}\" class=\"lake-dropdown-title\">\n <div class=\"lake-dropdown-${config.icon ? 'icon' : 'text'}\"></div>\n <div class=\"lake-dropdown-down-icon\"></div>\n </button>\n </div>\n `);\n if (config.tabIndex !== undefined) {\n const titleNode = this.node.find('.lake-dropdown-title');\n titleNode.attr('tabindex', config.tabIndex.toString());\n }\n }\n\n // Returns the value of the node.\n public static getValue(node: Nodes): string[] {\n const value = node.attr('value');\n if (value === '') {\n return [];\n }\n return JSON.parse(Base64.decode(value));\n }\n\n // Updates the value of the node.\n public static setValue(node: Nodes, value: string[]): void {\n node.attr('value', Base64.encode(JSON.stringify(value)));\n }\n\n public static getMenuMap(menuItems: DropdownMenuItem[]): Map<string, string> {\n const menuMap: Map<string, string> = new Map();\n for (const menuItem of menuItems) {\n // remove HTML tags\n const text = menuItem.text.replace(/<[^>]*>/g, '');\n menuMap.set(menuItem.value, text);\n }\n return menuMap;\n }\n\n private updateColorAccent(titleNode: Nodes, value: string): void {\n const svgNode = titleNode.find('.lake-dropdown-icon svg').eq(1);\n const lineNode = svgNode.find('line');\n if (lineNode.length > 0) {\n lineNode.attr('stroke', value);\n } else {\n svgNode.find('path').attr('fill', value);\n }\n }\n\n private apppendMenuItems(menuNode: Nodes): void {\n const config = this.config;\n for (const menuItem of config.menuItems) {\n const listContent = template`\n <li value=\"${encode(menuItem.value)}\">\n <div class=\"lake-dropdown-menu-text\">${menuItem.text}</div>\n </li>\n `;\n const listNode = query(listContent);\n menuNode.append(listNode);\n if (config.menuType === 'color') {\n listNode.attr('title', menuItem.text);\n listNode.find('.lake-dropdown-menu-text').css('background-color', menuItem.value);\n }\n if (menuItem.icon) {\n const menuIconNode = query('<div class=\"lake-dropdown-menu-icon\"></div>');\n menuIconNode.append(menuItem.icon);\n listNode.prepend(menuIconNode);\n }\n const checkIcon = icons.get('check');\n if (checkIcon) {\n const checkNode = query('<div class=\"lake-dropdown-menu-check\"></div>');\n checkNode.append(checkIcon);\n listNode.prepend(checkNode);\n }\n }\n }\n\n private documentClickListener = (event: Event) => {\n const targetNode = new Nodes(event.target as Element);\n const titleNode = this.node.find('.lake-dropdown-title');\n const menuNode = this.node.find('.lake-dropdown-menu');\n if (targetNode.closest('.lake-dropdown-title').get(0) === titleNode.get(0)) {\n return;\n }\n menuNode.hide();\n document.removeEventListener('click', this.documentClickListener);\n };\n\n private showMenu(): void {\n const config = this.config;\n const dropdownNode = this.node;\n const menuNode = dropdownNode.find('.lake-dropdown-menu');\n if (dropdownNode.attr('disabled')) {\n return;\n }\n const currentValues = Dropdown.getValue(dropdownNode);\n menuNode.find('.lake-dropdown-menu-check').css('visibility', 'hidden');\n menuNode.find('li').each(node => {\n const listNode = query(node);\n listNode.on('mouseenter', () => {\n if (listNode.hasClass('lake-dropdown-item-selected')) {\n return;\n }\n listNode.addClass('lake-dropdown-item-hovered');\n });\n listNode.on('mouseleave', () => {\n listNode.removeClass('lake-dropdown-item-hovered');\n });\n if (currentValues.indexOf(listNode.attr('value')) >= 0) {\n listNode.find('.lake-dropdown-menu-check').css('visibility', 'visible');\n }\n });\n menuNode.css('visibility', 'hidden');\n menuNode.show(config.menuType === 'color' ? 'flex' : 'block');\n const dropdownNativeNode = dropdownNode.get(0) as HTMLElement;\n const dropdownRect = dropdownNativeNode.getBoundingClientRect();\n if (dropdownRect.x + menuNode.width() + 50 > window.innerWidth) {\n menuNode.css('left', 'auto');\n menuNode.css('right', '0');\n } else {\n menuNode.css('left', '');\n menuNode.css('right', '');\n }\n menuNode.css('visibility', '');\n document.addEventListener('click', this.documentClickListener);\n }\n\n private bindEvents(): void {\n const config = this.config;\n const dropdownNode = this.node;\n const titleNode = dropdownNode.find('.lake-dropdown-title');\n const textNode = titleNode.find('.lake-dropdown-text');\n const iconNode = titleNode.find('.lake-dropdown-icon');\n const downIconNode = titleNode.find('.lake-dropdown-down-icon');\n const menuNode = dropdownNode.find('.lake-dropdown-menu');\n if (config.menuType === 'color') {\n iconNode.on('mouseenter', () => {\n if (dropdownNode.attr('disabled')) {\n return;\n }\n iconNode.addClass('lake-dropdown-icon-hovered');\n });\n iconNode.on('mouseleave', () => {\n iconNode.removeClass('lake-dropdown-icon-hovered');\n });\n downIconNode.on('mouseenter', () => {\n if (dropdownNode.attr('disabled')) {\n return;\n }\n downIconNode.addClass('lake-dropdown-down-icon-hovered');\n });\n downIconNode.on('mouseleave', () => {\n downIconNode.removeClass('lake-dropdown-down-icon-hovered');\n });\n } else {\n titleNode.on('mouseenter', () => {\n if (dropdownNode.attr('disabled')) {\n return;\n }\n titleNode.addClass('lake-dropdown-title-hovered');\n });\n titleNode.on('mouseleave', () => {\n titleNode.removeClass('lake-dropdown-title-hovered');\n });\n }\n if (config.menuType === 'color') {\n iconNode.on('click', event => {\n event.preventDefault();\n if (dropdownNode.attr('disabled')) {\n return;\n }\n const value = dropdownNode.attr('color') || config.defaultValue;\n config.onSelect(value);\n });\n }\n const triggerNode = (config.menuType === 'color' && downIconNode) ? downIconNode : titleNode;\n triggerNode.on('click', event => {\n event.preventDefault();\n this.showMenu();\n });\n menuNode.on('click', event => {\n event.preventDefault();\n const listItem = query(event.target as NativeNode).closest('li');\n const value = listItem.attr('value');\n Dropdown.setValue(dropdownNode, [value]);\n if (textNode.length > 0) {\n textNode.text(listItem.text());\n }\n if (config.menuType === 'color' && value !== '') {\n dropdownNode.attr('color', value);\n this.updateColorAccent(titleNode, value);\n }\n config.onSelect(value);\n menuNode.hide();\n document.removeEventListener('click', this.documentClickListener);\n });\n }\n\n public render(): void {\n const config = this.config;\n const dropdownNode = this.node;\n const titleNode = dropdownNode.find('.lake-dropdown-title');\n if (!config.downIcon) {\n titleNode.addClass('lake-dropdown-title-no-down');\n }\n titleNode.css('width', config.width);\n titleNode.attr('title', config.tooltip);\n const textNode = titleNode.find('.lake-dropdown-text');\n const iconNode = titleNode.find('.lake-dropdown-icon');\n if (config.icon) {\n iconNode.append(config.icon);\n }\n if (config.accentIcon) {\n iconNode.append(config.accentIcon);\n }\n const downIconNode = titleNode.find('.lake-dropdown-down-icon');\n if (config.downIcon) {\n downIconNode.append(config.downIcon);\n }\n const menuNode = query('<ul class=\"lake-dropdown-menu\" />');\n menuNode.addClass(`lake-${config.menuType}-dropdown-menu`);\n Dropdown.setValue(dropdownNode, [config.defaultValue]);\n if (textNode.length > 0) {\n const menuMap = Dropdown.getMenuMap(config.menuItems);\n textNode.text(menuMap.get(config.defaultValue) ?? config.defaultValue);\n }\n if (config.menuType === 'color') {\n this.updateColorAccent(titleNode, config.defaultValue);\n }\n this.apppendMenuItems(menuNode);\n dropdownNode.append(titleNode);\n dropdownNode.append(menuNode);\n this.root.append(dropdownNode);\n this.bindEvents();\n }\n\n public unmount(): void {\n this.node.remove();\n document.removeEventListener('click', this.documentClickListener);\n }\n}\n","/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return value != null && (type == 'object' || type == 'function');\n}\n\nmodule.exports = isObject;\n","var freeGlobal = require('./_freeGlobal');\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\nmodule.exports = root;\n","/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\nmodule.exports = freeGlobal;\n","var root = require('./_root');\n\n/**\n * Gets the timestamp of the number of milliseconds that have elapsed since\n * the Unix epoch (1 January 1970 00:00:00 UTC).\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Date\n * @returns {number} Returns the timestamp.\n * @example\n *\n * _.defer(function(stamp) {\n * console.log(_.now() - stamp);\n * }, _.now());\n * // => Logs the number of milliseconds it took for the deferred invocation.\n */\nvar now = function() {\n return root.Date.now();\n};\n\nmodule.exports = now;\n","/** Used to match a single whitespace character. */\nvar reWhitespace = /\\s/;\n\n/**\n * Used by `_.trim` and `_.trimEnd` to get the index of the last non-whitespace\n * character of `string`.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {number} Returns the index of the last non-whitespace character.\n */\nfunction trimmedEndIndex(string) {\n var index = string.length;\n\n while (index-- && reWhitespace.test(string.charAt(index))) {}\n return index;\n}\n\nmodule.exports = trimmedEndIndex;\n","var trimmedEndIndex = require('./_trimmedEndIndex');\n\n/** Used to match leading whitespace. */\nvar reTrimStart = /^\\s+/;\n\n/**\n * The base implementation of `_.trim`.\n *\n * @private\n * @param {string} string The string to trim.\n * @returns {string} Returns the trimmed string.\n */\nfunction baseTrim(string) {\n return string\n ? string.slice(0, trimmedEndIndex(string) + 1).replace(reTrimStart, '')\n : string;\n}\n\nmodule.exports = baseTrim;\n","var root = require('./_root');\n\n/** Built-in value references. */\nvar Symbol = root.Symbol;\n\nmodule.exports = Symbol;\n","var Symbol = require('./_Symbol');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */\nfunction getRawTag(value) {\n var isOwn = hasOwnProperty.call(value, symToStringTag),\n tag = value[symToStringTag];\n\n try {\n value[symToStringTag] = undefined;\n var unmasked = true;\n } catch (e) {}\n\n var result = nativeObjectToString.call(value);\n if (unmasked) {\n if (isOwn) {\n value[symToStringTag] = tag;\n } else {\n delete value[symToStringTag];\n }\n }\n return result;\n}\n\nmodule.exports = getRawTag;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\nfunction objectToString(value) {\n return nativeObjectToString.call(value);\n}\n\nmodule.exports = objectToString;\n","var Symbol = require('./_Symbol'),\n getRawTag = require('./_getRawTag'),\n objectToString = require('./_objectToString');\n\n/** `Object#toString` result references. */\nvar nullTag = '[object Null]',\n undefinedTag = '[object Undefined]';\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction baseGetTag(value) {\n if (value == null) {\n return value === undefined ? undefinedTag : nullTag;\n }\n return (symToStringTag && symToStringTag in Object(value))\n ? getRawTag(value)\n : objectToString(value);\n}\n\nmodule.exports = baseGetTag;\n","/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return value != null && typeof value == 'object';\n}\n\nmodule.exports = isObjectLike;\n","var baseGetTag = require('./_baseGetTag'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar symbolTag = '[object Symbol]';\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n return typeof value == 'symbol' ||\n (isObjectLike(value) && baseGetTag(value) == symbolTag);\n}\n\nmodule.exports = isSymbol;\n","var baseTrim = require('./_baseTrim'),\n isObject = require('./isObject'),\n isSymbol = require('./isSymbol');\n\n/** Used as references for various `Number` constants. */\nvar NAN = 0 / 0;\n\n/** Used to detect bad signed hexadecimal string values. */\nvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n/** Used to detect binary string values. */\nvar reIsBinary = /^0b[01]+$/i;\n\n/** Used to detect octal string values. */\nvar reIsOctal = /^0o[0-7]+$/i;\n\n/** Built-in method references without a dependency on `root`. */\nvar freeParseInt = parseInt;\n\n/**\n * Converts `value` to a number.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n * @example\n *\n * _.toNumber(3.2);\n * // => 3.2\n *\n * _.toNumber(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toNumber(Infinity);\n * // => Infinity\n *\n * _.toNumber('3.2');\n * // => 3.2\n */\nfunction toNumber(value) {\n if (typeof value == 'number') {\n return value;\n }\n if (isSymbol(value)) {\n return NAN;\n }\n if (isObject(value)) {\n var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n value = isObject(other) ? (other + '') : other;\n }\n if (typeof value != 'string') {\n return value === 0 ? value : +value;\n }\n value = baseTrim(value);\n var isBinary = reIsBinary.test(value);\n return (isBinary || reIsOctal.test(value))\n ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n : (reIsBadHex.test(value) ? NAN : +value);\n}\n\nmodule.exports = toNumber;\n","var isObject = require('./isObject'),\n now = require('./now'),\n toNumber = require('./toNumber');\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max,\n nativeMin = Math.min;\n\n/**\n * Creates a debounced function that delays invoking `func` until after `wait`\n * milliseconds have elapsed since the last time the debounced function was\n * invoked. The debounced function comes with a `cancel` method to cancel\n * delayed `func` invocations and a `flush` method to immediately invoke them.\n * Provide `options` to indicate whether `func` should be invoked on the\n * leading and/or trailing edge of the `wait` timeout. The `func` is invoked\n * with the last arguments provided to the debounced function. Subsequent\n * calls to the debounced function return the result of the last `func`\n * invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\n * invoked on the trailing edge of the timeout only if the debounced function\n * is invoked more than once during the `wait` timeout.\n *\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between `_.debounce` and `_.throttle`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to debounce.\n * @param {number} [wait=0] The number of milliseconds to delay.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=false]\n * Specify invoking on the leading edge of the timeout.\n * @param {number} [options.maxWait]\n * The maximum time `func` is allowed to be delayed before it's invoked.\n * @param {boolean} [options.trailing=true]\n * Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new debounced function.\n * @example\n *\n * // Avoid costly calculations while the window size is in flux.\n * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\n *\n * // Invoke `sendMail` when clicked, debouncing subsequent calls.\n * jQuery(element).on('click', _.debounce(sendMail, 300, {\n * 'leading': true,\n * 'trailing': false\n * }));\n *\n * // Ensure `batchLog` is invoked once after 1 second of debounced calls.\n * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });\n * var source = new EventSource('/stream');\n * jQuery(source).on('message', debounced);\n *\n * // Cancel the trailing debounced invocation.\n * jQuery(window).on('popstate', debounced.cancel);\n */\nfunction debounce(func, wait, options) {\n var lastArgs,\n lastThis,\n maxWait,\n result,\n timerId,\n lastCallTime,\n lastInvokeTime = 0,\n leading = false,\n maxing = false,\n trailing = true;\n\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n wait = toNumber(wait) || 0;\n if (isObject(options)) {\n leading = !!options.leading;\n maxing = 'maxWait' in options;\n maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;\n trailing = 'trailing' in options ? !!options.trailing : trailing;\n }\n\n function invokeFunc(time) {\n var args = lastArgs,\n thisArg = lastThis;\n\n lastArgs = lastThis = undefined;\n lastInvokeTime = time;\n result = func.apply(thisArg, args);\n return result;\n }\n\n function leadingEdge(time) {\n // Reset any `maxWait` timer.\n lastInvokeTime = time;\n // Start the timer for the trailing edge.\n timerId = setTimeout(timerExpired, wait);\n // Invoke the leading edge.\n return leading ? invokeFunc(time) : result;\n }\n\n function remainingWait(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime,\n timeWaiting = wait - timeSinceLastCall;\n\n return maxing\n ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke)\n : timeWaiting;\n }\n\n function shouldInvoke(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime;\n\n // Either this is the first call, activity has stopped and we're at the\n // trailing edge, the system time has gone backwards and we're treating\n // it as the trailing edge, or we've hit the `maxWait` limit.\n return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||\n (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));\n }\n\n function timerExpired() {\n var time = now();\n if (shouldInvoke(time)) {\n return trailingEdge(time);\n }\n // Restart the timer.\n timerId = setTimeout(timerExpired, remainingWait(time));\n }\n\n function trailingEdge(time) {\n timerId = undefined;\n\n // Only invoke if we have `lastArgs` which means `func` has been\n // debounced at least once.\n if (trailing && lastArgs) {\n return invokeFunc(time);\n }\n lastArgs = lastThis = undefined;\n return result;\n }\n\n function cancel() {\n if (timerId !== undefined) {\n clearTimeout(timerId);\n }\n lastInvokeTime = 0;\n lastArgs = lastCallTime = lastThis = timerId = undefined;\n }\n\n function flush() {\n return timerId === undefined ? result : trailingEdge(now());\n }\n\n function debounced() {\n var time = now(),\n isInvoking = shouldInvoke(time);\n\n lastArgs = arguments;\n lastThis = this;\n lastCallTime = time;\n\n if (isInvoking) {\n if (timerId === undefined) {\n return leadingEdge(lastCallTime);\n }\n if (maxing) {\n // Handle invocations in a tight loop.\n clearTimeout(timerId);\n timerId = setTimeout(timerExpired, wait);\n return invokeFunc(lastCallTime);\n }\n }\n if (timerId === undefined) {\n timerId = setTimeout(timerExpired, wait);\n }\n return result;\n }\n debounced.cancel = cancel;\n debounced.flush = flush;\n return debounced;\n}\n\nmodule.exports = debounce;\n","import { NativeSelection } from '../types/native';\nimport { KeyValue, AppliedItem } from '../types/object';\nimport { parseStyle } from '../utils/parse-style';\nimport { Nodes } from '../models/nodes';\nimport { Range } from '../models/range';\nimport { insertBookmark } from '../operations/insert-bookmark';\nimport { toBookmark } from '../operations/to-bookmark';\nimport { insertNode } from '../operations/insert-node';\nimport { insertFragment } from '../operations/insert-fragment';\nimport { insertContents } from '../operations/insert-contents';\nimport { deleteContents } from '../operations/delete-contents';\nimport { setBlocks } from '../operations/set-blocks';\nimport { splitBlock } from '../operations/split-block';\nimport { splitMarks } from '../operations/split-marks';\nimport { addMark } from '../operations/add-mark';\nimport { removeMark } from '../operations/remove-mark';\nimport { fixList } from '../operations/fix-list';\nimport { insertLink } from '../operations/insert-link';\n\n// Returns the attributes of the element as an key-value object.\nfunction getAttributes(node: Nodes): KeyValue {\n const nativeNode = node.get(0) as Element;\n const attributes: KeyValue = {};\n if (nativeNode.hasAttributes()) {\n for (const attr of nativeNode.attributes) {\n attributes[attr.name] = attr.value;\n }\n }\n return attributes;\n}\n\nfunction pushAncestralNodes(appliedItems: AppliedItem[], range: Range): void {\n let parentNode = range.startNode;\n if (parentNode.isText) {\n parentNode = parentNode.parent();\n }\n while (parentNode.length > 0) {\n if (!parentNode.isInside) {\n break;\n }\n appliedItems.push({\n node: parentNode,\n name: parentNode.name,\n attributes: getAttributes(parentNode),\n styles: parseStyle(parentNode.attr('style')),\n });\n parentNode = parentNode.parent();\n }\n}\n\nfunction pushNextNestedNodes(appliedItems: AppliedItem[], range: Range): void {\n const startNode = range.startNode;\n let nextNode;\n if (startNode.isText && startNode.text().length === range.startOffset) {\n const node = startNode.next();\n if (node.length > 0 && node.isElement) {\n nextNode = node;\n }\n }\n if (startNode.isElement) {\n const children = startNode.children();\n if (children.length > 0) {\n const node = children[range.startOffset];\n if (node && node.isElement) {\n nextNode = node;\n }\n }\n }\n if (nextNode) {\n let child = nextNode;\n while (child.length > 0) {\n if (child.isElement) {\n appliedItems.push({\n node: child,\n name: child.name,\n attributes: getAttributes(child),\n styles: parseStyle(child.attr('style')),\n });\n }\n child = child.first();\n }\n }\n}\n\nexport class Selection {\n // Represents the range of text selected by the user or the current position of the caret.\n private selection: NativeSelection;\n\n // Is the root element which has contenteditable=\"true\" attribute.\n public container: Nodes;\n\n // Is a saved range which is used to add it to the native selection later.\n public range: Range;\n\n constructor(container: Nodes) {\n const selection = window.getSelection();\n // When called on an <iframe> that is not displayed (e.g., where 'display: none' is set) Firefox will return null,\n // whereas other browsers will return a selection object with Selection.type set to None.\n if (!selection) {\n throw new Error('Selection object is null.');\n }\n this.selection = selection;\n this.container = container;\n this.range = this.getRangeFromNativeSelection();\n }\n\n // Returns the current selected range from the native selection.\n private getRangeFromNativeSelection(): Range {\n if (this.selection.rangeCount > 0) {\n const range = this.selection.getRangeAt(0);\n return new Range(range);\n }\n return new Range();\n }\n\n // Adds the saved range to the native selection.\n public addRangeToNativeSelection(): void {\n this.selection.removeAllRanges();\n this.selection.addRange(this.range.get());\n }\n\n // Synchronizes the saved range with the range of the native selection.\n public syncByRange(): void {\n const newRange = this.getRangeFromNativeSelection();\n if (this.range.get() === newRange.get()) {\n return;\n }\n this.range = newRange;\n }\n\n // Synchronizes the saved range with the range represented by the bookmark.\n public synByBookmark(): void {\n const range = this.range;\n const container = this.container;\n const boxFocus = container.find('lake-box[focus]');\n if (boxFocus.length > 0) {\n toBookmark(range, {\n anchor: new Nodes(),\n focus: boxFocus,\n });\n this.addRangeToNativeSelection();\n return;\n }\n const anchor = container.find('lake-bookmark[type=\"anchor\"]');\n const focus = container.find('lake-bookmark[type=\"focus\"]');\n toBookmark(range, {\n anchor,\n focus,\n });\n this.addRangeToNativeSelection();\n }\n\n public getAppliedItems(): AppliedItem[] {\n const appliedItems: AppliedItem[] = [];\n pushAncestralNodes(appliedItems, this.range);\n pushNextNestedNodes(appliedItems, this.range);\n return appliedItems;\n }\n\n public insertBookmark(): ReturnType<typeof insertBookmark> {\n return insertBookmark(this.range);\n }\n\n public toBookmark(bookmark: Parameters<typeof toBookmark>[1]): ReturnType<typeof toBookmark> {\n return toBookmark(this.range, bookmark);\n }\n\n public insertNode(node: Parameters<typeof insertNode>[1]): ReturnType<typeof insertNode> {\n return insertNode(this.range, node);\n }\n\n public insertFragment(fragment: Parameters<typeof insertFragment>[1]): ReturnType<typeof insertFragment> {\n return insertFragment(this.range, fragment);\n }\n\n public insertContents(value: Parameters<typeof insertContents>[1]): ReturnType<typeof insertContents> {\n return insertContents(this.range, value);\n }\n\n public deleteContents(): ReturnType<typeof deleteContents> {\n return deleteContents(this.range);\n }\n\n public setBlocks(value: Parameters<typeof setBlocks>[1]): ReturnType<typeof setBlocks> {\n return setBlocks(this.range, value);\n }\n\n public splitBlock(): ReturnType<typeof splitBlock> {\n return splitBlock(this.range);\n }\n\n public splitMarks(removeEmptyMark?: Parameters<typeof splitMarks>[1]): ReturnType<typeof splitMarks> {\n return splitMarks(this.range, removeEmptyMark);\n }\n\n public addMark(value: Parameters<typeof addMark>[1]): ReturnType<typeof addMark> {\n return addMark(this.range, value);\n }\n\n public removeMark(value?: Parameters<typeof removeMark>[1]): ReturnType<typeof removeMark> {\n return removeMark(this.range, value);\n }\n\n public fixList(): ReturnType<typeof fixList> {\n return fixList(this.range);\n }\n\n public insertLink(value: Parameters<typeof insertLink>[1]): ReturnType<typeof insertLink> {\n return insertLink(this.range, value);\n }\n}\n","import EventEmitter from 'eventemitter3';\nimport { AppliedItem } from '../types/object';\nimport { debug } from '../utils/debug';\nimport { Selection } from './selection';\n\ntype CommmandItem = {\n isDisabled?: (AppliedItems: AppliedItem[]) => boolean;\n isSelected?: (appliedItems: AppliedItem[]) => boolean;\n selectedValues?: (AppliedItems: AppliedItem[]) => string[];\n execute: (...data: any[]) => void;\n};\n\nexport class Command {\n private selection: Selection;\n\n private commandMap: Map<string, CommmandItem> = new Map();\n\n public event: EventEmitter = new EventEmitter();\n\n constructor(selection: Selection) {\n this.selection = selection;\n }\n\n public add(name: string, commandItem: CommmandItem) {\n this.commandMap.set(name, commandItem);\n }\n\n public delete(name: string) {\n this.commandMap.delete(name);\n }\n\n public getNames(): string[] {\n return Array.from(this.commandMap.keys());\n }\n\n public has(name: string): boolean {\n return this.commandMap.get(name) !== undefined;\n }\n\n public getItem(name: string): CommmandItem {\n const commandItem = this.commandMap.get(name);\n if (commandItem === undefined) {\n throw new Error(`Command '${name}' does not exist.`);\n }\n return commandItem;\n }\n\n public isDisabled(name: string): boolean {\n const commandItem = this.getItem(name);\n if (!commandItem.isDisabled) {\n return false;\n }\n const appliedItems = this.selection.getAppliedItems();\n return commandItem.isDisabled(appliedItems);\n }\n\n public isSelected(name: string): boolean {\n const commandItem = this.getItem(name);\n if (!commandItem.isSelected) {\n return false;\n }\n const appliedItems = this.selection.getAppliedItems();\n return commandItem.isSelected(appliedItems);\n }\n\n public selectedValues(name: string): string[] {\n const commandItem = this.getItem(name);\n if (!commandItem.selectedValues) {\n return [];\n }\n const appliedItems = this.selection.getAppliedItems();\n return commandItem.selectedValues(appliedItems);\n }\n\n public execute(name: string, ...data: any[]): void {\n const commandItem = this.getItem(name);\n this.event.emit('beforeexecute', name);\n commandItem.execute.apply(this, data);\n this.event.emit('execute', name);\n debug(`Command '${name}' executed`);\n }\n}\n","/*\n * JavaScript MD5\n * https://github.com/blueimp/JavaScript-MD5\n *\n * Copyright 2011, Sebastian Tschan\n * https://blueimp.net\n *\n * Licensed under the MIT license:\n * https://opensource.org/licenses/MIT\n *\n * Based on\n * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message\n * Digest Algorithm, as defined in RFC 1321.\n * Version 2.2 Copyright (C) Paul Johnston 1999 - 2009\n * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet\n * Distributed under the BSD License\n * See http://pajhome.org.uk/crypt/md5 for more info.\n */\n\n/* global define */\n\n/* eslint-disable strict */\n\n;(function ($) {\n 'use strict'\n\n /**\n * Add integers, wrapping at 2^32.\n * This uses 16-bit operations internally to work around bugs in interpreters.\n *\n * @param {number} x First integer\n * @param {number} y Second integer\n * @returns {number} Sum\n */\n function safeAdd(x, y) {\n var lsw = (x & 0xffff) + (y & 0xffff)\n var msw = (x >> 16) + (y >> 16) + (lsw >> 16)\n return (msw << 16) | (lsw & 0xffff)\n }\n\n /**\n * Bitwise rotate a 32-bit number to the left.\n *\n * @param {number} num 32-bit number\n * @param {number} cnt Rotation count\n * @returns {number} Rotated number\n */\n function bitRotateLeft(num, cnt) {\n return (num << cnt) | (num >>> (32 - cnt))\n }\n\n /**\n * Basic operation the algorithm uses.\n *\n * @param {number} q q\n * @param {number} a a\n * @param {number} b b\n * @param {number} x x\n * @param {number} s s\n * @param {number} t t\n * @returns {number} Result\n */\n function md5cmn(q, a, b, x, s, t) {\n return safeAdd(bitRotateLeft(safeAdd(safeAdd(a, q), safeAdd(x, t)), s), b)\n }\n /**\n * Basic operation the algorithm uses.\n *\n * @param {number} a a\n * @param {number} b b\n * @param {number} c c\n * @param {number} d d\n * @param {number} x x\n * @param {number} s s\n * @param {number} t t\n * @returns {number} Result\n */\n function md5ff(a, b, c, d, x, s, t) {\n return md5cmn((b & c) | (~b & d), a, b, x, s, t)\n }\n /**\n * Basic operation the algorithm uses.\n *\n * @param {number} a a\n * @param {number} b b\n * @param {number} c c\n * @param {number} d d\n * @param {number} x x\n * @param {number} s s\n * @param {number} t t\n * @returns {number} Result\n */\n function md5gg(a, b, c, d, x, s, t) {\n return md5cmn((b & d) | (c & ~d), a, b, x, s, t)\n }\n /**\n * Basic operation the algorithm uses.\n *\n * @param {number} a a\n * @param {number} b b\n * @param {number} c c\n * @param {number} d d\n * @param {number} x x\n * @param {number} s s\n * @param {number} t t\n * @returns {number} Result\n */\n function md5hh(a, b, c, d, x, s, t) {\n return md5cmn(b ^ c ^ d, a, b, x, s, t)\n }\n /**\n * Basic operation the algorithm uses.\n *\n * @param {number} a a\n * @param {number} b b\n * @param {number} c c\n * @param {number} d d\n * @param {number} x x\n * @param {number} s s\n * @param {number} t t\n * @returns {number} Result\n */\n function md5ii(a, b, c, d, x, s, t) {\n return md5cmn(c ^ (b | ~d), a, b, x, s, t)\n }\n\n /**\n * Calculate the MD5 of an array of little-endian words, and a bit length.\n *\n * @param {Array} x Array of little-endian words\n * @param {number} len Bit length\n * @returns {Array<number>} MD5 Array\n */\n function binlMD5(x, len) {\n /* append padding */\n x[len >> 5] |= 0x80 << len % 32\n x[(((len + 64) >>> 9) << 4) + 14] = len\n\n var i\n var olda\n var oldb\n var oldc\n var oldd\n var a = 1732584193\n var b = -271733879\n var c = -1732584194\n var d = 271733878\n\n for (i = 0; i < x.length; i += 16) {\n olda = a\n oldb = b\n oldc = c\n oldd = d\n\n a = md5ff(a, b, c, d, x[i], 7, -680876936)\n d = md5ff(d, a, b, c, x[i + 1], 12, -389564586)\n c = md5ff(c, d, a, b, x[i + 2], 17, 606105819)\n b = md5ff(b, c, d, a, x[i + 3], 22, -1044525330)\n a = md5ff(a, b, c, d, x[i + 4], 7, -176418897)\n d = md5ff(d, a, b, c, x[i + 5], 12, 1200080426)\n c = md5ff(c, d, a, b, x[i + 6], 17, -1473231341)\n b = md5ff(b, c, d, a, x[i + 7], 22, -45705983)\n a = md5ff(a, b, c, d, x[i + 8], 7, 1770035416)\n d = md5ff(d, a, b, c, x[i + 9], 12, -1958414417)\n c = md5ff(c, d, a, b, x[i + 10], 17, -42063)\n b = md5ff(b, c, d, a, x[i + 11], 22, -1990404162)\n a = md5ff(a, b, c, d, x[i + 12], 7, 1804603682)\n d = md5ff(d, a, b, c, x[i + 13], 12, -40341101)\n c = md5ff(c, d, a, b, x[i + 14], 17, -1502002290)\n b = md5ff(b, c, d, a, x[i + 15], 22, 1236535329)\n\n a = md5gg(a, b, c, d, x[i + 1], 5, -165796510)\n d = md5gg(d, a, b, c, x[i + 6], 9, -1069501632)\n c = md5gg(c, d, a, b, x[i + 11], 14, 643717713)\n b = md5gg(b, c, d, a, x[i], 20, -373897302)\n a = md5gg(a, b, c, d, x[i + 5], 5, -701558691)\n d = md5gg(d, a, b, c, x[i + 10], 9, 38016083)\n c = md5gg(c, d, a, b, x[i + 15], 14, -660478335)\n b = md5gg(b, c, d, a, x[i + 4], 20, -405537848)\n a = md5gg(a, b, c, d, x[i + 9], 5, 568446438)\n d = md5gg(d, a, b, c, x[i + 14], 9, -1019803690)\n c = md5gg(c, d, a, b, x[i + 3], 14, -187363961)\n b = md5gg(b, c, d, a, x[i + 8], 20, 1163531501)\n a = md5gg(a, b, c, d, x[i + 13], 5, -1444681467)\n d = md5gg(d, a, b, c, x[i + 2], 9, -51403784)\n c = md5gg(c, d, a, b, x[i + 7], 14, 1735328473)\n b = md5gg(b, c, d, a, x[i + 12], 20, -1926607734)\n\n a = md5hh(a, b, c, d, x[i + 5], 4, -378558)\n d = md5hh(d, a, b, c, x[i + 8], 11, -2022574463)\n c = md5hh(c, d, a, b, x[i + 11], 16, 1839030562)\n b = md5hh(b, c, d, a, x[i + 14], 23, -35309556)\n a = md5hh(a, b, c, d, x[i + 1], 4, -1530992060)\n d = md5hh(d, a, b, c, x[i + 4], 11, 1272893353)\n c = md5hh(c, d, a, b, x[i + 7], 16, -155497632)\n b = md5hh(b, c, d, a, x[i + 10], 23, -1094730640)\n a = md5hh(a, b, c, d, x[i + 13], 4, 681279174)\n d = md5hh(d, a, b, c, x[i], 11, -358537222)\n c = md5hh(c, d, a, b, x[i + 3], 16, -722521979)\n b = md5hh(b, c, d, a, x[i + 6], 23, 76029189)\n a = md5hh(a, b, c, d, x[i + 9], 4, -640364487)\n d = md5hh(d, a, b, c, x[i + 12], 11, -421815835)\n c = md5hh(c, d, a, b, x[i + 15], 16, 530742520)\n b = md5hh(b, c, d, a, x[i + 2], 23, -995338651)\n\n a = md5ii(a, b, c, d, x[i], 6, -198630844)\n d = md5ii(d, a, b, c, x[i + 7], 10, 1126891415)\n c = md5ii(c, d, a, b, x[i + 14], 15, -1416354905)\n b = md5ii(b, c, d, a, x[i + 5], 21, -57434055)\n a = md5ii(a, b, c, d, x[i + 12], 6, 1700485571)\n d = md5ii(d, a, b, c, x[i + 3], 10, -1894986606)\n c = md5ii(c, d, a, b, x[i + 10], 15, -1051523)\n b = md5ii(b, c, d, a, x[i + 1], 21, -2054922799)\n a = md5ii(a, b, c, d, x[i + 8], 6, 1873313359)\n d = md5ii(d, a, b, c, x[i + 15], 10, -30611744)\n c = md5ii(c, d, a, b, x[i + 6], 15, -1560198380)\n b = md5ii(b, c, d, a, x[i + 13], 21, 1309151649)\n a = md5ii(a, b, c, d, x[i + 4], 6, -145523070)\n d = md5ii(d, a, b, c, x[i + 11], 10, -1120210379)\n c = md5ii(c, d, a, b, x[i + 2], 15, 718787259)\n b = md5ii(b, c, d, a, x[i + 9], 21, -343485551)\n\n a = safeAdd(a, olda)\n b = safeAdd(b, oldb)\n c = safeAdd(c, oldc)\n d = safeAdd(d, oldd)\n }\n return [a, b, c, d]\n }\n\n /**\n * Convert an array of little-endian words to a string\n *\n * @param {Array<number>} input MD5 Array\n * @returns {string} MD5 string\n */\n function binl2rstr(input) {\n var i\n var output = ''\n var length32 = input.length * 32\n for (i = 0; i < length32; i += 8) {\n output += String.fromCharCode((input[i >> 5] >>> i % 32) & 0xff)\n }\n return output\n }\n\n /**\n * Convert a raw string to an array of little-endian words\n * Characters >255 have their high-byte silently ignored.\n *\n * @param {string} input Raw input string\n * @returns {Array<number>} Array of little-endian words\n */\n function rstr2binl(input) {\n var i\n var output = []\n output[(input.length >> 2) - 1] = undefined\n for (i = 0; i < output.length; i += 1) {\n output[i] = 0\n }\n var length8 = input.length * 8\n for (i = 0; i < length8; i += 8) {\n output[i >> 5] |= (input.charCodeAt(i / 8) & 0xff) << i % 32\n }\n return output\n }\n\n /**\n * Calculate the MD5 of a raw string\n *\n * @param {string} s Input string\n * @returns {string} Raw MD5 string\n */\n function rstrMD5(s) {\n return binl2rstr(binlMD5(rstr2binl(s), s.length * 8))\n }\n\n /**\n * Calculates the HMAC-MD5 of a key and some data (raw strings)\n *\n * @param {string} key HMAC key\n * @param {string} data Raw input string\n * @returns {string} Raw MD5 string\n */\n function rstrHMACMD5(key, data) {\n var i\n var bkey = rstr2binl(key)\n var ipad = []\n var opad = []\n var hash\n ipad[15] = opad[15] = undefined\n if (bkey.length > 16) {\n bkey = binlMD5(bkey, key.length * 8)\n }\n for (i = 0; i < 16; i += 1) {\n ipad[i] = bkey[i] ^ 0x36363636\n opad[i] = bkey[i] ^ 0x5c5c5c5c\n }\n hash = binlMD5(ipad.concat(rstr2binl(data)), 512 + data.length * 8)\n return binl2rstr(binlMD5(opad.concat(hash), 512 + 128))\n }\n\n /**\n * Convert a raw string to a hex string\n *\n * @param {string} input Raw input string\n * @returns {string} Hex encoded string\n */\n function rstr2hex(input) {\n var hexTab = '0123456789abcdef'\n var output = ''\n var x\n var i\n for (i = 0; i < input.length; i += 1) {\n x = input.charCodeAt(i)\n output += hexTab.charAt((x >>> 4) & 0x0f) + hexTab.charAt(x & 0x0f)\n }\n return output\n }\n\n /**\n * Encode a string as UTF-8\n *\n * @param {string} input Input string\n * @returns {string} UTF8 string\n */\n function str2rstrUTF8(input) {\n return unescape(encodeURIComponent(input))\n }\n\n /**\n * Encodes input string as raw MD5 string\n *\n * @param {string} s Input string\n * @returns {string} Raw MD5 string\n */\n function rawMD5(s) {\n return rstrMD5(str2rstrUTF8(s))\n }\n /**\n * Encodes input string as Hex encoded string\n *\n * @param {string} s Input string\n * @returns {string} Hex encoded string\n */\n function hexMD5(s) {\n return rstr2hex(rawMD5(s))\n }\n /**\n * Calculates the raw HMAC-MD5 for the given key and data\n *\n * @param {string} k HMAC key\n * @param {string} d Input string\n * @returns {string} Raw MD5 string\n */\n function rawHMACMD5(k, d) {\n return rstrHMACMD5(str2rstrUTF8(k), str2rstrUTF8(d))\n }\n /**\n * Calculates the Hex encoded HMAC-MD5 for the given key and data\n *\n * @param {string} k HMAC key\n * @param {string} d Input string\n * @returns {string} Raw MD5 string\n */\n function hexHMACMD5(k, d) {\n return rstr2hex(rawHMACMD5(k, d))\n }\n\n /**\n * Calculates MD5 value for a given string.\n * If a key is provided, calculates the HMAC-MD5 value.\n * Returns a Hex encoded string unless the raw argument is given.\n *\n * @param {string} string Input string\n * @param {string} [key] HMAC key\n * @param {boolean} [raw] Raw output switch\n * @returns {string} MD5 output\n */\n function md5(string, key, raw) {\n if (!key) {\n if (!raw) {\n return hexMD5(string)\n }\n return rawMD5(string)\n }\n if (!raw) {\n return hexHMACMD5(key, string)\n }\n return rawHMACMD5(key, string)\n }\n\n if (typeof define === 'function' && define.amd) {\n define(function () {\n return md5\n })\n } else if (typeof module === 'object' && module.exports) {\n module.exports = md5\n } else {\n $.md5 = md5\n }\n})(this)\n","import type { Box } from '../models/box';\n\nexport const boxInstances: Map<number, Map<number, Box>> = new Map();\n","import md5 from 'blueimp-md5';\nimport EventEmitter from 'eventemitter3';\nimport { NativeNode } from '../types/native';\nimport { boxInstances } from '../storage/box-instances';\nimport { debug } from '../utils/debug';\nimport { morph } from '../utils/morph';\nimport { Nodes } from '../models/nodes';\nimport { Box } from '../models/box';\nimport { HTMLParser } from '../parsers/html-parser';\nimport { insertBookmark } from '../operations/insert-bookmark';\nimport { Selection } from './selection';\n\n// Saves and controls the history of the value of the editor.\n// Example:\n// before initialization: value: 'a', list: [], index: 0, canUndo: false\n// after initialization: value: 'a', list: ['a'], index: 1, canUndo: false\n// inputs 'b': value: 'ab', list: ['a', 'ab'], index: 2, canUndo: true\n// inputs 'c': value: 'abc', list: ['a', 'ab', 'abc'], index: 3\n// inputs 'd': value: 'abcd', list: ['a', 'ab', 'abc', 'abcd'], index: 4\n// undoes: value: 'abc', list: ['a', 'ab', 'abc', 'abcd'], index: 3\n// undoes: value: 'ab', list: ['a', 'ab', 'abc', 'abcd'], index: 2\n// undoes: value: 'a', list: ['a', 'ab', 'abc', 'abcd'], index: 1, canUndo: false\n// redoes: value: 'ab', list: ['a', 'ab', 'abc', 'abcd'], index: 2, canRedo: true\n// inputs 'e': value: 'abe', list: ['a', 'ab', 'abe'], index: 3, canRedo: false\nexport class History {\n private selection: Selection;\n\n private container: Nodes;\n\n // an array for storing the history items\n private list: Nodes[] = [];\n\n // the next index of the list\n private index: number = 0;\n\n private canSave: boolean = true;\n\n public limit: number = 100;\n\n public event: EventEmitter = new EventEmitter();\n\n constructor(selection: Selection) {\n this.selection = selection;\n this.container = selection.container;\n }\n\n private removeBookmark(value: string): string {\n return value.replace(/(<lake-box[^>]+)\\s+focus=\"\\w+\"([^>]*>)/ig, '$1$2').\n replace(/<lake-bookmark\\s+type=\"anchor\">\\s*<\\/lake-bookmark>/ig, '').\n replace(/<lake-bookmark\\s+type=\"focus\">\\s*<\\/lake-bookmark>/ig, '');\n }\n\n private getValue(container: Nodes): string {\n return new HTMLParser(container).getHTML();\n }\n\n private addIdToBoxes(node: Nodes): void {\n node.find('lake-box').each(nativeNode => {\n const boxNode = new Nodes(nativeNode);\n const id = md5(`${boxNode.attr('type')}-${boxNode.attr('name')}-${boxNode.attr('value')}`);\n boxNode.attr('id', id);\n });\n }\n\n private removeIdfromBoxes(node: Nodes): void {\n node.find('lake-box').each(nativeNode => {\n const boxNode = new Nodes(nativeNode);\n boxNode.removeAttr('id');\n });\n }\n\n private morphContainer(sourceItem: Nodes): void {\n const container = this.container;\n const callbacks = {\n beforeChildrenUpdated: (oldNode: NativeNode) => {\n if (new Nodes(oldNode).name === 'lake-box') {\n return false;\n }\n },\n afterAttributeUpdated: (attributeName: string, nativeNode: NativeNode) => {\n const node = new Nodes(nativeNode);\n if (attributeName === 'value' && node.name === 'lake-box') {\n const instanceMap = boxInstances.get(container.id);\n if (!instanceMap) {\n return;\n }\n instanceMap.delete(node.id);\n }\n },\n };\n const otherContainer = sourceItem.clone(true);\n this.addIdToBoxes(container);\n this.addIdToBoxes(otherContainer);\n morph(container, otherContainer, {\n callbacks,\n });\n this.removeIdfromBoxes(container);\n this.removeIdfromBoxes(otherContainer);\n }\n\n private cloneContainer(): Nodes {\n const range = this.selection.range;\n const newContainer = this.container.clone(true);\n newContainer.find('lake-box').each(nativeNode => {\n const box = new Box(nativeNode);\n box.getContainer().empty();\n });\n if (range.commonAncestor.isOutside) {\n return newContainer;\n }\n if (range.isInsideBox) {\n return newContainer;\n }\n const startNodePath = range.startNode.path();\n const endNodePath = range.endNode.path();\n const newStartNode = newContainer.find(startNodePath);\n const newEndNode = newContainer.find(endNodePath);\n const newRange = range.clone();\n newRange.setStart(newStartNode, range.startOffset);\n newRange.setEnd(newEndNode, range.endOffset);\n insertBookmark(newRange);\n return newContainer;\n }\n\n public get count(): number {\n return this.list.length;\n }\n\n public get canUndo(): boolean {\n return this.index > 1 && !!this.list[this.index - 1];\n }\n\n public get canRedo(): boolean {\n return !!this.list[this.index];\n }\n\n public undo(): void {\n if (!this.list[this.index - 1]) {\n return;\n }\n this.selection.insertBookmark();\n const value = this.getValue(this.container);\n while (this.index > 0) {\n const prevItem = this.list[this.index - 1];\n if (!prevItem) {\n break;\n }\n const prevValue = this.getValue(prevItem);\n if (this.removeBookmark(prevValue) !== this.removeBookmark(value)) {\n this.morphContainer(prevItem);\n this.event.emit('undo', prevValue);\n break;\n }\n if (this.index === 1) {\n break;\n }\n this.index--;\n }\n this.selection.synByBookmark();\n debug(`History undone, the last index is ${this.index}`);\n }\n\n public redo(): void {\n if (!this.list[this.index]) {\n return;\n }\n this.selection.insertBookmark();\n const value = this.getValue(this.container);\n while (this.index < this.list.length) {\n const nextItem = this.list[this.index];\n if (!nextItem) {\n break;\n }\n this.index++;\n const nextValue = this.getValue(nextItem);\n if (this.removeBookmark(nextValue) !== this.removeBookmark(value)) {\n this.morphContainer(nextItem);\n this.event.emit('redo', nextValue);\n break;\n }\n }\n this.selection.synByBookmark();\n debug(`History redone, the last index is ${this.index}`);\n }\n\n public continue(): void {\n this.canSave = true;\n }\n\n public pause(): void {\n this.canSave = false;\n }\n\n public save(): void {\n if (!this.canSave) {\n return;\n }\n const item = this.cloneContainer();\n const value = this.getValue(item);\n if (\n this.list[this.index - 1] &&\n this.removeBookmark(this.getValue(this.list[this.index - 1])) === this.removeBookmark(value)\n ) {\n return;\n }\n this.list.splice(this.index, Infinity, item);\n this.index++;\n if (this.list.length > this.limit) {\n this.list.shift();\n this.index = this.list.length;\n }\n this.event.emit('save', value);\n debug(`History saved, the last index is ${this.index}`);\n }\n}\n","var t=[\"Shift\",\"Meta\",\"Alt\",\"Control\"],e=\"object\"==typeof navigator?navigator.platform:\"\",n=/Mac|iPod|iPhone|iPad/.test(e),r=n?\"Meta\":\"Control\",o=\"Win32\"===e?[\"Control\",\"Alt\"]:n?[\"Alt\"]:[];function i(t,e){return\"function\"==typeof t.getModifierState&&(t.getModifierState(e)||o.includes(e)&&t.getModifierState(\"AltGraph\"))}function a(t){return t.trim().split(\" \").map(function(t){var e=t.split(/\\b\\+/),n=e.pop();return[e=e.map(function(t){return\"$mod\"===t?r:t}),n]})}function u(e,n){var r;void 0===n&&(n={});var o=null!=(r=n.timeout)?r:1e3,u=Object.keys(e).map(function(t){return[a(t),e[t]]}),c=new Map,f=null;return function(e){e instanceof KeyboardEvent&&(u.forEach(function(n){var r=n[0],o=n[1],a=c.get(r)||r;!function(e,n){return!(n[1].toUpperCase()!==e.key.toUpperCase()&&n[1]!==e.code||n[0].find(function(t){return!i(e,t)})||t.find(function(t){return!n[0].includes(t)&&n[1]!==t&&i(e,t)}))}(e,a[0])?i(e,e.key)||c.delete(r):a.length>1?c.set(r,a.slice(1)):(c.delete(r),o(e))}),f&&clearTimeout(f),f=setTimeout(c.clear.bind(c),o))}}function c(t,e,n){var r;void 0===n&&(n={});var o=null!=(r=n.event)?r:\"keydown\",i=u(e,n);return t.addEventListener(o,i),function(){t.removeEventListener(o,i)}}export{u as createKeybindingsHandler,a as parseKeybinding,c as tinykeys};\n//# sourceMappingURL=tinykeys.module.js.map\n","import { createKeybindingsHandler } from 'tinykeys';\nimport { camelCase } from '../utils/camel-case';\nimport { Nodes } from '../models/nodes';\n\ntype EventItem = {\n type: string;\n listener: (event: Event) => void | boolean;\n};\n\nconst shortenedTypeMap = new Map([\n ['#', 'shift+#'],\n]);\n\nexport class Keystroke {\n private container: Nodes;\n\n private keydownEventList: EventItem[] = [];\n\n private keyupEventList: EventItem[] = [];\n\n constructor(container: Nodes) {\n this.container = container;\n }\n\n private normalizeType(type: string) {\n type = shortenedTypeMap.get(type) ?? type;\n type = type.replace(/(^|\\+|\\s)mod(\\+|\\s|$)/g, '$1$mod$2').\n replace(/shift|control|alt|meta|enter|tab|backspace|delete|space|escape|arrow-left|arrow-right|arrow-up|arrow-down/,\n (match: string) => match.charAt(0).toUpperCase() + camelCase(match.substring(1))).\n replace(/(^|\\+|\\s)([a-z])(\\+|\\s|$)/g,\n (match: string, p1: string, p2: string, p3: string) => `${p1}Key${p2.toUpperCase()}${p3}`);\n return type;\n }\n\n // Sets a keydown shortcut.\n public setKeydown(type: string, listener: EventListener) {\n type = this.normalizeType(type);\n const handler = createKeybindingsHandler({\n [type]: event => listener(event),\n });\n this.keydownEventList.push({\n type,\n listener,\n });\n this.container.on('keydown', handler);\n }\n\n // Sets a keyup shortcut.\n public setKeyup(type: string, listener: EventListener) {\n type = this.normalizeType(type);\n const handler = createKeybindingsHandler({\n [type]: event => listener(event),\n });\n this.keyupEventList.push({\n type,\n listener,\n });\n this.container.on('keyup', handler);\n }\n\n // Executes the keydown shortcuts.\n public keydown(type: string) {\n type = this.normalizeType(type);\n for (const item of this.keydownEventList) {\n if (item.type === type) {\n if (item.listener(new Event(type)) === false) {\n break;\n }\n }\n }\n }\n\n // Executes the keyup shortcuts.\n public keyup(type: string) {\n type = this.normalizeType(type);\n for (const item of this.keyupEventList) {\n if (item.type === type) {\n if (item.listener(new Event(type)) === false) {\n break;\n }\n }\n }\n }\n}\n","import debounce from 'lodash/debounce';\nimport EventEmitter from 'eventemitter3';\nimport { version } from '../package.json';\nimport { NativeNode } from './types/native';\nimport { UploadRequestMethod } from './types/request';\nimport { editors } from './storage/editors';\nimport { denormalizeValue, normalizeValue, query, debug } from './utils';\nimport { Nodes } from './models/nodes';\nimport { Box } from './models/box';\nimport { HTMLParser } from './parsers/html-parser';\nimport { insertBox } from './operations/insert-box';\nimport { removeBox } from './operations/remove-box';\nimport { Selection } from './managers/selection';\nimport { Command } from './managers/command';\nimport { History } from './managers/history';\nimport { Keystroke } from './managers/keystroke';\nimport { BoxManager } from './managers/box-manager';\nimport { Plugin } from './managers/plugin';\nimport { Toolbar } from './ui/toolbar';\n\ntype EditorConfig = {\n root: string | Nodes | NativeNode;\n toolbar?: Toolbar;\n value?: string;\n readonly?: boolean;\n spellcheck?: boolean;\n tabIndex?: number;\n indentWithTab?: boolean;\n minChangeSize?: number;\n imageRequestMethod?: UploadRequestMethod;\n imageRequestAction?: string;\n imageRequestTypes?: string[];\n};\n\nconst defaultConfig = {\n value: '<p><br /><focus /></p>',\n readonly: false,\n spellcheck: false,\n tabIndex: 0,\n indentWithTab: true,\n minChangeSize: 5,\n imageRequestMethod: 'POST' as UploadRequestMethod,\n imageRequestAction: '/upload',\n imageRequestTypes: ['image/gif', 'image/jpeg', 'image/png', 'image/svg+xml'],\n};\n\nexport class Editor {\n public static version: string = version;\n\n public static box = new BoxManager();\n\n public static plugin = new Plugin();\n\n private unsavedInputData: string = '';\n\n public root: Nodes;\n\n public toolbar: Toolbar | undefined;\n\n public config: typeof defaultConfig;\n\n public containerWrapper: Nodes;\n\n public container: Nodes;\n\n public overlayContainer: Nodes;\n\n public popupContainer: Nodes;\n\n public isComposing: boolean = false;\n\n public readonly: boolean;\n\n public event: EventEmitter = new EventEmitter();\n\n public selection: Selection;\n\n public command: Command;\n\n public history: History;\n\n public keystroke: Keystroke;\n\n public box: BoxManager = Editor.box;\n\n constructor(config: EditorConfig) {\n if (!config.root) {\n throw new Error('The root of the config must be specified.');\n }\n this.root = query(config.root);\n this.toolbar = config.toolbar;\n this.config = {...defaultConfig, ...config};\n this.containerWrapper = query('<div class=\"lake-container-wrapper\" />');\n this.container = query('<div class=\"lake-container\" />');\n this.overlayContainer = query('<div class=\"lake-overlay\" />');\n this.popupContainer = query('<div class=\"lake-popup lake-custom-properties\" />');\n this.readonly = this.config.readonly;\n\n this.root.addClass('lake-custom-properties');\n this.container.attr({\n contenteditable: this.readonly ? 'false' : 'true',\n spellcheck: this.config.spellcheck ? 'true' : 'false',\n tabindex: this.config.tabIndex.toString(),\n });\n\n this.selection = new Selection(this.container);\n this.command = new Command(this.selection);\n this.history = new History(this.selection);\n this.keystroke = new Keystroke(this.container);\n\n editors.set(this.container.id, this);\n }\n\n private beforeunloadListener: EventListener = () => {\n this.commitUnsavedInputData();\n };\n\n private selectionchangeListener: EventListener = () => {\n this.selection.syncByRange();\n this.updateBoxSelectionStyle();\n this.emitStateChangeEvent();\n };\n\n private clickListener: EventListener = event => {\n const targetNode = new Nodes(event.target as Element);\n if (targetNode.closest('.lake-popup').length > 0) {\n return;\n }\n this.event.emit('click', targetNode);\n };\n\n private resizeListener: EventListener = () => {\n this.event.emit('resize');\n };\n\n private updateBoxSelectionStyle = debounce(() => {\n // The editor has been unmounted.\n if (this.root.first().length === 0) {\n return;\n }\n const range = this.selection.range;\n const clonedRange = range.clone();\n clonedRange.adaptBox();\n this.box.findAll(this).each(boxNode => {\n const box = new Box(boxNode);\n const boxContainer = box.getContainer();\n if (boxContainer.length === 0) {\n return;\n }\n if (range.compareBeforeNode(boxContainer) < 0 && range.compareAfterNode(boxContainer) > 0) {\n if (!(range.isCollapsed && range.startNode.get(0) === boxContainer.get(0) && range.startOffset === 0)) {\n boxContainer.removeClass('lake-box-hovered');\n boxContainer.removeClass('lake-box-selected');\n boxContainer.removeClass('lake-box-focused');\n boxContainer.addClass('lake-box-activated');\n return;\n }\n }\n if (clonedRange.intersectsNode(box.node)) {\n boxContainer.removeClass('lake-box-activated');\n if (range.isCollapsed) {\n boxContainer.removeClass('lake-box-hovered');\n boxContainer.removeClass('lake-box-selected');\n boxContainer.addClass('lake-box-focused');\n } else {\n boxContainer.removeClass('lake-box-focused');\n boxContainer.addClass('lake-box-selected');\n }\n return;\n }\n boxContainer.removeClass('lake-box-activated');\n boxContainer.removeClass('lake-box-focused');\n boxContainer.removeClass('lake-box-selected');\n });\n this.event.emit('boxselectionstylechange');\n }, 50, {\n leading: false,\n trailing: true,\n maxWait: 50,\n });\n\n private emitStateChangeEvent = debounce(() => {\n const commandNames = this.command.getNames();\n let appliedItems = this.selection.getAppliedItems();\n if (\n appliedItems.length > 0 &&\n appliedItems[0].node.closestContainer().get(0) !== this.container.get(0)\n ) {\n appliedItems = [];\n }\n const disabledNameMap: Map<string, boolean> = new Map();\n const selectedNameMap: Map<string, boolean> = new Map();\n const selectedValuesMap: Map<string, string[]> = new Map();\n if (appliedItems.length > 0) {\n for (const name of commandNames) {\n const commandItem = this.command.getItem(name);\n if (commandItem.isDisabled && commandItem.isDisabled(appliedItems)) {\n disabledNameMap.set(name, true);\n }\n if (commandItem.isSelected && commandItem.isSelected(appliedItems)) {\n selectedNameMap.set(name, true);\n }\n if (commandItem.selectedValues) {\n const values = commandItem.selectedValues(appliedItems);\n if (values.length > 0) {\n selectedValuesMap.set(name, values);\n }\n }\n }\n }\n const stateData = {\n appliedItems,\n disabledNameMap,\n selectedNameMap,\n selectedValuesMap,\n };\n if (this.toolbar) {\n this.toolbar.updateState(stateData);\n }\n this.event.emit('statechange', stateData);\n }, 100, {\n leading: false,\n trailing: true,\n maxWait: 100,\n });\n\n private emitChangeEvent = (value: string) => {\n this.rectifyContent();\n this.emitStateChangeEvent();\n this.event.emit('change', value);\n };\n\n private inputInBoxStrip(): void {\n const selection = this.selection;\n const range = selection.range;\n const stripNode = range.startNode.closest('.lake-box-strip');\n const boxNode = stripNode.closest('lake-box');\n const box = new Box(boxNode);\n if (box.type === 'inline') {\n if (range.isBoxStart) {\n range.setStartBefore(boxNode);\n range.collapseToStart();\n } else {\n range.setStartAfter(boxNode);\n range.collapseToStart();\n }\n } else {\n const paragraph = query('<p />');\n if (range.isBoxStart) {\n boxNode.before(paragraph);\n } else {\n boxNode.after(paragraph);\n }\n range.shrinkAfter(paragraph);\n }\n const text = stripNode.text();\n stripNode.html('<br />');\n selection.insertNode(document.createTextNode(text));\n }\n\n private bindInputEvents(): void {\n this.container.on('compositionstart', () => {\n this.isComposing = true;\n });\n this.container.on('compositionend', () => {\n this.isComposing = false;\n });\n this.container.on('beforeinput', () => {\n const range = this.selection.range;\n if (range.isBoxStart || range.isBoxEnd) {\n this.commitUnsavedInputData();\n }\n });\n this.container.on('input', event => {\n const inputEvent = event as InputEvent;\n // Here setTimeout is necessary because isComposing is not false after ending composition.\n window.setTimeout(() => {\n const range = this.selection.range;\n if (range.isInsideBox) {\n return;\n }\n // isComposing is false after ending composition because compositionend event has been emitted.\n if (this.isComposing) {\n this.event.emit('input', inputEvent);\n return;\n }\n if (\n inputEvent.inputType === 'insertText' ||\n inputEvent.inputType === 'insertCompositionText'\n ) {\n if (range.isBoxStart || range.isBoxEnd) {\n this.inputInBoxStrip();\n } else {\n this.unsavedInputData += inputEvent.data ?? '';\n if (this.unsavedInputData.length < this.config.minChangeSize) {\n this.event.emit('input', inputEvent);\n return;\n }\n }\n }\n this.history.save();\n this.unsavedInputData = '';\n this.event.emit('input', inputEvent);\n }, 0);\n });\n this.command.event.on('beforeexecute', () => this.commitUnsavedInputData());\n }\n\n private bindHistoryEvents(): void {\n this.history.event.on('undo', value => {\n this.box.renderAll(this);\n this.emitChangeEvent(value);\n });\n this.history.event.on('redo', value => {\n this.box.renderAll(this);\n this.emitChangeEvent(value);\n });\n this.history.event.on('save', value => {\n this.box.rectifyInstances(this);\n this.emitChangeEvent(value);\n });\n }\n\n private bindFocusEvents(): void {\n this.container.on('focus', ()=> {\n this.root.addClass('lake-root-focused');\n });\n this.container.on('blur', ()=> {\n this.root.removeClass('lake-root-focused');\n });\n }\n\n // Fixes wrong content, especially empty tag.\n public rectifyContent(): void {\n let children = this.container.children();\n for (const child of children) {\n if ((child.isBlock || child.isMark) && child.html() === '') {\n child.remove();\n debug('Rectifying content: empty tag was removed');\n }\n }\n children = this.container.children();\n if (children.length === 0) {\n this.container.html('<p><br /></p>');\n this.selection.range.shrinkAfter(this.container);\n debug('Rectifying content: default paragraph was added');\n return;\n }\n if (children.length === 1) {\n const child = children[0];\n if (child.isVoid) {\n const paragraph = query('<p />');\n child.before(paragraph);\n paragraph.append(child);\n this.selection.range.shrinkAfter(paragraph);\n debug('Rectifying content: void element was wrapped in paragraph');\n }\n }\n }\n\n // Saves the input data which is unsaved.\n public commitUnsavedInputData(): void {\n if (this.unsavedInputData.length > 0) {\n this.history.save();\n this.unsavedInputData = '';\n }\n }\n\n // Updates some state before custom modifications.\n public prepareOperation(): void {\n this.commitUnsavedInputData();\n this.history.pause();\n }\n\n // Saves custom modifications to the history.\n public commitOperation(): void {\n this.history.continue();\n this.history.save();\n }\n\n // Sets focus on the editor area.\n public focus(): void {\n this.container.focus();\n }\n\n // Removes focus from the editor area.\n public blur(): void {\n this.container.blur();\n }\n\n // Sets the specified HTML string to the editor area.\n public setValue(value: string): void {\n value = normalizeValue(value);\n const htmlParser = new HTMLParser(value);\n const fragment = htmlParser.getFragment();\n this.container.empty();\n this.container.append(fragment);\n Editor.box.renderAll(this);\n this.selection.synByBookmark();\n }\n\n // Returns the contents from the editor.\n public getValue(): string {\n const bookmark = this.selection.insertBookmark();\n let value = new HTMLParser(this.container).getHTML();\n value = denormalizeValue(value);\n this.selection.toBookmark(bookmark);\n return value;\n }\n\n // Inserts a box into the position of the selection.\n public insertBox(\n boxName: Parameters<typeof insertBox>[1],\n boxValue?: Parameters<typeof insertBox>[2],\n ): Box {\n const box = insertBox(this.selection.range, boxName, boxValue);\n if (!box) {\n throw new Error(`Box '${boxName}' cannot be inserted outside the editor.`);\n }\n const instanceMap = this.box.getInstances(this);\n instanceMap.set(box.node.id, box);\n return box;\n }\n\n // Removes the selected box.\n public removeBox(): ReturnType<typeof removeBox> {\n const box = removeBox(this.selection.range);\n if (box) {\n const instanceMap = this.box.getInstances(this);\n instanceMap.delete(box.node.id);\n }\n return box;\n }\n\n // Renders an editor area and set default value to it.\n public render(): void {\n const value = normalizeValue(this.config.value);\n const htmlParser = new HTMLParser(value);\n const fragment = htmlParser.getFragment();\n this.root.empty();\n this.root.append(this.containerWrapper);\n this.containerWrapper.append(this.container);\n this.containerWrapper.append(this.overlayContainer);\n query(document.body).append(this.popupContainer);\n this.container.append(fragment);\n if (!this.readonly) {\n this.bindFocusEvents();\n this.focus();\n this.selection.synByBookmark();\n this.history.save();\n Editor.plugin.loadAll(this);\n }\n Editor.box.renderAll(this);\n if (this.toolbar) {\n this.toolbar.render(this);\n }\n if (!this.readonly) {\n window.addEventListener('beforeunload', this.beforeunloadListener);\n document.addEventListener('selectionchange', this.selectionchangeListener);\n this.bindInputEvents();\n this.bindHistoryEvents();\n }\n document.addEventListener('click', this.clickListener);\n window.addEventListener('resize', this.resizeListener);\n }\n\n // Destroys a rendered editor.\n public unmount(): void {\n this.root.empty();\n this.popupContainer.remove();\n if (!this.readonly) {\n window.removeEventListener('beforeunload', this.beforeunloadListener);\n document.removeEventListener('selectionchange', this.selectionchangeListener);\n }\n document.removeEventListener('click', this.clickListener);\n window.removeEventListener('resize', this.resizeListener);\n }\n}\n","import { BoxValue } from '../types/box';\nimport { Range } from '../models/range';\nimport { Box } from '../models/box';\nimport { insertFragment } from './insert-fragment';\nimport { splitBlock } from './split-block';\n\n// Inserts a box into the specified range.\nexport function insertBox(range: Range, boxName: string, boxValue?: BoxValue): Box | null {\n if (range.commonAncestor.isOutside) {\n return null;\n }\n const box = new Box(boxName);\n if (boxValue) {\n box.value = boxValue;\n }\n const fragment = document.createDocumentFragment();\n fragment.appendChild(box.node.get(0));\n // inline box\n if (box.type === 'inline') {\n insertFragment(range, fragment);\n box.render();\n range.selectBoxEnd(box.node);\n return box;\n }\n // block box\n const parts = splitBlock(range);\n if (parts.start) {\n range.setEndAfter(parts.start);\n range.collapseToEnd();\n }\n if (parts.end && parts.end.isEmpty) {\n parts.end.remove();\n }\n insertFragment(range, fragment);\n box.render();\n range.selectBoxEnd(box.node);\n if (parts.start && parts.start.isEmpty) {\n parts.start.remove();\n }\n return box;\n}\n","import { appendDeepest, query } from '../utils';\nimport { Range } from '../models/range';\nimport { Box } from '../models/box';\n\nexport function removeBox(range: Range): Box | null {\n if (range.commonAncestor.isOutside) {\n return null;\n }\n const boxNode = range.commonAncestor.closest('lake-box');\n if (boxNode.length === 0) {\n return null;\n }\n const box = new Box(boxNode);\n if (box.type === 'block') {\n const paragraph = query('<p><br /></p>');\n boxNode.before(paragraph);\n range.shrinkAfter(paragraph);\n box.unmount();\n boxNode.remove();\n return box;\n }\n range.setStartBefore(boxNode);\n range.collapseToStart();\n const parentNode = boxNode.parent();\n box.unmount();\n boxNode.remove();\n if (parentNode.isEmpty) {\n appendDeepest(parentNode, query('<br />'));\n range.shrinkAfter(parentNode);\n }\n return box;\n}\n","import type { Editor } from '../editor';\nimport { BoxComponent } from '../types/box';\nimport { boxes } from '../storage/boxes';\nimport { boxInstances } from '../storage/box-instances';\nimport { Nodes } from '../models/nodes';\nimport { Box } from '../models/box';\n\nexport class BoxManager {\n public add(component: BoxComponent) {\n boxes.set(component.name, component);\n }\n\n public remove(name: string) {\n boxes.delete(name);\n }\n\n public getNames(): string[] {\n return Array.from(boxes.keys());\n }\n\n public getInstances(editor: Editor): Map<number, Box> {\n let instanceMap = boxInstances.get(editor.container.id);\n if (!instanceMap) {\n instanceMap = new Map();\n boxInstances.set(editor.container.id, instanceMap);\n return instanceMap;\n }\n return instanceMap;\n }\n\n public rectifyInstances(editor: Editor) {\n const instanceMap = this.getInstances(editor);\n for (const box of instanceMap.values()) {\n if (!box.node.get(0).isConnected) {\n box.unmount();\n instanceMap.delete(box.node.id);\n }\n }\n }\n\n public findAll(editor: Editor): Nodes {\n return editor.container.find('lake-box');\n }\n\n public renderAll(editor: Editor): void {\n this.rectifyInstances(editor);\n const instanceMap = this.getInstances(editor);\n this.findAll(editor).each(boxNativeNode => {\n const boxNode = new Nodes(boxNativeNode);\n if (instanceMap.get(boxNode.id)) {\n return;\n }\n const box = new Box(boxNode);\n box.render();\n instanceMap.set(box.node.id, box);\n });\n }\n}\n","import type { Editor } from '../editor';\n\ntype PluginFunction = (editor: Editor) => void;\n\nexport class Plugin {\n private pluginList: PluginFunction[] = [];\n\n public add(plugin: PluginFunction) {\n this.pluginList.push(plugin);\n }\n\n public loadAll(editor: Editor) {\n this.pluginList.forEach(plugin => {\n plugin(editor);\n });\n }\n}\n","// --------------------------------------------------------------------------------------------------------------------\n// types --------------------------------------------------------------------------------------------------------------\n// --------------------------------------------------------------------------------------------------------------------\n// --------------------------------------------------------------------------------------------------------------------\n// implementation -----------------------------------------------------------------------------------------------------\n// --------------------------------------------------------------------------------------------------------------------\n// eslint-disable-next-line prettier/prettier\nconst removeEmptyValues = (object) => Object.fromEntries(\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nObject.entries(object)\n .map(([key, value]) => key !== 'i' && value && value != '0' && [key, value])\n .filter(Boolean));\n// --------------------------------------------------------------------------------------------------------------------\nconst trimAllValues = (part) => Object.fromEntries(Object.keys(part).map((key) => {\n const val = part[key];\n return [\n key,\n Array.isArray(val) ? val.map((v) => v === null || v === void 0 ? void 0 : v.trim()) : val === !!val ? val : val === null || val === void 0 ? void 0 : val.trim(),\n ];\n}));\n// --------------------------------------------------------------------------------------------------------------------\nconst parseArgumentPart = (text) => {\n const [keyPart = '', ...formatterKeys] = text.split('|');\n const [keyWithoutType = '', type] = keyPart.split(':');\n const [key, isOptional] = keyWithoutType.split('?');\n return { k: key, i: type, n: isOptional === '', f: formatterKeys };\n};\n// --------------------------------------------------------------------------------------------------------------------\nexport const isBasicPluralPart = (part) => !!(part.o || part.r);\nconst parsePluralPart = (content, lastAccessor) => {\n let [key, values] = content.split(':');\n if (!values) {\n values = key;\n key = lastAccessor;\n }\n const entries = values.split('|');\n const [zero, one, two, few, many, rest] = entries;\n const nrOfEntries = entries.filter((entry) => entry !== undefined).length;\n if (nrOfEntries === 1) {\n return { k: key, r: zero };\n }\n if (nrOfEntries === 2) {\n return { k: key, o: zero, r: one };\n }\n if (nrOfEntries === 3) {\n return { k: key, z: zero, o: one, r: two };\n }\n return { k: key, z: zero, o: one, t: two, f: few, m: many, r: rest };\n};\n// --------------------------------------------------------------------------------------------------------------------\nexport const REGEX_SWITCH_CASE = /^\\{.*\\}$/;\nexport const parseCases = (text) => Object.fromEntries(removeOuterBrackets(text)\n .split(',')\n .map((part) => part.split(':'))\n .reduce((accumulator, entry) => {\n if (entry.length === 2) {\n return [...accumulator, entry.map((entry) => entry.trim())];\n }\n // if we have a single part, this means that a comma `,` was present in the string and we need to combine the strings again\n ;\n accumulator[accumulator.length - 1][1] += ',' + entry[0];\n return accumulator;\n}, []));\n// --------------------------------------------------------------------------------------------------------------------\nconst REGEX_BRACKETS_SPLIT = /(\\{(?:[^{}]+|\\{(?:[^{}]+)*\\})*\\})/g;\nexport const removeOuterBrackets = (text) => text.substring(1, text.length - 1);\nexport const parseRawText = (rawText, optimize = true, firstKey = '', lastKey = '') => rawText\n .split(REGEX_BRACKETS_SPLIT)\n .map((part) => {\n if (!part.match(REGEX_BRACKETS_SPLIT)) {\n return part;\n }\n const content = removeOuterBrackets(part);\n if (content.startsWith('{')) {\n return parsePluralPart(removeOuterBrackets(content), lastKey);\n }\n const parsedPart = parseArgumentPart(content);\n lastKey = parsedPart.k || lastKey;\n !firstKey && (firstKey = lastKey);\n return parsedPart;\n})\n .map((part) => {\n if (typeof part === 'string')\n return part;\n if (!part.k)\n part.k = firstKey || '0';\n const trimmed = trimAllValues(part);\n return optimize ? removeEmptyValues(trimmed) : trimmed;\n});\n","import { REGEX_SWITCH_CASE, isBasicPluralPart, parseCases, } from '../../parser/src/basic.mjs';\n// --------------------------------------------------------------------------------------------------------------------\n// implementation -----------------------------------------------------------------------------------------------------\n// --------------------------------------------------------------------------------------------------------------------\nconst applyFormatters = (formatters, formatterKeys, initialValue) => formatterKeys.reduce((value, formatterKey) => {\n var _a, _b;\n return (_b = (formatterKey.match(REGEX_SWITCH_CASE)\n ? ((cases) => { var _a; return (_a = cases[value]) !== null && _a !== void 0 ? _a : cases['*']; })(parseCases(formatterKey))\n : (_a = formatters[formatterKey]) === null || _a === void 0 ? void 0 : _a.call(formatters, value))) !== null && _b !== void 0 ? _b : value;\n}, initialValue);\nconst getPlural = (pluralRules, { z, o, t, f, m, r }, value) => {\n switch (z && value == 0 ? 'zero' : pluralRules.select(value)) {\n case 'zero':\n return z;\n case 'one':\n return o;\n case 'two':\n return t;\n case 'few':\n return f !== null && f !== void 0 ? f : r;\n case 'many':\n return m !== null && m !== void 0 ? m : r;\n default:\n return r;\n }\n};\nconst REGEX_PLURAL_VALUE_INJECTION = /\\?\\?/g;\nconst applyArguments = (textParts, pluralRules, formatters, args) => textParts\n .map((part) => {\n if (typeof part === 'string') {\n return part;\n }\n const { k: key = '0', f: formatterKeys = [] } = part;\n const value = args[key];\n if (isBasicPluralPart(part)) {\n return ((typeof value === 'boolean' ? (value ? part.o : part.r) : getPlural(pluralRules, part, value)) || '').replace(REGEX_PLURAL_VALUE_INJECTION, value);\n }\n const formattedValue = formatterKeys.length ? applyFormatters(formatters, formatterKeys, value) : value;\n return ('' + (formattedValue !== null && formattedValue !== void 0 ? formattedValue : '')).trim();\n})\n .join('');\nexport const translate = (textParts, pluralRules, formatters, args) => {\n const firstArg = args[0];\n const isObject = firstArg && typeof firstArg === 'object' && firstArg.constructor === Object;\n const transformedArgs = (args.length === 1 && isObject ? firstArg : args);\n return applyArguments(textParts, pluralRules, formatters, transformedArgs);\n};\n// type TransformArgsArray<A extends Array<Record<string, unknown>>> = keyof A[0] extends `${number}`\n// \t? ToIndexBasedArgs<A>\n// \t: A\n// type ToIndexBasedArgs<A extends Array<Record<string, unknown>>, B extends keyof A[0] = keyof A[0]> = GetTypesFromRecord<\n// \tA[0],\n// \tSort<ToNumberArray<ToTuple<B>>>\n// >\n// type GetTypesFromRecordAsArray<A extends Record<string, unknown>, B extends unknown[]> = B extends [infer Item, ...infer Rest]\n// \t? [A[Item], ...XX<A, Rest>]\n// \t: []\n// type UnionToParm<U> = U extends any ? (k: U) => void : never\n// type UnionToSect<U> = UnionToParm<U> extends (k: infer I) => void ? I : never\n// type ExtractParm<F> = F extends { (a: infer A): void } ? A : never\n// type SpliceOne<Union> = Exclude<Union, ExtractOne<Union>>\n// type ExtractOne<Union> = ExtractParm<UnionToSect<UnionToParm<Union>>>\n// type ToTuple<Union> = ToTupleRec<Union, []>\n// type ToTupleRec<Union, Rslt extends any[]> = SpliceOne<Union> extends never\n// \t? [ExtractOne<Union>, ...Rslt]\n// \t: ToTupleRec<SpliceOne<Union>, [ExtractOne<Union>, ...Rslt]>\n// type GenList<N, A extends any[] = []> = N extends A['length'] ? A : GenList<N, [0, ...A]>\n// // Add lists of size: [1, 2] -> [[1, [_]], [2, [_, _]]]\n// type Expand<T extends any[]> = T extends [infer Head, ...infer Rest] ? [[Head, GenList<Head>], ...Expand<Rest>] : []\n// // Drop one from each list, remove whole pair for empty: [[1, [_]], [0, []], [2, [_, _]]] -> [[1, []], [2, [_]]]\n// type DropAndFilter<T> = T extends [infer First, ...infer Rest]\n// \t? First extends [any, []]\n// \t\t? DropAndFilter<Rest>\n// \t\t: First extends [infer N, [any, ...infer NREST]]\n// \t\t? [[N, NREST], ...DropAndFilter<Rest>]\n// \t\t: []\n// \t: []\n// // [[1, []], [2, [_]]] -> [1]\n// type FindEmpty<T> = T extends [infer First, ...infer Rest]\n// \t? First extends [infer N, []]\n// \t\t? [N, ...FindEmpty<Rest>]\n// \t\t: FindEmpty<Rest>\n// \t: []\n// // Sort expanded\n// type Condense<T extends [number, any[]][], Result extends number[] = []> = T extends []\n// \t? Result\n// \t: Condense<DropAndFilter<T>, [...Result, ...FindEmpty<T>]>\n// type Reverse<A extends any[]> = A extends [infer H, ...infer T] ? [...Reverse<T>, H] : []\n// type Sort<T extends any[], R = false> = R extends true ? Reverse<Condense<Expand<T>>> : Condense<Expand<T>>\n// type ToNumberArray<T extends unknown[]> = T extends [infer Item, ...infer Rest]\n// \t? [ToNumber<Item>, ...ToNumberArray<Rest>]\n// \t: []\n// type ToNumber<S, L extends number[] = []> = `${L['length']}` extends S ? L['length'] : ToNumber<S, [...L, 0]>\n","import { translate } from './core.mjs';\nimport { getPartsFromString } from './util.string.mjs';\nconst getTranslateInstance = (locale, formatters) => {\n const cache = {};\n const pluralRules = new Intl.PluralRules(locale);\n return (text, ...args) => translate(getPartsFromString(cache, text), pluralRules, formatters, args);\n};\n// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types, @typescript-eslint/no-explicit-any\nexport function i18nObject(locale, translations, formatters = {}) {\n return createProxy(translations, getTranslateInstance(locale, formatters));\n}\n// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types, @typescript-eslint/no-explicit-any\nexport function typesafeI18nObject(locale, translations, formatters = {}) {\n return createProxy(translations, getTranslateInstance(locale, formatters));\n}\nconst wrap = (proxyObject = {}, translateFn) => (typeof proxyObject === 'string'\n ? translateFn.bind(null, proxyObject)\n : Object.assign(Object.defineProperty(() => '', 'name', { writable: true }), proxyObject));\n/* PROXY-START */\nconst createProxy = (proxyObject, translateFn) => new Proxy(wrap(proxyObject, translateFn), {\n get: (target, key) => {\n if (key === Symbol.iterator)\n return [][Symbol.iterator].bind(Object.values(target).map((entry) => wrap(entry, translateFn)));\n return createProxy(target[key], translateFn);\n },\n});\n/* PROXY-END */\n\n","import { parseRawText } from '../../parser/src/basic.mjs';\nimport { translate } from './core.mjs';\nexport const getPartsFromString = (cache, text) => cache[text] || (cache[text] = parseRawText(text));\nconst translateString = (cache, pluralRules, formatters, text, ...args) => translate(getPartsFromString(cache, text), pluralRules, formatters, args);\nexport const i18nString = (locale, formatters = {}) => translateString.bind(null, {}, new Intl.PluralRules(locale), formatters);\nexport const typesafeI18nString = (locale, formatters = {}) => translateString.bind(null, {}, new Intl.PluralRules(locale), formatters);\n","import { i18nObject as initI18nObject, type FormattersInitializer } from 'typesafe-i18n';\nimport type { Formatters, Locales, Translations, TranslationFunctions } from './types';\n\nimport enUS from './en-US';\nimport zhCN from './zh-CN';\nimport ja from './ja';\nimport ko from './ko';\n\nconst localeTranslations = {\n 'en-US': enUS,\n 'zh-CN': zhCN,\n ja,\n ko,\n};\n\nconst locales: Locales[] = Object.keys(localeTranslations) as Locales[];\n\nconst loadedLocales: Record<Locales, Translations> = {} as Record<Locales, Translations>;\nconst loadedFormatters: Record<Locales, Formatters> = {} as Record<Locales, Formatters>;\n\nconst initFormatters: FormattersInitializer<Locales, Formatters> = () => {\n const formatters: Formatters = {\n // add your formatter functions here\n };\n return formatters;\n};\n\nconst loadFormatters = (locale: Locales): void => {\n loadedFormatters[locale] = initFormatters(locale);\n};\n\nconst loadLocale = (locale: Locales): void => {\n if (loadedLocales[locale]) {\n return;\n }\n loadedLocales[locale] = localeTranslations[locale] as Translations;\n loadFormatters(locale);\n};\n\nconst loadAllLocales = (): void => locales.forEach(loadLocale);\n\nconst i18nObject = (locale: Locales): TranslationFunctions =>\n initI18nObject<Locales, Translations, TranslationFunctions, Formatters>(\n locale,\n loadedLocales[locale],\n loadedFormatters[locale],\n );\n\nloadAllLocales();\n\nconst language = locales.indexOf(window.LAKE_LANGUAGE) >= 0 ? window.LAKE_LANGUAGE : 'en-US';\n\nexport const locale = i18nObject(language);\n","import type { BaseTranslation } from '../types';\nimport { modifierText } from '../../utils/modifier-text';\n\nexport default {\n toolbar: {\n undo: `Undo (${modifierText('mod+Z')})`,\n redo: `Redo (${modifierText('mod+Y')})`,\n selectAll: `Select all (${modifierText('mod+A')})`,\n paragraph: 'Paragraph',\n blockQuote: 'Block quotation',\n numberedList: 'Numbered list',\n bulletedList: 'Bulleted list',\n checklist: 'Checklist',\n alignLeft: 'Align left',\n alignCenter: 'Align center',\n alignRight: 'Align right',\n alignJustify: 'Align justify',\n increaseIndent: 'Increase indent',\n decreaseIndent: 'Decrease indent',\n bold: `Bold (${modifierText('mod+B')})`,\n italic: `Italic (${modifierText('mod+I')})`,\n underline: `Underline (${modifierText('mod+U')})`,\n strikethrough: 'Strikethrough',\n superscript: 'Superscript',\n subscript: 'Subscript',\n code: 'Inline code',\n removeFormat: 'Remove format',\n formatPainter: 'Format painter',\n link: 'Link',\n hr: 'Horizontal line',\n codeBlock: 'Code block',\n heading: 'Heading',\n heading1: 'Heading 1',\n heading2: 'Heading 2',\n heading3: 'Heading 3',\n heading4: 'Heading 4',\n heading5: 'Heading 5',\n heading6: 'Heading 6',\n list: 'List',\n align: 'Alignment',\n indent: 'Indent',\n fontFamily: 'Font family',\n fontSize: 'Font size',\n moreStyle: 'More style',\n fontColor: 'Font color',\n highlight: 'Highlight',\n image: 'Image',\n removeColor: 'Remove color',\n },\n link: {\n newLink: 'New link',\n url: 'Link URL',\n title: 'Link title',\n copy: 'Copy link to clipboard',\n open: 'Open link in new tab',\n save: 'Save',\n unlink: 'Remove link',\n },\n image: {\n view: 'Full screen',\n remove: 'Delete',\n previous: 'Previous',\n next: 'Next',\n close: 'Close (Esc)',\n loadingError: 'The image cannot be loaded',\n zoomOut: 'Zoom out',\n zoomIn: 'Zoom in',\n },\n codeBlock: {\n langType: 'Select language',\n },\n} satisfies BaseTranslation;\n","import type { Translation } from '../types';\nimport { modifierText } from '../../utils/modifier-text';\n\nexport default {\n toolbar: {\n undo: `撤消 (${modifierText('mod+Z')})`,\n redo: `重做 (${modifierText('mod+Y')})`,\n selectAll: `全选 (${modifierText('mod+A')})`,\n paragraph: '正文',\n blockQuote: '引用',\n numberedList: '编号',\n bulletedList: '项目符号',\n checklist: '任务列表',\n alignLeft: '左对齐',\n alignCenter: '居中',\n alignRight: '右对齐',\n alignJustify: '两端对齐',\n increaseIndent: '增加缩进',\n decreaseIndent: '减少缩进',\n bold: `粗体 (${modifierText('mod+B')})`,\n italic: `斜体 (${modifierText('mod+I')})`,\n underline: `下划线 (${modifierText('mod+U')})`,\n strikethrough: '删除线',\n superscript: '上标',\n subscript: '下标',\n code: '行内代码',\n removeFormat: '清除格式',\n formatPainter: '格式刷',\n link: '链接',\n hr: '分割线',\n codeBlock: '代码块',\n heading: '标题',\n heading1: '标题 1',\n heading2: '标题 2',\n heading3: '标题 3',\n heading4: '标题 4',\n heading5: '标题 5',\n heading6: '标题 6',\n list: '列表',\n align: '对齐方式',\n indent: '缩进',\n fontFamily: '字体',\n fontSize: '文字大小',\n moreStyle: '更多样式',\n fontColor: '文字颜色',\n highlight: '文字背景',\n image: '图片',\n removeColor: '默认',\n },\n link: {\n newLink: '新链接',\n url: '链接 URL',\n title: '链接文本',\n copy: '复制到剪贴板',\n open: '打开链接',\n save: '确定',\n unlink: '取消链接',\n },\n image: {\n view: '查看大图',\n remove: '删除',\n previous: '上一张',\n next: '下一张',\n close: '关闭 (Esc)',\n loadingError: '图片加载失败',\n zoomOut: '缩小',\n zoomIn: '放大',\n },\n codeBlock: {\n langType: '选择代码语言',\n },\n} satisfies Translation;\n","import type { Translation } from '../types';\nimport { modifierText } from '../../utils/modifier-text';\n\nexport default {\n toolbar: {\n undo: `元に戻す (${modifierText('mod+Z')})`,\n redo: `やり直し (${modifierText('mod+Y')})`,\n selectAll: `すべて選択 (${modifierText('mod+A')})`,\n paragraph: 'テキスト',\n blockQuote: 'ブロック引用',\n numberedList: '番号付きリスト',\n bulletedList: '箇条書きリスト',\n checklist: 'タスクリスト',\n alignLeft: '左揃え',\n alignCenter: '中心揃え',\n alignRight: '右揃え',\n alignJustify: '左右に並べ替え',\n increaseIndent: 'インデントを増やす',\n decreaseIndent: 'インデントを減らす',\n bold: `太字 (${modifierText('mod+B')})`,\n italic: `斜体 (${modifierText('mod+I')})`,\n underline: `下線 (${modifierText('mod+U')})`,\n strikethrough: '取り消し線',\n superscript: '上付き文字',\n subscript: '下付き文字',\n code: 'インラインコード',\n removeFormat: '形式を削除',\n formatPainter: '形式ペインタ',\n link: 'リンク',\n hr: '区切り線',\n codeBlock: 'コードブロック',\n heading: 'タイトル',\n heading1: 'タイトル 1',\n heading2: 'タイトル 2',\n heading3: 'タイトル 3',\n heading4: 'タイトル 4',\n heading5: 'タイトル 5',\n heading6: 'タイトル 6',\n list: 'リスト',\n align: '文字揃え',\n indent: 'インデント',\n fontFamily: 'フォント',\n fontSize: '文字サイズ',\n moreStyle: 'その他のスタイル',\n fontColor: '文字色',\n highlight: '文字の背景',\n image: '画像',\n removeColor: 'デフォルト',\n },\n link: {\n newLink: '新しいリンク',\n url: 'リンク URL',\n title: 'リンク文字',\n copy: 'クリップボードにコピー',\n open: 'リンクを開く',\n save: '確認',\n unlink: 'リンクを削除',\n },\n image: {\n view: '大きな画像を見る',\n remove: '削除',\n previous: '前の画像',\n next: '次の画像',\n close: '閉じる (Esc)',\n loadingError: '画像を読み込めません',\n zoomOut: '縮小',\n zoomIn: '拡大',\n },\n codeBlock: {\n langType: 'コード言語を選択',\n },\n} satisfies Translation;\n","import type { Translation } from '../types';\nimport { modifierText } from '../../utils/modifier-text';\n\nexport default {\n toolbar: {\n undo: `작업취소 (${modifierText('mod+Z')})`,\n redo: `작업재개 (${modifierText('mod+Y')})`,\n selectAll: `전체 선택 (${modifierText('mod+A')})`,\n paragraph: '텍스트',\n blockQuote: '인용문',\n numberedList: '순서 목록',\n bulletedList: '비순서 목록',\n checklist: '체크리스트',\n alignLeft: '왼쪽 정렬',\n alignCenter: '가운데 정렬',\n alignRight: '오른쪽 정렬',\n alignJustify: '좌우로 정렬',\n increaseIndent: '들여쓰기 증가',\n decreaseIndent: '들여쓰기 줄이기',\n bold: `굵게 (${modifierText('mod+B')})`,\n italic: `기울임꼴 (${modifierText('mod+I')})`,\n underline: `밑줄 (${modifierText('mod+U')})`,\n strikethrough: '취소선',\n superscript: '위첨자',\n subscript: '아래 첨자',\n code: '인라인 코드',\n removeFormat: '형식 지우기',\n formatPainter: '형식 페인터',\n link: '링크',\n hr: '구분선',\n codeBlock: '코드 블록',\n heading: '제목',\n heading1: '제목 1',\n heading2: '제목 2',\n heading3: '제목 3',\n heading4: '제목 4',\n heading5: '제목 5',\n heading6: '제목 6',\n list: '목록',\n align: '정렬',\n indent: '들여쓰기',\n fontFamily: '글꼴',\n fontSize: '글자 크기',\n moreStyle: '더 많은 스타일',\n fontColor: '글자 색상',\n highlight: '글자 배경',\n image: '이미지',\n removeColor: '기본색',\n },\n link: {\n newLink: '새 링크',\n url: '링크 URL',\n title: '링크 텍스트',\n copy: '클립보드에 복사',\n open: '링크 열기',\n save: '확인',\n unlink: '링크 제거',\n },\n image: {\n view: '큰 이미지 보기',\n remove: '삭제',\n previous: '이전 이미지',\n next: '다음 이미지',\n close: '닫기 (Esc)',\n loadingError: '이미지를 로드할 수 없습니다',\n zoomOut: '축소',\n zoomIn: '확대',\n },\n codeBlock: {\n langType: '코드언어 선택',\n },\n} satisfies Translation;\n","import { DropdownMenuItem } from '../types/dropdown';\nimport { icons } from '../icons';\nimport { locale } from '../i18n';\n\nexport const headingMenuItems: DropdownMenuItem[] = [\n {\n value: 'h1',\n text: `<span style=\"font-weight: bold; font-size: 26px;\">${locale.toolbar.heading1()}</span>`,\n },\n {\n value: 'h2',\n text: `<span style=\"font-weight: bold; font-size: 24px;\">${locale.toolbar.heading2()}</span>`,\n },\n {\n value: 'h3',\n text: `<span style=\"font-weight: bold; font-size: 22px;\">${locale.toolbar.heading3()}</span>`,\n },\n {\n value: 'h4',\n text: `<span style=\"font-weight: bold; font-size: 20px;\">${locale.toolbar.heading4()}</span>`,\n },\n {\n value: 'h5',\n text: `<span style=\"font-weight: bold; font-size: 18px;\">${locale.toolbar.heading5()}</span>`,\n },\n {\n value: 'h6',\n text: `<span style=\"font-weight: bold; font-size: 16px;\">${locale.toolbar.heading6()}</span>`,\n },\n {\n value: 'p',\n text: locale.toolbar.paragraph(),\n },\n];\n\nexport const listMenuItems: DropdownMenuItem[] = [\n {\n icon: icons.get('numberedList'),\n value: 'numbered',\n text: locale.toolbar.numberedList(),\n },\n {\n icon: icons.get('bulletedList'),\n value: 'bulleted',\n text: locale.toolbar.bulletedList(),\n },\n {\n icon: icons.get('checklist'),\n value: 'checklist',\n text: locale.toolbar.checklist(),\n },\n];\n\nexport const alignMenuItems: DropdownMenuItem[] = [\n {\n icon: icons.get('alignLeft'),\n value: 'left',\n text: locale.toolbar.alignLeft(),\n },\n {\n icon: icons.get('alignCenter'),\n value: 'center',\n text: locale.toolbar.alignCenter(),\n },\n {\n icon: icons.get('alignRight'),\n value: 'right',\n text: locale.toolbar.alignRight(),\n },\n {\n icon: icons.get('alignJustify'),\n value: 'justify',\n text: locale.toolbar.alignJustify(),\n },\n];\n\nexport const indentMenuItems: DropdownMenuItem[] = [\n {\n icon: icons.get('increaseIndent'),\n value: 'increase',\n text: locale.toolbar.increaseIndent(),\n },\n {\n icon: icons.get('decreaseIndent'),\n value: 'decrease',\n text: locale.toolbar.decreaseIndent(),\n },\n];\n\nexport const fontFamilyMenuItems: DropdownMenuItem[] = [\n {\n value: 'Arial',\n text: '<span style=\"font-family: Arial;\">Arial</span>',\n },\n {\n value: 'Arial Black',\n text: '<span style=\"font-family: \\'Arial Black\\';\">Arial Black</span>',\n },\n {\n value: 'Comic Sans MS',\n text: '<span style=\"font-family: \\'Comic Sans MS\\';\">Comic Sans MS</span>',\n },\n {\n value: 'Courier New',\n text: '<span style=\"font-family: \\'Courier New\\';\">Courier New</span>',\n },\n {\n value: 'Georgia',\n text: '<span style=\"font-family: Georgia;\">Georgia</span>',\n },\n {\n value: 'Helvetica',\n text: '<span style=\"font-family: Helvetica;\">Helvetica</span>',\n },\n {\n value: 'Impact',\n text: '<span style=\"font-family: Impact;\">Impact</span>',\n },\n {\n value: 'Segoe UI',\n text: '<span style=\"font-family: \\'Segoe UI\\';\">Segoe UI</span>',\n },\n {\n value: 'Tahoma',\n text: '<span style=\"font-family: Tahoma;\">Tahoma</span>',\n },\n {\n value: 'Times New Roman',\n text: '<span style=\"font-family: \\'Times New Roman\\';\">Times New Roman</span>',\n },\n {\n value: 'Trebuchet MS',\n text: '<span style=\"font-family: \\'Trebuchet MS\\';\">Trebuchet MS</span>',\n },\n {\n value: 'Verdana',\n text: '<span style=\"font-family: Verdana;\">Verdana</span>',\n },\n];\n\nexport const fontSizeMenuItems: DropdownMenuItem[] = [\n {\n value: '12px',\n text: '12px',\n },\n {\n value: '14px',\n text: '14px',\n },\n {\n value: '16px',\n text: '16px',\n },\n {\n value: '18px',\n text: '18px',\n },\n {\n value: '22px',\n text: '22px',\n },\n {\n value: '24px',\n text: '24px',\n },\n {\n value: '32px',\n text: '32px',\n },\n];\n\nexport const moreStyleMenuItems: DropdownMenuItem[] = [\n {\n icon: icons.get('italic'),\n value: 'italic',\n text: locale.toolbar.italic(),\n },\n {\n icon: icons.get('underline'),\n value: 'underline',\n text: locale.toolbar.underline(),\n },\n {\n icon: icons.get('strikethrough'),\n value: 'strikethrough',\n text: locale.toolbar.strikethrough(),\n },\n {\n icon: icons.get('superscript'),\n value: 'superscript',\n text: locale.toolbar.superscript(),\n },\n {\n icon: icons.get('subscript'),\n value: 'subscript',\n text: locale.toolbar.subscript(),\n },\n {\n icon: icons.get('code'),\n value: 'code',\n text: locale.toolbar.code(),\n },\n];\n\n// These colors are from Ant Design (https://ant.design/docs/spec/colors)\nconst colors: string[] = [\n // Dust Red, Volcano, Sunset Orange, Calendula Gold, Sunrise Yellow, Lime, Polar Green, Cyan, Daybreak Blue, Geek Blue, Golden Purple, Magenta\n '#f5222d', '#fa541c', '#fa8c16', '#faad14', '#fadb14', '#a0d911', '#52c41a', '#13c2c2', '#1677ff', '#2f54eb', '#722ed1', '#eb2f96', // color 6\n '#fff1f0', '#fff2e8', '#fff7e6', '#fffbe6', '#feffe6', '#fcffe6', '#f6ffed', '#e6fffb', '#e6f4ff', '#f0f5ff', '#f9f0ff', '#fff0f6', // color 1\n '#ffccc7', '#ffd8bf', '#ffe7ba', '#fff1b8', '#ffffb8', '#f4ffb8', '#d9f7be', '#b5f5ec', '#bae0ff', '#d6e4ff', '#efdbff', '#ffd6e7', // color 2\n '#ffa39e', '#ffbb96', '#ffd591', '#ffe58f', '#fffb8f', '#eaff8f', '#b7eb8f', '#87e8de', '#91caff', '#adc6ff', '#d3adf7', '#ffadd2', // color 3\n '#ff7875', '#ff9c6e', '#ffc069', '#ffd666', '#fff566', '#d3f261', '#95de64', '#5cdbd3', '#69b1ff', '#85a5ff', '#b37feb', '#ff85c0', // color 4\n '#ff4d4f', '#ff7a45', '#ffa940', '#ffc53d', '#ffec3d', '#bae637', '#73d13d', '#36cfc9', '#4096ff', '#597ef7', '#9254de', '#f759ab', // color 5\n '#cf1322', '#d4380d', '#d46b08', '#d48806', '#d4b106', '#7cb305', '#389e0d', '#08979c', '#0958d9', '#1d39c4', '#531dab', '#c41d7f', // color 7\n '#a8071a', '#ad2102', '#ad4e00', '#ad6800', '#ad8b00', '#5b8c00', '#237804', '#006d75', '#003eb3', '#10239e', '#391085', '#9e1068', // color 8\n '#820014', '#871400', '#873800', '#874d00', '#876800', '#3f6600', '#135200', '#00474f', '#002c8c', '#061178', '#22075e', '#780650', // color 9\n '#5c0011', '#610b00', '#612500', '#613400', '#614700', '#254000', '#092b00', '#002329', '#001d66', '#030852', '#120338', '#520339', // color 10\n // from gray-1 to gray-11, and gray-13\n '#000000', '#1f1f1f', '#262626', '#434343', '#595959', '#8c8c8c', '#bfbfbf', '#d9d9d9', '#f0f0f0', '#f5f5f5', '#fafafa', '#ffffff', // Neutral Color\n];\nexport const colorMenuItems: DropdownMenuItem[] = [\n {\n icon: icons.get('removeFormat'),\n value: '',\n text: locale.toolbar.removeColor(),\n },\n];\nfor (const color of colors) {\n colorMenuItems.push({\n value: color.toLowerCase(),\n text: color.toUpperCase(),\n });\n}\n","import { ToolbarItem } from '../types/toolbar';\nimport { icons } from '../icons';\nimport { locale } from '../i18n';\nimport {\n headingMenuItems,\n listMenuItems,\n alignMenuItems,\n indentMenuItems,\n fontFamilyMenuItems,\n fontSizeMenuItems,\n moreStyleMenuItems,\n colorMenuItems,\n} from './menu-items';\n\nconst tagPluginNameMap: Map<string, string> = new Map([\n ['strong', 'bold'],\n ['em', 'italic'],\n ['i', 'italic'],\n ['u', 'underline'],\n ['s', 'strikethrough'],\n ['sup', 'superscript'],\n ['sub', 'subscript'],\n ['code', 'code'],\n]);\n\nexport const toolbarItems: ToolbarItem[] = [\n {\n name: 'undo',\n type: 'button',\n icon: icons.get('undo'),\n tooltip: locale.toolbar.undo(),\n onClick: (editor, value) => {\n editor.command.execute(value);\n },\n },\n {\n name: 'redo',\n type: 'button',\n icon: icons.get('redo'),\n tooltip: locale.toolbar.redo(),\n onClick: (editor, value) => {\n editor.command.execute(value);\n },\n },\n {\n name: 'selectAll',\n type: 'button',\n icon: icons.get('selectAll'),\n tooltip: locale.toolbar.selectAll(),\n onClick: (editor, value) => {\n editor.command.execute(value);\n },\n },\n {\n name: 'paragraph',\n type: 'button',\n icon: icons.get('paragraph'),\n tooltip: locale.toolbar.paragraph(),\n isSelected: appliedItems => !!appliedItems.find(item => item.name === 'p'),\n onClick: editor => {\n editor.command.execute('heading', 'p');\n },\n },\n {\n name: 'blockQuote',\n type: 'button',\n icon: icons.get('blockQuote'),\n tooltip: locale.toolbar.blockQuote(),\n onClick: (editor, value) => {\n editor.command.execute(value);\n },\n },\n {\n name: 'numberedList',\n type: 'button',\n icon: icons.get('numberedList'),\n tooltip: locale.toolbar.numberedList(),\n isSelected: appliedItems => !!appliedItems.find(item => item.name === 'ol'),\n onClick: editor => {\n editor.command.execute('list', 'numbered');\n },\n },\n {\n name: 'bulletedList',\n type: 'button',\n icon: icons.get('bulletedList'),\n tooltip: locale.toolbar.bulletedList(),\n isSelected: appliedItems => !!appliedItems.find(item => item.name === 'ul' && !item.node.hasAttr('type')),\n onClick: editor => {\n editor.command.execute('list', 'bulleted');\n },\n },\n {\n name: 'checklist',\n type: 'button',\n icon: icons.get('checklist'),\n tooltip: locale.toolbar.checklist(),\n isSelected: appliedItems => !!appliedItems.find(item => item.name === 'ul' && item.node.attr('type') === 'checklist'),\n onClick: editor => {\n editor.command.execute('list', 'checklist');\n },\n },\n {\n name: 'alignLeft',\n type: 'button',\n icon: icons.get('alignLeft'),\n tooltip: locale.toolbar.alignLeft(),\n isSelected: appliedItems => !!appliedItems.find(item => item.node.isBlock && item.node.css('text-align') === 'left'),\n onClick: editor => {\n editor.command.execute('align', 'left');\n },\n },\n {\n name: 'alignCenter',\n type: 'button',\n icon: icons.get('alignCenter'),\n tooltip: locale.toolbar.alignCenter(),\n isSelected: appliedItems => !!appliedItems.find(item => item.node.isBlock && item.node.css('text-align') === 'center'),\n onClick: editor => {\n editor.command.execute('align', 'center');\n },\n },\n {\n name: 'alignRight',\n type: 'button',\n icon: icons.get('alignRight'),\n tooltip: locale.toolbar.alignRight(),\n isSelected: appliedItems => !!appliedItems.find(item => item.node.isBlock && item.node.css('text-align') === 'right'),\n onClick: editor => {\n editor.command.execute('align', 'right');\n },\n },\n {\n name: 'alignJustify',\n type: 'button',\n icon: icons.get('alignJustify'),\n tooltip: locale.toolbar.alignJustify(),\n isSelected: appliedItems => !!appliedItems.find(item => item.node.isBlock && item.node.css('text-align') === 'justify'),\n onClick: editor => {\n editor.command.execute('align', 'justify');\n },\n },\n {\n name: 'increaseIndent',\n type: 'button',\n icon: icons.get('increaseIndent'),\n tooltip: locale.toolbar.increaseIndent(),\n onClick: editor => {\n editor.command.execute('indent', 'increase');\n },\n },\n {\n name: 'decreaseIndent',\n type: 'button',\n icon: icons.get('decreaseIndent'),\n tooltip: locale.toolbar.decreaseIndent(),\n onClick: editor => {\n editor.command.execute('indent', 'decrease');\n },\n },\n {\n name: 'bold',\n type: 'button',\n icon: icons.get('bold'),\n tooltip: locale.toolbar.bold(),\n onClick: (editor, value) => {\n editor.command.execute(value);\n },\n },\n {\n name: 'italic',\n type: 'button',\n icon: icons.get('italic'),\n tooltip: locale.toolbar.italic(),\n onClick: (editor, value) => {\n editor.command.execute(value);\n },\n },\n {\n name: 'underline',\n type: 'button',\n icon: icons.get('underline'),\n tooltip: locale.toolbar.underline(),\n onClick: (editor, value) => {\n editor.command.execute(value);\n },\n },\n {\n name: 'strikethrough',\n type: 'button',\n icon: icons.get('strikethrough'),\n tooltip: locale.toolbar.strikethrough(),\n onClick: (editor, value) => {\n editor.command.execute(value);\n },\n },\n {\n name: 'superscript',\n type: 'button',\n icon: icons.get('superscript'),\n tooltip: locale.toolbar.superscript(),\n onClick: (editor, value) => {\n editor.command.execute(value);\n },\n },\n {\n name: 'subscript',\n type: 'button',\n icon: icons.get('subscript'),\n tooltip: locale.toolbar.subscript(),\n onClick: (editor, value) => {\n editor.command.execute(value);\n },\n },\n {\n name: 'code',\n type: 'button',\n icon: icons.get('code'),\n tooltip: locale.toolbar.code(),\n onClick: (editor, value) => {\n editor.command.execute(value);\n },\n },\n {\n name: 'removeFormat',\n type: 'button',\n icon: icons.get('removeFormat'),\n tooltip: locale.toolbar.removeFormat(),\n onClick: (editor, value) => {\n editor.command.execute(value);\n },\n },\n {\n name: 'formatPainter',\n type: 'button',\n icon: icons.get('formatPainter'),\n tooltip: locale.toolbar.formatPainter(),\n onClick: (editor, value) => {\n editor.command.execute(value);\n },\n },\n {\n name: 'link',\n type: 'button',\n icon: icons.get('link'),\n tooltip: locale.toolbar.link(),\n onClick: (editor, value) => {\n editor.command.execute(value);\n },\n },\n {\n name: 'hr',\n type: 'button',\n icon: icons.get('hr'),\n tooltip: locale.toolbar.hr(),\n onClick: (editor, value) => {\n editor.command.execute(value);\n },\n },\n {\n name: 'codeBlock',\n type: 'button',\n icon: icons.get('codeBlock'),\n tooltip: locale.toolbar.codeBlock(),\n onClick: (editor, value) => {\n editor.command.execute(value);\n },\n },\n {\n name: 'heading',\n type: 'dropdown',\n downIcon: icons.get('down'),\n defaultValue: 'p',\n tooltip: locale.toolbar.heading(),\n width: '100px',\n menuType: 'list',\n menuItems: headingMenuItems,\n onSelect: (editor, value) => {\n editor.command.execute('heading', value);\n },\n },\n {\n name: 'list',\n type: 'dropdown',\n downIcon: icons.get('down'),\n icon: icons.get('list'),\n defaultValue: '',\n tooltip: locale.toolbar.list(),\n width: 'auto',\n menuType: 'list',\n menuItems: listMenuItems,\n onSelect: (editor, value) => {\n editor.command.execute('list', value);\n },\n },\n {\n name: 'align',\n type: 'dropdown',\n downIcon: icons.get('down'),\n icon: icons.get('alignLeft'),\n defaultValue: '',\n tooltip: locale.toolbar.align(),\n width: 'auto',\n menuType: 'list',\n menuItems: alignMenuItems,\n onSelect: (editor, value) => {\n editor.command.execute('align', value);\n },\n },\n {\n name: 'indent',\n type: 'dropdown',\n downIcon: icons.get('down'),\n icon: icons.get('increaseIndent'),\n defaultValue: '',\n tooltip: locale.toolbar.indent(),\n width: 'auto',\n menuType: 'list',\n menuItems: indentMenuItems,\n onSelect: (editor, value) => {\n editor.command.execute('indent', value);\n },\n },\n {\n name: 'fontFamily',\n type: 'dropdown',\n downIcon: icons.get('down'),\n defaultValue: 'Segoe UI',\n tooltip: locale.toolbar.fontFamily(),\n width: '100px',\n menuType: 'list',\n menuItems: fontFamilyMenuItems,\n onSelect: (editor, value) => {\n editor.command.execute('fontFamily', value);\n },\n },\n {\n name: 'fontSize',\n type: 'dropdown',\n downIcon: icons.get('down'),\n defaultValue: '16px',\n tooltip: locale.toolbar.fontSize(),\n width: '65px',\n menuType: 'list',\n menuItems: fontSizeMenuItems,\n onSelect: (editor, value) => {\n editor.command.execute('fontSize', value);\n },\n },\n {\n name: 'moreStyle',\n type: 'dropdown',\n icon: icons.get('more'),\n defaultValue: '',\n tooltip: locale.toolbar.moreStyle(),\n width: 'auto',\n menuType: 'list',\n menuItems: moreStyleMenuItems,\n selectedValues: appliedItems => {\n const currentValues = [];\n for (const item of appliedItems) {\n if (item.node.isMark) {\n const name = tagPluginNameMap.get(item.name) ?? item.name;\n currentValues.push(name);\n }\n }\n return currentValues;\n },\n onSelect: (editor, value) => {\n editor.command.execute(value);\n },\n },\n {\n name: 'fontColor',\n type: 'dropdown',\n downIcon: icons.get('down'),\n icon: icons.get('fontColor'),\n accentIcon: icons.get('fontColorAccent'),\n defaultValue: '#f5222d',\n tooltip: locale.toolbar.fontColor(),\n width: 'auto',\n menuType: 'color',\n menuItems: colorMenuItems,\n onSelect: (editor, value) => {\n editor.command.execute('fontColor', value);\n },\n },\n {\n name: 'highlight',\n type: 'dropdown',\n downIcon: icons.get('down'),\n icon: icons.get('highlight'),\n accentIcon: icons.get('highlightAccent'),\n defaultValue: '#fadb14',\n tooltip: locale.toolbar.highlight(),\n width: 'auto',\n menuType: 'color',\n menuItems: colorMenuItems,\n onSelect: (editor, value) => {\n editor.command.execute('highlight', value);\n },\n },\n {\n name: 'image',\n type: 'upload',\n icon: icons.get('image'),\n tooltip: locale.toolbar.image(),\n accept: 'image/*',\n multiple: true,\n },\n];\n","import type { Editor } from '../editor';\nimport { debug } from '../utils/debug';\nimport { request } from '../utils/request';\nimport { Box } from '../models/box';\n\ntype Config = {\n editor: Editor;\n file: File;\n onError?: ()=> void;\n onSuccess?: ()=> void;\n};\n\nexport function uploadImage(config: Config): Box {\n const { editor, file, onError, onSuccess} = config;\n const { imageRequestMethod, imageRequestAction, imageRequestTypes } = editor.config;\n if (imageRequestTypes.indexOf(file.type) < 0) {\n throw new Error(`Cannot upload file because its type '${file.type}' is not found in ['${imageRequestTypes.join('\\', \\'')}'].`);\n }\n const box = editor.insertBox('image', {\n url: URL.createObjectURL(file),\n status: 'uploading',\n name: file.name,\n size: file.size,\n type: file.type,\n lastModified: file.lastModified,\n });\n const xhr = request({\n onProgress: e => {\n const percentNode = box.node.find('.lake-percent');\n const percent = Math.round(e.percent);\n percentNode.text(`${percent < 100 ? percent : 99} %`);\n },\n onError: (error, body) => {\n debug(error.toString(), body);\n box.updateValue('status', 'error');\n box.render();\n if (onError) {\n onError();\n }\n },\n onSuccess: body => {\n if (!body.url) {\n box.updateValue('status', 'error');\n box.render();\n if (onError) {\n onError();\n }\n return;\n }\n box.updateValue({\n status: 'done',\n url: body.url,\n });\n box.render();\n editor.history.save();\n if (onSuccess) {\n onSuccess();\n }\n },\n file,\n action: imageRequestAction,\n method: imageRequestMethod,\n });\n box.setData('xhr', xhr);\n return box;\n}\n","import type { Editor } from '../editor';\nimport { NativeNode } from '../types/native';\nimport { AppliedItem } from '../types/object';\nimport { ToolbarButtonItem, ToolbarDropdownItem, ToolbarUploadItem, ToolbarItem } from '../types/toolbar';\nimport { toolbarItems } from '../config/toolbar-items';\nimport { safeTemplate } from '../utils/safe-template';\nimport { query } from '../utils/query';\nimport { Nodes } from '../models/nodes';\nimport { Button } from './button';\nimport { Dropdown } from './dropdown';\nimport { uploadImage } from './upload';\n\ntype ToolbarConfig = {\n root: string | Nodes | NativeNode;\n items?: (string | ToolbarItem)[];\n};\n\ntype StateData = {\n appliedItems: AppliedItem[];\n disabledNameMap: Map<string, boolean>;\n selectedNameMap: Map<string, boolean>;\n selectedValuesMap: Map<string, string[]>;\n};\n\nconst defaultItems: string[] = [\n 'undo',\n 'redo',\n '|',\n 'heading',\n 'fontSize',\n '|',\n 'formatPainter',\n 'removeFormat',\n 'bold',\n 'moreStyle',\n '|',\n 'fontColor',\n 'highlight',\n '|',\n 'align',\n 'list',\n 'indent',\n 'link',\n 'blockQuote',\n 'hr',\n];\n\nconst toolbarItemMap: Map<string, ToolbarItem> = new Map();\n\ntoolbarItems.forEach(item => {\n toolbarItemMap.set(item.name, item);\n});\n\nexport class Toolbar {\n\n private items: (string | ToolbarItem)[];\n\n private root: Nodes;\n\n private allMenuMap: Map<string, Map<string, string>> = new Map();\n\n private buttonItemList: ToolbarButtonItem[] = [];\n\n private dropdownItemList: ToolbarDropdownItem[] = [];\n\n public container: Nodes;\n\n constructor(config: ToolbarConfig) {\n this.items = config.items || defaultItems;\n this.root = query(config.root);\n this.container = query('<div class=\"lake-toolbar\" />');\n\n this.root.addClass('lake-custom-properties');\n }\n\n private appendDivider(): void {\n this.container.append('<div class=\"lake-toolbar-divider\" />');\n }\n\n private appendButton(editor: Editor, item: ToolbarButtonItem): void {\n const button = new Button({\n root: this.container,\n name: item.name,\n icon: item.icon,\n tooltip: item.tooltip,\n tabIndex: -1,\n onClick: () => {\n editor.focus();\n item.onClick(editor, item.name);\n },\n });\n button.render();\n }\n\n private appendDropdown(editor: Editor, item: ToolbarDropdownItem) {\n const dropdown = new Dropdown({\n root: this.container,\n name: item.name,\n icon: item.icon,\n accentIcon: item.accentIcon,\n downIcon: item.downIcon,\n defaultValue: item.defaultValue,\n tooltip:item.tooltip,\n width: item.width,\n menuType: item.menuType,\n menuItems: item.menuItems,\n tabIndex: -1,\n onSelect: value => {\n editor.focus();\n item.onSelect(editor, value);\n },\n });\n dropdown.render();\n }\n\n private appendUpload(editor: Editor, item: ToolbarUploadItem): void {\n const uploadNode = query(safeTemplate`\n <div class=\"lake-upload\" name=\"${item.name}\">\n <input type=\"file\" />\n </div>\n `);\n const fileNode = uploadNode.find('input[type=\"file\"]');\n const fileNativeNode = fileNode.get(0) as HTMLInputElement;\n if (item.accept) {\n fileNode.attr('accept', item.accept);\n }\n if (item.multiple === true) {\n fileNode.attr('multiple', 'true');\n }\n const button = new Button({\n root: uploadNode,\n name: item.name,\n icon: item.icon,\n tooltip: item.tooltip,\n tabIndex: -1,\n onClick: () => {\n editor.focus();\n fileNativeNode.click();\n },\n });\n button.render();\n this.container.append(uploadNode);\n fileNode.on('click', event => event.stopPropagation());\n fileNode.on('change', event => {\n const target = event.target as HTMLInputElement;\n const files = target.files || [];\n for (const file of files) {\n uploadImage({\n editor,\n file,\n });\n }\n });\n }\n\n // Updates state of each item such as disabled, selected.\n public updateState(data: StateData) {\n const { appliedItems, disabledNameMap, selectedNameMap, selectedValuesMap } = data;\n for (const item of this.buttonItemList) {\n const selectedClass = 'lake-button-selected';\n const buttonNode = this.container.find(`button[name=\"${item.name}\"]`);\n let isDisabled = disabledNameMap.get(item.name);\n if (isDisabled === undefined) {\n isDisabled = item.isDisabled && appliedItems.length > 0 ? item.isDisabled(appliedItems) : false;\n }\n if (isDisabled) {\n buttonNode.attr('disabled', 'true');\n buttonNode.removeClass(selectedClass);\n } else {\n buttonNode.removeAttr('disabled');\n }\n if (!isDisabled) {\n let isSelected = selectedNameMap.get(item.name);\n if (isSelected === undefined) {\n isSelected = item.isSelected && appliedItems.length > 0 ? item.isSelected(appliedItems) : false;\n }\n if (isSelected) {\n buttonNode.addClass(selectedClass);\n } else {\n buttonNode.removeClass(selectedClass);\n }\n }\n }\n for (const item of this.dropdownItemList) {\n let selectedValues = selectedValuesMap.get(item.name);\n if (selectedValues === undefined) {\n selectedValues = item.selectedValues && appliedItems.length > 0 ? item.selectedValues(appliedItems) : [];\n }\n const dropdownNode = this.container.find(`div.lake-dropdown[name=\"${item.name}\"]`);\n let isDisabled = disabledNameMap.get(item.name);\n if (isDisabled === undefined) {\n isDisabled = item.isDisabled && appliedItems.length > 0 ? item.isDisabled(appliedItems) : false;\n }\n if (isDisabled) {\n dropdownNode.attr('disabled', 'true');\n } else {\n dropdownNode.removeAttr('disabled');\n }\n if (!isDisabled) {\n Dropdown.setValue(dropdownNode, selectedValues);\n const textNode = dropdownNode.find('.lake-dropdown-text');\n if (textNode.length > 0) {\n const key = selectedValues[0] || item.defaultValue;\n const menuMap = this.allMenuMap.get(item.name);\n const text = (menuMap && menuMap.get(key)) ?? key;\n textNode.text(text);\n }\n }\n }\n }\n\n // Renders a toolbar for the specified editor.\n public render(editor: Editor) {\n this.root.empty();\n this.root.append(this.container);\n this.items.forEach(name => {\n if (name === '|') {\n this.appendDivider();\n return;\n }\n let item;\n if (typeof name === 'string') {\n item = toolbarItemMap.get(name);\n if (!item) {\n return;\n }\n } else {\n item = name;\n }\n if (item.type === 'button') {\n this.buttonItemList.push(item);\n this.appendButton(editor, item);\n return;\n }\n if (item.type === 'dropdown') {\n this.allMenuMap.set(item.name, Dropdown.getMenuMap(item.menuItems));\n this.dropdownItemList.push(item);\n this.appendDropdown(editor, item);\n return;\n }\n if (item.type === 'upload') {\n this.appendUpload(editor, item);\n }\n });\n }\n}\n","/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise, SuppressedError, Symbol */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\r\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\r\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\r\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\r\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\r\n var _, done = false;\r\n for (var i = decorators.length - 1; i >= 0; i--) {\r\n var context = {};\r\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\r\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\r\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\r\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\r\n if (kind === \"accessor\") {\r\n if (result === void 0) continue;\r\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\r\n if (_ = accept(result.get)) descriptor.get = _;\r\n if (_ = accept(result.set)) descriptor.set = _;\r\n if (_ = accept(result.init)) initializers.unshift(_);\r\n }\r\n else if (_ = accept(result)) {\r\n if (kind === \"field\") initializers.unshift(_);\r\n else descriptor[key] = _;\r\n }\r\n }\r\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\r\n done = true;\r\n};\r\n\r\nexport function __runInitializers(thisArg, initializers, value) {\r\n var useValue = arguments.length > 2;\r\n for (var i = 0; i < initializers.length; i++) {\r\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\r\n }\r\n return useValue ? value : void 0;\r\n};\r\n\r\nexport function __propKey(x) {\r\n return typeof x === \"symbol\" ? x : \"\".concat(x);\r\n};\r\n\r\nexport function __setFunctionName(f, name, prefix) {\r\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\r\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\r\n};\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n var desc = Object.getOwnPropertyDescriptor(m, k);\r\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n desc = { enumerable: true, get: function() { return m[k]; } };\r\n }\r\n Object.defineProperty(o, k2, desc);\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\nexport function __classPrivateFieldIn(state, receiver) {\r\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n}\r\n\r\nexport function __addDisposableResource(env, value, async) {\r\n if (value !== null && value !== void 0) {\r\n if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\r\n var dispose;\r\n if (async) {\r\n if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\r\n dispose = value[Symbol.asyncDispose];\r\n }\r\n if (dispose === void 0) {\r\n if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\r\n dispose = value[Symbol.dispose];\r\n }\r\n if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\r\n env.stack.push({ value: value, dispose: dispose, async: async });\r\n }\r\n else if (async) {\r\n env.stack.push({ async: true });\r\n }\r\n return value;\r\n}\r\n\r\nvar _SuppressedError = typeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\r\n var e = new Error(message);\r\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\r\n};\r\n\r\nexport function __disposeResources(env) {\r\n function fail(e) {\r\n env.error = env.hasError ? new _SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\r\n env.hasError = true;\r\n }\r\n function next() {\r\n while (env.stack.length) {\r\n var rec = env.stack.pop();\r\n try {\r\n var result = rec.dispose && rec.dispose.call(rec.value);\r\n if (rec.async) return Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\r\n }\r\n catch (e) {\r\n fail(e);\r\n }\r\n }\r\n if (env.hasError) throw env.error;\r\n }\r\n return next();\r\n}\r\n\r\nexport default {\r\n __extends: __extends,\r\n __assign: __assign,\r\n __rest: __rest,\r\n __decorate: __decorate,\r\n __param: __param,\r\n __metadata: __metadata,\r\n __awaiter: __awaiter,\r\n __generator: __generator,\r\n __createBinding: __createBinding,\r\n __exportStar: __exportStar,\r\n __values: __values,\r\n __read: __read,\r\n __spread: __spread,\r\n __spreadArrays: __spreadArrays,\r\n __spreadArray: __spreadArray,\r\n __await: __await,\r\n __asyncGenerator: __asyncGenerator,\r\n __asyncDelegator: __asyncDelegator,\r\n __asyncValues: __asyncValues,\r\n __makeTemplateObject: __makeTemplateObject,\r\n __importStar: __importStar,\r\n __importDefault: __importDefault,\r\n __classPrivateFieldGet: __classPrivateFieldGet,\r\n __classPrivateFieldSet: __classPrivateFieldSet,\r\n __classPrivateFieldIn: __classPrivateFieldIn,\r\n __addDisposableResource: __addDisposableResource,\r\n __disposeResources: __disposeResources,\r\n};\r\n","/*!\n * PhotoSwipe Lightbox 5.4.3 - https://photoswipe.com\n * (c) 2023 Dmytro Semenov\n */\n/** @typedef {import('../photoswipe.js').Point} Point */\n\n/**\r\n * @template {keyof HTMLElementTagNameMap} T\r\n * @param {string} className\r\n * @param {T} tagName\r\n * @param {Node} [appendToEl]\r\n * @returns {HTMLElementTagNameMap[T]}\r\n */\nfunction createElement(className, tagName, appendToEl) {\n const el = document.createElement(tagName);\n\n if (className) {\n el.className = className;\n }\n\n if (appendToEl) {\n appendToEl.appendChild(el);\n }\n\n return el;\n}\n/**\r\n * Get transform string\r\n *\r\n * @param {number} x\r\n * @param {number} [y]\r\n * @param {number} [scale]\r\n * @returns {string}\r\n */\n\nfunction toTransformString(x, y, scale) {\n let propValue = `translate3d(${x}px,${y || 0}px,0)`;\n\n if (scale !== undefined) {\n propValue += ` scale3d(${scale},${scale},1)`;\n }\n\n return propValue;\n}\n/**\r\n * Apply width and height CSS properties to element\r\n *\r\n * @param {HTMLElement} el\r\n * @param {string | number} w\r\n * @param {string | number} h\r\n */\n\nfunction setWidthHeight(el, w, h) {\n el.style.width = typeof w === 'number' ? `${w}px` : w;\n el.style.height = typeof h === 'number' ? `${h}px` : h;\n}\n/** @typedef {LOAD_STATE[keyof LOAD_STATE]} LoadState */\n\n/** @type {{ IDLE: 'idle'; LOADING: 'loading'; LOADED: 'loaded'; ERROR: 'error' }} */\n\nconst LOAD_STATE = {\n IDLE: 'idle',\n LOADING: 'loading',\n LOADED: 'loaded',\n ERROR: 'error'\n};\n/**\r\n * Check if click or keydown event was dispatched\r\n * with a special key or via mouse wheel.\r\n *\r\n * @param {MouseEvent | KeyboardEvent} e\r\n * @returns {boolean}\r\n */\n\nfunction specialKeyUsed(e) {\n return 'button' in e && e.button === 1 || e.ctrlKey || e.metaKey || e.altKey || e.shiftKey;\n}\n/**\r\n * Parse `gallery` or `children` options.\r\n *\r\n * @param {import('../photoswipe.js').ElementProvider} [option]\r\n * @param {string} [legacySelector]\r\n * @param {HTMLElement | Document} [parent]\r\n * @returns HTMLElement[]\r\n */\n\nfunction getElementsFromOption(option, legacySelector, parent = document) {\n /** @type {HTMLElement[]} */\n let elements = [];\n\n if (option instanceof Element) {\n elements = [option];\n } else if (option instanceof NodeList || Array.isArray(option)) {\n elements = Array.from(option);\n } else {\n const selector = typeof option === 'string' ? option : legacySelector;\n\n if (selector) {\n elements = Array.from(parent.querySelectorAll(selector));\n }\n }\n\n return elements;\n}\n/**\r\n * Check if variable is PhotoSwipe class\r\n *\r\n * @param {any} fn\r\n * @returns {boolean}\r\n */\n\nfunction isPswpClass(fn) {\n return typeof fn === 'function' && fn.prototype && fn.prototype.goTo;\n}\n/**\r\n * Check if browser is Safari\r\n *\r\n * @returns {boolean}\r\n */\n\nfunction isSafari() {\n return !!(navigator.vendor && navigator.vendor.match(/apple/i));\n}\n\n/** @typedef {import('../lightbox/lightbox.js').default} PhotoSwipeLightbox */\n\n/** @typedef {import('../photoswipe.js').default} PhotoSwipe */\n\n/** @typedef {import('../photoswipe.js').PhotoSwipeOptions} PhotoSwipeOptions */\n\n/** @typedef {import('../photoswipe.js').DataSource} DataSource */\n\n/** @typedef {import('../ui/ui-element.js').UIElementData} UIElementData */\n\n/** @typedef {import('../slide/content.js').default} ContentDefault */\n\n/** @typedef {import('../slide/slide.js').default} Slide */\n\n/** @typedef {import('../slide/slide.js').SlideData} SlideData */\n\n/** @typedef {import('../slide/zoom-level.js').default} ZoomLevel */\n\n/** @typedef {import('../slide/get-thumb-bounds.js').Bounds} Bounds */\n\n/**\r\n * Allow adding an arbitrary props to the Content\r\n * https://photoswipe.com/custom-content/#using-webp-image-format\r\n * @typedef {ContentDefault & Record<string, any>} Content\r\n */\n\n/** @typedef {{ x?: number; y?: number }} Point */\n\n/**\r\n * @typedef {Object} PhotoSwipeEventsMap https://photoswipe.com/events/\r\n *\r\n *\r\n * https://photoswipe.com/adding-ui-elements/\r\n *\r\n * @prop {undefined} uiRegister\r\n * @prop {{ data: UIElementData }} uiElementCreate\r\n *\r\n *\r\n * https://photoswipe.com/events/#initialization-events\r\n *\r\n * @prop {undefined} beforeOpen\r\n * @prop {undefined} firstUpdate\r\n * @prop {undefined} initialLayout\r\n * @prop {undefined} change\r\n * @prop {undefined} afterInit\r\n * @prop {undefined} bindEvents\r\n *\r\n *\r\n * https://photoswipe.com/events/#opening-or-closing-transition-events\r\n *\r\n * @prop {undefined} openingAnimationStart\r\n * @prop {undefined} openingAnimationEnd\r\n * @prop {undefined} closingAnimationStart\r\n * @prop {undefined} closingAnimationEnd\r\n *\r\n *\r\n * https://photoswipe.com/events/#closing-events\r\n *\r\n * @prop {undefined} close\r\n * @prop {undefined} destroy\r\n *\r\n *\r\n * https://photoswipe.com/events/#pointer-and-gesture-events\r\n *\r\n * @prop {{ originalEvent: PointerEvent }} pointerDown\r\n * @prop {{ originalEvent: PointerEvent }} pointerMove\r\n * @prop {{ originalEvent: PointerEvent }} pointerUp\r\n * @prop {{ bgOpacity: number }} pinchClose can be default prevented\r\n * @prop {{ panY: number }} verticalDrag can be default prevented\r\n *\r\n *\r\n * https://photoswipe.com/events/#slide-content-events\r\n *\r\n * @prop {{ content: Content }} contentInit\r\n * @prop {{ content: Content; isLazy: boolean }} contentLoad can be default prevented\r\n * @prop {{ content: Content; isLazy: boolean }} contentLoadImage can be default prevented\r\n * @prop {{ content: Content; slide: Slide; isError?: boolean }} loadComplete\r\n * @prop {{ content: Content; slide: Slide }} loadError\r\n * @prop {{ content: Content; width: number; height: number }} contentResize can be default prevented\r\n * @prop {{ content: Content; width: number; height: number; slide: Slide }} imageSizeChange\r\n * @prop {{ content: Content }} contentLazyLoad can be default prevented\r\n * @prop {{ content: Content }} contentAppend can be default prevented\r\n * @prop {{ content: Content }} contentActivate can be default prevented\r\n * @prop {{ content: Content }} contentDeactivate can be default prevented\r\n * @prop {{ content: Content }} contentRemove can be default prevented\r\n * @prop {{ content: Content }} contentDestroy can be default prevented\r\n *\r\n *\r\n * undocumented\r\n *\r\n * @prop {{ point: Point; originalEvent: PointerEvent }} imageClickAction can be default prevented\r\n * @prop {{ point: Point; originalEvent: PointerEvent }} bgClickAction can be default prevented\r\n * @prop {{ point: Point; originalEvent: PointerEvent }} tapAction can be default prevented\r\n * @prop {{ point: Point; originalEvent: PointerEvent }} doubleTapAction can be default prevented\r\n *\r\n * @prop {{ originalEvent: KeyboardEvent }} keydown can be default prevented\r\n * @prop {{ x: number; dragging: boolean }} moveMainScroll\r\n * @prop {{ slide: Slide }} firstZoomPan\r\n * @prop {{ slide: Slide | undefined, data: SlideData, index: number }} gettingData\r\n * @prop {undefined} beforeResize\r\n * @prop {undefined} resize\r\n * @prop {undefined} viewportSize\r\n * @prop {undefined} updateScrollOffset\r\n * @prop {{ slide: Slide }} slideInit\r\n * @prop {{ slide: Slide }} afterSetContent\r\n * @prop {{ slide: Slide }} slideLoad\r\n * @prop {{ slide: Slide }} appendHeavy can be default prevented\r\n * @prop {{ slide: Slide }} appendHeavyContent\r\n * @prop {{ slide: Slide }} slideActivate\r\n * @prop {{ slide: Slide }} slideDeactivate\r\n * @prop {{ slide: Slide }} slideDestroy\r\n * @prop {{ destZoomLevel: number, centerPoint: Point | undefined, transitionDuration: number | false | undefined }} beforeZoomTo\r\n * @prop {{ slide: Slide }} zoomPanUpdate\r\n * @prop {{ slide: Slide }} initialZoomPan\r\n * @prop {{ slide: Slide }} calcSlideSize\r\n * @prop {undefined} resolutionChanged\r\n * @prop {{ originalEvent: WheelEvent }} wheel can be default prevented\r\n * @prop {{ content: Content }} contentAppendImage can be default prevented\r\n * @prop {{ index: number; itemData: SlideData }} lazyLoadSlide can be default prevented\r\n * @prop {undefined} lazyLoad\r\n * @prop {{ slide: Slide }} calcBounds\r\n * @prop {{ zoomLevels: ZoomLevel, slideData: SlideData }} zoomLevelsUpdate\r\n *\r\n *\r\n * legacy\r\n *\r\n * @prop {undefined} init\r\n * @prop {undefined} initialZoomIn\r\n * @prop {undefined} initialZoomOut\r\n * @prop {undefined} initialZoomInEnd\r\n * @prop {undefined} initialZoomOutEnd\r\n * @prop {{ dataSource: DataSource | undefined, numItems: number }} numItems\r\n * @prop {{ itemData: SlideData; index: number }} itemData\r\n * @prop {{ index: number, itemData: SlideData, instance: PhotoSwipe }} thumbBounds\r\n */\n\n/**\r\n * @typedef {Object} PhotoSwipeFiltersMap https://photoswipe.com/filters/\r\n *\r\n * @prop {(numItems: number, dataSource: DataSource | undefined) => number} numItems\r\n * Modify the total amount of slides. Example on Data sources page.\r\n * https://photoswipe.com/filters/#numitems\r\n *\r\n * @prop {(itemData: SlideData, index: number) => SlideData} itemData\r\n * Modify slide item data. Example on Data sources page.\r\n * https://photoswipe.com/filters/#itemdata\r\n *\r\n * @prop {(itemData: SlideData, element: HTMLElement, linkEl: HTMLAnchorElement) => SlideData} domItemData\r\n * Modify item data when it's parsed from DOM element. Example on Data sources page.\r\n * https://photoswipe.com/filters/#domitemdata\r\n *\r\n * @prop {(clickedIndex: number, e: MouseEvent, instance: PhotoSwipeLightbox) => number} clickedIndex\r\n * Modify clicked gallery item index.\r\n * https://photoswipe.com/filters/#clickedindex\r\n *\r\n * @prop {(placeholderSrc: string | false, content: Content) => string | false} placeholderSrc\r\n * Modify placeholder image source.\r\n * https://photoswipe.com/filters/#placeholdersrc\r\n *\r\n * @prop {(isContentLoading: boolean, content: Content) => boolean} isContentLoading\r\n * Modify if the content is currently loading.\r\n * https://photoswipe.com/filters/#iscontentloading\r\n *\r\n * @prop {(isContentZoomable: boolean, content: Content) => boolean} isContentZoomable\r\n * Modify if the content can be zoomed.\r\n * https://photoswipe.com/filters/#iscontentzoomable\r\n *\r\n * @prop {(useContentPlaceholder: boolean, content: Content) => boolean} useContentPlaceholder\r\n * Modify if the placeholder should be used for the content.\r\n * https://photoswipe.com/filters/#usecontentplaceholder\r\n *\r\n * @prop {(isKeepingPlaceholder: boolean, content: Content) => boolean} isKeepingPlaceholder\r\n * Modify if the placeholder should be kept after the content is loaded.\r\n * https://photoswipe.com/filters/#iskeepingplaceholder\r\n *\r\n *\r\n * @prop {(contentErrorElement: HTMLElement, content: Content) => HTMLElement} contentErrorElement\r\n * Modify an element when the content has error state (for example, if image cannot be loaded).\r\n * https://photoswipe.com/filters/#contenterrorelement\r\n *\r\n * @prop {(element: HTMLElement, data: UIElementData) => HTMLElement} uiElement\r\n * Modify a UI element that's being created.\r\n * https://photoswipe.com/filters/#uielement\r\n *\r\n * @prop {(thumbnail: HTMLElement | null | undefined, itemData: SlideData, index: number) => HTMLElement} thumbEl\r\n * Modify the thumbnail element from which opening zoom animation starts or ends.\r\n * https://photoswipe.com/filters/#thumbel\r\n *\r\n * @prop {(thumbBounds: Bounds | undefined, itemData: SlideData, index: number) => Bounds} thumbBounds\r\n * Modify the thumbnail bounds from which opening zoom animation starts or ends.\r\n * https://photoswipe.com/filters/#thumbbounds\r\n *\r\n * @prop {(srcsetSizesWidth: number, content: Content) => number} srcsetSizesWidth\r\n *\r\n * @prop {(preventPointerEvent: boolean, event: PointerEvent, pointerType: string) => boolean} preventPointerEvent\r\n *\r\n */\n\n/**\r\n * @template {keyof PhotoSwipeFiltersMap} T\r\n * @typedef {{ fn: PhotoSwipeFiltersMap[T], priority: number }} Filter\r\n */\n\n/**\r\n * @template {keyof PhotoSwipeEventsMap} T\r\n * @typedef {PhotoSwipeEventsMap[T] extends undefined ? PhotoSwipeEvent<T> : PhotoSwipeEvent<T> & PhotoSwipeEventsMap[T]} AugmentedEvent\r\n */\n\n/**\r\n * @template {keyof PhotoSwipeEventsMap} T\r\n * @typedef {(event: AugmentedEvent<T>) => void} EventCallback\r\n */\n\n/**\r\n * Base PhotoSwipe event object\r\n *\r\n * @template {keyof PhotoSwipeEventsMap} T\r\n */\nclass PhotoSwipeEvent {\n /**\r\n * @param {T} type\r\n * @param {PhotoSwipeEventsMap[T]} [details]\r\n */\n constructor(type, details) {\n this.type = type;\n this.defaultPrevented = false;\n\n if (details) {\n Object.assign(this, details);\n }\n }\n\n preventDefault() {\n this.defaultPrevented = true;\n }\n\n}\n/**\r\n * PhotoSwipe base class that can listen and dispatch for events.\r\n * Shared by PhotoSwipe Core and PhotoSwipe Lightbox, extended by base.js\r\n */\n\n\nclass Eventable {\n constructor() {\n /**\r\n * @type {{ [T in keyof PhotoSwipeEventsMap]?: ((event: AugmentedEvent<T>) => void)[] }}\r\n */\n this._listeners = {};\n /**\r\n * @type {{ [T in keyof PhotoSwipeFiltersMap]?: Filter<T>[] }}\r\n */\n\n this._filters = {};\n /** @type {PhotoSwipe | undefined} */\n\n this.pswp = undefined;\n /** @type {PhotoSwipeOptions | undefined} */\n\n this.options = undefined;\n }\n /**\r\n * @template {keyof PhotoSwipeFiltersMap} T\r\n * @param {T} name\r\n * @param {PhotoSwipeFiltersMap[T]} fn\r\n * @param {number} priority\r\n */\n\n\n addFilter(name, fn, priority = 100) {\n var _this$_filters$name, _this$_filters$name2, _this$pswp;\n\n if (!this._filters[name]) {\n this._filters[name] = [];\n }\n\n (_this$_filters$name = this._filters[name]) === null || _this$_filters$name === void 0 || _this$_filters$name.push({\n fn,\n priority\n });\n (_this$_filters$name2 = this._filters[name]) === null || _this$_filters$name2 === void 0 || _this$_filters$name2.sort((f1, f2) => f1.priority - f2.priority);\n (_this$pswp = this.pswp) === null || _this$pswp === void 0 || _this$pswp.addFilter(name, fn, priority);\n }\n /**\r\n * @template {keyof PhotoSwipeFiltersMap} T\r\n * @param {T} name\r\n * @param {PhotoSwipeFiltersMap[T]} fn\r\n */\n\n\n removeFilter(name, fn) {\n if (this._filters[name]) {\n // @ts-expect-error\n this._filters[name] = this._filters[name].filter(filter => filter.fn !== fn);\n }\n\n if (this.pswp) {\n this.pswp.removeFilter(name, fn);\n }\n }\n /**\r\n * @template {keyof PhotoSwipeFiltersMap} T\r\n * @param {T} name\r\n * @param {Parameters<PhotoSwipeFiltersMap[T]>} args\r\n * @returns {Parameters<PhotoSwipeFiltersMap[T]>[0]}\r\n */\n\n\n applyFilters(name, ...args) {\n var _this$_filters$name3;\n\n (_this$_filters$name3 = this._filters[name]) === null || _this$_filters$name3 === void 0 || _this$_filters$name3.forEach(filter => {\n // @ts-expect-error\n args[0] = filter.fn.apply(this, args);\n });\n return args[0];\n }\n /**\r\n * @template {keyof PhotoSwipeEventsMap} T\r\n * @param {T} name\r\n * @param {EventCallback<T>} fn\r\n */\n\n\n on(name, fn) {\n var _this$_listeners$name, _this$pswp2;\n\n if (!this._listeners[name]) {\n this._listeners[name] = [];\n }\n\n (_this$_listeners$name = this._listeners[name]) === null || _this$_listeners$name === void 0 || _this$_listeners$name.push(fn); // When binding events to lightbox,\n // also bind events to PhotoSwipe Core,\n // if it's open.\n\n (_this$pswp2 = this.pswp) === null || _this$pswp2 === void 0 || _this$pswp2.on(name, fn);\n }\n /**\r\n * @template {keyof PhotoSwipeEventsMap} T\r\n * @param {T} name\r\n * @param {EventCallback<T>} fn\r\n */\n\n\n off(name, fn) {\n var _this$pswp3;\n\n if (this._listeners[name]) {\n // @ts-expect-error\n this._listeners[name] = this._listeners[name].filter(listener => fn !== listener);\n }\n\n (_this$pswp3 = this.pswp) === null || _this$pswp3 === void 0 || _this$pswp3.off(name, fn);\n }\n /**\r\n * @template {keyof PhotoSwipeEventsMap} T\r\n * @param {T} name\r\n * @param {PhotoSwipeEventsMap[T]} [details]\r\n * @returns {AugmentedEvent<T>}\r\n */\n\n\n dispatch(name, details) {\n var _this$_listeners$name2;\n\n if (this.pswp) {\n return this.pswp.dispatch(name, details);\n }\n\n const event =\n /** @type {AugmentedEvent<T>} */\n new PhotoSwipeEvent(name, details);\n (_this$_listeners$name2 = this._listeners[name]) === null || _this$_listeners$name2 === void 0 || _this$_listeners$name2.forEach(listener => {\n listener.call(this, event);\n });\n return event;\n }\n\n}\n\nclass Placeholder {\n /**\r\n * @param {string | false} imageSrc\r\n * @param {HTMLElement} container\r\n */\n constructor(imageSrc, container) {\n // Create placeholder\n // (stretched thumbnail or simple div behind the main image)\n\n /** @type {HTMLImageElement | HTMLDivElement | null} */\n this.element = createElement('pswp__img pswp__img--placeholder', imageSrc ? 'img' : 'div', container);\n\n if (imageSrc) {\n const imgEl =\n /** @type {HTMLImageElement} */\n this.element;\n imgEl.decoding = 'async';\n imgEl.alt = '';\n imgEl.src = imageSrc;\n imgEl.setAttribute('role', 'presentation');\n }\n\n this.element.setAttribute('aria-hidden', 'true');\n }\n /**\r\n * @param {number} width\r\n * @param {number} height\r\n */\n\n\n setDisplayedSize(width, height) {\n if (!this.element) {\n return;\n }\n\n if (this.element.tagName === 'IMG') {\n // Use transform scale() to modify img placeholder size\n // (instead of changing width/height directly).\n // This helps with performance, specifically in iOS15 Safari.\n setWidthHeight(this.element, 250, 'auto');\n this.element.style.transformOrigin = '0 0';\n this.element.style.transform = toTransformString(0, 0, width / 250);\n } else {\n setWidthHeight(this.element, width, height);\n }\n }\n\n destroy() {\n var _this$element;\n\n if ((_this$element = this.element) !== null && _this$element !== void 0 && _this$element.parentNode) {\n this.element.remove();\n }\n\n this.element = null;\n }\n\n}\n\n/** @typedef {import('./slide.js').default} Slide */\n\n/** @typedef {import('./slide.js').SlideData} SlideData */\n\n/** @typedef {import('../core/base.js').default} PhotoSwipeBase */\n\n/** @typedef {import('../util/util.js').LoadState} LoadState */\n\nclass Content {\n /**\r\n * @param {SlideData} itemData Slide data\r\n * @param {PhotoSwipeBase} instance PhotoSwipe or PhotoSwipeLightbox instance\r\n * @param {number} index\r\n */\n constructor(itemData, instance, index) {\n this.instance = instance;\n this.data = itemData;\n this.index = index;\n /** @type {HTMLImageElement | HTMLDivElement | undefined} */\n\n this.element = undefined;\n /** @type {Placeholder | undefined} */\n\n this.placeholder = undefined;\n /** @type {Slide | undefined} */\n\n this.slide = undefined;\n this.displayedImageWidth = 0;\n this.displayedImageHeight = 0;\n this.width = Number(this.data.w) || Number(this.data.width) || 0;\n this.height = Number(this.data.h) || Number(this.data.height) || 0;\n this.isAttached = false;\n this.hasSlide = false;\n this.isDecoding = false;\n /** @type {LoadState} */\n\n this.state = LOAD_STATE.IDLE;\n\n if (this.data.type) {\n this.type = this.data.type;\n } else if (this.data.src) {\n this.type = 'image';\n } else {\n this.type = 'html';\n }\n\n this.instance.dispatch('contentInit', {\n content: this\n });\n }\n\n removePlaceholder() {\n if (this.placeholder && !this.keepPlaceholder()) {\n // With delay, as image might be loaded, but not rendered\n setTimeout(() => {\n if (this.placeholder) {\n this.placeholder.destroy();\n this.placeholder = undefined;\n }\n }, 1000);\n }\n }\n /**\r\n * Preload content\r\n *\r\n * @param {boolean} isLazy\r\n * @param {boolean} [reload]\r\n */\n\n\n load(isLazy, reload) {\n if (this.slide && this.usePlaceholder()) {\n if (!this.placeholder) {\n const placeholderSrc = this.instance.applyFilters('placeholderSrc', // use image-based placeholder only for the first slide,\n // as rendering (even small stretched thumbnail) is an expensive operation\n this.data.msrc && this.slide.isFirstSlide ? this.data.msrc : false, this);\n this.placeholder = new Placeholder(placeholderSrc, this.slide.container);\n } else {\n const placeholderEl = this.placeholder.element; // Add placeholder to DOM if it was already created\n\n if (placeholderEl && !placeholderEl.parentElement) {\n this.slide.container.prepend(placeholderEl);\n }\n }\n }\n\n if (this.element && !reload) {\n return;\n }\n\n if (this.instance.dispatch('contentLoad', {\n content: this,\n isLazy\n }).defaultPrevented) {\n return;\n }\n\n if (this.isImageContent()) {\n this.element = createElement('pswp__img', 'img'); // Start loading only after width is defined, as sizes might depend on it.\n // Due to Safari feature, we must define sizes before srcset.\n\n if (this.displayedImageWidth) {\n this.loadImage(isLazy);\n }\n } else {\n this.element = createElement('pswp__content', 'div');\n this.element.innerHTML = this.data.html || '';\n }\n\n if (reload && this.slide) {\n this.slide.updateContentSize(true);\n }\n }\n /**\r\n * Preload image\r\n *\r\n * @param {boolean} isLazy\r\n */\n\n\n loadImage(isLazy) {\n var _this$data$src, _this$data$alt;\n\n if (!this.isImageContent() || !this.element || this.instance.dispatch('contentLoadImage', {\n content: this,\n isLazy\n }).defaultPrevented) {\n return;\n }\n\n const imageElement =\n /** @type HTMLImageElement */\n this.element;\n this.updateSrcsetSizes();\n\n if (this.data.srcset) {\n imageElement.srcset = this.data.srcset;\n }\n\n imageElement.src = (_this$data$src = this.data.src) !== null && _this$data$src !== void 0 ? _this$data$src : '';\n imageElement.alt = (_this$data$alt = this.data.alt) !== null && _this$data$alt !== void 0 ? _this$data$alt : '';\n this.state = LOAD_STATE.LOADING;\n\n if (imageElement.complete) {\n this.onLoaded();\n } else {\n imageElement.onload = () => {\n this.onLoaded();\n };\n\n imageElement.onerror = () => {\n this.onError();\n };\n }\n }\n /**\r\n * Assign slide to content\r\n *\r\n * @param {Slide} slide\r\n */\n\n\n setSlide(slide) {\n this.slide = slide;\n this.hasSlide = true;\n this.instance = slide.pswp; // todo: do we need to unset slide?\n }\n /**\r\n * Content load success handler\r\n */\n\n\n onLoaded() {\n this.state = LOAD_STATE.LOADED;\n\n if (this.slide && this.element) {\n this.instance.dispatch('loadComplete', {\n slide: this.slide,\n content: this\n }); // if content is reloaded\n\n if (this.slide.isActive && this.slide.heavyAppended && !this.element.parentNode) {\n this.append();\n this.slide.updateContentSize(true);\n }\n\n if (this.state === LOAD_STATE.LOADED || this.state === LOAD_STATE.ERROR) {\n this.removePlaceholder();\n }\n }\n }\n /**\r\n * Content load error handler\r\n */\n\n\n onError() {\n this.state = LOAD_STATE.ERROR;\n\n if (this.slide) {\n this.displayError();\n this.instance.dispatch('loadComplete', {\n slide: this.slide,\n isError: true,\n content: this\n });\n this.instance.dispatch('loadError', {\n slide: this.slide,\n content: this\n });\n }\n }\n /**\r\n * @returns {Boolean} If the content is currently loading\r\n */\n\n\n isLoading() {\n return this.instance.applyFilters('isContentLoading', this.state === LOAD_STATE.LOADING, this);\n }\n /**\r\n * @returns {Boolean} If the content is in error state\r\n */\n\n\n isError() {\n return this.state === LOAD_STATE.ERROR;\n }\n /**\r\n * @returns {boolean} If the content is image\r\n */\n\n\n isImageContent() {\n return this.type === 'image';\n }\n /**\r\n * Update content size\r\n *\r\n * @param {Number} width\r\n * @param {Number} height\r\n */\n\n\n setDisplayedSize(width, height) {\n if (!this.element) {\n return;\n }\n\n if (this.placeholder) {\n this.placeholder.setDisplayedSize(width, height);\n }\n\n if (this.instance.dispatch('contentResize', {\n content: this,\n width,\n height\n }).defaultPrevented) {\n return;\n }\n\n setWidthHeight(this.element, width, height);\n\n if (this.isImageContent() && !this.isError()) {\n const isInitialSizeUpdate = !this.displayedImageWidth && width;\n this.displayedImageWidth = width;\n this.displayedImageHeight = height;\n\n if (isInitialSizeUpdate) {\n this.loadImage(false);\n } else {\n this.updateSrcsetSizes();\n }\n\n if (this.slide) {\n this.instance.dispatch('imageSizeChange', {\n slide: this.slide,\n width,\n height,\n content: this\n });\n }\n }\n }\n /**\r\n * @returns {boolean} If the content can be zoomed\r\n */\n\n\n isZoomable() {\n return this.instance.applyFilters('isContentZoomable', this.isImageContent() && this.state !== LOAD_STATE.ERROR, this);\n }\n /**\r\n * Update image srcset sizes attribute based on width and height\r\n */\n\n\n updateSrcsetSizes() {\n // Handle srcset sizes attribute.\n //\n // Never lower quality, if it was increased previously.\n // Chrome does this automatically, Firefox and Safari do not,\n // so we store largest used size in dataset.\n if (!this.isImageContent() || !this.element || !this.data.srcset) {\n return;\n }\n\n const image =\n /** @type HTMLImageElement */\n this.element;\n const sizesWidth = this.instance.applyFilters('srcsetSizesWidth', this.displayedImageWidth, this);\n\n if (!image.dataset.largestUsedSize || sizesWidth > parseInt(image.dataset.largestUsedSize, 10)) {\n image.sizes = sizesWidth + 'px';\n image.dataset.largestUsedSize = String(sizesWidth);\n }\n }\n /**\r\n * @returns {boolean} If content should use a placeholder (from msrc by default)\r\n */\n\n\n usePlaceholder() {\n return this.instance.applyFilters('useContentPlaceholder', this.isImageContent(), this);\n }\n /**\r\n * Preload content with lazy-loading param\r\n */\n\n\n lazyLoad() {\n if (this.instance.dispatch('contentLazyLoad', {\n content: this\n }).defaultPrevented) {\n return;\n }\n\n this.load(true);\n }\n /**\r\n * @returns {boolean} If placeholder should be kept after content is loaded\r\n */\n\n\n keepPlaceholder() {\n return this.instance.applyFilters('isKeepingPlaceholder', this.isLoading(), this);\n }\n /**\r\n * Destroy the content\r\n */\n\n\n destroy() {\n this.hasSlide = false;\n this.slide = undefined;\n\n if (this.instance.dispatch('contentDestroy', {\n content: this\n }).defaultPrevented) {\n return;\n }\n\n this.remove();\n\n if (this.placeholder) {\n this.placeholder.destroy();\n this.placeholder = undefined;\n }\n\n if (this.isImageContent() && this.element) {\n this.element.onload = null;\n this.element.onerror = null;\n this.element = undefined;\n }\n }\n /**\r\n * Display error message\r\n */\n\n\n displayError() {\n if (this.slide) {\n var _this$instance$option, _this$instance$option2;\n\n let errorMsgEl = createElement('pswp__error-msg', 'div');\n errorMsgEl.innerText = (_this$instance$option = (_this$instance$option2 = this.instance.options) === null || _this$instance$option2 === void 0 ? void 0 : _this$instance$option2.errorMsg) !== null && _this$instance$option !== void 0 ? _this$instance$option : '';\n errorMsgEl =\n /** @type {HTMLDivElement} */\n this.instance.applyFilters('contentErrorElement', errorMsgEl, this);\n this.element = createElement('pswp__content pswp__error-msg-container', 'div');\n this.element.appendChild(errorMsgEl);\n this.slide.container.innerText = '';\n this.slide.container.appendChild(this.element);\n this.slide.updateContentSize(true);\n this.removePlaceholder();\n }\n }\n /**\r\n * Append the content\r\n */\n\n\n append() {\n if (this.isAttached || !this.element) {\n return;\n }\n\n this.isAttached = true;\n\n if (this.state === LOAD_STATE.ERROR) {\n this.displayError();\n return;\n }\n\n if (this.instance.dispatch('contentAppend', {\n content: this\n }).defaultPrevented) {\n return;\n }\n\n const supportsDecode = ('decode' in this.element);\n\n if (this.isImageContent()) {\n // Use decode() on nearby slides\n //\n // Nearby slide images are in DOM and not hidden via display:none.\n // However, they are placed offscreen (to the left and right side).\n //\n // Some browsers do not composite the image until it's actually visible,\n // using decode() helps.\n //\n // You might ask \"why dont you just decode() and then append all images\",\n // that's because I want to show image before it's fully loaded,\n // as browser can render parts of image while it is loading.\n // We do not do this in Safari due to partial loading bug.\n if (supportsDecode && this.slide && (!this.slide.isActive || isSafari())) {\n this.isDecoding = true; // purposefully using finally instead of then,\n // as if srcset sizes changes dynamically - it may cause decode error\n\n /** @type {HTMLImageElement} */\n\n this.element.decode().catch(() => {}).finally(() => {\n this.isDecoding = false;\n this.appendImage();\n });\n } else {\n this.appendImage();\n }\n } else if (this.slide && !this.element.parentNode) {\n this.slide.container.appendChild(this.element);\n }\n }\n /**\r\n * Activate the slide,\r\n * active slide is generally the current one,\r\n * meaning the user can see it.\r\n */\n\n\n activate() {\n if (this.instance.dispatch('contentActivate', {\n content: this\n }).defaultPrevented || !this.slide) {\n return;\n }\n\n if (this.isImageContent() && this.isDecoding && !isSafari()) {\n // add image to slide when it becomes active,\n // even if it's not finished decoding\n this.appendImage();\n } else if (this.isError()) {\n this.load(false, true); // try to reload\n }\n\n if (this.slide.holderElement) {\n this.slide.holderElement.setAttribute('aria-hidden', 'false');\n }\n }\n /**\r\n * Deactivate the content\r\n */\n\n\n deactivate() {\n this.instance.dispatch('contentDeactivate', {\n content: this\n });\n\n if (this.slide && this.slide.holderElement) {\n this.slide.holderElement.setAttribute('aria-hidden', 'true');\n }\n }\n /**\r\n * Remove the content from DOM\r\n */\n\n\n remove() {\n this.isAttached = false;\n\n if (this.instance.dispatch('contentRemove', {\n content: this\n }).defaultPrevented) {\n return;\n }\n\n if (this.element && this.element.parentNode) {\n this.element.remove();\n }\n\n if (this.placeholder && this.placeholder.element) {\n this.placeholder.element.remove();\n }\n }\n /**\r\n * Append the image content to slide container\r\n */\n\n\n appendImage() {\n if (!this.isAttached) {\n return;\n }\n\n if (this.instance.dispatch('contentAppendImage', {\n content: this\n }).defaultPrevented) {\n return;\n } // ensure that element exists and is not already appended\n\n\n if (this.slide && this.element && !this.element.parentNode) {\n this.slide.container.appendChild(this.element);\n }\n\n if (this.state === LOAD_STATE.LOADED || this.state === LOAD_STATE.ERROR) {\n this.removePlaceholder();\n }\n }\n\n}\n\n/** @typedef {import('../photoswipe.js').PhotoSwipeOptions} PhotoSwipeOptions */\n\n/** @typedef {import('../core/base.js').default} PhotoSwipeBase */\n\n/** @typedef {import('../photoswipe.js').Point} Point */\n\n/** @typedef {import('../slide/slide.js').SlideData} SlideData */\n\n/**\r\n * @param {PhotoSwipeOptions} options\r\n * @param {PhotoSwipeBase} pswp\r\n * @returns {Point}\r\n */\nfunction getViewportSize(options, pswp) {\n if (options.getViewportSizeFn) {\n const newViewportSize = options.getViewportSizeFn(options, pswp);\n\n if (newViewportSize) {\n return newViewportSize;\n }\n }\n\n return {\n x: document.documentElement.clientWidth,\n // TODO: height on mobile is very incosistent due to toolbar\n // find a way to improve this\n //\n // document.documentElement.clientHeight - doesn't seem to work well\n y: window.innerHeight\n };\n}\n/**\r\n * Parses padding option.\r\n * Supported formats:\r\n *\r\n * // Object\r\n * padding: {\r\n * top: 0,\r\n * bottom: 0,\r\n * left: 0,\r\n * right: 0\r\n * }\r\n *\r\n * // A function that returns the object\r\n * paddingFn: (viewportSize, itemData, index) => {\r\n * return {\r\n * top: 0,\r\n * bottom: 0,\r\n * left: 0,\r\n * right: 0\r\n * };\r\n * }\r\n *\r\n * // Legacy variant\r\n * paddingLeft: 0,\r\n * paddingRight: 0,\r\n * paddingTop: 0,\r\n * paddingBottom: 0,\r\n *\r\n * @param {'left' | 'top' | 'bottom' | 'right'} prop\r\n * @param {PhotoSwipeOptions} options PhotoSwipe options\r\n * @param {Point} viewportSize PhotoSwipe viewport size, for example: { x:800, y:600 }\r\n * @param {SlideData} itemData Data about the slide\r\n * @param {number} index Slide index\r\n * @returns {number}\r\n */\n\nfunction parsePaddingOption(prop, options, viewportSize, itemData, index) {\n let paddingValue = 0;\n\n if (options.paddingFn) {\n paddingValue = options.paddingFn(viewportSize, itemData, index)[prop];\n } else if (options.padding) {\n paddingValue = options.padding[prop];\n } else {\n const legacyPropName = 'padding' + prop[0].toUpperCase() + prop.slice(1); // @ts-expect-error\n\n if (options[legacyPropName]) {\n // @ts-expect-error\n paddingValue = options[legacyPropName];\n }\n }\n\n return Number(paddingValue) || 0;\n}\n/**\r\n * @param {PhotoSwipeOptions} options\r\n * @param {Point} viewportSize\r\n * @param {SlideData} itemData\r\n * @param {number} index\r\n * @returns {Point}\r\n */\n\nfunction getPanAreaSize(options, viewportSize, itemData, index) {\n return {\n x: viewportSize.x - parsePaddingOption('left', options, viewportSize, itemData, index) - parsePaddingOption('right', options, viewportSize, itemData, index),\n y: viewportSize.y - parsePaddingOption('top', options, viewportSize, itemData, index) - parsePaddingOption('bottom', options, viewportSize, itemData, index)\n };\n}\n\nconst MAX_IMAGE_WIDTH = 4000;\n/** @typedef {import('../photoswipe.js').default} PhotoSwipe */\n\n/** @typedef {import('../photoswipe.js').PhotoSwipeOptions} PhotoSwipeOptions */\n\n/** @typedef {import('../photoswipe.js').Point} Point */\n\n/** @typedef {import('../slide/slide.js').SlideData} SlideData */\n\n/** @typedef {'fit' | 'fill' | number | ((zoomLevelObject: ZoomLevel) => number)} ZoomLevelOption */\n\n/**\r\n * Calculates zoom levels for specific slide.\r\n * Depends on viewport size and image size.\r\n */\n\nclass ZoomLevel {\n /**\r\n * @param {PhotoSwipeOptions} options PhotoSwipe options\r\n * @param {SlideData} itemData Slide data\r\n * @param {number} index Slide index\r\n * @param {PhotoSwipe} [pswp] PhotoSwipe instance, can be undefined if not initialized yet\r\n */\n constructor(options, itemData, index, pswp) {\n this.pswp = pswp;\n this.options = options;\n this.itemData = itemData;\n this.index = index;\n /** @type { Point | null } */\n\n this.panAreaSize = null;\n /** @type { Point | null } */\n\n this.elementSize = null;\n this.fit = 1;\n this.fill = 1;\n this.vFill = 1;\n this.initial = 1;\n this.secondary = 1;\n this.max = 1;\n this.min = 1;\n }\n /**\r\n * Calculate initial, secondary and maximum zoom level for the specified slide.\r\n *\r\n * It should be called when either image or viewport size changes.\r\n *\r\n * @param {number} maxWidth\r\n * @param {number} maxHeight\r\n * @param {Point} panAreaSize\r\n */\n\n\n update(maxWidth, maxHeight, panAreaSize) {\n /** @type {Point} */\n const elementSize = {\n x: maxWidth,\n y: maxHeight\n };\n this.elementSize = elementSize;\n this.panAreaSize = panAreaSize;\n const hRatio = panAreaSize.x / elementSize.x;\n const vRatio = panAreaSize.y / elementSize.y;\n this.fit = Math.min(1, hRatio < vRatio ? hRatio : vRatio);\n this.fill = Math.min(1, hRatio > vRatio ? hRatio : vRatio); // zoom.vFill defines zoom level of the image\n // when it has 100% of viewport vertical space (height)\n\n this.vFill = Math.min(1, vRatio);\n this.initial = this._getInitial();\n this.secondary = this._getSecondary();\n this.max = Math.max(this.initial, this.secondary, this._getMax());\n this.min = Math.min(this.fit, this.initial, this.secondary);\n\n if (this.pswp) {\n this.pswp.dispatch('zoomLevelsUpdate', {\n zoomLevels: this,\n slideData: this.itemData\n });\n }\n }\n /**\r\n * Parses user-defined zoom option.\r\n *\r\n * @private\r\n * @param {'initial' | 'secondary' | 'max'} optionPrefix Zoom level option prefix (initial, secondary, max)\r\n * @returns { number | undefined }\r\n */\n\n\n _parseZoomLevelOption(optionPrefix) {\n const optionName =\n /** @type {'initialZoomLevel' | 'secondaryZoomLevel' | 'maxZoomLevel'} */\n optionPrefix + 'ZoomLevel';\n const optionValue = this.options[optionName];\n\n if (!optionValue) {\n return;\n }\n\n if (typeof optionValue === 'function') {\n return optionValue(this);\n }\n\n if (optionValue === 'fill') {\n return this.fill;\n }\n\n if (optionValue === 'fit') {\n return this.fit;\n }\n\n return Number(optionValue);\n }\n /**\r\n * Get zoom level to which image will be zoomed after double-tap gesture,\r\n * or when user clicks on zoom icon,\r\n * or mouse-click on image itself.\r\n * If you return 1 image will be zoomed to its original size.\r\n *\r\n * @private\r\n * @return {number}\r\n */\n\n\n _getSecondary() {\n let currZoomLevel = this._parseZoomLevelOption('secondary');\n\n if (currZoomLevel) {\n return currZoomLevel;\n } // 3x of \"fit\" state, but not larger than original\n\n\n currZoomLevel = Math.min(1, this.fit * 3);\n\n if (this.elementSize && currZoomLevel * this.elementSize.x > MAX_IMAGE_WIDTH) {\n currZoomLevel = MAX_IMAGE_WIDTH / this.elementSize.x;\n }\n\n return currZoomLevel;\n }\n /**\r\n * Get initial image zoom level.\r\n *\r\n * @private\r\n * @return {number}\r\n */\n\n\n _getInitial() {\n return this._parseZoomLevelOption('initial') || this.fit;\n }\n /**\r\n * Maximum zoom level when user zooms\r\n * via zoom/pinch gesture,\r\n * via cmd/ctrl-wheel or via trackpad.\r\n *\r\n * @private\r\n * @return {number}\r\n */\n\n\n _getMax() {\n // max zoom level is x4 from \"fit state\",\n // used for zoom gesture and ctrl/trackpad zoom\n return this._parseZoomLevelOption('max') || Math.max(1, this.fit * 4);\n }\n\n}\n\n/**\r\n * Lazy-load an image\r\n * This function is used both by Lightbox and PhotoSwipe core,\r\n * thus it can be called before dialog is opened.\r\n *\r\n * @param {SlideData} itemData Data about the slide\r\n * @param {PhotoSwipeBase} instance PhotoSwipe or PhotoSwipeLightbox instance\r\n * @param {number} index\r\n * @returns {Content} Image that is being decoded or false.\r\n */\n\nfunction lazyLoadData(itemData, instance, index) {\n const content = instance.createContentFromData(itemData, index);\n /** @type {ZoomLevel | undefined} */\n\n let zoomLevel;\n const {\n options\n } = instance; // We need to know dimensions of the image to preload it,\n // as it might use srcset, and we need to define sizes\n\n if (options) {\n zoomLevel = new ZoomLevel(options, itemData, -1);\n let viewportSize;\n\n if (instance.pswp) {\n viewportSize = instance.pswp.viewportSize;\n } else {\n viewportSize = getViewportSize(options, instance);\n }\n\n const panAreaSize = getPanAreaSize(options, viewportSize, itemData, index);\n zoomLevel.update(content.width, content.height, panAreaSize);\n }\n\n content.lazyLoad();\n\n if (zoomLevel) {\n content.setDisplayedSize(Math.ceil(content.width * zoomLevel.initial), Math.ceil(content.height * zoomLevel.initial));\n }\n\n return content;\n}\n/**\r\n * Lazy-loads specific slide.\r\n * This function is used both by Lightbox and PhotoSwipe core,\r\n * thus it can be called before dialog is opened.\r\n *\r\n * By default, it loads image based on viewport size and initial zoom level.\r\n *\r\n * @param {number} index Slide index\r\n * @param {PhotoSwipeBase} instance PhotoSwipe or PhotoSwipeLightbox eventable instance\r\n * @returns {Content | undefined}\r\n */\n\nfunction lazyLoadSlide(index, instance) {\n const itemData = instance.getItemData(index);\n\n if (instance.dispatch('lazyLoadSlide', {\n index,\n itemData\n }).defaultPrevented) {\n return;\n }\n\n return lazyLoadData(itemData, instance, index);\n}\n\n/** @typedef {import(\"../photoswipe.js\").default} PhotoSwipe */\n\n/** @typedef {import(\"../slide/slide.js\").SlideData} SlideData */\n\n/**\r\n * PhotoSwipe base class that can retrieve data about every slide.\r\n * Shared by PhotoSwipe Core and PhotoSwipe Lightbox\r\n */\n\nclass PhotoSwipeBase extends Eventable {\n /**\r\n * Get total number of slides\r\n *\r\n * @returns {number}\r\n */\n getNumItems() {\n var _this$options;\n\n let numItems = 0;\n const dataSource = (_this$options = this.options) === null || _this$options === void 0 ? void 0 : _this$options.dataSource;\n\n if (dataSource && 'length' in dataSource) {\n // may be an array or just object with length property\n numItems = dataSource.length;\n } else if (dataSource && 'gallery' in dataSource) {\n // query DOM elements\n if (!dataSource.items) {\n dataSource.items = this._getGalleryDOMElements(dataSource.gallery);\n }\n\n if (dataSource.items) {\n numItems = dataSource.items.length;\n }\n } // legacy event, before filters were introduced\n\n\n const event = this.dispatch('numItems', {\n dataSource,\n numItems\n });\n return this.applyFilters('numItems', event.numItems, dataSource);\n }\n /**\r\n * @param {SlideData} slideData\r\n * @param {number} index\r\n * @returns {Content}\r\n */\n\n\n createContentFromData(slideData, index) {\n return new Content(slideData, this, index);\n }\n /**\r\n * Get item data by index.\r\n *\r\n * \"item data\" should contain normalized information that PhotoSwipe needs to generate a slide.\r\n * For example, it may contain properties like\r\n * `src`, `srcset`, `w`, `h`, which will be used to generate a slide with image.\r\n *\r\n * @param {number} index\r\n * @returns {SlideData}\r\n */\n\n\n getItemData(index) {\n var _this$options2;\n\n const dataSource = (_this$options2 = this.options) === null || _this$options2 === void 0 ? void 0 : _this$options2.dataSource;\n /** @type {SlideData | HTMLElement} */\n\n let dataSourceItem = {};\n\n if (Array.isArray(dataSource)) {\n // Datasource is an array of elements\n dataSourceItem = dataSource[index];\n } else if (dataSource && 'gallery' in dataSource) {\n // dataSource has gallery property,\n // thus it was created by Lightbox, based on\n // gallery and children options\n // query DOM elements\n if (!dataSource.items) {\n dataSource.items = this._getGalleryDOMElements(dataSource.gallery);\n }\n\n dataSourceItem = dataSource.items[index];\n }\n\n let itemData = dataSourceItem;\n\n if (itemData instanceof Element) {\n itemData = this._domElementToItemData(itemData);\n } // Dispatching the itemData event,\n // it's a legacy verion before filters were introduced\n\n\n const event = this.dispatch('itemData', {\n itemData: itemData || {},\n index\n });\n return this.applyFilters('itemData', event.itemData, index);\n }\n /**\r\n * Get array of gallery DOM elements,\r\n * based on childSelector and gallery element.\r\n *\r\n * @param {HTMLElement} galleryElement\r\n * @returns {HTMLElement[]}\r\n */\n\n\n _getGalleryDOMElements(galleryElement) {\n var _this$options3, _this$options4;\n\n if ((_this$options3 = this.options) !== null && _this$options3 !== void 0 && _this$options3.children || (_this$options4 = this.options) !== null && _this$options4 !== void 0 && _this$options4.childSelector) {\n return getElementsFromOption(this.options.children, this.options.childSelector, galleryElement) || [];\n }\n\n return [galleryElement];\n }\n /**\r\n * Converts DOM element to item data object.\r\n *\r\n * @param {HTMLElement} element DOM element\r\n * @returns {SlideData}\r\n */\n\n\n _domElementToItemData(element) {\n /** @type {SlideData} */\n const itemData = {\n element\n };\n const linkEl =\n /** @type {HTMLAnchorElement} */\n element.tagName === 'A' ? element : element.querySelector('a');\n\n if (linkEl) {\n // src comes from data-pswp-src attribute,\n // if it's empty link href is used\n itemData.src = linkEl.dataset.pswpSrc || linkEl.href;\n\n if (linkEl.dataset.pswpSrcset) {\n itemData.srcset = linkEl.dataset.pswpSrcset;\n }\n\n itemData.width = linkEl.dataset.pswpWidth ? parseInt(linkEl.dataset.pswpWidth, 10) : 0;\n itemData.height = linkEl.dataset.pswpHeight ? parseInt(linkEl.dataset.pswpHeight, 10) : 0; // support legacy w & h properties\n\n itemData.w = itemData.width;\n itemData.h = itemData.height;\n\n if (linkEl.dataset.pswpType) {\n itemData.type = linkEl.dataset.pswpType;\n }\n\n const thumbnailEl = element.querySelector('img');\n\n if (thumbnailEl) {\n var _thumbnailEl$getAttri;\n\n // msrc is URL to placeholder image that's displayed before large image is loaded\n // by default it's displayed only for the first slide\n itemData.msrc = thumbnailEl.currentSrc || thumbnailEl.src;\n itemData.alt = (_thumbnailEl$getAttri = thumbnailEl.getAttribute('alt')) !== null && _thumbnailEl$getAttri !== void 0 ? _thumbnailEl$getAttri : '';\n }\n\n if (linkEl.dataset.pswpCropped || linkEl.dataset.cropped) {\n itemData.thumbCropped = true;\n }\n }\n\n return this.applyFilters('domItemData', itemData, element, linkEl);\n }\n /**\r\n * Lazy-load by slide data\r\n *\r\n * @param {SlideData} itemData Data about the slide\r\n * @param {number} index\r\n * @returns {Content} Image that is being decoded or false.\r\n */\n\n\n lazyLoadData(itemData, index) {\n return lazyLoadData(itemData, this, index);\n }\n\n}\n\n/**\r\n * @template T\r\n * @typedef {import('../types.js').Type<T>} Type<T>\r\n */\n\n/** @typedef {import('../photoswipe.js').default} PhotoSwipe */\n\n/** @typedef {import('../photoswipe.js').PhotoSwipeOptions} PhotoSwipeOptions */\n\n/** @typedef {import('../photoswipe.js').DataSource} DataSource */\n\n/** @typedef {import('../photoswipe.js').Point} Point */\n\n/** @typedef {import('../slide/content.js').default} Content */\n\n/** @typedef {import('../core/eventable.js').PhotoSwipeEventsMap} PhotoSwipeEventsMap */\n\n/** @typedef {import('../core/eventable.js').PhotoSwipeFiltersMap} PhotoSwipeFiltersMap */\n\n/**\r\n * @template {keyof PhotoSwipeEventsMap} T\r\n * @typedef {import('../core/eventable.js').EventCallback<T>} EventCallback<T>\r\n */\n\n/**\r\n * PhotoSwipe Lightbox\r\n *\r\n * - If user has unsupported browser it falls back to default browser action (just opens URL)\r\n * - Binds click event to links that should open PhotoSwipe\r\n * - parses DOM strcture for PhotoSwipe (retrieves large image URLs and sizes)\r\n * - Initializes PhotoSwipe\r\n *\r\n *\r\n * Loader options use the same object as PhotoSwipe, and supports such options:\r\n *\r\n * gallery - Element | Element[] | NodeList | string selector for the gallery element\r\n * children - Element | Element[] | NodeList | string selector for the gallery children\r\n *\r\n */\n\nclass PhotoSwipeLightbox extends PhotoSwipeBase {\n /**\r\n * @param {PhotoSwipeOptions} [options]\r\n */\n constructor(options) {\n super();\n /** @type {PhotoSwipeOptions} */\n\n this.options = options || {};\n this._uid = 0;\n this.shouldOpen = false;\n /**\r\n * @private\r\n * @type {Content | undefined}\r\n */\n\n this._preloadedContent = undefined;\n this.onThumbnailsClick = this.onThumbnailsClick.bind(this);\n }\n /**\r\n * Initialize lightbox, should be called only once.\r\n * It's not included in the main constructor, so you may bind events before it.\r\n */\n\n\n init() {\n // Bind click events to each gallery\n getElementsFromOption(this.options.gallery, this.options.gallerySelector).forEach(galleryElement => {\n galleryElement.addEventListener('click', this.onThumbnailsClick, false);\n });\n }\n /**\r\n * @param {MouseEvent} e\r\n */\n\n\n onThumbnailsClick(e) {\n // Exit and allow default browser action if:\n if (specialKeyUsed(e) // ... if clicked with a special key (ctrl/cmd...)\n || window.pswp) {\n // ... if PhotoSwipe is already open\n return;\n } // If both clientX and clientY are 0 or not defined,\n // the event is likely triggered by keyboard,\n // so we do not pass the initialPoint\n //\n // Note that some screen readers emulate the mouse position,\n // so it's not the ideal way to detect them.\n //\n\n /** @type {Point | null} */\n\n\n let initialPoint = {\n x: e.clientX,\n y: e.clientY\n };\n\n if (!initialPoint.x && !initialPoint.y) {\n initialPoint = null;\n }\n\n let clickedIndex = this.getClickedIndex(e);\n clickedIndex = this.applyFilters('clickedIndex', clickedIndex, e, this);\n /** @type {DataSource} */\n\n const dataSource = {\n gallery:\n /** @type {HTMLElement} */\n e.currentTarget\n };\n\n if (clickedIndex >= 0) {\n e.preventDefault();\n this.loadAndOpen(clickedIndex, dataSource, initialPoint);\n }\n }\n /**\r\n * Get index of gallery item that was clicked.\r\n *\r\n * @param {MouseEvent} e click event\r\n * @returns {number}\r\n */\n\n\n getClickedIndex(e) {\n // legacy option\n if (this.options.getClickedIndexFn) {\n return this.options.getClickedIndexFn.call(this, e);\n }\n\n const clickedTarget =\n /** @type {HTMLElement} */\n e.target;\n const childElements = getElementsFromOption(this.options.children, this.options.childSelector,\n /** @type {HTMLElement} */\n e.currentTarget);\n const clickedChildIndex = childElements.findIndex(child => child === clickedTarget || child.contains(clickedTarget));\n\n if (clickedChildIndex !== -1) {\n return clickedChildIndex;\n } else if (this.options.children || this.options.childSelector) {\n // click wasn't on a child element\n return -1;\n } // There is only one item (which is the gallery)\n\n\n return 0;\n }\n /**\r\n * Load and open PhotoSwipe\r\n *\r\n * @param {number} index\r\n * @param {DataSource} [dataSource]\r\n * @param {Point | null} [initialPoint]\r\n * @returns {boolean}\r\n */\n\n\n loadAndOpen(index, dataSource, initialPoint) {\n // Check if the gallery is already open\n if (window.pswp || !this.options) {\n return false;\n } // Use the first gallery element if dataSource is not provided\n\n\n if (!dataSource && this.options.gallery && this.options.children) {\n const galleryElements = getElementsFromOption(this.options.gallery);\n\n if (galleryElements[0]) {\n dataSource = {\n gallery: galleryElements[0]\n };\n }\n } // set initial index\n\n\n this.options.index = index; // define options for PhotoSwipe constructor\n\n this.options.initialPointerPos = initialPoint;\n this.shouldOpen = true;\n this.preload(index, dataSource);\n return true;\n }\n /**\r\n * Load the main module and the slide content by index\r\n *\r\n * @param {number} index\r\n * @param {DataSource} [dataSource]\r\n */\n\n\n preload(index, dataSource) {\n const {\n options\n } = this;\n\n if (dataSource) {\n options.dataSource = dataSource;\n } // Add the main module\n\n /** @type {Promise<Type<PhotoSwipe>>[]} */\n\n\n const promiseArray = [];\n const pswpModuleType = typeof options.pswpModule;\n\n if (isPswpClass(options.pswpModule)) {\n promiseArray.push(Promise.resolve(\n /** @type {Type<PhotoSwipe>} */\n options.pswpModule));\n } else if (pswpModuleType === 'string') {\n throw new Error('pswpModule as string is no longer supported');\n } else if (pswpModuleType === 'function') {\n promiseArray.push(\n /** @type {() => Promise<Type<PhotoSwipe>>} */\n options.pswpModule());\n } else {\n throw new Error('pswpModule is not valid');\n } // Add custom-defined promise, if any\n\n\n if (typeof options.openPromise === 'function') {\n // allow developers to perform some task before opening\n promiseArray.push(options.openPromise());\n }\n\n if (options.preloadFirstSlide !== false && index >= 0) {\n this._preloadedContent = lazyLoadSlide(index, this);\n } // Wait till all promises resolve and open PhotoSwipe\n\n\n const uid = ++this._uid;\n Promise.all(promiseArray).then(iterableModules => {\n if (this.shouldOpen) {\n const mainModule = iterableModules[0];\n\n this._openPhotoswipe(mainModule, uid);\n }\n });\n }\n /**\r\n * @private\r\n * @param {Type<PhotoSwipe> | { default: Type<PhotoSwipe> }} module\r\n * @param {number} uid\r\n */\n\n\n _openPhotoswipe(module, uid) {\n // Cancel opening if UID doesn't match the current one\n // (if user clicked on another gallery item before current was loaded).\n //\n // Or if shouldOpen flag is set to false\n // (developer may modify it via public API)\n if (uid !== this._uid && this.shouldOpen) {\n return;\n }\n\n this.shouldOpen = false; // PhotoSwipe is already open\n\n if (window.pswp) {\n return;\n }\n /**\r\n * Pass data to PhotoSwipe and open init\r\n *\r\n * @type {PhotoSwipe}\r\n */\n\n\n const pswp = typeof module === 'object' ? new module.default(this.options) // eslint-disable-line\n : new module(this.options); // eslint-disable-line\n\n this.pswp = pswp;\n window.pswp = pswp; // map listeners from Lightbox to PhotoSwipe Core\n\n /** @type {(keyof PhotoSwipeEventsMap)[]} */\n\n Object.keys(this._listeners).forEach(name => {\n var _this$_listeners$name;\n\n (_this$_listeners$name = this._listeners[name]) === null || _this$_listeners$name === void 0 || _this$_listeners$name.forEach(fn => {\n pswp.on(name,\n /** @type {EventCallback<typeof name>} */\n fn);\n });\n }); // same with filters\n\n /** @type {(keyof PhotoSwipeFiltersMap)[]} */\n\n Object.keys(this._filters).forEach(name => {\n var _this$_filters$name;\n\n (_this$_filters$name = this._filters[name]) === null || _this$_filters$name === void 0 || _this$_filters$name.forEach(filter => {\n pswp.addFilter(name, filter.fn, filter.priority);\n });\n });\n\n if (this._preloadedContent) {\n pswp.contentLoader.addToCache(this._preloadedContent);\n this._preloadedContent = undefined;\n }\n\n pswp.on('destroy', () => {\n // clean up public variables\n this.pswp = undefined;\n delete window.pswp;\n });\n pswp.init();\n }\n /**\r\n * Unbinds all events, closes PhotoSwipe if it's open.\r\n */\n\n\n destroy() {\n var _this$pswp;\n\n (_this$pswp = this.pswp) === null || _this$pswp === void 0 || _this$pswp.destroy();\n this.shouldOpen = false;\n this._listeners = {};\n getElementsFromOption(this.options.gallery, this.options.gallerySelector).forEach(galleryElement => {\n galleryElement.removeEventListener('click', this.onThumbnailsClick, false);\n });\n }\n\n}\n\nexport { PhotoSwipeLightbox as default };\n//# sourceMappingURL=photoswipe-lightbox.esm.js.map\n","/*!\n * PhotoSwipe 5.4.3 - https://photoswipe.com\n * (c) 2023 Dmytro Semenov\n */\n/** @typedef {import('../photoswipe.js').Point} Point */\n\n/**\r\n * @template {keyof HTMLElementTagNameMap} T\r\n * @param {string} className\r\n * @param {T} tagName\r\n * @param {Node} [appendToEl]\r\n * @returns {HTMLElementTagNameMap[T]}\r\n */\nfunction createElement(className, tagName, appendToEl) {\n const el = document.createElement(tagName);\n\n if (className) {\n el.className = className;\n }\n\n if (appendToEl) {\n appendToEl.appendChild(el);\n }\n\n return el;\n}\n/**\r\n * @param {Point} p1\r\n * @param {Point} p2\r\n * @returns {Point}\r\n */\n\nfunction equalizePoints(p1, p2) {\n p1.x = p2.x;\n p1.y = p2.y;\n\n if (p2.id !== undefined) {\n p1.id = p2.id;\n }\n\n return p1;\n}\n/**\r\n * @param {Point} p\r\n */\n\nfunction roundPoint(p) {\n p.x = Math.round(p.x);\n p.y = Math.round(p.y);\n}\n/**\r\n * Returns distance between two points.\r\n *\r\n * @param {Point} p1\r\n * @param {Point} p2\r\n * @returns {number}\r\n */\n\nfunction getDistanceBetween(p1, p2) {\n const x = Math.abs(p1.x - p2.x);\n const y = Math.abs(p1.y - p2.y);\n return Math.sqrt(x * x + y * y);\n}\n/**\r\n * Whether X and Y positions of points are equal\r\n *\r\n * @param {Point} p1\r\n * @param {Point} p2\r\n * @returns {boolean}\r\n */\n\nfunction pointsEqual(p1, p2) {\n return p1.x === p2.x && p1.y === p2.y;\n}\n/**\r\n * The float result between the min and max values.\r\n *\r\n * @param {number} val\r\n * @param {number} min\r\n * @param {number} max\r\n * @returns {number}\r\n */\n\nfunction clamp(val, min, max) {\n return Math.min(Math.max(val, min), max);\n}\n/**\r\n * Get transform string\r\n *\r\n * @param {number} x\r\n * @param {number} [y]\r\n * @param {number} [scale]\r\n * @returns {string}\r\n */\n\nfunction toTransformString(x, y, scale) {\n let propValue = `translate3d(${x}px,${y || 0}px,0)`;\n\n if (scale !== undefined) {\n propValue += ` scale3d(${scale},${scale},1)`;\n }\n\n return propValue;\n}\n/**\r\n * Apply transform:translate(x, y) scale(scale) to element\r\n *\r\n * @param {HTMLElement} el\r\n * @param {number} x\r\n * @param {number} [y]\r\n * @param {number} [scale]\r\n */\n\nfunction setTransform(el, x, y, scale) {\n el.style.transform = toTransformString(x, y, scale);\n}\nconst defaultCSSEasing = 'cubic-bezier(.4,0,.22,1)';\n/**\r\n * Apply CSS transition to element\r\n *\r\n * @param {HTMLElement} el\r\n * @param {string} [prop] CSS property to animate\r\n * @param {number} [duration] in ms\r\n * @param {string} [ease] CSS easing function\r\n */\n\nfunction setTransitionStyle(el, prop, duration, ease) {\n // inOut: 'cubic-bezier(.4, 0, .22, 1)', // for \"toggle state\" transitions\n // out: 'cubic-bezier(0, 0, .22, 1)', // for \"show\" transitions\n // in: 'cubic-bezier(.4, 0, 1, 1)'// for \"hide\" transitions\n el.style.transition = prop ? `${prop} ${duration}ms ${ease || defaultCSSEasing}` : 'none';\n}\n/**\r\n * Apply width and height CSS properties to element\r\n *\r\n * @param {HTMLElement} el\r\n * @param {string | number} w\r\n * @param {string | number} h\r\n */\n\nfunction setWidthHeight(el, w, h) {\n el.style.width = typeof w === 'number' ? `${w}px` : w;\n el.style.height = typeof h === 'number' ? `${h}px` : h;\n}\n/**\r\n * @param {HTMLElement} el\r\n */\n\nfunction removeTransitionStyle(el) {\n setTransitionStyle(el);\n}\n/**\r\n * @param {HTMLImageElement} img\r\n * @returns {Promise<HTMLImageElement | void>}\r\n */\n\nfunction decodeImage(img) {\n if ('decode' in img) {\n return img.decode().catch(() => {});\n }\n\n if (img.complete) {\n return Promise.resolve(img);\n }\n\n return new Promise((resolve, reject) => {\n img.onload = () => resolve(img);\n\n img.onerror = reject;\n });\n}\n/** @typedef {LOAD_STATE[keyof LOAD_STATE]} LoadState */\n\n/** @type {{ IDLE: 'idle'; LOADING: 'loading'; LOADED: 'loaded'; ERROR: 'error' }} */\n\nconst LOAD_STATE = {\n IDLE: 'idle',\n LOADING: 'loading',\n LOADED: 'loaded',\n ERROR: 'error'\n};\n/**\r\n * Check if click or keydown event was dispatched\r\n * with a special key or via mouse wheel.\r\n *\r\n * @param {MouseEvent | KeyboardEvent} e\r\n * @returns {boolean}\r\n */\n\nfunction specialKeyUsed(e) {\n return 'button' in e && e.button === 1 || e.ctrlKey || e.metaKey || e.altKey || e.shiftKey;\n}\n/**\r\n * Parse `gallery` or `children` options.\r\n *\r\n * @param {import('../photoswipe.js').ElementProvider} [option]\r\n * @param {string} [legacySelector]\r\n * @param {HTMLElement | Document} [parent]\r\n * @returns HTMLElement[]\r\n */\n\nfunction getElementsFromOption(option, legacySelector, parent = document) {\n /** @type {HTMLElement[]} */\n let elements = [];\n\n if (option instanceof Element) {\n elements = [option];\n } else if (option instanceof NodeList || Array.isArray(option)) {\n elements = Array.from(option);\n } else {\n const selector = typeof option === 'string' ? option : legacySelector;\n\n if (selector) {\n elements = Array.from(parent.querySelectorAll(selector));\n }\n }\n\n return elements;\n}\n/**\r\n * Check if browser is Safari\r\n *\r\n * @returns {boolean}\r\n */\n\nfunction isSafari() {\n return !!(navigator.vendor && navigator.vendor.match(/apple/i));\n}\n\n// Detect passive event listener support\nlet supportsPassive = false;\n/* eslint-disable */\n\ntry {\n /* @ts-ignore */\n window.addEventListener('test', null, Object.defineProperty({}, 'passive', {\n get: () => {\n supportsPassive = true;\n }\n }));\n} catch (e) {}\n/* eslint-enable */\n\n/**\r\n * @typedef {Object} PoolItem\r\n * @prop {HTMLElement | Window | Document | undefined | null} target\r\n * @prop {string} type\r\n * @prop {EventListenerOrEventListenerObject} listener\r\n * @prop {boolean} [passive]\r\n */\n\n\nclass DOMEvents {\n constructor() {\n /**\r\n * @type {PoolItem[]}\r\n * @private\r\n */\n this._pool = [];\n }\n /**\r\n * Adds event listeners\r\n *\r\n * @param {PoolItem['target']} target\r\n * @param {PoolItem['type']} type Can be multiple, separated by space.\r\n * @param {PoolItem['listener']} listener\r\n * @param {PoolItem['passive']} [passive]\r\n */\n\n\n add(target, type, listener, passive) {\n this._toggleListener(target, type, listener, passive);\n }\n /**\r\n * Removes event listeners\r\n *\r\n * @param {PoolItem['target']} target\r\n * @param {PoolItem['type']} type\r\n * @param {PoolItem['listener']} listener\r\n * @param {PoolItem['passive']} [passive]\r\n */\n\n\n remove(target, type, listener, passive) {\n this._toggleListener(target, type, listener, passive, true);\n }\n /**\r\n * Removes all bound events\r\n */\n\n\n removeAll() {\n this._pool.forEach(poolItem => {\n this._toggleListener(poolItem.target, poolItem.type, poolItem.listener, poolItem.passive, true, true);\n });\n\n this._pool = [];\n }\n /**\r\n * Adds or removes event\r\n *\r\n * @private\r\n * @param {PoolItem['target']} target\r\n * @param {PoolItem['type']} type\r\n * @param {PoolItem['listener']} listener\r\n * @param {PoolItem['passive']} [passive]\r\n * @param {boolean} [unbind] Whether the event should be added or removed\r\n * @param {boolean} [skipPool] Whether events pool should be skipped\r\n */\n\n\n _toggleListener(target, type, listener, passive, unbind, skipPool) {\n if (!target) {\n return;\n }\n\n const methodName = unbind ? 'removeEventListener' : 'addEventListener';\n const types = type.split(' ');\n types.forEach(eType => {\n if (eType) {\n // Events pool is used to easily unbind all events when PhotoSwipe is closed,\n // so developer doesn't need to do this manually\n if (!skipPool) {\n if (unbind) {\n // Remove from the events pool\n this._pool = this._pool.filter(poolItem => {\n return poolItem.type !== eType || poolItem.listener !== listener || poolItem.target !== target;\n });\n } else {\n // Add to the events pool\n this._pool.push({\n target,\n type: eType,\n listener,\n passive\n });\n }\n } // most PhotoSwipe events call preventDefault,\n // and we do not need browser to scroll the page\n\n\n const eventOptions = supportsPassive ? {\n passive: passive || false\n } : false;\n target[methodName](eType, listener, eventOptions);\n }\n });\n }\n\n}\n\n/** @typedef {import('../photoswipe.js').PhotoSwipeOptions} PhotoSwipeOptions */\n\n/** @typedef {import('../core/base.js').default} PhotoSwipeBase */\n\n/** @typedef {import('../photoswipe.js').Point} Point */\n\n/** @typedef {import('../slide/slide.js').SlideData} SlideData */\n\n/**\r\n * @param {PhotoSwipeOptions} options\r\n * @param {PhotoSwipeBase} pswp\r\n * @returns {Point}\r\n */\nfunction getViewportSize(options, pswp) {\n if (options.getViewportSizeFn) {\n const newViewportSize = options.getViewportSizeFn(options, pswp);\n\n if (newViewportSize) {\n return newViewportSize;\n }\n }\n\n return {\n x: document.documentElement.clientWidth,\n // TODO: height on mobile is very incosistent due to toolbar\n // find a way to improve this\n //\n // document.documentElement.clientHeight - doesn't seem to work well\n y: window.innerHeight\n };\n}\n/**\r\n * Parses padding option.\r\n * Supported formats:\r\n *\r\n * // Object\r\n * padding: {\r\n * top: 0,\r\n * bottom: 0,\r\n * left: 0,\r\n * right: 0\r\n * }\r\n *\r\n * // A function that returns the object\r\n * paddingFn: (viewportSize, itemData, index) => {\r\n * return {\r\n * top: 0,\r\n * bottom: 0,\r\n * left: 0,\r\n * right: 0\r\n * };\r\n * }\r\n *\r\n * // Legacy variant\r\n * paddingLeft: 0,\r\n * paddingRight: 0,\r\n * paddingTop: 0,\r\n * paddingBottom: 0,\r\n *\r\n * @param {'left' | 'top' | 'bottom' | 'right'} prop\r\n * @param {PhotoSwipeOptions} options PhotoSwipe options\r\n * @param {Point} viewportSize PhotoSwipe viewport size, for example: { x:800, y:600 }\r\n * @param {SlideData} itemData Data about the slide\r\n * @param {number} index Slide index\r\n * @returns {number}\r\n */\n\nfunction parsePaddingOption(prop, options, viewportSize, itemData, index) {\n let paddingValue = 0;\n\n if (options.paddingFn) {\n paddingValue = options.paddingFn(viewportSize, itemData, index)[prop];\n } else if (options.padding) {\n paddingValue = options.padding[prop];\n } else {\n const legacyPropName = 'padding' + prop[0].toUpperCase() + prop.slice(1); // @ts-expect-error\n\n if (options[legacyPropName]) {\n // @ts-expect-error\n paddingValue = options[legacyPropName];\n }\n }\n\n return Number(paddingValue) || 0;\n}\n/**\r\n * @param {PhotoSwipeOptions} options\r\n * @param {Point} viewportSize\r\n * @param {SlideData} itemData\r\n * @param {number} index\r\n * @returns {Point}\r\n */\n\nfunction getPanAreaSize(options, viewportSize, itemData, index) {\n return {\n x: viewportSize.x - parsePaddingOption('left', options, viewportSize, itemData, index) - parsePaddingOption('right', options, viewportSize, itemData, index),\n y: viewportSize.y - parsePaddingOption('top', options, viewportSize, itemData, index) - parsePaddingOption('bottom', options, viewportSize, itemData, index)\n };\n}\n\n/** @typedef {import('./slide.js').default} Slide */\n\n/** @typedef {Record<Axis, number>} Point */\n\n/** @typedef {'x' | 'y'} Axis */\n\n/**\r\n * Calculates minimum, maximum and initial (center) bounds of a slide\r\n */\n\nclass PanBounds {\n /**\r\n * @param {Slide} slide\r\n */\n constructor(slide) {\n this.slide = slide;\n this.currZoomLevel = 1;\n this.center =\n /** @type {Point} */\n {\n x: 0,\n y: 0\n };\n this.max =\n /** @type {Point} */\n {\n x: 0,\n y: 0\n };\n this.min =\n /** @type {Point} */\n {\n x: 0,\n y: 0\n };\n }\n /**\r\n * _getItemBounds\r\n *\r\n * @param {number} currZoomLevel\r\n */\n\n\n update(currZoomLevel) {\n this.currZoomLevel = currZoomLevel;\n\n if (!this.slide.width) {\n this.reset();\n } else {\n this._updateAxis('x');\n\n this._updateAxis('y');\n\n this.slide.pswp.dispatch('calcBounds', {\n slide: this.slide\n });\n }\n }\n /**\r\n * _calculateItemBoundsForAxis\r\n *\r\n * @param {Axis} axis\r\n */\n\n\n _updateAxis(axis) {\n const {\n pswp\n } = this.slide;\n const elSize = this.slide[axis === 'x' ? 'width' : 'height'] * this.currZoomLevel;\n const paddingProp = axis === 'x' ? 'left' : 'top';\n const padding = parsePaddingOption(paddingProp, pswp.options, pswp.viewportSize, this.slide.data, this.slide.index);\n const panAreaSize = this.slide.panAreaSize[axis]; // Default position of element.\n // By default, it is center of viewport:\n\n this.center[axis] = Math.round((panAreaSize - elSize) / 2) + padding; // maximum pan position\n\n this.max[axis] = elSize > panAreaSize ? Math.round(panAreaSize - elSize) + padding : this.center[axis]; // minimum pan position\n\n this.min[axis] = elSize > panAreaSize ? padding : this.center[axis];\n } // _getZeroBounds\n\n\n reset() {\n this.center.x = 0;\n this.center.y = 0;\n this.max.x = 0;\n this.max.y = 0;\n this.min.x = 0;\n this.min.y = 0;\n }\n /**\r\n * Correct pan position if it's beyond the bounds\r\n *\r\n * @param {Axis} axis x or y\r\n * @param {number} panOffset\r\n * @returns {number}\r\n */\n\n\n correctPan(axis, panOffset) {\n // checkPanBounds\n return clamp(panOffset, this.max[axis], this.min[axis]);\n }\n\n}\n\nconst MAX_IMAGE_WIDTH = 4000;\n/** @typedef {import('../photoswipe.js').default} PhotoSwipe */\n\n/** @typedef {import('../photoswipe.js').PhotoSwipeOptions} PhotoSwipeOptions */\n\n/** @typedef {import('../photoswipe.js').Point} Point */\n\n/** @typedef {import('../slide/slide.js').SlideData} SlideData */\n\n/** @typedef {'fit' | 'fill' | number | ((zoomLevelObject: ZoomLevel) => number)} ZoomLevelOption */\n\n/**\r\n * Calculates zoom levels for specific slide.\r\n * Depends on viewport size and image size.\r\n */\n\nclass ZoomLevel {\n /**\r\n * @param {PhotoSwipeOptions} options PhotoSwipe options\r\n * @param {SlideData} itemData Slide data\r\n * @param {number} index Slide index\r\n * @param {PhotoSwipe} [pswp] PhotoSwipe instance, can be undefined if not initialized yet\r\n */\n constructor(options, itemData, index, pswp) {\n this.pswp = pswp;\n this.options = options;\n this.itemData = itemData;\n this.index = index;\n /** @type { Point | null } */\n\n this.panAreaSize = null;\n /** @type { Point | null } */\n\n this.elementSize = null;\n this.fit = 1;\n this.fill = 1;\n this.vFill = 1;\n this.initial = 1;\n this.secondary = 1;\n this.max = 1;\n this.min = 1;\n }\n /**\r\n * Calculate initial, secondary and maximum zoom level for the specified slide.\r\n *\r\n * It should be called when either image or viewport size changes.\r\n *\r\n * @param {number} maxWidth\r\n * @param {number} maxHeight\r\n * @param {Point} panAreaSize\r\n */\n\n\n update(maxWidth, maxHeight, panAreaSize) {\n /** @type {Point} */\n const elementSize = {\n x: maxWidth,\n y: maxHeight\n };\n this.elementSize = elementSize;\n this.panAreaSize = panAreaSize;\n const hRatio = panAreaSize.x / elementSize.x;\n const vRatio = panAreaSize.y / elementSize.y;\n this.fit = Math.min(1, hRatio < vRatio ? hRatio : vRatio);\n this.fill = Math.min(1, hRatio > vRatio ? hRatio : vRatio); // zoom.vFill defines zoom level of the image\n // when it has 100% of viewport vertical space (height)\n\n this.vFill = Math.min(1, vRatio);\n this.initial = this._getInitial();\n this.secondary = this._getSecondary();\n this.max = Math.max(this.initial, this.secondary, this._getMax());\n this.min = Math.min(this.fit, this.initial, this.secondary);\n\n if (this.pswp) {\n this.pswp.dispatch('zoomLevelsUpdate', {\n zoomLevels: this,\n slideData: this.itemData\n });\n }\n }\n /**\r\n * Parses user-defined zoom option.\r\n *\r\n * @private\r\n * @param {'initial' | 'secondary' | 'max'} optionPrefix Zoom level option prefix (initial, secondary, max)\r\n * @returns { number | undefined }\r\n */\n\n\n _parseZoomLevelOption(optionPrefix) {\n const optionName =\n /** @type {'initialZoomLevel' | 'secondaryZoomLevel' | 'maxZoomLevel'} */\n optionPrefix + 'ZoomLevel';\n const optionValue = this.options[optionName];\n\n if (!optionValue) {\n return;\n }\n\n if (typeof optionValue === 'function') {\n return optionValue(this);\n }\n\n if (optionValue === 'fill') {\n return this.fill;\n }\n\n if (optionValue === 'fit') {\n return this.fit;\n }\n\n return Number(optionValue);\n }\n /**\r\n * Get zoom level to which image will be zoomed after double-tap gesture,\r\n * or when user clicks on zoom icon,\r\n * or mouse-click on image itself.\r\n * If you return 1 image will be zoomed to its original size.\r\n *\r\n * @private\r\n * @return {number}\r\n */\n\n\n _getSecondary() {\n let currZoomLevel = this._parseZoomLevelOption('secondary');\n\n if (currZoomLevel) {\n return currZoomLevel;\n } // 3x of \"fit\" state, but not larger than original\n\n\n currZoomLevel = Math.min(1, this.fit * 3);\n\n if (this.elementSize && currZoomLevel * this.elementSize.x > MAX_IMAGE_WIDTH) {\n currZoomLevel = MAX_IMAGE_WIDTH / this.elementSize.x;\n }\n\n return currZoomLevel;\n }\n /**\r\n * Get initial image zoom level.\r\n *\r\n * @private\r\n * @return {number}\r\n */\n\n\n _getInitial() {\n return this._parseZoomLevelOption('initial') || this.fit;\n }\n /**\r\n * Maximum zoom level when user zooms\r\n * via zoom/pinch gesture,\r\n * via cmd/ctrl-wheel or via trackpad.\r\n *\r\n * @private\r\n * @return {number}\r\n */\n\n\n _getMax() {\n // max zoom level is x4 from \"fit state\",\n // used for zoom gesture and ctrl/trackpad zoom\n return this._parseZoomLevelOption('max') || Math.max(1, this.fit * 4);\n }\n\n}\n\n/** @typedef {import('../photoswipe.js').default} PhotoSwipe */\n/**\r\n * Renders and allows to control a single slide\r\n */\n\nclass Slide {\n /**\r\n * @param {SlideData} data\r\n * @param {number} index\r\n * @param {PhotoSwipe} pswp\r\n */\n constructor(data, index, pswp) {\n this.data = data;\n this.index = index;\n this.pswp = pswp;\n this.isActive = index === pswp.currIndex;\n this.currentResolution = 0;\n /** @type {Point} */\n\n this.panAreaSize = {\n x: 0,\n y: 0\n };\n /** @type {Point} */\n\n this.pan = {\n x: 0,\n y: 0\n };\n this.isFirstSlide = this.isActive && !pswp.opener.isOpen;\n this.zoomLevels = new ZoomLevel(pswp.options, data, index, pswp);\n this.pswp.dispatch('gettingData', {\n slide: this,\n data: this.data,\n index\n });\n this.content = this.pswp.contentLoader.getContentBySlide(this);\n this.container = createElement('pswp__zoom-wrap', 'div');\n /** @type {HTMLElement | null} */\n\n this.holderElement = null;\n this.currZoomLevel = 1;\n /** @type {number} */\n\n this.width = this.content.width;\n /** @type {number} */\n\n this.height = this.content.height;\n this.heavyAppended = false;\n this.bounds = new PanBounds(this);\n this.prevDisplayedWidth = -1;\n this.prevDisplayedHeight = -1;\n this.pswp.dispatch('slideInit', {\n slide: this\n });\n }\n /**\r\n * If this slide is active/current/visible\r\n *\r\n * @param {boolean} isActive\r\n */\n\n\n setIsActive(isActive) {\n if (isActive && !this.isActive) {\n // slide just became active\n this.activate();\n } else if (!isActive && this.isActive) {\n // slide just became non-active\n this.deactivate();\n }\n }\n /**\r\n * Appends slide content to DOM\r\n *\r\n * @param {HTMLElement} holderElement\r\n */\n\n\n append(holderElement) {\n this.holderElement = holderElement;\n this.container.style.transformOrigin = '0 0'; // Slide appended to DOM\n\n if (!this.data) {\n return;\n }\n\n this.calculateSize();\n this.load();\n this.updateContentSize();\n this.appendHeavy();\n this.holderElement.appendChild(this.container);\n this.zoomAndPanToInitial();\n this.pswp.dispatch('firstZoomPan', {\n slide: this\n });\n this.applyCurrentZoomPan();\n this.pswp.dispatch('afterSetContent', {\n slide: this\n });\n\n if (this.isActive) {\n this.activate();\n }\n }\n\n load() {\n this.content.load(false);\n this.pswp.dispatch('slideLoad', {\n slide: this\n });\n }\n /**\r\n * Append \"heavy\" DOM elements\r\n *\r\n * This may depend on a type of slide,\r\n * but generally these are large images.\r\n */\n\n\n appendHeavy() {\n const {\n pswp\n } = this;\n const appendHeavyNearby = true; // todo\n // Avoid appending heavy elements during animations\n\n if (this.heavyAppended || !pswp.opener.isOpen || pswp.mainScroll.isShifted() || !this.isActive && !appendHeavyNearby) {\n return;\n }\n\n if (this.pswp.dispatch('appendHeavy', {\n slide: this\n }).defaultPrevented) {\n return;\n }\n\n this.heavyAppended = true;\n this.content.append();\n this.pswp.dispatch('appendHeavyContent', {\n slide: this\n });\n }\n /**\r\n * Triggered when this slide is active (selected).\r\n *\r\n * If it's part of opening/closing transition -\r\n * activate() will trigger after the transition is ended.\r\n */\n\n\n activate() {\n this.isActive = true;\n this.appendHeavy();\n this.content.activate();\n this.pswp.dispatch('slideActivate', {\n slide: this\n });\n }\n /**\r\n * Triggered when this slide becomes inactive.\r\n *\r\n * Slide can become inactive only after it was active.\r\n */\n\n\n deactivate() {\n this.isActive = false;\n this.content.deactivate();\n\n if (this.currZoomLevel !== this.zoomLevels.initial) {\n // allow filtering\n this.calculateSize();\n } // reset zoom level\n\n\n this.currentResolution = 0;\n this.zoomAndPanToInitial();\n this.applyCurrentZoomPan();\n this.updateContentSize();\n this.pswp.dispatch('slideDeactivate', {\n slide: this\n });\n }\n /**\r\n * The slide should destroy itself, it will never be used again.\r\n * (unbind all events and destroy internal components)\r\n */\n\n\n destroy() {\n this.content.hasSlide = false;\n this.content.remove();\n this.container.remove();\n this.pswp.dispatch('slideDestroy', {\n slide: this\n });\n }\n\n resize() {\n if (this.currZoomLevel === this.zoomLevels.initial || !this.isActive) {\n // Keep initial zoom level if it was before the resize,\n // as well as when this slide is not active\n // Reset position and scale to original state\n this.calculateSize();\n this.currentResolution = 0;\n this.zoomAndPanToInitial();\n this.applyCurrentZoomPan();\n this.updateContentSize();\n } else {\n // readjust pan position if it's beyond the bounds\n this.calculateSize();\n this.bounds.update(this.currZoomLevel);\n this.panTo(this.pan.x, this.pan.y);\n }\n }\n /**\r\n * Apply size to current slide content,\r\n * based on the current resolution and scale.\r\n *\r\n * @param {boolean} [force] if size should be updated even if dimensions weren't changed\r\n */\n\n\n updateContentSize(force) {\n // Use initial zoom level\n // if resolution is not defined (user didn't zoom yet)\n const scaleMultiplier = this.currentResolution || this.zoomLevels.initial;\n\n if (!scaleMultiplier) {\n return;\n }\n\n const width = Math.round(this.width * scaleMultiplier) || this.pswp.viewportSize.x;\n const height = Math.round(this.height * scaleMultiplier) || this.pswp.viewportSize.y;\n\n if (!this.sizeChanged(width, height) && !force) {\n return;\n }\n\n this.content.setDisplayedSize(width, height);\n }\n /**\r\n * @param {number} width\r\n * @param {number} height\r\n */\n\n\n sizeChanged(width, height) {\n if (width !== this.prevDisplayedWidth || height !== this.prevDisplayedHeight) {\n this.prevDisplayedWidth = width;\n this.prevDisplayedHeight = height;\n return true;\n }\n\n return false;\n }\n /** @returns {HTMLImageElement | HTMLDivElement | null | undefined} */\n\n\n getPlaceholderElement() {\n var _this$content$placeho;\n\n return (_this$content$placeho = this.content.placeholder) === null || _this$content$placeho === void 0 ? void 0 : _this$content$placeho.element;\n }\n /**\r\n * Zoom current slide image to...\r\n *\r\n * @param {number} destZoomLevel Destination zoom level.\r\n * @param {Point} [centerPoint]\r\n * Transform origin center point, or false if viewport center should be used.\r\n * @param {number | false} [transitionDuration] Transition duration, may be set to 0.\r\n * @param {boolean} [ignoreBounds] Minimum and maximum zoom levels will be ignored.\r\n */\n\n\n zoomTo(destZoomLevel, centerPoint, transitionDuration, ignoreBounds) {\n const {\n pswp\n } = this;\n\n if (!this.isZoomable() || pswp.mainScroll.isShifted()) {\n return;\n }\n\n pswp.dispatch('beforeZoomTo', {\n destZoomLevel,\n centerPoint,\n transitionDuration\n }); // stop all pan and zoom transitions\n\n pswp.animations.stopAllPan(); // if (!centerPoint) {\n // centerPoint = pswp.getViewportCenterPoint();\n // }\n\n const prevZoomLevel = this.currZoomLevel;\n\n if (!ignoreBounds) {\n destZoomLevel = clamp(destZoomLevel, this.zoomLevels.min, this.zoomLevels.max);\n } // if (transitionDuration === undefined) {\n // transitionDuration = this.pswp.options.zoomAnimationDuration;\n // }\n\n\n this.setZoomLevel(destZoomLevel);\n this.pan.x = this.calculateZoomToPanOffset('x', centerPoint, prevZoomLevel);\n this.pan.y = this.calculateZoomToPanOffset('y', centerPoint, prevZoomLevel);\n roundPoint(this.pan);\n\n const finishTransition = () => {\n this._setResolution(destZoomLevel);\n\n this.applyCurrentZoomPan();\n };\n\n if (!transitionDuration) {\n finishTransition();\n } else {\n pswp.animations.startTransition({\n isPan: true,\n name: 'zoomTo',\n target: this.container,\n transform: this.getCurrentTransform(),\n onComplete: finishTransition,\n duration: transitionDuration,\n easing: pswp.options.easing\n });\n }\n }\n /**\r\n * @param {Point} [centerPoint]\r\n */\n\n\n toggleZoom(centerPoint) {\n this.zoomTo(this.currZoomLevel === this.zoomLevels.initial ? this.zoomLevels.secondary : this.zoomLevels.initial, centerPoint, this.pswp.options.zoomAnimationDuration);\n }\n /**\r\n * Updates zoom level property and recalculates new pan bounds,\r\n * unlike zoomTo it does not apply transform (use applyCurrentZoomPan)\r\n *\r\n * @param {number} currZoomLevel\r\n */\n\n\n setZoomLevel(currZoomLevel) {\n this.currZoomLevel = currZoomLevel;\n this.bounds.update(this.currZoomLevel);\n }\n /**\r\n * Get pan position after zoom at a given `point`.\r\n *\r\n * Always call setZoomLevel(newZoomLevel) beforehand to recalculate\r\n * pan bounds according to the new zoom level.\r\n *\r\n * @param {'x' | 'y'} axis\r\n * @param {Point} [point]\r\n * point based on which zoom is performed, usually refers to the current mouse position,\r\n * if false - viewport center will be used.\r\n * @param {number} [prevZoomLevel] Zoom level before new zoom was applied.\r\n * @returns {number}\r\n */\n\n\n calculateZoomToPanOffset(axis, point, prevZoomLevel) {\n const totalPanDistance = this.bounds.max[axis] - this.bounds.min[axis];\n\n if (totalPanDistance === 0) {\n return this.bounds.center[axis];\n }\n\n if (!point) {\n point = this.pswp.getViewportCenterPoint();\n }\n\n if (!prevZoomLevel) {\n prevZoomLevel = this.zoomLevels.initial;\n }\n\n const zoomFactor = this.currZoomLevel / prevZoomLevel;\n return this.bounds.correctPan(axis, (this.pan[axis] - point[axis]) * zoomFactor + point[axis]);\n }\n /**\r\n * Apply pan and keep it within bounds.\r\n *\r\n * @param {number} panX\r\n * @param {number} panY\r\n */\n\n\n panTo(panX, panY) {\n this.pan.x = this.bounds.correctPan('x', panX);\n this.pan.y = this.bounds.correctPan('y', panY);\n this.applyCurrentZoomPan();\n }\n /**\r\n * If the slide in the current state can be panned by the user\r\n * @returns {boolean}\r\n */\n\n\n isPannable() {\n return Boolean(this.width) && this.currZoomLevel > this.zoomLevels.fit;\n }\n /**\r\n * If the slide can be zoomed\r\n * @returns {boolean}\r\n */\n\n\n isZoomable() {\n return Boolean(this.width) && this.content.isZoomable();\n }\n /**\r\n * Apply transform and scale based on\r\n * the current pan position (this.pan) and zoom level (this.currZoomLevel)\r\n */\n\n\n applyCurrentZoomPan() {\n this._applyZoomTransform(this.pan.x, this.pan.y, this.currZoomLevel);\n\n if (this === this.pswp.currSlide) {\n this.pswp.dispatch('zoomPanUpdate', {\n slide: this\n });\n }\n }\n\n zoomAndPanToInitial() {\n this.currZoomLevel = this.zoomLevels.initial; // pan according to the zoom level\n\n this.bounds.update(this.currZoomLevel);\n equalizePoints(this.pan, this.bounds.center);\n this.pswp.dispatch('initialZoomPan', {\n slide: this\n });\n }\n /**\r\n * Set translate and scale based on current resolution\r\n *\r\n * @param {number} x\r\n * @param {number} y\r\n * @param {number} zoom\r\n * @private\r\n */\n\n\n _applyZoomTransform(x, y, zoom) {\n zoom /= this.currentResolution || this.zoomLevels.initial;\n setTransform(this.container, x, y, zoom);\n }\n\n calculateSize() {\n const {\n pswp\n } = this;\n equalizePoints(this.panAreaSize, getPanAreaSize(pswp.options, pswp.viewportSize, this.data, this.index));\n this.zoomLevels.update(this.width, this.height, this.panAreaSize);\n pswp.dispatch('calcSlideSize', {\n slide: this\n });\n }\n /** @returns {string} */\n\n\n getCurrentTransform() {\n const scale = this.currZoomLevel / (this.currentResolution || this.zoomLevels.initial);\n return toTransformString(this.pan.x, this.pan.y, scale);\n }\n /**\r\n * Set resolution and re-render the image.\r\n *\r\n * For example, if the real image size is 2000x1500,\r\n * and resolution is 0.5 - it will be rendered as 1000x750.\r\n *\r\n * Image with zoom level 2 and resolution 0.5 is\r\n * the same as image with zoom level 1 and resolution 1.\r\n *\r\n * Used to optimize animations and make\r\n * sure that browser renders image in the highest quality.\r\n * Also used by responsive images to load the correct one.\r\n *\r\n * @param {number} newResolution\r\n */\n\n\n _setResolution(newResolution) {\n if (newResolution === this.currentResolution) {\n return;\n }\n\n this.currentResolution = newResolution;\n this.updateContentSize();\n this.pswp.dispatch('resolutionChanged');\n }\n\n}\n\n/** @typedef {import('../photoswipe.js').Point} Point */\n\n/** @typedef {import('./gestures.js').default} Gestures */\n\nconst PAN_END_FRICTION = 0.35;\nconst VERTICAL_DRAG_FRICTION = 0.6; // 1 corresponds to the third of viewport height\n\nconst MIN_RATIO_TO_CLOSE = 0.4; // Minimum speed required to navigate\n// to next or previous slide\n\nconst MIN_NEXT_SLIDE_SPEED = 0.5;\n/**\r\n * @param {number} initialVelocity\r\n * @param {number} decelerationRate\r\n * @returns {number}\r\n */\n\nfunction project(initialVelocity, decelerationRate) {\n return initialVelocity * decelerationRate / (1 - decelerationRate);\n}\n/**\r\n * Handles single pointer dragging\r\n */\n\n\nclass DragHandler {\n /**\r\n * @param {Gestures} gestures\r\n */\n constructor(gestures) {\n this.gestures = gestures;\n this.pswp = gestures.pswp;\n /** @type {Point} */\n\n this.startPan = {\n x: 0,\n y: 0\n };\n }\n\n start() {\n if (this.pswp.currSlide) {\n equalizePoints(this.startPan, this.pswp.currSlide.pan);\n }\n\n this.pswp.animations.stopAll();\n }\n\n change() {\n const {\n p1,\n prevP1,\n dragAxis\n } = this.gestures;\n const {\n currSlide\n } = this.pswp;\n\n if (dragAxis === 'y' && this.pswp.options.closeOnVerticalDrag && currSlide && currSlide.currZoomLevel <= currSlide.zoomLevels.fit && !this.gestures.isMultitouch) {\n // Handle vertical drag to close\n const panY = currSlide.pan.y + (p1.y - prevP1.y);\n\n if (!this.pswp.dispatch('verticalDrag', {\n panY\n }).defaultPrevented) {\n this._setPanWithFriction('y', panY, VERTICAL_DRAG_FRICTION);\n\n const bgOpacity = 1 - Math.abs(this._getVerticalDragRatio(currSlide.pan.y));\n this.pswp.applyBgOpacity(bgOpacity);\n currSlide.applyCurrentZoomPan();\n }\n } else {\n const mainScrollChanged = this._panOrMoveMainScroll('x');\n\n if (!mainScrollChanged) {\n this._panOrMoveMainScroll('y');\n\n if (currSlide) {\n roundPoint(currSlide.pan);\n currSlide.applyCurrentZoomPan();\n }\n }\n }\n }\n\n end() {\n const {\n velocity\n } = this.gestures;\n const {\n mainScroll,\n currSlide\n } = this.pswp;\n let indexDiff = 0;\n this.pswp.animations.stopAll(); // Handle main scroll if it's shifted\n\n if (mainScroll.isShifted()) {\n // Position of the main scroll relative to the viewport\n const mainScrollShiftDiff = mainScroll.x - mainScroll.getCurrSlideX(); // Ratio between 0 and 1:\n // 0 - slide is not visible at all,\n // 0.5 - half of the slide is visible\n // 1 - slide is fully visible\n\n const currentSlideVisibilityRatio = mainScrollShiftDiff / this.pswp.viewportSize.x; // Go next slide.\n //\n // - if velocity and its direction is matched,\n // and we see at least tiny part of the next slide\n //\n // - or if we see less than 50% of the current slide\n // and velocity is close to 0\n //\n\n if (velocity.x < -MIN_NEXT_SLIDE_SPEED && currentSlideVisibilityRatio < 0 || velocity.x < 0.1 && currentSlideVisibilityRatio < -0.5) {\n // Go to next slide\n indexDiff = 1;\n velocity.x = Math.min(velocity.x, 0);\n } else if (velocity.x > MIN_NEXT_SLIDE_SPEED && currentSlideVisibilityRatio > 0 || velocity.x > -0.1 && currentSlideVisibilityRatio > 0.5) {\n // Go to prev slide\n indexDiff = -1;\n velocity.x = Math.max(velocity.x, 0);\n }\n\n mainScroll.moveIndexBy(indexDiff, true, velocity.x);\n } // Restore zoom level\n\n\n if (currSlide && currSlide.currZoomLevel > currSlide.zoomLevels.max || this.gestures.isMultitouch) {\n this.gestures.zoomLevels.correctZoomPan(true);\n } else {\n // we run two animations instead of one,\n // as each axis has own pan boundaries and thus different spring function\n // (correctZoomPan does not have this functionality,\n // it animates all properties with single timing function)\n this._finishPanGestureForAxis('x');\n\n this._finishPanGestureForAxis('y');\n }\n }\n /**\r\n * @private\r\n * @param {'x' | 'y'} axis\r\n */\n\n\n _finishPanGestureForAxis(axis) {\n const {\n velocity\n } = this.gestures;\n const {\n currSlide\n } = this.pswp;\n\n if (!currSlide) {\n return;\n }\n\n const {\n pan,\n bounds\n } = currSlide;\n const panPos = pan[axis];\n const restoreBgOpacity = this.pswp.bgOpacity < 1 && axis === 'y'; // 0.995 means - scroll view loses 0.5% of its velocity per millisecond\n // Increasing this number will reduce travel distance\n\n const decelerationRate = 0.995; // 0.99\n // Pan position if there is no bounds\n\n const projectedPosition = panPos + project(velocity[axis], decelerationRate);\n\n if (restoreBgOpacity) {\n const vDragRatio = this._getVerticalDragRatio(panPos);\n\n const projectedVDragRatio = this._getVerticalDragRatio(projectedPosition); // If we are above and moving upwards,\n // or if we are below and moving downwards\n\n\n if (vDragRatio < 0 && projectedVDragRatio < -MIN_RATIO_TO_CLOSE || vDragRatio > 0 && projectedVDragRatio > MIN_RATIO_TO_CLOSE) {\n this.pswp.close();\n return;\n }\n } // Pan position with corrected bounds\n\n\n const correctedPanPosition = bounds.correctPan(axis, projectedPosition); // Exit if pan position should not be changed\n // or if speed it too low\n\n if (panPos === correctedPanPosition) {\n return;\n } // Overshoot if the final position is out of pan bounds\n\n\n const dampingRatio = correctedPanPosition === projectedPosition ? 1 : 0.82;\n const initialBgOpacity = this.pswp.bgOpacity;\n const totalPanDist = correctedPanPosition - panPos;\n this.pswp.animations.startSpring({\n name: 'panGesture' + axis,\n isPan: true,\n start: panPos,\n end: correctedPanPosition,\n velocity: velocity[axis],\n dampingRatio,\n onUpdate: pos => {\n // Animate opacity of background relative to Y pan position of an image\n if (restoreBgOpacity && this.pswp.bgOpacity < 1) {\n // 0 - start of animation, 1 - end of animation\n const animationProgressRatio = 1 - (correctedPanPosition - pos) / totalPanDist; // We clamp opacity to keep it between 0 and 1.\n // As progress ratio can be larger than 1 due to overshoot,\n // and we do not want to bounce opacity.\n\n this.pswp.applyBgOpacity(clamp(initialBgOpacity + (1 - initialBgOpacity) * animationProgressRatio, 0, 1));\n }\n\n pan[axis] = Math.floor(pos);\n currSlide.applyCurrentZoomPan();\n }\n });\n }\n /**\r\n * Update position of the main scroll,\r\n * or/and update pan position of the current slide.\r\n *\r\n * Should return true if it changes (or can change) main scroll.\r\n *\r\n * @private\r\n * @param {'x' | 'y'} axis\r\n * @returns {boolean}\r\n */\n\n\n _panOrMoveMainScroll(axis) {\n const {\n p1,\n dragAxis,\n prevP1,\n isMultitouch\n } = this.gestures;\n const {\n currSlide,\n mainScroll\n } = this.pswp;\n const delta = p1[axis] - prevP1[axis];\n const newMainScrollX = mainScroll.x + delta;\n\n if (!delta || !currSlide) {\n return false;\n } // Always move main scroll if image can not be panned\n\n\n if (axis === 'x' && !currSlide.isPannable() && !isMultitouch) {\n mainScroll.moveTo(newMainScrollX, true);\n return true; // changed main scroll\n }\n\n const {\n bounds\n } = currSlide;\n const newPan = currSlide.pan[axis] + delta;\n\n if (this.pswp.options.allowPanToNext && dragAxis === 'x' && axis === 'x' && !isMultitouch) {\n const currSlideMainScrollX = mainScroll.getCurrSlideX(); // Position of the main scroll relative to the viewport\n\n const mainScrollShiftDiff = mainScroll.x - currSlideMainScrollX;\n const isLeftToRight = delta > 0;\n const isRightToLeft = !isLeftToRight;\n\n if (newPan > bounds.min[axis] && isLeftToRight) {\n // Panning from left to right, beyond the left edge\n // Wether the image was at minimum pan position (or less)\n // when this drag gesture started.\n // Minimum pan position refers to the left edge of the image.\n const wasAtMinPanPosition = bounds.min[axis] <= this.startPan[axis];\n\n if (wasAtMinPanPosition) {\n mainScroll.moveTo(newMainScrollX, true);\n return true;\n } else {\n this._setPanWithFriction(axis, newPan); //currSlide.pan[axis] = newPan;\n\n }\n } else if (newPan < bounds.max[axis] && isRightToLeft) {\n // Paning from right to left, beyond the right edge\n // Maximum pan position refers to the right edge of the image.\n const wasAtMaxPanPosition = this.startPan[axis] <= bounds.max[axis];\n\n if (wasAtMaxPanPosition) {\n mainScroll.moveTo(newMainScrollX, true);\n return true;\n } else {\n this._setPanWithFriction(axis, newPan); //currSlide.pan[axis] = newPan;\n\n }\n } else {\n // If main scroll is shifted\n if (mainScrollShiftDiff !== 0) {\n // If main scroll is shifted right\n if (mainScrollShiftDiff > 0\n /*&& isRightToLeft*/\n ) {\n mainScroll.moveTo(Math.max(newMainScrollX, currSlideMainScrollX), true);\n return true;\n } else if (mainScrollShiftDiff < 0\n /*&& isLeftToRight*/\n ) {\n // Main scroll is shifted left (Position is less than 0 comparing to the viewport 0)\n mainScroll.moveTo(Math.min(newMainScrollX, currSlideMainScrollX), true);\n return true;\n }\n } else {\n // We are within pan bounds, so just pan\n this._setPanWithFriction(axis, newPan);\n }\n }\n } else {\n if (axis === 'y') {\n // Do not pan vertically if main scroll is shifted o\n if (!mainScroll.isShifted() && bounds.min.y !== bounds.max.y) {\n this._setPanWithFriction(axis, newPan);\n }\n } else {\n this._setPanWithFriction(axis, newPan);\n }\n }\n\n return false;\n } // If we move above - the ratio is negative\n // If we move below the ratio is positive\n\n /**\r\n * Relation between pan Y position and third of viewport height.\r\n *\r\n * When we are at initial position (center bounds) - the ratio is 0,\r\n * if position is shifted upwards - the ratio is negative,\r\n * if position is shifted downwards - the ratio is positive.\r\n *\r\n * @private\r\n * @param {number} panY The current pan Y position.\r\n * @returns {number}\r\n */\n\n\n _getVerticalDragRatio(panY) {\n var _this$pswp$currSlide$, _this$pswp$currSlide;\n\n return (panY - ((_this$pswp$currSlide$ = (_this$pswp$currSlide = this.pswp.currSlide) === null || _this$pswp$currSlide === void 0 ? void 0 : _this$pswp$currSlide.bounds.center.y) !== null && _this$pswp$currSlide$ !== void 0 ? _this$pswp$currSlide$ : 0)) / (this.pswp.viewportSize.y / 3);\n }\n /**\r\n * Set pan position of the current slide.\r\n * Apply friction if the position is beyond the pan bounds,\r\n * or if custom friction is defined.\r\n *\r\n * @private\r\n * @param {'x' | 'y'} axis\r\n * @param {number} potentialPan\r\n * @param {number} [customFriction] (0.1 - 1)\r\n */\n\n\n _setPanWithFriction(axis, potentialPan, customFriction) {\n const {\n currSlide\n } = this.pswp;\n\n if (!currSlide) {\n return;\n }\n\n const {\n pan,\n bounds\n } = currSlide;\n const correctedPan = bounds.correctPan(axis, potentialPan); // If we are out of pan bounds\n\n if (correctedPan !== potentialPan || customFriction) {\n const delta = Math.round(potentialPan - pan[axis]);\n pan[axis] += delta * (customFriction || PAN_END_FRICTION);\n } else {\n pan[axis] = potentialPan;\n }\n }\n\n}\n\n/** @typedef {import('../photoswipe.js').Point} Point */\n\n/** @typedef {import('./gestures.js').default} Gestures */\n\nconst UPPER_ZOOM_FRICTION = 0.05;\nconst LOWER_ZOOM_FRICTION = 0.15;\n/**\r\n * Get center point between two points\r\n *\r\n * @param {Point} p\r\n * @param {Point} p1\r\n * @param {Point} p2\r\n * @returns {Point}\r\n */\n\nfunction getZoomPointsCenter(p, p1, p2) {\n p.x = (p1.x + p2.x) / 2;\n p.y = (p1.y + p2.y) / 2;\n return p;\n}\n\nclass ZoomHandler {\n /**\r\n * @param {Gestures} gestures\r\n */\n constructor(gestures) {\n this.gestures = gestures;\n /**\r\n * @private\r\n * @type {Point}\r\n */\n\n this._startPan = {\n x: 0,\n y: 0\n };\n /**\r\n * @private\r\n * @type {Point}\r\n */\n\n this._startZoomPoint = {\n x: 0,\n y: 0\n };\n /**\r\n * @private\r\n * @type {Point}\r\n */\n\n this._zoomPoint = {\n x: 0,\n y: 0\n };\n /** @private */\n\n this._wasOverFitZoomLevel = false;\n /** @private */\n\n this._startZoomLevel = 1;\n }\n\n start() {\n const {\n currSlide\n } = this.gestures.pswp;\n\n if (currSlide) {\n this._startZoomLevel = currSlide.currZoomLevel;\n equalizePoints(this._startPan, currSlide.pan);\n }\n\n this.gestures.pswp.animations.stopAllPan();\n this._wasOverFitZoomLevel = false;\n }\n\n change() {\n const {\n p1,\n startP1,\n p2,\n startP2,\n pswp\n } = this.gestures;\n const {\n currSlide\n } = pswp;\n\n if (!currSlide) {\n return;\n }\n\n const minZoomLevel = currSlide.zoomLevels.min;\n const maxZoomLevel = currSlide.zoomLevels.max;\n\n if (!currSlide.isZoomable() || pswp.mainScroll.isShifted()) {\n return;\n }\n\n getZoomPointsCenter(this._startZoomPoint, startP1, startP2);\n getZoomPointsCenter(this._zoomPoint, p1, p2);\n\n let currZoomLevel = 1 / getDistanceBetween(startP1, startP2) * getDistanceBetween(p1, p2) * this._startZoomLevel; // slightly over the zoom.fit\n\n\n if (currZoomLevel > currSlide.zoomLevels.initial + currSlide.zoomLevels.initial / 15) {\n this._wasOverFitZoomLevel = true;\n }\n\n if (currZoomLevel < minZoomLevel) {\n if (pswp.options.pinchToClose && !this._wasOverFitZoomLevel && this._startZoomLevel <= currSlide.zoomLevels.initial) {\n // fade out background if zooming out\n const bgOpacity = 1 - (minZoomLevel - currZoomLevel) / (minZoomLevel / 1.2);\n\n if (!pswp.dispatch('pinchClose', {\n bgOpacity\n }).defaultPrevented) {\n pswp.applyBgOpacity(bgOpacity);\n }\n } else {\n // Apply the friction if zoom level is below the min\n currZoomLevel = minZoomLevel - (minZoomLevel - currZoomLevel) * LOWER_ZOOM_FRICTION;\n }\n } else if (currZoomLevel > maxZoomLevel) {\n // Apply the friction if zoom level is above the max\n currZoomLevel = maxZoomLevel + (currZoomLevel - maxZoomLevel) * UPPER_ZOOM_FRICTION;\n }\n\n currSlide.pan.x = this._calculatePanForZoomLevel('x', currZoomLevel);\n currSlide.pan.y = this._calculatePanForZoomLevel('y', currZoomLevel);\n currSlide.setZoomLevel(currZoomLevel);\n currSlide.applyCurrentZoomPan();\n }\n\n end() {\n const {\n pswp\n } = this.gestures;\n const {\n currSlide\n } = pswp;\n\n if ((!currSlide || currSlide.currZoomLevel < currSlide.zoomLevels.initial) && !this._wasOverFitZoomLevel && pswp.options.pinchToClose) {\n pswp.close();\n } else {\n this.correctZoomPan();\n }\n }\n /**\r\n * @private\r\n * @param {'x' | 'y'} axis\r\n * @param {number} currZoomLevel\r\n * @returns {number}\r\n */\n\n\n _calculatePanForZoomLevel(axis, currZoomLevel) {\n const zoomFactor = currZoomLevel / this._startZoomLevel;\n return this._zoomPoint[axis] - (this._startZoomPoint[axis] - this._startPan[axis]) * zoomFactor;\n }\n /**\r\n * Correct currZoomLevel and pan if they are\r\n * beyond minimum or maximum values.\r\n * With animation.\r\n *\r\n * @param {boolean} [ignoreGesture]\r\n * Wether gesture coordinates should be ignored when calculating destination pan position.\r\n */\n\n\n correctZoomPan(ignoreGesture) {\n const {\n pswp\n } = this.gestures;\n const {\n currSlide\n } = pswp;\n\n if (!(currSlide !== null && currSlide !== void 0 && currSlide.isZoomable())) {\n return;\n }\n\n if (this._zoomPoint.x === 0) {\n ignoreGesture = true;\n }\n\n const prevZoomLevel = currSlide.currZoomLevel;\n /** @type {number} */\n\n let destinationZoomLevel;\n let currZoomLevelNeedsChange = true;\n\n if (prevZoomLevel < currSlide.zoomLevels.initial) {\n destinationZoomLevel = currSlide.zoomLevels.initial; // zoom to min\n } else if (prevZoomLevel > currSlide.zoomLevels.max) {\n destinationZoomLevel = currSlide.zoomLevels.max; // zoom to max\n } else {\n currZoomLevelNeedsChange = false;\n destinationZoomLevel = prevZoomLevel;\n }\n\n const initialBgOpacity = pswp.bgOpacity;\n const restoreBgOpacity = pswp.bgOpacity < 1;\n const initialPan = equalizePoints({\n x: 0,\n y: 0\n }, currSlide.pan);\n let destinationPan = equalizePoints({\n x: 0,\n y: 0\n }, initialPan);\n\n if (ignoreGesture) {\n this._zoomPoint.x = 0;\n this._zoomPoint.y = 0;\n this._startZoomPoint.x = 0;\n this._startZoomPoint.y = 0;\n this._startZoomLevel = prevZoomLevel;\n equalizePoints(this._startPan, initialPan);\n }\n\n if (currZoomLevelNeedsChange) {\n destinationPan = {\n x: this._calculatePanForZoomLevel('x', destinationZoomLevel),\n y: this._calculatePanForZoomLevel('y', destinationZoomLevel)\n };\n } // set zoom level, so pan bounds are updated according to it\n\n\n currSlide.setZoomLevel(destinationZoomLevel);\n destinationPan = {\n x: currSlide.bounds.correctPan('x', destinationPan.x),\n y: currSlide.bounds.correctPan('y', destinationPan.y)\n }; // return zoom level and its bounds to initial\n\n currSlide.setZoomLevel(prevZoomLevel);\n const panNeedsChange = !pointsEqual(destinationPan, initialPan);\n\n if (!panNeedsChange && !currZoomLevelNeedsChange && !restoreBgOpacity) {\n // update resolution after gesture\n currSlide._setResolution(destinationZoomLevel);\n\n currSlide.applyCurrentZoomPan(); // nothing to animate\n\n return;\n }\n\n pswp.animations.stopAllPan();\n pswp.animations.startSpring({\n isPan: true,\n start: 0,\n end: 1000,\n velocity: 0,\n dampingRatio: 1,\n naturalFrequency: 40,\n onUpdate: now => {\n now /= 1000; // 0 - start, 1 - end\n\n if (panNeedsChange || currZoomLevelNeedsChange) {\n if (panNeedsChange) {\n currSlide.pan.x = initialPan.x + (destinationPan.x - initialPan.x) * now;\n currSlide.pan.y = initialPan.y + (destinationPan.y - initialPan.y) * now;\n }\n\n if (currZoomLevelNeedsChange) {\n const newZoomLevel = prevZoomLevel + (destinationZoomLevel - prevZoomLevel) * now;\n currSlide.setZoomLevel(newZoomLevel);\n }\n\n currSlide.applyCurrentZoomPan();\n } // Restore background opacity\n\n\n if (restoreBgOpacity && pswp.bgOpacity < 1) {\n // We clamp opacity to keep it between 0 and 1.\n // As progress ratio can be larger than 1 due to overshoot,\n // and we do not want to bounce opacity.\n pswp.applyBgOpacity(clamp(initialBgOpacity + (1 - initialBgOpacity) * now, 0, 1));\n }\n },\n onComplete: () => {\n // update resolution after transition ends\n currSlide._setResolution(destinationZoomLevel);\n\n currSlide.applyCurrentZoomPan();\n }\n });\n }\n\n}\n\n/**\r\n * @template {string} T\r\n * @template {string} P\r\n * @typedef {import('../types.js').AddPostfix<T, P>} AddPostfix<T, P>\r\n */\n\n/** @typedef {import('./gestures.js').default} Gestures */\n\n/** @typedef {import('../photoswipe.js').Point} Point */\n\n/** @typedef {'imageClick' | 'bgClick' | 'tap' | 'doubleTap'} Actions */\n\n/**\r\n * Whether the tap was performed on the main slide\r\n * (rather than controls or caption).\r\n *\r\n * @param {PointerEvent} event\r\n * @returns {boolean}\r\n */\nfunction didTapOnMainContent(event) {\n return !!\n /** @type {HTMLElement} */\n event.target.closest('.pswp__container');\n}\n/**\r\n * Tap, double-tap handler.\r\n */\n\n\nclass TapHandler {\n /**\r\n * @param {Gestures} gestures\r\n */\n constructor(gestures) {\n this.gestures = gestures;\n }\n /**\r\n * @param {Point} point\r\n * @param {PointerEvent} originalEvent\r\n */\n\n\n click(point, originalEvent) {\n const targetClassList =\n /** @type {HTMLElement} */\n originalEvent.target.classList;\n const isImageClick = targetClassList.contains('pswp__img');\n const isBackgroundClick = targetClassList.contains('pswp__item') || targetClassList.contains('pswp__zoom-wrap');\n\n if (isImageClick) {\n this._doClickOrTapAction('imageClick', point, originalEvent);\n } else if (isBackgroundClick) {\n this._doClickOrTapAction('bgClick', point, originalEvent);\n }\n }\n /**\r\n * @param {Point} point\r\n * @param {PointerEvent} originalEvent\r\n */\n\n\n tap(point, originalEvent) {\n if (didTapOnMainContent(originalEvent)) {\n this._doClickOrTapAction('tap', point, originalEvent);\n }\n }\n /**\r\n * @param {Point} point\r\n * @param {PointerEvent} originalEvent\r\n */\n\n\n doubleTap(point, originalEvent) {\n if (didTapOnMainContent(originalEvent)) {\n this._doClickOrTapAction('doubleTap', point, originalEvent);\n }\n }\n /**\r\n * @private\r\n * @param {Actions} actionName\r\n * @param {Point} point\r\n * @param {PointerEvent} originalEvent\r\n */\n\n\n _doClickOrTapAction(actionName, point, originalEvent) {\n var _this$gestures$pswp$e;\n\n const {\n pswp\n } = this.gestures;\n const {\n currSlide\n } = pswp;\n const actionFullName =\n /** @type {AddPostfix<Actions, 'Action'>} */\n actionName + 'Action';\n const optionValue = pswp.options[actionFullName];\n\n if (pswp.dispatch(actionFullName, {\n point,\n originalEvent\n }).defaultPrevented) {\n return;\n }\n\n if (typeof optionValue === 'function') {\n optionValue.call(pswp, point, originalEvent);\n return;\n }\n\n switch (optionValue) {\n case 'close':\n case 'next':\n pswp[optionValue]();\n break;\n\n case 'zoom':\n currSlide === null || currSlide === void 0 || currSlide.toggleZoom(point);\n break;\n\n case 'zoom-or-close':\n // by default click zooms current image,\n // if it can not be zoomed - gallery will be closed\n if (currSlide !== null && currSlide !== void 0 && currSlide.isZoomable() && currSlide.zoomLevels.secondary !== currSlide.zoomLevels.initial) {\n currSlide.toggleZoom(point);\n } else if (pswp.options.clickToCloseNonZoomable) {\n pswp.close();\n }\n\n break;\n\n case 'toggle-controls':\n (_this$gestures$pswp$e = this.gestures.pswp.element) === null || _this$gestures$pswp$e === void 0 || _this$gestures$pswp$e.classList.toggle('pswp--ui-visible'); // if (_controlsVisible) {\n // _ui.hideControls();\n // } else {\n // _ui.showControls();\n // }\n\n break;\n }\n }\n\n}\n\n/** @typedef {import('../photoswipe.js').default} PhotoSwipe */\n\n/** @typedef {import('../photoswipe.js').Point} Point */\n// How far should user should drag\n// until we can determine that the gesture is swipe and its direction\n\nconst AXIS_SWIPE_HYSTERISIS = 10; //const PAN_END_FRICTION = 0.35;\n\nconst DOUBLE_TAP_DELAY = 300; // ms\n\nconst MIN_TAP_DISTANCE = 25; // px\n\n/**\r\n * Gestures class bind touch, pointer or mouse events\r\n * and emits drag to drag-handler and zoom events zoom-handler.\r\n *\r\n * Drag and zoom events are emited in requestAnimationFrame,\r\n * and only when one of pointers was actually changed.\r\n */\n\nclass Gestures {\n /**\r\n * @param {PhotoSwipe} pswp\r\n */\n constructor(pswp) {\n this.pswp = pswp;\n /** @type {'x' | 'y' | null} */\n\n this.dragAxis = null; // point objects are defined once and reused\n // PhotoSwipe keeps track only of two pointers, others are ignored\n\n /** @type {Point} */\n\n this.p1 = {\n x: 0,\n y: 0\n }; // the first pressed pointer\n\n /** @type {Point} */\n\n this.p2 = {\n x: 0,\n y: 0\n }; // the second pressed pointer\n\n /** @type {Point} */\n\n this.prevP1 = {\n x: 0,\n y: 0\n };\n /** @type {Point} */\n\n this.prevP2 = {\n x: 0,\n y: 0\n };\n /** @type {Point} */\n\n this.startP1 = {\n x: 0,\n y: 0\n };\n /** @type {Point} */\n\n this.startP2 = {\n x: 0,\n y: 0\n };\n /** @type {Point} */\n\n this.velocity = {\n x: 0,\n y: 0\n };\n /** @type {Point}\r\n * @private\r\n */\n\n this._lastStartP1 = {\n x: 0,\n y: 0\n };\n /** @type {Point}\r\n * @private\r\n */\n\n this._intervalP1 = {\n x: 0,\n y: 0\n };\n /** @private */\n\n this._numActivePoints = 0;\n /** @type {Point[]}\r\n * @private\r\n */\n\n this._ongoingPointers = [];\n /** @private */\n\n this._touchEventEnabled = 'ontouchstart' in window;\n /** @private */\n\n this._pointerEventEnabled = !!window.PointerEvent;\n this.supportsTouch = this._touchEventEnabled || this._pointerEventEnabled && navigator.maxTouchPoints > 1;\n /** @private */\n\n this._numActivePoints = 0;\n /** @private */\n\n this._intervalTime = 0;\n /** @private */\n\n this._velocityCalculated = false;\n this.isMultitouch = false;\n this.isDragging = false;\n this.isZooming = false;\n /** @type {number | null} */\n\n this.raf = null;\n /** @type {NodeJS.Timeout | null}\r\n * @private\r\n */\n\n this._tapTimer = null;\n\n if (!this.supportsTouch) {\n // disable pan to next slide for non-touch devices\n pswp.options.allowPanToNext = false;\n }\n\n this.drag = new DragHandler(this);\n this.zoomLevels = new ZoomHandler(this);\n this.tapHandler = new TapHandler(this);\n pswp.on('bindEvents', () => {\n pswp.events.add(pswp.scrollWrap, 'click',\n /** @type EventListener */\n this._onClick.bind(this));\n\n if (this._pointerEventEnabled) {\n this._bindEvents('pointer', 'down', 'up', 'cancel');\n } else if (this._touchEventEnabled) {\n this._bindEvents('touch', 'start', 'end', 'cancel'); // In previous versions we also bound mouse event here,\n // in case device supports both touch and mouse events,\n // but newer versions of browsers now support PointerEvent.\n // on iOS10 if you bind touchmove/end after touchstart,\n // and you don't preventDefault touchstart (which PhotoSwipe does),\n // preventDefault will have no effect on touchmove and touchend.\n // Unless you bind it previously.\n\n\n if (pswp.scrollWrap) {\n pswp.scrollWrap.ontouchmove = () => {};\n\n pswp.scrollWrap.ontouchend = () => {};\n }\n } else {\n this._bindEvents('mouse', 'down', 'up');\n }\n });\n }\n /**\r\n * @private\r\n * @param {'mouse' | 'touch' | 'pointer'} pref\r\n * @param {'down' | 'start'} down\r\n * @param {'up' | 'end'} up\r\n * @param {'cancel'} [cancel]\r\n */\n\n\n _bindEvents(pref, down, up, cancel) {\n const {\n pswp\n } = this;\n const {\n events\n } = pswp;\n const cancelEvent = cancel ? pref + cancel : '';\n events.add(pswp.scrollWrap, pref + down,\n /** @type EventListener */\n this.onPointerDown.bind(this));\n events.add(window, pref + 'move',\n /** @type EventListener */\n this.onPointerMove.bind(this));\n events.add(window, pref + up,\n /** @type EventListener */\n this.onPointerUp.bind(this));\n\n if (cancelEvent) {\n events.add(pswp.scrollWrap, cancelEvent,\n /** @type EventListener */\n this.onPointerUp.bind(this));\n }\n }\n /**\r\n * @param {PointerEvent} e\r\n */\n\n\n onPointerDown(e) {\n // We do not call preventDefault for touch events\n // to allow browser to show native dialog on longpress\n // (the one that allows to save image or open it in new tab).\n //\n // Desktop Safari allows to drag images when preventDefault isn't called on mousedown,\n // even though preventDefault IS called on mousemove. That's why we preventDefault mousedown.\n const isMousePointer = e.type === 'mousedown' || e.pointerType === 'mouse'; // Allow dragging only via left mouse button.\n // http://www.quirksmode.org/js/events_properties.html\n // https://developer.mozilla.org/en-US/docs/Web/API/event.button\n\n if (isMousePointer && e.button > 0) {\n return;\n }\n\n const {\n pswp\n } = this; // if PhotoSwipe is opening or closing\n\n if (!pswp.opener.isOpen) {\n e.preventDefault();\n return;\n }\n\n if (pswp.dispatch('pointerDown', {\n originalEvent: e\n }).defaultPrevented) {\n return;\n }\n\n if (isMousePointer) {\n pswp.mouseDetected(); // preventDefault mouse event to prevent\n // browser image drag feature\n\n this._preventPointerEventBehaviour(e, 'down');\n }\n\n pswp.animations.stopAll();\n\n this._updatePoints(e, 'down');\n\n if (this._numActivePoints === 1) {\n this.dragAxis = null; // we need to store initial point to determine the main axis,\n // drag is activated only after the axis is determined\n\n equalizePoints(this.startP1, this.p1);\n }\n\n if (this._numActivePoints > 1) {\n // Tap or double tap should not trigger if more than one pointer\n this._clearTapTimer();\n\n this.isMultitouch = true;\n } else {\n this.isMultitouch = false;\n }\n }\n /**\r\n * @param {PointerEvent} e\r\n */\n\n\n onPointerMove(e) {\n this._preventPointerEventBehaviour(e, 'move');\n\n if (!this._numActivePoints) {\n return;\n }\n\n this._updatePoints(e, 'move');\n\n if (this.pswp.dispatch('pointerMove', {\n originalEvent: e\n }).defaultPrevented) {\n return;\n }\n\n if (this._numActivePoints === 1 && !this.isDragging) {\n if (!this.dragAxis) {\n this._calculateDragDirection();\n } // Drag axis was detected, emit drag.start\n\n\n if (this.dragAxis && !this.isDragging) {\n if (this.isZooming) {\n this.isZooming = false;\n this.zoomLevels.end();\n }\n\n this.isDragging = true;\n\n this._clearTapTimer(); // Tap can not trigger after drag\n // Adjust starting point\n\n\n this._updateStartPoints();\n\n this._intervalTime = Date.now(); //this._startTime = this._intervalTime;\n\n this._velocityCalculated = false;\n equalizePoints(this._intervalP1, this.p1);\n this.velocity.x = 0;\n this.velocity.y = 0;\n this.drag.start();\n\n this._rafStopLoop();\n\n this._rafRenderLoop();\n }\n } else if (this._numActivePoints > 1 && !this.isZooming) {\n this._finishDrag();\n\n this.isZooming = true; // Adjust starting points\n\n this._updateStartPoints();\n\n this.zoomLevels.start();\n\n this._rafStopLoop();\n\n this._rafRenderLoop();\n }\n }\n /**\r\n * @private\r\n */\n\n\n _finishDrag() {\n if (this.isDragging) {\n this.isDragging = false; // Try to calculate velocity,\n // if it wasn't calculated yet in drag.change\n\n if (!this._velocityCalculated) {\n this._updateVelocity(true);\n }\n\n this.drag.end();\n this.dragAxis = null;\n }\n }\n /**\r\n * @param {PointerEvent} e\r\n */\n\n\n onPointerUp(e) {\n if (!this._numActivePoints) {\n return;\n }\n\n this._updatePoints(e, 'up');\n\n if (this.pswp.dispatch('pointerUp', {\n originalEvent: e\n }).defaultPrevented) {\n return;\n }\n\n if (this._numActivePoints === 0) {\n this._rafStopLoop();\n\n if (this.isDragging) {\n this._finishDrag();\n } else if (!this.isZooming && !this.isMultitouch) {\n //this.zoomLevels.correctZoomPan();\n this._finishTap(e);\n }\n }\n\n if (this._numActivePoints < 2 && this.isZooming) {\n this.isZooming = false;\n this.zoomLevels.end();\n\n if (this._numActivePoints === 1) {\n // Since we have 1 point left, we need to reinitiate drag\n this.dragAxis = null;\n\n this._updateStartPoints();\n }\n }\n }\n /**\r\n * @private\r\n */\n\n\n _rafRenderLoop() {\n if (this.isDragging || this.isZooming) {\n this._updateVelocity();\n\n if (this.isDragging) {\n // make sure that pointer moved since the last update\n if (!pointsEqual(this.p1, this.prevP1)) {\n this.drag.change();\n }\n } else\n /* if (this.isZooming) */\n {\n if (!pointsEqual(this.p1, this.prevP1) || !pointsEqual(this.p2, this.prevP2)) {\n this.zoomLevels.change();\n }\n }\n\n this._updatePrevPoints();\n\n this.raf = requestAnimationFrame(this._rafRenderLoop.bind(this));\n }\n }\n /**\r\n * Update velocity at 50ms interval\r\n *\r\n * @private\r\n * @param {boolean} [force]\r\n */\n\n\n _updateVelocity(force) {\n const time = Date.now();\n const duration = time - this._intervalTime;\n\n if (duration < 50 && !force) {\n return;\n }\n\n this.velocity.x = this._getVelocity('x', duration);\n this.velocity.y = this._getVelocity('y', duration);\n this._intervalTime = time;\n equalizePoints(this._intervalP1, this.p1);\n this._velocityCalculated = true;\n }\n /**\r\n * @private\r\n * @param {PointerEvent} e\r\n */\n\n\n _finishTap(e) {\n const {\n mainScroll\n } = this.pswp; // Do not trigger tap events if main scroll is shifted\n\n if (mainScroll.isShifted()) {\n // restore main scroll position\n // (usually happens if stopped in the middle of animation)\n mainScroll.moveIndexBy(0, true);\n return;\n } // Do not trigger tap for touchcancel or pointercancel\n\n\n if (e.type.indexOf('cancel') > 0) {\n return;\n } // Trigger click instead of tap for mouse events\n\n\n if (e.type === 'mouseup' || e.pointerType === 'mouse') {\n this.tapHandler.click(this.startP1, e);\n return;\n } // Disable delay if there is no doubleTapAction\n\n\n const tapDelay = this.pswp.options.doubleTapAction ? DOUBLE_TAP_DELAY : 0; // If tapTimer is defined - we tapped recently,\n // check if the current tap is close to the previous one,\n // if yes - trigger double tap\n\n if (this._tapTimer) {\n this._clearTapTimer(); // Check if two taps were more or less on the same place\n\n\n if (getDistanceBetween(this._lastStartP1, this.startP1) < MIN_TAP_DISTANCE) {\n this.tapHandler.doubleTap(this.startP1, e);\n }\n } else {\n equalizePoints(this._lastStartP1, this.startP1);\n this._tapTimer = setTimeout(() => {\n this.tapHandler.tap(this.startP1, e);\n\n this._clearTapTimer();\n }, tapDelay);\n }\n }\n /**\r\n * @private\r\n */\n\n\n _clearTapTimer() {\n if (this._tapTimer) {\n clearTimeout(this._tapTimer);\n this._tapTimer = null;\n }\n }\n /**\r\n * Get velocity for axis\r\n *\r\n * @private\r\n * @param {'x' | 'y'} axis\r\n * @param {number} duration\r\n * @returns {number}\r\n */\n\n\n _getVelocity(axis, duration) {\n // displacement is like distance, but can be negative.\n const displacement = this.p1[axis] - this._intervalP1[axis];\n\n if (Math.abs(displacement) > 1 && duration > 5) {\n return displacement / duration;\n }\n\n return 0;\n }\n /**\r\n * @private\r\n */\n\n\n _rafStopLoop() {\n if (this.raf) {\n cancelAnimationFrame(this.raf);\n this.raf = null;\n }\n }\n /**\r\n * @private\r\n * @param {PointerEvent} e\r\n * @param {'up' | 'down' | 'move'} pointerType Normalized pointer type\r\n */\n\n\n _preventPointerEventBehaviour(e, pointerType) {\n const preventPointerEvent = this.pswp.applyFilters('preventPointerEvent', true, e, pointerType);\n\n if (preventPointerEvent) {\n e.preventDefault();\n }\n }\n /**\r\n * Parses and normalizes points from the touch, mouse or pointer event.\r\n * Updates p1 and p2.\r\n *\r\n * @private\r\n * @param {PointerEvent | TouchEvent} e\r\n * @param {'up' | 'down' | 'move'} pointerType Normalized pointer type\r\n */\n\n\n _updatePoints(e, pointerType) {\n if (this._pointerEventEnabled) {\n const pointerEvent =\n /** @type {PointerEvent} */\n e; // Try to find the current pointer in ongoing pointers by its ID\n\n const pointerIndex = this._ongoingPointers.findIndex(ongoingPointer => {\n return ongoingPointer.id === pointerEvent.pointerId;\n });\n\n if (pointerType === 'up' && pointerIndex > -1) {\n // release the pointer - remove it from ongoing\n this._ongoingPointers.splice(pointerIndex, 1);\n } else if (pointerType === 'down' && pointerIndex === -1) {\n // add new pointer\n this._ongoingPointers.push(this._convertEventPosToPoint(pointerEvent, {\n x: 0,\n y: 0\n }));\n } else if (pointerIndex > -1) {\n // update existing pointer\n this._convertEventPosToPoint(pointerEvent, this._ongoingPointers[pointerIndex]);\n }\n\n this._numActivePoints = this._ongoingPointers.length; // update points that PhotoSwipe uses\n // to calculate position and scale\n\n if (this._numActivePoints > 0) {\n equalizePoints(this.p1, this._ongoingPointers[0]);\n }\n\n if (this._numActivePoints > 1) {\n equalizePoints(this.p2, this._ongoingPointers[1]);\n }\n } else {\n const touchEvent =\n /** @type {TouchEvent} */\n e;\n this._numActivePoints = 0;\n\n if (touchEvent.type.indexOf('touch') > -1) {\n // Touch Event\n // https://developer.mozilla.org/en-US/docs/Web/API/TouchEvent\n if (touchEvent.touches && touchEvent.touches.length > 0) {\n this._convertEventPosToPoint(touchEvent.touches[0], this.p1);\n\n this._numActivePoints++;\n\n if (touchEvent.touches.length > 1) {\n this._convertEventPosToPoint(touchEvent.touches[1], this.p2);\n\n this._numActivePoints++;\n }\n }\n } else {\n // Mouse Event\n this._convertEventPosToPoint(\n /** @type {PointerEvent} */\n e, this.p1);\n\n if (pointerType === 'up') {\n // clear all points on mouseup\n this._numActivePoints = 0;\n } else {\n this._numActivePoints++;\n }\n }\n }\n }\n /** update points that were used during previous rAF tick\r\n * @private\r\n */\n\n\n _updatePrevPoints() {\n equalizePoints(this.prevP1, this.p1);\n equalizePoints(this.prevP2, this.p2);\n }\n /** update points at the start of gesture\r\n * @private\r\n */\n\n\n _updateStartPoints() {\n equalizePoints(this.startP1, this.p1);\n equalizePoints(this.startP2, this.p2);\n\n this._updatePrevPoints();\n }\n /** @private */\n\n\n _calculateDragDirection() {\n if (this.pswp.mainScroll.isShifted()) {\n // if main scroll position is shifted – direction is always horizontal\n this.dragAxis = 'x';\n } else {\n // calculate delta of the last touchmove tick\n const diff = Math.abs(this.p1.x - this.startP1.x) - Math.abs(this.p1.y - this.startP1.y);\n\n if (diff !== 0) {\n // check if pointer was shifted horizontally or vertically\n const axisToCheck = diff > 0 ? 'x' : 'y';\n\n if (Math.abs(this.p1[axisToCheck] - this.startP1[axisToCheck]) >= AXIS_SWIPE_HYSTERISIS) {\n this.dragAxis = axisToCheck;\n }\n }\n }\n }\n /**\r\n * Converts touch, pointer or mouse event\r\n * to PhotoSwipe point.\r\n *\r\n * @private\r\n * @param {Touch | PointerEvent} e\r\n * @param {Point} p\r\n * @returns {Point}\r\n */\n\n\n _convertEventPosToPoint(e, p) {\n p.x = e.pageX - this.pswp.offset.x;\n p.y = e.pageY - this.pswp.offset.y;\n\n if ('pointerId' in e) {\n p.id = e.pointerId;\n } else if (e.identifier !== undefined) {\n p.id = e.identifier;\n }\n\n return p;\n }\n /**\r\n * @private\r\n * @param {PointerEvent} e\r\n */\n\n\n _onClick(e) {\n // Do not allow click event to pass through after drag\n if (this.pswp.mainScroll.isShifted()) {\n e.preventDefault();\n e.stopPropagation();\n }\n }\n\n}\n\n/** @typedef {import('./photoswipe.js').default} PhotoSwipe */\n\n/** @typedef {import('./slide/slide.js').default} Slide */\n\n/** @typedef {{ el: HTMLDivElement; slide?: Slide }} ItemHolder */\n\nconst MAIN_SCROLL_END_FRICTION = 0.35; // const MIN_SWIPE_TRANSITION_DURATION = 250;\n// const MAX_SWIPE_TRABSITION_DURATION = 500;\n// const DEFAULT_SWIPE_TRANSITION_DURATION = 333;\n\n/**\r\n * Handles movement of the main scrolling container\r\n * (for example, it repositions when user swipes left or right).\r\n *\r\n * Also stores its state.\r\n */\n\nclass MainScroll {\n /**\r\n * @param {PhotoSwipe} pswp\r\n */\n constructor(pswp) {\n this.pswp = pswp;\n this.x = 0;\n this.slideWidth = 0;\n /** @private */\n\n this._currPositionIndex = 0;\n /** @private */\n\n this._prevPositionIndex = 0;\n /** @private */\n\n this._containerShiftIndex = -1;\n /** @type {ItemHolder[]} */\n\n this.itemHolders = [];\n }\n /**\r\n * Position the scroller and slide containers\r\n * according to viewport size.\r\n *\r\n * @param {boolean} [resizeSlides] Whether slides content should resized\r\n */\n\n\n resize(resizeSlides) {\n const {\n pswp\n } = this;\n const newSlideWidth = Math.round(pswp.viewportSize.x + pswp.viewportSize.x * pswp.options.spacing); // Mobile browsers might trigger a resize event during a gesture.\n // (due to toolbar appearing or hiding).\n // Avoid re-adjusting main scroll position if width wasn't changed\n\n const slideWidthChanged = newSlideWidth !== this.slideWidth;\n\n if (slideWidthChanged) {\n this.slideWidth = newSlideWidth;\n this.moveTo(this.getCurrSlideX());\n }\n\n this.itemHolders.forEach((itemHolder, index) => {\n if (slideWidthChanged) {\n setTransform(itemHolder.el, (index + this._containerShiftIndex) * this.slideWidth);\n }\n\n if (resizeSlides && itemHolder.slide) {\n itemHolder.slide.resize();\n }\n });\n }\n /**\r\n * Reset X position of the main scroller to zero\r\n */\n\n\n resetPosition() {\n // Position on the main scroller (offset)\n // it is independent from slide index\n this._currPositionIndex = 0;\n this._prevPositionIndex = 0; // This will force recalculation of size on next resize()\n\n this.slideWidth = 0; // _containerShiftIndex*viewportSize will give you amount of transform of the current slide\n\n this._containerShiftIndex = -1;\n }\n /**\r\n * Create and append array of three items\r\n * that hold data about slides in DOM\r\n */\n\n\n appendHolders() {\n this.itemHolders = []; // append our three slide holders -\n // previous, current, and next\n\n for (let i = 0; i < 3; i++) {\n const el = createElement('pswp__item', 'div', this.pswp.container);\n el.setAttribute('role', 'group');\n el.setAttribute('aria-roledescription', 'slide');\n el.setAttribute('aria-hidden', 'true'); // hide nearby item holders until initial zoom animation finishes (to avoid extra Paints)\n\n el.style.display = i === 1 ? 'block' : 'none';\n this.itemHolders.push({\n el //index: -1\n\n });\n }\n }\n /**\r\n * Whether the main scroll can be horizontally swiped to the next or previous slide.\r\n * @returns {boolean}\r\n */\n\n\n canBeSwiped() {\n return this.pswp.getNumItems() > 1;\n }\n /**\r\n * Move main scroll by X amount of slides.\r\n * For example:\r\n * `-1` will move to the previous slide,\r\n * `0` will reset the scroll position of the current slide,\r\n * `3` will move three slides forward\r\n *\r\n * If loop option is enabled - index will be automatically looped too,\r\n * (for example `-1` will move to the last slide of the gallery).\r\n *\r\n * @param {number} diff\r\n * @param {boolean} [animate]\r\n * @param {number} [velocityX]\r\n * @returns {boolean} whether index was changed or not\r\n */\n\n\n moveIndexBy(diff, animate, velocityX) {\n const {\n pswp\n } = this;\n let newIndex = pswp.potentialIndex + diff;\n const numSlides = pswp.getNumItems();\n\n if (pswp.canLoop()) {\n newIndex = pswp.getLoopedIndex(newIndex);\n const distance = (diff + numSlides) % numSlides;\n\n if (distance <= numSlides / 2) {\n // go forward\n diff = distance;\n } else {\n // go backwards\n diff = distance - numSlides;\n }\n } else {\n if (newIndex < 0) {\n newIndex = 0;\n } else if (newIndex >= numSlides) {\n newIndex = numSlides - 1;\n }\n\n diff = newIndex - pswp.potentialIndex;\n }\n\n pswp.potentialIndex = newIndex;\n this._currPositionIndex -= diff;\n pswp.animations.stopMainScroll();\n const destinationX = this.getCurrSlideX();\n\n if (!animate) {\n this.moveTo(destinationX);\n this.updateCurrItem();\n } else {\n pswp.animations.startSpring({\n isMainScroll: true,\n start: this.x,\n end: destinationX,\n velocity: velocityX || 0,\n naturalFrequency: 30,\n dampingRatio: 1,\n //0.7,\n onUpdate: x => {\n this.moveTo(x);\n },\n onComplete: () => {\n this.updateCurrItem();\n pswp.appendHeavy();\n }\n });\n let currDiff = pswp.potentialIndex - pswp.currIndex;\n\n if (pswp.canLoop()) {\n const currDistance = (currDiff + numSlides) % numSlides;\n\n if (currDistance <= numSlides / 2) {\n // go forward\n currDiff = currDistance;\n } else {\n // go backwards\n currDiff = currDistance - numSlides;\n }\n } // Force-append new slides during transition\n // if difference between slides is more than 1\n\n\n if (Math.abs(currDiff) > 1) {\n this.updateCurrItem();\n }\n }\n\n return Boolean(diff);\n }\n /**\r\n * X position of the main scroll for the current slide\r\n * (ignores position during dragging)\r\n * @returns {number}\r\n */\n\n\n getCurrSlideX() {\n return this.slideWidth * this._currPositionIndex;\n }\n /**\r\n * Whether scroll position is shifted.\r\n * For example, it will return true if the scroll is being dragged or animated.\r\n * @returns {boolean}\r\n */\n\n\n isShifted() {\n return this.x !== this.getCurrSlideX();\n }\n /**\r\n * Update slides X positions and set their content\r\n */\n\n\n updateCurrItem() {\n var _this$itemHolders$;\n\n const {\n pswp\n } = this;\n const positionDifference = this._prevPositionIndex - this._currPositionIndex;\n\n if (!positionDifference) {\n return;\n }\n\n this._prevPositionIndex = this._currPositionIndex;\n pswp.currIndex = pswp.potentialIndex;\n let diffAbs = Math.abs(positionDifference);\n /** @type {ItemHolder | undefined} */\n\n let tempHolder;\n\n if (diffAbs >= 3) {\n this._containerShiftIndex += positionDifference + (positionDifference > 0 ? -3 : 3);\n diffAbs = 3;\n }\n\n for (let i = 0; i < diffAbs; i++) {\n if (positionDifference > 0) {\n tempHolder = this.itemHolders.shift();\n\n if (tempHolder) {\n this.itemHolders[2] = tempHolder; // move first to last\n\n this._containerShiftIndex++;\n setTransform(tempHolder.el, (this._containerShiftIndex + 2) * this.slideWidth);\n pswp.setContent(tempHolder, pswp.currIndex - diffAbs + i + 2);\n }\n } else {\n tempHolder = this.itemHolders.pop();\n\n if (tempHolder) {\n this.itemHolders.unshift(tempHolder); // move last to first\n\n this._containerShiftIndex--;\n setTransform(tempHolder.el, this._containerShiftIndex * this.slideWidth);\n pswp.setContent(tempHolder, pswp.currIndex + diffAbs - i - 2);\n }\n }\n } // Reset transfrom every 50ish navigations in one direction.\n //\n // Otherwise transform will keep growing indefinitely,\n // which might cause issues as browsers have a maximum transform limit.\n // I wasn't able to reach it, but just to be safe.\n // This should not cause noticable lag.\n\n\n if (Math.abs(this._containerShiftIndex) > 50 && !this.isShifted()) {\n this.resetPosition();\n this.resize();\n } // Pan transition might be running (and consntantly updating pan position)\n\n\n pswp.animations.stopAllPan();\n this.itemHolders.forEach((itemHolder, i) => {\n if (itemHolder.slide) {\n // Slide in the 2nd holder is always active\n itemHolder.slide.setIsActive(i === 1);\n }\n });\n pswp.currSlide = (_this$itemHolders$ = this.itemHolders[1]) === null || _this$itemHolders$ === void 0 ? void 0 : _this$itemHolders$.slide;\n pswp.contentLoader.updateLazy(positionDifference);\n\n if (pswp.currSlide) {\n pswp.currSlide.applyCurrentZoomPan();\n }\n\n pswp.dispatch('change');\n }\n /**\r\n * Move the X position of the main scroll container\r\n *\r\n * @param {number} x\r\n * @param {boolean} [dragging]\r\n */\n\n\n moveTo(x, dragging) {\n if (!this.pswp.canLoop() && dragging) {\n // Apply friction\n let newSlideIndexOffset = (this.slideWidth * this._currPositionIndex - x) / this.slideWidth;\n newSlideIndexOffset += this.pswp.currIndex;\n const delta = Math.round(x - this.x);\n\n if (newSlideIndexOffset < 0 && delta > 0 || newSlideIndexOffset >= this.pswp.getNumItems() - 1 && delta < 0) {\n x = this.x + delta * MAIN_SCROLL_END_FRICTION;\n }\n }\n\n this.x = x;\n\n if (this.pswp.container) {\n setTransform(this.pswp.container, x);\n }\n\n this.pswp.dispatch('moveMainScroll', {\n x,\n dragging: dragging !== null && dragging !== void 0 ? dragging : false\n });\n }\n\n}\n\n/** @typedef {import('./photoswipe.js').default} PhotoSwipe */\n\n/**\r\n * @template T\r\n * @typedef {import('./types.js').Methods<T>} Methods<T>\r\n */\n\nconst KeyboardKeyCodesMap = {\n Escape: 27,\n z: 90,\n ArrowLeft: 37,\n ArrowUp: 38,\n ArrowRight: 39,\n ArrowDown: 40,\n Tab: 9\n};\n/**\r\n * @template {keyof KeyboardKeyCodesMap} T\r\n * @param {T} key\r\n * @param {boolean} isKeySupported\r\n * @returns {T | number | undefined}\r\n */\n\nconst getKeyboardEventKey = (key, isKeySupported) => {\n return isKeySupported ? key : KeyboardKeyCodesMap[key];\n};\n/**\r\n * - Manages keyboard shortcuts.\r\n * - Helps trap focus within photoswipe.\r\n */\n\n\nclass Keyboard {\n /**\r\n * @param {PhotoSwipe} pswp\r\n */\n constructor(pswp) {\n this.pswp = pswp;\n /** @private */\n\n this._wasFocused = false;\n pswp.on('bindEvents', () => {\n if (pswp.options.trapFocus) {\n // Dialog was likely opened by keyboard if initial point is not defined\n if (!pswp.options.initialPointerPos) {\n // focus causes layout,\n // which causes lag during the animation,\n // that's why we delay it until the opener transition ends\n this._focusRoot();\n }\n\n pswp.events.add(document, 'focusin',\n /** @type EventListener */\n this._onFocusIn.bind(this));\n }\n\n pswp.events.add(document, 'keydown',\n /** @type EventListener */\n this._onKeyDown.bind(this));\n });\n const lastActiveElement =\n /** @type {HTMLElement} */\n document.activeElement;\n pswp.on('destroy', () => {\n if (pswp.options.returnFocus && lastActiveElement && this._wasFocused) {\n lastActiveElement.focus();\n }\n });\n }\n /** @private */\n\n\n _focusRoot() {\n if (!this._wasFocused && this.pswp.element) {\n this.pswp.element.focus();\n this._wasFocused = true;\n }\n }\n /**\r\n * @private\r\n * @param {KeyboardEvent} e\r\n */\n\n\n _onKeyDown(e) {\n const {\n pswp\n } = this;\n\n if (pswp.dispatch('keydown', {\n originalEvent: e\n }).defaultPrevented) {\n return;\n }\n\n if (specialKeyUsed(e)) {\n // don't do anything if special key pressed\n // to prevent from overriding default browser actions\n // for example, in Chrome on Mac cmd+arrow-left returns to previous page\n return;\n }\n /** @type {Methods<PhotoSwipe> | undefined} */\n\n\n let keydownAction;\n /** @type {'x' | 'y' | undefined} */\n\n let axis;\n let isForward = false;\n const isKeySupported = ('key' in e);\n\n switch (isKeySupported ? e.key : e.keyCode) {\n case getKeyboardEventKey('Escape', isKeySupported):\n if (pswp.options.escKey) {\n keydownAction = 'close';\n }\n\n break;\n\n case getKeyboardEventKey('z', isKeySupported):\n keydownAction = 'toggleZoom';\n break;\n\n case getKeyboardEventKey('ArrowLeft', isKeySupported):\n axis = 'x';\n break;\n\n case getKeyboardEventKey('ArrowUp', isKeySupported):\n axis = 'y';\n break;\n\n case getKeyboardEventKey('ArrowRight', isKeySupported):\n axis = 'x';\n isForward = true;\n break;\n\n case getKeyboardEventKey('ArrowDown', isKeySupported):\n isForward = true;\n axis = 'y';\n break;\n\n case getKeyboardEventKey('Tab', isKeySupported):\n this._focusRoot();\n\n break;\n } // if left/right/top/bottom key\n\n\n if (axis) {\n // prevent page scroll\n e.preventDefault();\n const {\n currSlide\n } = pswp;\n\n if (pswp.options.arrowKeys && axis === 'x' && pswp.getNumItems() > 1) {\n keydownAction = isForward ? 'next' : 'prev';\n } else if (currSlide && currSlide.currZoomLevel > currSlide.zoomLevels.fit) {\n // up/down arrow keys pan the image vertically\n // left/right arrow keys pan horizontally.\n // Unless there is only one image,\n // or arrowKeys option is disabled\n currSlide.pan[axis] += isForward ? -80 : 80;\n currSlide.panTo(currSlide.pan.x, currSlide.pan.y);\n }\n }\n\n if (keydownAction) {\n e.preventDefault(); // @ts-ignore\n\n pswp[keydownAction]();\n }\n }\n /**\r\n * Trap focus inside photoswipe\r\n *\r\n * @private\r\n * @param {FocusEvent} e\r\n */\n\n\n _onFocusIn(e) {\n const {\n template\n } = this.pswp;\n\n if (template && document !== e.target && template !== e.target && !template.contains(\n /** @type {Node} */\n e.target)) {\n // focus root element\n template.focus();\n }\n }\n\n}\n\nconst DEFAULT_EASING = 'cubic-bezier(.4,0,.22,1)';\n/** @typedef {import('./animations.js').SharedAnimationProps} SharedAnimationProps */\n\n/** @typedef {Object} DefaultCssAnimationProps\r\n *\r\n * @prop {HTMLElement} target\r\n * @prop {number} [duration]\r\n * @prop {string} [easing]\r\n * @prop {string} [transform]\r\n * @prop {string} [opacity]\r\n * */\n\n/** @typedef {SharedAnimationProps & DefaultCssAnimationProps} CssAnimationProps */\n\n/**\r\n * Runs CSS transition.\r\n */\n\nclass CSSAnimation {\n /**\r\n * onComplete can be unpredictable, be careful about current state\r\n *\r\n * @param {CssAnimationProps} props\r\n */\n constructor(props) {\n var _props$prop;\n\n this.props = props;\n const {\n target,\n onComplete,\n transform,\n onFinish = () => {},\n duration = 333,\n easing = DEFAULT_EASING\n } = props;\n this.onFinish = onFinish; // support only transform and opacity\n\n const prop = transform ? 'transform' : 'opacity';\n const propValue = (_props$prop = props[prop]) !== null && _props$prop !== void 0 ? _props$prop : '';\n /** @private */\n\n this._target = target;\n /** @private */\n\n this._onComplete = onComplete;\n /** @private */\n\n this._finished = false;\n /** @private */\n\n this._onTransitionEnd = this._onTransitionEnd.bind(this); // Using timeout hack to make sure that animation\n // starts even if the animated property was changed recently,\n // otherwise transitionend might not fire or transition won't start.\n // https://drafts.csswg.org/css-transitions/#starting\n //\n // ¯\\_(ツ)_/¯\n\n /** @private */\n\n this._helperTimeout = setTimeout(() => {\n setTransitionStyle(target, prop, duration, easing);\n this._helperTimeout = setTimeout(() => {\n target.addEventListener('transitionend', this._onTransitionEnd, false);\n target.addEventListener('transitioncancel', this._onTransitionEnd, false); // Safari occasionally does not emit transitionend event\n // if element property was modified during the transition,\n // which may be caused by resize or third party component,\n // using timeout as a safety fallback\n\n this._helperTimeout = setTimeout(() => {\n this._finalizeAnimation();\n }, duration + 500);\n target.style[prop] = propValue;\n }, 30); // Do not reduce this number\n }, 0);\n }\n /**\r\n * @private\r\n * @param {TransitionEvent} e\r\n */\n\n\n _onTransitionEnd(e) {\n if (e.target === this._target) {\n this._finalizeAnimation();\n }\n }\n /**\r\n * @private\r\n */\n\n\n _finalizeAnimation() {\n if (!this._finished) {\n this._finished = true;\n this.onFinish();\n\n if (this._onComplete) {\n this._onComplete();\n }\n }\n } // Destroy is called automatically onFinish\n\n\n destroy() {\n if (this._helperTimeout) {\n clearTimeout(this._helperTimeout);\n }\n\n removeTransitionStyle(this._target);\n\n this._target.removeEventListener('transitionend', this._onTransitionEnd, false);\n\n this._target.removeEventListener('transitioncancel', this._onTransitionEnd, false);\n\n if (!this._finished) {\n this._finalizeAnimation();\n }\n }\n\n}\n\nconst DEFAULT_NATURAL_FREQUENCY = 12;\nconst DEFAULT_DAMPING_RATIO = 0.75;\n/**\r\n * Spring easing helper\r\n */\n\nclass SpringEaser {\n /**\r\n * @param {number} initialVelocity Initial velocity, px per ms.\r\n *\r\n * @param {number} [dampingRatio]\r\n * Determines how bouncy animation will be.\r\n * From 0 to 1, 0 - always overshoot, 1 - do not overshoot.\r\n * \"overshoot\" refers to part of animation that\r\n * goes beyond the final value.\r\n *\r\n * @param {number} [naturalFrequency]\r\n * Determines how fast animation will slow down.\r\n * The higher value - the stiffer the transition will be,\r\n * and the faster it will slow down.\r\n * Recommended value from 10 to 50\r\n */\n constructor(initialVelocity, dampingRatio, naturalFrequency) {\n this.velocity = initialVelocity * 1000; // convert to \"pixels per second\"\n // https://en.wikipedia.org/wiki/Damping_ratio\n\n this._dampingRatio = dampingRatio || DEFAULT_DAMPING_RATIO; // https://en.wikipedia.org/wiki/Natural_frequency\n\n this._naturalFrequency = naturalFrequency || DEFAULT_NATURAL_FREQUENCY;\n this._dampedFrequency = this._naturalFrequency;\n\n if (this._dampingRatio < 1) {\n this._dampedFrequency *= Math.sqrt(1 - this._dampingRatio * this._dampingRatio);\n }\n }\n /**\r\n * @param {number} deltaPosition Difference between current and end position of the animation\r\n * @param {number} deltaTime Frame duration in milliseconds\r\n *\r\n * @returns {number} Displacement, relative to the end position.\r\n */\n\n\n easeFrame(deltaPosition, deltaTime) {\n // Inspired by Apple Webkit and Android spring function implementation\n // https://en.wikipedia.org/wiki/Oscillation\n // https://en.wikipedia.org/wiki/Damping_ratio\n // we ignore mass (assume that it's 1kg)\n let displacement = 0;\n let coeff;\n deltaTime /= 1000;\n const naturalDumpingPow = Math.E ** (-this._dampingRatio * this._naturalFrequency * deltaTime);\n\n if (this._dampingRatio === 1) {\n coeff = this.velocity + this._naturalFrequency * deltaPosition;\n displacement = (deltaPosition + coeff * deltaTime) * naturalDumpingPow;\n this.velocity = displacement * -this._naturalFrequency + coeff * naturalDumpingPow;\n } else if (this._dampingRatio < 1) {\n coeff = 1 / this._dampedFrequency * (this._dampingRatio * this._naturalFrequency * deltaPosition + this.velocity);\n const dumpedFCos = Math.cos(this._dampedFrequency * deltaTime);\n const dumpedFSin = Math.sin(this._dampedFrequency * deltaTime);\n displacement = naturalDumpingPow * (deltaPosition * dumpedFCos + coeff * dumpedFSin);\n this.velocity = displacement * -this._naturalFrequency * this._dampingRatio + naturalDumpingPow * (-this._dampedFrequency * deltaPosition * dumpedFSin + this._dampedFrequency * coeff * dumpedFCos);\n } // Overdamped (>1) damping ratio is not supported\n\n\n return displacement;\n }\n\n}\n\n/** @typedef {import('./animations.js').SharedAnimationProps} SharedAnimationProps */\n\n/**\r\n * @typedef {Object} DefaultSpringAnimationProps\r\n *\r\n * @prop {number} start\r\n * @prop {number} end\r\n * @prop {number} velocity\r\n * @prop {number} [dampingRatio]\r\n * @prop {number} [naturalFrequency]\r\n * @prop {(end: number) => void} onUpdate\r\n */\n\n/** @typedef {SharedAnimationProps & DefaultSpringAnimationProps} SpringAnimationProps */\n\nclass SpringAnimation {\n /**\r\n * @param {SpringAnimationProps} props\r\n */\n constructor(props) {\n this.props = props;\n this._raf = 0;\n const {\n start,\n end,\n velocity,\n onUpdate,\n onComplete,\n onFinish = () => {},\n dampingRatio,\n naturalFrequency\n } = props;\n this.onFinish = onFinish;\n const easer = new SpringEaser(velocity, dampingRatio, naturalFrequency);\n let prevTime = Date.now();\n let deltaPosition = start - end;\n\n const animationLoop = () => {\n if (this._raf) {\n deltaPosition = easer.easeFrame(deltaPosition, Date.now() - prevTime); // Stop the animation if velocity is low and position is close to end\n\n if (Math.abs(deltaPosition) < 1 && Math.abs(easer.velocity) < 50) {\n // Finalize the animation\n onUpdate(end);\n\n if (onComplete) {\n onComplete();\n }\n\n this.onFinish();\n } else {\n prevTime = Date.now();\n onUpdate(deltaPosition + end);\n this._raf = requestAnimationFrame(animationLoop);\n }\n }\n };\n\n this._raf = requestAnimationFrame(animationLoop);\n } // Destroy is called automatically onFinish\n\n\n destroy() {\n if (this._raf >= 0) {\n cancelAnimationFrame(this._raf);\n }\n\n this._raf = 0;\n }\n\n}\n\n/** @typedef {import('./css-animation.js').CssAnimationProps} CssAnimationProps */\n\n/** @typedef {import('./spring-animation.js').SpringAnimationProps} SpringAnimationProps */\n\n/** @typedef {Object} SharedAnimationProps\r\n * @prop {string} [name]\r\n * @prop {boolean} [isPan]\r\n * @prop {boolean} [isMainScroll]\r\n * @prop {VoidFunction} [onComplete]\r\n * @prop {VoidFunction} [onFinish]\r\n */\n\n/** @typedef {SpringAnimation | CSSAnimation} Animation */\n\n/** @typedef {SpringAnimationProps | CssAnimationProps} AnimationProps */\n\n/**\r\n * Manages animations\r\n */\n\nclass Animations {\n constructor() {\n /** @type {Animation[]} */\n this.activeAnimations = [];\n }\n /**\r\n * @param {SpringAnimationProps} props\r\n */\n\n\n startSpring(props) {\n this._start(props, true);\n }\n /**\r\n * @param {CssAnimationProps} props\r\n */\n\n\n startTransition(props) {\n this._start(props);\n }\n /**\r\n * @private\r\n * @param {AnimationProps} props\r\n * @param {boolean} [isSpring]\r\n * @returns {Animation}\r\n */\n\n\n _start(props, isSpring) {\n const animation = isSpring ? new SpringAnimation(\n /** @type SpringAnimationProps */\n props) : new CSSAnimation(\n /** @type CssAnimationProps */\n props);\n this.activeAnimations.push(animation);\n\n animation.onFinish = () => this.stop(animation);\n\n return animation;\n }\n /**\r\n * @param {Animation} animation\r\n */\n\n\n stop(animation) {\n animation.destroy();\n const index = this.activeAnimations.indexOf(animation);\n\n if (index > -1) {\n this.activeAnimations.splice(index, 1);\n }\n }\n\n stopAll() {\n // _stopAllAnimations\n this.activeAnimations.forEach(animation => {\n animation.destroy();\n });\n this.activeAnimations = [];\n }\n /**\r\n * Stop all pan or zoom transitions\r\n */\n\n\n stopAllPan() {\n this.activeAnimations = this.activeAnimations.filter(animation => {\n if (animation.props.isPan) {\n animation.destroy();\n return false;\n }\n\n return true;\n });\n }\n\n stopMainScroll() {\n this.activeAnimations = this.activeAnimations.filter(animation => {\n if (animation.props.isMainScroll) {\n animation.destroy();\n return false;\n }\n\n return true;\n });\n }\n /**\r\n * Returns true if main scroll transition is running\r\n */\n // isMainScrollRunning() {\n // return this.activeAnimations.some((animation) => {\n // return animation.props.isMainScroll;\n // });\n // }\n\n /**\r\n * Returns true if any pan or zoom transition is running\r\n */\n\n\n isPanRunning() {\n return this.activeAnimations.some(animation => {\n return animation.props.isPan;\n });\n }\n\n}\n\n/** @typedef {import('./photoswipe.js').default} PhotoSwipe */\n\n/**\r\n * Handles scroll wheel.\r\n * Can pan and zoom current slide image.\r\n */\nclass ScrollWheel {\n /**\r\n * @param {PhotoSwipe} pswp\r\n */\n constructor(pswp) {\n this.pswp = pswp;\n pswp.events.add(pswp.element, 'wheel',\n /** @type EventListener */\n this._onWheel.bind(this));\n }\n /**\r\n * @private\r\n * @param {WheelEvent} e\r\n */\n\n\n _onWheel(e) {\n e.preventDefault();\n const {\n currSlide\n } = this.pswp;\n let {\n deltaX,\n deltaY\n } = e;\n\n if (!currSlide) {\n return;\n }\n\n if (this.pswp.dispatch('wheel', {\n originalEvent: e\n }).defaultPrevented) {\n return;\n }\n\n if (e.ctrlKey || this.pswp.options.wheelToZoom) {\n // zoom\n if (currSlide.isZoomable()) {\n let zoomFactor = -deltaY;\n\n if (e.deltaMode === 1\n /* DOM_DELTA_LINE */\n ) {\n zoomFactor *= 0.05;\n } else {\n zoomFactor *= e.deltaMode ? 1 : 0.002;\n }\n\n zoomFactor = 2 ** zoomFactor;\n const destZoomLevel = currSlide.currZoomLevel * zoomFactor;\n currSlide.zoomTo(destZoomLevel, {\n x: e.clientX,\n y: e.clientY\n });\n }\n } else {\n // pan\n if (currSlide.isPannable()) {\n if (e.deltaMode === 1\n /* DOM_DELTA_LINE */\n ) {\n // 18 - average line height\n deltaX *= 18;\n deltaY *= 18;\n }\n\n currSlide.panTo(currSlide.pan.x - deltaX, currSlide.pan.y - deltaY);\n }\n }\n }\n\n}\n\n/** @typedef {import('../photoswipe.js').default} PhotoSwipe */\n\n/**\r\n * @template T\r\n * @typedef {import('../types.js').Methods<T>} Methods<T>\r\n */\n\n/**\r\n * @typedef {Object} UIElementMarkupProps\r\n * @prop {boolean} [isCustomSVG]\r\n * @prop {string} inner\r\n * @prop {string} [outlineID]\r\n * @prop {number | string} [size]\r\n */\n\n/**\r\n * @typedef {Object} UIElementData\r\n * @prop {DefaultUIElements | string} [name]\r\n * @prop {string} [className]\r\n * @prop {UIElementMarkup} [html]\r\n * @prop {boolean} [isButton]\r\n * @prop {keyof HTMLElementTagNameMap} [tagName]\r\n * @prop {string} [title]\r\n * @prop {string} [ariaLabel]\r\n * @prop {(element: HTMLElement, pswp: PhotoSwipe) => void} [onInit]\r\n * @prop {Methods<PhotoSwipe> | ((e: MouseEvent, element: HTMLElement, pswp: PhotoSwipe) => void)} [onClick]\r\n * @prop {'bar' | 'wrapper' | 'root'} [appendTo]\r\n * @prop {number} [order]\r\n */\n\n/** @typedef {'arrowPrev' | 'arrowNext' | 'close' | 'zoom' | 'counter'} DefaultUIElements */\n\n/** @typedef {string | UIElementMarkupProps} UIElementMarkup */\n\n/**\r\n * @param {UIElementMarkup} [htmlData]\r\n * @returns {string}\r\n */\n\nfunction addElementHTML(htmlData) {\n if (typeof htmlData === 'string') {\n // Allow developers to provide full svg,\n // For example:\n // <svg viewBox=\"0 0 32 32\" width=\"32\" height=\"32\" aria-hidden=\"true\" class=\"pswp__icn\">\n // <path d=\"...\" />\n // <circle ... />\n // </svg>\n // Can also be any HTML string.\n return htmlData;\n }\n\n if (!htmlData || !htmlData.isCustomSVG) {\n return '';\n }\n\n const svgData = htmlData;\n let out = '<svg aria-hidden=\"true\" class=\"pswp__icn\" viewBox=\"0 0 %d %d\" width=\"%d\" height=\"%d\">'; // replace all %d with size\n\n out = out.split('%d').join(\n /** @type {string} */\n svgData.size || 32); // Icons may contain outline/shadow,\n // to make it we \"clone\" base icon shape and add border to it.\n // Icon itself and border are styled via CSS.\n //\n // Property shadowID defines ID of element that should be cloned.\n\n if (svgData.outlineID) {\n out += '<use class=\"pswp__icn-shadow\" xlink:href=\"#' + svgData.outlineID + '\"/>';\n }\n\n out += svgData.inner;\n out += '</svg>';\n return out;\n}\n\nclass UIElement {\n /**\r\n * @param {PhotoSwipe} pswp\r\n * @param {UIElementData} data\r\n */\n constructor(pswp, data) {\n var _container;\n\n const name = data.name || data.className;\n let elementHTML = data.html; // @ts-expect-error lookup only by `data.name` maybe?\n\n if (pswp.options[name] === false) {\n // exit if element is disabled from options\n return;\n } // Allow to override SVG icons from options\n // @ts-expect-error lookup only by `data.name` maybe?\n\n\n if (typeof pswp.options[name + 'SVG'] === 'string') {\n // arrowPrevSVG\n // arrowNextSVG\n // closeSVG\n // zoomSVG\n // @ts-expect-error lookup only by `data.name` maybe?\n elementHTML = pswp.options[name + 'SVG'];\n }\n\n pswp.dispatch('uiElementCreate', {\n data\n });\n let className = '';\n\n if (data.isButton) {\n className += 'pswp__button ';\n className += data.className || `pswp__button--${data.name}`;\n } else {\n className += data.className || `pswp__${data.name}`;\n }\n\n let tagName = data.isButton ? data.tagName || 'button' : data.tagName || 'div';\n tagName =\n /** @type {keyof HTMLElementTagNameMap} */\n tagName.toLowerCase();\n /** @type {HTMLElement} */\n\n const element = createElement(className, tagName);\n\n if (data.isButton) {\n if (tagName === 'button') {\n /** @type {HTMLButtonElement} */\n element.type = 'button';\n }\n\n let {\n title\n } = data;\n const {\n ariaLabel\n } = data; // @ts-expect-error lookup only by `data.name` maybe?\n\n if (typeof pswp.options[name + 'Title'] === 'string') {\n // @ts-expect-error lookup only by `data.name` maybe?\n title = pswp.options[name + 'Title'];\n }\n\n if (title) {\n element.title = title;\n }\n\n const ariaText = ariaLabel || title;\n\n if (ariaText) {\n element.setAttribute('aria-label', ariaText);\n }\n }\n\n element.innerHTML = addElementHTML(elementHTML);\n\n if (data.onInit) {\n data.onInit(element, pswp);\n }\n\n if (data.onClick) {\n element.onclick = e => {\n if (typeof data.onClick === 'string') {\n // @ts-ignore\n pswp[data.onClick]();\n } else if (typeof data.onClick === 'function') {\n data.onClick(e, element, pswp);\n }\n };\n } // Top bar is default position\n\n\n const appendTo = data.appendTo || 'bar';\n /** @type {HTMLElement | undefined} root element by default */\n\n let container = pswp.element;\n\n if (appendTo === 'bar') {\n if (!pswp.topBar) {\n pswp.topBar = createElement('pswp__top-bar pswp__hide-on-close', 'div', pswp.scrollWrap);\n }\n\n container = pswp.topBar;\n } else {\n // element outside of top bar gets a secondary class\n // that makes element fade out on close\n element.classList.add('pswp__hide-on-close');\n\n if (appendTo === 'wrapper') {\n container = pswp.scrollWrap;\n }\n }\n\n (_container = container) === null || _container === void 0 || _container.appendChild(pswp.applyFilters('uiElement', element, data));\n }\n\n}\n\n/*\r\n Backward and forward arrow buttons\r\n */\n\n/** @typedef {import('./ui-element.js').UIElementData} UIElementData */\n\n/** @typedef {import('../photoswipe.js').default} PhotoSwipe */\n\n/**\r\n *\r\n * @param {HTMLElement} element\r\n * @param {PhotoSwipe} pswp\r\n * @param {boolean} [isNextButton]\r\n */\nfunction initArrowButton(element, pswp, isNextButton) {\n element.classList.add('pswp__button--arrow'); // TODO: this should point to a unique id for this instance\n\n element.setAttribute('aria-controls', 'pswp__items');\n pswp.on('change', () => {\n if (!pswp.options.loop) {\n if (isNextButton) {\n /** @type {HTMLButtonElement} */\n element.disabled = !(pswp.currIndex < pswp.getNumItems() - 1);\n } else {\n /** @type {HTMLButtonElement} */\n element.disabled = !(pswp.currIndex > 0);\n }\n }\n });\n}\n/** @type {UIElementData} */\n\n\nconst arrowPrev = {\n name: 'arrowPrev',\n className: 'pswp__button--arrow--prev',\n title: 'Previous',\n order: 10,\n isButton: true,\n appendTo: 'wrapper',\n html: {\n isCustomSVG: true,\n size: 60,\n inner: '<path d=\"M29 43l-3 3-16-16 16-16 3 3-13 13 13 13z\" id=\"pswp__icn-arrow\"/>',\n outlineID: 'pswp__icn-arrow'\n },\n onClick: 'prev',\n onInit: initArrowButton\n};\n/** @type {UIElementData} */\n\nconst arrowNext = {\n name: 'arrowNext',\n className: 'pswp__button--arrow--next',\n title: 'Next',\n order: 11,\n isButton: true,\n appendTo: 'wrapper',\n html: {\n isCustomSVG: true,\n size: 60,\n inner: '<use xlink:href=\"#pswp__icn-arrow\"/>',\n outlineID: 'pswp__icn-arrow'\n },\n onClick: 'next',\n onInit: (el, pswp) => {\n initArrowButton(el, pswp, true);\n }\n};\n\n/** @type {import('./ui-element.js').UIElementData} UIElementData */\nconst closeButton = {\n name: 'close',\n title: 'Close',\n order: 20,\n isButton: true,\n html: {\n isCustomSVG: true,\n inner: '<path d=\"M24 10l-2-2-6 6-6-6-2 2 6 6-6 6 2 2 6-6 6 6 2-2-6-6z\" id=\"pswp__icn-close\"/>',\n outlineID: 'pswp__icn-close'\n },\n onClick: 'close'\n};\n\n/** @type {import('./ui-element.js').UIElementData} UIElementData */\nconst zoomButton = {\n name: 'zoom',\n title: 'Zoom',\n order: 10,\n isButton: true,\n html: {\n isCustomSVG: true,\n // eslint-disable-next-line max-len\n inner: '<path d=\"M17.426 19.926a6 6 0 1 1 1.5-1.5L23 22.5 21.5 24l-4.074-4.074z\" id=\"pswp__icn-zoom\"/>' + '<path fill=\"currentColor\" class=\"pswp__zoom-icn-bar-h\" d=\"M11 16v-2h6v2z\"/>' + '<path fill=\"currentColor\" class=\"pswp__zoom-icn-bar-v\" d=\"M13 12h2v6h-2z\"/>',\n outlineID: 'pswp__icn-zoom'\n },\n onClick: 'toggleZoom'\n};\n\n/** @type {import('./ui-element.js').UIElementData} UIElementData */\nconst loadingIndicator = {\n name: 'preloader',\n appendTo: 'bar',\n order: 7,\n html: {\n isCustomSVG: true,\n // eslint-disable-next-line max-len\n inner: '<path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M21.2 16a5.2 5.2 0 1 1-5.2-5.2V8a8 8 0 1 0 8 8h-2.8Z\" id=\"pswp__icn-loading\"/>',\n outlineID: 'pswp__icn-loading'\n },\n onInit: (indicatorElement, pswp) => {\n /** @type {boolean | undefined} */\n let isVisible;\n /** @type {NodeJS.Timeout | null} */\n\n let delayTimeout = null;\n /**\r\n * @param {string} className\r\n * @param {boolean} add\r\n */\n\n const toggleIndicatorClass = (className, add) => {\n indicatorElement.classList.toggle('pswp__preloader--' + className, add);\n };\n /**\r\n * @param {boolean} visible\r\n */\n\n\n const setIndicatorVisibility = visible => {\n if (isVisible !== visible) {\n isVisible = visible;\n toggleIndicatorClass('active', visible);\n }\n };\n\n const updatePreloaderVisibility = () => {\n var _pswp$currSlide;\n\n if (!((_pswp$currSlide = pswp.currSlide) !== null && _pswp$currSlide !== void 0 && _pswp$currSlide.content.isLoading())) {\n setIndicatorVisibility(false);\n\n if (delayTimeout) {\n clearTimeout(delayTimeout);\n delayTimeout = null;\n }\n\n return;\n }\n\n if (!delayTimeout) {\n // display loading indicator with delay\n delayTimeout = setTimeout(() => {\n var _pswp$currSlide2;\n\n setIndicatorVisibility(Boolean((_pswp$currSlide2 = pswp.currSlide) === null || _pswp$currSlide2 === void 0 ? void 0 : _pswp$currSlide2.content.isLoading()));\n delayTimeout = null;\n }, pswp.options.preloaderDelay);\n }\n };\n\n pswp.on('change', updatePreloaderVisibility);\n pswp.on('loadComplete', e => {\n if (pswp.currSlide === e.slide) {\n updatePreloaderVisibility();\n }\n }); // expose the method\n\n if (pswp.ui) {\n pswp.ui.updatePreloaderVisibility = updatePreloaderVisibility;\n }\n }\n};\n\n/** @type {import('./ui-element.js').UIElementData} UIElementData */\nconst counterIndicator = {\n name: 'counter',\n order: 5,\n onInit: (counterElement, pswp) => {\n pswp.on('change', () => {\n counterElement.innerText = pswp.currIndex + 1 + pswp.options.indexIndicatorSep + pswp.getNumItems();\n });\n }\n};\n\n/** @typedef {import('../photoswipe.js').default} PhotoSwipe */\n\n/** @typedef {import('./ui-element.js').UIElementData} UIElementData */\n\n/**\r\n * Set special class on element when image is zoomed.\r\n *\r\n * By default, it is used to adjust\r\n * zoom icon and zoom cursor via CSS.\r\n *\r\n * @param {HTMLElement} el\r\n * @param {boolean} isZoomedIn\r\n */\n\nfunction setZoomedIn(el, isZoomedIn) {\n el.classList.toggle('pswp--zoomed-in', isZoomedIn);\n}\n\nclass UI {\n /**\r\n * @param {PhotoSwipe} pswp\r\n */\n constructor(pswp) {\n this.pswp = pswp;\n this.isRegistered = false;\n /** @type {UIElementData[]} */\n\n this.uiElementsData = [];\n /** @type {(UIElement | UIElementData)[]} */\n\n this.items = [];\n /** @type {() => void} */\n\n this.updatePreloaderVisibility = () => {};\n /**\r\n * @private\r\n * @type {number | undefined}\r\n */\n\n\n this._lastUpdatedZoomLevel = undefined;\n }\n\n init() {\n const {\n pswp\n } = this;\n this.isRegistered = false;\n this.uiElementsData = [closeButton, arrowPrev, arrowNext, zoomButton, loadingIndicator, counterIndicator];\n pswp.dispatch('uiRegister'); // sort by order\n\n this.uiElementsData.sort((a, b) => {\n // default order is 0\n return (a.order || 0) - (b.order || 0);\n });\n this.items = [];\n this.isRegistered = true;\n this.uiElementsData.forEach(uiElementData => {\n this.registerElement(uiElementData);\n });\n pswp.on('change', () => {\n var _pswp$element;\n\n (_pswp$element = pswp.element) === null || _pswp$element === void 0 || _pswp$element.classList.toggle('pswp--one-slide', pswp.getNumItems() === 1);\n });\n pswp.on('zoomPanUpdate', () => this._onZoomPanUpdate());\n }\n /**\r\n * @param {UIElementData} elementData\r\n */\n\n\n registerElement(elementData) {\n if (this.isRegistered) {\n this.items.push(new UIElement(this.pswp, elementData));\n } else {\n this.uiElementsData.push(elementData);\n }\n }\n /**\r\n * Fired each time zoom or pan position is changed.\r\n * Update classes that control visibility of zoom button and cursor icon.\r\n *\r\n * @private\r\n */\n\n\n _onZoomPanUpdate() {\n const {\n template,\n currSlide,\n options\n } = this.pswp;\n\n if (this.pswp.opener.isClosing || !template || !currSlide) {\n return;\n }\n\n let {\n currZoomLevel\n } = currSlide; // if not open yet - check against initial zoom level\n\n if (!this.pswp.opener.isOpen) {\n currZoomLevel = currSlide.zoomLevels.initial;\n }\n\n if (currZoomLevel === this._lastUpdatedZoomLevel) {\n return;\n }\n\n this._lastUpdatedZoomLevel = currZoomLevel;\n const currZoomLevelDiff = currSlide.zoomLevels.initial - currSlide.zoomLevels.secondary; // Initial and secondary zoom levels are almost equal\n\n if (Math.abs(currZoomLevelDiff) < 0.01 || !currSlide.isZoomable()) {\n // disable zoom\n setZoomedIn(template, false);\n template.classList.remove('pswp--zoom-allowed');\n return;\n }\n\n template.classList.add('pswp--zoom-allowed');\n const potentialZoomLevel = currZoomLevel === currSlide.zoomLevels.initial ? currSlide.zoomLevels.secondary : currSlide.zoomLevels.initial;\n setZoomedIn(template, potentialZoomLevel <= currZoomLevel);\n\n if (options.imageClickAction === 'zoom' || options.imageClickAction === 'zoom-or-close') {\n template.classList.add('pswp--click-to-zoom');\n }\n }\n\n}\n\n/** @typedef {import('./slide.js').SlideData} SlideData */\n\n/** @typedef {import('../photoswipe.js').default} PhotoSwipe */\n\n/** @typedef {{ x: number; y: number; w: number; innerRect?: { w: number; h: number; x: number; y: number } }} Bounds */\n\n/**\r\n * @param {HTMLElement} el\r\n * @returns Bounds\r\n */\nfunction getBoundsByElement(el) {\n const thumbAreaRect = el.getBoundingClientRect();\n return {\n x: thumbAreaRect.left,\n y: thumbAreaRect.top,\n w: thumbAreaRect.width\n };\n}\n/**\r\n * @param {HTMLElement} el\r\n * @param {number} imageWidth\r\n * @param {number} imageHeight\r\n * @returns Bounds\r\n */\n\n\nfunction getCroppedBoundsByElement(el, imageWidth, imageHeight) {\n const thumbAreaRect = el.getBoundingClientRect(); // fill image into the area\n // (do they same as object-fit:cover does to retrieve coordinates)\n\n const hRatio = thumbAreaRect.width / imageWidth;\n const vRatio = thumbAreaRect.height / imageHeight;\n const fillZoomLevel = hRatio > vRatio ? hRatio : vRatio;\n const offsetX = (thumbAreaRect.width - imageWidth * fillZoomLevel) / 2;\n const offsetY = (thumbAreaRect.height - imageHeight * fillZoomLevel) / 2;\n /**\r\n * Coordinates of the image,\r\n * as if it was not cropped,\r\n * height is calculated automatically\r\n *\r\n * @type {Bounds}\r\n */\n\n const bounds = {\n x: thumbAreaRect.left + offsetX,\n y: thumbAreaRect.top + offsetY,\n w: imageWidth * fillZoomLevel\n }; // Coordinates of inner crop area\n // relative to the image\n\n bounds.innerRect = {\n w: thumbAreaRect.width,\n h: thumbAreaRect.height,\n x: offsetX,\n y: offsetY\n };\n return bounds;\n}\n/**\r\n * Get dimensions of thumbnail image\r\n * (click on which opens photoswipe or closes photoswipe to)\r\n *\r\n * @param {number} index\r\n * @param {SlideData} itemData\r\n * @param {PhotoSwipe} instance PhotoSwipe instance\r\n * @returns {Bounds | undefined}\r\n */\n\n\nfunction getThumbBounds(index, itemData, instance) {\n // legacy event, before filters were introduced\n const event = instance.dispatch('thumbBounds', {\n index,\n itemData,\n instance\n }); // @ts-expect-error\n\n if (event.thumbBounds) {\n // @ts-expect-error\n return event.thumbBounds;\n }\n\n const {\n element\n } = itemData;\n /** @type {Bounds | undefined} */\n\n let thumbBounds;\n /** @type {HTMLElement | null | undefined} */\n\n let thumbnail;\n\n if (element && instance.options.thumbSelector !== false) {\n const thumbSelector = instance.options.thumbSelector || 'img';\n thumbnail = element.matches(thumbSelector) ? element :\n /** @type {HTMLElement | null} */\n element.querySelector(thumbSelector);\n }\n\n thumbnail = instance.applyFilters('thumbEl', thumbnail, itemData, index);\n\n if (thumbnail) {\n if (!itemData.thumbCropped) {\n thumbBounds = getBoundsByElement(thumbnail);\n } else {\n thumbBounds = getCroppedBoundsByElement(thumbnail, itemData.width || itemData.w || 0, itemData.height || itemData.h || 0);\n }\n }\n\n return instance.applyFilters('thumbBounds', thumbBounds, itemData, index);\n}\n\n/** @typedef {import('../lightbox/lightbox.js').default} PhotoSwipeLightbox */\n\n/** @typedef {import('../photoswipe.js').default} PhotoSwipe */\n\n/** @typedef {import('../photoswipe.js').PhotoSwipeOptions} PhotoSwipeOptions */\n\n/** @typedef {import('../photoswipe.js').DataSource} DataSource */\n\n/** @typedef {import('../ui/ui-element.js').UIElementData} UIElementData */\n\n/** @typedef {import('../slide/content.js').default} ContentDefault */\n\n/** @typedef {import('../slide/slide.js').default} Slide */\n\n/** @typedef {import('../slide/slide.js').SlideData} SlideData */\n\n/** @typedef {import('../slide/zoom-level.js').default} ZoomLevel */\n\n/** @typedef {import('../slide/get-thumb-bounds.js').Bounds} Bounds */\n\n/**\r\n * Allow adding an arbitrary props to the Content\r\n * https://photoswipe.com/custom-content/#using-webp-image-format\r\n * @typedef {ContentDefault & Record<string, any>} Content\r\n */\n\n/** @typedef {{ x?: number; y?: number }} Point */\n\n/**\r\n * @typedef {Object} PhotoSwipeEventsMap https://photoswipe.com/events/\r\n *\r\n *\r\n * https://photoswipe.com/adding-ui-elements/\r\n *\r\n * @prop {undefined} uiRegister\r\n * @prop {{ data: UIElementData }} uiElementCreate\r\n *\r\n *\r\n * https://photoswipe.com/events/#initialization-events\r\n *\r\n * @prop {undefined} beforeOpen\r\n * @prop {undefined} firstUpdate\r\n * @prop {undefined} initialLayout\r\n * @prop {undefined} change\r\n * @prop {undefined} afterInit\r\n * @prop {undefined} bindEvents\r\n *\r\n *\r\n * https://photoswipe.com/events/#opening-or-closing-transition-events\r\n *\r\n * @prop {undefined} openingAnimationStart\r\n * @prop {undefined} openingAnimationEnd\r\n * @prop {undefined} closingAnimationStart\r\n * @prop {undefined} closingAnimationEnd\r\n *\r\n *\r\n * https://photoswipe.com/events/#closing-events\r\n *\r\n * @prop {undefined} close\r\n * @prop {undefined} destroy\r\n *\r\n *\r\n * https://photoswipe.com/events/#pointer-and-gesture-events\r\n *\r\n * @prop {{ originalEvent: PointerEvent }} pointerDown\r\n * @prop {{ originalEvent: PointerEvent }} pointerMove\r\n * @prop {{ originalEvent: PointerEvent }} pointerUp\r\n * @prop {{ bgOpacity: number }} pinchClose can be default prevented\r\n * @prop {{ panY: number }} verticalDrag can be default prevented\r\n *\r\n *\r\n * https://photoswipe.com/events/#slide-content-events\r\n *\r\n * @prop {{ content: Content }} contentInit\r\n * @prop {{ content: Content; isLazy: boolean }} contentLoad can be default prevented\r\n * @prop {{ content: Content; isLazy: boolean }} contentLoadImage can be default prevented\r\n * @prop {{ content: Content; slide: Slide; isError?: boolean }} loadComplete\r\n * @prop {{ content: Content; slide: Slide }} loadError\r\n * @prop {{ content: Content; width: number; height: number }} contentResize can be default prevented\r\n * @prop {{ content: Content; width: number; height: number; slide: Slide }} imageSizeChange\r\n * @prop {{ content: Content }} contentLazyLoad can be default prevented\r\n * @prop {{ content: Content }} contentAppend can be default prevented\r\n * @prop {{ content: Content }} contentActivate can be default prevented\r\n * @prop {{ content: Content }} contentDeactivate can be default prevented\r\n * @prop {{ content: Content }} contentRemove can be default prevented\r\n * @prop {{ content: Content }} contentDestroy can be default prevented\r\n *\r\n *\r\n * undocumented\r\n *\r\n * @prop {{ point: Point; originalEvent: PointerEvent }} imageClickAction can be default prevented\r\n * @prop {{ point: Point; originalEvent: PointerEvent }} bgClickAction can be default prevented\r\n * @prop {{ point: Point; originalEvent: PointerEvent }} tapAction can be default prevented\r\n * @prop {{ point: Point; originalEvent: PointerEvent }} doubleTapAction can be default prevented\r\n *\r\n * @prop {{ originalEvent: KeyboardEvent }} keydown can be default prevented\r\n * @prop {{ x: number; dragging: boolean }} moveMainScroll\r\n * @prop {{ slide: Slide }} firstZoomPan\r\n * @prop {{ slide: Slide | undefined, data: SlideData, index: number }} gettingData\r\n * @prop {undefined} beforeResize\r\n * @prop {undefined} resize\r\n * @prop {undefined} viewportSize\r\n * @prop {undefined} updateScrollOffset\r\n * @prop {{ slide: Slide }} slideInit\r\n * @prop {{ slide: Slide }} afterSetContent\r\n * @prop {{ slide: Slide }} slideLoad\r\n * @prop {{ slide: Slide }} appendHeavy can be default prevented\r\n * @prop {{ slide: Slide }} appendHeavyContent\r\n * @prop {{ slide: Slide }} slideActivate\r\n * @prop {{ slide: Slide }} slideDeactivate\r\n * @prop {{ slide: Slide }} slideDestroy\r\n * @prop {{ destZoomLevel: number, centerPoint: Point | undefined, transitionDuration: number | false | undefined }} beforeZoomTo\r\n * @prop {{ slide: Slide }} zoomPanUpdate\r\n * @prop {{ slide: Slide }} initialZoomPan\r\n * @prop {{ slide: Slide }} calcSlideSize\r\n * @prop {undefined} resolutionChanged\r\n * @prop {{ originalEvent: WheelEvent }} wheel can be default prevented\r\n * @prop {{ content: Content }} contentAppendImage can be default prevented\r\n * @prop {{ index: number; itemData: SlideData }} lazyLoadSlide can be default prevented\r\n * @prop {undefined} lazyLoad\r\n * @prop {{ slide: Slide }} calcBounds\r\n * @prop {{ zoomLevels: ZoomLevel, slideData: SlideData }} zoomLevelsUpdate\r\n *\r\n *\r\n * legacy\r\n *\r\n * @prop {undefined} init\r\n * @prop {undefined} initialZoomIn\r\n * @prop {undefined} initialZoomOut\r\n * @prop {undefined} initialZoomInEnd\r\n * @prop {undefined} initialZoomOutEnd\r\n * @prop {{ dataSource: DataSource | undefined, numItems: number }} numItems\r\n * @prop {{ itemData: SlideData; index: number }} itemData\r\n * @prop {{ index: number, itemData: SlideData, instance: PhotoSwipe }} thumbBounds\r\n */\n\n/**\r\n * @typedef {Object} PhotoSwipeFiltersMap https://photoswipe.com/filters/\r\n *\r\n * @prop {(numItems: number, dataSource: DataSource | undefined) => number} numItems\r\n * Modify the total amount of slides. Example on Data sources page.\r\n * https://photoswipe.com/filters/#numitems\r\n *\r\n * @prop {(itemData: SlideData, index: number) => SlideData} itemData\r\n * Modify slide item data. Example on Data sources page.\r\n * https://photoswipe.com/filters/#itemdata\r\n *\r\n * @prop {(itemData: SlideData, element: HTMLElement, linkEl: HTMLAnchorElement) => SlideData} domItemData\r\n * Modify item data when it's parsed from DOM element. Example on Data sources page.\r\n * https://photoswipe.com/filters/#domitemdata\r\n *\r\n * @prop {(clickedIndex: number, e: MouseEvent, instance: PhotoSwipeLightbox) => number} clickedIndex\r\n * Modify clicked gallery item index.\r\n * https://photoswipe.com/filters/#clickedindex\r\n *\r\n * @prop {(placeholderSrc: string | false, content: Content) => string | false} placeholderSrc\r\n * Modify placeholder image source.\r\n * https://photoswipe.com/filters/#placeholdersrc\r\n *\r\n * @prop {(isContentLoading: boolean, content: Content) => boolean} isContentLoading\r\n * Modify if the content is currently loading.\r\n * https://photoswipe.com/filters/#iscontentloading\r\n *\r\n * @prop {(isContentZoomable: boolean, content: Content) => boolean} isContentZoomable\r\n * Modify if the content can be zoomed.\r\n * https://photoswipe.com/filters/#iscontentzoomable\r\n *\r\n * @prop {(useContentPlaceholder: boolean, content: Content) => boolean} useContentPlaceholder\r\n * Modify if the placeholder should be used for the content.\r\n * https://photoswipe.com/filters/#usecontentplaceholder\r\n *\r\n * @prop {(isKeepingPlaceholder: boolean, content: Content) => boolean} isKeepingPlaceholder\r\n * Modify if the placeholder should be kept after the content is loaded.\r\n * https://photoswipe.com/filters/#iskeepingplaceholder\r\n *\r\n *\r\n * @prop {(contentErrorElement: HTMLElement, content: Content) => HTMLElement} contentErrorElement\r\n * Modify an element when the content has error state (for example, if image cannot be loaded).\r\n * https://photoswipe.com/filters/#contenterrorelement\r\n *\r\n * @prop {(element: HTMLElement, data: UIElementData) => HTMLElement} uiElement\r\n * Modify a UI element that's being created.\r\n * https://photoswipe.com/filters/#uielement\r\n *\r\n * @prop {(thumbnail: HTMLElement | null | undefined, itemData: SlideData, index: number) => HTMLElement} thumbEl\r\n * Modify the thumbnail element from which opening zoom animation starts or ends.\r\n * https://photoswipe.com/filters/#thumbel\r\n *\r\n * @prop {(thumbBounds: Bounds | undefined, itemData: SlideData, index: number) => Bounds} thumbBounds\r\n * Modify the thumbnail bounds from which opening zoom animation starts or ends.\r\n * https://photoswipe.com/filters/#thumbbounds\r\n *\r\n * @prop {(srcsetSizesWidth: number, content: Content) => number} srcsetSizesWidth\r\n *\r\n * @prop {(preventPointerEvent: boolean, event: PointerEvent, pointerType: string) => boolean} preventPointerEvent\r\n *\r\n */\n\n/**\r\n * @template {keyof PhotoSwipeFiltersMap} T\r\n * @typedef {{ fn: PhotoSwipeFiltersMap[T], priority: number }} Filter\r\n */\n\n/**\r\n * @template {keyof PhotoSwipeEventsMap} T\r\n * @typedef {PhotoSwipeEventsMap[T] extends undefined ? PhotoSwipeEvent<T> : PhotoSwipeEvent<T> & PhotoSwipeEventsMap[T]} AugmentedEvent\r\n */\n\n/**\r\n * @template {keyof PhotoSwipeEventsMap} T\r\n * @typedef {(event: AugmentedEvent<T>) => void} EventCallback\r\n */\n\n/**\r\n * Base PhotoSwipe event object\r\n *\r\n * @template {keyof PhotoSwipeEventsMap} T\r\n */\nclass PhotoSwipeEvent {\n /**\r\n * @param {T} type\r\n * @param {PhotoSwipeEventsMap[T]} [details]\r\n */\n constructor(type, details) {\n this.type = type;\n this.defaultPrevented = false;\n\n if (details) {\n Object.assign(this, details);\n }\n }\n\n preventDefault() {\n this.defaultPrevented = true;\n }\n\n}\n/**\r\n * PhotoSwipe base class that can listen and dispatch for events.\r\n * Shared by PhotoSwipe Core and PhotoSwipe Lightbox, extended by base.js\r\n */\n\n\nclass Eventable {\n constructor() {\n /**\r\n * @type {{ [T in keyof PhotoSwipeEventsMap]?: ((event: AugmentedEvent<T>) => void)[] }}\r\n */\n this._listeners = {};\n /**\r\n * @type {{ [T in keyof PhotoSwipeFiltersMap]?: Filter<T>[] }}\r\n */\n\n this._filters = {};\n /** @type {PhotoSwipe | undefined} */\n\n this.pswp = undefined;\n /** @type {PhotoSwipeOptions | undefined} */\n\n this.options = undefined;\n }\n /**\r\n * @template {keyof PhotoSwipeFiltersMap} T\r\n * @param {T} name\r\n * @param {PhotoSwipeFiltersMap[T]} fn\r\n * @param {number} priority\r\n */\n\n\n addFilter(name, fn, priority = 100) {\n var _this$_filters$name, _this$_filters$name2, _this$pswp;\n\n if (!this._filters[name]) {\n this._filters[name] = [];\n }\n\n (_this$_filters$name = this._filters[name]) === null || _this$_filters$name === void 0 || _this$_filters$name.push({\n fn,\n priority\n });\n (_this$_filters$name2 = this._filters[name]) === null || _this$_filters$name2 === void 0 || _this$_filters$name2.sort((f1, f2) => f1.priority - f2.priority);\n (_this$pswp = this.pswp) === null || _this$pswp === void 0 || _this$pswp.addFilter(name, fn, priority);\n }\n /**\r\n * @template {keyof PhotoSwipeFiltersMap} T\r\n * @param {T} name\r\n * @param {PhotoSwipeFiltersMap[T]} fn\r\n */\n\n\n removeFilter(name, fn) {\n if (this._filters[name]) {\n // @ts-expect-error\n this._filters[name] = this._filters[name].filter(filter => filter.fn !== fn);\n }\n\n if (this.pswp) {\n this.pswp.removeFilter(name, fn);\n }\n }\n /**\r\n * @template {keyof PhotoSwipeFiltersMap} T\r\n * @param {T} name\r\n * @param {Parameters<PhotoSwipeFiltersMap[T]>} args\r\n * @returns {Parameters<PhotoSwipeFiltersMap[T]>[0]}\r\n */\n\n\n applyFilters(name, ...args) {\n var _this$_filters$name3;\n\n (_this$_filters$name3 = this._filters[name]) === null || _this$_filters$name3 === void 0 || _this$_filters$name3.forEach(filter => {\n // @ts-expect-error\n args[0] = filter.fn.apply(this, args);\n });\n return args[0];\n }\n /**\r\n * @template {keyof PhotoSwipeEventsMap} T\r\n * @param {T} name\r\n * @param {EventCallback<T>} fn\r\n */\n\n\n on(name, fn) {\n var _this$_listeners$name, _this$pswp2;\n\n if (!this._listeners[name]) {\n this._listeners[name] = [];\n }\n\n (_this$_listeners$name = this._listeners[name]) === null || _this$_listeners$name === void 0 || _this$_listeners$name.push(fn); // When binding events to lightbox,\n // also bind events to PhotoSwipe Core,\n // if it's open.\n\n (_this$pswp2 = this.pswp) === null || _this$pswp2 === void 0 || _this$pswp2.on(name, fn);\n }\n /**\r\n * @template {keyof PhotoSwipeEventsMap} T\r\n * @param {T} name\r\n * @param {EventCallback<T>} fn\r\n */\n\n\n off(name, fn) {\n var _this$pswp3;\n\n if (this._listeners[name]) {\n // @ts-expect-error\n this._listeners[name] = this._listeners[name].filter(listener => fn !== listener);\n }\n\n (_this$pswp3 = this.pswp) === null || _this$pswp3 === void 0 || _this$pswp3.off(name, fn);\n }\n /**\r\n * @template {keyof PhotoSwipeEventsMap} T\r\n * @param {T} name\r\n * @param {PhotoSwipeEventsMap[T]} [details]\r\n * @returns {AugmentedEvent<T>}\r\n */\n\n\n dispatch(name, details) {\n var _this$_listeners$name2;\n\n if (this.pswp) {\n return this.pswp.dispatch(name, details);\n }\n\n const event =\n /** @type {AugmentedEvent<T>} */\n new PhotoSwipeEvent(name, details);\n (_this$_listeners$name2 = this._listeners[name]) === null || _this$_listeners$name2 === void 0 || _this$_listeners$name2.forEach(listener => {\n listener.call(this, event);\n });\n return event;\n }\n\n}\n\nclass Placeholder {\n /**\r\n * @param {string | false} imageSrc\r\n * @param {HTMLElement} container\r\n */\n constructor(imageSrc, container) {\n // Create placeholder\n // (stretched thumbnail or simple div behind the main image)\n\n /** @type {HTMLImageElement | HTMLDivElement | null} */\n this.element = createElement('pswp__img pswp__img--placeholder', imageSrc ? 'img' : 'div', container);\n\n if (imageSrc) {\n const imgEl =\n /** @type {HTMLImageElement} */\n this.element;\n imgEl.decoding = 'async';\n imgEl.alt = '';\n imgEl.src = imageSrc;\n imgEl.setAttribute('role', 'presentation');\n }\n\n this.element.setAttribute('aria-hidden', 'true');\n }\n /**\r\n * @param {number} width\r\n * @param {number} height\r\n */\n\n\n setDisplayedSize(width, height) {\n if (!this.element) {\n return;\n }\n\n if (this.element.tagName === 'IMG') {\n // Use transform scale() to modify img placeholder size\n // (instead of changing width/height directly).\n // This helps with performance, specifically in iOS15 Safari.\n setWidthHeight(this.element, 250, 'auto');\n this.element.style.transformOrigin = '0 0';\n this.element.style.transform = toTransformString(0, 0, width / 250);\n } else {\n setWidthHeight(this.element, width, height);\n }\n }\n\n destroy() {\n var _this$element;\n\n if ((_this$element = this.element) !== null && _this$element !== void 0 && _this$element.parentNode) {\n this.element.remove();\n }\n\n this.element = null;\n }\n\n}\n\n/** @typedef {import('./slide.js').default} Slide */\n\n/** @typedef {import('./slide.js').SlideData} SlideData */\n\n/** @typedef {import('../core/base.js').default} PhotoSwipeBase */\n\n/** @typedef {import('../util/util.js').LoadState} LoadState */\n\nclass Content {\n /**\r\n * @param {SlideData} itemData Slide data\r\n * @param {PhotoSwipeBase} instance PhotoSwipe or PhotoSwipeLightbox instance\r\n * @param {number} index\r\n */\n constructor(itemData, instance, index) {\n this.instance = instance;\n this.data = itemData;\n this.index = index;\n /** @type {HTMLImageElement | HTMLDivElement | undefined} */\n\n this.element = undefined;\n /** @type {Placeholder | undefined} */\n\n this.placeholder = undefined;\n /** @type {Slide | undefined} */\n\n this.slide = undefined;\n this.displayedImageWidth = 0;\n this.displayedImageHeight = 0;\n this.width = Number(this.data.w) || Number(this.data.width) || 0;\n this.height = Number(this.data.h) || Number(this.data.height) || 0;\n this.isAttached = false;\n this.hasSlide = false;\n this.isDecoding = false;\n /** @type {LoadState} */\n\n this.state = LOAD_STATE.IDLE;\n\n if (this.data.type) {\n this.type = this.data.type;\n } else if (this.data.src) {\n this.type = 'image';\n } else {\n this.type = 'html';\n }\n\n this.instance.dispatch('contentInit', {\n content: this\n });\n }\n\n removePlaceholder() {\n if (this.placeholder && !this.keepPlaceholder()) {\n // With delay, as image might be loaded, but not rendered\n setTimeout(() => {\n if (this.placeholder) {\n this.placeholder.destroy();\n this.placeholder = undefined;\n }\n }, 1000);\n }\n }\n /**\r\n * Preload content\r\n *\r\n * @param {boolean} isLazy\r\n * @param {boolean} [reload]\r\n */\n\n\n load(isLazy, reload) {\n if (this.slide && this.usePlaceholder()) {\n if (!this.placeholder) {\n const placeholderSrc = this.instance.applyFilters('placeholderSrc', // use image-based placeholder only for the first slide,\n // as rendering (even small stretched thumbnail) is an expensive operation\n this.data.msrc && this.slide.isFirstSlide ? this.data.msrc : false, this);\n this.placeholder = new Placeholder(placeholderSrc, this.slide.container);\n } else {\n const placeholderEl = this.placeholder.element; // Add placeholder to DOM if it was already created\n\n if (placeholderEl && !placeholderEl.parentElement) {\n this.slide.container.prepend(placeholderEl);\n }\n }\n }\n\n if (this.element && !reload) {\n return;\n }\n\n if (this.instance.dispatch('contentLoad', {\n content: this,\n isLazy\n }).defaultPrevented) {\n return;\n }\n\n if (this.isImageContent()) {\n this.element = createElement('pswp__img', 'img'); // Start loading only after width is defined, as sizes might depend on it.\n // Due to Safari feature, we must define sizes before srcset.\n\n if (this.displayedImageWidth) {\n this.loadImage(isLazy);\n }\n } else {\n this.element = createElement('pswp__content', 'div');\n this.element.innerHTML = this.data.html || '';\n }\n\n if (reload && this.slide) {\n this.slide.updateContentSize(true);\n }\n }\n /**\r\n * Preload image\r\n *\r\n * @param {boolean} isLazy\r\n */\n\n\n loadImage(isLazy) {\n var _this$data$src, _this$data$alt;\n\n if (!this.isImageContent() || !this.element || this.instance.dispatch('contentLoadImage', {\n content: this,\n isLazy\n }).defaultPrevented) {\n return;\n }\n\n const imageElement =\n /** @type HTMLImageElement */\n this.element;\n this.updateSrcsetSizes();\n\n if (this.data.srcset) {\n imageElement.srcset = this.data.srcset;\n }\n\n imageElement.src = (_this$data$src = this.data.src) !== null && _this$data$src !== void 0 ? _this$data$src : '';\n imageElement.alt = (_this$data$alt = this.data.alt) !== null && _this$data$alt !== void 0 ? _this$data$alt : '';\n this.state = LOAD_STATE.LOADING;\n\n if (imageElement.complete) {\n this.onLoaded();\n } else {\n imageElement.onload = () => {\n this.onLoaded();\n };\n\n imageElement.onerror = () => {\n this.onError();\n };\n }\n }\n /**\r\n * Assign slide to content\r\n *\r\n * @param {Slide} slide\r\n */\n\n\n setSlide(slide) {\n this.slide = slide;\n this.hasSlide = true;\n this.instance = slide.pswp; // todo: do we need to unset slide?\n }\n /**\r\n * Content load success handler\r\n */\n\n\n onLoaded() {\n this.state = LOAD_STATE.LOADED;\n\n if (this.slide && this.element) {\n this.instance.dispatch('loadComplete', {\n slide: this.slide,\n content: this\n }); // if content is reloaded\n\n if (this.slide.isActive && this.slide.heavyAppended && !this.element.parentNode) {\n this.append();\n this.slide.updateContentSize(true);\n }\n\n if (this.state === LOAD_STATE.LOADED || this.state === LOAD_STATE.ERROR) {\n this.removePlaceholder();\n }\n }\n }\n /**\r\n * Content load error handler\r\n */\n\n\n onError() {\n this.state = LOAD_STATE.ERROR;\n\n if (this.slide) {\n this.displayError();\n this.instance.dispatch('loadComplete', {\n slide: this.slide,\n isError: true,\n content: this\n });\n this.instance.dispatch('loadError', {\n slide: this.slide,\n content: this\n });\n }\n }\n /**\r\n * @returns {Boolean} If the content is currently loading\r\n */\n\n\n isLoading() {\n return this.instance.applyFilters('isContentLoading', this.state === LOAD_STATE.LOADING, this);\n }\n /**\r\n * @returns {Boolean} If the content is in error state\r\n */\n\n\n isError() {\n return this.state === LOAD_STATE.ERROR;\n }\n /**\r\n * @returns {boolean} If the content is image\r\n */\n\n\n isImageContent() {\n return this.type === 'image';\n }\n /**\r\n * Update content size\r\n *\r\n * @param {Number} width\r\n * @param {Number} height\r\n */\n\n\n setDisplayedSize(width, height) {\n if (!this.element) {\n return;\n }\n\n if (this.placeholder) {\n this.placeholder.setDisplayedSize(width, height);\n }\n\n if (this.instance.dispatch('contentResize', {\n content: this,\n width,\n height\n }).defaultPrevented) {\n return;\n }\n\n setWidthHeight(this.element, width, height);\n\n if (this.isImageContent() && !this.isError()) {\n const isInitialSizeUpdate = !this.displayedImageWidth && width;\n this.displayedImageWidth = width;\n this.displayedImageHeight = height;\n\n if (isInitialSizeUpdate) {\n this.loadImage(false);\n } else {\n this.updateSrcsetSizes();\n }\n\n if (this.slide) {\n this.instance.dispatch('imageSizeChange', {\n slide: this.slide,\n width,\n height,\n content: this\n });\n }\n }\n }\n /**\r\n * @returns {boolean} If the content can be zoomed\r\n */\n\n\n isZoomable() {\n return this.instance.applyFilters('isContentZoomable', this.isImageContent() && this.state !== LOAD_STATE.ERROR, this);\n }\n /**\r\n * Update image srcset sizes attribute based on width and height\r\n */\n\n\n updateSrcsetSizes() {\n // Handle srcset sizes attribute.\n //\n // Never lower quality, if it was increased previously.\n // Chrome does this automatically, Firefox and Safari do not,\n // so we store largest used size in dataset.\n if (!this.isImageContent() || !this.element || !this.data.srcset) {\n return;\n }\n\n const image =\n /** @type HTMLImageElement */\n this.element;\n const sizesWidth = this.instance.applyFilters('srcsetSizesWidth', this.displayedImageWidth, this);\n\n if (!image.dataset.largestUsedSize || sizesWidth > parseInt(image.dataset.largestUsedSize, 10)) {\n image.sizes = sizesWidth + 'px';\n image.dataset.largestUsedSize = String(sizesWidth);\n }\n }\n /**\r\n * @returns {boolean} If content should use a placeholder (from msrc by default)\r\n */\n\n\n usePlaceholder() {\n return this.instance.applyFilters('useContentPlaceholder', this.isImageContent(), this);\n }\n /**\r\n * Preload content with lazy-loading param\r\n */\n\n\n lazyLoad() {\n if (this.instance.dispatch('contentLazyLoad', {\n content: this\n }).defaultPrevented) {\n return;\n }\n\n this.load(true);\n }\n /**\r\n * @returns {boolean} If placeholder should be kept after content is loaded\r\n */\n\n\n keepPlaceholder() {\n return this.instance.applyFilters('isKeepingPlaceholder', this.isLoading(), this);\n }\n /**\r\n * Destroy the content\r\n */\n\n\n destroy() {\n this.hasSlide = false;\n this.slide = undefined;\n\n if (this.instance.dispatch('contentDestroy', {\n content: this\n }).defaultPrevented) {\n return;\n }\n\n this.remove();\n\n if (this.placeholder) {\n this.placeholder.destroy();\n this.placeholder = undefined;\n }\n\n if (this.isImageContent() && this.element) {\n this.element.onload = null;\n this.element.onerror = null;\n this.element = undefined;\n }\n }\n /**\r\n * Display error message\r\n */\n\n\n displayError() {\n if (this.slide) {\n var _this$instance$option, _this$instance$option2;\n\n let errorMsgEl = createElement('pswp__error-msg', 'div');\n errorMsgEl.innerText = (_this$instance$option = (_this$instance$option2 = this.instance.options) === null || _this$instance$option2 === void 0 ? void 0 : _this$instance$option2.errorMsg) !== null && _this$instance$option !== void 0 ? _this$instance$option : '';\n errorMsgEl =\n /** @type {HTMLDivElement} */\n this.instance.applyFilters('contentErrorElement', errorMsgEl, this);\n this.element = createElement('pswp__content pswp__error-msg-container', 'div');\n this.element.appendChild(errorMsgEl);\n this.slide.container.innerText = '';\n this.slide.container.appendChild(this.element);\n this.slide.updateContentSize(true);\n this.removePlaceholder();\n }\n }\n /**\r\n * Append the content\r\n */\n\n\n append() {\n if (this.isAttached || !this.element) {\n return;\n }\n\n this.isAttached = true;\n\n if (this.state === LOAD_STATE.ERROR) {\n this.displayError();\n return;\n }\n\n if (this.instance.dispatch('contentAppend', {\n content: this\n }).defaultPrevented) {\n return;\n }\n\n const supportsDecode = ('decode' in this.element);\n\n if (this.isImageContent()) {\n // Use decode() on nearby slides\n //\n // Nearby slide images are in DOM and not hidden via display:none.\n // However, they are placed offscreen (to the left and right side).\n //\n // Some browsers do not composite the image until it's actually visible,\n // using decode() helps.\n //\n // You might ask \"why dont you just decode() and then append all images\",\n // that's because I want to show image before it's fully loaded,\n // as browser can render parts of image while it is loading.\n // We do not do this in Safari due to partial loading bug.\n if (supportsDecode && this.slide && (!this.slide.isActive || isSafari())) {\n this.isDecoding = true; // purposefully using finally instead of then,\n // as if srcset sizes changes dynamically - it may cause decode error\n\n /** @type {HTMLImageElement} */\n\n this.element.decode().catch(() => {}).finally(() => {\n this.isDecoding = false;\n this.appendImage();\n });\n } else {\n this.appendImage();\n }\n } else if (this.slide && !this.element.parentNode) {\n this.slide.container.appendChild(this.element);\n }\n }\n /**\r\n * Activate the slide,\r\n * active slide is generally the current one,\r\n * meaning the user can see it.\r\n */\n\n\n activate() {\n if (this.instance.dispatch('contentActivate', {\n content: this\n }).defaultPrevented || !this.slide) {\n return;\n }\n\n if (this.isImageContent() && this.isDecoding && !isSafari()) {\n // add image to slide when it becomes active,\n // even if it's not finished decoding\n this.appendImage();\n } else if (this.isError()) {\n this.load(false, true); // try to reload\n }\n\n if (this.slide.holderElement) {\n this.slide.holderElement.setAttribute('aria-hidden', 'false');\n }\n }\n /**\r\n * Deactivate the content\r\n */\n\n\n deactivate() {\n this.instance.dispatch('contentDeactivate', {\n content: this\n });\n\n if (this.slide && this.slide.holderElement) {\n this.slide.holderElement.setAttribute('aria-hidden', 'true');\n }\n }\n /**\r\n * Remove the content from DOM\r\n */\n\n\n remove() {\n this.isAttached = false;\n\n if (this.instance.dispatch('contentRemove', {\n content: this\n }).defaultPrevented) {\n return;\n }\n\n if (this.element && this.element.parentNode) {\n this.element.remove();\n }\n\n if (this.placeholder && this.placeholder.element) {\n this.placeholder.element.remove();\n }\n }\n /**\r\n * Append the image content to slide container\r\n */\n\n\n appendImage() {\n if (!this.isAttached) {\n return;\n }\n\n if (this.instance.dispatch('contentAppendImage', {\n content: this\n }).defaultPrevented) {\n return;\n } // ensure that element exists and is not already appended\n\n\n if (this.slide && this.element && !this.element.parentNode) {\n this.slide.container.appendChild(this.element);\n }\n\n if (this.state === LOAD_STATE.LOADED || this.state === LOAD_STATE.ERROR) {\n this.removePlaceholder();\n }\n }\n\n}\n\n/** @typedef {import('./content.js').default} Content */\n\n/** @typedef {import('./slide.js').default} Slide */\n\n/** @typedef {import('./slide.js').SlideData} SlideData */\n\n/** @typedef {import('../core/base.js').default} PhotoSwipeBase */\n\n/** @typedef {import('../photoswipe.js').default} PhotoSwipe */\n\nconst MIN_SLIDES_TO_CACHE = 5;\n/**\r\n * Lazy-load an image\r\n * This function is used both by Lightbox and PhotoSwipe core,\r\n * thus it can be called before dialog is opened.\r\n *\r\n * @param {SlideData} itemData Data about the slide\r\n * @param {PhotoSwipeBase} instance PhotoSwipe or PhotoSwipeLightbox instance\r\n * @param {number} index\r\n * @returns {Content} Image that is being decoded or false.\r\n */\n\nfunction lazyLoadData(itemData, instance, index) {\n const content = instance.createContentFromData(itemData, index);\n /** @type {ZoomLevel | undefined} */\n\n let zoomLevel;\n const {\n options\n } = instance; // We need to know dimensions of the image to preload it,\n // as it might use srcset, and we need to define sizes\n\n if (options) {\n zoomLevel = new ZoomLevel(options, itemData, -1);\n let viewportSize;\n\n if (instance.pswp) {\n viewportSize = instance.pswp.viewportSize;\n } else {\n viewportSize = getViewportSize(options, instance);\n }\n\n const panAreaSize = getPanAreaSize(options, viewportSize, itemData, index);\n zoomLevel.update(content.width, content.height, panAreaSize);\n }\n\n content.lazyLoad();\n\n if (zoomLevel) {\n content.setDisplayedSize(Math.ceil(content.width * zoomLevel.initial), Math.ceil(content.height * zoomLevel.initial));\n }\n\n return content;\n}\n/**\r\n * Lazy-loads specific slide.\r\n * This function is used both by Lightbox and PhotoSwipe core,\r\n * thus it can be called before dialog is opened.\r\n *\r\n * By default, it loads image based on viewport size and initial zoom level.\r\n *\r\n * @param {number} index Slide index\r\n * @param {PhotoSwipeBase} instance PhotoSwipe or PhotoSwipeLightbox eventable instance\r\n * @returns {Content | undefined}\r\n */\n\nfunction lazyLoadSlide(index, instance) {\n const itemData = instance.getItemData(index);\n\n if (instance.dispatch('lazyLoadSlide', {\n index,\n itemData\n }).defaultPrevented) {\n return;\n }\n\n return lazyLoadData(itemData, instance, index);\n}\n\nclass ContentLoader {\n /**\r\n * @param {PhotoSwipe} pswp\r\n */\n constructor(pswp) {\n this.pswp = pswp; // Total amount of cached images\n\n this.limit = Math.max(pswp.options.preload[0] + pswp.options.preload[1] + 1, MIN_SLIDES_TO_CACHE);\n /** @type {Content[]} */\n\n this._cachedItems = [];\n }\n /**\r\n * Lazy load nearby slides based on `preload` option.\r\n *\r\n * @param {number} [diff] Difference between slide indexes that was changed recently, or 0.\r\n */\n\n\n updateLazy(diff) {\n const {\n pswp\n } = this;\n\n if (pswp.dispatch('lazyLoad').defaultPrevented) {\n return;\n }\n\n const {\n preload\n } = pswp.options;\n const isForward = diff === undefined ? true : diff >= 0;\n let i; // preload[1] - num items to preload in forward direction\n\n for (i = 0; i <= preload[1]; i++) {\n this.loadSlideByIndex(pswp.currIndex + (isForward ? i : -i));\n } // preload[0] - num items to preload in backward direction\n\n\n for (i = 1; i <= preload[0]; i++) {\n this.loadSlideByIndex(pswp.currIndex + (isForward ? -i : i));\n }\n }\n /**\r\n * @param {number} initialIndex\r\n */\n\n\n loadSlideByIndex(initialIndex) {\n const index = this.pswp.getLoopedIndex(initialIndex); // try to get cached content\n\n let content = this.getContentByIndex(index);\n\n if (!content) {\n // no cached content, so try to load from scratch:\n content = lazyLoadSlide(index, this.pswp); // if content can be loaded, add it to cache:\n\n if (content) {\n this.addToCache(content);\n }\n }\n }\n /**\r\n * @param {Slide} slide\r\n * @returns {Content}\r\n */\n\n\n getContentBySlide(slide) {\n let content = this.getContentByIndex(slide.index);\n\n if (!content) {\n // create content if not found in cache\n content = this.pswp.createContentFromData(slide.data, slide.index);\n this.addToCache(content);\n } // assign slide to content\n\n\n content.setSlide(slide);\n return content;\n }\n /**\r\n * @param {Content} content\r\n */\n\n\n addToCache(content) {\n // move to the end of array\n this.removeByIndex(content.index);\n\n this._cachedItems.push(content);\n\n if (this._cachedItems.length > this.limit) {\n // Destroy the first content that's not attached\n const indexToRemove = this._cachedItems.findIndex(item => {\n return !item.isAttached && !item.hasSlide;\n });\n\n if (indexToRemove !== -1) {\n const removedItem = this._cachedItems.splice(indexToRemove, 1)[0];\n\n removedItem.destroy();\n }\n }\n }\n /**\r\n * Removes an image from cache, does not destroy() it, just removes.\r\n *\r\n * @param {number} index\r\n */\n\n\n removeByIndex(index) {\n const indexToRemove = this._cachedItems.findIndex(item => item.index === index);\n\n if (indexToRemove !== -1) {\n this._cachedItems.splice(indexToRemove, 1);\n }\n }\n /**\r\n * @param {number} index\r\n * @returns {Content | undefined}\r\n */\n\n\n getContentByIndex(index) {\n return this._cachedItems.find(content => content.index === index);\n }\n\n destroy() {\n this._cachedItems.forEach(content => content.destroy());\n\n this._cachedItems = [];\n }\n\n}\n\n/** @typedef {import(\"../photoswipe.js\").default} PhotoSwipe */\n\n/** @typedef {import(\"../slide/slide.js\").SlideData} SlideData */\n\n/**\r\n * PhotoSwipe base class that can retrieve data about every slide.\r\n * Shared by PhotoSwipe Core and PhotoSwipe Lightbox\r\n */\n\nclass PhotoSwipeBase extends Eventable {\n /**\r\n * Get total number of slides\r\n *\r\n * @returns {number}\r\n */\n getNumItems() {\n var _this$options;\n\n let numItems = 0;\n const dataSource = (_this$options = this.options) === null || _this$options === void 0 ? void 0 : _this$options.dataSource;\n\n if (dataSource && 'length' in dataSource) {\n // may be an array or just object with length property\n numItems = dataSource.length;\n } else if (dataSource && 'gallery' in dataSource) {\n // query DOM elements\n if (!dataSource.items) {\n dataSource.items = this._getGalleryDOMElements(dataSource.gallery);\n }\n\n if (dataSource.items) {\n numItems = dataSource.items.length;\n }\n } // legacy event, before filters were introduced\n\n\n const event = this.dispatch('numItems', {\n dataSource,\n numItems\n });\n return this.applyFilters('numItems', event.numItems, dataSource);\n }\n /**\r\n * @param {SlideData} slideData\r\n * @param {number} index\r\n * @returns {Content}\r\n */\n\n\n createContentFromData(slideData, index) {\n return new Content(slideData, this, index);\n }\n /**\r\n * Get item data by index.\r\n *\r\n * \"item data\" should contain normalized information that PhotoSwipe needs to generate a slide.\r\n * For example, it may contain properties like\r\n * `src`, `srcset`, `w`, `h`, which will be used to generate a slide with image.\r\n *\r\n * @param {number} index\r\n * @returns {SlideData}\r\n */\n\n\n getItemData(index) {\n var _this$options2;\n\n const dataSource = (_this$options2 = this.options) === null || _this$options2 === void 0 ? void 0 : _this$options2.dataSource;\n /** @type {SlideData | HTMLElement} */\n\n let dataSourceItem = {};\n\n if (Array.isArray(dataSource)) {\n // Datasource is an array of elements\n dataSourceItem = dataSource[index];\n } else if (dataSource && 'gallery' in dataSource) {\n // dataSource has gallery property,\n // thus it was created by Lightbox, based on\n // gallery and children options\n // query DOM elements\n if (!dataSource.items) {\n dataSource.items = this._getGalleryDOMElements(dataSource.gallery);\n }\n\n dataSourceItem = dataSource.items[index];\n }\n\n let itemData = dataSourceItem;\n\n if (itemData instanceof Element) {\n itemData = this._domElementToItemData(itemData);\n } // Dispatching the itemData event,\n // it's a legacy verion before filters were introduced\n\n\n const event = this.dispatch('itemData', {\n itemData: itemData || {},\n index\n });\n return this.applyFilters('itemData', event.itemData, index);\n }\n /**\r\n * Get array of gallery DOM elements,\r\n * based on childSelector and gallery element.\r\n *\r\n * @param {HTMLElement} galleryElement\r\n * @returns {HTMLElement[]}\r\n */\n\n\n _getGalleryDOMElements(galleryElement) {\n var _this$options3, _this$options4;\n\n if ((_this$options3 = this.options) !== null && _this$options3 !== void 0 && _this$options3.children || (_this$options4 = this.options) !== null && _this$options4 !== void 0 && _this$options4.childSelector) {\n return getElementsFromOption(this.options.children, this.options.childSelector, galleryElement) || [];\n }\n\n return [galleryElement];\n }\n /**\r\n * Converts DOM element to item data object.\r\n *\r\n * @param {HTMLElement} element DOM element\r\n * @returns {SlideData}\r\n */\n\n\n _domElementToItemData(element) {\n /** @type {SlideData} */\n const itemData = {\n element\n };\n const linkEl =\n /** @type {HTMLAnchorElement} */\n element.tagName === 'A' ? element : element.querySelector('a');\n\n if (linkEl) {\n // src comes from data-pswp-src attribute,\n // if it's empty link href is used\n itemData.src = linkEl.dataset.pswpSrc || linkEl.href;\n\n if (linkEl.dataset.pswpSrcset) {\n itemData.srcset = linkEl.dataset.pswpSrcset;\n }\n\n itemData.width = linkEl.dataset.pswpWidth ? parseInt(linkEl.dataset.pswpWidth, 10) : 0;\n itemData.height = linkEl.dataset.pswpHeight ? parseInt(linkEl.dataset.pswpHeight, 10) : 0; // support legacy w & h properties\n\n itemData.w = itemData.width;\n itemData.h = itemData.height;\n\n if (linkEl.dataset.pswpType) {\n itemData.type = linkEl.dataset.pswpType;\n }\n\n const thumbnailEl = element.querySelector('img');\n\n if (thumbnailEl) {\n var _thumbnailEl$getAttri;\n\n // msrc is URL to placeholder image that's displayed before large image is loaded\n // by default it's displayed only for the first slide\n itemData.msrc = thumbnailEl.currentSrc || thumbnailEl.src;\n itemData.alt = (_thumbnailEl$getAttri = thumbnailEl.getAttribute('alt')) !== null && _thumbnailEl$getAttri !== void 0 ? _thumbnailEl$getAttri : '';\n }\n\n if (linkEl.dataset.pswpCropped || linkEl.dataset.cropped) {\n itemData.thumbCropped = true;\n }\n }\n\n return this.applyFilters('domItemData', itemData, element, linkEl);\n }\n /**\r\n * Lazy-load by slide data\r\n *\r\n * @param {SlideData} itemData Data about the slide\r\n * @param {number} index\r\n * @returns {Content} Image that is being decoded or false.\r\n */\n\n\n lazyLoadData(itemData, index) {\n return lazyLoadData(itemData, this, index);\n }\n\n}\n\n/** @typedef {import('./photoswipe.js').default} PhotoSwipe */\n\n/** @typedef {import('./slide/get-thumb-bounds.js').Bounds} Bounds */\n\n/** @typedef {import('./util/animations.js').AnimationProps} AnimationProps */\n// some browsers do not paint\n// elements which opacity is set to 0,\n// since we need to pre-render elements for the animation -\n// we set it to the minimum amount\n\nconst MIN_OPACITY = 0.003;\n/**\r\n * Manages opening and closing transitions of the PhotoSwipe.\r\n *\r\n * It can perform zoom, fade or no transition.\r\n */\n\nclass Opener {\n /**\r\n * @param {PhotoSwipe} pswp\r\n */\n constructor(pswp) {\n this.pswp = pswp;\n this.isClosed = true;\n this.isOpen = false;\n this.isClosing = false;\n this.isOpening = false;\n /**\r\n * @private\r\n * @type {number | false | undefined}\r\n */\n\n this._duration = undefined;\n /** @private */\n\n this._useAnimation = false;\n /** @private */\n\n this._croppedZoom = false;\n /** @private */\n\n this._animateRootOpacity = false;\n /** @private */\n\n this._animateBgOpacity = false;\n /**\r\n * @private\r\n * @type { HTMLDivElement | HTMLImageElement | null | undefined }\r\n */\n\n this._placeholder = undefined;\n /**\r\n * @private\r\n * @type { HTMLDivElement | undefined }\r\n */\n\n this._opacityElement = undefined;\n /**\r\n * @private\r\n * @type { HTMLDivElement | undefined }\r\n */\n\n this._cropContainer1 = undefined;\n /**\r\n * @private\r\n * @type { HTMLElement | null | undefined }\r\n */\n\n this._cropContainer2 = undefined;\n /**\r\n * @private\r\n * @type {Bounds | undefined}\r\n */\n\n this._thumbBounds = undefined;\n this._prepareOpen = this._prepareOpen.bind(this); // Override initial zoom and pan position\n\n pswp.on('firstZoomPan', this._prepareOpen);\n }\n\n open() {\n this._prepareOpen();\n\n this._start();\n }\n\n close() {\n if (this.isClosed || this.isClosing || this.isOpening) {\n // if we close during opening animation\n // for now do nothing,\n // browsers aren't good at changing the direction of the CSS transition\n return;\n }\n\n const slide = this.pswp.currSlide;\n this.isOpen = false;\n this.isOpening = false;\n this.isClosing = true;\n this._duration = this.pswp.options.hideAnimationDuration;\n\n if (slide && slide.currZoomLevel * slide.width >= this.pswp.options.maxWidthToAnimate) {\n this._duration = 0;\n }\n\n this._applyStartProps();\n\n setTimeout(() => {\n this._start();\n }, this._croppedZoom ? 30 : 0);\n }\n /** @private */\n\n\n _prepareOpen() {\n this.pswp.off('firstZoomPan', this._prepareOpen);\n\n if (!this.isOpening) {\n const slide = this.pswp.currSlide;\n this.isOpening = true;\n this.isClosing = false;\n this._duration = this.pswp.options.showAnimationDuration;\n\n if (slide && slide.zoomLevels.initial * slide.width >= this.pswp.options.maxWidthToAnimate) {\n this._duration = 0;\n }\n\n this._applyStartProps();\n }\n }\n /** @private */\n\n\n _applyStartProps() {\n const {\n pswp\n } = this;\n const slide = this.pswp.currSlide;\n const {\n options\n } = pswp;\n\n if (options.showHideAnimationType === 'fade') {\n options.showHideOpacity = true;\n this._thumbBounds = undefined;\n } else if (options.showHideAnimationType === 'none') {\n options.showHideOpacity = false;\n this._duration = 0;\n this._thumbBounds = undefined;\n } else if (this.isOpening && pswp._initialThumbBounds) {\n // Use initial bounds if defined\n this._thumbBounds = pswp._initialThumbBounds;\n } else {\n this._thumbBounds = this.pswp.getThumbBounds();\n }\n\n this._placeholder = slide === null || slide === void 0 ? void 0 : slide.getPlaceholderElement();\n pswp.animations.stopAll(); // Discard animations when duration is less than 50ms\n\n this._useAnimation = Boolean(this._duration && this._duration > 50);\n this._animateZoom = Boolean(this._thumbBounds) && (slide === null || slide === void 0 ? void 0 : slide.content.usePlaceholder()) && (!this.isClosing || !pswp.mainScroll.isShifted());\n\n if (!this._animateZoom) {\n this._animateRootOpacity = true;\n\n if (this.isOpening && slide) {\n slide.zoomAndPanToInitial();\n slide.applyCurrentZoomPan();\n }\n } else {\n var _options$showHideOpac;\n\n this._animateRootOpacity = (_options$showHideOpac = options.showHideOpacity) !== null && _options$showHideOpac !== void 0 ? _options$showHideOpac : false;\n }\n\n this._animateBgOpacity = !this._animateRootOpacity && this.pswp.options.bgOpacity > MIN_OPACITY;\n this._opacityElement = this._animateRootOpacity ? pswp.element : pswp.bg;\n\n if (!this._useAnimation) {\n this._duration = 0;\n this._animateZoom = false;\n this._animateBgOpacity = false;\n this._animateRootOpacity = true;\n\n if (this.isOpening) {\n if (pswp.element) {\n pswp.element.style.opacity = String(MIN_OPACITY);\n }\n\n pswp.applyBgOpacity(1);\n }\n\n return;\n }\n\n if (this._animateZoom && this._thumbBounds && this._thumbBounds.innerRect) {\n var _this$pswp$currSlide;\n\n // Properties are used when animation from cropped thumbnail\n this._croppedZoom = true;\n this._cropContainer1 = this.pswp.container;\n this._cropContainer2 = (_this$pswp$currSlide = this.pswp.currSlide) === null || _this$pswp$currSlide === void 0 ? void 0 : _this$pswp$currSlide.holderElement;\n\n if (pswp.container) {\n pswp.container.style.overflow = 'hidden';\n pswp.container.style.width = pswp.viewportSize.x + 'px';\n }\n } else {\n this._croppedZoom = false;\n }\n\n if (this.isOpening) {\n // Apply styles before opening transition\n if (this._animateRootOpacity) {\n if (pswp.element) {\n pswp.element.style.opacity = String(MIN_OPACITY);\n }\n\n pswp.applyBgOpacity(1);\n } else {\n if (this._animateBgOpacity && pswp.bg) {\n pswp.bg.style.opacity = String(MIN_OPACITY);\n }\n\n if (pswp.element) {\n pswp.element.style.opacity = '1';\n }\n }\n\n if (this._animateZoom) {\n this._setClosedStateZoomPan();\n\n if (this._placeholder) {\n // tell browser that we plan to animate the placeholder\n this._placeholder.style.willChange = 'transform'; // hide placeholder to allow hiding of\n // elements that overlap it (such as icons over the thumbnail)\n\n this._placeholder.style.opacity = String(MIN_OPACITY);\n }\n }\n } else if (this.isClosing) {\n // hide nearby slides to make sure that\n // they are not painted during the transition\n if (pswp.mainScroll.itemHolders[0]) {\n pswp.mainScroll.itemHolders[0].el.style.display = 'none';\n }\n\n if (pswp.mainScroll.itemHolders[2]) {\n pswp.mainScroll.itemHolders[2].el.style.display = 'none';\n }\n\n if (this._croppedZoom) {\n if (pswp.mainScroll.x !== 0) {\n // shift the main scroller to zero position\n pswp.mainScroll.resetPosition();\n pswp.mainScroll.resize();\n }\n }\n }\n }\n /** @private */\n\n\n _start() {\n if (this.isOpening && this._useAnimation && this._placeholder && this._placeholder.tagName === 'IMG') {\n // To ensure smooth animation\n // we wait till the current slide image placeholder is decoded,\n // but no longer than 250ms,\n // and no shorter than 50ms\n // (just using requestanimationframe is not enough in Firefox,\n // for some reason)\n new Promise(resolve => {\n let decoded = false;\n let isDelaying = true;\n decodeImage(\n /** @type {HTMLImageElement} */\n this._placeholder).finally(() => {\n decoded = true;\n\n if (!isDelaying) {\n resolve(true);\n }\n });\n setTimeout(() => {\n isDelaying = false;\n\n if (decoded) {\n resolve(true);\n }\n }, 50);\n setTimeout(resolve, 250);\n }).finally(() => this._initiate());\n } else {\n this._initiate();\n }\n }\n /** @private */\n\n\n _initiate() {\n var _this$pswp$element, _this$pswp$element2;\n\n (_this$pswp$element = this.pswp.element) === null || _this$pswp$element === void 0 || _this$pswp$element.style.setProperty('--pswp-transition-duration', this._duration + 'ms');\n this.pswp.dispatch(this.isOpening ? 'openingAnimationStart' : 'closingAnimationStart'); // legacy event\n\n this.pswp.dispatch(\n /** @type {'initialZoomIn' | 'initialZoomOut'} */\n 'initialZoom' + (this.isOpening ? 'In' : 'Out'));\n (_this$pswp$element2 = this.pswp.element) === null || _this$pswp$element2 === void 0 || _this$pswp$element2.classList.toggle('pswp--ui-visible', this.isOpening);\n\n if (this.isOpening) {\n if (this._placeholder) {\n // unhide the placeholder\n this._placeholder.style.opacity = '1';\n }\n\n this._animateToOpenState();\n } else if (this.isClosing) {\n this._animateToClosedState();\n }\n\n if (!this._useAnimation) {\n this._onAnimationComplete();\n }\n }\n /** @private */\n\n\n _onAnimationComplete() {\n const {\n pswp\n } = this;\n this.isOpen = this.isOpening;\n this.isClosed = this.isClosing;\n this.isOpening = false;\n this.isClosing = false;\n pswp.dispatch(this.isOpen ? 'openingAnimationEnd' : 'closingAnimationEnd'); // legacy event\n\n pswp.dispatch(\n /** @type {'initialZoomInEnd' | 'initialZoomOutEnd'} */\n 'initialZoom' + (this.isOpen ? 'InEnd' : 'OutEnd'));\n\n if (this.isClosed) {\n pswp.destroy();\n } else if (this.isOpen) {\n var _pswp$currSlide;\n\n if (this._animateZoom && pswp.container) {\n pswp.container.style.overflow = 'visible';\n pswp.container.style.width = '100%';\n }\n\n (_pswp$currSlide = pswp.currSlide) === null || _pswp$currSlide === void 0 || _pswp$currSlide.applyCurrentZoomPan();\n }\n }\n /** @private */\n\n\n _animateToOpenState() {\n const {\n pswp\n } = this;\n\n if (this._animateZoom) {\n if (this._croppedZoom && this._cropContainer1 && this._cropContainer2) {\n this._animateTo(this._cropContainer1, 'transform', 'translate3d(0,0,0)');\n\n this._animateTo(this._cropContainer2, 'transform', 'none');\n }\n\n if (pswp.currSlide) {\n pswp.currSlide.zoomAndPanToInitial();\n\n this._animateTo(pswp.currSlide.container, 'transform', pswp.currSlide.getCurrentTransform());\n }\n }\n\n if (this._animateBgOpacity && pswp.bg) {\n this._animateTo(pswp.bg, 'opacity', String(pswp.options.bgOpacity));\n }\n\n if (this._animateRootOpacity && pswp.element) {\n this._animateTo(pswp.element, 'opacity', '1');\n }\n }\n /** @private */\n\n\n _animateToClosedState() {\n const {\n pswp\n } = this;\n\n if (this._animateZoom) {\n this._setClosedStateZoomPan(true);\n } // do not animate opacity if it's already at 0\n\n\n if (this._animateBgOpacity && pswp.bgOpacity > 0.01 && pswp.bg) {\n this._animateTo(pswp.bg, 'opacity', '0');\n }\n\n if (this._animateRootOpacity && pswp.element) {\n this._animateTo(pswp.element, 'opacity', '0');\n }\n }\n /**\r\n * @private\r\n * @param {boolean} [animate]\r\n */\n\n\n _setClosedStateZoomPan(animate) {\n if (!this._thumbBounds) return;\n const {\n pswp\n } = this;\n const {\n innerRect\n } = this._thumbBounds;\n const {\n currSlide,\n viewportSize\n } = pswp;\n\n if (this._croppedZoom && innerRect && this._cropContainer1 && this._cropContainer2) {\n const containerOnePanX = -viewportSize.x + (this._thumbBounds.x - innerRect.x) + innerRect.w;\n const containerOnePanY = -viewportSize.y + (this._thumbBounds.y - innerRect.y) + innerRect.h;\n const containerTwoPanX = viewportSize.x - innerRect.w;\n const containerTwoPanY = viewportSize.y - innerRect.h;\n\n if (animate) {\n this._animateTo(this._cropContainer1, 'transform', toTransformString(containerOnePanX, containerOnePanY));\n\n this._animateTo(this._cropContainer2, 'transform', toTransformString(containerTwoPanX, containerTwoPanY));\n } else {\n setTransform(this._cropContainer1, containerOnePanX, containerOnePanY);\n setTransform(this._cropContainer2, containerTwoPanX, containerTwoPanY);\n }\n }\n\n if (currSlide) {\n equalizePoints(currSlide.pan, innerRect || this._thumbBounds);\n currSlide.currZoomLevel = this._thumbBounds.w / currSlide.width;\n\n if (animate) {\n this._animateTo(currSlide.container, 'transform', currSlide.getCurrentTransform());\n } else {\n currSlide.applyCurrentZoomPan();\n }\n }\n }\n /**\r\n * @private\r\n * @param {HTMLElement} target\r\n * @param {'transform' | 'opacity'} prop\r\n * @param {string} propValue\r\n */\n\n\n _animateTo(target, prop, propValue) {\n if (!this._duration) {\n target.style[prop] = propValue;\n return;\n }\n\n const {\n animations\n } = this.pswp;\n /** @type {AnimationProps} */\n\n const animProps = {\n duration: this._duration,\n easing: this.pswp.options.easing,\n onComplete: () => {\n if (!animations.activeAnimations.length) {\n this._onAnimationComplete();\n }\n },\n target\n };\n animProps[prop] = propValue;\n animations.startTransition(animProps);\n }\n\n}\n\n/**\r\n * @template T\r\n * @typedef {import('./types.js').Type<T>} Type<T>\r\n */\n\n/** @typedef {import('./slide/slide.js').SlideData} SlideData */\n\n/** @typedef {import('./slide/zoom-level.js').ZoomLevelOption} ZoomLevelOption */\n\n/** @typedef {import('./ui/ui-element.js').UIElementData} UIElementData */\n\n/** @typedef {import('./main-scroll.js').ItemHolder} ItemHolder */\n\n/** @typedef {import('./core/eventable.js').PhotoSwipeEventsMap} PhotoSwipeEventsMap */\n\n/** @typedef {import('./core/eventable.js').PhotoSwipeFiltersMap} PhotoSwipeFiltersMap */\n\n/** @typedef {import('./slide/get-thumb-bounds').Bounds} Bounds */\n\n/**\r\n * @template {keyof PhotoSwipeEventsMap} T\r\n * @typedef {import('./core/eventable.js').EventCallback<T>} EventCallback<T>\r\n */\n\n/**\r\n * @template {keyof PhotoSwipeEventsMap} T\r\n * @typedef {import('./core/eventable.js').AugmentedEvent<T>} AugmentedEvent<T>\r\n */\n\n/** @typedef {{ x: number; y: number; id?: string | number }} Point */\n\n/** @typedef {{ top: number; bottom: number; left: number; right: number }} Padding */\n\n/** @typedef {SlideData[]} DataSourceArray */\n\n/** @typedef {{ gallery: HTMLElement; items?: HTMLElement[] }} DataSourceObject */\n\n/** @typedef {DataSourceArray | DataSourceObject} DataSource */\n\n/** @typedef {(point: Point, originalEvent: PointerEvent) => void} ActionFn */\n\n/** @typedef {'close' | 'next' | 'zoom' | 'zoom-or-close' | 'toggle-controls'} ActionType */\n\n/** @typedef {Type<PhotoSwipe> | { default: Type<PhotoSwipe> }} PhotoSwipeModule */\n\n/** @typedef {PhotoSwipeModule | Promise<PhotoSwipeModule> | (() => Promise<PhotoSwipeModule>)} PhotoSwipeModuleOption */\n\n/**\r\n * @typedef {string | NodeListOf<HTMLElement> | HTMLElement[] | HTMLElement} ElementProvider\r\n */\n\n/** @typedef {Partial<PreparedPhotoSwipeOptions>} PhotoSwipeOptions https://photoswipe.com/options/ */\n\n/**\r\n * @typedef {Object} PreparedPhotoSwipeOptions\r\n *\r\n * @prop {DataSource} [dataSource]\r\n * Pass an array of any items via dataSource option. Its length will determine amount of slides\r\n * (which may be modified further from numItems event).\r\n *\r\n * Each item should contain data that you need to generate slide\r\n * (for image slide it would be src (image URL), width (image width), height, srcset, alt).\r\n *\r\n * If these properties are not present in your initial array, you may \"pre-parse\" each item from itemData filter.\r\n *\r\n * @prop {number} bgOpacity\r\n * Background backdrop opacity, always define it via this option and not via CSS rgba color.\r\n *\r\n * @prop {number} spacing\r\n * Spacing between slides. Defined as ratio relative to the viewport width (0.1 = 10% of viewport).\r\n *\r\n * @prop {boolean} allowPanToNext\r\n * Allow swipe navigation to the next slide when the current slide is zoomed. Does not apply to mouse events.\r\n *\r\n * @prop {boolean} loop\r\n * If set to true you'll be able to swipe from the last to the first image.\r\n * Option is always false when there are less than 3 slides.\r\n *\r\n * @prop {boolean} [wheelToZoom]\r\n * By default PhotoSwipe zooms image with ctrl-wheel, if you enable this option - image will zoom just via wheel.\r\n *\r\n * @prop {boolean} pinchToClose\r\n * Pinch touch gesture to close the gallery.\r\n *\r\n * @prop {boolean} closeOnVerticalDrag\r\n * Vertical drag gesture to close the PhotoSwipe.\r\n *\r\n * @prop {Padding} [padding]\r\n * Slide area padding (in pixels).\r\n *\r\n * @prop {(viewportSize: Point, itemData: SlideData, index: number) => Padding} [paddingFn]\r\n * The option is checked frequently, so make sure it's performant. Overrides padding option if defined. For example:\r\n *\r\n * @prop {number | false} hideAnimationDuration\r\n * Transition duration in milliseconds, can be 0.\r\n *\r\n * @prop {number | false} showAnimationDuration\r\n * Transition duration in milliseconds, can be 0.\r\n *\r\n * @prop {number | false} zoomAnimationDuration\r\n * Transition duration in milliseconds, can be 0.\r\n *\r\n * @prop {string} easing\r\n * String, 'cubic-bezier(.4,0,.22,1)'. CSS easing function for open/close/zoom transitions.\r\n *\r\n * @prop {boolean} escKey\r\n * Esc key to close.\r\n *\r\n * @prop {boolean} arrowKeys\r\n * Left/right arrow keys for navigation.\r\n *\r\n * @prop {boolean} trapFocus\r\n * Trap focus within PhotoSwipe element while it's open.\r\n *\r\n * @prop {boolean} returnFocus\r\n * Restore focus the last active element after PhotoSwipe is closed.\r\n *\r\n * @prop {boolean} clickToCloseNonZoomable\r\n * If image is not zoomable (for example, smaller than viewport) it can be closed by clicking on it.\r\n *\r\n * @prop {ActionType | ActionFn | false} imageClickAction\r\n * Refer to click and tap actions page.\r\n *\r\n * @prop {ActionType | ActionFn | false} bgClickAction\r\n * Refer to click and tap actions page.\r\n *\r\n * @prop {ActionType | ActionFn | false} tapAction\r\n * Refer to click and tap actions page.\r\n *\r\n * @prop {ActionType | ActionFn | false} doubleTapAction\r\n * Refer to click and tap actions page.\r\n *\r\n * @prop {number} preloaderDelay\r\n * Delay before the loading indicator will be displayed,\r\n * if image is loaded during it - the indicator will not be displayed at all. Can be zero.\r\n *\r\n * @prop {string} indexIndicatorSep\r\n * Used for slide count indicator (\"1 of 10 \").\r\n *\r\n * @prop {(options: PhotoSwipeOptions, pswp: PhotoSwipeBase) => Point} [getViewportSizeFn]\r\n * A function that should return slide viewport width and height, in format {x: 100, y: 100}.\r\n *\r\n * @prop {string} errorMsg\r\n * Message to display when the image wasn't able to load. If you need to display HTML - use contentErrorElement filter.\r\n *\r\n * @prop {[number, number]} preload\r\n * Lazy loading of nearby slides based on direction of movement. Should be an array with two integers,\r\n * first one - number of items to preload before the current image, second one - after the current image.\r\n * Two nearby images are always loaded.\r\n *\r\n * @prop {string} [mainClass]\r\n * Class that will be added to the root element of PhotoSwipe, may contain multiple separated by space.\r\n * Example on Styling page.\r\n *\r\n * @prop {HTMLElement} [appendToEl]\r\n * Element to which PhotoSwipe dialog will be appended when it opens.\r\n *\r\n * @prop {number} maxWidthToAnimate\r\n * Maximum width of image to animate, if initial rendered image width\r\n * is larger than this value - the opening/closing transition will be automatically disabled.\r\n *\r\n * @prop {string} [closeTitle]\r\n * Translating\r\n *\r\n * @prop {string} [zoomTitle]\r\n * Translating\r\n *\r\n * @prop {string} [arrowPrevTitle]\r\n * Translating\r\n *\r\n * @prop {string} [arrowNextTitle]\r\n * Translating\r\n *\r\n * @prop {'zoom' | 'fade' | 'none'} [showHideAnimationType]\r\n * To adjust opening or closing transition type use lightbox option `showHideAnimationType` (`String`).\r\n * It supports three values - `zoom` (default), `fade` (default if there is no thumbnail) and `none`.\r\n *\r\n * Animations are automatically disabled if user `(prefers-reduced-motion: reduce)`.\r\n *\r\n * @prop {number} index\r\n * Defines start slide index.\r\n *\r\n * @prop {(e: MouseEvent) => number} [getClickedIndexFn]\r\n *\r\n * @prop {boolean} [arrowPrev]\r\n * @prop {boolean} [arrowNext]\r\n * @prop {boolean} [zoom]\r\n * @prop {boolean} [close]\r\n * @prop {boolean} [counter]\r\n *\r\n * @prop {string} [arrowPrevSVG]\r\n * @prop {string} [arrowNextSVG]\r\n * @prop {string} [zoomSVG]\r\n * @prop {string} [closeSVG]\r\n * @prop {string} [counterSVG]\r\n *\r\n * @prop {string} [arrowPrevTitle]\r\n * @prop {string} [arrowNextTitle]\r\n * @prop {string} [zoomTitle]\r\n * @prop {string} [closeTitle]\r\n * @prop {string} [counterTitle]\r\n *\r\n * @prop {ZoomLevelOption} [initialZoomLevel]\r\n * @prop {ZoomLevelOption} [secondaryZoomLevel]\r\n * @prop {ZoomLevelOption} [maxZoomLevel]\r\n *\r\n * @prop {boolean} [mouseMovePan]\r\n * @prop {Point | null} [initialPointerPos]\r\n * @prop {boolean} [showHideOpacity]\r\n *\r\n * @prop {PhotoSwipeModuleOption} [pswpModule]\r\n * @prop {() => Promise<any>} [openPromise]\r\n * @prop {boolean} [preloadFirstSlide]\r\n * @prop {ElementProvider} [gallery]\r\n * @prop {string} [gallerySelector]\r\n * @prop {ElementProvider} [children]\r\n * @prop {string} [childSelector]\r\n * @prop {string | false} [thumbSelector]\r\n */\n\n/** @type {PreparedPhotoSwipeOptions} */\n\nconst defaultOptions = {\n allowPanToNext: true,\n spacing: 0.1,\n loop: true,\n pinchToClose: true,\n closeOnVerticalDrag: true,\n hideAnimationDuration: 333,\n showAnimationDuration: 333,\n zoomAnimationDuration: 333,\n escKey: true,\n arrowKeys: true,\n trapFocus: true,\n returnFocus: true,\n maxWidthToAnimate: 4000,\n clickToCloseNonZoomable: true,\n imageClickAction: 'zoom-or-close',\n bgClickAction: 'close',\n tapAction: 'toggle-controls',\n doubleTapAction: 'zoom',\n indexIndicatorSep: ' / ',\n preloaderDelay: 2000,\n bgOpacity: 0.8,\n index: 0,\n errorMsg: 'The image cannot be loaded',\n preload: [1, 2],\n easing: 'cubic-bezier(.4,0,.22,1)'\n};\n/**\r\n * PhotoSwipe Core\r\n */\n\nclass PhotoSwipe extends PhotoSwipeBase {\n /**\r\n * @param {PhotoSwipeOptions} [options]\r\n */\n constructor(options) {\n super();\n this.options = this._prepareOptions(options || {});\n /**\r\n * offset of viewport relative to document\r\n *\r\n * @type {Point}\r\n */\n\n this.offset = {\n x: 0,\n y: 0\n };\n /**\r\n * @type {Point}\r\n * @private\r\n */\n\n this._prevViewportSize = {\n x: 0,\n y: 0\n };\n /**\r\n * Size of scrollable PhotoSwipe viewport\r\n *\r\n * @type {Point}\r\n */\n\n this.viewportSize = {\n x: 0,\n y: 0\n };\n /**\r\n * background (backdrop) opacity\r\n */\n\n this.bgOpacity = 1;\n this.currIndex = 0;\n this.potentialIndex = 0;\n this.isOpen = false;\n this.isDestroying = false;\n this.hasMouse = false;\n /**\r\n * @private\r\n * @type {SlideData}\r\n */\n\n this._initialItemData = {};\n /** @type {Bounds | undefined} */\n\n this._initialThumbBounds = undefined;\n /** @type {HTMLDivElement | undefined} */\n\n this.topBar = undefined;\n /** @type {HTMLDivElement | undefined} */\n\n this.element = undefined;\n /** @type {HTMLDivElement | undefined} */\n\n this.template = undefined;\n /** @type {HTMLDivElement | undefined} */\n\n this.container = undefined;\n /** @type {HTMLElement | undefined} */\n\n this.scrollWrap = undefined;\n /** @type {Slide | undefined} */\n\n this.currSlide = undefined;\n this.events = new DOMEvents();\n this.animations = new Animations();\n this.mainScroll = new MainScroll(this);\n this.gestures = new Gestures(this);\n this.opener = new Opener(this);\n this.keyboard = new Keyboard(this);\n this.contentLoader = new ContentLoader(this);\n }\n /** @returns {boolean} */\n\n\n init() {\n if (this.isOpen || this.isDestroying) {\n return false;\n }\n\n this.isOpen = true;\n this.dispatch('init'); // legacy\n\n this.dispatch('beforeOpen');\n\n this._createMainStructure(); // add classes to the root element of PhotoSwipe\n\n\n let rootClasses = 'pswp--open';\n\n if (this.gestures.supportsTouch) {\n rootClasses += ' pswp--touch';\n }\n\n if (this.options.mainClass) {\n rootClasses += ' ' + this.options.mainClass;\n }\n\n if (this.element) {\n this.element.className += ' ' + rootClasses;\n }\n\n this.currIndex = this.options.index || 0;\n this.potentialIndex = this.currIndex;\n this.dispatch('firstUpdate'); // starting index can be modified here\n // initialize scroll wheel handler to block the scroll\n\n this.scrollWheel = new ScrollWheel(this); // sanitize index\n\n if (Number.isNaN(this.currIndex) || this.currIndex < 0 || this.currIndex >= this.getNumItems()) {\n this.currIndex = 0;\n }\n\n if (!this.gestures.supportsTouch) {\n // enable mouse features if no touch support detected\n this.mouseDetected();\n } // causes forced synchronous layout\n\n\n this.updateSize();\n this.offset.y = window.pageYOffset;\n this._initialItemData = this.getItemData(this.currIndex);\n this.dispatch('gettingData', {\n index: this.currIndex,\n data: this._initialItemData,\n slide: undefined\n }); // *Layout* - calculate size and position of elements here\n\n this._initialThumbBounds = this.getThumbBounds();\n this.dispatch('initialLayout');\n this.on('openingAnimationEnd', () => {\n const {\n itemHolders\n } = this.mainScroll; // Add content to the previous and next slide\n\n if (itemHolders[0]) {\n itemHolders[0].el.style.display = 'block';\n this.setContent(itemHolders[0], this.currIndex - 1);\n }\n\n if (itemHolders[2]) {\n itemHolders[2].el.style.display = 'block';\n this.setContent(itemHolders[2], this.currIndex + 1);\n }\n\n this.appendHeavy();\n this.contentLoader.updateLazy();\n this.events.add(window, 'resize', this._handlePageResize.bind(this));\n this.events.add(window, 'scroll', this._updatePageScrollOffset.bind(this));\n this.dispatch('bindEvents');\n }); // set content for center slide (first time)\n\n if (this.mainScroll.itemHolders[1]) {\n this.setContent(this.mainScroll.itemHolders[1], this.currIndex);\n }\n\n this.dispatch('change');\n this.opener.open();\n this.dispatch('afterInit');\n return true;\n }\n /**\r\n * Get looped slide index\r\n * (for example, -1 will return the last slide)\r\n *\r\n * @param {number} index\r\n * @returns {number}\r\n */\n\n\n getLoopedIndex(index) {\n const numSlides = this.getNumItems();\n\n if (this.options.loop) {\n if (index > numSlides - 1) {\n index -= numSlides;\n }\n\n if (index < 0) {\n index += numSlides;\n }\n }\n\n return clamp(index, 0, numSlides - 1);\n }\n\n appendHeavy() {\n this.mainScroll.itemHolders.forEach(itemHolder => {\n var _itemHolder$slide;\n\n (_itemHolder$slide = itemHolder.slide) === null || _itemHolder$slide === void 0 || _itemHolder$slide.appendHeavy();\n });\n }\n /**\r\n * Change the slide\r\n * @param {number} index New index\r\n */\n\n\n goTo(index) {\n this.mainScroll.moveIndexBy(this.getLoopedIndex(index) - this.potentialIndex);\n }\n /**\r\n * Go to the next slide.\r\n */\n\n\n next() {\n this.goTo(this.potentialIndex + 1);\n }\n /**\r\n * Go to the previous slide.\r\n */\n\n\n prev() {\n this.goTo(this.potentialIndex - 1);\n }\n /**\r\n * @see slide/slide.js zoomTo\r\n *\r\n * @param {Parameters<Slide['zoomTo']>} args\r\n */\n\n\n zoomTo(...args) {\n var _this$currSlide;\n\n (_this$currSlide = this.currSlide) === null || _this$currSlide === void 0 || _this$currSlide.zoomTo(...args);\n }\n /**\r\n * @see slide/slide.js toggleZoom\r\n */\n\n\n toggleZoom() {\n var _this$currSlide2;\n\n (_this$currSlide2 = this.currSlide) === null || _this$currSlide2 === void 0 || _this$currSlide2.toggleZoom();\n }\n /**\r\n * Close the gallery.\r\n * After closing transition ends - destroy it\r\n */\n\n\n close() {\n if (!this.opener.isOpen || this.isDestroying) {\n return;\n }\n\n this.isDestroying = true;\n this.dispatch('close');\n this.events.removeAll();\n this.opener.close();\n }\n /**\r\n * Destroys the gallery:\r\n * - instantly closes the gallery\r\n * - unbinds events,\r\n * - cleans intervals and timeouts\r\n * - removes elements from DOM\r\n */\n\n\n destroy() {\n var _this$element;\n\n if (!this.isDestroying) {\n this.options.showHideAnimationType = 'none';\n this.close();\n return;\n }\n\n this.dispatch('destroy');\n this._listeners = {};\n\n if (this.scrollWrap) {\n this.scrollWrap.ontouchmove = null;\n this.scrollWrap.ontouchend = null;\n }\n\n (_this$element = this.element) === null || _this$element === void 0 || _this$element.remove();\n this.mainScroll.itemHolders.forEach(itemHolder => {\n var _itemHolder$slide2;\n\n (_itemHolder$slide2 = itemHolder.slide) === null || _itemHolder$slide2 === void 0 || _itemHolder$slide2.destroy();\n });\n this.contentLoader.destroy();\n this.events.removeAll();\n }\n /**\r\n * Refresh/reload content of a slide by its index\r\n *\r\n * @param {number} slideIndex\r\n */\n\n\n refreshSlideContent(slideIndex) {\n this.contentLoader.removeByIndex(slideIndex);\n this.mainScroll.itemHolders.forEach((itemHolder, i) => {\n var _this$currSlide$index, _this$currSlide3;\n\n let potentialHolderIndex = ((_this$currSlide$index = (_this$currSlide3 = this.currSlide) === null || _this$currSlide3 === void 0 ? void 0 : _this$currSlide3.index) !== null && _this$currSlide$index !== void 0 ? _this$currSlide$index : 0) - 1 + i;\n\n if (this.canLoop()) {\n potentialHolderIndex = this.getLoopedIndex(potentialHolderIndex);\n }\n\n if (potentialHolderIndex === slideIndex) {\n // set the new slide content\n this.setContent(itemHolder, slideIndex, true); // activate the new slide if it's current\n\n if (i === 1) {\n var _itemHolder$slide3;\n\n this.currSlide = itemHolder.slide;\n (_itemHolder$slide3 = itemHolder.slide) === null || _itemHolder$slide3 === void 0 || _itemHolder$slide3.setIsActive(true);\n }\n }\n });\n this.dispatch('change');\n }\n /**\r\n * Set slide content\r\n *\r\n * @param {ItemHolder} holder mainScroll.itemHolders array item\r\n * @param {number} index Slide index\r\n * @param {boolean} [force] If content should be set even if index wasn't changed\r\n */\n\n\n setContent(holder, index, force) {\n if (this.canLoop()) {\n index = this.getLoopedIndex(index);\n }\n\n if (holder.slide) {\n if (holder.slide.index === index && !force) {\n // exit if holder already contains this slide\n // this could be common when just three slides are used\n return;\n } // destroy previous slide\n\n\n holder.slide.destroy();\n holder.slide = undefined;\n } // exit if no loop and index is out of bounds\n\n\n if (!this.canLoop() && (index < 0 || index >= this.getNumItems())) {\n return;\n }\n\n const itemData = this.getItemData(index);\n holder.slide = new Slide(itemData, index, this); // set current slide\n\n if (index === this.currIndex) {\n this.currSlide = holder.slide;\n }\n\n holder.slide.append(holder.el);\n }\n /** @returns {Point} */\n\n\n getViewportCenterPoint() {\n return {\n x: this.viewportSize.x / 2,\n y: this.viewportSize.y / 2\n };\n }\n /**\r\n * Update size of all elements.\r\n * Executed on init and on page resize.\r\n *\r\n * @param {boolean} [force] Update size even if size of viewport was not changed.\r\n */\n\n\n updateSize(force) {\n // let item;\n // let itemIndex;\n if (this.isDestroying) {\n // exit if PhotoSwipe is closed or closing\n // (to avoid errors, as resize event might be delayed)\n return;\n } //const newWidth = this.scrollWrap.clientWidth;\n //const newHeight = this.scrollWrap.clientHeight;\n\n\n const newViewportSize = getViewportSize(this.options, this);\n\n if (!force && pointsEqual(newViewportSize, this._prevViewportSize)) {\n // Exit if dimensions were not changed\n return;\n } //this._prevViewportSize.x = newWidth;\n //this._prevViewportSize.y = newHeight;\n\n\n equalizePoints(this._prevViewportSize, newViewportSize);\n this.dispatch('beforeResize');\n equalizePoints(this.viewportSize, this._prevViewportSize);\n\n this._updatePageScrollOffset();\n\n this.dispatch('viewportSize'); // Resize slides only after opener animation is finished\n // and don't re-calculate size on inital size update\n\n this.mainScroll.resize(this.opener.isOpen);\n\n if (!this.hasMouse && window.matchMedia('(any-hover: hover)').matches) {\n this.mouseDetected();\n }\n\n this.dispatch('resize');\n }\n /**\r\n * @param {number} opacity\r\n */\n\n\n applyBgOpacity(opacity) {\n this.bgOpacity = Math.max(opacity, 0);\n\n if (this.bg) {\n this.bg.style.opacity = String(this.bgOpacity * this.options.bgOpacity);\n }\n }\n /**\r\n * Whether mouse is detected\r\n */\n\n\n mouseDetected() {\n if (!this.hasMouse) {\n var _this$element2;\n\n this.hasMouse = true;\n (_this$element2 = this.element) === null || _this$element2 === void 0 || _this$element2.classList.add('pswp--has_mouse');\n }\n }\n /**\r\n * Page resize event handler\r\n *\r\n * @private\r\n */\n\n\n _handlePageResize() {\n this.updateSize(); // In iOS webview, if element size depends on document size,\n // it'll be measured incorrectly in resize event\n //\n // https://bugs.webkit.org/show_bug.cgi?id=170595\n // https://hackernoon.com/onresize-event-broken-in-mobile-safari-d8469027bf4d\n\n if (/iPhone|iPad|iPod/i.test(window.navigator.userAgent)) {\n setTimeout(() => {\n this.updateSize();\n }, 500);\n }\n }\n /**\r\n * Page scroll offset is used\r\n * to get correct coordinates\r\n * relative to PhotoSwipe viewport.\r\n *\r\n * @private\r\n */\n\n\n _updatePageScrollOffset() {\n this.setScrollOffset(0, window.pageYOffset);\n }\n /**\r\n * @param {number} x\r\n * @param {number} y\r\n */\n\n\n setScrollOffset(x, y) {\n this.offset.x = x;\n this.offset.y = y;\n this.dispatch('updateScrollOffset');\n }\n /**\r\n * Create main HTML structure of PhotoSwipe,\r\n * and add it to DOM\r\n *\r\n * @private\r\n */\n\n\n _createMainStructure() {\n // root DOM element of PhotoSwipe (.pswp)\n this.element = createElement('pswp', 'div');\n this.element.setAttribute('tabindex', '-1');\n this.element.setAttribute('role', 'dialog'); // template is legacy prop\n\n this.template = this.element; // Background is added as a separate element,\n // as animating opacity is faster than animating rgba()\n\n this.bg = createElement('pswp__bg', 'div', this.element);\n this.scrollWrap = createElement('pswp__scroll-wrap', 'section', this.element);\n this.container = createElement('pswp__container', 'div', this.scrollWrap); // aria pattern: carousel\n\n this.scrollWrap.setAttribute('aria-roledescription', 'carousel');\n this.container.setAttribute('aria-live', 'off');\n this.container.setAttribute('id', 'pswp__items');\n this.mainScroll.appendHolders();\n this.ui = new UI(this);\n this.ui.init(); // append to DOM\n\n (this.options.appendToEl || document.body).appendChild(this.element);\n }\n /**\r\n * Get position and dimensions of small thumbnail\r\n * {x:,y:,w:}\r\n *\r\n * Height is optional (calculated based on the large image)\r\n *\r\n * @returns {Bounds | undefined}\r\n */\n\n\n getThumbBounds() {\n return getThumbBounds(this.currIndex, this.currSlide ? this.currSlide.data : this._initialItemData, this);\n }\n /**\r\n * If the PhotoSwipe can have continuous loop\r\n * @returns Boolean\r\n */\n\n\n canLoop() {\n return this.options.loop && this.getNumItems() > 2;\n }\n /**\r\n * @private\r\n * @param {PhotoSwipeOptions} options\r\n * @returns {PreparedPhotoSwipeOptions}\r\n */\n\n\n _prepareOptions(options) {\n if (window.matchMedia('(prefers-reduced-motion), (update: slow)').matches) {\n options.showHideAnimationType = 'none';\n options.zoomAnimationDuration = 0;\n }\n /** @type {PreparedPhotoSwipeOptions} */\n\n\n return { ...defaultOptions,\n ...options\n };\n }\n\n}\n\nexport { PhotoSwipe as default };\n//# sourceMappingURL=photoswipe.esm.js.map\n","import 'photoswipe/style.css';\nimport PhotoSwipeLightbox, { DataSource } from 'photoswipe/lightbox';\nimport PhotoSwipe from 'photoswipe';\nimport { BoxComponent } from '../types/box';\nimport { icons } from '../icons';\nimport { query } from '../utils/query';\nimport { safeTemplate } from '../utils/safe-template';\nimport { Nodes } from '../models/nodes';\nimport { Box } from '../models/box';\nimport { locale } from '../i18n';\n\ntype ImageInfo = {\n node: Nodes;\n width?: number;\n height?: number;\n};\n\nfunction bindResizerEvents(pointerNode: Nodes, box: Box): void {\n const editor = box.getEditor();\n if (!editor) {\n return;\n }\n const boxContainer = box.getContainer();\n const resizerNode = pointerNode.closest('.lake-resizer');\n const infoNode = resizerNode.find('.lake-resizer-info');\n const isPlus = pointerNode.attr('class').indexOf('-right') >= 0;\n const initialWidth = boxContainer.width();\n const initialHeight = boxContainer.height();\n const rate = initialHeight / initialWidth;\n let clientX = 0;\n let width = 0;\n // resizing box\n const pointermoveListener = (event: Event) => {\n const pointerEvent = event as PointerEvent;\n const diffX = pointerEvent.clientX - clientX;\n const newWidth = Math.round(isPlus ? width + diffX : width - diffX);\n const newHeight = Math.round(rate * newWidth);\n boxContainer.css({\n width: `${newWidth}px`,\n height: `${newHeight}px`,\n });\n infoNode.text(`${newWidth} x ${newHeight}`);\n };\n // start resizing\n const pointerdownListener = (event: Event) => {\n const pointerEvent = event as PointerEvent;\n const pointerNativeNode = pointerNode.get(0) as Element;\n // The capture will be implicitly released after a pointerup or pointercancel event.\n // https://developer.mozilla.org/en-US/docs/Web/API/Element/setPointerCapture\n pointerNativeNode.setPointerCapture(pointerEvent.pointerId);\n clientX = pointerEvent.clientX;\n width = boxContainer.width();\n infoNode.show();\n pointerNode.on('pointermove', pointermoveListener);\n };\n // stop resizing\n const pointerupListner = () => {\n pointerNode.off('pointermove');\n infoNode.hide();\n width = box.getContainer().width();\n const height = Math.round(rate * width);\n box.updateValue({\n width,\n height,\n });\n editor.history.save();\n };\n // cancel resizing\n const pointercancelListner = () => {\n pointerNode.off('pointermove');\n infoNode.hide();\n };\n pointerNode.on('pointerdown', pointerdownListener);\n pointerNode.on('pointerup', pointerupListner);\n pointerNode.on('pointercancel', pointercancelListner);\n}\n\n// Loads an image and get its width and height.\nasync function getImageInfo(url: string): Promise<ImageInfo> {\n const node = query('<img />');\n node.css({\n position: 'absolute',\n top: '0',\n left: '-8888px',\n 'z-index': '-1',\n visibility: 'hidden',\n });\n return new Promise(resolve => {\n node.on('load', () => {\n const imgNativeNode = node.get(0) as HTMLImageElement;\n const width = imgNativeNode.width;\n const height = imgNativeNode.height;\n node.remove();\n node.removeAttr('style');\n resolve({\n node,\n width,\n height,\n });\n });\n node.on('error', () => {\n node.remove();\n resolve({\n node,\n });\n });\n node.attr('src', url);\n query(document.body).append(node);\n });\n}\n\n// Opens full screen view.\nfunction openFullScreen(box: Box): void {\n const editor = box.getEditor();\n if (!editor) {\n return;\n }\n const dataSource: DataSource = [];\n let currentIndex = 0;\n const allImageBox = editor.container.find('lake-box[name=\"image\"]');\n allImageBox.each((node, index) => {\n const imageBox = new Box(node);\n const imageValue = imageBox.value;\n if (imageValue.status !== 'done') {\n return;\n }\n dataSource.push({\n id: index,\n src: imageValue.originalUrl || imageValue.url,\n width: imageValue.originalWidth || imageValue.width,\n height: imageValue.originalHeight || imageValue.height,\n alt: imageValue.name,\n });\n if (box.node.id === imageBox.node.id) {\n currentIndex = index;\n }\n });\n const lightbox = new PhotoSwipeLightbox({\n pswpModule: PhotoSwipe,\n dataSource,\n mainClass: 'lake-pswp',\n zoom: false,\n arrowPrevSVG: icons.get('left'),\n arrowNextSVG: icons.get('right'),\n closeSVG: icons.get('close'),\n arrowPrevTitle: locale.image.previous(),\n arrowNextTitle: locale.image.next(),\n closeTitle: locale.image.close(),\n errorMsg: locale.image.loadingError(),\n });\n lightbox.on('uiRegister', () => {\n const pswp: any = lightbox.pswp;\n pswp.ui.registerElement({\n name: 'zoom-out-button',\n order: 8,\n isButton: true,\n title: locale.image.zoomOut(),\n html: icons.get('zoomOut'),\n onClick: () => {\n const currSlide = pswp.currSlide;\n const step = (currSlide.zoomLevels.max - currSlide.zoomLevels.min) / 5;\n const destZoomLevel = currSlide.currZoomLevel - step;\n currSlide.zoomTo(destZoomLevel, undefined, 333);\n },\n });\n pswp.ui.registerElement({\n name: 'zoom-in-button',\n order: 9,\n isButton: true,\n title: locale.image.zoomIn(),\n html: icons.get('zoomIn'),\n onClick: () => {\n const currSlide = pswp.currSlide;\n const step = (currSlide.zoomLevels.max - currSlide.zoomLevels.min) / 5;\n const destZoomLevel = currSlide.currZoomLevel + step;\n currSlide.zoomTo(destZoomLevel, undefined, 333);\n },\n });\n });\n lightbox.addFilter('thumbEl', (thumbnail, itemData) => {\n const imgNode = allImageBox.eq(itemData.id).find('.lake-image-img');\n if (imgNode.length > 0) {\n return imgNode.get(0) as HTMLElement;\n }\n return thumbnail as HTMLElement;\n });\n lightbox.addFilter('placeholderSrc', (placeholderSrc, slide) => {\n const imgNode = allImageBox.eq(slide.data.id).find('.lake-image-img');\n if (imgNode.length > 0) {\n return imgNode.attr('src');\n }\n return placeholderSrc;\n });\n lightbox.on('openingAnimationEnd', () => {\n box.event.emit('openfullscreen');\n });\n lightbox.init();\n lightbox.loadAndOpen(currentIndex);\n}\n\n// Removes current box.\nfunction removeImageBox(box: Box): void {\n const editor = box.getEditor();\n if (!editor) {\n return;\n }\n const xhr = box.getData('xhr');\n if (xhr) {\n xhr.abort();\n }\n editor.selection.range.selectBox(box.node);\n editor.removeBox();\n editor.history.save();\n}\n\n// Displays error icon and filename.\nasync function renderError(imageNode: Nodes, box: Box): Promise<void> {\n const value = box.value;\n box.getContainer().css({\n width: '',\n height: '',\n });\n const buttonGroupNode = query(safeTemplate`\n <div class=\"lake-button-group\">\n <button type=\"button\" tabindex=\"-1\" class=\"lake-button-remove\" title=\"${locale.image.remove()}\"></button>\n </div>\n `);\n const removeButton = buttonGroupNode.find('.lake-button-remove');\n const removeIcon = icons.get('remove');\n if (removeIcon) {\n removeButton.append(removeIcon);\n }\n const errorNode = query(safeTemplate`\n <div class=\"lake-error\">\n <div class=\"lake-error-icon\"></div>\n <div class=\"lake-error-name\">${value.name || ''}</div>\n </div>\n `);\n const imageIcon = icons.get('image');\n if (imageIcon) {\n errorNode.find('.lake-error-icon').append(imageIcon);\n }\n imageNode.append(buttonGroupNode);\n imageNode.append(errorNode);\n}\n\n// Displays an image with uplaoding progress.\nasync function renderUploading(imageNode: Nodes, box: Box): Promise<void> {\n const editor = box.getEditor();\n if (!editor) {\n return;\n }\n const value = box.value;\n const imageInfo = await getImageInfo(value.url);\n if (!imageInfo.width || !imageInfo.height) {\n await renderError(imageNode, box);\n return;\n }\n const maxWidth = editor.container.innerWidth() - 2;\n const width = imageInfo.width < maxWidth ? imageInfo.width : maxWidth;\n const height = Math.round(width * imageInfo.height / imageInfo.width);\n box.updateValue({\n width,\n height,\n originalWidth: imageInfo.width,\n originalHeight: imageInfo.height,\n });\n box.getContainer().css({\n width: `${width}px`,\n height: `${height}px`,\n });\n const buttonGroupNode = query(safeTemplate`\n <div class=\"lake-button-group\">\n <button type=\"button\" tabindex=\"-1\" class=\"lake-button-remove\" title=\"${locale.image.remove()}\"></button>\n </div>\n `);\n const removeButton = buttonGroupNode.find('.lake-button-remove');\n const removeIcon = icons.get('remove');\n if (removeIcon) {\n removeButton.append(removeIcon);\n }\n const percent = Math.round(value.percent || 0);\n const progressNode = query(safeTemplate`\n <div class=\"lake-progress\">\n <div class=\"lake-percent\">${percent} %</div>\n </div>\n `);\n if (width < 80) {\n progressNode.find('.lake-percent').hide();\n }\n const circleNotchIcon = icons.get('circleNotch');\n if (circleNotchIcon) {\n progressNode.prepend(circleNotchIcon);\n }\n const imgNode = imageInfo.node;\n imageInfo.node.addClass('lake-image-img');\n imgNode.attr({\n draggable: 'false',\n alt: value.name,\n });\n imageNode.append(buttonGroupNode);\n imageNode.append(progressNode);\n imageNode.append(imgNode);\n}\n\n// Displays an image that can be previewed or removed.\nasync function renderDone(imageNode: Nodes, box: Box): Promise<void> {\n const editor = box.getEditor();\n if (!editor) {\n return;\n }\n const value = box.value;\n const imageInfo = await getImageInfo(value.url);\n if (!imageInfo.width || !imageInfo.height) {\n await renderError(imageNode, box);\n return;\n }\n let width = value.width;\n let height = value.height;\n if (!width || !height) {\n const maxWidth = editor.container.innerWidth() - 2;\n width = Math.round(imageInfo.width < maxWidth ? imageInfo.width : maxWidth);\n height = Math.round(width * imageInfo.height / imageInfo.width);\n box.updateValue({\n width,\n height,\n });\n }\n box.getContainer().css({\n width: `${width}px`,\n height: `${height}px`,\n });\n const buttonGroupNode = query(safeTemplate`\n <div class=\"lake-button-group\">\n <button type=\"button\" tabindex=\"-1\" class=\"lake-button-view\" title=\"${locale.image.view()}\"></button>\n <button type=\"button\" tabindex=\"-1\" class=\"lake-button-remove\" title=\"${locale.image.remove()}\"></button>\n </div>\n `);\n const viewButton = buttonGroupNode.find('.lake-button-view');\n const maximizeIcon = icons.get('maximize');\n if (maximizeIcon) {\n viewButton.append(maximizeIcon);\n }\n if (width < 80 || PhotoSwipeLightbox === null) {\n viewButton.hide();\n }\n const removeButton = buttonGroupNode.find('.lake-button-remove');\n const removeIcon = icons.get('remove');\n if (removeIcon) {\n removeButton.append(removeIcon);\n }\n const resizerNode = query(safeTemplate`\n <div class=\"lake-resizer\">\n <div class=\"lake-resizer-top-left\"></div>\n <div class=\"lake-resizer-top-right\"></div>\n <div class=\"lake-resizer-bottom-left\"></div>\n <div class=\"lake-resizer-bottom-right\"></div>\n <div class=\"lake-resizer-info\">${width} x ${height}</div>\n </div>\n `);\n const imgNode = imageInfo.node;\n imgNode.addClass('lake-image-img');\n imgNode.attr({\n draggable: 'false',\n alt: value.name,\n });\n bindResizerEvents(resizerNode.find('.lake-resizer-top-left'), box);\n bindResizerEvents(resizerNode.find('.lake-resizer-top-right'), box);\n bindResizerEvents(resizerNode.find('.lake-resizer-bottom-left'), box);\n bindResizerEvents(resizerNode.find('.lake-resizer-bottom-right'), box);\n imageNode.append(buttonGroupNode);\n imageNode.append(resizerNode);\n imageNode.append(imgNode);\n}\n\nexport const imageBox: BoxComponent = {\n type: 'inline',\n name: 'image',\n render: box => {\n const editor = box.getEditor();\n if (!editor) {\n return;\n }\n const value = box.value;\n const container = box.getContainer();\n if (value.width && value.height && container.find('.lake-progress').length === 0) {\n container.css({\n width: `${value.width}px`,\n height: `${value.height}px`,\n });\n container.empty();\n const placeholderNode = query('<div class=\"lake-image-placeholder\" />');\n container.append(placeholderNode);\n const imageIcon = icons.get('image');\n if (imageIcon) {\n placeholderNode.append(imageIcon);\n }\n }\n if (container.first().length === 0) {\n // The code below is for unit testing because some test cases need to\n // select the content of the box before it is completely loaded.\n // Example:\n // range.setStart(box.getContainer(), 1);\n container.append('<div />');\n }\n // for test\n if (value.status === 'loading') {\n return;\n }\n const imageNode = query('<div class=\"lake-image\" />');\n imageNode.addClass(`lake-image-${value.status}`);\n let promise: Promise<void>;\n if (value.status === 'uploading') {\n promise = renderUploading(imageNode, box);\n } else if (value.status === 'error') {\n promise = renderError(imageNode, box);\n } else {\n promise = renderDone(imageNode, box);\n }\n promise.then(() => {\n container.empty();\n container.append(imageNode);\n imageNode.find('.lake-button-view').on('click', () => openFullScreen(box));\n imageNode.find('.lake-button-remove').on('click', event => {\n event.stopPropagation();\n removeImageBox(box);\n });\n box.event.emit('render');\n });\n imageNode.on('click', () => {\n editor.selection.range.selectBox(box.node);\n });\n },\n html: box => {\n const value = box.node.attr('value');\n return safeTemplate`<img src=\"${box.value.url}\" data-lake-value=\"${value}\" />`;\n },\n};\n","import { BoxComponent } from '../types/box';\nimport { icons } from '../icons';\nimport { debug, query } from '../utils';\nimport { Dropdown } from '../ui/dropdown';\nimport { locale } from '../i18n';\n\nconst config = {\n defaultLang: 'text',\n comment: '#57606a',\n name: '#444d56',\n variableName: '#953800',\n typeName: '#0550ae',\n propertyName: '#444d56',\n className: '#24292e',\n labelName: '#005cc5',\n namespace: '#0550ae',\n macroName: '#444d56',\n literal: '#444d56',\n string: '#0a3069',\n number: '#0550ae',\n bool: '#0550ae',\n regexp: '#116329',\n color: '#0550ae',\n keyword: '#cf222e',\n modifier: '#24292f',\n operator: '#cf222e',\n bracket: '#57606a',\n content: '#57606a',\n meta: '#8250df',\n heading: '#0550ae',\n invalid: '#f6f8fa',\n definition: '#cf222e',\n constant: '#0550ae',\n function: '#005cc5',\n standard: '#444d56',\n special: '#444d56',\n};\n\n// https://lezer.codemirror.net/docs/ref/#highlight.tags\nfunction getHighlightStyle(CodeMirror: any) {\n const { HighlightStyle, tags } = CodeMirror;\n return HighlightStyle.define([\n { tag: [tags.comment, tags.lineComment, tags.blockComment, tags.docComment], color: config.comment },\n { tag: [tags.name], color: config.name },\n { tag: [tags.variableName, tags.self], color: config.variableName },\n { tag: [tags.typeName, tags.tagName], color: config.typeName },\n { tag: [tags.propertyName, tags.attributeName], color: config.propertyName },\n { tag: [tags.className], color: config.className },\n { tag: [tags.labelName], color: config.labelName },\n { tag: [tags.namespace], color: config.namespace },\n { tag: [tags.macroName], color: config.macroName },\n { tag: [tags.literal], color: config.literal },\n { tag: [tags.string, tags.docString, tags.character, tags.attributeValue, tags.unit], color: config.string },\n { tag: [tags.number, tags.integer, tags.float], color: config.number },\n { tag: [tags.bool, tags.null, tags.atom], color: config.bool },\n { tag: [tags.regexp, tags.escape, tags.url], color: config.regexp },\n { tag: [tags.color], color: config.color },\n { tag: [\n tags.keyword, tags.operatorKeyword, tags.controlKeyword,\n tags.definitionKeyword, tags.moduleKeyword,\n ], color: config.keyword },\n { tag: [tags.modifier], color: config.modifier },\n { tag: [\n tags.operator, tags.derefOperator, tags.arithmeticOperator, tags.logicOperator, tags.bitwiseOperator,\n tags.compareOperator, tags.updateOperator, tags.definitionOperator, tags.typeOperator, tags.controlOperator,\n ], color: config.operator },\n { tag: [\n tags.punctuation, tags.separator, tags.bracket, tags.angleBracket, tags.squareBracket,\n tags.paren, tags.brace, tags.contentSeparator,\n ], color: config.bracket },\n { tag: [tags.content], color: config.content },\n { tag: [tags.meta, tags.documentMeta, tags.annotation, tags.processingInstruction], color: config.meta },\n { tag: tags.heading, fontWeight: 'bold', color: config.heading },\n { tag: tags.strong, fontWeight: 'bold' },\n { tag: tags.emphasis, fontStyle: 'italic' },\n { tag: tags.link, textDecoration: 'underline' },\n { tag: tags.strikethrough, textDecoration: 'line-through' },\n { tag: [tags.invalid, tags.inserted, tags.deleted, tags.changed], color: config.invalid },\n { tag: [tags.definition(tags.name)], color: config.definition },\n { tag: [tags.constant(tags.name)], color: config.constant },\n { tag: [tags.function(tags.variableName)], color: config.function },\n { tag: [tags.standard(tags.name)], color: config.standard },\n { tag: [tags.special(tags.variableName)], color: config.special },\n ]);\n}\n\nexport const codeBlockBox: BoxComponent = {\n type: 'block',\n name: 'codeBlock',\n render: box => {\n const editor = box.getEditor();\n if (!editor) {\n return;\n }\n const codeBlockNode = query('<div class=\"lake-code-block\" />');\n const container = box.getContainer();\n container.empty();\n container.append(codeBlockNode);\n const codeBlockNativeNode = codeBlockNode.get(0) as HTMLElement;\n if (!codeBlockNativeNode) {\n return;\n }\n // begin to create CodeMirror\n const CodeMirror = window.CodeMirror;\n if (!CodeMirror) {\n codeBlockNode.addClass('lake-code-block-error');\n codeBlockNode.text(`\n The code cannot be displayed because window.CodeMirror is not found.\n Please check if the CodeMirror file is added to this page.\n `.trim());\n codeBlockNode.on('click', () => {\n editor.selection.range.selectBox(box.node);\n });\n return;\n }\n const {\n EditorState, Compartment, EditorView,\n keymap, history, defaultKeymap, historyKeymap,\n indentWithTab, syntaxHighlighting, langItems,\n } = CodeMirror;\n // language menu items\n const langItemMap: Map<string, any> = new Map();\n for (const item of langItems) {\n langItemMap.set(item.value, item);\n }\n const boxValue = box.value;\n const langItem = langItemMap.get(boxValue.lang);\n const language = new Compartment();\n const changeHandler = (value: string) => {\n // Here setTimeout is necessary because isComposing is not false after ending composition.\n window.setTimeout(() => {\n if (editor.isComposing) {\n return;\n }\n box.updateValue('code', value);\n editor.history.save();\n }, 0);\n };\n const updateListener = EditorView.updateListener.of((update: any) => {\n if (!update.docChanged) {\n return;\n }\n changeHandler(update.state.doc.toString());\n });\n const codeEditor = new EditorView({\n parent: codeBlockNativeNode,\n doc: boxValue.code ?? '',\n extensions: [\n EditorState.readOnly.of(editor.readonly),\n history(),\n keymap.of([\n ...defaultKeymap,\n ...historyKeymap,\n indentWithTab,\n ]),\n syntaxHighlighting(getHighlightStyle(CodeMirror)),\n language.of(langItem && langItem.component ? langItem.component() : []),\n updateListener,\n ],\n });\n codeBlockNode.find('[contenteditable=\"true\"]').attr('tabindex', '-1');\n const dropdown = new Dropdown({\n root: codeBlockNode,\n name: 'langType',\n downIcon: icons.get('down'),\n defaultValue: langItem ? boxValue.lang : config.defaultLang,\n tooltip: locale.codeBlock.langType(),\n width: 'auto',\n menuType: 'list',\n menuItems: langItems.map((item: any) => ({\n value: item.value,\n text: item.text,\n })),\n onSelect: value => {\n const item = langItemMap.get(value);\n codeEditor.dispatch({\n effects: language.reconfigure(item && item.component ? item.component() : []),\n });\n box.updateValue({\n lang: value,\n });\n editor.history.save();\n },\n });\n dropdown.render();\n box.setData('codeEditor', codeEditor);\n box.useEffect(() => () => {\n codeEditor.destroy();\n debug('CodeMirror destroyed');\n });\n },\n};\n","import type { Editor } from '..';\nimport { blockTagNames } from '../config/tag-names';\nimport { getElementRules } from '../config/element-rules';\nimport {\n forEach, wrapNodeList, changeTagName,\n fixNumberedList, removeBr, query, normalizeValue,\n} from '../utils';\nimport { Nodes } from '../models/nodes';\nimport { Box } from '../models/box';\nimport { HTMLParser } from '../parsers/html-parser';\nimport { TextParser } from '../parsers/text-parser';\nimport { uploadImage } from '../ui/upload';\n\nconst blockSelector = Array.from(blockTagNames).join(',');\n\nfunction getPasteElementRules(): any {\n const rules = getElementRules();\n rules.div = rules.p;\n forEach(rules, (key, attributeRules) => {\n delete attributeRules.id;\n delete attributeRules.class;\n });\n return rules;\n}\n\nfunction fixNestedBlocks(block: Nodes): void {\n const nodeList = [ block ];\n for (const node of block.getWalker()) {\n nodeList.push(node);\n }\n for (const node of nodeList) {\n if (node.name === 'div') {\n if (node.find(blockSelector).length > 0) {\n node.remove(true);\n } else {\n changeTagName(node, 'p');\n }\n } else if (node.isHeading || ['blockquote', 'li'].indexOf(node.name) >= 0) {\n node.find(blockSelector).remove(true);\n }\n }\n}\n\nfunction fixClipboardData(fragment: DocumentFragment): void {\n let node = new Nodes(fragment.firstChild);\n while (node.length > 0) {\n const nextNode = node.next();\n if (node.isBlock) {\n fixNestedBlocks(node);\n }\n node = nextNode;\n }\n let nodeList: Nodes[] = [];\n node = new Nodes(fragment.firstChild);\n while (node.length > 0) {\n const nextNode = node.next();\n if (node.isMark || node.isText || node.isBookmark || node.isInlineBox) {\n nodeList.push(node);\n } else {\n wrapNodeList(nodeList);\n nodeList = [];\n }\n node = nextNode;\n }\n wrapNodeList(nodeList);\n}\n\nfunction insertFirstNode(editor: Editor, otherNode: Nodes): void {\n const range = editor.selection.range;\n const boxNode = range.startNode.closest('lake-box');\n if (boxNode.length > 0) {\n const box = new Box(boxNode);\n if (box.type === 'inline') {\n if (range.isBoxStart) {\n range.setStartBefore(boxNode);\n range.collapseToStart();\n } else if (range.isBoxEnd) {\n range.setStartAfter(boxNode);\n range.collapseToStart();\n } else {\n editor.removeBox();\n }\n } else {\n const paragraph = query('<p />');\n if (range.isBoxStart) {\n boxNode.before(paragraph);\n range.shrinkAfter(paragraph);\n } else if (range.isBoxEnd) {\n boxNode.after(paragraph);\n range.shrinkAfter(paragraph);\n } else {\n editor.removeBox();\n }\n }\n }\n const block = range.startNode.closestBlock();\n if (otherNode.isBlockBox) {\n const box = new Box(otherNode);\n const value = otherNode.attr('value') !== '' ? box.value : undefined;\n editor.insertBox(box.name, value);\n otherNode.remove();\n return;\n }\n if (otherNode.first().length > 0) {\n removeBr(block);\n }\n if (block.isEmpty && block.name === 'p') {\n block.replaceWith(otherNode);\n otherNode.find('lake-box').each(node => {\n new Box(node).render();\n });\n range.shrinkAfter(otherNode);\n return;\n }\n let child = otherNode.first();\n while(child.length > 0) {\n if (child.name === 'li') {\n child = child.first();\n }\n const nextSibling = child.next();\n editor.selection.insertNode(child);\n child = nextSibling;\n }\n otherNode.remove();\n}\n\nfunction pasteFragment(editor: Editor, fragment: DocumentFragment): void {\n const selection = editor.selection;\n const range = selection.range;\n if (fragment.childNodes.length === 0) {\n return;\n }\n const firstNode = new Nodes(fragment.firstChild);\n let lastNode = new Nodes(fragment.lastChild);\n if (range.getBlocks().length === 0) {\n selection.setBlocks('<p />');\n }\n insertFirstNode(editor, firstNode);\n // remove br\n let child = new Nodes(fragment.firstChild);\n while (child.length > 0) {\n const next = child.next();\n if (child.name === 'br') {\n child.remove();\n }\n child = next;\n }\n lastNode = new Nodes(fragment.lastChild);\n // insert fragment\n if (fragment.childNodes.length > 0) {\n const parts = selection.splitBlock();\n if (parts.start) {\n range.setEndAfter(parts.start);\n range.collapseToEnd();\n }\n if (parts.end && parts.end.isEmpty) {\n parts.end.remove();\n }\n selection.insertFragment(fragment);\n range.shrinkAfter(lastNode);\n }\n fixNumberedList(editor.container.children().filter(node => node.isBlock));\n editor.history.save();\n}\n\nexport default (editor: Editor) => {\n const { imageRequestTypes } = editor.config;\n editor.container.on('paste', event => {\n const range = editor.selection.range;\n if (range.isInsideBox) {\n return;\n }\n event.preventDefault();\n const dataTransfer = (event as ClipboardEvent).clipboardData;\n if (!dataTransfer) {\n return;\n }\n editor.selection.deleteContents();\n // upload file\n if (dataTransfer.files.length > 0) {\n for (const file of dataTransfer.files) {\n if (imageRequestTypes.indexOf(file.type) >= 0) {\n uploadImage({\n editor,\n file,\n });\n }\n }\n return;\n }\n const types = dataTransfer.types;\n const isPlainText = (types.length === 1 && types[0] === 'text/plain');\n if (isPlainText) {\n const content = dataTransfer.getData('text/plain');\n const textParser = new TextParser(content);\n const fragment = textParser.getFragment();\n editor.event.emit('beforepaste', fragment);\n pasteFragment(editor, fragment);\n return;\n }\n const content = normalizeValue(dataTransfer.getData('text/html'));\n const rules = getPasteElementRules();\n const htmlParser = new HTMLParser(content, rules);\n const fragment = htmlParser.getFragment();\n editor.event.emit('beforepaste', fragment);\n fixClipboardData(fragment);\n pasteFragment(editor, fragment);\n editor.box.renderAll(editor);\n });\n};\n","import type { Editor } from '..';\nimport { query } from '../utils/query';\n\nfunction setParagraph(editor: Editor) {\n editor.selection.setBlocks('<p />');\n}\n\nfunction setNumberedList(editor: Editor) {\n editor.selection.setBlocks('<ol><li></li></ol>');\n}\n\nfunction setBulletedList(editor: Editor) {\n editor.selection.setBlocks('<ul><li></li></ul>');\n}\n\nfunction setChecklist(editor: Editor, value: boolean) {\n editor.selection.setBlocks(`<ul type=\"checklist\"><li value=\"${value}\"></li></ul>`);\n}\n\nexport default (editor: Editor) => {\n editor.command.add('list', {\n selectedValues: appliedItems => {\n let currentValue;\n for (const item of appliedItems) {\n if (item.name === 'ol') {\n currentValue = 'numbered';\n break;\n }\n if (item.name === 'ul' && !item.node.hasAttr('type')) {\n currentValue = 'bulleted';\n break;\n }\n if (item.name === 'ul' && item.node.attr('type') === 'checklist') {\n currentValue = 'checklist';\n break;\n }\n }\n return currentValue ? [currentValue] : [];\n },\n execute: (type: 'numbered' | 'bulleted' | 'checklist', value: boolean = false) => {\n const blocks = editor.selection.range.getBlocks();\n let isNumberedList = false;\n let isBulletedList = false;\n let isChecklist = false;\n for (const block of blocks) {\n if (!isNumberedList && block.name === 'ol') {\n isNumberedList = true;\n }\n if (!isBulletedList && block.name === 'ul' && !block.hasAttr('type')) {\n isBulletedList = true;\n }\n if (!isChecklist && block.name === 'ul' && block.attr('type') === 'checklist') {\n isChecklist = true;\n }\n }\n if (isNumberedList) {\n if (type === 'numbered') {\n setParagraph(editor);\n }\n if (type === 'bulleted') {\n setBulletedList(editor);\n }\n if (type === 'checklist') {\n setChecklist(editor, value);\n }\n } else if (isBulletedList) {\n if (type === 'numbered') {\n setNumberedList(editor);\n }\n if (type === 'bulleted') {\n setParagraph(editor);\n }\n if (type === 'checklist') {\n setChecklist(editor, value);\n }\n } else if (isChecklist) {\n if (type === 'numbered') {\n setNumberedList(editor);\n }\n if (type === 'bulleted') {\n setBulletedList(editor);\n }\n if (type === 'checklist') {\n setParagraph(editor);\n }\n } else {\n if (type === 'numbered') {\n setNumberedList(editor);\n }\n if (type === 'bulleted') {\n setBulletedList(editor);\n }\n if (type === 'checklist') {\n setChecklist(editor, value);\n }\n }\n editor.history.save();\n },\n });\n editor.container.on('click', event => {\n const mouseEvent = event as MouseEvent;\n if (!mouseEvent.target) {\n return;\n }\n const target = query(mouseEvent.target as Element);\n if (target.name === 'li' && target.attr('value') !== '' && mouseEvent.offsetX <= 18) {\n target.attr('value', (target.attr('value') !== 'true').toString());\n editor.history.save();\n }\n });\n};\n","import type { Editor } from '..';\n\nconst alignValueMap: {[key: string]: string} = {\n start: 'left',\n end: 'right',\n};\n\nexport default (editor: Editor) => {\n editor.command.add('align', {\n selectedValues: appliedItems => {\n let currentValue;\n for (const item of appliedItems) {\n if (item.node.isBlock) {\n currentValue = item.node.computedCSS('text-align');\n break;\n }\n }\n if (!currentValue) {\n return [];\n }\n return [alignValueMap[currentValue] || currentValue];\n },\n execute: (type: 'left' | 'center' | 'right' | 'justify') => {\n editor.selection.setBlocks({\n 'text-align': type,\n });\n editor.history.save();\n },\n });\n};\n","import type { Editor } from '..';\n\nconst tagName = 'strong';\n\nexport default (editor: Editor) => {\n editor.command.add('bold', {\n isDisabled: appliedItems => !!appliedItems.find(item => item.node.isHeading),\n isSelected: appliedItems => !!appliedItems.find(item => item.name === tagName),\n execute: () => {\n if (editor.command.isSelected('bold')) {\n editor.selection.removeMark(`<${tagName} />`);\n } else {\n editor.selection.addMark(`<${tagName} />`);\n }\n editor.history.save();\n },\n });\n editor.keystroke.setKeydown('mod+b', event => {\n event.preventDefault();\n editor.command.execute('bold');\n });\n};\n","import type { Editor } from '..';\n\nconst tagName = 'sub';\n\nexport default (editor: Editor) => {\n editor.command.add('subscript', {\n isSelected: appliedItems => !!appliedItems.find(item => item.name === tagName),\n execute: () => {\n if (editor.command.isSelected('subscript')) {\n editor.selection.removeMark(`<${tagName} />`);\n } else {\n editor.selection.addMark(`<${tagName} />`);\n }\n editor.history.save();\n },\n });\n};\n","import type { Editor } from '..';\n\nconst tagName = 'sup';\n\nexport default (editor: Editor) => {\n editor.command.add('superscript', {\n isSelected: appliedItems => !!appliedItems.find(item => item.name === tagName),\n execute: () => {\n if (editor.command.isSelected('superscript')) {\n editor.selection.removeMark(`<${tagName} />`);\n } else {\n editor.selection.addMark(`<${tagName} />`);\n }\n editor.history.save();\n },\n });\n};\n","import type { Editor } from '..';\n\nconst tagName = 'code';\n\nexport default (editor: Editor) => {\n editor.command.add('code', {\n isSelected: appliedItems => !!appliedItems.find(item => item.name === tagName),\n execute: () => {\n if (editor.command.isSelected('code')) {\n editor.selection.removeMark(`<${tagName} />`);\n } else {\n editor.selection.addMark(`<${tagName} />`);\n }\n editor.history.save();\n },\n });\n};\n","import type { Editor } from '..';\nimport { Nodes } from '../models/nodes';\n\nlet markList: Nodes[] = [];\n\nconst formatPainterClassName = 'lake-format-painter';\n\nexport default (editor: Editor) => {\n editor.command.add('formatPainter', {\n execute: () => {\n editor.container.addClass(formatPainterClassName);\n const appliedItems = editor.selection.getAppliedItems();\n for (const item of appliedItems) {\n const node = item.node.clone();\n if (node.isMark && node.name !== 'a') {\n markList.push(node);\n }\n }\n },\n });\n editor.container.on('click', () => {\n editor.container.removeClass(formatPainterClassName);\n if (markList.length === 0) {\n return;\n }\n for (const mark of markList) {\n editor.selection.addMark(mark);\n }\n markList = [];\n editor.history.save();\n });\n editor.event.on('click', (tagetNode: Nodes) => {\n if (tagetNode.isInside) {\n return;\n }\n const buttonNode = tagetNode.closest('button[name=\"formatPainter\"]');\n if (buttonNode.length > 0) {\n return;\n }\n editor.container.removeClass(formatPainterClassName);\n markList = [];\n });\n};\n","import EventEmitter from 'eventemitter3';\nimport { icons } from '../icons';\nimport { safeTemplate } from '../utils/safe-template';\nimport { query } from '../utils/query';\nimport { Nodes } from '../models/nodes';\nimport { Button } from './button';\nimport { locale } from '../i18n';\n\nexport class LinkPopup {\n private linkNode: Nodes | null = null;\n\n private root: Nodes;\n\n public container: Nodes;\n\n public event: EventEmitter = new EventEmitter();\n\n constructor(root: Nodes) {\n this.root = root;\n this.container = query(safeTemplate`\n <div class=\"lake-link-popup\">\n <div class=\"lake-row\">${locale.link.url()}</div>\n <div class=\"lake-row lake-url-row\">\n <input type=\"text\" name=\"url\" />\n </div>\n <div class=\"lake-row\">${locale.link.title()}</div>\n <div class=\"lake-row\">\n <input type=\"text\" name=\"title\" />\n </div>\n <div class=\"lake-row lake-button-row\"></div>\n </div>\n `);\n }\n\n // Writes the specified text to the system clipboard\n private async writeClipboardText(text: string): Promise<boolean> {\n let error = false;\n try {\n if (window.LAKE_TEST) {\n error = window.LAKE_ERROR;\n } else {\n await navigator.clipboard.writeText(text);\n }\n } catch {\n error = true;\n }\n return new Promise(resolve => {\n resolve(error);\n });\n }\n\n // Copy link to clipboard\n private appendCopyButton(): void {\n let timeoutId: number | null = null;\n const button = new Button({\n root: this.container.find('.lake-url-row'),\n name: 'copy',\n icon: icons.get('copy'),\n tooltip: locale.link.copy(),\n onClick: () => {\n if (!this.linkNode) {\n return;\n }\n const url = this.getInputValue('url');\n this.writeClipboardText(url).then((error: boolean) => {\n const svgNode = this.container.find('button[name=\"copy\"] svg');\n svgNode.hide();\n if (error) {\n svgNode.eq(2).show('inline');\n this.event.emit('copy', error);\n return;\n }\n svgNode.eq(1).show('inline');\n this.event.emit('copy', error);\n if (timeoutId) {\n window.clearTimeout(timeoutId);\n }\n timeoutId = window.setTimeout(() => {\n svgNode.hide();\n svgNode.eq(0).show('inline');\n }, 2000);\n });\n },\n });\n button.render();\n const copyDoneIcon = icons.get('checkCircle');\n if (copyDoneIcon) {\n button.node.append(copyDoneIcon);\n }\n const copyErrorIcon = icons.get('warningCircle');\n if (copyErrorIcon) {\n button.node.append(copyErrorIcon);\n }\n }\n\n // Open link in new tab\n private appendOpenButton(): void {\n const button = new Button({\n root: this.container.find('.lake-url-row'),\n name: 'open',\n icon: icons.get('open'),\n tooltip: locale.link.open(),\n onClick: () => {\n if (!this.linkNode) {\n return;\n }\n const url = this.getInputValue('url');\n window.open(url);\n },\n });\n button.render();\n }\n\n // Save link\n private appendSaveButton(): void {\n const button = new Button({\n root: this.container.find('.lake-button-row'),\n name: 'save',\n icon: icons.get('check'),\n text: locale.link.save(),\n onClick: () => {\n if (!this.linkNode) {\n return;\n }\n this.save();\n this.hide();\n this.event.emit('save');\n },\n });\n button.render();\n }\n\n // Remove link\n private appendUnlinkButton(): void {\n const button = new Button({\n root: this.container.find('.lake-button-row'),\n name: 'unlink',\n icon: icons.get('unlink'),\n text: locale.link.unlink(),\n onClick: () => {\n if (!this.linkNode) {\n return;\n }\n this.linkNode.remove(true);\n this.hide();\n this.event.emit('remove');\n },\n });\n button.render();\n }\n\n public getInputValue(name: string): string {\n const inputElement = this.container.find(`input[name=\"${name}\"]`);\n const nativeInputElement = inputElement.get(0) as HTMLInputElement;\n return nativeInputElement.value;\n }\n\n public setInputValue(name: string, value: string): void {\n const inputElement = this.container.find(`input[name=\"${name}\"]`);\n const nativeInputElement = inputElement.get(0) as HTMLInputElement;\n nativeInputElement.value = value;\n }\n\n public save(): void {\n if (!this.linkNode) {\n return;\n }\n const url = this.getInputValue('url');\n let title = this.getInputValue('title');\n if (url === '' && title === '') {\n this.linkNode.remove();\n return;\n }\n if (title === '') {\n title = url;\n }\n this.linkNode.attr('href', url);\n this.linkNode.text(title);\n }\n\n public updatePosition(): void {\n if (!this.linkNode) {\n return;\n }\n const linkNativeNode = this.linkNode.get(0) as HTMLElement;\n // Returns a DOMRect object providing information about the size of an element and its position relative to the viewport.\n const linkRect = linkNativeNode.getBoundingClientRect();\n const linkX = linkRect.x + window.scrollX;\n const linkY = linkRect.y + window.scrollY;\n if (linkX < 0 || linkY < 0) {\n this.hide();\n return;\n }\n // link.x + popup.width > window.width\n if (linkRect.x + this.container.width() > window.innerWidth) {\n // link.x + window.scrollX - (popup.width - link.width)\n this.container.css('left', `${linkX - this.container.width() + linkRect.width}px`);\n } else {\n this.container.css('left', `${linkX}px`);\n }\n // link.y + link.height + popup.height > window.height\n if (linkRect.y + linkRect.height + this.container.height() > window.innerHeight) {\n // link.y + window.scrollY - popup.height\n this.container.css('top', `${linkY - this.container.height()}px`);\n } else {\n this.container.css('top', `${linkY + linkRect.height}px`);\n }\n }\n\n public render(): void {\n this.appendCopyButton();\n this.appendOpenButton();\n this.appendSaveButton();\n this.appendUnlinkButton();\n this.root.append(this.container);\n }\n\n public show(linkNode: Nodes): void {\n if (this.root.find('.lake-link-popup').length === 0) {\n this.render();\n }\n if (this.linkNode && this.linkNode.get(0) === linkNode.get(0)) {\n return;\n }\n this.linkNode = linkNode;\n const url = linkNode.attr('href');\n const title = linkNode.text();\n this.setInputValue('url', url);\n if (title !== url) {\n this.setInputValue('title', title);\n }\n this.container.css('visibility', 'hidden');\n this.container.show();\n this.updatePosition();\n this.container.css('visibility', '');\n this.container.find('input[name=\"url\"]').focus();\n }\n\n public hide(): void {\n this.linkNode = null;\n this.container.hide();\n }\n}\n","import type { Editor } from '..';\nimport { Point } from '../types/object';\nimport { Nodes } from '../models/nodes';\n\ntype MarkItem = {\n re: RegExp;\n getParameters: () => string[];\n};\n\ntype BlockItem = {\n re: RegExp;\n getParameters: () => (string | boolean)[];\n} | {\n re: RegExp;\n getParameters: (results: RegExpExecArray) => (string | boolean | object)[];\n};\n\nconst headingTypeMap = new Map([\n ['#', 'h1'],\n ['##', 'h2'],\n ['###', 'h3'],\n ['####', 'h4'],\n ['#####', 'h5'],\n ['######', 'h6'],\n]);\n\nconst markItemList: MarkItem[] = [\n {\n re: /\\*\\*(.+?)\\*\\*$/,\n getParameters: () => [\n 'bold',\n ],\n },\n {\n re: /__(.+?)__$/,\n getParameters: () => [\n 'bold',\n ],\n },\n {\n re: /_(.+?)_$/,\n getParameters: () => [\n 'italic',\n ],\n },\n {\n re: /\\*(.+?)\\*$/,\n getParameters: () => [\n 'italic',\n ],\n },\n {\n re: /==(.+?)==$/,\n getParameters: () => [\n 'highlight',\n '#fff566', // yellow-4, from https://ant.design/docs/spec/colors\n ],\n },\n {\n re: /~~(.+?)~~$/,\n getParameters: () => [\n 'strikethrough',\n ],\n },\n {\n re: /`(.+?)`$/,\n getParameters: () => [\n 'code',\n ],\n },\n];\n\nconst blockItemListForSpaceKey: BlockItem[] = [\n {\n re: /^#+$/,\n getParameters: (results: RegExpExecArray) => [\n 'heading',\n headingTypeMap.get(results[0]) ?? 'h6',\n ],\n },\n {\n re: /^\\d+\\.$/,\n getParameters: () => [\n 'list',\n 'numbered',\n ],\n },\n {\n re: /^[*\\-+]$/,\n getParameters: () => [\n 'list',\n 'bulleted',\n ],\n },\n {\n re: /^\\[\\s?\\]$/,\n getParameters: () => [\n 'list',\n 'checklist',\n false,\n ],\n },\n {\n re: /^\\[x\\]$/i,\n getParameters: () => [\n 'list',\n 'checklist',\n true,\n ],\n },\n {\n re: /^>$/,\n getParameters: () => [\n 'blockQuote',\n ],\n },\n];\n\nconst blockItemListForEnterKey: BlockItem[] = [\n {\n re: /^-+$/,\n getParameters: () => [\n 'hr',\n ],\n },\n {\n re: /^`+([a-z]*)$/i,\n getParameters: (results: RegExpExecArray) => {\n if (!results[1]) {\n return [\n 'codeBlock',\n ];\n }\n return [\n 'codeBlock',\n {\n lang: results[1],\n },\n ];\n },\n },\n];\n\nfunction getMarkdownPoint(editor: Editor): Point | void {\n const selection = editor.selection;\n const range = selection.range;\n let node = range.startNode;\n let offset = range.startOffset;\n if (offset === 0) {\n return;\n }\n if (node.isElement) {\n const child = node.children()[offset - 1];\n if (!child || !child.isText) {\n return;\n }\n node = child;\n offset = node.text().length;\n }\n if (offset < 1) {\n return;\n }\n return {\n node,\n offset,\n };\n}\n\n// case 1: <p></p> to <p><br /></p>\n// case 2: <p><focus /></p> to <p><br /><focus /></p>\nfunction fixEmptyBlock(block: Nodes): void {\n const newBlock = block.clone(true);\n newBlock.find('lake-bookmark').remove();\n if (newBlock.html() !== '') {\n return;\n }\n block.prepend('<br />');\n}\n\nfunction executeMarkCommand(editor: Editor, point: Point): boolean {\n const selection = editor.selection;\n const range = selection.range;\n const offset = point.offset;\n const text = point.node.text().slice(0, offset);\n for (const item of markItemList) {\n const results = item.re.exec(text);\n if (results !== null) {\n const parameters = item.getParameters();\n const commandName = parameters.shift() as string;\n if (!editor.command.has(commandName)) {\n return false;\n }\n // <p>foo**bold**<focus /></p>, offset = 11\n // to\n // <p>foobold\\u200B<focus /></p>,\n // to\n // <p>foo[bold]\\u200B<focus /></p>, startOffset = 3, endOffset = 7\n editor.prepareOperation();\n const bookmark = selection.insertBookmark();\n const node = bookmark.focus.prev();\n const oldValue = node.text();\n const newValue = `${oldValue.replace(item.re, '$1')}\\u200B`;\n node.get(0).nodeValue = newValue;\n range.setStart(node, offset - results[0].length);\n range.setEnd(node, offset - (oldValue.length - newValue.length) - 1);\n editor.command.execute(commandName, ...parameters);\n selection.toBookmark(bookmark);\n editor.commitOperation();\n return true;\n }\n }\n return false;\n}\n\nfunction spaceKeyExecutesBlockCommand(editor: Editor, point: Point): boolean {\n const selection = editor.selection;\n const offset = point.offset;\n let text = point.node.text().slice(0, offset);\n text = text.replace(/[\\u200B\\u2060]/g, '');\n for (const item of blockItemListForSpaceKey) {\n const results = item.re.exec(text);\n if (results !== null) {\n const parameters = item.getParameters(results);\n const commandName = parameters.shift() as string;\n if (!editor.command.has(commandName)) {\n return false;\n }\n // <p>#<focus />foo</p>\n // to\n // <h1><focus />foo</h1>\n editor.prepareOperation();\n const bookmark = selection.insertBookmark();\n const node = bookmark.focus.prev();\n node.remove();\n const block = bookmark.focus.closestBlock();\n fixEmptyBlock(block);\n selection.range.shrinkAfter(block);\n editor.command.execute(commandName, ...parameters);\n selection.toBookmark(bookmark);\n editor.commitOperation();\n return true;\n }\n }\n return false;\n}\n\nfunction enterKeyExecutesBlockCommand(editor: Editor, block: Nodes): boolean {\n const selection = editor.selection;\n let text = block.text();\n text = text.replace(/[\\u200B\\u2060]/g, '');\n for (const item of blockItemListForEnterKey) {\n const results = item.re.exec(text);\n if (results !== null) {\n const parameters = item.getParameters(results);\n const commandName = parameters.shift() as string;\n if (!editor.command.has(commandName)) {\n return false;\n }\n // <p>---<focus /></p>\n // to\n // <lake-box type=\"block\" name=\"hr\" focus=\"end\"></lake-box>\n editor.prepareOperation();\n block.empty();\n fixEmptyBlock(block);\n selection.range.shrinkAfter(block);\n editor.command.execute(commandName, ...parameters);\n editor.commitOperation();\n return true;\n }\n }\n return false;\n}\n\nexport default (editor: Editor) => {\n editor.keystroke.setKeydown('space', event => {\n const selection = editor.selection;\n const range = selection.range;\n if (range.isBox) {\n return;\n }\n const point = getMarkdownPoint(editor);\n if (!point) {\n return;\n }\n if (executeMarkCommand(editor, point)) {\n event.preventDefault();\n return;\n }\n const block = range.getBlocks()[0];\n if (!block) {\n return;\n }\n if (!(block.isHeading || block.name === 'p')) {\n return;\n }\n if (spaceKeyExecutesBlockCommand(editor, point)) {\n event.preventDefault();\n }\n });\n editor.keystroke.setKeydown('enter', event => {\n const selection = editor.selection;\n const range = selection.range;\n if (range.isBox) {\n return;\n }\n const block = range.getBlocks()[0];\n if (!block) {\n return;\n }\n if (!(block.isHeading || block.name === 'p')) {\n return;\n }\n if (block.find('lake-box').length > 0) {\n return;\n }\n if (range.getEndText() !== '') {\n return;\n }\n if (enterKeyExecutesBlockCommand(editor, block)) {\n event.preventDefault();\n event.stopImmediatePropagation();\n // returning false is for unit test\n return false;\n }\n });\n};\n","import type { Editor } from '..';\nimport { query } from '../utils';\nimport { Nodes } from '../models/nodes';\n\nfunction splitBlock(editor: Editor, block: Nodes): void {\n const range = editor.selection.range;\n const endText = range.getEndText();\n editor.selection.splitBlock();\n block = range.getBlocks()[0];\n if (!block) {\n editor.history.save();\n return;\n }\n if (endText === '' && (block.isHeading || block.name === 'blockquote')) {\n editor.selection.setBlocks('<p />');\n editor.history.save();\n return;\n }\n if (block.isList && block.attr('type') === 'checklist') {\n block.find('li').attr('value', 'false');\n }\n}\n\nfunction addBlockOrSplitBlockForBox(editor: Editor): void {\n const range = editor.selection.range;\n const boxNode = range.startNode.closest('lake-box');\n const block = boxNode.closestBlock();\n if (block.length > 0 && !block.isContainer) {\n if (range.isBoxStart) {\n range.setStartBefore(boxNode);\n range.collapseToStart();\n splitBlock(editor, block);\n } else if (range.isBoxEnd) {\n range.setStartAfter(boxNode);\n range.collapseToStart();\n splitBlock(editor, block);\n } else {\n editor.removeBox();\n }\n return;\n }\n const newBlock = query('<p><br /></p>');\n if (range.isBoxStart) {\n boxNode.before(newBlock);\n } else if (range.isBoxEnd) {\n boxNode.after(newBlock);\n range.shrinkAfter(newBlock);\n } else {\n editor.removeBox();\n }\n}\n\nexport default (editor: Editor) => {\n editor.keystroke.setKeydown('enter', event => {\n const range = editor.selection.range;\n if (range.isInsideBox) {\n return;\n }\n event.preventDefault();\n editor.rectifyContent();\n if (range.isBox) {\n addBlockOrSplitBlockForBox(editor);\n editor.history.save();\n return;\n }\n range.adapt();\n if (range.isInoperative) {\n return;\n }\n if (range.isBox) {\n addBlockOrSplitBlockForBox(editor);\n editor.history.save();\n return;\n }\n let block = range.getBlocks()[0];\n if (!block) {\n editor.selection.setBlocks('<p />');\n block = range.getBlocks()[0];\n }\n if (block.isEmpty && block.name !== 'p') {\n editor.selection.setBlocks('<p />');\n editor.history.save();\n return;\n }\n splitBlock(editor, block);\n editor.history.save();\n });\n};\n","import type { Editor } from '..';\nimport { query } from '../utils';\n\nfunction addLineBreak(editor: Editor): void {\n const range = editor.selection.range;\n const block = range.startNode.closestBlock();\n if (block.length > 0 && !block.isContainer) {\n const prevNode = range.getPrevNode();\n const endText = range.getEndText();\n if (prevNode.name !== 'br' && endText === '') {\n editor.selection.insertContents('<br /><br />');\n editor.history.save();\n return;\n }\n }\n editor.selection.insertNode(query('<br />'));\n}\n\nfunction addBlockOrLineBreakForBox(editor: Editor): void {\n const range = editor.selection.range;\n const boxNode = range.startNode.closest('lake-box');\n const block = boxNode.closestBlock();\n if (block.length > 0 && !block.isContainer) {\n if (range.isBoxStart) {\n range.setStartBefore(boxNode);\n range.collapseToStart();\n addLineBreak(editor);\n } else if (range.isBoxEnd) {\n range.setStartAfter(boxNode);\n range.collapseToStart();\n addLineBreak(editor);\n } else {\n editor.removeBox();\n }\n return;\n }\n const newBlock = query('<p><br /></p>');\n if (range.isBoxStart) {\n boxNode.before(newBlock);\n } else if (range.isBoxEnd) {\n boxNode.after(newBlock);\n range.shrinkAfter(newBlock);\n } else {\n editor.removeBox();\n }\n}\n\nexport default (editor: Editor) => {\n editor.keystroke.setKeydown('shift+enter', event => {\n const range = editor.selection.range;\n if (range.isInsideBox) {\n return;\n }\n editor.rectifyContent();\n event.preventDefault();\n if (range.isBox) {\n addBlockOrLineBreakForBox(editor);\n editor.history.save();\n return;\n }\n range.adapt();\n if (range.isInoperative) {\n return;\n }\n if (range.isBox) {\n addBlockOrLineBreakForBox(editor);\n editor.history.save();\n return;\n }\n addLineBreak(editor);\n editor.history.save();\n });\n};\n","import type { Editor } from '..';\nimport { mergeNodes, setBlockIndent } from '../utils';\nimport { Nodes } from '../models/nodes';\nimport { Range } from '../models/range';\nimport { setBlocks } from '../operations/set-blocks';\n\nfunction mergeWithPreviousBlock(editor: Editor, block: Nodes): void {\n const range = editor.selection.range;\n let prevBlock = block.prev();\n if (prevBlock.length === 0) {\n if (block.name !== 'p') {\n editor.selection.setBlocks('<p />');\n }\n return;\n }\n if (prevBlock.isBox) {\n if (block.isEmpty) {\n block.remove();\n }\n range.selectBoxEnd(prevBlock);\n return;\n }\n if (prevBlock.name === 'br') {\n prevBlock.remove();\n return;\n }\n if (!prevBlock.isBlock) {\n const prevRange = new Range();\n prevRange.selectNodeContents(prevBlock);\n setBlocks(prevRange, '<p />');\n prevBlock = prevRange.startNode.closestBlock();\n }\n if (prevBlock.isEmpty) {\n prevBlock.remove();\n return;\n }\n const bookmark = editor.selection.insertBookmark();\n mergeNodes(prevBlock, block);\n editor.selection.toBookmark(bookmark);\n editor.selection.fixList();\n}\n\nexport default (editor: Editor) => {\n editor.keystroke.setKeydown('backspace', event => {\n const range = editor.selection.range;\n if (range.isInsideBox) {\n return;\n }\n editor.rectifyContent();\n if (range.isBoxStart) {\n const boxNode = range.startNode.closest('lake-box');\n const prevNode = boxNode.prev();\n if (prevNode.length === 0) {\n const block = boxNode.closestBlock();\n if (block.length > 0 && !block.isContainer) {\n event.preventDefault();\n mergeWithPreviousBlock(editor, block);\n editor.history.save();\n }\n return;\n }\n if (prevNode.isBlock) {\n if (prevNode.isEmpty) {\n event.preventDefault();\n prevNode.remove();\n editor.selection.fixList();\n editor.history.save();\n return;\n }\n event.preventDefault();\n range.shrinkAfter(prevNode);\n return;\n }\n range.adaptBox();\n }\n if (range.isBox) {\n event.preventDefault();\n editor.removeBox();\n editor.history.save();\n return;\n }\n if (!range.isCollapsed) {\n event.preventDefault();\n editor.selection.deleteContents();\n if (editor.container.html().trim() === '') {\n editor.setValue('<p><br /><focus /></p>');\n }\n editor.history.save();\n return;\n }\n range.adapt();\n const prevNode = range.getPrevNode();\n if (prevNode.isBox) {\n event.preventDefault();\n range.selectBox(prevNode);\n editor.removeBox();\n editor.history.save();\n return;\n }\n if (prevNode.name === 'br' && prevNode.prev().length > 0) {\n event.preventDefault();\n range.setStartBefore(prevNode);\n range.collapseToStart();\n prevNode.remove();\n editor.history.save();\n return;\n }\n const startText = range.getStartText();\n if (startText === '') {\n event.preventDefault();\n let block = range.getBlocks()[0];\n if (!block) {\n editor.selection.setBlocks('<p />');\n block = range.getBlocks()[0];\n }\n if(\n block.css('margin-left') !== '' ||\n block.css('text-indent') !== '' ||\n block.attr('indent') !== ''\n ) {\n setBlockIndent(block, 'decrease');\n editor.history.save();\n return;\n }\n if (block.isList || block.name === 'blockquote') {\n editor.selection.setBlocks('<p />');\n editor.history.save();\n return;\n }\n mergeWithPreviousBlock(editor, block);\n editor.history.save();\n }\n });\n};\n","import type { Editor } from '..';\nimport { mergeNodes } from '../utils';\nimport { Nodes } from '../models/nodes';\nimport { Range } from '../models/range';\nimport { setBlocks } from '../operations/set-blocks';\n\nfunction mergeWithNextBlock(editor: Editor, block: Nodes): void {\n const range = editor.selection.range;\n let nextBlock = block.next();\n if (nextBlock.length === 0) {\n editor.history.save();\n return;\n }\n if (nextBlock.isBox) {\n if (block.isEmpty) {\n block.remove();\n }\n range.selectBoxStart(nextBlock);\n editor.history.save();\n return;\n }\n if (!nextBlock.isBlock) {\n const nextRange = new Range();\n nextRange.selectNodeContents(nextBlock);\n setBlocks(nextRange, '<p />');\n nextBlock = nextBlock.closestBlock();\n }\n const bookmark = editor.selection.insertBookmark();\n mergeNodes(block, nextBlock);\n editor.selection.toBookmark(bookmark);\n editor.selection.fixList();\n}\n\nexport default (editor: Editor) => {\n editor.keystroke.setKeydown('delete', event => {\n const range = editor.selection.range;\n if (range.isInsideBox) {\n return;\n }\n editor.rectifyContent();\n if (range.isBoxEnd) {\n const boxNode = range.startNode.closest('lake-box');\n const nextNode = boxNode.next();\n if (nextNode.length === 0) {\n const block = boxNode.closestBlock();\n if (block.length > 0 && !block.isContainer) {\n event.preventDefault();\n mergeWithNextBlock(editor, block);\n editor.history.save();\n }\n return;\n }\n if (nextNode.isBlock) {\n if (nextNode.isEmpty) {\n event.preventDefault();\n nextNode.remove();\n editor.selection.fixList();\n editor.history.save();\n return;\n }\n event.preventDefault();\n range.shrinkBefore(nextNode);\n return;\n }\n range.adaptBox();\n }\n if (range.isBox) {\n event.preventDefault();\n editor.removeBox();\n editor.history.save();\n return;\n }\n if (!range.isCollapsed) {\n event.preventDefault();\n editor.selection.deleteContents();\n if (editor.container.html().trim() === '') {\n editor.setValue('<p><br /><focus /></p>');\n }\n editor.history.save();\n return;\n }\n range.adapt();\n const nextNode = range.getNextNode();\n if (nextNode.isBox) {\n event.preventDefault();\n range.selectBox(nextNode);\n editor.removeBox();\n editor.history.save();\n return;\n }\n if (nextNode.name === 'br' && nextNode.next().length > 0) {\n event.preventDefault();\n range.setStartBefore(nextNode);\n range.collapseToStart();\n nextNode.remove();\n editor.history.save();\n }\n const endText = range.getEndText();\n if (endText === '') {\n event.preventDefault();\n let block = range.getBlocks()[0];\n if (!block) {\n editor.selection.setBlocks('<p />');\n block = range.getBlocks()[0];\n }\n mergeWithNextBlock(editor, block);\n editor.history.save();\n }\n });\n};\n","import './css';\nimport './elements/box';\nimport './elements/bookmark';\nimport { BoxComponent } from './types/box';\nimport { ToolbarItem } from './types/toolbar';\nimport { icons } from './icons';\nimport * as Utils from './utils';\nimport { Nodes } from './models/nodes';\nimport { Fragment } from './models/fragment';\nimport { Range } from './models/range';\nimport { Box } from './models/box';\nimport { HTMLParser } from './parsers/html-parser';\nimport { TextParser } from './parsers/text-parser';\nimport { insertBookmark } from './operations/insert-bookmark';\nimport { toBookmark } from './operations/to-bookmark';\nimport { insertNode } from './operations/insert-node';\nimport { insertFragment} from './operations/insert-fragment';\nimport { insertContents} from './operations/insert-contents';\nimport { deleteContents} from './operations/delete-contents';\nimport { setBlocks} from './operations/set-blocks';\nimport { splitBlock} from './operations/split-block';\nimport { splitMarks} from './operations/split-marks';\nimport { addMark} from './operations/add-mark';\nimport { removeMark} from './operations/remove-mark';\nimport { fixList} from './operations/fix-list';\nimport { insertLink } from './operations/insert-link';\nimport { Button } from './ui/button';\nimport { Dropdown } from './ui/dropdown';\nimport { Editor } from './editor';\nimport { Toolbar } from './ui/toolbar';\nimport { hrBox } from './boxes/hr';\nimport { imageBox } from './boxes/image';\nimport { codeBlockBox } from './boxes/code-block';\nimport copy from './plugins/copy';\nimport cut from './plugins/cut';\nimport paste from './plugins/paste';\nimport undo from './plugins/undo';\nimport redo from './plugins/redo';\nimport selectAll from './plugins/select-all';\nimport heading from './plugins/heading';\nimport blockQuote from './plugins/block-quote';\nimport list from './plugins/list';\nimport align from './plugins/align';\nimport indent from './plugins/indent';\nimport bold from './plugins/bold';\nimport italic from './plugins/italic';\nimport underline from './plugins/underline';\nimport strikethrough from './plugins/strikethrough';\nimport subscript from './plugins/subscript';\nimport superscript from './plugins/superscript';\nimport code from './plugins/code';\nimport fontFamily from './plugins/font-family';\nimport fontSize from './plugins/font-size';\nimport fontColor from './plugins/font-color';\nimport highlight from './plugins/highlight';\nimport removeFormat from './plugins/remove-format';\nimport formatPainter from './plugins/format-painter';\nimport link from './plugins/link';\nimport hr from './plugins/hr';\nimport image from './plugins/image';\nimport codeBlock from './plugins/code-block';\nimport markdown from './plugins/markdown';\nimport enterKey from './plugins/enter-key';\nimport shiftEnterKey from './plugins/shift-enter-key';\nimport backspaceKey from './plugins/backspace-key';\nimport deleteKey from './plugins/delete-key';\nimport tabKey from './plugins/tab-key';\nimport arrowKeys from './plugins/arrow-keys';\nimport escapeKey from './plugins/escape-key';\n\nEditor.box.add(hrBox);\nEditor.box.add(imageBox);\nEditor.box.add(codeBlockBox);\n\nEditor.plugin.add(copy);\nEditor.plugin.add(cut);\nEditor.plugin.add(paste);\nEditor.plugin.add(undo);\nEditor.plugin.add(redo);\nEditor.plugin.add(selectAll);\nEditor.plugin.add(heading);\nEditor.plugin.add(blockQuote);\nEditor.plugin.add(list);\nEditor.plugin.add(align);\nEditor.plugin.add(indent);\nEditor.plugin.add(bold);\nEditor.plugin.add(italic);\nEditor.plugin.add(underline);\nEditor.plugin.add(strikethrough);\nEditor.plugin.add(subscript);\nEditor.plugin.add(superscript);\nEditor.plugin.add(code);\nEditor.plugin.add(fontFamily);\nEditor.plugin.add(fontSize);\nEditor.plugin.add(fontColor);\nEditor.plugin.add(highlight);\nEditor.plugin.add(removeFormat);\nEditor.plugin.add(formatPainter);\nEditor.plugin.add(link);\nEditor.plugin.add(hr);\nEditor.plugin.add(image);\nEditor.plugin.add(codeBlock);\nEditor.plugin.add(markdown);\nEditor.plugin.add(enterKey);\nEditor.plugin.add(shiftEnterKey);\nEditor.plugin.add(backspaceKey);\nEditor.plugin.add(deleteKey);\nEditor.plugin.add(tabKey);\nEditor.plugin.add(arrowKeys);\nEditor.plugin.add(escapeKey);\n\nexport {\n Editor,\n Toolbar,\n ToolbarItem,\n BoxComponent,\n icons,\n Utils,\n Nodes,\n Fragment,\n Range,\n Box,\n HTMLParser,\n TextParser,\n insertBookmark,\n toBookmark,\n insertNode,\n insertFragment,\n insertContents,\n deleteContents,\n setBlocks,\n splitBlock,\n splitMarks,\n addMark,\n removeMark,\n fixList,\n insertLink,\n Button,\n Dropdown,\n};\n","import type { BoxComponent } from '..';\n\nexport const hrBox: BoxComponent = {\n type: 'block',\n name: 'hr',\n render: box => {\n const editor = box.getEditor();\n if (!editor) {\n return;\n }\n box.useEffect(() => {\n const hrNode = box.getContainer().find('.lake-hr');\n hrNode.on('click', () => {\n editor.selection.range.selectBox(box.node);\n });\n });\n return '<div class=\"lake-hr\"><hr /></div>';\n },\n html: () => '<hr />',\n};\n","import type { Editor } from '..';\nimport { Box } from '../models/box';\n\nexport default (editor: Editor) => {\n editor.container.on('copy', event => {\n const range = editor.selection.range;\n if (range.isInsideBox) {\n return;\n }\n const boxNode = range.startNode.closest('lake-box');\n if (boxNode.length === 0) {\n return;\n }\n if (range.isBoxStart || range.isBoxEnd) {\n return;\n }\n event.preventDefault();\n const dataTransfer = (event as ClipboardEvent).clipboardData;\n if (!dataTransfer) {\n return;\n }\n const box = new Box(boxNode);\n const content = box.getHTML();\n dataTransfer.setData('text/html', content);\n });\n};\n","import type { Editor } from '..';\nimport { Box } from '../models/box';\n\nexport default (editor: Editor) => {\n editor.container.on('cut', event => {\n const range = editor.selection.range;\n if (range.isInsideBox) {\n return;\n }\n const boxNode = range.startNode.closest('lake-box');\n if (boxNode.length === 0) {\n return;\n }\n if (range.isBoxStart || range.isBoxEnd) {\n return;\n }\n event.preventDefault();\n const dataTransfer = (event as ClipboardEvent).clipboardData;\n if (!dataTransfer) {\n return;\n }\n const box = new Box(boxNode);\n const content = box.getHTML();\n dataTransfer.setData('text/html', content);\n editor.removeBox();\n editor.history.save();\n });\n};\n","import type { Editor } from '..';\n\nexport default (editor: Editor) => {\n editor.command.add('undo', {\n execute: () => {\n editor.history.undo();\n },\n });\n editor.keystroke.setKeydown('mod+z', event => {\n const range = editor.selection.range;\n if (range.isInsideBox) {\n return;\n }\n event.preventDefault();\n editor.command.execute('undo');\n });\n};\n","import type { Editor } from '..';\n\nexport default (editor: Editor) => {\n editor.command.add('redo', {\n execute: () => {\n editor.history.redo();\n },\n });\n const redoHandler = (event: Event) => {\n const range = editor.selection.range;\n if (range.isInsideBox) {\n return;\n }\n event.preventDefault();\n editor.command.execute('redo');\n };\n editor.keystroke.setKeydown('mod+y', redoHandler);\n editor.keystroke.setKeydown('mod+shift+z', redoHandler);\n};\n","import type { Editor } from '..';\n\nexport default (editor: Editor) => {\n editor.command.add('selectAll', {\n execute: () => {\n const range = editor.selection.range;\n range.selectNodeContents(editor.container);\n range.shrink();\n },\n });\n};\n","import type { Editor } from '..';\n\nexport default (editor: Editor) => {\n editor.command.add('heading', {\n selectedValues: appliedItems => {\n const currentItem = appliedItems.find(item => item.node.isHeading || item.name === 'p');\n return currentItem ? [currentItem.name] : [];\n },\n execute: (type: string) => {\n editor.selection.setBlocks(`<${type} />`);\n editor.history.save();\n },\n });\n};\n","import type { Editor } from '..';\n\nexport default (editor: Editor) => {\n editor.command.add('blockQuote', {\n isSelected: appliedItems => !!appliedItems.find(item => item.name === 'blockquote'),\n execute: () => {\n editor.selection.setBlocks('<blockquote />');\n editor.history.save();\n },\n });\n};\n","import type { Editor } from '..';\nimport { setBlockIndent } from '../utils';\n\nexport default (editor: Editor) => {\n editor.command.add('indent', {\n execute: (type: 'increase' | 'decrease') => {\n const blocks = editor.selection.range.getBlocks();\n for (const block of blocks) {\n setBlockIndent(block, type);\n }\n editor.history.save();\n },\n });\n};\n","import type { Editor } from '..';\n\nconst tagName = 'i';\n\nexport default (editor: Editor) => {\n editor.command.add('italic', {\n isSelected: appliedItems => !!appliedItems.find(item => item.name === tagName),\n execute: () => {\n if (editor.command.isSelected('italic')) {\n editor.selection.removeMark(`<${tagName} />`);\n } else {\n editor.selection.addMark(`<${tagName} />`);\n }\n editor.history.save();\n },\n });\n editor.keystroke.setKeydown('mod+i', event => {\n event.preventDefault();\n editor.command.execute('italic');\n });\n};\n","import type { Editor } from '..';\n\nconst tagName = 'u';\n\nexport default (editor: Editor) => {\n editor.command.add('underline', {\n isSelected: appliedItems => !!appliedItems.find(item => item.name === tagName),\n execute: () => {\n if (editor.command.isSelected('underline')) {\n editor.selection.removeMark(`<${tagName} />`);\n } else {\n editor.selection.addMark(`<${tagName} />`);\n }\n editor.history.save();\n },\n });\n editor.keystroke.setKeydown('mod+u', event => {\n event.preventDefault();\n editor.command.execute('underline');\n });\n};\n","import type { Editor } from '..';\n\nconst tagName = 's';\n\nexport default (editor: Editor) => {\n editor.command.add('strikethrough', {\n isSelected: appliedItems => !!appliedItems.find(item => item.name === tagName),\n execute: () => {\n if (editor.command.isSelected('strikethrough')) {\n editor.selection.removeMark(`<${tagName} />`);\n } else {\n editor.selection.addMark(`<${tagName} />`);\n }\n editor.history.save();\n },\n });\n editor.keystroke.setKeydown('mod+shift+x', event => {\n event.preventDefault();\n editor.command.execute('strikethrough');\n });\n};\n","import type { Editor } from '..';\n\nexport default (editor: Editor) => {\n editor.command.add('fontFamily', {\n selectedValues: appliedItems => {\n for (const item of appliedItems) {\n if (item.name === 'span') {\n const currentValue = item.node.css('font-family');\n return [currentValue.replace(/['\"]/g, '')];\n }\n }\n return [];\n },\n execute: (value: string) => {\n editor.selection.addMark(`<span style=\"font-family: ${value};\" />`);\n editor.history.save();\n },\n });\n};\n","import type { Editor } from '..';\n\nexport default (editor: Editor) => {\n editor.command.add('fontSize', {\n isDisabled: appliedItems => !!appliedItems.find(item => item.node.isHeading),\n selectedValues: appliedItems => {\n for (const item of appliedItems) {\n if (item.name === 'span') {\n const currentValue = item.node.css('font-size');\n return [currentValue.replace(/\\.\\d+/, '')];\n }\n }\n return [];\n },\n execute: (value: string) => {\n editor.selection.addMark(`<span style=\"font-size: ${value};\" />`);\n editor.history.save();\n },\n });\n};\n","import type { Editor } from '..';\nimport { toHex } from '../utils';\n\nexport default (editor: Editor) => {\n editor.command.add('fontColor', {\n selectedValues: appliedItems => {\n for (const item of appliedItems) {\n if (item.name === 'span') {\n const currentValue = item.node.computedCSS('color');\n return [toHex(currentValue)];\n }\n }\n return [];\n },\n execute: (value: string) => {\n editor.selection.addMark(`<span style=\"color: ${value};\" />`);\n editor.history.save();\n },\n });\n};\n","import type { Editor } from '..';\nimport { toHex } from '../utils';\n\nexport default (editor: Editor) => {\n editor.command.add('highlight', {\n selectedValues: appliedItems => {\n for (const item of appliedItems) {\n if (item.name === 'span') {\n const currentValue = item.node.computedCSS('background-color');\n return [toHex(currentValue)];\n }\n }\n return [];\n },\n execute: (value: string) => {\n editor.selection.addMark(`<span style=\"background-color: ${value};\" />`);\n editor.history.save();\n },\n });\n};\n","import type { Editor } from '..';\n\nexport default (editor: Editor) => {\n editor.command.add('removeFormat', {\n execute: () => {\n editor.selection.removeMark();\n editor.history.save();\n },\n });\n};\n","import { type Editor } from '..';\nimport { Nodes } from '../models/nodes';\nimport { LinkPopup } from '../ui/link-popup';\nimport { locale } from '../i18n';\n\nexport default (editor: Editor) => {\n const popup = new LinkPopup(editor.popupContainer);\n popup.event.on('save', () => {\n editor.history.save();\n });\n popup.event.on('remove', () => {\n editor.history.save();\n });\n editor.root.on('scroll', () => {\n popup.updatePosition();\n });\n editor.event.on('resize', () => {\n popup.updatePosition();\n });\n editor.event.on('click', (targetNode: Nodes) => {\n if (targetNode.closest('button[name=\"link\"]').length > 0) {\n return;\n }\n const linkNode = targetNode.closest('a');\n if (linkNode.length === 0) {\n popup.hide();\n return;\n }\n if (\n linkNode.isOutside ||\n linkNode.closest('lake-box').length > 0\n ) {\n return;\n }\n popup.show(linkNode);\n });\n editor.command.add('link', {\n execute: () => {\n const linkNode = editor.selection.insertLink(`<a href=\"\">${locale.link.newLink()}</a>`);\n if (!linkNode) {\n return;\n }\n editor.history.save();\n popup.show(linkNode);\n },\n });\n};\n","import type { Editor } from '..';\nimport { query } from '../utils';\nimport { Fragment } from '../models/fragment';\nimport { Box } from '../models/box';\n\nexport default (editor: Editor) => {\n editor.event.on('beforepaste', (nativeFragment: DocumentFragment) => {\n const fragment = new Fragment(nativeFragment);\n fragment.find('hr').each(nativeNode => {\n const node = query(nativeNode);\n const box = new Box('hr');\n node.replaceWith(box.node);\n });\n });\n editor.command.add('hr', {\n execute: () => {\n editor.insertBox('hr');\n editor.history.save();\n },\n });\n};\n","import type { Editor } from '..';\nimport { BoxValue } from '../types/box';\nimport { query } from '../utils';\nimport { Box } from '../models/box';\nimport { Fragment } from '../models/fragment';\n\nexport default (editor: Editor) => {\n editor.event.on('beforepaste', (nativeFragment: DocumentFragment) => {\n const fragment = new Fragment(nativeFragment);\n fragment.find('img').each(nativeNode => {\n const node = query(nativeNode);\n const box = new Box('image');\n const value = node.attr('data-lake-value');\n if (value === '') {\n box.value = {\n url: node.attr('src'),\n status: 'done',\n };\n } else {\n box.node.attr('value', value);\n }\n node.replaceWith(box.node);\n });\n });\n editor.command.add('image', {\n execute: (value: BoxValue) => {\n editor.insertBox('image', value);\n editor.history.save();\n },\n });\n};\n","import { type Editor } from '..';\nimport { BoxValue } from '../types/box';\n\nexport default (editor: Editor) => {\n if (!window.CodeMirror) {\n return;\n }\n editor.command.add('codeBlock', {\n execute: (value: BoxValue) => {\n const box = editor.insertBox('codeBlock', value);\n editor.history.save();\n const codeEditor = box.getData('codeEditor');\n codeEditor.focus();\n },\n });\n};\n","import type { Editor } from '..';\nimport { setBlockIndent } from '../utils';\n\nexport default (editor: Editor) => {\n editor.keystroke.setKeydown('tab', event => {\n if (editor.config.indentWithTab === false) {\n return;\n }\n event.preventDefault();\n const blocks = editor.selection.range.getBlocks();\n blocks.forEach(block => {\n if (block.name !== 'p' || block.css('text-indent') === '2em') {\n setBlockIndent(block, 'increase');\n return;\n }\n block.css('text-indent', '2em');\n });\n editor.history.save();\n });\n};\n","import type { Editor } from '..';\n\nexport default (editor: Editor) => {\n editor.keystroke.setKeydown('arrow-left', event => {\n const range = editor.selection.range;\n if (range.isInsideBox) {\n return;\n }\n const boxNode = range.commonAncestor.closest('lake-box');\n if (boxNode.length > 0) {\n if (range.isBoxStart) {\n const prevNode = boxNode.prev();\n if (prevNode.isBlock || prevNode.isBox) {\n event.preventDefault();\n if (prevNode.isInlineBox) {\n range.selectBox(prevNode);\n return;\n }\n range.shrinkAfter(prevNode);\n return;\n }\n range.setStartBefore(boxNode);\n range.collapseToStart();\n return;\n }\n if (range.isBoxEnd) {\n event.preventDefault();\n range.selectBox(boxNode);\n return;\n }\n event.preventDefault();\n range.selectBoxStart(boxNode);\n return;\n }\n if (!range.isCollapsed) {\n return;\n }\n const prevNode = range.getPrevNode();\n if (prevNode.isBox) {\n event.preventDefault();\n range.selectBox(prevNode);\n }\n });\n editor.keystroke.setKeydown('arrow-right', event => {\n const range = editor.selection.range;\n if (range.isInsideBox) {\n return;\n }\n const boxNode = range.commonAncestor.closest('lake-box');\n if (boxNode.length > 0) {\n if (range.isBoxStart) {\n event.preventDefault();\n range.selectBox(boxNode);\n return;\n }\n if (range.isBoxEnd) {\n const nextNode = boxNode.next();\n if (nextNode.isBlock || nextNode.isBox) {\n event.preventDefault();\n if (nextNode.isInlineBox) {\n range.selectBox(nextNode);\n return;\n }\n range.shrinkBefore(nextNode);\n return;\n }\n range.setStartAfter(boxNode);\n range.collapseToStart();\n return;\n }\n event.preventDefault();\n range.selectBoxEnd(boxNode);\n return;\n }\n if (!range.isCollapsed) {\n return;\n }\n const nextNode = range.getNextNode();\n if (nextNode.isBox) {\n event.preventDefault();\n range.selectBox(nextNode);\n }\n });\n editor.keystroke.setKeydown('arrow-up', event => {\n const range = editor.selection.range;\n if (range.isInsideBox) {\n return;\n }\n const boxNode = range.commonAncestor.closest('lake-box');\n if (boxNode.length > 0) {\n if (boxNode.isBlockBox) {\n const prevNode = boxNode.prev();\n if (prevNode.isBlock || prevNode.isBox) {\n event.preventDefault();\n range.shrinkAfter(prevNode);\n return;\n }\n }\n range.setStartBefore(boxNode);\n range.collapseToStart();\n }\n });\n editor.keystroke.setKeydown('arrow-down', event => {\n const range = editor.selection.range;\n if (range.isInsideBox) {\n return;\n }\n const boxNode = range.commonAncestor.closest('lake-box');\n if (boxNode.length > 0) {\n if (boxNode.isBlockBox) {\n const nextNode = boxNode.next();\n if (nextNode.isBlock || nextNode.isBox) {\n event.preventDefault();\n range.shrinkBefore(nextNode);\n return;\n }\n }\n range.setStartAfter(boxNode);\n range.collapseToStart();\n }\n });\n};\n","import type { Editor } from '..';\n\nexport default (editor: Editor) => {\n editor.keystroke.setKeydown('escape', event => {\n const selection = editor.selection;\n const range = selection.range;\n if (range.isBoxCenter || range.isInsideBox) {\n event.preventDefault();\n const boxNode = range.commonAncestor.closest('lake-box');\n range.selectBoxEnd(boxNode);\n selection.addRangeToNativeSelection();\n return;\n }\n if (editor.root.hasClass('lake-root-focused')) {\n event.preventDefault();\n editor.blur();\n }\n });\n};\n"],"names":["BoxElement","HTMLElement","customElements","define","BookmarkElement","icons","Map","template","strings","keys","content","i","length","String","replace","characterMap","encode","value","match","_a","get","safeTemplate","camelCase","valueList","split","camelString","forEach","val","index","charAt","toUpperCase","substring","inString","string","delimiter","undefined","indexOf","hex","hexString","Number","parseInt","toString","toLowerCase","toHex","p1","p2","p3","p4","Math","round","parseFloat","alphaToHex","parseStyle","styleValue","properties","re","result","exec","key","trim","normalizeValue","denormalizeValue","modifierText","userAgent","modText","navigator","map","callback","getCSS","element","propertyName","camelPropertyName","computedStyle","window","getComputedStyle","style","getPropertyValue","toNodeList","valueType","nodeList","push","textNode","document","createTextNode","test","container","createElement","innerHTML","child","childNodes","elements","querySelectorAll","NativeNode","Node","blockTagNames","Set","markTagNames","voidTagNames","headingTagNames","listTagNames","tableTagNames","debug","data","LAKE_DEBUG","console","log","apply","eventData","lastNodeId","Nodes","constructor","node","this","Array","isArray","lakeId","id","name","nodeName","isElement","nodeType","ELEMENT_NODE","isText","TEXT_NODE","isBlock","has","isMark","isVoid","isHeading","isList","isTable","isBookmark","isBox","isInlineBox","attr","isBlockBox","isContainer","getAttribute","isOutside","closest","isInside","isTopInside","parentNode","parent","isContentEditable","isIndivisible","isEmpty","nodeText","text","isEmptyText","find","isSibling","target","getAll","eq","each","nodes","eachElement","reverse","matches","selector","from","children","closestBlock","closestOperableBlock","boxNode","block","parentBlock","closestContainer","prev","previousSibling","next","nextSibling","first","firstChild","last","lastChild","sibling","path","childList","getWalker","iterate","nextNode","on","type","listener","addEventListener","elementId","off","eventItems","item","removeEventListener","filter","emit","event","Event","getEventListeners","focus","blur","clone","deep","cloneNode","hasAttr","attributeName","hasAttribute","setAttribute","removeAttr","removeAttribute","hasClass","className","addClass","classList","add","removeClass","remove","computedCSS","css","width","offsetWidth","innerWidth","paddingLeft","paddingRight","height","offsetHeight","show","displayType","hide","html","nodeValue","innerText","outerHTML","empty","prepend","insertBefore","appendChild","append","before","after","replaceWith","newContent","replaceChild","keepChildren","removeChild","splitText","offset","newNode","query","Range","range","createRange","startNode","startContainer","startOffset","endNode","endContainer","endOffset","commonAncestor","commonAncestorContainer","isCollapsed","collapsed","isBoxStart","boxContainer","compareBeforeNode","isBoxCenter","isBoxEnd","compareAfterNode","isInsideBox","isInoperative","startBlock","endBlock","comparePoint","targetRange","setStart","setStartBefore","collapseToStart","setStartAfter","intersectsNode","setEnd","setEndBefore","setEndAfter","collapse","collapseToEnd","selectNode","selectNodeContents","selectBox","Error","selectBoxStart","boxStrip","selectBoxEnd","shrinkBefore","shrinkAfter","shrink","adaptBox","startBoxNode","startRange","endBoxNode","endRange","adaptTable","startTable","endTable","adaptBlock","nextBlock","adapt","getPrevNode","prevNode","getNextNode","getBoxes","startBox","clonedRange","getBlocks","blocks","getMarks","hasText","marks","stratRange","getStartText","cloneContents","getEndText","cloneRange","splitNodes","limitNode","startPart","start","end","appendDeepest","removeBr","getAfterPoint","mergeNodes","otherNode","originalOtherNode","list","nextOtherNode","isEqualNode","getDeepest","wrapNodeList","wrapper","deepestElement","removeZWS","changeTagName","newTagName","nativeElement","newElement","attributes","fixNumberedList","firstBlock","lastBlock","targetBlocks","currentStart","expectedStart","setBlockIndent","indent","EMPTY_SET","noOp","defaults","morphStyle","callbacks","beforeNodeAdded","afterNodeAdded","beforeNodeMorphed","afterNodeMorphed","beforeNodeRemoved","afterNodeRemoved","beforeAttributeUpdated","afterAttributeUpdated","beforeChildrenUpdated","head","shouldPreserve","elt","shouldReAppend","shouldRemove","afterHeadMorphed","isIdInConsideration","ctx","deadIds","idIsWithinNode","targetNode","idMap","removeIdsFromConsideration","idSet","getIdIntersectionCount","node1","node2","sourceSet","matchCount","populateIdMapForNode","nodeParent","parentElement","idElements","current","set","createIdMap","oldContent","createMorphContext","oldNode","config","finalConfig","Object","assign","mergeDefaults","ignoreActive","ignoreActiveValue","isIdSetMatch","tagName","isSoftMatch","removeNode","tempNode","removeNodesBetween","startInclusive","endExclusive","findIdSetMatch","oldParent","newChild","insertionPoint","newChildPotentialIdCount","potentialMatch","otherMatchCount","findSoftMatch","potentialSoftMatch","siblingSoftMatchCount","scoreElement","ignoreAttribute","to","updateType","activeElement","morphOldNodeTo","fromAttributes","toAttributes","fromAttribute","toAttribute","syncNodeFrom","possibleActiveElement","ignoreValueOfActiveElement","morphChildren","newParent","nextNewChild","idSetMatch","softMatch","morphNormalizedContent","normalizedNewContent","bestMatch","currentElement","bestElement","score","newScore","findBestNodeMatch","morphedNode","stack","added","pop","_b","insertSiblings","morph","normalizedContent","generatedByIdiomorph","dummyParent","normalizeContent","getBody","xhr","responseText","response","JSON","parse","e","request","option","XMLHttpRequest","onProgress","upload","onprogress","total","percent","loaded","formData","FormData","filename","file","Blob","onerror","onError","onload","status","msg","method","action","err","url","getError","onSuccess","open","withCredentials","headers","setRequestHeader","h","send","Fragment","fragment","createDocumentFragment","nativeNode","_hasBuffer","Buffer","_TD","TextDecoder","_TE","TextEncoder","b64chs","prototype","slice","call","b64tab","a","tab","c","b64re","_fromCC","fromCharCode","bind","_U8Afrom","Uint8Array","it","_mkUriSafe","src","m0","_tidyB64","s","btoaPolyfill","bin","u32","c0","c1","c2","asc","pad","charCodeAt","TypeError","_btoa","btoa","_fromUint8Array","u8a","strs","l","subarray","join","cb_utob","cc","re_utob","utob","u","_encode","urlsafe","re_btou","cb_btou","cccc","btou","b","atobPolyfill","u24","r1","r2","_atob","atob","_toUint8Array","_decode","decode","_unURI","gBase64","hasOwnProperty","prefix","Events","EE","fn","context","once","addListener","emitter","evt","_events","_eventsCount","clearEvent","EventEmitter","create","__proto__","eventNames","events","names","getOwnPropertySymbols","concat","listeners","handlers","ee","listenerCount","a1","a2","a3","a4","a5","args","len","arguments","removeListener","j","removeAllListeners","prefixed","module","exports","boxes","editors","boxData","effectData","framework","Box","component","setup","cleanup","addFramework","getContainer","preventDefault","Base64","stringify","updateValue","valueKey","valueValue","getData","setData","getEditor","useEffect","render","newContainer","unmount","getHTML","blockAttributeRules","class","getElementRules","h1","h2","h3","h4","h5","h6","p","blockquote","ul","ol","li","table","border","tr","th","td","colspan","rowspan","br","hr","img","alt","span","color","strong","em","sub","sup","code","href","rel","download","HTMLParser","rules","source","parseHTML","doc","DOMParser","parseFromString","querySelector","matchRule","rule","RegExp","getOpenTagString","attributeRules","hasAttributes","attributeMap","styleRules","styleMap","openTag","attrName","attrValue","styleString","styleName","getClosedTagString","getTrimmedText","prevSibling","closedTag","getNodeList","getFragment","body","TextParser","insertNode","nativeRange","insertBookmark","anchor","removeAndNormalizeNode","previousNode","normalize","zeroWidthSpace","toBookmark","bookmark","box","focusValue","anchorRange","fixList","deleteContents","noMerge","prevBlock","insertFragment","insertContents","setBlocks","blockList","valueNode","deepestBlock","nonBlockNodes","isBeforeRange","getTopNonBlockNodes","splitBlock","limitBlock","parts","removeEmptyMarks","splitMarksAtPoint","removeEmptyMark","splitMarks","center","startParts","endParts","getUpperMark","nextParent","addMark","cssProperties","newBlock","newMark","copyNestedMarks","removePreviousOrNextZWS","upperMark","newValueNode","removeMark","mark","insertLink","linkNode","Button","root","tabIndex","buttonNode","tooltip","icon","onClick","Dropdown","documentClickListener","titleNode","menuNode","menuType","getValue","setValue","getMenuMap","menuItems","menuMap","menuItem","updateColorAccent","svgNode","lineNode","apppendMenuItems","listNode","menuIconNode","checkIcon","checkNode","showMenu","dropdownNode","currentValues","getBoundingClientRect","x","bindEvents","iconNode","downIconNode","defaultValue","onSelect","listItem","downIcon","accentIcon","isObject_1","freeGlobal","global","freeSelf","self","Function","now_1","Date","now","reWhitespace","_trimmedEndIndex","trimmedEndIndex","require$$0","reTrimStart","_baseTrim","_Symbol","Symbol","objectProto","nativeObjectToString","symToStringTag","toStringTag","_getRawTag","isOwn","tag","unmasked","getRawTag","require$$1","objectToString","baseGetTag","isObjectLike","baseTrim","isObject","isSymbol","reIsBadHex","reIsBinary","reIsOctal","freeParseInt","toNumber","other","valueOf","isBinary","nativeMax","max","nativeMin","min","debounce_1","func","wait","options","lastArgs","lastThis","maxWait","timerId","lastCallTime","lastInvokeTime","leading","maxing","trailing","invokeFunc","time","thisArg","shouldInvoke","timeSinceLastCall","timerExpired","trailingEdge","setTimeout","timeWaiting","remainingWait","debounced","isInvoking","leadingEdge","clearTimeout","cancel","flush","getAttributes","Selection","selection","getSelection","getRangeFromNativeSelection","rangeCount","getRangeAt","addRangeToNativeSelection","removeAllRanges","addRange","syncByRange","newRange","synByBookmark","boxFocus","getAppliedItems","appliedItems","styles","pushAncestralNodes","pushNextNestedNodes","Command","commandMap","commandItem","delete","getNames","getItem","isDisabled","isSelected","selectedValues","execute","$","safeAdd","y","lsw","md5cmn","q","t","num","cnt","md5ff","d","md5gg","md5hh","md5ii","binlMD5","olda","oldb","oldc","oldd","binl2rstr","input","output","length32","rstr2binl","length8","rstr2hex","hexTab","str2rstrUTF8","unescape","encodeURIComponent","rawMD5","rstrMD5","rawHMACMD5","k","hash","bkey","ipad","opad","rstrHMACMD5","md5","raw","boxInstances","History","canSave","limit","removeBookmark","addIdToBoxes","removeIdfromBoxes","morphContainer","sourceItem","instanceMap","otherContainer","cloneContainer","startNodePath","endNodePath","newStartNode","newEndNode","count","canUndo","canRedo","undo","prevItem","prevValue","redo","nextItem","nextValue","pause","save","splice","Infinity","shift","platform","n","r","o","getModifierState","includes","timeout","f","KeyboardEvent","clear","shortenedTypeMap","Keystroke","keydownEventList","keyupEventList","normalizeType","setKeydown","handler","createKeybindingsHandler","setKeyup","keydown","keyup","defaultConfig","readonly","spellcheck","indentWithTab","minChangeSize","imageRequestMethod","imageRequestAction","imageRequestTypes","Editor","unsavedInputData","isComposing","beforeunloadListener","commitUnsavedInputData","selectionchangeListener","updateBoxSelectionStyle","emitStateChangeEvent","clickListener","resizeListener","debounce","findAll","commandNames","command","disabledNameMap","selectedNameMap","selectedValuesMap","values","stateData","toolbar","updateState","emitChangeEvent","rectifyContent","containerWrapper","overlayContainer","popupContainer","contenteditable","tabindex","history","keystroke","inputInBoxStrip","stripNode","paragraph","bindInputEvents","inputEvent","inputType","bindHistoryEvents","renderAll","rectifyInstances","bindFocusEvents","prepareOperation","commitOperation","continue","insertBox","boxName","boxValue","getInstances","removeBox","plugin","loadAll","version","editor","isConnected","boxNativeNode","pluginList","REGEX_SWITCH_CASE","REGEX_BRACKETS_SPLIT","removeOuterBrackets","parseRawText","rawText","optimize","firstKey","lastKey","part","startsWith","lastAccessor","entries","zero","one","two","few","many","rest","nrOfEntries","entry","z","m","parsePluralPart","parsedPart","keyPart","formatterKeys","keyWithoutType","isOptional","parseArgumentPart","trimmed","fromEntries","v","trimAllValues","object","Boolean","applyFormatters","formatters","initialValue","reduce","formatterKey","cases","accumulator","REGEX_PLURAL_VALUE_INJECTION","translate","textParts","pluralRules","firstArg","isBasicPluralPart","select","getPlural","formattedValue","applyArguments","getTranslateInstance","locale","cache","Intl","PluralRules","getPartsFromString","wrap","proxyObject","translateFn","defineProperty","writable","createProxy","Proxy","iterator","localeTranslations","selectAll","blockQuote","numberedList","bulletedList","checklist","alignLeft","alignCenter","alignRight","alignJustify","increaseIndent","decreaseIndent","bold","italic","underline","strikethrough","superscript","subscript","removeFormat","formatPainter","link","codeBlock","heading","heading1","heading2","heading3","heading4","heading5","heading6","align","fontFamily","fontSize","moreStyle","fontColor","highlight","image","removeColor","newLink","title","copy","unlink","view","previous","close","loadingError","zoomOut","zoomIn","langType","ja","ko","locales","loadedLocales","loadedFormatters","loadLocale","loadFormatters","translations","initI18nObject","i18nObject","LAKE_LANGUAGE","headingMenuItems","listMenuItems","alignMenuItems","indentMenuItems","moreStyleMenuItems","colors","colorMenuItems","tagPluginNameMap","toolbarItems","accept","multiple","uploadImage","URL","createObjectURL","size","lastModified","percentNode","error","defaultItems","toolbarItemMap","__awaiter","_arguments","P","generator","Promise","resolve","reject","fulfilled","step","rejected","done","then","appendToEl","el","setWidthHeight","w","SuppressedError","LOAD_STATE","getElementsFromOption","legacySelector","Element","NodeList","isSafari","vendor","PhotoSwipeEvent$1","details","defaultPrevented","Eventable$1","_listeners","_filters","pswp","addFilter","priority","_this$_filters$name","_this$_filters$name2","_this$pswp","sort","f1","f2","removeFilter","applyFilters","_this$_filters$name3","_this$_listeners$name","_this$pswp2","_this$pswp3","dispatch","_this$_listeners$name2","PhotoSwipeEvent","Placeholder$1","imageSrc","imgEl","decoding","setDisplayedSize","transformOrigin","transform","scale","propValue","toTransformString","destroy","_this$element","Content$1","itemData","instance","placeholder","slide","displayedImageWidth","displayedImageHeight","isAttached","hasSlide","isDecoding","state","removePlaceholder","keepPlaceholder","load","isLazy","reload","usePlaceholder","placeholderEl","placeholderSrc","msrc","isFirstSlide","Placeholder","isImageContent","loadImage","updateContentSize","_this$data$src","_this$data$alt","imageElement","updateSrcsetSizes","srcset","complete","onLoaded","setSlide","isActive","heavyAppended","displayError","isError","isLoading","isInitialSizeUpdate","isZoomable","sizesWidth","dataset","largestUsedSize","sizes","lazyLoad","_this$instance$option","_this$instance$option2","errorMsgEl","errorMsg","supportsDecode","catch","finally","appendImage","activate","holderElement","deactivate","parsePaddingOption","prop","viewportSize","paddingValue","paddingFn","padding","legacyPropName","ZoomLevel$1","panAreaSize","elementSize","fit","fill","vFill","initial","secondary","update","maxWidth","maxHeight","hRatio","vRatio","_getInitial","_getSecondary","_getMax","zoomLevels","slideData","_parseZoomLevelOption","optionPrefix","optionName","optionValue","currZoomLevel","lazyLoadData","createContentFromData","zoomLevel","ZoomLevel","getViewportSizeFn","newViewportSize","documentElement","clientWidth","innerHeight","getViewportSize","getPanAreaSize","ceil","Eventable","getNumItems","_this$options","numItems","dataSource","items","_getGalleryDOMElements","gallery","Content","getItemData","_this$options2","dataSourceItem","_domElementToItemData","galleryElement","_this$options3","_this$options4","childSelector","linkEl","pswpSrc","pswpSrcset","pswpWidth","pswpHeight","pswpType","thumbnailEl","_thumbnailEl$getAttri","currentSrc","pswpCropped","cropped","thumbCropped","PhotoSwipeLightbox","PhotoSwipeBase","super","_uid","shouldOpen","_preloadedContent","onThumbnailsClick","init","gallerySelector","button","ctrlKey","metaKey","altKey","shiftKey","specialKeyUsed","initialPoint","clientX","clientY","clickedIndex","getClickedIndex","currentTarget","loadAndOpen","getClickedIndexFn","clickedTarget","clickedChildIndex","findIndex","contains","galleryElements","initialPointerPos","preload","promiseArray","pswpModuleType","pswpModule","goTo","openPromise","preloadFirstSlide","lazyLoadSlide","uid","all","iterableModules","mainModule","_openPhotoswipe","default","contentLoader","addToCache","equalizePoints","roundPoint","getDistanceBetween","abs","sqrt","pointsEqual","clamp","setTransform","defaultCSSEasing","setTransitionStyle","duration","ease","transition","supportsPassive","DOMEvents","_pool","passive","_toggleListener","removeAll","poolItem","unbind","skipPool","methodName","eType","eventOptions","PanBounds","_updateAxis","reset","axis","elSize","correctPan","panOffset","Slide","currIndex","currentResolution","pan","opener","isOpen","getContentBySlide","bounds","prevDisplayedWidth","prevDisplayedHeight","setIsActive","calculateSize","appendHeavy","zoomAndPanToInitial","applyCurrentZoomPan","mainScroll","isShifted","resize","panTo","force","scaleMultiplier","sizeChanged","getPlaceholderElement","_this$content$placeho","zoomTo","destZoomLevel","centerPoint","transitionDuration","ignoreBounds","animations","stopAllPan","prevZoomLevel","setZoomLevel","calculateZoomToPanOffset","finishTransition","_setResolution","startTransition","isPan","getCurrentTransform","onComplete","easing","toggleZoom","zoomAnimationDuration","point","getViewportCenterPoint","zoomFactor","panX","panY","isPannable","_applyZoomTransform","currSlide","zoom","newResolution","DragHandler","gestures","startPan","stopAll","change","prevP1","dragAxis","closeOnVerticalDrag","isMultitouch","_setPanWithFriction","bgOpacity","_getVerticalDragRatio","applyBgOpacity","_panOrMoveMainScroll","velocity","indexDiff","currentSlideVisibilityRatio","getCurrSlideX","moveIndexBy","correctZoomPan","_finishPanGestureForAxis","panPos","restoreBgOpacity","projectedPosition","initialVelocity","decelerationRate","project","vDragRatio","projectedVDragRatio","correctedPanPosition","dampingRatio","initialBgOpacity","totalPanDist","startSpring","onUpdate","pos","animationProgressRatio","floor","delta","newMainScrollX","moveTo","newPan","allowPanToNext","currSlideMainScrollX","mainScrollShiftDiff","isLeftToRight","isRightToLeft","_this$pswp$currSlide$","_this$pswp$currSlide","potentialPan","customFriction","getZoomPointsCenter","ZoomHandler","_startPan","_startZoomPoint","_zoomPoint","_wasOverFitZoomLevel","_startZoomLevel","startP1","startP2","minZoomLevel","maxZoomLevel","pinchToClose","_calculatePanForZoomLevel","ignoreGesture","destinationZoomLevel","currZoomLevelNeedsChange","initialPan","destinationPan","panNeedsChange","naturalFrequency","newZoomLevel","didTapOnMainContent","TapHandler","click","originalEvent","targetClassList","isImageClick","isBackgroundClick","_doClickOrTapAction","tap","doubleTap","actionName","_this$gestures$pswp$e","actionFullName","clickToCloseNonZoomable","toggle","Gestures","prevP2","_lastStartP1","_intervalP1","_numActivePoints","_ongoingPointers","_touchEventEnabled","_pointerEventEnabled","PointerEvent","supportsTouch","maxTouchPoints","_intervalTime","_velocityCalculated","isDragging","isZooming","raf","_tapTimer","drag","tapHandler","scrollWrap","_onClick","_bindEvents","ontouchmove","ontouchend","pref","down","up","cancelEvent","onPointerDown","onPointerMove","onPointerUp","isMousePointer","pointerType","mouseDetected","_preventPointerEventBehaviour","_updatePoints","_clearTapTimer","_finishDrag","_updateStartPoints","_rafStopLoop","_rafRenderLoop","_calculateDragDirection","_updateVelocity","_finishTap","_updatePrevPoints","requestAnimationFrame","_getVelocity","tapDelay","doubleTapAction","displacement","cancelAnimationFrame","pointerEvent","pointerIndex","ongoingPointer","pointerId","_convertEventPosToPoint","touchEvent","touches","diff","axisToCheck","pageX","pageY","identifier","stopPropagation","MainScroll","slideWidth","_currPositionIndex","_prevPositionIndex","_containerShiftIndex","itemHolders","resizeSlides","newSlideWidth","spacing","slideWidthChanged","itemHolder","resetPosition","appendHolders","display","canBeSwiped","animate","velocityX","newIndex","potentialIndex","numSlides","canLoop","getLoopedIndex","distance","stopMainScroll","destinationX","isMainScroll","updateCurrItem","currDiff","currDistance","_this$itemHolders$","positionDifference","tempHolder","diffAbs","setContent","unshift","updateLazy","dragging","newSlideIndexOffset","KeyboardKeyCodesMap","Escape","ArrowLeft","ArrowUp","ArrowRight","ArrowDown","Tab","getKeyboardEventKey","isKeySupported","Keyboard","_wasFocused","trapFocus","_focusRoot","_onFocusIn","_onKeyDown","lastActiveElement","returnFocus","keydownAction","isForward","keyCode","escKey","arrowKeys","DEFAULT_EASING","CSSAnimation","props","_props$prop","onFinish","_target","_onComplete","_finished","_onTransitionEnd","_helperTimeout","_finalizeAnimation","SpringEaser","_dampingRatio","_naturalFrequency","_dampedFrequency","easeFrame","deltaPosition","deltaTime","coeff","naturalDumpingPow","E","dumpedFCos","cos","dumpedFSin","sin","SpringAnimation","_raf","easer","prevTime","animationLoop","Animations","activeAnimations","_start","isSpring","animation","stop","isPanRunning","some","ScrollWheel","_onWheel","deltaX","deltaY","wheelToZoom","deltaMode","UIElement","_container","elementHTML","isButton","ariaLabel","ariaText","htmlData","isCustomSVG","svgData","out","outlineID","inner","addElementHTML","onInit","onclick","appendTo","topBar","initArrowButton","isNextButton","loop","disabled","arrowPrev","order","arrowNext","closeButton","zoomButton","loadingIndicator","indicatorElement","isVisible","delayTimeout","setIndicatorVisibility","visible","updatePreloaderVisibility","_pswp$currSlide","_pswp$currSlide2","preloaderDelay","ui","counterIndicator","counterElement","indexIndicatorSep","setZoomedIn","isZoomedIn","UI","isRegistered","uiElementsData","_lastUpdatedZoomLevel","uiElementData","registerElement","_pswp$element","_onZoomPanUpdate","elementData","isClosing","currZoomLevelDiff","imageClickAction","ContentLoader","_cachedItems","loadSlideByIndex","initialIndex","getContentByIndex","removeByIndex","indexToRemove","MIN_OPACITY","Opener","isClosed","isOpening","_duration","_useAnimation","_croppedZoom","_animateRootOpacity","_animateBgOpacity","_placeholder","_opacityElement","_cropContainer1","_cropContainer2","_thumbBounds","_prepareOpen","hideAnimationDuration","maxWidthToAnimate","_applyStartProps","showAnimationDuration","_options$showHideOpac","showHideAnimationType","showHideOpacity","_initialThumbBounds","getThumbBounds","_animateZoom","bg","opacity","innerRect","overflow","_setClosedStateZoomPan","willChange","decoded","isDelaying","_initiate","_this$pswp$element","_this$pswp$element2","setProperty","_animateToOpenState","_animateToClosedState","_onAnimationComplete","_animateTo","containerOnePanX","containerOnePanY","containerTwoPanX","containerTwoPanY","animProps","defaultOptions","bgClickAction","tapAction","PhotoSwipe","_prepareOptions","_prevViewportSize","isDestroying","hasMouse","_initialItemData","keyboard","_createMainStructure","rootClasses","mainClass","scrollWheel","isNaN","updateSize","pageYOffset","_handlePageResize","_updatePageScrollOffset","_itemHolder$slide","_this$currSlide","_this$currSlide2","_itemHolder$slide2","refreshSlideContent","slideIndex","_this$currSlide$index","_this$currSlide3","potentialHolderIndex","_itemHolder$slide3","holder","matchMedia","_this$element2","setScrollOffset","thumbBounds","thumbnail","thumbSelector","imageWidth","imageHeight","thumbAreaRect","fillZoomLevel","offsetX","offsetY","left","top","getCroppedBoundsByElement","getBoundsByElement","bindResizerEvents","pointerNode","infoNode","isPlus","initialWidth","rate","pointermoveListener","diffX","newWidth","newHeight","setPointerCapture","getImageInfo","position","visibility","imgNativeNode","renderError","imageNode","buttonGroupNode","removeButton","removeIcon","errorNode","imageIcon","imageBox","placeholderNode","promise","imageInfo","originalWidth","originalHeight","progressNode","circleNotchIcon","imgNode","draggable","renderUploading","viewButton","maximizeIcon","resizerNode","renderDone","currentIndex","allImageBox","imageValue","originalUrl","lightbox","arrowPrevSVG","arrowNextSVG","closeSVG","arrowPrevTitle","arrowNextTitle","closeTitle","openFullScreen","abort","removeImageBox","getHighlightStyle","CodeMirror","HighlightStyle","tags","comment","lineComment","blockComment","docComment","variableName","typeName","labelName","namespace","macroName","literal","docString","character","attributeValue","unit","number","integer","float","bool","null","atom","regexp","escape","keyword","operatorKeyword","controlKeyword","definitionKeyword","moduleKeyword","modifier","operator","derefOperator","arithmeticOperator","logicOperator","bitwiseOperator","compareOperator","updateOperator","definitionOperator","typeOperator","controlOperator","punctuation","separator","bracket","angleBracket","squareBracket","paren","brace","contentSeparator","meta","documentMeta","annotation","processingInstruction","fontWeight","emphasis","fontStyle","textDecoration","invalid","inserted","deleted","changed","definition","constant","function","standard","special","codeBlockBox","codeBlockNode","codeBlockNativeNode","EditorState","Compartment","EditorView","keymap","defaultKeymap","historyKeymap","syntaxHighlighting","langItems","langItemMap","langItem","lang","language","updateListener","of","docChanged","codeEditor","extensions","readOnly","effects","reconfigure","blockSelector","fixNestedBlocks","pasteFragment","firstNode","lastNode","insertFirstNode","setParagraph","setNumberedList","setBulletedList","setChecklist","alignValueMap","markList","formatPainterClassName","LinkPopup","writeClipboardText","LAKE_TEST","LAKE_ERROR","clipboard","writeText","appendCopyButton","timeoutId","getInputValue","copyDoneIcon","copyErrorIcon","appendOpenButton","appendSaveButton","appendUnlinkButton","setInputValue","updatePosition","linkRect","linkX","scrollX","linkY","scrollY","headingTypeMap","markItemList","getParameters","blockItemListForSpaceKey","results","blockItemListForEnterKey","fixEmptyBlock","endText","addBlockOrSplitBlockForBox","addLineBreak","addBlockOrLineBreakForBox","mergeWithPreviousBlock","prevRange","mergeWithNextBlock","nextRange","dataTransfer","clipboardData","files","types","div","getPasteElementRules","fixClipboardData","redoHandler","currentItem","currentValue","isNumberedList","isBulletedList","isChecklist","mouseEvent","tagetNode","popup","nativeFragment","getMarkdownPoint","parameters","commandName","oldValue","newValue","executeMarkCommand","spaceKeyExecutesBlockCommand","enterKeyExecutesBlockCommand","stopImmediatePropagation","allMenuMap","buttonItemList","dropdownItemList","appendDivider","appendButton","appendDropdown","appendUpload","uploadNode","fileNode","fileNativeNode","selectedClass"],"mappings":"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","x_google_ignoreList":[35,36,58,59,60,61,62,63,64,65,66,67,68,69,70,71,74,77,84,85,86,87,97,98,99]}