emj 0.0.11 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +119 -46
- package/lib/characters.d.ts +165 -0
- package/lib/characters.js +169 -0
- package/lib/generator.d.ts +29 -0
- package/lib/generator.js +270 -0
- package/lib/index.d.ts +3 -0
- package/lib/index.js +8 -0
- package/lib/json.d.ts +13 -0
- package/lib/json.js +3 -0
- package/lib/limits.d.ts +6 -0
- package/lib/limits.js +10 -0
- package/lib/parser.d.ts +26 -0
- package/lib/parser.js +364 -0
- package/package.json +29 -34
- package/lib/gen/grammar.js +0 -85
- package/lib/src/characters.js +0 -168
- package/lib/src/generator.js +0 -114
- package/lib/src/index.js +0 -8
- package/lib/src/lexer.js +0 -51
- package/lib/src/mapper.js +0 -51
- package/lib/src/parser.js +0 -66
- package/lib/src/patterns.js +0 -69
- package/lib/src/postprocessor.js +0 -89
- package/lib/src/typer.js +0 -32
- package/lib/src/utilities.js +0 -46
package/lib/parser.js
ADDED
|
@@ -0,0 +1,364 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.parse = void 0;
|
|
4
|
+
const characters_1 = require("./characters");
|
|
5
|
+
const limits_1 = require("./limits");
|
|
6
|
+
const Kind = {
|
|
7
|
+
EOF: 0,
|
|
8
|
+
Invalid: 1,
|
|
9
|
+
Space: 2,
|
|
10
|
+
Start: 3,
|
|
11
|
+
End: 4,
|
|
12
|
+
Indent: 5,
|
|
13
|
+
Outdent: 6,
|
|
14
|
+
Open: 7,
|
|
15
|
+
Close: 8,
|
|
16
|
+
Delimit: 9,
|
|
17
|
+
KeyChar: 10,
|
|
18
|
+
KeyUpper: 11,
|
|
19
|
+
KeyUnicode: 12,
|
|
20
|
+
KeyNibble: 13,
|
|
21
|
+
KeyEmpty: 14,
|
|
22
|
+
ValueChar: 15,
|
|
23
|
+
ValueUpper: 16,
|
|
24
|
+
ValueUnicode: 17,
|
|
25
|
+
ValueNibble: 18,
|
|
26
|
+
ValueEmpty: 19,
|
|
27
|
+
Digit: 20,
|
|
28
|
+
Decimal: 21,
|
|
29
|
+
Exponent: 22,
|
|
30
|
+
Negative: 23,
|
|
31
|
+
True: 24,
|
|
32
|
+
False: 25,
|
|
33
|
+
Null: 26,
|
|
34
|
+
};
|
|
35
|
+
// Each token is `kind | code << 8`, looked up by code point in a typed array:
|
|
36
|
+
// one for the BMP (where spaces and a few emoji live) and one for the block
|
|
37
|
+
// of astral emoji, U+1F300–U+1FAFF. Unlisted code points stay Invalid.
|
|
38
|
+
// This makes parse() 19–31% faster than a Map did (see bench/RESULTS.md).
|
|
39
|
+
const ASTRAL_START = 0x1f300;
|
|
40
|
+
const ASTRAL_SIZE = 0x800;
|
|
41
|
+
const BMP_TOKENS = new Uint16Array(0x10000).fill(Kind.Invalid);
|
|
42
|
+
const ASTRAL_TOKENS = new Uint16Array(ASTRAL_SIZE).fill(Kind.Invalid);
|
|
43
|
+
function lookup(point) {
|
|
44
|
+
if (point < 0x10000)
|
|
45
|
+
return BMP_TOKENS[point];
|
|
46
|
+
const offset = point - ASTRAL_START;
|
|
47
|
+
return offset >= 0 && offset < ASTRAL_SIZE
|
|
48
|
+
? ASTRAL_TOKENS[offset]
|
|
49
|
+
: Kind.Invalid;
|
|
50
|
+
}
|
|
51
|
+
function setToken(point, token) {
|
|
52
|
+
const offset = point - ASTRAL_START;
|
|
53
|
+
if (point < 0x10000)
|
|
54
|
+
BMP_TOKENS[point] = token;
|
|
55
|
+
else if (offset >= 0 && offset < ASTRAL_SIZE)
|
|
56
|
+
ASTRAL_TOKENS[offset] = token;
|
|
57
|
+
else
|
|
58
|
+
throw new Error(`U+${point.toString(16)} is outside the token table`);
|
|
59
|
+
}
|
|
60
|
+
const define = (emoji, kind, code = 0) => {
|
|
61
|
+
setToken(emoji.codePointAt(0), kind | (code << 8));
|
|
62
|
+
};
|
|
63
|
+
define(characters_1.characters.document.start, Kind.Start);
|
|
64
|
+
define(characters_1.characters.document.end, Kind.End);
|
|
65
|
+
define(characters_1.characters.document.indent, Kind.Indent);
|
|
66
|
+
define(characters_1.characters.document.outdent, Kind.Outdent);
|
|
67
|
+
define(characters_1.characters.document.arrayOpen, Kind.Open);
|
|
68
|
+
define(characters_1.characters.document.arrayClose, Kind.Close);
|
|
69
|
+
define(characters_1.characters.document.arrayDelimit, Kind.Delimit);
|
|
70
|
+
define(characters_1.characters.keys.modifiers.upperCase, Kind.KeyUpper);
|
|
71
|
+
define(characters_1.characters.keys.modifiers.unicode, Kind.KeyUnicode);
|
|
72
|
+
define(characters_1.characters.keys.other.empty, Kind.KeyEmpty);
|
|
73
|
+
define(characters_1.characters.values.modifiers.upperCase, Kind.ValueUpper);
|
|
74
|
+
define(characters_1.characters.values.modifiers.unicode, Kind.ValueUnicode);
|
|
75
|
+
define(characters_1.characters.values.modifiers.negative, Kind.Negative);
|
|
76
|
+
define(characters_1.characters.values.other.emptyString, Kind.ValueEmpty);
|
|
77
|
+
define(characters_1.characters.values.other.null, Kind.Null);
|
|
78
|
+
define(characters_1.characters.values.booleans.true, Kind.True);
|
|
79
|
+
define(characters_1.characters.values.booleans.false, Kind.False);
|
|
80
|
+
for (const [char, emoji] of Object.entries(characters_1.characters.keys.letters)) {
|
|
81
|
+
define(emoji, Kind.KeyChar, char.charCodeAt(0));
|
|
82
|
+
}
|
|
83
|
+
for (const [char, emoji] of Object.entries(characters_1.characters.keys.numerals)) {
|
|
84
|
+
define(emoji, Kind.KeyChar, char.charCodeAt(0));
|
|
85
|
+
}
|
|
86
|
+
for (const [hex, emoji] of Object.entries(characters_1.characters.keys.unicode)) {
|
|
87
|
+
define(emoji, Kind.KeyNibble, parseInt(hex, 16));
|
|
88
|
+
}
|
|
89
|
+
for (const [char, emoji] of Object.entries(characters_1.characters.values.letters)) {
|
|
90
|
+
define(emoji, Kind.ValueChar, char.charCodeAt(0));
|
|
91
|
+
}
|
|
92
|
+
for (const [char, emoji] of Object.entries(characters_1.characters.values.numerals)) {
|
|
93
|
+
define(emoji, Kind.ValueChar, char.charCodeAt(0));
|
|
94
|
+
}
|
|
95
|
+
for (const [hex, emoji] of Object.entries(characters_1.characters.values.unicode)) {
|
|
96
|
+
define(emoji, Kind.ValueNibble, parseInt(hex, 16));
|
|
97
|
+
}
|
|
98
|
+
for (const [char, emoji] of Object.entries(characters_1.characters.values.numbers)) {
|
|
99
|
+
const kind = char === '.' ? Kind.Decimal : char === 'e' ? Kind.Exponent : Kind.Digit;
|
|
100
|
+
define(emoji, kind, char.charCodeAt(0));
|
|
101
|
+
}
|
|
102
|
+
// every /\s/ character, plus the variation selector some emoji carry
|
|
103
|
+
for (const space of [
|
|
104
|
+
0x9, 0xa, 0xb, 0xc, 0xd, 0x20, 0xa0, 0x1680, 0x2000, 0x2001, 0x2002, 0x2003,
|
|
105
|
+
0x2004, 0x2005, 0x2006, 0x2007, 0x2008, 0x2009, 0x200a, 0x2028, 0x2029,
|
|
106
|
+
0x202f, 0x205f, 0x3000, 0xfeff, 0xfe0f,
|
|
107
|
+
]) {
|
|
108
|
+
setToken(space, Kind.Space);
|
|
109
|
+
}
|
|
110
|
+
const OBJECT_PROTOTYPE = Object.prototype;
|
|
111
|
+
let source = '';
|
|
112
|
+
let index = 0;
|
|
113
|
+
let at = 0;
|
|
114
|
+
let point = 0;
|
|
115
|
+
let kind = Kind.EOF;
|
|
116
|
+
let code = 0;
|
|
117
|
+
let depth = 0;
|
|
118
|
+
function next() {
|
|
119
|
+
while (index < source.length) {
|
|
120
|
+
at = index;
|
|
121
|
+
point = source.codePointAt(index);
|
|
122
|
+
index += point > 0xffff ? 2 : 1;
|
|
123
|
+
const token = lookup(point);
|
|
124
|
+
if (token === Kind.Space)
|
|
125
|
+
continue;
|
|
126
|
+
kind = token & 0xff;
|
|
127
|
+
code = token >> 8;
|
|
128
|
+
return kind;
|
|
129
|
+
}
|
|
130
|
+
at = index;
|
|
131
|
+
kind = Kind.EOF;
|
|
132
|
+
return kind;
|
|
133
|
+
}
|
|
134
|
+
function fail() {
|
|
135
|
+
if (kind === Kind.EOF) {
|
|
136
|
+
throw new SyntaxError('Unexpected end of Emojion input');
|
|
137
|
+
}
|
|
138
|
+
throw new SyntaxError(`Unexpected "${String.fromCodePoint(point)}" in Emojion at position ${at}`);
|
|
139
|
+
}
|
|
140
|
+
function nest() {
|
|
141
|
+
if (++depth > limits_1.MAX_DEPTH) {
|
|
142
|
+
throw new SyntaxError(`Emojion nesting exceeds ${limits_1.MAX_DEPTH} levels at position ${at}`);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
function expect(expected) {
|
|
146
|
+
if (kind !== expected)
|
|
147
|
+
fail();
|
|
148
|
+
next();
|
|
149
|
+
}
|
|
150
|
+
function text(char, upper, unicode, nibble) {
|
|
151
|
+
let out = '';
|
|
152
|
+
for (;;) {
|
|
153
|
+
if (kind === char) {
|
|
154
|
+
out += String.fromCharCode(code);
|
|
155
|
+
next();
|
|
156
|
+
}
|
|
157
|
+
else if (kind === upper) {
|
|
158
|
+
next();
|
|
159
|
+
if (kind !== char || code < 97)
|
|
160
|
+
fail();
|
|
161
|
+
out += String.fromCharCode(code - 32);
|
|
162
|
+
next();
|
|
163
|
+
}
|
|
164
|
+
else if (kind === unicode) {
|
|
165
|
+
next();
|
|
166
|
+
if (kind !== nibble)
|
|
167
|
+
fail();
|
|
168
|
+
// U+10FFFF, the highest code point, needs six nibbles.
|
|
169
|
+
let value = 0;
|
|
170
|
+
let nibbles = 0;
|
|
171
|
+
do {
|
|
172
|
+
if (++nibbles > 6)
|
|
173
|
+
fail();
|
|
174
|
+
value = value * 16 + code;
|
|
175
|
+
if (value > 0x10ffff)
|
|
176
|
+
fail();
|
|
177
|
+
next();
|
|
178
|
+
} while (kind === nibble);
|
|
179
|
+
out += String.fromCodePoint(value);
|
|
180
|
+
}
|
|
181
|
+
else {
|
|
182
|
+
return out;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
function digits() {
|
|
187
|
+
if (kind !== Kind.Digit)
|
|
188
|
+
fail();
|
|
189
|
+
let out = '';
|
|
190
|
+
do {
|
|
191
|
+
out += String.fromCharCode(code);
|
|
192
|
+
next();
|
|
193
|
+
} while (kind === Kind.Digit);
|
|
194
|
+
return out;
|
|
195
|
+
}
|
|
196
|
+
function number() {
|
|
197
|
+
let out = '';
|
|
198
|
+
if (kind === Kind.Negative) {
|
|
199
|
+
out = '-';
|
|
200
|
+
next();
|
|
201
|
+
}
|
|
202
|
+
if (kind === Kind.Digit && code === 48) {
|
|
203
|
+
out += '0';
|
|
204
|
+
next();
|
|
205
|
+
if (kind === Kind.Digit)
|
|
206
|
+
fail();
|
|
207
|
+
}
|
|
208
|
+
else {
|
|
209
|
+
out += digits();
|
|
210
|
+
}
|
|
211
|
+
if (kind === Kind.Decimal) {
|
|
212
|
+
next();
|
|
213
|
+
out += '.' + digits();
|
|
214
|
+
}
|
|
215
|
+
if (kind === Kind.Exponent) {
|
|
216
|
+
if (next() === Kind.Negative) {
|
|
217
|
+
out += 'e-';
|
|
218
|
+
next();
|
|
219
|
+
}
|
|
220
|
+
else {
|
|
221
|
+
out += 'e';
|
|
222
|
+
}
|
|
223
|
+
out += digits();
|
|
224
|
+
}
|
|
225
|
+
return Number(out);
|
|
226
|
+
}
|
|
227
|
+
function members(close) {
|
|
228
|
+
const out = {};
|
|
229
|
+
while (kind !== close) {
|
|
230
|
+
let key = '';
|
|
231
|
+
if (kind === Kind.KeyEmpty) {
|
|
232
|
+
next();
|
|
233
|
+
}
|
|
234
|
+
else if (kind === Kind.KeyChar ||
|
|
235
|
+
kind === Kind.KeyUpper ||
|
|
236
|
+
kind === Kind.KeyUnicode) {
|
|
237
|
+
key = text(Kind.KeyChar, Kind.KeyUpper, Kind.KeyUnicode, Kind.KeyNibble);
|
|
238
|
+
}
|
|
239
|
+
else {
|
|
240
|
+
fail();
|
|
241
|
+
}
|
|
242
|
+
const item = value();
|
|
243
|
+
if (key in OBJECT_PROTOTYPE) {
|
|
244
|
+
// Assigning a key that out inherits would run its setter (__proto__
|
|
245
|
+
// would set the prototype) or fail if it is read-only. Define it as
|
|
246
|
+
// an own property instead, as JSON.parse() does.
|
|
247
|
+
Object.defineProperty(out, key, {
|
|
248
|
+
value: item,
|
|
249
|
+
writable: true,
|
|
250
|
+
enumerable: true,
|
|
251
|
+
configurable: true,
|
|
252
|
+
});
|
|
253
|
+
}
|
|
254
|
+
else {
|
|
255
|
+
// A repeated key overwrites the earlier one: the last wins.
|
|
256
|
+
out[key] = item;
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
return out;
|
|
260
|
+
}
|
|
261
|
+
function array() {
|
|
262
|
+
const out = [];
|
|
263
|
+
if (next() === Kind.Close) {
|
|
264
|
+
next();
|
|
265
|
+
return out;
|
|
266
|
+
}
|
|
267
|
+
out.push(value());
|
|
268
|
+
while (kind === Kind.Delimit) {
|
|
269
|
+
next();
|
|
270
|
+
out.push(value());
|
|
271
|
+
}
|
|
272
|
+
expect(Kind.Close);
|
|
273
|
+
return out;
|
|
274
|
+
}
|
|
275
|
+
function value() {
|
|
276
|
+
switch (kind) {
|
|
277
|
+
case Kind.Indent: {
|
|
278
|
+
nest();
|
|
279
|
+
next();
|
|
280
|
+
const out = members(Kind.Outdent);
|
|
281
|
+
next();
|
|
282
|
+
depth--;
|
|
283
|
+
return out;
|
|
284
|
+
}
|
|
285
|
+
case Kind.Open: {
|
|
286
|
+
nest();
|
|
287
|
+
const out = array();
|
|
288
|
+
depth--;
|
|
289
|
+
return out;
|
|
290
|
+
}
|
|
291
|
+
case Kind.True:
|
|
292
|
+
next();
|
|
293
|
+
return true;
|
|
294
|
+
case Kind.False:
|
|
295
|
+
next();
|
|
296
|
+
return false;
|
|
297
|
+
case Kind.Null:
|
|
298
|
+
next();
|
|
299
|
+
return null;
|
|
300
|
+
case Kind.ValueEmpty:
|
|
301
|
+
next();
|
|
302
|
+
return '';
|
|
303
|
+
case Kind.Negative:
|
|
304
|
+
case Kind.Digit:
|
|
305
|
+
return number();
|
|
306
|
+
case Kind.ValueChar:
|
|
307
|
+
case Kind.ValueUpper:
|
|
308
|
+
case Kind.ValueUnicode:
|
|
309
|
+
return text(Kind.ValueChar, Kind.ValueUpper, Kind.ValueUnicode, Kind.ValueNibble);
|
|
310
|
+
}
|
|
311
|
+
return fail();
|
|
312
|
+
}
|
|
313
|
+
/**
|
|
314
|
+
* Parse an Emojion document into the value it holds, as `JSON.parse()` parses
|
|
315
|
+
* JSON text.
|
|
316
|
+
*
|
|
317
|
+
* Objects come back as plain objects and arrays as plain arrays. A key that
|
|
318
|
+
* `Object.prototype` has, such as `__proto__`, becomes an ordinary own
|
|
319
|
+
* property and never changes the prototype. When a key repeats, the last
|
|
320
|
+
* value wins.
|
|
321
|
+
*
|
|
322
|
+
* @param emojion - The document, from `🙌` to `✋`. Whitespace and U+FE0F
|
|
323
|
+
* variation selectors anywhere in it are ignored.
|
|
324
|
+
* @returns The object, array, string, number, boolean or `null` it holds.
|
|
325
|
+
* @throws {SyntaxError} If the document is not valid Emojion, naming the
|
|
326
|
+
* unexpected emoji and its position, or if it nests arrays and objects more
|
|
327
|
+
* than 512 levels deep.
|
|
328
|
+
*
|
|
329
|
+
* @example
|
|
330
|
+
* parse('🙌😶😠🤑😳👡🐘🐁🦉🦒🐖🦉🦏✋');
|
|
331
|
+
* //=> { name: 'Emojion' }
|
|
332
|
+
*
|
|
333
|
+
* @example
|
|
334
|
+
* parse('🙌🤜🕐🤝💚🤝🕳🤛✋');
|
|
335
|
+
* //=> [1, true, null]
|
|
336
|
+
*/
|
|
337
|
+
const parse = (emojion) => {
|
|
338
|
+
source = emojion;
|
|
339
|
+
index = 0;
|
|
340
|
+
depth = 0;
|
|
341
|
+
try {
|
|
342
|
+
next();
|
|
343
|
+
expect(Kind.Start);
|
|
344
|
+
// A top-level object is written without 👉👈.
|
|
345
|
+
if (kind === Kind.Indent)
|
|
346
|
+
fail();
|
|
347
|
+
const out = kind === Kind.End ||
|
|
348
|
+
kind === Kind.KeyEmpty ||
|
|
349
|
+
kind === Kind.KeyChar ||
|
|
350
|
+
kind === Kind.KeyUpper ||
|
|
351
|
+
kind === Kind.KeyUnicode
|
|
352
|
+
? members(Kind.End)
|
|
353
|
+
: value();
|
|
354
|
+
expect(Kind.End);
|
|
355
|
+
if (kind !== Kind.EOF)
|
|
356
|
+
fail();
|
|
357
|
+
return out;
|
|
358
|
+
}
|
|
359
|
+
finally {
|
|
360
|
+
source = '';
|
|
361
|
+
}
|
|
362
|
+
};
|
|
363
|
+
exports.parse = parse;
|
|
364
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3BhcnNlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw2Q0FBMEM7QUFFMUMscUNBQXFDO0FBRXJDLE1BQU0sSUFBSSxHQUFHO0lBQ1gsR0FBRyxFQUFFLENBQUM7SUFDTixPQUFPLEVBQUUsQ0FBQztJQUNWLEtBQUssRUFBRSxDQUFDO0lBQ1IsS0FBSyxFQUFFLENBQUM7SUFDUixHQUFHLEVBQUUsQ0FBQztJQUNOLE1BQU0sRUFBRSxDQUFDO0lBQ1QsT0FBTyxFQUFFLENBQUM7SUFDVixJQUFJLEVBQUUsQ0FBQztJQUNQLEtBQUssRUFBRSxDQUFDO0lBQ1IsT0FBTyxFQUFFLENBQUM7SUFDVixPQUFPLEVBQUUsRUFBRTtJQUNYLFFBQVEsRUFBRSxFQUFFO0lBQ1osVUFBVSxFQUFFLEVBQUU7SUFDZCxTQUFTLEVBQUUsRUFBRTtJQUNiLFFBQVEsRUFBRSxFQUFFO0lBQ1osU0FBUyxFQUFFLEVBQUU7SUFDYixVQUFVLEVBQUUsRUFBRTtJQUNkLFlBQVksRUFBRSxFQUFFO0lBQ2hCLFdBQVcsRUFBRSxFQUFFO0lBQ2YsVUFBVSxFQUFFLEVBQUU7SUFDZCxLQUFLLEVBQUUsRUFBRTtJQUNULE9BQU8sRUFBRSxFQUFFO0lBQ1gsUUFBUSxFQUFFLEVBQUU7SUFDWixRQUFRLEVBQUUsRUFBRTtJQUNaLElBQUksRUFBRSxFQUFFO0lBQ1IsS0FBSyxFQUFFLEVBQUU7SUFDVCxJQUFJLEVBQUUsRUFBRTtDQUNBLENBQUM7QUFFWCw4RUFBOEU7QUFDOUUsNEVBQTRFO0FBQzVFLHVFQUF1RTtBQUN2RSwwRUFBMEU7QUFDMUUsTUFBTSxZQUFZLEdBQUcsT0FBTyxDQUFDO0FBQzdCLE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQztBQUMxQixNQUFNLFVBQVUsR0FBRyxJQUFJLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQy9ELE1BQU0sYUFBYSxHQUFHLElBQUksV0FBVyxDQUFDLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7QUFFdEUsU0FBUyxNQUFNLENBQUMsS0FBYTtJQUMzQixJQUFJLEtBQUssR0FBRyxPQUFPO1FBQUUsT0FBTyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDOUMsTUFBTSxNQUFNLEdBQUcsS0FBSyxHQUFHLFlBQVksQ0FBQztJQUNwQyxPQUFPLE1BQU0sSUFBSSxDQUFDLElBQUksTUFBTSxHQUFHLFdBQVc7UUFDeEMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUM7UUFDdkIsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUM7QUFDbkIsQ0FBQztBQUVELFNBQVMsUUFBUSxDQUFDLEtBQWEsRUFBRSxLQUFhO0lBQzVDLE1BQU0sTUFBTSxHQUFHLEtBQUssR0FBRyxZQUFZLENBQUM7SUFDcEMsSUFBSSxLQUFLLEdBQUcsT0FBTztRQUFFLFVBQVUsQ0FBQyxLQUFLLENBQUMsR0FBRyxLQUFLLENBQUM7U0FDMUMsSUFBSSxNQUFNLElBQUksQ0FBQyxJQUFJLE1BQU0sR0FBRyxXQUFXO1FBQUUsYUFBYSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEtBQUssQ0FBQzs7UUFDdkUsTUFBTSxJQUFJLEtBQUssQ0FBQyxLQUFLLEtBQUssQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLDZCQUE2QixDQUFDLENBQUM7QUFDN0UsQ0FBQztBQUVELE1BQU0sTUFBTSxHQUFHLENBQUMsS0FBYSxFQUFFLElBQVksRUFBRSxJQUFJLEdBQUcsQ0FBQyxFQUFFLEVBQUU7SUFDdkQsUUFBUSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFFLEVBQUUsSUFBSSxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEQsQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLHVCQUFVLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDOUMsTUFBTSxDQUFDLHVCQUFVLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDMUMsTUFBTSxDQUFDLHVCQUFVLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDaEQsTUFBTSxDQUFDLHVCQUFVLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDbEQsTUFBTSxDQUFDLHVCQUFVLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDakQsTUFBTSxDQUFDLHVCQUFVLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDbkQsTUFBTSxDQUFDLHVCQUFVLENBQUMsUUFBUSxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDdkQsTUFBTSxDQUFDLHVCQUFVLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQzNELE1BQU0sQ0FBQyx1QkFBVSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztBQUMzRCxNQUFNLENBQUMsdUJBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDbkQsTUFBTSxDQUFDLHVCQUFVLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0FBQy9ELE1BQU0sQ0FBQyx1QkFBVSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztBQUMvRCxNQUFNLENBQUMsdUJBQVUsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDNUQsTUFBTSxDQUFDLHVCQUFVLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0FBQzdELE1BQU0sQ0FBQyx1QkFBVSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNoRCxNQUFNLENBQUMsdUJBQVUsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDbkQsTUFBTSxDQUFDLHVCQUFVLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBRXJELEtBQUssTUFBTSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLHVCQUFVLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7SUFDcEUsTUFBTSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsRCxDQUFDO0FBQ0QsS0FBSyxNQUFNLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsdUJBQVUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztJQUNyRSxNQUFNLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xELENBQUM7QUFDRCxLQUFLLE1BQU0sQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyx1QkFBVSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO0lBQ25FLE1BQU0sQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDbkQsQ0FBQztBQUNELEtBQUssTUFBTSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLHVCQUFVLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7SUFDdEUsTUFBTSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNwRCxDQUFDO0FBQ0QsS0FBSyxNQUFNLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsdUJBQVUsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztJQUN2RSxNQUFNLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3BELENBQUM7QUFDRCxLQUFLLE1BQU0sQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyx1QkFBVSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO0lBQ3JFLE1BQU0sQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxRQUFRLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDckQsQ0FBQztBQUNELEtBQUssTUFBTSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLHVCQUFVLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7SUFDdEUsTUFBTSxJQUFJLEdBQ1IsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztJQUMxRSxNQUFNLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDMUMsQ0FBQztBQUVELHFFQUFxRTtBQUNyRSxLQUFLLE1BQU0sS0FBSyxJQUFJO0lBQ2xCLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTTtJQUMzRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU07SUFDdEUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU07Q0FDdkMsRUFBRSxDQUFDO0lBQ0YsUUFBUSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDOUIsQ0FBQztBQUVELE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQztBQUUxQyxJQUFJLE1BQU0sR0FBRyxFQUFFLENBQUM7QUFDaEIsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQ1gsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsSUFBSSxJQUFJLEdBQVcsSUFBSSxDQUFDLEdBQUcsQ0FBQztBQUM1QixJQUFJLElBQUksR0FBRyxDQUFDLENBQUM7QUFDYixJQUFJLEtBQUssR0FBRyxDQUFDLENBQUM7QUFFZCxTQUFTLElBQUk7SUFDWCxPQUFPLEtBQUssR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDN0IsRUFBRSxHQUFHLEtBQUssQ0FBQztRQUNYLEtBQUssR0FBRyxNQUFNLENBQUMsV0FBVyxD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SUFBSSxDQUFDLFFBQVE7WUFDdEIsSUFBSSxLQUFLLElBQUksQ0FBQyxPQUFPO1lBQ3JCLElBQUksS0FBSyxJQUFJLENBQUMsUUFBUTtZQUN0QixJQUFJLEtBQUssSUFBSSxDQUFDLFVBQVU7WUFDdEIsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDO1lBQ25CLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNkLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDakIsSUFBSSxJQUFJLEtBQUssSUFBSSxDQUFDLEdBQUc7WUFBRSxJQUFJLEVBQUUsQ0FBQztRQUM5QixPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7WUFBUyxDQUFDO1FBQ1QsTUFBTSxHQUFHLEVBQUUsQ0FBQztJQUNkLENBQUM7QUFDSCxDQUFDLENBQUM7QUF2QlcsUUFBQSxLQUFLLFNBdUJoQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNoYXJhY3RlcnMgfSBmcm9tICcuL2NoYXJhY3RlcnMnO1xuaW1wb3J0IHR5cGUgeyBKc29uIH0gZnJvbSAnLi9qc29uJztcbmltcG9ydCB7IE1BWF9ERVBUSCB9IGZyb20gJy4vbGltaXRzJztcblxuY29uc3QgS2luZCA9IHtcbiAgRU9GOiAwLFxuICBJbnZhbGlkOiAxLFxuICBTcGFjZTogMixcbiAgU3RhcnQ6IDMsXG4gIEVuZDogNCxcbiAgSW5kZW50OiA1LFxuICBPdXRkZW50OiA2LFxuICBPcGVuOiA3LFxuICBDbG9zZTogOCxcbiAgRGVsaW1pdDogOSxcbiAgS2V5Q2hhcjogMTAsXG4gIEtleVVwcGVyOiAxMSxcbiAgS2V5VW5pY29kZTogMTIsXG4gIEtleU5pYmJsZTogMTMsXG4gIEtleUVtcHR5OiAxNCxcbiAgVmFsdWVDaGFyOiAxNSxcbiAgVmFsdWVVcHBlcjogMTYsXG4gIFZhbHVlVW5pY29kZTogMTcsXG4gIFZhbHVlTmliYmxlOiAxOCxcbiAgVmFsdWVFbXB0eTogMTksXG4gIERpZ2l0OiAyMCxcbiAgRGVjaW1hbDogMjEsXG4gIEV4cG9uZW50OiAyMixcbiAgTmVnYXRpdmU6IDIzLFxuICBUcnVlOiAyNCxcbiAgRmFsc2U6IDI1LFxuICBOdWxsOiAyNixcbn0gYXMgY29uc3Q7XG5cbi8vIEVhY2ggdG9rZW4gaXMgYGtpbmQgfCBjb2RlIDw8IDhgLCBsb29rZWQgdXAgYnkgY29kZSBwb2ludCBpbiBhIHR5cGVkIGFycmF5OlxuLy8gb25lIGZvciB0aGUgQk1QICh3aGVyZSBzcGFjZXMgYW5kIGEgZmV3IGVtb2ppIGxpdmUpIGFuZCBvbmUgZm9yIHRoZSBibG9ja1xuLy8gb2YgYXN0cmFsIGVtb2ppLCBVKzFGMzAw4oCTVSsxRkFGRi4gVW5saXN0ZWQgY29kZSBwb2ludHMgc3RheSBJbnZhbGlkLlxuLy8gVGhpcyBtYWtlcyBwYXJzZSgpIDE54oCTMzElIGZhc3RlciB0aGFuIGEgTWFwIGRpZCAoc2VlIGJlbmNoL1JFU1VMVFMubWQpLlxuY29uc3QgQVNUUkFMX1NUQVJUID0gMHgxZjMwMDtcbmNvbnN0IEFTVFJBTF9TSVpFID0gMHg4MDA7XG5jb25zdCBCTVBfVE9LRU5TID0gbmV3IFVpbnQxNkFycmF5KDB4MTAwMDApLmZpbGwoS2luZC5JbnZhbGlkKTtcbmNvbnN0IEFTVFJBTF9UT0tFTlMgPSBuZXcgVWludDE2QXJyYXkoQVNUUkFMX1NJWkUpLmZpbGwoS2luZC5JbnZhbGlkKTtcblxuZnVuY3Rpb24gbG9va3VwKHBvaW50OiBudW1iZXIpOiBudW1iZXIge1xuICBpZiAocG9pbnQgPCAweDEwMDAwKSByZXR1cm4gQk1QX1RPS0VOU1twb2ludF07XG4gIGNvbnN0IG9mZnNldCA9IHBvaW50IC0gQVNUUkFMX1NUQVJUO1xuICByZXR1cm4gb2Zmc2V0ID49IDAgJiYgb2Zmc2V0IDwgQVNUUkFMX1NJWkVcbiAgICA/IEFTVFJBTF9UT0tFTlNbb2Zmc2V0XVxuICAgIDogS2luZC5JbnZhbGlkO1xufVxuXG5mdW5jdGlvbiBzZXRUb2tlbihwb2ludDogbnVtYmVyLCB0b2tlbjogbnVtYmVyKSB7XG4gIGNvbnN0IG9mZnNldCA9IHBvaW50IC0gQVNUUkFMX1NUQVJUO1xuICBpZiAocG9pbnQgPCAweDEwMDAwKSBCTVBfVE9LRU5TW3BvaW50XSA9IHRva2VuO1xuICBlbHNlIGlmIChvZmZzZXQgPj0gMCAmJiBvZmZzZXQgPCBBU1RSQUxfU0laRSkgQVNUUkFMX1RPS0VOU1tvZmZzZXRdID0gdG9rZW47XG4gIGVsc2UgdGhyb3cgbmV3IEVycm9yKGBVKyR7cG9pbnQudG9TdHJpbmcoMTYpfSBpcyBvdXRzaWRlIHRoZSB0b2tlbiB0YWJsZWApO1xufVxuXG5jb25zdCBkZWZpbmUgPSAoZW1vamk6IHN0cmluZywga2luZDogbnVtYmVyLCBjb2RlID0gMCkgPT4ge1xuICBzZXRUb2tlbihlbW9qaS5jb2RlUG9pbnRBdCgwKSEsIGtpbmQgfCAoY29kZSA8PCA4KSk7XG59O1xuXG5kZWZpbmUoY2hhcmFjdGVycy5kb2N1bWVudC5zdGFydCwgS2luZC5TdGFydCk7XG5kZWZpbmUoY2hhcmFjdGVycy5kb2N1bWVudC5lbmQsIEtpbmQuRW5kKTtcbmRlZmluZShjaGFyYWN0ZXJzLmRvY3VtZW50LmluZGVudCwgS2luZC5JbmRlbnQpO1xuZGVmaW5lKGNoYXJhY3RlcnMuZG9jdW1lbnQub3V0ZGVudCwgS2luZC5PdXRkZW50KTtcbmRlZmluZShjaGFyYWN0ZXJzLmRvY3VtZW50LmFycmF5T3BlbiwgS2luZC5PcGVuKTtcbmRlZmluZShjaGFyYWN0ZXJzLmRvY3VtZW50LmFycmF5Q2xvc2UsIEtpbmQuQ2xvc2UpO1xuZGVmaW5lKGNoYXJhY3RlcnMuZG9jdW1lbnQuYXJyYXlEZWxpbWl0LCBLaW5kLkRlbGltaXQpO1xuZGVmaW5lKGNoYXJhY3RlcnMua2V5cy5tb2RpZmllcnMudXBwZXJDYXNlLCBLaW5kLktleVVwcGVyKTtcbmRlZmluZShjaGFyYWN0ZXJzLmtleXMubW9kaWZpZXJzLnVuaWNvZGUsIEtpbmQuS2V5VW5pY29kZSk7XG5kZWZpbmUoY2hhcmFjdGVycy5rZXlzLm90aGVyLmVtcHR5LCBLaW5kLktleUVtcHR5KTtcbmRlZmluZShjaGFyYWN0ZXJzLnZhbHVlcy5tb2RpZmllcnMudXBwZXJDYXNlLCBLaW5kLlZhbHVlVXBwZXIpO1xuZGVmaW5lKGNoYXJhY3RlcnMudmFsdWVzLm1vZGlmaWVycy51bmljb2RlLCBLaW5kLlZhbHVlVW5pY29kZSk7XG5kZWZpbmUoY2hhcmFjdGVycy52YWx1ZXMubW9kaWZpZXJzLm5lZ2F0aXZlLCBLaW5kLk5lZ2F0aXZlKTtcbmRlZmluZShjaGFyYWN0ZXJzLnZhbHVlcy5vdGhlci5lbXB0eVN0cmluZywgS2luZC5WYWx1ZUVtcHR5KTtcbmRlZmluZShjaGFyYWN0ZXJzLnZhbHVlcy5vdGhlci5udWxsLCBLaW5kLk51bGwpO1xuZGVmaW5lKGNoYXJhY3RlcnMudmFsdWVzLmJvb2xlYW5zLnRydWUsIEtpbmQuVHJ1ZSk7XG5kZWZpbmUoY2hhcmFjdGVycy52YWx1ZXMuYm9vbGVhbnMuZmFsc2UsIEtpbmQuRmFsc2UpO1xuXG5mb3IgKGNvbnN0IFtjaGFyLCBlbW9qaV0gb2YgT2JqZWN0LmVudHJpZXMoY2hhcmFjdGVycy5rZXlzLmxldHRlcnMpKSB7XG4gIGRlZmluZShlbW9qaSwgS2luZC5LZXlDaGFyLCBjaGFyLmNoYXJDb2RlQXQoMCkpO1xufVxuZm9yIChjb25zdCBbY2hhciwgZW1vamldIG9mIE9iamVjdC5lbnRyaWVzKGNoYXJhY3RlcnMua2V5cy5udW1lcmFscykpIHtcbiAgZGVmaW5lKGVtb2ppLCBLaW5kLktleUNoYXIsIGNoYXIuY2hhckNvZGVBdCgwKSk7XG59XG5mb3IgKGNvbnN0IFtoZXgsIGVtb2ppXSBvZiBPYmplY3QuZW50cmllcyhjaGFyYWN0ZXJzLmtleXMudW5pY29kZSkpIHtcbiAgZGVmaW5lKGVtb2ppLCBLaW5kLktleU5pYmJsZSwgcGFyc2VJbnQoaGV4LCAxNikpO1xufVxuZm9yIChjb25zdCBbY2hhciwgZW1vamldIG9mIE9iamVjdC5lbnRyaWVzKGNoYXJhY3RlcnMudmFsdWVzLmxldHRlcnMpKSB7XG4gIGRlZmluZShlbW9qaSwgS2luZC5WYWx1ZUNoYXIsIGNoYXIuY2hhckNvZGVBdCgwKSk7XG59XG5mb3IgKGNvbnN0IFtjaGFyLCBlbW9qaV0gb2YgT2JqZWN0LmVudHJpZXMoY2hhcmFjdGVycy52YWx1ZXMubnVtZXJhbHMpKSB7XG4gIGRlZmluZShlbW9qaSwgS2luZC5WYWx1ZUNoYXIsIGNoYXIuY2hhckNvZGVBdCgwKSk7XG59XG5mb3IgKGNvbnN0IFtoZXgsIGVtb2ppXSBvZiBPYmplY3QuZW50cmllcyhjaGFyYWN0ZXJzLnZhbHVlcy51bmljb2RlKSkge1xuICBkZWZpbmUoZW1vamksIEtpbmQuVmFsdWVOaWJibGUsIHBhcnNlSW50KGhleCwgMTYpKTtcbn1cbmZvciAoY29uc3QgW2NoYXIsIGVtb2ppXSBvZiBPYmplY3QuZW50cmllcyhjaGFyYWN0ZXJzLnZhbHVlcy5udW1iZXJzKSkge1xuICBjb25zdCBraW5kID1cbiAgICBjaGFyID09PSAnLicgPyBLaW5kLkRlY2ltYWwgOiBjaGFyID09PSAnZScgPyBLaW5kLkV4cG9uZW50IDogS2luZC5EaWdpdDtcbiAgZGVmaW5lKGVtb2ppLCBraW5kLCBjaGFyLmNoYXJDb2RlQXQoMCkpO1xufVxuXG4vLyBldmVyeSAvXFxzLyBjaGFyYWN0ZXIsIHBsdXMgdGhlIHZhcmlhdGlvbiBzZWxlY3RvciBzb21lIGVtb2ppIGNhcnJ5XG5mb3IgKGNvbnN0IHNwYWNlIG9mIFtcbiAgMHg5LCAweGEsIDB4YiwgMHhjLCAweGQsIDB4MjAsIDB4YTAsIDB4MTY4MCwgMHgyMDAwLCAweDIwMDEsIDB4MjAwMiwgMHgyMDAzLFxuICAweDIwMDQsIDB4MjAwNSwgMHgyMDA2LCAweDIwMDcsIDB4MjAwOCwgMHgyMDA5LCAweDIwMGEsIDB4MjAyOCwgMHgyMDI5LFxuICAweDIwMmYsIDB4MjA1ZiwgMHgzMDAwLCAweGZlZmYsIDB4ZmUwZixcbl0pIHtcbiAgc2V0VG9rZW4oc3BhY2UsIEtpbmQuU3BhY2UpO1xufVxuXG5jb25zdCBPQkpFQ1RfUFJPVE9UWVBFID0gT2JqZWN0LnByb3RvdHlwZTtcblxubGV0IHNvdXJjZSA9ICcnO1xubGV0IGluZGV4ID0gMDtcbmxldCBhdCA9IDA7XG5sZXQgcG9pbnQgPSAwO1xubGV0IGtpbmQ6IG51bWJlciA9IEtpbmQuRU9GO1xubGV0IGNvZGUgPSAwO1xubGV0IGRlcHRoID0gMDtcblxuZnVuY3Rpb24gbmV4dCgpOiBudW1iZXIge1xuICB3aGlsZSAoaW5kZXggPCBzb3VyY2UubGVuZ3RoKSB7XG4gICAgYXQgPSBpbmRleDtcbiAgICBwb2ludCA9IHNvdXJjZS5jb2RlUG9pbnRBdChpbmRleCkhO1xuICAgIGluZGV4ICs9IHBvaW50ID4gMHhmZmZmID8gMiA6IDE7XG4gICAgY29uc3QgdG9rZW4gPSBsb29rdXAocG9pbnQpO1xuICAgIGlmICh0b2tlbiA9PT0gS2luZC5TcGFjZSkgY29udGludWU7XG4gICAga2luZCA9IHRva2VuICYgMHhmZjtcbiAgICBjb2RlID0gdG9rZW4gPj4gODtcbiAgICByZXR1cm4ga2luZDtcbiAgfVxuICBhdCA9IGluZGV4O1xuICBraW5kID0gS2luZC5FT0Y7XG4gIHJldHVybiBraW5kO1xufVxuXG5mdW5jdGlvbiBmYWlsKCk6IG5ldmVyIHtcbiAgaWYgKGtpbmQgPT09IEtpbmQuRU9GKSB7XG4gICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKCdVbmV4cGVjdGVkIGVuZCBvZiBFbW9qaW9uIGlucHV0Jyk7XG4gIH1cbiAgdGhyb3cgbmV3IFN5bnRheEVycm9yKFxuICAgIGBVbmV4cGVjdGVkIFwiJHtTdHJpbmcuZnJvbUNvZGVQb2ludChwb2ludCl9XCIgaW4gRW1vamlvbiBhdCBwb3NpdGlvbiAke2F0fWBcbiAgKTtcbn1cblxuZnVuY3Rpb24gbmVzdCgpIHtcbiAgaWYgKCsrZGVwdGggPiBNQVhfREVQVEgpIHtcbiAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoXG4gICAgICBgRW1vamlvbiBuZXN0aW5nIGV4Y2VlZHMgJHtNQVhfREVQVEh9IGxldmVscyBhdCBwb3NpdGlvbiAke2F0fWBcbiAgICApO1xuICB9XG59XG5cbmZ1bmN0aW9uIGV4cGVjdChleHBlY3RlZDogbnVtYmVyKSB7XG4gIGlmIChraW5kICE9PSBleHBlY3RlZCkgZmFpbCgpO1xuICBuZXh0KCk7XG59XG5cbmZ1bmN0aW9uIHRleHQoXG4gIGNoYXI6IG51bWJlcixcbiAgdXBwZXI6IG51bWJlcixcbiAgdW5pY29kZTogbnVtYmVyLFxuICBuaWJibGU6IG51bWJlclxuKTogc3RyaW5nIHtcbiAgbGV0IG91dCA9ICcnO1xuICBmb3IgKDs7KSB7XG4gICAgaWYgKGtpbmQgPT09IGNoYXIpIHtcbiAgICAgIG91dCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGNvZGUpO1xuICAgICAgbmV4dCgpO1xuICAgIH0gZWxzZSBpZiAoa2luZCA9PT0gdXBwZXIpIHtcbiAgICAgIG5leHQoKTtcbiAgICAgIGlmIChraW5kICE9PSBjaGFyIHx8IGNvZGUgPCA5NykgZmFpbCgpO1xuICAgICAgb3V0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoY29kZSAtIDMyKTtcbiAgICAgIG5leHQoKTtcbiAgICB9IGVsc2UgaWYgKGtpbmQgPT09IHVuaWNvZGUpIHtcbiAgICAgIG5leHQoKTtcbiAgICAgIGlmIChraW5kICE9PSBuaWJibGUpIGZhaWwoKTtcbiAgICAgIC8vIFUrMTBGRkZGLCB0aGUgaGlnaGVzdCBjb2RlIHBvaW50LCBuZWVkcyBzaXggbmliYmxlcy5cbiAgICAgIGxldCB2YWx1ZSA9IDA7XG4gICAgICBsZXQgbmliYmxlcyA9IDA7XG4gICAgICBkbyB7XG4gICAgICAgIGlmICgrK25pYmJsZXMgPiA2KSBmYWlsKCk7XG4gICAgICAgIHZhbHVlID0gdmFsdWUgKiAxNiArIGNvZGU7XG4gICAgICAgIGlmICh2YWx1ZSA+IDB4MTBmZmZmKSBmYWlsKCk7XG4gICAgICAgIG5leHQoKTtcbiAgICAgIH0gd2hpbGUgKGtpbmQgPT09IG5pYmJsZSk7XG4gICAgICBvdXQgKz0gU3RyaW5nLmZyb21Db2RlUG9pbnQodmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gb3V0O1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBkaWdpdHMoKTogc3RyaW5nIHtcbiAgaWYgKGtpbmQgIT09IEtpbmQuRGlnaXQpIGZhaWwoKTtcbiAgbGV0IG91dCA9ICcnO1xuICBkbyB7XG4gICAgb3V0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoY29kZSk7XG4gICAgbmV4dCgpO1xuICB9IHdoaWxlIChraW5kID09PSBLaW5kLkRpZ2l0KTtcbiAgcmV0dXJuIG91dDtcbn1cblxuZnVuY3Rpb24gbnVtYmVyKCk6IG51bWJlciB7XG4gIGxldCBvdXQgPSAnJztcbiAgaWYgKGtpbmQgPT09IEtpbmQuTmVnYXRpdmUpIHtcbiAgICBvdXQgPSAnLSc7XG4gICAgbmV4dCgpO1xuICB9XG4gIGlmIChraW5kID09PSBLaW5kLkRpZ2l0ICYmIGNvZGUgPT09IDQ4KSB7XG4gICAgb3V0ICs9ICcwJztcbiAgICBuZXh0KCk7XG4gICAgaWYgKGtpbmQgPT09IEtpbmQuRGlnaXQpIGZhaWwoKTtcbiAgfSBlbHNlIHtcbiAgICBvdXQgKz0gZGlnaXRzKCk7XG4gIH1cbiAgaWYgKGtpbmQgPT09IEtpbmQuRGVjaW1hbCkge1xuICAgIG5leHQoKTtcbiAgICBvdXQgKz0gJy4nICsgZGlnaXRzKCk7XG4gIH1cbiAgaWYgKGtpbmQgPT09IEtpbmQuRXhwb25lbnQpIHtcbiAgICBpZiAobmV4dCgpID09PSBLaW5kLk5lZ2F0aXZlKSB7XG4gICAgICBvdXQgKz0gJ2UtJztcbiAgICAgIG5leHQoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgb3V0ICs9ICdlJztcbiAgICB9XG4gICAgb3V0ICs9IGRpZ2l0cygpO1xuICB9XG4gIHJldHVybiBOdW1iZXIob3V0KTtcbn1cblxuZnVuY3Rpb24gbWVtYmVycyhjbG9zZTogbnVtYmVyKTogeyBba2V5OiBzdHJpbmddOiBKc29uIH0ge1xuICBjb25zdCBvdXQ6IHsgW2tleTogc3RyaW5nXTogSnNvbiB9ID0ge307XG4gIHdoaWxlIChraW5kICE9PSBjbG9zZSkge1xuICAgIGxldCBrZXkgPSAnJztcbiAgICBpZiAoa2luZCA9PT0gS2luZC5LZXlFbXB0eSkge1xuICAgICAgbmV4dCgpO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICBraW5kID09PSBLaW5kLktleUNoYXIgfHxcbiAgICAgIGtpbmQgPT09IEtpbmQuS2V5VXBwZXIgfHxcbiAgICAgIGtpbmQgPT09IEtpbmQuS2V5VW5pY29kZVxuICAgICkge1xuICAgICAga2V5ID0gdGV4dChLaW5kLktleUNoYXIsIEtpbmQuS2V5VXBwZXIsIEtpbmQuS2V5VW5pY29kZSwgS2luZC5LZXlOaWJibGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBmYWlsKCk7XG4gICAgfVxuICAgIGNvbnN0IGl0ZW0gPSB2YWx1ZSgpO1xuICAgIGlmIChrZXkgaW4gT0JKRUNUX1BST1RPVFlQRSkge1xuICAgICAgLy8gQXNzaWduaW5nIGEga2V5IHRoYXQgb3V0IGluaGVyaXRzIHdvdWxkIHJ1biBpdHMgc2V0dGVyIChfX3Byb3RvX19cbiAgICAgIC8vIHdvdWxkIHNldCB0aGUgcHJvdG90eXBlKSBvciBmYWlsIGlmIGl0IGlzIHJlYWQtb25seS4gRGVmaW5lIGl0IGFzXG4gICAgICAvLyBhbiBvd24gcHJvcGVydHkgaW5zdGVhZCwgYXMgSlNPTi5wYXJzZSgpIGRvZXMuXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob3V0LCBrZXksIHtcbiAgICAgICAgdmFsdWU6IGl0ZW0sXG4gICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQSByZXBlYXRlZCBrZXkgb3ZlcndyaXRlcyB0aGUgZWFybGllciBvbmU6IHRoZSBsYXN0IHdpbnMuXG4gICAgICBvdXRba2V5XSA9IGl0ZW07XG4gICAgfVxuICB9XG4gIHJldHVybiBvdXQ7XG59XG5cbmZ1bmN0aW9uIGFycmF5KCk6IEpzb25bXSB7XG4gIGNvbnN0IG91dDogSnNvbltdID0gW107XG4gIGlmIChuZXh0KCkgPT09IEtpbmQuQ2xvc2UpIHtcbiAgICBuZXh0KCk7XG4gICAgcmV0dXJuIG91dDtcbiAgfVxuICBvdXQucHVzaCh2YWx1ZSgpKTtcbiAgd2hpbGUgKGtpbmQgPT09IEtpbmQuRGVsaW1pdCkge1xuICAgIG5leHQoKTtcbiAgICBvdXQucHVzaCh2YWx1ZSgpKTtcbiAgfVxuICBleHBlY3QoS2luZC5DbG9zZSk7XG4gIHJldHVybiBvdXQ7XG59XG5cbmZ1bmN0aW9uIHZhbHVlKCk6IEpzb24ge1xuICBzd2l0Y2ggKGtpbmQpIHtcbiAgICBjYXNlIEtpbmQuSW5kZW50OiB7XG4gICAgICBuZXN0KCk7XG4gICAgICBuZXh0KCk7XG4gICAgICBjb25zdCBvdXQgPSBtZW1iZXJzKEtpbmQuT3V0ZGVudCk7XG4gICAgICBuZXh0KCk7XG4gICAgICBkZXB0aC0tO1xuICAgICAgcmV0dXJuIG91dDtcbiAgICB9XG4gICAgY2FzZSBLaW5kLk9wZW46IHtcbiAgICAgIG5lc3QoKTtcbiAgICAgIGNvbnN0IG91dCA9IGFycmF5KCk7XG4gICAgICBkZXB0aC0tO1xuICAgICAgcmV0dXJuIG91dDtcbiAgICB9XG4gICAgY2FzZSBLaW5kLlRydWU6XG4gICAgICBuZXh0KCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICBjYXNlIEtpbmQuRmFsc2U6XG4gICAgICBuZXh0KCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgY2FzZSBLaW5kLk51bGw6XG4gICAgICBuZXh0KCk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICBjYXNlIEtpbmQuVmFsdWVFbXB0eTpcbiAgICAgIG5leHQoKTtcbiAgICAgIHJldHVybiAnJztcbiAgICBjYXNlIEtpbmQuTmVnYXRpdmU6XG4gICAgY2FzZSBLaW5kLkRpZ2l0OlxuICAgICAgcmV0dXJuIG51bWJlcigpO1xuICAgIGNhc2UgS2luZC5WYWx1ZUNoYXI6XG4gICAgY2FzZSBLaW5kLlZhbHVlVXBwZXI6XG4gICAgY2FzZSBLaW5kLlZhbHVlVW5pY29kZTpcbiAgICAgIHJldHVybiB0ZXh0KFxuICAgICAgICBLaW5kLlZhbHVlQ2hhcixcbiAgICAgICAgS2luZC5WYWx1ZVVwcGVyLFxuICAgICAgICBLaW5kLlZhbHVlVW5pY29kZSxcbiAgICAgICAgS2luZC5WYWx1ZU5pYmJsZVxuICAgICAgKTtcbiAgfVxuICByZXR1cm4gZmFpbCgpO1xufVxuXG4vKipcbiAqIFBhcnNlIGFuIEVtb2ppb24gZG9jdW1lbnQgaW50byB0aGUgdmFsdWUgaXQgaG9sZHMsIGFzIGBKU09OLnBhcnNlKClgIHBhcnNlc1xuICogSlNPTiB0ZXh0LlxuICpcbiAqIE9iamVjdHMgY29tZSBiYWNrIGFzIHBsYWluIG9iamVjdHMgYW5kIGFycmF5cyBhcyBwbGFpbiBhcnJheXMuIEEga2V5IHRoYXRcbiAqIGBPYmplY3QucHJvdG90eXBlYCBoYXMsIHN1Y2ggYXMgYF9fcHJvdG9fX2AsIGJlY29tZXMgYW4gb3JkaW5hcnkgb3duXG4gKiBwcm9wZXJ0eSBhbmQgbmV2ZXIgY2hhbmdlcyB0aGUgcHJvdG90eXBlLiBXaGVuIGEga2V5IHJlcGVhdHMsIHRoZSBsYXN0XG4gKiB2YWx1ZSB3aW5zLlxuICpcbiAqIEBwYXJhbSBlbW9qaW9uIC0gVGhlIGRvY3VtZW50LCBmcm9tIGDwn5mMYCB0byBg4pyLYC4gV2hpdGVzcGFjZSBhbmQgVStGRTBGXG4gKiB2YXJpYXRpb24gc2VsZWN0b3JzIGFueXdoZXJlIGluIGl0IGFyZSBpZ25vcmVkLlxuICogQHJldHVybnMgVGhlIG9iamVjdCwgYXJyYXksIHN0cmluZywgbnVtYmVyLCBib29sZWFuIG9yIGBudWxsYCBpdCBob2xkcy5cbiAqIEB0aHJvd3Mge1N5bnRheEVycm9yfSBJZiB0aGUgZG9jdW1lbnQgaXMgbm90IHZhbGlkIEVtb2ppb24sIG5hbWluZyB0aGVcbiAqIHVuZXhwZWN0ZWQgZW1vamkgYW5kIGl0cyBwb3NpdGlvbiwgb3IgaWYgaXQgbmVzdHMgYXJyYXlzIGFuZCBvYmplY3RzIG1vcmVcbiAqIHRoYW4gNTEyIGxldmVscyBkZWVwLlxuICpcbiAqIEBleGFtcGxlXG4gKiBwYXJzZSgn8J+ZjPCfmLbwn5ig8J+kkfCfmLPwn5Gh8J+QmPCfkIHwn6aJ8J+mkvCfkJbwn6aJ8J+mj+KciycpO1xuICogLy89PiB7IG5hbWU6ICdFbW9qaW9uJyB9XG4gKlxuICogQGV4YW1wbGVcbiAqIHBhcnNlKCfwn5mM8J+knPCflZDwn6Sd8J+SmvCfpJ3wn5Wz8J+km+KciycpO1xuICogLy89PiBbMSwgdHJ1ZSwgbnVsbF1cbiAqL1xuZXhwb3J0IGNvbnN0IHBhcnNlID0gKGVtb2ppb246IHN0cmluZyk6IEpzb24gPT4ge1xuICBzb3VyY2UgPSBlbW9qaW9uO1xuICBpbmRleCA9IDA7XG4gIGRlcHRoID0gMDtcbiAgdHJ5IHtcbiAgICBuZXh0KCk7XG4gICAgZXhwZWN0KEtpbmQuU3RhcnQpO1xuICAgIC8vIEEgdG9wLWxldmVsIG9iamVjdCBpcyB3cml0dGVuIHdpdGhvdXQg8J+RifCfkYguXG4gICAgaWYgKGtpbmQgPT09IEtpbmQuSW5kZW50KSBmYWlsKCk7XG4gICAgY29uc3Qgb3V0ID1cbiAgICAgIGtpbmQgPT09IEtpbmQuRW5kIHx8XG4gICAgICBraW5kID09PSBLaW5kLktleUVtcHR5IHx8XG4gICAgICBraW5kID09PSBLaW5kLktleUNoYXIgfHxcbiAgICAgIGtpbmQgPT09IEtpbmQuS2V5VXBwZXIgfHxcbiAgICAgIGtpbmQgPT09IEtpbmQuS2V5VW5pY29kZVxuICAgICAgICA/IG1lbWJlcnMoS2luZC5FbmQpXG4gICAgICAgIDogdmFsdWUoKTtcbiAgICBleHBlY3QoS2luZC5FbmQpO1xuICAgIGlmIChraW5kICE9PSBLaW5kLkVPRikgZmFpbCgpO1xuICAgIHJldHVybiBvdXQ7XG4gIH0gZmluYWxseSB7XG4gICAgc291cmNlID0gJyc7XG4gIH1cbn07XG4iXX0=
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "emj",
|
|
3
|
-
"version": "0.0
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "Emoji Object Notation",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -18,59 +18,54 @@
|
|
|
18
18
|
"files": [
|
|
19
19
|
"lib"
|
|
20
20
|
],
|
|
21
|
-
"main": "lib/
|
|
21
|
+
"main": "lib/index.js",
|
|
22
|
+
"types": "lib/index.d.ts",
|
|
22
23
|
"scripts": {
|
|
23
24
|
"clean": "rimraf lib && rimraf coverage",
|
|
24
25
|
"format": "prettier --write \"src/**/*.ts\" \"test/**/*.{ts,cjs}\" README.md",
|
|
25
26
|
"format:check": "prettier --check \"src/**/*.ts\" \"test/**/*.{ts,cjs}\" README.md",
|
|
26
27
|
"lint": "eslint src/**/*.ts",
|
|
27
28
|
"prebuild": "npm run clean && npm run format:check && npm run lint && echo Using TypeScript && tsc --version",
|
|
28
|
-
"build": "npm run build:
|
|
29
|
-
"build:grammar": "mkdir -p gen && nearleyc src/grammar.ne -o gen/grammar.ts && replace-in-file \"Lexer: lexer,\" \"// @ts-ignore\nLexer: lexer,\" gen/grammar.ts",
|
|
29
|
+
"build": "npm run build:lib && npm run build:bundle",
|
|
30
30
|
"build:bundle": "npm run rollup",
|
|
31
31
|
"build:lib": "tsc --pretty",
|
|
32
32
|
"start": "npm run build && npm run test",
|
|
33
|
-
"test": "
|
|
33
|
+
"test": "vitest run --allowOnly=false",
|
|
34
34
|
"test:consumer": "node test/consumer-smoke.cjs .",
|
|
35
|
-
"coverage": "
|
|
35
|
+
"coverage": "vitest run --coverage",
|
|
36
36
|
"update": "ncu -u && npm i && npm test",
|
|
37
37
|
"rollup": "rollup --config rollup.config.mjs",
|
|
38
38
|
"watch": "npm run build -- --watch",
|
|
39
|
-
"watch:test": "vitest"
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
"lodash": "^4.18.1",
|
|
43
|
-
"moo": "^0.5.3",
|
|
44
|
-
"nearley": "^2.20.1"
|
|
39
|
+
"watch:test": "vitest",
|
|
40
|
+
"bench": "npm run build:lib && node --expose-gc bench/index.mjs",
|
|
41
|
+
"bench:ab": "node bench/ab.mjs"
|
|
45
42
|
},
|
|
46
43
|
"devDependencies": {
|
|
47
|
-
"@emnapi/core": "^1.
|
|
48
|
-
"@emnapi/runtime": "^1.
|
|
44
|
+
"@emnapi/core": "^1.11.3",
|
|
45
|
+
"@emnapi/runtime": "^1.11.3",
|
|
49
46
|
"@eslint/js": "^10.0.1",
|
|
50
|
-
"@rollup/plugin-
|
|
51
|
-
"@
|
|
52
|
-
"@
|
|
53
|
-
"@
|
|
54
|
-
"@
|
|
55
|
-
"
|
|
56
|
-
"@types/node": "^26.1.1",
|
|
57
|
-
"@typescript-eslint/eslint-plugin": "^8.59.2",
|
|
58
|
-
"@typescript-eslint/parser": "^8.59.2",
|
|
59
|
-
"@vitest/coverage-v8": "^4.1.8",
|
|
60
|
-
"eslint": "^10.3.0",
|
|
47
|
+
"@rollup/plugin-typescript": "^12.3.1",
|
|
48
|
+
"@types/node": "^26.6.6",
|
|
49
|
+
"@typescript-eslint/eslint-plugin": "^8.72.2",
|
|
50
|
+
"@typescript-eslint/parser": "^8.72.2",
|
|
51
|
+
"@vitest/coverage-v8": "^5.1.0",
|
|
52
|
+
"eslint": "^10.14.0",
|
|
61
53
|
"eslint-config-prettier": "^10.1.8",
|
|
62
|
-
"eslint-plugin-prettier": "^5.5.
|
|
63
|
-
"globals": "^17.
|
|
64
|
-
"
|
|
65
|
-
"
|
|
66
|
-
"
|
|
67
|
-
"rimraf": "^6.1.
|
|
68
|
-
"rollup": "^4.
|
|
69
|
-
"tslib": "^2.
|
|
54
|
+
"eslint-plugin-prettier": "^5.5.7",
|
|
55
|
+
"globals": "^17.14.0",
|
|
56
|
+
"mitata": "^1.0.34",
|
|
57
|
+
"npm-check-updates": "^23.1.1",
|
|
58
|
+
"prettier": "^3.10.0",
|
|
59
|
+
"rimraf": "^6.1.4",
|
|
60
|
+
"rollup": "^4.68.2",
|
|
61
|
+
"tslib": "^2.9.1",
|
|
70
62
|
"typescript": "^6.0.3",
|
|
71
|
-
"vitest": "^
|
|
63
|
+
"vitest": "^5.1.0"
|
|
72
64
|
},
|
|
73
65
|
"engines": {
|
|
74
66
|
"node": ">=10.0.0"
|
|
67
|
+
},
|
|
68
|
+
"overrides": {
|
|
69
|
+
"minimatch": "^11.0.1"
|
|
75
70
|
}
|
|
76
71
|
}
|