@b9g/revise 0.1.1 → 0.1.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/README.md +67 -2
- package/_subseq.d.ts +18 -0
- package/contentarea.cjs +325 -412
- package/contentarea.cjs.map +1 -1
- package/contentarea.d.ts +29 -47
- package/contentarea.js +325 -412
- package/contentarea.js.map +1 -1
- package/edit.cjs +447 -187
- package/edit.cjs.map +1 -1
- package/edit.d.ts +71 -26
- package/edit.js +447 -187
- package/edit.js.map +1 -1
- package/history.cjs +3 -0
- package/history.cjs.map +1 -1
- package/history.d.ts +1 -1
- package/history.js +3 -0
- package/history.js.map +1 -1
- package/keyer.cjs +5 -7
- package/keyer.cjs.map +1 -1
- package/keyer.d.ts +1 -1
- package/keyer.js +5 -7
- package/keyer.js.map +1 -1
- package/package.json +16 -42
- package/subseq.cjs +0 -251
- package/subseq.cjs.map +0 -1
- package/subseq.d.ts +0 -62
- package/subseq.js +0 -248
- package/subseq.js.map +0 -1
package/edit.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"edit.cjs","sources":["../src/edit.ts"],"sourcesContent":["import {Subseq} from \"./subseq\";\n\nexport interface RetainOperation {\n\ttype: \"retain\";\n\tstart: number;\n\tend: number;\n}\n\nexport interface DeleteOperation {\n\ttype: \"delete\";\n\tstart: number;\n\tend: number;\n\tvalue: string | undefined;\n}\n\nexport interface InsertOperation {\n\ttype: \"insert\";\n\tstart: number;\n\tvalue: string;\n}\n\nexport type Operation = RetainOperation | DeleteOperation | InsertOperation;\n\n/**\n * A data structure which represents edits to strings.\n */\nexport class Edit {\n\t/** An array of strings and numbers representing operations. */\n\tparts: Array<string | number>;\n\n\t/**\n\t * A string which represents a concatenation of all deletions.\n\t *\n\t * This property must be provided if you want to invert the edit.\n\t */\n\tdeleted: string | undefined;\n\n\tconstructor(parts: Array<string | number>, deleted?: string) {\n\t\tthis.parts = parts;\n\t\tthis.deleted = deleted;\n\t}\n\n\tstatic synthesize(\n\t\tinsertSeq: Subseq,\n\t\tinserted: string,\n\t\tdeleteSeq: Subseq,\n\t\tdeleted?: string | undefined,\n\t): Edit {\n\t\tif (insertSeq.includedSize !== inserted.length) {\n\t\t\tthrow new Error(\"insertSeq and inserted string do not match in length\");\n\t\t} else if (\n\t\t\tdeleted !== undefined &&\n\t\t\tdeleteSeq.includedSize !== deleted.length\n\t\t) {\n\t\t\tthrow new Error(\"deleteSeq and deleted string do not match in length\");\n\t\t} else if (deleteSeq.size !== insertSeq.excludedSize) {\n\t\t\tthrow new Error(\"deleteSeq and insertSeq do not match in length\");\n\t\t}\n\n\t\tconst parts: Array<string | number> = [];\n\t\tlet insertIndex = 0;\n\t\tlet retainIndex = 0;\n\t\tlet needsLength = true;\n\t\tfor (const [length, deleting, inserting] of deleteSeq\n\t\t\t.expand(insertSeq)\n\t\t\t.align(insertSeq)) {\n\t\t\tif (inserting) {\n\t\t\t\tparts.push(inserted.slice(insertIndex, insertIndex + length));\n\t\t\t\tinsertIndex += length;\n\t\t\t} else {\n\t\t\t\tif (!deleting) {\n\t\t\t\t\tparts.push(retainIndex, retainIndex + length);\n\t\t\t\t}\n\n\t\t\t\tretainIndex += length;\n\t\t\t\tneedsLength = deleting;\n\t\t\t}\n\t\t}\n\n\t\tif (needsLength) {\n\t\t\tparts.push(retainIndex);\n\t\t}\n\n\t\treturn new Edit(parts, deleted);\n\t}\n\n\tstatic build(\n\t\ttext: string,\n\t\tinserted: string,\n\t\tfrom: number,\n\t\tto: number = from,\n\t): Edit {\n\t\tconst insertSizes: Array<number> = [];\n\t\tSubseq.pushSegment(insertSizes, from, false);\n\t\tSubseq.pushSegment(insertSizes, inserted.length, true);\n\t\tSubseq.pushSegment(insertSizes, to - from, false);\n\t\tSubseq.pushSegment(insertSizes, text.length - to, false);\n\t\tconst deleteSizes: Array<number> = [];\n\t\tSubseq.pushSegment(deleteSizes, from, false);\n\t\tSubseq.pushSegment(deleteSizes, to - from, true);\n\t\tSubseq.pushSegment(deleteSizes, text.length - to, false);\n\t\tconst deleted = text.slice(from, to);\n\t\treturn Edit.synthesize(\n\t\t\tnew Subseq(insertSizes),\n\t\t\tinserted,\n\t\t\tnew Subseq(deleteSizes),\n\t\t\tdeleted,\n\t\t);\n\t}\n\n\t/**\n\t * Given two strings, this method finds an edit which can be applied to the\n\t * first string to result in the second.\n\t * An optional hint can be provided to disambiguate edits when they are made\n\t * to overlapping characters.\n\t */\n\tstatic diff(text1: string, text2: string, hint?: number): Edit {\n\t\tlet prefix = commonPrefixLength(text1, text2);\n\t\tlet suffix = commonSuffixLength(text1, text2);\n\t\t// prefix and suffix overlap when edits are runs of the same character.\n\t\tif (prefix + suffix > Math.min(text1.length, text2.length)) {\n\t\t\tif (hint !== undefined && hint > -1) {\n\t\t\t\tprefix = Math.min(prefix, hint);\n\t\t\t}\n\n\t\t\t// TODO: We can probably avoid the commonSuffixLength() call here in\n\t\t\t// favor of arithmetic but I’m too dumb to figure it out.\n\t\t\tsuffix = commonSuffixLength(text1.slice(prefix), text2.slice(prefix));\n\t\t}\n\n\t\treturn Edit.build(\n\t\t\ttext1,\n\t\t\ttext2.slice(prefix, text2.length - suffix),\n\t\t\tprefix,\n\t\t\ttext1.length - suffix,\n\t\t);\n\t}\n\n\t/**\n\t * A string which represents a concatenation of all insertions.\n\t */\n\tget inserted(): string {\n\t\tlet text = \"\";\n\t\tfor (let i = 0; i < this.parts.length; i++) {\n\t\t\tif (typeof this.parts[i] === \"string\") {\n\t\t\t\ttext += this.parts[i];\n\t\t\t}\n\t\t}\n\n\t\treturn text;\n\t}\n\n\toperations(): Array<Operation> {\n\t\tconst operations: Array<Operation> = [];\n\t\tlet retaining = false;\n\t\tlet index = 0;\n\t\tlet deleteStart = 0;\n\t\tfor (let i = 0; i < this.parts.length; i++) {\n\t\t\tconst part = this.parts[i];\n\t\t\tif (typeof part === \"number\") {\n\t\t\t\tif (part < index) {\n\t\t\t\t\tthrow new TypeError(\"Malformed edit\");\n\t\t\t\t} else if (part > index) {\n\t\t\t\t\tif (retaining) {\n\t\t\t\t\t\toperations.push({type: \"retain\", start: index, end: part});\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst value =\n\t\t\t\t\t\t\ttypeof this.deleted === \"undefined\"\n\t\t\t\t\t\t\t\t? undefined\n\t\t\t\t\t\t\t\t: this.deleted.slice(deleteStart, part);\n\t\t\t\t\t\toperations.push({\n\t\t\t\t\t\t\ttype: \"delete\",\n\t\t\t\t\t\t\tstart: index,\n\t\t\t\t\t\t\tend: part,\n\t\t\t\t\t\t\tvalue,\n\t\t\t\t\t\t});\n\t\t\t\t\t\tdeleteStart = part;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tindex = part;\n\t\t\t\tretaining = !retaining;\n\t\t\t} else {\n\t\t\t\toperations.push({type: \"insert\", start: index, value: part});\n\t\t\t}\n\t\t}\n\n\t\treturn operations;\n\t}\n\n\t// TODO: I’m not too happy about the name of this method, insofar as it might\n\t// imply that this object is callable.\n\tapply(text: string): string {\n\t\tlet text1 = \"\";\n\t\tconst operations = this.operations();\n\t\tfor (let i = 0; i < operations.length; i++) {\n\t\t\tconst op = operations[i];\n\t\t\tswitch (op.type) {\n\t\t\t\tcase \"retain\":\n\t\t\t\t\ttext1 += text.slice(op.start, op.end);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"insert\":\n\t\t\t\t\ttext1 += op.value;\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\treturn text1;\n\t}\n\n\tfactor(): [Subseq, string, Subseq, string | undefined] {\n\t\tconst insertSizes: Array<number> = [];\n\t\tconst deleteSizes: Array<number> = [];\n\t\tlet inserted = \"\";\n\t\tconst operations = this.operations();\n\t\tfor (let i = 0; i < operations.length; i++) {\n\t\t\tconst op = operations[i];\n\t\t\tswitch (op.type) {\n\t\t\t\tcase \"retain\": {\n\t\t\t\t\tconst length = op.end - op.start;\n\t\t\t\t\tSubseq.pushSegment(insertSizes, length, false);\n\t\t\t\t\tSubseq.pushSegment(deleteSizes, length, false);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase \"delete\": {\n\t\t\t\t\tconst length = op.end - op.start;\n\t\t\t\t\tSubseq.pushSegment(insertSizes, length, false);\n\t\t\t\t\tSubseq.pushSegment(deleteSizes, length, true);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase \"insert\":\n\t\t\t\t\tSubseq.pushSegment(insertSizes, op.value.length, true);\n\t\t\t\t\tinserted += op.value;\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new TypeError(\"Invalid operation type\");\n\t\t\t}\n\t\t}\n\n\t\tconst insertSeq = new Subseq(insertSizes);\n\t\tconst deleteSeq = new Subseq(deleteSizes);\n\t\treturn [insertSeq, inserted, deleteSeq, this.deleted];\n\t}\n\n\tnormalize(): Edit {\n\t\tif (typeof this.deleted === \"undefined\") {\n\t\t\tthrow new Error(\"Missing deleted property\");\n\t\t}\n\n\t\tconst insertSizes: Array<number> = [];\n\t\tconst deleteSizes: Array<number> = [];\n\t\tlet inserted = \"\";\n\t\tlet deleted = \"\";\n\t\tlet prevInserted: string | undefined;\n\t\tconst operations = this.operations();\n\t\tfor (let i = 0; i < operations.length; i++) {\n\t\t\tconst op = operations[i];\n\t\t\tswitch (op.type) {\n\t\t\t\tcase \"insert\": {\n\t\t\t\t\tprevInserted = op.value;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tcase \"retain\": {\n\t\t\t\t\tif (prevInserted !== undefined) {\n\t\t\t\t\t\tSubseq.pushSegment(insertSizes, prevInserted.length, true);\n\t\t\t\t\t\tinserted += prevInserted;\n\t\t\t\t\t\tprevInserted = undefined;\n\t\t\t\t\t}\n\n\t\t\t\t\tSubseq.pushSegment(insertSizes, op.end - op.start, false);\n\t\t\t\t\tSubseq.pushSegment(deleteSizes, op.end - op.start, false);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tcase \"delete\": {\n\t\t\t\t\tconst length = op.end - op.start;\n\t\t\t\t\tlet prefix = 0;\n\t\t\t\t\tif (prevInserted !== undefined) {\n\t\t\t\t\t\tprefix = commonPrefixLength(prevInserted, op.value!);\n\t\t\t\t\t\tSubseq.pushSegment(insertSizes, prefix, false);\n\t\t\t\t\t\tSubseq.pushSegment(insertSizes, prevInserted.length - prefix, true);\n\t\t\t\t\t\tinserted += prevInserted.slice(prefix);\n\t\t\t\t\t\tprevInserted = undefined;\n\t\t\t\t\t}\n\n\t\t\t\t\tdeleted += op.value!.slice(prefix);\n\t\t\t\t\tSubseq.pushSegment(deleteSizes, prefix, false);\n\t\t\t\t\tSubseq.pushSegment(deleteSizes, length - prefix, true);\n\t\t\t\t\tSubseq.pushSegment(insertSizes, length - prefix, false);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tdefault: {\n\t\t\t\t\tthrow new TypeError(\"Invalid operation type\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (prevInserted !== undefined) {\n\t\t\tSubseq.pushSegment(insertSizes, prevInserted.length, true);\n\t\t\tinserted += prevInserted;\n\t\t}\n\n\t\tconst insertSeq = new Subseq(insertSizes);\n\t\tconst deleteSeq = new Subseq(deleteSizes);\n\t\treturn Edit.synthesize(insertSeq, inserted, deleteSeq, deleted);\n\t}\n\n\t/**\n\t * Composes two consecutive edits.\n\t */\n\tcompose(that: Edit): Edit {\n\t\tlet [insertSeq1, inserted1, deleteSeq1, deleted1] = this.factor();\n\t\tlet [insertSeq2, inserted2, deleteSeq2, deleted2] = that.factor();\n\t\t// Expand all subseqs so that they share the same coordinate space.\n\t\tdeleteSeq1 = deleteSeq1.expand(insertSeq1);\n\t\tdeleteSeq2 = deleteSeq2.expand(deleteSeq1);\n\t\t[deleteSeq1, insertSeq2] = deleteSeq1.interleave(insertSeq2);\n\t\tdeleteSeq2 = deleteSeq2.expand(insertSeq2);\n\t\tinsertSeq1 = insertSeq1.expand(insertSeq2);\n\n\t\t// Find insertions which have been deleted and remove them.\n\t\t{\n\t\t\tconst toggleSeq = insertSeq1.intersection(deleteSeq2);\n\t\t\tif (toggleSeq.includedSize) {\n\t\t\t\tdeleteSeq1 = deleteSeq1.shrink(toggleSeq);\n\t\t\t\tinserted1 = erase(insertSeq1, inserted1, toggleSeq);\n\t\t\t\tinsertSeq1 = insertSeq1.shrink(toggleSeq);\n\t\t\t\tdeleteSeq2 = deleteSeq2.shrink(toggleSeq);\n\t\t\t\tinsertSeq2 = insertSeq2.shrink(toggleSeq);\n\t\t\t}\n\t\t}\n\n\t\tconst insertSeq = insertSeq1.union(insertSeq2);\n\t\tconst inserted = consolidate(insertSeq1, inserted1, insertSeq2, inserted2);\n\t\tconst deleteSeq = deleteSeq1.union(deleteSeq2).shrink(insertSeq);\n\t\tconst deleted =\n\t\t\tdeleted1 != null && deleted2 != null\n\t\t\t\t? consolidate(deleteSeq1, deleted1, deleteSeq2, deleted2)\n\t\t\t\t: undefined;\n\t\treturn Edit.synthesize(insertSeq, inserted, deleteSeq, deleted).normalize();\n\t}\n\n\tinvert(): Edit {\n\t\tif (typeof this.deleted === \"undefined\") {\n\t\t\tthrow new Error(\"Missing deleted property\");\n\t\t}\n\n\t\tlet [insertSeq, inserted, deleteSeq, deleted] = this.factor();\n\t\tdeleteSeq = deleteSeq.expand(insertSeq);\n\t\tinsertSeq = insertSeq.shrink(deleteSeq);\n\t\treturn Edit.synthesize(deleteSeq, deleted!, insertSeq, inserted);\n\t}\n}\n\n/**\n * Given two subseqs and strings which are represented by the included segments\n * of the subseqs, this function combines the two strings so that they overlap\n * according to the positions of the included segments of subseqs.\n *\n * The subseqs must have the same size, and the included segments of these\n * subseqs may not overlap.\n */\nfunction consolidate(\n\tsubseq1: Subseq,\n\ttext1: string,\n\tsubseq2: Subseq,\n\ttext2: string,\n): string {\n\tlet i1 = 0;\n\tlet i2 = 0;\n\tlet result = \"\";\n\tfor (const [size, flag1, flag2] of subseq1.align(subseq2)) {\n\t\tif (flag1 && flag2) {\n\t\t\tthrow new Error(\"Overlapping subseqs\");\n\t\t} else if (flag1) {\n\t\t\tresult += text1.slice(i1, i1 + size);\n\t\t\ti1 += size;\n\t\t} else if (flag2) {\n\t\t\tresult += text2.slice(i2, i2 + size);\n\t\t\ti2 += size;\n\t\t}\n\t}\n\n\treturn result;\n}\n\n/**\n * Given two subseqs as well a string which is represented by the included\n * segments of the first subseq, this function returns the result of removing\n * the included segments of the second subseq from the first subseq.\n *\n * The subseqs must have the same size, and the included segments of the second\n * subseq must overlap with the first subseq’s included segments.\n */\nfunction erase(subseq1: Subseq, str: string, subseq2: Subseq): string {\n\tlet i = 0;\n\tlet result = \"\";\n\tfor (const [size, flag1, flag2] of subseq1.align(subseq2)) {\n\t\tif (flag1) {\n\t\t\tif (!flag2) {\n\t\t\t\tresult += str.slice(i, i + size);\n\t\t\t}\n\n\t\t\ti += size;\n\t\t} else if (flag2) {\n\t\t\tthrow new Error(\"Non-overlapping subseqs\");\n\t\t}\n\t}\n\n\treturn result;\n}\n\n/**\n * @returns The length of the common prefix between two strings.\n */\nfunction commonPrefixLength(text1: string, text2: string) {\n\tconst length = Math.min(text1.length, text2.length);\n\tfor (let i = 0; i < length; i++) {\n\t\tif (text1[i] !== text2[i]) {\n\t\t\treturn i;\n\t\t}\n\t}\n\n\treturn length;\n}\n\n/**\n * @returns The length of the common suffix between two strings.\n */\nfunction commonSuffixLength(text1: string, text2: string) {\n\tconst length1 = text1.length;\n\tconst length2 = text2.length;\n\tconst length = Math.min(length1, length2);\n\tfor (let i = 0; i < length; i++) {\n\t\tif (text1[length1 - i - 1] !== text2[length2 - i - 1]) {\n\t\t\treturn i;\n\t\t}\n\t}\n\n\treturn length;\n}\n"],"names":["Subseq"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"edit.cjs","sources":["../src/_subseq.ts","../src/edit.ts"],"sourcesContent":["/*\n * This module provides utility functions for building and operating on\n * “subsequences.” Subsequences are created by taking zero or more elements\n * from a sequence while preserving the order of the remaining elements. While\n * this specific module does not care about what those sequences actually are,\n * for the purposes of this library, sequences are always strings, measured in\n * UTF-16 code units, and subsequences can be used to represent operations over\n * the entire string like insertions and deletions.\n *\n * We define subsequences as arrays of numbers, where each number represents\n * the length of a continguous segment from the original sequence. These number\n * alternate between representing excluded and included segments from the\n * original sequence, with the first number representing the length of an\n * excluded segment. In other words, the first segment represents an excluded\n * segment, the second included, the third excluded, etc.\n *\n * Given the string sequence \"abcdefgh\", the following subsequence arrays\n * represent the indicated strings.\n *\n * [0, 4, 4] = \"abcd\"\n * [4, 4] = \"efgh\"\n * [0, 2, 2, 2, 2] = \"ab\" \"ef\"\n * [2, 2, 2, 2] = \"cd\" \"gh\"\n * [0, 1, 6, 1] = \"a\" \"h\"\n * [1, 1, 1, 1, 1, 1, 1, 1] = \"b\" \"d\" \"f\" \"h\"\n *\n * Because the first segment is always excluded, a subsequence array will start\n * with a 0 if the subsequence to indicate that the first element of the\n * sequence is included. No other 0s will appear in a well-constructed\n * subsequence array.\n *\n * This module is private to the revise package and separate from \"./edit.js\"\n * for testing purposes.\n */\nexport type Subseq = Array<number>;\n\nexport function measure(\n\tsubseq: Subseq,\n): {length: number; includedLength: number; excludedLength: number} {\n\tlet length = 0,\n\t\tincludedLength = 0,\n\t\texcludedLength = 0;\n\tfor (let i = 0; i < subseq.length; i++) {\n\t\tconst s = subseq[i];\n\t\tlength += s;\n\t\tif (i % 2 === 0) {\n\t\t\texcludedLength += s;\n\t\t} else {\n\t\t\tincludedLength += s;\n\t\t}\n\t}\n\n\treturn {length, includedLength, excludedLength};\n}\n\nexport function pushSegment(\n\tsubseq: Subseq,\n\tlength: number,\n\tincluded: boolean,\n): void {\n\tif (length < 0) {\n\t\tthrow new RangeError(\"Negative length\");\n\t} else if (length === 0) {\n\t\treturn;\n\t} else if (!subseq.length) {\n\t\tif (included) {\n\t\t\tsubseq.push(0, length);\n\t\t} else {\n\t\t\tsubseq.push(length);\n\t\t}\n\t} else {\n\t\tconst included1 = subseq.length % 2 === 0;\n\t\tif (included === included1) {\n\t\t\tsubseq[subseq.length - 1] += length;\n\t\t} else {\n\t\t\tsubseq.push(length);\n\t\t}\n\t}\n}\n\n///** A utility method to debug subseqs. */\n//function print(subseq: Subseq): string {\n//\tlet result = \"\";\n//\tfor (let i = 0; i < subseq.length; i++) {\n//\t\tif (i % 2 === 0) {\n//\t\t\tresult += \"=\".repeat(subseq[i]);\n//\t\t} else {\n//\t\t\tresult += \"+\".repeat(subseq[i]);\n//\t\t}\n//\t}\n//\n//\treturn result;\n//}\n\nexport function contains(subseq: Subseq, index: number): boolean {\n\tif (index < 0) {\n\t\treturn false;\n\t}\n\n\tfor (let i = 0; i < subseq.length; i++) {\n\t\tindex -= subseq[i];\n\t\tif (index < 0) {\n\t\t\treturn i % 2 === 1;\n\t\t}\n\t}\n\n\treturn false;\n}\n\nexport function clear(subseq: Subseq): Subseq {\n\tconst {length} = measure(subseq);\n\treturn length ? [length] : [];\n}\n\nexport function fill(subseq: Subseq): Subseq {\n\tconst {length} = measure(subseq);\n\treturn length ? [0, length] : [];\n}\n\nexport function complement(subseq: Subseq): Subseq {\n\treturn subseq[0] === 0 ? subseq.slice(1) : [0, ...subseq];\n}\n\nexport function align(\n\tsubseq1: Subseq,\n\tsubseq2: Subseq,\n): Array<[number, boolean, boolean]> {\n\tif (measure(subseq1).length !== measure(subseq2).length) {\n\t\tthrow new Error(\"Length mismatch\");\n\t}\n\n\tconst result: Array<[number, boolean, boolean]> = [];\n\tfor (\n\t\tlet i1 = 0,\n\t\t\ti2 = 0,\n\t\t\tlength1 = 0,\n\t\t\tlength2 = 0,\n\t\t\tincluded1 = true,\n\t\t\tincluded2 = true;\n\t\ti1 < subseq1.length || i2 < subseq2.length;\n\n\t) {\n\t\tif (length1 === 0) {\n\t\t\tif (i1 >= subseq1.length) {\n\t\t\t\tthrow new Error(\"Length mismatch\");\n\t\t\t}\n\n\t\t\tlength1 = subseq1[i1++];\n\t\t\tincluded1 = !included1;\n\t\t}\n\n\t\tif (length2 === 0) {\n\t\t\tif (i2 >= subseq2.length) {\n\t\t\t\tthrow new Error(\"Size mismatch\");\n\t\t\t}\n\n\t\t\tlength2 = subseq2[i2++];\n\t\t\tincluded2 = !included2;\n\t\t}\n\n\t\tif (length1 < length2) {\n\t\t\tif (length1) {\n\t\t\t\tresult.push([length1, included1, included2]);\n\t\t\t}\n\n\t\t\tlength2 = length2 - length1;\n\t\t\tlength1 = 0;\n\t\t} else if (length1 > length2) {\n\t\t\tif (length2) {\n\t\t\t\tresult.push([length2, included1, included2]);\n\t\t\t}\n\n\t\t\tlength1 = length1 - length2;\n\t\t\tlength2 = 0;\n\t\t} else {\n\t\t\tif (length1) {\n\t\t\t\tresult.push([length1, included1, included2]);\n\t\t\t}\n\n\t\t\tlength1 = length2 = 0;\n\t\t}\n\t}\n\n\treturn result;\n}\n\nexport function union(subseq1: Subseq, subseq2: Subseq): Subseq {\n\tconst result: Subseq = [];\n\tfor (const [length, included1, included2] of align(subseq1, subseq2)) {\n\t\tpushSegment(result, length, included1 || included2);\n\t}\n\n\treturn result;\n}\n\nexport function intersection(subseq1: Subseq, subseq2: Subseq): Subseq {\n\tconst result: Subseq = [];\n\tfor (const [length, included1, included2] of align(subseq1, subseq2)) {\n\t\tpushSegment(result, length, included1 && included2);\n\t}\n\n\treturn result;\n}\n\nexport function difference(subseq1: Subseq, subseq2: Subseq): Subseq {\n\tconst result: Array<number> = [];\n\tfor (const [length, included1, included2] of align(subseq1, subseq2)) {\n\t\tpushSegment(result, length, included1 && !included2);\n\t}\n\n\treturn result;\n}\n\nexport function shrink(subseq1: Subseq, subseq2: Subseq): Subseq {\n\tif (measure(subseq1).length !== measure(subseq2).length) {\n\t\tthrow new Error(\"Length mismatch\");\n\t}\n\n\tconst result: Subseq = [];\n\tfor (const [length, included1, included2] of align(subseq1, subseq2)) {\n\t\tif (!included2) {\n\t\t\tpushSegment(result, length, included1);\n\t\t}\n\t}\n\n\treturn result;\n}\n\nexport function expand(subseq1: Subseq, subseq2: Subseq): Subseq {\n\tif (measure(subseq1).length !== measure(subseq2).excludedLength) {\n\t\tthrow new Error(\"Length mismatch\");\n\t}\n\n\tconst result: Array<number> = [];\n\tfor (\n\t\tlet i1 = 0, i2 = 0, length1 = 0, included1 = true, included2 = true;\n\t\ti2 < subseq2.length;\n\t\ti2++\n\t) {\n\t\tlet length2 = subseq2[i2];\n\t\tincluded2 = !included2;\n\t\tif (included2) {\n\t\t\tpushSegment(result, length2, false);\n\t\t} else {\n\t\t\twhile (length2) {\n\t\t\t\tif (length1 === 0) {\n\t\t\t\t\tlength1 = subseq1[i1++];\n\t\t\t\t\tincluded1 = !included1;\n\t\t\t\t}\n\n\t\t\t\tconst minLength = Math.min(length1, length2);\n\t\t\t\tpushSegment(result, minLength, included1);\n\t\t\t\tlength1 -= minLength;\n\t\t\t\tlength2 -= minLength;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn result;\n}\n\nexport function interleave(subseq1: Subseq, subseq2: Subseq): [Subseq, Subseq] {\n\tif (measure(subseq1).excludedLength !== measure(subseq2).excludedLength) {\n\t\tthrow new Error(\"Length mismatch\");\n\t}\n\n\tconst result1: Array<number> = [];\n\tconst result2: Array<number> = [];\n\tfor (\n\t\tlet i1 = 0,\n\t\t\ti2 = 0,\n\t\t\tlength1 = 0,\n\t\t\tlength2 = 0,\n\t\t\tincluded1 = true,\n\t\t\tincluded2 = true;\n\t\ti1 < subseq1.length || i2 < subseq2.length;\n\n\t) {\n\t\tif (length1 === 0 && i1 < subseq1.length) {\n\t\t\tlength1 = subseq1[i1++];\n\t\t\tincluded1 = !included1;\n\t\t}\n\n\t\tif (length2 === 0 && i2 < subseq2.length) {\n\t\t\tlength2 = subseq2[i2++];\n\t\t\tincluded2 = !included2;\n\t\t}\n\n\t\tif (included1 && included2) {\n\t\t\tpushSegment(result1, length1, true);\n\t\t\tpushSegment(result1, length2, false);\n\t\t\tpushSegment(result2, length1, false);\n\t\t\tpushSegment(result2, length2, true);\n\t\t\tlength1 = length2 = 0;\n\t\t} else if (included1) {\n\t\t\tpushSegment(result1, length1, true);\n\t\t\tpushSegment(result2, length1, false);\n\t\t\tlength1 = 0;\n\t\t} else if (included2) {\n\t\t\tpushSegment(result1, length2, false);\n\t\t\tpushSegment(result2, length2, true);\n\t\t\tlength2 = 0;\n\t\t} else {\n\t\t\tconst minLength = Math.min(length1, length2);\n\t\t\tpushSegment(result1, minLength, false);\n\t\t\tpushSegment(result2, minLength, false);\n\t\t\tlength1 -= minLength;\n\t\t\tlength2 -= minLength;\n\t\t}\n\t}\n\n\treturn [result1, result2];\n}\n","import * as S from \"./_subseq.js\";\nimport type {Subseq} from \"./_subseq.js\";\n\nexport interface InsertOperation {\n\ttype: \"insert\";\n\tstart: number;\n\tvalue: string;\n}\n\nexport interface RetainOperation {\n\ttype: \"retain\";\n\tstart: number;\n\tend: number;\n}\n\nexport interface DeleteOperation {\n\ttype: \"delete\";\n\tstart: number;\n\tend: number;\n\tvalue: string | undefined;\n}\n\nexport type Operation = RetainOperation | DeleteOperation | InsertOperation;\n\nexport interface EditBuilder {\n\tretain(length: number): EditBuilder;\n\n\tdelete(length: number): EditBuilder;\n\n\tinsert(value: string): EditBuilder;\n\n\tconcat(edit: Edit): EditBuilder;\n\n\tbuild(): Edit;\n}\n\n/** A compact data structure for representing changes to strings. */\nexport class Edit {\n\t/**\n\t * An array of strings and integers representing operations.\n\t *\n\t * Strings represent insertions, and pairs of integers represent the start\n\t * and end indices of retained segments. Deletions are implied by gaps\n\t * between the retained segments.\n\t *\n\t * Examples:\n\t *\n\t * [0, 3, 7, 10]\n\t * retain 0-3, delete 3-7, retain 7-10\n\t *\n\t * [\"hello\", 0, 10]\n\t * insert \"hello\", retain 0-10\n\t *\n\t * [0, 5, \" \", 6, 10]\n\t * retain 0-5, insert \" \", delete 5-6, retain 6-10\n\t *\n\t * If the edit includes a delete operation at its end, this is signified by\n\t * an extra number signifying the length. Therefore, regardless of whether or\n\t * not the last character of the string is retained, the last number will\n\t * always represent the length of the original string.\n\t *\n\t * // retain 0-10, delete 10-11\n\t * [0, 10, 11]\n\t *\n\t * An edit that is only retains will contain a single number representing the\n\t * length of the string.\n\t */\n\tdeclare parts: Array<string | number>;\n\n\t/**\n\t * A string which represents a concatenation of all deletions.\n\t *\n\t * This property is optional, but required if you want to invert the edit.\n\t */\n\tdeclare deleted: string | undefined;\n\n\tconstructor(parts: Array<string | number>, deleted?: string) {\n\t\tthis.parts = parts;\n\t\tthis.deleted = deleted;\n\t}\n\n\t/** A string which represents a concatenation of all insertions. */\n\tget inserted(): string {\n\t\tlet text = \"\";\n\t\tfor (let i = 0; i < this.parts.length; i++) {\n\t\t\tif (typeof this.parts[i] === \"string\") {\n\t\t\t\ttext += this.parts[i];\n\t\t\t}\n\t\t}\n\n\t\treturn text;\n\t}\n\n\t/**\n\t * Returns an array of operations, which is more readable than the parts\n\t * array.\n\t *\n\t * new Edit([0, 1, \" \", 2], \"x\").operations();\n\t * [\n\t * {type: \"retain\", start: 0, end: 1},\n\t * {type: \"insert\", start: 1, value: \" \"},\n\t * {type: \"delete\", start: 1, end: 2, value: \"x\"},\n\t * ]\n\t *\n\t * When insertions and deletions happen at the same index, insertions will\n\t * always appear before deletions in the operations array.\n\t */\n\toperations(): Array<Operation> {\n\t\tconst operations: Array<Operation> = [];\n\t\tlet retaining = false;\n\t\tlet index = 0;\n\t\tlet deleteStart = 0;\n\t\tfor (let i = 0; i < this.parts.length; i++) {\n\t\t\tconst part = this.parts[i];\n\t\t\tif (typeof part === \"number\") {\n\t\t\t\tif (part < index) {\n\t\t\t\t\tthrow new TypeError(\"Malformed edit\");\n\t\t\t\t} else if (part > index) {\n\t\t\t\t\tif (retaining) {\n\t\t\t\t\t\toperations.push({type: \"retain\", start: index, end: part});\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst value =\n\t\t\t\t\t\t\ttypeof this.deleted === \"undefined\"\n\t\t\t\t\t\t\t\t? undefined\n\t\t\t\t\t\t\t\t: this.deleted.slice(deleteStart, part);\n\t\t\t\t\t\toperations.push({\n\t\t\t\t\t\t\ttype: \"delete\",\n\t\t\t\t\t\t\tstart: index,\n\t\t\t\t\t\t\tend: part,\n\t\t\t\t\t\t\tvalue,\n\t\t\t\t\t\t});\n\t\t\t\t\t\tdeleteStart = part;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tindex = part;\n\t\t\t\tretaining = !retaining;\n\t\t\t} else {\n\t\t\t\toperations.push({type: \"insert\", start: index, value: part});\n\t\t\t}\n\t\t}\n\n\t\treturn operations;\n\t}\n\n\tapply(text: string): string {\n\t\tlet text1 = \"\";\n\t\tconst operations = this.operations();\n\t\tfor (let i = 0; i < operations.length; i++) {\n\t\t\tconst op = operations[i];\n\t\t\tswitch (op.type) {\n\t\t\t\tcase \"retain\":\n\t\t\t\t\ttext1 += text.slice(op.start, op.end);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"insert\":\n\t\t\t\t\ttext1 += op.value;\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\treturn text1;\n\t}\n\n\t/** Composes two consecutive edits. */\n\tcompose(that: Edit): Edit {\n\t\tlet [insertSeq1, inserted1, deleteSeq1, deleted1] = factor(this);\n\t\tlet [insertSeq2, inserted2, deleteSeq2, deleted2] = factor(that);\n\t\t// Expand all subseqs so that they share the same coordinate space.\n\t\tdeleteSeq1 = S.expand(deleteSeq1, insertSeq1);\n\t\tdeleteSeq2 = S.expand(deleteSeq2, deleteSeq1);\n\t\t[deleteSeq1, insertSeq2] = S.interleave(deleteSeq1, insertSeq2);\n\t\tdeleteSeq2 = S.expand(deleteSeq2, insertSeq2);\n\t\tinsertSeq1 = S.expand(insertSeq1, insertSeq2);\n\n\t\t{\n\t\t\t// Find insertions which have been deleted and remove them.\n\t\t\tconst toggleSeq = S.intersection(insertSeq1, deleteSeq2);\n\t\t\tif (S.measure(toggleSeq).includedLength) {\n\t\t\t\tdeleteSeq1 = S.shrink(deleteSeq1, toggleSeq);\n\t\t\t\tinserted1 = erase(insertSeq1, inserted1, toggleSeq);\n\t\t\t\tinsertSeq1 = S.shrink(insertSeq1, toggleSeq);\n\t\t\t\tdeleteSeq2 = S.shrink(deleteSeq2, toggleSeq);\n\t\t\t\tinsertSeq2 = S.shrink(insertSeq2, toggleSeq);\n\t\t\t}\n\t\t}\n\n\t\tconst insertSeq = S.union(insertSeq1, insertSeq2);\n\t\tconst inserted = consolidate(insertSeq1, inserted1, insertSeq2, inserted2);\n\t\tconst deleteSeq = S.shrink(S.union(deleteSeq1, deleteSeq2), insertSeq);\n\t\tconst deleted =\n\t\t\tdeleted1 != null && deleted2 != null\n\t\t\t\t? consolidate(deleteSeq1, deleted1, deleteSeq2, deleted2)\n\t\t\t\t: undefined;\n\t\treturn synthesize(insertSeq, inserted, deleteSeq, deleted).normalize();\n\t}\n\n\tinvert(): Edit {\n\t\tif (typeof this.deleted === \"undefined\") {\n\t\t\tthrow new Error(\"Edit is not invertible\");\n\t\t}\n\n\t\tlet [insertSeq, inserted, deleteSeq, deleted] = factor(this);\n\t\tdeleteSeq = S.expand(deleteSeq, insertSeq);\n\t\tinsertSeq = S.shrink(insertSeq, deleteSeq);\n\t\treturn synthesize(deleteSeq, deleted!, insertSeq, inserted);\n\t}\n\n\tnormalize(): Edit {\n\t\tif (typeof this.deleted === \"undefined\") {\n\t\t\tthrow new Error(\"Edit is not normalizable\");\n\t\t}\n\n\t\tconst insertSeq: Array<number> = [];\n\t\tconst deleteSeq: Array<number> = [];\n\t\tlet inserted = \"\";\n\t\tlet deleted = \"\";\n\t\tlet insertion: string | undefined;\n\t\tconst operations = this.operations();\n\t\tfor (let i = 0; i < operations.length; i++) {\n\t\t\tconst op = operations[i];\n\t\t\tswitch (op.type) {\n\t\t\t\tcase \"insert\": {\n\t\t\t\t\tinsertion = op.value;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tcase \"retain\": {\n\t\t\t\t\tif (insertion !== undefined) {\n\t\t\t\t\t\tS.pushSegment(insertSeq, insertion.length, true);\n\t\t\t\t\t\tinserted += insertion;\n\t\t\t\t\t\tinsertion = undefined;\n\t\t\t\t\t}\n\n\t\t\t\t\tS.pushSegment(insertSeq, op.end - op.start, false);\n\t\t\t\t\tS.pushSegment(deleteSeq, op.end - op.start, false);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tcase \"delete\": {\n\t\t\t\t\tconst length = op.end - op.start;\n\t\t\t\t\tconst deletion = op.value!;\n\t\t\t\t\tlet prefix = 0;\n\t\t\t\t\tlet suffix = 0;\n\t\t\t\t\tif (insertion !== undefined) {\n\t\t\t\t\t\tif (insertion === deletion) {\n\t\t\t\t\t\t\tprefix = deletion.length;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tprefix = commonPrefixLength(insertion, deletion);\n\t\t\t\t\t\t\tsuffix = commonSuffixLength(\n\t\t\t\t\t\t\t\tinsertion.slice(prefix),\n\t\t\t\t\t\t\t\tdeletion.slice(prefix),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tS.pushSegment(insertSeq, prefix, false);\n\t\t\t\t\t\tS.pushSegment(insertSeq, insertion.length - prefix - suffix, true);\n\t\t\t\t\t\tinserted += insertion.slice(prefix, insertion.length - suffix);\n\t\t\t\t\t}\n\n\t\t\t\t\tdeleted += deletion.slice(prefix, deletion.length - suffix);\n\t\t\t\t\tS.pushSegment(deleteSeq, prefix, false);\n\t\t\t\t\t// TODO: This line is throwing for some reason\n\t\t\t\t\tS.pushSegment(deleteSeq, length - prefix - suffix, true);\n\t\t\t\t\tS.pushSegment(deleteSeq, suffix, false);\n\n\t\t\t\t\tS.pushSegment(insertSeq, length - prefix - suffix, false);\n\t\t\t\t\tS.pushSegment(insertSeq, suffix, false);\n\t\t\t\t\tinsertion = undefined;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (insertion !== undefined) {\n\t\t\tS.pushSegment(insertSeq, insertion.length, true);\n\t\t\tinserted += insertion;\n\t\t}\n\n\t\treturn synthesize(insertSeq, inserted, deleteSeq, deleted);\n\t}\n\n\thasChangesBetween(start: number, end: number): boolean {\n\t\tconst ops = this.operations();\n\t\tfor (const op of ops) {\n\t\t\tswitch (op.type) {\n\t\t\t\tcase \"delete\": {\n\t\t\t\t\tif (\n\t\t\t\t\t\t(start <= op.start && op.start <= end) ||\n\t\t\t\t\t\t(start <= op.end && op.end <= end)\n\t\t\t\t\t) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase \"insert\": {\n\t\t\t\t\tif (start <= op.start && op.start <= end) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n\n\tstatic builder(value?: string | undefined): EditBuilder {\n\t\tlet index = 0;\n\t\tlet inserted = \"\";\n\t\tlet deleted: string | undefined = undefined;\n\t\tconst insertSeq: Subseq = [];\n\t\tconst deleteSeq: Subseq = [];\n\n\t\treturn {\n\t\t\tretain(length: number) {\n\t\t\t\tif (value != null) {\n\t\t\t\t\tlength = Math.min(value.length - index, length);\n\t\t\t\t}\n\n\t\t\t\tindex += length;\n\t\t\t\tS.pushSegment(insertSeq, length, false);\n\t\t\t\tS.pushSegment(deleteSeq, length, false);\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\tdelete(length: number) {\n\t\t\t\tif (value != null) {\n\t\t\t\t\tlength = Math.min(value.length - index, length);\n\t\t\t\t\tdeleted = (deleted || \"\") + value.slice(index, index + length);\n\t\t\t\t}\n\n\t\t\t\tindex += length;\n\t\t\t\tS.pushSegment(insertSeq, length, false);\n\t\t\t\tS.pushSegment(deleteSeq, length, true);\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\tinsert(value: string) {\n\t\t\t\tS.pushSegment(insertSeq, value.length, true);\n\t\t\t\tinserted += value;\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\tconcat(edit: Edit) {\n\t\t\t\tconst ops = edit.operations();\n\t\t\t\tfor (const op of ops) {\n\t\t\t\t\tswitch (op.type) {\n\t\t\t\t\t\tcase \"delete\":\n\t\t\t\t\t\t\tthis.delete(op.end - op.start);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"insert\":\n\t\t\t\t\t\t\tthis.insert(op.value);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"retain\":\n\t\t\t\t\t\t\tthis.retain(op.end - op.start);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (value != null && index > value.length) {\n\t\t\t\t\tthrow new RangeError(\"Edit is longer than original value\");\n\t\t\t\t}\n\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\tbuild(): Edit {\n\t\t\t\tif (value != null) {\n\t\t\t\t\tdeleted = deleted || \"\";\n\t\t\t\t\tif (index < value.length) {\n\t\t\t\t\t\tS.pushSegment(insertSeq, value.length - index, false);\n\t\t\t\t\t\tS.pushSegment(deleteSeq, value.length - index, false);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn synthesize(insertSeq, inserted, deleteSeq, deleted);\n\t\t\t},\n\t\t};\n\t}\n\n\t/**\n\t * Given two strings, this method finds an edit which can be applied to the\n\t * first string to result in the second.\n\t *\n\t * @param startHint - An optional hint can be provided to disambiguate edits\n\t * which cannot be inferred by comparing the text alone. For example,\n\t * inserting \"a\" into the string \"aaaa\" to make it \"aaaaa\" could be an\n\t * insertion at any index in the string. This value should be the smaller of\n\t * the start indices of the selection from before and after the edit.\n\t */\n\tstatic diff(text1: string, text2: string, startHint?: number): Edit {\n\t\tlet prefix = commonPrefixLength(text1, text2);\n\t\tlet suffix = commonSuffixLength(text1, text2);\n\t\t// prefix and suffix overlap when edits are in runs of the same character.\n\t\tif (prefix + suffix > Math.min(text1.length, text2.length)) {\n\t\t\tif (startHint != null && startHint >= 0) {\n\t\t\t\tprefix = Math.min(prefix, startHint);\n\t\t\t}\n\n\t\t\t// TODO: We can probably avoid the commonSuffixLength() call here in\n\t\t\t// favor of arithmetic but I’m too dumb to figure it out.\n\t\t\tsuffix = commonSuffixLength(text1.slice(prefix), text2.slice(prefix));\n\t\t}\n\n\t\treturn Edit.builder(text1)\n\t\t\t.retain(prefix)\n\t\t\t.insert(text2.slice(prefix, text2.length - suffix))\n\t\t\t.delete(text1.length - prefix - suffix)\n\t\t\t.retain(suffix)\n\t\t\t.build();\n\t}\n}\n\nfunction synthesize(\n\tinsertSeq: Subseq,\n\tinserted: string,\n\tdeleteSeq: Subseq,\n\tdeleted?: string | undefined,\n): Edit {\n\tif (S.measure(insertSeq).includedLength !== inserted.length) {\n\t\tthrow new Error(\"insertSeq and inserted string do not match in length\");\n\t} else if (\n\t\tdeleted !== undefined &&\n\t\tS.measure(deleteSeq).includedLength !== deleted.length\n\t) {\n\t\tthrow new Error(\"deleteSeq and deleted string do not match in length\");\n\t}\n\n\tconst parts: Array<string | number> = [];\n\tlet insertIndex = 0;\n\tlet retainIndex = 0;\n\tlet needsLength = true;\n\tfor (const [length, deleting, inserting] of S.align(\n\t\tS.expand(deleteSeq, insertSeq),\n\t\tinsertSeq,\n\t)) {\n\t\tif (inserting) {\n\t\t\tconst insertion = inserted.slice(insertIndex, insertIndex + length);\n\t\t\tif (parts.length && typeof parts[parts.length - 1] === \"string\") {\n\t\t\t\tparts[parts.length - 1] += insertion;\n\t\t\t} else {\n\t\t\t\tparts.push(insertion);\n\t\t\t}\n\n\t\t\tinsertIndex += length;\n\t\t} else {\n\t\t\tif (!deleting) {\n\t\t\t\tparts.push(retainIndex, retainIndex + length);\n\t\t\t}\n\n\t\t\tretainIndex += length;\n\t\t\tneedsLength = deleting;\n\t\t}\n\t}\n\n\tif (needsLength) {\n\t\tparts.push(retainIndex);\n\t}\n\n\treturn new Edit(parts, deleted);\n}\n\nfunction factor(edit: Edit): [Subseq, string, Subseq, string | undefined] {\n\tconst insertSeq: Array<number> = [];\n\tconst deleteSeq: Array<number> = [];\n\tlet inserted = \"\";\n\tconst operations = edit.operations();\n\tfor (let i = 0; i < operations.length; i++) {\n\t\tconst op = operations[i];\n\t\tswitch (op.type) {\n\t\t\tcase \"retain\": {\n\t\t\t\tconst length = op.end - op.start;\n\t\t\t\tS.pushSegment(insertSeq, length, false);\n\t\t\t\tS.pushSegment(deleteSeq, length, false);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"delete\": {\n\t\t\t\tconst length = op.end - op.start;\n\t\t\t\tS.pushSegment(insertSeq, length, false);\n\t\t\t\tS.pushSegment(deleteSeq, length, true);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"insert\":\n\t\t\t\tS.pushSegment(insertSeq, op.value.length, true);\n\t\t\t\tinserted += op.value;\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\treturn [insertSeq, inserted, deleteSeq, edit.deleted];\n}\n\n/**\n * Given two subseqs and strings which are represented by the included segments\n * of the subseqs, this function combines the two strings so that they overlap\n * according to the positions of the included segments of subseqs.\n *\n * The subseqs must have the same length, and the included segments of these\n * subseqs may not overlap.\n */\nfunction consolidate(\n\tsubseq1: Subseq,\n\ttext1: string,\n\tsubseq2: Subseq,\n\ttext2: string,\n): string {\n\tlet i1 = 0;\n\tlet i2 = 0;\n\tlet result = \"\";\n\tfor (const [length, included1, included2] of S.align(subseq1, subseq2)) {\n\t\tif (included1 && included2) {\n\t\t\tthrow new Error(\"Overlapping subseqs\");\n\t\t} else if (included1) {\n\t\t\tresult += text1.slice(i1, i1 + length);\n\t\t\ti1 += length;\n\t\t} else if (included2) {\n\t\t\tresult += text2.slice(i2, i2 + length);\n\t\t\ti2 += length;\n\t\t}\n\t}\n\n\treturn result;\n}\n\n/**\n * Given two subseqs as well a string which is represented by the included\n * segments of the first subseq, this function returns the result of removing\n * the included segments of the second subseq from the first subseq.\n *\n * The subseqs must have the same length, and the included segments of the second\n * subseq must overlap with the first subseq’s included segments.\n */\nfunction erase(subseq1: Subseq, str: string, subseq2: Subseq): string {\n\tlet i = 0;\n\tlet result = \"\";\n\tfor (const [length, included1, included2] of S.align(subseq1, subseq2)) {\n\t\tif (included1) {\n\t\t\tif (!included2) {\n\t\t\t\tresult += str.slice(i, i + length);\n\t\t\t}\n\n\t\t\ti += length;\n\t\t} else if (included2) {\n\t\t\tthrow new Error(\"Non-overlapping subseqs\");\n\t\t}\n\t}\n\n\treturn result;\n}\n\n/** @returns The length of the common prefix between two strings. */\nfunction commonPrefixLength(text1: string, text2: string) {\n\tconst length = Math.min(text1.length, text2.length);\n\tfor (let i = 0; i < length; i++) {\n\t\tif (text1[i] !== text2[i]) {\n\t\t\treturn i;\n\t\t}\n\t}\n\n\treturn length;\n}\n\n/** @returns The length of the common suffix between two strings. */\nfunction commonSuffixLength(text1: string, text2: string) {\n\tconst length1 = text1.length;\n\tconst length2 = text2.length;\n\tconst length = Math.min(length1, length2);\n\tfor (let i = 0; i < length; i++) {\n\t\tif (text1[length1 - i - 1] !== text2[length2 - i - 1]) {\n\t\t\treturn i;\n\t\t}\n\t}\n\n\treturn length;\n}\n"],"names":["S.expand","S.interleave","S.intersection","S.measure","S.shrink","S.union","S.pushSegment","S.align"],"mappings":";;;;AAoCM,SAAU,OAAO,CACtB,MAAc,EAAA;IAEd,IAAI,MAAM,GAAG,CAAC,EACb,cAAc,GAAG,CAAC,EAClB,cAAc,GAAG,CAAC,CAAC;AACpB,IAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AACvC,QAAA,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACpB,MAAM,IAAI,CAAC,CAAC;AACZ,QAAA,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;YAChB,cAAc,IAAI,CAAC,CAAC;AACpB,SAAA;AAAM,aAAA;YACN,cAAc,IAAI,CAAC,CAAC;AACpB,SAAA;AACD,KAAA;AAED,IAAA,OAAO,EAAC,MAAM,EAAE,cAAc,EAAE,cAAc,EAAC,CAAC;AACjD,CAAC;SAEe,WAAW,CAC1B,MAAc,EACd,MAAc,EACd,QAAiB,EAAA;IAEjB,IAAI,MAAM,GAAG,CAAC,EAAE;AACf,QAAA,MAAM,IAAI,UAAU,CAAC,iBAAiB,CAAC,CAAC;AACxC,KAAA;SAAM,IAAI,MAAM,KAAK,CAAC,EAAE;QACxB,OAAO;AACP,KAAA;AAAM,SAAA,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;AAC1B,QAAA,IAAI,QAAQ,EAAE;AACb,YAAA,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;AACvB,SAAA;AAAM,aAAA;AACN,YAAA,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AACpB,SAAA;AACD,KAAA;AAAM,SAAA;QACN,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC,CAAC;QAC1C,IAAI,QAAQ,KAAK,SAAS,EAAE;YAC3B,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,MAAM,CAAC;AACpC,SAAA;AAAM,aAAA;AACN,YAAA,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AACpB,SAAA;AACD,KAAA;AACF,CAAC;AA6Ce,SAAA,KAAK,CACpB,OAAe,EACf,OAAe,EAAA;AAEf,IAAA,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE;AACxD,QAAA,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;AACnC,KAAA;IAED,MAAM,MAAM,GAAsC,EAAE,CAAC;AACrD,IAAA,KACC,IAAI,EAAE,GAAG,CAAC,EACT,EAAE,GAAG,CAAC,EACN,OAAO,GAAG,CAAC,EACX,OAAO,GAAG,CAAC,EACX,SAAS,GAAG,IAAI,EAChB,SAAS,GAAG,IAAI,EACjB,EAAE,GAAG,OAAO,CAAC,MAAM,IAAI,EAAE,GAAG,OAAO,CAAC,MAAM,GAEzC;QACD,IAAI,OAAO,KAAK,CAAC,EAAE;AAClB,YAAA,IAAI,EAAE,IAAI,OAAO,CAAC,MAAM,EAAE;AACzB,gBAAA,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;AACnC,aAAA;AAED,YAAA,OAAO,GAAG,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;YACxB,SAAS,GAAG,CAAC,SAAS,CAAC;AACvB,SAAA;QAED,IAAI,OAAO,KAAK,CAAC,EAAE;AAClB,YAAA,IAAI,EAAE,IAAI,OAAO,CAAC,MAAM,EAAE;AACzB,gBAAA,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC;AACjC,aAAA;AAED,YAAA,OAAO,GAAG,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;YACxB,SAAS,GAAG,CAAC,SAAS,CAAC;AACvB,SAAA;QAED,IAAI,OAAO,GAAG,OAAO,EAAE;AACtB,YAAA,IAAI,OAAO,EAAE;gBACZ,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC;AAC7C,aAAA;AAED,YAAA,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC;YAC5B,OAAO,GAAG,CAAC,CAAC;AACZ,SAAA;aAAM,IAAI,OAAO,GAAG,OAAO,EAAE;AAC7B,YAAA,IAAI,OAAO,EAAE;gBACZ,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC;AAC7C,aAAA;AAED,YAAA,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC;YAC5B,OAAO,GAAG,CAAC,CAAC;AACZ,SAAA;AAAM,aAAA;AACN,YAAA,IAAI,OAAO,EAAE;gBACZ,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC;AAC7C,aAAA;AAED,YAAA,OAAO,GAAG,OAAO,GAAG,CAAC,CAAC;AACtB,SAAA;AACD,KAAA;AAED,IAAA,OAAO,MAAM,CAAC;AACf,CAAC;AAEe,SAAA,KAAK,CAAC,OAAe,EAAE,OAAe,EAAA;IACrD,MAAM,MAAM,GAAW,EAAE,CAAC;AAC1B,IAAA,KAAK,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE;QACrE,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,IAAI,SAAS,CAAC,CAAC;AACpD,KAAA;AAED,IAAA,OAAO,MAAM,CAAC;AACf,CAAC;AAEe,SAAA,YAAY,CAAC,OAAe,EAAE,OAAe,EAAA;IAC5D,MAAM,MAAM,GAAW,EAAE,CAAC;AAC1B,IAAA,KAAK,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE;QACrE,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,IAAI,SAAS,CAAC,CAAC;AACpD,KAAA;AAED,IAAA,OAAO,MAAM,CAAC;AACf,CAAC;AAWe,SAAA,MAAM,CAAC,OAAe,EAAE,OAAe,EAAA;AACtD,IAAA,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE;AACxD,QAAA,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;AACnC,KAAA;IAED,MAAM,MAAM,GAAW,EAAE,CAAC;AAC1B,IAAA,KAAK,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE;QACrE,IAAI,CAAC,SAAS,EAAE;AACf,YAAA,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;AACvC,SAAA;AACD,KAAA;AAED,IAAA,OAAO,MAAM,CAAC;AACf,CAAC;AAEe,SAAA,MAAM,CAAC,OAAe,EAAE,OAAe,EAAA;AACtD,IAAA,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC,cAAc,EAAE;AAChE,QAAA,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;AACnC,KAAA;IAED,MAAM,MAAM,GAAkB,EAAE,CAAC;AACjC,IAAA,KACC,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,OAAO,GAAG,CAAC,EAAE,SAAS,GAAG,IAAI,EAAE,SAAS,GAAG,IAAI,EACnE,EAAE,GAAG,OAAO,CAAC,MAAM,EACnB,EAAE,EAAE,EACH;AACD,QAAA,IAAI,OAAO,GAAG,OAAO,CAAC,EAAE,CAAC,CAAC;QAC1B,SAAS,GAAG,CAAC,SAAS,CAAC;AACvB,QAAA,IAAI,SAAS,EAAE;AACd,YAAA,WAAW,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;AACpC,SAAA;AAAM,aAAA;AACN,YAAA,OAAO,OAAO,EAAE;gBACf,IAAI,OAAO,KAAK,CAAC,EAAE;AAClB,oBAAA,OAAO,GAAG,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;oBACxB,SAAS,GAAG,CAAC,SAAS,CAAC;AACvB,iBAAA;gBAED,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;AAC7C,gBAAA,WAAW,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;gBAC1C,OAAO,IAAI,SAAS,CAAC;gBACrB,OAAO,IAAI,SAAS,CAAC;AACrB,aAAA;AACD,SAAA;AACD,KAAA;AAED,IAAA,OAAO,MAAM,CAAC;AACf,CAAC;AAEe,SAAA,UAAU,CAAC,OAAe,EAAE,OAAe,EAAA;AAC1D,IAAA,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC,cAAc,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC,cAAc,EAAE;AACxE,QAAA,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;AACnC,KAAA;IAED,MAAM,OAAO,GAAkB,EAAE,CAAC;IAClC,MAAM,OAAO,GAAkB,EAAE,CAAC;AAClC,IAAA,KACC,IAAI,EAAE,GAAG,CAAC,EACT,EAAE,GAAG,CAAC,EACN,OAAO,GAAG,CAAC,EACX,OAAO,GAAG,CAAC,EACX,SAAS,GAAG,IAAI,EAChB,SAAS,GAAG,IAAI,EACjB,EAAE,GAAG,OAAO,CAAC,MAAM,IAAI,EAAE,GAAG,OAAO,CAAC,MAAM,GAEzC;QACD,IAAI,OAAO,KAAK,CAAC,IAAI,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE;AACzC,YAAA,OAAO,GAAG,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;YACxB,SAAS,GAAG,CAAC,SAAS,CAAC;AACvB,SAAA;QAED,IAAI,OAAO,KAAK,CAAC,IAAI,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE;AACzC,YAAA,OAAO,GAAG,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;YACxB,SAAS,GAAG,CAAC,SAAS,CAAC;AACvB,SAAA;QAED,IAAI,SAAS,IAAI,SAAS,EAAE;AAC3B,YAAA,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;AACpC,YAAA,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;AACrC,YAAA,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;AACrC,YAAA,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;AACpC,YAAA,OAAO,GAAG,OAAO,GAAG,CAAC,CAAC;AACtB,SAAA;AAAM,aAAA,IAAI,SAAS,EAAE;AACrB,YAAA,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;AACpC,YAAA,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;YACrC,OAAO,GAAG,CAAC,CAAC;AACZ,SAAA;AAAM,aAAA,IAAI,SAAS,EAAE;AACrB,YAAA,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;AACrC,YAAA,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;YACpC,OAAO,GAAG,CAAC,CAAC;AACZ,SAAA;AAAM,aAAA;YACN,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;AAC7C,YAAA,WAAW,CAAC,OAAO,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;AACvC,YAAA,WAAW,CAAC,OAAO,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;YACvC,OAAO,IAAI,SAAS,CAAC;YACrB,OAAO,IAAI,SAAS,CAAC;AACrB,SAAA;AACD,KAAA;AAED,IAAA,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;AAC3B;;ACpRA;MACa,IAAI,CAAA;IAuChB,WAAY,CAAA,KAA6B,EAAE,OAAgB,EAAA;AAC1D,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;AACnB,QAAA,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;KACvB;;AAGD,IAAA,IAAI,QAAQ,GAAA;QACX,IAAI,IAAI,GAAG,EAAE,CAAC;AACd,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YAC3C,IAAI,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE;AACtC,gBAAA,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACtB,aAAA;AACD,SAAA;AAED,QAAA,OAAO,IAAI,CAAC;KACZ;AAED;;;;;;;;;;;;;AAaG;IACH,UAAU,GAAA;QACT,MAAM,UAAU,GAAqB,EAAE,CAAC;QACxC,IAAI,SAAS,GAAG,KAAK,CAAC;QACtB,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,IAAI,WAAW,GAAG,CAAC,CAAC;AACpB,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YAC3C,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAC3B,YAAA,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE;gBAC7B,IAAI,IAAI,GAAG,KAAK,EAAE;AACjB,oBAAA,MAAM,IAAI,SAAS,CAAC,gBAAgB,CAAC,CAAC;AACtC,iBAAA;qBAAM,IAAI,IAAI,GAAG,KAAK,EAAE;AACxB,oBAAA,IAAI,SAAS,EAAE;AACd,wBAAA,UAAU,CAAC,IAAI,CAAC,EAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAC,CAAC,CAAC;AAC3D,qBAAA;AAAM,yBAAA;AACN,wBAAA,MAAM,KAAK,GACV,OAAO,IAAI,CAAC,OAAO,KAAK,WAAW;AAClC,8BAAE,SAAS;8BACT,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;wBAC1C,UAAU,CAAC,IAAI,CAAC;AACf,4BAAA,IAAI,EAAE,QAAQ;AACd,4BAAA,KAAK,EAAE,KAAK;AACZ,4BAAA,GAAG,EAAE,IAAI;4BACT,KAAK;AACL,yBAAA,CAAC,CAAC;wBACH,WAAW,GAAG,IAAI,CAAC;AACnB,qBAAA;AACD,iBAAA;gBAED,KAAK,GAAG,IAAI,CAAC;gBACb,SAAS,GAAG,CAAC,SAAS,CAAC;AACvB,aAAA;AAAM,iBAAA;AACN,gBAAA,UAAU,CAAC,IAAI,CAAC,EAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAC,CAAC,CAAC;AAC7D,aAAA;AACD,SAAA;AAED,QAAA,OAAO,UAAU,CAAC;KAClB;AAED,IAAA,KAAK,CAAC,IAAY,EAAA;QACjB,IAAI,KAAK,GAAG,EAAE,CAAC;AACf,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;AACrC,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AAC3C,YAAA,MAAM,EAAE,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;YACzB,QAAQ,EAAE,CAAC,IAAI;AACd,gBAAA,KAAK,QAAQ;AACZ,oBAAA,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC;oBACtC,MAAM;AACP,gBAAA,KAAK,QAAQ;AACZ,oBAAA,KAAK,IAAI,EAAE,CAAC,KAAK,CAAC;oBAClB,MAAM;AACP,aAAA;AACD,SAAA;AAED,QAAA,OAAO,KAAK,CAAC;KACb;;AAGD,IAAA,OAAO,CAAC,IAAU,EAAA;AACjB,QAAA,IAAI,CAAC,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;AACjE,QAAA,IAAI,CAAC,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;;QAEjE,UAAU,GAAGA,MAAQ,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;QAC9C,UAAU,GAAGA,MAAQ,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;AAC9C,QAAA,CAAC,UAAU,EAAE,UAAU,CAAC,GAAGC,UAAY,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;QAChE,UAAU,GAAGD,MAAQ,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;QAC9C,UAAU,GAAGA,MAAQ,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;AAE9C,QAAA;;YAEC,MAAM,SAAS,GAAGE,YAAc,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;YACzD,IAAIC,OAAS,CAAC,SAAS,CAAC,CAAC,cAAc,EAAE;gBACxC,UAAU,GAAGC,MAAQ,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;gBAC7C,SAAS,GAAG,KAAK,CAAC,UAAU,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;gBACpD,UAAU,GAAGA,MAAQ,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;gBAC7C,UAAU,GAAGA,MAAQ,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;gBAC7C,UAAU,GAAGA,MAAQ,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;AAC7C,aAAA;AACD,SAAA;QAED,MAAM,SAAS,GAAGC,KAAO,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;AAClD,QAAA,MAAM,QAAQ,GAAG,WAAW,CAAC,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;AAC3E,QAAA,MAAM,SAAS,GAAGD,MAAQ,CAACC,KAAO,CAAC,UAAU,EAAE,UAAU,CAAC,EAAE,SAAS,CAAC,CAAC;QACvE,MAAM,OAAO,GACZ,QAAQ,IAAI,IAAI,IAAI,QAAQ,IAAI,IAAI;cACjC,WAAW,CAAC,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,CAAC;cACvD,SAAS,CAAC;AACd,QAAA,OAAO,UAAU,CAAC,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,SAAS,EAAE,CAAC;KACvE;IAED,MAAM,GAAA;AACL,QAAA,IAAI,OAAO,IAAI,CAAC,OAAO,KAAK,WAAW,EAAE;AACxC,YAAA,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;AAC1C,SAAA;AAED,QAAA,IAAI,CAAC,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;QAC7D,SAAS,GAAGL,MAAQ,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QAC3C,SAAS,GAAGI,MAAQ,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QAC3C,OAAO,UAAU,CAAC,SAAS,EAAE,OAAQ,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;KAC5D;IAED,SAAS,GAAA;AACR,QAAA,IAAI,OAAO,IAAI,CAAC,OAAO,KAAK,WAAW,EAAE;AACxC,YAAA,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;AAC5C,SAAA;QAED,MAAM,SAAS,GAAkB,EAAE,CAAC;QACpC,MAAM,SAAS,GAAkB,EAAE,CAAC;QACpC,IAAI,QAAQ,GAAG,EAAE,CAAC;QAClB,IAAI,OAAO,GAAG,EAAE,CAAC;AACjB,QAAA,IAAI,SAA6B,CAAC;AAClC,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;AACrC,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AAC3C,YAAA,MAAM,EAAE,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;YACzB,QAAQ,EAAE,CAAC,IAAI;gBACd,KAAK,QAAQ,EAAE;AACd,oBAAA,SAAS,GAAG,EAAE,CAAC,KAAK,CAAC;oBACrB,MAAM;AACN,iBAAA;gBAED,KAAK,QAAQ,EAAE;oBACd,IAAI,SAAS,KAAK,SAAS,EAAE;wBAC5BE,WAAa,CAAC,SAAS,EAAE,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;wBACjD,QAAQ,IAAI,SAAS,CAAC;wBACtB,SAAS,GAAG,SAAS,CAAC;AACtB,qBAAA;AAED,oBAAAA,WAAa,CAAC,SAAS,EAAE,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;AACnD,oBAAAA,WAAa,CAAC,SAAS,EAAE,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;oBACnD,MAAM;AACN,iBAAA;gBAED,KAAK,QAAQ,EAAE;oBACd,MAAM,MAAM,GAAG,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,KAAK,CAAC;AACjC,oBAAA,MAAM,QAAQ,GAAG,EAAE,CAAC,KAAM,CAAC;oBAC3B,IAAI,MAAM,GAAG,CAAC,CAAC;oBACf,IAAI,MAAM,GAAG,CAAC,CAAC;oBACf,IAAI,SAAS,KAAK,SAAS,EAAE;wBAC5B,IAAI,SAAS,KAAK,QAAQ,EAAE;AAC3B,4BAAA,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;AACzB,yBAAA;AAAM,6BAAA;AACN,4BAAA,MAAM,GAAG,kBAAkB,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;AACjD,4BAAA,MAAM,GAAG,kBAAkB,CAC1B,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,EACvB,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CACtB,CAAC;AACF,yBAAA;wBAEDA,WAAa,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;AACxC,wBAAAA,WAAa,CAAC,SAAS,EAAE,SAAS,CAAC,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE,IAAI,CAAC,CAAC;AACnE,wBAAA,QAAQ,IAAI,SAAS,CAAC,KAAK,CAAC,MAAM,EAAE,SAAS,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC;AAC/D,qBAAA;AAED,oBAAA,OAAO,IAAI,QAAQ,CAAC,KAAK,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC;oBAC5DA,WAAa,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;;AAExC,oBAAAA,WAAa,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE,IAAI,CAAC,CAAC;oBACzDA,WAAa,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;AAExC,oBAAAA,WAAa,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE,KAAK,CAAC,CAAC;oBAC1DA,WAAa,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;oBACxC,SAAS,GAAG,SAAS,CAAC;oBACtB,MAAM;AACN,iBAAA;AACD,aAAA;AACD,SAAA;QAED,IAAI,SAAS,KAAK,SAAS,EAAE;YAC5BA,WAAa,CAAC,SAAS,EAAE,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;YACjD,QAAQ,IAAI,SAAS,CAAC;AACtB,SAAA;QAED,OAAO,UAAU,CAAC,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;KAC3D;IAED,iBAAiB,CAAC,KAAa,EAAE,GAAW,EAAA;AAC3C,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;AAC9B,QAAA,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE;YACrB,QAAQ,EAAE,CAAC,IAAI;gBACd,KAAK,QAAQ,EAAE;AACd,oBAAA,IACC,CAAC,KAAK,IAAI,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,KAAK,IAAI,GAAG;AACrC,yBAAC,KAAK,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,EACjC;AACD,wBAAA,OAAO,IAAI,CAAC;AACZ,qBAAA;oBAED,MAAM;AACN,iBAAA;gBACD,KAAK,QAAQ,EAAE;oBACd,IAAI,KAAK,IAAI,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,KAAK,IAAI,GAAG,EAAE;AACzC,wBAAA,OAAO,IAAI,CAAC;AACZ,qBAAA;oBAED,MAAM;AACN,iBAAA;AACD,aAAA;AACD,SAAA;AAED,QAAA,OAAO,KAAK,CAAC;KACb;IAED,OAAO,OAAO,CAAC,KAA0B,EAAA;QACxC,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,IAAI,QAAQ,GAAG,EAAE,CAAC;QAClB,IAAI,OAAO,GAAuB,SAAS,CAAC;QAC5C,MAAM,SAAS,GAAW,EAAE,CAAC;QAC7B,MAAM,SAAS,GAAW,EAAE,CAAC;QAE7B,OAAO;AACN,YAAA,MAAM,CAAC,MAAc,EAAA;gBACpB,IAAI,KAAK,IAAI,IAAI,EAAE;AAClB,oBAAA,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,KAAK,EAAE,MAAM,CAAC,CAAC;AAChD,iBAAA;gBAED,KAAK,IAAI,MAAM,CAAC;gBAChBA,WAAa,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;gBACxCA,WAAa,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;AACxC,gBAAA,OAAO,IAAI,CAAC;aACZ;AAED,YAAA,MAAM,CAAC,MAAc,EAAA;gBACpB,IAAI,KAAK,IAAI,IAAI,EAAE;AAClB,oBAAA,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,KAAK,EAAE,MAAM,CAAC,CAAC;AAChD,oBAAA,OAAO,GAAG,CAAC,OAAO,IAAI,EAAE,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,CAAC,CAAC;AAC/D,iBAAA;gBAED,KAAK,IAAI,MAAM,CAAC;gBAChBA,WAAa,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;gBACxCA,WAAa,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;AACvC,gBAAA,OAAO,IAAI,CAAC;aACZ;AAED,YAAA,MAAM,CAAC,KAAa,EAAA;gBACnBA,WAAa,CAAC,SAAS,EAAE,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;gBAC7C,QAAQ,IAAI,KAAK,CAAC;AAClB,gBAAA,OAAO,IAAI,CAAC;aACZ;AAED,YAAA,MAAM,CAAC,IAAU,EAAA;AAChB,gBAAA,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;AAC9B,gBAAA,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE;oBACrB,QAAQ,EAAE,CAAC,IAAI;AACd,wBAAA,KAAK,QAAQ;4BACZ,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC;4BAC/B,MAAM;AACP,wBAAA,KAAK,QAAQ;AACZ,4BAAA,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;4BACtB,MAAM;AACP,wBAAA,KAAK,QAAQ;4BACZ,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC;4BAC/B,MAAM;AACP,qBAAA;AACD,iBAAA;gBAED,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE;AAC1C,oBAAA,MAAM,IAAI,UAAU,CAAC,oCAAoC,CAAC,CAAC;AAC3D,iBAAA;AAED,gBAAA,OAAO,IAAI,CAAC;aACZ;YAED,KAAK,GAAA;gBACJ,IAAI,KAAK,IAAI,IAAI,EAAE;AAClB,oBAAA,OAAO,GAAG,OAAO,IAAI,EAAE,CAAC;AACxB,oBAAA,IAAI,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE;AACzB,wBAAAA,WAAa,CAAC,SAAS,EAAE,KAAK,CAAC,MAAM,GAAG,KAAK,EAAE,KAAK,CAAC,CAAC;AACtD,wBAAAA,WAAa,CAAC,SAAS,EAAE,KAAK,CAAC,MAAM,GAAG,KAAK,EAAE,KAAK,CAAC,CAAC;AACtD,qBAAA;AACD,iBAAA;gBAED,OAAO,UAAU,CAAC,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;aAC3D;SACD,CAAC;KACF;AAED;;;;;;;;;AASG;AACH,IAAA,OAAO,IAAI,CAAC,KAAa,EAAE,KAAa,EAAE,SAAkB,EAAA;QAC3D,IAAI,MAAM,GAAG,kBAAkB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAC9C,IAAI,MAAM,GAAG,kBAAkB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;;AAE9C,QAAA,IAAI,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE;AAC3D,YAAA,IAAI,SAAS,IAAI,IAAI,IAAI,SAAS,IAAI,CAAC,EAAE;gBACxC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;AACrC,aAAA;;;AAID,YAAA,MAAM,GAAG,kBAAkB,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;AACtE,SAAA;AAED,QAAA,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;aACxB,MAAM,CAAC,MAAM,CAAC;AACd,aAAA,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC;aAClD,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;aACtC,MAAM,CAAC,MAAM,CAAC;AACd,aAAA,KAAK,EAAE,CAAC;KACV;AACD,CAAA;AAED,SAAS,UAAU,CAClB,SAAiB,EACjB,QAAgB,EAChB,SAAiB,EACjB,OAA4B,EAAA;AAE5B,IAAA,IAAIH,OAAS,CAAC,SAAS,CAAC,CAAC,cAAc,KAAK,QAAQ,CAAC,MAAM,EAAE;AAC5D,QAAA,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;AACxE,KAAA;SAAM,IACN,OAAO,KAAK,SAAS;QACrBA,OAAS,CAAC,SAAS,CAAC,CAAC,cAAc,KAAK,OAAO,CAAC,MAAM,EACrD;AACD,QAAA,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;AACvE,KAAA;IAED,MAAM,KAAK,GAA2B,EAAE,CAAC;IACzC,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,IAAI,WAAW,GAAG,IAAI,CAAC;IACvB,KAAK,MAAM,CAAC,MAAM,EAAE,QAAQ,EAAE,SAAS,CAAC,IAAII,KAAO,CAClDP,MAAQ,CAAC,SAAS,EAAE,SAAS,CAAC,EAC9B,SAAS,CACT,EAAE;AACF,QAAA,IAAI,SAAS,EAAE;AACd,YAAA,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,WAAW,EAAE,WAAW,GAAG,MAAM,CAAC,CAAC;AACpE,YAAA,IAAI,KAAK,CAAC,MAAM,IAAI,OAAO,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,QAAQ,EAAE;gBAChE,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,SAAS,CAAC;AACrC,aAAA;AAAM,iBAAA;AACN,gBAAA,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AACtB,aAAA;YAED,WAAW,IAAI,MAAM,CAAC;AACtB,SAAA;AAAM,aAAA;YACN,IAAI,CAAC,QAAQ,EAAE;gBACd,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,GAAG,MAAM,CAAC,CAAC;AAC9C,aAAA;YAED,WAAW,IAAI,MAAM,CAAC;YACtB,WAAW,GAAG,QAAQ,CAAC;AACvB,SAAA;AACD,KAAA;AAED,IAAA,IAAI,WAAW,EAAE;AAChB,QAAA,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;AACxB,KAAA;AAED,IAAA,OAAO,IAAI,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;AACjC,CAAC;AAED,SAAS,MAAM,CAAC,IAAU,EAAA;IACzB,MAAM,SAAS,GAAkB,EAAE,CAAC;IACpC,MAAM,SAAS,GAAkB,EAAE,CAAC;IACpC,IAAI,QAAQ,GAAG,EAAE,CAAC;AAClB,IAAA,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;AACrC,IAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AAC3C,QAAA,MAAM,EAAE,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;QACzB,QAAQ,EAAE,CAAC,IAAI;YACd,KAAK,QAAQ,EAAE;gBACd,MAAM,MAAM,GAAG,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,KAAK,CAAC;gBACjCM,WAAa,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;gBACxCA,WAAa,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;gBACxC,MAAM;AACN,aAAA;YACD,KAAK,QAAQ,EAAE;gBACd,MAAM,MAAM,GAAG,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,KAAK,CAAC;gBACjCA,WAAa,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;gBACxCA,WAAa,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;gBACvC,MAAM;AACN,aAAA;AACD,YAAA,KAAK,QAAQ;AACZ,gBAAAA,WAAa,CAAC,SAAS,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;AAChD,gBAAA,QAAQ,IAAI,EAAE,CAAC,KAAK,CAAC;gBACrB,MAAM;AACP,SAAA;AACD,KAAA;IAED,OAAO,CAAC,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;AACvD,CAAC;AAED;;;;;;;AAOG;AACH,SAAS,WAAW,CACnB,OAAe,EACf,KAAa,EACb,OAAe,EACf,KAAa,EAAA;IAEb,IAAI,EAAE,GAAG,CAAC,CAAC;IACX,IAAI,EAAE,GAAG,CAAC,CAAC;IACX,IAAI,MAAM,GAAG,EAAE,CAAC;AAChB,IAAA,KAAK,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,CAAC,IAAIC,KAAO,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE;QACvE,IAAI,SAAS,IAAI,SAAS,EAAE;AAC3B,YAAA,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;AACvC,SAAA;AAAM,aAAA,IAAI,SAAS,EAAE;YACrB,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,GAAG,MAAM,CAAC,CAAC;YACvC,EAAE,IAAI,MAAM,CAAC;AACb,SAAA;AAAM,aAAA,IAAI,SAAS,EAAE;YACrB,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,GAAG,MAAM,CAAC,CAAC;YACvC,EAAE,IAAI,MAAM,CAAC;AACb,SAAA;AACD,KAAA;AAED,IAAA,OAAO,MAAM,CAAC;AACf,CAAC;AAED;;;;;;;AAOG;AACH,SAAS,KAAK,CAAC,OAAe,EAAE,GAAW,EAAE,OAAe,EAAA;IAC3D,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,IAAI,MAAM,GAAG,EAAE,CAAC;AAChB,IAAA,KAAK,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,CAAC,IAAIA,KAAO,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE;AACvE,QAAA,IAAI,SAAS,EAAE;YACd,IAAI,CAAC,SAAS,EAAE;gBACf,MAAM,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC;AACnC,aAAA;YAED,CAAC,IAAI,MAAM,CAAC;AACZ,SAAA;AAAM,aAAA,IAAI,SAAS,EAAE;AACrB,YAAA,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;AAC3C,SAAA;AACD,KAAA;AAED,IAAA,OAAO,MAAM,CAAC;AACf,CAAC;AAED;AACA,SAAS,kBAAkB,CAAC,KAAa,EAAE,KAAa,EAAA;AACvD,IAAA,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IACpD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE;QAChC,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,EAAE;AAC1B,YAAA,OAAO,CAAC,CAAC;AACT,SAAA;AACD,KAAA;AAED,IAAA,OAAO,MAAM,CAAC;AACf,CAAC;AAED;AACA,SAAS,kBAAkB,CAAC,KAAa,EAAE,KAAa,EAAA;AACvD,IAAA,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC;AAC7B,IAAA,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC;IAC7B,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC1C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE;AAChC,QAAA,IAAI,KAAK,CAAC,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,KAAK,KAAK,CAAC,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE;AACtD,YAAA,OAAO,CAAC,CAAC;AACT,SAAA;AACD,KAAA;AAED,IAAA,OAAO,MAAM,CAAC;AACf;;;;"}
|
package/edit.d.ts
CHANGED
|
@@ -1,4 +1,8 @@
|
|
|
1
|
-
|
|
1
|
+
export interface InsertOperation {
|
|
2
|
+
type: "insert";
|
|
3
|
+
start: number;
|
|
4
|
+
value: string;
|
|
5
|
+
}
|
|
2
6
|
export interface RetainOperation {
|
|
3
7
|
type: "retain";
|
|
4
8
|
start: number;
|
|
@@ -10,45 +14,86 @@ export interface DeleteOperation {
|
|
|
10
14
|
end: number;
|
|
11
15
|
value: string | undefined;
|
|
12
16
|
}
|
|
13
|
-
export
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
+
export type Operation = RetainOperation | DeleteOperation | InsertOperation;
|
|
18
|
+
export interface EditBuilder {
|
|
19
|
+
retain(length: number): EditBuilder;
|
|
20
|
+
delete(length: number): EditBuilder;
|
|
21
|
+
insert(value: string): EditBuilder;
|
|
22
|
+
concat(edit: Edit): EditBuilder;
|
|
23
|
+
build(): Edit;
|
|
17
24
|
}
|
|
18
|
-
|
|
19
|
-
/**
|
|
20
|
-
* A data structure which represents edits to strings.
|
|
21
|
-
*/
|
|
25
|
+
/** A compact data structure for representing changes to strings. */
|
|
22
26
|
export declare class Edit {
|
|
23
|
-
/**
|
|
27
|
+
/**
|
|
28
|
+
* An array of strings and integers representing operations.
|
|
29
|
+
*
|
|
30
|
+
* Strings represent insertions, and pairs of integers represent the start
|
|
31
|
+
* and end indices of retained segments. Deletions are implied by gaps
|
|
32
|
+
* between the retained segments.
|
|
33
|
+
*
|
|
34
|
+
* Examples:
|
|
35
|
+
*
|
|
36
|
+
* [0, 3, 7, 10]
|
|
37
|
+
* retain 0-3, delete 3-7, retain 7-10
|
|
38
|
+
*
|
|
39
|
+
* ["hello", 0, 10]
|
|
40
|
+
* insert "hello", retain 0-10
|
|
41
|
+
*
|
|
42
|
+
* [0, 5, " ", 6, 10]
|
|
43
|
+
* retain 0-5, insert " ", delete 5-6, retain 6-10
|
|
44
|
+
*
|
|
45
|
+
* If the edit includes a delete operation at its end, this is signified by
|
|
46
|
+
* an extra number signifying the length. Therefore, regardless of whether or
|
|
47
|
+
* not the last character of the string is retained, the last number will
|
|
48
|
+
* always represent the length of the original string.
|
|
49
|
+
*
|
|
50
|
+
* // retain 0-10, delete 10-11
|
|
51
|
+
* [0, 10, 11]
|
|
52
|
+
*
|
|
53
|
+
* An edit that is only retains will contain a single number representing the
|
|
54
|
+
* length of the string.
|
|
55
|
+
*/
|
|
24
56
|
parts: Array<string | number>;
|
|
25
57
|
/**
|
|
26
58
|
* A string which represents a concatenation of all deletions.
|
|
27
59
|
*
|
|
28
|
-
* This property
|
|
60
|
+
* This property is optional, but required if you want to invert the edit.
|
|
29
61
|
*/
|
|
30
62
|
deleted: string | undefined;
|
|
31
63
|
constructor(parts: Array<string | number>, deleted?: string);
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
/**
|
|
35
|
-
* Given two strings, this method finds an edit which can be applied to the
|
|
36
|
-
* first string to result in the second.
|
|
37
|
-
* An optional hint can be provided to disambiguate edits when they are made
|
|
38
|
-
* to overlapping characters.
|
|
39
|
-
*/
|
|
40
|
-
static diff(text1: string, text2: string, hint?: number): Edit;
|
|
64
|
+
/** A string which represents a concatenation of all insertions. */
|
|
65
|
+
get inserted(): string;
|
|
41
66
|
/**
|
|
42
|
-
*
|
|
67
|
+
* Returns an array of operations, which is more readable than the parts
|
|
68
|
+
* array.
|
|
69
|
+
*
|
|
70
|
+
* new Edit([0, 1, " ", 2], "x").operations();
|
|
71
|
+
* [
|
|
72
|
+
* {type: "retain", start: 0, end: 1},
|
|
73
|
+
* {type: "insert", start: 1, value: " "},
|
|
74
|
+
* {type: "delete", start: 1, end: 2, value: "x"},
|
|
75
|
+
* ]
|
|
76
|
+
*
|
|
77
|
+
* When insertions and deletions happen at the same index, insertions will
|
|
78
|
+
* always appear before deletions in the operations array.
|
|
43
79
|
*/
|
|
44
|
-
get inserted(): string;
|
|
45
80
|
operations(): Array<Operation>;
|
|
46
81
|
apply(text: string): string;
|
|
47
|
-
|
|
82
|
+
/** Composes two consecutive edits. */
|
|
83
|
+
compose(that: Edit): Edit;
|
|
84
|
+
invert(): Edit;
|
|
48
85
|
normalize(): Edit;
|
|
86
|
+
hasChangesBetween(start: number, end: number): boolean;
|
|
87
|
+
static builder(value?: string | undefined): EditBuilder;
|
|
49
88
|
/**
|
|
50
|
-
*
|
|
89
|
+
* Given two strings, this method finds an edit which can be applied to the
|
|
90
|
+
* first string to result in the second.
|
|
91
|
+
*
|
|
92
|
+
* @param startHint - An optional hint can be provided to disambiguate edits
|
|
93
|
+
* which cannot be inferred by comparing the text alone. For example,
|
|
94
|
+
* inserting "a" into the string "aaaa" to make it "aaaaa" could be an
|
|
95
|
+
* insertion at any index in the string. This value should be the smaller of
|
|
96
|
+
* the start indices of the selection from before and after the edit.
|
|
51
97
|
*/
|
|
52
|
-
|
|
53
|
-
invert(): Edit;
|
|
98
|
+
static diff(text1: string, text2: string, startHint?: number): Edit;
|
|
54
99
|
}
|