🎩 You're Invited:Meet the Socket team at Black Hat in Las Vegas, August 3-6.RSVP
Sign In

prosemirror-changeset

Package Overview
Dependencies
Maintainers
1
Versions
26
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

prosemirror-changeset - npm Package Compare versions

Comparing version
2.2.0
to
2.2.1
+118
dist/index.d.cts
import { Node } from 'prosemirror-model';
import { StepMap } from 'prosemirror-transform';
/**
Stores metadata for a part of a change.
*/
declare class Span<Data = any> {
/**
The length of this span.
*/
readonly length: number;
/**
The data associated with this span.
*/
readonly data: Data;
}
/**
A replaced range with metadata associated with it.
*/
declare class Change<Data = any> {
/**
The start of the range deleted/replaced in the old document.
*/
readonly fromA: number;
/**
The end of the range in the old document.
*/
readonly toA: number;
/**
The start of the range inserted in the new document.
*/
readonly fromB: number;
/**
The end of the range in the new document.
*/
readonly toB: number;
/**
Data associated with the deleted content. The length of these
spans adds up to `this.toA - this.fromA`.
*/
readonly deleted: readonly Span<Data>[];
/**
Data associated with the inserted content. Length adds up to
`this.toB - this.toA`.
*/
readonly inserted: readonly Span<Data>[];
/**
This merges two changesets (the end document of x should be the
start document of y) into a single one spanning the start of x to
the end of y.
*/
static merge<Data>(x: readonly Change<Data>[], y: readonly Change<Data>[], combine: (dataA: Data, dataB: Data) => Data): readonly Change<Data>[];
}
/**
Simplifies a set of changes for presentation. This makes the
assumption that having both insertions and deletions within a word
is confusing, and, when such changes occur without a word boundary
between them, they should be expanded to cover the entire set of
words (in the new document) they touch. An exception is made for
single-character replacements.
*/
declare function simplifyChanges(changes: readonly Change[], doc: Node): Change<any>[];
/**
A change set tracks the changes to a document from a given point
in the past. It condenses a number of step maps down to a flat
sequence of replacements, and simplifies replacments that
partially undo themselves by comparing their content.
*/
declare class ChangeSet<Data = any> {
/**
Replaced regions.
*/
readonly changes: readonly Change<Data>[];
/**
Computes a new changeset by adding the given step maps and
metadata (either as an array, per-map, or as a single value to be
associated with all maps) to the current set. Will not mutate the
old set.
Note that due to simplification that happens after each add,
incrementally adding steps might create a different final set
than adding all those changes at once, since different document
tokens might be matched during simplification depending on the
boundaries of the current changed ranges.
*/
addSteps(newDoc: Node, maps: readonly StepMap[], data: Data | readonly Data[]): ChangeSet<Data>;
/**
The starting document of the change set.
*/
get startDoc(): Node;
/**
Map the span's data values in the given set through a function
and construct a new set with the resulting data.
*/
map(f: (range: Span<Data>) => Data): ChangeSet<Data>;
/**
Compare two changesets and return the range in which they are
changed, if any. If the document changed between the maps, pass
the maps for the steps that changed it as second argument, and
make sure the method is called on the old set and passed the new
set. The returned positions will be in new document coordinates.
*/
changedRange(b: ChangeSet, maps?: readonly StepMap[]): {
from: number;
to: number;
} | null;
/**
Create a changeset with the given base object and configuration.
The `combine` function is used to compare and combine metadata—it
should return null when metadata isn't compatible, and a combined
version for a merged range when it is.
*/
static create<Data = any>(doc: Node, combine?: (dataA: Data, dataB: Data) => Data): ChangeSet<Data>;
}
export { Change, ChangeSet, Span, simplifyChanges };
+6
-0

@@ -0,1 +1,7 @@

## 2.2.1 (2023-05-17)
### Bug fixes
Include CommonJS type declarations in the package to please new TypeScript resolution settings.
## 2.2.0 (2022-05-30)

@@ -2,0 +8,0 @@

+1
-1

@@ -1,2 +0,2 @@

Copyright (C) 2017 by Marijn Haverbeke <marijnh@gmail.com> and others
Copyright (C) 2017 by Marijn Haverbeke <marijn@haverbeke.berlin> and others

@@ -3,0 +3,0 @@ Permission is hereby granted, free of charge, to any person obtaining a copy

{
"name": "prosemirror-changeset",
"version": "2.2.0",
"version": "2.2.1",
"description": "Distills a series of editing steps into deleted and added ranges",

@@ -18,3 +18,3 @@ "type": "module",

"name": "Marijn Haverbeke",
"email": "marijnh@gmail.com",
"email": "marijn@haverbeke.berlin",
"web": "http://marijnhaverbeke.nl"

@@ -21,0 +21,0 @@ }

