@fluidframework/merge-tree 0.54.3 → 0.55.2
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/client.d.ts +5 -3
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +4 -6
- package/dist/client.js.map +1 -1
- package/dist/collections.d.ts.map +1 -1
- package/dist/collections.js +1 -0
- package/dist/collections.js.map +1 -1
- package/dist/partialLengths.d.ts.map +1 -1
- package/dist/partialLengths.js +4 -2
- package/dist/partialLengths.js.map +1 -1
- package/dist/snapshotChunks.d.ts +2 -1
- package/dist/snapshotChunks.d.ts.map +1 -1
- package/dist/snapshotChunks.js.map +1 -1
- package/dist/snapshotLoader.d.ts +1 -1
- package/dist/snapshotLoader.d.ts.map +1 -1
- package/dist/snapshotLoader.js.map +1 -1
- package/dist/snapshotV1.d.ts +6 -5
- package/dist/snapshotV1.d.ts.map +1 -1
- package/dist/snapshotV1.js +12 -28
- package/dist/snapshotV1.js.map +1 -1
- package/dist/snapshotlegacy.d.ts +7 -5
- package/dist/snapshotlegacy.d.ts.map +1 -1
- package/dist/snapshotlegacy.js +8 -35
- package/dist/snapshotlegacy.js.map +1 -1
- package/lib/client.d.ts +5 -3
- package/lib/client.d.ts.map +1 -1
- package/lib/client.js +4 -6
- package/lib/client.js.map +1 -1
- package/lib/collections.d.ts.map +1 -1
- package/lib/collections.js +1 -0
- package/lib/collections.js.map +1 -1
- package/lib/partialLengths.d.ts.map +1 -1
- package/lib/partialLengths.js +4 -2
- package/lib/partialLengths.js.map +1 -1
- package/lib/snapshotChunks.d.ts +2 -1
- package/lib/snapshotChunks.d.ts.map +1 -1
- package/lib/snapshotChunks.js.map +1 -1
- package/lib/snapshotLoader.d.ts +1 -1
- package/lib/snapshotLoader.d.ts.map +1 -1
- package/lib/snapshotLoader.js.map +1 -1
- package/lib/snapshotV1.d.ts +6 -5
- package/lib/snapshotV1.d.ts.map +1 -1
- package/lib/snapshotV1.js +12 -28
- package/lib/snapshotV1.js.map +1 -1
- package/lib/snapshotlegacy.d.ts +7 -5
- package/lib/snapshotlegacy.d.ts.map +1 -1
- package/lib/snapshotlegacy.js +8 -35
- package/lib/snapshotlegacy.js.map +1 -1
- package/package.json +18 -14
- package/src/client.ts +9 -9
- package/src/collections.ts +1 -0
- package/src/partialLengths.ts +4 -2
- package/src/snapshotChunks.ts +2 -4
- package/src/snapshotLoader.ts +1 -1
- package/src/snapshotV1.ts +28 -50
- package/src/snapshotlegacy.ts +27 -52
package/lib/collections.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"collections.js","sourceRoot":"","sources":["../src/collections.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\n/* eslint-disable @typescript-eslint/consistent-type-assertions, eqeqeq */\n/* eslint-disable no-bitwise */\n\n/* Remove once strictNullCheck is enabled */\n\nimport {\n ConflictAction,\n IIntegerRange,\n KeyComparer,\n PropertyAction,\n SortedDictionary,\n} from \"./base\";\n\nexport class Stack<T> {\n public items: T[] = [];\n public push(val: T) {\n this.items.push(val);\n }\n\n public empty() {\n return this.items.length === 0;\n }\n\n public top(): T | undefined {\n return this.items[this.items.length - 1];\n }\n\n public pop(): T | undefined {\n return this.items.pop();\n }\n}\n\nfunction ListRemoveEntry<U>(entry: List<U>): List<U> | undefined {\n if (entry === undefined) {\n return undefined;\n }\n else if (entry.isHead) {\n return undefined;\n }\n else {\n entry.next.prev = entry.prev;\n entry.prev.next = entry.next;\n }\n return (entry);\n}\n\nfunction ListMakeEntry<U>(data: U): List<U> {\n return new List<U>(false, data);\n}\n\nexport function ListMakeHead<U>(): List<U> {\n return new List<U>(true, undefined);\n}\n\nexport class List<T> {\n public next: List<T>;\n public prev: List<T>;\n\n constructor(public isHead: boolean, private data: T | undefined) {\n this.prev = this;\n this.next = this;\n }\n\n public clear(): void {\n if (this.isHead) {\n this.prev = this;\n this.next = this;\n }\n }\n\n private add(data: T): List<T> {\n const entry = ListMakeEntry(data);\n this.prev.next = entry;\n entry.next = this;\n entry.prev = this.prev;\n this.prev = entry;\n return (entry);\n }\n\n public dequeue(): T | undefined {\n if (!this.empty()) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const removedEntry = ListRemoveEntry(this.next)!;\n return removedEntry.data;\n }\n }\n\n public enqueue(data: T): List<T> {\n return this.add(data);\n }\n\n public walk(fn: (data: T, l: List<T>) => void): void {\n for (let entry = this.next; !(entry.isHead); entry = entry.next) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n fn(entry.data!, entry);\n }\n }\n\n public some(fn: (data: T, l: List<T>) => boolean, rev?: boolean): T[] {\n const rtn: T[] = [];\n const start = rev ? this.prev : this.next;\n for (let entry = start; !(entry.isHead); entry = rev ? entry.prev : entry.next) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const data = entry.data!;\n if (fn(data, entry)) {\n if (rev) {\n // preserve list order when in reverse\n rtn.unshift(data);\n } else {\n rtn.push(data);\n }\n }\n }\n return rtn;\n }\n\n public count(): number {\n let entry: List<T>;\n let i: number;\n\n entry = this.next;\n for (i = 0; !(entry.isHead); i++) {\n entry = entry.next;\n }\n return (i);\n }\n\n public first(): T | undefined {\n if (!this.empty()) {\n return (this.next.data);\n }\n }\n\n public last(): T | undefined {\n if (!this.empty()) {\n return (this.prev.data);\n }\n }\n\n public empty(): boolean {\n return (this.next === this);\n }\n\n public push(data: T): void {\n const entry = ListMakeEntry(data);\n entry.data = data;\n entry.isHead = false;\n entry.next = this.next;\n entry.prev = this;\n this.next = entry;\n entry.next.prev = entry;\n }\n}\n\nexport interface Comparer<T> {\n compare(a: T, b: T): number;\n min: T;\n}\n\nexport class Heap<T> {\n private L: T[];\n public count() {\n return this.L.length - 1;\n }\n constructor(a: T[], public comp: Comparer<T>) {\n this.L = [comp.min];\n for (let i = 0, len = a.length; i < len; i++) {\n this.add(a[i]);\n }\n }\n public peek() {\n return this.L[1];\n }\n\n public get() {\n const x = this.L[1];\n this.L[1] = this.L[this.count()];\n this.L.pop();\n this.fixdown(1);\n return x;\n }\n\n public add(x: T) {\n this.L.push(x);\n this.fixup(this.count());\n }\n\n private fixup(k: number) {\n let _k = k;\n while (_k > 1 && (this.comp.compare(this.L[_k >> 1], this.L[_k]) > 0)) {\n const tmp = this.L[_k >> 1];\n this.L[_k >> 1] = this.L[_k];\n this.L[_k] = tmp;\n _k = _k >> 1;\n }\n }\n\n private fixdown(k: number) {\n let _k = k;\n while ((_k << 1) <= (this.count())) {\n let j = _k << 1;\n if ((j < this.count()) && (this.comp.compare(this.L[j], this.L[j + 1]) > 0)) {\n j++;\n }\n if (this.comp.compare(this.L[_k], this.L[j]) <= 0) {\n break;\n }\n const tmp = this.L[_k];\n this.L[_k] = this.L[j];\n this.L[j] = tmp;\n _k = j;\n }\n }\n}\n\nexport const enum RBColor {\n RED,\n BLACK,\n}\n\nexport interface RBNode<TKey, TData> {\n key: TKey;\n data: TData;\n left: RBNode<TKey, TData> | undefined;\n right: RBNode<TKey, TData> | undefined;\n color: RBColor;\n size: number;\n}\n\nexport interface IRBAugmentation<TKey, TData> {\n update(node: RBNode<TKey, TData>): void;\n}\n\nexport interface IRBMatcher<TKey, TData> {\n continueSubtree(node: RBNode<TKey, TData> | undefined, key: TKey): boolean;\n matchNode(node: RBNode<TKey, TData> | undefined, key: TKey): boolean;\n}\n\nexport interface RBNodeActions<TKey, TData> {\n infix?(node: RBNode<TKey, TData>): boolean;\n pre?(node: RBNode<TKey, TData>): boolean;\n post?(node: RBNode<TKey, TData>): boolean;\n showStructure?: boolean;\n}\n\nexport class RedBlackTree<TKey, TData> implements SortedDictionary<TKey, TData> {\n private root: RBNode<TKey, TData> | undefined;\n\n constructor(\n private readonly compareKeys: KeyComparer<TKey>,\n private readonly aug?: IRBAugmentation<TKey, TData>,\n ) { }\n\n private makeNode(key: TKey, data: TData, color: RBColor, size: number) {\n return <RBNode<TKey, TData>>{ key, data, color, size };\n }\n\n private isRed(node: RBNode<TKey, TData> | undefined) {\n return !!node && (node.color == RBColor.RED);\n }\n\n private nodeSize(node: RBNode<TKey, TData> | undefined) {\n return node ? node.size : 0;\n }\n public size() {\n return this.nodeSize(this.root);\n }\n public isEmpty() {\n return !this.root;\n }\n public get(key: TKey) {\n if (key !== undefined) {\n return this.nodeGet(this.root, key);\n }\n }\n private nodeGet(node: RBNode<TKey, TData> | undefined, key: TKey) {\n let _node = node;\n while (_node) {\n const cmp = this.compareKeys(key, _node.key);\n if (cmp < 0) {\n _node = _node.left;\n }\n else if (cmp > 0) {\n _node = _node.right;\n }\n else {\n return _node;\n }\n }\n }\n private contains(key: TKey) {\n return this.get(key);\n }\n\n public gather(key: TKey, matcher: IRBMatcher<TKey, TData>) {\n const results = [] as RBNode<TKey, TData>[];\n if (key !== undefined) {\n this.nodeGather(this.root, results, key, matcher);\n }\n return results;\n }\n\n private nodeGather(\n node: RBNode<TKey, TData> | undefined,\n results: RBNode<TKey, TData>[],\n key: TKey,\n matcher: IRBMatcher<TKey, TData>) {\n if (node) {\n if (matcher.continueSubtree(node.left, key)) {\n this.nodeGather(node.left, results, key, matcher);\n }\n if (matcher.matchNode(node, key)) {\n results.push(node);\n }\n if (matcher.continueSubtree(node.right, key)) {\n this.nodeGather(node.right, results, key, matcher);\n }\n }\n }\n\n public walkExactMatchesForward(\n compareFn: (node: RBNode<TKey, TData>) => number,\n actionFn: (node: RBNode<TKey, TData>) => void,\n continueLeftFn: (number: number) => boolean,\n continueRightFn: (number: number) => boolean) {\n this.nodeWalkExactMatchesForward(this.root, compareFn, actionFn, continueLeftFn, continueRightFn);\n }\n\n private nodeWalkExactMatchesForward(\n node: RBNode<TKey, TData> | undefined,\n compareFn: (node: RBNode<TKey, TData>) => number,\n actionFn: (node: RBNode<TKey, TData>) => void,\n continueLeftFn: (number: number) => boolean,\n continueRightFn: (number: number) => boolean) {\n if (!node) {\n return;\n }\n const result: number = compareFn(node);\n if (continueLeftFn(result)) {\n this.nodeWalkExactMatchesForward(node.left, compareFn, actionFn, continueLeftFn, continueRightFn);\n }\n if (result === 0) {\n actionFn(node);\n }\n if (continueRightFn(result)) {\n this.nodeWalkExactMatchesForward(node.right, compareFn, actionFn, continueLeftFn, continueRightFn);\n }\n }\n\n public walkExactMatchesBackward(\n compareFn: (node: RBNode<TKey, TData>) => number,\n actionFn: (node: RBNode<TKey, TData>) => void,\n continueLeftFn: (number: number) => boolean,\n continueRightFn: (number: number) => boolean) {\n this.nodeWalkExactMatchesBackward(this.root, compareFn, actionFn, continueLeftFn, continueRightFn);\n }\n\n private nodeWalkExactMatchesBackward(\n node: RBNode<TKey, TData> | undefined,\n compareFn: (node: RBNode<TKey, TData>) => number,\n actionFn: (node: RBNode<TKey, TData>) => void,\n continueLeftFn: (cmp: number) => boolean,\n continueRightFn: (cmp: number) => boolean) {\n if (!node) {\n return;\n }\n const result: number = compareFn(node);\n if (continueRightFn(result)) {\n this.nodeWalkExactMatchesBackward(node.right, compareFn, actionFn, continueLeftFn, continueRightFn);\n }\n if (result === 0) {\n actionFn(node);\n }\n if (continueLeftFn(result)) {\n this.nodeWalkExactMatchesBackward(node.left, compareFn, actionFn, continueLeftFn, continueRightFn);\n }\n }\n\n public put(key: TKey, data: TData, conflict?: ConflictAction<TKey, TData>) {\n if (key !== undefined) {\n if (data === undefined) {\n this.remove(key);\n }\n else {\n this.root = this.nodePut(this.root, key, data, conflict);\n this.root.color = RBColor.BLACK;\n }\n }\n }\n\n private nodePut(\n node: RBNode<TKey, TData> | undefined,\n key: TKey, data: TData,\n conflict?: ConflictAction<TKey, TData>,\n ) {\n let _node = node;\n if (!_node) {\n return this.makeNode(key, data, RBColor.RED, 1);\n }\n else {\n const cmp = this.compareKeys(key, _node.key);\n if (cmp < 0) {\n _node.left = this.nodePut(_node.left, key, data, conflict);\n }\n else if (cmp > 0) {\n _node.right = this.nodePut(_node.right, key, data, conflict);\n }\n else {\n if (conflict) {\n const kd = conflict(key, _node.key, data, _node.data);\n if (kd.key) {\n _node.key = kd.key;\n }\n if (kd.data) {\n _node.data = kd.data;\n } else {\n _node.data = data;\n }\n }\n else {\n _node.data = data;\n }\n }\n if (this.isRed(_node.right) && (!this.isRed(_node.left))) {\n _node = this.rotateLeft(_node);\n }\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n if (this.isRed(_node.left) && this.isRed(_node.left!.left)) {\n _node = this.rotateRight(_node);\n }\n if (this.isRed(_node.left) && this.isRed(_node.right)) {\n this.flipColors(_node);\n }\n _node.size = this.nodeSize(_node.left) + this.nodeSize(_node.right) + 1;\n if (this.aug) {\n this.updateLocal(_node);\n }\n return _node;\n }\n }\n\n private updateLocal(node: RBNode<TKey, TData>) {\n if (this.aug) {\n if (this.isRed(node.left)) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n this.aug.update(node.left!);\n }\n if (this.isRed(node.right)) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n this.aug.update(node.right!);\n }\n this.aug.update(node);\n }\n }\n\n private nodeRemoveMin(node: RBNode<TKey, TData>) {\n let _node = node;\n if (_node.left) {\n if ((!this.isRed(_node.left)) && (!this.isRed(_node.left.left))) {\n _node = this.moveRedLeft(_node);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n _node.left = this.nodeRemoveMin(_node.left!);\n return this.balance(_node);\n }\n }\n\n public remove(key: TKey) {\n if (key !== undefined) {\n if (!this.contains(key)) {\n return;\n }\n\n this.removeExisting(key);\n }\n // TODO: error on undefined key\n }\n\n public removeExisting(key: TKey) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n if ((!this.isRed(this.root!.left)) && (!this.isRed(this.root!.right))) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n this.root!.color = RBColor.RED;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n this.root = this.nodeRemove(this.root!, key);\n }\n\n private nodeRemove(node: RBNode<TKey, TData>, key: TKey) {\n let _node = node;\n if (this.compareKeys(key, _node.key) < 0) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n if ((!this.isRed(_node.left)) && (!this.isRed(_node.left!.left))) {\n _node = this.moveRedLeft(_node);\n }\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n _node.left = this.nodeRemove(_node.left!, key);\n }\n else {\n if (this.isRed(_node.left)) {\n _node = this.rotateRight(_node);\n }\n if ((this.compareKeys(key, _node.key) == 0) && (!_node.right)) {\n return undefined;\n }\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n if ((!this.isRed(_node.right)) && (!this.isRed(_node.right!.left))) {\n _node = this.moveRedRight(_node);\n }\n if (this.compareKeys(key, _node.key) == 0) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const subtreeMin = this.nodeMin(_node.right!);\n _node.key = subtreeMin.key;\n _node.data = subtreeMin.data;\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n _node.right = this.nodeRemoveMin(_node.right!);\n }\n else {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n _node.right = this.nodeRemove(_node.right!, key);\n }\n }\n return this.balance(_node);\n }\n private height() {\n return this.nodeHeight(this.root);\n }\n private nodeHeight(node: RBNode<TKey, TData> | undefined): number {\n if (node === undefined) {\n return -1;\n }\n else {\n return 1 + Math.max(this.nodeHeight(node.left), this.nodeHeight(node.right));\n }\n }\n\n public floor(key: TKey) {\n if (!this.isEmpty()) {\n return this.nodeFloor(this.root, key);\n }\n }\n\n private nodeFloor(node: RBNode<TKey, TData> | undefined, key: TKey): RBNode<TKey, TData> | undefined {\n if (node) {\n const cmp = this.compareKeys(key, node.key);\n if (cmp == 0) {\n return node;\n }\n else if (cmp < 0) {\n return this.nodeFloor(node.left, key);\n }\n else {\n const rightFloor = this.nodeFloor(node.right, key);\n if (rightFloor) {\n return rightFloor;\n }\n else {\n return node;\n }\n }\n }\n }\n\n public ceil(key: TKey) {\n if (!this.isEmpty()) {\n return this.nodeCeil(this.root, key);\n }\n }\n\n private nodeCeil(node: RBNode<TKey, TData> | undefined, key: TKey): RBNode<TKey, TData> | undefined {\n if (node) {\n const cmp = this.compareKeys(key, node.key);\n if (cmp == 0) {\n return node;\n }\n else if (cmp > 0) {\n return this.nodeCeil(node.right, key);\n }\n else {\n const leftCeil = this.nodeCeil(node.left, key);\n if (leftCeil) {\n return leftCeil;\n }\n else {\n return node;\n }\n }\n }\n }\n\n public min() {\n if (this.root) {\n return this.nodeMin(this.root);\n }\n }\n\n private nodeMin(node: RBNode<TKey, TData>): RBNode<TKey, TData> {\n if (!node.left) {\n return node;\n }\n else {\n return this.nodeMin(node.left);\n }\n }\n\n public max() {\n if (this.root) {\n return this.nodeMax(this.root);\n }\n }\n\n private nodeMax(node: RBNode<TKey, TData>): RBNode<TKey, TData> {\n if (!node.right) {\n return node;\n }\n else {\n return this.nodeMax(node.right);\n }\n }\n\n private rotateRight(node: RBNode<TKey, TData>) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const leftChild = node.left!;\n node.left = leftChild.right;\n leftChild.right = node;\n leftChild.color = leftChild.right.color;\n leftChild.right.color = RBColor.RED;\n leftChild.size = node.size;\n node.size = this.nodeSize(node.left) + this.nodeSize(node.right) + 1;\n if (this.aug) {\n this.updateLocal(node);\n this.updateLocal(leftChild);\n }\n return leftChild;\n }\n\n private rotateLeft(node: RBNode<TKey, TData>) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const rightChild = node.right!;\n node.right = rightChild.left;\n rightChild.left = node;\n rightChild.color = rightChild.left.color;\n rightChild.left.color = RBColor.RED;\n rightChild.size = node.size;\n node.size = this.nodeSize(node.left) + this.nodeSize(node.right) + 1;\n if (this.aug) {\n this.updateLocal(node);\n this.updateLocal(rightChild);\n }\n return rightChild;\n }\n\n private oppositeColor(c: RBColor) {\n return (c == RBColor.BLACK) ? RBColor.RED : RBColor.BLACK;\n }\n\n private flipColors(node: RBNode<TKey, TData>) {\n node.color = this.oppositeColor(node.color);\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n node.left!.color = this.oppositeColor(node.left!.color);\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n node.right!.color = this.oppositeColor(node.right!.color);\n }\n\n private moveRedLeft(node: RBNode<TKey, TData>) {\n let _node = node;\n this.flipColors(_node);\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n if (this.isRed(_node.right!.left)) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n _node.right = this.rotateRight(_node.right!);\n _node = this.rotateLeft(_node);\n this.flipColors(_node);\n }\n return _node;\n }\n\n private moveRedRight(node: RBNode<TKey, TData>) {\n let _node = node;\n this.flipColors(_node);\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n if (this.isRed(_node.left!.left)) {\n _node = this.rotateRight(_node);\n this.flipColors(_node);\n }\n return _node;\n }\n\n private balance(input: RBNode<TKey, TData>) {\n let node: RBNode<TKey, TData> | undefined = input;\n if (this.isRed(node.right)) {\n node = this.rotateLeft(node);\n }\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n if (this.isRed(node.left) && this.isRed(node.left!.left)) {\n node = this.rotateRight(node);\n }\n if (this.isRed(node.left) && (this.isRed(node.right))) {\n this.flipColors(node);\n }\n node.size = this.nodeSize(node.left) + this.nodeSize(node.right) + 1;\n if (this.aug) {\n this.aug.update(node);\n }\n return node;\n }\n\n public mapRange<TAccum>(action: PropertyAction<TKey, TData>, accum?: TAccum, start?: TKey, end?: TKey) {\n this.nodeMap(this.root, action, start, end);\n }\n\n public map<TAccum>(action: PropertyAction<TKey, TData>, accum?: TAccum) {\n // TODO: optimize to avoid comparisons\n this.nodeMap(this.root, action, accum);\n }\n\n public keys() {\n const keyList = <TKey[]>[];\n const actions = <RBNodeActions<TKey, TData>>{\n showStructure: true,\n infix: (node) => {\n keyList.push(node.key);\n return true;\n },\n };\n this.walk(actions);\n return keyList;\n }\n\n /**\n * Depth-first traversal with custom action; if action returns\n * false, traversal is halted.\n * @param action - action to apply to each node\n */\n public walk(actions: RBNodeActions<TKey, TData>) {\n this.nodeWalk(this.root, actions);\n }\n\n public walkBackward(actions: RBNodeActions<TKey, TData>) {\n this.nodeWalkBackward(this.root, actions);\n }\n\n private nodeWalk(node: RBNode<TKey, TData> | undefined, actions: RBNodeActions<TKey, TData>): boolean {\n let go = true;\n if (node) {\n if (actions.pre) {\n if (actions.showStructure || (node.color === RBColor.BLACK)) {\n go = actions.pre(node);\n }\n }\n if (node.left) {\n go = this.nodeWalk(node.left, actions);\n }\n if (go && actions.infix) {\n if (actions.showStructure || (node.color === RBColor.BLACK)) {\n go = actions.infix(node);\n }\n }\n if (go) {\n go = this.nodeWalk(node.right, actions);\n }\n if (go && actions.post) {\n if (actions.showStructure || (node.color === RBColor.BLACK)) {\n go = actions.post(node);\n }\n }\n }\n return go;\n }\n\n private nodeWalkBackward(node: RBNode<TKey, TData> | undefined, actions: RBNodeActions<TKey, TData>): boolean {\n let go = true;\n if (node) {\n if (actions.pre) {\n if (actions.showStructure || (node.color === RBColor.BLACK)) {\n go = actions.pre(node);\n }\n }\n if (node.right) {\n go = this.nodeWalkBackward(node.right, actions);\n }\n if (go && actions.infix) {\n if (actions.showStructure || (node.color === RBColor.BLACK)) {\n go = actions.infix(node);\n }\n }\n if (go) {\n go = this.nodeWalkBackward(node.left, actions);\n }\n if (go && actions.post) {\n if (actions.showStructure || (node.color === RBColor.BLACK)) {\n go = actions.post(node);\n }\n }\n }\n return go;\n }\n\n private nodeMap<TAccum>(\n node: RBNode<TKey, TData> | undefined,\n action: PropertyAction<TKey, TData>,\n accum?: TAccum,\n start?: TKey,\n end?: TKey,\n ): boolean {\n let _start = start;\n let _end = end;\n if (!node) {\n return true;\n }\n if (_start === undefined) {\n _start = this.nodeMin(node).key;\n }\n if (_end === undefined) {\n _end = this.nodeMax(node).key;\n }\n const cmpStart = this.compareKeys(_start, node.key);\n const cmpEnd = this.compareKeys(_end, node.key);\n let go = true;\n if (cmpStart < 0) {\n go = this.nodeMap(node.left, action, accum, _start, _end);\n }\n if (go && (cmpStart <= 0) && (cmpEnd >= 0)) {\n // REVIEW: test for black node here\n go = action(node, accum);\n }\n if (go && (cmpEnd > 0)) {\n go = this.nodeMap(node.right, action, accum, _start, _end);\n }\n return go;\n }\n public diag() {\n console.log(`Height is ${this.height()}`);\n }\n}\n\nexport interface AugmentedIntervalNode {\n minmax: IInterval;\n}\n\nexport const integerRangeToString = (range: IIntegerRange) => `[${range.start},${range.end})`;\n\nexport interface IInterval {\n clone(): IInterval;\n compare(b: IInterval): number;\n compareStart(b: IInterval): number;\n compareEnd(b: IInterval): number;\n modify(label: string, start: number, end: number): IInterval | undefined;\n overlaps(b: IInterval): boolean;\n union(b: IInterval): IInterval;\n}\n\nconst intervalComparer = (a: IInterval, b: IInterval) => a.compare(b);\nexport type IntervalNode<T extends IInterval> = RBNode<T, AugmentedIntervalNode>;\nexport type IntervalConflictResolver<TInterval> = (a: TInterval, b: TInterval) => TInterval;\n\nexport class IntervalTree<T extends IInterval> implements IRBAugmentation<T, AugmentedIntervalNode>,\n IRBMatcher<T, AugmentedIntervalNode> {\n public intervals = new RedBlackTree<T, AugmentedIntervalNode>(intervalComparer, this);\n\n public remove(x: T) {\n this.intervals.remove(x);\n }\n\n public removeExisting(x: T) {\n this.intervals.removeExisting(x);\n }\n\n public put(x: T, conflict?: IntervalConflictResolver<T>) {\n let rbConflict: ConflictAction<T, AugmentedIntervalNode> | undefined;\n if (conflict) {\n rbConflict = (key: T, currentKey: T) => {\n const ival = conflict(key, currentKey);\n return {\n key: ival,\n };\n };\n }\n this.intervals.put(x, { minmax: x.clone() }, rbConflict);\n }\n\n public map(fn: (x: T) => void) {\n const actions = <RBNodeActions<T, AugmentedIntervalNode>>{\n infix: (node) => {\n fn(node.key);\n return true;\n },\n showStructure: true,\n };\n this.intervals.walk(actions);\n }\n\n public mapUntil(fn: (X: T) => boolean) {\n const actions = <RBNodeActions<T, AugmentedIntervalNode>>{\n infix: (node) => {\n return fn(node.key);\n },\n showStructure: true,\n };\n this.intervals.walk(actions);\n }\n\n public mapBackward(fn: (x: T) => void) {\n const actions = <RBNodeActions<T, AugmentedIntervalNode>>{\n infix: (node) => {\n fn(node.key);\n return true;\n },\n showStructure: true,\n };\n this.intervals.walkBackward(actions);\n }\n\n // TODO: toString()\n public match(x: T) {\n return this.intervals.gather(x, this);\n }\n\n public matchNode(node: IntervalNode<T> | undefined, key: T) {\n return !!node && node.key.overlaps(key);\n }\n\n public continueSubtree(node: IntervalNode<T> | undefined, key: T) {\n return !!node && node.data.minmax.overlaps(key);\n }\n\n public update(node: IntervalNode<T>) {\n if (node.left && node.right) {\n node.data.minmax = node.key.union(\n node.left.data.minmax.union(node.right.data.minmax));\n } else {\n if (node.left) {\n node.data.minmax = node.key.union(node.left.data.minmax);\n } else if (node.right) {\n node.data.minmax = node.key.union(node.right.data.minmax);\n } else {\n node.data.minmax = node.key.clone();\n }\n }\n }\n}\n\nexport interface TSTResult<T> {\n key: string;\n val: T;\n}\n\nexport interface TSTNode<T> {\n c: string;\n left?: TSTNode<T>;\n mid?: TSTNode<T>;\n right?: TSTNode<T>;\n val?: T;\n}\n\ninterface TSTPrefix {\n text: string;\n}\n\nexport interface ProxString<T> {\n text: string;\n invDistance: number;\n val: T;\n}\n\nexport class TST<T> {\n private n = 0;\n private root: TSTNode<T> | undefined;\n\n public size() {\n return this.n;\n }\n\n private contains(key: string) {\n return this.get(key);\n }\n\n public get(key: string) {\n const x = this.nodeGet(this.root, key, 0);\n if (x === undefined) {\n return undefined;\n }\n return x.val;\n }\n\n private nodeGet(x: TSTNode<T> | undefined, key: string, d: number): TSTNode<T> | undefined {\n if (x === undefined) {\n return undefined;\n }\n const c = key.charAt(d);\n if (c < x.c) {\n return this.nodeGet(x.left, key, d);\n }\n else if (c > x.c) {\n return this.nodeGet(x.right, key, d);\n }\n else if (d < (key.length - 1)) {\n return this.nodeGet(x.mid, key, d + 1);\n }\n else { return x; }\n }\n\n public put(key: string, val: T) {\n if (!this.contains(key)) {\n this.n++;\n }\n this.root = this.nodePut(this.root, key, val, 0);\n // console.log(`put ${key}`);\n }\n\n private nodePut(x: TSTNode<T> | undefined, key: string, val: T, d: number) {\n let _x = x;\n const c = key.charAt(d);\n if (_x === undefined) {\n _x = { c };\n }\n if (c < _x.c) {\n _x.left = this.nodePut(_x.left, key, val, d);\n }\n else if (c > _x.c) {\n _x.right = this.nodePut(_x.right, key, val, d);\n }\n else if (d < (key.length - 1)) {\n _x.mid = this.nodePut(_x.mid, key, val, d + 1);\n }\n else {\n _x.val = val;\n }\n return _x;\n }\n\n public neighbors(text: string, distance = 2) {\n let q = <ProxString<T>[]>[];\n this.nodeProximity(this.root, { text: \"\" }, 0, text, distance, q);\n q = q.filter((value) => (value.text.length > 0));\n return q;\n }\n\n public keysWithPrefix(text: string) {\n const q = <string[]>[];\n const x = this.nodeGet(this.root, text, 0);\n if (x === undefined) {\n return q;\n }\n if (x.val !== undefined) {\n q.push(text);\n }\n this.collect(x.mid, { text }, q);\n return q;\n }\n\n private collect(x: TSTNode<T> | undefined, prefix: TSTPrefix, q: string[]) {\n if (x === undefined) {\n return;\n }\n this.collect(x.left, prefix, q);\n if (x.val !== undefined) {\n q.push(prefix.text + x.c);\n }\n this.collect(x.mid, { text: prefix.text + x.c }, q);\n this.collect(x.right, prefix, q);\n }\n\n private mapNode(x: TSTNode<T> | undefined, prefix: TSTPrefix, fn: (key: string, val: T) => void) {\n if (x === undefined) {\n return;\n }\n const key = prefix.text + x.c;\n this.mapNode(x.left, prefix, fn);\n if (x.val) {\n fn(key, x.val);\n }\n this.mapNode(x.mid, { text: key }, fn);\n this.mapNode(x.right, prefix, fn);\n }\n\n public map(fn: (key: string, val: T) => void) {\n this.mapNode(this.root, { text: \"\" }, fn);\n }\n\n public pairsWithPrefix(text: string) {\n const q = <TSTResult<T>[]>[];\n const x = this.nodeGet(this.root, text, 0);\n if (x === undefined) {\n return q;\n }\n if (x.val !== undefined) {\n q.push({ key: text, val: x.val });\n }\n this.collectPairs(x.mid, { text }, q);\n return q;\n }\n\n private collectPairs(x: TSTNode<T> | undefined, prefix: TSTPrefix, q: TSTResult<T>[]) {\n if (x === undefined) {\n return;\n }\n this.collectPairs(x.left, prefix, q);\n if (x.val !== undefined) {\n q.push({ key: prefix.text + x.c, val: x.val });\n }\n this.collectPairs(x.mid, { text: prefix.text + x.c }, q);\n this.collectPairs(x.right, prefix, q);\n }\n\n private nodeProximity(\n x: TSTNode<T> | undefined,\n prefix: TSTPrefix,\n d: number,\n pattern: string,\n distance: number,\n q: ProxString<T>[]) {\n if ((x === undefined) || (distance < 0)) {\n return;\n }\n const c = pattern.charAt(d);\n if ((distance > 0) || (c < x.c)) {\n this.nodeProximity(x.left, prefix, d, pattern, distance, q);\n }\n if (x.val !== undefined) {\n const remD = distance - (pattern.length - d);\n if (remD >= 0) {\n let invD = distance;\n if (c !== x.c) {\n invD--;\n }\n q.push({ text: prefix.text + x.c, val: x.val, invDistance: invD });\n }\n }\n const recurD = (d < (pattern.length - 1)) ? d + 1 : d;\n if (c === x.c) {\n this.nodeProximity(x.mid, { text: prefix.text + x.c }, recurD, pattern, distance, q);\n }\n else {\n this.nodeProximity(x.mid, { text: prefix.text + x.c }, recurD, pattern, distance - 1, q);\n }\n if ((distance > 0) || (c > x.c)) {\n this.nodeProximity(x.right, prefix, d, pattern, distance, q);\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"collections.js","sourceRoot":"","sources":["../src/collections.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAeH,MAAM,OAAO,KAAK;IAAlB;QACW,UAAK,GAAQ,EAAE,CAAC;IAgB3B,CAAC;IAfU,IAAI,CAAC,GAAM;QACd,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACzB,CAAC;IAEM,KAAK;QACR,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC;IACnC,CAAC;IAEM,GAAG;QACN,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC7C,CAAC;IAEM,GAAG;QACN,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;IAC5B,CAAC;CACJ;AAED,SAAS,eAAe,CAAI,KAAc;IACtC,IAAI,KAAK,KAAK,SAAS,EAAE;QACrB,OAAO,SAAS,CAAC;KACpB;SACI,IAAI,KAAK,CAAC,MAAM,EAAE;QACnB,OAAO,SAAS,CAAC;KACpB;SACI;QACD,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;QAC7B,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;KAChC;IACD,OAAO,CAAC,KAAK,CAAC,CAAC;AACnB,CAAC;AAED,SAAS,aAAa,CAAI,IAAO;IAC7B,OAAO,IAAI,IAAI,CAAI,KAAK,EAAE,IAAI,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,YAAY;IACxB,OAAO,IAAI,IAAI,CAAI,IAAI,EAAE,SAAS,CAAC,CAAC;AACxC,CAAC;AAED,MAAM,OAAO,IAAI;IAIb,8DAA8D;IAC9D,YAAmB,MAAe,EAAU,IAAmB;QAA5C,WAAM,GAAN,MAAM,CAAS;QAAU,SAAI,GAAJ,IAAI,CAAe;QAC3D,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACrB,CAAC;IAEM,KAAK;QACR,IAAI,IAAI,CAAC,MAAM,EAAE;YACb,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;YACjB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;SACpB;IACL,CAAC;IAEO,GAAG,CAAC,IAAO;QACf,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;QAClC,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC;QACvB,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC;QAClB,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACvB,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC;QAClB,OAAO,CAAC,KAAK,CAAC,CAAC;IACnB,CAAC;IAEM,OAAO;QACV,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE;YACf,oEAAoE;YACpE,MAAM,YAAY,GAAG,eAAe,CAAC,IAAI,CAAC,IAAI,CAAE,CAAC;YACjD,OAAO,YAAY,CAAC,IAAI,CAAC;SAC5B;IACL,CAAC;IAEM,OAAO,CAAC,IAAO;QAClB,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAEM,IAAI,CAAC,EAAiC;QACzC,KAAK,IAAI,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC,IAAI,EAAE;YAC7D,oEAAoE;YACpE,EAAE,CAAC,KAAK,CAAC,IAAK,EAAE,KAAK,CAAC,CAAC;SAC1B;IACL,CAAC;IAEM,IAAI,CAAC,EAAoC,EAAE,GAAa;QAC3D,MAAM,GAAG,GAAQ,EAAE,CAAC;QACpB,MAAM,KAAK,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;QAC1C,KAAK,IAAI,KAAK,GAAG,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,KAAK,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE;YAC5E,oEAAoE;YACpE,MAAM,IAAI,GAAG,KAAK,CAAC,IAAK,CAAC;YACzB,IAAI,EAAE,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE;gBACjB,IAAI,GAAG,EAAE;oBACL,sCAAsC;oBACtC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;iBACrB;qBAAM;oBACH,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;iBAClB;aACJ;SACJ;QACD,OAAO,GAAG,CAAC;IACf,CAAC;IAEM,KAAK;QACR,IAAI,KAAc,CAAC;QACnB,IAAI,CAAS,CAAC;QAEd,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC;QAClB,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE;YAC9B,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC;SACtB;QACD,OAAO,CAAC,CAAC,CAAC,CAAC;IACf,CAAC;IAEM,KAAK;QACR,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE;YACf,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;SAC3B;IACL,CAAC;IAEM,IAAI;QACP,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE;YACf,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;SAC3B;IACL,CAAC;IAEM,KAAK;QACR,OAAO,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;IAChC,CAAC;IAEM,IAAI,CAAC,IAAO;QACf,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;QAClC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC;QAClB,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC;QACrB,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACvB,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC;QAClB,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC;QAClB,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC;IAC5B,CAAC;CACJ;AAOD,MAAM,OAAO,IAAI;IAKb,YAAY,CAAM,EAAS,IAAiB;QAAjB,SAAI,GAAJ,IAAI,CAAa;QACxC,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACpB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE;YAC1C,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;SAClB;IACL,CAAC;IARM,KAAK;QACR,OAAO,IAAI,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;IAC7B,CAAC;IAOM,IAAI;QACP,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACrB,CAAC;IAEM,GAAG;QACN,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACpB,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;QACjC,IAAI,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAChB,OAAO,CAAC,CAAC;IACb,CAAC;IAEM,GAAG,CAAC,CAAI;QACX,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACf,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;IAC7B,CAAC;IAEO,KAAK,CAAC,CAAS;QACnB,IAAI,EAAE,GAAG,CAAC,CAAC;QACX,OAAO,EAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE;YACnE,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;YAC5B,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAC7B,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC;YACjB,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;SAChB;IACL,CAAC;IAEO,OAAO,CAAC,CAAS;QACrB,IAAI,EAAE,GAAG,CAAC,CAAC;QACX,OAAO,CAAC,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE;YAChC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YAChB,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE;gBACzE,CAAC,EAAE,CAAC;aACP;YACD,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE;gBAC/C,MAAM;aACT;YACD,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACvB,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACvB,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;YAChB,EAAE,GAAG,CAAC,CAAC;SACV;IACL,CAAC;CACJ;AAED,MAAM,CAAN,IAAkB,OAGjB;AAHD,WAAkB,OAAO;IACrB,mCAAG,CAAA;IACH,uCAAK,CAAA;AACT,CAAC,EAHiB,OAAO,KAAP,OAAO,QAGxB;AA2BD,MAAM,OAAO,YAAY;IAGrB,YACqB,WAA8B,EAC9B,GAAkC;QADlC,gBAAW,GAAX,WAAW,CAAmB;QAC9B,QAAG,GAAH,GAAG,CAA+B;IACnD,CAAC;IAEG,QAAQ,CAAC,GAAS,EAAE,IAAW,EAAE,KAAc,EAAE,IAAY;QACjE,OAA4B,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IAC3D,CAAC;IAEO,KAAK,CAAC,IAAqC;QAC/C,OAAO,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,eAAe,CAAC,CAAC;IACjD,CAAC;IAEO,QAAQ,CAAC,IAAqC;QAClD,OAAO,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAChC,CAAC;IACM,IAAI;QACP,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC;IACM,OAAO;QACV,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;IACtB,CAAC;IACM,GAAG,CAAC,GAAS;QAChB,IAAI,GAAG,KAAK,SAAS,EAAE;YACnB,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;SACvC;IACL,CAAC;IACO,OAAO,CAAC,IAAqC,EAAE,GAAS;QAC5D,IAAI,KAAK,GAAG,IAAI,CAAC;QACjB,OAAO,KAAK,EAAE;YACV,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;YAC7C,IAAI,GAAG,GAAG,CAAC,EAAE;gBACT,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC;aACtB;iBACI,IAAI,GAAG,GAAG,CAAC,EAAE;gBACd,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;aACvB;iBACI;gBACD,OAAO,KAAK,CAAC;aAChB;SACJ;IACL,CAAC;IACO,QAAQ,CAAC,GAAS;QACtB,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACzB,CAAC;IAEM,MAAM,CAAC,GAAS,EAAE,OAAgC;QACrD,MAAM,OAAO,GAAG,EAA2B,CAAC;QAC5C,IAAI,GAAG,KAAK,SAAS,EAAE;YACnB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;SACrD;QACD,OAAO,OAAO,CAAC;IACnB,CAAC;IAEO,UAAU,CACd,IAAqC,EACrC,OAA8B,EAC9B,GAAS,EACT,OAAgC;QAChC,IAAI,IAAI,EAAE;YACN,IAAI,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE;gBACzC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;aACrD;YACD,IAAI,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE;gBAC9B,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;aACtB;YACD,IAAI,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE;gBAC1C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;aACtD;SACJ;IACL,CAAC;IAEM,uBAAuB,CAC1B,SAAgD,EAChD,QAA6C,EAC7C,cAA2C,EAC3C,eAA4C;QAC5C,IAAI,CAAC,2BAA2B,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,cAAc,EAAE,eAAe,CAAC,CAAC;IACtG,CAAC;IAEO,2BAA2B,CAC/B,IAAqC,EACrC,SAAgD,EAChD,QAA6C,EAC7C,cAA2C,EAC3C,eAA4C;QAC5C,IAAI,CAAC,IAAI,EAAE;YACP,OAAO;SACV;QACD,MAAM,MAAM,GAAW,SAAS,CAAC,IAAI,CAAC,CAAC;QACvC,IAAI,cAAc,CAAC,MAAM,CAAC,EAAE;YACxB,IAAI,CAAC,2BAA2B,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,cAAc,EAAE,eAAe,CAAC,CAAC;SACrG;QACD,IAAI,MAAM,KAAK,CAAC,EAAE;YACd,QAAQ,CAAC,IAAI,CAAC,CAAC;SAClB;QACD,IAAI,eAAe,CAAC,MAAM,CAAC,EAAE;YACzB,IAAI,CAAC,2BAA2B,CAAC,IAAI,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,cAAc,EAAE,eAAe,CAAC,CAAC;SACtG;IACL,CAAC;IAEM,wBAAwB,CAC3B,SAAgD,EAChD,QAA6C,EAC7C,cAA2C,EAC3C,eAA4C;QAC5C,IAAI,CAAC,4BAA4B,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,cAAc,EAAE,eAAe,CAAC,CAAC;IACvG,CAAC;IAEO,4BAA4B,CAChC,IAAqC,EACrC,SAAgD,EAChD,QAA6C,EAC7C,cAAwC,EACxC,eAAyC;QACzC,IAAI,CAAC,IAAI,EAAE;YACP,OAAO;SACV;QACD,MAAM,MAAM,GAAW,SAAS,CAAC,IAAI,CAAC,CAAC;QACvC,IAAI,eAAe,CAAC,MAAM,CAAC,EAAE;YACzB,IAAI,CAAC,4BAA4B,CAAC,IAAI,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,cAAc,EAAE,eAAe,CAAC,CAAC;SACvG;QACD,IAAI,MAAM,KAAK,CAAC,EAAE;YACd,QAAQ,CAAC,IAAI,CAAC,CAAC;SAClB;QACD,IAAI,cAAc,CAAC,MAAM,CAAC,EAAE;YACxB,IAAI,CAAC,4BAA4B,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,cAAc,EAAE,eAAe,CAAC,CAAC;SACtG;IACL,CAAC;IAEM,GAAG,CAAC,GAAS,EAAE,IAAW,EAAE,QAAsC;QACrE,IAAI,GAAG,KAAK,SAAS,EAAE;YACnB,IAAI,IAAI,KAAK,SAAS,EAAE;gBACpB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;aACpB;iBACI;gBACD,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;gBACzD,IAAI,CAAC,IAAI,CAAC,KAAK,gBAAgB,CAAC;aACnC;SACJ;IACL,CAAC;IAEO,OAAO,CACX,IAAqC,EACrC,GAAS,EAAE,IAAW,EACtB,QAAsC;QAEtC,IAAI,KAAK,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,KAAK,EAAE;YACR,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,IAAI,eAAe,CAAC,CAAC,CAAC;SACnD;aACI;YACD,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;YAC7C,IAAI,GAAG,GAAG,CAAC,EAAE;gBACT,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;aAC9D;iBACI,IAAI,GAAG,GAAG,CAAC,EAAE;gBACd,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;aAChE;iBACI;gBACD,IAAI,QAAQ,EAAE;oBACV,MAAM,EAAE,GAAG,QAAQ,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;oBACtD,IAAI,EAAE,CAAC,GAAG,EAAE;wBACR,KAAK,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,CAAC;qBACtB;oBACD,IAAI,EAAE,CAAC,IAAI,EAAE;wBACT,KAAK,CAAC,IAAI,GAAG,EAAE,CAAC,IAAI,CAAC;qBACxB;yBAAM;wBACH,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC;qBACrB;iBACJ;qBACI;oBACD,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC;iBACrB;aACJ;YACD,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE;gBACtD,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;aAClC;YACD,oEAAoE;YACpE,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAK,CAAC,IAAI,CAAC,EAAE;gBACxD,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;aACnC;YACD,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;gBACnD,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;aAC1B;YACD,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACxE,IAAI,IAAI,CAAC,GAAG,EAAE;gBACV,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;aAC3B;YACD,OAAO,KAAK,CAAC;SAChB;IACL,CAAC;IAEO,WAAW,CAAC,IAAyB;QACzC,IAAI,IAAI,CAAC,GAAG,EAAE;YACV,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;gBACvB,oEAAoE;gBACpE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,IAAK,CAAC,CAAC;aAC/B;YACD,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;gBACxB,oEAAoE;gBACpE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,KAAM,CAAC,CAAC;aAChC;YACD,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;SACzB;IACL,CAAC;IAEO,aAAa,CAAC,IAAyB;QAC3C,IAAI,KAAK,GAAG,IAAI,CAAC;QACjB,IAAI,KAAK,CAAC,IAAI,EAAE;YACZ,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE;gBAC7D,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;aACnC;YAED,oEAAoE;YACpE,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,IAAK,CAAC,CAAC;YAC7C,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;SAC9B;IACL,CAAC;IAEM,MAAM,CAAC,GAAS;QACnB,IAAI,GAAG,KAAK,SAAS,EAAE;YACnB,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;gBACrB,OAAO;aACV;YAED,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;SAC5B;QACD,+BAA+B;IACnC,CAAC;IAEM,cAAc,CAAC,GAAS;QAC3B,oEAAoE;QACpE,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAK,CAAC,KAAK,CAAC,CAAC,EAAE;YACnE,oEAAoE;YACpE,IAAI,CAAC,IAAK,CAAC,KAAK,cAAc,CAAC;SAClC;QAED,oEAAoE;QACpE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAK,EAAE,GAAG,CAAC,CAAC;IACjD,CAAC;IAEO,UAAU,CAAC,IAAyB,EAAE,GAAS;QACnD,IAAI,KAAK,GAAG,IAAI,CAAC;QACjB,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;YACtC,oEAAoE;YACpE,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAK,CAAC,IAAI,CAAC,CAAC,EAAE;gBAC9D,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;aACnC;YACD,oEAAoE;YACpE,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,IAAK,EAAE,GAAG,CAAC,CAAC;SAClD;aACI;YACD,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE;gBACxB,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;aACnC;YACD,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;gBAC3D,OAAO,SAAS,CAAC;aACpB;YACD,oEAAoE;YACpE,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAM,CAAC,IAAI,CAAC,CAAC,EAAE;gBAChE,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;aACpC;YACD,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;gBACvC,oEAAoE;gBACpE,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAM,CAAC,CAAC;gBAC9C,KAAK,CAAC,GAAG,GAAG,UAAU,CAAC,GAAG,CAAC;gBAC3B,KAAK,CAAC,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC;gBAC7B,oEAAoE;gBACpE,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,KAAM,CAAC,CAAC;aAClD;iBACI;gBACD,oEAAoE;gBACpE,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,KAAM,EAAE,GAAG,CAAC,CAAC;aACpD;SACJ;QACD,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAC/B,CAAC;IACO,MAAM;QACV,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC;IACO,UAAU,CAAC,IAAqC;QACpD,IAAI,IAAI,KAAK,SAAS,EAAE;YACpB,OAAO,CAAC,CAAC,CAAC;SACb;aACI;YACD,OAAO,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;SAChF;IACL,CAAC;IAEM,KAAK,CAAC,GAAS;QAClB,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE;YACjB,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;SACzC;IACL,CAAC;IAEO,SAAS,CAAC,IAAqC,EAAE,GAAS;QAC9D,IAAI,IAAI,EAAE;YACN,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;YAC5C,IAAI,GAAG,IAAI,CAAC,EAAE;gBACV,OAAO,IAAI,CAAC;aACf;iBACI,IAAI,GAAG,GAAG,CAAC,EAAE;gBACd,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;aACzC;iBACI;gBACD,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;gBACnD,IAAI,UAAU,EAAE;oBACZ,OAAO,UAAU,CAAC;iBACrB;qBACI;oBACD,OAAO,IAAI,CAAC;iBACf;aACJ;SACJ;IACL,CAAC;IAEM,IAAI,CAAC,GAAS;QACjB,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE;YACjB,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;SACxC;IACL,CAAC;IAEO,QAAQ,CAAC,IAAqC,EAAE,GAAS;QAC7D,IAAI,IAAI,EAAE;YACN,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;YAC5C,IAAI,GAAG,IAAI,CAAC,EAAE;gBACV,OAAO,IAAI,CAAC;aACf;iBACI,IAAI,GAAG,GAAG,CAAC,EAAE;gBACd,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;aACzC;iBACI;gBACD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;gBAC/C,IAAI,QAAQ,EAAE;oBACV,OAAO,QAAQ,CAAC;iBACnB;qBACI;oBACD,OAAO,IAAI,CAAC;iBACf;aACJ;SACJ;IACL,CAAC;IAEM,GAAG;QACN,IAAI,IAAI,CAAC,IAAI,EAAE;YACX,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;SAClC;IACL,CAAC;IAEO,OAAO,CAAC,IAAyB;QACrC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;YACZ,OAAO,IAAI,CAAC;SACf;aACI;YACD,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;SAClC;IACL,CAAC;IAEM,GAAG;QACN,IAAI,IAAI,CAAC,IAAI,EAAE;YACX,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;SAClC;IACL,CAAC;IAEO,OAAO,CAAC,IAAyB;QACrC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE;YACb,OAAO,IAAI,CAAC;SACf;aACI;YACD,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;SACnC;IACL,CAAC;IAEO,WAAW,CAAC,IAAyB;QACzC,oEAAoE;QACpE,MAAM,SAAS,GAAG,IAAI,CAAC,IAAK,CAAC;QAC7B,IAAI,CAAC,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC;QAC5B,SAAS,CAAC,KAAK,GAAG,IAAI,CAAC;QACvB,SAAS,CAAC,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC;QACxC,SAAS,CAAC,KAAK,CAAC,KAAK,cAAc,CAAC;QACpC,SAAS,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QAC3B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACrE,IAAI,IAAI,CAAC,GAAG,EAAE;YACV,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;YACvB,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;SAC/B;QACD,OAAO,SAAS,CAAC;IACrB,CAAC;IAEO,UAAU,CAAC,IAAyB;QACxC,oEAAoE;QACpE,MAAM,UAAU,GAAG,IAAI,CAAC,KAAM,CAAC;QAC/B,IAAI,CAAC,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC;QAC7B,UAAU,CAAC,IAAI,GAAG,IAAI,CAAC;QACvB,UAAU,CAAC,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC;QACzC,UAAU,CAAC,IAAI,CAAC,KAAK,cAAc,CAAC;QACpC,UAAU,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QAC5B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACrE,IAAI,IAAI,CAAC,GAAG,EAAE;YACV,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;YACvB,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;SAChC;QACD,OAAO,UAAU,CAAC;IACtB,CAAC;IAEO,aAAa,CAAC,CAAU;QAC5B,OAAO,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,aAAa,CAAC,cAAc,CAAC;IAC9D,CAAC;IAEO,UAAU,CAAC,IAAyB;QACxC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC5C,oEAAoE;QACpE,IAAI,CAAC,IAAK,CAAC,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAK,CAAC,KAAK,CAAC,CAAC;QACxD,oEAAoE;QACpE,IAAI,CAAC,KAAM,CAAC,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,KAAM,CAAC,KAAK,CAAC,CAAC;IAC9D,CAAC;IAEO,WAAW,CAAC,IAAyB;QACzC,IAAI,KAAK,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QACvB,oEAAoE;QACpE,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAM,CAAC,IAAI,CAAC,EAAE;YAC/B,oEAAoE;YACpE,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,KAAM,CAAC,CAAC;YAC7C,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;YAC/B,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;SAC1B;QACD,OAAO,KAAK,CAAC;IACjB,CAAC;IAEO,YAAY,CAAC,IAAyB;QAC1C,IAAI,KAAK,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QACvB,oEAAoE;QACpE,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAK,CAAC,IAAI,CAAC,EAAE;YAC9B,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;YAChC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;SAC1B;QACD,OAAO,KAAK,CAAC;IACjB,CAAC;IAEO,OAAO,CAAC,KAA0B;QACtC,IAAI,IAAI,GAAoC,KAAK,CAAC;QAClD,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;YACxB,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;SAChC;QACD,oEAAoE;QACpE,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAK,CAAC,IAAI,CAAC,EAAE;YACtD,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;SACjC;QACD,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE;YACnD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;SACzB;QACD,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACrE,IAAI,IAAI,CAAC,GAAG,EAAE;YACV,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;SACzB;QACD,OAAO,IAAI,CAAC;IAChB,CAAC;IAEM,QAAQ,CAAS,MAAmC,EAAE,KAAc,EAAE,KAAY,EAAE,GAAU;QACjG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;IAChD,CAAC;IAEM,GAAG,CAAS,MAAmC,EAAE,KAAc;QAClE,sCAAsC;QACtC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;IAC3C,CAAC;IAEM,IAAI;QACP,MAAM,OAAO,GAAW,EAAE,CAAC;QAC3B,MAAM,OAAO,GAA+B;YACxC,aAAa,EAAE,IAAI;YACnB,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE;gBACZ,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACvB,OAAO,IAAI,CAAC;YAChB,CAAC;SACJ,CAAC;QACF,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACnB,OAAO,OAAO,CAAC;IACnB,CAAC;IAED;;;;OAIG;IACI,IAAI,CAAC,OAAmC;QAC3C,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACtC,CAAC;IAEM,YAAY,CAAC,OAAmC;QACnD,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC9C,CAAC;IAEO,QAAQ,CAAC,IAAqC,EAAE,OAAmC;QACvF,IAAI,EAAE,GAAG,IAAI,CAAC;QACd,IAAI,IAAI,EAAE;YACN,IAAI,OAAO,CAAC,GAAG,EAAE;gBACb,IAAI,OAAO,CAAC,aAAa,IAAI,CAAC,IAAI,CAAC,KAAK,kBAAkB,CAAC,EAAE;oBACzD,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;iBAC1B;aACJ;YACD,IAAI,IAAI,CAAC,IAAI,EAAE;gBACX,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;aAC1C;YACD,IAAI,EAAE,IAAI,OAAO,CAAC,KAAK,EAAE;gBACrB,IAAI,OAAO,CAAC,aAAa,IAAI,CAAC,IAAI,CAAC,KAAK,kBAAkB,CAAC,EAAE;oBACzD,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;iBAC5B;aACJ;YACD,IAAI,EAAE,EAAE;gBACJ,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;aAC3C;YACD,IAAI,EAAE,IAAI,OAAO,CAAC,IAAI,EAAE;gBACpB,IAAI,OAAO,CAAC,aAAa,IAAI,CAAC,IAAI,CAAC,KAAK,kBAAkB,CAAC,EAAE;oBACzD,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;iBAC3B;aACJ;SACJ;QACD,OAAO,EAAE,CAAC;IACd,CAAC;IAEO,gBAAgB,CAAC,IAAqC,EAAE,OAAmC;QAC/F,IAAI,EAAE,GAAG,IAAI,CAAC;QACd,IAAI,IAAI,EAAE;YACN,IAAI,OAAO,CAAC,GAAG,EAAE;gBACb,IAAI,OAAO,CAAC,aAAa,IAAI,CAAC,IAAI,CAAC,KAAK,kBAAkB,CAAC,EAAE;oBACzD,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;iBAC1B;aACJ;YACD,IAAI,IAAI,CAAC,KAAK,EAAE;gBACZ,EAAE,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;aACnD;YACD,IAAI,EAAE,IAAI,OAAO,CAAC,KAAK,EAAE;gBACrB,IAAI,OAAO,CAAC,aAAa,IAAI,CAAC,IAAI,CAAC,KAAK,kBAAkB,CAAC,EAAE;oBACzD,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;iBAC5B;aACJ;YACD,IAAI,EAAE,EAAE;gBACJ,EAAE,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;aAClD;YACD,IAAI,EAAE,IAAI,OAAO,CAAC,IAAI,EAAE;gBACpB,IAAI,OAAO,CAAC,aAAa,IAAI,CAAC,IAAI,CAAC,KAAK,kBAAkB,CAAC,EAAE;oBACzD,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;iBAC3B;aACJ;SACJ;QACD,OAAO,EAAE,CAAC;IACd,CAAC;IAEO,OAAO,CACX,IAAqC,EACrC,MAAmC,EACnC,KAAc,EACd,KAAY,EACZ,GAAU;QAEV,IAAI,MAAM,GAAG,KAAK,CAAC;QACnB,IAAI,IAAI,GAAG,GAAG,CAAC;QACf,IAAI,CAAC,IAAI,EAAE;YACP,OAAO,IAAI,CAAC;SACf;QACD,IAAI,MAAM,KAAK,SAAS,EAAE;YACtB,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC;SACnC;QACD,IAAI,IAAI,KAAK,SAAS,EAAE;YACpB,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC;SACjC;QACD,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;QACpD,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;QAChD,IAAI,EAAE,GAAG,IAAI,CAAC;QACd,IAAI,QAAQ,GAAG,CAAC,EAAE;YACd,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;SAC7D;QACD,IAAI,EAAE,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,EAAE;YACxC,mCAAmC;YACnC,EAAE,GAAG,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;SAC5B;QACD,IAAI,EAAE,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE;YACpB,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;SAC9D;QACD,OAAO,EAAE,CAAC;IACd,CAAC;IACM,IAAI;QACP,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAC9C,CAAC;CACJ;AAMD,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,KAAoB,EAAE,EAAE,CAAC,IAAI,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,GAAG,GAAG,CAAC;AAY9F,MAAM,gBAAgB,GAAG,CAAC,CAAY,EAAE,CAAY,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AAItE,MAAM,OAAO,YAAY;IAAzB;QAEW,cAAS,GAAG,IAAI,YAAY,CAA2B,gBAAgB,EAAE,IAAI,CAAC,CAAC;IAkF1F,CAAC;IAhFU,MAAM,CAAC,CAAI;QACd,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAC7B,CAAC;IAEM,cAAc,CAAC,CAAI;QACtB,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;IACrC,CAAC;IAEM,GAAG,CAAC,CAAI,EAAE,QAAsC;QACnD,IAAI,UAAgE,CAAC;QACrE,IAAI,QAAQ,EAAE;YACV,UAAU,GAAG,CAAC,GAAM,EAAE,UAAa,EAAE,EAAE;gBACnC,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;gBACvC,OAAO;oBACH,GAAG,EAAE,IAAI;iBACZ,CAAC;YACN,CAAC,CAAC;SACL;QACD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,KAAK,EAAE,EAAE,EAAE,UAAU,CAAC,CAAC;IAC7D,CAAC;IAEM,GAAG,CAAC,EAAkB;QACzB,MAAM,OAAO,GAA4C;YACrD,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE;gBACZ,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACb,OAAO,IAAI,CAAC;YAChB,CAAC;YACD,aAAa,EAAE,IAAI;SACtB,CAAC;QACF,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACjC,CAAC;IAEM,QAAQ,CAAC,EAAqB;QACjC,MAAM,OAAO,GAA4C;YACrD,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE;gBACZ,OAAO,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACxB,CAAC;YACD,aAAa,EAAE,IAAI;SACtB,CAAC;QACF,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACjC,CAAC;IAEM,WAAW,CAAC,EAAkB;QACjC,MAAM,OAAO,GAA4C;YACrD,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE;gBACZ,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACb,OAAO,IAAI,CAAC;YAChB,CAAC;YACD,aAAa,EAAE,IAAI;SACtB,CAAC;QACF,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;IACzC,CAAC;IAED,mBAAmB;IACZ,KAAK,CAAC,CAAI;QACb,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IAC1C,CAAC;IAEM,SAAS,CAAC,IAAiC,EAAE,GAAM;QACtD,OAAO,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IAC5C,CAAC;IAEM,eAAe,CAAC,IAAiC,EAAE,GAAM;QAC5D,OAAO,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IACpD,CAAC;IAEM,MAAM,CAAC,IAAqB;QAC/B,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE;YACzB,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAC7B,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;SAC5D;aAAM;YACH,IAAI,IAAI,CAAC,IAAI,EAAE;gBACX,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;aAC5D;iBAAM,IAAI,IAAI,CAAC,KAAK,EAAE;gBACnB,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;aAC7D;iBAAM;gBACH,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;aACvC;SACJ;IACL,CAAC;CACJ;AAyBD,MAAM,OAAO,GAAG;IAAhB;QACY,MAAC,GAAG,CAAC,CAAC;IA8KlB,CAAC;IA3KU,IAAI;QACP,OAAO,IAAI,CAAC,CAAC,CAAC;IAClB,CAAC;IAEO,QAAQ,CAAC,GAAW;QACxB,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACzB,CAAC;IAEM,GAAG,CAAC,GAAW;QAClB,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;QAC1C,IAAI,CAAC,KAAK,SAAS,EAAE;YACjB,OAAO,SAAS,CAAC;SACpB;QACD,OAAO,CAAC,CAAC,GAAG,CAAC;IACjB,CAAC;IAEO,OAAO,CAAC,CAAyB,EAAE,GAAW,EAAE,CAAS;QAC7D,IAAI,CAAC,KAAK,SAAS,EAAE;YACjB,OAAO,SAAS,CAAC;SACpB;QACD,MAAM,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACxB,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;YACT,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;SACvC;aACI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;YACd,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;SACxC;aACI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE;YAC3B,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;SAC1C;aACI;YAAE,OAAO,CAAC,CAAC;SAAE;IACtB,CAAC;IAEM,GAAG,CAAC,GAAW,EAAE,GAAM;QAC1B,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;YACrB,IAAI,CAAC,CAAC,EAAE,CAAC;SACZ;QACD,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;QACjD,6BAA6B;IACjC,CAAC;IAEO,OAAO,CAAC,CAAyB,EAAE,GAAW,EAAE,GAAM,EAAE,CAAS;QACrE,IAAI,EAAE,GAAG,CAAC,CAAC;QACX,MAAM,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACxB,IAAI,EAAE,KAAK,SAAS,EAAE;YAClB,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC;SACd;QACD,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE;YACV,EAAE,CAAC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;SAChD;aACI,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE;YACf,EAAE,CAAC,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;SAClD;aACI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE;YAC3B,EAAE,CAAC,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;SAClD;aACI;YACD,EAAE,CAAC,GAAG,GAAG,GAAG,CAAC;SAChB;QACD,OAAO,EAAE,CAAC;IACd,CAAC;IAEM,SAAS,CAAC,IAAY,EAAE,QAAQ,GAAG,CAAC;QACvC,IAAI,CAAC,GAAoB,EAAE,CAAC;QAC5B,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC;QAClE,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;QACjD,OAAO,CAAC,CAAC;IACb,CAAC;IAEM,cAAc,CAAC,IAAY;QAC9B,MAAM,CAAC,GAAa,EAAE,CAAC;QACvB,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QAC3C,IAAI,CAAC,KAAK,SAAS,EAAE;YACjB,OAAO,CAAC,CAAC;SACZ;QACD,IAAI,CAAC,CAAC,GAAG,KAAK,SAAS,EAAE;YACrB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;SAChB;QACD,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;QACjC,OAAO,CAAC,CAAC;IACb,CAAC;IAEO,OAAO,CAAC,CAAyB,EAAE,MAAiB,EAAE,CAAW;QACrE,IAAI,CAAC,KAAK,SAAS,EAAE;YACjB,OAAO;SACV;QACD,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;QAChC,IAAI,CAAC,CAAC,GAAG,KAAK,SAAS,EAAE;YACrB,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;SAC7B;QACD,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QACpD,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;IACrC,CAAC;IAEO,OAAO,CAAC,CAAyB,EAAE,MAAiB,EAAE,EAAiC;QAC3F,IAAI,CAAC,KAAK,SAAS,EAAE;YACjB,OAAO;SACV;QACD,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC;QAC9B,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;QACjC,IAAI,CAAC,CAAC,GAAG,EAAE;YACP,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;SAClB;QACD,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC;QACvC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;IACtC,CAAC;IAEM,GAAG,CAAC,EAAiC;QACxC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;IAC9C,CAAC;IAEM,eAAe,CAAC,IAAY;QAC/B,MAAM,CAAC,GAAmB,EAAE,CAAC;QAC7B,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QAC3C,IAAI,CAAC,KAAK,SAAS,EAAE;YACjB,OAAO,CAAC,CAAC;SACZ;QACD,IAAI,CAAC,CAAC,GAAG,KAAK,SAAS,EAAE;YACrB,CAAC,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;SACrC;QACD,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;QACtC,OAAO,CAAC,CAAC;IACb,CAAC;IAEO,YAAY,CAAC,CAAyB,EAAE,MAAiB,EAAE,CAAiB;QAChF,IAAI,CAAC,KAAK,SAAS,EAAE;YACjB,OAAO;SACV;QACD,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;QACrC,IAAI,CAAC,CAAC,GAAG,KAAK,SAAS,EAAE;YACrB,CAAC,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;SAClD;QACD,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QACzD,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;IAC1C,CAAC;IAEO,aAAa,CACjB,CAAyB,EACzB,MAAiB,EACjB,CAAS,EACT,OAAe,EACf,QAAgB,EAChB,CAAkB;QAClB,IAAI,CAAC,CAAC,KAAK,SAAS,CAAC,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,EAAE;YACrC,OAAO;SACV;QACD,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC5B,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE;YAC7B,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC;SAC/D;QACD,IAAI,CAAC,CAAC,GAAG,KAAK,SAAS,EAAE;YACrB,MAAM,IAAI,GAAG,QAAQ,GAAG,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YAC7C,IAAI,IAAI,IAAI,CAAC,EAAE;gBACX,IAAI,IAAI,GAAG,QAAQ,CAAC;gBACpB,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;oBACX,IAAI,EAAE,CAAC;iBACV;gBACD,CAAC,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;aACtE;SACJ;QACD,MAAM,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACtD,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;YACX,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC;SACxF;aACI;YACD,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;SAC5F;QACD,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE;YAC7B,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC;SAChE;IACL,CAAC;CACJ","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\n/* eslint-disable @typescript-eslint/consistent-type-assertions, eqeqeq */\n/* eslint-disable no-bitwise */\n\n/* Remove once strictNullCheck is enabled */\n\nimport {\n ConflictAction,\n IIntegerRange,\n KeyComparer,\n PropertyAction,\n SortedDictionary,\n} from \"./base\";\n\nexport class Stack<T> {\n public items: T[] = [];\n public push(val: T) {\n this.items.push(val);\n }\n\n public empty() {\n return this.items.length === 0;\n }\n\n public top(): T | undefined {\n return this.items[this.items.length - 1];\n }\n\n public pop(): T | undefined {\n return this.items.pop();\n }\n}\n\nfunction ListRemoveEntry<U>(entry: List<U>): List<U> | undefined {\n if (entry === undefined) {\n return undefined;\n }\n else if (entry.isHead) {\n return undefined;\n }\n else {\n entry.next.prev = entry.prev;\n entry.prev.next = entry.next;\n }\n return (entry);\n}\n\nfunction ListMakeEntry<U>(data: U): List<U> {\n return new List<U>(false, data);\n}\n\nexport function ListMakeHead<U>(): List<U> {\n return new List<U>(true, undefined);\n}\n\nexport class List<T> {\n public next: List<T>;\n public prev: List<T>;\n\n // eslint-disable-next-line @typescript-eslint/prefer-readonly\n constructor(public isHead: boolean, private data: T | undefined) {\n this.prev = this;\n this.next = this;\n }\n\n public clear(): void {\n if (this.isHead) {\n this.prev = this;\n this.next = this;\n }\n }\n\n private add(data: T): List<T> {\n const entry = ListMakeEntry(data);\n this.prev.next = entry;\n entry.next = this;\n entry.prev = this.prev;\n this.prev = entry;\n return (entry);\n }\n\n public dequeue(): T | undefined {\n if (!this.empty()) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const removedEntry = ListRemoveEntry(this.next)!;\n return removedEntry.data;\n }\n }\n\n public enqueue(data: T): List<T> {\n return this.add(data);\n }\n\n public walk(fn: (data: T, l: List<T>) => void): void {\n for (let entry = this.next; !(entry.isHead); entry = entry.next) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n fn(entry.data!, entry);\n }\n }\n\n public some(fn: (data: T, l: List<T>) => boolean, rev?: boolean): T[] {\n const rtn: T[] = [];\n const start = rev ? this.prev : this.next;\n for (let entry = start; !(entry.isHead); entry = rev ? entry.prev : entry.next) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const data = entry.data!;\n if (fn(data, entry)) {\n if (rev) {\n // preserve list order when in reverse\n rtn.unshift(data);\n } else {\n rtn.push(data);\n }\n }\n }\n return rtn;\n }\n\n public count(): number {\n let entry: List<T>;\n let i: number;\n\n entry = this.next;\n for (i = 0; !(entry.isHead); i++) {\n entry = entry.next;\n }\n return (i);\n }\n\n public first(): T | undefined {\n if (!this.empty()) {\n return (this.next.data);\n }\n }\n\n public last(): T | undefined {\n if (!this.empty()) {\n return (this.prev.data);\n }\n }\n\n public empty(): boolean {\n return (this.next === this);\n }\n\n public push(data: T): void {\n const entry = ListMakeEntry(data);\n entry.data = data;\n entry.isHead = false;\n entry.next = this.next;\n entry.prev = this;\n this.next = entry;\n entry.next.prev = entry;\n }\n}\n\nexport interface Comparer<T> {\n compare(a: T, b: T): number;\n min: T;\n}\n\nexport class Heap<T> {\n private L: T[];\n public count() {\n return this.L.length - 1;\n }\n constructor(a: T[], public comp: Comparer<T>) {\n this.L = [comp.min];\n for (let i = 0, len = a.length; i < len; i++) {\n this.add(a[i]);\n }\n }\n public peek() {\n return this.L[1];\n }\n\n public get() {\n const x = this.L[1];\n this.L[1] = this.L[this.count()];\n this.L.pop();\n this.fixdown(1);\n return x;\n }\n\n public add(x: T) {\n this.L.push(x);\n this.fixup(this.count());\n }\n\n private fixup(k: number) {\n let _k = k;\n while (_k > 1 && (this.comp.compare(this.L[_k >> 1], this.L[_k]) > 0)) {\n const tmp = this.L[_k >> 1];\n this.L[_k >> 1] = this.L[_k];\n this.L[_k] = tmp;\n _k = _k >> 1;\n }\n }\n\n private fixdown(k: number) {\n let _k = k;\n while ((_k << 1) <= (this.count())) {\n let j = _k << 1;\n if ((j < this.count()) && (this.comp.compare(this.L[j], this.L[j + 1]) > 0)) {\n j++;\n }\n if (this.comp.compare(this.L[_k], this.L[j]) <= 0) {\n break;\n }\n const tmp = this.L[_k];\n this.L[_k] = this.L[j];\n this.L[j] = tmp;\n _k = j;\n }\n }\n}\n\nexport const enum RBColor {\n RED,\n BLACK,\n}\n\nexport interface RBNode<TKey, TData> {\n key: TKey;\n data: TData;\n left: RBNode<TKey, TData> | undefined;\n right: RBNode<TKey, TData> | undefined;\n color: RBColor;\n size: number;\n}\n\nexport interface IRBAugmentation<TKey, TData> {\n update(node: RBNode<TKey, TData>): void;\n}\n\nexport interface IRBMatcher<TKey, TData> {\n continueSubtree(node: RBNode<TKey, TData> | undefined, key: TKey): boolean;\n matchNode(node: RBNode<TKey, TData> | undefined, key: TKey): boolean;\n}\n\nexport interface RBNodeActions<TKey, TData> {\n infix?(node: RBNode<TKey, TData>): boolean;\n pre?(node: RBNode<TKey, TData>): boolean;\n post?(node: RBNode<TKey, TData>): boolean;\n showStructure?: boolean;\n}\n\nexport class RedBlackTree<TKey, TData> implements SortedDictionary<TKey, TData> {\n private root: RBNode<TKey, TData> | undefined;\n\n constructor(\n private readonly compareKeys: KeyComparer<TKey>,\n private readonly aug?: IRBAugmentation<TKey, TData>,\n ) { }\n\n private makeNode(key: TKey, data: TData, color: RBColor, size: number) {\n return <RBNode<TKey, TData>>{ key, data, color, size };\n }\n\n private isRed(node: RBNode<TKey, TData> | undefined) {\n return !!node && (node.color == RBColor.RED);\n }\n\n private nodeSize(node: RBNode<TKey, TData> | undefined) {\n return node ? node.size : 0;\n }\n public size() {\n return this.nodeSize(this.root);\n }\n public isEmpty() {\n return !this.root;\n }\n public get(key: TKey) {\n if (key !== undefined) {\n return this.nodeGet(this.root, key);\n }\n }\n private nodeGet(node: RBNode<TKey, TData> | undefined, key: TKey) {\n let _node = node;\n while (_node) {\n const cmp = this.compareKeys(key, _node.key);\n if (cmp < 0) {\n _node = _node.left;\n }\n else if (cmp > 0) {\n _node = _node.right;\n }\n else {\n return _node;\n }\n }\n }\n private contains(key: TKey) {\n return this.get(key);\n }\n\n public gather(key: TKey, matcher: IRBMatcher<TKey, TData>) {\n const results = [] as RBNode<TKey, TData>[];\n if (key !== undefined) {\n this.nodeGather(this.root, results, key, matcher);\n }\n return results;\n }\n\n private nodeGather(\n node: RBNode<TKey, TData> | undefined,\n results: RBNode<TKey, TData>[],\n key: TKey,\n matcher: IRBMatcher<TKey, TData>) {\n if (node) {\n if (matcher.continueSubtree(node.left, key)) {\n this.nodeGather(node.left, results, key, matcher);\n }\n if (matcher.matchNode(node, key)) {\n results.push(node);\n }\n if (matcher.continueSubtree(node.right, key)) {\n this.nodeGather(node.right, results, key, matcher);\n }\n }\n }\n\n public walkExactMatchesForward(\n compareFn: (node: RBNode<TKey, TData>) => number,\n actionFn: (node: RBNode<TKey, TData>) => void,\n continueLeftFn: (number: number) => boolean,\n continueRightFn: (number: number) => boolean) {\n this.nodeWalkExactMatchesForward(this.root, compareFn, actionFn, continueLeftFn, continueRightFn);\n }\n\n private nodeWalkExactMatchesForward(\n node: RBNode<TKey, TData> | undefined,\n compareFn: (node: RBNode<TKey, TData>) => number,\n actionFn: (node: RBNode<TKey, TData>) => void,\n continueLeftFn: (number: number) => boolean,\n continueRightFn: (number: number) => boolean) {\n if (!node) {\n return;\n }\n const result: number = compareFn(node);\n if (continueLeftFn(result)) {\n this.nodeWalkExactMatchesForward(node.left, compareFn, actionFn, continueLeftFn, continueRightFn);\n }\n if (result === 0) {\n actionFn(node);\n }\n if (continueRightFn(result)) {\n this.nodeWalkExactMatchesForward(node.right, compareFn, actionFn, continueLeftFn, continueRightFn);\n }\n }\n\n public walkExactMatchesBackward(\n compareFn: (node: RBNode<TKey, TData>) => number,\n actionFn: (node: RBNode<TKey, TData>) => void,\n continueLeftFn: (number: number) => boolean,\n continueRightFn: (number: number) => boolean) {\n this.nodeWalkExactMatchesBackward(this.root, compareFn, actionFn, continueLeftFn, continueRightFn);\n }\n\n private nodeWalkExactMatchesBackward(\n node: RBNode<TKey, TData> | undefined,\n compareFn: (node: RBNode<TKey, TData>) => number,\n actionFn: (node: RBNode<TKey, TData>) => void,\n continueLeftFn: (cmp: number) => boolean,\n continueRightFn: (cmp: number) => boolean) {\n if (!node) {\n return;\n }\n const result: number = compareFn(node);\n if (continueRightFn(result)) {\n this.nodeWalkExactMatchesBackward(node.right, compareFn, actionFn, continueLeftFn, continueRightFn);\n }\n if (result === 0) {\n actionFn(node);\n }\n if (continueLeftFn(result)) {\n this.nodeWalkExactMatchesBackward(node.left, compareFn, actionFn, continueLeftFn, continueRightFn);\n }\n }\n\n public put(key: TKey, data: TData, conflict?: ConflictAction<TKey, TData>) {\n if (key !== undefined) {\n if (data === undefined) {\n this.remove(key);\n }\n else {\n this.root = this.nodePut(this.root, key, data, conflict);\n this.root.color = RBColor.BLACK;\n }\n }\n }\n\n private nodePut(\n node: RBNode<TKey, TData> | undefined,\n key: TKey, data: TData,\n conflict?: ConflictAction<TKey, TData>,\n ) {\n let _node = node;\n if (!_node) {\n return this.makeNode(key, data, RBColor.RED, 1);\n }\n else {\n const cmp = this.compareKeys(key, _node.key);\n if (cmp < 0) {\n _node.left = this.nodePut(_node.left, key, data, conflict);\n }\n else if (cmp > 0) {\n _node.right = this.nodePut(_node.right, key, data, conflict);\n }\n else {\n if (conflict) {\n const kd = conflict(key, _node.key, data, _node.data);\n if (kd.key) {\n _node.key = kd.key;\n }\n if (kd.data) {\n _node.data = kd.data;\n } else {\n _node.data = data;\n }\n }\n else {\n _node.data = data;\n }\n }\n if (this.isRed(_node.right) && (!this.isRed(_node.left))) {\n _node = this.rotateLeft(_node);\n }\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n if (this.isRed(_node.left) && this.isRed(_node.left!.left)) {\n _node = this.rotateRight(_node);\n }\n if (this.isRed(_node.left) && this.isRed(_node.right)) {\n this.flipColors(_node);\n }\n _node.size = this.nodeSize(_node.left) + this.nodeSize(_node.right) + 1;\n if (this.aug) {\n this.updateLocal(_node);\n }\n return _node;\n }\n }\n\n private updateLocal(node: RBNode<TKey, TData>) {\n if (this.aug) {\n if (this.isRed(node.left)) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n this.aug.update(node.left!);\n }\n if (this.isRed(node.right)) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n this.aug.update(node.right!);\n }\n this.aug.update(node);\n }\n }\n\n private nodeRemoveMin(node: RBNode<TKey, TData>) {\n let _node = node;\n if (_node.left) {\n if ((!this.isRed(_node.left)) && (!this.isRed(_node.left.left))) {\n _node = this.moveRedLeft(_node);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n _node.left = this.nodeRemoveMin(_node.left!);\n return this.balance(_node);\n }\n }\n\n public remove(key: TKey) {\n if (key !== undefined) {\n if (!this.contains(key)) {\n return;\n }\n\n this.removeExisting(key);\n }\n // TODO: error on undefined key\n }\n\n public removeExisting(key: TKey) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n if ((!this.isRed(this.root!.left)) && (!this.isRed(this.root!.right))) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n this.root!.color = RBColor.RED;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n this.root = this.nodeRemove(this.root!, key);\n }\n\n private nodeRemove(node: RBNode<TKey, TData>, key: TKey) {\n let _node = node;\n if (this.compareKeys(key, _node.key) < 0) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n if ((!this.isRed(_node.left)) && (!this.isRed(_node.left!.left))) {\n _node = this.moveRedLeft(_node);\n }\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n _node.left = this.nodeRemove(_node.left!, key);\n }\n else {\n if (this.isRed(_node.left)) {\n _node = this.rotateRight(_node);\n }\n if ((this.compareKeys(key, _node.key) == 0) && (!_node.right)) {\n return undefined;\n }\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n if ((!this.isRed(_node.right)) && (!this.isRed(_node.right!.left))) {\n _node = this.moveRedRight(_node);\n }\n if (this.compareKeys(key, _node.key) == 0) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const subtreeMin = this.nodeMin(_node.right!);\n _node.key = subtreeMin.key;\n _node.data = subtreeMin.data;\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n _node.right = this.nodeRemoveMin(_node.right!);\n }\n else {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n _node.right = this.nodeRemove(_node.right!, key);\n }\n }\n return this.balance(_node);\n }\n private height() {\n return this.nodeHeight(this.root);\n }\n private nodeHeight(node: RBNode<TKey, TData> | undefined): number {\n if (node === undefined) {\n return -1;\n }\n else {\n return 1 + Math.max(this.nodeHeight(node.left), this.nodeHeight(node.right));\n }\n }\n\n public floor(key: TKey) {\n if (!this.isEmpty()) {\n return this.nodeFloor(this.root, key);\n }\n }\n\n private nodeFloor(node: RBNode<TKey, TData> | undefined, key: TKey): RBNode<TKey, TData> | undefined {\n if (node) {\n const cmp = this.compareKeys(key, node.key);\n if (cmp == 0) {\n return node;\n }\n else if (cmp < 0) {\n return this.nodeFloor(node.left, key);\n }\n else {\n const rightFloor = this.nodeFloor(node.right, key);\n if (rightFloor) {\n return rightFloor;\n }\n else {\n return node;\n }\n }\n }\n }\n\n public ceil(key: TKey) {\n if (!this.isEmpty()) {\n return this.nodeCeil(this.root, key);\n }\n }\n\n private nodeCeil(node: RBNode<TKey, TData> | undefined, key: TKey): RBNode<TKey, TData> | undefined {\n if (node) {\n const cmp = this.compareKeys(key, node.key);\n if (cmp == 0) {\n return node;\n }\n else if (cmp > 0) {\n return this.nodeCeil(node.right, key);\n }\n else {\n const leftCeil = this.nodeCeil(node.left, key);\n if (leftCeil) {\n return leftCeil;\n }\n else {\n return node;\n }\n }\n }\n }\n\n public min() {\n if (this.root) {\n return this.nodeMin(this.root);\n }\n }\n\n private nodeMin(node: RBNode<TKey, TData>): RBNode<TKey, TData> {\n if (!node.left) {\n return node;\n }\n else {\n return this.nodeMin(node.left);\n }\n }\n\n public max() {\n if (this.root) {\n return this.nodeMax(this.root);\n }\n }\n\n private nodeMax(node: RBNode<TKey, TData>): RBNode<TKey, TData> {\n if (!node.right) {\n return node;\n }\n else {\n return this.nodeMax(node.right);\n }\n }\n\n private rotateRight(node: RBNode<TKey, TData>) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const leftChild = node.left!;\n node.left = leftChild.right;\n leftChild.right = node;\n leftChild.color = leftChild.right.color;\n leftChild.right.color = RBColor.RED;\n leftChild.size = node.size;\n node.size = this.nodeSize(node.left) + this.nodeSize(node.right) + 1;\n if (this.aug) {\n this.updateLocal(node);\n this.updateLocal(leftChild);\n }\n return leftChild;\n }\n\n private rotateLeft(node: RBNode<TKey, TData>) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const rightChild = node.right!;\n node.right = rightChild.left;\n rightChild.left = node;\n rightChild.color = rightChild.left.color;\n rightChild.left.color = RBColor.RED;\n rightChild.size = node.size;\n node.size = this.nodeSize(node.left) + this.nodeSize(node.right) + 1;\n if (this.aug) {\n this.updateLocal(node);\n this.updateLocal(rightChild);\n }\n return rightChild;\n }\n\n private oppositeColor(c: RBColor) {\n return (c == RBColor.BLACK) ? RBColor.RED : RBColor.BLACK;\n }\n\n private flipColors(node: RBNode<TKey, TData>) {\n node.color = this.oppositeColor(node.color);\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n node.left!.color = this.oppositeColor(node.left!.color);\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n node.right!.color = this.oppositeColor(node.right!.color);\n }\n\n private moveRedLeft(node: RBNode<TKey, TData>) {\n let _node = node;\n this.flipColors(_node);\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n if (this.isRed(_node.right!.left)) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n _node.right = this.rotateRight(_node.right!);\n _node = this.rotateLeft(_node);\n this.flipColors(_node);\n }\n return _node;\n }\n\n private moveRedRight(node: RBNode<TKey, TData>) {\n let _node = node;\n this.flipColors(_node);\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n if (this.isRed(_node.left!.left)) {\n _node = this.rotateRight(_node);\n this.flipColors(_node);\n }\n return _node;\n }\n\n private balance(input: RBNode<TKey, TData>) {\n let node: RBNode<TKey, TData> | undefined = input;\n if (this.isRed(node.right)) {\n node = this.rotateLeft(node);\n }\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n if (this.isRed(node.left) && this.isRed(node.left!.left)) {\n node = this.rotateRight(node);\n }\n if (this.isRed(node.left) && (this.isRed(node.right))) {\n this.flipColors(node);\n }\n node.size = this.nodeSize(node.left) + this.nodeSize(node.right) + 1;\n if (this.aug) {\n this.aug.update(node);\n }\n return node;\n }\n\n public mapRange<TAccum>(action: PropertyAction<TKey, TData>, accum?: TAccum, start?: TKey, end?: TKey) {\n this.nodeMap(this.root, action, start, end);\n }\n\n public map<TAccum>(action: PropertyAction<TKey, TData>, accum?: TAccum) {\n // TODO: optimize to avoid comparisons\n this.nodeMap(this.root, action, accum);\n }\n\n public keys() {\n const keyList = <TKey[]>[];\n const actions = <RBNodeActions<TKey, TData>>{\n showStructure: true,\n infix: (node) => {\n keyList.push(node.key);\n return true;\n },\n };\n this.walk(actions);\n return keyList;\n }\n\n /**\n * Depth-first traversal with custom action; if action returns\n * false, traversal is halted.\n * @param action - action to apply to each node\n */\n public walk(actions: RBNodeActions<TKey, TData>) {\n this.nodeWalk(this.root, actions);\n }\n\n public walkBackward(actions: RBNodeActions<TKey, TData>) {\n this.nodeWalkBackward(this.root, actions);\n }\n\n private nodeWalk(node: RBNode<TKey, TData> | undefined, actions: RBNodeActions<TKey, TData>): boolean {\n let go = true;\n if (node) {\n if (actions.pre) {\n if (actions.showStructure || (node.color === RBColor.BLACK)) {\n go = actions.pre(node);\n }\n }\n if (node.left) {\n go = this.nodeWalk(node.left, actions);\n }\n if (go && actions.infix) {\n if (actions.showStructure || (node.color === RBColor.BLACK)) {\n go = actions.infix(node);\n }\n }\n if (go) {\n go = this.nodeWalk(node.right, actions);\n }\n if (go && actions.post) {\n if (actions.showStructure || (node.color === RBColor.BLACK)) {\n go = actions.post(node);\n }\n }\n }\n return go;\n }\n\n private nodeWalkBackward(node: RBNode<TKey, TData> | undefined, actions: RBNodeActions<TKey, TData>): boolean {\n let go = true;\n if (node) {\n if (actions.pre) {\n if (actions.showStructure || (node.color === RBColor.BLACK)) {\n go = actions.pre(node);\n }\n }\n if (node.right) {\n go = this.nodeWalkBackward(node.right, actions);\n }\n if (go && actions.infix) {\n if (actions.showStructure || (node.color === RBColor.BLACK)) {\n go = actions.infix(node);\n }\n }\n if (go) {\n go = this.nodeWalkBackward(node.left, actions);\n }\n if (go && actions.post) {\n if (actions.showStructure || (node.color === RBColor.BLACK)) {\n go = actions.post(node);\n }\n }\n }\n return go;\n }\n\n private nodeMap<TAccum>(\n node: RBNode<TKey, TData> | undefined,\n action: PropertyAction<TKey, TData>,\n accum?: TAccum,\n start?: TKey,\n end?: TKey,\n ): boolean {\n let _start = start;\n let _end = end;\n if (!node) {\n return true;\n }\n if (_start === undefined) {\n _start = this.nodeMin(node).key;\n }\n if (_end === undefined) {\n _end = this.nodeMax(node).key;\n }\n const cmpStart = this.compareKeys(_start, node.key);\n const cmpEnd = this.compareKeys(_end, node.key);\n let go = true;\n if (cmpStart < 0) {\n go = this.nodeMap(node.left, action, accum, _start, _end);\n }\n if (go && (cmpStart <= 0) && (cmpEnd >= 0)) {\n // REVIEW: test for black node here\n go = action(node, accum);\n }\n if (go && (cmpEnd > 0)) {\n go = this.nodeMap(node.right, action, accum, _start, _end);\n }\n return go;\n }\n public diag() {\n console.log(`Height is ${this.height()}`);\n }\n}\n\nexport interface AugmentedIntervalNode {\n minmax: IInterval;\n}\n\nexport const integerRangeToString = (range: IIntegerRange) => `[${range.start},${range.end})`;\n\nexport interface IInterval {\n clone(): IInterval;\n compare(b: IInterval): number;\n compareStart(b: IInterval): number;\n compareEnd(b: IInterval): number;\n modify(label: string, start: number, end: number): IInterval | undefined;\n overlaps(b: IInterval): boolean;\n union(b: IInterval): IInterval;\n}\n\nconst intervalComparer = (a: IInterval, b: IInterval) => a.compare(b);\nexport type IntervalNode<T extends IInterval> = RBNode<T, AugmentedIntervalNode>;\nexport type IntervalConflictResolver<TInterval> = (a: TInterval, b: TInterval) => TInterval;\n\nexport class IntervalTree<T extends IInterval> implements IRBAugmentation<T, AugmentedIntervalNode>,\n IRBMatcher<T, AugmentedIntervalNode> {\n public intervals = new RedBlackTree<T, AugmentedIntervalNode>(intervalComparer, this);\n\n public remove(x: T) {\n this.intervals.remove(x);\n }\n\n public removeExisting(x: T) {\n this.intervals.removeExisting(x);\n }\n\n public put(x: T, conflict?: IntervalConflictResolver<T>) {\n let rbConflict: ConflictAction<T, AugmentedIntervalNode> | undefined;\n if (conflict) {\n rbConflict = (key: T, currentKey: T) => {\n const ival = conflict(key, currentKey);\n return {\n key: ival,\n };\n };\n }\n this.intervals.put(x, { minmax: x.clone() }, rbConflict);\n }\n\n public map(fn: (x: T) => void) {\n const actions = <RBNodeActions<T, AugmentedIntervalNode>>{\n infix: (node) => {\n fn(node.key);\n return true;\n },\n showStructure: true,\n };\n this.intervals.walk(actions);\n }\n\n public mapUntil(fn: (X: T) => boolean) {\n const actions = <RBNodeActions<T, AugmentedIntervalNode>>{\n infix: (node) => {\n return fn(node.key);\n },\n showStructure: true,\n };\n this.intervals.walk(actions);\n }\n\n public mapBackward(fn: (x: T) => void) {\n const actions = <RBNodeActions<T, AugmentedIntervalNode>>{\n infix: (node) => {\n fn(node.key);\n return true;\n },\n showStructure: true,\n };\n this.intervals.walkBackward(actions);\n }\n\n // TODO: toString()\n public match(x: T) {\n return this.intervals.gather(x, this);\n }\n\n public matchNode(node: IntervalNode<T> | undefined, key: T) {\n return !!node && node.key.overlaps(key);\n }\n\n public continueSubtree(node: IntervalNode<T> | undefined, key: T) {\n return !!node && node.data.minmax.overlaps(key);\n }\n\n public update(node: IntervalNode<T>) {\n if (node.left && node.right) {\n node.data.minmax = node.key.union(\n node.left.data.minmax.union(node.right.data.minmax));\n } else {\n if (node.left) {\n node.data.minmax = node.key.union(node.left.data.minmax);\n } else if (node.right) {\n node.data.minmax = node.key.union(node.right.data.minmax);\n } else {\n node.data.minmax = node.key.clone();\n }\n }\n }\n}\n\nexport interface TSTResult<T> {\n key: string;\n val: T;\n}\n\nexport interface TSTNode<T> {\n c: string;\n left?: TSTNode<T>;\n mid?: TSTNode<T>;\n right?: TSTNode<T>;\n val?: T;\n}\n\ninterface TSTPrefix {\n text: string;\n}\n\nexport interface ProxString<T> {\n text: string;\n invDistance: number;\n val: T;\n}\n\nexport class TST<T> {\n private n = 0;\n private root: TSTNode<T> | undefined;\n\n public size() {\n return this.n;\n }\n\n private contains(key: string) {\n return this.get(key);\n }\n\n public get(key: string) {\n const x = this.nodeGet(this.root, key, 0);\n if (x === undefined) {\n return undefined;\n }\n return x.val;\n }\n\n private nodeGet(x: TSTNode<T> | undefined, key: string, d: number): TSTNode<T> | undefined {\n if (x === undefined) {\n return undefined;\n }\n const c = key.charAt(d);\n if (c < x.c) {\n return this.nodeGet(x.left, key, d);\n }\n else if (c > x.c) {\n return this.nodeGet(x.right, key, d);\n }\n else if (d < (key.length - 1)) {\n return this.nodeGet(x.mid, key, d + 1);\n }\n else { return x; }\n }\n\n public put(key: string, val: T) {\n if (!this.contains(key)) {\n this.n++;\n }\n this.root = this.nodePut(this.root, key, val, 0);\n // console.log(`put ${key}`);\n }\n\n private nodePut(x: TSTNode<T> | undefined, key: string, val: T, d: number) {\n let _x = x;\n const c = key.charAt(d);\n if (_x === undefined) {\n _x = { c };\n }\n if (c < _x.c) {\n _x.left = this.nodePut(_x.left, key, val, d);\n }\n else if (c > _x.c) {\n _x.right = this.nodePut(_x.right, key, val, d);\n }\n else if (d < (key.length - 1)) {\n _x.mid = this.nodePut(_x.mid, key, val, d + 1);\n }\n else {\n _x.val = val;\n }\n return _x;\n }\n\n public neighbors(text: string, distance = 2) {\n let q = <ProxString<T>[]>[];\n this.nodeProximity(this.root, { text: \"\" }, 0, text, distance, q);\n q = q.filter((value) => (value.text.length > 0));\n return q;\n }\n\n public keysWithPrefix(text: string) {\n const q = <string[]>[];\n const x = this.nodeGet(this.root, text, 0);\n if (x === undefined) {\n return q;\n }\n if (x.val !== undefined) {\n q.push(text);\n }\n this.collect(x.mid, { text }, q);\n return q;\n }\n\n private collect(x: TSTNode<T> | undefined, prefix: TSTPrefix, q: string[]) {\n if (x === undefined) {\n return;\n }\n this.collect(x.left, prefix, q);\n if (x.val !== undefined) {\n q.push(prefix.text + x.c);\n }\n this.collect(x.mid, { text: prefix.text + x.c }, q);\n this.collect(x.right, prefix, q);\n }\n\n private mapNode(x: TSTNode<T> | undefined, prefix: TSTPrefix, fn: (key: string, val: T) => void) {\n if (x === undefined) {\n return;\n }\n const key = prefix.text + x.c;\n this.mapNode(x.left, prefix, fn);\n if (x.val) {\n fn(key, x.val);\n }\n this.mapNode(x.mid, { text: key }, fn);\n this.mapNode(x.right, prefix, fn);\n }\n\n public map(fn: (key: string, val: T) => void) {\n this.mapNode(this.root, { text: \"\" }, fn);\n }\n\n public pairsWithPrefix(text: string) {\n const q = <TSTResult<T>[]>[];\n const x = this.nodeGet(this.root, text, 0);\n if (x === undefined) {\n return q;\n }\n if (x.val !== undefined) {\n q.push({ key: text, val: x.val });\n }\n this.collectPairs(x.mid, { text }, q);\n return q;\n }\n\n private collectPairs(x: TSTNode<T> | undefined, prefix: TSTPrefix, q: TSTResult<T>[]) {\n if (x === undefined) {\n return;\n }\n this.collectPairs(x.left, prefix, q);\n if (x.val !== undefined) {\n q.push({ key: prefix.text + x.c, val: x.val });\n }\n this.collectPairs(x.mid, { text: prefix.text + x.c }, q);\n this.collectPairs(x.right, prefix, q);\n }\n\n private nodeProximity(\n x: TSTNode<T> | undefined,\n prefix: TSTPrefix,\n d: number,\n pattern: string,\n distance: number,\n q: ProxString<T>[]) {\n if ((x === undefined) || (distance < 0)) {\n return;\n }\n const c = pattern.charAt(d);\n if ((distance > 0) || (c < x.c)) {\n this.nodeProximity(x.left, prefix, d, pattern, distance, q);\n }\n if (x.val !== undefined) {\n const remD = distance - (pattern.length - d);\n if (remD >= 0) {\n let invD = distance;\n if (c !== x.c) {\n invD--;\n }\n q.push({ text: prefix.text + x.c, val: x.val, invDistance: invD });\n }\n }\n const recurD = (d < (pattern.length - 1)) ? d + 1 : d;\n if (c === x.c) {\n this.nodeProximity(x.mid, { text: prefix.text + x.c }, recurD, pattern, distance, q);\n }\n else {\n this.nodeProximity(x.mid, { text: prefix.text + x.c }, recurD, pattern, distance - 1, q);\n }\n if ((distance > 0) || (c > x.c)) {\n this.nodeProximity(x.right, prefix, d, pattern, distance, q);\n }\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"partialLengths.d.ts","sourceRoot":"","sources":["../src/partialLengths.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7C,OAAO,EACH,mBAAmB,EAEnB,WAAW,EAGX,SAAS,EACZ,MAAM,aAAa,CAAC;AAErB,UAAU,cAAc;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAClB;AA2BD,MAAM,WAAW,qBAAqB;IAClC,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,oBAAoB,CAAC,EAAE,YAAY,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;CAC/D;AAED;;;;GAIG;AACH,qBAAa,sBAAsB;
|
|
1
|
+
{"version":3,"file":"partialLengths.d.ts","sourceRoot":"","sources":["../src/partialLengths.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7C,OAAO,EACH,mBAAmB,EAEnB,WAAW,EAGX,SAAS,EACZ,MAAM,aAAa,CAAC;AAErB,UAAU,cAAc;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAClB;AA2BD,MAAM,WAAW,qBAAqB;IAClC,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,oBAAoB,CAAC,EAAE,YAAY,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;CAC/D;AAED;;;;GAIG;AACH,qBAAa,sBAAsB;IAgVZ,MAAM,EAAE,MAAM;IA/UjC,OAAc,OAAO;;;MAGnB;WAEY,OAAO,CAAC,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,mBAAmB,EAAE,KAAK,UAAQ;IAIhH;;;;;OAKG;IACH,OAAO,CAAC,MAAM,CAAC,aAAa;IAyI5B,OAAO,CAAC,MAAM,CAAC,UAAU;IAyDzB,OAAO,CAAC,MAAM,CAAC,iBAAiB;IAQhC,OAAO,CAAC,MAAM,CAAC,6BAA6B;IAmB5C,OAAO,CAAC,MAAM,CAAC,aAAa;IA4D5B,OAAO,CAAC,MAAM,CAAC,MAAM;IAkCd,SAAS,SAAK;IACd,YAAY,SAAK;IACjB,cAAc,EAAE,qBAAqB,EAAE,CAAM;IAC7C,gBAAgB,EAAE,qBAAqB,EAAE,EAAE,CAAM;gBAErC,MAAM,EAAE,MAAM;IAM1B,MAAM,CACT,SAAS,EAAE,SAAS,EACpB,IAAI,EAAE,WAAW,EACjB,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,mBAAmB;IAqD9B,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;IAgCjD,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,MAAM,EAAE,WAAW,SAAI;IA2B7D,OAAO,CAAC,OAAO;IA+Bf,OAAO,CAAC,kBAAkB;IAa1B,OAAO,CAAC,6BAA6B;IAWrC,OAAO,CAAC,YAAY;IASpB,OAAO,CAAC,SAAS;IAUjB,OAAO,CAAC,oBAAoB;IAqD5B,OAAO,CAAC,MAAM;CAqBjB"}
|
package/lib/partialLengths.js
CHANGED
|
@@ -151,7 +151,8 @@ export class PartialSequenceLengths {
|
|
|
151
151
|
// Find next earliest sequence number
|
|
152
152
|
if (indices[k] < childPartialsCounts[k]) {
|
|
153
153
|
const cpLen = childPartials[k].partialLengths[indices[k]];
|
|
154
|
-
// eslint-disable-next-line
|
|
154
|
+
// eslint-disable-next-line max-len
|
|
155
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion, @typescript-eslint/no-unnecessary-type-assertion
|
|
155
156
|
if ((outerIndexOfEarliest < 0) || (cpLen.seq < earliestPartialLength.seq)) {
|
|
156
157
|
outerIndexOfEarliest = k;
|
|
157
158
|
earliestPartialLength = cpLen;
|
|
@@ -159,7 +160,8 @@ export class PartialSequenceLengths {
|
|
|
159
160
|
}
|
|
160
161
|
}
|
|
161
162
|
if (outerIndexOfEarliest >= 0) {
|
|
162
|
-
// eslint-disable-next-line
|
|
163
|
+
// eslint-disable-next-line max-len
|
|
164
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion, @typescript-eslint/no-unnecessary-type-assertion
|
|
163
165
|
addNext(earliestPartialLength);
|
|
164
166
|
indices[outerIndexOfEarliest]++;
|
|
165
167
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"partialLengths.js","sourceRoot":"","sources":["../src/partialLengths.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { assert } from \"@fluidframework/common-utils\";\nimport { Property } from \"./base\";\nimport { RedBlackTree } from \"./collections\";\nimport { UnassignedSequenceNumber } from \"./constants\";\nimport {\n CollaborationWindow,\n compareNumbers,\n IMergeBlock,\n IRemovalInfo,\n ISegment,\n MergeTree,\n} from \"./mergeTree\";\n\ninterface IOverlapClient {\n clientId: number;\n seglen: number;\n}\n\n/**\n * Returns the partial length whose sequence number is\n * the greatest sequence number within a that is\n * less than or equal to key.\n * @param a - array of partial segment lengths\n * @param key - sequence number\n */\nfunction latestLEQ(a: PartialSequenceLength[], key: number) {\n let best = -1;\n let lo = 0;\n let hi = a.length - 1;\n while (lo <= hi) {\n const mid = lo + Math.floor((hi - lo) / 2);\n if (a[mid].seq <= key) {\n if ((best < 0) || (a[best].seq < a[mid].seq)) {\n best = mid;\n }\n lo = mid + 1;\n } else {\n hi = mid - 1;\n }\n }\n return best;\n}\n\nexport interface PartialSequenceLength {\n seq: number;\n len: number;\n seglen: number;\n clientId?: number;\n overlapRemoveClients?: RedBlackTree<number, IOverlapClient>;\n}\n\n/**\n * Keep track of partial sums of segment lengths for all sequence numbers\n * in the current collaboration window (if any). Only used during active\n * collaboration.\n */\nexport class PartialSequenceLengths {\n public static options = {\n verify: false,\n zamboni: true,\n };\n\n public static combine(mergeTree: MergeTree, block: IMergeBlock, collabWindow: CollaborationWindow, recur = false) {\n return PartialSequenceLengths.combineBranch(mergeTree, block, collabWindow, recur);\n }\n\n /**\n * Combine the partial lengths of block's children\n * @param block - an interior node; it is assumed that each interior node child of this block\n * has its partials up to date\n * @param collabWindow - segment window of the segment tree containing textSegmentBlock\n */\n private static combineBranch(\n mergeTree: MergeTree,\n block: IMergeBlock,\n collabWindow: CollaborationWindow,\n recur = false) {\n let combinedPartialLengths = new PartialSequenceLengths(collabWindow.minSeq);\n PartialSequenceLengths.fromLeaves(mergeTree, combinedPartialLengths, block, collabWindow);\n let prevPartial: PartialSequenceLength | undefined;\n\n function cloneOverlapRemoveClients(oldTree: RedBlackTree<number, IOverlapClient> | undefined) {\n if (!oldTree) { return undefined; }\n const newTree = new RedBlackTree<number, IOverlapClient>(compareNumbers);\n oldTree.map((bProp: Property<number, IOverlapClient>) => {\n newTree.put(bProp.data.clientId, { ...bProp.data });\n return true;\n });\n return newTree;\n }\n\n function combineOverlapClients(a: PartialSequenceLength, b: PartialSequenceLength) {\n const overlapRemoveClientsA = a.overlapRemoveClients;\n if (overlapRemoveClientsA) {\n if (b.overlapRemoveClients) {\n b.overlapRemoveClients.map((bProp: Property<number, IOverlapClient>) => {\n const aProp = overlapRemoveClientsA.get(bProp.key);\n if (aProp) {\n aProp.data.seglen += bProp.data.seglen;\n } else {\n overlapRemoveClientsA.put(bProp.data.clientId, { ...bProp.data });\n }\n return true;\n });\n }\n } else {\n a.overlapRemoveClients = cloneOverlapRemoveClients(b.overlapRemoveClients);\n }\n }\n\n function addNext(partialLength: PartialSequenceLength) {\n const seq = partialLength.seq;\n let pLen = 0;\n\n if (prevPartial) {\n if (prevPartial.seq === partialLength.seq) {\n prevPartial.seglen += partialLength.seglen;\n prevPartial.len += partialLength.seglen;\n combineOverlapClients(prevPartial, partialLength);\n return;\n } else {\n pLen = prevPartial.len;\n // Previous sequence number is finished\n combinedPartialLengths.addClientSeqNumberFromPartial(prevPartial);\n }\n }\n prevPartial = {\n clientId: partialLength.clientId,\n len: pLen + partialLength.seglen,\n overlapRemoveClients: cloneOverlapRemoveClients(partialLength.overlapRemoveClients),\n seglen: partialLength.seglen,\n seq,\n };\n combinedPartialLengths.partialLengths.push(prevPartial);\n }\n\n const childPartials: PartialSequenceLengths[] = [];\n for (let i = 0; i < block.childCount; i++) {\n const child = block.children[i];\n if (!child.isLeaf()) {\n const childBlock = child;\n if (recur) {\n childBlock.partialLengths =\n PartialSequenceLengths.combine(mergeTree, childBlock, collabWindow, true);\n }\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n childPartials.push(childBlock.partialLengths!);\n }\n }\n let childPartialsLen = childPartials.length;\n if (childPartialsLen !== 0) {\n // Some children are interior nodes\n if (combinedPartialLengths.partialLengths.length > 0) {\n // Some children were leaves; add combined partials from these segments\n childPartials.push(combinedPartialLengths);\n childPartialsLen++;\n combinedPartialLengths = new PartialSequenceLengths(collabWindow.minSeq);\n }\n const indices = new Array<number>(childPartialsLen);\n const childPartialsCounts = new Array<number>(childPartialsLen);\n for (let i = 0; i < childPartialsLen; i++) {\n indices[i] = 0;\n childPartialsCounts[i] = childPartials[i].partialLengths.length;\n combinedPartialLengths.minLength += childPartials[i].minLength;\n combinedPartialLengths.segmentCount += childPartials[i].segmentCount;\n }\n let outerIndexOfEarliest = 0;\n let earliestPartialLength: PartialSequenceLength;\n while (outerIndexOfEarliest >= 0) {\n outerIndexOfEarliest = -1;\n for (let k = 0; k < childPartialsLen; k++) {\n // Find next earliest sequence number\n if (indices[k] < childPartialsCounts[k]) {\n const cpLen = childPartials[k].partialLengths[indices[k]];\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n if ((outerIndexOfEarliest < 0) || (cpLen.seq < earliestPartialLength!.seq)) {\n outerIndexOfEarliest = k;\n earliestPartialLength = cpLen;\n }\n }\n }\n if (outerIndexOfEarliest >= 0) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n addNext(earliestPartialLength!);\n indices[outerIndexOfEarliest]++;\n }\n }\n // Add client entry for last partial, if any\n if (prevPartial) {\n combinedPartialLengths.addClientSeqNumberFromPartial(prevPartial);\n }\n }\n // TODO: incremental zamboni during build\n // console.log(combinedPartialLengths.toString());\n // console.log(`ZZZ...(min ${segmentWindow.minSeq})`);\n if (PartialSequenceLengths.options.zamboni) {\n combinedPartialLengths.zamboni(collabWindow);\n }\n\n if (PartialSequenceLengths.options.verify) {\n combinedPartialLengths.verify();\n }\n\n // console.log(combinedPartialLengths.toString());\n return combinedPartialLengths;\n }\n\n private static fromLeaves(\n mergeTree: MergeTree, combinedPartialLengths: PartialSequenceLengths,\n block: IMergeBlock, collabWindow: CollaborationWindow) {\n combinedPartialLengths.minLength = 0;\n combinedPartialLengths.segmentCount = block.childCount;\n\n function seqLTE(seq: number, minSeq: number) {\n return (seq !== UnassignedSequenceNumber) && (seq <= minSeq);\n }\n\n for (let i = 0; i < block.childCount; i++) {\n const child = block.children[i];\n if (child.isLeaf()) {\n // Leaf segment\n const segment = child;\n // eslint-disable-next-line max-len\n // console.log(`seg br ${segBranchId} cli ${glc(mergeTree, segment.clientId)} me ${glc(mergeTree, mergeTree.collabWindow.clientId)}`);\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n if (seqLTE(segment.seq!, collabWindow.minSeq)) {\n combinedPartialLengths.minLength += segment.cachedLength;\n } else {\n if (segment.seq !== UnassignedSequenceNumber) {\n PartialSequenceLengths.insertSegment(combinedPartialLengths, segment);\n }\n }\n const removalInfo: IRemovalInfo = segment;\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n if (seqLTE(removalInfo.removedSeq!, collabWindow.minSeq)) {\n combinedPartialLengths.minLength -= segment.cachedLength;\n } else {\n if ((removalInfo.removedSeq !== undefined) &&\n (removalInfo.removedSeq !== UnassignedSequenceNumber)) {\n PartialSequenceLengths.insertSegment(\n combinedPartialLengths,\n segment,\n removalInfo);\n }\n }\n }\n }\n // Post-process correctly-ordered partials computing sums and creating\n // lists for each present client id\n const seqPartials = combinedPartialLengths.partialLengths;\n const seqPartialsLen = seqPartials.length;\n\n let prevLen = 0;\n for (let i = 0; i < seqPartialsLen; i++) {\n seqPartials[i].len = prevLen + seqPartials[i].seglen;\n prevLen = seqPartials[i].len;\n combinedPartialLengths.addClientSeqNumberFromPartial(seqPartials[i]);\n }\n if (PartialSequenceLengths.options.verify) {\n combinedPartialLengths.verify();\n }\n }\n\n private static getOverlapClients(overlapClientids: number[], seglen: number) {\n const bst = new RedBlackTree<number, IOverlapClient>(compareNumbers);\n for (const clientId of overlapClientids) {\n bst.put(clientId, { clientId, seglen });\n }\n return bst;\n }\n\n private static accumulateRemoveClientOverlap(\n partialLength: PartialSequenceLength,\n overlapRemoveClientIds: number[],\n seglen: number) {\n if (partialLength.overlapRemoveClients) {\n for (const clientId of overlapRemoveClientIds) {\n const ovlapClientNode = partialLength.overlapRemoveClients.get(clientId);\n if (!ovlapClientNode) {\n partialLength.overlapRemoveClients.put(clientId, { clientId, seglen });\n } else {\n ovlapClientNode.data.seglen += seglen;\n }\n }\n } else {\n partialLength.overlapRemoveClients =\n PartialSequenceLengths.getOverlapClients(overlapRemoveClientIds, seglen);\n }\n }\n\n private static insertSegment(\n combinedPartialLengths: PartialSequenceLengths,\n segment: ISegment,\n removalInfo?: IRemovalInfo) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n let seq = segment.seq!;\n let segmentLen = segment.cachedLength;\n let clientId = segment.clientId;\n let removeClientOverlap: number[] | undefined;\n\n if (removalInfo) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n seq = removalInfo.removedSeq!;\n segmentLen = -segmentLen;\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n clientId = removalInfo.removedClientId!;\n if (removalInfo.removedClientOverlap) {\n removeClientOverlap = removalInfo.removedClientOverlap;\n }\n }\n\n const seqPartials = combinedPartialLengths.partialLengths;\n const seqPartialsLen = seqPartials.length;\n // Find the first entry with sequence number greater or equal to seq\n let indexFirstGTE = 0;\n for (; indexFirstGTE < seqPartialsLen; indexFirstGTE++) {\n if (seqPartials[indexFirstGTE].seq >= seq) {\n break;\n }\n }\n if ((indexFirstGTE < seqPartialsLen) && (seqPartials[indexFirstGTE].seq === seq)) {\n seqPartials[indexFirstGTE].seglen += segmentLen;\n if (removeClientOverlap) {\n PartialSequenceLengths.accumulateRemoveClientOverlap(\n seqPartials[indexFirstGTE],\n removeClientOverlap,\n segmentLen);\n }\n } else {\n let pLen: PartialSequenceLength;\n if (removeClientOverlap) {\n const overlapClients = PartialSequenceLengths.getOverlapClients(removeClientOverlap, segmentLen);\n pLen = { seq, clientId, len: 0, seglen: segmentLen, overlapRemoveClients: overlapClients };\n } else {\n pLen = { seq, clientId, len: 0, seglen: segmentLen };\n }\n\n if (indexFirstGTE < seqPartialsLen) {\n // Shift entries with greater sequence numbers\n // TODO: investigate performance improvement using BST\n for (let k = seqPartialsLen; k > indexFirstGTE; k--) {\n seqPartials[k] = seqPartials[k - 1];\n }\n seqPartials[indexFirstGTE] = pLen;\n } else {\n seqPartials.push(pLen);\n }\n }\n }\n\n private static addSeq(partialLengths: PartialSequenceLength[], seq: number, seqSeglen: number, clientId?: number) {\n let seqPartialLen: PartialSequenceLength | undefined;\n let penultPartialLen: PartialSequenceLength | undefined;\n let leqIndex = latestLEQ(partialLengths, seq);\n if (leqIndex >= 0) {\n const pLen = partialLengths[leqIndex];\n if (pLen.seq === seq) {\n seqPartialLen = pLen;\n leqIndex = latestLEQ(partialLengths, seq - 1);\n if (leqIndex >= 0) {\n penultPartialLen = partialLengths[leqIndex];\n }\n } else {\n penultPartialLen = pLen;\n }\n }\n if (seqPartialLen === undefined) {\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n seqPartialLen = {\n clientId,\n seglen: seqSeglen,\n seq,\n } as PartialSequenceLength;\n partialLengths.push(seqPartialLen);\n } else {\n seqPartialLen.seglen = seqSeglen;\n // Assert client id matches\n }\n if (penultPartialLen !== undefined) {\n seqPartialLen.len = seqPartialLen.seglen + penultPartialLen.len;\n } else {\n seqPartialLen.len = seqPartialLen.seglen;\n }\n }\n public minLength = 0;\n public segmentCount = 0;\n public partialLengths: PartialSequenceLength[] = [];\n public clientSeqNumbers: PartialSequenceLength[][] = [];\n\n constructor(public minSeq: number) {\n }\n\n // Assume: seq is latest sequence number; no structural change to sub-tree, but a segment\n // with sequence number seq has been added within the sub-tree\n // TODO: assert client id matches\n public update(\n mergeTree: MergeTree,\n node: IMergeBlock,\n seq: number,\n clientId: number,\n collabWindow: CollaborationWindow) {\n let seqSeglen = 0;\n let segCount = 0;\n // Compute length for seq across children\n for (let i = 0; i < node.childCount; i++) {\n const child = node.children[i];\n if (!child.isLeaf()) {\n const childBlock = child;\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const branchPartialLengths = childBlock.partialLengths!;\n const partialLengths = branchPartialLengths.partialLengths;\n const seqIndex = latestLEQ(partialLengths, seq);\n if (seqIndex >= 0) {\n const leqPartial = partialLengths[seqIndex];\n if (leqPartial.seq === seq) {\n seqSeglen += leqPartial.seglen;\n }\n }\n segCount += branchPartialLengths.segmentCount;\n } else {\n const segment = child;\n const removalInfo: IRemovalInfo = segment;\n\n if (segment.seq === seq) {\n if (removalInfo.removedSeq !== seq) {\n seqSeglen += segment.cachedLength;\n }\n } else {\n if (removalInfo.removedSeq === seq) {\n seqSeglen -= segment.cachedLength;\n }\n }\n segCount++;\n }\n }\n this.segmentCount = segCount;\n\n PartialSequenceLengths.addSeq(this.partialLengths, seq, seqSeglen, clientId);\n if (this.clientSeqNumbers[clientId] === undefined) {\n this.clientSeqNumbers[clientId] = [];\n }\n PartialSequenceLengths.addSeq(this.clientSeqNumbers[clientId], seq, seqSeglen);\n // console.log(this.toString());\n if (PartialSequenceLengths.options.zamboni) {\n this.zamboni(collabWindow);\n }\n if (PartialSequenceLengths.options.verify) {\n this.verify();\n }\n // console.log('ZZZ');\n // console.log(this.toString());\n }\n\n public getPartialLength(refSeq: number, clientId: number) {\n let pLen = this.minLength;\n const seqIndex = latestLEQ(this.partialLengths, refSeq);\n const cliLatestindex = this.cliLatest(clientId);\n const cliSeq = this.clientSeqNumbers[clientId];\n if (seqIndex >= 0) {\n // Add the partial length up to refSeq\n pLen += this.partialLengths[seqIndex].len;\n\n if (cliLatestindex >= 0) {\n const cliLatest = cliSeq[cliLatestindex];\n\n if (cliLatest.seq > refSeq) {\n // The client has local edits after refSeq, add in the length adjustments\n pLen += cliLatest.len;\n const precedingCliIndex = this.cliLatestLEQ(clientId, refSeq);\n if (precedingCliIndex >= 0) {\n pLen -= cliSeq[precedingCliIndex].len;\n }\n }\n }\n } else {\n // RefSeq is before any of the partial lengths\n // so just add in all local edits of that client (which should all be after the refSeq)\n if (cliLatestindex >= 0) {\n const cliLatest = cliSeq[cliLatestindex];\n pLen += cliLatest.len;\n }\n }\n return pLen;\n }\n\n public toString(glc?: (id: number) => string, indentCount = 0) {\n let buf = \"\";\n for (const partial of this.partialLengths) {\n buf += `(${partial.seq},${partial.len}) `;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-for-in-array, no-restricted-syntax\n for (const clientId in this.clientSeqNumbers) {\n if (this.clientSeqNumbers[clientId].length > 0) {\n buf += `Client `;\n if (glc) {\n buf += `${glc(+clientId)}`;\n } else {\n buf += `${clientId}`;\n }\n buf += \"[\";\n for (const partial of this.clientSeqNumbers[clientId]) {\n buf += `(${partial.seq},${partial.len})`;\n }\n buf += \"]\";\n }\n }\n buf = `min(seq ${this.minSeq}): ${this.minLength}; sc: ${this.segmentCount};${buf}`;\n return buf;\n }\n\n // Clear away partial sums for sequence numbers earlier than the current window\n private zamboni(segmentWindow: CollaborationWindow) {\n function copyDown(partialLengths: PartialSequenceLength[]) {\n const mindex = latestLEQ(partialLengths, segmentWindow.minSeq);\n let minLength = 0;\n // console.log(`mindex ${mindex}`);\n if (mindex >= 0) {\n minLength = partialLengths[mindex].len;\n const seqCount = partialLengths.length;\n if (mindex <= (seqCount - 1)) {\n // Still some entries remaining\n const remainingCount = (seqCount - mindex) - 1;\n // Copy down\n for (let i = 0; i < remainingCount; i++) {\n partialLengths[i] = partialLengths[i + mindex + 1];\n partialLengths[i].len -= minLength;\n }\n partialLengths.length = remainingCount;\n }\n }\n return minLength;\n }\n this.minLength += copyDown(this.partialLengths);\n // eslint-disable-next-line @typescript-eslint/no-for-in-array, guard-for-in, no-restricted-syntax\n for (const clientId in this.clientSeqNumbers) {\n const cliPartials = this.clientSeqNumbers[clientId];\n if (cliPartials) {\n copyDown(cliPartials);\n }\n }\n }\n\n private addClientSeqNumber(clientId: number, seq: number, seglen: number) {\n if (this.clientSeqNumbers[clientId] === undefined) {\n this.clientSeqNumbers[clientId] = [];\n }\n const cli = this.clientSeqNumbers[clientId];\n let pLen = seglen;\n if (cli.length > 0) {\n pLen += cli[cli.length - 1].len;\n }\n cli.push({ seq, len: pLen, seglen });\n }\n\n // Assumes sequence number already coalesced\n private addClientSeqNumberFromPartial(partialLength: PartialSequenceLength) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n this.addClientSeqNumber(partialLength.clientId!, partialLength.seq, partialLength.seglen);\n if (partialLength.overlapRemoveClients) {\n partialLength.overlapRemoveClients.map((oc: Property<number, IOverlapClient>) => {\n this.addClientSeqNumber(oc.data.clientId, partialLength.seq, oc.data.seglen);\n return true;\n });\n }\n }\n\n private cliLatestLEQ(clientId: number, refSeq: number) {\n const cliSeqs = this.clientSeqNumbers[clientId];\n if (cliSeqs) {\n return latestLEQ(cliSeqs, refSeq);\n } else {\n return -1;\n }\n }\n\n private cliLatest(clientId: number) {\n const cliSeqs = this.clientSeqNumbers[clientId];\n if (cliSeqs && (cliSeqs.length > 0)) {\n return cliSeqs.length - 1;\n } else {\n return -1;\n }\n }\n\n // Debug only\n private verifyPartialLengths(partialLengths: PartialSequenceLength[], clientPartials: boolean) {\n if (partialLengths.length === 0) { return 0; }\n\n let lastSeqNum = 0;\n let accumSegLen = 0;\n let count = 0;\n\n for (const partialLength of partialLengths) {\n // Count total number of partial length\n count++;\n\n // Sequence number should be larger or equal to minseq\n assert(this.minSeq <= partialLength.seq, 0x054 /* \"Sequence number less than minSeq!\" */);\n\n // Sequence number should be sorted\n assert(lastSeqNum < partialLength.seq, 0x055 /* \"Sequence number is not sorted!\" */);\n lastSeqNum = partialLength.seq;\n\n // Len is a accumulation of all the seglen adjustments\n accumSegLen += partialLength.seglen;\n if (accumSegLen !== partialLength.len) {\n assert(false, 0x056 /* \"Unexpected total for accumulation of all seglen adjustments!\" */);\n }\n\n if (clientPartials) {\n // Client partials used to track local edits so we can account for them some refSeq.\n // But the information we keep track of are since minSeq, so we keep track of more history\n // then needed, and some of them doesn't make sense to be used for length calculations\n // e.g. if you have this sequence, where the minSeq is #5 because of other clients\n // seq 10: client 1: insert seg #1\n // seq 11: client 2: delete seg #2 refseq: 10\n // minLength is 0, we would have keep a record of seglen: -1 for clientPartialLengths for client 2\n // So if you ask for partial length for client 2 @ seq 5, we will have return -1.\n // However, that combination is invalid, since we should never see any ops with refseq < 10 for\n // client 2 after seq 11.\n } else {\n // Len adjustment should not make length negative\n if (this.minLength + partialLength.len < 0) {\n assert(false, 0x057 /* \"Negative length after length adjustment!\" */);\n }\n }\n\n if (partialLength.overlapRemoveClients) {\n // Only the flat partialLengths can have overlapRemoveClients, the per client view shouldn't\n assert(!clientPartials, 0x058 /* \"Both overlapRemoveClients and clientPartials are set!\" */);\n\n // Each overlap client count as one\n count += partialLength.overlapRemoveClients.size();\n }\n }\n return count;\n }\n\n private verify() {\n if (this.clientSeqNumbers) {\n let cliCount = 0;\n for (const cliSeq of this.clientSeqNumbers) {\n if (cliSeq) {\n cliCount += this.verifyPartialLengths(cliSeq, true);\n }\n }\n\n // If we have client view, we should have the flat view\n assert(!!this.partialLengths, 0x059 /* \"Client view exists but flat view does not!\" */);\n const flatCount = this.verifyPartialLengths(this.partialLengths, false);\n\n // The number of partial lengths on the client view and flat view should be the same\n assert(flatCount === cliCount,\n 0x05a /* \"Mismatch between number of partial lengths on client and flat views!\" */);\n } else {\n // If we don't have a client view, we shouldn't have the flat view either\n assert(!this.partialLengths, 0x05b /* \"Flat view exists but client view does not!\" */);\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"partialLengths.js","sourceRoot":"","sources":["../src/partialLengths.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { assert } from \"@fluidframework/common-utils\";\nimport { Property } from \"./base\";\nimport { RedBlackTree } from \"./collections\";\nimport { UnassignedSequenceNumber } from \"./constants\";\nimport {\n CollaborationWindow,\n compareNumbers,\n IMergeBlock,\n IRemovalInfo,\n ISegment,\n MergeTree,\n} from \"./mergeTree\";\n\ninterface IOverlapClient {\n clientId: number;\n seglen: number;\n}\n\n/**\n * Returns the partial length whose sequence number is\n * the greatest sequence number within a that is\n * less than or equal to key.\n * @param a - array of partial segment lengths\n * @param key - sequence number\n */\nfunction latestLEQ(a: PartialSequenceLength[], key: number) {\n let best = -1;\n let lo = 0;\n let hi = a.length - 1;\n while (lo <= hi) {\n const mid = lo + Math.floor((hi - lo) / 2);\n if (a[mid].seq <= key) {\n if ((best < 0) || (a[best].seq < a[mid].seq)) {\n best = mid;\n }\n lo = mid + 1;\n } else {\n hi = mid - 1;\n }\n }\n return best;\n}\n\nexport interface PartialSequenceLength {\n seq: number;\n len: number;\n seglen: number;\n clientId?: number;\n overlapRemoveClients?: RedBlackTree<number, IOverlapClient>;\n}\n\n/**\n * Keep track of partial sums of segment lengths for all sequence numbers\n * in the current collaboration window (if any). Only used during active\n * collaboration.\n */\nexport class PartialSequenceLengths {\n public static options = {\n verify: false,\n zamboni: true,\n };\n\n public static combine(mergeTree: MergeTree, block: IMergeBlock, collabWindow: CollaborationWindow, recur = false) {\n return PartialSequenceLengths.combineBranch(mergeTree, block, collabWindow, recur);\n }\n\n /**\n * Combine the partial lengths of block's children\n * @param block - an interior node; it is assumed that each interior node child of this block\n * has its partials up to date\n * @param collabWindow - segment window of the segment tree containing textSegmentBlock\n */\n private static combineBranch(\n mergeTree: MergeTree,\n block: IMergeBlock,\n collabWindow: CollaborationWindow,\n recur = false) {\n let combinedPartialLengths = new PartialSequenceLengths(collabWindow.minSeq);\n PartialSequenceLengths.fromLeaves(mergeTree, combinedPartialLengths, block, collabWindow);\n let prevPartial: PartialSequenceLength | undefined;\n\n function cloneOverlapRemoveClients(oldTree: RedBlackTree<number, IOverlapClient> | undefined) {\n if (!oldTree) { return undefined; }\n const newTree = new RedBlackTree<number, IOverlapClient>(compareNumbers);\n oldTree.map((bProp: Property<number, IOverlapClient>) => {\n newTree.put(bProp.data.clientId, { ...bProp.data });\n return true;\n });\n return newTree;\n }\n\n function combineOverlapClients(a: PartialSequenceLength, b: PartialSequenceLength) {\n const overlapRemoveClientsA = a.overlapRemoveClients;\n if (overlapRemoveClientsA) {\n if (b.overlapRemoveClients) {\n b.overlapRemoveClients.map((bProp: Property<number, IOverlapClient>) => {\n const aProp = overlapRemoveClientsA.get(bProp.key);\n if (aProp) {\n aProp.data.seglen += bProp.data.seglen;\n } else {\n overlapRemoveClientsA.put(bProp.data.clientId, { ...bProp.data });\n }\n return true;\n });\n }\n } else {\n a.overlapRemoveClients = cloneOverlapRemoveClients(b.overlapRemoveClients);\n }\n }\n\n function addNext(partialLength: PartialSequenceLength) {\n const seq = partialLength.seq;\n let pLen = 0;\n\n if (prevPartial) {\n if (prevPartial.seq === partialLength.seq) {\n prevPartial.seglen += partialLength.seglen;\n prevPartial.len += partialLength.seglen;\n combineOverlapClients(prevPartial, partialLength);\n return;\n } else {\n pLen = prevPartial.len;\n // Previous sequence number is finished\n combinedPartialLengths.addClientSeqNumberFromPartial(prevPartial);\n }\n }\n prevPartial = {\n clientId: partialLength.clientId,\n len: pLen + partialLength.seglen,\n overlapRemoveClients: cloneOverlapRemoveClients(partialLength.overlapRemoveClients),\n seglen: partialLength.seglen,\n seq,\n };\n combinedPartialLengths.partialLengths.push(prevPartial);\n }\n\n const childPartials: PartialSequenceLengths[] = [];\n for (let i = 0; i < block.childCount; i++) {\n const child = block.children[i];\n if (!child.isLeaf()) {\n const childBlock = child;\n if (recur) {\n childBlock.partialLengths =\n PartialSequenceLengths.combine(mergeTree, childBlock, collabWindow, true);\n }\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n childPartials.push(childBlock.partialLengths!);\n }\n }\n let childPartialsLen = childPartials.length;\n if (childPartialsLen !== 0) {\n // Some children are interior nodes\n if (combinedPartialLengths.partialLengths.length > 0) {\n // Some children were leaves; add combined partials from these segments\n childPartials.push(combinedPartialLengths);\n childPartialsLen++;\n combinedPartialLengths = new PartialSequenceLengths(collabWindow.minSeq);\n }\n const indices = new Array<number>(childPartialsLen);\n const childPartialsCounts = new Array<number>(childPartialsLen);\n for (let i = 0; i < childPartialsLen; i++) {\n indices[i] = 0;\n childPartialsCounts[i] = childPartials[i].partialLengths.length;\n combinedPartialLengths.minLength += childPartials[i].minLength;\n combinedPartialLengths.segmentCount += childPartials[i].segmentCount;\n }\n let outerIndexOfEarliest = 0;\n let earliestPartialLength: PartialSequenceLength;\n while (outerIndexOfEarliest >= 0) {\n outerIndexOfEarliest = -1;\n for (let k = 0; k < childPartialsLen; k++) {\n // Find next earliest sequence number\n if (indices[k] < childPartialsCounts[k]) {\n const cpLen = childPartials[k].partialLengths[indices[k]];\n // eslint-disable-next-line max-len\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion, @typescript-eslint/no-unnecessary-type-assertion\n if ((outerIndexOfEarliest < 0) || (cpLen.seq < earliestPartialLength!.seq)) {\n outerIndexOfEarliest = k;\n earliestPartialLength = cpLen;\n }\n }\n }\n if (outerIndexOfEarliest >= 0) {\n // eslint-disable-next-line max-len\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion, @typescript-eslint/no-unnecessary-type-assertion\n addNext(earliestPartialLength!);\n indices[outerIndexOfEarliest]++;\n }\n }\n // Add client entry for last partial, if any\n if (prevPartial) {\n combinedPartialLengths.addClientSeqNumberFromPartial(prevPartial);\n }\n }\n // TODO: incremental zamboni during build\n // console.log(combinedPartialLengths.toString());\n // console.log(`ZZZ...(min ${segmentWindow.minSeq})`);\n if (PartialSequenceLengths.options.zamboni) {\n combinedPartialLengths.zamboni(collabWindow);\n }\n\n if (PartialSequenceLengths.options.verify) {\n combinedPartialLengths.verify();\n }\n\n // console.log(combinedPartialLengths.toString());\n return combinedPartialLengths;\n }\n\n private static fromLeaves(\n mergeTree: MergeTree, combinedPartialLengths: PartialSequenceLengths,\n block: IMergeBlock, collabWindow: CollaborationWindow) {\n combinedPartialLengths.minLength = 0;\n combinedPartialLengths.segmentCount = block.childCount;\n\n function seqLTE(seq: number, minSeq: number) {\n return (seq !== UnassignedSequenceNumber) && (seq <= minSeq);\n }\n\n for (let i = 0; i < block.childCount; i++) {\n const child = block.children[i];\n if (child.isLeaf()) {\n // Leaf segment\n const segment = child;\n // eslint-disable-next-line max-len\n // console.log(`seg br ${segBranchId} cli ${glc(mergeTree, segment.clientId)} me ${glc(mergeTree, mergeTree.collabWindow.clientId)}`);\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n if (seqLTE(segment.seq!, collabWindow.minSeq)) {\n combinedPartialLengths.minLength += segment.cachedLength;\n } else {\n if (segment.seq !== UnassignedSequenceNumber) {\n PartialSequenceLengths.insertSegment(combinedPartialLengths, segment);\n }\n }\n const removalInfo: IRemovalInfo = segment;\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n if (seqLTE(removalInfo.removedSeq!, collabWindow.minSeq)) {\n combinedPartialLengths.minLength -= segment.cachedLength;\n } else {\n if ((removalInfo.removedSeq !== undefined) &&\n (removalInfo.removedSeq !== UnassignedSequenceNumber)) {\n PartialSequenceLengths.insertSegment(\n combinedPartialLengths,\n segment,\n removalInfo);\n }\n }\n }\n }\n // Post-process correctly-ordered partials computing sums and creating\n // lists for each present client id\n const seqPartials = combinedPartialLengths.partialLengths;\n const seqPartialsLen = seqPartials.length;\n\n let prevLen = 0;\n for (let i = 0; i < seqPartialsLen; i++) {\n seqPartials[i].len = prevLen + seqPartials[i].seglen;\n prevLen = seqPartials[i].len;\n combinedPartialLengths.addClientSeqNumberFromPartial(seqPartials[i]);\n }\n if (PartialSequenceLengths.options.verify) {\n combinedPartialLengths.verify();\n }\n }\n\n private static getOverlapClients(overlapClientids: number[], seglen: number) {\n const bst = new RedBlackTree<number, IOverlapClient>(compareNumbers);\n for (const clientId of overlapClientids) {\n bst.put(clientId, { clientId, seglen });\n }\n return bst;\n }\n\n private static accumulateRemoveClientOverlap(\n partialLength: PartialSequenceLength,\n overlapRemoveClientIds: number[],\n seglen: number) {\n if (partialLength.overlapRemoveClients) {\n for (const clientId of overlapRemoveClientIds) {\n const ovlapClientNode = partialLength.overlapRemoveClients.get(clientId);\n if (!ovlapClientNode) {\n partialLength.overlapRemoveClients.put(clientId, { clientId, seglen });\n } else {\n ovlapClientNode.data.seglen += seglen;\n }\n }\n } else {\n partialLength.overlapRemoveClients =\n PartialSequenceLengths.getOverlapClients(overlapRemoveClientIds, seglen);\n }\n }\n\n private static insertSegment(\n combinedPartialLengths: PartialSequenceLengths,\n segment: ISegment,\n removalInfo?: IRemovalInfo) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n let seq = segment.seq!;\n let segmentLen = segment.cachedLength;\n let clientId = segment.clientId;\n let removeClientOverlap: number[] | undefined;\n\n if (removalInfo) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n seq = removalInfo.removedSeq!;\n segmentLen = -segmentLen;\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n clientId = removalInfo.removedClientId!;\n if (removalInfo.removedClientOverlap) {\n removeClientOverlap = removalInfo.removedClientOverlap;\n }\n }\n\n const seqPartials = combinedPartialLengths.partialLengths;\n const seqPartialsLen = seqPartials.length;\n // Find the first entry with sequence number greater or equal to seq\n let indexFirstGTE = 0;\n for (; indexFirstGTE < seqPartialsLen; indexFirstGTE++) {\n if (seqPartials[indexFirstGTE].seq >= seq) {\n break;\n }\n }\n if ((indexFirstGTE < seqPartialsLen) && (seqPartials[indexFirstGTE].seq === seq)) {\n seqPartials[indexFirstGTE].seglen += segmentLen;\n if (removeClientOverlap) {\n PartialSequenceLengths.accumulateRemoveClientOverlap(\n seqPartials[indexFirstGTE],\n removeClientOverlap,\n segmentLen);\n }\n } else {\n let pLen: PartialSequenceLength;\n if (removeClientOverlap) {\n const overlapClients = PartialSequenceLengths.getOverlapClients(removeClientOverlap, segmentLen);\n pLen = { seq, clientId, len: 0, seglen: segmentLen, overlapRemoveClients: overlapClients };\n } else {\n pLen = { seq, clientId, len: 0, seglen: segmentLen };\n }\n\n if (indexFirstGTE < seqPartialsLen) {\n // Shift entries with greater sequence numbers\n // TODO: investigate performance improvement using BST\n for (let k = seqPartialsLen; k > indexFirstGTE; k--) {\n seqPartials[k] = seqPartials[k - 1];\n }\n seqPartials[indexFirstGTE] = pLen;\n } else {\n seqPartials.push(pLen);\n }\n }\n }\n\n private static addSeq(partialLengths: PartialSequenceLength[], seq: number, seqSeglen: number, clientId?: number) {\n let seqPartialLen: PartialSequenceLength | undefined;\n let penultPartialLen: PartialSequenceLength | undefined;\n let leqIndex = latestLEQ(partialLengths, seq);\n if (leqIndex >= 0) {\n const pLen = partialLengths[leqIndex];\n if (pLen.seq === seq) {\n seqPartialLen = pLen;\n leqIndex = latestLEQ(partialLengths, seq - 1);\n if (leqIndex >= 0) {\n penultPartialLen = partialLengths[leqIndex];\n }\n } else {\n penultPartialLen = pLen;\n }\n }\n if (seqPartialLen === undefined) {\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n seqPartialLen = {\n clientId,\n seglen: seqSeglen,\n seq,\n } as PartialSequenceLength;\n partialLengths.push(seqPartialLen);\n } else {\n seqPartialLen.seglen = seqSeglen;\n // Assert client id matches\n }\n if (penultPartialLen !== undefined) {\n seqPartialLen.len = seqPartialLen.seglen + penultPartialLen.len;\n } else {\n seqPartialLen.len = seqPartialLen.seglen;\n }\n }\n public minLength = 0;\n public segmentCount = 0;\n public partialLengths: PartialSequenceLength[] = [];\n public clientSeqNumbers: PartialSequenceLength[][] = [];\n\n constructor(public minSeq: number) {\n }\n\n // Assume: seq is latest sequence number; no structural change to sub-tree, but a segment\n // with sequence number seq has been added within the sub-tree\n // TODO: assert client id matches\n public update(\n mergeTree: MergeTree,\n node: IMergeBlock,\n seq: number,\n clientId: number,\n collabWindow: CollaborationWindow) {\n let seqSeglen = 0;\n let segCount = 0;\n // Compute length for seq across children\n for (let i = 0; i < node.childCount; i++) {\n const child = node.children[i];\n if (!child.isLeaf()) {\n const childBlock = child;\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const branchPartialLengths = childBlock.partialLengths!;\n const partialLengths = branchPartialLengths.partialLengths;\n const seqIndex = latestLEQ(partialLengths, seq);\n if (seqIndex >= 0) {\n const leqPartial = partialLengths[seqIndex];\n if (leqPartial.seq === seq) {\n seqSeglen += leqPartial.seglen;\n }\n }\n segCount += branchPartialLengths.segmentCount;\n } else {\n const segment = child;\n const removalInfo: IRemovalInfo = segment;\n\n if (segment.seq === seq) {\n if (removalInfo.removedSeq !== seq) {\n seqSeglen += segment.cachedLength;\n }\n } else {\n if (removalInfo.removedSeq === seq) {\n seqSeglen -= segment.cachedLength;\n }\n }\n segCount++;\n }\n }\n this.segmentCount = segCount;\n\n PartialSequenceLengths.addSeq(this.partialLengths, seq, seqSeglen, clientId);\n if (this.clientSeqNumbers[clientId] === undefined) {\n this.clientSeqNumbers[clientId] = [];\n }\n PartialSequenceLengths.addSeq(this.clientSeqNumbers[clientId], seq, seqSeglen);\n // console.log(this.toString());\n if (PartialSequenceLengths.options.zamboni) {\n this.zamboni(collabWindow);\n }\n if (PartialSequenceLengths.options.verify) {\n this.verify();\n }\n // console.log('ZZZ');\n // console.log(this.toString());\n }\n\n public getPartialLength(refSeq: number, clientId: number) {\n let pLen = this.minLength;\n const seqIndex = latestLEQ(this.partialLengths, refSeq);\n const cliLatestindex = this.cliLatest(clientId);\n const cliSeq = this.clientSeqNumbers[clientId];\n if (seqIndex >= 0) {\n // Add the partial length up to refSeq\n pLen += this.partialLengths[seqIndex].len;\n\n if (cliLatestindex >= 0) {\n const cliLatest = cliSeq[cliLatestindex];\n\n if (cliLatest.seq > refSeq) {\n // The client has local edits after refSeq, add in the length adjustments\n pLen += cliLatest.len;\n const precedingCliIndex = this.cliLatestLEQ(clientId, refSeq);\n if (precedingCliIndex >= 0) {\n pLen -= cliSeq[precedingCliIndex].len;\n }\n }\n }\n } else {\n // RefSeq is before any of the partial lengths\n // so just add in all local edits of that client (which should all be after the refSeq)\n if (cliLatestindex >= 0) {\n const cliLatest = cliSeq[cliLatestindex];\n pLen += cliLatest.len;\n }\n }\n return pLen;\n }\n\n public toString(glc?: (id: number) => string, indentCount = 0) {\n let buf = \"\";\n for (const partial of this.partialLengths) {\n buf += `(${partial.seq},${partial.len}) `;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-for-in-array, no-restricted-syntax\n for (const clientId in this.clientSeqNumbers) {\n if (this.clientSeqNumbers[clientId].length > 0) {\n buf += `Client `;\n if (glc) {\n buf += `${glc(+clientId)}`;\n } else {\n buf += `${clientId}`;\n }\n buf += \"[\";\n for (const partial of this.clientSeqNumbers[clientId]) {\n buf += `(${partial.seq},${partial.len})`;\n }\n buf += \"]\";\n }\n }\n buf = `min(seq ${this.minSeq}): ${this.minLength}; sc: ${this.segmentCount};${buf}`;\n return buf;\n }\n\n // Clear away partial sums for sequence numbers earlier than the current window\n private zamboni(segmentWindow: CollaborationWindow) {\n function copyDown(partialLengths: PartialSequenceLength[]) {\n const mindex = latestLEQ(partialLengths, segmentWindow.minSeq);\n let minLength = 0;\n // console.log(`mindex ${mindex}`);\n if (mindex >= 0) {\n minLength = partialLengths[mindex].len;\n const seqCount = partialLengths.length;\n if (mindex <= (seqCount - 1)) {\n // Still some entries remaining\n const remainingCount = (seqCount - mindex) - 1;\n // Copy down\n for (let i = 0; i < remainingCount; i++) {\n partialLengths[i] = partialLengths[i + mindex + 1];\n partialLengths[i].len -= minLength;\n }\n partialLengths.length = remainingCount;\n }\n }\n return minLength;\n }\n this.minLength += copyDown(this.partialLengths);\n // eslint-disable-next-line @typescript-eslint/no-for-in-array, guard-for-in, no-restricted-syntax\n for (const clientId in this.clientSeqNumbers) {\n const cliPartials = this.clientSeqNumbers[clientId];\n if (cliPartials) {\n copyDown(cliPartials);\n }\n }\n }\n\n private addClientSeqNumber(clientId: number, seq: number, seglen: number) {\n if (this.clientSeqNumbers[clientId] === undefined) {\n this.clientSeqNumbers[clientId] = [];\n }\n const cli = this.clientSeqNumbers[clientId];\n let pLen = seglen;\n if (cli.length > 0) {\n pLen += cli[cli.length - 1].len;\n }\n cli.push({ seq, len: pLen, seglen });\n }\n\n // Assumes sequence number already coalesced\n private addClientSeqNumberFromPartial(partialLength: PartialSequenceLength) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n this.addClientSeqNumber(partialLength.clientId!, partialLength.seq, partialLength.seglen);\n if (partialLength.overlapRemoveClients) {\n partialLength.overlapRemoveClients.map((oc: Property<number, IOverlapClient>) => {\n this.addClientSeqNumber(oc.data.clientId, partialLength.seq, oc.data.seglen);\n return true;\n });\n }\n }\n\n private cliLatestLEQ(clientId: number, refSeq: number) {\n const cliSeqs = this.clientSeqNumbers[clientId];\n if (cliSeqs) {\n return latestLEQ(cliSeqs, refSeq);\n } else {\n return -1;\n }\n }\n\n private cliLatest(clientId: number) {\n const cliSeqs = this.clientSeqNumbers[clientId];\n if (cliSeqs && (cliSeqs.length > 0)) {\n return cliSeqs.length - 1;\n } else {\n return -1;\n }\n }\n\n // Debug only\n private verifyPartialLengths(partialLengths: PartialSequenceLength[], clientPartials: boolean) {\n if (partialLengths.length === 0) { return 0; }\n\n let lastSeqNum = 0;\n let accumSegLen = 0;\n let count = 0;\n\n for (const partialLength of partialLengths) {\n // Count total number of partial length\n count++;\n\n // Sequence number should be larger or equal to minseq\n assert(this.minSeq <= partialLength.seq, 0x054 /* \"Sequence number less than minSeq!\" */);\n\n // Sequence number should be sorted\n assert(lastSeqNum < partialLength.seq, 0x055 /* \"Sequence number is not sorted!\" */);\n lastSeqNum = partialLength.seq;\n\n // Len is a accumulation of all the seglen adjustments\n accumSegLen += partialLength.seglen;\n if (accumSegLen !== partialLength.len) {\n assert(false, 0x056 /* \"Unexpected total for accumulation of all seglen adjustments!\" */);\n }\n\n if (clientPartials) {\n // Client partials used to track local edits so we can account for them some refSeq.\n // But the information we keep track of are since minSeq, so we keep track of more history\n // then needed, and some of them doesn't make sense to be used for length calculations\n // e.g. if you have this sequence, where the minSeq is #5 because of other clients\n // seq 10: client 1: insert seg #1\n // seq 11: client 2: delete seg #2 refseq: 10\n // minLength is 0, we would have keep a record of seglen: -1 for clientPartialLengths for client 2\n // So if you ask for partial length for client 2 @ seq 5, we will have return -1.\n // However, that combination is invalid, since we should never see any ops with refseq < 10 for\n // client 2 after seq 11.\n } else {\n // Len adjustment should not make length negative\n if (this.minLength + partialLength.len < 0) {\n assert(false, 0x057 /* \"Negative length after length adjustment!\" */);\n }\n }\n\n if (partialLength.overlapRemoveClients) {\n // Only the flat partialLengths can have overlapRemoveClients, the per client view shouldn't\n assert(!clientPartials, 0x058 /* \"Both overlapRemoveClients and clientPartials are set!\" */);\n\n // Each overlap client count as one\n count += partialLength.overlapRemoveClients.size();\n }\n }\n return count;\n }\n\n private verify() {\n if (this.clientSeqNumbers) {\n let cliCount = 0;\n for (const cliSeq of this.clientSeqNumbers) {\n if (cliSeq) {\n cliCount += this.verifyPartialLengths(cliSeq, true);\n }\n }\n\n // If we have client view, we should have the flat view\n assert(!!this.partialLengths, 0x059 /* \"Client view exists but flat view does not!\" */);\n const flatCount = this.verifyPartialLengths(this.partialLengths, false);\n\n // The number of partial lengths on the client view and flat view should be the same\n assert(flatCount === cliCount,\n 0x05a /* \"Mismatch between number of partial lengths on client and flat views!\" */);\n } else {\n // If we don't have a client view, we shouldn't have the flat view either\n assert(!this.partialLengths, 0x05b /* \"Flat view exists but client view does not!\" */);\n }\n }\n}\n"]}
|
package/lib/snapshotChunks.d.ts
CHANGED
|
@@ -2,7 +2,8 @@
|
|
|
2
2
|
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
3
|
* Licensed under the MIT License.
|
|
4
4
|
*/
|
|
5
|
-
import {
|
|
5
|
+
import { IFluidHandle } from "@fluidframework/core-interfaces";
|
|
6
|
+
import { IFluidSerializer } from "@fluidframework/shared-object-base";
|
|
6
7
|
import { ITelemetryLogger } from "@fluidframework/common-definitions";
|
|
7
8
|
import { PropertySet } from "./properties";
|
|
8
9
|
import { IJSONSegment } from "./ops";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"snapshotChunks.d.ts","sourceRoot":"","sources":["../src/snapshotChunks.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,
|
|
1
|
+
{"version":3,"file":"snapshotChunks.d.ts","sourceRoot":"","sources":["../src/snapshotChunks.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAC/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AACtE,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AACtE,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C,OAAO,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAErC,MAAM,WAAW,uBAAuB;IACpC,OAAO,EAAE,SAAS,GAAG,GAAG,CAAC;CAC5B;AAED,oBAAY,gBAAgB,GAAG,YAAY,GAAG,yBAAyB,CAAC;AAExE,MAAM,WAAW,oBAAqB,SAAQ,uBAAuB;IACjE,OAAO,EAAE,SAAS,CAAC;IACnB,sBAAsB,EAAE,MAAM,CAAC;IAC/B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,gBAAgB,EAAE,MAAM,CAAC;IACzB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,YAAY,EAAE,gBAAgB,EAAE,CAAC;IACjC,cAAc,CAAC,EAAE,uBAAuB,CAAC;CAC5C;AAED,MAAM,WAAW,4BAA4B;IACzC,EAAE,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,uBAAuB;IACpC,WAAW,EAAE,MAAM,CAAC;IACpB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,oBAAoB,EAAE,4BAA4B,EAAE,CAAC;IACrD,cAAc,EAAE,MAAM,CAAC;IACvB,iBAAiB,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,gBAAiB,SAAQ,uBAAuB;IAC7D,OAAO,EAAE,GAAG,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,gBAAgB,EAAE,CAAC;IAC7B,cAAc,EAAE,uBAAuB,GAAG,SAAS,CAAC;CACvD;AAED;;;;;GAKG;AACH,MAAM,WAAW,yBAAyB;IACtC,IAAI,EAAE,YAAY,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,YAAY,GAAG,yBAAyB,GAAG,IAAI,IAAI,yBAAyB,CAE9G;AAED,wBAAgB,8BAA8B,CAC1C,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,uBAAuB,EAC9B,MAAM,EAAE,gBAAgB,EACxB,OAAO,EAAE,WAAW,GAAG,SAAS,EAChC,UAAU,EAAE,gBAAgB,EAC5B,IAAI,EAAE,YAAY,UAuCrB;AAED,wBAAgB,8BAA8B,CAC1C,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,uBAAuB,EAC9B,MAAM,EAAE,gBAAgB,EACxB,OAAO,EAAE,WAAW,GAAG,SAAS,EAChC,UAAU,EAAE,gBAAgB,EAC5B,IAAI,EAAE,YAAY,UAGrB;AAED,wBAAgB,eAAe,CAC3B,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,uBAAuB,EAC9B,MAAM,EAAE,gBAAgB,EACxB,OAAO,EAAE,WAAW,GAAG,SAAS,GAAG,gBAAgB,CAmBtD"}
|