@json-to-office/jto 1.0.0 → 1.2.0

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.
Files changed (23) hide show
  1. package/dist/cli.js +4 -4
  2. package/dist/cli.js.map +1 -1
  3. package/dist/client/assets/{HomePage-D3vuZyJI.js → HomePage-jkIz_s7u.js} +4 -4
  4. package/dist/client/assets/{HomePage-D3vuZyJI.js.map → HomePage-jkIz_s7u.js.map} +1 -1
  5. package/dist/client/assets/{JsonEditorPage-Cqy_bBQ5.js → JsonEditorPage-DR8UoROz.js} +3 -3
  6. package/dist/client/assets/{JsonEditorPage-Cqy_bBQ5.js.map → JsonEditorPage-DR8UoROz.js.map} +1 -1
  7. package/dist/client/assets/{MonacoPluginProvider-BNFHf2Mg.js → MonacoPluginProvider-CE5NPGwN.js} +3 -3
  8. package/dist/client/assets/{MonacoPluginProvider-BNFHf2Mg.js.map → MonacoPluginProvider-CE5NPGwN.js.map} +1 -1
  9. package/dist/client/assets/{editor-CN0fauKm.js → editor-edmvhW9F.js} +2 -2
  10. package/dist/client/assets/{editor-CN0fauKm.js.map → editor-edmvhW9F.js.map} +1 -1
  11. package/dist/client/assets/{editor-monaco-json-HXjjUFz_.js → editor-monaco-json-CAlvfPc7.js} +2 -2
  12. package/dist/client/assets/{editor-monaco-json-HXjjUFz_.js.map → editor-monaco-json-CAlvfPc7.js.map} +1 -1
  13. package/dist/client/assets/{editor-refs-store-C7y0QHBG.js → editor-refs-store-DKOJcTAk.js} +2 -2
  14. package/dist/client/assets/{editor-refs-store-C7y0QHBG.js.map → editor-refs-store-DKOJcTAk.js.map} +1 -1
  15. package/dist/client/assets/index-DLlW4q4v.js +5 -0
  16. package/dist/client/assets/index-DLlW4q4v.js.map +1 -0
  17. package/dist/client/assets/{preview-BoIgsKxW.js → preview-zo-CHAU0.js} +2 -2
  18. package/dist/client/assets/{preview-BoIgsKxW.js.map → preview-zo-CHAU0.js.map} +1 -1
  19. package/dist/client/index.html +1 -1
  20. package/dist/client/templates/media/tech-report/fonts/OFL.txt +93 -0
  21. package/package.json +7 -7
  22. package/dist/client/assets/index-ClBlf8v3.js +0 -5
  23. package/dist/client/assets/index-ClBlf8v3.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"editor-CN0fauKm.js","sources":["../../../../../node_modules/.pnpm/constrained-editor-plugin@1.4.0/node_modules/constrained-editor-plugin/dist/esm/utils/validators.js","../../../../../node_modules/.pnpm/constrained-editor-plugin@1.4.0/node_modules/constrained-editor-plugin/dist/esm/utils/definedErrors.js","../../../../../node_modules/.pnpm/constrained-editor-plugin@1.4.0/node_modules/constrained-editor-plugin/dist/esm/utils/deepClone.js","../../../../../node_modules/.pnpm/constrained-editor-plugin@1.4.0/node_modules/constrained-editor-plugin/dist/esm/utils/enums.js","../../../../../node_modules/.pnpm/constrained-editor-plugin@1.4.0/node_modules/constrained-editor-plugin/dist/esm/constrainedModel.js","../../../../../node_modules/.pnpm/constrained-editor-plugin@1.4.0/node_modules/constrained-editor-plugin/dist/esm/constrainedEditor.js","../../../src/client/components/json-editor/editor-monaco-theme.tsx","../../../src/client/components/playground/editor-tabs-content.tsx","../../../src/client/utils/retry.ts","../../../src/client/components/playground/editor.tsx"],"sourcesContent":["const validators = {\n initWith: function (monaco) {\n const dummyDiv = document.createElement('div');\n const dummyEditorInstance = monaco.editor.create(dummyDiv);\n const editorInstanceConstructorName = dummyEditorInstance.constructor.name;\n const editorModelConstructorName = dummyEditorInstance.getModel().constructor.name;\n const instanceCheck = function (valueToValidate) {\n return valueToValidate.constructor.name === editorInstanceConstructorName;\n }\n const modelCheck = function (valueToValidate) {\n return valueToValidate.constructor.name === editorModelConstructorName;\n }\n const rangesCheck = function (ranges) {\n if (Array.isArray(ranges)) {\n return ranges.every(function (rangeObj) {\n if (typeof rangeObj === 'object' && rangeObj.constructor.name === 'Object') {\n if (!rangeObj.hasOwnProperty('range')) return false;\n if (!Array.isArray(rangeObj.range)) return false;\n if (rangeObj.range.length !== 4) return false;\n if (!(rangeObj.range.every(num => num > 0 && parseInt(num) === num))) return false;\n if (rangeObj.hasOwnProperty('allowMultiline')) {\n if (typeof rangeObj.allowMultiline !== 'boolean') return false;\n }\n if (rangeObj.hasOwnProperty('label')) {\n if (typeof rangeObj.label !== 'string') return false;\n }\n if (rangeObj.hasOwnProperty('validate')) {\n if (typeof rangeObj.validate !== 'function') return false;\n }\n return true;\n }\n return false;\n });\n }\n return false;\n }\n return {\n isInstanceValid: instanceCheck,\n isModelValid: modelCheck,\n isRangesValid: rangesCheck\n }\n }\n}\nexport default validators;","export const TypeMustBe = function (type, key, additional) {\n return 'The value for the ' + key + ' should be of type ' + (Array.isArray(type) ? type.join(' | ') : type) + '. ' + (additional || '')\n}\nconst definedErrors = {\n TypeMustBe : TypeMustBe\n};\nexport default definedErrors;","export const deepClone = (function () {\n const byPassPrimitives = function (value, callback) {\n if (typeof value !== 'object' || value === null) {\n return this.freeze ? Object.freeze(value) : value;\n }\n if (value instanceof Date) {\n return this.freeze ? Object.freeze(new Date(value)) : new Date(value);\n }\n return callback.call(this, value);\n }\n const cloneArray = function (array, callback) {\n const keys = Object.keys(array);\n const arrayClone = new Array(keys.length)\n for (let i = 0; i < keys.length; i++) {\n arrayClone[keys[i]] = byPassPrimitives.call(this, array[keys[i]], callback);\n }\n return arrayClone;\n }\n const cloner = function (object) {\n return byPassPrimitives.call(this, object, function (object) {\n if (Array.isArray(object)) {\n return cloneArray.call(this, object, cloner)\n }\n const clone = {};\n for (let key in object) {\n if (!this.withProto && Object.hasOwnProperty.call(object, key) === false) {\n continue;\n }\n clone[key] = byPassPrimitives.call(this, object[key], cloner);\n }\n return clone;\n })\n }\n const config = (function () {\n const constructOptionForCode = function (value) {\n const options = [\n 'withProto',\n 'freeze'\n ]\n this[value] = options.reduce(function (acc, option) {\n if (acc[option] = (value >= this[option])) {\n value -= this[option]\n }\n return acc;\n }.bind(this), {})\n }\n const codes = Object.create(Object.defineProperties({}, {\n withProto: { value: 1 },\n freeze: { value: 2 }\n }));\n for (let i = 0; i <= 3; i++) {\n constructOptionForCode.call(codes, i);\n }\n return codes;\n }());\n const methods = {\n withProto: cloner.bind(config[1]),\n andFreeze: cloner.bind(config[2]),\n withProtoAndFreeze: cloner.bind(config[3])\n }\n const API = cloner.bind(config[0]);\n for (let methodName in methods) {\n Object.defineProperty(API, methodName, {\n enumerable: false,\n writable: false,\n configurable: false,\n value: methods[methodName]\n })\n }\n return API;\n}());\n\nexport default deepClone;","export const enums = {\n SINGLE_LINE_HIGHLIGHT_CLASS: 'editableArea--single-line',\n MULTI_LINE_HIGHLIGHT_CLASS: 'editableArea--multi-line'\n}\nexport default enums;","import deepClone from './utils/deepClone.js';\nimport enums from './utils/enums.js';\nexport const constrainedModel = function (model, ranges, monaco) {\n const rangeConstructor = monaco.Range;\n const sortRangesInAscendingOrder = function (rangeObject1, rangeObject2) {\n const rangeA = rangeObject1.range;\n const rangeB = rangeObject2.range;\n if (\n rangeA[0] < rangeB[0] ||\n (rangeA[0] === rangeB[0] && rangeA[3] < rangeB[1])\n ) {\n return -1;\n }\n }\n const normalizeRange = function (range, content) {\n const lines = content.split('\\n');\n const noOfLines = lines.length;\n const normalizedRange = [];\n range.forEach(function (value, index) {\n if (value === 0) {\n throw new Error('Range values cannot be zero');//No I18n\n }\n switch (index) {\n case 0: {\n if (value < 0) {\n throw new Error('Start Line of Range cannot be negative');//No I18n\n } else if (value > noOfLines) {\n throw new Error('Provided Start Line(' + value + ') is out of bounds. Max Lines in content is ' + noOfLines);//No I18n\n }\n normalizedRange[index] = value;\n }\n break;\n case 1: {\n let actualStartCol = value;\n const startLineNo = normalizedRange[0];\n const maxCols = lines[startLineNo - 1].length\n if (actualStartCol < 0) {\n actualStartCol = maxCols - Math.abs(actualStartCol);\n if (actualStartCol < 0) {\n throw new Error('Provided Start Column(' + value + ') is out of bounds. Max Column in line ' + startLineNo + ' is ' + maxCols);//No I18n\n }\n } else if (actualStartCol > (maxCols + 1)) {\n throw new Error('Provided Start Column(' + value + ') is out of bounds. Max Column in line ' + startLineNo + ' is ' + maxCols);//No I18n\n }\n normalizedRange[index] = actualStartCol;\n }\n break;\n case 2: {\n let actualEndLine = value;\n if (actualEndLine < 0) {\n actualEndLine = noOfLines - Math.abs(value);\n if (actualEndLine < 0) {\n throw new Error('Provided End Line(' + value + ') is out of bounds. Max Lines in content is ' + noOfLines);//No I18n\n }\n if (actualEndLine < normalizedRange[0]) {\n console.warn('Provided End Line(' + value + ') is less than the start Line, the Restriction may not behave as expected');//No I18n\n }\n } else if (value > noOfLines) {\n throw new Error('Provided End Line(' + value + ') is out of bounds. Max Lines in content is ' + noOfLines);//No I18n\n }\n normalizedRange[index] = actualEndLine;\n }\n break;\n case 3: {\n let actualEndCol = value;\n const endLineNo = normalizedRange[2];\n const maxCols = lines[endLineNo - 1].length\n if (actualEndCol < 0) {\n actualEndCol = maxCols - Math.abs(actualEndCol);\n if (actualEndCol < 0) {\n throw new Error('Provided End Column(' + value + ') is out of bounds. Max Column in line ' + endLineNo + ' is ' + maxCols);//No I18n\n }\n } else if (actualEndCol > (maxCols + 1)) {\n throw new Error('Provided Start Column(' + value + ') is out of bounds. Max Column in line ' + endLineNo + ' is ' + maxCols);//No I18n\n }\n normalizedRange[index] = actualEndCol;\n }\n break;\n }\n })\n return normalizedRange;\n }\n let restrictions = deepClone(ranges).sort(sortRangesInAscendingOrder);\n const prepareRestrictions = function (restrictions) {\n const content = model.getValue();\n restrictions.forEach(function (restriction, index) {\n const range = normalizeRange(restriction.range, content);\n const startLine = range[0];\n const startCol = range[1];\n const endLine = range[2];\n const endCol = range[3];\n restriction._originalRange = range.slice();\n restriction.range = new rangeConstructor(startLine, startCol, endLine, endCol);\n restriction.index = index;\n if (!restriction.allowMultiline) {\n restriction.allowMultiline = rangeConstructor.spansMultipleLines(restriction.range)\n }\n if (!restriction.label) {\n restriction.label = `[${startLine},${startCol} -> ${endLine}${endCol}]`;\n }\n });\n }\n const getCurrentEditableRanges = function () {\n return restrictions.reduce(function (acc, restriction) {\n acc[restriction.label] = {\n allowMultiline: restriction.allowMultiline || false,\n index: restriction.index,\n range: Object.assign({}, restriction.range),\n originalRange: restriction._originalRange.slice()\n };\n return acc;\n }, {});\n }\n const getValueInEditableRanges = function () {\n return restrictions.reduce(function (acc, restriction) {\n acc[restriction.label] = model.getValueInRange(restriction.range);\n return acc;\n }, {});\n }\n const updateValueInEditableRanges = function (object, forceMoveMarkers) {\n if (typeof object === 'object' && !Array.isArray(object)) {\n forceMoveMarkers = typeof forceMoveMarkers === 'boolean' ? forceMoveMarkers : false;\n const restrictionsMap = restrictions.reduce(function (acc, restriction) {\n if (restriction.label) {\n acc[restriction.label] = restriction;\n }\n return acc;\n }, {});\n for (let label in object) {\n const restriction = restrictionsMap[label];\n if (restriction) {\n const value = object[label];\n if (doesChangeHasMultilineConflict(restriction, value)) {\n throw new Error('Multiline change is not allowed for ' + label);\n }\n const newRange = deepClone(restriction.range);\n newRange.endLine = newRange.startLine + value.split('\\n').length - 1;\n newRange.endColumn = value.split('\\n').pop().length;\n if (isChangeInvalidAsPerUser(restriction, value, newRange)) {\n throw new Error('Change is invalidated by validate function of ' + label);\n }\n model.applyEdits([{\n forceMoveMarkers: !!forceMoveMarkers,\n range: restriction.range,\n text: value\n }]);\n } else {\n console.error('No restriction found for ' + label);\n }\n }\n } else {\n throw new Error('Value must be an object');//No I18n\n }\n }\n const disposeRestrictions = function () {\n model._restrictionChangeListener.dispose();\n window.removeEventListener(\"error\", handleUnhandledPromiseRejection);\n delete model.editInRestrictedArea;\n delete model.disposeRestrictions;\n delete model.getValueInEditableRanges;\n delete model.updateValueInEditableRanges;\n delete model.updateRestrictions;\n delete model.getCurrentEditableRanges;\n delete model.toggleHighlightOfEditableAreas;\n delete model._hasHighlight;\n delete model._isRestrictedModel;\n delete model._isCursorAtCheckPoint;\n delete model._currentCursorPositions;\n delete model._editableRangeChangeListener;\n delete model._restrictionChangeListener;\n delete model._oldDecorations;\n delete model._oldDecorationsSource;\n return model;\n }\n const isCursorAtCheckPoint = function (positions) {\n positions.some(function (position) {\n const posLineNumber = position.lineNumber;\n const posCol = position.column;\n const length = restrictions.length;\n for (let i = 0; i < length; i++) {\n const range = restrictions[i].range;\n if (\n (range.startLineNumber === posLineNumber && range.startColumn === posCol) ||\n (range.endLineNumber === posLineNumber && range.endColumn === posCol)\n ) {\n model.pushStackElement();\n return true;\n }\n }\n });\n };\n const addEditableRangeListener = function (callback) {\n if (typeof callback === 'function') {\n model._editableRangeChangeListener.push(callback);\n }\n };\n const triggerChangeListenersWith = function (currentChanges, allChanges) {\n const currentRanges = getCurrentEditableRanges();\n model._editableRangeChangeListener.forEach(function (callback) {\n callback.call(model, currentChanges, allChanges, currentRanges);\n });\n };\n const doUndo = function () {\n return Promise.resolve().then(function () {\n model.editInRestrictedArea = true;\n model.undo();\n model.editInRestrictedArea = false;\n if (model._hasHighlight && model._oldDecorationsSource) {\n // id present in the decorations info will be omitted by monaco\n // So we don't need to remove the old decorations id\n model.deltaDecorations(model._oldDecorations, model._oldDecorationsSource);\n model._oldDecorationsSource.forEach(function (object) {\n object.range = model.getDecorationRange(object.id);\n });\n }\n });\n };\n const updateRange = function (restriction, range, finalLine, finalColumn, changes, changeIndex) {\n let oldRangeEndLineNumber = range.endLineNumber;\n let oldRangeEndColumn = range.endColumn;\n restriction.prevRange = range;\n restriction.range = range.setEndPosition(finalLine, finalColumn);\n const length = restrictions.length;\n let changesLength = changes.length;\n const diffInCol = finalColumn - oldRangeEndColumn;\n const diffInRow = finalLine - oldRangeEndLineNumber;\n\n const cursorPositions = model._currentCursorPositions || [];\n const noOfCursorPositions = cursorPositions.length;\n // if (noOfCursorPositions > 0) {\n if (changesLength !== noOfCursorPositions) {\n changes = changes.filter(function (change) {\n const range = change.range;\n for (let i = 0; i < noOfCursorPositions; i++) {\n const cursorPosition = cursorPositions[i];\n if (\n (range.startLineNumber === cursorPosition.startLineNumber) &&\n (range.endLineNumber === cursorPosition.endLineNumber) &&\n (range.startColumn === cursorPosition.startColumn) &&\n (range.endColumn === cursorPosition.endColumn)\n ) {\n return true;\n }\n }\n return false;\n });\n changesLength = changes.length;\n }\n if (diffInRow !== 0) {\n for (let i = restriction.index + 1; i < length; i++) {\n const nextRestriction = restrictions[i];\n const nextRange = nextRestriction.range;\n if (oldRangeEndLineNumber === nextRange.startLineNumber) {\n nextRange.startColumn += diffInCol;\n }\n if (oldRangeEndLineNumber === nextRange.endLineNumber) {\n nextRange.endColumn += diffInCol;\n }\n nextRange.startLineNumber += diffInRow;\n nextRange.endLineNumber += diffInRow;\n nextRestriction.range = nextRange;\n }\n for (let i = changeIndex + 1; i < changesLength; i++) {\n const nextChange = changes[i];\n const rangeInChange = nextChange.range;\n const rangeAsString = rangeInChange.toString();\n const rangeMapValue = rangeMap[rangeAsString];\n delete rangeMap[rangeAsString];\n if (oldRangeEndLineNumber === rangeInChange.startLineNumber) {\n rangeInChange.startColumn += diffInCol;\n }\n if (oldRangeEndLineNumber === rangeInChange.endLineNumber) {\n rangeInChange.endColumn += diffInCol;\n }\n rangeInChange.startLineNumber += diffInRow;\n rangeInChange.endLineNumber += diffInRow;\n nextChange.range = rangeInChange;\n rangeMap[rangeInChange.toString()] = rangeMapValue;\n }\n } else {\n // Only Column might have changed\n for (let i = restriction.index + 1; i < length; i++) {\n const nextRestriction = restrictions[i];\n const nextRange = nextRestriction.range;\n if (nextRange.startLineNumber > oldRangeEndLineNumber) {\n break;\n } else {\n nextRange.startColumn += diffInCol;\n nextRange.endColumn += diffInCol;\n nextRestriction.range = nextRange;\n }\n }\n for (let i = changeIndex + 1; i < changesLength; i++) {\n // rangeMap\n const nextChange = changes[i];\n const rangeInChange = nextChange.range;\n const rangeAsString = rangeInChange.toString();\n const rangeMapValue = rangeMap[rangeAsString];\n delete rangeMap[rangeAsString];\n if (rangeInChange.startLineNumber > oldRangeEndLineNumber) {\n rangeMap[rangeInChange.toString()] = rangeMapValue;\n break;\n } else {\n rangeInChange.startColumn += diffInCol;\n rangeInChange.endColumn += diffInCol;\n nextChange.range = rangeInChange;\n rangeMap[rangeInChange.toString()] = rangeMapValue;\n }\n }\n }\n // }\n };\n const getInfoFrom = function (change, editableRange) {\n const info = {};\n const range = change.range;\n // Get State\n if (change.text === '') {\n info.isDeletion = true;\n } else if (\n (range.startLineNumber === range.endLineNumber) &&\n (range.startColumn === range.endColumn)\n ) {\n info.isAddition = true;\n } else {\n info.isReplacement = true;\n }\n // Get Position Of Range\n info.startLineOfRange = range.startLineNumber === editableRange.startLineNumber;\n info.startColumnOfRange = range.startColumn === editableRange.startColumn;\n\n info.endLineOfRange = range.endLineNumber === editableRange.endLineNumber;\n info.endColumnOfRange = range.endColumn === editableRange.endColumn;\n\n info.middleLineOfRange = !info.startLineOfRange && !info.endLineOfRange;\n\n // Editable Range Span\n if (editableRange.startLineNumber === editableRange.endLineNumber) {\n info.rangeIsSingleLine = true;\n } else {\n info.rangeIsMultiLine = true;\n }\n return info;\n };\n const updateRestrictions = function (ranges) {\n restrictions = deepClone(ranges).sort(sortRangesInAscendingOrder);\n prepareRestrictions(restrictions);\n };\n const toggleHighlightOfEditableAreas = function (cssClasses) {\n if (!model._hasHighlight) {\n const cssClassForSingleLine = cssClasses.cssClassForSingleLine ||enums.SINGLE_LINE_HIGHLIGHT_CLASS\n const cssClassForMultiLine = cssClasses.cssClassForMultiLine ||enums.MULTI_LINE_HIGHLIGHT_CLASS\n const decorations = restrictions.map(function (restriction) {\n const decoration = {\n range: restriction.range,\n options: {\n className: restriction.allowMultiline ?\n cssClassForMultiLine :\n cssClassForSingleLine\n }\n }\n if (restriction.label) {\n decoration.hoverMessage = restriction.label;\n }\n return decoration;\n });\n model._oldDecorations = model.deltaDecorations([], decorations);\n model._oldDecorationsSource = decorations.map(function (decoration, index) {\n return Object.assign({}, decoration, { id: model._oldDecorations[index] });\n });\n model._hasHighlight = true;\n } else {\n model.deltaDecorations(model._oldDecorations, []);\n delete model._oldDecorations;\n delete model._oldDecorationsSource;\n model._hasHighlight = false;\n }\n }\n const handleUnhandledPromiseRejection = function () {\n console.debug('handler for unhandled promise rejection');\n };\n const setAllRangesToPrev = function (rangeMap) {\n for (let key in rangeMap) {\n const restriction = rangeMap[key];\n restriction.range = restriction.prevRange;\n }\n };\n const doesChangeHasMultilineConflict = function (restriction, text) {\n return !restriction.allowMultiline && text.includes('\\n');\n };\n const isChangeInvalidAsPerUser = function (restriction, value, range) {\n return restriction.validate && !restriction.validate(value, range, restriction.lastInfo);\n }\n\n const manipulatorApi = {\n _isRestrictedModel: true,\n _isRestrictedValueValid: true,\n _editableRangeChangeListener: [],\n _isCursorAtCheckPoint: isCursorAtCheckPoint,\n _currentCursorPositions: []\n }\n\n prepareRestrictions(restrictions);\n model._hasHighlight = false;\n manipulatorApi._restrictionChangeListener = model.onDidChangeContent(function (contentChangedEvent) {\n const isUndoing = contentChangedEvent.isUndoing;\n model._isRestrictedValueValid = true;\n if (!(isUndoing && model.editInRestrictedArea)) {\n const changes = contentChangedEvent.changes.sort(sortRangesInAscendingOrder);\n const rangeMap = {};\n const length = restrictions.length;\n const isAllChangesValid = changes.every(function (change) {\n const editedRange = change.range;\n const rangeAsString = editedRange.toString();\n rangeMap[rangeAsString] = null;\n for (let i = 0; i < length; i++) {\n const restriction = restrictions[i];\n const range = restriction.range;\n if (range.containsRange(editedRange)) {\n if (doesChangeHasMultilineConflict(restriction, change.text)) {\n return false;\n }\n rangeMap[rangeAsString] = restriction;\n return true;\n }\n }\n return false;\n })\n if (isAllChangesValid) {\n changes.forEach(function (change, changeIndex) {\n const changedRange = change.range;\n const restriction = rangeMap[changedRange.toString()];\n const editableRange = restriction.range;\n const text = change.text || '';\n /**\n * Things to check before implementing the change\n * - A | D | R => Addition | Deletion | Replacement\n * - MC | SC => MultiLineChange | SingleLineChange\n * - SOR | MOR | EOR => Change Occured in - Start Of Range | Middle Of Range | End Of Range\n * - SSL | SML => Editable Range - Spans Single Line | Spans Multiple Line\n */\n const noOfLinesAdded = (text.match(/\\n/g) || []).length;\n const noOfColsAddedAtLastLine = text.split(/\\n/g).pop().length;\n\n const lineDiffInRange = changedRange.endLineNumber - changedRange.startLineNumber;\n const colDiffInRange = changedRange.endColumn - changedRange.startColumn;\n\n let finalLine = editableRange.endLineNumber;\n let finalColumn = editableRange.endColumn;\n\n let columnsCarriedToEnd = 0;\n if (\n (editableRange.endLineNumber === changedRange.startLineNumber) ||\n (editableRange.endLineNumber === changedRange.endLineNumber)\n ) {\n columnsCarriedToEnd += (editableRange.endColumn - changedRange.startColumn) + 1;\n }\n\n const info = getInfoFrom(change, editableRange);\n restriction.lastInfo = info;\n if (info.isAddition || info.isReplacement) {\n if (info.rangeIsSingleLine) {\n /**\n * Only Column Change has occurred , so regardless of the position of the change\n * Addition of noOfCols is enough\n */\n if (noOfLinesAdded === 0) {\n finalColumn += noOfColsAddedAtLastLine;\n } else {\n finalLine += noOfLinesAdded;\n if (info.startColumnOfRange) {\n finalColumn += noOfColsAddedAtLastLine\n } else if (info.endColumnOfRange) {\n finalColumn = (noOfColsAddedAtLastLine + 1)\n } else {\n finalColumn = (noOfColsAddedAtLastLine + columnsCarriedToEnd)\n }\n }\n }\n if (info.rangeIsMultiLine) {\n // Handling for Start Of Range is not required\n finalLine += noOfLinesAdded;\n if (info.endLineOfRange) {\n if (noOfLinesAdded === 0) {\n finalColumn += noOfColsAddedAtLastLine;\n } else {\n finalColumn = (columnsCarriedToEnd + noOfColsAddedAtLastLine);\n }\n }\n }\n }\n if (info.isDeletion || info.isReplacement) {\n if (info.rangeIsSingleLine) {\n finalColumn -= colDiffInRange;\n }\n if (info.rangeIsMultiLine) {\n if (info.endLineOfRange) {\n finalLine -= lineDiffInRange;\n finalColumn -= colDiffInRange;\n } else {\n finalLine -= lineDiffInRange;\n }\n }\n }\n updateRange(restriction, editableRange, finalLine, finalColumn, changes, changeIndex);\n });\n const values = model.getValueInEditableRanges();\n const currentlyEditedRanges = {};\n for (let key in rangeMap) {\n const restriction = rangeMap[key];\n const range = restriction.range;\n const rangeString = restriction.label || range.toString();\n const value = values[rangeString];\n if (isChangeInvalidAsPerUser(restriction, value, range)) {\n setAllRangesToPrev(rangeMap);\n doUndo();\n return; // Breaks the loop and prevents the triggerChangeListener\n }\n currentlyEditedRanges[rangeString] = value;\n }\n if (model._hasHighlight) {\n model._oldDecorationsSource.forEach(function (object) {\n object.range = model.getDecorationRange(object.id);\n });\n }\n triggerChangeListenersWith(currentlyEditedRanges, values);\n } else {\n doUndo();\n }\n } else if (model.editInRestrictedArea) {\n model._isRestrictedValueValid = false;\n }\n });\n window.onerror = handleUnhandledPromiseRejection;\n const exposedApi = {\n editInRestrictedArea: false,\n getCurrentEditableRanges: getCurrentEditableRanges,\n getValueInEditableRanges: getValueInEditableRanges,\n disposeRestrictions: disposeRestrictions,\n onDidChangeContentInEditableRange: addEditableRangeListener,\n updateRestrictions: updateRestrictions,\n updateValueInEditableRanges: updateValueInEditableRanges,\n toggleHighlightOfEditableAreas: toggleHighlightOfEditableAreas\n }\n for (let funcName in manipulatorApi) {\n Object.defineProperty(model, funcName, {\n enumerable: false,\n configurable: true,\n writable: true,\n value: manipulatorApi[funcName]\n })\n }\n for (let apiName in exposedApi) {\n Object.defineProperty(model, apiName, {\n enumerable: false,\n configurable: true,\n writable: true,\n value: exposedApi[apiName]\n })\n }\n return model;\n}\nexport default constrainedModel;","import validators from './utils/validators.js';\nimport { TypeMustBe } from './utils/definedErrors.js';\nimport constrainedModel from './constrainedModel.js';\n\nexport function constrainedEditor(monaco) {\n /**\n * Injected Dependencies\n */\n if (monaco === undefined) {\n throw new Error([\n \"Please pass the monaco global variable into function as\",\n \"(eg:)constrainedEditor({ range : monaco.range });\",\n ].join('\\n'));\n }\n /**\n *\n * @param {Object} editorInstance This should be the monaco editor instance.\n * @description This is the listener function to check whether the cursor is at checkpoints\n * (i.e) the point where editable and non editable portions meet\n */\n const listenerFn = function (editorInstance) {\n const model = editorInstance.getModel();\n if (model._isCursorAtCheckPoint) {\n const selections = editorInstance.getSelections();\n const positions = selections.map(function (selection) {\n return {\n lineNumber: selection.positionLineNumber,\n column: selection.positionColumn\n }\n });\n model._isCursorAtCheckPoint(positions);\n model._currentCursorPositions = selections;\n }\n }\n const _uriRestrictionMap = {};\n const { isInstanceValid, isModelValid, isRangesValid } = validators.initWith(monaco);\n /**\n *\n * @param {Object} editorInstance This should be the monaco editor instance\n * @returns {Boolean}\n */\n const initInEditorInstance = function (editorInstance) {\n if (isInstanceValid(editorInstance)) {\n let domNode = editorInstance.getDomNode();\n manipulator._listener = listenerFn.bind(API, editorInstance);\n manipulator._editorInstance = editorInstance;\n manipulator._editorInstance._isInDevMode = false;\n domNode.addEventListener('keydown', manipulator._listener, true);\n manipulator._onChangeModelDisposable = editorInstance.onDidChangeModel(function () {\n // domNode - refers old dom node\n domNode && domNode.removeEventListener('keydown', manipulator._listener, true)\n const newDomNode = editorInstance.getDomNode(); // Gets Current dom node\n newDomNode && newDomNode.addEventListener('keydown', manipulator._listener, true);\n domNode = newDomNode;\n })\n return true;\n } else {\n throw new Error(\n TypeMustBe(\n 'ICodeEditor',\n 'editorInstance',\n 'This type interface can be found in monaco editor documentation'\n )\n )\n }\n }\n /**\n *\n * @param {Object} model This should be the monaco editor model instance. Refer https://microsoft.github.io/monaco-editor/api/interfaces/monaco.editor.itextmodel.html\n * @param {*} ranges This should be the array of range objects. Refer constrained editor plugin documentation\n * @returns model\n */\n const addRestrictionsTo = function (model, ranges) {\n if (isModelValid(model)) {\n if (isRangesValid(ranges)) {\n const modelToConstrain = constrainedModel(model, ranges, monaco, manipulator._editorInstance);\n _uriRestrictionMap[modelToConstrain.uri.toString()] = modelToConstrain;\n return modelToConstrain;\n } else {\n throw new Error(\n TypeMustBe(\n 'Array<RangeRestrictionObject>',\n 'ranges',\n 'Please refer constrained editor documentation for proper structure'\n )\n )\n }\n } else {\n throw new Error(\n TypeMustBe(\n 'ICodeEditor',\n 'editorInstance',\n 'This type interface can be found in monaco editor documentation'\n )\n )\n }\n }\n /**\n *\n * @param {Object} model This should be the monaco editor model instance. Refer https://microsoft.github.io/monaco-editor/api/interfaces/monaco.editor.itextmodel.html\n * @returns {Boolean} True if the restrictions are removed\n */\n const removeRestrictionsIn = function (model) {\n if (isModelValid(model)) {\n const uri = model.uri.toString();\n const restrictedModel = _uriRestrictionMap[uri];\n if (restrictedModel) {\n return restrictedModel.disposeRestrictions();\n } else {\n console.warn('Current Model is not a restricted Model');\n return false;\n }\n } else {\n throw new Error(\n TypeMustBe(\n 'ICodeEditor',\n 'editorInstance',\n 'This type interface can be found in monaco editor documentation'\n )\n )\n }\n }\n /**\n *\n * @returns {Boolean} True if the constrainer is disposed\n */\n const disposeConstrainer = function () {\n if (manipulator._editorInstance) {\n const instance = manipulator._editorInstance;\n const domNode = instance.getDomNode();\n domNode && domNode.removeEventListener('keydown', manipulator._listener);\n manipulator._onChangeModelDisposable && manipulator._onChangeModelDisposable.dispose();\n delete manipulator._listener;\n delete manipulator._editorInstance._isInDevMode;\n delete manipulator._editorInstance._devModeAction;\n delete manipulator._editorInstance;\n delete manipulator._onChangeModelDisposable;\n for (let key in _uriRestrictionMap) {\n delete _uriRestrictionMap[key];\n }\n return true;\n }\n return false;\n }\n /**\n * @description This function used to make the developer to find the ranges of selected portions\n */\n const toggleDevMode = function () {\n if (manipulator._editorInstance._isInDevMode) {\n manipulator._editorInstance._isInDevMode = false;\n manipulator._editorInstance._devModeAction.dispose();\n delete manipulator._editorInstance._devModeAction;\n } else {\n manipulator._editorInstance._isInDevMode = true;\n manipulator._editorInstance._devModeAction = manipulator._editorInstance.addAction({\n id: 'showRange',\n label: 'Show Range in console',\n contextMenuGroupId: 'navigation',\n contextMenuOrder: 1.5,\n run: function (editor) {\n const selections = editor.getSelections();\n const ranges = selections.reduce(function (acc, { startLineNumber, endLineNumber, startColumn, endColumn }) {\n acc.push('range : ' + JSON.stringify([\n startLineNumber,\n startColumn,\n endLineNumber,\n endColumn\n ]));\n return acc;\n }, []).join('\\n');\n console.log(`Selected Ranges : \\n` + JSON.stringify(ranges, null, 2));\n }\n });\n }\n }\n\n /**\n * Main Function starts here\n */\n // @internal\n const manipulator = {\n /**\n * These variables should not be modified by external code\n * This has to be used for debugging and testing\n */\n _listener: null,\n _editorInstance: null,\n _uriRestrictionMap: _uriRestrictionMap,\n _injectedResources: monaco\n }\n const API = Object.create(manipulator);\n const exposedMethods = {\n /**\n * These functions are exposed to the user\n * These functions should be protected from editing\n */\n initializeIn: initInEditorInstance,\n addRestrictionsTo: addRestrictionsTo,\n removeRestrictionsIn: removeRestrictionsIn,\n disposeConstrainer: disposeConstrainer,\n toggleDevMode: toggleDevMode\n }\n for (let methodName in exposedMethods) {\n Object.defineProperty(API, methodName, {\n enumerable: false,\n writable: false,\n configurable: false,\n value: exposedMethods[methodName]\n })\n }\n return Object.freeze(API);\n}\n\nexport default constrainedEditor;\n","import React, { useCallback, useEffect, useRef, useState } from 'react';\nimport { useTheme } from '../theme-provider';\nimport { constrainedEditor } from 'constrained-editor-plugin';\nimport MonacoEditor, { Monaco, DiffEditor } from '@monaco-editor/react';\nimport type { editor as MonacoEditorType } from 'monaco-editor';\nimport type { TextFile } from '../../lib/types';\nimport { type JsonEditorError } from '../../lib/json-types';\nimport { FORMAT } from '../../lib/env';\nimport { useDocumentsStore } from '../../store/documents-store-provider';\nimport { Button } from '../ui/button';\nimport { useEditorRefsStore } from '../../store/editor-refs-store';\nimport {\n getSelectionContext,\n createContextSnippet,\n} from '../../lib/monaco-selection-utils';\nimport { ValidationPanel, ValidationStatusBar } from './validation-panel';\nimport { monacoThemeFor, registerMonacoThemes } from '../../lib/monaco-theme';\n\n/** Ensure defaultPath matches the schema fileMatch pattern (*.FORMAT.theme.json) */\nfunction resolveThemeDefaultPath(name: string): string {\n const ext = `.${FORMAT}.theme.json`;\n if (name.endsWith(ext)) return name;\n const base = name\n .replace(/\\.\\w+\\.theme\\.json$/, '')\n .replace(/\\.theme\\.json$/, '')\n .replace(/\\.json$/, '');\n return base + ext;\n}\n\n/**\n * EditorMonacoTheme component for editing JSON theme files with schema validation\n */\nfunction EditorMonacoTheme({\n document,\n readOnly = false,\n onChange,\n}: {\n document: TextFile;\n readOnly?: boolean;\n onChange?: (value: string) => void;\n}) {\n const editorRef = useRef<MonacoEditorType.IStandaloneCodeEditor | null>(null);\n const monacoRef = useRef<Monaco | null>(null);\n const modelRef = useRef<MonacoEditorType.ITextModel | null>(null);\n const { theme } = useTheme();\n const [validationErrors, setValidationErrors] = useState<JsonEditorError[]>(\n []\n );\n const [showValidationPanel, setShowValidationPanel] = useState(true);\n const [isValidationPanelMinimized, setIsValidationPanelMinimized] =\n useState(false);\n const userDismissedRef = useRef(false);\n const pendingDiff = useDocumentsStore((s) => s.pendingDiffs[document.name]);\n const clearPendingDiff = useDocumentsStore((s) => s.clearPendingDiff);\n const saveDocument = useDocumentsStore((s) => s.saveDocument);\n const { registerEditor, unregisterEditor, setActiveEditor } =\n useEditorRefsStore();\n\n // Get resolved theme - convert 'system' to actual theme\n const resolvedTheme =\n theme === 'system'\n ? window.matchMedia('(prefers-color-scheme: dark)').matches\n ? 'dark'\n : 'light'\n : theme;\n\n // Initialize Monaco editor\n const handleEditorWillMount = useCallback((monaco: Monaco) => {\n monacoRef.current = monaco;\n // Idempotent; guards the case where an editor mounts before the global\n // configureMonaco() promise has resolved.\n registerMonacoThemes(monaco);\n // Don't call setDiagnosticsOptions here — it would clobber the global\n // config. The theme schema is already registered by configureMonacoInstance\n // and matched via defaultPath → fileMatch.\n }, []);\n\n // Handle editor mount\n const handleEditorMount = useCallback(\n (editor: MonacoEditorType.IStandaloneCodeEditor, monaco: Monaco) => {\n editorRef.current = editor;\n modelRef.current = editor.getModel();\n\n // Register editor in the refs store\n registerEditor(document.name, editor, monaco);\n setActiveEditor(document.name);\n\n // Enable constrained editing\n const constrainedInstance = constrainedEditor(monaco);\n const model = editor.getModel();\n if (model) {\n constrainedInstance.initializeIn(editor);\n }\n\n // Configure editor options\n editor.updateOptions({\n formatOnType: true,\n formatOnPaste: true,\n automaticLayout: true,\n minimap: { enabled: false },\n scrollBeyondLastLine: true,\n wordWrap: 'on',\n folding: true,\n foldingStrategy: 'indentation',\n suggest: {\n showColors: true,\n showConstants: true,\n showEnums: true,\n showFields: true,\n showFunctions: true,\n showKeywords: true,\n showModules: true,\n showProperties: true,\n showSnippets: true,\n showStructs: true,\n showTypeParameters: true,\n showUnits: true,\n showValues: true,\n showVariables: true,\n },\n });\n\n // Add keyboard shortcuts\n // Cmd+K => send selection to AI assistant\n editor.addCommand(monaco.KeyMod.CtrlCmd | monaco.KeyCode.KeyK, () => {\n const selection = getSelectionContext(editor, monaco);\n if (selection) {\n const snippet = createContextSnippet(selection);\n window.dispatchEvent(\n new CustomEvent('monaco-selection-to-ai', {\n detail: {\n documentName: document.name,\n selection,\n snippet,\n isTheme: true,\n },\n })\n );\n }\n });\n\n // Cmd+S => save command\n editor.addCommand(monaco.KeyMod.CtrlCmd | monaco.KeyCode.KeyS, () => {\n // Save command - parent component handles this\n console.log('Save command triggered in theme editor');\n });\n\n // Add context menu action for AI assistant\n editor.addAction({\n id: 'send-theme-to-ai-assistant',\n label: 'Send to AI Assistant (⌘K)',\n contextMenuGroupId: 'navigation',\n contextMenuOrder: 1.5,\n keybindings: [monaco.KeyMod.CtrlCmd | monaco.KeyCode.KeyK],\n run: function () {\n // Use the editor reference from closure instead of the parameter\n const selection = getSelectionContext(editor, monaco);\n if (selection) {\n const snippet = createContextSnippet(selection);\n // Dispatch event for the chat panel to capture\n window.dispatchEvent(\n new CustomEvent('monaco-selection-to-ai', {\n detail: {\n documentName: document.name,\n selection,\n snippet,\n isTheme: true,\n },\n })\n );\n }\n },\n });\n\n // Format document on mount\n setTimeout(() => {\n editor.getAction('editor.action.formatDocument')?.run();\n }, 100);\n\n console.log('Monaco theme editor mounted');\n },\n [document.name, registerEditor, setActiveEditor]\n );\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n unregisterEditor(document.name);\n };\n }, [document.name, unregisterEditor]);\n\n // Handle content changes\n const handleChange = useCallback(\n (\n value: string | undefined,\n _event: MonacoEditorType.IModelContentChangedEvent\n ) => {\n if (value !== undefined && onChange) {\n onChange(value);\n }\n },\n [onChange]\n );\n\n // Handle Monaco's built-in schema validation markers\n const handleEditorValidation = useCallback(\n (markers: MonacoEditorType.IMarker[]) => {\n const errors: JsonEditorError[] = markers.map((marker) => ({\n path: '',\n message: marker.message,\n code:\n typeof marker.code === 'string'\n ? marker.code\n : marker.code?.value || 'validation_error',\n startLineNumber: marker.startLineNumber,\n startColumn: marker.startColumn,\n endLineNumber: marker.endLineNumber,\n endColumn: marker.endColumn,\n severity:\n marker.severity >= 8\n ? 'error'\n : marker.severity >= 4\n ? 'warning'\n : 'info',\n }));\n\n setValidationErrors(errors);\n\n if (errors.length > 0 && !userDismissedRef.current) {\n setShowValidationPanel(true);\n setIsValidationPanelMinimized(false);\n }\n if (errors.length === 0) {\n userDismissedRef.current = false;\n }\n },\n []\n );\n\n const handleErrorClick = useCallback((error: JsonEditorError) => {\n if (editorRef.current && error.startLineNumber && error.startColumn) {\n editorRef.current.setPosition({\n lineNumber: error.startLineNumber,\n column: error.startColumn,\n });\n editorRef.current.revealLineInCenter(error.startLineNumber);\n editorRef.current.focus();\n }\n }, []);\n\n // Update theme\n useEffect(() => {\n if (editorRef.current) {\n editorRef.current.updateOptions({ theme: monacoThemeFor(resolvedTheme) });\n }\n }, [resolvedTheme]);\n\n return (\n <div className=\"relative h-full\">\n {pendingDiff ? (\n <>\n <div className=\"flex items-center justify-between px-2 py-1 border-b bg-muted/40 text-xs\">\n <div>\n Review changes for{' '}\n <span className=\"font-medium\">{document.name}</span>\n </div>\n <div className=\"flex gap-2\">\n <Button\n variant=\"secondary\"\n size=\"sm\"\n onClick={() => clearPendingDiff(document.name)}\n >\n Discard\n </Button>\n <Button\n size=\"sm\"\n onClick={() => {\n saveDocument(document.name, pendingDiff.modified);\n clearPendingDiff(document.name, true);\n }}\n >\n Apply Changes\n </Button>\n </div>\n </div>\n <DiffEditor\n height=\"calc(100% - 32px)\"\n original={pendingDiff.original}\n modified={pendingDiff.modified}\n language=\"json\"\n theme={monacoThemeFor(resolvedTheme)}\n options={{\n readOnly: true,\n renderSideBySide: true,\n originalEditable: false,\n automaticLayout: true,\n minimap: { enabled: false },\n }}\n beforeMount={handleEditorWillMount}\n />\n </>\n ) : (\n <MonacoEditor\n height=\"100%\"\n language=\"json\"\n defaultPath={resolveThemeDefaultPath(document.name)}\n value={document.text}\n theme={monacoThemeFor(resolvedTheme)}\n onChange={handleChange}\n beforeMount={handleEditorWillMount}\n onMount={handleEditorMount}\n onValidate={handleEditorValidation}\n options={{\n readOnly,\n lineNumbers: 'on',\n glyphMargin: true,\n folding: true,\n lineDecorationsWidth: 5,\n lineNumbersMinChars: 3,\n renderValidationDecorations: 'on',\n quickSuggestions: {\n other: true,\n comments: false,\n strings: true,\n },\n acceptSuggestionOnCommitCharacter: true,\n acceptSuggestionOnEnter: 'on',\n accessibilitySupport: 'auto',\n autoIndent: 'advanced',\n formatOnType: true,\n formatOnPaste: true,\n automaticLayout: true,\n minimap: { enabled: false },\n scrollBeyondLastLine: true,\n wordWrap: 'on',\n }}\n />\n )}\n\n {/* Validation Status Bar */}\n <div className=\"absolute top-0 right-0\">\n <ValidationStatusBar\n errors={validationErrors}\n onClick={() => {\n setShowValidationPanel(true);\n setIsValidationPanelMinimized(false);\n }}\n />\n </div>\n\n {/* Validation Panel */}\n {showValidationPanel && validationErrors.length > 0 && (\n <ValidationPanel\n errors={validationErrors}\n isMinimized={isValidationPanelMinimized}\n onToggleMinimize={() =>\n setIsValidationPanelMinimized(!isValidationPanelMinimized)\n }\n onErrorClick={handleErrorClick}\n onClose={() => {\n setShowValidationPanel(false);\n userDismissedRef.current = true;\n }}\n className=\"z-40\"\n />\n )}\n </div>\n );\n}\n\nexport const EditorMonacoThemeMemoized = React.memo(EditorMonacoTheme);\n","import React from 'react';\nimport { EditorMonacoJsonMemoized } from '../json-editor/editor-monaco-json';\nimport { EditorMonacoThemeMemoized } from '../json-editor/editor-monaco-theme';\nimport { TabsContent } from '../ui/tabs';\nimport { useDocumentsStore } from '../../store/documents-store-provider';\nimport { useThemesStore } from '../../store/themes-store-provider';\nimport type { TextFile } from '../../lib/types';\nimport type { DocumentType } from '../../store/documents-store';\nimport debounce from 'lodash.debounce';\n\nfunction TabContent({\n name,\n text,\n buildError: _buildError,\n saveDocumentDebounceWait,\n documentType,\n}: {\n name: string;\n text: string;\n buildError?: string;\n saveDocumentDebounceWait: number;\n documentType: DocumentType;\n}) {\n const { saveDocument } = useDocumentsStore((state) => state);\n const { updateTheme } = useThemesStore((state) => state);\n\n // Create a debounced version of updateTheme\n const debouncedUpdateTheme = React.useMemo(\n () => debounce(updateTheme, saveDocumentDebounceWait),\n [updateTheme, saveDocumentDebounceWait]\n );\n\n // Flush pending theme updates on unmount so the themes store is always\n // up-to-date when the user switches away from a theme tab.\n React.useEffect(() => {\n return () => {\n debouncedUpdateTheme.flush();\n };\n }, [debouncedUpdateTheme]);\n\n const handleChange = React.useCallback(\n (value: string) => {\n saveDocument(name, value);\n\n // If this is a theme document, update the themes store with debouncing\n if (documentType === 'application/json+theme') {\n console.log(\n 'TabContent: Theme document change detected, debouncing update',\n {\n documentName: name,\n debounceWait: saveDocumentDebounceWait,\n }\n );\n debouncedUpdateTheme(name, value);\n }\n },\n [\n name,\n saveDocument,\n debouncedUpdateTheme,\n documentType,\n saveDocumentDebounceWait,\n ]\n );\n\n // Create a fake document object for the theme editor\n const document: TextFile = React.useMemo(\n () => ({\n name,\n type: 'application/json',\n text,\n mtime: new Date(),\n ctime: new Date(),\n atime: new Date(),\n }),\n [name, text]\n );\n\n return (\n <TabsContent\n value={name}\n className=\"mt-0 h-full p-0\"\n tabIndex={-1} // to prevent focus on Tab trigger (fix for accessibility size issue)\n >\n {documentType === 'application/json+theme' ? (\n <EditorMonacoThemeMemoized\n document={document}\n onChange={handleChange}\n />\n ) : (\n <EditorMonacoJsonMemoized\n name={name}\n value={text}\n saveDocumentDebounceWait={saveDocumentDebounceWait}\n />\n )}\n </TabsContent>\n );\n}\n\nconst TabContentMemoized = React.memo(TabContent);\n\nfunction EditorTabsContent({\n openTabs,\n documents,\n buildErrors,\n saveDocumentDebounceWait,\n}: {\n openTabs: string[];\n documents: TextFile[];\n buildErrors: Record<string, string>;\n saveDocumentDebounceWait: number;\n}) {\n const { documentTypes } = useDocumentsStore((state) => state);\n\n return openTabs\n .map((name) => documents.find((d) => d.name === name))\n .filter((doc): doc is TextFile => doc !== undefined)\n .map((doc) => {\n const documentType = documentTypes[doc.name] || 'application/json+report';\n\n return (\n <TabContentMemoized\n key={doc.name}\n name={doc.name}\n text={doc.text}\n buildError={buildErrors[doc.name]}\n saveDocumentDebounceWait={saveDocumentDebounceWait}\n documentType={documentType}\n />\n );\n });\n}\n\nexport const EditorTabsContentMemoized = React.memo(EditorTabsContent);\n","export interface RetryOptions {\n maxRetries?: number;\n initialDelay?: number;\n maxDelay?: number;\n backoffFactor?: number;\n onRetry?: (error: Error, attempt: number) => void;\n shouldRetry?: (error: Error) => boolean;\n signal?: AbortSignal;\n}\n\nexport class RetryError extends Error {\n constructor(\n message: string,\n public readonly lastError: Error,\n public readonly attempts: number\n ) {\n super(message);\n this.name = 'RetryError';\n }\n}\n\n/**\n * Retry a function with exponential backoff\n */\nexport async function retry<T>(\n fn: () => Promise<T>,\n options: RetryOptions = {}\n): Promise<T> {\n const {\n maxRetries = 3,\n initialDelay = 1000,\n maxDelay = 30000,\n backoffFactor = 2,\n onRetry,\n shouldRetry = () => true,\n signal,\n } = options;\n\n let lastError: Error;\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n // Check if operation was cancelled\n if (signal?.aborted) {\n throw new Error('Operation cancelled');\n }\n\n return await fn();\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n\n // Don't retry if it's the last attempt\n if (attempt === maxRetries) {\n break;\n }\n\n // Check if we should retry this error\n if (!shouldRetry(lastError)) {\n throw lastError;\n }\n\n // Calculate delay with exponential backoff\n const delay = Math.min(\n initialDelay * Math.pow(backoffFactor, attempt),\n maxDelay\n );\n\n // Add some jitter to prevent thundering herd\n const jitteredDelay = delay * (0.5 + Math.random() * 0.5);\n\n // Call retry callback if provided\n if (onRetry) {\n onRetry(lastError, attempt + 1);\n }\n\n // Wait before retrying\n await new Promise((resolve) => {\n const timeoutId = setTimeout(resolve, jitteredDelay);\n\n // Clean up timeout if cancelled\n if (signal) {\n signal.addEventListener(\n 'abort',\n () => {\n clearTimeout(timeoutId);\n resolve(undefined);\n },\n { once: true }\n );\n }\n });\n }\n }\n\n throw new RetryError(\n `Failed after ${maxRetries + 1} attempts`,\n lastError!,\n maxRetries + 1\n );\n}\n\n/**\n * Retry decorator for class methods\n */\nexport function Retryable(options: RetryOptions = {}) {\n return function (\n _target: any,\n _propertyKey: string,\n descriptor: PropertyDescriptor\n ) {\n const originalMethod = descriptor.value;\n\n descriptor.value = async function (...args: any[]) {\n return retry(() => originalMethod.apply(this, args), options);\n };\n\n return descriptor;\n };\n}\n\n/**\n * Common retry strategies\n */\nexport const RetryStrategies = {\n // Retry on network errors\n networkErrors: (error: Error) => {\n const networkErrorPatterns = [\n 'NetworkError',\n 'Failed to fetch',\n 'ERR_NETWORK',\n 'ECONNREFUSED',\n 'ETIMEDOUT',\n 'ENOTFOUND',\n 'fetch failed',\n ];\n\n return networkErrorPatterns.some(\n (pattern) =>\n error.message.includes(pattern) || error.name.includes(pattern)\n );\n },\n\n // Retry on specific HTTP status codes\n httpStatusCodes: (statusCodes: number[]) => (error: any) => {\n if (error.response?.status) {\n return statusCodes.includes(error.response.status);\n }\n return false;\n },\n\n // Retry on temporary errors\n temporaryErrors: (error: Error) => {\n const temporaryPatterns = [\n 'EBUSY',\n 'EAGAIN',\n 'temporarily unavailable',\n 'too many requests',\n 'rate limit',\n ];\n\n return temporaryPatterns.some((pattern) =>\n error.message.toLowerCase().includes(pattern.toLowerCase())\n );\n },\n\n // Combine multiple strategies\n combine:\n (...strategies: ((error: Error) => boolean)[]) =>\n (error: Error) => {\n return strategies.some((strategy) => strategy(error));\n },\n};\n","import {\n useEffect,\n useCallback,\n useRef,\n useMemo,\n memo,\n useContext,\n} from 'react';\nimport { EditorTabsContentMemoized } from './editor-tabs-content';\nimport { Tabs } from '../ui/tabs';\nimport {\n useDocumentsStore,\n DocumentsStoreContext,\n} from '../../store/documents-store-provider';\nimport {\n useOutputStore,\n OutputStoreContext,\n} from '../../store/output-store-provider';\nimport { useSettingsStore } from '../../store/settings-store-provider';\nimport { useEditorRefsStore } from '../../store/editor-refs-store';\nimport {\n useThemesStore,\n ThemesStoreContext,\n} from '../../store/themes-store-provider';\nimport { usePresentationGenerator } from '../../hooks/usePresentationGenerator';\nimport { retry, RetryStrategies } from '../../utils/retry';\nimport { themeChangeEmitter } from '../../utils/theme-change-emitter';\nimport { useShallow } from 'zustand/react/shallow';\n\ninterface BuildRequest {\n id: string;\n docName: string;\n doc: any;\n signal: AbortSignal;\n timestamp: number;\n}\n\nfunction EditorComponent() {\n const setOutput = useOutputStore((state) => state.setOutput);\n const outputStore = useContext(OutputStoreContext)!;\n const documentsStore = useContext(DocumentsStoreContext)!;\n const themesStore = useContext(ThemesStoreContext)!;\n const saveDocumentDebounceWait = useSettingsStore(\n (state) => state.saveDocumentDebounceWait\n );\n const {\n openTabs,\n activeTab,\n setActiveTab,\n documents,\n buildErrors,\n setBuildError,\n documentTypes,\n } = useDocumentsStore(\n useShallow((state) => ({\n openTabs: state.openTabs,\n activeTab: state.activeTab,\n setActiveTab: state.setActiveTab,\n documents: state.documents,\n buildErrors: state.buildErrors,\n setBuildError: state.setBuildError,\n documentTypes: state.documentTypes,\n }))\n );\n const { customThemes } = useThemesStore(\n useShallow((state) => ({ customThemes: state.customThemes }))\n );\n const { generatePresentation, cancelGeneration } = usePresentationGenerator();\n\n // Refs to track ongoing operations and prevent race conditions\n const buildAbortControllersRef = useRef<Map<string, AbortController>>(\n new Map()\n );\n const buildTimeoutsRef = useRef<Map<string, NodeJS.Timeout>>(new Map());\n // Debounce timer for Run-button builds (150ms to coalesce rapid clicks).\n const flushBuildTimerRef = useRef<NodeJS.Timeout | null>(null);\n const lastBuildRequestIdRef = useRef<string>('');\n const documentVersionsRef = useRef<Map<string, number>>(new Map());\n\n // User-initiated cancel from the loading UI: invalidate the current request\n // id first (so both build paths take their quiet \"cancelled\" exit instead of\n // surfacing a global error), then abort the controllers and the in-flight\n // fetch.\n const cancelActiveBuild = useCallback(() => {\n lastBuildRequestIdRef.current = `cancelled-${Date.now()}`;\n // Also drop queued debounced builds — without this, a pending auto-build\n // timer could start a new generation right after the user cancelled.\n for (const timeout of buildTimeoutsRef.current.values()) {\n clearTimeout(timeout);\n }\n buildTimeoutsRef.current.clear();\n if (flushBuildTimerRef.current) {\n clearTimeout(flushBuildTimerRef.current);\n flushBuildTimerRef.current = null;\n }\n for (const controller of buildAbortControllersRef.current.values()) {\n controller.abort();\n }\n buildAbortControllersRef.current.clear();\n cancelGeneration();\n setOutput({\n isGenerating: false,\n generationProgress: undefined,\n generationStartedAt: undefined,\n });\n }, [cancelGeneration, setOutput]);\n\n useEffect(() => {\n setOutput({ cancelGeneration: cancelActiveBuild });\n }, [cancelActiveBuild, setOutput]);\n\n // Get or create a document version number\n const getDocumentVersion = useCallback((docName: string) => {\n const currentVersion = documentVersionsRef.current.get(docName) || 0;\n const newVersion = currentVersion + 1;\n documentVersionsRef.current.set(docName, newVersion);\n return newVersion;\n }, []);\n\n // Prepare valid custom themes with deep comparison\n const customThemesContentHash = useMemo(() => {\n // Create a content hash of all themes to detect deep changes\n const themeData = Object.entries(customThemes).map(([key, theme]) => {\n // Handle lastModified that might be a string (from localStorage) or Date\n let lastModifiedTime = 0;\n if (theme.lastModified) {\n if (theme.lastModified instanceof Date) {\n lastModifiedTime = theme.lastModified.getTime();\n } else if (typeof theme.lastModified === 'string') {\n lastModifiedTime = new Date(theme.lastModified).getTime();\n }\n }\n\n return {\n key,\n name: theme.name,\n content: theme.content,\n valid: theme.valid,\n lastModified: lastModifiedTime,\n };\n });\n return JSON.stringify(themeData);\n }, [customThemes]);\n\n const validCustomThemes = useMemo(() => {\n const themes: { [key: string]: any } = {};\n Object.values(customThemes).forEach((theme) => {\n if (theme.valid && theme.parsed) {\n themes[theme.name] = theme.parsed;\n }\n });\n return themes;\n }, [customThemesContentHash]);\n\n // Helper function to get fresh theme data (bypasses memo)\n const getFreshThemeData = useCallback(() => {\n const freshThemes: { [key: string]: any } = {};\n const { customThemes } = themesStore.getState();\n Object.values(customThemes).forEach((theme) => {\n if (theme.valid && theme.parsed) {\n freshThemes[theme.name] = theme.parsed;\n }\n });\n return freshThemes;\n }, [themesStore]);\n\n // Helper function to build a document with proper cancellation and retry\n const buildDocument = useCallback(\n async (\n doc: any,\n signal?: AbortSignal,\n options?: { bypassCache?: boolean }\n ) => {\n if (!doc || !generatePresentation) {\n return;\n }\n\n // Cancel any existing build operation for this document\n const existingController = buildAbortControllersRef.current.get(doc.name);\n if (existingController) {\n existingController.abort();\n buildAbortControllersRef.current.delete(doc.name);\n }\n\n // Create new abort controller if not provided\n const abortController = signal ? null : new AbortController();\n const finalSignal = signal || abortController!.signal;\n if (abortController) {\n buildAbortControllersRef.current.set(doc.name, abortController);\n }\n\n // Create build request\n const requestId = `${doc.name}-${Date.now()}-${Math.random()}`;\n const version = getDocumentVersion(doc.name);\n lastBuildRequestIdRef.current = requestId;\n\n const buildRequest: BuildRequest = {\n id: requestId,\n docName: doc.name,\n doc,\n signal: finalSignal,\n timestamp: Date.now(),\n };\n\n await processBuildRequestRef.current(buildRequest, version, options);\n },\n [generatePresentation, setOutput, getDocumentVersion]\n );\n\n // Process a build request from the queue\n const processBuildRequest = useCallback(\n async (\n request: BuildRequest,\n version: number,\n options?: { bypassCache?: boolean }\n ) => {\n const { doc, signal, id } = request;\n\n // Check if this is still the latest request\n if (lastBuildRequestIdRef.current !== id) {\n console.log('Skipping outdated build request for:', doc.name);\n setOutput({\n isGenerating: false,\n generationProgress: undefined,\n generationStartedAt: undefined,\n });\n return;\n }\n\n setOutput({\n globalError: undefined,\n isGenerating: true,\n generationStartedAt: Date.now(),\n generationProgress: {\n stage: 'parsing',\n message: 'Validating JSON structure...',\n },\n });\n\n const onProgress = (\n stage: 'parsing' | 'building' | 'rendering' | 'finalizing',\n message?: string\n ) => {\n if (signal.aborted || lastBuildRequestIdRef.current !== id) return;\n\n // Check document version to ensure we're still building the latest\n const currentVersion = documentVersionsRef.current.get(doc.name) || 0;\n if (currentVersion !== version) {\n console.log('Document version changed, aborting build');\n signal.dispatchEvent(new Event('abort'));\n return;\n }\n\n setOutput({\n isGenerating: true,\n generationProgress: { stage, message },\n });\n };\n\n try {\n // Always get fresh theme data to ensure latest changes are applied\n const freshThemeData = getFreshThemeData();\n\n console.log('Editor: Using themes for document build', {\n docName: doc.name,\n freshThemeCount: Object.keys(freshThemeData).length,\n freshThemeNames: Object.keys(freshThemeData),\n memoizedCount: Object.keys(validCustomThemes).length,\n requestId: id,\n });\n\n // Retry logic for temporary failures\n const result = await retry(\n async () => {\n if (signal.aborted) throw new Error('Build cancelled');\n return await generatePresentation(\n doc.name,\n doc.text,\n freshThemeData,\n onProgress,\n options\n );\n },\n {\n maxRetries: 2,\n initialDelay: 500,\n shouldRetry: (error) => {\n // Don't retry on cancellation or syntax errors\n if (\n error.message.includes('cancelled') ||\n error.message.includes('JSON') ||\n error.message.includes('parse') ||\n error.message.includes('syntax')\n ) {\n return false;\n }\n // Retry on worker errors\n return RetryStrategies.combine(\n RetryStrategies.temporaryErrors,\n (e) =>\n e.message.includes('Worker') || e.message.includes('Proxy')\n )(error);\n },\n onRetry: (error, attempt) => {\n console.log(\n `Retrying presentation generation (attempt ${attempt}):`,\n error.message\n );\n setOutput({\n isGenerating: true,\n generationProgress: {\n stage: 'parsing',\n message: `Retrying generation (attempt ${attempt})...`,\n },\n });\n },\n signal,\n }\n );\n\n if (signal.aborted || lastBuildRequestIdRef.current !== id) {\n console.log('Build cancelled for:', doc.name);\n setOutput({\n isGenerating: false,\n generationProgress: undefined,\n generationStartedAt: undefined,\n });\n return;\n }\n\n if (\n result &&\n typeof result === 'object' &&\n 'name' in result &&\n 'text' in result &&\n 'blob' in result\n ) {\n console.log('Editor: Build completed', {\n docName: result.name,\n blobSize: (result.blob as Blob)?.size,\n timestamp: Date.now(),\n requestId: id,\n version,\n });\n\n setOutput({\n name: result.name as string,\n text: result.text as string,\n blob: result.blob as Blob,\n renderer: result.renderer as string | undefined,\n globalError: undefined,\n isGenerating: false,\n isPreviewStale: false,\n generationProgress: undefined,\n generationStartedAt: undefined,\n lastBuiltSequence: outputStore.getState().editSequence,\n cacheStatus: (result as any).cacheStatus as\n | 'HIT'\n | 'MISS'\n | 'UNKNOWN'\n | undefined,\n cacheHitRate: (result as any).cacheHitRate as string | undefined,\n warnings: (result as any).warnings as any,\n });\n setBuildError(result.name as string, undefined);\n }\n } catch (error) {\n if (signal.aborted || lastBuildRequestIdRef.current !== id) {\n console.log('Build cancelled with error for:', doc.name);\n setOutput({\n isGenerating: false,\n generationProgress: undefined,\n generationStartedAt: undefined,\n });\n return;\n }\n\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n\n setOutput({\n globalError: errorMessage,\n isGenerating: false,\n generationProgress: undefined,\n generationStartedAt: undefined,\n });\n\n setBuildError(doc.name, errorMessage);\n } finally {\n buildAbortControllersRef.current.delete(doc.name);\n }\n },\n [\n generatePresentation,\n getFreshThemeData,\n setOutput,\n setBuildError,\n outputStore,\n ]\n );\n const processBuildRequestRef = useRef(processBuildRequest);\n useEffect(() => {\n processBuildRequestRef.current = processBuildRequest;\n });\n\n // Track the last viewed document for theme updates\n const lastViewedDocumentRef = useRef<string | null>(null);\n\n // re-build on active tab change or any document change\n useEffect(() => {\n console.log('Editor: Document rebuild effect triggered', {\n activeTab,\n });\n\n const activeFile = documents.find((doc) => doc.name === activeTab);\n const docType = documentTypes[activeTab] || 'application/json+report';\n\n // Track last viewed document\n if (docType === 'application/json+report' && activeFile) {\n lastViewedDocumentRef.current = activeTab;\n }\n\n // Clear any pending build timeout for this document\n const existingTimeout = buildTimeoutsRef.current.get(activeTab);\n if (existingTimeout) {\n clearTimeout(existingTimeout);\n buildTimeoutsRef.current.delete(activeTab);\n }\n\n if (activeFile && docType === 'application/json+report') {\n // Editing marks the preview stale rather than rebuilding: a build costs\n // a LibreOffice conversion, so it waits for Run. Do not clobber a build\n // already in flight (e.g. one the Run button started).\n if (!outputStore.getState().isGenerating) {\n setOutput({ isPreviewStale: true });\n }\n } else if (activeFile && docType === 'application/json+theme') {\n // Theme tab active — no document preview to build.\n // Don't clear blob: preserve the last document preview in the background.\n cancelGeneration();\n }\n\n // Cleanup function to cancel pending operations\n return () => {\n const timeout = buildTimeoutsRef.current.get(activeTab);\n if (timeout) {\n clearTimeout(timeout);\n buildTimeoutsRef.current.delete(activeTab);\n }\n };\n }, [\n documents,\n activeTab,\n setOutput,\n documentTypes,\n buildDocument,\n cancelGeneration,\n ]);\n\n // Track which documents use which themes (only parse the active doc to avoid O(n) JSON.parse)\n const documentThemeDependencies = useMemo(() => {\n const deps = new Map<string, string>();\n const activeDoc = documents.find((d) => d.name === activeTab);\n if (\n activeDoc &&\n documentTypes[activeDoc.name] === 'application/json+report'\n ) {\n try {\n const parsed = JSON.parse(activeDoc.text);\n const themeName = parsed.props?.theme;\n if (typeof themeName === 'string') {\n const themeExists = Object.values(customThemes).some(\n (t) => t.name === themeName && t.valid\n );\n if (themeExists) {\n deps.set(activeDoc.name, themeName);\n }\n }\n } catch {\n // Ignore parse errors\n }\n }\n return deps;\n }, [activeTab, documents, documentTypes, customThemes]);\n\n // Listen for theme change events and force immediate rebuild\n useEffect(() => {\n console.log('Editor: Setting up theme change listener', {\n documentCount: documents.length,\n dependencyCount: documentThemeDependencies.size,\n dependencies: Array.from(documentThemeDependencies.entries()),\n customThemes: Object.entries(customThemes).map(([key, theme]) => ({\n key,\n name: theme.name,\n valid: theme.valid,\n })),\n });\n\n const unsubscribe = themeChangeEmitter.onThemeChange((event) => {\n console.log('Editor: Theme change detected', {\n event,\n dependencies: Array.from(documentThemeDependencies.entries()),\n activeTab,\n customThemes: Object.entries(customThemes).map(([key, theme]) => ({\n key,\n name: theme.name,\n valid: theme.valid,\n })),\n });\n\n // Find all documents that use this theme\n const documentsUsingTheme: any[] = [];\n\n documentThemeDependencies.forEach((themeName, docName) => {\n if (themeName === event.themeName) {\n const doc = documents.find((d) => d.name === docName);\n if (doc) {\n documentsUsingTheme.push(doc);\n }\n }\n });\n\n console.log('Editor: Documents using changed theme', {\n themeName: event.themeName,\n documentCount: documentsUsingTheme.length,\n documentNames: documentsUsingTheme.map((d) => d.name),\n });\n\n if (documentsUsingTheme.length === 0) {\n console.log('Editor: No documents use this theme, skipping rebuild');\n return;\n }\n\n // A theme change invalidates the preview of every document using it;\n // rebuilding is the author’s call, as it is for a document edit.\n if (!outputStore.getState().isGenerating) {\n setOutput({ isPreviewStale: true });\n }\n });\n\n return unsubscribe;\n }, [\n documentThemeDependencies,\n documents,\n buildDocument,\n getDocumentVersion,\n activeTab,\n setOutput,\n ]);\n\n // Flush debounces and immediately build — triggered by Run button via custom event\n // Debounced at 150ms to coalesce rapid clicks\n // Stable refs so the event handler never goes stale and doesn't need\n // reactive deps that would cause cleanup to cancel the pending timeout\n const buildDocumentRef = useRef(buildDocument);\n useEffect(() => {\n buildDocumentRef.current = buildDocument;\n });\n const getDocumentVersionRef = useRef(getDocumentVersion);\n useEffect(() => {\n getDocumentVersionRef.current = getDocumentVersion;\n });\n\n useEffect(() => {\n const handler = () => {\n // Mark generating early so the rebuild effect (triggered by saveDocument\n // below) doesn't clobber this build with isPreviewStale\n setOutput({ isGenerating: true });\n\n // 1. Flush Monaco debounce: read live text, save to store immediately\n let themeDirty = false;\n const editorRef = useEditorRefsStore.getState().getActiveEditor();\n if (editorRef) {\n // Don't flush if a pending diff is active — editor may be disposed\n const hasPendingDiff =\n documentsStore.getState().pendingDiffs[editorRef.documentName];\n if (!hasPendingDiff) {\n const liveText = editorRef.toStorageValue(\n editorRef.editor.getValue()\n );\n documentsStore\n .getState()\n .saveDocument(editorRef.documentName, liveText);\n }\n }\n\n // Flush all open theme editors whose live text differs from the\n // themes store so the build always uses up-to-date theme data.\n const { documents: allDocs, documentTypes: allDtypes } =\n documentsStore.getState();\n for (const doc of allDocs) {\n if (allDtypes[doc.name] === 'application/json+theme') {\n const ref = useEditorRefsStore.getState().getEditor(doc.name);\n if (ref) {\n const liveText = ref.toStorageValue(ref.editor.getValue());\n const existing = themesStore.getState().customThemes[doc.name];\n if (!existing || existing.content !== liveText) {\n themesStore.getState().updateTheme(doc.name, liveText);\n themeDirty = true;\n }\n }\n }\n }\n\n // 2. Cancel any pending build timeout for active doc\n const currentTab = documentsStore.getState().activeTab;\n const timeout = buildTimeoutsRef.current.get(currentTab);\n if (timeout) {\n clearTimeout(timeout);\n buildTimeoutsRef.current.delete(currentTab);\n }\n\n // 3. Debounce the actual build to coalesce rapid Run clicks\n if (flushBuildTimerRef.current) {\n clearTimeout(flushBuildTimerRef.current);\n }\n flushBuildTimerRef.current = setTimeout(() => {\n flushBuildTimerRef.current = null;\n const {\n documents: docs,\n activeTab: tab,\n documentTypes: dtypes,\n } = documentsStore.getState();\n\n // Determine target: if active tab is a theme, build the last-viewed document instead\n let targetName = tab;\n const tabType = dtypes[tab] || 'application/json+report';\n if (tabType === 'application/json+theme') {\n if (lastViewedDocumentRef.current) {\n targetName = lastViewedDocumentRef.current;\n } else {\n // No document was viewed yet — nothing to build\n setOutput({ isGenerating: false });\n return;\n }\n }\n\n const freshDoc = docs.find((d) => d.name === targetName);\n if (freshDoc) {\n // If a pending diff exists (AI suggestion), preview the modified version\n const pending = documentsStore.getState().pendingDiffs[targetName];\n const ref = useEditorRefsStore.getState().getEditor(targetName);\n const doc = pending\n ? { ...freshDoc, text: pending.modified }\n : ref\n ? { ...freshDoc, text: ref.toStorageValue(ref.editor.getValue()) }\n : freshDoc;\n getDocumentVersionRef.current(doc.name);\n // Bypass cache only when a theme was updated during this flush\n buildDocumentRef.current(\n doc,\n undefined,\n themeDirty ? { bypassCache: true } : undefined\n );\n } else {\n setOutput({ isGenerating: false });\n }\n }, 150);\n };\n\n window.addEventListener('preview:flushAndBuild', handler);\n return () => {\n window.removeEventListener('preview:flushAndBuild', handler);\n if (flushBuildTimerRef.current) {\n clearTimeout(flushBuildTimerRef.current);\n }\n };\n }, [setOutput, documentsStore, themesStore]);\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n // Cancel all pending builds\n buildAbortControllersRef.current.forEach((controller) =>\n controller.abort()\n );\n buildAbortControllersRef.current.clear();\n\n // Clear all timeouts\n buildTimeoutsRef.current.forEach((timeout) => clearTimeout(timeout));\n buildTimeoutsRef.current.clear();\n\n // Cancel any ongoing generation\n cancelGeneration();\n };\n }, [cancelGeneration]);\n\n if (!openTabs.length) {\n return (\n <div className=\"flex flex-col text-muted-foreground h-full items-center justify-center\">\n {!documents?.length ? 'Create a new document...' : 'Open a document...'}\n </div>\n );\n }\n\n return (\n <Tabs value={activeTab} onValueChange={setActiveTab} className=\"h-full\">\n {/* Tabs header removed to gain vertical space */}\n <EditorTabsContentMemoized\n openTabs={openTabs}\n documents={documents}\n buildErrors={buildErrors}\n saveDocumentDebounceWait={saveDocumentDebounceWait}\n />\n </Tabs>\n );\n}\n\n// Export memoized version of Editor component\nexport const Editor = memo(EditorComponent);\n"],"names":["validators","monaco","dummyDiv","dummyEditorInstance","editorInstanceConstructorName","editorModelConstructorName","valueToValidate","ranges","rangeObj","num","TypeMustBe","type","key","additional","deepClone","byPassPrimitives","value","callback","cloneArray","array","keys","arrayClone","i","cloner","object","clone","config","constructOptionForCode","options","acc","option","codes","methods","API","methodName","enums","constrainedModel","model","rangeConstructor","sortRangesInAscendingOrder","rangeObject1","rangeObject2","rangeA","rangeB","normalizeRange","range","content","lines","noOfLines","normalizedRange","index","actualStartCol","startLineNo","maxCols","actualEndLine","actualEndCol","endLineNo","restrictions","prepareRestrictions","restriction","startLine","startCol","endLine","endCol","getCurrentEditableRanges","getValueInEditableRanges","updateValueInEditableRanges","forceMoveMarkers","restrictionsMap","label","doesChangeHasMultilineConflict","newRange","isChangeInvalidAsPerUser","disposeRestrictions","handleUnhandledPromiseRejection","isCursorAtCheckPoint","positions","position","posLineNumber","posCol","length","addEditableRangeListener","triggerChangeListenersWith","currentChanges","allChanges","currentRanges","doUndo","updateRange","finalLine","finalColumn","changes","changeIndex","oldRangeEndLineNumber","oldRangeEndColumn","changesLength","diffInCol","diffInRow","cursorPositions","noOfCursorPositions","change","cursorPosition","nextRestriction","nextRange","nextChange","rangeInChange","rangeAsString","rangeMapValue","getInfoFrom","editableRange","info","updateRestrictions","toggleHighlightOfEditableAreas","cssClasses","cssClassForSingleLine","cssClassForMultiLine","decorations","decoration","setAllRangesToPrev","rangeMap","text","manipulatorApi","contentChangedEvent","isUndoing","editedRange","changedRange","noOfLinesAdded","noOfColsAddedAtLastLine","lineDiffInRange","colDiffInRange","columnsCarriedToEnd","values","currentlyEditedRanges","rangeString","exposedApi","funcName","apiName","constrainedEditor","listenerFn","editorInstance","selections","selection","_uriRestrictionMap","isInstanceValid","isModelValid","isRangesValid","initInEditorInstance","domNode","manipulator","newDomNode","addRestrictionsTo","modelToConstrain","removeRestrictionsIn","uri","restrictedModel","disposeConstrainer","toggleDevMode","editor","startLineNumber","endLineNumber","startColumn","endColumn","exposedMethods","resolveThemeDefaultPath","name","ext","FORMAT","EditorMonacoTheme","document","readOnly","onChange","editorRef","useRef","monacoRef","modelRef","theme","useTheme","validationErrors","setValidationErrors","useState","showValidationPanel","setShowValidationPanel","isValidationPanelMinimized","setIsValidationPanelMinimized","userDismissedRef","pendingDiff","useDocumentsStore","s","clearPendingDiff","saveDocument","registerEditor","unregisterEditor","setActiveEditor","useEditorRefsStore","resolvedTheme","handleEditorWillMount","useCallback","registerMonacoThemes","handleEditorMount","constrainedInstance","getSelectionContext","snippet","createContextSnippet","_a","useEffect","handleChange","_event","handleEditorValidation","markers","errors","marker","handleErrorClick","error","monacoThemeFor","jsxs","Fragment","jsx","Button","DiffEditor","MonacoEditor","ValidationStatusBar","ValidationPanel","EditorMonacoThemeMemoized","React","TabContent","_buildError","saveDocumentDebounceWait","documentType","state","updateTheme","useThemesStore","debouncedUpdateTheme","debounce","TabsContent","EditorMonacoJsonMemoized","TabContentMemoized","EditorTabsContent","openTabs","documents","buildErrors","documentTypes","d","doc","EditorTabsContentMemoized","RetryError","message","lastError","attempts","retry","fn","maxRetries","initialDelay","maxDelay","backoffFactor","onRetry","shouldRetry","signal","attempt","jitteredDelay","resolve","timeoutId","RetryStrategies","pattern","statusCodes","strategies","strategy","EditorComponent","setOutput","useOutputStore","outputStore","useContext","OutputStoreContext","documentsStore","DocumentsStoreContext","themesStore","ThemesStoreContext","useSettingsStore","activeTab","setActiveTab","setBuildError","useShallow","customThemes","generatePresentation","cancelGeneration","usePresentationGenerator","buildAbortControllersRef","buildTimeoutsRef","flushBuildTimerRef","lastBuildRequestIdRef","documentVersionsRef","cancelActiveBuild","timeout","controller","getDocumentVersion","docName","newVersion","customThemesContentHash","useMemo","themeData","lastModifiedTime","validCustomThemes","themes","getFreshThemeData","freshThemes","buildDocument","existingController","abortController","finalSignal","requestId","version","buildRequest","processBuildRequestRef","processBuildRequest","request","id","onProgress","stage","freshThemeData","result","e","errorMessage","lastViewedDocumentRef","activeFile","docType","existingTimeout","documentThemeDependencies","deps","activeDoc","themeName","t","themeChangeEmitter","event","documentsUsingTheme","buildDocumentRef","getDocumentVersionRef","handler","themeDirty","liveText","allDocs","allDtypes","ref","existing","currentTab","docs","tab","dtypes","targetName","freshDoc","pending","Tabs","Editor","memo"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5]}