// Convert the given range of a fragment to tokens, where node open
// tokens are encoded as strings holding the node name, characters as
// their character code, and node close tokens as -1.
function tokens(frag, start, end, target) {
for (var i = 0, off = 0; i < frag.childCount; i++) {
var child = frag.child(i), endOff = off + child.nodeSize;
var from = Math.max(off, start), to = Math.min(endOff, end);
if (from < to) {
if (child.isText) {
for (var j = from; j < to; j++) { target.push(child.text.charCodeAt(j - off)); }
} else if (child.isLeaf) {
target.push(child.type.name);
} else {
if (from == off) { target.push(child.type.name); }
tokens(child.content, Math.max(off + 1, from) - off - 1, Math.min(endOff - 1, to) - off - 1, target);
if (to == endOff) { target.push(-1); }
}
}
off = endOff;
}
return target
}
// The code below will refuse to compute a diff with more than 5000
// insertions or deletions, which takes about 300ms to reach on my
// machine. This is a safeguard against runaway computations.
var MAX_DIFF_SIZE = 5000;
// This obscure mess of constants computes the minimum length of an
// unchanged range (not at the start/end of the compared content). The
// idea is to make it higher in bigger replacements, so that you don't
// get a diff soup of coincidentally identical letters when replacing
// a paragraph.
function minUnchanged(sizeA, sizeB) {
return Math.min(15, Math.max(2, Math.floor(Math.max(sizeA, sizeB) / 10)))
}
// : (Fragment, Fragment, Change) → [Change]
function computeDiff(fragA, fragB, range) {
var tokA = tokens(fragA, range.fromA, range.toA, []);
var tokB = tokens(fragB, range.fromB, range.toB, []);
// Scan from both sides to cheaply eliminate work
var start = 0, endA = tokA.length, endB = tokB.length;
while (start < tokA.length && start < tokB.length && tokA[start] === tokB[start]) { start++; }
if (start == tokA.length && start == tokB.length) { return [] }
while (endA > start && endB > start && tokA[endA - 1] === tokB[endB - 1]) { endA--, endB--; }
// If the result is simple _or_ too big to cheaply compute, return
// the remaining region as the diff
if (endA == start || endB == start || (endA == endB && endA == start + 1))
{ return [range.slice(start, endA, start, endB)] }
// This is an implementation of Myers' diff algorithm
// See https://neil.fraser.name/writing/diff/myers.pdf and
// https://blog.jcoglan.com/2017/02/12/the-myers-diff-algorithm-part-1/
var lenA = endA - start, lenB = endB - start;
var max = Math.min(MAX_DIFF_SIZE, lenA + lenB), off = max + 1;
var history = [];
var frontier = [];
for (var len = off * 2, i = 0; i < len; i++) { frontier[i] = -1; }
for (var size = 0; size <= max; size++) {
for (var diag = -size; diag <= size; diag += 2) {
var next = frontier[diag + 1 + max], prev = frontier[diag - 1 + max];
var x = next < prev ? prev : next + 1, y = x + diag;
while (x < lenA && y < lenB && tokA[start + x] === tokB[start + y]) { x++, y++; }
frontier[diag + max] = x;
// Found a match
if (x >= lenA && y >= lenB) {
// Trace back through the history to build up a set of changed ranges.
var diff = [], minSpan = minUnchanged(endA - start, endB - start);
// Used to add steps to a diff one at a time, back to front, merging
// ones that are less than minSpan tokens apart
var fromA = -1, toA = -1, fromB = -1, toB = -1;
var add = function (fA, tA, fB, tB) {
if (fromA > -1 && fromA < tA + minSpan) {
fromA = fA; fromB = fB;
} else {
if (fromA > -1)
{ diff.push(range.slice(fromA, toA, fromB, toB)); }
fromA = fA; toA = tA;
fromB = fB; toB = tB;
}
};
for (var i$1 = size - 1; i$1 >= 0; i$1--) {
var next$1 = frontier[diag + 1 + max], prev$1 = frontier[diag - 1 + max];
if (next$1 < prev$1) { // Deletion
diag--;
x = prev$1 + start; y = x + diag;
add(x, x, y, y + 1);
} else { // Insertion
diag++;
x = next$1 + start; y = x + diag;
add(x, x + 1, y, y);
}
frontier = history[i$1 >> 1];
}
if (fromA > -1) { diff.push(range.slice(fromA, toA, fromB, toB)); }
return diff.reverse()
}
}
// Since only either odd or even diagonals are read from each
// frontier, we only copy them every other iteration.
if (size % 2 == 0) { history.push(frontier.slice()); }
}
// The loop exited, meaning the maximum amount of work was done.
// Just return a change spanning the entire range.
return [range.slice(start, endA, start, endB)]
}
// ::- Stores metadata for a part of a change.
var Span = function Span(length, data) {
// :: number
this.length = length;
// :: any
this.data = data;
};
Span.prototype.cut = function cut (length) {
return length == this.length ? this : new Span(length, this.data)
};
Span.slice = function slice (spans, from, to) {
if (from == to) { return Span.none }
if (from == 0 && to == Span.len(spans)) { return spans }
var result = [];
for (var i = 0, off = 0; off < to; i++) {
var span = spans[i], end = off + span.length;
var overlap = Math.min(to, end) - Math.max(from, off);
if (overlap > 0) { result.push(span.cut(overlap)); }
off = end;
}
return result
};
Span.join = function join (a, b, combine) {
if (a.length == 0) { return b }
if (b.length == 0) { return a }
var combined = combine(a[a.length - 1].data, b[0].data);
if (combined == null) { return a.concat(b) }
var result = a.slice(0, a.length - 1);
result.push(new Span(a[a.length - 1].length + b[0].length, combined));
for (var i = 1; i < b.length; i++) { result.push(b[i]); }
return result
};
Span.len = function len (spans) {
var len = 0;
for (var i = 0; i < spans.length; i++) { len += spans[i].length; }
return len
};
Span.none = [];
// ::- A replaced range with metadata associated with it.
var Change = function Change(fromA, toA, fromB, toB, deleted, inserted) {
// :: number The start of the range deleted/replaced in the old
// document.
this.fromA = fromA;
// :: number The end of the range in the old document.
this.toA = toA;
// :: number The start of the range inserted in the new document.
this.fromB = fromB;
// :: number The end of the range in the new document.
this.toB = toB;
// :: [Span] Data associated with the deleted content. The length
// of these spans adds up to `this.toA - this.fromA`.
this.deleted = deleted;
// :: [Span] Data associated with the inserted content. Length
// adds up to `this.toB - this.toA`.
this.inserted = inserted;
};
var prototypeAccessors$1 = { lenA: { configurable: true },lenB: { configurable: true } };
prototypeAccessors$1.lenA.get = function () { return this.toA - this.fromA };
prototypeAccessors$1.lenB.get = function () { return this.toB - this.fromB };
Change.prototype.slice = function slice (startA, endA, startB, endB) {
if (startA == 0 && startB == 0 && endA == this.toA - this.fromA &&
endB == this.toB - this.fromB) { return this }
return new Change(this.fromA + startA, this.fromA + endA,
this.fromB + startB, this.fromB + endB,
Span.slice(this.deleted, startA, endA),
Span.slice(this.inserted, startB, endB))
};
// : ([Change], [Change], (any, any) → any) → [Change]
// This merges two changesets (the end document of x should be the
// start document of y) into a single one spanning the start of x to
// the end of y.
Change.merge = function merge (x, y, combine) {
if (x.length == 0) { return y }
if (y.length == 0) { return x }
var result = [];
// Iterate over both sets in parallel, using the middle coordinate
// system (B in x, A in y) to synchronize.
for (var iX = 0, iY = 0, curX = x[0], curY = y[0];;) {
if (!curX && !curY) {
return result
} else if (curX && (!curY || curX.toB < curY.fromA)) { // curX entirely in front of curY
var off = iY ? y[iY - 1].toB - y[iY - 1].toA : 0;
result.push(off == 0 ? curX :
new Change(curX.fromA, curX.toA, curX.fromB + off, curX.toB + off,
curX.deleted, curX.inserted));
curX = iX++ == x.length ? null : x[iX];
} else if (curY && (!curX || curY.toA < curX.fromB)) { // curY entirely in front of curX
var off$1 = iX ? x[iX - 1].toB - x[iX - 1].toA : 0;
result.push(off$1 == 0 ? curY :
new Change(curY.fromA - off$1, curY.toA - off$1, curY.fromB, curY.toB,
curY.deleted, curY.inserted));
curY = iY++ == y.length ? null : y[iY];
} else { // Touch, need to merge
// The rules for merging ranges are that deletions from the
// old set and insertions from the new are kept. Areas of the
// middle document covered by a but not by b are insertions
// from a that need to be added, and areas covered by b but
// not a are deletions from b that need to be added.
var pos = Math.min(curX.fromB, curY.fromA);
var fromA = Math.min(curX.fromA, curY.fromA - (iX ? x[iX - 1].toB - x[iX - 1].toA : 0)), toA = fromA;
var fromB = Math.min(curY.fromB, curX.fromB + (iY ? y[iY - 1].toB - y[iY - 1].toA : 0)), toB = fromB;
var deleted = Span.none, inserted = Span.none;
// Used to prevent appending ins/del range for the same Change twice
var enteredX = false, enteredY = false;
// Need to have an inner loop since any number of further
// ranges might be touching this group
for (;;) {
var nextX = !curX ? 2e8 : pos >= curX.fromB ? curX.toB : curX.fromB;
var nextY = !curY ? 2e8 : pos >= curY.fromA ? curY.toA : curY.fromA;
var next = Math.min(nextX, nextY);
var inX = curX && pos >= curX.fromB, inY = curY && pos >= curY.fromA;
if (!inX && !inY) { break }
if (inX && pos == curX.fromB && !enteredX) {
deleted = Span.join(deleted, curX.deleted, combine);
toA += curX.lenA;
enteredX = true;
}
if (inX && !inY) {
inserted = Span.join(inserted, Span.slice(curX.inserted, pos - curX.fromB, next - curX.fromB), combine);
toB += next - pos;
}
if (inY && pos == curY.fromA && !enteredY) {
inserted = Span.join(inserted, curY.inserted, combine);
toB += curY.lenB;
enteredY = true;
}
if (inY && !inX) {
deleted = Span.join(deleted, Span.slice(curY.deleted, pos - curY.fromA, next - curY.fromA), combine);
toA += next - pos;
}
if (inX && next == curX.toB) {
curX = iX++ == x.length ? null : x[iX];
enteredX = false;
}
if (inY && next == curY.toA) {
curY = iY++ == y.length ? null : y[iY];
enteredY = false;
}
pos = next;
}
if (fromA < toA || fromB < toB)
{ result.push(new Change(fromA, toA, fromB, toB, deleted, inserted)); }
}
}
};
Object.defineProperties( Change.prototype, prototypeAccessors$1 );
var letter;
// If the runtime support unicode properties in regexps, that's a good
// source of info on whether something is a letter.
try { letter = new RegExp("[\\p{Alphabetic}_]", "u"); } catch(_) {}
// Otherwise, we see if the character changes when upper/lowercased,
// or if it is part of these common single-case scripts.
var nonASCIISingleCaseWordChar = /[\u00df\u0587\u0590-\u05f4\u0600-\u06ff\u3040-\u309f\u30a0-\u30ff\u3400-\u4db5\u4e00-\u9fcc\uac00-\ud7af]/;
function isLetter(code) {
if (code < 128)
{ return code >= 48 && code <= 57 || code >= 65 && code <= 90 || code >= 79 && code <= 122 }
var ch = String.fromCharCode(code);
if (letter) { return letter.test(ch) }
return ch.toUpperCase() != ch.toLowerCase() || nonASCIISingleCaseWordChar.test(ch)
}
// Convert a range of document into a string, so that we can easily
// access characters at a given position. Treat non-text tokens as
// spaces so that they aren't considered part of a word.
function getText(frag, start, end) {
var out = "";
function convert(frag, start, end) {
for (var i = 0, off = 0; i < frag.childCount; i++) {
var child = frag.child(i), endOff = off + child.nodeSize;
var from = Math.max(off, start), to = Math.min(endOff, end);
if (from < to) {
if (child.isText) {
out += child.text.slice(Math.max(0, start - off), Math.min(child.text.length, end - off));
} else if (child.isLeaf) {
out += " ";
} else {
if (from == off) { out += " "; }
convert(child.content, Math.max(0, from - off - 1), Math.min(child.content.size, end - off));
if (to == endOff) { out += " "; }
}
}
off = endOff;
}
}
convert(frag, start, end);
return out
}
// The distance changes have to be apart for us to not consider them
// candidates for merging.
var MAX_SIMPLIFY_DISTANCE = 30;
// :: ([Change], Node) → [Change]
// Simplifies a set of changes for presentation. This makes the
// assumption that having both insertions and deletions within a word
// is confusing, and, when such changes occur without a word boundary
// between them, they should be expanded to cover the entire set of
// words (in the new document) they touch. An exception is made for
// single-character replacements.
function simplifyChanges(changes, doc) {
var result = [];
for (var i = 0; i < changes.length; i++) {
var end = changes[i].toB, start = i;
while (i < changes.length - 1 && changes[i + 1].fromB <= end + MAX_SIMPLIFY_DISTANCE)
{ end = changes[++i].toB; }
simplifyAdjacentChanges(changes, start, i + 1, doc, result);
}
return result
}
function simplifyAdjacentChanges(changes, from, to, doc, target) {
var start = Math.max(0, changes[from].fromB - MAX_SIMPLIFY_DISTANCE);
var end = Math.min(doc.content.size, changes[to - 1].toB + MAX_SIMPLIFY_DISTANCE);
var text = getText(doc.content, start, end);
for (var i = from; i < to; i++) {
var startI = i, last = changes[i], deleted = last.lenA, inserted = last.lenB;
while (i < to - 1) {
var next = changes[i + 1], boundary = false;
var prevLetter = last.toB == end ? false : isLetter(text.charCodeAt(last.toB - 1 - start));
for (var pos = last.toB; !boundary && pos < next.fromB; pos++) {
var nextLetter = pos == end ? false : isLetter(text.charCodeAt(pos - start));
if ((!prevLetter || !nextLetter) && pos != changes[startI].fromB) { boundary = true; }
prevLetter = nextLetter;
}
if (boundary) { break }
deleted += next.lenA; inserted += next.lenB;
last = next;
i++;
}
if (inserted > 0 && deleted > 0 && !(inserted == 1 && deleted == 1)) {
var from$1 = changes[startI].fromB, to$1 = changes[i].toB;
if (from$1 < end && isLetter(text.charCodeAt(from$1 - start)))
{ while (from$1 > start && isLetter(text.charCodeAt(from$1 - 1 - start))) { from$1--; } }
if (to$1 > start && isLetter(text.charCodeAt(to$1 - 1 - start)))
{ while (to$1 < end && isLetter(text.charCodeAt(to$1 - start))) { to$1++; } }
var joined = fillChange(changes.slice(startI, i + 1), from$1, to$1);
var last$1 = target.length ? target[target.length - 1] : null;
if (last$1 && last$1.toA == joined.fromA)
{ target[target.length - 1] = new Change(last$1.fromA, joined.toA, last$1.fromB, joined.toB,
last$1.deleted.concat(joined.deleted), last$1.inserted.concat(joined.inserted)); }
else
{ target.push(joined); }
} else {
for (var j = startI; j <= i; j++) { target.push(changes[j]); }
}
}
return changes
}
function combine(a, b) { return a === b ? a : null }
function fillChange(changes, fromB, toB) {
var fromA = changes[0].fromA - (changes[0].fromB - fromB);
var last = changes[changes.length - 1];
var toA = last.toA + (toB - last.toB);
var deleted = Span.none, inserted = Span.none;
var delData = (changes[0].deleted.length ? changes[0].deleted : changes[0].inserted)[0].data;
var insData = (changes[0].inserted.length ? changes[0].inserted : changes[0].deleted)[0].data;
for (var posA = fromA, posB = fromB, i = 0;; i++) {
var next = i == changes.length ? null : changes[i];
var endA = next ? next.fromA : toA, endB = next ? next.fromB : toB;
if (endA > posA) { deleted = Span.join(deleted, [new Span(endA - posA, delData)], combine); }
if (endB > posB) { inserted = Span.join(inserted, [new Span(endB - posB, insData)], combine); }
if (!next) { break }
deleted = Span.join(deleted, next.deleted, combine);
inserted = Span.join(inserted, next.inserted, combine);
if (deleted.length) { delData = deleted[deleted.length - 1].data; }
if (inserted.length) { insData = inserted[inserted.length - 1].data; }
posA = next.toA; posB = next.toB;
}
return new Change(fromA, toA, fromB, toB, deleted, inserted)
}
// ::- A change set tracks the changes to a document from a given
// point in the past. It condenses a number of step maps down to a
// flat sequence of replacements, and simplifies replacments that
// partially undo themselves by comparing their content.
var ChangeSet = function ChangeSet(config, changes) {
this.config = config;
// :: [Change] Replaced regions.
this.changes = changes;
};
var prototypeAccessors = { startDoc: { configurable: true } };
// :: (Node, [StepMap], union<[any], any>) → ChangeSet
// Computes a new changeset by adding the given step maps and
// metadata (either as an array, per-map, or as a single value to be
// associated with all maps) to the current set. Will not mutate the
// old set.
//
// Note that due to simplification that happens after each add,
// incrementally adding steps might create a different final set
// than adding all those changes at once, since different document
// tokens might be matched during simplification depending on the
// boundaries of the current changed ranges.
ChangeSet.prototype.addSteps = function addSteps (newDoc, maps, data) {
var this$1$1 = this;
// This works by inspecting the position maps for the changes,
// which indicate what parts of the document were replaced by new
// content, and the size of that new content. It uses these to
// build up Change objects.
//
// These change objects are put in sets and merged together using
// Change.merge, giving us the changes created by the new steps.
// Those changes can then be merged with the existing set of
// changes.
//
// For each change that was touched by the new steps, we recompute
// a diff to try to minimize the change by dropping matching
// pieces of the old and new document from the change.
var stepChanges = [];
// Add spans for new steps.
var loop = function ( i ) {
var d = Array.isArray(data) ? data[i] : data;
var off = 0;
maps[i].forEach(function (fromA, toA, fromB, toB) {
stepChanges.push(new Change(fromA + off, toA + off, fromB, toB,
fromA == toA ? Span.none : [new Span(toA - fromA, d)],
fromB == toB ? Span.none : [new Span(toB - fromB, d)]));
off = (toB - fromB) - (toA - fromA);
});
};
for (var i = 0; i < maps.length; i++) loop( i );
if (stepChanges.length == 0) { return this }
var newChanges = mergeAll(stepChanges, this.config.combine);
var changes = Change.merge(this.changes, newChanges, this.config.combine);
// Minimize changes when possible
var loop$1 = function ( i$2 ) {
var change = changes[i$2];
if (change.fromA == change.toA || change.fromB == change.toB ||
// Only look at changes that touch newly added changed ranges
!newChanges.some(function (r) { return r.toB > change.fromB && r.fromB < change.toB; })) { return }
var diff = computeDiff(this$1$1.config.doc.content, newDoc.content, change);
// Fast path: If they are completely different, don't do anything
if (diff.length == 1 && diff[0].fromB == 0 && diff[0].toB == change.toB - change.fromB)
{ return }
if (diff.length == 1) {
changes[i$2] = diff[0];
} else {
changes.splice.apply(changes, [ i$2, 1 ].concat( diff ));
i$2 += diff.length - 1;
}
i$1 = i$2;
};
for (var i$1 = 0; i$1 < changes.length; i$1++) loop$1( i$1 );
return new ChangeSet(this.config, changes)
};
// :: Node
// The starting document of the change set.
prototypeAccessors.startDoc.get = function () { return this.config.doc };
// :: (f: (range: Change) → any) → ChangeSet
// Map the span's data values in the given set through a function
// and construct a new set with the resulting data.
ChangeSet.prototype.map = function map (f) {
return new ChangeSet(this.config, this.changes.map(function (change) {
var data = f(change);
return data === change.data ? change :
new Change(change.fromA, change.toA, change.fromB, change.toB, data)
}))
};
// :: (ChangeSet, ?[StepMap]) → ?{from: number, to: number}
// Compare two changesets and return the range in which they are
// changed, if any. If the document changed between the maps, pass
// the maps for the steps that changed it as second argument, and
// make sure the method is called on the old set and passed the new
// set. The returned positions will be in new document coordinates.
ChangeSet.prototype.changedRange = function changedRange (b, maps) {
if (b == this) { return null }
var touched = maps && touchedRange(maps);
var moved = touched ? (touched.toB - touched.fromB) - (touched.toA - touched.fromA) : 0;
function map(p) {
return !touched || p <= touched.fromA ? p : p + moved
}
var from = touched ? touched.fromB : 2e8, to = touched ? touched.toB : -2e8;
function add(start, end) {
if ( end === void 0 ) end = start;
from = Math.min(start, from); to = Math.max(end, to);
}
var rA = this.changes, rB = b.changes;
for (var iA = 0, iB = 0; iA < rA.length && iB < rB.length;) {
var rangeA = rA[iA], rangeB = rB[iB];
if (rangeA && rangeB && sameRanges(rangeA, rangeB, map)) { iA++; iB++; }
else if (rangeB && (!rangeA || map(rangeA.fromB) >= rangeB.fromB)) { add(rangeB.fromB, rangeB.toB); iB++; }
else { add(map(rangeA.fromB), map(rangeA.toB)); iA++; }
}
return from <= to ? {from: from, to: to} : null
};
// :: (Node, ?(a: any, b: any) → any) → ChangeSet
// Create a changeset with the given base object and configuration.
// The `combine` function is used to compare and combine metadata—it
// should return null when metadata isn't compatible, and a combined
// version for a merged range when it is.
ChangeSet.create = function create (doc, combine) {
if ( combine === void 0 ) combine = function (a, b) { return a === b ? a : null; };
return new ChangeSet({combine: combine, doc: doc}, [], [])
};
Object.defineProperties( ChangeSet.prototype, prototypeAccessors );
// Exported for testing
ChangeSet.computeDiff = computeDiff;
// : ([[Change]], (any, any) → any, number, number) → [Change]
// Divide-and-conquer approach to merging a series of ranges.
function mergeAll(ranges, combine, start, end) {
if ( start === void 0 ) start = 0;
if ( end === void 0 ) end = ranges.length;
if (end == start + 1) { return [ranges[start]] }
var mid = (start + end) >> 1;
return Change.merge(mergeAll(ranges, combine, start, mid),
mergeAll(ranges, combine, mid, end), combine)
}
function endRange(maps) {
var from = 2e8, to = -2e8;
for (var i = 0; i < maps.length; i++) {
var map = maps[i];
if (from != 2e8) {
from = map.map(from, -1);
to = map.map(to, 1);
}
map.forEach(function (_s, _e, start, end) {
from = Math.min(from, start);
to = Math.max(to, end);
});
}
return from == 2e8 ? null : {from: from, to: to}
}
function touchedRange(maps) {
var b = endRange(maps);
if (!b) { return null }
var a = endRange(maps.map(function (m) { return m.invert(); }).reverse());
return {fromA: a.from, toA: a.to, fromB: b.from, toB: b.to}
}
function sameRanges(a, b, map) {
return map(a.fromB) == b.fromB && map(a.toB) == b.toB &&
sameSpans(a.deleted, b.deleted) && sameSpans(a.inserted, b.inserted)
}
function sameSpans(a, b) {
if (a.length != b.length) { return false }
for (var i = 0; i < a.length; i++)
{ if (a[i].length != b[i].length || a[i].data !== b[i].data) { return false } }
return true
}
export { Change, ChangeSet, Span, simplifyChanges };
//# sourceMappingURL=index.es.js.map
{"version":3,"file":"index.es.js","sources":["../src/diff.js","../src/change.js","../src/simplify.js","../src/changeset.js"],"sourcesContent":["// Convert the given range of a fragment to tokens, where node open\n// tokens are encoded as strings holding the node name, characters as\n// their character code, and node close tokens as -1.\nfunction tokens(frag, start, end, target) {\n for (let i = 0, off = 0; i < frag.childCount; i++) {\n let child = frag.child(i), endOff = off + child.nodeSize\n let from = Math.max(off, start), to = Math.min(endOff, end)\n if (from < to) {\n if (child.isText) {\n for (let j = from; j < to; j++) target.push(child.text.charCodeAt(j - off))\n } else if (child.isLeaf) {\n target.push(child.type.name)\n } else {\n if (from == off) target.push(child.type.name)\n tokens(child.content, Math.max(off + 1, from) - off - 1, Math.min(endOff - 1, to) - off - 1, target)\n if (to == endOff) target.push(-1)\n }\n }\n off = endOff\n }\n return target\n}\n\n// The code below will refuse to compute a diff with more than 5000\n// insertions or deletions, which takes about 300ms to reach on my\n// machine. This is a safeguard against runaway computations.\nconst MAX_DIFF_SIZE = 5000\n\n// This obscure mess of constants computes the minimum length of an\n// unchanged range (not at the start/end of the compared content). The\n// idea is to make it higher in bigger replacements, so that you don't\n// get a diff soup of coincidentally identical letters when replacing\n// a paragraph.\nfunction minUnchanged(sizeA, sizeB) {\n return Math.min(15, Math.max(2, Math.floor(Math.max(sizeA, sizeB) / 10)))\n}\n\n// : (Fragment, Fragment, Change) → [Change]\nexport function computeDiff(fragA, fragB, range) {\n let tokA = tokens(fragA, range.fromA, range.toA, [])\n let tokB = tokens(fragB, range.fromB, range.toB, [])\n\n // Scan from both sides to cheaply eliminate work\n let start = 0, endA = tokA.length, endB = tokB.length\n while (start < tokA.length && start < tokB.length && tokA[start] === tokB[start]) start++\n if (start == tokA.length && start == tokB.length) return []\n while (endA > start && endB > start && tokA[endA - 1] === tokB[endB - 1]) endA--, endB--\n // If the result is simple _or_ too big to cheaply compute, return\n // the remaining region as the diff\n if (endA == start || endB == start || (endA == endB && endA == start + 1))\n return [range.slice(start, endA, start, endB)]\n\n // This is an implementation of Myers' diff algorithm\n // See https://neil.fraser.name/writing/diff/myers.pdf and\n // https://blog.jcoglan.com/2017/02/12/the-myers-diff-algorithm-part-1/\n\n let lenA = endA - start, lenB = endB - start\n let max = Math.min(MAX_DIFF_SIZE, lenA + lenB), off = max + 1\n let history = []\n let frontier = []\n for (let len = off * 2, i = 0; i < len; i++) frontier[i] = -1\n\n for (let size = 0; size <= max; size++) {\n for (let diag = -size; diag <= size; diag += 2) {\n let next = frontier[diag + 1 + max], prev = frontier[diag - 1 + max]\n let x = next < prev ? prev : next + 1, y = x + diag\n while (x < lenA && y < lenB && tokA[start + x] === tokB[start + y]) x++, y++\n frontier[diag + max] = x\n // Found a match\n if (x >= lenA && y >= lenB) {\n // Trace back through the history to build up a set of changed ranges.\n let diff = [], minSpan = minUnchanged(endA - start, endB - start)\n // Used to add steps to a diff one at a time, back to front, merging\n // ones that are less than minSpan tokens apart\n let fromA = -1, toA = -1, fromB = -1, toB = -1\n let add = (fA, tA, fB, tB) => {\n if (fromA > -1 && fromA < tA + minSpan) {\n fromA = fA; fromB = fB\n } else {\n if (fromA > -1)\n diff.push(range.slice(fromA, toA, fromB, toB))\n fromA = fA; toA = tA\n fromB = fB; toB = tB\n }\n }\n\n for (let i = size - 1; i >= 0; i--) {\n let next = frontier[diag + 1 + max], prev = frontier[diag - 1 + max]\n if (next < prev) { // Deletion\n diag--\n x = prev + start; y = x + diag\n add(x, x, y, y + 1)\n } else { // Insertion\n diag++\n x = next + start; y = x + diag\n add(x, x + 1, y, y)\n }\n frontier = history[i >> 1]\n }\n if (fromA > -1) diff.push(range.slice(fromA, toA, fromB, toB))\n return diff.reverse()\n }\n }\n // Since only either odd or even diagonals are read from each\n // frontier, we only copy them every other iteration.\n if (size % 2 == 0) history.push(frontier.slice())\n }\n // The loop exited, meaning the maximum amount of work was done.\n // Just return a change spanning the entire range.\n return [range.slice(start, endA, start, endB)]\n}\n","// ::- Stores metadata for a part of a change.\nexport class Span {\n constructor(length, data) {\n // :: number\n this.length = length\n // :: any\n this.data = data\n }\n\n cut(length) {\n return length == this.length ? this : new Span(length, this.data)\n }\n\n static slice(spans, from, to) {\n if (from == to) return Span.none\n if (from == 0 && to == Span.len(spans)) return spans\n let result = []\n for (let i = 0, off = 0; off < to; i++) {\n let span = spans[i], end = off + span.length\n let overlap = Math.min(to, end) - Math.max(from, off)\n if (overlap > 0) result.push(span.cut(overlap))\n off = end\n }\n return result\n }\n\n static join(a, b, combine) {\n if (a.length == 0) return b\n if (b.length == 0) return a\n let combined = combine(a[a.length - 1].data, b[0].data)\n if (combined == null) return a.concat(b)\n let result = a.slice(0, a.length - 1)\n result.push(new Span(a[a.length - 1].length + b[0].length, combined))\n for (let i = 1; i < b.length; i++) result.push(b[i])\n return result\n }\n\n static len(spans) {\n let len = 0\n for (let i = 0; i < spans.length; i++) len += spans[i].length\n return len\n }\n}\n\nSpan.none = []\n\n// ::- A replaced range with metadata associated with it.\nexport class Change {\n constructor(fromA, toA, fromB, toB, deleted, inserted) {\n // :: number The start of the range deleted/replaced in the old\n // document.\n this.fromA = fromA\n // :: number The end of the range in the old document.\n this.toA = toA\n // :: number The start of the range inserted in the new document.\n this.fromB = fromB\n // :: number The end of the range in the new document.\n this.toB = toB\n // :: [Span] Data associated with the deleted content. The length\n // of these spans adds up to `this.toA - this.fromA`.\n this.deleted = deleted\n // :: [Span] Data associated with the inserted content. Length\n // adds up to `this.toB - this.toA`.\n this.inserted = inserted\n }\n\n get lenA() { return this.toA - this.fromA }\n get lenB() { return this.toB - this.fromB }\n\n slice(startA, endA, startB, endB) {\n if (startA == 0 && startB == 0 && endA == this.toA - this.fromA &&\n endB == this.toB - this.fromB) return this\n return new Change(this.fromA + startA, this.fromA + endA,\n this.fromB + startB, this.fromB + endB,\n Span.slice(this.deleted, startA, endA),\n Span.slice(this.inserted, startB, endB))\n }\n\n // : ([Change], [Change], (any, any) → any) → [Change]\n // This merges two changesets (the end document of x should be the\n // start document of y) into a single one spanning the start of x to\n // the end of y.\n static merge(x, y, combine) {\n if (x.length == 0) return y\n if (y.length == 0) return x\n\n let result = []\n // Iterate over both sets in parallel, using the middle coordinate\n // system (B in x, A in y) to synchronize.\n for (let iX = 0, iY = 0, curX = x[0], curY = y[0];;) {\n if (!curX && !curY) {\n return result\n } else if (curX && (!curY || curX.toB < curY.fromA)) { // curX entirely in front of curY\n let off = iY ? y[iY - 1].toB - y[iY - 1].toA : 0\n result.push(off == 0 ? curX :\n new Change(curX.fromA, curX.toA, curX.fromB + off, curX.toB + off,\n curX.deleted, curX.inserted))\n curX = iX++ == x.length ? null : x[iX]\n } else if (curY && (!curX || curY.toA < curX.fromB)) { // curY entirely in front of curX\n let off = iX ? x[iX - 1].toB - x[iX - 1].toA : 0\n result.push(off == 0 ? curY :\n new Change(curY.fromA - off, curY.toA - off, curY.fromB, curY.toB,\n curY.deleted, curY.inserted))\n curY = iY++ == y.length ? null : y[iY]\n } else { // Touch, need to merge\n // The rules for merging ranges are that deletions from the\n // old set and insertions from the new are kept. Areas of the\n // middle document covered by a but not by b are insertions\n // from a that need to be added, and areas covered by b but\n // not a are deletions from b that need to be added.\n let pos = Math.min(curX.fromB, curY.fromA)\n let fromA = Math.min(curX.fromA, curY.fromA - (iX ? x[iX - 1].toB - x[iX - 1].toA : 0)), toA = fromA\n let fromB = Math.min(curY.fromB, curX.fromB + (iY ? y[iY - 1].toB - y[iY - 1].toA : 0)), toB = fromB\n let deleted = Span.none, inserted = Span.none\n\n // Used to prevent appending ins/del range for the same Change twice\n let enteredX = false, enteredY = false\n\n // Need to have an inner loop since any number of further\n // ranges might be touching this group\n for (;;) {\n let nextX = !curX ? 2e8 : pos >= curX.fromB ? curX.toB : curX.fromB\n let nextY = !curY ? 2e8 : pos >= curY.fromA ? curY.toA : curY.fromA\n let next = Math.min(nextX, nextY)\n let inX = curX && pos >= curX.fromB, inY = curY && pos >= curY.fromA\n if (!inX && !inY) break\n if (inX && pos == curX.fromB && !enteredX) {\n deleted = Span.join(deleted, curX.deleted, combine)\n toA += curX.lenA\n enteredX = true\n }\n if (inX && !inY) {\n inserted = Span.join(inserted, Span.slice(curX.inserted, pos - curX.fromB, next - curX.fromB), combine)\n toB += next - pos\n }\n if (inY && pos == curY.fromA && !enteredY) {\n inserted = Span.join(inserted, curY.inserted, combine)\n toB += curY.lenB\n enteredY = true\n }\n if (inY && !inX) {\n deleted = Span.join(deleted, Span.slice(curY.deleted, pos - curY.fromA, next - curY.fromA), combine)\n toA += next - pos\n }\n\n if (inX && next == curX.toB) {\n curX = iX++ == x.length ? null : x[iX]\n enteredX = false\n }\n if (inY && next == curY.toA) {\n curY = iY++ == y.length ? null : y[iY]\n enteredY = false\n }\n pos = next\n }\n if (fromA < toA || fromB < toB)\n result.push(new Change(fromA, toA, fromB, toB, deleted, inserted))\n }\n }\n }\n}\n","import {Span, Change} from \"./change\"\n\nlet letter\n// If the runtime support unicode properties in regexps, that's a good\n// source of info on whether something is a letter.\ntry { letter = new RegExp(\"[\\\\p{Alphabetic}_]\", \"u\") } catch(_) {}\n\n// Otherwise, we see if the character changes when upper/lowercased,\n// or if it is part of these common single-case scripts.\nconst nonASCIISingleCaseWordChar = /[\\u00df\\u0587\\u0590-\\u05f4\\u0600-\\u06ff\\u3040-\\u309f\\u30a0-\\u30ff\\u3400-\\u4db5\\u4e00-\\u9fcc\\uac00-\\ud7af]/\n\nfunction isLetter(code) {\n if (code < 128)\n return code >= 48 && code <= 57 || code >= 65 && code <= 90 || code >= 79 && code <= 122\n let ch = String.fromCharCode(code)\n if (letter) return letter.test(ch)\n return ch.toUpperCase() != ch.toLowerCase() || nonASCIISingleCaseWordChar.test(ch)\n}\n\n// Convert a range of document into a string, so that we can easily\n// access characters at a given position. Treat non-text tokens as\n// spaces so that they aren't considered part of a word.\nfunction getText(frag, start, end) {\n let out = \"\"\n function convert(frag, start, end) {\n for (let i = 0, off = 0; i < frag.childCount; i++) {\n let child = frag.child(i), endOff = off + child.nodeSize\n let from = Math.max(off, start), to = Math.min(endOff, end)\n if (from < to) {\n if (child.isText) {\n out += child.text.slice(Math.max(0, start - off), Math.min(child.text.length, end - off))\n } else if (child.isLeaf) {\n out += \" \"\n } else {\n if (from == off) out += \" \"\n convert(child.content, Math.max(0, from - off - 1), Math.min(child.content.size, end - off))\n if (to == endOff) out += \" \"\n }\n }\n off = endOff\n }\n }\n convert(frag, start, end)\n return out\n}\n\n// The distance changes have to be apart for us to not consider them\n// candidates for merging.\nconst MAX_SIMPLIFY_DISTANCE = 30\n\n// :: ([Change], Node) → [Change]\n// Simplifies a set of changes for presentation. This makes the\n// assumption that having both insertions and deletions within a word\n// is confusing, and, when such changes occur without a word boundary\n// between them, they should be expanded to cover the entire set of\n// words (in the new document) they touch. An exception is made for\n// single-character replacements.\nexport function simplifyChanges(changes, doc) {\n let result = []\n for (let i = 0; i < changes.length; i++) {\n let end = changes[i].toB, start = i\n while (i < changes.length - 1 && changes[i + 1].fromB <= end + MAX_SIMPLIFY_DISTANCE)\n end = changes[++i].toB\n simplifyAdjacentChanges(changes, start, i + 1, doc, result)\n }\n return result\n}\n\nfunction simplifyAdjacentChanges(changes, from, to, doc, target) {\n let start = Math.max(0, changes[from].fromB - MAX_SIMPLIFY_DISTANCE)\n let end = Math.min(doc.content.size, changes[to - 1].toB + MAX_SIMPLIFY_DISTANCE)\n let text = getText(doc.content, start, end)\n\n for (let i = from; i < to; i++) {\n let startI = i, last = changes[i], deleted = last.lenA, inserted = last.lenB\n while (i < to - 1) {\n let next = changes[i + 1], boundary = false\n let prevLetter = last.toB == end ? false : isLetter(text.charCodeAt(last.toB - 1 - start))\n for (let pos = last.toB; !boundary && pos < next.fromB; pos++) {\n let nextLetter = pos == end ? false : isLetter(text.charCodeAt(pos - start))\n if ((!prevLetter || !nextLetter) && pos != changes[startI].fromB) boundary = true\n prevLetter = nextLetter\n }\n if (boundary) break\n deleted += next.lenA; inserted += next.lenB\n last = next\n i++\n }\n\n if (inserted > 0 && deleted > 0 && !(inserted == 1 && deleted == 1)) {\n let from = changes[startI].fromB, to = changes[i].toB\n if (from < end && isLetter(text.charCodeAt(from - start)))\n while (from > start && isLetter(text.charCodeAt(from - 1 - start))) from--\n if (to > start && isLetter(text.charCodeAt(to - 1 - start)))\n while (to < end && isLetter(text.charCodeAt(to - start))) to++\n let joined = fillChange(changes.slice(startI, i + 1), from, to)\n let last = target.length ? target[target.length - 1] : null\n if (last && last.toA == joined.fromA)\n target[target.length - 1] = new Change(last.fromA, joined.toA, last.fromB, joined.toB,\n last.deleted.concat(joined.deleted), last.inserted.concat(joined.inserted))\n else\n target.push(joined)\n } else {\n for (let j = startI; j <= i; j++) target.push(changes[j])\n }\n }\n return changes\n}\n\nfunction combine(a, b) { return a === b ? a : null }\n\nfunction fillChange(changes, fromB, toB) {\n let fromA = changes[0].fromA - (changes[0].fromB - fromB)\n let last = changes[changes.length - 1]\n let toA = last.toA + (toB - last.toB)\n let deleted = Span.none, inserted = Span.none\n let delData = (changes[0].deleted.length ? changes[0].deleted : changes[0].inserted)[0].data\n let insData = (changes[0].inserted.length ? changes[0].inserted : changes[0].deleted)[0].data\n for (let posA = fromA, posB = fromB, i = 0;; i++) {\n let next = i == changes.length ? null : changes[i]\n let endA = next ? next.fromA : toA, endB = next ? next.fromB : toB\n if (endA > posA) deleted = Span.join(deleted, [new Span(endA - posA, delData)], combine)\n if (endB > posB) inserted = Span.join(inserted, [new Span(endB - posB, insData)], combine)\n if (!next) break\n deleted = Span.join(deleted, next.deleted, combine)\n inserted = Span.join(inserted, next.inserted, combine)\n if (deleted.length) delData = deleted[deleted.length - 1].data\n if (inserted.length) insData = inserted[inserted.length - 1].data\n posA = next.toA; posB = next.toB\n }\n return new Change(fromA, toA, fromB, toB, deleted, inserted)\n}\n","import {computeDiff} from \"./diff\"\nimport {Change, Span} from \"./change\"\nexport {Change, Span}\nexport {simplifyChanges} from \"./simplify\"\n\n// ::- A change set tracks the changes to a document from a given\n// point in the past. It condenses a number of step maps down to a\n// flat sequence of replacements, and simplifies replacments that\n// partially undo themselves by comparing their content.\nexport class ChangeSet {\n constructor(config, changes) {\n this.config = config\n // :: [Change] Replaced regions.\n this.changes = changes\n }\n\n // :: (Node, [StepMap], union<[any], any>) → ChangeSet\n // Computes a new changeset by adding the given step maps and\n // metadata (either as an array, per-map, or as a single value to be\n // associated with all maps) to the current set. Will not mutate the\n // old set.\n //\n // Note that due to simplification that happens after each add,\n // incrementally adding steps might create a different final set\n // than adding all those changes at once, since different document\n // tokens might be matched during simplification depending on the\n // boundaries of the current changed ranges.\n addSteps(newDoc, maps, data) {\n // This works by inspecting the position maps for the changes,\n // which indicate what parts of the document were replaced by new\n // content, and the size of that new content. It uses these to\n // build up Change objects.\n //\n // These change objects are put in sets and merged together using\n // Change.merge, giving us the changes created by the new steps.\n // Those changes can then be merged with the existing set of\n // changes.\n //\n // For each change that was touched by the new steps, we recompute\n // a diff to try to minimize the change by dropping matching\n // pieces of the old and new document from the change.\n\n let stepChanges = []\n // Add spans for new steps.\n for (let i = 0; i < maps.length; i++) {\n let d = Array.isArray(data) ? data[i] : data\n let off = 0\n maps[i].forEach((fromA, toA, fromB, toB) => {\n\n stepChanges.push(new Change(fromA + off, toA + off, fromB, toB,\n fromA == toA ? Span.none : [new Span(toA - fromA, d)],\n fromB == toB ? Span.none : [new Span(toB - fromB, d)]))\n\n off = (toB - fromB) - (toA - fromA)\n })\n }\n if (stepChanges.length == 0) return this\n\n let newChanges = mergeAll(stepChanges, this.config.combine)\n let changes = Change.merge(this.changes, newChanges, this.config.combine)\n\n // Minimize changes when possible\n for (let i = 0; i < changes.length; i++) {\n let change = changes[i]\n if (change.fromA == change.toA || change.fromB == change.toB ||\n // Only look at changes that touch newly added changed ranges\n !newChanges.some(r => r.toB > change.fromB && r.fromB < change.toB)) continue\n let diff = computeDiff(this.config.doc.content, newDoc.content, change)\n\n // Fast path: If they are completely different, don't do anything\n if (diff.length == 1 && diff[0].fromB == 0 && diff[0].toB == change.toB - change.fromB)\n continue\n\n if (diff.length == 1) {\n changes[i] = diff[0]\n } else {\n changes.splice(i, 1, ...diff)\n i += diff.length - 1\n }\n }\n\n return new ChangeSet(this.config, changes)\n }\n\n // :: Node\n // The starting document of the change set.\n get startDoc() { return this.config.doc }\n\n // :: (f: (range: Change) → any) → ChangeSet\n // Map the span's data values in the given set through a function\n // and construct a new set with the resulting data.\n map(f) {\n return new ChangeSet(this.config, this.changes.map(change => {\n let data = f(change)\n return data === change.data ? change :\n new Change(change.fromA, change.toA, change.fromB, change.toB, data)\n }))\n }\n\n // :: (ChangeSet, ?[StepMap]) → ?{from: number, to: number}\n // Compare two changesets and return the range in which they are\n // changed, if any. If the document changed between the maps, pass\n // the maps for the steps that changed it as second argument, and\n // make sure the method is called on the old set and passed the new\n // set. The returned positions will be in new document coordinates.\n changedRange(b, maps) {\n if (b == this) return null\n let touched = maps && touchedRange(maps)\n let moved = touched ? (touched.toB - touched.fromB) - (touched.toA - touched.fromA) : 0\n function map(p) {\n return !touched || p <= touched.fromA ? p : p + moved\n }\n\n let from = touched ? touched.fromB : 2e8, to = touched ? touched.toB : -2e8\n function add(start, end = start) {\n from = Math.min(start, from); to = Math.max(end, to)\n }\n\n let rA = this.changes, rB = b.changes\n for (let iA = 0, iB = 0; iA < rA.length && iB < rB.length;) {\n let rangeA = rA[iA], rangeB = rB[iB]\n if (rangeA && rangeB && sameRanges(rangeA, rangeB, map)) { iA++; iB++ }\n else if (rangeB && (!rangeA || map(rangeA.fromB) >= rangeB.fromB)) { add(rangeB.fromB, rangeB.toB); iB++ }\n else { add(map(rangeA.fromB), map(rangeA.toB)); iA++ }\n }\n\n return from <= to ? {from, to} : null\n }\n\n // :: (Node, ?(a: any, b: any) → any) → ChangeSet\n // Create a changeset with the given base object and configuration.\n // The `combine` function is used to compare and combine metadata—it\n // should return null when metadata isn't compatible, and a combined\n // version for a merged range when it is.\n static create(doc, combine = (a, b) => a === b ? a : null) {\n return new ChangeSet({combine, doc}, [], [])\n }\n}\n\n// Exported for testing\nChangeSet.computeDiff = computeDiff\n\n// : ([[Change]], (any, any) → any, number, number) → [Change]\n// Divide-and-conquer approach to merging a series of ranges.\nfunction mergeAll(ranges, combine, start = 0, end = ranges.length) {\n if (end == start + 1) return [ranges[start]]\n let mid = (start + end) >> 1\n return Change.merge(mergeAll(ranges, combine, start, mid),\n mergeAll(ranges, combine, mid, end), combine)\n}\n\nfunction endRange(maps) {\n let from = 2e8, to = -2e8\n for (let i = 0; i < maps.length; i++) {\n let map = maps[i]\n if (from != 2e8) {\n from = map.map(from, -1)\n to = map.map(to, 1)\n }\n map.forEach((_s, _e, start, end) => {\n from = Math.min(from, start)\n to = Math.max(to, end)\n })\n }\n return from == 2e8 ? null : {from, to}\n}\n\nfunction touchedRange(maps) {\n let b = endRange(maps)\n if (!b) return null\n let a = endRange(maps.map(m => m.invert()).reverse())\n return {fromA: a.from, toA: a.to, fromB: b.from, toB: b.to}\n}\n\nfunction sameRanges(a, b, map) {\n return map(a.fromB) == b.fromB && map(a.toB) == b.toB &&\n sameSpans(a.deleted, b.deleted) && sameSpans(a.inserted, b.inserted)\n}\n\nfunction sameSpans(a, b) {\n if (a.length != b.length) return false\n for (let i = 0; i < a.length; i++)\n if (a[i].length != b[i].length || a[i].data !== b[i].data) return false\n return true\n}\n"],"names":["let","const","i","next","prev","prototypeAccessors","off","from","to","last","this"],"mappings":"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"}
{"version":3,"file":"index.js","sources":["../src/diff.js","../src/change.js","../src/simplify.js","../src/changeset.js"],"sourcesContent":["// Convert the given range of a fragment to tokens, where node open\n// tokens are encoded as strings holding the node name, characters as\n// their character code, and node close tokens as -1.\nfunction tokens(frag, start, end, target) {\n for (let i = 0, off = 0; i < frag.childCount; i++) {\n let child = frag.child(i), endOff = off + child.nodeSize\n let from = Math.max(off, start), to = Math.min(endOff, end)\n if (from < to) {\n if (child.isText) {\n for (let j = from; j < to; j++) target.push(child.text.charCodeAt(j - off))\n } else if (child.isLeaf) {\n target.push(child.type.name)\n } else {\n if (from == off) target.push(child.type.name)\n tokens(child.content, Math.max(off + 1, from) - off - 1, Math.min(endOff - 1, to) - off - 1, target)\n if (to == endOff) target.push(-1)\n }\n }\n off = endOff\n }\n return target\n}\n\n// The code below will refuse to compute a diff with more than 5000\n// insertions or deletions, which takes about 300ms to reach on my\n// machine. This is a safeguard against runaway computations.\nconst MAX_DIFF_SIZE = 5000\n\n// This obscure mess of constants computes the minimum length of an\n// unchanged range (not at the start/end of the compared content). The\n// idea is to make it higher in bigger replacements, so that you don't\n// get a diff soup of coincidentally identical letters when replacing\n// a paragraph.\nfunction minUnchanged(sizeA, sizeB) {\n return Math.min(15, Math.max(2, Math.floor(Math.max(sizeA, sizeB) / 10)))\n}\n\n// : (Fragment, Fragment, Change) → [Change]\nexport function computeDiff(fragA, fragB, range) {\n let tokA = tokens(fragA, range.fromA, range.toA, [])\n let tokB = tokens(fragB, range.fromB, range.toB, [])\n\n // Scan from both sides to cheaply eliminate work\n let start = 0, endA = tokA.length, endB = tokB.length\n while (start < tokA.length && start < tokB.length && tokA[start] === tokB[start]) start++\n if (start == tokA.length && start == tokB.length) return []\n while (endA > start && endB > start && tokA[endA - 1] === tokB[endB - 1]) endA--, endB--\n // If the result is simple _or_ too big to cheaply compute, return\n // the remaining region as the diff\n if (endA == start || endB == start || (endA == endB && endA == start + 1))\n return [range.slice(start, endA, start, endB)]\n\n // This is an implementation of Myers' diff algorithm\n // See https://neil.fraser.name/writing/diff/myers.pdf and\n // https://blog.jcoglan.com/2017/02/12/the-myers-diff-algorithm-part-1/\n\n let lenA = endA - start, lenB = endB - start\n let max = Math.min(MAX_DIFF_SIZE, lenA + lenB), off = max + 1\n let history = []\n let frontier = []\n for (let len = off * 2, i = 0; i < len; i++) frontier[i] = -1\n\n for (let size = 0; size <= max; size++) {\n for (let diag = -size; diag <= size; diag += 2) {\n let next = frontier[diag + 1 + max], prev = frontier[diag - 1 + max]\n let x = next < prev ? prev : next + 1, y = x + diag\n while (x < lenA && y < lenB && tokA[start + x] === tokB[start + y]) x++, y++\n frontier[diag + max] = x\n // Found a match\n if (x >= lenA && y >= lenB) {\n // Trace back through the history to build up a set of changed ranges.\n let diff = [], minSpan = minUnchanged(endA - start, endB - start)\n // Used to add steps to a diff one at a time, back to front, merging\n // ones that are less than minSpan tokens apart\n let fromA = -1, toA = -1, fromB = -1, toB = -1\n let add = (fA, tA, fB, tB) => {\n if (fromA > -1 && fromA < tA + minSpan) {\n fromA = fA; fromB = fB\n } else {\n if (fromA > -1)\n diff.push(range.slice(fromA, toA, fromB, toB))\n fromA = fA; toA = tA\n fromB = fB; toB = tB\n }\n }\n\n for (let i = size - 1; i >= 0; i--) {\n let next = frontier[diag + 1 + max], prev = frontier[diag - 1 + max]\n if (next < prev) { // Deletion\n diag--\n x = prev + start; y = x + diag\n add(x, x, y, y + 1)\n } else { // Insertion\n diag++\n x = next + start; y = x + diag\n add(x, x + 1, y, y)\n }\n frontier = history[i >> 1]\n }\n if (fromA > -1) diff.push(range.slice(fromA, toA, fromB, toB))\n return diff.reverse()\n }\n }\n // Since only either odd or even diagonals are read from each\n // frontier, we only copy them every other iteration.\n if (size % 2 == 0) history.push(frontier.slice())\n }\n // The loop exited, meaning the maximum amount of work was done.\n // Just return a change spanning the entire range.\n return [range.slice(start, endA, start, endB)]\n}\n","// ::- Stores metadata for a part of a change.\nexport class Span {\n constructor(length, data) {\n // :: number\n this.length = length\n // :: any\n this.data = data\n }\n\n cut(length) {\n return length == this.length ? this : new Span(length, this.data)\n }\n\n static slice(spans, from, to) {\n if (from == to) return Span.none\n if (from == 0 && to == Span.len(spans)) return spans\n let result = []\n for (let i = 0, off = 0; off < to; i++) {\n let span = spans[i], end = off + span.length\n let overlap = Math.min(to, end) - Math.max(from, off)\n if (overlap > 0) result.push(span.cut(overlap))\n off = end\n }\n return result\n }\n\n static join(a, b, combine) {\n if (a.length == 0) return b\n if (b.length == 0) return a\n let combined = combine(a[a.length - 1].data, b[0].data)\n if (combined == null) return a.concat(b)\n let result = a.slice(0, a.length - 1)\n result.push(new Span(a[a.length - 1].length + b[0].length, combined))\n for (let i = 1; i < b.length; i++) result.push(b[i])\n return result\n }\n\n static len(spans) {\n let len = 0\n for (let i = 0; i < spans.length; i++) len += spans[i].length\n return len\n }\n}\n\nSpan.none = []\n\n// ::- A replaced range with metadata associated with it.\nexport class Change {\n constructor(fromA, toA, fromB, toB, deleted, inserted) {\n // :: number The start of the range deleted/replaced in the old\n // document.\n this.fromA = fromA\n // :: number The end of the range in the old document.\n this.toA = toA\n // :: number The start of the range inserted in the new document.\n this.fromB = fromB\n // :: number The end of the range in the new document.\n this.toB = toB\n // :: [Span] Data associated with the deleted content. The length\n // of these spans adds up to `this.toA - this.fromA`.\n this.deleted = deleted\n // :: [Span] Data associated with the inserted content. Length\n // adds up to `this.toB - this.toA`.\n this.inserted = inserted\n }\n\n get lenA() { return this.toA - this.fromA }\n get lenB() { return this.toB - this.fromB }\n\n slice(startA, endA, startB, endB) {\n if (startA == 0 && startB == 0 && endA == this.toA - this.fromA &&\n endB == this.toB - this.fromB) return this\n return new Change(this.fromA + startA, this.fromA + endA,\n this.fromB + startB, this.fromB + endB,\n Span.slice(this.deleted, startA, endA),\n Span.slice(this.inserted, startB, endB))\n }\n\n // : ([Change], [Change], (any, any) → any) → [Change]\n // This merges two changesets (the end document of x should be the\n // start document of y) into a single one spanning the start of x to\n // the end of y.\n static merge(x, y, combine) {\n if (x.length == 0) return y\n if (y.length == 0) return x\n\n let result = []\n // Iterate over both sets in parallel, using the middle coordinate\n // system (B in x, A in y) to synchronize.\n for (let iX = 0, iY = 0, curX = x[0], curY = y[0];;) {\n if (!curX && !curY) {\n return result\n } else if (curX && (!curY || curX.toB < curY.fromA)) { // curX entirely in front of curY\n let off = iY ? y[iY - 1].toB - y[iY - 1].toA : 0\n result.push(off == 0 ? curX :\n new Change(curX.fromA, curX.toA, curX.fromB + off, curX.toB + off,\n curX.deleted, curX.inserted))\n curX = iX++ == x.length ? null : x[iX]\n } else if (curY && (!curX || curY.toA < curX.fromB)) { // curY entirely in front of curX\n let off = iX ? x[iX - 1].toB - x[iX - 1].toA : 0\n result.push(off == 0 ? curY :\n new Change(curY.fromA - off, curY.toA - off, curY.fromB, curY.toB,\n curY.deleted, curY.inserted))\n curY = iY++ == y.length ? null : y[iY]\n } else { // Touch, need to merge\n // The rules for merging ranges are that deletions from the\n // old set and insertions from the new are kept. Areas of the\n // middle document covered by a but not by b are insertions\n // from a that need to be added, and areas covered by b but\n // not a are deletions from b that need to be added.\n let pos = Math.min(curX.fromB, curY.fromA)\n let fromA = Math.min(curX.fromA, curY.fromA - (iX ? x[iX - 1].toB - x[iX - 1].toA : 0)), toA = fromA\n let fromB = Math.min(curY.fromB, curX.fromB + (iY ? y[iY - 1].toB - y[iY - 1].toA : 0)), toB = fromB\n let deleted = Span.none, inserted = Span.none\n\n // Used to prevent appending ins/del range for the same Change twice\n let enteredX = false, enteredY = false\n\n // Need to have an inner loop since any number of further\n // ranges might be touching this group\n for (;;) {\n let nextX = !curX ? 2e8 : pos >= curX.fromB ? curX.toB : curX.fromB\n let nextY = !curY ? 2e8 : pos >= curY.fromA ? curY.toA : curY.fromA\n let next = Math.min(nextX, nextY)\n let inX = curX && pos >= curX.fromB, inY = curY && pos >= curY.fromA\n if (!inX && !inY) break\n if (inX && pos == curX.fromB && !enteredX) {\n deleted = Span.join(deleted, curX.deleted, combine)\n toA += curX.lenA\n enteredX = true\n }\n if (inX && !inY) {\n inserted = Span.join(inserted, Span.slice(curX.inserted, pos - curX.fromB, next - curX.fromB), combine)\n toB += next - pos\n }\n if (inY && pos == curY.fromA && !enteredY) {\n inserted = Span.join(inserted, curY.inserted, combine)\n toB += curY.lenB\n enteredY = true\n }\n if (inY && !inX) {\n deleted = Span.join(deleted, Span.slice(curY.deleted, pos - curY.fromA, next - curY.fromA), combine)\n toA += next - pos\n }\n\n if (inX && next == curX.toB) {\n curX = iX++ == x.length ? null : x[iX]\n enteredX = false\n }\n if (inY && next == curY.toA) {\n curY = iY++ == y.length ? null : y[iY]\n enteredY = false\n }\n pos = next\n }\n if (fromA < toA || fromB < toB)\n result.push(new Change(fromA, toA, fromB, toB, deleted, inserted))\n }\n }\n }\n}\n","import {Span, Change} from \"./change\"\n\nlet letter\n// If the runtime support unicode properties in regexps, that's a good\n// source of info on whether something is a letter.\ntry { letter = new RegExp(\"[\\\\p{Alphabetic}_]\", \"u\") } catch(_) {}\n\n// Otherwise, we see if the character changes when upper/lowercased,\n// or if it is part of these common single-case scripts.\nconst nonASCIISingleCaseWordChar = /[\\u00df\\u0587\\u0590-\\u05f4\\u0600-\\u06ff\\u3040-\\u309f\\u30a0-\\u30ff\\u3400-\\u4db5\\u4e00-\\u9fcc\\uac00-\\ud7af]/\n\nfunction isLetter(code) {\n if (code < 128)\n return code >= 48 && code <= 57 || code >= 65 && code <= 90 || code >= 79 && code <= 122\n let ch = String.fromCharCode(code)\n if (letter) return letter.test(ch)\n return ch.toUpperCase() != ch.toLowerCase() || nonASCIISingleCaseWordChar.test(ch)\n}\n\n// Convert a range of document into a string, so that we can easily\n// access characters at a given position. Treat non-text tokens as\n// spaces so that they aren't considered part of a word.\nfunction getText(frag, start, end) {\n let out = \"\"\n function convert(frag, start, end) {\n for (let i = 0, off = 0; i < frag.childCount; i++) {\n let child = frag.child(i), endOff = off + child.nodeSize\n let from = Math.max(off, start), to = Math.min(endOff, end)\n if (from < to) {\n if (child.isText) {\n out += child.text.slice(Math.max(0, start - off), Math.min(child.text.length, end - off))\n } else if (child.isLeaf) {\n out += \" \"\n } else {\n if (from == off) out += \" \"\n convert(child.content, Math.max(0, from - off - 1), Math.min(child.content.size, end - off))\n if (to == endOff) out += \" \"\n }\n }\n off = endOff\n }\n }\n convert(frag, start, end)\n return out\n}\n\n// The distance changes have to be apart for us to not consider them\n// candidates for merging.\nconst MAX_SIMPLIFY_DISTANCE = 30\n\n// :: ([Change], Node) → [Change]\n// Simplifies a set of changes for presentation. This makes the\n// assumption that having both insertions and deletions within a word\n// is confusing, and, when such changes occur without a word boundary\n// between them, they should be expanded to cover the entire set of\n// words (in the new document) they touch. An exception is made for\n// single-character replacements.\nexport function simplifyChanges(changes, doc) {\n let result = []\n for (let i = 0; i < changes.length; i++) {\n let end = changes[i].toB, start = i\n while (i < changes.length - 1 && changes[i + 1].fromB <= end + MAX_SIMPLIFY_DISTANCE)\n end = changes[++i].toB\n simplifyAdjacentChanges(changes, start, i + 1, doc, result)\n }\n return result\n}\n\nfunction simplifyAdjacentChanges(changes, from, to, doc, target) {\n let start = Math.max(0, changes[from].fromB - MAX_SIMPLIFY_DISTANCE)\n let end = Math.min(doc.content.size, changes[to - 1].toB + MAX_SIMPLIFY_DISTANCE)\n let text = getText(doc.content, start, end)\n\n for (let i = from; i < to; i++) {\n let startI = i, last = changes[i], deleted = last.lenA, inserted = last.lenB\n while (i < to - 1) {\n let next = changes[i + 1], boundary = false\n let prevLetter = last.toB == end ? false : isLetter(text.charCodeAt(last.toB - 1 - start))\n for (let pos = last.toB; !boundary && pos < next.fromB; pos++) {\n let nextLetter = pos == end ? false : isLetter(text.charCodeAt(pos - start))\n if ((!prevLetter || !nextLetter) && pos != changes[startI].fromB) boundary = true\n prevLetter = nextLetter\n }\n if (boundary) break\n deleted += next.lenA; inserted += next.lenB\n last = next\n i++\n }\n\n if (inserted > 0 && deleted > 0 && !(inserted == 1 && deleted == 1)) {\n let from = changes[startI].fromB, to = changes[i].toB\n if (from < end && isLetter(text.charCodeAt(from - start)))\n while (from > start && isLetter(text.charCodeAt(from - 1 - start))) from--\n if (to > start && isLetter(text.charCodeAt(to - 1 - start)))\n while (to < end && isLetter(text.charCodeAt(to - start))) to++\n let joined = fillChange(changes.slice(startI, i + 1), from, to)\n let last = target.length ? target[target.length - 1] : null\n if (last && last.toA == joined.fromA)\n target[target.length - 1] = new Change(last.fromA, joined.toA, last.fromB, joined.toB,\n last.deleted.concat(joined.deleted), last.inserted.concat(joined.inserted))\n else\n target.push(joined)\n } else {\n for (let j = startI; j <= i; j++) target.push(changes[j])\n }\n }\n return changes\n}\n\nfunction combine(a, b) { return a === b ? a : null }\n\nfunction fillChange(changes, fromB, toB) {\n let fromA = changes[0].fromA - (changes[0].fromB - fromB)\n let last = changes[changes.length - 1]\n let toA = last.toA + (toB - last.toB)\n let deleted = Span.none, inserted = Span.none\n let delData = (changes[0].deleted.length ? changes[0].deleted : changes[0].inserted)[0].data\n let insData = (changes[0].inserted.length ? changes[0].inserted : changes[0].deleted)[0].data\n for (let posA = fromA, posB = fromB, i = 0;; i++) {\n let next = i == changes.length ? null : changes[i]\n let endA = next ? next.fromA : toA, endB = next ? next.fromB : toB\n if (endA > posA) deleted = Span.join(deleted, [new Span(endA - posA, delData)], combine)\n if (endB > posB) inserted = Span.join(inserted, [new Span(endB - posB, insData)], combine)\n if (!next) break\n deleted = Span.join(deleted, next.deleted, combine)\n inserted = Span.join(inserted, next.inserted, combine)\n if (deleted.length) delData = deleted[deleted.length - 1].data\n if (inserted.length) insData = inserted[inserted.length - 1].data\n posA = next.toA; posB = next.toB\n }\n return new Change(fromA, toA, fromB, toB, deleted, inserted)\n}\n","import {computeDiff} from \"./diff\"\nimport {Change, Span} from \"./change\"\nexport {Change, Span}\nexport {simplifyChanges} from \"./simplify\"\n\n// ::- A change set tracks the changes to a document from a given\n// point in the past. It condenses a number of step maps down to a\n// flat sequence of replacements, and simplifies replacments that\n// partially undo themselves by comparing their content.\nexport class ChangeSet {\n constructor(config, changes) {\n this.config = config\n // :: [Change] Replaced regions.\n this.changes = changes\n }\n\n // :: (Node, [StepMap], union<[any], any>) → ChangeSet\n // Computes a new changeset by adding the given step maps and\n // metadata (either as an array, per-map, or as a single value to be\n // associated with all maps) to the current set. Will not mutate the\n // old set.\n //\n // Note that due to simplification that happens after each add,\n // incrementally adding steps might create a different final set\n // than adding all those changes at once, since different document\n // tokens might be matched during simplification depending on the\n // boundaries of the current changed ranges.\n addSteps(newDoc, maps, data) {\n // This works by inspecting the position maps for the changes,\n // which indicate what parts of the document were replaced by new\n // content, and the size of that new content. It uses these to\n // build up Change objects.\n //\n // These change objects are put in sets and merged together using\n // Change.merge, giving us the changes created by the new steps.\n // Those changes can then be merged with the existing set of\n // changes.\n //\n // For each change that was touched by the new steps, we recompute\n // a diff to try to minimize the change by dropping matching\n // pieces of the old and new document from the change.\n\n let stepChanges = []\n // Add spans for new steps.\n for (let i = 0; i < maps.length; i++) {\n let d = Array.isArray(data) ? data[i] : data\n let off = 0\n maps[i].forEach((fromA, toA, fromB, toB) => {\n\n stepChanges.push(new Change(fromA + off, toA + off, fromB, toB,\n fromA == toA ? Span.none : [new Span(toA - fromA, d)],\n fromB == toB ? Span.none : [new Span(toB - fromB, d)]))\n\n off = (toB - fromB) - (toA - fromA)\n })\n }\n if (stepChanges.length == 0) return this\n\n let newChanges = mergeAll(stepChanges, this.config.combine)\n let changes = Change.merge(this.changes, newChanges, this.config.combine)\n\n // Minimize changes when possible\n for (let i = 0; i < changes.length; i++) {\n let change = changes[i]\n if (change.fromA == change.toA || change.fromB == change.toB ||\n // Only look at changes that touch newly added changed ranges\n !newChanges.some(r => r.toB > change.fromB && r.fromB < change.toB)) continue\n let diff = computeDiff(this.config.doc.content, newDoc.content, change)\n\n // Fast path: If they are completely different, don't do anything\n if (diff.length == 1 && diff[0].fromB == 0 && diff[0].toB == change.toB - change.fromB)\n continue\n\n if (diff.length == 1) {\n changes[i] = diff[0]\n } else {\n changes.splice(i, 1, ...diff)\n i += diff.length - 1\n }\n }\n\n return new ChangeSet(this.config, changes)\n }\n\n // :: Node\n // The starting document of the change set.\n get startDoc() { return this.config.doc }\n\n // :: (f: (range: Change) → any) → ChangeSet\n // Map the span's data values in the given set through a function\n // and construct a new set with the resulting data.\n map(f) {\n return new ChangeSet(this.config, this.changes.map(change => {\n let data = f(change)\n return data === change.data ? change :\n new Change(change.fromA, change.toA, change.fromB, change.toB, data)\n }))\n }\n\n // :: (ChangeSet, ?[StepMap]) → ?{from: number, to: number}\n // Compare two changesets and return the range in which they are\n // changed, if any. If the document changed between the maps, pass\n // the maps for the steps that changed it as second argument, and\n // make sure the method is called on the old set and passed the new\n // set. The returned positions will be in new document coordinates.\n changedRange(b, maps) {\n if (b == this) return null\n let touched = maps && touchedRange(maps)\n let moved = touched ? (touched.toB - touched.fromB) - (touched.toA - touched.fromA) : 0\n function map(p) {\n return !touched || p <= touched.fromA ? p : p + moved\n }\n\n let from = touched ? touched.fromB : 2e8, to = touched ? touched.toB : -2e8\n function add(start, end = start) {\n from = Math.min(start, from); to = Math.max(end, to)\n }\n\n let rA = this.changes, rB = b.changes\n for (let iA = 0, iB = 0; iA < rA.length && iB < rB.length;) {\n let rangeA = rA[iA], rangeB = rB[iB]\n if (rangeA && rangeB && sameRanges(rangeA, rangeB, map)) { iA++; iB++ }\n else if (rangeB && (!rangeA || map(rangeA.fromB) >= rangeB.fromB)) { add(rangeB.fromB, rangeB.toB); iB++ }\n else { add(map(rangeA.fromB), map(rangeA.toB)); iA++ }\n }\n\n return from <= to ? {from, to} : null\n }\n\n // :: (Node, ?(a: any, b: any) → any) → ChangeSet\n // Create a changeset with the given base object and configuration.\n // The `combine` function is used to compare and combine metadata—it\n // should return null when metadata isn't compatible, and a combined\n // version for a merged range when it is.\n static create(doc, combine = (a, b) => a === b ? a : null) {\n return new ChangeSet({combine, doc}, [], [])\n }\n}\n\n// Exported for testing\nChangeSet.computeDiff = computeDiff\n\n// : ([[Change]], (any, any) → any, number, number) → [Change]\n// Divide-and-conquer approach to merging a series of ranges.\nfunction mergeAll(ranges, combine, start = 0, end = ranges.length) {\n if (end == start + 1) return [ranges[start]]\n let mid = (start + end) >> 1\n return Change.merge(mergeAll(ranges, combine, start, mid),\n mergeAll(ranges, combine, mid, end), combine)\n}\n\nfunction endRange(maps) {\n let from = 2e8, to = -2e8\n for (let i = 0; i < maps.length; i++) {\n let map = maps[i]\n if (from != 2e8) {\n from = map.map(from, -1)\n to = map.map(to, 1)\n }\n map.forEach((_s, _e, start, end) => {\n from = Math.min(from, start)\n to = Math.max(to, end)\n })\n }\n return from == 2e8 ? null : {from, to}\n}\n\nfunction touchedRange(maps) {\n let b = endRange(maps)\n if (!b) return null\n let a = endRange(maps.map(m => m.invert()).reverse())\n return {fromA: a.from, toA: a.to, fromB: b.from, toB: b.to}\n}\n\nfunction sameRanges(a, b, map) {\n return map(a.fromB) == b.fromB && map(a.toB) == b.toB &&\n sameSpans(a.deleted, b.deleted) && sameSpans(a.inserted, b.inserted)\n}\n\nfunction sameSpans(a, b) {\n if (a.length != b.length) return false\n for (let i = 0; i < a.length; i++)\n if (a[i].length != b[i].length || a[i].data !== b[i].data) return false\n return true\n}\n"],"names":["let","const","i","next","prev","prototypeAccessors","off","from","to","last","this"],"mappings":";;;;AAAA;AACA;AACA;AACA,SAAS,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE;AAC1C,EAAE,KAAKA,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,EAAE,EAAE;AACrD,IAAIA,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,MAAM,GAAG,GAAG,GAAG,KAAK,CAAC,SAAQ;AAC5D,IAAIA,IAAI,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,EAAC;AAC/D,IAAI,IAAI,IAAI,GAAG,EAAE,EAAE;AACnB,MAAM,IAAI,KAAK,CAAC,MAAM,EAAE;AACxB,QAAQ,KAAKA,IAAI,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAA,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,GAAG,GAAG,CAAC,EAAC,EAAA;AACnF,OAAO,MAAM,IAAI,KAAK,CAAC,MAAM,EAAE;AAC/B,QAAQ,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAC;AACpC,OAAO,MAAM;AACb,QAAQ,IAAI,IAAI,IAAI,GAAG,IAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAC,EAAA;AACrD,QAAQ,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,EAAE,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,GAAG,CAAC,EAAE,MAAM,EAAC;AAC5G,QAAQ,IAAI,EAAE,IAAI,MAAM,EAAA,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAC,EAAA;AACzC,OAAO;AACP,KAAK;AACL,IAAI,GAAG,GAAG,OAAM;AAChB,GAAG;AACH,EAAE,OAAO,MAAM;AACf,CAAC;AACD;AACA;AACA;AACA;AACAC,IAAM,aAAa,GAAG,KAAI;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,YAAY,CAAC,KAAK,EAAE,KAAK,EAAE;AACpC,EAAE,OAAO,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;AAC3E,CAAC;AACD;AACA;AACO,SAAS,WAAW,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE;AACjD,EAAED,IAAI,IAAI,GAAG,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,EAAE,EAAE,EAAC;AACtD,EAAEA,IAAI,IAAI,GAAG,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,EAAE,EAAE,EAAC;AACtD;AACA;AACA,EAAEA,IAAI,KAAK,GAAG,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC,MAAM,EAAE,IAAI,GAAG,IAAI,CAAC,OAAM;AACvD,EAAE,OAAO,KAAK,GAAG,IAAI,CAAC,MAAM,IAAI,KAAK,GAAG,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,EAAE,EAAA,KAAK,GAAE,EAAA;AAC3F,EAAE,IAAI,KAAK,IAAI,IAAI,CAAC,MAAM,IAAI,KAAK,IAAI,IAAI,CAAC,MAAM,EAAA,EAAE,OAAO,EAAE,EAAA;AAC7D,EAAE,OAAO,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,IAAI,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,EAAA,EAAE,IAAI,EAAE,EAAE,IAAI,GAAE,EAAA;AAC1F;AACA;AACA,EAAE,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,KAAK,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,GAAG,CAAC,CAAC;AAC3E,IAAA,EAAI,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,EAAA;AAClD;AACA;AACA;AACA;AACA;AACA,EAAEA,IAAI,IAAI,GAAG,IAAI,GAAG,KAAK,EAAE,IAAI,GAAG,IAAI,GAAG,MAAK;AAC9C,EAAEA,IAAI,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,IAAI,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,EAAC;AAC/D,EAAEA,IAAI,OAAO,GAAG,GAAE;AAClB,EAAEA,IAAI,QAAQ,GAAG,GAAE;AACnB,EAAE,KAAKA,IAAI,GAAG,GAAG,GAAG,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAA,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,EAAC,EAAA;AAC/D;AACA,EAAE,KAAKA,IAAI,IAAI,GAAG,CAAC,EAAE,IAAI,IAAI,GAAG,EAAE,IAAI,EAAE,EAAE;AAC1C,IAAI,KAAKA,IAAI,IAAI,GAAG,CAAC,IAAI,EAAE,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI,CAAC,EAAE;AACpD,MAAMA,IAAI,IAAI,GAAG,QAAQ,CAAC,IAAI,GAAG,CAAC,GAAG,GAAG,CAAC,EAAE,IAAI,GAAG,QAAQ,CAAC,IAAI,GAAG,CAAC,GAAG,GAAG,EAAC;AAC1E,MAAMA,IAAI,CAAC,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,KAAI;AACzD,MAAM,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,IAAI,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,EAAA,EAAE,CAAC,EAAE,EAAE,CAAC,GAAE,EAAA;AAClF,MAAM,QAAQ,CAAC,IAAI,GAAG,GAAG,CAAC,GAAG,EAAC;AAC9B;AACA,MAAM,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,EAAE;AAClC;AACA,QAAQA,IAAI,IAAI,GAAG,EAAE,EAAE,OAAO,GAAG,YAAY,CAAC,IAAI,GAAG,KAAK,EAAE,IAAI,GAAG,KAAK,EAAC;AACzE;AACA;AACA,QAAQA,IAAI,KAAK,GAAG,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,EAAC;AACtD,QAAQA,IAAI,GAAG,GAAA,UAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAK;AACtC,UAAU,IAAI,KAAK,GAAG,CAAC,CAAC,IAAI,KAAK,GAAG,EAAE,GAAG,OAAO,EAAE;AAClD,YAAY,KAAK,GAAG,EAAE,CAAC,CAAC,KAAK,GAAG,GAAE;AAClC,WAAW,MAAM;AACjB,YAAY,IAAI,KAAK,GAAG,CAAC,CAAC;AAC1B,cAAA,EAAc,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,CAAC,EAAC,EAAA;AAC5D,YAAY,KAAK,GAAG,EAAE,CAAC,CAAC,GAAG,GAAG,GAAE;AAChC,YAAY,KAAK,GAAG,EAAE,CAAC,CAAC,GAAG,GAAG,GAAE;AAChC,WAAW;AACX,UAAS;AACT;AACA,QAAQ,KAAKA,IAAIE,GAAC,GAAG,IAAI,GAAG,CAAC,EAAEA,GAAC,IAAI,CAAC,EAAEA,GAAC,EAAE,EAAE;AAC5C,UAAUF,IAAIG,MAAI,GAAG,QAAQ,CAAC,IAAI,GAAG,CAAC,GAAG,GAAG,CAAC,EAAEC,MAAI,GAAG,QAAQ,CAAC,IAAI,GAAG,CAAC,GAAG,GAAG,EAAC;AAC9E,UAAU,IAAID,MAAI,GAAGC,MAAI,EAAE;AAC3B,YAAY,IAAI,GAAE;AAClB,YAAY,CAAC,GAAGA,MAAI,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,KAAI;AAC1C,YAAY,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,EAAC;AAC/B,WAAW,MAAM;AACjB,YAAY,IAAI,GAAE;AAClB,YAAY,CAAC,GAAGD,MAAI,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,KAAI;AAC1C,YAAY,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAC;AAC/B,WAAW;AACX,UAAU,QAAQ,GAAG,OAAO,CAACD,GAAC,IAAI,CAAC,EAAC;AACpC,SAAS;AACT,QAAQ,IAAI,KAAK,GAAG,CAAC,CAAC,EAAE,EAAA,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,CAAC,EAAC,EAAA;AACtE,QAAQ,OAAO,IAAI,CAAC,OAAO,EAAE;AAC7B,OAAO;AACP,KAAK;AACL;AACA;AACA,IAAI,IAAI,IAAI,GAAG,CAAC,IAAI,CAAC,EAAA,EAAE,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAC,EAAA;AACrD,GAAG;AACH;AACA;AACA,EAAE,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;AAChD;;AC9GA;AACO,IAAM,IAAI,GACf,SAAA,IAAW,CAAC,MAAM,EAAE,IAAI,EAAE;AAC5B;AACA,EAAI,IAAI,CAAC,MAAM,GAAG,OAAM;AACxB;AACA,EAAI,IAAI,CAAC,IAAI,GAAG,KAAI;AAClB,EAAC;AACH;eACE,GAAG,GAAA,SAAA,GAAA,EAAC,MAAM,EAAE;AACd,EAAI,OAAO,MAAM,IAAI,IAAI,CAAC,MAAM,GAAG,IAAI,GAAG,IAAI,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC;AACnE,CAAC,CAAA;AACH;AACE,IAAA,CAAO,wBAAM,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE;AAChC,EAAI,IAAI,IAAI,IAAI,EAAE,IAAE,OAAO,IAAI,CAAC,IAAI,EAAA;AACpC,EAAI,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAA,EAAE,OAAO,KAAK,EAAA;AACxD,EAAIF,IAAI,MAAM,GAAG,GAAE;AACnB,EAAI,KAAKA,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE;AAC5C,IAAMA,IAAI,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,OAAM;AAClD,IAAMA,IAAI,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,EAAC;AAC3D,IAAM,IAAI,OAAO,GAAG,CAAC,IAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,EAAC,EAAA;AACrD,IAAM,GAAG,GAAG,IAAG;AACf,GAAK;AACL,EAAI,OAAO,MAAM;AACf,CAAC,CAAA;AACH;AACE,IAAA,CAAO,sBAAK,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE;AAC7B,EAAI,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,EAAA,EAAE,OAAO,CAAC,EAAA;AAC/B,EAAI,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,EAAA,EAAE,OAAO,CAAC,EAAA;AAC/B,EAAIA,IAAI,QAAQ,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAC;AAC3D,EAAI,IAAI,QAAQ,IAAI,IAAI,EAAA,EAAE,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAA;AAC5C,EAAIA,IAAI,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,EAAC;AACzC,EAAI,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAC;AACzE,EAAI,KAAKA,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,EAAA,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAC,EAAA;AACxD,EAAI,OAAO,MAAM;AACf,CAAC,CAAA;AACH;AACE,IAAO,CAAA,GAAA,GAAA,SAAA,GAAA,EAAI,KAAK,EAAE;AACpB,EAAIA,IAAI,GAAG,GAAG,EAAC;AACf,EAAI,KAAKA,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAA,EAAE,GAAG,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,OAAM,EAAA;AACjE,EAAI,OAAO,GAAG;AACZ,CACD,CAAA;AACD;AACA,IAAI,CAAC,IAAI,GAAG,GAAE;AACd;AACA;IACa,MAAM,GACjB,SAAW,MAAA,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,QAAQ,EAAE;AACzD;AACA;AACA,EAAI,IAAI,CAAC,KAAK,GAAG,MAAK;AACtB;AACA,EAAI,IAAI,CAAC,GAAG,GAAG,IAAG;AAClB;AACA,EAAI,IAAI,CAAC,KAAK,GAAG,MAAK;AACtB;AACA,EAAI,IAAI,CAAC,GAAG,GAAG,IAAG;AAClB;AACA;AACA,EAAI,IAAI,CAAC,OAAO,GAAG,QAAO;AAC1B;AACA;AACA,EAAI,IAAI,CAAC,QAAQ,GAAG,SAAQ;AAC1B,EAAA;;AAAC,IAAAK,oBAAA,GAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,IAAA,EAAA,CAAA,IAAA,EAAA,EAAA,YAAA,EAAA,IAAA,EAAA,EAAA,CAAA;AACH;AACEA,oBAAI,CAAA,IAAA,CAAA,GAAA,GAAA,YAAO,EAAE,OAAO,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,KAAK,EAAE,CAAA;AAC3CA,oBAAI,CAAA,IAAA,CAAA,GAAA,GAAA,YAAO,EAAE,OAAO,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,KAAK,EAAE,CAAA;AAC7C;iBACE,KAAK,GAAA,SAAA,KAAA,EAAC,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE;AACpC,EAAI,IAAI,MAAM,IAAI,CAAC,IAAI,MAAM,IAAI,CAAC,IAAI,IAAI,IAAI,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,KAAK;AACnE,MAAQ,IAAI,IAAI,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,KAAK,EAAE,EAAA,OAAO,IAAI,EAAA;AAClD,EAAI,OAAO,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,GAAG,MAAM,EAAE,IAAI,CAAC,KAAK,GAAG,IAAI;AAC5D,oBAAsB,IAAI,CAAC,KAAK,GAAG,MAAM,EAAE,IAAI,CAAC,KAAK,GAAG,IAAI;AAC5D,oBAAsB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC;AAC5D,oBAAsB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;AAC5D,CAAC,CAAA;AACH;AACE;AACA;AACA;AACA;AACA,MAAA,CAAO,wBAAM,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE;AAC9B,EAAI,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,EAAA,EAAE,OAAO,CAAC,EAAA;AAC/B,EAAI,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,EAAA,EAAE,OAAO,CAAC,EAAA;AAC/B;AACA,EAAIL,IAAI,MAAM,GAAG,GAAE;AACnB;AACA;AACA,EAAI,KAAKA,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI;AACzD,IAAM,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE;AAC1B,MAAQ,OAAO,MAAM;AACrB,KAAO,MAAM,IAAI,IAAI,KAAK,CAAC,IAAI,IAAI,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE;AAC3D,MAAQA,IAAI,GAAG,GAAG,EAAE,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,EAAC;AACxD,MAAQ,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI;AACnC,kBAAoB,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,GAAG,GAAG,EAAE,IAAI,CAAC,GAAG,GAAG,GAAG;AACrF,6BAA+B,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,EAAC;AAC5D,MAAQ,IAAI,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC,MAAM,GAAG,IAAI,GAAG,CAAC,CAAC,EAAE,EAAC;AAC9C,KAAO,MAAM,IAAI,IAAI,KAAK,CAAC,IAAI,IAAI,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE;AAC3D,MAAQA,IAAIM,KAAG,GAAG,EAAE,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,EAAC;AACxD,MAAQ,MAAM,CAAC,IAAI,CAACA,KAAG,IAAI,CAAC,GAAG,IAAI;AACnC,kBAAoB,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,GAAGA,KAAG,EAAE,IAAI,CAAC,GAAG,GAAGA,KAAG,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG;AACrF,6BAA+B,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,EAAC;AAC5D,MAAQ,IAAI,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC,MAAM,GAAG,IAAI,GAAG,CAAC,CAAC,EAAE,EAAC;AAC9C,KAAO,MAAM;AACb;AACA;AACA;AACA;AACA;AACA,MAAQN,IAAI,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,EAAC;AAClD,MAAQA,IAAI,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,EAAE,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,GAAG,MAAK;AAC5G,MAAQA,IAAI,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,EAAE,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,GAAG,MAAK;AAC5G,MAAQA,IAAI,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI,CAAC,KAAI;AACrD;AACA;AACA,MAAQA,IAAI,QAAQ,GAAG,KAAK,EAAE,QAAQ,GAAG,MAAK;AAC9C;AACA;AACA;AACA,MAAQ,SAAS;AACjB,QAAUA,IAAI,KAAK,GAAG,CAAC,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,MAAK;AAC7E,QAAUA,IAAI,KAAK,GAAG,CAAC,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,MAAK;AAC7E,QAAUA,IAAI,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,EAAC;AAC3C,QAAUA,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,CAAC,KAAK,EAAE,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,CAAC,MAAK;AAC9E,QAAU,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,IAAE,KAAK,EAAA;AACjC,QAAU,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,CAAC,KAAK,IAAI,CAAC,QAAQ,EAAE;AACrD,UAAY,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,OAAO,EAAC;AAC/D,UAAY,GAAG,IAAI,IAAI,CAAC,KAAI;AAC5B,UAAY,QAAQ,GAAG,KAAI;AAC3B,SAAW;AACX,QAAU,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE;AAC3B,UAAY,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,GAAG,IAAI,CAAC,KAAK,EAAE,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,OAAO,EAAC;AACnH,UAAY,GAAG,IAAI,IAAI,GAAG,IAAG;AAC7B,SAAW;AACX,QAAU,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,CAAC,KAAK,IAAI,CAAC,QAAQ,EAAE;AACrD,UAAY,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAC;AAClE,UAAY,GAAG,IAAI,IAAI,CAAC,KAAI;AAC5B,UAAY,QAAQ,GAAG,KAAI;AAC3B,SAAW;AACX,QAAU,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE;AAC3B,UAAY,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,GAAG,IAAI,CAAC,KAAK,EAAE,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,OAAO,EAAC;AAChH,UAAY,GAAG,IAAI,IAAI,GAAG,IAAG;AAC7B,SAAW;AACX;AACA,QAAU,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,CAAC,GAAG,EAAE;AACvC,UAAY,IAAI,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC,MAAM,GAAG,IAAI,GAAG,CAAC,CAAC,EAAE,EAAC;AAClD,UAAY,QAAQ,GAAG,MAAK;AAC5B,SAAW;AACX,QAAU,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,CAAC,GAAG,EAAE;AACvC,UAAY,IAAI,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC,MAAM,GAAG,IAAI,GAAG,CAAC,CAAC,EAAE,EAAC;AAClD,UAAY,QAAQ,GAAG,MAAK;AAC5B,SAAW;AACX,QAAU,GAAG,GAAG,KAAI;AACpB,OAAS;AACT,MAAQ,IAAI,KAAK,GAAG,GAAG,IAAI,KAAK,GAAG,GAAG;AACtC,QAAA,EAAU,MAAM,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAC,EAAA;AAC5E,KAAO;AACP,GAAK;AACH,CAAA,CAAA;;AACD,MAAA,CAAA,gBAAA,EAAA,MAAA,CAAA,SAAA,EAAAK,oBAAA,EAAA;;AC9JDL,IAAI,OAAM;AACV;AACA;AACA,IAAI,EAAE,MAAM,GAAG,IAAI,MAAM,CAAC,oBAAoB,EAAE,GAAG,EAAC,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE;AAClE;AACA;AACA;AACAC,IAAM,0BAA0B,GAAG,4GAA2G;AAC9I;AACA,SAAS,QAAQ,CAAC,IAAI,EAAE;AACxB,EAAE,IAAI,IAAI,GAAG,GAAG;AAChB,IAAI,EAAA,OAAO,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,GAAG,EAAA;AAC5F,EAAED,IAAI,EAAE,GAAG,MAAM,CAAC,YAAY,CAAC,IAAI,EAAC;AACpC,EAAE,IAAI,MAAM,EAAE,EAAA,OAAO,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,EAAA;AACpC,EAAE,OAAO,EAAE,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE,IAAI,0BAA0B,CAAC,IAAI,CAAC,EAAE,CAAC;AACpF,CAAC;AACD;AACA;AACA;AACA;AACA,SAAS,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE;AACnC,EAAEA,IAAI,GAAG,GAAG,GAAE;AACd,EAAE,SAAS,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE;AACrC,IAAI,KAAKA,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,EAAE,EAAE;AACvD,MAAMA,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,MAAM,GAAG,GAAG,GAAG,KAAK,CAAC,SAAQ;AAC9D,MAAMA,IAAI,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,EAAC;AACjE,MAAM,IAAI,IAAI,GAAG,EAAE,EAAE;AACrB,QAAQ,IAAI,KAAK,CAAC,MAAM,EAAE;AAC1B,UAAU,GAAG,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,GAAG,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,GAAG,CAAC,EAAC;AACnG,SAAS,MAAM,IAAI,KAAK,CAAC,MAAM,EAAE;AACjC,UAAU,GAAG,IAAI,IAAG;AACpB,SAAS,MAAM;AACf,UAAU,IAAI,IAAI,IAAI,GAAG,EAAE,EAAA,GAAG,IAAI,IAAG,EAAA;AACrC,UAAU,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,GAAG,GAAG,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,GAAG,GAAG,CAAC,EAAC;AACtG,UAAU,IAAI,EAAE,IAAI,MAAM,EAAE,EAAA,GAAG,IAAI,IAAG,EAAA;AACtC,SAAS;AACT,OAAO;AACP,MAAM,GAAG,GAAG,OAAM;AAClB,KAAK;AACL,GAAG;AACH,EAAE,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,EAAC;AAC3B,EAAE,OAAO,GAAG;AACZ,CAAC;AACD;AACA;AACA;AACAC,IAAM,qBAAqB,GAAG,GAAE;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAAS,eAAe,CAAC,OAAO,EAAE,GAAG,EAAE;AAC9C,EAAED,IAAI,MAAM,GAAG,GAAE;AACjB,EAAE,KAAKA,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AAC3C,IAAIA,IAAI,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,GAAG,EAAC;AACvC,IAAI,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,GAAG,qBAAqB;AACxF,MAAM,EAAA,GAAG,GAAG,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,IAAG,EAAA;AAC5B,IAAI,uBAAuB,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,MAAM,EAAC;AAC/D,GAAG;AACH,EAAE,OAAO,MAAM;AACf,CAAC;AACD;AACA,SAAS,uBAAuB,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE;AACjE,EAAEA,IAAI,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,GAAG,qBAAqB,EAAC;AACtE,EAAEA,IAAI,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,qBAAqB,EAAC;AACnF,EAAEA,IAAI,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,EAAE,GAAG,EAAC;AAC7C;AACA,EAAE,KAAKA,IAAI,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE;AAClC,IAAIA,IAAI,MAAM,GAAG,CAAC,EAAE,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI,CAAC,KAAI;AAChF,IAAI,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE;AACvB,MAAMA,IAAI,IAAI,GAAG,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,GAAG,MAAK;AACjD,MAAMA,IAAI,UAAU,GAAG,IAAI,CAAC,GAAG,IAAI,GAAG,GAAG,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,GAAG,KAAK,CAAC,EAAC;AAChG,MAAM,KAAKA,IAAI,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,IAAI,GAAG,GAAG,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;AACrE,QAAQA,IAAI,UAAU,GAAG,GAAG,IAAI,GAAG,GAAG,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,GAAG,KAAK,CAAC,EAAC;AACpF,QAAQ,IAAI,CAAC,CAAC,UAAU,IAAI,CAAC,UAAU,KAAK,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAA,QAAQ,GAAG,KAAI,EAAA;AACzF,QAAQ,UAAU,GAAG,WAAU;AAC/B,OAAO;AACP,MAAM,IAAI,QAAQ,EAAA,EAAE,KAAK,EAAA;AACzB,MAAM,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,QAAQ,IAAI,IAAI,CAAC,KAAI;AACjD,MAAM,IAAI,GAAG,KAAI;AACjB,MAAM,CAAC,GAAE;AACT,KAAK;AACL;AACA,IAAI,IAAI,QAAQ,GAAG,CAAC,IAAI,OAAO,GAAG,CAAC,IAAI,EAAE,QAAQ,IAAI,CAAC,IAAI,OAAO,IAAI,CAAC,CAAC,EAAE;AACzE,MAAMA,IAAIO,MAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,EAAEC,IAAE,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,IAAG;AAC3D,MAAM,IAAID,MAAI,GAAG,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,UAAU,CAACA,MAAI,GAAG,KAAK,CAAC,CAAC;AAC/D,QAAQ,EAAA,OAAOA,MAAI,GAAG,KAAK,IAAI,QAAQ,CAAC,IAAI,CAAC,UAAU,CAACA,MAAI,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,EAAA,EAAEA,MAAI,GAAE,EAAA,EAAA;AAClF,MAAM,IAAIC,IAAE,GAAG,KAAK,IAAI,QAAQ,CAAC,IAAI,CAAC,UAAU,CAACA,IAAE,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC;AACjE,QAAA,EAAQ,OAAOA,IAAE,GAAG,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,UAAU,CAACA,IAAE,GAAG,KAAK,CAAC,CAAC,EAAA,EAAEA,IAAE,GAAE,EAAA,EAAA;AACtE,MAAMR,IAAI,MAAM,GAAG,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,EAAEO,MAAI,EAAEC,IAAE,EAAC;AACrE,MAAMR,IAAIS,MAAI,GAAG,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,KAAI;AACjE,MAAM,IAAIA,MAAI,IAAIA,MAAI,CAAC,GAAG,IAAI,MAAM,CAAC,KAAK;AAC1C,QAAQ,EAAA,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,IAAI,MAAM,CAACA,MAAI,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,EAAEA,MAAI,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG;AAC7F,+CAA+CA,MAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,EAAEA,MAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAC,EAAA;AAC1H;AACA,QAAA,EAAQ,MAAM,CAAC,IAAI,CAAC,MAAM,EAAC,EAAA;AAC3B,KAAK,MAAM;AACX,MAAM,KAAKT,IAAI,CAAC,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAA,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAC,EAAA;AAC/D,KAAK;AACL,GAAG;AACH,EAAE,OAAO,OAAO;AAChB,CAAC;AACD;AACA,SAAS,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,EAAE;AACpD;AACA,SAAS,UAAU,CAAC,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE;AACzC,EAAEA,IAAI,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,KAAK,EAAC;AAC3D,EAAEA,IAAI,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAC;AACxC,EAAEA,IAAI,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,GAAG,GAAG,IAAI,CAAC,GAAG,EAAC;AACvC,EAAEA,IAAI,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI,CAAC,KAAI;AAC/C,EAAEA,IAAI,OAAO,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,KAAI;AAC9F,EAAEA,IAAI,OAAO,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,KAAI;AAC/F,EAAE,KAAKA,IAAI,IAAI,GAAG,KAAK,EAAE,IAAI,GAAG,KAAK,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE;AACpD,IAAIA,IAAI,IAAI,GAAG,CAAC,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,CAAC,EAAC;AACtD,IAAIA,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC,KAAK,GAAG,GAAG,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC,KAAK,GAAG,IAAG;AACtE,IAAI,IAAI,IAAI,GAAG,IAAI,EAAA,EAAE,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,IAAI,IAAI,CAAC,IAAI,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC,EAAE,OAAO,EAAC,EAAA;AAC5F,IAAI,IAAI,IAAI,GAAG,IAAI,EAAA,EAAE,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,IAAI,IAAI,CAAC,IAAI,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC,EAAE,OAAO,EAAC,EAAA;AAC9F,IAAI,IAAI,CAAC,IAAI,EAAA,EAAE,KAAK,EAAA;AACpB,IAAI,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,OAAO,EAAC;AACvD,IAAI,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAC;AAC1D,IAAI,IAAI,OAAO,CAAC,MAAM,EAAA,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,KAAI,EAAA;AAClE,IAAI,IAAI,QAAQ,CAAC,MAAM,EAAA,EAAE,OAAO,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,KAAI,EAAA;AACrE,IAAI,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,IAAG;AACpC,GAAG;AACH,EAAE,OAAO,IAAI,MAAM,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,QAAQ,CAAC;AAC9D;;AC9HA;AACA;AACA;AACA;AACO,IAAM,SAAS,GACpB,SAAA,SAAW,CAAC,MAAM,EAAE,OAAO,EAAE;AAC/B,EAAI,IAAI,CAAC,MAAM,GAAG,OAAM;AACxB;AACA,EAAI,IAAI,CAAC,OAAO,GAAG,QAAO;AACxB,EAAA;;AAAC,IAAA,kBAAA,GAAA,EAAA,QAAA,EAAA,EAAA,YAAA,EAAA,IAAA,EAAA,EAAA,CAAA;AACH;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAA,CAAA,SAAA,CAAA,QAAA,GAAA,SAAA,QAAA,EAAS,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE;;AAAC;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAIA,IAAI,WAAW,GAAG,GAAE;AACxB;AACA,EAA0C,IAAA,IAAA,GAAA,WAAA,CAAA,GAAA;AAC1C,IAAMA,IAAI,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,KAAI;AAClD,IAAMA,IAAI,GAAG,GAAG,EAAC;AACjB,IAAM,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAA,UAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAK;AAClD;AACA,MAAQ,WAAW,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,KAAK,GAAG,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,KAAK,EAAE,GAAG;AACtE,kCAAoC,KAAK,IAAI,GAAG,GAAG,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC;AACzF,kCAAoC,KAAK,IAAI,GAAG,GAAG,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,EAAC;AAC3F;AACA,MAAQ,GAAG,GAAG,CAAC,GAAG,GAAG,KAAK,KAAK,GAAG,GAAG,KAAK,EAAC;AAC3C,KAAO,EAAC;AACR,GAAI,CAAA;;AAXA,IAAA,KAAKA,IAAIE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAWnC,IAAA,EAAA,CAAA,EAAA,CAAA;AACL,EAAI,IAAI,WAAW,CAAC,MAAM,IAAI,CAAC,EAAA,EAAE,OAAO,IAAI,EAAA;AAC5C;AACA,EAAIF,IAAI,UAAU,GAAG,QAAQ,CAAC,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO,EAAC;AAC/D,EAAIA,IAAI,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO,EAAC;AAC7E;AACA;AACA,EAA6C,IAAA,MAAA,GAAA,WAAA,GAAA,GAAA;AAC7C,IAAMA,IAAI,MAAM,GAAG,OAAO,CAACE,GAAC,EAAC;AAC7B,IAAM,IAAI,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,GAAG;AAClE;AACA,QAAU,CAAC,UAAU,CAAC,IAAI,CAAA,UAAC,GAAK,EAAA,OAAA,CAAC,CAAC,GAAG,GAAG,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC,KAAK,GAAG,MAAM,CAAC,GAAA,CAAA,EAAG,CAAC,EAAA,EAAE,MAAQ,EAAA;AACvF,IAAMF,IAAI,IAAI,GAAG,WAAW,CAACU,QAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,EAAC;AAC7E;AACA;AACA,IAAM,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,MAAM,CAAC,GAAG,GAAG,MAAM,CAAC,KAAK;AAC5F,MAAA,EAAQ,MAAQ,EAAA;AAChB;AACA,IAAM,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,EAAE;AAC5B,MAAQ,OAAO,CAACR,GAAC,CAAC,GAAG,IAAI,CAAC,CAAC,EAAC;AAC5B,KAAO,MAAM;AACb,MAAQ,OAAO,CAAC,MAAM,CAAA,KAAA,CAAA,OAAA,EAAA,EAACA,GAAC,EAAE,CAAC,EAAK,CAAA,MAAA,EAAA,IAAA,EAAI,EAAC;AACrC,MAAQA,GAAC,IAAI,IAAI,CAAC,MAAM,GAAG,EAAC;AAC5B,KAAM;;AAAC,MAAA,GAAA,GAAA,GAAA,CAAA;AACP,GAAI,CAAA;;AAjBA,IAAA,KAAKF,IAAIE,GAAC,GAAG,CAAC,EAAEA,GAAC,GAAG,OAAO,CAAC,MAAM,EAAEA,GAAC,EAAE,EAiBtC,MAAA,EAAA,GAAA,EAAA,CAAA;AACL;AACA,EAAI,OAAO,IAAI,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC;AAC5C,CAAC,CAAA;AACH;AACE;AACA;AACA,kBAAI,CAAA,QAAA,CAAA,GAAA,GAAA,YAAW,EAAE,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAA;AAC3C;AACE;AACA;AACA;oBACA,GAAG,GAAA,SAAA,GAAA,EAAC,CAAC,EAAE;AACT,EAAI,OAAO,IAAI,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAA,UAAC,QAAU;AACjE,IAAMF,IAAI,IAAI,GAAG,CAAC,CAAC,MAAM,EAAC;AAC1B,IAAM,OAAO,IAAI,KAAK,MAAM,CAAC,IAAI,GAAG,MAAM;AAC1C,MAAQ,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC;AAC5E,GAAK,CAAC,CAAC;AACL,CAAC,CAAA;AACH;AACE;AACA;AACA;AACA;AACA;AACA;AACA,SAAA,CAAA,SAAA,CAAA,YAAA,GAAA,SAAA,YAAA,EAAa,CAAC,EAAE,IAAI,EAAE;AACxB,EAAI,IAAI,CAAC,IAAI,IAAI,EAAA,EAAE,OAAO,IAAI,EAAA;AAC9B,EAAIA,IAAI,OAAO,GAAG,IAAI,IAAI,YAAY,CAAC,IAAI,EAAC;AAC5C,EAAIA,IAAI,KAAK,GAAG,OAAO,GAAG,CAAC,OAAO,CAAC,GAAG,GAAG,OAAO,CAAC,KAAK,KAAK,OAAO,CAAC,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,EAAC;AAC3F,EAAI,SAAS,GAAG,CAAC,CAAC,EAAE;AACpB,IAAM,OAAO,CAAC,OAAO,IAAI,CAAC,IAAI,OAAO,CAAC,KAAK,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK;AAC3D,GAAK;AACL;AACA,EAAIA,IAAI,IAAI,GAAG,OAAO,GAAG,OAAO,CAAC,KAAK,GAAG,GAAG,EAAE,EAAE,GAAG,OAAO,GAAG,OAAO,CAAC,GAAG,GAAG,CAAC,IAAG;AAC/E,EAAI,SAAS,GAAG,CAAC,KAAK,EAAE,GAAW,EAAE;+BAAV,GAAG,KAAA,CAAA;AAAQ;AACtC,IAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,EAAC;AAC1D,GAAK;AACL;AACA,EAAIA,IAAI,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,GAAG,CAAC,CAAC,QAAO;AACzC,EAAI,KAAKA,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,MAAM,IAAI,EAAE,GAAG,EAAE,CAAC,MAAM,GAAG;AAChE,IAAMA,IAAI,MAAM,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,GAAG,EAAE,CAAC,EAAE,EAAC;AAC1C,IAAM,IAAI,MAAM,IAAI,MAAM,IAAI,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,GAAE,EAAE;AAC7E,SAAW,IAAI,MAAM,KAAK,CAAC,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAE,EAAE;AAChH,SAAW,EAAE,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,GAAE,EAAE;AAC5D,GAAK;AACL;AACA,EAAI,OAAO,IAAI,IAAI,EAAE,GAAG,CAAC,IAAA,EAAA,IAAI,EAAE,EAAA,EAAA,EAAE,CAAC,GAAG,IAAI;AACvC,CAAC,CAAA;AACH;AACE;AACA;AACA;AACA;AACA;AACA,SAAA,CAAO,MAAM,GAAA,SAAA,MAAA,EAAC,GAAG,EAAE,OAAsC,EAAE;qCAAjC,GAAG,UAAC,CAAC,EAAE,CAAC,EAAA,EAAA,OAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,IAAA,CAAA,EAAA,CAAA;AAAO;AAC9D,EAAI,OAAO,IAAI,SAAS,CAAC,CAAC,OAAA,EAAA,OAAO,EAAE,GAAA,EAAA,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC;AAC9C,CAAA,CAAA;;AACD,MAAA,CAAA,gBAAA,EAAA,SAAA,CAAA,SAAA,EAAA,kBAAA,EAAA,CAAA;AACD;AACA;AACA,SAAS,CAAC,WAAW,GAAG,YAAW;AACnC;AACA;AACA;AACA,SAAS,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,KAAS,EAAE,GAAmB,EAAE;+BAA3B,GAAG,CAAA,CAAA;AAAM,EAAA,KAAA,GAAA,KAAA,KAAA,CAAA,GAAA,GAAA,GAAG,MAAM,CAAC,MAAA,CAAA;AAAS;AACpE,EAAE,IAAI,GAAG,IAAI,KAAK,GAAG,CAAC,EAAE,EAAA,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAA;AAC9C,EAAEA,IAAI,GAAG,GAAG,CAAC,KAAK,GAAG,GAAG,KAAK,EAAC;AAC9B,EAAE,OAAO,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,CAAC;AAC3D,sBAAsB,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,OAAO,CAAC;AACnE,CAAC;AACD;AACA,SAAS,QAAQ,CAAC,IAAI,EAAE;AACxB,EAAEA,IAAI,IAAI,GAAG,GAAG,EAAE,EAAE,GAAG,CAAC,IAAG;AAC3B,EAAE,KAAKA,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AACxC,IAAIA,IAAI,GAAG,GAAG,IAAI,CAAC,CAAC,EAAC;AACrB,IAAI,IAAI,IAAI,IAAI,GAAG,EAAE;AACrB,MAAM,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,EAAC;AAC9B,MAAM,EAAE,GAAG,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,EAAC;AACzB,KAAK;AACL,IAAI,GAAG,CAAC,OAAO,CAAA,UAAE,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAK;AACxC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,EAAC;AAClC,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,EAAC;AAC5B,KAAK,EAAC;AACN,GAAG;AACH,EAAE,OAAO,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,CAAC,IAAA,EAAA,IAAI,EAAE,EAAA,EAAA,EAAE,CAAC;AACxC,CAAC;AACD;AACA,SAAS,YAAY,CAAC,IAAI,EAAE;AAC5B,EAAEA,IAAI,CAAC,GAAG,QAAQ,CAAC,IAAI,EAAC;AACxB,EAAE,IAAI,CAAC,CAAC,EAAA,EAAE,OAAO,IAAI,EAAA;AACrB,EAAEA,IAAI,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAA,UAAC,GAAK,EAAA,OAAA,CAAC,CAAC,MAAM,EAAA,CAAA,EAAE,CAAC,CAAC,OAAO,EAAE,EAAC;AACvD,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC;AAC7D,CAAC;AACD;AACA,SAAS,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE;AAC/B,EAAE,OAAO,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG;AACvD,IAAI,SAAS,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC;AACxE,CAAC;AACD;AACA,SAAS,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE;AACzB,EAAE,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,MAAM,EAAE,EAAA,OAAO,KAAK,EAAA;AACxC,EAAE,KAAKA,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE;AACnC,IAAA,EAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAA,EAAE,OAAO,KAAK,EAAA,EAAA;AAC3E,EAAE,OAAO,IAAI;AACb;;;;;;;"}