@textbus/collaborate 5.2.1 → 5.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.esm.js +1099 -642
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +1411 -2
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
package/dist/index.esm.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.esm.js","sources":["../src/base/collab-history.ts","../src/base/collaborate.ts","../src/base/message-bus.ts","../src/base/multiple-doc-collab-history.ts","../src/base/sub-model-loader.ts","../src/base/sync-connector.ts","../src/connectors/hocuspocus-connector.ts","../src/connectors/y-websocket-connector.ts","../src/collaborate-module.ts","../src/multiple-document-collaborate-module.ts"],"sourcesContent":["import { Inject, Injectable, Optional } from '@viewfly/core'\nimport { History, HISTORY_STACK_SIZE, makeError, RootComponentRef, Scheduler } from '@textbus/core'\nimport { Observable, Subject, Subscription } from '@tanbo/stream'\nimport {\n Item,\n Transaction,\n UndoManager\n} from 'yjs'\n\nimport { Collaborate, CollaborateHistorySelectionPosition, CursorPosition } from './collaborate'\n\nexport abstract class CustomUndoManagerConfig {\n abstract captureTransaction?(arg0: Transaction): boolean\n\n abstract deleteFilter?(arg0: Item): boolean\n}\n\nconst collabHistoryErrorFn = makeError('CollabHistory')\n\n@Injectable()\nexport class CollabHistory implements History {\n onBack: Observable<void>\n onForward: Observable<void>\n onChange: Observable<void>\n onPush: Observable<void>\n\n get canBack() {\n return this.manager?.canUndo() || false\n }\n\n get canForward() {\n return this.manager?.canRedo() || false\n }\n\n private manager: UndoManager | null = null\n\n private historyItems: Array<CollaborateHistorySelectionPosition> = []\n private index = 0\n private subscriptions: Subscription[] = []\n\n private backEvent = new Subject<void>()\n private forwardEvent = new Subject<void>()\n private changeEvent = new Subject<void>()\n private pushEvent = new Subject<void>()\n\n constructor(private rootComponentRef: RootComponentRef,\n private collaborate: Collaborate,\n private scheduler: Scheduler,\n @Inject(HISTORY_STACK_SIZE) private stackSize: number,\n @Optional() private undoManagerConfig: CustomUndoManagerConfig) {\n this.onBack = this.backEvent.asObservable()\n this.onForward = this.forwardEvent.asObservable()\n this.onChange = this.changeEvent.asObservable()\n this.onPush = this.pushEvent.asObservable()\n\n }\n\n listen() {\n const root = this.collaborate.yDoc.getMap('RootComponent')\n const rootComponent = this.rootComponentRef.component!\n this.collaborate.syncRootComponent(this.collaborate.yDoc, root, rootComponent)\n\n const undoManagerConfig = this.undoManagerConfig || {}\n const manager = new UndoManager(root, {\n trackedOrigins: new Set<any>([this.collaborate.yDoc]),\n captureTransaction(arg) {\n if (undoManagerConfig.captureTransaction) {\n return undoManagerConfig.captureTransaction(arg)\n }\n return true\n },\n deleteFilter(item: Item) {\n if (undoManagerConfig.deleteFilter) {\n return undoManagerConfig.deleteFilter(item)\n }\n return true\n }\n })\n this.manager = manager\n\n let beforePosition: CursorPosition | null = null\n this.subscriptions.push(\n this.scheduler.onLocalChangeBefore.subscribe(() => {\n beforePosition = this.collaborate.getRelativeCursorLocation()\n }),\n this.collaborate.onAddSubModel.subscribe(() => {\n throw collabHistoryErrorFn('single document does not support submodels.')\n })\n )\n\n manager.on('stack-item-added', (event: any) => {\n if (event.type === 'undo') {\n if (event.origin === manager) {\n this.index++\n } else {\n this.historyItems.length = this.index\n this.historyItems.push({\n before: beforePosition,\n after: this.collaborate.getRelativeCursorLocation()\n })\n this.index++\n }\n } else {\n this.index--\n }\n if (manager.undoStack.length > this.stackSize) {\n this.historyItems.shift()\n manager.undoStack.shift()\n }\n if (event.origin === this.collaborate.yDoc) {\n this.pushEvent.next()\n }\n this.changeEvent.next()\n })\n manager.on('stack-item-popped', (ev: any) => {\n const index = ev.type === 'undo' ? this.index : this.index - 1\n const position = this.historyItems[index] || null\n const p = ev.type === 'undo' ? position?.before : position?.after\n this.collaborate.restoreCursorPosition(p)\n })\n }\n\n\n back() {\n if (this.canBack) {\n this.manager?.undo()\n this.backEvent.next()\n }\n }\n\n forward() {\n if (this.canForward) {\n this.manager?.redo()\n this.forwardEvent.next()\n }\n }\n\n clear() {\n const last = this.historyItems.pop()\n this.historyItems = last ? [last] : []\n this.index = last ? 1 : 0\n this.manager?.clear()\n this.changeEvent.next()\n }\n\n destroy() {\n this.index = 0\n this.historyItems = []\n this.subscriptions.forEach(i => i.unsubscribe())\n if (this.manager) {\n this.manager.destroy()\n this.manager.captureTransaction = () => true\n this.manager.deleteFilter = () => true\n this.manager.trackedOrigins = new Set([null])\n }\n\n this.manager = null\n }\n}\n","import { Injectable } from '@viewfly/core'\nimport { filter, map, Observable, Subject, Subscription } from '@tanbo/stream'\nimport {\n ChangeOrigin,\n Component,\n Registry,\n Formats,\n makeError,\n Scheduler,\n Selection,\n Slot,\n AsyncSlot,\n AsyncComponent,\n AbstractSelection,\n observe,\n ProxyModel\n} from '@textbus/core'\nimport {\n AbstractType,\n Array as YArray, createAbsolutePositionFromRelativePosition, createRelativePositionFromTypeIndex,\n Doc as YDoc,\n Map as YMap,\n RelativePosition,\n Text as YText,\n Transaction,\n UndoManager,\n YArrayEvent,\n YMapEvent,\n YTextEvent\n} from 'yjs'\n\nimport { SubModelLoader } from './sub-model-loader'\n\nexport interface RelativePositionRecord {\n doc: YDoc,\n position: RelativePosition\n}\n\nexport interface CursorPosition {\n anchor: RelativePositionRecord\n focus: RelativePositionRecord\n}\n\nexport interface CollaborateHistorySelectionPosition {\n before: CursorPosition | null\n after: CursorPosition | null\n}\n\nconst collaborateErrorFn = makeError('Collaborate')\n\nclass SlotMap {\n private slotAndYTextMap = new WeakMap<Slot, YText>()\n private yTextAndSlotMap = new WeakMap<YText, Slot>()\n\n set(key: Slot, value: YText): void\n set(key: YText, value: Slot): void\n set(key: any, value: any) {\n if (key instanceof Slot) {\n this.slotAndYTextMap.set(key, value)\n this.yTextAndSlotMap.set(value, key)\n } else {\n this.slotAndYTextMap.set(value, key)\n this.yTextAndSlotMap.set(key, value)\n }\n }\n\n get(key: Slot): YText | null\n get(key: YText): Slot | null\n get(key: any) {\n if (key instanceof Slot) {\n return this.slotAndYTextMap.get(key) || null\n }\n return this.yTextAndSlotMap.get(key) || null\n }\n\n delete(key: Slot | YText) {\n if (key instanceof Slot) {\n const v = this.slotAndYTextMap.get(key)\n this.slotAndYTextMap.delete(key)\n if (v) {\n this.yTextAndSlotMap.delete(v)\n }\n } else {\n const v = this.yTextAndSlotMap.get(key)\n this.yTextAndSlotMap.delete(key)\n if (v) {\n this.slotAndYTextMap.delete(v)\n }\n }\n }\n}\n\ninterface Update {\n record: boolean\n actions: Array<() => void>\n}\n\ninterface UpdateItem {\n record: boolean\n\n action(): void\n}\n\nexport interface SubModelLoaded {\n yType: AbstractType<any>\n yDoc: YDoc\n}\n\n@Injectable()\nexport class Collaborate {\n yDoc = new YDoc()\n slotMap = new SlotMap()\n onAddSubModel: Observable<SubModelLoaded>\n\n private subscriptions: Subscription[] = []\n private updateFromRemote = false\n private addSubModelEvent = new Subject<SubModelLoaded>()\n\n private updateRemoteActions = new WeakMap<YDoc, UpdateItem[]>()\n private noRecord = {}\n\n constructor(private scheduler: Scheduler,\n private registry: Registry,\n private selection: Selection,\n private subModelLoader: SubModelLoader) {\n this.onAddSubModel = this.addSubModelEvent.asObservable()\n }\n\n syncRootComponent(yDoc: YDoc, sharedComponent: YMap<any>, localComponent: Component<any>) {\n this.initSyncEvent(yDoc)\n this.syncComponent(yDoc, sharedComponent, localComponent)\n }\n\n syncRootSlot(yDoc: YDoc, sharedSlot: YText, localSlot: Slot) {\n if (sharedSlot.length) {\n localSlot.retain(0)\n localSlot.delete(localSlot.length)\n localSlot.cleanAttributes()\n localSlot.cleanFormats()\n this.initLocalSlotBySharedSlot(sharedSlot, localSlot)\n } else {\n yDoc.transact(() => {\n this.initSharedSlotByLocalSlot(sharedSlot, localSlot)\n })\n }\n this.initSyncEvent(yDoc)\n this.syncSlot(sharedSlot, localSlot)\n }\n\n getAbstractSelection(position: CursorPosition): AbstractSelection | null {\n const anchorPosition = createAbsolutePositionFromRelativePosition(position.anchor.position, position.anchor.doc)\n const focusPosition = createAbsolutePositionFromRelativePosition(position.focus.position, position.focus.doc)\n if (anchorPosition && focusPosition) {\n const focusSlot = this.slotMap.get(focusPosition.type as YText)\n const anchorSlot = this.slotMap.get(anchorPosition.type as YText)\n if (focusSlot && anchorSlot) {\n return {\n anchorSlot,\n anchorOffset: anchorPosition.index,\n focusSlot,\n focusOffset: focusPosition.index\n }\n }\n }\n return null\n }\n\n getRelativeCursorLocation(): CursorPosition | null {\n const { anchorSlot, anchorOffset, focusSlot, focusOffset } = this.selection\n if (anchorSlot) {\n const anchorYText = this.slotMap.get(anchorSlot)\n if (anchorYText) {\n const anchorPosition = createRelativePositionFromTypeIndex(anchorYText, anchorOffset!)\n if (focusSlot) {\n const focusYText = this.slotMap.get(focusSlot)\n if (focusYText) {\n const focusPosition = createRelativePositionFromTypeIndex(focusYText, focusOffset!)\n return {\n focus: {\n doc: focusYText.doc!,\n position: focusPosition\n },\n anchor: {\n doc: anchorYText.doc!,\n position: anchorPosition\n }\n }\n }\n }\n }\n }\n return null\n }\n\n restoreCursorPosition(position: CursorPosition | null) {\n if (!position) {\n this.selection.unSelect()\n return\n }\n const selection = this.getAbstractSelection(position)\n if (selection) {\n this.selection.setBaseAndExtent(\n selection.anchorSlot,\n selection.anchorOffset,\n selection.focusSlot,\n selection.focusOffset)\n }\n }\n\n private initSyncEvent(yDoc: YDoc) {\n this.subscriptions.push(\n this.scheduler.onDocChanged.pipe(\n map(item => {\n return item.filter(i => {\n return i.from !== ChangeOrigin.Remote\n })\n }),\n filter(item => {\n return item.length\n })\n ).subscribe(() => {\n const updates: Update[] = []\n\n let update: Update | null = null\n\n const updateRemoteActions = this.updateRemoteActions.get(yDoc) || []\n\n for (const item of updateRemoteActions) {\n if (!update) {\n update = {\n record: item.record,\n actions: []\n }\n updates.push(update)\n }\n if (update.record === item.record) {\n update.actions.push(item.action)\n } else {\n update = {\n record: item.record,\n actions: [item.action]\n }\n updates.push(update)\n }\n }\n\n this.updateRemoteActions.delete(yDoc)\n\n for (const item of updates) {\n yDoc.transact(() => {\n item.actions.forEach(fn => {\n fn()\n })\n }, item.record ? yDoc : this.noRecord)\n }\n })\n )\n }\n\n private syncComponent(yDoc: YDoc, sharedComponent: YMap<any>, localComponent: Component<any>) {\n let state = sharedComponent.get('state') as YMap<any>\n if (!state) {\n state = new YMap<any>()\n this.syncLocalMapToSharedMap(localComponent.state as ProxyModel<Record<string, any>>, state)\n yDoc.transact(() => {\n sharedComponent.set('state', state)\n })\n } else {\n Object.keys(localComponent.state).forEach(key => {\n Reflect.deleteProperty(localComponent.state, key)\n })\n this.syncSharedMapToLocalMap(state, localComponent.state as ProxyModel<Record<string, any>>)\n }\n }\n\n private syncSlot(sharedSlot: YText, localSlot: Slot) {\n const syncRemote = (ev: YTextEvent, tr: Transaction) => {\n this.runRemoteUpdate(tr, () => {\n localSlot.retain(0)\n ev.keysChanged.forEach(key => {\n const change = ev.keys.get(key)\n if (!change) {\n return\n }\n const updateType = change.action\n if (updateType === 'update' || updateType === 'add') {\n const attribute = this.registry.getAttribute(key)\n if (attribute) {\n localSlot.setAttribute(attribute, sharedSlot.getAttribute(key))\n }\n } else if (updateType === 'delete') {\n const attribute = this.registry.getAttribute(key)\n if (attribute) {\n localSlot.removeAttribute(attribute)\n }\n }\n })\n ev.delta.forEach(action => {\n if (Reflect.has(action, 'retain')) {\n if (action.attributes) {\n const formats = remoteFormatsToLocal(this.registry, action.attributes)\n if (formats.length) {\n localSlot.retain(action.retain!, formats)\n }\n }\n localSlot.retain(localSlot.index + action.retain!)\n } else if (action.insert) {\n const index = localSlot.index\n let length = 1\n if (typeof action.insert === 'string') {\n length = action.insert.length\n localSlot.insert(action.insert, remoteFormatsToLocal(this.registry, action.attributes))\n } else {\n const sharedComponent = action.insert as YMap<any>\n const component = this.createLocalComponentBySharedComponent(sharedComponent)\n localSlot.insert(component)\n }\n if (this.selection.isSelected && !(tr.origin instanceof UndoManager)) {\n if (localSlot === this.selection.anchorSlot && this.selection.anchorOffset! > index) {\n this.selection.setAnchor(localSlot, this.selection.anchorOffset! + length)\n }\n if (localSlot === this.selection.focusSlot && this.selection.focusOffset! > index) {\n this.selection.setFocus(localSlot, this.selection.focusOffset! + length)\n }\n }\n } else if (action.delete) {\n const index = localSlot.index\n localSlot.delete(action.delete)\n if (this.selection.isSelected && !(tr.origin instanceof UndoManager)) {\n if (localSlot === this.selection.anchorSlot && this.selection.anchorOffset! >= index) {\n this.selection.setAnchor(localSlot, this.selection.startOffset! - action.delete)\n }\n if (localSlot === this.selection.focusSlot && this.selection.focusOffset! >= index) {\n this.selection.setFocus(localSlot, this.selection.focusOffset! - action.delete)\n }\n }\n }\n })\n })\n }\n sharedSlot.observe(syncRemote)\n\n const sub = localSlot.onContentChange.subscribe(actions => {\n this.runLocalUpdate(sharedSlot.doc, true, () => {\n let offset = 0\n let length = 0\n for (const action of actions) {\n if (action.type === 'retain') {\n const formats = action.formats\n if (formats) {\n const keys = Object.keys(formats)\n let length = keys.length\n keys.forEach(key => {\n const formatter = this.registry.getFormatter(key)\n if (!formatter) {\n length--\n Reflect.deleteProperty(formats, key)\n }\n })\n if (length) {\n sharedSlot.format(offset, action.offset, formats)\n }\n } else {\n offset = action.offset\n }\n } else if (action.type === 'contentInsert') {\n const delta = sharedSlot.toDelta()\n const isEmpty = delta.length === 1 && delta[0].insert === Slot.emptyPlaceholder\n if (typeof action.content === 'string') {\n length = action.content.length\n sharedSlot.insert(offset, action.content, action.formats || {})\n } else {\n length = 1\n const sharedComponent = this.createSharedComponentByLocalComponent(action.ref as Component)\n sharedSlot.insertEmbed(offset, sharedComponent, action.formats || {})\n }\n\n if (isEmpty && offset === 0) {\n sharedSlot.delete(sharedSlot.length - 1, 1)\n }\n offset += length\n } else if (action.type === 'delete') {\n const delta = sharedSlot.toDelta()\n if (sharedSlot.length) {\n sharedSlot.delete(offset, action.count)\n }\n if (sharedSlot.length === 0) {\n sharedSlot.insert(0, '\\n', delta[0]?.attributes)\n }\n } else if (action.type === 'attrSet') {\n sharedSlot.setAttribute(action.name, action.value)\n } else if (action.type === 'attrDelete') {\n sharedSlot.removeAttribute(action.name)\n }\n }\n })\n })\n\n this.slotMap.set(localSlot, sharedSlot)\n\n localSlot.__changeMarker__.addDetachCallback(() => {\n this.slotMap.delete(localSlot)\n sharedSlot.unobserve(syncRemote)\n sub.unsubscribe()\n })\n }\n\n\n destroy() {\n this.subscriptions.forEach(i => i.unsubscribe())\n this.subscriptions = []\n }\n\n private syncSharedMapToLocalMap(sharedMap: YMap<any>, localMap: ProxyModel<Record<string, any>>) {\n sharedMap.forEach((value, key) => {\n localMap[key] = this.createLocalModelBySharedByModel(value)\n })\n this.syncObject(sharedMap, localMap)\n }\n\n private createLocalMapBySharedMap(sharedMap: YMap<any>): ProxyModel<Record<string, any>> {\n const localMap = observe({}) as ProxyModel<Record<string, any>>\n this.syncSharedMapToLocalMap(sharedMap, localMap)\n return localMap\n }\n\n private createLocalArrayBySharedArray(sharedArray: YArray<any>): ProxyModel<any[]> {\n const localArray = observe<any[]>([]) as ProxyModel<any[]>\n localArray.push(...sharedArray.map(item => this.createLocalModelBySharedByModel(item)))\n this.syncArray(sharedArray, localArray)\n return localArray\n }\n\n private syncLocalMapToSharedMap(localMap: ProxyModel<Record<string, any>>, sharedMap: YMap<any>) {\n Object.entries(localMap).forEach(([key, value]) => {\n sharedMap.set(key, this.createSharedModelByLocalModel(value))\n })\n this.syncObject(sharedMap, localMap)\n }\n\n private createSharedMapByLocalMap(localMap: ProxyModel<Record<string, any>>): YMap<any> {\n const sharedMap = new YMap<any>()\n this.syncLocalMapToSharedMap(localMap, sharedMap)\n return sharedMap\n }\n\n private createSharedArrayByLocalArray(localArray: ProxyModel<any[]>): YArray<any> {\n const sharedArray = new YArray<any>()\n localArray.forEach(value => {\n sharedArray.push([this.createSharedModelByLocalModel(value)])\n })\n this.syncArray(sharedArray, localArray)\n return sharedArray\n }\n\n private createSharedSlotByLocalSlot(localSlot: Slot): YText {\n const sharedSlot = new YText()\n const isAsyncSlot = localSlot instanceof AsyncSlot\n sharedSlot.setAttribute('schema', [...localSlot.schema])\n sharedSlot.setAttribute('type', isAsyncSlot ? 'async' : 'sync')\n\n if (isAsyncSlot) {\n let isDestroyed = false\n const sharedMetadata = this.createSharedMapByLocalMap(localSlot.metadata)\n sharedSlot.setAttribute('metadata', sharedMetadata)\n this.subModelLoader.createSubModelBySlot(localSlot).then(subDocument => {\n if (isDestroyed) {\n return\n }\n const content = subDocument.getText('content')\n const state = subDocument.getMap('state')\n this.syncLocalMapToSharedMap(localSlot.state, state)\n this.initSharedSlotByLocalSlot(content, localSlot)\n this.syncSlot(content, localSlot)\n this.addSubModelEvent.next({\n yDoc: subDocument,\n yType: content\n })\n this.initSyncEvent(subDocument)\n localSlot.loader.markAsLoaded()\n })\n localSlot.__changeMarker__.addDetachCallback(() => {\n isDestroyed = true\n })\n return sharedSlot\n }\n\n const sharedSlotState = new YMap()\n this.syncLocalMapToSharedMap(localSlot.state as ProxyModel<Record<string, any>>, sharedSlotState)\n sharedSlot.setAttribute('state', sharedSlotState)\n\n const sharedContent = new YText()\n this.initSharedSlotByLocalSlot(sharedContent, localSlot)\n sharedSlot.insertEmbed(0, sharedContent)\n this.syncSlot(sharedContent, localSlot)\n return sharedSlot\n }\n\n private initSharedSlotByLocalSlot(sharedContent: YText, localSlot: Slot) {\n let offset = 0\n localSlot.toDelta().forEach(i => {\n let formats: any = {}\n if (i.formats) {\n i.formats.forEach(item => {\n formats[item[0].name] = item[1]\n })\n } else {\n formats = null\n }\n if (typeof i.insert === 'string') {\n sharedContent.insert(offset, i.insert, formats)\n } else {\n const sharedComponent = this.createSharedComponentByLocalComponent(i.insert)\n sharedContent.insertEmbed(offset, sharedComponent, formats)\n }\n offset += i.insert.length\n })\n localSlot.getAttributes().forEach(item => {\n sharedContent.setAttribute(item[0].name, item[1])\n })\n }\n\n private createLocalSlotBySharedSlot(sharedSlot: YText): Slot {\n const type = sharedSlot.getAttribute('type')\n const schema = sharedSlot.getAttribute('schema')\n\n if (type === 'async') {\n const metadata = sharedSlot.getAttribute('metadata') as YMap<any>\n const slot = new AsyncSlot(schema || [], {}, {})\n this.syncSharedMapToLocalMap(metadata, slot.metadata as ProxyModel<Record<string, any>>)\n const loadedSubDocument = this.subModelLoader.getLoadedModelBySlot(slot)\n if (loadedSubDocument) {\n const subContent = loadedSubDocument.getText('content')\n const data = loadedSubDocument.getMap('state')\n this.syncSharedMapToLocalMap(data, slot.state as ProxyModel<Record<string, any>>)\n this.syncRootSlot(loadedSubDocument, subContent, slot)\n this.addSubModelEvent.next({\n yDoc: loadedSubDocument,\n yType: subContent\n })\n slot.loader.markAsLoaded()\n return slot\n }\n let isDestroyed = false\n slot.loader.onRequestLoad.toPromise().then(() => {\n return this.subModelLoader.loadSubModelBySlot(slot)\n }).then(subDocument => {\n if (isDestroyed) {\n return\n }\n const subContent = subDocument.getText('content')\n const state = subDocument.getMap('state')\n this.syncSharedMapToLocalMap(state, slot.state as ProxyModel<Record<string, any>>)\n this.syncRootSlot(subDocument, subContent, slot)\n this.addSubModelEvent.next({\n yDoc: subDocument,\n yType: subContent\n })\n slot.loader.markAsLoaded()\n })\n slot.__changeMarker__.addDetachCallback(() => {\n isDestroyed = true\n })\n return slot\n }\n\n const contentDelta = sharedSlot.toDelta()\n const content = contentDelta[0]?.insert\n\n if (!(content instanceof YText)) {\n throw collaborateErrorFn('shared slot content type is not `YText`.')\n }\n\n const localSlot = new Slot(schema || [], {})\n\n const sharedSlotState = sharedSlot.getAttribute('state')\n this.syncSharedMapToLocalMap(sharedSlotState, localSlot.state as ProxyModel<Record<string, any>>)\n\n this.initLocalSlotBySharedSlot(content, localSlot)\n\n this.syncSlot(content, localSlot)\n return localSlot\n }\n\n private initLocalSlotBySharedSlot(content: YText, localSlot: Slot) {\n const delta = content.toDelta()\n\n const attrs = content.getAttributes()\n Object.keys(attrs).forEach(key => {\n const attribute = this.registry.getAttribute(key)\n if (attribute) {\n localSlot.setAttribute(attribute, attrs[key])\n }\n })\n for (const action of delta) {\n if (action.insert) {\n if (typeof action.insert === 'string') {\n const formats = remoteFormatsToLocal(this.registry, action.attributes)\n localSlot.insert(action.insert, formats)\n } else {\n const sharedComponent = action.insert as YMap<any>\n const component = this.createLocalComponentBySharedComponent(sharedComponent)\n localSlot.insert(component, remoteFormatsToLocal(this.registry, action.attributes))\n }\n } else {\n throw collaborateErrorFn('unexpected delta action.')\n }\n }\n }\n\n private createSharedModelByLocalModel(localModel: any) {\n if (localModel instanceof Slot) {\n return this.createSharedSlotByLocalSlot(localModel)\n }\n if (Array.isArray(localModel)) {\n return this.createSharedArrayByLocalArray(localModel as ProxyModel<any[]>)\n }\n if (typeof localModel === 'object' && localModel !== null) {\n return this.createSharedMapByLocalMap(localModel)\n }\n return localModel\n }\n\n private createLocalModelBySharedByModel(sharedModel: any) {\n if (sharedModel instanceof YMap) {\n return this.createLocalMapBySharedMap(sharedModel)\n }\n if (sharedModel instanceof YArray) {\n return this.createLocalArrayBySharedArray(sharedModel)\n }\n if (sharedModel instanceof YText) {\n return this.createLocalSlotBySharedSlot(sharedModel)\n }\n return sharedModel\n }\n\n\n private createSharedComponentByLocalComponent(component: Component | AsyncComponent): YMap<any> {\n const sharedComponent = new YMap()\n sharedComponent.set('name', component.name)\n\n if (component instanceof AsyncComponent) {\n sharedComponent.set('type', 'async')\n const sharedMetadata = this.createSharedMapByLocalMap(component.metadata)\n sharedComponent.set('metadata', sharedMetadata)\n const state = component.state as ProxyModel<Record<string, any>>\n let isDestroyed = false\n state.__changeMarker__.addDetachCallback(() => {\n isDestroyed = true\n })\n this.subModelLoader.createSubModelByComponent(component).then(subDocument => {\n if (isDestroyed) {\n return\n }\n const state = subDocument.getMap('state')\n this.syncComponent(subDocument, state, component)\n this.addSubModelEvent.next({\n yType: state,\n yDoc: subDocument\n })\n this.initSyncEvent(subDocument)\n component.loader.markAsLoaded()\n })\n return sharedComponent\n }\n\n const sharedState = this.createSharedMapByLocalMap(component.state as ProxyModel<Record<string, any>>)\n sharedComponent.set('state', sharedState)\n sharedComponent.set('type', 'sync')\n return sharedComponent\n }\n\n private createLocalComponentBySharedComponent(yMap: YMap<any>): Component {\n const componentName = yMap.get('name') as string\n const type = yMap.get('type') as string\n\n let instance: Component<any> | null\n if (type === 'async') {\n instance = this.registry.createComponentByData(componentName, {}, {})\n if (instance instanceof AsyncComponent) {\n const sharedMetadata = yMap.get('metadata') as YMap<any>\n this.syncSharedMapToLocalMap(sharedMetadata, instance.metadata)\n const loadedSubDocument = this.subModelLoader.getLoadedModelByComponent(instance)\n if (loadedSubDocument) {\n const state = loadedSubDocument.getMap('state')\n this.syncComponent(loadedSubDocument, state, instance!)\n this.addSubModelEvent.next({\n yType: state,\n yDoc: loadedSubDocument\n })\n instance.loader.markAsLoaded()\n return instance\n }\n\n const state = instance.state as ProxyModel<Record<string, any>>\n let isDestroyed = false\n instance.loader.onRequestLoad.toPromise().then(() => {\n return this.subModelLoader.loadSubModelByComponent(instance as AsyncComponent)\n })\n .then(subDocument => {\n if (isDestroyed) {\n return\n }\n const state = subDocument.getMap('state')\n this.syncComponent(subDocument, state, instance!)\n this.addSubModelEvent.next({\n yType: state,\n yDoc: subDocument\n })\n ;(instance as AsyncComponent).loader.markAsLoaded()\n })\n state.__changeMarker__.addDetachCallback(() => {\n isDestroyed = true\n })\n } else if (instance instanceof Component) {\n throw collaborateErrorFn(`component name \\`${componentName}\\` is not a async component.`)\n }\n } else {\n const sharedState = yMap.get('state') as YMap<any>\n const state = this.createLocalMapBySharedMap(sharedState)\n instance = this.registry.createComponentByData(componentName, state)\n }\n if (instance) {\n return instance\n }\n\n throw collaborateErrorFn(`cannot find component factory \\`${componentName}\\`.`)\n }\n\n /**\n * 双向同步数组\n * @param sharedArray\n * @param localArray\n * @private\n */\n private syncArray(sharedArray: YArray<any>, localArray: ProxyModel<any[]>) {\n function logError(type: string) {\n console.error(collaborateErrorFn(`${type} error, length exceeded, path in ${localArray.__changeMarker__.getPaths().join('/')}`))\n }\n\n const sub = localArray.__changeMarker__.onSelfChange.subscribe((actions) => {\n this.runLocalUpdate(sharedArray.doc, !localArray.__changeMarker__.irrevocableUpdate, () => {\n let index = 0\n for (const action of actions) {\n switch (action.type) {\n case 'retain':\n index = action.offset\n break\n case 'insert': {\n const ref = action.ref\n if (!Array.isArray(ref)) {\n throw collaborateErrorFn('The insertion action must have a reference value.')\n }\n const data = ref.map(item => {\n return this.createSharedModelByLocalModel(item)\n })\n if (index <= sharedArray.length) {\n sharedArray.insert(index, data)\n } else {\n sharedArray.insert(sharedArray.length, data)\n logError('insert')\n }\n }\n break\n case 'delete':\n if (action.count <= 0) {\n break\n }\n if (index < sharedArray.length) {\n sharedArray.delete(index, action.count)\n } else {\n logError('delete')\n }\n break\n case 'setIndex':\n if (action.index < sharedArray.length) {\n sharedArray.delete(action.index, 1)\n sharedArray.insert(action.index, [this.createSharedModelByLocalModel(action.ref)])\n } else {\n sharedArray.insert(sharedArray.length, [this.createSharedModelByLocalModel(action.ref)])\n logError('setIndex')\n }\n break\n }\n }\n })\n })\n\n const syncRemote = (ev: YArrayEvent<any>, tr: Transaction) => {\n this.runRemoteUpdate(tr, () => {\n let index = 0\n ev.delta.forEach((action) => {\n if (Reflect.has(action, 'retain')) {\n index += action.retain as number\n } else if (action.insert) {\n const data = (action.insert as Array<any>).map((item) => {\n return this.createLocalModelBySharedByModel(item)\n })\n localArray.splice(index, 0, ...data)\n index += data.length\n } else if (action.delete) {\n localArray.splice(index, action.delete)\n }\n })\n })\n }\n\n sharedArray.observe(syncRemote)\n localArray.__changeMarker__.addDetachCallback(() => {\n sub.unsubscribe()\n sharedArray.unobserve(syncRemote)\n })\n }\n\n /**\n * 双向同步对象\n * @param sharedObject\n * @param localObject\n * @private\n */\n private syncObject(sharedObject: YMap<any>, localObject: ProxyModel<Record<string, any>>) {\n const syncRemote = (ev: YMapEvent<any>, tr: Transaction) => {\n this.runRemoteUpdate(tr, () => {\n ev.changes.keys.forEach((item, key) => {\n if (item.action === 'add' || item.action === 'update') {\n const value = sharedObject.get(key)\n localObject[key] = this.createLocalModelBySharedByModel(value)\n } else {\n Reflect.deleteProperty(localObject, key)\n }\n })\n })\n }\n\n sharedObject.observe(syncRemote)\n\n const sub = localObject.__changeMarker__.onSelfChange.subscribe((actions) => {\n this.runLocalUpdate(sharedObject.doc, !localObject.__changeMarker__.irrevocableUpdate, () => {\n for (const action of actions) {\n switch (action.type) {\n case 'propSet': {\n const subModel = this.createSharedModelByLocalModel(action.ref)\n sharedObject.set(action.key, subModel)\n if (sharedObject.size === 0) {\n // 奇怪的 bug,设置了子模型,但子模型会标记为 deleted,导致设置后无效\n console.error(collaborateErrorFn(`prop set error, key is ${action.key}`))\n }\n }\n break\n case 'propDelete':\n sharedObject.delete(action.key)\n break\n }\n }\n })\n })\n\n localObject.__changeMarker__.addDetachCallback(function () {\n sharedObject.unobserve(syncRemote)\n sub.unsubscribe()\n })\n }\n\n private runLocalUpdate(yDoc: YDoc | null, record: boolean, fn: () => void) {\n if (this.updateFromRemote || !yDoc) {\n return\n }\n let changeList = this.updateRemoteActions.get(yDoc)\n if (!changeList) {\n changeList = []\n this.updateRemoteActions.set(yDoc, changeList)\n }\n changeList.push({\n record,\n action: fn\n })\n }\n\n private runRemoteUpdate(tr: Transaction, fn: () => void) {\n if (tr.origin === tr.doc) {\n return\n }\n this.updateFromRemote = true\n if (tr.origin instanceof UndoManager) {\n this.scheduler.historyApplyTransact(fn)\n } else {\n this.scheduler.remoteUpdateTransact(fn)\n }\n this.updateFromRemote = false\n }\n}\n\nfunction remoteFormatsToLocal(registry: Registry, attrs?: any,) {\n const formats: Formats = []\n if (attrs) {\n Object.keys(attrs).forEach(key => {\n const formatter = registry.getFormatter(key)\n if (formatter) {\n formats.push([formatter, attrs[key]])\n }\n })\n }\n return formats\n}\n","import { Observable, Subject } from '@tanbo/stream'\nimport { Textbus } from '@textbus/core'\n\nexport interface Message<T> {\n clientId: number\n message: T\n}\n\n/**\n * 协作消息总线,用于同步各终端消息\n */\nexport abstract class MessageBus<T> {\n onSync: Observable<void>\n protected syncEvent = new Subject<void>()\n\n constructor() {\n this.onSync = this.syncEvent.asObservable()\n }\n\n /**\n * 立即同步消息\n */\n sync() {\n this.syncEvent.next()\n }\n\n /**\n * 当需要同步协作消息是,Textbus 会自动调用,并把返回数据同步到其它终端\n */\n abstract get(textbus: Textbus): T\n\n /**\n * 当远程消息更新时,Textbus 会自动调用\n * @param message\n * @param textbus\n */\n abstract consume(message: Message<T>[], textbus: Textbus): void\n}\n","import { AbstractType, Item, UndoManager, Doc as YDoc } from 'yjs'\nimport { Inject, Injectable, Optional } from '@viewfly/core'\nimport { Observable, Subject, Subscription } from '@tanbo/stream'\nimport { History, HISTORY_STACK_SIZE, RootComponentRef, Scheduler } from '@textbus/core'\n\nimport { Collaborate, CollaborateHistorySelectionPosition, CursorPosition } from './collaborate'\nimport { CustomUndoManagerConfig } from './collab-history'\n\ninterface HistoryStackItem extends CollaborateHistorySelectionPosition {\n undoManagers: UndoManager[]\n}\n\n@Injectable()\nexport class MultipleDocCollabHistory implements History {\n onChange: Observable<void>\n onBack: Observable<void>\n onForward: Observable<void>\n onPush: Observable<void>\n\n get canBack() {\n return this.actionStack.length > 0 && this.index > 0\n }\n\n get canForward() {\n return this.actionStack.length > 0 && this.index < this.actionStack.length\n }\n\n isListen = false\n\n private changeEvent = new Subject<void>()\n private backEvent = new Subject<void>()\n private forwardEvent = new Subject<void>()\n private pushEvent = new Subject<void>()\n private actionStack: HistoryStackItem[] = []\n\n private index = 0\n\n private stackItem: HistoryStackItem | null = null\n private timer: any = null\n private beforePosition: CursorPosition | null = null\n\n private subscription = new Subscription()\n\n private subDocs = new Set<AbstractType<any>>()\n\n private listenerCaches = new Set<UndoManager>()\n\n constructor(private collaborate: Collaborate,\n private scheduler: Scheduler,\n private rootComponentRef: RootComponentRef,\n @Inject(HISTORY_STACK_SIZE) private stackSize: number,\n @Optional() private undoManagerConfig: CustomUndoManagerConfig) {\n this.onChange = this.changeEvent.asObservable()\n this.onBack = this.backEvent.asObservable()\n this.onForward = this.forwardEvent.asObservable()\n this.onPush = this.pushEvent.asObservable()\n }\n\n listen() {\n this.isListen = true\n const root = this.collaborate.yDoc.getMap('RootComponent')\n const rootComponent = this.rootComponentRef.component!\n this.collaborate.syncRootComponent(this.collaborate.yDoc, root, rootComponent)\n\n this.listenItem(root, this.collaborate.yDoc)\n\n this.subscription.add(\n this.collaborate.onAddSubModel.subscribe(({ yType, yDoc }) => {\n if (this.subDocs.has(yType)) {\n return\n }\n this.subDocs.add(yType)\n if (this.isListen) {\n this.listenItem(yType, yDoc)\n }\n }),\n this.scheduler.onLocalChangeBefore.subscribe(() => {\n this.beforePosition = this.collaborate.getRelativeCursorLocation()\n })\n )\n }\n\n forward() {\n if (!this.canForward) {\n return\n }\n clearTimeout(this.timer as any)\n const item = this.actionStack[this.index]\n if (item) {\n for (const i of item.undoManagers) {\n i.redo()\n }\n this.collaborate.restoreCursorPosition(item.after)\n }\n this.index++\n this.forwardEvent.next()\n this.changeEvent.next()\n }\n\n back() {\n if (!this.canBack) {\n return\n }\n clearTimeout(this.timer as any)\n let historyStackItem: HistoryStackItem\n if (this.stackItem) {\n historyStackItem = this.stackItem\n this.stackItem = null\n } else {\n this.index--\n historyStackItem = this.actionStack[this.index]\n }\n let len = historyStackItem.undoManagers.length\n while (len > 0) {\n len--\n historyStackItem.undoManagers[len].undo()\n }\n if (historyStackItem) {\n const beforePosition = historyStackItem.before\n this.collaborate.restoreCursorPosition(beforePosition)\n this.backEvent.next()\n this.changeEvent.next()\n }\n }\n\n clear() {\n this.actionStack = []\n this.stackItem = null\n this.index = 0\n this.beforePosition = null\n clearTimeout(this.timer as any)\n this.listenerCaches.forEach((undoManager) => {\n undoManager.clear()\n })\n this.changeEvent.next()\n }\n\n destroy() {\n this.clear()\n this.beforePosition = this.stackItem = null\n this.subscription.unsubscribe()\n this.listenerCaches.forEach((undoManager) => {\n undoManager.destroy()\n })\n this.subDocs.clear()\n this.listenerCaches.clear()\n }\n\n private listenItem(yType: AbstractType<any>, yDoc: YDoc) {\n const undoManagerConfig = this.undoManagerConfig || {}\n const undoManager = new UndoManager(yType, {\n trackedOrigins: new Set([yDoc]),\n captureTimeout: 0,\n captureTransaction(arg) {\n if (undoManagerConfig.captureTransaction) {\n return undoManagerConfig.captureTransaction(arg)\n }\n return true\n },\n deleteFilter(item: Item) {\n if (undoManagerConfig.deleteFilter) {\n return undoManagerConfig.deleteFilter(item)\n }\n return true\n }\n })\n\n undoManager.on('stack-item-added', (event: any) => {\n if (event.type === 'undo' && !(event.origin instanceof UndoManager)) {\n if (this.index != this.actionStack.length) {\n const redoStack = this.actionStack.slice(this.index)\n redoStack.forEach(item => {\n item.undoManagers.forEach(i => {\n i.clear(false, true)\n })\n })\n this.actionStack.length = this.index\n this.changeEvent.next()\n }\n if (this.stackItem === null) {\n this.stackItem = {\n before: this.beforePosition,\n after: null,\n undoManagers: []\n }\n this.timer = setTimeout(() => {\n if (this.actionStack.length >= this.stackSize) {\n this.actionStack.shift()\n } else {\n this.index++\n }\n // this.beforePosition = this.collaborate.getRelativeCursorLocation()\n this.stackItem!.after = this.beforePosition\n this.actionStack.push(this.stackItem!)\n this.stackItem = null\n this.pushEvent.next()\n this.changeEvent.next()\n }, 500)\n }\n\n this.stackItem.undoManagers.push(undoManager)\n }\n })\n\n this.listenerCaches.add(undoManager)\n }\n}\n","import { Doc, Doc as YDoc } from 'yjs'\nimport { Injectable } from '@viewfly/core'\nimport { AsyncComponent, AsyncSlot, makeError } from '@textbus/core'\n\nconst subModelLoaderErrorFn = makeError('subModelLoaderError')\n\n/**\n * 子文档加载器\n */\nexport abstract class SubModelLoader {\n /**\n * 通过插槽获取已加载的文档\n * @param slot\n */\n abstract getLoadedModelBySlot(slot: AsyncSlot): YDoc | null\n\n /**\n * 通过组件获取已加载的文档\n * @param component\n */\n abstract getLoadedModelByComponent(component: AsyncComponent): YDoc | null\n\n /**\n * 当本地新增异步子插槽时调用\n * @param slot\n */\n abstract createSubModelBySlot(slot: AsyncSlot): Promise<YDoc>\n\n /**\n * 当本地新增异步子组件时调用\n * @param component\n */\n abstract createSubModelByComponent(component: AsyncComponent): Promise<YDoc>\n\n /**\n * 当远程异步子插槽同步到本地时调用\n * @param slot\n */\n abstract loadSubModelBySlot(slot: AsyncSlot): Promise<YDoc>\n\n /**\n * 当远程异步子组件同步到本地时调用\n * @param component\n */\n abstract loadSubModelByComponent(component: AsyncComponent): Promise<YDoc>\n}\n\n@Injectable()\nexport class NonSubModelLoader extends SubModelLoader {\n createSubModelBySlot(): Promise<Doc> {\n throw subModelLoaderErrorFn('single document does not support async slot.')\n }\n\n createSubModelByComponent(): Promise<Doc> {\n throw subModelLoaderErrorFn('single document does not support async component.')\n }\n\n loadSubModelByComponent(): Promise<Doc> {\n throw subModelLoaderErrorFn('single document does not support async component.')\n }\n\n loadSubModelBySlot(): Promise<Doc> {\n throw subModelLoaderErrorFn('single document does not support async slot.')\n }\n\n getLoadedModelBySlot(): Doc {\n throw subModelLoaderErrorFn('single document does not support async slot.')\n }\n\n getLoadedModelByComponent(): Doc {\n throw subModelLoaderErrorFn('single document does not support async component.')\n }\n}\n","import { Observable, Subject } from '@tanbo/stream'\n\n/**\n * 协作通信通用接口\n */\nexport abstract class SyncConnector {\n /**\n * 当文档加载完成时触发的观察者\n */\n onLoad: Observable<void>\n /**\n * 当文档 awareness 状态变更时触发的观察者\n */\n onStateChange: Observable<any[]>\n\n protected loadEvent = new Subject<void>()\n protected stateChangeEvent = new Subject<any[]>()\n\n protected constructor() {\n this.onLoad = this.loadEvent.asObservable()\n this.onStateChange = this.stateChangeEvent.asObservable()\n }\n\n /**\n * 设置 awareness 状态\n * @param key 状态的 key\n * @param data 状态值\n */\n abstract setLocalStateField(key: string, data: Record<string, any>): void\n\n /**\n * 当文档销毁时调用\n */\n abstract onDestroy(): void\n}\n","import { HocuspocusProvider } from '@hocuspocus/provider'\nimport { HocuspocusProviderConfiguration } from '@hocuspocus/provider'\n\nimport { SyncConnector } from '../base/sync-connector'\nimport { Message } from '../base/message-bus'\n\nexport class HocuspocusConnector extends SyncConnector {\n provide: HocuspocusProvider\n\n constructor(config: HocuspocusProviderConfiguration) {\n super()\n this.provide = new HocuspocusProvider({\n ...config,\n onSynced: (data) => {\n config.onSynced?.(data)\n this.loadEvent.next()\n },\n onAwarenessUpdate: (data) => {\n config.onAwarenessUpdate?.(data)\n const states: Message<any>[] = data.states.map(state => {\n return {\n clientId: state.clientId,\n message: state.message as any\n }\n })\n this.stateChangeEvent.next(states)\n },\n })\n }\n\n setLocalStateField(key: string, data: Record<string, any>) {\n this.provide.setAwarenessField(key, data)\n }\n\n onDestroy() {\n this.provide.disconnect()\n this.provide.destroy()\n }\n}\n","import { Doc as YDoc } from 'yjs'\nimport { WebsocketProvider } from 'y-websocket'\n\nimport { SyncConnector } from '../base/sync-connector'\nimport { Message } from '../base/message-bus'\n\nexport class YWebsocketConnector extends SyncConnector {\n provide: WebsocketProvider\n\n private onSync = (is: boolean) => {\n if (is) {\n this.loadEvent.next()\n }\n }\n\n private onUpdate = () => {\n const syncStates: Message<any>[] = []\n this.provide.awareness.getStates().forEach((state, id) => {\n syncStates.push({\n clientId: id,\n message: state.message,\n })\n })\n this.stateChangeEvent.next(syncStates)\n }\n\n constructor(url: string, roomName: string, yDoc: YDoc) {\n super()\n this.onLoad = this.loadEvent.asObservable()\n this.onStateChange = this.stateChangeEvent.asObservable()\n this.provide = new WebsocketProvider(url, roomName, yDoc)\n\n this.provide.once('sync', this.onSync)\n this.provide.awareness.on('update', this.onUpdate)\n }\n\n setLocalStateField(key: string, data: Record<string, any>) {\n this.provide.awareness.setLocalStateField(key, data)\n }\n\n onDestroy() {\n this.provide.awareness.off('update', this.onUpdate)\n this.provide.disconnect()\n this.provide.destroy()\n }\n}\n","import { History, Module, Selection, Textbus } from '@textbus/core'\nimport { Subscription } from '@tanbo/stream'\nimport { Provider } from '@viewfly/core'\nimport { Doc as YDoc } from 'yjs'\n\nimport { CollabHistory, Collaborate, MessageBus, NonSubModelLoader, SubModelLoader, SyncConnector } from './base/_api'\n\nexport interface CollaborateConfig {\n createConnector(yDoc: YDoc): SyncConnector\n\n onlyLoad?: boolean\n}\n\nexport class CollaborateModule implements Module {\n private subscription = new Subscription()\n providers: Provider[] = [\n Collaborate,\n CollabHistory,\n {\n provide: History,\n useExisting: CollabHistory\n }, {\n provide: SyncConnector,\n useFactory: (collab: Collaborate) => {\n return this.config.createConnector(collab.yDoc)\n },\n deps: [Collaborate]\n }, {\n provide: SubModelLoader,\n useClass: NonSubModelLoader\n }\n ]\n\n private timer: any = null\n\n constructor(public config: CollaborateConfig) {\n }\n\n setup(textbus: Textbus): Promise<(() => void) | void> | (() => void) | void {\n const messageBus = textbus.get(MessageBus, null)\n const connector = textbus.get(SyncConnector)\n const collab = textbus.get(Collaborate)\n if (messageBus) {\n const selection = textbus.get(Selection)\n connector.setLocalStateField('message', messageBus.get(textbus))\n this.subscription.add(\n messageBus.onSync.subscribe(() => {\n connector.setLocalStateField('message', messageBus.get(textbus))\n }),\n selection.onChange.subscribe(() => {\n connector.setLocalStateField('message', messageBus.get(textbus))\n }),\n connector.onStateChange.subscribe((states) => {\n messageBus.consume(states, textbus)\n })\n )\n }\n\n return connector.onLoad.toPromise().then(() => {\n if (!this.config.onlyLoad) {\n return\n }\n const root = collab.yDoc.getMap('RootComponent')\n if (root.has('state')) {\n return\n }\n return new Promise(resolve => {\n const testing = () => {\n if (root.has('state')) {\n resolve()\n } else {\n this.timer = setTimeout(testing, 1000)\n }\n }\n this.timer = setTimeout(testing, 1000)\n })\n })\n }\n\n onDestroy(textbus: Textbus) {\n this.subscription.unsubscribe()\n textbus.get(Collaborate).destroy()\n textbus.get(History).destroy()\n textbus.get(SyncConnector).onDestroy()\n clearTimeout(this.timer)\n }\n}\n","import { History, Module, Selection, Textbus } from '@textbus/core'\nimport { Provider } from '@viewfly/core'\nimport { Subscription } from '@tanbo/stream'\n\nimport { Collaborate, SyncConnector, MultipleDocCollabHistory, SubModelLoader, MessageBus } from './base/_api'\nimport { CollaborateConfig } from './collaborate-module'\n\nexport interface MultipleDocCollaborateConfig extends CollaborateConfig {\n subModelLoader: SubModelLoader\n}\n\nexport class MultipleDocumentCollaborateModule implements Module {\n private subscription = new Subscription()\n providers: Provider[] = [\n Collaborate,\n MultipleDocCollabHistory,\n {\n provide: History,\n useExisting: MultipleDocCollabHistory\n }, {\n provide: SyncConnector,\n useFactory: (collab: Collaborate) => {\n return this.config.createConnector(collab.yDoc)\n },\n deps: [Collaborate]\n }, {\n provide: SubModelLoader,\n useFactory: () => {\n return this.config.subModelLoader\n }\n }\n ]\n\n private timer: any = null\n\n constructor(public config: MultipleDocCollaborateConfig) {\n }\n\n setup(textbus: Textbus): Promise<(() => void) | void> | (() => void) | void {\n const messageBus = textbus.get(MessageBus, null)\n const connector = textbus.get(SyncConnector)\n const collab = textbus.get(Collaborate)\n if (messageBus) {\n const selection = textbus.get(Selection)\n connector.setLocalStateField('message', messageBus.get(textbus))\n this.subscription.add(\n messageBus.onSync.subscribe(() => {\n connector.setLocalStateField('message', messageBus.get(textbus))\n }),\n selection.onChange.subscribe(() => {\n connector.setLocalStateField('message', messageBus.get(textbus))\n }),\n connector.onStateChange.subscribe((states) => {\n messageBus.consume(states, textbus)\n })\n )\n }\n return connector.onLoad.toPromise().then(() => {\n if (!this.config.onlyLoad) {\n return\n }\n const root = collab.yDoc.getMap('RootComponent')\n if (root.has('state')) {\n return\n }\n return new Promise(resolve => {\n const testing = () => {\n if (root.has('state')) {\n resolve()\n } else {\n this.timer = setTimeout(testing, 1000)\n }\n }\n this.timer = setTimeout(testing, 1000)\n })\n })\n }\n\n onDestroy(textbus: Textbus) {\n this.subscription.unsubscribe()\n textbus.get(Collaborate).destroy()\n textbus.get(History).destroy()\n textbus.get(SyncConnector).onDestroy()\n clearTimeout(this.timer)\n }\n}\n"],"names":["CustomUndoManagerConfig","collabHistoryErrorFn","makeError","CollabHistory","rootComponentRef","collaborate","scheduler","stackSize","undoManagerConfig","Subject","root","rootComponent","manager","UndoManager","arg","item","beforePosition","event","ev","index","position","p","last","i","__decorateClass","Injectable","__decorateParam","HISTORY_STACK_SIZE","Optional","collaborateErrorFn","SlotMap","key","value","Slot","v","Collaborate","registry","selection","subModelLoader","YDoc","yDoc","sharedComponent","localComponent","sharedSlot","localSlot","anchorPosition","createAbsolutePositionFromRelativePosition","focusPosition","focusSlot","anchorSlot","anchorOffset","focusOffset","anchorYText","createRelativePositionFromTypeIndex","focusYText","map","ChangeOrigin","filter","updates","update","updateRemoteActions","fn","state","YMap","syncRemote","tr","change","updateType","attribute","action","formats","remoteFormatsToLocal","length","component","sub","actions","offset","keys","delta","isEmpty","sharedMap","localMap","observe","sharedArray","localArray","YArray","YText","isAsyncSlot","AsyncSlot","isDestroyed","sharedMetadata","subDocument","content","sharedSlotState","sharedContent","type","schema","metadata","slot","loadedSubDocument","subContent","data","attrs","localModel","sharedModel","AsyncComponent","sharedState","yMap","componentName","instance","Component","logError","ref","sharedObject","localObject","subModel","record","changeList","formatter","MessageBus","MultipleDocCollabHistory","Subscription","yType","historyStackItem","len","undoManager","subModelLoaderErrorFn","SubModelLoader","NonSubModelLoader","SyncConnector","HocuspocusConnector","config","HocuspocusProvider","states","YWebsocketConnector","is","syncStates","id","url","roomName","WebsocketProvider","CollaborateModule","History","collab","textbus","messageBus","connector","Selection","resolve","testing","MultipleDocumentCollaborateModule"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.esm.js","sources":["../src/base/collab-history.ts","../src/base/collaborate.ts","../src/base/message-bus.ts","../src/base/multiple-doc-collab-history.ts","../src/base/sub-model-loader.ts","../src/base/sync-connector.ts","../src/connectors/hocuspocus-connector.ts","../src/connectors/y-websocket-connector.ts","../src/collaborate-module.ts","../src/multiple-document-collaborate-module.ts"],"sourcesContent":["import { Inject, Injectable, Optional } from '@viewfly/core'\nimport { History, HISTORY_STACK_SIZE, makeError, RootComponentRef, Scheduler } from '@textbus/core'\nimport { Observable, Subject, Subscription } from '@tanbo/stream'\nimport {\n Item,\n Transaction,\n UndoManager\n} from 'yjs'\n\nimport { Collaborate, CollaborateHistorySelectionPosition, CursorPosition } from './collaborate'\n\nexport abstract class CustomUndoManagerConfig {\n abstract captureTransaction?(arg0: Transaction): boolean\n\n abstract deleteFilter?(arg0: Item): boolean\n}\n\nconst collabHistoryErrorFn = makeError('CollabHistory')\n\n@Injectable()\nexport class CollabHistory implements History {\n onBack: Observable<void>\n onForward: Observable<void>\n onChange: Observable<void>\n onPush: Observable<void>\n\n get canBack() {\n return this.manager?.canUndo() || false\n }\n\n get canForward() {\n return this.manager?.canRedo() || false\n }\n\n private manager: UndoManager | null = null\n\n private historyItems: Array<CollaborateHistorySelectionPosition> = []\n private index = 0\n private subscriptions: Subscription[] = []\n\n private backEvent = new Subject<void>()\n private forwardEvent = new Subject<void>()\n private changeEvent = new Subject<void>()\n private pushEvent = new Subject<void>()\n\n constructor(private rootComponentRef: RootComponentRef,\n private collaborate: Collaborate,\n private scheduler: Scheduler,\n @Inject(HISTORY_STACK_SIZE) private stackSize: number,\n @Optional() private undoManagerConfig: CustomUndoManagerConfig) {\n this.onBack = this.backEvent.asObservable()\n this.onForward = this.forwardEvent.asObservable()\n this.onChange = this.changeEvent.asObservable()\n this.onPush = this.pushEvent.asObservable()\n\n }\n\n listen() {\n const root = this.collaborate.yDoc.getMap('RootComponent')\n const rootComponent = this.rootComponentRef.component!\n this.collaborate.syncRootComponent(this.collaborate.yDoc, root, rootComponent)\n\n const undoManagerConfig = this.undoManagerConfig || {}\n const manager = new UndoManager(root, {\n trackedOrigins: new Set<any>([this.collaborate.yDoc]),\n captureTransaction(arg) {\n if (undoManagerConfig.captureTransaction) {\n return undoManagerConfig.captureTransaction(arg)\n }\n return true\n },\n deleteFilter(item: Item) {\n if (undoManagerConfig.deleteFilter) {\n return undoManagerConfig.deleteFilter(item)\n }\n return true\n }\n })\n this.manager = manager\n\n let beforePosition: CursorPosition | null = null\n this.subscriptions.push(\n this.scheduler.onLocalChangeBefore.subscribe(() => {\n beforePosition = this.collaborate.getRelativeCursorLocation()\n }),\n this.collaborate.onAddSubModel.subscribe(() => {\n throw collabHistoryErrorFn('single document does not support submodels.')\n })\n )\n\n manager.on('stack-item-added', (event: any) => {\n if (event.type === 'undo') {\n if (event.origin === manager) {\n this.index++\n } else {\n this.historyItems.length = this.index\n this.historyItems.push({\n before: beforePosition,\n after: this.collaborate.getRelativeCursorLocation()\n })\n this.index++\n }\n } else {\n this.index--\n }\n if (manager.undoStack.length > this.stackSize) {\n this.historyItems.shift()\n manager.undoStack.shift()\n }\n if (event.origin === this.collaborate.yDoc) {\n this.pushEvent.next()\n }\n this.changeEvent.next()\n })\n manager.on('stack-item-popped', (ev: any) => {\n const index = ev.type === 'undo' ? this.index : this.index - 1\n const position = this.historyItems[index] || null\n const p = ev.type === 'undo' ? position?.before : position?.after\n this.collaborate.restoreCursorPosition(p)\n })\n }\n\n\n back() {\n if (this.canBack) {\n this.manager?.undo()\n this.backEvent.next()\n }\n }\n\n forward() {\n if (this.canForward) {\n this.manager?.redo()\n this.forwardEvent.next()\n }\n }\n\n clear() {\n const last = this.historyItems.pop()\n this.historyItems = last ? [last] : []\n this.index = last ? 1 : 0\n this.manager?.clear()\n this.changeEvent.next()\n }\n\n destroy() {\n this.index = 0\n this.historyItems = []\n this.subscriptions.forEach(i => i.unsubscribe())\n if (this.manager) {\n this.manager.destroy()\n this.manager.captureTransaction = () => true\n this.manager.deleteFilter = () => true\n this.manager.trackedOrigins = new Set([null])\n }\n\n this.manager = null\n }\n}\n","import { Injectable } from '@viewfly/core'\nimport { filter, map, Observable, Subject, Subscription } from '@tanbo/stream'\nimport {\n ChangeOrigin,\n Component,\n Registry,\n Formats,\n makeError,\n Scheduler,\n Selection,\n Slot,\n AsyncSlot,\n AsyncComponent,\n AbstractSelection,\n observe,\n ProxyModel\n} from '@textbus/core'\nimport {\n AbstractType,\n Array as YArray, createAbsolutePositionFromRelativePosition, createRelativePositionFromTypeIndex,\n Doc as YDoc,\n Map as YMap,\n RelativePosition,\n Text as YText,\n Transaction,\n UndoManager,\n YArrayEvent,\n YMapEvent,\n YTextEvent\n} from 'yjs'\n\nimport { SubModelLoader } from './sub-model-loader'\n\nexport interface RelativePositionRecord {\n doc: YDoc,\n position: RelativePosition\n}\n\nexport interface CursorPosition {\n anchor: RelativePositionRecord\n focus: RelativePositionRecord\n}\n\nexport interface CollaborateHistorySelectionPosition {\n before: CursorPosition | null\n after: CursorPosition | null\n}\n\nconst collaborateErrorFn = makeError('Collaborate')\n\nclass SlotMap {\n private slotAndYTextMap = new WeakMap<Slot, YText>()\n private yTextAndSlotMap = new WeakMap<YText, Slot>()\n\n set(key: Slot, value: YText): void\n set(key: YText, value: Slot): void\n set(key: any, value: any) {\n if (key instanceof Slot) {\n this.slotAndYTextMap.set(key, value)\n this.yTextAndSlotMap.set(value, key)\n } else {\n this.slotAndYTextMap.set(value, key)\n this.yTextAndSlotMap.set(key, value)\n }\n }\n\n get(key: Slot): YText | null\n get(key: YText): Slot | null\n get(key: any) {\n if (key instanceof Slot) {\n return this.slotAndYTextMap.get(key) || null\n }\n return this.yTextAndSlotMap.get(key) || null\n }\n\n delete(key: Slot | YText) {\n if (key instanceof Slot) {\n const v = this.slotAndYTextMap.get(key)\n this.slotAndYTextMap.delete(key)\n if (v) {\n this.yTextAndSlotMap.delete(v)\n }\n } else {\n const v = this.yTextAndSlotMap.get(key)\n this.yTextAndSlotMap.delete(key)\n if (v) {\n this.slotAndYTextMap.delete(v)\n }\n }\n }\n}\n\ninterface Update {\n record: boolean\n actions: Array<() => void>\n}\n\ninterface UpdateItem {\n record: boolean\n\n action(): void\n}\n\nexport interface SubModelLoaded {\n yType: AbstractType<any>\n yDoc: YDoc\n}\n\n@Injectable()\nexport class Collaborate {\n yDoc = new YDoc()\n slotMap = new SlotMap()\n onAddSubModel: Observable<SubModelLoaded>\n\n private subscriptions: Subscription[] = []\n private updateFromRemote = false\n private addSubModelEvent = new Subject<SubModelLoaded>()\n\n private updateRemoteActions = new WeakMap<YDoc, UpdateItem[]>()\n private noRecord = {}\n\n constructor(private scheduler: Scheduler,\n private registry: Registry,\n private selection: Selection,\n private subModelLoader: SubModelLoader) {\n this.onAddSubModel = this.addSubModelEvent.asObservable()\n }\n\n syncRootComponent(yDoc: YDoc, sharedComponent: YMap<any>, localComponent: Component<any>) {\n this.initSyncEvent(yDoc)\n this.syncComponent(yDoc, sharedComponent, localComponent)\n }\n\n syncRootSlot(yDoc: YDoc, sharedSlot: YText, localSlot: Slot) {\n if (sharedSlot.length) {\n localSlot.retain(0)\n localSlot.delete(localSlot.length)\n localSlot.cleanAttributes()\n localSlot.cleanFormats()\n this.initLocalSlotBySharedSlot(sharedSlot, localSlot)\n } else {\n yDoc.transact(() => {\n this.initSharedSlotByLocalSlot(sharedSlot, localSlot)\n })\n }\n this.initSyncEvent(yDoc)\n this.syncSlot(sharedSlot, localSlot)\n }\n\n getAbstractSelection(position: CursorPosition): AbstractSelection | null {\n const anchorPosition = createAbsolutePositionFromRelativePosition(position.anchor.position, position.anchor.doc)\n const focusPosition = createAbsolutePositionFromRelativePosition(position.focus.position, position.focus.doc)\n if (anchorPosition && focusPosition) {\n const focusSlot = this.slotMap.get(focusPosition.type as YText)\n const anchorSlot = this.slotMap.get(anchorPosition.type as YText)\n if (focusSlot && anchorSlot) {\n return {\n anchorSlot,\n anchorOffset: anchorPosition.index,\n focusSlot,\n focusOffset: focusPosition.index\n }\n }\n }\n return null\n }\n\n getRelativeCursorLocation(): CursorPosition | null {\n const { anchorSlot, anchorOffset, focusSlot, focusOffset } = this.selection\n if (anchorSlot) {\n const anchorYText = this.slotMap.get(anchorSlot)\n if (anchorYText) {\n const anchorPosition = createRelativePositionFromTypeIndex(anchorYText, anchorOffset!)\n if (focusSlot) {\n const focusYText = this.slotMap.get(focusSlot)\n if (focusYText) {\n const focusPosition = createRelativePositionFromTypeIndex(focusYText, focusOffset!)\n return {\n focus: {\n doc: focusYText.doc!,\n position: focusPosition\n },\n anchor: {\n doc: anchorYText.doc!,\n position: anchorPosition\n }\n }\n }\n }\n }\n }\n return null\n }\n\n restoreCursorPosition(position: CursorPosition | null) {\n if (!position) {\n this.selection.unSelect()\n return\n }\n const selection = this.getAbstractSelection(position)\n if (selection) {\n this.selection.setBaseAndExtent(\n selection.anchorSlot,\n selection.anchorOffset,\n selection.focusSlot,\n selection.focusOffset)\n }\n }\n\n private initSyncEvent(yDoc: YDoc) {\n this.subscriptions.push(\n this.scheduler.onDocChanged.pipe(\n map(item => {\n return item.filter(i => {\n return i.from !== ChangeOrigin.Remote\n })\n }),\n filter(item => {\n return item.length\n })\n ).subscribe(() => {\n const updates: Update[] = []\n\n let update: Update | null = null\n\n const updateRemoteActions = this.updateRemoteActions.get(yDoc) || []\n\n for (const item of updateRemoteActions) {\n if (!update) {\n update = {\n record: item.record,\n actions: []\n }\n updates.push(update)\n }\n if (update.record === item.record) {\n update.actions.push(item.action)\n } else {\n update = {\n record: item.record,\n actions: [item.action]\n }\n updates.push(update)\n }\n }\n\n this.updateRemoteActions.delete(yDoc)\n\n for (const item of updates) {\n yDoc.transact(() => {\n item.actions.forEach(fn => {\n fn()\n })\n }, item.record ? yDoc : this.noRecord)\n }\n })\n )\n }\n\n private syncComponent(yDoc: YDoc, sharedComponent: YMap<any>, localComponent: Component<any>) {\n let state = sharedComponent.get('state') as YMap<any>\n if (!state) {\n state = new YMap<any>()\n this.syncLocalMapToSharedMap(localComponent.state as ProxyModel<Record<string, any>>, state)\n yDoc.transact(() => {\n sharedComponent.set('state', state)\n })\n } else {\n Object.keys(localComponent.state).forEach(key => {\n Reflect.deleteProperty(localComponent.state, key)\n })\n this.syncSharedMapToLocalMap(state, localComponent.state as ProxyModel<Record<string, any>>)\n }\n }\n\n private syncSlot(sharedSlot: YText, localSlot: Slot) {\n const syncRemote = (ev: YTextEvent, tr: Transaction) => {\n this.runRemoteUpdate(tr, () => {\n localSlot.retain(0)\n ev.keysChanged.forEach(key => {\n const change = ev.keys.get(key)\n if (!change) {\n return\n }\n const updateType = change.action\n if (updateType === 'update' || updateType === 'add') {\n const attribute = this.registry.getAttribute(key)\n if (attribute) {\n localSlot.setAttribute(attribute, sharedSlot.getAttribute(key))\n }\n } else if (updateType === 'delete') {\n const attribute = this.registry.getAttribute(key)\n if (attribute) {\n localSlot.removeAttribute(attribute)\n }\n }\n })\n ev.delta.forEach(action => {\n if (Reflect.has(action, 'retain')) {\n if (action.attributes) {\n const formats = remoteFormatsToLocal(this.registry, action.attributes)\n if (formats.length) {\n localSlot.retain(action.retain!, formats)\n }\n }\n localSlot.retain(localSlot.index + action.retain!)\n } else if (action.insert) {\n const index = localSlot.index\n let length = 1\n if (typeof action.insert === 'string') {\n length = action.insert.length\n localSlot.insert(action.insert, remoteFormatsToLocal(this.registry, action.attributes))\n } else {\n const sharedComponent = action.insert as YMap<any>\n const component = this.createLocalComponentBySharedComponent(sharedComponent)\n localSlot.insert(component)\n }\n if (this.selection.isSelected && !(tr.origin instanceof UndoManager)) {\n if (localSlot === this.selection.anchorSlot && this.selection.anchorOffset! > index) {\n this.selection.setAnchor(localSlot, this.selection.anchorOffset! + length)\n }\n if (localSlot === this.selection.focusSlot && this.selection.focusOffset! > index) {\n this.selection.setFocus(localSlot, this.selection.focusOffset! + length)\n }\n }\n } else if (action.delete) {\n const index = localSlot.index\n localSlot.delete(action.delete)\n if (this.selection.isSelected && !(tr.origin instanceof UndoManager)) {\n if (localSlot === this.selection.anchorSlot && this.selection.anchorOffset! >= index) {\n this.selection.setAnchor(localSlot, this.selection.startOffset! - action.delete)\n }\n if (localSlot === this.selection.focusSlot && this.selection.focusOffset! >= index) {\n this.selection.setFocus(localSlot, this.selection.focusOffset! - action.delete)\n }\n }\n }\n })\n })\n }\n sharedSlot.observe(syncRemote)\n\n const sub = localSlot.onContentChange.subscribe(actions => {\n this.runLocalUpdate(sharedSlot.doc, true, () => {\n let offset = 0\n let length = 0\n for (const action of actions) {\n if (action.type === 'retain') {\n const formats = action.formats\n if (formats) {\n const keys = Object.keys(formats)\n let length = keys.length\n keys.forEach(key => {\n const formatter = this.registry.getFormatter(key)\n if (!formatter) {\n length--\n Reflect.deleteProperty(formats, key)\n }\n })\n if (length) {\n sharedSlot.format(offset, action.offset, formats)\n }\n } else {\n offset = action.offset\n }\n } else if (action.type === 'contentInsert') {\n const delta = sharedSlot.toDelta()\n const isEmpty = delta.length === 1 && delta[0].insert === Slot.emptyPlaceholder\n if (typeof action.content === 'string') {\n length = action.content.length\n sharedSlot.insert(offset, action.content, action.formats || {})\n } else {\n length = 1\n const sharedComponent = this.createSharedComponentByLocalComponent(action.ref as Component)\n sharedSlot.insertEmbed(offset, sharedComponent, action.formats || {})\n }\n\n if (isEmpty && offset === 0) {\n sharedSlot.delete(sharedSlot.length - 1, 1)\n }\n offset += length\n } else if (action.type === 'delete') {\n const delta = sharedSlot.toDelta()\n if (sharedSlot.length) {\n sharedSlot.delete(offset, action.count)\n }\n if (sharedSlot.length === 0) {\n sharedSlot.insert(0, '\\n', delta[0]?.attributes)\n }\n } else if (action.type === 'attrSet') {\n sharedSlot.setAttribute(action.name, action.value)\n } else if (action.type === 'attrDelete') {\n sharedSlot.removeAttribute(action.name)\n }\n }\n })\n })\n\n this.slotMap.set(localSlot, sharedSlot)\n\n localSlot.__changeMarker__.addDetachCallback(() => {\n this.slotMap.delete(localSlot)\n sharedSlot.unobserve(syncRemote)\n sub.unsubscribe()\n })\n }\n\n\n destroy() {\n this.subscriptions.forEach(i => i.unsubscribe())\n this.subscriptions = []\n }\n\n private syncSharedMapToLocalMap(sharedMap: YMap<any>, localMap: ProxyModel<Record<string, any>>) {\n sharedMap.forEach((value, key) => {\n localMap[key] = this.createLocalModelBySharedByModel(value)\n })\n this.syncObject(sharedMap, localMap)\n }\n\n private createLocalMapBySharedMap(sharedMap: YMap<any>): ProxyModel<Record<string, any>> {\n const localMap = observe({}) as ProxyModel<Record<string, any>>\n this.syncSharedMapToLocalMap(sharedMap, localMap)\n return localMap\n }\n\n private createLocalArrayBySharedArray(sharedArray: YArray<any>): ProxyModel<any[]> {\n const localArray = observe<any[]>([]) as ProxyModel<any[]>\n localArray.push(...sharedArray.map(item => this.createLocalModelBySharedByModel(item)))\n this.syncArray(sharedArray, localArray)\n return localArray\n }\n\n private syncLocalMapToSharedMap(localMap: ProxyModel<Record<string, any>>, sharedMap: YMap<any>) {\n Object.entries(localMap).forEach(([key, value]) => {\n sharedMap.set(key, this.createSharedModelByLocalModel(value))\n })\n this.syncObject(sharedMap, localMap)\n }\n\n private createSharedMapByLocalMap(localMap: ProxyModel<Record<string, any>>): YMap<any> {\n const sharedMap = new YMap<any>()\n this.syncLocalMapToSharedMap(localMap, sharedMap)\n return sharedMap\n }\n\n private createSharedArrayByLocalArray(localArray: ProxyModel<any[]>): YArray<any> {\n const sharedArray = new YArray<any>()\n localArray.forEach(value => {\n sharedArray.push([this.createSharedModelByLocalModel(value)])\n })\n this.syncArray(sharedArray, localArray)\n return sharedArray\n }\n\n private createSharedSlotByLocalSlot(localSlot: Slot): YText {\n const sharedSlot = new YText()\n const isAsyncSlot = localSlot instanceof AsyncSlot\n sharedSlot.setAttribute('schema', [...localSlot.schema])\n sharedSlot.setAttribute('type', isAsyncSlot ? 'async' : 'sync')\n\n if (isAsyncSlot) {\n let isDestroyed = false\n const sharedMetadata = this.createSharedMapByLocalMap(localSlot.metadata)\n sharedSlot.setAttribute('metadata', sharedMetadata)\n this.subModelLoader.createSubModelBySlot(localSlot).then(subDocument => {\n if (isDestroyed) {\n return\n }\n const content = subDocument.getText('content')\n const state = subDocument.getMap('state')\n this.syncLocalMapToSharedMap(localSlot.state, state)\n this.initSharedSlotByLocalSlot(content, localSlot)\n this.syncSlot(content, localSlot)\n this.addSubModelEvent.next({\n yDoc: subDocument,\n yType: content\n })\n this.initSyncEvent(subDocument)\n localSlot.loader.markAsLoaded()\n })\n localSlot.__changeMarker__.addDetachCallback(() => {\n isDestroyed = true\n })\n return sharedSlot\n }\n\n const sharedSlotState = new YMap()\n this.syncLocalMapToSharedMap(localSlot.state as ProxyModel<Record<string, any>>, sharedSlotState)\n sharedSlot.setAttribute('state', sharedSlotState)\n\n const sharedContent = new YText()\n this.initSharedSlotByLocalSlot(sharedContent, localSlot)\n sharedSlot.insertEmbed(0, sharedContent)\n this.syncSlot(sharedContent, localSlot)\n return sharedSlot\n }\n\n private initSharedSlotByLocalSlot(sharedContent: YText, localSlot: Slot) {\n let offset = 0\n localSlot.toDelta().forEach(i => {\n let formats: any = {}\n if (i.formats) {\n i.formats.forEach(item => {\n formats[item[0].name] = item[1]\n })\n } else {\n formats = null\n }\n if (typeof i.insert === 'string') {\n sharedContent.insert(offset, i.insert, formats)\n } else {\n const sharedComponent = this.createSharedComponentByLocalComponent(i.insert)\n sharedContent.insertEmbed(offset, sharedComponent, formats)\n }\n offset += i.insert.length\n })\n localSlot.getAttributes().forEach(item => {\n sharedContent.setAttribute(item[0].name, item[1])\n })\n }\n\n private createLocalSlotBySharedSlot(sharedSlot: YText): Slot {\n const type = sharedSlot.getAttribute('type')\n const schema = sharedSlot.getAttribute('schema')\n\n if (type === 'async') {\n const metadata = sharedSlot.getAttribute('metadata') as YMap<any>\n const slot = new AsyncSlot(schema || [], {}, {})\n this.syncSharedMapToLocalMap(metadata, slot.metadata as ProxyModel<Record<string, any>>)\n const loadedSubDocument = this.subModelLoader.getLoadedModelBySlot(slot)\n if (loadedSubDocument) {\n const subContent = loadedSubDocument.getText('content')\n const data = loadedSubDocument.getMap('state')\n this.syncSharedMapToLocalMap(data, slot.state as ProxyModel<Record<string, any>>)\n this.syncRootSlot(loadedSubDocument, subContent, slot)\n this.addSubModelEvent.next({\n yDoc: loadedSubDocument,\n yType: subContent\n })\n slot.loader.markAsLoaded()\n return slot\n }\n let isDestroyed = false\n slot.loader.onRequestLoad.toPromise().then(() => {\n return this.subModelLoader.loadSubModelBySlot(slot)\n }).then(subDocument => {\n if (isDestroyed) {\n return\n }\n const subContent = subDocument.getText('content')\n const state = subDocument.getMap('state')\n this.syncSharedMapToLocalMap(state, slot.state as ProxyModel<Record<string, any>>)\n this.syncRootSlot(subDocument, subContent, slot)\n this.addSubModelEvent.next({\n yDoc: subDocument,\n yType: subContent\n })\n slot.loader.markAsLoaded()\n })\n slot.__changeMarker__.addDetachCallback(() => {\n isDestroyed = true\n })\n return slot\n }\n\n const contentDelta = sharedSlot.toDelta()\n const content = contentDelta[0]?.insert\n\n if (!(content instanceof YText)) {\n throw collaborateErrorFn('shared slot content type is not `YText`.')\n }\n\n const localSlot = new Slot(schema || [], {})\n\n const sharedSlotState = sharedSlot.getAttribute('state')\n this.syncSharedMapToLocalMap(sharedSlotState, localSlot.state as ProxyModel<Record<string, any>>)\n\n this.initLocalSlotBySharedSlot(content, localSlot)\n\n this.syncSlot(content, localSlot)\n return localSlot\n }\n\n private initLocalSlotBySharedSlot(content: YText, localSlot: Slot) {\n const delta = content.toDelta()\n\n const attrs = content.getAttributes()\n Object.keys(attrs).forEach(key => {\n const attribute = this.registry.getAttribute(key)\n if (attribute) {\n localSlot.setAttribute(attribute, attrs[key])\n }\n })\n for (const action of delta) {\n if (action.insert) {\n if (typeof action.insert === 'string') {\n const formats = remoteFormatsToLocal(this.registry, action.attributes)\n localSlot.insert(action.insert, formats)\n } else {\n const sharedComponent = action.insert as YMap<any>\n const component = this.createLocalComponentBySharedComponent(sharedComponent)\n localSlot.insert(component, remoteFormatsToLocal(this.registry, action.attributes))\n }\n } else {\n throw collaborateErrorFn('unexpected delta action.')\n }\n }\n }\n\n private createSharedModelByLocalModel(localModel: any) {\n if (localModel instanceof Slot) {\n return this.createSharedSlotByLocalSlot(localModel)\n }\n if (Array.isArray(localModel)) {\n return this.createSharedArrayByLocalArray(localModel as ProxyModel<any[]>)\n }\n if (typeof localModel === 'object' && localModel !== null) {\n return this.createSharedMapByLocalMap(localModel)\n }\n return localModel\n }\n\n private createLocalModelBySharedByModel(sharedModel: any) {\n if (sharedModel instanceof YMap) {\n return this.createLocalMapBySharedMap(sharedModel)\n }\n if (sharedModel instanceof YArray) {\n return this.createLocalArrayBySharedArray(sharedModel)\n }\n if (sharedModel instanceof YText) {\n return this.createLocalSlotBySharedSlot(sharedModel)\n }\n return sharedModel\n }\n\n\n private createSharedComponentByLocalComponent(component: Component | AsyncComponent): YMap<any> {\n const sharedComponent = new YMap()\n sharedComponent.set('name', component.name)\n\n if (component instanceof AsyncComponent) {\n sharedComponent.set('type', 'async')\n const sharedMetadata = this.createSharedMapByLocalMap(component.metadata)\n sharedComponent.set('metadata', sharedMetadata)\n const state = component.state as ProxyModel<Record<string, any>>\n let isDestroyed = false\n state.__changeMarker__.addDetachCallback(() => {\n isDestroyed = true\n })\n this.subModelLoader.createSubModelByComponent(component).then(subDocument => {\n if (isDestroyed) {\n return\n }\n const state = subDocument.getMap('state')\n this.syncComponent(subDocument, state, component)\n this.addSubModelEvent.next({\n yType: state,\n yDoc: subDocument\n })\n this.initSyncEvent(subDocument)\n component.loader.markAsLoaded()\n })\n return sharedComponent\n }\n\n const sharedState = this.createSharedMapByLocalMap(component.state as ProxyModel<Record<string, any>>)\n sharedComponent.set('state', sharedState)\n sharedComponent.set('type', 'sync')\n return sharedComponent\n }\n\n private createLocalComponentBySharedComponent(yMap: YMap<any>): Component {\n const componentName = yMap.get('name') as string\n const type = yMap.get('type') as string\n\n let instance: Component<any> | null\n if (type === 'async') {\n instance = this.registry.createComponentByData(componentName, {}, {})\n if (instance instanceof AsyncComponent) {\n const sharedMetadata = yMap.get('metadata') as YMap<any>\n this.syncSharedMapToLocalMap(sharedMetadata, instance.metadata)\n const loadedSubDocument = this.subModelLoader.getLoadedModelByComponent(instance)\n if (loadedSubDocument) {\n const state = loadedSubDocument.getMap('state')\n this.syncComponent(loadedSubDocument, state, instance!)\n this.addSubModelEvent.next({\n yType: state,\n yDoc: loadedSubDocument\n })\n instance.loader.markAsLoaded()\n return instance\n }\n\n const state = instance.state as ProxyModel<Record<string, any>>\n let isDestroyed = false\n instance.loader.onRequestLoad.toPromise().then(() => {\n return this.subModelLoader.loadSubModelByComponent(instance as AsyncComponent)\n })\n .then(subDocument => {\n if (isDestroyed) {\n return\n }\n const state = subDocument.getMap('state')\n this.syncComponent(subDocument, state, instance!)\n this.addSubModelEvent.next({\n yType: state,\n yDoc: subDocument\n })\n ;(instance as AsyncComponent).loader.markAsLoaded()\n })\n state.__changeMarker__.addDetachCallback(() => {\n isDestroyed = true\n })\n } else if (instance instanceof Component) {\n throw collaborateErrorFn(`component name \\`${componentName}\\` is not a async component.`)\n }\n } else {\n const sharedState = yMap.get('state') as YMap<any>\n const state = this.createLocalMapBySharedMap(sharedState)\n instance = this.registry.createComponentByData(componentName, state)\n }\n if (instance) {\n return instance\n }\n\n throw collaborateErrorFn(`cannot find component factory \\`${componentName}\\`.`)\n }\n\n /**\n * 双向同步数组\n * @param sharedArray\n * @param localArray\n * @private\n */\n private syncArray(sharedArray: YArray<any>, localArray: ProxyModel<any[]>) {\n function logError(type: string) {\n console.error(collaborateErrorFn(`${type} error, length exceeded, path in ${localArray.__changeMarker__.getPaths().join('/')}`))\n }\n\n const sub = localArray.__changeMarker__.onSelfChange.subscribe((actions) => {\n this.runLocalUpdate(sharedArray.doc, !localArray.__changeMarker__.irrevocableUpdate, () => {\n let index = 0\n for (const action of actions) {\n switch (action.type) {\n case 'retain':\n index = action.offset\n break\n case 'insert': {\n const ref = action.ref\n if (!Array.isArray(ref)) {\n throw collaborateErrorFn('The insertion action must have a reference value.')\n }\n const data = ref.map(item => {\n return this.createSharedModelByLocalModel(item)\n })\n if (index <= sharedArray.length) {\n sharedArray.insert(index, data)\n } else {\n sharedArray.insert(sharedArray.length, data)\n logError('insert')\n }\n }\n break\n case 'delete':\n if (action.count <= 0) {\n break\n }\n if (index < sharedArray.length) {\n sharedArray.delete(index, action.count)\n } else {\n logError('delete')\n }\n break\n case 'setIndex':\n if (action.index < sharedArray.length) {\n sharedArray.delete(action.index, 1)\n sharedArray.insert(action.index, [this.createSharedModelByLocalModel(action.ref)])\n } else {\n sharedArray.insert(sharedArray.length, [this.createSharedModelByLocalModel(action.ref)])\n logError('setIndex')\n }\n break\n }\n }\n })\n })\n\n const syncRemote = (ev: YArrayEvent<any>, tr: Transaction) => {\n this.runRemoteUpdate(tr, () => {\n let index = 0\n ev.delta.forEach((action) => {\n if (Reflect.has(action, 'retain')) {\n index += action.retain as number\n } else if (action.insert) {\n const data = (action.insert as Array<any>).map((item) => {\n return this.createLocalModelBySharedByModel(item)\n })\n localArray.splice(index, 0, ...data)\n index += data.length\n } else if (action.delete) {\n localArray.splice(index, action.delete)\n }\n })\n })\n }\n\n sharedArray.observe(syncRemote)\n localArray.__changeMarker__.addDetachCallback(() => {\n sub.unsubscribe()\n sharedArray.unobserve(syncRemote)\n })\n }\n\n /**\n * 双向同步对象\n * @param sharedObject\n * @param localObject\n * @private\n */\n private syncObject(sharedObject: YMap<any>, localObject: ProxyModel<Record<string, any>>) {\n const syncRemote = (ev: YMapEvent<any>, tr: Transaction) => {\n this.runRemoteUpdate(tr, () => {\n ev.changes.keys.forEach((item, key) => {\n if (item.action === 'add' || item.action === 'update') {\n const value = sharedObject.get(key)\n localObject[key] = this.createLocalModelBySharedByModel(value)\n } else {\n Reflect.deleteProperty(localObject, key)\n }\n })\n })\n }\n\n sharedObject.observe(syncRemote)\n\n const sub = localObject.__changeMarker__.onSelfChange.subscribe((actions) => {\n this.runLocalUpdate(sharedObject.doc, !localObject.__changeMarker__.irrevocableUpdate, () => {\n for (const action of actions) {\n switch (action.type) {\n case 'propSet': {\n const subModel = this.createSharedModelByLocalModel(action.ref)\n sharedObject.set(action.key, subModel)\n if (sharedObject.size === 0) {\n // 奇怪的 bug,设置了子模型,但子模型会标记为 deleted,导致设置后无效\n console.error(collaborateErrorFn(`prop set error, key is ${action.key}`))\n }\n }\n break\n case 'propDelete':\n sharedObject.delete(action.key)\n break\n }\n }\n })\n })\n\n localObject.__changeMarker__.addDetachCallback(function () {\n sharedObject.unobserve(syncRemote)\n sub.unsubscribe()\n })\n }\n\n private runLocalUpdate(yDoc: YDoc | null, record: boolean, fn: () => void) {\n if (this.updateFromRemote || !yDoc) {\n return\n }\n let changeList = this.updateRemoteActions.get(yDoc)\n if (!changeList) {\n changeList = []\n this.updateRemoteActions.set(yDoc, changeList)\n }\n changeList.push({\n record,\n action: fn\n })\n }\n\n private runRemoteUpdate(tr: Transaction, fn: () => void) {\n if (tr.origin === tr.doc) {\n return\n }\n this.updateFromRemote = true\n if (tr.origin instanceof UndoManager) {\n this.scheduler.historyApplyTransact(fn)\n } else {\n this.scheduler.remoteUpdateTransact(fn)\n }\n this.updateFromRemote = false\n }\n}\n\nfunction remoteFormatsToLocal(registry: Registry, attrs?: any,) {\n const formats: Formats = []\n if (attrs) {\n Object.keys(attrs).forEach(key => {\n const formatter = registry.getFormatter(key)\n if (formatter) {\n formats.push([formatter, attrs[key]])\n }\n })\n }\n return formats\n}\n","import { Observable, Subject } from '@tanbo/stream'\nimport { Textbus } from '@textbus/core'\n\nexport interface Message<T> {\n clientId: number\n message: T\n}\n\n/**\n * 协作消息总线,用于同步各终端消息\n */\nexport abstract class MessageBus<T> {\n onSync: Observable<void>\n protected syncEvent = new Subject<void>()\n\n constructor() {\n this.onSync = this.syncEvent.asObservable()\n }\n\n /**\n * 立即同步消息\n */\n sync() {\n this.syncEvent.next()\n }\n\n /**\n * 当需要同步协作消息是,Textbus 会自动调用,并把返回数据同步到其它终端\n */\n abstract get(textbus: Textbus): T\n\n /**\n * 当远程消息更新时,Textbus 会自动调用\n * @param message\n * @param textbus\n */\n abstract consume(message: Message<T>[], textbus: Textbus): void\n}\n","import { AbstractType, Item, UndoManager, Doc as YDoc } from 'yjs'\nimport { Inject, Injectable, Optional } from '@viewfly/core'\nimport { Observable, Subject, Subscription } from '@tanbo/stream'\nimport { History, HISTORY_STACK_SIZE, RootComponentRef, Scheduler } from '@textbus/core'\n\nimport { Collaborate, CollaborateHistorySelectionPosition, CursorPosition } from './collaborate'\nimport { CustomUndoManagerConfig } from './collab-history'\n\ninterface HistoryStackItem extends CollaborateHistorySelectionPosition {\n undoManagers: UndoManager[]\n}\n\n@Injectable()\nexport class MultipleDocCollabHistory implements History {\n onChange: Observable<void>\n onBack: Observable<void>\n onForward: Observable<void>\n onPush: Observable<void>\n\n get canBack() {\n return this.actionStack.length > 0 && this.index > 0\n }\n\n get canForward() {\n return this.actionStack.length > 0 && this.index < this.actionStack.length\n }\n\n isListen = false\n\n private changeEvent = new Subject<void>()\n private backEvent = new Subject<void>()\n private forwardEvent = new Subject<void>()\n private pushEvent = new Subject<void>()\n private actionStack: HistoryStackItem[] = []\n\n private index = 0\n\n private stackItem: HistoryStackItem | null = null\n private timer: any = null\n private beforePosition: CursorPosition | null = null\n\n private subscription = new Subscription()\n\n private subDocs = new Set<AbstractType<any>>()\n\n private listenerCaches = new Set<UndoManager>()\n\n constructor(private collaborate: Collaborate,\n private scheduler: Scheduler,\n private rootComponentRef: RootComponentRef,\n @Inject(HISTORY_STACK_SIZE) private stackSize: number,\n @Optional() private undoManagerConfig: CustomUndoManagerConfig) {\n this.onChange = this.changeEvent.asObservable()\n this.onBack = this.backEvent.asObservable()\n this.onForward = this.forwardEvent.asObservable()\n this.onPush = this.pushEvent.asObservable()\n }\n\n listen() {\n this.isListen = true\n const root = this.collaborate.yDoc.getMap('RootComponent')\n const rootComponent = this.rootComponentRef.component!\n this.collaborate.syncRootComponent(this.collaborate.yDoc, root, rootComponent)\n\n this.listenItem(root, this.collaborate.yDoc)\n\n this.subscription.add(\n this.collaborate.onAddSubModel.subscribe(({ yType, yDoc }) => {\n if (this.subDocs.has(yType)) {\n return\n }\n this.subDocs.add(yType)\n if (this.isListen) {\n this.listenItem(yType, yDoc)\n }\n }),\n this.scheduler.onLocalChangeBefore.subscribe(() => {\n this.beforePosition = this.collaborate.getRelativeCursorLocation()\n })\n )\n }\n\n forward() {\n if (!this.canForward) {\n return\n }\n clearTimeout(this.timer as any)\n const item = this.actionStack[this.index]\n if (item) {\n for (const i of item.undoManagers) {\n i.redo()\n }\n this.collaborate.restoreCursorPosition(item.after)\n }\n this.index++\n this.forwardEvent.next()\n this.changeEvent.next()\n }\n\n back() {\n if (!this.canBack) {\n return\n }\n clearTimeout(this.timer as any)\n let historyStackItem: HistoryStackItem\n if (this.stackItem) {\n historyStackItem = this.stackItem\n this.stackItem = null\n } else {\n this.index--\n historyStackItem = this.actionStack[this.index]\n }\n let len = historyStackItem.undoManagers.length\n while (len > 0) {\n len--\n historyStackItem.undoManagers[len].undo()\n }\n if (historyStackItem) {\n const beforePosition = historyStackItem.before\n this.collaborate.restoreCursorPosition(beforePosition)\n this.backEvent.next()\n this.changeEvent.next()\n }\n }\n\n clear() {\n this.actionStack = []\n this.stackItem = null\n this.index = 0\n this.beforePosition = null\n clearTimeout(this.timer as any)\n this.listenerCaches.forEach((undoManager) => {\n undoManager.clear()\n })\n this.changeEvent.next()\n }\n\n destroy() {\n this.clear()\n this.beforePosition = this.stackItem = null\n this.subscription.unsubscribe()\n this.listenerCaches.forEach((undoManager) => {\n undoManager.destroy()\n })\n this.subDocs.clear()\n this.listenerCaches.clear()\n }\n\n private listenItem(yType: AbstractType<any>, yDoc: YDoc) {\n const undoManagerConfig = this.undoManagerConfig || {}\n const undoManager = new UndoManager(yType, {\n trackedOrigins: new Set([yDoc]),\n captureTimeout: 0,\n captureTransaction(arg) {\n if (undoManagerConfig.captureTransaction) {\n return undoManagerConfig.captureTransaction(arg)\n }\n return true\n },\n deleteFilter(item: Item) {\n if (undoManagerConfig.deleteFilter) {\n return undoManagerConfig.deleteFilter(item)\n }\n return true\n }\n })\n\n undoManager.on('stack-item-added', (event: any) => {\n if (event.type === 'undo' && !(event.origin instanceof UndoManager)) {\n if (this.index != this.actionStack.length) {\n const redoStack = this.actionStack.slice(this.index)\n redoStack.forEach(item => {\n item.undoManagers.forEach(i => {\n i.clear(false, true)\n })\n })\n this.actionStack.length = this.index\n this.changeEvent.next()\n }\n if (this.stackItem === null) {\n this.stackItem = {\n before: this.beforePosition,\n after: null,\n undoManagers: []\n }\n this.timer = setTimeout(() => {\n if (this.actionStack.length >= this.stackSize) {\n this.actionStack.shift()\n } else {\n this.index++\n }\n // this.beforePosition = this.collaborate.getRelativeCursorLocation()\n this.stackItem!.after = this.beforePosition\n this.actionStack.push(this.stackItem!)\n this.stackItem = null\n this.pushEvent.next()\n this.changeEvent.next()\n }, 500)\n }\n\n this.stackItem.undoManagers.push(undoManager)\n }\n })\n\n this.listenerCaches.add(undoManager)\n }\n}\n","import { Doc, Doc as YDoc } from 'yjs'\nimport { Injectable } from '@viewfly/core'\nimport { AsyncComponent, AsyncSlot, makeError } from '@textbus/core'\n\nconst subModelLoaderErrorFn = makeError('subModelLoaderError')\n\n/**\n * 子文档加载器\n */\nexport abstract class SubModelLoader {\n /**\n * 通过插槽获取已加载的文档\n * @param slot\n */\n abstract getLoadedModelBySlot(slot: AsyncSlot): YDoc | null\n\n /**\n * 通过组件获取已加载的文档\n * @param component\n */\n abstract getLoadedModelByComponent(component: AsyncComponent): YDoc | null\n\n /**\n * 当本地新增异步子插槽时调用\n * @param slot\n */\n abstract createSubModelBySlot(slot: AsyncSlot): Promise<YDoc>\n\n /**\n * 当本地新增异步子组件时调用\n * @param component\n */\n abstract createSubModelByComponent(component: AsyncComponent): Promise<YDoc>\n\n /**\n * 当远程异步子插槽同步到本地时调用\n * @param slot\n */\n abstract loadSubModelBySlot(slot: AsyncSlot): Promise<YDoc>\n\n /**\n * 当远程异步子组件同步到本地时调用\n * @param component\n */\n abstract loadSubModelByComponent(component: AsyncComponent): Promise<YDoc>\n}\n\n@Injectable()\nexport class NonSubModelLoader extends SubModelLoader {\n createSubModelBySlot(): Promise<Doc> {\n throw subModelLoaderErrorFn('single document does not support async slot.')\n }\n\n createSubModelByComponent(): Promise<Doc> {\n throw subModelLoaderErrorFn('single document does not support async component.')\n }\n\n loadSubModelByComponent(): Promise<Doc> {\n throw subModelLoaderErrorFn('single document does not support async component.')\n }\n\n loadSubModelBySlot(): Promise<Doc> {\n throw subModelLoaderErrorFn('single document does not support async slot.')\n }\n\n getLoadedModelBySlot(): Doc {\n throw subModelLoaderErrorFn('single document does not support async slot.')\n }\n\n getLoadedModelByComponent(): Doc {\n throw subModelLoaderErrorFn('single document does not support async component.')\n }\n}\n","import { Observable, Subject } from '@tanbo/stream'\n\n/**\n * 协作通信通用接口\n */\nexport abstract class SyncConnector {\n /**\n * 当文档加载完成时触发的观察者\n */\n onLoad: Observable<void>\n /**\n * 当文档 awareness 状态变更时触发的观察者\n */\n onStateChange: Observable<any[]>\n\n protected loadEvent = new Subject<void>()\n protected stateChangeEvent = new Subject<any[]>()\n\n protected constructor() {\n this.onLoad = this.loadEvent.asObservable()\n this.onStateChange = this.stateChangeEvent.asObservable()\n }\n\n /**\n * 设置 awareness 状态\n * @param key 状态的 key\n * @param data 状态值\n */\n abstract setLocalStateField(key: string, data: Record<string, any>): void\n\n /**\n * 当文档销毁时调用\n */\n abstract onDestroy(): void\n}\n","import { HocuspocusProvider } from '@hocuspocus/provider'\nimport { HocuspocusProviderConfiguration } from '@hocuspocus/provider'\n\nimport { SyncConnector } from '../base/sync-connector'\nimport { Message } from '../base/message-bus'\n\nexport class HocuspocusConnector extends SyncConnector {\n provide: HocuspocusProvider\n\n constructor(config: HocuspocusProviderConfiguration) {\n super()\n this.provide = new HocuspocusProvider({\n ...config,\n onSynced: (data) => {\n config.onSynced?.(data)\n this.loadEvent.next()\n },\n onAwarenessUpdate: (data) => {\n config.onAwarenessUpdate?.(data)\n const states: Message<any>[] = data.states.map(state => {\n return {\n clientId: state.clientId,\n message: state.message as any\n }\n })\n this.stateChangeEvent.next(states)\n },\n })\n }\n\n setLocalStateField(key: string, data: Record<string, any>) {\n this.provide.setAwarenessField(key, data)\n }\n\n onDestroy() {\n this.provide.disconnect()\n this.provide.destroy()\n }\n}\n","import { Doc as YDoc } from 'yjs'\nimport { WebsocketProvider } from 'y-websocket'\n\nimport { SyncConnector } from '../base/sync-connector'\nimport { Message } from '../base/message-bus'\n\nexport class YWebsocketConnector extends SyncConnector {\n provide: WebsocketProvider\n\n private onSync = (is: boolean) => {\n if (is) {\n this.loadEvent.next()\n }\n }\n\n private onUpdate = () => {\n const syncStates: Message<any>[] = []\n this.provide.awareness.getStates().forEach((state, id) => {\n syncStates.push({\n clientId: id,\n message: state.message,\n })\n })\n this.stateChangeEvent.next(syncStates)\n }\n\n constructor(url: string, roomName: string, yDoc: YDoc) {\n super()\n this.onLoad = this.loadEvent.asObservable()\n this.onStateChange = this.stateChangeEvent.asObservable()\n this.provide = new WebsocketProvider(url, roomName, yDoc)\n\n this.provide.once('sync', this.onSync)\n this.provide.awareness.on('update', this.onUpdate)\n }\n\n setLocalStateField(key: string, data: Record<string, any>) {\n this.provide.awareness.setLocalStateField(key, data)\n }\n\n onDestroy() {\n this.provide.awareness.off('update', this.onUpdate)\n this.provide.disconnect()\n this.provide.destroy()\n }\n}\n","import { History, Module, Selection, Textbus } from '@textbus/core'\nimport { Subscription } from '@tanbo/stream'\nimport { Provider } from '@viewfly/core'\nimport { Doc as YDoc } from 'yjs'\n\nimport { CollabHistory, Collaborate, MessageBus, NonSubModelLoader, SubModelLoader, SyncConnector } from './base/_api'\n\nexport interface CollaborateConfig {\n createConnector(yDoc: YDoc): SyncConnector\n\n onlyLoad?: boolean\n}\n\nexport class CollaborateModule implements Module {\n private subscription = new Subscription()\n providers: Provider[] = [\n Collaborate,\n CollabHistory,\n {\n provide: History,\n useExisting: CollabHistory\n }, {\n provide: SyncConnector,\n useFactory: (collab: Collaborate) => {\n return this.config.createConnector(collab.yDoc)\n },\n deps: [Collaborate]\n }, {\n provide: SubModelLoader,\n useClass: NonSubModelLoader\n }\n ]\n\n private timer: any = null\n\n constructor(public config: CollaborateConfig) {\n }\n\n setup(textbus: Textbus): Promise<(() => void) | void> | (() => void) | void {\n const messageBus = textbus.get(MessageBus, null)\n const connector = textbus.get(SyncConnector)\n const collab = textbus.get(Collaborate)\n if (messageBus) {\n const selection = textbus.get(Selection)\n connector.setLocalStateField('message', messageBus.get(textbus))\n this.subscription.add(\n messageBus.onSync.subscribe(() => {\n connector.setLocalStateField('message', messageBus.get(textbus))\n }),\n selection.onChange.subscribe(() => {\n connector.setLocalStateField('message', messageBus.get(textbus))\n }),\n connector.onStateChange.subscribe((states) => {\n messageBus.consume(states, textbus)\n })\n )\n }\n\n return connector.onLoad.toPromise().then(() => {\n if (!this.config.onlyLoad) {\n return\n }\n const root = collab.yDoc.getMap('RootComponent')\n if (root.has('state')) {\n return\n }\n return new Promise(resolve => {\n const testing = () => {\n if (root.has('state')) {\n resolve()\n } else {\n this.timer = setTimeout(testing, 1000)\n }\n }\n this.timer = setTimeout(testing, 1000)\n })\n })\n }\n\n onDestroy(textbus: Textbus) {\n this.subscription.unsubscribe()\n textbus.get(Collaborate).destroy()\n textbus.get(History).destroy()\n textbus.get(SyncConnector).onDestroy()\n clearTimeout(this.timer)\n }\n}\n","import { History, Module, Selection, Textbus } from '@textbus/core'\nimport { Provider } from '@viewfly/core'\nimport { Subscription } from '@tanbo/stream'\n\nimport { Collaborate, SyncConnector, MultipleDocCollabHistory, SubModelLoader, MessageBus } from './base/_api'\nimport { CollaborateConfig } from './collaborate-module'\n\nexport interface MultipleDocCollaborateConfig extends CollaborateConfig {\n subModelLoader: SubModelLoader\n}\n\nexport class MultipleDocumentCollaborateModule implements Module {\n private subscription = new Subscription()\n providers: Provider[] = [\n Collaborate,\n MultipleDocCollabHistory,\n {\n provide: History,\n useExisting: MultipleDocCollabHistory\n }, {\n provide: SyncConnector,\n useFactory: (collab: Collaborate) => {\n return this.config.createConnector(collab.yDoc)\n },\n deps: [Collaborate]\n }, {\n provide: SubModelLoader,\n useFactory: () => {\n return this.config.subModelLoader\n }\n }\n ]\n\n private timer: any = null\n\n constructor(public config: MultipleDocCollaborateConfig) {\n }\n\n setup(textbus: Textbus): Promise<(() => void) | void> | (() => void) | void {\n const messageBus = textbus.get(MessageBus, null)\n const connector = textbus.get(SyncConnector)\n const collab = textbus.get(Collaborate)\n if (messageBus) {\n const selection = textbus.get(Selection)\n connector.setLocalStateField('message', messageBus.get(textbus))\n this.subscription.add(\n messageBus.onSync.subscribe(() => {\n connector.setLocalStateField('message', messageBus.get(textbus))\n }),\n selection.onChange.subscribe(() => {\n connector.setLocalStateField('message', messageBus.get(textbus))\n }),\n connector.onStateChange.subscribe((states) => {\n messageBus.consume(states, textbus)\n })\n )\n }\n return connector.onLoad.toPromise().then(() => {\n if (!this.config.onlyLoad) {\n return\n }\n const root = collab.yDoc.getMap('RootComponent')\n if (root.has('state')) {\n return\n }\n return new Promise(resolve => {\n const testing = () => {\n if (root.has('state')) {\n resolve()\n } else {\n this.timer = setTimeout(testing, 1000)\n }\n }\n this.timer = setTimeout(testing, 1000)\n })\n })\n }\n\n onDestroy(textbus: Textbus) {\n this.subscription.unsubscribe()\n textbus.get(Collaborate).destroy()\n textbus.get(History).destroy()\n textbus.get(SyncConnector).onDestroy()\n clearTimeout(this.timer)\n }\n}\n"],"names":["__decorateClass","__decorateParam","YDoc","YMap","length","YArray","YText","state"],"mappings":";;;;;;;;;;;;;;;AAWO,MAAe,wBAAwB;AAI9C;AAEA,MAAM,uBAAuB,UAAU,eAAe;AAG/C,IAAM,gBAAN,MAAuC;AAAA,EAyB5C,YAAoB,kBACA,aACA,WAC4B,WAChB,mBAA4C;AAJxD,SAAA,mBAAA;AACA,SAAA,cAAA;AACA,SAAA,YAAA;AAC4B,SAAA,YAAA;AAChB,SAAA,oBAAA;AAC9B,SAAK,SAAS,KAAK,UAAU,aAAA;AAC7B,SAAK,YAAY,KAAK,aAAa,aAAA;AACnC,SAAK,WAAW,KAAK,YAAY,aAAA;AACjC,SAAK,SAAS,KAAK,UAAU,aAAA;AAAA,EAE/B;AAAA,EAVoB;AAAA,EACA;AAAA,EACA;AAAA,EAC4B;AAAA,EAChB;AAAA,EA5BhC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA,IAAI,UAAU;AACZ,WAAO,KAAK,SAAS,QAAA,KAAa;AAAA,EACpC;AAAA,EAEA,IAAI,aAAa;AACf,WAAO,KAAK,SAAS,QAAA,KAAa;AAAA,EACpC;AAAA,EAEQ,UAA8B;AAAA,EAE9B,eAA2D,CAAA;AAAA,EAC3D,QAAQ;AAAA,EACR,gBAAgC,CAAA;AAAA,EAEhC,YAAY,IAAI,QAAA;AAAA,EAChB,eAAe,IAAI,QAAA;AAAA,EACnB,cAAc,IAAI,QAAA;AAAA,EAClB,YAAY,IAAI,QAAA;AAAA,EAcxB,SAAS;AACP,UAAM,OAAO,KAAK,YAAY,KAAK,OAAO,eAAe;AACzD,UAAM,gBAAgB,KAAK,iBAAiB;AAC5C,SAAK,YAAY,kBAAkB,KAAK,YAAY,MAAM,MAAM,aAAa;AAE7E,UAAM,oBAAoB,KAAK,qBAAqB,CAAA;AACpD,UAAM,UAAU,IAAI,YAAY,MAAM;AAAA,MACpC,gBAAgB,oBAAI,IAAS,CAAC,KAAK,YAAY,IAAI,CAAC;AAAA,MACpD,mBAAmB,KAAK;AACtB,YAAI,kBAAkB,oBAAoB;AACxC,iBAAO,kBAAkB,mBAAmB,GAAG;AAAA,QACjD;AACA,eAAO;AAAA,MACT;AAAA,MACA,aAAa,MAAY;AACvB,YAAI,kBAAkB,cAAc;AAClC,iBAAO,kBAAkB,aAAa,IAAI;AAAA,QAC5C;AACA,eAAO;AAAA,MACT;AAAA,IAAA,CACD;AACD,SAAK,UAAU;AAEf,QAAI,iBAAwC;AAC5C,SAAK,cAAc;AAAA,MACjB,KAAK,UAAU,oBAAoB,UAAU,MAAM;AACjD,yBAAiB,KAAK,YAAY,0BAAA;AAAA,MACpC,CAAC;AAAA,MACD,KAAK,YAAY,cAAc,UAAU,MAAM;AAC7C,cAAM,qBAAqB,6CAA6C;AAAA,MAC1E,CAAC;AAAA,IAAA;AAGH,YAAQ,GAAG,oBAAoB,CAAC,UAAe;AAC7C,UAAI,MAAM,SAAS,QAAQ;AACzB,YAAI,MAAM,WAAW,SAAS;AAC5B,eAAK;AAAA,QACP,OAAO;AACL,eAAK,aAAa,SAAS,KAAK;AAChC,eAAK,aAAa,KAAK;AAAA,YACrB,QAAQ;AAAA,YACR,OAAO,KAAK,YAAY,0BAAA;AAAA,UAA0B,CACnD;AACD,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,aAAK;AAAA,MACP;AACA,UAAI,QAAQ,UAAU,SAAS,KAAK,WAAW;AAC7C,aAAK,aAAa,MAAA;AAClB,gBAAQ,UAAU,MAAA;AAAA,MACpB;AACA,UAAI,MAAM,WAAW,KAAK,YAAY,MAAM;AAC1C,aAAK,UAAU,KAAA;AAAA,MACjB;AACA,WAAK,YAAY,KAAA;AAAA,IACnB,CAAC;AACD,YAAQ,GAAG,qBAAqB,CAAC,OAAY;AAC3C,YAAM,QAAQ,GAAG,SAAS,SAAS,KAAK,QAAQ,KAAK,QAAQ;AAC7D,YAAM,WAAW,KAAK,aAAa,KAAK,KAAK;AAC7C,YAAM,IAAI,GAAG,SAAS,SAAS,UAAU,SAAS,UAAU;AAC5D,WAAK,YAAY,sBAAsB,CAAC;AAAA,IAC1C,CAAC;AAAA,EACH;AAAA,EAGA,OAAO;AACL,QAAI,KAAK,SAAS;AAChB,WAAK,SAAS,KAAA;AACd,WAAK,UAAU,KAAA;AAAA,IACjB;AAAA,EACF;AAAA,EAEA,UAAU;AACR,QAAI,KAAK,YAAY;AACnB,WAAK,SAAS,KAAA;AACd,WAAK,aAAa,KAAA;AAAA,IACpB;AAAA,EACF;AAAA,EAEA,QAAQ;AACN,UAAM,OAAO,KAAK,aAAa,IAAA;AAC/B,SAAK,eAAe,OAAO,CAAC,IAAI,IAAI,CAAA;AACpC,SAAK,QAAQ,OAAO,IAAI;AACxB,SAAK,SAAS,MAAA;AACd,SAAK,YAAY,KAAA;AAAA,EACnB;AAAA,EAEA,UAAU;AACR,SAAK,QAAQ;AACb,SAAK,eAAe,CAAA;AACpB,SAAK,cAAc,QAAQ,CAAA,MAAK,EAAE,aAAa;AAC/C,QAAI,KAAK,SAAS;AAChB,WAAK,QAAQ,QAAA;AACb,WAAK,QAAQ,qBAAqB,MAAM;AACxC,WAAK,QAAQ,eAAe,MAAM;AAClC,WAAK,QAAQ,iBAAiB,oBAAI,IAAI,CAAC,IAAI,CAAC;AAAA,IAC9C;AAEA,SAAK,UAAU;AAAA,EACjB;AACF;AA1Ia,gBAANA,kBAAA;AAAA,EADN,WAAA;AAAA,EA6BcC,4BAAO,kBAAkB,CAAA;AAAA,EACzBA,kBAAA,GAAA,SAAA,CAAS;AAAA,GA7BX,aAAA;;;;;;;;;AC4Bb,MAAM,qBAAqB,UAAU,aAAa;AAElD,MAAM,QAAQ;AAAA,EACJ,sCAAsB,QAAA;AAAA,EACtB,sCAAsB,QAAA;AAAA,EAI9B,IAAI,KAAU,OAAY;AACxB,QAAI,eAAe,MAAM;AACvB,WAAK,gBAAgB,IAAI,KAAK,KAAK;AACnC,WAAK,gBAAgB,IAAI,OAAO,GAAG;AAAA,IACrC,OAAO;AACL,WAAK,gBAAgB,IAAI,OAAO,GAAG;AACnC,WAAK,gBAAgB,IAAI,KAAK,KAAK;AAAA,IACrC;AAAA,EACF;AAAA,EAIA,IAAI,KAAU;AACZ,QAAI,eAAe,MAAM;AACvB,aAAO,KAAK,gBAAgB,IAAI,GAAG,KAAK;AAAA,IAC1C;AACA,WAAO,KAAK,gBAAgB,IAAI,GAAG,KAAK;AAAA,EAC1C;AAAA,EAEA,OAAO,KAAmB;AACxB,QAAI,eAAe,MAAM;AACvB,YAAM,IAAI,KAAK,gBAAgB,IAAI,GAAG;AACtC,WAAK,gBAAgB,OAAO,GAAG;AAC/B,UAAI,GAAG;AACL,aAAK,gBAAgB,OAAO,CAAC;AAAA,MAC/B;AAAA,IACF,OAAO;AACL,YAAM,IAAI,KAAK,gBAAgB,IAAI,GAAG;AACtC,WAAK,gBAAgB,OAAO,GAAG;AAC/B,UAAI,GAAG;AACL,aAAK,gBAAgB,OAAO,CAAC;AAAA,MAC/B;AAAA,IACF;AAAA,EACF;AACF;AAmBO,IAAM,cAAN,MAAkB;AAAA,EAYvB,YAAoB,WACA,UACA,WACA,gBAAgC;AAHhC,SAAA,YAAA;AACA,SAAA,WAAA;AACA,SAAA,YAAA;AACA,SAAA,iBAAA;AAClB,SAAK,gBAAgB,KAAK,iBAAiB,aAAA;AAAA,EAC7C;AAAA,EALoB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAdpB,OAAO,IAAIC,IAAA;AAAA,EACX,UAAU,IAAI,QAAA;AAAA,EACd;AAAA,EAEQ,gBAAgC,CAAA;AAAA,EAChC,mBAAmB;AAAA,EACnB,mBAAmB,IAAI,QAAA;AAAA,EAEvB,0CAA0B,QAAA;AAAA,EAC1B,WAAW,CAAA;AAAA,EASnB,kBAAkB,MAAY,iBAA4B,gBAAgC;AACxF,SAAK,cAAc,IAAI;AACvB,SAAK,cAAc,MAAM,iBAAiB,cAAc;AAAA,EAC1D;AAAA,EAEA,aAAa,MAAY,YAAmB,WAAiB;AAC3D,QAAI,WAAW,QAAQ;AACrB,gBAAU,OAAO,CAAC;AAClB,gBAAU,OAAO,UAAU,MAAM;AACjC,gBAAU,gBAAA;AACV,gBAAU,aAAA;AACV,WAAK,0BAA0B,YAAY,SAAS;AAAA,IACtD,OAAO;AACL,WAAK,SAAS,MAAM;AAClB,aAAK,0BAA0B,YAAY,SAAS;AAAA,MACtD,CAAC;AAAA,IACH;AACA,SAAK,cAAc,IAAI;AACvB,SAAK,SAAS,YAAY,SAAS;AAAA,EACrC;AAAA,EAEA,qBAAqB,UAAoD;AACvE,UAAM,iBAAiB,2CAA2C,SAAS,OAAO,UAAU,SAAS,OAAO,GAAG;AAC/G,UAAM,gBAAgB,2CAA2C,SAAS,MAAM,UAAU,SAAS,MAAM,GAAG;AAC5G,QAAI,kBAAkB,eAAe;AACnC,YAAM,YAAY,KAAK,QAAQ,IAAI,cAAc,IAAa;AAC9D,YAAM,aAAa,KAAK,QAAQ,IAAI,eAAe,IAAa;AAChE,UAAI,aAAa,YAAY;AAC3B,eAAO;AAAA,UACL;AAAA,UACA,cAAc,eAAe;AAAA,UAC7B;AAAA,UACA,aAAa,cAAc;AAAA,QAAA;AAAA,MAE/B;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAEA,4BAAmD;AACjD,UAAM,EAAE,YAAY,cAAc,WAAW,YAAA,IAAgB,KAAK;AAClE,QAAI,YAAY;AACd,YAAM,cAAc,KAAK,QAAQ,IAAI,UAAU;AAC/C,UAAI,aAAa;AACf,cAAM,iBAAiB,oCAAoC,aAAa,YAAa;AACrF,YAAI,WAAW;AACb,gBAAM,aAAa,KAAK,QAAQ,IAAI,SAAS;AAC7C,cAAI,YAAY;AACd,kBAAM,gBAAgB,oCAAoC,YAAY,WAAY;AAClF,mBAAO;AAAA,cACL,OAAO;AAAA,gBACL,KAAK,WAAW;AAAA,gBAChB,UAAU;AAAA,cAAA;AAAA,cAEZ,QAAQ;AAAA,gBACN,KAAK,YAAY;AAAA,gBACjB,UAAU;AAAA,cAAA;AAAA,YACZ;AAAA,UAEJ;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAEA,sBAAsB,UAAiC;AACrD,QAAI,CAAC,UAAU;AACb,WAAK,UAAU,SAAA;AACf;AAAA,IACF;AACA,UAAM,YAAY,KAAK,qBAAqB,QAAQ;AACpD,QAAI,WAAW;AACb,WAAK,UAAU;AAAA,QACb,UAAU;AAAA,QACV,UAAU;AAAA,QACV,UAAU;AAAA,QACV,UAAU;AAAA,MAAA;AAAA,IACd;AAAA,EACF;AAAA,EAEQ,cAAc,MAAY;AAChC,SAAK,cAAc;AAAA,MACjB,KAAK,UAAU,aAAa;AAAA,QAC1B,IAAI,CAAA,SAAQ;AACV,iBAAO,KAAK,OAAO,CAAA,MAAK;AACtB,mBAAO,EAAE,SAAS,aAAa;AAAA,UACjC,CAAC;AAAA,QACH,CAAC;AAAA,QACD,OAAO,CAAA,SAAQ;AACb,iBAAO,KAAK;AAAA,QACd,CAAC;AAAA,MAAA,EACD,UAAU,MAAM;AAChB,cAAM,UAAoB,CAAA;AAE1B,YAAI,SAAwB;AAE5B,cAAM,sBAAsB,KAAK,oBAAoB,IAAI,IAAI,KAAK,CAAA;AAElE,mBAAW,QAAQ,qBAAqB;AACtC,cAAI,CAAC,QAAQ;AACX,qBAAS;AAAA,cACP,QAAQ,KAAK;AAAA,cACb,SAAS,CAAA;AAAA,YAAC;AAEZ,oBAAQ,KAAK,MAAM;AAAA,UACrB;AACA,cAAI,OAAO,WAAW,KAAK,QAAQ;AACjC,mBAAO,QAAQ,KAAK,KAAK,MAAM;AAAA,UACjC,OAAO;AACL,qBAAS;AAAA,cACP,QAAQ,KAAK;AAAA,cACb,SAAS,CAAC,KAAK,MAAM;AAAA,YAAA;AAEvB,oBAAQ,KAAK,MAAM;AAAA,UACrB;AAAA,QACF;AAEA,aAAK,oBAAoB,OAAO,IAAI;AAEpC,mBAAW,QAAQ,SAAS;AAC1B,eAAK,SAAS,MAAM;AAClB,iBAAK,QAAQ,QAAQ,CAAA,OAAM;AACzB,iBAAA;AAAA,YACF,CAAC;AAAA,UACH,GAAG,KAAK,SAAS,OAAO,KAAK,QAAQ;AAAA,QACvC;AAAA,MACF,CAAC;AAAA,IAAA;AAAA,EAEL;AAAA,EAEQ,cAAc,MAAY,iBAA4B,gBAAgC;AAC5F,QAAI,QAAQ,gBAAgB,IAAI,OAAO;AACvC,QAAI,CAAC,OAAO;AACV,cAAQ,IAAIC,IAAA;AACZ,WAAK,wBAAwB,eAAe,OAA0C,KAAK;AAC3F,WAAK,SAAS,MAAM;AAClB,wBAAgB,IAAI,SAAS,KAAK;AAAA,MACpC,CAAC;AAAA,IACH,OAAO;AACL,aAAO,KAAK,eAAe,KAAK,EAAE,QAAQ,CAAA,QAAO;AAC/C,gBAAQ,eAAe,eAAe,OAAO,GAAG;AAAA,MAClD,CAAC;AACD,WAAK,wBAAwB,OAAO,eAAe,KAAwC;AAAA,IAC7F;AAAA,EACF;AAAA,EAEQ,SAAS,YAAmB,WAAiB;AACnD,UAAM,aAAa,CAAC,IAAgB,OAAoB;AACtD,WAAK,gBAAgB,IAAI,MAAM;AAC7B,kBAAU,OAAO,CAAC;AAClB,WAAG,YAAY,QAAQ,CAAA,QAAO;AAC5B,gBAAM,SAAS,GAAG,KAAK,IAAI,GAAG;AAC9B,cAAI,CAAC,QAAQ;AACX;AAAA,UACF;AACA,gBAAM,aAAa,OAAO;AAC1B,cAAI,eAAe,YAAY,eAAe,OAAO;AACnD,kBAAM,YAAY,KAAK,SAAS,aAAa,GAAG;AAChD,gBAAI,WAAW;AACb,wBAAU,aAAa,WAAW,WAAW,aAAa,GAAG,CAAC;AAAA,YAChE;AAAA,UACF,WAAW,eAAe,UAAU;AAClC,kBAAM,YAAY,KAAK,SAAS,aAAa,GAAG;AAChD,gBAAI,WAAW;AACb,wBAAU,gBAAgB,SAAS;AAAA,YACrC;AAAA,UACF;AAAA,QACF,CAAC;AACD,WAAG,MAAM,QAAQ,CAAA,WAAU;AACzB,cAAI,QAAQ,IAAI,QAAQ,QAAQ,GAAG;AACjC,gBAAI,OAAO,YAAY;AACrB,oBAAM,UAAU,qBAAqB,KAAK,UAAU,OAAO,UAAU;AACrE,kBAAI,QAAQ,QAAQ;AAClB,0BAAU,OAAO,OAAO,QAAS,OAAO;AAAA,cAC1C;AAAA,YACF;AACA,sBAAU,OAAO,UAAU,QAAQ,OAAO,MAAO;AAAA,UACnD,WAAW,OAAO,QAAQ;AACxB,kBAAM,QAAQ,UAAU;AACxB,gBAAI,SAAS;AACb,gBAAI,OAAO,OAAO,WAAW,UAAU;AACrC,uBAAS,OAAO,OAAO;AACvB,wBAAU,OAAO,OAAO,QAAQ,qBAAqB,KAAK,UAAU,OAAO,UAAU,CAAC;AAAA,YACxF,OAAO;AACL,oBAAM,kBAAkB,OAAO;AAC/B,oBAAM,YAAY,KAAK,sCAAsC,eAAe;AAC5E,wBAAU,OAAO,SAAS;AAAA,YAC5B;AACA,gBAAI,KAAK,UAAU,cAAc,EAAE,GAAG,kBAAkB,cAAc;AACpE,kBAAI,cAAc,KAAK,UAAU,cAAc,KAAK,UAAU,eAAgB,OAAO;AACnF,qBAAK,UAAU,UAAU,WAAW,KAAK,UAAU,eAAgB,MAAM;AAAA,cAC3E;AACA,kBAAI,cAAc,KAAK,UAAU,aAAa,KAAK,UAAU,cAAe,OAAO;AACjF,qBAAK,UAAU,SAAS,WAAW,KAAK,UAAU,cAAe,MAAM;AAAA,cACzE;AAAA,YACF;AAAA,UACF,WAAW,OAAO,QAAQ;AACxB,kBAAM,QAAQ,UAAU;AACxB,sBAAU,OAAO,OAAO,MAAM;AAC9B,gBAAI,KAAK,UAAU,cAAc,EAAE,GAAG,kBAAkB,cAAc;AACpE,kBAAI,cAAc,KAAK,UAAU,cAAc,KAAK,UAAU,gBAAiB,OAAO;AACpF,qBAAK,UAAU,UAAU,WAAW,KAAK,UAAU,cAAe,OAAO,MAAM;AAAA,cACjF;AACA,kBAAI,cAAc,KAAK,UAAU,aAAa,KAAK,UAAU,eAAgB,OAAO;AAClF,qBAAK,UAAU,SAAS,WAAW,KAAK,UAAU,cAAe,OAAO,MAAM;AAAA,cAChF;AAAA,YACF;AAAA,UACF;AAAA,QACF,CAAC;AAAA,MACH,CAAC;AAAA,IACH;AACA,eAAW,QAAQ,UAAU;AAE7B,UAAM,MAAM,UAAU,gBAAgB,UAAU,CAAA,YAAW;AACzD,WAAK,eAAe,WAAW,KAAK,MAAM,MAAM;AAC9C,YAAI,SAAS;AACb,YAAI,SAAS;AACb,mBAAW,UAAU,SAAS;AAC5B,cAAI,OAAO,SAAS,UAAU;AAC5B,kBAAM,UAAU,OAAO;AACvB,gBAAI,SAAS;AACX,oBAAM,OAAO,OAAO,KAAK,OAAO;AAChC,kBAAIC,UAAS,KAAK;AAClB,mBAAK,QAAQ,CAAA,QAAO;AAClB,sBAAM,YAAY,KAAK,SAAS,aAAa,GAAG;AAChD,oBAAI,CAAC,WAAW;AACdA;AACA,0BAAQ,eAAe,SAAS,GAAG;AAAA,gBACrC;AAAA,cACF,CAAC;AACD,kBAAIA,SAAQ;AACV,2BAAW,OAAO,QAAQ,OAAO,QAAQ,OAAO;AAAA,cAClD;AAAA,YACF,OAAO;AACL,uBAAS,OAAO;AAAA,YAClB;AAAA,UACF,WAAW,OAAO,SAAS,iBAAiB;AAC1C,kBAAM,QAAQ,WAAW,QAAA;AACzB,kBAAM,UAAU,MAAM,WAAW,KAAK,MAAM,CAAC,EAAE,WAAW,KAAK;AAC/D,gBAAI,OAAO,OAAO,YAAY,UAAU;AACtC,uBAAS,OAAO,QAAQ;AACxB,yBAAW,OAAO,QAAQ,OAAO,SAAS,OAAO,WAAW,EAAE;AAAA,YAChE,OAAO;AACL,uBAAS;AACT,oBAAM,kBAAkB,KAAK,sCAAsC,OAAO,GAAgB;AAC1F,yBAAW,YAAY,QAAQ,iBAAiB,OAAO,WAAW,EAAE;AAAA,YACtE;AAEA,gBAAI,WAAW,WAAW,GAAG;AAC3B,yBAAW,OAAO,WAAW,SAAS,GAAG,CAAC;AAAA,YAC5C;AACA,sBAAU;AAAA,UACZ,WAAW,OAAO,SAAS,UAAU;AACnC,kBAAM,QAAQ,WAAW,QAAA;AACzB,gBAAI,WAAW,QAAQ;AACrB,yBAAW,OAAO,QAAQ,OAAO,KAAK;AAAA,YACxC;AACA,gBAAI,WAAW,WAAW,GAAG;AAC3B,yBAAW,OAAO,GAAG,MAAM,MAAM,CAAC,GAAG,UAAU;AAAA,YACjD;AAAA,UACF,WAAW,OAAO,SAAS,WAAW;AACpC,uBAAW,aAAa,OAAO,MAAM,OAAO,KAAK;AAAA,UACnD,WAAW,OAAO,SAAS,cAAc;AACvC,uBAAW,gBAAgB,OAAO,IAAI;AAAA,UACxC;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH,CAAC;AAED,SAAK,QAAQ,IAAI,WAAW,UAAU;AAEtC,cAAU,iBAAiB,kBAAkB,MAAM;AACjD,WAAK,QAAQ,OAAO,SAAS;AAC7B,iBAAW,UAAU,UAAU;AAC/B,UAAI,YAAA;AAAA,IACN,CAAC;AAAA,EACH;AAAA,EAGA,UAAU;AACR,SAAK,cAAc,QAAQ,CAAA,MAAK,EAAE,aAAa;AAC/C,SAAK,gBAAgB,CAAA;AAAA,EACvB;AAAA,EAEQ,wBAAwB,WAAsB,UAA2C;AAC/F,cAAU,QAAQ,CAAC,OAAO,QAAQ;AAChC,eAAS,GAAG,IAAI,KAAK,gCAAgC,KAAK;AAAA,IAC5D,CAAC;AACD,SAAK,WAAW,WAAW,QAAQ;AAAA,EACrC;AAAA,EAEQ,0BAA0B,WAAuD;AACvF,UAAM,WAAW,QAAQ,EAAE;AAC3B,SAAK,wBAAwB,WAAW,QAAQ;AAChD,WAAO;AAAA,EACT;AAAA,EAEQ,8BAA8B,aAA6C;AACjF,UAAM,aAAa,QAAe,EAAE;AACpC,eAAW,KAAK,GAAG,YAAY,IAAI,UAAQ,KAAK,gCAAgC,IAAI,CAAC,CAAC;AACtF,SAAK,UAAU,aAAa,UAAU;AACtC,WAAO;AAAA,EACT;AAAA,EAEQ,wBAAwB,UAA2C,WAAsB;AAC/F,WAAO,QAAQ,QAAQ,EAAE,QAAQ,CAAC,CAAC,KAAK,KAAK,MAAM;AACjD,gBAAU,IAAI,KAAK,KAAK,8BAA8B,KAAK,CAAC;AAAA,IAC9D,CAAC;AACD,SAAK,WAAW,WAAW,QAAQ;AAAA,EACrC;AAAA,EAEQ,0BAA0B,UAAsD;AACtF,UAAM,YAAY,IAAID,IAAA;AACtB,SAAK,wBAAwB,UAAU,SAAS;AAChD,WAAO;AAAA,EACT;AAAA,EAEQ,8BAA8B,YAA4C;AAChF,UAAM,cAAc,IAAIE,QAAA;AACxB,eAAW,QAAQ,CAAA,UAAS;AAC1B,kBAAY,KAAK,CAAC,KAAK,8BAA8B,KAAK,CAAC,CAAC;AAAA,IAC9D,CAAC;AACD,SAAK,UAAU,aAAa,UAAU;AACtC,WAAO;AAAA,EACT;AAAA,EAEQ,4BAA4B,WAAwB;AAC1D,UAAM,aAAa,IAAIC,KAAA;AACvB,UAAM,cAAc,qBAAqB;AACzC,eAAW,aAAa,UAAU,CAAC,GAAG,UAAU,MAAM,CAAC;AACvD,eAAW,aAAa,QAAQ,cAAc,UAAU,MAAM;AAE9D,QAAI,aAAa;AACf,UAAI,cAAc;AAClB,YAAM,iBAAiB,KAAK,0BAA0B,UAAU,QAAQ;AACxE,iBAAW,aAAa,YAAY,cAAc;AAClD,WAAK,eAAe,qBAAqB,SAAS,EAAE,KAAK,CAAA,gBAAe;AACtE,YAAI,aAAa;AACf;AAAA,QACF;AACA,cAAM,UAAU,YAAY,QAAQ,SAAS;AAC7C,cAAM,QAAQ,YAAY,OAAO,OAAO;AACxC,aAAK,wBAAwB,UAAU,OAAO,KAAK;AACnD,aAAK,0BAA0B,SAAS,SAAS;AACjD,aAAK,SAAS,SAAS,SAAS;AAChC,aAAK,iBAAiB,KAAK;AAAA,UACzB,MAAM;AAAA,UACN,OAAO;AAAA,QAAA,CACR;AACD,aAAK,cAAc,WAAW;AAC9B,kBAAU,OAAO,aAAA;AAAA,MACnB,CAAC;AACD,gBAAU,iBAAiB,kBAAkB,MAAM;AACjD,sBAAc;AAAA,MAChB,CAAC;AACD,aAAO;AAAA,IACT;AAEA,UAAM,kBAAkB,IAAIH,IAAA;AAC5B,SAAK,wBAAwB,UAAU,OAA0C,eAAe;AAChG,eAAW,aAAa,SAAS,eAAe;AAEhD,UAAM,gBAAgB,IAAIG,KAAA;AAC1B,SAAK,0BAA0B,eAAe,SAAS;AACvD,eAAW,YAAY,GAAG,aAAa;AACvC,SAAK,SAAS,eAAe,SAAS;AACtC,WAAO;AAAA,EACT;AAAA,EAEQ,0BAA0B,eAAsB,WAAiB;AACvE,QAAI,SAAS;AACb,cAAU,QAAA,EAAU,QAAQ,CAAA,MAAK;AAC/B,UAAI,UAAe,CAAA;AACnB,UAAI,EAAE,SAAS;AACb,UAAE,QAAQ,QAAQ,CAAA,SAAQ;AACxB,kBAAQ,KAAK,CAAC,EAAE,IAAI,IAAI,KAAK,CAAC;AAAA,QAChC,CAAC;AAAA,MACH,OAAO;AACL,kBAAU;AAAA,MACZ;AACA,UAAI,OAAO,EAAE,WAAW,UAAU;AAChC,sBAAc,OAAO,QAAQ,EAAE,QAAQ,OAAO;AAAA,MAChD,OAAO;AACL,cAAM,kBAAkB,KAAK,sCAAsC,EAAE,MAAM;AAC3E,sBAAc,YAAY,QAAQ,iBAAiB,OAAO;AAAA,MAC5D;AACA,gBAAU,EAAE,OAAO;AAAA,IACrB,CAAC;AACD,cAAU,cAAA,EAAgB,QAAQ,CAAA,SAAQ;AACxC,oBAAc,aAAa,KAAK,CAAC,EAAE,MAAM,KAAK,CAAC,CAAC;AAAA,IAClD,CAAC;AAAA,EACH;AAAA,EAEQ,4BAA4B,YAAyB;AAC3D,UAAM,OAAO,WAAW,aAAa,MAAM;AAC3C,UAAM,SAAS,WAAW,aAAa,QAAQ;AAE/C,QAAI,SAAS,SAAS;AACpB,YAAM,WAAW,WAAW,aAAa,UAAU;AACnD,YAAM,OAAO,IAAI,UAAU,UAAU,CAAA,GAAI,CAAA,GAAI,EAAE;AAC/C,WAAK,wBAAwB,UAAU,KAAK,QAA2C;AACvF,YAAM,oBAAoB,KAAK,eAAe,qBAAqB,IAAI;AACvE,UAAI,mBAAmB;AACrB,cAAM,aAAa,kBAAkB,QAAQ,SAAS;AACtD,cAAM,OAAO,kBAAkB,OAAO,OAAO;AAC7C,aAAK,wBAAwB,MAAM,KAAK,KAAwC;AAChF,aAAK,aAAa,mBAAmB,YAAY,IAAI;AACrD,aAAK,iBAAiB,KAAK;AAAA,UACzB,MAAM;AAAA,UACN,OAAO;AAAA,QAAA,CACR;AACD,aAAK,OAAO,aAAA;AACZ,eAAO;AAAA,MACT;AACA,UAAI,cAAc;AAClB,WAAK,OAAO,cAAc,UAAA,EAAY,KAAK,MAAM;AAC/C,eAAO,KAAK,eAAe,mBAAmB,IAAI;AAAA,MACpD,CAAC,EAAE,KAAK,CAAA,gBAAe;AACrB,YAAI,aAAa;AACf;AAAA,QACF;AACA,cAAM,aAAa,YAAY,QAAQ,SAAS;AAChD,cAAM,QAAQ,YAAY,OAAO,OAAO;AACxC,aAAK,wBAAwB,OAAO,KAAK,KAAwC;AACjF,aAAK,aAAa,aAAa,YAAY,IAAI;AAC/C,aAAK,iBAAiB,KAAK;AAAA,UACzB,MAAM;AAAA,UACN,OAAO;AAAA,QAAA,CACR;AACD,aAAK,OAAO,aAAA;AAAA,MACd,CAAC;AACD,WAAK,iBAAiB,kBAAkB,MAAM;AAC5C,sBAAc;AAAA,MAChB,CAAC;AACD,aAAO;AAAA,IACT;AAEA,UAAM,eAAe,WAAW,QAAA;AAChC,UAAM,UAAU,aAAa,CAAC,GAAG;AAEjC,QAAI,EAAE,mBAAmBA,OAAQ;AAC/B,YAAM,mBAAmB,0CAA0C;AAAA,IACrE;AAEA,UAAM,YAAY,IAAI,KAAK,UAAU,CAAA,GAAI,CAAA,CAAE;AAE3C,UAAM,kBAAkB,WAAW,aAAa,OAAO;AACvD,SAAK,wBAAwB,iBAAiB,UAAU,KAAwC;AAEhG,SAAK,0BAA0B,SAAS,SAAS;AAEjD,SAAK,SAAS,SAAS,SAAS;AAChC,WAAO;AAAA,EACT;AAAA,EAEQ,0BAA0B,SAAgB,WAAiB;AACjE,UAAM,QAAQ,QAAQ,QAAA;AAEtB,UAAM,QAAQ,QAAQ,cAAA;AACtB,WAAO,KAAK,KAAK,EAAE,QAAQ,CAAA,QAAO;AAChC,YAAM,YAAY,KAAK,SAAS,aAAa,GAAG;AAChD,UAAI,WAAW;AACb,kBAAU,aAAa,WAAW,MAAM,GAAG,CAAC;AAAA,MAC9C;AAAA,IACF,CAAC;AACD,eAAW,UAAU,OAAO;AAC1B,UAAI,OAAO,QAAQ;AACjB,YAAI,OAAO,OAAO,WAAW,UAAU;AACrC,gBAAM,UAAU,qBAAqB,KAAK,UAAU,OAAO,UAAU;AACrE,oBAAU,OAAO,OAAO,QAAQ,OAAO;AAAA,QACzC,OAAO;AACL,gBAAM,kBAAkB,OAAO;AAC/B,gBAAM,YAAY,KAAK,sCAAsC,eAAe;AAC5E,oBAAU,OAAO,WAAW,qBAAqB,KAAK,UAAU,OAAO,UAAU,CAAC;AAAA,QACpF;AAAA,MACF,OAAO;AACL,cAAM,mBAAmB,0BAA0B;AAAA,MACrD;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,8BAA8B,YAAiB;AACrD,QAAI,sBAAsB,MAAM;AAC9B,aAAO,KAAK,4BAA4B,UAAU;AAAA,IACpD;AACA,QAAI,MAAM,QAAQ,UAAU,GAAG;AAC7B,aAAO,KAAK,8BAA8B,UAA+B;AAAA,IAC3E;AACA,QAAI,OAAO,eAAe,YAAY,eAAe,MAAM;AACzD,aAAO,KAAK,0BAA0B,UAAU;AAAA,IAClD;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,gCAAgC,aAAkB;AACxD,QAAI,uBAAuBH,KAAM;AAC/B,aAAO,KAAK,0BAA0B,WAAW;AAAA,IACnD;AACA,QAAI,uBAAuBE,SAAQ;AACjC,aAAO,KAAK,8BAA8B,WAAW;AAAA,IACvD;AACA,QAAI,uBAAuBC,MAAO;AAChC,aAAO,KAAK,4BAA4B,WAAW;AAAA,IACrD;AACA,WAAO;AAAA,EACT;AAAA,EAGQ,sCAAsC,WAAkD;AAC9F,UAAM,kBAAkB,IAAIH,IAAA;AAC5B,oBAAgB,IAAI,QAAQ,UAAU,IAAI;AAE1C,QAAI,qBAAqB,gBAAgB;AACvC,sBAAgB,IAAI,QAAQ,OAAO;AACnC,YAAM,iBAAiB,KAAK,0BAA0B,UAAU,QAAQ;AACxE,sBAAgB,IAAI,YAAY,cAAc;AAC9C,YAAM,QAAQ,UAAU;AACxB,UAAI,cAAc;AAClB,YAAM,iBAAiB,kBAAkB,MAAM;AAC7C,sBAAc;AAAA,MAChB,CAAC;AACD,WAAK,eAAe,0BAA0B,SAAS,EAAE,KAAK,CAAA,gBAAe;AAC3E,YAAI,aAAa;AACf;AAAA,QACF;AACA,cAAMI,SAAQ,YAAY,OAAO,OAAO;AACxC,aAAK,cAAc,aAAaA,QAAO,SAAS;AAChD,aAAK,iBAAiB,KAAK;AAAA,UACzB,OAAOA;AAAAA,UACP,MAAM;AAAA,QAAA,CACP;AACD,aAAK,cAAc,WAAW;AAC9B,kBAAU,OAAO,aAAA;AAAA,MACnB,CAAC;AACD,aAAO;AAAA,IACT;AAEA,UAAM,cAAc,KAAK,0BAA0B,UAAU,KAAwC;AACrG,oBAAgB,IAAI,SAAS,WAAW;AACxC,oBAAgB,IAAI,QAAQ,MAAM;AAClC,WAAO;AAAA,EACT;AAAA,EAEQ,sCAAsC,MAA4B;AACxE,UAAM,gBAAgB,KAAK,IAAI,MAAM;AACrC,UAAM,OAAO,KAAK,IAAI,MAAM;AAE5B,QAAI;AACJ,QAAI,SAAS,SAAS;AACpB,iBAAW,KAAK,SAAS,sBAAsB,eAAe,CAAA,GAAI,EAAE;AACpE,UAAI,oBAAoB,gBAAgB;AACtC,cAAM,iBAAiB,KAAK,IAAI,UAAU;AAC1C,aAAK,wBAAwB,gBAAgB,SAAS,QAAQ;AAC9D,cAAM,oBAAoB,KAAK,eAAe,0BAA0B,QAAQ;AAChF,YAAI,mBAAmB;AACrB,gBAAMA,SAAQ,kBAAkB,OAAO,OAAO;AAC9C,eAAK,cAAc,mBAAmBA,QAAO,QAAS;AACtD,eAAK,iBAAiB,KAAK;AAAA,YACzB,OAAOA;AAAAA,YACP,MAAM;AAAA,UAAA,CACP;AACD,mBAAS,OAAO,aAAA;AAChB,iBAAO;AAAA,QACT;AAEA,cAAM,QAAQ,SAAS;AACvB,YAAI,cAAc;AAClB,iBAAS,OAAO,cAAc,UAAA,EAAY,KAAK,MAAM;AACnD,iBAAO,KAAK,eAAe,wBAAwB,QAA0B;AAAA,QAC/E,CAAC,EACE,KAAK,CAAA,gBAAe;AACnB,cAAI,aAAa;AACf;AAAA,UACF;AACA,gBAAMA,SAAQ,YAAY,OAAO,OAAO;AACxC,eAAK,cAAc,aAAaA,QAAO,QAAS;AAChD,eAAK,iBAAiB,KAAK;AAAA,YACzB,OAAOA;AAAAA,YACP,MAAM;AAAA,UAAA,CACP;AACC,mBAA4B,OAAO,aAAA;AAAA,QACvC,CAAC;AACH,cAAM,iBAAiB,kBAAkB,MAAM;AAC7C,wBAAc;AAAA,QAChB,CAAC;AAAA,MACH,WAAW,oBAAoB,WAAW;AACxC,cAAM,mBAAmB,oBAAoB,aAAa,8BAA8B;AAAA,MAC1F;AAAA,IACF,OAAO;AACL,YAAM,cAAc,KAAK,IAAI,OAAO;AACpC,YAAM,QAAQ,KAAK,0BAA0B,WAAW;AACxD,iBAAW,KAAK,SAAS,sBAAsB,eAAe,KAAK;AAAA,IACrE;AACA,QAAI,UAAU;AACZ,aAAO;AAAA,IACT;AAEA,UAAM,mBAAmB,mCAAmC,aAAa,KAAK;AAAA,EAChF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,UAAU,aAA0B,YAA+B;AACzE,aAAS,SAAS,MAAc;AAC9B,cAAQ,MAAM,mBAAmB,GAAG,IAAI,oCAAoC,WAAW,iBAAiB,SAAA,EAAW,KAAK,GAAG,CAAC,EAAE,CAAC;AAAA,IACjI;AAEA,UAAM,MAAM,WAAW,iBAAiB,aAAa,UAAU,CAAC,YAAY;AAC1E,WAAK,eAAe,YAAY,KAAK,CAAC,WAAW,iBAAiB,mBAAmB,MAAM;AACzF,YAAI,QAAQ;AACZ,mBAAW,UAAU,SAAS;AAC5B,kBAAQ,OAAO,MAAA;AAAA,YACb,KAAK;AACH,sBAAQ,OAAO;AACf;AAAA,YACF,KAAK;AAAU;AACb,sBAAM,MAAM,OAAO;AACnB,oBAAI,CAAC,MAAM,QAAQ,GAAG,GAAG;AACvB,wBAAM,mBAAmB,mDAAmD;AAAA,gBAC9E;AACA,sBAAM,OAAO,IAAI,IAAI,CAAA,SAAQ;AAC3B,yBAAO,KAAK,8BAA8B,IAAI;AAAA,gBAChD,CAAC;AACD,oBAAI,SAAS,YAAY,QAAQ;AAC/B,8BAAY,OAAO,OAAO,IAAI;AAAA,gBAChC,OAAO;AACL,8BAAY,OAAO,YAAY,QAAQ,IAAI;AAC3C,2BAAS,QAAQ;AAAA,gBACnB;AAAA,cACF;AACE;AAAA,YACF,KAAK;AACH,kBAAI,OAAO,SAAS,GAAG;AACrB;AAAA,cACF;AACA,kBAAI,QAAQ,YAAY,QAAQ;AAC9B,4BAAY,OAAO,OAAO,OAAO,KAAK;AAAA,cACxC,OAAO;AACL,yBAAS,QAAQ;AAAA,cACnB;AACA;AAAA,YACF,KAAK;AACH,kBAAI,OAAO,QAAQ,YAAY,QAAQ;AACrC,4BAAY,OAAO,OAAO,OAAO,CAAC;AAClC,4BAAY,OAAO,OAAO,OAAO,CAAC,KAAK,8BAA8B,OAAO,GAAG,CAAC,CAAC;AAAA,cACnF,OAAO;AACL,4BAAY,OAAO,YAAY,QAAQ,CAAC,KAAK,8BAA8B,OAAO,GAAG,CAAC,CAAC;AACvF,yBAAS,UAAU;AAAA,cACrB;AACA;AAAA,UAAA;AAAA,QAEN;AAAA,MACF,CAAC;AAAA,IACH,CAAC;AAED,UAAM,aAAa,CAAC,IAAsB,OAAoB;AAC5D,WAAK,gBAAgB,IAAI,MAAM;AAC7B,YAAI,QAAQ;AACZ,WAAG,MAAM,QAAQ,CAAC,WAAW;AAC3B,cAAI,QAAQ,IAAI,QAAQ,QAAQ,GAAG;AACjC,qBAAS,OAAO;AAAA,UAClB,WAAW,OAAO,QAAQ;AACxB,kBAAM,OAAQ,OAAO,OAAsB,IAAI,CAAC,SAAS;AACvD,qBAAO,KAAK,gCAAgC,IAAI;AAAA,YAClD,CAAC;AACD,uBAAW,OAAO,OAAO,GAAG,GAAG,IAAI;AACnC,qBAAS,KAAK;AAAA,UAChB,WAAW,OAAO,QAAQ;AACxB,uBAAW,OAAO,OAAO,OAAO,MAAM;AAAA,UACxC;AAAA,QACF,CAAC;AAAA,MACH,CAAC;AAAA,IACH;AAEA,gBAAY,QAAQ,UAAU;AAC9B,eAAW,iBAAiB,kBAAkB,MAAM;AAClD,UAAI,YAAA;AACJ,kBAAY,UAAU,UAAU;AAAA,IAClC,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,WAAW,cAAyB,aAA8C;AACxF,UAAM,aAAa,CAAC,IAAoB,OAAoB;AAC1D,WAAK,gBAAgB,IAAI,MAAM;AAC7B,WAAG,QAAQ,KAAK,QAAQ,CAAC,MAAM,QAAQ;AACrC,cAAI,KAAK,WAAW,SAAS,KAAK,WAAW,UAAU;AACrD,kBAAM,QAAQ,aAAa,IAAI,GAAG;AAClC,wBAAY,GAAG,IAAI,KAAK,gCAAgC,KAAK;AAAA,UAC/D,OAAO;AACL,oBAAQ,eAAe,aAAa,GAAG;AAAA,UACzC;AAAA,QACF,CAAC;AAAA,MACH,CAAC;AAAA,IACH;AAEA,iBAAa,QAAQ,UAAU;AAE/B,UAAM,MAAM,YAAY,iBAAiB,aAAa,UAAU,CAAC,YAAY;AAC3E,WAAK,eAAe,aAAa,KAAK,CAAC,YAAY,iBAAiB,mBAAmB,MAAM;AAC3F,mBAAW,UAAU,SAAS;AAC5B,kBAAQ,OAAO,MAAA;AAAA,YACb,KAAK;AAAW;AACd,sBAAM,WAAW,KAAK,8BAA8B,OAAO,GAAG;AAC9D,6BAAa,IAAI,OAAO,KAAK,QAAQ;AACrC,oBAAI,aAAa,SAAS,GAAG;AAE3B,0BAAQ,MAAM,mBAAmB,0BAA0B,OAAO,GAAG,EAAE,CAAC;AAAA,gBAC1E;AAAA,cACF;AACE;AAAA,YACF,KAAK;AACH,2BAAa,OAAO,OAAO,GAAG;AAC9B;AAAA,UAAA;AAAA,QAEN;AAAA,MACF,CAAC;AAAA,IACH,CAAC;AAED,gBAAY,iBAAiB,kBAAkB,WAAY;AACzD,mBAAa,UAAU,UAAU;AACjC,UAAI,YAAA;AAAA,IACN,CAAC;AAAA,EACH;AAAA,EAEQ,eAAe,MAAmB,QAAiB,IAAgB;AACzE,QAAI,KAAK,oBAAoB,CAAC,MAAM;AAClC;AAAA,IACF;AACA,QAAI,aAAa,KAAK,oBAAoB,IAAI,IAAI;AAClD,QAAI,CAAC,YAAY;AACf,mBAAa,CAAA;AACb,WAAK,oBAAoB,IAAI,MAAM,UAAU;AAAA,IAC/C;AACA,eAAW,KAAK;AAAA,MACd;AAAA,MACA,QAAQ;AAAA,IAAA,CACT;AAAA,EACH;AAAA,EAEQ,gBAAgB,IAAiB,IAAgB;AACvD,QAAI,GAAG,WAAW,GAAG,KAAK;AACxB;AAAA,IACF;AACA,SAAK,mBAAmB;AACxB,QAAI,GAAG,kBAAkB,aAAa;AACpC,WAAK,UAAU,qBAAqB,EAAE;AAAA,IACxC,OAAO;AACL,WAAK,UAAU,qBAAqB,EAAE;AAAA,IACxC;AACA,SAAK,mBAAmB;AAAA,EAC1B;AACF;AA7wBa,cAANP,kBAAA;AAAA,EADN,WAAA;AAAW,GACC,WAAA;AA+wBb,SAAS,qBAAqB,UAAoB,OAAc;AAC9D,QAAM,UAAmB,CAAA;AACzB,MAAI,OAAO;AACT,WAAO,KAAK,KAAK,EAAE,QAAQ,CAAA,QAAO;AAChC,YAAM,YAAY,SAAS,aAAa,GAAG;AAC3C,UAAI,WAAW;AACb,gBAAQ,KAAK,CAAC,WAAW,MAAM,GAAG,CAAC,CAAC;AAAA,MACtC;AAAA,IACF,CAAC;AAAA,EACH;AACA,SAAO;AACT;AC53BO,MAAe,WAAc;AAAA,EAClC;AAAA,EACU,YAAY,IAAI,QAAA;AAAA,EAE1B,cAAc;AACZ,SAAK,SAAS,KAAK,UAAU,aAAA;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO;AACL,SAAK,UAAU,KAAA;AAAA,EACjB;AAaF;;;;;;;;;;ACxBO,IAAM,2BAAN,MAAkD;AAAA,EAkCvD,YAAoB,aACA,WACA,kBAC4B,WAChB,mBAA4C;AAJxD,SAAA,cAAA;AACA,SAAA,YAAA;AACA,SAAA,mBAAA;AAC4B,SAAA,YAAA;AAChB,SAAA,oBAAA;AAC9B,SAAK,WAAW,KAAK,YAAY,aAAA;AACjC,SAAK,SAAS,KAAK,UAAU,aAAA;AAC7B,SAAK,YAAY,KAAK,aAAa,aAAA;AACnC,SAAK,SAAS,KAAK,UAAU,aAAA;AAAA,EAC/B;AAAA,EAToB;AAAA,EACA;AAAA,EACA;AAAA,EAC4B;AAAA,EAChB;AAAA,EArChC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA,IAAI,UAAU;AACZ,WAAO,KAAK,YAAY,SAAS,KAAK,KAAK,QAAQ;AAAA,EACrD;AAAA,EAEA,IAAI,aAAa;AACf,WAAO,KAAK,YAAY,SAAS,KAAK,KAAK,QAAQ,KAAK,YAAY;AAAA,EACtE;AAAA,EAEA,WAAW;AAAA,EAEH,cAAc,IAAI,QAAA;AAAA,EAClB,YAAY,IAAI,QAAA;AAAA,EAChB,eAAe,IAAI,QAAA;AAAA,EACnB,YAAY,IAAI,QAAA;AAAA,EAChB,cAAkC,CAAA;AAAA,EAElC,QAAQ;AAAA,EAER,YAAqC;AAAA,EACrC,QAAa;AAAA,EACb,iBAAwC;AAAA,EAExC,eAAe,IAAI,aAAA;AAAA,EAEnB,8BAAc,IAAA;AAAA,EAEd,qCAAqB,IAAA;AAAA,EAa7B,SAAS;AACP,SAAK,WAAW;AAChB,UAAM,OAAO,KAAK,YAAY,KAAK,OAAO,eAAe;AACzD,UAAM,gBAAgB,KAAK,iBAAiB;AAC5C,SAAK,YAAY,kBAAkB,KAAK,YAAY,MAAM,MAAM,aAAa;AAE7E,SAAK,WAAW,MAAM,KAAK,YAAY,IAAI;AAE3C,SAAK,aAAa;AAAA,MAChB,KAAK,YAAY,cAAc,UAAU,CAAC,EAAE,OAAO,WAAW;AAC5D,YAAI,KAAK,QAAQ,IAAI,KAAK,GAAG;AAC3B;AAAA,QACF;AACA,aAAK,QAAQ,IAAI,KAAK;AACtB,YAAI,KAAK,UAAU;AACjB,eAAK,WAAW,OAAO,IAAI;AAAA,QAC7B;AAAA,MACF,CAAC;AAAA,MACD,KAAK,UAAU,oBAAoB,UAAU,MAAM;AACjD,aAAK,iBAAiB,KAAK,YAAY,0BAAA;AAAA,MACzC,CAAC;AAAA,IAAA;AAAA,EAEL;AAAA,EAEA,UAAU;AACR,QAAI,CAAC,KAAK,YAAY;AACpB;AAAA,IACF;AACA,iBAAa,KAAK,KAAY;AAC9B,UAAM,OAAO,KAAK,YAAY,KAAK,KAAK;AACxC,QAAI,MAAM;AACR,iBAAW,KAAK,KAAK,cAAc;AACjC,UAAE,KAAA;AAAA,MACJ;AACA,WAAK,YAAY,sBAAsB,KAAK,KAAK;AAAA,IACnD;AACA,SAAK;AACL,SAAK,aAAa,KAAA;AAClB,SAAK,YAAY,KAAA;AAAA,EACnB;AAAA,EAEA,OAAO;AACL,QAAI,CAAC,KAAK,SAAS;AACjB;AAAA,IACF;AACA,iBAAa,KAAK,KAAY;AAC9B,QAAI;AACJ,QAAI,KAAK,WAAW;AAClB,yBAAmB,KAAK;AACxB,WAAK,YAAY;AAAA,IACnB,OAAO;AACL,WAAK;AACL,yBAAmB,KAAK,YAAY,KAAK,KAAK;AAAA,IAChD;AACA,QAAI,MAAM,iBAAiB,aAAa;AACxC,WAAO,MAAM,GAAG;AACd;AACA,uBAAiB,aAAa,GAAG,EAAE,KAAA;AAAA,IACrC;AACA,QAAI,kBAAkB;AACpB,YAAM,iBAAiB,iBAAiB;AACxC,WAAK,YAAY,sBAAsB,cAAc;AACrD,WAAK,UAAU,KAAA;AACf,WAAK,YAAY,KAAA;AAAA,IACnB;AAAA,EACF;AAAA,EAEA,QAAQ;AACN,SAAK,cAAc,CAAA;AACnB,SAAK,YAAY;AACjB,SAAK,QAAQ;AACb,SAAK,iBAAiB;AACtB,iBAAa,KAAK,KAAY;AAC9B,SAAK,eAAe,QAAQ,CAAC,gBAAgB;AAC3C,kBAAY,MAAA;AAAA,IACd,CAAC;AACD,SAAK,YAAY,KAAA;AAAA,EACnB;AAAA,EAEA,UAAU;AACR,SAAK,MAAA;AACL,SAAK,iBAAiB,KAAK,YAAY;AACvC,SAAK,aAAa,YAAA;AAClB,SAAK,eAAe,QAAQ,CAAC,gBAAgB;AAC3C,kBAAY,QAAA;AAAA,IACd,CAAC;AACD,SAAK,QAAQ,MAAA;AACb,SAAK,eAAe,MAAA;AAAA,EACtB;AAAA,EAEQ,WAAW,OAA0B,MAAY;AACvD,UAAM,oBAAoB,KAAK,qBAAqB,CAAA;AACpD,UAAM,cAAc,IAAI,YAAY,OAAO;AAAA,MACzC,gBAAgB,oBAAI,IAAI,CAAC,IAAI,CAAC;AAAA,MAC9B,gBAAgB;AAAA,MAChB,mBAAmB,KAAK;AACtB,YAAI,kBAAkB,oBAAoB;AACxC,iBAAO,kBAAkB,mBAAmB,GAAG;AAAA,QACjD;AACA,eAAO;AAAA,MACT;AAAA,MACA,aAAa,MAAY;AACvB,YAAI,kBAAkB,cAAc;AAClC,iBAAO,kBAAkB,aAAa,IAAI;AAAA,QAC5C;AACA,eAAO;AAAA,MACT;AAAA,IAAA,CACD;AAED,gBAAY,GAAG,oBAAoB,CAAC,UAAe;AACjD,UAAI,MAAM,SAAS,UAAU,EAAE,MAAM,kBAAkB,cAAc;AACnE,YAAI,KAAK,SAAS,KAAK,YAAY,QAAQ;AACzC,gBAAM,YAAY,KAAK,YAAY,MAAM,KAAK,KAAK;AACnD,oBAAU,QAAQ,CAAA,SAAQ;AACxB,iBAAK,aAAa,QAAQ,CAAA,MAAK;AAC7B,gBAAE,MAAM,OAAO,IAAI;AAAA,YACrB,CAAC;AAAA,UACH,CAAC;AACD,eAAK,YAAY,SAAS,KAAK;AAC/B,eAAK,YAAY,KAAA;AAAA,QACnB;AACA,YAAI,KAAK,cAAc,MAAM;AAC3B,eAAK,YAAY;AAAA,YACf,QAAQ,KAAK;AAAA,YACb,OAAO;AAAA,YACP,cAAc,CAAA;AAAA,UAAC;AAEjB,eAAK,QAAQ,WAAW,MAAM;AAC5B,gBAAI,KAAK,YAAY,UAAU,KAAK,WAAW;AAC7C,mBAAK,YAAY,MAAA;AAAA,YACnB,OAAO;AACL,mBAAK;AAAA,YACP;AAEA,iBAAK,UAAW,QAAQ,KAAK;AAC7B,iBAAK,YAAY,KAAK,KAAK,SAAU;AACrC,iBAAK,YAAY;AACjB,iBAAK,UAAU,KAAA;AACf,iBAAK,YAAY,KAAA;AAAA,UACnB,GAAG,GAAG;AAAA,QACR;AAEA,aAAK,UAAU,aAAa,KAAK,WAAW;AAAA,MAC9C;AAAA,IACF,CAAC;AAED,SAAK,eAAe,IAAI,WAAW;AAAA,EACrC;AACF;AAjMa,2BAANA,kBAAA;AAAA,EADN,WAAA;AAAA,EAsCc,0BAAO,kBAAkB,CAAA;AAAA,EACzB,gBAAA,GAAA,SAAA,CAAS;AAAA,GAtCX,wBAAA;;;;;;;;;ACTb,MAAM,wBAAwB,UAAU,qBAAqB;AAKtD,MAAe,eAAe;AAoCrC;AAGO,IAAM,oBAAN,cAAgC,eAAe;AAAA,EACpD,uBAAqC;AACnC,UAAM,sBAAsB,8CAA8C;AAAA,EAC5E;AAAA,EAEA,4BAA0C;AACxC,UAAM,sBAAsB,mDAAmD;AAAA,EACjF;AAAA,EAEA,0BAAwC;AACtC,UAAM,sBAAsB,mDAAmD;AAAA,EACjF;AAAA,EAEA,qBAAmC;AACjC,UAAM,sBAAsB,8CAA8C;AAAA,EAC5E;AAAA,EAEA,uBAA4B;AAC1B,UAAM,sBAAsB,8CAA8C;AAAA,EAC5E;AAAA,EAEA,4BAAiC;AAC/B,UAAM,sBAAsB,mDAAmD;AAAA,EACjF;AACF;AAxBa,oBAAN,gBAAA;AAAA,EADN,WAAA;AAAW,GACC,iBAAA;AC3CN,MAAe,cAAc;AAAA;AAAA;AAAA;AAAA,EAIlC;AAAA;AAAA;AAAA;AAAA,EAIA;AAAA,EAEU,YAAY,IAAI,QAAA;AAAA,EAChB,mBAAmB,IAAI,QAAA;AAAA,EAEvB,cAAc;AACtB,SAAK,SAAS,KAAK,UAAU,aAAA;AAC7B,SAAK,gBAAgB,KAAK,iBAAiB,aAAA;AAAA,EAC7C;AAaF;AC5BO,MAAM,4BAA4B,cAAc;AAAA,EACrD;AAAA,EAEA,YAAY,QAAyC;AACnD,UAAA;AACA,SAAK,UAAU,IAAI,mBAAmB;AAAA,MACpC,GAAG;AAAA,MACH,UAAU,CAAC,SAAS;AAClB,eAAO,WAAW,IAAI;AACtB,aAAK,UAAU,KAAA;AAAA,MACjB;AAAA,MACA,mBAAmB,CAAC,SAAS;AAC3B,eAAO,oBAAoB,IAAI;AAC/B,cAAM,SAAyB,KAAK,OAAO,IAAI,CAAA,UAAS;AACtD,iBAAO;AAAA,YACL,UAAU,MAAM;AAAA,YAChB,SAAS,MAAM;AAAA,UAAA;AAAA,QAEnB,CAAC;AACD,aAAK,iBAAiB,KAAK,MAAM;AAAA,MACnC;AAAA,IAAA,CACD;AAAA,EACH;AAAA,EAEA,mBAAmB,KAAa,MAA2B;AACzD,SAAK,QAAQ,kBAAkB,KAAK,IAAI;AAAA,EAC1C;AAAA,EAEA,YAAY;AACV,SAAK,QAAQ,WAAA;AACb,SAAK,QAAQ,QAAA;AAAA,EACf;AACF;AChCO,MAAM,4BAA4B,cAAc;AAAA,EACrD;AAAA,EAEQ,SAAS,CAAC,OAAgB;AAChC,QAAI,IAAI;AACN,WAAK,UAAU,KAAA;AAAA,IACjB;AAAA,EACF;AAAA,EAEQ,WAAW,MAAM;AACvB,UAAM,aAA6B,CAAA;AACnC,SAAK,QAAQ,UAAU,UAAA,EAAY,QAAQ,CAAC,OAAO,OAAO;AACxD,iBAAW,KAAK;AAAA,QACd,UAAU;AAAA,QACV,SAAS,MAAM;AAAA,MAAA,CAChB;AAAA,IACH,CAAC;AACD,SAAK,iBAAiB,KAAK,UAAU;AAAA,EACvC;AAAA,EAEA,YAAY,KAAa,UAAkB,MAAY;AACrD,UAAA;AACA,SAAK,SAAS,KAAK,UAAU,aAAA;AAC7B,SAAK,gBAAgB,KAAK,iBAAiB,aAAA;AAC3C,SAAK,UAAU,IAAI,kBAAkB,KAAK,UAAU,IAAI;AAExD,SAAK,QAAQ,KAAK,QAAQ,KAAK,MAAM;AACrC,SAAK,QAAQ,UAAU,GAAG,UAAU,KAAK,QAAQ;AAAA,EACnD;AAAA,EAEA,mBAAmB,KAAa,MAA2B;AACzD,SAAK,QAAQ,UAAU,mBAAmB,KAAK,IAAI;AAAA,EACrD;AAAA,EAEA,YAAY;AACV,SAAK,QAAQ,UAAU,IAAI,UAAU,KAAK,QAAQ;AAClD,SAAK,QAAQ,WAAA;AACb,SAAK,QAAQ,QAAA;AAAA,EACf;AACF;AChCO,MAAM,kBAAoC;AAAA,EAsB/C,YAAmB,QAA2B;AAA3B,SAAA,SAAA;AAAA,EACnB;AAAA,EADmB;AAAA,EArBX,eAAe,IAAI,aAAA;AAAA,EAC3B,YAAwB;AAAA,IACtB;AAAA,IACA;AAAA,IACA;AAAA,MACE,SAAS;AAAA,MACT,aAAa;AAAA,IAAA;AAAA,IACZ;AAAA,MACD,SAAS;AAAA,MACT,YAAY,CAAC,WAAwB;AACnC,eAAO,KAAK,OAAO,gBAAgB,OAAO,IAAI;AAAA,MAChD;AAAA,MACA,MAAM,CAAC,WAAW;AAAA,IAAA;AAAA,IACjB;AAAA,MACD,SAAS;AAAA,MACT,UAAU;AAAA,IAAA;AAAA,EACZ;AAAA,EAGM,QAAa;AAAA,EAKrB,MAAM,SAAsE;AAC1E,UAAM,aAAa,QAAQ,IAAI,YAAY,IAAI;AAC/C,UAAM,YAAY,QAAQ,IAAI,aAAa;AAC3C,UAAM,SAAS,QAAQ,IAAI,WAAW;AACtC,QAAI,YAAY;AACd,YAAM,YAAY,QAAQ,IAAI,SAAS;AACvC,gBAAU,mBAAmB,WAAW,WAAW,IAAI,OAAO,CAAC;AAC/D,WAAK,aAAa;AAAA,QAChB,WAAW,OAAO,UAAU,MAAM;AAChC,oBAAU,mBAAmB,WAAW,WAAW,IAAI,OAAO,CAAC;AAAA,QACjE,CAAC;AAAA,QACD,UAAU,SAAS,UAAU,MAAM;AACjC,oBAAU,mBAAmB,WAAW,WAAW,IAAI,OAAO,CAAC;AAAA,QACjE,CAAC;AAAA,QACD,UAAU,cAAc,UAAU,CAAC,WAAW;AAC5C,qBAAW,QAAQ,QAAQ,OAAO;AAAA,QACpC,CAAC;AAAA,MAAA;AAAA,IAEL;AAEA,WAAO,UAAU,OAAO,UAAA,EAAY,KAAK,MAAM;AAC7C,UAAI,CAAC,KAAK,OAAO,UAAU;AACzB;AAAA,MACF;AACA,YAAM,OAAO,OAAO,KAAK,OAAO,eAAe;AAC/C,UAAI,KAAK,IAAI,OAAO,GAAG;AACrB;AAAA,MACF;AACA,aAAO,IAAI,QAAQ,CAAA,YAAW;AAC5B,cAAM,UAAU,MAAM;AACpB,cAAI,KAAK,IAAI,OAAO,GAAG;AACrB,oBAAA;AAAA,UACF,OAAO;AACL,iBAAK,QAAQ,WAAW,SAAS,GAAI;AAAA,UACvC;AAAA,QACF;AACA,aAAK,QAAQ,WAAW,SAAS,GAAI;AAAA,MACvC,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAAA,EAEA,UAAU,SAAkB;AAC1B,SAAK,aAAa,YAAA;AAClB,YAAQ,IAAI,WAAW,EAAE,QAAA;AACzB,YAAQ,IAAI,OAAO,EAAE,QAAA;AACrB,YAAQ,IAAI,aAAa,EAAE,UAAA;AAC3B,iBAAa,KAAK,KAAK;AAAA,EACzB;AACF;AC3EO,MAAM,kCAAoD;AAAA,EAwB/D,YAAmB,QAAsC;AAAtC,SAAA,SAAA;AAAA,EACnB;AAAA,EADmB;AAAA,EAvBX,eAAe,IAAI,aAAA;AAAA,EAC3B,YAAwB;AAAA,IACtB;AAAA,IACA;AAAA,IACA;AAAA,MACE,SAAS;AAAA,MACT,aAAa;AAAA,IAAA;AAAA,IACZ;AAAA,MACD,SAAS;AAAA,MACT,YAAY,CAAC,WAAwB;AACnC,eAAO,KAAK,OAAO,gBAAgB,OAAO,IAAI;AAAA,MAChD;AAAA,MACA,MAAM,CAAC,WAAW;AAAA,IAAA;AAAA,IACjB;AAAA,MACD,SAAS;AAAA,MACT,YAAY,MAAM;AAChB,eAAO,KAAK,OAAO;AAAA,MACrB;AAAA,IAAA;AAAA,EACF;AAAA,EAGM,QAAa;AAAA,EAKrB,MAAM,SAAsE;AAC1E,UAAM,aAAa,QAAQ,IAAI,YAAY,IAAI;AAC/C,UAAM,YAAY,QAAQ,IAAI,aAAa;AAC3C,UAAM,SAAS,QAAQ,IAAI,WAAW;AACtC,QAAI,YAAY;AACd,YAAM,YAAY,QAAQ,IAAI,SAAS;AACvC,gBAAU,mBAAmB,WAAW,WAAW,IAAI,OAAO,CAAC;AAC/D,WAAK,aAAa;AAAA,QAChB,WAAW,OAAO,UAAU,MAAM;AAChC,oBAAU,mBAAmB,WAAW,WAAW,IAAI,OAAO,CAAC;AAAA,QACjE,CAAC;AAAA,QACD,UAAU,SAAS,UAAU,MAAM;AACjC,oBAAU,mBAAmB,WAAW,WAAW,IAAI,OAAO,CAAC;AAAA,QACjE,CAAC;AAAA,QACD,UAAU,cAAc,UAAU,CAAC,WAAW;AAC5C,qBAAW,QAAQ,QAAQ,OAAO;AAAA,QACpC,CAAC;AAAA,MAAA;AAAA,IAEL;AACA,WAAO,UAAU,OAAO,UAAA,EAAY,KAAK,MAAM;AAC7C,UAAI,CAAC,KAAK,OAAO,UAAU;AACzB;AAAA,MACF;AACA,YAAM,OAAO,OAAO,KAAK,OAAO,eAAe;AAC/C,UAAI,KAAK,IAAI,OAAO,GAAG;AACrB;AAAA,MACF;AACA,aAAO,IAAI,QAAQ,CAAA,YAAW;AAC5B,cAAM,UAAU,MAAM;AACpB,cAAI,KAAK,IAAI,OAAO,GAAG;AACrB,oBAAA;AAAA,UACF,OAAO;AACL,iBAAK,QAAQ,WAAW,SAAS,GAAI;AAAA,UACvC;AAAA,QACF;AACA,aAAK,QAAQ,WAAW,SAAS,GAAI;AAAA,MACvC,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAAA,EAEA,UAAU,SAAkB;AAC1B,SAAK,aAAa,YAAA;AAClB,YAAQ,IAAI,WAAW,EAAE,QAAA;AACzB,YAAQ,IAAI,OAAO,EAAE,QAAA;AACrB,YAAQ,IAAI,aAAa,EAAE,UAAA;AAC3B,iBAAa,KAAK,KAAK;AAAA,EACzB;AACF;"}
|