@ukwhatn/wikidot 4.0.2 → 4.0.3

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/dist/index.js CHANGED
@@ -1,73 +1,1780 @@
1
- import {
2
- AnonymousUser,
3
- DeletedUser,
4
- ForumCategory,
5
- ForumCategoryCollection,
6
- ForumPost,
7
- ForumPostCollection,
8
- ForumThread,
9
- ForumThreadCollection,
10
- GuestUser,
11
- Logger,
12
- RequireLogin,
13
- WikidotUser,
14
- consoleHandler,
15
- getLogger,
16
- logger,
17
- nullHandler,
18
- parseOdate,
19
- parseUser,
20
- setupConsoleHandler
21
- } from "./shared/index-ytknx2hn.js";
22
- import {
23
- PageRevision,
24
- PageRevisionCollection
25
- } from "./shared/index-f2eh3ykk.js";
26
- import {
27
- User,
28
- UserCollection
29
- } from "./shared/index-kka6e8cb.js";
30
- import {
31
- AMCError,
32
- AMCHttpError,
33
- ForbiddenError,
34
- LoginRequiredError,
35
- NoElementError,
36
- NotFoundException,
37
- ResponseDataError,
38
- SessionCreateError,
39
- SessionError,
40
- TargetError,
41
- TargetExistsError,
42
- UnexpectedError,
43
- WikidotError,
44
- WikidotStatusError,
45
- __legacyDecorateClassTS,
46
- __require,
47
- __toESM,
48
- combineResults,
49
- fromPromise,
50
- wdErr,
51
- wdErrAsync,
52
- wdOk,
53
- wdOkAsync
54
- } from "./shared/index-7dqqxq7x.js";
1
+ import { createRequire } from "node:module";
2
+ var __defProp = Object.defineProperty;
3
+ var __export = (target, all) => {
4
+ for (var name in all)
5
+ __defProp(target, name, {
6
+ get: all[name],
7
+ enumerable: true,
8
+ configurable: true,
9
+ set: (newValue) => all[name] = () => newValue
10
+ });
11
+ };
12
+ var __legacyDecorateClassTS = function(decorators, target, key, desc) {
13
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
14
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function")
15
+ r = Reflect.decorate(decorators, target, key, desc);
16
+ else
17
+ for (var i = decorators.length - 1;i >= 0; i--)
18
+ if (d = decorators[i])
19
+ r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
20
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
21
+ };
22
+ var __esm = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
23
+
24
+ // src/common/errors/base.ts
25
+ var WikidotError, UnexpectedError;
26
+ var init_base = __esm(() => {
27
+ WikidotError = class WikidotError extends Error {
28
+ name;
29
+ constructor(message) {
30
+ super(message);
31
+ this.name = this.constructor.name;
32
+ Object.setPrototypeOf(this, new.target.prototype);
33
+ }
34
+ };
35
+ UnexpectedError = class UnexpectedError extends WikidotError {
36
+ };
37
+ });
38
+
39
+ // src/common/errors/amc.ts
40
+ var AMCError, AMCHttpError, WikidotStatusError, ResponseDataError;
41
+ var init_amc = __esm(() => {
42
+ init_base();
43
+ AMCError = class AMCError extends WikidotError {
44
+ };
45
+ AMCHttpError = class AMCHttpError extends AMCError {
46
+ statusCode;
47
+ constructor(message, statusCode) {
48
+ super(message);
49
+ this.statusCode = statusCode;
50
+ }
51
+ };
52
+ WikidotStatusError = class WikidotStatusError extends AMCError {
53
+ statusCode;
54
+ constructor(message, statusCode) {
55
+ super(message);
56
+ this.statusCode = statusCode;
57
+ }
58
+ };
59
+ ResponseDataError = class ResponseDataError extends AMCError {
60
+ };
61
+ });
62
+
63
+ // src/common/errors/session.ts
64
+ var SessionError, SessionCreateError, LoginRequiredError;
65
+ var init_session = __esm(() => {
66
+ init_base();
67
+ SessionError = class SessionError extends WikidotError {
68
+ };
69
+ SessionCreateError = class SessionCreateError extends SessionError {
70
+ };
71
+ LoginRequiredError = class LoginRequiredError extends SessionError {
72
+ constructor(message = "Login is required for this operation") {
73
+ super(message);
74
+ }
75
+ };
76
+ });
77
+
78
+ // src/common/errors/target.ts
79
+ var NotFoundException, TargetExistsError, TargetError, ForbiddenError, NoElementError;
80
+ var init_target = __esm(() => {
81
+ init_base();
82
+ NotFoundException = class NotFoundException extends WikidotError {
83
+ };
84
+ TargetExistsError = class TargetExistsError extends WikidotError {
85
+ };
86
+ TargetError = class TargetError extends WikidotError {
87
+ };
88
+ ForbiddenError = class ForbiddenError extends WikidotError {
89
+ };
90
+ NoElementError = class NoElementError extends WikidotError {
91
+ };
92
+ });
93
+
94
+ // src/common/errors/index.ts
95
+ var init_errors = __esm(() => {
96
+ init_amc();
97
+ init_base();
98
+ init_session();
99
+ init_target();
100
+ });
101
+
102
+ // src/common/logger.ts
103
+ class Logger {
104
+ name;
105
+ handler;
106
+ level;
107
+ constructor(name, handler = nullHandler, level = "warn") {
108
+ this.name = name;
109
+ this.handler = handler;
110
+ this.level = level;
111
+ }
112
+ setHandler(handler) {
113
+ this.handler = handler;
114
+ }
115
+ setLevel(level) {
116
+ this.level = level;
117
+ }
118
+ shouldLog(level) {
119
+ return LOG_LEVEL_PRIORITY[level] >= LOG_LEVEL_PRIORITY[this.level];
120
+ }
121
+ log(level, message, ...args) {
122
+ if (this.shouldLog(level)) {
123
+ this.handler(level, this.name, message, ...args);
124
+ }
125
+ }
126
+ debug(message, ...args) {
127
+ this.log("debug", message, ...args);
128
+ }
129
+ info(message, ...args) {
130
+ this.log("info", message, ...args);
131
+ }
132
+ warn(message, ...args) {
133
+ this.log("warn", message, ...args);
134
+ }
135
+ error(message, ...args) {
136
+ this.log("error", message, ...args);
137
+ }
138
+ }
139
+ function getLogger(name = "wikidot") {
140
+ return new Logger(name);
141
+ }
142
+ function setupConsoleHandler(logger, level = "warn") {
143
+ logger.setHandler(consoleHandler);
144
+ logger.setLevel(level);
145
+ }
146
+ var LOG_LEVEL_PRIORITY, nullHandler = () => {}, consoleHandler = (level, name, message, ...args) => {
147
+ const timestamp = new Date().toISOString();
148
+ const formattedMessage = `${timestamp} [${name}/${level.toUpperCase()}] ${message}`;
149
+ switch (level) {
150
+ case "debug":
151
+ console.debug(formattedMessage, ...args);
152
+ break;
153
+ case "info":
154
+ console.info(formattedMessage, ...args);
155
+ break;
156
+ case "warn":
157
+ console.warn(formattedMessage, ...args);
158
+ break;
159
+ case "error":
160
+ console.error(formattedMessage, ...args);
161
+ break;
162
+ }
163
+ }, logger;
164
+ var init_logger = __esm(() => {
165
+ LOG_LEVEL_PRIORITY = {
166
+ debug: 0,
167
+ info: 1,
168
+ warn: 2,
169
+ error: 3
170
+ };
171
+ logger = getLogger();
172
+ });
173
+ // src/common/types/result.ts
174
+ import { err, errAsync, ok, okAsync, ResultAsync } from "neverthrow";
175
+ var wdOk = (value) => ok(value), wdErr = (error) => err(error), wdOkAsync = (value) => okAsync(value), wdErrAsync = (error) => errAsync(error), fromPromise = (promise, errorMapper) => ResultAsync.fromPromise(promise, errorMapper), combineResults = (results) => ResultAsync.combine(results);
176
+ var init_result = () => {};
177
+
178
+ // src/common/types/index.ts
179
+ var init_types = __esm(() => {
180
+ init_result();
181
+ });
182
+
183
+ // src/connector/amc-config.ts
184
+ var DEFAULT_AMC_CONFIG, WIKIDOT_TOKEN7 = "123456", DEFAULT_HTTP_STATUS_CODE = 999;
185
+ var init_amc_config = __esm(() => {
186
+ DEFAULT_AMC_CONFIG = {
187
+ timeout: 20000,
188
+ retryLimit: 3,
189
+ retryInterval: 1000,
190
+ maxBackoff: 60000,
191
+ backoffFactor: 2,
192
+ semaphoreLimit: 10
193
+ };
194
+ });
195
+
196
+ // src/module/user/anonymous-user.ts
197
+ class AnonymousUser {
198
+ client;
199
+ id = 0;
200
+ name = "Anonymous";
201
+ unixName = "anonymous";
202
+ avatarUrl = null;
203
+ ip;
204
+ userType = "anonymous";
205
+ constructor(client, ip) {
206
+ this.client = client;
207
+ this.ip = ip;
208
+ }
209
+ isUser() {
210
+ return false;
211
+ }
212
+ isDeletedUser() {
213
+ return false;
214
+ }
215
+ isAnonymousUser() {
216
+ return true;
217
+ }
218
+ isGuestUser() {
219
+ return false;
220
+ }
221
+ isWikidotUser() {
222
+ return false;
223
+ }
224
+ toString() {
225
+ return `AnonymousUser(name=${this.name}, unixName=${this.unixName}, ip=${this.ip})`;
226
+ }
227
+ }
228
+
229
+ // src/module/user/deleted-user.ts
230
+ class DeletedUser {
231
+ client;
232
+ id;
233
+ name = "account deleted";
234
+ unixName = "account_deleted";
235
+ avatarUrl = null;
236
+ ip = null;
237
+ userType = "deleted";
238
+ constructor(client, id) {
239
+ this.client = client;
240
+ this.id = id;
241
+ }
242
+ isUser() {
243
+ return false;
244
+ }
245
+ isDeletedUser() {
246
+ return true;
247
+ }
248
+ isAnonymousUser() {
249
+ return false;
250
+ }
251
+ isGuestUser() {
252
+ return false;
253
+ }
254
+ isWikidotUser() {
255
+ return false;
256
+ }
257
+ toString() {
258
+ return `DeletedUser(id=${this.id}, name=${this.name}, unixName=${this.unixName})`;
259
+ }
260
+ }
261
+
262
+ // src/module/user/guest-user.ts
263
+ class GuestUser {
264
+ client;
265
+ id = 0;
266
+ name;
267
+ unixName = null;
268
+ avatarUrl;
269
+ ip = null;
270
+ userType = "guest";
271
+ constructor(client, name, avatarUrl = null) {
272
+ this.client = client;
273
+ this.name = name;
274
+ this.avatarUrl = avatarUrl;
275
+ }
276
+ isUser() {
277
+ return false;
278
+ }
279
+ isDeletedUser() {
280
+ return false;
281
+ }
282
+ isAnonymousUser() {
283
+ return false;
284
+ }
285
+ isGuestUser() {
286
+ return true;
287
+ }
288
+ isWikidotUser() {
289
+ return false;
290
+ }
291
+ toString() {
292
+ return `GuestUser(name=${this.name})`;
293
+ }
294
+ }
295
+
296
+ // src/util/table/char-table.ts
297
+ var specialCharMap;
298
+ var init_char_table = __esm(() => {
299
+ specialCharMap = {
300
+ "À": "a",
301
+ "Á": "a",
302
+ "Â": "a",
303
+ "Ã": "a",
304
+ "Ä": "ae",
305
+ "Å": "a",
306
+ "Æ": "ae",
307
+ "Ç": "c",
308
+ "È": "e",
309
+ "É": "e",
310
+ "Ê": "e",
311
+ "Ë": "e",
312
+ "Ì": "i",
313
+ "Í": "i",
314
+ "Î": "i",
315
+ "Ï": "i",
316
+ "Ð": "d",
317
+ "Ñ": "n",
318
+ "Ò": "o",
319
+ "Ó": "o",
320
+ "Ô": "o",
321
+ "Õ": "o",
322
+ "Ö": "oe",
323
+ "Ø": "o",
324
+ "Ù": "u",
325
+ "Ú": "u",
326
+ "Û": "u",
327
+ "Ü": "ue",
328
+ "Ý": "y",
329
+ "Þ": "t",
330
+ "ß": "ss",
331
+ "à": "a",
332
+ "á": "a",
333
+ "â": "a",
334
+ "ã": "a",
335
+ "ä": "ae",
336
+ "å": "a",
337
+ "æ": "ae",
338
+ "ç": "c",
339
+ "è": "e",
340
+ "é": "e",
341
+ "ê": "e",
342
+ "ë": "e",
343
+ "ì": "i",
344
+ "í": "i",
345
+ "î": "i",
346
+ "ï": "i",
347
+ "ð": "d",
348
+ "ñ": "n",
349
+ "ò": "o",
350
+ "ó": "o",
351
+ "ô": "o",
352
+ "õ": "o",
353
+ "ö": "oe",
354
+ "ø": "o",
355
+ "ù": "u",
356
+ "ú": "u",
357
+ "û": "u",
358
+ "ü": "ue",
359
+ "ý": "y",
360
+ "þ": "t",
361
+ "ÿ": "y",
362
+ "Ā": "a",
363
+ "ā": "a",
364
+ "Ă": "a",
365
+ "ă": "a",
366
+ "Ą": "a",
367
+ "ą": "a",
368
+ "Ć": "c",
369
+ "ć": "c",
370
+ "Ĉ": "c",
371
+ "ĉ": "c",
372
+ "Ċ": "c",
373
+ "ċ": "c",
374
+ "Č": "c",
375
+ "č": "c",
376
+ "Ď": "d",
377
+ "ď": "d",
378
+ "Đ": "d",
379
+ "đ": "d",
380
+ "Ē": "e",
381
+ "ē": "e",
382
+ "Ĕ": "e",
383
+ "ĕ": "e",
384
+ "Ė": "e",
385
+ "ė": "e",
386
+ "Ę": "e",
387
+ "ę": "e",
388
+ "Ě": "e",
389
+ "ě": "e",
390
+ "Ĝ": "g",
391
+ "ĝ": "g",
392
+ "Ğ": "g",
393
+ "ğ": "g",
394
+ "Ġ": "g",
395
+ "ġ": "g",
396
+ "Ģ": "g",
397
+ "ģ": "g",
398
+ "Ĥ": "h",
399
+ "ĥ": "h",
400
+ "Ħ": "h",
401
+ "ħ": "h",
402
+ "Ĩ": "i",
403
+ "ĩ": "i",
404
+ "Ī": "i",
405
+ "ī": "i",
406
+ "Ĭ": "i",
407
+ "ĭ": "i",
408
+ "Į": "i",
409
+ "į": "i",
410
+ "İ": "i",
411
+ "ı": "i",
412
+ "IJ": "ij",
413
+ "ij": "ij",
414
+ "Ĵ": "j",
415
+ "ĵ": "j",
416
+ "Ķ": "k",
417
+ "ķ": "k",
418
+ "ĸ": "k",
419
+ "Ĺ": "l",
420
+ "ĺ": "l",
421
+ "Ļ": "l",
422
+ "ļ": "l",
423
+ "Ľ": "l",
424
+ "ľ": "l",
425
+ "Ŀ": "l",
426
+ "ŀ": "l",
427
+ "Ł": "l",
428
+ "ł": "l",
429
+ "Ń": "n",
430
+ "ń": "n",
431
+ "Ņ": "n",
432
+ "ņ": "n",
433
+ "Ň": "n",
434
+ "ň": "n",
435
+ "ʼn": "n",
436
+ "Ŋ": "n",
437
+ "ŋ": "n",
438
+ "Ō": "o",
439
+ "ō": "o",
440
+ "Ŏ": "o",
441
+ "ŏ": "o",
442
+ "Ő": "o",
443
+ "ő": "o",
444
+ "Œ": "oe",
445
+ "œ": "oe",
446
+ "Ŕ": "r",
447
+ "ŕ": "r",
448
+ "Ŗ": "r",
449
+ "ŗ": "r",
450
+ "Ř": "r",
451
+ "ř": "r",
452
+ "Ś": "s",
453
+ "ś": "s",
454
+ "Ŝ": "s",
455
+ "ŝ": "s",
456
+ "Ş": "s",
457
+ "ş": "s",
458
+ "Š": "s",
459
+ "š": "s",
460
+ "Ţ": "t",
461
+ "ţ": "t",
462
+ "Ť": "t",
463
+ "ť": "t",
464
+ "Ŧ": "t",
465
+ "ŧ": "t",
466
+ "Ũ": "u",
467
+ "ũ": "u",
468
+ "Ū": "u",
469
+ "ū": "u",
470
+ "Ŭ": "u",
471
+ "ŭ": "u",
472
+ "Ů": "u",
473
+ "ů": "u",
474
+ "Ű": "u",
475
+ "ű": "u",
476
+ "Ų": "u",
477
+ "ų": "u",
478
+ "Ŵ": "w",
479
+ "ŵ": "w",
480
+ "Ŷ": "y",
481
+ "ŷ": "y",
482
+ "Ÿ": "y",
483
+ "Ź": "z",
484
+ "ź": "z",
485
+ "Ż": "z",
486
+ "ż": "z",
487
+ "Ž": "z",
488
+ "ž": "z",
489
+ "ſ": "ss",
490
+ "Ƒ": "f",
491
+ "ƒ": "f",
492
+ "Ș": "s",
493
+ "ș": "s",
494
+ "Ț": "t",
495
+ "ț": "t",
496
+ "Ά": "a",
497
+ "Έ": "e",
498
+ "Ή": "i",
499
+ "Ί": "i",
500
+ "Ό": "o",
501
+ "Ύ": "y",
502
+ "Ώ": "o",
503
+ "ΐ": "i",
504
+ "Α": "a",
505
+ "Β": "v",
506
+ "Γ": "g",
507
+ "Δ": "d",
508
+ "Ε": "e",
509
+ "Ζ": "z",
510
+ "Η": "i",
511
+ "Θ": "th",
512
+ "Ι": "i",
513
+ "Κ": "k",
514
+ "Λ": "l",
515
+ "Μ": "m",
516
+ "Ν": "n",
517
+ "Ξ": "x",
518
+ "Ο": "o",
519
+ "Π": "p",
520
+ "Ρ": "r",
521
+ "Σ": "s",
522
+ "Τ": "t",
523
+ "Υ": "y",
524
+ "Φ": "f",
525
+ "Χ": "ch",
526
+ "Ψ": "ps",
527
+ "Ω": "o",
528
+ "Ϊ": "i",
529
+ "Ϋ": "y",
530
+ "ά": "a",
531
+ "έ": "e",
532
+ "ή": "i",
533
+ "ί": "i",
534
+ "ΰ": "y",
535
+ "α": "a",
536
+ "β": "v",
537
+ "γ": "g",
538
+ "δ": "d",
539
+ "ε": "e",
540
+ "ζ": "z",
541
+ "η": "i",
542
+ "θ": "th",
543
+ "ι": "i",
544
+ "κ": "k",
545
+ "λ": "l",
546
+ "μ": "m",
547
+ "ν": "n",
548
+ "ξ": "x",
549
+ "ο": "o",
550
+ "π": "p",
551
+ "ρ": "r",
552
+ "ς": "s",
553
+ "σ": "s",
554
+ "τ": "t",
555
+ "υ": "y",
556
+ "φ": "f",
557
+ "χ": "ch",
558
+ "ψ": "ps",
559
+ "ω": "o",
560
+ "ϊ": "i",
561
+ "ϋ": "y",
562
+ "ό": "o",
563
+ "ύ": "y",
564
+ "ώ": "o",
565
+ "ϑ": "th",
566
+ "Ё": "e",
567
+ "Ђ": "d",
568
+ "Ѓ": "g",
569
+ "Є": "e",
570
+ "Ѕ": "z",
571
+ "І": "i",
572
+ "Ї": "i",
573
+ "Ј": "j",
574
+ "Љ": "l",
575
+ "Њ": "n",
576
+ "Ћ": "c",
577
+ "Ќ": "k",
578
+ "Ў": "u",
579
+ "Џ": "d",
580
+ "А": "a",
581
+ "Б": "b",
582
+ "В": "v",
583
+ "Г": "g",
584
+ "Д": "d",
585
+ "Е": "e",
586
+ "Ж": "z",
587
+ "З": "z",
588
+ "И": "i",
589
+ "Й": "j",
590
+ "К": "k",
591
+ "Л": "l",
592
+ "М": "m",
593
+ "Н": "n",
594
+ "О": "o",
595
+ "П": "p",
596
+ "Р": "r",
597
+ "С": "s",
598
+ "Т": "t",
599
+ "У": "u",
600
+ "Ф": "f",
601
+ "Х": "h",
602
+ "Ц": "c",
603
+ "Ч": "c",
604
+ "Ш": "s",
605
+ "Щ": "s",
606
+ "Ы": "y",
607
+ "Э": "e",
608
+ "Ю": "u",
609
+ "Я": "a",
610
+ "а": "a",
611
+ "б": "b",
612
+ "в": "v",
613
+ "г": "g",
614
+ "д": "d",
615
+ "е": "e",
616
+ "ж": "z",
617
+ "з": "z",
618
+ "и": "i",
619
+ "й": "j",
620
+ "к": "k",
621
+ "л": "l",
622
+ "м": "m",
623
+ "н": "n",
624
+ "о": "o",
625
+ "п": "p",
626
+ "р": "r",
627
+ "с": "s",
628
+ "т": "t",
629
+ "у": "u",
630
+ "ф": "f",
631
+ "х": "h",
632
+ "ц": "c",
633
+ "ч": "c",
634
+ "ш": "s",
635
+ "щ": "s",
636
+ "ы": "y",
637
+ "э": "e",
638
+ "ю": "u",
639
+ "я": "a",
640
+ "ё": "e",
641
+ "ђ": "d",
642
+ "ѓ": "g",
643
+ "є": "e",
644
+ "ѕ": "z",
645
+ "і": "i",
646
+ "ї": "i",
647
+ "ј": "j",
648
+ "љ": "l",
649
+ "њ": "n",
650
+ "ћ": "c",
651
+ "ќ": "k",
652
+ "ў": "u",
653
+ "џ": "d",
654
+ "Ѣ": "e",
655
+ "ѣ": "e",
656
+ "Ѫ": "a",
657
+ "ѫ": "a",
658
+ "Ѳ": "f",
659
+ "ѳ": "f",
660
+ "Ѵ": "y",
661
+ "ѵ": "y",
662
+ "Ґ": "g",
663
+ "ґ": "g",
664
+ "Ғ": "g",
665
+ "ғ": "g",
666
+ "Ҕ": "g",
667
+ "ҕ": "g",
668
+ "Җ": "z",
669
+ "җ": "z",
670
+ "Қ": "k",
671
+ "қ": "k",
672
+ "Ҝ": "k",
673
+ "ҝ": "k",
674
+ "Ҟ": "k",
675
+ "ҟ": "k",
676
+ "Ҡ": "k",
677
+ "ҡ": "k",
678
+ "Ң": "n",
679
+ "ң": "n",
680
+ "Ҥ": "n",
681
+ "ҥ": "n",
682
+ "Ҧ": "p",
683
+ "ҧ": "p",
684
+ "Ҩ": "o",
685
+ "ҩ": "o",
686
+ "Ҫ": "s",
687
+ "ҫ": "s",
688
+ "Ҭ": "t",
689
+ "ҭ": "t",
690
+ "Ү": "u",
691
+ "ү": "u",
692
+ "Ұ": "u",
693
+ "ұ": "u",
694
+ "Ҳ": "h",
695
+ "ҳ": "h",
696
+ "Ҵ": "c",
697
+ "ҵ": "c",
698
+ "Ҷ": "c",
699
+ "ҷ": "c",
700
+ "Ҹ": "c",
701
+ "ҹ": "c",
702
+ "Һ": "h",
703
+ "һ": "h",
704
+ "Ҽ": "c",
705
+ "ҽ": "c",
706
+ "Ҿ": "c",
707
+ "ҿ": "c",
708
+ "Ӂ": "z",
709
+ "ӂ": "z",
710
+ "Ӄ": "k",
711
+ "ӄ": "k",
712
+ "Ӆ": "l",
713
+ "ӆ": "l",
714
+ "Ӈ": "n",
715
+ "ӈ": "n",
716
+ "Ӊ": "n",
717
+ "ӊ": "n",
718
+ "Ӌ": "c",
719
+ "ӌ": "c",
720
+ "Ӑ": "a",
721
+ "ӑ": "a",
722
+ "Ӓ": "a",
723
+ "ӓ": "a",
724
+ "Ӕ": "ae",
725
+ "ӕ": "ae",
726
+ "Ӗ": "e",
727
+ "ӗ": "e",
728
+ "Ә": "a",
729
+ "ә": "a",
730
+ "Ӛ": "a",
731
+ "ӛ": "a",
732
+ "Ӝ": "z",
733
+ "ӝ": "z",
734
+ "Ӟ": "z",
735
+ "ӟ": "z",
736
+ "Ӡ": "z",
737
+ "ӡ": "z",
738
+ "Ӣ": "i",
739
+ "ӣ": "i",
740
+ "Ӥ": "i",
741
+ "ӥ": "i",
742
+ "Ӧ": "o",
743
+ "ӧ": "o",
744
+ "Ө": "o",
745
+ "ө": "o",
746
+ "Ӫ": "o",
747
+ "ӫ": "o",
748
+ "Ӯ": "u",
749
+ "ӯ": "u",
750
+ "Ӱ": "u",
751
+ "ӱ": "u",
752
+ "Ӳ": "u",
753
+ "ӳ": "u",
754
+ "Ӵ": "c",
755
+ "ӵ": "c",
756
+ "Ӹ": "y",
757
+ "ӹ": "y",
758
+ "Ԋ": "n",
759
+ "ԋ": "n",
760
+ "Ԏ": "t",
761
+ "ԏ": "t",
762
+ "Ԛ": "q",
763
+ "ԛ": "q",
764
+ "Ԝ": "w",
765
+ "ԝ": "w"
766
+ };
767
+ });
768
+
769
+ // src/util/string-util.ts
770
+ function toUnix(targetStr) {
771
+ let result2 = "";
772
+ for (const char of targetStr) {
773
+ const mapped = specialCharMap[char];
774
+ result2 += mapped !== undefined ? mapped : char;
775
+ }
776
+ result2 = result2.toLowerCase();
777
+ result2 = result2.replace(/[^a-z0-9\-:_]/g, "-");
778
+ result2 = result2.replace(/^_/, ":_");
779
+ result2 = result2.replace(/(?<!:)_/g, "-");
780
+ result2 = result2.replace(/^-*/, "");
781
+ result2 = result2.replace(/-*$/, "");
782
+ result2 = result2.replace(/-{2,}/g, "-");
783
+ result2 = result2.replace(/:{2,}/g, ":");
784
+ result2 = result2.replace(/:-/g, ":");
785
+ result2 = result2.replace(/-:/g, ":");
786
+ result2 = result2.replace(/_-/g, "_");
787
+ result2 = result2.replace(/-_/g, "_");
788
+ result2 = result2.replace(/^:/, "");
789
+ result2 = result2.replace(/:$/, "");
790
+ return result2;
791
+ }
792
+ var init_string_util = __esm(() => {
793
+ init_char_table();
794
+ });
795
+
796
+ // src/module/user/user-collection.ts
797
+ var UserCollection;
798
+ var init_user_collection = __esm(() => {
799
+ UserCollection = class UserCollection extends Array {
800
+ constructor(users) {
801
+ super();
802
+ if (users) {
803
+ this.push(...users);
804
+ }
805
+ }
806
+ findByName(name) {
807
+ const lowerName = name.toLowerCase();
808
+ for (const user of this) {
809
+ if (user && user.name.toLowerCase() === lowerName) {
810
+ return user;
811
+ }
812
+ }
813
+ return;
814
+ }
815
+ findById(id) {
816
+ for (const user of this) {
817
+ if (user && user.id === id) {
818
+ return user;
819
+ }
820
+ }
821
+ return;
822
+ }
823
+ filterNonNull() {
824
+ return this.filter((user) => user !== null);
825
+ }
826
+ };
827
+ });
828
+
829
+ // src/module/user/user.ts
830
+ import * as cheerio from "cheerio";
831
+ import pLimit2 from "p-limit";
832
+
833
+ class User {
834
+ client;
835
+ id;
836
+ name;
837
+ displayName;
838
+ avatarUrl;
839
+ unixName;
840
+ ip = null;
841
+ userType = "user";
842
+ constructor(client, data) {
843
+ this.client = client;
844
+ this.id = data.id;
845
+ this.name = data.name;
846
+ this.displayName = data.displayName ?? null;
847
+ this.avatarUrl = data.avatarUrl ?? `https://www.wikidot.com/avatar.php?userid=${data.id}`;
848
+ this.unixName = data.unixName ?? toUnix(data.name);
849
+ }
850
+ static fromName(client, name) {
851
+ return fromPromise((async () => {
852
+ const unixName = toUnix(name);
853
+ const url = `https://www.wikidot.com/user:info/${unixName}`;
854
+ const response = await fetch(url);
855
+ if (!response.ok) {
856
+ throw new UnexpectedError(`Failed to fetch user info: ${response.status}`);
857
+ }
858
+ const html = await response.text();
859
+ const $ = cheerio.load(html);
860
+ if ($("div.error-block").length > 0) {
861
+ return null;
862
+ }
863
+ const userIdElem = $("a.btn.btn-default.btn-xs");
864
+ if (userIdElem.length === 0) {
865
+ throw new NoElementError("User ID element not found");
866
+ }
867
+ const href = userIdElem.attr("href");
868
+ if (!href) {
869
+ throw new NoElementError("User ID href not found");
870
+ }
871
+ const userId = Number.parseInt(href.split("/").pop() ?? "0", 10);
872
+ const nameElem = $("h1.profile-title");
873
+ if (nameElem.length === 0) {
874
+ throw new NoElementError("User name element not found");
875
+ }
876
+ const userName = nameElem.text().trim();
877
+ return new User(client, {
878
+ id: userId,
879
+ name: userName,
880
+ unixName
881
+ });
882
+ })(), (error) => {
883
+ if (error instanceof NotFoundException || error instanceof NoElementError) {
884
+ return error;
885
+ }
886
+ return new UnexpectedError(`Failed to get user: ${String(error)}`);
887
+ });
888
+ }
889
+ static fromNames(client, names) {
890
+ return fromPromise((async () => {
891
+ const limit = pLimit2(DEFAULT_AMC_CONFIG.semaphoreLimit);
892
+ const results = await Promise.all(names.map((name) => limit(async () => {
893
+ const result2 = await User.fromName(client, name);
894
+ return result2.isOk() ? result2.value : null;
895
+ })));
896
+ return new UserCollection(results);
897
+ })(), (error) => new UnexpectedError(`Failed to get users: ${String(error)}`));
898
+ }
899
+ isUser() {
900
+ return true;
901
+ }
902
+ isDeletedUser() {
903
+ return false;
904
+ }
905
+ isAnonymousUser() {
906
+ return false;
907
+ }
908
+ isGuestUser() {
909
+ return false;
910
+ }
911
+ isWikidotUser() {
912
+ return false;
913
+ }
914
+ toString() {
915
+ return `User(id=${this.id}, name=${this.name}, unixName=${this.unixName})`;
916
+ }
917
+ }
918
+ var init_user = __esm(() => {
919
+ init_errors();
920
+ init_types();
921
+ init_amc_config();
922
+ init_string_util();
923
+ init_user_collection();
924
+ });
925
+
926
+ // src/module/user/wikidot-user.ts
927
+ class WikidotUser {
928
+ client;
929
+ id = 0;
930
+ name = "Wikidot";
931
+ unixName = "wikidot";
932
+ avatarUrl = null;
933
+ ip = null;
934
+ userType = "wikidot";
935
+ constructor(client) {
936
+ this.client = client;
937
+ }
938
+ isUser() {
939
+ return false;
940
+ }
941
+ isDeletedUser() {
942
+ return false;
943
+ }
944
+ isAnonymousUser() {
945
+ return false;
946
+ }
947
+ isGuestUser() {
948
+ return false;
949
+ }
950
+ isWikidotUser() {
951
+ return true;
952
+ }
953
+ toString() {
954
+ return `WikidotUser(name=${this.name}, unixName=${this.unixName})`;
955
+ }
956
+ }
957
+
958
+ // src/module/user/index.ts
959
+ var init_user2 = __esm(() => {
960
+ init_user();
961
+ init_user_collection();
962
+ });
963
+
964
+ // src/util/parser/user.ts
965
+ function parseUser(client, elem) {
966
+ const classAttr = elem.attr("class") ?? "";
967
+ const classes = classAttr.split(/\s+/);
968
+ if (classes.includes("deleted")) {
969
+ const dataId = elem.attr("data-id");
970
+ const userId2 = dataId ? Number.parseInt(dataId, 10) : 0;
971
+ return new DeletedUser(client, userId2);
972
+ }
973
+ const text = elem.text().trim();
974
+ if (text === "(user deleted)") {
975
+ return new DeletedUser(client, 0);
976
+ }
977
+ if (classes.includes("anonymous")) {
978
+ const ipElem = elem.find("span.ip");
979
+ if (ipElem.length > 0) {
980
+ const ip = ipElem.text().replace(/[()]/g, "").trim();
981
+ return new AnonymousUser(client, ip);
982
+ }
983
+ return new AnonymousUser(client, "");
984
+ }
985
+ const imgElem = elem.find("img");
986
+ if (imgElem.length > 0) {
987
+ const src = imgElem.attr("src") ?? "";
988
+ if (src.includes("gravatar.com")) {
989
+ const guestName = text.split(" ")[0] ?? "Guest";
990
+ return new GuestUser(client, guestName, src);
991
+ }
992
+ }
993
+ if (text === "Wikidot") {
994
+ return new WikidotUser(client);
995
+ }
996
+ const links = elem.find("a");
997
+ if (links.length === 0) {
998
+ return new DeletedUser(client, 0);
999
+ }
1000
+ const userLink = links.last();
1001
+ const userName = userLink.text().trim();
1002
+ const href = userLink.attr("href") ?? "";
1003
+ const onclick = userLink.attr("onclick") ?? "";
1004
+ const unixName = href.replace(/^.*\/user:info\//, "").replace(/\/$/, "");
1005
+ const userIdMatch = onclick.match(/userInfo\((\d+)\)/);
1006
+ const userId = userIdMatch?.[1] ? Number.parseInt(userIdMatch[1], 10) : 0;
1007
+ const avatarUrl = userId > 0 ? `http://www.wikidot.com/avatar.php?userid=${userId}` : undefined;
1008
+ return new User(client, {
1009
+ id: userId,
1010
+ name: userName,
1011
+ unixName,
1012
+ avatarUrl
1013
+ });
1014
+ }
1015
+ function parseOdate(elem) {
1016
+ const classAttr = elem.attr("class") ?? "";
1017
+ const timeMatch = classAttr.match(/time_(\d+)/);
1018
+ if (timeMatch?.[1]) {
1019
+ const unixTime = Number.parseInt(timeMatch[1], 10);
1020
+ return new Date(unixTime * 1000);
1021
+ }
1022
+ const text = elem.text().trim();
1023
+ const parsed = Date.parse(text);
1024
+ if (!Number.isNaN(parsed)) {
1025
+ return new Date(parsed);
1026
+ }
1027
+ logger.warn(`Failed to parse odate element: class="${classAttr}", text="${text}"`);
1028
+ return null;
1029
+ }
1030
+ var init_user3 = __esm(() => {
1031
+ init_logger();
1032
+ init_user2();
1033
+ });
1034
+
1035
+ // src/util/parser/index.ts
1036
+ var init_parser = __esm(() => {
1037
+ init_user3();
1038
+ });
1039
+
1040
+ // src/common/decorators.ts
1041
+ function getClientRef(obj) {
1042
+ if (obj.client)
1043
+ return obj.client;
1044
+ if (obj.site?.client)
1045
+ return obj.site.client;
1046
+ if (obj.thread?.site?.client)
1047
+ return obj.thread.site.client;
1048
+ return null;
1049
+ }
1050
+ function RequireLogin(target, _context) {
1051
+ return function(...args) {
1052
+ const clientRef = getClientRef(this);
1053
+ if (!clientRef) {
1054
+ return wdErrAsync(new LoginRequiredError("Client reference not found"));
1055
+ }
1056
+ const loginResult = clientRef.requireLogin();
1057
+ if (loginResult.isErr()) {
1058
+ return fromPromise(Promise.reject(loginResult.error), () => new LoginRequiredError("Login required"));
1059
+ }
1060
+ return target.call(this, ...args);
1061
+ };
1062
+ }
1063
+ var init_decorators = __esm(() => {
1064
+ init_errors();
1065
+ init_types();
1066
+ });
1067
+
1068
+ // src/module/forum/forum-post.ts
1069
+ import * as cheerio3 from "cheerio";
1070
+ var ForumPost, ForumPostCollection;
1071
+ var init_forum_post = __esm(() => {
1072
+ init_decorators();
1073
+ init_errors();
1074
+ init_types();
1075
+ init_parser();
1076
+ ForumPost = class ForumPost {
1077
+ thread;
1078
+ id;
1079
+ title;
1080
+ text;
1081
+ element;
1082
+ createdBy;
1083
+ createdAt;
1084
+ editedBy;
1085
+ editedAt;
1086
+ _parentId;
1087
+ _source = null;
1088
+ constructor(data) {
1089
+ this.thread = data.thread;
1090
+ this.id = data.id;
1091
+ this.title = data.title;
1092
+ this.text = data.text;
1093
+ this.element = data.element;
1094
+ this.createdBy = data.createdBy;
1095
+ this.createdAt = data.createdAt;
1096
+ this.editedBy = data.editedBy ?? null;
1097
+ this.editedAt = data.editedAt ?? null;
1098
+ this._parentId = data.parentId ?? null;
1099
+ }
1100
+ get parentId() {
1101
+ return this._parentId;
1102
+ }
1103
+ getSource() {
1104
+ if (this._source !== null) {
1105
+ return fromPromise(Promise.resolve(this._source), (e) => new UnexpectedError(String(e)));
1106
+ }
1107
+ return fromPromise((async () => {
1108
+ const result2 = await this.thread.site.amcRequest([
1109
+ {
1110
+ moduleName: "forum/sub/ForumEditPostFormModule",
1111
+ threadId: this.thread.id,
1112
+ postId: this.id
1113
+ }
1114
+ ]);
1115
+ if (result2.isErr()) {
1116
+ throw result2.error;
1117
+ }
1118
+ const response = result2.value[0];
1119
+ if (!response) {
1120
+ throw new NoElementError("Empty response");
1121
+ }
1122
+ const $ = cheerio3.load(String(response.body ?? ""));
1123
+ const sourceElem = $("textarea[name='source']");
1124
+ if (sourceElem.length === 0) {
1125
+ throw new NoElementError("Source textarea not found");
1126
+ }
1127
+ this._source = sourceElem.text();
1128
+ return this._source;
1129
+ })(), (error) => {
1130
+ if (error instanceof NoElementError)
1131
+ return error;
1132
+ return new UnexpectedError(`Failed to get post source: ${String(error)}`);
1133
+ });
1134
+ }
1135
+ edit(source, title) {
1136
+ return fromPromise((async () => {
1137
+ const formResult = await this.thread.site.amcRequest([
1138
+ {
1139
+ moduleName: "forum/sub/ForumEditPostFormModule",
1140
+ threadId: this.thread.id,
1141
+ postId: this.id
1142
+ }
1143
+ ]);
1144
+ if (formResult.isErr()) {
1145
+ throw formResult.error;
1146
+ }
1147
+ const formResponse = formResult.value[0];
1148
+ if (!formResponse) {
1149
+ throw new NoElementError("Empty form response");
1150
+ }
1151
+ const $ = cheerio3.load(String(formResponse.body ?? ""));
1152
+ const revisionInput = $("input[name='currentRevisionId']");
1153
+ if (revisionInput.length === 0) {
1154
+ throw new NoElementError("Current revision ID input not found");
1155
+ }
1156
+ const revisionValue = revisionInput.val();
1157
+ const currentRevisionId = Number.parseInt(String(revisionValue ?? ""), 10);
1158
+ if (Number.isNaN(currentRevisionId)) {
1159
+ throw new NoElementError("Invalid revision ID value");
1160
+ }
1161
+ const editResult = await this.thread.site.amcRequest([
1162
+ {
1163
+ action: "ForumAction",
1164
+ event: "saveEditPost",
1165
+ moduleName: "Empty",
1166
+ postId: this.id,
1167
+ currentRevisionId,
1168
+ title: title ?? this.title,
1169
+ source
1170
+ }
1171
+ ]);
1172
+ if (editResult.isErr()) {
1173
+ throw editResult.error;
1174
+ }
1175
+ if (title !== undefined) {
1176
+ this.title = title;
1177
+ }
1178
+ this._source = source;
1179
+ })(), (error) => {
1180
+ if (error instanceof NoElementError || error instanceof LoginRequiredError) {
1181
+ return error;
1182
+ }
1183
+ return new UnexpectedError(`Failed to edit post: ${String(error)}`);
1184
+ });
1185
+ }
1186
+ toString() {
1187
+ return `ForumPost(id=${this.id}, title=${this.title})`;
1188
+ }
1189
+ };
1190
+ __legacyDecorateClassTS([
1191
+ RequireLogin
1192
+ ], ForumPost.prototype, "edit", null);
1193
+ ForumPostCollection = class ForumPostCollection extends Array {
1194
+ thread;
1195
+ constructor(thread, posts) {
1196
+ super();
1197
+ this.thread = thread;
1198
+ if (posts) {
1199
+ this.push(...posts);
1200
+ }
1201
+ }
1202
+ findById(id) {
1203
+ return this.find((post) => post.id === id);
1204
+ }
1205
+ static _parse(thread, $) {
1206
+ const posts = [];
1207
+ $("div.post").each((_i, postElem) => {
1208
+ const $post = $(postElem);
1209
+ const postIdAttr = $post.attr("id");
1210
+ if (!postIdAttr)
1211
+ return;
1212
+ const postId = Number.parseInt(postIdAttr.replace("post-", ""), 10);
1213
+ if (Number.isNaN(postId))
1214
+ return;
1215
+ let parentId = null;
1216
+ const $parentContainer = $post.parent();
1217
+ if ($parentContainer.length > 0) {
1218
+ const $grandparent = $parentContainer.parent();
1219
+ if ($grandparent.length > 0 && $grandparent[0]?.name !== "body") {
1220
+ const grandparentClasses = $grandparent.attr("class") ?? "";
1221
+ if (grandparentClasses.includes("post-container")) {
1222
+ const $parentPost = $grandparent.find("> div.post");
1223
+ if ($parentPost.length > 0) {
1224
+ const parentPostIdAttr = $parentPost.attr("id");
1225
+ if (parentPostIdAttr) {
1226
+ parentId = Number.parseInt(parentPostIdAttr.replace("post-", ""), 10);
1227
+ }
1228
+ }
1229
+ }
1230
+ }
1231
+ }
1232
+ const $wrapper = $post.find("div.long");
1233
+ if ($wrapper.length === 0)
1234
+ return;
1235
+ const $head = $wrapper.find("div.head");
1236
+ if ($head.length === 0)
1237
+ return;
1238
+ const $title = $head.find("div.title");
1239
+ const title = $title.text().trim();
1240
+ const $content = $wrapper.find("div.content");
1241
+ const text = $content.html() ?? "";
1242
+ const $info = $head.find("div.info");
1243
+ if ($info.length === 0)
1244
+ return;
1245
+ const $userElem = $info.find("span.printuser");
1246
+ if ($userElem.length === 0)
1247
+ return;
1248
+ const createdBy = parseUser(thread.site.client, $userElem);
1249
+ const $odateElem = $info.find("span.odate");
1250
+ if ($odateElem.length === 0)
1251
+ return;
1252
+ const createdAt = parseOdate($odateElem) ?? new Date;
1253
+ let editedBy = null;
1254
+ let editedAt = null;
1255
+ const $changes = $wrapper.find("div.changes");
1256
+ if ($changes.length > 0) {
1257
+ const $editUserElem = $changes.find("span.printuser");
1258
+ const $editOdateElem = $changes.find("span.odate");
1259
+ if ($editUserElem.length > 0 && $editOdateElem.length > 0) {
1260
+ editedBy = parseUser(thread.site.client, $editUserElem);
1261
+ editedAt = parseOdate($editOdateElem);
1262
+ }
1263
+ }
1264
+ posts.push(new ForumPost({
1265
+ thread,
1266
+ id: postId,
1267
+ title,
1268
+ text,
1269
+ element: postElem,
1270
+ createdBy,
1271
+ createdAt,
1272
+ editedBy,
1273
+ editedAt,
1274
+ parentId
1275
+ }));
1276
+ });
1277
+ return posts;
1278
+ }
1279
+ static acquireAllInThread(thread) {
1280
+ return fromPromise((async () => {
1281
+ const posts = [];
1282
+ const firstResult = await thread.site.amcRequest([
1283
+ {
1284
+ moduleName: "forum/ForumViewThreadPostsModule",
1285
+ pageNo: "1",
1286
+ t: String(thread.id)
1287
+ }
1288
+ ]);
1289
+ if (firstResult.isErr()) {
1290
+ throw firstResult.error;
1291
+ }
1292
+ const firstResponse = firstResult.value[0];
1293
+ if (!firstResponse) {
1294
+ throw new NoElementError("Empty response");
1295
+ }
1296
+ const firstBody = String(firstResponse.body ?? "");
1297
+ const $first = cheerio3.load(firstBody);
1298
+ posts.push(...ForumPostCollection._parse(thread, $first));
1299
+ const $pager = $first("div.pager");
1300
+ if ($pager.length === 0) {
1301
+ return new ForumPostCollection(thread, posts);
1302
+ }
1303
+ const $pagerTargets = $pager.find("span.target");
1304
+ if ($pagerTargets.length < 2) {
1305
+ return new ForumPostCollection(thread, posts);
1306
+ }
1307
+ const lastPageText = $pagerTargets.eq($pagerTargets.length - 2).text().trim();
1308
+ const lastPage = Number.parseInt(lastPageText, 10);
1309
+ if (Number.isNaN(lastPage) || lastPage <= 1) {
1310
+ return new ForumPostCollection(thread, posts);
1311
+ }
1312
+ const bodies = [];
1313
+ for (let page = 2;page <= lastPage; page++) {
1314
+ bodies.push({
1315
+ moduleName: "forum/ForumViewThreadPostsModule",
1316
+ pageNo: String(page),
1317
+ t: String(thread.id)
1318
+ });
1319
+ }
1320
+ const additionalResults = await thread.site.amcRequest(bodies);
1321
+ if (additionalResults.isErr()) {
1322
+ throw additionalResults.error;
1323
+ }
1324
+ for (const response of additionalResults.value) {
1325
+ const body = String(response?.body ?? "");
1326
+ const $ = cheerio3.load(body);
1327
+ posts.push(...ForumPostCollection._parse(thread, $));
1328
+ }
1329
+ return new ForumPostCollection(thread, posts);
1330
+ })(), (error) => {
1331
+ if (error instanceof NoElementError)
1332
+ return error;
1333
+ return new UnexpectedError(`Failed to acquire posts: ${String(error)}`);
1334
+ });
1335
+ }
1336
+ };
1337
+ });
1338
+
1339
+ // src/module/forum/forum-thread.ts
1340
+ import * as cheerio4 from "cheerio";
1341
+ var ForumThread, ForumThreadCollection;
1342
+ var init_forum_thread = __esm(() => {
1343
+ init_decorators();
1344
+ init_errors();
1345
+ init_types();
1346
+ init_parser();
1347
+ init_forum_post();
1348
+ ForumThread = class ForumThread {
1349
+ site;
1350
+ id;
1351
+ title;
1352
+ description;
1353
+ createdBy;
1354
+ createdAt;
1355
+ postCount;
1356
+ category;
1357
+ _posts = null;
1358
+ constructor(data) {
1359
+ this.site = data.site;
1360
+ this.id = data.id;
1361
+ this.title = data.title;
1362
+ this.description = data.description;
1363
+ this.createdBy = data.createdBy;
1364
+ this.createdAt = data.createdAt;
1365
+ this.postCount = data.postCount;
1366
+ this.category = data.category ?? null;
1367
+ }
1368
+ getUrl() {
1369
+ return `${this.site.getBaseUrl()}/forum/t-${this.id}/`;
1370
+ }
1371
+ getPosts() {
1372
+ if (this._posts !== null) {
1373
+ return fromPromise(Promise.resolve(this._posts), (e) => new UnexpectedError(String(e)));
1374
+ }
1375
+ return ForumPostCollection.acquireAllInThread(this);
1376
+ }
1377
+ reply(source, title = "", parentPostId = null) {
1378
+ return fromPromise((async () => {
1379
+ const result2 = await this.site.amcRequest([
1380
+ {
1381
+ threadId: String(this.id),
1382
+ parentId: parentPostId !== null ? String(parentPostId) : "",
1383
+ title,
1384
+ source,
1385
+ action: "ForumAction",
1386
+ event: "savePost",
1387
+ moduleName: "Empty"
1388
+ }
1389
+ ]);
1390
+ if (result2.isErr()) {
1391
+ throw result2.error;
1392
+ }
1393
+ this._posts = null;
1394
+ this.postCount += 1;
1395
+ return this;
1396
+ })(), (error) => new UnexpectedError(`Failed to reply: ${String(error)}`));
1397
+ }
1398
+ toString() {
1399
+ return `ForumThread(id=${this.id}, title=${this.title})`;
1400
+ }
1401
+ static getFromId(site, threadId, category = null) {
1402
+ return fromPromise((async () => {
1403
+ const result2 = await ForumThreadCollection.acquireFromThreadIds(site, [threadId], category);
1404
+ if (result2.isErr()) {
1405
+ throw result2.error;
1406
+ }
1407
+ const thread = result2.value[0];
1408
+ if (!thread) {
1409
+ throw new NoElementError(`Thread not found: ${threadId}`);
1410
+ }
1411
+ return thread;
1412
+ })(), (error) => {
1413
+ if (error instanceof NoElementError)
1414
+ return error;
1415
+ return new UnexpectedError(`Failed to get thread: ${String(error)}`);
1416
+ });
1417
+ }
1418
+ };
1419
+ __legacyDecorateClassTS([
1420
+ RequireLogin
1421
+ ], ForumThread.prototype, "reply", null);
1422
+ ForumThreadCollection = class ForumThreadCollection extends Array {
1423
+ site;
1424
+ constructor(site, threads) {
1425
+ super();
1426
+ this.site = site;
1427
+ if (threads) {
1428
+ this.push(...threads);
1429
+ }
1430
+ }
1431
+ findById(id) {
1432
+ return this.find((thread) => thread.id === id);
1433
+ }
1434
+ static acquireAllInCategory(category) {
1435
+ return fromPromise((async () => {
1436
+ const threads = [];
1437
+ const firstResult = await category.site.amcRequest([
1438
+ {
1439
+ p: 1,
1440
+ c: category.id,
1441
+ moduleName: "forum/ForumViewCategoryModule"
1442
+ }
1443
+ ]);
1444
+ if (firstResult.isErr()) {
1445
+ throw firstResult.error;
1446
+ }
1447
+ const firstResponse = firstResult.value[0];
1448
+ if (!firstResponse) {
1449
+ throw new NoElementError("Empty response");
1450
+ }
1451
+ const firstBody = String(firstResponse.body ?? "");
1452
+ const $first = cheerio4.load(firstBody);
1453
+ $first("table.table tr.head~tr").each((_i, elem) => {
1454
+ const $row = $first(elem);
1455
+ const titleElem = $row.find("div.title a");
1456
+ const href = titleElem.attr("href") ?? "";
1457
+ const threadIdMatch = href.match(/t-(\d+)/);
1458
+ if (!threadIdMatch?.[1])
1459
+ return;
1460
+ const threadId = Number.parseInt(threadIdMatch[1], 10);
1461
+ const title = titleElem.text().trim();
1462
+ const description = $row.find("div.description").text().trim();
1463
+ const postCount = Number.parseInt($row.find("td.posts").text().trim(), 10) || 0;
1464
+ const $userElem = $row.find("td.started span.printuser");
1465
+ const $odateElem = $row.find("td.started span.odate");
1466
+ const createdBy = $userElem.length > 0 ? parseUser(category.site.client, $userElem) : null;
1467
+ const createdAt = $odateElem.length > 0 ? parseOdate($odateElem) ?? new Date : new Date;
1468
+ threads.push(new ForumThread({
1469
+ site: category.site,
1470
+ id: threadId,
1471
+ title,
1472
+ description,
1473
+ createdBy,
1474
+ createdAt,
1475
+ postCount,
1476
+ category
1477
+ }));
1478
+ });
1479
+ const pager = $first("div.pager");
1480
+ if (pager.length === 0) {
1481
+ return new ForumThreadCollection(category.site, threads);
1482
+ }
1483
+ const pagerLinks = pager.find("a");
1484
+ if (pagerLinks.length < 2) {
1485
+ return new ForumThreadCollection(category.site, threads);
1486
+ }
1487
+ const lastPageLink = pagerLinks[pagerLinks.length - 2];
1488
+ const lastPageText = lastPageLink ? $first(lastPageLink).text().trim() : "1";
1489
+ const lastPage = Number.parseInt(lastPageText, 10) || 1;
1490
+ if (lastPage <= 1) {
1491
+ return new ForumThreadCollection(category.site, threads);
1492
+ }
1493
+ const bodies = [];
1494
+ for (let page = 2;page <= lastPage; page++) {
1495
+ bodies.push({
1496
+ p: page,
1497
+ c: category.id,
1498
+ moduleName: "forum/ForumViewCategoryModule"
1499
+ });
1500
+ }
1501
+ const additionalResults = await category.site.amcRequest(bodies);
1502
+ if (additionalResults.isErr()) {
1503
+ throw additionalResults.error;
1504
+ }
1505
+ for (const response of additionalResults.value) {
1506
+ const body = String(response?.body ?? "");
1507
+ const $ = cheerio4.load(body);
1508
+ $("table.table tr.head~tr").each((_i, elem) => {
1509
+ const $row = $(elem);
1510
+ const titleElem = $row.find("div.title a");
1511
+ const href = titleElem.attr("href") ?? "";
1512
+ const threadIdMatch = href.match(/t-(\d+)/);
1513
+ if (!threadIdMatch?.[1])
1514
+ return;
1515
+ const threadId = Number.parseInt(threadIdMatch[1], 10);
1516
+ const title = titleElem.text().trim();
1517
+ const description = $row.find("div.description").text().trim();
1518
+ const postCount = Number.parseInt($row.find("td.posts").text().trim(), 10) || 0;
1519
+ const $userElem = $row.find("td.started span.printuser");
1520
+ const $odateElem = $row.find("td.started span.odate");
1521
+ const createdBy = $userElem.length > 0 ? parseUser(category.site.client, $userElem) : null;
1522
+ const createdAt = $odateElem.length > 0 ? parseOdate($odateElem) ?? new Date : new Date;
1523
+ threads.push(new ForumThread({
1524
+ site: category.site,
1525
+ id: threadId,
1526
+ title,
1527
+ description,
1528
+ createdBy,
1529
+ createdAt,
1530
+ postCount,
1531
+ category
1532
+ }));
1533
+ });
1534
+ }
1535
+ return new ForumThreadCollection(category.site, threads);
1536
+ })(), (error) => {
1537
+ if (error instanceof NoElementError)
1538
+ return error;
1539
+ return new UnexpectedError(`Failed to acquire threads: ${String(error)}`);
1540
+ });
1541
+ }
1542
+ static fromId(site, threadId) {
1543
+ return fromPromise((async () => {
1544
+ const result2 = await ForumThreadCollection.acquireFromThreadIds(site, [threadId]);
1545
+ if (result2.isErr()) {
1546
+ throw result2.error;
1547
+ }
1548
+ const thread = result2.value[0];
1549
+ if (!thread) {
1550
+ throw new NoElementError(`Thread not found: ${threadId}`);
1551
+ }
1552
+ return thread;
1553
+ })(), (error) => {
1554
+ if (error instanceof NoElementError)
1555
+ return error;
1556
+ return new UnexpectedError(`Failed to get thread: ${String(error)}`);
1557
+ });
1558
+ }
1559
+ static acquireFromThreadIds(site, threadIds, category = null) {
1560
+ return fromPromise((async () => {
1561
+ const result2 = await site.amcRequest(threadIds.map((threadId) => ({
1562
+ t: threadId,
1563
+ moduleName: "forum/ForumViewThreadModule"
1564
+ })));
1565
+ if (result2.isErr()) {
1566
+ throw result2.error;
1567
+ }
1568
+ const threads = [];
1569
+ for (let i = 0;i < threadIds.length; i++) {
1570
+ const response = result2.value[i];
1571
+ const threadId = threadIds[i];
1572
+ if (!response || !threadId)
1573
+ continue;
1574
+ const body = String(response.body ?? "");
1575
+ const $ = cheerio4.load(body);
1576
+ const bcElem = $("div.forum-breadcrumbs");
1577
+ if (bcElem.length === 0) {
1578
+ throw new NoElementError("Breadcrumbs not found");
1579
+ }
1580
+ const bcParts = bcElem.text().split("»");
1581
+ const title = bcParts.length > 0 ? bcParts[bcParts.length - 1]?.trim() ?? "" : "";
1582
+ const descBlockElem = $("div.description-block");
1583
+ const description = descBlockElem.text().trim();
1584
+ const postCountMatch = $("div.statistics").text().match(/(\d+)/);
1585
+ const postCount = postCountMatch?.[1] ? Number.parseInt(postCountMatch[1], 10) : 0;
1586
+ threads.push(new ForumThread({
1587
+ site,
1588
+ id: threadId,
1589
+ title,
1590
+ description,
1591
+ createdBy: null,
1592
+ createdAt: new Date,
1593
+ postCount,
1594
+ category
1595
+ }));
1596
+ }
1597
+ return new ForumThreadCollection(site, threads);
1598
+ })(), (error) => {
1599
+ if (error instanceof NoElementError)
1600
+ return error;
1601
+ return new UnexpectedError(`Failed to acquire threads: ${String(error)}`);
1602
+ });
1603
+ }
1604
+ };
1605
+ });
1606
+
1607
+ // src/module/forum/forum-category.ts
1608
+ import * as cheerio5 from "cheerio";
1609
+ var ForumCategory, ForumCategoryCollection;
1610
+ var init_forum_category = __esm(() => {
1611
+ init_decorators();
1612
+ init_errors();
1613
+ init_types();
1614
+ init_forum_thread();
1615
+ ForumCategory = class ForumCategory {
1616
+ site;
1617
+ id;
1618
+ title;
1619
+ description;
1620
+ threadsCount;
1621
+ postsCount;
1622
+ _threads = null;
1623
+ constructor(data) {
1624
+ this.site = data.site;
1625
+ this.id = data.id;
1626
+ this.title = data.title;
1627
+ this.description = data.description;
1628
+ this.threadsCount = data.threadsCount;
1629
+ this.postsCount = data.postsCount;
1630
+ }
1631
+ getThreads() {
1632
+ if (this._threads !== null) {
1633
+ return fromPromise(Promise.resolve(this._threads), (e) => new UnexpectedError(String(e)));
1634
+ }
1635
+ return fromPromise((async () => {
1636
+ const result2 = await ForumThreadCollection.acquireAllInCategory(this);
1637
+ if (result2.isErr()) {
1638
+ throw result2.error;
1639
+ }
1640
+ this._threads = result2.value;
1641
+ return this._threads;
1642
+ })(), (error) => new UnexpectedError(`Failed to get threads: ${String(error)}`));
1643
+ }
1644
+ reloadThreads() {
1645
+ this._threads = null;
1646
+ return this.getThreads();
1647
+ }
1648
+ createThread(title, description, source) {
1649
+ return fromPromise((async () => {
1650
+ const result2 = await this.site.amcRequest([
1651
+ {
1652
+ moduleName: "Empty",
1653
+ action: "ForumAction",
1654
+ event: "newThread",
1655
+ category_id: this.id,
1656
+ title,
1657
+ description,
1658
+ source
1659
+ }
1660
+ ]);
1661
+ if (result2.isErr()) {
1662
+ throw result2.error;
1663
+ }
1664
+ const response = result2.value[0];
1665
+ if (!response || typeof response.threadId !== "number") {
1666
+ throw new NoElementError("Thread ID not found in response");
1667
+ }
1668
+ const threadId = response.threadId;
1669
+ const threadResult = await ForumThread.getFromId(this.site, threadId, this);
1670
+ if (threadResult.isErr()) {
1671
+ throw threadResult.error;
1672
+ }
1673
+ return threadResult.value;
1674
+ })(), (error) => {
1675
+ if (error instanceof NoElementError || error instanceof LoginRequiredError) {
1676
+ return error;
1677
+ }
1678
+ return new UnexpectedError(`Failed to create thread: ${String(error)}`);
1679
+ });
1680
+ }
1681
+ toString() {
1682
+ return `ForumCategory(id=${this.id}, title=${this.title})`;
1683
+ }
1684
+ };
1685
+ __legacyDecorateClassTS([
1686
+ RequireLogin
1687
+ ], ForumCategory.prototype, "createThread", null);
1688
+ ForumCategoryCollection = class ForumCategoryCollection extends Array {
1689
+ site;
1690
+ constructor(site, categories) {
1691
+ super();
1692
+ this.site = site;
1693
+ if (categories) {
1694
+ this.push(...categories);
1695
+ }
1696
+ }
1697
+ findById(id) {
1698
+ return this.find((category) => category.id === id);
1699
+ }
1700
+ static acquireAll(site) {
1701
+ return fromPromise((async () => {
1702
+ const result2 = await site.amcRequest([
1703
+ {
1704
+ moduleName: "forum/ForumStartModule",
1705
+ hidden: "true"
1706
+ }
1707
+ ]);
1708
+ if (result2.isErr()) {
1709
+ throw result2.error;
1710
+ }
1711
+ const response = result2.value[0];
1712
+ if (!response) {
1713
+ throw new NoElementError("Empty response");
1714
+ }
1715
+ const body = String(response.body ?? "");
1716
+ const $ = cheerio5.load(body);
1717
+ const categories = [];
1718
+ $("table tr.head~tr").each((_i, row) => {
1719
+ const $row = $(row);
1720
+ const nameElem = $row.find("td.name");
1721
+ const nameLinkElem = nameElem.find("a");
1722
+ const href = nameLinkElem.attr("href") ?? "";
1723
+ const categoryIdMatch = href.match(/c-(\d+)/);
1724
+ if (!categoryIdMatch?.[1])
1725
+ return;
1726
+ const categoryId = Number.parseInt(categoryIdMatch[1], 10);
1727
+ const title = nameLinkElem.text().trim();
1728
+ const description = nameElem.find("div.description").text().trim();
1729
+ const threadsCount = Number.parseInt($row.find("td.threads").text().trim(), 10) || 0;
1730
+ const postsCount = Number.parseInt($row.find("td.posts").text().trim(), 10) || 0;
1731
+ categories.push(new ForumCategory({
1732
+ site,
1733
+ id: categoryId,
1734
+ title,
1735
+ description,
1736
+ threadsCount,
1737
+ postsCount
1738
+ }));
1739
+ });
1740
+ return new ForumCategoryCollection(site, categories);
1741
+ })(), (error) => {
1742
+ if (error instanceof NoElementError)
1743
+ return error;
1744
+ return new UnexpectedError(`Failed to acquire categories: ${String(error)}`);
1745
+ });
1746
+ }
1747
+ };
1748
+ });
1749
+
1750
+ // src/module/forum/index.ts
1751
+ var exports_forum = {};
1752
+ __export(exports_forum, {
1753
+ ForumThreadCollection: () => ForumThreadCollection,
1754
+ ForumThread: () => ForumThread,
1755
+ ForumPostCollection: () => ForumPostCollection,
1756
+ ForumPost: () => ForumPost,
1757
+ ForumCategoryCollection: () => ForumCategoryCollection,
1758
+ ForumCategory: () => ForumCategory
1759
+ });
1760
+ var init_forum = __esm(() => {
1761
+ init_forum_category();
1762
+ init_forum_post();
1763
+ init_forum_thread();
1764
+ });
1765
+
1766
+ // src/index.ts
1767
+ init_errors();
1768
+ init_logger();
1769
+ init_types();
1770
+
55
1771
  // src/connector/amc-client.ts
1772
+ init_errors();
1773
+ init_types();
1774
+ init_amc_config();
56
1775
  import ky from "ky";
57
1776
  import pLimit from "p-limit";
58
1777
 
59
- // src/connector/amc-config.ts
60
- var DEFAULT_AMC_CONFIG = {
61
- timeout: 20000,
62
- retryLimit: 3,
63
- retryInterval: 1000,
64
- maxBackoff: 60000,
65
- backoffFactor: 2,
66
- semaphoreLimit: 10
67
- };
68
- var WIKIDOT_TOKEN7 = "123456";
69
- var DEFAULT_HTTP_STATUS_CODE = 999;
70
-
71
1778
  // src/connector/amc-header.ts
72
1779
  class AMCHeader {
73
1780
  cookies;
@@ -277,7 +1984,13 @@ class AMCClient {
277
1984
  }
278
1985
  }
279
1986
  }
1987
+
1988
+ // src/connector/index.ts
1989
+ init_amc_config();
1990
+
280
1991
  // src/connector/auth.ts
1992
+ init_errors();
1993
+ init_types();
281
1994
  var LOGIN_URL = "https://www.wikidot.com/default--flow/login__LoginPopupScreen";
282
1995
  function login(client, username, password) {
283
1996
  return fromPromise((async () => {
@@ -331,7 +2044,11 @@ function logout(client) {
331
2044
  });
332
2045
  }
333
2046
  // src/module/private-message/private-message.ts
334
- import * as cheerio from "cheerio";
2047
+ init_errors();
2048
+ init_types();
2049
+ init_parser();
2050
+ import * as cheerio2 from "cheerio";
2051
+
335
2052
  class PrivateMessage {
336
2053
  client;
337
2054
  id;
@@ -351,11 +2068,11 @@ class PrivateMessage {
351
2068
  }
352
2069
  static fromId(client, messageId) {
353
2070
  return fromPromise((async () => {
354
- const result = await PrivateMessageCollection.fromIds(client, [messageId]);
355
- if (result.isErr()) {
356
- throw result.error;
2071
+ const result2 = await PrivateMessageCollection.fromIds(client, [messageId]);
2072
+ if (result2.isErr()) {
2073
+ throw result2.error;
357
2074
  }
358
- const message = result.value[0];
2075
+ const message = result2.value[0];
359
2076
  if (!message) {
360
2077
  throw new NoElementError(`Message not found: ${messageId}`);
361
2078
  }
@@ -373,7 +2090,7 @@ class PrivateMessage {
373
2090
  return fromPromise(Promise.reject(loginResult.error), () => new LoginRequiredError("Login required to send message"));
374
2091
  }
375
2092
  return fromPromise((async () => {
376
- const result = await client.amcClient.request([
2093
+ const result2 = await client.amcClient.request([
377
2094
  {
378
2095
  source: body,
379
2096
  subject,
@@ -383,8 +2100,8 @@ class PrivateMessage {
383
2100
  moduleName: "Empty"
384
2101
  }
385
2102
  ]);
386
- if (result.isErr()) {
387
- throw result.error;
2103
+ if (result2.isErr()) {
2104
+ throw result2.error;
388
2105
  }
389
2106
  })(), (error) => new UnexpectedError(`Failed to send message: ${String(error)}`));
390
2107
  }
@@ -415,18 +2132,18 @@ class PrivateMessageCollection extends Array {
415
2132
  item: messageId,
416
2133
  moduleName: "dashboard/messages/DMViewMessageModule"
417
2134
  }));
418
- const result = await client.amcClient.request(bodies);
419
- if (result.isErr()) {
420
- throw result.error;
2135
+ const result2 = await client.amcClient.request(bodies);
2136
+ if (result2.isErr()) {
2137
+ throw result2.error;
421
2138
  }
422
2139
  const messages = [];
423
2140
  for (let i = 0;i < messageIds.length; i++) {
424
- const response = result.value[i];
2141
+ const response = result2.value[i];
425
2142
  const messageId = messageIds[i];
426
2143
  if (!response || messageId === undefined)
427
2144
  continue;
428
2145
  const html = String(response.body ?? "");
429
- const $ = cheerio.load(html);
2146
+ const $ = cheerio2.load(html);
430
2147
  const printuserElems = $("div.pmessage div.header span.printuser");
431
2148
  if (printuserElems.length < 2) {
432
2149
  throw new ForbiddenError(`Failed to get message: ${messageId}`);
@@ -474,7 +2191,7 @@ class PrivateMessageCollection extends Array {
474
2191
  throw new NoElementError("Empty response");
475
2192
  }
476
2193
  const firstHtml = String(firstResponse.body ?? "");
477
- const $first = cheerio.load(firstHtml);
2194
+ const $first = cheerio2.load(firstHtml);
478
2195
  const pagerTargets = $first("div.pager span.target");
479
2196
  let maxPage = 1;
480
2197
  if (pagerTargets.length > 2) {
@@ -493,7 +2210,7 @@ class PrivateMessageCollection extends Array {
493
2210
  }
494
2211
  for (const response of additionalResults.value) {
495
2212
  const html = String(response?.body ?? "");
496
- const $ = cheerio.load(html);
2213
+ const $ = cheerio2.load(html);
497
2214
  $("tr.message").each((_i, elem) => {
498
2215
  const dataHref = $(elem).attr("data-href") ?? "";
499
2216
  const idMatch = dataHref.match(/\/(\d+)$/);
@@ -528,12 +2245,12 @@ class PrivateMessageCollection extends Array {
528
2245
  class PrivateMessageInbox extends PrivateMessageCollection {
529
2246
  static acquire(client) {
530
2247
  return fromPromise((async () => {
531
- const result = await PrivateMessageCollection.acquireFromModule(client, "dashboard/messages/DMInboxModule");
532
- if (result.isErr()) {
533
- throw result.error;
2248
+ const result2 = await PrivateMessageCollection.acquireFromModule(client, "dashboard/messages/DMInboxModule");
2249
+ if (result2.isErr()) {
2250
+ throw result2.error;
534
2251
  }
535
2252
  const inbox = new PrivateMessageInbox(client);
536
- inbox.push(...result.value);
2253
+ inbox.push(...result2.value);
537
2254
  return inbox;
538
2255
  })(), (error) => {
539
2256
  if (error instanceof ForbiddenError || error instanceof LoginRequiredError) {
@@ -547,12 +2264,12 @@ class PrivateMessageInbox extends PrivateMessageCollection {
547
2264
  class PrivateMessageSentBox extends PrivateMessageCollection {
548
2265
  static acquire(client) {
549
2266
  return fromPromise((async () => {
550
- const result = await PrivateMessageCollection.acquireFromModule(client, "dashboard/messages/DMSentModule");
551
- if (result.isErr()) {
552
- throw result.error;
2267
+ const result2 = await PrivateMessageCollection.acquireFromModule(client, "dashboard/messages/DMSentModule");
2268
+ if (result2.isErr()) {
2269
+ throw result2.error;
553
2270
  }
554
2271
  const sentBox = new PrivateMessageSentBox(client);
555
- sentBox.push(...result.value);
2272
+ sentBox.push(...result2.value);
556
2273
  return sentBox;
557
2274
  })(), (error) => {
558
2275
  if (error instanceof ForbiddenError || error instanceof LoginRequiredError) {
@@ -585,6 +2302,8 @@ class PrivateMessageAccessor {
585
2302
  }
586
2303
  }
587
2304
  // src/module/site/accessors/forum-accessor.ts
2305
+ init_forum();
2306
+
588
2307
  class ForumAccessor {
589
2308
  site;
590
2309
  constructor(site) {
@@ -600,7 +2319,14 @@ class ForumAccessor {
600
2319
  return ForumThreadCollection.acquireFromThreadIds(this.site, threadIds);
601
2320
  }
602
2321
  }
2322
+ // src/module/site/accessors/member-accessor.ts
2323
+ init_decorators();
2324
+ init_errors();
2325
+ init_types();
2326
+
603
2327
  // src/util/quick-module.ts
2328
+ init_errors();
2329
+ init_types();
604
2330
  import { z as z2 } from "zod";
605
2331
  var quickModuleUserResponseSchema = z2.object({
606
2332
  users: z2.union([
@@ -694,7 +2420,11 @@ var QuickModule = {
694
2420
  };
695
2421
 
696
2422
  // src/module/site/site-application.ts
697
- import * as cheerio2 from "cheerio";
2423
+ init_decorators();
2424
+ init_errors();
2425
+ init_types();
2426
+ init_parser();
2427
+ import * as cheerio6 from "cheerio";
698
2428
  class SiteApplication {
699
2429
  site;
700
2430
  user;
@@ -710,13 +2440,13 @@ class SiteApplication {
710
2440
  return fromPromise(Promise.reject(loginResult.error), () => new LoginRequiredError("Login required to get applications"));
711
2441
  }
712
2442
  return fromPromise((async () => {
713
- const result = await site.amcRequest([
2443
+ const result2 = await site.amcRequest([
714
2444
  { moduleName: "managesite/ManageSiteMembersApplicationsModule" }
715
2445
  ]);
716
- if (result.isErr()) {
717
- throw result.error;
2446
+ if (result2.isErr()) {
2447
+ throw result2.error;
718
2448
  }
719
- const response = result.value[0];
2449
+ const response = result2.value[0];
720
2450
  if (!response) {
721
2451
  throw new UnexpectedError("Empty response");
722
2452
  }
@@ -724,7 +2454,7 @@ class SiteApplication {
724
2454
  if (html.includes("WIKIDOT.page.listeners.loginClick(event)")) {
725
2455
  throw new ForbiddenError("You are not allowed to access this page");
726
2456
  }
727
- const $ = cheerio2.load(html);
2457
+ const $ = cheerio6.load(html);
728
2458
  const applications = [];
729
2459
  const userElements = $("h3 span.printuser").toArray();
730
2460
  const textWrapperElements = $("table").toArray();
@@ -751,7 +2481,7 @@ class SiteApplication {
751
2481
  }
752
2482
  process(action) {
753
2483
  return fromPromise((async () => {
754
- const result = await this.site.amcRequest([
2484
+ const result2 = await this.site.amcRequest([
755
2485
  {
756
2486
  action: "ManageSiteMembershipAction",
757
2487
  event: "acceptApplication",
@@ -761,8 +2491,8 @@ class SiteApplication {
761
2491
  moduleName: "Empty"
762
2492
  }
763
2493
  ]);
764
- if (result.isErr()) {
765
- const error = result.error;
2494
+ if (result2.isErr()) {
2495
+ const error = result2.error;
766
2496
  if (error instanceof WikidotStatusError && error.statusCode === "no_application") {
767
2497
  throw new NotFoundException(`Application not found: ${this.user.name}`);
768
2498
  }
@@ -790,7 +2520,11 @@ __legacyDecorateClassTS([
790
2520
  ], SiteApplication.prototype, "process", null);
791
2521
 
792
2522
  // src/module/site/site-member.ts
793
- import * as cheerio3 from "cheerio";
2523
+ init_decorators();
2524
+ init_errors();
2525
+ init_types();
2526
+ init_parser();
2527
+ import * as cheerio7 from "cheerio";
794
2528
  class SiteMember {
795
2529
  site;
796
2530
  user;
@@ -801,7 +2535,7 @@ class SiteMember {
801
2535
  this.joinedAt = data.joinedAt;
802
2536
  }
803
2537
  static parse(site, html) {
804
- const $ = cheerio3.load(html);
2538
+ const $ = cheerio7.load(html);
805
2539
  const members = [];
806
2540
  $("table tr").each((_i, row) => {
807
2541
  const tds = $(row).find("td");
@@ -840,7 +2574,7 @@ class SiteMember {
840
2574
  }
841
2575
  const firstHtml = String(firstResponse.body ?? "");
842
2576
  members.push(...SiteMember.parse(site, firstHtml));
843
- const $first = cheerio3.load(firstHtml);
2577
+ const $first = cheerio7.load(firstHtml);
844
2578
  const pagerLinks = $first("div.pager a");
845
2579
  if (pagerLinks.length < 2) {
846
2580
  return members;
@@ -871,7 +2605,7 @@ class SiteMember {
871
2605
  }
872
2606
  changeGroup(event) {
873
2607
  return fromPromise((async () => {
874
- const result = await this.site.amcRequest([
2608
+ const result2 = await this.site.amcRequest([
875
2609
  {
876
2610
  action: "ManageSiteMembershipAction",
877
2611
  event,
@@ -879,8 +2613,8 @@ class SiteMember {
879
2613
  moduleName: ""
880
2614
  }
881
2615
  ]);
882
- if (result.isErr()) {
883
- const error = result.error;
2616
+ if (result2.isErr()) {
2617
+ const error = result2.error;
884
2618
  if (error instanceof WikidotStatusError) {
885
2619
  if (error.statusCode === "not_already") {
886
2620
  throw new TargetError(`User is not moderator/admin: ${this.user.name}`);
@@ -941,7 +2675,7 @@ class MemberAccessor {
941
2675
  }
942
2676
  invite(user, text) {
943
2677
  return fromPromise((async () => {
944
- const result = await this.site.amcRequest([
2678
+ const result2 = await this.site.amcRequest([
945
2679
  {
946
2680
  action: "ManageSiteMembershipAction",
947
2681
  event: "inviteMember",
@@ -950,8 +2684,8 @@ class MemberAccessor {
950
2684
  moduleName: "Empty"
951
2685
  }
952
2686
  ]);
953
- if (result.isErr()) {
954
- const error = result.error;
2687
+ if (result2.isErr()) {
2688
+ const error = result2.error;
955
2689
  if (error instanceof WikidotStatusError) {
956
2690
  if (error.statusCode === "already_invited") {
957
2691
  throw new TargetError(`User is already invited to ${this.site.unixName}: ${user.name}`);
@@ -973,12 +2707,25 @@ class MemberAccessor {
973
2707
  __legacyDecorateClassTS([
974
2708
  RequireLogin
975
2709
  ], MemberAccessor.prototype, "invite", null);
2710
+ // src/module/site/accessors/page-accessor.ts
2711
+ init_errors();
2712
+ init_types();
2713
+ init_parser();
2714
+
976
2715
  // src/module/page/page.ts
977
- import * as cheerio6 from "cheerio";
2716
+ init_decorators();
2717
+ init_errors();
2718
+ init_types();
2719
+ init_parser();
2720
+ import * as cheerio11 from "cheerio";
2721
+ import pLimit3 from "p-limit";
978
2722
  import { z as z3 } from "zod";
979
2723
 
980
2724
  // src/module/page/page-file.ts
981
- import * as cheerio4 from "cheerio";
2725
+ init_errors();
2726
+ init_types();
2727
+ import * as cheerio8 from "cheerio";
2728
+
982
2729
  class PageFile {
983
2730
  page;
984
2731
  id;
@@ -1036,21 +2783,21 @@ class PageFileCollection extends Array {
1036
2783
  }
1037
2784
  const pageId = page.id;
1038
2785
  return fromPromise((async () => {
1039
- const result = await page.site.amcRequest([
2786
+ const result2 = await page.site.amcRequest([
1040
2787
  {
1041
2788
  moduleName: "files/PageFilesModule",
1042
2789
  page_id: pageId
1043
2790
  }
1044
2791
  ]);
1045
- if (result.isErr()) {
1046
- throw result.error;
2792
+ if (result2.isErr()) {
2793
+ throw result2.error;
1047
2794
  }
1048
- const response = result.value[0];
2795
+ const response = result2.value[0];
1049
2796
  if (!response) {
1050
2797
  throw new UnexpectedError("Empty response");
1051
2798
  }
1052
2799
  const html = String(response.body ?? "");
1053
- const $ = cheerio4.load(html);
2800
+ const $ = cheerio8.load(html);
1054
2801
  const filesTable = $("table.page-files");
1055
2802
  if (filesTable.length === 0) {
1056
2803
  return new PageFileCollection(page, []);
@@ -1089,7 +2836,10 @@ class PageFileCollection extends Array {
1089
2836
  }
1090
2837
 
1091
2838
  // src/module/page/page-meta.ts
1092
- import * as cheerio5 from "cheerio";
2839
+ init_errors();
2840
+ init_types();
2841
+ import * as cheerio9 from "cheerio";
2842
+
1093
2843
  class PageMeta {
1094
2844
  page;
1095
2845
  name;
@@ -1124,21 +2874,21 @@ class PageMetaCollection extends Array {
1124
2874
  }
1125
2875
  static acquire(page) {
1126
2876
  return fromPromise((async () => {
1127
- const result = await page.site.amcRequest([
2877
+ const result2 = await page.site.amcRequest([
1128
2878
  {
1129
2879
  moduleName: "edit/EditMetaModule",
1130
2880
  page_id: page.id
1131
2881
  }
1132
2882
  ]);
1133
- if (result.isErr()) {
1134
- throw result.error;
2883
+ if (result2.isErr()) {
2884
+ throw result2.error;
1135
2885
  }
1136
- const response = result.value[0];
2886
+ const response = result2.value[0];
1137
2887
  if (!response) {
1138
2888
  throw new NoElementError("Empty response");
1139
2889
  }
1140
2890
  const html = String(response.body ?? "");
1141
- const $ = cheerio5.load(html);
2891
+ const $ = cheerio9.load(html);
1142
2892
  const metas = [];
1143
2893
  $("table.meta-table tr").each((_i, elem) => {
1144
2894
  const $row = $(elem);
@@ -1169,7 +2919,7 @@ class PageMetaCollection extends Array {
1169
2919
  return fromPromise(Promise.reject(loginResult.error), () => new LoginRequiredError("Login required to set meta tag"));
1170
2920
  }
1171
2921
  return fromPromise((async () => {
1172
- const result = await page.site.amcRequest([
2922
+ const result2 = await page.site.amcRequest([
1173
2923
  {
1174
2924
  action: "WikiPageAction",
1175
2925
  event: "saveMetaTag",
@@ -1179,8 +2929,8 @@ class PageMetaCollection extends Array {
1179
2929
  meta_content: content
1180
2930
  }
1181
2931
  ]);
1182
- if (result.isErr()) {
1183
- throw result.error;
2932
+ if (result2.isErr()) {
2933
+ throw result2.error;
1184
2934
  }
1185
2935
  })(), (error) => {
1186
2936
  if (error instanceof LoginRequiredError) {
@@ -1195,7 +2945,7 @@ class PageMetaCollection extends Array {
1195
2945
  return fromPromise(Promise.reject(loginResult.error), () => new LoginRequiredError("Login required to delete meta tag"));
1196
2946
  }
1197
2947
  return fromPromise((async () => {
1198
- const result = await page.site.amcRequest([
2948
+ const result2 = await page.site.amcRequest([
1199
2949
  {
1200
2950
  action: "WikiPageAction",
1201
2951
  event: "deleteMetaTag",
@@ -1204,8 +2954,8 @@ class PageMetaCollection extends Array {
1204
2954
  meta_name: name
1205
2955
  }
1206
2956
  ]);
1207
- if (result.isErr()) {
1208
- throw result.error;
2957
+ if (result2.isErr()) {
2958
+ throw result2.error;
1209
2959
  }
1210
2960
  })(), (error) => {
1211
2961
  if (error instanceof LoginRequiredError) {
@@ -1216,6 +2966,167 @@ class PageMetaCollection extends Array {
1216
2966
  }
1217
2967
  }
1218
2968
 
2969
+ // src/module/page/page-revision.ts
2970
+ init_errors();
2971
+ init_types();
2972
+ import * as cheerio10 from "cheerio";
2973
+
2974
+ class PageRevision {
2975
+ page;
2976
+ id;
2977
+ revNo;
2978
+ createdBy;
2979
+ createdAt;
2980
+ comment;
2981
+ _source = null;
2982
+ _html = null;
2983
+ constructor(data) {
2984
+ this.page = data.page;
2985
+ this.id = data.id;
2986
+ this.revNo = data.revNo;
2987
+ this.createdBy = data.createdBy;
2988
+ this.createdAt = data.createdAt;
2989
+ this.comment = data.comment;
2990
+ }
2991
+ isSourceAcquired() {
2992
+ return this._source !== null;
2993
+ }
2994
+ isHtmlAcquired() {
2995
+ return this._html !== null;
2996
+ }
2997
+ get source() {
2998
+ return this._source;
2999
+ }
3000
+ set source(value) {
3001
+ this._source = value;
3002
+ }
3003
+ get html() {
3004
+ return this._html;
3005
+ }
3006
+ set html(value) {
3007
+ this._html = value;
3008
+ }
3009
+ getSource() {
3010
+ return fromPromise((async () => {
3011
+ if (this._source) {
3012
+ return this._source.wikiText;
3013
+ }
3014
+ const result2 = await this.page.site.amcRequest([
3015
+ {
3016
+ moduleName: "history/PageSourceModule",
3017
+ revision_id: this.id
3018
+ }
3019
+ ]);
3020
+ if (result2.isErr()) {
3021
+ throw result2.error;
3022
+ }
3023
+ const response = result2.value[0];
3024
+ if (!response) {
3025
+ throw new NoElementError("Empty response from PageSourceModule");
3026
+ }
3027
+ const html = String(response.body ?? "");
3028
+ const $ = cheerio10.load(html);
3029
+ const sourceElem = $("div.page-source");
3030
+ if (sourceElem.length === 0) {
3031
+ throw new NoElementError("Source element not found");
3032
+ }
3033
+ const sourceText = sourceElem.text();
3034
+ return sourceText;
3035
+ })(), (error) => {
3036
+ if (error instanceof NoElementError) {
3037
+ return error;
3038
+ }
3039
+ return new UnexpectedError(`Failed to get revision source: ${String(error)}`);
3040
+ });
3041
+ }
3042
+ getHtml() {
3043
+ return fromPromise((async () => {
3044
+ if (this._html) {
3045
+ return this._html;
3046
+ }
3047
+ const result2 = await this.page.site.amcRequest([
3048
+ {
3049
+ moduleName: "history/PageVersionModule",
3050
+ revision_id: this.id
3051
+ }
3052
+ ]);
3053
+ if (result2.isErr()) {
3054
+ throw result2.error;
3055
+ }
3056
+ const response = result2.value[0];
3057
+ if (!response) {
3058
+ throw new NoElementError("Empty response from PageVersionModule");
3059
+ }
3060
+ const html = String(response.body ?? "");
3061
+ const $ = cheerio10.load(html);
3062
+ const contentElem = $("#page-content");
3063
+ if (contentElem.length === 0) {
3064
+ this._html = html;
3065
+ return html;
3066
+ }
3067
+ const contentHtml = contentElem.html() ?? "";
3068
+ this._html = contentHtml;
3069
+ return contentHtml;
3070
+ })(), (error) => {
3071
+ if (error instanceof NoElementError) {
3072
+ return error;
3073
+ }
3074
+ return new UnexpectedError(`Failed to get revision HTML: ${String(error)}`);
3075
+ });
3076
+ }
3077
+ toString() {
3078
+ return `PageRevision(id=${this.id}, revNo=${this.revNo})`;
3079
+ }
3080
+ }
3081
+
3082
+ class PageRevisionCollection extends Array {
3083
+ page;
3084
+ constructor(page, revisions) {
3085
+ super();
3086
+ this.page = page;
3087
+ if (revisions) {
3088
+ this.push(...revisions);
3089
+ }
3090
+ }
3091
+ findById(id) {
3092
+ return this.find((revision) => revision.id === id);
3093
+ }
3094
+ getSources() {
3095
+ return fromPromise((async () => {
3096
+ const results = await Promise.all(this.map(async (revision) => {
3097
+ const result2 = await revision.getSource();
3098
+ if (result2.isErr()) {
3099
+ throw result2.error;
3100
+ }
3101
+ return result2.value;
3102
+ }));
3103
+ return results;
3104
+ })(), (error) => {
3105
+ if (error instanceof NoElementError) {
3106
+ return error;
3107
+ }
3108
+ return new UnexpectedError(`Failed to get sources: ${String(error)}`);
3109
+ });
3110
+ }
3111
+ getHtmls() {
3112
+ return fromPromise((async () => {
3113
+ const results = await Promise.all(this.map(async (revision) => {
3114
+ const result2 = await revision.getHtml();
3115
+ if (result2.isErr()) {
3116
+ throw result2.error;
3117
+ }
3118
+ return result2.value;
3119
+ }));
3120
+ return results;
3121
+ })(), (error) => {
3122
+ if (error instanceof NoElementError) {
3123
+ return error;
3124
+ }
3125
+ return new UnexpectedError(`Failed to get HTMLs: ${String(error)}`);
3126
+ });
3127
+ }
3128
+ }
3129
+
1219
3130
  // src/module/page/page-source.ts
1220
3131
  class PageSource {
1221
3132
  page;
@@ -1325,59 +3236,59 @@ class SearchPagesQuery {
1325
3236
  this.wrapper = params.wrapper ?? "no";
1326
3237
  }
1327
3238
  asDict() {
1328
- const result = {};
3239
+ const result2 = {};
1329
3240
  if (this.pagetype !== "*")
1330
- result.pagetype = this.pagetype;
3241
+ result2.pagetype = this.pagetype;
1331
3242
  if (this.category !== "*")
1332
- result.category = this.category;
3243
+ result2.category = this.category;
1333
3244
  if (this.tags !== null) {
1334
- result.tags = Array.isArray(this.tags) ? this.tags.join(" ") : this.tags;
3245
+ result2.tags = Array.isArray(this.tags) ? this.tags.join(" ") : this.tags;
1335
3246
  }
1336
3247
  if (this.parent !== null)
1337
- result.parent = this.parent;
3248
+ result2.parent = this.parent;
1338
3249
  if (this.linkTo !== null)
1339
- result.link_to = this.linkTo;
3250
+ result2.link_to = this.linkTo;
1340
3251
  if (this.createdAt !== null)
1341
- result.created_at = this.createdAt;
3252
+ result2.created_at = this.createdAt;
1342
3253
  if (this.updatedAt !== null)
1343
- result.updated_at = this.updatedAt;
3254
+ result2.updated_at = this.updatedAt;
1344
3255
  if (this.createdBy !== null) {
1345
- result.created_by = typeof this.createdBy === "string" ? this.createdBy : this.createdBy.name;
3256
+ result2.created_by = typeof this.createdBy === "string" ? this.createdBy : this.createdBy.name;
1346
3257
  }
1347
3258
  if (this.rating !== null)
1348
- result.rating = this.rating;
3259
+ result2.rating = this.rating;
1349
3260
  if (this.votes !== null)
1350
- result.votes = this.votes;
3261
+ result2.votes = this.votes;
1351
3262
  if (this.name !== null)
1352
- result.name = this.name;
3263
+ result2.name = this.name;
1353
3264
  if (this.fullname !== null)
1354
- result.fullname = this.fullname;
3265
+ result2.fullname = this.fullname;
1355
3266
  if (this.range !== null)
1356
- result.range = this.range;
1357
- result.order = this.order;
1358
- result.offset = this.offset;
3267
+ result2.range = this.range;
3268
+ result2.order = this.order;
3269
+ result2.offset = this.offset;
1359
3270
  if (this.limit !== null)
1360
- result.limit = this.limit;
1361
- result.perPage = this.perPage;
1362
- result.separate = this.separate;
1363
- result.wrapper = this.wrapper;
1364
- return result;
3271
+ result2.limit = this.limit;
3272
+ result2.perPage = this.perPage;
3273
+ result2.separate = this.separate;
3274
+ result2.wrapper = this.wrapper;
3275
+ return result2;
1365
3276
  }
1366
3277
  }
1367
3278
 
1368
3279
  // src/module/page/page.ts
1369
3280
  var pageParamsSchema = z3.object({
1370
- fullname: z3.string().default(""),
1371
- name: z3.string().default(""),
1372
- category: z3.string().default(""),
1373
- title: z3.string().default(""),
1374
- children_count: z3.number().default(0),
1375
- comments_count: z3.number().default(0),
1376
- size: z3.number().default(0),
1377
- rating: z3.number().default(0),
1378
- votes_count: z3.number().default(0),
1379
- rating_percent: z3.number().nullable().default(null),
1380
- revisions_count: z3.number().default(0),
3281
+ fullname: z3.preprocess((v) => v ?? "", z3.string()),
3282
+ name: z3.preprocess((v) => v ?? "", z3.string()),
3283
+ category: z3.preprocess((v) => v ?? "", z3.string()),
3284
+ title: z3.preprocess((v) => v ?? "", z3.string()),
3285
+ children_count: z3.coerce.number().default(0),
3286
+ comments_count: z3.coerce.number().default(0),
3287
+ size: z3.coerce.number().default(0),
3288
+ rating: z3.coerce.number().default(0),
3289
+ votes_count: z3.coerce.number().default(0),
3290
+ rating_percent: z3.coerce.number().nullable().default(null),
3291
+ revisions_count: z3.coerce.number().default(0),
1381
3292
  parent_fullname: z3.string().nullable().default(null),
1382
3293
  tags: z3.array(z3.string()).default([]),
1383
3294
  created_by: z3.custom().nullable().default(null),
@@ -1484,7 +3395,7 @@ class Page {
1484
3395
  if (!idCheck.ok)
1485
3396
  return idCheck.error;
1486
3397
  return fromPromise((async () => {
1487
- const result = await this.site.amcRequest([
3398
+ const result2 = await this.site.amcRequest([
1488
3399
  {
1489
3400
  action: "WikiPageAction",
1490
3401
  event: "deletePage",
@@ -1492,8 +3403,8 @@ class Page {
1492
3403
  moduleName: "Empty"
1493
3404
  }
1494
3405
  ]);
1495
- if (result.isErr()) {
1496
- throw result.error;
3406
+ if (result2.isErr()) {
3407
+ throw result2.error;
1497
3408
  }
1498
3409
  })(), (error) => new UnexpectedError(`Failed to delete page: ${String(error)}`));
1499
3410
  }
@@ -1502,7 +3413,7 @@ class Page {
1502
3413
  if (!idCheck.ok)
1503
3414
  return idCheck.error;
1504
3415
  return fromPromise((async () => {
1505
- const result = await this.site.amcRequest([
3416
+ const result2 = await this.site.amcRequest([
1506
3417
  {
1507
3418
  tags: this.tags.join(" "),
1508
3419
  action: "WikiPageAction",
@@ -1511,8 +3422,8 @@ class Page {
1511
3422
  moduleName: "Empty"
1512
3423
  }
1513
3424
  ]);
1514
- if (result.isErr()) {
1515
- throw result.error;
3425
+ if (result2.isErr()) {
3426
+ throw result2.error;
1516
3427
  }
1517
3428
  })(), (error) => new UnexpectedError(`Failed to save tags: ${String(error)}`));
1518
3429
  }
@@ -1521,7 +3432,7 @@ class Page {
1521
3432
  if (!idCheck.ok)
1522
3433
  return idCheck.error;
1523
3434
  return fromPromise((async () => {
1524
- const result = await this.site.amcRequest([
3435
+ const result2 = await this.site.amcRequest([
1525
3436
  {
1526
3437
  action: "WikiPageAction",
1527
3438
  event: "setParentPage",
@@ -1530,8 +3441,8 @@ class Page {
1530
3441
  parentName: parentFullname ?? ""
1531
3442
  }
1532
3443
  ]);
1533
- if (result.isErr()) {
1534
- throw result.error;
3444
+ if (result2.isErr()) {
3445
+ throw result2.error;
1535
3446
  }
1536
3447
  this.parentFullname = parentFullname;
1537
3448
  })(), (error) => new UnexpectedError(`Failed to set parent: ${String(error)}`));
@@ -1541,7 +3452,7 @@ class Page {
1541
3452
  if (!idCheck.ok)
1542
3453
  return idCheck.error;
1543
3454
  return fromPromise((async () => {
1544
- const result = await this.site.amcRequest([
3455
+ const result2 = await this.site.amcRequest([
1545
3456
  {
1546
3457
  action: "RateAction",
1547
3458
  event: "ratePage",
@@ -1551,10 +3462,10 @@ class Page {
1551
3462
  force: "yes"
1552
3463
  }
1553
3464
  ]);
1554
- if (result.isErr()) {
1555
- throw result.error;
3465
+ if (result2.isErr()) {
3466
+ throw result2.error;
1556
3467
  }
1557
- const response = result.value[0];
3468
+ const response = result2.value[0];
1558
3469
  if (!response) {
1559
3470
  throw new UnexpectedError("Empty response from vote request");
1560
3471
  }
@@ -1568,7 +3479,7 @@ class Page {
1568
3479
  if (!idCheck.ok)
1569
3480
  return idCheck.error;
1570
3481
  return fromPromise((async () => {
1571
- const result = await this.site.amcRequest([
3482
+ const result2 = await this.site.amcRequest([
1572
3483
  {
1573
3484
  action: "RateAction",
1574
3485
  event: "cancelVote",
@@ -1576,10 +3487,10 @@ class Page {
1576
3487
  pageId: this._id
1577
3488
  }
1578
3489
  ]);
1579
- if (result.isErr()) {
1580
- throw result.error;
3490
+ if (result2.isErr()) {
3491
+ throw result2.error;
1581
3492
  }
1582
- const response = result.value[0];
3493
+ const response = result2.value[0];
1583
3494
  if (!response) {
1584
3495
  throw new UnexpectedError("Empty response from cancel vote request");
1585
3496
  }
@@ -1607,15 +3518,15 @@ class Page {
1607
3518
  currentSource = this._source?.wikiText ?? "";
1608
3519
  }
1609
3520
  }
1610
- const result = await PageCollection.createOrEdit(this.site, this.fullname, {
3521
+ const result2 = await PageCollection.createOrEdit(this.site, this.fullname, {
1611
3522
  pageId,
1612
3523
  title: options.title ?? this.title,
1613
3524
  source: currentSource,
1614
3525
  comment: options.comment ?? "",
1615
3526
  forceEdit: options.forceEdit ?? false
1616
3527
  });
1617
- if (result.isErr()) {
1618
- throw result.error;
3528
+ if (result2.isErr()) {
3529
+ throw result2.error;
1619
3530
  }
1620
3531
  })(), (error) => {
1621
3532
  if (error instanceof LoginRequiredError || error instanceof ForbiddenError) {
@@ -1629,7 +3540,7 @@ class Page {
1629
3540
  if (!idCheck.ok)
1630
3541
  return idCheck.error;
1631
3542
  return fromPromise((async () => {
1632
- const result = await this.site.amcRequest([
3543
+ const result2 = await this.site.amcRequest([
1633
3544
  {
1634
3545
  action: "WikiPageAction",
1635
3546
  event: "renamePage",
@@ -1638,8 +3549,8 @@ class Page {
1638
3549
  new_name: newFullname
1639
3550
  }
1640
3551
  ]);
1641
- if (result.isErr()) {
1642
- throw result.error;
3552
+ if (result2.isErr()) {
3553
+ throw result2.error;
1643
3554
  }
1644
3555
  Object.assign(this, {
1645
3556
  fullname: newFullname,
@@ -1657,16 +3568,16 @@ class Page {
1657
3568
  return idCheck.error;
1658
3569
  const pageId = idCheck.id;
1659
3570
  return fromPromise((async () => {
1660
- const result = await this.site.amcRequest([
3571
+ const result2 = await this.site.amcRequest([
1661
3572
  {
1662
3573
  moduleName: "forum/ForumCommentsListModule",
1663
3574
  pageId
1664
3575
  }
1665
3576
  ]);
1666
- if (result.isErr()) {
1667
- throw result.error;
3577
+ if (result2.isErr()) {
3578
+ throw result2.error;
1668
3579
  }
1669
- const response = result.value[0];
3580
+ const response = result2.value[0];
1670
3581
  if (!response) {
1671
3582
  return null;
1672
3583
  }
@@ -1676,7 +3587,7 @@ class Page {
1676
3587
  return null;
1677
3588
  }
1678
3589
  const threadId = Number.parseInt(match[1], 10);
1679
- const { ForumThread: ForumThread2 } = await import("./shared/index-ytknx2hn.js");
3590
+ const { ForumThread: ForumThread2 } = await Promise.resolve().then(() => (init_forum(), exports_forum));
1680
3591
  const threadResult = await ForumThread2.getFromId(this.site, threadId);
1681
3592
  if (threadResult.isErr()) {
1682
3593
  throw threadResult.error;
@@ -1761,13 +3672,14 @@ class PageCollection extends Array {
1761
3672
  if (targetPages.length === 0) {
1762
3673
  return new PageCollection(site, pages);
1763
3674
  }
1764
- const responses = await Promise.all(targetPages.map(async (page) => {
3675
+ const limit = pLimit3(site.client.amcClient.config.semaphoreLimit);
3676
+ const responses = await Promise.all(targetPages.map((page) => limit(async () => {
1765
3677
  const url = `${page.getUrl()}/norender/true/noredirect/true`;
1766
3678
  const response = await fetch(url, {
1767
3679
  headers: site.client.amcClient.header.getHeaders()
1768
3680
  });
1769
3681
  return { page, response };
1770
- }));
3682
+ })));
1771
3683
  for (const { page, response } of responses) {
1772
3684
  const text = await response.text();
1773
3685
  const match = text.match(/WIKIREQUEST\.info\.pageId\s*=\s*(\d+);/);
@@ -1789,20 +3701,20 @@ class PageCollection extends Array {
1789
3701
  if (targetPages.length === 0) {
1790
3702
  return new PageCollection(site, pages);
1791
3703
  }
1792
- const result = await site.amcRequest(targetPages.map((page) => ({
3704
+ const result2 = await site.amcRequest(targetPages.map((page) => ({
1793
3705
  moduleName: "viewsource/ViewSourceModule",
1794
3706
  page_id: page.id
1795
3707
  })));
1796
- if (result.isErr()) {
1797
- throw result.error;
3708
+ if (result2.isErr()) {
3709
+ throw result2.error;
1798
3710
  }
1799
3711
  for (let i = 0;i < targetPages.length; i++) {
1800
3712
  const page = targetPages[i];
1801
- const response = result.value[i];
3713
+ const response = result2.value[i];
1802
3714
  if (!page || !response)
1803
3715
  continue;
1804
3716
  const body = String(response.body ?? "").replace(/&nbsp;/g, " ");
1805
- const $ = cheerio6.load(body);
3717
+ const $ = cheerio11.load(body);
1806
3718
  const sourceElement = $("div.page-source");
1807
3719
  if (sourceElement.length === 0) {
1808
3720
  throw new NoElementError(`Cannot find source element for page: ${page.fullname}`);
@@ -1823,23 +3735,22 @@ class PageCollection extends Array {
1823
3735
  if (targetPages.length === 0) {
1824
3736
  return new PageCollection(site, pages);
1825
3737
  }
1826
- const result = await site.amcRequest(targetPages.map((page) => ({
3738
+ const result2 = await site.amcRequest(targetPages.map((page) => ({
1827
3739
  moduleName: "history/PageRevisionListModule",
1828
3740
  page_id: page.id,
1829
3741
  options: { all: true },
1830
3742
  perpage: 1e8
1831
3743
  })));
1832
- if (result.isErr()) {
1833
- throw result.error;
3744
+ if (result2.isErr()) {
3745
+ throw result2.error;
1834
3746
  }
1835
- const { PageRevision: PageRevision2 } = await import("./shared/index-f2eh3ykk.js");
1836
3747
  for (let i = 0;i < targetPages.length; i++) {
1837
3748
  const page = targetPages[i];
1838
- const response = result.value[i];
3749
+ const response = result2.value[i];
1839
3750
  if (!page || !response)
1840
3751
  continue;
1841
3752
  const body = String(response.body ?? "");
1842
- const $ = cheerio6.load(body);
3753
+ const $ = cheerio11.load(body);
1843
3754
  const revisions = [];
1844
3755
  $("table.page-history > tr[id^=revision-row-]").each((_j, revElement) => {
1845
3756
  const $rev = $(revElement);
@@ -1865,7 +3776,7 @@ class PageCollection extends Array {
1865
3776
  return;
1866
3777
  const createdAt = parseOdate($createdAtElem) ?? new Date;
1867
3778
  const comment = $tds.eq(6).text().trim();
1868
- revisions.push(new PageRevision2({
3779
+ revisions.push(new PageRevision({
1869
3780
  page,
1870
3781
  id: revId,
1871
3782
  revNo,
@@ -1885,20 +3796,20 @@ class PageCollection extends Array {
1885
3796
  if (targetPages.length === 0) {
1886
3797
  return new PageCollection(site, pages);
1887
3798
  }
1888
- const result = await site.amcRequest(targetPages.map((page) => ({
3799
+ const result2 = await site.amcRequest(targetPages.map((page) => ({
1889
3800
  moduleName: "pagerate/WhoRatedPageModule",
1890
3801
  pageId: page.id
1891
3802
  })));
1892
- if (result.isErr()) {
1893
- throw result.error;
3803
+ if (result2.isErr()) {
3804
+ throw result2.error;
1894
3805
  }
1895
3806
  for (let i = 0;i < targetPages.length; i++) {
1896
3807
  const page = targetPages[i];
1897
- const response = result.value[i];
3808
+ const response = result2.value[i];
1898
3809
  if (!page || !response)
1899
3810
  continue;
1900
3811
  const body = String(response.body ?? "");
1901
- const $ = cheerio6.load(body);
3812
+ const $ = cheerio11.load(body);
1902
3813
  const $userElems = $("span.printuser");
1903
3814
  const $valueElems = $("span[style^='color']");
1904
3815
  if ($userElems.length !== $valueElems.length) {
@@ -2018,16 +3929,16 @@ ${DEFAULT_MODULE_BODY.map((key) => `[[span class="set ${key}"]][[span class="nam
2018
3929
  moduleName: "list/ListPagesModule",
2019
3930
  module_body: moduleBody
2020
3931
  };
2021
- const result = await site.amcRequest([requestBody]);
2022
- if (result.isErr()) {
2023
- if (result.error.message.includes("not_ok")) {
3932
+ const result2 = await site.amcRequest([requestBody]);
3933
+ if (result2.isErr()) {
3934
+ if (result2.error.message.includes("not_ok")) {
2024
3935
  throw new ForbiddenError("Failed to get pages, target site may be private");
2025
3936
  }
2026
- throw result.error;
3937
+ throw result2.error;
2027
3938
  }
2028
- const firstResponse = result.value[0];
3939
+ const firstResponse = result2.value[0];
2029
3940
  const body = String(firstResponse?.body ?? "");
2030
- const $first = cheerio6.load(body);
3941
+ const $first = cheerio11.load(body);
2031
3942
  let total = 1;
2032
3943
  const htmlBodies = [$first];
2033
3944
  const pagerElement = $first("div.pager");
@@ -2057,7 +3968,7 @@ ${DEFAULT_MODULE_BODY.map((key) => `[[span class="set ${key}"]][[span class="nam
2057
3968
  }
2058
3969
  for (const response of additionalResults.value) {
2059
3970
  const respBody = String(response?.body ?? "");
2060
- htmlBodies.push(cheerio6.load(respBody));
3971
+ htmlBodies.push(cheerio11.load(respBody));
2061
3972
  }
2062
3973
  }
2063
3974
  const pages = [];
@@ -2140,7 +4051,11 @@ ${DEFAULT_MODULE_BODY.map((key) => `[[span class="set ${key}"]][[span class="nam
2140
4051
  }
2141
4052
  }
2142
4053
  // src/module/page/site-change.ts
2143
- import * as cheerio7 from "cheerio";
4054
+ init_errors();
4055
+ init_types();
4056
+ init_parser();
4057
+ import * as cheerio12 from "cheerio";
4058
+
2144
4059
  class SiteChange {
2145
4060
  site;
2146
4061
  pageFullname;
@@ -2182,22 +4097,22 @@ class SiteChangeCollection extends Array {
2182
4097
  const page = options?.page ?? 1;
2183
4098
  const limit = options?.limit;
2184
4099
  return fromPromise((async () => {
2185
- const result = await site.amcRequest([
4100
+ const result2 = await site.amcRequest([
2186
4101
  {
2187
4102
  moduleName: "changes/SiteChangesListModule",
2188
4103
  perpage: perPage,
2189
4104
  page
2190
4105
  }
2191
4106
  ]);
2192
- if (result.isErr()) {
2193
- throw result.error;
4107
+ if (result2.isErr()) {
4108
+ throw result2.error;
2194
4109
  }
2195
- const response = result.value[0];
4110
+ const response = result2.value[0];
2196
4111
  if (!response) {
2197
4112
  throw new NoElementError("Empty response");
2198
4113
  }
2199
4114
  const html = String(response.body ?? "");
2200
- const $ = cheerio7.load(html);
4115
+ const $ = cheerio12.load(html);
2201
4116
  const changes = [];
2202
4117
  $("table.wiki-content-table tr").each((_i, elem) => {
2203
4118
  const $row = $(elem);
@@ -2259,11 +4174,11 @@ class PageAccessor {
2259
4174
  return fromPromise((async () => {
2260
4175
  const query = new SearchPagesQuery({ fullname: unixName });
2261
4176
  const userParser = parseUser.bind(null, this.site.client);
2262
- const result = await PageCollection.searchPages(this.site, userParser, query);
2263
- if (result.isErr()) {
2264
- throw result.error;
4177
+ const result2 = await PageCollection.searchPages(this.site, userParser, query);
4178
+ if (result2.isErr()) {
4179
+ throw result2.error;
2265
4180
  }
2266
- return result.value.length > 0 ? result.value[0] ?? null : null;
4181
+ return result2.value.length > 0 ? result2.value[0] ?? null : null;
2267
4182
  })(), (error) => {
2268
4183
  if (error instanceof NoElementError)
2269
4184
  return error;
@@ -2280,6 +4195,9 @@ class PageAccessor {
2280
4195
  }
2281
4196
  }
2282
4197
  // src/module/site/accessors/pages-accessor.ts
4198
+ init_errors();
4199
+ init_types();
4200
+ init_parser();
2283
4201
  class PagesAccessor {
2284
4202
  site;
2285
4203
  constructor(site) {
@@ -2289,11 +4207,11 @@ class PagesAccessor {
2289
4207
  return fromPromise((async () => {
2290
4208
  const query = new SearchPagesQuery(params);
2291
4209
  const userParser = parseUser.bind(null, this.site.client);
2292
- const result = await PageCollection.searchPages(this.site, userParser, query);
2293
- if (result.isErr()) {
2294
- throw result.error;
4210
+ const result2 = await PageCollection.searchPages(this.site, userParser, query);
4211
+ if (result2.isErr()) {
4212
+ throw result2.error;
2295
4213
  }
2296
- return result.value;
4214
+ return result2.value;
2297
4215
  })(), (error) => new UnexpectedError(`Failed to search pages: ${String(error)}`));
2298
4216
  }
2299
4217
  all() {
@@ -2304,7 +4222,9 @@ class PagesAccessor {
2304
4222
  }
2305
4223
  }
2306
4224
  // src/module/site/site.ts
2307
- import * as cheerio8 from "cheerio";
4225
+ init_errors();
4226
+ init_types();
4227
+ import * as cheerio13 from "cheerio";
2308
4228
  class Site {
2309
4229
  client;
2310
4230
  id;
@@ -2357,11 +4277,11 @@ class Site {
2357
4277
  }
2358
4278
  amcRequestSingle(body) {
2359
4279
  return fromPromise((async () => {
2360
- const result = await this.amcRequest([body]);
2361
- if (result.isErr()) {
2362
- throw result.error;
4280
+ const result2 = await this.amcRequest([body]);
4281
+ if (result2.isErr()) {
4282
+ throw result2.error;
2363
4283
  }
2364
- const response = result.value[0];
4284
+ const response = result2.value[0];
2365
4285
  if (!response) {
2366
4286
  throw new UnexpectedError("AMC request returned empty response");
2367
4287
  }
@@ -2375,7 +4295,7 @@ class Site {
2375
4295
  }
2376
4296
  static fromUnixName(client, unixName) {
2377
4297
  return fromPromise((async () => {
2378
- const url = `https://${unixName}.wikidot.com`;
4298
+ const url = `http://${unixName}.wikidot.com`;
2379
4299
  const response = await fetch(url, {
2380
4300
  headers: client.amcClient.header.getHeaders()
2381
4301
  });
@@ -2386,7 +4306,7 @@ class Site {
2386
4306
  throw new UnexpectedError(`Failed to fetch site: ${response.status}`);
2387
4307
  }
2388
4308
  const html = await response.text();
2389
- const $ = cheerio8.load(html);
4309
+ const $ = cheerio13.load(html);
2390
4310
  const scripts = $("script").toArray();
2391
4311
  let siteId = null;
2392
4312
  let siteUnixName = null;
@@ -2426,7 +4346,7 @@ class Site {
2426
4346
  if (title === null) {
2427
4347
  title = unixName;
2428
4348
  }
2429
- const sslSupported = true;
4349
+ const sslSupported = response.url.startsWith("https");
2430
4350
  return new Site(client, {
2431
4351
  id: siteId,
2432
4352
  title,
@@ -2456,6 +4376,10 @@ class SiteAccessor {
2456
4376
  }
2457
4377
  }
2458
4378
  // src/module/client/accessors/user-accessor.ts
4379
+ init_errors();
4380
+ init_types();
4381
+ init_user2();
4382
+
2459
4383
  class UserAccessor {
2460
4384
  client;
2461
4385
  constructor(client) {
@@ -2490,6 +4414,9 @@ class UserAccessor {
2490
4414
  }
2491
4415
  }
2492
4416
  // src/module/client/client.ts
4417
+ init_errors();
4418
+ init_types();
4419
+ init_user();
2493
4420
  class Client {
2494
4421
  amcClient;
2495
4422
  domain;
@@ -2522,8 +4449,7 @@ class Client {
2522
4449
  if (loginResult.isErr()) {
2523
4450
  throw loginResult.error;
2524
4451
  }
2525
- const { User: User2 } = await import("./shared/index-kka6e8cb.js");
2526
- const userResult = await User2.fromName(client, username);
4452
+ const userResult = await User.fromName(client, username);
2527
4453
  if (userResult.isOk() && userResult.value) {
2528
4454
  client._me = userResult.value;
2529
4455
  }
@@ -2561,6 +4487,11 @@ class Client {
2561
4487
  return wdOkAsync(undefined);
2562
4488
  }
2563
4489
  }
4490
+ // src/module/index.ts
4491
+ init_forum();
4492
+ init_user2();
4493
+ // src/util/index.ts
4494
+ init_parser();
2564
4495
  export {
2565
4496
  wdOkAsync,
2566
4497
  wdOk,
@@ -2647,5 +4578,5 @@ export {
2647
4578
  AMCClient
2648
4579
  };
2649
4580
 
2650
- //# debugId=1A0AF3AA4D5CAB4D64756E2164756E21
2651
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL2Nvbm5lY3Rvci9hbWMtY2xpZW50LnRzIiwgInNyYy9jb25uZWN0b3IvYW1jLWNvbmZpZy50cyIsICJzcmMvY29ubmVjdG9yL2FtYy1oZWFkZXIudHMiLCAic3JjL2Nvbm5lY3Rvci9hbWMtdHlwZXMudHMiLCAic3JjL2Nvbm5lY3Rvci9hdXRoLnRzIiwgInNyYy9tb2R1bGUvcHJpdmF0ZS1tZXNzYWdlL3ByaXZhdGUtbWVzc2FnZS50cyIsICJzcmMvbW9kdWxlL2NsaWVudC9hY2Nlc3NvcnMvcG0tYWNjZXNzb3IudHMiLCAic3JjL21vZHVsZS9zaXRlL2FjY2Vzc29ycy9mb3J1bS1hY2Nlc3Nvci50cyIsICJzcmMvdXRpbC9xdWljay1tb2R1bGUudHMiLCAic3JjL21vZHVsZS9zaXRlL3NpdGUtYXBwbGljYXRpb24udHMiLCAic3JjL21vZHVsZS9zaXRlL3NpdGUtbWVtYmVyLnRzIiwgInNyYy9tb2R1bGUvc2l0ZS9hY2Nlc3NvcnMvbWVtYmVyLWFjY2Vzc29yLnRzIiwgInNyYy9tb2R1bGUvcGFnZS9wYWdlLnRzIiwgInNyYy9tb2R1bGUvcGFnZS9wYWdlLWZpbGUudHMiLCAic3JjL21vZHVsZS9wYWdlL3BhZ2UtbWV0YS50cyIsICJzcmMvbW9kdWxlL3BhZ2UvcGFnZS1zb3VyY2UudHMiLCAic3JjL21vZHVsZS9wYWdlL3BhZ2Utdm90ZS50cyIsICJzcmMvbW9kdWxlL3BhZ2Uvc2VhcmNoLXF1ZXJ5LnRzIiwgInNyYy9tb2R1bGUvcGFnZS9zaXRlLWNoYW5nZS50cyIsICJzcmMvbW9kdWxlL3NpdGUvYWNjZXNzb3JzL3BhZ2UtYWNjZXNzb3IudHMiLCAic3JjL21vZHVsZS9zaXRlL2FjY2Vzc29ycy9wYWdlcy1hY2Nlc3Nvci50cyIsICJzcmMvbW9kdWxlL3NpdGUvc2l0ZS50cyIsICJzcmMvbW9kdWxlL2NsaWVudC9hY2Nlc3NvcnMvc2l0ZS1hY2Nlc3Nvci50cyIsICJzcmMvbW9kdWxlL2NsaWVudC9hY2Nlc3NvcnMvdXNlci1hY2Nlc3Nvci50cyIsICJzcmMvbW9kdWxlL2NsaWVudC9jbGllbnQudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbCiAgICAiaW1wb3J0IGt5LCB7IHR5cGUgS3lJbnN0YW5jZSB9IGZyb20gJ2t5JztcbmltcG9ydCBwTGltaXQsIHsgdHlwZSBMaW1pdEZ1bmN0aW9uIH0gZnJvbSAncC1saW1pdCc7XG5pbXBvcnQge1xuICBBTUNIdHRwRXJyb3IsXG4gIEZvcmJpZGRlbkVycm9yLFxuICBOb3RGb3VuZEV4Y2VwdGlvbixcbiAgUmVzcG9uc2VEYXRhRXJyb3IsXG4gIFVuZXhwZWN0ZWRFcnJvcixcbiAgV2lraWRvdEVycm9yLFxuICBXaWtpZG90U3RhdHVzRXJyb3IsXG59IGZyb20gJy4uL2NvbW1vbi9lcnJvcnMnO1xuaW1wb3J0IHsgZnJvbVByb21pc2UsIHR5cGUgV2lraWRvdFJlc3VsdEFzeW5jLCB3ZEVyckFzeW5jLCB3ZE9rQXN5bmMgfSBmcm9tICcuLi9jb21tb24vdHlwZXMnO1xuaW1wb3J0IHtcbiAgdHlwZSBBTUNDb25maWcsXG4gIERFRkFVTFRfQU1DX0NPTkZJRyxcbiAgREVGQVVMVF9IVFRQX1NUQVRVU19DT0RFLFxuICBXSUtJRE9UX1RPS0VONyxcbn0gZnJvbSAnLi9hbWMtY29uZmlnJztcbmltcG9ydCB7IEFNQ0hlYWRlciB9IGZyb20gJy4vYW1jLWhlYWRlcic7XG5pbXBvcnQgeyB0eXBlIEFNQ1JlcXVlc3RCb2R5LCB0eXBlIEFNQ1Jlc3BvbnNlLCBhbWNSZXNwb25zZVNjaGVtYSB9IGZyb20gJy4vYW1jLXR5cGVzJztcblxuLyoqXG4gKiDmqZ/lr4bmg4XloLHjgpLjg57jgrnjgq/jgZnjgovvvIjjg63jgrDlh7rlipvnlKjvvIlcbiAqIEBwYXJhbSBib2R5IC0g44Oe44K544Kv5a++6LGh44Gu44Oq44Kv44Ko44K544OI44Oc44OH44KjXG4gKiBAcmV0dXJucyDjg57jgrnjgq/jgZXjgozjgZ/jg5zjg4fjgqNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hc2tTZW5zaXRpdmVEYXRhKGJvZHk6IEFNQ1JlcXVlc3RCb2R5KTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICBjb25zdCBtYXNrZWQgPSB7IC4uLmJvZHkgfTtcbiAgY29uc3Qgc2Vuc2l0aXZlS2V5cyA9IFsncGFzc3dvcmQnLCAnbG9naW4nLCAnV0lLSURPVF9TRVNTSU9OX0lEJywgJ3dpa2lkb3RfdG9rZW43J107XG4gIGZvciAoY29uc3Qga2V5IG9mIHNlbnNpdGl2ZUtleXMpIHtcbiAgICBpZiAoa2V5IGluIG1hc2tlZCkge1xuICAgICAgbWFza2VkW2tleV0gPSAnKioqTUFTS0VEKioqJztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG1hc2tlZDtcbn1cblxuLyoqXG4gKiDmjIfmlbDjg5Djg4Pjgq/jgqrjg5XplpPpmpTjgpLoqIjnrpfjgZnjgovvvIjjgrjjg4Pjgr/jg7zku5jjgY3vvIlcbiAqIEBwYXJhbSByZXRyeUNvdW50IC0g54++5Zyo44Gu44Oq44OI44Op44Kk5Zue5pWw77yIMeOBi+OCiemWi+Wni++8iVxuICogQHBhcmFtIGJhc2VJbnRlcnZhbCAtIOWfuuacrOmWk+malO+8iOODn+ODquenku+8iVxuICogQHBhcmFtIGJhY2tvZmZGYWN0b3IgLSDjg5Djg4Pjgq/jgqrjg5Xkv4LmlbBcbiAqIEBwYXJhbSBtYXhCYWNrb2ZmIC0g5pyA5aSn44OQ44OD44Kv44Kq44OV6ZaT6ZqU77yI44Of44Oq56eS77yJXG4gKiBAcmV0dXJucyDoqIjnrpfjgZXjgozjgZ/jg5Djg4Pjgq/jgqrjg5XplpPpmpTvvIjjg5/jg6rnp5LvvIlcbiAqL1xuZnVuY3Rpb24gY2FsY3VsYXRlQmFja29mZihcbiAgcmV0cnlDb3VudDogbnVtYmVyLFxuICBiYXNlSW50ZXJ2YWw6IG51bWJlcixcbiAgYmFja29mZkZhY3RvcjogbnVtYmVyLFxuICBtYXhCYWNrb2ZmOiBudW1iZXJcbik6IG51bWJlciB7XG4gIGNvbnN0IGJhY2tvZmYgPSBiYXNlSW50ZXJ2YWwgKiBiYWNrb2ZmRmFjdG9yICoqIChyZXRyeUNvdW50IC0gMSk7XG4gIGNvbnN0IGppdHRlciA9IE1hdGgucmFuZG9tKCkgKiBiYWNrb2ZmICogMC4xO1xuICByZXR1cm4gTWF0aC5taW4oYmFja29mZiArIGppdHRlciwgbWF4QmFja29mZik7XG59XG5cbi8qKlxuICog5oyH5a6a5pmC6ZaT5b6F5qmf44GZ44KLXG4gKiBAcGFyYW0gbXMgLSDlvoXmqZ/mmYLplpPvvIjjg5/jg6rnp5LvvIlcbiAqL1xuZnVuY3Rpb24gc2xlZXAobXM6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpKTtcbn1cblxuLyoqXG4gKiBBTUPjg6rjgq/jgqjjgrnjg4jjgqrjg5fjgrfjg6fjg7NcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBTUNSZXF1ZXN0T3B0aW9ucyB7XG4gIC8qKiDjgrXjgqTjg4jlkI3vvIjjg4fjg5Xjgqnjg6vjg4g6IHd3d++8iSAqL1xuICBzaXRlTmFtZT86IHN0cmluZztcbiAgLyoqIFNTTOWvvuW/nO+8iOecgeeVpeaZguOBr+iHquWLleaknOWHuu+8iSAqL1xuICBzc2xTdXBwb3J0ZWQ/OiBib29sZWFuO1xuICAvKiog44Ko44Op44O844KS5L6L5aSW44Go44GX44Gm5oqV44GS44Ga44Gr57WQ5p6c44Gr5ZCr44KB44KL77yI44OH44OV44Kp44Or44OIOiBmYWxzZe+8iSAqL1xuICByZXR1cm5FeGNlcHRpb25zPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBBamF4IE1vZHVsZSBDb25uZWN0b3Ljgq/jg6njgqTjgqLjg7Pjg4hcbiAqIFdpa2lkb3QgQU1D44Ko44Oz44OJ44Od44Kk44Oz44OI44G444Gu44Oq44Kv44Ko44K544OI44KS566h55CG44GZ44KLXG4gKi9cbmV4cG9ydCBjbGFzcyBBTUNDbGllbnQge1xuICAvKioga3njgqTjg7Pjgrnjgr/jg7PjgrkgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBreTogS3lJbnN0YW5jZTtcblxuICAvKiog5Lim5YiX44Oq44Kv44Ko44K544OI5Yi26ZmQICovXG4gIHByaXZhdGUgcmVhZG9ubHkgbGltaXQ6IExpbWl0RnVuY3Rpb247XG5cbiAgLyoqIOODmOODg+ODgOODvOeuoeeQhiAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaGVhZGVyOiBBTUNIZWFkZXI7XG5cbiAgLyoqIOioreWumiAqL1xuICBwdWJsaWMgcmVhZG9ubHkgY29uZmlnOiBBTUNDb25maWc7XG5cbiAgLyoqIOODmeODvOOCueODieODoeOCpOODsyAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZG9tYWluOiBzdHJpbmc7XG5cbiAgLyoqIFNTTOWvvuW/nOeKtuazgeOBruOCreODo+ODg+OCt+ODpSAqL1xuICBwcml2YXRlIHNzbENhY2hlOiBNYXA8c3RyaW5nLCBib29sZWFuPiA9IG5ldyBNYXAoKTtcblxuICAvKipcbiAgICogQHBhcmFtIGNvbmZpZyAtIEFNQ+ioreWumu+8iOecgeeVpeaZguOBr+ODh+ODleOCqeODq+ODiOWApO+8iVxuICAgKiBAcGFyYW0gZG9tYWluIC0g44OZ44O844K544OJ44Oh44Kk44Oz77yI44OH44OV44Kp44Or44OIOiB3aWtpZG90LmNvbe+8iVxuICAgKi9cbiAgY29uc3RydWN0b3IoY29uZmlnOiBQYXJ0aWFsPEFNQ0NvbmZpZz4gPSB7fSwgZG9tYWluID0gJ3dpa2lkb3QuY29tJykge1xuICAgIHRoaXMuY29uZmlnID0geyAuLi5ERUZBVUxUX0FNQ19DT05GSUcsIC4uLmNvbmZpZyB9O1xuICAgIHRoaXMuZG9tYWluID0gZG9tYWluO1xuICAgIHRoaXMuaGVhZGVyID0gbmV3IEFNQ0hlYWRlcigpO1xuICAgIHRoaXMubGltaXQgPSBwTGltaXQodGhpcy5jb25maWcuc2VtYXBob3JlTGltaXQpO1xuXG4gICAgdGhpcy5reSA9IGt5LmNyZWF0ZSh7XG4gICAgICB0aW1lb3V0OiB0aGlzLmNvbmZpZy50aW1lb3V0LFxuICAgICAgcmV0cnk6IDAsIC8vIOaJi+WLleOBp+ODquODiOODqeOCpOOCkuWItuW+oVxuICAgIH0pO1xuXG4gICAgLy8gd3d344Gv5bi444GrU1NM5a++5b+cXG4gICAgdGhpcy5zc2xDYWNoZS5zZXQoJ3d3dycsIHRydWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIOOCteOCpOODiOOBruWtmOWcqOOBqFNTTOWvvuW/nOeKtuazgeOCkueiuuiqjeOBmeOCi1xuICAgKiBAcGFyYW0gc2l0ZU5hbWUgLSDjgrXjgqTjg4jlkI1cbiAgICogQHJldHVybnMgU1NM5a++5b+c54q25rOB77yIdHJ1ZTogSFRUUFPjgIFmYWxzZTogSFRUUO+8iVxuICAgKi9cbiAgY2hlY2tTaXRlU1NMKHNpdGVOYW1lOiBzdHJpbmcpOiBXaWtpZG90UmVzdWx0QXN5bmM8Ym9vbGVhbj4ge1xuICAgIC8vIOOCreODo+ODg+OCt+ODpeOBq+WtmOWcqOOBmeOCjOOBsOOBneOCjOOCkui/lOOBmVxuICAgIGNvbnN0IGNhY2hlZCA9IHRoaXMuc3NsQ2FjaGUuZ2V0KHNpdGVOYW1lKTtcbiAgICBpZiAoY2FjaGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB3ZE9rQXN5bmMoY2FjaGVkKTtcbiAgICB9XG5cbiAgICAvLyB3d3fjga/luLjjgatTU0zlr77lv5xcbiAgICBpZiAoc2l0ZU5hbWUgPT09ICd3d3cnKSB7XG4gICAgICByZXR1cm4gd2RPa0FzeW5jKHRydWUpO1xuICAgIH1cblxuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYGh0dHA6Ly8ke3NpdGVOYW1lfS4ke3RoaXMuZG9tYWlufWAsIHtcbiAgICAgICAgICBtZXRob2Q6ICdHRVQnLFxuICAgICAgICAgIHJlZGlyZWN0OiAnbWFudWFsJyxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gNDA044Gu5aC05ZCI44Gv44K144Kk44OI44GM5a2Y5Zyo44GX44Gq44GEXG4gICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT09IDQwNCkge1xuICAgICAgICAgIHRocm93IG5ldyBOb3RGb3VuZEV4Y2VwdGlvbihgU2l0ZSBpcyBub3QgZm91bmQ6ICR7c2l0ZU5hbWV9LiR7dGhpcy5kb21haW59YCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyAzMDHjg6rjg4DjgqTjg6zjgq/jg4jjgadodHRwc+OBq+WQkeOBi+OBhuWgtOWQiOOBr1NTTOWvvuW/nFxuICAgICAgICBjb25zdCBpc1NTTCA9XG4gICAgICAgICAgcmVzcG9uc2Uuc3RhdHVzID09PSAzMDEgJiYgcmVzcG9uc2UuaGVhZGVycy5nZXQoJ0xvY2F0aW9uJyk/LnN0YXJ0c1dpdGgoJ2h0dHBzJykgPT09IHRydWU7XG5cbiAgICAgICAgLy8g44Kt44Oj44OD44K344Ol44Gr5L+d5a2YXG4gICAgICAgIHRoaXMuc3NsQ2FjaGUuc2V0KHNpdGVOYW1lLCBpc1NTTCk7XG4gICAgICAgIHJldHVybiBpc1NTTDtcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgV2lraWRvdEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gY2hlY2sgU1NMIGZvciAke3NpdGVOYW1lfTogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQU1D44Oq44Kv44Ko44K544OI44KS5a6f6KGM44GZ44KLXG4gICAqIEBwYXJhbSBib2RpZXMgLSDjg6rjgq/jgqjjgrnjg4jjg5zjg4fjgqPphY3liJdcbiAgICogQHBhcmFtIHNpdGVOYW1lIC0g44K144Kk44OI5ZCN77yI55yB55Wl5pmC44Gvd3d377yJXG4gICAqIEBwYXJhbSBzc2xTdXBwb3J0ZWQgLSBTU0zlr77lv5zvvIjnnIHnlaXmmYLjga/oh6rli5XmpJzlh7rvvIlcbiAgICogQHJldHVybnMg44Os44K544Od44Oz44K56YWN5YiXXG4gICAqL1xuICByZXF1ZXN0KFxuICAgIGJvZGllczogQU1DUmVxdWVzdEJvZHlbXSxcbiAgICBzaXRlTmFtZSA9ICd3d3cnLFxuICAgIHNzbFN1cHBvcnRlZD86IGJvb2xlYW5cbiAgKTogV2lraWRvdFJlc3VsdEFzeW5jPEFNQ1Jlc3BvbnNlW10+IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0V2l0aE9wdGlvbnMoYm9kaWVzLCB7XG4gICAgICBzaXRlTmFtZSxcbiAgICAgIHNzbFN1cHBvcnRlZCxcbiAgICAgIHJldHVybkV4Y2VwdGlvbnM6IGZhbHNlLFxuICAgIH0pIGFzIFdpa2lkb3RSZXN1bHRBc3luYzxBTUNSZXNwb25zZVtdPjtcbiAgfVxuXG4gIC8qKlxuICAgKiBBTUPjg6rjgq/jgqjjgrnjg4jjgpLlrp/ooYzjgZnjgovvvIjjgqrjg5fjgrfjg6fjg7PmjIflrprniYjvvIlcbiAgICogQHBhcmFtIGJvZGllcyAtIOODquOCr+OCqOOCueODiOODnOODh+OCo+mFjeWIl1xuICAgKiBAcGFyYW0gb3B0aW9ucyAtIOODquOCr+OCqOOCueODiOOCquODl+OCt+ODp+ODs1xuICAgKiBAcmV0dXJucyDjg6zjgrnjg53jg7PjgrnphY3liJfvvIhyZXR1cm5FeGNlcHRpb25z44GMdHJ1ZeOBruWgtOWQiOOBr+OCqOODqeODvOOCguWQq+OCgO+8iVxuICAgKi9cbiAgcmVxdWVzdFdpdGhPcHRpb25zKFxuICAgIGJvZGllczogQU1DUmVxdWVzdEJvZHlbXSxcbiAgICBvcHRpb25zOiBBTUNSZXF1ZXN0T3B0aW9ucyA9IHt9XG4gICk6IFdpa2lkb3RSZXN1bHRBc3luYzwoQU1DUmVzcG9uc2UgfCBXaWtpZG90RXJyb3IpW10+IHtcbiAgICBjb25zdCB7IHNpdGVOYW1lID0gJ3d3dycsIHNzbFN1cHBvcnRlZCwgcmV0dXJuRXhjZXB0aW9ucyA9IGZhbHNlIH0gPSBvcHRpb25zO1xuXG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgLy8gU1NM5a++5b+c54q25rOB44KS5Y+W5b6XXG4gICAgICAgIGxldCBzc2wgPSBzc2xTdXBwb3J0ZWQ7XG4gICAgICAgIGlmIChzc2wgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGNvbnN0IHNzbFJlc3VsdCA9IGF3YWl0IHRoaXMuY2hlY2tTaXRlU1NMKHNpdGVOYW1lKTtcbiAgICAgICAgICBpZiAoc3NsUmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICAgIHRocm93IHNzbFJlc3VsdC5lcnJvcjtcbiAgICAgICAgICB9XG4gICAgICAgICAgc3NsID0gc3NsUmVzdWx0LnZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcHJvdG9jb2wgPSBzc2wgPyAnaHR0cHMnIDogJ2h0dHAnO1xuICAgICAgICBjb25zdCB1cmwgPSBgJHtwcm90b2NvbH06Ly8ke3NpdGVOYW1lfS4ke3RoaXMuZG9tYWlufS9hamF4LW1vZHVsZS1jb25uZWN0b3IucGhwYDtcblxuICAgICAgICAvLyDkuKbliJfjgafjg6rjgq/jgqjjgrnjg4jjgpLlrp/ooYxcbiAgICAgICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICAgIGJvZGllcy5tYXAoKGJvZHkpID0+IHRoaXMubGltaXQoKCkgPT4gdGhpcy5zaW5nbGVSZXF1ZXN0KGJvZHksIHVybCkpKVxuICAgICAgICApO1xuXG4gICAgICAgIGlmIChyZXR1cm5FeGNlcHRpb25zKSB7XG4gICAgICAgICAgLy8g44Ko44Op44O844KC5ZCr44KB44Gm44GZ44G544Gm44Gu57WQ5p6c44KS6L+U44GZXG4gICAgICAgICAgcmV0dXJuIHJlc3VsdHMubWFwKChyKSA9PiB7XG4gICAgICAgICAgICBpZiAoci5pc09rKCkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHIudmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gci5lcnJvcjtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIOOCqOODqeODvOOBjOOBguOCjOOBsOacgOWIneOBruOCqOODqeODvOOCkuOCueODreODvFxuICAgICAgICBjb25zdCBmaXJzdEVycm9yID0gcmVzdWx0cy5maW5kKChyKSA9PiByLmlzRXJyKCkpO1xuICAgICAgICBpZiAoZmlyc3RFcnJvcj8uaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IGZpcnN0RXJyb3IuZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0cy5tYXAoKHIpID0+IHtcbiAgICAgICAgICBpZiAoci5pc09rKCkpIHtcbiAgICAgICAgICAgIHJldHVybiByLnZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZEVycm9yKCdVbmV4cGVjdGVkIGVycm9yIGluIHJlc3VsdCBwcm9jZXNzaW5nJyk7XG4gICAgICAgIH0pO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBXaWtpZG90RXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEFNQyByZXF1ZXN0IGZhaWxlZDogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICog5Y2Y5LiA44Oq44Kv44Ko44K544OI44KS5a6f6KGM44GZ44KL5YaF6YOo44Oh44K944OD44OJXG4gICAqIEBwYXJhbSBib2R5IC0g44Oq44Kv44Ko44K544OI44Oc44OH44KjXG4gICAqIEBwYXJhbSB1cmwgLSDjg6rjgq/jgqjjgrnjg4hVUkxcbiAgICogQHJldHVybnMg44Os44K544Od44Oz44K5XG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHNpbmdsZVJlcXVlc3QoXG4gICAgYm9keTogQU1DUmVxdWVzdEJvZHksXG4gICAgdXJsOiBzdHJpbmdcbiAgKTogUHJvbWlzZTxXaWtpZG90UmVzdWx0QXN5bmM8QU1DUmVzcG9uc2U+PiB7XG4gICAgbGV0IHJldHJ5Q291bnQgPSAwO1xuXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIHdpa2lkb3RfdG9rZW4344KS6L+95YqgXG4gICAgICAgIGNvbnN0IHJlcXVlc3RCb2R5ID0geyAuLi5ib2R5LCB3aWtpZG90X3Rva2VuNzogV0lLSURPVF9UT0tFTjcgfTtcblxuICAgICAgICAvLyBVUkzjgqjjg7PjgrPjg7zjg4njgZXjgozjgZ/jg5zjg4fjgqPjgpLkvZzmiJBcbiAgICAgICAgY29uc3QgZm9ybURhdGEgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKCk7XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHJlcXVlc3RCb2R5KSkge1xuICAgICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBmb3JtRGF0YS5hcHBlbmQoa2V5LCBTdHJpbmcodmFsdWUpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMua3kucG9zdCh1cmwsIHtcbiAgICAgICAgICBoZWFkZXJzOiB0aGlzLmhlYWRlci5nZXRIZWFkZXJzKCksXG4gICAgICAgICAgYm9keTogZm9ybURhdGEudG9TdHJpbmcoKSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gSlNPTuOBqOOBl+OBpuODkeODvOOCuVxuICAgICAgICBsZXQgcmVzcG9uc2VEYXRhOiB1bmtub3duO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJlc3BvbnNlRGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgcmV0dXJuIHdkRXJyQXN5bmMoXG4gICAgICAgICAgICBuZXcgUmVzcG9uc2VEYXRhRXJyb3IoYEFNQyByZXNwb25kZWQgd2l0aCBub24tSlNPTiBkYXRhOiAke2F3YWl0IHJlc3BvbnNlLnRleHQoKX1gKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyB6b2Tjgafjg5Djg6rjg4fjg7zjgrfjg6fjg7NcbiAgICAgICAgY29uc3QgcGFyc2VSZXN1bHQgPSBhbWNSZXNwb25zZVNjaGVtYS5zYWZlUGFyc2UocmVzcG9uc2VEYXRhKTtcbiAgICAgICAgaWYgKCFwYXJzZVJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICAgICAgcmV0dXJuIHdkRXJyQXN5bmMoXG4gICAgICAgICAgICBuZXcgUmVzcG9uc2VEYXRhRXJyb3IoYEludmFsaWQgQU1DIHJlc3BvbnNlIGZvcm1hdDogJHtwYXJzZVJlc3VsdC5lcnJvci5tZXNzYWdlfWApXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGFtY1Jlc3BvbnNlID0gcGFyc2VSZXN1bHQuZGF0YTtcblxuICAgICAgICAvLyB0cnlfYWdhaW7jga7loLTlkIjjga/jg6rjg4jjg6njgqRcbiAgICAgICAgaWYgKGFtY1Jlc3BvbnNlLnN0YXR1cyA9PT0gJ3RyeV9hZ2FpbicpIHtcbiAgICAgICAgICByZXRyeUNvdW50Kys7XG4gICAgICAgICAgaWYgKHJldHJ5Q291bnQgPj0gdGhpcy5jb25maWcucmV0cnlMaW1pdCkge1xuICAgICAgICAgICAgcmV0dXJuIHdkRXJyQXN5bmMobmV3IFdpa2lkb3RTdGF0dXNFcnJvcignQU1DIHJlc3BvbmRlZCB3aXRoIHRyeV9hZ2FpbicsICd0cnlfYWdhaW4nKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGJhY2tvZmYgPSBjYWxjdWxhdGVCYWNrb2ZmKFxuICAgICAgICAgICAgcmV0cnlDb3VudCxcbiAgICAgICAgICAgIHRoaXMuY29uZmlnLnJldHJ5SW50ZXJ2YWwsXG4gICAgICAgICAgICB0aGlzLmNvbmZpZy5iYWNrb2ZmRmFjdG9yLFxuICAgICAgICAgICAgdGhpcy5jb25maWcubWF4QmFja29mZlxuICAgICAgICAgICk7XG4gICAgICAgICAgYXdhaXQgc2xlZXAoYmFja29mZik7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBub19wZXJtaXNzaW9u44Gu5aC05ZCI44GvRm9yYmlkZGVuRXJyb3JcbiAgICAgICAgaWYgKGFtY1Jlc3BvbnNlLnN0YXR1cyA9PT0gJ25vX3Blcm1pc3Npb24nKSB7XG4gICAgICAgICAgY29uc3QgdGFyZ2V0U3RyID0gYm9keS5tb2R1bGVOYW1lXG4gICAgICAgICAgICA/IGBtb2R1bGVOYW1lOiAke2JvZHkubW9kdWxlTmFtZX1gXG4gICAgICAgICAgICA6IGJvZHkuYWN0aW9uXG4gICAgICAgICAgICAgID8gYGFjdGlvbjogJHtib2R5LmFjdGlvbn0vJHtib2R5LmV2ZW50ID8/ICcnfWBcbiAgICAgICAgICAgICAgOiAndW5rbm93bic7XG4gICAgICAgICAgcmV0dXJuIHdkRXJyQXN5bmMoXG4gICAgICAgICAgICBuZXcgRm9yYmlkZGVuRXJyb3IoXG4gICAgICAgICAgICAgIGBZb3VyIGFjY291bnQgaGFzIG5vIHBlcm1pc3Npb24gdG8gcGVyZm9ybSB0aGlzIGFjdGlvbjogJHt0YXJnZXRTdHJ9YFxuICAgICAgICAgICAgKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBva+OBp+OBquOBhOWgtOWQiOOBr+OCqOODqeODvFxuICAgICAgICBpZiAoYW1jUmVzcG9uc2Uuc3RhdHVzICE9PSAnb2snKSB7XG4gICAgICAgICAgcmV0dXJuIHdkRXJyQXN5bmMoXG4gICAgICAgICAgICBuZXcgV2lraWRvdFN0YXR1c0Vycm9yKFxuICAgICAgICAgICAgICBgQU1DIHJlc3BvbmRlZCB3aXRoIGVycm9yIHN0YXR1czogXCIke2FtY1Jlc3BvbnNlLnN0YXR1c31cImAsXG4gICAgICAgICAgICAgIGFtY1Jlc3BvbnNlLnN0YXR1c1xuICAgICAgICAgICAgKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gd2RPa0FzeW5jKGFtY1Jlc3BvbnNlKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIC8vIEhUVFDjgqjjg6njg7zjga7loLTlkIjjga/jg6rjg4jjg6njgqRcbiAgICAgICAgcmV0cnlDb3VudCsrO1xuICAgICAgICBpZiAocmV0cnlDb3VudCA+PSB0aGlzLmNvbmZpZy5yZXRyeUxpbWl0KSB7XG4gICAgICAgICAgY29uc3Qgc3RhdHVzQ29kZSA9XG4gICAgICAgICAgICBlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmICdyZXNwb25zZScgaW4gZXJyb3JcbiAgICAgICAgICAgICAgPyAoKGVycm9yIGFzIHsgcmVzcG9uc2U/OiB7IHN0YXR1cz86IG51bWJlciB9IH0pLnJlc3BvbnNlPy5zdGF0dXMgPz9cbiAgICAgICAgICAgICAgICBERUZBVUxUX0hUVFBfU1RBVFVTX0NPREUpXG4gICAgICAgICAgICAgIDogREVGQVVMVF9IVFRQX1NUQVRVU19DT0RFO1xuICAgICAgICAgIHJldHVybiB3ZEVyckFzeW5jKFxuICAgICAgICAgICAgbmV3IEFNQ0h0dHBFcnJvcihgQU1DIEhUVFAgcmVxdWVzdCBmYWlsZWQ6ICR7U3RyaW5nKGVycm9yKX1gLCBzdGF0dXNDb2RlKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBiYWNrb2ZmID0gY2FsY3VsYXRlQmFja29mZihcbiAgICAgICAgICByZXRyeUNvdW50LFxuICAgICAgICAgIHRoaXMuY29uZmlnLnJldHJ5SW50ZXJ2YWwsXG4gICAgICAgICAgdGhpcy5jb25maWcuYmFja29mZkZhY3RvcixcbiAgICAgICAgICB0aGlzLmNvbmZpZy5tYXhCYWNrb2ZmXG4gICAgICAgICk7XG4gICAgICAgIGF3YWl0IHNsZWVwKGJhY2tvZmYpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwKICAgICIvKipcbiAqIEFqYXggTW9kdWxlIENvbm5lY3RvcuioreWumlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFNQ0NvbmZpZyB7XG4gIC8qKiDjg6rjgq/jgqjjgrnjg4jjgr/jgqTjg6DjgqLjgqbjg4jvvIjjg5/jg6rnp5LvvIkgKi9cbiAgdGltZW91dDogbnVtYmVyO1xuXG4gIC8qKiDjg6rjg4jjg6njgqTkuIrpmZDlm57mlbAgKi9cbiAgcmV0cnlMaW1pdDogbnVtYmVyO1xuXG4gIC8qKiDjg6rjg4jjg6njgqTln7rmnKzplpPpmpTvvIjjg5/jg6rnp5LvvIkgKi9cbiAgcmV0cnlJbnRlcnZhbDogbnVtYmVyO1xuXG4gIC8qKiDmnIDlpKfjg5Djg4Pjgq/jgqrjg5XvvIjjg5/jg6rnp5LvvIkgKi9cbiAgbWF4QmFja29mZjogbnVtYmVyO1xuXG4gIC8qKiDjg5Djg4Pjgq/jgqrjg5Xkv4LmlbAgKi9cbiAgYmFja29mZkZhY3RvcjogbnVtYmVyO1xuXG4gIC8qKiDmnIDlpKfkuKbliJfjg6rjgq/jgqjjgrnjg4jmlbAgKi9cbiAgc2VtYXBob3JlTGltaXQ6IG51bWJlcjtcbn1cblxuLyoqIOODh+ODleOCqeODq+ODiEFNQ+ioreWumiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfQU1DX0NPTkZJRzogQU1DQ29uZmlnID0ge1xuICB0aW1lb3V0OiAyMDAwMCxcbiAgcmV0cnlMaW1pdDogMyxcbiAgcmV0cnlJbnRlcnZhbDogMTAwMCxcbiAgbWF4QmFja29mZjogNjAwMDAsXG4gIGJhY2tvZmZGYWN0b3I6IDIuMCxcbiAgc2VtYXBob3JlTGltaXQ6IDEwLFxufTtcblxuLyoqXG4gKiBXaWtpZG9044GM6KaB5rGC44GZ44KL5Zu65a6a44OI44O844Kv44Oz5YCkXG4gKiDjgZPjgozjga9XaWtpZG9044Gu44OV44Ot44Oz44OI44Ko44Oz44OJ44GL44KJ5Y+W5b6X44GV44KM44KL5Zu65a6a5YCk44Gn44CBXG4gKiDjgrvjgq3jg6Xjg6rjg4bjgqPjg4jjg7zjgq/jg7Pjgafjga/jgarjgY/ljZjjgarjgovorZjliKXlrZDjgajjgZfjgabkvb/nlKjjgZXjgozjgotcbiAqL1xuZXhwb3J0IGNvbnN0IFdJS0lET1RfVE9LRU43ID0gJzEyMzQ1Nic7XG5cbi8qKlxuICogSFRUUOOCqOODqeODvOaZguOBruODleOCqeODvOODq+ODkOODg+OCr+OCueODhuODvOOCv+OCueOCs+ODvOODiVxuICog44Os44K544Od44Oz44K544GL44KJ44K544OG44O844K/44K544Kz44O844OJ44KS5Y+W5b6X44Gn44GN44Gq44GE5aC05ZCI44Gr5L2/55SoXG4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX0hUVFBfU1RBVFVTX0NPREUgPSA5OTk7XG4iLAogICAgIi8qKlxuICogQU1D44Oq44Kv44Ko44K544OI44OY44OD44OA44O844KS566h55CG44GZ44KL44Kv44Op44K5XG4gKi9cbmV4cG9ydCBjbGFzcyBBTUNIZWFkZXIge1xuICBwcml2YXRlIGNvb2tpZXM6IE1hcDxzdHJpbmcsIHN0cmluZz47XG4gIHByaXZhdGUgY29udGVudFR5cGU6IHN0cmluZztcbiAgcHJpdmF0ZSB1c2VyQWdlbnQ6IHN0cmluZztcbiAgcHJpdmF0ZSByZWZlcmVyOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBvcHRpb25zIC0g44OY44OD44OA44O85Yid5pyf5YyW44Kq44OX44K344On44OzXG4gICAqL1xuICBjb25zdHJ1Y3RvcihvcHRpb25zPzogeyBjb250ZW50VHlwZT86IHN0cmluZzsgdXNlckFnZW50Pzogc3RyaW5nOyByZWZlcmVyPzogc3RyaW5nIH0pIHtcbiAgICB0aGlzLmNvbnRlbnRUeXBlID0gb3B0aW9ucz8uY29udGVudFR5cGUgPz8gJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDsgY2hhcnNldD1VVEYtOCc7XG4gICAgdGhpcy51c2VyQWdlbnQgPSBvcHRpb25zPy51c2VyQWdlbnQgPz8gJ1dpa2lkb3RUUyc7XG4gICAgdGhpcy5yZWZlcmVyID0gb3B0aW9ucz8ucmVmZXJlciA/PyAnaHR0cHM6Ly93d3cud2lraWRvdC5jb20vJztcbiAgICB0aGlzLmNvb2tpZXMgPSBuZXcgTWFwKFtbJ3dpa2lkb3RfdG9rZW43JywgJzEyMzQ1NiddXSk7XG4gIH1cblxuICAvKipcbiAgICogQ29va2ll44KS6Kit5a6a44GZ44KLXG4gICAqIEBwYXJhbSBuYW1lIC0gQ29va2ll5ZCNXG4gICAqIEBwYXJhbSB2YWx1ZSAtIENvb2tpZeWApFxuICAgKi9cbiAgc2V0Q29va2llKG5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuY29va2llcy5zZXQobmFtZSwgdmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvb2tpZeOCkuWJiumZpOOBmeOCi1xuICAgKiBAcGFyYW0gbmFtZSAtIENvb2tpZeWQjVxuICAgKi9cbiAgZGVsZXRlQ29va2llKG5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuY29va2llcy5kZWxldGUobmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogQ29va2ll44KS5Y+W5b6X44GZ44KLXG4gICAqIEBwYXJhbSBuYW1lIC0gQ29va2ll5ZCNXG4gICAqIEByZXR1cm5zIENvb2tpZeWApOOAgeWtmOWcqOOBl+OBquOBhOWgtOWQiOOBr3VuZGVmaW5lZFxuICAgKi9cbiAgZ2V0Q29va2llKG5hbWU6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuY29va2llcy5nZXQobmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogSFRUUOODmOODg+ODgOODvOOCquODluOCuOOCp+OCr+ODiOOCkuWPluW+l+OBmeOCi1xuICAgKiBAcmV0dXJucyDjg5jjg4Pjg4Djg7zovp7mm7hcbiAgICovXG4gIGdldEhlYWRlcnMoKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gICAgY29uc3QgY29va2llU3RyaW5nID0gQXJyYXkuZnJvbSh0aGlzLmNvb2tpZXMuZW50cmllcygpKVxuICAgICAgLm1hcCgoW25hbWUsIHZhbHVlXSkgPT4gYCR7bmFtZX09JHt2YWx1ZX1gKVxuICAgICAgLmpvaW4oJzsgJyk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgJ0NvbnRlbnQtVHlwZSc6IHRoaXMuY29udGVudFR5cGUsXG4gICAgICAnVXNlci1BZ2VudCc6IHRoaXMudXNlckFnZW50LFxuICAgICAgUmVmZXJlcjogdGhpcy5yZWZlcmVyLFxuICAgICAgQ29va2llOiBjb29raWVTdHJpbmcsXG4gICAgfTtcbiAgfVxufVxuIiwKICAgICJpbXBvcnQgeyB6IH0gZnJvbSAnem9kJztcblxuLyoqXG4gKiBBTUPjg6rjgq/jgqjjgrnjg4jjg5zjg4fjgqPjga7lgKTlnotcbiAqL1xuZXhwb3J0IHR5cGUgQU1DUmVxdWVzdEJvZHlWYWx1ZSA9XG4gIHwgc3RyaW5nXG4gIHwgbnVtYmVyXG4gIHwgYm9vbGVhblxuICB8IG51bGxcbiAgfCB1bmRlZmluZWRcbiAgfCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICB8IEFNQ1JlcXVlc3RCb2R5VmFsdWVbXTtcblxuLyoqXG4gKiBBTUPjg6rjgq/jgqjjgrnjg4jjg5zjg4fjgqPjga7lnovlrprnvqlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBTUNSZXF1ZXN0Qm9keSB7XG4gIG1vZHVsZU5hbWU/OiBzdHJpbmc7XG4gIGFjdGlvbj86IHN0cmluZztcbiAgZXZlbnQ/OiBzdHJpbmc7XG4gIFtrZXk6IHN0cmluZ106IEFNQ1JlcXVlc3RCb2R5VmFsdWU7XG59XG5cbi8qKlxuICogQU1D44Os44K544Od44Oz44K544Gu44OZ44O844K544K544Kt44O844OeXG4gKi9cbmNvbnN0IGJhc2VTY2hlbWE6IHouWm9kT2JqZWN0PHtcbiAgc3RhdHVzOiB6LlpvZFN0cmluZztcbiAgYm9keTogei5ab2RPcHRpb25hbDx6LlpvZFN0cmluZz47XG4gIG1lc3NhZ2U6IHouWm9kT3B0aW9uYWw8ei5ab2RTdHJpbmc+O1xufT4gPSB6Lm9iamVjdCh7XG4gIHN0YXR1czogei5zdHJpbmcoKSxcbiAgYm9keTogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICBtZXNzYWdlOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG59KTtcblxuLyoqXG4gKiBBTUPjg6zjgrnjg53jg7Pjgrnjgrnjgq3jg7zjg55cbiAqL1xuZXhwb3J0IGNvbnN0IGFtY1Jlc3BvbnNlU2NoZW1hOiB6LlpvZFR5cGU8ei5pbmZlcjx0eXBlb2YgYmFzZVNjaGVtYT4gJiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4gPVxuICBiYXNlU2NoZW1hLnBhc3N0aHJvdWdoKCk7XG5cbi8qKlxuICogQU1D44Os44K544Od44Oz44K55Z6LXG4gKi9cbmV4cG9ydCB0eXBlIEFNQ1Jlc3BvbnNlID0gei5pbmZlcjx0eXBlb2YgYW1jUmVzcG9uc2VTY2hlbWE+O1xuXG4vKipcbiAqIOaIkOWKn+OBl+OBn0FNQ+ODrOOCueODneODs+OCuVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFNQ1N1Y2Nlc3NSZXNwb25zZSB7XG4gIHN0YXR1czogJ29rJztcbiAgYm9keTogc3RyaW5nO1xuICBba2V5OiBzdHJpbmddOiB1bmtub3duO1xufVxuXG4vKipcbiAqIEFNQ+ODrOOCueODneODs+OCueOBjOaIkOWKn+OBi+OBqeOBhuOBi+OCkuWIpOWumuOBmeOCi+Wei+OCrOODvOODiVxuICogQHBhcmFtIHJlc3BvbnNlIC0gQU1D44Os44K544Od44Oz44K5XG4gKiBAcmV0dXJucyDmiJDlip/jg6zjgrnjg53jg7Pjgrnjga7loLTlkIh0cnVlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1N1Y2Nlc3NSZXNwb25zZShyZXNwb25zZTogQU1DUmVzcG9uc2UpOiByZXNwb25zZSBpcyBBTUNTdWNjZXNzUmVzcG9uc2Uge1xuICByZXR1cm4gcmVzcG9uc2Uuc3RhdHVzID09PSAnb2snO1xufVxuIiwKICAgICJpbXBvcnQgeyBTZXNzaW9uQ3JlYXRlRXJyb3IgfSBmcm9tICcuLi9jb21tb24vZXJyb3JzJztcbmltcG9ydCB7IGZyb21Qcm9taXNlLCB0eXBlIFdpa2lkb3RSZXN1bHRBc3luYywgd2RPa0FzeW5jIH0gZnJvbSAnLi4vY29tbW9uL3R5cGVzJztcbmltcG9ydCB0eXBlIHsgQXV0aENsaWVudENvbnRleHQgfSBmcm9tICcuLi9tb2R1bGUvdHlwZXMnO1xuXG5jb25zdCBMT0dJTl9VUkwgPSAnaHR0cHM6Ly93d3cud2lraWRvdC5jb20vZGVmYXVsdC0tZmxvdy9sb2dpbl9fTG9naW5Qb3B1cFNjcmVlbic7XG5cbi8qKlxuICog44Om44O844K244O85ZCN44Go44OR44K544Ov44O844OJ44GnV2lraWRvdOOBq+ODreOCsOOCpOODs+OBmeOCi1xuICogQHBhcmFtIGNsaWVudCAtIOOCr+ODqeOCpOOCouODs+ODiOOCs+ODs+ODhuOCreOCueODiO+8iEFNQ0NsaWVudOOCkuaMgeOBpOOCquODluOCuOOCp+OCr+ODiO+8iVxuICogQHBhcmFtIHVzZXJuYW1lIC0g44Om44O844K244O85ZCNXG4gKiBAcGFyYW0gcGFzc3dvcmQgLSDjg5Hjgrnjg6/jg7zjg4lcbiAqIEByZXR1cm5zIOaIkOWKn+aZguOBr3ZvaWTjgIHlpLHmlZfmmYLjga9TZXNzaW9uQ3JlYXRlRXJyb3JcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvZ2luKFxuICBjbGllbnQ6IEF1dGhDbGllbnRDb250ZXh0LFxuICB1c2VybmFtZTogc3RyaW5nLFxuICBwYXNzd29yZDogc3RyaW5nXG4pOiBXaWtpZG90UmVzdWx0QXN5bmM8dm9pZD4ge1xuICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgKGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh7XG4gICAgICAgIGxvZ2luOiB1c2VybmFtZSxcbiAgICAgICAgcGFzc3dvcmQ6IHBhc3N3b3JkLFxuICAgICAgICBhY3Rpb246ICdMb2dpbjJBY3Rpb24nLFxuICAgICAgICBldmVudDogJ2xvZ2luJyxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKExPR0lOX1VSTCwge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgaGVhZGVyczogY2xpZW50LmFtY0NsaWVudC5oZWFkZXIuZ2V0SGVhZGVycygpLFxuICAgICAgICBib2R5OiBmb3JtRGF0YS50b1N0cmluZygpLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIENoZWNrIHN0YXR1cyBjb2RlXG4gICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgIHRocm93IG5ldyBTZXNzaW9uQ3JlYXRlRXJyb3IoXG4gICAgICAgICAgYExvZ2luIGF0dGVtcHQgZmFpbGVkIGR1ZSB0byBIVFRQIHN0YXR1cyBjb2RlOiAke3Jlc3BvbnNlLnN0YXR1c31gXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGJvZHkgZm9yIGVycm9yIG1lc3NhZ2VcbiAgICAgIGNvbnN0IGJvZHkgPSBhd2FpdCByZXNwb25zZS50ZXh0KCk7XG4gICAgICBpZiAoYm9keS5pbmNsdWRlcygnVGhlIGxvZ2luIGFuZCBwYXNzd29yZCBkbyBub3QgbWF0Y2gnKSkge1xuICAgICAgICB0aHJvdyBuZXcgU2Vzc2lvbkNyZWF0ZUVycm9yKCdMb2dpbiBhdHRlbXB0IGZhaWxlZCBkdWUgdG8gaW52YWxpZCB1c2VybmFtZSBvciBwYXNzd29yZCcpO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBjb29raWVzXG4gICAgICBjb25zdCBjb29raWVzID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoJ1NldC1Db29raWUnKTtcbiAgICAgIGlmICghY29va2llcykge1xuICAgICAgICB0aHJvdyBuZXcgU2Vzc2lvbkNyZWF0ZUVycm9yKCdMb2dpbiBhdHRlbXB0IGZhaWxlZCBkdWUgdG8gbWlzc2luZyBjb29raWVzJyk7XG4gICAgICB9XG5cbiAgICAgIC8vIEV4dHJhY3QgV0lLSURPVF9TRVNTSU9OX0lEIGZyb20gY29va2llc1xuICAgICAgY29uc3Qgc2Vzc2lvbklkTWF0Y2ggPSBjb29raWVzLm1hdGNoKC9XSUtJRE9UX1NFU1NJT05fSUQ9KFteO10rKS8pO1xuICAgICAgaWYgKCFzZXNzaW9uSWRNYXRjaD8uWzFdKSB7XG4gICAgICAgIHRocm93IG5ldyBTZXNzaW9uQ3JlYXRlRXJyb3IoXG4gICAgICAgICAgJ0xvZ2luIGF0dGVtcHQgZmFpbGVkIGR1ZSB0byBtaXNzaW5nIFdJS0lET1RfU0VTU0lPTl9JRCBjb29raWUnXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIFNldCBzZXNzaW9uIGNvb2tpZVxuICAgICAgY2xpZW50LmFtY0NsaWVudC5oZWFkZXIuc2V0Q29va2llKCdXSUtJRE9UX1NFU1NJT05fSUQnLCBzZXNzaW9uSWRNYXRjaFsxXSk7XG4gICAgfSkoKSxcbiAgICAoZXJyb3IpID0+IHtcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFNlc3Npb25DcmVhdGVFcnJvcikge1xuICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICB9XG4gICAgICByZXR1cm4gbmV3IFNlc3Npb25DcmVhdGVFcnJvcihgTG9naW4gZmFpbGVkOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgfVxuICApO1xufVxuXG4vKipcbiAqIOODreOCsOOCouOCpuODiOOBmeOCi1xuICogQHBhcmFtIGNsaWVudCAtIOOCr+ODqeOCpOOCouODs+ODiOOCs+ODs+ODhuOCreOCueODiO+8iEFNQ0NsaWVudOOCkuaMgeOBpOOCquODluOCuOOCp+OCr+ODiO+8iVxuICogQHJldHVybnMg5oiQ5Yqf5pmC44Gvdm9pZFxuICovXG5leHBvcnQgZnVuY3Rpb24gbG9nb3V0KGNsaWVudDogQXV0aENsaWVudENvbnRleHQpOiBXaWtpZG90UmVzdWx0QXN5bmM8dm9pZD4ge1xuICAvLyBUcnkgdG8gbG9nb3V0IHZpYSBBTUMsIHRoZW4gYWx3YXlzIHJlbW92ZSBzZXNzaW9uIGNvb2tpZVxuICByZXR1cm4gY2xpZW50LmFtY0NsaWVudFxuICAgIC5yZXF1ZXN0KFtcbiAgICAgIHtcbiAgICAgICAgbW9kdWxlTmFtZTogJ0VtcHR5JyxcbiAgICAgICAgYWN0aW9uOiAnTG9naW4yQWN0aW9uJyxcbiAgICAgICAgZXZlbnQ6ICdsb2dvdXQnLFxuICAgICAgfSxcbiAgICBdKVxuICAgIC5tYXAoKCkgPT4ge1xuICAgICAgLy8gTG9nb3V0IHN1Y2NlZWRlZCwgcmVtb3ZlIHNlc3Npb24gY29va2llXG4gICAgICBjbGllbnQuYW1jQ2xpZW50LmhlYWRlci5kZWxldGVDb29raWUoJ1dJS0lET1RfU0VTU0lPTl9JRCcpO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9KVxuICAgIC5vckVsc2UoKCkgPT4ge1xuICAgICAgLy8gRXZlbiBpZiBsb2dvdXQgcmVxdWVzdCBmYWlscywgd2Ugc3RpbGwgd2FudCB0byBjbGVhciB0aGUgc2Vzc2lvbiBsb2NhbGx5XG4gICAgICBjbGllbnQuYW1jQ2xpZW50LmhlYWRlci5kZWxldGVDb29raWUoJ1dJS0lET1RfU0VTU0lPTl9JRCcpO1xuICAgICAgcmV0dXJuIHdkT2tBc3luYyh1bmRlZmluZWQpO1xuICAgIH0pO1xufVxuIiwKICAgICJpbXBvcnQgKiBhcyBjaGVlcmlvIGZyb20gJ2NoZWVyaW8nO1xuaW1wb3J0IHtcbiAgRm9yYmlkZGVuRXJyb3IsXG4gIExvZ2luUmVxdWlyZWRFcnJvcixcbiAgTm9FbGVtZW50RXJyb3IsXG4gIFVuZXhwZWN0ZWRFcnJvcixcbn0gZnJvbSAnLi4vLi4vY29tbW9uL2Vycm9ycyc7XG5pbXBvcnQgeyBmcm9tUHJvbWlzZSwgdHlwZSBXaWtpZG90UmVzdWx0QXN5bmMgfSBmcm9tICcuLi8uLi9jb21tb24vdHlwZXMnO1xuaW1wb3J0IHsgcGFyc2VPZGF0ZSwgcGFyc2VVc2VyIH0gZnJvbSAnLi4vLi4vdXRpbC9wYXJzZXInO1xuaW1wb3J0IHR5cGUgeyBDbGllbnQgfSBmcm9tICcuLi9jbGllbnQnO1xuaW1wb3J0IHR5cGUgeyBBYnN0cmFjdFVzZXIgfSBmcm9tICcuLi91c2VyJztcbmltcG9ydCB0eXBlIHsgVXNlciB9IGZyb20gJy4uL3VzZXIvdXNlcic7XG5cbi8qKlxuICog44OX44Op44Kk44OZ44O844OI44Oh44OD44K744O844K444OH44O844K/XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJpdmF0ZU1lc3NhZ2VEYXRhIHtcbiAgY2xpZW50OiBDbGllbnQ7XG4gIGlkOiBudW1iZXI7XG4gIHNlbmRlcjogQWJzdHJhY3RVc2VyO1xuICByZWNpcGllbnQ6IEFic3RyYWN0VXNlcjtcbiAgc3ViamVjdDogc3RyaW5nO1xuICBib2R5OiBzdHJpbmc7XG4gIGNyZWF0ZWRBdDogRGF0ZTtcbn1cblxuLyoqXG4gKiDjg5fjg6njgqTjg5njg7zjg4jjg6Hjg4Pjgrvjg7zjgrhcbiAqL1xuZXhwb3J0IGNsYXNzIFByaXZhdGVNZXNzYWdlIHtcbiAgcHVibGljIHJlYWRvbmx5IGNsaWVudDogQ2xpZW50O1xuICBwdWJsaWMgcmVhZG9ubHkgaWQ6IG51bWJlcjtcbiAgcHVibGljIHJlYWRvbmx5IHNlbmRlcjogQWJzdHJhY3RVc2VyO1xuICBwdWJsaWMgcmVhZG9ubHkgcmVjaXBpZW50OiBBYnN0cmFjdFVzZXI7XG4gIHB1YmxpYyByZWFkb25seSBzdWJqZWN0OiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSBib2R5OiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSBjcmVhdGVkQXQ6IERhdGU7XG5cbiAgY29uc3RydWN0b3IoZGF0YTogUHJpdmF0ZU1lc3NhZ2VEYXRhKSB7XG4gICAgdGhpcy5jbGllbnQgPSBkYXRhLmNsaWVudDtcbiAgICB0aGlzLmlkID0gZGF0YS5pZDtcbiAgICB0aGlzLnNlbmRlciA9IGRhdGEuc2VuZGVyO1xuICAgIHRoaXMucmVjaXBpZW50ID0gZGF0YS5yZWNpcGllbnQ7XG4gICAgdGhpcy5zdWJqZWN0ID0gZGF0YS5zdWJqZWN0O1xuICAgIHRoaXMuYm9keSA9IGRhdGEuYm9keTtcbiAgICB0aGlzLmNyZWF0ZWRBdCA9IGRhdGEuY3JlYXRlZEF0O1xuICB9XG5cbiAgLyoqXG4gICAqIOODoeODg+OCu+ODvOOCuElE44GL44KJ44Oh44OD44K744O844K444KS5Y+W5b6X44GZ44KLXG4gICAqIEBwYXJhbSBjbGllbnQgLSDjgq/jg6njgqTjgqLjg7Pjg4hcbiAgICogQHBhcmFtIG1lc3NhZ2VJZCAtIOODoeODg+OCu+ODvOOCuElEXG4gICAqIEByZXR1cm5zIOODl+ODqeOCpOODmeODvOODiOODoeODg+OCu+ODvOOCuFxuICAgKi9cbiAgc3RhdGljIGZyb21JZChjbGllbnQ6IENsaWVudCwgbWVzc2FnZUlkOiBudW1iZXIpOiBXaWtpZG90UmVzdWx0QXN5bmM8UHJpdmF0ZU1lc3NhZ2U+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBQcml2YXRlTWVzc2FnZUNvbGxlY3Rpb24uZnJvbUlkcyhjbGllbnQsIFttZXNzYWdlSWRdKTtcbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSByZXN1bHQudmFsdWVbMF07XG4gICAgICAgIGlmICghbWVzc2FnZSkge1xuICAgICAgICAgIHRocm93IG5ldyBOb0VsZW1lbnRFcnJvcihgTWVzc2FnZSBub3QgZm91bmQ6ICR7bWVzc2FnZUlkfWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBGb3JiaWRkZW5FcnJvciB8fCBlcnJvciBpbnN0YW5jZW9mIE5vRWxlbWVudEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gZ2V0IG1lc3NhZ2U6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIOODl+ODqeOCpOODmeODvOODiOODoeODg+OCu+ODvOOCuOOCkumAgeS/oeOBmeOCi1xuICAgKiBAcGFyYW0gY2xpZW50IC0g44Kv44Op44Kk44Ki44Oz44OIXG4gICAqIEBwYXJhbSByZWNpcGllbnQgLSDlj5fkv6HogIVcbiAgICogQHBhcmFtIHN1YmplY3QgLSDku7blkI1cbiAgICogQHBhcmFtIGJvZHkgLSDmnKzmlodcbiAgICovXG4gIHN0YXRpYyBzZW5kKFxuICAgIGNsaWVudDogQ2xpZW50LFxuICAgIHJlY2lwaWVudDogVXNlcixcbiAgICBzdWJqZWN0OiBzdHJpbmcsXG4gICAgYm9keTogc3RyaW5nXG4gICk6IFdpa2lkb3RSZXN1bHRBc3luYzx2b2lkPiB7XG4gICAgY29uc3QgbG9naW5SZXN1bHQgPSBjbGllbnQucmVxdWlyZUxvZ2luKCk7XG4gICAgaWYgKGxvZ2luUmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgICAgUHJvbWlzZS5yZWplY3QobG9naW5SZXN1bHQuZXJyb3IpLFxuICAgICAgICAoKSA9PiBuZXcgTG9naW5SZXF1aXJlZEVycm9yKCdMb2dpbiByZXF1aXJlZCB0byBzZW5kIG1lc3NhZ2UnKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjbGllbnQuYW1jQ2xpZW50LnJlcXVlc3QoW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHNvdXJjZTogYm9keSxcbiAgICAgICAgICAgIHN1YmplY3QsXG4gICAgICAgICAgICB0b191c2VyX2lkOiByZWNpcGllbnQuaWQsXG4gICAgICAgICAgICBhY3Rpb246ICdEYXNoYm9hcmRNZXNzYWdlQWN0aW9uJyxcbiAgICAgICAgICAgIGV2ZW50OiAnc2VuZCcsXG4gICAgICAgICAgICBtb2R1bGVOYW1lOiAnRW1wdHknLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pO1xuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBzZW5kIG1lc3NhZ2U6ICR7U3RyaW5nKGVycm9yKX1gKVxuICAgICk7XG4gIH1cblxuICB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiBgUHJpdmF0ZU1lc3NhZ2UoaWQ9JHt0aGlzLmlkfSwgc2VuZGVyPSR7dGhpcy5zZW5kZXJ9LCByZWNpcGllbnQ9JHt0aGlzLnJlY2lwaWVudH0sIHN1YmplY3Q9JHt0aGlzLnN1YmplY3R9KWA7XG4gIH1cbn1cblxuLyoqXG4gKiDjg5fjg6njgqTjg5njg7zjg4jjg6Hjg4Pjgrvjg7zjgrjjgrPjg6zjgq/jgrfjg6fjg7NcbiAqL1xuZXhwb3J0IGNsYXNzIFByaXZhdGVNZXNzYWdlQ29sbGVjdGlvbiBleHRlbmRzIEFycmF5PFByaXZhdGVNZXNzYWdlPiB7XG4gIHB1YmxpYyByZWFkb25seSBjbGllbnQ6IENsaWVudDtcblxuICBjb25zdHJ1Y3RvcihjbGllbnQ6IENsaWVudCwgbWVzc2FnZXM/OiBQcml2YXRlTWVzc2FnZVtdKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmNsaWVudCA9IGNsaWVudDtcbiAgICBpZiAobWVzc2FnZXMpIHtcbiAgICAgIHRoaXMucHVzaCguLi5tZXNzYWdlcyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIElE44Gn5qSc57SiXG4gICAqL1xuICBmaW5kQnlJZChpZDogbnVtYmVyKTogUHJpdmF0ZU1lc3NhZ2UgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmZpbmQoKG1lc3NhZ2UpID0+IG1lc3NhZ2UuaWQgPT09IGlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDjg6Hjg4Pjgrvjg7zjgrhJROOBruODquOCueODiOOBi+OCieODoeODg+OCu+ODvOOCuOOCkuWPluW+l+OBmeOCi1xuICAgKi9cbiAgc3RhdGljIGZyb21JZHMoXG4gICAgY2xpZW50OiBDbGllbnQsXG4gICAgbWVzc2FnZUlkczogbnVtYmVyW11cbiAgKTogV2lraWRvdFJlc3VsdEFzeW5jPFByaXZhdGVNZXNzYWdlQ29sbGVjdGlvbj4ge1xuICAgIGNvbnN0IGxvZ2luUmVzdWx0ID0gY2xpZW50LnJlcXVpcmVMb2dpbigpO1xuICAgIGlmIChsb2dpblJlc3VsdC5pc0VycigpKSB7XG4gICAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAgIFByb21pc2UucmVqZWN0KGxvZ2luUmVzdWx0LmVycm9yKSxcbiAgICAgICAgKCkgPT4gbmV3IExvZ2luUmVxdWlyZWRFcnJvcignTG9naW4gcmVxdWlyZWQgdG8gZ2V0IG1lc3NhZ2VzJylcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgYm9kaWVzID0gbWVzc2FnZUlkcy5tYXAoKG1lc3NhZ2VJZCkgPT4gKHtcbiAgICAgICAgICBpdGVtOiBtZXNzYWdlSWQsXG4gICAgICAgICAgbW9kdWxlTmFtZTogJ2Rhc2hib2FyZC9tZXNzYWdlcy9ETVZpZXdNZXNzYWdlTW9kdWxlJyxcbiAgICAgICAgfSkpO1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNsaWVudC5hbWNDbGllbnQucmVxdWVzdChib2RpZXMpO1xuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBtZXNzYWdlczogUHJpdmF0ZU1lc3NhZ2VbXSA9IFtdO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbWVzc2FnZUlkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gcmVzdWx0LnZhbHVlW2ldO1xuICAgICAgICAgIGNvbnN0IG1lc3NhZ2VJZCA9IG1lc3NhZ2VJZHNbaV07XG4gICAgICAgICAgaWYgKCFyZXNwb25zZSB8fCBtZXNzYWdlSWQgPT09IHVuZGVmaW5lZCkgY29udGludWU7XG5cbiAgICAgICAgICBjb25zdCBodG1sID0gU3RyaW5nKHJlc3BvbnNlLmJvZHkgPz8gJycpO1xuICAgICAgICAgIGNvbnN0ICQgPSBjaGVlcmlvLmxvYWQoaHRtbCk7XG5cbiAgICAgICAgICAvLyDjg6bjg7zjgrbjg7zmg4XloLHjgpLlj5blvpdcbiAgICAgICAgICBjb25zdCBwcmludHVzZXJFbGVtcyA9ICQoJ2Rpdi5wbWVzc2FnZSBkaXYuaGVhZGVyIHNwYW4ucHJpbnR1c2VyJyk7XG4gICAgICAgICAgaWYgKHByaW50dXNlckVsZW1zLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBGb3JiaWRkZW5FcnJvcihgRmFpbGVkIHRvIGdldCBtZXNzYWdlOiAke21lc3NhZ2VJZH1gKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBzZW5kZXJFbGVtID0gJChwcmludHVzZXJFbGVtc1swXSk7XG4gICAgICAgICAgY29uc3QgcmVjaXBpZW50RWxlbSA9ICQocHJpbnR1c2VyRWxlbXNbMV0pO1xuXG4gICAgICAgICAgY29uc3Qgc2VuZGVyID0gcGFyc2VVc2VyKGNsaWVudCwgc2VuZGVyRWxlbSk7XG4gICAgICAgICAgY29uc3QgcmVjaXBpZW50ID0gcGFyc2VVc2VyKGNsaWVudCwgcmVjaXBpZW50RWxlbSk7XG5cbiAgICAgICAgICAvLyDku7blkI1cbiAgICAgICAgICBjb25zdCBzdWJqZWN0RWxlbSA9ICQoJ2Rpdi5wbWVzc2FnZSBkaXYuaGVhZGVyIHNwYW4uc3ViamVjdCcpO1xuICAgICAgICAgIGNvbnN0IHN1YmplY3QgPSBzdWJqZWN0RWxlbS50ZXh0KCkudHJpbSgpO1xuXG4gICAgICAgICAgLy8g5pys5paHXG4gICAgICAgICAgY29uc3QgYm9keUVsZW0gPSAkKCdkaXYucG1lc3NhZ2UgZGl2LmJvZHknKTtcbiAgICAgICAgICBjb25zdCBib2R5ID0gYm9keUVsZW0udGV4dCgpLnRyaW0oKTtcblxuICAgICAgICAgIC8vIOaXpeaZglxuICAgICAgICAgIGNvbnN0IG9kYXRlRWxlbSA9ICQoJ2Rpdi5oZWFkZXIgc3Bhbi5vZGF0ZScpO1xuICAgICAgICAgIGNvbnN0IGNyZWF0ZWRBdCA9XG4gICAgICAgICAgICBvZGF0ZUVsZW0ubGVuZ3RoID4gMCA/IChwYXJzZU9kYXRlKG9kYXRlRWxlbSkgPz8gbmV3IERhdGUoMCkpIDogbmV3IERhdGUoMCk7XG5cbiAgICAgICAgICBtZXNzYWdlcy5wdXNoKFxuICAgICAgICAgICAgbmV3IFByaXZhdGVNZXNzYWdlKHtcbiAgICAgICAgICAgICAgY2xpZW50LFxuICAgICAgICAgICAgICBpZDogbWVzc2FnZUlkLFxuICAgICAgICAgICAgICBzZW5kZXIsXG4gICAgICAgICAgICAgIHJlY2lwaWVudCxcbiAgICAgICAgICAgICAgc3ViamVjdCxcbiAgICAgICAgICAgICAgYm9keSxcbiAgICAgICAgICAgICAgY3JlYXRlZEF0LFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBQcml2YXRlTWVzc2FnZUNvbGxlY3Rpb24oY2xpZW50LCBtZXNzYWdlcyk7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEZvcmJpZGRlbkVycm9yIHx8IGVycm9yIGluc3RhbmNlb2YgTG9naW5SZXF1aXJlZEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gZ2V0IG1lc3NhZ2VzOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDjg6Ljgrjjg6Xjg7zjg6vjgYvjgonjg6Hjg4Pjgrvjg7zjgrjjgpLlj5blvpfjgZnjgovlhoXpg6jjg6Hjgr3jg4Pjg4lcbiAgICovXG4gIHByb3RlY3RlZCBzdGF0aWMgYWNxdWlyZUZyb21Nb2R1bGUoXG4gICAgY2xpZW50OiBDbGllbnQsXG4gICAgbW9kdWxlTmFtZTogc3RyaW5nXG4gICk6IFdpa2lkb3RSZXN1bHRBc3luYzxQcml2YXRlTWVzc2FnZUNvbGxlY3Rpb24+IHtcbiAgICBjb25zdCBsb2dpblJlc3VsdCA9IGNsaWVudC5yZXF1aXJlTG9naW4oKTtcbiAgICBpZiAobG9naW5SZXN1bHQuaXNFcnIoKSkge1xuICAgICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgICBQcm9taXNlLnJlamVjdChsb2dpblJlc3VsdC5lcnJvciksXG4gICAgICAgICgpID0+IG5ldyBMb2dpblJlcXVpcmVkRXJyb3IoJ0xvZ2luIHJlcXVpcmVkIHRvIGdldCBtZXNzYWdlcycpXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIC8vIOODmuODvOOCuOODo+ODvOWPluW+l1xuICAgICAgICBjb25zdCBmaXJzdFJlc3VsdCA9IGF3YWl0IGNsaWVudC5hbWNDbGllbnQucmVxdWVzdChbeyBtb2R1bGVOYW1lIH1dKTtcbiAgICAgICAgaWYgKGZpcnN0UmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyBmaXJzdFJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZpcnN0UmVzcG9uc2UgPSBmaXJzdFJlc3VsdC52YWx1ZVswXTtcbiAgICAgICAgaWYgKCFmaXJzdFJlc3BvbnNlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IE5vRWxlbWVudEVycm9yKCdFbXB0eSByZXNwb25zZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZmlyc3RIdG1sID0gU3RyaW5nKGZpcnN0UmVzcG9uc2UuYm9keSA/PyAnJyk7XG4gICAgICAgIGNvbnN0ICRmaXJzdCA9IGNoZWVyaW8ubG9hZChmaXJzdEh0bWwpO1xuXG4gICAgICAgIC8vIOODmuODvOOCuOaVsOOCkuWPluW+l1xuICAgICAgICBjb25zdCBwYWdlclRhcmdldHMgPSAkZmlyc3QoJ2Rpdi5wYWdlciBzcGFuLnRhcmdldCcpO1xuICAgICAgICBsZXQgbWF4UGFnZSA9IDE7XG4gICAgICAgIGlmIChwYWdlclRhcmdldHMubGVuZ3RoID4gMikge1xuICAgICAgICAgIGNvbnN0IGxhc3RQYWdlVGV4dCA9ICRmaXJzdChwYWdlclRhcmdldHNbcGFnZXJUYXJnZXRzLmxlbmd0aCAtIDJdKVxuICAgICAgICAgICAgLnRleHQoKVxuICAgICAgICAgICAgLnRyaW0oKTtcbiAgICAgICAgICBtYXhQYWdlID0gTnVtYmVyLnBhcnNlSW50KGxhc3RQYWdlVGV4dCwgMTApIHx8IDE7XG4gICAgICAgIH1cblxuICAgICAgICAvLyDlhajjg5rjg7zjgrjjgYvjgonjg6Hjg4Pjgrvjg7zjgrhJROOCkuWPluW+l1xuICAgICAgICBjb25zdCBtZXNzYWdlSWRzOiBudW1iZXJbXSA9IFtdO1xuXG4gICAgICAgIGlmIChtYXhQYWdlID4gMSkge1xuICAgICAgICAgIGNvbnN0IGJvZGllcyA9IFtdO1xuICAgICAgICAgIGZvciAobGV0IHBhZ2UgPSAxOyBwYWdlIDw9IG1heFBhZ2U7IHBhZ2UrKykge1xuICAgICAgICAgICAgYm9kaWVzLnB1c2goeyBwYWdlLCBtb2R1bGVOYW1lIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBhZGRpdGlvbmFsUmVzdWx0cyA9IGF3YWl0IGNsaWVudC5hbWNDbGllbnQucmVxdWVzdChib2RpZXMpO1xuICAgICAgICAgIGlmIChhZGRpdGlvbmFsUmVzdWx0cy5pc0VycigpKSB7XG4gICAgICAgICAgICB0aHJvdyBhZGRpdGlvbmFsUmVzdWx0cy5lcnJvcjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBmb3IgKGNvbnN0IHJlc3BvbnNlIG9mIGFkZGl0aW9uYWxSZXN1bHRzLnZhbHVlKSB7XG4gICAgICAgICAgICBjb25zdCBodG1sID0gU3RyaW5nKHJlc3BvbnNlPy5ib2R5ID8/ICcnKTtcbiAgICAgICAgICAgIGNvbnN0ICQgPSBjaGVlcmlvLmxvYWQoaHRtbCk7XG4gICAgICAgICAgICAkKCd0ci5tZXNzYWdlJykuZWFjaCgoX2ksIGVsZW0pID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgZGF0YUhyZWYgPSAkKGVsZW0pLmF0dHIoJ2RhdGEtaHJlZicpID8/ICcnO1xuICAgICAgICAgICAgICBjb25zdCBpZE1hdGNoID0gZGF0YUhyZWYubWF0Y2goL1xcLyhcXGQrKSQvKTtcbiAgICAgICAgICAgICAgaWYgKGlkTWF0Y2g/LlsxXSkge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2VJZHMucHVzaChOdW1iZXIucGFyc2VJbnQoaWRNYXRjaFsxXSwgMTApKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICRmaXJzdCgndHIubWVzc2FnZScpLmVhY2goKF9pLCBlbGVtKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBkYXRhSHJlZiA9ICRmaXJzdChlbGVtKS5hdHRyKCdkYXRhLWhyZWYnKSA/PyAnJztcbiAgICAgICAgICAgIGNvbnN0IGlkTWF0Y2ggPSBkYXRhSHJlZi5tYXRjaCgvXFwvKFxcZCspJC8pO1xuICAgICAgICAgICAgaWYgKGlkTWF0Y2g/LlsxXSkge1xuICAgICAgICAgICAgICBtZXNzYWdlSWRzLnB1c2goTnVtYmVyLnBhcnNlSW50KGlkTWF0Y2hbMV0sIDEwKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyDjg6Hjg4Pjgrvjg7zjgrjjgpLlj5blvpdcbiAgICAgICAgY29uc3QgbWVzc2FnZXNSZXN1bHQgPSBhd2FpdCBQcml2YXRlTWVzc2FnZUNvbGxlY3Rpb24uZnJvbUlkcyhjbGllbnQsIG1lc3NhZ2VJZHMpO1xuICAgICAgICBpZiAobWVzc2FnZXNSZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IG1lc3NhZ2VzUmVzdWx0LmVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2VzUmVzdWx0LnZhbHVlO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgZXJyb3IgaW5zdGFuY2VvZiBGb3JiaWRkZW5FcnJvciB8fFxuICAgICAgICAgIGVycm9yIGluc3RhbmNlb2YgTG9naW5SZXF1aXJlZEVycm9yIHx8XG4gICAgICAgICAgZXJyb3IgaW5zdGFuY2VvZiBOb0VsZW1lbnRFcnJvclxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBhY3F1aXJlIG1lc3NhZ2VzOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxufVxuXG4vKipcbiAqIOWPl+S/oeeusVxuICovXG5leHBvcnQgY2xhc3MgUHJpdmF0ZU1lc3NhZ2VJbmJveCBleHRlbmRzIFByaXZhdGVNZXNzYWdlQ29sbGVjdGlvbiB7XG4gIC8qKlxuICAgKiDlj5fkv6HnrrHjga7jg6Hjg4Pjgrvjg7zjgrjjgpLjgZnjgbnjgablj5blvpfjgZnjgotcbiAgICovXG4gIHN0YXRpYyBhY3F1aXJlKGNsaWVudDogQ2xpZW50KTogV2lraWRvdFJlc3VsdEFzeW5jPFByaXZhdGVNZXNzYWdlSW5ib3g+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBQcml2YXRlTWVzc2FnZUNvbGxlY3Rpb24uYWNxdWlyZUZyb21Nb2R1bGUoXG4gICAgICAgICAgY2xpZW50LFxuICAgICAgICAgICdkYXNoYm9hcmQvbWVzc2FnZXMvRE1JbmJveE1vZHVsZSdcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGluYm94ID0gbmV3IFByaXZhdGVNZXNzYWdlSW5ib3goY2xpZW50KTtcbiAgICAgICAgaW5ib3gucHVzaCguLi5yZXN1bHQudmFsdWUpO1xuICAgICAgICByZXR1cm4gaW5ib3g7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEZvcmJpZGRlbkVycm9yIHx8IGVycm9yIGluc3RhbmNlb2YgTG9naW5SZXF1aXJlZEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gYWNxdWlyZSBpbmJveDogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cbn1cblxuLyoqXG4gKiDpgIHkv6HnrrFcbiAqL1xuZXhwb3J0IGNsYXNzIFByaXZhdGVNZXNzYWdlU2VudEJveCBleHRlbmRzIFByaXZhdGVNZXNzYWdlQ29sbGVjdGlvbiB7XG4gIC8qKlxuICAgKiDpgIHkv6HnrrHjga7jg6Hjg4Pjgrvjg7zjgrjjgpLjgZnjgbnjgablj5blvpfjgZnjgotcbiAgICovXG4gIHN0YXRpYyBhY3F1aXJlKGNsaWVudDogQ2xpZW50KTogV2lraWRvdFJlc3VsdEFzeW5jPFByaXZhdGVNZXNzYWdlU2VudEJveD4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IFByaXZhdGVNZXNzYWdlQ29sbGVjdGlvbi5hY3F1aXJlRnJvbU1vZHVsZShcbiAgICAgICAgICBjbGllbnQsXG4gICAgICAgICAgJ2Rhc2hib2FyZC9tZXNzYWdlcy9ETVNlbnRNb2R1bGUnXG4gICAgICAgICk7XG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzZW50Qm94ID0gbmV3IFByaXZhdGVNZXNzYWdlU2VudEJveChjbGllbnQpO1xuICAgICAgICBzZW50Qm94LnB1c2goLi4ucmVzdWx0LnZhbHVlKTtcbiAgICAgICAgcmV0dXJuIHNlbnRCb3g7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEZvcmJpZGRlbkVycm9yIHx8IGVycm9yIGluc3RhbmNlb2YgTG9naW5SZXF1aXJlZEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gYWNxdWlyZSBzZW50IGJveDogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBXaWtpZG90UmVzdWx0QXN5bmMgfSBmcm9tICcuLi8uLi8uLi9jb21tb24vdHlwZXMnO1xuaW1wb3J0IHtcbiAgUHJpdmF0ZU1lc3NhZ2UsXG4gIFByaXZhdGVNZXNzYWdlQ29sbGVjdGlvbixcbiAgUHJpdmF0ZU1lc3NhZ2VJbmJveCxcbiAgUHJpdmF0ZU1lc3NhZ2VTZW50Qm94LFxufSBmcm9tICcuLi8uLi9wcml2YXRlLW1lc3NhZ2UnO1xuaW1wb3J0IHR5cGUgeyBVc2VyIH0gZnJvbSAnLi4vLi4vdXNlci91c2VyJztcbmltcG9ydCB0eXBlIHsgQ2xpZW50IH0gZnJvbSAnLi4vY2xpZW50JztcblxuLyoqXG4gKiDjg5fjg6njgqTjg5njg7zjg4jjg6Hjg4Pjgrvjg7zjgrjmk43kvZzjgqLjgq/jgrvjgrVcbiAqL1xuZXhwb3J0IGNsYXNzIFByaXZhdGVNZXNzYWdlQWNjZXNzb3Ige1xuICBwdWJsaWMgcmVhZG9ubHkgY2xpZW50OiBDbGllbnQ7XG5cbiAgY29uc3RydWN0b3IoY2xpZW50OiBDbGllbnQpIHtcbiAgICB0aGlzLmNsaWVudCA9IGNsaWVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiDjg6Hjg4Pjgrvjg7zjgrhJROOBi+OCieODoeODg+OCu+ODvOOCuOOCkuWPluW+l+OBmeOCi1xuICAgKiBAcGFyYW0gaWQgLSDjg6Hjg4Pjgrvjg7zjgrhJRFxuICAgKiBAcmV0dXJucyDjg6Hjg4Pjgrvjg7zjgrjjgqrjg5bjgrjjgqfjgq/jg4hcbiAgICovXG4gIGdldChpZDogbnVtYmVyKTogV2lraWRvdFJlc3VsdEFzeW5jPFByaXZhdGVNZXNzYWdlPiB7XG4gICAgcmV0dXJuIFByaXZhdGVNZXNzYWdlLmZyb21JZCh0aGlzLmNsaWVudCwgaWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIOikh+aVsOOBruODoeODg+OCu+ODvOOCuElE44GL44KJ44Oh44OD44K744O844K444KS5Y+W5b6X44GZ44KLXG4gICAqIEBwYXJhbSBpZHMgLSDjg6Hjg4Pjgrvjg7zjgrhJROmFjeWIl1xuICAgKiBAcmV0dXJucyDjg6Hjg4Pjgrvjg7zjgrjjgrPjg6zjgq/jgrfjg6fjg7NcbiAgICovXG4gIGdldE1lc3NhZ2VzKGlkczogbnVtYmVyW10pOiBXaWtpZG90UmVzdWx0QXN5bmM8UHJpdmF0ZU1lc3NhZ2VDb2xsZWN0aW9uPiB7XG4gICAgcmV0dXJuIFByaXZhdGVNZXNzYWdlQ29sbGVjdGlvbi5mcm9tSWRzKHRoaXMuY2xpZW50LCBpZHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIOWPl+S/oeeuseOBruODoeODg+OCu+ODvOOCuOS4gOimp+OCkuWPluW+l+OBmeOCi1xuICAgKiBAcmV0dXJucyDlj5fkv6HnrrFcbiAgICovXG4gIGluYm94KCk6IFdpa2lkb3RSZXN1bHRBc3luYzxQcml2YXRlTWVzc2FnZUluYm94PiB7XG4gICAgcmV0dXJuIFByaXZhdGVNZXNzYWdlSW5ib3guYWNxdWlyZSh0aGlzLmNsaWVudCk7XG4gIH1cblxuICAvKipcbiAgICog6YCB5L+h566x44Gu44Oh44OD44K744O844K45LiA6Kan44KS5Y+W5b6X44GZ44KLXG4gICAqIEByZXR1cm5zIOmAgeS/oeeusVxuICAgKi9cbiAgc2VudEJveCgpOiBXaWtpZG90UmVzdWx0QXN5bmM8UHJpdmF0ZU1lc3NhZ2VTZW50Qm94PiB7XG4gICAgcmV0dXJuIFByaXZhdGVNZXNzYWdlU2VudEJveC5hY3F1aXJlKHRoaXMuY2xpZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDjg5fjg6njgqTjg5njg7zjg4jjg6Hjg4Pjgrvjg7zjgrjjgpLpgIHkv6HjgZnjgotcbiAgICogQHBhcmFtIHJlY2lwaWVudCAtIOWPl+S/oeiAhVxuICAgKiBAcGFyYW0gc3ViamVjdCAtIOS7tuWQjVxuICAgKiBAcGFyYW0gYm9keSAtIOacrOaWh1xuICAgKi9cbiAgc2VuZChyZWNpcGllbnQ6IFVzZXIsIHN1YmplY3Q6IHN0cmluZywgYm9keTogc3RyaW5nKTogV2lraWRvdFJlc3VsdEFzeW5jPHZvaWQ+IHtcbiAgICByZXR1cm4gUHJpdmF0ZU1lc3NhZ2Uuc2VuZCh0aGlzLmNsaWVudCwgcmVjaXBpZW50LCBzdWJqZWN0LCBib2R5KTtcbiAgfVxufVxuXG5leHBvcnQgeyBQcml2YXRlTWVzc2FnZSwgUHJpdmF0ZU1lc3NhZ2VDb2xsZWN0aW9uLCBQcml2YXRlTWVzc2FnZUluYm94LCBQcml2YXRlTWVzc2FnZVNlbnRCb3ggfTtcbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBXaWtpZG90UmVzdWx0QXN5bmMgfSBmcm9tICcuLi8uLi8uLi9jb21tb24vdHlwZXMnO1xuaW1wb3J0IHtcbiAgRm9ydW1DYXRlZ29yeSxcbiAgRm9ydW1DYXRlZ29yeUNvbGxlY3Rpb24sXG4gIEZvcnVtUG9zdCxcbiAgRm9ydW1UaHJlYWQsXG4gIEZvcnVtVGhyZWFkQ29sbGVjdGlvbixcbn0gZnJvbSAnLi4vLi4vZm9ydW0nO1xuaW1wb3J0IHR5cGUgeyBTaXRlIH0gZnJvbSAnLi4vc2l0ZSc7XG5cbi8qKlxuICog44OV44Kp44O844Op44Og5pON5L2c44Ki44Kv44K744K1XG4gKi9cbmV4cG9ydCBjbGFzcyBGb3J1bUFjY2Vzc29yIHtcbiAgcHVibGljIHJlYWRvbmx5IHNpdGU6IFNpdGU7XG5cbiAgY29uc3RydWN0b3Ioc2l0ZTogU2l0ZSkge1xuICAgIHRoaXMuc2l0ZSA9IHNpdGU7XG4gIH1cblxuICAvKipcbiAgICog44OV44Kp44O844Op44Og44Kr44OG44K044Oq5LiA6Kan44KS5Y+W5b6XXG4gICAqIEByZXR1cm5zIOOCq+ODhuOCtOODquS4gOimp1xuICAgKi9cbiAgZ2V0Q2F0ZWdvcmllcygpOiBXaWtpZG90UmVzdWx0QXN5bmM8Rm9ydW1DYXRlZ29yeUNvbGxlY3Rpb24+IHtcbiAgICByZXR1cm4gRm9ydW1DYXRlZ29yeUNvbGxlY3Rpb24uYWNxdWlyZUFsbCh0aGlzLnNpdGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIOOCueODrOODg+ODieOCkuWPluW+l1xuICAgKiBAcGFyYW0gdGhyZWFkSWQgLSDjgrnjg6zjg4Pjg4lJRFxuICAgKiBAcmV0dXJucyDjgrnjg6zjg4Pjg4lcbiAgICovXG4gIGdldFRocmVhZCh0aHJlYWRJZDogbnVtYmVyKTogV2lraWRvdFJlc3VsdEFzeW5jPEZvcnVtVGhyZWFkPiB7XG4gICAgcmV0dXJuIEZvcnVtVGhyZWFkLmdldEZyb21JZCh0aGlzLnNpdGUsIHRocmVhZElkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDopIfmlbDjgrnjg6zjg4Pjg4njgpLlj5blvpdcbiAgICogQHBhcmFtIHRocmVhZElkcyAtIOOCueODrOODg+ODiUlE6YWN5YiXXG4gICAqIEByZXR1cm5zIOOCueODrOODg+ODieOCs+ODrOOCr+OCt+ODp+ODs1xuICAgKi9cbiAgZ2V0VGhyZWFkcyh0aHJlYWRJZHM6IG51bWJlcltdKTogV2lraWRvdFJlc3VsdEFzeW5jPEZvcnVtVGhyZWFkQ29sbGVjdGlvbj4ge1xuICAgIHJldHVybiBGb3J1bVRocmVhZENvbGxlY3Rpb24uYWNxdWlyZUZyb21UaHJlYWRJZHModGhpcy5zaXRlLCB0aHJlYWRJZHMpO1xuICB9XG59XG5cbmV4cG9ydCB7IEZvcnVtQ2F0ZWdvcnksIEZvcnVtQ2F0ZWdvcnlDb2xsZWN0aW9uLCBGb3J1bVRocmVhZCwgRm9ydW1UaHJlYWRDb2xsZWN0aW9uLCBGb3J1bVBvc3QgfTtcbiIsCiAgICAiLyoqXG4gKiBRdWlja01vZHVsZSAtIFdpa2lkb3Tou73ph49BUElcbiAqXG4gKiBxdWlja21vZHVsZS5waHDjgqjjg7Pjg4njg53jgqTjg7Pjg4jjgpLkvb/nlKjjgZfjgZ/mpJzntKLmqZ/og71cbiAqL1xuXG5pbXBvcnQgeyB6IH0gZnJvbSAnem9kJztcbmltcG9ydCB7IE5vdEZvdW5kRXhjZXB0aW9uLCBVbmV4cGVjdGVkRXJyb3IgfSBmcm9tICcuLi9jb21tb24vZXJyb3JzJztcbmltcG9ydCB7IGZyb21Qcm9taXNlLCB0eXBlIFdpa2lkb3RSZXN1bHRBc3luYyB9IGZyb20gJy4uL2NvbW1vbi90eXBlcyc7XG5cbi8qKlxuICogUXVpY2tNb2R1bGXjg6Ljgrjjg6Xjg7zjg6vlkI1cbiAqL1xuZXhwb3J0IHR5cGUgUXVpY2tNb2R1bGVOYW1lID0gJ01lbWJlckxvb2t1cFFNb2R1bGUnIHwgJ1VzZXJMb29rdXBRTW9kdWxlJyB8ICdQYWdlTG9va3VwUU1vZHVsZSc7XG5cbi8qKlxuICogUXVpY2tNb2R1bGXjg6bjg7zjgrbjg7zmg4XloLFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBRTUNVc2VyIHtcbiAgaWQ6IG51bWJlcjtcbiAgbmFtZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFF1aWNrTW9kdWxl44Oa44O844K45oOF5aCxXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUU1DUGFnZSB7XG4gIHRpdGxlOiBzdHJpbmc7XG4gIHVuaXhOYW1lOiBzdHJpbmc7XG59XG5cbi8qKlxuICogUXVpY2tNb2R1bGXjg6zjgrnjg53jg7Pjgrnjgrnjgq3jg7zjg55cbiAqL1xuY29uc3QgcXVpY2tNb2R1bGVVc2VyUmVzcG9uc2VTY2hlbWEgPSB6Lm9iamVjdCh7XG4gIHVzZXJzOiB6LnVuaW9uKFtcbiAgICB6LmFycmF5KFxuICAgICAgei5vYmplY3Qoe1xuICAgICAgICB1c2VyX2lkOiB6LnVuaW9uKFt6LnN0cmluZygpLCB6Lm51bWJlcigpXSksXG4gICAgICAgIG5hbWU6IHouc3RyaW5nKCksXG4gICAgICB9KVxuICAgICksXG4gICAgei5saXRlcmFsKGZhbHNlKSxcbiAgXSksXG59KTtcblxuY29uc3QgcXVpY2tNb2R1bGVQYWdlUmVzcG9uc2VTY2hlbWEgPSB6Lm9iamVjdCh7XG4gIHBhZ2VzOiB6LnVuaW9uKFtcbiAgICB6LmFycmF5KFxuICAgICAgei5vYmplY3Qoe1xuICAgICAgICB0aXRsZTogei5zdHJpbmcoKSxcbiAgICAgICAgdW5peF9uYW1lOiB6LnN0cmluZygpLFxuICAgICAgfSlcbiAgICApLFxuICAgIHoubGl0ZXJhbChmYWxzZSksXG4gIF0pLFxufSk7XG5cbi8qKlxuICogUXVpY2tNb2R1bGXjgqjjg7Pjg4njg53jgqTjg7Pjg4jjgavjg6rjgq/jgqjjgrnjg4jjgpLpgIHkv6FcbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVxdWVzdFF1aWNrTW9kdWxlKFxuICBtb2R1bGVOYW1lOiBRdWlja01vZHVsZU5hbWUsXG4gIHNpdGVJZDogbnVtYmVyLFxuICBxdWVyeTogc3RyaW5nXG4pOiBQcm9taXNlPHVua25vd24+IHtcbiAgY29uc3QgdXJsID0gYGh0dHBzOi8vd3d3Lndpa2lkb3QuY29tL3F1aWNrbW9kdWxlLnBocD9tb2R1bGU9JHttb2R1bGVOYW1lfSZzPSR7c2l0ZUlkfSZxPSR7ZW5jb2RlVVJJQ29tcG9uZW50KHF1ZXJ5KX1gO1xuXG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7XG4gICAgbWV0aG9kOiAnR0VUJyxcbiAgICBoZWFkZXJzOiB7XG4gICAgICBBY2NlcHQ6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICB9LFxuICB9KTtcblxuICBpZiAocmVzcG9uc2Uuc3RhdHVzID09PSA1MDApIHtcbiAgICB0aHJvdyBuZXcgTm90Rm91bmRFeGNlcHRpb24oYFNpdGUgbm90IGZvdW5kOiBzaXRlSWQ9JHtzaXRlSWR9YCk7XG4gIH1cblxuICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRFcnJvcihgUXVpY2tNb2R1bGUgcmVxdWVzdCBmYWlsZWQ6ICR7cmVzcG9uc2Uuc3RhdHVzfWApO1xuICB9XG5cbiAgcmV0dXJuIHJlc3BvbnNlLmpzb24oKTtcbn1cblxuLyoqXG4gKiDjgrXjgqTjg4jjg6Hjg7Pjg5Djg7zjgpLmpJzntKJcbiAqIEBwYXJhbSBzaXRlSWQgLSDjgrXjgqTjg4hJRFxuICogQHBhcmFtIHF1ZXJ5IC0g5qSc57Si44Kv44Ko44Oq77yI44Om44O844K244O85ZCN44Gu5LiA6YOo77yJXG4gKiBAcmV0dXJucyDjg57jg4Pjg4HjgZfjgZ/jg6bjg7zjgrbjg7zkuIDopqdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1lbWJlckxvb2t1cChzaXRlSWQ6IG51bWJlciwgcXVlcnk6IHN0cmluZyk6IFdpa2lkb3RSZXN1bHRBc3luYzxRTUNVc2VyW10+IHtcbiAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgIChhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVxdWVzdFF1aWNrTW9kdWxlKCdNZW1iZXJMb29rdXBRTW9kdWxlJywgc2l0ZUlkLCBxdWVyeSk7XG4gICAgICBjb25zdCBwYXJzZWQgPSBxdWlja01vZHVsZVVzZXJSZXNwb25zZVNjaGVtYS5wYXJzZShkYXRhKTtcblxuICAgICAgaWYgKHBhcnNlZC51c2VycyA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcGFyc2VkLnVzZXJzLm1hcCgodXNlcikgPT4gKHtcbiAgICAgICAgaWQ6IHR5cGVvZiB1c2VyLnVzZXJfaWQgPT09ICdzdHJpbmcnID8gTnVtYmVyLnBhcnNlSW50KHVzZXIudXNlcl9pZCwgMTApIDogdXNlci51c2VyX2lkLFxuICAgICAgICBuYW1lOiB1c2VyLm5hbWUsXG4gICAgICB9KSk7XG4gICAgfSkoKSxcbiAgICAoZXJyb3IpID0+IHtcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIE5vdEZvdW5kRXhjZXB0aW9uKSByZXR1cm4gZXJyb3I7XG4gICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgTWVtYmVyIGxvb2t1cCBmYWlsZWQ6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICB9XG4gICk7XG59XG5cbi8qKlxuICogV2lraWRvdOWFqOS9k+OBi+OCieODpuODvOOCtuODvOOCkuaknOe0olxuICogQHBhcmFtIHNpdGVJZCAtIOOCteOCpOODiElE77yI5Lu75oSP44Gu44K144Kk44OISUTjgaflj6/vvIlcbiAqIEBwYXJhbSBxdWVyeSAtIOaknOe0ouOCr+OCqOODqu+8iOODpuODvOOCtuODvOWQjeOBruS4gOmDqO+8iVxuICogQHJldHVybnMg44Oe44OD44OB44GX44Gf44Om44O844K244O85LiA6KanXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VyTG9va3VwKHNpdGVJZDogbnVtYmVyLCBxdWVyeTogc3RyaW5nKTogV2lraWRvdFJlc3VsdEFzeW5jPFFNQ1VzZXJbXT4ge1xuICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgKGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXF1ZXN0UXVpY2tNb2R1bGUoJ1VzZXJMb29rdXBRTW9kdWxlJywgc2l0ZUlkLCBxdWVyeSk7XG4gICAgICBjb25zdCBwYXJzZWQgPSBxdWlja01vZHVsZVVzZXJSZXNwb25zZVNjaGVtYS5wYXJzZShkYXRhKTtcblxuICAgICAgaWYgKHBhcnNlZC51c2VycyA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcGFyc2VkLnVzZXJzLm1hcCgodXNlcikgPT4gKHtcbiAgICAgICAgaWQ6IHR5cGVvZiB1c2VyLnVzZXJfaWQgPT09ICdzdHJpbmcnID8gTnVtYmVyLnBhcnNlSW50KHVzZXIudXNlcl9pZCwgMTApIDogdXNlci51c2VyX2lkLFxuICAgICAgICBuYW1lOiB1c2VyLm5hbWUsXG4gICAgICB9KSk7XG4gICAgfSkoKSxcbiAgICAoZXJyb3IpID0+IHtcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIE5vdEZvdW5kRXhjZXB0aW9uKSByZXR1cm4gZXJyb3I7XG4gICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgVXNlciBsb29rdXAgZmFpbGVkOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgfVxuICApO1xufVxuXG4vKipcbiAqIOOCteOCpOODiOWGheOBruODmuODvOOCuOOCkuaknOe0olxuICogQHBhcmFtIHNpdGVJZCAtIOOCteOCpOODiElEXG4gKiBAcGFyYW0gcXVlcnkgLSDmpJzntKLjgq/jgqjjg6rvvIjjg5rjg7zjgrjlkI3jga7kuIDpg6jvvIlcbiAqIEByZXR1cm5zIOODnuODg+ODgeOBl+OBn+ODmuODvOOCuOS4gOimp1xuICovXG5leHBvcnQgZnVuY3Rpb24gcGFnZUxvb2t1cChzaXRlSWQ6IG51bWJlciwgcXVlcnk6IHN0cmluZyk6IFdpa2lkb3RSZXN1bHRBc3luYzxRTUNQYWdlW10+IHtcbiAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgIChhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVxdWVzdFF1aWNrTW9kdWxlKCdQYWdlTG9va3VwUU1vZHVsZScsIHNpdGVJZCwgcXVlcnkpO1xuICAgICAgY29uc3QgcGFyc2VkID0gcXVpY2tNb2R1bGVQYWdlUmVzcG9uc2VTY2hlbWEucGFyc2UoZGF0YSk7XG5cbiAgICAgIGlmIChwYXJzZWQucGFnZXMgPT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHBhcnNlZC5wYWdlcy5tYXAoKHBhZ2UpID0+ICh7XG4gICAgICAgIHRpdGxlOiBwYWdlLnRpdGxlLFxuICAgICAgICB1bml4TmFtZTogcGFnZS51bml4X25hbWUsXG4gICAgICB9KSk7XG4gICAgfSkoKSxcbiAgICAoZXJyb3IpID0+IHtcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIE5vdEZvdW5kRXhjZXB0aW9uKSByZXR1cm4gZXJyb3I7XG4gICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgUGFnZSBsb29rdXAgZmFpbGVkOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgfVxuICApO1xufVxuXG4vKipcbiAqIFF1aWNrTW9kdWxlIEFQSe+8iOW+jOaWueS6kuaPm+aAp+OBruOBn+OCgee2reaMge+8iVxuICogQGRlcHJlY2F0ZWQg5Luj44KP44KK44Gr5YCL5Yil44Gu6Zai5pWw77yIbWVtYmVyTG9va3VwLCB1c2VyTG9va3VwLCBwYWdlTG9va3Vw77yJ44KS5L2/55So44GX44Gm44GP44Gg44GV44GEXG4gKi9cbmV4cG9ydCBjb25zdCBRdWlja01vZHVsZToge1xuICBtZW1iZXJMb29rdXA6IHR5cGVvZiBtZW1iZXJMb29rdXA7XG4gIHVzZXJMb29rdXA6IHR5cGVvZiB1c2VyTG9va3VwO1xuICBwYWdlTG9va3VwOiB0eXBlb2YgcGFnZUxvb2t1cDtcbn0gPSB7XG4gIG1lbWJlckxvb2t1cDogbWVtYmVyTG9va3VwLFxuICB1c2VyTG9va3VwOiB1c2VyTG9va3VwLFxuICBwYWdlTG9va3VwOiBwYWdlTG9va3VwLFxufTtcbiIsCiAgICAiaW1wb3J0ICogYXMgY2hlZXJpbyBmcm9tICdjaGVlcmlvJztcbmltcG9ydCB7IFJlcXVpcmVMb2dpbiB9IGZyb20gJy4uLy4uL2NvbW1vbi9kZWNvcmF0b3JzJztcbmltcG9ydCB7XG4gIEZvcmJpZGRlbkVycm9yLFxuICBMb2dpblJlcXVpcmVkRXJyb3IsXG4gIE5vdEZvdW5kRXhjZXB0aW9uLFxuICBVbmV4cGVjdGVkRXJyb3IsXG4gIFdpa2lkb3RTdGF0dXNFcnJvcixcbn0gZnJvbSAnLi4vLi4vY29tbW9uL2Vycm9ycyc7XG5pbXBvcnQgeyBmcm9tUHJvbWlzZSwgdHlwZSBXaWtpZG90UmVzdWx0QXN5bmMgfSBmcm9tICcuLi8uLi9jb21tb24vdHlwZXMnO1xuaW1wb3J0IHsgcGFyc2VVc2VyIH0gZnJvbSAnLi4vLi4vdXRpbC9wYXJzZXInO1xuaW1wb3J0IHR5cGUgeyBBYnN0cmFjdFVzZXIgfSBmcm9tICcuLi91c2VyJztcbmltcG9ydCB0eXBlIHsgU2l0ZSB9IGZyb20gJy4vc2l0ZSc7XG5cbi8qKlxuICog44K144Kk44OI5Y+C5Yqg55Sz6KuL44OH44O844K/XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2l0ZUFwcGxpY2F0aW9uRGF0YSB7XG4gIHNpdGU6IFNpdGU7XG4gIHVzZXI6IEFic3RyYWN0VXNlcjtcbiAgdGV4dDogc3RyaW5nO1xufVxuXG4vKipcbiAqIOOCteOCpOODiOWPguWKoOeUs+iri1xuICovXG5leHBvcnQgY2xhc3MgU2l0ZUFwcGxpY2F0aW9uIHtcbiAgcHVibGljIHJlYWRvbmx5IHNpdGU6IFNpdGU7XG4gIHB1YmxpYyByZWFkb25seSB1c2VyOiBBYnN0cmFjdFVzZXI7XG4gIHB1YmxpYyByZWFkb25seSB0ZXh0OiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoZGF0YTogU2l0ZUFwcGxpY2F0aW9uRGF0YSkge1xuICAgIHRoaXMuc2l0ZSA9IGRhdGEuc2l0ZTtcbiAgICB0aGlzLnVzZXIgPSBkYXRhLnVzZXI7XG4gICAgdGhpcy50ZXh0ID0gZGF0YS50ZXh0O1xuICB9XG5cbiAgLyoqXG4gICAqIOacquWHpueQhuOBruWPguWKoOeUs+iri+OCkuOBmeOBueOBpuWPluW+l+OBmeOCi1xuICAgKiBAcGFyYW0gc2l0ZSAtIOWvvuixoeOCteOCpOODiFxuICAgKi9cbiAgc3RhdGljIGFjcXVpcmVBbGwoc2l0ZTogU2l0ZSk6IFdpa2lkb3RSZXN1bHRBc3luYzxTaXRlQXBwbGljYXRpb25bXT4ge1xuICAgIGNvbnN0IGxvZ2luUmVzdWx0ID0gc2l0ZS5jbGllbnQucmVxdWlyZUxvZ2luKCk7XG4gICAgaWYgKGxvZ2luUmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgICAgUHJvbWlzZS5yZWplY3QobG9naW5SZXN1bHQuZXJyb3IpLFxuICAgICAgICAoKSA9PiBuZXcgTG9naW5SZXF1aXJlZEVycm9yKCdMb2dpbiByZXF1aXJlZCB0byBnZXQgYXBwbGljYXRpb25zJylcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc2l0ZS5hbWNSZXF1ZXN0KFtcbiAgICAgICAgICB7IG1vZHVsZU5hbWU6ICdtYW5hZ2VzaXRlL01hbmFnZVNpdGVNZW1iZXJzQXBwbGljYXRpb25zTW9kdWxlJyB9LFxuICAgICAgICBdKTtcblxuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXNwb25zZSA9IHJlc3VsdC52YWx1ZVswXTtcbiAgICAgICAgaWYgKCFyZXNwb25zZSkge1xuICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkRXJyb3IoJ0VtcHR5IHJlc3BvbnNlJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBodG1sID0gU3RyaW5nKHJlc3BvbnNlLmJvZHkgPz8gJycpO1xuXG4gICAgICAgIC8vIOaoqemZkOODgeOCp+ODg+OCr1xuICAgICAgICBpZiAoaHRtbC5pbmNsdWRlcygnV0lLSURPVC5wYWdlLmxpc3RlbmVycy5sb2dpbkNsaWNrKGV2ZW50KScpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEZvcmJpZGRlbkVycm9yKCdZb3UgYXJlIG5vdCBhbGxvd2VkIHRvIGFjY2VzcyB0aGlzIHBhZ2UnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0ICQgPSBjaGVlcmlvLmxvYWQoaHRtbCk7XG4gICAgICAgIGNvbnN0IGFwcGxpY2F0aW9uczogU2l0ZUFwcGxpY2F0aW9uW10gPSBbXTtcblxuICAgICAgICBjb25zdCB1c2VyRWxlbWVudHMgPSAkKCdoMyBzcGFuLnByaW50dXNlcicpLnRvQXJyYXkoKTtcbiAgICAgICAgY29uc3QgdGV4dFdyYXBwZXJFbGVtZW50cyA9ICQoJ3RhYmxlJykudG9BcnJheSgpO1xuXG4gICAgICAgIGlmICh1c2VyRWxlbWVudHMubGVuZ3RoICE9PSB0ZXh0V3JhcHBlckVsZW1lbnRzLmxlbmd0aCkge1xuICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkRXJyb3IoXG4gICAgICAgICAgICAnTGVuZ3RoIG9mIHVzZXJfZWxlbWVudHMgYW5kIHRleHRfd3JhcHBlcl9lbGVtZW50cyBhcmUgZGlmZmVyZW50J1xuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHVzZXJFbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IHVzZXJFbGVtZW50ID0gdXNlckVsZW1lbnRzW2ldO1xuICAgICAgICAgIGNvbnN0IHRleHRXcmFwcGVyRWxlbWVudCA9IHRleHRXcmFwcGVyRWxlbWVudHNbaV07XG5cbiAgICAgICAgICBpZiAoIXVzZXJFbGVtZW50IHx8ICF0ZXh0V3JhcHBlckVsZW1lbnQpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgY29uc3QgdXNlciA9IHBhcnNlVXNlcihzaXRlLmNsaWVudCwgJCh1c2VyRWxlbWVudCkpO1xuICAgICAgICAgIGNvbnN0IHRleHRFbGVtZW50ID0gJCh0ZXh0V3JhcHBlckVsZW1lbnQpLmZpbmQoJ3RkJykuZXEoMSk7XG4gICAgICAgICAgY29uc3QgdGV4dCA9IHRleHRFbGVtZW50LnRleHQoKS50cmltKCk7XG5cbiAgICAgICAgICBhcHBsaWNhdGlvbnMucHVzaChuZXcgU2l0ZUFwcGxpY2F0aW9uKHsgc2l0ZSwgdXNlciwgdGV4dCB9KSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXBwbGljYXRpb25zO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBGb3JiaWRkZW5FcnJvciB8fCBlcnJvciBpbnN0YW5jZW9mIExvZ2luUmVxdWlyZWRFcnJvcikge1xuICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGdldCBhcHBsaWNhdGlvbnM6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIOeUs+iri+OCkuWHpueQhuOBmeOCi+WGhemDqOODoeOCveODg+ODiVxuICAgKi9cbiAgQFJlcXVpcmVMb2dpblxuICBwcml2YXRlIHByb2Nlc3MoYWN0aW9uOiAnYWNjZXB0JyB8ICdkZWNsaW5lJyk6IFdpa2lkb3RSZXN1bHRBc3luYzx2b2lkPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zaXRlLmFtY1JlcXVlc3QoW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFjdGlvbjogJ01hbmFnZVNpdGVNZW1iZXJzaGlwQWN0aW9uJyxcbiAgICAgICAgICAgIGV2ZW50OiAnYWNjZXB0QXBwbGljYXRpb24nLFxuICAgICAgICAgICAgdXNlcl9pZDogdGhpcy51c2VyLmlkLFxuICAgICAgICAgICAgdGV4dDogYHlvdXIgYXBwbGljYXRpb24gaGFzIGJlZW4gJHthY3Rpb259ZWRgLFxuICAgICAgICAgICAgdHlwZTogYWN0aW9uLFxuICAgICAgICAgICAgbW9kdWxlTmFtZTogJ0VtcHR5JyxcbiAgICAgICAgICB9LFxuICAgICAgICBdKTtcbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgY29uc3QgZXJyb3IgPSByZXN1bHQuZXJyb3I7XG4gICAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgV2lraWRvdFN0YXR1c0Vycm9yICYmIGVycm9yLnN0YXR1c0NvZGUgPT09ICdub19hcHBsaWNhdGlvbicpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBOb3RGb3VuZEV4Y2VwdGlvbihgQXBwbGljYXRpb24gbm90IGZvdW5kOiAke3RoaXMudXNlci5uYW1lfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBOb3RGb3VuZEV4Y2VwdGlvbiB8fCBlcnJvciBpbnN0YW5jZW9mIExvZ2luUmVxdWlyZWRFcnJvcikge1xuICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIHByb2Nlc3MgYXBwbGljYXRpb246ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIOWPguWKoOeUs+iri+OCkuaJv+iqjeOBmeOCi1xuICAgKi9cbiAgYWNjZXB0KCk6IFdpa2lkb3RSZXN1bHRBc3luYzx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMucHJvY2VzcygnYWNjZXB0Jyk7XG4gIH1cblxuICAvKipcbiAgICog5Y+C5Yqg55Sz6KuL44KS5ouS5ZCm44GZ44KLXG4gICAqL1xuICBkZWNsaW5lKCk6IFdpa2lkb3RSZXN1bHRBc3luYzx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMucHJvY2VzcygnZGVjbGluZScpO1xuICB9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFNpdGVBcHBsaWNhdGlvbih1c2VyPSR7dGhpcy51c2VyLm5hbWV9LCBzaXRlPSR7dGhpcy5zaXRlLnVuaXhOYW1lfSwgdGV4dD0ke3RoaXMudGV4dH0pYDtcbiAgfVxufVxuIiwKICAgICJpbXBvcnQgKiBhcyBjaGVlcmlvIGZyb20gJ2NoZWVyaW8nO1xuaW1wb3J0IHsgUmVxdWlyZUxvZ2luIH0gZnJvbSAnLi4vLi4vY29tbW9uL2RlY29yYXRvcnMnO1xuaW1wb3J0IHtcbiAgTG9naW5SZXF1aXJlZEVycm9yLFxuICBUYXJnZXRFcnJvcixcbiAgVW5leHBlY3RlZEVycm9yLFxuICBXaWtpZG90U3RhdHVzRXJyb3IsXG59IGZyb20gJy4uLy4uL2NvbW1vbi9lcnJvcnMnO1xuaW1wb3J0IHsgZnJvbVByb21pc2UsIHR5cGUgV2lraWRvdFJlc3VsdEFzeW5jIH0gZnJvbSAnLi4vLi4vY29tbW9uL3R5cGVzJztcbmltcG9ydCB7IHBhcnNlT2RhdGUsIHBhcnNlVXNlciB9IGZyb20gJy4uLy4uL3V0aWwvcGFyc2VyJztcbmltcG9ydCB0eXBlIHsgQWJzdHJhY3RVc2VyIH0gZnJvbSAnLi4vdXNlcic7XG5pbXBvcnQgdHlwZSB7IFNpdGUgfSBmcm9tICcuL3NpdGUnO1xuXG4vKipcbiAqIOOCteOCpOODiOODoeODs+ODkOODvOODh+ODvOOCv1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFNpdGVNZW1iZXJEYXRhIHtcbiAgc2l0ZTogU2l0ZTtcbiAgdXNlcjogQWJzdHJhY3RVc2VyO1xuICBqb2luZWRBdDogRGF0ZSB8IG51bGw7XG59XG5cbi8qKlxuICog44K144Kk44OI44Oh44Oz44OQ44O8XG4gKi9cbmV4cG9ydCBjbGFzcyBTaXRlTWVtYmVyIHtcbiAgcHVibGljIHJlYWRvbmx5IHNpdGU6IFNpdGU7XG4gIHB1YmxpYyByZWFkb25seSB1c2VyOiBBYnN0cmFjdFVzZXI7XG4gIHB1YmxpYyByZWFkb25seSBqb2luZWRBdDogRGF0ZSB8IG51bGw7XG5cbiAgY29uc3RydWN0b3IoZGF0YTogU2l0ZU1lbWJlckRhdGEpIHtcbiAgICB0aGlzLnNpdGUgPSBkYXRhLnNpdGU7XG4gICAgdGhpcy51c2VyID0gZGF0YS51c2VyO1xuICAgIHRoaXMuam9pbmVkQXQgPSBkYXRhLmpvaW5lZEF0O1xuICB9XG5cbiAgLyoqXG4gICAqIEhUTUzjgYvjgonjg6Hjg7Pjg5Djg7zmg4XloLHjgpLjg5Hjg7zjgrnjgZnjgotcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIHBhcnNlKHNpdGU6IFNpdGUsIGh0bWw6IHN0cmluZyk6IFNpdGVNZW1iZXJbXSB7XG4gICAgY29uc3QgJCA9IGNoZWVyaW8ubG9hZChodG1sKTtcbiAgICBjb25zdCBtZW1iZXJzOiBTaXRlTWVtYmVyW10gPSBbXTtcblxuICAgICQoJ3RhYmxlIHRyJykuZWFjaCgoX2ksIHJvdykgPT4ge1xuICAgICAgY29uc3QgdGRzID0gJChyb3cpLmZpbmQoJ3RkJyk7XG4gICAgICBjb25zdCB1c2VyRWxlbSA9ICQodGRzWzBdKS5maW5kKCcucHJpbnR1c2VyJyk7XG5cbiAgICAgIGlmICh1c2VyRWxlbS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB1c2VyID0gcGFyc2VVc2VyKHNpdGUuY2xpZW50LCB1c2VyRWxlbSk7XG5cbiAgICAgIC8vIDLjgaTnm67jga50ZOOBjOOBguOCjOOBsOWKoOWFpeaXpeaZglxuICAgICAgbGV0IGpvaW5lZEF0OiBEYXRlIHwgbnVsbCA9IG51bGw7XG4gICAgICBpZiAodGRzLmxlbmd0aCA+PSAyKSB7XG4gICAgICAgIGNvbnN0IG9kYXRlRWxlbSA9ICQodGRzWzFdKS5maW5kKCcub2RhdGUnKTtcbiAgICAgICAgaWYgKG9kYXRlRWxlbS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgam9pbmVkQXQgPSBwYXJzZU9kYXRlKG9kYXRlRWxlbSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgbWVtYmVycy5wdXNoKG5ldyBTaXRlTWVtYmVyKHsgc2l0ZSwgdXNlciwgam9pbmVkQXQgfSkpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIG1lbWJlcnM7XG4gIH1cblxuICAvKipcbiAgICog44K144Kk44OI44Oh44Oz44OQ44O85LiA6Kan44KS5Y+W5b6X44GZ44KLXG4gICAqIEBwYXJhbSBzaXRlIC0g5a++6LGh44K144Kk44OIXG4gICAqIEBwYXJhbSBncm91cCAtIOOCsOODq+ODvOODl++8iFwiYWRtaW5zXCIsIFwibW9kZXJhdG9yc1wiLCDjgb7jgZ/jga/nqbrmloflrZfjgaflhajjg6Hjg7Pjg5Djg7zvvIlcbiAgICovXG4gIHN0YXRpYyBnZXRNZW1iZXJzKFxuICAgIHNpdGU6IFNpdGUsXG4gICAgZ3JvdXA6ICdhZG1pbnMnIHwgJ21vZGVyYXRvcnMnIHwgJycgPSAnJ1xuICApOiBXaWtpZG90UmVzdWx0QXN5bmM8U2l0ZU1lbWJlcltdPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgbWVtYmVyczogU2l0ZU1lbWJlcltdID0gW107XG5cbiAgICAgICAgLy8g5pyA5Yid44Gu44Oa44O844K444KS5Y+W5b6XXG4gICAgICAgIGNvbnN0IGZpcnN0UmVzdWx0ID0gYXdhaXQgc2l0ZS5hbWNSZXF1ZXN0KFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBtb2R1bGVOYW1lOiAnbWVtYmVyc2hpcC9NZW1iZXJzTGlzdE1vZHVsZScsXG4gICAgICAgICAgICBwYWdlOiAxLFxuICAgICAgICAgICAgZ3JvdXAsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSk7XG5cbiAgICAgICAgaWYgKGZpcnN0UmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyBmaXJzdFJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZpcnN0UmVzcG9uc2UgPSBmaXJzdFJlc3VsdC52YWx1ZVswXTtcbiAgICAgICAgaWYgKCFmaXJzdFJlc3BvbnNlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRFcnJvcignRW1wdHkgcmVzcG9uc2UnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZpcnN0SHRtbCA9IFN0cmluZyhmaXJzdFJlc3BvbnNlLmJvZHkgPz8gJycpO1xuICAgICAgICBtZW1iZXJzLnB1c2goLi4uU2l0ZU1lbWJlci5wYXJzZShzaXRlLCBmaXJzdEh0bWwpKTtcblxuICAgICAgICAvLyDjg5rjg7zjgrjjg6Pjg7zjgpLnorroqo1cbiAgICAgICAgY29uc3QgJGZpcnN0ID0gY2hlZXJpby5sb2FkKGZpcnN0SHRtbCk7XG4gICAgICAgIGNvbnN0IHBhZ2VyTGlua3MgPSAkZmlyc3QoJ2Rpdi5wYWdlciBhJyk7XG4gICAgICAgIGlmIChwYWdlckxpbmtzLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgICByZXR1cm4gbWVtYmVycztcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGxhc3RQYWdlVGV4dCA9ICRmaXJzdChwYWdlckxpbmtzW3BhZ2VyTGlua3MubGVuZ3RoIC0gMl0pXG4gICAgICAgICAgLnRleHQoKVxuICAgICAgICAgIC50cmltKCk7XG4gICAgICAgIGNvbnN0IGxhc3RQYWdlID0gTnVtYmVyLnBhcnNlSW50KGxhc3RQYWdlVGV4dCwgMTApIHx8IDE7XG4gICAgICAgIGlmIChsYXN0UGFnZSA8PSAxKSB7XG4gICAgICAgICAgcmV0dXJuIG1lbWJlcnM7XG4gICAgICAgIH1cblxuICAgICAgICAvLyDmrovjgorjga7jg5rjg7zjgrjjgpLlj5blvpdcbiAgICAgICAgY29uc3QgYm9kaWVzID0gW107XG4gICAgICAgIGZvciAobGV0IHBhZ2UgPSAyOyBwYWdlIDw9IGxhc3RQYWdlOyBwYWdlKyspIHtcbiAgICAgICAgICBib2RpZXMucHVzaCh7XG4gICAgICAgICAgICBtb2R1bGVOYW1lOiAnbWVtYmVyc2hpcC9NZW1iZXJzTGlzdE1vZHVsZScsXG4gICAgICAgICAgICBwYWdlLFxuICAgICAgICAgICAgZ3JvdXAsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBhZGRpdGlvbmFsUmVzdWx0cyA9IGF3YWl0IHNpdGUuYW1jUmVxdWVzdChib2RpZXMpO1xuICAgICAgICBpZiAoYWRkaXRpb25hbFJlc3VsdHMuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IGFkZGl0aW9uYWxSZXN1bHRzLmVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCByZXNwb25zZSBvZiBhZGRpdGlvbmFsUmVzdWx0cy52YWx1ZSkge1xuICAgICAgICAgIGNvbnN0IGh0bWwgPSBTdHJpbmcocmVzcG9uc2U/LmJvZHkgPz8gJycpO1xuICAgICAgICAgIG1lbWJlcnMucHVzaCguLi5TaXRlTWVtYmVyLnBhcnNlKHNpdGUsIGh0bWwpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBtZW1iZXJzO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGdldCBtZW1iZXJzOiAke1N0cmluZyhlcnJvcil9YClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIOOCsOODq+ODvOODl+WkieabtOOBruWGhemDqOODoeOCveODg+ODiVxuICAgKi9cbiAgQFJlcXVpcmVMb2dpblxuICBwcml2YXRlIGNoYW5nZUdyb3VwKFxuICAgIGV2ZW50OiAndG9Nb2RlcmF0b3JzJyB8ICdyZW1vdmVNb2RlcmF0b3InIHwgJ3RvQWRtaW5zJyB8ICdyZW1vdmVBZG1pbidcbiAgKTogV2lraWRvdFJlc3VsdEFzeW5jPHZvaWQ+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnNpdGUuYW1jUmVxdWVzdChbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWN0aW9uOiAnTWFuYWdlU2l0ZU1lbWJlcnNoaXBBY3Rpb24nLFxuICAgICAgICAgICAgZXZlbnQsXG4gICAgICAgICAgICB1c2VyX2lkOiB0aGlzLnVzZXIuaWQsXG4gICAgICAgICAgICBtb2R1bGVOYW1lOiAnJyxcbiAgICAgICAgICB9LFxuICAgICAgICBdKTtcbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgY29uc3QgZXJyb3IgPSByZXN1bHQuZXJyb3I7XG4gICAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgV2lraWRvdFN0YXR1c0Vycm9yKSB7XG4gICAgICAgICAgICBpZiAoZXJyb3Iuc3RhdHVzQ29kZSA9PT0gJ25vdF9hbHJlYWR5Jykge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgVGFyZ2V0RXJyb3IoYFVzZXIgaXMgbm90IG1vZGVyYXRvci9hZG1pbjogJHt0aGlzLnVzZXIubmFtZX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChlcnJvci5zdGF0dXNDb2RlID09PSAnYWxyZWFkeV9hZG1pbicgfHwgZXJyb3Iuc3RhdHVzQ29kZSA9PT0gJ2FscmVhZHlfbW9kZXJhdG9yJykge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgVGFyZ2V0RXJyb3IoXG4gICAgICAgICAgICAgICAgYFVzZXIgaXMgYWxyZWFkeSAke2Vycm9yLnN0YXR1c0NvZGUucmVwbGFjZSgnYWxyZWFkeV8nLCAnJyl9OiAke3RoaXMudXNlci5uYW1lfWBcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgVGFyZ2V0RXJyb3IgfHwgZXJyb3IgaW5zdGFuY2VvZiBMb2dpblJlcXVpcmVkRXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBjaGFuZ2UgbWVtYmVyIGdyb3VwOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDjg6Ljg4fjg6zjg7zjgr/jg7zjgavmmIfmoLxcbiAgICovXG4gIHRvTW9kZXJhdG9yKCk6IFdpa2lkb3RSZXN1bHRBc3luYzx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuY2hhbmdlR3JvdXAoJ3RvTW9kZXJhdG9ycycpO1xuICB9XG5cbiAgLyoqXG4gICAqIOODouODh+ODrOODvOOCv+ODvOaoqemZkOOCkuWJiumZpFxuICAgKi9cbiAgcmVtb3ZlTW9kZXJhdG9yKCk6IFdpa2lkb3RSZXN1bHRBc3luYzx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuY2hhbmdlR3JvdXAoJ3JlbW92ZU1vZGVyYXRvcicpO1xuICB9XG5cbiAgLyoqXG4gICAqIOeuoeeQhuiAheOBq+aYh+agvFxuICAgKi9cbiAgdG9BZG1pbigpOiBXaWtpZG90UmVzdWx0QXN5bmM8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLmNoYW5nZUdyb3VwKCd0b0FkbWlucycpO1xuICB9XG5cbiAgLyoqXG4gICAqIOeuoeeQhuiAheaoqemZkOOCkuWJiumZpFxuICAgKi9cbiAgcmVtb3ZlQWRtaW4oKTogV2lraWRvdFJlc3VsdEFzeW5jPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5jaGFuZ2VHcm91cCgncmVtb3ZlQWRtaW4nKTtcbiAgfVxuXG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBTaXRlTWVtYmVyKHVzZXI9JHt0aGlzLnVzZXIubmFtZX0sIHNpdGU9JHt0aGlzLnNpdGUudW5peE5hbWV9KWA7XG4gIH1cbn1cbiIsCiAgICAiaW1wb3J0IHsgUmVxdWlyZUxvZ2luIH0gZnJvbSAnLi4vLi4vLi4vY29tbW9uL2RlY29yYXRvcnMnO1xuaW1wb3J0IHtcbiAgTG9naW5SZXF1aXJlZEVycm9yLFxuICBUYXJnZXRFcnJvcixcbiAgVW5leHBlY3RlZEVycm9yLFxuICBXaWtpZG90U3RhdHVzRXJyb3IsXG59IGZyb20gJy4uLy4uLy4uL2NvbW1vbi9lcnJvcnMnO1xuaW1wb3J0IHsgZnJvbVByb21pc2UsIHR5cGUgV2lraWRvdFJlc3VsdEFzeW5jIH0gZnJvbSAnLi4vLi4vLi4vY29tbW9uL3R5cGVzJztcbmltcG9ydCB7IHR5cGUgUU1DVXNlciwgUXVpY2tNb2R1bGUgfSBmcm9tICcuLi8uLi8uLi91dGlsL3F1aWNrLW1vZHVsZSc7XG5pbXBvcnQgdHlwZSB7IFVzZXIgfSBmcm9tICcuLi8uLi91c2VyL3VzZXInO1xuaW1wb3J0IHR5cGUgeyBTaXRlIH0gZnJvbSAnLi4vc2l0ZSc7XG5pbXBvcnQgeyBTaXRlQXBwbGljYXRpb24gfSBmcm9tICcuLi9zaXRlLWFwcGxpY2F0aW9uJztcbmltcG9ydCB7IFNpdGVNZW1iZXIgfSBmcm9tICcuLi9zaXRlLW1lbWJlcic7XG5cbi8qKlxuICog44K144Kk44OI44Oh44Oz44OQ44O85pON5L2c44Ki44Kv44K744K1XG4gKi9cbmV4cG9ydCBjbGFzcyBNZW1iZXJBY2Nlc3NvciB7XG4gIHB1YmxpYyByZWFkb25seSBzaXRlOiBTaXRlO1xuXG4gIGNvbnN0cnVjdG9yKHNpdGU6IFNpdGUpIHtcbiAgICB0aGlzLnNpdGUgPSBzaXRlO1xuICB9XG5cbiAgLyoqXG4gICAqIOWFqOODoeODs+ODkOODvOOCkuWPluW+l+OBmeOCi1xuICAgKiBAcmV0dXJucyDjg6Hjg7Pjg5Djg7zkuIDopqdcbiAgICovXG4gIGdldEFsbCgpOiBXaWtpZG90UmVzdWx0QXN5bmM8U2l0ZU1lbWJlcltdPiB7XG4gICAgcmV0dXJuIFNpdGVNZW1iZXIuZ2V0TWVtYmVycyh0aGlzLnNpdGUsICcnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDjg6Ljg4fjg6zjg7zjgr/jg7zkuIDopqfjgpLlj5blvpfjgZnjgotcbiAgICogQHJldHVybnMg44Oi44OH44Os44O844K/44O85LiA6KanXG4gICAqL1xuICBnZXRNb2RlcmF0b3JzKCk6IFdpa2lkb3RSZXN1bHRBc3luYzxTaXRlTWVtYmVyW10+IHtcbiAgICByZXR1cm4gU2l0ZU1lbWJlci5nZXRNZW1iZXJzKHRoaXMuc2l0ZSwgJ21vZGVyYXRvcnMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDnrqHnkIbogIXkuIDopqfjgpLlj5blvpfjgZnjgotcbiAgICogQHJldHVybnMg566h55CG6ICF5LiA6KanXG4gICAqL1xuICBnZXRBZG1pbnMoKTogV2lraWRvdFJlc3VsdEFzeW5jPFNpdGVNZW1iZXJbXT4ge1xuICAgIHJldHVybiBTaXRlTWVtYmVyLmdldE1lbWJlcnModGhpcy5zaXRlLCAnYWRtaW5zJyk7XG4gIH1cblxuICAvKipcbiAgICog5pyq5Yem55CG44Gu5Y+C5Yqg55Sz6KuL44KS5Y+W5b6X44GZ44KLXG4gICAqIEByZXR1cm5zIOWPguWKoOeUs+iri+S4gOimp1xuICAgKi9cbiAgZ2V0QXBwbGljYXRpb25zKCk6IFdpa2lkb3RSZXN1bHRBc3luYzxTaXRlQXBwbGljYXRpb25bXT4ge1xuICAgIHJldHVybiBTaXRlQXBwbGljYXRpb24uYWNxdWlyZUFsbCh0aGlzLnNpdGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIOODoeODs+ODkOODvOOCkuaknOe0ouOBmeOCi1xuICAgKiBAcGFyYW0gcXVlcnkgLSDmpJzntKLjgq/jgqjjg6rvvIjjg6bjg7zjgrbjg7zlkI3jga7kuIDpg6jvvIlcbiAgICogQHJldHVybnMg44Oe44OD44OB44GX44Gf44Om44O844K244O85LiA6Kan77yIUU1DVXNlcuW9ouW8j++8iVxuICAgKi9cbiAgbG9va3VwKHF1ZXJ5OiBzdHJpbmcpOiBXaWtpZG90UmVzdWx0QXN5bmM8UU1DVXNlcltdPiB7XG4gICAgcmV0dXJuIFF1aWNrTW9kdWxlLm1lbWJlckxvb2t1cCh0aGlzLnNpdGUuaWQsIHF1ZXJ5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDjg6bjg7zjgrbjg7zjgpLjgrXjgqTjg4jjgavmi5vlvoXjgZnjgotcbiAgICogQHBhcmFtIHVzZXIgLSDmi5vlvoXjgZnjgovjg6bjg7zjgrbjg7xcbiAgICogQHBhcmFtIHRleHQgLSDmi5vlvoXjg6Hjg4Pjgrvjg7zjgrhcbiAgICovXG4gIEBSZXF1aXJlTG9naW5cbiAgaW52aXRlKHVzZXI6IFVzZXIsIHRleHQ6IHN0cmluZyk6IFdpa2lkb3RSZXN1bHRBc3luYzx2b2lkPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zaXRlLmFtY1JlcXVlc3QoW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFjdGlvbjogJ01hbmFnZVNpdGVNZW1iZXJzaGlwQWN0aW9uJyxcbiAgICAgICAgICAgIGV2ZW50OiAnaW52aXRlTWVtYmVyJyxcbiAgICAgICAgICAgIHVzZXJfaWQ6IHVzZXIuaWQsXG4gICAgICAgICAgICB0ZXh0LFxuICAgICAgICAgICAgbW9kdWxlTmFtZTogJ0VtcHR5JyxcbiAgICAgICAgICB9LFxuICAgICAgICBdKTtcbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgY29uc3QgZXJyb3IgPSByZXN1bHQuZXJyb3I7XG4gICAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgV2lraWRvdFN0YXR1c0Vycm9yKSB7XG4gICAgICAgICAgICBpZiAoZXJyb3Iuc3RhdHVzQ29kZSA9PT0gJ2FscmVhZHlfaW52aXRlZCcpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IFRhcmdldEVycm9yKFxuICAgICAgICAgICAgICAgIGBVc2VyIGlzIGFscmVhZHkgaW52aXRlZCB0byAke3RoaXMuc2l0ZS51bml4TmFtZX06ICR7dXNlci5uYW1lfWBcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChlcnJvci5zdGF0dXNDb2RlID09PSAnYWxyZWFkeV9tZW1iZXInKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBUYXJnZXRFcnJvcihcbiAgICAgICAgICAgICAgICBgVXNlciBpcyBhbHJlYWR5IGEgbWVtYmVyIG9mICR7dGhpcy5zaXRlLnVuaXhOYW1lfTogJHt1c2VyLm5hbWV9YFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBUYXJnZXRFcnJvciB8fCBlcnJvciBpbnN0YW5jZW9mIExvZ2luUmVxdWlyZWRFcnJvcikge1xuICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGludml0ZSB1c2VyOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgeyBTaXRlTWVtYmVyLCBTaXRlQXBwbGljYXRpb24gfTtcbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBDaGVlcmlvIH0gZnJvbSAnY2hlZXJpbyc7XG5pbXBvcnQgKiBhcyBjaGVlcmlvIGZyb20gJ2NoZWVyaW8nO1xuaW1wb3J0IHR5cGUgeyBBbnlOb2RlIH0gZnJvbSAnZG9taGFuZGxlcic7XG5pbXBvcnQgeyB6IH0gZnJvbSAnem9kJztcbmltcG9ydCB7IFJlcXVpcmVMb2dpbiB9IGZyb20gJy4uLy4uL2NvbW1vbi9kZWNvcmF0b3JzJztcbmltcG9ydCB7XG4gIEZvcmJpZGRlbkVycm9yLFxuICBMb2dpblJlcXVpcmVkRXJyb3IsXG4gIE5vRWxlbWVudEVycm9yLFxuICBOb3RGb3VuZEV4Y2VwdGlvbixcbiAgVGFyZ2V0RXhpc3RzRXJyb3IsXG4gIFVuZXhwZWN0ZWRFcnJvcixcbn0gZnJvbSAnLi4vLi4vY29tbW9uL2Vycm9ycyc7XG5pbXBvcnQgeyBmcm9tUHJvbWlzZSwgdHlwZSBXaWtpZG90UmVzdWx0QXN5bmMgfSBmcm9tICcuLi8uLi9jb21tb24vdHlwZXMnO1xuaW1wb3J0IHR5cGUgeyBBTUNSZXF1ZXN0Qm9keSB9IGZyb20gJy4uLy4uL2Nvbm5lY3Rvcic7XG5pbXBvcnQgeyBwYXJzZU9kYXRlLCBwYXJzZVVzZXIgfSBmcm9tICcuLi8uLi91dGlsL3BhcnNlcic7XG5pbXBvcnQgdHlwZSB7IFNpdGUgfSBmcm9tICcuLi9zaXRlJztcbmltcG9ydCB0eXBlIHsgQWJzdHJhY3RVc2VyIH0gZnJvbSAnLi4vdXNlcic7XG5pbXBvcnQgeyBQYWdlRmlsZUNvbGxlY3Rpb24gfSBmcm9tICcuL3BhZ2UtZmlsZSc7XG5pbXBvcnQgeyBQYWdlTWV0YUNvbGxlY3Rpb24gfSBmcm9tICcuL3BhZ2UtbWV0YSc7XG5pbXBvcnQgeyB0eXBlIFBhZ2VSZXZpc2lvbiwgUGFnZVJldmlzaW9uQ29sbGVjdGlvbiB9IGZyb20gJy4vcGFnZS1yZXZpc2lvbic7XG5pbXBvcnQgeyBQYWdlU291cmNlIH0gZnJvbSAnLi9wYWdlLXNvdXJjZSc7XG5pbXBvcnQgeyBQYWdlVm90ZSwgUGFnZVZvdGVDb2xsZWN0aW9uIH0gZnJvbSAnLi9wYWdlLXZvdGUnO1xuaW1wb3J0IHsgREVGQVVMVF9NT0RVTEVfQk9EWSwgREVGQVVMVF9QRVJfUEFHRSwgU2VhcmNoUGFnZXNRdWVyeSB9IGZyb20gJy4vc2VhcmNoLXF1ZXJ5JztcblxuLyoqXG4gKiBMaXN0UGFnZXNNb2R1bGXjg5Hjg7zjgrnntZDmnpzjga7jgrnjgq3jg7zjg55cbiAqIOWei+WuieWFqOaAp+OBruOBn+OCgeOBq1pvZOOCkuS9v+eUqOOBl+OBpuODkeODvOOCuee1kOaenOOCkuaknOiovFxuICovXG5jb25zdCBwYWdlUGFyYW1zU2NoZW1hID0gei5vYmplY3Qoe1xuICBmdWxsbmFtZTogei5zdHJpbmcoKS5kZWZhdWx0KCcnKSxcbiAgbmFtZTogei5zdHJpbmcoKS5kZWZhdWx0KCcnKSxcbiAgY2F0ZWdvcnk6IHouc3RyaW5nKCkuZGVmYXVsdCgnJyksXG4gIHRpdGxlOiB6LnN0cmluZygpLmRlZmF1bHQoJycpLFxuICBjaGlsZHJlbl9jb3VudDogei5udW1iZXIoKS5kZWZhdWx0KDApLFxuICBjb21tZW50c19jb3VudDogei5udW1iZXIoKS5kZWZhdWx0KDApLFxuICBzaXplOiB6Lm51bWJlcigpLmRlZmF1bHQoMCksXG4gIHJhdGluZzogei5udW1iZXIoKS5kZWZhdWx0KDApLFxuICB2b3Rlc19jb3VudDogei5udW1iZXIoKS5kZWZhdWx0KDApLFxuICByYXRpbmdfcGVyY2VudDogei5udW1iZXIoKS5udWxsYWJsZSgpLmRlZmF1bHQobnVsbCksXG4gIHJldmlzaW9uc19jb3VudDogei5udW1iZXIoKS5kZWZhdWx0KDApLFxuICBwYXJlbnRfZnVsbG5hbWU6IHouc3RyaW5nKCkubnVsbGFibGUoKS5kZWZhdWx0KG51bGwpLFxuICB0YWdzOiB6LmFycmF5KHouc3RyaW5nKCkpLmRlZmF1bHQoW10pLFxuICBjcmVhdGVkX2J5OiB6LmN1c3RvbTxBYnN0cmFjdFVzZXI+KCkubnVsbGFibGUoKS5kZWZhdWx0KG51bGwpLFxuICBjcmVhdGVkX2F0OiB6LmRhdGUoKS5udWxsYWJsZSgpLmRlZmF1bHQobnVsbCksXG4gIHVwZGF0ZWRfYnk6IHouY3VzdG9tPEFic3RyYWN0VXNlcj4oKS5udWxsYWJsZSgpLmRlZmF1bHQobnVsbCksXG4gIHVwZGF0ZWRfYXQ6IHouZGF0ZSgpLm51bGxhYmxlKCkuZGVmYXVsdChudWxsKSxcbiAgY29tbWVudGVkX2J5OiB6LmN1c3RvbTxBYnN0cmFjdFVzZXI+KCkubnVsbGFibGUoKS5kZWZhdWx0KG51bGwpLFxuICBjb21tZW50ZWRfYXQ6IHouZGF0ZSgpLm51bGxhYmxlKCkuZGVmYXVsdChudWxsKSxcbn0pO1xuXG4vKipcbiAqIOODmuODvOOCuOODh+ODvOOCv1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhZ2VEYXRhIHtcbiAgc2l0ZTogU2l0ZTtcbiAgZnVsbG5hbWU6IHN0cmluZztcbiAgbmFtZTogc3RyaW5nO1xuICBjYXRlZ29yeTogc3RyaW5nO1xuICB0aXRsZTogc3RyaW5nO1xuICBjaGlsZHJlbkNvdW50OiBudW1iZXI7XG4gIGNvbW1lbnRzQ291bnQ6IG51bWJlcjtcbiAgc2l6ZTogbnVtYmVyO1xuICByYXRpbmc6IG51bWJlcjtcbiAgdm90ZXNDb3VudDogbnVtYmVyO1xuICByYXRpbmdQZXJjZW50OiBudW1iZXIgfCBudWxsO1xuICByZXZpc2lvbnNDb3VudDogbnVtYmVyO1xuICBwYXJlbnRGdWxsbmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgdGFnczogc3RyaW5nW107XG4gIGNyZWF0ZWRCeTogQWJzdHJhY3RVc2VyIHwgbnVsbDtcbiAgY3JlYXRlZEF0OiBEYXRlO1xuICB1cGRhdGVkQnk6IEFic3RyYWN0VXNlciB8IG51bGw7XG4gIHVwZGF0ZWRBdDogRGF0ZTtcbiAgY29tbWVudGVkQnk6IEFic3RyYWN0VXNlciB8IG51bGw7XG4gIGNvbW1lbnRlZEF0OiBEYXRlIHwgbnVsbDtcbn1cblxuLyoqXG4gKiBXaWtpZG9044Oa44O844K4XG4gKi9cbmV4cG9ydCBjbGFzcyBQYWdlIHtcbiAgcHVibGljIHJlYWRvbmx5IHNpdGU6IFNpdGU7XG4gIHB1YmxpYyByZWFkb25seSBmdWxsbmFtZTogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgY2F0ZWdvcnk6IHN0cmluZztcbiAgcHVibGljIHRpdGxlOiBzdHJpbmc7XG4gIHB1YmxpYyBjaGlsZHJlbkNvdW50OiBudW1iZXI7XG4gIHB1YmxpYyBjb21tZW50c0NvdW50OiBudW1iZXI7XG4gIHB1YmxpYyBzaXplOiBudW1iZXI7XG4gIHB1YmxpYyByYXRpbmc6IG51bWJlcjtcbiAgcHVibGljIHZvdGVzQ291bnQ6IG51bWJlcjtcbiAgcHVibGljIHJhdGluZ1BlcmNlbnQ6IG51bWJlciB8IG51bGw7XG4gIHB1YmxpYyByZXZpc2lvbnNDb3VudDogbnVtYmVyO1xuICBwdWJsaWMgcGFyZW50RnVsbG5hbWU6IHN0cmluZyB8IG51bGw7XG4gIHB1YmxpYyB0YWdzOiBzdHJpbmdbXTtcbiAgcHVibGljIHJlYWRvbmx5IGNyZWF0ZWRCeTogQWJzdHJhY3RVc2VyIHwgbnVsbDtcbiAgcHVibGljIHJlYWRvbmx5IGNyZWF0ZWRBdDogRGF0ZTtcbiAgcHVibGljIHVwZGF0ZWRCeTogQWJzdHJhY3RVc2VyIHwgbnVsbDtcbiAgcHVibGljIHVwZGF0ZWRBdDogRGF0ZTtcbiAgcHVibGljIGNvbW1lbnRlZEJ5OiBBYnN0cmFjdFVzZXIgfCBudWxsO1xuICBwdWJsaWMgY29tbWVudGVkQXQ6IERhdGUgfCBudWxsO1xuXG4gIHByaXZhdGUgX2lkOiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBfc291cmNlOiBQYWdlU291cmNlIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgX3JldmlzaW9uczogUGFnZVJldmlzaW9uQ29sbGVjdGlvbiB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIF92b3RlczogUGFnZVZvdGVDb2xsZWN0aW9uIHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IoZGF0YTogUGFnZURhdGEpIHtcbiAgICB0aGlzLnNpdGUgPSBkYXRhLnNpdGU7XG4gICAgdGhpcy5mdWxsbmFtZSA9IGRhdGEuZnVsbG5hbWU7XG4gICAgdGhpcy5uYW1lID0gZGF0YS5uYW1lO1xuICAgIHRoaXMuY2F0ZWdvcnkgPSBkYXRhLmNhdGVnb3J5O1xuICAgIHRoaXMudGl0bGUgPSBkYXRhLnRpdGxlO1xuICAgIHRoaXMuY2hpbGRyZW5Db3VudCA9IGRhdGEuY2hpbGRyZW5Db3VudDtcbiAgICB0aGlzLmNvbW1lbnRzQ291bnQgPSBkYXRhLmNvbW1lbnRzQ291bnQ7XG4gICAgdGhpcy5zaXplID0gZGF0YS5zaXplO1xuICAgIHRoaXMucmF0aW5nID0gZGF0YS5yYXRpbmc7XG4gICAgdGhpcy52b3Rlc0NvdW50ID0gZGF0YS52b3Rlc0NvdW50O1xuICAgIHRoaXMucmF0aW5nUGVyY2VudCA9IGRhdGEucmF0aW5nUGVyY2VudDtcbiAgICB0aGlzLnJldmlzaW9uc0NvdW50ID0gZGF0YS5yZXZpc2lvbnNDb3VudDtcbiAgICB0aGlzLnBhcmVudEZ1bGxuYW1lID0gZGF0YS5wYXJlbnRGdWxsbmFtZTtcbiAgICB0aGlzLnRhZ3MgPSBkYXRhLnRhZ3M7XG4gICAgdGhpcy5jcmVhdGVkQnkgPSBkYXRhLmNyZWF0ZWRCeTtcbiAgICB0aGlzLmNyZWF0ZWRBdCA9IGRhdGEuY3JlYXRlZEF0O1xuICAgIHRoaXMudXBkYXRlZEJ5ID0gZGF0YS51cGRhdGVkQnk7XG4gICAgdGhpcy51cGRhdGVkQXQgPSBkYXRhLnVwZGF0ZWRBdDtcbiAgICB0aGlzLmNvbW1lbnRlZEJ5ID0gZGF0YS5jb21tZW50ZWRCeTtcbiAgICB0aGlzLmNvbW1lbnRlZEF0ID0gZGF0YS5jb21tZW50ZWRBdDtcbiAgfVxuXG4gIC8qKlxuICAgKiDjg5rjg7zjgrhVUkzjgpLlj5blvpdcbiAgICovXG4gIGdldFVybCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLnNpdGUuZ2V0QmFzZVVybCgpfS8ke3RoaXMuZnVsbG5hbWV9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiDjg5rjg7zjgrhJROOBjOWPluW+l+a4iOOBv+OBi+OBqeOBhuOBi1xuICAgKi9cbiAgaXNJZEFjcXVpcmVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9pZCAhPT0gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiDjg5rjg7zjgrhJROOCkuWPluW+l1xuICAgKi9cbiAgZ2V0IGlkKCk6IG51bWJlciB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9pZDtcbiAgfVxuXG4gIC8qKlxuICAgKiDjg5rjg7zjgrhJROOCkuioreWumlxuICAgKi9cbiAgc2V0IGlkKHZhbHVlOiBudW1iZXIgfCBudWxsKSB7XG4gICAgdGhpcy5faWQgPSB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiDjgr3jg7zjgrnjgrPjg7zjg4njgpLlj5blvpdcbiAgICovXG4gIGdldCBzb3VyY2UoKTogUGFnZVNvdXJjZSB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9zb3VyY2U7XG4gIH1cblxuICAvKipcbiAgICog44K944O844K544Kz44O844OJ44KS6Kit5a6aXG4gICAqL1xuICBzZXQgc291cmNlKHZhbHVlOiBQYWdlU291cmNlIHwgbnVsbCkge1xuICAgIHRoaXMuX3NvdXJjZSA9IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIOODquODk+OCuOODp+ODs+WxpeattOOCkuWPluW+l1xuICAgKi9cbiAgZ2V0IHJldmlzaW9ucygpOiBQYWdlUmV2aXNpb25Db2xsZWN0aW9uIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX3JldmlzaW9ucztcbiAgfVxuXG4gIC8qKlxuICAgKiDjg6rjg5Pjgrjjg6fjg7PlsaXmrbTjgpLoqK3lrppcbiAgICovXG4gIHNldCByZXZpc2lvbnModmFsdWU6IFBhZ2VSZXZpc2lvbkNvbGxlY3Rpb24gfCBudWxsKSB7XG4gICAgdGhpcy5fcmV2aXNpb25zID0gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICog5oqV56Wo5oOF5aCx44KS5Y+W5b6XXG4gICAqL1xuICBnZXQgdm90ZXMoKTogUGFnZVZvdGVDb2xsZWN0aW9uIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX3ZvdGVzO1xuICB9XG5cbiAgLyoqXG4gICAqIOaKleelqOaDheWgseOCkuioreWumlxuICAgKi9cbiAgc2V0IHZvdGVzKHZhbHVlOiBQYWdlVm90ZUNvbGxlY3Rpb24gfCBudWxsKSB7XG4gICAgdGhpcy5fdm90ZXMgPSB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmnIDmlrDjg6rjg5Pjgrjjg6fjg7PjgpLlj5blvpdcbiAgICovXG4gIGdldCBsYXRlc3RSZXZpc2lvbigpOiBQYWdlUmV2aXNpb24gfCB1bmRlZmluZWQge1xuICAgIGlmICghdGhpcy5fcmV2aXNpb25zIHx8IHRoaXMuX3JldmlzaW9ucy5sZW5ndGggPT09IDApIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHRoaXMuX3JldmlzaW9ucy5yZWR1Y2UoKG1heCwgcmV2KSA9PiAocmV2LnJldk5vID4gbWF4LnJldk5vID8gcmV2IDogbWF4KSk7XG4gIH1cblxuICAvKipcbiAgICog44Oa44O844K4SUTjgYzlv4XpoIjjga7mk43kvZzjgafjgIFJROOBjOOBquOBhOWgtOWQiOOBq+OCqOODqeODvOOCkui/lOOBmeODmOODq+ODkeODvFxuICAgKiBAcGFyYW0gb3BlcmF0aW9uIC0g5pON5L2c5ZCN77yI44Ko44Op44O844Oh44OD44K744O844K455So77yJXG4gICAqIEByZXR1cm5zIOODmuODvOOCuElE44G+44Gf44Gv44Ko44Op44O8UmVzdWx0XG4gICAqL1xuICBwcml2YXRlIHJlcXVpcmVJZChcbiAgICBvcGVyYXRpb246IHN0cmluZ1xuICApOiB7IG9rOiB0cnVlOyBpZDogbnVtYmVyIH0gfCB7IG9rOiBmYWxzZTsgZXJyb3I6IFdpa2lkb3RSZXN1bHRBc3luYzxuZXZlcj4gfSB7XG4gICAgaWYgKHRoaXMuX2lkID09PSBudWxsKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBvazogZmFsc2UsXG4gICAgICAgIGVycm9yOiBmcm9tUHJvbWlzZShcbiAgICAgICAgICBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoJ1BhZ2UgSUQgbm90IGFjcXVpcmVkJykpLFxuICAgICAgICAgICgpID0+IG5ldyBVbmV4cGVjdGVkRXJyb3IoYFBhZ2UgSUQgbXVzdCBiZSBhY3F1aXJlZCBiZWZvcmUgJHtvcGVyYXRpb259YClcbiAgICAgICAgKSxcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB7IG9rOiB0cnVlLCBpZDogdGhpcy5faWQgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDjg5rjg7zjgrjjgpLliYrpmaTjgZnjgotcbiAgICovXG4gIEBSZXF1aXJlTG9naW5cbiAgZGVzdHJveSgpOiBXaWtpZG90UmVzdWx0QXN5bmM8dm9pZD4ge1xuICAgIGNvbnN0IGlkQ2hlY2sgPSB0aGlzLnJlcXVpcmVJZCgnZGVsZXRpb24nKTtcbiAgICBpZiAoIWlkQ2hlY2sub2spIHJldHVybiBpZENoZWNrLmVycm9yO1xuXG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zaXRlLmFtY1JlcXVlc3QoW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFjdGlvbjogJ1dpa2lQYWdlQWN0aW9uJyxcbiAgICAgICAgICAgIGV2ZW50OiAnZGVsZXRlUGFnZScsXG4gICAgICAgICAgICBwYWdlX2lkOiB0aGlzLl9pZCxcbiAgICAgICAgICAgIG1vZHVsZU5hbWU6ICdFbXB0eScsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSk7XG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGRlbGV0ZSBwYWdlOiAke1N0cmluZyhlcnJvcil9YClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIOOCv+OCsOOCkuS/neWtmOOBmeOCi1xuICAgKi9cbiAgQFJlcXVpcmVMb2dpblxuICBjb21taXRUYWdzKCk6IFdpa2lkb3RSZXN1bHRBc3luYzx2b2lkPiB7XG4gICAgY29uc3QgaWRDaGVjayA9IHRoaXMucmVxdWlyZUlkKCdzYXZpbmcgdGFncycpO1xuICAgIGlmICghaWRDaGVjay5vaykgcmV0dXJuIGlkQ2hlY2suZXJyb3I7XG5cbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnNpdGUuYW1jUmVxdWVzdChbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdGFnczogdGhpcy50YWdzLmpvaW4oJyAnKSxcbiAgICAgICAgICAgIGFjdGlvbjogJ1dpa2lQYWdlQWN0aW9uJyxcbiAgICAgICAgICAgIGV2ZW50OiAnc2F2ZVRhZ3MnLFxuICAgICAgICAgICAgcGFnZUlkOiB0aGlzLl9pZCxcbiAgICAgICAgICAgIG1vZHVsZU5hbWU6ICdFbXB0eScsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSk7XG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIHNhdmUgdGFnczogJHtTdHJpbmcoZXJyb3IpfWApXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDopqrjg5rjg7zjgrjjgpLoqK3lrprjgZnjgotcbiAgICogQHBhcmFtIHBhcmVudEZ1bGxuYW1lIC0g6Kaq44Oa44O844K444Gu44OV44Or44ON44O844Og77yIbnVsbOOBp+ino+mZpO+8iVxuICAgKi9cbiAgQFJlcXVpcmVMb2dpblxuICBzZXRQYXJlbnQocGFyZW50RnVsbG5hbWU6IHN0cmluZyB8IG51bGwpOiBXaWtpZG90UmVzdWx0QXN5bmM8dm9pZD4ge1xuICAgIGNvbnN0IGlkQ2hlY2sgPSB0aGlzLnJlcXVpcmVJZCgnc2V0dGluZyBwYXJlbnQnKTtcbiAgICBpZiAoIWlkQ2hlY2sub2spIHJldHVybiBpZENoZWNrLmVycm9yO1xuXG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zaXRlLmFtY1JlcXVlc3QoW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFjdGlvbjogJ1dpa2lQYWdlQWN0aW9uJyxcbiAgICAgICAgICAgIGV2ZW50OiAnc2V0UGFyZW50UGFnZScsXG4gICAgICAgICAgICBtb2R1bGVOYW1lOiAnRW1wdHknLFxuICAgICAgICAgICAgcGFnZUlkOiBTdHJpbmcodGhpcy5faWQpLFxuICAgICAgICAgICAgcGFyZW50TmFtZTogcGFyZW50RnVsbG5hbWUgPz8gJycsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSk7XG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnBhcmVudEZ1bGxuYW1lID0gcGFyZW50RnVsbG5hbWU7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gc2V0IHBhcmVudDogJHtTdHJpbmcoZXJyb3IpfWApXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDjg5rjg7zjgrjjgavmipXnpajjgZnjgotcbiAgICogQHBhcmFtIHZhbHVlIC0g5oqV56Wo5YCkXG4gICAqIEByZXR1cm5zIOaWsOOBl+OBhOODrOODvOODhuOCo+ODs+OCsFxuICAgKi9cbiAgQFJlcXVpcmVMb2dpblxuICB2b3RlKHZhbHVlOiBudW1iZXIpOiBXaWtpZG90UmVzdWx0QXN5bmM8bnVtYmVyPiB7XG4gICAgY29uc3QgaWRDaGVjayA9IHRoaXMucmVxdWlyZUlkKCd2b3RpbmcnKTtcbiAgICBpZiAoIWlkQ2hlY2sub2spIHJldHVybiBpZENoZWNrLmVycm9yO1xuXG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zaXRlLmFtY1JlcXVlc3QoW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFjdGlvbjogJ1JhdGVBY3Rpb24nLFxuICAgICAgICAgICAgZXZlbnQ6ICdyYXRlUGFnZScsXG4gICAgICAgICAgICBtb2R1bGVOYW1lOiAnRW1wdHknLFxuICAgICAgICAgICAgcGFnZUlkOiB0aGlzLl9pZCxcbiAgICAgICAgICAgIHBvaW50czogdmFsdWUsXG4gICAgICAgICAgICBmb3JjZTogJ3llcycsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSk7XG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXNwb25zZSA9IHJlc3VsdC52YWx1ZVswXTtcbiAgICAgICAgaWYgKCFyZXNwb25zZSkge1xuICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkRXJyb3IoJ0VtcHR5IHJlc3BvbnNlIGZyb20gdm90ZSByZXF1ZXN0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbmV3UmF0aW5nID0gTnVtYmVyLnBhcnNlSW50KFN0cmluZyhyZXNwb25zZS5wb2ludHMgPz8gdGhpcy5yYXRpbmcpLCAxMCk7XG4gICAgICAgIHRoaXMucmF0aW5nID0gbmV3UmF0aW5nO1xuICAgICAgICByZXR1cm4gbmV3UmF0aW5nO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIHZvdGU6ICR7U3RyaW5nKGVycm9yKX1gKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICog5oqV56Wo44KS44Kt44Oj44Oz44K744Or44GZ44KLXG4gICAqIEByZXR1cm5zIOaWsOOBl+OBhOODrOODvOODhuOCo+ODs+OCsFxuICAgKi9cbiAgQFJlcXVpcmVMb2dpblxuICBjYW5jZWxWb3RlKCk6IFdpa2lkb3RSZXN1bHRBc3luYzxudW1iZXI+IHtcbiAgICBjb25zdCBpZENoZWNrID0gdGhpcy5yZXF1aXJlSWQoJ2NhbmNlbGluZyB2b3RlJyk7XG4gICAgaWYgKCFpZENoZWNrLm9rKSByZXR1cm4gaWRDaGVjay5lcnJvcjtcblxuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc2l0ZS5hbWNSZXF1ZXN0KFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhY3Rpb246ICdSYXRlQWN0aW9uJyxcbiAgICAgICAgICAgIGV2ZW50OiAnY2FuY2VsVm90ZScsXG4gICAgICAgICAgICBtb2R1bGVOYW1lOiAnRW1wdHknLFxuICAgICAgICAgICAgcGFnZUlkOiB0aGlzLl9pZCxcbiAgICAgICAgICB9LFxuICAgICAgICBdKTtcbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gcmVzdWx0LnZhbHVlWzBdO1xuICAgICAgICBpZiAoIXJlc3BvbnNlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRFcnJvcignRW1wdHkgcmVzcG9uc2UgZnJvbSBjYW5jZWwgdm90ZSByZXF1ZXN0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbmV3UmF0aW5nID0gTnVtYmVyLnBhcnNlSW50KFN0cmluZyhyZXNwb25zZS5wb2ludHMgPz8gdGhpcy5yYXRpbmcpLCAxMCk7XG4gICAgICAgIHRoaXMucmF0aW5nID0gbmV3UmF0aW5nO1xuICAgICAgICByZXR1cm4gbmV3UmF0aW5nO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGNhbmNlbCB2b3RlOiAke1N0cmluZyhlcnJvcil9YClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIOODmuODvOOCuOOCkue3qOmbhuOBmeOCi1xuICAgKiBAcGFyYW0gb3B0aW9ucyAtIOe3qOmbhuOCquODl+OCt+ODp+ODs1xuICAgKi9cbiAgQFJlcXVpcmVMb2dpblxuICBlZGl0KG9wdGlvbnM6IHtcbiAgICB0aXRsZT86IHN0cmluZztcbiAgICBzb3VyY2U/OiBzdHJpbmc7XG4gICAgY29tbWVudD86IHN0cmluZztcbiAgICBmb3JjZUVkaXQ/OiBib29sZWFuO1xuICB9KTogV2lraWRvdFJlc3VsdEFzeW5jPHZvaWQ+IHtcbiAgICBjb25zdCBpZENoZWNrID0gdGhpcy5yZXF1aXJlSWQoJ2VkaXRpbmcnKTtcbiAgICBpZiAoIWlkQ2hlY2sub2spIHJldHVybiBpZENoZWNrLmVycm9yO1xuXG4gICAgY29uc3QgcGFnZUlkID0gaWRDaGVjay5pZDtcblxuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIC8vIOePvuWcqOOBruOCveODvOOCueOCkuWPluW+l++8iOaMh+WumuOBjOOBquOBhOWgtOWQiO+8iVxuICAgICAgICBsZXQgY3VycmVudFNvdXJjZSA9IG9wdGlvbnMuc291cmNlO1xuICAgICAgICBpZiAoY3VycmVudFNvdXJjZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgY29uc3QgZXhpc3RpbmdTb3VyY2UgPSB0aGlzLl9zb3VyY2U7XG4gICAgICAgICAgaWYgKGV4aXN0aW5nU291cmNlICE9PSBudWxsKSB7XG4gICAgICAgICAgICBjdXJyZW50U291cmNlID0gZXhpc3RpbmdTb3VyY2Uud2lraVRleHQ7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIOOCveODvOOCueOCkuWPluW+l1xuICAgICAgICAgICAgY29uc3Qgc291cmNlUmVzdWx0ID0gYXdhaXQgUGFnZUNvbGxlY3Rpb24uYWNxdWlyZVBhZ2VTb3VyY2VzKHRoaXMuc2l0ZSwgW3RoaXNdKTtcbiAgICAgICAgICAgIGlmIChzb3VyY2VSZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgICAgICB0aHJvdyBzb3VyY2VSZXN1bHQuZXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBhY3F1aXJlUGFnZVNvdXJjZXPlvozjgIF0aGlzLl9zb3VyY2Xjgavjgrvjg4Pjg4jjgZXjgozjgotcbiAgICAgICAgICAgIGN1cnJlbnRTb3VyY2UgPSB0aGlzLl9zb3VyY2U/Lndpa2lUZXh0ID8/ICcnO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IFBhZ2VDb2xsZWN0aW9uLmNyZWF0ZU9yRWRpdCh0aGlzLnNpdGUsIHRoaXMuZnVsbG5hbWUsIHtcbiAgICAgICAgICBwYWdlSWQsXG4gICAgICAgICAgdGl0bGU6IG9wdGlvbnMudGl0bGUgPz8gdGhpcy50aXRsZSxcbiAgICAgICAgICBzb3VyY2U6IGN1cnJlbnRTb3VyY2UsXG4gICAgICAgICAgY29tbWVudDogb3B0aW9ucy5jb21tZW50ID8/ICcnLFxuICAgICAgICAgIGZvcmNlRWRpdDogb3B0aW9ucy5mb3JjZUVkaXQgPz8gZmFsc2UsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgTG9naW5SZXF1aXJlZEVycm9yIHx8IGVycm9yIGluc3RhbmNlb2YgRm9yYmlkZGVuRXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBlZGl0IHBhZ2U6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIOODmuODvOOCuOWQjeOCkuWkieabtOOBmeOCi1xuICAgKiBAcGFyYW0gbmV3RnVsbG5hbWUgLSDmlrDjgZfjgYTjg5Xjg6vjg43jg7zjg6BcbiAgICovXG4gIEBSZXF1aXJlTG9naW5cbiAgcmVuYW1lKG5ld0Z1bGxuYW1lOiBzdHJpbmcpOiBXaWtpZG90UmVzdWx0QXN5bmM8dm9pZD4ge1xuICAgIGNvbnN0IGlkQ2hlY2sgPSB0aGlzLnJlcXVpcmVJZCgncmVuYW1pbmcnKTtcbiAgICBpZiAoIWlkQ2hlY2sub2spIHJldHVybiBpZENoZWNrLmVycm9yO1xuXG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zaXRlLmFtY1JlcXVlc3QoW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFjdGlvbjogJ1dpa2lQYWdlQWN0aW9uJyxcbiAgICAgICAgICAgIGV2ZW50OiAncmVuYW1lUGFnZScsXG4gICAgICAgICAgICBtb2R1bGVOYW1lOiAnRW1wdHknLFxuICAgICAgICAgICAgcGFnZV9pZDogdGhpcy5faWQsXG4gICAgICAgICAgICBuZXdfbmFtZTogbmV3RnVsbG5hbWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSk7XG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuICAgICAgICAvLyDjg5fjg63jg5Hjg4bjgqPjgpLmm7TmlrDvvIhyZWFkb25seeOBquOBruOBp09iamVjdC5hc3NpZ27jgafvvIlcbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCB7XG4gICAgICAgICAgZnVsbG5hbWU6IG5ld0Z1bGxuYW1lLFxuICAgICAgICAgIGNhdGVnb3J5OiBuZXdGdWxsbmFtZS5pbmNsdWRlcygnOicpID8gbmV3RnVsbG5hbWUuc3BsaXQoJzonKVswXSA6ICdfZGVmYXVsdCcsXG4gICAgICAgICAgbmFtZTogbmV3RnVsbG5hbWUuaW5jbHVkZXMoJzonKSA/IG5ld0Z1bGxuYW1lLnNwbGl0KCc6JylbMV0gOiBuZXdGdWxsbmFtZSxcbiAgICAgICAgfSk7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gcmVuYW1lIHBhZ2U6ICR7U3RyaW5nKGVycm9yKX1gKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICog44Oa44O844K444Gr5re75LuY44GV44KM44Gf44OV44Kh44Kk44Or5LiA6Kan44KS5Y+W5b6X44GZ44KLXG4gICAqL1xuICBnZXRGaWxlcygpOiBXaWtpZG90UmVzdWx0QXN5bmM8UGFnZUZpbGVDb2xsZWN0aW9uPiB7XG4gICAgcmV0dXJuIFBhZ2VGaWxlQ29sbGVjdGlvbi5hY3F1aXJlKHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIOODmuODvOOCuOOBruODh+OCo+OCueOCq+ODg+OCt+ODp+ODs+OCueODrOODg+ODieOCkuWPluW+l+OBmeOCi1xuICAgKi9cbiAgZ2V0RGlzY3Vzc2lvbigpOiBXaWtpZG90UmVzdWx0QXN5bmM8aW1wb3J0KCcuLi9mb3J1bScpLkZvcnVtVGhyZWFkIHwgbnVsbD4ge1xuICAgIGNvbnN0IGlkQ2hlY2sgPSB0aGlzLnJlcXVpcmVJZCgnZ2V0dGluZyBkaXNjdXNzaW9uJyk7XG4gICAgaWYgKCFpZENoZWNrLm9rKSByZXR1cm4gaWRDaGVjay5lcnJvcjtcblxuICAgIGNvbnN0IHBhZ2VJZCA9IGlkQ2hlY2suaWQ7XG5cbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnNpdGUuYW1jUmVxdWVzdChbXG4gICAgICAgICAge1xuICAgICAgICAgICAgbW9kdWxlTmFtZTogJ2ZvcnVtL0ZvcnVtQ29tbWVudHNMaXN0TW9kdWxlJyxcbiAgICAgICAgICAgIHBhZ2VJZCxcbiAgICAgICAgICB9LFxuICAgICAgICBdKTtcblxuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXNwb25zZSA9IHJlc3VsdC52YWx1ZVswXTtcbiAgICAgICAgaWYgKCFyZXNwb25zZSkge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaHRtbCA9IFN0cmluZyhyZXNwb25zZS5ib2R5ID8/ICcnKTtcbiAgICAgICAgLy8g44K544Os44OD44OJSUTjgpLmir3lh7pcbiAgICAgICAgY29uc3QgbWF0Y2ggPSBodG1sLm1hdGNoKFxuICAgICAgICAgIC9XSUtJRE9UXFwubW9kdWxlc1xcLkZvcnVtVmlld1RocmVhZE1vZHVsZVxcLnZhcnNcXC50aHJlYWRJZFxccyo9XFxzKihcXGQrKS9cbiAgICAgICAgKTtcbiAgICAgICAgaWYgKCFtYXRjaD8uWzFdKSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0aHJlYWRJZCA9IE51bWJlci5wYXJzZUludChtYXRjaFsxXSwgMTApO1xuXG4gICAgICAgIC8vIEZvcnVtVGhyZWFk44KS5Y+W5b6XXG4gICAgICAgIGNvbnN0IHsgRm9ydW1UaHJlYWQgfSA9IGF3YWl0IGltcG9ydCgnLi4vZm9ydW0nKTtcbiAgICAgICAgY29uc3QgdGhyZWFkUmVzdWx0ID0gYXdhaXQgRm9ydW1UaHJlYWQuZ2V0RnJvbUlkKHRoaXMuc2l0ZSwgdGhyZWFkSWQpO1xuICAgICAgICBpZiAodGhyZWFkUmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyB0aHJlYWRSZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRocmVhZFJlc3VsdC52YWx1ZTtcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBnZXQgZGlzY3Vzc2lvbjogJHtTdHJpbmcoZXJyb3IpfWApXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDjg5rjg7zjgrjjga7jg6Hjgr/jgr/jgrDkuIDopqfjgpLlj5blvpfjgZnjgotcbiAgICogQHJldHVybnMg44Oh44K/44K/44Kw44Kz44Os44Kv44K344On44OzXG4gICAqL1xuICBnZXRNZXRhcygpOiBXaWtpZG90UmVzdWx0QXN5bmM8UGFnZU1ldGFDb2xsZWN0aW9uPiB7XG4gICAgY29uc3QgaWRDaGVjayA9IHRoaXMucmVxdWlyZUlkKCdnZXR0aW5nIG1ldGFzJyk7XG4gICAgaWYgKCFpZENoZWNrLm9rKSB7XG4gICAgICByZXR1cm4gaWRDaGVjay5lcnJvcjtcbiAgICB9XG5cbiAgICByZXR1cm4gUGFnZU1ldGFDb2xsZWN0aW9uLmFjcXVpcmUodGhpcyk7XG4gIH1cblxuICAvKipcbiAgICog44Oh44K/44K/44Kw44KS6Kit5a6a44GZ44KLXG4gICAqIEBwYXJhbSBuYW1lIC0g44Oh44K/44K/44Kw5ZCNXG4gICAqIEBwYXJhbSBjb250ZW50IC0g44Oh44K/44K/44Kw44Gu5YCkXG4gICAqL1xuICBzZXRNZXRhKG5hbWU6IHN0cmluZywgY29udGVudDogc3RyaW5nKTogV2lraWRvdFJlc3VsdEFzeW5jPHZvaWQ+IHtcbiAgICBjb25zdCBpZENoZWNrID0gdGhpcy5yZXF1aXJlSWQoJ3NldHRpbmcgbWV0YScpO1xuICAgIGlmICghaWRDaGVjay5vaykge1xuICAgICAgcmV0dXJuIGlkQ2hlY2suZXJyb3I7XG4gICAgfVxuXG4gICAgcmV0dXJuIFBhZ2VNZXRhQ29sbGVjdGlvbi5zZXRNZXRhKHRoaXMsIG5hbWUsIGNvbnRlbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIOODoeOCv+OCv+OCsOOCkuWJiumZpOOBmeOCi1xuICAgKiBAcGFyYW0gbmFtZSAtIOODoeOCv+OCv+OCsOWQjVxuICAgKi9cbiAgZGVsZXRlTWV0YShuYW1lOiBzdHJpbmcpOiBXaWtpZG90UmVzdWx0QXN5bmM8dm9pZD4ge1xuICAgIGNvbnN0IGlkQ2hlY2sgPSB0aGlzLnJlcXVpcmVJZCgnZGVsZXRpbmcgbWV0YScpO1xuICAgIGlmICghaWRDaGVjay5vaykge1xuICAgICAgcmV0dXJuIGlkQ2hlY2suZXJyb3I7XG4gICAgfVxuXG4gICAgcmV0dXJuIFBhZ2VNZXRhQ29sbGVjdGlvbi5kZWxldGVNZXRhKHRoaXMsIG5hbWUpO1xuICB9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFBhZ2UoZnVsbG5hbWU9JHt0aGlzLmZ1bGxuYW1lfSwgdGl0bGU9JHt0aGlzLnRpdGxlfSlgO1xuICB9XG59XG5cbi8qKlxuICog44Oa44O844K444Kz44Os44Kv44K344On44OzXG4gKi9cbmV4cG9ydCBjbGFzcyBQYWdlQ29sbGVjdGlvbiBleHRlbmRzIEFycmF5PFBhZ2U+IHtcbiAgcHVibGljIHJlYWRvbmx5IHNpdGU6IFNpdGU7XG5cbiAgY29uc3RydWN0b3Ioc2l0ZTogU2l0ZSwgcGFnZXM/OiBQYWdlW10pIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuc2l0ZSA9IHNpdGU7XG4gICAgaWYgKHBhZ2VzKSB7XG4gICAgICB0aGlzLnB1c2goLi4ucGFnZXMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDjg5Xjg6vjg43jg7zjg6DjgafmpJzntKJcbiAgICogQHBhcmFtIGZ1bGxuYW1lIC0g44Oa44O844K444Gu44OV44Or44ON44O844OgXG4gICAqIEByZXR1cm5zIOODmuODvOOCuO+8iOWtmOWcqOOBl+OBquOBhOWgtOWQiOOBr3VuZGVmaW5lZO+8iVxuICAgKi9cbiAgZmluZEJ5RnVsbG5hbWUoZnVsbG5hbWU6IHN0cmluZyk6IFBhZ2UgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmZpbmQoKHBhZ2UpID0+IHBhZ2UuZnVsbG5hbWUgPT09IGZ1bGxuYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDjg5rjg7zjgrhJROOCkuS4gOaLrOWPluW+l1xuICAgKi9cbiAgZ2V0UGFnZUlkcygpOiBXaWtpZG90UmVzdWx0QXN5bmM8UGFnZUNvbGxlY3Rpb24+IHtcbiAgICByZXR1cm4gUGFnZUNvbGxlY3Rpb24uYWNxdWlyZVBhZ2VJZHModGhpcy5zaXRlLCB0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDjg5rjg7zjgrjjgr3jg7zjgrnjgpLkuIDmi6zlj5blvpdcbiAgICovXG4gIGdldFBhZ2VTb3VyY2VzKCk6IFdpa2lkb3RSZXN1bHRBc3luYzxQYWdlQ29sbGVjdGlvbj4ge1xuICAgIHJldHVybiBQYWdlQ29sbGVjdGlvbi5hY3F1aXJlUGFnZVNvdXJjZXModGhpcy5zaXRlLCB0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDjg5rjg7zjgrjjg6rjg5Pjgrjjg6fjg7PjgpLkuIDmi6zlj5blvpdcbiAgICovXG4gIGdldFBhZ2VSZXZpc2lvbnMoKTogV2lraWRvdFJlc3VsdEFzeW5jPFBhZ2VDb2xsZWN0aW9uPiB7XG4gICAgcmV0dXJuIFBhZ2VDb2xsZWN0aW9uLmFjcXVpcmVQYWdlUmV2aXNpb25zKHRoaXMuc2l0ZSwgdGhpcyk7XG4gIH1cblxuICAvKipcbiAgICog44Oa44O844K45oqV56Wo44KS5LiA5ous5Y+W5b6XXG4gICAqL1xuICBnZXRQYWdlVm90ZXMoKTogV2lraWRvdFJlc3VsdEFzeW5jPFBhZ2VDb2xsZWN0aW9uPiB7XG4gICAgcmV0dXJuIFBhZ2VDb2xsZWN0aW9uLmFjcXVpcmVQYWdlVm90ZXModGhpcy5zaXRlLCB0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDjg5rjg7zjgrhJROOCkuS4gOaLrOWPluW+l+OBmeOCi+WGhemDqOODoeOCveODg+ODiVxuICAgKi9cbiAgc3RhdGljIGFjcXVpcmVQYWdlSWRzKHNpdGU6IFNpdGUsIHBhZ2VzOiBQYWdlW10pOiBXaWtpZG90UmVzdWx0QXN5bmM8UGFnZUNvbGxlY3Rpb24+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCB0YXJnZXRQYWdlcyA9IHBhZ2VzLmZpbHRlcigocGFnZSkgPT4gIXBhZ2UuaXNJZEFjcXVpcmVkKCkpO1xuXG4gICAgICAgIGlmICh0YXJnZXRQYWdlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gbmV3IFBhZ2VDb2xsZWN0aW9uKHNpdGUsIHBhZ2VzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIG5vcmVuZGVyLCBub3JlZGlyZWN044Gn44Ki44Kv44K744K5XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlcyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICAgIHRhcmdldFBhZ2VzLm1hcChhc3luYyAocGFnZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdXJsID0gYCR7cGFnZS5nZXRVcmwoKX0vbm9yZW5kZXIvdHJ1ZS9ub3JlZGlyZWN0L3RydWVgO1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIHtcbiAgICAgICAgICAgICAgaGVhZGVyczogc2l0ZS5jbGllbnQuYW1jQ2xpZW50LmhlYWRlci5nZXRIZWFkZXJzKCksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiB7IHBhZ2UsIHJlc3BvbnNlIH07XG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcblxuICAgICAgICBmb3IgKGNvbnN0IHsgcGFnZSwgcmVzcG9uc2UgfSBvZiByZXNwb25zZXMpIHtcbiAgICAgICAgICBjb25zdCB0ZXh0ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xuICAgICAgICAgIGNvbnN0IG1hdGNoID0gdGV4dC5tYXRjaCgvV0lLSVJFUVVFU1RcXC5pbmZvXFwucGFnZUlkXFxzKj1cXHMqKFxcZCspOy8pO1xuICAgICAgICAgIGlmICghbWF0Y2g/LlsxXSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IE5vRWxlbWVudEVycm9yKGBDYW5ub3QgZmluZCBwYWdlIGlkOiAke3BhZ2UuZnVsbG5hbWV9YCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHBhZ2UuaWQgPSBOdW1iZXIucGFyc2VJbnQobWF0Y2hbMV0sIDEwKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgUGFnZUNvbGxlY3Rpb24oc2l0ZSwgcGFnZXMpO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBOb0VsZW1lbnRFcnJvcikgcmV0dXJuIGVycm9yO1xuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGFjcXVpcmUgcGFnZSBJRHM6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIOODmuODvOOCuOOCveODvOOCueOCkuS4gOaLrOWPluW+l+OBmeOCi+WGhemDqOODoeOCveODg+ODiVxuICAgKi9cbiAgc3RhdGljIGFjcXVpcmVQYWdlU291cmNlcyhzaXRlOiBTaXRlLCBwYWdlczogUGFnZVtdKTogV2lraWRvdFJlc3VsdEFzeW5jPFBhZ2VDb2xsZWN0aW9uPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgdGFyZ2V0UGFnZXMgPSBwYWdlcy5maWx0ZXIoKHBhZ2UpID0+IHBhZ2Uuc291cmNlID09PSBudWxsICYmIHBhZ2UuaWQgIT09IG51bGwpO1xuXG4gICAgICAgIGlmICh0YXJnZXRQYWdlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gbmV3IFBhZ2VDb2xsZWN0aW9uKHNpdGUsIHBhZ2VzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNpdGUuYW1jUmVxdWVzdChcbiAgICAgICAgICB0YXJnZXRQYWdlcy5tYXAoKHBhZ2UpID0+ICh7XG4gICAgICAgICAgICBtb2R1bGVOYW1lOiAndmlld3NvdXJjZS9WaWV3U291cmNlTW9kdWxlJyxcbiAgICAgICAgICAgIHBhZ2VfaWQ6IHBhZ2UuaWQsXG4gICAgICAgICAgfSkpXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0YXJnZXRQYWdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IHBhZ2UgPSB0YXJnZXRQYWdlc1tpXTtcbiAgICAgICAgICBjb25zdCByZXNwb25zZSA9IHJlc3VsdC52YWx1ZVtpXTtcbiAgICAgICAgICBpZiAoIXBhZ2UgfHwgIXJlc3BvbnNlKSBjb250aW51ZTtcbiAgICAgICAgICBjb25zdCBib2R5ID0gU3RyaW5nKHJlc3BvbnNlLmJvZHkgPz8gJycpLnJlcGxhY2UoLyZuYnNwOy9nLCAnICcpO1xuICAgICAgICAgIGNvbnN0ICQgPSBjaGVlcmlvLmxvYWQoYm9keSk7XG4gICAgICAgICAgY29uc3Qgc291cmNlRWxlbWVudCA9ICQoJ2Rpdi5wYWdlLXNvdXJjZScpO1xuICAgICAgICAgIGlmIChzb3VyY2VFbGVtZW50Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IE5vRWxlbWVudEVycm9yKGBDYW5ub3QgZmluZCBzb3VyY2UgZWxlbWVudCBmb3IgcGFnZTogJHtwYWdlLmZ1bGxuYW1lfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCB3aWtpVGV4dCA9IHNvdXJjZUVsZW1lbnQudGV4dCgpLnRyaW0oKS5yZXBsYWNlKC9eXFx0LywgJycpO1xuICAgICAgICAgIHBhZ2Uuc291cmNlID0gbmV3IFBhZ2VTb3VyY2UoeyBwYWdlLCB3aWtpVGV4dCB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgUGFnZUNvbGxlY3Rpb24oc2l0ZSwgcGFnZXMpO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBOb0VsZW1lbnRFcnJvcikgcmV0dXJuIGVycm9yO1xuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGFjcXVpcmUgcGFnZSBzb3VyY2VzOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDjg5rjg7zjgrjjg6rjg5Pjgrjjg6fjg7PjgpLkuIDmi6zlj5blvpfjgZnjgovlhoXpg6jjg6Hjgr3jg4Pjg4lcbiAgICovXG4gIHN0YXRpYyBhY3F1aXJlUGFnZVJldmlzaW9ucyhzaXRlOiBTaXRlLCBwYWdlczogUGFnZVtdKTogV2lraWRvdFJlc3VsdEFzeW5jPFBhZ2VDb2xsZWN0aW9uPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgdGFyZ2V0UGFnZXMgPSBwYWdlcy5maWx0ZXIoKHBhZ2UpID0+IHBhZ2UucmV2aXNpb25zID09PSBudWxsICYmIHBhZ2UuaWQgIT09IG51bGwpO1xuXG4gICAgICAgIGlmICh0YXJnZXRQYWdlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gbmV3IFBhZ2VDb2xsZWN0aW9uKHNpdGUsIHBhZ2VzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNpdGUuYW1jUmVxdWVzdChcbiAgICAgICAgICB0YXJnZXRQYWdlcy5tYXAoKHBhZ2UpID0+ICh7XG4gICAgICAgICAgICBtb2R1bGVOYW1lOiAnaGlzdG9yeS9QYWdlUmV2aXNpb25MaXN0TW9kdWxlJyxcbiAgICAgICAgICAgIHBhZ2VfaWQ6IHBhZ2UuaWQsXG4gICAgICAgICAgICBvcHRpb25zOiB7IGFsbDogdHJ1ZSB9LFxuICAgICAgICAgICAgcGVycGFnZTogMTAwMDAwMDAwLFxuICAgICAgICAgIH0pKVxuICAgICAgICApO1xuXG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIOODquODk+OCuOODp+ODs+OCkuODkeODvOOCuVxuICAgICAgICBjb25zdCB7IFBhZ2VSZXZpc2lvbiB9ID0gYXdhaXQgaW1wb3J0KCcuL3BhZ2UtcmV2aXNpb24nKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0YXJnZXRQYWdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IHBhZ2UgPSB0YXJnZXRQYWdlc1tpXTtcbiAgICAgICAgICBjb25zdCByZXNwb25zZSA9IHJlc3VsdC52YWx1ZVtpXTtcbiAgICAgICAgICBpZiAoIXBhZ2UgfHwgIXJlc3BvbnNlKSBjb250aW51ZTtcblxuICAgICAgICAgIGNvbnN0IGJvZHkgPSBTdHJpbmcocmVzcG9uc2UuYm9keSA/PyAnJyk7XG4gICAgICAgICAgY29uc3QgJCA9IGNoZWVyaW8ubG9hZChib2R5KTtcbiAgICAgICAgICBjb25zdCByZXZpc2lvbnM6IFBhZ2VSZXZpc2lvbltdID0gW107XG5cbiAgICAgICAgICAkKCd0YWJsZS5wYWdlLWhpc3RvcnkgPiB0cltpZF49cmV2aXNpb24tcm93LV0nKS5lYWNoKChfaiwgcmV2RWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgJHJldiA9ICQocmV2RWxlbWVudCk7XG4gICAgICAgICAgICBjb25zdCByZXZJZEF0dHIgPSAkcmV2LmF0dHIoJ2lkJyk7XG4gICAgICAgICAgICBpZiAoIXJldklkQXR0cikgcmV0dXJuO1xuXG4gICAgICAgICAgICBjb25zdCByZXZJZCA9IE51bWJlci5wYXJzZUludChyZXZJZEF0dHIucmVwbGFjZSgncmV2aXNpb24tcm93LScsICcnKSwgMTApO1xuICAgICAgICAgICAgaWYgKE51bWJlci5pc05hTihyZXZJZCkpIHJldHVybjtcblxuICAgICAgICAgICAgY29uc3QgJHRkcyA9ICRyZXYuZmluZCgndGQnKTtcbiAgICAgICAgICAgIGlmICgkdGRzLmxlbmd0aCA8IDcpIHJldHVybjtcblxuICAgICAgICAgICAgY29uc3QgcmV2Tm9UZXh0ID0gJHRkcy5lcSgwKS50ZXh0KCkudHJpbSgpLnJlcGxhY2UoL1xcLiQvLCAnJyk7XG4gICAgICAgICAgICBjb25zdCByZXZObyA9IE51bWJlci5wYXJzZUludChyZXZOb1RleHQsIDEwKTtcbiAgICAgICAgICAgIGlmIChOdW1iZXIuaXNOYU4ocmV2Tm8pKSByZXR1cm47XG5cbiAgICAgICAgICAgIGNvbnN0ICRjcmVhdGVkQnlFbGVtID0gJHRkcy5lcSg0KS5maW5kKCdzcGFuLnByaW50dXNlcicpO1xuICAgICAgICAgICAgaWYgKCRjcmVhdGVkQnlFbGVtLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgICAgICAgICAgY29uc3QgY3JlYXRlZEJ5ID0gcGFyc2VVc2VyKHNpdGUuY2xpZW50LCAkY3JlYXRlZEJ5RWxlbSBhcyBDaGVlcmlvPEFueU5vZGU+KTtcblxuICAgICAgICAgICAgY29uc3QgJGNyZWF0ZWRBdEVsZW0gPSAkdGRzLmVxKDUpLmZpbmQoJ3NwYW4ub2RhdGUnKTtcbiAgICAgICAgICAgIGlmICgkY3JlYXRlZEF0RWxlbS5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICAgICAgICAgIGNvbnN0IGNyZWF0ZWRBdCA9IHBhcnNlT2RhdGUoJGNyZWF0ZWRBdEVsZW0gYXMgQ2hlZXJpbzxBbnlOb2RlPikgPz8gbmV3IERhdGUoKTtcblxuICAgICAgICAgICAgY29uc3QgY29tbWVudCA9ICR0ZHMuZXEoNikudGV4dCgpLnRyaW0oKTtcblxuICAgICAgICAgICAgcmV2aXNpb25zLnB1c2goXG4gICAgICAgICAgICAgIG5ldyBQYWdlUmV2aXNpb24oe1xuICAgICAgICAgICAgICAgIHBhZ2UsXG4gICAgICAgICAgICAgICAgaWQ6IHJldklkLFxuICAgICAgICAgICAgICAgIHJldk5vLFxuICAgICAgICAgICAgICAgIGNyZWF0ZWRCeSxcbiAgICAgICAgICAgICAgICBjcmVhdGVkQXQsXG4gICAgICAgICAgICAgICAgY29tbWVudCxcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBwYWdlLnJldmlzaW9ucyA9IG5ldyBQYWdlUmV2aXNpb25Db2xsZWN0aW9uKHBhZ2UsIHJldmlzaW9ucyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3IFBhZ2VDb2xsZWN0aW9uKHNpdGUsIHBhZ2VzKTtcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBhY3F1aXJlIHBhZ2UgcmV2aXNpb25zOiAke1N0cmluZyhlcnJvcil9YClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIOODmuODvOOCuOaKleelqOOCkuS4gOaLrOWPluW+l+OBmeOCi+WGhemDqOODoeOCveODg+ODiVxuICAgKi9cbiAgc3RhdGljIGFjcXVpcmVQYWdlVm90ZXMoc2l0ZTogU2l0ZSwgcGFnZXM6IFBhZ2VbXSk6IFdpa2lkb3RSZXN1bHRBc3luYzxQYWdlQ29sbGVjdGlvbj4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHRhcmdldFBhZ2VzID0gcGFnZXMuZmlsdGVyKChwYWdlKSA9PiBwYWdlLnZvdGVzID09PSBudWxsICYmIHBhZ2UuaWQgIT09IG51bGwpO1xuXG4gICAgICAgIGlmICh0YXJnZXRQYWdlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gbmV3IFBhZ2VDb2xsZWN0aW9uKHNpdGUsIHBhZ2VzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNpdGUuYW1jUmVxdWVzdChcbiAgICAgICAgICB0YXJnZXRQYWdlcy5tYXAoKHBhZ2UpID0+ICh7XG4gICAgICAgICAgICBtb2R1bGVOYW1lOiAncGFnZXJhdGUvV2hvUmF0ZWRQYWdlTW9kdWxlJyxcbiAgICAgICAgICAgIHBhZ2VJZDogcGFnZS5pZCxcbiAgICAgICAgICB9KSlcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICAvLyDmipXnpajjgpLjg5Hjg7zjgrlcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0YXJnZXRQYWdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IHBhZ2UgPSB0YXJnZXRQYWdlc1tpXTtcbiAgICAgICAgICBjb25zdCByZXNwb25zZSA9IHJlc3VsdC52YWx1ZVtpXTtcbiAgICAgICAgICBpZiAoIXBhZ2UgfHwgIXJlc3BvbnNlKSBjb250aW51ZTtcblxuICAgICAgICAgIGNvbnN0IGJvZHkgPSBTdHJpbmcocmVzcG9uc2UuYm9keSA/PyAnJyk7XG4gICAgICAgICAgY29uc3QgJCA9IGNoZWVyaW8ubG9hZChib2R5KTtcblxuICAgICAgICAgIGNvbnN0ICR1c2VyRWxlbXMgPSAkKCdzcGFuLnByaW50dXNlcicpO1xuICAgICAgICAgIGNvbnN0ICR2YWx1ZUVsZW1zID0gJChcInNwYW5bc3R5bGVePSdjb2xvciddXCIpO1xuXG4gICAgICAgICAgaWYgKCR1c2VyRWxlbXMubGVuZ3RoICE9PSAkdmFsdWVFbGVtcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkRXJyb3IoJ1VzZXIgYW5kIHZhbHVlIGNvdW50IG1pc21hdGNoIGluIHZvdGVzJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3Qgdm90ZXM6IFBhZ2VWb3RlW10gPSBbXTtcbiAgICAgICAgICAkdXNlckVsZW1zLmVhY2goKGosIHVzZXJFbGVtKSA9PiB7XG4gICAgICAgICAgICBjb25zdCAkdXNlciA9ICQodXNlckVsZW0pO1xuICAgICAgICAgICAgY29uc3QgJHZhbHVlID0gJHZhbHVlRWxlbXMuZXEoaik7XG5cbiAgICAgICAgICAgIGNvbnN0IHVzZXIgPSBwYXJzZVVzZXIoc2l0ZS5jbGllbnQsICR1c2VyIGFzIENoZWVyaW88QW55Tm9kZT4pO1xuICAgICAgICAgICAgY29uc3QgdmFsdWVUZXh0ID0gJHZhbHVlLnRleHQoKS50cmltKCk7XG5cbiAgICAgICAgICAgIGxldCB2YWx1ZTogbnVtYmVyO1xuICAgICAgICAgICAgaWYgKHZhbHVlVGV4dCA9PT0gJysnKSB7XG4gICAgICAgICAgICAgIHZhbHVlID0gMTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWVUZXh0ID09PSAnLScpIHtcbiAgICAgICAgICAgICAgdmFsdWUgPSAtMTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHZhbHVlID0gTnVtYmVyLnBhcnNlSW50KHZhbHVlVGV4dCwgMTApIHx8IDA7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZvdGVzLnB1c2gobmV3IFBhZ2VWb3RlKHsgcGFnZSwgdXNlciwgdmFsdWUgfSkpO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgcGFnZS52b3RlcyA9IG5ldyBQYWdlVm90ZUNvbGxlY3Rpb24ocGFnZSwgdm90ZXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBQYWdlQ29sbGVjdGlvbihzaXRlLCBwYWdlcyk7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gYWNxdWlyZSBwYWdlIHZvdGVzOiAke1N0cmluZyhlcnJvcil9YClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIExpc3RQYWdlc01vZHVsZeODrOOCueODneODs+OCueOCkuODkeODvOOCuVxuICAgKi9cbiAgc3RhdGljIHBhcnNlKFxuICAgIHNpdGU6IFNpdGUsXG4gICAgaHRtbEJvZHk6IGNoZWVyaW8uQ2hlZXJpb0FQSSxcbiAgICBfcGFyc2VVc2VyOiAoZWxlbWVudDogY2hlZXJpby5DaGVlcmlvPEFueU5vZGU+KSA9PiBBYnN0cmFjdFVzZXJcbiAgKTogUGFnZUNvbGxlY3Rpb24ge1xuICAgIGNvbnN0IHBhZ2VzOiBQYWdlW10gPSBbXTtcblxuICAgIGh0bWxCb2R5KCdkaXYucGFnZScpLmVhY2goKF9pLCBwYWdlRWxlbWVudCkgPT4ge1xuICAgICAgY29uc3QgJHBhZ2UgPSBodG1sQm9keShwYWdlRWxlbWVudCk7XG4gICAgICBjb25zdCBwYWdlUGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuXG4gICAgICAvLyA144Gk5pif44Os44O844OG44Kj44Oz44Kw5Yik5a6aXG4gICAgICBjb25zdCBpczVTdGFyUmF0aW5nID0gJHBhZ2UuZmluZCgnc3Bhbi5yYXRpbmcgc3Bhbi5wYWdlLXJhdGUtbGlzdC1wYWdlcy1zdGFydCcpLmxlbmd0aCA+IDA7XG5cbiAgICAgIC8vIOWQhOWApOOCkuWPluW+l1xuICAgICAgJHBhZ2UuZmluZCgnc3Bhbi5zZXQnKS5lYWNoKChfaiwgc2V0RWxlbWVudCkgPT4ge1xuICAgICAgICBjb25zdCAkc2V0ID0gaHRtbEJvZHkoc2V0RWxlbWVudCk7XG4gICAgICAgIGNvbnN0IGtleUVsZW1lbnQgPSAkc2V0LmZpbmQoJ3NwYW4ubmFtZScpO1xuICAgICAgICBpZiAoa2V5RWxlbWVudC5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgICAgICBsZXQga2V5ID0ga2V5RWxlbWVudC50ZXh0KCkudHJpbSgpO1xuICAgICAgICBjb25zdCB2YWx1ZUVsZW1lbnQgPSAkc2V0LmZpbmQoJ3NwYW4udmFsdWUnKTtcblxuICAgICAgICBsZXQgdmFsdWU6IHVua25vd24gPSBudWxsO1xuXG4gICAgICAgIGlmICh2YWx1ZUVsZW1lbnQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgdmFsdWUgPSBudWxsO1xuICAgICAgICB9IGVsc2UgaWYgKFsnY3JlYXRlZF9hdCcsICd1cGRhdGVkX2F0JywgJ2NvbW1lbnRlZF9hdCddLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgICAgICBjb25zdCBvZGF0ZUVsZW1lbnQgPSB2YWx1ZUVsZW1lbnQuZmluZCgnc3Bhbi5vZGF0ZScpO1xuICAgICAgICAgIGlmIChvZGF0ZUVsZW1lbnQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgdGltZXN0YW1wID0gb2RhdGVFbGVtZW50LmF0dHIoJ2NsYXNzJyk/Lm1hdGNoKC90aW1lXyhcXGQrKS8pPy5bMV07XG4gICAgICAgICAgICB2YWx1ZSA9IHRpbWVzdGFtcCA/IG5ldyBEYXRlKE51bWJlci5wYXJzZUludCh0aW1lc3RhbXAsIDEwKSAqIDEwMDApIDogbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgWydjcmVhdGVkX2J5X2xpbmtlZCcsICd1cGRhdGVkX2J5X2xpbmtlZCcsICdjb21tZW50ZWRfYnlfbGlua2VkJ10uaW5jbHVkZXMoa2V5KVxuICAgICAgICApIHtcbiAgICAgICAgICBjb25zdCBwcmludHVzZXJFbGVtZW50ID0gdmFsdWVFbGVtZW50LmZpbmQoJ3NwYW4ucHJpbnR1c2VyJyk7XG4gICAgICAgICAgaWYgKHByaW50dXNlckVsZW1lbnQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdmFsdWUgPSBfcGFyc2VVc2VyKHByaW50dXNlckVsZW1lbnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChbJ3RhZ3MnLCAnX3RhZ3MnXS5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgICAgdmFsdWUgPSB2YWx1ZUVsZW1lbnQudGV4dCgpLnNwbGl0KC9cXHMrLykuZmlsdGVyKEJvb2xlYW4pO1xuICAgICAgICB9IGVsc2UgaWYgKFsncmF0aW5nX3ZvdGVzJywgJ2NvbW1lbnRzJywgJ3NpemUnLCAncmV2aXNpb25zJ10uaW5jbHVkZXMoa2V5KSkge1xuICAgICAgICAgIHZhbHVlID0gTnVtYmVyLnBhcnNlSW50KHZhbHVlRWxlbWVudC50ZXh0KCkudHJpbSgpLCAxMCkgfHwgMDtcbiAgICAgICAgfSBlbHNlIGlmIChrZXkgPT09ICdyYXRpbmcnKSB7XG4gICAgICAgICAgY29uc3QgcmF0aW5nVGV4dCA9IHZhbHVlRWxlbWVudC50ZXh0KCkudHJpbSgpO1xuICAgICAgICAgIHZhbHVlID0gaXM1U3RhclJhdGluZ1xuICAgICAgICAgICAgPyBOdW1iZXIucGFyc2VGbG9hdChyYXRpbmdUZXh0KSB8fCAwXG4gICAgICAgICAgICA6IE51bWJlci5wYXJzZUludChyYXRpbmdUZXh0LCAxMCkgfHwgMDtcbiAgICAgICAgfSBlbHNlIGlmIChrZXkgPT09ICdyYXRpbmdfcGVyY2VudCcpIHtcbiAgICAgICAgICBpZiAoaXM1U3RhclJhdGluZykge1xuICAgICAgICAgICAgdmFsdWUgPSAoTnVtYmVyLnBhcnNlRmxvYXQodmFsdWVFbGVtZW50LnRleHQoKS50cmltKCkpIHx8IDApIC8gMTAwO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YWx1ZSA9IG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhbHVlID0gdmFsdWVFbGVtZW50LnRleHQoKS50cmltKCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyDjgq3jg7zlpInmj5tcbiAgICAgICAgaWYgKGtleS5pbmNsdWRlcygnX2xpbmtlZCcpKSB7XG4gICAgICAgICAga2V5ID0ga2V5LnJlcGxhY2UoJ19saW5rZWQnLCAnJyk7XG4gICAgICAgIH0gZWxzZSBpZiAoWydjb21tZW50cycsICdjaGlsZHJlbicsICdyZXZpc2lvbnMnXS5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgICAga2V5ID0gYCR7a2V5fV9jb3VudGA7XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSAncmF0aW5nX3ZvdGVzJykge1xuICAgICAgICAgIGtleSA9ICd2b3Rlc19jb3VudCc7XG4gICAgICAgIH1cblxuICAgICAgICBwYWdlUGFyYW1zW2tleV0gPSB2YWx1ZTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyDjgr/jgrDntbHlkIhcbiAgICAgIGNvbnN0IHRhZ3MgPSBBcnJheS5pc0FycmF5KHBhZ2VQYXJhbXMudGFncykgPyBwYWdlUGFyYW1zLnRhZ3MgOiBbXTtcbiAgICAgIGNvbnN0IGhpZGRlblRhZ3MgPSBBcnJheS5pc0FycmF5KHBhZ2VQYXJhbXMuX3RhZ3MpID8gcGFnZVBhcmFtcy5fdGFncyA6IFtdO1xuICAgICAgcGFnZVBhcmFtcy50YWdzID0gWy4uLnRhZ3MsIC4uLmhpZGRlblRhZ3NdO1xuXG4gICAgICAvLyBab2Tjgrnjgq3jg7zjg57jgafmpJzoqLzjg7vjg4fjg5Xjgqnjg6vjg4jlgKTpgannlKhcbiAgICAgIGNvbnN0IHBhcnNlZCA9IHBhZ2VQYXJhbXNTY2hlbWEucGFyc2UocGFnZVBhcmFtcyk7XG5cbiAgICAgIC8vIFBhZ2Xjgqrjg5bjgrjjgqfjgq/jg4jkvZzmiJBcbiAgICAgIHBhZ2VzLnB1c2goXG4gICAgICAgIG5ldyBQYWdlKHtcbiAgICAgICAgICBzaXRlLFxuICAgICAgICAgIGZ1bGxuYW1lOiBwYXJzZWQuZnVsbG5hbWUsXG4gICAgICAgICAgbmFtZTogcGFyc2VkLm5hbWUsXG4gICAgICAgICAgY2F0ZWdvcnk6IHBhcnNlZC5jYXRlZ29yeSxcbiAgICAgICAgICB0aXRsZTogcGFyc2VkLnRpdGxlLFxuICAgICAgICAgIGNoaWxkcmVuQ291bnQ6IHBhcnNlZC5jaGlsZHJlbl9jb3VudCxcbiAgICAgICAgICBjb21tZW50c0NvdW50OiBwYXJzZWQuY29tbWVudHNfY291bnQsXG4gICAgICAgICAgc2l6ZTogcGFyc2VkLnNpemUsXG4gICAgICAgICAgcmF0aW5nOiBwYXJzZWQucmF0aW5nLFxuICAgICAgICAgIHZvdGVzQ291bnQ6IHBhcnNlZC52b3Rlc19jb3VudCxcbiAgICAgICAgICByYXRpbmdQZXJjZW50OiBwYXJzZWQucmF0aW5nX3BlcmNlbnQsXG4gICAgICAgICAgcmV2aXNpb25zQ291bnQ6IHBhcnNlZC5yZXZpc2lvbnNfY291bnQsXG4gICAgICAgICAgcGFyZW50RnVsbG5hbWU6IHBhcnNlZC5wYXJlbnRfZnVsbG5hbWUsXG4gICAgICAgICAgdGFnczogcGFyc2VkLnRhZ3MsXG4gICAgICAgICAgY3JlYXRlZEJ5OiBwYXJzZWQuY3JlYXRlZF9ieSxcbiAgICAgICAgICBjcmVhdGVkQXQ6IHBhcnNlZC5jcmVhdGVkX2F0ID8/IG5ldyBEYXRlKCksXG4gICAgICAgICAgdXBkYXRlZEJ5OiBwYXJzZWQudXBkYXRlZF9ieSxcbiAgICAgICAgICB1cGRhdGVkQXQ6IHBhcnNlZC51cGRhdGVkX2F0ID8/IG5ldyBEYXRlKCksXG4gICAgICAgICAgY29tbWVudGVkQnk6IHBhcnNlZC5jb21tZW50ZWRfYnksXG4gICAgICAgICAgY29tbWVudGVkQXQ6IHBhcnNlZC5jb21tZW50ZWRfYXQsXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIG5ldyBQYWdlQ29sbGVjdGlvbihzaXRlLCBwYWdlcyk7XG4gIH1cblxuICAvKipcbiAgICog44Oa44O844K45qSc57SiXG4gICAqL1xuICBzdGF0aWMgc2VhcmNoUGFnZXMoXG4gICAgc2l0ZTogU2l0ZSxcbiAgICBwYXJzZVVzZXI6IChlbGVtZW50OiBjaGVlcmlvLkNoZWVyaW88QW55Tm9kZT4pID0+IEFic3RyYWN0VXNlcixcbiAgICBxdWVyeTogU2VhcmNoUGFnZXNRdWVyeSB8IG51bGwgPSBudWxsXG4gICk6IFdpa2lkb3RSZXN1bHRBc3luYzxQYWdlQ29sbGVjdGlvbj4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHEgPSBxdWVyeSA/PyBuZXcgU2VhcmNoUGFnZXNRdWVyeSgpO1xuICAgICAgICBjb25zdCBxdWVyeURpY3QgPSBxLmFzRGljdCgpO1xuXG4gICAgICAgIC8vIOODouOCuOODpeODvOODq+ODnOODh+OCo+eUn+aIkFxuICAgICAgICBjb25zdCBtb2R1bGVCb2R5ID0gYFtbZGl2IGNsYXNzPVwicGFnZVwiXV1cXG4ke0RFRkFVTFRfTU9EVUxFX0JPRFkubWFwKFxuICAgICAgICAgIChrZXkpID0+XG4gICAgICAgICAgICBgW1tzcGFuIGNsYXNzPVwic2V0ICR7a2V5fVwiXV1bW3NwYW4gY2xhc3M9XCJuYW1lXCJdXSAke2tleX0gW1svc3Bhbl1dW1tzcGFuIGNsYXNzPVwidmFsdWVcIl1dICUlJHtrZXl9JSUgW1svc3Bhbl1dW1svc3Bhbl1dYFxuICAgICAgICApLmpvaW4oJycpfVxcbltbL2Rpdl1dYDtcblxuICAgICAgICBjb25zdCByZXF1ZXN0Qm9keSA9IHtcbiAgICAgICAgICAuLi5xdWVyeURpY3QsXG4gICAgICAgICAgbW9kdWxlTmFtZTogJ2xpc3QvTGlzdFBhZ2VzTW9kdWxlJyxcbiAgICAgICAgICBtb2R1bGVfYm9keTogbW9kdWxlQm9keSxcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzaXRlLmFtY1JlcXVlc3QoW3JlcXVlc3RCb2R5XSk7XG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIGlmIChyZXN1bHQuZXJyb3IubWVzc2FnZS5pbmNsdWRlcygnbm90X29rJykpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBGb3JiaWRkZW5FcnJvcignRmFpbGVkIHRvIGdldCBwYWdlcywgdGFyZ2V0IHNpdGUgbWF5IGJlIHByaXZhdGUnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZmlyc3RSZXNwb25zZSA9IHJlc3VsdC52YWx1ZVswXTtcbiAgICAgICAgY29uc3QgYm9keSA9IFN0cmluZyhmaXJzdFJlc3BvbnNlPy5ib2R5ID8/ICcnKTtcbiAgICAgICAgY29uc3QgJGZpcnN0ID0gY2hlZXJpby5sb2FkKGJvZHkpO1xuXG4gICAgICAgIGxldCB0b3RhbCA9IDE7XG4gICAgICAgIGNvbnN0IGh0bWxCb2RpZXM6IGNoZWVyaW8uQ2hlZXJpb0FQSVtdID0gWyRmaXJzdF07XG5cbiAgICAgICAgLy8g44Oa44O844K444ON44O844K344On44Oz56K66KqNXG4gICAgICAgIGNvbnN0IHBhZ2VyRWxlbWVudCA9ICRmaXJzdCgnZGl2LnBhZ2VyJyk7XG4gICAgICAgIGlmIChwYWdlckVsZW1lbnQubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnN0IGxhc3RQYWdlckVsZW1lbnRzID0gJGZpcnN0KCdkaXYucGFnZXIgc3Bhbi50YXJnZXQnKTtcbiAgICAgICAgICBpZiAobGFzdFBhZ2VyRWxlbWVudHMubGVuZ3RoID49IDIpIHtcbiAgICAgICAgICAgIGNvbnN0IHNlY29uZExhc3RQYWdlciA9ICRmaXJzdChsYXN0UGFnZXJFbGVtZW50c1tsYXN0UGFnZXJFbGVtZW50cy5sZW5ndGggLSAyXSk7XG4gICAgICAgICAgICBjb25zdCBsYXN0UGFnZXJMaW5rID0gc2Vjb25kTGFzdFBhZ2VyLmZpbmQoJ2EnKTtcbiAgICAgICAgICAgIGlmIChsYXN0UGFnZXJMaW5rLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgdG90YWwgPSBOdW1iZXIucGFyc2VJbnQobGFzdFBhZ2VyTGluay50ZXh0KCkudHJpbSgpLCAxMCkgfHwgMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyDov73liqDjg5rjg7zjgrjlj5blvpdcbiAgICAgICAgaWYgKHRvdGFsID4gMSkge1xuICAgICAgICAgIGNvbnN0IGFkZGl0aW9uYWxCb2RpZXM6IEFNQ1JlcXVlc3RCb2R5W10gPSBbXTtcbiAgICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IHRvdGFsOyBpKyspIHtcbiAgICAgICAgICAgIGFkZGl0aW9uYWxCb2RpZXMucHVzaCh7XG4gICAgICAgICAgICAgIC4uLnF1ZXJ5RGljdCxcbiAgICAgICAgICAgICAgbW9kdWxlTmFtZTogJ2xpc3QvTGlzdFBhZ2VzTW9kdWxlJyxcbiAgICAgICAgICAgICAgbW9kdWxlX2JvZHk6IG1vZHVsZUJvZHksXG4gICAgICAgICAgICAgIG9mZnNldDogaSAqIChxLnBlclBhZ2UgPz8gREVGQVVMVF9QRVJfUEFHRSksXG4gICAgICAgICAgICB9IGFzIEFNQ1JlcXVlc3RCb2R5KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBhZGRpdGlvbmFsUmVzdWx0cyA9IGF3YWl0IHNpdGUuYW1jUmVxdWVzdChhZGRpdGlvbmFsQm9kaWVzKTtcbiAgICAgICAgICBpZiAoYWRkaXRpb25hbFJlc3VsdHMuaXNFcnIoKSkge1xuICAgICAgICAgICAgdGhyb3cgYWRkaXRpb25hbFJlc3VsdHMuZXJyb3I7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZm9yIChjb25zdCByZXNwb25zZSBvZiBhZGRpdGlvbmFsUmVzdWx0cy52YWx1ZSkge1xuICAgICAgICAgICAgY29uc3QgcmVzcEJvZHkgPSBTdHJpbmcocmVzcG9uc2U/LmJvZHkgPz8gJycpO1xuICAgICAgICAgICAgaHRtbEJvZGllcy5wdXNoKGNoZWVyaW8ubG9hZChyZXNwQm9keSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIOODkeODvOOCuVxuICAgICAgICBjb25zdCBwYWdlczogUGFnZVtdID0gW107XG4gICAgICAgIGZvciAoY29uc3QgJGh0bWwgb2YgaHRtbEJvZGllcykge1xuICAgICAgICAgIGNvbnN0IHBhcnNlZCA9IFBhZ2VDb2xsZWN0aW9uLnBhcnNlKHNpdGUsICRodG1sLCBwYXJzZVVzZXIpO1xuICAgICAgICAgIHBhZ2VzLnB1c2goLi4ucGFyc2VkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgUGFnZUNvbGxlY3Rpb24oc2l0ZSwgcGFnZXMpO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBGb3JiaWRkZW5FcnJvciB8fCBlcnJvciBpbnN0YW5jZW9mIE5vdEZvdW5kRXhjZXB0aW9uKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gc2VhcmNoIHBhZ2VzOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDjg5rjg7zjgrjjgpLkvZzmiJDjgb7jgZ/jga/nt6jpm4ZcbiAgICovXG4gIHN0YXRpYyBjcmVhdGVPckVkaXQoXG4gICAgc2l0ZTogU2l0ZSxcbiAgICBmdWxsbmFtZTogc3RyaW5nLFxuICAgIG9wdGlvbnM6IHtcbiAgICAgIHBhZ2VJZD86IG51bWJlciB8IG51bGw7XG4gICAgICB0aXRsZT86IHN0cmluZztcbiAgICAgIHNvdXJjZT86IHN0cmluZztcbiAgICAgIGNvbW1lbnQ/OiBzdHJpbmc7XG4gICAgICBmb3JjZUVkaXQ/OiBib29sZWFuO1xuICAgICAgcmFpc2VPbkV4aXN0cz86IGJvb2xlYW47XG4gICAgfSA9IHt9XG4gICk6IFdpa2lkb3RSZXN1bHRBc3luYzx2b2lkPiB7XG4gICAgY29uc3QgbG9naW5SZXN1bHQgPSBzaXRlLmNsaWVudC5yZXF1aXJlTG9naW4oKTtcbiAgICBpZiAobG9naW5SZXN1bHQuaXNFcnIoKSkge1xuICAgICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgICBQcm9taXNlLnJlamVjdChsb2dpblJlc3VsdC5lcnJvciksXG4gICAgICAgICgpID0+IG5ldyBMb2dpblJlcXVpcmVkRXJyb3IoJ0xvZ2luIHJlcXVpcmVkIHRvIGNyZWF0ZS9lZGl0IHBhZ2UnKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgcGFnZUlkID0gbnVsbCxcbiAgICAgICAgICB0aXRsZSA9ICcnLFxuICAgICAgICAgIHNvdXJjZSA9ICcnLFxuICAgICAgICAgIGNvbW1lbnQgPSAnJyxcbiAgICAgICAgICBmb3JjZUVkaXQgPSBmYWxzZSxcbiAgICAgICAgICByYWlzZU9uRXhpc3RzID0gZmFsc2UsXG4gICAgICAgIH0gPSBvcHRpb25zO1xuXG4gICAgICAgIC8vIOODmuODvOOCuOODreODg+OCr+WPluW+l1xuICAgICAgICBjb25zdCBsb2NrUmVxdWVzdEJvZHk6IEFNQ1JlcXVlc3RCb2R5ID0ge1xuICAgICAgICAgIG1vZGU6ICdwYWdlJyxcbiAgICAgICAgICB3aWtpX3BhZ2U6IGZ1bGxuYW1lLFxuICAgICAgICAgIG1vZHVsZU5hbWU6ICdlZGl0L1BhZ2VFZGl0TW9kdWxlJyxcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKGZvcmNlRWRpdCkge1xuICAgICAgICAgIGxvY2tSZXF1ZXN0Qm9keS5mb3JjZV9sb2NrID0gJ3llcyc7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBsb2NrUmVzdWx0ID0gYXdhaXQgc2l0ZS5hbWNSZXF1ZXN0KFtsb2NrUmVxdWVzdEJvZHldKTtcbiAgICAgICAgaWYgKGxvY2tSZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IGxvY2tSZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBsb2NrUmVzcG9uc2UgPSBsb2NrUmVzdWx0LnZhbHVlWzBdO1xuICAgICAgICBpZiAobG9ja1Jlc3BvbnNlPy5sb2NrZWQgfHwgbG9ja1Jlc3BvbnNlPy5vdGhlcl9sb2Nrcykge1xuICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkRXJyb3IoYFBhZ2UgJHtmdWxsbmFtZX0gaXMgbG9ja2VkIG9yIG90aGVyIGxvY2tzIGV4aXN0YCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpc0V4aXN0ID0gJ3BhZ2VfcmV2aXNpb25faWQnIGluIChsb2NrUmVzcG9uc2UgPz8ge30pO1xuXG4gICAgICAgIGlmIChyYWlzZU9uRXhpc3RzICYmIGlzRXhpc3QpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVGFyZ2V0RXhpc3RzRXJyb3IoYFBhZ2UgJHtmdWxsbmFtZX0gYWxyZWFkeSBleGlzdHNgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc0V4aXN0ICYmIHBhZ2VJZCA9PT0gbnVsbCkge1xuICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkRXJyb3IoJ3BhZ2VfaWQgbXVzdCBiZSBzcGVjaWZpZWQgd2hlbiBlZGl0aW5nIGV4aXN0aW5nIHBhZ2UnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGxvY2tJZCA9IFN0cmluZyhsb2NrUmVzcG9uc2U/LmxvY2tfaWQgPz8gJycpO1xuICAgICAgICBjb25zdCBsb2NrU2VjcmV0ID0gU3RyaW5nKGxvY2tSZXNwb25zZT8ubG9ja19zZWNyZXQgPz8gJycpO1xuICAgICAgICBjb25zdCBwYWdlUmV2aXNpb25JZCA9IFN0cmluZyhsb2NrUmVzcG9uc2U/LnBhZ2VfcmV2aXNpb25faWQgPz8gJycpO1xuXG4gICAgICAgIC8vIOODmuODvOOCuOS/neWtmFxuICAgICAgICBjb25zdCBlZGl0UmVxdWVzdEJvZHk6IEFNQ1JlcXVlc3RCb2R5ID0ge1xuICAgICAgICAgIGFjdGlvbjogJ1dpa2lQYWdlQWN0aW9uJyxcbiAgICAgICAgICBldmVudDogJ3NhdmVQYWdlJyxcbiAgICAgICAgICBtb2R1bGVOYW1lOiAnRW1wdHknLFxuICAgICAgICAgIG1vZGU6ICdwYWdlJyxcbiAgICAgICAgICBsb2NrX2lkOiBsb2NrSWQsXG4gICAgICAgICAgbG9ja19zZWNyZXQ6IGxvY2tTZWNyZXQsXG4gICAgICAgICAgcmV2aXNpb25faWQ6IHBhZ2VSZXZpc2lvbklkLFxuICAgICAgICAgIHdpa2lfcGFnZTogZnVsbG5hbWUsXG4gICAgICAgICAgcGFnZV9pZDogcGFnZUlkID8/ICcnLFxuICAgICAgICAgIHRpdGxlLFxuICAgICAgICAgIHNvdXJjZSxcbiAgICAgICAgICBjb21tZW50czogY29tbWVudCxcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBlZGl0UmVzdWx0ID0gYXdhaXQgc2l0ZS5hbWNSZXF1ZXN0KFtlZGl0UmVxdWVzdEJvZHldKTtcbiAgICAgICAgaWYgKGVkaXRSZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IGVkaXRSZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgVGFyZ2V0RXhpc3RzRXJyb3IgfHwgZXJyb3IgaW5zdGFuY2VvZiBMb2dpblJlcXVpcmVkRXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBjcmVhdGUvZWRpdCBwYWdlOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgeyBTZWFyY2hQYWdlc1F1ZXJ5IH07XG4iLAogICAgImltcG9ydCAqIGFzIGNoZWVyaW8gZnJvbSAnY2hlZXJpbyc7XG5pbXBvcnQgeyBVbmV4cGVjdGVkRXJyb3IgfSBmcm9tICcuLi8uLi9jb21tb24vZXJyb3JzJztcbmltcG9ydCB7IGZyb21Qcm9taXNlLCB0eXBlIFdpa2lkb3RSZXN1bHRBc3luYyB9IGZyb20gJy4uLy4uL2NvbW1vbi90eXBlcyc7XG5pbXBvcnQgdHlwZSB7IFBhZ2UgfSBmcm9tICcuL3BhZ2UnO1xuXG4vKipcbiAqIOODmuODvOOCuOODleOCoeOCpOODq+ODh+ODvOOCv1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhZ2VGaWxlRGF0YSB7XG4gIHBhZ2U6IFBhZ2U7XG4gIGlkOiBudW1iZXI7XG4gIG5hbWU6IHN0cmluZztcbiAgdXJsOiBzdHJpbmc7XG4gIG1pbWVUeXBlOiBzdHJpbmc7XG4gIHNpemU6IG51bWJlcjtcbn1cblxuLyoqXG4gKiDjg5rjg7zjgrjmt7vku5jjg5XjgqHjgqTjg6tcbiAqL1xuZXhwb3J0IGNsYXNzIFBhZ2VGaWxlIHtcbiAgcHVibGljIHJlYWRvbmx5IHBhZ2U6IFBhZ2U7XG4gIHB1YmxpYyByZWFkb25seSBpZDogbnVtYmVyO1xuICBwdWJsaWMgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgdXJsOiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSBtaW1lVHlwZTogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgc2l6ZTogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKGRhdGE6IFBhZ2VGaWxlRGF0YSkge1xuICAgIHRoaXMucGFnZSA9IGRhdGEucGFnZTtcbiAgICB0aGlzLmlkID0gZGF0YS5pZDtcbiAgICB0aGlzLm5hbWUgPSBkYXRhLm5hbWU7XG4gICAgdGhpcy51cmwgPSBkYXRhLnVybDtcbiAgICB0aGlzLm1pbWVUeXBlID0gZGF0YS5taW1lVHlwZTtcbiAgICB0aGlzLnNpemUgPSBkYXRhLnNpemU7XG4gIH1cblxuICB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiBgUGFnZUZpbGUoaWQ9JHt0aGlzLmlkfSwgbmFtZT0ke3RoaXMubmFtZX0sIHNpemU9JHt0aGlzLnNpemV9KWA7XG4gIH1cbn1cblxuLyoqXG4gKiDjg5rjg7zjgrjjg5XjgqHjgqTjg6vjgrPjg6zjgq/jgrfjg6fjg7NcbiAqL1xuZXhwb3J0IGNsYXNzIFBhZ2VGaWxlQ29sbGVjdGlvbiBleHRlbmRzIEFycmF5PFBhZ2VGaWxlPiB7XG4gIHB1YmxpYyByZWFkb25seSBwYWdlOiBQYWdlO1xuXG4gIGNvbnN0cnVjdG9yKHBhZ2U6IFBhZ2UsIGZpbGVzPzogUGFnZUZpbGVbXSkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5wYWdlID0gcGFnZTtcbiAgICBpZiAoZmlsZXMpIHtcbiAgICAgIHRoaXMucHVzaCguLi5maWxlcyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIElE44Gn5qSc57SiXG4gICAqL1xuICBmaW5kQnlJZChpZDogbnVtYmVyKTogUGFnZUZpbGUgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmZpbmQoKGZpbGUpID0+IGZpbGUuaWQgPT09IGlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDlkI3liY3jgafmpJzntKJcbiAgICovXG4gIGZpbmRCeU5hbWUobmFtZTogc3RyaW5nKTogUGFnZUZpbGUgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmZpbmQoKGZpbGUpID0+IGZpbGUubmFtZSA9PT0gbmFtZSk7XG4gIH1cblxuICAvKipcbiAgICog44K144Kk44K65paH5a2X5YiX44KS44OQ44Kk44OI5pWw44Gr5aSJ5o+bXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBwYXJzZVNpemUoc2l6ZVRleHQ6IHN0cmluZyk6IG51bWJlciB7XG4gICAgY29uc3QgdGV4dCA9IHNpemVUZXh0LnRyaW0oKTtcbiAgICBpZiAodGV4dC5pbmNsdWRlcygnQnl0ZXMnKSkge1xuICAgICAgcmV0dXJuIE1hdGguZmxvb3IoTnVtYmVyLnBhcnNlRmxvYXQodGV4dC5yZXBsYWNlKCdCeXRlcycsICcnKS50cmltKCkpKTtcbiAgICB9XG4gICAgaWYgKHRleHQuaW5jbHVkZXMoJ2tCJykpIHtcbiAgICAgIHJldHVybiBNYXRoLmZsb29yKE51bWJlci5wYXJzZUZsb2F0KHRleHQucmVwbGFjZSgna0InLCAnJykudHJpbSgpKSAqIDEwMDApO1xuICAgIH1cbiAgICBpZiAodGV4dC5pbmNsdWRlcygnTUInKSkge1xuICAgICAgcmV0dXJuIE1hdGguZmxvb3IoTnVtYmVyLnBhcnNlRmxvYXQodGV4dC5yZXBsYWNlKCdNQicsICcnKS50cmltKCkpICogMTAwMDAwMCk7XG4gICAgfVxuICAgIGlmICh0ZXh0LmluY2x1ZGVzKCdHQicpKSB7XG4gICAgICByZXR1cm4gTWF0aC5mbG9vcihOdW1iZXIucGFyc2VGbG9hdCh0ZXh0LnJlcGxhY2UoJ0dCJywgJycpLnRyaW0oKSkgKiAxMDAwMDAwMDAwKTtcbiAgICB9XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICAvKipcbiAgICog44Oa44O844K444Gr5re75LuY44GV44KM44Gf44OV44Kh44Kk44Or5LiA6Kan44KS5Y+W5b6X44GZ44KLXG4gICAqL1xuICBzdGF0aWMgYWNxdWlyZShwYWdlOiBQYWdlKTogV2lraWRvdFJlc3VsdEFzeW5jPFBhZ2VGaWxlQ29sbGVjdGlvbj4ge1xuICAgIGlmIChwYWdlLmlkID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAgIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcignUGFnZSBJRCBub3QgYWNxdWlyZWQnKSksXG4gICAgICAgICgpID0+IG5ldyBVbmV4cGVjdGVkRXJyb3IoJ1BhZ2UgSUQgbXVzdCBiZSBhY3F1aXJlZCBiZWZvcmUgZ2V0dGluZyBmaWxlcycpXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHBhZ2VJZCA9IHBhZ2UuaWQ7XG5cbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwYWdlLnNpdGUuYW1jUmVxdWVzdChbXG4gICAgICAgICAge1xuICAgICAgICAgICAgbW9kdWxlTmFtZTogJ2ZpbGVzL1BhZ2VGaWxlc01vZHVsZScsXG4gICAgICAgICAgICBwYWdlX2lkOiBwYWdlSWQsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSk7XG5cbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSByZXN1bHQudmFsdWVbMF07XG4gICAgICAgIGlmICghcmVzcG9uc2UpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZEVycm9yKCdFbXB0eSByZXNwb25zZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaHRtbCA9IFN0cmluZyhyZXNwb25zZS5ib2R5ID8/ICcnKTtcbiAgICAgICAgY29uc3QgJCA9IGNoZWVyaW8ubG9hZChodG1sKTtcblxuICAgICAgICBjb25zdCBmaWxlc1RhYmxlID0gJCgndGFibGUucGFnZS1maWxlcycpO1xuICAgICAgICBpZiAoZmlsZXNUYWJsZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gbmV3IFBhZ2VGaWxlQ29sbGVjdGlvbihwYWdlLCBbXSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmaWxlczogUGFnZUZpbGVbXSA9IFtdO1xuXG4gICAgICAgIGZpbGVzVGFibGUuZmluZChcInRib2R5IHRyW2lkXj0nZmlsZS1yb3ctJ11cIikuZWFjaCgoX2ksIHJvdykgPT4ge1xuICAgICAgICAgIGNvbnN0IHJvd0lkID0gJChyb3cpLmF0dHIoJ2lkJyk7XG4gICAgICAgICAgaWYgKCFyb3dJZCkgcmV0dXJuO1xuXG4gICAgICAgICAgY29uc3QgZmlsZUlkID0gTnVtYmVyLnBhcnNlSW50KHJvd0lkLnJlcGxhY2UoJ2ZpbGUtcm93LScsICcnKSwgMTApO1xuICAgICAgICAgIGNvbnN0IHRkcyA9ICQocm93KS5maW5kKCd0ZCcpO1xuICAgICAgICAgIGlmICh0ZHMubGVuZ3RoIDwgMykgcmV0dXJuO1xuXG4gICAgICAgICAgY29uc3QgbGlua0VsZW0gPSAkKHRkc1swXSkuZmluZCgnYScpO1xuICAgICAgICAgIGlmIChsaW5rRWxlbS5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgICAgICAgIGNvbnN0IG5hbWUgPSBsaW5rRWxlbS50ZXh0KCkudHJpbSgpO1xuICAgICAgICAgIGNvbnN0IGhyZWYgPSBsaW5rRWxlbS5hdHRyKCdocmVmJykgPz8gJyc7XG4gICAgICAgICAgY29uc3QgdXJsID0gYCR7cGFnZS5zaXRlLmdldEJhc2VVcmwoKX0ke2hyZWZ9YDtcblxuICAgICAgICAgIGNvbnN0IG1pbWVFbGVtID0gJCh0ZHNbMV0pLmZpbmQoJ3NwYW4nKTtcbiAgICAgICAgICBjb25zdCBtaW1lVHlwZSA9IG1pbWVFbGVtLmF0dHIoJ3RpdGxlJykgPz8gJyc7XG5cbiAgICAgICAgICBjb25zdCBzaXplVGV4dCA9ICQodGRzWzJdKS50ZXh0KCkudHJpbSgpO1xuICAgICAgICAgIGNvbnN0IHNpemUgPSBQYWdlRmlsZUNvbGxlY3Rpb24ucGFyc2VTaXplKHNpemVUZXh0KTtcblxuICAgICAgICAgIGZpbGVzLnB1c2goXG4gICAgICAgICAgICBuZXcgUGFnZUZpbGUoe1xuICAgICAgICAgICAgICBwYWdlLFxuICAgICAgICAgICAgICBpZDogZmlsZUlkLFxuICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICB1cmwsXG4gICAgICAgICAgICAgIG1pbWVUeXBlLFxuICAgICAgICAgICAgICBzaXplLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICApO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gbmV3IFBhZ2VGaWxlQ29sbGVjdGlvbihwYWdlLCBmaWxlcyk7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gYWNxdWlyZSBmaWxlczogJHtTdHJpbmcoZXJyb3IpfWApXG4gICAgKTtcbiAgfVxufVxuIiwKICAgICJpbXBvcnQgKiBhcyBjaGVlcmlvIGZyb20gJ2NoZWVyaW8nO1xuaW1wb3J0IHsgTG9naW5SZXF1aXJlZEVycm9yLCBOb0VsZW1lbnRFcnJvciwgVW5leHBlY3RlZEVycm9yIH0gZnJvbSAnLi4vLi4vY29tbW9uL2Vycm9ycyc7XG5pbXBvcnQgeyBmcm9tUHJvbWlzZSwgdHlwZSBXaWtpZG90UmVzdWx0QXN5bmMgfSBmcm9tICcuLi8uLi9jb21tb24vdHlwZXMnO1xuaW1wb3J0IHR5cGUgeyBQYWdlUmVmIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG4vKipcbiAqIOODmuODvOOCuOODoeOCv+OCv+OCsOODh+ODvOOCv1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhZ2VNZXRhRGF0YSB7XG4gIHBhZ2U6IFBhZ2VSZWY7XG4gIG5hbWU6IHN0cmluZztcbiAgY29udGVudDogc3RyaW5nO1xufVxuXG4vKipcbiAqIOODmuODvOOCuOODoeOCv+OCv+OCsFxuICovXG5leHBvcnQgY2xhc3MgUGFnZU1ldGEge1xuICBwdWJsaWMgcmVhZG9ubHkgcGFnZTogUGFnZVJlZjtcbiAgcHVibGljIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgcHVibGljIGNvbnRlbnQ6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihkYXRhOiBQYWdlTWV0YURhdGEpIHtcbiAgICB0aGlzLnBhZ2UgPSBkYXRhLnBhZ2U7XG4gICAgdGhpcy5uYW1lID0gZGF0YS5uYW1lO1xuICAgIHRoaXMuY29udGVudCA9IGRhdGEuY29udGVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiDjg6Hjgr/jgr/jgrDjga7lgKTjgpLmm7TmlrDjgZnjgotcbiAgICogQHBhcmFtIGNvbnRlbnQgLSDmlrDjgZfjgYTlgKRcbiAgICovXG4gIHVwZGF0ZShjb250ZW50OiBzdHJpbmcpOiBXaWtpZG90UmVzdWx0QXN5bmM8dm9pZD4ge1xuICAgIHJldHVybiBQYWdlTWV0YUNvbGxlY3Rpb24uc2V0TWV0YSh0aGlzLnBhZ2UsIHRoaXMubmFtZSwgY29udGVudCk7XG4gIH1cblxuICAvKipcbiAgICog44Oh44K/44K/44Kw44KS5YmK6Zmk44GZ44KLXG4gICAqL1xuICBkZWxldGUoKTogV2lraWRvdFJlc3VsdEFzeW5jPHZvaWQ+IHtcbiAgICByZXR1cm4gUGFnZU1ldGFDb2xsZWN0aW9uLmRlbGV0ZU1ldGEodGhpcy5wYWdlLCB0aGlzLm5hbWUpO1xuICB9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFBhZ2VNZXRhKG5hbWU9JHt0aGlzLm5hbWV9LCBjb250ZW50PSR7dGhpcy5jb250ZW50fSlgO1xuICB9XG59XG5cbi8qKlxuICog44Oa44O844K444Oh44K/44K/44Kw44Kz44Os44Kv44K344On44OzXG4gKi9cbmV4cG9ydCBjbGFzcyBQYWdlTWV0YUNvbGxlY3Rpb24gZXh0ZW5kcyBBcnJheTxQYWdlTWV0YT4ge1xuICBwdWJsaWMgcmVhZG9ubHkgcGFnZTogUGFnZVJlZjtcblxuICBjb25zdHJ1Y3RvcihwYWdlOiBQYWdlUmVmLCBtZXRhcz86IFBhZ2VNZXRhW10pIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMucGFnZSA9IHBhZ2U7XG4gICAgaWYgKG1ldGFzKSB7XG4gICAgICB0aGlzLnB1c2goLi4ubWV0YXMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDlkI3liY3jgafmpJzntKJcbiAgICogQHBhcmFtIG5hbWUgLSDjg6Hjgr/jgr/jgrDlkI1cbiAgICogQHJldHVybnMg44Oh44K/44K/44Kw77yI5a2Y5Zyo44GX44Gq44GE5aC05ZCI44GvdW5kZWZpbmVk77yJXG4gICAqL1xuICBmaW5kQnlOYW1lKG5hbWU6IHN0cmluZyk6IFBhZ2VNZXRhIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5maW5kKChtZXRhKSA9PiBtZXRhLm5hbWUgPT09IG5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIOODmuODvOOCuOOBruODoeOCv+OCv+OCsOOCkuWPluW+l+OBmeOCi1xuICAgKiBAcGFyYW0gcGFnZSAtIOODmuODvOOCuOWPgueFp1xuICAgKiBAcmV0dXJucyDjg6Hjgr/jgr/jgrDjgrPjg6zjgq/jgrfjg6fjg7NcbiAgICovXG4gIHN0YXRpYyBhY3F1aXJlKHBhZ2U6IFBhZ2VSZWYpOiBXaWtpZG90UmVzdWx0QXN5bmM8UGFnZU1ldGFDb2xsZWN0aW9uPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcGFnZS5zaXRlLmFtY1JlcXVlc3QoW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG1vZHVsZU5hbWU6ICdlZGl0L0VkaXRNZXRhTW9kdWxlJyxcbiAgICAgICAgICAgIHBhZ2VfaWQ6IHBhZ2UuaWQsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSk7XG5cbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSByZXN1bHQudmFsdWVbMF07XG4gICAgICAgIGlmICghcmVzcG9uc2UpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgTm9FbGVtZW50RXJyb3IoJ0VtcHR5IHJlc3BvbnNlJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBodG1sID0gU3RyaW5nKHJlc3BvbnNlLmJvZHkgPz8gJycpO1xuICAgICAgICBjb25zdCAkID0gY2hlZXJpby5sb2FkKGh0bWwpO1xuICAgICAgICBjb25zdCBtZXRhczogUGFnZU1ldGFbXSA9IFtdO1xuXG4gICAgICAgIC8vIOODoeOCv+OCv+OCsOODhuODvOODluODq+OCkuODkeODvOOCuVxuICAgICAgICAkKCd0YWJsZS5tZXRhLXRhYmxlIHRyJykuZWFjaCgoX2ksIGVsZW0pID0+IHtcbiAgICAgICAgICBjb25zdCAkcm93ID0gJChlbGVtKTtcbiAgICAgICAgICBjb25zdCAkY2VsbHMgPSAkcm93LmZpbmQoJ3RkJyk7XG4gICAgICAgICAgaWYgKCRjZWxscy5sZW5ndGggPCAyKSByZXR1cm47XG5cbiAgICAgICAgICBjb25zdCBuYW1lID0gJCgkY2VsbHNbMF0pLnRleHQoKS50cmltKCk7XG4gICAgICAgICAgY29uc3QgY29udGVudCA9ICQoJGNlbGxzWzFdKS50ZXh0KCkudHJpbSgpO1xuXG4gICAgICAgICAgaWYgKG5hbWUpIHtcbiAgICAgICAgICAgIG1ldGFzLnB1c2goXG4gICAgICAgICAgICAgIG5ldyBQYWdlTWV0YSh7XG4gICAgICAgICAgICAgICAgcGFnZSxcbiAgICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICAgIGNvbnRlbnQsXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBQYWdlTWV0YUNvbGxlY3Rpb24ocGFnZSwgbWV0YXMpO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBOb0VsZW1lbnRFcnJvcikge1xuICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGFjcXVpcmUgcGFnZSBtZXRhczogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICog44Oh44K/44K/44Kw44KS6Kit5a6a44GZ44KLXG4gICAqIEBwYXJhbSBwYWdlIC0g44Oa44O844K45Y+C54WnXG4gICAqIEBwYXJhbSBuYW1lIC0g44Oh44K/44K/44Kw5ZCNXG4gICAqIEBwYXJhbSBjb250ZW50IC0g44Oh44K/44K/44Kw44Gu5YCkXG4gICAqL1xuICBzdGF0aWMgc2V0TWV0YShwYWdlOiBQYWdlUmVmLCBuYW1lOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZyk6IFdpa2lkb3RSZXN1bHRBc3luYzx2b2lkPiB7XG4gICAgY29uc3QgbG9naW5SZXN1bHQgPSBwYWdlLnNpdGUuY2xpZW50LnJlcXVpcmVMb2dpbigpO1xuICAgIGlmIChsb2dpblJlc3VsdC5pc0VycigpKSB7XG4gICAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAgIFByb21pc2UucmVqZWN0KGxvZ2luUmVzdWx0LmVycm9yKSxcbiAgICAgICAgKCkgPT4gbmV3IExvZ2luUmVxdWlyZWRFcnJvcignTG9naW4gcmVxdWlyZWQgdG8gc2V0IG1ldGEgdGFnJylcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcGFnZS5zaXRlLmFtY1JlcXVlc3QoW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFjdGlvbjogJ1dpa2lQYWdlQWN0aW9uJyxcbiAgICAgICAgICAgIGV2ZW50OiAnc2F2ZU1ldGFUYWcnLFxuICAgICAgICAgICAgbW9kdWxlTmFtZTogJ0VtcHR5JyxcbiAgICAgICAgICAgIHBhZ2VfaWQ6IHBhZ2UuaWQsXG4gICAgICAgICAgICBtZXRhX25hbWU6IG5hbWUsXG4gICAgICAgICAgICBtZXRhX2NvbnRlbnQ6IGNvbnRlbnQsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSk7XG5cbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIExvZ2luUmVxdWlyZWRFcnJvcikge1xuICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIHNldCBtZXRhIHRhZzogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICog44Oh44K/44K/44Kw44KS5YmK6Zmk44GZ44KLXG4gICAqIEBwYXJhbSBwYWdlIC0g44Oa44O844K45Y+C54WnXG4gICAqIEBwYXJhbSBuYW1lIC0g44Oh44K/44K/44Kw5ZCNXG4gICAqL1xuICBzdGF0aWMgZGVsZXRlTWV0YShwYWdlOiBQYWdlUmVmLCBuYW1lOiBzdHJpbmcpOiBXaWtpZG90UmVzdWx0QXN5bmM8dm9pZD4ge1xuICAgIGNvbnN0IGxvZ2luUmVzdWx0ID0gcGFnZS5zaXRlLmNsaWVudC5yZXF1aXJlTG9naW4oKTtcbiAgICBpZiAobG9naW5SZXN1bHQuaXNFcnIoKSkge1xuICAgICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgICBQcm9taXNlLnJlamVjdChsb2dpblJlc3VsdC5lcnJvciksXG4gICAgICAgICgpID0+IG5ldyBMb2dpblJlcXVpcmVkRXJyb3IoJ0xvZ2luIHJlcXVpcmVkIHRvIGRlbGV0ZSBtZXRhIHRhZycpXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHBhZ2Uuc2l0ZS5hbWNSZXF1ZXN0KFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhY3Rpb246ICdXaWtpUGFnZUFjdGlvbicsXG4gICAgICAgICAgICBldmVudDogJ2RlbGV0ZU1ldGFUYWcnLFxuICAgICAgICAgICAgbW9kdWxlTmFtZTogJ0VtcHR5JyxcbiAgICAgICAgICAgIHBhZ2VfaWQ6IHBhZ2UuaWQsXG4gICAgICAgICAgICBtZXRhX25hbWU6IG5hbWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSk7XG5cbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIExvZ2luUmVxdWlyZWRFcnJvcikge1xuICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGRlbGV0ZSBtZXRhIHRhZzogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBQYWdlIH0gZnJvbSAnLi9wYWdlJztcblxuLyoqXG4gKiDjg5rjg7zjgrjjgr3jg7zjgrnjg4fjg7zjgr9cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYWdlU291cmNlRGF0YSB7XG4gIHBhZ2U6IFBhZ2U7XG4gIHdpa2lUZXh0OiBzdHJpbmc7XG59XG5cbi8qKlxuICog44Oa44O844K444Gu44K944O844K544Kz44O844OJ77yIV2lraWRvdOiomOazle+8iVxuICovXG5leHBvcnQgY2xhc3MgUGFnZVNvdXJjZSB7XG4gIC8qKiDjgr3jg7zjgrnjgYzlsZ7jgZnjgovjg5rjg7zjgrggKi9cbiAgcHVibGljIHJlYWRvbmx5IHBhZ2U6IFBhZ2U7XG5cbiAgLyoqIOOCveODvOOCueOCs+ODvOODie+8iFdpa2lkb3ToqJjms5XvvIkgKi9cbiAgcHVibGljIHJlYWRvbmx5IHdpa2lUZXh0OiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoZGF0YTogUGFnZVNvdXJjZURhdGEpIHtcbiAgICB0aGlzLnBhZ2UgPSBkYXRhLnBhZ2U7XG4gICAgdGhpcy53aWtpVGV4dCA9IGRhdGEud2lraVRleHQ7XG4gIH1cblxuICB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiBgUGFnZVNvdXJjZShwYWdlPSR7dGhpcy5wYWdlLmZ1bGxuYW1lfSwgbGVuZ3RoPSR7dGhpcy53aWtpVGV4dC5sZW5ndGh9KWA7XG4gIH1cbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBBYnN0cmFjdFVzZXIgfSBmcm9tICcuLi91c2VyJztcbmltcG9ydCB0eXBlIHsgUGFnZSB9IGZyb20gJy4vcGFnZSc7XG5cbi8qKlxuICog44Oa44O844K45oqV56Wo44OH44O844K/XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFnZVZvdGVEYXRhIHtcbiAgcGFnZTogUGFnZTtcbiAgdXNlcjogQWJzdHJhY3RVc2VyO1xuICB2YWx1ZTogbnVtYmVyO1xufVxuXG4vKipcbiAqIOODmuODvOOCuOOBuOOBruaKleelqO+8iOODrOODvOODhuOCo+ODs+OCsO+8iVxuICovXG5leHBvcnQgY2xhc3MgUGFnZVZvdGUge1xuICAvKiog5oqV56Wo44GM5bGe44GZ44KL44Oa44O844K4ICovXG4gIHB1YmxpYyByZWFkb25seSBwYWdlOiBQYWdlO1xuXG4gIC8qKiDmipXnpajjgZfjgZ/jg6bjg7zjgrbjg7wgKi9cbiAgcHVibGljIHJlYWRvbmx5IHVzZXI6IEFic3RyYWN0VXNlcjtcblxuICAvKiog5oqV56Wo5YCk77yIKzEvLTEg44G+44Gf44GvIOaVsOWApO+8iSAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdmFsdWU6IG51bWJlcjtcblxuICBjb25zdHJ1Y3RvcihkYXRhOiBQYWdlVm90ZURhdGEpIHtcbiAgICB0aGlzLnBhZ2UgPSBkYXRhLnBhZ2U7XG4gICAgdGhpcy51c2VyID0gZGF0YS51c2VyO1xuICAgIHRoaXMudmFsdWUgPSBkYXRhLnZhbHVlO1xuICB9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFBhZ2VWb3RlKHVzZXI9JHt0aGlzLnVzZXIubmFtZX0sIHZhbHVlPSR7dGhpcy52YWx1ZX0pYDtcbiAgfVxufVxuXG4vKipcbiAqIOODmuODvOOCuOaKleelqOOCs+ODrOOCr+OCt+ODp+ODs1xuICovXG5leHBvcnQgY2xhc3MgUGFnZVZvdGVDb2xsZWN0aW9uIGV4dGVuZHMgQXJyYXk8UGFnZVZvdGU+IHtcbiAgcHVibGljIHJlYWRvbmx5IHBhZ2U6IFBhZ2U7XG5cbiAgY29uc3RydWN0b3IocGFnZTogUGFnZSwgdm90ZXM/OiBQYWdlVm90ZVtdKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLnBhZ2UgPSBwYWdlO1xuICAgIGlmICh2b3Rlcykge1xuICAgICAgdGhpcy5wdXNoKC4uLnZvdGVzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog44Om44O844K244O844Gn5qSc57SiXG4gICAqIEBwYXJhbSB1c2VyIC0g5qSc57Si44GZ44KL44Om44O844K244O8XG4gICAqIEByZXR1cm5zIOaKleelqO+8iOWtmOWcqOOBl+OBquOBhOWgtOWQiOOBr3VuZGVmaW5lZO+8iVxuICAgKi9cbiAgZmluZEJ5VXNlcih1c2VyOiBBYnN0cmFjdFVzZXIpOiBQYWdlVm90ZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZmluZCgodm90ZSkgPT4gdm90ZS51c2VyLmlkID09PSB1c2VyLmlkKTtcbiAgfVxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IEFic3RyYWN0VXNlciB9IGZyb20gJy4uL3VzZXInO1xuXG4vKipcbiAqIOODmuODvOOCuOaknOe0ouOCr+OCqOODquOBruODkeODqeODoeODvOOCv1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlYXJjaFBhZ2VzUXVlcnlQYXJhbXMge1xuICAvKiog44Oa44O844K444K/44Kk44OX77yI5L6LOiAnbm9ybWFsJywgJ2FkbWluJ++8iSAqL1xuICBwYWdldHlwZT86IHN0cmluZztcbiAgLyoqIOOCq+ODhuOCtOODquWQjSAqL1xuICBjYXRlZ29yeT86IHN0cmluZztcbiAgLyoqIOaknOe0ouWvvuixoeOCv+OCsO+8iEFOROadoeS7tu+8iSAqL1xuICB0YWdzPzogc3RyaW5nIHwgc3RyaW5nW107XG4gIC8qKiDopqrjg5rjg7zjgrjlkI0gKi9cbiAgcGFyZW50Pzogc3RyaW5nO1xuICAvKiog44Oq44Oz44Kv5YWI44Oa44O844K45ZCNICovXG4gIGxpbmtUbz86IHN0cmluZztcbiAgLyoqIOS9nOaIkOaXpeaZguadoeS7tiAqL1xuICBjcmVhdGVkQXQ/OiBzdHJpbmc7XG4gIC8qKiDmm7TmlrDml6XmmYLmnaHku7YgKi9cbiAgdXBkYXRlZEF0Pzogc3RyaW5nO1xuICAvKiog5L2c5oiQ6ICFICovXG4gIGNyZWF0ZWRCeT86IEFic3RyYWN0VXNlciB8IHN0cmluZztcbiAgLyoqIOODrOODvOODhuOCo+ODs+OCsOadoeS7tiAqL1xuICByYXRpbmc/OiBzdHJpbmc7XG4gIC8qKiDmipXnpajmlbDmnaHku7YgKi9cbiAgdm90ZXM/OiBzdHJpbmc7XG4gIC8qKiDjg5rjg7zjgrjlkI3mnaHku7YgKi9cbiAgbmFtZT86IHN0cmluZztcbiAgLyoqIOODleODq+ODjeODvOODoO+8iOWujOWFqOS4gOiHtO+8iSAqL1xuICBmdWxsbmFtZT86IHN0cmluZztcbiAgLyoqIOevhOWbsuaMh+WumiAqL1xuICByYW5nZT86IHN0cmluZztcbiAgLyoqIOOCveODvOODiOmghu+8iOS+izogJ2NyZWF0ZWRfYXQgZGVzYyfvvIkgKi9cbiAgb3JkZXI/OiBzdHJpbmc7XG4gIC8qKiDlj5blvpfplovlp4vkvY3nva4gKi9cbiAgb2Zmc2V0PzogbnVtYmVyO1xuICAvKiog5Y+W5b6X5Lu25pWw5Yi26ZmQICovXG4gIGxpbWl0PzogbnVtYmVyO1xuICAvKiogMeODmuODvOOCuOOBguOBn+OCiuS7tuaVsCAqL1xuICBwZXJQYWdlPzogbnVtYmVyO1xuICAvKiog5YCL5Yil6KGo56S6ICovXG4gIHNlcGFyYXRlPzogc3RyaW5nO1xuICAvKiog44Op44OD44OR44O86KGo56S6ICovXG4gIHdyYXBwZXI/OiBzdHJpbmc7XG59XG5cbi8qKlxuICog44OH44OV44Kp44Or44OI44GuMeODmuODvOOCuOOBguOBn+OCiuS7tuaVsFxuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9QRVJfUEFHRSA9IDI1MDtcblxuLyoqXG4gKiDjg4fjg5Xjgqnjg6vjg4jjga7jg6Ljgrjjg6Xjg7zjg6vjg5zjg4fjgqPjg5XjgqPjg7zjg6vjg4lcbiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfTU9EVUxFX0JPRFkgPSBbXG4gICdmdWxsbmFtZScsXG4gICdjYXRlZ29yeScsXG4gICduYW1lJyxcbiAgJ3RpdGxlJyxcbiAgJ2NyZWF0ZWRfYXQnLFxuICAnY3JlYXRlZF9ieV9saW5rZWQnLFxuICAndXBkYXRlZF9hdCcsXG4gICd1cGRhdGVkX2J5X2xpbmtlZCcsXG4gICdjb21tZW50ZWRfYXQnLFxuICAnY29tbWVudGVkX2J5X2xpbmtlZCcsXG4gICdwYXJlbnRfZnVsbG5hbWUnLFxuICAnY29tbWVudHMnLFxuICAnc2l6ZScsXG4gICdjaGlsZHJlbicsXG4gICdyYXRpbmdfdm90ZXMnLFxuICAncmF0aW5nJyxcbiAgJ3JhdGluZ19wZXJjZW50JyxcbiAgJ3JldmlzaW9ucycsXG4gICd0YWdzJyxcbiAgJ190YWdzJyxcbl0gYXMgY29uc3Q7XG5cbi8qKlxuICog44Oa44O844K45qSc57Si44Kv44Ko44OqXG4gKi9cbmV4cG9ydCBjbGFzcyBTZWFyY2hQYWdlc1F1ZXJ5IHtcbiAgLyoqIOODmuODvOOCuOOCv+OCpOODlyAqL1xuICBwYWdldHlwZTogc3RyaW5nO1xuICAvKiog44Kr44OG44K044OqICovXG4gIGNhdGVnb3J5OiBzdHJpbmc7XG4gIC8qKiDjgr/jgrAgKi9cbiAgdGFnczogc3RyaW5nIHwgc3RyaW5nW10gfCBudWxsO1xuICAvKiog6Kaq44Oa44O844K4ICovXG4gIHBhcmVudDogc3RyaW5nIHwgbnVsbDtcbiAgLyoqIOODquODs+OCr+WFiCAqL1xuICBsaW5rVG86IHN0cmluZyB8IG51bGw7XG4gIC8qKiDkvZzmiJDml6XmmYLmnaHku7YgKi9cbiAgY3JlYXRlZEF0OiBzdHJpbmcgfCBudWxsO1xuICAvKiog5pu05paw5pel5pmC5p2h5Lu2ICovXG4gIHVwZGF0ZWRBdDogc3RyaW5nIHwgbnVsbDtcbiAgLyoqIOS9nOaIkOiAhSAqL1xuICBjcmVhdGVkQnk6IEFic3RyYWN0VXNlciB8IHN0cmluZyB8IG51bGw7XG4gIC8qKiDjg6zjg7zjg4bjgqPjg7PjgrDmnaHku7YgKi9cbiAgcmF0aW5nOiBzdHJpbmcgfCBudWxsO1xuICAvKiog5oqV56Wo5pWw5p2h5Lu2ICovXG4gIHZvdGVzOiBzdHJpbmcgfCBudWxsO1xuICAvKiog44Oa44O844K45ZCN5p2h5Lu2ICovXG4gIG5hbWU6IHN0cmluZyB8IG51bGw7XG4gIC8qKiDjg5Xjg6vjg43jg7zjg6DmnaHku7YgKi9cbiAgZnVsbG5hbWU6IHN0cmluZyB8IG51bGw7XG4gIC8qKiDnr4Tlm7IgKi9cbiAgcmFuZ2U6IHN0cmluZyB8IG51bGw7XG4gIC8qKiDjgr3jg7zjg4jpoIYgKi9cbiAgb3JkZXI6IHN0cmluZztcbiAgLyoqIOOCquODleOCu+ODg+ODiCAqL1xuICBvZmZzZXQ6IG51bWJlcjtcbiAgLyoqIOWPluW+l+S7tuaVsOWItumZkCAqL1xuICBsaW1pdDogbnVtYmVyIHwgbnVsbDtcbiAgLyoqIDHjg5rjg7zjgrjjgYLjgZ/jgorku7bmlbAgKi9cbiAgcGVyUGFnZTogbnVtYmVyO1xuICAvKiog5YCL5Yil6KGo56S6ICovXG4gIHNlcGFyYXRlOiBzdHJpbmc7XG4gIC8qKiDjg6njg4Pjg5Hjg7zooajnpLogKi9cbiAgd3JhcHBlcjogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKHBhcmFtczogU2VhcmNoUGFnZXNRdWVyeVBhcmFtcyA9IHt9KSB7XG4gICAgdGhpcy5wYWdldHlwZSA9IHBhcmFtcy5wYWdldHlwZSA/PyAnKic7XG4gICAgdGhpcy5jYXRlZ29yeSA9IHBhcmFtcy5jYXRlZ29yeSA/PyAnKic7XG4gICAgdGhpcy50YWdzID0gcGFyYW1zLnRhZ3MgPz8gbnVsbDtcbiAgICB0aGlzLnBhcmVudCA9IHBhcmFtcy5wYXJlbnQgPz8gbnVsbDtcbiAgICB0aGlzLmxpbmtUbyA9IHBhcmFtcy5saW5rVG8gPz8gbnVsbDtcbiAgICB0aGlzLmNyZWF0ZWRBdCA9IHBhcmFtcy5jcmVhdGVkQXQgPz8gbnVsbDtcbiAgICB0aGlzLnVwZGF0ZWRBdCA9IHBhcmFtcy51cGRhdGVkQXQgPz8gbnVsbDtcbiAgICB0aGlzLmNyZWF0ZWRCeSA9IHBhcmFtcy5jcmVhdGVkQnkgPz8gbnVsbDtcbiAgICB0aGlzLnJhdGluZyA9IHBhcmFtcy5yYXRpbmcgPz8gbnVsbDtcbiAgICB0aGlzLnZvdGVzID0gcGFyYW1zLnZvdGVzID8/IG51bGw7XG4gICAgdGhpcy5uYW1lID0gcGFyYW1zLm5hbWUgPz8gbnVsbDtcbiAgICB0aGlzLmZ1bGxuYW1lID0gcGFyYW1zLmZ1bGxuYW1lID8/IG51bGw7XG4gICAgdGhpcy5yYW5nZSA9IHBhcmFtcy5yYW5nZSA/PyBudWxsO1xuICAgIHRoaXMub3JkZXIgPSBwYXJhbXMub3JkZXIgPz8gJ2NyZWF0ZWRfYXQgZGVzYyc7XG4gICAgdGhpcy5vZmZzZXQgPSBwYXJhbXMub2Zmc2V0ID8/IDA7XG4gICAgdGhpcy5saW1pdCA9IHBhcmFtcy5saW1pdCA/PyBudWxsO1xuICAgIHRoaXMucGVyUGFnZSA9IHBhcmFtcy5wZXJQYWdlID8/IERFRkFVTFRfUEVSX1BBR0U7XG4gICAgdGhpcy5zZXBhcmF0ZSA9IHBhcmFtcy5zZXBhcmF0ZSA/PyAnbm8nO1xuICAgIHRoaXMud3JhcHBlciA9IHBhcmFtcy53cmFwcGVyID8/ICdubyc7XG4gIH1cblxuICAvKipcbiAgICog6L6e5pu45b2i5byP44Gr5aSJ5o+bXG4gICAqL1xuICBhc0RpY3QoKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICAgIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcblxuICAgIGlmICh0aGlzLnBhZ2V0eXBlICE9PSAnKicpIHJlc3VsdC5wYWdldHlwZSA9IHRoaXMucGFnZXR5cGU7XG4gICAgaWYgKHRoaXMuY2F0ZWdvcnkgIT09ICcqJykgcmVzdWx0LmNhdGVnb3J5ID0gdGhpcy5jYXRlZ29yeTtcbiAgICBpZiAodGhpcy50YWdzICE9PSBudWxsKSB7XG4gICAgICByZXN1bHQudGFncyA9IEFycmF5LmlzQXJyYXkodGhpcy50YWdzKSA/IHRoaXMudGFncy5qb2luKCcgJykgOiB0aGlzLnRhZ3M7XG4gICAgfVxuICAgIGlmICh0aGlzLnBhcmVudCAhPT0gbnVsbCkgcmVzdWx0LnBhcmVudCA9IHRoaXMucGFyZW50O1xuICAgIGlmICh0aGlzLmxpbmtUbyAhPT0gbnVsbCkgcmVzdWx0LmxpbmtfdG8gPSB0aGlzLmxpbmtUbztcbiAgICBpZiAodGhpcy5jcmVhdGVkQXQgIT09IG51bGwpIHJlc3VsdC5jcmVhdGVkX2F0ID0gdGhpcy5jcmVhdGVkQXQ7XG4gICAgaWYgKHRoaXMudXBkYXRlZEF0ICE9PSBudWxsKSByZXN1bHQudXBkYXRlZF9hdCA9IHRoaXMudXBkYXRlZEF0O1xuICAgIGlmICh0aGlzLmNyZWF0ZWRCeSAhPT0gbnVsbCkge1xuICAgICAgcmVzdWx0LmNyZWF0ZWRfYnkgPSB0eXBlb2YgdGhpcy5jcmVhdGVkQnkgPT09ICdzdHJpbmcnID8gdGhpcy5jcmVhdGVkQnkgOiB0aGlzLmNyZWF0ZWRCeS5uYW1lO1xuICAgIH1cbiAgICBpZiAodGhpcy5yYXRpbmcgIT09IG51bGwpIHJlc3VsdC5yYXRpbmcgPSB0aGlzLnJhdGluZztcbiAgICBpZiAodGhpcy52b3RlcyAhPT0gbnVsbCkgcmVzdWx0LnZvdGVzID0gdGhpcy52b3RlcztcbiAgICBpZiAodGhpcy5uYW1lICE9PSBudWxsKSByZXN1bHQubmFtZSA9IHRoaXMubmFtZTtcbiAgICBpZiAodGhpcy5mdWxsbmFtZSAhPT0gbnVsbCkgcmVzdWx0LmZ1bGxuYW1lID0gdGhpcy5mdWxsbmFtZTtcbiAgICBpZiAodGhpcy5yYW5nZSAhPT0gbnVsbCkgcmVzdWx0LnJhbmdlID0gdGhpcy5yYW5nZTtcblxuICAgIHJlc3VsdC5vcmRlciA9IHRoaXMub3JkZXI7XG4gICAgcmVzdWx0Lm9mZnNldCA9IHRoaXMub2Zmc2V0O1xuICAgIGlmICh0aGlzLmxpbWl0ICE9PSBudWxsKSByZXN1bHQubGltaXQgPSB0aGlzLmxpbWl0O1xuICAgIHJlc3VsdC5wZXJQYWdlID0gdGhpcy5wZXJQYWdlO1xuICAgIHJlc3VsdC5zZXBhcmF0ZSA9IHRoaXMuc2VwYXJhdGU7XG4gICAgcmVzdWx0LndyYXBwZXIgPSB0aGlzLndyYXBwZXI7XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG4iLAogICAgImltcG9ydCAqIGFzIGNoZWVyaW8gZnJvbSAnY2hlZXJpbyc7XG5pbXBvcnQgeyBOb0VsZW1lbnRFcnJvciwgVW5leHBlY3RlZEVycm9yIH0gZnJvbSAnLi4vLi4vY29tbW9uL2Vycm9ycyc7XG5pbXBvcnQgeyBmcm9tUHJvbWlzZSwgdHlwZSBXaWtpZG90UmVzdWx0QXN5bmMgfSBmcm9tICcuLi8uLi9jb21tb24vdHlwZXMnO1xuaW1wb3J0IHsgcGFyc2VPZGF0ZSwgcGFyc2VVc2VyIH0gZnJvbSAnLi4vLi4vdXRpbC9wYXJzZXInO1xuaW1wb3J0IHR5cGUgeyBTaXRlIH0gZnJvbSAnLi4vc2l0ZSc7XG5pbXBvcnQgdHlwZSB7IEFic3RyYWN0VXNlciB9IGZyb20gJy4uL3VzZXInO1xuXG4vKipcbiAqIOOCteOCpOODiOWkieabtOWxpeattOODh+ODvOOCv1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFNpdGVDaGFuZ2VEYXRhIHtcbiAgc2l0ZTogU2l0ZTtcbiAgcGFnZUZ1bGxuYW1lOiBzdHJpbmc7XG4gIHBhZ2VUaXRsZTogc3RyaW5nO1xuICByZXZpc2lvbk5vOiBudW1iZXI7XG4gIGNoYW5nZWRCeTogQWJzdHJhY3RVc2VyIHwgbnVsbDtcbiAgY2hhbmdlZEF0OiBEYXRlIHwgbnVsbDtcbiAgZmxhZ3M6IHN0cmluZ1tdO1xuICBjb21tZW50OiBzdHJpbmc7XG59XG5cbi8qKlxuICog44K144Kk44OI5aSJ5pu05bGl5q20XG4gKi9cbmV4cG9ydCBjbGFzcyBTaXRlQ2hhbmdlIHtcbiAgcHVibGljIHJlYWRvbmx5IHNpdGU6IFNpdGU7XG4gIHB1YmxpYyByZWFkb25seSBwYWdlRnVsbG5hbWU6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IHBhZ2VUaXRsZTogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgcmV2aXNpb25ObzogbnVtYmVyO1xuICBwdWJsaWMgcmVhZG9ubHkgY2hhbmdlZEJ5OiBBYnN0cmFjdFVzZXIgfCBudWxsO1xuICBwdWJsaWMgcmVhZG9ubHkgY2hhbmdlZEF0OiBEYXRlIHwgbnVsbDtcbiAgcHVibGljIHJlYWRvbmx5IGZsYWdzOiBzdHJpbmdbXTtcbiAgcHVibGljIHJlYWRvbmx5IGNvbW1lbnQ6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihkYXRhOiBTaXRlQ2hhbmdlRGF0YSkge1xuICAgIHRoaXMuc2l0ZSA9IGRhdGEuc2l0ZTtcbiAgICB0aGlzLnBhZ2VGdWxsbmFtZSA9IGRhdGEucGFnZUZ1bGxuYW1lO1xuICAgIHRoaXMucGFnZVRpdGxlID0gZGF0YS5wYWdlVGl0bGU7XG4gICAgdGhpcy5yZXZpc2lvbk5vID0gZGF0YS5yZXZpc2lvbk5vO1xuICAgIHRoaXMuY2hhbmdlZEJ5ID0gZGF0YS5jaGFuZ2VkQnk7XG4gICAgdGhpcy5jaGFuZ2VkQXQgPSBkYXRhLmNoYW5nZWRBdDtcbiAgICB0aGlzLmZsYWdzID0gZGF0YS5mbGFncztcbiAgICB0aGlzLmNvbW1lbnQgPSBkYXRhLmNvbW1lbnQ7XG4gIH1cblxuICAvKipcbiAgICog44Oa44O844K4VVJMXG4gICAqL1xuICBnZXRQYWdlVXJsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3RoaXMuc2l0ZS5nZXRCYXNlVXJsKCl9LyR7dGhpcy5wYWdlRnVsbG5hbWV9YDtcbiAgfVxuXG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBTaXRlQ2hhbmdlKHBhZ2U9JHt0aGlzLnBhZ2VGdWxsbmFtZX0sIHJldj0ke3RoaXMucmV2aXNpb25Ob30sIGJ5PSR7dGhpcy5jaGFuZ2VkQnl9KWA7XG4gIH1cbn1cblxuLyoqXG4gKiDjgrXjgqTjg4jlpInmm7TlsaXmrbTjgrPjg6zjgq/jgrfjg6fjg7NcbiAqL1xuZXhwb3J0IGNsYXNzIFNpdGVDaGFuZ2VDb2xsZWN0aW9uIGV4dGVuZHMgQXJyYXk8U2l0ZUNoYW5nZT4ge1xuICBwdWJsaWMgcmVhZG9ubHkgc2l0ZTogU2l0ZTtcblxuICBjb25zdHJ1Y3RvcihzaXRlOiBTaXRlLCBjaGFuZ2VzPzogU2l0ZUNoYW5nZVtdKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLnNpdGUgPSBzaXRlO1xuICAgIGlmIChjaGFuZ2VzKSB7XG4gICAgICB0aGlzLnB1c2goLi4uY2hhbmdlcyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOacgOi/keOBruWkieabtOWxpeattOOCkuWPluW+l+OBmeOCi1xuICAgKiBAcGFyYW0gc2l0ZSAtIOOCteOCpOODiFxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIOOCquODl+OCt+ODp+ODs1xuICAgKiBAcmV0dXJucyDlpInmm7TlsaXmrbTjgrPjg6zjgq/jgrfjg6fjg7NcbiAgICovXG4gIHN0YXRpYyBhY3F1aXJlKFxuICAgIHNpdGU6IFNpdGUsXG4gICAgb3B0aW9ucz86IHsgcGVyUGFnZT86IG51bWJlcjsgcGFnZT86IG51bWJlcjsgbGltaXQ/OiBudW1iZXIgfVxuICApOiBXaWtpZG90UmVzdWx0QXN5bmM8U2l0ZUNoYW5nZUNvbGxlY3Rpb24+IHtcbiAgICBjb25zdCBwZXJQYWdlID0gb3B0aW9ucz8ucGVyUGFnZSA/PyAyMDtcbiAgICBjb25zdCBwYWdlID0gb3B0aW9ucz8ucGFnZSA/PyAxO1xuICAgIGNvbnN0IGxpbWl0ID0gb3B0aW9ucz8ubGltaXQ7XG5cbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzaXRlLmFtY1JlcXVlc3QoW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG1vZHVsZU5hbWU6ICdjaGFuZ2VzL1NpdGVDaGFuZ2VzTGlzdE1vZHVsZScsXG4gICAgICAgICAgICBwZXJwYWdlOiBwZXJQYWdlLFxuICAgICAgICAgICAgcGFnZTogcGFnZSxcbiAgICAgICAgICB9LFxuICAgICAgICBdKTtcblxuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXNwb25zZSA9IHJlc3VsdC52YWx1ZVswXTtcbiAgICAgICAgaWYgKCFyZXNwb25zZSkge1xuICAgICAgICAgIHRocm93IG5ldyBOb0VsZW1lbnRFcnJvcignRW1wdHkgcmVzcG9uc2UnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGh0bWwgPSBTdHJpbmcocmVzcG9uc2UuYm9keSA/PyAnJyk7XG4gICAgICAgIGNvbnN0ICQgPSBjaGVlcmlvLmxvYWQoaHRtbCk7XG4gICAgICAgIGNvbnN0IGNoYW5nZXM6IFNpdGVDaGFuZ2VbXSA9IFtdO1xuXG4gICAgICAgIC8vIOODhuODvOODluODq+ihjOOCkuODkeODvOOCuVxuICAgICAgICAkKCd0YWJsZS53aWtpLWNvbnRlbnQtdGFibGUgdHInKS5lYWNoKChfaSwgZWxlbSkgPT4ge1xuICAgICAgICAgIGNvbnN0ICRyb3cgPSAkKGVsZW0pO1xuICAgICAgICAgIGNvbnN0ICRjZWxscyA9ICRyb3cuZmluZCgndGQnKTtcbiAgICAgICAgICBpZiAoJGNlbGxzLmxlbmd0aCA8IDQpIHJldHVybjtcblxuICAgICAgICAgIC8vIOODmuODvOOCuOODquODs+OCr1xuICAgICAgICAgIGNvbnN0IHBhZ2VMaW5rID0gJCgkY2VsbHNbMF0pLmZpbmQoJ2EnKTtcbiAgICAgICAgICBjb25zdCBocmVmID0gcGFnZUxpbmsuYXR0cignaHJlZicpID8/ICcnO1xuICAgICAgICAgIGNvbnN0IHBhZ2VGdWxsbmFtZSA9IGhyZWYucmVwbGFjZSgvXlxcLy8sICcnKS5zcGxpdCgnLycpWzBdID8/ICcnO1xuICAgICAgICAgIGNvbnN0IHBhZ2VUaXRsZSA9IHBhZ2VMaW5rLnRleHQoKS50cmltKCk7XG5cbiAgICAgICAgICAvLyDjg6rjg5Pjgrjjg6fjg7Pnlarlj7dcbiAgICAgICAgICBjb25zdCByZXZUZXh0ID0gJCgkY2VsbHNbMV0pLnRleHQoKS50cmltKCk7XG4gICAgICAgICAgY29uc3QgcmV2TWF0Y2ggPSByZXZUZXh0Lm1hdGNoKC8oXFxkKykvKTtcbiAgICAgICAgICBjb25zdCByZXZpc2lvbk5vID0gcmV2TWF0Y2g/LlsxXSA/IE51bWJlci5wYXJzZUludChyZXZNYXRjaFsxXSwgMTApIDogMDtcblxuICAgICAgICAgIC8vIOODleODqeOCsFxuICAgICAgICAgIGNvbnN0IGZsYWdzQ2VsbCA9ICQoJGNlbGxzWzJdKTtcbiAgICAgICAgICBjb25zdCBmbGFnczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgICBmbGFnc0NlbGwuZmluZCgnc3BhbicpLmVhY2goKF9qLCBmbGFnRWxlbSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZmxhZ0NsYXNzID0gJChmbGFnRWxlbSkuYXR0cignY2xhc3MnKSA/PyAnJztcbiAgICAgICAgICAgIGlmIChmbGFnQ2xhc3MuaW5jbHVkZXMoJ3NwYW50aXAnKSkge1xuICAgICAgICAgICAgICBjb25zdCB0aXRsZSA9ICQoZmxhZ0VsZW0pLmF0dHIoJ3RpdGxlJykgPz8gJyc7XG4gICAgICAgICAgICAgIGlmICh0aXRsZSkgZmxhZ3MucHVzaCh0aXRsZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICAvLyDjg6bjg7zjgrbjg7zjgajml6XmmYJcbiAgICAgICAgICBjb25zdCBpbmZvQ2VsbCA9ICQoJGNlbGxzWzNdKTtcbiAgICAgICAgICBjb25zdCB1c2VyRWxlbSA9IGluZm9DZWxsLmZpbmQoJ3NwYW4ucHJpbnR1c2VyJyk7XG4gICAgICAgICAgY29uc3QgY2hhbmdlZEJ5ID0gdXNlckVsZW0ubGVuZ3RoID4gMCA/IHBhcnNlVXNlcihzaXRlLmNsaWVudCwgdXNlckVsZW0pIDogbnVsbDtcblxuICAgICAgICAgIGNvbnN0IG9kYXRlRWxlbSA9IGluZm9DZWxsLmZpbmQoJ3NwYW4ub2RhdGUnKTtcbiAgICAgICAgICBjb25zdCBjaGFuZ2VkQXQgPSBvZGF0ZUVsZW0ubGVuZ3RoID4gMCA/IHBhcnNlT2RhdGUob2RhdGVFbGVtKSA6IG51bGw7XG5cbiAgICAgICAgICAvLyDjgrPjg6Hjg7Pjg4hcbiAgICAgICAgICBjb25zdCBjb21tZW50RWxlbSA9IGluZm9DZWxsLmZpbmQoJ3NwYW4uY29tbWVudHMnKTtcbiAgICAgICAgICBjb25zdCBjb21tZW50ID0gY29tbWVudEVsZW1cbiAgICAgICAgICAgIC50ZXh0KClcbiAgICAgICAgICAgIC50cmltKClcbiAgICAgICAgICAgIC5yZXBsYWNlKC9eW1wiXCJdfFtcIlwiXSQvZywgJycpO1xuXG4gICAgICAgICAgY2hhbmdlcy5wdXNoKFxuICAgICAgICAgICAgbmV3IFNpdGVDaGFuZ2Uoe1xuICAgICAgICAgICAgICBzaXRlLFxuICAgICAgICAgICAgICBwYWdlRnVsbG5hbWUsXG4gICAgICAgICAgICAgIHBhZ2VUaXRsZSxcbiAgICAgICAgICAgICAgcmV2aXNpb25ObyxcbiAgICAgICAgICAgICAgY2hhbmdlZEJ5LFxuICAgICAgICAgICAgICBjaGFuZ2VkQXQsXG4gICAgICAgICAgICAgIGZsYWdzLFxuICAgICAgICAgICAgICBjb21tZW50LFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICApO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBsaW1pdOOBjOaMh+WumuOBleOCjOOBpuOBhOOCi+WgtOWQiOOBr+e1kOaenOOCkuWItumZkFxuICAgICAgICBjb25zdCBsaW1pdGVkQ2hhbmdlcyA9IGxpbWl0ICE9PSB1bmRlZmluZWQgPyBjaGFuZ2VzLnNsaWNlKDAsIGxpbWl0KSA6IGNoYW5nZXM7XG4gICAgICAgIHJldHVybiBuZXcgU2l0ZUNoYW5nZUNvbGxlY3Rpb24oc2l0ZSwgbGltaXRlZENoYW5nZXMpO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBOb0VsZW1lbnRFcnJvcikge1xuICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGFjcXVpcmUgc2l0ZSBjaGFuZ2VzOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxufVxuIiwKICAgICJpbXBvcnQgeyBOb0VsZW1lbnRFcnJvciwgVW5leHBlY3RlZEVycm9yIH0gZnJvbSAnLi4vLi4vLi4vY29tbW9uL2Vycm9ycyc7XG5pbXBvcnQgeyBmcm9tUHJvbWlzZSwgdHlwZSBXaWtpZG90UmVzdWx0QXN5bmMgfSBmcm9tICcuLi8uLi8uLi9jb21tb24vdHlwZXMnO1xuaW1wb3J0IHsgcGFyc2VVc2VyIH0gZnJvbSAnLi4vLi4vLi4vdXRpbC9wYXJzZXInO1xuaW1wb3J0IHsgUGFnZSwgUGFnZUNvbGxlY3Rpb24sIFNlYXJjaFBhZ2VzUXVlcnkgfSBmcm9tICcuLi8uLi9wYWdlJztcbmltcG9ydCB0eXBlIHsgU2l0ZSB9IGZyb20gJy4uL3NpdGUnO1xuXG4vKipcbiAqIOWNmOS4gOODmuODvOOCuOaTjeS9nOOCouOCr+OCu+OCtVxuICovXG5leHBvcnQgY2xhc3MgUGFnZUFjY2Vzc29yIHtcbiAgcHVibGljIHJlYWRvbmx5IHNpdGU6IFNpdGU7XG5cbiAgY29uc3RydWN0b3Ioc2l0ZTogU2l0ZSkge1xuICAgIHRoaXMuc2l0ZSA9IHNpdGU7XG4gIH1cblxuICAvKipcbiAgICogVU5JWOWQjeOBi+OCieODmuODvOOCuOOCkuWPluW+l+OBmeOCi1xuICAgKiBAcGFyYW0gdW5peE5hbWUgLSDjg5rjg7zjgrjjga5VTklY5ZCN77yI5L6LOiAnc2NwLTE3MyfvvIlcbiAgICogQHJldHVybnMg44Oa44O844K477yI5a2Y5Zyo44GX44Gq44GE5aC05ZCI44GvbnVsbO+8iVxuICAgKi9cbiAgZ2V0KHVuaXhOYW1lOiBzdHJpbmcpOiBXaWtpZG90UmVzdWx0QXN5bmM8UGFnZSB8IG51bGw+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBxdWVyeSA9IG5ldyBTZWFyY2hQYWdlc1F1ZXJ5KHsgZnVsbG5hbWU6IHVuaXhOYW1lIH0pO1xuICAgICAgICBjb25zdCB1c2VyUGFyc2VyID0gcGFyc2VVc2VyLmJpbmQobnVsbCwgdGhpcy5zaXRlLmNsaWVudCk7XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgUGFnZUNvbGxlY3Rpb24uc2VhcmNoUGFnZXModGhpcy5zaXRlLCB1c2VyUGFyc2VyLCBxdWVyeSk7XG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHQudmFsdWUubGVuZ3RoID4gMCA/IChyZXN1bHQudmFsdWVbMF0gPz8gbnVsbCkgOiBudWxsO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBOb0VsZW1lbnRFcnJvcikgcmV0dXJuIGVycm9yO1xuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGdldCBwYWdlOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDjg5rjg7zjgrjjgpLkvZzmiJDjgZnjgotcbiAgICogQHBhcmFtIGZ1bGxuYW1lIC0g44Oa44O844K444Gu44OV44Or44ON44O844Og77yI5L6LOiAnc2NwLTE3MyfvvIlcbiAgICogQHBhcmFtIG9wdGlvbnMgLSDkvZzmiJDjgqrjg5fjgrfjg6fjg7NcbiAgICogQHJldHVybnMgdm9pZFxuICAgKi9cbiAgY3JlYXRlKFxuICAgIGZ1bGxuYW1lOiBzdHJpbmcsXG4gICAgb3B0aW9uczoge1xuICAgICAgdGl0bGU/OiBzdHJpbmc7XG4gICAgICBzb3VyY2U/OiBzdHJpbmc7XG4gICAgICBjb21tZW50Pzogc3RyaW5nO1xuICAgICAgZm9yY2VFZGl0PzogYm9vbGVhbjtcbiAgICB9ID0ge31cbiAgKTogV2lraWRvdFJlc3VsdEFzeW5jPHZvaWQ+IHtcbiAgICByZXR1cm4gUGFnZUNvbGxlY3Rpb24uY3JlYXRlT3JFZGl0KHRoaXMuc2l0ZSwgZnVsbG5hbWUsIHtcbiAgICAgIHRpdGxlOiBvcHRpb25zLnRpdGxlLFxuICAgICAgc291cmNlOiBvcHRpb25zLnNvdXJjZSxcbiAgICAgIGNvbW1lbnQ6IG9wdGlvbnMuY29tbWVudCxcbiAgICAgIGZvcmNlRWRpdDogb3B0aW9ucy5mb3JjZUVkaXQsXG4gICAgfSk7XG4gIH1cbn1cblxuZXhwb3J0IHsgUGFnZSB9O1xuIiwKICAgICJpbXBvcnQgeyBVbmV4cGVjdGVkRXJyb3IgfSBmcm9tICcuLi8uLi8uLi9jb21tb24vZXJyb3JzJztcbmltcG9ydCB7IGZyb21Qcm9taXNlLCB0eXBlIFdpa2lkb3RSZXN1bHRBc3luYyB9IGZyb20gJy4uLy4uLy4uL2NvbW1vbi90eXBlcyc7XG5pbXBvcnQgeyBwYXJzZVVzZXIgfSBmcm9tICcuLi8uLi8uLi91dGlsL3BhcnNlcic7XG5pbXBvcnQge1xuICBQYWdlLFxuICBQYWdlQ29sbGVjdGlvbixcbiAgU2VhcmNoUGFnZXNRdWVyeSxcbiAgdHlwZSBTZWFyY2hQYWdlc1F1ZXJ5UGFyYW1zLFxuICBTaXRlQ2hhbmdlQ29sbGVjdGlvbixcbn0gZnJvbSAnLi4vLi4vcGFnZSc7XG5pbXBvcnQgdHlwZSB7IFNpdGUgfSBmcm9tICcuLi9zaXRlJztcblxuLyoqXG4gKiDjg5rjg7zjgrjkuIDopqfmk43kvZzjgqLjgq/jgrvjgrVcbiAqL1xuZXhwb3J0IGNsYXNzIFBhZ2VzQWNjZXNzb3Ige1xuICBwdWJsaWMgcmVhZG9ubHkgc2l0ZTogU2l0ZTtcblxuICBjb25zdHJ1Y3RvcihzaXRlOiBTaXRlKSB7XG4gICAgdGhpcy5zaXRlID0gc2l0ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmnaHku7bjgavlkIjjgYbjg5rjg7zjgrjjgpLmpJzntKLjgZnjgotcbiAgICogQHBhcmFtIHBhcmFtcyAtIOaknOe0ouadoeS7tlxuICAgKiBAcmV0dXJucyDjg5rjg7zjgrjjgrPjg6zjgq/jgrfjg6fjg7NcbiAgICovXG4gIHNlYXJjaChwYXJhbXM/OiBTZWFyY2hQYWdlc1F1ZXJ5UGFyYW1zKTogV2lraWRvdFJlc3VsdEFzeW5jPFBhZ2VDb2xsZWN0aW9uPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcXVlcnkgPSBuZXcgU2VhcmNoUGFnZXNRdWVyeShwYXJhbXMpO1xuICAgICAgICBjb25zdCB1c2VyUGFyc2VyID0gcGFyc2VVc2VyLmJpbmQobnVsbCwgdGhpcy5zaXRlLmNsaWVudCk7XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgUGFnZUNvbGxlY3Rpb24uc2VhcmNoUGFnZXModGhpcy5zaXRlLCB1c2VyUGFyc2VyLCBxdWVyeSk7XG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHQudmFsdWU7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gc2VhcmNoIHBhZ2VzOiAke1N0cmluZyhlcnJvcil9YClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIOWFqOODmuODvOOCuOOCkuWPluW+l+OBmeOCi1xuICAgKiBAcmV0dXJucyDjg5rjg7zjgrjjgrPjg6zjgq/jgrfjg6fjg7NcbiAgICovXG4gIGFsbCgpOiBXaWtpZG90UmVzdWx0QXN5bmM8UGFnZUNvbGxlY3Rpb24+IHtcbiAgICByZXR1cm4gdGhpcy5zZWFyY2goe30pO1xuICB9XG5cbiAgLyoqXG4gICAqIOacgOi/keOBruWkieabtOWxpeattOOCkuWPluW+l+OBmeOCi1xuICAgKiBAcGFyYW0gb3B0aW9ucyAtIOOCquODl+OCt+ODp+ODs1xuICAgKiBAcGFyYW0gb3B0aW9ucy5wZXJQYWdlIC0gMeODmuODvOOCuOOBguOBn+OCiuOBruS7tuaVsO+8iOODh+ODleOCqeODq+ODiDogMjDvvIlcbiAgICogQHBhcmFtIG9wdGlvbnMucGFnZSAtIOODmuODvOOCuOeVquWPt++8iOODh+ODleOCqeODq+ODiDogMe+8iVxuICAgKiBAcmV0dXJucyDlpInmm7TlsaXmrbTjgrPjg6zjgq/jgrfjg6fjg7NcbiAgICovXG4gIGdldFJlY2VudENoYW5nZXMob3B0aW9ucz86IHtcbiAgICBwZXJQYWdlPzogbnVtYmVyO1xuICAgIHBhZ2U/OiBudW1iZXI7XG4gIH0pOiBXaWtpZG90UmVzdWx0QXN5bmM8U2l0ZUNoYW5nZUNvbGxlY3Rpb24+IHtcbiAgICByZXR1cm4gU2l0ZUNoYW5nZUNvbGxlY3Rpb24uYWNxdWlyZSh0aGlzLnNpdGUsIG9wdGlvbnMpO1xuICB9XG59XG5cbmV4cG9ydCB7XG4gIFBhZ2UsXG4gIFBhZ2VDb2xsZWN0aW9uLFxuICBTZWFyY2hQYWdlc1F1ZXJ5LFxuICBTaXRlQ2hhbmdlQ29sbGVjdGlvbixcbiAgdHlwZSBTZWFyY2hQYWdlc1F1ZXJ5UGFyYW1zLFxufTtcbiIsCiAgICAiaW1wb3J0ICogYXMgY2hlZXJpbyBmcm9tICdjaGVlcmlvJztcbmltcG9ydCB7IE5vRWxlbWVudEVycm9yLCBOb3RGb3VuZEV4Y2VwdGlvbiwgVW5leHBlY3RlZEVycm9yIH0gZnJvbSAnLi4vLi4vY29tbW9uL2Vycm9ycyc7XG5pbXBvcnQgeyBmcm9tUHJvbWlzZSwgdHlwZSBXaWtpZG90UmVzdWx0QXN5bmMgfSBmcm9tICcuLi8uLi9jb21tb24vdHlwZXMnO1xuaW1wb3J0IHR5cGUgeyBBTUNSZXF1ZXN0Qm9keSwgQU1DUmVzcG9uc2UgfSBmcm9tICcuLi8uLi9jb25uZWN0b3InO1xuaW1wb3J0IHR5cGUgeyBDbGllbnQgfSBmcm9tICcuLi9jbGllbnQvY2xpZW50JztcbmltcG9ydCB7IEZvcnVtQWNjZXNzb3IgfSBmcm9tICcuL2FjY2Vzc29ycy9mb3J1bS1hY2Nlc3Nvcic7XG5pbXBvcnQgeyBNZW1iZXJBY2Nlc3NvciB9IGZyb20gJy4vYWNjZXNzb3JzL21lbWJlci1hY2Nlc3Nvcic7XG5pbXBvcnQgeyBQYWdlQWNjZXNzb3IgfSBmcm9tICcuL2FjY2Vzc29ycy9wYWdlLWFjY2Vzc29yJztcbmltcG9ydCB7IFBhZ2VzQWNjZXNzb3IgfSBmcm9tICcuL2FjY2Vzc29ycy9wYWdlcy1hY2Nlc3Nvcic7XG5cbi8qKlxuICog44K144Kk44OI44OH44O844K/XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2l0ZURhdGEge1xuICBpZDogbnVtYmVyO1xuICB0aXRsZTogc3RyaW5nO1xuICB1bml4TmFtZTogc3RyaW5nO1xuICBkb21haW46IHN0cmluZztcbiAgc3NsU3VwcG9ydGVkOiBib29sZWFuO1xufVxuXG4vKipcbiAqIOOCteOCpOODiOOCr+ODqeOCuVxuICovXG5leHBvcnQgY2xhc3MgU2l0ZSB7XG4gIHB1YmxpYyByZWFkb25seSBjbGllbnQ6IENsaWVudDtcblxuICAvKiog44K144Kk44OISUQgKi9cbiAgcHVibGljIHJlYWRvbmx5IGlkOiBudW1iZXI7XG5cbiAgLyoqIOOCteOCpOODiOOCv+OCpOODiOODqyAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdGl0bGU6IHN0cmluZztcblxuICAvKiogVU5JWOWQje+8iOS+izogc2NwLWpw77yJICovXG4gIHB1YmxpYyByZWFkb25seSB1bml4TmFtZTogc3RyaW5nO1xuXG4gIC8qKiDjg4njg6HjgqTjg7MgKi9cbiAgcHVibGljIHJlYWRvbmx5IGRvbWFpbjogc3RyaW5nO1xuXG4gIC8qKiBTU0zlr77lv5zjg5Xjg6njgrAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHNzbFN1cHBvcnRlZDogYm9vbGVhbjtcblxuICAvKiog44Oa44O844K444Ki44Kv44K744K1ICovXG4gIHByaXZhdGUgX3BhZ2U6IFBhZ2VBY2Nlc3NvciB8IG51bGwgPSBudWxsO1xuXG4gIC8qKiDjg5rjg7zjgrjkuIDopqfjgqLjgq/jgrvjgrUgKi9cbiAgcHJpdmF0ZSBfcGFnZXM6IFBhZ2VzQWNjZXNzb3IgfCBudWxsID0gbnVsbDtcblxuICAvKiog44OV44Kp44O844Op44Og44Ki44Kv44K744K1ICovXG4gIHByaXZhdGUgX2ZvcnVtOiBGb3J1bUFjY2Vzc29yIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqIOODoeODs+ODkOODvOOCouOCr+OCu+OCtSAqL1xuICBwcml2YXRlIF9tZW1iZXI6IE1lbWJlckFjY2Vzc29yIHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IoY2xpZW50OiBDbGllbnQsIGRhdGE6IFNpdGVEYXRhKSB7XG4gICAgdGhpcy5jbGllbnQgPSBjbGllbnQ7XG4gICAgdGhpcy5pZCA9IGRhdGEuaWQ7XG4gICAgdGhpcy50aXRsZSA9IGRhdGEudGl0bGU7XG4gICAgdGhpcy51bml4TmFtZSA9IGRhdGEudW5peE5hbWU7XG4gICAgdGhpcy5kb21haW4gPSBkYXRhLmRvbWFpbjtcbiAgICB0aGlzLnNzbFN1cHBvcnRlZCA9IGRhdGEuc3NsU3VwcG9ydGVkO1xuICB9XG5cbiAgLyoqXG4gICAqIOODmuODvOOCuOOCouOCr+OCu+OCteOCkuWPluW+l1xuICAgKi9cbiAgZ2V0IHBhZ2UoKTogUGFnZUFjY2Vzc29yIHtcbiAgICBpZiAoIXRoaXMuX3BhZ2UpIHtcbiAgICAgIHRoaXMuX3BhZ2UgPSBuZXcgUGFnZUFjY2Vzc29yKHRoaXMpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fcGFnZTtcbiAgfVxuXG4gIC8qKlxuICAgKiDjg5rjg7zjgrjkuIDopqfjgqLjgq/jgrvjgrXjgpLlj5blvpdcbiAgICovXG4gIGdldCBwYWdlcygpOiBQYWdlc0FjY2Vzc29yIHtcbiAgICBpZiAoIXRoaXMuX3BhZ2VzKSB7XG4gICAgICB0aGlzLl9wYWdlcyA9IG5ldyBQYWdlc0FjY2Vzc29yKHRoaXMpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fcGFnZXM7XG4gIH1cblxuICAvKipcbiAgICog44OV44Kp44O844Op44Og44Ki44Kv44K744K144KS5Y+W5b6XXG4gICAqL1xuICBnZXQgZm9ydW0oKTogRm9ydW1BY2Nlc3NvciB7XG4gICAgaWYgKCF0aGlzLl9mb3J1bSkge1xuICAgICAgdGhpcy5fZm9ydW0gPSBuZXcgRm9ydW1BY2Nlc3Nvcih0aGlzKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2ZvcnVtO1xuICB9XG5cbiAgLyoqXG4gICAqIOODoeODs+ODkOODvOOCouOCr+OCu+OCteOCkuWPluW+l1xuICAgKi9cbiAgZ2V0IG1lbWJlcigpOiBNZW1iZXJBY2Nlc3NvciB7XG4gICAgaWYgKCF0aGlzLl9tZW1iZXIpIHtcbiAgICAgIHRoaXMuX21lbWJlciA9IG5ldyBNZW1iZXJBY2Nlc3Nvcih0aGlzKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX21lbWJlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiDjgrXjgqTjg4jjga7jg5njg7zjgrlVUkzjgpLlj5blvpdcbiAgICovXG4gIGdldEJhc2VVcmwoKTogc3RyaW5nIHtcbiAgICBjb25zdCBwcm90b2NvbCA9IHRoaXMuc3NsU3VwcG9ydGVkID8gJ2h0dHBzJyA6ICdodHRwJztcbiAgICByZXR1cm4gYCR7cHJvdG9jb2x9Oi8vJHt0aGlzLmRvbWFpbn1gO1xuICB9XG5cbiAgLyoqXG4gICAqIOOCteOCpOODiOOBuOOBrkFNQ+ODquOCr+OCqOOCueODiOOCkuWun+ihjFxuICAgKiBAcGFyYW0gYm9kaWVzIC0g44Oq44Kv44Ko44K544OI44Oc44OH44Kj6YWN5YiXXG4gICAqIEByZXR1cm5zIEFNQ+ODrOOCueODneODs+OCuemFjeWIl1xuICAgKi9cbiAgYW1jUmVxdWVzdChib2RpZXM6IEFNQ1JlcXVlc3RCb2R5W10pOiBXaWtpZG90UmVzdWx0QXN5bmM8QU1DUmVzcG9uc2VbXT4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5hbWNDbGllbnQucmVxdWVzdChib2RpZXMsIHRoaXMudW5peE5hbWUsIHRoaXMuc3NsU3VwcG9ydGVkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDljZjkuIDjga5BTUPjg6rjgq/jgqjjgrnjg4jjgpLlrp/ooYxcbiAgICogQHBhcmFtIGJvZHkgLSDjg6rjgq/jgqjjgrnjg4jjg5zjg4fjgqNcbiAgICogQHJldHVybnMgQU1D44Os44K544Od44Oz44K5XG4gICAqL1xuICBhbWNSZXF1ZXN0U2luZ2xlKGJvZHk6IEFNQ1JlcXVlc3RCb2R5KTogV2lraWRvdFJlc3VsdEFzeW5jPEFNQ1Jlc3BvbnNlPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5hbWNSZXF1ZXN0KFtib2R5XSk7XG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXNwb25zZSA9IHJlc3VsdC52YWx1ZVswXTtcbiAgICAgICAgaWYgKCFyZXNwb25zZSkge1xuICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkRXJyb3IoJ0FNQyByZXF1ZXN0IHJldHVybmVkIGVtcHR5IHJlc3BvbnNlJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBVbmV4cGVjdGVkRXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEFNQyByZXF1ZXN0IGZhaWxlZDogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogVU5JWOWQjeOBi+OCieOCteOCpOODiOOCkuWPluW+l+OBmeOCi1xuICAgKiBAcGFyYW0gY2xpZW50IC0g44Kv44Op44Kk44Ki44Oz44OIXG4gICAqIEBwYXJhbSB1bml4TmFtZSAtIOOCteOCpOODiOOBrlVOSVjlkI3vvIjkvos6ICdzY3AtanAn77yJXG4gICAqIEByZXR1cm5zIOOCteOCpOODiFxuICAgKi9cbiAgc3RhdGljIGZyb21Vbml4TmFtZShjbGllbnQ6IENsaWVudCwgdW5peE5hbWU6IHN0cmluZyk6IFdpa2lkb3RSZXN1bHRBc3luYzxTaXRlPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgLy8g44K144Kk44OI44Oa44O844K444KS5Y+W5b6XXG4gICAgICAgIGNvbnN0IHVybCA9IGBodHRwczovLyR7dW5peE5hbWV9Lndpa2lkb3QuY29tYDtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIHtcbiAgICAgICAgICBoZWFkZXJzOiBjbGllbnQuYW1jQ2xpZW50LmhlYWRlci5nZXRIZWFkZXJzKCksXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09PSA0MDQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBOb3RGb3VuZEV4Y2VwdGlvbihgU2l0ZSBub3QgZm91bmQ6ICR7dW5peE5hbWV9YCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBmZXRjaCBzaXRlOiAke3Jlc3BvbnNlLnN0YXR1c31gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGh0bWwgPSBhd2FpdCByZXNwb25zZS50ZXh0KCk7XG4gICAgICAgIGNvbnN0ICQgPSBjaGVlcmlvLmxvYWQoaHRtbCk7XG5cbiAgICAgICAgLy8gV0lLSVJFUVVFU1QuaW5mbyDjgpLop6PmnpBcbiAgICAgICAgY29uc3Qgc2NyaXB0cyA9ICQoJ3NjcmlwdCcpLnRvQXJyYXkoKTtcbiAgICAgICAgbGV0IHNpdGVJZDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gICAgICAgIGxldCBzaXRlVW5peE5hbWU6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAgICAgICBsZXQgZG9tYWluOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgICAgICAgbGV0IHRpdGxlOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICAgICAgICBmb3IgKGNvbnN0IHNjcmlwdCBvZiBzY3JpcHRzKSB7XG4gICAgICAgICAgY29uc3QgY29udGVudCA9ICQoc2NyaXB0KS5odG1sKCk7XG4gICAgICAgICAgaWYgKCFjb250ZW50IHx8ICFjb250ZW50LmluY2x1ZGVzKCdXSUtJUkVRVUVTVCcpKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBzaXRlSWRcbiAgICAgICAgICBjb25zdCBzaXRlSWRNYXRjaCA9IGNvbnRlbnQubWF0Y2goL1dJS0lSRVFVRVNUXFwuaW5mb1xcLnNpdGVJZFxccyo9XFxzKihcXGQrKS8pO1xuICAgICAgICAgIGlmIChzaXRlSWRNYXRjaD8uWzFdKSB7XG4gICAgICAgICAgICBzaXRlSWQgPSBOdW1iZXIucGFyc2VJbnQoc2l0ZUlkTWF0Y2hbMV0sIDEwKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBzaXRlVW5peE5hbWVcbiAgICAgICAgICBjb25zdCBzaXRlVW5peE5hbWVNYXRjaCA9IGNvbnRlbnQubWF0Y2goXG4gICAgICAgICAgICAvV0lLSVJFUVVFU1RcXC5pbmZvXFwuc2l0ZVVuaXhOYW1lXFxzKj1cXHMqW1wiJ10oW15cIiddKylbXCInXS9cbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChzaXRlVW5peE5hbWVNYXRjaD8uWzFdKSB7XG4gICAgICAgICAgICBzaXRlVW5peE5hbWUgPSBzaXRlVW5peE5hbWVNYXRjaFsxXTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBkb21haW5cbiAgICAgICAgICBjb25zdCBkb21haW5NYXRjaCA9IGNvbnRlbnQubWF0Y2goL1dJS0lSRVFVRVNUXFwuaW5mb1xcLmRvbWFpblxccyo9XFxzKltcIiddKFteXCInXSspW1wiJ10vKTtcbiAgICAgICAgICBpZiAoZG9tYWluTWF0Y2g/LlsxXSkge1xuICAgICAgICAgICAgZG9tYWluID0gZG9tYWluTWF0Y2hbMV07XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gdGl0bGUgZnJvbSA8dGl0bGU+IHRhZ1xuICAgICAgICB0aXRsZSA9ICQoJ3RpdGxlJykudGV4dCgpLnRyaW0oKSB8fCBudWxsO1xuICAgICAgICAvLyBSZW1vdmUgXCIgLSBXaWtpZG90XCIgc3VmZml4IGlmIHByZXNlbnRcbiAgICAgICAgaWYgKHRpdGxlPy5lbmRzV2l0aCgnIC0gV2lraWRvdCcpKSB7XG4gICAgICAgICAgdGl0bGUgPSB0aXRsZS5zbGljZSgwLCAtMTApLnRyaW0oKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzaXRlSWQgPT09IG51bGwpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgTm9FbGVtZW50RXJyb3IoJ1NpdGUgSUQgbm90IGZvdW5kIGluIFdJS0lSRVFVRVNUJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNpdGVVbml4TmFtZSA9PT0gbnVsbCkge1xuICAgICAgICAgIHNpdGVVbml4TmFtZSA9IHVuaXhOYW1lOyAvLyBGYWxsYmFja1xuICAgICAgICB9XG4gICAgICAgIGlmIChkb21haW4gPT09IG51bGwpIHtcbiAgICAgICAgICBkb21haW4gPSBgJHt1bml4TmFtZX0ud2lraWRvdC5jb21gOyAvLyBGYWxsYmFja1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aXRsZSA9PT0gbnVsbCkge1xuICAgICAgICAgIHRpdGxlID0gdW5peE5hbWU7IC8vIEZhbGxiYWNrXG4gICAgICAgIH1cblxuICAgICAgICAvLyBTU0zlr77lv5zjg4Hjgqfjg4Pjgq/vvIjml6LjgatodHRwc+OBp+OCouOCr+OCu+OCueOBp+OBjeOBpuOBhOOCi+OBruOBpyB0cnVl77yJXG4gICAgICAgIGNvbnN0IHNzbFN1cHBvcnRlZCA9IHRydWU7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBTaXRlKGNsaWVudCwge1xuICAgICAgICAgIGlkOiBzaXRlSWQsXG4gICAgICAgICAgdGl0bGUsXG4gICAgICAgICAgdW5peE5hbWU6IHNpdGVVbml4TmFtZSxcbiAgICAgICAgICBkb21haW4sXG4gICAgICAgICAgc3NsU3VwcG9ydGVkLFxuICAgICAgICB9KTtcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgTm90Rm91bmRFeGNlcHRpb24gfHwgZXJyb3IgaW5zdGFuY2VvZiBOb0VsZW1lbnRFcnJvcikge1xuICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGdldCBzaXRlOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBTaXRlKGlkPSR7dGhpcy5pZH0sIHVuaXhOYW1lPSR7dGhpcy51bml4TmFtZX0sIHRpdGxlPSR7dGhpcy50aXRsZX0pYDtcbiAgfVxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IFdpa2lkb3RSZXN1bHRBc3luYyB9IGZyb20gJy4uLy4uLy4uL2NvbW1vbi90eXBlcyc7XG5pbXBvcnQgeyBTaXRlIH0gZnJvbSAnLi4vLi4vc2l0ZSc7XG5pbXBvcnQgdHlwZSB7IENsaWVudCB9IGZyb20gJy4uL2NsaWVudCc7XG5cbi8qKlxuICog44K144Kk44OI5pON5L2c44Ki44Kv44K744K1XG4gKi9cbmV4cG9ydCBjbGFzcyBTaXRlQWNjZXNzb3Ige1xuICBwdWJsaWMgcmVhZG9ubHkgY2xpZW50OiBDbGllbnQ7XG5cbiAgY29uc3RydWN0b3IoY2xpZW50OiBDbGllbnQpIHtcbiAgICB0aGlzLmNsaWVudCA9IGNsaWVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBVTklY5ZCN44GL44KJ44K144Kk44OI44KS5Y+W5b6X44GZ44KLXG4gICAqIEBwYXJhbSB1bml4TmFtZSAtIOOCteOCpOODiOOBrlVOSVjlkI3vvIjkvos6ICdzY3AtanAn77yJXG4gICAqIEByZXR1cm5zIOOCteOCpOODiOOCquODluOCuOOCp+OCr+ODiFxuICAgKi9cbiAgZ2V0KHVuaXhOYW1lOiBzdHJpbmcpOiBXaWtpZG90UmVzdWx0QXN5bmM8U2l0ZT4ge1xuICAgIHJldHVybiBTaXRlLmZyb21Vbml4TmFtZSh0aGlzLmNsaWVudCwgdW5peE5hbWUpO1xuICB9XG59XG5cbmV4cG9ydCB7IFNpdGUgfTtcbiIsCiAgICAiaW1wb3J0IHsgTm90Rm91bmRFeGNlcHRpb24gfSBmcm9tICcuLi8uLi8uLi9jb21tb24vZXJyb3JzJztcbmltcG9ydCB7IHR5cGUgV2lraWRvdFJlc3VsdEFzeW5jLCB3ZEVyckFzeW5jLCB3ZE9rQXN5bmMgfSBmcm9tICcuLi8uLi8uLi9jb21tb24vdHlwZXMnO1xuaW1wb3J0IHsgVXNlciwgdHlwZSBVc2VyQ29sbGVjdGlvbiB9IGZyb20gJy4uLy4uL3VzZXInO1xuaW1wb3J0IHR5cGUgeyBDbGllbnQgfSBmcm9tICcuLi9jbGllbnQnO1xuXG4vKipcbiAqIOODpuODvOOCtuODvOWPluW+l+OCquODl+OCt+ODp+ODs1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEdldFVzZXJPcHRpb25zIHtcbiAgLyoqIOODpuODvOOCtuODvOOBjOimi+OBpOOBi+OCieOBquOBhOWgtOWQiOOBq+OCqOODqeODvOOCkueZuueUn+OBleOBm+OCi++8iOODh+ODleOCqeODq+ODiDogZmFsc2XvvIkgKi9cbiAgcmFpc2VXaGVuTm90Rm91bmQ/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIOODpuODvOOCtuODvOaTjeS9nOOCouOCr+OCu+OCtVxuICovXG5leHBvcnQgY2xhc3MgVXNlckFjY2Vzc29yIHtcbiAgcHVibGljIHJlYWRvbmx5IGNsaWVudDogQ2xpZW50O1xuXG4gIGNvbnN0cnVjdG9yKGNsaWVudDogQ2xpZW50KSB7XG4gICAgdGhpcy5jbGllbnQgPSBjbGllbnQ7XG4gIH1cblxuICAvKipcbiAgICog44Om44O844K244O85ZCN44GL44KJ44Om44O844K244O844KS5Y+W5b6X44GZ44KLXG4gICAqIEBwYXJhbSBuYW1lIC0g44Om44O844K244O85ZCNXG4gICAqIEBwYXJhbSBvcHRpb25zIC0g5Y+W5b6X44Kq44OX44K344On44OzXG4gICAqIEByZXR1cm5zIOODpuODvOOCtuODvO+8iOWtmOWcqOOBl+OBquOBhOWgtOWQiOOBr251bGzjgIFyYWlzZVdoZW5Ob3RGb3VuZOOBjHRydWXjga7loLTlkIjjga/jgqjjg6njg7zvvIlcbiAgICovXG4gIGdldChuYW1lOiBzdHJpbmcsIG9wdGlvbnM6IEdldFVzZXJPcHRpb25zID0ge30pOiBXaWtpZG90UmVzdWx0QXN5bmM8VXNlciB8IG51bGw+IHtcbiAgICBjb25zdCB7IHJhaXNlV2hlbk5vdEZvdW5kID0gZmFsc2UgfSA9IG9wdGlvbnM7XG5cbiAgICByZXR1cm4gVXNlci5mcm9tTmFtZSh0aGlzLmNsaWVudCwgbmFtZSkuYW5kVGhlbigodXNlcikgPT4ge1xuICAgICAgaWYgKHVzZXIgPT09IG51bGwgJiYgcmFpc2VXaGVuTm90Rm91bmQpIHtcbiAgICAgICAgcmV0dXJuIHdkRXJyQXN5bmMobmV3IE5vdEZvdW5kRXhjZXB0aW9uKGBVc2VyIG5vdCBmb3VuZDogJHtuYW1lfWApKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB3ZE9rQXN5bmModXNlcik7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICog6KSH5pWw44Om44O844K244O85ZCN44GL44KJ44Om44O844K244O844KS5Y+W5b6X44GZ44KLXG4gICAqIEBwYXJhbSBuYW1lcyAtIOODpuODvOOCtuODvOWQjemFjeWIl1xuICAgKiBAcGFyYW0gb3B0aW9ucyAtIOWPluW+l+OCquODl+OCt+ODp+ODs1xuICAgKiBAcmV0dXJucyDjg6bjg7zjgrbjg7zjgrPjg6zjgq/jgrfjg6fjg7PvvIjlrZjlnKjjgZfjgarjgYTjg6bjg7zjgrbjg7zjga9udWxs44CBcmFpc2VXaGVuTm90Rm91bmTjgYx0cnVl44Gu5aC05ZCI44Gv44Ko44Op44O877yJXG4gICAqL1xuICBnZXRNYW55KG5hbWVzOiBzdHJpbmdbXSwgb3B0aW9uczogR2V0VXNlck9wdGlvbnMgPSB7fSk6IFdpa2lkb3RSZXN1bHRBc3luYzxVc2VyQ29sbGVjdGlvbj4ge1xuICAgIGNvbnN0IHsgcmFpc2VXaGVuTm90Rm91bmQgPSBmYWxzZSB9ID0gb3B0aW9ucztcblxuICAgIHJldHVybiBVc2VyLmZyb21OYW1lcyh0aGlzLmNsaWVudCwgbmFtZXMpLmFuZFRoZW4oKGNvbGxlY3Rpb24pID0+IHtcbiAgICAgIGlmIChyYWlzZVdoZW5Ob3RGb3VuZCkge1xuICAgICAgICBjb25zdCBub3RGb3VuZE5hbWVzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgbmFtZSA9IG5hbWVzW2ldO1xuICAgICAgICAgIGlmIChjb2xsZWN0aW9uW2ldID09PSBudWxsICYmIG5hbWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbm90Rm91bmROYW1lcy5wdXNoKG5hbWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAobm90Rm91bmROYW1lcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgcmV0dXJuIHdkRXJyQXN5bmMobmV3IE5vdEZvdW5kRXhjZXB0aW9uKGBVc2VycyBub3QgZm91bmQ6ICR7bm90Rm91bmROYW1lcy5qb2luKCcsICcpfWApKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHdkT2tBc3luYyhjb2xsZWN0aW9uKTtcbiAgICB9KTtcbiAgfVxufVxuIiwKICAgICJpbXBvcnQgeyBMb2dpblJlcXVpcmVkRXJyb3IgfSBmcm9tICcuLi8uLi9jb21tb24vZXJyb3JzJztcbmltcG9ydCB7XG4gIGZyb21Qcm9taXNlLFxuICB0eXBlIFdpa2lkb3RSZXN1bHQsXG4gIHR5cGUgV2lraWRvdFJlc3VsdEFzeW5jLFxuICB3ZEVycixcbiAgd2RPayxcbiAgd2RPa0FzeW5jLFxufSBmcm9tICcuLi8uLi9jb21tb24vdHlwZXMnO1xuaW1wb3J0IHsgQU1DQ2xpZW50LCB0eXBlIEFNQ0NvbmZpZywgbG9naW4sIGxvZ291dCB9IGZyb20gJy4uLy4uL2Nvbm5lY3Rvcic7XG5pbXBvcnQgdHlwZSB7IFVzZXIgfSBmcm9tICcuLi91c2VyL3VzZXInO1xuaW1wb3J0IHsgUHJpdmF0ZU1lc3NhZ2VBY2Nlc3NvciB9IGZyb20gJy4vYWNjZXNzb3JzL3BtLWFjY2Vzc29yJztcbmltcG9ydCB7IFNpdGVBY2Nlc3NvciB9IGZyb20gJy4vYWNjZXNzb3JzL3NpdGUtYWNjZXNzb3InO1xuaW1wb3J0IHsgVXNlckFjY2Vzc29yIH0gZnJvbSAnLi9hY2Nlc3NvcnMvdXNlci1hY2Nlc3Nvcic7XG5cbi8qKlxuICog44Kv44Op44Kk44Ki44Oz44OI5L2c5oiQ44Kq44OX44K344On44OzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2xpZW50T3B0aW9ucyB7XG4gIC8qKiBXaWtpZG9044Om44O844K244O85ZCNICovXG4gIHVzZXJuYW1lPzogc3RyaW5nO1xuXG4gIC8qKiBXaWtpZG9044OR44K544Ov44O844OJICovXG4gIHBhc3N3b3JkPzogc3RyaW5nO1xuXG4gIC8qKiDjg5njg7zjgrnjg4njg6HjgqTjg7PvvIjjg4fjg5Xjgqnjg6vjg4g6IHdpa2lkb3QuY29t77yJICovXG4gIGRvbWFpbj86IHN0cmluZztcblxuICAvKiogQU1D6Kit5a6a44Kq44O844OQ44O844Op44Kk44OJICovXG4gIGFtY0NvbmZpZz86IFBhcnRpYWw8QU1DQ29uZmlnPjtcbn1cblxuLyoqXG4gKiBXaWtpZG9044Kv44Op44Kk44Ki44Oz44OIXG4gKiDjg6njgqTjg5bjg6njg6rjga7jg6HjgqTjg7Pjgqjjg7Pjg4jjg6rjg53jgqTjg7Pjg4hcbiAqL1xuZXhwb3J0IGNsYXNzIENsaWVudCB7XG4gIC8qKiBBTUPjgq/jg6njgqTjgqLjg7Pjg4ggKi9cbiAgcHVibGljIHJlYWRvbmx5IGFtY0NsaWVudDogQU1DQ2xpZW50O1xuXG4gIC8qKiDjg5njg7zjgrnjg4njg6HjgqTjg7MgKi9cbiAgcHVibGljIHJlYWRvbmx5IGRvbWFpbjogc3RyaW5nO1xuXG4gIC8qKiDjg6bjg7zjgrbjg7zmk43kvZzjgqLjgq/jgrvjgrUgKi9cbiAgcHVibGljIHJlYWRvbmx5IHVzZXI6IFVzZXJBY2Nlc3NvcjtcblxuICAvKiog44K144Kk44OI5pON5L2c44Ki44Kv44K744K1ICovXG4gIHB1YmxpYyByZWFkb25seSBzaXRlOiBTaXRlQWNjZXNzb3I7XG5cbiAgLyoqIOODl+ODqeOCpOODmeODvOODiOODoeODg+OCu+ODvOOCuOaTjeS9nOOCouOCr+OCu+OCtSAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcHJpdmF0ZU1lc3NhZ2U6IFByaXZhdGVNZXNzYWdlQWNjZXNzb3I7XG5cbiAgLyoqIOODreOCsOOCpOODs+S4reOBruODpuODvOOCtuODvOWQjSAqL1xuICBwcml2YXRlIF91c2VybmFtZTogc3RyaW5nIHwgbnVsbDtcblxuICAvKiog44Ot44Kw44Kk44Oz5Lit44Gu44Om44O844K244O8ICovXG4gIHByaXZhdGUgX21lOiBVc2VyIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqXG4gICAqIOODl+ODqeOCpOODmeODvOODiOOCs+ODs+OCueODiOODqeOCr+OCv1xuICAgKiBjcmVhdGXjg6Hjgr3jg4Pjg4njgpLkvb/nlKjjgZfjgabjgqTjg7Pjgrnjgr/jg7PjgrnjgpLkvZzmiJDjgZnjgotcbiAgICovXG4gIHByaXZhdGUgY29uc3RydWN0b3IoYW1jQ2xpZW50OiBBTUNDbGllbnQsIGRvbWFpbjogc3RyaW5nLCB1c2VybmFtZTogc3RyaW5nIHwgbnVsbCA9IG51bGwpIHtcbiAgICB0aGlzLmFtY0NsaWVudCA9IGFtY0NsaWVudDtcbiAgICB0aGlzLmRvbWFpbiA9IGRvbWFpbjtcbiAgICB0aGlzLl91c2VybmFtZSA9IHVzZXJuYW1lO1xuXG4gICAgLy8g44Ki44Kv44K744K144KS5Yid5pyf5YyWXG4gICAgdGhpcy51c2VyID0gbmV3IFVzZXJBY2Nlc3Nvcih0aGlzKTtcbiAgICB0aGlzLnNpdGUgPSBuZXcgU2l0ZUFjY2Vzc29yKHRoaXMpO1xuICAgIHRoaXMucHJpdmF0ZU1lc3NhZ2UgPSBuZXcgUHJpdmF0ZU1lc3NhZ2VBY2Nlc3Nvcih0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDjg63jgrDjgqTjg7PkuK3jga7jg6bjg7zjgrbjg7zlkI3jgpLlj5blvpdcbiAgICovXG4gIGdldCB1c2VybmFtZSgpOiBzdHJpbmcgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fdXNlcm5hbWU7XG4gIH1cblxuICAvKipcbiAgICog44Ot44Kw44Kk44Oz5Lit44Gu44Om44O844K244O844KS5Y+W5b6XXG4gICAqIOODreOCsOOCpOODs+OBl+OBpuOBhOOBquOBhOWgtOWQiOOBr251bGxcbiAgICovXG4gIGdldCBtZSgpOiBVc2VyIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX21lO1xuICB9XG5cbiAgLyoqXG4gICAqIOOCr+ODqeOCpOOCouODs+ODiOOCkuS9nOaIkOOBmeOCi1xuICAgKiBAcGFyYW0gb3B0aW9ucyAtIOOCr+ODqeOCpOOCouODs+ODiOOCquODl+OCt+ODp+ODs1xuICAgKiBAcmV0dXJucyDjgq/jg6njgqTjgqLjg7Pjg4jjgqTjg7Pjgrnjgr/jg7PjgrlcbiAgICovXG4gIHN0YXRpYyBjcmVhdGUob3B0aW9uczogQ2xpZW50T3B0aW9ucyA9IHt9KTogV2lraWRvdFJlc3VsdEFzeW5jPENsaWVudD4ge1xuICAgIGNvbnN0IHsgdXNlcm5hbWUsIHBhc3N3b3JkLCBkb21haW4gPSAnd2lraWRvdC5jb20nLCBhbWNDb25maWcgPSB7fSB9ID0gb3B0aW9ucztcblxuICAgIC8vIEFNQ+OCr+ODqeOCpOOCouODs+ODiOOCkuS9nOaIkFxuICAgIGNvbnN0IGFtY0NsaWVudCA9IG5ldyBBTUNDbGllbnQoYW1jQ29uZmlnLCBkb21haW4pO1xuXG4gICAgLy8g6KqN6Ki85oOF5aCx44GM44GC44KL5aC05ZCI44Gv44Ot44Kw44Kk44OzXG4gICAgaWYgKHVzZXJuYW1lICYmIHBhc3N3b3JkKSB7XG4gICAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgY2xpZW50ID0gbmV3IENsaWVudChhbWNDbGllbnQsIGRvbWFpbiwgdXNlcm5hbWUpO1xuICAgICAgICAgIGNvbnN0IGxvZ2luUmVzdWx0ID0gYXdhaXQgbG9naW4oY2xpZW50LCB1c2VybmFtZSwgcGFzc3dvcmQpO1xuICAgICAgICAgIGlmIChsb2dpblJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgICB0aHJvdyBsb2dpblJlc3VsdC5lcnJvcjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyDjg63jgrDjgqTjg7PkuK3jga7jg6bjg7zjgrbjg7zmg4XloLHjgpLlj5blvpdcbiAgICAgICAgICBjb25zdCB7IFVzZXIgfSA9IGF3YWl0IGltcG9ydCgnLi4vdXNlci91c2VyJyk7XG4gICAgICAgICAgY29uc3QgdXNlclJlc3VsdCA9IGF3YWl0IFVzZXIuZnJvbU5hbWUoY2xpZW50LCB1c2VybmFtZSk7XG4gICAgICAgICAgaWYgKHVzZXJSZXN1bHQuaXNPaygpICYmIHVzZXJSZXN1bHQudmFsdWUpIHtcbiAgICAgICAgICAgIGNsaWVudC5fbWUgPSB1c2VyUmVzdWx0LnZhbHVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBjbGllbnQ7XG4gICAgICAgIH0pKCksXG4gICAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIExvZ2luUmVxdWlyZWRFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbmV3IExvZ2luUmVxdWlyZWRFcnJvcihgRmFpbGVkIHRvIGNyZWF0ZSBjbGllbnQ6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyDoqo3oqLzjgarjgZfjga7jgq/jg6njgqTjgqLjg7Pjg4jjgpLov5TjgZlcbiAgICByZXR1cm4gd2RPa0FzeW5jKG5ldyBDbGllbnQoYW1jQ2xpZW50LCBkb21haW4pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmnKroqo3oqLzjgq/jg6njgqTjgqLjg7Pjg4jjgpLkvZzmiJDjgZnjgotcbiAgICogQHBhcmFtIG9wdGlvbnMgLSDjgq/jg6njgqTjgqLjg7Pjg4jjgqrjg5fjgrfjg6fjg7PvvIjoqo3oqLzmg4XloLHku6XlpJbvvIlcbiAgICogQHJldHVybnMg44Kv44Op44Kk44Ki44Oz44OI44Kk44Oz44K544K/44Oz44K5XG4gICAqL1xuICBzdGF0aWMgY3JlYXRlQW5vbnltb3VzKG9wdGlvbnM6IE9taXQ8Q2xpZW50T3B0aW9ucywgJ3VzZXJuYW1lJyB8ICdwYXNzd29yZCc+ID0ge30pOiBDbGllbnQge1xuICAgIGNvbnN0IHsgZG9tYWluID0gJ3dpa2lkb3QuY29tJywgYW1jQ29uZmlnID0ge30gfSA9IG9wdGlvbnM7XG4gICAgY29uc3QgYW1jQ2xpZW50ID0gbmV3IEFNQ0NsaWVudChhbWNDb25maWcsIGRvbWFpbik7XG4gICAgcmV0dXJuIG5ldyBDbGllbnQoYW1jQ2xpZW50LCBkb21haW4pO1xuICB9XG5cbiAgLyoqXG4gICAqIOODreOCsOOCpOODs+eKtuaFi+OCkueiuuiqjeOBmeOCi1xuICAgKiBAcmV0dXJucyDjg63jgrDjgqTjg7PmuIjjgb/jgarjgol0cnVlXG4gICAqL1xuICBpc0xvZ2dlZEluKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl91c2VybmFtZSAhPT0gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiDjg63jgrDjgqTjg7PjgpLopoHmsYLjgZnjgotcbiAgICog44Ot44Kw44Kk44Oz5riI44G/44Gn44Gq44GE5aC05ZCI44GvTG9naW5SZXF1aXJlZEVycm9y44KS6L+U44GZXG4gICAqIEByZXR1cm5zIOaIkOWKn+aZguOBr3ZvaWRcbiAgICovXG4gIHJlcXVpcmVMb2dpbigpOiBXaWtpZG90UmVzdWx0PHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMuaXNMb2dnZWRJbigpKSB7XG4gICAgICByZXR1cm4gd2RFcnIobmV3IExvZ2luUmVxdWlyZWRFcnJvcigpKTtcbiAgICB9XG4gICAgcmV0dXJuIHdkT2sodW5kZWZpbmVkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDjgq/jg6njgqTjgqLjg7Pjg4jjgpLjgq/jg63jg7zjgrrjgZnjgotcbiAgICog44K744OD44K344On44Oz44GM44GC44KL5aC05ZCI44Gv44Ot44Kw44Ki44Km44OI44KS6Kmm44G/44KLXG4gICAqL1xuICBjbG9zZSgpOiBXaWtpZG90UmVzdWx0QXN5bmM8dm9pZD4ge1xuICAgIGlmICh0aGlzLmlzTG9nZ2VkSW4oKSkge1xuICAgICAgcmV0dXJuIGxvZ291dCh0aGlzKS5tYXAoKCkgPT4ge1xuICAgICAgICB0aGlzLl91c2VybmFtZSA9IG51bGw7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9KTtcbiAgICB9XG4g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UyxJQUFJLE9BQU8sV0FBVyxRQUFRLFFBQVE7QUFBQSxRQUNyRCxNQUFNLGNBQWMsTUFBTSxNQUFNLFFBQVEsVUFBVSxRQUFRO0FBQUEsUUFDMUQsSUFBSSxZQUFZLE1BQU0sR0FBRztBQUFBLFVBQ3ZCLE1BQU0sWUFBWTtBQUFBLFFBQ3BCO0FBQUEsUUFHQSxRQUFRLGdCQUFTLE1BQWE7QUFBQSxRQUM5QixNQUFNLGFBQWEsTUFBTSxNQUFLLFNBQVMsUUFBUSxRQUFRO0FBQUEsUUFDdkQsSUFBSSxXQUFXLEtBQUssS0FBSyxXQUFXLE9BQU87QUFBQSxVQUN6QyxPQUFPLE1BQU0sV0FBVztBQUFBLFFBQzFCO0FBQUEsUUFFQSxPQUFPO0FBQUEsU0FDTixHQUNILENBQUMsVUFBVTtBQUFBLFFBQ1QsSUFBSSxpQkFBaUIsb0JBQW9CO0FBQUEsVUFDdkMsT0FBTztBQUFBLFFBQ1Q7QUFBQSxRQUNBLE9BQU8sSUFBSSxtQkFBbUIsNEJBQTRCLE9BQU8sS0FBSyxHQUFHO0FBQUEsT0FFN0U7QUFBQSxJQUNGO0FBQUEsSUFHQSxPQUFPLFVBQVUsSUFBSSxPQUFPLFdBQVcsTUFBTSxDQUFDO0FBQUE7QUFBQSxTQVF6QyxlQUFlLENBQUMsVUFBd0QsQ0FBQyxHQUFXO0FBQUEsSUFDekYsUUFBUSxTQUFTLGVBQWUsWUFBWSxDQUFDLE1BQU07QUFBQSxJQUNuRCxNQUFNLFlBQVksSUFBSSxVQUFVLFdBQVcsTUFBTTtBQUFBLElBQ2pELE9BQU8sSUFBSSxPQUFPLFdBQVcsTUFBTTtBQUFBO0FBQUEsRUFPckMsVUFBVSxHQUFZO0FBQUEsSUFDcEIsT0FBTyxLQUFLLGNBQWM7QUFBQTtBQUFBLEVBUTVCLFlBQVksR0FBd0I7QUFBQSxJQUNsQyxJQUFJLENBQUMsS0FBSyxXQUFXLEdBQUc7QUFBQSxNQUN0QixPQUFPLE1BQU0sSUFBSSxrQkFBb0I7QUFBQSxJQUN2QztBQUFBLElBQ0EsT0FBTyxLQUFLLFNBQVM7QUFBQTtBQUFBLEVBT3ZCLEtBQUssR0FBNkI7QUFBQSxJQUNoQyxJQUFJLEtBQUssV0FBVyxHQUFHO0FBQUEsTUFDckIsT0FBTyxPQUFPLElBQUksRUFBRSxJQUFJLE1BQU07QUFBQSxRQUM1QixLQUFLLFlBQVk7QUFBQSxRQUNqQjtBQUFBLE9BQ0Q7QUFBQSxJQUNIO0FBQUEsSUFDQSxPQUFPLFVBQVUsU0FBUztBQUFBO0FBRTlCOyIsCiAgImRlYnVnSWQiOiAiMUEwQUYzQUE0RDVDQUI0RDY0NzU2RTIxNjQ3NTZFMjEiLAogICJuYW1lcyI6IFtdCn0=
4581
+ //# debugId=8EA1529F92760B0C64756E2164756E21
4582
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL2NvbW1vbi9lcnJvcnMvYmFzZS50cyIsICJzcmMvY29tbW9uL2Vycm9ycy9hbWMudHMiLCAic3JjL2NvbW1vbi9lcnJvcnMvc2Vzc2lvbi50cyIsICJzcmMvY29tbW9uL2Vycm9ycy90YXJnZXQudHMiLCAic3JjL2NvbW1vbi9lcnJvcnMvaW5kZXgudHMiLCAic3JjL2NvbW1vbi9sb2dnZXIudHMiLCAic3JjL2NvbW1vbi90eXBlcy9yZXN1bHQudHMiLCAic3JjL2NvbW1vbi90eXBlcy9pbmRleC50cyIsICJzcmMvY29ubmVjdG9yL2FtYy1jb25maWcudHMiLCAic3JjL21vZHVsZS91c2VyL2Fub255bW91cy11c2VyLnRzIiwgInNyYy9tb2R1bGUvdXNlci9kZWxldGVkLXVzZXIudHMiLCAic3JjL21vZHVsZS91c2VyL2d1ZXN0LXVzZXIudHMiLCAic3JjL3V0aWwvdGFibGUvY2hhci10YWJsZS50cyIsICJzcmMvdXRpbC9zdHJpbmctdXRpbC50cyIsICJzcmMvbW9kdWxlL3VzZXIvdXNlci1jb2xsZWN0aW9uLnRzIiwgInNyYy9tb2R1bGUvdXNlci91c2VyLnRzIiwgInNyYy9tb2R1bGUvdXNlci93aWtpZG90LXVzZXIudHMiLCAic3JjL21vZHVsZS91c2VyL2luZGV4LnRzIiwgInNyYy91dGlsL3BhcnNlci91c2VyLnRzIiwgInNyYy91dGlsL3BhcnNlci9pbmRleC50cyIsICJzcmMvY29tbW9uL2RlY29yYXRvcnMudHMiLCAic3JjL21vZHVsZS9mb3J1bS9mb3J1bS1wb3N0LnRzIiwgInNyYy9tb2R1bGUvZm9ydW0vZm9ydW0tdGhyZWFkLnRzIiwgInNyYy9tb2R1bGUvZm9ydW0vZm9ydW0tY2F0ZWdvcnkudHMiLCAic3JjL21vZHVsZS9mb3J1bS9pbmRleC50cyIsICJzcmMvaW5kZXgudHMiLCAic3JjL2Nvbm5lY3Rvci9hbWMtY2xpZW50LnRzIiwgInNyYy9jb25uZWN0b3IvYW1jLWhlYWRlci50cyIsICJzcmMvY29ubmVjdG9yL2FtYy10eXBlcy50cyIsICJzcmMvY29ubmVjdG9yL2luZGV4LnRzIiwgInNyYy9jb25uZWN0b3IvYXV0aC50cyIsICJzcmMvbW9kdWxlL3ByaXZhdGUtbWVzc2FnZS9wcml2YXRlLW1lc3NhZ2UudHMiLCAic3JjL21vZHVsZS9jbGllbnQvYWNjZXNzb3JzL3BtLWFjY2Vzc29yLnRzIiwgInNyYy9tb2R1bGUvc2l0ZS9hY2Nlc3NvcnMvZm9ydW0tYWNjZXNzb3IudHMiLCAic3JjL21vZHVsZS9zaXRlL2FjY2Vzc29ycy9tZW1iZXItYWNjZXNzb3IudHMiLCAic3JjL3V0aWwvcXVpY2stbW9kdWxlLnRzIiwgInNyYy9tb2R1bGUvc2l0ZS9zaXRlLWFwcGxpY2F0aW9uLnRzIiwgInNyYy9tb2R1bGUvc2l0ZS9zaXRlLW1lbWJlci50cyIsICJzcmMvbW9kdWxlL3NpdGUvYWNjZXNzb3JzL3BhZ2UtYWNjZXNzb3IudHMiLCAic3JjL21vZHVsZS9wYWdlL3BhZ2UudHMiLCAic3JjL21vZHVsZS9wYWdlL3BhZ2UtZmlsZS50cyIsICJzcmMvbW9kdWxlL3BhZ2UvcGFnZS1tZXRhLnRzIiwgInNyYy9tb2R1bGUvcGFnZS9wYWdlLXJldmlzaW9uLnRzIiwgInNyYy9tb2R1bGUvcGFnZS9wYWdlLXNvdXJjZS50cyIsICJzcmMvbW9kdWxlL3BhZ2UvcGFnZS12b3RlLnRzIiwgInNyYy9tb2R1bGUvcGFnZS9zZWFyY2gtcXVlcnkudHMiLCAic3JjL21vZHVsZS9wYWdlL3NpdGUtY2hhbmdlLnRzIiwgInNyYy9tb2R1bGUvc2l0ZS9hY2Nlc3NvcnMvcGFnZXMtYWNjZXNzb3IudHMiLCAic3JjL21vZHVsZS9zaXRlL3NpdGUudHMiLCAic3JjL21vZHVsZS9jbGllbnQvYWNjZXNzb3JzL3NpdGUtYWNjZXNzb3IudHMiLCAic3JjL21vZHVsZS9jbGllbnQvYWNjZXNzb3JzL3VzZXItYWNjZXNzb3IudHMiLCAic3JjL21vZHVsZS9jbGllbnQvY2xpZW50LnRzIiwgInNyYy9tb2R1bGUvaW5kZXgudHMiLCAic3JjL3V0aWwvaW5kZXgudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbCiAgICAiLyoqXG4gKiBXaWtpZG9044Op44Kk44OW44Op44Oq44Gu5Z+65bqV44Ko44Op44O844Kv44Op44K5XG4gKiDlhajjgabjga7jgqvjgrnjgr/jg6Djgqjjg6njg7zjga/jgZPjga7jgq/jg6njgrnjgpLntpnmib/jgZnjgotcbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFdpa2lkb3RFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgLyoqIOOCqOODqeODvOWQjSAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAcGFyYW0gbWVzc2FnZSAtIOOCqOODqeODvOODoeODg+OCu+ODvOOCuFxuICAgKi9cbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nKSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gICAgdGhpcy5uYW1lID0gdGhpcy5jb25zdHJ1Y3Rvci5uYW1lO1xuICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBuZXcudGFyZ2V0LnByb3RvdHlwZSk7XG4gIH1cbn1cblxuLyoqXG4gKiDkuojmnJ/jgZvjgazjgqjjg6njg7xcbiAqIOWGhemDqOeahOOBquS4jeaVtOWQiOOChOODkOOCsOOCkuihqOOBmVxuICovXG5leHBvcnQgY2xhc3MgVW5leHBlY3RlZEVycm9yIGV4dGVuZHMgV2lraWRvdEVycm9yIHt9XG4iLAogICAgImltcG9ydCB7IFdpa2lkb3RFcnJvciB9IGZyb20gJy4vYmFzZSc7XG5cbi8qKlxuICogQWpheCBNb2R1bGUgQ29ubmVjdG9y6Zai6YCj44Gu5Z+65bqV44Ko44Op44O8XG4gKi9cbmV4cG9ydCBjbGFzcyBBTUNFcnJvciBleHRlbmRzIFdpa2lkb3RFcnJvciB7fVxuXG4vKipcbiAqIEhUVFDjgrnjg4bjg7zjgr/jgrnjgrPjg7zjg4njgqjjg6njg7xcbiAqIEFNQ+OBuOOBruODquOCr+OCqOOCueODiOOBjEhUVFDjgqjjg6njg7zjgaflpLHmlZfjgZfjgZ/loLTlkIhcbiAqL1xuZXhwb3J0IGNsYXNzIEFNQ0h0dHBFcnJvciBleHRlbmRzIEFNQ0Vycm9yIHtcbiAgLyoqIEhUVFDjgrnjg4bjg7zjgr/jgrnjgrPjg7zjg4kgKi9cbiAgcHVibGljIHJlYWRvbmx5IHN0YXR1c0NvZGU6IG51bWJlcjtcblxuICAvKipcbiAgICogQHBhcmFtIG1lc3NhZ2UgLSDjgqjjg6njg7zjg6Hjg4Pjgrvjg7zjgrhcbiAgICogQHBhcmFtIHN0YXR1c0NvZGUgLSBIVFRQ44K544OG44O844K/44K544Kz44O844OJXG4gICAqL1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcsIHN0YXR1c0NvZGU6IG51bWJlcikge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgIHRoaXMuc3RhdHVzQ29kZSA9IHN0YXR1c0NvZGU7XG4gIH1cbn1cblxuLyoqXG4gKiBXaWtpZG9044K544OG44O844K/44K544Kz44O844OJ44Ko44Op44O8XG4gKiBBTUPjg6zjgrnjg53jg7Pjgrnjga5zdGF0dXPjgYxva+OBp+OBquOBhOWgtOWQiFxuICovXG5leHBvcnQgY2xhc3MgV2lraWRvdFN0YXR1c0Vycm9yIGV4dGVuZHMgQU1DRXJyb3Ige1xuICAvKiogV2lraWRvdOOCueODhuODvOOCv+OCueOCs+ODvOODieaWh+Wtl+WIlyAqL1xuICBwdWJsaWMgcmVhZG9ubHkgc3RhdHVzQ29kZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAcGFyYW0gbWVzc2FnZSAtIOOCqOODqeODvOODoeODg+OCu+ODvOOCuFxuICAgKiBAcGFyYW0gc3RhdHVzQ29kZSAtIOOCueODhuODvOOCv+OCueOCs+ODvOODie+8iOS+izogJ25vdF9vaycsICd0cnlfYWdhaW4n77yJXG4gICAqL1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcsIHN0YXR1c0NvZGU6IHN0cmluZykge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgIHRoaXMuc3RhdHVzQ29kZSA9IHN0YXR1c0NvZGU7XG4gIH1cbn1cblxuLyoqXG4gKiDjg6zjgrnjg53jg7Pjgrnjg4fjg7zjgr/jgqjjg6njg7xcbiAqIOODrOOCueODneODs+OCueOBruODkeODvOOCueOBq+WkseaVl+OBl+OBn+WgtOWQiFxuICovXG5leHBvcnQgY2xhc3MgUmVzcG9uc2VEYXRhRXJyb3IgZXh0ZW5kcyBBTUNFcnJvciB7fVxuIiwKICAgICJpbXBvcnQgeyBXaWtpZG90RXJyb3IgfSBmcm9tICcuL2Jhc2UnO1xuXG4vKipcbiAqIOOCu+ODg+OCt+ODp+ODs+mWoumAo+OBruWfuuW6leOCqOODqeODvFxuICovXG5leHBvcnQgY2xhc3MgU2Vzc2lvbkVycm9yIGV4dGVuZHMgV2lraWRvdEVycm9yIHt9XG5cbi8qKlxuICog44K744OD44K344On44Oz5L2c5oiQ5aSx5pWX44Ko44Op44O8XG4gKiDjg63jgrDjgqTjg7PoqabooYzjgYzlpLHmlZfjgZfjgZ/loLTlkIjjgavjgrnjg63jg7xcbiAqL1xuZXhwb3J0IGNsYXNzIFNlc3Npb25DcmVhdGVFcnJvciBleHRlbmRzIFNlc3Npb25FcnJvciB7fVxuXG4vKipcbiAqIOODreOCsOOCpOODs+W/hemgiOOCqOODqeODvFxuICog6KqN6Ki844GM5b+F6KaB44Gq5pON5L2c44KS5pyq44Ot44Kw44Kk44Oz54q25oWL44Gn5a6f6KGM44GX44Gf5aC05ZCI44Gr44K544Ot44O8XG4gKi9cbmV4cG9ydCBjbGFzcyBMb2dpblJlcXVpcmVkRXJyb3IgZXh0ZW5kcyBTZXNzaW9uRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlID0gJ0xvZ2luIGlzIHJlcXVpcmVkIGZvciB0aGlzIG9wZXJhdGlvbicpIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgfVxufVxuIiwKICAgICJpbXBvcnQgeyBXaWtpZG90RXJyb3IgfSBmcm9tICcuL2Jhc2UnO1xuXG4vKipcbiAqIOODquOCveODvOOCueacqueZuuimi+OCqOODqeODvFxuICog6KaB5rGC44GV44KM44Gf44Oq44K944O844K544GM5a2Y5Zyo44GX44Gq44GE5aC05ZCIXG4gKi9cbmV4cG9ydCBjbGFzcyBOb3RGb3VuZEV4Y2VwdGlvbiBleHRlbmRzIFdpa2lkb3RFcnJvciB7fVxuXG4vKipcbiAqIOODquOCveODvOOCueaXouWtmOOCqOODqeODvFxuICog5L2c5oiQ44GX44KI44GG44Go44GX44Gf44Oq44K944O844K544GM5pei44Gr5a2Y5Zyo44GZ44KL5aC05ZCIXG4gKi9cbmV4cG9ydCBjbGFzcyBUYXJnZXRFeGlzdHNFcnJvciBleHRlbmRzIFdpa2lkb3RFcnJvciB7fVxuXG4vKipcbiAqIOOCv+ODvOOCsuODg+ODiOeKtuaFi+OCqOODqeODvFxuICog44Oq44K944O844K544GM5pON5L2c5LiN5Y+v6IO944Gq54q25oWL44Gu5aC05ZCI77yI44Ot44OD44Kv5Lit44Gq44Gp77yJXG4gKi9cbmV4cG9ydCBjbGFzcyBUYXJnZXRFcnJvciBleHRlbmRzIFdpa2lkb3RFcnJvciB7fVxuXG4vKipcbiAqIOOCouOCr+OCu+OCueaLkuWQpuOCqOODqeODvFxuICog5qip6ZmQ5LiN6Laz44Gn5pON5L2c44GM5ouS5ZCm44GV44KM44Gf5aC05ZCIXG4gKi9cbmV4cG9ydCBjbGFzcyBGb3JiaWRkZW5FcnJvciBleHRlbmRzIFdpa2lkb3RFcnJvciB7fVxuXG4vKipcbiAqIEhUTUzopoHntKDmnKrnmbropovjgqjjg6njg7xcbiAqIOODkeODvOOCueS4reOBq+W/heimgeOBquimgee0oOOBjOimi+OBpOOBi+OCieOBquOBhOWgtOWQiFxuICovXG5leHBvcnQgY2xhc3MgTm9FbGVtZW50RXJyb3IgZXh0ZW5kcyBXaWtpZG90RXJyb3Ige31cbiIsCiAgICAiLy8gQmFzZSBlcnJvcnNcblxuLy8gQU1DIGVycm9yc1xuZXhwb3J0IHsgQU1DRXJyb3IsIEFNQ0h0dHBFcnJvciwgUmVzcG9uc2VEYXRhRXJyb3IsIFdpa2lkb3RTdGF0dXNFcnJvciB9IGZyb20gJy4vYW1jJztcbmV4cG9ydCB7IFVuZXhwZWN0ZWRFcnJvciwgV2lraWRvdEVycm9yIH0gZnJvbSAnLi9iYXNlJztcbi8vIFNlc3Npb24gZXJyb3JzXG5leHBvcnQgeyBMb2dpblJlcXVpcmVkRXJyb3IsIFNlc3Npb25DcmVhdGVFcnJvciwgU2Vzc2lvbkVycm9yIH0gZnJvbSAnLi9zZXNzaW9uJztcblxuLy8gVGFyZ2V0IGVycm9yc1xuZXhwb3J0IHtcbiAgRm9yYmlkZGVuRXJyb3IsXG4gIE5vRWxlbWVudEVycm9yLFxuICBOb3RGb3VuZEV4Y2VwdGlvbixcbiAgVGFyZ2V0RXJyb3IsXG4gIFRhcmdldEV4aXN0c0Vycm9yLFxufSBmcm9tICcuL3RhcmdldCc7XG4iLAogICAgIi8qKlxuICog44Ot44Ku44Oz44Kw5qmf6IO944KS5o+Q5L6b44GZ44KL44Oi44K444Ol44O844OrXG4gKlxuICog44GT44Gu44Oi44K444Ol44O844Or44Gv44CB44Op44Kk44OW44Op44Oq5YWo5L2T44Gn5L2/55So44GV44KM44KL44Ot44Ks44O844KS6Kit5a6a44GX44CB5o+Q5L6b44GZ44KL44CCXG4gKiDjg4fjg5Xjgqnjg6vjg4jjgafjga/lh7rlipvjgpLooYzjgo/jgZrjgIHjgqLjg5fjg6rjgrHjg7zjgrfjg6fjg7PlgbTjgafjga7jg63jgrDliLblvqHjgpLlj6/og73jgavjgZnjgovjgIJcbiAqL1xuXG4vKipcbiAqIOODreOCsOODrOODmeODq1xuICovXG5leHBvcnQgdHlwZSBMb2dMZXZlbCA9ICdkZWJ1ZycgfCAnaW5mbycgfCAnd2FybicgfCAnZXJyb3InO1xuXG4vKipcbiAqIOODreOCsOODrOODmeODq+OBruWEquWFiOW6pu+8iOaVsOWApOOBjOWkp+OBjeOBhOOBu+OBqemHjeimge+8iVxuICovXG5jb25zdCBMT0dfTEVWRUxfUFJJT1JJVFk6IFJlY29yZDxMb2dMZXZlbCwgbnVtYmVyPiA9IHtcbiAgZGVidWc6IDAsXG4gIGluZm86IDEsXG4gIHdhcm46IDIsXG4gIGVycm9yOiAzLFxufTtcblxuLyoqXG4gKiDjg63jgqzjg7zjg4/jg7Pjg4njg6njg7xcbiAqL1xuZXhwb3J0IHR5cGUgTG9nSGFuZGxlciA9IChcbiAgbGV2ZWw6IExvZ0xldmVsLFxuICBuYW1lOiBzdHJpbmcsXG4gIG1lc3NhZ2U6IHN0cmluZyxcbiAgLi4uYXJnczogdW5rbm93bltdXG4pID0+IHZvaWQ7XG5cbi8qKlxuICogTnVsbEhhbmRsZXI6IOS9leOCguWHuuWKm+OBl+OBquOBhO+8iOODh+ODleOCqeODq+ODiO+8iVxuICovXG5leHBvcnQgY29uc3QgbnVsbEhhbmRsZXI6IExvZ0hhbmRsZXIgPSAoKSA9PiB7XG4gIC8vIOS9leOCguOBl+OBquOBhFxufTtcblxuLyoqXG4gKiBDb25zb2xlSGFuZGxlcjog44Kz44Oz44K944O844Or44Gr5Ye65Yqb44GZ44KLXG4gKi9cbmV4cG9ydCBjb25zdCBjb25zb2xlSGFuZGxlcjogTG9nSGFuZGxlciA9IChcbiAgbGV2ZWw6IExvZ0xldmVsLFxuICBuYW1lOiBzdHJpbmcsXG4gIG1lc3NhZ2U6IHN0cmluZyxcbiAgLi4uYXJnczogdW5rbm93bltdXG4pID0+IHtcbiAgY29uc3QgdGltZXN0YW1wID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpO1xuICBjb25zdCBmb3JtYXR0ZWRNZXNzYWdlID0gYCR7dGltZXN0YW1wfSBbJHtuYW1lfS8ke2xldmVsLnRvVXBwZXJDYXNlKCl9XSAke21lc3NhZ2V9YDtcblxuICBzd2l0Y2ggKGxldmVsKSB7XG4gICAgY2FzZSAnZGVidWcnOlxuICAgICAgY29uc29sZS5kZWJ1Zyhmb3JtYXR0ZWRNZXNzYWdlLCAuLi5hcmdzKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2luZm8nOlxuICAgICAgY29uc29sZS5pbmZvKGZvcm1hdHRlZE1lc3NhZ2UsIC4uLmFyZ3MpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnd2Fybic6XG4gICAgICBjb25zb2xlLndhcm4oZm9ybWF0dGVkTWVzc2FnZSwgLi4uYXJncyk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdlcnJvcic6XG4gICAgICBjb25zb2xlLmVycm9yKGZvcm1hdHRlZE1lc3NhZ2UsIC4uLmFyZ3MpO1xuICAgICAgYnJlYWs7XG4gIH1cbn07XG5cbi8qKlxuICog44Ot44Ks44O844Kv44Op44K5XG4gKi9cbmV4cG9ydCBjbGFzcyBMb2dnZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgcHJpdmF0ZSBoYW5kbGVyOiBMb2dIYW5kbGVyO1xuICBwcml2YXRlIGxldmVsOiBMb2dMZXZlbDtcblxuICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcsIGhhbmRsZXI6IExvZ0hhbmRsZXIgPSBudWxsSGFuZGxlciwgbGV2ZWw6IExvZ0xldmVsID0gJ3dhcm4nKSB7XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICB0aGlzLmhhbmRsZXIgPSBoYW5kbGVyO1xuICAgIHRoaXMubGV2ZWwgPSBsZXZlbDtcbiAgfVxuXG4gIC8qKlxuICAgKiDjg4/jg7Pjg4njg6njg7zjgpLoqK3lrppcbiAgICovXG4gIHNldEhhbmRsZXIoaGFuZGxlcjogTG9nSGFuZGxlcik6IHZvaWQge1xuICAgIHRoaXMuaGFuZGxlciA9IGhhbmRsZXI7XG4gIH1cblxuICAvKipcbiAgICog44Ot44Kw44Os44OZ44Or44KS6Kit5a6aXG4gICAqL1xuICBzZXRMZXZlbChsZXZlbDogTG9nTGV2ZWwpOiB2b2lkIHtcbiAgICB0aGlzLmxldmVsID0gbGV2ZWw7XG4gIH1cblxuICAvKipcbiAgICog5oyH5a6a44Os44OZ44Or44GM44Ot44Kw5Ye65Yqb5a++6LGh44GL44Gp44GG44GLXG4gICAqL1xuICBwcml2YXRlIHNob3VsZExvZyhsZXZlbDogTG9nTGV2ZWwpOiBib29sZWFuIHtcbiAgICByZXR1cm4gTE9HX0xFVkVMX1BSSU9SSVRZW2xldmVsXSA+PSBMT0dfTEVWRUxfUFJJT1JJVFlbdGhpcy5sZXZlbF07XG4gIH1cblxuICAvKipcbiAgICog44Ot44Kw5Ye65YqbXG4gICAqL1xuICBwcml2YXRlIGxvZyhsZXZlbDogTG9nTGV2ZWwsIG1lc3NhZ2U6IHN0cmluZywgLi4uYXJnczogdW5rbm93bltdKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc2hvdWxkTG9nKGxldmVsKSkge1xuICAgICAgdGhpcy5oYW5kbGVyKGxldmVsLCB0aGlzLm5hbWUsIG1lc3NhZ2UsIC4uLmFyZ3MpO1xuICAgIH1cbiAgfVxuXG4gIGRlYnVnKG1lc3NhZ2U6IHN0cmluZywgLi4uYXJnczogdW5rbm93bltdKTogdm9pZCB7XG4gICAgdGhpcy5sb2coJ2RlYnVnJywgbWVzc2FnZSwgLi4uYXJncyk7XG4gIH1cblxuICBpbmZvKG1lc3NhZ2U6IHN0cmluZywgLi4uYXJnczogdW5rbm93bltdKTogdm9pZCB7XG4gICAgdGhpcy5sb2coJ2luZm8nLCBtZXNzYWdlLCAuLi5hcmdzKTtcbiAgfVxuXG4gIHdhcm4obWVzc2FnZTogc3RyaW5nLCAuLi5hcmdzOiB1bmtub3duW10pOiB2b2lkIHtcbiAgICB0aGlzLmxvZygnd2FybicsIG1lc3NhZ2UsIC4uLmFyZ3MpO1xuICB9XG5cbiAgZXJyb3IobWVzc2FnZTogc3RyaW5nLCAuLi5hcmdzOiB1bmtub3duW10pOiB2b2lkIHtcbiAgICB0aGlzLmxvZygnZXJyb3InLCBtZXNzYWdlLCAuLi5hcmdzKTtcbiAgfVxufVxuXG4vKipcbiAqIOODreOCrOODvOOCkuWPluW+l1xuICogQHBhcmFtIG5hbWUgLSDjg63jgqzjg7zlkI3vvIjjg4fjg5Xjgqnjg6vjg4g6IFwid2lraWRvdFwi77yJXG4gKiBAcmV0dXJucyDjg63jgqzjg7zjgqTjg7Pjgrnjgr/jg7PjgrlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldExvZ2dlcihuYW1lID0gJ3dpa2lkb3QnKTogTG9nZ2VyIHtcbiAgcmV0dXJuIG5ldyBMb2dnZXIobmFtZSk7XG59XG5cbi8qKlxuICog44Kz44Oz44K944O844Or5Ye65Yqb55So44OP44Oz44OJ44Op44KS6Kit5a6aXG4gKiBAcGFyYW0gbG9nZ2VyIC0g6Kit5a6a44GZ44KL44Ot44Ks44O8XG4gKiBAcGFyYW0gbGV2ZWwgLSDjg63jgrDjg6zjg5njg6vvvIjjg4fjg5Xjgqnjg6vjg4g6IFwid2Fyblwi77yJXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXR1cENvbnNvbGVIYW5kbGVyKGxvZ2dlcjogTG9nZ2VyLCBsZXZlbDogTG9nTGV2ZWwgPSAnd2FybicpOiB2b2lkIHtcbiAgbG9nZ2VyLnNldEhhbmRsZXIoY29uc29sZUhhbmRsZXIpO1xuICBsb2dnZXIuc2V0TGV2ZWwobGV2ZWwpO1xufVxuXG4vKipcbiAqIOODkeODg+OCseODvOOCuOWFqOS9k+OBp+S9v+eUqOOBleOCjOOCi+ODh+ODleOCqeODq+ODiOODreOCrOODvFxuICovXG5leHBvcnQgY29uc3QgbG9nZ2VyOiBMb2dnZXIgPSBnZXRMb2dnZXIoKTtcbiIsCiAgICAiaW1wb3J0IHsgZXJyLCBlcnJBc3luYywgb2ssIG9rQXN5bmMsIHR5cGUgUmVzdWx0LCBSZXN1bHRBc3luYyB9IGZyb20gJ25ldmVydGhyb3cnO1xuaW1wb3J0IHR5cGUgeyBXaWtpZG90RXJyb3IgfSBmcm9tICcuLi9lcnJvcnMnO1xuXG4vKiog5ZCM5pyfUmVzdWx05Z6L44Ko44Kk44Oq44Ki44K5ICovXG5leHBvcnQgdHlwZSBXaWtpZG90UmVzdWx0PFQ+ID0gUmVzdWx0PFQsIFdpa2lkb3RFcnJvcj47XG5cbi8qKiDpnZ7lkIzmnJ9SZXN1bHTlnovjgqjjgqTjg6rjgqLjgrkgKi9cbmV4cG9ydCB0eXBlIFdpa2lkb3RSZXN1bHRBc3luYzxUPiA9IFJlc3VsdEFzeW5jPFQsIFdpa2lkb3RFcnJvcj47XG5cbi8qKiDmiJDlip9SZXN1bHTjgpLnlJ/miJAgKi9cbmV4cG9ydCBjb25zdCB3ZE9rID0gPFQ+KHZhbHVlOiBUKTogV2lraWRvdFJlc3VsdDxUPiA9PiBvayh2YWx1ZSk7XG5cbi8qKiDjgqjjg6njg7xSZXN1bHTjgpLnlJ/miJAgKi9cbmV4cG9ydCBjb25zdCB3ZEVyciA9IDxFIGV4dGVuZHMgV2lraWRvdEVycm9yPihlcnJvcjogRSk6IFdpa2lkb3RSZXN1bHQ8bmV2ZXI+ID0+IGVycihlcnJvcik7XG5cbi8qKiDmiJDlip9SZXN1bHRBc3luY+OCkueUn+aIkCAqL1xuZXhwb3J0IGNvbnN0IHdkT2tBc3luYyA9IDxUPih2YWx1ZTogVCk6IFdpa2lkb3RSZXN1bHRBc3luYzxUPiA9PiBva0FzeW5jKHZhbHVlKTtcblxuLyoqIOOCqOODqeODvFJlc3VsdEFzeW5j44KS55Sf5oiQICovXG5leHBvcnQgY29uc3Qgd2RFcnJBc3luYyA9IDxFIGV4dGVuZHMgV2lraWRvdEVycm9yPihlcnJvcjogRSk6IFdpa2lkb3RSZXN1bHRBc3luYzxuZXZlcj4gPT5cbiAgZXJyQXN5bmMoZXJyb3IpO1xuXG4vKiogUHJvbWlzZeOBi+OCieOBruWkieaPmyAqL1xuZXhwb3J0IGNvbnN0IGZyb21Qcm9taXNlID0gPFQ+KFxuICBwcm9taXNlOiBQcm9taXNlPFQ+LFxuICBlcnJvck1hcHBlcjogKGVycm9yOiB1bmtub3duKSA9PiBXaWtpZG90RXJyb3Jcbik6IFdpa2lkb3RSZXN1bHRBc3luYzxUPiA9PiBSZXN1bHRBc3luYy5mcm9tUHJvbWlzZShwcm9taXNlLCBlcnJvck1hcHBlcik7XG5cbi8qKiDopIfmlbBSZXN1bHRBc3luY+OBrue1kOWQiCAqL1xuZXhwb3J0IGNvbnN0IGNvbWJpbmVSZXN1bHRzID0gPFQ+KHJlc3VsdHM6IFdpa2lkb3RSZXN1bHRBc3luYzxUPltdKTogV2lraWRvdFJlc3VsdEFzeW5jPFRbXT4gPT5cbiAgUmVzdWx0QXN5bmMuY29tYmluZShyZXN1bHRzKTtcbiIsCiAgICAiZXhwb3J0ICogZnJvbSAnLi9jb21tb24nO1xuZXhwb3J0ICogZnJvbSAnLi9yZXN1bHQnO1xuIiwKICAgICIvKipcbiAqIEFqYXggTW9kdWxlIENvbm5lY3RvcuioreWumlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFNQ0NvbmZpZyB7XG4gIC8qKiDjg6rjgq/jgqjjgrnjg4jjgr/jgqTjg6DjgqLjgqbjg4jvvIjjg5/jg6rnp5LvvIkgKi9cbiAgdGltZW91dDogbnVtYmVyO1xuXG4gIC8qKiDjg6rjg4jjg6njgqTkuIrpmZDlm57mlbAgKi9cbiAgcmV0cnlMaW1pdDogbnVtYmVyO1xuXG4gIC8qKiDjg6rjg4jjg6njgqTln7rmnKzplpPpmpTvvIjjg5/jg6rnp5LvvIkgKi9cbiAgcmV0cnlJbnRlcnZhbDogbnVtYmVyO1xuXG4gIC8qKiDmnIDlpKfjg5Djg4Pjgq/jgqrjg5XvvIjjg5/jg6rnp5LvvIkgKi9cbiAgbWF4QmFja29mZjogbnVtYmVyO1xuXG4gIC8qKiDjg5Djg4Pjgq/jgqrjg5Xkv4LmlbAgKi9cbiAgYmFja29mZkZhY3RvcjogbnVtYmVyO1xuXG4gIC8qKiDmnIDlpKfkuKbliJfjg6rjgq/jgqjjgrnjg4jmlbAgKi9cbiAgc2VtYXBob3JlTGltaXQ6IG51bWJlcjtcbn1cblxuLyoqIOODh+ODleOCqeODq+ODiEFNQ+ioreWumiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfQU1DX0NPTkZJRzogQU1DQ29uZmlnID0ge1xuICB0aW1lb3V0OiAyMDAwMCxcbiAgcmV0cnlMaW1pdDogMyxcbiAgcmV0cnlJbnRlcnZhbDogMTAwMCxcbiAgbWF4QmFja29mZjogNjAwMDAsXG4gIGJhY2tvZmZGYWN0b3I6IDIuMCxcbiAgc2VtYXBob3JlTGltaXQ6IDEwLFxufTtcblxuLyoqXG4gKiBXaWtpZG9044GM6KaB5rGC44GZ44KL5Zu65a6a44OI44O844Kv44Oz5YCkXG4gKiDjgZPjgozjga9XaWtpZG9044Gu44OV44Ot44Oz44OI44Ko44Oz44OJ44GL44KJ5Y+W5b6X44GV44KM44KL5Zu65a6a5YCk44Gn44CBXG4gKiDjgrvjgq3jg6Xjg6rjg4bjgqPjg4jjg7zjgq/jg7Pjgafjga/jgarjgY/ljZjjgarjgovorZjliKXlrZDjgajjgZfjgabkvb/nlKjjgZXjgozjgotcbiAqL1xuZXhwb3J0IGNvbnN0IFdJS0lET1RfVE9LRU43ID0gJzEyMzQ1Nic7XG5cbi8qKlxuICogSFRUUOOCqOODqeODvOaZguOBruODleOCqeODvOODq+ODkOODg+OCr+OCueODhuODvOOCv+OCueOCs+ODvOODiVxuICog44Os44K544Od44Oz44K544GL44KJ44K544OG44O844K/44K544Kz44O844OJ44KS5Y+W5b6X44Gn44GN44Gq44GE5aC05ZCI44Gr5L2/55SoXG4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX0hUVFBfU1RBVFVTX0NPREUgPSA5OTk7XG4iLAogICAgImltcG9ydCB0eXBlIHsgQ2xpZW50UmVmIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHR5cGUgeyBBYnN0cmFjdFVzZXIsIFVzZXJUeXBlIH0gZnJvbSAnLi9hYnN0cmFjdC11c2VyJztcblxuLyoqXG4gKiDljL/lkI3jg6bjg7zjgrbjg7xcbiAqL1xuZXhwb3J0IGNsYXNzIEFub255bW91c1VzZXIgaW1wbGVtZW50cyBBYnN0cmFjdFVzZXIge1xuICBwdWJsaWMgcmVhZG9ubHkgY2xpZW50OiBDbGllbnRSZWY7XG5cbiAgLyoqIOODpuODvOOCtuODvElE77yI5Yy/5ZCN44GvMO+8iSAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaWQ6IG51bWJlciA9IDA7XG5cbiAgLyoqIOODpuODvOOCtuODvOWQje+8iOWMv+WQjeOBr1wiQW5vbnltb3VzXCLvvIkgKi9cbiAgcHVibGljIHJlYWRvbmx5IG5hbWU6IHN0cmluZyA9ICdBbm9ueW1vdXMnO1xuXG4gIC8qKiBVTklY5b2i5byP44Gu44Om44O844K244O85ZCNICovXG4gIHB1YmxpYyByZWFkb25seSB1bml4TmFtZTogc3RyaW5nID0gJ2Fub255bW91cyc7XG5cbiAgLyoqIOOCouODkOOCv+ODvFVSTO+8iOWMv+WQjeOBr251bGzvvIkgKi9cbiAgcHVibGljIHJlYWRvbmx5IGF2YXRhclVybDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqIElQ44Ki44OJ44Os44K5ICovXG4gIHB1YmxpYyByZWFkb25seSBpcDogc3RyaW5nO1xuXG4gIC8qKiDjg6bjg7zjgrbjg7znqK7liKUgKi9cbiAgcHVibGljIHJlYWRvbmx5IHVzZXJUeXBlOiBVc2VyVHlwZSA9ICdhbm9ueW1vdXMnO1xuXG4gIGNvbnN0cnVjdG9yKGNsaWVudDogQ2xpZW50UmVmLCBpcDogc3RyaW5nKSB7XG4gICAgdGhpcy5jbGllbnQgPSBjbGllbnQ7XG4gICAgdGhpcy5pcCA9IGlwO1xuICB9XG5cbiAgLy8gQWJzdHJhY3RVc2Vy5a6f6KOFXG4gIGlzVXNlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaXNEZWxldGVkVXNlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaXNBbm9ueW1vdXNVc2VyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlzR3Vlc3RVc2VyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpc1dpa2lkb3RVc2VyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBBbm9ueW1vdXNVc2VyKG5hbWU9JHt0aGlzLm5hbWV9LCB1bml4TmFtZT0ke3RoaXMudW5peE5hbWV9LCBpcD0ke3RoaXMuaXB9KWA7XG4gIH1cbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBDbGllbnRSZWYgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgdHlwZSB7IEFic3RyYWN0VXNlciwgVXNlclR5cGUgfSBmcm9tICcuL2Fic3RyYWN0LXVzZXInO1xuXG4vKipcbiAqIOWJiumZpOa4iOOBv+ODpuODvOOCtuODvFxuICovXG5leHBvcnQgY2xhc3MgRGVsZXRlZFVzZXIgaW1wbGVtZW50cyBBYnN0cmFjdFVzZXIge1xuICBwdWJsaWMgcmVhZG9ubHkgY2xpZW50OiBDbGllbnRSZWY7XG5cbiAgLyoqIOWJiumZpOa4iOOBv+ODpuODvOOCtuODvElEICovXG4gIHB1YmxpYyByZWFkb25seSBpZDogbnVtYmVyO1xuXG4gIC8qKiDjg6bjg7zjgrbjg7zlkI3vvIjliYrpmaTmuIjjgb/jga9cImFjY291bnQgZGVsZXRlZFwi77yJICovXG4gIHB1YmxpYyByZWFkb25seSBuYW1lOiBzdHJpbmcgPSAnYWNjb3VudCBkZWxldGVkJztcblxuICAvKiogVU5JWOW9ouW8j+OBruODpuODvOOCtuODvOWQjSAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdW5peE5hbWU6IHN0cmluZyA9ICdhY2NvdW50X2RlbGV0ZWQnO1xuXG4gIC8qKiDjgqLjg5Djgr/jg7xVUkzvvIjliYrpmaTmuIjjgb/jga9udWxs77yJICovXG4gIHB1YmxpYyByZWFkb25seSBhdmF0YXJVcmw6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIC8qKiBJUOOCouODieODrOOCue+8iOWJiumZpOa4iOOBv+OBr251bGzvvIkgKi9cbiAgcHVibGljIHJlYWRvbmx5IGlwOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICAvKiog44Om44O844K244O856iu5YilICovXG4gIHB1YmxpYyByZWFkb25seSB1c2VyVHlwZTogVXNlclR5cGUgPSAnZGVsZXRlZCc7XG5cbiAgY29uc3RydWN0b3IoY2xpZW50OiBDbGllbnRSZWYsIGlkOiBudW1iZXIpIHtcbiAgICB0aGlzLmNsaWVudCA9IGNsaWVudDtcbiAgICB0aGlzLmlkID0gaWQ7XG4gIH1cblxuICAvLyBBYnN0cmFjdFVzZXLlrp/oo4VcbiAgaXNVc2VyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpc0RlbGV0ZWRVc2VyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlzQW5vbnltb3VzVXNlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaXNHdWVzdFVzZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlzV2lraWRvdFVzZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYERlbGV0ZWRVc2VyKGlkPSR7dGhpcy5pZH0sIG5hbWU9JHt0aGlzLm5hbWV9LCB1bml4TmFtZT0ke3RoaXMudW5peE5hbWV9KWA7XG4gIH1cbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBDbGllbnRSZWYgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgdHlwZSB7IEFic3RyYWN0VXNlciwgVXNlclR5cGUgfSBmcm9tICcuL2Fic3RyYWN0LXVzZXInO1xuXG4vKipcbiAqIOOCsuOCueODiOODpuODvOOCtuODvFxuICovXG5leHBvcnQgY2xhc3MgR3Vlc3RVc2VyIGltcGxlbWVudHMgQWJzdHJhY3RVc2VyIHtcbiAgcHVibGljIHJlYWRvbmx5IGNsaWVudDogQ2xpZW50UmVmO1xuXG4gIC8qKiDjg6bjg7zjgrbjg7xJRO+8iOOCsuOCueODiOOBrzDvvIkgKi9cbiAgcHVibGljIHJlYWRvbmx5IGlkOiBudW1iZXIgPSAwO1xuXG4gIC8qKiDjgrLjgrnjg4jlkI0gKi9cbiAgcHVibGljIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcblxuICAvKiogVU5JWOW9ouW8j+OBruODpuODvOOCtuODvOWQje+8iOOCsuOCueODiOOBr251bGzvvIkgKi9cbiAgcHVibGljIHJlYWRvbmx5IHVuaXhOYW1lOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICAvKiog44Ki44OQ44K/44O8VVJM77yIR3JhdmF0YXLjga7loLTlkIjjgYLjgorvvIkgKi9cbiAgcHVibGljIHJlYWRvbmx5IGF2YXRhclVybDogc3RyaW5nIHwgbnVsbDtcblxuICAvKiogSVDjgqLjg4njg6zjgrnvvIjjgrLjgrnjg4jjga9udWxs77yJICovXG4gIHB1YmxpYyByZWFkb25seSBpcDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqIOODpuODvOOCtuODvOeoruWIpSAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdXNlclR5cGU6IFVzZXJUeXBlID0gJ2d1ZXN0JztcblxuICBjb25zdHJ1Y3RvcihjbGllbnQ6IENsaWVudFJlZiwgbmFtZTogc3RyaW5nLCBhdmF0YXJVcmw6IHN0cmluZyB8IG51bGwgPSBudWxsKSB7XG4gICAgdGhpcy5jbGllbnQgPSBjbGllbnQ7XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICB0aGlzLmF2YXRhclVybCA9IGF2YXRhclVybDtcbiAgfVxuXG4gIC8vIEFic3RyYWN0VXNlcuWun+ijhVxuICBpc1VzZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlzRGVsZXRlZFVzZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlzQW5vbnltb3VzVXNlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaXNHdWVzdFVzZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaXNXaWtpZG90VXNlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiBgR3Vlc3RVc2VyKG5hbWU9JHt0aGlzLm5hbWV9KWA7XG4gIH1cbn1cbiIsCiAgICAiLyoqXG4gKiDnibnmroroqJjlj7fjg7vpnZ7oi7Hoqp7jgqLjg6vjg5XjgqHjg5njg4Pjg4jjgpLoi7Hoqp7jgqLjg6vjg5XjgqHjg5njg4Pjg4jjgavlpInmj5vjgZnjgovjgZ/jgoHjga7jg57jg4Pjg5Tjg7PjgrDjg4bjg7zjg5bjg6tcbiAqXG4gKiDpnZ5BU0NJSeaWh+Wtl+OCkuWvvuW/nOOBmeOCi0FTQ0lJ5paH5a2X44Gr5aSJ5o+b44GZ44KL44Gf44KB44Gu44Oe44OD44OU44Oz44Kw44KS5o+Q5L6b44GZ44KL44CCXG4gKiDkuLvjgatVUkznlJ/miJDjgoTjg5rjg7zjgrjlkI3jga51bml45b2i5byP44G444Gu5aSJ5o+b5pmC44Gr5L2/55So44GV44KM44KL44CCXG4gKi9cblxuZXhwb3J0IGNvbnN0IHNwZWNpYWxDaGFyTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAnXFx1MDBDMCc6ICdhJyxcbiAgJ1xcdTAwQzEnOiAnYScsXG4gICdcXHUwMEMyJzogJ2EnLFxuICAnXFx1MDBDMyc6ICdhJyxcbiAgJ1xcdTAwQzQnOiAnYWUnLFxuICAnXFx1MDBDNSc6ICdhJyxcbiAgJ1xcdTAwQzYnOiAnYWUnLFxuICAnXFx1MDBDNyc6ICdjJyxcbiAgJ1xcdTAwQzgnOiAnZScsXG4gICdcXHUwMEM5JzogJ2UnLFxuICAnXFx1MDBDQSc6ICdlJyxcbiAgJ1xcdTAwQ0InOiAnZScsXG4gICdcXHUwMENDJzogJ2knLFxuICAnXFx1MDBDRCc6ICdpJyxcbiAgJ1xcdTAwQ0UnOiAnaScsXG4gICdcXHUwMENGJzogJ2knLFxuICAnXFx1MDBEMCc6ICdkJyxcbiAgJ1xcdTAwRDEnOiAnbicsXG4gICdcXHUwMEQyJzogJ28nLFxuICAnXFx1MDBEMyc6ICdvJyxcbiAgJ1xcdTAwRDQnOiAnbycsXG4gICdcXHUwMEQ1JzogJ28nLFxuICAnXFx1MDBENic6ICdvZScsXG4gICdcXHUwMEQ4JzogJ28nLFxuICAnXFx1MDBEOSc6ICd1JyxcbiAgJ1xcdTAwREEnOiAndScsXG4gICdcXHUwMERCJzogJ3UnLFxuICAnXFx1MDBEQyc6ICd1ZScsXG4gICdcXHUwMEREJzogJ3knLFxuICAnXFx1MDBERSc6ICd0JyxcbiAgJ1xcdTAwREYnOiAnc3MnLFxuICAnXFx1MDBFMCc6ICdhJyxcbiAgJ1xcdTAwRTEnOiAnYScsXG4gICdcXHUwMEUyJzogJ2EnLFxuICAnXFx1MDBFMyc6ICdhJyxcbiAgJ1xcdTAwRTQnOiAnYWUnLFxuICAnXFx1MDBFNSc6ICdhJyxcbiAgJ1xcdTAwRTYnOiAnYWUnLFxuICAnXFx1MDBFNyc6ICdjJyxcbiAgJ1xcdTAwRTgnOiAnZScsXG4gICdcXHUwMEU5JzogJ2UnLFxuICAnXFx1MDBFQSc6ICdlJyxcbiAgJ1xcdTAwRUInOiAnZScsXG4gICdcXHUwMEVDJzogJ2knLFxuICAnXFx1MDBFRCc6ICdpJyxcbiAgJ1xcdTAwRUUnOiAnaScsXG4gICdcXHUwMEVGJzogJ2knLFxuICAnXFx1MDBGMCc6ICdkJyxcbiAgJ1xcdTAwRjEnOiAnbicsXG4gICdcXHUwMEYyJzogJ28nLFxuICAnXFx1MDBGMyc6ICdvJyxcbiAgJ1xcdTAwRjQnOiAnbycsXG4gICdcXHUwMEY1JzogJ28nLFxuICAnXFx1MDBGNic6ICdvZScsXG4gICdcXHUwMEY4JzogJ28nLFxuICAnXFx1MDBGOSc6ICd1JyxcbiAgJ1xcdTAwRkEnOiAndScsXG4gICdcXHUwMEZCJzogJ3UnLFxuICAnXFx1MDBGQyc6ICd1ZScsXG4gICdcXHUwMEZEJzogJ3knLFxuICAnXFx1MDBGRSc6ICd0JyxcbiAgJ1xcdTAwRkYnOiAneScsXG4gICdcXHUwMTAwJzogJ2EnLFxuICAnXFx1MDEwMSc6ICdhJyxcbiAgJ1xcdTAxMDInOiAnYScsXG4gICdcXHUwMTAzJzogJ2EnLFxuICAnXFx1MDEwNCc6ICdhJyxcbiAgJ1xcdTAxMDUnOiAnYScsXG4gICdcXHUwMTA2JzogJ2MnLFxuICAnXFx1MDEwNyc6ICdjJyxcbiAgJ1xcdTAxMDgnOiAnYycsXG4gICdcXHUwMTA5JzogJ2MnLFxuICAnXFx1MDEwQSc6ICdjJyxcbiAgJ1xcdTAxMEInOiAnYycsXG4gICdcXHUwMTBDJzogJ2MnLFxuICAnXFx1MDEwRCc6ICdjJyxcbiAgJ1xcdTAxMEUnOiAnZCcsXG4gICdcXHUwMTBGJzogJ2QnLFxuICAnXFx1MDExMCc6ICdkJyxcbiAgJ1xcdTAxMTEnOiAnZCcsXG4gICdcXHUwMTEyJzogJ2UnLFxuICAnXFx1MDExMyc6ICdlJyxcbiAgJ1xcdTAxMTQnOiAnZScsXG4gICdcXHUwMTE1JzogJ2UnLFxuICAnXFx1MDExNic6ICdlJyxcbiAgJ1xcdTAxMTcnOiAnZScsXG4gICdcXHUwMTE4JzogJ2UnLFxuICAnXFx1MDExOSc6ICdlJyxcbiAgJ1xcdTAxMUEnOiAnZScsXG4gICdcXHUwMTFCJzogJ2UnLFxuICAnXFx1MDExQyc6ICdnJyxcbiAgJ1xcdTAxMUQnOiAnZycsXG4gICdcXHUwMTFFJzogJ2cnLFxuICAnXFx1MDExRic6ICdnJyxcbiAgJ1xcdTAxMjAnOiAnZycsXG4gICdcXHUwMTIxJzogJ2cnLFxuICAnXFx1MDEyMic6ICdnJyxcbiAgJ1xcdTAxMjMnOiAnZycsXG4gICdcXHUwMTI0JzogJ2gnLFxuICAnXFx1MDEyNSc6ICdoJyxcbiAgJ1xcdTAxMjYnOiAnaCcsXG4gICdcXHUwMTI3JzogJ2gnLFxuICAnXFx1MDEyOCc6ICdpJyxcbiAgJ1xcdTAxMjknOiAnaScsXG4gICdcXHUwMTJBJzogJ2knLFxuICAnXFx1MDEyQic6ICdpJyxcbiAgJ1xcdTAxMkMnOiAnaScsXG4gICdcXHUwMTJEJzogJ2knLFxuICAnXFx1MDEyRSc6ICdpJyxcbiAgJ1xcdTAxMkYnOiAnaScsXG4gICdcXHUwMTMwJzogJ2knLFxuICAnXFx1MDEzMSc6ICdpJyxcbiAgJ1xcdTAxMzInOiAnaWonLFxuICAnXFx1MDEzMyc6ICdpaicsXG4gICdcXHUwMTM0JzogJ2onLFxuICAnXFx1MDEzNSc6ICdqJyxcbiAgJ1xcdTAxMzYnOiAnaycsXG4gICdcXHUwMTM3JzogJ2snLFxuICAnXFx1MDEzOCc6ICdrJyxcbiAgJ1xcdTAxMzknOiAnbCcsXG4gICdcXHUwMTNBJzogJ2wnLFxuICAnXFx1MDEzQic6ICdsJyxcbiAgJ1xcdTAxM0MnOiAnbCcsXG4gICdcXHUwMTNEJzogJ2wnLFxuICAnXFx1MDEzRSc6ICdsJyxcbiAgJ1xcdTAxM0YnOiAnbCcsXG4gICdcXHUwMTQwJzogJ2wnLFxuICAnXFx1MDE0MSc6ICdsJyxcbiAgJ1xcdTAxNDInOiAnbCcsXG4gICdcXHUwMTQzJzogJ24nLFxuICAnXFx1MDE0NCc6ICduJyxcbiAgJ1xcdTAxNDUnOiAnbicsXG4gICdcXHUwMTQ2JzogJ24nLFxuICAnXFx1MDE0Nyc6ICduJyxcbiAgJ1xcdTAxNDgnOiAnbicsXG4gICdcXHUwMTQ5JzogJ24nLFxuICAnXFx1MDE0QSc6ICduJyxcbiAgJ1xcdTAxNEInOiAnbicsXG4gICdcXHUwMTRDJzogJ28nLFxuICAnXFx1MDE0RCc6ICdvJyxcbiAgJ1xcdTAxNEUnOiAnbycsXG4gICdcXHUwMTRGJzogJ28nLFxuICAnXFx1MDE1MCc6ICdvJyxcbiAgJ1xcdTAxNTEnOiAnbycsXG4gICdcXHUwMTUyJzogJ29lJyxcbiAgJ1xcdTAxNTMnOiAnb2UnLFxuICAnXFx1MDE1NCc6ICdyJyxcbiAgJ1xcdTAxNTUnOiAncicsXG4gICdcXHUwMTU2JzogJ3InLFxuICAnXFx1MDE1Nyc6ICdyJyxcbiAgJ1xcdTAxNTgnOiAncicsXG4gICdcXHUwMTU5JzogJ3InLFxuICAnXFx1MDE1QSc6ICdzJyxcbiAgJ1xcdTAxNUInOiAncycsXG4gICdcXHUwMTVDJzogJ3MnLFxuICAnXFx1MDE1RCc6ICdzJyxcbiAgJ1xcdTAxNUUnOiAncycsXG4gICdcXHUwMTVGJzogJ3MnLFxuICAnXFx1MDE2MCc6ICdzJyxcbiAgJ1xcdTAxNjEnOiAncycsXG4gICdcXHUwMTYyJzogJ3QnLFxuICAnXFx1MDE2Myc6ICd0JyxcbiAgJ1xcdTAxNjQnOiAndCcsXG4gICdcXHUwMTY1JzogJ3QnLFxuICAnXFx1MDE2Nic6ICd0JyxcbiAgJ1xcdTAxNjcnOiAndCcsXG4gICdcXHUwMTY4JzogJ3UnLFxuICAnXFx1MDE2OSc6ICd1JyxcbiAgJ1xcdTAxNkEnOiAndScsXG4gICdcXHUwMTZCJzogJ3UnLFxuICAnXFx1MDE2Qyc6ICd1JyxcbiAgJ1xcdTAxNkQnOiAndScsXG4gICdcXHUwMTZFJzogJ3UnLFxuICAnXFx1MDE2Ric6ICd1JyxcbiAgJ1xcdTAxNzAnOiAndScsXG4gICdcXHUwMTcxJzogJ3UnLFxuICAnXFx1MDE3Mic6ICd1JyxcbiAgJ1xcdTAxNzMnOiAndScsXG4gICdcXHUwMTc0JzogJ3cnLFxuICAnXFx1MDE3NSc6ICd3JyxcbiAgJ1xcdTAxNzYnOiAneScsXG4gICdcXHUwMTc3JzogJ3knLFxuICAnXFx1MDE3OCc6ICd5JyxcbiAgJ1xcdTAxNzknOiAneicsXG4gICdcXHUwMTdBJzogJ3onLFxuICAnXFx1MDE3Qic6ICd6JyxcbiAgJ1xcdTAxN0MnOiAneicsXG4gICdcXHUwMTdEJzogJ3onLFxuICAnXFx1MDE3RSc6ICd6JyxcbiAgJ1xcdTAxN0YnOiAnc3MnLFxuICAnXFx1MDE5MSc6ICdmJyxcbiAgJ1xcdTAxOTInOiAnZicsXG4gICdcXHUwMjE4JzogJ3MnLFxuICAnXFx1MDIxOSc6ICdzJyxcbiAgJ1xcdTAyMUEnOiAndCcsXG4gICdcXHUwMjFCJzogJ3QnLFxuICAnXFx1MDM4Nic6ICdhJyxcbiAgJ1xcdTAzODgnOiAnZScsXG4gICdcXHUwMzg5JzogJ2knLFxuICAnXFx1MDM4QSc6ICdpJyxcbiAgJ1xcdTAzOEMnOiAnbycsXG4gICdcXHUwMzhFJzogJ3knLFxuICAnXFx1MDM4Ric6ICdvJyxcbiAgJ1xcdTAzOTAnOiAnaScsXG4gICdcXHUwMzkxJzogJ2EnLFxuICAnXFx1MDM5Mic6ICd2JyxcbiAgJ1xcdTAzOTMnOiAnZycsXG4gICdcXHUwMzk0JzogJ2QnLFxuICAnXFx1MDM5NSc6ICdlJyxcbiAgJ1xcdTAzOTYnOiAneicsXG4gICdcXHUwMzk3JzogJ2knLFxuICAnXFx1MDM5OCc6ICd0aCcsXG4gICdcXHUwMzk5JzogJ2knLFxuICAnXFx1MDM5QSc6ICdrJyxcbiAgJ1xcdTAzOUInOiAnbCcsXG4gICdcXHUwMzlDJzogJ20nLFxuICAnXFx1MDM5RCc6ICduJyxcbiAgJ1xcdTAzOUUnOiAneCcsXG4gICdcXHUwMzlGJzogJ28nLFxuICAnXFx1MDNBMCc6ICdwJyxcbiAgJ1xcdTAzQTEnOiAncicsXG4gICdcXHUwM0EzJzogJ3MnLFxuICAnXFx1MDNBNCc6ICd0JyxcbiAgJ1xcdTAzQTUnOiAneScsXG4gICdcXHUwM0E2JzogJ2YnLFxuICAnXFx1MDNBNyc6ICdjaCcsXG4gICdcXHUwM0E4JzogJ3BzJyxcbiAgJ1xcdTAzQTknOiAnbycsXG4gICdcXHUwM0FBJzogJ2knLFxuICAnXFx1MDNBQic6ICd5JyxcbiAgJ1xcdTAzQUMnOiAnYScsXG4gICdcXHUwM0FEJzogJ2UnLFxuICAnXFx1MDNBRSc6ICdpJyxcbiAgJ1xcdTAzQUYnOiAnaScsXG4gICdcXHUwM0IwJzogJ3knLFxuICAnXFx1MDNCMSc6ICdhJyxcbiAgJ1xcdTAzQjInOiAndicsXG4gICdcXHUwM0IzJzogJ2cnLFxuICAnXFx1MDNCNCc6ICdkJyxcbiAgJ1xcdTAzQjUnOiAnZScsXG4gICdcXHUwM0I2JzogJ3onLFxuICAnXFx1MDNCNyc6ICdpJyxcbiAgJ1xcdTAzQjgnOiAndGgnLFxuICAnXFx1MDNCOSc6ICdpJyxcbiAgJ1xcdTAzQkEnOiAnaycsXG4gICdcXHUwM0JCJzogJ2wnLFxuICAnXFx1MDNCQyc6ICdtJyxcbiAgJ1xcdTAzQkQnOiAnbicsXG4gICdcXHUwM0JFJzogJ3gnLFxuICAnXFx1MDNCRic6ICdvJyxcbiAgJ1xcdTAzQzAnOiAncCcsXG4gICdcXHUwM0MxJzogJ3InLFxuICAnXFx1MDNDMic6ICdzJyxcbiAgJ1xcdTAzQzMnOiAncycsXG4gICdcXHUwM0M0JzogJ3QnLFxuICAnXFx1MDNDNSc6ICd5JyxcbiAgJ1xcdTAzQzYnOiAnZicsXG4gICdcXHUwM0M3JzogJ2NoJyxcbiAgJ1xcdTAzQzgnOiAncHMnLFxuICAnXFx1MDNDOSc6ICdvJyxcbiAgJ1xcdTAzQ0EnOiAnaScsXG4gICdcXHUwM0NCJzogJ3knLFxuICAnXFx1MDNDQyc6ICdvJyxcbiAgJ1xcdTAzQ0QnOiAneScsXG4gICdcXHUwM0NFJzogJ28nLFxuICAnXFx1MDNEMSc6ICd0aCcsXG4gICdcXHUwNDAxJzogJ2UnLFxuICAnXFx1MDQwMic6ICdkJyxcbiAgJ1xcdTA0MDMnOiAnZycsXG4gICdcXHUwNDA0JzogJ2UnLFxuICAnXFx1MDQwNSc6ICd6JyxcbiAgJ1xcdTA0MDYnOiAnaScsXG4gICdcXHUwNDA3JzogJ2knLFxuICAnXFx1MDQwOCc6ICdqJyxcbiAgJ1xcdTA0MDknOiAnbCcsXG4gICdcXHUwNDBBJzogJ24nLFxuICAnXFx1MDQwQic6ICdjJyxcbiAgJ1xcdTA0MEMnOiAnaycsXG4gICdcXHUwNDBFJzogJ3UnLFxuICAnXFx1MDQwRic6ICdkJyxcbiAgJ1xcdTA0MTAnOiAnYScsXG4gICdcXHUwNDExJzogJ2InLFxuICAnXFx1MDQxMic6ICd2JyxcbiAgJ1xcdTA0MTMnOiAnZycsXG4gICdcXHUwNDE0JzogJ2QnLFxuICAnXFx1MDQxNSc6ICdlJyxcbiAgJ1xcdTA0MTYnOiAneicsXG4gICdcXHUwNDE3JzogJ3onLFxuICAnXFx1MDQxOCc6ICdpJyxcbiAgJ1xcdTA0MTknOiAnaicsXG4gICdcXHUwNDFBJzogJ2snLFxuICAnXFx1MDQxQic6ICdsJyxcbiAgJ1xcdTA0MUMnOiAnbScsXG4gICdcXHUwNDFEJzogJ24nLFxuICAnXFx1MDQxRSc6ICdvJyxcbiAgJ1xcdTA0MUYnOiAncCcsXG4gICdcXHUwNDIwJzogJ3InLFxuICAnXFx1MDQyMSc6ICdzJyxcbiAgJ1xcdTA0MjInOiAndCcsXG4gICdcXHUwNDIzJzogJ3UnLFxuICAnXFx1MDQyNCc6ICdmJyxcbiAgJ1xcdTA0MjUnOiAnaCcsXG4gICdcXHUwNDI2JzogJ2MnLFxuICAnXFx1MDQyNyc6ICdjJyxcbiAgJ1xcdTA0MjgnOiAncycsXG4gICdcXHUwNDI5JzogJ3MnLFxuICAnXFx1MDQyQic6ICd5JyxcbiAgJ1xcdTA0MkQnOiAnZScsXG4gICdcXHUwNDJFJzogJ3UnLFxuICAnXFx1MDQyRic6ICdhJyxcbiAgJ1xcdTA0MzAnOiAnYScsXG4gICdcXHUwNDMxJzogJ2InLFxuICAnXFx1MDQzMic6ICd2JyxcbiAgJ1xcdTA0MzMnOiAnZycsXG4gICdcXHUwNDM0JzogJ2QnLFxuICAnXFx1MDQzNSc6ICdlJyxcbiAgJ1xcdTA0MzYnOiAneicsXG4gICdcXHUwNDM3JzogJ3onLFxuICAnXFx1MDQzOCc6ICdpJyxcbiAgJ1xcdTA0MzknOiAnaicsXG4gICdcXHUwNDNBJzogJ2snLFxuICAnXFx1MDQzQic6ICdsJyxcbiAgJ1xcdTA0M0MnOiAnbScsXG4gICdcXHUwNDNEJzogJ24nLFxuICAnXFx1MDQzRSc6ICdvJyxcbiAgJ1xcdTA0M0YnOiAncCcsXG4gICdcXHUwNDQwJzogJ3InLFxuICAnXFx1MDQ0MSc6ICdzJyxcbiAgJ1xcdTA0NDInOiAndCcsXG4gICdcXHUwNDQzJzogJ3UnLFxuICAnXFx1MDQ0NCc6ICdmJyxcbiAgJ1xcdTA0NDUnOiAnaCcsXG4gICdcXHUwNDQ2JzogJ2MnLFxuICAnXFx1MDQ0Nyc6ICdjJyxcbiAgJ1xcdTA0NDgnOiAncycsXG4gICdcXHUwNDQ5JzogJ3MnLFxuICAnXFx1MDQ0Qic6ICd5JyxcbiAgJ1xcdTA0NEQnOiAnZScsXG4gICdcXHUwNDRFJzogJ3UnLFxuICAnXFx1MDQ0Ric6ICdhJyxcbiAgJ1xcdTA0NTEnOiAnZScsXG4gICdcXHUwNDUyJzogJ2QnLFxuICAnXFx1MDQ1Myc6ICdnJyxcbiAgJ1xcdTA0NTQnOiAnZScsXG4gICdcXHUwNDU1JzogJ3onLFxuICAnXFx1MDQ1Nic6ICdpJyxcbiAgJ1xcdTA0NTcnOiAnaScsXG4gICdcXHUwNDU4JzogJ2onLFxuICAnXFx1MDQ1OSc6ICdsJyxcbiAgJ1xcdTA0NUEnOiAnbicsXG4gICdcXHUwNDVCJzogJ2MnLFxuICAnXFx1MDQ1Qyc6ICdrJyxcbiAgJ1xcdTA0NUUnOiAndScsXG4gICdcXHUwNDVGJzogJ2QnLFxuICAnXFx1MDQ2Mic6ICdlJyxcbiAgJ1xcdTA0NjMnOiAnZScsXG4gICdcXHUwNDZBJzogJ2EnLFxuICAnXFx1MDQ2Qic6ICdhJyxcbiAgJ1xcdTA0NzInOiAnZicsXG4gICdcXHUwNDczJzogJ2YnLFxuICAnXFx1MDQ3NCc6ICd5JyxcbiAgJ1xcdTA0NzUnOiAneScsXG4gICdcXHUwNDkwJzogJ2cnLFxuICAnXFx1MDQ5MSc6ICdnJyxcbiAgJ1xcdTA0OTInOiAnZycsXG4gICdcXHUwNDkzJzogJ2cnLFxuICAnXFx1MDQ5NCc6ICdnJyxcbiAgJ1xcdTA0OTUnOiAnZycsXG4gICdcXHUwNDk2JzogJ3onLFxuICAnXFx1MDQ5Nyc6ICd6JyxcbiAgJ1xcdTA0OUEnOiAnaycsXG4gICdcXHUwNDlCJzogJ2snLFxuICAnXFx1MDQ5Qyc6ICdrJyxcbiAgJ1xcdTA0OUQnOiAnaycsXG4gICdcXHUwNDlFJzogJ2snLFxuICAnXFx1MDQ5Ric6ICdrJyxcbiAgJ1xcdTA0QTAnOiAnaycsXG4gICdcXHUwNEExJzogJ2snLFxuICAnXFx1MDRBMic6ICduJyxcbiAgJ1xcdTA0QTMnOiAnbicsXG4gICdcXHUwNEE0JzogJ24nLFxuICAnXFx1MDRBNSc6ICduJyxcbiAgJ1xcdTA0QTYnOiAncCcsXG4gICdcXHUwNEE3JzogJ3AnLFxuICAnXFx1MDRBOCc6ICdvJyxcbiAgJ1xcdTA0QTknOiAnbycsXG4gICdcXHUwNEFBJzogJ3MnLFxuICAnXFx1MDRBQic6ICdzJyxcbiAgJ1xcdTA0QUMnOiAndCcsXG4gICdcXHUwNEFEJzogJ3QnLFxuICAnXFx1MDRBRSc6ICd1JyxcbiAgJ1xcdTA0QUYnOiAndScsXG4gICdcXHUwNEIwJzogJ3UnLFxuICAnXFx1MDRCMSc6ICd1JyxcbiAgJ1xcdTA0QjInOiAnaCcsXG4gICdcXHUwNEIzJzogJ2gnLFxuICAnXFx1MDRCNCc6ICdjJyxcbiAgJ1xcdTA0QjUnOiAnYycsXG4gICdcXHUwNEI2JzogJ2MnLFxuICAnXFx1MDRCNyc6ICdjJyxcbiAgJ1xcdTA0QjgnOiAnYycsXG4gICdcXHUwNEI5JzogJ2MnLFxuICAnXFx1MDRCQSc6ICdoJyxcbiAgJ1xcdTA0QkInOiAnaCcsXG4gICdcXHUwNEJDJzogJ2MnLFxuICAnXFx1MDRCRCc6ICdjJyxcbiAgJ1xcdTA0QkUnOiAnYycsXG4gICdcXHUwNEJGJzogJ2MnLFxuICAnXFx1MDRDMSc6ICd6JyxcbiAgJ1xcdTA0QzInOiAneicsXG4gICdcXHUwNEMzJzogJ2snLFxuICAnXFx1MDRDNCc6ICdrJyxcbiAgJ1xcdTA0QzUnOiAnbCcsXG4gICdcXHUwNEM2JzogJ2wnLFxuICAnXFx1MDRDNyc6ICduJyxcbiAgJ1xcdTA0QzgnOiAnbicsXG4gICdcXHUwNEM5JzogJ24nLFxuICAnXFx1MDRDQSc6ICduJyxcbiAgJ1xcdTA0Q0InOiAnYycsXG4gICdcXHUwNENDJzogJ2MnLFxuICAnXFx1MDREMCc6ICdhJyxcbiAgJ1xcdTA0RDEnOiAnYScsXG4gICdcXHUwNEQyJzogJ2EnLFxuICAnXFx1MDREMyc6ICdhJyxcbiAgJ1xcdTA0RDQnOiAnYWUnLFxuICAnXFx1MDRENSc6ICdhZScsXG4gICdcXHUwNEQ2JzogJ2UnLFxuICAnXFx1MDRENyc6ICdlJyxcbiAgJ1xcdTA0RDgnOiAnYScsXG4gICdcXHUwNEQ5JzogJ2EnLFxuICAnXFx1MDREQSc6ICdhJyxcbiAgJ1xcdTA0REInOiAnYScsXG4gICdcXHUwNERDJzogJ3onLFxuICAnXFx1MDRERCc6ICd6JyxcbiAgJ1xcdTA0REUnOiAneicsXG4gICdcXHUwNERGJzogJ3onLFxuICAnXFx1MDRFMCc6ICd6JyxcbiAgJ1xcdTA0RTEnOiAneicsXG4gICdcXHUwNEUyJzogJ2knLFxuICAnXFx1MDRFMyc6ICdpJyxcbiAgJ1xcdTA0RTQnOiAnaScsXG4gICdcXHUwNEU1JzogJ2knLFxuICAnXFx1MDRFNic6ICdvJyxcbiAgJ1xcdTA0RTcnOiAnbycsXG4gICdcXHUwNEU4JzogJ28nLFxuICAnXFx1MDRFOSc6ICdvJyxcbiAgJ1xcdTA0RUEnOiAnbycsXG4gICdcXHUwNEVCJzogJ28nLFxuICAnXFx1MDRFRSc6ICd1JyxcbiAgJ1xcdTA0RUYnOiAndScsXG4gICdcXHUwNEYwJzogJ3UnLFxuICAnXFx1MDRGMSc6ICd1JyxcbiAgJ1xcdTA0RjInOiAndScsXG4gICdcXHUwNEYzJzogJ3UnLFxuICAnXFx1MDRGNCc6ICdjJyxcbiAgJ1xcdTA0RjUnOiAnYycsXG4gICdcXHUwNEY4JzogJ3knLFxuICAnXFx1MDRGOSc6ICd5JyxcbiAgJ1xcdTA1MEEnOiAnbicsXG4gICdcXHUwNTBCJzogJ24nLFxuICAnXFx1MDUwRSc6ICd0JyxcbiAgJ1xcdTA1MEYnOiAndCcsXG4gICdcXHUwNTFBJzogJ3EnLFxuICAnXFx1MDUxQic6ICdxJyxcbiAgJ1xcdTA1MUMnOiAndycsXG4gICdcXHUwNTFEJzogJ3cnLFxufTtcbiIsCiAgICAiLyoqXG4gKiDmloflrZfliJfjg6bjg7zjg4bjgqPjg6rjg4bjgqNcbiAqL1xuXG5pbXBvcnQgeyBzcGVjaWFsQ2hhck1hcCB9IGZyb20gJy4vdGFibGUvY2hhci10YWJsZSc7XG5cbi8qKlxuICog5paH5a2X5YiX44KSVW5peOW9ouW8j+OBq+WkieaPm+OBmeOCi1xuICpcbiAqIGxlZ2FjeSB3aWtpZG9044Gu5a6f6KOF44Gr5ZCI44KP44Gb44Gf5aSJ5o+b44KS6KGM44GG44CCXG4gKiAtIOeJueauiuaWh+Wtl+OCkkFTQ0lJ5paH5a2X44Gr5aSJ5o+bXG4gKiAtIOWwj+aWh+Wtl+OBq+WkieaPm1xuICogLSBBU0NJSeS7peWkluOBruaWh+Wtl+OCkuODj+OCpOODleODs+OBq+WkieaPm1xuICogLSDpgKPntprjgZnjgovjg4/jgqTjg5Xjg7Mv44Kz44Ot44Oz44KS5Y2Y5LiA44GrXG4gKiAtIOWFiOmgrS/mnKvlsL7jga7jg4/jgqTjg5Xjg7Mv44Kz44Ot44Oz44KS5YmK6ZmkXG4gKlxuICogQHBhcmFtIHRhcmdldFN0ciAtIOWkieaPm+WvvuixoeOBruaWh+Wtl+WIl1xuICogQHJldHVybnMg5aSJ5o+b44GV44KM44Gf5paH5a2X5YiXXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b1VuaXgodGFyZ2V0U3RyOiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyDnibnmrormloflrZfjga7lpInmj5tcbiAgbGV0IHJlc3VsdCA9ICcnO1xuICBmb3IgKGNvbnN0IGNoYXIgb2YgdGFyZ2V0U3RyKSB7XG4gICAgY29uc3QgbWFwcGVkID0gc3BlY2lhbENoYXJNYXBbY2hhcl07XG4gICAgcmVzdWx0ICs9IG1hcHBlZCAhPT0gdW5kZWZpbmVkID8gbWFwcGVkIDogY2hhcjtcbiAgfVxuXG4gIC8vIGxvd2VyY2FzZeOBuOOBruWkieaPm1xuICByZXN1bHQgPSByZXN1bHQudG9Mb3dlckNhc2UoKTtcblxuICAvLyBhc2NpaeS7peWkluOBruaWh+Wtl+OCkuWJiumZpFxuICByZXN1bHQgPSByZXN1bHQucmVwbGFjZSgvW15hLXowLTlcXC06X10vZywgJy0nKTtcbiAgcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2UoL15fLywgJzpfJyk7XG4gIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKC8oPzwhOilfL2csICctJyk7XG4gIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKC9eLSovLCAnJyk7XG4gIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKC8tKiQvLCAnJyk7XG4gIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKC8tezIsfS9nLCAnLScpO1xuICByZXN1bHQgPSByZXN1bHQucmVwbGFjZSgvOnsyLH0vZywgJzonKTtcbiAgcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2UoLzotL2csICc6Jyk7XG4gIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKC8tOi9nLCAnOicpO1xuICByZXN1bHQgPSByZXN1bHQucmVwbGFjZSgvXy0vZywgJ18nKTtcbiAgcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2UoLy1fL2csICdfJyk7XG5cbiAgLy8g5YWI6aCt44Go5pyr5bC+44GuOuOCkuWJiumZpFxuICByZXN1bHQgPSByZXN1bHQucmVwbGFjZSgvXjovLCAnJyk7XG4gIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKC86JC8sICcnKTtcblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIFN0cmluZ1V0aWzjgq/jg6njgrnvvIhQeXRob27kupLmj5vvvIlcbiAqL1xuZXhwb3J0IGNvbnN0IFN0cmluZ1V0aWwgPSB7XG4gIHRvVW5peCxcbn07XG4iLAogICAgImltcG9ydCB0eXBlIHsgVXNlciB9IGZyb20gJy4vdXNlcic7XG5cbi8qKlxuICog44Om44O844K244O844Kz44Os44Kv44K344On44OzXG4gKi9cbmV4cG9ydCBjbGFzcyBVc2VyQ29sbGVjdGlvbiBleHRlbmRzIEFycmF5PFVzZXIgfCBudWxsPiB7XG4gIGNvbnN0cnVjdG9yKHVzZXJzPzogKFVzZXIgfCBudWxsKVtdKSB7XG4gICAgc3VwZXIoKTtcbiAgICBpZiAodXNlcnMpIHtcbiAgICAgIHRoaXMucHVzaCguLi51c2Vycyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOODpuODvOOCtuODvOWQjeOBp+aknOe0olxuICAgKiBAcGFyYW0gbmFtZSAtIOODpuODvOOCtuODvOWQjVxuICAgKiBAcmV0dXJucyDjg6bjg7zjgrbjg7zjgb7jgZ/jga91bmRlZmluZWRcbiAgICovXG4gIGZpbmRCeU5hbWUobmFtZTogc3RyaW5nKTogVXNlciB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgbG93ZXJOYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIGZvciAoY29uc3QgdXNlciBvZiB0aGlzKSB7XG4gICAgICBpZiAodXNlciAmJiB1c2VyLm5hbWUudG9Mb3dlckNhc2UoKSA9PT0gbG93ZXJOYW1lKSB7XG4gICAgICAgIHJldHVybiB1c2VyO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIOODpuODvOOCtuODvElE44Gn5qSc57SiXG4gICAqIEBwYXJhbSBpZCAtIOODpuODvOOCtuODvElEXG4gICAqIEByZXR1cm5zIOODpuODvOOCtuODvOOBvuOBn+OBr3VuZGVmaW5lZFxuICAgKi9cbiAgZmluZEJ5SWQoaWQ6IG51bWJlcik6IFVzZXIgfCB1bmRlZmluZWQge1xuICAgIGZvciAoY29uc3QgdXNlciBvZiB0aGlzKSB7XG4gICAgICBpZiAodXNlciAmJiB1c2VyLmlkID09PSBpZCkge1xuICAgICAgICByZXR1cm4gdXNlcjtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBudWxs44KS6Zmk44GE44Gf44Om44O844K244O844Gu44G/44KS6L+U44GZXG4gICAqIEByZXR1cm5zIG51bGzku6XlpJbjga7jg6bjg7zjgrbjg7zphY3liJdcbiAgICovXG4gIGZpbHRlck5vbk51bGwoKTogVXNlcltdIHtcbiAgICByZXR1cm4gdGhpcy5maWx0ZXIoKHVzZXIpOiB1c2VyIGlzIFVzZXIgPT4gdXNlciAhPT0gbnVsbCk7XG4gIH1cbn1cbiIsCiAgICAiaW1wb3J0ICogYXMgY2hlZXJpbyBmcm9tICdjaGVlcmlvJztcbmltcG9ydCBwTGltaXQgZnJvbSAncC1saW1pdCc7XG5pbXBvcnQgeyBOb0VsZW1lbnRFcnJvciwgTm90Rm91bmRFeGNlcHRpb24sIFVuZXhwZWN0ZWRFcnJvciB9IGZyb20gJy4uLy4uL2NvbW1vbi9lcnJvcnMnO1xuaW1wb3J0IHsgZnJvbVByb21pc2UsIHR5cGUgV2lraWRvdFJlc3VsdEFzeW5jIH0gZnJvbSAnLi4vLi4vY29tbW9uL3R5cGVzJztcbmltcG9ydCB7IERFRkFVTFRfQU1DX0NPTkZJRyB9IGZyb20gJy4uLy4uL2Nvbm5lY3Rvci9hbWMtY29uZmlnJztcbmltcG9ydCB7IHRvVW5peCB9IGZyb20gJy4uLy4uL3V0aWwvc3RyaW5nLXV0aWwnO1xuaW1wb3J0IHR5cGUgeyBDbGllbnRSZWYgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgdHlwZSB7IEFic3RyYWN0VXNlciwgVXNlclR5cGUgfSBmcm9tICcuL2Fic3RyYWN0LXVzZXInO1xuaW1wb3J0IHsgVXNlckNvbGxlY3Rpb24gfSBmcm9tICcuL3VzZXItY29sbGVjdGlvbic7XG5cbi8qKlxuICog44Om44O844K244O844OH44O844K/XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXNlckRhdGEge1xuICBpZDogbnVtYmVyO1xuICBuYW1lOiBzdHJpbmc7XG4gIGRpc3BsYXlOYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgYXZhdGFyVXJsPzogc3RyaW5nIHwgbnVsbDtcbiAgdW5peE5hbWU/OiBzdHJpbmc7XG59XG5cbi8qKlxuICog6YCa5bi444Om44O844K244O8XG4gKi9cbmV4cG9ydCBjbGFzcyBVc2VyIGltcGxlbWVudHMgQWJzdHJhY3RVc2VyIHtcbiAgcHVibGljIHJlYWRvbmx5IGNsaWVudDogQ2xpZW50UmVmO1xuXG4gIC8qKiDjg6bjg7zjgrbjg7xJRCAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaWQ6IG51bWJlcjtcblxuICAvKiog44Om44O844K244O85ZCNICovXG4gIHB1YmxpYyByZWFkb25seSBuYW1lOiBzdHJpbmc7XG5cbiAgLyoqIOihqOekuuWQjSAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZGlzcGxheU5hbWU6IHN0cmluZyB8IG51bGw7XG5cbiAgLyoqIOOCouODkOOCv+ODvFVSTCAqL1xuICBwdWJsaWMgcmVhZG9ubHkgYXZhdGFyVXJsOiBzdHJpbmcgfCBudWxsO1xuXG4gIC8qKiBVTklY5b2i5byP44Gu44Om44O844K244O85ZCNICovXG4gIHB1YmxpYyByZWFkb25seSB1bml4TmFtZTogc3RyaW5nO1xuXG4gIC8qKiBJUOOCouODieODrOOCue+8iOmAmuW4uOODpuODvOOCtuODvOOBp+OBr251bGzvvIkgKi9cbiAgcHVibGljIHJlYWRvbmx5IGlwOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICAvKiog44Om44O844K244O856iu5YilICovXG4gIHB1YmxpYyByZWFkb25seSB1c2VyVHlwZTogVXNlclR5cGUgPSAndXNlcic7XG5cbiAgY29uc3RydWN0b3IoY2xpZW50OiBDbGllbnRSZWYsIGRhdGE6IFVzZXJEYXRhKSB7XG4gICAgdGhpcy5jbGllbnQgPSBjbGllbnQ7XG4gICAgdGhpcy5pZCA9IGRhdGEuaWQ7XG4gICAgdGhpcy5uYW1lID0gZGF0YS5uYW1lO1xuICAgIHRoaXMuZGlzcGxheU5hbWUgPSBkYXRhLmRpc3BsYXlOYW1lID8/IG51bGw7XG4gICAgdGhpcy5hdmF0YXJVcmwgPSBkYXRhLmF2YXRhclVybCA/PyBgaHR0cHM6Ly93d3cud2lraWRvdC5jb20vYXZhdGFyLnBocD91c2VyaWQ9JHtkYXRhLmlkfWA7XG4gICAgdGhpcy51bml4TmFtZSA9IGRhdGEudW5peE5hbWUgPz8gdG9Vbml4KGRhdGEubmFtZSk7XG4gIH1cblxuICAvKipcbiAgICog44Om44O844K244O85ZCN44GL44KJ44Om44O844K244O844KS5Y+W5b6X44GZ44KLXG4gICAqIEBwYXJhbSBjbGllbnQgLSDjgq/jg6njgqTjgqLjg7Pjg4hcbiAgICogQHBhcmFtIG5hbWUgLSDjg6bjg7zjgrbjg7zlkI1cbiAgICogQHJldHVybnMg44Om44O844K244O877yI5a2Y5Zyo44GX44Gq44GE5aC05ZCI44GvbnVsbO+8iVxuICAgKi9cbiAgc3RhdGljIGZyb21OYW1lKGNsaWVudDogQ2xpZW50UmVmLCBuYW1lOiBzdHJpbmcpOiBXaWtpZG90UmVzdWx0QXN5bmM8VXNlciB8IG51bGw+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCB1bml4TmFtZSA9IHRvVW5peChuYW1lKTtcbiAgICAgICAgY29uc3QgdXJsID0gYGh0dHBzOi8vd3d3Lndpa2lkb3QuY29tL3VzZXI6aW5mby8ke3VuaXhOYW1lfWA7XG5cbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwpO1xuICAgICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGZldGNoIHVzZXIgaW5mbzogJHtyZXNwb25zZS5zdGF0dXN9YCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBodG1sID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xuICAgICAgICBjb25zdCAkID0gY2hlZXJpby5sb2FkKGh0bWwpO1xuXG4gICAgICAgIC8vIOWtmOWcqOODgeOCp+ODg+OCr1xuICAgICAgICBpZiAoJCgnZGl2LmVycm9yLWJsb2NrJykubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gaWTlj5blvpdcbiAgICAgICAgY29uc3QgdXNlcklkRWxlbSA9ICQoJ2EuYnRuLmJ0bi1kZWZhdWx0LmJ0bi14cycpO1xuICAgICAgICBpZiAodXNlcklkRWxlbS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgTm9FbGVtZW50RXJyb3IoJ1VzZXIgSUQgZWxlbWVudCBub3QgZm91bmQnKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBocmVmID0gdXNlcklkRWxlbS5hdHRyKCdocmVmJyk7XG4gICAgICAgIGlmICghaHJlZikge1xuICAgICAgICAgIHRocm93IG5ldyBOb0VsZW1lbnRFcnJvcignVXNlciBJRCBocmVmIG5vdCBmb3VuZCcpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVzZXJJZCA9IE51bWJlci5wYXJzZUludChocmVmLnNwbGl0KCcvJykucG9wKCkgPz8gJzAnLCAxMCk7XG5cbiAgICAgICAgLy8gbmFtZeWPluW+l1xuICAgICAgICBjb25zdCBuYW1lRWxlbSA9ICQoJ2gxLnByb2ZpbGUtdGl0bGUnKTtcbiAgICAgICAgaWYgKG5hbWVFbGVtLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHRocm93IG5ldyBOb0VsZW1lbnRFcnJvcignVXNlciBuYW1lIGVsZW1lbnQgbm90IGZvdW5kJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXNlck5hbWUgPSBuYW1lRWxlbS50ZXh0KCkudHJpbSgpO1xuXG4gICAgICAgIHJldHVybiBuZXcgVXNlcihjbGllbnQsIHtcbiAgICAgICAgICBpZDogdXNlcklkLFxuICAgICAgICAgIG5hbWU6IHVzZXJOYW1lLFxuICAgICAgICAgIHVuaXhOYW1lLFxuICAgICAgICB9KTtcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgTm90Rm91bmRFeGNlcHRpb24gfHwgZXJyb3IgaW5zdGFuY2VvZiBOb0VsZW1lbnRFcnJvcikge1xuICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGdldCB1c2VyOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDopIfmlbDjg6bjg7zjgrbjg7zlkI3jgYvjgonjg6bjg7zjgrbjg7zjgpLlj5blvpfjgZnjgotcbiAgICogQHBhcmFtIGNsaWVudCAtIOOCr+ODqeOCpOOCouODs+ODiFxuICAgKiBAcGFyYW0gbmFtZXMgLSDjg6bjg7zjgrbjg7zlkI3phY3liJdcbiAgICogQHJldHVybnMg44Om44O844K244O844Kz44Os44Kv44K344On44OzXG4gICAqL1xuICBzdGF0aWMgZnJvbU5hbWVzKGNsaWVudDogQ2xpZW50UmVmLCBuYW1lczogc3RyaW5nW10pOiBXaWtpZG90UmVzdWx0QXN5bmM8VXNlckNvbGxlY3Rpb24+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAvLyDlkIzmmYLmjqXntprmlbDjgpLliLbpmZBcbiAgICAgICAgY29uc3QgbGltaXQgPSBwTGltaXQoREVGQVVMVF9BTUNfQ09ORklHLnNlbWFwaG9yZUxpbWl0KTtcblxuICAgICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgbmFtZXMubWFwKChuYW1lKSA9PlxuICAgICAgICAgICAgbGltaXQoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBVc2VyLmZyb21OYW1lKGNsaWVudCwgbmFtZSk7XG4gICAgICAgICAgICAgIHJldHVybiByZXN1bHQuaXNPaygpID8gcmVzdWx0LnZhbHVlIDogbnVsbDtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gbmV3IFVzZXJDb2xsZWN0aW9uKHJlc3VsdHMpO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGdldCB1c2VyczogJHtTdHJpbmcoZXJyb3IpfWApXG4gICAgKTtcbiAgfVxuXG4gIC8vIEFic3RyYWN0VXNlcuWun+ijhVxuICBpc1VzZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaXNEZWxldGVkVXNlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaXNBbm9ueW1vdXNVc2VyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpc0d1ZXN0VXNlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaXNXaWtpZG90VXNlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiBgVXNlcihpZD0ke3RoaXMuaWR9LCBuYW1lPSR7dGhpcy5uYW1lfSwgdW5peE5hbWU9JHt0aGlzLnVuaXhOYW1lfSlgO1xuICB9XG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgQ2xpZW50UmVmIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHR5cGUgeyBBYnN0cmFjdFVzZXIsIFVzZXJUeXBlIH0gZnJvbSAnLi9hYnN0cmFjdC11c2VyJztcblxuLyoqXG4gKiBXaWtpZG9044K344K544OG44Og44Om44O844K244O8XG4gKi9cbmV4cG9ydCBjbGFzcyBXaWtpZG90VXNlciBpbXBsZW1lbnRzIEFic3RyYWN0VXNlciB7XG4gIHB1YmxpYyByZWFkb25seSBjbGllbnQ6IENsaWVudFJlZjtcblxuICAvKiog44Om44O844K244O8SUTvvIhXaWtpZG9044K344K544OG44Og44GvMO+8iSAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaWQ6IG51bWJlciA9IDA7XG5cbiAgLyoqIOODpuODvOOCtuODvOWQjSAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbmFtZTogc3RyaW5nID0gJ1dpa2lkb3QnO1xuXG4gIC8qKiBVTklY5b2i5byP44Gu44Om44O844K244O85ZCNICovXG4gIHB1YmxpYyByZWFkb25seSB1bml4TmFtZTogc3RyaW5nID0gJ3dpa2lkb3QnO1xuXG4gIC8qKiDjgqLjg5Djgr/jg7xVUkzvvIjjgrfjgrnjg4bjg6Djg6bjg7zjgrbjg7zjga9udWxs77yJICovXG4gIHB1YmxpYyByZWFkb25seSBhdmF0YXJVcmw6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIC8qKiBJUOOCouODieODrOOCue+8iOOCt+OCueODhuODoOODpuODvOOCtuODvOOBr251bGzvvIkgKi9cbiAgcHVibGljIHJlYWRvbmx5IGlwOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICAvKiog44Om44O844K244O856iu5YilICovXG4gIHB1YmxpYyByZWFkb25seSB1c2VyVHlwZTogVXNlclR5cGUgPSAnd2lraWRvdCc7XG5cbiAgY29uc3RydWN0b3IoY2xpZW50OiBDbGllbnRSZWYpIHtcbiAgICB0aGlzLmNsaWVudCA9IGNsaWVudDtcbiAgfVxuXG4gIC8vIEFic3RyYWN0VXNlcuWun+ijhVxuICBpc1VzZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlzRGVsZXRlZFVzZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlzQW5vbnltb3VzVXNlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaXNHdWVzdFVzZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlzV2lraWRvdFVzZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiBgV2lraWRvdFVzZXIobmFtZT0ke3RoaXMubmFtZX0sIHVuaXhOYW1lPSR7dGhpcy51bml4TmFtZX0pYDtcbiAgfVxufVxuIiwKICAgICJleHBvcnQgdHlwZSB7IEFic3RyYWN0VXNlciwgVXNlclR5cGUgfSBmcm9tICcuL2Fic3RyYWN0LXVzZXInO1xuZXhwb3J0IHsgQW5vbnltb3VzVXNlciB9IGZyb20gJy4vYW5vbnltb3VzLXVzZXInO1xuZXhwb3J0IHsgRGVsZXRlZFVzZXIgfSBmcm9tICcuL2RlbGV0ZWQtdXNlcic7XG5leHBvcnQgeyBHdWVzdFVzZXIgfSBmcm9tICcuL2d1ZXN0LXVzZXInO1xuZXhwb3J0IHsgVXNlciwgdHlwZSBVc2VyRGF0YSB9IGZyb20gJy4vdXNlcic7XG5leHBvcnQgeyBVc2VyQ29sbGVjdGlvbiB9IGZyb20gJy4vdXNlci1jb2xsZWN0aW9uJztcbmV4cG9ydCB7IFdpa2lkb3RVc2VyIH0gZnJvbSAnLi93aWtpZG90LXVzZXInO1xuIiwKICAgICJpbXBvcnQgdHlwZSAqIGFzIGNoZWVyaW8gZnJvbSAnY2hlZXJpbyc7XG5pbXBvcnQgdHlwZSB7IEFueU5vZGUgfSBmcm9tICdkb21oYW5kbGVyJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uLy4uL2NvbW1vbi9sb2dnZXInO1xuaW1wb3J0IHR5cGUgeyBDbGllbnRSZWYgfSBmcm9tICcuLi8uLi9tb2R1bGUvdHlwZXMnO1xuaW1wb3J0IHR5cGUgeyBBYnN0cmFjdFVzZXIgfSBmcm9tICcuLi8uLi9tb2R1bGUvdXNlcic7XG5pbXBvcnQgeyBBbm9ueW1vdXNVc2VyLCBEZWxldGVkVXNlciwgR3Vlc3RVc2VyLCBVc2VyLCBXaWtpZG90VXNlciB9IGZyb20gJy4uLy4uL21vZHVsZS91c2VyJztcblxuLyoqXG4gKiBwcmludHVzZXLopoHntKDjgpLjg5Hjg7zjgrnjgZfjgIHjg6bjg7zjgrbjg7zjgqrjg5bjgrjjgqfjgq/jg4jjgpLov5TjgZlcbiAqXG4gKiBAcGFyYW0gY2xpZW50IC0gV2lraWRvdOOCr+ODqeOCpOOCouODs+ODiFxuICogQHBhcmFtIGVsZW0gLSDjg5Hjg7zjgrnlr77osaHjga7opoHntKDvvIhwcmludHVzZXLjgq/jg6njgrnjgYzjgaTjgYTjgZ/opoHntKDvvIlcbiAqIEByZXR1cm5zIOODkeODvOOCueOBleOCjOOBpuW+l+OCieOCjOOBn+ODpuODvOOCtuODvOOCquODluOCuOOCp+OCr+ODiFxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VVc2VyKGNsaWVudDogQ2xpZW50UmVmLCBlbGVtOiBjaGVlcmlvLkNoZWVyaW88QW55Tm9kZT4pOiBBYnN0cmFjdFVzZXIge1xuICBjb25zdCBjbGFzc0F0dHIgPSBlbGVtLmF0dHIoJ2NsYXNzJykgPz8gJyc7XG4gIGNvbnN0IGNsYXNzZXMgPSBjbGFzc0F0dHIuc3BsaXQoL1xccysvKTtcblxuICAvLyDliYrpmaTmuIjjgb/jg6bjg7zjgrbjg7zliKTlrppcbiAgaWYgKGNsYXNzZXMuaW5jbHVkZXMoJ2RlbGV0ZWQnKSkge1xuICAgIGNvbnN0IGRhdGFJZCA9IGVsZW0uYXR0cignZGF0YS1pZCcpO1xuICAgIGNvbnN0IHVzZXJJZCA9IGRhdGFJZCA/IE51bWJlci5wYXJzZUludChkYXRhSWQsIDEwKSA6IDA7XG4gICAgcmV0dXJuIG5ldyBEZWxldGVkVXNlcihjbGllbnQsIHVzZXJJZCk7XG4gIH1cblxuICAvLyDjg4bjgq3jgrnjg4jjgYwgXCIodXNlciBkZWxldGVkKVwiIOOBruWgtOWQiFxuICBjb25zdCB0ZXh0ID0gZWxlbS50ZXh0KCkudHJpbSgpO1xuICBpZiAodGV4dCA9PT0gJyh1c2VyIGRlbGV0ZWQpJykge1xuICAgIHJldHVybiBuZXcgRGVsZXRlZFVzZXIoY2xpZW50LCAwKTtcbiAgfVxuXG4gIC8vIOWMv+WQjeODpuODvOOCtuODvOWIpOWumlxuICBpZiAoY2xhc3Nlcy5pbmNsdWRlcygnYW5vbnltb3VzJykpIHtcbiAgICBjb25zdCBpcEVsZW0gPSBlbGVtLmZpbmQoJ3NwYW4uaXAnKTtcbiAgICBpZiAoaXBFbGVtLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGlwID0gaXBFbGVtLnRleHQoKS5yZXBsYWNlKC9bKCldL2csICcnKS50cmltKCk7XG4gICAgICByZXR1cm4gbmV3IEFub255bW91c1VzZXIoY2xpZW50LCBpcCk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgQW5vbnltb3VzVXNlcihjbGllbnQsICcnKTtcbiAgfVxuXG4gIC8vIOOCsuOCueODiOODpuODvOOCtuODvOWIpOWumu+8iEdyYXZhdGFy44Ki44OQ44K/44O844KS5oyB44Gk77yJXG4gIGNvbnN0IGltZ0VsZW0gPSBlbGVtLmZpbmQoJ2ltZycpO1xuICBpZiAoaW1nRWxlbS5sZW5ndGggPiAwKSB7XG4gICAgY29uc3Qgc3JjID0gaW1nRWxlbS5hdHRyKCdzcmMnKSA/PyAnJztcbiAgICBpZiAoc3JjLmluY2x1ZGVzKCdncmF2YXRhci5jb20nKSkge1xuICAgICAgY29uc3QgZ3Vlc3ROYW1lID0gdGV4dC5zcGxpdCgnICcpWzBdID8/ICdHdWVzdCc7XG4gICAgICByZXR1cm4gbmV3IEd1ZXN0VXNlcihjbGllbnQsIGd1ZXN0TmFtZSwgc3JjKTtcbiAgICB9XG4gIH1cblxuICAvLyBXaWtpZG9044K344K544OG44Og44Om44O844K244O85Yik5a6aXG4gIGlmICh0ZXh0ID09PSAnV2lraWRvdCcpIHtcbiAgICByZXR1cm4gbmV3IFdpa2lkb3RVc2VyKGNsaWVudCk7XG4gIH1cblxuICAvLyDpgJrluLjjg6bjg7zjgrbjg7xcbiAgY29uc3QgbGlua3MgPSBlbGVtLmZpbmQoJ2EnKTtcbiAgaWYgKGxpbmtzLmxlbmd0aCA9PT0gMCkge1xuICAgIC8vIOODquODs+OCr+OBjOOBquOBhOWgtOWQiOOBr0RlbGV0ZWRVc2Vy44Go44GX44Gm5omx44GGXG4gICAgcmV0dXJuIG5ldyBEZWxldGVkVXNlcihjbGllbnQsIDApO1xuICB9XG5cbiAgLy8g5pyA5b6M44Gu44Oq44Oz44Kv44GM44Om44O844K244O844Oq44Oz44KvXG4gIGNvbnN0IHVzZXJMaW5rID0gbGlua3MubGFzdCgpO1xuICBjb25zdCB1c2VyTmFtZSA9IHVzZXJMaW5rLnRleHQoKS50cmltKCk7XG4gIGNvbnN0IGhyZWYgPSB1c2VyTGluay5hdHRyKCdocmVmJykgPz8gJyc7XG4gIGNvbnN0IG9uY2xpY2sgPSB1c2VyTGluay5hdHRyKCdvbmNsaWNrJykgPz8gJyc7XG5cbiAgLy8gdW5peF9uYW1l44KSaHJlZuOBi+OCieaKveWHulxuICBjb25zdCB1bml4TmFtZSA9IGhyZWYucmVwbGFjZSgvXi4qXFwvdXNlcjppbmZvXFwvLywgJycpLnJlcGxhY2UoL1xcLyQvLCAnJyk7XG5cbiAgLy8gdXNlcl9pZOOCkm9uY2xpY2vjgYvjgonmir3lh7pcbiAgLy8g44OR44K/44O844OzOiBcIldJS0lET1QucGFnZS5saXN0ZW5lcnMudXNlckluZm8oMTIzNDU2KTsgcmV0dXJuIGZhbHNlO1wiXG4gIGNvbnN0IHVzZXJJZE1hdGNoID0gb25jbGljay5tYXRjaCgvdXNlckluZm9cXCgoXFxkKylcXCkvKTtcbiAgY29uc3QgdXNlcklkID0gdXNlcklkTWF0Y2g/LlsxXSA/IE51bWJlci5wYXJzZUludCh1c2VySWRNYXRjaFsxXSwgMTApIDogMDtcblxuICAvLyDjgqLjg5Djgr/jg7xVUkzjgpLnlJ/miJBcbiAgY29uc3QgYXZhdGFyVXJsID0gdXNlcklkID4gMCA/IGBodHRwOi8vd3d3Lndpa2lkb3QuY29tL2F2YXRhci5waHA/dXNlcmlkPSR7dXNlcklkfWAgOiB1bmRlZmluZWQ7XG5cbiAgcmV0dXJuIG5ldyBVc2VyKGNsaWVudCwge1xuICAgIGlkOiB1c2VySWQsXG4gICAgbmFtZTogdXNlck5hbWUsXG4gICAgdW5peE5hbWUsXG4gICAgYXZhdGFyVXJsLFxuICB9KTtcbn1cblxuLyoqXG4gKiBvZGF0Zeimgee0oOOBi+OCieaXpeaZguOCkuODkeODvOOCueOBmeOCi1xuICpcbiAqIEBwYXJhbSBlbGVtIC0g44OR44O844K55a++6LGh44Gu6KaB57Sg77yIb2RhdGXopoHntKDvvIlcbiAqIEByZXR1cm5zIOODkeODvOOCueOBleOCjOOBn0RhdGXjgIHjg5Hjg7zjgrnlpLHmlZfmmYLjga9udWxsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZU9kYXRlKGVsZW06IGNoZWVyaW8uQ2hlZXJpbzxBbnlOb2RlPik6IERhdGUgfCBudWxsIHtcbiAgY29uc3QgY2xhc3NBdHRyID0gZWxlbS5hdHRyKCdjbGFzcycpID8/ICcnO1xuXG4gIC8vIOOCr+ODqeOCueOBi+OCiSBVbml4IOOCv+OCpOODoOOCueOCv+ODs+ODl+OCkuaKveWHulxuICAvLyDjg5Hjgr/jg7zjg7M6IFwib2RhdGUgdGltZV8xMjM0NTY3ODkwIGZvcm1hdF8uLi5cIiDjga7jgojjgYbjgarlvaLlvI9cbiAgY29uc3QgdGltZU1hdGNoID0gY2xhc3NBdHRyLm1hdGNoKC90aW1lXyhcXGQrKS8pO1xuICBpZiAodGltZU1hdGNoPy5bMV0pIHtcbiAgICBjb25zdCB1bml4VGltZSA9IE51bWJlci5wYXJzZUludCh0aW1lTWF0Y2hbMV0sIDEwKTtcbiAgICByZXR1cm4gbmV3IERhdGUodW5peFRpbWUgKiAxMDAwKTtcbiAgfVxuXG4gIC8vIOODleOCqeODvOODq+ODkOODg+OCrzog44OG44Kt44K544OI44GL44KJ44OR44O844K5XG4gIGNvbnN0IHRleHQgPSBlbGVtLnRleHQoKS50cmltKCk7XG4gIGNvbnN0IHBhcnNlZCA9IERhdGUucGFyc2UodGV4dCk7XG4gIGlmICghTnVtYmVyLmlzTmFOKHBhcnNlZCkpIHtcbiAgICByZXR1cm4gbmV3IERhdGUocGFyc2VkKTtcbiAgfVxuXG4gIC8vIOODkeODvOOCueOBp+OBjeOBquOBhOWgtOWQiOOBr251bGzjgpLov5TljbTjgZfjgIHorablkYrjgpLjg63jgrDlh7rliptcbiAgbG9nZ2VyLndhcm4oYEZhaWxlZCB0byBwYXJzZSBvZGF0ZSBlbGVtZW50OiBjbGFzcz1cIiR7Y2xhc3NBdHRyfVwiLCB0ZXh0PVwiJHt0ZXh0fVwiYCk7XG4gIHJldHVybiBudWxsO1xufVxuIiwKICAgICJleHBvcnQgeyBwYXJzZU9kYXRlLCBwYXJzZVVzZXIgfSBmcm9tICcuL3VzZXInO1xuIiwKICAgICIvKipcbiAqIOODh+OCs+ODrOODvOOCv+ODpuODvOODhuOCo+ODquODhuOCo1xuICovXG5cbmltcG9ydCB7IExvZ2luUmVxdWlyZWRFcnJvciB9IGZyb20gJy4vZXJyb3JzJztcbmltcG9ydCB7IGZyb21Qcm9taXNlLCB0eXBlIFdpa2lkb3RSZXN1bHRBc3luYywgd2RFcnJBc3luYyB9IGZyb20gJy4vdHlwZXMnO1xuXG4vKipcbiAqIOOCr+ODqeOCpOOCouODs+ODiOWPgueFp+OCkuaMgeOBpOOCquODluOCuOOCp+OCr+ODiOOBruWei1xuICovXG5pbnRlcmZhY2UgSGFzQ2xpZW50IHtcbiAgY2xpZW50PzogeyByZXF1aXJlTG9naW4oKTogeyBpc0VycigpOiBib29sZWFuOyBlcnJvcj86IEVycm9yIH0gfTtcbiAgc2l0ZT86IHsgY2xpZW50OiB7IHJlcXVpcmVMb2dpbigpOiB7IGlzRXJyKCk6IGJvb2xlYW47IGVycm9yPzogRXJyb3IgfSB9IH07XG4gIHRocmVhZD86IHsgc2l0ZTogeyBjbGllbnQ6IHsgcmVxdWlyZUxvZ2luKCk6IHsgaXNFcnIoKTogYm9vbGVhbjsgZXJyb3I/OiBFcnJvciB9IH0gfSB9O1xufVxuXG4vKipcbiAqIOOCquODluOCuOOCp+OCr+ODiOOBi+OCieOCr+ODqeOCpOOCouODs+ODiOWPgueFp+OCkuWPluW+l+OBmeOCi1xuICovXG5mdW5jdGlvbiBnZXRDbGllbnRSZWYoXG4gIG9iajogSGFzQ2xpZW50XG4pOiB7IHJlcXVpcmVMb2dpbigpOiB7IGlzRXJyKCk6IGJvb2xlYW47IGVycm9yPzogRXJyb3IgfSB9IHwgbnVsbCB7XG4gIGlmIChvYmouY2xpZW50KSByZXR1cm4gb2JqLmNsaWVudDtcbiAgaWYgKG9iai5zaXRlPy5jbGllbnQpIHJldHVybiBvYmouc2l0ZS5jbGllbnQ7XG4gIGlmIChvYmoudGhyZWFkPy5zaXRlPy5jbGllbnQpIHJldHVybiBvYmoudGhyZWFkLnNpdGUuY2xpZW50O1xuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqXG4gKiDjg63jgrDjgqTjg7Plv4XpoIjjg6Hjgr3jg4Pjg4njg4fjgrPjg6zjg7zjgr9cbiAqXG4gKiDjgZPjga7jg4fjgrPjg6zjg7zjgr/jgpLpgannlKjjgZfjgZ/jg6Hjgr3jg4Pjg4njga/jgIHlrp/ooYzliY3jgavjg63jgrDjgqTjg7PnirbmhYvjgpLjg4Hjgqfjg4Pjgq/jgZnjgovjgIJcbiAqIOODreOCsOOCpOODs+OBl+OBpuOBhOOBquOBhOWgtOWQiOOBryBMb2dpblJlcXVpcmVkRXJyb3Ig44KS6L+U44GZ44CCXG4gKlxuICogQGV4YW1wbGVcbiAqIGNsYXNzIFBhZ2Uge1xuICogICBAUmVxdWlyZUxvZ2luXG4gKiAgIGRlc3Ryb3koKTogV2lraWRvdFJlc3VsdEFzeW5jPHZvaWQ+IHtcbiAqICAgICByZXR1cm4gZnJvbVByb21pc2UoYXN5bmMgKCkgPT4geyAuLi4gfSwgKGUpID0+IG5ldyBVbmV4cGVjdGVkRXJyb3IoLi4uKSk7XG4gKiAgIH1cbiAqIH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFJlcXVpcmVMb2dpbjxcbiAgVGhpcyBleHRlbmRzIEhhc0NsaWVudCxcbiAgQXJncyBleHRlbmRzIHVua25vd25bXSxcbiAgUmV0dXJuIGV4dGVuZHMgV2lraWRvdFJlc3VsdEFzeW5jPHVua25vd24+LFxuPihcbiAgdGFyZ2V0OiAodGhpczogVGhpcywgLi4uYXJnczogQXJncykgPT4gUmV0dXJuLFxuICBfY29udGV4dDogQ2xhc3NNZXRob2REZWNvcmF0b3JDb250ZXh0PFRoaXMsICh0aGlzOiBUaGlzLCAuLi5hcmdzOiBBcmdzKSA9PiBSZXR1cm4+XG4pOiAodGhpczogVGhpcywgLi4uYXJnczogQXJncykgPT4gUmV0dXJuIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICh0aGlzOiBUaGlzLCAuLi5hcmdzOiBBcmdzKTogUmV0dXJuIHtcbiAgICBjb25zdCBjbGllbnRSZWYgPSBnZXRDbGllbnRSZWYodGhpcyk7XG4gICAgaWYgKCFjbGllbnRSZWYpIHtcbiAgICAgIHJldHVybiB3ZEVyckFzeW5jKG5ldyBMb2dpblJlcXVpcmVkRXJyb3IoJ0NsaWVudCByZWZlcmVuY2Ugbm90IGZvdW5kJykpIGFzIHVua25vd24gYXMgUmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGxvZ2luUmVzdWx0ID0gY2xpZW50UmVmLnJlcXVpcmVMb2dpbigpO1xuICAgIGlmIChsb2dpblJlc3VsdC5pc0VycigpKSB7XG4gICAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAgIFByb21pc2UucmVqZWN0KGxvZ2luUmVzdWx0LmVycm9yKSxcbiAgICAgICAgKCkgPT4gbmV3IExvZ2luUmVxdWlyZWRFcnJvcignTG9naW4gcmVxdWlyZWQnKVxuICAgICAgKSBhcyB1bmtub3duIGFzIFJldHVybjtcbiAgICB9XG5cbiAgICByZXR1cm4gdGFyZ2V0LmNhbGwodGhpcywgLi4uYXJncyk7XG4gIH07XG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgQ2hlZXJpbywgQ2hlZXJpb0FQSSB9IGZyb20gJ2NoZWVyaW8nO1xuaW1wb3J0ICogYXMgY2hlZXJpbyBmcm9tICdjaGVlcmlvJztcbmltcG9ydCB0eXBlIHsgQW55Tm9kZSwgRWxlbWVudCB9IGZyb20gJ2RvbWhhbmRsZXInO1xuaW1wb3J0IHsgUmVxdWlyZUxvZ2luIH0gZnJvbSAnLi4vLi4vY29tbW9uL2RlY29yYXRvcnMnO1xuaW1wb3J0IHsgTG9naW5SZXF1aXJlZEVycm9yLCBOb0VsZW1lbnRFcnJvciwgVW5leHBlY3RlZEVycm9yIH0gZnJvbSAnLi4vLi4vY29tbW9uL2Vycm9ycyc7XG5pbXBvcnQgeyBmcm9tUHJvbWlzZSwgdHlwZSBXaWtpZG90UmVzdWx0QXN5bmMgfSBmcm9tICcuLi8uLi9jb21tb24vdHlwZXMnO1xuaW1wb3J0IHsgcGFyc2VPZGF0ZSwgcGFyc2VVc2VyIH0gZnJvbSAnLi4vLi4vdXRpbC9wYXJzZXInO1xuaW1wb3J0IHR5cGUgeyBDbGllbnQgfSBmcm9tICcuLi9jbGllbnQnO1xuaW1wb3J0IHR5cGUgeyBGb3J1bVRocmVhZFJlZiB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB0eXBlIHsgQWJzdHJhY3RVc2VyIH0gZnJvbSAnLi4vdXNlcic7XG5cbi8qKlxuICog44OV44Kp44O844Op44Og5oqV56i/44OH44O844K/XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRm9ydW1Qb3N0RGF0YSB7XG4gIHRocmVhZDogRm9ydW1UaHJlYWRSZWY7XG4gIGlkOiBudW1iZXI7XG4gIHRpdGxlOiBzdHJpbmc7XG4gIHRleHQ6IHN0cmluZztcbiAgZWxlbWVudDogRWxlbWVudDtcbiAgY3JlYXRlZEJ5OiBBYnN0cmFjdFVzZXI7XG4gIGNyZWF0ZWRBdDogRGF0ZTtcbiAgZWRpdGVkQnk/OiBBYnN0cmFjdFVzZXIgfCBudWxsO1xuICBlZGl0ZWRBdD86IERhdGUgfCBudWxsO1xuICBwYXJlbnRJZD86IG51bWJlciB8IG51bGw7XG59XG5cbi8qKlxuICog44OV44Kp44O844Op44Og5oqV56i/XG4gKi9cbmV4cG9ydCBjbGFzcyBGb3J1bVBvc3Qge1xuICBwdWJsaWMgcmVhZG9ubHkgdGhyZWFkOiBGb3J1bVRocmVhZFJlZjtcbiAgcHVibGljIHJlYWRvbmx5IGlkOiBudW1iZXI7XG4gIHB1YmxpYyB0aXRsZTogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgdGV4dDogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgZWxlbWVudDogRWxlbWVudDtcbiAgcHVibGljIHJlYWRvbmx5IGNyZWF0ZWRCeTogQWJzdHJhY3RVc2VyO1xuICBwdWJsaWMgcmVhZG9ubHkgY3JlYXRlZEF0OiBEYXRlO1xuICBwdWJsaWMgcmVhZG9ubHkgZWRpdGVkQnk6IEFic3RyYWN0VXNlciB8IG51bGw7XG4gIHB1YmxpYyByZWFkb25seSBlZGl0ZWRBdDogRGF0ZSB8IG51bGw7XG4gIHByaXZhdGUgX3BhcmVudElkOiBudW1iZXIgfCBudWxsO1xuICBwcml2YXRlIF9zb3VyY2U6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKGRhdGE6IEZvcnVtUG9zdERhdGEpIHtcbiAgICB0aGlzLnRocmVhZCA9IGRhdGEudGhyZWFkO1xuICAgIHRoaXMuaWQgPSBkYXRhLmlkO1xuICAgIHRoaXMudGl0bGUgPSBkYXRhLnRpdGxlO1xuICAgIHRoaXMudGV4dCA9IGRhdGEudGV4dDtcbiAgICB0aGlzLmVsZW1lbnQgPSBkYXRhLmVsZW1lbnQ7XG4gICAgdGhpcy5jcmVhdGVkQnkgPSBkYXRhLmNyZWF0ZWRCeTtcbiAgICB0aGlzLmNyZWF0ZWRBdCA9IGRhdGEuY3JlYXRlZEF0O1xuICAgIHRoaXMuZWRpdGVkQnkgPSBkYXRhLmVkaXRlZEJ5ID8/IG51bGw7XG4gICAgdGhpcy5lZGl0ZWRBdCA9IGRhdGEuZWRpdGVkQXQgPz8gbnVsbDtcbiAgICB0aGlzLl9wYXJlbnRJZCA9IGRhdGEucGFyZW50SWQgPz8gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiDopqrmipXnqL9JRFxuICAgKi9cbiAgZ2V0IHBhcmVudElkKCk6IG51bWJlciB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9wYXJlbnRJZDtcbiAgfVxuXG4gIC8qKlxuICAgKiDjgr3jg7zjgrnjgrPjg7zjg4nvvIhXaWtpZG906KiY5rOV77yJ44KS5Y+W5b6XXG4gICAqL1xuICBnZXRTb3VyY2UoKTogV2lraWRvdFJlc3VsdEFzeW5jPHN0cmluZz4ge1xuICAgIGlmICh0aGlzLl9zb3VyY2UgIT09IG51bGwpIHtcbiAgICAgIHJldHVybiBmcm9tUHJvbWlzZShQcm9taXNlLnJlc29sdmUodGhpcy5fc291cmNlKSwgKGUpID0+IG5ldyBVbmV4cGVjdGVkRXJyb3IoU3RyaW5nKGUpKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy50aHJlYWQuc2l0ZS5hbWNSZXF1ZXN0KFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBtb2R1bGVOYW1lOiAnZm9ydW0vc3ViL0ZvcnVtRWRpdFBvc3RGb3JtTW9kdWxlJyxcbiAgICAgICAgICAgIHRocmVhZElkOiB0aGlzLnRocmVhZC5pZCxcbiAgICAgICAgICAgIHBvc3RJZDogdGhpcy5pZCxcbiAgICAgICAgICB9LFxuICAgICAgICBdKTtcblxuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXNwb25zZSA9IHJlc3VsdC52YWx1ZVswXTtcbiAgICAgICAgaWYgKCFyZXNwb25zZSkge1xuICAgICAgICAgIHRocm93IG5ldyBOb0VsZW1lbnRFcnJvcignRW1wdHkgcmVzcG9uc2UnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0ICQgPSBjaGVlcmlvLmxvYWQoU3RyaW5nKHJlc3BvbnNlLmJvZHkgPz8gJycpKTtcbiAgICAgICAgY29uc3Qgc291cmNlRWxlbSA9ICQoXCJ0ZXh0YXJlYVtuYW1lPSdzb3VyY2UnXVwiKTtcbiAgICAgICAgaWYgKHNvdXJjZUVsZW0ubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IE5vRWxlbWVudEVycm9yKCdTb3VyY2UgdGV4dGFyZWEgbm90IGZvdW5kJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fc291cmNlID0gc291cmNlRWxlbS50ZXh0KCk7XG4gICAgICAgIHJldHVybiB0aGlzLl9zb3VyY2U7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIE5vRWxlbWVudEVycm9yKSByZXR1cm4gZXJyb3I7XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gZ2V0IHBvc3Qgc291cmNlOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmipXnqL/jgpLnt6jpm4bjgZnjgotcbiAgICogQHBhcmFtIHNvdXJjZSAtIOaWsOOBl+OBhOOCveODvOOCue+8iFdpa2lkb3ToqJjms5XvvIlcbiAgICogQHBhcmFtIHRpdGxlIC0g5paw44GX44GE44K/44Kk44OI44Or77yI55yB55Wl5pmC44Gv54++5Zyo44Gu44K/44Kk44OI44Or44KS57at5oyB77yJXG4gICAqL1xuICBAUmVxdWlyZUxvZ2luXG4gIGVkaXQoc291cmNlOiBzdHJpbmcsIHRpdGxlPzogc3RyaW5nKTogV2lraWRvdFJlc3VsdEFzeW5jPHZvaWQ+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAvLyDnj77lnKjjga7jg6rjg5Pjgrjjg6fjg7NJROOCkuWPluW+l1xuICAgICAgICBjb25zdCBmb3JtUmVzdWx0ID0gYXdhaXQgdGhpcy50aHJlYWQuc2l0ZS5hbWNSZXF1ZXN0KFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBtb2R1bGVOYW1lOiAnZm9ydW0vc3ViL0ZvcnVtRWRpdFBvc3RGb3JtTW9kdWxlJyxcbiAgICAgICAgICAgIHRocmVhZElkOiB0aGlzLnRocmVhZC5pZCxcbiAgICAgICAgICAgIHBvc3RJZDogdGhpcy5pZCxcbiAgICAgICAgICB9LFxuICAgICAgICBdKTtcblxuICAgICAgICBpZiAoZm9ybVJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgZm9ybVJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZvcm1SZXNwb25zZSA9IGZvcm1SZXN1bHQudmFsdWVbMF07XG4gICAgICAgIGlmICghZm9ybVJlc3BvbnNlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IE5vRWxlbWVudEVycm9yKCdFbXB0eSBmb3JtIHJlc3BvbnNlJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCAkID0gY2hlZXJpby5sb2FkKFN0cmluZyhmb3JtUmVzcG9uc2UuYm9keSA/PyAnJykpO1xuICAgICAgICBjb25zdCByZXZpc2lvbklucHV0ID0gJChcImlucHV0W25hbWU9J2N1cnJlbnRSZXZpc2lvbklkJ11cIik7XG4gICAgICAgIGlmIChyZXZpc2lvbklucHV0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHRocm93IG5ldyBOb0VsZW1lbnRFcnJvcignQ3VycmVudCByZXZpc2lvbiBJRCBpbnB1dCBub3QgZm91bmQnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJldmlzaW9uVmFsdWUgPSByZXZpc2lvbklucHV0LnZhbCgpO1xuICAgICAgICBjb25zdCBjdXJyZW50UmV2aXNpb25JZCA9IE51bWJlci5wYXJzZUludChTdHJpbmcocmV2aXNpb25WYWx1ZSA/PyAnJyksIDEwKTtcbiAgICAgICAgaWYgKE51bWJlci5pc05hTihjdXJyZW50UmV2aXNpb25JZCkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgTm9FbGVtZW50RXJyb3IoJ0ludmFsaWQgcmV2aXNpb24gSUQgdmFsdWUnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIOe3qOmbhuOCkuS/neWtmFxuICAgICAgICBjb25zdCBlZGl0UmVzdWx0ID0gYXdhaXQgdGhpcy50aHJlYWQuc2l0ZS5hbWNSZXF1ZXN0KFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhY3Rpb246ICdGb3J1bUFjdGlvbicsXG4gICAgICAgICAgICBldmVudDogJ3NhdmVFZGl0UG9zdCcsXG4gICAgICAgICAgICBtb2R1bGVOYW1lOiAnRW1wdHknLFxuICAgICAgICAgICAgcG9zdElkOiB0aGlzLmlkLFxuICAgICAgICAgICAgY3VycmVudFJldmlzaW9uSWQsXG4gICAgICAgICAgICB0aXRsZTogdGl0bGUgPz8gdGhpcy50aXRsZSxcbiAgICAgICAgICAgIHNvdXJjZSxcbiAgICAgICAgICB9LFxuICAgICAgICBdKTtcblxuICAgICAgICBpZiAoZWRpdFJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgZWRpdFJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIOODreODvOOCq+ODq+eKtuaFi+OCkuabtOaWsFxuICAgICAgICBpZiAodGl0bGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRoaXMudGl0bGUgPSB0aXRsZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9zb3VyY2UgPSBzb3VyY2U7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIE5vRWxlbWVudEVycm9yIHx8IGVycm9yIGluc3RhbmNlb2YgTG9naW5SZXF1aXJlZEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gZWRpdCBwb3N0OiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBGb3J1bVBvc3QoaWQ9JHt0aGlzLmlkfSwgdGl0bGU9JHt0aGlzLnRpdGxlfSlgO1xuICB9XG59XG5cbi8qKlxuICog44OV44Kp44O844Op44Og5oqV56i/44Kz44Os44Kv44K344On44OzXG4gKi9cbmV4cG9ydCBjbGFzcyBGb3J1bVBvc3RDb2xsZWN0aW9uIGV4dGVuZHMgQXJyYXk8Rm9ydW1Qb3N0PiB7XG4gIHB1YmxpYyByZWFkb25seSB0aHJlYWQ6IEZvcnVtVGhyZWFkUmVmO1xuXG4gIGNvbnN0cnVjdG9yKHRocmVhZDogRm9ydW1UaHJlYWRSZWYsIHBvc3RzPzogRm9ydW1Qb3N0W10pIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMudGhyZWFkID0gdGhyZWFkO1xuICAgIGlmIChwb3N0cykge1xuICAgICAgdGhpcy5wdXNoKC4uLnBvc3RzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSUTjgafmpJzntKJcbiAgICogQHBhcmFtIGlkIC0g5oqV56i/SURcbiAgICogQHJldHVybnMg5oqV56i/77yI5a2Y5Zyo44GX44Gq44GE5aC05ZCI44GvdW5kZWZpbmVk77yJXG4gICAqL1xuICBmaW5kQnlJZChpZDogbnVtYmVyKTogRm9ydW1Qb3N0IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5maW5kKChwb3N0KSA9PiBwb3N0LmlkID09PSBpZCk7XG4gIH1cblxuICAvKipcbiAgICogSFRNTOOBi+OCieaKleeov+OCkuODkeODvOOCueOBmeOCi++8iOWGhemDqOODoeOCveODg+ODie+8iVxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgX3BhcnNlKHRocmVhZDogRm9ydW1UaHJlYWRSZWYsICQ6IENoZWVyaW9BUEkpOiBGb3J1bVBvc3RbXSB7XG4gICAgY29uc3QgcG9zdHM6IEZvcnVtUG9zdFtdID0gW107XG5cbiAgICAkKCdkaXYucG9zdCcpLmVhY2goKF9pLCBwb3N0RWxlbSkgPT4ge1xuICAgICAgY29uc3QgJHBvc3QgPSAkKHBvc3RFbGVtKTtcbiAgICAgIGNvbnN0IHBvc3RJZEF0dHIgPSAkcG9zdC5hdHRyKCdpZCcpO1xuICAgICAgaWYgKCFwb3N0SWRBdHRyKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IHBvc3RJZCA9IE51bWJlci5wYXJzZUludChwb3N0SWRBdHRyLnJlcGxhY2UoJ3Bvc3QtJywgJycpLCAxMCk7XG4gICAgICBpZiAoTnVtYmVyLmlzTmFOKHBvc3RJZCkpIHJldHVybjtcblxuICAgICAgLy8g6Kaq5oqV56i/SUTjga7lj5blvpdcbiAgICAgIGxldCBwYXJlbnRJZDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gICAgICBjb25zdCAkcGFyZW50Q29udGFpbmVyID0gJHBvc3QucGFyZW50KCk7XG4gICAgICBpZiAoJHBhcmVudENvbnRhaW5lci5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0ICRncmFuZHBhcmVudCA9ICRwYXJlbnRDb250YWluZXIucGFyZW50KCk7XG4gICAgICAgIGlmICgkZ3JhbmRwYXJlbnQubGVuZ3RoID4gMCAmJiAkZ3JhbmRwYXJlbnRbMF0/Lm5hbWUgIT09ICdib2R5Jykge1xuICAgICAgICAgIGNvbnN0IGdyYW5kcGFyZW50Q2xhc3NlcyA9ICRncmFuZHBhcmVudC5hdHRyKCdjbGFzcycpID8/ICcnO1xuICAgICAgICAgIGlmIChncmFuZHBhcmVudENsYXNzZXMuaW5jbHVkZXMoJ3Bvc3QtY29udGFpbmVyJykpIHtcbiAgICAgICAgICAgIGNvbnN0ICRwYXJlbnRQb3N0ID0gJGdyYW5kcGFyZW50LmZpbmQoJz4gZGl2LnBvc3QnKTtcbiAgICAgICAgICAgIGlmICgkcGFyZW50UG9zdC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHBhcmVudFBvc3RJZEF0dHIgPSAkcGFyZW50UG9zdC5hdHRyKCdpZCcpO1xuICAgICAgICAgICAgICBpZiAocGFyZW50UG9zdElkQXR0cikge1xuICAgICAgICAgICAgICAgIHBhcmVudElkID0gTnVtYmVyLnBhcnNlSW50KHBhcmVudFBvc3RJZEF0dHIucmVwbGFjZSgncG9zdC0nLCAnJyksIDEwKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyDjgr/jgqTjg4jjg6vjgajmnKzmlofjga7lj5blvpdcbiAgICAgIGNvbnN0ICR3cmFwcGVyID0gJHBvc3QuZmluZCgnZGl2LmxvbmcnKTtcbiAgICAgIGlmICgkd3JhcHBlci5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgICAgY29uc3QgJGhlYWQgPSAkd3JhcHBlci5maW5kKCdkaXYuaGVhZCcpO1xuICAgICAgaWYgKCRoZWFkLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCAkdGl0bGUgPSAkaGVhZC5maW5kKCdkaXYudGl0bGUnKTtcbiAgICAgIGNvbnN0IHRpdGxlID0gJHRpdGxlLnRleHQoKS50cmltKCk7XG5cbiAgICAgIGNvbnN0ICRjb250ZW50ID0gJHdyYXBwZXIuZmluZCgnZGl2LmNvbnRlbnQnKTtcbiAgICAgIGNvbnN0IHRleHQgPSAkY29udGVudC5odG1sKCkgPz8gJyc7XG5cbiAgICAgIC8vIOaKleeov+iAheOBqOaXpeaZglxuICAgICAgY29uc3QgJGluZm8gPSAkaGVhZC5maW5kKCdkaXYuaW5mbycpO1xuICAgICAgaWYgKCRpbmZvLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCAkdXNlckVsZW0gPSAkaW5mby5maW5kKCdzcGFuLnByaW50dXNlcicpO1xuICAgICAgaWYgKCR1c2VyRWxlbS5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgICAgY29uc3QgY3JlYXRlZEJ5ID0gcGFyc2VVc2VyKHRocmVhZC5zaXRlLmNsaWVudCBhcyBDbGllbnQsICR1c2VyRWxlbSBhcyBDaGVlcmlvPEFueU5vZGU+KTtcblxuICAgICAgY29uc3QgJG9kYXRlRWxlbSA9ICRpbmZvLmZpbmQoJ3NwYW4ub2RhdGUnKTtcbiAgICAgIGlmICgkb2RhdGVFbGVtLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCBjcmVhdGVkQXQgPSBwYXJzZU9kYXRlKCRvZGF0ZUVsZW0gYXMgQ2hlZXJpbzxBbnlOb2RlPikgPz8gbmV3IERhdGUoKTtcblxuICAgICAgLy8g57eo6ZuG5oOF5aCx77yI5a2Y5Zyo44GZ44KL5aC05ZCI77yJXG4gICAgICBsZXQgZWRpdGVkQnk6IEFic3RyYWN0VXNlciB8IG51bGwgPSBudWxsO1xuICAgICAgbGV0IGVkaXRlZEF0OiBEYXRlIHwgbnVsbCA9IG51bGw7XG4gICAgICBjb25zdCAkY2hhbmdlcyA9ICR3cmFwcGVyLmZpbmQoJ2Rpdi5jaGFuZ2VzJyk7XG4gICAgICBpZiAoJGNoYW5nZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCAkZWRpdFVzZXJFbGVtID0gJGNoYW5nZXMuZmluZCgnc3Bhbi5wcmludHVzZXInKTtcbiAgICAgICAgY29uc3QgJGVkaXRPZGF0ZUVsZW0gPSAkY2hhbmdlcy5maW5kKCdzcGFuLm9kYXRlJyk7XG4gICAgICAgIGlmICgkZWRpdFVzZXJFbGVtLmxlbmd0aCA+IDAgJiYgJGVkaXRPZGF0ZUVsZW0ubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGVkaXRlZEJ5ID0gcGFyc2VVc2VyKHRocmVhZC5zaXRlLmNsaWVudCBhcyBDbGllbnQsICRlZGl0VXNlckVsZW0gYXMgQ2hlZXJpbzxBbnlOb2RlPik7XG4gICAgICAgICAgZWRpdGVkQXQgPSBwYXJzZU9kYXRlKCRlZGl0T2RhdGVFbGVtIGFzIENoZWVyaW88QW55Tm9kZT4pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHBvc3RzLnB1c2goXG4gICAgICAgIG5ldyBGb3J1bVBvc3Qoe1xuICAgICAgICAgIHRocmVhZCxcbiAgICAgICAgICBpZDogcG9zdElkLFxuICAgICAgICAgIHRpdGxlLFxuICAgICAgICAgIHRleHQsXG4gICAgICAgICAgZWxlbWVudDogcG9zdEVsZW0gYXMgRWxlbWVudCxcbiAgICAgICAgICBjcmVhdGVkQnksXG4gICAgICAgICAgY3JlYXRlZEF0LFxuICAgICAgICAgIGVkaXRlZEJ5LFxuICAgICAgICAgIGVkaXRlZEF0LFxuICAgICAgICAgIHBhcmVudElkLFxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBwb3N0cztcbiAgfVxuXG4gIC8qKlxuICAgKiDjgrnjg6zjg4Pjg4nlhoXjga7lhajmipXnqL/jgpLlj5blvpdcbiAgICovXG4gIHN0YXRpYyBhY3F1aXJlQWxsSW5UaHJlYWQodGhyZWFkOiBGb3J1bVRocmVhZFJlZik6IFdpa2lkb3RSZXN1bHRBc3luYzxGb3J1bVBvc3RDb2xsZWN0aW9uPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcG9zdHM6IEZvcnVtUG9zdFtdID0gW107XG5cbiAgICAgICAgY29uc3QgZmlyc3RSZXN1bHQgPSBhd2FpdCB0aHJlYWQuc2l0ZS5hbWNSZXF1ZXN0KFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBtb2R1bGVOYW1lOiAnZm9ydW0vRm9ydW1WaWV3VGhyZWFkUG9zdHNNb2R1bGUnLFxuICAgICAgICAgICAgcGFnZU5vOiAnMScsXG4gICAgICAgICAgICB0OiBTdHJpbmcodGhyZWFkLmlkKSxcbiAgICAgICAgICB9LFxuICAgICAgICBdKTtcblxuICAgICAgICBpZiAoZmlyc3RSZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IGZpcnN0UmVzdWx0LmVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZmlyc3RSZXNwb25zZSA9IGZpcnN0UmVzdWx0LnZhbHVlWzBdO1xuICAgICAgICBpZiAoIWZpcnN0UmVzcG9uc2UpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgTm9FbGVtZW50RXJyb3IoJ0VtcHR5IHJlc3BvbnNlJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmaXJzdEJvZHkgPSBTdHJpbmcoZmlyc3RSZXNwb25zZS5ib2R5ID8/ICcnKTtcbiAgICAgICAgY29uc3QgJGZpcnN0ID0gY2hlZXJpby5sb2FkKGZpcnN0Qm9keSk7XG5cbiAgICAgICAgcG9zdHMucHVzaCguLi5Gb3J1bVBvc3RDb2xsZWN0aW9uLl9wYXJzZSh0aHJlYWQsICRmaXJzdCkpO1xuXG4gICAgICAgIC8vIOODmuODvOOCuOODjeODvOOCt+ODp+ODs+eiuuiqjVxuICAgICAgICBjb25zdCAkcGFnZXIgPSAkZmlyc3QoJ2Rpdi5wYWdlcicpO1xuICAgICAgICBpZiAoJHBhZ2VyLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHJldHVybiBuZXcgRm9ydW1Qb3N0Q29sbGVjdGlvbih0aHJlYWQsIHBvc3RzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0ICRwYWdlclRhcmdldHMgPSAkcGFnZXIuZmluZCgnc3Bhbi50YXJnZXQnKTtcbiAgICAgICAgaWYgKCRwYWdlclRhcmdldHMubGVuZ3RoIDwgMikge1xuICAgICAgICAgIHJldHVybiBuZXcgRm9ydW1Qb3N0Q29sbGVjdGlvbih0aHJlYWQsIHBvc3RzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIOacgOW+jOOBi+OCiTLnlarnm67jga7jg5rjg7zjgrjjg6rjg7Pjgq/jgYvjgonmnIDntYLjg5rjg7zjgrjnlarlj7fjgpLlj5blvpdcbiAgICAgICAgY29uc3QgbGFzdFBhZ2VUZXh0ID0gJHBhZ2VyVGFyZ2V0c1xuICAgICAgICAgIC5lcSgkcGFnZXJUYXJnZXRzLmxlbmd0aCAtIDIpXG4gICAgICAgICAgLnRleHQoKVxuICAgICAgICAgIC50cmltKCk7XG4gICAgICAgIGNvbnN0IGxhc3RQYWdlID0gTnVtYmVyLnBhcnNlSW50KGxhc3RQYWdlVGV4dCwgMTApO1xuICAgICAgICBpZiAoTnVtYmVyLmlzTmFOKGxhc3RQYWdlKSB8fCBsYXN0UGFnZSA8PSAxKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBGb3J1bVBvc3RDb2xsZWN0aW9uKHRocmVhZCwgcG9zdHMpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8g5q6L44KK44Gu44Oa44O844K444KS5Y+W5b6XXG4gICAgICAgIGNvbnN0IGJvZGllczogeyBtb2R1bGVOYW1lOiBzdHJpbmc7IHBhZ2VObzogc3RyaW5nOyB0OiBzdHJpbmcgfVtdID0gW107XG4gICAgICAgIGZvciAobGV0IHBhZ2UgPSAyOyBwYWdlIDw9IGxhc3RQYWdlOyBwYWdlKyspIHtcbiAgICAgICAgICBib2RpZXMucHVzaCh7XG4gICAgICAgICAgICBtb2R1bGVOYW1lOiAnZm9ydW0vRm9ydW1WaWV3VGhyZWFkUG9zdHNNb2R1bGUnLFxuICAgICAgICAgICAgcGFnZU5vOiBTdHJpbmcocGFnZSksXG4gICAgICAgICAgICB0OiBTdHJpbmcodGhyZWFkLmlkKSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGFkZGl0aW9uYWxSZXN1bHRzID0gYXdhaXQgdGhyZWFkLnNpdGUuYW1jUmVxdWVzdChib2RpZXMpO1xuICAgICAgICBpZiAoYWRkaXRpb25hbFJlc3VsdHMuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IGFkZGl0aW9uYWxSZXN1bHRzLmVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCByZXNwb25zZSBvZiBhZGRpdGlvbmFsUmVzdWx0cy52YWx1ZSkge1xuICAgICAgICAgIGNvbnN0IGJvZHkgPSBTdHJpbmcocmVzcG9uc2U/LmJvZHkgPz8gJycpO1xuICAgICAgICAgIGNvbnN0ICQgPSBjaGVlcmlvLmxvYWQoYm9keSk7XG4gICAgICAgICAgcG9zdHMucHVzaCguLi5Gb3J1bVBvc3RDb2xsZWN0aW9uLl9wYXJzZSh0aHJlYWQsICQpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgRm9ydW1Qb3N0Q29sbGVjdGlvbih0aHJlYWQsIHBvc3RzKTtcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgTm9FbGVtZW50RXJyb3IpIHJldHVybiBlcnJvcjtcbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBhY3F1aXJlIHBvc3RzOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IENoZWVyaW8gfSBmcm9tICdjaGVlcmlvJztcbmltcG9ydCAqIGFzIGNoZWVyaW8gZnJvbSAnY2hlZXJpbyc7XG5pbXBvcnQgdHlwZSB7IEFueU5vZGUgfSBmcm9tICdkb21oYW5kbGVyJztcbmltcG9ydCB7IFJlcXVpcmVMb2dpbiB9IGZyb20gJy4uLy4uL2NvbW1vbi9kZWNvcmF0b3JzJztcbmltcG9ydCB7IE5vRWxlbWVudEVycm9yLCBVbmV4cGVjdGVkRXJyb3IgfSBmcm9tICcuLi8uLi9jb21tb24vZXJyb3JzJztcbmltcG9ydCB7IGZyb21Qcm9taXNlLCB0eXBlIFdpa2lkb3RSZXN1bHRBc3luYyB9IGZyb20gJy4uLy4uL2NvbW1vbi90eXBlcyc7XG5pbXBvcnQgeyBwYXJzZU9kYXRlLCBwYXJzZVVzZXIgfSBmcm9tICcuLi8uLi91dGlsL3BhcnNlcic7XG5pbXBvcnQgdHlwZSB7IFNpdGUgfSBmcm9tICcuLi9zaXRlJztcbmltcG9ydCB0eXBlIHsgQWJzdHJhY3RVc2VyIH0gZnJvbSAnLi4vdXNlcic7XG5pbXBvcnQgdHlwZSB7IEZvcnVtQ2F0ZWdvcnkgfSBmcm9tICcuL2ZvcnVtLWNhdGVnb3J5JztcbmltcG9ydCB7IEZvcnVtUG9zdENvbGxlY3Rpb24gfSBmcm9tICcuL2ZvcnVtLXBvc3QnO1xuXG4vKipcbiAqIOODleOCqeODvOODqeODoOOCueODrOODg+ODieODh+ODvOOCv1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEZvcnVtVGhyZWFkRGF0YSB7XG4gIHNpdGU6IFNpdGU7XG4gIGlkOiBudW1iZXI7XG4gIHRpdGxlOiBzdHJpbmc7XG4gIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIGNyZWF0ZWRCeTogQWJzdHJhY3RVc2VyIHwgbnVsbDtcbiAgY3JlYXRlZEF0OiBEYXRlO1xuICBwb3N0Q291bnQ6IG51bWJlcjtcbiAgY2F0ZWdvcnk/OiBGb3J1bUNhdGVnb3J5IHwgbnVsbDtcbn1cblxuLyoqXG4gKiDjg5Xjgqnjg7zjg6njg6Djgrnjg6zjg4Pjg4lcbiAqL1xuZXhwb3J0IGNsYXNzIEZvcnVtVGhyZWFkIHtcbiAgcHVibGljIHJlYWRvbmx5IHNpdGU6IFNpdGU7XG4gIHB1YmxpYyByZWFkb25seSBpZDogbnVtYmVyO1xuICBwdWJsaWMgcmVhZG9ubHkgdGl0bGU6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSBjcmVhdGVkQnk6IEFic3RyYWN0VXNlciB8IG51bGw7XG4gIHB1YmxpYyByZWFkb25seSBjcmVhdGVkQXQ6IERhdGU7XG4gIHB1YmxpYyBwb3N0Q291bnQ6IG51bWJlcjtcbiAgcHVibGljIHJlYWRvbmx5IGNhdGVnb3J5OiBGb3J1bUNhdGVnb3J5IHwgbnVsbDtcbiAgcHJpdmF0ZSBfcG9zdHM6IEZvcnVtUG9zdENvbGxlY3Rpb24gfCBudWxsID0gbnVsbDtcblxuICBjb25zdHJ1Y3RvcihkYXRhOiBGb3J1bVRocmVhZERhdGEpIHtcbiAgICB0aGlzLnNpdGUgPSBkYXRhLnNpdGU7XG4gICAgdGhpcy5pZCA9IGRhdGEuaWQ7XG4gICAgdGhpcy50aXRsZSA9IGRhdGEudGl0bGU7XG4gICAgdGhpcy5kZXNjcmlwdGlvbiA9IGRhdGEuZGVzY3JpcHRpb247XG4gICAgdGhpcy5jcmVhdGVkQnkgPSBkYXRhLmNyZWF0ZWRCeTtcbiAgICB0aGlzLmNyZWF0ZWRBdCA9IGRhdGEuY3JlYXRlZEF0O1xuICAgIHRoaXMucG9zdENvdW50ID0gZGF0YS5wb3N0Q291bnQ7XG4gICAgdGhpcy5jYXRlZ29yeSA9IGRhdGEuY2F0ZWdvcnkgPz8gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiDjgrnjg6zjg4Pjg4lVUkxcbiAgICovXG4gIGdldFVybCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLnNpdGUuZ2V0QmFzZVVybCgpfS9mb3J1bS90LSR7dGhpcy5pZH0vYDtcbiAgfVxuXG4gIC8qKlxuICAgKiDmipXnqL/kuIDopqfjgpLlj5blvpdcbiAgICovXG4gIGdldFBvc3RzKCk6IFdpa2lkb3RSZXN1bHRBc3luYzxGb3J1bVBvc3RDb2xsZWN0aW9uPiB7XG4gICAgaWYgKHRoaXMuX3Bvc3RzICE9PSBudWxsKSB7XG4gICAgICByZXR1cm4gZnJvbVByb21pc2UoUHJvbWlzZS5yZXNvbHZlKHRoaXMuX3Bvc3RzKSwgKGUpID0+IG5ldyBVbmV4cGVjdGVkRXJyb3IoU3RyaW5nKGUpKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIEZvcnVtUG9zdENvbGxlY3Rpb24uYWNxdWlyZUFsbEluVGhyZWFkKHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIOOCueODrOODg+ODieOBq+i/lOS/oVxuICAgKi9cbiAgQFJlcXVpcmVMb2dpblxuICByZXBseShcbiAgICBzb3VyY2U6IHN0cmluZyxcbiAgICB0aXRsZSA9ICcnLFxuICAgIHBhcmVudFBvc3RJZDogbnVtYmVyIHwgbnVsbCA9IG51bGxcbiAgKTogV2lraWRvdFJlc3VsdEFzeW5jPEZvcnVtVGhyZWFkPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zaXRlLmFtY1JlcXVlc3QoW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHRocmVhZElkOiBTdHJpbmcodGhpcy5pZCksXG4gICAgICAgICAgICBwYXJlbnRJZDogcGFyZW50UG9zdElkICE9PSBudWxsID8gU3RyaW5nKHBhcmVudFBvc3RJZCkgOiAnJyxcbiAgICAgICAgICAgIHRpdGxlLFxuICAgICAgICAgICAgc291cmNlLFxuICAgICAgICAgICAgYWN0aW9uOiAnRm9ydW1BY3Rpb24nLFxuICAgICAgICAgICAgZXZlbnQ6ICdzYXZlUG9zdCcsXG4gICAgICAgICAgICBtb2R1bGVOYW1lOiAnRW1wdHknLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pO1xuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fcG9zdHMgPSBudWxsO1xuICAgICAgICB0aGlzLnBvc3RDb3VudCArPSAxO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byByZXBseTogJHtTdHJpbmcoZXJyb3IpfWApXG4gICAgKTtcbiAgfVxuXG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBGb3J1bVRocmVhZChpZD0ke3RoaXMuaWR9LCB0aXRsZT0ke3RoaXMudGl0bGV9KWA7XG4gIH1cblxuICAvKipcbiAgICogSUTjgYvjgonjgrnjg6zjg4Pjg4njgpLlj5blvpdcbiAgICovXG4gIHN0YXRpYyBnZXRGcm9tSWQoXG4gICAgc2l0ZTogU2l0ZSxcbiAgICB0aHJlYWRJZDogbnVtYmVyLFxuICAgIGNhdGVnb3J5OiBGb3J1bUNhdGVnb3J5IHwgbnVsbCA9IG51bGxcbiAgKTogV2lraWRvdFJlc3VsdEFzeW5jPEZvcnVtVGhyZWFkPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgRm9ydW1UaHJlYWRDb2xsZWN0aW9uLmFjcXVpcmVGcm9tVGhyZWFkSWRzKHNpdGUsIFt0aHJlYWRJZF0sIGNhdGVnb3J5KTtcbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRocmVhZCA9IHJlc3VsdC52YWx1ZVswXTtcbiAgICAgICAgaWYgKCF0aHJlYWQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgTm9FbGVtZW50RXJyb3IoYFRocmVhZCBub3QgZm91bmQ6ICR7dGhyZWFkSWR9YCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRocmVhZDtcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgTm9FbGVtZW50RXJyb3IpIHJldHVybiBlcnJvcjtcbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBnZXQgdGhyZWFkOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxufVxuXG4vKipcbiAqIOODleOCqeODvOODqeODoOOCueODrOODg+ODieOCs+ODrOOCr+OCt+ODp+ODs1xuICovXG5leHBvcnQgY2xhc3MgRm9ydW1UaHJlYWRDb2xsZWN0aW9uIGV4dGVuZHMgQXJyYXk8Rm9ydW1UaHJlYWQ+IHtcbiAgcHVibGljIHJlYWRvbmx5IHNpdGU6IFNpdGU7XG5cbiAgY29uc3RydWN0b3Ioc2l0ZTogU2l0ZSwgdGhyZWFkcz86IEZvcnVtVGhyZWFkW10pIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuc2l0ZSA9IHNpdGU7XG4gICAgaWYgKHRocmVhZHMpIHtcbiAgICAgIHRoaXMucHVzaCguLi50aHJlYWRzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSUTjgafmpJzntKJcbiAgICovXG4gIGZpbmRCeUlkKGlkOiBudW1iZXIpOiBGb3J1bVRocmVhZCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZmluZCgodGhyZWFkKSA9PiB0aHJlYWQuaWQgPT09IGlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDjgqvjg4bjgrTjg6rlhoXjga7lhajjgrnjg6zjg4Pjg4njgpLlj5blvpdcbiAgICovXG4gIHN0YXRpYyBhY3F1aXJlQWxsSW5DYXRlZ29yeShjYXRlZ29yeTogRm9ydW1DYXRlZ29yeSk6IFdpa2lkb3RSZXN1bHRBc3luYzxGb3J1bVRocmVhZENvbGxlY3Rpb24+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCB0aHJlYWRzOiBGb3J1bVRocmVhZFtdID0gW107XG5cbiAgICAgICAgY29uc3QgZmlyc3RSZXN1bHQgPSBhd2FpdCBjYXRlZ29yeS5zaXRlLmFtY1JlcXVlc3QoW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHA6IDEsXG4gICAgICAgICAgICBjOiBjYXRlZ29yeS5pZCxcbiAgICAgICAgICAgIG1vZHVsZU5hbWU6ICdmb3J1bS9Gb3J1bVZpZXdDYXRlZ29yeU1vZHVsZScsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSk7XG5cbiAgICAgICAgaWYgKGZpcnN0UmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyBmaXJzdFJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZpcnN0UmVzcG9uc2UgPSBmaXJzdFJlc3VsdC52YWx1ZVswXTtcbiAgICAgICAgaWYgKCFmaXJzdFJlc3BvbnNlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IE5vRWxlbWVudEVycm9yKCdFbXB0eSByZXNwb25zZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZmlyc3RCb2R5ID0gU3RyaW5nKGZpcnN0UmVzcG9uc2UuYm9keSA/PyAnJyk7XG4gICAgICAgIGNvbnN0ICRmaXJzdCA9IGNoZWVyaW8ubG9hZChmaXJzdEJvZHkpO1xuXG4gICAgICAgICRmaXJzdCgndGFibGUudGFibGUgdHIuaGVhZH50cicpLmVhY2goKF9pLCBlbGVtKSA9PiB7XG4gICAgICAgICAgY29uc3QgJHJvdyA9ICRmaXJzdChlbGVtKTtcbiAgICAgICAgICBjb25zdCB0aXRsZUVsZW0gPSAkcm93LmZpbmQoJ2Rpdi50aXRsZSBhJyk7XG4gICAgICAgICAgY29uc3QgaHJlZiA9IHRpdGxlRWxlbS5hdHRyKCdocmVmJykgPz8gJyc7XG4gICAgICAgICAgY29uc3QgdGhyZWFkSWRNYXRjaCA9IGhyZWYubWF0Y2goL3QtKFxcZCspLyk7XG4gICAgICAgICAgaWYgKCF0aHJlYWRJZE1hdGNoPy5bMV0pIHJldHVybjtcblxuICAgICAgICAgIGNvbnN0IHRocmVhZElkID0gTnVtYmVyLnBhcnNlSW50KHRocmVhZElkTWF0Y2hbMV0sIDEwKTtcbiAgICAgICAgICBjb25zdCB0aXRsZSA9IHRpdGxlRWxlbS50ZXh0KCkudHJpbSgpO1xuICAgICAgICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gJHJvdy5maW5kKCdkaXYuZGVzY3JpcHRpb24nKS50ZXh0KCkudHJpbSgpO1xuICAgICAgICAgIGNvbnN0IHBvc3RDb3VudCA9IE51bWJlci5wYXJzZUludCgkcm93LmZpbmQoJ3RkLnBvc3RzJykudGV4dCgpLnRyaW0oKSwgMTApIHx8IDA7XG5cbiAgICAgICAgICAvLyDjg6bjg7zjgrbjg7zjgajml6XmmYLjga7jg5Hjg7zjgrlcbiAgICAgICAgICBjb25zdCAkdXNlckVsZW0gPSAkcm93LmZpbmQoJ3RkLnN0YXJ0ZWQgc3Bhbi5wcmludHVzZXInKTtcbiAgICAgICAgICBjb25zdCAkb2RhdGVFbGVtID0gJHJvdy5maW5kKCd0ZC5zdGFydGVkIHNwYW4ub2RhdGUnKTtcblxuICAgICAgICAgIGNvbnN0IGNyZWF0ZWRCeSA9XG4gICAgICAgICAgICAkdXNlckVsZW0ubGVuZ3RoID4gMFxuICAgICAgICAgICAgICA/IHBhcnNlVXNlcihjYXRlZ29yeS5zaXRlLmNsaWVudCwgJHVzZXJFbGVtIGFzIENoZWVyaW88QW55Tm9kZT4pXG4gICAgICAgICAgICAgIDogbnVsbDtcbiAgICAgICAgICBjb25zdCBjcmVhdGVkQXQgPVxuICAgICAgICAgICAgJG9kYXRlRWxlbS5sZW5ndGggPiAwXG4gICAgICAgICAgICAgID8gKHBhcnNlT2RhdGUoJG9kYXRlRWxlbSBhcyBDaGVlcmlvPEFueU5vZGU+KSA/PyBuZXcgRGF0ZSgpKVxuICAgICAgICAgICAgICA6IG5ldyBEYXRlKCk7XG5cbiAgICAgICAgICB0aHJlYWRzLnB1c2goXG4gICAgICAgICAgICBuZXcgRm9ydW1UaHJlYWQoe1xuICAgICAgICAgICAgICBzaXRlOiBjYXRlZ29yeS5zaXRlLFxuICAgICAgICAgICAgICBpZDogdGhyZWFkSWQsXG4gICAgICAgICAgICAgIHRpdGxlLFxuICAgICAgICAgICAgICBkZXNjcmlwdGlvbixcbiAgICAgICAgICAgICAgY3JlYXRlZEJ5LFxuICAgICAgICAgICAgICBjcmVhdGVkQXQsXG4gICAgICAgICAgICAgIHBvc3RDb3VudCxcbiAgICAgICAgICAgICAgY2F0ZWdvcnksXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIENoZWNrIHBhZ2luYXRpb25cbiAgICAgICAgY29uc3QgcGFnZXIgPSAkZmlyc3QoJ2Rpdi5wYWdlcicpO1xuICAgICAgICBpZiAocGFnZXIubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBGb3J1bVRocmVhZENvbGxlY3Rpb24oY2F0ZWdvcnkuc2l0ZSwgdGhyZWFkcyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwYWdlckxpbmtzID0gcGFnZXIuZmluZCgnYScpO1xuICAgICAgICBpZiAocGFnZXJMaW5rcy5sZW5ndGggPCAyKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBGb3J1bVRocmVhZENvbGxlY3Rpb24oY2F0ZWdvcnkuc2l0ZSwgdGhyZWFkcyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBsYXN0UGFnZUxpbmsgPSBwYWdlckxpbmtzW3BhZ2VyTGlua3MubGVuZ3RoIC0gMl07XG4gICAgICAgIGNvbnN0IGxhc3RQYWdlVGV4dCA9IGxhc3RQYWdlTGluayA/ICRmaXJzdChsYXN0UGFnZUxpbmspLnRleHQoKS50cmltKCkgOiAnMSc7XG4gICAgICAgIGNvbnN0IGxhc3RQYWdlID0gTnVtYmVyLnBhcnNlSW50KGxhc3RQYWdlVGV4dCwgMTApIHx8IDE7XG5cbiAgICAgICAgaWYgKGxhc3RQYWdlIDw9IDEpIHtcbiAgICAgICAgICByZXR1cm4gbmV3IEZvcnVtVGhyZWFkQ29sbGVjdGlvbihjYXRlZ29yeS5zaXRlLCB0aHJlYWRzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEZldGNoIHJlbWFpbmluZyBwYWdlc1xuICAgICAgICBjb25zdCBib2RpZXM6IHsgcDogbnVtYmVyOyBjOiBudW1iZXI7IG1vZHVsZU5hbWU6IHN0cmluZyB9W10gPSBbXTtcbiAgICAgICAgZm9yIChsZXQgcGFnZSA9IDI7IHBhZ2UgPD0gbGFzdFBhZ2U7IHBhZ2UrKykge1xuICAgICAgICAgIGJvZGllcy5wdXNoKHtcbiAgICAgICAgICAgIHA6IHBhZ2UsXG4gICAgICAgICAgICBjOiBjYXRlZ29yeS5pZCxcbiAgICAgICAgICAgIG1vZHVsZU5hbWU6ICdmb3J1bS9Gb3J1bVZpZXdDYXRlZ29yeU1vZHVsZScsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBhZGRpdGlvbmFsUmVzdWx0cyA9IGF3YWl0IGNhdGVnb3J5LnNpdGUuYW1jUmVxdWVzdChib2RpZXMpO1xuICAgICAgICBpZiAoYWRkaXRpb25hbFJlc3VsdHMuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IGFkZGl0aW9uYWxSZXN1bHRzLmVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCByZXNwb25zZSBvZiBhZGRpdGlvbmFsUmVzdWx0cy52YWx1ZSkge1xuICAgICAgICAgIGNvbnN0IGJvZHkgPSBTdHJpbmcocmVzcG9uc2U/LmJvZHkgPz8gJycpO1xuICAgICAgICAgIGNvbnN0ICQgPSBjaGVlcmlvLmxvYWQoYm9keSk7XG5cbiAgICAgICAgICAkKCd0YWJsZS50YWJsZSB0ci5oZWFkfnRyJykuZWFjaCgoX2ksIGVsZW0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0ICRyb3cgPSAkKGVsZW0pO1xuICAgICAgICAgICAgY29uc3QgdGl0bGVFbGVtID0gJHJvdy5maW5kKCdkaXYudGl0bGUgYScpO1xuICAgICAgICAgICAgY29uc3QgaHJlZiA9IHRpdGxlRWxlbS5hdHRyKCdocmVmJykgPz8gJyc7XG4gICAgICAgICAgICBjb25zdCB0aHJlYWRJZE1hdGNoID0gaHJlZi5tYXRjaCgvdC0oXFxkKykvKTtcbiAgICAgICAgICAgIGlmICghdGhyZWFkSWRNYXRjaD8uWzFdKSByZXR1cm47XG5cbiAgICAgICAgICAgIGNvbnN0IHRocmVhZElkID0gTnVtYmVyLnBhcnNlSW50KHRocmVhZElkTWF0Y2hbMV0sIDEwKTtcbiAgICAgICAgICAgIGNvbnN0IHRpdGxlID0gdGl0bGVFbGVtLnRleHQoKS50cmltKCk7XG4gICAgICAgICAgICBjb25zdCBkZXNjcmlwdGlvbiA9ICRyb3cuZmluZCgnZGl2LmRlc2NyaXB0aW9uJykudGV4dCgpLnRyaW0oKTtcbiAgICAgICAgICAgIGNvbnN0IHBvc3RDb3VudCA9IE51bWJlci5wYXJzZUludCgkcm93LmZpbmQoJ3RkLnBvc3RzJykudGV4dCgpLnRyaW0oKSwgMTApIHx8IDA7XG5cbiAgICAgICAgICAgIC8vIOODpuODvOOCtuODvOOBqOaXpeaZguOBruODkeODvOOCuVxuICAgICAgICAgICAgY29uc3QgJHVzZXJFbGVtID0gJHJvdy5maW5kKCd0ZC5zdGFydGVkIHNwYW4ucHJpbnR1c2VyJyk7XG4gICAgICAgICAgICBjb25zdCAkb2RhdGVFbGVtID0gJHJvdy5maW5kKCd0ZC5zdGFydGVkIHNwYW4ub2RhdGUnKTtcblxuICAgICAgICAgICAgY29uc3QgY3JlYXRlZEJ5ID1cbiAgICAgICAgICAgICAgJHVzZXJFbGVtLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgICA/IHBhcnNlVXNlcihjYXRlZ29yeS5zaXRlLmNsaWVudCwgJHVzZXJFbGVtIGFzIENoZWVyaW88QW55Tm9kZT4pXG4gICAgICAgICAgICAgICAgOiBudWxsO1xuICAgICAgICAgICAgY29uc3QgY3JlYXRlZEF0ID1cbiAgICAgICAgICAgICAgJG9kYXRlRWxlbS5sZW5ndGggPiAwXG4gICAgICAgICAgICAgICAgPyAocGFyc2VPZGF0ZSgkb2RhdGVFbGVtIGFzIENoZWVyaW88QW55Tm9kZT4pID8/IG5ldyBEYXRlKCkpXG4gICAgICAgICAgICAgICAgOiBuZXcgRGF0ZSgpO1xuXG4gICAgICAgICAgICB0aHJlYWRzLnB1c2goXG4gICAgICAgICAgICAgIG5ldyBGb3J1bVRocmVhZCh7XG4gICAgICAgICAgICAgICAgc2l0ZTogY2F0ZWdvcnkuc2l0ZSxcbiAgICAgICAgICAgICAgICBpZDogdGhyZWFkSWQsXG4gICAgICAgICAgICAgICAgdGl0bGUsXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb24sXG4gICAgICAgICAgICAgICAgY3JlYXRlZEJ5LFxuICAgICAgICAgICAgICAgIGNyZWF0ZWRBdCxcbiAgICAgICAgICAgICAgICBwb3N0Q291bnQsXG4gICAgICAgICAgICAgICAgY2F0ZWdvcnksXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBGb3J1bVRocmVhZENvbGxlY3Rpb24oY2F0ZWdvcnkuc2l0ZSwgdGhyZWFkcyk7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIE5vRWxlbWVudEVycm9yKSByZXR1cm4gZXJyb3I7XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gYWNxdWlyZSB0aHJlYWRzOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDjgrnjg6zjg4Pjg4lJROOBi+OCieWNmOS4gOOBruOCueODrOODg+ODieOCkuWPluW+l1xuICAgKiBAcGFyYW0gc2l0ZSAtIOOCteOCpOODiFxuICAgKiBAcGFyYW0gdGhyZWFkSWQgLSDjgrnjg6zjg4Pjg4lJRFxuICAgKi9cbiAgc3RhdGljIGZyb21JZChzaXRlOiBTaXRlLCB0aHJlYWRJZDogbnVtYmVyKTogV2lraWRvdFJlc3VsdEFzeW5jPEZvcnVtVGhyZWFkPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgRm9ydW1UaHJlYWRDb2xsZWN0aW9uLmFjcXVpcmVGcm9tVGhyZWFkSWRzKHNpdGUsIFt0aHJlYWRJZF0pO1xuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdGhyZWFkID0gcmVzdWx0LnZhbHVlWzBdO1xuICAgICAgICBpZiAoIXRocmVhZCkge1xuICAgICAgICAgIHRocm93IG5ldyBOb0VsZW1lbnRFcnJvcihgVGhyZWFkIG5vdCBmb3VuZDogJHt0aHJlYWRJZH1gKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhyZWFkO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBOb0VsZW1lbnRFcnJvcikgcmV0dXJuIGVycm9yO1xuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGdldCB0aHJlYWQ6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIOOCueODrOODg+ODiUlE44GL44KJ44K544Os44OD44OJ44KS5Y+W5b6XXG4gICAqL1xuICBzdGF0aWMgYWNxdWlyZUZyb21UaHJlYWRJZHMoXG4gICAgc2l0ZTogU2l0ZSxcbiAgICB0aHJlYWRJZHM6IG51bWJlcltdLFxuICAgIGNhdGVnb3J5OiBGb3J1bUNhdGVnb3J5IHwgbnVsbCA9IG51bGxcbiAgKTogV2lraWRvdFJlc3VsdEFzeW5jPEZvcnVtVGhyZWFkQ29sbGVjdGlvbj4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNpdGUuYW1jUmVxdWVzdChcbiAgICAgICAgICB0aHJlYWRJZHMubWFwKCh0aHJlYWRJZCkgPT4gKHtcbiAgICAgICAgICAgIHQ6IHRocmVhZElkLFxuICAgICAgICAgICAgbW9kdWxlTmFtZTogJ2ZvcnVtL0ZvcnVtVmlld1RocmVhZE1vZHVsZScsXG4gICAgICAgICAgfSkpXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdGhyZWFkczogRm9ydW1UaHJlYWRbXSA9IFtdO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhyZWFkSWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSByZXN1bHQudmFsdWVbaV07XG4gICAgICAgICAgY29uc3QgdGhyZWFkSWQgPSB0aHJlYWRJZHNbaV07XG4gICAgICAgICAgaWYgKCFyZXNwb25zZSB8fCAhdGhyZWFkSWQpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgY29uc3QgYm9keSA9IFN0cmluZyhyZXNwb25zZS5ib2R5ID8/ICcnKTtcbiAgICAgICAgICBjb25zdCAkID0gY2hlZXJpby5sb2FkKGJvZHkpO1xuXG4gICAgICAgICAgLy8gUGFyc2UgdGhyZWFkIGluZm8gZnJvbSBwYWdlXG4gICAgICAgICAgY29uc3QgYmNFbGVtID0gJCgnZGl2LmZvcnVtLWJyZWFkY3J1bWJzJyk7XG4gICAgICAgICAgaWYgKGJjRWxlbS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBOb0VsZW1lbnRFcnJvcignQnJlYWRjcnVtYnMgbm90IGZvdW5kJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGJjUGFydHMgPSBiY0VsZW0udGV4dCgpLnNwbGl0KCfCuycpO1xuICAgICAgICAgIGNvbnN0IHRpdGxlID0gYmNQYXJ0cy5sZW5ndGggPiAwID8gKGJjUGFydHNbYmNQYXJ0cy5sZW5ndGggLSAxXT8udHJpbSgpID8/ICcnKSA6ICcnO1xuXG4gICAgICAgICAgY29uc3QgZGVzY0Jsb2NrRWxlbSA9ICQoJ2Rpdi5kZXNjcmlwdGlvbi1ibG9jaycpO1xuICAgICAgICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gZGVzY0Jsb2NrRWxlbS50ZXh0KCkudHJpbSgpO1xuXG4gICAgICAgICAgY29uc3QgcG9zdENvdW50TWF0Y2ggPSAkKCdkaXYuc3RhdGlzdGljcycpLnRleHQoKS5tYXRjaCgvKFxcZCspLyk7XG4gICAgICAgICAgY29uc3QgcG9zdENvdW50ID0gcG9zdENvdW50TWF0Y2g/LlsxXSA/IE51bWJlci5wYXJzZUludChwb3N0Q291bnRNYXRjaFsxXSwgMTApIDogMDtcblxuICAgICAgICAgIHRocmVhZHMucHVzaChcbiAgICAgICAgICAgIG5ldyBGb3J1bVRocmVhZCh7XG4gICAgICAgICAgICAgIHNpdGUsXG4gICAgICAgICAgICAgIGlkOiB0aHJlYWRJZCxcbiAgICAgICAgICAgICAgdGl0bGUsXG4gICAgICAgICAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgICBjcmVhdGVkQnk6IG51bGwsXG4gICAgICAgICAgICAgIGNyZWF0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgICAgICAgcG9zdENvdW50LFxuICAgICAgICAgICAgICBjYXRlZ29yeSxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgRm9ydW1UaHJlYWRDb2xsZWN0aW9uKHNpdGUsIHRocmVhZHMpO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBOb0VsZW1lbnRFcnJvcikgcmV0dXJuIGVycm9yO1xuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGFjcXVpcmUgdGhyZWFkczogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cbn1cbiIsCiAgICAiaW1wb3J0ICogYXMgY2hlZXJpbyBmcm9tICdjaGVlcmlvJztcbmltcG9ydCB7IFJlcXVpcmVMb2dpbiB9IGZyb20gJy4uLy4uL2NvbW1vbi9kZWNvcmF0b3JzJztcbmltcG9ydCB7IExvZ2luUmVxdWlyZWRFcnJvciwgTm9FbGVtZW50RXJyb3IsIFVuZXhwZWN0ZWRFcnJvciB9IGZyb20gJy4uLy4uL2NvbW1vbi9lcnJvcnMnO1xuaW1wb3J0IHsgZnJvbVByb21pc2UsIHR5cGUgV2lraWRvdFJlc3VsdEFzeW5jIH0gZnJvbSAnLi4vLi4vY29tbW9uL3R5cGVzJztcbmltcG9ydCB0eXBlIHsgU2l0ZSB9IGZyb20gJy4uL3NpdGUnO1xuaW1wb3J0IHsgRm9ydW1UaHJlYWQsIEZvcnVtVGhyZWFkQ29sbGVjdGlvbiB9IGZyb20gJy4vZm9ydW0tdGhyZWFkJztcblxuLyoqXG4gKiDjg5Xjgqnjg7zjg6njg6Djgqvjg4bjgrTjg6rjg4fjg7zjgr9cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGb3J1bUNhdGVnb3J5RGF0YSB7XG4gIHNpdGU6IFNpdGU7XG4gIGlkOiBudW1iZXI7XG4gIHRpdGxlOiBzdHJpbmc7XG4gIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIHRocmVhZHNDb3VudDogbnVtYmVyO1xuICBwb3N0c0NvdW50OiBudW1iZXI7XG59XG5cbi8qKlxuICog44OV44Kp44O844Op44Og44Kr44OG44K044OqXG4gKi9cbmV4cG9ydCBjbGFzcyBGb3J1bUNhdGVnb3J5IHtcbiAgcHVibGljIHJlYWRvbmx5IHNpdGU6IFNpdGU7XG4gIHB1YmxpYyByZWFkb25seSBpZDogbnVtYmVyO1xuICBwdWJsaWMgcmVhZG9ubHkgdGl0bGU6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSB0aHJlYWRzQ291bnQ6IG51bWJlcjtcbiAgcHVibGljIHJlYWRvbmx5IHBvc3RzQ291bnQ6IG51bWJlcjtcbiAgcHJpdmF0ZSBfdGhyZWFkczogRm9ydW1UaHJlYWRDb2xsZWN0aW9uIHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IoZGF0YTogRm9ydW1DYXRlZ29yeURhdGEpIHtcbiAgICB0aGlzLnNpdGUgPSBkYXRhLnNpdGU7XG4gICAgdGhpcy5pZCA9IGRhdGEuaWQ7XG4gICAgdGhpcy50aXRsZSA9IGRhdGEudGl0bGU7XG4gICAgdGhpcy5kZXNjcmlwdGlvbiA9IGRhdGEuZGVzY3JpcHRpb247XG4gICAgdGhpcy50aHJlYWRzQ291bnQgPSBkYXRhLnRocmVhZHNDb3VudDtcbiAgICB0aGlzLnBvc3RzQ291bnQgPSBkYXRhLnBvc3RzQ291bnQ7XG4gIH1cblxuICAvKipcbiAgICog44K544Os44OD44OJ5LiA6Kan44KS5Y+W5b6XXG4gICAqL1xuICBnZXRUaHJlYWRzKCk6IFdpa2lkb3RSZXN1bHRBc3luYzxGb3J1bVRocmVhZENvbGxlY3Rpb24+IHtcbiAgICBpZiAodGhpcy5fdGhyZWFkcyAhPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGZyb21Qcm9taXNlKFByb21pc2UucmVzb2x2ZSh0aGlzLl90aHJlYWRzKSwgKGUpID0+IG5ldyBVbmV4cGVjdGVkRXJyb3IoU3RyaW5nKGUpKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgRm9ydW1UaHJlYWRDb2xsZWN0aW9uLmFjcXVpcmVBbGxJbkNhdGVnb3J5KHRoaXMpO1xuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fdGhyZWFkcyA9IHJlc3VsdC52YWx1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RocmVhZHM7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gZ2V0IHRocmVhZHM6ICR7U3RyaW5nKGVycm9yKX1gKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICog44K544Os44OD44OJ5LiA6Kan44KS5YaN5Y+W5b6XXG4gICAqL1xuICByZWxvYWRUaHJlYWRzKCk6IFdpa2lkb3RSZXN1bHRBc3luYzxGb3J1bVRocmVhZENvbGxlY3Rpb24+IHtcbiAgICB0aGlzLl90aHJlYWRzID0gbnVsbDtcbiAgICByZXR1cm4gdGhpcy5nZXRUaHJlYWRzKCk7XG4gIH1cblxuICAvKipcbiAgICog44K544Os44OD44OJ44KS5L2c5oiQXG4gICAqL1xuICBAUmVxdWlyZUxvZ2luXG4gIGNyZWF0ZVRocmVhZChcbiAgICB0aXRsZTogc3RyaW5nLFxuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmcsXG4gICAgc291cmNlOiBzdHJpbmdcbiAgKTogV2lraWRvdFJlc3VsdEFzeW5jPEZvcnVtVGhyZWFkPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zaXRlLmFtY1JlcXVlc3QoW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG1vZHVsZU5hbWU6ICdFbXB0eScsXG4gICAgICAgICAgICBhY3Rpb246ICdGb3J1bUFjdGlvbicsXG4gICAgICAgICAgICBldmVudDogJ25ld1RocmVhZCcsXG4gICAgICAgICAgICBjYXRlZ29yeV9pZDogdGhpcy5pZCxcbiAgICAgICAgICAgIHRpdGxlLFxuICAgICAgICAgICAgZGVzY3JpcHRpb24sXG4gICAgICAgICAgICBzb3VyY2UsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSk7XG5cbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSByZXN1bHQudmFsdWVbMF07XG4gICAgICAgIGlmICghcmVzcG9uc2UgfHwgdHlwZW9mIHJlc3BvbnNlLnRocmVhZElkICE9PSAnbnVtYmVyJykge1xuICAgICAgICAgIHRocm93IG5ldyBOb0VsZW1lbnRFcnJvcignVGhyZWFkIElEIG5vdCBmb3VuZCBpbiByZXNwb25zZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdGhyZWFkSWQgPSByZXNwb25zZS50aHJlYWRJZCBhcyBudW1iZXI7XG4gICAgICAgIGNvbnN0IHRocmVhZFJlc3VsdCA9IGF3YWl0IEZvcnVtVGhyZWFkLmdldEZyb21JZCh0aGlzLnNpdGUsIHRocmVhZElkLCB0aGlzKTtcbiAgICAgICAgaWYgKHRocmVhZFJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgdGhyZWFkUmVzdWx0LmVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aHJlYWRSZXN1bHQudmFsdWU7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIE5vRWxlbWVudEVycm9yIHx8IGVycm9yIGluc3RhbmNlb2YgTG9naW5SZXF1aXJlZEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gY3JlYXRlIHRocmVhZDogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiBgRm9ydW1DYXRlZ29yeShpZD0ke3RoaXMuaWR9LCB0aXRsZT0ke3RoaXMudGl0bGV9KWA7XG4gIH1cbn1cblxuLyoqXG4gKiDjg5Xjgqnjg7zjg6njg6Djgqvjg4bjgrTjg6rjgrPjg6zjgq/jgrfjg6fjg7NcbiAqL1xuZXhwb3J0IGNsYXNzIEZvcnVtQ2F0ZWdvcnlDb2xsZWN0aW9uIGV4dGVuZHMgQXJyYXk8Rm9ydW1DYXRlZ29yeT4ge1xuICBwdWJsaWMgcmVhZG9ubHkgc2l0ZTogU2l0ZTtcblxuICBjb25zdHJ1Y3RvcihzaXRlOiBTaXRlLCBjYXRlZ29yaWVzPzogRm9ydW1DYXRlZ29yeVtdKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLnNpdGUgPSBzaXRlO1xuICAgIGlmIChjYXRlZ29yaWVzKSB7XG4gICAgICB0aGlzLnB1c2goLi4uY2F0ZWdvcmllcyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIElE44Gn5qSc57SiXG4gICAqL1xuICBmaW5kQnlJZChpZDogbnVtYmVyKTogRm9ydW1DYXRlZ29yeSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZmluZCgoY2F0ZWdvcnkpID0+IGNhdGVnb3J5LmlkID09PSBpZCk7XG4gIH1cblxuICAvKipcbiAgICog44K144Kk44OI44Gu5YWo44Kr44OG44K044Oq44KS5Y+W5b6XXG4gICAqL1xuICBzdGF0aWMgYWNxdWlyZUFsbChzaXRlOiBTaXRlKTogV2lraWRvdFJlc3VsdEFzeW5jPEZvcnVtQ2F0ZWdvcnlDb2xsZWN0aW9uPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc2l0ZS5hbWNSZXF1ZXN0KFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBtb2R1bGVOYW1lOiAnZm9ydW0vRm9ydW1TdGFydE1vZHVsZScsXG4gICAgICAgICAgICBoaWRkZW46ICd0cnVlJyxcbiAgICAgICAgICB9LFxuICAgICAgICBdKTtcblxuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXNwb25zZSA9IHJlc3VsdC52YWx1ZVswXTtcbiAgICAgICAgaWYgKCFyZXNwb25zZSkge1xuICAgICAgICAgIHRocm93IG5ldyBOb0VsZW1lbnRFcnJvcignRW1wdHkgcmVzcG9uc2UnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGJvZHkgPSBTdHJpbmcocmVzcG9uc2UuYm9keSA/PyAnJyk7XG4gICAgICAgIGNvbnN0ICQgPSBjaGVlcmlvLmxvYWQoYm9keSk7XG5cbiAgICAgICAgY29uc3QgY2F0ZWdvcmllczogRm9ydW1DYXRlZ29yeVtdID0gW107XG5cbiAgICAgICAgJCgndGFibGUgdHIuaGVhZH50cicpLmVhY2goKF9pLCByb3cpID0+IHtcbiAgICAgICAgICBjb25zdCAkcm93ID0gJChyb3cpO1xuICAgICAgICAgIGNvbnN0IG5hbWVFbGVtID0gJHJvdy5maW5kKCd0ZC5uYW1lJyk7XG4gICAgICAgICAgY29uc3QgbmFtZUxpbmtFbGVtID0gbmFtZUVsZW0uZmluZCgnYScpO1xuICAgICAgICAgIGNvbnN0IGhyZWYgPSBuYW1lTGlua0VsZW0uYXR0cignaHJlZicpID8/ICcnO1xuXG4gICAgICAgICAgY29uc3QgY2F0ZWdvcnlJZE1hdGNoID0gaHJlZi5tYXRjaCgvYy0oXFxkKykvKTtcbiAgICAgICAgICBpZiAoIWNhdGVnb3J5SWRNYXRjaD8uWzFdKSByZXR1cm47XG5cbiAgICAgICAgICBjb25zdCBjYXRlZ29yeUlkID0gTnVtYmVyLnBhcnNlSW50KGNhdGVnb3J5SWRNYXRjaFsxXSwgMTApO1xuICAgICAgICAgIGNvbnN0IHRpdGxlID0gbmFtZUxpbmtFbGVtLnRleHQoKS50cmltKCk7XG4gICAgICAgICAgY29uc3QgZGVzY3JpcHRpb24gPSBuYW1lRWxlbS5maW5kKCdkaXYuZGVzY3JpcHRpb24nKS50ZXh0KCkudHJpbSgpO1xuICAgICAgICAgIGNvbnN0IHRocmVhZHNDb3VudCA9IE51bWJlci5wYXJzZUludCgkcm93LmZpbmQoJ3RkLnRocmVhZHMnKS50ZXh0KCkudHJpbSgpLCAxMCkgfHwgMDtcbiAgICAgICAgICBjb25zdCBwb3N0c0NvdW50ID0gTnVtYmVyLnBhcnNlSW50KCRyb3cuZmluZCgndGQucG9zdHMnKS50ZXh0KCkudHJpbSgpLCAxMCkgfHwgMDtcblxuICAgICAgICAgIGNhdGVnb3JpZXMucHVzaChcbiAgICAgICAgICAgIG5ldyBGb3J1bUNhdGVnb3J5KHtcbiAgICAgICAgICAgICAgc2l0ZSxcbiAgICAgICAgICAgICAgaWQ6IGNhdGVnb3J5SWQsXG4gICAgICAgICAgICAgIHRpdGxlLFxuICAgICAgICAgICAgICBkZXNjcmlwdGlvbixcbiAgICAgICAgICAgICAgdGhyZWFkc0NvdW50LFxuICAgICAgICAgICAgICBwb3N0c0NvdW50LFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICApO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gbmV3IEZvcnVtQ2F0ZWdvcnlDb2xsZWN0aW9uKHNpdGUsIGNhdGVnb3JpZXMpO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBOb0VsZW1lbnRFcnJvcikgcmV0dXJuIGVycm9yO1xuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGFjcXVpcmUgY2F0ZWdvcmllczogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cbn1cbiIsCiAgICAiZXhwb3J0IHsgRm9ydW1DYXRlZ29yeSwgRm9ydW1DYXRlZ29yeUNvbGxlY3Rpb24sIHR5cGUgRm9ydW1DYXRlZ29yeURhdGEgfSBmcm9tICcuL2ZvcnVtLWNhdGVnb3J5JztcbmV4cG9ydCB7IEZvcnVtUG9zdCwgRm9ydW1Qb3N0Q29sbGVjdGlvbiwgdHlwZSBGb3J1bVBvc3REYXRhIH0gZnJvbSAnLi9mb3J1bS1wb3N0JztcbmV4cG9ydCB7IEZvcnVtVGhyZWFkLCBGb3J1bVRocmVhZENvbGxlY3Rpb24sIHR5cGUgRm9ydW1UaHJlYWREYXRhIH0gZnJvbSAnLi9mb3J1bS10aHJlYWQnO1xuIiwKICAgICIvLyBDb21tb25cbmV4cG9ydCAqIGZyb20gJy4vY29tbW9uL2Vycm9ycyc7XG5leHBvcnQgKiBmcm9tICcuL2NvbW1vbi9sb2dnZXInO1xuZXhwb3J0ICogZnJvbSAnLi9jb21tb24vdHlwZXMnO1xuXG4vLyBDb25uZWN0b3JcbmV4cG9ydCAqIGZyb20gJy4vY29ubmVjdG9yJztcblxuLy8gTW9kdWxlXG5leHBvcnQgKiBmcm9tICcuL21vZHVsZSc7XG5cbi8vIFV0aWxcbmV4cG9ydCAqIGZyb20gJy4vdXRpbCc7XG4iLAogICAgImltcG9ydCBreSwgeyB0eXBlIEt5SW5zdGFuY2UgfSBmcm9tICdreSc7XG5pbXBvcnQgcExpbWl0LCB7IHR5cGUgTGltaXRGdW5jdGlvbiB9IGZyb20gJ3AtbGltaXQnO1xuaW1wb3J0IHtcbiAgQU1DSHR0cEVycm9yLFxuICBGb3JiaWRkZW5FcnJvcixcbiAgTm90Rm91bmRFeGNlcHRpb24sXG4gIFJlc3BvbnNlRGF0YUVycm9yLFxuICBVbmV4cGVjdGVkRXJyb3IsXG4gIFdpa2lkb3RFcnJvcixcbiAgV2lraWRvdFN0YXR1c0Vycm9yLFxufSBmcm9tICcuLi9jb21tb24vZXJyb3JzJztcbmltcG9ydCB7IGZyb21Qcm9taXNlLCB0eXBlIFdpa2lkb3RSZXN1bHRBc3luYywgd2RFcnJBc3luYywgd2RPa0FzeW5jIH0gZnJvbSAnLi4vY29tbW9uL3R5cGVzJztcbmltcG9ydCB7XG4gIHR5cGUgQU1DQ29uZmlnLFxuICBERUZBVUxUX0FNQ19DT05GSUcsXG4gIERFRkFVTFRfSFRUUF9TVEFUVVNfQ09ERSxcbiAgV0lLSURPVF9UT0tFTjcsXG59IGZyb20gJy4vYW1jLWNvbmZpZyc7XG5pbXBvcnQgeyBBTUNIZWFkZXIgfSBmcm9tICcuL2FtYy1oZWFkZXInO1xuaW1wb3J0IHsgdHlwZSBBTUNSZXF1ZXN0Qm9keSwgdHlwZSBBTUNSZXNwb25zZSwgYW1jUmVzcG9uc2VTY2hlbWEgfSBmcm9tICcuL2FtYy10eXBlcyc7XG5cbi8qKlxuICog5qmf5a+G5oOF5aCx44KS44Oe44K544Kv44GZ44KL77yI44Ot44Kw5Ye65Yqb55So77yJXG4gKiBAcGFyYW0gYm9keSAtIOODnuOCueOCr+WvvuixoeOBruODquOCr+OCqOOCueODiOODnOODh+OCo1xuICogQHJldHVybnMg44Oe44K544Kv44GV44KM44Gf44Oc44OH44KjXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXNrU2Vuc2l0aXZlRGF0YShib2R5OiBBTUNSZXF1ZXN0Qm9keSk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgY29uc3QgbWFza2VkID0geyAuLi5ib2R5IH07XG4gIGNvbnN0IHNlbnNpdGl2ZUtleXMgPSBbJ3Bhc3N3b3JkJywgJ2xvZ2luJywgJ1dJS0lET1RfU0VTU0lPTl9JRCcsICd3aWtpZG90X3Rva2VuNyddO1xuICBmb3IgKGNvbnN0IGtleSBvZiBzZW5zaXRpdmVLZXlzKSB7XG4gICAgaWYgKGtleSBpbiBtYXNrZWQpIHtcbiAgICAgIG1hc2tlZFtrZXldID0gJyoqKk1BU0tFRCoqKic7XG4gICAgfVxuICB9XG4gIHJldHVybiBtYXNrZWQ7XG59XG5cbi8qKlxuICog5oyH5pWw44OQ44OD44Kv44Kq44OV6ZaT6ZqU44KS6KiI566X44GZ44KL77yI44K444OD44K/44O85LuY44GN77yJXG4gKiBAcGFyYW0gcmV0cnlDb3VudCAtIOePvuWcqOOBruODquODiOODqeOCpOWbnuaVsO+8iDHjgYvjgonplovlp4vvvIlcbiAqIEBwYXJhbSBiYXNlSW50ZXJ2YWwgLSDln7rmnKzplpPpmpTvvIjjg5/jg6rnp5LvvIlcbiAqIEBwYXJhbSBiYWNrb2ZmRmFjdG9yIC0g44OQ44OD44Kv44Kq44OV5L+C5pWwXG4gKiBAcGFyYW0gbWF4QmFja29mZiAtIOacgOWkp+ODkOODg+OCr+OCquODlemWk+malO+8iOODn+ODquenku+8iVxuICogQHJldHVybnMg6KiI566X44GV44KM44Gf44OQ44OD44Kv44Kq44OV6ZaT6ZqU77yI44Of44Oq56eS77yJXG4gKi9cbmZ1bmN0aW9uIGNhbGN1bGF0ZUJhY2tvZmYoXG4gIHJldHJ5Q291bnQ6IG51bWJlcixcbiAgYmFzZUludGVydmFsOiBudW1iZXIsXG4gIGJhY2tvZmZGYWN0b3I6IG51bWJlcixcbiAgbWF4QmFja29mZjogbnVtYmVyXG4pOiBudW1iZXIge1xuICBjb25zdCBiYWNrb2ZmID0gYmFzZUludGVydmFsICogYmFja29mZkZhY3RvciAqKiAocmV0cnlDb3VudCAtIDEpO1xuICBjb25zdCBqaXR0ZXIgPSBNYXRoLnJhbmRvbSgpICogYmFja29mZiAqIDAuMTtcbiAgcmV0dXJuIE1hdGgubWluKGJhY2tvZmYgKyBqaXR0ZXIsIG1heEJhY2tvZmYpO1xufVxuXG4vKipcbiAqIOaMh+WumuaZgumWk+W+heapn+OBmeOCi1xuICogQHBhcmFtIG1zIC0g5b6F5qmf5pmC6ZaT77yI44Of44Oq56eS77yJXG4gKi9cbmZ1bmN0aW9uIHNsZWVwKG1zOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKSk7XG59XG5cbi8qKlxuICogQU1D44Oq44Kv44Ko44K544OI44Kq44OX44K344On44OzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQU1DUmVxdWVzdE9wdGlvbnMge1xuICAvKiog44K144Kk44OI5ZCN77yI44OH44OV44Kp44Or44OIOiB3d3fvvIkgKi9cbiAgc2l0ZU5hbWU/OiBzdHJpbmc7XG4gIC8qKiBTU0zlr77lv5zvvIjnnIHnlaXmmYLjga/oh6rli5XmpJzlh7rvvIkgKi9cbiAgc3NsU3VwcG9ydGVkPzogYm9vbGVhbjtcbiAgLyoqIOOCqOODqeODvOOCkuS+i+WkluOBqOOBl+OBpuaKleOBkuOBmuOBq+e1kOaenOOBq+WQq+OCgeOCi++8iOODh+ODleOCqeODq+ODiDogZmFsc2XvvIkgKi9cbiAgcmV0dXJuRXhjZXB0aW9ucz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQWpheCBNb2R1bGUgQ29ubmVjdG9y44Kv44Op44Kk44Ki44Oz44OIXG4gKiBXaWtpZG90IEFNQ+OCqOODs+ODieODneOCpOODs+ODiOOBuOOBruODquOCr+OCqOOCueODiOOCkueuoeeQhuOBmeOCi1xuICovXG5leHBvcnQgY2xhc3MgQU1DQ2xpZW50IHtcbiAgLyoqIGt544Kk44Oz44K544K/44Oz44K5ICovXG4gIHByaXZhdGUgcmVhZG9ubHkga3k6IEt5SW5zdGFuY2U7XG5cbiAgLyoqIOS4puWIl+ODquOCr+OCqOOCueODiOWItumZkCAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGxpbWl0OiBMaW1pdEZ1bmN0aW9uO1xuXG4gIC8qKiDjg5jjg4Pjg4Djg7znrqHnkIYgKi9cbiAgcHVibGljIHJlYWRvbmx5IGhlYWRlcjogQU1DSGVhZGVyO1xuXG4gIC8qKiDoqK3lrpogKi9cbiAgcHVibGljIHJlYWRvbmx5IGNvbmZpZzogQU1DQ29uZmlnO1xuXG4gIC8qKiDjg5njg7zjgrnjg4njg6HjgqTjg7MgKi9cbiAgcHVibGljIHJlYWRvbmx5IGRvbWFpbjogc3RyaW5nO1xuXG4gIC8qKiBTU0zlr77lv5znirbms4Hjga7jgq3jg6Pjg4Pjgrfjg6UgKi9cbiAgcHJpdmF0ZSBzc2xDYWNoZTogTWFwPHN0cmluZywgYm9vbGVhbj4gPSBuZXcgTWFwKCk7XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBjb25maWcgLSBBTUPoqK3lrprvvIjnnIHnlaXmmYLjga/jg4fjg5Xjgqnjg6vjg4jlgKTvvIlcbiAgICogQHBhcmFtIGRvbWFpbiAtIOODmeODvOOCueODieODoeOCpOODs++8iOODh+ODleOCqeODq+ODiDogd2lraWRvdC5jb23vvIlcbiAgICovXG4gIGNvbnN0cnVjdG9yKGNvbmZpZzogUGFydGlhbDxBTUNDb25maWc+ID0ge30sIGRvbWFpbiA9ICd3aWtpZG90LmNvbScpIHtcbiAgICB0aGlzLmNvbmZpZyA9IHsgLi4uREVGQVVMVF9BTUNfQ09ORklHLCAuLi5jb25maWcgfTtcbiAgICB0aGlzLmRvbWFpbiA9IGRvbWFpbjtcbiAgICB0aGlzLmhlYWRlciA9IG5ldyBBTUNIZWFkZXIoKTtcbiAgICB0aGlzLmxpbWl0ID0gcExpbWl0KHRoaXMuY29uZmlnLnNlbWFwaG9yZUxpbWl0KTtcblxuICAgIHRoaXMua3kgPSBreS5jcmVhdGUoe1xuICAgICAgdGltZW91dDogdGhpcy5jb25maWcudGltZW91dCxcbiAgICAgIHJldHJ5OiAwLCAvLyDmiYvli5Xjgafjg6rjg4jjg6njgqTjgpLliLblvqFcbiAgICB9KTtcblxuICAgIC8vIHd3d+OBr+W4uOOBq1NTTOWvvuW/nFxuICAgIHRoaXMuc3NsQ2FjaGUuc2V0KCd3d3cnLCB0cnVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDjgrXjgqTjg4jjga7lrZjlnKjjgahTU0zlr77lv5znirbms4HjgpLnorroqo3jgZnjgotcbiAgICogQHBhcmFtIHNpdGVOYW1lIC0g44K144Kk44OI5ZCNXG4gICAqIEByZXR1cm5zIFNTTOWvvuW/nOeKtuazge+8iHRydWU6IEhUVFBT44CBZmFsc2U6IEhUVFDvvIlcbiAgICovXG4gIGNoZWNrU2l0ZVNTTChzaXRlTmFtZTogc3RyaW5nKTogV2lraWRvdFJlc3VsdEFzeW5jPGJvb2xlYW4+IHtcbiAgICAvLyDjgq3jg6Pjg4Pjgrfjg6XjgavlrZjlnKjjgZnjgozjgbDjgZ3jgozjgpLov5TjgZlcbiAgICBjb25zdCBjYWNoZWQgPSB0aGlzLnNzbENhY2hlLmdldChzaXRlTmFtZSk7XG4gICAgaWYgKGNhY2hlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gd2RPa0FzeW5jKGNhY2hlZCk7XG4gICAgfVxuXG4gICAgLy8gd3d344Gv5bi444GrU1NM5a++5b+cXG4gICAgaWYgKHNpdGVOYW1lID09PSAnd3d3Jykge1xuICAgICAgcmV0dXJuIHdkT2tBc3luYyh0cnVlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGBodHRwOi8vJHtzaXRlTmFtZX0uJHt0aGlzLmRvbWFpbn1gLCB7XG4gICAgICAgICAgbWV0aG9kOiAnR0VUJyxcbiAgICAgICAgICByZWRpcmVjdDogJ21hbnVhbCcsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIDQwNOOBruWgtOWQiOOBr+OCteOCpOODiOOBjOWtmOWcqOOBl+OBquOBhFxuICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09PSA0MDQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgTm90Rm91bmRFeGNlcHRpb24oYFNpdGUgaXMgbm90IGZvdW5kOiAke3NpdGVOYW1lfS4ke3RoaXMuZG9tYWlufWApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gMzAx44Oq44OA44Kk44Os44Kv44OI44GnaHR0cHPjgavlkJHjgYvjgYbloLTlkIjjga9TU0zlr77lv5xcbiAgICAgICAgY29uc3QgaXNTU0wgPVxuICAgICAgICAgIHJlc3BvbnNlLnN0YXR1cyA9PT0gMzAxICYmIHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCdMb2NhdGlvbicpPy5zdGFydHNXaXRoKCdodHRwcycpID09PSB0cnVlO1xuXG4gICAgICAgIC8vIOOCreODo+ODg+OCt+ODpeOBq+S/neWtmFxuICAgICAgICB0aGlzLnNzbENhY2hlLnNldChzaXRlTmFtZSwgaXNTU0wpO1xuICAgICAgICByZXR1cm4gaXNTU0w7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFdpa2lkb3RFcnJvcikge1xuICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGNoZWNrIFNTTCBmb3IgJHtzaXRlTmFtZX06ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFNQ+ODquOCr+OCqOOCueODiOOCkuWun+ihjOOBmeOCi1xuICAgKiBAcGFyYW0gYm9kaWVzIC0g44Oq44Kv44Ko44K544OI44Oc44OH44Kj6YWN5YiXXG4gICAqIEBwYXJhbSBzaXRlTmFtZSAtIOOCteOCpOODiOWQje+8iOecgeeVpeaZguOBr3d3d++8iVxuICAgKiBAcGFyYW0gc3NsU3VwcG9ydGVkIC0gU1NM5a++5b+c77yI55yB55Wl5pmC44Gv6Ieq5YuV5qSc5Ye677yJXG4gICAqIEByZXR1cm5zIOODrOOCueODneODs+OCuemFjeWIl1xuICAgKi9cbiAgcmVxdWVzdChcbiAgICBib2RpZXM6IEFNQ1JlcXVlc3RCb2R5W10sXG4gICAgc2l0ZU5hbWUgPSAnd3d3JyxcbiAgICBzc2xTdXBwb3J0ZWQ/OiBib29sZWFuXG4gICk6IFdpa2lkb3RSZXN1bHRBc3luYzxBTUNSZXNwb25zZVtdPiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdFdpdGhPcHRpb25zKGJvZGllcywge1xuICAgICAgc2l0ZU5hbWUsXG4gICAgICBzc2xTdXBwb3J0ZWQsXG4gICAgICByZXR1cm5FeGNlcHRpb25zOiBmYWxzZSxcbiAgICB9KSBhcyBXaWtpZG90UmVzdWx0QXN5bmM8QU1DUmVzcG9uc2VbXT47XG4gIH1cblxuICAvKipcbiAgICogQU1D44Oq44Kv44Ko44K544OI44KS5a6f6KGM44GZ44KL77yI44Kq44OX44K344On44Oz5oyH5a6a54mI77yJXG4gICAqIEBwYXJhbSBib2RpZXMgLSDjg6rjgq/jgqjjgrnjg4jjg5zjg4fjgqPphY3liJdcbiAgICogQHBhcmFtIG9wdGlvbnMgLSDjg6rjgq/jgqjjgrnjg4jjgqrjg5fjgrfjg6fjg7NcbiAgICogQHJldHVybnMg44Os44K544Od44Oz44K56YWN5YiX77yIcmV0dXJuRXhjZXB0aW9uc+OBjHRydWXjga7loLTlkIjjga/jgqjjg6njg7zjgoLlkKvjgoDvvIlcbiAgICovXG4gIHJlcXVlc3RXaXRoT3B0aW9ucyhcbiAgICBib2RpZXM6IEFNQ1JlcXVlc3RCb2R5W10sXG4gICAgb3B0aW9uczogQU1DUmVxdWVzdE9wdGlvbnMgPSB7fVxuICApOiBXaWtpZG90UmVzdWx0QXN5bmM8KEFNQ1Jlc3BvbnNlIHwgV2lraWRvdEVycm9yKVtdPiB7XG4gICAgY29uc3QgeyBzaXRlTmFtZSA9ICd3d3cnLCBzc2xTdXBwb3J0ZWQsIHJldHVybkV4Y2VwdGlvbnMgPSBmYWxzZSB9ID0gb3B0aW9ucztcblxuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIC8vIFNTTOWvvuW/nOeKtuazgeOCkuWPluW+l1xuICAgICAgICBsZXQgc3NsID0gc3NsU3VwcG9ydGVkO1xuICAgICAgICBpZiAoc3NsID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBjb25zdCBzc2xSZXN1bHQgPSBhd2FpdCB0aGlzLmNoZWNrU2l0ZVNTTChzaXRlTmFtZSk7XG4gICAgICAgICAgaWYgKHNzbFJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgICB0aHJvdyBzc2xSZXN1bHQuZXJyb3I7XG4gICAgICAgICAgfVxuICAgICAgICAgIHNzbCA9IHNzbFJlc3VsdC52YWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHByb3RvY29sID0gc3NsID8gJ2h0dHBzJyA6ICdodHRwJztcbiAgICAgICAgY29uc3QgdXJsID0gYCR7cHJvdG9jb2x9Oi8vJHtzaXRlTmFtZX0uJHt0aGlzLmRvbWFpbn0vYWpheC1tb2R1bGUtY29ubmVjdG9yLnBocGA7XG5cbiAgICAgICAgLy8g5Lim5YiX44Gn44Oq44Kv44Ko44K544OI44KS5a6f6KGMXG4gICAgICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgICBib2RpZXMubWFwKChib2R5KSA9PiB0aGlzLmxpbWl0KCgpID0+IHRoaXMuc2luZ2xlUmVxdWVzdChib2R5LCB1cmwpKSlcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAocmV0dXJuRXhjZXB0aW9ucykge1xuICAgICAgICAgIC8vIOOCqOODqeODvOOCguWQq+OCgeOBpuOBmeOBueOBpuOBrue1kOaenOOCkui/lOOBmVxuICAgICAgICAgIHJldHVybiByZXN1bHRzLm1hcCgocikgPT4ge1xuICAgICAgICAgICAgaWYgKHIuaXNPaygpKSB7XG4gICAgICAgICAgICAgIHJldHVybiByLnZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHIuZXJyb3I7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyDjgqjjg6njg7zjgYzjgYLjgozjgbDmnIDliJ3jga7jgqjjg6njg7zjgpLjgrnjg63jg7xcbiAgICAgICAgY29uc3QgZmlyc3RFcnJvciA9IHJlc3VsdHMuZmluZCgocikgPT4gci5pc0VycigpKTtcbiAgICAgICAgaWYgKGZpcnN0RXJyb3I/LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyBmaXJzdEVycm9yLmVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdHMubWFwKChyKSA9PiB7XG4gICAgICAgICAgaWYgKHIuaXNPaygpKSB7XG4gICAgICAgICAgICByZXR1cm4gci52YWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRFcnJvcignVW5leHBlY3RlZCBlcnJvciBpbiByZXN1bHQgcHJvY2Vzc2luZycpO1xuICAgICAgICB9KTtcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgV2lraWRvdEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBBTUMgcmVxdWVzdCBmYWlsZWQ6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIOWNmOS4gOODquOCr+OCqOOCueODiOOCkuWun+ihjOOBmeOCi+WGhemDqOODoeOCveODg+ODiVxuICAgKiBAcGFyYW0gYm9keSAtIOODquOCr+OCqOOCueODiOODnOODh+OCo1xuICAgKiBAcGFyYW0gdXJsIC0g44Oq44Kv44Ko44K544OIVVJMXG4gICAqIEByZXR1cm5zIOODrOOCueODneODs+OCuVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBzaW5nbGVSZXF1ZXN0KFxuICAgIGJvZHk6IEFNQ1JlcXVlc3RCb2R5LFxuICAgIHVybDogc3RyaW5nXG4gICk6IFByb21pc2U8V2lraWRvdFJlc3VsdEFzeW5jPEFNQ1Jlc3BvbnNlPj4ge1xuICAgIGxldCByZXRyeUNvdW50ID0gMDtcblxuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICB0cnkge1xuICAgICAgICAvLyB3aWtpZG90X3Rva2VuN+OCkui/veWKoFxuICAgICAgICBjb25zdCByZXF1ZXN0Qm9keSA9IHsgLi4uYm9keSwgd2lraWRvdF90b2tlbjc6IFdJS0lET1RfVE9LRU43IH07XG5cbiAgICAgICAgLy8gVVJM44Ko44Oz44Kz44O844OJ44GV44KM44Gf44Oc44OH44Kj44KS5L2c5oiQXG4gICAgICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IFVSTFNlYXJjaFBhcmFtcygpO1xuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhyZXF1ZXN0Qm9keSkpIHtcbiAgICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZm9ybURhdGEuYXBwZW5kKGtleSwgU3RyaW5nKHZhbHVlKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmt5LnBvc3QodXJsLCB7XG4gICAgICAgICAgaGVhZGVyczogdGhpcy5oZWFkZXIuZ2V0SGVhZGVycygpLFxuICAgICAgICAgIGJvZHk6IGZvcm1EYXRhLnRvU3RyaW5nKCksXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIEpTT07jgajjgZfjgabjg5Hjg7zjgrlcbiAgICAgICAgbGV0IHJlc3BvbnNlRGF0YTogdW5rbm93bjtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXNwb25zZURhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIHJldHVybiB3ZEVyckFzeW5jKFxuICAgICAgICAgICAgbmV3IFJlc3BvbnNlRGF0YUVycm9yKGBBTUMgcmVzcG9uZGVkIHdpdGggbm9uLUpTT04gZGF0YTogJHthd2FpdCByZXNwb25zZS50ZXh0KCl9YClcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gem9k44Gn44OQ44Oq44OH44O844K344On44OzXG4gICAgICAgIGNvbnN0IHBhcnNlUmVzdWx0ID0gYW1jUmVzcG9uc2VTY2hlbWEuc2FmZVBhcnNlKHJlc3BvbnNlRGF0YSk7XG4gICAgICAgIGlmICghcGFyc2VSZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICAgIHJldHVybiB3ZEVyckFzeW5jKFxuICAgICAgICAgICAgbmV3IFJlc3BvbnNlRGF0YUVycm9yKGBJbnZhbGlkIEFNQyByZXNwb25zZSBmb3JtYXQ6ICR7cGFyc2VSZXN1bHQuZXJyb3IubWVzc2FnZX1gKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBhbWNSZXNwb25zZSA9IHBhcnNlUmVzdWx0LmRhdGE7XG5cbiAgICAgICAgLy8gdHJ5X2FnYWlu44Gu5aC05ZCI44Gv44Oq44OI44Op44KkXG4gICAgICAgIGlmIChhbWNSZXNwb25zZS5zdGF0dXMgPT09ICd0cnlfYWdhaW4nKSB7XG4gICAgICAgICAgcmV0cnlDb3VudCsrO1xuICAgICAgICAgIGlmIChyZXRyeUNvdW50ID49IHRoaXMuY29uZmlnLnJldHJ5TGltaXQpIHtcbiAgICAgICAgICAgIHJldHVybiB3ZEVyckFzeW5jKG5ldyBXaWtpZG90U3RhdHVzRXJyb3IoJ0FNQyByZXNwb25kZWQgd2l0aCB0cnlfYWdhaW4nLCAndHJ5X2FnYWluJykpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBiYWNrb2ZmID0gY2FsY3VsYXRlQmFja29mZihcbiAgICAgICAgICAgIHJldHJ5Q291bnQsXG4gICAgICAgICAgICB0aGlzLmNvbmZpZy5yZXRyeUludGVydmFsLFxuICAgICAgICAgICAgdGhpcy5jb25maWcuYmFja29mZkZhY3RvcixcbiAgICAgICAgICAgIHRoaXMuY29uZmlnLm1heEJhY2tvZmZcbiAgICAgICAgICApO1xuICAgICAgICAgIGF3YWl0IHNsZWVwKGJhY2tvZmYpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gbm9fcGVybWlzc2lvbuOBruWgtOWQiOOBr0ZvcmJpZGRlbkVycm9yXG4gICAgICAgIGlmIChhbWNSZXNwb25zZS5zdGF0dXMgPT09ICdub19wZXJtaXNzaW9uJykge1xuICAgICAgICAgIGNvbnN0IHRhcmdldFN0ciA9IGJvZHkubW9kdWxlTmFtZVxuICAgICAgICAgICAgPyBgbW9kdWxlTmFtZTogJHtib2R5Lm1vZHVsZU5hbWV9YFxuICAgICAgICAgICAgOiBib2R5LmFjdGlvblxuICAgICAgICAgICAgICA/IGBhY3Rpb246ICR7Ym9keS5hY3Rpb259LyR7Ym9keS5ldmVudCA/PyAnJ31gXG4gICAgICAgICAgICAgIDogJ3Vua25vd24nO1xuICAgICAgICAgIHJldHVybiB3ZEVyckFzeW5jKFxuICAgICAgICAgICAgbmV3IEZvcmJpZGRlbkVycm9yKFxuICAgICAgICAgICAgICBgWW91ciBhY2NvdW50IGhhcyBubyBwZXJtaXNzaW9uIHRvIHBlcmZvcm0gdGhpcyBhY3Rpb246ICR7dGFyZ2V0U3RyfWBcbiAgICAgICAgICAgIClcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gb2vjgafjgarjgYTloLTlkIjjga/jgqjjg6njg7xcbiAgICAgICAgaWYgKGFtY1Jlc3BvbnNlLnN0YXR1cyAhPT0gJ29rJykge1xuICAgICAgICAgIHJldHVybiB3ZEVyckFzeW5jKFxuICAgICAgICAgICAgbmV3IFdpa2lkb3RTdGF0dXNFcnJvcihcbiAgICAgICAgICAgICAgYEFNQyByZXNwb25kZWQgd2l0aCBlcnJvciBzdGF0dXM6IFwiJHthbWNSZXNwb25zZS5zdGF0dXN9XCJgLFxuICAgICAgICAgICAgICBhbWNSZXNwb25zZS5zdGF0dXNcbiAgICAgICAgICAgIClcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHdkT2tBc3luYyhhbWNSZXNwb25zZSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAvLyBIVFRQ44Ko44Op44O844Gu5aC05ZCI44Gv44Oq44OI44Op44KkXG4gICAgICAgIHJldHJ5Q291bnQrKztcbiAgICAgICAgaWYgKHJldHJ5Q291bnQgPj0gdGhpcy5jb25maWcucmV0cnlMaW1pdCkge1xuICAgICAgICAgIGNvbnN0IHN0YXR1c0NvZGUgPVxuICAgICAgICAgICAgZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJiAncmVzcG9uc2UnIGluIGVycm9yXG4gICAgICAgICAgICAgID8gKChlcnJvciBhcyB7IHJlc3BvbnNlPzogeyBzdGF0dXM/OiBudW1iZXIgfSB9KS5yZXNwb25zZT8uc3RhdHVzID8/XG4gICAgICAgICAgICAgICAgREVGQVVMVF9IVFRQX1NUQVRVU19DT0RFKVxuICAgICAgICAgICAgICA6IERFRkFVTFRfSFRUUF9TVEFUVVNfQ09ERTtcbiAgICAgICAgICByZXR1cm4gd2RFcnJBc3luYyhcbiAgICAgICAgICAgIG5ldyBBTUNIdHRwRXJyb3IoYEFNQyBIVFRQIHJlcXVlc3QgZmFpbGVkOiAke1N0cmluZyhlcnJvcil9YCwgc3RhdHVzQ29kZSlcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYmFja29mZiA9IGNhbGN1bGF0ZUJhY2tvZmYoXG4gICAgICAgICAgcmV0cnlDb3VudCxcbiAgICAgICAgICB0aGlzLmNvbmZpZy5yZXRyeUludGVydmFsLFxuICAgICAgICAgIHRoaXMuY29uZmlnLmJhY2tvZmZGYWN0b3IsXG4gICAgICAgICAgdGhpcy5jb25maWcubWF4QmFja29mZlxuICAgICAgICApO1xuICAgICAgICBhd2FpdCBzbGVlcChiYWNrb2ZmKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsCiAgICAiLyoqXG4gKiBBTUPjg6rjgq/jgqjjgrnjg4jjg5jjg4Pjg4Djg7zjgpLnrqHnkIbjgZnjgovjgq/jg6njgrlcbiAqL1xuZXhwb3J0IGNsYXNzIEFNQ0hlYWRlciB7XG4gIHByaXZhdGUgY29va2llczogTWFwPHN0cmluZywgc3RyaW5nPjtcbiAgcHJpdmF0ZSBjb250ZW50VHlwZTogc3RyaW5nO1xuICBwcml2YXRlIHVzZXJBZ2VudDogc3RyaW5nO1xuICBwcml2YXRlIHJlZmVyZXI6IHN0cmluZztcblxuICAvKipcbiAgICogQHBhcmFtIG9wdGlvbnMgLSDjg5jjg4Pjg4Djg7zliJ3mnJ/ljJbjgqrjg5fjgrfjg6fjg7NcbiAgICovXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM/OiB7IGNvbnRlbnRUeXBlPzogc3RyaW5nOyB1c2VyQWdlbnQ/OiBzdHJpbmc7IHJlZmVyZXI/OiBzdHJpbmcgfSkge1xuICAgIHRoaXMuY29udGVudFR5cGUgPSBvcHRpb25zPy5jb250ZW50VHlwZSA/PyAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkOyBjaGFyc2V0PVVURi04JztcbiAgICB0aGlzLnVzZXJBZ2VudCA9IG9wdGlvbnM/LnVzZXJBZ2VudCA/PyAnV2lraWRvdFRTJztcbiAgICB0aGlzLnJlZmVyZXIgPSBvcHRpb25zPy5yZWZlcmVyID8/ICdodHRwczovL3d3dy53aWtpZG90LmNvbS8nO1xuICAgIHRoaXMuY29va2llcyA9IG5ldyBNYXAoW1snd2lraWRvdF90b2tlbjcnLCAnMTIzNDU2J11dKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb29raWXjgpLoqK3lrprjgZnjgotcbiAgICogQHBhcmFtIG5hbWUgLSBDb29raWXlkI1cbiAgICogQHBhcmFtIHZhbHVlIC0gQ29va2ll5YCkXG4gICAqL1xuICBzZXRDb29raWUobmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5jb29raWVzLnNldChuYW1lLCB2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogQ29va2ll44KS5YmK6Zmk44GZ44KLXG4gICAqIEBwYXJhbSBuYW1lIC0gQ29va2ll5ZCNXG4gICAqL1xuICBkZWxldGVDb29raWUobmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5jb29raWVzLmRlbGV0ZShuYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb29raWXjgpLlj5blvpfjgZnjgotcbiAgICogQHBhcmFtIG5hbWUgLSBDb29raWXlkI1cbiAgICogQHJldHVybnMgQ29va2ll5YCk44CB5a2Y5Zyo44GX44Gq44GE5aC05ZCI44GvdW5kZWZpbmVkXG4gICAqL1xuICBnZXRDb29raWUobmFtZTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5jb29raWVzLmdldChuYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIVFRQ44OY44OD44OA44O844Kq44OW44K444Kn44Kv44OI44KS5Y+W5b6X44GZ44KLXG4gICAqIEByZXR1cm5zIOODmOODg+ODgOODvOi+nuabuFxuICAgKi9cbiAgZ2V0SGVhZGVycygpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgICBjb25zdCBjb29raWVTdHJpbmcgPSBBcnJheS5mcm9tKHRoaXMuY29va2llcy5lbnRyaWVzKCkpXG4gICAgICAubWFwKChbbmFtZSwgdmFsdWVdKSA9PiBgJHtuYW1lfT0ke3ZhbHVlfWApXG4gICAgICAuam9pbignOyAnKTtcblxuICAgIHJldHVybiB7XG4gICAgICAnQ29udGVudC1UeXBlJzogdGhpcy5jb250ZW50VHlwZSxcbiAgICAgICdVc2VyLUFnZW50JzogdGhpcy51c2VyQWdlbnQsXG4gICAgICBSZWZlcmVyOiB0aGlzLnJlZmVyZXIsXG4gICAgICBDb29raWU6IGNvb2tpZVN0cmluZyxcbiAgICB9O1xuICB9XG59XG4iLAogICAgImltcG9ydCB7IHogfSBmcm9tICd6b2QnO1xuXG4vKipcbiAqIEFNQ+ODquOCr+OCqOOCueODiOODnOODh+OCo+OBruWApOWei1xuICovXG5leHBvcnQgdHlwZSBBTUNSZXF1ZXN0Qm9keVZhbHVlID1cbiAgfCBzdHJpbmdcbiAgfCBudW1iZXJcbiAgfCBib29sZWFuXG4gIHwgbnVsbFxuICB8IHVuZGVmaW5lZFxuICB8IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gIHwgQU1DUmVxdWVzdEJvZHlWYWx1ZVtdO1xuXG4vKipcbiAqIEFNQ+ODquOCr+OCqOOCueODiOODnOODh+OCo+OBruWei+Wumue+qVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFNQ1JlcXVlc3RCb2R5IHtcbiAgbW9kdWxlTmFtZT86IHN0cmluZztcbiAgYWN0aW9uPzogc3RyaW5nO1xuICBldmVudD86IHN0cmluZztcbiAgW2tleTogc3RyaW5nXTogQU1DUmVxdWVzdEJvZHlWYWx1ZTtcbn1cblxuLyoqXG4gKiBBTUPjg6zjgrnjg53jg7Pjgrnjga7jg5njg7zjgrnjgrnjgq3jg7zjg55cbiAqL1xuY29uc3QgYmFzZVNjaGVtYTogei5ab2RPYmplY3Q8e1xuICBzdGF0dXM6IHouWm9kU3RyaW5nO1xuICBib2R5OiB6LlpvZE9wdGlvbmFsPHouWm9kU3RyaW5nPjtcbiAgbWVzc2FnZTogei5ab2RPcHRpb25hbDx6LlpvZFN0cmluZz47XG59PiA9IHoub2JqZWN0KHtcbiAgc3RhdHVzOiB6LnN0cmluZygpLFxuICBib2R5OiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gIG1lc3NhZ2U6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbn0pO1xuXG4vKipcbiAqIEFNQ+ODrOOCueODneODs+OCueOCueOCreODvOODnlxuICovXG5leHBvcnQgY29uc3QgYW1jUmVzcG9uc2VTY2hlbWE6IHouWm9kVHlwZTx6LmluZmVyPHR5cGVvZiBiYXNlU2NoZW1hPiAmIFJlY29yZDxzdHJpbmcsIHVua25vd24+PiA9XG4gIGJhc2VTY2hlbWEucGFzc3Rocm91Z2goKTtcblxuLyoqXG4gKiBBTUPjg6zjgrnjg53jg7PjgrnlnotcbiAqL1xuZXhwb3J0IHR5cGUgQU1DUmVzcG9uc2UgPSB6LmluZmVyPHR5cGVvZiBhbWNSZXNwb25zZVNjaGVtYT47XG5cbi8qKlxuICog5oiQ5Yqf44GX44GfQU1D44Os44K544Od44Oz44K5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQU1DU3VjY2Vzc1Jlc3BvbnNlIHtcbiAgc3RhdHVzOiAnb2snO1xuICBib2R5OiBzdHJpbmc7XG4gIFtrZXk6IHN0cmluZ106IHVua25vd247XG59XG5cbi8qKlxuICogQU1D44Os44K544Od44Oz44K544GM5oiQ5Yqf44GL44Gp44GG44GL44KS5Yik5a6a44GZ44KL5Z6L44Ks44O844OJXG4gKiBAcGFyYW0gcmVzcG9uc2UgLSBBTUPjg6zjgrnjg53jg7PjgrlcbiAqIEByZXR1cm5zIOaIkOWKn+ODrOOCueODneODs+OCueOBruWgtOWQiHRydWVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzU3VjY2Vzc1Jlc3BvbnNlKHJlc3BvbnNlOiBBTUNSZXNwb25zZSk6IHJlc3BvbnNlIGlzIEFNQ1N1Y2Nlc3NSZXNwb25zZSB7XG4gIHJldHVybiByZXNwb25zZS5zdGF0dXMgPT09ICdvayc7XG59XG4iLAogICAgImV4cG9ydCB7IEFNQ0NsaWVudCwgdHlwZSBBTUNSZXF1ZXN0T3B0aW9ucywgbWFza1NlbnNpdGl2ZURhdGEgfSBmcm9tICcuL2FtYy1jbGllbnQnO1xuZXhwb3J0IHsgdHlwZSBBTUNDb25maWcsIERFRkFVTFRfQU1DX0NPTkZJRyB9IGZyb20gJy4vYW1jLWNvbmZpZyc7XG5leHBvcnQgeyBBTUNIZWFkZXIgfSBmcm9tICcuL2FtYy1oZWFkZXInO1xuZXhwb3J0IHtcbiAgdHlwZSBBTUNSZXF1ZXN0Qm9keSxcbiAgdHlwZSBBTUNSZXNwb25zZSxcbiAgdHlwZSBBTUNTdWNjZXNzUmVzcG9uc2UsXG4gIGFtY1Jlc3BvbnNlU2NoZW1hLFxuICBpc1N1Y2Nlc3NSZXNwb25zZSxcbn0gZnJvbSAnLi9hbWMtdHlwZXMnO1xuZXhwb3J0IHsgbG9naW4sIGxvZ291dCB9IGZyb20gJy4vYXV0aCc7XG4iLAogICAgImltcG9ydCB7IFNlc3Npb25DcmVhdGVFcnJvciB9IGZyb20gJy4uL2NvbW1vbi9lcnJvcnMnO1xuaW1wb3J0IHsgZnJvbVByb21pc2UsIHR5cGUgV2lraWRvdFJlc3VsdEFzeW5jLCB3ZE9rQXN5bmMgfSBmcm9tICcuLi9jb21tb24vdHlwZXMnO1xuaW1wb3J0IHR5cGUgeyBBdXRoQ2xpZW50Q29udGV4dCB9IGZyb20gJy4uL21vZHVsZS90eXBlcyc7XG5cbmNvbnN0IExPR0lOX1VSTCA9ICdodHRwczovL3d3dy53aWtpZG90LmNvbS9kZWZhdWx0LS1mbG93L2xvZ2luX19Mb2dpblBvcHVwU2NyZWVuJztcblxuLyoqXG4gKiDjg6bjg7zjgrbjg7zlkI3jgajjg5Hjgrnjg6/jg7zjg4njgadXaWtpZG9044Gr44Ot44Kw44Kk44Oz44GZ44KLXG4gKiBAcGFyYW0gY2xpZW50IC0g44Kv44Op44Kk44Ki44Oz44OI44Kz44Oz44OG44Kt44K544OI77yIQU1DQ2xpZW5044KS5oyB44Gk44Kq44OW44K444Kn44Kv44OI77yJXG4gKiBAcGFyYW0gdXNlcm5hbWUgLSDjg6bjg7zjgrbjg7zlkI1cbiAqIEBwYXJhbSBwYXNzd29yZCAtIOODkeOCueODr+ODvOODiVxuICogQHJldHVybnMg5oiQ5Yqf5pmC44Gvdm9pZOOAgeWkseaVl+aZguOBr1Nlc3Npb25DcmVhdGVFcnJvclxuICovXG5leHBvcnQgZnVuY3Rpb24gbG9naW4oXG4gIGNsaWVudDogQXV0aENsaWVudENvbnRleHQsXG4gIHVzZXJuYW1lOiBzdHJpbmcsXG4gIHBhc3N3b3JkOiBzdHJpbmdcbik6IFdpa2lkb3RSZXN1bHRBc3luYzx2b2lkPiB7XG4gIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgZm9ybURhdGEgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHtcbiAgICAgICAgbG9naW46IHVzZXJuYW1lLFxuICAgICAgICBwYXNzd29yZDogcGFzc3dvcmQsXG4gICAgICAgIGFjdGlvbjogJ0xvZ2luMkFjdGlvbicsXG4gICAgICAgIGV2ZW50OiAnbG9naW4nLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goTE9HSU5fVVJMLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBoZWFkZXJzOiBjbGllbnQuYW1jQ2xpZW50LmhlYWRlci5nZXRIZWFkZXJzKCksXG4gICAgICAgIGJvZHk6IGZvcm1EYXRhLnRvU3RyaW5nKCksXG4gICAgICB9KTtcblxuICAgICAgLy8gQ2hlY2sgc3RhdHVzIGNvZGVcbiAgICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgdGhyb3cgbmV3IFNlc3Npb25DcmVhdGVFcnJvcihcbiAgICAgICAgICBgTG9naW4gYXR0ZW1wdCBmYWlsZWQgZHVlIHRvIEhUVFAgc3RhdHVzIGNvZGU6ICR7cmVzcG9uc2Uuc3RhdHVzfWBcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgYm9keSBmb3IgZXJyb3IgbWVzc2FnZVxuICAgICAgY29uc3QgYm9keSA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKTtcbiAgICAgIGlmIChib2R5LmluY2x1ZGVzKCdUaGUgbG9naW4gYW5kIHBhc3N3b3JkIGRvIG5vdCBtYXRjaCcpKSB7XG4gICAgICAgIHRocm93IG5ldyBTZXNzaW9uQ3JlYXRlRXJyb3IoJ0xvZ2luIGF0dGVtcHQgZmFpbGVkIGR1ZSB0byBpbnZhbGlkIHVzZXJuYW1lIG9yIHBhc3N3b3JkJyk7XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGNvb2tpZXNcbiAgICAgIGNvbnN0IGNvb2tpZXMgPSByZXNwb25zZS5oZWFkZXJzLmdldCgnU2V0LUNvb2tpZScpO1xuICAgICAgaWYgKCFjb29raWVzKSB7XG4gICAgICAgIHRocm93IG5ldyBTZXNzaW9uQ3JlYXRlRXJyb3IoJ0xvZ2luIGF0dGVtcHQgZmFpbGVkIGR1ZSB0byBtaXNzaW5nIGNvb2tpZXMnKTtcbiAgICAgIH1cblxuICAgICAgLy8gRXh0cmFjdCBXSUtJRE9UX1NFU1NJT05fSUQgZnJvbSBjb29raWVzXG4gICAgICBjb25zdCBzZXNzaW9uSWRNYXRjaCA9IGNvb2tpZXMubWF0Y2goL1dJS0lET1RfU0VTU0lPTl9JRD0oW147XSspLyk7XG4gICAgICBpZiAoIXNlc3Npb25JZE1hdGNoPy5bMV0pIHtcbiAgICAgICAgdGhyb3cgbmV3IFNlc3Npb25DcmVhdGVFcnJvcihcbiAgICAgICAgICAnTG9naW4gYXR0ZW1wdCBmYWlsZWQgZHVlIHRvIG1pc3NpbmcgV0lLSURPVF9TRVNTSU9OX0lEIGNvb2tpZSdcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gU2V0IHNlc3Npb24gY29va2llXG4gICAgICBjbGllbnQuYW1jQ2xpZW50LmhlYWRlci5zZXRDb29raWUoJ1dJS0lET1RfU0VTU0lPTl9JRCcsIHNlc3Npb25JZE1hdGNoWzFdKTtcbiAgICB9KSgpLFxuICAgIChlcnJvcikgPT4ge1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgU2Vzc2lvbkNyZWF0ZUVycm9yKSB7XG4gICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXcgU2Vzc2lvbkNyZWF0ZUVycm9yKGBMb2dpbiBmYWlsZWQ6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICB9XG4gICk7XG59XG5cbi8qKlxuICog44Ot44Kw44Ki44Km44OI44GZ44KLXG4gKiBAcGFyYW0gY2xpZW50IC0g44Kv44Op44Kk44Ki44Oz44OI44Kz44Oz44OG44Kt44K544OI77yIQU1DQ2xpZW5044KS5oyB44Gk44Kq44OW44K444Kn44Kv44OI77yJXG4gKiBAcmV0dXJucyDmiJDlip/mmYLjga92b2lkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsb2dvdXQoY2xpZW50OiBBdXRoQ2xpZW50Q29udGV4dCk6IFdpa2lkb3RSZXN1bHRBc3luYzx2b2lkPiB7XG4gIC8vIFRyeSB0byBsb2dvdXQgdmlhIEFNQywgdGhlbiBhbHdheXMgcmVtb3ZlIHNlc3Npb24gY29va2llXG4gIHJldHVybiBjbGllbnQuYW1jQ2xpZW50XG4gICAgLnJlcXVlc3QoW1xuICAgICAge1xuICAgICAgICBtb2R1bGVOYW1lOiAnRW1wdHknLFxuICAgICAgICBhY3Rpb246ICdMb2dpbjJBY3Rpb24nLFxuICAgICAgICBldmVudDogJ2xvZ291dCcsXG4gICAgICB9LFxuICAgIF0pXG4gICAgLm1hcCgoKSA9PiB7XG4gICAgICAvLyBMb2dvdXQgc3VjY2VlZGVkLCByZW1vdmUgc2Vzc2lvbiBjb29raWVcbiAgICAgIGNsaWVudC5hbWNDbGllbnQuaGVhZGVyLmRlbGV0ZUNvb2tpZSgnV0lLSURPVF9TRVNTSU9OX0lEJyk7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH0pXG4gICAgLm9yRWxzZSgoKSA9PiB7XG4gICAgICAvLyBFdmVuIGlmIGxvZ291dCByZXF1ZXN0IGZhaWxzLCB3ZSBzdGlsbCB3YW50IHRvIGNsZWFyIHRoZSBzZXNzaW9uIGxvY2FsbHlcbiAgICAgIGNsaWVudC5hbWNDbGllbnQuaGVhZGVyLmRlbGV0ZUNvb2tpZSgnV0lLSURPVF9TRVNTSU9OX0lEJyk7XG4gICAgICByZXR1cm4gd2RPa0FzeW5jKHVuZGVmaW5lZCk7XG4gICAgfSk7XG59XG4iLAogICAgImltcG9ydCAqIGFzIGNoZWVyaW8gZnJvbSAnY2hlZXJpbyc7XG5pbXBvcnQge1xuICBGb3JiaWRkZW5FcnJvcixcbiAgTG9naW5SZXF1aXJlZEVycm9yLFxuICBOb0VsZW1lbnRFcnJvcixcbiAgVW5leHBlY3RlZEVycm9yLFxufSBmcm9tICcuLi8uLi9jb21tb24vZXJyb3JzJztcbmltcG9ydCB7IGZyb21Qcm9taXNlLCB0eXBlIFdpa2lkb3RSZXN1bHRBc3luYyB9IGZyb20gJy4uLy4uL2NvbW1vbi90eXBlcyc7XG5pbXBvcnQgeyBwYXJzZU9kYXRlLCBwYXJzZVVzZXIgfSBmcm9tICcuLi8uLi91dGlsL3BhcnNlcic7XG5pbXBvcnQgdHlwZSB7IENsaWVudCB9IGZyb20gJy4uL2NsaWVudCc7XG5pbXBvcnQgdHlwZSB7IEFic3RyYWN0VXNlciB9IGZyb20gJy4uL3VzZXInO1xuaW1wb3J0IHR5cGUgeyBVc2VyIH0gZnJvbSAnLi4vdXNlci91c2VyJztcblxuLyoqXG4gKiDjg5fjg6njgqTjg5njg7zjg4jjg6Hjg4Pjgrvjg7zjgrjjg4fjg7zjgr9cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcml2YXRlTWVzc2FnZURhdGEge1xuICBjbGllbnQ6IENsaWVudDtcbiAgaWQ6IG51bWJlcjtcbiAgc2VuZGVyOiBBYnN0cmFjdFVzZXI7XG4gIHJlY2lwaWVudDogQWJzdHJhY3RVc2VyO1xuICBzdWJqZWN0OiBzdHJpbmc7XG4gIGJvZHk6IHN0cmluZztcbiAgY3JlYXRlZEF0OiBEYXRlO1xufVxuXG4vKipcbiAqIOODl+ODqeOCpOODmeODvOODiOODoeODg+OCu+ODvOOCuFxuICovXG5leHBvcnQgY2xhc3MgUHJpdmF0ZU1lc3NhZ2Uge1xuICBwdWJsaWMgcmVhZG9ubHkgY2xpZW50OiBDbGllbnQ7XG4gIHB1YmxpYyByZWFkb25seSBpZDogbnVtYmVyO1xuICBwdWJsaWMgcmVhZG9ubHkgc2VuZGVyOiBBYnN0cmFjdFVzZXI7XG4gIHB1YmxpYyByZWFkb25seSByZWNpcGllbnQ6IEFic3RyYWN0VXNlcjtcbiAgcHVibGljIHJlYWRvbmx5IHN1YmplY3Q6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IGJvZHk6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IGNyZWF0ZWRBdDogRGF0ZTtcblxuICBjb25zdHJ1Y3RvcihkYXRhOiBQcml2YXRlTWVzc2FnZURhdGEpIHtcbiAgICB0aGlzLmNsaWVudCA9IGRhdGEuY2xpZW50O1xuICAgIHRoaXMuaWQgPSBkYXRhLmlkO1xuICAgIHRoaXMuc2VuZGVyID0gZGF0YS5zZW5kZXI7XG4gICAgdGhpcy5yZWNpcGllbnQgPSBkYXRhLnJlY2lwaWVudDtcbiAgICB0aGlzLnN1YmplY3QgPSBkYXRhLnN1YmplY3Q7XG4gICAgdGhpcy5ib2R5ID0gZGF0YS5ib2R5O1xuICAgIHRoaXMuY3JlYXRlZEF0ID0gZGF0YS5jcmVhdGVkQXQ7XG4gIH1cblxuICAvKipcbiAgICog44Oh44OD44K744O844K4SUTjgYvjgonjg6Hjg4Pjgrvjg7zjgrjjgpLlj5blvpfjgZnjgotcbiAgICogQHBhcmFtIGNsaWVudCAtIOOCr+ODqeOCpOOCouODs+ODiFxuICAgKiBAcGFyYW0gbWVzc2FnZUlkIC0g44Oh44OD44K744O844K4SURcbiAgICogQHJldHVybnMg44OX44Op44Kk44OZ44O844OI44Oh44OD44K744O844K4XG4gICAqL1xuICBzdGF0aWMgZnJvbUlkKGNsaWVudDogQ2xpZW50LCBtZXNzYWdlSWQ6IG51bWJlcik6IFdpa2lkb3RSZXN1bHRBc3luYzxQcml2YXRlTWVzc2FnZT4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IFByaXZhdGVNZXNzYWdlQ29sbGVjdGlvbi5mcm9tSWRzKGNsaWVudCwgW21lc3NhZ2VJZF0pO1xuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IHJlc3VsdC52YWx1ZVswXTtcbiAgICAgICAgaWYgKCFtZXNzYWdlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IE5vRWxlbWVudEVycm9yKGBNZXNzYWdlIG5vdCBmb3VuZDogJHttZXNzYWdlSWR9YCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEZvcmJpZGRlbkVycm9yIHx8IGVycm9yIGluc3RhbmNlb2YgTm9FbGVtZW50RXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBnZXQgbWVzc2FnZTogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICog44OX44Op44Kk44OZ44O844OI44Oh44OD44K744O844K444KS6YCB5L+h44GZ44KLXG4gICAqIEBwYXJhbSBjbGllbnQgLSDjgq/jg6njgqTjgqLjg7Pjg4hcbiAgICogQHBhcmFtIHJlY2lwaWVudCAtIOWPl+S/oeiAhVxuICAgKiBAcGFyYW0gc3ViamVjdCAtIOS7tuWQjVxuICAgKiBAcGFyYW0gYm9keSAtIOacrOaWh1xuICAgKi9cbiAgc3RhdGljIHNlbmQoXG4gICAgY2xpZW50OiBDbGllbnQsXG4gICAgcmVjaXBpZW50OiBVc2VyLFxuICAgIHN1YmplY3Q6IHN0cmluZyxcbiAgICBib2R5OiBzdHJpbmdcbiAgKTogV2lraWRvdFJlc3VsdEFzeW5jPHZvaWQ+IHtcbiAgICBjb25zdCBsb2dpblJlc3VsdCA9IGNsaWVudC5yZXF1aXJlTG9naW4oKTtcbiAgICBpZiAobG9naW5SZXN1bHQuaXNFcnIoKSkge1xuICAgICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgICBQcm9taXNlLnJlamVjdChsb2dpblJlc3VsdC5lcnJvciksXG4gICAgICAgICgpID0+IG5ldyBMb2dpblJlcXVpcmVkRXJyb3IoJ0xvZ2luIHJlcXVpcmVkIHRvIHNlbmQgbWVzc2FnZScpXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNsaWVudC5hbWNDbGllbnQucmVxdWVzdChbXG4gICAgICAgICAge1xuICAgICAgICAgICAgc291cmNlOiBib2R5LFxuICAgICAgICAgICAgc3ViamVjdCxcbiAgICAgICAgICAgIHRvX3VzZXJfaWQ6IHJlY2lwaWVudC5pZCxcbiAgICAgICAgICAgIGFjdGlvbjogJ0Rhc2hib2FyZE1lc3NhZ2VBY3Rpb24nLFxuICAgICAgICAgICAgZXZlbnQ6ICdzZW5kJyxcbiAgICAgICAgICAgIG1vZHVsZU5hbWU6ICdFbXB0eScsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSk7XG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIHNlbmQgbWVzc2FnZTogJHtTdHJpbmcoZXJyb3IpfWApXG4gICAgKTtcbiAgfVxuXG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBQcml2YXRlTWVzc2FnZShpZD0ke3RoaXMuaWR9LCBzZW5kZXI9JHt0aGlzLnNlbmRlcn0sIHJlY2lwaWVudD0ke3RoaXMucmVjaXBpZW50fSwgc3ViamVjdD0ke3RoaXMuc3ViamVjdH0pYDtcbiAgfVxufVxuXG4vKipcbiAqIOODl+ODqeOCpOODmeODvOODiOODoeODg+OCu+ODvOOCuOOCs+ODrOOCr+OCt+ODp+ODs1xuICovXG5leHBvcnQgY2xhc3MgUHJpdmF0ZU1lc3NhZ2VDb2xsZWN0aW9uIGV4dGVuZHMgQXJyYXk8UHJpdmF0ZU1lc3NhZ2U+IHtcbiAgcHVibGljIHJlYWRvbmx5IGNsaWVudDogQ2xpZW50O1xuXG4gIGNvbnN0cnVjdG9yKGNsaWVudDogQ2xpZW50LCBtZXNzYWdlcz86IFByaXZhdGVNZXNzYWdlW10pIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuY2xpZW50ID0gY2xpZW50O1xuICAgIGlmIChtZXNzYWdlcykge1xuICAgICAgdGhpcy5wdXNoKC4uLm1lc3NhZ2VzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSUTjgafmpJzntKJcbiAgICovXG4gIGZpbmRCeUlkKGlkOiBudW1iZXIpOiBQcml2YXRlTWVzc2FnZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZmluZCgobWVzc2FnZSkgPT4gbWVzc2FnZS5pZCA9PT0gaWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIOODoeODg+OCu+ODvOOCuElE44Gu44Oq44K544OI44GL44KJ44Oh44OD44K744O844K444KS5Y+W5b6X44GZ44KLXG4gICAqL1xuICBzdGF0aWMgZnJvbUlkcyhcbiAgICBjbGllbnQ6IENsaWVudCxcbiAgICBtZXNzYWdlSWRzOiBudW1iZXJbXVxuICApOiBXaWtpZG90UmVzdWx0QXN5bmM8UHJpdmF0ZU1lc3NhZ2VDb2xsZWN0aW9uPiB7XG4gICAgY29uc3QgbG9naW5SZXN1bHQgPSBjbGllbnQucmVxdWlyZUxvZ2luKCk7XG4gICAgaWYgKGxvZ2luUmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgICAgUHJvbWlzZS5yZWplY3QobG9naW5SZXN1bHQuZXJyb3IpLFxuICAgICAgICAoKSA9PiBuZXcgTG9naW5SZXF1aXJlZEVycm9yKCdMb2dpbiByZXF1aXJlZCB0byBnZXQgbWVzc2FnZXMnKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBib2RpZXMgPSBtZXNzYWdlSWRzLm1hcCgobWVzc2FnZUlkKSA9PiAoe1xuICAgICAgICAgIGl0ZW06IG1lc3NhZ2VJZCxcbiAgICAgICAgICBtb2R1bGVOYW1lOiAnZGFzaGJvYXJkL21lc3NhZ2VzL0RNVmlld01lc3NhZ2VNb2R1bGUnLFxuICAgICAgICB9KSk7XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY2xpZW50LmFtY0NsaWVudC5yZXF1ZXN0KGJvZGllcyk7XG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG1lc3NhZ2VzOiBQcml2YXRlTWVzc2FnZVtdID0gW107XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtZXNzYWdlSWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSByZXN1bHQudmFsdWVbaV07XG4gICAgICAgICAgY29uc3QgbWVzc2FnZUlkID0gbWVzc2FnZUlkc1tpXTtcbiAgICAgICAgICBpZiAoIXJlc3BvbnNlIHx8IG1lc3NhZ2VJZCA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcblxuICAgICAgICAgIGNvbnN0IGh0bWwgPSBTdHJpbmcocmVzcG9uc2UuYm9keSA/PyAnJyk7XG4gICAgICAgICAgY29uc3QgJCA9IGNoZWVyaW8ubG9hZChodG1sKTtcblxuICAgICAgICAgIC8vIOODpuODvOOCtuODvOaDheWgseOCkuWPluW+l1xuICAgICAgICAgIGNvbnN0IHByaW50dXNlckVsZW1zID0gJCgnZGl2LnBtZXNzYWdlIGRpdi5oZWFkZXIgc3Bhbi5wcmludHVzZXInKTtcbiAgICAgICAgICBpZiAocHJpbnR1c2VyRWxlbXMubGVuZ3RoIDwgMikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEZvcmJpZGRlbkVycm9yKGBGYWlsZWQgdG8gZ2V0IG1lc3NhZ2U6ICR7bWVzc2FnZUlkfWApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHNlbmRlckVsZW0gPSAkKHByaW50dXNlckVsZW1zWzBdKTtcbiAgICAgICAgICBjb25zdCByZWNpcGllbnRFbGVtID0gJChwcmludHVzZXJFbGVtc1sxXSk7XG5cbiAgICAgICAgICBjb25zdCBzZW5kZXIgPSBwYXJzZVVzZXIoY2xpZW50LCBzZW5kZXJFbGVtKTtcbiAgICAgICAgICBjb25zdCByZWNpcGllbnQgPSBwYXJzZVVzZXIoY2xpZW50LCByZWNpcGllbnRFbGVtKTtcblxuICAgICAgICAgIC8vIOS7tuWQjVxuICAgICAgICAgIGNvbnN0IHN1YmplY3RFbGVtID0gJCgnZGl2LnBtZXNzYWdlIGRpdi5oZWFkZXIgc3Bhbi5zdWJqZWN0Jyk7XG4gICAgICAgICAgY29uc3Qgc3ViamVjdCA9IHN1YmplY3RFbGVtLnRleHQoKS50cmltKCk7XG5cbiAgICAgICAgICAvLyDmnKzmlodcbiAgICAgICAgICBjb25zdCBib2R5RWxlbSA9ICQoJ2Rpdi5wbWVzc2FnZSBkaXYuYm9keScpO1xuICAgICAgICAgIGNvbnN0IGJvZHkgPSBib2R5RWxlbS50ZXh0KCkudHJpbSgpO1xuXG4gICAgICAgICAgLy8g5pel5pmCXG4gICAgICAgICAgY29uc3Qgb2RhdGVFbGVtID0gJCgnZGl2LmhlYWRlciBzcGFuLm9kYXRlJyk7XG4gICAgICAgICAgY29uc3QgY3JlYXRlZEF0ID1cbiAgICAgICAgICAgIG9kYXRlRWxlbS5sZW5ndGggPiAwID8gKHBhcnNlT2RhdGUob2RhdGVFbGVtKSA/PyBuZXcgRGF0ZSgwKSkgOiBuZXcgRGF0ZSgwKTtcblxuICAgICAgICAgIG1lc3NhZ2VzLnB1c2goXG4gICAgICAgICAgICBuZXcgUHJpdmF0ZU1lc3NhZ2Uoe1xuICAgICAgICAgICAgICBjbGllbnQsXG4gICAgICAgICAgICAgIGlkOiBtZXNzYWdlSWQsXG4gICAgICAgICAgICAgIHNlbmRlcixcbiAgICAgICAgICAgICAgcmVjaXBpZW50LFxuICAgICAgICAgICAgICBzdWJqZWN0LFxuICAgICAgICAgICAgICBib2R5LFxuICAgICAgICAgICAgICBjcmVhdGVkQXQsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3IFByaXZhdGVNZXNzYWdlQ29sbGVjdGlvbihjbGllbnQsIG1lc3NhZ2VzKTtcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRm9yYmlkZGVuRXJyb3IgfHwgZXJyb3IgaW5zdGFuY2VvZiBMb2dpblJlcXVpcmVkRXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBnZXQgbWVzc2FnZXM6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIOODouOCuOODpeODvOODq+OBi+OCieODoeODg+OCu+ODvOOCuOOCkuWPluW+l+OBmeOCi+WGhemDqOODoeOCveODg+ODiVxuICAgKi9cbiAgcHJvdGVjdGVkIHN0YXRpYyBhY3F1aXJlRnJvbU1vZHVsZShcbiAgICBjbGllbnQ6IENsaWVudCxcbiAgICBtb2R1bGVOYW1lOiBzdHJpbmdcbiAgKTogV2lraWRvdFJlc3VsdEFzeW5jPFByaXZhdGVNZXNzYWdlQ29sbGVjdGlvbj4ge1xuICAgIGNvbnN0IGxvZ2luUmVzdWx0ID0gY2xpZW50LnJlcXVpcmVMb2dpbigpO1xuICAgIGlmIChsb2dpblJlc3VsdC5pc0VycigpKSB7XG4gICAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAgIFByb21pc2UucmVqZWN0KGxvZ2luUmVzdWx0LmVycm9yKSxcbiAgICAgICAgKCkgPT4gbmV3IExvZ2luUmVxdWlyZWRFcnJvcignTG9naW4gcmVxdWlyZWQgdG8gZ2V0IG1lc3NhZ2VzJylcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgLy8g44Oa44O844K444Oj44O85Y+W5b6XXG4gICAgICAgIGNvbnN0IGZpcnN0UmVzdWx0ID0gYXdhaXQgY2xpZW50LmFtY0NsaWVudC5yZXF1ZXN0KFt7IG1vZHVsZU5hbWUgfV0pO1xuICAgICAgICBpZiAoZmlyc3RSZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IGZpcnN0UmVzdWx0LmVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZmlyc3RSZXNwb25zZSA9IGZpcnN0UmVzdWx0LnZhbHVlWzBdO1xuICAgICAgICBpZiAoIWZpcnN0UmVzcG9uc2UpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgTm9FbGVtZW50RXJyb3IoJ0VtcHR5IHJlc3BvbnNlJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmaXJzdEh0bWwgPSBTdHJpbmcoZmlyc3RSZXNwb25zZS5ib2R5ID8/ICcnKTtcbiAgICAgICAgY29uc3QgJGZpcnN0ID0gY2hlZXJpby5sb2FkKGZpcnN0SHRtbCk7XG5cbiAgICAgICAgLy8g44Oa44O844K45pWw44KS5Y+W5b6XXG4gICAgICAgIGNvbnN0IHBhZ2VyVGFyZ2V0cyA9ICRmaXJzdCgnZGl2LnBhZ2VyIHNwYW4udGFyZ2V0Jyk7XG4gICAgICAgIGxldCBtYXhQYWdlID0gMTtcbiAgICAgICAgaWYgKHBhZ2VyVGFyZ2V0cy5sZW5ndGggPiAyKSB7XG4gICAgICAgICAgY29uc3QgbGFzdFBhZ2VUZXh0ID0gJGZpcnN0KHBhZ2VyVGFyZ2V0c1twYWdlclRhcmdldHMubGVuZ3RoIC0gMl0pXG4gICAgICAgICAgICAudGV4dCgpXG4gICAgICAgICAgICAudHJpbSgpO1xuICAgICAgICAgIG1heFBhZ2UgPSBOdW1iZXIucGFyc2VJbnQobGFzdFBhZ2VUZXh0LCAxMCkgfHwgMTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIOWFqOODmuODvOOCuOOBi+OCieODoeODg+OCu+ODvOOCuElE44KS5Y+W5b6XXG4gICAgICAgIGNvbnN0IG1lc3NhZ2VJZHM6IG51bWJlcltdID0gW107XG5cbiAgICAgICAgaWYgKG1heFBhZ2UgPiAxKSB7XG4gICAgICAgICAgY29uc3QgYm9kaWVzID0gW107XG4gICAgICAgICAgZm9yIChsZXQgcGFnZSA9IDE7IHBhZ2UgPD0gbWF4UGFnZTsgcGFnZSsrKSB7XG4gICAgICAgICAgICBib2RpZXMucHVzaCh7IHBhZ2UsIG1vZHVsZU5hbWUgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGFkZGl0aW9uYWxSZXN1bHRzID0gYXdhaXQgY2xpZW50LmFtY0NsaWVudC5yZXF1ZXN0KGJvZGllcyk7XG4gICAgICAgICAgaWYgKGFkZGl0aW9uYWxSZXN1bHRzLmlzRXJyKCkpIHtcbiAgICAgICAgICAgIHRocm93IGFkZGl0aW9uYWxSZXN1bHRzLmVycm9yO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGZvciAoY29uc3QgcmVzcG9uc2Ugb2YgYWRkaXRpb25hbFJlc3VsdHMudmFsdWUpIHtcbiAgICAgICAgICAgIGNvbnN0IGh0bWwgPSBTdHJpbmcocmVzcG9uc2U/LmJvZHkgPz8gJycpO1xuICAgICAgICAgICAgY29uc3QgJCA9IGNoZWVyaW8ubG9hZChodG1sKTtcbiAgICAgICAgICAgICQoJ3RyLm1lc3NhZ2UnKS5lYWNoKChfaSwgZWxlbSkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBkYXRhSHJlZiA9ICQoZWxlbSkuYXR0cignZGF0YS1ocmVmJykgPz8gJyc7XG4gICAgICAgICAgICAgIGNvbnN0IGlkTWF0Y2ggPSBkYXRhSHJlZi5tYXRjaCgvXFwvKFxcZCspJC8pO1xuICAgICAgICAgICAgICBpZiAoaWRNYXRjaD8uWzFdKSB7XG4gICAgICAgICAgICAgICAgbWVzc2FnZUlkcy5wdXNoKE51bWJlci5wYXJzZUludChpZE1hdGNoWzFdLCAxMCkpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgJGZpcnN0KCd0ci5tZXNzYWdlJykuZWFjaCgoX2ksIGVsZW0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGFIcmVmID0gJGZpcnN0KGVsZW0pLmF0dHIoJ2RhdGEtaHJlZicpID8/ICcnO1xuICAgICAgICAgICAgY29uc3QgaWRNYXRjaCA9IGRhdGFIcmVmLm1hdGNoKC9cXC8oXFxkKykkLyk7XG4gICAgICAgICAgICBpZiAoaWRNYXRjaD8uWzFdKSB7XG4gICAgICAgICAgICAgIG1lc3NhZ2VJZHMucHVzaChOdW1iZXIucGFyc2VJbnQoaWRNYXRjaFsxXSwgMTApKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIOODoeODg+OCu+ODvOOCuOOCkuWPluW+l1xuICAgICAgICBjb25zdCBtZXNzYWdlc1Jlc3VsdCA9IGF3YWl0IFByaXZhdGVNZXNzYWdlQ29sbGVjdGlvbi5mcm9tSWRzKGNsaWVudCwgbWVzc2FnZUlkcyk7XG4gICAgICAgIGlmIChtZXNzYWdlc1Jlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgbWVzc2FnZXNSZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbWVzc2FnZXNSZXN1bHQudmFsdWU7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBlcnJvciBpbnN0YW5jZW9mIEZvcmJpZGRlbkVycm9yIHx8XG4gICAgICAgICAgZXJyb3IgaW5zdGFuY2VvZiBMb2dpblJlcXVpcmVkRXJyb3IgfHxcbiAgICAgICAgICBlcnJvciBpbnN0YW5jZW9mIE5vRWxlbWVudEVycm9yXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGFjcXVpcmUgbWVzc2FnZXM6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG59XG5cbi8qKlxuICog5Y+X5L+h566xXG4gKi9cbmV4cG9ydCBjbGFzcyBQcml2YXRlTWVzc2FnZUluYm94IGV4dGVuZHMgUHJpdmF0ZU1lc3NhZ2VDb2xsZWN0aW9uIHtcbiAgLyoqXG4gICAqIOWPl+S/oeeuseOBruODoeODg+OCu+ODvOOCuOOCkuOBmeOBueOBpuWPluW+l+OBmeOCi1xuICAgKi9cbiAgc3RhdGljIGFjcXVpcmUoY2xpZW50OiBDbGllbnQpOiBXaWtpZG90UmVzdWx0QXN5bmM8UHJpdmF0ZU1lc3NhZ2VJbmJveD4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IFByaXZhdGVNZXNzYWdlQ29sbGVjdGlvbi5hY3F1aXJlRnJvbU1vZHVsZShcbiAgICAgICAgICBjbGllbnQsXG4gICAgICAgICAgJ2Rhc2hib2FyZC9tZXNzYWdlcy9ETUluYm94TW9kdWxlJ1xuICAgICAgICApO1xuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaW5ib3ggPSBuZXcgUHJpdmF0ZU1lc3NhZ2VJbmJveChjbGllbnQpO1xuICAgICAgICBpbmJveC5wdXNoKC4uLnJlc3VsdC52YWx1ZSk7XG4gICAgICAgIHJldHVybiBpbmJveDtcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRm9yYmlkZGVuRXJyb3IgfHwgZXJyb3IgaW5zdGFuY2VvZiBMb2dpblJlcXVpcmVkRXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBhY3F1aXJlIGluYm94OiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxufVxuXG4vKipcbiAqIOmAgeS/oeeusVxuICovXG5leHBvcnQgY2xhc3MgUHJpdmF0ZU1lc3NhZ2VTZW50Qm94IGV4dGVuZHMgUHJpdmF0ZU1lc3NhZ2VDb2xsZWN0aW9uIHtcbiAgLyoqXG4gICAqIOmAgeS/oeeuseOBruODoeODg+OCu+ODvOOCuOOCkuOBmeOBueOBpuWPluW+l+OBmeOCi1xuICAgKi9cbiAgc3RhdGljIGFjcXVpcmUoY2xpZW50OiBDbGllbnQpOiBXaWtpZG90UmVzdWx0QXN5bmM8UHJpdmF0ZU1lc3NhZ2VTZW50Qm94PiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgUHJpdmF0ZU1lc3NhZ2VDb2xsZWN0aW9uLmFjcXVpcmVGcm9tTW9kdWxlKFxuICAgICAgICAgIGNsaWVudCxcbiAgICAgICAgICAnZGFzaGJvYXJkL21lc3NhZ2VzL0RNU2VudE1vZHVsZSdcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNlbnRCb3ggPSBuZXcgUHJpdmF0ZU1lc3NhZ2VTZW50Qm94KGNsaWVudCk7XG4gICAgICAgIHNlbnRCb3gucHVzaCguLi5yZXN1bHQudmFsdWUpO1xuICAgICAgICByZXR1cm4gc2VudEJveDtcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRm9yYmlkZGVuRXJyb3IgfHwgZXJyb3IgaW5zdGFuY2VvZiBMb2dpblJlcXVpcmVkRXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBhY3F1aXJlIHNlbnQgYm94OiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IFdpa2lkb3RSZXN1bHRBc3luYyB9IGZyb20gJy4uLy4uLy4uL2NvbW1vbi90eXBlcyc7XG5pbXBvcnQge1xuICBQcml2YXRlTWVzc2FnZSxcbiAgUHJpdmF0ZU1lc3NhZ2VDb2xsZWN0aW9uLFxuICBQcml2YXRlTWVzc2FnZUluYm94LFxuICBQcml2YXRlTWVzc2FnZVNlbnRCb3gsXG59IGZyb20gJy4uLy4uL3ByaXZhdGUtbWVzc2FnZSc7XG5pbXBvcnQgdHlwZSB7IFVzZXIgfSBmcm9tICcuLi8uLi91c2VyL3VzZXInO1xuaW1wb3J0IHR5cGUgeyBDbGllbnQgfSBmcm9tICcuLi9jbGllbnQnO1xuXG4vKipcbiAqIOODl+ODqeOCpOODmeODvOODiOODoeODg+OCu+ODvOOCuOaTjeS9nOOCouOCr+OCu+OCtVxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyDlj5fkv6HnrrHjgpLlj5blvpdcbiAqIGNvbnN0IGluYm94UmVzdWx0ID0gYXdhaXQgY2xpZW50LnByaXZhdGVNZXNzYWdlLmluYm94KCk7XG4gKiBpZiAoIWluYm94UmVzdWx0LmlzT2soKSkge1xuICogICB0aHJvdyBuZXcgRXJyb3IoJ+WPl+S/oeeuseOBruWPluW+l+OBq+WkseaVl+OBl+OBvuOBl+OBnycpO1xuICogfVxuICogY29uc3QgaW5ib3ggPSBpbmJveFJlc3VsdC52YWx1ZTtcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgUHJpdmF0ZU1lc3NhZ2VBY2Nlc3NvciB7XG4gIHB1YmxpYyByZWFkb25seSBjbGllbnQ6IENsaWVudDtcblxuICBjb25zdHJ1Y3RvcihjbGllbnQ6IENsaWVudCkge1xuICAgIHRoaXMuY2xpZW50ID0gY2xpZW50O1xuICB9XG5cbiAgLyoqXG4gICAqIOODoeODg+OCu+ODvOOCuElE44GL44KJ44Oh44OD44K744O844K444KS5Y+W5b6X44GZ44KLXG4gICAqXG4gICAqIEBwYXJhbSBpZCAtIOODoeODg+OCu+ODvOOCuElEXG4gICAqIEByZXR1cm5zIFJlc3VsdOWei+OBp+ODqeODg+ODl+OBleOCjOOBn+ODoeODg+OCu+ODvOOCuOOCquODluOCuOOCp+OCr+ODiFxuICAgKi9cbiAgZ2V0KGlkOiBudW1iZXIpOiBXaWtpZG90UmVzdWx0QXN5bmM8UHJpdmF0ZU1lc3NhZ2U+IHtcbiAgICByZXR1cm4gUHJpdmF0ZU1lc3NhZ2UuZnJvbUlkKHRoaXMuY2xpZW50LCBpZCk7XG4gIH1cblxuICAvKipcbiAgICog6KSH5pWw44Gu44Oh44OD44K744O844K4SUTjgYvjgonjg6Hjg4Pjgrvjg7zjgrjjgpLlj5blvpfjgZnjgotcbiAgICogQHBhcmFtIGlkcyAtIOODoeODg+OCu+ODvOOCuElE6YWN5YiXXG4gICAqIEByZXR1cm5zIOODoeODg+OCu+ODvOOCuOOCs+ODrOOCr+OCt+ODp+ODs1xuICAgKi9cbiAgZ2V0TWVzc2FnZXMoaWRzOiBudW1iZXJbXSk6IFdpa2lkb3RSZXN1bHRBc3luYzxQcml2YXRlTWVzc2FnZUNvbGxlY3Rpb24+IHtcbiAgICByZXR1cm4gUHJpdmF0ZU1lc3NhZ2VDb2xsZWN0aW9uLmZyb21JZHModGhpcy5jbGllbnQsIGlkcyk7XG4gIH1cblxuICAvKipcbiAgICog5Y+X5L+h566x44Gu44Oh44OD44K744O844K45LiA6Kan44KS5Y+W5b6X44GZ44KLXG4gICAqIEByZXR1cm5zIOWPl+S/oeeusVxuICAgKi9cbiAgaW5ib3goKTogV2lraWRvdFJlc3VsdEFzeW5jPFByaXZhdGVNZXNzYWdlSW5ib3g+IHtcbiAgICByZXR1cm4gUHJpdmF0ZU1lc3NhZ2VJbmJveC5hY3F1aXJlKHRoaXMuY2xpZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDpgIHkv6HnrrHjga7jg6Hjg4Pjgrvjg7zjgrjkuIDopqfjgpLlj5blvpfjgZnjgotcbiAgICogQHJldHVybnMg6YCB5L+h566xXG4gICAqL1xuICBzZW50Qm94KCk6IFdpa2lkb3RSZXN1bHRBc3luYzxQcml2YXRlTWVzc2FnZVNlbnRCb3g+IHtcbiAgICByZXR1cm4gUHJpdmF0ZU1lc3NhZ2VTZW50Qm94LmFjcXVpcmUodGhpcy5jbGllbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIOODl+ODqeOCpOODmeODvOODiOODoeODg+OCu+ODvOOCuOOCkumAgeS/oeOBmeOCi1xuICAgKiBAcGFyYW0gcmVjaXBpZW50IC0g5Y+X5L+h6ICFXG4gICAqIEBwYXJhbSBzdWJqZWN0IC0g5Lu25ZCNXG4gICAqIEBwYXJhbSBib2R5IC0g5pys5paHXG4gICAqL1xuICBzZW5kKHJlY2lwaWVudDogVXNlciwgc3ViamVjdDogc3RyaW5nLCBib2R5OiBzdHJpbmcpOiBXaWtpZG90UmVzdWx0QXN5bmM8dm9pZD4ge1xuICAgIHJldHVybiBQcml2YXRlTWVzc2FnZS5zZW5kKHRoaXMuY2xpZW50LCByZWNpcGllbnQsIHN1YmplY3QsIGJvZHkpO1xuICB9XG59XG5cbmV4cG9ydCB7IFByaXZhdGVNZXNzYWdlLCBQcml2YXRlTWVzc2FnZUNvbGxlY3Rpb24sIFByaXZhdGVNZXNzYWdlSW5ib3gsIFByaXZhdGVNZXNzYWdlU2VudEJveCB9O1xuIiwKICAgICJpbXBvcnQgdHlwZSB7IFdpa2lkb3RSZXN1bHRBc3luYyB9IGZyb20gJy4uLy4uLy4uL2NvbW1vbi90eXBlcyc7XG5pbXBvcnQge1xuICBGb3J1bUNhdGVnb3J5LFxuICBGb3J1bUNhdGVnb3J5Q29sbGVjdGlvbixcbiAgRm9ydW1Qb3N0LFxuICBGb3J1bVRocmVhZCxcbiAgRm9ydW1UaHJlYWRDb2xsZWN0aW9uLFxufSBmcm9tICcuLi8uLi9mb3J1bSc7XG5pbXBvcnQgdHlwZSB7IFNpdGUgfSBmcm9tICcuLi9zaXRlJztcblxuLyoqXG4gKiDjg5Xjgqnjg7zjg6njg6Dmk43kvZzjgqLjgq/jgrvjgrVcbiAqL1xuZXhwb3J0IGNsYXNzIEZvcnVtQWNjZXNzb3Ige1xuICBwdWJsaWMgcmVhZG9ubHkgc2l0ZTogU2l0ZTtcblxuICBjb25zdHJ1Y3RvcihzaXRlOiBTaXRlKSB7XG4gICAgdGhpcy5zaXRlID0gc2l0ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiDjg5Xjgqnjg7zjg6njg6Djgqvjg4bjgrTjg6rkuIDopqfjgpLlj5blvpdcbiAgICogQHJldHVybnMg44Kr44OG44K044Oq5LiA6KanXG4gICAqL1xuICBnZXRDYXRlZ29yaWVzKCk6IFdpa2lkb3RSZXN1bHRBc3luYzxGb3J1bUNhdGVnb3J5Q29sbGVjdGlvbj4ge1xuICAgIHJldHVybiBGb3J1bUNhdGVnb3J5Q29sbGVjdGlvbi5hY3F1aXJlQWxsKHRoaXMuc2l0ZSk7XG4gIH1cblxuICAvKipcbiAgICog44K544Os44OD44OJ44KS5Y+W5b6XXG4gICAqIEBwYXJhbSB0aHJlYWRJZCAtIOOCueODrOODg+ODiUlEXG4gICAqIEByZXR1cm5zIOOCueODrOODg+ODiVxuICAgKi9cbiAgZ2V0VGhyZWFkKHRocmVhZElkOiBudW1iZXIpOiBXaWtpZG90UmVzdWx0QXN5bmM8Rm9ydW1UaHJlYWQ+IHtcbiAgICByZXR1cm4gRm9ydW1UaHJlYWQuZ2V0RnJvbUlkKHRoaXMuc2l0ZSwgdGhyZWFkSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIOikh+aVsOOCueODrOODg+ODieOCkuWPluW+l1xuICAgKiBAcGFyYW0gdGhyZWFkSWRzIC0g44K544Os44OD44OJSUTphY3liJdcbiAgICogQHJldHVybnMg44K544Os44OD44OJ44Kz44Os44Kv44K344On44OzXG4gICAqL1xuICBnZXRUaHJlYWRzKHRocmVhZElkczogbnVtYmVyW10pOiBXaWtpZG90UmVzdWx0QXN5bmM8Rm9ydW1UaHJlYWRDb2xsZWN0aW9uPiB7XG4gICAgcmV0dXJuIEZvcnVtVGhyZWFkQ29sbGVjdGlvbi5hY3F1aXJlRnJvbVRocmVhZElkcyh0aGlzLnNpdGUsIHRocmVhZElkcyk7XG4gIH1cbn1cblxuZXhwb3J0IHsgRm9ydW1DYXRlZ29yeSwgRm9ydW1DYXRlZ29yeUNvbGxlY3Rpb24sIEZvcnVtVGhyZWFkLCBGb3J1bVRocmVhZENvbGxlY3Rpb24sIEZvcnVtUG9zdCB9O1xuIiwKICAgICJpbXBvcnQgeyBSZXF1aXJlTG9naW4gfSBmcm9tICcuLi8uLi8uLi9jb21tb24vZGVjb3JhdG9ycyc7XG5pbXBvcnQge1xuICBMb2dpblJlcXVpcmVkRXJyb3IsXG4gIFRhcmdldEVycm9yLFxuICBVbmV4cGVjdGVkRXJyb3IsXG4gIFdpa2lkb3RTdGF0dXNFcnJvcixcbn0gZnJvbSAnLi4vLi4vLi4vY29tbW9uL2Vycm9ycyc7XG5pbXBvcnQgeyBmcm9tUHJvbWlzZSwgdHlwZSBXaWtpZG90UmVzdWx0QXN5bmMgfSBmcm9tICcuLi8uLi8uLi9jb21tb24vdHlwZXMnO1xuaW1wb3J0IHsgdHlwZSBRTUNVc2VyLCBRdWlja01vZHVsZSB9IGZyb20gJy4uLy4uLy4uL3V0aWwvcXVpY2stbW9kdWxlJztcbmltcG9ydCB0eXBlIHsgVXNlciB9IGZyb20gJy4uLy4uL3VzZXIvdXNlcic7XG5pbXBvcnQgdHlwZSB7IFNpdGUgfSBmcm9tICcuLi9zaXRlJztcbmltcG9ydCB7IFNpdGVBcHBsaWNhdGlvbiB9IGZyb20gJy4uL3NpdGUtYXBwbGljYXRpb24nO1xuaW1wb3J0IHsgU2l0ZU1lbWJlciB9IGZyb20gJy4uL3NpdGUtbWVtYmVyJztcblxuLyoqXG4gKiDjgrXjgqTjg4jjg6Hjg7Pjg5Djg7zmk43kvZzjgqLjgq/jgrvjgrVcbiAqL1xuZXhwb3J0IGNsYXNzIE1lbWJlckFjY2Vzc29yIHtcbiAgcHVibGljIHJlYWRvbmx5IHNpdGU6IFNpdGU7XG5cbiAgY29uc3RydWN0b3Ioc2l0ZTogU2l0ZSkge1xuICAgIHRoaXMuc2l0ZSA9IHNpdGU7XG4gIH1cblxuICAvKipcbiAgICog5YWo44Oh44Oz44OQ44O844KS5Y+W5b6X44GZ44KLXG4gICAqIEByZXR1cm5zIOODoeODs+ODkOODvOS4gOimp1xuICAgKi9cbiAgZ2V0QWxsKCk6IFdpa2lkb3RSZXN1bHRBc3luYzxTaXRlTWVtYmVyW10+IHtcbiAgICByZXR1cm4gU2l0ZU1lbWJlci5nZXRNZW1iZXJzKHRoaXMuc2l0ZSwgJycpO1xuICB9XG5cbiAgLyoqXG4gICAqIOODouODh+ODrOODvOOCv+ODvOS4gOimp+OCkuWPluW+l+OBmeOCi1xuICAgKiBAcmV0dXJucyDjg6Ljg4fjg6zjg7zjgr/jg7zkuIDopqdcbiAgICovXG4gIGdldE1vZGVyYXRvcnMoKTogV2lraWRvdFJlc3VsdEFzeW5jPFNpdGVNZW1iZXJbXT4ge1xuICAgIHJldHVybiBTaXRlTWVtYmVyLmdldE1lbWJlcnModGhpcy5zaXRlLCAnbW9kZXJhdG9ycycpO1xuICB9XG5cbiAgLyoqXG4gICAqIOeuoeeQhuiAheS4gOimp+OCkuWPluW+l+OBmeOCi1xuICAgKiBAcmV0dXJucyDnrqHnkIbogIXkuIDopqdcbiAgICovXG4gIGdldEFkbWlucygpOiBXaWtpZG90UmVzdWx0QXN5bmM8U2l0ZU1lbWJlcltdPiB7XG4gICAgcmV0dXJuIFNpdGVNZW1iZXIuZ2V0TWVtYmVycyh0aGlzLnNpdGUsICdhZG1pbnMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmnKrlh6bnkIbjga7lj4LliqDnlLPoq4vjgpLlj5blvpfjgZnjgotcbiAgICogQHJldHVybnMg5Y+C5Yqg55Sz6KuL5LiA6KanXG4gICAqL1xuICBnZXRBcHBsaWNhdGlvbnMoKTogV2lraWRvdFJlc3VsdEFzeW5jPFNpdGVBcHBsaWNhdGlvbltdPiB7XG4gICAgcmV0dXJuIFNpdGVBcHBsaWNhdGlvbi5hY3F1aXJlQWxsKHRoaXMuc2l0ZSk7XG4gIH1cblxuICAvKipcbiAgICog44Oh44Oz44OQ44O844KS5qSc57Si44GZ44KLXG4gICAqIEBwYXJhbSBxdWVyeSAtIOaknOe0ouOCr+OCqOODqu+8iOODpuODvOOCtuODvOWQjeOBruS4gOmDqO+8iVxuICAgKiBAcmV0dXJucyDjg57jg4Pjg4HjgZfjgZ/jg6bjg7zjgrbjg7zkuIDopqfvvIhRTUNVc2Vy5b2i5byP77yJXG4gICAqL1xuICBsb29rdXAocXVlcnk6IHN0cmluZyk6IFdpa2lkb3RSZXN1bHRBc3luYzxRTUNVc2VyW10+IHtcbiAgICByZXR1cm4gUXVpY2tNb2R1bGUubWVtYmVyTG9va3VwKHRoaXMuc2l0ZS5pZCwgcXVlcnkpO1xuICB9XG5cbiAgLyoqXG4gICAqIOODpuODvOOCtuODvOOCkuOCteOCpOODiOOBq+aLm+W+heOBmeOCi1xuICAgKiBAcGFyYW0gdXNlciAtIOaLm+W+heOBmeOCi+ODpuODvOOCtuODvFxuICAgKiBAcGFyYW0gdGV4dCAtIOaLm+W+heODoeODg+OCu+ODvOOCuFxuICAgKi9cbiAgQFJlcXVpcmVMb2dpblxuICBpbnZpdGUodXNlcjogVXNlciwgdGV4dDogc3RyaW5nKTogV2lraWRvdFJlc3VsdEFzeW5jPHZvaWQ+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnNpdGUuYW1jUmVxdWVzdChbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWN0aW9uOiAnTWFuYWdlU2l0ZU1lbWJlcnNoaXBBY3Rpb24nLFxuICAgICAgICAgICAgZXZlbnQ6ICdpbnZpdGVNZW1iZXInLFxuICAgICAgICAgICAgdXNlcl9pZDogdXNlci5pZCxcbiAgICAgICAgICAgIHRleHQsXG4gICAgICAgICAgICBtb2R1bGVOYW1lOiAnRW1wdHknLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pO1xuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICBjb25zdCBlcnJvciA9IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBXaWtpZG90U3RhdHVzRXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChlcnJvci5zdGF0dXNDb2RlID09PSAnYWxyZWFkeV9pbnZpdGVkJykge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgVGFyZ2V0RXJyb3IoXG4gICAgICAgICAgICAgICAgYFVzZXIgaXMgYWxyZWFkeSBpbnZpdGVkIHRvICR7dGhpcy5zaXRlLnVuaXhOYW1lfTogJHt1c2VyLm5hbWV9YFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGVycm9yLnN0YXR1c0NvZGUgPT09ICdhbHJlYWR5X21lbWJlcicpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IFRhcmdldEVycm9yKFxuICAgICAgICAgICAgICAgIGBVc2VyIGlzIGFscmVhZHkgYSBtZW1iZXIgb2YgJHt0aGlzLnNpdGUudW5peE5hbWV9OiAke3VzZXIubmFtZX1gXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFRhcmdldEVycm9yIHx8IGVycm9yIGluc3RhbmNlb2YgTG9naW5SZXF1aXJlZEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gaW52aXRlIHVzZXI6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCB7IFNpdGVNZW1iZXIsIFNpdGVBcHBsaWNhdGlvbiB9O1xuIiwKICAgICIvKipcbiAqIFF1aWNrTW9kdWxlIC0gV2lraWRvdOi7vemHj0FQSVxuICpcbiAqIHF1aWNrbW9kdWxlLnBocOOCqOODs+ODieODneOCpOODs+ODiOOCkuS9v+eUqOOBl+OBn+aknOe0ouapn+iDvVxuICovXG5cbmltcG9ydCB7IHogfSBmcm9tICd6b2QnO1xuaW1wb3J0IHsgTm90Rm91bmRFeGNlcHRpb24sIFVuZXhwZWN0ZWRFcnJvciB9IGZyb20gJy4uL2NvbW1vbi9lcnJvcnMnO1xuaW1wb3J0IHsgZnJvbVByb21pc2UsIHR5cGUgV2lraWRvdFJlc3VsdEFzeW5jIH0gZnJvbSAnLi4vY29tbW9uL3R5cGVzJztcblxuLyoqXG4gKiBRdWlja01vZHVsZeODouOCuOODpeODvOODq+WQjVxuICovXG5leHBvcnQgdHlwZSBRdWlja01vZHVsZU5hbWUgPSAnTWVtYmVyTG9va3VwUU1vZHVsZScgfCAnVXNlckxvb2t1cFFNb2R1bGUnIHwgJ1BhZ2VMb29rdXBRTW9kdWxlJztcblxuLyoqXG4gKiBRdWlja01vZHVsZeODpuODvOOCtuODvOaDheWgsVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFFNQ1VzZXIge1xuICBpZDogbnVtYmVyO1xuICBuYW1lOiBzdHJpbmc7XG59XG5cbi8qKlxuICogUXVpY2tNb2R1bGXjg5rjg7zjgrjmg4XloLFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBRTUNQYWdlIHtcbiAgdGl0bGU6IHN0cmluZztcbiAgdW5peE5hbWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBRdWlja01vZHVsZeODrOOCueODneODs+OCueOCueOCreODvOODnlxuICovXG5jb25zdCBxdWlja01vZHVsZVVzZXJSZXNwb25zZVNjaGVtYSA9IHoub2JqZWN0KHtcbiAgdXNlcnM6IHoudW5pb24oW1xuICAgIHouYXJyYXkoXG4gICAgICB6Lm9iamVjdCh7XG4gICAgICAgIHVzZXJfaWQ6IHoudW5pb24oW3ouc3RyaW5nKCksIHoubnVtYmVyKCldKSxcbiAgICAgICAgbmFtZTogei5zdHJpbmcoKSxcbiAgICAgIH0pXG4gICAgKSxcbiAgICB6LmxpdGVyYWwoZmFsc2UpLFxuICBdKSxcbn0pO1xuXG5jb25zdCBxdWlja01vZHVsZVBhZ2VSZXNwb25zZVNjaGVtYSA9IHoub2JqZWN0KHtcbiAgcGFnZXM6IHoudW5pb24oW1xuICAgIHouYXJyYXkoXG4gICAgICB6Lm9iamVjdCh7XG4gICAgICAgIHRpdGxlOiB6LnN0cmluZygpLFxuICAgICAgICB1bml4X25hbWU6IHouc3RyaW5nKCksXG4gICAgICB9KVxuICAgICksXG4gICAgei5saXRlcmFsKGZhbHNlKSxcbiAgXSksXG59KTtcblxuLyoqXG4gKiBRdWlja01vZHVsZeOCqOODs+ODieODneOCpOODs+ODiOOBq+ODquOCr+OCqOOCueODiOOCkumAgeS/oVxuICovXG5hc3luYyBmdW5jdGlvbiByZXF1ZXN0UXVpY2tNb2R1bGUoXG4gIG1vZHVsZU5hbWU6IFF1aWNrTW9kdWxlTmFtZSxcbiAgc2l0ZUlkOiBudW1iZXIsXG4gIHF1ZXJ5OiBzdHJpbmdcbik6IFByb21pc2U8dW5rbm93bj4ge1xuICBjb25zdCB1cmwgPSBgaHR0cHM6Ly93d3cud2lraWRvdC5jb20vcXVpY2ttb2R1bGUucGhwP21vZHVsZT0ke21vZHVsZU5hbWV9JnM9JHtzaXRlSWR9JnE9JHtlbmNvZGVVUklDb21wb25lbnQocXVlcnkpfWA7XG5cbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIHtcbiAgICBtZXRob2Q6ICdHRVQnLFxuICAgIGhlYWRlcnM6IHtcbiAgICAgIEFjY2VwdDogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgIH0sXG4gIH0pO1xuXG4gIGlmIChyZXNwb25zZS5zdGF0dXMgPT09IDUwMCkge1xuICAgIHRocm93IG5ldyBOb3RGb3VuZEV4Y2VwdGlvbihgU2l0ZSBub3QgZm91bmQ6IHNpdGVJZD0ke3NpdGVJZH1gKTtcbiAgfVxuXG4gIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICB0aHJvdyBuZXcgVW5leHBlY3RlZEVycm9yKGBRdWlja01vZHVsZSByZXF1ZXN0IGZhaWxlZDogJHtyZXNwb25zZS5zdGF0dXN9YCk7XG4gIH1cblxuICByZXR1cm4gcmVzcG9uc2UuanNvbigpO1xufVxuXG4vKipcbiAqIOOCteOCpOODiOODoeODs+ODkOODvOOCkuaknOe0olxuICogQHBhcmFtIHNpdGVJZCAtIOOCteOCpOODiElEXG4gKiBAcGFyYW0gcXVlcnkgLSDmpJzntKLjgq/jgqjjg6rvvIjjg6bjg7zjgrbjg7zlkI3jga7kuIDpg6jvvIlcbiAqIEByZXR1cm5zIOODnuODg+ODgeOBl+OBn+ODpuODvOOCtuODvOS4gOimp1xuICovXG5leHBvcnQgZnVuY3Rpb24gbWVtYmVyTG9va3VwKHNpdGVJZDogbnVtYmVyLCBxdWVyeTogc3RyaW5nKTogV2lraWRvdFJlc3VsdEFzeW5jPFFNQ1VzZXJbXT4ge1xuICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgKGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXF1ZXN0UXVpY2tNb2R1bGUoJ01lbWJlckxvb2t1cFFNb2R1bGUnLCBzaXRlSWQsIHF1ZXJ5KTtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IHF1aWNrTW9kdWxlVXNlclJlc3BvbnNlU2NoZW1hLnBhcnNlKGRhdGEpO1xuXG4gICAgICBpZiAocGFyc2VkLnVzZXJzID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwYXJzZWQudXNlcnMubWFwKCh1c2VyKSA9PiAoe1xuICAgICAgICBpZDogdHlwZW9mIHVzZXIudXNlcl9pZCA9PT0gJ3N0cmluZycgPyBOdW1iZXIucGFyc2VJbnQodXNlci51c2VyX2lkLCAxMCkgOiB1c2VyLnVzZXJfaWQsXG4gICAgICAgIG5hbWU6IHVzZXIubmFtZSxcbiAgICAgIH0pKTtcbiAgICB9KSgpLFxuICAgIChlcnJvcikgPT4ge1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgTm90Rm91bmRFeGNlcHRpb24pIHJldHVybiBlcnJvcjtcbiAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBNZW1iZXIgbG9va3VwIGZhaWxlZDogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgIH1cbiAgKTtcbn1cblxuLyoqXG4gKiBXaWtpZG905YWo5L2T44GL44KJ44Om44O844K244O844KS5qSc57SiXG4gKiBAcGFyYW0gc2l0ZUlkIC0g44K144Kk44OISUTvvIjku7vmhI/jga7jgrXjgqTjg4hJROOBp+WPr++8iVxuICogQHBhcmFtIHF1ZXJ5IC0g5qSc57Si44Kv44Ko44Oq77yI44Om44O844K244O85ZCN44Gu5LiA6YOo77yJXG4gKiBAcmV0dXJucyDjg57jg4Pjg4HjgZfjgZ/jg6bjg7zjgrbjg7zkuIDopqdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZXJMb29rdXAoc2l0ZUlkOiBudW1iZXIsIHF1ZXJ5OiBzdHJpbmcpOiBXaWtpZG90UmVzdWx0QXN5bmM8UU1DVXNlcltdPiB7XG4gIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcXVlc3RRdWlja01vZHVsZSgnVXNlckxvb2t1cFFNb2R1bGUnLCBzaXRlSWQsIHF1ZXJ5KTtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IHF1aWNrTW9kdWxlVXNlclJlc3BvbnNlU2NoZW1hLnBhcnNlKGRhdGEpO1xuXG4gICAgICBpZiAocGFyc2VkLnVzZXJzID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwYXJzZWQudXNlcnMubWFwKCh1c2VyKSA9PiAoe1xuICAgICAgICBpZDogdHlwZW9mIHVzZXIudXNlcl9pZCA9PT0gJ3N0cmluZycgPyBOdW1iZXIucGFyc2VJbnQodXNlci51c2VyX2lkLCAxMCkgOiB1c2VyLnVzZXJfaWQsXG4gICAgICAgIG5hbWU6IHVzZXIubmFtZSxcbiAgICAgIH0pKTtcbiAgICB9KSgpLFxuICAgIChlcnJvcikgPT4ge1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgTm90Rm91bmRFeGNlcHRpb24pIHJldHVybiBlcnJvcjtcbiAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBVc2VyIGxvb2t1cCBmYWlsZWQ6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICB9XG4gICk7XG59XG5cbi8qKlxuICog44K144Kk44OI5YaF44Gu44Oa44O844K444KS5qSc57SiXG4gKiBAcGFyYW0gc2l0ZUlkIC0g44K144Kk44OISURcbiAqIEBwYXJhbSBxdWVyeSAtIOaknOe0ouOCr+OCqOODqu+8iOODmuODvOOCuOWQjeOBruS4gOmDqO+8iVxuICogQHJldHVybnMg44Oe44OD44OB44GX44Gf44Oa44O844K45LiA6KanXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYWdlTG9va3VwKHNpdGVJZDogbnVtYmVyLCBxdWVyeTogc3RyaW5nKTogV2lraWRvdFJlc3VsdEFzeW5jPFFNQ1BhZ2VbXT4ge1xuICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgKGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXF1ZXN0UXVpY2tNb2R1bGUoJ1BhZ2VMb29rdXBRTW9kdWxlJywgc2l0ZUlkLCBxdWVyeSk7XG4gICAgICBjb25zdCBwYXJzZWQgPSBxdWlja01vZHVsZVBhZ2VSZXNwb25zZVNjaGVtYS5wYXJzZShkYXRhKTtcblxuICAgICAgaWYgKHBhcnNlZC5wYWdlcyA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcGFyc2VkLnBhZ2VzLm1hcCgocGFnZSkgPT4gKHtcbiAgICAgICAgdGl0bGU6IHBhZ2UudGl0bGUsXG4gICAgICAgIHVuaXhOYW1lOiBwYWdlLnVuaXhfbmFtZSxcbiAgICAgIH0pKTtcbiAgICB9KSgpLFxuICAgIChlcnJvcikgPT4ge1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgTm90Rm91bmRFeGNlcHRpb24pIHJldHVybiBlcnJvcjtcbiAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBQYWdlIGxvb2t1cCBmYWlsZWQ6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICB9XG4gICk7XG59XG5cbi8qKlxuICogUXVpY2tNb2R1bGUgQVBJ77yI5b6M5pa55LqS5o+b5oCn44Gu44Gf44KB57at5oyB77yJXG4gKiBAZGVwcmVjYXRlZCDku6Pjgo/jgorjgavlgIvliKXjga7plqLmlbDvvIhtZW1iZXJMb29rdXAsIHVzZXJMb29rdXAsIHBhZ2VMb29rdXDvvInjgpLkvb/nlKjjgZfjgabjgY/jgaDjgZXjgYRcbiAqL1xuZXhwb3J0IGNvbnN0IFF1aWNrTW9kdWxlOiB7XG4gIG1lbWJlckxvb2t1cDogdHlwZW9mIG1lbWJlckxvb2t1cDtcbiAgdXNlckxvb2t1cDogdHlwZW9mIHVzZXJMb29rdXA7XG4gIHBhZ2VMb29rdXA6IHR5cGVvZiBwYWdlTG9va3VwO1xufSA9IHtcbiAgbWVtYmVyTG9va3VwOiBtZW1iZXJMb29rdXAsXG4gIHVzZXJMb29rdXA6IHVzZXJMb29rdXAsXG4gIHBhZ2VMb29rdXA6IHBhZ2VMb29rdXAsXG59O1xuIiwKICAgICJpbXBvcnQgKiBhcyBjaGVlcmlvIGZyb20gJ2NoZWVyaW8nO1xuaW1wb3J0IHsgUmVxdWlyZUxvZ2luIH0gZnJvbSAnLi4vLi4vY29tbW9uL2RlY29yYXRvcnMnO1xuaW1wb3J0IHtcbiAgRm9yYmlkZGVuRXJyb3IsXG4gIExvZ2luUmVxdWlyZWRFcnJvcixcbiAgTm90Rm91bmRFeGNlcHRpb24sXG4gIFVuZXhwZWN0ZWRFcnJvcixcbiAgV2lraWRvdFN0YXR1c0Vycm9yLFxufSBmcm9tICcuLi8uLi9jb21tb24vZXJyb3JzJztcbmltcG9ydCB7IGZyb21Qcm9taXNlLCB0eXBlIFdpa2lkb3RSZXN1bHRBc3luYyB9IGZyb20gJy4uLy4uL2NvbW1vbi90eXBlcyc7XG5pbXBvcnQgeyBwYXJzZVVzZXIgfSBmcm9tICcuLi8uLi91dGlsL3BhcnNlcic7XG5pbXBvcnQgdHlwZSB7IEFic3RyYWN0VXNlciB9IGZyb20gJy4uL3VzZXInO1xuaW1wb3J0IHR5cGUgeyBTaXRlIH0gZnJvbSAnLi9zaXRlJztcblxuLyoqXG4gKiDjgrXjgqTjg4jlj4LliqDnlLPoq4vjg4fjg7zjgr9cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTaXRlQXBwbGljYXRpb25EYXRhIHtcbiAgc2l0ZTogU2l0ZTtcbiAgdXNlcjogQWJzdHJhY3RVc2VyO1xuICB0ZXh0OiBzdHJpbmc7XG59XG5cbi8qKlxuICog44K144Kk44OI5Y+C5Yqg55Sz6KuLXG4gKi9cbmV4cG9ydCBjbGFzcyBTaXRlQXBwbGljYXRpb24ge1xuICBwdWJsaWMgcmVhZG9ubHkgc2l0ZTogU2l0ZTtcbiAgcHVibGljIHJlYWRvbmx5IHVzZXI6IEFic3RyYWN0VXNlcjtcbiAgcHVibGljIHJlYWRvbmx5IHRleHQ6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihkYXRhOiBTaXRlQXBwbGljYXRpb25EYXRhKSB7XG4gICAgdGhpcy5zaXRlID0gZGF0YS5zaXRlO1xuICAgIHRoaXMudXNlciA9IGRhdGEudXNlcjtcbiAgICB0aGlzLnRleHQgPSBkYXRhLnRleHQ7XG4gIH1cblxuICAvKipcbiAgICog5pyq5Yem55CG44Gu5Y+C5Yqg55Sz6KuL44KS44GZ44G544Gm5Y+W5b6X44GZ44KLXG4gICAqIEBwYXJhbSBzaXRlIC0g5a++6LGh44K144Kk44OIXG4gICAqL1xuICBzdGF0aWMgYWNxdWlyZUFsbChzaXRlOiBTaXRlKTogV2lraWRvdFJlc3VsdEFzeW5jPFNpdGVBcHBsaWNhdGlvbltdPiB7XG4gICAgY29uc3QgbG9naW5SZXN1bHQgPSBzaXRlLmNsaWVudC5yZXF1aXJlTG9naW4oKTtcbiAgICBpZiAobG9naW5SZXN1bHQuaXNFcnIoKSkge1xuICAgICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgICBQcm9taXNlLnJlamVjdChsb2dpblJlc3VsdC5lcnJvciksXG4gICAgICAgICgpID0+IG5ldyBMb2dpblJlcXVpcmVkRXJyb3IoJ0xvZ2luIHJlcXVpcmVkIHRvIGdldCBhcHBsaWNhdGlvbnMnKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzaXRlLmFtY1JlcXVlc3QoW1xuICAgICAgICAgIHsgbW9kdWxlTmFtZTogJ21hbmFnZXNpdGUvTWFuYWdlU2l0ZU1lbWJlcnNBcHBsaWNhdGlvbnNNb2R1bGUnIH0sXG4gICAgICAgIF0pO1xuXG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gcmVzdWx0LnZhbHVlWzBdO1xuICAgICAgICBpZiAoIXJlc3BvbnNlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRFcnJvcignRW1wdHkgcmVzcG9uc2UnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGh0bWwgPSBTdHJpbmcocmVzcG9uc2UuYm9keSA/PyAnJyk7XG5cbiAgICAgICAgLy8g5qip6ZmQ44OB44Kn44OD44KvXG4gICAgICAgIGlmIChodG1sLmluY2x1ZGVzKCdXSUtJRE9ULnBhZ2UubGlzdGVuZXJzLmxvZ2luQ2xpY2soZXZlbnQpJykpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRm9yYmlkZGVuRXJyb3IoJ1lvdSBhcmUgbm90IGFsbG93ZWQgdG8gYWNjZXNzIHRoaXMgcGFnZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgJCA9IGNoZWVyaW8ubG9hZChodG1sKTtcbiAgICAgICAgY29uc3QgYXBwbGljYXRpb25zOiBTaXRlQXBwbGljYXRpb25bXSA9IFtdO1xuXG4gICAgICAgIGNvbnN0IHVzZXJFbGVtZW50cyA9ICQoJ2gzIHNwYW4ucHJpbnR1c2VyJykudG9BcnJheSgpO1xuICAgICAgICBjb25zdCB0ZXh0V3JhcHBlckVsZW1lbnRzID0gJCgndGFibGUnKS50b0FycmF5KCk7XG5cbiAgICAgICAgaWYgKHVzZXJFbGVtZW50cy5sZW5ndGggIT09IHRleHRXcmFwcGVyRWxlbWVudHMubGVuZ3RoKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRFcnJvcihcbiAgICAgICAgICAgICdMZW5ndGggb2YgdXNlcl9lbGVtZW50cyBhbmQgdGV4dF93cmFwcGVyX2VsZW1lbnRzIGFyZSBkaWZmZXJlbnQnXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdXNlckVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgdXNlckVsZW1lbnQgPSB1c2VyRWxlbWVudHNbaV07XG4gICAgICAgICAgY29uc3QgdGV4dFdyYXBwZXJFbGVtZW50ID0gdGV4dFdyYXBwZXJFbGVtZW50c1tpXTtcblxuICAgICAgICAgIGlmICghdXNlckVsZW1lbnQgfHwgIXRleHRXcmFwcGVyRWxlbWVudCkgY29udGludWU7XG5cbiAgICAgICAgICBjb25zdCB1c2VyID0gcGFyc2VVc2VyKHNpdGUuY2xpZW50LCAkKHVzZXJFbGVtZW50KSk7XG4gICAgICAgICAgY29uc3QgdGV4dEVsZW1lbnQgPSAkKHRleHRXcmFwcGVyRWxlbWVudCkuZmluZCgndGQnKS5lcSgxKTtcbiAgICAgICAgICBjb25zdCB0ZXh0ID0gdGV4dEVsZW1lbnQudGV4dCgpLnRyaW0oKTtcblxuICAgICAgICAgIGFwcGxpY2F0aW9ucy5wdXNoKG5ldyBTaXRlQXBwbGljYXRpb24oeyBzaXRlLCB1c2VyLCB0ZXh0IH0pKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhcHBsaWNhdGlvbnM7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEZvcmJpZGRlbkVycm9yIHx8IGVycm9yIGluc3RhbmNlb2YgTG9naW5SZXF1aXJlZEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gZ2V0IGFwcGxpY2F0aW9uczogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICog55Sz6KuL44KS5Yem55CG44GZ44KL5YaF6YOo44Oh44K944OD44OJXG4gICAqL1xuICBAUmVxdWlyZUxvZ2luXG4gIHByaXZhdGUgcHJvY2VzcyhhY3Rpb246ICdhY2NlcHQnIHwgJ2RlY2xpbmUnKTogV2lraWRvdFJlc3VsdEFzeW5jPHZvaWQ+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnNpdGUuYW1jUmVxdWVzdChbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWN0aW9uOiAnTWFuYWdlU2l0ZU1lbWJlcnNoaXBBY3Rpb24nLFxuICAgICAgICAgICAgZXZlbnQ6ICdhY2NlcHRBcHBsaWNhdGlvbicsXG4gICAgICAgICAgICB1c2VyX2lkOiB0aGlzLnVzZXIuaWQsXG4gICAgICAgICAgICB0ZXh0OiBgeW91ciBhcHBsaWNhdGlvbiBoYXMgYmVlbiAke2FjdGlvbn1lZGAsXG4gICAgICAgICAgICB0eXBlOiBhY3Rpb24sXG4gICAgICAgICAgICBtb2R1bGVOYW1lOiAnRW1wdHknLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pO1xuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICBjb25zdCBlcnJvciA9IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBXaWtpZG90U3RhdHVzRXJyb3IgJiYgZXJyb3Iuc3RhdHVzQ29kZSA9PT0gJ25vX2FwcGxpY2F0aW9uJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXhjZXB0aW9uKGBBcHBsaWNhdGlvbiBub3QgZm91bmQ6ICR7dGhpcy51c2VyLm5hbWV9YCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIE5vdEZvdW5kRXhjZXB0aW9uIHx8IGVycm9yIGluc3RhbmNlb2YgTG9naW5SZXF1aXJlZEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gcHJvY2VzcyBhcHBsaWNhdGlvbjogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICog5Y+C5Yqg55Sz6KuL44KS5om/6KqN44GZ44KLXG4gICAqL1xuICBhY2NlcHQoKTogV2lraWRvdFJlc3VsdEFzeW5jPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5wcm9jZXNzKCdhY2NlcHQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDlj4LliqDnlLPoq4vjgpLmi5LlkKbjgZnjgotcbiAgICovXG4gIGRlY2xpbmUoKTogV2lraWRvdFJlc3VsdEFzeW5jPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5wcm9jZXNzKCdkZWNsaW5lJyk7XG4gIH1cblxuICB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiBgU2l0ZUFwcGxpY2F0aW9uKHVzZXI9JHt0aGlzLnVzZXIubmFtZX0sIHNpdGU9JHt0aGlzLnNpdGUudW5peE5hbWV9LCB0ZXh0PSR7dGhpcy50ZXh0fSlgO1xuICB9XG59XG4iLAogICAgImltcG9ydCAqIGFzIGNoZWVyaW8gZnJvbSAnY2hlZXJpbyc7XG5pbXBvcnQgeyBSZXF1aXJlTG9naW4gfSBmcm9tICcuLi8uLi9jb21tb24vZGVjb3JhdG9ycyc7XG5pbXBvcnQge1xuICBMb2dpblJlcXVpcmVkRXJyb3IsXG4gIFRhcmdldEVycm9yLFxuICBVbmV4cGVjdGVkRXJyb3IsXG4gIFdpa2lkb3RTdGF0dXNFcnJvcixcbn0gZnJvbSAnLi4vLi4vY29tbW9uL2Vycm9ycyc7XG5pbXBvcnQgeyBmcm9tUHJvbWlzZSwgdHlwZSBXaWtpZG90UmVzdWx0QXN5bmMgfSBmcm9tICcuLi8uLi9jb21tb24vdHlwZXMnO1xuaW1wb3J0IHsgcGFyc2VPZGF0ZSwgcGFyc2VVc2VyIH0gZnJvbSAnLi4vLi4vdXRpbC9wYXJzZXInO1xuaW1wb3J0IHR5cGUgeyBBYnN0cmFjdFVzZXIgfSBmcm9tICcuLi91c2VyJztcbmltcG9ydCB0eXBlIHsgU2l0ZSB9IGZyb20gJy4vc2l0ZSc7XG5cbi8qKlxuICog44K144Kk44OI44Oh44Oz44OQ44O844OH44O844K/XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2l0ZU1lbWJlckRhdGEge1xuICBzaXRlOiBTaXRlO1xuICB1c2VyOiBBYnN0cmFjdFVzZXI7XG4gIGpvaW5lZEF0OiBEYXRlIHwgbnVsbDtcbn1cblxuLyoqXG4gKiDjgrXjgqTjg4jjg6Hjg7Pjg5Djg7xcbiAqL1xuZXhwb3J0IGNsYXNzIFNpdGVNZW1iZXIge1xuICBwdWJsaWMgcmVhZG9ubHkgc2l0ZTogU2l0ZTtcbiAgcHVibGljIHJlYWRvbmx5IHVzZXI6IEFic3RyYWN0VXNlcjtcbiAgcHVibGljIHJlYWRvbmx5IGpvaW5lZEF0OiBEYXRlIHwgbnVsbDtcblxuICBjb25zdHJ1Y3RvcihkYXRhOiBTaXRlTWVtYmVyRGF0YSkge1xuICAgIHRoaXMuc2l0ZSA9IGRhdGEuc2l0ZTtcbiAgICB0aGlzLnVzZXIgPSBkYXRhLnVzZXI7XG4gICAgdGhpcy5qb2luZWRBdCA9IGRhdGEuam9pbmVkQXQ7XG4gIH1cblxuICAvKipcbiAgICogSFRNTOOBi+OCieODoeODs+ODkOODvOaDheWgseOCkuODkeODvOOCueOBmeOCi1xuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcGFyc2Uoc2l0ZTogU2l0ZSwgaHRtbDogc3RyaW5nKTogU2l0ZU1lbWJlcltdIHtcbiAgICBjb25zdCAkID0gY2hlZXJpby5sb2FkKGh0bWwpO1xuICAgIGNvbnN0IG1lbWJlcnM6IFNpdGVNZW1iZXJbXSA9IFtdO1xuXG4gICAgJCgndGFibGUgdHInKS5lYWNoKChfaSwgcm93KSA9PiB7XG4gICAgICBjb25zdCB0ZHMgPSAkKHJvdykuZmluZCgndGQnKTtcbiAgICAgIGNvbnN0IHVzZXJFbGVtID0gJCh0ZHNbMF0pLmZpbmQoJy5wcmludHVzZXInKTtcblxuICAgICAgaWYgKHVzZXJFbGVtLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHVzZXIgPSBwYXJzZVVzZXIoc2l0ZS5jbGllbnQsIHVzZXJFbGVtKTtcblxuICAgICAgLy8gMuOBpOebruOBrnRk44GM44GC44KM44Gw5Yqg5YWl5pel5pmCXG4gICAgICBsZXQgam9pbmVkQXQ6IERhdGUgfCBudWxsID0gbnVsbDtcbiAgICAgIGlmICh0ZHMubGVuZ3RoID49IDIpIHtcbiAgICAgICAgY29uc3Qgb2RhdGVFbGVtID0gJCh0ZHNbMV0pLmZpbmQoJy5vZGF0ZScpO1xuICAgICAgICBpZiAob2RhdGVFbGVtLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBqb2luZWRBdCA9IHBhcnNlT2RhdGUob2RhdGVFbGVtKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBtZW1iZXJzLnB1c2gobmV3IFNpdGVNZW1iZXIoeyBzaXRlLCB1c2VyLCBqb2luZWRBdCB9KSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gbWVtYmVycztcbiAgfVxuXG4gIC8qKlxuICAgKiDjgrXjgqTjg4jjg6Hjg7Pjg5Djg7zkuIDopqfjgpLlj5blvpfjgZnjgotcbiAgICogQHBhcmFtIHNpdGUgLSDlr77osaHjgrXjgqTjg4hcbiAgICogQHBhcmFtIGdyb3VwIC0g44Kw44Or44O844OX77yIXCJhZG1pbnNcIiwgXCJtb2RlcmF0b3JzXCIsIOOBvuOBn+OBr+epuuaWh+Wtl+OBp+WFqOODoeODs+ODkOODvO+8iVxuICAgKi9cbiAgc3RhdGljIGdldE1lbWJlcnMoXG4gICAgc2l0ZTogU2l0ZSxcbiAgICBncm91cDogJ2FkbWlucycgfCAnbW9kZXJhdG9ycycgfCAnJyA9ICcnXG4gICk6IFdpa2lkb3RSZXN1bHRBc3luYzxTaXRlTWVtYmVyW10+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBtZW1iZXJzOiBTaXRlTWVtYmVyW10gPSBbXTtcblxuICAgICAgICAvLyDmnIDliJ3jga7jg5rjg7zjgrjjgpLlj5blvpdcbiAgICAgICAgY29uc3QgZmlyc3RSZXN1bHQgPSBhd2FpdCBzaXRlLmFtY1JlcXVlc3QoW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG1vZHVsZU5hbWU6ICdtZW1iZXJzaGlwL01lbWJlcnNMaXN0TW9kdWxlJyxcbiAgICAgICAgICAgIHBhZ2U6IDEsXG4gICAgICAgICAgICBncm91cCxcbiAgICAgICAgICB9LFxuICAgICAgICBdKTtcblxuICAgICAgICBpZiAoZmlyc3RSZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IGZpcnN0UmVzdWx0LmVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZmlyc3RSZXNwb25zZSA9IGZpcnN0UmVzdWx0LnZhbHVlWzBdO1xuICAgICAgICBpZiAoIWZpcnN0UmVzcG9uc2UpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZEVycm9yKCdFbXB0eSByZXNwb25zZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZmlyc3RIdG1sID0gU3RyaW5nKGZpcnN0UmVzcG9uc2UuYm9keSA/PyAnJyk7XG4gICAgICAgIG1lbWJlcnMucHVzaCguLi5TaXRlTWVtYmVyLnBhcnNlKHNpdGUsIGZpcnN0SHRtbCkpO1xuXG4gICAgICAgIC8vIOODmuODvOOCuOODo+ODvOOCkueiuuiqjVxuICAgICAgICBjb25zdCAkZmlyc3QgPSBjaGVlcmlvLmxvYWQoZmlyc3RIdG1sKTtcbiAgICAgICAgY29uc3QgcGFnZXJMaW5rcyA9ICRmaXJzdCgnZGl2LnBhZ2VyIGEnKTtcbiAgICAgICAgaWYgKHBhZ2VyTGlua3MubGVuZ3RoIDwgMikge1xuICAgICAgICAgIHJldHVybiBtZW1iZXJzO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbGFzdFBhZ2VUZXh0ID0gJGZpcnN0KHBhZ2VyTGlua3NbcGFnZXJMaW5rcy5sZW5ndGggLSAyXSlcbiAgICAgICAgICAudGV4dCgpXG4gICAgICAgICAgLnRyaW0oKTtcbiAgICAgICAgY29uc3QgbGFzdFBhZ2UgPSBOdW1iZXIucGFyc2VJbnQobGFzdFBhZ2VUZXh0LCAxMCkgfHwgMTtcbiAgICAgICAgaWYgKGxhc3RQYWdlIDw9IDEpIHtcbiAgICAgICAgICByZXR1cm4gbWVtYmVycztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIOaui+OCiuOBruODmuODvOOCuOOCkuWPluW+l1xuICAgICAgICBjb25zdCBib2RpZXMgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgcGFnZSA9IDI7IHBhZ2UgPD0gbGFzdFBhZ2U7IHBhZ2UrKykge1xuICAgICAgICAgIGJvZGllcy5wdXNoKHtcbiAgICAgICAgICAgIG1vZHVsZU5hbWU6ICdtZW1iZXJzaGlwL01lbWJlcnNMaXN0TW9kdWxlJyxcbiAgICAgICAgICAgIHBhZ2UsXG4gICAgICAgICAgICBncm91cCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGFkZGl0aW9uYWxSZXN1bHRzID0gYXdhaXQgc2l0ZS5hbWNSZXF1ZXN0KGJvZGllcyk7XG4gICAgICAgIGlmIChhZGRpdGlvbmFsUmVzdWx0cy5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgYWRkaXRpb25hbFJlc3VsdHMuZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IHJlc3BvbnNlIG9mIGFkZGl0aW9uYWxSZXN1bHRzLnZhbHVlKSB7XG4gICAgICAgICAgY29uc3QgaHRtbCA9IFN0cmluZyhyZXNwb25zZT8uYm9keSA/PyAnJyk7XG4gICAgICAgICAgbWVtYmVycy5wdXNoKC4uLlNpdGVNZW1iZXIucGFyc2Uoc2l0ZSwgaHRtbCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG1lbWJlcnM7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gZ2V0IG1lbWJlcnM6ICR7U3RyaW5nKGVycm9yKX1gKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICog44Kw44Or44O844OX5aSJ5pu044Gu5YaF6YOo44Oh44K944OD44OJXG4gICAqL1xuICBAUmVxdWlyZUxvZ2luXG4gIHByaXZhdGUgY2hhbmdlR3JvdXAoXG4gICAgZXZlbnQ6ICd0b01vZGVyYXRvcnMnIHwgJ3JlbW92ZU1vZGVyYXRvcicgfCAndG9BZG1pbnMnIHwgJ3JlbW92ZUFkbWluJ1xuICApOiBXaWtpZG90UmVzdWx0QXN5bmM8dm9pZD4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc2l0ZS5hbWNSZXF1ZXN0KFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhY3Rpb246ICdNYW5hZ2VTaXRlTWVtYmVyc2hpcEFjdGlvbicsXG4gICAgICAgICAgICBldmVudCxcbiAgICAgICAgICAgIHVzZXJfaWQ6IHRoaXMudXNlci5pZCxcbiAgICAgICAgICAgIG1vZHVsZU5hbWU6ICcnLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pO1xuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICBjb25zdCBlcnJvciA9IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBXaWtpZG90U3RhdHVzRXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChlcnJvci5zdGF0dXNDb2RlID09PSAnbm90X2FscmVhZHknKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBUYXJnZXRFcnJvcihgVXNlciBpcyBub3QgbW9kZXJhdG9yL2FkbWluOiAke3RoaXMudXNlci5uYW1lfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGVycm9yLnN0YXR1c0NvZGUgPT09ICdhbHJlYWR5X2FkbWluJyB8fCBlcnJvci5zdGF0dXNDb2RlID09PSAnYWxyZWFkeV9tb2RlcmF0b3InKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBUYXJnZXRFcnJvcihcbiAgICAgICAgICAgICAgICBgVXNlciBpcyBhbHJlYWR5ICR7ZXJyb3Iuc3RhdHVzQ29kZS5yZXBsYWNlKCdhbHJlYWR5XycsICcnKX06ICR7dGhpcy51c2VyLm5hbWV9YFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBUYXJnZXRFcnJvciB8fCBlcnJvciBpbnN0YW5jZW9mIExvZ2luUmVxdWlyZWRFcnJvcikge1xuICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGNoYW5nZSBtZW1iZXIgZ3JvdXA6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIOODouODh+ODrOODvOOCv+ODvOOBq+aYh+agvFxuICAgKi9cbiAgdG9Nb2RlcmF0b3IoKTogV2lraWRvdFJlc3VsdEFzeW5jPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5jaGFuZ2VHcm91cCgndG9Nb2RlcmF0b3JzJyk7XG4gIH1cblxuICAvKipcbiAgICog44Oi44OH44Os44O844K/44O85qip6ZmQ44KS5YmK6ZmkXG4gICAqL1xuICByZW1vdmVNb2RlcmF0b3IoKTogV2lraWRvdFJlc3VsdEFzeW5jPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5jaGFuZ2VHcm91cCgncmVtb3ZlTW9kZXJhdG9yJyk7XG4gIH1cblxuICAvKipcbiAgICog566h55CG6ICF44Gr5piH5qC8XG4gICAqL1xuICB0b0FkbWluKCk6IFdpa2lkb3RSZXN1bHRBc3luYzx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuY2hhbmdlR3JvdXAoJ3RvQWRtaW5zJyk7XG4gIH1cblxuICAvKipcbiAgICog566h55CG6ICF5qip6ZmQ44KS5YmK6ZmkXG4gICAqL1xuICByZW1vdmVBZG1pbigpOiBXaWtpZG90UmVzdWx0QXN5bmM8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLmNoYW5nZUdyb3VwKCdyZW1vdmVBZG1pbicpO1xuICB9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFNpdGVNZW1iZXIodXNlcj0ke3RoaXMudXNlci5uYW1lfSwgc2l0ZT0ke3RoaXMuc2l0ZS51bml4TmFtZX0pYDtcbiAgfVxufVxuIiwKICAgICJpbXBvcnQgeyBOb0VsZW1lbnRFcnJvciwgVW5leHBlY3RlZEVycm9yIH0gZnJvbSAnLi4vLi4vLi4vY29tbW9uL2Vycm9ycyc7XG5pbXBvcnQgeyBmcm9tUHJvbWlzZSwgdHlwZSBXaWtpZG90UmVzdWx0QXN5bmMgfSBmcm9tICcuLi8uLi8uLi9jb21tb24vdHlwZXMnO1xuaW1wb3J0IHsgcGFyc2VVc2VyIH0gZnJvbSAnLi4vLi4vLi4vdXRpbC9wYXJzZXInO1xuaW1wb3J0IHsgUGFnZSwgUGFnZUNvbGxlY3Rpb24sIFNlYXJjaFBhZ2VzUXVlcnkgfSBmcm9tICcuLi8uLi9wYWdlJztcbmltcG9ydCB0eXBlIHsgU2l0ZSB9IGZyb20gJy4uL3NpdGUnO1xuXG4vKipcbiAqIOWNmOS4gOODmuODvOOCuOaTjeS9nOOCouOCr+OCu+OCtVxuICovXG5leHBvcnQgY2xhc3MgUGFnZUFjY2Vzc29yIHtcbiAgcHVibGljIHJlYWRvbmx5IHNpdGU6IFNpdGU7XG5cbiAgY29uc3RydWN0b3Ioc2l0ZTogU2l0ZSkge1xuICAgIHRoaXMuc2l0ZSA9IHNpdGU7XG4gIH1cblxuICAvKipcbiAgICogVU5JWOWQjeOBi+OCieODmuODvOOCuOOCkuWPluW+l+OBmeOCi1xuICAgKiBAcGFyYW0gdW5peE5hbWUgLSDjg5rjg7zjgrjjga5VTklY5ZCN77yI5L6LOiAnc2NwLTE3MyfvvIlcbiAgICogQHJldHVybnMg44Oa44O844K477yI5a2Y5Zyo44GX44Gq44GE5aC05ZCI44GvbnVsbO+8iVxuICAgKi9cbiAgZ2V0KHVuaXhOYW1lOiBzdHJpbmcpOiBXaWtpZG90UmVzdWx0QXN5bmM8UGFnZSB8IG51bGw+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBxdWVyeSA9IG5ldyBTZWFyY2hQYWdlc1F1ZXJ5KHsgZnVsbG5hbWU6IHVuaXhOYW1lIH0pO1xuICAgICAgICBjb25zdCB1c2VyUGFyc2VyID0gcGFyc2VVc2VyLmJpbmQobnVsbCwgdGhpcy5zaXRlLmNsaWVudCk7XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgUGFnZUNvbGxlY3Rpb24uc2VhcmNoUGFnZXModGhpcy5zaXRlLCB1c2VyUGFyc2VyLCBxdWVyeSk7XG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHQudmFsdWUubGVuZ3RoID4gMCA/IChyZXN1bHQudmFsdWVbMF0gPz8gbnVsbCkgOiBudWxsO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBOb0VsZW1lbnRFcnJvcikgcmV0dXJuIGVycm9yO1xuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGdldCBwYWdlOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDjg5rjg7zjgrjjgpLkvZzmiJDjgZnjgotcbiAgICogQHBhcmFtIGZ1bGxuYW1lIC0g44Oa44O844K444Gu44OV44Or44ON44O844Og77yI5L6LOiAnc2NwLTE3MyfvvIlcbiAgICogQHBhcmFtIG9wdGlvbnMgLSDkvZzmiJDjgqrjg5fjgrfjg6fjg7NcbiAgICogQHJldHVybnMgdm9pZFxuICAgKi9cbiAgY3JlYXRlKFxuICAgIGZ1bGxuYW1lOiBzdHJpbmcsXG4gICAgb3B0aW9uczoge1xuICAgICAgdGl0bGU/OiBzdHJpbmc7XG4gICAgICBzb3VyY2U/OiBzdHJpbmc7XG4gICAgICBjb21tZW50Pzogc3RyaW5nO1xuICAgICAgZm9yY2VFZGl0PzogYm9vbGVhbjtcbiAgICB9ID0ge31cbiAgKTogV2lraWRvdFJlc3VsdEFzeW5jPHZvaWQ+IHtcbiAgICByZXR1cm4gUGFnZUNvbGxlY3Rpb24uY3JlYXRlT3JFZGl0KHRoaXMuc2l0ZSwgZnVsbG5hbWUsIHtcbiAgICAgIHRpdGxlOiBvcHRpb25zLnRpdGxlLFxuICAgICAgc291cmNlOiBvcHRpb25zLnNvdXJjZSxcbiAgICAgIGNvbW1lbnQ6IG9wdGlvbnMuY29tbWVudCxcbiAgICAgIGZvcmNlRWRpdDogb3B0aW9ucy5mb3JjZUVkaXQsXG4gICAgfSk7XG4gIH1cbn1cblxuZXhwb3J0IHsgUGFnZSB9O1xuIiwKICAgICJpbXBvcnQgdHlwZSB7IENoZWVyaW8gfSBmcm9tICdjaGVlcmlvJztcbmltcG9ydCAqIGFzIGNoZWVyaW8gZnJvbSAnY2hlZXJpbyc7XG5pbXBvcnQgdHlwZSB7IEFueU5vZGUgfSBmcm9tICdkb21oYW5kbGVyJztcbmltcG9ydCBwTGltaXQgZnJvbSAncC1saW1pdCc7XG5pbXBvcnQgeyB6IH0gZnJvbSAnem9kJztcbmltcG9ydCB7IFJlcXVpcmVMb2dpbiB9IGZyb20gJy4uLy4uL2NvbW1vbi9kZWNvcmF0b3JzJztcbmltcG9ydCB7XG4gIEZvcmJpZGRlbkVycm9yLFxuICBMb2dpblJlcXVpcmVkRXJyb3IsXG4gIE5vRWxlbWVudEVycm9yLFxuICBOb3RGb3VuZEV4Y2VwdGlvbixcbiAgVGFyZ2V0RXhpc3RzRXJyb3IsXG4gIFVuZXhwZWN0ZWRFcnJvcixcbn0gZnJvbSAnLi4vLi4vY29tbW9uL2Vycm9ycyc7XG5pbXBvcnQgeyBmcm9tUHJvbWlzZSwgdHlwZSBXaWtpZG90UmVzdWx0QXN5bmMgfSBmcm9tICcuLi8uLi9jb21tb24vdHlwZXMnO1xuaW1wb3J0IHR5cGUgeyBBTUNSZXF1ZXN0Qm9keSB9IGZyb20gJy4uLy4uL2Nvbm5lY3Rvcic7XG5pbXBvcnQgeyBwYXJzZU9kYXRlLCBwYXJzZVVzZXIgfSBmcm9tICcuLi8uLi91dGlsL3BhcnNlcic7XG5pbXBvcnQgdHlwZSB7IFNpdGUgfSBmcm9tICcuLi9zaXRlJztcbmltcG9ydCB0eXBlIHsgQWJzdHJhY3RVc2VyIH0gZnJvbSAnLi4vdXNlcic7XG5pbXBvcnQgeyBQYWdlRmlsZUNvbGxlY3Rpb24gfSBmcm9tICcuL3BhZ2UtZmlsZSc7XG5pbXBvcnQgeyBQYWdlTWV0YUNvbGxlY3Rpb24gfSBmcm9tICcuL3BhZ2UtbWV0YSc7XG5pbXBvcnQgeyBQYWdlUmV2aXNpb24sIFBhZ2VSZXZpc2lvbkNvbGxlY3Rpb24gfSBmcm9tICcuL3BhZ2UtcmV2aXNpb24nO1xuaW1wb3J0IHsgUGFnZVNvdXJjZSB9IGZyb20gJy4vcGFnZS1zb3VyY2UnO1xuaW1wb3J0IHsgUGFnZVZvdGUsIFBhZ2VWb3RlQ29sbGVjdGlvbiB9IGZyb20gJy4vcGFnZS12b3RlJztcbmltcG9ydCB7IERFRkFVTFRfTU9EVUxFX0JPRFksIERFRkFVTFRfUEVSX1BBR0UsIFNlYXJjaFBhZ2VzUXVlcnkgfSBmcm9tICcuL3NlYXJjaC1xdWVyeSc7XG5cbi8qKlxuICogTGlzdFBhZ2VzTW9kdWxl44OR44O844K557WQ5p6c44Gu44K544Kt44O844OeXG4gKiDlnovlronlhajmgKfjga7jgZ/jgoHjgatab2TjgpLkvb/nlKjjgZfjgabjg5Hjg7zjgrnntZDmnpzjgpLmpJzoqLxcbiAqL1xuY29uc3QgcGFnZVBhcmFtc1NjaGVtYSA9IHoub2JqZWN0KHtcbiAgZnVsbG5hbWU6IHoucHJlcHJvY2VzcygodikgPT4gdiA/PyAnJywgei5zdHJpbmcoKSksXG4gIG5hbWU6IHoucHJlcHJvY2VzcygodikgPT4gdiA/PyAnJywgei5zdHJpbmcoKSksXG4gIGNhdGVnb3J5OiB6LnByZXByb2Nlc3MoKHYpID0+IHYgPz8gJycsIHouc3RyaW5nKCkpLFxuICB0aXRsZTogei5wcmVwcm9jZXNzKCh2KSA9PiB2ID8/ICcnLCB6LnN0cmluZygpKSxcbiAgY2hpbGRyZW5fY291bnQ6IHouY29lcmNlLm51bWJlcigpLmRlZmF1bHQoMCksXG4gIGNvbW1lbnRzX2NvdW50OiB6LmNvZXJjZS5udW1iZXIoKS5kZWZhdWx0KDApLFxuICBzaXplOiB6LmNvZXJjZS5udW1iZXIoKS5kZWZhdWx0KDApLFxuICByYXRpbmc6IHouY29lcmNlLm51bWJlcigpLmRlZmF1bHQoMCksXG4gIHZvdGVzX2NvdW50OiB6LmNvZXJjZS5udW1iZXIoKS5kZWZhdWx0KDApLFxuICByYXRpbmdfcGVyY2VudDogei5jb2VyY2UubnVtYmVyKCkubnVsbGFibGUoKS5kZWZhdWx0KG51bGwpLFxuICByZXZpc2lvbnNfY291bnQ6IHouY29lcmNlLm51bWJlcigpLmRlZmF1bHQoMCksXG4gIHBhcmVudF9mdWxsbmFtZTogei5zdHJpbmcoKS5udWxsYWJsZSgpLmRlZmF1bHQobnVsbCksXG4gIHRhZ3M6IHouYXJyYXkoei5zdHJpbmcoKSkuZGVmYXVsdChbXSksXG4gIGNyZWF0ZWRfYnk6IHouY3VzdG9tPEFic3RyYWN0VXNlcj4oKS5udWxsYWJsZSgpLmRlZmF1bHQobnVsbCksXG4gIGNyZWF0ZWRfYXQ6IHouZGF0ZSgpLm51bGxhYmxlKCkuZGVmYXVsdChudWxsKSxcbiAgdXBkYXRlZF9ieTogei5jdXN0b208QWJzdHJhY3RVc2VyPigpLm51bGxhYmxlKCkuZGVmYXVsdChudWxsKSxcbiAgdXBkYXRlZF9hdDogei5kYXRlKCkubnVsbGFibGUoKS5kZWZhdWx0KG51bGwpLFxuICBjb21tZW50ZWRfYnk6IHouY3VzdG9tPEFic3RyYWN0VXNlcj4oKS5udWxsYWJsZSgpLmRlZmF1bHQobnVsbCksXG4gIGNvbW1lbnRlZF9hdDogei5kYXRlKCkubnVsbGFibGUoKS5kZWZhdWx0KG51bGwpLFxufSk7XG5cbi8qKlxuICog44Oa44O844K444OH44O844K/XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFnZURhdGEge1xuICBzaXRlOiBTaXRlO1xuICBmdWxsbmFtZTogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG4gIGNhdGVnb3J5OiBzdHJpbmc7XG4gIHRpdGxlOiBzdHJpbmc7XG4gIGNoaWxkcmVuQ291bnQ6IG51bWJlcjtcbiAgY29tbWVudHNDb3VudDogbnVtYmVyO1xuICBzaXplOiBudW1iZXI7XG4gIHJhdGluZzogbnVtYmVyO1xuICB2b3Rlc0NvdW50OiBudW1iZXI7XG4gIHJhdGluZ1BlcmNlbnQ6IG51bWJlciB8IG51bGw7XG4gIHJldmlzaW9uc0NvdW50OiBudW1iZXI7XG4gIHBhcmVudEZ1bGxuYW1lOiBzdHJpbmcgfCBudWxsO1xuICB0YWdzOiBzdHJpbmdbXTtcbiAgY3JlYXRlZEJ5OiBBYnN0cmFjdFVzZXIgfCBudWxsO1xuICBjcmVhdGVkQXQ6IERhdGU7XG4gIHVwZGF0ZWRCeTogQWJzdHJhY3RVc2VyIHwgbnVsbDtcbiAgdXBkYXRlZEF0OiBEYXRlO1xuICBjb21tZW50ZWRCeTogQWJzdHJhY3RVc2VyIHwgbnVsbDtcbiAgY29tbWVudGVkQXQ6IERhdGUgfCBudWxsO1xufVxuXG4vKipcbiAqIFdpa2lkb3Tjg5rjg7zjgrhcbiAqL1xuZXhwb3J0IGNsYXNzIFBhZ2Uge1xuICBwdWJsaWMgcmVhZG9ubHkgc2l0ZTogU2l0ZTtcbiAgcHVibGljIHJlYWRvbmx5IGZ1bGxuYW1lOiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSBuYW1lOiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSBjYXRlZ29yeTogc3RyaW5nO1xuICBwdWJsaWMgdGl0bGU6IHN0cmluZztcbiAgcHVibGljIGNoaWxkcmVuQ291bnQ6IG51bWJlcjtcbiAgcHVibGljIGNvbW1lbnRzQ291bnQ6IG51bWJlcjtcbiAgcHVibGljIHNpemU6IG51bWJlcjtcbiAgcHVibGljIHJhdGluZzogbnVtYmVyO1xuICBwdWJsaWMgdm90ZXNDb3VudDogbnVtYmVyO1xuICBwdWJsaWMgcmF0aW5nUGVyY2VudDogbnVtYmVyIHwgbnVsbDtcbiAgcHVibGljIHJldmlzaW9uc0NvdW50OiBudW1iZXI7XG4gIHB1YmxpYyBwYXJlbnRGdWxsbmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgcHVibGljIHRhZ3M6IHN0cmluZ1tdO1xuICBwdWJsaWMgcmVhZG9ubHkgY3JlYXRlZEJ5OiBBYnN0cmFjdFVzZXIgfCBudWxsO1xuICBwdWJsaWMgcmVhZG9ubHkgY3JlYXRlZEF0OiBEYXRlO1xuICBwdWJsaWMgdXBkYXRlZEJ5OiBBYnN0cmFjdFVzZXIgfCBudWxsO1xuICBwdWJsaWMgdXBkYXRlZEF0OiBEYXRlO1xuICBwdWJsaWMgY29tbWVudGVkQnk6IEFic3RyYWN0VXNlciB8IG51bGw7XG4gIHB1YmxpYyBjb21tZW50ZWRBdDogRGF0ZSB8IG51bGw7XG5cbiAgcHJpdmF0ZSBfaWQ6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIF9zb3VyY2U6IFBhZ2VTb3VyY2UgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBfcmV2aXNpb25zOiBQYWdlUmV2aXNpb25Db2xsZWN0aW9uIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgX3ZvdGVzOiBQYWdlVm90ZUNvbGxlY3Rpb24gfCBudWxsID0gbnVsbDtcblxuICBjb25zdHJ1Y3RvcihkYXRhOiBQYWdlRGF0YSkge1xuICAgIHRoaXMuc2l0ZSA9IGRhdGEuc2l0ZTtcbiAgICB0aGlzLmZ1bGxuYW1lID0gZGF0YS5mdWxsbmFtZTtcbiAgICB0aGlzLm5hbWUgPSBkYXRhLm5hbWU7XG4gICAgdGhpcy5jYXRlZ29yeSA9IGRhdGEuY2F0ZWdvcnk7XG4gICAgdGhpcy50aXRsZSA9IGRhdGEudGl0bGU7XG4gICAgdGhpcy5jaGlsZHJlbkNvdW50ID0gZGF0YS5jaGlsZHJlbkNvdW50O1xuICAgIHRoaXMuY29tbWVudHNDb3VudCA9IGRhdGEuY29tbWVudHNDb3VudDtcbiAgICB0aGlzLnNpemUgPSBkYXRhLnNpemU7XG4gICAgdGhpcy5yYXRpbmcgPSBkYXRhLnJhdGluZztcbiAgICB0aGlzLnZvdGVzQ291bnQgPSBkYXRhLnZvdGVzQ291bnQ7XG4gICAgdGhpcy5yYXRpbmdQZXJjZW50ID0gZGF0YS5yYXRpbmdQZXJjZW50O1xuICAgIHRoaXMucmV2aXNpb25zQ291bnQgPSBkYXRhLnJldmlzaW9uc0NvdW50O1xuICAgIHRoaXMucGFyZW50RnVsbG5hbWUgPSBkYXRhLnBhcmVudEZ1bGxuYW1lO1xuICAgIHRoaXMudGFncyA9IGRhdGEudGFncztcbiAgICB0aGlzLmNyZWF0ZWRCeSA9IGRhdGEuY3JlYXRlZEJ5O1xuICAgIHRoaXMuY3JlYXRlZEF0ID0gZGF0YS5jcmVhdGVkQXQ7XG4gICAgdGhpcy51cGRhdGVkQnkgPSBkYXRhLnVwZGF0ZWRCeTtcbiAgICB0aGlzLnVwZGF0ZWRBdCA9IGRhdGEudXBkYXRlZEF0O1xuICAgIHRoaXMuY29tbWVudGVkQnkgPSBkYXRhLmNvbW1lbnRlZEJ5O1xuICAgIHRoaXMuY29tbWVudGVkQXQgPSBkYXRhLmNvbW1lbnRlZEF0O1xuICB9XG5cbiAgLyoqXG4gICAqIOODmuODvOOCuFVSTOOCkuWPluW+l1xuICAgKi9cbiAgZ2V0VXJsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3RoaXMuc2l0ZS5nZXRCYXNlVXJsKCl9LyR7dGhpcy5mdWxsbmFtZX1gO1xuICB9XG5cbiAgLyoqXG4gICAqIOODmuODvOOCuElE44GM5Y+W5b6X5riI44G/44GL44Gp44GG44GLXG4gICAqL1xuICBpc0lkQWNxdWlyZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2lkICE9PSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIOODmuODvOOCuElE44KS5Y+W5b6XXG4gICAqL1xuICBnZXQgaWQoKTogbnVtYmVyIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX2lkO1xuICB9XG5cbiAgLyoqXG4gICAqIOODmuODvOOCuElE44KS6Kit5a6aXG4gICAqL1xuICBzZXQgaWQodmFsdWU6IG51bWJlciB8IG51bGwpIHtcbiAgICB0aGlzLl9pZCA9IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIOOCveODvOOCueOCs+ODvOODieOCkuWPluW+l1xuICAgKi9cbiAgZ2V0IHNvdXJjZSgpOiBQYWdlU291cmNlIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX3NvdXJjZTtcbiAgfVxuXG4gIC8qKlxuICAgKiDjgr3jg7zjgrnjgrPjg7zjg4njgpLoqK3lrppcbiAgICovXG4gIHNldCBzb3VyY2UodmFsdWU6IFBhZ2VTb3VyY2UgfCBudWxsKSB7XG4gICAgdGhpcy5fc291cmNlID0gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICog44Oq44OT44K444On44Oz5bGl5q2044KS5Y+W5b6XXG4gICAqL1xuICBnZXQgcmV2aXNpb25zKCk6IFBhZ2VSZXZpc2lvbkNvbGxlY3Rpb24gfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fcmV2aXNpb25zO1xuICB9XG5cbiAgLyoqXG4gICAqIOODquODk+OCuOODp+ODs+WxpeattOOCkuioreWumlxuICAgKi9cbiAgc2V0IHJldmlzaW9ucyh2YWx1ZTogUGFnZVJldmlzaW9uQ29sbGVjdGlvbiB8IG51bGwpIHtcbiAgICB0aGlzLl9yZXZpc2lvbnMgPSB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmipXnpajmg4XloLHjgpLlj5blvpdcbiAgICovXG4gIGdldCB2b3RlcygpOiBQYWdlVm90ZUNvbGxlY3Rpb24gfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fdm90ZXM7XG4gIH1cblxuICAvKipcbiAgICog5oqV56Wo5oOF5aCx44KS6Kit5a6aXG4gICAqL1xuICBzZXQgdm90ZXModmFsdWU6IFBhZ2VWb3RlQ29sbGVjdGlvbiB8IG51bGwpIHtcbiAgICB0aGlzLl92b3RlcyA9IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIOacgOaWsOODquODk+OCuOODp+ODs+OCkuWPluW+l1xuICAgKi9cbiAgZ2V0IGxhdGVzdFJldmlzaW9uKCk6IFBhZ2VSZXZpc2lvbiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCF0aGlzLl9yZXZpc2lvbnMgfHwgdGhpcy5fcmV2aXNpb25zLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4gdGhpcy5fcmV2aXNpb25zLnJlZHVjZSgobWF4LCByZXYpID0+IChyZXYucmV2Tm8gPiBtYXgucmV2Tm8gPyByZXYgOiBtYXgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDjg5rjg7zjgrhJROOBjOW/hemgiOOBruaTjeS9nOOBp+OAgUlE44GM44Gq44GE5aC05ZCI44Gr44Ko44Op44O844KS6L+U44GZ44OY44Or44OR44O8XG4gICAqIEBwYXJhbSBvcGVyYXRpb24gLSDmk43kvZzlkI3vvIjjgqjjg6njg7zjg6Hjg4Pjgrvjg7zjgrjnlKjvvIlcbiAgICogQHJldHVybnMg44Oa44O844K4SUTjgb7jgZ/jga/jgqjjg6njg7xSZXN1bHRcbiAgICovXG4gIHByaXZhdGUgcmVxdWlyZUlkKFxuICAgIG9wZXJhdGlvbjogc3RyaW5nXG4gICk6IHsgb2s6IHRydWU7IGlkOiBudW1iZXIgfSB8IHsgb2s6IGZhbHNlOyBlcnJvcjogV2lraWRvdFJlc3VsdEFzeW5jPG5ldmVyPiB9IHtcbiAgICBpZiAodGhpcy5faWQgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG9rOiBmYWxzZSxcbiAgICAgICAgZXJyb3I6IGZyb21Qcm9taXNlKFxuICAgICAgICAgIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcignUGFnZSBJRCBub3QgYWNxdWlyZWQnKSksXG4gICAgICAgICAgKCkgPT4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgUGFnZSBJRCBtdXN0IGJlIGFjcXVpcmVkIGJlZm9yZSAke29wZXJhdGlvbn1gKVxuICAgICAgICApLFxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHsgb2s6IHRydWUsIGlkOiB0aGlzLl9pZCB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOODmuODvOOCuOOCkuWJiumZpOOBmeOCi1xuICAgKi9cbiAgQFJlcXVpcmVMb2dpblxuICBkZXN0cm95KCk6IFdpa2lkb3RSZXN1bHRBc3luYzx2b2lkPiB7XG4gICAgY29uc3QgaWRDaGVjayA9IHRoaXMucmVxdWlyZUlkKCdkZWxldGlvbicpO1xuICAgIGlmICghaWRDaGVjay5vaykgcmV0dXJuIGlkQ2hlY2suZXJyb3I7XG5cbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnNpdGUuYW1jUmVxdWVzdChbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWN0aW9uOiAnV2lraVBhZ2VBY3Rpb24nLFxuICAgICAgICAgICAgZXZlbnQ6ICdkZWxldGVQYWdlJyxcbiAgICAgICAgICAgIHBhZ2VfaWQ6IHRoaXMuX2lkLFxuICAgICAgICAgICAgbW9kdWxlTmFtZTogJ0VtcHR5JyxcbiAgICAgICAgICB9LFxuICAgICAgICBdKTtcbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gZGVsZXRlIHBhZ2U6ICR7U3RyaW5nKGVycm9yKX1gKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICog44K/44Kw44KS5L+d5a2Y44GZ44KLXG4gICAqL1xuICBAUmVxdWlyZUxvZ2luXG4gIGNvbW1pdFRhZ3MoKTogV2lraWRvdFJlc3VsdEFzeW5jPHZvaWQ+IHtcbiAgICBjb25zdCBpZENoZWNrID0gdGhpcy5yZXF1aXJlSWQoJ3NhdmluZyB0YWdzJyk7XG4gICAgaWYgKCFpZENoZWNrLm9rKSByZXR1cm4gaWRDaGVjay5lcnJvcjtcblxuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc2l0ZS5hbWNSZXF1ZXN0KFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0YWdzOiB0aGlzLnRhZ3Muam9pbignICcpLFxuICAgICAgICAgICAgYWN0aW9uOiAnV2lraVBhZ2VBY3Rpb24nLFxuICAgICAgICAgICAgZXZlbnQ6ICdzYXZlVGFncycsXG4gICAgICAgICAgICBwYWdlSWQ6IHRoaXMuX2lkLFxuICAgICAgICAgICAgbW9kdWxlTmFtZTogJ0VtcHR5JyxcbiAgICAgICAgICB9LFxuICAgICAgICBdKTtcbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gc2F2ZSB0YWdzOiAke1N0cmluZyhlcnJvcil9YClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIOimquODmuODvOOCuOOCkuioreWumuOBmeOCi1xuICAgKiBAcGFyYW0gcGFyZW50RnVsbG5hbWUgLSDopqrjg5rjg7zjgrjjga7jg5Xjg6vjg43jg7zjg6DvvIhudWxs44Gn6Kej6Zmk77yJXG4gICAqL1xuICBAUmVxdWlyZUxvZ2luXG4gIHNldFBhcmVudChwYXJlbnRGdWxsbmFtZTogc3RyaW5nIHwgbnVsbCk6IFdpa2lkb3RSZXN1bHRBc3luYzx2b2lkPiB7XG4gICAgY29uc3QgaWRDaGVjayA9IHRoaXMucmVxdWlyZUlkKCdzZXR0aW5nIHBhcmVudCcpO1xuICAgIGlmICghaWRDaGVjay5vaykgcmV0dXJuIGlkQ2hlY2suZXJyb3I7XG5cbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnNpdGUuYW1jUmVxdWVzdChbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWN0aW9uOiAnV2lraVBhZ2VBY3Rpb24nLFxuICAgICAgICAgICAgZXZlbnQ6ICdzZXRQYXJlbnRQYWdlJyxcbiAgICAgICAgICAgIG1vZHVsZU5hbWU6ICdFbXB0eScsXG4gICAgICAgICAgICBwYWdlSWQ6IFN0cmluZyh0aGlzLl9pZCksXG4gICAgICAgICAgICBwYXJlbnROYW1lOiBwYXJlbnRGdWxsbmFtZSA/PyAnJyxcbiAgICAgICAgICB9LFxuICAgICAgICBdKTtcbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucGFyZW50RnVsbG5hbWUgPSBwYXJlbnRGdWxsbmFtZTtcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBzZXQgcGFyZW50OiAke1N0cmluZyhlcnJvcil9YClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIOODmuODvOOCuOOBq+aKleelqOOBmeOCi1xuICAgKiBAcGFyYW0gdmFsdWUgLSDmipXnpajlgKRcbiAgICogQHJldHVybnMg5paw44GX44GE44Os44O844OG44Kj44Oz44KwXG4gICAqL1xuICBAUmVxdWlyZUxvZ2luXG4gIHZvdGUodmFsdWU6IG51bWJlcik6IFdpa2lkb3RSZXN1bHRBc3luYzxudW1iZXI+IHtcbiAgICBjb25zdCBpZENoZWNrID0gdGhpcy5yZXF1aXJlSWQoJ3ZvdGluZycpO1xuICAgIGlmICghaWRDaGVjay5vaykgcmV0dXJuIGlkQ2hlY2suZXJyb3I7XG5cbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnNpdGUuYW1jUmVxdWVzdChbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWN0aW9uOiAnUmF0ZUFjdGlvbicsXG4gICAgICAgICAgICBldmVudDogJ3JhdGVQYWdlJyxcbiAgICAgICAgICAgIG1vZHVsZU5hbWU6ICdFbXB0eScsXG4gICAgICAgICAgICBwYWdlSWQ6IHRoaXMuX2lkLFxuICAgICAgICAgICAgcG9pbnRzOiB2YWx1ZSxcbiAgICAgICAgICAgIGZvcmNlOiAneWVzJyxcbiAgICAgICAgICB9LFxuICAgICAgICBdKTtcbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gcmVzdWx0LnZhbHVlWzBdO1xuICAgICAgICBpZiAoIXJlc3BvbnNlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRFcnJvcignRW1wdHkgcmVzcG9uc2UgZnJvbSB2b3RlIHJlcXVlc3QnKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuZXdSYXRpbmcgPSBOdW1iZXIucGFyc2VJbnQoU3RyaW5nKHJlc3BvbnNlLnBvaW50cyA/PyB0aGlzLnJhdGluZyksIDEwKTtcbiAgICAgICAgdGhpcy5yYXRpbmcgPSBuZXdSYXRpbmc7XG4gICAgICAgIHJldHVybiBuZXdSYXRpbmc7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gdm90ZTogJHtTdHJpbmcoZXJyb3IpfWApXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmipXnpajjgpLjgq3jg6Pjg7Pjgrvjg6vjgZnjgotcbiAgICogQHJldHVybnMg5paw44GX44GE44Os44O844OG44Kj44Oz44KwXG4gICAqL1xuICBAUmVxdWlyZUxvZ2luXG4gIGNhbmNlbFZvdGUoKTogV2lraWRvdFJlc3VsdEFzeW5jPG51bWJlcj4ge1xuICAgIGNvbnN0IGlkQ2hlY2sgPSB0aGlzLnJlcXVpcmVJZCgnY2FuY2VsaW5nIHZvdGUnKTtcbiAgICBpZiAoIWlkQ2hlY2sub2spIHJldHVybiBpZENoZWNrLmVycm9yO1xuXG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zaXRlLmFtY1JlcXVlc3QoW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFjdGlvbjogJ1JhdGVBY3Rpb24nLFxuICAgICAgICAgICAgZXZlbnQ6ICdjYW5jZWxWb3RlJyxcbiAgICAgICAgICAgIG1vZHVsZU5hbWU6ICdFbXB0eScsXG4gICAgICAgICAgICBwYWdlSWQ6IHRoaXMuX2lkLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pO1xuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSByZXN1bHQudmFsdWVbMF07XG4gICAgICAgIGlmICghcmVzcG9uc2UpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZEVycm9yKCdFbXB0eSByZXNwb25zZSBmcm9tIGNhbmNlbCB2b3RlIHJlcXVlc3QnKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuZXdSYXRpbmcgPSBOdW1iZXIucGFyc2VJbnQoU3RyaW5nKHJlc3BvbnNlLnBvaW50cyA/PyB0aGlzLnJhdGluZyksIDEwKTtcbiAgICAgICAgdGhpcy5yYXRpbmcgPSBuZXdSYXRpbmc7XG4gICAgICAgIHJldHVybiBuZXdSYXRpbmc7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gY2FuY2VsIHZvdGU6ICR7U3RyaW5nKGVycm9yKX1gKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICog44Oa44O844K444KS57eo6ZuG44GZ44KLXG4gICAqIEBwYXJhbSBvcHRpb25zIC0g57eo6ZuG44Kq44OX44K344On44OzXG4gICAqL1xuICBAUmVxdWlyZUxvZ2luXG4gIGVkaXQob3B0aW9uczoge1xuICAgIHRpdGxlPzogc3RyaW5nO1xuICAgIHNvdXJjZT86IHN0cmluZztcbiAgICBjb21tZW50Pzogc3RyaW5nO1xuICAgIGZvcmNlRWRpdD86IGJvb2xlYW47XG4gIH0pOiBXaWtpZG90UmVzdWx0QXN5bmM8dm9pZD4ge1xuICAgIGNvbnN0IGlkQ2hlY2sgPSB0aGlzLnJlcXVpcmVJZCgnZWRpdGluZycpO1xuICAgIGlmICghaWRDaGVjay5vaykgcmV0dXJuIGlkQ2hlY2suZXJyb3I7XG5cbiAgICBjb25zdCBwYWdlSWQgPSBpZENoZWNrLmlkO1xuXG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgLy8g54++5Zyo44Gu44K944O844K544KS5Y+W5b6X77yI5oyH5a6a44GM44Gq44GE5aC05ZCI77yJXG4gICAgICAgIGxldCBjdXJyZW50U291cmNlID0gb3B0aW9ucy5zb3VyY2U7XG4gICAgICAgIGlmIChjdXJyZW50U291cmNlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBjb25zdCBleGlzdGluZ1NvdXJjZSA9IHRoaXMuX3NvdXJjZTtcbiAgICAgICAgICBpZiAoZXhpc3RpbmdTb3VyY2UgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGN1cnJlbnRTb3VyY2UgPSBleGlzdGluZ1NvdXJjZS53aWtpVGV4dDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8g44K944O844K544KS5Y+W5b6XXG4gICAgICAgICAgICBjb25zdCBzb3VyY2VSZXN1bHQgPSBhd2FpdCBQYWdlQ29sbGVjdGlvbi5hY3F1aXJlUGFnZVNvdXJjZXModGhpcy5zaXRlLCBbdGhpc10pO1xuICAgICAgICAgICAgaWYgKHNvdXJjZVJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgICAgIHRocm93IHNvdXJjZVJlc3VsdC5lcnJvcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGFjcXVpcmVQYWdlU291cmNlc+W+jOOAgXRoaXMuX3NvdXJjZeOBq+OCu+ODg+ODiOOBleOCjOOCi1xuICAgICAgICAgICAgY3VycmVudFNvdXJjZSA9IHRoaXMuX3NvdXJjZT8ud2lraVRleHQgPz8gJyc7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgUGFnZUNvbGxlY3Rpb24uY3JlYXRlT3JFZGl0KHRoaXMuc2l0ZSwgdGhpcy5mdWxsbmFtZSwge1xuICAgICAgICAgIHBhZ2VJZCxcbiAgICAgICAgICB0aXRsZTogb3B0aW9ucy50aXRsZSA/PyB0aGlzLnRpdGxlLFxuICAgICAgICAgIHNvdXJjZTogY3VycmVudFNvdXJjZSxcbiAgICAgICAgICBjb21tZW50OiBvcHRpb25zLmNvbW1lbnQgPz8gJycsXG4gICAgICAgICAgZm9yY2VFZGl0OiBvcHRpb25zLmZvcmNlRWRpdCA/PyBmYWxzZSxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBMb2dpblJlcXVpcmVkRXJyb3IgfHwgZXJyb3IgaW5zdGFuY2VvZiBGb3JiaWRkZW5FcnJvcikge1xuICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGVkaXQgcGFnZTogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICog44Oa44O844K45ZCN44KS5aSJ5pu044GZ44KLXG4gICAqIEBwYXJhbSBuZXdGdWxsbmFtZSAtIOaWsOOBl+OBhOODleODq+ODjeODvOODoFxuICAgKi9cbiAgQFJlcXVpcmVMb2dpblxuICByZW5hbWUobmV3RnVsbG5hbWU6IHN0cmluZyk6IFdpa2lkb3RSZXN1bHRBc3luYzx2b2lkPiB7XG4gICAgY29uc3QgaWRDaGVjayA9IHRoaXMucmVxdWlyZUlkKCdyZW5hbWluZycpO1xuICAgIGlmICghaWRDaGVjay5vaykgcmV0dXJuIGlkQ2hlY2suZXJyb3I7XG5cbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnNpdGUuYW1jUmVxdWVzdChbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWN0aW9uOiAnV2lraVBhZ2VBY3Rpb24nLFxuICAgICAgICAgICAgZXZlbnQ6ICdyZW5hbWVQYWdlJyxcbiAgICAgICAgICAgIG1vZHVsZU5hbWU6ICdFbXB0eScsXG4gICAgICAgICAgICBwYWdlX2lkOiB0aGlzLl9pZCxcbiAgICAgICAgICAgIG5ld19uYW1lOiBuZXdGdWxsbmFtZSxcbiAgICAgICAgICB9LFxuICAgICAgICBdKTtcbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG4gICAgICAgIC8vIOODl+ODreODkeODhuOCo+OCkuabtOaWsO+8iHJlYWRvbmx544Gq44Gu44GnT2JqZWN0LmFzc2lnbuOBp++8iVxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIHtcbiAgICAgICAgICBmdWxsbmFtZTogbmV3RnVsbG5hbWUsXG4gICAgICAgICAgY2F0ZWdvcnk6IG5ld0Z1bGxuYW1lLmluY2x1ZGVzKCc6JykgPyBuZXdGdWxsbmFtZS5zcGxpdCgnOicpWzBdIDogJ19kZWZhdWx0JyxcbiAgICAgICAgICBuYW1lOiBuZXdGdWxsbmFtZS5pbmNsdWRlcygnOicpID8gbmV3RnVsbG5hbWUuc3BsaXQoJzonKVsxXSA6IG5ld0Z1bGxuYW1lLFxuICAgICAgICB9KTtcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byByZW5hbWUgcGFnZTogJHtTdHJpbmcoZXJyb3IpfWApXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDjg5rjg7zjgrjjgavmt7vku5jjgZXjgozjgZ/jg5XjgqHjgqTjg6vkuIDopqfjgpLlj5blvpfjgZnjgotcbiAgICovXG4gIGdldEZpbGVzKCk6IFdpa2lkb3RSZXN1bHRBc3luYzxQYWdlRmlsZUNvbGxlY3Rpb24+IHtcbiAgICByZXR1cm4gUGFnZUZpbGVDb2xsZWN0aW9uLmFjcXVpcmUodGhpcyk7XG4gIH1cblxuICAvKipcbiAgICog44Oa44O844K444Gu44OH44Kj44K544Kr44OD44K344On44Oz44K544Os44OD44OJ44KS5Y+W5b6X44GZ44KLXG4gICAqL1xuICBnZXREaXNjdXNzaW9uKCk6IFdpa2lkb3RSZXN1bHRBc3luYzxpbXBvcnQoJy4uL2ZvcnVtJykuRm9ydW1UaHJlYWQgfCBudWxsPiB7XG4gICAgY29uc3QgaWRDaGVjayA9IHRoaXMucmVxdWlyZUlkKCdnZXR0aW5nIGRpc2N1c3Npb24nKTtcbiAgICBpZiAoIWlkQ2hlY2sub2spIHJldHVybiBpZENoZWNrLmVycm9yO1xuXG4gICAgY29uc3QgcGFnZUlkID0gaWRDaGVjay5pZDtcblxuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc2l0ZS5hbWNSZXF1ZXN0KFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBtb2R1bGVOYW1lOiAnZm9ydW0vRm9ydW1Db21tZW50c0xpc3RNb2R1bGUnLFxuICAgICAgICAgICAgcGFnZUlkLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pO1xuXG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gcmVzdWx0LnZhbHVlWzBdO1xuICAgICAgICBpZiAoIXJlc3BvbnNlKSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBodG1sID0gU3RyaW5nKHJlc3BvbnNlLmJvZHkgPz8gJycpO1xuICAgICAgICAvLyDjgrnjg6zjg4Pjg4lJROOCkuaKveWHulxuICAgICAgICBjb25zdCBtYXRjaCA9IGh0bWwubWF0Y2goXG4gICAgICAgICAgL1dJS0lET1RcXC5tb2R1bGVzXFwuRm9ydW1WaWV3VGhyZWFkTW9kdWxlXFwudmFyc1xcLnRocmVhZElkXFxzKj1cXHMqKFxcZCspL1xuICAgICAgICApO1xuICAgICAgICBpZiAoIW1hdGNoPy5bMV0pIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRocmVhZElkID0gTnVtYmVyLnBhcnNlSW50KG1hdGNoWzFdLCAxMCk7XG5cbiAgICAgICAgLy8gRm9ydW1UaHJlYWTjgpLlj5blvpdcbiAgICAgICAgY29uc3QgeyBGb3J1bVRocmVhZCB9ID0gYXdhaXQgaW1wb3J0KCcuLi9mb3J1bScpO1xuICAgICAgICBjb25zdCB0aHJlYWRSZXN1bHQgPSBhd2FpdCBGb3J1bVRocmVhZC5nZXRGcm9tSWQodGhpcy5zaXRlLCB0aHJlYWRJZCk7XG4gICAgICAgIGlmICh0aHJlYWRSZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHRocmVhZFJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhyZWFkUmVzdWx0LnZhbHVlO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGdldCBkaXNjdXNzaW9uOiAke1N0cmluZyhlcnJvcil9YClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIOODmuODvOOCuOOBruODoeOCv+OCv+OCsOS4gOimp+OCkuWPluW+l+OBmeOCi1xuICAgKiBAcmV0dXJucyDjg6Hjgr/jgr/jgrDjgrPjg6zjgq/jgrfjg6fjg7NcbiAgICovXG4gIGdldE1ldGFzKCk6IFdpa2lkb3RSZXN1bHRBc3luYzxQYWdlTWV0YUNvbGxlY3Rpb24+IHtcbiAgICBjb25zdCBpZENoZWNrID0gdGhpcy5yZXF1aXJlSWQoJ2dldHRpbmcgbWV0YXMnKTtcbiAgICBpZiAoIWlkQ2hlY2sub2spIHtcbiAgICAgIHJldHVybiBpZENoZWNrLmVycm9yO1xuICAgIH1cblxuICAgIHJldHVybiBQYWdlTWV0YUNvbGxlY3Rpb24uYWNxdWlyZSh0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDjg6Hjgr/jgr/jgrDjgpLoqK3lrprjgZnjgotcbiAgICogQHBhcmFtIG5hbWUgLSDjg6Hjgr/jgr/jgrDlkI1cbiAgICogQHBhcmFtIGNvbnRlbnQgLSDjg6Hjgr/jgr/jgrDjga7lgKRcbiAgICovXG4gIHNldE1ldGEobmFtZTogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcpOiBXaWtpZG90UmVzdWx0QXN5bmM8dm9pZD4ge1xuICAgIGNvbnN0IGlkQ2hlY2sgPSB0aGlzLnJlcXVpcmVJZCgnc2V0dGluZyBtZXRhJyk7XG4gICAgaWYgKCFpZENoZWNrLm9rKSB7XG4gICAgICByZXR1cm4gaWRDaGVjay5lcnJvcjtcbiAgICB9XG5cbiAgICByZXR1cm4gUGFnZU1ldGFDb2xsZWN0aW9uLnNldE1ldGEodGhpcywgbmFtZSwgY29udGVudCk7XG4gIH1cblxuICAvKipcbiAgICog44Oh44K/44K/44Kw44KS5YmK6Zmk44GZ44KLXG4gICAqIEBwYXJhbSBuYW1lIC0g44Oh44K/44K/44Kw5ZCNXG4gICAqL1xuICBkZWxldGVNZXRhKG5hbWU6IHN0cmluZyk6IFdpa2lkb3RSZXN1bHRBc3luYzx2b2lkPiB7XG4gICAgY29uc3QgaWRDaGVjayA9IHRoaXMucmVxdWlyZUlkKCdkZWxldGluZyBtZXRhJyk7XG4gICAgaWYgKCFpZENoZWNrLm9rKSB7XG4gICAgICByZXR1cm4gaWRDaGVjay5lcnJvcjtcbiAgICB9XG5cbiAgICByZXR1cm4gUGFnZU1ldGFDb2xsZWN0aW9uLmRlbGV0ZU1ldGEodGhpcywgbmFtZSk7XG4gIH1cblxuICB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiBgUGFnZShmdWxsbmFtZT0ke3RoaXMuZnVsbG5hbWV9LCB0aXRsZT0ke3RoaXMudGl0bGV9KWA7XG4gIH1cbn1cblxuLyoqXG4gKiDjg5rjg7zjgrjjgrPjg6zjgq/jgrfjg6fjg7NcbiAqL1xuZXhwb3J0IGNsYXNzIFBhZ2VDb2xsZWN0aW9uIGV4dGVuZHMgQXJyYXk8UGFnZT4ge1xuICBwdWJsaWMgcmVhZG9ubHkgc2l0ZTogU2l0ZTtcblxuICBjb25zdHJ1Y3RvcihzaXRlOiBTaXRlLCBwYWdlcz86IFBhZ2VbXSkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5zaXRlID0gc2l0ZTtcbiAgICBpZiAocGFnZXMpIHtcbiAgICAgIHRoaXMucHVzaCguLi5wYWdlcyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOODleODq+ODjeODvOODoOOBp+aknOe0olxuICAgKiBAcGFyYW0gZnVsbG5hbWUgLSDjg5rjg7zjgrjjga7jg5Xjg6vjg43jg7zjg6BcbiAgICogQHJldHVybnMg44Oa44O844K477yI5a2Y5Zyo44GX44Gq44GE5aC05ZCI44GvdW5kZWZpbmVk77yJXG4gICAqL1xuICBmaW5kQnlGdWxsbmFtZShmdWxsbmFtZTogc3RyaW5nKTogUGFnZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZmluZCgocGFnZSkgPT4gcGFnZS5mdWxsbmFtZSA9PT0gZnVsbG5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIOODmuODvOOCuElE44KS5LiA5ous5Y+W5b6XXG4gICAqL1xuICBnZXRQYWdlSWRzKCk6IFdpa2lkb3RSZXN1bHRBc3luYzxQYWdlQ29sbGVjdGlvbj4ge1xuICAgIHJldHVybiBQYWdlQ29sbGVjdGlvbi5hY3F1aXJlUGFnZUlkcyh0aGlzLnNpdGUsIHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIOODmuODvOOCuOOCveODvOOCueOCkuS4gOaLrOWPluW+l1xuICAgKi9cbiAgZ2V0UGFnZVNvdXJjZXMoKTogV2lraWRvdFJlc3VsdEFzeW5jPFBhZ2VDb2xsZWN0aW9uPiB7XG4gICAgcmV0dXJuIFBhZ2VDb2xsZWN0aW9uLmFjcXVpcmVQYWdlU291cmNlcyh0aGlzLnNpdGUsIHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIOODmuODvOOCuOODquODk+OCuOODp+ODs+OCkuS4gOaLrOWPluW+l1xuICAgKi9cbiAgZ2V0UGFnZVJldmlzaW9ucygpOiBXaWtpZG90UmVzdWx0QXN5bmM8UGFnZUNvbGxlY3Rpb24+IHtcbiAgICByZXR1cm4gUGFnZUNvbGxlY3Rpb24uYWNxdWlyZVBhZ2VSZXZpc2lvbnModGhpcy5zaXRlLCB0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDjg5rjg7zjgrjmipXnpajjgpLkuIDmi6zlj5blvpdcbiAgICovXG4gIGdldFBhZ2VWb3RlcygpOiBXaWtpZG90UmVzdWx0QXN5bmM8UGFnZUNvbGxlY3Rpb24+IHtcbiAgICByZXR1cm4gUGFnZUNvbGxlY3Rpb24uYWNxdWlyZVBhZ2VWb3Rlcyh0aGlzLnNpdGUsIHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIOODmuODvOOCuElE44KS5LiA5ous5Y+W5b6X44GZ44KL5YaF6YOo44Oh44K944OD44OJXG4gICAqL1xuICBzdGF0aWMgYWNxdWlyZVBhZ2VJZHMoc2l0ZTogU2l0ZSwgcGFnZXM6IFBhZ2VbXSk6IFdpa2lkb3RSZXN1bHRBc3luYzxQYWdlQ29sbGVjdGlvbj4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHRhcmdldFBhZ2VzID0gcGFnZXMuZmlsdGVyKChwYWdlKSA9PiAhcGFnZS5pc0lkQWNxdWlyZWQoKSk7XG5cbiAgICAgICAgaWYgKHRhcmdldFBhZ2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHJldHVybiBuZXcgUGFnZUNvbGxlY3Rpb24oc2l0ZSwgcGFnZXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8g5ZCM5pmC5o6l57aa5pWw44KS5Yi26ZmQ77yIQU1DQ2xpZW5044Go5ZCM44GYc2VtYXBob3JlTGltaXTjgpLkvb/nlKjvvIlcbiAgICAgICAgY29uc3QgbGltaXQgPSBwTGltaXQoc2l0ZS5jbGllbnQuYW1jQ2xpZW50LmNvbmZpZy5zZW1hcGhvcmVMaW1pdCk7XG5cbiAgICAgICAgLy8gbm9yZW5kZXIsIG5vcmVkaXJlY3TjgafjgqLjgq/jgrvjgrlcbiAgICAgICAgY29uc3QgcmVzcG9uc2VzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgdGFyZ2V0UGFnZXMubWFwKChwYWdlKSA9PlxuICAgICAgICAgICAgbGltaXQoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCB1cmwgPSBgJHtwYWdlLmdldFVybCgpfS9ub3JlbmRlci90cnVlL25vcmVkaXJlY3QvdHJ1ZWA7XG4gICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7XG4gICAgICAgICAgICAgICAgaGVhZGVyczogc2l0ZS5jbGllbnQuYW1jQ2xpZW50LmhlYWRlci5nZXRIZWFkZXJzKCksXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICByZXR1cm4geyBwYWdlLCByZXNwb25zZSB9O1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICApXG4gICAgICAgICk7XG5cbiAgICAgICAgZm9yIChjb25zdCB7IHBhZ2UsIHJlc3BvbnNlIH0gb2YgcmVzcG9uc2VzKSB7XG4gICAgICAgICAgY29uc3QgdGV4dCA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKTtcbiAgICAgICAgICBjb25zdCBtYXRjaCA9IHRleHQubWF0Y2goL1dJS0lSRVFVRVNUXFwuaW5mb1xcLnBhZ2VJZFxccyo9XFxzKihcXGQrKTsvKTtcbiAgICAgICAgICBpZiAoIW1hdGNoPy5bMV0pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBOb0VsZW1lbnRFcnJvcihgQ2Fubm90IGZpbmQgcGFnZSBpZDogJHtwYWdlLmZ1bGxuYW1lfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBwYWdlLmlkID0gTnVtYmVyLnBhcnNlSW50KG1hdGNoWzFdLCAxMCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3IFBhZ2VDb2xsZWN0aW9uKHNpdGUsIHBhZ2VzKTtcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgTm9FbGVtZW50RXJyb3IpIHJldHVybiBlcnJvcjtcbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBhY3F1aXJlIHBhZ2UgSURzOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDjg5rjg7zjgrjjgr3jg7zjgrnjgpLkuIDmi6zlj5blvpfjgZnjgovlhoXpg6jjg6Hjgr3jg4Pjg4lcbiAgICovXG4gIHN0YXRpYyBhY3F1aXJlUGFnZVNvdXJjZXMoc2l0ZTogU2l0ZSwgcGFnZXM6IFBhZ2VbXSk6IFdpa2lkb3RSZXN1bHRBc3luYzxQYWdlQ29sbGVjdGlvbj4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHRhcmdldFBhZ2VzID0gcGFnZXMuZmlsdGVyKChwYWdlKSA9PiBwYWdlLnNvdXJjZSA9PT0gbnVsbCAmJiBwYWdlLmlkICE9PSBudWxsKTtcblxuICAgICAgICBpZiAodGFyZ2V0UGFnZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBQYWdlQ29sbGVjdGlvbihzaXRlLCBwYWdlcyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzaXRlLmFtY1JlcXVlc3QoXG4gICAgICAgICAgdGFyZ2V0UGFnZXMubWFwKChwYWdlKSA9PiAoe1xuICAgICAgICAgICAgbW9kdWxlTmFtZTogJ3ZpZXdzb3VyY2UvVmlld1NvdXJjZU1vZHVsZScsXG4gICAgICAgICAgICBwYWdlX2lkOiBwYWdlLmlkLFxuICAgICAgICAgIH0pKVxuICAgICAgICApO1xuXG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGFyZ2V0UGFnZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBwYWdlID0gdGFyZ2V0UGFnZXNbaV07XG4gICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSByZXN1bHQudmFsdWVbaV07XG4gICAgICAgICAgaWYgKCFwYWdlIHx8ICFyZXNwb25zZSkgY29udGludWU7XG4gICAgICAgICAgY29uc3QgYm9keSA9IFN0cmluZyhyZXNwb25zZS5ib2R5ID8/ICcnKS5yZXBsYWNlKC8mbmJzcDsvZywgJyAnKTtcbiAgICAgICAgICBjb25zdCAkID0gY2hlZXJpby5sb2FkKGJvZHkpO1xuICAgICAgICAgIGNvbnN0IHNvdXJjZUVsZW1lbnQgPSAkKCdkaXYucGFnZS1zb3VyY2UnKTtcbiAgICAgICAgICBpZiAoc291cmNlRWxlbWVudC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBOb0VsZW1lbnRFcnJvcihgQ2Fubm90IGZpbmQgc291cmNlIGVsZW1lbnQgZm9yIHBhZ2U6ICR7cGFnZS5mdWxsbmFtZX1gKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3Qgd2lraVRleHQgPSBzb3VyY2VFbGVtZW50LnRleHQoKS50cmltKCkucmVwbGFjZSgvXlxcdC8sICcnKTtcbiAgICAgICAgICBwYWdlLnNvdXJjZSA9IG5ldyBQYWdlU291cmNlKHsgcGFnZSwgd2lraVRleHQgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3IFBhZ2VDb2xsZWN0aW9uKHNpdGUsIHBhZ2VzKTtcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgTm9FbGVtZW50RXJyb3IpIHJldHVybiBlcnJvcjtcbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBhY3F1aXJlIHBhZ2Ugc291cmNlczogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICog44Oa44O844K444Oq44OT44K444On44Oz44KS5LiA5ous5Y+W5b6X44GZ44KL5YaF6YOo44Oh44K944OD44OJXG4gICAqL1xuICBzdGF0aWMgYWNxdWlyZVBhZ2VSZXZpc2lvbnMoc2l0ZTogU2l0ZSwgcGFnZXM6IFBhZ2VbXSk6IFdpa2lkb3RSZXN1bHRBc3luYzxQYWdlQ29sbGVjdGlvbj4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHRhcmdldFBhZ2VzID0gcGFnZXMuZmlsdGVyKChwYWdlKSA9PiBwYWdlLnJldmlzaW9ucyA9PT0gbnVsbCAmJiBwYWdlLmlkICE9PSBudWxsKTtcblxuICAgICAgICBpZiAodGFyZ2V0UGFnZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBQYWdlQ29sbGVjdGlvbihzaXRlLCBwYWdlcyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzaXRlLmFtY1JlcXVlc3QoXG4gICAgICAgICAgdGFyZ2V0UGFnZXMubWFwKChwYWdlKSA9PiAoe1xuICAgICAgICAgICAgbW9kdWxlTmFtZTogJ2hpc3RvcnkvUGFnZVJldmlzaW9uTGlzdE1vZHVsZScsXG4gICAgICAgICAgICBwYWdlX2lkOiBwYWdlLmlkLFxuICAgICAgICAgICAgb3B0aW9uczogeyBhbGw6IHRydWUgfSxcbiAgICAgICAgICAgIHBlcnBhZ2U6IDEwMDAwMDAwMCxcbiAgICAgICAgICB9KSlcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICAvLyDjg6rjg5Pjgrjjg6fjg7PjgpLjg5Hjg7zjgrlcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0YXJnZXRQYWdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IHBhZ2UgPSB0YXJnZXRQYWdlc1tpXTtcbiAgICAgICAgICBjb25zdCByZXNwb25zZSA9IHJlc3VsdC52YWx1ZVtpXTtcbiAgICAgICAgICBpZiAoIXBhZ2UgfHwgIXJlc3BvbnNlKSBjb250aW51ZTtcblxuICAgICAgICAgIGNvbnN0IGJvZHkgPSBTdHJpbmcocmVzcG9uc2UuYm9keSA/PyAnJyk7XG4gICAgICAgICAgY29uc3QgJCA9IGNoZWVyaW8ubG9hZChib2R5KTtcbiAgICAgICAgICBjb25zdCByZXZpc2lvbnM6IFBhZ2VSZXZpc2lvbltdID0gW107XG5cbiAgICAgICAgICAkKCd0YWJsZS5wYWdlLWhpc3RvcnkgPiB0cltpZF49cmV2aXNpb24tcm93LV0nKS5lYWNoKChfaiwgcmV2RWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgJHJldiA9ICQocmV2RWxlbWVudCk7XG4gICAgICAgICAgICBjb25zdCByZXZJZEF0dHIgPSAkcmV2LmF0dHIoJ2lkJyk7XG4gICAgICAgICAgICBpZiAoIXJldklkQXR0cikgcmV0dXJuO1xuXG4gICAgICAgICAgICBjb25zdCByZXZJZCA9IE51bWJlci5wYXJzZUludChyZXZJZEF0dHIucmVwbGFjZSgncmV2aXNpb24tcm93LScsICcnKSwgMTApO1xuICAgICAgICAgICAgaWYgKE51bWJlci5pc05hTihyZXZJZCkpIHJldHVybjtcblxuICAgICAgICAgICAgY29uc3QgJHRkcyA9ICRyZXYuZmluZCgndGQnKTtcbiAgICAgICAgICAgIGlmICgkdGRzLmxlbmd0aCA8IDcpIHJldHVybjtcblxuICAgICAgICAgICAgY29uc3QgcmV2Tm9UZXh0ID0gJHRkcy5lcSgwKS50ZXh0KCkudHJpbSgpLnJlcGxhY2UoL1xcLiQvLCAnJyk7XG4gICAgICAgICAgICBjb25zdCByZXZObyA9IE51bWJlci5wYXJzZUludChyZXZOb1RleHQsIDEwKTtcbiAgICAgICAgICAgIGlmIChOdW1iZXIuaXNOYU4ocmV2Tm8pKSByZXR1cm47XG5cbiAgICAgICAgICAgIGNvbnN0ICRjcmVhdGVkQnlFbGVtID0gJHRkcy5lcSg0KS5maW5kKCdzcGFuLnByaW50dXNlcicpO1xuICAgICAgICAgICAgaWYgKCRjcmVhdGVkQnlFbGVtLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgICAgICAgICAgY29uc3QgY3JlYXRlZEJ5ID0gcGFyc2VVc2VyKHNpdGUuY2xpZW50LCAkY3JlYXRlZEJ5RWxlbSBhcyBDaGVlcmlvPEFueU5vZGU+KTtcblxuICAgICAgICAgICAgY29uc3QgJGNyZWF0ZWRBdEVsZW0gPSAkdGRzLmVxKDUpLmZpbmQoJ3NwYW4ub2RhdGUnKTtcbiAgICAgICAgICAgIGlmICgkY3JlYXRlZEF0RWxlbS5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICAgICAgICAgIGNvbnN0IGNyZWF0ZWRBdCA9IHBhcnNlT2RhdGUoJGNyZWF0ZWRBdEVsZW0gYXMgQ2hlZXJpbzxBbnlOb2RlPikgPz8gbmV3IERhdGUoKTtcblxuICAgICAgICAgICAgY29uc3QgY29tbWVudCA9ICR0ZHMuZXEoNikudGV4dCgpLnRyaW0oKTtcblxuICAgICAgICAgICAgcmV2aXNpb25zLnB1c2goXG4gICAgICAgICAgICAgIG5ldyBQYWdlUmV2aXNpb24oe1xuICAgICAgICAgICAgICAgIHBhZ2UsXG4gICAgICAgICAgICAgICAgaWQ6IHJldklkLFxuICAgICAgICAgICAgICAgIHJldk5vLFxuICAgICAgICAgICAgICAgIGNyZWF0ZWRCeSxcbiAgICAgICAgICAgICAgICBjcmVhdGVkQXQsXG4gICAgICAgICAgICAgICAgY29tbWVudCxcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBwYWdlLnJldmlzaW9ucyA9IG5ldyBQYWdlUmV2aXNpb25Db2xsZWN0aW9uKHBhZ2UsIHJldmlzaW9ucyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3IFBhZ2VDb2xsZWN0aW9uKHNpdGUsIHBhZ2VzKTtcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBhY3F1aXJlIHBhZ2UgcmV2aXNpb25zOiAke1N0cmluZyhlcnJvcil9YClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIOODmuODvOOCuOaKleelqOOCkuS4gOaLrOWPluW+l+OBmeOCi+WGhemDqOODoeOCveODg+ODiVxuICAgKi9cbiAgc3RhdGljIGFjcXVpcmVQYWdlVm90ZXMoc2l0ZTogU2l0ZSwgcGFnZXM6IFBhZ2VbXSk6IFdpa2lkb3RSZXN1bHRBc3luYzxQYWdlQ29sbGVjdGlvbj4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHRhcmdldFBhZ2VzID0gcGFnZXMuZmlsdGVyKChwYWdlKSA9PiBwYWdlLnZvdGVzID09PSBudWxsICYmIHBhZ2UuaWQgIT09IG51bGwpO1xuXG4gICAgICAgIGlmICh0YXJnZXRQYWdlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gbmV3IFBhZ2VDb2xsZWN0aW9uKHNpdGUsIHBhZ2VzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNpdGUuYW1jUmVxdWVzdChcbiAgICAgICAgICB0YXJnZXRQYWdlcy5tYXAoKHBhZ2UpID0+ICh7XG4gICAgICAgICAgICBtb2R1bGVOYW1lOiAncGFnZXJhdGUvV2hvUmF0ZWRQYWdlTW9kdWxlJyxcbiAgICAgICAgICAgIHBhZ2VJZDogcGFnZS5pZCxcbiAgICAgICAgICB9KSlcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICAvLyDmipXnpajjgpLjg5Hjg7zjgrlcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0YXJnZXRQYWdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IHBhZ2UgPSB0YXJnZXRQYWdlc1tpXTtcbiAgICAgICAgICBjb25zdCByZXNwb25zZSA9IHJlc3VsdC52YWx1ZVtpXTtcbiAgICAgICAgICBpZiAoIXBhZ2UgfHwgIXJlc3BvbnNlKSBjb250aW51ZTtcblxuICAgICAgICAgIGNvbnN0IGJvZHkgPSBTdHJpbmcocmVzcG9uc2UuYm9keSA/PyAnJyk7XG4gICAgICAgICAgY29uc3QgJCA9IGNoZWVyaW8ubG9hZChib2R5KTtcblxuICAgICAgICAgIGNvbnN0ICR1c2VyRWxlbXMgPSAkKCdzcGFuLnByaW50dXNlcicpO1xuICAgICAgICAgIGNvbnN0ICR2YWx1ZUVsZW1zID0gJChcInNwYW5bc3R5bGVePSdjb2xvciddXCIpO1xuXG4gICAgICAgICAgaWYgKCR1c2VyRWxlbXMubGVuZ3RoICE9PSAkdmFsdWVFbGVtcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkRXJyb3IoJ1VzZXIgYW5kIHZhbHVlIGNvdW50IG1pc21hdGNoIGluIHZvdGVzJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3Qgdm90ZXM6IFBhZ2VWb3RlW10gPSBbXTtcbiAgICAgICAgICAkdXNlckVsZW1zLmVhY2goKGosIHVzZXJFbGVtKSA9PiB7XG4gICAgICAgICAgICBjb25zdCAkdXNlciA9ICQodXNlckVsZW0pO1xuICAgICAgICAgICAgY29uc3QgJHZhbHVlID0gJHZhbHVlRWxlbXMuZXEoaik7XG5cbiAgICAgICAgICAgIGNvbnN0IHVzZXIgPSBwYXJzZVVzZXIoc2l0ZS5jbGllbnQsICR1c2VyIGFzIENoZWVyaW88QW55Tm9kZT4pO1xuICAgICAgICAgICAgY29uc3QgdmFsdWVUZXh0ID0gJHZhbHVlLnRleHQoKS50cmltKCk7XG5cbiAgICAgICAgICAgIGxldCB2YWx1ZTogbnVtYmVyO1xuICAgICAgICAgICAgaWYgKHZhbHVlVGV4dCA9PT0gJysnKSB7XG4gICAgICAgICAgICAgIHZhbHVlID0gMTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWVUZXh0ID09PSAnLScpIHtcbiAgICAgICAgICAgICAgdmFsdWUgPSAtMTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHZhbHVlID0gTnVtYmVyLnBhcnNlSW50KHZhbHVlVGV4dCwgMTApIHx8IDA7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZvdGVzLnB1c2gobmV3IFBhZ2VWb3RlKHsgcGFnZSwgdXNlciwgdmFsdWUgfSkpO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgcGFnZS52b3RlcyA9IG5ldyBQYWdlVm90ZUNvbGxlY3Rpb24ocGFnZSwgdm90ZXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBQYWdlQ29sbGVjdGlvbihzaXRlLCBwYWdlcyk7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gYWNxdWlyZSBwYWdlIHZvdGVzOiAke1N0cmluZyhlcnJvcil9YClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIExpc3RQYWdlc01vZHVsZeODrOOCueODneODs+OCueOCkuODkeODvOOCuVxuICAgKi9cbiAgc3RhdGljIHBhcnNlKFxuICAgIHNpdGU6IFNpdGUsXG4gICAgaHRtbEJvZHk6IGNoZWVyaW8uQ2hlZXJpb0FQSSxcbiAgICBfcGFyc2VVc2VyOiAoZWxlbWVudDogY2hlZXJpby5DaGVlcmlvPEFueU5vZGU+KSA9PiBBYnN0cmFjdFVzZXJcbiAgKTogUGFnZUNvbGxlY3Rpb24ge1xuICAgIGNvbnN0IHBhZ2VzOiBQYWdlW10gPSBbXTtcblxuICAgIGh0bWxCb2R5KCdkaXYucGFnZScpLmVhY2goKF9pLCBwYWdlRWxlbWVudCkgPT4ge1xuICAgICAgY29uc3QgJHBhZ2UgPSBodG1sQm9keShwYWdlRWxlbWVudCk7XG4gICAgICBjb25zdCBwYWdlUGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuXG4gICAgICAvLyA144Gk5pif44Os44O844OG44Kj44Oz44Kw5Yik5a6aXG4gICAgICBjb25zdCBpczVTdGFyUmF0aW5nID0gJHBhZ2UuZmluZCgnc3Bhbi5yYXRpbmcgc3Bhbi5wYWdlLXJhdGUtbGlzdC1wYWdlcy1zdGFydCcpLmxlbmd0aCA+IDA7XG5cbiAgICAgIC8vIOWQhOWApOOCkuWPluW+l1xuICAgICAgJHBhZ2UuZmluZCgnc3Bhbi5zZXQnKS5lYWNoKChfaiwgc2V0RWxlbWVudCkgPT4ge1xuICAgICAgICBjb25zdCAkc2V0ID0gaHRtbEJvZHkoc2V0RWxlbWVudCk7XG4gICAgICAgIGNvbnN0IGtleUVsZW1lbnQgPSAkc2V0LmZpbmQoJ3NwYW4ubmFtZScpO1xuICAgICAgICBpZiAoa2V5RWxlbWVudC5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgICAgICBsZXQga2V5ID0ga2V5RWxlbWVudC50ZXh0KCkudHJpbSgpO1xuICAgICAgICBjb25zdCB2YWx1ZUVsZW1lbnQgPSAkc2V0LmZpbmQoJ3NwYW4udmFsdWUnKTtcblxuICAgICAgICBsZXQgdmFsdWU6IHVua25vd24gPSBudWxsO1xuXG4gICAgICAgIGlmICh2YWx1ZUVsZW1lbnQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgdmFsdWUgPSBudWxsO1xuICAgICAgICB9IGVsc2UgaWYgKFsnY3JlYXRlZF9hdCcsICd1cGRhdGVkX2F0JywgJ2NvbW1lbnRlZF9hdCddLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgICAgICBjb25zdCBvZGF0ZUVsZW1lbnQgPSB2YWx1ZUVsZW1lbnQuZmluZCgnc3Bhbi5vZGF0ZScpO1xuICAgICAgICAgIGlmIChvZGF0ZUVsZW1lbnQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgdGltZXN0YW1wID0gb2RhdGVFbGVtZW50LmF0dHIoJ2NsYXNzJyk/Lm1hdGNoKC90aW1lXyhcXGQrKS8pPy5bMV07XG4gICAgICAgICAgICB2YWx1ZSA9IHRpbWVzdGFtcCA/IG5ldyBEYXRlKE51bWJlci5wYXJzZUludCh0aW1lc3RhbXAsIDEwKSAqIDEwMDApIDogbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgWydjcmVhdGVkX2J5X2xpbmtlZCcsICd1cGRhdGVkX2J5X2xpbmtlZCcsICdjb21tZW50ZWRfYnlfbGlua2VkJ10uaW5jbHVkZXMoa2V5KVxuICAgICAgICApIHtcbiAgICAgICAgICBjb25zdCBwcmludHVzZXJFbGVtZW50ID0gdmFsdWVFbGVtZW50LmZpbmQoJ3NwYW4ucHJpbnR1c2VyJyk7XG4gICAgICAgICAgaWYgKHByaW50dXNlckVsZW1lbnQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdmFsdWUgPSBfcGFyc2VVc2VyKHByaW50dXNlckVsZW1lbnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChbJ3RhZ3MnLCAnX3RhZ3MnXS5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgICAgdmFsdWUgPSB2YWx1ZUVsZW1lbnQudGV4dCgpLnNwbGl0KC9cXHMrLykuZmlsdGVyKEJvb2xlYW4pO1xuICAgICAgICB9IGVsc2UgaWYgKFsncmF0aW5nX3ZvdGVzJywgJ2NvbW1lbnRzJywgJ3NpemUnLCAncmV2aXNpb25zJ10uaW5jbHVkZXMoa2V5KSkge1xuICAgICAgICAgIHZhbHVlID0gTnVtYmVyLnBhcnNlSW50KHZhbHVlRWxlbWVudC50ZXh0KCkudHJpbSgpLCAxMCkgfHwgMDtcbiAgICAgICAgfSBlbHNlIGlmIChrZXkgPT09ICdyYXRpbmcnKSB7XG4gICAgICAgICAgY29uc3QgcmF0aW5nVGV4dCA9IHZhbHVlRWxlbWVudC50ZXh0KCkudHJpbSgpO1xuICAgICAgICAgIHZhbHVlID0gaXM1U3RhclJhdGluZ1xuICAgICAgICAgICAgPyBOdW1iZXIucGFyc2VGbG9hdChyYXRpbmdUZXh0KSB8fCAwXG4gICAgICAgICAgICA6IE51bWJlci5wYXJzZUludChyYXRpbmdUZXh0LCAxMCkgfHwgMDtcbiAgICAgICAgfSBlbHNlIGlmIChrZXkgPT09ICdyYXRpbmdfcGVyY2VudCcpIHtcbiAgICAgICAgICBpZiAoaXM1U3RhclJhdGluZykge1xuICAgICAgICAgICAgdmFsdWUgPSAoTnVtYmVyLnBhcnNlRmxvYXQodmFsdWVFbGVtZW50LnRleHQoKS50cmltKCkpIHx8IDApIC8gMTAwO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YWx1ZSA9IG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhbHVlID0gdmFsdWVFbGVtZW50LnRleHQoKS50cmltKCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyDjgq3jg7zlpInmj5tcbiAgICAgICAgaWYgKGtleS5pbmNsdWRlcygnX2xpbmtlZCcpKSB7XG4gICAgICAgICAga2V5ID0ga2V5LnJlcGxhY2UoJ19saW5rZWQnLCAnJyk7XG4gICAgICAgIH0gZWxzZSBpZiAoWydjb21tZW50cycsICdjaGlsZHJlbicsICdyZXZpc2lvbnMnXS5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgICAga2V5ID0gYCR7a2V5fV9jb3VudGA7XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSAncmF0aW5nX3ZvdGVzJykge1xuICAgICAgICAgIGtleSA9ICd2b3Rlc19jb3VudCc7XG4gICAgICAgIH1cblxuICAgICAgICBwYWdlUGFyYW1zW2tleV0gPSB2YWx1ZTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyDjgr/jgrDntbHlkIhcbiAgICAgIGNvbnN0IHRhZ3MgPSBBcnJheS5pc0FycmF5KHBhZ2VQYXJhbXMudGFncykgPyBwYWdlUGFyYW1zLnRhZ3MgOiBbXTtcbiAgICAgIGNvbnN0IGhpZGRlblRhZ3MgPSBBcnJheS5pc0FycmF5KHBhZ2VQYXJhbXMuX3RhZ3MpID8gcGFnZVBhcmFtcy5fdGFncyA6IFtdO1xuICAgICAgcGFnZVBhcmFtcy50YWdzID0gWy4uLnRhZ3MsIC4uLmhpZGRlblRhZ3NdO1xuXG4gICAgICAvLyBab2Tjgrnjgq3jg7zjg57jgafmpJzoqLzjg7vjg4fjg5Xjgqnjg6vjg4jlgKTpgannlKhcbiAgICAgIGNvbnN0IHBhcnNlZCA9IHBhZ2VQYXJhbXNTY2hlbWEucGFyc2UocGFnZVBhcmFtcyk7XG5cbiAgICAgIC8vIFBhZ2Xjgqrjg5bjgrjjgqfjgq/jg4jkvZzmiJBcbiAgICAgIHBhZ2VzLnB1c2goXG4gICAgICAgIG5ldyBQYWdlKHtcbiAgICAgICAgICBzaXRlLFxuICAgICAgICAgIGZ1bGxuYW1lOiBwYXJzZWQuZnVsbG5hbWUsXG4gICAgICAgICAgbmFtZTogcGFyc2VkLm5hbWUsXG4gICAgICAgICAgY2F0ZWdvcnk6IHBhcnNlZC5jYXRlZ29yeSxcbiAgICAgICAgICB0aXRsZTogcGFyc2VkLnRpdGxlLFxuICAgICAgICAgIGNoaWxkcmVuQ291bnQ6IHBhcnNlZC5jaGlsZHJlbl9jb3VudCxcbiAgICAgICAgICBjb21tZW50c0NvdW50OiBwYXJzZWQuY29tbWVudHNfY291bnQsXG4gICAgICAgICAgc2l6ZTogcGFyc2VkLnNpemUsXG4gICAgICAgICAgcmF0aW5nOiBwYXJzZWQucmF0aW5nLFxuICAgICAgICAgIHZvdGVzQ291bnQ6IHBhcnNlZC52b3Rlc19jb3VudCxcbiAgICAgICAgICByYXRpbmdQZXJjZW50OiBwYXJzZWQucmF0aW5nX3BlcmNlbnQsXG4gICAgICAgICAgcmV2aXNpb25zQ291bnQ6IHBhcnNlZC5yZXZpc2lvbnNfY291bnQsXG4gICAgICAgICAgcGFyZW50RnVsbG5hbWU6IHBhcnNlZC5wYXJlbnRfZnVsbG5hbWUsXG4gICAgICAgICAgdGFnczogcGFyc2VkLnRhZ3MsXG4gICAgICAgICAgY3JlYXRlZEJ5OiBwYXJzZWQuY3JlYXRlZF9ieSxcbiAgICAgICAgICBjcmVhdGVkQXQ6IHBhcnNlZC5jcmVhdGVkX2F0ID8/IG5ldyBEYXRlKCksXG4gICAgICAgICAgdXBkYXRlZEJ5OiBwYXJzZWQudXBkYXRlZF9ieSxcbiAgICAgICAgICB1cGRhdGVkQXQ6IHBhcnNlZC51cGRhdGVkX2F0ID8/IG5ldyBEYXRlKCksXG4gICAgICAgICAgY29tbWVudGVkQnk6IHBhcnNlZC5jb21tZW50ZWRfYnksXG4gICAgICAgICAgY29tbWVudGVkQXQ6IHBhcnNlZC5jb21tZW50ZWRfYXQsXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIG5ldyBQYWdlQ29sbGVjdGlvbihzaXRlLCBwYWdlcyk7XG4gIH1cblxuICAvKipcbiAgICog44Oa44O844K45qSc57SiXG4gICAqL1xuICBzdGF0aWMgc2VhcmNoUGFnZXMoXG4gICAgc2l0ZTogU2l0ZSxcbiAgICBwYXJzZVVzZXI6IChlbGVtZW50OiBjaGVlcmlvLkNoZWVyaW88QW55Tm9kZT4pID0+IEFic3RyYWN0VXNlcixcbiAgICBxdWVyeTogU2VhcmNoUGFnZXNRdWVyeSB8IG51bGwgPSBudWxsXG4gICk6IFdpa2lkb3RSZXN1bHRBc3luYzxQYWdlQ29sbGVjdGlvbj4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHEgPSBxdWVyeSA/PyBuZXcgU2VhcmNoUGFnZXNRdWVyeSgpO1xuICAgICAgICBjb25zdCBxdWVyeURpY3QgPSBxLmFzRGljdCgpO1xuXG4gICAgICAgIC8vIOODouOCuOODpeODvOODq+ODnOODh+OCo+eUn+aIkFxuICAgICAgICBjb25zdCBtb2R1bGVCb2R5ID0gYFtbZGl2IGNsYXNzPVwicGFnZVwiXV1cXG4ke0RFRkFVTFRfTU9EVUxFX0JPRFkubWFwKFxuICAgICAgICAgIChrZXkpID0+XG4gICAgICAgICAgICBgW1tzcGFuIGNsYXNzPVwic2V0ICR7a2V5fVwiXV1bW3NwYW4gY2xhc3M9XCJuYW1lXCJdXSAke2tleX0gW1svc3Bhbl1dW1tzcGFuIGNsYXNzPVwidmFsdWVcIl1dICUlJHtrZXl9JSUgW1svc3Bhbl1dW1svc3Bhbl1dYFxuICAgICAgICApLmpvaW4oJycpfVxcbltbL2Rpdl1dYDtcblxuICAgICAgICBjb25zdCByZXF1ZXN0Qm9keSA9IHtcbiAgICAgICAgICAuLi5xdWVyeURpY3QsXG4gICAgICAgICAgbW9kdWxlTmFtZTogJ2xpc3QvTGlzdFBhZ2VzTW9kdWxlJyxcbiAgICAgICAgICBtb2R1bGVfYm9keTogbW9kdWxlQm9keSxcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzaXRlLmFtY1JlcXVlc3QoW3JlcXVlc3RCb2R5XSk7XG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIGlmIChyZXN1bHQuZXJyb3IubWVzc2FnZS5pbmNsdWRlcygnbm90X29rJykpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBGb3JiaWRkZW5FcnJvcignRmFpbGVkIHRvIGdldCBwYWdlcywgdGFyZ2V0IHNpdGUgbWF5IGJlIHByaXZhdGUnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZmlyc3RSZXNwb25zZSA9IHJlc3VsdC52YWx1ZVswXTtcbiAgICAgICAgY29uc3QgYm9keSA9IFN0cmluZyhmaXJzdFJlc3BvbnNlPy5ib2R5ID8/ICcnKTtcbiAgICAgICAgY29uc3QgJGZpcnN0ID0gY2hlZXJpby5sb2FkKGJvZHkpO1xuXG4gICAgICAgIGxldCB0b3RhbCA9IDE7XG4gICAgICAgIGNvbnN0IGh0bWxCb2RpZXM6IGNoZWVyaW8uQ2hlZXJpb0FQSVtdID0gWyRmaXJzdF07XG5cbiAgICAgICAgLy8g44Oa44O844K444ON44O844K344On44Oz56K66KqNXG4gICAgICAgIGNvbnN0IHBhZ2VyRWxlbWVudCA9ICRmaXJzdCgnZGl2LnBhZ2VyJyk7XG4gICAgICAgIGlmIChwYWdlckVsZW1lbnQubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnN0IGxhc3RQYWdlckVsZW1lbnRzID0gJGZpcnN0KCdkaXYucGFnZXIgc3Bhbi50YXJnZXQnKTtcbiAgICAgICAgICBpZiAobGFzdFBhZ2VyRWxlbWVudHMubGVuZ3RoID49IDIpIHtcbiAgICAgICAgICAgIGNvbnN0IHNlY29uZExhc3RQYWdlciA9ICRmaXJzdChsYXN0UGFnZXJFbGVtZW50c1tsYXN0UGFnZXJFbGVtZW50cy5sZW5ndGggLSAyXSk7XG4gICAgICAgICAgICBjb25zdCBsYXN0UGFnZXJMaW5rID0gc2Vjb25kTGFzdFBhZ2VyLmZpbmQoJ2EnKTtcbiAgICAgICAgICAgIGlmIChsYXN0UGFnZXJMaW5rLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgdG90YWwgPSBOdW1iZXIucGFyc2VJbnQobGFzdFBhZ2VyTGluay50ZXh0KCkudHJpbSgpLCAxMCkgfHwgMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyDov73liqDjg5rjg7zjgrjlj5blvpdcbiAgICAgICAgaWYgKHRvdGFsID4gMSkge1xuICAgICAgICAgIGNvbnN0IGFkZGl0aW9uYWxCb2RpZXM6IEFNQ1JlcXVlc3RCb2R5W10gPSBbXTtcbiAgICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IHRvdGFsOyBpKyspIHtcbiAgICAgICAgICAgIGFkZGl0aW9uYWxCb2RpZXMucHVzaCh7XG4gICAgICAgICAgICAgIC4uLnF1ZXJ5RGljdCxcbiAgICAgICAgICAgICAgbW9kdWxlTmFtZTogJ2xpc3QvTGlzdFBhZ2VzTW9kdWxlJyxcbiAgICAgICAgICAgICAgbW9kdWxlX2JvZHk6IG1vZHVsZUJvZHksXG4gICAgICAgICAgICAgIG9mZnNldDogaSAqIChxLnBlclBhZ2UgPz8gREVGQVVMVF9QRVJfUEFHRSksXG4gICAgICAgICAgICB9IGFzIEFNQ1JlcXVlc3RCb2R5KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBhZGRpdGlvbmFsUmVzdWx0cyA9IGF3YWl0IHNpdGUuYW1jUmVxdWVzdChhZGRpdGlvbmFsQm9kaWVzKTtcbiAgICAgICAgICBpZiAoYWRkaXRpb25hbFJlc3VsdHMuaXNFcnIoKSkge1xuICAgICAgICAgICAgdGhyb3cgYWRkaXRpb25hbFJlc3VsdHMuZXJyb3I7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZm9yIChjb25zdCByZXNwb25zZSBvZiBhZGRpdGlvbmFsUmVzdWx0cy52YWx1ZSkge1xuICAgICAgICAgICAgY29uc3QgcmVzcEJvZHkgPSBTdHJpbmcocmVzcG9uc2U/LmJvZHkgPz8gJycpO1xuICAgICAgICAgICAgaHRtbEJvZGllcy5wdXNoKGNoZWVyaW8ubG9hZChyZXNwQm9keSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIOODkeODvOOCuVxuICAgICAgICBjb25zdCBwYWdlczogUGFnZVtdID0gW107XG4gICAgICAgIGZvciAoY29uc3QgJGh0bWwgb2YgaHRtbEJvZGllcykge1xuICAgICAgICAgIGNvbnN0IHBhcnNlZCA9IFBhZ2VDb2xsZWN0aW9uLnBhcnNlKHNpdGUsICRodG1sLCBwYXJzZVVzZXIpO1xuICAgICAgICAgIHBhZ2VzLnB1c2goLi4ucGFyc2VkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgUGFnZUNvbGxlY3Rpb24oc2l0ZSwgcGFnZXMpO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBGb3JiaWRkZW5FcnJvciB8fCBlcnJvciBpbnN0YW5jZW9mIE5vdEZvdW5kRXhjZXB0aW9uKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gc2VhcmNoIHBhZ2VzOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDjg5rjg7zjgrjjgpLkvZzmiJDjgb7jgZ/jga/nt6jpm4ZcbiAgICovXG4gIHN0YXRpYyBjcmVhdGVPckVkaXQoXG4gICAgc2l0ZTogU2l0ZSxcbiAgICBmdWxsbmFtZTogc3RyaW5nLFxuICAgIG9wdGlvbnM6IHtcbiAgICAgIHBhZ2VJZD86IG51bWJlciB8IG51bGw7XG4gICAgICB0aXRsZT86IHN0cmluZztcbiAgICAgIHNvdXJjZT86IHN0cmluZztcbiAgICAgIGNvbW1lbnQ/OiBzdHJpbmc7XG4gICAgICBmb3JjZUVkaXQ/OiBib29sZWFuO1xuICAgICAgcmFpc2VPbkV4aXN0cz86IGJvb2xlYW47XG4gICAgfSA9IHt9XG4gICk6IFdpa2lkb3RSZXN1bHRBc3luYzx2b2lkPiB7XG4gICAgY29uc3QgbG9naW5SZXN1bHQgPSBzaXRlLmNsaWVudC5yZXF1aXJlTG9naW4oKTtcbiAgICBpZiAobG9naW5SZXN1bHQuaXNFcnIoKSkge1xuICAgICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgICBQcm9taXNlLnJlamVjdChsb2dpblJlc3VsdC5lcnJvciksXG4gICAgICAgICgpID0+IG5ldyBMb2dpblJlcXVpcmVkRXJyb3IoJ0xvZ2luIHJlcXVpcmVkIHRvIGNyZWF0ZS9lZGl0IHBhZ2UnKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgcGFnZUlkID0gbnVsbCxcbiAgICAgICAgICB0aXRsZSA9ICcnLFxuICAgICAgICAgIHNvdXJjZSA9ICcnLFxuICAgICAgICAgIGNvbW1lbnQgPSAnJyxcbiAgICAgICAgICBmb3JjZUVkaXQgPSBmYWxzZSxcbiAgICAgICAgICByYWlzZU9uRXhpc3RzID0gZmFsc2UsXG4gICAgICAgIH0gPSBvcHRpb25zO1xuXG4gICAgICAgIC8vIOODmuODvOOCuOODreODg+OCr+WPluW+l1xuICAgICAgICBjb25zdCBsb2NrUmVxdWVzdEJvZHk6IEFNQ1JlcXVlc3RCb2R5ID0ge1xuICAgICAgICAgIG1vZGU6ICdwYWdlJyxcbiAgICAgICAgICB3aWtpX3BhZ2U6IGZ1bGxuYW1lLFxuICAgICAgICAgIG1vZHVsZU5hbWU6ICdlZGl0L1BhZ2VFZGl0TW9kdWxlJyxcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKGZvcmNlRWRpdCkge1xuICAgICAgICAgIGxvY2tSZXF1ZXN0Qm9keS5mb3JjZV9sb2NrID0gJ3llcyc7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBsb2NrUmVzdWx0ID0gYXdhaXQgc2l0ZS5hbWNSZXF1ZXN0KFtsb2NrUmVxdWVzdEJvZHldKTtcbiAgICAgICAgaWYgKGxvY2tSZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IGxvY2tSZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBsb2NrUmVzcG9uc2UgPSBsb2NrUmVzdWx0LnZhbHVlWzBdO1xuICAgICAgICBpZiAobG9ja1Jlc3BvbnNlPy5sb2NrZWQgfHwgbG9ja1Jlc3BvbnNlPy5vdGhlcl9sb2Nrcykge1xuICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkRXJyb3IoYFBhZ2UgJHtmdWxsbmFtZX0gaXMgbG9ja2VkIG9yIG90aGVyIGxvY2tzIGV4aXN0YCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpc0V4aXN0ID0gJ3BhZ2VfcmV2aXNpb25faWQnIGluIChsb2NrUmVzcG9uc2UgPz8ge30pO1xuXG4gICAgICAgIGlmIChyYWlzZU9uRXhpc3RzICYmIGlzRXhpc3QpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVGFyZ2V0RXhpc3RzRXJyb3IoYFBhZ2UgJHtmdWxsbmFtZX0gYWxyZWFkeSBleGlzdHNgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc0V4aXN0ICYmIHBhZ2VJZCA9PT0gbnVsbCkge1xuICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkRXJyb3IoJ3BhZ2VfaWQgbXVzdCBiZSBzcGVjaWZpZWQgd2hlbiBlZGl0aW5nIGV4aXN0aW5nIHBhZ2UnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGxvY2tJZCA9IFN0cmluZyhsb2NrUmVzcG9uc2U/LmxvY2tfaWQgPz8gJycpO1xuICAgICAgICBjb25zdCBsb2NrU2VjcmV0ID0gU3RyaW5nKGxvY2tSZXNwb25zZT8ubG9ja19zZWNyZXQgPz8gJycpO1xuICAgICAgICBjb25zdCBwYWdlUmV2aXNpb25JZCA9IFN0cmluZyhsb2NrUmVzcG9uc2U/LnBhZ2VfcmV2aXNpb25faWQgPz8gJycpO1xuXG4gICAgICAgIC8vIOODmuODvOOCuOS/neWtmFxuICAgICAgICBjb25zdCBlZGl0UmVxdWVzdEJvZHk6IEFNQ1JlcXVlc3RCb2R5ID0ge1xuICAgICAgICAgIGFjdGlvbjogJ1dpa2lQYWdlQWN0aW9uJyxcbiAgICAgICAgICBldmVudDogJ3NhdmVQYWdlJyxcbiAgICAgICAgICBtb2R1bGVOYW1lOiAnRW1wdHknLFxuICAgICAgICAgIG1vZGU6ICdwYWdlJyxcbiAgICAgICAgICBsb2NrX2lkOiBsb2NrSWQsXG4gICAgICAgICAgbG9ja19zZWNyZXQ6IGxvY2tTZWNyZXQsXG4gICAgICAgICAgcmV2aXNpb25faWQ6IHBhZ2VSZXZpc2lvbklkLFxuICAgICAgICAgIHdpa2lfcGFnZTogZnVsbG5hbWUsXG4gICAgICAgICAgcGFnZV9pZDogcGFnZUlkID8/ICcnLFxuICAgICAgICAgIHRpdGxlLFxuICAgICAgICAgIHNvdXJjZSxcbiAgICAgICAgICBjb21tZW50czogY29tbWVudCxcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBlZGl0UmVzdWx0ID0gYXdhaXQgc2l0ZS5hbWNSZXF1ZXN0KFtlZGl0UmVxdWVzdEJvZHldKTtcbiAgICAgICAgaWYgKGVkaXRSZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IGVkaXRSZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgVGFyZ2V0RXhpc3RzRXJyb3IgfHwgZXJyb3IgaW5zdGFuY2VvZiBMb2dpblJlcXVpcmVkRXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBjcmVhdGUvZWRpdCBwYWdlOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgeyBTZWFyY2hQYWdlc1F1ZXJ5IH07XG4iLAogICAgImltcG9ydCAqIGFzIGNoZWVyaW8gZnJvbSAnY2hlZXJpbyc7XG5pbXBvcnQgeyBVbmV4cGVjdGVkRXJyb3IgfSBmcm9tICcuLi8uLi9jb21tb24vZXJyb3JzJztcbmltcG9ydCB7IGZyb21Qcm9taXNlLCB0eXBlIFdpa2lkb3RSZXN1bHRBc3luYyB9IGZyb20gJy4uLy4uL2NvbW1vbi90eXBlcyc7XG5pbXBvcnQgdHlwZSB7IFBhZ2UgfSBmcm9tICcuL3BhZ2UnO1xuXG4vKipcbiAqIOODmuODvOOCuOODleOCoeOCpOODq+ODh+ODvOOCv1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhZ2VGaWxlRGF0YSB7XG4gIHBhZ2U6IFBhZ2U7XG4gIGlkOiBudW1iZXI7XG4gIG5hbWU6IHN0cmluZztcbiAgdXJsOiBzdHJpbmc7XG4gIG1pbWVUeXBlOiBzdHJpbmc7XG4gIHNpemU6IG51bWJlcjtcbn1cblxuLyoqXG4gKiDjg5rjg7zjgrjmt7vku5jjg5XjgqHjgqTjg6tcbiAqL1xuZXhwb3J0IGNsYXNzIFBhZ2VGaWxlIHtcbiAgcHVibGljIHJlYWRvbmx5IHBhZ2U6IFBhZ2U7XG4gIHB1YmxpYyByZWFkb25seSBpZDogbnVtYmVyO1xuICBwdWJsaWMgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgdXJsOiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSBtaW1lVHlwZTogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgc2l6ZTogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKGRhdGE6IFBhZ2VGaWxlRGF0YSkge1xuICAgIHRoaXMucGFnZSA9IGRhdGEucGFnZTtcbiAgICB0aGlzLmlkID0gZGF0YS5pZDtcbiAgICB0aGlzLm5hbWUgPSBkYXRhLm5hbWU7XG4gICAgdGhpcy51cmwgPSBkYXRhLnVybDtcbiAgICB0aGlzLm1pbWVUeXBlID0gZGF0YS5taW1lVHlwZTtcbiAgICB0aGlzLnNpemUgPSBkYXRhLnNpemU7XG4gIH1cblxuICB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiBgUGFnZUZpbGUoaWQ9JHt0aGlzLmlkfSwgbmFtZT0ke3RoaXMubmFtZX0sIHNpemU9JHt0aGlzLnNpemV9KWA7XG4gIH1cbn1cblxuLyoqXG4gKiDjg5rjg7zjgrjjg5XjgqHjgqTjg6vjgrPjg6zjgq/jgrfjg6fjg7NcbiAqL1xuZXhwb3J0IGNsYXNzIFBhZ2VGaWxlQ29sbGVjdGlvbiBleHRlbmRzIEFycmF5PFBhZ2VGaWxlPiB7XG4gIHB1YmxpYyByZWFkb25seSBwYWdlOiBQYWdlO1xuXG4gIGNvbnN0cnVjdG9yKHBhZ2U6IFBhZ2UsIGZpbGVzPzogUGFnZUZpbGVbXSkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5wYWdlID0gcGFnZTtcbiAgICBpZiAoZmlsZXMpIHtcbiAgICAgIHRoaXMucHVzaCguLi5maWxlcyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIElE44Gn5qSc57SiXG4gICAqL1xuICBmaW5kQnlJZChpZDogbnVtYmVyKTogUGFnZUZpbGUgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmZpbmQoKGZpbGUpID0+IGZpbGUuaWQgPT09IGlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDlkI3liY3jgafmpJzntKJcbiAgICovXG4gIGZpbmRCeU5hbWUobmFtZTogc3RyaW5nKTogUGFnZUZpbGUgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmZpbmQoKGZpbGUpID0+IGZpbGUubmFtZSA9PT0gbmFtZSk7XG4gIH1cblxuICAvKipcbiAgICog44K144Kk44K65paH5a2X5YiX44KS44OQ44Kk44OI5pWw44Gr5aSJ5o+bXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBwYXJzZVNpemUoc2l6ZVRleHQ6IHN0cmluZyk6IG51bWJlciB7XG4gICAgY29uc3QgdGV4dCA9IHNpemVUZXh0LnRyaW0oKTtcbiAgICBpZiAodGV4dC5pbmNsdWRlcygnQnl0ZXMnKSkge1xuICAgICAgcmV0dXJuIE1hdGguZmxvb3IoTnVtYmVyLnBhcnNlRmxvYXQodGV4dC5yZXBsYWNlKCdCeXRlcycsICcnKS50cmltKCkpKTtcbiAgICB9XG4gICAgaWYgKHRleHQuaW5jbHVkZXMoJ2tCJykpIHtcbiAgICAgIHJldHVybiBNYXRoLmZsb29yKE51bWJlci5wYXJzZUZsb2F0KHRleHQucmVwbGFjZSgna0InLCAnJykudHJpbSgpKSAqIDEwMDApO1xuICAgIH1cbiAgICBpZiAodGV4dC5pbmNsdWRlcygnTUInKSkge1xuICAgICAgcmV0dXJuIE1hdGguZmxvb3IoTnVtYmVyLnBhcnNlRmxvYXQodGV4dC5yZXBsYWNlKCdNQicsICcnKS50cmltKCkpICogMTAwMDAwMCk7XG4gICAgfVxuICAgIGlmICh0ZXh0LmluY2x1ZGVzKCdHQicpKSB7XG4gICAgICByZXR1cm4gTWF0aC5mbG9vcihOdW1iZXIucGFyc2VGbG9hdCh0ZXh0LnJlcGxhY2UoJ0dCJywgJycpLnRyaW0oKSkgKiAxMDAwMDAwMDAwKTtcbiAgICB9XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICAvKipcbiAgICog44Oa44O844K444Gr5re75LuY44GV44KM44Gf44OV44Kh44Kk44Or5LiA6Kan44KS5Y+W5b6X44GZ44KLXG4gICAqL1xuICBzdGF0aWMgYWNxdWlyZShwYWdlOiBQYWdlKTogV2lraWRvdFJlc3VsdEFzeW5jPFBhZ2VGaWxlQ29sbGVjdGlvbj4ge1xuICAgIGlmIChwYWdlLmlkID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAgIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcignUGFnZSBJRCBub3QgYWNxdWlyZWQnKSksXG4gICAgICAgICgpID0+IG5ldyBVbmV4cGVjdGVkRXJyb3IoJ1BhZ2UgSUQgbXVzdCBiZSBhY3F1aXJlZCBiZWZvcmUgZ2V0dGluZyBmaWxlcycpXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHBhZ2VJZCA9IHBhZ2UuaWQ7XG5cbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwYWdlLnNpdGUuYW1jUmVxdWVzdChbXG4gICAgICAgICAge1xuICAgICAgICAgICAgbW9kdWxlTmFtZTogJ2ZpbGVzL1BhZ2VGaWxlc01vZHVsZScsXG4gICAgICAgICAgICBwYWdlX2lkOiBwYWdlSWQsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSk7XG5cbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSByZXN1bHQudmFsdWVbMF07XG4gICAgICAgIGlmICghcmVzcG9uc2UpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZEVycm9yKCdFbXB0eSByZXNwb25zZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaHRtbCA9IFN0cmluZyhyZXNwb25zZS5ib2R5ID8/ICcnKTtcbiAgICAgICAgY29uc3QgJCA9IGNoZWVyaW8ubG9hZChodG1sKTtcblxuICAgICAgICBjb25zdCBmaWxlc1RhYmxlID0gJCgndGFibGUucGFnZS1maWxlcycpO1xuICAgICAgICBpZiAoZmlsZXNUYWJsZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gbmV3IFBhZ2VGaWxlQ29sbGVjdGlvbihwYWdlLCBbXSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmaWxlczogUGFnZUZpbGVbXSA9IFtdO1xuXG4gICAgICAgIGZpbGVzVGFibGUuZmluZChcInRib2R5IHRyW2lkXj0nZmlsZS1yb3ctJ11cIikuZWFjaCgoX2ksIHJvdykgPT4ge1xuICAgICAgICAgIGNvbnN0IHJvd0lkID0gJChyb3cpLmF0dHIoJ2lkJyk7XG4gICAgICAgICAgaWYgKCFyb3dJZCkgcmV0dXJuO1xuXG4gICAgICAgICAgY29uc3QgZmlsZUlkID0gTnVtYmVyLnBhcnNlSW50KHJvd0lkLnJlcGxhY2UoJ2ZpbGUtcm93LScsICcnKSwgMTApO1xuICAgICAgICAgIGNvbnN0IHRkcyA9ICQocm93KS5maW5kKCd0ZCcpO1xuICAgICAgICAgIGlmICh0ZHMubGVuZ3RoIDwgMykgcmV0dXJuO1xuXG4gICAgICAgICAgY29uc3QgbGlua0VsZW0gPSAkKHRkc1swXSkuZmluZCgnYScpO1xuICAgICAgICAgIGlmIChsaW5rRWxlbS5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgICAgICAgIGNvbnN0IG5hbWUgPSBsaW5rRWxlbS50ZXh0KCkudHJpbSgpO1xuICAgICAgICAgIGNvbnN0IGhyZWYgPSBsaW5rRWxlbS5hdHRyKCdocmVmJykgPz8gJyc7XG4gICAgICAgICAgY29uc3QgdXJsID0gYCR7cGFnZS5zaXRlLmdldEJhc2VVcmwoKX0ke2hyZWZ9YDtcblxuICAgICAgICAgIGNvbnN0IG1pbWVFbGVtID0gJCh0ZHNbMV0pLmZpbmQoJ3NwYW4nKTtcbiAgICAgICAgICBjb25zdCBtaW1lVHlwZSA9IG1pbWVFbGVtLmF0dHIoJ3RpdGxlJykgPz8gJyc7XG5cbiAgICAgICAgICBjb25zdCBzaXplVGV4dCA9ICQodGRzWzJdKS50ZXh0KCkudHJpbSgpO1xuICAgICAgICAgIGNvbnN0IHNpemUgPSBQYWdlRmlsZUNvbGxlY3Rpb24ucGFyc2VTaXplKHNpemVUZXh0KTtcblxuICAgICAgICAgIGZpbGVzLnB1c2goXG4gICAgICAgICAgICBuZXcgUGFnZUZpbGUoe1xuICAgICAgICAgICAgICBwYWdlLFxuICAgICAgICAgICAgICBpZDogZmlsZUlkLFxuICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICB1cmwsXG4gICAgICAgICAgICAgIG1pbWVUeXBlLFxuICAgICAgICAgICAgICBzaXplLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICApO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gbmV3IFBhZ2VGaWxlQ29sbGVjdGlvbihwYWdlLCBmaWxlcyk7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gYWNxdWlyZSBmaWxlczogJHtTdHJpbmcoZXJyb3IpfWApXG4gICAgKTtcbiAgfVxufVxuIiwKICAgICJpbXBvcnQgKiBhcyBjaGVlcmlvIGZyb20gJ2NoZWVyaW8nO1xuaW1wb3J0IHsgTG9naW5SZXF1aXJlZEVycm9yLCBOb0VsZW1lbnRFcnJvciwgVW5leHBlY3RlZEVycm9yIH0gZnJvbSAnLi4vLi4vY29tbW9uL2Vycm9ycyc7XG5pbXBvcnQgeyBmcm9tUHJvbWlzZSwgdHlwZSBXaWtpZG90UmVzdWx0QXN5bmMgfSBmcm9tICcuLi8uLi9jb21tb24vdHlwZXMnO1xuaW1wb3J0IHR5cGUgeyBQYWdlUmVmIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG4vKipcbiAqIOODmuODvOOCuOODoeOCv+OCv+OCsOODh+ODvOOCv1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhZ2VNZXRhRGF0YSB7XG4gIHBhZ2U6IFBhZ2VSZWY7XG4gIG5hbWU6IHN0cmluZztcbiAgY29udGVudDogc3RyaW5nO1xufVxuXG4vKipcbiAqIOODmuODvOOCuOODoeOCv+OCv+OCsFxuICovXG5leHBvcnQgY2xhc3MgUGFnZU1ldGEge1xuICBwdWJsaWMgcmVhZG9ubHkgcGFnZTogUGFnZVJlZjtcbiAgcHVibGljIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgcHVibGljIGNvbnRlbnQ6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihkYXRhOiBQYWdlTWV0YURhdGEpIHtcbiAgICB0aGlzLnBhZ2UgPSBkYXRhLnBhZ2U7XG4gICAgdGhpcy5uYW1lID0gZGF0YS5uYW1lO1xuICAgIHRoaXMuY29udGVudCA9IGRhdGEuY29udGVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiDjg6Hjgr/jgr/jgrDjga7lgKTjgpLmm7TmlrDjgZnjgotcbiAgICogQHBhcmFtIGNvbnRlbnQgLSDmlrDjgZfjgYTlgKRcbiAgICovXG4gIHVwZGF0ZShjb250ZW50OiBzdHJpbmcpOiBXaWtpZG90UmVzdWx0QXN5bmM8dm9pZD4ge1xuICAgIHJldHVybiBQYWdlTWV0YUNvbGxlY3Rpb24uc2V0TWV0YSh0aGlzLnBhZ2UsIHRoaXMubmFtZSwgY29udGVudCk7XG4gIH1cblxuICAvKipcbiAgICog44Oh44K/44K/44Kw44KS5YmK6Zmk44GZ44KLXG4gICAqL1xuICBkZWxldGUoKTogV2lraWRvdFJlc3VsdEFzeW5jPHZvaWQ+IHtcbiAgICByZXR1cm4gUGFnZU1ldGFDb2xsZWN0aW9uLmRlbGV0ZU1ldGEodGhpcy5wYWdlLCB0aGlzLm5hbWUpO1xuICB9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFBhZ2VNZXRhKG5hbWU9JHt0aGlzLm5hbWV9LCBjb250ZW50PSR7dGhpcy5jb250ZW50fSlgO1xuICB9XG59XG5cbi8qKlxuICog44Oa44O844K444Oh44K/44K/44Kw44Kz44Os44Kv44K344On44OzXG4gKi9cbmV4cG9ydCBjbGFzcyBQYWdlTWV0YUNvbGxlY3Rpb24gZXh0ZW5kcyBBcnJheTxQYWdlTWV0YT4ge1xuICBwdWJsaWMgcmVhZG9ubHkgcGFnZTogUGFnZVJlZjtcblxuICBjb25zdHJ1Y3RvcihwYWdlOiBQYWdlUmVmLCBtZXRhcz86IFBhZ2VNZXRhW10pIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMucGFnZSA9IHBhZ2U7XG4gICAgaWYgKG1ldGFzKSB7XG4gICAgICB0aGlzLnB1c2goLi4ubWV0YXMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDlkI3liY3jgafmpJzntKJcbiAgICogQHBhcmFtIG5hbWUgLSDjg6Hjgr/jgr/jgrDlkI1cbiAgICogQHJldHVybnMg44Oh44K/44K/44Kw77yI5a2Y5Zyo44GX44Gq44GE5aC05ZCI44GvdW5kZWZpbmVk77yJXG4gICAqL1xuICBmaW5kQnlOYW1lKG5hbWU6IHN0cmluZyk6IFBhZ2VNZXRhIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5maW5kKChtZXRhKSA9PiBtZXRhLm5hbWUgPT09IG5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIOODmuODvOOCuOOBruODoeOCv+OCv+OCsOOCkuWPluW+l+OBmeOCi1xuICAgKiBAcGFyYW0gcGFnZSAtIOODmuODvOOCuOWPgueFp1xuICAgKiBAcmV0dXJucyDjg6Hjgr/jgr/jgrDjgrPjg6zjgq/jgrfjg6fjg7NcbiAgICovXG4gIHN0YXRpYyBhY3F1aXJlKHBhZ2U6IFBhZ2VSZWYpOiBXaWtpZG90UmVzdWx0QXN5bmM8UGFnZU1ldGFDb2xsZWN0aW9uPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcGFnZS5zaXRlLmFtY1JlcXVlc3QoW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG1vZHVsZU5hbWU6ICdlZGl0L0VkaXRNZXRhTW9kdWxlJyxcbiAgICAgICAgICAgIHBhZ2VfaWQ6IHBhZ2UuaWQsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSk7XG5cbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSByZXN1bHQudmFsdWVbMF07XG4gICAgICAgIGlmICghcmVzcG9uc2UpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgTm9FbGVtZW50RXJyb3IoJ0VtcHR5IHJlc3BvbnNlJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBodG1sID0gU3RyaW5nKHJlc3BvbnNlLmJvZHkgPz8gJycpO1xuICAgICAgICBjb25zdCAkID0gY2hlZXJpby5sb2FkKGh0bWwpO1xuICAgICAgICBjb25zdCBtZXRhczogUGFnZU1ldGFbXSA9IFtdO1xuXG4gICAgICAgIC8vIOODoeOCv+OCv+OCsOODhuODvOODluODq+OCkuODkeODvOOCuVxuICAgICAgICAkKCd0YWJsZS5tZXRhLXRhYmxlIHRyJykuZWFjaCgoX2ksIGVsZW0pID0+IHtcbiAgICAgICAgICBjb25zdCAkcm93ID0gJChlbGVtKTtcbiAgICAgICAgICBjb25zdCAkY2VsbHMgPSAkcm93LmZpbmQoJ3RkJyk7XG4gICAgICAgICAgaWYgKCRjZWxscy5sZW5ndGggPCAyKSByZXR1cm47XG5cbiAgICAgICAgICBjb25zdCBuYW1lID0gJCgkY2VsbHNbMF0pLnRleHQoKS50cmltKCk7XG4gICAgICAgICAgY29uc3QgY29udGVudCA9ICQoJGNlbGxzWzFdKS50ZXh0KCkudHJpbSgpO1xuXG4gICAgICAgICAgaWYgKG5hbWUpIHtcbiAgICAgICAgICAgIG1ldGFzLnB1c2goXG4gICAgICAgICAgICAgIG5ldyBQYWdlTWV0YSh7XG4gICAgICAgICAgICAgICAgcGFnZSxcbiAgICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICAgIGNvbnRlbnQsXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBQYWdlTWV0YUNvbGxlY3Rpb24ocGFnZSwgbWV0YXMpO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBOb0VsZW1lbnRFcnJvcikge1xuICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGFjcXVpcmUgcGFnZSBtZXRhczogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICog44Oh44K/44K/44Kw44KS6Kit5a6a44GZ44KLXG4gICAqIEBwYXJhbSBwYWdlIC0g44Oa44O844K45Y+C54WnXG4gICAqIEBwYXJhbSBuYW1lIC0g44Oh44K/44K/44Kw5ZCNXG4gICAqIEBwYXJhbSBjb250ZW50IC0g44Oh44K/44K/44Kw44Gu5YCkXG4gICAqL1xuICBzdGF0aWMgc2V0TWV0YShwYWdlOiBQYWdlUmVmLCBuYW1lOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZyk6IFdpa2lkb3RSZXN1bHRBc3luYzx2b2lkPiB7XG4gICAgY29uc3QgbG9naW5SZXN1bHQgPSBwYWdlLnNpdGUuY2xpZW50LnJlcXVpcmVMb2dpbigpO1xuICAgIGlmIChsb2dpblJlc3VsdC5pc0VycigpKSB7XG4gICAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAgIFByb21pc2UucmVqZWN0KGxvZ2luUmVzdWx0LmVycm9yKSxcbiAgICAgICAgKCkgPT4gbmV3IExvZ2luUmVxdWlyZWRFcnJvcignTG9naW4gcmVxdWlyZWQgdG8gc2V0IG1ldGEgdGFnJylcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcGFnZS5zaXRlLmFtY1JlcXVlc3QoW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFjdGlvbjogJ1dpa2lQYWdlQWN0aW9uJyxcbiAgICAgICAgICAgIGV2ZW50OiAnc2F2ZU1ldGFUYWcnLFxuICAgICAgICAgICAgbW9kdWxlTmFtZTogJ0VtcHR5JyxcbiAgICAgICAgICAgIHBhZ2VfaWQ6IHBhZ2UuaWQsXG4gICAgICAgICAgICBtZXRhX25hbWU6IG5hbWUsXG4gICAgICAgICAgICBtZXRhX2NvbnRlbnQ6IGNvbnRlbnQsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSk7XG5cbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIExvZ2luUmVxdWlyZWRFcnJvcikge1xuICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIHNldCBtZXRhIHRhZzogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICog44Oh44K/44K/44Kw44KS5YmK6Zmk44GZ44KLXG4gICAqIEBwYXJhbSBwYWdlIC0g44Oa44O844K45Y+C54WnXG4gICAqIEBwYXJhbSBuYW1lIC0g44Oh44K/44K/44Kw5ZCNXG4gICAqL1xuICBzdGF0aWMgZGVsZXRlTWV0YShwYWdlOiBQYWdlUmVmLCBuYW1lOiBzdHJpbmcpOiBXaWtpZG90UmVzdWx0QXN5bmM8dm9pZD4ge1xuICAgIGNvbnN0IGxvZ2luUmVzdWx0ID0gcGFnZS5zaXRlLmNsaWVudC5yZXF1aXJlTG9naW4oKTtcbiAgICBpZiAobG9naW5SZXN1bHQuaXNFcnIoKSkge1xuICAgICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgICBQcm9taXNlLnJlamVjdChsb2dpblJlc3VsdC5lcnJvciksXG4gICAgICAgICgpID0+IG5ldyBMb2dpblJlcXVpcmVkRXJyb3IoJ0xvZ2luIHJlcXVpcmVkIHRvIGRlbGV0ZSBtZXRhIHRhZycpXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHBhZ2Uuc2l0ZS5hbWNSZXF1ZXN0KFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhY3Rpb246ICdXaWtpUGFnZUFjdGlvbicsXG4gICAgICAgICAgICBldmVudDogJ2RlbGV0ZU1ldGFUYWcnLFxuICAgICAgICAgICAgbW9kdWxlTmFtZTogJ0VtcHR5JyxcbiAgICAgICAgICAgIHBhZ2VfaWQ6IHBhZ2UuaWQsXG4gICAgICAgICAgICBtZXRhX25hbWU6IG5hbWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSk7XG5cbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIExvZ2luUmVxdWlyZWRFcnJvcikge1xuICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGRlbGV0ZSBtZXRhIHRhZzogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cbn1cbiIsCiAgICAiaW1wb3J0ICogYXMgY2hlZXJpbyBmcm9tICdjaGVlcmlvJztcbmltcG9ydCB7IE5vRWxlbWVudEVycm9yLCBVbmV4cGVjdGVkRXJyb3IgfSBmcm9tICcuLi8uLi9jb21tb24vZXJyb3JzJztcbmltcG9ydCB7IGZyb21Qcm9taXNlLCB0eXBlIFdpa2lkb3RSZXN1bHRBc3luYyB9IGZyb20gJy4uLy4uL2NvbW1vbi90eXBlcyc7XG5pbXBvcnQgdHlwZSB7IEFic3RyYWN0VXNlciB9IGZyb20gJy4uL3VzZXInO1xuaW1wb3J0IHR5cGUgeyBQYWdlIH0gZnJvbSAnLi9wYWdlJztcbmltcG9ydCB0eXBlIHsgUGFnZVNvdXJjZSB9IGZyb20gJy4vcGFnZS1zb3VyY2UnO1xuXG4vKipcbiAqIOODmuODvOOCuOODquODk+OCuOODp+ODs+ODh+ODvOOCv1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhZ2VSZXZpc2lvbkRhdGEge1xuICBwYWdlOiBQYWdlO1xuICBpZDogbnVtYmVyO1xuICByZXZObzogbnVtYmVyO1xuICBjcmVhdGVkQnk6IEFic3RyYWN0VXNlcjtcbiAgY3JlYXRlZEF0OiBEYXRlO1xuICBjb21tZW50OiBzdHJpbmc7XG59XG5cbi8qKlxuICog44Oa44O844K444Gu44Oq44OT44K444On44Oz77yI57eo6ZuG5bGl5q2044Gu44OQ44O844K444On44Oz77yJXG4gKi9cbmV4cG9ydCBjbGFzcyBQYWdlUmV2aXNpb24ge1xuICAvKiog44Oq44OT44K444On44Oz44GM5bGe44GZ44KL44Oa44O844K4ICovXG4gIHB1YmxpYyByZWFkb25seSBwYWdlOiBQYWdlO1xuXG4gIC8qKiDjg6rjg5Pjgrjjg6fjg7NJRCAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaWQ6IG51bWJlcjtcblxuICAvKiog44Oq44OT44K444On44Oz55Wq5Y+3ICovXG4gIHB1YmxpYyByZWFkb25seSByZXZObzogbnVtYmVyO1xuXG4gIC8qKiDjg6rjg5Pjgrjjg6fjg7PkvZzmiJDogIUgKi9cbiAgcHVibGljIHJlYWRvbmx5IGNyZWF0ZWRCeTogQWJzdHJhY3RVc2VyO1xuXG4gIC8qKiDjg6rjg5Pjgrjjg6fjg7PkvZzmiJDml6XmmYIgKi9cbiAgcHVibGljIHJlYWRvbmx5IGNyZWF0ZWRBdDogRGF0ZTtcblxuICAvKiog57eo6ZuG44Kz44Oh44Oz44OIICovXG4gIHB1YmxpYyByZWFkb25seSBjb21tZW50OiBzdHJpbmc7XG5cbiAgLyoqIOOCveODvOOCueOCs+ODvOODie+8iOWGhemDqOOCreODo+ODg+OCt+ODpe+8iSAqL1xuICBwcml2YXRlIF9zb3VyY2U6IFBhZ2VTb3VyY2UgfCBudWxsID0gbnVsbDtcblxuICAvKiogSFRNTOihqOekuu+8iOWGhemDqOOCreODo+ODg+OCt+ODpe+8iSAqL1xuICBwcml2YXRlIF9odG1sOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICBjb25zdHJ1Y3RvcihkYXRhOiBQYWdlUmV2aXNpb25EYXRhKSB7XG4gICAgdGhpcy5wYWdlID0gZGF0YS5wYWdlO1xuICAgIHRoaXMuaWQgPSBkYXRhLmlkO1xuICAgIHRoaXMucmV2Tm8gPSBkYXRhLnJldk5vO1xuICAgIHRoaXMuY3JlYXRlZEJ5ID0gZGF0YS5jcmVhdGVkQnk7XG4gICAgdGhpcy5jcmVhdGVkQXQgPSBkYXRhLmNyZWF0ZWRBdDtcbiAgICB0aGlzLmNvbW1lbnQgPSBkYXRhLmNvbW1lbnQ7XG4gIH1cblxuICAvKipcbiAgICog44K944O844K544Kz44O844OJ44GM5Y+W5b6X5riI44G/44GL44Gp44GG44GLXG4gICAqL1xuICBpc1NvdXJjZUFjcXVpcmVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9zb3VyY2UgIT09IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogSFRNTOihqOekuuOBjOWPluW+l+a4iOOBv+OBi+OBqeOBhuOBi1xuICAgKi9cbiAgaXNIdG1sQWNxdWlyZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2h0bWwgIT09IG51bGw7XG4gIH1cblxuICAvKipcbiAgICog44K944O844K544Kz44O844OJ77yI44Kt44Oj44OD44K344Ol5riI44G/77yJ44KS5Y+W5b6XXG4gICAqL1xuICBnZXQgc291cmNlKCk6IFBhZ2VTb3VyY2UgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fc291cmNlO1xuICB9XG5cbiAgLyoqXG4gICAqIOOCveODvOOCueOCs+ODvOODieOCkuioreWumlxuICAgKi9cbiAgc2V0IHNvdXJjZSh2YWx1ZTogUGFnZVNvdXJjZSB8IG51bGwpIHtcbiAgICB0aGlzLl9zb3VyY2UgPSB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIVE1M6KGo56S677yI44Kt44Oj44OD44K344Ol5riI44G/77yJ44KS5Y+W5b6XXG4gICAqL1xuICBnZXQgaHRtbCgpOiBzdHJpbmcgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5faHRtbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBIVE1M6KGo56S644KS6Kit5a6aXG4gICAqL1xuICBzZXQgaHRtbCh2YWx1ZTogc3RyaW5nIHwgbnVsbCkge1xuICAgIHRoaXMuX2h0bWwgPSB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiDjg6rjg5Pjgrjjg6fjg7Pjga7jgr3jg7zjgrnjgpLlj5blvpfjgZnjgovvvIhSRVYtMDAx77yJXG4gICAqIEByZXR1cm5zIOOCveODvOOCueaWh+Wtl+WIl1xuICAgKi9cbiAgZ2V0U291cmNlKCk6IFdpa2lkb3RSZXN1bHRBc3luYzxzdHJpbmc+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAvLyDjgq3jg6Pjg4Pjgrfjg6XjgYzjgYLjgozjgbDov5TjgZlcbiAgICAgICAgaWYgKHRoaXMuX3NvdXJjZSkge1xuICAgICAgICAgIHJldHVybiB0aGlzLl9zb3VyY2Uud2lraVRleHQ7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnBhZ2Uuc2l0ZS5hbWNSZXF1ZXN0KFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBtb2R1bGVOYW1lOiAnaGlzdG9yeS9QYWdlU291cmNlTW9kdWxlJyxcbiAgICAgICAgICAgIHJldmlzaW9uX2lkOiB0aGlzLmlkLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pO1xuXG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gcmVzdWx0LnZhbHVlWzBdO1xuICAgICAgICBpZiAoIXJlc3BvbnNlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IE5vRWxlbWVudEVycm9yKCdFbXB0eSByZXNwb25zZSBmcm9tIFBhZ2VTb3VyY2VNb2R1bGUnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGh0bWwgPSBTdHJpbmcocmVzcG9uc2UuYm9keSA/PyAnJyk7XG4gICAgICAgIGNvbnN0ICQgPSBjaGVlcmlvLmxvYWQoaHRtbCk7XG5cbiAgICAgICAgLy8g44K944O844K544Kz44O844OJ44GvPGRpdiBjbGFzcz1cInBhZ2Utc291cmNlXCI+5YaF44Gr44GC44KLXG4gICAgICAgIGNvbnN0IHNvdXJjZUVsZW0gPSAkKCdkaXYucGFnZS1zb3VyY2UnKTtcbiAgICAgICAgaWYgKHNvdXJjZUVsZW0ubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IE5vRWxlbWVudEVycm9yKCdTb3VyY2UgZWxlbWVudCBub3QgZm91bmQnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNvdXJjZVRleHQgPSBzb3VyY2VFbGVtLnRleHQoKTtcbiAgICAgICAgcmV0dXJuIHNvdXJjZVRleHQ7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIE5vRWxlbWVudEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gZ2V0IHJldmlzaW9uIHNvdXJjZTogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICog44Oq44OT44K444On44Oz44GuSFRNTOOCkuWPluW+l+OBmeOCi++8iFJFVi0wMDLvvIlcbiAgICogQHJldHVybnMgSFRNTOaWh+Wtl+WIl1xuICAgKi9cbiAgZ2V0SHRtbCgpOiBXaWtpZG90UmVzdWx0QXN5bmM8c3RyaW5nPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgLy8g44Kt44Oj44OD44K344Ol44GM44GC44KM44Gw6L+U44GZXG4gICAgICAgIGlmICh0aGlzLl9odG1sKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX2h0bWw7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnBhZ2Uuc2l0ZS5hbWNSZXF1ZXN0KFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBtb2R1bGVOYW1lOiAnaGlzdG9yeS9QYWdlVmVyc2lvbk1vZHVsZScsXG4gICAgICAgICAgICByZXZpc2lvbl9pZDogdGhpcy5pZCxcbiAgICAgICAgICB9LFxuICAgICAgICBdKTtcblxuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXNwb25zZSA9IHJlc3VsdC52YWx1ZVswXTtcbiAgICAgICAgaWYgKCFyZXNwb25zZSkge1xuICAgICAgICAgIHRocm93IG5ldyBOb0VsZW1lbnRFcnJvcignRW1wdHkgcmVzcG9uc2UgZnJvbSBQYWdlVmVyc2lvbk1vZHVsZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaHRtbCA9IFN0cmluZyhyZXNwb25zZS5ib2R5ID8/ICcnKTtcbiAgICAgICAgY29uc3QgJCA9IGNoZWVyaW8ubG9hZChodG1sKTtcblxuICAgICAgICAvLyBIVE1M44Kz44Oz44OG44Oz44OE44GvPGRpdiBpZD1cInBhZ2UtY29udGVudFwiPuWGheOBq+OBguOCi1xuICAgICAgICBjb25zdCBjb250ZW50RWxlbSA9ICQoJyNwYWdlLWNvbnRlbnQnKTtcbiAgICAgICAgaWYgKGNvbnRlbnRFbGVtLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIC8vIHBhZ2UtY29udGVudOOBjOOBquOBhOWgtOWQiOOBr2JvZHnlhajkvZPjgpLov5TjgZlcbiAgICAgICAgICB0aGlzLl9odG1sID0gaHRtbDtcbiAgICAgICAgICByZXR1cm4gaHRtbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNvbnRlbnRIdG1sID0gY29udGVudEVsZW0uaHRtbCgpID8/ICcnO1xuICAgICAgICB0aGlzLl9odG1sID0gY29udGVudEh0bWw7XG4gICAgICAgIHJldHVybiBjb250ZW50SHRtbDtcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgTm9FbGVtZW50RXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBnZXQgcmV2aXNpb24gSFRNTDogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiBgUGFnZVJldmlzaW9uKGlkPSR7dGhpcy5pZH0sIHJldk5vPSR7dGhpcy5yZXZOb30pYDtcbiAgfVxufVxuXG4vKipcbiAqIOODmuODvOOCuOODquODk+OCuOODp+ODs+OCs+ODrOOCr+OCt+ODp+ODs1xuICovXG5leHBvcnQgY2xhc3MgUGFnZVJldmlzaW9uQ29sbGVjdGlvbiBleHRlbmRzIEFycmF5PFBhZ2VSZXZpc2lvbj4ge1xuICBwdWJsaWMgcmVhZG9ubHkgcGFnZTogUGFnZSB8IG51bGw7XG5cbiAgY29uc3RydWN0b3IocGFnZTogUGFnZSB8IG51bGwsIHJldmlzaW9ucz86IFBhZ2VSZXZpc2lvbltdKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLnBhZ2UgPSBwYWdlO1xuICAgIGlmIChyZXZpc2lvbnMpIHtcbiAgICAgIHRoaXMucHVzaCguLi5yZXZpc2lvbnMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJROOBp+aknOe0olxuICAgKiBAcGFyYW0gaWQgLSDjg6rjg5Pjgrjjg6fjg7NJRFxuICAgKiBAcmV0dXJucyDjg6rjg5Pjgrjjg6fjg7PvvIjlrZjlnKjjgZfjgarjgYTloLTlkIjjga91bmRlZmluZWTvvIlcbiAgICovXG4gIGZpbmRCeUlkKGlkOiBudW1iZXIpOiBQYWdlUmV2aXNpb24gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmZpbmQoKHJldmlzaW9uKSA9PiByZXZpc2lvbi5pZCA9PT0gaWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIOWFqOODquODk+OCuOODp+ODs+OBruOCveODvOOCueOCkuS4gOaLrOWPluW+l+OBmeOCi1xuICAgKiBAcmV0dXJucyDjgr3jg7zjgrnmloflrZfliJfjga7phY3liJdcbiAgICovXG4gIGdldFNvdXJjZXMoKTogV2lraWRvdFJlc3VsdEFzeW5jPHN0cmluZ1tdPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICAgIHRoaXMubWFwKGFzeW5jIChyZXZpc2lvbikgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmV2aXNpb24uZ2V0U291cmNlKCk7XG4gICAgICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC52YWx1ZTtcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gcmVzdWx0cztcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgTm9FbGVtZW50RXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBnZXQgc291cmNlczogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICog5YWo44Oq44OT44K444On44Oz44GuSFRNTOOCkuS4gOaLrOWPluW+l+OBmeOCi1xuICAgKiBAcmV0dXJucyBIVE1M5paH5a2X5YiX44Gu6YWN5YiXXG4gICAqL1xuICBnZXRIdG1scygpOiBXaWtpZG90UmVzdWx0QXN5bmM8c3RyaW5nW10+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgdGhpcy5tYXAoYXN5bmMgKHJldmlzaW9uKSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZXZpc2lvbi5nZXRIdG1sKCk7XG4gICAgICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC52YWx1ZTtcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gcmVzdWx0cztcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgTm9FbGVtZW50RXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBnZXQgSFRNTHM6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgUGFnZSB9IGZyb20gJy4vcGFnZSc7XG5cbi8qKlxuICog44Oa44O844K444K944O844K544OH44O844K/XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFnZVNvdXJjZURhdGEge1xuICBwYWdlOiBQYWdlO1xuICB3aWtpVGV4dDogc3RyaW5nO1xufVxuXG4vKipcbiAqIOODmuODvOOCuOOBruOCveODvOOCueOCs+ODvOODie+8iFdpa2lkb3ToqJjms5XvvIlcbiAqL1xuZXhwb3J0IGNsYXNzIFBhZ2VTb3VyY2Uge1xuICAvKiog44K944O844K544GM5bGe44GZ44KL44Oa44O844K4ICovXG4gIHB1YmxpYyByZWFkb25seSBwYWdlOiBQYWdlO1xuXG4gIC8qKiDjgr3jg7zjgrnjgrPjg7zjg4nvvIhXaWtpZG906KiY5rOV77yJICovXG4gIHB1YmxpYyByZWFkb25seSB3aWtpVGV4dDogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKGRhdGE6IFBhZ2VTb3VyY2VEYXRhKSB7XG4gICAgdGhpcy5wYWdlID0gZGF0YS5wYWdlO1xuICAgIHRoaXMud2lraVRleHQgPSBkYXRhLndpa2lUZXh0O1xuICB9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFBhZ2VTb3VyY2UocGFnZT0ke3RoaXMucGFnZS5mdWxsbmFtZX0sIGxlbmd0aD0ke3RoaXMud2lraVRleHQubGVuZ3RofSlgO1xuICB9XG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgQWJzdHJhY3RVc2VyIH0gZnJvbSAnLi4vdXNlcic7XG5pbXBvcnQgdHlwZSB7IFBhZ2UgfSBmcm9tICcuL3BhZ2UnO1xuXG4vKipcbiAqIOODmuODvOOCuOaKleelqOODh+ODvOOCv1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhZ2VWb3RlRGF0YSB7XG4gIHBhZ2U6IFBhZ2U7XG4gIHVzZXI6IEFic3RyYWN0VXNlcjtcbiAgdmFsdWU6IG51bWJlcjtcbn1cblxuLyoqXG4gKiDjg5rjg7zjgrjjgbjjga7mipXnpajvvIjjg6zjg7zjg4bjgqPjg7PjgrDvvIlcbiAqL1xuZXhwb3J0IGNsYXNzIFBhZ2VWb3RlIHtcbiAgLyoqIOaKleelqOOBjOWxnuOBmeOCi+ODmuODvOOCuCAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcGFnZTogUGFnZTtcblxuICAvKiog5oqV56Wo44GX44Gf44Om44O844K244O8ICovXG4gIHB1YmxpYyByZWFkb25seSB1c2VyOiBBYnN0cmFjdFVzZXI7XG5cbiAgLyoqIOaKleelqOWApO+8iCsxLy0xIOOBvuOBn+OBryDmlbDlgKTvvIkgKi9cbiAgcHVibGljIHJlYWRvbmx5IHZhbHVlOiBudW1iZXI7XG5cbiAgY29uc3RydWN0b3IoZGF0YTogUGFnZVZvdGVEYXRhKSB7XG4gICAgdGhpcy5wYWdlID0gZGF0YS5wYWdlO1xuICAgIHRoaXMudXNlciA9IGRhdGEudXNlcjtcbiAgICB0aGlzLnZhbHVlID0gZGF0YS52YWx1ZTtcbiAgfVxuXG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBQYWdlVm90ZSh1c2VyPSR7dGhpcy51c2VyLm5hbWV9LCB2YWx1ZT0ke3RoaXMudmFsdWV9KWA7XG4gIH1cbn1cblxuLyoqXG4gKiDjg5rjg7zjgrjmipXnpajjgrPjg6zjgq/jgrfjg6fjg7NcbiAqL1xuZXhwb3J0IGNsYXNzIFBhZ2VWb3RlQ29sbGVjdGlvbiBleHRlbmRzIEFycmF5PFBhZ2VWb3RlPiB7XG4gIHB1YmxpYyByZWFkb25seSBwYWdlOiBQYWdlO1xuXG4gIGNvbnN0cnVjdG9yKHBhZ2U6IFBhZ2UsIHZvdGVzPzogUGFnZVZvdGVbXSkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5wYWdlID0gcGFnZTtcbiAgICBpZiAodm90ZXMpIHtcbiAgICAgIHRoaXMucHVzaCguLi52b3Rlcyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOODpuODvOOCtuODvOOBp+aknOe0olxuICAgKiBAcGFyYW0gdXNlciAtIOaknOe0ouOBmeOCi+ODpuODvOOCtuODvFxuICAgKiBAcmV0dXJucyDmipXnpajvvIjlrZjlnKjjgZfjgarjgYTloLTlkIjjga91bmRlZmluZWTvvIlcbiAgICovXG4gIGZpbmRCeVVzZXIodXNlcjogQWJzdHJhY3RVc2VyKTogUGFnZVZvdGUgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmZpbmQoKHZvdGUpID0+IHZvdGUudXNlci5pZCA9PT0gdXNlci5pZCk7XG4gIH1cbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBBYnN0cmFjdFVzZXIgfSBmcm9tICcuLi91c2VyJztcblxuLyoqXG4gKiDjg5rjg7zjgrjmpJzntKLjgq/jgqjjg6rjga7jg5Hjg6njg6Hjg7zjgr9cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZWFyY2hQYWdlc1F1ZXJ5UGFyYW1zIHtcbiAgLyoqIOODmuODvOOCuOOCv+OCpOODl++8iOS+izogJ25vcm1hbCcsICdhZG1pbifvvIkgKi9cbiAgcGFnZXR5cGU/OiBzdHJpbmc7XG4gIC8qKiDjgqvjg4bjgrTjg6rlkI0gKi9cbiAgY2F0ZWdvcnk/OiBzdHJpbmc7XG4gIC8qKiDmpJzntKLlr77osaHjgr/jgrDvvIhBTkTmnaHku7bvvIkgKi9cbiAgdGFncz86IHN0cmluZyB8IHN0cmluZ1tdO1xuICAvKiog6Kaq44Oa44O844K45ZCNICovXG4gIHBhcmVudD86IHN0cmluZztcbiAgLyoqIOODquODs+OCr+WFiOODmuODvOOCuOWQjSAqL1xuICBsaW5rVG8/OiBzdHJpbmc7XG4gIC8qKiDkvZzmiJDml6XmmYLmnaHku7YgKi9cbiAgY3JlYXRlZEF0Pzogc3RyaW5nO1xuICAvKiog5pu05paw5pel5pmC5p2h5Lu2ICovXG4gIHVwZGF0ZWRBdD86IHN0cmluZztcbiAgLyoqIOS9nOaIkOiAhSAqL1xuICBjcmVhdGVkQnk/OiBBYnN0cmFjdFVzZXIgfCBzdHJpbmc7XG4gIC8qKiDjg6zjg7zjg4bjgqPjg7PjgrDmnaHku7YgKi9cbiAgcmF0aW5nPzogc3RyaW5nO1xuICAvKiog5oqV56Wo5pWw5p2h5Lu2ICovXG4gIHZvdGVzPzogc3RyaW5nO1xuICAvKiog44Oa44O844K45ZCN5p2h5Lu2ICovXG4gIG5hbWU/OiBzdHJpbmc7XG4gIC8qKiDjg5Xjg6vjg43jg7zjg6DvvIjlrozlhajkuIDoh7TvvIkgKi9cbiAgZnVsbG5hbWU/OiBzdHJpbmc7XG4gIC8qKiDnr4Tlm7LmjIflrpogKi9cbiAgcmFuZ2U/OiBzdHJpbmc7XG4gIC8qKiDjgr3jg7zjg4jpoIbvvIjkvos6ICdjcmVhdGVkX2F0IGRlc2Mn77yJICovXG4gIG9yZGVyPzogc3RyaW5nO1xuICAvKiog5Y+W5b6X6ZaL5aeL5L2N572uICovXG4gIG9mZnNldD86IG51bWJlcjtcbiAgLyoqIOWPluW+l+S7tuaVsOWItumZkCAqL1xuICBsaW1pdD86IG51bWJlcjtcbiAgLyoqIDHjg5rjg7zjgrjjgYLjgZ/jgorku7bmlbAgKi9cbiAgcGVyUGFnZT86IG51bWJlcjtcbiAgLyoqIOWAi+WIpeihqOekuiAqL1xuICBzZXBhcmF0ZT86IHN0cmluZztcbiAgLyoqIOODqeODg+ODkeODvOihqOekuiAqL1xuICB3cmFwcGVyPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIOODh+ODleOCqeODq+ODiOOBrjHjg5rjg7zjgrjjgYLjgZ/jgorku7bmlbBcbiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfUEVSX1BBR0UgPSAyNTA7XG5cbi8qKlxuICog44OH44OV44Kp44Or44OI44Gu44Oi44K444Ol44O844Or44Oc44OH44Kj44OV44Kj44O844Or44OJXG4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX01PRFVMRV9CT0RZID0gW1xuICAnZnVsbG5hbWUnLFxuICAnY2F0ZWdvcnknLFxuICAnbmFtZScsXG4gICd0aXRsZScsXG4gICdjcmVhdGVkX2F0JyxcbiAgJ2NyZWF0ZWRfYnlfbGlua2VkJyxcbiAgJ3VwZGF0ZWRfYXQnLFxuICAndXBkYXRlZF9ieV9saW5rZWQnLFxuICAnY29tbWVudGVkX2F0JyxcbiAgJ2NvbW1lbnRlZF9ieV9saW5rZWQnLFxuICAncGFyZW50X2Z1bGxuYW1lJyxcbiAgJ2NvbW1lbnRzJyxcbiAgJ3NpemUnLFxuICAnY2hpbGRyZW4nLFxuICAncmF0aW5nX3ZvdGVzJyxcbiAgJ3JhdGluZycsXG4gICdyYXRpbmdfcGVyY2VudCcsXG4gICdyZXZpc2lvbnMnLFxuICAndGFncycsXG4gICdfdGFncycsXG5dIGFzIGNvbnN0O1xuXG4vKipcbiAqIOODmuODvOOCuOaknOe0ouOCr+OCqOODqlxuICovXG5leHBvcnQgY2xhc3MgU2VhcmNoUGFnZXNRdWVyeSB7XG4gIC8qKiDjg5rjg7zjgrjjgr/jgqTjg5cgKi9cbiAgcGFnZXR5cGU6IHN0cmluZztcbiAgLyoqIOOCq+ODhuOCtOODqiAqL1xuICBjYXRlZ29yeTogc3RyaW5nO1xuICAvKiog44K/44KwICovXG4gIHRhZ3M6IHN0cmluZyB8IHN0cmluZ1tdIHwgbnVsbDtcbiAgLyoqIOimquODmuODvOOCuCAqL1xuICBwYXJlbnQ6IHN0cmluZyB8IG51bGw7XG4gIC8qKiDjg6rjg7Pjgq/lhYggKi9cbiAgbGlua1RvOiBzdHJpbmcgfCBudWxsO1xuICAvKiog5L2c5oiQ5pel5pmC5p2h5Lu2ICovXG4gIGNyZWF0ZWRBdDogc3RyaW5nIHwgbnVsbDtcbiAgLyoqIOabtOaWsOaXpeaZguadoeS7tiAqL1xuICB1cGRhdGVkQXQ6IHN0cmluZyB8IG51bGw7XG4gIC8qKiDkvZzmiJDogIUgKi9cbiAgY3JlYXRlZEJ5OiBBYnN0cmFjdFVzZXIgfCBzdHJpbmcgfCBudWxsO1xuICAvKiog44Os44O844OG44Kj44Oz44Kw5p2h5Lu2ICovXG4gIHJhdGluZzogc3RyaW5nIHwgbnVsbDtcbiAgLyoqIOaKleelqOaVsOadoeS7tiAqL1xuICB2b3Rlczogc3RyaW5nIHwgbnVsbDtcbiAgLyoqIOODmuODvOOCuOWQjeadoeS7tiAqL1xuICBuYW1lOiBzdHJpbmcgfCBudWxsO1xuICAvKiog44OV44Or44ON44O844Og5p2h5Lu2ICovXG4gIGZ1bGxuYW1lOiBzdHJpbmcgfCBudWxsO1xuICAvKiog56+E5ZuyICovXG4gIHJhbmdlOiBzdHJpbmcgfCBudWxsO1xuICAvKiog44K944O844OI6aCGICovXG4gIG9yZGVyOiBzdHJpbmc7XG4gIC8qKiDjgqrjg5Xjgrvjg4Pjg4ggKi9cbiAgb2Zmc2V0OiBudW1iZXI7XG4gIC8qKiDlj5blvpfku7bmlbDliLbpmZAgKi9cbiAgbGltaXQ6IG51bWJlciB8IG51bGw7XG4gIC8qKiAx44Oa44O844K444GC44Gf44KK5Lu25pWwICovXG4gIHBlclBhZ2U6IG51bWJlcjtcbiAgLyoqIOWAi+WIpeihqOekuiAqL1xuICBzZXBhcmF0ZTogc3RyaW5nO1xuICAvKiog44Op44OD44OR44O86KGo56S6ICovXG4gIHdyYXBwZXI6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihwYXJhbXM6IFNlYXJjaFBhZ2VzUXVlcnlQYXJhbXMgPSB7fSkge1xuICAgIHRoaXMucGFnZXR5cGUgPSBwYXJhbXMucGFnZXR5cGUgPz8gJyonO1xuICAgIHRoaXMuY2F0ZWdvcnkgPSBwYXJhbXMuY2F0ZWdvcnkgPz8gJyonO1xuICAgIHRoaXMudGFncyA9IHBhcmFtcy50YWdzID8/IG51bGw7XG4gICAgdGhpcy5wYXJlbnQgPSBwYXJhbXMucGFyZW50ID8/IG51bGw7XG4gICAgdGhpcy5saW5rVG8gPSBwYXJhbXMubGlua1RvID8/IG51bGw7XG4gICAgdGhpcy5jcmVhdGVkQXQgPSBwYXJhbXMuY3JlYXRlZEF0ID8/IG51bGw7XG4gICAgdGhpcy51cGRhdGVkQXQgPSBwYXJhbXMudXBkYXRlZEF0ID8/IG51bGw7XG4gICAgdGhpcy5jcmVhdGVkQnkgPSBwYXJhbXMuY3JlYXRlZEJ5ID8/IG51bGw7XG4gICAgdGhpcy5yYXRpbmcgPSBwYXJhbXMucmF0aW5nID8/IG51bGw7XG4gICAgdGhpcy52b3RlcyA9IHBhcmFtcy52b3RlcyA/PyBudWxsO1xuICAgIHRoaXMubmFtZSA9IHBhcmFtcy5uYW1lID8/IG51bGw7XG4gICAgdGhpcy5mdWxsbmFtZSA9IHBhcmFtcy5mdWxsbmFtZSA/PyBudWxsO1xuICAgIHRoaXMucmFuZ2UgPSBwYXJhbXMucmFuZ2UgPz8gbnVsbDtcbiAgICB0aGlzLm9yZGVyID0gcGFyYW1zLm9yZGVyID8/ICdjcmVhdGVkX2F0IGRlc2MnO1xuICAgIHRoaXMub2Zmc2V0ID0gcGFyYW1zLm9mZnNldCA/PyAwO1xuICAgIHRoaXMubGltaXQgPSBwYXJhbXMubGltaXQgPz8gbnVsbDtcbiAgICB0aGlzLnBlclBhZ2UgPSBwYXJhbXMucGVyUGFnZSA/PyBERUZBVUxUX1BFUl9QQUdFO1xuICAgIHRoaXMuc2VwYXJhdGUgPSBwYXJhbXMuc2VwYXJhdGUgPz8gJ25vJztcbiAgICB0aGlzLndyYXBwZXIgPSBwYXJhbXMud3JhcHBlciA/PyAnbm8nO1xuICB9XG5cbiAgLyoqXG4gICAqIOi+nuabuOW9ouW8j+OBq+WkieaPm1xuICAgKi9cbiAgYXNEaWN0KCk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgICBjb25zdCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG5cbiAgICBpZiAodGhpcy5wYWdldHlwZSAhPT0gJyonKSByZXN1bHQucGFnZXR5cGUgPSB0aGlzLnBhZ2V0eXBlO1xuICAgIGlmICh0aGlzLmNhdGVnb3J5ICE9PSAnKicpIHJlc3VsdC5jYXRlZ29yeSA9IHRoaXMuY2F0ZWdvcnk7XG4gICAgaWYgKHRoaXMudGFncyAhPT0gbnVsbCkge1xuICAgICAgcmVzdWx0LnRhZ3MgPSBBcnJheS5pc0FycmF5KHRoaXMudGFncykgPyB0aGlzLnRhZ3Muam9pbignICcpIDogdGhpcy50YWdzO1xuICAgIH1cbiAgICBpZiAodGhpcy5wYXJlbnQgIT09IG51bGwpIHJlc3VsdC5wYXJlbnQgPSB0aGlzLnBhcmVudDtcbiAgICBpZiAodGhpcy5saW5rVG8gIT09IG51bGwpIHJlc3VsdC5saW5rX3RvID0gdGhpcy5saW5rVG87XG4gICAgaWYgKHRoaXMuY3JlYXRlZEF0ICE9PSBudWxsKSByZXN1bHQuY3JlYXRlZF9hdCA9IHRoaXMuY3JlYXRlZEF0O1xuICAgIGlmICh0aGlzLnVwZGF0ZWRBdCAhPT0gbnVsbCkgcmVzdWx0LnVwZGF0ZWRfYXQgPSB0aGlzLnVwZGF0ZWRBdDtcbiAgICBpZiAodGhpcy5jcmVhdGVkQnkgIT09IG51bGwpIHtcbiAgICAgIHJlc3VsdC5jcmVhdGVkX2J5ID0gdHlwZW9mIHRoaXMuY3JlYXRlZEJ5ID09PSAnc3RyaW5nJyA/IHRoaXMuY3JlYXRlZEJ5IDogdGhpcy5jcmVhdGVkQnkubmFtZTtcbiAgICB9XG4gICAgaWYgKHRoaXMucmF0aW5nICE9PSBudWxsKSByZXN1bHQucmF0aW5nID0gdGhpcy5yYXRpbmc7XG4gICAgaWYgKHRoaXMudm90ZXMgIT09IG51bGwpIHJlc3VsdC52b3RlcyA9IHRoaXMudm90ZXM7XG4gICAgaWYgKHRoaXMubmFtZSAhPT0gbnVsbCkgcmVzdWx0Lm5hbWUgPSB0aGlzLm5hbWU7XG4gICAgaWYgKHRoaXMuZnVsbG5hbWUgIT09IG51bGwpIHJlc3VsdC5mdWxsbmFtZSA9IHRoaXMuZnVsbG5hbWU7XG4gICAgaWYgKHRoaXMucmFuZ2UgIT09IG51bGwpIHJlc3VsdC5yYW5nZSA9IHRoaXMucmFuZ2U7XG5cbiAgICByZXN1bHQub3JkZXIgPSB0aGlzLm9yZGVyO1xuICAgIHJlc3VsdC5vZmZzZXQgPSB0aGlzLm9mZnNldDtcbiAgICBpZiAodGhpcy5saW1pdCAhPT0gbnVsbCkgcmVzdWx0LmxpbWl0ID0gdGhpcy5saW1pdDtcbiAgICByZXN1bHQucGVyUGFnZSA9IHRoaXMucGVyUGFnZTtcbiAgICByZXN1bHQuc2VwYXJhdGUgPSB0aGlzLnNlcGFyYXRlO1xuICAgIHJlc3VsdC53cmFwcGVyID0gdGhpcy53cmFwcGVyO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuIiwKICAgICJpbXBvcnQgKiBhcyBjaGVlcmlvIGZyb20gJ2NoZWVyaW8nO1xuaW1wb3J0IHsgTm9FbGVtZW50RXJyb3IsIFVuZXhwZWN0ZWRFcnJvciB9IGZyb20gJy4uLy4uL2NvbW1vbi9lcnJvcnMnO1xuaW1wb3J0IHsgZnJvbVByb21pc2UsIHR5cGUgV2lraWRvdFJlc3VsdEFzeW5jIH0gZnJvbSAnLi4vLi4vY29tbW9uL3R5cGVzJztcbmltcG9ydCB7IHBhcnNlT2RhdGUsIHBhcnNlVXNlciB9IGZyb20gJy4uLy4uL3V0aWwvcGFyc2VyJztcbmltcG9ydCB0eXBlIHsgU2l0ZSB9IGZyb20gJy4uL3NpdGUnO1xuaW1wb3J0IHR5cGUgeyBBYnN0cmFjdFVzZXIgfSBmcm9tICcuLi91c2VyJztcblxuLyoqXG4gKiDjgrXjgqTjg4jlpInmm7TlsaXmrbTjg4fjg7zjgr9cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTaXRlQ2hhbmdlRGF0YSB7XG4gIHNpdGU6IFNpdGU7XG4gIHBhZ2VGdWxsbmFtZTogc3RyaW5nO1xuICBwYWdlVGl0bGU6IHN0cmluZztcbiAgcmV2aXNpb25ObzogbnVtYmVyO1xuICBjaGFuZ2VkQnk6IEFic3RyYWN0VXNlciB8IG51bGw7XG4gIGNoYW5nZWRBdDogRGF0ZSB8IG51bGw7XG4gIGZsYWdzOiBzdHJpbmdbXTtcbiAgY29tbWVudDogc3RyaW5nO1xufVxuXG4vKipcbiAqIOOCteOCpOODiOWkieabtOWxpeattFxuICovXG5leHBvcnQgY2xhc3MgU2l0ZUNoYW5nZSB7XG4gIHB1YmxpYyByZWFkb25seSBzaXRlOiBTaXRlO1xuICBwdWJsaWMgcmVhZG9ubHkgcGFnZUZ1bGxuYW1lOiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSBwYWdlVGl0bGU6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IHJldmlzaW9uTm86IG51bWJlcjtcbiAgcHVibGljIHJlYWRvbmx5IGNoYW5nZWRCeTogQWJzdHJhY3RVc2VyIHwgbnVsbDtcbiAgcHVibGljIHJlYWRvbmx5IGNoYW5nZWRBdDogRGF0ZSB8IG51bGw7XG4gIHB1YmxpYyByZWFkb25seSBmbGFnczogc3RyaW5nW107XG4gIHB1YmxpYyByZWFkb25seSBjb21tZW50OiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoZGF0YTogU2l0ZUNoYW5nZURhdGEpIHtcbiAgICB0aGlzLnNpdGUgPSBkYXRhLnNpdGU7XG4gICAgdGhpcy5wYWdlRnVsbG5hbWUgPSBkYXRhLnBhZ2VGdWxsbmFtZTtcbiAgICB0aGlzLnBhZ2VUaXRsZSA9IGRhdGEucGFnZVRpdGxlO1xuICAgIHRoaXMucmV2aXNpb25ObyA9IGRhdGEucmV2aXNpb25ObztcbiAgICB0aGlzLmNoYW5nZWRCeSA9IGRhdGEuY2hhbmdlZEJ5O1xuICAgIHRoaXMuY2hhbmdlZEF0ID0gZGF0YS5jaGFuZ2VkQXQ7XG4gICAgdGhpcy5mbGFncyA9IGRhdGEuZmxhZ3M7XG4gICAgdGhpcy5jb21tZW50ID0gZGF0YS5jb21tZW50O1xuICB9XG5cbiAgLyoqXG4gICAqIOODmuODvOOCuFVSTFxuICAgKi9cbiAgZ2V0UGFnZVVybCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLnNpdGUuZ2V0QmFzZVVybCgpfS8ke3RoaXMucGFnZUZ1bGxuYW1lfWA7XG4gIH1cblxuICB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiBgU2l0ZUNoYW5nZShwYWdlPSR7dGhpcy5wYWdlRnVsbG5hbWV9LCByZXY9JHt0aGlzLnJldmlzaW9uTm99LCBieT0ke3RoaXMuY2hhbmdlZEJ5fSlgO1xuICB9XG59XG5cbi8qKlxuICog44K144Kk44OI5aSJ5pu05bGl5q2044Kz44Os44Kv44K344On44OzXG4gKi9cbmV4cG9ydCBjbGFzcyBTaXRlQ2hhbmdlQ29sbGVjdGlvbiBleHRlbmRzIEFycmF5PFNpdGVDaGFuZ2U+IHtcbiAgcHVibGljIHJlYWRvbmx5IHNpdGU6IFNpdGU7XG5cbiAgY29uc3RydWN0b3Ioc2l0ZTogU2l0ZSwgY2hhbmdlcz86IFNpdGVDaGFuZ2VbXSkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5zaXRlID0gc2l0ZTtcbiAgICBpZiAoY2hhbmdlcykge1xuICAgICAgdGhpcy5wdXNoKC4uLmNoYW5nZXMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDmnIDov5Hjga7lpInmm7TlsaXmrbTjgpLlj5blvpfjgZnjgotcbiAgICogQHBhcmFtIHNpdGUgLSDjgrXjgqTjg4hcbiAgICogQHBhcmFtIG9wdGlvbnMgLSDjgqrjg5fjgrfjg6fjg7NcbiAgICogQHJldHVybnMg5aSJ5pu05bGl5q2044Kz44Os44Kv44K344On44OzXG4gICAqL1xuICBzdGF0aWMgYWNxdWlyZShcbiAgICBzaXRlOiBTaXRlLFxuICAgIG9wdGlvbnM/OiB7IHBlclBhZ2U/OiBudW1iZXI7IHBhZ2U/OiBudW1iZXI7IGxpbWl0PzogbnVtYmVyIH1cbiAgKTogV2lraWRvdFJlc3VsdEFzeW5jPFNpdGVDaGFuZ2VDb2xsZWN0aW9uPiB7XG4gICAgY29uc3QgcGVyUGFnZSA9IG9wdGlvbnM/LnBlclBhZ2UgPz8gMjA7XG4gICAgY29uc3QgcGFnZSA9IG9wdGlvbnM/LnBhZ2UgPz8gMTtcbiAgICBjb25zdCBsaW1pdCA9IG9wdGlvbnM/LmxpbWl0O1xuXG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc2l0ZS5hbWNSZXF1ZXN0KFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBtb2R1bGVOYW1lOiAnY2hhbmdlcy9TaXRlQ2hhbmdlc0xpc3RNb2R1bGUnLFxuICAgICAgICAgICAgcGVycGFnZTogcGVyUGFnZSxcbiAgICAgICAgICAgIHBhZ2U6IHBhZ2UsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSk7XG5cbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSByZXN1bHQudmFsdWVbMF07XG4gICAgICAgIGlmICghcmVzcG9uc2UpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgTm9FbGVtZW50RXJyb3IoJ0VtcHR5IHJlc3BvbnNlJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBodG1sID0gU3RyaW5nKHJlc3BvbnNlLmJvZHkgPz8gJycpO1xuICAgICAgICBjb25zdCAkID0gY2hlZXJpby5sb2FkKGh0bWwpO1xuICAgICAgICBjb25zdCBjaGFuZ2VzOiBTaXRlQ2hhbmdlW10gPSBbXTtcblxuICAgICAgICAvLyDjg4bjg7zjg5bjg6vooYzjgpLjg5Hjg7zjgrlcbiAgICAgICAgJCgndGFibGUud2lraS1jb250ZW50LXRhYmxlIHRyJykuZWFjaCgoX2ksIGVsZW0pID0+IHtcbiAgICAgICAgICBjb25zdCAkcm93ID0gJChlbGVtKTtcbiAgICAgICAgICBjb25zdCAkY2VsbHMgPSAkcm93LmZpbmQoJ3RkJyk7XG4gICAgICAgICAgaWYgKCRjZWxscy5sZW5ndGggPCA0KSByZXR1cm47XG5cbiAgICAgICAgICAvLyDjg5rjg7zjgrjjg6rjg7Pjgq9cbiAgICAgICAgICBjb25zdCBwYWdlTGluayA9ICQoJGNlbGxzWzBdKS5maW5kKCdhJyk7XG4gICAgICAgICAgY29uc3QgaHJlZiA9IHBhZ2VMaW5rLmF0dHIoJ2hyZWYnKSA/PyAnJztcbiAgICAgICAgICBjb25zdCBwYWdlRnVsbG5hbWUgPSBocmVmLnJlcGxhY2UoL15cXC8vLCAnJykuc3BsaXQoJy8nKVswXSA/PyAnJztcbiAgICAgICAgICBjb25zdCBwYWdlVGl0bGUgPSBwYWdlTGluay50ZXh0KCkudHJpbSgpO1xuXG4gICAgICAgICAgLy8g44Oq44OT44K444On44Oz55Wq5Y+3XG4gICAgICAgICAgY29uc3QgcmV2VGV4dCA9ICQoJGNlbGxzWzFdKS50ZXh0KCkudHJpbSgpO1xuICAgICAgICAgIGNvbnN0IHJldk1hdGNoID0gcmV2VGV4dC5tYXRjaCgvKFxcZCspLyk7XG4gICAgICAgICAgY29uc3QgcmV2aXNpb25ObyA9IHJldk1hdGNoPy5bMV0gPyBOdW1iZXIucGFyc2VJbnQocmV2TWF0Y2hbMV0sIDEwKSA6IDA7XG5cbiAgICAgICAgICAvLyDjg5Xjg6njgrBcbiAgICAgICAgICBjb25zdCBmbGFnc0NlbGwgPSAkKCRjZWxsc1syXSk7XG4gICAgICAgICAgY29uc3QgZmxhZ3M6IHN0cmluZ1tdID0gW107XG4gICAgICAgICAgZmxhZ3NDZWxsLmZpbmQoJ3NwYW4nKS5lYWNoKChfaiwgZmxhZ0VsZW0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGZsYWdDbGFzcyA9ICQoZmxhZ0VsZW0pLmF0dHIoJ2NsYXNzJykgPz8gJyc7XG4gICAgICAgICAgICBpZiAoZmxhZ0NsYXNzLmluY2x1ZGVzKCdzcGFudGlwJykpIHtcbiAgICAgICAgICAgICAgY29uc3QgdGl0bGUgPSAkKGZsYWdFbGVtKS5hdHRyKCd0aXRsZScpID8/ICcnO1xuICAgICAgICAgICAgICBpZiAodGl0bGUpIGZsYWdzLnB1c2godGl0bGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgLy8g44Om44O844K244O844Go5pel5pmCXG4gICAgICAgICAgY29uc3QgaW5mb0NlbGwgPSAkKCRjZWxsc1szXSk7XG4gICAgICAgICAgY29uc3QgdXNlckVsZW0gPSBpbmZvQ2VsbC5maW5kKCdzcGFuLnByaW50dXNlcicpO1xuICAgICAgICAgIGNvbnN0IGNoYW5nZWRCeSA9IHVzZXJFbGVtLmxlbmd0aCA+IDAgPyBwYXJzZVVzZXIoc2l0ZS5jbGllbnQsIHVzZXJFbGVtKSA6IG51bGw7XG5cbiAgICAgICAgICBjb25zdCBvZGF0ZUVsZW0gPSBpbmZvQ2VsbC5maW5kKCdzcGFuLm9kYXRlJyk7XG4gICAgICAgICAgY29uc3QgY2hhbmdlZEF0ID0gb2RhdGVFbGVtLmxlbmd0aCA+IDAgPyBwYXJzZU9kYXRlKG9kYXRlRWxlbSkgOiBudWxsO1xuXG4gICAgICAgICAgLy8g44Kz44Oh44Oz44OIXG4gICAgICAgICAgY29uc3QgY29tbWVudEVsZW0gPSBpbmZvQ2VsbC5maW5kKCdzcGFuLmNvbW1lbnRzJyk7XG4gICAgICAgICAgY29uc3QgY29tbWVudCA9IGNvbW1lbnRFbGVtXG4gICAgICAgICAgICAudGV4dCgpXG4gICAgICAgICAgICAudHJpbSgpXG4gICAgICAgICAgICAucmVwbGFjZSgvXltcIlwiXXxbXCJcIl0kL2csICcnKTtcblxuICAgICAgICAgIGNoYW5nZXMucHVzaChcbiAgICAgICAgICAgIG5ldyBTaXRlQ2hhbmdlKHtcbiAgICAgICAgICAgICAgc2l0ZSxcbiAgICAgICAgICAgICAgcGFnZUZ1bGxuYW1lLFxuICAgICAgICAgICAgICBwYWdlVGl0bGUsXG4gICAgICAgICAgICAgIHJldmlzaW9uTm8sXG4gICAgICAgICAgICAgIGNoYW5nZWRCeSxcbiAgICAgICAgICAgICAgY2hhbmdlZEF0LFxuICAgICAgICAgICAgICBmbGFncyxcbiAgICAgICAgICAgICAgY29tbWVudCxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gbGltaXTjgYzmjIflrprjgZXjgozjgabjgYTjgovloLTlkIjjga/ntZDmnpzjgpLliLbpmZBcbiAgICAgICAgY29uc3QgbGltaXRlZENoYW5nZXMgPSBsaW1pdCAhPT0gdW5kZWZpbmVkID8gY2hhbmdlcy5zbGljZSgwLCBsaW1pdCkgOiBjaGFuZ2VzO1xuICAgICAgICByZXR1cm4gbmV3IFNpdGVDaGFuZ2VDb2xsZWN0aW9uKHNpdGUsIGxpbWl0ZWRDaGFuZ2VzKTtcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgTm9FbGVtZW50RXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBhY3F1aXJlIHNpdGUgY2hhbmdlczogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cbn1cbiIsCiAgICAiaW1wb3J0IHsgVW5leHBlY3RlZEVycm9yIH0gZnJvbSAnLi4vLi4vLi4vY29tbW9uL2Vycm9ycyc7XG5pbXBvcnQgeyBmcm9tUHJvbWlzZSwgdHlwZSBXaWtpZG90UmVzdWx0QXN5bmMgfSBmcm9tICcuLi8uLi8uLi9jb21tb24vdHlwZXMnO1xuaW1wb3J0IHsgcGFyc2VVc2VyIH0gZnJvbSAnLi4vLi4vLi4vdXRpbC9wYXJzZXInO1xuaW1wb3J0IHtcbiAgUGFnZSxcbiAgUGFnZUNvbGxlY3Rpb24sXG4gIFNlYXJjaFBhZ2VzUXVlcnksXG4gIHR5cGUgU2VhcmNoUGFnZXNRdWVyeVBhcmFtcyxcbiAgU2l0ZUNoYW5nZUNvbGxlY3Rpb24sXG59IGZyb20gJy4uLy4uL3BhZ2UnO1xuaW1wb3J0IHR5cGUgeyBTaXRlIH0gZnJvbSAnLi4vc2l0ZSc7XG5cbi8qKlxuICog44Oa44O844K45LiA6Kan5pON5L2c44Ki44Kv44K744K1XG4gKi9cbmV4cG9ydCBjbGFzcyBQYWdlc0FjY2Vzc29yIHtcbiAgcHVibGljIHJlYWRvbmx5IHNpdGU6IFNpdGU7XG5cbiAgY29uc3RydWN0b3Ioc2l0ZTogU2l0ZSkge1xuICAgIHRoaXMuc2l0ZSA9IHNpdGU7XG4gIH1cblxuICAvKipcbiAgICog5p2h5Lu244Gr5ZCI44GG44Oa44O844K444KS5qSc57Si44GZ44KLXG4gICAqIEBwYXJhbSBwYXJhbXMgLSDmpJzntKLmnaHku7ZcbiAgICogQHJldHVybnMg44Oa44O844K444Kz44Os44Kv44K344On44OzXG4gICAqL1xuICBzZWFyY2gocGFyYW1zPzogU2VhcmNoUGFnZXNRdWVyeVBhcmFtcyk6IFdpa2lkb3RSZXN1bHRBc3luYzxQYWdlQ29sbGVjdGlvbj4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHF1ZXJ5ID0gbmV3IFNlYXJjaFBhZ2VzUXVlcnkocGFyYW1zKTtcbiAgICAgICAgY29uc3QgdXNlclBhcnNlciA9IHBhcnNlVXNlci5iaW5kKG51bGwsIHRoaXMuc2l0ZS5jbGllbnQpO1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IFBhZ2VDb2xsZWN0aW9uLnNlYXJjaFBhZ2VzKHRoaXMuc2l0ZSwgdXNlclBhcnNlciwgcXVlcnkpO1xuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0LnZhbHVlO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIHNlYXJjaCBwYWdlczogJHtTdHJpbmcoZXJyb3IpfWApXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDlhajjg5rjg7zjgrjjgpLlj5blvpfjgZnjgotcbiAgICogQHJldHVybnMg44Oa44O844K444Kz44Os44Kv44K344On44OzXG4gICAqL1xuICBhbGwoKTogV2lraWRvdFJlc3VsdEFzeW5jPFBhZ2VDb2xsZWN0aW9uPiB7XG4gICAgcmV0dXJuIHRoaXMuc2VhcmNoKHt9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmnIDov5Hjga7lpInmm7TlsaXmrbTjgpLlj5blvpfjgZnjgotcbiAgICogQHBhcmFtIG9wdGlvbnMgLSDjgqrjg5fjgrfjg6fjg7NcbiAgICogQHBhcmFtIG9wdGlvbnMucGVyUGFnZSAtIDHjg5rjg7zjgrjjgYLjgZ/jgorjga7ku7bmlbDvvIjjg4fjg5Xjgqnjg6vjg4g6IDIw77yJXG4gICAqIEBwYXJhbSBvcHRpb25zLnBhZ2UgLSDjg5rjg7zjgrjnlarlj7fvvIjjg4fjg5Xjgqnjg6vjg4g6IDHvvIlcbiAgICogQHJldHVybnMg5aSJ5pu05bGl5q2044Kz44Os44Kv44K344On44OzXG4gICAqL1xuICBnZXRSZWNlbnRDaGFuZ2VzKG9wdGlvbnM/OiB7XG4gICAgcGVyUGFnZT86IG51bWJlcjtcbiAgICBwYWdlPzogbnVtYmVyO1xuICB9KTogV2lraWRvdFJlc3VsdEFzeW5jPFNpdGVDaGFuZ2VDb2xsZWN0aW9uPiB7XG4gICAgcmV0dXJuIFNpdGVDaGFuZ2VDb2xsZWN0aW9uLmFjcXVpcmUodGhpcy5zaXRlLCBvcHRpb25zKTtcbiAgfVxufVxuXG5leHBvcnQge1xuICBQYWdlLFxuICBQYWdlQ29sbGVjdGlvbixcbiAgU2VhcmNoUGFnZXNRdWVyeSxcbiAgU2l0ZUNoYW5nZUNvbGxlY3Rpb24sXG4gIHR5cGUgU2VhcmNoUGFnZXNRdWVyeVBhcmFtcyxcbn07XG4iLAogICAgImltcG9ydCAqIGFzIGNoZWVyaW8gZnJvbSAnY2hlZXJpbyc7XG5pbXBvcnQgeyBOb0VsZW1lbnRFcnJvciwgTm90Rm91bmRFeGNlcHRpb24sIFVuZXhwZWN0ZWRFcnJvciB9IGZyb20gJy4uLy4uL2NvbW1vbi9lcnJvcnMnO1xuaW1wb3J0IHsgZnJvbVByb21pc2UsIHR5cGUgV2lraWRvdFJlc3VsdEFzeW5jIH0gZnJvbSAnLi4vLi4vY29tbW9uL3R5cGVzJztcbmltcG9ydCB0eXBlIHsgQU1DUmVxdWVzdEJvZHksIEFNQ1Jlc3BvbnNlIH0gZnJvbSAnLi4vLi4vY29ubmVjdG9yJztcbmltcG9ydCB0eXBlIHsgQ2xpZW50IH0gZnJvbSAnLi4vY2xpZW50L2NsaWVudCc7XG5pbXBvcnQgeyBGb3J1bUFjY2Vzc29yIH0gZnJvbSAnLi9hY2Nlc3NvcnMvZm9ydW0tYWNjZXNzb3InO1xuaW1wb3J0IHsgTWVtYmVyQWNjZXNzb3IgfSBmcm9tICcuL2FjY2Vzc29ycy9tZW1iZXItYWNjZXNzb3InO1xuaW1wb3J0IHsgUGFnZUFjY2Vzc29yIH0gZnJvbSAnLi9hY2Nlc3NvcnMvcGFnZS1hY2Nlc3Nvcic7XG5pbXBvcnQgeyBQYWdlc0FjY2Vzc29yIH0gZnJvbSAnLi9hY2Nlc3NvcnMvcGFnZXMtYWNjZXNzb3InO1xuXG4vKipcbiAqIOOCteOCpOODiOODh+ODvOOCv1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFNpdGVEYXRhIHtcbiAgaWQ6IG51bWJlcjtcbiAgdGl0bGU6IHN0cmluZztcbiAgdW5peE5hbWU6IHN0cmluZztcbiAgZG9tYWluOiBzdHJpbmc7XG4gIHNzbFN1cHBvcnRlZDogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiDjgrXjgqTjg4jjgq/jg6njgrlcbiAqL1xuZXhwb3J0IGNsYXNzIFNpdGUge1xuICBwdWJsaWMgcmVhZG9ubHkgY2xpZW50OiBDbGllbnQ7XG5cbiAgLyoqIOOCteOCpOODiElEICovXG4gIHB1YmxpYyByZWFkb25seSBpZDogbnVtYmVyO1xuXG4gIC8qKiDjgrXjgqTjg4jjgr/jgqTjg4jjg6sgKi9cbiAgcHVibGljIHJlYWRvbmx5IHRpdGxlOiBzdHJpbmc7XG5cbiAgLyoqIFVOSVjlkI3vvIjkvos6IHNjcC1qcO+8iSAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdW5peE5hbWU6IHN0cmluZztcblxuICAvKiog44OJ44Oh44Kk44OzICovXG4gIHB1YmxpYyByZWFkb25seSBkb21haW46IHN0cmluZztcblxuICAvKiogU1NM5a++5b+c44OV44Op44KwICovXG4gIHB1YmxpYyByZWFkb25seSBzc2xTdXBwb3J0ZWQ6IGJvb2xlYW47XG5cbiAgLyoqIOODmuODvOOCuOOCouOCr+OCu+OCtSAqL1xuICBwcml2YXRlIF9wYWdlOiBQYWdlQWNjZXNzb3IgfCBudWxsID0gbnVsbDtcblxuICAvKiog44Oa44O844K45LiA6Kan44Ki44Kv44K744K1ICovXG4gIHByaXZhdGUgX3BhZ2VzOiBQYWdlc0FjY2Vzc29yIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqIOODleOCqeODvOODqeODoOOCouOCr+OCu+OCtSAqL1xuICBwcml2YXRlIF9mb3J1bTogRm9ydW1BY2Nlc3NvciB8IG51bGwgPSBudWxsO1xuXG4gIC8qKiDjg6Hjg7Pjg5Djg7zjgqLjgq/jgrvjgrUgKi9cbiAgcHJpdmF0ZSBfbWVtYmVyOiBNZW1iZXJBY2Nlc3NvciB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKGNsaWVudDogQ2xpZW50LCBkYXRhOiBTaXRlRGF0YSkge1xuICAgIHRoaXMuY2xpZW50ID0gY2xpZW50O1xuICAgIHRoaXMuaWQgPSBkYXRhLmlkO1xuICAgIHRoaXMudGl0bGUgPSBkYXRhLnRpdGxlO1xuICAgIHRoaXMudW5peE5hbWUgPSBkYXRhLnVuaXhOYW1lO1xuICAgIHRoaXMuZG9tYWluID0gZGF0YS5kb21haW47XG4gICAgdGhpcy5zc2xTdXBwb3J0ZWQgPSBkYXRhLnNzbFN1cHBvcnRlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiDjg5rjg7zjgrjjgqLjgq/jgrvjgrXjgpLlj5blvpdcbiAgICovXG4gIGdldCBwYWdlKCk6IFBhZ2VBY2Nlc3NvciB7XG4gICAgaWYgKCF0aGlzLl9wYWdlKSB7XG4gICAgICB0aGlzLl9wYWdlID0gbmV3IFBhZ2VBY2Nlc3Nvcih0aGlzKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3BhZ2U7XG4gIH1cblxuICAvKipcbiAgICog44Oa44O844K45LiA6Kan44Ki44Kv44K744K144KS5Y+W5b6XXG4gICAqL1xuICBnZXQgcGFnZXMoKTogUGFnZXNBY2Nlc3NvciB7XG4gICAgaWYgKCF0aGlzLl9wYWdlcykge1xuICAgICAgdGhpcy5fcGFnZXMgPSBuZXcgUGFnZXNBY2Nlc3Nvcih0aGlzKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3BhZ2VzO1xuICB9XG5cbiAgLyoqXG4gICAqIOODleOCqeODvOODqeODoOOCouOCr+OCu+OCteOCkuWPluW+l1xuICAgKi9cbiAgZ2V0IGZvcnVtKCk6IEZvcnVtQWNjZXNzb3Ige1xuICAgIGlmICghdGhpcy5fZm9ydW0pIHtcbiAgICAgIHRoaXMuX2ZvcnVtID0gbmV3IEZvcnVtQWNjZXNzb3IodGhpcyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9mb3J1bTtcbiAgfVxuXG4gIC8qKlxuICAgKiDjg6Hjg7Pjg5Djg7zjgqLjgq/jgrvjgrXjgpLlj5blvpdcbiAgICovXG4gIGdldCBtZW1iZXIoKTogTWVtYmVyQWNjZXNzb3Ige1xuICAgIGlmICghdGhpcy5fbWVtYmVyKSB7XG4gICAgICB0aGlzLl9tZW1iZXIgPSBuZXcgTWVtYmVyQWNjZXNzb3IodGhpcyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9tZW1iZXI7XG4gIH1cblxuICAvKipcbiAgICog44K144Kk44OI44Gu44OZ44O844K5VVJM44KS5Y+W5b6XXG4gICAqL1xuICBnZXRCYXNlVXJsKCk6IHN0cmluZyB7XG4gICAgY29uc3QgcHJvdG9jb2wgPSB0aGlzLnNzbFN1cHBvcnRlZCA/ICdodHRwcycgOiAnaHR0cCc7XG4gICAgcmV0dXJuIGAke3Byb3RvY29sfTovLyR7dGhpcy5kb21haW59YDtcbiAgfVxuXG4gIC8qKlxuICAgKiDjgrXjgqTjg4jjgbjjga5BTUPjg6rjgq/jgqjjgrnjg4jjgpLlrp/ooYxcbiAgICogQHBhcmFtIGJvZGllcyAtIOODquOCr+OCqOOCueODiOODnOODh+OCo+mFjeWIl1xuICAgKiBAcmV0dXJucyBBTUPjg6zjgrnjg53jg7PjgrnphY3liJdcbiAgICovXG4gIGFtY1JlcXVlc3QoYm9kaWVzOiBBTUNSZXF1ZXN0Qm9keVtdKTogV2lraWRvdFJlc3VsdEFzeW5jPEFNQ1Jlc3BvbnNlW10+IHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQuYW1jQ2xpZW50LnJlcXVlc3QoYm9kaWVzLCB0aGlzLnVuaXhOYW1lLCB0aGlzLnNzbFN1cHBvcnRlZCk7XG4gIH1cblxuICAvKipcbiAgICog5Y2Y5LiA44GuQU1D44Oq44Kv44Ko44K544OI44KS5a6f6KGMXG4gICAqIEBwYXJhbSBib2R5IC0g44Oq44Kv44Ko44K544OI44Oc44OH44KjXG4gICAqIEByZXR1cm5zIEFNQ+ODrOOCueODneODs+OCuVxuICAgKi9cbiAgYW1jUmVxdWVzdFNpbmdsZShib2R5OiBBTUNSZXF1ZXN0Qm9keSk6IFdpa2lkb3RSZXN1bHRBc3luYzxBTUNSZXNwb25zZT4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuYW1jUmVxdWVzdChbYm9keV0pO1xuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSByZXN1bHQudmFsdWVbMF07XG4gICAgICAgIGlmICghcmVzcG9uc2UpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZEVycm9yKCdBTUMgcmVxdWVzdCByZXR1cm5lZCBlbXB0eSByZXNwb25zZScpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgVW5leHBlY3RlZEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBBTUMgcmVxdWVzdCBmYWlsZWQ6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFVOSVjlkI3jgYvjgonjgrXjgqTjg4jjgpLlj5blvpfjgZnjgotcbiAgICogQHBhcmFtIGNsaWVudCAtIOOCr+ODqeOCpOOCouODs+ODiFxuICAgKiBAcGFyYW0gdW5peE5hbWUgLSDjgrXjgqTjg4jjga5VTklY5ZCN77yI5L6LOiAnc2NwLWpwJ++8iVxuICAgKiBAcmV0dXJucyDjgrXjgqTjg4hcbiAgICovXG4gIHN0YXRpYyBmcm9tVW5peE5hbWUoY2xpZW50OiBDbGllbnQsIHVuaXhOYW1lOiBzdHJpbmcpOiBXaWtpZG90UmVzdWx0QXN5bmM8U2l0ZT4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIC8vIOOCteOCpOODiOODmuODvOOCuOOCkuWPluW+l++8iEhUVFDjgafjg6rjgq/jgqjjgrnjg4jjgZfjgIHjg6rjg4DjgqTjg6zjgq/jg4jjgavlvpPjgYbvvIlcbiAgICAgICAgY29uc3QgdXJsID0gYGh0dHA6Ly8ke3VuaXhOYW1lfS53aWtpZG90LmNvbWA7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7XG4gICAgICAgICAgaGVhZGVyczogY2xpZW50LmFtY0NsaWVudC5oZWFkZXIuZ2V0SGVhZGVycygpLFxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgTm90Rm91bmRFeGNlcHRpb24oYFNpdGUgbm90IGZvdW5kOiAke3VuaXhOYW1lfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gZmV0Y2ggc2l0ZTogJHtyZXNwb25zZS5zdGF0dXN9YCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBodG1sID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xuICAgICAgICBjb25zdCAkID0gY2hlZXJpby5sb2FkKGh0bWwpO1xuXG4gICAgICAgIC8vIFdJS0lSRVFVRVNULmluZm8g44KS6Kej5p6QXG4gICAgICAgIGNvbnN0IHNjcmlwdHMgPSAkKCdzY3JpcHQnKS50b0FycmF5KCk7XG4gICAgICAgIGxldCBzaXRlSWQ6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICAgICAgICBsZXQgc2l0ZVVuaXhOYW1lOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgICAgICAgbGV0IGRvbWFpbjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gICAgICAgIGxldCB0aXRsZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgICAgICAgZm9yIChjb25zdCBzY3JpcHQgb2Ygc2NyaXB0cykge1xuICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSAkKHNjcmlwdCkuaHRtbCgpO1xuICAgICAgICAgIGlmICghY29udGVudCB8fCAhY29udGVudC5pbmNsdWRlcygnV0lLSVJFUVVFU1QnKSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gc2l0ZUlkXG4gICAgICAgICAgY29uc3Qgc2l0ZUlkTWF0Y2ggPSBjb250ZW50Lm1hdGNoKC9XSUtJUkVRVUVTVFxcLmluZm9cXC5zaXRlSWRcXHMqPVxccyooXFxkKykvKTtcbiAgICAgICAgICBpZiAoc2l0ZUlkTWF0Y2g/LlsxXSkge1xuICAgICAgICAgICAgc2l0ZUlkID0gTnVtYmVyLnBhcnNlSW50KHNpdGVJZE1hdGNoWzFdLCAxMCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gc2l0ZVVuaXhOYW1lXG4gICAgICAgICAgY29uc3Qgc2l0ZVVuaXhOYW1lTWF0Y2ggPSBjb250ZW50Lm1hdGNoKFxuICAgICAgICAgICAgL1dJS0lSRVFVRVNUXFwuaW5mb1xcLnNpdGVVbml4TmFtZVxccyo9XFxzKltcIiddKFteXCInXSspW1wiJ10vXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoc2l0ZVVuaXhOYW1lTWF0Y2g/LlsxXSkge1xuICAgICAgICAgICAgc2l0ZVVuaXhOYW1lID0gc2l0ZVVuaXhOYW1lTWF0Y2hbMV07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gZG9tYWluXG4gICAgICAgICAgY29uc3QgZG9tYWluTWF0Y2ggPSBjb250ZW50Lm1hdGNoKC9XSUtJUkVRVUVTVFxcLmluZm9cXC5kb21haW5cXHMqPVxccypbXCInXShbXlwiJ10rKVtcIiddLyk7XG4gICAgICAgICAgaWYgKGRvbWFpbk1hdGNoPy5bMV0pIHtcbiAgICAgICAgICAgIGRvbWFpbiA9IGRvbWFpbk1hdGNoWzFdO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHRpdGxlIGZyb20gPHRpdGxlPiB0YWdcbiAgICAgICAgdGl0bGUgPSAkKCd0aXRsZScpLnRleHQoKS50cmltKCkgfHwgbnVsbDtcbiAgICAgICAgLy8gUmVtb3ZlIFwiIC0gV2lraWRvdFwiIHN1ZmZpeCBpZiBwcmVzZW50XG4gICAgICAgIGlmICh0aXRsZT8uZW5kc1dpdGgoJyAtIFdpa2lkb3QnKSkge1xuICAgICAgICAgIHRpdGxlID0gdGl0bGUuc2xpY2UoMCwgLTEwKS50cmltKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc2l0ZUlkID09PSBudWxsKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IE5vRWxlbWVudEVycm9yKCdTaXRlIElEIG5vdCBmb3VuZCBpbiBXSUtJUkVRVUVTVCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzaXRlVW5peE5hbWUgPT09IG51bGwpIHtcbiAgICAgICAgICBzaXRlVW5peE5hbWUgPSB1bml4TmFtZTsgLy8gRmFsbGJhY2tcbiAgICAgICAgfVxuICAgICAgICBpZiAoZG9tYWluID09PSBudWxsKSB7XG4gICAgICAgICAgZG9tYWluID0gYCR7dW5peE5hbWV9Lndpa2lkb3QuY29tYDsgLy8gRmFsbGJhY2tcbiAgICAgICAgfVxuICAgICAgICBpZiAodGl0bGUgPT09IG51bGwpIHtcbiAgICAgICAgICB0aXRsZSA9IHVuaXhOYW1lOyAvLyBGYWxsYmFja1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU1NM5a++5b+c44OB44Kn44OD44Kv77yI44Oq44OA44Kk44Os44Kv44OI5b6M44GuVVJM44GMaHR0cHPjgaflp4vjgb7jgovjgYvjganjgYbjgYvjgafliKTmlq3vvIlcbiAgICAgICAgY29uc3Qgc3NsU3VwcG9ydGVkID0gcmVzcG9uc2UudXJsLnN0YXJ0c1dpdGgoJ2h0dHBzJyk7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBTaXRlKGNsaWVudCwge1xuICAgICAgICAgIGlkOiBzaXRlSWQsXG4gICAgICAgICAgdGl0bGUsXG4gICAgICAgICAgdW5peE5hbWU6IHNpdGVVbml4TmFtZSxcbiAgICAgICAgICBkb21haW4sXG4gICAgICAgICAgc3NsU3VwcG9ydGVkLFxuICAgICAgICB9KTtcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgTm90Rm91bmRFeGNlcHRpb24gfHwgZXJyb3IgaW5zdGFuY2VvZiBOb0VsZW1lbnRFcnJvcikge1xuICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGdldCBzaXRlOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBTaXRlKGlkPSR7dGhpcy5pZH0sIHVuaXhOYW1lPSR7dGhpcy51bml4TmFtZX0sIHRpdGxlPSR7dGhpcy50aXRsZX0pYDtcbiAgfVxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IFdpa2lkb3RSZXN1bHRBc3luYyB9IGZyb20gJy4uLy4uLy4uL2NvbW1vbi90eXBlcyc7XG5pbXBvcnQgeyBTaXRlIH0gZnJvbSAnLi4vLi4vc2l0ZSc7XG5pbXBvcnQgdHlwZSB7IENsaWVudCB9IGZyb20gJy4uL2NsaWVudCc7XG5cbi8qKlxuICog44K144Kk44OI5pON5L2c44Ki44Kv44K744K1XG4gKi9cbmV4cG9ydCBjbGFzcyBTaXRlQWNjZXNzb3Ige1xuICBwdWJsaWMgcmVhZG9ubHkgY2xpZW50OiBDbGllbnQ7XG5cbiAgY29uc3RydWN0b3IoY2xpZW50OiBDbGllbnQpIHtcbiAgICB0aGlzLmNsaWVudCA9IGNsaWVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBVTklY5ZCN44GL44KJ44K144Kk44OI44KS5Y+W5b6X44GZ44KLXG4gICAqXG4gICAqIEBwYXJhbSB1bml4TmFtZSAtIOOCteOCpOODiOOBrlVOSVjlkI3vvIjkvos6ICdzY3AtanAn77yJXG4gICAqIEByZXR1cm5zIFJlc3VsdOWei+OBp+ODqeODg+ODl+OBleOCjOOBn+OCteOCpOODiOOCquODluOCuOOCp+OCr+ODiFxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHNpdGVSZXN1bHQgPSBhd2FpdCBjbGllbnQuc2l0ZS5nZXQoJ3NjcC1qcCcpO1xuICAgKiBpZiAoIXNpdGVSZXN1bHQuaXNPaygpKSB7XG4gICAqICAgdGhyb3cgbmV3IEVycm9yKCfjgrXjgqTjg4jjga7lj5blvpfjgavlpLHmlZfjgZfjgb7jgZfjgZ8nKTtcbiAgICogfVxuICAgKiBjb25zdCBzaXRlID0gc2l0ZVJlc3VsdC52YWx1ZTtcbiAgICogYGBgXG4gICAqL1xuICBnZXQodW5peE5hbWU6IHN0cmluZyk6IFdpa2lkb3RSZXN1bHRBc3luYzxTaXRlPiB7XG4gICAgcmV0dXJuIFNpdGUuZnJvbVVuaXhOYW1lKHRoaXMuY2xpZW50LCB1bml4TmFtZSk7XG4gIH1cbn1cblxuZXhwb3J0IHsgU2l0ZSB9O1xuIiwKICAgICJpbXBvcnQgeyBOb3RGb3VuZEV4Y2VwdGlvbiB9IGZyb20gJy4uLy4uLy4uL2NvbW1vbi9lcnJvcnMnO1xuaW1wb3J0IHsgdHlwZSBXaWtpZG90UmVzdWx0QXN5bmMsIHdkRXJyQXN5bmMsIHdkT2tBc3luYyB9IGZyb20gJy4uLy4uLy4uL2NvbW1vbi90eXBlcyc7XG5pbXBvcnQgeyBVc2VyLCB0eXBlIFVzZXJDb2xsZWN0aW9uIH0gZnJvbSAnLi4vLi4vdXNlcic7XG5pbXBvcnQgdHlwZSB7IENsaWVudCB9IGZyb20gJy4uL2NsaWVudCc7XG5cbi8qKlxuICog44Om44O844K244O85Y+W5b6X44Kq44OX44K344On44OzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2V0VXNlck9wdGlvbnMge1xuICAvKiog44Om44O844K244O844GM6KaL44Gk44GL44KJ44Gq44GE5aC05ZCI44Gr44Ko44Op44O844KS55m655Sf44GV44Gb44KL77yI44OH44OV44Kp44Or44OIOiBmYWxzZe+8iSAqL1xuICByYWlzZVdoZW5Ob3RGb3VuZD86IGJvb2xlYW47XG59XG5cbi8qKlxuICog44Om44O844K244O85pON5L2c44Ki44Kv44K744K1XG4gKi9cbmV4cG9ydCBjbGFzcyBVc2VyQWNjZXNzb3Ige1xuICBwdWJsaWMgcmVhZG9ubHkgY2xpZW50OiBDbGllbnQ7XG5cbiAgY29uc3RydWN0b3IoY2xpZW50OiBDbGllbnQpIHtcbiAgICB0aGlzLmNsaWVudCA9IGNsaWVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiDjg6bjg7zjgrbjg7zlkI3jgYvjgonjg6bjg7zjgrbjg7zjgpLlj5blvpfjgZnjgotcbiAgICpcbiAgICogQHBhcmFtIG5hbWUgLSDjg6bjg7zjgrbjg7zlkI1cbiAgICogQHBhcmFtIG9wdGlvbnMgLSDlj5blvpfjgqrjg5fjgrfjg6fjg7NcbiAgICogQHJldHVybnMgUmVzdWx05Z6L44Gn44Op44OD44OX44GV44KM44Gf44Om44O844K244O877yI5a2Y5Zyo44GX44Gq44GE5aC05ZCI44GvbnVsbOOAgXJhaXNlV2hlbk5vdEZvdW5k44GMdHJ1ZeOBruWgtOWQiOOBr+OCqOODqeODvO+8iVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHVzZXJSZXN1bHQgPSBhd2FpdCBjbGllbnQudXNlci5nZXQoJ3VzZXJuYW1lJyk7XG4gICAqIGlmICghdXNlclJlc3VsdC5pc09rKCkpIHtcbiAgICogICB0aHJvdyBuZXcgRXJyb3IoJ+ODpuODvOOCtuODvOOBruWPluW+l+OBq+WkseaVl+OBl+OBvuOBl+OBnycpO1xuICAgKiB9XG4gICAqIGNvbnN0IHVzZXIgPSB1c2VyUmVzdWx0LnZhbHVlO1xuICAgKiBgYGBcbiAgICovXG4gIGdldChuYW1lOiBzdHJpbmcsIG9wdGlvbnM6IEdldFVzZXJPcHRpb25zID0ge30pOiBXaWtpZG90UmVzdWx0QXN5bmM8VXNlciB8IG51bGw+IHtcbiAgICBjb25zdCB7IHJhaXNlV2hlbk5vdEZvdW5kID0gZmFsc2UgfSA9IG9wdGlvbnM7XG5cbiAgICByZXR1cm4gVXNlci5mcm9tTmFtZSh0aGlzLmNsaWVudCwgbmFtZSkuYW5kVGhlbigodXNlcikgPT4ge1xuICAgICAgaWYgKHVzZXIgPT09IG51bGwgJiYgcmFpc2VXaGVuTm90Rm91bmQpIHtcbiAgICAgICAgcmV0dXJuIHdkRXJyQXN5bmMobmV3IE5vdEZvdW5kRXhjZXB0aW9uKGBVc2VyIG5vdCBmb3VuZDogJHtuYW1lfWApKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB3ZE9rQXN5bmModXNlcik7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICog6KSH5pWw44Om44O844K244O85ZCN44GL44KJ44Om44O844K244O844KS5Y+W5b6X44GZ44KLXG4gICAqIEBwYXJhbSBuYW1lcyAtIOODpuODvOOCtuODvOWQjemFjeWIl1xuICAgKiBAcGFyYW0gb3B0aW9ucyAtIOWPluW+l+OCquODl+OCt+ODp+ODs1xuICAgKiBAcmV0dXJucyDjg6bjg7zjgrbjg7zjgrPjg6zjgq/jgrfjg6fjg7PvvIjlrZjlnKjjgZfjgarjgYTjg6bjg7zjgrbjg7zjga9udWxs44CBcmFpc2VXaGVuTm90Rm91bmTjgYx0cnVl44Gu5aC05ZCI44Gv44Ko44Op44O877yJXG4gICAqL1xuICBnZXRNYW55KG5hbWVzOiBzdHJpbmdbXSwgb3B0aW9uczogR2V0VXNlck9wdGlvbnMgPSB7fSk6IFdpa2lkb3RSZXN1bHRBc3luYzxVc2VyQ29sbGVjdGlvbj4ge1xuICAgIGNvbnN0IHsgcmFpc2VXaGVuTm90Rm91bmQgPSBmYWxzZSB9ID0gb3B0aW9ucztcblxuICAgIHJldHVybiBVc2VyLmZyb21OYW1lcyh0aGlzLmNsaWVudCwgbmFtZXMpLmFuZFRoZW4oKGNvbGxlY3Rpb24pID0+IHtcbiAgICAgIGlmIChyYWlzZVdoZW5Ob3RGb3VuZCkge1xuICAgICAgICBjb25zdCBub3RGb3VuZE5hbWVzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgbmFtZSA9IG5hbWVzW2ldO1xuICAgICAgICAgIGlmIChjb2xsZWN0aW9uW2ldID09PSBudWxsICYmIG5hbWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbm90Rm91bmROYW1lcy5wdXNoKG5hbWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAobm90Rm91bmROYW1lcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgcmV0dXJuIHdkRXJyQXN5bmMobmV3IE5vdEZvdW5kRXhjZXB0aW9uKGBVc2VycyBub3QgZm91bmQ6ICR7bm90Rm91bmROYW1lcy5qb2luKCcsICcpfWApKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHdkT2tBc3luYyhjb2xsZWN0aW9uKTtcbiAgICB9KTtcbiAgfVxufVxuIiwKICAgICJpbXBvcnQgeyBMb2dpblJlcXVpcmVkRXJyb3IgfSBmcm9tICcuLi8uLi9jb21tb24vZXJyb3JzJztcbmltcG9ydCB7XG4gIGZyb21Qcm9taXNlLFxuICB0eXBlIFdpa2lkb3RSZXN1bHQsXG4gIHR5cGUgV2lraWRvdFJlc3VsdEFzeW5jLFxuICB3ZEVycixcbiAgd2RPayxcbiAgd2RPa0FzeW5jLFxufSBmcm9tICcuLi8uLi9jb21tb24vdHlwZXMnO1xuaW1wb3J0IHsgQU1DQ2xpZW50LCB0eXBlIEFNQ0NvbmZpZywgbG9naW4sIGxvZ291dCB9IGZyb20gJy4uLy4uL2Nvbm5lY3Rvcic7XG5pbXBvcnQgeyBVc2VyIH0gZnJvbSAnLi4vdXNlci91c2VyJztcbmltcG9ydCB7IFByaXZhdGVNZXNzYWdlQWNjZXNzb3IgfSBmcm9tICcuL2FjY2Vzc29ycy9wbS1hY2Nlc3Nvcic7XG5pbXBvcnQgeyBTaXRlQWNjZXNzb3IgfSBmcm9tICcuL2FjY2Vzc29ycy9zaXRlLWFjY2Vzc29yJztcbmltcG9ydCB7IFVzZXJBY2Nlc3NvciB9IGZyb20gJy4vYWNjZXNzb3JzL3VzZXItYWNjZXNzb3InO1xuXG4vKipcbiAqIOOCr+ODqeOCpOOCouODs+ODiOS9nOaIkOOCquODl+OCt+ODp+ODs1xuICovXG5leHBvcnQgaW50ZXJmYWNlIENsaWVudE9wdGlvbnMge1xuICAvKiogV2lraWRvdOODpuODvOOCtuODvOWQjSAqL1xuICB1c2VybmFtZT86IHN0cmluZztcblxuICAvKiogV2lraWRvdOODkeOCueODr+ODvOODiSAqL1xuICBwYXNzd29yZD86IHN0cmluZztcblxuICAvKiog44OZ44O844K544OJ44Oh44Kk44Oz77yI44OH44OV44Kp44Or44OIOiB3aWtpZG90LmNvbe+8iSAqL1xuICBkb21haW4/OiBzdHJpbmc7XG5cbiAgLyoqIEFNQ+ioreWumuOCquODvOODkOODvOODqeOCpOODiSAqL1xuICBhbWNDb25maWc/OiBQYXJ0aWFsPEFNQ0NvbmZpZz47XG59XG5cbi8qKlxuICogV2lraWRvdOOCr+ODqeOCpOOCouODs+ODiFxuICog44Op44Kk44OW44Op44Oq44Gu44Oh44Kk44Oz44Ko44Oz44OI44Oq44Od44Kk44Oz44OIXG4gKi9cbmV4cG9ydCBjbGFzcyBDbGllbnQge1xuICAvKiogQU1D44Kv44Op44Kk44Ki44Oz44OIICovXG4gIHB1YmxpYyByZWFkb25seSBhbWNDbGllbnQ6IEFNQ0NsaWVudDtcblxuICAvKiog44OZ44O844K544OJ44Oh44Kk44OzICovXG4gIHB1YmxpYyByZWFkb25seSBkb21haW46IHN0cmluZztcblxuICAvKiog44Om44O844K244O85pON5L2c44Ki44Kv44K744K1ICovXG4gIHB1YmxpYyByZWFkb25seSB1c2VyOiBVc2VyQWNjZXNzb3I7XG5cbiAgLyoqIOOCteOCpOODiOaTjeS9nOOCouOCr+OCu+OCtSAqL1xuICBwdWJsaWMgcmVhZG9ubHkgc2l0ZTogU2l0ZUFjY2Vzc29yO1xuXG4gIC8qKiDjg5fjg6njgqTjg5njg7zjg4jjg6Hjg4Pjgrvjg7zjgrjmk43kvZzjgqLjgq/jgrvjgrUgKi9cbiAgcHVibGljIHJlYWRvbmx5IHByaXZhdGVNZXNzYWdlOiBQcml2YXRlTWVzc2FnZUFjY2Vzc29yO1xuXG4gIC8qKiDjg63jgrDjgqTjg7PkuK3jga7jg6bjg7zjgrbjg7zlkI0gKi9cbiAgcHJpdmF0ZSBfdXNlcm5hbWU6IHN0cmluZyB8IG51bGw7XG5cbiAgLyoqIOODreOCsOOCpOODs+S4reOBruODpuODvOOCtuODvCAqL1xuICBwcml2YXRlIF9tZTogVXNlciB8IG51bGwgPSBudWxsO1xuXG4gIC8qKlxuICAgKiDjg5fjg6njgqTjg5njg7zjg4jjgrPjg7Pjgrnjg4jjg6njgq/jgr9cbiAgICogY3JlYXRl44Oh44K944OD44OJ44KS5L2/55So44GX44Gm44Kk44Oz44K544K/44Oz44K544KS5L2c5oiQ44GZ44KLXG4gICAqL1xuICBwcml2YXRlIGNvbnN0cnVjdG9yKGFtY0NsaWVudDogQU1DQ2xpZW50LCBkb21haW46IHN0cmluZywgdXNlcm5hbWU6IHN0cmluZyB8IG51bGwgPSBudWxsKSB7XG4gICAgdGhpcy5hbWNDbGllbnQgPSBhbWNDbGllbnQ7XG4gICAgdGhpcy5kb21haW4gPSBkb21haW47XG4gICAgdGhpcy5fdXNlcm5hbWUgPSB1c2VybmFtZTtcblxuICAgIC8vIOOCouOCr+OCu+OCteOCkuWIneacn+WMllxuICAgIHRoaXMudXNlciA9IG5ldyBVc2VyQWNjZXNzb3IodGhpcyk7XG4gICAgdGhpcy5zaXRlID0gbmV3IFNpdGVBY2Nlc3Nvcih0aGlzKTtcbiAgICB0aGlzLnByaXZhdGVNZXNzYWdlID0gbmV3IFByaXZhdGVNZXNzYWdlQWNjZXNzb3IodGhpcyk7XG4gIH1cblxuICAvKipcbiAgICog44Ot44Kw44Kk44Oz5Lit44Gu44Om44O844K244O85ZCN44KS5Y+W5b6XXG4gICAqL1xuICBnZXQgdXNlcm5hbWUoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX3VzZXJuYW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIOODreOCsOOCpOODs+S4reOBruODpuODvOOCtuODvOOCkuWPluW+l1xuICAgKiDjg63jgrDjgqTjg7PjgZfjgabjgYTjgarjgYTloLTlkIjjga9udWxsXG4gICAqL1xuICBnZXQgbWUoKTogVXNlciB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9tZTtcbiAgfVxuXG4gIC8qKlxuICAgKiDjgq/jg6njgqTjgqLjg7Pjg4jjgpLkvZzmiJDjgZnjgotcbiAgICpcbiAgICogQHBhcmFtIG9wdGlvbnMgLSDjgq/jg6njgqTjgqLjg7Pjg4jjgqrjg5fjgrfjg6fjg7NcbiAgICogQHJldHVybnMgUmVzdWx05Z6L44Gn44Op44OD44OX44GV44KM44Gf44Kv44Op44Kk44Ki44Oz44OI44Kk44Oz44K544K/44Oz44K5XG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogaW1wb3J0IHsgQ2xpZW50IH0gZnJvbSAnQHVrd2hhdG4vd2lraWRvdCc7XG4gICAqXG4gICAqIC8vIOOCr+ODqeOCpOOCouODs+ODiOOCkuS9nOaIkFxuICAgKiBjb25zdCBjbGllbnRSZXN1bHQgPSBhd2FpdCBDbGllbnQuY3JlYXRlKHtcbiAgICogICB1c2VybmFtZTogJ3lvdXJfdXNlcm5hbWUnLFxuICAgKiAgIHBhc3N3b3JkOiAneW91cl9wYXNzd29yZCcsXG4gICAqIH0pO1xuICAgKlxuICAgKiAvLyBSZXN1bHTlnovjgarjga7jgadpc09rKCnjgafjg4Hjgqfjg4Pjgq/lvozjgIEudmFsdWXjgaflj5blvpdcbiAgICogaWYgKCFjbGllbnRSZXN1bHQuaXNPaygpKSB7XG4gICAqICAgdGhyb3cgbmV3IEVycm9yKCfjgq/jg6njgqTjgqLjg7Pjg4jjga7kvZzmiJDjgavlpLHmlZfjgZfjgb7jgZfjgZ8nKTtcbiAgICogfVxuICAgKiBjb25zdCBjbGllbnQgPSBjbGllbnRSZXN1bHQudmFsdWU7XG4gICAqXG4gICAqIC8vIOOBk+OCjOOBp2NsaWVudC5zaXRl562J44Gr44Ki44Kv44K744K55Y+v6IO9XG4gICAqIGNvbnN0IHNpdGVSZXN1bHQgPSBhd2FpdCBjbGllbnQuc2l0ZS5nZXQoJ3NjcC1qcCcpO1xuICAgKiBgYGBcbiAgICovXG4gIHN0YXRpYyBjcmVhdGUob3B0aW9uczogQ2xpZW50T3B0aW9ucyA9IHt9KTogV2lraWRvdFJlc3VsdEFzeW5jPENsaWVudD4ge1xuICAgIGNvbnN0IHsgdXNlcm5hbWUsIHBhc3N3b3JkLCBkb21haW4gPSAnd2lraWRvdC5jb20nLCBhbWNDb25maWcgPSB7fSB9ID0gb3B0aW9ucztcblxuICAgIC8vIEFNQ+OCr+ODqeOCpOOCouODs+ODiOOCkuS9nOaIkFxuICAgIGNvbnN0IGFtY0NsaWVudCA9IG5ldyBBTUNDbGllbnQoYW1jQ29uZmlnLCBkb21haW4pO1xuXG4gICAgLy8g6KqN6Ki85oOF5aCx44GM44GC44KL5aC05ZCI44Gv44Ot44Kw44Kk44OzXG4gICAgaWYgKHVzZXJuYW1lICYmIHBhc3N3b3JkKSB7XG4gICAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgY2xpZW50ID0gbmV3IENsaWVudChhbWNDbGllbnQsIGRvbWFpbiwgdXNlcm5hbWUpO1xuICAgICAgICAgIGNvbnN0IGxvZ2luUmVzdWx0ID0gYXdhaXQgbG9naW4oY2xpZW50LCB1c2VybmFtZSwgcGFzc3dvcmQpO1xuICAgICAgICAgIGlmIChsb2dpblJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgICB0aHJvdyBsb2dpblJlc3VsdC5lcnJvcjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyDjg63jgrDjgqTjg7PkuK3jga7jg6bjg7zjgrbjg7zmg4XloLHjgpLlj5blvpdcbiAgICAgICAgICBjb25zdCB1c2VyUmVzdWx0ID0gYXdhaXQgVXNlci5mcm9tTmFtZShjbGllbnQsIHVzZXJuYW1lKTtcbiAgICAgICAgICBpZiAodXNlclJlc3VsdC5pc09rKCkgJiYgdXNlclJlc3VsdC52YWx1ZSkge1xuICAgICAgICAgICAgY2xpZW50Ll9tZSA9IHVzZXJSZXN1bHQudmFsdWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGNsaWVudDtcbiAgICAgICAgfSkoKSxcbiAgICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgTG9naW5SZXF1aXJlZEVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBuZXcgTG9naW5SZXF1aXJlZEVycm9yKGBGYWlsZWQgdG8gY3JlYXRlIGNsaWVudDogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgICB9XG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIOiqjeiovOOBquOBl+OBruOCr+ODqeOCpOOCouODs+ODiOOCkui/lOOBmVxuICAgIHJldHVybiB3ZE9rQXN5bmMobmV3IENsaWVudChhbWNDbGllbnQsIGRvbWFpbikpO1xuICB9XG5cbiAgLyoqXG4gICAqIOacquiqjeiovOOCr+ODqeOCpOOCouODs+ODiOOCkuS9nOaIkOOBmeOCi1xuICAgKiBAcGFyYW0gb3B0aW9ucyAtIOOCr+ODqeOCpOOCouODs+ODiOOCquODl+OCt+ODp+ODs++8iOiqjeiovOaDheWgseS7peWklu+8iVxuICAgKiBAcmV0dXJucyDjgq/jg6njgqTjgqLjg7Pjg4jjgqTjg7Pjgrnjgr/jg7PjgrlcbiAgICovXG4gIHN0YXRpYyBjcmVhdGVBbm9ueW1vdXMob3B0aW9uczogT21pdDxDbGllbnRPcHRpb25zLCAndXNlcm5hbWUnIHwgJ3Bhc3N3b3JkJz4gPSB7fSk6IENsaWVudCB7XG4gICAgY29uc3QgeyBkb21haW4gPSAnd2lraWRvdC5jb20nLCBhbWNDb25maWcgPSB7fSB9ID0gb3B0aW9ucztcbiAgICBjb25zdCBhbWNDbGllbnQgPSBuZXcgQU1DQ2xpZW50KGFtY0NvbmZpZywgZG9tYWluKTtcbiAgICByZXR1cm4gbmV3IENsaWVudChhbWNDbGllbnQsIGRvbWFpbik7XG4gIH1cblxuICAvKipcbiAgICog44Ot44Kw44Kk44Oz54q25oWL44KS56K66KqN44GZ44KLXG4gICAqIEByZXR1cm5zIOODreOCsOOCpOODs+a4iOOBv+OBquOCiXRydWVcbiAgICovXG4gIGlzTG9nZ2VkSW4oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3VzZXJuYW1lICE9PSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIOODreOCsOOCpOODs+OCkuimgeaxguOBmeOCi1xuICAgKiDjg63jgrDjgqTjg7PmuIjjgb/jgafjgarjgYTloLTlkIjjga9Mb2dpblJlcXVpcmVkRXJyb3LjgpLov5TjgZlcbiAgICogQHJldHVybnMg5oiQ5Yqf5pmC44Gvdm9pZFxuICAgKi9cbiAgcmVxdWlyZUxvZ2luKCk6IFdpa2lkb3RSZXN1bHQ8dm9pZD4ge1xuICAgIGlmICghdGhpcy5pc0xvZ2dlZEluKCkpIHtcbiAgICAgIHJldHVybiB3ZEVycihuZXcgTG9naW5SZXF1aXJlZEVycm9yKCkpO1xuICAgIH1cbiAgICByZXR1cm4gd2RPayh1bmRlZmluZWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIOOCr+ODqeOCpOOCouODs+ODiOOCkuOCr+ODreODvOOCuuOBmeOCi1xuICAgKiDjgrvjg4Pjgrfjg6fjg7PjgYzjgYLjgovloLTlkIjjga/jg63jgrDjgqLjgqbjg4jjgpLoqabjgb/jgotcbiAgICovXG4gIGNsb3NlKCk6IFdpa2lkb3RSZXN1bHRBc3luYzx2b2lkPiB7XG4gICAgaWYgKHRoaXMuaXNMb2dnZWRJbigpKSB7XG4gICAgICByZXR1cm4gbG9nb3V0KHRoaXMpLm1hcCgoKSA9PiB7XG4gICAgICAgIHRoaXMuX3VzZXJuYW1lID0gbnVsbDtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gd2RPa0FzeW5jKHVuZGVmaW5lZCk7XG4gIH1cbn1cbiIsCiAgICAiZXhwb3J0ICogZnJvbSAnLi9jbGllbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9mb3J1bSc7XG5leHBvcnQgKiBmcm9tICcuL3BhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9wcml2YXRlLW1lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9zaXRlJztcbmV4cG9ydCAqIGZyb20gJy4vdHlwZXMnO1xuZXhwb3J0ICogZnJvbSAnLi91c2VyJztcbiIsCiAgICAiZXhwb3J0ICogZnJvbSAnLi9wYXJzZXInO1xuZXhwb3J0ICogZnJvbSAnLi9xdWljay1tb2R1bGUnO1xuIgogIF0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0lBSXNCLGNBa0JUO0FBQUE7QUFBQSxFQWxCUyxlQUFmLE1BQWUscUJBQXFCLE1BQU07QUFBQSxJQUV0QjtBQUFBLElBS3pCLFdBQVcsQ0FBQyxTQUFpQjtBQUFBLE1BQzNCLE1BQU0sT0FBTztBQUFBLE1BQ2IsS0FBSyxPQUFPLEtBQUssWUFBWTtBQUFBLE1BQzdCLE9BQU8sZUFBZSxNQUFNLFdBQVcsU0FBUztBQUFBO0FBQUEsRUFFcEQ7QUFBQSxFQU1hLGtCQUFOLE1BQU0s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VixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFDVixLQUFVO0FBQUEsSUFD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LElBR2pELElBQUksWUFBWSxVQUFVO0FBQUEsTUFDeEIsT0FBTyxhQUNKLFlBQVk7QUFBQSxRQUNYLE1BQU0sU0FBUyxJQUFJLE9BQU8sV0FBVyxRQUFRLFFBQVE7QUFBQSxRQUNyRCxNQUFNLGNBQWMsTUFBTSxNQUFNLFFBQVEsVUFBVSxRQUFRO0FBQUEsUUFDMUQsSUFBSSxZQUFZLE1BQU0sR0FBRztBQUFBLFVBQ3ZCLE1BQU0sWUFBWTtBQUFBLFFBQ3BCO0FBQUEsUUFHQSxNQUFNLGFBQWEsTUFBTSxLQUFLLFNBQVMsUUFBUSxRQUFRO0FBQUEsUUFDdkQsSUFBSSxXQUFXLEtBQUssS0FBSyxXQUFXLE9BQU87QUFBQSxVQUN6QyxPQUFPLE1BQU0sV0FBVztBQUFBLFFBQzFCO0FBQUEsUUFFQSxPQUFPO0FBQUEsU0FDTixHQUNILENBQUMsVUFBVTtBQUFBLFFBQ1QsSUFBSSxpQkFBaUIsb0JBQW9CO0FBQUEsVUFDdkMsT0FBTztBQUFBLFFBQ1Q7QUFBQSxRQUNBLE9BQU8sSUFBSSxtQkFBbUIsNEJBQTRCLE9BQU8sS0FBSyxHQUFHO0FBQUEsT0FFN0U7QUFBQSxJQUNGO0FBQUEsSUFHQSxPQUFPLFVBQVUsSUFBSSxPQUFPLFdBQVcsTUFBTSxDQUFDO0FBQUE7QUFBQSxTQVF6QyxlQUFlLENBQUMsVUFBd0QsQ0FBQyxHQUFXO0FBQUEsSUFDekYsUUFBUSxTQUFTLGVBQWUsWUFBWSxDQUFDLE1BQU07QUFBQSxJQUNuRCxNQUFNLFlBQVksSUFBSSxVQUFVLFdBQVcsTUFBTTtBQUFBLElBQ2pELE9BQU8sSUFBSSxPQUFPLFdBQVcsTUFBTTtBQUFBO0FBQUEsRUFPckMsVUFBVSxHQUFZO0FBQUEsSUFDcEIsT0FBTyxLQUFLLGNBQWM7QUFBQTtBQUFBLEVBUTVCLFlBQVksR0FBd0I7QUFBQSxJQUNsQyxJQUFJLENBQUMsS0FBSyxXQUFXLEdBQUc7QUFBQSxNQUN0QixPQUFPLE1BQU0sSUFBSSxrQkFBb0I7QUFBQSxJQUN2QztBQUFBLElBQ0EsT0FBTyxLQUFLLFNBQVM7QUFBQTtBQUFBLEVBT3ZCLEtBQUssR0FBNkI7QUFBQSxJQUNoQyxJQUFJLEtBQUssV0FBVyxHQUFHO0FBQUEsTUFDckIsT0FBTyxPQUFPLElBQUksRUFBRSxJQUFJLE1BQU07QUFBQSxRQUM1QixLQUFLLFlBQVk7QUFBQSxRQUNqQjtBQUFBLE9BQ0Q7QUFBQSxJQUNIO0FBQUEsSUFDQSxPQUFPLFVBQVUsU0FBUztBQUFBO0FBRTlCOztBQ2xNQTtBQUtBOztBQ05BOyIsCiAgImRlYnVnSWQiOiAiOEVBMTUyOUY5Mjc2MEIwQzY0NzU2RTIxNjQ3NTZFMjEiLAogICJuYW1lcyI6IFtdCn0=