@mavogel/cdk-vscode-server 0.0.123 → 0.0.124
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.jsii +3 -3
- package/lib/idle-monitor/idle-monitor.js +1 -1
- package/lib/vscode-server.js +1 -1
- package/node_modules/node-html-parser/CHANGELOG.md +79 -0
- package/node_modules/node-html-parser/README.md +39 -39
- package/node_modules/node-html-parser/dist/index.cjs +5079 -0
- package/node_modules/node-html-parser/dist/index.d.ts +10 -10
- package/node_modules/node-html-parser/dist/index.mjs +5068 -0
- package/node_modules/node-html-parser/dist/index.umd.js +5083 -0
- package/node_modules/node-html-parser/dist/matcher.d.ts +22 -6
- package/node_modules/node-html-parser/dist/nodes/comment.d.ts +1 -1
- package/node_modules/node-html-parser/dist/nodes/html.d.ts +2 -2
- package/node_modules/node-html-parser/dist/nodes/node.d.ts +2 -2
- package/node_modules/node-html-parser/dist/nodes/text.d.ts +1 -1
- package/node_modules/node-html-parser/dist/valid.d.ts +1 -1
- package/node_modules/node-html-parser/node_modules/entities/LICENSE +11 -0
- package/node_modules/node-html-parser/node_modules/entities/dist/decode-codepoint.d.ts +28 -0
- package/node_modules/node-html-parser/node_modules/entities/dist/decode-codepoint.d.ts.map +1 -0
- package/node_modules/node-html-parser/node_modules/entities/dist/decode-codepoint.js +61 -0
- package/node_modules/node-html-parser/node_modules/entities/dist/decode-codepoint.js.map +1 -0
- package/node_modules/node-html-parser/node_modules/entities/dist/decode.d.ts +227 -0
- package/node_modules/node-html-parser/node_modules/entities/dist/decode.d.ts.map +1 -0
- package/node_modules/node-html-parser/node_modules/entities/dist/decode.js +1132 -0
- package/node_modules/node-html-parser/node_modules/entities/dist/decode.js.map +1 -0
- package/node_modules/node-html-parser/node_modules/entities/dist/encode.d.ts +26 -0
- package/node_modules/node-html-parser/node_modules/entities/dist/encode.d.ts.map +1 -0
- package/node_modules/node-html-parser/node_modules/entities/dist/encode.js +295 -0
- package/node_modules/node-html-parser/node_modules/entities/dist/encode.js.map +1 -0
- package/node_modules/node-html-parser/node_modules/entities/dist/escape.d.ts +60 -0
- package/node_modules/node-html-parser/node_modules/entities/dist/escape.d.ts.map +1 -0
- package/node_modules/node-html-parser/node_modules/entities/dist/escape.js +172 -0
- package/node_modules/node-html-parser/node_modules/entities/dist/escape.js.map +1 -0
- package/node_modules/node-html-parser/node_modules/entities/dist/generated/decode-data-html.d.ts +3 -0
- package/node_modules/node-html-parser/node_modules/entities/dist/generated/decode-data-html.d.ts.map +1 -0
- package/node_modules/node-html-parser/node_modules/entities/dist/generated/decode-data-html.js +5 -0
- package/node_modules/node-html-parser/node_modules/entities/dist/generated/decode-data-html.js.map +1 -0
- package/node_modules/node-html-parser/node_modules/entities/dist/generated/decode-data-xml.d.ts +3 -0
- package/node_modules/node-html-parser/node_modules/entities/dist/generated/decode-data-xml.d.ts.map +1 -0
- package/node_modules/node-html-parser/node_modules/entities/dist/generated/decode-data-xml.js +7 -0
- package/node_modules/node-html-parser/node_modules/entities/dist/generated/decode-data-xml.js.map +1 -0
- package/node_modules/node-html-parser/node_modules/entities/dist/generated/encode-html.d.ts +3 -0
- package/node_modules/node-html-parser/node_modules/entities/dist/generated/encode-html.d.ts.map +1 -0
- package/node_modules/node-html-parser/node_modules/entities/dist/generated/encode-html.js +3 -0
- package/node_modules/node-html-parser/node_modules/entities/dist/generated/encode-html.js.map +1 -0
- package/node_modules/node-html-parser/node_modules/entities/dist/index.d.ts +89 -0
- package/node_modules/node-html-parser/node_modules/entities/dist/index.d.ts.map +1 -0
- package/node_modules/node-html-parser/node_modules/entities/dist/index.js +87 -0
- package/node_modules/node-html-parser/node_modules/entities/dist/index.js.map +1 -0
- package/node_modules/node-html-parser/node_modules/entities/dist/internal/bin-trie-flags.d.ts +48 -0
- package/node_modules/node-html-parser/node_modules/entities/dist/internal/bin-trie-flags.d.ts.map +1 -0
- package/node_modules/node-html-parser/node_modules/entities/dist/internal/bin-trie-flags.js +49 -0
- package/node_modules/node-html-parser/node_modules/entities/dist/internal/bin-trie-flags.js.map +1 -0
- package/node_modules/node-html-parser/node_modules/entities/dist/internal/decode-shared.d.ts +38 -0
- package/node_modules/node-html-parser/node_modules/entities/dist/internal/decode-shared.d.ts.map +1 -0
- package/node_modules/node-html-parser/node_modules/entities/dist/internal/decode-shared.js +195 -0
- package/node_modules/node-html-parser/node_modules/entities/dist/internal/decode-shared.js.map +1 -0
- package/node_modules/node-html-parser/node_modules/entities/package.json +83 -0
- package/node_modules/node-html-parser/node_modules/entities/readme.md +131 -0
- package/node_modules/node-html-parser/node_modules/entities/src/decode-codepoint.ts +69 -0
- package/node_modules/node-html-parser/node_modules/entities/src/decode.ts +1368 -0
- package/node_modules/node-html-parser/node_modules/entities/src/encode.ts +337 -0
- package/node_modules/node-html-parser/node_modules/entities/src/escape.ts +187 -0
- package/node_modules/node-html-parser/node_modules/entities/src/generated/decode-data-html.ts +12 -0
- package/node_modules/node-html-parser/node_modules/entities/src/generated/decode-data-xml.ts +7 -0
- package/node_modules/node-html-parser/node_modules/entities/src/generated/encode-html.ts +3 -0
- package/node_modules/node-html-parser/node_modules/entities/src/index.ts +160 -0
- package/node_modules/node-html-parser/node_modules/entities/src/internal/bin-trie-flags.ts +47 -0
- package/node_modules/node-html-parser/node_modules/entities/src/internal/decode-shared.ts +209 -0
- package/node_modules/node-html-parser/package.json +35 -30
- package/package.json +3 -3
- package/node_modules/he/LICENSE-MIT.txt +0 -20
- package/node_modules/he/README.md +0 -379
- package/node_modules/he/bin/he +0 -148
- package/node_modules/he/he.js +0 -345
- package/node_modules/he/man/he.1 +0 -78
- package/node_modules/he/package.json +0 -58
- package/node_modules/node-html-parser/dist/back.js +0 -6
- package/node_modules/node-html-parser/dist/index.js +0 -31
- package/node_modules/node-html-parser/dist/main.js +0 -1804
- package/node_modules/node-html-parser/dist/matcher.js +0 -106
- package/node_modules/node-html-parser/dist/nodes/comment.js +0 -33
- package/node_modules/node-html-parser/dist/nodes/html.js +0 -1186
- package/node_modules/node-html-parser/dist/nodes/node.js +0 -41
- package/node_modules/node-html-parser/dist/nodes/text.js +0 -105
- package/node_modules/node-html-parser/dist/nodes/type.js +0 -9
- package/node_modules/node-html-parser/dist/parse.js +0 -5
- package/node_modules/node-html-parser/dist/valid.js +0 -12
- package/node_modules/node-html-parser/dist/void-tag.js +0 -27
|
@@ -0,0 +1,337 @@
|
|
|
1
|
+
import { XML_BITSET_VALUE, xmlEncodeRegex } from "./escape.js";
|
|
2
|
+
import htmlTrieData from "./generated/encode-html.js";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* A node inside the encoding trie used by `encode.ts`.
|
|
6
|
+
*
|
|
7
|
+
* There are two physical shapes to minimize allocations and lookup cost:
|
|
8
|
+
*
|
|
9
|
+
* 1. Leaf node (string)
|
|
10
|
+
* - A plain string (already in the form `"&name;"`).
|
|
11
|
+
* - Represents a terminal match with no children.
|
|
12
|
+
*
|
|
13
|
+
* 2. Branch / value node (object)
|
|
14
|
+
*/
|
|
15
|
+
type EncodeTrieNode =
|
|
16
|
+
| string
|
|
17
|
+
| { value: string | null; next: Map<number, EncodeTrieNode> };
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Flat lookup table for ASCII entity values (code points 0–127).
|
|
21
|
+
*
|
|
22
|
+
* Built once at startup from the full trie. For ASCII characters that need
|
|
23
|
+
* encoding, a direct `asciiEntities[charCode]` array index is much faster
|
|
24
|
+
* than `Map.get(charCode)` because it avoids hashing and bucket lookup.
|
|
25
|
+
*
|
|
26
|
+
* A few ASCII characters also start multi-code-point entities
|
|
27
|
+
* (e.g. `<` + U+20D2 → `<⃒`). For those, the table holds the branch
|
|
28
|
+
* node itself (children plus the single-char value), so the ASCII path
|
|
29
|
+
* never consults `htmlTrie`.
|
|
30
|
+
*/
|
|
31
|
+
const asciiEntities: (EncodeTrieNode | null)[] = /* #__PURE__ */ Array.from(
|
|
32
|
+
{ length: 128 },
|
|
33
|
+
() => null,
|
|
34
|
+
);
|
|
35
|
+
|
|
36
|
+
const htmlTrie: Map<number, EncodeTrieNode> = (() => {
|
|
37
|
+
/**
|
|
38
|
+
* Parse a compact encode trie string into a Map keyed by code point.
|
|
39
|
+
*
|
|
40
|
+
* The serialized format (produced by `scripts/write-encode-map.ts`) stores
|
|
41
|
+
* entries in ascending code-point order with delta encoding:
|
|
42
|
+
*
|
|
43
|
+
* [gap]name;[{children}]
|
|
44
|
+
*
|
|
45
|
+
* - `gap` is a base-10 integer giving `currentKey - previousKey - 1`.
|
|
46
|
+
* The very first entry stores the absolute key. A gap of 0 is omitted.
|
|
47
|
+
* - `name;` is the entity name (without `&` prefix) terminated by `;`.
|
|
48
|
+
* Because gaps use only digits `[0-9]` and entity names always start with
|
|
49
|
+
* a letter `[A-Za-z]`, no additional delimiter is needed.
|
|
50
|
+
* - `{…}` is an optional children block using the same scheme recursively.
|
|
51
|
+
* Children represent the second code unit of multi-character entities
|
|
52
|
+
* (e.g. `<` + U+20D2 → `<⃒`).
|
|
53
|
+
*/
|
|
54
|
+
const trie = new Map<number, EncodeTrieNode>();
|
|
55
|
+
const data = htmlTrieData;
|
|
56
|
+
let cursor = 0;
|
|
57
|
+
let lastKey = -1;
|
|
58
|
+
|
|
59
|
+
function readGap(): number {
|
|
60
|
+
let value = 0;
|
|
61
|
+
let ch: number;
|
|
62
|
+
while (
|
|
63
|
+
(ch = data.charCodeAt(cursor)) >= 48 /* '0' */ &&
|
|
64
|
+
ch <= 57 /* '9' */
|
|
65
|
+
) {
|
|
66
|
+
value = value * 10 + ch - 48;
|
|
67
|
+
cursor++;
|
|
68
|
+
}
|
|
69
|
+
return value;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
function readEntity(): string {
|
|
73
|
+
const semi = data.indexOf(";", cursor);
|
|
74
|
+
const entity = `&${data.substring(cursor, semi)};`;
|
|
75
|
+
cursor = semi + 1;
|
|
76
|
+
return entity;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
const astralEntries: [number, string][] = [];
|
|
80
|
+
|
|
81
|
+
while (cursor < data.length) {
|
|
82
|
+
lastKey += readGap() + 1;
|
|
83
|
+
|
|
84
|
+
const entityValue =
|
|
85
|
+
data.charCodeAt(cursor) === 123 /* '{' */ ? null : readEntity();
|
|
86
|
+
|
|
87
|
+
if (data.charCodeAt(cursor) === 123 /* '{' */) {
|
|
88
|
+
cursor++; // Skip '{'
|
|
89
|
+
const next = new Map<number, EncodeTrieNode>();
|
|
90
|
+
let childKey = -1;
|
|
91
|
+
while (data.charCodeAt(cursor) !== 125 /* '}' */) {
|
|
92
|
+
childKey += readGap() + 1;
|
|
93
|
+
next.set(childKey, readEntity());
|
|
94
|
+
}
|
|
95
|
+
const branch = { value: entityValue, next };
|
|
96
|
+
trie.set(lastKey, branch);
|
|
97
|
+
cursor++; // Skip '}'
|
|
98
|
+
// ASCII fast path holds the branch node itself (children + value).
|
|
99
|
+
if (lastKey < 0x80) {
|
|
100
|
+
asciiEntities[lastKey] = branch;
|
|
101
|
+
}
|
|
102
|
+
} else if (lastKey < 0x80) {
|
|
103
|
+
asciiEntities[lastKey] = entityValue;
|
|
104
|
+
} else if (lastKey > 0xff_ff) {
|
|
105
|
+
astralEntries.push([lastKey, entityValue!]);
|
|
106
|
+
} else {
|
|
107
|
+
trie.set(lastKey, entityValue!);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/*
|
|
112
|
+
* Batch-insert astral entries as surrogate-pair trie nodes.
|
|
113
|
+
* Entries are sorted by code point, so same-high-surrogate groups
|
|
114
|
+
* are contiguous — no intermediate grouping Map needed.
|
|
115
|
+
*/
|
|
116
|
+
let astralIndex = 0;
|
|
117
|
+
while (astralIndex < astralEntries.length) {
|
|
118
|
+
const hi =
|
|
119
|
+
0xd8_00 | ((astralEntries[astralIndex][0] - 0x1_00_00) >> 10);
|
|
120
|
+
const children: [number, string][] = [];
|
|
121
|
+
while (
|
|
122
|
+
astralIndex < astralEntries.length &&
|
|
123
|
+
(0xd8_00 | ((astralEntries[astralIndex][0] - 0x1_00_00) >> 10)) ===
|
|
124
|
+
hi
|
|
125
|
+
) {
|
|
126
|
+
const lo =
|
|
127
|
+
0xdc_00 |
|
|
128
|
+
((astralEntries[astralIndex][0] - 0x1_00_00) & 0x3_ff);
|
|
129
|
+
children.push([lo, astralEntries[astralIndex][1]]);
|
|
130
|
+
astralIndex++;
|
|
131
|
+
}
|
|
132
|
+
trie.set(hi, { value: null, next: new Map(children) });
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
return trie;
|
|
136
|
+
})();
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
* Bitset covering ASCII code points 0–127. Each of the four 32-bit words
|
|
140
|
+
* covers a 32-code-point range. A set bit means "this character needs
|
|
141
|
+
* encoding" when used with `encodeHTML`.
|
|
142
|
+
*/
|
|
143
|
+
const HTML_BITSET = /* #__PURE__ */ new Uint32Array([
|
|
144
|
+
0x16_00, // 09 (\t), 0A (\n), 0C (\f)
|
|
145
|
+
0xfc_00_ff_fe, // 21-2D (!-.), 2E (.), 2F (/), 3A-3F (:;<=>?)
|
|
146
|
+
0xf8_00_00_01, // 40 (@), 5B-5F ([\]^_)
|
|
147
|
+
0x38_00_00_01, // 60 (`), 7B-7D ({|})
|
|
148
|
+
]);
|
|
149
|
+
|
|
150
|
+
const XML_BITSET = /* #__PURE__ */ new Uint32Array([0, XML_BITSET_VALUE, 0, 0]);
|
|
151
|
+
|
|
152
|
+
/*
|
|
153
|
+
* Regex equivalent of `HTML_BITSET` (plus all non-ASCII code units, lone
|
|
154
|
+
* surrogates included — no `u` flag). Must stay in sync with the bitset:
|
|
155
|
+
* the scan uses the regex to find candidates and the bitset to re-check
|
|
156
|
+
* adjacent characters. The XML equivalent is `xmlEncodeRegex`, shared with
|
|
157
|
+
* `escape.ts`.
|
|
158
|
+
*/
|
|
159
|
+
// eslint-disable-next-line unicorn/prefer-unicode-code-point-escapes -- the `\u{...}` form requires the `u` flag, which we deliberately omit so lone surrogates match by code unit
|
|
160
|
+
const HTML_ENCODE_RE = /[\t\n\f!-/:-@[-`{-}\u0080-\uFFFF]/g;
|
|
161
|
+
|
|
162
|
+
const numericReference = (cp: number) => `&#x${cp.toString(16)};`;
|
|
163
|
+
|
|
164
|
+
/**
|
|
165
|
+
* Encodes all characters in the input using HTML entities. This includes
|
|
166
|
+
* characters that are valid ASCII characters in HTML documents, such as `#`.
|
|
167
|
+
*
|
|
168
|
+
* To get a more compact output, consider using the `encodeNonAsciiHTML`
|
|
169
|
+
* function, which will only encode characters that are not valid in HTML
|
|
170
|
+
* documents, as well as non-ASCII characters.
|
|
171
|
+
*
|
|
172
|
+
* If a character has no equivalent entity, a numeric hexadecimal reference
|
|
173
|
+
* (eg. `ü`) will be used.
|
|
174
|
+
* @param input Input string to encode.
|
|
175
|
+
*/
|
|
176
|
+
export function encodeHTML(input: string): string {
|
|
177
|
+
return encodeHTMLTrieRe(HTML_BITSET, HTML_ENCODE_RE, input);
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Encodes all non-ASCII characters, as well as characters not valid in HTML
|
|
181
|
+
* documents using HTML entities. This function will not encode characters that
|
|
182
|
+
* are valid in HTML documents, such as `#`.
|
|
183
|
+
*
|
|
184
|
+
* If a character has no equivalent entity, a numeric hexadecimal reference
|
|
185
|
+
* (eg. `ü`) will be used.
|
|
186
|
+
* @param input Input string to encode.
|
|
187
|
+
*/
|
|
188
|
+
export function encodeNonAsciiHTML(input: string): string {
|
|
189
|
+
return encodeHTMLTrieRe(XML_BITSET, xmlEncodeRegex, input);
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
/**
|
|
193
|
+
* Whether `code` (a UTF-16 code unit) must be encoded: any non-ASCII unit, or
|
|
194
|
+
* an ASCII unit flagged in `bitset`.
|
|
195
|
+
* @param bitset Bitset of ASCII characters to encode.
|
|
196
|
+
* @param code Code unit to test.
|
|
197
|
+
*/
|
|
198
|
+
function isEncodable(bitset: Uint32Array, code: number): boolean {
|
|
199
|
+
return code >= 0x80 || ((bitset[code >>> 5] >>> code) & 1) === 1;
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
/*
|
|
203
|
+
* The inline scan beats the regex jump only for short gaps (measured
|
|
204
|
+
* break-even is ~7 characters; below it the per-call regex overhead
|
|
205
|
+
* dominates, above it the regex skips clean spans faster in native code).
|
|
206
|
+
* So we scan at most `INLINE_SCAN_WINDOW` characters inline before deferring
|
|
207
|
+
* to the regex. Any gap long enough to exhaust the window switches to
|
|
208
|
+
* long-gap mode, which skips the inline scan entirely; we stay in that mode
|
|
209
|
+
* while total gaps are at least `LONG_GAP_THRESHOLD` characters long and
|
|
210
|
+
* drop back to the inline scan as soon as a shorter gap appears. Gaps are
|
|
211
|
+
* always measured from where they start, so every window-exhausting gap
|
|
212
|
+
* enters long-gap mode and no gap length pays both scans repeatedly.
|
|
213
|
+
*/
|
|
214
|
+
/** @internal Exported for tests; not re-exported from the package entry. */
|
|
215
|
+
export const INLINE_SCAN_WINDOW = 16;
|
|
216
|
+
const LONG_GAP_THRESHOLD = 8;
|
|
217
|
+
|
|
218
|
+
function encodeHTMLTrieRe(
|
|
219
|
+
bitset: Uint32Array,
|
|
220
|
+
re: RegExp,
|
|
221
|
+
input: string,
|
|
222
|
+
): string {
|
|
223
|
+
const { length } = input;
|
|
224
|
+
let out: string | undefined;
|
|
225
|
+
let last = 0; // Start of the next untouched slice.
|
|
226
|
+
let index = 0;
|
|
227
|
+
let wasLongGap = false; // The previous gap was long; skip the inline scan.
|
|
228
|
+
|
|
229
|
+
while (index < length) {
|
|
230
|
+
let char = input.charCodeAt(index);
|
|
231
|
+
|
|
232
|
+
/*
|
|
233
|
+
* Find the next encodable character (one matching `bitset`, or any
|
|
234
|
+
* non-ASCII unit). Gaps between entities in dense text are only a
|
|
235
|
+
* few characters, so scan a short window inline first; the regex —
|
|
236
|
+
* which matches exactly the same characters and skips clean spans
|
|
237
|
+
* in native code — runs for longer gaps. Gap lengths cluster, so
|
|
238
|
+
* after a window-exhausting gap the window is skipped until a gap
|
|
239
|
+
* shorter than LONG_GAP_THRESHOLD reappears. Once located, the
|
|
240
|
+
* character is captured in `char` and control falls through to the
|
|
241
|
+
* encode logic below instead of re-testing it on the next loop
|
|
242
|
+
* iteration.
|
|
243
|
+
*/
|
|
244
|
+
if (!isEncodable(bitset, char)) {
|
|
245
|
+
const gapStart = index;
|
|
246
|
+
let next = index + 1;
|
|
247
|
+
let wasFound = false;
|
|
248
|
+
if (!wasLongGap) {
|
|
249
|
+
const bound = Math.min(index + INLINE_SCAN_WINDOW, length);
|
|
250
|
+
while (
|
|
251
|
+
next < bound &&
|
|
252
|
+
!isEncodable(bitset, (char = input.charCodeAt(next)))
|
|
253
|
+
) {
|
|
254
|
+
next++;
|
|
255
|
+
}
|
|
256
|
+
if (next < bound) {
|
|
257
|
+
// `char` already holds the encodable unit at `next`.
|
|
258
|
+
index = next;
|
|
259
|
+
wasFound = true;
|
|
260
|
+
} else if (next >= length) {
|
|
261
|
+
break;
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
if (!wasFound) {
|
|
265
|
+
/*
|
|
266
|
+
* Every match is a single code unit, so `test` pins it at
|
|
267
|
+
* `lastIndex - 1` without allocating a match object.
|
|
268
|
+
*/
|
|
269
|
+
re.lastIndex = next;
|
|
270
|
+
if (!re.test(input)) break;
|
|
271
|
+
index = re.lastIndex - 1;
|
|
272
|
+
/*
|
|
273
|
+
* Reaching the regex from the inline scan means the gap
|
|
274
|
+
* exhausted the window, so it is long by definition; once
|
|
275
|
+
* in long-gap mode, stay until a gap shorter than the
|
|
276
|
+
* threshold appears.
|
|
277
|
+
*/
|
|
278
|
+
wasLongGap =
|
|
279
|
+
!wasLongGap || index - gapStart >= LONG_GAP_THRESHOLD;
|
|
280
|
+
char = input.charCodeAt(index);
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
// Lazy-init: copy the prefix before the first character that needs encoding.
|
|
285
|
+
if (out == null) out = input.substring(0, index);
|
|
286
|
+
else if (last !== index) out += input.substring(last, index);
|
|
287
|
+
|
|
288
|
+
if (char < 0x80) {
|
|
289
|
+
const node = asciiEntities[char];
|
|
290
|
+
if (typeof node === "object" && node !== null) {
|
|
291
|
+
// Multi-code-point entity first (e.g. < + U+20D2 → <⃒).
|
|
292
|
+
if (index + 1 < length) {
|
|
293
|
+
const value = node.next.get(input.charCodeAt(index + 1));
|
|
294
|
+
if (value != null) {
|
|
295
|
+
out += value;
|
|
296
|
+
last = index += 2;
|
|
297
|
+
continue;
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
out += node.value ?? numericReference(char);
|
|
301
|
+
} else {
|
|
302
|
+
out += node ?? numericReference(char);
|
|
303
|
+
}
|
|
304
|
+
} else {
|
|
305
|
+
// Non-ASCII: full trie lookup with multi-char entity support.
|
|
306
|
+
let node: EncodeTrieNode | undefined | null = htmlTrie.get(char);
|
|
307
|
+
|
|
308
|
+
if (typeof node === "object") {
|
|
309
|
+
if (index + 1 < length) {
|
|
310
|
+
const value = node.next.get(input.charCodeAt(index + 1));
|
|
311
|
+
if (value != null) {
|
|
312
|
+
out += value;
|
|
313
|
+
last = index += 2;
|
|
314
|
+
continue;
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
node = node.value;
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
if (node == null) {
|
|
321
|
+
// No named entity exists; emit a hexadecimal numeric reference.
|
|
322
|
+
const cp = input.codePointAt(index)!;
|
|
323
|
+
out += numericReference(cp);
|
|
324
|
+
// Astral code points consume two UTF-16 code units.
|
|
325
|
+
if (cp !== char) index++;
|
|
326
|
+
} else {
|
|
327
|
+
out += node;
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
last = index += 1;
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
// If nothing needed encoding, return the original string (avoids allocation).
|
|
334
|
+
if (out == null) return input;
|
|
335
|
+
if (last < length) out += input.substr(last);
|
|
336
|
+
return out;
|
|
337
|
+
}
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Get the named reference for an XML special character or U+00A0.
|
|
3
|
+
* @param char Code unit matched by one of the escape regexes.
|
|
4
|
+
*/
|
|
5
|
+
function getEscape(char: number): string {
|
|
6
|
+
return char === 34
|
|
7
|
+
? """
|
|
8
|
+
: char === 38
|
|
9
|
+
? "&"
|
|
10
|
+
: char === 39
|
|
11
|
+
? "'"
|
|
12
|
+
: char === 60
|
|
13
|
+
? "<"
|
|
14
|
+
: char === 62
|
|
15
|
+
? ">"
|
|
16
|
+
: " ";
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Read a code point at a given index.
|
|
21
|
+
* @param input String to read the code point from.
|
|
22
|
+
* @param index Current read position in the input string.
|
|
23
|
+
* @returns The code point at `index`, or `undefined` if `index` is out of range.
|
|
24
|
+
* @deprecated Use `String.prototype.codePointAt` directly instead; this export
|
|
25
|
+
* will be removed in the next major.
|
|
26
|
+
*/
|
|
27
|
+
export const getCodePoint: (input: string, index: number) => number = (
|
|
28
|
+
input: string,
|
|
29
|
+
index: number,
|
|
30
|
+
): number => input.codePointAt(index)!;
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Bitset for ASCII characters that need to be escaped in XML.
|
|
34
|
+
*/
|
|
35
|
+
export const XML_BITSET_VALUE = 0x50_00_00_c4; // 32..63 -> 34 ("),38 (&),39 ('),60 (<),62 (>)
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Matches exactly the characters `encodeXML` escapes: the five XML special
|
|
39
|
+
* characters plus every non-ASCII code unit (lone surrogates included — no
|
|
40
|
+
* `u` flag). Kept in sync with `XML_BITSET_VALUE`.
|
|
41
|
+
*
|
|
42
|
+
* Shared with `encodeNonAsciiHTML` in `encode.ts`. Because the regex is
|
|
43
|
+
* stateful (`g` flag), every call site must set `lastIndex` before use.
|
|
44
|
+
*/
|
|
45
|
+
// eslint-disable-next-line unicorn/prefer-unicode-code-point-escapes -- the `\u{...}` form requires the `u` flag, which we deliberately omit so lone surrogates match by code unit
|
|
46
|
+
export const xmlEncodeRegex: RegExp = /["&'<>\u0080-\uFFFF]/g;
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Whether `code` (a UTF-16 code unit) is escaped by {@link encodeXML}: a
|
|
50
|
+
* non-ASCII unit, or one of the five XML specials flagged in
|
|
51
|
+
* `XML_BITSET_VALUE` (which is only meaningful for code units 32-63).
|
|
52
|
+
* @param code Code unit to test.
|
|
53
|
+
*/
|
|
54
|
+
function isXmlEscapable(code: number): boolean {
|
|
55
|
+
return (
|
|
56
|
+
code >= 0x80 ||
|
|
57
|
+
(code >= 32 && code < 64 && ((XML_BITSET_VALUE >>> code) & 1) === 1)
|
|
58
|
+
);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Encodes all non-ASCII characters, as well as characters not valid in XML
|
|
63
|
+
* documents using XML entities.
|
|
64
|
+
*
|
|
65
|
+
* If a character has no equivalent entity, a numeric hexadecimal reference
|
|
66
|
+
* (eg. `ü`) will be used.
|
|
67
|
+
* @param input Input string to encode.
|
|
68
|
+
*/
|
|
69
|
+
export function encodeXML(input: string): string {
|
|
70
|
+
const { length } = input;
|
|
71
|
+
let out: string | undefined;
|
|
72
|
+
let last = 0;
|
|
73
|
+
let index = 0;
|
|
74
|
+
|
|
75
|
+
while (index < length) {
|
|
76
|
+
const char = input.charCodeAt(index);
|
|
77
|
+
|
|
78
|
+
/*
|
|
79
|
+
* Find the next character to escape: scan a short window inline
|
|
80
|
+
* (escapable characters cluster in markup-heavy input), then fall
|
|
81
|
+
* back to the regex, which skips clean spans in native code.
|
|
82
|
+
*/
|
|
83
|
+
if (!isXmlEscapable(char)) {
|
|
84
|
+
const bound = Math.min(index + 32, length);
|
|
85
|
+
let next = index + 1;
|
|
86
|
+
while (next < bound && !isXmlEscapable(input.charCodeAt(next))) {
|
|
87
|
+
next++;
|
|
88
|
+
}
|
|
89
|
+
if (next < bound) {
|
|
90
|
+
index = next;
|
|
91
|
+
continue;
|
|
92
|
+
}
|
|
93
|
+
if (next >= length) break;
|
|
94
|
+
xmlEncodeRegex.lastIndex = next;
|
|
95
|
+
if (!xmlEncodeRegex.test(input)) break;
|
|
96
|
+
index = xmlEncodeRegex.lastIndex - 1;
|
|
97
|
+
continue;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
if (out === undefined) out = input.substring(0, index);
|
|
101
|
+
else if (last !== index) out += input.substring(last, index);
|
|
102
|
+
|
|
103
|
+
if (char < 64) {
|
|
104
|
+
// Known replacement
|
|
105
|
+
out += getEscape(char);
|
|
106
|
+
last = index += 1;
|
|
107
|
+
continue;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
// Non-ASCII: encode as numeric entity (handle surrogate pair)
|
|
111
|
+
const cp = input.codePointAt(index)!;
|
|
112
|
+
out += `&#x${cp.toString(16)};`;
|
|
113
|
+
if (cp !== char) index++; // Skip trailing surrogate
|
|
114
|
+
last = index += 1;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
if (out === undefined) return input;
|
|
118
|
+
if (last < length) out += input.substr(last);
|
|
119
|
+
return out;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* Encodes all non-ASCII characters, as well as characters not valid in XML
|
|
124
|
+
* documents using numeric hexadecimal reference (eg. `ü`).
|
|
125
|
+
*
|
|
126
|
+
* Have a look at `escapeUTF8` if you want a more concise output at the expense
|
|
127
|
+
* of reduced transportability.
|
|
128
|
+
* @param data String to escape.
|
|
129
|
+
*/
|
|
130
|
+
export const escape: typeof encodeXML = encodeXML;
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* Escape `data` using `re`, mapping each matched character to its entity.
|
|
134
|
+
* Every match is one UTF-16 code unit, so its index is `lastIndex - 1`.
|
|
135
|
+
* @param re Global regex matching exactly the characters to escape
|
|
136
|
+
* (`"`, `&`, `'`, `<`, `>`, `\u00A0` at most).
|
|
137
|
+
* @param data String to escape.
|
|
138
|
+
*/
|
|
139
|
+
function escapeWithRegex(re: RegExp, data: string): string {
|
|
140
|
+
re.lastIndex = 0;
|
|
141
|
+
if (!re.test(data)) return data;
|
|
142
|
+
|
|
143
|
+
let out = "";
|
|
144
|
+
let last = 0;
|
|
145
|
+
do {
|
|
146
|
+
const index = re.lastIndex - 1;
|
|
147
|
+
if (last !== index) out += data.substring(last, index);
|
|
148
|
+
const char = data.charCodeAt(index);
|
|
149
|
+
out += getEscape(char);
|
|
150
|
+
last = index + 1;
|
|
151
|
+
} while (re.test(data));
|
|
152
|
+
|
|
153
|
+
return out + data.substring(last);
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
const xmlEscapeRegex = /["&'<>]/g;
|
|
157
|
+
/**
|
|
158
|
+
* Encodes all characters not valid in XML documents using XML entities.
|
|
159
|
+
*
|
|
160
|
+
* Note that the output will be character-set dependent.
|
|
161
|
+
* @param data String to escape.
|
|
162
|
+
*/
|
|
163
|
+
export function escapeUTF8(data: string): string {
|
|
164
|
+
return escapeWithRegex(xmlEscapeRegex, data);
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
const attributeEscapeRegex = /["&\u{A0}]/gu;
|
|
168
|
+
|
|
169
|
+
/**
|
|
170
|
+
* Encodes all characters that have to be escaped in HTML attributes,
|
|
171
|
+
* following {@link https://html.spec.whatwg.org/multipage/parsing.html#escapingString}.
|
|
172
|
+
* @param data String to escape.
|
|
173
|
+
*/
|
|
174
|
+
export function escapeAttribute(data: string): string {
|
|
175
|
+
return escapeWithRegex(attributeEscapeRegex, data);
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
const textEscapeRegex = /[&<>\u{A0}]/gu;
|
|
179
|
+
|
|
180
|
+
/**
|
|
181
|
+
* Encodes all characters that have to be escaped in HTML text,
|
|
182
|
+
* following {@link https://html.spec.whatwg.org/multipage/parsing.html#escapingString}.
|
|
183
|
+
* @param data String to escape.
|
|
184
|
+
*/
|
|
185
|
+
export function escapeText(data: string): string {
|
|
186
|
+
return escapeWithRegex(textEscapeRegex, data);
|
|
187
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
// Generated using scripts/write-decode-map.ts
|
|
2
|
+
|
|
3
|
+
import { decodeTrieDict } from "../internal/decode-shared.js";
|
|
4
|
+
/** Packed HTML decode trie data. */
|
|
5
|
+
export const htmlDecodeTree: Uint16Array = /* #__PURE__ */ decodeTrieDict(
|
|
6
|
+
"!}.&u%}'&}*'~!6*)%&,~!J~!J~%L~y<~!R,~~%Lu~~#GD~~#|)1#%}^%}2%+#.##%##%}&%##%'#%##&%#%#'%#&#%#&#'#%%#&#%##%#)%''%&%#%#'%#%%#%%}%%%#%#&(23#%%#&-%0%('1#(##%#'##+%'*.:1}#%#6-+(%'%%#%%%}#L'2351&('%}&/N'(0(/*-%(%%}#'+&T%7.2}#&%&#%#36/5##%&%%#&#%%#))2%%##%&&'0~!#*+&'%1~!%).'3q?&%'1~!.##%6(~!+%%%(Gw'rT~!E#<nA%#jZ~!H%(~!42##~!*31&~!G%U~#)5~#`3~!J~!Z~%]~%Y~%C~!q~!u~#kz~%#~!6'~!D~!U~!?~#T~!c%~!G#'~%7|~!G~!J~!G&~#pb~(Df}#%}*&}#%##%##%##&#-}&'#'&%#.++}%mI,#,@&(}*%}*'%&##&#%##%}&0}#.},U},%}+%}&%}#%##&}B%(}(%}+%)})%##%#&}&%##%&}<%}>%#%&}*%}(%}9%}/%})%}*%}*%}?&}&%}3%}&*#%})%#%#)}#&#-#+*%E%%'%'#%}#*V##&##I}#&&##%&%#&&Qf%%))w/0+&%#(#.%-''''++++7}>%4'',##1,#%#&%##&#'##&#*#9)%&%}#*}%,#+P(%A&%#'&##wSD',9E00#y#@}(+}&%&>~!#~!X}#*}(&&}(&}(,%}%&#+&}#&}I%#%}%)#(},'%#*}4%%#%}(''}#/##(##),%-##%%)#&}(.}&%#&}%%}*&#%},&&}&%}#%*'#%})%}D&}&%}-&}6&#&}-,%}#%})-(~+`~,=?~I9'9%~!,#%})%})%}@%}?%}(~!?~#<~#pP~#BG~#=1#%K+~#?#~%;)~#A~#mF1~#A'~'X%'~#lR~#N~'N~#r~#m#-~#i'?%#'%~#B%##%,%#~#_%#0%~#]732~,w~2+#:&#%&'0%&>%}#>##F+)#%&&#(+_}4&}-%}(&}@&}O7Fdf0@+/v4}&WU##&/0#&'('B#%}.%}'+#%}#%%&#&%#%##+#&#)#6#'#.},%}c%},%#%##%&#&%#&~#>'*-.%##%##%}#%%}%'~#)D1}#%*&~#_%%'(~#S2%'.}#~#=##*'*-%}&'%'##&&~'E%.#&~#M4}%%##&'%#~#O1##%&#'+~#<B%##%%'%+~#;#@%}#&%#&&%#(~#H1}'%'##&&~#?A}&'~#D#%32}'&&&&~#[}'(#%}'~#;C})&}%%#%~#=&%,3}%'(#%%~#^'#&&)#%'~#Y%-~#d-%'~#^%%&#&&&}#~#b~2t*&'~&(~&@~0%~e~3}%*''0})&}+~!9##-}#%-hD*)1fC#%/&/fB#40~!+#)*4~!+~!K'&:~!/*7~!.#~!H~!L':~%x&~!H#~!*~%1~!I#~!+A~#p'~!F~~#-#~,,(~.Z~!V~%;'B'mq-W~!N~%I%#&&#&}#%},%%}'%}+X#%}#&}(%}'%}<%}#%}%%'}'%}:~![)9@~%>~#UA%-%##&~!C%~!-.9:~!1~!-^2/:a~!y,D*J#-5)/4~%23,~#G~!L1~!0X3`~!2+~!!0-~&E~!W~!o,>Y&]~%cZx_&~#O*9#A#'#+I'%#)~!0B*-5A+-((F&*M#)(-7-5+'-3a5Vi~!Y~!?+[)%3),ERHm~!+:D,VG.+)?fB%%*(%)'(#&80%1'8`K8?`+'Z#&O&'H5#*9)A%%5&3))0%39+.*7#()&&*=4@**L)<'_&*+..;(#*+)./&0#3)%')-8(4ixD(&.}%,('aI:,)%,k2231T)I'#/-W7,/'Q#.'Y24+h')37</31&83##&0#),H(?'&?/1##%#&&#%''-%&&&#(&''&#.-'%#%%(,')*'&#&#'##%(%(#%('#&##%%%%('%#%#%%#%#&%##h>w+v<ayvyvcg.uuhKr}g/v|g>u9i[~>g5uI~=RvdwEg;v/g;uk!!TTSx]@RT!U!#!@VBRUU!'UTe-d0c`e&gSdicedFcrdTaqb.kYcAohdYd@a3e+d}dMdtd.aJ#bqcK`dle/e.e'dwdPdodddjbEb}ogd^ofdpduc6j?l%d{drdqc)d7bacOdQ%T#Y)X.sR[yH>6Vyv3[xwLu>vo'!*.[yBacahoj>6Rew3[xqdZa#!a&#^(X-[yG>6Vyu3[xvg3sEr|g.u/Ri9db0T#^(Xa)!-[y;>6Vylg4wKs{JwNZt3@3r=c4Z([xlg;wKt!cpq's@v7A'*a(a+!-a#[y<3Dt?3Dt'>6Vym3[xmg9rxsNJwLZt4~?r?db1T#`-!(Xa,!0[yS>6Vz%NuQs.g4wKtnJwNZtS@3r>c4Z([y%g;wKtrdga8!a(!#&T*Y-Xa#!a0<or[yc3Dtq>6Vz43[y3JwNZtf@3s!Ju}!%Dti:pm3c_%X#tjB5pkd6q!r]u?voC'*-a.a2!0a&a+[yI3DtI3Ds~3DtH>6Vyw3[xx;:s#~<5pKJwNZtE@3r~d`a)!a2T#a.(!+U.X1[yT3Dt`3Dtv>6Vz&3[y&g9rxwzcxstPu.<rAJwLZtT~?r@dZa%!a.&^*Za(/Reu[ya>6Vz23[y1g3sEr}wkg{NuQRg{ci(U#5@b`~,cg#U(2WnH5wugcRh7dX#T(Y,a'Ta!!a,[yZ<]mj>6Vz,3[y+Pv#5ReZKu+=,%!H}7ABwkaS?Rh:BcW(X#<]mrj:ubv/ARekdg%!(!a.*Ta(Y.X1!#sP>Rl*Dt6[y>>6Vyo3Wf*jOvuumvuRgRJuq*!:9<B@bX~3jVv&v@s@5Re[d/rQt{uAvo&a&a*)a2!,0Wf!3Dt0=Bs'>6Re}3[xy~<5s%JwJZt1~Gs)c;&!#2sJkNuXvzq7rxu,Re8dka4!a8(aEZ+a@Y.X1Xa)[yd=Bs(3DtP>6Vz53[y4cX#X&Re:avRe9~<5s&JwJZtQ~Gs*i^rzvdRg+Jv{%!2sbB@bX}kdga,!Za?&^*T1/!a'Dt+[y6>6Vyf3Wf%g/u;s4hGu6?Rh-JvZ,!c%#&RoX54Rivj7uyvf8RgTKvZB%*!2sGh<vu5Rgq<=C::9bb~#dZ#T&Ta6Y.X*Dt>[y93Wf)coZ(T,6VyifluvRgC@95@B@bX~/hFu34cC#T,k/unq8w8Q5RkUklwQuzunq8w8Q5Rk8d/rJu?v8w9)-&!a0a;a&aIWejg3sEr/h1s<DtDJvyZqY5aws3Jvy!&Wei~Hr1:au5@Bag>23E~5c:Z&bX};kKv?w&unuVu5Rjc;>bs)#~@:Rh.=ay<a]C;b`}Vd6s/t{uAvoaxa()!a,a7%-a#a2Dt,[yF2Wo[>6Vyt3[xuNuPRi&NuPwpi#RoWh?vf8Ri%Jv]!%Ri:KvxD!.'2WeAjZu`q9rxu,Re7woeAg-unLq(qA_/*2Wg_g3u5q^9:4E}/jTrxrzv=Wkkd~0UX#^^Xa-a1a5T&a=U1a'*aEa]!a*aPaA-adok[y54Rn>;:p3~Dp5g9rpsFNvZqjg3uJp4~<5p0Pw;5qlJwNZt*@3p1Pw:5p/Ou!5p2JvG'!6Vye=<qnJvh_[xhg3v,Rh3kOwOw-sDuev/Re^dha[a%!%!a+#Ta7)-5TaCaO!aka!a)sf[yb2>Rl!9ARiq5E}Qg=ucRkBE|oJrJ_@Wk~@Wk{JrJ_@Wk|@WkyJrJ_@Wk}@WkzJvO_[y2g-vMRmiKuYC!)&>Ri;>Ri<@3RkNc](X#@9Rk=g5vuRmhKvDB!+'=]meg3u4Rmgd)#Y'Vz3CARmfd`a+!%T'!+#Ta1Ta6TaM-sTDt9[yA9sYd'%Y#s[[xpj:ueunaXRgEjRq,v-vuqdd2'`#6Rev<32@5>:2<E}5xIo9a*X#Y(;5RePJvD_g>vyRgNj8w)v8<wggs:RgXiZt|vjx,hSq3ah!-(~@:Ro/Ou!5RhWj^v(pyw8unRhUdx-UY#^Ua.a3a70!)%UX1TaDa)'omRiRRhE[y:3Dsz=Br,>6Vyj3[xkg6ruwjcqsrPw;5r*Ku]D'Zt-@3r(~?r.i[vwv]dU1a--U#`a4(g/vsRhPOu!5RhLj:rmu9Wo!~@:wdh@g/vsRiTjXuvvNr}:RhBj^v(pyw8unRn]dz1UYa'a+^Y(!aETZalaRY.Ta?a4[yDJw1!#qLsW>6Vyrfzq-pLflpwRe|Js>%!Dt@3Dt&Jvy_[xs~HrnjMuwpsw'RecKu+D#'!t<~Grl~?rjg5u-x,gwp{ah!-(~@:Rg~Ou!5Rh'jXuvvNr}:Rh#cW#X/c;&!#2sLi[v7u7RgpJv)(!iLrxu,Re6j7v@s@5Se[e7d`aW!Za(a`T.a#!a3!&aDa-!9)Dt_=6s+3[x~~DR|h~DS6avhGun5RkZj3w)v-]mkKunB!&*]kb97R|i<ARk<c:Z(6Vy}Juh'!wziMRoS:F|vkLuauJv5vtvQRh1d='T+Y#VyO~DR|jcF#T'7R|g97R|kJv3'!ay<Rj,Jvh&!:ReXcsa6*a+#a#_aIRf9aLRf?c,Z&Rf5Rf7c.Z&Rf;Rf>cQ#%T'p-Rf8Rf=ct#%'(*!,p,Rf4p+Rf6Rf:Rf<d~'Ua%U*^UYa(!a,-!#a4YaTalaEX0a8a<Weo3Dt/3Dsx=Br93Wen~Dr;~<5p<JwNZt2@3p=Pw:5p;Ou!5r3c7&!#:p>3Ds}KvGB)_6Vyk2sM=<r7x'eovA(!hFu1ARf}cV#X&@r5j6rvwQa^Rf3c=Za'wkghJv__g;unRggA53B9=b^}%j6uduo5Jq;!(hIv%2Re`Ou4ARe_e%a#^^^Xa&!a*a2!&a6YaP!*ad!#a:aE/5Rn?[y@>6Vyp;:pE~DrY~<5pBJwNZt8@3pCh=rt3rWPw:5pAJup_[xoNuPpF9c!#'45pD5ARn)d8#X'X*3@rU72s]h>v<<sSjJpqvewOJq/(!hNw'5ReBk0s2u3w/w'5ReE5@Jq.!a+JQ!&WeU23d(#Y&RjG5]jBk!u7w&u0udARjEe#+^^^Ub#!a2/a`Z(agT1!a-a;|@TaG!aS[yV=Re~fow'RguNuPRe?bz#'>RoUWeL>:Cbb|?JwPZtVg6ruRmzJvD'!6Vz(g/vmRh~Jvy_[y(g9voRgyx*cy(#2>Ri2B9b]~9kIw9u7rluJu3Rg]dI#a%UY'@=p%CAx.gQZ&RhwwygtRm{x5g_Z'+ABqR9Woa=Bp&dV#^*Xa'!&@o{g4v]Rk;Jv{!%Rk[wkkiA5RkiwwfUB=x,fUuqC&*!>RfTg8v0RfV~ARfSd;rJsAuAv9wR'ae+/aO!a@aza/a#[yQ@Wg!2Wemg3sEr0JvB_g>uvReWg2v+Re=KupB_+[y!2AbY~-~Hr2AJwD!(h<~El>h<~El?Kun@+_:9b`}Kg-v/Ri3g;vtwyk_9]k_d=&T#*U.6qh@Ab`|K9:H|CJv[!&3Dtex'fDwC%!Rf[9WlMd[(^X,!a%Z06Vz!@WgBg=v~Rgvg,QRe@awd,#Y+jTv|Q~EfWj]uNr|~FRfXdy#Y&^Ua%!aO.!(a)Ua;=!a@aKap!a-,a!Ta]a[rSa]p?[y82sK=Bq~;:p:~<5p8Pw:5p7d'#Y'Wf(;RnRi[u4w&RgJJvG'!6Vyh=<r#ijuuv/sIKuYD'ZtG@3p9~Gr&d2#`(g<vtRgFj`u5w&rqpxRf2CJuY!+:wfnTOu!5Rg}jNs1ucv&RfwJvA!&3@q|BDcC#T,k/unq8w8Q5RkTklwQuzunq8w8Q5Rk9dga#!a'!a=#a0!:+Tb*b@aO.a4!aba8aFJv^}?!VyR~Dr<g;u%Rn.~<5p[x'e`wNZtR@3p]Pw:5pZhNvjBp.woe_g5u-r4JwF!%DtO3:ooc7&!#:p^3DtpLuGw(!+%)Dtk6Vz#2sd=<r8d'#Y([y#<x3gJt`w@!)%}MRiowzikRij=]ilxAf3,U(#B2Rf#g0v-Rm[ck{`U#]giKv3>)!&6Ri154s,KuGB_%@r68r:dJ|t`#X(9<E|u2@H|rx3gJu?w'!+'1Nu7Reg4=H~+9<wxgY95Rm]xLggZ-`(X}U2:Ri4h<uOawRmsJv__5@bb{jbV~3dka#a'a]!,#a+U=a>b6a3b%!/aKa/)!arwve^VyJ;:pR~DpTg3uJpS~<5pOPw;5qmPw:5pNOu!5pQJvG'!6Vyx=<qoJvA!{~Jup!%@qk7Rn/KvyD!}''[xz;>wkh'?Rh,x8gyt`w5D!&),(SgyccRgztJ@3pPB5p#d'(Y#<]mmifubw&RgoJvE&!82s^JvF&!8Rf,ADb]~;x=h'rNu]vK!,%'*0RnORh)4Rh*AqQg-vaRnNg;wHwkh'ba~4cE#Ta*x3gctyw@'!+%RnFRnD<4Rn@hFvK5RnCxWg[#`&a0Ua()`1Rm75Rg[c]%X#qi8Rg^NvdRj>BwzgZauwji7Rm6A4wgg]d1#&(*,.0a#Rm;Rm<Rm=Rm>Rm?Rm@RmARmBe%#^^^Xaea?aC/b+(,!a+a#!a/!>a&Ta<aKbD!2wphBRnk[yPw}hE|.=Br-3Dtm>6Vy~g6urRf.x,hPrNav!%'RnqRo%Ro#Nu;q[Pw;5r+JwNZtM@3r)d'#Y'Weh;xChL#`&RnmRnoKu}>%(!Rne~Bs-;2wjcussJv+'!aYSO}6@B<5?ba~8LrNvj!.%*ROwungw~ng~:9;Ri^>wtnig;wHRnixDh@|(UZ.x1h@|)!#:2<H|*xHn]#-UX'3Ro)z=iT}6ARns=Bwsn_wpnaRncw]aR(#UXa&Ua*a/=]iPd'#Y&Ro'WnXf{QRm2hNvj]nZd`'T~&1`{|`#9b]{}c:'!#Wl{>@=be}]?cl{{U#:5Abb}Jds#^YaF!a*b4a#a3aPa>&Tb!bH!*a_!Eau?/a&RjY<]gj>6Vz*;:pe~DrZg,QRj1JwNZtX@wihspcJvZ&!VyX9WmOJu|!|N2WmHJvh&!]ht~Bpbcn&T(!#RmQ<s7Nu;padH#X'`+WmJ@>RmKCARhnKup=!)&Wf+:RhqNuPpf9c!#'45pd5AwghpARn(Ls@w!%,)!RmP@Wfe<E|IJva!&WmNg8vsRmLd`*.`#Y'Xa!axRn*]hrA8Rhug5s@rXg8u!RmMd8#X'X*3@rV72smdI*#UY&RmICARho~GsgxVgd)Ta'U-Y&Xa!T#RnEWnA@Wffg1uDRi0hFvK5RnBxGnG&#`%owp)@wsf+bX}Ze-*1!a*^^^Ua|!#a.aq&Ya2!a>.a6!a:aO`aJDtL[y`@Wg#>6Vz12@wzoYRoZNuPRi!NuPRhzg=ucRi,@=b`{Yg=ucRi-ACJvB!&Sh[ebSh]ebi`wUuFRm4Jw2_[y0JvB!.<Ju(!&SoG}6Shd}6<Ju(!&SoH}6She}6Kur@._g5vHRieJvx!{L2G{Kx6gd'T#?Rh82Wi5cZ#X(g1w)Rm5dW-Y(Ta#!a)!#aYa=wnfE=su2>>bU{0j9udv:<svj8uQv-7RgHdE%#^'sq9sp=>Bb_{TJv`!&g/r|snj6v(us5d,#Y(56H}[978H}]Jw5!&g1rushJvB!+j;v{u5?zDhd}6}bj;v{u5?zDhe}6}ce*#`(^^^a[aea!=!a6a*aoXb1a.!aAbL!b>,b'aL!aV@Wf|2Wlg3[y/JwNZt^@3piPw:5pgJunZou3@rsJva&!Vy_g<v~Rm#JvG'!6Vz0=<r{Ju{%!:pj@WfsiXuJu3Rm:JvZ&!WfA~Bph@c4Z&Dtwax5rubx(#:awRk1@d,#Y&RfjRfid1#,Y(@Wfp2Wlrg5s@ryKu[@!,'=]ig9wlk?Rk>g5u-rqJvy'!@9RkQcH(T#=>Ri~@<wkj(Wj(KuZB*!&<7rw@9RkRcH(T#=>Ri}@<wkj)Wj)dg(Ta2Xa9X#`-!a*CARhg@@=I}d9x;c~#X%so=<sj>2@@=aybb}XjWv0Q~EfEj3vLv;<d,#Y(56H}`978H}_dgaPaFa'a/!#a3Y0a_a;a|!1(a7-[yE3[xt;:pJNvZrrg3uJrvJwNZt=@3pIh=rt3rxPw:5pGOu!5rpJvG'!6Vys=<rz@c4Z&Dt(ax5rtJvZ!&~BpH@wsfNg-vaRlNci*U#=<wei<F}a5@Jq.!a*JQ!%@qZ23d(#Y&RjH5]jCk!u7w&u0udARjFd/prq=tyvpaEa(a:.!a1aZ(@@=I}:9wpd%=<sX55w_h}@@=I{t=ay<aU@@=I}T=ay<2@@=I})?C9:9au@9Cb]}DP~=x-fAZ(2Wl1=ay<aU@@=I}>5@d##Y+jTv|vV~EfFj]uNpn~FRfGdgaK!Z2&!a8a-Tb({E!acTbM*!a(DtY[yYd'%Y#sl[y*hHvh>Re5x2c{Z}.j4uCvcawRiMd+#X+_x&d!},<5RkX;2Hzw@x,gavfB-!{CcF&T#Roe;RodwWbBg5urRgaKvHC*_6Vz+<4opieuew&Rmq@d]&Y)X,T#X0Rh}<BqP=4qS9:ReMg/ujReNJw0!/<Jui%!bd{kawwnemRelAxUa?a3#*.&UX(Ya+a/RhvRnQ<o}9Wmtd-#Y&RgSRmw9;Rmxay=Rmyg-vaRmuxEhSrNu,v-voC!%(aR.a(a7+1Ro1>Ro5CE{A9b]{@;5x#eO{:g;urRi+KrNA!%(Ro3>Ro79;Ri_Ku@>{;&!x%gX|{KunA_+g5QRj/g3u5Rj#g>uERj%wio/xRhS&!,!#^1U}wba{8>>@=be}qC@:D5ba{7Ku+A&!}x?ba}t>>@=be}se(aA^^^Uat!b0#{pa+awUazbGa#aLb9bgaWac'a5TbS=Br!d1#`%scp_Jvl!#rT>Re0JvX&!VyN=H{Fcm#U&:pY=ReaJv2&!]h0=]nUJvG'!6Vy|=<r%JrM_=]h2@Wlud'#)U'Wf'b]{i=]h/Jvh!&~BpWg=v]RnMx+ny#'Nu;pVwjnu=]nwxJnx,T#`&Reqwjnt=]nvieu9vrRjLLuYwP(#+!th@wih5pX~Gr'g5v/Rh4KunA'!-CARnP@wwiN:Rm_9x'cvw>!|l=<saKvAA!0&3@q}>w^e1bp#&Re2Re3BDx7gH#T|f5H|eKuZ>!%(:qNAH{]Jv6!+3B2B9=b^{X<5<B92:E{ZLvhwA(a;a%!igQuyRmad+#Y}m@3Rh5d8#X'X*:AqUAHzmaxwbh<aXRnVcF}RT#Nw&cj#U(BWnug/vsRntdka)(a3+.Zb7aYYan1!bVa@Xa}[y^@b[{G=H{+hFu73Rj&Pv#5ReQcK%T#sig1v{Rj'Ku+D#'!t]~Grm~?rkKuMB!01d5#`'Vy.ta3Dtu~Hroc8#'{^45s85AwZbP&!#Rn!wghxWn#KvEA!)&2RlA2RlBx:h|#(T,=]j09Wobz>x]z/@awRoTd+#Y(az]hFhCrm4d,#Y+jTv|Q~EfMj]uNr|~FRfOdCa!Xa9_X#@<plJvf!%b`{(9;Rgwc;.!#2x7cw#T|UDb]|T5Ju={(!=@E{&Jv)&!Ab`{'awJvf!~*>>@=be{#KuY>!+&4Ezyi[ugv&RjIdea+T)#UXa&T-T&a!Rh9auRmW=]kLg5vuRn+g3u4Rn-Ow6ARn,hHus5xNk?#UX(U~)/g8v0RkD~AwkkF?Ri.OuNBwkkA?Ri/d|a2`a*^UYa.!aBTZaTa'Xa;!(!2!-a#b2[yC>6Vyq3[xr2Wi?g1rusVh%s?DtF~<5rbJs;%!DtBfswKtCj[uvuSsEu3RgVx3o:u+wN'*Zt;@3rd~Grh~?rfg8w)Lq)qE&-a%!>bI|`jWv0vV~EfCjTv|vV~Ef@j]uNpn~FRfBcK#T']gWNu7x,k7q4ai(0!hHv8<RhmkMu9vrsBuev/RhlCJvB!,g<v{wchh~@:Rhji[vrv{wchi~@:RhkdS&a5UY#Ta!RgPwwiI5BwciI~@:Rh`x'iJvj'!5]iJPu8Bwch]~@:Rhach)U#h3rp]gLh@t|Ax,hTq3ah!-(~@:Ro0Ou!5RhXj^v(pyw8unRhVd|)`,^UYas!a?/a2Z'a^Ta{Tb7Ta(a#!a,Wf&9sZ3DtAadamov=Bqt3[xig8vsRm~>waiL2b`{QJv*_Ouv2qgj<v]v2BqfdR'X*X#Y-@3qr~Gqv~?p6hHv-]glPup5Lq+q?_%*b_{qF{n9b^{rOu4ARhpKvCD!+&~Bqp:5Dbb}nwoiKl&unuTuBv]v+ueunaXRf0=Jvh!0nKufu8v1w&w7q%w&uHrz:Rgnj5w,uxDJq/(!hNw'5ReCk0s2u3w/w'5ReFd>Za&!*UaA=<wkgsRnSJv^!%Refifw3vyRgOKu_B'!,<]gkiiu:w&Rh<=C@a^<B57@2F{[<B5@aW:=3away9A5aW=<B=C@a^<B57@2F{Ie-#`(^^^bCara.b8aza6!/bZ,!adTbnTbOb+aFaS!aAT9@Wf~2Wli3Dtl2@d,#Y&RfnRfmJwJZtN~GqyJva&!VyMg<v~Rm%iXuJu3Rm9Jv[_=]ih9wlkDRkCd1#`(@Wg>2Wls3cH#T(@<Rj*=>Ri|b~'#23s9h<~El.d'#Y&Dtxi^rzvdRl#d*#U%(o|B2s`hJwSaxRmDKv4B&!1:Rmdd5#`'Vx}to~Hq{x'f1v3(!BA5ba|bJv_&!Wfug1v]ReIdO+U/Y#&G}-8wze=Rh{g1v]ReHg/uQRf/by#)ibQwERl/cH#T(@<Rj+=>Ri{cNu+vlax-!(#a0qa9<Rii2;;bU{H;x<i=&X#Rk`<4wwi=C9H~8xAI(Y#<azRi@45wXI<B9;5bb~7dL(X#Xa(+!aL6Vy{g5QqOau:5au2@ay547EzbxOcU(UX-T#Ta#:Cbb|A?wjh/b_|SOw6ARgtihr}u7Rhy<d1#T)X1@@=I|~=ay<2@@=aybb}Sj3vLv;<d,#Y(56H}A978H}@dGpvs@uAu`vcw9*!aFa+ai%(b!aXa8.a?a[ozWey=sU2@G}Nch&U#Rf_WexKu+D#'!t:~Gr`~?r^j]uNr|~FRg*j^psurwJt|RmcKv)@&!)7Rkv~Br[@wxfO:Rl3co#U'6Rezj_q#vIuavjRltwzeyh@vr5JqD0!>aY?C9:9au@9Cb]}9cl#U*5;5<H||jbuus1ucv&Rfvg1v~d/pppzqFr^a--a~!aMat1(hFv;Wiz@@=Izoj5uuv-7Rix~Cw`fk2WlVcZ#X,k)u3vWs@u2]ktg;wEx'fBq(_2Wg/jTv|vV~EfoJv]!15x'hzqG!(P~EfU~CRl_j6v(us5x4i-#T(2WmZ?C2F|d>Kq<aj1!*jTqIsBv=Wl`~Cw`fi2WlWj`v0u*~>RlR=c>Z,k#u3vWs@u2]kr<c1Z+jTqIsBv=Wla~Cw`fm2WlXdmb3!a{(arZa`bkTa%TbQTa-a9+c'!aM!/[yL=Bqug.w'RifhFvyDRj.g>vgwyk^9]k^Jv3_@WfbAARkhJw2_[x|JvB_wkoIRoKwkoJRoLd'(Y#<]gm=<9<H|yd'%_X#skDtb3awwqkgNulRkgdB#^',9:p'hJwSaxRmEBwVb8@4=H|qLu+w50&!)@3qs~?pU>Awwn;;Rn=c:Z'ARn<=<qwKvC@!/&~BqqJv6!&]eVb^z^xRge'/a%+^`#Sge}6<4Rn3=]n0Pw2>Rn8Jw0!&>Rn:>Rn6cY#a7+!a&=<wkaNw~h3z_c5Z{=wjh#=]nLKv^D!&)Vyz=bW|swYb<WetcG#T(2wxa@qVx@gD#Y&b^|V5JwG&!5bb|pg/w&RgD@x=kHs=uAvn!a%%/'+RmSRh694Ro`g-vaRmRhHv-]mlxCcS#`&ba~.5cD#Ta)P~=d,#Y(56H{>978H{Dd_#{2^Y%_+qbbb{6g3sERhsbU{?dfa.,`a(Xa<!aiX#(55RiG54RiHcI#T'WiU3RiVNvdwtfcRlKNvdd,#Y&RlHRlExQgf.1*^T'X#Sgf}6Wn4=]hfPrk>Rn7Jw0!&>Rn5>Rn9Lunw?&a2!,5<oq@@wqfdRlJj5Q~=d,#Y(~ARfcOuN]fdDKw;ay(}i!547E}j?cI#T(@5bV}iCbV}hdv(^^Tb?a40,b##Tbo!a*bR!a<b|a/!aKai!aU[yK=]o^g:v>ReGJwPZtK<7Rh+h<~El,Pv#5ReR@awwxjCg,ulRjDJv6&!]j!z?aQeeg>w=Sh<eeJw;!&axEzOg,Qosc!#*:wkeJ]eJ>x'h-u(!%Ro.w~h.zPdNZ(X,Ya![x{;9ReY;wkgxRiF:x?ap#Y&RmUg<s2Rkod]+UY0TZ'!a&A9sw<=bczLNvuw{gqzNhJwSaxRmCKuLay!#&s_Rf-55b^{uJvZa!!c%#(55Ri654wmiu5RiuawLu,vp!+}^%b_}Y9;wkgxba}o>A9:=b^}zKuh=a''!3awRk3c*'!#aHRk6c+Z&Rk5Rk4Jv)&!awRjSawd9*`#0?C2@EzMj8u<uJ5RmbjQrquJu3x,k>uq@_+=ayb^|W~ARkEOuN]k@7dhzV^X/X&a-#zRzSb`zXcJzTT#2WkVKvDBzW!%FzY9;5bbzWjQrquJu3Jw3%!b`zU=ayb^zQd:#X(T-a!6Vyywxh}=b]{Jg=u1RiAdGp~qHtzv!w(wA+a+a;<!aJaYai'anasb(=azRmV:Cbb{MLq2vb!%')RjuRjrRjtRjqx3jnqCw3!%')Rk(Rk+Rk&Rk)Lq2vb!%')Rj{RjxRjzRjwLq2vb!%')RjsRjpRjfRjex3jcqCw3!%')Rk'Rk*RjkRjl9<CbbzfOu4ARhxLq2vb!%')RjyRjvRjhRjgx=joq*uKvb!%')+-Rk.Rk%Rj~Rk-Rk#Rj}x=jdq*uKvb!%')+-Rk,Rk!Rj|RjmRjjRjidAq&qKs@uAv8Aa.'*-a@a&0!aM@a5[y73Dsy3Ds|3Dt):wxgI2sHJwJZt.~Gqxwsf0ikrzt}Rl0Jvy_[xj~HqzKv_A|D!&WfP8axRoVcf,U#k(v]v+ueunaXRf1Ju}'!g8u#Ri=jQw!sCunLprq>!,')~<5qeGzq9F{W=c##%s5au:5aU3CBE|;d4#X(D!a&6Vygx(b;#(=]ed?C2F{N<capoq2r[a&!aPa9,'Pw;5s:@@=I|,55w_h|@@=IzcP~=x'fCqB_2Wl2>aU@@=I|1OuNBc1Z+jTqIsBv=Wlc~Cw`fl2WlZ~AcTa%!Z+jTqIsBv=Wlb~Cw`fh2WlYk+uNqJsBv=WlSg,u3dca3#UXaMYa)TaB-=cM|7T#<bI}l5@B932:aV2G{BOuNBJq:|M!5Ezt=<B=C@a^<B57@2F{v>cB{/T#=ay<bI{3Jv6!a.6BKq0ah&+!5E}HP~Ef{978BaU@@=Iza<7d#.Y#978BaU@@=IzH~AJq0!(@@=IzG978BaU@@=IzFe,aU*Y&^^^bvJb,b:bFad!a,c2Ta>aL.bo6!a#CbTa'T#Re{2Wlh2@G{yg6t~Ro_NvdRfticuRQRllJv3&!x&c|zs@Jw3!%RflwpfkRlpKuL;%(!Re<@G|C2GzdhIvuBwgjAg-u0RjAKQB%!(GzZ@G|5NuuRl7d='T+Y#Vy[g<v~Rm!==G|>JvA!)@wma=]m1ifuaw&RmnLs@vT'!|/+[y,g:v>ReTJw1!#qX=x!eC{bLu+wT&)ZtZauq_~Graci&U#F|89:r_Lupvq!.)&2RlG8RfaC=x!eF{_h?rpWlmd&'!#X|&]k::xJey#`'T|+<E|&2@H|%dE#(^,g;u.RiEg6vjRiC9xCkA{O|zY#g=ucRmXKs0@!&*@G|m@awRknJuh!,3d(}gY}eJvj!%Rm):Jw3!%Rm+Rm-Ls0w(&!a(a#@b[|6cZ#X'7RkxWgAOu4ARn'dH'U#Y*Vz-Wm'CARm}d]*#a%^a*T'aK!a<9bV{PC=p*Jw4!&SgxcbB5r]idw(wBRmF7xFkt#&`(Rm/Rm8E|!JuY_9:Rl5=wrgr2:bbxd@xXfB(a*#T+!.X0X1Ta/a'T&RlDRfL>RlyARl9b[z[>RfZ:RlL:RfRwlg/ARl;9;RlxKv,A/!%7s69<74=BA5ba{-8Bde#`a<XaKYa1,a'P~=wxfB2bZ}}?C972@@=I}r8@55B9;5bb}G978B2@@=aybb}3j3vLv;<Jw3&!>Rfk=ayb^}4~Ad1#`*@@=aybb{w2@>==<bbz]dx+UY#^UaF!a9!bB'Ya1.!ajXa#%olRhD[y=3Dt#Ov5BrHKuMB%!(Rf^Wep~HrJwkiQjKr|~FRg)Ku+D#'!t5~GrF~?rDdV)UY,Z/_7RkuG{<~BrBg,rlsO:235B@bX}|d?a1!#`(6Vyn5@d##Y+jTv|vV~EfIj]uNpn~FRfH7Lq2vb1!a9-978BaU@@=Iz9978BbU}#~AJq0!(@@=Iz8978BaU@@=Iz7~AJQ|}!978BbU}!JvkaK!AdUa21-U#`a+(g/vsRn~Ou!5RPj:rmu9WhOjXuvvNr}:RhAj^v(pyw8unRn[kPr}p|u7vwv]RiSBd;pppzq@qHQa?(b.!a.a`@.|xa(hFv;Wiyj5uuv-7Riw~Cw`fg2WlU978BbU|wOuNBJqG!(P~EfD~CRlQcZ#X,k)u3vWs@u2]ksg;wEx'f@q1_2Wg.j]uNpn~FRfqJv]!15x'h{qG!(@@=IzK~CRl^j6v(us5x4i,#T(2WmY?C2F{1>Kq<aj1!*jTqIsBv=Wld~Cw`fj2Wl[j`v0u*~>RlT=c>Z,k#u3vWs@u2]kq<c1Z+jTqIsBv=Wle~Cw`fn2Wl]dn1#c(a(b^a2!b/bAT(bj!aDa7bu,a_a{c0!2T0g:v>ReD2@G{42@G{5~DpM~<5rc=Bx6i>{RT#RnI@zCx]y]z:2Jv[!zr5Awyk]9]k]dD(Y+X#6Vz.g=wKtgwhaCwgmTWj2Lu,w%_+/[y-B;b^xeg3u3Rj-2@bX{*KrJ<!+'@Wg(g?QRlC@Jv`!%b[zIwsfII}8JQ_@w|kW|=Jv(%!AqcOuNBJvEzh!bYzjLs@wP#(0!oy@>RkdJwMZtc3Dtd@BcG#T'9bWxg2@2Fznd*#Y+;2x'c}w<zizixNgwa#Z'U+!/!a'!a+w~g~z6wcn{Rn}wcnzRn|5Rh%=]nJg5vuRmvNvdRlvcprJu}w*az*a#!%.a.'Bot9qT]kj@Wg'ay2Gzv@Jv`!%b[zEwsfHI}1;ck#Ux`<Cbbx_Lu+w!a&0*!wko*wwo,So,}6Juqxf!E}PigQuyRm`d3(`#8>Rn%:A5B;bZ~%KvhCa!a2!x>k7#Uxb@b{#xaRk7Jw0!)>wwhlShl}6>wwhmShm}6CJvB!.x'hhvj{!!5Bwkhhbaz}x'hivjz~!5Bwkhibaz|xEhTrNu,v-vpD!a%&/)a3a.,%Ro2t[CE{)@3re9b]{%wjo09:rgc:Z&Ro6=<riifuaw&RmoKrNA!%(Ro4>Ro89;Ri`dSaL'UYzxZb)7Rka3xRhT&!,!#^1U}vbaz{>>@=be}yC@:D5bazzKu+A&!}{?ba}y>>@=be}wxBh[t`u~vJvr!%a!a()a,a0a4RoC=]o;Ju(!%RoGRhdwjh`=]oAg>w#Ro?g5vuRo=NvdRl|Ku]C.!&;RoEJvB!%RoORoMBx'h[v+_?w~h`}~5?w~hd~!xKh]oiptu-utv.vp!#%&a30a@a'a+(a/aOp(o~p!RoDJu(!%RoHRhewjha=]oBNvdRl}g>w#Ro@g5vuRo>c[#X']o<CauRoRAd-#Y':RkpauRoQKu]C.!&;RoFJvB!%RoNRoPBx'h]v+_?w~ha}t5?w~he}ue!/UbhYacXaW^Tc&a;b:a-c/#b&aja1(!cL+!bKbt!bmcRc9aIc?8[yW3Dtt94Rg`Jv}!&SiRMzBhEebShEMNuPRe>x7gL#TzuwjirRipc<Z&>on;>z=h-MSh.Mwqczx'a7vj&!>Re4@=ResJt__NuPRi*NuPRi)j]uNr|~FRfzKrJ>_+@Wfy@Wf]2WocKrJ<!+'@Wg%g/QRl@@Jv`!&awRl<wsfFIzgLu(w*!.*&ShBMwvhIRhI9;RhNx1hK'!#Sn]Mx1hK~0!#:2<H~7cNu+w7D*'1ZtW>Rn1~?rOc:Z&Rn2=<rQ<7wjh&=BSnLMc]#X(6Vz)w[b=a!U#9wzgMc3#&(RgMRitRis<x,gKt`ax!&+SioM=BSilMc3#&(RgKRinRimKurB,!&SiQMzBhDebShDM6BJQ!(P~Efx978B2@@=I}WLrJw!!,a*&@G}O@9wkibRid@@x'fKwC!&SlDMSfLMjUv~Q~EfKKv3@a+!(hFv-]mpx/hYZ(C5RiWz<o/MwkhY?So/M@x,gbvfB*&!SgEM:SoeeehFu3:Rgbda(,^TZa)X/7Sg[eb:2RgI~BrMC@wgkc:wwkcRerx3h(uUvK!&*,SnOM4Sh*MArRg;wHRh(x=h;rJvPwI!a4',a'0@Wg&=BSh/Mg>w=Rh=g3w*wwgGRgGcW(X#;Sg}M2Gzk@Jv`!&awRl=wsfGIz`dKZ*T'Y-:RhR7RhQg5u-p`j6v(us5d,#Y+~Awkia?RicOuNBwkibba}Ld6p~tyu_vbAa'a+!a/'a3aEa8a!>Sh,ebJv{!&Sh@ebSaReb9;SgwebNuPRi(NvdRl)NuPRi'hHu^<Rm^Jvv_@Wl(g;u1Si/ebKu'B&!*Sh?eb@Wl'z@aPeb95Si.ebcpputyvjB)!,&a+0a%ShAMWeK@G}C@WfJ9;RhMwvhH9w{ia}ix,hJvRA1(!zAn[MRhHx1hJ~*!#hFv(BSn[MBJQ!(@@=I~'978B2@@=I}2db.Ua<'X}+T#a0XaG2G}E;wkg|wuh!Rh!x,hZu,@)!&So0MVy)C5RiXACJvB!&5RiY5RiZg8w)cG}*T#2@bU}=KsA>(!a.3wkhZba~(x,h^u(A!&(SoCMRhb5Bz=h[eb?w~hb~6x,h_u(A!&(SoDMRhc5Bz=h]eb?w~hc~6e)aA1T#T,^^^c-bMb&blcPaP(a/!0!bA=b5c@a(!bfbrc#2afwmhARnjwchORnp2Wlf3DtsNvdRl-2@wpa<]m0bx(#:awRk2@Jw3!%RfhwpfgRlnKQB%!(G{V@G|'NuuRl6d='T+Y#VyUg<v~Rl~==G|<Jv+'!aYShC}6@B<5?ba~8@Jw3'!g2QRljhLrpWlOd+#Y'g.w'rIg>w*wgj@g-u0Rj@Lu+wT&)ZtUauq]~GrGci&U#F|39:rELrNvj!.%*RhCwunfw~nf~:9;Ri]>wtnhg;wHRnhx3hDs@v~!/+'@Wfr@9RkSNu&Rlo=@<5GzoKs0@_+@Wl+@awRkmJuh!-3d(}pY#qWJvj!%Rm(:Jw3!%Rm,Rm*de&!1U-U#`)Re;@G|.@9Ri82@wjfvRlq=@<5GzpLvOvr!).&2RlF8Rf`C=x!eE{.Jw3_g2QRlkhLrpWlPde(!#U{s,UXa*Ta'[y'g:v>ReS;x0PZ&RnlRnn~HrKJw1}f!=x!eB|2w]aP(#Xa&a*Ta.Ua2a7=]iOd'#Y&Ro&WnWg;u.RiDg6vjRiBNvdRlzhNvj]nYJuW_2Wm3x)kFze{9d])!a.!,Y01!#&aC!a3RndC=ox~BrC@2b^{pg,rlse7x'ksuq!%Rm.E{xidw(wBRmGx9o+)X#wwo-So-}69:Rl4@xSf@a#XZ'X)X,Ta(/ARl8b[xc>RfY:RlI:RfQwlg.ARl:9;Rlwdn'#^XafaQa1X1TaHTa)@b[{zcZ#X'7RkwWg@Ou4ARn&x)kG#{,g7u/RkGdH'U#Y*Vz'Wm&CARm|bx#(A]gUbUzJj9Q~=d,#Y(56H}l978H{U7d,0#U*2>ABb_xZ978BbU{e~AJQ{g!978BbU{hxMh?ad{oUYZ.x1h?{l!#:2<H{mx3n[t{vl!,&a%3Ro(z=iS}6ARnr=Bwsn^wvn`Rnbd`*T}B0!#^X'BG{c9b]{a>>@=be}F?JvS!&BG{d7BG}(Bde#`a1X,Ya@!a'P~=wxf@2bZ}I56B2@@=aybb}08@55B9;5bb}<j3vLv;<Jw3&!>Rfg=ayb^}&OuNBKuLA!)a!P~=x#fD{f2@>==<bbzl?C972@@=Ix^d6rSu,v7w*C(0a)a6#B+a%!sQ[y?3Dt%3[xn~<5rLOu!5p@Ku+D#'!t7~GrP~?rNKvlaya7'!h+v-5qMg=t|cd,U#5AAaa5Abb{S@52B5@a[@52B5Gx[iXueu;d<#`a(!/549C;ag>23ExY5@Dah89b^~689Jv)!~2b[~1Lv'w(%*!a#bX|aPrmawRe]keu7uhv-q6rxu,q`xTo]/a5aU!bNaDXbi!b-!ao!b<bwA!#5@B932:aV2G|:d-)Y#hJrL>RhG<7@C5<H|_=Cau:5aj5@B932:bJ|ng>vIbs)#?C2F|9jPv0w.vISh-MKvUaz(.!9ABbb|[5;5<H|Eg>unwfh;9:4E|YjQsBt|vjx'hYq3!(?C2F|J:2<BaY?C2F|GOu!5x,g|p{ah!-(?C2F|c9:4E|OjXuvvNr}:Rh&i[w*t|cd+U#jJvsu)vsSn~Mkfrmu9p}u7vwv]So!McW#Xa!ax5@A5aY:5;5<H|>kJv~vYrquJu3x4ib#T)2@SmZM?C2F|Bj:rmu9@xPhI(a*a#U#`a3-5Abb|L~@:RhK9:4E|0@52B5G|#C::aY?C2F|-:2<BaY?C2F|.5Jvk!a)javYrquJu3x4ia#T)2@SmYM?C2F|HAxPhH(!a#U#`a*-5Abb|4~@:RhJ9:4E|R@52B5G|F:2<BaY?C2F|Sc^#Xa2j=Qq5CJvB!-g<v{z;hhM?C2F|Zi[vrv{z;hiM?C2F|XKsA>!a)-g<v{z;h[eb?C2F|]i[vrv{z;h]eb?C2F|^iZu.vix,hZq3ah!.(?C2F|QOu!5ShXM:2<BaY?C2F|P",
|
|
7
|
+
13_494,
|
|
8
|
+
2713,
|
|
9
|
+
49,
|
|
10
|
+
25,
|
|
11
|
+
61,
|
|
12
|
+
);
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
// Generated using scripts/write-decode-map.ts
|
|
2
|
+
|
|
3
|
+
/** Packed XML decode trie data. */
|
|
4
|
+
export const xmlDecodeTree: Uint16Array = /* #__PURE__ */ new Uint16Array([
|
|
5
|
+
512, 26_465, 29_036, 7, 0, 2, 4, 116, 24_638, 116, 24_636, 8693, 29_807,
|
|
6
|
+
24_610, 621, 1, 0, 0, 3, 112, 24_614, 111, 115, 24_615,
|
|
7
|
+
]);
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
// Generated using scripts/write-encode-map.ts
|
|
2
|
+
|
|
3
|
+
export default "9Tab;NewLine;22excl;quot;num;dollar;percnt;amp;apos;lpar;rpar;ast;plus;comma;1period;sol;10colon;semi;lt;{8402nvlt;}equals;{8421bne;}gt;{8402nvgt;}quest;commat;26lbrack;bsol;rbrack;Hat;lowbar;DiacriticalGrave;5{106fjlig;}20lbrace;verbar;rbrace;34nbsp;iexcl;cent;pound;curren;yen;brvbar;sect;die;copy;ordf;laquo;not;shy;circledR;macr;deg;PlusMinus;sup2;sup3;acute;micro;para;centerdot;cedil;sup1;ordm;raquo;frac14;frac12;frac34;iquest;Agrave;Aacute;Acirc;Atilde;Auml;angst;AElig;Ccedil;Egrave;Eacute;Ecirc;Euml;Igrave;Iacute;Icirc;Iuml;ETH;Ntilde;Ograve;Oacute;Ocirc;Otilde;Ouml;times;Oslash;Ugrave;Uacute;Ucirc;Uuml;Yacute;THORN;szlig;agrave;aacute;acirc;atilde;auml;aring;aelig;ccedil;egrave;eacute;ecirc;euml;igrave;iacute;icirc;iuml;eth;ntilde;ograve;oacute;ocirc;otilde;ouml;div;oslash;ugrave;uacute;ucirc;uuml;yacute;thorn;yuml;Amacr;amacr;Abreve;abreve;Aogon;aogon;Cacute;cacute;Ccirc;ccirc;Cdot;cdot;Ccaron;ccaron;Dcaron;dcaron;Dstrok;dstrok;Emacr;emacr;2Edot;edot;Eogon;eogon;Ecaron;ecaron;Gcirc;gcirc;Gbreve;gbreve;Gdot;gdot;Gcedil;1Hcirc;hcirc;Hstrok;hstrok;Itilde;itilde;Imacr;imacr;2Iogon;iogon;Idot;imath;IJlig;ijlig;Jcirc;jcirc;Kcedil;kcedil;kgreen;Lacute;lacute;Lcedil;lcedil;Lcaron;lcaron;Lmidot;lmidot;Lstrok;lstrok;Nacute;nacute;Ncedil;ncedil;Ncaron;ncaron;napos;ENG;eng;Omacr;omacr;2Odblac;odblac;OElig;oelig;Racute;racute;Rcedil;rcedil;Rcaron;rcaron;Sacute;sacute;Scirc;scirc;Scedil;scedil;Scaron;scaron;Tcedil;tcedil;Tcaron;tcaron;Tstrok;tstrok;Utilde;utilde;Umacr;umacr;Ubreve;ubreve;Uring;uring;Udblac;udblac;Uogon;uogon;Wcirc;wcirc;Ycirc;ycirc;Yuml;Zacute;zacute;Zdot;zdot;Zcaron;zcaron;19fnof;34imped;63gacute;65jmath;142circ;caron;16breve;DiacriticalDot;ring;ogon;DiacriticalTilde;dblac;51DownBreve;127Alpha;Beta;Gamma;Delta;Epsilon;Zeta;Eta;Theta;Iota;Kappa;Lambda;Mu;Nu;Xi;Omicron;Pi;Rho;1Sigma;Tau;Upsilon;Phi;Chi;Psi;ohm;7alpha;beta;gamma;delta;epsi;zeta;eta;theta;iota;kappa;lambda;mu;nu;xi;omicron;pi;rho;sigmaf;sigma;tau;upsi;phi;chi;psi;omega;7thetasym;Upsi;2phiv;piv;5Gammad;digamma;18kappav;rhov;3epsiv;backepsilon;10IOcy;DJcy;GJcy;Jukcy;DScy;Iukcy;YIcy;Jsercy;LJcy;NJcy;TSHcy;KJcy;1Ubrcy;DZcy;Acy;Bcy;Vcy;Gcy;Dcy;IEcy;ZHcy;Zcy;Icy;Jcy;Kcy;Lcy;Mcy;Ncy;Ocy;Pcy;Rcy;Scy;Tcy;Ucy;Fcy;KHcy;TScy;CHcy;SHcy;SHCHcy;HARDcy;Ycy;SOFTcy;Ecy;YUcy;YAcy;acy;bcy;vcy;gcy;dcy;iecy;zhcy;zcy;icy;jcy;kcy;lcy;mcy;ncy;ocy;pcy;rcy;scy;tcy;ucy;fcy;khcy;tscy;chcy;shcy;shchcy;hardcy;ycy;softcy;ecy;yucy;yacy;1iocy;djcy;gjcy;jukcy;dscy;iukcy;yicy;jsercy;ljcy;njcy;tshcy;kjcy;1ubrcy;dzcy;7074ensp;emsp;emsp13;emsp14;1numsp;puncsp;ThinSpace;hairsp;NegativeMediumSpace;zwnj;zwj;lrm;rlm;dash;2ndash;mdash;horbar;Verbar;1lsquo;CloseCurlyQuote;lsquor;1ldquo;CloseCurlyDoubleQuote;bdquo;1dagger;Dagger;bull;2nldr;hellip;9permil;pertenk;prime;Prime;tprime;backprime;3lsaquo;rsaquo;3oline;2caret;1hybull;frasl;10bsemi;7qprime;7MediumSpace;{8202ThickSpace;}NoBreak;af;InvisibleTimes;ic;72euro;46tdot;DotDot;37complexes;2incare;4gscr;hamilt;Hfr;Hopf;planckh;hbar;imagline;Ifr;lagran;ell;1naturals;numero;copysr;weierp;Popf;Qopf;realine;real;reals;rx;3trade;1integers;2mho;zeetrf;iiota;2bernou;Cayleys;1escr;Escr;Fouriertrf;1Mellintrf;order;alefsym;beth;gimel;daleth;12CapitalDifferentialD;dd;ee;ii;10frac13;frac23;frac15;frac25;frac35;frac45;frac16;frac56;frac18;frac38;frac58;frac78;49larr;ShortUpArrow;rarr;darr;harr;updownarrow;nwarr;nearr;LowerRightArrow;LowerLeftArrow;nlarr;nrarr;1rarrw;{824nrarrw;}Larr;Uarr;Rarr;Darr;larrtl;rarrtl;LeftTeeArrow;mapstoup;map;DownTeeArrow;1hookleftarrow;hookrightarrow;larrlp;looparrowright;harrw;nharr;1lsh;rsh;ldsh;rdsh;1crarr;cularr;curarr;2circlearrowleft;circlearrowright;leftharpoonup;DownLeftVector;RightUpVector;LeftUpVector;rharu;DownRightVector;dharr;dharl;RightArrowLeftArrow;udarr;LeftArrowRightArrow;leftleftarrows;upuparrows;rightrightarrows;ddarr;leftrightharpoons;Equilibrium;nlArr;nhArr;nrArr;DoubleLeftArrow;DoubleUpArrow;DoubleRightArrow;dArr;DoubleLeftRightArrow;DoubleUpDownArrow;nwArr;neArr;seArr;swArr;lAarr;rAarr;1zigrarr;6larrb;rarrb;15DownArrowUpArrow;7loarr;roarr;hoarr;forall;comp;part;{824npart;}exist;nexist;empty;1Del;Element;NotElement;1ni;notni;2prod;coprod;sum;minus;MinusPlus;dotplus;1Backslash;lowast;compfn;1radic;2prop;infin;angrt;ang;{8402nang;}angmsd;angsph;mid;nmid;DoubleVerticalBar;NotDoubleVerticalBar;and;or;cap;{65024caps;}cup;{65024cups;}int;Int;iiint;conint;Conint;Cconint;cwint;ClockwiseContourIntegral;awconint;there4;becaus;ratio;Colon;dotminus;1mDDot;homtht;sim;{8402nvsim;}backsim;{817race;}ac;{819acE;}acd;VerticalTilde;NotTilde;eqsim;{824nesim;}sime;NotTildeEqual;cong;simne;ncong;ap;nap;ape;apid;{824napid;}backcong;asympeq;{8402nvap;}bump;{824nbump;}bumpe;{824nbumpe;}doteq;{824nedot;}doteqdot;efDot;erDot;Assign;ecolon;ecir;circeq;1wedgeq;veeeq;1triangleq;2equest;ne;Congruent;{8421bnequiv;}nequiv;1le;{8402nvle;}ge;{8402nvge;}lE;{824nlE;}gE;{824ngE;}lnE;{65024lvertneqq;}gnE;{65024gvertneqq;}ll;{824nLtv;7577nLt;}gg;{824nGtv;7577nGt;}between;NotCupCap;nless;ngt;nle;nge;lesssim;GreaterTilde;nlsim;ngsim;LessGreater;gl;NotLessGreater;NotGreaterLess;pr;sc;prcue;sccue;PrecedesTilde;scsim;{824NotSucceedsTilde;}NotPrecedes;NotSucceeds;sub;{8402NotSubset;}sup;{8402NotSuperset;}nsub;nsup;sube;supe;NotSubsetEqual;NotSupersetEqual;subne;{65024varsubsetneq;}supne;{65024varsupsetneq;}1cupdot;UnionPlus;sqsub;{824NotSquareSubset;}sqsup;{824NotSquareSuperset;}sqsube;sqsupe;sqcap;{65024sqcaps;}sqcup;{65024sqcups;}CirclePlus;CircleMinus;CircleTimes;osol;CircleDot;circledcirc;circledast;1circleddash;boxplus;boxminus;boxtimes;dotsquare;RightTee;dashv;DownTee;bot;1models;DoubleRightTee;Vdash;Vvdash;VDash;nvdash;nvDash;nVdash;nVDash;prurel;1LeftTriangle;RightTriangle;LeftTriangleEqual;{8402nvltrie;}RightTriangleEqual;{8402nvrtrie;}origof;imof;multimap;hercon;intcal;veebar;1barvee;angrtvb;lrtri;bigwedge;bigvee;bigcap;bigcup;diam;sdot;sstarf;divideontimes;bowtie;ltimes;rtimes;leftthreetimes;rightthreetimes;backsimeq;curlyvee;curlywedge;Sub;Sup;Cap;Cup;fork;epar;lessdot;gtdot;Ll;{824nLl;}Gg;{824nGg;}leg;{65024lesg;}gel;{65024gesl;}2cuepr;cuesc;NotPrecedesSlantEqual;NotSucceedsSlantEqual;NotSquareSubsetEqual;NotSquareSupersetEqual;2lnsim;gnsim;precnsim;scnsim;nltri;NotRightTriangle;nltrie;NotRightTriangleEqual;vellip;ctdot;utdot;dtdot;disin;isinsv;isins;isindot;{824notindot;}notinvc;notinvb;1isinE;{824notinE;}nisd;xnis;nis;notnivc;notnivb;6barwed;Barwed;1lceil;rceil;LeftFloor;rfloor;drcrop;dlcrop;urcrop;ulcrop;bnot;1profline;profsurf;1telrec;target;5ulcorn;urcorn;dlcorn;drcorn;2frown;smile;9cylcty;profalar;7topbot;6ovbar;1solbar;60angzarr;51lmoustache;rmoustache;2OverBracket;bbrk;bbrktbrk;37OverParenthesis;UnderParenthesis;OverBrace;UnderBrace;2trpezium;4elinters;59blank;164circledS;55boxh;1boxv;9boxdr;3boxdl;3boxur;3boxul;3boxvr;7boxvl;7boxhd;7boxhu;7boxvh;19boxH;boxV;boxdR;boxDr;boxDR;boxdL;boxDl;boxDL;boxuR;boxUr;boxUR;boxuL;boxUl;boxUL;boxvR;boxVr;boxVR;boxvL;boxVl;boxVL;boxHd;boxhD;boxHD;boxHu;boxhU;boxHU;boxvH;boxVh;boxVH;19uhblk;3lhblk;3block;8blk14;blk12;blk34;13square;8blacksquare;EmptyVerySmallSquare;1rect;marker;2fltns;1bigtriangleup;blacktriangle;triangle;2blacktriangleright;rtri;3bigtriangledown;blacktriangledown;dtri;2blacktriangleleft;ltri;6loz;cir;32tridot;2bigcirc;8ultri;urtri;lltri;EmptySmallSquare;FilledSmallSquare;8bigstar;star;7phone;49female;1male;29spades;2clubs;1hearts;diamondsuit;3sung;2flat;natural;sharp;163check;3cross;8malt;21sext;33VerticalSeparator;25lbbrk;rbbrk;84bsolhsub;suphsol;28LeftDoubleBracket;RightDoubleBracket;lang;rang;Lang;Rang;loang;roang;7longleftarrow;longrightarrow;longleftrightarrow;DoubleLongLeftArrow;DoubleLongRightArrow;DoubleLongLeftRightArrow;1longmapsto;2dzigrarr;258nvlArr;nvrArr;nvHarr;Map;6lbarr;bkarow;lBarr;dbkarow;drbkarow;DDotrahd;UpArrowBar;DownArrowBar;2Rarrtl;2latail;ratail;lAtail;rAtail;larrfs;rarrfs;larrbfs;rarrbfs;2nwarhk;nearhk;hksearow;hkswarow;nwnear;nesear;seswar;swnwar;8rarrc;{824nrarrc;}1cudarrr;ldca;rdca;cudarrl;larrpl;2curarrm;cularrp;7rarrpl;2harrcir;Uarrocir;lurdshar;ldrushar;2LeftRightVector;RightUpDownVector;DownLeftRightVector;LeftUpDownVector;LeftVectorBar;RightVectorBar;RightUpVectorBar;RightDownVectorBar;DownLeftVectorBar;DownRightVectorBar;LeftUpVectorBar;LeftDownVectorBar;LeftTeeVector;RightTeeVector;RightUpTeeVector;RightDownTeeVector;DownLeftTeeVector;DownRightTeeVector;LeftUpTeeVector;LeftDownTeeVector;lHar;uHar;rHar;dHar;luruhar;ldrdhar;ruluhar;rdldhar;lharul;llhard;rharul;lrhard;udhar;duhar;RoundImplies;erarr;simrarr;larrsim;rarrsim;rarrap;ltlarr;1gtrarr;subrarr;1suplarr;lfisht;rfisht;ufisht;dfisht;5lopar;ropar;4lbrke;rbrke;lbrkslu;rbrksld;lbrksld;rbrkslu;langd;rangd;lparlt;rpargt;gtlPar;ltrPar;3vzigzag;1vangrt;angrtvbd;6ange;range;dwangle;uwangle;angmsdaa;angmsdab;angmsdac;angmsdad;angmsdae;angmsdaf;angmsdag;angmsdah;bemptyv;demptyv;cemptyv;raemptyv;laemptyv;ohbar;omid;opar;1operp;1olcross;odsold;1olcir;ofcir;olt;ogt;cirscir;cirE;solb;bsolb;3boxbox;3trisb;rtriltri;LeftTriangleBar;{824NotLeftTriangleBar;}RightTriangleBar;{824NotRightTriangleBar;}11iinfin;infintie;nvinfin;4eparsl;smeparsl;eqvparsl;5blacklozenge;8RuleDelayed;1dsol;9bigodot;bigoplus;bigotimes;1biguplus;1bigsqcup;5iiiint;fpartint;2cirfnint;awint;rppolint;scpolint;npolint;pointint;quatint;intlarhk;10pluscir;plusacir;simplus;plusdu;plussim;plustwo;1mcomma;minusdu;2loplus;roplus;Cross;timesd;timesbar;1smashp;lotimes;rotimes;otimesas;Otimes;odiv;triplus;triminus;tritime;intprod;2amalg;capdot;1ncup;ncap;capand;cupor;cupcap;capcup;cupbrcap;capbrcup;cupcup;capcap;ccups;ccaps;2ccupssm;2And;Or;andand;oror;orslope;andslope;1andv;orv;andd;ord;1wedbar;6sdote;3simdot;2congdot;{824ncongdot;}easter;apacir;apE;{824napE;}eplus;pluse;Esim;Colone;Equal;1ddotseq;equivDD;ltcir;gtcir;ltquest;gtquest;leqslant;{824nleqslant;}geqslant;{824ngeqslant;}lesdot;gesdot;lesdoto;gesdoto;lesdotor;gesdotol;lap;gap;lne;gne;lnap;gnap;lEg;gEl;lsime;gsime;lsimg;gsiml;lgE;glE;lesges;gesles;els;egs;elsdot;egsdot;el;eg;2siml;simg;simlE;simgE;LessLess;{824NotNestedLessLess;}GreaterGreater;{824NotNestedGreaterGreater;}1glj;gla;ltcc;gtcc;lescc;gescc;smt;lat;smte;{65024smtes;}late;{65024lates;}bumpE;PrecedesEqual;{824NotPrecedesEqual;}sce;{824NotSucceedsEqual;}2prE;scE;precneqq;scnE;prap;scap;precnapprox;scnap;Pr;Sc;subdot;supdot;subplus;supplus;submult;supmult;subedot;supedot;subE;{824nsubE;}supE;{824nsupE;}subsim;supsim;2subnE;{65024varsubsetneqq;}supnE;{65024varsupsetneqq;}2csub;csup;csube;csupe;subsup;supsub;subsub;supsup;suphsub;supdsub;forkv;topfork;mlcp;8Dashv;1Vdashl;Barv;vBar;vBarv;1Vbar;Not;bNot;rnmid;cirmid;midcir;topcir;nhpar;parsim;9parsl;{8421nparsl;}53250fflig;filig;fllig;ffilig;ffllig;55703Ascr;1Cscr;Dscr;2Gscr;2Jscr;Kscr;2Nscr;Oscr;Pscr;Qscr;1Sscr;Tscr;Uscr;Vscr;Wscr;Xscr;Yscr;Zscr;ascr;bscr;cscr;dscr;1fscr;1hscr;iscr;jscr;kscr;lscr;mscr;nscr;1pscr;qscr;rscr;sscr;tscr;uscr;vscr;wscr;xscr;yscr;zscr;52Afr;Bfr;1Dfr;Efr;Ffr;Gfr;2Jfr;Kfr;Lfr;Mfr;Nfr;Ofr;Pfr;Qfr;1Sfr;Tfr;Ufr;Vfr;Wfr;Xfr;Yfr;1afr;bfr;cfr;dfr;efr;ffr;gfr;hfr;ifr;jfr;kfr;lfr;mfr;nfr;ofr;pfr;qfr;rfr;sfr;tfr;ufr;vfr;wfr;xfr;yfr;zfr;Aopf;Bopf;1Dopf;Eopf;Fopf;Gopf;1Iopf;Jopf;Kopf;Lopf;Mopf;1Oopf;3Sopf;Topf;Uopf;Vopf;Wopf;Xopf;Yopf;1aopf;bopf;copf;dopf;eopf;fopf;gopf;hopf;iopf;jopf;kopf;lopf;mopf;nopf;oopf;popf;qopf;ropf;sopf;topf;uopf;vopf;wopf;xopf;yopf;zopf;";
|