pw-js-world 0.0.1

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.
@@ -0,0 +1,674 @@
1
+ /**
2
+ * CREDIT: Anatoly for making this Buffer Reader so I don't have to!
3
+ * Source: https://github.com/Anatoly03/pixelwalker.js/blob/9bb3c7e39a45006086a2abae8c515599bd3db835/src/util/buffer-reader.ts
4
+ * License: ISC
5
+ */
6
+ /**
7
+ * Data during the communication in the process is dynamic
8
+ * typed. Every entry is followed by a byte identifying the
9
+ * type, followed by data. The type header is noted by its'
10
+ * 7-bit notation.
11
+ */
12
+ export var ComponentTypeHeader;
13
+ (function (ComponentTypeHeader) {
14
+ ComponentTypeHeader[ComponentTypeHeader["String"] = 0] = "String";
15
+ ComponentTypeHeader[ComponentTypeHeader["Byte"] = 1] = "Byte";
16
+ ComponentTypeHeader[ComponentTypeHeader["Int16"] = 2] = "Int16";
17
+ ComponentTypeHeader[ComponentTypeHeader["Int32"] = 3] = "Int32";
18
+ ComponentTypeHeader[ComponentTypeHeader["Int64"] = 4] = "Int64";
19
+ ComponentTypeHeader[ComponentTypeHeader["Float"] = 5] = "Float";
20
+ ComponentTypeHeader[ComponentTypeHeader["Double"] = 6] = "Double";
21
+ ComponentTypeHeader[ComponentTypeHeader["Boolean"] = 7] = "Boolean";
22
+ ComponentTypeHeader[ComponentTypeHeader["ByteArray"] = 8] = "ByteArray";
23
+ })(ComponentTypeHeader || (ComponentTypeHeader = {}));
24
+ /**
25
+ * A Buffer reader is a special buffer extension made to perform
26
+ * game-specific tasks in the field of communication.
27
+ *
28
+ * @implements Buffer
29
+ */
30
+ export default class BufferReader {
31
+ /**
32
+ *
33
+ */
34
+ constructor(buffer) {
35
+ this.offset = 0;
36
+ this.buffer = buffer;
37
+ }
38
+ //
39
+ //
40
+ // Static Methods
41
+ //
42
+ //
43
+ /**
44
+ *
45
+ */
46
+ static from(from) {
47
+ if (from instanceof Buffer)
48
+ return new BufferReader(from);
49
+ return new BufferReader(Buffer.from(from));
50
+ }
51
+ /**
52
+ *
53
+ */
54
+ static alloc(amount) {
55
+ return BufferReader.from(Buffer.alloc(amount));
56
+ }
57
+ //
58
+ //
59
+ // Message Component Types
60
+ //
61
+ //
62
+ /**
63
+ * @param {string} value
64
+ * @returns {Buffer}
65
+ */
66
+ static String(value = '') {
67
+ const stringByteLen = Buffer.byteLength(value);
68
+ const lengthByteCount = this.length7BitInt(stringByteLen);
69
+ const buffer = BufferReader.alloc(1 + lengthByteCount + stringByteLen);
70
+ buffer.writeUInt8(ComponentTypeHeader.String);
71
+ buffer.write7BitInt(stringByteLen);
72
+ buffer.write(value);
73
+ return buffer.toBuffer();
74
+ }
75
+ /**
76
+ * @param {number} value
77
+ * @returns {Buffer}
78
+ */
79
+ static Byte(value = 0) {
80
+ const buffer = BufferReader.alloc(2);
81
+ buffer.writeUInt8(ComponentTypeHeader.Byte);
82
+ buffer.writeUInt8(value);
83
+ return buffer.toBuffer();
84
+ }
85
+ /**
86
+ * @param {number} value
87
+ * @returns {Buffer}
88
+ */
89
+ static Int16(value = 0) {
90
+ const buffer = BufferReader.alloc(3);
91
+ buffer.writeUInt8(ComponentTypeHeader.Int16);
92
+ buffer.writeUInt16LE(value);
93
+ return buffer.toBuffer();
94
+ }
95
+ /**
96
+ * @param {number} value
97
+ * @returns {Buffer}
98
+ */
99
+ static Int32(value = 0) {
100
+ const buffer = BufferReader.alloc(5);
101
+ buffer.writeUInt8(ComponentTypeHeader.Int32);
102
+ buffer.writeInt32LE(value);
103
+ return buffer.toBuffer();
104
+ }
105
+ /**
106
+ * @param {bigint} value
107
+ * @returns {Buffer}
108
+ */
109
+ static Int64(value = BigInt(0).valueOf()) {
110
+ const buffer = BufferReader.alloc(9);
111
+ buffer.writeUInt8(ComponentTypeHeader.Int64);
112
+ buffer.writeBigInt64LE(value);
113
+ return buffer.toBuffer();
114
+ }
115
+ /**
116
+ * @param {number} value
117
+ * @returns {Buffer}
118
+ */
119
+ static Float(value = 0) {
120
+ const buffer = BufferReader.alloc(5);
121
+ buffer.writeUInt8(ComponentTypeHeader.Float);
122
+ buffer.writeFloatBE(value);
123
+ return buffer.toBuffer();
124
+ }
125
+ /**
126
+ * @param {number} value
127
+ * @returns {Buffer}
128
+ */
129
+ static Double(value = 0) {
130
+ const buffer = BufferReader.alloc(9);
131
+ buffer.writeUInt8(ComponentTypeHeader.Double);
132
+ buffer.writeDoubleBE(value);
133
+ return buffer.toBuffer();
134
+ }
135
+ /**
136
+ * @param {boolean} value
137
+ * @returns {Buffer}
138
+ */
139
+ static Boolean(value = false) {
140
+ const buffer = BufferReader.alloc(2);
141
+ buffer.writeUInt8(ComponentTypeHeader.Boolean);
142
+ buffer.writeUInt8(value ? 1 : 0);
143
+ return buffer.toBuffer();
144
+ }
145
+ /**
146
+ * @param {Uint8Array} buffer
147
+ * @returns {Buffer}
148
+ */
149
+ static ByteArray(buffer = Buffer.from([0])) {
150
+ // const bufferByteLen = Buffer.byteLength(buffer);
151
+ // const bufLength = Buffer.alloc(length7BitInt(bufferByteLen));
152
+ // write7BitInt(bufLength, bufferByteLen, 0);
153
+ // return Buffer.concat([Buffer.from([8]), bufLength, buffer]);
154
+ const stringByteLen = Buffer.byteLength(buffer);
155
+ const lengthByteCount = this.length7BitInt(stringByteLen);
156
+ const prefix = BufferReader.alloc(1 + lengthByteCount);
157
+ prefix.writeUInt8(ComponentTypeHeader.String);
158
+ prefix.write7BitInt(lengthByteCount);
159
+ return Buffer.concat([prefix.toBuffer(), buffer]);
160
+ }
161
+ /**
162
+ * @param {number} value
163
+ * @returns {Buffer}
164
+ */
165
+ static Magic(value) {
166
+ if (value === undefined)
167
+ throw new Error('Received undefined magic byte');
168
+ return Buffer.from([value]);
169
+ }
170
+ /**
171
+ * @param {number} value
172
+ * @returns {Buffer}
173
+ */
174
+ static Bit7(value = 0) {
175
+ const buffer = BufferReader.alloc(this.length7BitInt(value));
176
+ buffer.write7BitInt(value);
177
+ return buffer.toBuffer();
178
+ }
179
+ /**
180
+ * @param tt
181
+ * @param value
182
+ */
183
+ static Dynamic(tt, value) {
184
+ switch (tt) {
185
+ case ComponentTypeHeader.String:
186
+ return this.String(value);
187
+ case ComponentTypeHeader.Byte:
188
+ return this.Byte(value);
189
+ case ComponentTypeHeader.Int16:
190
+ return this.Int16(value);
191
+ case ComponentTypeHeader.Int32:
192
+ return this.Int32(value);
193
+ case ComponentTypeHeader.Int64:
194
+ return this.Int64(value);
195
+ case ComponentTypeHeader.Float:
196
+ return this.Float(value);
197
+ case ComponentTypeHeader.Double:
198
+ return this.Double(value);
199
+ case ComponentTypeHeader.Boolean:
200
+ return this.Boolean(value);
201
+ case ComponentTypeHeader.ByteArray:
202
+ return this.ByteArray(value);
203
+ }
204
+ }
205
+ //
206
+ //
207
+ // Overrides
208
+ //
209
+ //
210
+ /**
211
+ *
212
+ */
213
+ get length() {
214
+ return this.buffer.length - this.offset;
215
+ }
216
+ /**
217
+ *
218
+ */
219
+ subarray(start = this.offset, end = this.length) {
220
+ return new BufferReader(this.buffer.subarray(start, this.offset + end));
221
+ }
222
+ /**
223
+ *
224
+ */
225
+ write(value) {
226
+ return (this.offset = this.buffer.write(value, this.offset));
227
+ }
228
+ /**
229
+ *
230
+ */
231
+ writeBigInt64BE(value) {
232
+ return (this.offset = this.buffer.writeBigInt64BE(value, this.offset));
233
+ }
234
+ /**
235
+ *
236
+ */
237
+ writeBigInt64LE(value) {
238
+ return (this.offset = this.buffer.writeBigInt64LE(value, this.offset));
239
+ }
240
+ /**
241
+ *
242
+ */
243
+ writeUInt8(value) {
244
+ return (this.offset = this.buffer.writeUInt8(value, this.offset));
245
+ }
246
+ /**
247
+ *
248
+ */
249
+ writeUInt16LE(value) {
250
+ return (this.offset = this.buffer.writeUInt16LE(value, this.offset));
251
+ }
252
+ /**
253
+ *
254
+ */
255
+ writeUInt16BE(value) {
256
+ return (this.offset = this.buffer.writeUInt16BE(value, this.offset));
257
+ }
258
+ /**
259
+ *
260
+ */
261
+ writeUInt32LE(value) {
262
+ return (this.offset = this.buffer.writeUInt32LE(value, this.offset));
263
+ }
264
+ /**
265
+ *
266
+ */
267
+ writeUInt32BE(value) {
268
+ return (this.offset = this.buffer.writeUInt32BE(value, this.offset));
269
+ }
270
+ /**
271
+ *
272
+ */
273
+ writeInt8(value) {
274
+ return (this.offset = this.buffer.writeInt8(value, this.offset));
275
+ }
276
+ /**
277
+ *
278
+ */
279
+ writeInt16LE(value) {
280
+ return (this.offset = this.buffer.writeInt16LE(value, this.offset));
281
+ }
282
+ /**
283
+ *
284
+ */
285
+ writeInt16BE(value) {
286
+ return (this.offset = this.buffer.writeInt16BE(value, this.offset));
287
+ }
288
+ /**
289
+ *
290
+ */
291
+ writeInt32LE(value) {
292
+ return (this.offset = this.buffer.writeInt32LE(value, this.offset));
293
+ }
294
+ /**
295
+ *
296
+ */
297
+ writeInt32BE(value) {
298
+ return (this.offset = this.buffer.writeInt32BE(value, this.offset));
299
+ }
300
+ /**
301
+ *
302
+ */
303
+ writeFloatLE(value) {
304
+ return (this.offset = this.buffer.writeFloatLE(value, this.offset));
305
+ }
306
+ /**
307
+ *
308
+ */
309
+ writeFloatBE(value) {
310
+ return (this.offset = this.buffer.writeFloatBE(value, this.offset));
311
+ }
312
+ /**
313
+ *
314
+ */
315
+ writeDoubleLE(value) {
316
+ return (this.offset = this.buffer.writeDoubleLE(value, this.offset));
317
+ }
318
+ /**
319
+ *
320
+ */
321
+ writeDoubleBE(value) {
322
+ return (this.offset = this.buffer.writeDoubleBE(value, this.offset));
323
+ }
324
+ /**
325
+ *
326
+ */
327
+ readBigUInt64BE() {
328
+ const tmp = this.buffer.readBigUInt64BE(this.offset);
329
+ this.offset += 8;
330
+ return tmp;
331
+ }
332
+ /**
333
+ *
334
+ */
335
+ readBigUInt64LE() {
336
+ const tmp = this.buffer.readBigUInt64LE(this.offset);
337
+ this.offset += 8;
338
+ return tmp;
339
+ }
340
+ /**
341
+ *
342
+ */
343
+ readBigInt64BE() {
344
+ const tmp = this.buffer.readBigInt64BE(this.offset);
345
+ this.offset += 8;
346
+ return tmp;
347
+ }
348
+ /**
349
+ *
350
+ */
351
+ readBigInt64LE() {
352
+ const tmp = this.buffer.readBigInt64LE(this.offset);
353
+ this.offset += 8;
354
+ return tmp;
355
+ }
356
+ // public readUIntLE() {
357
+ // const tmp = this.buffer.readUIntLE(this.offset);
358
+ // this.offset += 1;
359
+ // return tmp;
360
+ // }
361
+ // public readUIntBE() {
362
+ // const tmp = this.buffer.readUIntBE(this.offset);
363
+ // this.offset += 1;
364
+ // return tmp;
365
+ // }
366
+ // public readIntLE() {
367
+ // const tmp = this.buffer.readIntLE(this.offset);
368
+ // this.offset += 1;
369
+ // return tmp;
370
+ // }
371
+ // public readIntBE() {
372
+ // const tmp = this.buffer.readIntBE(this.offset);
373
+ // this.offset += 1;
374
+ // return tmp;
375
+ // }
376
+ /**
377
+ *
378
+ */
379
+ expectUInt8(value) {
380
+ const tmp = this.buffer.readUInt8(this.offset);
381
+ this.offset += 1;
382
+ if (tmp !== value)
383
+ throw new Error(`Expected ${value} but got ${tmp}`);
384
+ return tmp;
385
+ }
386
+ /**
387
+ *
388
+ */
389
+ readUInt8() {
390
+ const tmp = this.buffer.readUInt8(this.offset);
391
+ this.offset += 1;
392
+ return tmp;
393
+ }
394
+ /**
395
+ *
396
+ */
397
+ readUInt16LE() {
398
+ const tmp = this.buffer.readUInt16LE(this.offset);
399
+ this.offset += 2;
400
+ return tmp;
401
+ }
402
+ /**
403
+ *
404
+ */
405
+ readUInt16BE() {
406
+ const tmp = this.buffer.readUInt16BE(this.offset);
407
+ this.offset += 2;
408
+ return tmp;
409
+ }
410
+ /**
411
+ *
412
+ */
413
+ readUInt32LE() {
414
+ const tmp = this.buffer.readUInt32LE(this.offset);
415
+ this.offset += 4;
416
+ return tmp;
417
+ }
418
+ /**
419
+ *
420
+ */
421
+ readUInt32BE() {
422
+ const tmp = this.buffer.readUInt32BE(this.offset);
423
+ this.offset += 4;
424
+ return tmp;
425
+ }
426
+ /**
427
+ *
428
+ */
429
+ readInt8() {
430
+ const tmp = this.buffer.readInt8(this.offset);
431
+ this.offset += 1;
432
+ return tmp;
433
+ }
434
+ /**
435
+ *
436
+ */
437
+ readInt16LE() {
438
+ const tmp = this.buffer.readInt16LE(this.offset);
439
+ this.offset += 2;
440
+ return tmp;
441
+ }
442
+ /**
443
+ *
444
+ */
445
+ readInt16BE() {
446
+ const tmp = this.buffer.readInt16BE(this.offset);
447
+ this.offset += 2;
448
+ return tmp;
449
+ }
450
+ /**
451
+ *
452
+ */
453
+ readInt32LE() {
454
+ const tmp = this.buffer.readInt32LE(this.offset);
455
+ this.offset += 4;
456
+ return tmp;
457
+ }
458
+ /**
459
+ *
460
+ */
461
+ readInt32BE() {
462
+ const tmp = this.buffer.readInt32BE(this.offset);
463
+ this.offset += 4;
464
+ return tmp;
465
+ }
466
+ /**
467
+ *
468
+ */
469
+ readFloatLE() {
470
+ const tmp = this.buffer.readFloatLE(this.offset);
471
+ this.offset += 4;
472
+ return tmp;
473
+ }
474
+ /**
475
+ *
476
+ */
477
+ readFloatBE() {
478
+ const tmp = this.buffer.readFloatBE(this.offset);
479
+ this.offset += 4;
480
+ return tmp;
481
+ }
482
+ /**
483
+ *
484
+ */
485
+ readDoubleLE() {
486
+ const tmp = this.buffer.readDoubleLE(this.offset);
487
+ this.offset += 8;
488
+ return tmp;
489
+ }
490
+ /**
491
+ *
492
+ */
493
+ readDoubleBE() {
494
+ const tmp = this.buffer.readDoubleBE(this.offset);
495
+ this.offset += 8;
496
+ return tmp;
497
+ }
498
+ read(tt, little = true) {
499
+ switch (tt) {
500
+ case ComponentTypeHeader.String:
501
+ return this.readDynamicBuffer().toString("ascii");
502
+ case ComponentTypeHeader.Byte:
503
+ return this.readUInt8();
504
+ case ComponentTypeHeader.Int16:
505
+ return little ? this.readInt16LE() : this.readInt16BE();
506
+ case ComponentTypeHeader.Int32:
507
+ return little ? this.readInt32LE() : this.readInt32BE();
508
+ case ComponentTypeHeader.Int64:
509
+ return little ? this.readBigInt64LE() : this.readBigInt64BE();
510
+ case ComponentTypeHeader.Float:
511
+ return little ? this.readFloatLE() : this.readFloatBE();
512
+ case ComponentTypeHeader.Double:
513
+ return little ? this.readDoubleLE() : this.readDoubleBE();
514
+ case ComponentTypeHeader.Boolean:
515
+ return !!this.readUInt8();
516
+ case ComponentTypeHeader.ByteArray:
517
+ return this.readDynamicBuffer();
518
+ }
519
+ }
520
+ //
521
+ //
522
+ // Methods
523
+ //
524
+ //
525
+ /**
526
+ *
527
+ */
528
+ toBuffer() {
529
+ return this.buffer;
530
+ }
531
+ /**
532
+ * https://stackoverflow.com/questions/8609289/convert-a-binary-nodejs-buffer-to-javascript-arraybuffer
533
+ */
534
+ toArrayBuffer() {
535
+ const arrayBuffer = new ArrayBuffer(this.length);
536
+ const view = new Uint8Array(arrayBuffer);
537
+ for (let i = 0; i < this.length; ++i) {
538
+ view[i] = this.buffer[i];
539
+ }
540
+ return arrayBuffer;
541
+ }
542
+ /**
543
+ *
544
+ */
545
+ at(idx) {
546
+ return this.buffer[idx];
547
+ }
548
+ /**
549
+ * Advanced the buffer reader by pffset.
550
+ */
551
+ advanceOffset(relativeOffset = 1) {
552
+ this.offset += relativeOffset;
553
+ return this;
554
+ }
555
+ /**
556
+ * This function reads how many bytes a normal integer would take
557
+ * as a 7-bit number
558
+ *
559
+ * 1(000 0001) 0(111 1110)
560
+ */
561
+ static length7BitInt(value) {
562
+ let size = 0;
563
+ do
564
+ (value >>= 7), size++;
565
+ while (value > 0);
566
+ return size;
567
+ }
568
+ /**
569
+ * Reads in an integer in 7-bit notation. A 7-bit integer
570
+ * encoding splits a number into a variable size of bits,
571
+ * in which the first bit is set while bytes are following.
572
+ *
573
+ * @example
574
+ *
575
+ * ```
576
+ * 1111 0000 1010 1010 1000 0000 0000 0001 Reading In
577
+ * ^--- ---- ^--- ---- ^--- ---- ^--- ----
578
+ * 111 0000 010 1010 000 0000 000 0001 Writing Out
579
+ * ```
580
+ */
581
+ read7BitInt() {
582
+ let value = 0, shift = 0, byte = 0xff;
583
+ while (byte & 0x80) {
584
+ byte = this.readUInt8();
585
+ value |= (byte & 0x7f) << shift;
586
+ shift += 7;
587
+ }
588
+ return value;
589
+ }
590
+ /**
591
+ * Write a normal integer value into buffer at offset.
592
+ */
593
+ write7BitInt(value) {
594
+ while (value >= 128) {
595
+ this.writeUInt8((value & 127) | 128);
596
+ value >>= 7;
597
+ }
598
+ this.writeUInt8(value);
599
+ }
600
+ /**
601
+ * Reads a dynamic buffer which is prepended by its' length
602
+ * in 7-bit encoding.
603
+ */
604
+ readDynamicBuffer() {
605
+ const length = this.read7BitInt();
606
+ const value = this.subarray(this.offset, length);
607
+ this.offset += length;
608
+ return value.toBuffer();
609
+ }
610
+ /**
611
+ * Append a buffer to the current buffer. Asserts the cursor
612
+ * to be at the end of the current buffer.
613
+ */
614
+ append(buffer) {
615
+ if (this.offset !== this.length - 1)
616
+ throw new Error("Cursor hasn't finished reading yet.");
617
+ this.buffer = Buffer.concat([this.buffer, buffer]);
618
+ return this;
619
+ }
620
+ /**
621
+ * Keep Deserializing the buffer for typed data until
622
+ * you reach the end of the buffer. Typed data consists
623
+ * of a type indicator in 7-bit-encoding and data following
624
+ * accordingly.
625
+ */
626
+ deserialize() {
627
+ const arr = [];
628
+ while (this.offset < this.length) {
629
+ const type = this.read7BitInt();
630
+ switch (type) {
631
+ case ComponentTypeHeader.String:
632
+ arr.push(this.readDynamicBuffer().toString("ascii"));
633
+ break;
634
+ case ComponentTypeHeader.Byte:
635
+ arr.push(this.readUInt8());
636
+ break;
637
+ case ComponentTypeHeader.Int16: // = Int16 (short)
638
+ arr.push(this.readInt16BE());
639
+ break;
640
+ case ComponentTypeHeader.Int32: // = Int32
641
+ arr.push(this.readInt32BE());
642
+ break;
643
+ case ComponentTypeHeader.Int64:
644
+ arr.push(this.readBigInt64BE());
645
+ break;
646
+ case ComponentTypeHeader.Float:
647
+ arr.push(this.readFloatBE());
648
+ break;
649
+ case ComponentTypeHeader.Double:
650
+ arr.push(this.readDoubleBE());
651
+ break;
652
+ case ComponentTypeHeader.Boolean:
653
+ arr.push(!!this.readUInt8()); // !! is truthy
654
+ break;
655
+ case ComponentTypeHeader.ByteArray:
656
+ arr.push(this.readDynamicBuffer());
657
+ break;
658
+ default:
659
+ throw new Error(`While serializing a buffer for data, an unexpected type 0x${type.toString(16)} was read. Expected one of 0-8`);
660
+ }
661
+ }
662
+ return arr;
663
+ }
664
+ [Symbol.for("nodejs.util.inspect.custom")]() {
665
+ let s = '<BufferReader';
666
+ let copy = BufferReader.from(this.buffer);
667
+ copy.offset = this.offset;
668
+ for (let i = 0; i < 20 && this.offset + i < this.length - 1; i++) {
669
+ s += ' ' + copy.readUInt8().toString(16).padStart(2, '0');
670
+ }
671
+ return s + '>';
672
+ }
673
+ }
674
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQnVmZmVyUmVhZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vbGliL0J1ZmZlclJlYWRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7OztHQUlHO0FBRUg7Ozs7O0dBS0c7QUFDSCxNQUFNLENBQU4sSUFBWSxtQkFVWDtBQVZELFdBQVksbUJBQW1CO0lBQzNCLGlFQUFVLENBQUE7SUFDViw2REFBUSxDQUFBO0lBQ1IsK0RBQVMsQ0FBQTtJQUNULCtEQUFTLENBQUE7SUFDVCwrREFBUyxDQUFBO0lBQ1QsK0RBQVMsQ0FBQTtJQUNULGlFQUFVLENBQUE7SUFDVixtRUFBVyxDQUFBO0lBQ1gsdUVBQWEsQ0FBQTtBQUNqQixDQUFDLEVBVlcsbUJBQW1CLEtBQW5CLG1CQUFtQixRQVU5QjtBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxDQUFDLE9BQU8sT0FBTyxZQUFZO0lBSTdCOztPQUVHO0lBQ0gsWUFBb0IsTUFBYztRQUwxQixXQUFNLEdBQVcsQ0FBQyxDQUFDO1FBTXZCLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO0lBQ3pCLENBQUM7SUFFRCxFQUFFO0lBQ0YsRUFBRTtJQUNGLGlCQUFpQjtJQUNqQixFQUFFO0lBQ0YsRUFBRTtJQUVGOztPQUVHO0lBQ0ksTUFBTSxDQUFDLElBQUksQ0FBQyxJQUF5QjtRQUN4QyxJQUFJLElBQUksWUFBWSxNQUFNO1lBQUUsT0FBTyxJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMxRCxPQUFPLElBQUksWUFBWSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUMvQyxDQUFDO0lBRUQ7O09BRUc7SUFDSSxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQWM7UUFDOUIsT0FBTyxZQUFZLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUNuRCxDQUFDO0lBRUQsRUFBRTtJQUNGLEVBQUU7SUFD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