@profile-psl/psl-parser 0.1.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/tokenizer.d.ts ADDED
@@ -0,0 +1,139 @@
1
+ export declare function getTokens(documentContents: string): IterableIterator<Token>;
2
+ export declare class Token {
3
+ type: Type;
4
+ value: string;
5
+ position: Position;
6
+ constructor(type: Type, value: string, position: Position);
7
+ getRange(): Range;
8
+ isWhiteSpace(): boolean;
9
+ isAlphanumeric(): boolean;
10
+ isNumeric(): boolean;
11
+ isLineComment(): boolean;
12
+ isBlockComment(): boolean;
13
+ isString(): boolean;
14
+ isLineCommentInit(): boolean;
15
+ isBlockCommentInit(): boolean;
16
+ isBlockCommentTerm(): boolean;
17
+ isDoubleQuotes(): boolean;
18
+ isSlash(): boolean;
19
+ isTab(): boolean;
20
+ isNewLine(): boolean;
21
+ isSpace(): boolean;
22
+ isExclamationMark(): boolean;
23
+ isNumberSign(): boolean;
24
+ isDollarSign(): boolean;
25
+ isAmpersand(): boolean;
26
+ isSingleQuote(): boolean;
27
+ isOpenParen(): boolean;
28
+ isCloseParen(): boolean;
29
+ isAsterisk(): boolean;
30
+ isPlusSign(): boolean;
31
+ isComma(): boolean;
32
+ isMinusSign(): boolean;
33
+ isPeriod(): boolean;
34
+ isColon(): boolean;
35
+ isSemiColon(): boolean;
36
+ isLessThan(): boolean;
37
+ isEqualSign(): boolean;
38
+ isGreaterThan(): boolean;
39
+ isQuestionMark(): boolean;
40
+ isAtSymbol(): boolean;
41
+ isOpenBracket(): boolean;
42
+ isBackslash(): boolean;
43
+ isCloseBracket(): boolean;
44
+ isCaret(): boolean;
45
+ isUnderscore(): boolean;
46
+ isBackQuote(): boolean;
47
+ isOpenBrace(): boolean;
48
+ isPipe(): boolean;
49
+ isCloseBrace(): boolean;
50
+ isTilde(): boolean;
51
+ }
52
+ export declare class Range {
53
+ /**
54
+ * The start position. It is before or equal to [end](#Range.end).
55
+ */
56
+ readonly start: Position;
57
+ /**
58
+ * The end position. It is after or equal to [start](#Range.start).
59
+ */
60
+ readonly end: Position;
61
+ /**
62
+ * Create a new range from two positions. If `start` is not
63
+ * before or equal to `end`, the values will be swapped.
64
+ *
65
+ * @param start A position.
66
+ * @param end A position.
67
+ */
68
+ constructor(start: Position, end: Position);
69
+ /**
70
+ * Create a new range from number coordinates. It is a shorter equivalent of using
71
+ * `new Range(new Position(startLine, startCharacter), new Position(endLine, endCharacter))`
72
+ *
73
+ * @param startLine A zero-based line value.
74
+ * @param startCharacter A zero-based character value.
75
+ * @param endLine A zero-based line value.
76
+ * @param endCharacter A zero-based character value.
77
+ */
78
+ constructor(startLine: number, startCharacter: number, endLine: number, endCharacter: number);
79
+ }
80
+ export declare class Position {
81
+ /**
82
+ * The zero-based line value.
83
+ */
84
+ readonly line: number;
85
+ /**
86
+ * The zero-based character value.
87
+ */
88
+ readonly character: number;
89
+ /**
90
+ * @param line A zero-based line value.
91
+ * @param character A zero-based character value.
92
+ */
93
+ constructor(line: number, character: number);
94
+ }
95
+ export declare const enum Type {
96
+ Alphanumeric = 1,
97
+ Numeric = 2,
98
+ LineComment = 3,
99
+ BlockComment = 4,
100
+ String = 5,
101
+ LineCommentInit = 6,
102
+ BlockCommentInit = 7,
103
+ BlockCommentTerm = 8,
104
+ DoubleQuotes = 9,
105
+ Slash = 10,
106
+ Tab = 11,
107
+ NewLine = 13,
108
+ Space = 32,
109
+ ExclamationMark = 33,
110
+ NumberSign = 35,
111
+ DollarSign = 36,
112
+ Ampersand = 38,
113
+ SingleQuote = 39,
114
+ OpenParen = 40,
115
+ CloseParen = 41,
116
+ Asterisk = 42,
117
+ PlusSign = 43,
118
+ Comma = 44,
119
+ MinusSign = 45,
120
+ Period = 46,
121
+ Colon = 58,
122
+ SemiColon = 59,
123
+ LessThan = 60,
124
+ EqualSign = 61,
125
+ GreaterThan = 62,
126
+ QuestionMark = 63,
127
+ AtSymbol = 64,
128
+ OpenBracket = 91,
129
+ Backslash = 92,
130
+ CloseBracket = 93,
131
+ Caret = 94,
132
+ Underscore = 95,
133
+ BackQuote = 96,
134
+ OpenBrace = 123,
135
+ Pipe = 124,
136
+ CloseBrace = 125,
137
+ Tilde = 126,
138
+ Undefined = -1
139
+ }
package/tokenizer.js ADDED
@@ -0,0 +1,535 @@
1
+ export function* getTokens(documentContents) {
2
+ const t = new Tokenizer();
3
+ for (const char of documentContents) {
4
+ t.charType = getType(char);
5
+ if (t.tokenType === 0) {
6
+ t.tokenType = t.charType;
7
+ }
8
+ while (!t.parsed) {
9
+ if (t.parseCharacter(char)) {
10
+ yield t.token;
11
+ }
12
+ }
13
+ t.parsed = false;
14
+ }
15
+ if (t.tokenType !== 0) { // if there is an unfinished token left
16
+ t.finalizeToken(0);
17
+ yield t.token;
18
+ }
19
+ }
20
+ export class Token {
21
+ type;
22
+ value;
23
+ position;
24
+ constructor(type, value, position) {
25
+ this.position = position;
26
+ this.value = value;
27
+ this.type = type;
28
+ }
29
+ getRange() {
30
+ const startPosition = this.position;
31
+ const endPosition = new Position(this.position.line, this.position.character + this.value.length);
32
+ return new Range(startPosition, endPosition);
33
+ }
34
+ isWhiteSpace() {
35
+ return this.type === 32 /* Type.Space */
36
+ || this.type === 11 /* Type.Tab */
37
+ || this.type === 13 /* Type.NewLine */
38
+ || this.type === -1 /* Type.Undefined */;
39
+ }
40
+ isAlphanumeric() {
41
+ return this.type === 1 /* Type.Alphanumeric */;
42
+ }
43
+ isNumeric() {
44
+ return this.type === 2 /* Type.Numeric */;
45
+ }
46
+ isLineComment() {
47
+ return this.type === 3 /* Type.LineComment */;
48
+ }
49
+ isBlockComment() {
50
+ return this.type === 4 /* Type.BlockComment */;
51
+ }
52
+ isString() {
53
+ return this.type === 5 /* Type.String */;
54
+ }
55
+ isLineCommentInit() {
56
+ return this.type === 6 /* Type.LineCommentInit */;
57
+ }
58
+ isBlockCommentInit() {
59
+ return this.type === 7 /* Type.BlockCommentInit */;
60
+ }
61
+ isBlockCommentTerm() {
62
+ return this.type === 8 /* Type.BlockCommentTerm */;
63
+ }
64
+ isDoubleQuotes() {
65
+ return this.type === 9 /* Type.DoubleQuotes */;
66
+ }
67
+ isSlash() {
68
+ return this.type === 10 /* Type.Slash */;
69
+ }
70
+ isTab() {
71
+ return this.type === 11 /* Type.Tab */;
72
+ }
73
+ isNewLine() {
74
+ return this.type === 13 /* Type.NewLine */;
75
+ }
76
+ isSpace() {
77
+ return this.type === 32 /* Type.Space */;
78
+ }
79
+ isExclamationMark() {
80
+ return this.type === 33 /* Type.ExclamationMark */;
81
+ }
82
+ isNumberSign() {
83
+ return this.type === 35 /* Type.NumberSign */;
84
+ }
85
+ isDollarSign() {
86
+ return this.type === 36 /* Type.DollarSign */;
87
+ }
88
+ isAmpersand() {
89
+ return this.type === 38 /* Type.Ampersand */;
90
+ }
91
+ isSingleQuote() {
92
+ return this.type === 39 /* Type.SingleQuote */;
93
+ }
94
+ isOpenParen() {
95
+ return this.type === 40 /* Type.OpenParen */;
96
+ }
97
+ isCloseParen() {
98
+ return this.type === 41 /* Type.CloseParen */;
99
+ }
100
+ isAsterisk() {
101
+ return this.type === 42 /* Type.Asterisk */;
102
+ }
103
+ isPlusSign() {
104
+ return this.type === 43 /* Type.PlusSign */;
105
+ }
106
+ isComma() {
107
+ return this.type === 44 /* Type.Comma */;
108
+ }
109
+ isMinusSign() {
110
+ return this.type === 45 /* Type.MinusSign */;
111
+ }
112
+ isPeriod() {
113
+ return this.type === 46 /* Type.Period */;
114
+ }
115
+ isColon() {
116
+ return this.type === 58 /* Type.Colon */;
117
+ }
118
+ isSemiColon() {
119
+ return this.type === 59 /* Type.SemiColon */;
120
+ }
121
+ isLessThan() {
122
+ return this.type === 60 /* Type.LessThan */;
123
+ }
124
+ isEqualSign() {
125
+ return this.type === 61 /* Type.EqualSign */;
126
+ }
127
+ isGreaterThan() {
128
+ return this.type === 62 /* Type.GreaterThan */;
129
+ }
130
+ isQuestionMark() {
131
+ return this.type === 63 /* Type.QuestionMark */;
132
+ }
133
+ isAtSymbol() {
134
+ return this.type === 64 /* Type.AtSymbol */;
135
+ }
136
+ isOpenBracket() {
137
+ return this.type === 91 /* Type.OpenBracket */;
138
+ }
139
+ isBackslash() {
140
+ return this.type === 92 /* Type.Backslash */;
141
+ }
142
+ isCloseBracket() {
143
+ return this.type === 93 /* Type.CloseBracket */;
144
+ }
145
+ isCaret() {
146
+ return this.type === 94 /* Type.Caret */;
147
+ }
148
+ isUnderscore() {
149
+ return this.type === 95 /* Type.Underscore */;
150
+ }
151
+ isBackQuote() {
152
+ return this.type === 96 /* Type.BackQuote */;
153
+ }
154
+ isOpenBrace() {
155
+ return this.type === 123 /* Type.OpenBrace */;
156
+ }
157
+ isPipe() {
158
+ return this.type === 124 /* Type.Pipe */;
159
+ }
160
+ isCloseBrace() {
161
+ return this.type === 125 /* Type.CloseBrace */;
162
+ }
163
+ isTilde() {
164
+ return this.type === 126 /* Type.Tilde */;
165
+ }
166
+ }
167
+ export class Range {
168
+ /**
169
+ * The start position. It is before or equal to [end](#Range.end).
170
+ */
171
+ start;
172
+ /**
173
+ * The end position. It is after or equal to [start](#Range.start).
174
+ */
175
+ end;
176
+ constructor(a, b, c, d) {
177
+ if (typeof a === "number" &&
178
+ typeof b === "number" &&
179
+ typeof c === "number" &&
180
+ typeof d === "number") {
181
+ this.start = new Position(a, b);
182
+ this.end = new Position(c, d);
183
+ }
184
+ else {
185
+ this.start = a;
186
+ this.end = b;
187
+ }
188
+ }
189
+ }
190
+ export class Position {
191
+ /**
192
+ * The zero-based line value.
193
+ */
194
+ line;
195
+ /**
196
+ * The zero-based character value.
197
+ */
198
+ character;
199
+ /**
200
+ * @param line A zero-based line value.
201
+ * @param character A zero-based character value.
202
+ */
203
+ constructor(line, character) {
204
+ this.line = line;
205
+ this.character = character;
206
+ }
207
+ }
208
+ class Tokenizer {
209
+ documentLine;
210
+ documentColumn;
211
+ charType;
212
+ tokenType;
213
+ tokenValue;
214
+ tokenPosition;
215
+ token;
216
+ parsed;
217
+ stringOpen;
218
+ firstSlash;
219
+ asterisk;
220
+ constructor() {
221
+ this.documentLine = 0;
222
+ this.documentColumn = 0;
223
+ this.charType = 0;
224
+ this.tokenType = 0;
225
+ this.tokenValue = "";
226
+ this.tokenPosition = new Position(this.documentLine, this.documentColumn);
227
+ this.parsed = false;
228
+ this.stringOpen = false;
229
+ this.firstSlash = false;
230
+ this.asterisk = false;
231
+ }
232
+ parseCharacter(char) {
233
+ if (this.tokenType === 1 /* Type.Alphanumeric */) {
234
+ if (this.charType === 1 /* Type.Alphanumeric */ || this.charType === 2 /* Type.Numeric */) {
235
+ this.tokenValue = this.tokenValue + char;
236
+ this.parsed = true;
237
+ this.documentColumn++;
238
+ return false;
239
+ }
240
+ else {
241
+ this.finalizeToken(this.charType);
242
+ return true;
243
+ }
244
+ }
245
+ else if (this.tokenType === 2 /* Type.Numeric */) {
246
+ if (this.charType === 2 /* Type.Numeric */) {
247
+ this.tokenValue = this.tokenValue + char;
248
+ this.parsed = true;
249
+ this.documentColumn++;
250
+ return false;
251
+ }
252
+ else {
253
+ this.finalizeToken(this.charType);
254
+ return true;
255
+ }
256
+ }
257
+ else if (this.tokenType === 3 /* Type.LineComment */) {
258
+ if (this.charType === 13 /* Type.NewLine */) {
259
+ this.finalizeToken(13 /* Type.NewLine */);
260
+ return true;
261
+ }
262
+ else {
263
+ this.tokenValue = this.tokenValue + char;
264
+ this.parsed = true;
265
+ this.documentColumn++;
266
+ return false;
267
+ }
268
+ }
269
+ else if (this.tokenType === 4 /* Type.BlockComment */) {
270
+ if (this.asterisk) { // the previous char is *
271
+ this.asterisk = false;
272
+ if (this.charType === 10 /* Type.Slash */) { // the last two chars are * /
273
+ this.finalizeToken(8 /* Type.BlockCommentTerm */);
274
+ // add the * that was not yet added to the token
275
+ this.tokenValue = this.tokenValue + "*";
276
+ this.documentColumn++;
277
+ return true;
278
+ }
279
+ else {
280
+ // add the * that was not yet added to the token
281
+ this.tokenValue = this.tokenValue + "*";
282
+ this.documentColumn++;
283
+ }
284
+ }
285
+ /* Do not add a * to the token immediately, it could be the end of a block
286
+ comment
287
+ */
288
+ if (this.charType === 42 /* Type.Asterisk */) {
289
+ this.asterisk = true;
290
+ }
291
+ else {
292
+ this.tokenValue = this.tokenValue + char;
293
+ if (this.charType === 13 /* Type.NewLine */) {
294
+ this.documentLine++;
295
+ this.documentColumn = 0;
296
+ }
297
+ else {
298
+ this.documentColumn++;
299
+ }
300
+ }
301
+ this.parsed = true;
302
+ return false;
303
+ }
304
+ else if (this.tokenType === 5 /* Type.String */) {
305
+ if (this.charType === 9 /* Type.DoubleQuotes */) {
306
+ this.finalizeToken(9 /* Type.DoubleQuotes */);
307
+ return true;
308
+ }
309
+ else {
310
+ this.tokenValue = this.tokenValue + char;
311
+ this.parsed = true;
312
+ if (this.charType === 13 /* Type.NewLine */) {
313
+ this.documentLine++;
314
+ this.documentColumn = 0;
315
+ }
316
+ else {
317
+ this.documentColumn++;
318
+ }
319
+ return false;
320
+ }
321
+ }
322
+ else if (this.tokenType === 6 /* Type.LineCommentInit */) {
323
+ this.tokenValue = this.tokenValue + char;
324
+ this.parsed = true;
325
+ this.documentColumn++;
326
+ this.finalizeToken(3 /* Type.LineComment */);
327
+ return true;
328
+ }
329
+ else if (this.tokenType === 7 /* Type.BlockCommentInit */) {
330
+ this.tokenValue = this.tokenValue + char;
331
+ this.parsed = true;
332
+ this.documentColumn++;
333
+ this.finalizeToken(4 /* Type.BlockComment */);
334
+ return true;
335
+ }
336
+ else if (this.tokenType === 8 /* Type.BlockCommentTerm */) {
337
+ this.tokenValue = this.tokenValue + char;
338
+ this.parsed = true;
339
+ this.documentColumn++;
340
+ this.finalizeToken(0);
341
+ return true;
342
+ }
343
+ else if (this.tokenType === 9 /* Type.DoubleQuotes */) {
344
+ this.tokenValue = this.tokenValue + char;
345
+ this.parsed = true;
346
+ this.documentColumn++;
347
+ if (this.stringOpen) {
348
+ this.stringOpen = false;
349
+ this.finalizeToken(0);
350
+ }
351
+ else {
352
+ this.stringOpen = true;
353
+ this.finalizeToken(5 /* Type.String */);
354
+ }
355
+ return true;
356
+ }
357
+ else if (this.tokenType === 10 /* Type.Slash */ || this.tokenType === 59 /* Type.SemiColon */) {
358
+ if (this.tokenType === 59 /* Type.SemiColon */) {
359
+ this.tokenType = 6 /* Type.LineCommentInit */;
360
+ return false;
361
+ }
362
+ else if (this.firstSlash) {
363
+ this.firstSlash = false;
364
+ if (this.charType === 10 /* Type.Slash */) {
365
+ this.tokenType = 6 /* Type.LineCommentInit */;
366
+ return false;
367
+ }
368
+ else if (this.charType === 42 /* Type.Asterisk */) {
369
+ this.tokenType = 7 /* Type.BlockCommentInit */;
370
+ return false;
371
+ }
372
+ else {
373
+ this.finalizeToken(this.charType);
374
+ return true;
375
+ }
376
+ }
377
+ else {
378
+ this.firstSlash = true;
379
+ this.tokenValue = this.tokenValue + char;
380
+ this.parsed = true;
381
+ this.documentColumn++;
382
+ return false;
383
+ }
384
+ }
385
+ else if (this.tokenType === 13 /* Type.NewLine */) {
386
+ this.tokenValue = this.tokenValue + char;
387
+ this.parsed = true;
388
+ this.documentLine++;
389
+ this.documentColumn = 0;
390
+ this.finalizeToken(0);
391
+ return true;
392
+ }
393
+ else if (this.tokenType > 10) { // all other token types
394
+ this.tokenValue = this.tokenValue + char;
395
+ this.parsed = true;
396
+ this.documentColumn++;
397
+ this.finalizeToken(0);
398
+ return true;
399
+ }
400
+ else if (this.tokenType === -1) { // undefined
401
+ this.tokenValue = this.tokenValue + char;
402
+ this.parsed = true;
403
+ this.documentColumn++;
404
+ this.finalizeToken(0);
405
+ return true;
406
+ }
407
+ return false;
408
+ }
409
+ finalizeToken(newType) {
410
+ this.token = new Token(this.tokenType, this.tokenValue, this.tokenPosition);
411
+ this.tokenType = newType;
412
+ this.tokenValue = "";
413
+ this.tokenPosition = new Position(this.documentLine, this.documentColumn);
414
+ }
415
+ }
416
+ function getType(c) {
417
+ const charCode = c.charCodeAt(0);
418
+ // Find a better way to incorporate the %
419
+ if (charCode >= 65 && charCode <= 90 ||
420
+ charCode >= 97 && charCode <= 122 ||
421
+ charCode === 37) {
422
+ return 1 /* Type.Alphanumeric */;
423
+ }
424
+ else if (charCode >= 48 && charCode <= 57) {
425
+ return 2 /* Type.Numeric */;
426
+ }
427
+ else if (charCode === 34) {
428
+ return 9 /* Type.DoubleQuotes */;
429
+ }
430
+ else if (charCode === 47) {
431
+ return 10 /* Type.Slash */;
432
+ }
433
+ else if (charCode === 9) {
434
+ return 11 /* Type.Tab */;
435
+ }
436
+ else if (charCode === 10) {
437
+ return 13 /* Type.NewLine */;
438
+ }
439
+ else if (charCode === 32) {
440
+ return 32 /* Type.Space */;
441
+ }
442
+ else if (charCode === 33) {
443
+ return 33 /* Type.ExclamationMark */;
444
+ }
445
+ else if (charCode === 35) {
446
+ return 35 /* Type.NumberSign */;
447
+ }
448
+ else if (charCode === 36) {
449
+ return 36 /* Type.DollarSign */;
450
+ // } else if (charCode === 37) {
451
+ // return Type.PercentSign;
452
+ }
453
+ else if (charCode === 38) {
454
+ return 38 /* Type.Ampersand */;
455
+ }
456
+ else if (charCode === 39) {
457
+ return 39 /* Type.SingleQuote */;
458
+ }
459
+ else if (charCode === 40) {
460
+ return 40 /* Type.OpenParen */;
461
+ }
462
+ else if (charCode === 41) {
463
+ return 41 /* Type.CloseParen */;
464
+ }
465
+ else if (charCode === 42) {
466
+ return 42 /* Type.Asterisk */;
467
+ }
468
+ else if (charCode === 43) {
469
+ return 43 /* Type.PlusSign */;
470
+ }
471
+ else if (charCode === 44) {
472
+ return 44 /* Type.Comma */;
473
+ }
474
+ else if (charCode === 45) {
475
+ return 45 /* Type.MinusSign */;
476
+ }
477
+ else if (charCode === 46) {
478
+ return 46 /* Type.Period */;
479
+ }
480
+ else if (charCode === 58) {
481
+ return 58 /* Type.Colon */;
482
+ }
483
+ else if (charCode === 59) {
484
+ return 59 /* Type.SemiColon */;
485
+ }
486
+ else if (charCode === 60) {
487
+ return 60 /* Type.LessThan */;
488
+ }
489
+ else if (charCode === 61) {
490
+ return 61 /* Type.EqualSign */;
491
+ }
492
+ else if (charCode === 62) {
493
+ return 62 /* Type.GreaterThan */;
494
+ }
495
+ else if (charCode === 63) {
496
+ return 63 /* Type.QuestionMark */;
497
+ }
498
+ else if (charCode === 64) {
499
+ return 64 /* Type.AtSymbol */;
500
+ }
501
+ else if (charCode === 91) {
502
+ return 91 /* Type.OpenBracket */;
503
+ }
504
+ else if (charCode === 92) {
505
+ return 92 /* Type.Backslash */;
506
+ }
507
+ else if (charCode === 93) {
508
+ return 93 /* Type.CloseBracket */;
509
+ }
510
+ else if (charCode === 94) {
511
+ return 94 /* Type.Caret */;
512
+ }
513
+ else if (charCode === 95) {
514
+ return 95 /* Type.Underscore */;
515
+ }
516
+ else if (charCode === 96) {
517
+ return 96 /* Type.BackQuote */;
518
+ }
519
+ else if (charCode === 123) {
520
+ return 123 /* Type.OpenBrace */;
521
+ }
522
+ else if (charCode === 124) {
523
+ return 124 /* Type.Pipe */;
524
+ }
525
+ else if (charCode === 125) {
526
+ return 125 /* Type.CloseBrace */;
527
+ }
528
+ else if (charCode === 126) {
529
+ return 126 /* Type.Tilde */;
530
+ }
531
+ else {
532
+ return -1 /* Type.Undefined */;
533
+ }
534
+ }
535
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW5pemVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3Rva2VuaXplci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLFNBQVMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxnQkFBd0I7SUFDbEQsTUFBTSxDQUFDLEdBQWMsSUFBSSxTQUFTLEVBQUUsQ0FBQztJQUVyQyxLQUFLLE1BQU0sSUFBSSxJQUFJLGdCQUFnQixFQUFFLENBQUM7UUFDckMsQ0FBQyxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDM0IsSUFBSSxDQUFDLENBQUMsU0FBUyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3ZCLENBQUMsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQztRQUMxQixDQUFDO1FBQ0QsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNsQixJQUFJLENBQUMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztnQkFDNUIsTUFBTSxDQUFDLENBQUMsS0FBSyxDQUFDO1lBQ2YsQ0FBQztRQUNGLENBQUM7UUFDRCxDQUFDLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztJQUNsQixDQUFDO0lBQ0QsSUFBSSxDQUFDLENBQUMsU0FBUyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsdUNBQXVDO1FBQy9ELENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbkIsTUFBTSxDQUFDLENBQUMsS0FBSyxDQUFDO0lBQ2YsQ0FBQztBQUNGLENBQUM7QUFFRCxNQUFNLE9BQU8sS0FBSztJQUNqQixJQUFJLENBQU87SUFDWCxLQUFLLENBQVM7SUFDZCxRQUFRLENBQVc7SUFFbkIsWUFBWSxJQUFVLEVBQUUsS0FBYSxFQUFFLFFBQWtCO1FBQ3hELElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFD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