1
+ {"version":3,"file":"editor-edmvhW9F.js","sources":["../../../../../node_modules/.pnpm/constrained-editor-plugin@1.4.0/node_modules/constrained-editor-plugin/dist/esm/utils/validators.js","../../../../../node_modules/.pnpm/constrained-editor-plugin@1.4.0/node_modules/constrained-editor-plugin/dist/esm/utils/definedErrors.js","../../../../../node_modules/.pnpm/constrained-editor-plugin@1.4.0/node_modules/constrained-editor-plugin/dist/esm/utils/deepClone.js","../../../../../node_modules/.pnpm/constrained-editor-plugin@1.4.0/node_modules/constrained-editor-plugin/dist/esm/utils/enums.js","../../../../../node_modules/.pnpm/constrained-editor-plugin@1.4.0/node_modules/constrained-editor-plugin/dist/esm/constrainedModel.js","../../../../../node_modules/.pnpm/constrained-editor-plugin@1.4.0/node_modules/constrained-editor-plugin/dist/esm/constrainedEditor.js","../../../src/client/components/json-editor/editor-monaco-theme.tsx","../../../src/client/components/playground/editor-tabs-content.tsx","../../../src/client/utils/retry.ts","../../../src/client/components/playground/editor.tsx"],"sourcesContent":["const validators = {\n initWith: function (monaco) {\n const dummyDiv = document.createElement('div');\n const dummyEditorInstance = monaco.editor.create(dummyDiv);\n const editorInstanceConstructorName = dummyEditorInstance.constructor.name;\n const editorModelConstructorName = dummyEditorInstance.getModel().constructor.name;\n const instanceCheck = function (valueToValidate) {\n return valueToValidate.constructor.name === editorInstanceConstructorName;\n }\n const modelCheck = function (valueToValidate) {\n return valueToValidate.constructor.name === editorModelConstructorName;\n }\n const rangesCheck = function (ranges) {\n if (Array.isArray(ranges)) {\n return ranges.every(function (rangeObj) {\n if (typeof rangeObj === 'object' && rangeObj.constructor.name === 'Object') {\n if (!rangeObj.hasOwnProperty('range')) return false;\n if (!Array.isArray(rangeObj.range)) return false;\n if (rangeObj.range.length !== 4) return false;\n if (!(rangeObj.range.every(num => num > 0 && parseInt(num) === num))) return false;\n if (rangeObj.hasOwnProperty('allowMultiline')) {\n if (typeof rangeObj.allowMultiline !== 'boolean') return false;\n }\n if (rangeObj.hasOwnProperty('label')) {\n if (typeof rangeObj.label !== 'string') return false;\n }\n if (rangeObj.hasOwnProperty('validate')) {\n if (typeof rangeObj.validate !== 'function') return false;\n }\n return true;\n }\n return false;\n });\n }\n return false;\n }\n return {\n isInstanceValid: instanceCheck,\n isModelValid: modelCheck,\n isRangesValid: rangesCheck\n }\n }\n}\nexport default validators;","export const TypeMustBe = function (type, key, additional) {\n return 'The value for the ' + key + ' should be of type ' + (Array.isArray(type) ? type.join(' | ') : type) + '. ' + (additional || '')\n}\nconst definedErrors = {\n TypeMustBe : TypeMustBe\n};\nexport default definedErrors;","export const deepClone = (function () {\n const byPassPrimitives = function (value, callback) {\n if (typeof value !== 'object' || value === null) {\n return this.freeze ? Object.freeze(value) : value;\n }\n if (value instanceof Date) {\n return this.freeze ? Object.freeze(new Date(value)) : new Date(value);\n }\n return callback.call(this, value);\n }\n const cloneArray = function (array, callback) {\n const keys = Object.keys(array);\n const arrayClone = new Array(keys.length)\n for (let i = 0; i < keys.length; i++) {\n arrayClone[keys[i]] = byPassPrimitives.call(this, array[keys[i]], callback);\n }\n return arrayClone;\n }\n const cloner = function (object) {\n return byPassPrimitives.call(this, object, function (object) {\n if (Array.isArray(object)) {\n return cloneArray.call(this, object, cloner)\n }\n const clone = {};\n for (let key in object) {\n if (!this.withProto && Object.hasOwnProperty.call(object, key) === false) {\n continue;\n }\n clone[key] = byPassPrimitives.call(this, object[key], cloner);\n }\n return clone;\n })\n }\n const config = (function () {\n const constructOptionForCode = function (value) {\n const options = [\n 'withProto',\n 'freeze'\n ]\n this[value] = options.reduce(function (acc, option) {\n if (acc[option] = (value >= this[option])) {\n value -= this[option]\n }\n return acc;\n }.bind(this), {})\n }\n const codes = Object.create(Object.defineProperties({}, {\n withProto: { value: 1 },\n freeze: { value: 2 }\n }));\n for (let i = 0; i <= 3; i++) {\n constructOptionForCode.call(codes, i);\n }\n return codes;\n }());\n const methods = {\n withProto: cloner.bind(config[1]),\n andFreeze: cloner.bind(config[2]),\n withProtoAndFreeze: cloner.bind(config[3])\n }\n const API = cloner.bind(config[0]);\n for (let methodName in methods) {\n Object.defineProperty(API, methodName, {\n enumerable: false,\n writable: false,\n configurable: false,\n value: methods[methodName]\n })\n }\n return API;\n}());\n\nexport default deepClone;","export const enums = {\n SINGLE_LINE_HIGHLIGHT_CLASS: 'editableArea--single-line',\n MULTI_LINE_HIGHLIGHT_CLASS: 'editableArea--multi-line'\n}\nexport default enums;","import deepClone from './utils/deepClone.js';\nimport enums from './utils/enums.js';\nexport const constrainedModel = function (model, ranges, monaco) {\n const rangeConstructor = monaco.Range;\n const sortRangesInAscendingOrder = function (rangeObject1, rangeObject2) {\n const rangeA = rangeObject1.range;\n const rangeB = rangeObject2.range;\n if (\n rangeA[0] < rangeB[0] ||\n (rangeA[0] === rangeB[0] && rangeA[3] < rangeB[1])\n ) {\n return -1;\n }\n }\n const normalizeRange = function (range, content) {\n const lines = content.split('\\n');\n const noOfLines = lines.length;\n const normalizedRange = [];\n range.forEach(function (value, index) {\n if (value === 0) {\n throw new Error('Range values cannot be zero');//No I18n\n }\n switch (index) {\n case 0: {\n if (value < 0) {\n throw new Error('Start Line of Range cannot be negative');//No I18n\n } else if (value > noOfLines) {\n throw new Error('Provided Start Line(' + value + ') is out of bounds. Max Lines in content is ' + noOfLines);//No I18n\n }\n normalizedRange[index] = value;\n }\n break;\n case 1: {\n let actualStartCol = value;\n const startLineNo = normalizedRange[0];\n const maxCols = lines[startLineNo - 1].length\n if (actualStartCol < 0) {\n actualStartCol = maxCols - Math.abs(actualStartCol);\n if (actualStartCol < 0) {\n throw new Error('Provided Start Column(' + value + ') is out of bounds. Max Column in line ' + startLineNo + ' is ' + maxCols);//No I18n\n }\n } else if (actualStartCol > (maxCols + 1)) {\n throw new Error('Provided Start Column(' + value + ') is out of bounds. Max Column in line ' + startLineNo + ' is ' + maxCols);//No I18n\n }\n normalizedRange[index] = actualStartCol;\n }\n break;\n case 2: {\n let actualEndLine = value;\n if (actualEndLine < 0) {\n actualEndLine = noOfLines - Math.abs(value);\n if (actualEndLine < 0) {\n throw new Error('Provided End Line(' + value + ') is out of bounds. Max Lines in content is ' + noOfLines);//No I18n\n }\n if (actualEndLine < normalizedRange[0]) {\n console.warn('Provided End Line(' + value + ') is less than the start Line, the Restriction may not behave as expected');//No I18n\n }\n } else if (value > noOfLines) {\n throw new Error('Provided End Line(' + value + ') is out of bounds. Max Lines in content is ' + noOfLines);//No I18n\n }\n normalizedRange[index] = actualEndLine;\n }\n break;\n case 3: {\n let actualEndCol = value;\n const endLineNo = normalizedRange[2];\n const maxCols = lines[endLineNo - 1].length\n if (actualEndCol < 0) {\n actualEndCol = maxCols - Math.abs(actualEndCol);\n if (actualEndCol < 0) {\n throw new Error('Provided End Column(' + value + ') is out of bounds. Max Column in line ' + endLineNo + ' is ' + maxCols);//No I18n\n }\n } else if (actualEndCol > (maxCols + 1)) {\n throw new Error('Provided Start Column(' + value + ') is out of bounds. Max Column in line ' + endLineNo + ' is ' + maxCols);//No I18n\n }\n normalizedRange[index] = actualEndCol;\n }\n break;\n }\n })\n return normalizedRange;\n }\n let restrictions = deepClone(ranges).sort(sortRangesInAscendingOrder);\n const prepareRestrictions = function (restrictions) {\n const content = model.getValue();\n restrictions.forEach(function (restriction, index) {\n const range = normalizeRange(restriction.range, content);\n const startLine = range[0];\n const startCol = range[1];\n const endLine = range[2];\n const endCol = range[3];\n restriction._originalRange = range.slice();\n restriction.range = new rangeConstructor(startLine, startCol, endLine, endCol);\n restriction.index = index;\n if (!restriction.allowMultiline) {\n restriction.allowMultiline = rangeConstructor.spansMultipleLines(restriction.range)\n }\n if (!restriction.label) {\n restriction.label = `[${startLine},${startCol} -> ${endLine}${endCol}]`;\n }\n });\n }\n const getCurrentEditableRanges = function () {\n return restrictions.reduce(function (acc, restriction) {\n acc[restriction.label] = {\n allowMultiline: restriction.allowMultiline || false,\n index: restriction.index,\n range: Object.assign({}, restriction.range),\n originalRange: restriction._originalRange.slice()\n };\n return acc;\n }, {});\n }\n const getValueInEditableRanges = function () {\n return restrictions.reduce(function (acc, restriction) {\n acc[restriction.label] = model.getValueInRange(restriction.range);\n return acc;\n }, {});\n }\n const updateValueInEditableRanges = function (object, forceMoveMarkers) {\n if (typeof object === 'object' && !Array.isArray(object)) {\n forceMoveMarkers = typeof forceMoveMarkers === 'boolean' ? forceMoveMarkers : false;\n const restrictionsMap = restrictions.reduce(function (acc, restriction) {\n if (restriction.label) {\n acc[restriction.label] = restriction;\n }\n return acc;\n }, {});\n for (let label in object) {\n const restriction = restrictionsMap[label];\n if (restriction) {\n const value = object[label];\n if (doesChangeHasMultilineConflict(restriction, value)) {\n throw new Error('Multiline change is not allowed for ' + label);\n }\n const newRange = deepClone(restriction.range);\n newRange.endLine = newRange.startLine + value.split('\\n').length - 1;\n newRange.endColumn = value.split('\\n').pop().length;\n if (isChangeInvalidAsPerUser(restriction, value, newRange)) {\n throw new Error('Change is invalidated by validate function of ' + label);\n }\n model.applyEdits([{\n forceMoveMarkers: !!forceMoveMarkers,\n range: restriction.range,\n text: value\n }]);\n } else {\n console.error('No restriction found for ' + label);\n }\n }\n } else {\n throw new Error('Value must be an object');//No I18n\n }\n }\n const disposeRestrictions = function () {\n model._restrictionChangeListener.dispose();\n window.removeEventListener(\"error\", handleUnhandledPromiseRejection);\n delete model.editInRestrictedArea;\n delete model.disposeRestrictions;\n delete model.getValueInEditableRanges;\n delete model.updateValueInEditableRanges;\n delete model.updateRestrictions;\n delete model.getCurrentEditableRanges;\n delete model.toggleHighlightOfEditableAreas;\n delete model._hasHighlight;\n delete model._isRestrictedModel;\n delete model._isCursorAtCheckPoint;\n delete model._currentCursorPositions;\n delete model._editableRangeChangeListener;\n delete model._restrictionChangeListener;\n delete model._oldDecorations;\n delete model._oldDecorationsSource;\n return model;\n }\n const isCursorAtCheckPoint = function (positions) {\n positions.some(function (position) {\n const posLineNumber = position.lineNumber;\n const posCol = position.column;\n const length = restrictions.length;\n for (let i = 0; i < length; i++) {\n const range = restrictions[i].range;\n if (\n (range.startLineNumber === posLineNumber && range.startColumn === posCol) ||\n (range.endLineNumber === posLineNumber && range.endColumn === posCol)\n ) {\n model.pushStackElement();\n return true;\n }\n }\n });\n };\n const addEditableRangeListener = function (callback) {\n if (typeof callback === 'function') {\n model._editableRangeChangeListener.push(callback);\n }\n };\n const triggerChangeListenersWith = function (currentChanges, allChanges) {\n const currentRanges = getCurrentEditableRanges();\n model._editableRangeChangeListener.forEach(function (callback) {\n callback.call(model, currentChanges, allChanges, currentRanges);\n });\n };\n const doUndo = function () {\n return Promise.resolve().then(function () {\n model.editInRestrictedArea = true;\n model.undo();\n model.editInRestrictedArea = false;\n if (model._hasHighlight && model._oldDecorationsSource) {\n // id present in the decorations info will be omitted by monaco\n // So we don't need to remove the old decorations id\n model.deltaDecorations(model._oldDecorations, model._oldDecorationsSource);\n model._oldDecorationsSource.forEach(function (object) {\n object.range = model.getDecorationRange(object.id);\n });\n }\n });\n };\n const updateRange = function (restriction, range, finalLine, finalColumn, changes, changeIndex) {\n let oldRangeEndLineNumber = range.endLineNumber;\n let oldRangeEndColumn = range.endColumn;\n restriction.prevRange = range;\n restriction.range = range.setEndPosition(finalLine, finalColumn);\n const length = restrictions.length;\n let changesLength = changes.length;\n const diffInCol = finalColumn - oldRangeEndColumn;\n const diffInRow = finalLine - oldRangeEndLineNumber;\n\n const cursorPositions = model._currentCursorPositions || [];\n const noOfCursorPositions = cursorPositions.length;\n // if (noOfCursorPositions > 0) {\n if (changesLength !== noOfCursorPositions) {\n changes = changes.filter(function (change) {\n const range = change.range;\n for (let i = 0; i < noOfCursorPositions; i++) {\n const cursorPosition = cursorPositions[i];\n if (\n (range.startLineNumber === cursorPosition.startLineNumber) &&\n (range.endLineNumber === cursorPosition.endLineNumber) &&\n (range.startColumn === cursorPosition.startColumn) &&\n (range.endColumn === cursorPosition.endColumn)\n ) {\n return true;\n }\n }\n return false;\n });\n changesLength = changes.length;\n }\n if (diffInRow !== 0) {\n for (let i = restriction.index + 1; i < length; i++) {\n const nextRestriction = restrictions[i];\n const nextRange = nextRestriction.range;\n if (oldRangeEndLineNumber === nextRange.startLineNumber) {\n nextRange.startColumn += diffInCol;\n }\n if (oldRangeEndLineNumber === nextRange.endLineNumber) {\n nextRange.endColumn += diffInCol;\n }\n nextRange.startLineNumber += diffInRow;\n nextRange.endLineNumber += diffInRow;\n nextRestriction.range = nextRange;\n }\n for (let i = changeIndex + 1; i < changesLength; i++) {\n const nextChange = changes[i];\n const rangeInChange = nextChange.range;\n const rangeAsString = rangeInChange.toString();\n const rangeMapValue = rangeMap[rangeAsString];\n delete rangeMap[rangeAsString];\n if (oldRangeEndLineNumber === rangeInChange.startLineNumber) {\n rangeInChange.startColumn += diffInCol;\n }\n if (oldRangeEndLineNumber === rangeInChange.endLineNumber) {\n rangeInChange.endColumn += diffInCol;\n }\n rangeInChange.startLineNumber += diffInRow;\n rangeInChange.endLineNumber += diffInRow;\n nextChange.range = rangeInChange;\n rangeMap[rangeInChange.toString()] = rangeMapValue;\n }\n } else {\n // Only Column might have changed\n for (let i = restriction.index + 1; i < length; i++) {\n const nextRestriction = restrictions[i];\n const nextRange = nextRestriction.range;\n if (nextRange.startLineNumber > oldRangeEndLineNumber) {\n break;\n } else {\n nextRange.startColumn += diffInCol;\n nextRange.endColumn += diffInCol;\n nextRestriction.range = nextRange;\n }\n }\n for (let i = changeIndex + 1; i < changesLength; i++) {\n // rangeMap\n const nextChange = changes[i];\n const rangeInChange = nextChange.range;\n const rangeAsString = rangeInChange.toString();\n const rangeMapValue = rangeMap[rangeAsString];\n delete rangeMap[rangeAsString];\n if (rangeInChange.startLineNumber > oldRangeEndLineNumber) {\n rangeMap[rangeInChange.toString()] = rangeMapValue;\n break;\n } else {\n rangeInChange.startColumn += diffInCol;\n rangeInChange.endColumn += diffInCol;\n nextChange.range = rangeInChange;\n rangeMap[rangeInChange.toString()] = rangeMapValue;\n }\n }\n }\n // }\n };\n const getInfoFrom = function (change, editableRange) {\n const info = {};\n const range = change.range;\n // Get State\n if (change.text === '') {\n info.isDeletion = true;\n } else if (\n (range.startLineNumber === range.endLineNumber) &&\n (range.startColumn === range.endColumn)\n ) {\n info.isAddition = true;\n } else {\n info.isReplacement = true;\n }\n // Get Position Of Range\n info.startLineOfRange = range.startLineNumber === editableRange.startLineNumber;\n info.startColumnOfRange = range.startColumn === editableRange.startColumn;\n\n info.endLineOfRange = range.endLineNumber === editableRange.endLineNumber;\n info.endColumnOfRange = range.endColumn === editableRange.endColumn;\n\n info.middleLineOfRange = !info.startLineOfRange && !info.endLineOfRange;\n\n // Editable Range Span\n if (editableRange.startLineNumber === editableRange.endLineNumber) {\n info.rangeIsSingleLine = true;\n } else {\n info.rangeIsMultiLine = true;\n }\n return info;\n };\n const updateRestrictions = function (ranges) {\n restrictions = deepClone(ranges).sort(sortRangesInAscendingOrder);\n prepareRestrictions(restrictions);\n };\n const toggleHighlightOfEditableAreas = function (cssClasses) {\n if (!model._hasHighlight) {\n const cssClassForSingleLine = cssClasses.cssClassForSingleLine ||enums.SINGLE_LINE_HIGHLIGHT_CLASS\n const cssClassForMultiLine = cssClasses.cssClassForMultiLine ||enums.MULTI_LINE_HIGHLIGHT_CLASS\n const decorations = restrictions.map(function (restriction) {\n const decoration = {\n range: restriction.range,\n options: {\n className: restriction.allowMultiline ?\n cssClassForMultiLine :\n cssClassForSingleLine\n }\n }\n if (restriction.label) {\n decoration.hoverMessage = restriction.label;\n }\n return decoration;\n });\n model._oldDecorations = model.deltaDecorations([], decorations);\n model._oldDecorationsSource = decorations.map(function (decoration, index) {\n return Object.assign({}, decoration, { id: model._oldDecorations[index] });\n });\n model._hasHighlight = true;\n } else {\n model.deltaDecorations(model._oldDecorations, []);\n delete model._oldDecorations;\n delete model._oldDecorationsSource;\n model._hasHighlight = false;\n }\n }\n const handleUnhandledPromiseRejection = function () {\n console.debug('handler for unhandled promise rejection');\n };\n const setAllRangesToPrev = function (rangeMap) {\n for (let key in rangeMap) {\n const restriction = rangeMap[key];\n restriction.range = restriction.prevRange;\n }\n };\n const doesChangeHasMultilineConflict = function (restriction, text) {\n return !restriction.allowMultiline && text.includes('\\n');\n };\n const isChangeInvalidAsPerUser = function (restriction, value, range) {\n return restriction.validate && !restriction.validate(value, range, restriction.lastInfo);\n }\n\n const manipulatorApi = {\n _isRestrictedModel: true,\n _isRestrictedValueValid: true,\n _editableRangeChangeListener: [],\n _isCursorAtCheckPoint: isCursorAtCheckPoint,\n _currentCursorPositions: []\n }\n\n prepareRestrictions(restrictions);\n model._hasHighlight = false;\n manipulatorApi._restrictionChangeListener = model.onDidChangeContent(function (contentChangedEvent) {\n const isUndoing = contentChangedEvent.isUndoing;\n model._isRestrictedValueValid = true;\n if (!(isUndoing && model.editInRestrictedArea)) {\n const changes = contentChangedEvent.changes.sort(sortRangesInAscendingOrder);\n const rangeMap = {};\n const length = restrictions.length;\n const isAllChangesValid = changes.every(function (change) {\n const editedRange = change.range;\n const rangeAsString = editedRange.toString();\n rangeMap[rangeAsString] = null;\n for (let i = 0; i < length; i++) {\n const restriction = restrictions[i];\n const range = restriction.range;\n if (range.containsRange(editedRange)) {\n if (doesChangeHasMultilineConflict(restriction, change.text)) {\n return false;\n }\n rangeMap[rangeAsString] = restriction;\n return true;\n }\n }\n return false;\n })\n if (isAllChangesValid) {\n changes.forEach(function (change, changeIndex) {\n const changedRange = change.range;\n const restriction = rangeMap[changedRange.toString()];\n const editableRange = restriction.range;\n const text = change.text || '';\n /**\n * Things to check before implementing the change\n * - A | D | R => Addition | Deletion | Replacement\n * - MC | SC => MultiLineChange | SingleLineChange\n * - SOR | MOR | EOR => Change Occured in - Start Of Range | Middle Of Range | End Of Range\n * - SSL | SML => Editable Range - Spans Single Line | Spans Multiple Line\n */\n const noOfLinesAdded = (text.match(/\\n/g) || []).length;\n const noOfColsAddedAtLastLine = text.split(/\\n/g).pop().length;\n\n const lineDiffInRange = changedRange.endLineNumber - changedRange.startLineNumber;\n const colDiffInRange = changedRange.endColumn - changedRange.startColumn;\n\n let finalLine = editableRange.endLineNumber;\n let finalColumn = editableRange.endColumn;\n\n let columnsCarriedToEnd = 0;\n if (\n (editableRange.endLineNumber === changedRange.startLineNumber) ||\n (editableRange.endLineNumber === changedRange.endLineNumber)\n ) {\n columnsCarriedToEnd += (editableRange.endColumn - changedRange.startColumn) + 1;\n }\n\n const info = getInfoFrom(change, editableRange);\n restriction.lastInfo = info;\n if (info.isAddition || info.isReplacement) {\n if (info.rangeIsSingleLine) {\n /**\n * Only Column Change has occurred , so regardless of the position of the change\n * Addition of noOfCols is enough\n */\n if (noOfLinesAdded === 0) {\n finalColumn += noOfColsAddedAtLastLine;\n } else {\n finalLine += noOfLinesAdded;\n if (info.startColumnOfRange) {\n finalColumn += noOfColsAddedAtLastLine\n } else if (info.endColumnOfRange) {\n finalColumn = (noOfColsAddedAtLastLine + 1)\n } else {\n finalColumn = (noOfColsAddedAtLastLine + columnsCarriedToEnd)\n }\n }\n }\n if (info.rangeIsMultiLine) {\n // Handling for Start Of Range is not required\n finalLine += noOfLinesAdded;\n if (info.endLineOfRange) {\n if (noOfLinesAdded === 0) {\n finalColumn += noOfColsAddedAtLastLine;\n } else {\n finalColumn = (columnsCarriedToEnd + noOfColsAddedAtLastLine);\n }\n }\n }\n }\n if (info.isDeletion || info.isReplacement) {\n if (info.rangeIsSingleLine) {\n finalColumn -= colDiffInRange;\n }\n if (info.rangeIsMultiLine) {\n if (info.endLineOfRange) {\n finalLine -= lineDiffInRange;\n finalColumn -= colDiffInRange;\n } else {\n finalLine -= lineDiffInRange;\n }\n }\n }\n updateRange(restriction, editableRange, finalLine, finalColumn, changes, changeIndex);\n });\n const values = model.getValueInEditableRanges();\n const currentlyEditedRanges = {};\n for (let key in rangeMap) {\n const restriction = rangeMap[key];\n const range = restriction.range;\n const rangeString = restriction.label || range.toString();\n const value = values[rangeString];\n if (isChangeInvalidAsPerUser(restriction, value, range)) {\n setAllRangesToPrev(rangeMap);\n doUndo();\n return; // Breaks the loop and prevents the triggerChangeListener\n }\n currentlyEditedRanges[rangeString] = value;\n }\n if (model._hasHighlight) {\n model._oldDecorationsSource.forEach(function (object) {\n object.range = model.getDecorationRange(object.id);\n });\n }\n triggerChangeListenersWith(currentlyEditedRanges, values);\n } else {\n doUndo();\n }\n } else if (model.editInRestrictedArea) {\n model._isRestrictedValueValid = false;\n }\n });\n window.onerror = handleUnhandledPromiseRejection;\n const exposedApi = {\n editInRestrictedArea: false,\n getCurrentEditableRanges: getCurrentEditableRanges,\n getValueInEditableRanges: getValueInEditableRanges,\n disposeRestrictions: disposeRestrictions,\n onDidChangeContentInEditableRange: addEditableRangeListener,\n updateRestrictions: updateRestrictions,\n updateValueInEditableRanges: updateValueInEditableRanges,\n toggleHighlightOfEditableAreas: toggleHighlightOfEditableAreas\n }\n for (let funcName in manipulatorApi) {\n Object.defineProperty(model, funcName, {\n enumerable: false,\n configurable: true,\n writable: true,\n value: manipulatorApi[funcName]\n })\n }\n for (let apiName in exposedApi) {\n Object.defineProperty(model, apiName, {\n enumerable: false,\n configurable: true,\n writable: true,\n value: exposedApi[apiName]\n })\n }\n return model;\n}\nexport default constrainedModel;","import validators from './utils/validators.js';\nimport { TypeMustBe } from './utils/definedErrors.js';\nimport constrainedModel from './constrainedModel.js';\n\nexport function constrainedEditor(monaco) {\n /**\n * Injected Dependencies\n */\n if (monaco === undefined) {\n throw new Error([\n \"Please pass the monaco global variable into function as\",\n \"(eg:)constrainedEditor({ range : monaco.range });\",\n ].join('\\n'));\n }\n /**\n *\n * @param {Object} editorInstance This should be the monaco editor instance.\n * @description This is the listener function to check whether the cursor is at checkpoints\n * (i.e) the point where editable and non editable portions meet\n */\n const listenerFn = function (editorInstance) {\n const model = editorInstance.getModel();\n if (model._isCursorAtCheckPoint) {\n const selections = editorInstance.getSelections();\n const positions = selections.map(function (selection) {\n return {\n lineNumber: selection.positionLineNumber,\n column: selection.positionColumn\n }\n });\n model._isCursorAtCheckPoint(positions);\n model._currentCursorPositions = selections;\n }\n }\n const _uriRestrictionMap = {};\n const { isInstanceValid, isModelValid, isRangesValid } = validators.initWith(monaco);\n /**\n *\n * @param {Object} editorInstance This should be the monaco editor instance\n * @returns {Boolean}\n */\n const initInEditorInstance = function (editorInstance) {\n if (isInstanceValid(editorInstance)) {\n let domNode = editorInstance.getDomNode();\n manipulator._listener = listenerFn.bind(API, editorInstance);\n manipulator._editorInstance = editorInstance;\n manipulator._editorInstance._isInDevMode = false;\n domNode.addEventListener('keydown', manipulator._listener, true);\n manipulator._onChangeModelDisposable = editorInstance.onDidChangeModel(function () {\n // domNode - refers old dom node\n domNode && domNode.removeEventListener('keydown', manipulator._listener, true)\n const newDomNode = editorInstance.getDomNode(); // Gets Current dom node\n newDomNode && newDomNode.addEventListener('keydown', manipulator._listener, true);\n domNode = newDomNode;\n })\n return true;\n } else {\n throw new Error(\n TypeMustBe(\n 'ICodeEditor',\n 'editorInstance',\n 'This type interface can be found in monaco editor documentation'\n )\n )\n }\n }\n /**\n *\n * @param {Object} model This should be the monaco editor model instance. Refer https://microsoft.github.io/monaco-editor/api/interfaces/monaco.editor.itextmodel.html\n * @param {*} ranges This should be the array of range objects. Refer constrained editor plugin documentation\n * @returns model\n */\n const addRestrictionsTo = function (model, ranges) {\n if (isModelValid(model)) {\n if (isRangesValid(ranges)) {\n const modelToConstrain = constrainedModel(model, ranges, monaco, manipulator._editorInstance);\n _uriRestrictionMap[modelToConstrain.uri.toString()] = modelToConstrain;\n return modelToConstrain;\n } else {\n throw new Error(\n TypeMustBe(\n 'Array<RangeRestrictionObject>',\n 'ranges',\n 'Please refer constrained editor documentation for proper structure'\n )\n )\n }\n } else {\n throw new Error(\n TypeMustBe(\n 'ICodeEditor',\n 'editorInstance',\n 'This type interface can be found in monaco editor documentation'\n )\n )\n }\n }\n /**\n *\n * @param {Object} model This should be the monaco editor model instance. Refer https://microsoft.github.io/monaco-editor/api/interfaces/monaco.editor.itextmodel.html\n * @returns {Boolean} True if the restrictions are removed\n */\n const removeRestrictionsIn = function (model) {\n if (isModelValid(model)) {\n const uri = model.uri.toString();\n const restrictedModel = _uriRestrictionMap[uri];\n if (restrictedModel) {\n return restrictedModel.disposeRestrictions();\n } else {\n console.warn('Current Model is not a restricted Model');\n return false;\n }\n } else {\n throw new Error(\n TypeMustBe(\n 'ICodeEditor',\n 'editorInstance',\n 'This type interface can be found in monaco editor documentation'\n )\n )\n }\n }\n /**\n *\n * @returns {Boolean} True if the constrainer is disposed\n */\n const disposeConstrainer = function () {\n if (manipulator._editorInstance) {\n const instance = manipulator._editorInstance;\n const domNode = instance.getDomNode();\n domNode && domNode.removeEventListener('keydown', manipulator._listener);\n manipulator._onChangeModelDisposable && manipulator._onChangeModelDisposable.dispose();\n delete manipulator._listener;\n delete manipulator._editorInstance._isInDevMode;\n delete manipulator._editorInstance._devModeAction;\n delete manipulator._editorInstance;\n delete manipulator._onChangeModelDisposable;\n for (let key in _uriRestrictionMap) {\n delete _uriRestrictionMap[key];\n }\n return true;\n }\n return false;\n }\n /**\n * @description This function used to make the developer to find the ranges of selected portions\n */\n const toggleDevMode = function () {\n if (manipulator._editorInstance._isInDevMode) {\n manipulator._editorInstance._isInDevMode = false;\n manipulator._editorInstance._devModeAction.dispose();\n delete manipulator._editorInstance._devModeAction;\n } else {\n manipulator._editorInstance._isInDevMode = true;\n manipulator._editorInstance._devModeAction = manipulator._editorInstance.addAction({\n id: 'showRange',\n label: 'Show Range in console',\n contextMenuGroupId: 'navigation',\n contextMenuOrder: 1.5,\n run: function (editor) {\n const selections = editor.getSelections();\n const ranges = selections.reduce(function (acc, { startLineNumber, endLineNumber, startColumn, endColumn }) {\n acc.push('range : ' + JSON.stringify([\n startLineNumber,\n startColumn,\n endLineNumber,\n endColumn\n ]));\n return acc;\n }, []).join('\\n');\n console.log(`Selected Ranges : \\n` + JSON.stringify(ranges, null, 2));\n }\n });\n }\n }\n\n /**\n * Main Function starts here\n */\n // @internal\n const manipulator = {\n /**\n * These variables should not be modified by external code\n * This has to be used for debugging and testing\n */\n _listener: null,\n _editorInstance: null,\n _uriRestrictionMap: _uriRestrictionMap,\n _injectedResources: monaco\n }\n const API = Object.create(manipulator);\n const exposedMethods = {\n /**\n * These functions are exposed to the user\n * These functions should be protected from editing\n */\n initializeIn: initInEditorInstance,\n addRestrictionsTo: addRestrictionsTo,\n removeRestrictionsIn: removeRestrictionsIn,\n disposeConstrainer: disposeConstrainer,\n toggleDevMode: toggleDevMode\n }\n for (let methodName in exposedMethods) {\n Object.defineProperty(API, methodName, {\n enumerable: false,\n writable: false,\n configurable: false,\n value: exposedMethods[methodName]\n })\n }\n return Object.freeze(API);\n}\n\nexport default constrainedEditor;\n","import React, { useCallback, useEffect, useRef, useState } from 'react';\nimport { useTheme } from '../theme-provider';\nimport { constrainedEditor } from 'constrained-editor-plugin';\nimport MonacoEditor, { Monaco, DiffEditor } from '@monaco-editor/react';\nimport type { editor as MonacoEditorType } from 'monaco-editor';\nimport type { TextFile } from '../../lib/types';\nimport { type JsonEditorError } from '../../lib/json-types';\nimport { FORMAT } from '../../lib/env';\nimport { useDocumentsStore } from '../../store/documents-store-provider';\nimport { Button } from '../ui/button';\nimport { useEditorRefsStore } from '../../store/editor-refs-store';\nimport {\n getSelectionContext,\n createContextSnippet,\n} from '../../lib/monaco-selection-utils';\nimport { ValidationPanel, ValidationStatusBar } from './validation-panel';\nimport { monacoThemeFor, registerMonacoThemes } from '../../lib/monaco-theme';\n\n/** Ensure defaultPath matches the schema fileMatch pattern (*.FORMAT.theme.json) */\nfunction resolveThemeDefaultPath(name: string): string {\n const ext = `.${FORMAT}.theme.json`;\n if (name.endsWith(ext)) return name;\n const base = name\n .replace(/\\.\\w+\\.theme\\.json$/, '')\n .replace(/\\.theme\\.json$/, '')\n .replace(/\\.json$/, '');\n return base + ext;\n}\n\n/**\n * EditorMonacoTheme component for editing JSON theme files with schema validation\n */\nfunction EditorMonacoTheme({\n document,\n readOnly = false,\n onChange,\n}: {\n document: TextFile;\n readOnly?: boolean;\n onChange?: (value: string) => void;\n}) {\n const editorRef = useRef<MonacoEditorType.IStandaloneCodeEditor | null>(null);\n const monacoRef = useRef<Monaco | null>(null);\n const modelRef = useRef<MonacoEditorType.ITextModel | null>(null);\n const { theme } = useTheme();\n const [validationErrors, setValidationErrors] = useState<JsonEditorError[]>(\n []\n );\n const [showValidationPanel, setShowValidationPanel] = useState(true);\n const [isValidationPanelMinimized, setIsValidationPanelMinimized] =\n useState(false);\n const userDismissedRef = useRef(false);\n const pendingDiff = useDocumentsStore((s) => s.pendingDiffs[document.name]);\n const clearPendingDiff = useDocumentsStore((s) => s.clearPendingDiff);\n const saveDocument = useDocumentsStore((s) => s.saveDocument);\n const { registerEditor, unregisterEditor, setActiveEditor } =\n useEditorRefsStore();\n\n // Get resolved theme - convert 'system' to actual theme\n const resolvedTheme =\n theme === 'system'\n ? window.matchMedia('(prefers-color-scheme: dark)').matches\n ? 'dark'\n : 'light'\n : theme;\n\n // Initialize Monaco editor\n const handleEditorWillMount = useCallback((monaco: Monaco) => {\n monacoRef.current = monaco;\n // Idempotent; guards the case where an editor mounts before the global\n // configureMonaco() promise has resolved.\n registerMonacoThemes(monaco);\n // Don't call setDiagnosticsOptions here — it would clobber the global\n // config. The theme schema is already registered by configureMonacoInstance\n // and matched via defaultPath → fileMatch.\n }, []);\n\n // Handle editor mount\n const handleEditorMount = useCallback(\n (editor: MonacoEditorType.IStandaloneCodeEditor, monaco: Monaco) => {\n editorRef.current = editor;\n modelRef.current = editor.getModel();\n\n // Register editor in the refs store\n registerEditor(document.name, editor, monaco);\n setActiveEditor(document.name);\n\n // Enable constrained editing\n const constrainedInstance = constrainedEditor(monaco);\n const model = editor.getModel();\n if (model) {\n constrainedInstance.initializeIn(editor);\n }\n\n // Configure editor options\n editor.updateOptions({\n formatOnType: true,\n formatOnPaste: true,\n automaticLayout: true,\n minimap: { enabled: false },\n scrollBeyondLastLine: true,\n wordWrap: 'on',\n folding: true,\n foldingStrategy: 'indentation',\n suggest: {\n showColors: true,\n showConstants: true,\n showEnums: true,\n showFields: true,\n showFunctions: true,\n showKeywords: true,\n showModules: true,\n showProperties: true,\n showSnippets: true,\n showStructs: true,\n showTypeParameters: true,\n showUnits: true,\n showValues: true,\n showVariables: true,\n },\n });\n\n // Add keyboard shortcuts\n // Cmd+K => send selection to AI assistant\n editor.addCommand(monaco.KeyMod.CtrlCmd | monaco.KeyCode.KeyK, () => {\n const selection = getSelectionContext(editor, monaco);\n if (selection) {\n const snippet = createContextSnippet(selection);\n window.dispatchEvent(\n new CustomEvent('monaco-selection-to-ai', {\n detail: {\n documentName: document.name,\n selection,\n snippet,\n isTheme: true,\n },\n })\n );\n }\n });\n\n // Cmd+S => save command\n editor.addCommand(monaco.KeyMod.CtrlCmd | monaco.KeyCode.KeyS, () => {\n // Save command - parent component handles this\n console.log('Save command triggered in theme editor');\n });\n\n // Add context menu action for AI assistant\n editor.addAction({\n id: 'send-theme-to-ai-assistant',\n label: 'Send to AI Assistant (⌘K)',\n contextMenuGroupId: 'navigation',\n contextMenuOrder: 1.5,\n keybindings: [monaco.KeyMod.CtrlCmd | monaco.KeyCode.KeyK],\n run: function () {\n // Use the editor reference from closure instead of the parameter\n const selection = getSelectionContext(editor, monaco);\n if (selection) {\n const snippet = createContextSnippet(selection);\n // Dispatch event for the chat panel to capture\n window.dispatchEvent(\n new CustomEvent('monaco-selection-to-ai', {\n detail: {\n documentName: document.name,\n selection,\n snippet,\n isTheme: true,\n },\n })\n );\n }\n },\n });\n\n // Format document on mount\n setTimeout(() => {\n editor.getAction('editor.action.formatDocument')?.run();\n }, 100);\n\n console.log('Monaco theme editor mounted');\n },\n [document.name, registerEditor, setActiveEditor]\n );\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n unregisterEditor(document.name);\n };\n }, [document.name, unregisterEditor]);\n\n // Handle content changes\n const handleChange = useCallback(\n (\n value: string | undefined,\n _event: MonacoEditorType.IModelContentChangedEvent\n ) => {\n if (value !== undefined && onChange) {\n onChange(value);\n }\n },\n [onChange]\n );\n\n // Handle Monaco's built-in schema validation markers\n const handleEditorValidation = useCallback(\n (markers: MonacoEditorType.IMarker[]) => {\n const errors: JsonEditorError[] = markers.map((marker) => ({\n path: '',\n message: marker.message,\n code:\n typeof marker.code === 'string'\n ? marker.code\n : marker.code?.value || 'validation_error',\n startLineNumber: marker.startLineNumber,\n startColumn: marker.startColumn,\n endLineNumber: marker.endLineNumber,\n endColumn: marker.endColumn,\n severity:\n marker.severity >= 8\n ? 'error'\n : marker.severity >= 4\n ? 'warning'\n : 'info',\n }));\n\n setValidationErrors(errors);\n\n if (errors.length > 0 && !userDismissedRef.current) {\n setShowValidationPanel(true);\n setIsValidationPanelMinimized(false);\n }\n if (errors.length === 0) {\n userDismissedRef.current = false;\n }\n },\n []\n );\n\n const handleErrorClick = useCallback((error: JsonEditorError) => {\n if (editorRef.current && error.startLineNumber && error.startColumn) {\n editorRef.current.setPosition({\n lineNumber: error.startLineNumber,\n column: error.startColumn,\n });\n editorRef.current.revealLineInCenter(error.startLineNumber);\n editorRef.current.focus();\n }\n }, []);\n\n // Update theme\n useEffect(() => {\n if (editorRef.current) {\n editorRef.current.updateOptions({ theme: monacoThemeFor(resolvedTheme) });\n }\n }, [resolvedTheme]);\n\n return (\n <div className=\"relative h-full\">\n {pendingDiff ? (\n <>\n <div className=\"flex items-center justify-between px-2 py-1 border-b bg-muted/40 text-xs\">\n <div>\n Review changes for{' '}\n <span className=\"font-medium\">{document.name}</span>\n </div>\n <div className=\"flex gap-2\">\n <Button\n variant=\"secondary\"\n size=\"sm\"\n onClick={() => clearPendingDiff(document.name)}\n >\n Discard\n </Button>\n <Button\n size=\"sm\"\n onClick={() => {\n saveDocument(document.name, pendingDiff.modified);\n clearPendingDiff(document.name, true);\n }}\n >\n Apply Changes\n </Button>\n </div>\n </div>\n <DiffEditor\n height=\"calc(100% - 32px)\"\n original={pendingDiff.original}\n modified={pendingDiff.modified}\n language=\"json\"\n theme={monacoThemeFor(resolvedTheme)}\n options={{\n readOnly: true,\n renderSideBySide: true,\n originalEditable: false,\n automaticLayout: true,\n minimap: { enabled: false },\n }}\n beforeMount={handleEditorWillMount}\n />\n </>\n ) : (\n <MonacoEditor\n height=\"100%\"\n language=\"json\"\n defaultPath={resolveThemeDefaultPath(document.name)}\n value={document.text}\n theme={monacoThemeFor(resolvedTheme)}\n onChange={handleChange}\n beforeMount={handleEditorWillMount}\n onMount={handleEditorMount}\n onValidate={handleEditorValidation}\n options={{\n readOnly,\n lineNumbers: 'on',\n glyphMargin: true,\n folding: true,\n lineDecorationsWidth: 5,\n lineNumbersMinChars: 3,\n renderValidationDecorations: 'on',\n quickSuggestions: {\n other: true,\n comments: false,\n strings: true,\n },\n acceptSuggestionOnCommitCharacter: true,\n acceptSuggestionOnEnter: 'on',\n accessibilitySupport: 'auto',\n autoIndent: 'advanced',\n formatOnType: true,\n formatOnPaste: true,\n automaticLayout: true,\n minimap: { enabled: false },\n scrollBeyondLastLine: true,\n wordWrap: 'on',\n }}\n />\n )}\n\n {/* Validation Status Bar */}\n <div className=\"absolute top-0 right-0\">\n <ValidationStatusBar\n errors={validationErrors}\n onClick={() => {\n setShowValidationPanel(true);\n setIsValidationPanelMinimized(false);\n }}\n />\n </div>\n\n {/* Validation Panel */}\n {showValidationPanel && validationErrors.length > 0 && (\n <ValidationPanel\n errors={validationErrors}\n isMinimized={isValidationPanelMinimized}\n onToggleMinimize={() =>\n setIsValidationPanelMinimized(!isValidationPanelMinimized)\n }\n onErrorClick={handleErrorClick}\n onClose={() => {\n setShowValidationPanel(false);\n userDismissedRef.current = true;\n }}\n className=\"z-40\"\n />\n )}\n </div>\n );\n}\n\nexport const EditorMonacoThemeMemoized = React.memo(EditorMonacoTheme);\n","import React from 'react';\nimport { EditorMonacoJsonMemoized } from '../json-editor/editor-monaco-json';\nimport { EditorMonacoThemeMemoized } from '../json-editor/editor-monaco-theme';\nimport { TabsContent } from '../ui/tabs';\nimport { useDocumentsStore } from '../../store/documents-store-provider';\nimport { useThemesStore } from '../../store/themes-store-provider';\nimport type { TextFile } from '../../lib/types';\nimport type { DocumentType } from '../../store/documents-store';\nimport debounce from 'lodash.debounce';\n\nfunction TabContent({\n name,\n text,\n buildError: _buildError,\n saveDocumentDebounceWait,\n documentType,\n}: {\n name: string;\n text: string;\n buildError?: string;\n saveDocumentDebounceWait: number;\n documentType: DocumentType;\n}) {\n const { saveDocument } = useDocumentsStore((state) => state);\n const { updateTheme } = useThemesStore((state) => state);\n\n // Create a debounced version of updateTheme\n const debouncedUpdateTheme = React.useMemo(\n () => debounce(updateTheme, saveDocumentDebounceWait),\n [updateTheme, saveDocumentDebounceWait]\n );\n\n // Flush pending theme updates on unmount so the themes store is always\n // up-to-date when the user switches away from a theme tab.\n React.useEffect(() => {\n return () => {\n debouncedUpdateTheme.flush();\n };\n }, [debouncedUpdateTheme]);\n\n const handleChange = React.useCallback(\n (value: string) => {\n saveDocument(name, value);\n\n // If this is a theme document, update the themes store with debouncing\n if (documentType === 'application/json+theme') {\n console.log(\n 'TabContent: Theme document change detected, debouncing update',\n {\n documentName: name,\n debounceWait: saveDocumentDebounceWait,\n }\n );\n debouncedUpdateTheme(name, value);\n }\n },\n [\n name,\n saveDocument,\n debouncedUpdateTheme,\n documentType,\n saveDocumentDebounceWait,\n ]\n );\n\n // Create a fake document object for the theme editor\n const document: TextFile = React.useMemo(\n () => ({\n name,\n type: 'application/json',\n text,\n mtime: new Date(),\n ctime: new Date(),\n atime: new Date(),\n }),\n [name, text]\n );\n\n return (\n <TabsContent\n value={name}\n className=\"mt-0 h-full p-0\"\n tabIndex={-1} // to prevent focus on Tab trigger (fix for accessibility size issue)\n >\n {documentType === 'application/json+theme' ? (\n <EditorMonacoThemeMemoized\n document={document}\n onChange={handleChange}\n />\n ) : (\n <EditorMonacoJsonMemoized\n name={name}\n value={text}\n saveDocumentDebounceWait={saveDocumentDebounceWait}\n />\n )}\n </TabsContent>\n );\n}\n\nconst TabContentMemoized = React.memo(TabContent);\n\nfunction EditorTabsContent({\n openTabs,\n documents,\n buildErrors,\n saveDocumentDebounceWait,\n}: {\n openTabs: string[];\n documents: TextFile[];\n buildErrors: Record<string, string>;\n saveDocumentDebounceWait: number;\n}) {\n const { documentTypes } = useDocumentsStore((state) => state);\n\n return openTabs\n .map((name) => documents.find((d) => d.name === name))\n .filter((doc): doc is TextFile => doc !== undefined)\n .map((doc) => {\n const documentType = documentTypes[doc.name] || 'application/json+report';\n\n return (\n <TabContentMemoized\n key={doc.name}\n name={doc.name}\n text={doc.text}\n buildError={buildErrors[doc.name]}\n saveDocumentDebounceWait={saveDocumentDebounceWait}\n documentType={documentType}\n />\n );\n });\n}\n\nexport const EditorTabsContentMemoized = React.memo(EditorTabsContent);\n","export interface RetryOptions {\n maxRetries?: number;\n initialDelay?: number;\n maxDelay?: number;\n backoffFactor?: number;\n onRetry?: (error: Error, attempt: number) => void;\n shouldRetry?: (error: Error) => boolean;\n signal?: AbortSignal;\n}\n\nexport class RetryError extends Error {\n constructor(\n message: string,\n public readonly lastError: Error,\n public readonly attempts: number\n ) {\n super(message);\n this.name = 'RetryError';\n }\n}\n\n/**\n * Retry a function with exponential backoff\n */\nexport async function retry<T>(\n fn: () => Promise<T>,\n options: RetryOptions = {}\n): Promise<T> {\n const {\n maxRetries = 3,\n initialDelay = 1000,\n maxDelay = 30000,\n backoffFactor = 2,\n onRetry,\n shouldRetry = () => true,\n signal,\n } = options;\n\n let lastError: Error;\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n // Check if operation was cancelled\n if (signal?.aborted) {\n throw new Error('Operation cancelled');\n }\n\n return await fn();\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n\n // Don't retry if it's the last attempt\n if (attempt === maxRetries) {\n break;\n }\n\n // Check if we should retry this error\n if (!shouldRetry(lastError)) {\n throw lastError;\n }\n\n // Calculate delay with exponential backoff\n const delay = Math.min(\n initialDelay * Math.pow(backoffFactor, attempt),\n maxDelay\n );\n\n // Add some jitter to prevent thundering herd\n const jitteredDelay = delay * (0.5 + Math.random() * 0.5);\n\n // Call retry callback if provided\n if (onRetry) {\n onRetry(lastError, attempt + 1);\n }\n\n // Wait before retrying\n await new Promise((resolve) => {\n const timeoutId = setTimeout(resolve, jitteredDelay);\n\n // Clean up timeout if cancelled\n if (signal) {\n signal.addEventListener(\n 'abort',\n () => {\n clearTimeout(timeoutId);\n resolve(undefined);\n },\n { once: true }\n );\n }\n });\n }\n }\n\n throw new RetryError(\n `Failed after ${maxRetries + 1} attempts`,\n lastError!,\n maxRetries + 1\n );\n}\n\n/**\n * Retry decorator for class methods\n */\nexport function Retryable(options: RetryOptions = {}) {\n return function (\n _target: any,\n _propertyKey: string,\n descriptor: PropertyDescriptor\n ) {\n const originalMethod = descriptor.value;\n\n descriptor.value = async function (...args: any[]) {\n return retry(() => originalMethod.apply(this, args), options);\n };\n\n return descriptor;\n };\n}\n\n/**\n * Common retry strategies\n */\nexport const RetryStrategies = {\n // Retry on network errors\n networkErrors: (error: Error) => {\n const networkErrorPatterns = [\n 'NetworkError',\n 'Failed to fetch',\n 'ERR_NETWORK',\n 'ECONNREFUSED',\n 'ETIMEDOUT',\n 'ENOTFOUND',\n 'fetch failed',\n ];\n\n return networkErrorPatterns.some(\n (pattern) =>\n error.message.includes(pattern) || error.name.includes(pattern)\n );\n },\n\n // Retry on specific HTTP status codes\n httpStatusCodes: (statusCodes: number[]) => (error: any) => {\n if (error.response?.status) {\n return statusCodes.includes(error.response.status);\n }\n return false;\n },\n\n // Retry on temporary errors\n temporaryErrors: (error: Error) => {\n const temporaryPatterns = [\n 'EBUSY',\n 'EAGAIN',\n 'temporarily unavailable',\n 'too many requests',\n 'rate limit',\n ];\n\n return temporaryPatterns.some((pattern) =>\n error.message.toLowerCase().includes(pattern.toLowerCase())\n );\n },\n\n // Combine multiple strategies\n combine:\n (...strategies: ((error: Error) => boolean)[]) =>\n (error: Error) => {\n return strategies.some((strategy) => strategy(error));\n },\n};\n","import {\n useEffect,\n useCallback,\n useRef,\n useMemo,\n memo,\n useContext,\n} from 'react';\nimport { EditorTabsContentMemoized } from './editor-tabs-content';\nimport { Tabs } from '../ui/tabs';\nimport {\n useDocumentsStore,\n DocumentsStoreContext,\n} from '../../store/documents-store-provider';\nimport {\n useOutputStore,\n OutputStoreContext,\n} from '../../store/output-store-provider';\nimport { useSettingsStore } from '../../store/settings-store-provider';\nimport { useEditorRefsStore } from '../../store/editor-refs-store';\nimport {\n useThemesStore,\n ThemesStoreContext,\n} from '../../store/themes-store-provider';\nimport { usePresentationGenerator } from '../../hooks/usePresentationGenerator';\nimport { retry, RetryStrategies } from '../../utils/retry';\nimport { themeChangeEmitter } from '../../utils/theme-change-emitter';\nimport { useShallow } from 'zustand/react/shallow';\n\ninterface BuildRequest {\n id: string;\n docName: string;\n doc: any;\n signal: AbortSignal;\n timestamp: number;\n}\n\nfunction EditorComponent() {\n const setOutput = useOutputStore((state) => state.setOutput);\n const outputStore = useContext(OutputStoreContext)!;\n const documentsStore = useContext(DocumentsStoreContext)!;\n const themesStore = useContext(ThemesStoreContext)!;\n const saveDocumentDebounceWait = useSettingsStore(\n (state) => state.saveDocumentDebounceWait\n );\n const {\n openTabs,\n activeTab,\n setActiveTab,\n documents,\n buildErrors,\n setBuildError,\n documentTypes,\n } = useDocumentsStore(\n useShallow((state) => ({\n openTabs: state.openTabs,\n activeTab: state.activeTab,\n setActiveTab: state.setActiveTab,\n documents: state.documents,\n buildErrors: state.buildErrors,\n setBuildError: state.setBuildError,\n documentTypes: state.documentTypes,\n }))\n );\n const { customThemes } = useThemesStore(\n useShallow((state) => ({ customThemes: state.customThemes }))\n );\n const { generatePresentation, cancelGeneration } = usePresentationGenerator();\n\n // Refs to track ongoing operations and prevent race conditions\n const buildAbortControllersRef = useRef<Map<string, AbortController>>(\n new Map()\n );\n const buildTimeoutsRef = useRef<Map<string, NodeJS.Timeout>>(new Map());\n // Debounce timer for Run-button builds (150ms to coalesce rapid clicks).\n const flushBuildTimerRef = useRef<NodeJS.Timeout | null>(null);\n const lastBuildRequestIdRef = useRef<string>('');\n const documentVersionsRef = useRef<Map<string, number>>(new Map());\n\n // User-initiated cancel from the loading UI: invalidate the current request\n // id first (so both build paths take their quiet \"cancelled\" exit instead of\n // surfacing a global error), then abort the controllers and the in-flight\n // fetch.\n const cancelActiveBuild = useCallback(() => {\n lastBuildRequestIdRef.current = `cancelled-${Date.now()}`;\n // Also drop queued debounced builds — without this, a pending auto-build\n // timer could start a new generation right after the user cancelled.\n for (const timeout of buildTimeoutsRef.current.values()) {\n clearTimeout(timeout);\n }\n buildTimeoutsRef.current.clear();\n if (flushBuildTimerRef.current) {\n clearTimeout(flushBuildTimerRef.current);\n flushBuildTimerRef.current = null;\n }\n for (const controller of buildAbortControllersRef.current.values()) {\n controller.abort();\n }\n buildAbortControllersRef.current.clear();\n cancelGeneration();\n setOutput({\n isGenerating: false,\n generationProgress: undefined,\n generationStartedAt: undefined,\n });\n }, [cancelGeneration, setOutput]);\n\n useEffect(() => {\n setOutput({ cancelGeneration: cancelActiveBuild });\n }, [cancelActiveBuild, setOutput]);\n\n // Get or create a document version number\n const getDocumentVersion = useCallback((docName: string) => {\n const currentVersion = documentVersionsRef.current.get(docName) || 0;\n const newVersion = currentVersion + 1;\n documentVersionsRef.current.set(docName, newVersion);\n return newVersion;\n }, []);\n\n // Prepare valid custom themes with deep comparison\n const customThemesContentHash = useMemo(() => {\n // Create a content hash of all themes to detect deep changes\n const themeData = Object.entries(customThemes).map(([key, theme]) => {\n // Handle lastModified that might be a string (from localStorage) or Date\n let lastModifiedTime = 0;\n if (theme.lastModified) {\n if (theme.lastModified instanceof Date) {\n lastModifiedTime = theme.lastModified.getTime();\n } else if (typeof theme.lastModified === 'string') {\n lastModifiedTime = new Date(theme.lastModified).getTime();\n }\n }\n\n return {\n key,\n name: theme.name,\n content: theme.content,\n valid: theme.valid,\n lastModified: lastModifiedTime,\n };\n });\n return JSON.stringify(themeData);\n }, [customThemes]);\n\n const validCustomThemes = useMemo(() => {\n const themes: { [key: string]: any } = {};\n Object.values(customThemes).forEach((theme) => {\n if (theme.valid && theme.parsed) {\n themes[theme.name] = theme.parsed;\n }\n });\n return themes;\n }, [customThemesContentHash]);\n\n // Helper function to get fresh theme data (bypasses memo)\n const getFreshThemeData = useCallback(() => {\n const freshThemes: { [key: string]: any } = {};\n const { customThemes } = themesStore.getState();\n Object.values(customThemes).forEach((theme) => {\n if (theme.valid && theme.parsed) {\n freshThemes[theme.name] = theme.parsed;\n }\n });\n return freshThemes;\n }, [themesStore]);\n\n // Helper function to build a document with proper cancellation and retry\n const buildDocument = useCallback(\n async (\n doc: any,\n signal?: AbortSignal,\n options?: { bypassCache?: boolean }\n ) => {\n if (!doc || !generatePresentation) {\n return;\n }\n\n // Cancel any existing build operation for this document\n const existingController = buildAbortControllersRef.current.get(doc.name);\n if (existingController) {\n existingController.abort();\n buildAbortControllersRef.current.delete(doc.name);\n }\n\n // Create new abort controller if not provided\n const abortController = signal ? null : new AbortController();\n const finalSignal = signal || abortController!.signal;\n if (abortController) {\n buildAbortControllersRef.current.set(doc.name, abortController);\n }\n\n // Create build request\n const requestId = `${doc.name}-${Date.now()}-${Math.random()}`;\n const version = getDocumentVersion(doc.name);\n lastBuildRequestIdRef.current = requestId;\n\n const buildRequest: BuildRequest = {\n id: requestId,\n docName: doc.name,\n doc,\n signal: finalSignal,\n timestamp: Date.now(),\n };\n\n await processBuildRequestRef.current(buildRequest, version, options);\n },\n [generatePresentation, setOutput, getDocumentVersion]\n );\n\n // Process a build request from the queue\n const processBuildRequest = useCallback(\n async (\n request: BuildRequest,\n version: number,\n options?: { bypassCache?: boolean }\n ) => {\n const { doc, signal, id } = request;\n\n // Check if this is still the latest request\n if (lastBuildRequestIdRef.current !== id) {\n console.log('Skipping outdated build request for:', doc.name);\n setOutput({\n isGenerating: false,\n generationProgress: undefined,\n generationStartedAt: undefined,\n });\n return;\n }\n\n setOutput({\n globalError: undefined,\n isGenerating: true,\n generationStartedAt: Date.now(),\n generationProgress: {\n stage: 'parsing',\n message: 'Validating JSON structure...',\n },\n });\n\n const onProgress = (\n stage: 'parsing' | 'building' | 'rendering' | 'finalizing',\n message?: string\n ) => {\n if (signal.aborted || lastBuildRequestIdRef.current !== id) return;\n\n // Check document version to ensure we're still building the latest\n const currentVersion = documentVersionsRef.current.get(doc.name) || 0;\n if (currentVersion !== version) {\n console.log('Document version changed, aborting build');\n signal.dispatchEvent(new Event('abort'));\n return;\n }\n\n setOutput({\n isGenerating: true,\n generationProgress: { stage, message },\n });\n };\n\n try {\n // Always get fresh theme data to ensure latest changes are applied\n const freshThemeData = getFreshThemeData();\n\n console.log('Editor: Using themes for document build', {\n docName: doc.name,\n freshThemeCount: Object.keys(freshThemeData).length,\n freshThemeNames: Object.keys(freshThemeData),\n memoizedCount: Object.keys(validCustomThemes).length,\n requestId: id,\n });\n\n // Retry logic for temporary failures\n const result = await retry(\n async () => {\n if (signal.aborted) throw new Error('Build cancelled');\n return await generatePresentation(\n doc.name,\n doc.text,\n freshThemeData,\n onProgress,\n options\n );\n },\n {\n maxRetries: 2,\n initialDelay: 500,\n shouldRetry: (error) => {\n // Don't retry on cancellation or syntax errors\n if (\n error.message.includes('cancelled') ||\n error.message.includes('JSON') ||\n error.message.includes('parse') ||\n error.message.includes('syntax')\n ) {\n return false;\n }\n // Retry on worker errors\n return RetryStrategies.combine(\n RetryStrategies.temporaryErrors,\n (e) =>\n e.message.includes('Worker') || e.message.includes('Proxy')\n )(error);\n },\n onRetry: (error, attempt) => {\n console.log(\n `Retrying presentation generation (attempt ${attempt}):`,\n error.message\n );\n setOutput({\n isGenerating: true,\n generationProgress: {\n stage: 'parsing',\n message: `Retrying generation (attempt ${attempt})...`,\n },\n });\n },\n signal,\n }\n );\n\n if (signal.aborted || lastBuildRequestIdRef.current !== id) {\n console.log('Build cancelled for:', doc.name);\n setOutput({\n isGenerating: false,\n generationProgress: undefined,\n generationStartedAt: undefined,\n });\n return;\n }\n\n if (\n result &&\n typeof result === 'object' &&\n 'name' in result &&\n 'text' in result &&\n 'blob' in result\n ) {\n console.log('Editor: Build completed', {\n docName: result.name,\n blobSize: (result.blob as Blob)?.size,\n timestamp: Date.now(),\n requestId: id,\n version,\n });\n\n setOutput({\n name: result.name as string,\n text: result.text as string,\n blob: result.blob as Blob,\n renderer: result.renderer as string | undefined,\n globalError: undefined,\n isGenerating: false,\n isPreviewStale: false,\n generationProgress: undefined,\n generationStartedAt: undefined,\n lastBuiltSequence: outputStore.getState().editSequence,\n cacheStatus: (result as any).cacheStatus as\n | 'HIT'\n | 'MISS'\n | 'UNKNOWN'\n | undefined,\n cacheHitRate: (result as any).cacheHitRate as string | undefined,\n warnings: (result as any).warnings as any,\n });\n setBuildError(result.name as string, undefined);\n }\n } catch (error) {\n if (signal.aborted || lastBuildRequestIdRef.current !== id) {\n console.log('Build cancelled with error for:', doc.name);\n setOutput({\n isGenerating: false,\n generationProgress: undefined,\n generationStartedAt: undefined,\n });\n return;\n }\n\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n\n setOutput({\n globalError: errorMessage,\n isGenerating: false,\n generationProgress: undefined,\n generationStartedAt: undefined,\n });\n\n setBuildError(doc.name, errorMessage);\n } finally {\n buildAbortControllersRef.current.delete(doc.name);\n }\n },\n [\n generatePresentation,\n getFreshThemeData,\n setOutput,\n setBuildError,\n outputStore,\n ]\n );\n const processBuildRequestRef = useRef(processBuildRequest);\n useEffect(() => {\n processBuildRequestRef.current = processBuildRequest;\n });\n\n // Track the last viewed document for theme updates\n const lastViewedDocumentRef = useRef<string | null>(null);\n\n // re-build on active tab change or any document change\n useEffect(() => {\n console.log('Editor: Document rebuild effect triggered', {\n activeTab,\n });\n\n const activeFile = documents.find((doc) => doc.name === activeTab);\n const docType = documentTypes[activeTab] || 'application/json+report';\n\n // Track last viewed document\n if (docType === 'application/json+report' && activeFile) {\n lastViewedDocumentRef.current = activeTab;\n }\n\n // Clear any pending build timeout for this document\n const existingTimeout = buildTimeoutsRef.current.get(activeTab);\n if (existingTimeout) {\n clearTimeout(existingTimeout);\n buildTimeoutsRef.current.delete(activeTab);\n }\n\n if (activeFile && docType === 'application/json+report') {\n // Editing marks the preview stale rather than rebuilding: a build costs\n // a LibreOffice conversion, so it waits for Run. Do not clobber a build\n // already in flight (e.g. one the Run button started).\n if (!outputStore.getState().isGenerating) {\n setOutput({ isPreviewStale: true });\n }\n } else if (activeFile && docType === 'application/json+theme') {\n // Theme tab active — no document preview to build.\n // Don't clear blob: preserve the last document preview in the background.\n cancelGeneration();\n }\n\n // Cleanup function to cancel pending operations\n return () => {\n const timeout = buildTimeoutsRef.current.get(activeTab);\n if (timeout) {\n clearTimeout(timeout);\n buildTimeoutsRef.current.delete(activeTab);\n }\n };\n }, [\n documents,\n activeTab,\n setOutput,\n documentTypes,\n buildDocument,\n cancelGeneration,\n ]);\n\n // Track which documents use which themes (only parse the active doc to avoid O(n) JSON.parse)\n const documentThemeDependencies = useMemo(() => {\n const deps = new Map<string, string>();\n const activeDoc = documents.find((d) => d.name === activeTab);\n if (\n activeDoc &&\n documentTypes[activeDoc.name] === 'application/json+report'\n ) {\n try {\n const parsed = JSON.parse(activeDoc.text);\n const themeName = parsed.props?.theme;\n if (typeof themeName === 'string') {\n const themeExists = Object.values(customThemes).some(\n (t) => t.name === themeName && t.valid\n );\n if (themeExists) {\n deps.set(activeDoc.name, themeName);\n }\n }\n } catch {\n // Ignore parse errors\n }\n }\n return deps;\n }, [activeTab, documents, documentTypes, customThemes]);\n\n // Listen for theme change events and force immediate rebuild\n useEffect(() => {\n console.log('Editor: Setting up theme change listener', {\n documentCount: documents.length,\n dependencyCount: documentThemeDependencies.size,\n dependencies: Array.from(documentThemeDependencies.entries()),\n customThemes: Object.entries(customThemes).map(([key, theme]) => ({\n key,\n name: theme.name,\n valid: theme.valid,\n })),\n });\n\n const unsubscribe = themeChangeEmitter.onThemeChange((event) => {\n console.log('Editor: Theme change detected', {\n event,\n dependencies: Array.from(documentThemeDependencies.entries()),\n activeTab,\n customThemes: Object.entries(customThemes).map(([key, theme]) => ({\n key,\n name: theme.name,\n valid: theme.valid,\n })),\n });\n\n // Find all documents that use this theme\n const documentsUsingTheme: any[] = [];\n\n documentThemeDependencies.forEach((themeName, docName) => {\n if (themeName === event.themeName) {\n const doc = documents.find((d) => d.name === docName);\n if (doc) {\n documentsUsingTheme.push(doc);\n }\n }\n });\n\n console.log('Editor: Documents using changed theme', {\n themeName: event.themeName,\n documentCount: documentsUsingTheme.length,\n documentNames: documentsUsingTheme.map((d) => d.name),\n });\n\n if (documentsUsingTheme.length === 0) {\n console.log('Editor: No documents use this theme, skipping rebuild');\n return;\n }\n\n // A theme change invalidates the preview of every document using it;\n // rebuilding is the author’s call, as it is for a document edit.\n if (!outputStore.getState().isGenerating) {\n setOutput({ isPreviewStale: true });\n }\n });\n\n return unsubscribe;\n }, [\n documentThemeDependencies,\n documents,\n buildDocument,\n getDocumentVersion,\n activeTab,\n setOutput,\n ]);\n\n // Flush debounces and immediately build — triggered by Run button via custom event\n // Debounced at 150ms to coalesce rapid clicks\n // Stable refs so the event handler never goes stale and doesn't need\n // reactive deps that would cause cleanup to cancel the pending timeout\n const buildDocumentRef = useRef(buildDocument);\n useEffect(() => {\n buildDocumentRef.current = buildDocument;\n });\n const getDocumentVersionRef = useRef(getDocumentVersion);\n useEffect(() => {\n getDocumentVersionRef.current = getDocumentVersion;\n });\n\n useEffect(() => {\n const handler = () => {\n // Mark generating early so the rebuild effect (triggered by saveDocument\n // below) doesn't clobber this build with isPreviewStale\n setOutput({ isGenerating: true });\n\n // 1. Flush Monaco debounce: read live text, save to store immediately\n let themeDirty = false;\n const editorRef = useEditorRefsStore.getState().getActiveEditor();\n if (editorRef) {\n // Don't flush if a pending diff is active — editor may be disposed\n const hasPendingDiff =\n documentsStore.getState().pendingDiffs[editorRef.documentName];\n if (!hasPendingDiff) {\n const liveText = editorRef.toStorageValue(\n editorRef.editor.getValue()\n );\n documentsStore\n .getState()\n .saveDocument(editorRef.documentName, liveText);\n }\n }\n\n // Flush all open theme editors whose live text differs from the\n // themes store so the build always uses up-to-date theme data.\n const { documents: allDocs, documentTypes: allDtypes } =\n documentsStore.getState();\n for (const doc of allDocs) {\n if (allDtypes[doc.name] === 'application/json+theme') {\n const ref = useEditorRefsStore.getState().getEditor(doc.name);\n if (ref) {\n const liveText = ref.toStorageValue(ref.editor.getValue());\n const existing = themesStore.getState().customThemes[doc.name];\n if (!existing || existing.content !== liveText) {\n themesStore.getState().updateTheme(doc.name, liveText);\n themeDirty = true;\n }\n }\n }\n }\n\n // 2. Cancel any pending build timeout for active doc\n const currentTab = documentsStore.getState().activeTab;\n const timeout = buildTimeoutsRef.current.get(currentTab);\n if (timeout) {\n clearTimeout(timeout);\n buildTimeoutsRef.current.delete(currentTab);\n }\n\n // 3. Debounce the actual build to coalesce rapid Run clicks\n if (flushBuildTimerRef.current) {\n clearTimeout(flushBuildTimerRef.current);\n }\n flushBuildTimerRef.current = setTimeout(() => {\n flushBuildTimerRef.current = null;\n const {\n documents: docs,\n activeTab: tab,\n documentTypes: dtypes,\n } = documentsStore.getState();\n\n // Determine target: if active tab is a theme, build the last-viewed document instead\n let targetName = tab;\n const tabType = dtypes[tab] || 'application/json+report';\n if (tabType === 'application/json+theme') {\n if (lastViewedDocumentRef.current) {\n targetName = lastViewedDocumentRef.current;\n } else {\n // No document was viewed yet — nothing to build\n setOutput({ isGenerating: false });\n return;\n }\n }\n\n const freshDoc = docs.find((d) => d.name === targetName);\n if (freshDoc) {\n // If a pending diff exists (AI suggestion), preview the modified version\n const pending = documentsStore.getState().pendingDiffs[targetName];\n const ref = useEditorRefsStore.getState().getEditor(targetName);\n const doc = pending\n ? { ...freshDoc, text: pending.modified }\n : ref\n ? { ...freshDoc, text: ref.toStorageValue(ref.editor.getValue()) }\n : freshDoc;\n getDocumentVersionRef.current(doc.name);\n // Bypass cache only when a theme was updated during this flush\n buildDocumentRef.current(\n doc,\n undefined,\n themeDirty ? { bypassCache: true } : undefined\n );\n } else {\n setOutput({ isGenerating: false });\n }\n }, 150);\n };\n\n window.addEventListener('preview:flushAndBuild', handler);\n return () => {\n window.removeEventListener('preview:flushAndBuild', handler);\n if (flushBuildTimerRef.current) {\n clearTimeout(flushBuildTimerRef.current);\n }\n };\n }, [setOutput, documentsStore, themesStore]);\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n // Cancel all pending builds\n buildAbortControllersRef.current.forEach((controller) =>\n controller.abort()\n );\n buildAbortControllersRef.current.clear();\n\n // Clear all timeouts\n buildTimeoutsRef.current.forEach((timeout) => clearTimeout(timeout));\n buildTimeoutsRef.current.clear();\n\n // Cancel any ongoing generation\n cancelGeneration();\n };\n }, [cancelGeneration]);\n\n if (!openTabs.length) {\n return (\n <div className=\"flex flex-col text-muted-foreground h-full items-center justify-center\">\n {!documents?.length ? 'Create a new document...' : 'Open a document...'}\n </div>\n );\n }\n\n return (\n <Tabs value={activeTab} onValueChange={setActiveTab} className=\"h-full\">\n {/* Tabs header removed to gain vertical space */}\n <EditorTabsContentMemoized\n openTabs={openTabs}\n documents={documents}\n buildErrors={buildErrors}\n saveDocumentDebounceWait={saveDocumentDebounceWait}\n />\n </Tabs>\n );\n}\n\n// Export memoized version of Editor component\nexport const Editor = memo(EditorComponent);\n"],"names":["validators","monaco","dummyDiv","dummyEditorInstance","editorInstanceConstructorName","editorModelConstructorName","valueToValidate","ranges","rangeObj","num","TypeMustBe","type","key","additional","deepClone","byPassPrimitives","value","callback","cloneArray","array","keys","arrayClone","i","cloner","object","clone","config","constructOptionForCode","options","acc","option","codes","methods","API","methodName","enums","constrainedModel","model","rangeConstructor","sortRangesInAscendingOrder","rangeObject1","rangeObject2","rangeA","rangeB","normalizeRange","range","content","lines","noOfLines","normalizedRange","index","actualStartCol","startLineNo","maxCols","actualEndLine","actualEndCol","endLineNo","restrictions","prepareRestrictions","restriction","startLine","startCol","endLine","endCol","getCurrentEditableRanges","getValueInEditableRanges","updateValueInEditableRanges","forceMoveMarkers","restrictionsMap","label","doesChangeHasMultilineConflict","newRange","isChangeInvalidAsPerUser","disposeRestrictions","handleUnhandledPromiseRejection","isCursorAtCheckPoint","positions","position","posLineNumber","posCol","length","addEditableRangeListener","triggerChangeListenersWith","currentChanges","allChanges","currentRanges","doUndo","updateRange","finalLine","finalColumn","changes","changeIndex","oldRangeEndLineNumber","oldRangeEndColumn","changesLength","diffInCol","diffInRow","cursorPositions","noOfCursorPositions","change","cursorPosition","nextRestriction","nextRange","nextChange","rangeInChange","rangeAsString","rangeMapValue","getInfoFrom","editableRange","info","updateRestrictions","toggleHighlightOfEditableAreas","cssClasses","cssClassForSingleLine","cssClassForMultiLine","decorations","decoration","setAllRangesToPrev","rangeMap","text","manipulatorApi","contentChangedEvent","isUndoing","editedRange","changedRange","noOfLinesAdded","noOfColsAddedAtLastLine","lineDiffInRange","colDiffInRange","columnsCarriedToEnd","values","currentlyEditedRanges","rangeString","exposedApi","funcName","apiName","constrainedEditor","listenerFn","editorInstance","selections","selection","_uriRestrictionMap","isInstanceValid","isModelValid","isRangesValid","initInEditorInstance","domNode","manipulator","newDomNode","addRestrictionsTo","modelToConstrain","removeRestrictionsIn","uri","restrictedModel","disposeConstrainer","toggleDevMode","editor","startLineNumber","endLineNumber","startColumn","endColumn","exposedMethods","resolveThemeDefaultPath","name","ext","FORMAT","EditorMonacoTheme","document","readOnly","onChange","editorRef","useRef","monacoRef","modelRef","theme","useTheme","validationErrors","setValidationErrors","useState","showValidationPanel","setShowValidationPanel","isValidationPanelMinimized","setIsValidationPanelMinimized","userDismissedRef","pendingDiff","useDocumentsStore","s","clearPendingDiff","saveDocument","registerEditor","unregisterEditor","setActiveEditor","useEditorRefsStore","resolvedTheme","handleEditorWillMount","useCallback","registerMonacoThemes","handleEditorMount","constrainedInstance","getSelectionContext","snippet","createContextSnippet","_a","useEffect","handleChange","_event","handleEditorValidation","markers","errors","marker","handleErrorClick","error","monacoThemeFor","jsxs","Fragment","jsx","Button","DiffEditor","MonacoEditor","ValidationStatusBar","ValidationPanel","EditorMonacoThemeMemoized","React","TabContent","_buildError","saveDocumentDebounceWait","documentType","state","updateTheme","useThemesStore","debouncedUpdateTheme","debounce","TabsContent","EditorMonacoJsonMemoized","TabContentMemoized","EditorTabsContent","openTabs","documents","buildErrors","documentTypes","d","doc","EditorTabsContentMemoized","RetryError","message","lastError","attempts","retry","fn","maxRetries","initialDelay","maxDelay","backoffFactor","onRetry","shouldRetry","signal","attempt","jitteredDelay","resolve","timeoutId","RetryStrategies","pattern","statusCodes","strategies","strategy","EditorComponent","setOutput","useOutputStore","outputStore","useContext","OutputStoreContext","documentsStore","DocumentsStoreContext","themesStore","ThemesStoreContext","useSettingsStore","activeTab","setActiveTab","setBuildError","useShallow","customThemes","generatePresentation","cancelGeneration","usePresentationGenerator","buildAbortControllersRef","buildTimeoutsRef","flushBuildTimerRef","lastBuildRequestIdRef","documentVersionsRef","cancelActiveBuild","timeout","controller","getDocumentVersion","docName","newVersion","customThemesContentHash","useMemo","themeData","lastModifiedTime","validCustomThemes","themes","getFreshThemeData","freshThemes","buildDocument","existingController","abortController","finalSignal","requestId","version","buildRequest","processBuildRequestRef","processBuildRequest","request","id","onProgress","stage","freshThemeData","result","e","errorMessage","lastViewedDocumentRef","activeFile","docType","existingTimeout","documentThemeDependencies","deps","activeDoc","themeName","t","themeChangeEmitter","event","documentsUsingTheme","buildDocumentRef","getDocumentVersionRef","handler","themeDirty","liveText","allDocs","allDtypes","ref","existing","currentTab","docs","tab","dtypes","targetName","freshDoc","pending","Tabs","Editor","memo"],"mappings":"mpBAAA,MAAMA,GAAa,CACjB,SAAU,SAAUC,EAAQ,CAC1B,MAAMC,EAAW,SAAS,cAAc,KAAK,EACvCC,EAAsBF,EAAO,OAAO,OAAOC,CAAQ,EACnDE,EAAgCD,EAAoB,YAAY,KAChEE,EAA6BF,EAAoB,SAAQ,EAAG,YAAY,KA+B9E,MAAO,CACL,gBA/BoB,SAAUG,EAAiB,CAC/C,OAAOA,EAAgB,YAAY,OAASF,CAC9C,EA8BE,aA7BiB,SAAUE,EAAiB,CAC5C,OAAOA,EAAgB,YAAY,OAASD,CAC9C,EA4BE,cA3BkB,SAAUE,EAAQ,CACpC,OAAI,MAAM,QAAQA,CAAM,EACfA,EAAO,MAAM,SAAUC,EAAU,CACtC,OAAI,OAAOA,GAAa,UAAYA,EAAS,YAAY,OAAS,SAC5D,GAACA,EAAS,eAAe,OAAO,GAChC,CAAC,MAAM,QAAQA,EAAS,KAAK,GAC7BA,EAAS,MAAM,SAAW,GAC1B,CAAEA,EAAS,MAAM,MAAMC,GAAOA,EAAM,GAAK,SAASA,CAAG,IAAMA,CAAG,GAC9DD,EAAS,eAAe,gBAAgB,GACtC,OAAOA,EAAS,gBAAmB,WAErCA,EAAS,eAAe,OAAO,GAC7B,OAAOA,EAAS,OAAU,UAE5BA,EAAS,eAAe,UAAU,GAChC,OAAOA,EAAS,UAAa,YAI9B,EACT,CAAC,EAEI,EACT,CAKJ,CACE,CACF,EC1CaE,EAAa,SAAUC,EAAMC,EAAKC,EAAY,CACzD,MAAO,qBAAuBD,EAAM,uBAAyB,MAAM,QAAQD,CAAI,EAAIA,EAAK,KAAK,KAAK,EAAIA,GAAQ,MAAQE,GAAc,GACtI,ECFaC,GAAa,UAAY,CACpC,MAAMC,EAAmB,SAAUC,EAAOC,EAAU,CAClD,OAAI,OAAOD,GAAU,UAAYA,IAAU,KAClC,KAAK,OAAS,OAAO,OAAOA,CAAK,EAAIA,EAE1CA,aAAiB,KACZ,KAAK,OAAS,OAAO,OAAO,IAAI,KAAKA,CAAK,CAAC,EAAI,IAAI,KAAKA,CAAK,EAE/DC,EAAS,KAAK,KAAMD,CAAK,CAClC,EACME,EAAa,SAAUC,EAAOF,EAAU,CAC5C,MAAMG,EAAO,OAAO,KAAKD,CAAK,EACxBE,EAAa,IAAI,MAAMD,EAAK,MAAM,EACxC,QAASE,EAAI,EAAGA,EAAIF,EAAK,OAAQE,IAC/BD,EAAWD,EAAKE,CAAC,CAAC,EAAIP,EAAiB,KAAK,KAAMI,EAAMC,EAAKE,CAAC,CAAC,EAAGL,CAAQ,EAE5E,OAAOI,CACT,EACME,EAAS,SAAUC,EAAQ,CAC/B,OAAOT,EAAiB,KAAK,KAAMS,EAAQ,SAAUA,EAAQ,CAC3D,GAAI,MAAM,QAAQA,CAAM,EACtB,OAAON,EAAW,KAAK,KAAMM,EAAQD,CAAM,EAE7C,MAAME,EAAQ,CAAA,EACd,QAASb,KAAOY,EACV,CAAC,KAAK,WAAa,OAAO,eAAe,KAAKA,EAAQZ,CAAG,IAAM,KAGnEa,EAAMb,CAAG,EAAIG,EAAiB,KAAK,KAAMS,EAAOZ,CAAG,EAAGW,CAAM,GAE9D,OAAOE,CACT,CAAC,CACH,EACMC,EAAU,UAAY,CAC1B,MAAMC,EAAyB,SAAUX,EAAO,CAC9C,MAAMY,EAAU,CACd,YACA,QACR,EACM,KAAKZ,CAAK,EAAIY,EAAQ,QAAO,SAAUC,EAAKC,EAAQ,CAClD,OAAID,EAAIC,CAAM,EAAKd,GAAS,KAAKc,CAAM,KACrCd,GAAS,KAAKc,CAAM,GAEfD,CACT,GAAE,KAAK,IAAI,EAAG,CAAA,CAAE,CAClB,EACME,EAAQ,OAAO,OAAO,OAAO,iBAAiB,CAAA,EAAI,CACtD,UAAW,CAAE,MAAO,CAAC,EACrB,OAAQ,CAAE,MAAO,CAAC,CACxB,CAAK,CAAC,EACF,QAAST,EAAI,EAAGA,GAAK,EAAGA,IACtBK,EAAuB,KAAKI,EAAOT,CAAC,EAEtC,OAAOS,CACT,IACMC,EAAU,CACd,UAAWT,EAAO,KAAKG,EAAO,CAAC,CAAC,EAChC,UAAWH,EAAO,KAAKG,EAAO,CAAC,CAAC,EAChC,mBAAoBH,EAAO,KAAKG,EAAO,CAAC,CAAC,CAC7C,EACQO,EAAMV,EAAO,KAAKG,EAAO,CAAC,CAAC,EACjC,QAASQ,KAAcF,EACrB,OAAO,eAAeC,EAAKC,EAAY,CACrC,WAAY,GACZ,SAAU,GACV,aAAc,GACd,MAAOF,EAAQE,CAAU,CAC/B,CAAK,EAEH,OAAOD,CACT,ICtEaE,GAAQ,CACnB,4BAA6B,4BAC7B,2BAA4B,0BAC9B,ECDaC,GAAmB,SAAUC,EAAO9B,EAAQN,EAAQ,CAC/D,MAAMqC,EAAmBrC,EAAO,MAC1BsC,EAA6B,SAAUC,EAAcC,EAAc,CACvE,MAAMC,EAASF,EAAa,MACtBG,EAASF,EAAa,MAC5B,GACEC,EAAO,CAAC,EAAIC,EAAO,CAAC,GACnBD,EAAO,CAAC,IAAMC,EAAO,CAAC,GAAKD,EAAO,CAAC,EAAIC,EAAO,CAAC,EAEhD,MAAO,EAEX,EACMC,EAAiB,SAAUC,EAAOC,EAAS,CAC/C,MAAMC,EAAQD,EAAQ,MAAM;AAAA,CAAI,EAC1BE,EAAYD,EAAM,OAClBE,EAAkB,CAAA,EACxB,OAAAJ,EAAM,QAAQ,SAAU7B,EAAOkC,EAAO,CACpC,GAAIlC,IAAU,EACZ,MAAM,IAAI,MAAM,6BAA6B,EAE/C,OAAQkC,EAAK,CACX,IAAK,GAAG,CACN,GAAIlC,EAAQ,EACV,MAAM,IAAI,MAAM,wCAAwC,EACnD,GAAIA,EAAQgC,EACjB,MAAM,IAAI,MAAM,uBAAyBhC,EAAQ,+CAAiDgC,CAAS,EAE7GC,EAAgBC,CAAK,EAAIlC,CAC3B,CACE,MACF,IAAK,GAAG,CACN,IAAImC,EAAiBnC,EACrB,MAAMoC,EAAcH,EAAgB,CAAC,EAC/BI,EAAUN,EAAMK,EAAc,CAAC,EAAE,OACvC,GAAID,EAAiB,GAEnB,GADAA,EAAiBE,EAAU,KAAK,IAAIF,CAAc,EAC9CA,EAAiB,EACnB,MAAM,IAAI,MAAM,yBAA2BnC,EAAQ,0CAA4CoC,EAAc,OAASC,CAAO,UAEtHF,EAAkBE,EAAU,EACrC,MAAM,IAAI,MAAM,yBAA2BrC,EAAQ,0CAA4CoC,EAAc,OAASC,CAAO,EAE/HJ,EAAgBC,CAAK,EAAIC,CAC3B,CACE,MACF,IAAK,GAAG,CACN,IAAIG,EAAgBtC,EACpB,GAAIsC,EAAgB,EAAG,CAErB,GADAA,EAAgBN,EAAY,KAAK,IAAIhC,CAAK,EACtCsC,EAAgB,EAClB,MAAM,IAAI,MAAM,qBAAuBtC,EAAQ,+CAAiDgC,CAAS,EAEvGM,EAAgBL,EAAgB,CAAC,GACnC,QAAQ,KAAK,qBAAuBjC,EAAQ,2EAA2E,CAE3H,SAAWA,EAAQgC,EACjB,MAAM,IAAI,MAAM,qBAAuBhC,EAAQ,+CAAiDgC,CAAS,EAE3GC,EAAgBC,CAAK,EAAII,CAC3B,CACE,MACF,IAAK,GAAG,CACN,IAAIC,EAAevC,EACnB,MAAMwC,EAAYP,EAAgB,CAAC,EAC7BI,EAAUN,EAAMS,EAAY,CAAC,EAAE,OACrC,GAAID,EAAe,GAEjB,GADAA,EAAeF,EAAU,KAAK,IAAIE,CAAY,EAC1CA,EAAe,EACjB,MAAM,IAAI,MAAM,uBAAyBvC,EAAQ,0CAA4CwC,EAAY,OAASH,CAAO,UAElHE,EAAgBF,EAAU,EACnC,MAAM,IAAI,MAAM,yBAA2BrC,EAAQ,0CAA4CwC,EAAY,OAASH,CAAO,EAE7HJ,EAAgBC,CAAK,EAAIK,CAC3B,CACE,KACV,CACI,CAAC,EACMN,CACT,EACA,IAAIQ,EAAe3C,GAAUP,CAAM,EAAE,KAAKgC,CAA0B,EACpE,MAAMmB,EAAsB,SAAUD,EAAc,CAClD,MAAMX,EAAUT,EAAM,SAAQ,EAC9BoB,EAAa,QAAQ,SAAUE,EAAaT,EAAO,CACjD,MAAML,EAAQD,EAAee,EAAY,MAAOb,CAAO,EACjDc,EAAYf,EAAM,CAAC,EACnBgB,EAAWhB,EAAM,CAAC,EAClBiB,EAAUjB,EAAM,CAAC,EACjBkB,EAASlB,EAAM,CAAC,EACtBc,EAAY,eAAiBd,EAAM,MAAK,EACxCc,EAAY,MAAQ,IAAIrB,EAAiBsB,EAAWC,EAAUC,EAASC,CAAM,EAC7EJ,EAAY,MAAQT,EACfS,EAAY,iBACfA,EAAY,eAAiBrB,EAAiB,mBAAmBqB,EAAY,KAAK,GAE/EA,EAAY,QACfA,EAAY,MAAQ,IAAIC,CAAS,IAAIC,CAAQ,OAAOC,CAAO,GAAGC,CAAM,IAExE,CAAC,CACH,EACMC,EAA2B,UAAY,CAC3C,OAAOP,EAAa,OAAO,SAAU5B,EAAK8B,EAAa,CACrD,OAAA9B,EAAI8B,EAAY,KAAK,EAAI,CACvB,eAAgBA,EAAY,gBAAkB,GAC9C,MAAOA,EAAY,MACnB,MAAO,OAAO,OAAO,CAAA,EAAIA,EAAY,KAAK,EAC1C,cAAeA,EAAY,eAAe,MAAK,CACvD,EACa9B,CACT,EAAG,CAAA,CAAE,CACP,EACMoC,EAA2B,UAAY,CAC3C,OAAOR,EAAa,OAAO,SAAU5B,EAAK8B,EAAa,CACrD,OAAA9B,EAAI8B,EAAY,KAAK,EAAItB,EAAM,gBAAgBsB,EAAY,KAAK,EACzD9B,CACT,EAAG,CAAA,CAAE,CACP,EACMqC,EAA8B,SAAU1C,EAAQ2C,EAAkB,CACtE,GAAI,OAAO3C,GAAW,UAAY,CAAC,MAAM,QAAQA,CAAM,EAAG,CACxD2C,EAAmB,OAAOA,GAAqB,UAAYA,EAAmB,GAC9E,MAAMC,EAAkBX,EAAa,OAAO,SAAU5B,EAAK8B,EAAa,CACtE,OAAIA,EAAY,QACd9B,EAAI8B,EAAY,KAAK,EAAIA,GAEpB9B,CACT,EAAG,CAAA,CAAE,EACL,QAASwC,KAAS7C,EAAQ,CACxB,MAAMmC,EAAcS,EAAgBC,CAAK,EACzC,GAAIV,EAAa,CACf,MAAM3C,EAAQQ,EAAO6C,CAAK,EAC1B,GAAIC,EAA+BX,EAAa3C,CAAK,EACnD,MAAM,IAAI,MAAM,uCAAyCqD,CAAK,EAEhE,MAAME,EAAWzD,GAAU6C,EAAY,KAAK,EAG5C,GAFAY,EAAS,QAAUA,EAAS,UAAYvD,EAAM,MAAM;AAAA,CAAI,EAAE,OAAS,EACnEuD,EAAS,UAAYvD,EAAM,MAAM;AAAA,CAAI,EAAE,IAAG,EAAG,OACzCwD,EAAyBb,EAAa3C,EAAOuD,CAAQ,EACvD,MAAM,IAAI,MAAM,iDAAmDF,CAAK,EAE1EhC,EAAM,WAAW,CAAC,CAChB,iBAAkB,CAAC,CAAC8B,EACpB,MAAOR,EAAY,MACnB,KAAM3C,CAClB,CAAW,CAAC,CACJ,MACE,QAAQ,MAAM,4BAA8BqD,CAAK,CAErD,CACF,KACE,OAAM,IAAI,MAAM,yBAAyB,CAE7C,EACMI,EAAsB,UAAY,CACtC,OAAApC,EAAM,2BAA2B,QAAO,EACxC,OAAO,oBAAoB,QAASqC,CAA+B,EACnE,OAAOrC,EAAM,qBACb,OAAOA,EAAM,oBACb,OAAOA,EAAM,yBACb,OAAOA,EAAM,4BACb,OAAOA,EAAM,mBACb,OAAOA,EAAM,yBACb,OAAOA,EAAM,+BACb,OAAOA,EAAM,cACb,OAAOA,EAAM,mBACb,OAAOA,EAAM,sBACb,OAAOA,EAAM,wBACb,OAAOA,EAAM,6BACb,OAAOA,EAAM,2BACb,OAAOA,EAAM,gBACb,OAAOA,EAAM,sBACNA,CACT,EACMsC,EAAuB,SAAUC,EAAW,CAChDA,EAAU,KAAK,SAAUC,EAAU,CACjC,MAAMC,EAAgBD,EAAS,WACzBE,EAASF,EAAS,OAClBG,EAASvB,EAAa,OAC5B,QAASnC,EAAI,EAAGA,EAAI0D,EAAQ1D,IAAK,CAC/B,MAAMuB,EAAQY,EAAanC,CAAC,EAAE,MAC9B,GACGuB,EAAM,kBAAoBiC,GAAiBjC,EAAM,cAAgBkC,GACjElC,EAAM,gBAAkBiC,GAAiBjC,EAAM,YAAckC,EAE9D,OAAA1C,EAAM,iBAAgB,EACf,EAEX,CACF,CAAC,CACH,EACM4C,EAA2B,SAAUhE,EAAU,CAC/C,OAAOA,GAAa,YACtBoB,EAAM,6BAA6B,KAAKpB,CAAQ,CAEpD,EACMiE,EAA6B,SAAUC,EAAgBC,EAAY,CACvE,MAAMC,EAAgBrB,EAAwB,EAC9C3B,EAAM,6BAA6B,QAAQ,SAAUpB,EAAU,CAC7DA,EAAS,KAAKoB,EAAO8C,EAAgBC,EAAYC,CAAa,CAChE,CAAC,CACH,EACMC,EAAS,UAAY,CACzB,OAAO,QAAQ,UAAU,KAAK,UAAY,CACxCjD,EAAM,qBAAuB,GAC7BA,EAAM,KAAI,EACVA,EAAM,qBAAuB,GACzBA,EAAM,eAAiBA,EAAM,wBAG/BA,EAAM,iBAAiBA,EAAM,gBAAiBA,EAAM,qBAAqB,EACzEA,EAAM,sBAAsB,QAAQ,SAAUb,EAAQ,CACpDA,EAAO,MAAQa,EAAM,mBAAmBb,EAAO,EAAE,CACnD,CAAC,EAEL,CAAC,CACH,EACM+D,EAAc,SAAU5B,EAAad,EAAO2C,EAAWC,EAAaC,EAASC,EAAa,CAC9F,IAAIC,EAAwB/C,EAAM,cAC9BgD,EAAoBhD,EAAM,UAC9Bc,EAAY,UAAYd,EACxBc,EAAY,MAAQd,EAAM,eAAe2C,EAAWC,CAAW,EAC/D,MAAMT,EAASvB,EAAa,OAC5B,IAAIqC,EAAgBJ,EAAQ,OAC5B,MAAMK,EAAYN,EAAcI,EAC1BG,EAAYR,EAAYI,EAExBK,EAAkB5D,EAAM,yBAA2B,CAAA,EACnD6D,EAAsBD,EAAgB,OAoB5C,GAlBIH,IAAkBI,IACpBR,EAAUA,EAAQ,OAAO,SAAUS,EAAQ,CACzC,MAAMtD,EAAQsD,EAAO,MACrB,QAAS7E,EAAI,EAAGA,EAAI4E,EAAqB5E,IAAK,CAC5C,MAAM8E,EAAiBH,EAAgB3E,CAAC,EACxC,GACGuB,EAAM,kBAAoBuD,EAAe,iBACzCvD,EAAM,gBAAkBuD,EAAe,eACvCvD,EAAM,cAAgBuD,EAAe,aACrCvD,EAAM,YAAcuD,EAAe,UAEpC,MAAO,EAEX,CACA,MAAO,EACT,CAAC,EACDN,EAAgBJ,EAAQ,QAEtBM,IAAc,EAAG,CACnB,QAAS1E,EAAIqC,EAAY,MAAQ,EAAGrC,EAAI0D,EAAQ1D,IAAK,CACnD,MAAM+E,EAAkB5C,EAAanC,CAAC,EAChCgF,EAAYD,EAAgB,MAC9BT,IAA0BU,EAAU,kBACtCA,EAAU,aAAeP,GAEvBH,IAA0BU,EAAU,gBACtCA,EAAU,WAAaP,GAEzBO,EAAU,iBAAmBN,EAC7BM,EAAU,eAAiBN,EAC3BK,EAAgB,MAAQC,CAC1B,CACA,QAAShF,EAAIqE,EAAc,EAAGrE,EAAIwE,EAAexE,IAAK,CACpD,MAAMiF,EAAab,EAAQpE,CAAC,EACtBkF,EAAgBD,EAAW,MAC3BE,EAAgBD,EAAc,SAAQ,EACtCE,EAAgB,SAASD,CAAa,EAC5C,OAAO,SAASA,CAAa,EACzBb,IAA0BY,EAAc,kBAC1CA,EAAc,aAAeT,GAE3BH,IAA0BY,EAAc,gBAC1CA,EAAc,WAAaT,GAE7BS,EAAc,iBAAmBR,EACjCQ,EAAc,eAAiBR,EAC/BO,EAAW,MAAQC,EACnB,SAASA,EAAc,SAAQ,CAAE,EAAIE,CACvC,CACF,KAAO,CAEL,QAASpF,EAAIqC,EAAY,MAAQ,EAAGrC,EAAI0D,EAAQ1D,IAAK,CACnD,MAAM+E,EAAkB5C,EAAanC,CAAC,EAChCgF,EAAYD,EAAgB,MAClC,GAAIC,EAAU,gBAAkBV,EAC9B,MAEAU,EAAU,aAAeP,EACzBO,EAAU,WAAaP,EACvBM,EAAgB,MAAQC,CAE5B,CACA,QAAShF,EAAIqE,EAAc,EAAGrE,EAAIwE,EAAexE,IAAK,CAEpD,MAAMiF,EAAab,EAAQpE,CAAC,EACtBkF,EAAgBD,EAAW,MAC3BE,EAAgBD,EAAc,SAAQ,EACtCE,EAAgB,SAASD,CAAa,EAE5C,GADA,OAAO,SAASA,CAAa,EACzBD,EAAc,gBAAkBZ,EAAuB,CACzD,SAASY,EAAc,SAAQ,CAAE,EAAIE,EACrC,KACF,MACEF,EAAc,aAAeT,EAC7BS,EAAc,WAAaT,EAC3BQ,EAAW,MAAQC,EACnB,SAASA,EAAc,SAAQ,CAAE,EAAIE,CAEzC,CACF,CAEF,EACMC,EAAc,SAAUR,EAAQS,EAAe,CACnD,MAAMC,EAAO,CAAA,EACPhE,EAAQsD,EAAO,MAErB,OAAIA,EAAO,OAAS,GAClBU,EAAK,WAAa,GAEjBhE,EAAM,kBAAoBA,EAAM,eAChCA,EAAM,cAAgBA,EAAM,UAE7BgE,EAAK,WAAa,GAElBA,EAAK,cAAgB,GAGvBA,EAAK,iBAAmBhE,EAAM,kBAAoB+D,EAAc,gBAChEC,EAAK,mBAAqBhE,EAAM,cAAgB+D,EAAc,YAE9DC,EAAK,eAAiBhE,EAAM,gBAAkB+D,EAAc,cAC5DC,EAAK,iBAAmBhE,EAAM,YAAc+D,EAAc,UAE1DC,EAAK,kBAAoB,CAACA,EAAK,kBAAoB,CAACA,EAAK,eAGrDD,EAAc,kBAAoBA,EAAc,cAClDC,EAAK,kBAAoB,GAEzBA,EAAK,iBAAmB,GAEnBA,CACT,EACMC,EAAqB,SAAUvG,EAAQ,CAC3CkD,EAAe3C,GAAUP,CAAM,EAAE,KAAKgC,CAA0B,EAChEmB,EAAoBD,CAAY,CAClC,EACMsD,EAAiC,SAAUC,EAAY,CAC3D,GAAK3E,EAAM,cAuBTA,EAAM,iBAAiBA,EAAM,gBAAiB,CAAA,CAAE,EAChD,OAAOA,EAAM,gBACb,OAAOA,EAAM,sBACbA,EAAM,cAAgB,OA1BE,CACxB,MAAM4E,EAAwBD,EAAW,uBAAwB7E,GAAM,4BACjE+E,EAAuBF,EAAW,sBAAuB7E,GAAM,2BAC/DgF,EAAc1D,EAAa,IAAI,SAAUE,EAAa,CAC1D,MAAMyD,EAAa,CACjB,MAAOzD,EAAY,MACnB,QAAS,CACP,UAAWA,EAAY,eACrBuD,EACAD,CACd,CACA,EACQ,OAAItD,EAAY,QACdyD,EAAW,aAAezD,EAAY,OAEjCyD,CACT,CAAC,EACD/E,EAAM,gBAAkBA,EAAM,iBAAiB,CAAA,EAAI8E,CAAW,EAC9D9E,EAAM,sBAAwB8E,EAAY,IAAI,SAAUC,EAAYlE,EAAO,CACzE,OAAO,OAAO,OAAO,CAAA,EAAIkE,EAAY,CAAE,GAAI/E,EAAM,gBAAgBa,CAAK,EAAG,CAC3E,CAAC,EACDb,EAAM,cAAgB,EACxB,CAMF,EACMqC,EAAkC,UAAY,CAClD,QAAQ,MAAM,yCAAyC,CACzD,EACM2C,EAAqB,SAAUC,EAAU,CAC7C,QAAS1G,KAAO0G,EAAU,CACxB,MAAM3D,EAAc2D,EAAS1G,CAAG,EAChC+C,EAAY,MAAQA,EAAY,SAClC,CACF,EACMW,EAAiC,SAAUX,EAAa4D,EAAM,CAClE,MAAO,CAAC5D,EAAY,gBAAkB4D,EAAK,SAAS;AAAA,CAAI,CAC1D,EACM/C,EAA2B,SAAUb,EAAa3C,EAAO6B,EAAO,CACpE,OAAOc,EAAY,UAAY,CAACA,EAAY,SAAS3C,EAAO6B,EAAOc,EAAY,QAAQ,CACzF,EAEM6D,EAAiB,CACrB,mBAAoB,GACpB,wBAAyB,GACzB,6BAA8B,CAAA,EAC9B,sBAAuB7C,EACvB,wBAAyB,CAAA,CAC7B,EAEEjB,EAAoBD,CAAY,EAChCpB,EAAM,cAAgB,GACtBmF,EAAe,2BAA6BnF,EAAM,mBAAmB,SAAUoF,EAAqB,CAClG,MAAMC,EAAYD,EAAoB,UAEtC,GADApF,EAAM,wBAA0B,GAC1BqF,GAAarF,EAAM,qBA0HdA,EAAM,uBACfA,EAAM,wBAA0B,QA3Hc,CAC9C,MAAMqD,EAAU+B,EAAoB,QAAQ,KAAKlF,CAA0B,EACrE+E,EAAW,CAAA,EACXtC,EAASvB,EAAa,OAkB5B,GAjB0BiC,EAAQ,MAAM,SAAUS,EAAQ,CACxD,MAAMwB,EAAcxB,EAAO,MACrBM,EAAgBkB,EAAY,SAAQ,EAC1CL,EAASb,CAAa,EAAI,KAC1B,QAASnF,EAAI,EAAGA,EAAI0D,EAAQ1D,IAAK,CAC/B,MAAMqC,EAAcF,EAAanC,CAAC,EAElC,GADcqC,EAAY,MAChB,cAAcgE,CAAW,EACjC,OAAIrD,EAA+BX,EAAawC,EAAO,IAAI,EAClD,IAETmB,EAASb,CAAa,EAAI9C,EACnB,GAEX,CACA,MAAO,EACT,CAAC,EACsB,CACrB+B,EAAQ,QAAQ,SAAUS,EAAQR,EAAa,CAC7C,MAAMiC,EAAezB,EAAO,MACtBxC,EAAc2D,EAASM,EAAa,SAAQ,CAAE,EAC9ChB,EAAgBjD,EAAY,MAC5B4D,EAAOpB,EAAO,MAAQ,GAQtB0B,GAAkBN,EAAK,MAAM,KAAK,GAAK,CAAA,GAAI,OAC3CO,EAA0BP,EAAK,MAAM,KAAK,EAAE,IAAG,EAAG,OAElDQ,EAAkBH,EAAa,cAAgBA,EAAa,gBAC5DI,EAAiBJ,EAAa,UAAYA,EAAa,YAE7D,IAAIpC,EAAYoB,EAAc,cAC1BnB,EAAcmB,EAAc,UAE5BqB,EAAsB,GAEvBrB,EAAc,gBAAkBgB,EAAa,iBAC7ChB,EAAc,gBAAkBgB,EAAa,iBAE9CK,GAAwBrB,EAAc,UAAYgB,EAAa,YAAe,GAGhF,MAAMf,EAAOF,EAAYR,EAAQS,CAAa,EAC9CjD,EAAY,SAAWkD,GACnBA,EAAK,YAAcA,EAAK,iBACtBA,EAAK,oBAKHgB,IAAmB,EACrBpC,GAAeqC,GAEftC,GAAaqC,EACThB,EAAK,mBACPpB,GAAeqC,EACNjB,EAAK,iBACdpB,EAAeqC,EAA0B,EAEzCrC,EAAeqC,EAA0BG,IAI3CpB,EAAK,mBAEPrB,GAAaqC,EACThB,EAAK,iBACHgB,IAAmB,EACrBpC,GAAeqC,EAEfrC,EAAewC,EAAsBH,MAKzCjB,EAAK,YAAcA,EAAK,iBACtBA,EAAK,oBACPpB,GAAeuC,GAEbnB,EAAK,mBACHA,EAAK,gBACPrB,GAAauC,EACbtC,GAAeuC,GAEfxC,GAAauC,IAInBxC,EAAY5B,EAAaiD,EAAepB,EAAWC,EAAaC,EAASC,CAAW,CACtF,CAAC,EACD,MAAMuC,EAAS7F,EAAM,yBAAwB,EACvC8F,EAAwB,CAAA,EAC9B,QAASvH,KAAO0G,EAAU,CACxB,MAAM3D,EAAc2D,EAAS1G,CAAG,EAC1BiC,EAAQc,EAAY,MACpByE,EAAczE,EAAY,OAASd,EAAM,SAAQ,EACjD7B,EAAQkH,EAAOE,CAAW,EAChC,GAAI5D,EAAyBb,EAAa3C,EAAO6B,CAAK,EAAG,CACvDwE,EAAmBC,CAAQ,EAC3BhC,EAAM,EACN,MACF,CACA6C,EAAsBC,CAAW,EAAIpH,CACvC,CACIqB,EAAM,eACRA,EAAM,sBAAsB,QAAQ,SAAUb,EAAQ,CACpDA,EAAO,MAAQa,EAAM,mBAAmBb,EAAO,EAAE,CACnD,CAAC,EAEH0D,EAA2BiD,EAAuBD,CAAM,CAC1D,MACE5C,EAAM,CAEV,CAGF,CAAC,EACD,OAAO,QAAUZ,EACjB,MAAM2D,EAAa,CACjB,qBAAsB,GACtB,yBAA0BrE,EAC1B,yBAA0BC,EAC1B,oBAAqBQ,EACrB,kCAAmCQ,EACnC,mBAAoB6B,EACpB,4BAA6B5C,EAC7B,+BAAgC6C,CACpC,EACE,QAASuB,KAAYd,EACnB,OAAO,eAAenF,EAAOiG,EAAU,CACrC,WAAY,GACZ,aAAc,GACd,SAAU,GACV,MAAOd,EAAec,CAAQ,CACpC,CAAK,EAEH,QAASC,KAAWF,EAClB,OAAO,eAAehG,EAAOkG,EAAS,CACpC,WAAY,GACZ,aAAc,GACd,SAAU,GACV,MAAOF,EAAWE,CAAO,CAC/B,CAAK,EAEH,OAAOlG,CACT,EC5iBO,SAASmG,GAAkBvI,EAAQ,CAIxC,GAAIA,IAAW,OACb,MAAM,IAAI,MAAM,CACd,0DACA,mDACN,EAAM,KAAK;AAAA,CAAI,CAAC,EAQd,MAAMwI,EAAa,SAAUC,EAAgB,CAC3C,MAAMrG,EAAQqG,EAAe,SAAQ,EACrC,GAAIrG,EAAM,sBAAuB,CAC/B,MAAMsG,EAAaD,EAAe,cAAa,EACzC9D,EAAY+D,EAAW,IAAI,SAAUC,EAAW,CACpD,MAAO,CACL,WAAYA,EAAU,mBACtB,OAAQA,EAAU,cAC5B,CACM,CAAC,EACDvG,EAAM,sBAAsBuC,CAAS,EACrCvC,EAAM,wBAA0BsG,CAClC,CACF,EACME,EAAqB,CAAA,EACrB,CAAE,gBAAAC,EAAiB,aAAAC,EAAc,cAAAC,CAAa,EAAKhJ,GAAW,SAASC,CAAM,EAM7EgJ,EAAuB,SAAUP,EAAgB,CACrD,GAAII,EAAgBJ,CAAc,EAAG,CACnC,IAAIQ,EAAUR,EAAe,WAAU,EACvC,OAAAS,EAAY,UAAYV,EAAW,KAAKxG,EAAKyG,CAAc,EAC3DS,EAAY,gBAAkBT,EAC9BS,EAAY,gBAAgB,aAAe,GAC3CD,EAAQ,iBAAiB,UAAWC,EAAY,UAAW,EAAI,EAC/DA,EAAY,yBAA2BT,EAAe,iBAAiB,UAAY,CAEjFQ,GAAWA,EAAQ,oBAAoB,UAAWC,EAAY,UAAW,EAAI,EAC7E,MAAMC,EAAaV,EAAe,aAClCU,GAAcA,EAAW,iBAAiB,UAAWD,EAAY,UAAW,EAAI,EAChFD,EAAUE,CACZ,CAAC,EACM,EACT,KACE,OAAM,IAAI,MACR1I,EACE,cACA,iBACA,iEACV,CACA,CAEE,EAOM2I,EAAoB,SAAUhH,EAAO9B,EAAQ,CACjD,GAAIwI,EAAa1G,CAAK,EACpB,GAAI2G,EAAczI,CAAM,EAAG,CACzB,MAAM+I,EAAmBlH,GAAiBC,EAAO9B,EAAQN,CAAmC,EAC5F,OAAA4I,EAAmBS,EAAiB,IAAI,SAAQ,CAAE,EAAIA,EAC/CA,CACT,KACE,OAAM,IAAI,MACR5I,EACE,gCACA,SACA,oEACZ,CACA,MAGM,OAAM,IAAI,MACRA,EACE,cACA,iBACA,iEACV,CACA,CAEE,EAMM6I,EAAuB,SAAUlH,EAAO,CAC5C,GAAI0G,EAAa1G,CAAK,EAAG,CACvB,MAAMmH,EAAMnH,EAAM,IAAI,SAAQ,EACxBoH,EAAkBZ,EAAmBW,CAAG,EAC9C,OAAIC,EACKA,EAAgB,oBAAmB,GAE1C,QAAQ,KAAK,yCAAyC,EAC/C,GAEX,KACE,OAAM,IAAI,MACR/I,EACE,cACA,iBACA,iEACV,CACA,CAEE,EAKMgJ,EAAqB,UAAY,CACrC,GAAIP,EAAY,gBAAiB,CAE/B,MAAMD,EADWC,EAAY,gBACJ,WAAU,EACnCD,GAAWA,EAAQ,oBAAoB,UAAWC,EAAY,SAAS,EACvEA,EAAY,0BAA4BA,EAAY,yBAAyB,QAAO,EACpF,OAAOA,EAAY,UACnB,OAAOA,EAAY,gBAAgB,aACnC,OAAOA,EAAY,gBAAgB,eACnC,OAAOA,EAAY,gBACnB,OAAOA,EAAY,yBACnB,QAASvI,KAAOiI,EACd,OAAOA,EAAmBjI,CAAG,EAE/B,MAAO,EACT,CACA,MAAO,EACT,EAIM+I,EAAgB,UAAY,CAC5BR,EAAY,gBAAgB,cAC9BA,EAAY,gBAAgB,aAAe,GAC3CA,EAAY,gBAAgB,eAAe,QAAO,EAClD,OAAOA,EAAY,gBAAgB,iBAEnCA,EAAY,gBAAgB,aAAe,GAC3CA,EAAY,gBAAgB,eAAiBA,EAAY,gBAAgB,UAAU,CACjF,GAAI,YACJ,MAAO,wBACP,mBAAoB,aACpB,iBAAkB,IAClB,IAAK,SAAUS,EAAQ,CAErB,MAAMrJ,EADaqJ,EAAO,cAAa,EACb,OAAO,SAAU/H,EAAK,CAAE,gBAAAgI,EAAiB,cAAAC,EAAe,YAAAC,EAAa,UAAAC,GAAa,CAC1G,OAAAnI,EAAI,KAAK,WAAa,KAAK,UAAU,CACnCgI,EACAE,EACAD,EACAE,CACd,CAAa,CAAC,EACKnI,CACT,EAAG,CAAA,CAAE,EAAE,KAAK;AAAA,CAAI,EAChB,QAAQ,IAAI;AAAA,EAAyB,KAAK,UAAUtB,EAAQ,KAAM,CAAC,CAAC,CACtE,CACR,CAAO,EAEL,EAMM4I,EAAc,CAKlB,UAAW,KACX,gBAAiB,KACjB,mBAAoBN,EACpB,mBAAoB5I,CACxB,EACQgC,EAAM,OAAO,OAAOkH,CAAW,EAC/Bc,EAAiB,CAKrB,aAAchB,EACd,kBAAmBI,EACnB,qBAAsBE,EACtB,mBAAoBG,EACpB,cAAeC,CACnB,EACE,QAASzH,KAAc+H,EACrB,OAAO,eAAehI,EAAKC,EAAY,CACrC,WAAY,GACZ,SAAU,GACV,aAAc,GACd,MAAO+H,EAAe/H,CAAU,CACtC,CAAK,EAEH,OAAO,OAAO,OAAOD,CAAG,CAC1B,CChMA,SAASiI,GAAwBC,EAAsB,CACrD,MAAMC,EAAM,IAAIC,EAAM,cACtB,OAAIF,EAAK,SAASC,CAAG,EAAUD,EAClBA,EACV,QAAQ,sBAAuB,EAAE,EACjC,QAAQ,iBAAkB,EAAE,EAC5B,QAAQ,UAAW,EAAE,EACVC,CAChB,CAKA,SAASE,GAAkB,CACzB,SAAAC,EACA,SAAAC,EAAW,GACX,SAAAC,CACF,EAIG,CACD,MAAMC,EAAYC,EAAAA,OAAsD,IAAI,EACtEC,EAAYD,EAAAA,OAAsB,IAAI,EACtCE,EAAWF,EAAAA,OAA2C,IAAI,EAC1D,CAAE,MAAAG,CAAA,EAAUC,GAAA,EACZ,CAACC,EAAkBC,CAAmB,EAAIC,EAAAA,SAC9C,CAAA,CAAC,EAEG,CAACC,EAAqBC,CAAsB,EAAIF,EAAAA,SAAS,EAAI,EAC7D,CAACG,EAA4BC,CAA6B,EAC9DJ,EAAAA,SAAS,EAAK,EACVK,EAAmBZ,EAAAA,OAAO,EAAK,EAC/Ba,EAAcC,EAAmBC,GAAMA,EAAE,aAAanB,EAAS,IAAI,CAAC,EACpEoB,EAAmBF,EAAmBC,GAAMA,EAAE,gBAAgB,EAC9DE,EAAeH,EAAmBC,GAAMA,EAAE,YAAY,EACtD,CAAE,eAAAG,EAAgB,iBAAAC,EAAkB,gBAAAC,CAAA,EACxCC,EAAA,EAGIC,EACJnB,IAAU,SACN,OAAO,WAAW,8BAA8B,EAAE,QAChD,OACA,QACFA,EAGAoB,EAAwBC,cAAalM,GAAmB,CAC5D2K,EAAU,QAAU3K,EAGpBmM,GAAqBnM,CAAM,CAI7B,EAAG,CAAA,CAAE,EAGCoM,EAAoBF,EAAAA,YACxB,CAACvC,EAAgD3J,IAAmB,CAClEyK,EAAU,QAAUd,EACpBiB,EAAS,QAAUjB,EAAO,SAAA,EAG1BiC,EAAetB,EAAS,KAAMX,EAAQ3J,CAAM,EAC5C8L,EAAgBxB,EAAS,IAAI,EAG7B,MAAM+B,EAAsB9D,GAAkBvI,CAAM,EACtC2J,EAAO,SAAA,GAEnB0C,EAAoB,aAAa1C,CAAM,EAIzCA,EAAO,cAAc,CACnB,aAAc,GACd,cAAe,GACf,gBAAiB,GACjB,QAAS,CAAE,QAAS,EAAA,EACpB,qBAAsB,GACtB,SAAU,KACV,QAAS,GACT,gBAAiB,cACjB,QAAS,CACP,WAAY,GACZ,cAAe,GACf,UAAW,GACX,WAAY,GACZ,cAAe,GACf,aAAc,GACd,YAAa,GACb,eAAgB,GAChB,aAAc,GACd,YAAa,GACb,mBAAoB,GACpB,UAAW,GACX,WAAY,GACZ,cAAe,EAAA,CACjB,CACD,EAIDA,EAAO,WAAW3J,EAAO,OAAO,QAAUA,EAAO,QAAQ,KAAM,IAAM,CACnE,MAAM2I,EAAY2D,GAAoB3C,EAAQ3J,CAAM,EACpD,GAAI2I,EAAW,CACb,MAAM4D,EAAUC,GAAqB7D,CAAS,EAC9C,OAAO,cACL,IAAI,YAAY,yBAA0B,CACxC,OAAQ,CACN,aAAc2B,EAAS,KACvB,UAAA3B,EACA,QAAA4D,EACA,QAAS,EAAA,CACX,CACD,CAAA,CAEL,CACF,CAAC,EAGD5C,EAAO,WAAW3J,EAAO,OAAO,QAAUA,EAAO,QAAQ,KAAM,IAAM,CAEnE,QAAQ,IAAI,wCAAwC,CACtD,CAAC,EAGD2J,EAAO,UAAU,CACf,GAAI,6BACJ,MAAO,4BACP,mBAAoB,aACpB,iBAAkB,IAClB,YAAa,CAAC3J,EAAO,OAAO,QAAUA,EAAO,QAAQ,IAAI,EACzD,IAAK,UAAY,CAEf,MAAM2I,EAAY2D,GAAoB3C,EAAQ3J,CAAM,EACpD,GAAI2I,EAAW,CACb,MAAM4D,EAAUC,GAAqB7D,CAAS,EAE9C,OAAO,cACL,IAAI,YAAY,yBAA0B,CACxC,OAAQ,CACN,aAAc2B,EAAS,KACvB,UAAA3B,EACA,QAAA4D,EACA,QAAS,EAAA,CACX,CACD,CAAA,CAEL,CACF,CAAA,CACD,EAGD,WAAW,IAAM,QACfE,EAAA9C,EAAO,UAAU,8BAA8B,IAA/C,MAAA8C,EAAkD,KACpD,EAAG,GAAG,EAEN,QAAQ,IAAI,6BAA6B,CAC3C,EACA,CAACnC,EAAS,KAAMsB,EAAgBE,CAAe,CAAA,EAIjDY,EAAAA,UAAU,IACD,IAAM,CACXb,EAAiBvB,EAAS,IAAI,CAChC,EACC,CAACA,EAAS,KAAMuB,CAAgB,CAAC,EAGpC,MAAMc,EAAeT,EAAAA,YACnB,CACEnL,EACA6L,IACG,CACC7L,IAAU,QAAayJ,GACzBA,EAASzJ,CAAK,CAElB,EACA,CAACyJ,CAAQ,CAAA,EAILqC,EAAyBX,EAAAA,YAC5BY,GAAwC,CACvC,MAAMC,EAA4BD,EAAQ,IAAKE,GAAA,OAAY,OACzD,KAAM,GACN,QAASA,EAAO,QAChB,KACE,OAAOA,EAAO,MAAS,SACnBA,EAAO,OACPP,EAAAO,EAAO,OAAP,YAAAP,EAAa,QAAS,mBAC5B,gBAAiBO,EAAO,gBACxB,YAAaA,EAAO,YACpB,cAAeA,EAAO,cACtB,UAAWA,EAAO,UAClB,SACEA,EAAO,UAAY,EACf,QACAA,EAAO,UAAY,EACjB,UACA,MAAA,EACR,EAEFhC,EAAoB+B,CAAM,EAEtBA,EAAO,OAAS,GAAK,CAACzB,EAAiB,UACzCH,EAAuB,EAAI,EAC3BE,EAA8B,EAAK,GAEjC0B,EAAO,SAAW,IACpBzB,EAAiB,QAAU,GAE/B,EACA,CAAA,CAAC,EAGG2B,EAAmBf,cAAagB,GAA2B,CAC3DzC,EAAU,SAAWyC,EAAM,iBAAmBA,EAAM,cACtDzC,EAAU,QAAQ,YAAY,CAC5B,WAAYyC,EAAM,gBAClB,OAAQA,EAAM,WAAA,CACf,EACDzC,EAAU,QAAQ,mBAAmByC,EAAM,eAAe,EAC1DzC,EAAU,QAAQ,MAAA,EAEtB,EAAG,CAAA,CAAE,EAGLiC,OAAAA,EAAAA,UAAU,IAAM,CACVjC,EAAU,SACZA,EAAU,QAAQ,cAAc,CAAE,MAAO0C,GAAenB,CAAa,EAAG,CAE5E,EAAG,CAACA,CAAa,CAAC,EAGhBoB,EAAAA,KAAC,MAAA,CAAI,UAAU,kBACZ,SAAA,CAAA7B,EACC6B,EAAAA,KAAAC,WAAA,CACE,SAAA,CAAAD,EAAAA,KAAC,MAAA,CAAI,UAAU,2EACb,SAAA,CAAAA,OAAC,MAAA,CAAI,SAAA,CAAA,qBACgB,IACnBE,EAAAA,IAAC,OAAA,CAAK,UAAU,cAAe,WAAS,IAAA,CAAK,CAAA,EAC/C,EACAF,EAAAA,KAAC,MAAA,CAAI,UAAU,aACb,SAAA,CAAAE,EAAAA,IAACC,GAAA,CACC,QAAQ,YACR,KAAK,KACL,QAAS,IAAM7B,EAAiBpB,EAAS,IAAI,EAC9C,SAAA,SAAA,CAAA,EAGDgD,EAAAA,IAACC,GAAA,CACC,KAAK,KACL,QAAS,IAAM,CACb5B,EAAarB,EAAS,KAAMiB,EAAY,QAAQ,EAChDG,EAAiBpB,EAAS,KAAM,EAAI,CACtC,EACD,SAAA,eAAA,CAAA,CAED,CAAA,CACF,CAAA,EACF,EACAgD,EAAAA,IAACE,GAAA,CACC,OAAO,oBACP,SAAUjC,EAAY,SACtB,SAAUA,EAAY,SACtB,SAAS,OACT,MAAO4B,GAAenB,CAAa,EACnC,QAAS,CACP,SAAU,GACV,iBAAkB,GAClB,iBAAkB,GAClB,gBAAiB,GACjB,QAAS,CAAE,QAAS,EAAA,CAAM,EAE5B,YAAaC,CAAA,CAAA,CACf,CAAA,CACF,EAEAqB,EAAAA,IAACG,GAAA,CACC,OAAO,OACP,SAAS,OACT,YAAaxD,GAAwBK,EAAS,IAAI,EAClD,MAAOA,EAAS,KAChB,MAAO6C,GAAenB,CAAa,EACnC,SAAUW,EACV,YAAaV,EACb,QAASG,EACT,WAAYS,EACZ,QAAS,CACP,SAAAtC,EACA,YAAa,KACb,YAAa,GACb,QAAS,GACT,qBAAsB,EACtB,oBAAqB,EACrB,4BAA6B,KAC7B,iBAAkB,CAChB,MAAO,GACP,SAAU,GACV,QAAS,EAAA,EAEX,kCAAmC,GACnC,wBAAyB,KACzB,qBAAsB,OACtB,WAAY,WACZ,aAAc,GACd,cAAe,GACf,gBAAiB,GACjB,QAAS,CAAE,QAAS,EAAA,EACpB,qBAAsB,GACtB,SAAU,IAAA,CACZ,CAAA,EAKJ+C,EAAAA,IAAC,MAAA,CAAI,UAAU,yBACb,SAAAA,EAAAA,IAACI,GAAA,CACC,OAAQ3C,EACR,QAAS,IAAM,CACbI,EAAuB,EAAI,EAC3BE,EAA8B,EAAK,CACrC,CAAA,CAAA,EAEJ,EAGCH,GAAuBH,EAAiB,OAAS,GAChDuC,EAAAA,IAACK,GAAA,CACC,OAAQ5C,EACR,YAAaK,EACb,iBAAkB,IAChBC,EAA8B,CAACD,CAA0B,EAE3D,aAAc6B,EACd,QAAS,IAAM,CACb9B,EAAuB,EAAK,EAC5BG,EAAiB,QAAU,EAC7B,EACA,UAAU,MAAA,CAAA,CACZ,EAEJ,CAEJ,CAEO,MAAMsC,GAA4BC,EAAM,KAAKxD,EAAiB,ECxWrE,SAASyD,GAAW,CAClB,KAAA5D,EACA,KAAA5C,EACA,WAAYyG,EACZ,yBAAAC,EACA,aAAAC,CACF,EAMG,CACD,KAAM,CAAE,aAAAtC,CAAA,EAAiBH,EAAmB0C,GAAUA,CAAK,EACrD,CAAE,YAAAC,CAAA,EAAgBC,GAAgBF,GAAUA,CAAK,EAGjDG,EAAuBR,EAAM,QACjC,IAAMS,GAASH,EAAaH,CAAwB,EACpD,CAACG,EAAaH,CAAwB,CAAA,EAKxCH,EAAM,UAAU,IACP,IAAM,CACXQ,EAAqB,MAAA,CACvB,EACC,CAACA,CAAoB,CAAC,EAEzB,MAAM1B,EAAekB,EAAM,YACxB9M,GAAkB,CACjB4K,EAAazB,EAAMnJ,CAAK,EAGpBkN,IAAiB,2BACnB,QAAQ,IACN,gEACA,CACE,aAAc/D,EACd,aAAc8D,CAAA,CAChB,EAEFK,EAAqBnE,EAAMnJ,CAAK,EAEpC,EACA,CACEmJ,EACAyB,EACA0C,EACAJ,EACAD,CAAA,CACF,EAII1D,EAAqBuD,EAAM,QAC/B,KAAO,CACL,KAAA3D,EACA,KAAM,mBACN,KAAA5C,EACA,UAAW,KACX,UAAW,KACX,UAAW,IAAK,GAElB,CAAC4C,EAAM5C,CAAI,CAAA,EAGb,OACEgG,EAAAA,IAACiB,GAAA,CACC,MAAOrE,EACP,UAAU,kBACV,SAAU,GAET,aAAiB,yBAChBoD,EAAAA,IAACM,GAAA,CACC,SAAAtD,EACA,SAAUqC,CAAA,CAAA,EAGZW,EAAAA,IAACkB,GAAA,CACC,KAAAtE,EACA,MAAO5C,EACP,yBAAA0G,CAAA,CAAA,CACF,CAAA,CAIR,CAEA,MAAMS,GAAqBZ,EAAM,KAAKC,EAAU,EAEhD,SAASY,GAAkB,CACzB,SAAAC,EACA,UAAAC,EACA,YAAAC,EACA,yBAAAb,CACF,EAKG,CACD,KAAM,CAAE,cAAAc,CAAA,EAAkBtD,EAAmB0C,GAAUA,CAAK,EAE5D,OAAOS,EACJ,IAAKzE,GAAS0E,EAAU,KAAMG,GAAMA,EAAE,OAAS7E,CAAI,CAAC,EACpD,OAAQ8E,GAAyBA,IAAQ,MAAS,EAClD,IAAKA,GAAQ,CACZ,MAAMf,EAAea,EAAcE,EAAI,IAAI,GAAK,0BAEhD,OACE1B,EAAAA,IAACmB,GAAA,CAEC,KAAMO,EAAI,KACV,KAAMA,EAAI,KACV,WAAYH,EAAYG,EAAI,IAAI,EAChC,yBAAAhB,EACA,aAAAC,CAAA,EALKe,EAAI,IAAA,CAQf,CAAC,CACL,CAEO,MAAMC,GAA4BpB,EAAM,KAAKa,EAAiB,EC5H9D,MAAMQ,WAAmB,KAAM,CACpC,YACEC,EACgBC,EACAC,EAChB,CACA,MAAMF,CAAO,EAHG,KAAA,UAAAC,EACA,KAAA,SAAAC,EAGhB,KAAK,KAAO,YACd,CACF,CAKA,eAAsBC,GACpBC,EACA5N,EAAwB,GACZ,CACZ,KAAM,CACJ,WAAA6N,EAAa,EACb,aAAAC,EAAe,IACf,SAAAC,EAAW,IACX,cAAAC,EAAgB,EAChB,QAAAC,EACA,YAAAC,EAAc,IAAM,GACpB,OAAAC,CAAA,EACEnO,EAEJ,IAAIyN,EAEJ,QAASW,EAAU,EAAGA,GAAWP,EAAYO,IAC3C,GAAI,CAEF,GAAID,GAAA,MAAAA,EAAQ,QACV,MAAM,IAAI,MAAM,qBAAqB,EAGvC,OAAO,MAAMP,EAAA,CACf,OAASrC,EAAO,CAId,GAHAkC,EAAYlC,aAAiB,MAAQA,EAAQ,IAAI,MAAM,OAAOA,CAAK,CAAC,EAGhE6C,IAAYP,EACd,MAIF,GAAI,CAACK,EAAYT,CAAS,EACxB,MAAMA,EAUR,MAAMY,EANQ,KAAK,IACjBP,EAAe,KAAK,IAAIE,EAAeI,CAAO,EAC9CL,CAAA,GAI6B,GAAM,KAAK,SAAW,IAGjDE,GACFA,EAAQR,EAAWW,EAAU,CAAC,EAIhC,MAAM,IAAI,QAASE,GAAY,CAC7B,MAAMC,EAAY,WAAWD,EAASD,CAAa,EAG/CF,GACFA,EAAO,iBACL,QACA,IAAM,CACJ,aAAaI,CAAS,EACtBD,EAAQ,MAAS,CACnB,EACA,CAAE,KAAM,EAAA,CAAK,CAGnB,CAAC,CACH,CAGF,MAAM,IAAIf,GACR,gBAAgBM,EAAa,CAAC,YAC9BJ,EACAI,EAAa,CAAA,CAEjB,CAwBO,MAAMW,GAAkB,CAE7B,cAAgBjD,GACe,CAC3B,eACA,kBACA,cACA,eACA,YACA,YACA,cAAA,EAG0B,KACzBkD,GACClD,EAAM,QAAQ,SAASkD,CAAO,GAAKlD,EAAM,KAAK,SAASkD,CAAO,CAAA,EAKpE,gBAAkBC,GAA2BnD,GAAe,OAC1D,OAAIT,EAAAS,EAAM,WAAN,MAAAT,EAAgB,OACX4D,EAAY,SAASnD,EAAM,SAAS,MAAM,EAE5C,EACT,EAGA,gBAAkBA,GACU,CACxB,QACA,SACA,0BACA,oBACA,YAAA,EAGuB,KAAMkD,GAC7BlD,EAAM,QAAQ,cAAc,SAASkD,EAAQ,YAAA,CAAa,CAAA,EAK9D,QACE,IAAIE,IACDpD,GACQoD,EAAW,KAAMC,GAAaA,EAASrD,CAAK,CAAC,CAE5D,ECtIA,SAASsD,IAAkB,CACzB,MAAMC,EAAYC,GAAgBxC,GAAUA,EAAM,SAAS,EACrDyC,EAAcC,EAAAA,WAAWC,EAAkB,EAC3CC,EAAiBF,EAAAA,WAAWG,EAAqB,EACjDC,EAAcJ,EAAAA,WAAWK,EAAkB,EAC3CjD,EAA2BkD,GAC9BhD,GAAUA,EAAM,wBAAA,EAEb,CACJ,SAAAS,EACA,UAAAwC,EACA,aAAAC,EACA,UAAAxC,EACA,YAAAC,EACA,cAAAwC,EACA,cAAAvC,CAAA,EACEtD,EACF8F,GAAYpD,IAAW,CACrB,SAAUA,EAAM,SAChB,UAAWA,EAAM,UACjB,aAAcA,EAAM,aACpB,UAAWA,EAAM,UACjB,YAAaA,EAAM,YACnB,cAAeA,EAAM,cACrB,cAAeA,EAAM,aAAA,EACrB,CAAA,EAEE,CAAE,aAAAqD,GAAiBnD,GACvBkD,GAAYpD,IAAW,CAAE,aAAcA,EAAM,cAAe,CAAA,EAExD,CAAE,qBAAAsD,EAAsB,iBAAAC,CAAA,EAAqBC,GAAA,EAG7CC,EAA2BjH,EAAAA,WAC3B,GAAI,EAEJkH,EAAmBlH,EAAAA,OAAoC,IAAI,GAAK,EAEhEmH,EAAqBnH,EAAAA,OAA8B,IAAI,EACvDoH,EAAwBpH,EAAAA,OAAe,EAAE,EACzCqH,EAAsBrH,EAAAA,OAA4B,IAAI,GAAK,EAM3DsH,EAAoB9F,EAAAA,YAAY,IAAM,CAC1C4F,EAAsB,QAAU,aAAa,KAAK,IAAA,CAAK,GAGvD,UAAWG,KAAWL,EAAiB,QAAQ,OAAA,EAC7C,aAAaK,CAAO,EAEtBL,EAAiB,QAAQ,MAAA,EACrBC,EAAmB,UACrB,aAAaA,EAAmB,OAAO,EACvCA,EAAmB,QAAU,MAE/B,UAAWK,KAAcP,EAAyB,QAAQ,OAAA,EACxDO,EAAW,MAAA,EAEbP,EAAyB,QAAQ,MAAA,EACjCF,EAAA,EACAhB,EAAU,CACR,aAAc,GACd,mBAAoB,OACpB,oBAAqB,MAAA,CACtB,CACH,EAAG,CAACgB,EAAkBhB,CAAS,CAAC,EAEhC/D,EAAAA,UAAU,IAAM,CACd+D,EAAU,CAAE,iBAAkBuB,EAAmB,CACnD,EAAG,CAACA,EAAmBvB,CAAS,CAAC,EAGjC,MAAM0B,EAAqBjG,cAAakG,GAAoB,CAE1D,MAAMC,GADiBN,EAAoB,QAAQ,IAAIK,CAAO,GAAK,GAC/B,EACpC,OAAAL,EAAoB,QAAQ,IAAIK,EAASC,CAAU,EAC5CA,CACT,EAAG,CAAA,CAAE,EAGCC,EAA0BC,EAAAA,QAAQ,IAAM,CAE5C,MAAMC,EAAY,OAAO,QAAQjB,CAAY,EAAE,IAAI,CAAC,CAAC5Q,EAAKkK,CAAK,IAAM,CAEnE,IAAI4H,EAAmB,EACvB,OAAI5H,EAAM,eACJA,EAAM,wBAAwB,KAChC4H,EAAmB5H,EAAM,aAAa,QAAA,EAC7B,OAAOA,EAAM,cAAiB,WACvC4H,EAAmB,IAAI,KAAK5H,EAAM,YAAY,EAAE,QAAA,IAI7C,CACL,IAAAlK,EACA,KAAMkK,EAAM,KACZ,QAASA,EAAM,QACf,MAAOA,EAAM,MACb,aAAc4H,CAAA,CAElB,CAAC,EACD,OAAO,KAAK,UAAUD,CAAS,CACjC,EAAG,CAACjB,CAAY,CAAC,EAEXmB,EAAoBH,EAAAA,QAAQ,IAAM,CACtC,MAAMI,EAAiC,CAAA,EACvC,cAAO,OAAOpB,CAAY,EAAE,QAAS1G,GAAU,CACzCA,EAAM,OAASA,EAAM,SACvB8H,EAAO9H,EAAM,IAAI,EAAIA,EAAM,OAE/B,CAAC,EACM8H,CACT,EAAG,CAACL,CAAuB,CAAC,EAGtBM,EAAoB1G,EAAAA,YAAY,IAAM,CAC1C,MAAM2G,EAAsC,CAAA,EACtC,CAAE,aAAAtB,GAAiBP,EAAY,SAAA,EACrC,cAAO,OAAOO,CAAY,EAAE,QAAS1G,GAAU,CACzCA,EAAM,OAASA,EAAM,SACvBgI,EAAYhI,EAAM,IAAI,EAAIA,EAAM,OAEpC,CAAC,EACMgI,CACT,EAAG,CAAC7B,CAAW,CAAC,EAGV8B,EAAgB5G,EAAAA,YACpB,MACE8C,EACAc,EACAnO,IACG,CACH,GAAI,CAACqN,GAAO,CAACwC,EACX,OAIF,MAAMuB,EAAqBpB,EAAyB,QAAQ,IAAI3C,EAAI,IAAI,EACpE+D,IACFA,EAAmB,MAAA,EACnBpB,EAAyB,QAAQ,OAAO3C,EAAI,IAAI,GAIlD,MAAMgE,EAAkBlD,EAAS,KAAO,IAAI,gBACtCmD,EAAcnD,GAAUkD,EAAiB,OAC3CA,GACFrB,EAAyB,QAAQ,IAAI3C,EAAI,KAAMgE,CAAe,EAIhE,MAAME,EAAY,GAAGlE,EAAI,IAAI,IAAI,KAAK,IAAA,CAAK,IAAI,KAAK,OAAA,CAAQ,GACtDmE,EAAUhB,EAAmBnD,EAAI,IAAI,EAC3C8C,EAAsB,QAAUoB,EAEhC,MAAME,EAA6B,CACjC,GAAIF,EACJ,QAASlE,EAAI,KACb,IAAAA,EACA,OAAQiE,EACR,UAAW,KAAK,IAAA,CAAI,EAGtB,MAAMI,EAAuB,QAAQD,EAAcD,EAASxR,CAAO,CACrE,EACA,CAAC6P,EAAsBf,EAAW0B,CAAkB,CAAA,EAIhDmB,EAAsBpH,EAAAA,YAC1B,MACEqH,EACAJ,EACAxR,IACG,OACH,KAAM,CAAE,IAAAqN,EAAK,OAAAc,EAAQ,GAAA0D,CAAA,EAAOD,EAG5B,GAAIzB,EAAsB,UAAY0B,EAAI,CACxC,QAAQ,IAAI,uCAAwCxE,EAAI,IAAI,EAC5DyB,EAAU,CACR,aAAc,GACd,mBAAoB,OACpB,oBAAqB,MAAA,CACtB,EACD,MACF,CAEAA,EAAU,CACR,YAAa,OACb,aAAc,GACd,oBAAqB,KAAK,IAAA,EAC1B,mBAAoB,CAClB,MAAO,UACP,QAAS,8BAAA,CACX,CACD,EAED,MAAMgD,EAAa,CACjBC,EACAvE,IACG,CACH,GAAIW,EAAO,SAAWgC,EAAsB,UAAY0B,EAAI,OAI5D,IADuBzB,EAAoB,QAAQ,IAAI/C,EAAI,IAAI,GAAK,KAC7CmE,EAAS,CAC9B,QAAQ,IAAI,0CAA0C,EACtDrD,EAAO,cAAc,IAAI,MAAM,OAAO,CAAC,EACvC,MACF,CAEAW,EAAU,CACR,aAAc,GACd,mBAAoB,CAAE,MAAAiD,EAAO,QAAAvE,CAAA,CAAQ,CACtC,CACH,EAEA,GAAI,CAEF,MAAMwE,EAAiBf,EAAA,EAEvB,QAAQ,IAAI,0CAA2C,CACrD,QAAS5D,EAAI,KACb,gBAAiB,OAAO,KAAK2E,CAAc,EAAE,OAC7C,gBAAiB,OAAO,KAAKA,CAAc,EAC3C,cAAe,OAAO,KAAKjB,CAAiB,EAAE,OAC9C,UAAWc,CAAA,CACZ,EAGD,MAAMI,EAAS,MAAMtE,GACnB,SAAY,CACV,GAAIQ,EAAO,QAAS,MAAM,IAAI,MAAM,iBAAiB,EACrD,OAAO,MAAM0B,EACXxC,EAAI,KACJA,EAAI,KACJ2E,EACAF,EACA9R,CAAA,CAEJ,EACA,CACE,WAAY,EACZ,aAAc,IACd,YAAcuL,GAGVA,EAAM,QAAQ,SAAS,WAAW,GAClCA,EAAM,QAAQ,SAAS,MAAM,GAC7BA,EAAM,QAAQ,SAAS,OAAO,GAC9BA,EAAM,QAAQ,SAAS,QAAQ,EAExB,GAGFiD,GAAgB,QACrBA,GAAgB,gBACf0D,GACCA,EAAE,QAAQ,SAAS,QAAQ,GAAKA,EAAE,QAAQ,SAAS,OAAO,CAAA,EAC5D3G,CAAK,EAET,QAAS,CAACA,EAAO6C,IAAY,CAC3B,QAAQ,IACN,6CAA6CA,CAAO,KACpD7C,EAAM,OAAA,EAERuD,EAAU,CACR,aAAc,GACd,mBAAoB,CAClB,MAAO,UACP,QAAS,gCAAgCV,CAAO,MAAA,CAClD,CACD,CACH,EACA,OAAAD,CAAA,CACF,EAGF,GAAIA,EAAO,SAAWgC,EAAsB,UAAY0B,EAAI,CAC1D,QAAQ,IAAI,uBAAwBxE,EAAI,IAAI,EAC5CyB,EAAU,CACR,aAAc,GACd,mBAAoB,OACpB,oBAAqB,MAAA,CACtB,EACD,MACF,CAGEmD,GACA,OAAOA,GAAW,UAClB,SAAUA,GACV,SAAUA,GACV,SAAUA,IAEV,QAAQ,IAAI,0BAA2B,CACrC,QAASA,EAAO,KAChB,UAAWnH,EAAAmH,EAAO,OAAP,YAAAnH,EAAsB,KACjC,UAAW,KAAK,IAAA,EAChB,UAAW+G,EACX,QAAAL,CAAA,CACD,EAED1C,EAAU,CACR,KAAMmD,EAAO,KACb,KAAMA,EAAO,KACb,KAAMA,EAAO,KACb,SAAUA,EAAO,SACjB,YAAa,OACb,aAAc,GACd,eAAgB,GAChB,mBAAoB,OACpB,oBAAqB,OACrB,kBAAmBjD,EAAY,SAAA,EAAW,aAC1C,YAAciD,EAAe,YAK7B,aAAeA,EAAe,aAC9B,SAAWA,EAAe,QAAA,CAC3B,EACDvC,EAAcuC,EAAO,KAAgB,MAAS,EAElD,OAAS1G,EAAO,CACd,GAAI4C,EAAO,SAAWgC,EAAsB,UAAY0B,EAAI,CAC1D,QAAQ,IAAI,kCAAmCxE,EAAI,IAAI,EACvDyB,EAAU,CACR,aAAc,GACd,mBAAoB,OACpB,oBAAqB,MAAA,CACtB,EACD,MACF,CAEA,MAAMqD,EACJ5G,aAAiB,MAAQA,EAAM,QAAU,OAAOA,CAAK,EAEvDuD,EAAU,CACR,YAAaqD,EACb,aAAc,GACd,mBAAoB,OACpB,oBAAqB,MAAA,CACtB,EAEDzC,EAAcrC,EAAI,KAAM8E,CAAY,CACtC,QAAA,CACEnC,EAAyB,QAAQ,OAAO3C,EAAI,IAAI,CAClD,CACF,EACA,CACEwC,EACAoB,EACAnC,EACAY,EACAV,CAAA,CACF,EAEI0C,EAAyB3I,EAAAA,OAAO4I,CAAmB,EACzD5G,EAAAA,UAAU,IAAM,CACd2G,EAAuB,QAAUC,CACnC,CAAC,EAGD,MAAMS,EAAwBrJ,EAAAA,OAAsB,IAAI,EAGxDgC,EAAAA,UAAU,IAAM,CACd,QAAQ,IAAI,4CAA6C,CACvD,UAAAyE,CAAA,CACD,EAED,MAAM6C,EAAapF,EAAU,KAAMI,GAAQA,EAAI,OAASmC,CAAS,EAC3D8C,EAAUnF,EAAcqC,CAAS,GAAK,0BAGxC8C,IAAY,2BAA6BD,IAC3CD,EAAsB,QAAU5C,GAIlC,MAAM+C,EAAkBtC,EAAiB,QAAQ,IAAIT,CAAS,EAC9D,OAAI+C,IACF,aAAaA,CAAe,EAC5BtC,EAAiB,QAAQ,OAAOT,CAAS,GAGvC6C,GAAcC,IAAY,0BAIvBtD,EAAY,SAAA,EAAW,cAC1BF,EAAU,CAAE,eAAgB,GAAM,EAE3BuD,GAAcC,IAAY,0BAGnCxC,EAAA,EAIK,IAAM,CACX,MAAMQ,EAAUL,EAAiB,QAAQ,IAAIT,CAAS,EAClDc,IACF,aAAaA,CAAO,EACpBL,EAAiB,QAAQ,OAAOT,CAAS,EAE7C,CACF,EAAG,CACDvC,EACAuC,EACAV,EACA3B,EACAgE,EACArB,CAAA,CACD,EAGD,MAAM0C,EAA4B5B,EAAAA,QAAQ,IAAM,OAC9C,MAAM6B,MAAW,IACXC,EAAYzF,EAAU,KAAMG,GAAMA,EAAE,OAASoC,CAAS,EAC5D,GACEkD,GACAvF,EAAcuF,EAAU,IAAI,IAAM,0BAElC,GAAI,CAEF,MAAMC,GAAY7H,EADH,KAAK,MAAM4H,EAAU,IAAI,EACf,QAAP,YAAA5H,EAAc,MAC5B,OAAO6H,GAAc,UACH,OAAO,OAAO/C,CAAY,EAAE,KAC7CgD,GAAMA,EAAE,OAASD,GAAaC,EAAE,KAAA,GAGjCH,EAAK,IAAIC,EAAU,KAAMC,CAAS,CAGxC,MAAQ,CAER,CAEF,OAAOF,CACT,EAAG,CAACjD,EAAWvC,EAAWE,EAAeyC,CAAY,CAAC,EAGtD7E,EAAAA,UAAU,KACR,QAAQ,IAAI,2CAA4C,CACtD,cAAekC,EAAU,OACzB,gBAAiBuF,EAA0B,KAC3C,aAAc,MAAM,KAAKA,EAA0B,SAAS,EAC5D,aAAc,OAAO,QAAQ5C,CAAY,EAAE,IAAI,CAAC,CAAC5Q,EAAKkK,CAAK,KAAO,CAChE,IAAAlK,EACA,KAAMkK,EAAM,KACZ,MAAOA,EAAM,KAAA,EACb,CAAA,CACH,EAEmB2J,GAAmB,cAAeC,GAAU,CAC9D,QAAQ,IAAI,gCAAiC,CAC3C,MAAAA,EACA,aAAc,MAAM,KAAKN,EAA0B,SAAS,EAC5D,UAAAhD,EACA,aAAc,OAAO,QAAQI,CAAY,EAAE,IAAI,CAAC,CAAC5Q,EAAKkK,CAAK,KAAO,CAChE,IAAAlK,EACA,KAAMkK,EAAM,KACZ,MAAOA,EAAM,KAAA,EACb,CAAA,CACH,EAGD,MAAM6J,EAA6B,CAAA,EAiBnC,GAfAP,EAA0B,QAAQ,CAACG,EAAWlC,IAAY,CACxD,GAAIkC,IAAcG,EAAM,UAAW,CACjC,MAAMzF,EAAMJ,EAAU,KAAMG,GAAMA,EAAE,OAASqD,CAAO,EAChDpD,GACF0F,EAAoB,KAAK1F,CAAG,CAEhC,CACF,CAAC,EAED,QAAQ,IAAI,wCAAyC,CACnD,UAAWyF,EAAM,UACjB,cAAeC,EAAoB,OACnC,cAAeA,EAAoB,IAAK3F,GAAMA,EAAE,IAAI,CAAA,CACrD,EAEG2F,EAAoB,SAAW,EAAG,CACpC,QAAQ,IAAI,uDAAuD,EACnE,MACF,CAIK/D,EAAY,SAAA,EAAW,cAC1BF,EAAU,CAAE,eAAgB,GAAM,CAEtC,CAAC,GAGA,CACD0D,EACAvF,EACAkE,EACAX,EACAhB,EACAV,CAAA,CACD,EAMD,MAAMkE,EAAmBjK,EAAAA,OAAOoI,CAAa,EAC7CpG,EAAAA,UAAU,IAAM,CACdiI,EAAiB,QAAU7B,CAC7B,CAAC,EACD,MAAM8B,EAAwBlK,EAAAA,OAAOyH,CAAkB,EAiIvD,OAhIAzF,EAAAA,UAAU,IAAM,CACdkI,EAAsB,QAAUzC,CAClC,CAAC,EAEDzF,EAAAA,UAAU,IAAM,CACd,MAAMmI,EAAU,IAAM,CAGpBpE,EAAU,CAAE,aAAc,GAAM,EAGhC,IAAIqE,EAAa,GACjB,MAAMrK,EAAYsB,EAAmB,SAAA,EAAW,gBAAA,EAChD,GAAItB,GAIE,CADFqG,EAAe,SAAA,EAAW,aAAarG,EAAU,YAAY,EAC1C,CACnB,MAAMsK,EAAWtK,EAAU,eACzBA,EAAU,OAAO,SAAA,CAAS,EAE5BqG,EACG,SAAA,EACA,aAAarG,EAAU,aAAcsK,CAAQ,CAClD,CAKF,KAAM,CAAE,UAAWC,EAAS,cAAeC,CAAA,EACzCnE,EAAe,SAAA,EACjB,UAAW9B,KAAOgG,EAChB,GAAIC,EAAUjG,EAAI,IAAI,IAAM,yBAA0B,CACpD,MAAMkG,EAAMnJ,EAAmB,SAAA,EAAW,UAAUiD,EAAI,IAAI,EAC5D,GAAIkG,EAAK,CACP,MAAMH,EAAWG,EAAI,eAAeA,EAAI,OAAO,UAAU,EACnDC,EAAWnE,EAAY,SAAA,EAAW,aAAahC,EAAI,IAAI,GACzD,CAACmG,GAAYA,EAAS,UAAYJ,KACpC/D,EAAY,SAAA,EAAW,YAAYhC,EAAI,KAAM+F,CAAQ,EACrDD,EAAa,GAEjB,CACF,CAIF,MAAMM,EAAatE,EAAe,SAAA,EAAW,UACvCmB,EAAUL,EAAiB,QAAQ,IAAIwD,CAAU,EACnDnD,IACF,aAAaA,CAAO,EACpBL,EAAiB,QAAQ,OAAOwD,CAAU,GAIxCvD,EAAmB,SACrB,aAAaA,EAAmB,OAAO,EAEzCA,EAAmB,QAAU,WAAW,IAAM,CAC5CA,EAAmB,QAAU,KAC7B,KAAM,CACJ,UAAWwD,EACX,UAAWC,EACX,cAAeC,CAAA,EACbzE,EAAe,SAAA,EAGnB,IAAI0E,EAAaF,EAEjB,IADgBC,EAAOD,CAAG,GAAK,6BACf,yBACd,GAAIvB,EAAsB,QACxByB,EAAazB,EAAsB,YAC9B,CAELtD,EAAU,CAAE,aAAc,GAAO,EACjC,MACF,CAGF,MAAMgF,EAAWJ,EAAK,KAAMtG,GAAMA,EAAE,OAASyG,CAAU,EACvD,GAAIC,EAAU,CAEZ,MAAMC,EAAU5E,EAAe,SAAA,EAAW,aAAa0E,CAAU,EAC3DN,EAAMnJ,EAAmB,SAAA,EAAW,UAAUyJ,CAAU,EACxDxG,EAAM0G,EACR,CAAE,GAAGD,EAAU,KAAMC,EAAQ,UAC7BR,EACE,CAAE,GAAGO,EAAU,KAAMP,EAAI,eAAeA,EAAI,OAAO,UAAU,CAAA,EAC7DO,EACNb,EAAsB,QAAQ5F,EAAI,IAAI,EAEtC2F,EAAiB,QACf3F,EACA,OACA8F,EAAa,CAAE,YAAa,IAAS,MAAA,CAEzC,MACErE,EAAU,CAAE,aAAc,GAAO,CAErC,EAAG,GAAG,CACR,EAEA,cAAO,iBAAiB,wBAAyBoE,CAAO,EACjD,IAAM,CACX,OAAO,oBAAoB,wBAAyBA,CAAO,EACvDhD,EAAmB,SACrB,aAAaA,EAAmB,OAAO,CAE3C,CACF,EAAG,CAACpB,EAAWK,EAAgBE,CAAW,CAAC,EAG3CtE,EAAAA,UAAU,IACD,IAAM,CAEXiF,EAAyB,QAAQ,QAASO,GACxCA,EAAW,MAAA,CAAM,EAEnBP,EAAyB,QAAQ,MAAA,EAGjCC,EAAiB,QAAQ,QAASK,GAAY,aAAaA,CAAO,CAAC,EACnEL,EAAiB,QAAQ,MAAA,EAGzBH,EAAA,CACF,EACC,CAACA,CAAgB,CAAC,EAEhB9C,EAAS,aASXgH,GAAA,CAAK,MAAOxE,EAAW,cAAeC,EAAc,UAAU,SAE7D,SAAA9D,EAAAA,IAAC2B,GAAA,CACC,SAAAN,EACA,UAAAC,EACA,YAAAC,EACA,yBAAAb,CAAA,CAAA,EAEJ,EAfEV,MAAC,OAAI,UAAU,yEACZ,SAACsB,GAAA,MAAAA,EAAW,OAAsC,qBAA7B,0BAA6B,CACrD,CAeN,CAGO,MAAMgH,GAASC,EAAAA,KAAKrF,EAAe","x_google_ignoreList":[0,1,2,3,4,5]}