@datagrok-libraries/utils 0.0.3 → 0.0.7

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,666 @@
1
+ export default class BitArray {
2
+ constructor(arg, defaultValue = false) {
3
+ this._length = 0;
4
+ this._version = 0;
5
+ this._updateLevel = 0;
6
+ this._selectedCount = 0;
7
+ this._selectedCountVersion = -1;
8
+ this._selectedIndexesVersion = -1;
9
+ this._versionedName = '';
10
+ this._versionedNameVersion = -1;
11
+ this.SHRINK_THRESHOLD = 0x100;
12
+ if (typeof arg === 'number') {
13
+ const length = arg;
14
+ let buff = BitArray._createBuffer(length);
15
+ if (defaultValue)
16
+ for (let i = 0; i < buff.length; i++)
17
+ buff[i] = -1;
18
+ this._data = buff;
19
+ this._length = length;
20
+ }
21
+ else if (arg instanceof Uint32Array) {
22
+ this._data = arg;
23
+ this._length = defaultValue;
24
+ }
25
+ else {
26
+ throw new Error("Invalid constructor");
27
+ }
28
+ }
29
+ getRawData() { return this._data; }
30
+ assureGoez(num, argName) {
31
+ if (num < 0)
32
+ throw new Error(`${argName} should be greater than zero`);
33
+ }
34
+ assureInRange(value, min, max, argName) {
35
+ if ((value < min) || (value > max)) {
36
+ throw new Error(`Argument ${argName} (${value}) out of range (${min}, ${max})`);
37
+ }
38
+ }
39
+ copy(src, dst, count) {
40
+ for (let i = 0; i < count; i++) {
41
+ dst[i] = src[i];
42
+ }
43
+ }
44
+ copyFrom(other) {
45
+ if (this._length != other._length) {
46
+ throw new Error(`Lengths differ (${this._length} != ${other._length})`);
47
+ }
48
+ this.copy(other._data, this._data, this.lengthInInts);
49
+ this._version++;
50
+ }
51
+ get length() {
52
+ return this._length;
53
+ }
54
+ get buffer() {
55
+ return this._data;
56
+ }
57
+ set buffer(data) {
58
+ this._data = data;
59
+ this._version++;
60
+ }
61
+ get version() {
62
+ return this._version;
63
+ }
64
+ set version(value) {
65
+ this._version = value;
66
+ }
67
+ incrementVersion(notify = true) {
68
+ this._version++;
69
+ }
70
+ get lengthInInts() {
71
+ return Math.floor((this._length + 0x1f) / 0x20);
72
+ }
73
+ get versionedName() {
74
+ return this._version == this._versionedNameVersion ? this._versionedName : '';
75
+ }
76
+ set versionedName(name) {
77
+ this._versionedName = name;
78
+ this._versionedNameVersion = this._version;
79
+ }
80
+ get self() {
81
+ return this;
82
+ }
83
+ setLength(value) {
84
+ if (value < 0) {
85
+ throw new Error('should be >= 0');
86
+ }
87
+ if (value == this._length)
88
+ return;
89
+ const nIntsNeeded = Math.floor((value + 0x1f) / 0x20);
90
+ if ((nIntsNeeded > this._data.length) || ((nIntsNeeded + this.SHRINK_THRESHOLD) < this._data.length)) {
91
+ const newData = new Uint32Array(nIntsNeeded);
92
+ this.copy(this._data, newData, (nIntsNeeded > this._data.length) ? this._data.length : nIntsNeeded);
93
+ this._data = newData;
94
+ }
95
+ if (value > this._length) {
96
+ if (this._length % 0x20 > 0) {
97
+ this._data[this.lengthInInts - 1] &= (1 << ((this._length % 0x20) & 0x1f)) - 1;
98
+ }
99
+ this._data.fill(0, this.lengthInInts, nIntsNeeded);
100
+ }
101
+ this._length = value;
102
+ this._version++;
103
+ }
104
+ static fromAnd(set1, set2) {
105
+ if (set1._length != set2._length) {
106
+ throw new Error(`Lengths differ (${set1._length} != ${set2._length})`);
107
+ }
108
+ const temp = new BitArray(set1._length);
109
+ temp._length = set1._length;
110
+ temp._data = BitArray._createBuffer(temp._length);
111
+ temp._version = 0;
112
+ const len = set1.lengthInInts;
113
+ for (let i = 0; i < len; i++) {
114
+ temp._data[i] = set1._data[i] & set2._data[i];
115
+ }
116
+ return temp;
117
+ }
118
+ static _createBuffer(length) {
119
+ return new Uint32Array(Math.floor((length + 0x1f) / 0x20));
120
+ }
121
+ static fromValues(values) {
122
+ const temp = new BitArray(values.length);
123
+ temp._version = 0;
124
+ for (let i = 0; i < temp._length; i++) {
125
+ if (values[i]) {
126
+ temp._data[Math.floor(i / 0x20)] |= 1 << ((i % 0x20) & 0x1f);
127
+ }
128
+ }
129
+ return temp;
130
+ }
131
+ /// Constructs a [BitSet] of length [count], where idx-th bit is determined by a call to [flag] (idx).
132
+ static fromSeq(count, flag) {
133
+ const temp = new BitArray(count);
134
+ for (let i = 0; i < count; ++i) {
135
+ temp.setBit(i, flag(i));
136
+ }
137
+ temp._version = 0;
138
+ return temp;
139
+ }
140
+ /// Constructs a [BitSet] from a string [s] containing '0' or '1'.
141
+ static fromString(s) {
142
+ return BitArray.fromSeq(s.length, (i) => s.charAt(i) == '1');
143
+ }
144
+ /// Constructs a [BitSet], based on length [_length] and byte array [_data].
145
+ static fromUint32Array(_length, _data) {
146
+ const temp = new BitArray(_length);
147
+ temp._data = _data;
148
+ return temp;
149
+ }
150
+ /// Deserializes a [BitSet] from [bytes].
151
+ static fromBytes(bytes) {
152
+ const len = bytes.length;
153
+ const temp = new BitArray(len * 8);
154
+ temp._data = new Uint32Array(Math.floor((len + 3) / 4));
155
+ temp._length = len * 8;
156
+ let num1 = 0;
157
+ let num2 = 0;
158
+ while ((len - num2) >= 4) {
159
+ temp._data[num1++] = (((bytes[num2] & 0xff) |
160
+ ((bytes[num2 + 1] & 0xff) << 8)) |
161
+ ((bytes[num2 + 2] & 0xff) << 0x10)) |
162
+ ((bytes[num2 + 3] & 0xff) << 0x18);
163
+ num2 += 4;
164
+ }
165
+ if (len - num2 == 3) {
166
+ temp._data[num1] = (bytes[num2 + 2] & 0xff) << 0x10;
167
+ }
168
+ if (len - num2 == 2) {
169
+ temp._data[num1] |= (bytes[num2 + 1] & 0xff) << 8;
170
+ }
171
+ if (len - num2 == 1) {
172
+ temp._data[num1] |= bytes[num2] & 0xff;
173
+ }
174
+ temp._version = 0;
175
+ return temp;
176
+ }
177
+ toString() {
178
+ return `${this._length} bits, ${this.countBits(true)} set`;
179
+ }
180
+ /// Performs deep comparison of two bitsets.
181
+ equals(other) {
182
+ if (this == other)
183
+ return true;
184
+ if (other == null)
185
+ return false;
186
+ if (this._length != other._length)
187
+ return false;
188
+ if (this._length == 0)
189
+ return true;
190
+ for (let i = 0; i < this._data.length - 1; i++) {
191
+ if (this._data[i] != other._data[i])
192
+ return false;
193
+ }
194
+ for (let i = (this._data.length - 1) * 8; i < this._length; i++) {
195
+ if (this.getBit(i) != other.getBit(i)) {
196
+ return false;
197
+ }
198
+ }
199
+ return true;
200
+ }
201
+ /** Clones a bitset. */
202
+ clone() {
203
+ const bitArray = new BitArray(0, false);
204
+ bitArray._data = Uint32Array.from(this._data); // effective length: (lengthInInts)
205
+ bitArray._length = this._length;
206
+ bitArray._version = this._version;
207
+ return bitArray;
208
+ }
209
+ /** Initializes a bitset. */
210
+ init(flag, notify) {
211
+ this.setAll(false, false);
212
+ for (let i = 0; i < this._length; i++) {
213
+ if (flag(i)) {
214
+ this._data[Math.floor(i / 0x20)] |= 1 << ((i % 0x20) & 0x1f);
215
+ }
216
+ }
217
+ this.incrementVersion(notify);
218
+ return this;
219
+ }
220
+ /// Inverts a bitset.
221
+ invert(notify = true) {
222
+ for (let i = 0; i < this._data.length; i++) {
223
+ this._data[i] ^= -1;
224
+ }
225
+ this.incrementVersion(notify);
226
+ }
227
+ /// Sets all bits to [value], optionally suppressing notifications.
228
+ setAll(value, notify = false) {
229
+ const flags = value ? -1 : 0;
230
+ const len = this.lengthInInts;
231
+ for (let i = 0; i < len; i++) {
232
+ this._data[i] = flags;
233
+ } //todo: optimize
234
+ this.incrementVersion(notify);
235
+ }
236
+ /// Sets bits at [indexes] position to [value].
237
+ /// Clears the bitset if [clear] flag is true.
238
+ /// Change notification is raised when [notify] is true.
239
+ setIndexes(indexes, value = true, clear = true, notify = true) {
240
+ if (clear) {
241
+ this.setAll(!value, false);
242
+ }
243
+ for (const i of indexes) {
244
+ this.setFast(i, value);
245
+ }
246
+ this.incrementVersion(notify);
247
+ }
248
+ everyIndex(indexes, value = true) {
249
+ for (const index of indexes) {
250
+ if (this.getBit(index) != value) {
251
+ return false;
252
+ }
253
+ }
254
+ return true;
255
+ }
256
+ anyIndex(indexes, value = true) {
257
+ for (const index of indexes) {
258
+ if (this.getBit(index) == value) {
259
+ return true;
260
+ }
261
+ }
262
+ return false;
263
+ }
264
+ setWhere(check, value = true, clear = true, notify = true, allowClear = true) {
265
+ if (clear && allowClear) {
266
+ this.setAll(!value, false);
267
+ }
268
+ if (allowClear) {
269
+ for (let i = 0; i < this._length; i++) {
270
+ if (check(i)) {
271
+ this.setFast(i, value);
272
+ }
273
+ }
274
+ }
275
+ else {
276
+ for (let i = 0; i < this._length; i++) {
277
+ this.setFast(i, check(i) ? value : !value);
278
+ }
279
+ }
280
+ this.incrementVersion(notify);
281
+ }
282
+ setRange(from, to, value, notify = true) {
283
+ this.assureInRange(from, 0, this._length - 1, 'from');
284
+ this.assureInRange(to, 0, this._length - 1, 'to');
285
+ const start = Math.min(from, to);
286
+ const end = Math.max(from, to);
287
+ //todo: optimize
288
+ if (value) {
289
+ for (let i = start; i <= end; i++) {
290
+ this.setTrue(i);
291
+ }
292
+ }
293
+ else {
294
+ for (let i = start; i <= end; i++) {
295
+ this.setFalse(i);
296
+ }
297
+ }
298
+ this.incrementVersion(notify);
299
+ return this;
300
+ }
301
+ /// Sets n randomly chosen bits to value, remaining bits to !value.
302
+ setRandom(n, value, notify = true) {
303
+ if (n < 0 || n > this._length) {
304
+ throw new Error('n must be >= 0 && <= Count');
305
+ }
306
+ if (n > this._length / 2) {
307
+ this.setRandom(this._length - n, !value);
308
+ }
309
+ this.setAll(!value);
310
+ for (let k = 0; k < n;) {
311
+ const i = Math.floor(Math.random() * this._length);
312
+ if (this.getBit(i) == value)
313
+ continue;
314
+ this.setFast(i, value);
315
+ k++;
316
+ }
317
+ this.incrementVersion(notify);
318
+ }
319
+ /// Modifies current bitset by performing the bitwise AND operation against the
320
+ /// corresponding elements in the specified bitset.
321
+ and(value, notify = true) {
322
+ if (this._length != value._length) {
323
+ throw new Error('Array lengths differ.');
324
+ }
325
+ for (let i = 0, len = this.lengthInInts; i < len; i++) {
326
+ this._data[i] &= value._data[i];
327
+ }
328
+ this.incrementVersion(notify);
329
+ return this;
330
+ }
331
+ /// Performs the bitwise AND NOT operation on the elements in the current bitset
332
+ /// against the corresponding elements in the specified bitset.
333
+ andNot(value, notify = true) {
334
+ if (this._length != value._length) {
335
+ throw new Error('Array lengths differ.');
336
+ }
337
+ const len = this.lengthInInts;
338
+ for (let num2 = 0; num2 < len; num2++) {
339
+ this._data[num2] &= ~value._data[num2];
340
+ }
341
+ this.incrementVersion(notify);
342
+ return this;
343
+ }
344
+ /// Performs the bitwise NOT AND operation on the elements in the current bitset
345
+ /// against the corresponding elements in the specified bitset.
346
+ notAnd(value, notify = true) {
347
+ if (this._length != value._length) {
348
+ throw new Error('Array lengths differ.');
349
+ }
350
+ for (let i = 0, len = this.lengthInInts; i < len; i++) {
351
+ this._data[i] = (~this._data[i]) & value._data[i];
352
+ }
353
+ this.incrementVersion(notify);
354
+ return this;
355
+ }
356
+ /// Inverts all bit values in the current bitset
357
+ not(notify = true) {
358
+ for (let i = 0, len = this.lengthInInts; i < len; i++) {
359
+ this._data[i] = ~this._data[i];
360
+ }
361
+ this.incrementVersion(notify);
362
+ return this;
363
+ }
364
+ /// Performs the bitwise OR operation on the elements in the current bitset
365
+ /// against the corresponding elements in the specified bitset.
366
+ or(value, notify = true) {
367
+ if (this._length != value._length) {
368
+ throw new Error('Array lengths differ.');
369
+ }
370
+ for (let i = 0, len = this.lengthInInts; i < len; i++) {
371
+ this._data[i] |= value._data[i];
372
+ }
373
+ this.incrementVersion(notify);
374
+ return this;
375
+ }
376
+ /// Performs the bitwise exclusive OR operation on the elements in the current bitset
377
+ /// against the corresponding elements in the specified bitset.
378
+ xor(value, notify = true) {
379
+ if (this._length != value._length) {
380
+ throw new Error('Array lengths differ.');
381
+ }
382
+ for (let i = 0, len = this.lengthInInts; i < len; i++) {
383
+ this._data[i] ^= value._data[i];
384
+ }
385
+ this.incrementVersion(notify);
386
+ return this;
387
+ }
388
+ /// Inserts n 0-bits at position pos, resizing self and shifting bits appropriately.
389
+ insertAt(pos, n, flag = false) {
390
+ this.assureInRange(pos, 0, this._length, 'pos');
391
+ if (n == 0)
392
+ return;
393
+ //TODO: optimize
394
+ //the most primitive implementation, optimize it later!
395
+ // beginUpdate();
396
+ const oldlength = this._length;
397
+ this.setLength(this._length + n);
398
+ //if (!contains(!flag)) return; // nothing to do
399
+ for (let i = oldlength - 1; i >= pos; i--) {
400
+ this.setBit(i + n, this.getBit(i));
401
+ }
402
+ for (let i = pos; i < pos + n; i++) {
403
+ this.setBit(i, flag);
404
+ }
405
+ // endUpdate();
406
+ }
407
+ /// Deletes n bits beginning at position pos, resizing self and shifting remaining
408
+ /// bits appropriately.
409
+ removeAt(pos, n = 1) {
410
+ // the most primitive implementation, optimize it later!
411
+ if (n < 0) {
412
+ throw new Error('n cannot be negative');
413
+ }
414
+ this.assureInRange(pos, 0, this._length - n, 'pos');
415
+ if (this.contains(true)) {
416
+ for (let i = pos; i < this._length - n; i++) {
417
+ this.setBit(i, this.getBit(i + n));
418
+ }
419
+ }
420
+ this.setLength(this._length - n);
421
+ }
422
+ removeByMask(mask, flag = true) {
423
+ if (this._length != mask.length) {
424
+ throw new Error('length != mask.length');
425
+ }
426
+ if (mask == this) { // no need to iterate
427
+ this.setLength(mask.countBits(!flag));
428
+ this.setAll(!flag);
429
+ }
430
+ else {
431
+ let dstIdx = 0;
432
+ for (let srcIdx = -1; (srcIdx = mask.findNext(srcIdx, !flag)) != -1;) {
433
+ this.setFast(dstIdx++, this.getBit(srcIdx));
434
+ }
435
+ this._length = dstIdx;
436
+ this._version++;
437
+ }
438
+ return this;
439
+ }
440
+ /// Similar to the [] operator.
441
+ getBit(pos) {
442
+ return (this._data[Math.floor(pos / 0x20)] & (1 << (pos & 0x1f))) != 0;
443
+ }
444
+ /// Similar to the [] operator.
445
+ setBit(pos, bit, notify = true) {
446
+ this.setFast(pos, bit);
447
+ if (notify) {
448
+ this._version++;
449
+ }
450
+ else {
451
+ this._version++;
452
+ }
453
+ }
454
+ /// Sets [i]-th bit to [value], does not check bounds, does not increment version
455
+ setFast(i, value) {
456
+ if (value) {
457
+ this._data[Math.floor(i / 0x20)] |= 1 << (i & 0x1f);
458
+ }
459
+ else {
460
+ this._data[Math.floor(i / 0x20)] &= ~(1 << (i & 0x1f));
461
+ }
462
+ }
463
+ setTrue(pos) {
464
+ this._data[Math.floor(pos / 0x20)] |= 1 << (pos & 0x1f);
465
+ }
466
+ setFalse(pos) {
467
+ this._data[Math.floor(pos / 0x20)] &= ~(1 << (pos & 0x1f));
468
+ }
469
+ trueCount() {
470
+ return this.countBits(true);
471
+ }
472
+ falseCount() {
473
+ return this.countBits(false);
474
+ }
475
+ /// Counts bits of the specified value.
476
+ countBits(value) {
477
+ if (this._length == 0)
478
+ return 0;
479
+ if (this._selectedCountVersion != this._version) {
480
+ this._selectedCount = 0;
481
+ const len = this.lengthInInts;
482
+ let i = 0;
483
+ for (; i < len - 1; i++) {
484
+ for (let k = this._data[i]; k != 0; k >>>= 8) { //todo: cast data[i] to uint
485
+ this._selectedCount += BitArray._onBitCount[k & 0xff];
486
+ }
487
+ }
488
+ // The last int.
489
+ let k = this._data[i];
490
+ const remainingBits = this._length & 0x1f;
491
+ if (remainingBits != 0) { // if remainingBits == 0, the last int is fully used and ALL bits should be left as is.
492
+ k &= ~((4294967295) << remainingBits);
493
+ }
494
+ for (; k != 0; k >>>= 8) {
495
+ this._selectedCount += BitArray._onBitCount[k & 0xff];
496
+ }
497
+ this._selectedCountVersion = this._version;
498
+ }
499
+ return (value ? this._selectedCount : this._length - this._selectedCount);
500
+ }
501
+ /// Returns a number of set bits where also [check] is true
502
+ countWhere(check) {
503
+ let result = 0;
504
+ if (this.trueCount() == this._length) {
505
+ for (let i = 0; i < this._length; i++) {
506
+ result += check(i) ? 1 : 0;
507
+ }
508
+ }
509
+ else {
510
+ for (let i = -1; (i = this.findNext(i, true)) != -1;) {
511
+ result += check(i) ? 1 : 0;
512
+ }
513
+ }
514
+ return result;
515
+ }
516
+ /// Performs bit "and" and counts bits of the specified value, without bitset modification.
517
+ andWithCountBits(second, value) {
518
+ if (this._length == 0)
519
+ return 0;
520
+ let count = 0;
521
+ const len = this.lengthInInts;
522
+ let i = 0;
523
+ for (; i < len - 1; i++) {
524
+ for (var k = this._data[i] & second._data[i]; k != 0; k >>>= 8) {
525
+ count += BitArray._onBitCount[k & 0xff];
526
+ }
527
+ }
528
+ // The last int.
529
+ var k = this._data[i] & second._data[i];
530
+ const remainingBits = this._length & 0x1f;
531
+ if (remainingBits != 0) {
532
+ k &= ~((4294967295) << remainingBits);
533
+ }
534
+ for (; k != 0; k >>>= 8) {
535
+ count += BitArray._onBitCount[k & 0xff];
536
+ }
537
+ return (value ? count : this._length - count);
538
+ }
539
+ clear() {
540
+ this.setLength(0);
541
+ }
542
+ contains(value) {
543
+ return this.findNext(-1, value) >= 0;
544
+ }
545
+ get allTrue() {
546
+ return this.countBits(true) == this._length;
547
+ }
548
+ get allFalse() {
549
+ return this.countBits(false) == this._length;
550
+ }
551
+ get anyTrue() {
552
+ return this.countBits(true) > 0;
553
+ }
554
+ get anyFalse() {
555
+ return this.countBits(false) > 0;
556
+ }
557
+ /// Returns the position of the next bit of the specified value, starting from the specified position.
558
+ /// Returns -1, if there are no such bits.
559
+ findNext(index, value = true) {
560
+ this.assureInRange(index, -1, this._length, 'index');
561
+ if (index >= this._length - 1)
562
+ return -1;
563
+ index = index < 0 ? 0 : index + 1; // skip start
564
+ let unusedBits = index & 0x1f;
565
+ const numInts = this.lengthInInts;
566
+ for (let i = Math.floor(index / 32); i < numInts; i++) {
567
+ let k = (value ? this._data[i] : ~this._data[i]); // uint cast
568
+ if (unusedBits != 0) {
569
+ k &= ((0xffffffff << unusedBits) & 0xffffffff);
570
+ unusedBits = 0;
571
+ }
572
+ else if (!value && k == -4294967296) // looking for false, all bits are set
573
+ {
574
+ continue;
575
+ }
576
+ for (let j = 0; k != 0; j += 8, k >>>= 8) {
577
+ const p = BitArray._firstOnBit[k & 0xff];
578
+ if (p >= 0) {
579
+ index = p + (i * 32) + j;
580
+ if (index >= this._length)
581
+ return -1;
582
+ return index;
583
+ }
584
+ }
585
+ }
586
+ return -1;
587
+ }
588
+ /// Finds previous bit of the specified value in the bitset.
589
+ findPrev(index, value = true) {
590
+ if (index == 0)
591
+ return -1;
592
+ this.assureInRange(index, -1, this._length, 'index');
593
+ index = index < 0 ? this._length - 1 : index - 1; // skip start
594
+ const lastIntIdx = Math.floor(index / 0x20);
595
+ let remainingBits = (index + 1) & 0x1f;
596
+ for (let i = lastIntIdx; i >= 0; i--) {
597
+ let k = (value ? this._data[i] : ~this._data[i]); // cast
598
+ if (remainingBits != 0) {
599
+ k &= ~((4294967295) << remainingBits);
600
+ remainingBits = 0;
601
+ }
602
+ for (let j = 24; k != 0; j -= 8, k <<= 8) {
603
+ const p = BitArray._lastOnBit[k >>> 0x18];
604
+ if (p >= 0) {
605
+ return p + (i * 32) + j;
606
+ }
607
+ }
608
+ }
609
+ return -1;
610
+ }
611
+ }
612
+ BitArray._onBitCount = Int8Array.from([
613
+ 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4,
614
+ 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
615
+ 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
616
+ 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
617
+ 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
618
+ 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
619
+ 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
620
+ 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
621
+ 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
622
+ 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
623
+ 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
624
+ 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
625
+ 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
626
+ 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
627
+ 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
628
+ 4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8
629
+ ]);
630
+ BitArray._firstOnBit = Int8Array.from([
631
+ -1, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
632
+ 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
633
+ 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
634
+ 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
635
+ 6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
636
+ 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
637
+ 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
638
+ 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
639
+ 7, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
640
+ 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
641
+ 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
642
+ 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
643
+ 6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
644
+ 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
645
+ 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
646
+ 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0
647
+ ]);
648
+ BitArray._lastOnBit = Int8Array.from([
649
+ -1, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3,
650
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
651
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
652
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
653
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
654
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
655
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
656
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
657
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
658
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
659
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
660
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
661
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
662
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
663
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
664
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7
665
+ ]);
666
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYml0LWFycmF5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiYml0LWFycmF5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sQ0FBQyxPQUFPLE9BQU8sUUFBUTtJQW9FM0IsWUFBWSxHQUF5QixFQUFFLGVBQWlDLEtBQUs7UUFackUsWUFBTyxHQUFHLENBQUMsQ0FBQztRQUNaLGFBQVEsR0FBRyxDQUFDLENBQUM7UUFDYixpQkFBWSxHQUFHLENBQUMsQ0FBQztRQUNqQixtQkFBYyxHQUFHLENBQUMsQ0FBQztRQUNuQiwwQkFBcUIsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUMzQiw0QkFBdUIsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUM3QixtQkFBYyxHQUFHLEVBQUUsQ0FBQztRQUNwQiwwQkFBcUIsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNuQyxxQkFBZ0IsR0FBRyxLQUFLLENBQUM7UUFLdkIsSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRLEVBQUU7WUFDM0IsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDO1lBQ25CLElBQUksSUFBSSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDMUMsSUFBSSxZQUFZO2dCQUNkLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRTtvQkFDbEMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ2pCLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO1lBQ2xCLElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDO1NBQ3ZCO2FBQU0sSUFBSSxHQUFHLFlBQVksV0FBVyxFQUFFO1lBQ3JDLElBQUksQ0FBQyxLQUFLLEdBQUcsR0FBa0IsQ0FBQztZQUNoQyxJQUFJLENBQUMsT0FBTyxHQUFHLFlBQXNCLENBQUM7U0FDdkM7YUFBTTtZQUNMLE1BQU0sSUFBSSxLQUFLLENB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QUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQUMsQ0FBQyxDQUFDO0FBRTVDLG9CQUFXLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQztJQUNsQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDL0MsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FBQyxDQUFDLENBQUM7QUFFNUMsbUJBQVUsR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDO0lBQ2pDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUMvQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBkZWZhdWx0IGNsYXNzIEJpdEFycmF5IHtcclxuICBzdGF0aWMgX29uQml0Q291bnQgPSBJbnQ4QXJyYXkuZnJvbShbXHJcbiAgICAwLCAxLCAxLCAyLCAxLCAyLCAyLCAzLCAxLCAyLCAyLCAzLCAyLCAzLCAzLCA0LFxyXG4gICAgMSwgMiwgMiwgMywgMiwgMywgMywgNCwgMiwgMywgMywgNCwgMywgNCwgNCwgNSxcclxuICAgIDEsIDIsIDIsIDMsIDIsIDMsIDMsIDQsIDIsIDMsIDMsIDQsIDMsIDQsIDQsIDUsXHJcbiAgICAyLCAzLCAzLCA0LCAzLCA0LCA0LCA1LCAzLCA0LCA0LCA1LCA0LCA1LCA1LCA2LFxyXG4gICAgMSwgMiwgMiwgMywgMiwgMywgMywgNCwgMiwgMywgMywgNCwgMywgNCwgNCwgNSxcclxuICAgIDIsIDMsIDMsIDQsIDMsIDQsIDQsIDUsIDMsIDQsIDQsIDUsIDQsIDUsIDUsIDYsXHJcbiAgICAyLCAzLCAzLCA0LCAzLCA0LCA0LCA1LCAzLCA0LCA0LCA1LCA0LCA1LCA1LCA2LFxyXG4gICAgMywgNCwgNCwgNSwgNCwgNSwgNSwgNiwgNCwgNSwgNSwgNiwgNSwgNiwgNiwgNyxcclxuICAgIDEsIDIsIDIsIDMsIDIsIDMsIDMsIDQsIDIsIDMsIDMsIDQsIDMsIDQsIDQsIDUsXHJcbiAgICAyLCAzLCAzLCA0LCAzLCA0LCA0LCA1LCAzLCA0LCA0LCA1LCA0LCA1LCA1LCA2LFxyXG4gICAgMiwgMywgMywgNCwgMywgNCwgNCwgNSwgMywgNCwgNCwgNSwgNCwgNSwgNSwgNixcclxuICAgIDMsIDQsIDQsIDUsIDQsIDUsIDUsIDYsIDQsIDUsIDUsIDYsIDUsIDYsIDYsIDcsXHJcbiAgICAyLCAzLCAzLCA0LCAzLCA0LCA0LCA1LCAzLCA0LCA0LCA1LCA0LCA1LCA1LCA2LFxyXG4gICAgMywgNCwgNCwgNSwgNCwgNSwgNSwgNiwgNCwgNSwgNSwgNiwgNSwgNiwgNiwgNyxcclxuICAgIDMsIDQsIDQsIDUsIDQsIDUsIDUsIDYsIDQsIDUsIDUsIDYsIDUsIDYsIDYsIDcsXHJcbiAgICA0LCA1LCA1LCA2LCA1LCA2LCA2LCA3LCA1LCA2LCA2LCA3LCA2LCA3LCA3LCA4XSk7XHJcblxyXG4gIHN0YXRpYyBfZmlyc3RPbkJpdCA9IEludDhBcnJheS5mcm9tKFtcclxuICAgIC0xLCAwLCAxLCAwLCAyLCAwLCAxLCAwLCAzLCAwLCAxLCAwLCAyLCAwLCAxLCAwLFxyXG4gICAgNCwgMCwgMSwgMCwgMiwgMCwgMSwgMCwgMywgMCwgMSwgMCwgMiwgMCwgMSwgMCxcclxuICAgIDUsIDAsIDEsIDAsIDIsIDAsIDEsIDAsIDMsIDAsIDEsIDAsIDIsIDAsIDEsIDAsXHJcbiAgICA0LCAwLCAxLCAwLCAyLCAwLCAxLCAwLCAzLCAwLCAxLCAwLCAyLCAwLCAxLCAwLFxyXG4gICAgNiwgMCwgMSwgMCwgMiwgMCwgMSwgMCwgMywgMCwgMSwgMCwgMiwgMCwgMSwgMCxcclxuICAgIDQsIDAsIDEsIDAsIDIsIDAsIDEsIDAsIDMsIDAsIDEsIDAsIDIsIDAsIDEsIDAsXHJcbiAgICA1LCAwLCAxLCAwLCAyLCAwLCAxLCAwLCAzLCAwLCAxLCAwLCAyLCAwLCAxLCAwLFxyXG4gICAgNCwgMCwgMSwgMCwgMiwgMCwgMSwgMCwgMywgMCwgMSwgMCwgMiwgMCwgMSwgMCxcclxuICAgIDcsIDAsIDEsIDAsIDIsIDAsIDEsIDAsIDMsIDAsIDEsIDAsIDIsIDAsIDEsIDAsXHJcbiAgICA0LCAwLCAxLCAwLCAyLCAwLCAxLCAwLCAzLCAwLCAxLCAwLCAyLCAwLCAxLCAwLFxyXG4gICAgNSwgMCwgMSwgMCwgMiwgMCwgMSwgMCwgMywgMCwgMSwgMCwgMiwgMCwgMSwgMCxcclxuICAgIDQsIDAsIDEsIDAsIDIsIDAsIDEsIDAsIDMsIDAsIDEsIDAsIDIsIDAsIDEsIDAsXHJcbiAgICA2LCAwLCAxLCAwLCAyLCAwLCAxLCAwLCAzLCAwLCAxLCAwLCAyLCAwLCAxLCAwLFxyXG4gICAgNCwgMCwgMSwgMCwgMiwgMCwgMSwgMCwgMywgMCwgMSwgMCwgMiwgMCwgMSwgMCxcclxuICAgIDUsIDAsIDEsIDAsIDIsIDAsIDEsIDAsIDMsIDAsIDEsIDAsIDIsIDAsIDEsIDAsXHJcbiAgICA0LCAwLCAxLCAwLCAyLCAwLCAxLCAwLCAzLCAwLCAxLCAwLCAyLCAwLCAxLCAwXSk7XHJcblxyXG4gIHN0YXRpYyBfbGFzdE9uQml0ID0gSW50OEFycmF5LmZyb20oW1xyXG4gICAgLTEsIDAsIDEsIDEsIDIsIDIsIDIsIDIsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsXHJcbiAgICA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LFxyXG4gICAgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSxcclxuICAgIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsXHJcbiAgICA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LFxyXG4gICAgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNixcclxuICAgIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsXHJcbiAgICA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LFxyXG4gICAgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNyxcclxuICAgIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsXHJcbiAgICA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LFxyXG4gICAgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNyxcclxuICAgIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsXHJcbiAgICA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LFxyXG4gICAgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNyxcclxuICAgIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDddKTtcclxuXHJcbiAgcHJpdmF0ZSBfZGF0YTogVWludDMyQXJyYXk7XHJcbiAgcHJpdmF0ZSBfbGVuZ3RoID0gMDtcclxuICBwcml2YXRlIF92ZXJzaW9uID0gMDtcclxuICBwcml2YXRlIF91cGRhdGVMZXZlbCA9IDA7XHJcbiAgcHJpdmF0ZSBfc2VsZWN0ZWRDb3VudCA9IDA7XHJcbiAgcHJpdmF0ZSBfc2VsZWN0ZWRDb3VudFZlcnNpb24gPSAtMTtcclxuICBwcml2YXRlIF9zZWxlY3RlZEluZGV4ZXNWZXJzaW9uID0gLTE7XHJcbiAgcHJpdmF0ZSBfdmVyc2lvbmVkTmFtZSA9ICcnO1xyXG4gIHByaXZhdGUgX3ZlcnNpb25lZE5hbWVWZXJzaW9uID0gLTE7XHJcbiAgU0hSSU5LX1RIUkVTSE9MRCA9IDB4MTAwO1xyXG5cclxuICBjb25zdHJ1Y3RvcihkYXRhOiBVaW50MzJBcnJheSwgbGVuZ3RoOiBudW1iZXIpXHJcbiAgY29uc3RydWN0b3IobGVuZ3RoOiBudW1iZXIsIGRlZmF1bHRWYWx1ZT86IGJvb2xlYW4pXHJcbiAgY29uc3RydWN0b3IoYXJnOiBudW1iZXIgfCBVaW50MzJBcnJheSwgZGVmYXVsdFZhbHVlOiBib29sZWFuIHwgbnVtYmVyID0gZmFsc2UpIHtcclxuICAgIGlmICh0eXBlb2YgYXJnID09PSAnbnVtYmVyJykge1xyXG4gICAgICBjb25zdCBsZW5ndGggPSBhcmc7XHJcbiAgICAgIGxldCBidWZmID0gQml0QXJyYXkuX2NyZWF0ZUJ1ZmZlcihsZW5ndGgpO1xyXG4gICAgICBpZiAoZGVmYXVsdFZhbHVlKVxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYnVmZi5sZW5ndGg7IGkrKylcclxuICAgICAgICAgIGJ1ZmZbaV0gPSAtMTtcclxuICAgICAgdGhpcy5fZGF0YSA9IGJ1ZmY7XHJcbiAgICAgIHRoaXMuX2xlbmd0aCA9IGxlbmd0aDtcclxuICAgIH0gZWxzZSBpZiAoYXJnIGluc3RhbmNlb2YgVWludDMyQXJyYXkpIHtcclxuICAgICAgdGhpcy5fZGF0YSA9IGFyZyBhcyBVaW50MzJBcnJheTtcclxuICAgICAgdGhpcy5fbGVuZ3RoID0gZGVmYXVsdFZhbHVlIGFzIG51bWJlcjtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgY29uc3RydWN0b3JcIik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgZ2V0UmF3RGF0YSgpIHsgcmV0dXJuIHRoaXMuX2RhdGE7IH1cclxuXHJcbiAgYXNzdXJlR29leihudW06IG51bWJlciwgYXJnTmFtZTogU3RyaW5nKTogdm9pZCB7XHJcbiAgICBpZiAobnVtIDwgMCkgdGhyb3cgbmV3IEVycm9yKGAke2FyZ05hbWV9IHNob3VsZCBiZSBncmVhdGVyIHRoYW4gemVyb2ApO1xyXG4gIH1cclxuXHJcbiAgYXNzdXJlSW5SYW5nZSh2YWx1ZTogbnVtYmVyLCBtaW46IG51bWJlciwgbWF4OiBudW1iZXIsIGFyZ05hbWU6IFN0cmluZyk6IHZvaWQge1xyXG4gICAgaWYgKCh2YWx1ZSA8IG1pbikgfHwgKHZhbHVlID4gbWF4KSkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEFyZ3VtZW50ICR7YXJnTmFtZX0gKCR7dmFsdWV9KSBvdXQgb2YgcmFuZ2UgKCR7bWlufSwgJHttYXh9KWApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY29weShzcmM6IFVpbnQzMkFycmF5LCBkc3Q6IFVpbnQzMkFycmF5LCBjb3VudDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcclxuICAgICAgZHN0W2ldID0gc3JjW2ldO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY29weUZyb20ob3RoZXI6IEJpdEFycmF5KTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5fbGVuZ3RoICE9IG90aGVyLl9sZW5ndGgpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBMZW5ndGhzIGRpZmZlciAoJHt0aGlzLl9sZW5ndGh9ICE9ICR7b3RoZXIuX2xlbmd0aH0pYCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmNvcHkob3RoZXIuX2RhdGEsIHRoaXMuX2RhdGEsIHRoaXMubGVuZ3RoSW5JbnRzKTtcclxuICAgIHRoaXMuX3ZlcnNpb24rKztcclxuICB9XHJcblxyXG4gIGdldCBsZW5ndGgoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fbGVuZ3RoO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGJ1ZmZlcigpIHtcclxuICAgIHJldHVybiB0aGlzLl9kYXRhO1xyXG4gIH1cclxuXHJcbiAgc2V0IGJ1ZmZlcihkYXRhOiBVaW50MzJBcnJheSkge1xyXG4gICAgdGhpcy5fZGF0YSA9IGRhdGE7XHJcbiAgICB0aGlzLl92ZXJzaW9uKys7XHJcbiAgfVxyXG5cclxuICBnZXQgdmVyc2lvbigpIHtcclxuICAgIHJldHVybiB0aGlzLl92ZXJzaW9uO1xyXG4gIH1cclxuXHJcbiAgc2V0IHZlcnNpb24odmFsdWU6IG51bWJlcikge1xyXG4gICAgdGhpcy5fdmVyc2lvbiA9IHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgaW5jcmVtZW50VmVyc2lvbihub3RpZnkgPSB0cnVlKTogdm9pZCB7XHJcbiAgICB0aGlzLl92ZXJzaW9uKys7XHJcbiAgfVxyXG5cclxuICBnZXQgbGVuZ3RoSW5JbnRzKCkge1xyXG4gICAgcmV0dXJuIE1hdGguZmxvb3IoKHRoaXMuX2xlbmd0aCArIDB4MWYpIC8gMHgyMCk7XHJcbiAgfVxyXG5cclxuICBnZXQgdmVyc2lvbmVkTmFtZSgpIHtcclxuICAgIHJldHVybiB0aGlzLl92ZXJzaW9uID09IHRoaXMuX3ZlcnNpb25lZE5hbWVWZXJzaW9uID8gdGhpcy5fdmVyc2lvbmVkTmFtZSA6ICcnO1xyXG4gIH1cclxuXHJcbiAgc2V0IHZlcnNpb25lZE5hbWUobmFtZTogc3RyaW5nKSB7XHJcbiAgICB0aGlzLl92ZXJzaW9uZWROYW1lID0gbmFtZTtcclxuICAgIHRoaXMuX3ZlcnNpb25lZE5hbWVWZXJzaW9uID0gdGhpcy5fdmVyc2lvbjtcclxuICB9XHJcblxyXG4gIGdldCBzZWxmKCkge1xyXG4gICAgcmV0dXJuIHRoaXM7XHJcbiAgfVxyXG5cclxuICBzZXRMZW5ndGgodmFsdWU6IG51bWJlcik6IHZvaWQge1xyXG4gICAgaWYgKHZhbHVlIDwgMCkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Nob3VsZCBiZSA+PSAwJyk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHZhbHVlID09IHRoaXMuX2xlbmd0aCkgcmV0dXJuO1xyXG4gICAgY29uc3QgbkludHNOZWVkZWQgPSBNYXRoLmZsb29yKCh2YWx1ZSArIDB4MWYpIC8gMHgyMCk7XHJcbiAgICBpZiAoKG5JbnRzTmVlZGVkID4gdGhpcy5fZGF0YS5sZW5ndGgpIHx8ICgobkludHNOZWVkZWQgKyB0aGlzLlNIUklOS19USFJFU0hPTEQpIDwgdGhpcy5fZGF0YS5sZW5ndGgpKSB7XHJcbiAgICAgIGNvbnN0IG5ld0RhdGEgPSBuZXcgVWludDMyQXJyYXkobkludHNOZWVkZWQpO1xyXG4gICAgICB0aGlzLmNvcHkodGhpcy5fZGF0YSwgbmV3RGF0YSwgKG5JbnRzTmVlZGVkID4gdGhpcy5fZGF0YS5sZW5ndGgpID8gdGhpcy5fZGF0YS5sZW5ndGggOiBuSW50c05lZWRlZCk7XHJcbiAgICAgIHRoaXMuX2RhdGEgPSBuZXdEYXRhO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh2YWx1ZSA+IHRoaXMuX2xlbmd0aCkge1xyXG4gICAgICBpZiAodGhpcy5fbGVuZ3RoICUgMHgyMCA+IDApIHtcclxuICAgICAgICB0aGlzLl9kYXRhW3RoaXMubGVuZ3RoSW5JbnRzIC0gMV0gJj0gKDEgPDwgKCh0aGlzLl9sZW5ndGggJSAweDIwKSAmIDB4MWYpKSAtIDE7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5fZGF0YS5maWxsKDAsIHRoaXMubGVuZ3RoSW5JbnRzLCBuSW50c05lZWRlZCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLl9sZW5ndGggPSB2YWx1ZTtcclxuICAgIHRoaXMuX3ZlcnNpb24rKztcclxuICB9XHJcblxyXG4gIHN0YXRpYyBmcm9tQW5kKHNldDE6IEJpdEFycmF5LCBzZXQyOiBCaXRBcnJheSk6IEJpdEFycmF5IHtcclxuICAgIGlmIChzZXQxLl9sZW5ndGggIT0gc2V0Mi5fbGVuZ3RoKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTGVuZ3RocyBkaWZmZXIgKCR7c2V0MS5fbGVuZ3RofSAhPSAke3NldDIuX2xlbmd0aH0pYCk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgdGVtcCA9IG5ldyBCaXRBcnJheShzZXQxLl9sZW5ndGgpO1xyXG4gICAgdGVtcC5fbGVuZ3RoID0gc2V0MS5fbGVuZ3RoO1xyXG4gICAgdGVtcC5fZGF0YSA9IEJpdEFycmF5Ll9jcmVhdGVCdWZmZXIodGVtcC5fbGVuZ3RoKTtcclxuICAgIHRlbXAuX3ZlcnNpb24gPSAwO1xyXG5cclxuICAgIGNvbnN0IGxlbiA9IHNldDEubGVuZ3RoSW5JbnRzO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICB0ZW1wLl9kYXRhW2ldID0gc2V0MS5fZGF0YVtpXSAmIHNldDIuX2RhdGFbaV07XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGVtcDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc3RhdGljIF9jcmVhdGVCdWZmZXIobGVuZ3RoOiBudW1iZXIpOiBVaW50MzJBcnJheSB7XHJcbiAgICByZXR1cm4gbmV3IFVpbnQzMkFycmF5KE1hdGguZmxvb3IoKGxlbmd0aCArIDB4MWYpIC8gMHgyMCkpO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIGZyb21WYWx1ZXModmFsdWVzOiBBcnJheTxib29sZWFuPik6IEJpdEFycmF5IHtcclxuICAgIGNvbnN0IHRlbXAgPSBuZXcgQml0QXJyYXkodmFsdWVzLmxlbmd0aCk7XHJcbiAgICB0ZW1wLl92ZXJzaW9uID0gMDtcclxuXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRlbXAuX2xlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGlmICh2YWx1ZXNbaV0pIHtcclxuICAgICAgICB0ZW1wLl9kYXRhW01hdGguZmxvb3IoaSAvIDB4MjApXSB8PSAxIDw8ICgoaSAlIDB4MjApICYgMHgxZik7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB0ZW1wO1xyXG4gIH1cclxuXHJcbiAgLy8vIENvbnN0cnVjdHMgYSBbQml0U2V0XSBvZiBsZW5ndGggW2NvdW50XSwgd2hlcmUgaWR4LXRoIGJpdCBpcyBkZXRlcm1pbmVkIGJ5IGEgY2FsbCB0byBbZmxhZ10gKGlkeCkuXHJcbiAgc3RhdGljIGZyb21TZXEoY291bnQ6IG51bWJlciwgZmxhZzogRnVuY3Rpb24pOiBCaXRBcnJheSB7XHJcbiAgICBjb25zdCB0ZW1wID0gbmV3IEJpdEFycmF5KGNvdW50KTtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7ICsraSkge1xyXG4gICAgICB0ZW1wLnNldEJpdChpLCBmbGFnKGkpKTtcclxuICAgIH1cclxuICAgIHRlbXAuX3ZlcnNpb24gPSAwO1xyXG4gICAgcmV0dXJuIHRlbXA7XHJcbiAgfVxyXG5cclxuICAvLy8gQ29uc3RydWN0cyBhIFtCaXRTZXRdIGZyb20gYSBzdHJpbmcgW3NdIGNvbnRhaW5pbmcgJzAnIG9yICcxJy5cclxuICBzdGF0aWMgZnJvbVN0cmluZyhzOiBzdHJpbmcpOiBCaXRBcnJheSB7XHJcbiAgICByZXR1cm4gQml0QXJyYXkuZnJvbVNlcShzLmxlbmd0aCwgKGk6IG51bWJlcikgPT4gcy5jaGFyQXQoaSkgPT0gJzEnKTtcclxuICB9XHJcblxyXG4gIC8vLyBDb25zdHJ1Y3RzIGEgW0JpdFNldF0sIGJhc2VkIG9uIGxlbmd0aCBbX2xlbmd0aF0gYW5kIGJ5dGUgYXJyYXkgW19kYXRhXS5cclxuICBzdGF0aWMgZnJvbVVpbnQzMkFycmF5KF9sZW5ndGg6IG51bWJlciwgX2RhdGE6IFVpbnQzMkFycmF5KTogQml0QXJyYXkge1xyXG4gICAgY29uc3QgdGVtcCA9IG5ldyBCaXRBcnJheShfbGVuZ3RoKTtcclxuICAgIHRlbXAuX2RhdGEgPSBfZGF0YTtcclxuICAgIHJldHVybiB0ZW1wO1xyXG4gIH1cclxuXHJcbiAgLy8vIERlc2VyaWFsaXplcyBhIFtCaXRTZXRdIGZyb20gW2J5dGVzXS5cclxuICBzdGF0aWMgZnJvbUJ5dGVzKGJ5dGVzOiBVaW50OEFycmF5KTogQml0QXJyYXkge1xyXG4gICAgY29uc3QgbGVuID0gYnl0ZXMubGVuZ3RoO1xyXG4gICAgY29uc3QgdGVtcCA9IG5ldyBCaXRBcnJheShsZW4gKiA4KTtcclxuICAgIHRlbXAuX2RhdGEgPSBuZXcgVWludDMyQXJyYXkoTWF0aC5mbG9vcigobGVuICsgMykgLyA0KSk7XHJcbiAgICB0ZW1wLl9sZW5ndGggPSBsZW4gKiA4O1xyXG4gICAgbGV0IG51bTEgPSAwOyBsZXQgbnVtMiA9IDA7XHJcblxyXG4gICAgd2hpbGUgKChsZW4gLSBudW0yKSA+PSA0KSB7XHJcbiAgICAgIHRlbXAuX2RhdGFbbnVtMSsrXSA9IChcclxuICAgICAgICAoKGJ5dGVzW251bTJdICYgMHhmZikgfFxyXG4gICAgICAgICgoYnl0ZXNbbnVtMiArIDFdICYgMHhmZikgPDwgOCkpIHxcclxuICAgICAgICAoKGJ5dGVzW251bTIgKyAyXSAmIDB4ZmYpIDw8IDB4MTApKSB8XHJcbiAgICAgICAgKChieXRlc1tudW0yICsgM10gJiAweGZmKSA8PCAweDE4KTtcclxuXHJcbiAgICAgIG51bTIgKz0gNDtcclxuICAgIH1cclxuXHJcbiAgICBpZiAobGVuIC0gbnVtMiA9PSAzKSB7XHJcbiAgICAgIHRlbXAuX2RhdGFbbnVtMV0gPSAoYnl0ZXNbbnVtMiArIDJdICYgMHhmZikgPDwgMHgxMDtcclxuICAgIH1cclxuXHJcbiAgICBpZiAobGVuIC0gbnVtMiA9PSAyKSB7XHJcbiAgICAgIHRlbXAuX2RhdGFbbnVtMV0gfD0gKGJ5dGVzW251bTIgKyAxXSAmIDB4ZmYpIDw8IDg7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGxlbiAtIG51bTIgPT0gMSkge1xyXG4gICAgICB0ZW1wLl9kYXRhW251bTFdIHw9IGJ5dGVzW251bTJdICYgMHhmZjtcclxuICAgIH1cclxuXHJcbiAgICB0ZW1wLl92ZXJzaW9uID0gMDtcclxuICAgIHJldHVybiB0ZW1wO1xyXG4gIH1cclxuXHJcbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiBgJHt0aGlzLl9sZW5ndGh9IGJpdHMsICR7dGhpcy5jb3VudEJpdHModHJ1ZSl9IHNldGA7XHJcbiAgfVxyXG5cclxuICAvLy8gUGVyZm9ybXMgZGVlcCBjb21wYXJpc29uIG9mIHR3byBiaXRzZXRzLlxyXG4gIGVxdWFscyhvdGhlcjogQml0QXJyYXkpOiBib29sZWFuIHtcclxuICAgIGlmICh0aGlzID09IG90aGVyKSByZXR1cm4gdHJ1ZTtcclxuICAgIGlmIChvdGhlciA9PSBudWxsKSByZXR1cm4gZmFsc2U7XHJcbiAgICBpZiAodGhpcy5fbGVuZ3RoICE9IG90aGVyLl9sZW5ndGgpIHJldHVybiBmYWxzZTtcclxuICAgIGlmICh0aGlzLl9sZW5ndGggPT0gMCkgcmV0dXJuIHRydWU7XHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl9kYXRhLmxlbmd0aCAtIDE7IGkrKykge1xyXG4gICAgICBpZiAodGhpcy5fZGF0YVtpXSAhPSBvdGhlci5fZGF0YVtpXSkgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGZvciAobGV0IGkgPSAodGhpcy5fZGF0YS5sZW5ndGggLSAxKSAqIDg7IGkgPCB0aGlzLl9sZW5ndGg7IGkrKykge1xyXG4gICAgICBpZiAodGhpcy5nZXRCaXQoaSkgIT0gb3RoZXIuZ2V0Qml0KGkpKSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIC8qKiBDbG9uZXMgYSBiaXRzZXQuICovXHJcbiAgY2xvbmUoKTogQml0QXJyYXkge1xyXG4gICAgY29uc3QgYml0QXJyYXkgPSBuZXcgQml0QXJyYXkoMCwgZmFsc2UpO1xyXG4gICAgYml0QXJyYXkuX2RhdGEgPSBVaW50MzJBcnJheS5mcm9tKHRoaXMuX2RhdGEpOyAvLyBlZmZlY3RpdmUgbGVuZ3RoOiAobGVuZ3RoSW5JbnRzKVxyXG4gICAgYml0QXJyYXkuX2xlbmd0aCA9IHRoaXMuX2xlbmd0aDtcclxuICAgIGJpdEFycmF5Ll92ZXJzaW9uID0gdGhpcy5fdmVyc2lvbjtcclxuICAgIHJldHVybiBiaXRBcnJheTtcclxuICB9XHJcblxyXG4gIC8qKiBJbml0aWFsaXplcyBhIGJpdHNldC4gKi9cclxuICBpbml0KGZsYWc6IEZ1bmN0aW9uLCBub3RpZnk6IGJvb2xlYW4pOiBCaXRBcnJheSB7XHJcbiAgICB0aGlzLnNldEFsbChmYWxzZSwgZmFsc2UpO1xyXG5cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fbGVuZ3RoOyBpKyspIHtcclxuICAgICAgaWYgKGZsYWcoaSkpIHtcclxuICAgICAgICB0aGlzLl9kYXRhW01hdGguZmxvb3IoaSAvIDB4MjApXSB8PSAxIDw8ICgoaSAlIDB4MjApICYgMHgxZik7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmluY3JlbWVudFZlcnNpb24obm90aWZ5KTtcclxuICAgIHJldHVybiB0aGlzO1xyXG4gIH1cclxuXHJcbiAgLy8vIEludmVydHMgYSBiaXRzZXQuXHJcbiAgaW52ZXJ0KG5vdGlmeSA9IHRydWUpOiB2b2lkIHtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fZGF0YS5sZW5ndGg7IGkrKykge1xyXG4gICAgICB0aGlzLl9kYXRhW2ldIF49IC0xO1xyXG4gICAgfVxyXG4gICAgdGhpcy5pbmNyZW1lbnRWZXJzaW9uKG5vdGlmeSk7XHJcbiAgfVxyXG5cclxuICAvLy8gU2V0cyBhbGwgYml0cyB0byBbdmFsdWVdLCBvcHRpb25hbGx5IHN1cHByZXNzaW5nIG5vdGlmaWNhdGlvbnMuXHJcbiAgc2V0QWxsKHZhbHVlOiBib29sZWFuLCBub3RpZnkgPSBmYWxzZSk6IHZvaWQge1xyXG4gICAgY29uc3QgZmxhZ3MgPSB2YWx1ZSA/IC0xIDogMDtcclxuICAgIGNvbnN0IGxlbiA9IHRoaXMubGVuZ3RoSW5JbnRzO1xyXG5cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgdGhpcy5fZGF0YVtpXSA9IGZsYWdzO1xyXG4gICAgfSAvL3RvZG86IG9wdGltaXplXHJcblxyXG4gICAgdGhpcy5pbmNyZW1lbnRWZXJzaW9uKG5vdGlmeSk7XHJcbiAgfVxyXG5cclxuICAvLy8gU2V0cyBiaXRzIGF0IFtpbmRleGVzXSBwb3NpdGlvbiB0byBbdmFsdWVdLlxyXG4gIC8vLyBDbGVhcnMgdGhlIGJpdHNldCBpZiBbY2xlYXJdIGZsYWcgaXMgdHJ1ZS5cclxuICAvLy8gQ2hhbmdlIG5vdGlmaWNhdGlvbiBpcyByYWlzZWQgd2hlbiBbbm90aWZ5XSBpcyB0cnVlLlxyXG4gIHNldEluZGV4ZXMoaW5kZXhlczogQXJyYXk8bnVtYmVyPiwgdmFsdWU9dHJ1ZSwgY2xlYXI9dHJ1ZSwgbm90aWZ5PXRydWUpOiB2b2lkIHtcclxuICAgIGlmIChjbGVhcikge1xyXG4gICAgICB0aGlzLnNldEFsbCghdmFsdWUsIGZhbHNlKTtcclxuICAgIH1cclxuXHJcbiAgICBmb3IgKGNvbnN0IGkgb2YgaW5kZXhlcykge1xyXG4gICAgICB0aGlzLnNldEZhc3QoaSwgdmFsdWUpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuaW5jcmVtZW50VmVyc2lvbihub3RpZnkpO1xyXG4gIH1cclxuXHJcbiAgZXZlcnlJbmRleChpbmRleGVzOiBBcnJheTxudW1iZXI+LCB2YWx1ZT10cnVlKTogYm9vbGVhbiB7XHJcbiAgICBmb3IgKGNvbnN0IGluZGV4IG9mIGluZGV4ZXMpIHtcclxuICAgICAgaWYgKHRoaXMuZ2V0Qml0KGluZGV4KSAhPSB2YWx1ZSkge1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICBhbnlJbmRleChpbmRleGVzOiBBcnJheTxudW1iZXI+LCB2YWx1ZT10cnVlKTogYm9vbGVhbiB7XHJcbiAgICBmb3IgKGNvbnN0IGluZGV4IG9mIGluZGV4ZXMpIHtcclxuICAgICAgaWYgKHRoaXMuZ2V0Qml0KGluZGV4KSA9PSB2YWx1ZSkge1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBzZXRXaGVyZShjaGVjazogRnVuY3Rpb24sIHZhbHVlPXRydWUsIGNsZWFyPXRydWUsIG5vdGlmeT10cnVlLCBhbGxvd0NsZWFyPXRydWUpOiB2b2lkIHtcclxuICAgIGlmIChjbGVhciAmJiBhbGxvd0NsZWFyKSB7XHJcbiAgICAgIHRoaXMuc2V0QWxsKCF2YWx1ZSwgZmFsc2UpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChhbGxvd0NsZWFyKSB7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fbGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBpZiAoY2hlY2soaSkpIHtcclxuICAgICAgICAgIHRoaXMuc2V0RmFzdChpLCB2YWx1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX2xlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgdGhpcy5zZXRGYXN0KGksIGNoZWNrKGkpID8gdmFsdWUgOiAhdmFsdWUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5pbmNyZW1lbnRWZXJzaW9uKG5vdGlmeSk7XHJcbiAgfVxyXG5cclxuICBzZXRSYW5nZShmcm9tOiBudW1iZXIsIHRvOiBudW1iZXIsIHZhbHVlOiBib29sZWFuLCBub3RpZnk9dHJ1ZSk6IEJpdEFycmF5IHtcclxuICAgIHRoaXMuYXNzdXJlSW5SYW5nZShmcm9tLCAwLCB0aGlzLl9sZW5ndGggLSAxLCAnZnJvbScpO1xyXG4gICAgdGhpcy5hc3N1cmVJblJhbmdlKHRvLCAwLCB0aGlzLl9sZW5ndGggLSAxLCAndG8nKTtcclxuXHJcbiAgICBjb25zdCBzdGFydCA9IE1hdGgubWluKGZyb20sIHRvKTtcclxuICAgIGNvbnN0IGVuZCA9IE1hdGgubWF4KGZyb20sIHRvKTtcclxuXHJcbiAgICAvL3RvZG86IG9wdGltaXplXHJcbiAgICBpZiAodmFsdWUpIHtcclxuICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDw9IGVuZDsgaSsrKSB7XHJcbiAgICAgICAgdGhpcy5zZXRUcnVlKGkpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPD0gZW5kOyBpKyspIHtcclxuICAgICAgICB0aGlzLnNldEZhbHNlKGkpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5pbmNyZW1lbnRWZXJzaW9uKG5vdGlmeSk7XHJcbiAgICByZXR1cm4gdGhpcztcclxuICB9XHJcblxyXG4gIC8vLyBTZXRzIG4gcmFuZG9tbHkgY2hvc2VuIGJpdHMgdG8gdmFsdWUsIHJlbWFpbmluZyBiaXRzIHRvICF2YWx1ZS5cclxuICBzZXRSYW5kb20objogbnVtYmVyLCB2YWx1ZTogYm9vbGVhbiwgbm90aWZ5PXRydWUpOiB2b2lkIHtcclxuICAgIGlmIChuIDwgMCB8fCBuID4gdGhpcy5fbGVuZ3RoKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcignbiBtdXN0IGJlID49IDAgJiYgPD0gQ291bnQnKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAobiA+IHRoaXMuX2xlbmd0aCAvIDIpIHtcclxuICAgICAgdGhpcy5zZXRSYW5kb20odGhpcy5fbGVuZ3RoIC0gbiwgIXZhbHVlKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnNldEFsbCghdmFsdWUpO1xyXG5cclxuICAgIGZvciAobGV0IGsgPSAwOyBrIDwgbjsgKSB7XHJcbiAgICAgIGNvbnN0IGkgPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiB0aGlzLl9sZW5ndGgpO1xyXG4gICAgICBpZiAodGhpcy5nZXRCaXQoaSkgPT0gdmFsdWUpIGNvbnRpbnVlO1xyXG4gICAgICB0aGlzLnNldEZhc3QoaSwgdmFsdWUpO1xyXG4gICAgICBrKys7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5pbmNyZW1lbnRWZXJzaW9uKG5vdGlmeSk7XHJcbiAgfVxyXG5cclxuICAvLy8gTW9kaWZpZXMgY3VycmVudCBiaXRzZXQgYnkgcGVyZm9ybWluZyB0aGUgYml0d2lzZSBBTkQgb3BlcmF0aW9uIGFnYWluc3QgdGhlXHJcbiAgLy8vIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBiaXRzZXQuXHJcbiAgYW5kKHZhbHVlOiBCaXRBcnJheSwgbm90aWZ5PXRydWUpOiBCaXRBcnJheSB7XHJcbiAgICBpZiAodGhpcy5fbGVuZ3RoICE9IHZhbHVlLl9sZW5ndGgpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBcnJheSBsZW5ndGhzIGRpZmZlci4nKTtcclxuICAgIH1cclxuXHJcbiAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gdGhpcy5sZW5ndGhJbkludHM7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICB0aGlzLl9kYXRhW2ldICY9IHZhbHVlLl9kYXRhW2ldO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuaW5jcmVtZW50VmVyc2lvbihub3RpZnkpO1xyXG4gICAgcmV0dXJuIHRoaXM7XHJcbiAgfVxyXG5cclxuICAvLy8gUGVyZm9ybXMgdGhlIGJpdHdpc2UgQU5EIE5PVCBvcGVyYXRpb24gb24gdGhlIGVsZW1lbnRzIGluIHRoZSBjdXJyZW50IGJpdHNldFxyXG4gIC8vLyBhZ2FpbnN0IHRoZSBjb3JyZXNwb25kaW5nIGVsZW1lbnRzIGluIHRoZSBzcGVjaWZpZWQgYml0c2V0LlxyXG4gIGFuZE5vdCh2YWx1ZTogQml0QXJyYXksIG5vdGlmeT10cnVlKTogQml0QXJyYXkge1xyXG4gICAgaWYgKHRoaXMuX2xlbmd0aCAhPSB2YWx1ZS5fbGVuZ3RoKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcignQXJyYXkgbGVuZ3RocyBkaWZmZXIuJyk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgbGVuID0gdGhpcy5sZW5ndGhJbkludHM7XHJcbiAgICBmb3IgKGxldCBudW0yID0gMDsgbnVtMiA8IGxlbjsgbnVtMisrKSB7XHJcbiAgICAgIHRoaXMuX2RhdGFbbnVtMl0gJj0gfnZhbHVlLl9kYXRhW251bTJdO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuaW5jcmVtZW50VmVyc2lvbihub3RpZnkpO1xyXG4gICAgcmV0dXJuIHRoaXM7XHJcbiAgfVxyXG5cclxuICAvLy8gUGVyZm9ybXMgdGhlIGJpdHdpc2UgTk9UIEFORCBvcGVyYXRpb24gb24gdGhlIGVsZW1lbnRzIGluIHRoZSBjdXJyZW50IGJpdHNldFxyXG4gIC8vLyBhZ2FpbnN0IHRoZSBjb3JyZXNwb25kaW5nIGVsZW1lbnRzIGluIHRoZSBzcGVjaWZpZWQgYml0c2V0LlxyXG4gIG5vdEFuZCh2YWx1ZTogQml0QXJyYXksIG5vdGlmeT10cnVlKTogQml0QXJyYXkge1xyXG4gICAgaWYgKHRoaXMuX2xlbmd0aCAhPSB2YWx1ZS5fbGVuZ3RoKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcignQXJyYXkgbGVuZ3RocyBkaWZmZXIuJyk7XHJcbiAgICB9XHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHRoaXMubGVuZ3RoSW5JbnRzOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgdGhpcy5fZGF0YVtpXSA9ICh+dGhpcy5fZGF0YVtpXSkgJiB2YWx1ZS5fZGF0YVtpXTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmluY3JlbWVudFZlcnNpb24obm90aWZ5KTtcclxuICAgIHJldHVybiB0aGlzO1xyXG4gIH1cclxuXHJcbiAgLy8vIEludmVydHMgYWxsIGJpdCB2YWx1ZXMgaW4gdGhlIGN1cnJlbnQgYml0c2V0XHJcbiAgbm90KG5vdGlmeSA9IHRydWUpOiBCaXRBcnJheSB7XHJcbiAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gdGhpcy5sZW5ndGhJbkludHM7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICB0aGlzLl9kYXRhW2ldID0gfnRoaXMuX2RhdGFbaV07XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5pbmNyZW1lbnRWZXJzaW9uKG5vdGlmeSk7XHJcbiAgICByZXR1cm4gdGhpcztcclxuICB9XHJcblxyXG4gIC8vLyBQZXJmb3JtcyB0aGUgYml0d2lzZSBPUiBvcGVyYXRpb24gb24gdGhlIGVsZW1lbnRzIGluIHRoZSBjdXJyZW50IGJpdHNldFxyXG4gIC8vLyBhZ2FpbnN0IHRoZSBjb3JyZXNwb25kaW5nIGVsZW1lbnRzIGluIHRoZSBzcGVjaWZpZWQgYml0c2V0LlxyXG4gIG9yKHZhbHVlOiBCaXRBcnJheSwgbm90aWZ5ID0gdHJ1ZSkge1xyXG4gICAgaWYgKHRoaXMuX2xlbmd0aCAhPSB2YWx1ZS5fbGVuZ3RoKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcignQXJyYXkgbGVuZ3RocyBkaWZmZXIuJyk7XHJcbiAgICB9XHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHRoaXMubGVuZ3RoSW5JbnRzOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgdGhpcy5fZGF0YVtpXSB8PSB2YWx1ZS5fZGF0YVtpXTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmluY3JlbWVudFZlcnNpb24obm90aWZ5KTtcclxuICAgIHJldHVybiB0aGlzO1xyXG4gIH1cclxuXHJcbiAgLy8vIFBlcmZvcm1zIHRoZSBiaXR3aXNlIGV4Y2x1c2l2ZSBPUiBvcGVyYXRpb24gb24gdGhlIGVsZW1lbnRzIGluIHRoZSBjdXJyZW50IGJpdHNldFxyXG4gIC8vLyBhZ2FpbnN0IHRoZSBjb3JyZXNwb25kaW5nIGVsZW1lbnRzIGluIHRoZSBzcGVjaWZpZWQgYml0c2V0LlxyXG4gIHhvcih2YWx1ZTogQml0QXJyYXksIG5vdGlmeSA9IHRydWUpIHtcclxuICAgIGlmICh0aGlzLl9sZW5ndGggIT0gdmFsdWUuX2xlbmd0aCkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FycmF5IGxlbmd0aHMgZGlmZmVyLicpO1xyXG4gICAgfVxyXG5cclxuICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSB0aGlzLmxlbmd0aEluSW50czsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgIHRoaXMuX2RhdGFbaV0gXj0gdmFsdWUuX2RhdGFbaV07XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5pbmNyZW1lbnRWZXJzaW9uKG5vdGlmeSk7XHJcbiAgICByZXR1cm4gdGhpcztcclxuICB9XHJcblxyXG4gIC8vLyBJbnNlcnRzIG4gMC1iaXRzIGF0IHBvc2l0aW9uIHBvcywgcmVzaXppbmcgc2VsZiBhbmQgc2hpZnRpbmcgYml0cyBhcHByb3ByaWF0ZWx5LlxyXG4gIGluc2VydEF0KHBvczogbnVtYmVyLCBuOiBudW1iZXIsIGZsYWcgPSBmYWxzZSk6IHZvaWQge1xyXG4gICAgdGhpcy5hc3N1cmVJblJhbmdlKHBvcywgMCwgdGhpcy5fbGVuZ3RoLCAncG9zJyk7XHJcblxyXG4gICAgaWYgKG4gPT0gMCkgcmV0dXJuO1xyXG5cclxuICAgIC8vVE9ETzogb3B0aW1pemVcclxuICAgIC8vdGhlIG1vc3QgcHJpbWl0aXZlIGltcGxlbWVudGF0aW9uLCBvcHRpbWl6ZSBpdCBsYXRlciFcclxuXHJcbiAgICAvLyBiZWdpblVwZGF0ZSgpO1xyXG4gICAgY29uc3Qgb2xkbGVuZ3RoID0gdGhpcy5fbGVuZ3RoO1xyXG4gICAgdGhpcy5zZXRMZW5ndGgodGhpcy5fbGVuZ3RoICsgbik7XHJcblxyXG4gICAgLy9pZiAoIWNvbnRhaW5zKCFmbGFnKSkgcmV0dXJuOyAvLyBub3RoaW5nIHRvIGRvXHJcblxyXG4gICAgZm9yIChsZXQgaSA9IG9sZGxlbmd0aCAtIDE7IGkgPj0gcG9zOyBpLS0pIHtcclxuICAgICAgdGhpcy5zZXRCaXQoaSArIG4sIHRoaXMuZ2V0Qml0KGkpKTtcclxuICAgIH1cclxuXHJcbiAgICBmb3IgKGxldCBpID0gcG9zOyBpIDwgcG9zICsgbjsgaSsrKSB7XHJcbiAgICAgIHRoaXMuc2V0Qml0KGksIGZsYWcpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGVuZFVwZGF0ZSgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIERlbGV0ZXMgbiBiaXRzIGJlZ2lubmluZyBhdCBwb3NpdGlvbiBwb3MsIHJlc2l6aW5nIHNlbGYgYW5kIHNoaWZ0aW5nIHJlbWFpbmluZ1xyXG4gIC8vLyBiaXRzIGFwcHJvcHJpYXRlbHkuXHJcbiAgcmVtb3ZlQXQocG9zOiBudW1iZXIsIG4gPSAxKTogdm9pZCB7XHJcbiAgICAvLyB0aGUgbW9zdCBwcmltaXRpdmUgaW1wbGVtZW50YXRpb24sIG9wdGltaXplIGl0IGxhdGVyIVxyXG4gICAgaWYgKG4gPCAwKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcignbiBjYW5ub3QgYmUgbmVnYXRpdmUnKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmFzc3VyZUluUmFuZ2UocG9zLCAwLCB0aGlzLl9sZW5ndGggLSBuLCAncG9zJyk7XHJcblxyXG4gICAgaWYgKHRoaXMuY29udGFpbnModHJ1ZSkpIHtcclxuICAgICAgZm9yIChsZXQgaSA9IHBvczsgaSA8IHRoaXMuX2xlbmd0aCAtIG47IGkrKykge1xyXG4gICAgICAgIHRoaXMuc2V0Qml0KGksIHRoaXMuZ2V0Qml0KGkgKyBuKSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnNldExlbmd0aCh0aGlzLl9sZW5ndGggLSBuKTtcclxuICB9XHJcblxyXG4gIHJlbW92ZUJ5TWFzayhtYXNrOiBCaXRBcnJheSwgZmxhZyA9IHRydWUpOiBCaXRBcnJheSB7XHJcbiAgICBpZiAodGhpcy5fbGVuZ3RoICE9IG1hc2subGVuZ3RoKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcignbGVuZ3RoICE9IG1hc2subGVuZ3RoJyk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKG1hc2sgPT0gdGhpcykgeyAvLyBubyBuZWVkIHRvIGl0ZXJhdGVcclxuICAgICAgdGhpcy5zZXRMZW5ndGgobWFzay5jb3VudEJpdHMoIWZsYWcpKTtcclxuICAgICAgdGhpcy5zZXRBbGwoIWZsYWcpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgbGV0IGRzdElkeCA9IDA7XHJcblxyXG4gICAgICBmb3IgKGxldCBzcmNJZHggPSAtMTsgKHNyY0lkeCA9IG1hc2suZmluZE5leHQoc3JjSWR4LCAhZmxhZykpICE9IC0xOykge1xyXG4gICAgICAgIHRoaXMuc2V0RmFzdChkc3RJZHgrKywgdGhpcy5nZXRCaXQoc3JjSWR4KSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuX2xlbmd0aCA9IGRzdElkeDtcclxuICAgICAgdGhpcy5fdmVyc2lvbisrO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzO1xyXG4gIH1cclxuXHJcbiAgLy8vIFNpbWlsYXIgdG8gdGhlIFtdIG9wZXJhdG9yLlxyXG4gIGdldEJpdChwb3M6IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuICh0aGlzLl9kYXRhW01hdGguZmxvb3IocG9zIC8gMHgyMCldICYgKDEgPDwgKHBvcyAmIDB4MWYpKSkgIT0gMDtcclxuICB9XHJcblxyXG4gIC8vLyBTaW1pbGFyIHRvIHRoZSBbXSBvcGVyYXRvci5cclxuICBzZXRCaXQocG9zOiBudW1iZXIsIGJpdDogYm9vbGVhbiwgbm90aWZ5ID0gdHJ1ZSkge1xyXG4gICAgdGhpcy5zZXRGYXN0KHBvcywgYml0KTtcclxuICAgIGlmIChub3RpZnkpIHtcclxuICAgICAgdGhpcy5fdmVyc2lvbisrO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5fdmVyc2lvbisrO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIFNldHMgW2ldLXRoIGJpdCB0byBbdmFsdWVdLCBkb2VzIG5vdCBjaGVjayBib3VuZHMsIGRvZXMgbm90IGluY3JlbWVudCB2ZXJzaW9uXHJcbiAgc2V0RmFzdChpOiBudW1iZXIsIHZhbHVlOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBpZiAodmFsdWUpIHtcclxuICAgICAgdGhpcy5fZGF0YVtNYXRoLmZsb29yKGkgLyAweDIwKV0gfD0gMSA8PCAoaSAmIDB4MWYpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5fZGF0YVtNYXRoLmZsb29yKGkgLyAweDIwKV0gJj0gfigxIDw8IChpICYgMHgxZikpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2V0VHJ1ZShwb3M6IG51bWJlcik6IHZvaWQge1xyXG4gICAgdGhpcy5fZGF0YVtNYXRoLmZsb29yKHBvcyAvIDB4MjApXSB8PSAxIDw8IChwb3MgJiAweDFmKTtcclxuICB9XHJcbiAgc2V0RmFsc2UocG9zOiBudW1iZXIpIHtcclxuICAgIHRoaXMuX2RhdGFbTWF0aC5mbG9vcihwb3MgLyAweDIwKV0gJj0gfigxIDw8IChwb3MgJiAweDFmKSk7XHJcbiAgfVxyXG5cclxuICB0cnVlQ291bnQoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLmNvdW50Qml0cyh0cnVlKTtcclxuICB9XHJcbiAgZmFsc2VDb3VudCgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuY291bnRCaXRzKGZhbHNlKTtcclxuICB9XHJcblxyXG4gIC8vLyBDb3VudHMgYml0cyBvZiB0aGUgc3BlY2lmaWVkIHZhbHVlLlxyXG4gIGNvdW50Qml0cyh2YWx1ZTogYm9vbGVhbik6IG51bWJlciB7XHJcbiAgICBpZiAodGhpcy5fbGVuZ3RoID09IDApIHJldHVybiAwO1xyXG5cclxuICAgIGlmICh0aGlzLl9zZWxlY3RlZENvdW50VmVyc2lvbiAhPSB0aGlzLl92ZXJzaW9uKSB7XHJcbiAgICAgIHRoaXMuX3NlbGVjdGVkQ291bnQgPSAwO1xyXG4gICAgICBjb25zdCBsZW4gPSB0aGlzLmxlbmd0aEluSW50cztcclxuICAgICAgbGV0IGkgPSAwO1xyXG4gICAgICBmb3IgKDsgaSA8IGxlbiAtIDE7IGkrKykge1xyXG4gICAgICAgIGZvciAobGV0IGsgPSB0aGlzLl9kYXRhW2ldOyBrICE9IDA7IGsgPj4+PSA4KSB7IC8vdG9kbzogY2FzdCBkYXRhW2ldIHRvIHVpbnRcclxuICAgICAgICAgIHRoaXMuX3NlbGVjdGVkQ291bnQgKz0gQml0QXJyYXkuX29uQml0Q291bnRbayAmIDB4ZmZdO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gVGhlIGxhc3QgaW50LlxyXG4gICAgICBsZXQgayA9IHRoaXMuX2RhdGFbaV07XHJcbiAgICAgIGNvbnN0IHJlbWFpbmluZ0JpdHMgPSB0aGlzLl9sZW5ndGggJiAweDFmO1xyXG4gICAgICBpZiAocmVtYWluaW5nQml0cyAhPSAwKSB7Ly8gaWYgcmVtYWluaW5nQml0cyA9PSAwLCB0aGUgbGFzdCBpbnQgaXMgZnVsbHkgdXNlZCBhbmQgQUxMIGJpdHMgc2hvdWxkIGJlIGxlZnQgYXMgaXMuXHJcbiAgICAgICAgayAmPSB+KCg0Mjk0OTY3Mjk1KSA8PCByZW1haW5pbmdCaXRzKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgZm9yICg7IGsgIT0gMDsgayA+Pj49IDgpIHtcclxuICAgICAgICB0aGlzLl9zZWxlY3RlZENvdW50ICs9IEJpdEFycmF5Ll9vbkJpdENvdW50W2sgJiAweGZmXTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5fc2VsZWN0ZWRDb3VudFZlcnNpb24gPSB0aGlzLl92ZXJzaW9uO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiAodmFsdWUgPyB0aGlzLl9zZWxlY3RlZENvdW50IDogdGhpcy5fbGVuZ3RoIC0gdGhpcy5fc2VsZWN0ZWRDb3VudCk7XHJcbiAgfVxyXG5cclxuICAvLy8gUmV0dXJucyBhIG51bWJlciBvZiBzZXQgYml0cyB3aGVyZSBhbHNvIFtjaGVja10gaXMgdHJ1ZVxyXG4gIGNvdW50V2hlcmUoY2hlY2s6IEZ1bmN0aW9uKTogbnVtYmVyIHtcclxuICAgIGxldCByZXN1bHQgPSAwO1xyXG4gICAgaWYgKHRoaXMudHJ1ZUNvdW50KCkgPT0gdGhpcy5fbGVuZ3RoKSB7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fbGVuZ3RoOyBpKyspIHtcclxuICAgICAgICByZXN1bHQgKz0gY2hlY2soaSkgPyAxIDogMDtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgZm9yIChsZXQgaSA9IC0xOyAoaSA9IHRoaXMuZmluZE5leHQoaSwgdHJ1ZSkpICE9IC0xOykge1xyXG4gICAgICAgIHJlc3VsdCArPSBjaGVjayhpKSA/IDEgOiAwO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgLy8vIFBlcmZvcm1zIGJpdCBcImFuZFwiIGFuZCBjb3VudHMgYml0cyBvZiB0aGUgc3BlY2lmaWVkIHZhbHVlLCB3aXRob3V0IGJpdHNldCBtb2RpZmljYXRpb24uXHJcbiAgYW5kV2l0aENvdW50Qml0cyhzZWNvbmQ6IEJpdEFycmF5LCB2YWx1ZTogYm9vbGVhbik6IG51bWJlciB7XHJcbiAgICBpZiAodGhpcy5fbGVuZ3RoID09IDApIHJldHVybiAwO1xyXG5cclxuICAgIGxldCBjb3VudCA9IDA7IGNvbnN0IGxlbiA9IHRoaXMubGVuZ3RoSW5JbnRzOyBsZXQgaSA9IDA7XHJcbiAgICBmb3IgKDsgaSA8IGxlbiAtIDE7IGkrKykge1xyXG4gICAgICBmb3IgKHZhciBrID0gdGhpcy5fZGF0YVtpXSAmIHNlY29uZC5fZGF0YVtpXTsgayAhPSAwOyBrID4+Pj0gOCkge1xyXG4gICAgICAgIGNvdW50ICs9IEJpdEFycmF5Ll9vbkJpdENvdW50W2sgJiAweGZmXTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIFRoZSBsYXN0IGludC5cclxuICAgIHZhciBrID0gdGhpcy5fZGF0YVtpXSAmIHNlY29uZC5fZGF0YVtpXTtcclxuICAgIGNvbnN0IHJlbWFpbmluZ0JpdHMgPSB0aGlzLl9sZW5ndGggJiAweDFmO1xyXG4gICAgaWYgKHJlbWFpbmluZ0JpdHMgIT0gMCkge1xyXG4gICAgICBrICY9IH4oKDQyOTQ5NjcyOTUpIDw8IHJlbWFpbmluZ0JpdHMpO1xyXG4gICAgfVxyXG4gICAgZm9yICg7IGsgIT0gMDsgayA+Pj49IDgpIHtcclxuICAgICAgY291bnQgKz0gQml0QXJyYXkuX29uQml0Q291bnRbayAmIDB4ZmZdO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiAodmFsdWUgPyBjb3VudCA6IHRoaXMuX2xlbmd0aCAtIGNvdW50KTtcclxuICB9XHJcblxyXG4gIGNsZWFyKCk6IHZvaWQge1xyXG4gICAgdGhpcy5zZXRMZW5ndGgoMCk7XHJcbiAgfVxyXG4gIGNvbnRhaW5zKHZhbHVlOiBib29sZWFuKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5maW5kTmV4dCgtMSwgdmFsdWUpID49IDA7XHJcbiAgfVxyXG4gIGdldCBhbGxUcnVlKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuY291bnRCaXRzKHRydWUpID09IHRoaXMuX2xlbmd0aDtcclxuICB9XHJcbiAgZ2V0IGFsbEZhbHNlKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuY291bnRCaXRzKGZhbHNlKSA9PSB0aGlzLl9sZW5ndGg7XHJcbiAgfVxyXG4gIGdldCBhbnlUcnVlKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuY291bnRCaXRzKHRydWUpID4gMDtcclxuICB9XHJcbiAgZ2V0IGFueUZhbHNlKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuY291bnRCaXRzKGZhbHNlKSA+IDA7XHJcbiAgfVxyXG5cclxuICAvLy8gUmV0dXJucyB0aGUgcG9zaXRpb24gb2YgdGhlIG5leHQgYml0IG9mIHRoZSBzcGVjaWZpZWQgdmFsdWUsIHN0YXJ0aW5nIGZyb20gdGhlIHNwZWNpZmllZCBwb3NpdGlvbi5cclxuICAvLy8gUmV0dXJucyAtMSwgaWYgdGhlcmUgYXJlIG5vIHN1Y2ggYml0cy5cclxuICBmaW5kTmV4dChpbmRleDogbnVtYmVyLCB2YWx1ZSA9IHRydWUpOiBudW1iZXIge1xyXG4gICAgdGhpcy5hc3N1cmVJblJhbmdlKGluZGV4LCAtMSwgdGhpcy5fbGVuZ3RoLCAnaW5kZXgnKTtcclxuXHJcbiAgICBpZiAoaW5kZXggPj0gdGhpcy5fbGVuZ3RoIC0gMSkgcmV0dXJuIC0xO1xyXG4gICAgaW5kZXggPSBpbmRleCA8IDAgPyAwIDogaW5kZXggKyAxOyAvLyBza2lwIHN0YXJ0XHJcbiAgICBsZXQgdW51c2VkQml0cyA9IGluZGV4ICYgMHgxZjtcclxuICAgIGNvbnN0IG51bUludHMgPSB0aGlzLmxlbmd0aEluSW50cztcclxuXHJcbiAgICBmb3IgKGxldCBpID0gTWF0aC5mbG9vcihpbmRleCAvIDMyKTsgaSA8IG51bUludHM7IGkrKykge1xyXG4gICAgICBsZXQgayA9ICh2YWx1ZSA/IHRoaXMuX2RhdGFbaV0gOiB+dGhpcy5fZGF0YVtpXSk7IC8vIHVpbnQgY2FzdFxyXG4gICAgICBpZiAodW51c2VkQml0cyAhPSAwKSB7XHJcbiAgICAgICAgayAmPSAoKDB4ZmZmZmZmZmYgPDwgdW51c2VkQml0cykgJiAweGZmZmZmZmZmKTtcclxuICAgICAgICB1bnVzZWRCaXRzID0gMDtcclxuICAgICAgfSBlbHNlIGlmICghdmFsdWUgJiYgayA9PSAtNDI5NDk2NzI5NikgLy8gbG9va2luZyBmb3IgZmFsc2UsIGFsbCBiaXRzIGFyZSBzZXRcclxuICAgICAge1xyXG4gICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBmb3IgKGxldCBqID0gMDsgayAhPSAwOyBqICs9IDgsIGsgPj4+PSA4KSB7XHJcbiAgICAgICAgY29uc3QgcCA9IEJpdEFycmF5Ll9maXJzdE9uQml0W2sgJiAweGZmXTtcclxuICAgICAgICBpZiAocCA+PSAwKSB7XHJcbiAgICAgICAgICBpbmRleCA9IHAgKyAoaSAqIDMyKSArIGo7XHJcbiAgICAgICAgICBpZiAoaW5kZXggPj0gdGhpcy5fbGVuZ3RoKSByZXR1cm4gLTE7XHJcbiAgICAgICAgICByZXR1cm4gaW5kZXg7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gLTE7XHJcbiAgfVxyXG5cclxuICAvLy8gRmluZHMgcHJldmlvdXMgYml0IG9mIHRoZSBzcGVjaWZpZWQgdmFsdWUgaW4gdGhlIGJpdHNldC5cclxuICBmaW5kUHJldihpbmRleDogbnVtYmVyLCB2YWx1ZSA9IHRydWUpOiBudW1iZXIge1xyXG4gICAgaWYgKGluZGV4ID09IDApIHJldHVybiAtMTtcclxuICAgIHRoaXMuYXNzdXJlSW5SYW5nZShpbmRleCwgLTEsIHRoaXMuX2xlbmd0aCwgJ2luZGV4Jyk7XHJcblxyXG4gICAgaW5kZXggPSBpbmRleCA8IDAgPyB0aGlzLl9sZW5ndGggLSAxIDogaW5kZXggLSAxOyAvLyBza2lwIHN0YXJ0XHJcblxyXG4gICAgY29uc3QgbGFzdEludElkeCA9IE1hdGguZmxvb3IoaW5kZXggLyAweDIwKTtcclxuICAgIGxldCByZW1haW5pbmdCaXRzID0gKGluZGV4ICsgMSkgJiAweDFmO1xyXG5cclxuICAgIGZvciAobGV0IGkgPSBsYXN0SW50SWR4OyBpID49IDA7IGktLSkge1xyXG4gICAgICBsZXQgayA9ICh2YWx1ZSA/IHRoaXMuX2RhdGFbaV0gOiB+dGhpcy5fZGF0YVtpXSk7IC8vIGNhc3RcclxuICAgICAgaWYgKHJlbWFpbmluZ0JpdHMgIT0gMCkge1xyXG4gICAgICAgIGsgJj0gfigoNDI5NDk2NzI5NSkgPDwgcmVtYWluaW5nQml0cyk7XHJcbiAgICAgICAgcmVtYWluaW5nQml0cyA9IDA7XHJcbiAgICAgIH1cclxuICAgICAgZm9yIChsZXQgaiA9IDI0OyBrICE9IDA7IGogLT0gOCwgayA8PD0gOCkge1xyXG4gICAgICAgIGNvbnN0IHAgPSBCaXRBcnJheS5fbGFzdE9uQml0W2sgPj4+IDB4MThdO1xyXG4gICAgICAgIGlmIChwID49IDApIHtcclxuICAgICAgICAgIHJldHVybiBwICsgKGkgKiAzMikgKyBqO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIC0xO1xyXG4gIH1cclxufVxyXG4iXX0=