@kulupu-linku/sona 0.3.1 → 0.3.4

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.
@@ -1,2777 +0,0 @@
1
- var g;
2
- (function(r) {
3
- r.assertEqual = (n) => n;
4
- function e(n) {
5
- }
6
- r.assertIs = e;
7
- function t(n) {
8
- throw new Error();
9
- }
10
- r.assertNever = t, r.arrayToEnum = (n) => {
11
- const a = {};
12
- for (const i of n)
13
- a[i] = i;
14
- return a;
15
- }, r.getValidEnumValues = (n) => {
16
- const a = r.objectKeys(n).filter((o) => typeof n[n[o]] != "number"), i = {};
17
- for (const o of a)
18
- i[o] = n[o];
19
- return r.objectValues(i);
20
- }, r.objectValues = (n) => r.objectKeys(n).map(function(a) {
21
- return n[a];
22
- }), r.objectKeys = typeof Object.keys == "function" ? (n) => Object.keys(n) : (n) => {
23
- const a = [];
24
- for (const i in n)
25
- Object.prototype.hasOwnProperty.call(n, i) && a.push(i);
26
- return a;
27
- }, r.find = (n, a) => {
28
- for (const i of n)
29
- if (a(i))
30
- return i;
31
- }, r.isInteger = typeof Number.isInteger == "function" ? (n) => Number.isInteger(n) : (n) => typeof n == "number" && isFinite(n) && Math.floor(n) === n;
32
- function s(n, a = " | ") {
33
- return n.map((i) => typeof i == "string" ? `'${i}'` : i).join(a);
34
- }
35
- r.joinValues = s, r.jsonStringifyReplacer = (n, a) => typeof a == "bigint" ? a.toString() : a;
36
- })(g || (g = {}));
37
- var ve;
38
- (function(r) {
39
- r.mergeShapes = (e, t) => ({
40
- ...e,
41
- ...t
42
- // second overwrites first
43
- });
44
- })(ve || (ve = {}));
45
- const u = g.arrayToEnum([
46
- "string",
47
- "nan",
48
- "number",
49
- "integer",
50
- "float",
51
- "boolean",
52
- "date",
53
- "bigint",
54
- "symbol",
55
- "function",
56
- "undefined",
57
- "null",
58
- "array",
59
- "object",
60
- "unknown",
61
- "promise",
62
- "void",
63
- "never",
64
- "map",
65
- "set"
66
- ]), j = (r) => {
67
- switch (typeof r) {
68
- case "undefined":
69
- return u.undefined;
70
- case "string":
71
- return u.string;
72
- case "number":
73
- return isNaN(r) ? u.nan : u.number;
74
- case "boolean":
75
- return u.boolean;
76
- case "function":
77
- return u.function;
78
- case "bigint":
79
- return u.bigint;
80
- case "symbol":
81
- return u.symbol;
82
- case "object":
83
- return Array.isArray(r) ? u.array : r === null ? u.null : r.then && typeof r.then == "function" && r.catch && typeof r.catch == "function" ? u.promise : typeof Map < "u" && r instanceof Map ? u.map : typeof Set < "u" && r instanceof Set ? u.set : typeof Date < "u" && r instanceof Date ? u.date : u.object;
84
- default:
85
- return u.unknown;
86
- }
87
- }, c = g.arrayToEnum([
88
- "invalid_type",
89
- "invalid_literal",
90
- "custom",
91
- "invalid_union",
92
- "invalid_union_discriminator",
93
- "invalid_enum_value",
94
- "unrecognized_keys",
95
- "invalid_arguments",
96
- "invalid_return_type",
97
- "invalid_date",
98
- "invalid_string",
99
- "too_small",
100
- "too_big",
101
- "invalid_intersection_types",
102
- "not_multiple_of",
103
- "not_finite"
104
- ]), Ie = (r) => JSON.stringify(r, null, 2).replace(/"([^"]+)":/g, "$1:");
105
- class S extends Error {
106
- constructor(e) {
107
- super(), this.issues = [], this.addIssue = (s) => {
108
- this.issues = [...this.issues, s];
109
- }, this.addIssues = (s = []) => {
110
- this.issues = [...this.issues, ...s];
111
- };
112
- const t = new.target.prototype;
113
- Object.setPrototypeOf ? Object.setPrototypeOf(this, t) : this.__proto__ = t, this.name = "ZodError", this.issues = e;
114
- }
115
- get errors() {
116
- return this.issues;
117
- }
118
- format(e) {
119
- const t = e || function(a) {
120
- return a.message;
121
- }, s = { _errors: [] }, n = (a) => {
122
- for (const i of a.issues)
123
- if (i.code === "invalid_union")
124
- i.unionErrors.map(n);
125
- else if (i.code === "invalid_return_type")
126
- n(i.returnTypeError);
127
- else if (i.code === "invalid_arguments")
128
- n(i.argumentsError);
129
- else if (i.path.length === 0)
130
- s._errors.push(t(i));
131
- else {
132
- let o = s, f = 0;
133
- for (; f < i.path.length; ) {
134
- const d = i.path[f];
135
- f === i.path.length - 1 ? (o[d] = o[d] || { _errors: [] }, o[d]._errors.push(t(i))) : o[d] = o[d] || { _errors: [] }, o = o[d], f++;
136
- }
137
- }
138
- };
139
- return n(this), s;
140
- }
141
- toString() {
142
- return this.message;
143
- }
144
- get message() {
145
- return JSON.stringify(this.issues, g.jsonStringifyReplacer, 2);
146
- }
147
- get isEmpty() {
148
- return this.issues.length === 0;
149
- }
150
- flatten(e = (t) => t.message) {
151
- const t = {}, s = [];
152
- for (const n of this.issues)
153
- n.path.length > 0 ? (t[n.path[0]] = t[n.path[0]] || [], t[n.path[0]].push(e(n))) : s.push(e(n));
154
- return { formErrors: s, fieldErrors: t };
155
- }
156
- get formErrors() {
157
- return this.flatten();
158
- }
159
- }
160
- S.create = (r) => new S(r);
161
- const q = (r, e) => {
162
- let t;
163
- switch (r.code) {
164
- case c.invalid_type:
165
- r.received === u.undefined ? t = "Required" : t = `Expected ${r.expected}, received ${r.received}`;
166
- break;
167
- case c.invalid_literal:
168
- t = `Invalid literal value, expected ${JSON.stringify(r.expected, g.jsonStringifyReplacer)}`;
169
- break;
170
- case c.unrecognized_keys:
171
- t = `Unrecognized key(s) in object: ${g.joinValues(r.keys, ", ")}`;
172
- break;
173
- case c.invalid_union:
174
- t = "Invalid input";
175
- break;
176
- case c.invalid_union_discriminator:
177
- t = `Invalid discriminator value. Expected ${g.joinValues(r.options)}`;
178
- break;
179
- case c.invalid_enum_value:
180
- t = `Invalid enum value. Expected ${g.joinValues(r.options)}, received '${r.received}'`;
181
- break;
182
- case c.invalid_arguments:
183
- t = "Invalid function arguments";
184
- break;
185
- case c.invalid_return_type:
186
- t = "Invalid function return type";
187
- break;
188
- case c.invalid_date:
189
- t = "Invalid date";
190
- break;
191
- case c.invalid_string:
192
- typeof r.validation == "object" ? "includes" in r.validation ? (t = `Invalid input: must include "${r.validation.includes}"`, typeof r.validation.position == "number" && (t = `${t} at one or more positions greater than or equal to ${r.validation.position}`)) : "startsWith" in r.validation ? t = `Invalid input: must start with "${r.validation.startsWith}"` : "endsWith" in r.validation ? t = `Invalid input: must end with "${r.validation.endsWith}"` : g.assertNever(r.validation) : r.validation !== "regex" ? t = `Invalid ${r.validation}` : t = "Invalid";
193
- break;
194
- case c.too_small:
195
- r.type === "array" ? t = `Array must contain ${r.exact ? "exactly" : r.inclusive ? "at least" : "more than"} ${r.minimum} element(s)` : r.type === "string" ? t = `String must contain ${r.exact ? "exactly" : r.inclusive ? "at least" : "over"} ${r.minimum} character(s)` : r.type === "number" ? t = `Number must be ${r.exact ? "exactly equal to " : r.inclusive ? "greater than or equal to " : "greater than "}${r.minimum}` : r.type === "date" ? t = `Date must be ${r.exact ? "exactly equal to " : r.inclusive ? "greater than or equal to " : "greater than "}${new Date(Number(r.minimum))}` : t = "Invalid input";
196
- break;
197
- case c.too_big:
198
- r.type === "array" ? t = `Array must contain ${r.exact ? "exactly" : r.inclusive ? "at most" : "less than"} ${r.maximum} element(s)` : r.type === "string" ? t = `String must contain ${r.exact ? "exactly" : r.inclusive ? "at most" : "under"} ${r.maximum} character(s)` : r.type === "number" ? t = `Number must be ${r.exact ? "exactly" : r.inclusive ? "less than or equal to" : "less than"} ${r.maximum}` : r.type === "bigint" ? t = `BigInt must be ${r.exact ? "exactly" : r.inclusive ? "less than or equal to" : "less than"} ${r.maximum}` : r.type === "date" ? t = `Date must be ${r.exact ? "exactly" : r.inclusive ? "smaller than or equal to" : "smaller than"} ${new Date(Number(r.maximum))}` : t = "Invalid input";
199
- break;
200
- case c.custom:
201
- t = "Invalid input";
202
- break;
203
- case c.invalid_intersection_types:
204
- t = "Intersection results could not be merged";
205
- break;
206
- case c.not_multiple_of:
207
- t = `Number must be a multiple of ${r.multipleOf}`;
208
- break;
209
- case c.not_finite:
210
- t = "Number must be finite";
211
- break;
212
- default:
213
- t = e.defaultError, g.assertNever(r);
214
- }
215
- return { message: t };
216
- };
217
- let we = q;
218
- function Re(r) {
219
- we = r;
220
- }
221
- function ae() {
222
- return we;
223
- }
224
- const ie = (r) => {
225
- const { data: e, path: t, errorMaps: s, issueData: n } = r, a = [...t, ...n.path || []], i = {
226
- ...n,
227
- path: a
228
- };
229
- let o = "";
230
- const f = s.filter((d) => !!d).slice().reverse();
231
- for (const d of f)
232
- o = d(i, { data: e, defaultError: o }).message;
233
- return {
234
- ...n,
235
- path: a,
236
- message: n.message || o
237
- };
238
- }, je = [];
239
- function l(r, e) {
240
- const t = ie({
241
- issueData: e,
242
- data: r.data,
243
- path: r.path,
244
- errorMaps: [
245
- r.common.contextualErrorMap,
246
- r.schemaErrorMap,
247
- ae(),
248
- q
249
- // then global default map
250
- ].filter((s) => !!s)
251
- });
252
- r.common.issues.push(t);
253
- }
254
- class b {
255
- constructor() {
256
- this.value = "valid";
257
- }
258
- dirty() {
259
- this.value === "valid" && (this.value = "dirty");
260
- }
261
- abort() {
262
- this.value !== "aborted" && (this.value = "aborted");
263
- }
264
- static mergeArray(e, t) {
265
- const s = [];
266
- for (const n of t) {
267
- if (n.status === "aborted")
268
- return m;
269
- n.status === "dirty" && e.dirty(), s.push(n.value);
270
- }
271
- return { status: e.value, value: s };
272
- }
273
- static async mergeObjectAsync(e, t) {
274
- const s = [];
275
- for (const n of t)
276
- s.push({
277
- key: await n.key,
278
- value: await n.value
279
- });
280
- return b.mergeObjectSync(e, s);
281
- }
282
- static mergeObjectSync(e, t) {
283
- const s = {};
284
- for (const n of t) {
285
- const { key: a, value: i } = n;
286
- if (a.status === "aborted" || i.status === "aborted")
287
- return m;
288
- a.status === "dirty" && e.dirty(), i.status === "dirty" && e.dirty(), a.value !== "__proto__" && (typeof i.value < "u" || n.alwaysSet) && (s[a.value] = i.value);
289
- }
290
- return { status: e.value, value: s };
291
- }
292
- }
293
- const m = Object.freeze({
294
- status: "aborted"
295
- }), Te = (r) => ({ status: "dirty", value: r }), w = (r) => ({ status: "valid", value: r }), _e = (r) => r.status === "aborted", ge = (r) => r.status === "dirty", J = (r) => r.status === "valid", oe = (r) => typeof Promise < "u" && r instanceof Promise;
296
- var h;
297
- (function(r) {
298
- r.errToObj = (e) => typeof e == "string" ? { message: e } : e || {}, r.toString = (e) => typeof e == "string" ? e : e == null ? void 0 : e.message;
299
- })(h || (h = {}));
300
- class O {
301
- constructor(e, t, s, n) {
302
- this._cachedPath = [], this.parent = e, this.data = t, this._path = s, this._key = n;
303
- }
304
- get path() {
305
- return this._cachedPath.length || (this._key instanceof Array ? this._cachedPath.push(...this._path, ...this._key) : this._cachedPath.push(...this._path, this._key)), this._cachedPath;
306
- }
307
- }
308
- const ke = (r, e) => {
309
- if (J(e))
310
- return { success: !0, data: e.value };
311
- if (!r.common.issues.length)
312
- throw new Error("Validation failed but no issues detected.");
313
- return {
314
- success: !1,
315
- get error() {
316
- if (this._error)
317
- return this._error;
318
- const t = new S(r.common.issues);
319
- return this._error = t, this._error;
320
- }
321
- };
322
- };
323
- function y(r) {
324
- if (!r)
325
- return {};
326
- const { errorMap: e, invalid_type_error: t, required_error: s, description: n } = r;
327
- if (e && (t || s))
328
- throw new Error(`Can't use "invalid_type_error" or "required_error" in conjunction with custom error map.`);
329
- return e ? { errorMap: e, description: n } : { errorMap: (i, o) => i.code !== "invalid_type" ? { message: o.defaultError } : typeof o.data > "u" ? { message: s ?? o.defaultError } : { message: t ?? o.defaultError }, description: n };
330
- }
331
- class v {
332
- constructor(e) {
333
- this.spa = this.safeParseAsync, this._def = e, this.parse = this.parse.bind(this), this.safeParse = this.safeParse.bind(this), this.parseAsync = this.parseAsync.bind(this), this.safeParseAsync = this.safeParseAsync.bind(this), this.spa = this.spa.bind(this), this.refine = this.refine.bind(this), this.refinement = this.refinement.bind(this), this.superRefine = this.superRefine.bind(this), this.optional = this.optional.bind(this), this.nullable = this.nullable.bind(this), this.nullish = this.nullish.bind(this), this.array = this.array.bind(this), this.promise = this.promise.bind(this), this.or = this.or.bind(this), this.and = this.and.bind(this), this.transform = this.transform.bind(this), this.brand = this.brand.bind(this), this.default = this.default.bind(this), this.catch = this.catch.bind(this), this.describe = this.describe.bind(this), this.pipe = this.pipe.bind(this), this.readonly = this.readonly.bind(this), this.isNullable = this.isNullable.bind(this), this.isOptional = this.isOptional.bind(this);
334
- }
335
- get description() {
336
- return this._def.description;
337
- }
338
- _getType(e) {
339
- return j(e.data);
340
- }
341
- _getOrReturnCtx(e, t) {
342
- return t || {
343
- common: e.parent.common,
344
- data: e.data,
345
- parsedType: j(e.data),
346
- schemaErrorMap: this._def.errorMap,
347
- path: e.path,
348
- parent: e.parent
349
- };
350
- }
351
- _processInputParams(e) {
352
- return {
353
- status: new b(),
354
- ctx: {
355
- common: e.parent.common,
356
- data: e.data,
357
- parsedType: j(e.data),
358
- schemaErrorMap: this._def.errorMap,
359
- path: e.path,
360
- parent: e.parent
361
- }
362
- };
363
- }
364
- _parseSync(e) {
365
- const t = this._parse(e);
366
- if (oe(t))
367
- throw new Error("Synchronous parse encountered promise.");
368
- return t;
369
- }
370
- _parseAsync(e) {
371
- const t = this._parse(e);
372
- return Promise.resolve(t);
373
- }
374
- parse(e, t) {
375
- const s = this.safeParse(e, t);
376
- if (s.success)
377
- return s.data;
378
- throw s.error;
379
- }
380
- safeParse(e, t) {
381
- var s;
382
- const n = {
383
- common: {
384
- issues: [],
385
- async: (s = t == null ? void 0 : t.async) !== null && s !== void 0 ? s : !1,
386
- contextualErrorMap: t == null ? void 0 : t.errorMap
387
- },
388
- path: (t == null ? void 0 : t.path) || [],
389
- schemaErrorMap: this._def.errorMap,
390
- parent: null,
391
- data: e,
392
- parsedType: j(e)
393
- }, a = this._parseSync({ data: e, path: n.path, parent: n });
394
- return ke(n, a);
395
- }
396
- async parseAsync(e, t) {
397
- const s = await this.safeParseAsync(e, t);
398
- if (s.success)
399
- return s.data;
400
- throw s.error;
401
- }
402
- async safeParseAsync(e, t) {
403
- const s = {
404
- common: {
405
- issues: [],
406
- contextualErrorMap: t == null ? void 0 : t.errorMap,
407
- async: !0
408
- },
409
- path: (t == null ? void 0 : t.path) || [],
410
- schemaErrorMap: this._def.errorMap,
411
- parent: null,
412
- data: e,
413
- parsedType: j(e)
414
- }, n = this._parse({ data: e, path: s.path, parent: s }), a = await (oe(n) ? n : Promise.resolve(n));
415
- return ke(s, a);
416
- }
417
- refine(e, t) {
418
- const s = (n) => typeof t == "string" || typeof t > "u" ? { message: t } : typeof t == "function" ? t(n) : t;
419
- return this._refinement((n, a) => {
420
- const i = e(n), o = () => a.addIssue({
421
- code: c.custom,
422
- ...s(n)
423
- });
424
- return typeof Promise < "u" && i instanceof Promise ? i.then((f) => f ? !0 : (o(), !1)) : i ? !0 : (o(), !1);
425
- });
426
- }
427
- refinement(e, t) {
428
- return this._refinement((s, n) => e(s) ? !0 : (n.addIssue(typeof t == "function" ? t(s, n) : t), !1));
429
- }
430
- _refinement(e) {
431
- return new C({
432
- schema: this,
433
- typeName: p.ZodEffects,
434
- effect: { type: "refinement", refinement: e }
435
- });
436
- }
437
- superRefine(e) {
438
- return this._refinement(e);
439
- }
440
- optional() {
441
- return I.create(this, this._def);
442
- }
443
- nullable() {
444
- return D.create(this, this._def);
445
- }
446
- nullish() {
447
- return this.nullable().optional();
448
- }
449
- array() {
450
- return N.create(this, this._def);
451
- }
452
- promise() {
453
- return W.create(this, this._def);
454
- }
455
- or(e) {
456
- return X.create([this, e], this._def);
457
- }
458
- and(e) {
459
- return Q.create(this, e, this._def);
460
- }
461
- transform(e) {
462
- return new C({
463
- ...y(this._def),
464
- schema: this,
465
- typeName: p.ZodEffects,
466
- effect: { type: "transform", transform: e }
467
- });
468
- }
469
- default(e) {
470
- const t = typeof e == "function" ? e : () => e;
471
- return new re({
472
- ...y(this._def),
473
- innerType: this,
474
- defaultValue: t,
475
- typeName: p.ZodDefault
476
- });
477
- }
478
- brand() {
479
- return new Se({
480
- typeName: p.ZodBranded,
481
- type: this,
482
- ...y(this._def)
483
- });
484
- }
485
- catch(e) {
486
- const t = typeof e == "function" ? e : () => e;
487
- return new le({
488
- ...y(this._def),
489
- innerType: this,
490
- catchValue: t,
491
- typeName: p.ZodCatch
492
- });
493
- }
494
- describe(e) {
495
- const t = this.constructor;
496
- return new t({
497
- ...this._def,
498
- description: e
499
- });
500
- }
501
- pipe(e) {
502
- return se.create(this, e);
503
- }
504
- readonly() {
505
- return he.create(this);
506
- }
507
- isOptional() {
508
- return this.safeParse(void 0).success;
509
- }
510
- isNullable() {
511
- return this.safeParse(null).success;
512
- }
513
- }
514
- const Ae = /^c[^\s-]{8,}$/i, Me = /^[a-z][a-z0-9]*$/, Pe = /^[0-9A-HJKMNP-TV-Z]{26}$/, Ve = /^[0-9a-fA-F]{8}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{12}$/i, $e = /^(?!\.)(?!.*\.\.)([A-Z0-9_+-\.]*)[A-Z0-9_+-]@([A-Z0-9][A-Z0-9\-]*\.)+[A-Z]{2,}$/i, Le = "^(\\p{Extended_Pictographic}|\\p{Emoji_Component})+$";
515
- let ye;
516
- const De = /^(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))$/, ze = /^(([a-f0-9]{1,4}:){7}|::([a-f0-9]{1,4}:){0,6}|([a-f0-9]{1,4}:){1}:([a-f0-9]{1,4}:){0,5}|([a-f0-9]{1,4}:){2}:([a-f0-9]{1,4}:){0,4}|([a-f0-9]{1,4}:){3}:([a-f0-9]{1,4}:){0,3}|([a-f0-9]{1,4}:){4}:([a-f0-9]{1,4}:){0,2}|([a-f0-9]{1,4}:){5}:([a-f0-9]{1,4}:){0,1})([a-f0-9]{1,4}|(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2})))$/, Ue = (r) => r.precision ? r.offset ? new RegExp(`^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{${r.precision}}(([+-]\\d{2}(:?\\d{2})?)|Z)$`) : new RegExp(`^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{${r.precision}}Z$`) : r.precision === 0 ? r.offset ? new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(([+-]\\d{2}(:?\\d{2})?)|Z)$") : new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}Z$") : r.offset ? new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?(([+-]\\d{2}(:?\\d{2})?)|Z)$") : new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?Z$");
517
- function Be(r, e) {
518
- return !!((e === "v4" || !e) && De.test(r) || (e === "v6" || !e) && ze.test(r));
519
- }
520
- class Z extends v {
521
- _parse(e) {
522
- if (this._def.coerce && (e.data = String(e.data)), this._getType(e) !== u.string) {
523
- const a = this._getOrReturnCtx(e);
524
- return l(
525
- a,
526
- {
527
- code: c.invalid_type,
528
- expected: u.string,
529
- received: a.parsedType
530
- }
531
- //
532
- ), m;
533
- }
534
- const s = new b();
535
- let n;
536
- for (const a of this._def.checks)
537
- if (a.kind === "min")
538
- e.data.length < a.value && (n = this._getOrReturnCtx(e, n), l(n, {
539
- code: c.too_small,
540
- minimum: a.value,
541
- type: "string",
542
- inclusive: !0,
543
- exact: !1,
544
- message: a.message
545
- }), s.dirty());
546
- else if (a.kind === "max")
547
- e.data.length > a.value && (n = this._getOrReturnCtx(e, n), l(n, {
548
- code: c.too_big,
549
- maximum: a.value,
550
- type: "string",
551
- inclusive: !0,
552
- exact: !1,
553
- message: a.message
554
- }), s.dirty());
555
- else if (a.kind === "length") {
556
- const i = e.data.length > a.value, o = e.data.length < a.value;
557
- (i || o) && (n = this._getOrReturnCtx(e, n), i ? l(n, {
558
- code: c.too_big,
559
- maximum: a.value,
560
- type: "string",
561
- inclusive: !0,
562
- exact: !0,
563
- message: a.message
564
- }) : o && l(n, {
565
- code: c.too_small,
566
- minimum: a.value,
567
- type: "string",
568
- inclusive: !0,
569
- exact: !0,
570
- message: a.message
571
- }), s.dirty());
572
- } else if (a.kind === "email")
573
- $e.test(e.data) || (n = this._getOrReturnCtx(e, n), l(n, {
574
- validation: "email",
575
- code: c.invalid_string,
576
- message: a.message
577
- }), s.dirty());
578
- else if (a.kind === "emoji")
579
- ye || (ye = new RegExp(Le, "u")), ye.test(e.data) || (n = this._getOrReturnCtx(e, n), l(n, {
580
- validation: "emoji",
581
- code: c.invalid_string,
582
- message: a.message
583
- }), s.dirty());
584
- else if (a.kind === "uuid")
585
- Ve.test(e.data) || (n = this._getOrReturnCtx(e, n), l(n, {
586
- validation: "uuid",
587
- code: c.invalid_string,
588
- message: a.message
589
- }), s.dirty());
590
- else if (a.kind === "cuid")
591
- Ae.test(e.data) || (n = this._getOrReturnCtx(e, n), l(n, {
592
- validation: "cuid",
593
- code: c.invalid_string,
594
- message: a.message
595
- }), s.dirty());
596
- else if (a.kind === "cuid2")
597
- Me.test(e.data) || (n = this._getOrReturnCtx(e, n), l(n, {
598
- validation: "cuid2",
599
- code: c.invalid_string,
600
- message: a.message
601
- }), s.dirty());
602
- else if (a.kind === "ulid")
603
- Pe.test(e.data) || (n = this._getOrReturnCtx(e, n), l(n, {
604
- validation: "ulid",
605
- code: c.invalid_string,
606
- message: a.message
607
- }), s.dirty());
608
- else if (a.kind === "url")
609
- try {
610
- new URL(e.data);
611
- } catch {
612
- n = this._getOrReturnCtx(e, n), l(n, {
613
- validation: "url",
614
- code: c.invalid_string,
615
- message: a.message
616
- }), s.dirty();
617
- }
618
- else
619
- a.kind === "regex" ? (a.regex.lastIndex = 0, a.regex.test(e.data) || (n = this._getOrReturnCtx(e, n), l(n, {
620
- validation: "regex",
621
- code: c.invalid_string,
622
- message: a.message
623
- }), s.dirty())) : a.kind === "trim" ? e.data = e.data.trim() : a.kind === "includes" ? e.data.includes(a.value, a.position) || (n = this._getOrReturnCtx(e, n), l(n, {
624
- code: c.invalid_string,
625
- validation: { includes: a.value, position: a.position },
626
- message: a.message
627
- }), s.dirty()) : a.kind === "toLowerCase" ? e.data = e.data.toLowerCase() : a.kind === "toUpperCase" ? e.data = e.data.toUpperCase() : a.kind === "startsWith" ? e.data.startsWith(a.value) || (n = this._getOrReturnCtx(e, n), l(n, {
628
- code: c.invalid_string,
629
- validation: { startsWith: a.value },
630
- message: a.message
631
- }), s.dirty()) : a.kind === "endsWith" ? e.data.endsWith(a.value) || (n = this._getOrReturnCtx(e, n), l(n, {
632
- code: c.invalid_string,
633
- validation: { endsWith: a.value },
634
- message: a.message
635
- }), s.dirty()) : a.kind === "datetime" ? Ue(a).test(e.data) || (n = this._getOrReturnCtx(e, n), l(n, {
636
- code: c.invalid_string,
637
- validation: "datetime",
638
- message: a.message
639
- }), s.dirty()) : a.kind === "ip" ? Be(e.data, a.version) || (n = this._getOrReturnCtx(e, n), l(n, {
640
- validation: "ip",
641
- code: c.invalid_string,
642
- message: a.message
643
- }), s.dirty()) : g.assertNever(a);
644
- return { status: s.value, value: e.data };
645
- }
646
- _regex(e, t, s) {
647
- return this.refinement((n) => e.test(n), {
648
- validation: t,
649
- code: c.invalid_string,
650
- ...h.errToObj(s)
651
- });
652
- }
653
- _addCheck(e) {
654
- return new Z({
655
- ...this._def,
656
- checks: [...this._def.checks, e]
657
- });
658
- }
659
- email(e) {
660
- return this._addCheck({ kind: "email", ...h.errToObj(e) });
661
- }
662
- url(e) {
663
- return this._addCheck({ kind: "url", ...h.errToObj(e) });
664
- }
665
- emoji(e) {
666
- return this._addCheck({ kind: "emoji", ...h.errToObj(e) });
667
- }
668
- uuid(e) {
669
- return this._addCheck({ kind: "uuid", ...h.errToObj(e) });
670
- }
671
- cuid(e) {
672
- return this._addCheck({ kind: "cuid", ...h.errToObj(e) });
673
- }
674
- cuid2(e) {
675
- return this._addCheck({ kind: "cuid2", ...h.errToObj(e) });
676
- }
677
- ulid(e) {
678
- return this._addCheck({ kind: "ulid", ...h.errToObj(e) });
679
- }
680
- ip(e) {
681
- return this._addCheck({ kind: "ip", ...h.errToObj(e) });
682
- }
683
- datetime(e) {
684
- var t;
685
- return typeof e == "string" ? this._addCheck({
686
- kind: "datetime",
687
- precision: null,
688
- offset: !1,
689
- message: e
690
- }) : this._addCheck({
691
- kind: "datetime",
692
- precision: typeof (e == null ? void 0 : e.precision) > "u" ? null : e == null ? void 0 : e.precision,
693
- offset: (t = e == null ? void 0 : e.offset) !== null && t !== void 0 ? t : !1,
694
- ...h.errToObj(e == null ? void 0 : e.message)
695
- });
696
- }
697
- regex(e, t) {
698
- return this._addCheck({
699
- kind: "regex",
700
- regex: e,
701
- ...h.errToObj(t)
702
- });
703
- }
704
- includes(e, t) {
705
- return this._addCheck({
706
- kind: "includes",
707
- value: e,
708
- position: t == null ? void 0 : t.position,
709
- ...h.errToObj(t == null ? void 0 : t.message)
710
- });
711
- }
712
- startsWith(e, t) {
713
- return this._addCheck({
714
- kind: "startsWith",
715
- value: e,
716
- ...h.errToObj(t)
717
- });
718
- }
719
- endsWith(e, t) {
720
- return this._addCheck({
721
- kind: "endsWith",
722
- value: e,
723
- ...h.errToObj(t)
724
- });
725
- }
726
- min(e, t) {
727
- return this._addCheck({
728
- kind: "min",
729
- value: e,
730
- ...h.errToObj(t)
731
- });
732
- }
733
- max(e, t) {
734
- return this._addCheck({
735
- kind: "max",
736
- value: e,
737
- ...h.errToObj(t)
738
- });
739
- }
740
- length(e, t) {
741
- return this._addCheck({
742
- kind: "length",
743
- value: e,
744
- ...h.errToObj(t)
745
- });
746
- }
747
- /**
748
- * @deprecated Use z.string().min(1) instead.
749
- * @see {@link ZodString.min}
750
- */
751
- nonempty(e) {
752
- return this.min(1, h.errToObj(e));
753
- }
754
- trim() {
755
- return new Z({
756
- ...this._def,
757
- checks: [...this._def.checks, { kind: "trim" }]
758
- });
759
- }
760
- toLowerCase() {
761
- return new Z({
762
- ...this._def,
763
- checks: [...this._def.checks, { kind: "toLowerCase" }]
764
- });
765
- }
766
- toUpperCase() {
767
- return new Z({
768
- ...this._def,
769
- checks: [...this._def.checks, { kind: "toUpperCase" }]
770
- });
771
- }
772
- get isDatetime() {
773
- return !!this._def.checks.find((e) => e.kind === "datetime");
774
- }
775
- get isEmail() {
776
- return !!this._def.checks.find((e) => e.kind === "email");
777
- }
778
- get isURL() {
779
- return !!this._def.checks.find((e) => e.kind === "url");
780
- }
781
- get isEmoji() {
782
- return !!this._def.checks.find((e) => e.kind === "emoji");
783
- }
784
- get isUUID() {
785
- return !!this._def.checks.find((e) => e.kind === "uuid");
786
- }
787
- get isCUID() {
788
- return !!this._def.checks.find((e) => e.kind === "cuid");
789
- }
790
- get isCUID2() {
791
- return !!this._def.checks.find((e) => e.kind === "cuid2");
792
- }
793
- get isULID() {
794
- return !!this._def.checks.find((e) => e.kind === "ulid");
795
- }
796
- get isIP() {
797
- return !!this._def.checks.find((e) => e.kind === "ip");
798
- }
799
- get minLength() {
800
- let e = null;
801
- for (const t of this._def.checks)
802
- t.kind === "min" && (e === null || t.value > e) && (e = t.value);
803
- return e;
804
- }
805
- get maxLength() {
806
- let e = null;
807
- for (const t of this._def.checks)
808
- t.kind === "max" && (e === null || t.value < e) && (e = t.value);
809
- return e;
810
- }
811
- }
812
- Z.create = (r) => {
813
- var e;
814
- return new Z({
815
- checks: [],
816
- typeName: p.ZodString,
817
- coerce: (e = r == null ? void 0 : r.coerce) !== null && e !== void 0 ? e : !1,
818
- ...y(r)
819
- });
820
- };
821
- function We(r, e) {
822
- const t = (r.toString().split(".")[1] || "").length, s = (e.toString().split(".")[1] || "").length, n = t > s ? t : s, a = parseInt(r.toFixed(n).replace(".", "")), i = parseInt(e.toFixed(n).replace(".", ""));
823
- return a % i / Math.pow(10, n);
824
- }
825
- class A extends v {
826
- constructor() {
827
- super(...arguments), this.min = this.gte, this.max = this.lte, this.step = this.multipleOf;
828
- }
829
- _parse(e) {
830
- if (this._def.coerce && (e.data = Number(e.data)), this._getType(e) !== u.number) {
831
- const a = this._getOrReturnCtx(e);
832
- return l(a, {
833
- code: c.invalid_type,
834
- expected: u.number,
835
- received: a.parsedType
836
- }), m;
837
- }
838
- let s;
839
- const n = new b();
840
- for (const a of this._def.checks)
841
- a.kind === "int" ? g.isInteger(e.data) || (s = this._getOrReturnCtx(e, s), l(s, {
842
- code: c.invalid_type,
843
- expected: "integer",
844
- received: "float",
845
- message: a.message
846
- }), n.dirty()) : a.kind === "min" ? (a.inclusive ? e.data < a.value : e.data <= a.value) && (s = this._getOrReturnCtx(e, s), l(s, {
847
- code: c.too_small,
848
- minimum: a.value,
849
- type: "number",
850
- inclusive: a.inclusive,
851
- exact: !1,
852
- message: a.message
853
- }), n.dirty()) : a.kind === "max" ? (a.inclusive ? e.data > a.value : e.data >= a.value) && (s = this._getOrReturnCtx(e, s), l(s, {
854
- code: c.too_big,
855
- maximum: a.value,
856
- type: "number",
857
- inclusive: a.inclusive,
858
- exact: !1,
859
- message: a.message
860
- }), n.dirty()) : a.kind === "multipleOf" ? We(e.data, a.value) !== 0 && (s = this._getOrReturnCtx(e, s), l(s, {
861
- code: c.not_multiple_of,
862
- multipleOf: a.value,
863
- message: a.message
864
- }), n.dirty()) : a.kind === "finite" ? Number.isFinite(e.data) || (s = this._getOrReturnCtx(e, s), l(s, {
865
- code: c.not_finite,
866
- message: a.message
867
- }), n.dirty()) : g.assertNever(a);
868
- return { status: n.value, value: e.data };
869
- }
870
- gte(e, t) {
871
- return this.setLimit("min", e, !0, h.toString(t));
872
- }
873
- gt(e, t) {
874
- return this.setLimit("min", e, !1, h.toString(t));
875
- }
876
- lte(e, t) {
877
- return this.setLimit("max", e, !0, h.toString(t));
878
- }
879
- lt(e, t) {
880
- return this.setLimit("max", e, !1, h.toString(t));
881
- }
882
- setLimit(e, t, s, n) {
883
- return new A({
884
- ...this._def,
885
- checks: [
886
- ...this._def.checks,
887
- {
888
- kind: e,
889
- value: t,
890
- inclusive: s,
891
- message: h.toString(n)
892
- }
893
- ]
894
- });
895
- }
896
- _addCheck(e) {
897
- return new A({
898
- ...this._def,
899
- checks: [...this._def.checks, e]
900
- });
901
- }
902
- int(e) {
903
- return this._addCheck({
904
- kind: "int",
905
- message: h.toString(e)
906
- });
907
- }
908
- positive(e) {
909
- return this._addCheck({
910
- kind: "min",
911
- value: 0,
912
- inclusive: !1,
913
- message: h.toString(e)
914
- });
915
- }
916
- negative(e) {
917
- return this._addCheck({
918
- kind: "max",
919
- value: 0,
920
- inclusive: !1,
921
- message: h.toString(e)
922
- });
923
- }
924
- nonpositive(e) {
925
- return this._addCheck({
926
- kind: "max",
927
- value: 0,
928
- inclusive: !0,
929
- message: h.toString(e)
930
- });
931
- }
932
- nonnegative(e) {
933
- return this._addCheck({
934
- kind: "min",
935
- value: 0,
936
- inclusive: !0,
937
- message: h.toString(e)
938
- });
939
- }
940
- multipleOf(e, t) {
941
- return this._addCheck({
942
- kind: "multipleOf",
943
- value: e,
944
- message: h.toString(t)
945
- });
946
- }
947
- finite(e) {
948
- return this._addCheck({
949
- kind: "finite",
950
- message: h.toString(e)
951
- });
952
- }
953
- safe(e) {
954
- return this._addCheck({
955
- kind: "min",
956
- inclusive: !0,
957
- value: Number.MIN_SAFE_INTEGER,
958
- message: h.toString(e)
959
- })._addCheck({
960
- kind: "max",
961
- inclusive: !0,
962
- value: Number.MAX_SAFE_INTEGER,
963
- message: h.toString(e)
964
- });
965
- }
966
- get minValue() {
967
- let e = null;
968
- for (const t of this._def.checks)
969
- t.kind === "min" && (e === null || t.value > e) && (e = t.value);
970
- return e;
971
- }
972
- get maxValue() {
973
- let e = null;
974
- for (const t of this._def.checks)
975
- t.kind === "max" && (e === null || t.value < e) && (e = t.value);
976
- return e;
977
- }
978
- get isInt() {
979
- return !!this._def.checks.find((e) => e.kind === "int" || e.kind === "multipleOf" && g.isInteger(e.value));
980
- }
981
- get isFinite() {
982
- let e = null, t = null;
983
- for (const s of this._def.checks) {
984
- if (s.kind === "finite" || s.kind === "int" || s.kind === "multipleOf")
985
- return !0;
986
- s.kind === "min" ? (t === null || s.value > t) && (t = s.value) : s.kind === "max" && (e === null || s.value < e) && (e = s.value);
987
- }
988
- return Number.isFinite(t) && Number.isFinite(e);
989
- }
990
- }
991
- A.create = (r) => new A({
992
- checks: [],
993
- typeName: p.ZodNumber,
994
- coerce: (r == null ? void 0 : r.coerce) || !1,
995
- ...y(r)
996
- });
997
- class M extends v {
998
- constructor() {
999
- super(...arguments), this.min = this.gte, this.max = this.lte;
1000
- }
1001
- _parse(e) {
1002
- if (this._def.coerce && (e.data = BigInt(e.data)), this._getType(e) !== u.bigint) {
1003
- const a = this._getOrReturnCtx(e);
1004
- return l(a, {
1005
- code: c.invalid_type,
1006
- expected: u.bigint,
1007
- received: a.parsedType
1008
- }), m;
1009
- }
1010
- let s;
1011
- const n = new b();
1012
- for (const a of this._def.checks)
1013
- a.kind === "min" ? (a.inclusive ? e.data < a.value : e.data <= a.value) && (s = this._getOrReturnCtx(e, s), l(s, {
1014
- code: c.too_small,
1015
- type: "bigint",
1016
- minimum: a.value,
1017
- inclusive: a.inclusive,
1018
- message: a.message
1019
- }), n.dirty()) : a.kind === "max" ? (a.inclusive ? e.data > a.value : e.data >= a.value) && (s = this._getOrReturnCtx(e, s), l(s, {
1020
- code: c.too_big,
1021
- type: "bigint",
1022
- maximum: a.value,
1023
- inclusive: a.inclusive,
1024
- message: a.message
1025
- }), n.dirty()) : a.kind === "multipleOf" ? e.data % a.value !== BigInt(0) && (s = this._getOrReturnCtx(e, s), l(s, {
1026
- code: c.not_multiple_of,
1027
- multipleOf: a.value,
1028
- message: a.message
1029
- }), n.dirty()) : g.assertNever(a);
1030
- return { status: n.value, value: e.data };
1031
- }
1032
- gte(e, t) {
1033
- return this.setLimit("min", e, !0, h.toString(t));
1034
- }
1035
- gt(e, t) {
1036
- return this.setLimit("min", e, !1, h.toString(t));
1037
- }
1038
- lte(e, t) {
1039
- return this.setLimit("max", e, !0, h.toString(t));
1040
- }
1041
- lt(e, t) {
1042
- return this.setLimit("max", e, !1, h.toString(t));
1043
- }
1044
- setLimit(e, t, s, n) {
1045
- return new M({
1046
- ...this._def,
1047
- checks: [
1048
- ...this._def.checks,
1049
- {
1050
- kind: e,
1051
- value: t,
1052
- inclusive: s,
1053
- message: h.toString(n)
1054
- }
1055
- ]
1056
- });
1057
- }
1058
- _addCheck(e) {
1059
- return new M({
1060
- ...this._def,
1061
- checks: [...this._def.checks, e]
1062
- });
1063
- }
1064
- positive(e) {
1065
- return this._addCheck({
1066
- kind: "min",
1067
- value: BigInt(0),
1068
- inclusive: !1,
1069
- message: h.toString(e)
1070
- });
1071
- }
1072
- negative(e) {
1073
- return this._addCheck({
1074
- kind: "max",
1075
- value: BigInt(0),
1076
- inclusive: !1,
1077
- message: h.toString(e)
1078
- });
1079
- }
1080
- nonpositive(e) {
1081
- return this._addCheck({
1082
- kind: "max",
1083
- value: BigInt(0),
1084
- inclusive: !0,
1085
- message: h.toString(e)
1086
- });
1087
- }
1088
- nonnegative(e) {
1089
- return this._addCheck({
1090
- kind: "min",
1091
- value: BigInt(0),
1092
- inclusive: !0,
1093
- message: h.toString(e)
1094
- });
1095
- }
1096
- multipleOf(e, t) {
1097
- return this._addCheck({
1098
- kind: "multipleOf",
1099
- value: e,
1100
- message: h.toString(t)
1101
- });
1102
- }
1103
- get minValue() {
1104
- let e = null;
1105
- for (const t of this._def.checks)
1106
- t.kind === "min" && (e === null || t.value > e) && (e = t.value);
1107
- return e;
1108
- }
1109
- get maxValue() {
1110
- let e = null;
1111
- for (const t of this._def.checks)
1112
- t.kind === "max" && (e === null || t.value < e) && (e = t.value);
1113
- return e;
1114
- }
1115
- }
1116
- M.create = (r) => {
1117
- var e;
1118
- return new M({
1119
- checks: [],
1120
- typeName: p.ZodBigInt,
1121
- coerce: (e = r == null ? void 0 : r.coerce) !== null && e !== void 0 ? e : !1,
1122
- ...y(r)
1123
- });
1124
- };
1125
- class Y extends v {
1126
- _parse(e) {
1127
- if (this._def.coerce && (e.data = !!e.data), this._getType(e) !== u.boolean) {
1128
- const s = this._getOrReturnCtx(e);
1129
- return l(s, {
1130
- code: c.invalid_type,
1131
- expected: u.boolean,
1132
- received: s.parsedType
1133
- }), m;
1134
- }
1135
- return w(e.data);
1136
- }
1137
- }
1138
- Y.create = (r) => new Y({
1139
- typeName: p.ZodBoolean,
1140
- coerce: (r == null ? void 0 : r.coerce) || !1,
1141
- ...y(r)
1142
- });
1143
- class $ extends v {
1144
- _parse(e) {
1145
- if (this._def.coerce && (e.data = new Date(e.data)), this._getType(e) !== u.date) {
1146
- const a = this._getOrReturnCtx(e);
1147
- return l(a, {
1148
- code: c.invalid_type,
1149
- expected: u.date,
1150
- received: a.parsedType
1151
- }), m;
1152
- }
1153
- if (isNaN(e.data.getTime())) {
1154
- const a = this._getOrReturnCtx(e);
1155
- return l(a, {
1156
- code: c.invalid_date
1157
- }), m;
1158
- }
1159
- const s = new b();
1160
- let n;
1161
- for (const a of this._def.checks)
1162
- a.kind === "min" ? e.data.getTime() < a.value && (n = this._getOrReturnCtx(e, n), l(n, {
1163
- code: c.too_small,
1164
- message: a.message,
1165
- inclusive: !0,
1166
- exact: !1,
1167
- minimum: a.value,
1168
- type: "date"
1169
- }), s.dirty()) : a.kind === "max" ? e.data.getTime() > a.value && (n = this._getOrReturnCtx(e, n), l(n, {
1170
- code: c.too_big,
1171
- message: a.message,
1172
- inclusive: !0,
1173
- exact: !1,
1174
- maximum: a.value,
1175
- type: "date"
1176
- }), s.dirty()) : g.assertNever(a);
1177
- return {
1178
- status: s.value,
1179
- value: new Date(e.data.getTime())
1180
- };
1181
- }
1182
- _addCheck(e) {
1183
- return new $({
1184
- ...this._def,
1185
- checks: [...this._def.checks, e]
1186
- });
1187
- }
1188
- min(e, t) {
1189
- return this._addCheck({
1190
- kind: "min",
1191
- value: e.getTime(),
1192
- message: h.toString(t)
1193
- });
1194
- }
1195
- max(e, t) {
1196
- return this._addCheck({
1197
- kind: "max",
1198
- value: e.getTime(),
1199
- message: h.toString(t)
1200
- });
1201
- }
1202
- get minDate() {
1203
- let e = null;
1204
- for (const t of this._def.checks)
1205
- t.kind === "min" && (e === null || t.value > e) && (e = t.value);
1206
- return e != null ? new Date(e) : null;
1207
- }
1208
- get maxDate() {
1209
- let e = null;
1210
- for (const t of this._def.checks)
1211
- t.kind === "max" && (e === null || t.value < e) && (e = t.value);
1212
- return e != null ? new Date(e) : null;
1213
- }
1214
- }
1215
- $.create = (r) => new $({
1216
- checks: [],
1217
- coerce: (r == null ? void 0 : r.coerce) || !1,
1218
- typeName: p.ZodDate,
1219
- ...y(r)
1220
- });
1221
- class ce extends v {
1222
- _parse(e) {
1223
- if (this._getType(e) !== u.symbol) {
1224
- const s = this._getOrReturnCtx(e);
1225
- return l(s, {
1226
- code: c.invalid_type,
1227
- expected: u.symbol,
1228
- received: s.parsedType
1229
- }), m;
1230
- }
1231
- return w(e.data);
1232
- }
1233
- }
1234
- ce.create = (r) => new ce({
1235
- typeName: p.ZodSymbol,
1236
- ...y(r)
1237
- });
1238
- class H extends v {
1239
- _parse(e) {
1240
- if (this._getType(e) !== u.undefined) {
1241
- const s = this._getOrReturnCtx(e);
1242
- return l(s, {
1243
- code: c.invalid_type,
1244
- expected: u.undefined,
1245
- received: s.parsedType
1246
- }), m;
1247
- }
1248
- return w(e.data);
1249
- }
1250
- }
1251
- H.create = (r) => new H({
1252
- typeName: p.ZodUndefined,
1253
- ...y(r)
1254
- });
1255
- class G extends v {
1256
- _parse(e) {
1257
- if (this._getType(e) !== u.null) {
1258
- const s = this._getOrReturnCtx(e);
1259
- return l(s, {
1260
- code: c.invalid_type,
1261
- expected: u.null,
1262
- received: s.parsedType
1263
- }), m;
1264
- }
1265
- return w(e.data);
1266
- }
1267
- }
1268
- G.create = (r) => new G({
1269
- typeName: p.ZodNull,
1270
- ...y(r)
1271
- });
1272
- class B extends v {
1273
- constructor() {
1274
- super(...arguments), this._any = !0;
1275
- }
1276
- _parse(e) {
1277
- return w(e.data);
1278
- }
1279
- }
1280
- B.create = (r) => new B({
1281
- typeName: p.ZodAny,
1282
- ...y(r)
1283
- });
1284
- class V extends v {
1285
- constructor() {
1286
- super(...arguments), this._unknown = !0;
1287
- }
1288
- _parse(e) {
1289
- return w(e.data);
1290
- }
1291
- }
1292
- V.create = (r) => new V({
1293
- typeName: p.ZodUnknown,
1294
- ...y(r)
1295
- });
1296
- class R extends v {
1297
- _parse(e) {
1298
- const t = this._getOrReturnCtx(e);
1299
- return l(t, {
1300
- code: c.invalid_type,
1301
- expected: u.never,
1302
- received: t.parsedType
1303
- }), m;
1304
- }
1305
- }
1306
- R.create = (r) => new R({
1307
- typeName: p.ZodNever,
1308
- ...y(r)
1309
- });
1310
- class de extends v {
1311
- _parse(e) {
1312
- if (this._getType(e) !== u.undefined) {
1313
- const s = this._getOrReturnCtx(e);
1314
- return l(s, {
1315
- code: c.invalid_type,
1316
- expected: u.void,
1317
- received: s.parsedType
1318
- }), m;
1319
- }
1320
- return w(e.data);
1321
- }
1322
- }
1323
- de.create = (r) => new de({
1324
- typeName: p.ZodVoid,
1325
- ...y(r)
1326
- });
1327
- class N extends v {
1328
- _parse(e) {
1329
- const { ctx: t, status: s } = this._processInputParams(e), n = this._def;
1330
- if (t.parsedType !== u.array)
1331
- return l(t, {
1332
- code: c.invalid_type,
1333
- expected: u.array,
1334
- received: t.parsedType
1335
- }), m;
1336
- if (n.exactLength !== null) {
1337
- const i = t.data.length > n.exactLength.value, o = t.data.length < n.exactLength.value;
1338
- (i || o) && (l(t, {
1339
- code: i ? c.too_big : c.too_small,
1340
- minimum: o ? n.exactLength.value : void 0,
1341
- maximum: i ? n.exactLength.value : void 0,
1342
- type: "array",
1343
- inclusive: !0,
1344
- exact: !0,
1345
- message: n.exactLength.message
1346
- }), s.dirty());
1347
- }
1348
- if (n.minLength !== null && t.data.length < n.minLength.value && (l(t, {
1349
- code: c.too_small,
1350
- minimum: n.minLength.value,
1351
- type: "array",
1352
- inclusive: !0,
1353
- exact: !1,
1354
- message: n.minLength.message
1355
- }), s.dirty()), n.maxLength !== null && t.data.length > n.maxLength.value && (l(t, {
1356
- code: c.too_big,
1357
- maximum: n.maxLength.value,
1358
- type: "array",
1359
- inclusive: !0,
1360
- exact: !1,
1361
- message: n.maxLength.message
1362
- }), s.dirty()), t.common.async)
1363
- return Promise.all([...t.data].map((i, o) => n.type._parseAsync(new O(t, i, t.path, o)))).then((i) => b.mergeArray(s, i));
1364
- const a = [...t.data].map((i, o) => n.type._parseSync(new O(t, i, t.path, o)));
1365
- return b.mergeArray(s, a);
1366
- }
1367
- get element() {
1368
- return this._def.type;
1369
- }
1370
- min(e, t) {
1371
- return new N({
1372
- ...this._def,
1373
- minLength: { value: e, message: h.toString(t) }
1374
- });
1375
- }
1376
- max(e, t) {
1377
- return new N({
1378
- ...this._def,
1379
- maxLength: { value: e, message: h.toString(t) }
1380
- });
1381
- }
1382
- length(e, t) {
1383
- return new N({
1384
- ...this._def,
1385
- exactLength: { value: e, message: h.toString(t) }
1386
- });
1387
- }
1388
- nonempty(e) {
1389
- return this.min(1, e);
1390
- }
1391
- }
1392
- N.create = (r, e) => new N({
1393
- type: r,
1394
- minLength: null,
1395
- maxLength: null,
1396
- exactLength: null,
1397
- typeName: p.ZodArray,
1398
- ...y(e)
1399
- });
1400
- function z(r) {
1401
- if (r instanceof x) {
1402
- const e = {};
1403
- for (const t in r.shape) {
1404
- const s = r.shape[t];
1405
- e[t] = I.create(z(s));
1406
- }
1407
- return new x({
1408
- ...r._def,
1409
- shape: () => e
1410
- });
1411
- } else
1412
- return r instanceof N ? new N({
1413
- ...r._def,
1414
- type: z(r.element)
1415
- }) : r instanceof I ? I.create(z(r.unwrap())) : r instanceof D ? D.create(z(r.unwrap())) : r instanceof E ? E.create(r.items.map((e) => z(e))) : r;
1416
- }
1417
- class x extends v {
1418
- constructor() {
1419
- super(...arguments), this._cached = null, this.nonstrict = this.passthrough, this.augment = this.extend;
1420
- }
1421
- _getCached() {
1422
- if (this._cached !== null)
1423
- return this._cached;
1424
- const e = this._def.shape(), t = g.objectKeys(e);
1425
- return this._cached = { shape: e, keys: t };
1426
- }
1427
- _parse(e) {
1428
- if (this._getType(e) !== u.object) {
1429
- const d = this._getOrReturnCtx(e);
1430
- return l(d, {
1431
- code: c.invalid_type,
1432
- expected: u.object,
1433
- received: d.parsedType
1434
- }), m;
1435
- }
1436
- const { status: s, ctx: n } = this._processInputParams(e), { shape: a, keys: i } = this._getCached(), o = [];
1437
- if (!(this._def.catchall instanceof R && this._def.unknownKeys === "strip"))
1438
- for (const d in n.data)
1439
- i.includes(d) || o.push(d);
1440
- const f = [];
1441
- for (const d of i) {
1442
- const _ = a[d], T = n.data[d];
1443
- f.push({
1444
- key: { status: "valid", value: d },
1445
- value: _._parse(new O(n, T, n.path, d)),
1446
- alwaysSet: d in n.data
1447
- });
1448
- }
1449
- if (this._def.catchall instanceof R) {
1450
- const d = this._def.unknownKeys;
1451
- if (d === "passthrough")
1452
- for (const _ of o)
1453
- f.push({
1454
- key: { status: "valid", value: _ },
1455
- value: { status: "valid", value: n.data[_] }
1456
- });
1457
- else if (d === "strict")
1458
- o.length > 0 && (l(n, {
1459
- code: c.unrecognized_keys,
1460
- keys: o
1461
- }), s.dirty());
1462
- else if (d !== "strip")
1463
- throw new Error("Internal ZodObject error: invalid unknownKeys value.");
1464
- } else {
1465
- const d = this._def.catchall;
1466
- for (const _ of o) {
1467
- const T = n.data[_];
1468
- f.push({
1469
- key: { status: "valid", value: _ },
1470
- value: d._parse(
1471
- new O(n, T, n.path, _)
1472
- //, ctx.child(key), value, getParsedType(value)
1473
- ),
1474
- alwaysSet: _ in n.data
1475
- });
1476
- }
1477
- }
1478
- return n.common.async ? Promise.resolve().then(async () => {
1479
- const d = [];
1480
- for (const _ of f) {
1481
- const T = await _.key;
1482
- d.push({
1483
- key: T,
1484
- value: await _.value,
1485
- alwaysSet: _.alwaysSet
1486
- });
1487
- }
1488
- return d;
1489
- }).then((d) => b.mergeObjectSync(s, d)) : b.mergeObjectSync(s, f);
1490
- }
1491
- get shape() {
1492
- return this._def.shape();
1493
- }
1494
- strict(e) {
1495
- return h.errToObj, new x({
1496
- ...this._def,
1497
- unknownKeys: "strict",
1498
- ...e !== void 0 ? {
1499
- errorMap: (t, s) => {
1500
- var n, a, i, o;
1501
- const f = (i = (a = (n = this._def).errorMap) === null || a === void 0 ? void 0 : a.call(n, t, s).message) !== null && i !== void 0 ? i : s.defaultError;
1502
- return t.code === "unrecognized_keys" ? {
1503
- message: (o = h.errToObj(e).message) !== null && o !== void 0 ? o : f
1504
- } : {
1505
- message: f
1506
- };
1507
- }
1508
- } : {}
1509
- });
1510
- }
1511
- strip() {
1512
- return new x({
1513
- ...this._def,
1514
- unknownKeys: "strip"
1515
- });
1516
- }
1517
- passthrough() {
1518
- return new x({
1519
- ...this._def,
1520
- unknownKeys: "passthrough"
1521
- });
1522
- }
1523
- // const AugmentFactory =
1524
- // <Def extends ZodObjectDef>(def: Def) =>
1525
- // <Augmentation extends ZodRawShape>(
1526
- // augmentation: Augmentation
1527
- // ): ZodObject<
1528
- // extendShape<ReturnType<Def["shape"]>, Augmentation>,
1529
- // Def["unknownKeys"],
1530
- // Def["catchall"]
1531
- // > => {
1532
- // return new ZodObject({
1533
- // ...def,
1534
- // shape: () => ({
1535
- // ...def.shape(),
1536
- // ...augmentation,
1537
- // }),
1538
- // }) as any;
1539
- // };
1540
- extend(e) {
1541
- return new x({
1542
- ...this._def,
1543
- shape: () => ({
1544
- ...this._def.shape(),
1545
- ...e
1546
- })
1547
- });
1548
- }
1549
- /**
1550
- * Prior to zod@1.0.12 there was a bug in the
1551
- * inferred type of merged objects. Please
1552
- * upgrade if you are experiencing issues.
1553
- */
1554
- merge(e) {
1555
- return new x({
1556
- unknownKeys: e._def.unknownKeys,
1557
- catchall: e._def.catchall,
1558
- shape: () => ({
1559
- ...this._def.shape(),
1560
- ...e._def.shape()
1561
- }),
1562
- typeName: p.ZodObject
1563
- });
1564
- }
1565
- // merge<
1566
- // Incoming extends AnyZodObject,
1567
- // Augmentation extends Incoming["shape"],
1568
- // NewOutput extends {
1569
- // [k in keyof Augmentation | keyof Output]: k extends keyof Augmentation
1570
- // ? Augmentation[k]["_output"]
1571
- // : k extends keyof Output
1572
- // ? Output[k]
1573
- // : never;
1574
- // },
1575
- // NewInput extends {
1576
- // [k in keyof Augmentation | keyof Input]: k extends keyof Augmentation
1577
- // ? Augmentation[k]["_input"]
1578
- // : k extends keyof Input
1579
- // ? Input[k]
1580
- // : never;
1581
- // }
1582
- // >(
1583
- // merging: Incoming
1584
- // ): ZodObject<
1585
- // extendShape<T, ReturnType<Incoming["_def"]["shape"]>>,
1586
- // Incoming["_def"]["unknownKeys"],
1587
- // Incoming["_def"]["catchall"],
1588
- // NewOutput,
1589
- // NewInput
1590
- // > {
1591
- // const merged: any = new ZodObject({
1592
- // unknownKeys: merging._def.unknownKeys,
1593
- // catchall: merging._def.catchall,
1594
- // shape: () =>
1595
- // objectUtil.mergeShapes(this._def.shape(), merging._def.shape()),
1596
- // typeName: ZodFirstPartyTypeKind.ZodObject,
1597
- // }) as any;
1598
- // return merged;
1599
- // }
1600
- setKey(e, t) {
1601
- return this.augment({ [e]: t });
1602
- }
1603
- // merge<Incoming extends AnyZodObject>(
1604
- // merging: Incoming
1605
- // ): //ZodObject<T & Incoming["_shape"], UnknownKeys, Catchall> = (merging) => {
1606
- // ZodObject<
1607
- // extendShape<T, ReturnType<Incoming["_def"]["shape"]>>,
1608
- // Incoming["_def"]["unknownKeys"],
1609
- // Incoming["_def"]["catchall"]
1610
- // > {
1611
- // // const mergedShape = objectUtil.mergeShapes(
1612
- // // this._def.shape(),
1613
- // // merging._def.shape()
1614
- // // );
1615
- // const merged: any = new ZodObject({
1616
- // unknownKeys: merging._def.unknownKeys,
1617
- // catchall: merging._def.catchall,
1618
- // shape: () =>
1619
- // objectUtil.mergeShapes(this._def.shape(), merging._def.shape()),
1620
- // typeName: ZodFirstPartyTypeKind.ZodObject,
1621
- // }) as any;
1622
- // return merged;
1623
- // }
1624
- catchall(e) {
1625
- return new x({
1626
- ...this._def,
1627
- catchall: e
1628
- });
1629
- }
1630
- pick(e) {
1631
- const t = {};
1632
- return g.objectKeys(e).forEach((s) => {
1633
- e[s] && this.shape[s] && (t[s] = this.shape[s]);
1634
- }), new x({
1635
- ...this._def,
1636
- shape: () => t
1637
- });
1638
- }
1639
- omit(e) {
1640
- const t = {};
1641
- return g.objectKeys(this.shape).forEach((s) => {
1642
- e[s] || (t[s] = this.shape[s]);
1643
- }), new x({
1644
- ...this._def,
1645
- shape: () => t
1646
- });
1647
- }
1648
- /**
1649
- * @deprecated
1650
- */
1651
- deepPartial() {
1652
- return z(this);
1653
- }
1654
- partial(e) {
1655
- const t = {};
1656
- return g.objectKeys(this.shape).forEach((s) => {
1657
- const n = this.shape[s];
1658
- e && !e[s] ? t[s] = n : t[s] = n.optional();
1659
- }), new x({
1660
- ...this._def,
1661
- shape: () => t
1662
- });
1663
- }
1664
- required(e) {
1665
- const t = {};
1666
- return g.objectKeys(this.shape).forEach((s) => {
1667
- if (e && !e[s])
1668
- t[s] = this.shape[s];
1669
- else {
1670
- let a = this.shape[s];
1671
- for (; a instanceof I; )
1672
- a = a._def.innerType;
1673
- t[s] = a;
1674
- }
1675
- }), new x({
1676
- ...this._def,
1677
- shape: () => t
1678
- });
1679
- }
1680
- keyof() {
1681
- return Ze(g.objectKeys(this.shape));
1682
- }
1683
- }
1684
- x.create = (r, e) => new x({
1685
- shape: () => r,
1686
- unknownKeys: "strip",
1687
- catchall: R.create(),
1688
- typeName: p.ZodObject,
1689
- ...y(e)
1690
- });
1691
- x.strictCreate = (r, e) => new x({
1692
- shape: () => r,
1693
- unknownKeys: "strict",
1694
- catchall: R.create(),
1695
- typeName: p.ZodObject,
1696
- ...y(e)
1697
- });
1698
- x.lazycreate = (r, e) => new x({
1699
- shape: r,
1700
- unknownKeys: "strip",
1701
- catchall: R.create(),
1702
- typeName: p.ZodObject,
1703
- ...y(e)
1704
- });
1705
- class X extends v {
1706
- _parse(e) {
1707
- const { ctx: t } = this._processInputParams(e), s = this._def.options;
1708
- function n(a) {
1709
- for (const o of a)
1710
- if (o.result.status === "valid")
1711
- return o.result;
1712
- for (const o of a)
1713
- if (o.result.status === "dirty")
1714
- return t.common.issues.push(...o.ctx.common.issues), o.result;
1715
- const i = a.map((o) => new S(o.ctx.common.issues));
1716
- return l(t, {
1717
- code: c.invalid_union,
1718
- unionErrors: i
1719
- }), m;
1720
- }
1721
- if (t.common.async)
1722
- return Promise.all(s.map(async (a) => {
1723
- const i = {
1724
- ...t,
1725
- common: {
1726
- ...t.common,
1727
- issues: []
1728
- },
1729
- parent: null
1730
- };
1731
- return {
1732
- result: await a._parseAsync({
1733
- data: t.data,
1734
- path: t.path,
1735
- parent: i
1736
- }),
1737
- ctx: i
1738
- };
1739
- })).then(n);
1740
- {
1741
- let a;
1742
- const i = [];
1743
- for (const f of s) {
1744
- const d = {
1745
- ...t,
1746
- common: {
1747
- ...t.common,
1748
- issues: []
1749
- },
1750
- parent: null
1751
- }, _ = f._parseSync({
1752
- data: t.data,
1753
- path: t.path,
1754
- parent: d
1755
- });
1756
- if (_.status === "valid")
1757
- return _;
1758
- _.status === "dirty" && !a && (a = { result: _, ctx: d }), d.common.issues.length && i.push(d.common.issues);
1759
- }
1760
- if (a)
1761
- return t.common.issues.push(...a.ctx.common.issues), a.result;
1762
- const o = i.map((f) => new S(f));
1763
- return l(t, {
1764
- code: c.invalid_union,
1765
- unionErrors: o
1766
- }), m;
1767
- }
1768
- }
1769
- get options() {
1770
- return this._def.options;
1771
- }
1772
- }
1773
- X.create = (r, e) => new X({
1774
- options: r,
1775
- typeName: p.ZodUnion,
1776
- ...y(e)
1777
- });
1778
- const ne = (r) => r instanceof F ? ne(r.schema) : r instanceof C ? ne(r.innerType()) : r instanceof ee ? [r.value] : r instanceof P ? r.options : r instanceof te ? Object.keys(r.enum) : r instanceof re ? ne(r._def.innerType) : r instanceof H ? [void 0] : r instanceof G ? [null] : null;
1779
- class pe extends v {
1780
- _parse(e) {
1781
- const { ctx: t } = this._processInputParams(e);
1782
- if (t.parsedType !== u.object)
1783
- return l(t, {
1784
- code: c.invalid_type,
1785
- expected: u.object,
1786
- received: t.parsedType
1787
- }), m;
1788
- const s = this.discriminator, n = t.data[s], a = this.optionsMap.get(n);
1789
- return a ? t.common.async ? a._parseAsync({
1790
- data: t.data,
1791
- path: t.path,
1792
- parent: t
1793
- }) : a._parseSync({
1794
- data: t.data,
1795
- path: t.path,
1796
- parent: t
1797
- }) : (l(t, {
1798
- code: c.invalid_union_discriminator,
1799
- options: Array.from(this.optionsMap.keys()),
1800
- path: [s]
1801
- }), m);
1802
- }
1803
- get discriminator() {
1804
- return this._def.discriminator;
1805
- }
1806
- get options() {
1807
- return this._def.options;
1808
- }
1809
- get optionsMap() {
1810
- return this._def.optionsMap;
1811
- }
1812
- /**
1813
- * The constructor of the discriminated union schema. Its behaviour is very similar to that of the normal z.union() constructor.
1814
- * However, it only allows a union of objects, all of which need to share a discriminator property. This property must
1815
- * have a different value for each object in the union.
1816
- * @param discriminator the name of the discriminator property
1817
- * @param types an array of object schemas
1818
- * @param params
1819
- */
1820
- static create(e, t, s) {
1821
- const n = /* @__PURE__ */ new Map();
1822
- for (const a of t) {
1823
- const i = ne(a.shape[e]);
1824
- if (!i)
1825
- throw new Error(`A discriminator value for key \`${e}\` could not be extracted from all schema options`);
1826
- for (const o of i) {
1827
- if (n.has(o))
1828
- throw new Error(`Discriminator property ${String(e)} has duplicate value ${String(o)}`);
1829
- n.set(o, a);
1830
- }
1831
- }
1832
- return new pe({
1833
- typeName: p.ZodDiscriminatedUnion,
1834
- discriminator: e,
1835
- options: t,
1836
- optionsMap: n,
1837
- ...y(s)
1838
- });
1839
- }
1840
- }
1841
- function xe(r, e) {
1842
- const t = j(r), s = j(e);
1843
- if (r === e)
1844
- return { valid: !0, data: r };
1845
- if (t === u.object && s === u.object) {
1846
- const n = g.objectKeys(e), a = g.objectKeys(r).filter((o) => n.indexOf(o) !== -1), i = { ...r, ...e };
1847
- for (const o of a) {
1848
- const f = xe(r[o], e[o]);
1849
- if (!f.valid)
1850
- return { valid: !1 };
1851
- i[o] = f.data;
1852
- }
1853
- return { valid: !0, data: i };
1854
- } else if (t === u.array && s === u.array) {
1855
- if (r.length !== e.length)
1856
- return { valid: !1 };
1857
- const n = [];
1858
- for (let a = 0; a < r.length; a++) {
1859
- const i = r[a], o = e[a], f = xe(i, o);
1860
- if (!f.valid)
1861
- return { valid: !1 };
1862
- n.push(f.data);
1863
- }
1864
- return { valid: !0, data: n };
1865
- } else
1866
- return t === u.date && s === u.date && +r == +e ? { valid: !0, data: r } : { valid: !1 };
1867
- }
1868
- class Q extends v {
1869
- _parse(e) {
1870
- const { status: t, ctx: s } = this._processInputParams(e), n = (a, i) => {
1871
- if (_e(a) || _e(i))
1872
- return m;
1873
- const o = xe(a.value, i.value);
1874
- return o.valid ? ((ge(a) || ge(i)) && t.dirty(), { status: t.value, value: o.data }) : (l(s, {
1875
- code: c.invalid_intersection_types
1876
- }), m);
1877
- };
1878
- return s.common.async ? Promise.all([
1879
- this._def.left._parseAsync({
1880
- data: s.data,
1881
- path: s.path,
1882
- parent: s
1883
- }),
1884
- this._def.right._parseAsync({
1885
- data: s.data,
1886
- path: s.path,
1887
- parent: s
1888
- })
1889
- ]).then(([a, i]) => n(a, i)) : n(this._def.left._parseSync({
1890
- data: s.data,
1891
- path: s.path,
1892
- parent: s
1893
- }), this._def.right._parseSync({
1894
- data: s.data,
1895
- path: s.path,
1896
- parent: s
1897
- }));
1898
- }
1899
- }
1900
- Q.create = (r, e, t) => new Q({
1901
- left: r,
1902
- right: e,
1903
- typeName: p.ZodIntersection,
1904
- ...y(t)
1905
- });
1906
- class E extends v {
1907
- _parse(e) {
1908
- const { status: t, ctx: s } = this._processInputParams(e);
1909
- if (s.parsedType !== u.array)
1910
- return l(s, {
1911
- code: c.invalid_type,
1912
- expected: u.array,
1913
- received: s.parsedType
1914
- }), m;
1915
- if (s.data.length < this._def.items.length)
1916
- return l(s, {
1917
- code: c.too_small,
1918
- minimum: this._def.items.length,
1919
- inclusive: !0,
1920
- exact: !1,
1921
- type: "array"
1922
- }), m;
1923
- !this._def.rest && s.data.length > this._def.items.length && (l(s, {
1924
- code: c.too_big,
1925
- maximum: this._def.items.length,
1926
- inclusive: !0,
1927
- exact: !1,
1928
- type: "array"
1929
- }), t.dirty());
1930
- const a = [...s.data].map((i, o) => {
1931
- const f = this._def.items[o] || this._def.rest;
1932
- return f ? f._parse(new O(s, i, s.path, o)) : null;
1933
- }).filter((i) => !!i);
1934
- return s.common.async ? Promise.all(a).then((i) => b.mergeArray(t, i)) : b.mergeArray(t, a);
1935
- }
1936
- get items() {
1937
- return this._def.items;
1938
- }
1939
- rest(e) {
1940
- return new E({
1941
- ...this._def,
1942
- rest: e
1943
- });
1944
- }
1945
- }
1946
- E.create = (r, e) => {
1947
- if (!Array.isArray(r))
1948
- throw new Error("You must pass an array of schemas to z.tuple([ ... ])");
1949
- return new E({
1950
- items: r,
1951
- typeName: p.ZodTuple,
1952
- rest: null,
1953
- ...y(e)
1954
- });
1955
- };
1956
- class K extends v {
1957
- get keySchema() {
1958
- return this._def.keyType;
1959
- }
1960
- get valueSchema() {
1961
- return this._def.valueType;
1962
- }
1963
- _parse(e) {
1964
- const { status: t, ctx: s } = this._processInputParams(e);
1965
- if (s.parsedType !== u.object)
1966
- return l(s, {
1967
- code: c.invalid_type,
1968
- expected: u.object,
1969
- received: s.parsedType
1970
- }), m;
1971
- const n = [], a = this._def.keyType, i = this._def.valueType;
1972
- for (const o in s.data)
1973
- n.push({
1974
- key: a._parse(new O(s, o, s.path, o)),
1975
- value: i._parse(new O(s, s.data[o], s.path, o))
1976
- });
1977
- return s.common.async ? b.mergeObjectAsync(t, n) : b.mergeObjectSync(t, n);
1978
- }
1979
- get element() {
1980
- return this._def.valueType;
1981
- }
1982
- static create(e, t, s) {
1983
- return t instanceof v ? new K({
1984
- keyType: e,
1985
- valueType: t,
1986
- typeName: p.ZodRecord,
1987
- ...y(s)
1988
- }) : new K({
1989
- keyType: Z.create(),
1990
- valueType: e,
1991
- typeName: p.ZodRecord,
1992
- ...y(t)
1993
- });
1994
- }
1995
- }
1996
- class ue extends v {
1997
- get keySchema() {
1998
- return this._def.keyType;
1999
- }
2000
- get valueSchema() {
2001
- return this._def.valueType;
2002
- }
2003
- _parse(e) {
2004
- const { status: t, ctx: s } = this._processInputParams(e);
2005
- if (s.parsedType !== u.map)
2006
- return l(s, {
2007
- code: c.invalid_type,
2008
- expected: u.map,
2009
- received: s.parsedType
2010
- }), m;
2011
- const n = this._def.keyType, a = this._def.valueType, i = [...s.data.entries()].map(([o, f], d) => ({
2012
- key: n._parse(new O(s, o, s.path, [d, "key"])),
2013
- value: a._parse(new O(s, f, s.path, [d, "value"]))
2014
- }));
2015
- if (s.common.async) {
2016
- const o = /* @__PURE__ */ new Map();
2017
- return Promise.resolve().then(async () => {
2018
- for (const f of i) {
2019
- const d = await f.key, _ = await f.value;
2020
- if (d.status === "aborted" || _.status === "aborted")
2021
- return m;
2022
- (d.status === "dirty" || _.status === "dirty") && t.dirty(), o.set(d.value, _.value);
2023
- }
2024
- return { status: t.value, value: o };
2025
- });
2026
- } else {
2027
- const o = /* @__PURE__ */ new Map();
2028
- for (const f of i) {
2029
- const d = f.key, _ = f.value;
2030
- if (d.status === "aborted" || _.status === "aborted")
2031
- return m;
2032
- (d.status === "dirty" || _.status === "dirty") && t.dirty(), o.set(d.value, _.value);
2033
- }
2034
- return { status: t.value, value: o };
2035
- }
2036
- }
2037
- }
2038
- ue.create = (r, e, t) => new ue({
2039
- valueType: e,
2040
- keyType: r,
2041
- typeName: p.ZodMap,
2042
- ...y(t)
2043
- });
2044
- class L extends v {
2045
- _parse(e) {
2046
- const { status: t, ctx: s } = this._processInputParams(e);
2047
- if (s.parsedType !== u.set)
2048
- return l(s, {
2049
- code: c.invalid_type,
2050
- expected: u.set,
2051
- received: s.parsedType
2052
- }), m;
2053
- const n = this._def;
2054
- n.minSize !== null && s.data.size < n.minSize.value && (l(s, {
2055
- code: c.too_small,
2056
- minimum: n.minSize.value,
2057
- type: "set",
2058
- inclusive: !0,
2059
- exact: !1,
2060
- message: n.minSize.message
2061
- }), t.dirty()), n.maxSize !== null && s.data.size > n.maxSize.value && (l(s, {
2062
- code: c.too_big,
2063
- maximum: n.maxSize.value,
2064
- type: "set",
2065
- inclusive: !0,
2066
- exact: !1,
2067
- message: n.maxSize.message
2068
- }), t.dirty());
2069
- const a = this._def.valueType;
2070
- function i(f) {
2071
- const d = /* @__PURE__ */ new Set();
2072
- for (const _ of f) {
2073
- if (_.status === "aborted")
2074
- return m;
2075
- _.status === "dirty" && t.dirty(), d.add(_.value);
2076
- }
2077
- return { status: t.value, value: d };
2078
- }
2079
- const o = [...s.data.values()].map((f, d) => a._parse(new O(s, f, s.path, d)));
2080
- return s.common.async ? Promise.all(o).then((f) => i(f)) : i(o);
2081
- }
2082
- min(e, t) {
2083
- return new L({
2084
- ...this._def,
2085
- minSize: { value: e, message: h.toString(t) }
2086
- });
2087
- }
2088
- max(e, t) {
2089
- return new L({
2090
- ...this._def,
2091
- maxSize: { value: e, message: h.toString(t) }
2092
- });
2093
- }
2094
- size(e, t) {
2095
- return this.min(e, t).max(e, t);
2096
- }
2097
- nonempty(e) {
2098
- return this.min(1, e);
2099
- }
2100
- }
2101
- L.create = (r, e) => new L({
2102
- valueType: r,
2103
- minSize: null,
2104
- maxSize: null,
2105
- typeName: p.ZodSet,
2106
- ...y(e)
2107
- });
2108
- class U extends v {
2109
- constructor() {
2110
- super(...arguments), this.validate = this.implement;
2111
- }
2112
- _parse(e) {
2113
- const { ctx: t } = this._processInputParams(e);
2114
- if (t.parsedType !== u.function)
2115
- return l(t, {
2116
- code: c.invalid_type,
2117
- expected: u.function,
2118
- received: t.parsedType
2119
- }), m;
2120
- function s(o, f) {
2121
- return ie({
2122
- data: o,
2123
- path: t.path,
2124
- errorMaps: [
2125
- t.common.contextualErrorMap,
2126
- t.schemaErrorMap,
2127
- ae(),
2128
- q
2129
- ].filter((d) => !!d),
2130
- issueData: {
2131
- code: c.invalid_arguments,
2132
- argumentsError: f
2133
- }
2134
- });
2135
- }
2136
- function n(o, f) {
2137
- return ie({
2138
- data: o,
2139
- path: t.path,
2140
- errorMaps: [
2141
- t.common.contextualErrorMap,
2142
- t.schemaErrorMap,
2143
- ae(),
2144
- q
2145
- ].filter((d) => !!d),
2146
- issueData: {
2147
- code: c.invalid_return_type,
2148
- returnTypeError: f
2149
- }
2150
- });
2151
- }
2152
- const a = { errorMap: t.common.contextualErrorMap }, i = t.data;
2153
- if (this._def.returns instanceof W) {
2154
- const o = this;
2155
- return w(async function(...f) {
2156
- const d = new S([]), _ = await o._def.args.parseAsync(f, a).catch((me) => {
2157
- throw d.addIssue(s(f, me)), d;
2158
- }), T = await Reflect.apply(i, this, _);
2159
- return await o._def.returns._def.type.parseAsync(T, a).catch((me) => {
2160
- throw d.addIssue(n(T, me)), d;
2161
- });
2162
- });
2163
- } else {
2164
- const o = this;
2165
- return w(function(...f) {
2166
- const d = o._def.args.safeParse(f, a);
2167
- if (!d.success)
2168
- throw new S([s(f, d.error)]);
2169
- const _ = Reflect.apply(i, this, d.data), T = o._def.returns.safeParse(_, a);
2170
- if (!T.success)
2171
- throw new S([n(_, T.error)]);
2172
- return T.data;
2173
- });
2174
- }
2175
- }
2176
- parameters() {
2177
- return this._def.args;
2178
- }
2179
- returnType() {
2180
- return this._def.returns;
2181
- }
2182
- args(...e) {
2183
- return new U({
2184
- ...this._def,
2185
- args: E.create(e).rest(V.create())
2186
- });
2187
- }
2188
- returns(e) {
2189
- return new U({
2190
- ...this._def,
2191
- returns: e
2192
- });
2193
- }
2194
- implement(e) {
2195
- return this.parse(e);
2196
- }
2197
- strictImplement(e) {
2198
- return this.parse(e);
2199
- }
2200
- static create(e, t, s) {
2201
- return new U({
2202
- args: e || E.create([]).rest(V.create()),
2203
- returns: t || V.create(),
2204
- typeName: p.ZodFunction,
2205
- ...y(s)
2206
- });
2207
- }
2208
- }
2209
- class F extends v {
2210
- get schema() {
2211
- return this._def.getter();
2212
- }
2213
- _parse(e) {
2214
- const { ctx: t } = this._processInputParams(e);
2215
- return this._def.getter()._parse({ data: t.data, path: t.path, parent: t });
2216
- }
2217
- }
2218
- F.create = (r, e) => new F({
2219
- getter: r,
2220
- typeName: p.ZodLazy,
2221
- ...y(e)
2222
- });
2223
- class ee extends v {
2224
- _parse(e) {
2225
- if (e.data !== this._def.value) {
2226
- const t = this._getOrReturnCtx(e);
2227
- return l(t, {
2228
- received: t.data,
2229
- code: c.invalid_literal,
2230
- expected: this._def.value
2231
- }), m;
2232
- }
2233
- return { status: "valid", value: e.data };
2234
- }
2235
- get value() {
2236
- return this._def.value;
2237
- }
2238
- }
2239
- ee.create = (r, e) => new ee({
2240
- value: r,
2241
- typeName: p.ZodLiteral,
2242
- ...y(e)
2243
- });
2244
- function Ze(r, e) {
2245
- return new P({
2246
- values: r,
2247
- typeName: p.ZodEnum,
2248
- ...y(e)
2249
- });
2250
- }
2251
- class P extends v {
2252
- _parse(e) {
2253
- if (typeof e.data != "string") {
2254
- const t = this._getOrReturnCtx(e), s = this._def.values;
2255
- return l(t, {
2256
- expected: g.joinValues(s),
2257
- received: t.parsedType,
2258
- code: c.invalid_type
2259
- }), m;
2260
- }
2261
- if (this._def.values.indexOf(e.data) === -1) {
2262
- const t = this._getOrReturnCtx(e), s = this._def.values;
2263
- return l(t, {
2264
- received: t.data,
2265
- code: c.invalid_enum_value,
2266
- options: s
2267
- }), m;
2268
- }
2269
- return w(e.data);
2270
- }
2271
- get options() {
2272
- return this._def.values;
2273
- }
2274
- get enum() {
2275
- const e = {};
2276
- for (const t of this._def.values)
2277
- e[t] = t;
2278
- return e;
2279
- }
2280
- get Values() {
2281
- const e = {};
2282
- for (const t of this._def.values)
2283
- e[t] = t;
2284
- return e;
2285
- }
2286
- get Enum() {
2287
- const e = {};
2288
- for (const t of this._def.values)
2289
- e[t] = t;
2290
- return e;
2291
- }
2292
- extract(e) {
2293
- return P.create(e);
2294
- }
2295
- exclude(e) {
2296
- return P.create(this.options.filter((t) => !e.includes(t)));
2297
- }
2298
- }
2299
- P.create = Ze;
2300
- class te extends v {
2301
- _parse(e) {
2302
- const t = g.getValidEnumValues(this._def.values), s = this._getOrReturnCtx(e);
2303
- if (s.parsedType !== u.string && s.parsedType !== u.number) {
2304
- const n = g.objectValues(t);
2305
- return l(s, {
2306
- expected: g.joinValues(n),
2307
- received: s.parsedType,
2308
- code: c.invalid_type
2309
- }), m;
2310
- }
2311
- if (t.indexOf(e.data) === -1) {
2312
- const n = g.objectValues(t);
2313
- return l(s, {
2314
- received: s.data,
2315
- code: c.invalid_enum_value,
2316
- options: n
2317
- }), m;
2318
- }
2319
- return w(e.data);
2320
- }
2321
- get enum() {
2322
- return this._def.values;
2323
- }
2324
- }
2325
- te.create = (r, e) => new te({
2326
- values: r,
2327
- typeName: p.ZodNativeEnum,
2328
- ...y(e)
2329
- });
2330
- class W extends v {
2331
- unwrap() {
2332
- return this._def.type;
2333
- }
2334
- _parse(e) {
2335
- const { ctx: t } = this._processInputParams(e);
2336
- if (t.parsedType !== u.promise && t.common.async === !1)
2337
- return l(t, {
2338
- code: c.invalid_type,
2339
- expected: u.promise,
2340
- received: t.parsedType
2341
- }), m;
2342
- const s = t.parsedType === u.promise ? t.data : Promise.resolve(t.data);
2343
- return w(s.then((n) => this._def.type.parseAsync(n, {
2344
- path: t.path,
2345
- errorMap: t.common.contextualErrorMap
2346
- })));
2347
- }
2348
- }
2349
- W.create = (r, e) => new W({
2350
- type: r,
2351
- typeName: p.ZodPromise,
2352
- ...y(e)
2353
- });
2354
- class C extends v {
2355
- innerType() {
2356
- return this._def.schema;
2357
- }
2358
- sourceType() {
2359
- return this._def.schema._def.typeName === p.ZodEffects ? this._def.schema.sourceType() : this._def.schema;
2360
- }
2361
- _parse(e) {
2362
- const { status: t, ctx: s } = this._processInputParams(e), n = this._def.effect || null, a = {
2363
- addIssue: (i) => {
2364
- l(s, i), i.fatal ? t.abort() : t.dirty();
2365
- },
2366
- get path() {
2367
- return s.path;
2368
- }
2369
- };
2370
- if (a.addIssue = a.addIssue.bind(a), n.type === "preprocess") {
2371
- const i = n.transform(s.data, a);
2372
- return s.common.issues.length ? {
2373
- status: "dirty",
2374
- value: s.data
2375
- } : s.common.async ? Promise.resolve(i).then((o) => this._def.schema._parseAsync({
2376
- data: o,
2377
- path: s.path,
2378
- parent: s
2379
- })) : this._def.schema._parseSync({
2380
- data: i,
2381
- path: s.path,
2382
- parent: s
2383
- });
2384
- }
2385
- if (n.type === "refinement") {
2386
- const i = (o) => {
2387
- const f = n.refinement(o, a);
2388
- if (s.common.async)
2389
- return Promise.resolve(f);
2390
- if (f instanceof Promise)
2391
- throw new Error("Async refinement encountered during synchronous parse operation. Use .parseAsync instead.");
2392
- return o;
2393
- };
2394
- if (s.common.async === !1) {
2395
- const o = this._def.schema._parseSync({
2396
- data: s.data,
2397
- path: s.path,
2398
- parent: s
2399
- });
2400
- return o.status === "aborted" ? m : (o.status === "dirty" && t.dirty(), i(o.value), { status: t.value, value: o.value });
2401
- } else
2402
- return this._def.schema._parseAsync({ data: s.data, path: s.path, parent: s }).then((o) => o.status === "aborted" ? m : (o.status === "dirty" && t.dirty(), i(o.value).then(() => ({ status: t.value, value: o.value }))));
2403
- }
2404
- if (n.type === "transform")
2405
- if (s.common.async === !1) {
2406
- const i = this._def.schema._parseSync({
2407
- data: s.data,
2408
- path: s.path,
2409
- parent: s
2410
- });
2411
- if (!J(i))
2412
- return i;
2413
- const o = n.transform(i.value, a);
2414
- if (o instanceof Promise)
2415
- throw new Error("Asynchronous transform encountered during synchronous parse operation. Use .parseAsync instead.");
2416
- return { status: t.value, value: o };
2417
- } else
2418
- return this._def.schema._parseAsync({ data: s.data, path: s.path, parent: s }).then((i) => J(i) ? Promise.resolve(n.transform(i.value, a)).then((o) => ({ status: t.value, value: o })) : i);
2419
- g.assertNever(n);
2420
- }
2421
- }
2422
- C.create = (r, e, t) => new C({
2423
- schema: r,
2424
- typeName: p.ZodEffects,
2425
- effect: e,
2426
- ...y(t)
2427
- });
2428
- C.createWithPreprocess = (r, e, t) => new C({
2429
- schema: e,
2430
- effect: { type: "preprocess", transform: r },
2431
- typeName: p.ZodEffects,
2432
- ...y(t)
2433
- });
2434
- class I extends v {
2435
- _parse(e) {
2436
- return this._getType(e) === u.undefined ? w(void 0) : this._def.innerType._parse(e);
2437
- }
2438
- unwrap() {
2439
- return this._def.innerType;
2440
- }
2441
- }
2442
- I.create = (r, e) => new I({
2443
- innerType: r,
2444
- typeName: p.ZodOptional,
2445
- ...y(e)
2446
- });
2447
- class D extends v {
2448
- _parse(e) {
2449
- return this._getType(e) === u.null ? w(null) : this._def.innerType._parse(e);
2450
- }
2451
- unwrap() {
2452
- return this._def.innerType;
2453
- }
2454
- }
2455
- D.create = (r, e) => new D({
2456
- innerType: r,
2457
- typeName: p.ZodNullable,
2458
- ...y(e)
2459
- });
2460
- class re extends v {
2461
- _parse(e) {
2462
- const { ctx: t } = this._processInputParams(e);
2463
- let s = t.data;
2464
- return t.parsedType === u.undefined && (s = this._def.defaultValue()), this._def.innerType._parse({
2465
- data: s,
2466
- path: t.path,
2467
- parent: t
2468
- });
2469
- }
2470
- removeDefault() {
2471
- return this._def.innerType;
2472
- }
2473
- }
2474
- re.create = (r, e) => new re({
2475
- innerType: r,
2476
- typeName: p.ZodDefault,
2477
- defaultValue: typeof e.default == "function" ? e.default : () => e.default,
2478
- ...y(e)
2479
- });
2480
- class le extends v {
2481
- _parse(e) {
2482
- const { ctx: t } = this._processInputParams(e), s = {
2483
- ...t,
2484
- common: {
2485
- ...t.common,
2486
- issues: []
2487
- }
2488
- }, n = this._def.innerType._parse({
2489
- data: s.data,
2490
- path: s.path,
2491
- parent: {
2492
- ...s
2493
- }
2494
- });
2495
- return oe(n) ? n.then((a) => ({
2496
- status: "valid",
2497
- value: a.status === "valid" ? a.value : this._def.catchValue({
2498
- get error() {
2499
- return new S(s.common.issues);
2500
- },
2501
- input: s.data
2502
- })
2503
- })) : {
2504
- status: "valid",
2505
- value: n.status === "valid" ? n.value : this._def.catchValue({
2506
- get error() {
2507
- return new S(s.common.issues);
2508
- },
2509
- input: s.data
2510
- })
2511
- };
2512
- }
2513
- removeCatch() {
2514
- return this._def.innerType;
2515
- }
2516
- }
2517
- le.create = (r, e) => new le({
2518
- innerType: r,
2519
- typeName: p.ZodCatch,
2520
- catchValue: typeof e.catch == "function" ? e.catch : () => e.catch,
2521
- ...y(e)
2522
- });
2523
- class fe extends v {
2524
- _parse(e) {
2525
- if (this._getType(e) !== u.nan) {
2526
- const s = this._getOrReturnCtx(e);
2527
- return l(s, {
2528
- code: c.invalid_type,
2529
- expected: u.nan,
2530
- received: s.parsedType
2531
- }), m;
2532
- }
2533
- return { status: "valid", value: e.data };
2534
- }
2535
- }
2536
- fe.create = (r) => new fe({
2537
- typeName: p.ZodNaN,
2538
- ...y(r)
2539
- });
2540
- const qe = Symbol("zod_brand");
2541
- class Se extends v {
2542
- _parse(e) {
2543
- const { ctx: t } = this._processInputParams(e), s = t.data;
2544
- return this._def.type._parse({
2545
- data: s,
2546
- path: t.path,
2547
- parent: t
2548
- });
2549
- }
2550
- unwrap() {
2551
- return this._def.type;
2552
- }
2553
- }
2554
- class se extends v {
2555
- _parse(e) {
2556
- const { status: t, ctx: s } = this._processInputParams(e);
2557
- if (s.common.async)
2558
- return (async () => {
2559
- const a = await this._def.in._parseAsync({
2560
- data: s.data,
2561
- path: s.path,
2562
- parent: s
2563
- });
2564
- return a.status === "aborted" ? m : a.status === "dirty" ? (t.dirty(), Te(a.value)) : this._def.out._parseAsync({
2565
- data: a.value,
2566
- path: s.path,
2567
- parent: s
2568
- });
2569
- })();
2570
- {
2571
- const n = this._def.in._parseSync({
2572
- data: s.data,
2573
- path: s.path,
2574
- parent: s
2575
- });
2576
- return n.status === "aborted" ? m : n.status === "dirty" ? (t.dirty(), {
2577
- status: "dirty",
2578
- value: n.value
2579
- }) : this._def.out._parseSync({
2580
- data: n.value,
2581
- path: s.path,
2582
- parent: s
2583
- });
2584
- }
2585
- }
2586
- static create(e, t) {
2587
- return new se({
2588
- in: e,
2589
- out: t,
2590
- typeName: p.ZodPipeline
2591
- });
2592
- }
2593
- }
2594
- class he extends v {
2595
- _parse(e) {
2596
- const t = this._def.innerType._parse(e);
2597
- return J(t) && (t.value = Object.freeze(t.value)), t;
2598
- }
2599
- }
2600
- he.create = (r, e) => new he({
2601
- innerType: r,
2602
- typeName: p.ZodReadonly,
2603
- ...y(e)
2604
- });
2605
- const Ne = (r, e = {}, t) => r ? B.create().superRefine((s, n) => {
2606
- var a, i;
2607
- if (!r(s)) {
2608
- const o = typeof e == "function" ? e(s) : typeof e == "string" ? { message: e } : e, f = (i = (a = o.fatal) !== null && a !== void 0 ? a : t) !== null && i !== void 0 ? i : !0, d = typeof o == "string" ? { message: o } : o;
2609
- n.addIssue({ code: "custom", ...d, fatal: f });
2610
- }
2611
- }) : B.create(), Je = {
2612
- object: x.lazycreate
2613
- };
2614
- var p;
2615
- (function(r) {
2616
- r.ZodString = "ZodString", r.ZodNumber = "ZodNumber", r.ZodNaN = "ZodNaN", r.ZodBigInt = "ZodBigInt", r.ZodBoolean = "ZodBoolean", r.ZodDate = "ZodDate", r.ZodSymbol = "ZodSymbol", r.ZodUndefined = "ZodUndefined", r.ZodNull = "ZodNull", r.ZodAny = "ZodAny", r.ZodUnknown = "ZodUnknown", r.ZodNever = "ZodNever", r.ZodVoid = "ZodVoid", r.ZodArray = "ZodArray", r.ZodObject = "ZodObject", r.ZodUnion = "ZodUnion", r.ZodDiscriminatedUnion = "ZodDiscriminatedUnion", r.ZodIntersection = "ZodIntersection", r.ZodTuple = "ZodTuple", r.ZodRecord = "ZodRecord", r.ZodMap = "ZodMap", r.ZodSet = "ZodSet", r.ZodFunction = "ZodFunction", r.ZodLazy = "ZodLazy", r.ZodLiteral = "ZodLiteral", r.ZodEnum = "ZodEnum", r.ZodEffects = "ZodEffects", r.ZodNativeEnum = "ZodNativeEnum", r.ZodOptional = "ZodOptional", r.ZodNullable = "ZodNullable", r.ZodDefault = "ZodDefault", r.ZodCatch = "ZodCatch", r.ZodPromise = "ZodPromise", r.ZodBranded = "ZodBranded", r.ZodPipeline = "ZodPipeline", r.ZodReadonly = "ZodReadonly";
2617
- })(p || (p = {}));
2618
- const Ye = (r, e = {
2619
- message: `Input not instance of ${r.name}`
2620
- }) => Ne((t) => t instanceof r, e), Ce = Z.create, Oe = A.create, He = fe.create, Ge = M.create, Ee = Y.create, Xe = $.create, Qe = ce.create, Ke = H.create, Fe = G.create, et = B.create, tt = V.create, rt = R.create, st = de.create, nt = N.create, at = x.create, it = x.strictCreate, ot = X.create, ct = pe.create, dt = Q.create, ut = E.create, lt = K.create, ft = ue.create, ht = L.create, pt = U.create, mt = F.create, yt = ee.create, vt = P.create, _t = te.create, gt = W.create, be = C.create, xt = I.create, kt = D.create, bt = C.createWithPreprocess, wt = se.create, Tt = () => Ce().optional(), Zt = () => Oe().optional(), St = () => Ee().optional(), Nt = {
2621
- string: (r) => Z.create({ ...r, coerce: !0 }),
2622
- number: (r) => A.create({ ...r, coerce: !0 }),
2623
- boolean: (r) => Y.create({
2624
- ...r,
2625
- coerce: !0
2626
- }),
2627
- bigint: (r) => M.create({ ...r, coerce: !0 }),
2628
- date: (r) => $.create({ ...r, coerce: !0 })
2629
- }, Ct = m;
2630
- var k = /* @__PURE__ */ Object.freeze({
2631
- __proto__: null,
2632
- defaultErrorMap: q,
2633
- setErrorMap: Re,
2634
- getErrorMap: ae,
2635
- makeIssue: ie,
2636
- EMPTY_PATH: je,
2637
- addIssueToContext: l,
2638
- ParseStatus: b,
2639
- INVALID: m,
2640
- DIRTY: Te,
2641
- OK: w,
2642
- isAborted: _e,
2643
- isDirty: ge,
2644
- isValid: J,
2645
- isAsync: oe,
2646
- get util() {
2647
- return g;
2648
- },
2649
- get objectUtil() {
2650
- return ve;
2651
- },
2652
- ZodParsedType: u,
2653
- getParsedType: j,
2654
- ZodType: v,
2655
- ZodString: Z,
2656
- ZodNumber: A,
2657
- ZodBigInt: M,
2658
- ZodBoolean: Y,
2659
- ZodDate: $,
2660
- ZodSymbol: ce,
2661
- ZodUndefined: H,
2662
- ZodNull: G,
2663
- ZodAny: B,
2664
- ZodUnknown: V,
2665
- ZodNever: R,
2666
- ZodVoid: de,
2667
- ZodArray: N,
2668
- ZodObject: x,
2669
- ZodUnion: X,
2670
- ZodDiscriminatedUnion: pe,
2671
- ZodIntersection: Q,
2672
- ZodTuple: E,
2673
- ZodRecord: K,
2674
- ZodMap: ue,
2675
- ZodSet: L,
2676
- ZodFunction: U,
2677
- ZodLazy: F,
2678
- ZodLiteral: ee,
2679
- ZodEnum: P,
2680
- ZodNativeEnum: te,
2681
- ZodPromise: W,
2682
- ZodEffects: C,
2683
- ZodTransformer: C,
2684
- ZodOptional: I,
2685
- ZodNullable: D,
2686
- ZodDefault: re,
2687
- ZodCatch: le,
2688
- ZodNaN: fe,
2689
- BRAND: qe,
2690
- ZodBranded: Se,
2691
- ZodPipeline: se,
2692
- ZodReadonly: he,
2693
- custom: Ne,
2694
- Schema: v,
2695
- ZodSchema: v,
2696
- late: Je,
2697
- get ZodFirstPartyTypeKind() {
2698
- return p;
2699
- },
2700
- coerce: Nt,
2701
- any: et,
2702
- array: nt,
2703
- bigint: Ge,
2704
- boolean: Ee,
2705
- date: Xe,
2706
- discriminatedUnion: ct,
2707
- effect: be,
2708
- enum: vt,
2709
- function: pt,
2710
- instanceof: Ye,
2711
- intersection: dt,
2712
- lazy: mt,
2713
- literal: yt,
2714
- map: ft,
2715
- nan: He,
2716
- nativeEnum: _t,
2717
- never: rt,
2718
- null: Fe,
2719
- nullable: kt,
2720
- number: Oe,
2721
- object: at,
2722
- oboolean: St,
2723
- onumber: Zt,
2724
- optional: xt,
2725
- ostring: Tt,
2726
- pipeline: wt,
2727
- preprocess: bt,
2728
- promise: gt,
2729
- record: lt,
2730
- set: ht,
2731
- strictObject: it,
2732
- string: Ce,
2733
- symbol: Qe,
2734
- transformer: be,
2735
- tuple: ut,
2736
- undefined: Ke,
2737
- union: ot,
2738
- unknown: tt,
2739
- void: st,
2740
- NEVER: Ct,
2741
- ZodIssueCode: c,
2742
- quotelessJson: Ie,
2743
- ZodError: S
2744
- });
2745
- const Et = k.union([
2746
- k.literal("pu"),
2747
- k.literal("ku suli"),
2748
- k.literal("ku lili"),
2749
- k.literal("none")
2750
- ]), It = k.union([k.literal("pre-pu"), k.literal("post-pu"), k.literal("post-ku")]), Rt = k.union([
2751
- k.literal("core"),
2752
- k.literal("common"),
2753
- k.literal("uncommon"),
2754
- k.literal("obscure"),
2755
- k.literal("sandbox")
2756
- ]), jt = k.enum([
2757
- "sitelen pona",
2758
- "sitelen sitelen",
2759
- "alphabet",
2760
- "syllabary",
2761
- "logography",
2762
- "tokiponido alphabet",
2763
- "tokiponido syllabary",
2764
- "tokiponido logography"
2765
- ]);
2766
- function At(r, e, t) {
2767
- return (r.translations[t] ?? r.translations.en)[e];
2768
- }
2769
- export {
2770
- Et as B,
2771
- It as C,
2772
- Rt as U,
2773
- jt as W,
2774
- At as g,
2775
- k as z
2776
- };
2777
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMtQ25BNE9VTHQuanMiLCJzb3VyY2VzIjpbIi4uL25vZGVfbW9kdWxlcy8ucG5wbS96b2RAMy4yMi40L25vZGVfbW9kdWxlcy96b2QvbGliL2luZGV4Lm1qcyIsIi4uL3NyYy9saWIvdXRpbHMudHMiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIHV0aWw7XG4oZnVuY3Rpb24gKHV0aWwpIHtcbiAgICB1dGlsLmFzc2VydEVxdWFsID0gKHZhbCkgPT4gdmFsO1xuICAgIGZ1bmN0aW9uIGFzc2VydElzKF9hcmcpIHsgfVxuICAgIHV0aWwuYXNzZXJ0SXMgPSBhc3NlcnRJcztcbiAgICBmdW5jdGlvbiBhc3NlcnROZXZlcihfeCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoKTtcbiAgICB9XG4gICAgdXRpbC5hc3NlcnROZXZlciA9IGFzc2VydE5ldmVyO1xuICAgIHV0aWwuYXJyYXlUb0VudW0gPSAoaXRlbXMpID0+IHtcbiAgICAgICAgY29uc3Qgb2JqID0ge307XG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykge1xuICAgICAgICAgICAgb2JqW2l0ZW1dID0gaXRlbTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb2JqO1xuICAgIH07XG4gICAgdXRpbC5nZXRWYWxpZEVudW1WYWx1ZXMgPSAob2JqKSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbGlkS2V5cyA9IHV0aWwub2JqZWN0S2V5cyhvYmopLmZpbHRlcigoaykgPT4gdHlwZW9mIG9ialtvYmpba11dICE9PSBcIm51bWJlclwiKTtcbiAgICAgICAgY29uc3QgZmlsdGVyZWQgPSB7fTtcbiAgICAgICAgZm9yIChjb25zdCBrIG9mIHZhbGlkS2V5cykge1xuICAgICAgICAgICAgZmlsdGVyZWRba10gPSBvYmpba107XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHV0aWwub2JqZWN0VmFsdWVzKGZpbHRlcmVkKTtcbiAgICB9O1xuICAgIHV0aWwub2JqZWN0VmFsdWVzID0gKG9iaikgPT4ge1xuICAgICAgICByZXR1cm4gdXRpbC5vYmplY3RLZXlzKG9iaikubWFwKGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICByZXR1cm4gb2JqW2VdO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIHV0aWwub2JqZWN0S2V5cyA9IHR5cGVvZiBPYmplY3Qua2V5cyA9PT0gXCJmdW5jdGlvblwiIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgYmFuL2JhblxuICAgICAgICA/IChvYmopID0+IE9iamVjdC5rZXlzKG9iaikgLy8gZXNsaW50LWRpc2FibGUtbGluZSBiYW4vYmFuXG4gICAgICAgIDogKG9iamVjdCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qga2V5cyA9IFtdO1xuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gb2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAga2V5cy5wdXNoKGtleSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGtleXM7XG4gICAgICAgIH07XG4gICAgdXRpbC5maW5kID0gKGFyciwgY2hlY2tlcikgPT4ge1xuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgYXJyKSB7XG4gICAgICAgICAgICBpZiAoY2hlY2tlcihpdGVtKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gaXRlbTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH07XG4gICAgdXRpbC5pc0ludGVnZXIgPSB0eXBlb2YgTnVtYmVyLmlzSW50ZWdlciA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgID8gKHZhbCkgPT4gTnVtYmVyLmlzSW50ZWdlcih2YWwpIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgYmFuL2JhblxuICAgICAgICA6ICh2YWwpID0+IHR5cGVvZiB2YWwgPT09IFwibnVtYmVyXCIgJiYgaXNGaW5pdGUodmFsKSAmJiBNYXRoLmZsb29yKHZhbCkgPT09IHZhbDtcbiAgICBmdW5jdGlvbiBqb2luVmFsdWVzKGFycmF5LCBzZXBhcmF0b3IgPSBcIiB8IFwiKSB7XG4gICAgICAgIHJldHVybiBhcnJheVxuICAgICAgICAgICAgLm1hcCgodmFsKSA9PiAodHlwZW9mIHZhbCA9PT0gXCJzdHJpbmdcIiA/IGAnJHt2YWx9J2AgOiB2YWwpKVxuICAgICAgICAgICAgLmpvaW4oc2VwYXJhdG9yKTtcbiAgICB9XG4gICAgdXRpbC5qb2luVmFsdWVzID0gam9pblZhbHVlcztcbiAgICB1dGlsLmpzb25TdHJpbmdpZnlSZXBsYWNlciA9IChfLCB2YWx1ZSkgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcImJpZ2ludFwiKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWUudG9TdHJpbmcoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfTtcbn0pKHV0aWwgfHwgKHV0aWwgPSB7fSkpO1xudmFyIG9iamVjdFV0aWw7XG4oZnVuY3Rpb24gKG9iamVjdFV0aWwpIHtcbiAgICBvYmplY3RVdGlsLm1lcmdlU2hhcGVzID0gKGZpcnN0LCBzZWNvbmQpID0+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLmZpcnN0LFxuICAgICAgICAgICAgLi4uc2Vjb25kLCAvLyBzZWNvbmQgb3ZlcndyaXRlcyBmaXJzdFxuICAgICAgICB9O1xuICAgIH07XG59KShvYmplY3RVdGlsIHx8IChvYmplY3RVdGlsID0ge30pKTtcbmNvbnN0IFpvZFBhcnNlZFR5cGUgPSB1dGlsLmFycmF5VG9FbnVtKFtcbiAgICBcInN0cmluZ1wiLFxuICAgIFwibmFuXCIsXG4gICAgXCJudW1iZXJcIixcbiAgICBcImludGVnZXJcIixcbiAgICBcImZsb2F0XCIsXG4gICAgXCJib29sZWFuXCIsXG4gICAgXCJkYXRlXCIsXG4gICAgXCJiaWdpbnRcIixcbiAgICBcInN5bWJvbFwiLFxuICAgIFwiZnVuY3Rpb25cIixcbiAgICBcInVuZGVmaW5lZFwiLFxuICAgIFwibnVsbFwiLFxuICAgIFwiYXJyYXlcIixcbiAgICBcIm9iamVjdFwiLFxuICAgIFwidW5rbm93blwiLFxuICAgIFwicHJvbWlzZVwiLFxuICAgIFwidm9pZFwiLFxuICAgIFwibmV2ZXJcIixcbiAgICBcIm1hcFwiLFxuICAgIFwic2V0XCIsXG5dKTtcbmNvbnN0IGdldFBhcnNlZFR5cGUgPSAoZGF0YSkgPT4ge1xuICAgIGNvbnN0IHQgPSB0eXBlb2YgZGF0YTtcbiAgICBzd2l0Y2ggKHQpIHtcbiAgICAgICAgY2FzZSBcInVuZGVmaW5lZFwiOlxuICAgICAgICAgICAgcmV0dXJuIFpvZFBhcnNlZFR5cGUudW5kZWZpbmVkO1xuICAgICAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgICAgICAgICByZXR1cm4gWm9kUGFyc2VkVHlwZS5zdHJpbmc7XG4gICAgICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICAgICAgICAgIHJldHVybiBpc05hTihkYXRhKSA/IFpvZFBhcnNlZFR5cGUubmFuIDogWm9kUGFyc2VkVHlwZS5udW1iZXI7XG4gICAgICAgIGNhc2UgXCJib29sZWFuXCI6XG4gICAgICAgICAgICByZXR1cm4gWm9kUGFyc2VkVHlwZS5ib29sZWFuO1xuICAgICAgICBjYXNlIFwiZnVuY3Rpb25cIjpcbiAgICAgICAgICAgIHJldHVybiBab2RQYXJzZWRUeXBlLmZ1bmN0aW9uO1xuICAgICAgICBjYXNlIFwiYmlnaW50XCI6XG4gICAgICAgICAgICByZXR1cm4gWm9kUGFyc2VkVHlwZS5iaWdpbnQ7XG4gICAgICAgIGNhc2UgXCJzeW1ib2xcIjpcbiAgICAgICAgICAgIHJldHVybiBab2RQYXJzZWRUeXBlLnN5bWJvbDtcbiAgICAgICAgY2FzZSBcIm9iamVjdFwiOlxuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gWm9kUGFyc2VkVHlwZS5hcnJheTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChkYXRhID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFpvZFBhcnNlZFR5cGUubnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChkYXRhLnRoZW4gJiZcbiAgICAgICAgICAgICAgICB0eXBlb2YgZGF0YS50aGVuID09PSBcImZ1bmN0aW9uXCIgJiZcbiAgICAgICAgICAgICAgICBkYXRhLmNhdGNoICYmXG4gICAgICAgICAgICAgICAgdHlwZW9mIGRhdGEuY2F0Y2ggPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgIHJldHVybiBab2RQYXJzZWRUeXBlLnByb21pc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHlwZW9mIE1hcCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBkYXRhIGluc3RhbmNlb2YgTWFwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFpvZFBhcnNlZFR5cGUubWFwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHR5cGVvZiBTZXQgIT09IFwidW5kZWZpbmVkXCIgJiYgZGF0YSBpbnN0YW5jZW9mIFNldCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBab2RQYXJzZWRUeXBlLnNldDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlb2YgRGF0ZSAhPT0gXCJ1bmRlZmluZWRcIiAmJiBkYXRhIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBab2RQYXJzZWRUeXBlLmRhdGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gWm9kUGFyc2VkVHlwZS5vYmplY3Q7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gWm9kUGFyc2VkVHlwZS51bmtub3duO1xuICAgIH1cbn07XG5cbmNvbnN0IFpvZElzc3VlQ29kZSA9IHV0aWwuYXJyYXlUb0VudW0oW1xuICAgIFwiaW52YWxpZF90eXBlXCIsXG4gICAgXCJpbnZhbGlkX2xpdGVyYWxcIixcbiAgICBcImN1c3RvbVwiLFxuICAgIFwiaW52YWxpZF91bmlvblwiLFxuICAgIFwiaW52YWxpZF91bmlvbl9kaXNjcmltaW5hdG9yXCIsXG4gICAgXCJpbnZhbGlkX2VudW1fdmFsdWVcIixcbiAgICBcInVucmVjb2duaXplZF9rZXlzXCIsXG4gICAgXCJpbnZhbGlkX2FyZ3VtZW50c1wiLFxuICAgIFwiaW52YWxpZF9yZXR1cm5fdHlwZVwiLFxuICAgIFwiaW52YWxpZF9kYXRlXCIsXG4gICAgXCJpbnZhbGlkX3N0cmluZ1wiLFxuICAgIFwidG9vX3NtYWxsXCIsXG4gICAgXCJ0b29fYmlnXCIsXG4gICAgXCJpbnZhbGlkX2ludGVyc2VjdGlvbl90eXBlc1wiLFxuICAgIFwibm90X211bHRpcGxlX29mXCIsXG4gICAgXCJub3RfZmluaXRlXCIsXG5dKTtcbmNvbnN0IHF1b3RlbGVzc0pzb24gPSAob2JqKSA9PiB7XG4gICAgY29uc3QganNvbiA9IEpTT04uc3RyaW5naWZ5KG9iaiwgbnVsbCwgMik7XG4gICAgcmV0dXJuIGpzb24ucmVwbGFjZSgvXCIoW15cIl0rKVwiOi9nLCBcIiQxOlwiKTtcbn07XG5jbGFzcyBab2RFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgICBjb25zdHJ1Y3Rvcihpc3N1ZXMpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5pc3N1ZXMgPSBbXTtcbiAgICAgICAgdGhpcy5hZGRJc3N1ZSA9IChzdWIpID0+IHtcbiAgICAgICAgICAgIHRoaXMuaXNzdWVzID0gWy4uLnRoaXMuaXNzdWVzLCBzdWJdO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmFkZElzc3VlcyA9IChzdWJzID0gW10pID0+IHtcbiAgICAgICAgICAgIHRoaXMuaXNzdWVzID0gWy4uLnRoaXMuaXNzdWVzLCAuLi5zdWJzXTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgYWN0dWFsUHJvdG8gPSBuZXcudGFyZ2V0LnByb3RvdHlwZTtcbiAgICAgICAgaWYgKE9iamVjdC5zZXRQcm90b3R5cGVPZikge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGJhbi9iYW5cbiAgICAgICAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBhY3R1YWxQcm90byk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9fcHJvdG9fXyA9IGFjdHVhbFByb3RvO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubmFtZSA9IFwiWm9kRXJyb3JcIjtcbiAgICAgICAgdGhpcy5pc3N1ZXMgPSBpc3N1ZXM7XG4gICAgfVxuICAgIGdldCBlcnJvcnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzc3VlcztcbiAgICB9XG4gICAgZm9ybWF0KF9tYXBwZXIpIHtcbiAgICAgICAgY29uc3QgbWFwcGVyID0gX21hcHBlciB8fFxuICAgICAgICAgICAgZnVuY3Rpb24gKGlzc3VlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlzc3VlLm1lc3NhZ2U7XG4gICAgICAgICAgICB9O1xuICAgICAgICBjb25zdCBmaWVsZEVycm9ycyA9IHsgX2Vycm9yczogW10gfTtcbiAgICAgICAgY29uc3QgcHJvY2Vzc0Vycm9yID0gKGVycm9yKSA9PiB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGlzc3VlIG9mIGVycm9yLmlzc3Vlcykge1xuICAgICAgICAgICAgICAgIGlmIChpc3N1ZS5jb2RlID09PSBcImludmFsaWRfdW5pb25cIikge1xuICAgICAgICAgICAgICAgICAgICBpc3N1ZS51bmlvbkVycm9ycy5tYXAocHJvY2Vzc0Vycm9yKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoaXNzdWUuY29kZSA9PT0gXCJpbnZhbGlkX3JldHVybl90eXBlXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0Vycm9yKGlzc3VlLnJldHVyblR5cGVFcnJvcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGlzc3VlLmNvZGUgPT09IFwiaW52YWxpZF9hcmd1bWVudHNcIikge1xuICAgICAgICAgICAgICAgICAgICBwcm9jZXNzRXJyb3IoaXNzdWUuYXJndW1lbnRzRXJyb3IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChpc3N1ZS5wYXRoLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBmaWVsZEVycm9ycy5fZXJyb3JzLnB1c2gobWFwcGVyKGlzc3VlKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBsZXQgY3VyciA9IGZpZWxkRXJyb3JzO1xuICAgICAgICAgICAgICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgICAgICAgICAgICAgIHdoaWxlIChpIDwgaXNzdWUucGF0aC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVsID0gaXNzdWUucGF0aFtpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRlcm1pbmFsID0gaSA9PT0gaXNzdWUucGF0aC5sZW5ndGggLSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0ZXJtaW5hbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJbZWxdID0gY3VycltlbF0gfHwgeyBfZXJyb3JzOiBbXSB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmICh0eXBlb2YgZWwgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgIGN1cnJbZWxdID0gY3VycltlbF0gfHwgeyBfZXJyb3JzOiBbXSB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIH0gZWxzZSBpZiAodHlwZW9mIGVsID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICBjb25zdCBlcnJvckFycmF5OiBhbnkgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgIGVycm9yQXJyYXkuX2Vycm9ycyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgY3VycltlbF0gPSBjdXJyW2VsXSB8fCBlcnJvckFycmF5O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJbZWxdID0gY3VycltlbF0gfHwgeyBfZXJyb3JzOiBbXSB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJbZWxdLl9lcnJvcnMucHVzaChtYXBwZXIoaXNzdWUpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnIgPSBjdXJyW2VsXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgcHJvY2Vzc0Vycm9yKHRoaXMpO1xuICAgICAgICByZXR1cm4gZmllbGRFcnJvcnM7XG4gICAgfVxuICAgIHRvU3RyaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tZXNzYWdlO1xuICAgIH1cbiAgICBnZXQgbWVzc2FnZSgpIHtcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHRoaXMuaXNzdWVzLCB1dGlsLmpzb25TdHJpbmdpZnlSZXBsYWNlciwgMik7XG4gICAgfVxuICAgIGdldCBpc0VtcHR5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pc3N1ZXMubGVuZ3RoID09PSAwO1xuICAgIH1cbiAgICBmbGF0dGVuKG1hcHBlciA9IChpc3N1ZSkgPT4gaXNzdWUubWVzc2FnZSkge1xuICAgICAgICBjb25zdCBmaWVsZEVycm9ycyA9IHt9O1xuICAgICAgICBjb25zdCBmb3JtRXJyb3JzID0gW107XG4gICAgICAgIGZvciAoY29uc3Qgc3ViIG9mIHRoaXMuaXNzdWVzKSB7XG4gICAgICAgICAgICBpZiAoc3ViLnBhdGgubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGZpZWxkRXJyb3JzW3N1Yi5wYXRoWzBdXSA9IGZpZWxkRXJyb3JzW3N1Yi5wYXRoWzBdXSB8fCBbXTtcbiAgICAgICAgICAgICAgICBmaWVsZEVycm9yc1tzdWIucGF0aFswXV0ucHVzaChtYXBwZXIoc3ViKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBmb3JtRXJyb3JzLnB1c2gobWFwcGVyKHN1YikpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IGZvcm1FcnJvcnMsIGZpZWxkRXJyb3JzIH07XG4gICAgfVxuICAgIGdldCBmb3JtRXJyb3JzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5mbGF0dGVuKCk7XG4gICAgfVxufVxuWm9kRXJyb3IuY3JlYXRlID0gKGlzc3VlcykgPT4ge1xuICAgIGNvbnN0IGVycm9yID0gbmV3IFpvZEVycm9yKGlzc3Vlcyk7XG4gICAgcmV0dXJuIGVycm9yO1xufTtcblxuY29uc3QgZXJyb3JNYXAgPSAoaXNzdWUsIF9jdHgpID0+IHtcbiAgICBsZXQgbWVzc2FnZTtcbiAgICBzd2l0Y2ggKGlzc3VlLmNvZGUpIHtcbiAgICAgICAgY2FzZSBab2RJc3N1ZUNvZGUuaW52YWxpZF90eXBlOlxuICAgICAgICAgICAgaWYgKGlzc3VlLnJlY2VpdmVkID09PSBab2RQYXJzZWRUeXBlLnVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBcIlJlcXVpcmVkXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlID0gYEV4cGVjdGVkICR7aXNzdWUuZXhwZWN0ZWR9LCByZWNlaXZlZCAke2lzc3VlLnJlY2VpdmVkfWA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBab2RJc3N1ZUNvZGUuaW52YWxpZF9saXRlcmFsOlxuICAgICAgICAgICAgbWVzc2FnZSA9IGBJbnZhbGlkIGxpdGVyYWwgdmFsdWUsIGV4cGVjdGVkICR7SlNPTi5zdHJpbmdpZnkoaXNzdWUuZXhwZWN0ZWQsIHV0aWwuanNvblN0cmluZ2lmeVJlcGxhY2VyKX1gO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgWm9kSXNzdWVDb2RlLnVucmVjb2duaXplZF9rZXlzOlxuICAgICAgICAgICAgbWVzc2FnZSA9IGBVbnJlY29nbml6ZWQga2V5KHMpIGluIG9iamVjdDogJHt1dGlsLmpvaW5WYWx1ZXMoaXNzdWUua2V5cywgXCIsIFwiKX1gO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgWm9kSXNzdWVDb2RlLmludmFsaWRfdW5pb246XG4gICAgICAgICAgICBtZXNzYWdlID0gYEludmFsaWQgaW5wdXRgO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgWm9kSXNzdWVDb2RlLmludmFsaWRfdW5pb25fZGlzY3JpbWluYXRvcjpcbiAgICAgICAgICAgIG1lc3NhZ2UgPSBgSW52YWxpZCBkaXNjcmltaW5hdG9yIHZhbHVlLiBFeHBlY3RlZCAke3V0aWwuam9pblZhbHVlcyhpc3N1ZS5vcHRpb25zKX1gO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgWm9kSXNzdWVDb2RlLmludmFsaWRfZW51bV92YWx1ZTpcbiAgICAgICAgICAgIG1lc3NhZ2UgPSBgSW52YWxpZCBlbnVtIHZhbHVlLiBFeHBlY3RlZCAke3V0aWwuam9pblZhbHVlcyhpc3N1ZS5vcHRpb25zKX0sIHJlY2VpdmVkICcke2lzc3VlLnJlY2VpdmVkfSdgO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgWm9kSXNzdWVDb2RlLmludmFsaWRfYXJndW1lbnRzOlxuICAgICAgICAgICAgbWVzc2FnZSA9IGBJbnZhbGlkIGZ1bmN0aW9uIGFyZ3VtZW50c2A7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBab2RJc3N1ZUNvZGUuaW52YWxpZF9yZXR1cm5fdHlwZTpcbiAgICAgICAgICAgIG1lc3NhZ2UgPSBgSW52YWxpZCBmdW5jdGlvbiByZXR1cm4gdHlwZWA7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBab2RJc3N1ZUNvZGUuaW52YWxpZF9kYXRlOlxuICAgICAgICAgICAgbWVzc2FnZSA9IGBJbnZhbGlkIGRhdGVgO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgWm9kSXNzdWVDb2RlLmludmFsaWRfc3RyaW5nOlxuICAgICAgICAgICAgaWYgKHR5cGVvZiBpc3N1ZS52YWxpZGF0aW9uID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKFwiaW5jbHVkZXNcIiBpbiBpc3N1ZS52YWxpZGF0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBgSW52YWxpZCBpbnB1dDogbXVzdCBpbmNsdWRlIFwiJHtpc3N1ZS52YWxpZGF0aW9uLmluY2x1ZGVzfVwiYDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBpc3N1ZS52YWxpZGF0aW9uLnBvc2l0aW9uID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gYCR7bWVzc2FnZX0gYXQgb25lIG9yIG1vcmUgcG9zaXRpb25zIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAke2lzc3VlLnZhbGlkYXRpb24ucG9zaXRpb259YDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChcInN0YXJ0c1dpdGhcIiBpbiBpc3N1ZS52YWxpZGF0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBgSW52YWxpZCBpbnB1dDogbXVzdCBzdGFydCB3aXRoIFwiJHtpc3N1ZS52YWxpZGF0aW9uLnN0YXJ0c1dpdGh9XCJgO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChcImVuZHNXaXRoXCIgaW4gaXNzdWUudmFsaWRhdGlvbikge1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gYEludmFsaWQgaW5wdXQ6IG11c3QgZW5kIHdpdGggXCIke2lzc3VlLnZhbGlkYXRpb24uZW5kc1dpdGh9XCJgO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdXRpbC5hc3NlcnROZXZlcihpc3N1ZS52YWxpZGF0aW9uKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChpc3N1ZS52YWxpZGF0aW9uICE9PSBcInJlZ2V4XCIpIHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlID0gYEludmFsaWQgJHtpc3N1ZS52YWxpZGF0aW9ufWA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlID0gXCJJbnZhbGlkXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBab2RJc3N1ZUNvZGUudG9vX3NtYWxsOlxuICAgICAgICAgICAgaWYgKGlzc3VlLnR5cGUgPT09IFwiYXJyYXlcIilcbiAgICAgICAgICAgICAgICBtZXNzYWdlID0gYEFycmF5IG11c3QgY29udGFpbiAke2lzc3VlLmV4YWN0ID8gXCJleGFjdGx5XCIgOiBpc3N1ZS5pbmNsdXNpdmUgPyBgYXQgbGVhc3RgIDogYG1vcmUgdGhhbmB9ICR7aXNzdWUubWluaW11bX0gZWxlbWVudChzKWA7XG4gICAgICAgICAgICBlbHNlIGlmIChpc3N1ZS50eXBlID09PSBcInN0cmluZ1wiKVxuICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBgU3RyaW5nIG11c3QgY29udGFpbiAke2lzc3VlLmV4YWN0ID8gXCJleGFjdGx5XCIgOiBpc3N1ZS5pbmNsdXNpdmUgPyBgYXQgbGVhc3RgIDogYG92ZXJgfSAke2lzc3VlLm1pbmltdW19IGNoYXJhY3RlcihzKWA7XG4gICAgICAgICAgICBlbHNlIGlmIChpc3N1ZS50eXBlID09PSBcIm51bWJlclwiKVxuICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBgTnVtYmVyIG11c3QgYmUgJHtpc3N1ZS5leGFjdFxuICAgICAgICAgICAgICAgICAgICA/IGBleGFjdGx5IGVxdWFsIHRvIGBcbiAgICAgICAgICAgICAgICAgICAgOiBpc3N1ZS5pbmNsdXNpdmVcbiAgICAgICAgICAgICAgICAgICAgICAgID8gYGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBgXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGBncmVhdGVyIHRoYW4gYH0ke2lzc3VlLm1pbmltdW19YDtcbiAgICAgICAgICAgIGVsc2UgaWYgKGlzc3VlLnR5cGUgPT09IFwiZGF0ZVwiKVxuICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBgRGF0ZSBtdXN0IGJlICR7aXNzdWUuZXhhY3RcbiAgICAgICAgICAgICAgICAgICAgPyBgZXhhY3RseSBlcXVhbCB0byBgXG4gICAgICAgICAgICAgICAgICAgIDogaXNzdWUuaW5jbHVzaXZlXG4gICAgICAgICAgICAgICAgICAgICAgICA/IGBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gYFxuICAgICAgICAgICAgICAgICAgICAgICAgOiBgZ3JlYXRlciB0aGFuIGB9JHtuZXcgRGF0ZShOdW1iZXIoaXNzdWUubWluaW11bSkpfWA7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgbWVzc2FnZSA9IFwiSW52YWxpZCBpbnB1dFwiO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgWm9kSXNzdWVDb2RlLnRvb19iaWc6XG4gICAgICAgICAgICBpZiAoaXNzdWUudHlwZSA9PT0gXCJhcnJheVwiKVxuICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBgQXJyYXkgbXVzdCBjb250YWluICR7aXNzdWUuZXhhY3QgPyBgZXhhY3RseWAgOiBpc3N1ZS5pbmNsdXNpdmUgPyBgYXQgbW9zdGAgOiBgbGVzcyB0aGFuYH0gJHtpc3N1ZS5tYXhpbXVtfSBlbGVtZW50KHMpYDtcbiAgICAgICAgICAgIGVsc2UgaWYgKGlzc3VlLnR5cGUgPT09IFwic3RyaW5nXCIpXG4gICAgICAgICAgICAgICAgbWVzc2FnZSA9IGBTdHJpbmcgbXVzdCBjb250YWluICR7aXNzdWUuZXhhY3QgPyBgZXhhY3RseWAgOiBpc3N1ZS5pbmNsdXNpdmUgPyBgYXQgbW9zdGAgOiBgdW5kZXJgfSAke2lzc3VlLm1heGltdW19IGNoYXJhY3RlcihzKWA7XG4gICAgICAgICAgICBlbHNlIGlmIChpc3N1ZS50eXBlID09PSBcIm51bWJlclwiKVxuICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBgTnVtYmVyIG11c3QgYmUgJHtpc3N1ZS5leGFjdFxuICAgICAgICAgICAgICAgICAgICA/IGBleGFjdGx5YFxuICAgICAgICAgICAgICAgICAgICA6IGlzc3VlLmluY2x1c2l2ZVxuICAgICAgICAgICAgICAgICAgICAgICAgPyBgbGVzcyB0aGFuIG9yIGVxdWFsIHRvYFxuICAgICAgICAgICAgICAgICAgICAgICAgOiBgbGVzcyB0aGFuYH0gJHtpc3N1ZS5tYXhpbXVtfWA7XG4gICAgICAgICAgICBlbHNlIGlmIChpc3N1ZS50eXBlID09PSBcImJpZ2ludFwiKVxuICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBgQmlnSW50IG11c3QgYmUgJHtpc3N1ZS5leGFjdFxuICAgICAgICAgICAgICAgICAgICA/IGBleGFjdGx5YFxuICAgICAgICAgICAgICAgICAgICA6IGlzc3VlLmluY2x1c2l2ZVxuICAgICAgICAgICAgICAgICAgICAgICAgPyBgbGVzcyB0aGFuIG9yIGVxdWFsIHRvYFxuICAgICAgICAgICAgICAgICAgICAgICAgOiBgbGVzcyB0aGFuYH0gJHtpc3N1ZS5tYXhpbXVtfWA7XG4gICAgICAgICAgICBlbHNlIGlmIChpc3N1ZS50eXBlID09PSBcImRhdGVcIilcbiAgICAgICAgICAgICAgICBtZXNzYWdlID0gYERhdGUgbXVzdCBiZSAke2lzc3VlLmV4YWN0XG4gICAgICAgICAgICAgICAgICAgID8gYGV4YWN0bHlgXG4gICAgICAgICAgICAgICAgICAgIDogaXNzdWUuaW5jbHVzaXZlXG4gICAgICAgICAgICAgICAgICAgICAgICA/IGBzbWFsbGVyIHRoYW4gb3IgZXF1YWwgdG9gXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGBzbWFsbGVyIHRoYW5gfSAke25ldyBEYXRlKE51bWJlcihpc3N1ZS5tYXhpbXVtKSl9YDtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBtZXNzYWdlID0gXCJJbnZhbGlkIGlucHV0XCI7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBab2RJc3N1ZUNvZGUuY3VzdG9tOlxuICAgICAgICAgICAgbWVzc2FnZSA9IGBJbnZhbGlkIGlucHV0YDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFpvZElzc3VlQ29kZS5pbnZhbGlkX2ludGVyc2VjdGlvbl90eXBlczpcbiAgICAgICAgICAgIG1lc3NhZ2UgPSBgSW50ZXJzZWN0aW9uIHJlc3VsdHMgY291bGQgbm90IGJlIG1lcmdlZGA7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBab2RJc3N1ZUNvZGUubm90X211bHRpcGxlX29mOlxuICAgICAgICAgICAgbWVzc2FnZSA9IGBOdW1iZXIgbXVzdCBiZSBhIG11bHRpcGxlIG9mICR7aXNzdWUubXVsdGlwbGVPZn1gO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgWm9kSXNzdWVDb2RlLm5vdF9maW5pdGU6XG4gICAgICAgICAgICBtZXNzYWdlID0gXCJOdW1iZXIgbXVzdCBiZSBmaW5pdGVcIjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgbWVzc2FnZSA9IF9jdHguZGVmYXVsdEVycm9yO1xuICAgICAgICAgICAgdXRpbC5hc3NlcnROZXZlcihpc3N1ZSk7XG4gICAgfVxuICAgIHJldHVybiB7IG1lc3NhZ2UgfTtcbn07XG5cbmxldCBvdmVycmlkZUVycm9yTWFwID0gZXJyb3JNYXA7XG5mdW5jdGlvbiBzZXRFcnJvck1hcChtYXApIHtcbiAgICBvdmVycmlkZUVycm9yTWFwID0gbWFwO1xufVxuZnVuY3Rpb24gZ2V0RXJyb3JNYXAoKSB7XG4gICAgcmV0dXJuIG92ZXJyaWRlRXJyb3JNYXA7XG59XG5cbmNvbnN0IG1ha2VJc3N1ZSA9IChwYXJhbXMpID0+IHtcbiAgICBjb25zdCB7IGRhdGEsIHBhdGgsIGVycm9yTWFwcywgaXNzdWVEYXRhIH0gPSBwYXJhbXM7XG4gICAgY29uc3QgZnVsbFBhdGggPSBbLi4ucGF0aCwgLi4uKGlzc3VlRGF0YS5wYXRoIHx8IFtdKV07XG4gICAgY29uc3QgZnVsbElzc3VlID0ge1xuICAgICAgICAuLi5pc3N1ZURhdGEsXG4gICAgICAgIHBhdGg6IGZ1bGxQYXRoLFxuICAgIH07XG4gICAgbGV0IGVycm9yTWVzc2FnZSA9IFwiXCI7XG4gICAgY29uc3QgbWFwcyA9IGVycm9yTWFwc1xuICAgICAgICAuZmlsdGVyKChtKSA9PiAhIW0pXG4gICAgICAgIC5zbGljZSgpXG4gICAgICAgIC5yZXZlcnNlKCk7XG4gICAgZm9yIChjb25zdCBtYXAgb2YgbWFwcykge1xuICAgICAgICBlcnJvck1lc3NhZ2UgPSBtYXAoZnVsbElzc3VlLCB7IGRhdGEsIGRlZmF1bHRFcnJvcjogZXJyb3JNZXNzYWdlIH0pLm1lc3NhZ2U7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIC4uLmlzc3VlRGF0YSxcbiAgICAgICAgcGF0aDogZnVsbFBhdGgsXG4gICAgICAgIG1lc3NhZ2U6IGlzc3VlRGF0YS5tZXNzYWdlIHx8IGVycm9yTWVzc2FnZSxcbiAgICB9O1xufTtcbmNvbnN0IEVNUFRZX1BBVEggPSBbXTtcbmZ1bmN0aW9uIGFkZElzc3VlVG9Db250ZXh0KGN0eCwgaXNzdWVEYXRhKSB7XG4gICAgY29uc3QgaXNzdWUgPSBtYWtlSXNzdWUoe1xuICAgICAgICBpc3N1ZURhdGE6IGlzc3VlRGF0YSxcbiAgICAgICAgZGF0YTogY3R4LmRhdGEsXG4gICAgICAgIHBhdGg6IGN0eC5wYXRoLFxuICAgICAgICBlcnJvck1hcHM6IFtcbiAgICAgICAgICAgIGN0eC5jb21tb24uY29udGV4dHVhbEVycm9yTWFwLFxuICAgICAgICAgICAgY3R4LnNjaGVtYUVycm9yTWFwLFxuICAgICAgICAgICAgZ2V0RXJyb3JNYXAoKSxcbiAgICAgICAgICAgIGVycm9yTWFwLCAvLyB0aGVuIGdsb2JhbCBkZWZhdWx0IG1hcFxuICAgICAgICBdLmZpbHRlcigoeCkgPT4gISF4KSxcbiAgICB9KTtcbiAgICBjdHguY29tbW9uLmlzc3Vlcy5wdXNoKGlzc3VlKTtcbn1cbmNsYXNzIFBhcnNlU3RhdHVzIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy52YWx1ZSA9IFwidmFsaWRcIjtcbiAgICB9XG4gICAgZGlydHkoKSB7XG4gICAgICAgIGlmICh0aGlzLnZhbHVlID09PSBcInZhbGlkXCIpXG4gICAgICAgICAgICB0aGlzLnZhbHVlID0gXCJkaXJ0eVwiO1xuICAgIH1cbiAgICBhYm9ydCgpIHtcbiAgICAgICAgaWYgKHRoaXMudmFsdWUgIT09IFwiYWJvcnRlZFwiKVxuICAgICAgICAgICAgdGhpcy52YWx1ZSA9IFwiYWJvcnRlZFwiO1xuICAgIH1cbiAgICBzdGF0aWMgbWVyZ2VBcnJheShzdGF0dXMsIHJlc3VsdHMpIHtcbiAgICAgICAgY29uc3QgYXJyYXlWYWx1ZSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IHMgb2YgcmVzdWx0cykge1xuICAgICAgICAgICAgaWYgKHMuc3RhdHVzID09PSBcImFib3J0ZWRcIilcbiAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgICAgIGlmIChzLnN0YXR1cyA9PT0gXCJkaXJ0eVwiKVxuICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgYXJyYXlWYWx1ZS5wdXNoKHMudmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IHN0YXR1czogc3RhdHVzLnZhbHVlLCB2YWx1ZTogYXJyYXlWYWx1ZSB9O1xuICAgIH1cbiAgICBzdGF0aWMgYXN5bmMgbWVyZ2VPYmplY3RBc3luYyhzdGF0dXMsIHBhaXJzKSB7XG4gICAgICAgIGNvbnN0IHN5bmNQYWlycyA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IHBhaXIgb2YgcGFpcnMpIHtcbiAgICAgICAgICAgIHN5bmNQYWlycy5wdXNoKHtcbiAgICAgICAgICAgICAgICBrZXk6IGF3YWl0IHBhaXIua2V5LFxuICAgICAgICAgICAgICAgIHZhbHVlOiBhd2FpdCBwYWlyLnZhbHVlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFBhcnNlU3RhdHVzLm1lcmdlT2JqZWN0U3luYyhzdGF0dXMsIHN5bmNQYWlycyk7XG4gICAgfVxuICAgIHN0YXRpYyBtZXJnZU9iamVjdFN5bmMoc3RhdHVzLCBwYWlycykge1xuICAgICAgICBjb25zdCBmaW5hbE9iamVjdCA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IHBhaXIgb2YgcGFpcnMpIHtcbiAgICAgICAgICAgIGNvbnN0IHsga2V5LCB2YWx1ZSB9ID0gcGFpcjtcbiAgICAgICAgICAgIGlmIChrZXkuc3RhdHVzID09PSBcImFib3J0ZWRcIilcbiAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgICAgIGlmICh2YWx1ZS5zdGF0dXMgPT09IFwiYWJvcnRlZFwiKVxuICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEO1xuICAgICAgICAgICAgaWYgKGtleS5zdGF0dXMgPT09IFwiZGlydHlcIilcbiAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgIGlmICh2YWx1ZS5zdGF0dXMgPT09IFwiZGlydHlcIilcbiAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgIGlmIChrZXkudmFsdWUgIT09IFwiX19wcm90b19fXCIgJiZcbiAgICAgICAgICAgICAgICAodHlwZW9mIHZhbHVlLnZhbHVlICE9PSBcInVuZGVmaW5lZFwiIHx8IHBhaXIuYWx3YXlzU2V0KSkge1xuICAgICAgICAgICAgICAgIGZpbmFsT2JqZWN0W2tleS52YWx1ZV0gPSB2YWx1ZS52YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBzdGF0dXM6IHN0YXR1cy52YWx1ZSwgdmFsdWU6IGZpbmFsT2JqZWN0IH07XG4gICAgfVxufVxuY29uc3QgSU5WQUxJRCA9IE9iamVjdC5mcmVlemUoe1xuICAgIHN0YXR1czogXCJhYm9ydGVkXCIsXG59KTtcbmNvbnN0IERJUlRZID0gKHZhbHVlKSA9PiAoeyBzdGF0dXM6IFwiZGlydHlcIiwgdmFsdWUgfSk7XG5jb25zdCBPSyA9ICh2YWx1ZSkgPT4gKHsgc3RhdHVzOiBcInZhbGlkXCIsIHZhbHVlIH0pO1xuY29uc3QgaXNBYm9ydGVkID0gKHgpID0+IHguc3RhdHVzID09PSBcImFib3J0ZWRcIjtcbmNvbnN0IGlzRGlydHkgPSAoeCkgPT4geC5zdGF0dXMgPT09IFwiZGlydHlcIjtcbmNvbnN0IGlzVmFsaWQgPSAoeCkgPT4geC5zdGF0dXMgPT09IFwidmFsaWRcIjtcbmNvbnN0IGlzQXN5bmMgPSAoeCkgPT4gdHlwZW9mIFByb21pc2UgIT09IFwidW5kZWZpbmVkXCIgJiYgeCBpbnN0YW5jZW9mIFByb21pc2U7XG5cbnZhciBlcnJvclV0aWw7XG4oZnVuY3Rpb24gKGVycm9yVXRpbCkge1xuICAgIGVycm9yVXRpbC5lcnJUb09iaiA9IChtZXNzYWdlKSA9PiB0eXBlb2YgbWVzc2FnZSA9PT0gXCJzdHJpbmdcIiA/IHsgbWVzc2FnZSB9IDogbWVzc2FnZSB8fCB7fTtcbiAgICBlcnJvclV0aWwudG9TdHJpbmcgPSAobWVzc2FnZSkgPT4gdHlwZW9mIG1lc3NhZ2UgPT09IFwic3RyaW5nXCIgPyBtZXNzYWdlIDogbWVzc2FnZSA9PT0gbnVsbCB8fCBtZXNzYWdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBtZXNzYWdlLm1lc3NhZ2U7XG59KShlcnJvclV0aWwgfHwgKGVycm9yVXRpbCA9IHt9KSk7XG5cbmNsYXNzIFBhcnNlSW5wdXRMYXp5UGF0aCB7XG4gICAgY29uc3RydWN0b3IocGFyZW50LCB2YWx1ZSwgcGF0aCwga2V5KSB7XG4gICAgICAgIHRoaXMuX2NhY2hlZFBhdGggPSBbXTtcbiAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7XG4gICAgICAgIHRoaXMuZGF0YSA9IHZhbHVlO1xuICAgICAgICB0aGlzLl9wYXRoID0gcGF0aDtcbiAgICAgICAgdGhpcy5fa2V5ID0ga2V5O1xuICAgIH1cbiAgICBnZXQgcGF0aCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9jYWNoZWRQYXRoLmxlbmd0aCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuX2tleSBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fY2FjaGVkUGF0aC5wdXNoKC4uLnRoaXMuX3BhdGgsIC4uLnRoaXMuX2tleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9jYWNoZWRQYXRoLnB1c2goLi4udGhpcy5fcGF0aCwgdGhpcy5fa2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fY2FjaGVkUGF0aDtcbiAgICB9XG59XG5jb25zdCBoYW5kbGVSZXN1bHQgPSAoY3R4LCByZXN1bHQpID0+IHtcbiAgICBpZiAoaXNWYWxpZChyZXN1bHQpKSB7XG4gICAgICAgIHJldHVybiB7IHN1Y2Nlc3M6IHRydWUsIGRhdGE6IHJlc3VsdC52YWx1ZSB9O1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgaWYgKCFjdHguY29tbW9uLmlzc3Vlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlZhbGlkYXRpb24gZmFpbGVkIGJ1dCBubyBpc3N1ZXMgZGV0ZWN0ZWQuXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICAgIGdldCBlcnJvcigpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fZXJyb3IpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9lcnJvcjtcbiAgICAgICAgICAgICAgICBjb25zdCBlcnJvciA9IG5ldyBab2RFcnJvcihjdHguY29tbW9uLmlzc3Vlcyk7XG4gICAgICAgICAgICAgICAgdGhpcy5fZXJyb3IgPSBlcnJvcjtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZXJyb3I7XG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgIH1cbn07XG5mdW5jdGlvbiBwcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcykge1xuICAgIGlmICghcGFyYW1zKVxuICAgICAgICByZXR1cm4ge307XG4gICAgY29uc3QgeyBlcnJvck1hcCwgaW52YWxpZF90eXBlX2Vycm9yLCByZXF1aXJlZF9lcnJvciwgZGVzY3JpcHRpb24gfSA9IHBhcmFtcztcbiAgICBpZiAoZXJyb3JNYXAgJiYgKGludmFsaWRfdHlwZV9lcnJvciB8fCByZXF1aXJlZF9lcnJvcikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW4ndCB1c2UgXCJpbnZhbGlkX3R5cGVfZXJyb3JcIiBvciBcInJlcXVpcmVkX2Vycm9yXCIgaW4gY29uanVuY3Rpb24gd2l0aCBjdXN0b20gZXJyb3IgbWFwLmApO1xuICAgIH1cbiAgICBpZiAoZXJyb3JNYXApXG4gICAgICAgIHJldHVybiB7IGVycm9yTWFwOiBlcnJvck1hcCwgZGVzY3JpcHRpb24gfTtcbiAgICBjb25zdCBjdXN0b21NYXAgPSAoaXNzLCBjdHgpID0+IHtcbiAgICAgICAgaWYgKGlzcy5jb2RlICE9PSBcImludmFsaWRfdHlwZVwiKVxuICAgICAgICAgICAgcmV0dXJuIHsgbWVzc2FnZTogY3R4LmRlZmF1bHRFcnJvciB9O1xuICAgICAgICBpZiAodHlwZW9mIGN0eC5kYXRhID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICByZXR1cm4geyBtZXNzYWdlOiByZXF1aXJlZF9lcnJvciAhPT0gbnVsbCAmJiByZXF1aXJlZF9lcnJvciAhPT0gdm9pZCAwID8gcmVxdWlyZWRfZXJyb3IgOiBjdHguZGVmYXVsdEVycm9yIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgbWVzc2FnZTogaW52YWxpZF90eXBlX2Vycm9yICE9PSBudWxsICYmIGludmFsaWRfdHlwZV9lcnJvciAhPT0gdm9pZCAwID8gaW52YWxpZF90eXBlX2Vycm9yIDogY3R4LmRlZmF1bHRFcnJvciB9O1xuICAgIH07XG4gICAgcmV0dXJuIHsgZXJyb3JNYXA6IGN1c3RvbU1hcCwgZGVzY3JpcHRpb24gfTtcbn1cbmNsYXNzIFpvZFR5cGUge1xuICAgIGNvbnN0cnVjdG9yKGRlZikge1xuICAgICAgICAvKiogQWxpYXMgb2Ygc2FmZVBhcnNlQXN5bmMgKi9cbiAgICAgICAgdGhpcy5zcGEgPSB0aGlzLnNhZmVQYXJzZUFzeW5jO1xuICAgICAgICB0aGlzLl9kZWYgPSBkZWY7XG4gICAgICAgIHRoaXMucGFyc2UgPSB0aGlzLnBhcnNlLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuc2FmZVBhcnNlID0gdGhpcy5zYWZlUGFyc2UuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5wYXJzZUFzeW5jID0gdGhpcy5wYXJzZUFzeW5jLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuc2FmZVBhcnNlQXN5bmMgPSB0aGlzLnNhZmVQYXJzZUFzeW5jLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuc3BhID0gdGhpcy5zcGEuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5yZWZpbmUgPSB0aGlzLnJlZmluZS5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLnJlZmluZW1lbnQgPSB0aGlzLnJlZmluZW1lbnQuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5zdXBlclJlZmluZSA9IHRoaXMuc3VwZXJSZWZpbmUuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5vcHRpb25hbCA9IHRoaXMub3B0aW9uYWwuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5udWxsYWJsZSA9IHRoaXMubnVsbGFibGUuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5udWxsaXNoID0gdGhpcy5udWxsaXNoLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuYXJyYXkgPSB0aGlzLmFycmF5LmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMucHJvbWlzZSA9IHRoaXMucHJvbWlzZS5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLm9yID0gdGhpcy5vci5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLmFuZCA9IHRoaXMuYW5kLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMudHJhbnNmb3JtID0gdGhpcy50cmFuc2Zvcm0uYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5icmFuZCA9IHRoaXMuYnJhbmQuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5kZWZhdWx0ID0gdGhpcy5kZWZhdWx0LmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuY2F0Y2ggPSB0aGlzLmNhdGNoLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuZGVzY3JpYmUgPSB0aGlzLmRlc2NyaWJlLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMucGlwZSA9IHRoaXMucGlwZS5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLnJlYWRvbmx5ID0gdGhpcy5yZWFkb25seS5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLmlzTnVsbGFibGUgPSB0aGlzLmlzTnVsbGFibGUuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5pc09wdGlvbmFsID0gdGhpcy5pc09wdGlvbmFsLmJpbmQodGhpcyk7XG4gICAgfVxuICAgIGdldCBkZXNjcmlwdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi5kZXNjcmlwdGlvbjtcbiAgICB9XG4gICAgX2dldFR5cGUoaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIGdldFBhcnNlZFR5cGUoaW5wdXQuZGF0YSk7XG4gICAgfVxuICAgIF9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KSB7XG4gICAgICAgIHJldHVybiAoY3R4IHx8IHtcbiAgICAgICAgICAgIGNvbW1vbjogaW5wdXQucGFyZW50LmNvbW1vbixcbiAgICAgICAgICAgIGRhdGE6IGlucHV0LmRhdGEsXG4gICAgICAgICAgICBwYXJzZWRUeXBlOiBnZXRQYXJzZWRUeXBlKGlucHV0LmRhdGEpLFxuICAgICAgICAgICAgc2NoZW1hRXJyb3JNYXA6IHRoaXMuX2RlZi5lcnJvck1hcCxcbiAgICAgICAgICAgIHBhdGg6IGlucHV0LnBhdGgsXG4gICAgICAgICAgICBwYXJlbnQ6IGlucHV0LnBhcmVudCxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIF9wcm9jZXNzSW5wdXRQYXJhbXMoaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHN0YXR1czogbmV3IFBhcnNlU3RhdHVzKCksXG4gICAgICAgICAgICBjdHg6IHtcbiAgICAgICAgICAgICAgICBjb21tb246IGlucHV0LnBhcmVudC5jb21tb24sXG4gICAgICAgICAgICAgICAgZGF0YTogaW5wdXQuZGF0YSxcbiAgICAgICAgICAgICAgICBwYXJzZWRUeXBlOiBnZXRQYXJzZWRUeXBlKGlucHV0LmRhdGEpLFxuICAgICAgICAgICAgICAgIHNjaGVtYUVycm9yTWFwOiB0aGlzLl9kZWYuZXJyb3JNYXAsXG4gICAgICAgICAgICAgICAgcGF0aDogaW5wdXQucGF0aCxcbiAgICAgICAgICAgICAgICBwYXJlbnQ6IGlucHV0LnBhcmVudCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgfVxuICAgIF9wYXJzZVN5bmMoaW5wdXQpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5fcGFyc2UoaW5wdXQpO1xuICAgICAgICBpZiAoaXNBc3luYyhyZXN1bHQpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTeW5jaHJvbm91cyBwYXJzZSBlbmNvdW50ZXJlZCBwcm9taXNlLlwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBfcGFyc2VBc3luYyhpbnB1dCkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLl9wYXJzZShpbnB1dCk7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUocmVzdWx0KTtcbiAgICB9XG4gICAgcGFyc2UoZGF0YSwgcGFyYW1zKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuc2FmZVBhcnNlKGRhdGEsIHBhcmFtcyk7XG4gICAgICAgIGlmIChyZXN1bHQuc3VjY2VzcylcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQuZGF0YTtcbiAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgIH1cbiAgICBzYWZlUGFyc2UoZGF0YSwgcGFyYW1zKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgY29uc3QgY3R4ID0ge1xuICAgICAgICAgICAgY29tbW9uOiB7XG4gICAgICAgICAgICAgICAgaXNzdWVzOiBbXSxcbiAgICAgICAgICAgICAgICBhc3luYzogKF9hID0gcGFyYW1zID09PSBudWxsIHx8IHBhcmFtcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogcGFyYW1zLmFzeW5jKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBjb250ZXh0dWFsRXJyb3JNYXA6IHBhcmFtcyA9PT0gbnVsbCB8fCBwYXJhbXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHBhcmFtcy5lcnJvck1hcCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBwYXRoOiAocGFyYW1zID09PSBudWxsIHx8IHBhcmFtcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogcGFyYW1zLnBhdGgpIHx8IFtdLFxuICAgICAgICAgICAgc2NoZW1hRXJyb3JNYXA6IHRoaXMuX2RlZi5lcnJvck1hcCxcbiAgICAgICAgICAgIHBhcmVudDogbnVsbCxcbiAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgICBwYXJzZWRUeXBlOiBnZXRQYXJzZWRUeXBlKGRhdGEpLFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLl9wYXJzZVN5bmMoeyBkYXRhLCBwYXRoOiBjdHgucGF0aCwgcGFyZW50OiBjdHggfSk7XG4gICAgICAgIHJldHVybiBoYW5kbGVSZXN1bHQoY3R4LCByZXN1bHQpO1xuICAgIH1cbiAgICBhc3luYyBwYXJzZUFzeW5jKGRhdGEsIHBhcmFtcykge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnNhZmVQYXJzZUFzeW5jKGRhdGEsIHBhcmFtcyk7XG4gICAgICAgIGlmIChyZXN1bHQuc3VjY2VzcylcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQuZGF0YTtcbiAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgIH1cbiAgICBhc3luYyBzYWZlUGFyc2VBc3luYyhkYXRhLCBwYXJhbXMpIHtcbiAgICAgICAgY29uc3QgY3R4ID0ge1xuICAgICAgICAgICAgY29tbW9uOiB7XG4gICAgICAgICAgICAgICAgaXNzdWVzOiBbXSxcbiAgICAgICAgICAgICAgICBjb250ZXh0dWFsRXJyb3JNYXA6IHBhcmFtcyA9PT0gbnVsbCB8fCBwYXJhbXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHBhcmFtcy5lcnJvck1hcCxcbiAgICAgICAgICAgICAgICBhc3luYzogdHJ1ZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBwYXRoOiAocGFyYW1zID09PSBudWxsIHx8IHBhcmFtcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogcGFyYW1zLnBhdGgpIHx8IFtdLFxuICAgICAgICAgICAgc2NoZW1hRXJyb3JNYXA6IHRoaXMuX2RlZi5lcnJvck1hcCxcbiAgICAgICAgICAgIHBhcmVudDogbnVsbCxcbiAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgICBwYXJzZWRUeXBlOiBnZXRQYXJzZWRUeXBlKGRhdGEpLFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBtYXliZUFzeW5jUmVzdWx0ID0gdGhpcy5fcGFyc2UoeyBkYXRhLCBwYXRoOiBjdHgucGF0aCwgcGFyZW50OiBjdHggfSk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IChpc0FzeW5jKG1heWJlQXN5bmNSZXN1bHQpXG4gICAgICAgICAgICA/IG1heWJlQXN5bmNSZXN1bHRcbiAgICAgICAgICAgIDogUHJvbWlzZS5yZXNvbHZlKG1heWJlQXN5bmNSZXN1bHQpKTtcbiAgICAgICAgcmV0dXJuIGhhbmRsZVJlc3VsdChjdHgsIHJlc3VsdCk7XG4gICAgfVxuICAgIHJlZmluZShjaGVjaywgbWVzc2FnZSkge1xuICAgICAgICBjb25zdCBnZXRJc3N1ZVByb3BlcnRpZXMgPSAodmFsKSA9PiB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIG1lc3NhZ2UgPT09IFwic3RyaW5nXCIgfHwgdHlwZW9mIG1lc3NhZ2UgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBtZXNzYWdlIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0eXBlb2YgbWVzc2FnZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2UodmFsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVmaW5lbWVudCgodmFsLCBjdHgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGNoZWNrKHZhbCk7XG4gICAgICAgICAgICBjb25zdCBzZXRFcnJvciA9ICgpID0+IGN0eC5hZGRJc3N1ZSh7XG4gICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmN1c3RvbSxcbiAgICAgICAgICAgICAgICAuLi5nZXRJc3N1ZVByb3BlcnRpZXModmFsKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBQcm9taXNlICE9PSBcInVuZGVmaW5lZFwiICYmIHJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0LnRoZW4oKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFkYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRFcnJvcigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghcmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgc2V0RXJyb3IoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJlZmluZW1lbnQoY2hlY2ssIHJlZmluZW1lbnREYXRhKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yZWZpbmVtZW50KCh2YWwsIGN0eCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFjaGVjayh2YWwpKSB7XG4gICAgICAgICAgICAgICAgY3R4LmFkZElzc3VlKHR5cGVvZiByZWZpbmVtZW50RGF0YSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgICAgICAgICAgICAgID8gcmVmaW5lbWVudERhdGEodmFsLCBjdHgpXG4gICAgICAgICAgICAgICAgICAgIDogcmVmaW5lbWVudERhdGEpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgX3JlZmluZW1lbnQocmVmaW5lbWVudCkge1xuICAgICAgICByZXR1cm4gbmV3IFpvZEVmZmVjdHMoe1xuICAgICAgICAgICAgc2NoZW1hOiB0aGlzLFxuICAgICAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RFZmZlY3RzLFxuICAgICAgICAgICAgZWZmZWN0OiB7IHR5cGU6IFwicmVmaW5lbWVudFwiLCByZWZpbmVtZW50IH0sXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBzdXBlclJlZmluZShyZWZpbmVtZW50KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yZWZpbmVtZW50KHJlZmluZW1lbnQpO1xuICAgIH1cbiAgICBvcHRpb25hbCgpIHtcbiAgICAgICAgcmV0dXJuIFpvZE9wdGlvbmFsLmNyZWF0ZSh0aGlzLCB0aGlzLl9kZWYpO1xuICAgIH1cbiAgICBudWxsYWJsZSgpIHtcbiAgICAgICAgcmV0dXJuIFpvZE51bGxhYmxlLmNyZWF0ZSh0aGlzLCB0aGlzLl9kZWYpO1xuICAgIH1cbiAgICBudWxsaXNoKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5udWxsYWJsZSgpLm9wdGlvbmFsKCk7XG4gICAgfVxuICAgIGFycmF5KCkge1xuICAgICAgICByZXR1cm4gWm9kQXJyYXkuY3JlYXRlKHRoaXMsIHRoaXMuX2RlZik7XG4gICAgfVxuICAgIHByb21pc2UoKSB7XG4gICAgICAgIHJldHVybiBab2RQcm9taXNlLmNyZWF0ZSh0aGlzLCB0aGlzLl9kZWYpO1xuICAgIH1cbiAgICBvcihvcHRpb24pIHtcbiAgICAgICAgcmV0dXJuIFpvZFVuaW9uLmNyZWF0ZShbdGhpcywgb3B0aW9uXSwgdGhpcy5fZGVmKTtcbiAgICB9XG4gICAgYW5kKGluY29taW5nKSB7XG4gICAgICAgIHJldHVybiBab2RJbnRlcnNlY3Rpb24uY3JlYXRlKHRoaXMsIGluY29taW5nLCB0aGlzLl9kZWYpO1xuICAgIH1cbiAgICB0cmFuc2Zvcm0odHJhbnNmb3JtKSB7XG4gICAgICAgIHJldHVybiBuZXcgWm9kRWZmZWN0cyh7XG4gICAgICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHRoaXMuX2RlZiksXG4gICAgICAgICAgICBzY2hlbWE6IHRoaXMsXG4gICAgICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZEVmZmVjdHMsXG4gICAgICAgICAgICBlZmZlY3Q6IHsgdHlwZTogXCJ0cmFuc2Zvcm1cIiwgdHJhbnNmb3JtIH0sXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBkZWZhdWx0KGRlZikge1xuICAgICAgICBjb25zdCBkZWZhdWx0VmFsdWVGdW5jID0gdHlwZW9mIGRlZiA9PT0gXCJmdW5jdGlvblwiID8gZGVmIDogKCkgPT4gZGVmO1xuICAgICAgICByZXR1cm4gbmV3IFpvZERlZmF1bHQoe1xuICAgICAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyh0aGlzLl9kZWYpLFxuICAgICAgICAgICAgaW5uZXJUeXBlOiB0aGlzLFxuICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiBkZWZhdWx0VmFsdWVGdW5jLFxuICAgICAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2REZWZhdWx0LFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgYnJhbmQoKSB7XG4gICAgICAgIHJldHVybiBuZXcgWm9kQnJhbmRlZCh7XG4gICAgICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZEJyYW5kZWQsXG4gICAgICAgICAgICB0eXBlOiB0aGlzLFxuICAgICAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyh0aGlzLl9kZWYpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgY2F0Y2goZGVmKSB7XG4gICAgICAgIGNvbnN0IGNhdGNoVmFsdWVGdW5jID0gdHlwZW9mIGRlZiA9PT0gXCJmdW5jdGlvblwiID8gZGVmIDogKCkgPT4gZGVmO1xuICAgICAgICByZXR1cm4gbmV3IFpvZENhdGNoKHtcbiAgICAgICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXModGhpcy5fZGVmKSxcbiAgICAgICAgICAgIGlubmVyVHlwZTogdGhpcyxcbiAgICAgICAgICAgIGNhdGNoVmFsdWU6IGNhdGNoVmFsdWVGdW5jLFxuICAgICAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RDYXRjaCxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGRlc2NyaWJlKGRlc2NyaXB0aW9uKSB7XG4gICAgICAgIGNvbnN0IFRoaXMgPSB0aGlzLmNvbnN0cnVjdG9yO1xuICAgICAgICByZXR1cm4gbmV3IFRoaXMoe1xuICAgICAgICAgICAgLi4udGhpcy5fZGVmLFxuICAgICAgICAgICAgZGVzY3JpcHRpb24sXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBwaXBlKHRhcmdldCkge1xuICAgICAgICByZXR1cm4gWm9kUGlwZWxpbmUuY3JlYXRlKHRoaXMsIHRhcmdldCk7XG4gICAgfVxuICAgIHJlYWRvbmx5KCkge1xuICAgICAgICByZXR1cm4gWm9kUmVhZG9ubHkuY3JlYXRlKHRoaXMpO1xuICAgIH1cbiAgICBpc09wdGlvbmFsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zYWZlUGFyc2UodW5kZWZpbmVkKS5zdWNjZXNzO1xuICAgIH1cbiAgICBpc051bGxhYmxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zYWZlUGFyc2UobnVsbCkuc3VjY2VzcztcbiAgICB9XG59XG5jb25zdCBjdWlkUmVnZXggPSAvXmNbXlxccy1dezgsfSQvaTtcbmNvbnN0IGN1aWQyUmVnZXggPSAvXlthLXpdW2EtejAtOV0qJC87XG5jb25zdCB1bGlkUmVnZXggPSAvXlswLTlBLUhKS01OUC1UVi1aXXsyNn0kLztcbi8vIGNvbnN0IHV1aWRSZWdleCA9XG4vLyAgIC9eKFthLWYwLTldezh9LVthLWYwLTldezR9LVsxLTVdW2EtZjAtOV17M30tW2EtZjAtOV17NH0tW2EtZjAtOV17MTJ9fDAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMCkkL2k7XG5jb25zdCB1dWlkUmVnZXggPSAvXlswLTlhLWZBLUZdezh9XFxiLVswLTlhLWZBLUZdezR9XFxiLVswLTlhLWZBLUZdezR9XFxiLVswLTlhLWZBLUZdezR9XFxiLVswLTlhLWZBLUZdezEyfSQvaTtcbi8vIGZyb20gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzQ2MTgxLzE1NTAxNTVcbi8vIG9sZCB2ZXJzaW9uOiB0b28gc2xvdywgZGlkbid0IHN1cHBvcnQgdW5pY29kZVxuLy8gY29uc3QgZW1haWxSZWdleCA9IC9eKCgoW2Etel18XFxkfFshI1xcJCUmJ1xcKlxcK1xcLVxcLz1cXD9cXF5fYHtcXHx9fl18W1xcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRl0pKyhcXC4oW2Etel18XFxkfFshI1xcJCUmJ1xcKlxcK1xcLVxcLz1cXD9cXF5fYHtcXHx9fl18W1xcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRl0pKykqKXwoKFxceDIyKSgoKChcXHgyMHxcXHgwOSkqKFxceDBkXFx4MGEpKT8oXFx4MjB8XFx4MDkpKyk/KChbXFx4MDEtXFx4MDhcXHgwYlxceDBjXFx4MGUtXFx4MWZcXHg3Zl18XFx4MjF8W1xceDIzLVxceDViXXxbXFx4NWQtXFx4N2VdfFtcXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZdKXwoXFxcXChbXFx4MDEtXFx4MDlcXHgwYlxceDBjXFx4MGQtXFx4N2ZdfFtcXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZdKSkpKSooKChcXHgyMHxcXHgwOSkqKFxceDBkXFx4MGEpKT8oXFx4MjB8XFx4MDkpKyk/KFxceDIyKSkpQCgoKFthLXpdfFxcZHxbXFx1MDBBMC1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkVGXSl8KChbYS16XXxcXGR8W1xcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRl0pKFthLXpdfFxcZHwtfFxcLnxffH58W1xcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRl0pKihbYS16XXxcXGR8W1xcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRl0pKSlcXC4pKygoW2Etel18W1xcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRl0pfCgoW2Etel18W1xcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRl0pKFthLXpdfFxcZHwtfFxcLnxffH58W1xcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRl0pKihbYS16XXxbXFx1MDBBMC1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkVGXSkpKSQvaTtcbi8vb2xkIGVtYWlsIHJlZ2V4XG4vLyBjb25zdCBlbWFpbFJlZ2V4ID0gL14oKFtePD4oKVtcXF0uLDs6XFxzQFwiXSsoXFwuW148PigpW1xcXS4sOzpcXHNAXCJdKykqKXwoXCIuK1wiKSlAKCg/IS0pKFtePD4oKVtcXF0uLDs6XFxzQFwiXStcXC4pK1tePD4oKVtcXF0uLDs6XFxzQFwiXXsxLH0pW14tPD4oKVtcXF0uLDs6XFxzQFwiXSQvaTtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuLy8gY29uc3QgZW1haWxSZWdleCA9XG4vLyAgIC9eKChbXjw+KClbXFxdXFxcXC4sOzpcXHNAXFxcIl0rKFxcLltePD4oKVtcXF1cXFxcLiw7Olxcc0BcXFwiXSspKil8KFxcXCIuK1xcXCIpKUAoKFxcWygoKDI1WzAtNV0pfCgyWzAtNF1bMC05XSl8KDFbMC05XXsyfSl8KFswLTldezEsMn0pKVxcLil7M30oKDI1WzAtNV0pfCgyWzAtNF1bMC05XSl8KDFbMC05XXsyfSl8KFswLTldezEsMn0pKVxcXSl8KFxcW0lQdjY6KChbYS1mMC05XXsxLDR9Oil7N318OjooW2EtZjAtOV17MSw0fTopezAsNn18KFthLWYwLTldezEsNH06KXsxfTooW2EtZjAtOV17MSw0fTopezAsNX18KFthLWYwLTldezEsNH06KXsyfTooW2EtZjAtOV17MSw0fTopezAsNH18KFthLWYwLTldezEsNH06KXszfTooW2EtZjAtOV17MSw0fTopezAsM318KFthLWYwLTldezEsNH06KXs0fTooW2EtZjAtOV17MSw0fTopezAsMn18KFthLWYwLTldezEsNH06KXs1fTooW2EtZjAtOV17MSw0fTopezAsMX0pKFthLWYwLTldezEsNH18KCgoMjVbMC01XSl8KDJbMC00XVswLTldKXwoMVswLTldezJ9KXwoWzAtOV17MSwyfSkpXFwuKXszfSgoMjVbMC01XSl8KDJbMC00XVswLTldKXwoMVswLTldezJ9KXwoWzAtOV17MSwyfSkpKVxcXSl8KFtBLVphLXowLTldKFtBLVphLXowLTktXSpbQS1aYS16MC05XSkqKFxcLltBLVphLXpdezIsfSkrKSkkLztcbi8vIGNvbnN0IGVtYWlsUmVnZXggPVxuLy8gICAvXlthLXpBLVowLTlcXC5cXCFcXCNcXCRcXCVcXCZcXCdcXCpcXCtcXC9cXD1cXD9cXF5cXF9cXGBcXHtcXHxcXH1cXH5cXC1dK0BbYS16QS1aMC05XSg/OlthLXpBLVowLTktXXswLDYxfVthLXpBLVowLTldKT8oPzpcXC5bYS16QS1aMC05XSg/OlthLXpBLVowLTktXXswLDYxfVthLXpBLVowLTldKT8pKiQvO1xuLy8gY29uc3QgZW1haWxSZWdleCA9XG4vLyAgIC9eKD86W2EtejAtOSEjJCUmJyorLz0/Xl9ge3x9fi1dKyg/OlxcLlthLXowLTkhIyQlJicqKy89P15fYHt8fX4tXSspKnxcIig/OltcXHgwMS1cXHgwOFxceDBiXFx4MGNcXHgwZS1cXHgxZlxceDIxXFx4MjMtXFx4NWJcXHg1ZC1cXHg3Zl18XFxcXFtcXHgwMS1cXHgwOVxceDBiXFx4MGNcXHgwZS1cXHg3Zl0pKlwiKUAoPzooPzpbYS16MC05XSg/OlthLXowLTktXSpbYS16MC05XSk/XFwuKStbYS16MC05XSg/OlthLXowLTktXSpbYS16MC05XSk/fFxcWyg/Oig/OjI1WzAtNV18MlswLTRdWzAtOV18WzAxXT9bMC05XVswLTldPylcXC4pezN9KD86MjVbMC01XXwyWzAtNF1bMC05XXxbMDFdP1swLTldWzAtOV0/fFthLXowLTktXSpbYS16MC05XTooPzpbXFx4MDEtXFx4MDhcXHgwYlxceDBjXFx4MGUtXFx4MWZcXHgyMS1cXHg1YVxceDUzLVxceDdmXXxcXFxcW1xceDAxLVxceDA5XFx4MGJcXHgwY1xceDBlLVxceDdmXSkrKVxcXSkkL2k7XG5jb25zdCBlbWFpbFJlZ2V4ID0gL14oPyFcXC4pKD8hLipcXC5cXC4pKFtBLVowLTlfKy1cXC5dKilbQS1aMC05XystXUAoW0EtWjAtOV1bQS1aMC05XFwtXSpcXC4pK1tBLVpdezIsfSQvaTtcbi8vIGNvbnN0IGVtYWlsUmVnZXggPVxuLy8gICAvXlthLXowLTkuISMkJSbigJkqKy89P15fYHt8fX4tXStAW2EtejAtOS1dKyg/OlxcLlthLXowLTlcXC1dKykqJC9pO1xuLy8gZnJvbSBodHRwczovL3RoZWtldmluc2NvdHQuY29tL2Vtb2ppcy1pbi1qYXZhc2NyaXB0LyN3cml0aW5nLWEtcmVndWxhci1leHByZXNzaW9uXG5jb25zdCBfZW1vamlSZWdleCA9IGBeKFxcXFxwe0V4dGVuZGVkX1BpY3RvZ3JhcGhpY318XFxcXHB7RW1vamlfQ29tcG9uZW50fSkrJGA7XG5sZXQgZW1vamlSZWdleDtcbmNvbnN0IGlwdjRSZWdleCA9IC9eKCgoMjVbMC01XSl8KDJbMC00XVswLTldKXwoMVswLTldezJ9KXwoWzAtOV17MSwyfSkpXFwuKXszfSgoMjVbMC01XSl8KDJbMC00XVswLTldKXwoMVswLTldezJ9KXwoWzAtOV17MSwyfSkpJC87XG5jb25zdCBpcHY2UmVnZXggPSAvXigoW2EtZjAtOV17MSw0fTopezd9fDo6KFthLWYwLTldezEsNH06KXswLDZ9fChbYS1mMC05XXsxLDR9Oil7MX06KFthLWYwLTldezEsNH06KXswLDV9fChbYS1mMC05XXsxLDR9Oil7Mn06KFthLWYwLTldezEsNH06KXswLDR9fChbYS1mMC05XXsxLDR9Oil7M306KFthLWYwLTldezEsNH06KXswLDN9fChbYS1mMC05XXsxLDR9Oil7NH06KFthLWYwLTldezEsNH06KXswLDJ9fChbYS1mMC05XXsxLDR9Oil7NX06KFthLWYwLTldezEsNH06KXswLDF9KShbYS1mMC05XXsxLDR9fCgoKDI1WzAtNV0pfCgyWzAtNF1bMC05XSl8KDFbMC05XXsyfSl8KFswLTldezEsMn0pKVxcLil7M30oKDI1WzAtNV0pfCgyWzAtNF1bMC05XSl8KDFbMC05XXsyfSl8KFswLTldezEsMn0pKSkkLztcbi8vIEFkYXB0ZWQgZnJvbSBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMzE0MzIzMVxuY29uc3QgZGF0ZXRpbWVSZWdleCA9IChhcmdzKSA9PiB7XG4gICAgaWYgKGFyZ3MucHJlY2lzaW9uKSB7XG4gICAgICAgIGlmIChhcmdzLm9mZnNldCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAoYF5cXFxcZHs0fS1cXFxcZHsyfS1cXFxcZHsyfVRcXFxcZHsyfTpcXFxcZHsyfTpcXFxcZHsyfVxcXFwuXFxcXGR7JHthcmdzLnByZWNpc2lvbn19KChbKy1dXFxcXGR7Mn0oOj9cXFxcZHsyfSk/KXxaKSRgKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUmVnRXhwKGBeXFxcXGR7NH0tXFxcXGR7Mn0tXFxcXGR7Mn1UXFxcXGR7Mn06XFxcXGR7Mn06XFxcXGR7Mn1cXFxcLlxcXFxkeyR7YXJncy5wcmVjaXNpb259fVokYCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAoYXJncy5wcmVjaXNpb24gPT09IDApIHtcbiAgICAgICAgaWYgKGFyZ3Mub2Zmc2V0KSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFJlZ0V4cChgXlxcXFxkezR9LVxcXFxkezJ9LVxcXFxkezJ9VFxcXFxkezJ9OlxcXFxkezJ9OlxcXFxkezJ9KChbKy1dXFxcXGR7Mn0oOj9cXFxcZHsyfSk/KXxaKSRgKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUmVnRXhwKGBeXFxcXGR7NH0tXFxcXGR7Mn0tXFxcXGR7Mn1UXFxcXGR7Mn06XFxcXGR7Mn06XFxcXGR7Mn1aJGApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBpZiAoYXJncy5vZmZzZXQpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUmVnRXhwKGBeXFxcXGR7NH0tXFxcXGR7Mn0tXFxcXGR7Mn1UXFxcXGR7Mn06XFxcXGR7Mn06XFxcXGR7Mn0oXFxcXC5cXFxcZCspPygoWystXVxcXFxkezJ9KDo/XFxcXGR7Mn0pPyl8WikkYCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFJlZ0V4cChgXlxcXFxkezR9LVxcXFxkezJ9LVxcXFxkezJ9VFxcXFxkezJ9OlxcXFxkezJ9OlxcXFxkezJ9KFxcXFwuXFxcXGQrKT9aJGApO1xuICAgICAgICB9XG4gICAgfVxufTtcbmZ1bmN0aW9uIGlzVmFsaWRJUChpcCwgdmVyc2lvbikge1xuICAgIGlmICgodmVyc2lvbiA9PT0gXCJ2NFwiIHx8ICF2ZXJzaW9uKSAmJiBpcHY0UmVnZXgudGVzdChpcCkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmICgodmVyc2lvbiA9PT0gXCJ2NlwiIHx8ICF2ZXJzaW9uKSAmJiBpcHY2UmVnZXgudGVzdChpcCkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbmNsYXNzIFpvZFN0cmluZyBleHRlbmRzIFpvZFR5cGUge1xuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBpZiAodGhpcy5fZGVmLmNvZXJjZSkge1xuICAgICAgICAgICAgaW5wdXQuZGF0YSA9IFN0cmluZyhpbnB1dC5kYXRhKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwYXJzZWRUeXBlID0gdGhpcy5fZ2V0VHlwZShpbnB1dCk7XG4gICAgICAgIGlmIChwYXJzZWRUeXBlICE9PSBab2RQYXJzZWRUeXBlLnN0cmluZykge1xuICAgICAgICAgICAgY29uc3QgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQpO1xuICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfdHlwZSxcbiAgICAgICAgICAgICAgICBleHBlY3RlZDogWm9kUGFyc2VkVHlwZS5zdHJpbmcsXG4gICAgICAgICAgICAgICAgcmVjZWl2ZWQ6IGN0eC5wYXJzZWRUeXBlLFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzdGF0dXMgPSBuZXcgUGFyc2VTdGF0dXMoKTtcbiAgICAgICAgbGV0IGN0eCA9IHVuZGVmaW5lZDtcbiAgICAgICAgZm9yIChjb25zdCBjaGVjayBvZiB0aGlzLl9kZWYuY2hlY2tzKSB7XG4gICAgICAgICAgICBpZiAoY2hlY2sua2luZCA9PT0gXCJtaW5cIikge1xuICAgICAgICAgICAgICAgIGlmIChpbnB1dC5kYXRhLmxlbmd0aCA8IGNoZWNrLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0LCBjdHgpO1xuICAgICAgICAgICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS50b29fc21hbGwsXG4gICAgICAgICAgICAgICAgICAgICAgICBtaW5pbXVtOiBjaGVjay52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBpbmNsdXNpdmU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBleGFjdDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBjaGVjay5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2sua2luZCA9PT0gXCJtYXhcIikge1xuICAgICAgICAgICAgICAgIGlmIChpbnB1dC5kYXRhLmxlbmd0aCA+IGNoZWNrLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0LCBjdHgpO1xuICAgICAgICAgICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS50b29fYmlnLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWF4aW11bTogY2hlY2sudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVzaXZlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXhhY3Q6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrLmtpbmQgPT09IFwibGVuZ3RoXCIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0b29CaWcgPSBpbnB1dC5kYXRhLmxlbmd0aCA+IGNoZWNrLnZhbHVlO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRvb1NtYWxsID0gaW5wdXQuZGF0YS5sZW5ndGggPCBjaGVjay52YWx1ZTtcbiAgICAgICAgICAgICAgICBpZiAodG9vQmlnIHx8IHRvb1NtYWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0LCBjdHgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodG9vQmlnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUudG9vX2JpZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhpbXVtOiBjaGVjay52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1c2l2ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGFjdDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBjaGVjay5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodG9vU21hbGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS50b29fc21hbGwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluaW11bTogY2hlY2sudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNsdXNpdmU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhhY3Q6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrLmtpbmQgPT09IFwiZW1haWxcIikge1xuICAgICAgICAgICAgICAgIGlmICghZW1haWxSZWdleC50ZXN0KGlucHV0LmRhdGEpKSB7XG4gICAgICAgICAgICAgICAgICAgIGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0LCBjdHgpO1xuICAgICAgICAgICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb246IFwiZW1haWxcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3N0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGNoZWNrLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjaGVjay5raW5kID09PSBcImVtb2ppXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWVtb2ppUmVnZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgZW1vamlSZWdleCA9IG5ldyBSZWdFeHAoX2Vtb2ppUmVnZXgsIFwidVwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFlbW9qaVJlZ2V4LnRlc3QoaW5wdXQuZGF0YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7XG4gICAgICAgICAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvbjogXCJlbW9qaVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrLmtpbmQgPT09IFwidXVpZFwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKCF1dWlkUmVnZXgudGVzdChpbnB1dC5kYXRhKSkge1xuICAgICAgICAgICAgICAgICAgICBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KTtcbiAgICAgICAgICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uOiBcInV1aWRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3N0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGNoZWNrLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjaGVjay5raW5kID09PSBcImN1aWRcIikge1xuICAgICAgICAgICAgICAgIGlmICghY3VpZFJlZ2V4LnRlc3QoaW5wdXQuZGF0YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7XG4gICAgICAgICAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvbjogXCJjdWlkXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF9zdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBjaGVjay5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2sua2luZCA9PT0gXCJjdWlkMlwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFjdWlkMlJlZ2V4LnRlc3QoaW5wdXQuZGF0YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7XG4gICAgICAgICAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvbjogXCJjdWlkMlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrLmtpbmQgPT09IFwidWxpZFwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKCF1bGlkUmVnZXgudGVzdChpbnB1dC5kYXRhKSkge1xuICAgICAgICAgICAgICAgICAgICBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KTtcbiAgICAgICAgICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uOiBcInVsaWRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3N0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGNoZWNrLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjaGVjay5raW5kID09PSBcInVybFwiKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgbmV3IFVSTChpbnB1dC5kYXRhKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKF9hKSB7XG4gICAgICAgICAgICAgICAgICAgIGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0LCBjdHgpO1xuICAgICAgICAgICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb246IFwidXJsXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF9zdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBjaGVjay5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2sua2luZCA9PT0gXCJyZWdleFwiKSB7XG4gICAgICAgICAgICAgICAgY2hlY2sucmVnZXgubGFzdEluZGV4ID0gMDtcbiAgICAgICAgICAgICAgICBjb25zdCB0ZXN0UmVzdWx0ID0gY2hlY2sucmVnZXgudGVzdChpbnB1dC5kYXRhKTtcbiAgICAgICAgICAgICAgICBpZiAoIXRlc3RSZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7XG4gICAgICAgICAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvbjogXCJyZWdleFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrLmtpbmQgPT09IFwidHJpbVwiKSB7XG4gICAgICAgICAgICAgICAgaW5wdXQuZGF0YSA9IGlucHV0LmRhdGEudHJpbSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2sua2luZCA9PT0gXCJpbmNsdWRlc1wiKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFpbnB1dC5kYXRhLmluY2x1ZGVzKGNoZWNrLnZhbHVlLCBjaGVjay5wb3NpdGlvbikpIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7XG4gICAgICAgICAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvbjogeyBpbmNsdWRlczogY2hlY2sudmFsdWUsIHBvc2l0aW9uOiBjaGVjay5wb3NpdGlvbiB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrLmtpbmQgPT09IFwidG9Mb3dlckNhc2VcIikge1xuICAgICAgICAgICAgICAgIGlucHV0LmRhdGEgPSBpbnB1dC5kYXRhLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjaGVjay5raW5kID09PSBcInRvVXBwZXJDYXNlXCIpIHtcbiAgICAgICAgICAgICAgICBpbnB1dC5kYXRhID0gaW5wdXQuZGF0YS50b1VwcGVyQ2FzZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2sua2luZCA9PT0gXCJzdGFydHNXaXRoXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWlucHV0LmRhdGEuc3RhcnRzV2l0aChjaGVjay52YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7XG4gICAgICAgICAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvbjogeyBzdGFydHNXaXRoOiBjaGVjay52YWx1ZSB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrLmtpbmQgPT09IFwiZW5kc1dpdGhcIikge1xuICAgICAgICAgICAgICAgIGlmICghaW5wdXQuZGF0YS5lbmRzV2l0aChjaGVjay52YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7XG4gICAgICAgICAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvbjogeyBlbmRzV2l0aDogY2hlY2sudmFsdWUgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGNoZWNrLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjaGVjay5raW5kID09PSBcImRhdGV0aW1lXCIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZWdleCA9IGRhdGV0aW1lUmVnZXgoY2hlY2spO1xuICAgICAgICAgICAgICAgIGlmICghcmVnZXgudGVzdChpbnB1dC5kYXRhKSkge1xuICAgICAgICAgICAgICAgICAgICBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KTtcbiAgICAgICAgICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF9zdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uOiBcImRhdGV0aW1lXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBjaGVjay5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2sua2luZCA9PT0gXCJpcFwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFpc1ZhbGlkSVAoaW5wdXQuZGF0YSwgY2hlY2sudmVyc2lvbikpIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7XG4gICAgICAgICAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvbjogXCJpcFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHV0aWwuYXNzZXJ0TmV2ZXIoY2hlY2spO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IHN0YXR1czogc3RhdHVzLnZhbHVlLCB2YWx1ZTogaW5wdXQuZGF0YSB9O1xuICAgIH1cbiAgICBfcmVnZXgocmVnZXgsIHZhbGlkYXRpb24sIG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVmaW5lbWVudCgoZGF0YSkgPT4gcmVnZXgudGVzdChkYXRhKSwge1xuICAgICAgICAgICAgdmFsaWRhdGlvbixcbiAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3N0cmluZyxcbiAgICAgICAgICAgIC4uLmVycm9yVXRpbC5lcnJUb09iaihtZXNzYWdlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIF9hZGRDaGVjayhjaGVjaykge1xuICAgICAgICByZXR1cm4gbmV3IFpvZFN0cmluZyh7XG4gICAgICAgICAgICAuLi50aGlzLl9kZWYsXG4gICAgICAgICAgICBjaGVja3M6IFsuLi50aGlzLl9kZWYuY2hlY2tzLCBjaGVja10sXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBlbWFpbChtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7IGtpbmQ6IFwiZW1haWxcIiwgLi4uZXJyb3JVdGlsLmVyclRvT2JqKG1lc3NhZ2UpIH0pO1xuICAgIH1cbiAgICB1cmwobWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soeyBraW5kOiBcInVybFwiLCAuLi5lcnJvclV0aWwuZXJyVG9PYmoobWVzc2FnZSkgfSk7XG4gICAgfVxuICAgIGVtb2ppKG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHsga2luZDogXCJlbW9qaVwiLCAuLi5lcnJvclV0aWwuZXJyVG9PYmoobWVzc2FnZSkgfSk7XG4gICAgfVxuICAgIHV1aWQobWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soeyBraW5kOiBcInV1aWRcIiwgLi4uZXJyb3JVdGlsLmVyclRvT2JqKG1lc3NhZ2UpIH0pO1xuICAgIH1cbiAgICBjdWlkKG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHsga2luZDogXCJjdWlkXCIsIC4uLmVycm9yVXRpbC5lcnJUb09iaihtZXNzYWdlKSB9KTtcbiAgICB9XG4gICAgY3VpZDIobWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soeyBraW5kOiBcImN1aWQyXCIsIC4uLmVycm9yVXRpbC5lcnJUb09iaihtZXNzYWdlKSB9KTtcbiAgICB9XG4gICAgdWxpZChtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7IGtpbmQ6IFwidWxpZFwiLCAuLi5lcnJvclV0aWwuZXJyVG9PYmoobWVzc2FnZSkgfSk7XG4gICAgfVxuICAgIGlwKG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHsga2luZDogXCJpcFwiLCAuLi5lcnJvclV0aWwuZXJyVG9PYmoob3B0aW9ucykgfSk7XG4gICAgfVxuICAgIGRhdGV0aW1lKG9wdGlvbnMpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7XG4gICAgICAgICAgICAgICAga2luZDogXCJkYXRldGltZVwiLFxuICAgICAgICAgICAgICAgIHByZWNpc2lvbjogbnVsbCxcbiAgICAgICAgICAgICAgICBvZmZzZXQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IG9wdGlvbnMsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAgICAgICAga2luZDogXCJkYXRldGltZVwiLFxuICAgICAgICAgICAgcHJlY2lzaW9uOiB0eXBlb2YgKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5wcmVjaXNpb24pID09PSBcInVuZGVmaW5lZFwiID8gbnVsbCA6IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5wcmVjaXNpb24sXG4gICAgICAgICAgICBvZmZzZXQ6IChfYSA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5vZmZzZXQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IGZhbHNlLFxuICAgICAgICAgICAgLi4uZXJyb3JVdGlsLmVyclRvT2JqKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5tZXNzYWdlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJlZ2V4KHJlZ2V4LCBtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7XG4gICAgICAgICAgICBraW5kOiBcInJlZ2V4XCIsXG4gICAgICAgICAgICByZWdleDogcmVnZXgsXG4gICAgICAgICAgICAuLi5lcnJvclV0aWwuZXJyVG9PYmoobWVzc2FnZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBpbmNsdWRlcyh2YWx1ZSwgb3B0aW9ucykge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAgICAgICAga2luZDogXCJpbmNsdWRlc1wiLFxuICAgICAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICAgICAgcG9zaXRpb246IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5wb3NpdGlvbixcbiAgICAgICAgICAgIC4uLmVycm9yVXRpbC5lcnJUb09iaihvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMubWVzc2FnZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBzdGFydHNXaXRoKHZhbHVlLCBtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7XG4gICAgICAgICAgICBraW5kOiBcInN0YXJ0c1dpdGhcIixcbiAgICAgICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgICAgIC4uLmVycm9yVXRpbC5lcnJUb09iaihtZXNzYWdlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGVuZHNXaXRoKHZhbHVlLCBtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7XG4gICAgICAgICAgICBraW5kOiBcImVuZHNXaXRoXCIsXG4gICAgICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgICAgICAuLi5lcnJvclV0aWwuZXJyVG9PYmoobWVzc2FnZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBtaW4obWluTGVuZ3RoLCBtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7XG4gICAgICAgICAgICBraW5kOiBcIm1pblwiLFxuICAgICAgICAgICAgdmFsdWU6IG1pbkxlbmd0aCxcbiAgICAgICAgICAgIC4uLmVycm9yVXRpbC5lcnJUb09iaihtZXNzYWdlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG1heChtYXhMZW5ndGgsIG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHtcbiAgICAgICAgICAgIGtpbmQ6IFwibWF4XCIsXG4gICAgICAgICAgICB2YWx1ZTogbWF4TGVuZ3RoLFxuICAgICAgICAgICAgLi4uZXJyb3JVdGlsLmVyclRvT2JqKG1lc3NhZ2UpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgbGVuZ3RoKGxlbiwgbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAgICAgICAga2luZDogXCJsZW5ndGhcIixcbiAgICAgICAgICAgIHZhbHVlOiBsZW4sXG4gICAgICAgICAgICAuLi5lcnJvclV0aWwuZXJyVG9PYmoobWVzc2FnZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZCBVc2Ugei5zdHJpbmcoKS5taW4oMSkgaW5zdGVhZC5cbiAgICAgKiBAc2VlIHtAbGluayBab2RTdHJpbmcubWlufVxuICAgICAqL1xuICAgIG5vbmVtcHR5KG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWluKDEsIGVycm9yVXRpbC5lcnJUb09iaihtZXNzYWdlKSk7XG4gICAgfVxuICAgIHRyaW0oKSB7XG4gICAgICAgIHJldHVybiBuZXcgWm9kU3RyaW5nKHtcbiAgICAgICAgICAgIC4uLnRoaXMuX2RlZixcbiAgICAgICAgICAgIGNoZWNrczogWy4uLnRoaXMuX2RlZi5jaGVja3MsIHsga2luZDogXCJ0cmltXCIgfV0sXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0b0xvd2VyQ2FzZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBab2RTdHJpbmcoe1xuICAgICAgICAgICAgLi4udGhpcy5fZGVmLFxuICAgICAgICAgICAgY2hlY2tzOiBbLi4udGhpcy5fZGVmLmNoZWNrcywgeyBraW5kOiBcInRvTG93ZXJDYXNlXCIgfV0sXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0b1VwcGVyQ2FzZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBab2RTdHJpbmcoe1xuICAgICAgICAgICAgLi4udGhpcy5fZGVmLFxuICAgICAgICAgICAgY2hlY2tzOiBbLi4udGhpcy5fZGVmLmNoZWNrcywgeyBraW5kOiBcInRvVXBwZXJDYXNlXCIgfV0sXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBnZXQgaXNEYXRldGltZSgpIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5fZGVmLmNoZWNrcy5maW5kKChjaCkgPT4gY2gua2luZCA9PT0gXCJkYXRldGltZVwiKTtcbiAgICB9XG4gICAgZ2V0IGlzRW1haWwoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuX2RlZi5jaGVja3MuZmluZCgoY2gpID0+IGNoLmtpbmQgPT09IFwiZW1haWxcIik7XG4gICAgfVxuICAgIGdldCBpc1VSTCgpIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5fZGVmLmNoZWNrcy5maW5kKChjaCkgPT4gY2gua2luZCA9PT0gXCJ1cmxcIik7XG4gICAgfVxuICAgIGdldCBpc0Vtb2ppKCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLl9kZWYuY2hlY2tzLmZpbmQoKGNoKSA9PiBjaC5raW5kID09PSBcImVtb2ppXCIpO1xuICAgIH1cbiAgICBnZXQgaXNVVUlEKCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLl9kZWYuY2hlY2tzLmZpbmQoKGNoKSA9PiBjaC5raW5kID09PSBcInV1aWRcIik7XG4gICAgfVxuICAgIGdldCBpc0NVSUQoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuX2RlZi5jaGVja3MuZmluZCgoY2gpID0+IGNoLmtpbmQgPT09IFwiY3VpZFwiKTtcbiAgICB9XG4gICAgZ2V0IGlzQ1VJRDIoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuX2RlZi5jaGVja3MuZmluZCgoY2gpID0+IGNoLmtpbmQgPT09IFwiY3VpZDJcIik7XG4gICAgfVxuICAgIGdldCBpc1VMSUQoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuX2RlZi5jaGVja3MuZmluZCgoY2gpID0+IGNoLmtpbmQgPT09IFwidWxpZFwiKTtcbiAgICB9XG4gICAgZ2V0IGlzSVAoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuX2RlZi5jaGVja3MuZmluZCgoY2gpID0+IGNoLmtpbmQgPT09IFwiaXBcIik7XG4gICAgfVxuICAgIGdldCBtaW5MZW5ndGgoKSB7XG4gICAgICAgIGxldCBtaW4gPSBudWxsO1xuICAgICAgICBmb3IgKGNvbnN0IGNoIG9mIHRoaXMuX2RlZi5jaGVja3MpIHtcbiAgICAgICAgICAgIGlmIChjaC5raW5kID09PSBcIm1pblwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKG1pbiA9PT0gbnVsbCB8fCBjaC52YWx1ZSA+IG1pbilcbiAgICAgICAgICAgICAgICAgICAgbWluID0gY2gudmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1pbjtcbiAgICB9XG4gICAgZ2V0IG1heExlbmd0aCgpIHtcbiAgICAgICAgbGV0IG1heCA9IG51bGw7XG4gICAgICAgIGZvciAoY29uc3QgY2ggb2YgdGhpcy5fZGVmLmNoZWNrcykge1xuICAgICAgICAgICAgaWYgKGNoLmtpbmQgPT09IFwibWF4XCIpIHtcbiAgICAgICAgICAgICAgICBpZiAobWF4ID09PSBudWxsIHx8IGNoLnZhbHVlIDwgbWF4KVxuICAgICAgICAgICAgICAgICAgICBtYXggPSBjaC52YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWF4O1xuICAgIH1cbn1cblpvZFN0cmluZy5jcmVhdGUgPSAocGFyYW1zKSA9PiB7XG4gICAgdmFyIF9hO1xuICAgIHJldHVybiBuZXcgWm9kU3RyaW5nKHtcbiAgICAgICAgY2hlY2tzOiBbXSxcbiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RTdHJpbmcsXG4gICAgICAgIGNvZXJjZTogKF9hID0gcGFyYW1zID09PSBudWxsIHx8IHBhcmFtcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogcGFyYW1zLmNvZXJjZSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogZmFsc2UsXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG4vLyBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8zOTY2NDg0L3doeS1kb2VzLW1vZHVsdXMtb3BlcmF0b3ItcmV0dXJuLWZyYWN0aW9uYWwtbnVtYmVyLWluLWphdmFzY3JpcHQvMzE3MTEwMzQjMzE3MTEwMzRcbmZ1bmN0aW9uIGZsb2F0U2FmZVJlbWFpbmRlcih2YWwsIHN0ZXApIHtcbiAgICBjb25zdCB2YWxEZWNDb3VudCA9ICh2YWwudG9TdHJpbmcoKS5zcGxpdChcIi5cIilbMV0gfHwgXCJcIikubGVuZ3RoO1xuICAgIGNvbnN0IHN0ZXBEZWNDb3VudCA9IChzdGVwLnRvU3RyaW5nKCkuc3BsaXQoXCIuXCIpWzFdIHx8IFwiXCIpLmxlbmd0aDtcbiAgICBjb25zdCBkZWNDb3VudCA9IHZhbERlY0NvdW50ID4gc3RlcERlY0NvdW50ID8gdmFsRGVjQ291bnQgOiBzdGVwRGVjQ291bnQ7XG4gICAgY29uc3QgdmFsSW50ID0gcGFyc2VJbnQodmFsLnRvRml4ZWQoZGVjQ291bnQpLnJlcGxhY2UoXCIuXCIsIFwiXCIpKTtcbiAgICBjb25zdCBzdGVwSW50ID0gcGFyc2VJbnQoc3RlcC50b0ZpeGVkKGRlY0NvdW50KS5yZXBsYWNlKFwiLlwiLCBcIlwiKSk7XG4gICAgcmV0dXJuICh2YWxJbnQgJSBzdGVwSW50KSAvIE1hdGgucG93KDEwLCBkZWNDb3VudCk7XG59XG5jbGFzcyBab2ROdW1iZXIgZXh0ZW5kcyBab2RUeXBlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICAgICAgdGhpcy5taW4gPSB0aGlzLmd0ZTtcbiAgICAgICAgdGhpcy5tYXggPSB0aGlzLmx0ZTtcbiAgICAgICAgdGhpcy5zdGVwID0gdGhpcy5tdWx0aXBsZU9mO1xuICAgIH1cbiAgICBfcGFyc2UoaW5wdXQpIHtcbiAgICAgICAgaWYgKHRoaXMuX2RlZi5jb2VyY2UpIHtcbiAgICAgICAgICAgIGlucHV0LmRhdGEgPSBOdW1iZXIoaW5wdXQuZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcGFyc2VkVHlwZSA9IHRoaXMuX2dldFR5cGUoaW5wdXQpO1xuICAgICAgICBpZiAocGFyc2VkVHlwZSAhPT0gWm9kUGFyc2VkVHlwZS5udW1iZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0KTtcbiAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3R5cGUsXG4gICAgICAgICAgICAgICAgZXhwZWN0ZWQ6IFpvZFBhcnNlZFR5cGUubnVtYmVyLFxuICAgICAgICAgICAgICAgIHJlY2VpdmVkOiBjdHgucGFyc2VkVHlwZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGN0eCA9IHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gbmV3IFBhcnNlU3RhdHVzKCk7XG4gICAgICAgIGZvciAoY29uc3QgY2hlY2sgb2YgdGhpcy5fZGVmLmNoZWNrcykge1xuICAgICAgICAgICAgaWYgKGNoZWNrLmtpbmQgPT09IFwiaW50XCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXV0aWwuaXNJbnRlZ2VyKGlucHV0LmRhdGEpKSB7XG4gICAgICAgICAgICAgICAgICAgIGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0LCBjdHgpO1xuICAgICAgICAgICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3R5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZDogXCJpbnRlZ2VyXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICByZWNlaXZlZDogXCJmbG9hdFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrLmtpbmQgPT09IFwibWluXCIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0b29TbWFsbCA9IGNoZWNrLmluY2x1c2l2ZVxuICAgICAgICAgICAgICAgICAgICA/IGlucHV0LmRhdGEgPCBjaGVjay52YWx1ZVxuICAgICAgICAgICAgICAgICAgICA6IGlucHV0LmRhdGEgPD0gY2hlY2sudmFsdWU7XG4gICAgICAgICAgICAgICAgaWYgKHRvb1NtYWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0LCBjdHgpO1xuICAgICAgICAgICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS50b29fc21hbGwsXG4gICAgICAgICAgICAgICAgICAgICAgICBtaW5pbXVtOiBjaGVjay52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwibnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBpbmNsdXNpdmU6IGNoZWNrLmluY2x1c2l2ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4YWN0OiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGNoZWNrLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjaGVjay5raW5kID09PSBcIm1heFwiKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdG9vQmlnID0gY2hlY2suaW5jbHVzaXZlXG4gICAgICAgICAgICAgICAgICAgID8gaW5wdXQuZGF0YSA+IGNoZWNrLnZhbHVlXG4gICAgICAgICAgICAgICAgICAgIDogaW5wdXQuZGF0YSA+PSBjaGVjay52YWx1ZTtcbiAgICAgICAgICAgICAgICBpZiAodG9vQmlnKSB7XG4gICAgICAgICAgICAgICAgICAgIGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0LCBjdHgpO1xuICAgICAgICAgICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS50b29fYmlnLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWF4aW11bTogY2hlY2sudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcIm51bWJlclwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVzaXZlOiBjaGVjay5pbmNsdXNpdmUsXG4gICAgICAgICAgICAgICAgICAgICAgICBleGFjdDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBjaGVjay5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2sua2luZCA9PT0gXCJtdWx0aXBsZU9mXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoZmxvYXRTYWZlUmVtYWluZGVyKGlucHV0LmRhdGEsIGNoZWNrLnZhbHVlKSAhPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KTtcbiAgICAgICAgICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUubm90X211bHRpcGxlX29mLFxuICAgICAgICAgICAgICAgICAgICAgICAgbXVsdGlwbGVPZjogY2hlY2sudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBjaGVjay5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2sua2luZCA9PT0gXCJmaW5pdGVcIikge1xuICAgICAgICAgICAgICAgIGlmICghTnVtYmVyLmlzRmluaXRlKGlucHV0LmRhdGEpKSB7XG4gICAgICAgICAgICAgICAgICAgIGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0LCBjdHgpO1xuICAgICAgICAgICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5ub3RfZmluaXRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHV0aWwuYXNzZXJ0TmV2ZXIoY2hlY2spO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IHN0YXR1czogc3RhdHVzLnZhbHVlLCB2YWx1ZTogaW5wdXQuZGF0YSB9O1xuICAgIH1cbiAgICBndGUodmFsdWUsIG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0TGltaXQoXCJtaW5cIiwgdmFsdWUsIHRydWUsIGVycm9yVXRpbC50b1N0cmluZyhtZXNzYWdlKSk7XG4gICAgfVxuICAgIGd0KHZhbHVlLCBtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNldExpbWl0KFwibWluXCIsIHZhbHVlLCBmYWxzZSwgZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpKTtcbiAgICB9XG4gICAgbHRlKHZhbHVlLCBtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNldExpbWl0KFwibWF4XCIsIHZhbHVlLCB0cnVlLCBlcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSkpO1xuICAgIH1cbiAgICBsdCh2YWx1ZSwgbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5zZXRMaW1pdChcIm1heFwiLCB2YWx1ZSwgZmFsc2UsIGVycm9yVXRpbC50b1N0cmluZyhtZXNzYWdlKSk7XG4gICAgfVxuICAgIHNldExpbWl0KGtpbmQsIHZhbHVlLCBpbmNsdXNpdmUsIG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBab2ROdW1iZXIoe1xuICAgICAgICAgICAgLi4udGhpcy5fZGVmLFxuICAgICAgICAgICAgY2hlY2tzOiBbXG4gICAgICAgICAgICAgICAgLi4udGhpcy5fZGVmLmNoZWNrcyxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGtpbmQsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgICAgICAgICBpbmNsdXNpdmUsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGVycm9yVXRpbC50b1N0cmluZyhtZXNzYWdlKSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIF9hZGRDaGVjayhjaGVjaykge1xuICAgICAgICByZXR1cm4gbmV3IFpvZE51bWJlcih7XG4gICAgICAgICAgICAuLi50aGlzLl9kZWYsXG4gICAgICAgICAgICBjaGVja3M6IFsuLi50aGlzLl9kZWYuY2hlY2tzLCBjaGVja10sXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBpbnQobWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAgICAgICAga2luZDogXCJpbnRcIixcbiAgICAgICAgICAgIG1lc3NhZ2U6IGVycm9yVXRpbC50b1N0cmluZyhtZXNzYWdlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHBvc2l0aXZlKG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHtcbiAgICAgICAgICAgIGtpbmQ6IFwibWluXCIsXG4gICAgICAgICAgICB2YWx1ZTogMCxcbiAgICAgICAgICAgIGluY2x1c2l2ZTogZmFsc2UsXG4gICAgICAgICAgICBtZXNzYWdlOiBlcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBuZWdhdGl2ZShtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7XG4gICAgICAgICAgICBraW5kOiBcIm1heFwiLFxuICAgICAgICAgICAgdmFsdWU6IDAsXG4gICAgICAgICAgICBpbmNsdXNpdmU6IGZhbHNlLFxuICAgICAgICAgICAgbWVzc2FnZTogZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgbm9ucG9zaXRpdmUobWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAgICAgICAga2luZDogXCJtYXhcIixcbiAgICAgICAgICAgIHZhbHVlOiAwLFxuICAgICAgICAgICAgaW5jbHVzaXZlOiB0cnVlLFxuICAgICAgICAgICAgbWVzc2FnZTogZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgbm9ubmVnYXRpdmUobWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAgICAgICAga2luZDogXCJtaW5cIixcbiAgICAgICAgICAgIHZhbHVlOiAwLFxuICAgICAgICAgICAgaW5jbHVzaXZlOiB0cnVlLFxuICAgICAgICAgICAgbWVzc2FnZTogZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgbXVsdGlwbGVPZih2YWx1ZSwgbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAgICAgICAga2luZDogXCJtdWx0aXBsZU9mXCIsXG4gICAgICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgICAgICBtZXNzYWdlOiBlcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBmaW5pdGUobWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAgICAgICAga2luZDogXCJmaW5pdGVcIixcbiAgICAgICAgICAgIG1lc3NhZ2U6IGVycm9yVXRpbC50b1N0cmluZyhtZXNzYWdlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHNhZmUobWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAgICAgICAga2luZDogXCJtaW5cIixcbiAgICAgICAgICAgIGluY2x1c2l2ZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiBOdW1iZXIuTUlOX1NBRkVfSU5URUdFUixcbiAgICAgICAgICAgIG1lc3NhZ2U6IGVycm9yVXRpbC50b1N0cmluZyhtZXNzYWdlKSxcbiAgICAgICAgfSkuX2FkZENoZWNrKHtcbiAgICAgICAgICAgIGtpbmQ6IFwibWF4XCIsXG4gICAgICAgICAgICBpbmNsdXNpdmU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIsXG4gICAgICAgICAgICBtZXNzYWdlOiBlcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBnZXQgbWluVmFsdWUoKSB7XG4gICAgICAgIGxldCBtaW4gPSBudWxsO1xuICAgICAgICBmb3IgKGNvbnN0IGNoIG9mIHRoaXMuX2RlZi5jaGVja3MpIHtcbiAgICAgICAgICAgIGlmIChjaC5raW5kID09PSBcIm1pblwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKG1pbiA9PT0gbnVsbCB8fCBjaC52YWx1ZSA+IG1pbilcbiAgICAgICAgICAgICAgICAgICAgbWluID0gY2gudmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1pbjtcbiAgICB9XG4gICAgZ2V0IG1heFZhbHVlKCkge1xuICAgICAgICBsZXQgbWF4ID0gbnVsbDtcbiAgICAgICAgZm9yIChjb25zdCBjaCBvZiB0aGlzLl9kZWYuY2hlY2tzKSB7XG4gICAgICAgICAgICBpZiAoY2gua2luZCA9PT0gXCJtYXhcIikge1xuICAgICAgICAgICAgICAgIGlmIChtYXggPT09IG51bGwgfHwgY2gudmFsdWUgPCBtYXgpXG4gICAgICAgICAgICAgICAgICAgIG1heCA9IGNoLnZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtYXg7XG4gICAgfVxuICAgIGdldCBpc0ludCgpIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5fZGVmLmNoZWNrcy5maW5kKChjaCkgPT4gY2gua2luZCA9PT0gXCJpbnRcIiB8fFxuICAgICAgICAgICAgKGNoLmtpbmQgPT09IFwibXVsdGlwbGVPZlwiICYmIHV0aWwuaXNJbnRlZ2VyKGNoLnZhbHVlKSkpO1xuICAgIH1cbiAgICBnZXQgaXNGaW5pdGUoKSB7XG4gICAgICAgIGxldCBtYXggPSBudWxsLCBtaW4gPSBudWxsO1xuICAgICAgICBmb3IgKGNvbnN0IGNoIG9mIHRoaXMuX2RlZi5jaGVja3MpIHtcbiAgICAgICAgICAgIGlmIChjaC5raW5kID09PSBcImZpbml0ZVwiIHx8XG4gICAgICAgICAgICAgICAgY2gua2luZCA9PT0gXCJpbnRcIiB8fFxuICAgICAgICAgICAgICAgIGNoLmtpbmQgPT09IFwibXVsdGlwbGVPZlwiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjaC5raW5kID09PSBcIm1pblwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKG1pbiA9PT0gbnVsbCB8fCBjaC52YWx1ZSA+IG1pbilcbiAgICAgICAgICAgICAgICAgICAgbWluID0gY2gudmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjaC5raW5kID09PSBcIm1heFwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKG1heCA9PT0gbnVsbCB8fCBjaC52YWx1ZSA8IG1heClcbiAgICAgICAgICAgICAgICAgICAgbWF4ID0gY2gudmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIE51bWJlci5pc0Zpbml0ZShtaW4pICYmIE51bWJlci5pc0Zpbml0ZShtYXgpO1xuICAgIH1cbn1cblpvZE51bWJlci5jcmVhdGUgPSAocGFyYW1zKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBab2ROdW1iZXIoe1xuICAgICAgICBjaGVja3M6IFtdLFxuICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZE51bWJlcixcbiAgICAgICAgY29lcmNlOiAocGFyYW1zID09PSBudWxsIHx8IHBhcmFtcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogcGFyYW1zLmNvZXJjZSkgfHwgZmFsc2UsXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG5jbGFzcyBab2RCaWdJbnQgZXh0ZW5kcyBab2RUeXBlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICAgICAgdGhpcy5taW4gPSB0aGlzLmd0ZTtcbiAgICAgICAgdGhpcy5tYXggPSB0aGlzLmx0ZTtcbiAgICB9XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIGlmICh0aGlzLl9kZWYuY29lcmNlKSB7XG4gICAgICAgICAgICBpbnB1dC5kYXRhID0gQmlnSW50KGlucHV0LmRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBhcnNlZFR5cGUgPSB0aGlzLl9nZXRUeXBlKGlucHV0KTtcbiAgICAgICAgaWYgKHBhcnNlZFR5cGUgIT09IFpvZFBhcnNlZFR5cGUuYmlnaW50KSB7XG4gICAgICAgICAgICBjb25zdCBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCk7XG4gICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF90eXBlLFxuICAgICAgICAgICAgICAgIGV4cGVjdGVkOiBab2RQYXJzZWRUeXBlLmJpZ2ludCxcbiAgICAgICAgICAgICAgICByZWNlaXZlZDogY3R4LnBhcnNlZFR5cGUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBJTlZBTElEO1xuICAgICAgICB9XG4gICAgICAgIGxldCBjdHggPSB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IG5ldyBQYXJzZVN0YXR1cygpO1xuICAgICAgICBmb3IgKGNvbnN0IGNoZWNrIG9mIHRoaXMuX2RlZi5jaGVja3MpIHtcbiAgICAgICAgICAgIGlmIChjaGVjay5raW5kID09PSBcIm1pblwiKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdG9vU21hbGwgPSBjaGVjay5pbmNsdXNpdmVcbiAgICAgICAgICAgICAgICAgICAgPyBpbnB1dC5kYXRhIDwgY2hlY2sudmFsdWVcbiAgICAgICAgICAgICAgICAgICAgOiBpbnB1dC5kYXRhIDw9IGNoZWNrLnZhbHVlO1xuICAgICAgICAgICAgICAgIGlmICh0b29TbWFsbCkge1xuICAgICAgICAgICAgICAgICAgICBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KTtcbiAgICAgICAgICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUudG9vX3NtYWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJiaWdpbnRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIG1pbmltdW06IGNoZWNrLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVzaXZlOiBjaGVjay5pbmNsdXNpdmUsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBjaGVjay5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2sua2luZCA9PT0gXCJtYXhcIikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRvb0JpZyA9IGNoZWNrLmluY2x1c2l2ZVxuICAgICAgICAgICAgICAgICAgICA/IGlucHV0LmRhdGEgPiBjaGVjay52YWx1ZVxuICAgICAgICAgICAgICAgICAgICA6IGlucHV0LmRhdGEgPj0gY2hlY2sudmFsdWU7XG4gICAgICAgICAgICAgICAgaWYgKHRvb0JpZykge1xuICAgICAgICAgICAgICAgICAgICBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KTtcbiAgICAgICAgICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUudG9vX2JpZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiYmlnaW50XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXhpbXVtOiBjaGVjay52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1c2l2ZTogY2hlY2suaW5jbHVzaXZlLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrLmtpbmQgPT09IFwibXVsdGlwbGVPZlwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlucHV0LmRhdGEgJSBjaGVjay52YWx1ZSAhPT0gQmlnSW50KDApKSB7XG4gICAgICAgICAgICAgICAgICAgIGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0LCBjdHgpO1xuICAgICAgICAgICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5ub3RfbXVsdGlwbGVfb2YsXG4gICAgICAgICAgICAgICAgICAgICAgICBtdWx0aXBsZU9mOiBjaGVjay52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGNoZWNrLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB1dGlsLmFzc2VydE5ldmVyKGNoZWNrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBzdGF0dXM6IHN0YXR1cy52YWx1ZSwgdmFsdWU6IGlucHV0LmRhdGEgfTtcbiAgICB9XG4gICAgZ3RlKHZhbHVlLCBtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNldExpbWl0KFwibWluXCIsIHZhbHVlLCB0cnVlLCBlcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSkpO1xuICAgIH1cbiAgICBndCh2YWx1ZSwgbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5zZXRMaW1pdChcIm1pblwiLCB2YWx1ZSwgZmFsc2UsIGVycm9yVXRpbC50b1N0cmluZyhtZXNzYWdlKSk7XG4gICAgfVxuICAgIGx0ZSh2YWx1ZSwgbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5zZXRMaW1pdChcIm1heFwiLCB2YWx1ZSwgdHJ1ZSwgZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpKTtcbiAgICB9XG4gICAgbHQodmFsdWUsIG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0TGltaXQoXCJtYXhcIiwgdmFsdWUsIGZhbHNlLCBlcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSkpO1xuICAgIH1cbiAgICBzZXRMaW1pdChraW5kLCB2YWx1ZSwgaW5jbHVzaXZlLCBtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiBuZXcgWm9kQmlnSW50KHtcbiAgICAgICAgICAgIC4uLnRoaXMuX2RlZixcbiAgICAgICAgICAgIGNoZWNrczogW1xuICAgICAgICAgICAgICAgIC4uLnRoaXMuX2RlZi5jaGVja3MsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBraW5kLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgaW5jbHVzaXZlLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBlcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSksXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBfYWRkQ2hlY2soY2hlY2spIHtcbiAgICAgICAgcmV0dXJuIG5ldyBab2RCaWdJbnQoe1xuICAgICAgICAgICAgLi4udGhpcy5fZGVmLFxuICAgICAgICAgICAgY2hlY2tzOiBbLi4udGhpcy5fZGVmLmNoZWNrcywgY2hlY2tdLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcG9zaXRpdmUobWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAgICAgICAga2luZDogXCJtaW5cIixcbiAgICAgICAgICAgIHZhbHVlOiBCaWdJbnQoMCksXG4gICAgICAgICAgICBpbmNsdXNpdmU6IGZhbHNlLFxuICAgICAgICAgICAgbWVzc2FnZTogZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgbmVnYXRpdmUobWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAgICAgICAga2luZDogXCJtYXhcIixcbiAgICAgICAgICAgIHZhbHVlOiBCaWdJbnQoMCksXG4gICAgICAgICAgICBpbmNsdXNpdmU6IGZhbHNlLFxuICAgICAgICAgICAgbWVzc2FnZTogZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgbm9ucG9zaXRpdmUobWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAgICAgICAga2luZDogXCJtYXhcIixcbiAgICAgICAgICAgIHZhbHVlOiBCaWdJbnQoMCksXG4gICAgICAgICAgICBpbmNsdXNpdmU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiBlcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBub25uZWdhdGl2ZShtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7XG4gICAgICAgICAgICBraW5kOiBcIm1pblwiLFxuICAgICAgICAgICAgdmFsdWU6IEJpZ0ludCgwKSxcbiAgICAgICAgICAgIGluY2x1c2l2ZTogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGVycm9yVXRpbC50b1N0cmluZyhtZXNzYWdlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG11bHRpcGxlT2YodmFsdWUsIG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHtcbiAgICAgICAgICAgIGtpbmQ6IFwibXVsdGlwbGVPZlwiLFxuICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICBtZXNzYWdlOiBlcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBnZXQgbWluVmFsdWUoKSB7XG4gICAgICAgIGxldCBtaW4gPSBudWxsO1xuICAgICAgICBmb3IgKGNvbnN0IGNoIG9mIHRoaXMuX2RlZi5jaGVja3MpIHtcbiAgICAgICAgICAgIGlmIChjaC5raW5kID09PSBcIm1pblwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKG1pbiA9PT0gbnVsbCB8fCBjaC52YWx1ZSA+IG1pbilcbiAgICAgICAgICAgICAgICAgICAgbWluID0gY2gudmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1pbjtcbiAgICB9XG4gICAgZ2V0IG1heFZhbHVlKCkge1xuICAgICAgICBsZXQgbWF4ID0gbnVsbDtcbiAgICAgICAgZm9yIChjb25zdCBjaCBvZiB0aGlzLl9kZWYuY2hlY2tzKSB7XG4gICAgICAgICAgICBpZiAoY2gua2luZCA9PT0gXCJtYXhcIikge1xuICAgICAgICAgICAgICAgIGlmIChtYXggPT09IG51bGwgfHwgY2gudmFsdWUgPCBtYXgpXG4gICAgICAgICAgICAgICAgICAgIG1heCA9IGNoLnZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtYXg7XG4gICAgfVxufVxuWm9kQmlnSW50LmNyZWF0ZSA9IChwYXJhbXMpID0+IHtcbiAgICB2YXIgX2E7XG4gICAgcmV0dXJuIG5ldyBab2RCaWdJbnQoe1xuICAgICAgICBjaGVja3M6IFtdLFxuICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZEJpZ0ludCxcbiAgICAgICAgY29lcmNlOiAoX2EgPSBwYXJhbXMgPT09IG51bGwgfHwgcGFyYW1zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBwYXJhbXMuY29lcmNlKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBmYWxzZSxcbiAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpLFxuICAgIH0pO1xufTtcbmNsYXNzIFpvZEJvb2xlYW4gZXh0ZW5kcyBab2RUeXBlIHtcbiAgICBfcGFyc2UoaW5wdXQpIHtcbiAgICAgICAgaWYgKHRoaXMuX2RlZi5jb2VyY2UpIHtcbiAgICAgICAgICAgIGlucHV0LmRhdGEgPSBCb29sZWFuKGlucHV0LmRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBhcnNlZFR5cGUgPSB0aGlzLl9nZXRUeXBlKGlucHV0KTtcbiAgICAgICAgaWYgKHBhcnNlZFR5cGUgIT09IFpvZFBhcnNlZFR5cGUuYm9vbGVhbikge1xuICAgICAgICAgICAgY29uc3QgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQpO1xuICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfdHlwZSxcbiAgICAgICAgICAgICAgICBleHBlY3RlZDogWm9kUGFyc2VkVHlwZS5ib29sZWFuLFxuICAgICAgICAgICAgICAgIHJlY2VpdmVkOiBjdHgucGFyc2VkVHlwZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIE9LKGlucHV0LmRhdGEpO1xuICAgIH1cbn1cblpvZEJvb2xlYW4uY3JlYXRlID0gKHBhcmFtcykgPT4ge1xuICAgIHJldHVybiBuZXcgWm9kQm9vbGVhbih7XG4gICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kQm9vbGVhbixcbiAgICAgICAgY29lcmNlOiAocGFyYW1zID09PSBudWxsIHx8IHBhcmFtcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogcGFyYW1zLmNvZXJjZSkgfHwgZmFsc2UsXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG5jbGFzcyBab2REYXRlIGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIGlmICh0aGlzLl9kZWYuY29lcmNlKSB7XG4gICAgICAgICAgICBpbnB1dC5kYXRhID0gbmV3IERhdGUoaW5wdXQuZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcGFyc2VkVHlwZSA9IHRoaXMuX2dldFR5cGUoaW5wdXQpO1xuICAgICAgICBpZiAocGFyc2VkVHlwZSAhPT0gWm9kUGFyc2VkVHlwZS5kYXRlKSB7XG4gICAgICAgICAgICBjb25zdCBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCk7XG4gICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF90eXBlLFxuICAgICAgICAgICAgICAgIGV4cGVjdGVkOiBab2RQYXJzZWRUeXBlLmRhdGUsXG4gICAgICAgICAgICAgICAgcmVjZWl2ZWQ6IGN0eC5wYXJzZWRUeXBlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNOYU4oaW5wdXQuZGF0YS5nZXRUaW1lKCkpKSB7XG4gICAgICAgICAgICBjb25zdCBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCk7XG4gICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF9kYXRlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzdGF0dXMgPSBuZXcgUGFyc2VTdGF0dXMoKTtcbiAgICAgICAgbGV0IGN0eCA9IHVuZGVmaW5lZDtcbiAgICAgICAgZm9yIChjb25zdCBjaGVjayBvZiB0aGlzLl9kZWYuY2hlY2tzKSB7XG4gICAgICAgICAgICBpZiAoY2hlY2sua2luZCA9PT0gXCJtaW5cIikge1xuICAgICAgICAgICAgICAgIGlmIChpbnB1dC5kYXRhLmdldFRpbWUoKSA8IGNoZWNrLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0LCBjdHgpO1xuICAgICAgICAgICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS50b29fc21hbGwsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBjaGVjay5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVzaXZlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXhhY3Q6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWluaW11bTogY2hlY2sudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrLmtpbmQgPT09IFwibWF4XCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoaW5wdXQuZGF0YS5nZXRUaW1lKCkgPiBjaGVjay52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KTtcbiAgICAgICAgICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUudG9vX2JpZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGNoZWNrLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBpbmNsdXNpdmU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBleGFjdDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXhpbXVtOiBjaGVjay52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdXRpbC5hc3NlcnROZXZlcihjaGVjayk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHN0YXR1czogc3RhdHVzLnZhbHVlLFxuICAgICAgICAgICAgdmFsdWU6IG5ldyBEYXRlKGlucHV0LmRhdGEuZ2V0VGltZSgpKSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgX2FkZENoZWNrKGNoZWNrKSB7XG4gICAgICAgIHJldHVybiBuZXcgWm9kRGF0ZSh7XG4gICAgICAgICAgICAuLi50aGlzLl9kZWYsXG4gICAgICAgICAgICBjaGVja3M6IFsuLi50aGlzLl9kZWYuY2hlY2tzLCBjaGVja10sXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBtaW4obWluRGF0ZSwgbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAgICAgICAga2luZDogXCJtaW5cIixcbiAgICAgICAgICAgIHZhbHVlOiBtaW5EYXRlLmdldFRpbWUoKSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGVycm9yVXRpbC50b1N0cmluZyhtZXNzYWdlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG1heChtYXhEYXRlLCBtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7XG4gICAgICAgICAgICBraW5kOiBcIm1heFwiLFxuICAgICAgICAgICAgdmFsdWU6IG1heERhdGUuZ2V0VGltZSgpLFxuICAgICAgICAgICAgbWVzc2FnZTogZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZ2V0IG1pbkRhdGUoKSB7XG4gICAgICAgIGxldCBtaW4gPSBudWxsO1xuICAgICAgICBmb3IgKGNvbnN0IGNoIG9mIHRoaXMuX2RlZi5jaGVja3MpIHtcbiAgICAgICAgICAgIGlmIChjaC5raW5kID09PSBcIm1pblwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKG1pbiA9PT0gbnVsbCB8fCBjaC52YWx1ZSA+IG1pbilcbiAgICAgICAgICAgICAgICAgICAgbWluID0gY2gudmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1pbiAhPSBudWxsID8gbmV3IERhdGUobWluKSA6IG51bGw7XG4gICAgfVxuICAgIGdldCBtYXhEYXRlKCkge1xuICAgICAgICBsZXQgbWF4ID0gbnVsbDtcbiAgICAgICAgZm9yIChjb25zdCBjaCBvZiB0aGlzLl9kZWYuY2hlY2tzKSB7XG4gICAgICAgICAgICBpZiAoY2gua2luZCA9PT0gXCJtYXhcIikge1xuICAgICAgICAgICAgICAgIGlmIChtYXggPT09IG51bGwgfHwgY2gudmFsdWUgPCBtYXgpXG4gICAgICAgICAgICAgICAgICAgIG1heCA9IGNoLnZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtYXggIT0gbnVsbCA/IG5ldyBEYXRlKG1heCkgOiBudWxsO1xuICAgIH1cbn1cblpvZERhdGUuY3JlYXRlID0gKHBhcmFtcykgPT4ge1xuICAgIHJldHVybiBuZXcgWm9kRGF0ZSh7XG4gICAgICAgIGNoZWNrczogW10sXG4gICAgICAgIGNvZXJjZTogKHBhcmFtcyA9PT0gbnVsbCB8fCBwYXJhbXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHBhcmFtcy5jb2VyY2UpIHx8IGZhbHNlLFxuICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZERhdGUsXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG5jbGFzcyBab2RTeW1ib2wgZXh0ZW5kcyBab2RUeXBlIHtcbiAgICBfcGFyc2UoaW5wdXQpIHtcbiAgICAgICAgY29uc3QgcGFyc2VkVHlwZSA9IHRoaXMuX2dldFR5cGUoaW5wdXQpO1xuICAgICAgICBpZiAocGFyc2VkVHlwZSAhPT0gWm9kUGFyc2VkVHlwZS5zeW1ib2wpIHtcbiAgICAgICAgICAgIGNvbnN0IGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0KTtcbiAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3R5cGUsXG4gICAgICAgICAgICAgICAgZXhwZWN0ZWQ6IFpvZFBhcnNlZFR5cGUuc3ltYm9sLFxuICAgICAgICAgICAgICAgIHJlY2VpdmVkOiBjdHgucGFyc2VkVHlwZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIE9LKGlucHV0LmRhdGEpO1xuICAgIH1cbn1cblpvZFN5bWJvbC5jcmVhdGUgPSAocGFyYW1zKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBab2RTeW1ib2woe1xuICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZFN5bWJvbCxcbiAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpLFxuICAgIH0pO1xufTtcbmNsYXNzIFpvZFVuZGVmaW5lZCBleHRlbmRzIFpvZFR5cGUge1xuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBjb25zdCBwYXJzZWRUeXBlID0gdGhpcy5fZ2V0VHlwZShpbnB1dCk7XG4gICAgICAgIGlmIChwYXJzZWRUeXBlICE9PSBab2RQYXJzZWRUeXBlLnVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29uc3QgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQpO1xuICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfdHlwZSxcbiAgICAgICAgICAgICAgICBleHBlY3RlZDogWm9kUGFyc2VkVHlwZS51bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgcmVjZWl2ZWQ6IGN0eC5wYXJzZWRUeXBlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gT0soaW5wdXQuZGF0YSk7XG4gICAgfVxufVxuWm9kVW5kZWZpbmVkLmNyZWF0ZSA9IChwYXJhbXMpID0+IHtcbiAgICByZXR1cm4gbmV3IFpvZFVuZGVmaW5lZCh7XG4gICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kVW5kZWZpbmVkLFxuICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgfSk7XG59O1xuY2xhc3MgWm9kTnVsbCBleHRlbmRzIFpvZFR5cGUge1xuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBjb25zdCBwYXJzZWRUeXBlID0gdGhpcy5fZ2V0VHlwZShpbnB1dCk7XG4gICAgICAgIGlmIChwYXJzZWRUeXBlICE9PSBab2RQYXJzZWRUeXBlLm51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0KTtcbiAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3R5cGUsXG4gICAgICAgICAgICAgICAgZXhwZWN0ZWQ6IFpvZFBhcnNlZFR5cGUubnVsbCxcbiAgICAgICAgICAgICAgICByZWNlaXZlZDogY3R4LnBhcnNlZFR5cGUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBJTlZBTElEO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBPSyhpbnB1dC5kYXRhKTtcbiAgICB9XG59XG5ab2ROdWxsLmNyZWF0ZSA9IChwYXJhbXMpID0+IHtcbiAgICByZXR1cm4gbmV3IFpvZE51bGwoe1xuICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZE51bGwsXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG5jbGFzcyBab2RBbnkgZXh0ZW5kcyBab2RUeXBlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICAgICAgLy8gdG8gcHJldmVudCBpbnN0YW5jZXMgb2Ygb3RoZXIgY2xhc3NlcyBmcm9tIGV4dGVuZGluZyBab2RBbnkuIHRoaXMgY2F1c2VzIGlzc3VlcyB3aXRoIGNhdGNoYWxsIGluIFpvZE9iamVjdC5cbiAgICAgICAgdGhpcy5fYW55ID0gdHJ1ZTtcbiAgICB9XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIHJldHVybiBPSyhpbnB1dC5kYXRhKTtcbiAgICB9XG59XG5ab2RBbnkuY3JlYXRlID0gKHBhcmFtcykgPT4ge1xuICAgIHJldHVybiBuZXcgWm9kQW55KHtcbiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RBbnksXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG5jbGFzcyBab2RVbmtub3duIGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIC8vIHJlcXVpcmVkXG4gICAgICAgIHRoaXMuX3Vua25vd24gPSB0cnVlO1xuICAgIH1cbiAgICBfcGFyc2UoaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIE9LKGlucHV0LmRhdGEpO1xuICAgIH1cbn1cblpvZFVua25vd24uY3JlYXRlID0gKHBhcmFtcykgPT4ge1xuICAgIHJldHVybiBuZXcgWm9kVW5rbm93bih7XG4gICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kVW5rbm93bixcbiAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpLFxuICAgIH0pO1xufTtcbmNsYXNzIFpvZE5ldmVyIGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIGNvbnN0IGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0KTtcbiAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF90eXBlLFxuICAgICAgICAgICAgZXhwZWN0ZWQ6IFpvZFBhcnNlZFR5cGUubmV2ZXIsXG4gICAgICAgICAgICByZWNlaXZlZDogY3R4LnBhcnNlZFR5cGUsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICB9XG59XG5ab2ROZXZlci5jcmVhdGUgPSAocGFyYW1zKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBab2ROZXZlcih7XG4gICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kTmV2ZXIsXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG5jbGFzcyBab2RWb2lkIGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZFR5cGUgPSB0aGlzLl9nZXRUeXBlKGlucHV0KTtcbiAgICAgICAgaWYgKHBhcnNlZFR5cGUgIT09IFpvZFBhcnNlZFR5cGUudW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjb25zdCBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCk7XG4gICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF90eXBlLFxuICAgICAgICAgICAgICAgIGV4cGVjdGVkOiBab2RQYXJzZWRUeXBlLnZvaWQsXG4gICAgICAgICAgICAgICAgcmVjZWl2ZWQ6IGN0eC5wYXJzZWRUeXBlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gT0soaW5wdXQuZGF0YSk7XG4gICAgfVxufVxuWm9kVm9pZC5jcmVhdGUgPSAocGFyYW1zKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBab2RWb2lkKHtcbiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RWb2lkLFxuICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgfSk7XG59O1xuY2xhc3MgWm9kQXJyYXkgZXh0ZW5kcyBab2RUeXBlIHtcbiAgICBfcGFyc2UoaW5wdXQpIHtcbiAgICAgICAgY29uc3QgeyBjdHgsIHN0YXR1cyB9ID0gdGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGlucHV0KTtcbiAgICAgICAgY29uc3QgZGVmID0gdGhpcy5fZGVmO1xuICAgICAgICBpZiAoY3R4LnBhcnNlZFR5cGUgIT09IFpvZFBhcnNlZFR5cGUuYXJyYXkpIHtcbiAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3R5cGUsXG4gICAgICAgICAgICAgICAgZXhwZWN0ZWQ6IFpvZFBhcnNlZFR5cGUuYXJyYXksXG4gICAgICAgICAgICAgICAgcmVjZWl2ZWQ6IGN0eC5wYXJzZWRUeXBlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGVmLmV4YWN0TGVuZ3RoICE9PSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCB0b29CaWcgPSBjdHguZGF0YS5sZW5ndGggPiBkZWYuZXhhY3RMZW5ndGgudmFsdWU7XG4gICAgICAgICAgICBjb25zdCB0b29TbWFsbCA9IGN0eC5kYXRhLmxlbmd0aCA8IGRlZi5leGFjdExlbmd0aC52YWx1ZTtcbiAgICAgICAgICAgIGlmICh0b29CaWcgfHwgdG9vU21hbGwpIHtcbiAgICAgICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgY29kZTogdG9vQmlnID8gWm9kSXNzdWVDb2RlLnRvb19iaWcgOiBab2RJc3N1ZUNvZGUudG9vX3NtYWxsLFxuICAgICAgICAgICAgICAgICAgICBtaW5pbXVtOiAodG9vU21hbGwgPyBkZWYuZXhhY3RMZW5ndGgudmFsdWUgOiB1bmRlZmluZWQpLFxuICAgICAgICAgICAgICAgICAgICBtYXhpbXVtOiAodG9vQmlnID8gZGVmLmV4YWN0TGVuZ3RoLnZhbHVlIDogdW5kZWZpbmVkKSxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJhcnJheVwiLFxuICAgICAgICAgICAgICAgICAgICBpbmNsdXNpdmU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGV4YWN0OiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBkZWYuZXhhY3RMZW5ndGgubWVzc2FnZSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZGVmLm1pbkxlbmd0aCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKGN0eC5kYXRhLmxlbmd0aCA8IGRlZi5taW5MZW5ndGgudmFsdWUpIHtcbiAgICAgICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLnRvb19zbWFsbCxcbiAgICAgICAgICAgICAgICAgICAgbWluaW11bTogZGVmLm1pbkxlbmd0aC52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJhcnJheVwiLFxuICAgICAgICAgICAgICAgICAgICBpbmNsdXNpdmU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGV4YWN0OiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogZGVmLm1pbkxlbmd0aC5tZXNzYWdlLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChkZWYubWF4TGVuZ3RoICE9PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAoY3R4LmRhdGEubGVuZ3RoID4gZGVmLm1heExlbmd0aC52YWx1ZSkge1xuICAgICAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUudG9vX2JpZyxcbiAgICAgICAgICAgICAgICAgICAgbWF4aW11bTogZGVmLm1heExlbmd0aC52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJhcnJheVwiLFxuICAgICAgICAgICAgICAgICAgICBpbmNsdXNpdmU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGV4YWN0OiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogZGVmLm1heExlbmd0aC5tZXNzYWdlLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChjdHguY29tbW9uLmFzeW5jKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwoWy4uLmN0eC5kYXRhXS5tYXAoKGl0ZW0sIGkpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZGVmLnR5cGUuX3BhcnNlQXN5bmMobmV3IFBhcnNlSW5wdXRMYXp5UGF0aChjdHgsIGl0ZW0sIGN0eC5wYXRoLCBpKSk7XG4gICAgICAgICAgICB9KSkudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFBhcnNlU3RhdHVzLm1lcmdlQXJyYXkoc3RhdHVzLCByZXN1bHQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gWy4uLmN0eC5kYXRhXS5tYXAoKGl0ZW0sIGkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBkZWYudHlwZS5fcGFyc2VTeW5jKG5ldyBQYXJzZUlucHV0TGF6eVBhdGgoY3R4LCBpdGVtLCBjdHgucGF0aCwgaSkpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIFBhcnNlU3RhdHVzLm1lcmdlQXJyYXkoc3RhdHVzLCByZXN1bHQpO1xuICAgIH1cbiAgICBnZXQgZWxlbWVudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi50eXBlO1xuICAgIH1cbiAgICBtaW4obWluTGVuZ3RoLCBtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiBuZXcgWm9kQXJyYXkoe1xuICAgICAgICAgICAgLi4udGhpcy5fZGVmLFxuICAgICAgICAgICAgbWluTGVuZ3RoOiB7IHZhbHVlOiBtaW5MZW5ndGgsIG1lc3NhZ2U6IGVycm9yVXRpbC50b1N0cmluZyhtZXNzYWdlKSB9LFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgbWF4KG1heExlbmd0aCwgbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gbmV3IFpvZEFycmF5KHtcbiAgICAgICAgICAgIC4uLnRoaXMuX2RlZixcbiAgICAgICAgICAgIG1heExlbmd0aDogeyB2YWx1ZTogbWF4TGVuZ3RoLCBtZXNzYWdlOiBlcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSkgfSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGxlbmd0aChsZW4sIG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBab2RBcnJheSh7XG4gICAgICAgICAgICAuLi50aGlzLl9kZWYsXG4gICAgICAgICAgICBleGFjdExlbmd0aDogeyB2YWx1ZTogbGVuLCBtZXNzYWdlOiBlcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSkgfSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG5vbmVtcHR5KG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWluKDEsIG1lc3NhZ2UpO1xuICAgIH1cbn1cblpvZEFycmF5LmNyZWF0ZSA9IChzY2hlbWEsIHBhcmFtcykgPT4ge1xuICAgIHJldHVybiBuZXcgWm9kQXJyYXkoe1xuICAgICAgICB0eXBlOiBzY2hlbWEsXG4gICAgICAgIG1pbkxlbmd0aDogbnVsbCxcbiAgICAgICAgbWF4TGVuZ3RoOiBudWxsLFxuICAgICAgICBleGFjdExlbmd0aDogbnVsbCxcbiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RBcnJheSxcbiAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpLFxuICAgIH0pO1xufTtcbmZ1bmN0aW9uIGRlZXBQYXJ0aWFsaWZ5KHNjaGVtYSkge1xuICAgIGlmIChzY2hlbWEgaW5zdGFuY2VvZiBab2RPYmplY3QpIHtcbiAgICAgICAgY29uc3QgbmV3U2hhcGUgPSB7fTtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gc2NoZW1hLnNoYXBlKSB7XG4gICAgICAgICAgICBjb25zdCBmaWVsZFNjaGVtYSA9IHNjaGVtYS5zaGFwZVtrZXldO1xuICAgICAgICAgICAgbmV3U2hhcGVba2V5XSA9IFpvZE9wdGlvbmFsLmNyZWF0ZShkZWVwUGFydGlhbGlmeShmaWVsZFNjaGVtYSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgWm9kT2JqZWN0KHtcbiAgICAgICAgICAgIC4uLnNjaGVtYS5fZGVmLFxuICAgICAgICAgICAgc2hhcGU6ICgpID0+IG5ld1NoYXBlLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZWxzZSBpZiAoc2NoZW1hIGluc3RhbmNlb2YgWm9kQXJyYXkpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBab2RBcnJheSh7XG4gICAgICAgICAgICAuLi5zY2hlbWEuX2RlZixcbiAgICAgICAgICAgIHR5cGU6IGRlZXBQYXJ0aWFsaWZ5KHNjaGVtYS5lbGVtZW50KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHNjaGVtYSBpbnN0YW5jZW9mIFpvZE9wdGlvbmFsKSB7XG4gICAgICAgIHJldHVybiBab2RPcHRpb25hbC5jcmVhdGUoZGVlcFBhcnRpYWxpZnkoc2NoZW1hLnVud3JhcCgpKSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHNjaGVtYSBpbnN0YW5jZW9mIFpvZE51bGxhYmxlKSB7XG4gICAgICAgIHJldHVybiBab2ROdWxsYWJsZS5jcmVhdGUoZGVlcFBhcnRpYWxpZnkoc2NoZW1hLnVud3JhcCgpKSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHNjaGVtYSBpbnN0YW5jZW9mIFpvZFR1cGxlKSB7XG4gICAgICAgIHJldHVybiBab2RUdXBsZS5jcmVhdGUoc2NoZW1hLml0ZW1zLm1hcCgoaXRlbSkgPT4gZGVlcFBhcnRpYWxpZnkoaXRlbSkpKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiBzY2hlbWE7XG4gICAgfVxufVxuY2xhc3MgWm9kT2JqZWN0IGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIHRoaXMuX2NhY2hlZCA9IG51bGw7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAZGVwcmVjYXRlZCBJbiBtb3N0IGNhc2VzLCB0aGlzIGlzIG5vIGxvbmdlciBuZWVkZWQgLSB1bmtub3duIHByb3BlcnRpZXMgYXJlIG5vdyBzaWxlbnRseSBzdHJpcHBlZC5cbiAgICAgICAgICogSWYgeW91IHdhbnQgdG8gcGFzcyB0aHJvdWdoIHVua25vd24gcHJvcGVydGllcywgdXNlIGAucGFzc3Rocm91Z2goKWAgaW5zdGVhZC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMubm9uc3RyaWN0ID0gdGhpcy5wYXNzdGhyb3VnaDtcbiAgICAgICAgLy8gZXh0ZW5kPFxuICAgICAgICAvLyAgIEF1Z21lbnRhdGlvbiBleHRlbmRzIFpvZFJhd1NoYXBlLFxuICAgICAgICAvLyAgIE5ld091dHB1dCBleHRlbmRzIHV0aWwuZmxhdHRlbjx7XG4gICAgICAgIC8vICAgICBbayBpbiBrZXlvZiBBdWdtZW50YXRpb24gfCBrZXlvZiBPdXRwdXRdOiBrIGV4dGVuZHMga2V5b2YgQXVnbWVudGF0aW9uXG4gICAgICAgIC8vICAgICAgID8gQXVnbWVudGF0aW9uW2tdW1wiX291dHB1dFwiXVxuICAgICAgICAvLyAgICAgICA6IGsgZXh0ZW5kcyBrZXlvZiBPdXRwdXRcbiAgICAgICAgLy8gICAgICAgPyBPdXRwdXRba11cbiAgICAgICAgLy8gICAgICAgOiBuZXZlcjtcbiAgICAgICAgLy8gICB9PixcbiAgICAgICAgLy8gICBOZXdJbnB1dCBleHRlbmRzIHV0aWwuZmxhdHRlbjx7XG4gICAgICAgIC8vICAgICBbayBpbiBrZXlvZiBBdWdtZW50YXRpb24gfCBrZXlvZiBJbnB1dF06IGsgZXh0ZW5kcyBrZXlvZiBBdWdtZW50YXRpb25cbiAgICAgICAgLy8gICAgICAgPyBBdWdtZW50YXRpb25ba11bXCJfaW5wdXRcIl1cbiAgICAgICAgLy8gICAgICAgOiBrIGV4dGVuZHMga2V5b2YgSW5wdXRcbiAgICAgICAgLy8gICAgICAgPyBJbnB1dFtrXVxuICAgICAgICAvLyAgICAgICA6IG5ldmVyO1xuICAgICAgICAvLyAgIH0+XG4gICAgICAgIC8vID4oXG4gICAgICAgIC8vICAgYXVnbWVudGF0aW9uOiBBdWdtZW50YXRpb25cbiAgICAgICAgLy8gKTogWm9kT2JqZWN0PFxuICAgICAgICAvLyAgIGV4dGVuZFNoYXBlPFQsIEF1Z21lbnRhdGlvbj4sXG4gICAgICAgIC8vICAgVW5rbm93bktleXMsXG4gICAgICAgIC8vICAgQ2F0Y2hhbGwsXG4gICAgICAgIC8vICAgTmV3T3V0cHV0LFxuICAgICAgICAvLyAgIE5ld0lucHV0XG4gICAgICAgIC8vID4ge1xuICAgICAgICAvLyAgIHJldHVybiBuZXcgWm9kT2JqZWN0KHtcbiAgICAgICAgLy8gICAgIC4uLnRoaXMuX2RlZixcbiAgICAgICAgLy8gICAgIHNoYXBlOiAoKSA9PiAoe1xuICAgICAgICAvLyAgICAgICAuLi50aGlzLl9kZWYuc2hhcGUoKSxcbiAgICAgICAgLy8gICAgICAgLi4uYXVnbWVudGF0aW9uLFxuICAgICAgICAvLyAgICAgfSksXG4gICAgICAgIC8vICAgfSkgYXMgYW55O1xuICAgICAgICAvLyB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAZGVwcmVjYXRlZCBVc2UgYC5leHRlbmRgIGluc3RlYWRcbiAgICAgICAgICogICovXG4gICAgICAgIHRoaXMuYXVnbWVudCA9IHRoaXMuZXh0ZW5kO1xuICAgIH1cbiAgICBfZ2V0Q2FjaGVkKCkge1xuICAgICAgICBpZiAodGhpcy5fY2FjaGVkICE9PSBudWxsKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NhY2hlZDtcbiAgICAgICAgY29uc3Qgc2hhcGUgPSB0aGlzLl9kZWYuc2hhcGUoKTtcbiAgICAgICAgY29uc3Qga2V5cyA9IHV0aWwub2JqZWN0S2V5cyhzaGFwZSk7XG4gICAgICAgIHJldHVybiAodGhpcy5fY2FjaGVkID0geyBzaGFwZSwga2V5cyB9KTtcbiAgICB9XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZFR5cGUgPSB0aGlzLl9nZXRUeXBlKGlucHV0KTtcbiAgICAgICAgaWYgKHBhcnNlZFR5cGUgIT09IFpvZFBhcnNlZFR5cGUub2JqZWN0KSB7XG4gICAgICAgICAgICBjb25zdCBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCk7XG4gICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF90eXBlLFxuICAgICAgICAgICAgICAgIGV4cGVjdGVkOiBab2RQYXJzZWRUeXBlLm9iamVjdCxcbiAgICAgICAgICAgICAgICByZWNlaXZlZDogY3R4LnBhcnNlZFR5cGUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBJTlZBTElEO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHsgc3RhdHVzLCBjdHggfSA9IHRoaXMuX3Byb2Nlc3NJbnB1dFBhcmFtcyhpbnB1dCk7XG4gICAgICAgIGNvbnN0IHsgc2hhcGUsIGtleXM6IHNoYXBlS2V5cyB9ID0gdGhpcy5fZ2V0Q2FjaGVkKCk7XG4gICAgICAgIGNvbnN0IGV4dHJhS2V5cyA9IFtdO1xuICAgICAgICBpZiAoISh0aGlzLl9kZWYuY2F0Y2hhbGwgaW5zdGFuY2VvZiBab2ROZXZlciAmJlxuICAgICAgICAgICAgdGhpcy5fZGVmLnVua25vd25LZXlzID09PSBcInN0cmlwXCIpKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBjdHguZGF0YSkge1xuICAgICAgICAgICAgICAgIGlmICghc2hhcGVLZXlzLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAgZXh0cmFLZXlzLnB1c2goa2V5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcGFpcnMgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2Ygc2hhcGVLZXlzKSB7XG4gICAgICAgICAgICBjb25zdCBrZXlWYWxpZGF0b3IgPSBzaGFwZVtrZXldO1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBjdHguZGF0YVtrZXldO1xuICAgICAgICAgICAgcGFpcnMucHVzaCh7XG4gICAgICAgICAgICAgICAga2V5OiB7IHN0YXR1czogXCJ2YWxpZFwiLCB2YWx1ZToga2V5IH0sXG4gICAgICAgICAgICAgICAgdmFsdWU6IGtleVZhbGlkYXRvci5fcGFyc2UobmV3IFBhcnNlSW5wdXRMYXp5UGF0aChjdHgsIHZhbHVlLCBjdHgucGF0aCwga2V5KSksXG4gICAgICAgICAgICAgICAgYWx3YXlzU2V0OiBrZXkgaW4gY3R4LmRhdGEsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fZGVmLmNhdGNoYWxsIGluc3RhbmNlb2YgWm9kTmV2ZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IHVua25vd25LZXlzID0gdGhpcy5fZGVmLnVua25vd25LZXlzO1xuICAgICAgICAgICAgaWYgKHVua25vd25LZXlzID09PSBcInBhc3N0aHJvdWdoXCIpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBleHRyYUtleXMpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFpcnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBrZXk6IHsgc3RhdHVzOiBcInZhbGlkXCIsIHZhbHVlOiBrZXkgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiB7IHN0YXR1czogXCJ2YWxpZFwiLCB2YWx1ZTogY3R4LmRhdGFba2V5XSB9LFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh1bmtub3duS2V5cyA9PT0gXCJzdHJpY3RcIikge1xuICAgICAgICAgICAgICAgIGlmIChleHRyYUtleXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS51bnJlY29nbml6ZWRfa2V5cyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleXM6IGV4dHJhS2V5cyxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHVua25vd25LZXlzID09PSBcInN0cmlwXCIpIDtcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW50ZXJuYWwgWm9kT2JqZWN0IGVycm9yOiBpbnZhbGlkIHVua25vd25LZXlzIHZhbHVlLmApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gcnVuIGNhdGNoYWxsIHZhbGlkYXRpb25cbiAgICAgICAgICAgIGNvbnN0IGNhdGNoYWxsID0gdGhpcy5fZGVmLmNhdGNoYWxsO1xuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgZXh0cmFLZXlzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBjdHguZGF0YVtrZXldO1xuICAgICAgICAgICAgICAgIHBhaXJzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBrZXk6IHsgc3RhdHVzOiBcInZhbGlkXCIsIHZhbHVlOiBrZXkgfSxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGNhdGNoYWxsLl9wYXJzZShuZXcgUGFyc2VJbnB1dExhenlQYXRoKGN0eCwgdmFsdWUsIGN0eC5wYXRoLCBrZXkpIC8vLCBjdHguY2hpbGQoa2V5KSwgdmFsdWUsIGdldFBhcnNlZFR5cGUodmFsdWUpXG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgIGFsd2F5c1NldDoga2V5IGluIGN0eC5kYXRhLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChjdHguY29tbW9uLmFzeW5jKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKClcbiAgICAgICAgICAgICAgICAudGhlbihhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3luY1BhaXJzID0gW107XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBwYWlyIG9mIHBhaXJzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGtleSA9IGF3YWl0IHBhaXIua2V5O1xuICAgICAgICAgICAgICAgICAgICBzeW5jUGFpcnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogYXdhaXQgcGFpci52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsd2F5c1NldDogcGFpci5hbHdheXNTZXQsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gc3luY1BhaXJzO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAudGhlbigoc3luY1BhaXJzKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFBhcnNlU3RhdHVzLm1lcmdlT2JqZWN0U3luYyhzdGF0dXMsIHN5bmNQYWlycyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBQYXJzZVN0YXR1cy5tZXJnZU9iamVjdFN5bmMoc3RhdHVzLCBwYWlycyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0IHNoYXBlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVmLnNoYXBlKCk7XG4gICAgfVxuICAgIHN0cmljdChtZXNzYWdlKSB7XG4gICAgICAgIGVycm9yVXRpbC5lcnJUb09iajtcbiAgICAgICAgcmV0dXJuIG5ldyBab2RPYmplY3Qoe1xuICAgICAgICAgICAgLi4udGhpcy5fZGVmLFxuICAgICAgICAgICAgdW5rbm93bktleXM6IFwic3RyaWN0XCIsXG4gICAgICAgICAgICAuLi4obWVzc2FnZSAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgICAgIGVycm9yTWFwOiAoaXNzdWUsIGN0eCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9hLCBfYiwgX2MsIF9kO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVmYXVsdEVycm9yID0gKF9jID0gKF9iID0gKF9hID0gdGhpcy5fZGVmKS5lcnJvck1hcCkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmNhbGwoX2EsIGlzc3VlLCBjdHgpLm1lc3NhZ2UpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IGN0eC5kZWZhdWx0RXJyb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNzdWUuY29kZSA9PT0gXCJ1bnJlY29nbml6ZWRfa2V5c1wiKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IChfZCA9IGVycm9yVXRpbC5lcnJUb09iaihtZXNzYWdlKS5tZXNzYWdlKSAhPT0gbnVsbCAmJiBfZCAhPT0gdm9pZCAwID8gX2QgOiBkZWZhdWx0RXJyb3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogZGVmYXVsdEVycm9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgOiB7fSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBzdHJpcCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBab2RPYmplY3Qoe1xuICAgICAgICAgICAgLi4udGhpcy5fZGVmLFxuICAgICAgICAgICAgdW5rbm93bktleXM6IFwic3RyaXBcIixcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHBhc3N0aHJvdWdoKCkge1xuICAgICAgICByZXR1cm4gbmV3IFpvZE9iamVjdCh7XG4gICAgICAgICAgICAuLi50aGlzLl9kZWYsXG4gICAgICAgICAgICB1bmtub3duS2V5czogXCJwYXNzdGhyb3VnaFwiLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLy8gY29uc3QgQXVnbWVudEZhY3RvcnkgPVxuICAgIC8vICAgPERlZiBleHRlbmRzIFpvZE9iamVjdERlZj4oZGVmOiBEZWYpID0+XG4gICAgLy8gICA8QXVnbWVudGF0aW9uIGV4dGVuZHMgWm9kUmF3U2hhcGU+KFxuICAgIC8vICAgICBhdWdtZW50YXRpb246IEF1Z21lbnRhdGlvblxuICAgIC8vICAgKTogWm9kT2JqZWN0PFxuICAgIC8vICAgICBleHRlbmRTaGFwZTxSZXR1cm5UeXBlPERlZltcInNoYXBlXCJdPiwgQXVnbWVudGF0aW9uPixcbiAgICAvLyAgICAgRGVmW1widW5rbm93bktleXNcIl0sXG4gICAgLy8gICAgIERlZltcImNhdGNoYWxsXCJdXG4gICAgLy8gICA+ID0+IHtcbiAgICAvLyAgICAgcmV0dXJuIG5ldyBab2RPYmplY3Qoe1xuICAgIC8vICAgICAgIC4uLmRlZixcbiAgICAvLyAgICAgICBzaGFwZTogKCkgPT4gKHtcbiAgICAvLyAgICAgICAgIC4uLmRlZi5zaGFwZSgpLFxuICAgIC8vICAgICAgICAgLi4uYXVnbWVudGF0aW9uLFxuICAgIC8vICAgICAgIH0pLFxuICAgIC8vICAgICB9KSBhcyBhbnk7XG4gICAgLy8gICB9O1xuICAgIGV4dGVuZChhdWdtZW50YXRpb24pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBab2RPYmplY3Qoe1xuICAgICAgICAgICAgLi4udGhpcy5fZGVmLFxuICAgICAgICAgICAgc2hhcGU6ICgpID0+ICh7XG4gICAgICAgICAgICAgICAgLi4udGhpcy5fZGVmLnNoYXBlKCksXG4gICAgICAgICAgICAgICAgLi4uYXVnbWVudGF0aW9uLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBQcmlvciB0byB6b2RAMS4wLjEyIHRoZXJlIHdhcyBhIGJ1ZyBpbiB0aGVcbiAgICAgKiBpbmZlcnJlZCB0eXBlIG9mIG1lcmdlZCBvYmplY3RzLiBQbGVhc2VcbiAgICAgKiB1cGdyYWRlIGlmIHlvdSBhcmUgZXhwZXJpZW5jaW5nIGlzc3Vlcy5cbiAgICAgKi9cbiAgICBtZXJnZShtZXJnaW5nKSB7XG4gICAgICAgIGNvbnN0IG1lcmdlZCA9IG5ldyBab2RPYmplY3Qoe1xuICAgICAgICAgICAgdW5rbm93bktleXM6IG1lcmdpbmcuX2RlZi51bmtub3duS2V5cyxcbiAgICAgICAgICAgIGNhdGNoYWxsOiBtZXJnaW5nLl9kZWYuY2F0Y2hhbGwsXG4gICAgICAgICAgICBzaGFwZTogKCkgPT4gKHtcbiAgICAgICAgICAgICAgICAuLi50aGlzLl9kZWYuc2hhcGUoKSxcbiAgICAgICAgICAgICAgICAuLi5tZXJnaW5nLl9kZWYuc2hhcGUoKSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RPYmplY3QsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gbWVyZ2VkO1xuICAgIH1cbiAgICAvLyBtZXJnZTxcbiAgICAvLyAgIEluY29taW5nIGV4dGVuZHMgQW55Wm9kT2JqZWN0LFxuICAgIC8vICAgQXVnbWVudGF0aW9uIGV4dGVuZHMgSW5jb21pbmdbXCJzaGFwZVwiXSxcbiAgICAvLyAgIE5ld091dHB1dCBleHRlbmRzIHtcbiAgICAvLyAgICAgW2sgaW4ga2V5b2YgQXVnbWVudGF0aW9uIHwga2V5b2YgT3V0cHV0XTogayBleHRlbmRzIGtleW9mIEF1Z21lbnRhdGlvblxuICAgIC8vICAgICAgID8gQXVnbWVudGF0aW9uW2tdW1wiX291dHB1dFwiXVxuICAgIC8vICAgICAgIDogayBleHRlbmRzIGtleW9mIE91dHB1dFxuICAgIC8vICAgICAgID8gT3V0cHV0W2tdXG4gICAgLy8gICAgICAgOiBuZXZlcjtcbiAgICAvLyAgIH0sXG4gICAgLy8gICBOZXdJbnB1dCBleHRlbmRzIHtcbiAgICAvLyAgICAgW2sgaW4ga2V5b2YgQXVnbWVudGF0aW9uIHwga2V5b2YgSW5wdXRdOiBrIGV4dGVuZHMga2V5b2YgQXVnbWVudGF0aW9uXG4gICAgLy8gICAgICAgPyBBdWdtZW50YXRpb25ba11bXCJfaW5wdXRcIl1cbiAgICAvLyAgICAgICA6IGsgZXh0ZW5kcyBrZXlvZiBJbnB1dFxuICAgIC8vICAgICAgID8gSW5wdXRba11cbiAgICAvLyAgICAgICA6IG5ldmVyO1xuICAgIC8vICAgfVxuICAgIC8vID4oXG4gICAgLy8gICBtZXJnaW5nOiBJbmNvbWluZ1xuICAgIC8vICk6IFpvZE9iamVjdDxcbiAgICAvLyAgIGV4dGVuZFNoYXBlPFQsIFJldHVyblR5cGU8SW5jb21pbmdbXCJfZGVmXCJdW1wic2hhcGVcIl0+PixcbiAgICAvLyAgIEluY29taW5nW1wiX2RlZlwiXVtcInVua25vd25LZXlzXCJdLFxuICAgIC8vICAgSW5jb21pbmdbXCJfZGVmXCJdW1wiY2F0Y2hhbGxcIl0sXG4gICAgLy8gICBOZXdPdXRwdXQsXG4gICAgLy8gICBOZXdJbnB1dFxuICAgIC8vID4ge1xuICAgIC8vICAgY29uc3QgbWVyZ2VkOiBhbnkgPSBuZXcgWm9kT2JqZWN0KHtcbiAgICAvLyAgICAgdW5rbm93bktleXM6IG1lcmdpbmcuX2RlZi51bmtub3duS2V5cyxcbiAgICAvLyAgICAgY2F0Y2hhbGw6IG1lcmdpbmcuX2RlZi5jYXRjaGFsbCxcbiAgICAvLyAgICAgc2hhcGU6ICgpID0+XG4gICAgLy8gICAgICAgb2JqZWN0VXRpbC5tZXJnZVNoYXBlcyh0aGlzLl9kZWYuc2hhcGUoKSwgbWVyZ2luZy5fZGVmLnNoYXBlKCkpLFxuICAgIC8vICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZE9iamVjdCxcbiAgICAvLyAgIH0pIGFzIGFueTtcbiAgICAvLyAgIHJldHVybiBtZXJnZWQ7XG4gICAgLy8gfVxuICAgIHNldEtleShrZXksIHNjaGVtYSkge1xuICAgICAgICByZXR1cm4gdGhpcy5hdWdtZW50KHsgW2tleV06IHNjaGVtYSB9KTtcbiAgICB9XG4gICAgLy8gbWVyZ2U8SW5jb21pbmcgZXh0ZW5kcyBBbnlab2RPYmplY3Q+KFxuICAgIC8vICAgbWVyZ2luZzogSW5jb21pbmdcbiAgICAvLyApOiAvL1pvZE9iamVjdDxUICYgSW5jb21pbmdbXCJfc2hhcGVcIl0sIFVua25vd25LZXlzLCBDYXRjaGFsbD4gPSAobWVyZ2luZykgPT4ge1xuICAgIC8vIFpvZE9iamVjdDxcbiAgICAvLyAgIGV4dGVuZFNoYXBlPFQsIFJldHVyblR5cGU8SW5jb21pbmdbXCJfZGVmXCJdW1wic2hhcGVcIl0+PixcbiAgICAvLyAgIEluY29taW5nW1wiX2RlZlwiXVtcInVua25vd25LZXlzXCJdLFxuICAgIC8vICAgSW5jb21pbmdbXCJfZGVmXCJdW1wiY2F0Y2hhbGxcIl1cbiAgICAvLyA+IHtcbiAgICAvLyAgIC8vIGNvbnN0IG1lcmdlZFNoYXBlID0gb2JqZWN0VXRpbC5tZXJnZVNoYXBlcyhcbiAgICAvLyAgIC8vICAgdGhpcy5fZGVmLnNoYXBlKCksXG4gICAgLy8gICAvLyAgIG1lcmdpbmcuX2RlZi5zaGFwZSgpXG4gICAgLy8gICAvLyApO1xuICAgIC8vICAgY29uc3QgbWVyZ2VkOiBhbnkgPSBuZXcgWm9kT2JqZWN0KHtcbiAgICAvLyAgICAgdW5rbm93bktleXM6IG1lcmdpbmcuX2RlZi51bmtub3duS2V5cyxcbiAgICAvLyAgICAgY2F0Y2hhbGw6IG1lcmdpbmcuX2RlZi5jYXRjaGFsbCxcbiAgICAvLyAgICAgc2hhcGU6ICgpID0+XG4gICAgLy8gICAgICAgb2JqZWN0VXRpbC5tZXJnZVNoYXBlcyh0aGlzLl9kZWYuc2hhcGUoKSwgbWVyZ2luZy5fZGVmLnNoYXBlKCkpLFxuICAgIC8vICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZE9iamVjdCxcbiAgICAvLyAgIH0pIGFzIGFueTtcbiAgICAvLyAgIHJldHVybiBtZXJnZWQ7XG4gICAgLy8gfVxuICAgIGNhdGNoYWxsKGluZGV4KSB7XG4gICAgICAgIHJldHVybiBuZXcgWm9kT2JqZWN0KHtcbiAgICAgICAgICAgIC4uLnRoaXMuX2RlZixcbiAgICAgICAgICAgIGNhdGNoYWxsOiBpbmRleCxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHBpY2sobWFzaykge1xuICAgICAgICBjb25zdCBzaGFwZSA9IHt9O1xuICAgICAgICB1dGlsLm9iamVjdEtleXMobWFzaykuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgICAgICBpZiAobWFza1trZXldICYmIHRoaXMuc2hhcGVba2V5XSkge1xuICAgICAgICAgICAgICAgIHNoYXBlW2tleV0gPSB0aGlzLnNoYXBlW2tleV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gbmV3IFpvZE9iamVjdCh7XG4gICAgICAgICAgICAuLi50aGlzLl9kZWYsXG4gICAgICAgICAgICBzaGFwZTogKCkgPT4gc2hhcGUsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBvbWl0KG1hc2spIHtcbiAgICAgICAgY29uc3Qgc2hhcGUgPSB7fTtcbiAgICAgICAgdXRpbC5vYmplY3RLZXlzKHRoaXMuc2hhcGUpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICAgICAgaWYgKCFtYXNrW2tleV0pIHtcbiAgICAgICAgICAgICAgICBzaGFwZVtrZXldID0gdGhpcy5zaGFwZVtrZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIG5ldyBab2RPYmplY3Qoe1xuICAgICAgICAgICAgLi4udGhpcy5fZGVmLFxuICAgICAgICAgICAgc2hhcGU6ICgpID0+IHNoYXBlLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBkZWVwUGFydGlhbCgpIHtcbiAgICAgICAgcmV0dXJuIGRlZXBQYXJ0aWFsaWZ5KHRoaXMpO1xuICAgIH1cbiAgICBwYXJ0aWFsKG1hc2spIHtcbiAgICAgICAgY29uc3QgbmV3U2hhcGUgPSB7fTtcbiAgICAgICAgdXRpbC5vYmplY3RLZXlzKHRoaXMuc2hhcGUpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZmllbGRTY2hlbWEgPSB0aGlzLnNoYXBlW2tleV07XG4gICAgICAgICAgICBpZiAobWFzayAmJiAhbWFza1trZXldKSB7XG4gICAgICAgICAgICAgICAgbmV3U2hhcGVba2V5XSA9IGZpZWxkU2NoZW1hO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbmV3U2hhcGVba2V5XSA9IGZpZWxkU2NoZW1hLm9wdGlvbmFsKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gbmV3IFpvZE9iamVjdCh7XG4gICAgICAgICAgICAuLi50aGlzLl9kZWYsXG4gICAgICAgICAgICBzaGFwZTogKCkgPT4gbmV3U2hhcGUsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXF1aXJlZChtYXNrKSB7XG4gICAgICAgIGNvbnN0IG5ld1NoYXBlID0ge307XG4gICAgICAgIHV0aWwub2JqZWN0S2V5cyh0aGlzLnNoYXBlKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgICAgIGlmIChtYXNrICYmICFtYXNrW2tleV0pIHtcbiAgICAgICAgICAgICAgICBuZXdTaGFwZVtrZXldID0gdGhpcy5zaGFwZVtrZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZmllbGRTY2hlbWEgPSB0aGlzLnNoYXBlW2tleV07XG4gICAgICAgICAgICAgICAgbGV0IG5ld0ZpZWxkID0gZmllbGRTY2hlbWE7XG4gICAgICAgICAgICAgICAgd2hpbGUgKG5ld0ZpZWxkIGluc3RhbmNlb2YgWm9kT3B0aW9uYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgbmV3RmllbGQgPSBuZXdGaWVsZC5fZGVmLmlubmVyVHlwZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbmV3U2hhcGVba2V5XSA9IG5ld0ZpZWxkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIG5ldyBab2RPYmplY3Qoe1xuICAgICAgICAgICAgLi4udGhpcy5fZGVmLFxuICAgICAgICAgICAgc2hhcGU6ICgpID0+IG5ld1NoYXBlLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAga2V5b2YoKSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVab2RFbnVtKHV0aWwub2JqZWN0S2V5cyh0aGlzLnNoYXBlKSk7XG4gICAgfVxufVxuWm9kT2JqZWN0LmNyZWF0ZSA9IChzaGFwZSwgcGFyYW1zKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBab2RPYmplY3Qoe1xuICAgICAgICBzaGFwZTogKCkgPT4gc2hhcGUsXG4gICAgICAgIHVua25vd25LZXlzOiBcInN0cmlwXCIsXG4gICAgICAgIGNhdGNoYWxsOiBab2ROZXZlci5jcmVhdGUoKSxcbiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RPYmplY3QsXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG5ab2RPYmplY3Quc3RyaWN0Q3JlYXRlID0gKHNoYXBlLCBwYXJhbXMpID0+IHtcbiAgICByZXR1cm4gbmV3IFpvZE9iamVjdCh7XG4gICAgICAgIHNoYXBlOiAoKSA9PiBzaGFwZSxcbiAgICAgICAgdW5rbm93bktleXM6IFwic3RyaWN0XCIsXG4gICAgICAgIGNhdGNoYWxsOiBab2ROZXZlci5jcmVhdGUoKSxcbiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RPYmplY3QsXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG5ab2RPYmplY3QubGF6eWNyZWF0ZSA9IChzaGFwZSwgcGFyYW1zKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBab2RPYmplY3Qoe1xuICAgICAgICBzaGFwZSxcbiAgICAgICAgdW5rbm93bktleXM6IFwic3RyaXBcIixcbiAgICAgICAgY2F0Y2hhbGw6IFpvZE5ldmVyLmNyZWF0ZSgpLFxuICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZE9iamVjdCxcbiAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpLFxuICAgIH0pO1xufTtcbmNsYXNzIFpvZFVuaW9uIGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIGNvbnN0IHsgY3R4IH0gPSB0aGlzLl9wcm9jZXNzSW5wdXRQYXJhbXMoaW5wdXQpO1xuICAgICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5fZGVmLm9wdGlvbnM7XG4gICAgICAgIGZ1bmN0aW9uIGhhbmRsZVJlc3VsdHMocmVzdWx0cykge1xuICAgICAgICAgICAgLy8gcmV0dXJuIGZpcnN0IGlzc3VlLWZyZWUgdmFsaWRhdGlvbiBpZiBpdCBleGlzdHNcbiAgICAgICAgICAgIGZvciAoY29uc3QgcmVzdWx0IG9mIHJlc3VsdHMpIHtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0LnJlc3VsdC5zdGF0dXMgPT09IFwidmFsaWRcIikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0LnJlc3VsdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHJlc3VsdCBvZiByZXN1bHRzKSB7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5yZXN1bHQuc3RhdHVzID09PSBcImRpcnR5XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gYWRkIGlzc3VlcyBmcm9tIGRpcnR5IG9wdGlvblxuICAgICAgICAgICAgICAgICAgICBjdHguY29tbW9uLmlzc3Vlcy5wdXNoKC4uLnJlc3VsdC5jdHguY29tbW9uLmlzc3Vlcyk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQucmVzdWx0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIHJldHVybiBpbnZhbGlkXG4gICAgICAgICAgICBjb25zdCB1bmlvbkVycm9ycyA9IHJlc3VsdHMubWFwKChyZXN1bHQpID0+IG5ldyBab2RFcnJvcihyZXN1bHQuY3R4LmNvbW1vbi5pc3N1ZXMpKTtcbiAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3VuaW9uLFxuICAgICAgICAgICAgICAgIHVuaW9uRXJyb3JzLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY3R4LmNvbW1vbi5hc3luYykge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKG9wdGlvbnMubWFwKGFzeW5jIChvcHRpb24pID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjaGlsZEN0eCA9IHtcbiAgICAgICAgICAgICAgICAgICAgLi4uY3R4LFxuICAgICAgICAgICAgICAgICAgICBjb21tb246IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLmN0eC5jb21tb24sXG4gICAgICAgICAgICAgICAgICAgICAgICBpc3N1ZXM6IFtdLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBwYXJlbnQ6IG51bGwsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQ6IGF3YWl0IG9wdGlvbi5fcGFyc2VBc3luYyh7XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiBjdHguZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGg6IGN0eC5wYXRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50OiBjaGlsZEN0eCxcbiAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgIGN0eDogY2hpbGRDdHgsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0pKS50aGVuKGhhbmRsZVJlc3VsdHMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbGV0IGRpcnR5ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgY29uc3QgaXNzdWVzID0gW107XG4gICAgICAgICAgICBmb3IgKGNvbnN0IG9wdGlvbiBvZiBvcHRpb25zKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2hpbGRDdHggPSB7XG4gICAgICAgICAgICAgICAgICAgIC4uLmN0eCxcbiAgICAgICAgICAgICAgICAgICAgY29tbW9uOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5jdHguY29tbW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgaXNzdWVzOiBbXSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50OiBudWxsLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gb3B0aW9uLl9wYXJzZVN5bmMoe1xuICAgICAgICAgICAgICAgICAgICBkYXRhOiBjdHguZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgcGF0aDogY3R4LnBhdGgsXG4gICAgICAgICAgICAgICAgICAgIHBhcmVudDogY2hpbGRDdHgsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5zdGF0dXMgPT09IFwidmFsaWRcIikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChyZXN1bHQuc3RhdHVzID09PSBcImRpcnR5XCIgJiYgIWRpcnR5KSB7XG4gICAgICAgICAgICAgICAgICAgIGRpcnR5ID0geyByZXN1bHQsIGN0eDogY2hpbGRDdHggfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGNoaWxkQ3R4LmNvbW1vbi5pc3N1ZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGlzc3Vlcy5wdXNoKGNoaWxkQ3R4LmNvbW1vbi5pc3N1ZXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChkaXJ0eSkge1xuICAgICAgICAgICAgICAgIGN0eC5jb21tb24uaXNzdWVzLnB1c2goLi4uZGlydHkuY3R4LmNvbW1vbi5pc3N1ZXMpO1xuICAgICAgICAgICAgICAgIHJldHVybiBkaXJ0eS5yZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB1bmlvbkVycm9ycyA9IGlzc3Vlcy5tYXAoKGlzc3VlcykgPT4gbmV3IFpvZEVycm9yKGlzc3VlcykpO1xuICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfdW5pb24sXG4gICAgICAgICAgICAgICAgdW5pb25FcnJvcnMsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBJTlZBTElEO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldCBvcHRpb25zKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVmLm9wdGlvbnM7XG4gICAgfVxufVxuWm9kVW5pb24uY3JlYXRlID0gKHR5cGVzLCBwYXJhbXMpID0+IHtcbiAgICByZXR1cm4gbmV3IFpvZFVuaW9uKHtcbiAgICAgICAgb3B0aW9uczogdHlwZXMsXG4gICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kVW5pb24sXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbi8vLy8vLy8vLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy8vLy8vLy8vXG4vLy8vLy8vLy8vICAgICAgWm9kRGlzY3JpbWluYXRlZFVuaW9uICAgICAgLy8vLy8vLy8vL1xuLy8vLy8vLy8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLy8vLy8vLy9cbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuY29uc3QgZ2V0RGlzY3JpbWluYXRvciA9ICh0eXBlKSA9PiB7XG4gICAgaWYgKHR5cGUgaW5zdGFuY2VvZiBab2RMYXp5KSB7XG4gICAgICAgIHJldHVybiBnZXREaXNjcmltaW5hdG9yKHR5cGUuc2NoZW1hKTtcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZSBpbnN0YW5jZW9mIFpvZEVmZmVjdHMpIHtcbiAgICAgICAgcmV0dXJuIGdldERpc2NyaW1pbmF0b3IodHlwZS5pbm5lclR5cGUoKSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGUgaW5zdGFuY2VvZiBab2RMaXRlcmFsKSB7XG4gICAgICAgIHJldHVybiBbdHlwZS52YWx1ZV07XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGUgaW5zdGFuY2VvZiBab2RFbnVtKSB7XG4gICAgICAgIHJldHVybiB0eXBlLm9wdGlvbnM7XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGUgaW5zdGFuY2VvZiBab2ROYXRpdmVFbnVtKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBiYW4vYmFuXG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyh0eXBlLmVudW0pO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlIGluc3RhbmNlb2YgWm9kRGVmYXVsdCkge1xuICAgICAgICByZXR1cm4gZ2V0RGlzY3JpbWluYXRvcih0eXBlLl9kZWYuaW5uZXJUeXBlKTtcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZSBpbnN0YW5jZW9mIFpvZFVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gW3VuZGVmaW5lZF07XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGUgaW5zdGFuY2VvZiBab2ROdWxsKSB7XG4gICAgICAgIHJldHVybiBbbnVsbF07XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG59O1xuY2xhc3MgWm9kRGlzY3JpbWluYXRlZFVuaW9uIGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIGNvbnN0IHsgY3R4IH0gPSB0aGlzLl9wcm9jZXNzSW5wdXRQYXJhbXMoaW5wdXQpO1xuICAgICAgICBpZiAoY3R4LnBhcnNlZFR5cGUgIT09IFpvZFBhcnNlZFR5cGUub2JqZWN0KSB7XG4gICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF90eXBlLFxuICAgICAgICAgICAgICAgIGV4cGVjdGVkOiBab2RQYXJzZWRUeXBlLm9iamVjdCxcbiAgICAgICAgICAgICAgICByZWNlaXZlZDogY3R4LnBhcnNlZFR5cGUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBJTlZBTElEO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRpc2NyaW1pbmF0b3IgPSB0aGlzLmRpc2NyaW1pbmF0b3I7XG4gICAgICAgIGNvbnN0IGRpc2NyaW1pbmF0b3JWYWx1ZSA9IGN0eC5kYXRhW2Rpc2NyaW1pbmF0b3JdO1xuICAgICAgICBjb25zdCBvcHRpb24gPSB0aGlzLm9wdGlvbnNNYXAuZ2V0KGRpc2NyaW1pbmF0b3JWYWx1ZSk7XG4gICAgICAgIGlmICghb3B0aW9uKSB7XG4gICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF91bmlvbl9kaXNjcmltaW5hdG9yLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IEFycmF5LmZyb20odGhpcy5vcHRpb25zTWFwLmtleXMoKSksXG4gICAgICAgICAgICAgICAgcGF0aDogW2Rpc2NyaW1pbmF0b3JdLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY3R4LmNvbW1vbi5hc3luYykge1xuICAgICAgICAgICAgcmV0dXJuIG9wdGlvbi5fcGFyc2VBc3luYyh7XG4gICAgICAgICAgICAgICAgZGF0YTogY3R4LmRhdGEsXG4gICAgICAgICAgICAgICAgcGF0aDogY3R4LnBhdGgsXG4gICAgICAgICAgICAgICAgcGFyZW50OiBjdHgsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBvcHRpb24uX3BhcnNlU3luYyh7XG4gICAgICAgICAgICAgICAgZGF0YTogY3R4LmRhdGEsXG4gICAgICAgICAgICAgICAgcGF0aDogY3R4LnBhdGgsXG4gICAgICAgICAgICAgICAgcGFyZW50OiBjdHgsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXQgZGlzY3JpbWluYXRvcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi5kaXNjcmltaW5hdG9yO1xuICAgIH1cbiAgICBnZXQgb3B0aW9ucygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi5vcHRpb25zO1xuICAgIH1cbiAgICBnZXQgb3B0aW9uc01hcCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi5vcHRpb25zTWFwO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgY29uc3RydWN0b3Igb2YgdGhlIGRpc2NyaW1pbmF0ZWQgdW5pb24gc2NoZW1hLiBJdHMgYmVoYXZpb3VyIGlzIHZlcnkgc2ltaWxhciB0byB0aGF0IG9mIHRoZSBub3JtYWwgei51bmlvbigpIGNvbnN0cnVjdG9yLlxuICAgICAqIEhvd2V2ZXIsIGl0IG9ubHkgYWxsb3dzIGEgdW5pb24gb2Ygb2JqZWN0cywgYWxsIG9mIHdoaWNoIG5lZWQgdG8gc2hhcmUgYSBkaXNjcmltaW5hdG9yIHByb3BlcnR5LiBUaGlzIHByb3BlcnR5IG11c3RcbiAgICAgKiBoYXZlIGEgZGlmZmVyZW50IHZhbHVlIGZvciBlYWNoIG9iamVjdCBpbiB0aGUgdW5pb24uXG4gICAgICogQHBhcmFtIGRpc2NyaW1pbmF0b3IgdGhlIG5hbWUgb2YgdGhlIGRpc2NyaW1pbmF0b3IgcHJvcGVydHlcbiAgICAgKiBAcGFyYW0gdHlwZXMgYW4gYXJyYXkgb2Ygb2JqZWN0IHNjaGVtYXNcbiAgICAgKiBAcGFyYW0gcGFyYW1zXG4gICAgICovXG4gICAgc3RhdGljIGNyZWF0ZShkaXNjcmltaW5hdG9yLCBvcHRpb25zLCBwYXJhbXMpIHtcbiAgICAgICAgLy8gR2V0IGFsbCB0aGUgdmFsaWQgZGlzY3JpbWluYXRvciB2YWx1ZXNcbiAgICAgICAgY29uc3Qgb3B0aW9uc01hcCA9IG5ldyBNYXAoKTtcbiAgICAgICAgLy8gdHJ5IHtcbiAgICAgICAgZm9yIChjb25zdCB0eXBlIG9mIG9wdGlvbnMpIHtcbiAgICAgICAgICAgIGNvbnN0IGRpc2NyaW1pbmF0b3JWYWx1ZXMgPSBnZXREaXNjcmltaW5hdG9yKHR5cGUuc2hhcGVbZGlzY3JpbWluYXRvcl0pO1xuICAgICAgICAgICAgaWYgKCFkaXNjcmltaW5hdG9yVmFsdWVzKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBBIGRpc2NyaW1pbmF0b3IgdmFsdWUgZm9yIGtleSBcXGAke2Rpc2NyaW1pbmF0b3J9XFxgIGNvdWxkIG5vdCBiZSBleHRyYWN0ZWQgZnJvbSBhbGwgc2NoZW1hIG9wdGlvbnNgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAoY29uc3QgdmFsdWUgb2YgZGlzY3JpbWluYXRvclZhbHVlcykge1xuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zTWFwLmhhcyh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBEaXNjcmltaW5hdG9yIHByb3BlcnR5ICR7U3RyaW5nKGRpc2NyaW1pbmF0b3IpfSBoYXMgZHVwbGljYXRlIHZhbHVlICR7U3RyaW5nKHZhbHVlKX1gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgb3B0aW9uc01hcC5zZXQodmFsdWUsIHR5cGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgWm9kRGlzY3JpbWluYXRlZFVuaW9uKHtcbiAgICAgICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kRGlzY3JpbWluYXRlZFVuaW9uLFxuICAgICAgICAgICAgZGlzY3JpbWluYXRvcixcbiAgICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgICAgICBvcHRpb25zTWFwLFxuICAgICAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpLFxuICAgICAgICB9KTtcbiAgICB9XG59XG5mdW5jdGlvbiBtZXJnZVZhbHVlcyhhLCBiKSB7XG4gICAgY29uc3QgYVR5cGUgPSBnZXRQYXJzZWRUeXBlKGEpO1xuICAgIGNvbnN0IGJUeXBlID0gZ2V0UGFyc2VkVHlwZShiKTtcbiAgICBpZiAoYSA9PT0gYikge1xuICAgICAgICByZXR1cm4geyB2YWxpZDogdHJ1ZSwgZGF0YTogYSB9O1xuICAgIH1cbiAgICBlbHNlIGlmIChhVHlwZSA9PT0gWm9kUGFyc2VkVHlwZS5vYmplY3QgJiYgYlR5cGUgPT09IFpvZFBhcnNlZFR5cGUub2JqZWN0KSB7XG4gICAgICAgIGNvbnN0IGJLZXlzID0gdXRpbC5vYmplY3RLZXlzKGIpO1xuICAgICAgICBjb25zdCBzaGFyZWRLZXlzID0gdXRpbFxuICAgICAgICAgICAgLm9iamVjdEtleXMoYSlcbiAgICAgICAgICAgIC5maWx0ZXIoKGtleSkgPT4gYktleXMuaW5kZXhPZihrZXkpICE9PSAtMSk7XG4gICAgICAgIGNvbnN0IG5ld09iaiA9IHsgLi4uYSwgLi4uYiB9O1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBzaGFyZWRLZXlzKSB7XG4gICAgICAgICAgICBjb25zdCBzaGFyZWRWYWx1ZSA9IG1lcmdlVmFsdWVzKGFba2V5XSwgYltrZXldKTtcbiAgICAgICAgICAgIGlmICghc2hhcmVkVmFsdWUudmFsaWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyB2YWxpZDogZmFsc2UgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG5ld09ialtrZXldID0gc2hhcmVkVmFsdWUuZGF0YTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyB2YWxpZDogdHJ1ZSwgZGF0YTogbmV3T2JqIH07XG4gICAgfVxuICAgIGVsc2UgaWYgKGFUeXBlID09PSBab2RQYXJzZWRUeXBlLmFycmF5ICYmIGJUeXBlID09PSBab2RQYXJzZWRUeXBlLmFycmF5KSB7XG4gICAgICAgIGlmIChhLmxlbmd0aCAhPT0gYi5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiB7IHZhbGlkOiBmYWxzZSB9O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5ld0FycmF5ID0gW107XG4gICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBhLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAgICAgY29uc3QgaXRlbUEgPSBhW2luZGV4XTtcbiAgICAgICAgICAgIGNvbnN0IGl0ZW1CID0gYltpbmRleF07XG4gICAgICAgICAgICBjb25zdCBzaGFyZWRWYWx1ZSA9IG1lcmdlVmFsdWVzKGl0ZW1BLCBpdGVtQik7XG4gICAgICAgICAgICBpZiAoIXNoYXJlZFZhbHVlLnZhbGlkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgdmFsaWQ6IGZhbHNlIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBuZXdBcnJheS5wdXNoKHNoYXJlZFZhbHVlLmRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IHZhbGlkOiB0cnVlLCBkYXRhOiBuZXdBcnJheSB9O1xuICAgIH1cbiAgICBlbHNlIGlmIChhVHlwZSA9PT0gWm9kUGFyc2VkVHlwZS5kYXRlICYmXG4gICAgICAgIGJUeXBlID09PSBab2RQYXJzZWRUeXBlLmRhdGUgJiZcbiAgICAgICAgK2EgPT09ICtiKSB7XG4gICAgICAgIHJldHVybiB7IHZhbGlkOiB0cnVlLCBkYXRhOiBhIH07XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4geyB2YWxpZDogZmFsc2UgfTtcbiAgICB9XG59XG5jbGFzcyBab2RJbnRlcnNlY3Rpb24gZXh0ZW5kcyBab2RUeXBlIHtcbiAgICBfcGFyc2UoaW5wdXQpIHtcbiAgICAgICAgY29uc3QgeyBzdGF0dXMsIGN0eCB9ID0gdGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGlucHV0KTtcbiAgICAgICAgY29uc3QgaGFuZGxlUGFyc2VkID0gKHBhcnNlZExlZnQsIHBhcnNlZFJpZ2h0KSA9PiB7XG4gICAgICAgICAgICBpZiAoaXNBYm9ydGVkKHBhcnNlZExlZnQpIHx8IGlzQWJvcnRlZChwYXJzZWRSaWdodCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IG1lcmdlZCA9IG1lcmdlVmFsdWVzKHBhcnNlZExlZnQudmFsdWUsIHBhcnNlZFJpZ2h0LnZhbHVlKTtcbiAgICAgICAgICAgIGlmICghbWVyZ2VkLnZhbGlkKSB7XG4gICAgICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX2ludGVyc2VjdGlvbl90eXBlcyxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpc0RpcnR5KHBhcnNlZExlZnQpIHx8IGlzRGlydHkocGFyc2VkUmlnaHQpKSB7XG4gICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4geyBzdGF0dXM6IHN0YXR1cy52YWx1ZSwgdmFsdWU6IG1lcmdlZC5kYXRhIH07XG4gICAgICAgIH07XG4gICAgICAgIGlmIChjdHguY29tbW9uLmFzeW5jKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwoW1xuICAgICAgICAgICAgICAgIHRoaXMuX2RlZi5sZWZ0Ll9wYXJzZUFzeW5jKHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogY3R4LmRhdGEsXG4gICAgICAgICAgICAgICAgICAgIHBhdGg6IGN0eC5wYXRoLFxuICAgICAgICAgICAgICAgICAgICBwYXJlbnQ6IGN0eCxcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICB0aGlzLl9kZWYucmlnaHQuX3BhcnNlQXN5bmMoe1xuICAgICAgICAgICAgICAgICAgICBkYXRhOiBjdHguZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgcGF0aDogY3R4LnBhdGgsXG4gICAgICAgICAgICAgICAgICAgIHBhcmVudDogY3R4LFxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgXSkudGhlbigoW2xlZnQsIHJpZ2h0XSkgPT4gaGFuZGxlUGFyc2VkKGxlZnQsIHJpZ2h0KSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gaGFuZGxlUGFyc2VkKHRoaXMuX2RlZi5sZWZ0Ll9wYXJzZVN5bmMoe1xuICAgICAgICAgICAgICAgIGRhdGE6IGN0eC5kYXRhLFxuICAgICAgICAgICAgICAgIHBhdGg6IGN0eC5wYXRoLFxuICAgICAgICAgICAgICAgIHBhcmVudDogY3R4LFxuICAgICAgICAgICAgfSksIHRoaXMuX2RlZi5yaWdodC5fcGFyc2VTeW5jKHtcbiAgICAgICAgICAgICAgICBkYXRhOiBjdHguZGF0YSxcbiAgICAgICAgICAgICAgICBwYXRoOiBjdHgucGF0aCxcbiAgICAgICAgICAgICAgICBwYXJlbnQ6IGN0eCxcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblpvZEludGVyc2VjdGlvbi5jcmVhdGUgPSAobGVmdCwgcmlnaHQsIHBhcmFtcykgPT4ge1xuICAgIHJldHVybiBuZXcgWm9kSW50ZXJzZWN0aW9uKHtcbiAgICAgICAgbGVmdDogbGVmdCxcbiAgICAgICAgcmlnaHQ6IHJpZ2h0LFxuICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZEludGVyc2VjdGlvbixcbiAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpLFxuICAgIH0pO1xufTtcbmNsYXNzIFpvZFR1cGxlIGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIGNvbnN0IHsgc3RhdHVzLCBjdHggfSA9IHRoaXMuX3Byb2Nlc3NJbnB1dFBhcmFtcyhpbnB1dCk7XG4gICAgICAgIGlmIChjdHgucGFyc2VkVHlwZSAhPT0gWm9kUGFyc2VkVHlwZS5hcnJheSkge1xuICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfdHlwZSxcbiAgICAgICAgICAgICAgICBleHBlY3RlZDogWm9kUGFyc2VkVHlwZS5hcnJheSxcbiAgICAgICAgICAgICAgICByZWNlaXZlZDogY3R4LnBhcnNlZFR5cGUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBJTlZBTElEO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjdHguZGF0YS5sZW5ndGggPCB0aGlzLl9kZWYuaXRlbXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUudG9vX3NtYWxsLFxuICAgICAgICAgICAgICAgIG1pbmltdW06IHRoaXMuX2RlZi5pdGVtcy5sZW5ndGgsXG4gICAgICAgICAgICAgICAgaW5jbHVzaXZlOiB0cnVlLFxuICAgICAgICAgICAgICAgIGV4YWN0OiBmYWxzZSxcbiAgICAgICAgICAgICAgICB0eXBlOiBcImFycmF5XCIsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBJTlZBTElEO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlc3QgPSB0aGlzLl9kZWYucmVzdDtcbiAgICAgICAgaWYgKCFyZXN0ICYmIGN0eC5kYXRhLmxlbmd0aCA+IHRoaXMuX2RlZi5pdGVtcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS50b29fYmlnLFxuICAgICAgICAgICAgICAgIG1heGltdW06IHRoaXMuX2RlZi5pdGVtcy5sZW5ndGgsXG4gICAgICAgICAgICAgICAgaW5jbHVzaXZlOiB0cnVlLFxuICAgICAgICAgICAgICAgIGV4YWN0OiBmYWxzZSxcbiAgICAgICAgICAgICAgICB0eXBlOiBcImFycmF5XCIsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gWy4uLmN0eC5kYXRhXVxuICAgICAgICAgICAgLm1hcCgoaXRlbSwgaXRlbUluZGV4KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzY2hlbWEgPSB0aGlzLl9kZWYuaXRlbXNbaXRlbUluZGV4XSB8fCB0aGlzLl9kZWYucmVzdDtcbiAgICAgICAgICAgIGlmICghc2NoZW1hKVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgcmV0dXJuIHNjaGVtYS5fcGFyc2UobmV3IFBhcnNlSW5wdXRMYXp5UGF0aChjdHgsIGl0ZW0sIGN0eC5wYXRoLCBpdGVtSW5kZXgpKTtcbiAgICAgICAgfSlcbiAgICAgICAgICAgIC5maWx0ZXIoKHgpID0+ICEheCk7IC8vIGZpbHRlciBudWxsc1xuICAgICAgICBpZiAoY3R4LmNvbW1vbi5hc3luYykge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKGl0ZW1zKS50aGVuKChyZXN1bHRzKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFBhcnNlU3RhdHVzLm1lcmdlQXJyYXkoc3RhdHVzLCByZXN1bHRzKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFBhcnNlU3RhdHVzLm1lcmdlQXJyYXkoc3RhdHVzLCBpdGVtcyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0IGl0ZW1zKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVmLml0ZW1zO1xuICAgIH1cbiAgICByZXN0KHJlc3QpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBab2RUdXBsZSh7XG4gICAgICAgICAgICAuLi50aGlzLl9kZWYsXG4gICAgICAgICAgICByZXN0LFxuICAgICAgICB9KTtcbiAgICB9XG59XG5ab2RUdXBsZS5jcmVhdGUgPSAoc2NoZW1hcywgcGFyYW1zKSA9PiB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHNjaGVtYXMpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIllvdSBtdXN0IHBhc3MgYW4gYXJyYXkgb2Ygc2NoZW1hcyB0byB6LnR1cGxlKFsgLi4uIF0pXCIpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFpvZFR1cGxlKHtcbiAgICAgICAgaXRlbXM6IHNjaGVtYXMsXG4gICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kVHVwbGUsXG4gICAgICAgIHJlc3Q6IG51bGwsXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG5jbGFzcyBab2RSZWNvcmQgZXh0ZW5kcyBab2RUeXBlIHtcbiAgICBnZXQga2V5U2NoZW1hKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVmLmtleVR5cGU7XG4gICAgfVxuICAgIGdldCB2YWx1ZVNjaGVtYSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi52YWx1ZVR5cGU7XG4gICAgfVxuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBjb25zdCB7IHN0YXR1cywgY3R4IH0gPSB0aGlzLl9wcm9jZXNzSW5wdXRQYXJhbXMoaW5wdXQpO1xuICAgICAgICBpZiAoY3R4LnBhcnNlZFR5cGUgIT09IFpvZFBhcnNlZFR5cGUub2JqZWN0KSB7XG4gICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF90eXBlLFxuICAgICAgICAgICAgICAgIGV4cGVjdGVkOiBab2RQYXJzZWRUeXBlLm9iamVjdCxcbiAgICAgICAgICAgICAgICByZWNlaXZlZDogY3R4LnBhcnNlZFR5cGUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBJTlZBTElEO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBhaXJzID0gW107XG4gICAgICAgIGNvbnN0IGtleVR5cGUgPSB0aGlzLl9kZWYua2V5VHlwZTtcbiAgICAgICAgY29uc3QgdmFsdWVUeXBlID0gdGhpcy5fZGVmLnZhbHVlVHlwZTtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gY3R4LmRhdGEpIHtcbiAgICAgICAgICAgIHBhaXJzLnB1c2goe1xuICAgICAgICAgICAgICAgIGtleToga2V5VHlwZS5fcGFyc2UobmV3IFBhcnNlSW5wdXRMYXp5UGF0aChjdHgsIGtleSwgY3R4LnBhdGgsIGtleSkpLFxuICAgICAgICAgICAgICAgIHZhbHVlOiB2YWx1ZVR5cGUuX3BhcnNlKG5ldyBQYXJzZUlucHV0TGF6eVBhdGgoY3R4LCBjdHguZGF0YVtrZXldLCBjdHgucGF0aCwga2V5KSksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY3R4LmNvbW1vbi5hc3luYykge1xuICAgICAgICAgICAgcmV0dXJuIFBhcnNlU3RhdHVzLm1lcmdlT2JqZWN0QXN5bmMoc3RhdHVzLCBwYWlycyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUGFyc2VTdGF0dXMubWVyZ2VPYmplY3RTeW5jKHN0YXR1cywgcGFpcnMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldCBlbGVtZW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVmLnZhbHVlVHlwZTtcbiAgICB9XG4gICAgc3RhdGljIGNyZWF0ZShmaXJzdCwgc2Vjb25kLCB0aGlyZCkge1xuICAgICAgICBpZiAoc2Vjb25kIGluc3RhbmNlb2YgWm9kVHlwZSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBab2RSZWNvcmQoe1xuICAgICAgICAgICAgICAgIGtleVR5cGU6IGZpcnN0LFxuICAgICAgICAgICAgICAgIHZhbHVlVHlwZTogc2Vjb25kLFxuICAgICAgICAgICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kUmVjb3JkLFxuICAgICAgICAgICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXModGhpcmQpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBab2RSZWNvcmQoe1xuICAgICAgICAgICAga2V5VHlwZTogWm9kU3RyaW5nLmNyZWF0ZSgpLFxuICAgICAgICAgICAgdmFsdWVUeXBlOiBmaXJzdCxcbiAgICAgICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kUmVjb3JkLFxuICAgICAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhzZWNvbmQpLFxuICAgICAgICB9KTtcbiAgICB9XG59XG5jbGFzcyBab2RNYXAgZXh0ZW5kcyBab2RUeXBlIHtcbiAgICBnZXQga2V5U2NoZW1hKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVmLmtleVR5cGU7XG4gICAgfVxuICAgIGdldCB2YWx1ZVNjaGVtYSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi52YWx1ZVR5cGU7XG4gICAgfVxuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBjb25zdCB7IHN0YXR1cywgY3R4IH0gPSB0aGlzLl9wcm9jZXNzSW5wdXRQYXJhbXMoaW5wdXQpO1xuICAgICAgICBpZiAoY3R4LnBhcnNlZFR5cGUgIT09IFpvZFBhcnNlZFR5cGUubWFwKSB7XG4gICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF90eXBlLFxuICAgICAgICAgICAgICAgIGV4cGVjdGVkOiBab2RQYXJzZWRUeXBlLm1hcCxcbiAgICAgICAgICAgICAgICByZWNlaXZlZDogY3R4LnBhcnNlZFR5cGUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBJTlZBTElEO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGtleVR5cGUgPSB0aGlzLl9kZWYua2V5VHlwZTtcbiAgICAgICAgY29uc3QgdmFsdWVUeXBlID0gdGhpcy5fZGVmLnZhbHVlVHlwZTtcbiAgICAgICAgY29uc3QgcGFpcnMgPSBbLi4uY3R4LmRhdGEuZW50cmllcygpXS5tYXAoKFtrZXksIHZhbHVlXSwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAga2V5OiBrZXlUeXBlLl9wYXJzZShuZXcgUGFyc2VJbnB1dExhenlQYXRoKGN0eCwga2V5LCBjdHgucGF0aCwgW2luZGV4LCBcImtleVwiXSkpLFxuICAgICAgICAgICAgICAgIHZhbHVlOiB2YWx1ZVR5cGUuX3BhcnNlKG5ldyBQYXJzZUlucHV0TGF6eVBhdGgoY3R4LCB2YWx1ZSwgY3R4LnBhdGgsIFtpbmRleCwgXCJ2YWx1ZVwiXSkpLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChjdHguY29tbW9uLmFzeW5jKSB7XG4gICAgICAgICAgICBjb25zdCBmaW5hbE1hcCA9IG5ldyBNYXAoKTtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKS50aGVuKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHBhaXIgb2YgcGFpcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qga2V5ID0gYXdhaXQgcGFpci5rZXk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gYXdhaXQgcGFpci52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGtleS5zdGF0dXMgPT09IFwiYWJvcnRlZFwiIHx8IHZhbHVlLnN0YXR1cyA9PT0gXCJhYm9ydGVkXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChrZXkuc3RhdHVzID09PSBcImRpcnR5XCIgfHwgdmFsdWUuc3RhdHVzID09PSBcImRpcnR5XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGZpbmFsTWFwLnNldChrZXkudmFsdWUsIHZhbHVlLnZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgc3RhdHVzOiBzdGF0dXMudmFsdWUsIHZhbHVlOiBmaW5hbE1hcCB9O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBmaW5hbE1hcCA9IG5ldyBNYXAoKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcGFpciBvZiBwYWlycykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGtleSA9IHBhaXIua2V5O1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gcGFpci52YWx1ZTtcbiAgICAgICAgICAgICAgICBpZiAoa2V5LnN0YXR1cyA9PT0gXCJhYm9ydGVkXCIgfHwgdmFsdWUuc3RhdHVzID09PSBcImFib3J0ZWRcIikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGtleS5zdGF0dXMgPT09IFwiZGlydHlcIiB8fCB2YWx1ZS5zdGF0dXMgPT09IFwiZGlydHlcIikge1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZmluYWxNYXAuc2V0KGtleS52YWx1ZSwgdmFsdWUudmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHsgc3RhdHVzOiBzdGF0dXMudmFsdWUsIHZhbHVlOiBmaW5hbE1hcCB9O1xuICAgICAgICB9XG4gICAgfVxufVxuWm9kTWFwLmNyZWF0ZSA9IChrZXlUeXBlLCB2YWx1ZVR5cGUsIHBhcmFtcykgPT4ge1xuICAgIHJldHVybiBuZXcgWm9kTWFwKHtcbiAgICAgICAgdmFsdWVUeXBlLFxuICAgICAgICBrZXlUeXBlLFxuICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZE1hcCxcbiAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpLFxuICAgIH0pO1xufTtcbmNsYXNzIFpvZFNldCBleHRlbmRzIFpvZFR5cGUge1xuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBjb25zdCB7IHN0YXR1cywgY3R4IH0gPSB0aGlzLl9wcm9jZXNzSW5wdXRQYXJhbXMoaW5wdXQpO1xuICAgICAgICBpZiAoY3R4LnBhcnNlZFR5cGUgIT09IFpvZFBhcnNlZFR5cGUuc2V0KSB7XG4gICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF90eXBlLFxuICAgICAgICAgICAgICAgIGV4cGVjdGVkOiBab2RQYXJzZWRUeXBlLnNldCxcbiAgICAgICAgICAgICAgICByZWNlaXZlZDogY3R4LnBhcnNlZFR5cGUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBJTlZBTElEO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRlZiA9IHRoaXMuX2RlZjtcbiAgICAgICAgaWYgKGRlZi5taW5TaXplICE9PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAoY3R4LmRhdGEuc2l6ZSA8IGRlZi5taW5TaXplLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS50b29fc21hbGwsXG4gICAgICAgICAgICAgICAgICAgIG1pbmltdW06IGRlZi5taW5TaXplLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBcInNldFwiLFxuICAgICAgICAgICAgICAgICAgICBpbmNsdXNpdmU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGV4YWN0OiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogZGVmLm1pblNpemUubWVzc2FnZSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZGVmLm1heFNpemUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGlmIChjdHguZGF0YS5zaXplID4gZGVmLm1heFNpemUudmFsdWUpIHtcbiAgICAgICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLnRvb19iaWcsXG4gICAgICAgICAgICAgICAgICAgIG1heGltdW06IGRlZi5tYXhTaXplLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBcInNldFwiLFxuICAgICAgICAgICAgICAgICAgICBpbmNsdXNpdmU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGV4YWN0OiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogZGVmLm1heFNpemUubWVzc2FnZSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCB2YWx1ZVR5cGUgPSB0aGlzLl9kZWYudmFsdWVUeXBlO1xuICAgICAgICBmdW5jdGlvbiBmaW5hbGl6ZVNldChlbGVtZW50cykge1xuICAgICAgICAgICAgY29uc3QgcGFyc2VkU2V0ID0gbmV3IFNldCgpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIGVsZW1lbnRzKSB7XG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuc3RhdHVzID09PSBcImFib3J0ZWRcIilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7XG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuc3RhdHVzID09PSBcImRpcnR5XCIpXG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIHBhcnNlZFNldC5hZGQoZWxlbWVudC52YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4geyBzdGF0dXM6IHN0YXR1cy52YWx1ZSwgdmFsdWU6IHBhcnNlZFNldCB9O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGVsZW1lbnRzID0gWy4uLmN0eC5kYXRhLnZhbHVlcygpXS5tYXAoKGl0ZW0sIGkpID0+IHZhbHVlVHlwZS5fcGFyc2UobmV3IFBhcnNlSW5wdXRMYXp5UGF0aChjdHgsIGl0ZW0sIGN0eC5wYXRoLCBpKSkpO1xuICAgICAgICBpZiAoY3R4LmNvbW1vbi5hc3luYykge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKGVsZW1lbnRzKS50aGVuKChlbGVtZW50cykgPT4gZmluYWxpemVTZXQoZWxlbWVudHMpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBmaW5hbGl6ZVNldChlbGVtZW50cyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbWluKG1pblNpemUsIG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBab2RTZXQoe1xuICAgICAgICAgICAgLi4udGhpcy5fZGVmLFxuICAgICAgICAgICAgbWluU2l6ZTogeyB2YWx1ZTogbWluU2l6ZSwgbWVzc2FnZTogZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpIH0sXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBtYXgobWF4U2l6ZSwgbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gbmV3IFpvZFNldCh7XG4gICAgICAgICAgICAuLi50aGlzLl9kZWYsXG4gICAgICAgICAgICBtYXhTaXplOiB7IHZhbHVlOiBtYXhTaXplLCBtZXNzYWdlOiBlcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSkgfSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHNpemUoc2l6ZSwgbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5taW4oc2l6ZSwgbWVzc2FnZSkubWF4KHNpemUsIG1lc3NhZ2UpO1xuICAgIH1cbiAgICBub25lbXB0eShtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1pbigxLCBtZXNzYWdlKTtcbiAgICB9XG59XG5ab2RTZXQuY3JlYXRlID0gKHZhbHVlVHlwZSwgcGFyYW1zKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBab2RTZXQoe1xuICAgICAgICB2YWx1ZVR5cGUsXG4gICAgICAgIG1pblNpemU6IG51bGwsXG4gICAgICAgIG1heFNpemU6IG51bGwsXG4gICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kU2V0LFxuICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgfSk7XG59O1xuY2xhc3MgWm9kRnVuY3Rpb24gZXh0ZW5kcyBab2RUeXBlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICAgICAgdGhpcy52YWxpZGF0ZSA9IHRoaXMuaW1wbGVtZW50O1xuICAgIH1cbiAgICBfcGFyc2UoaW5wdXQpIHtcbiAgICAgICAgY29uc3QgeyBjdHggfSA9IHRoaXMuX3Byb2Nlc3NJbnB1dFBhcmFtcyhpbnB1dCk7XG4gICAgICAgIGlmIChjdHgucGFyc2VkVHlwZSAhPT0gWm9kUGFyc2VkVHlwZS5mdW5jdGlvbikge1xuICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfdHlwZSxcbiAgICAgICAgICAgICAgICBleHBlY3RlZDogWm9kUGFyc2VkVHlwZS5mdW5jdGlvbixcbiAgICAgICAgICAgICAgICByZWNlaXZlZDogY3R4LnBhcnNlZFR5cGUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBJTlZBTElEO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIG1ha2VBcmdzSXNzdWUoYXJncywgZXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBtYWtlSXNzdWUoe1xuICAgICAgICAgICAgICAgIGRhdGE6IGFyZ3MsXG4gICAgICAgICAgICAgICAgcGF0aDogY3R4LnBhdGgsXG4gICAgICAgICAgICAgICAgZXJyb3JNYXBzOiBbXG4gICAgICAgICAgICAgICAgICAgIGN0eC5jb21tb24uY29udGV4dHVhbEVycm9yTWFwLFxuICAgICAgICAgICAgICAgICAgICBjdHguc2NoZW1hRXJyb3JNYXAsXG4gICAgICAgICAgICAgICAgICAgIGdldEVycm9yTWFwKCksXG4gICAgICAgICAgICAgICAgICAgIGVycm9yTWFwLFxuICAgICAgICAgICAgICAgIF0uZmlsdGVyKCh4KSA9PiAhIXgpLFxuICAgICAgICAgICAgICAgIGlzc3VlRGF0YToge1xuICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF9hcmd1bWVudHMsXG4gICAgICAgICAgICAgICAgICAgIGFyZ3VtZW50c0Vycm9yOiBlcnJvcixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gbWFrZVJldHVybnNJc3N1ZShyZXR1cm5zLCBlcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIG1ha2VJc3N1ZSh7XG4gICAgICAgICAgICAgICAgZGF0YTogcmV0dXJucyxcbiAgICAgICAgICAgICAgICBwYXRoOiBjdHgucGF0aCxcbiAgICAgICAgICAgICAgICBlcnJvck1hcHM6IFtcbiAgICAgICAgICAgICAgICAgICAgY3R4LmNvbW1vbi5jb250ZXh0dWFsRXJyb3JNYXAsXG4gICAgICAgICAgICAgICAgICAgIGN0eC5zY2hlbWFFcnJvck1hcCxcbiAgICAgICAgICAgICAgICAgICAgZ2V0RXJyb3JNYXAoKSxcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JNYXAsXG4gICAgICAgICAgICAgICAgXS5maWx0ZXIoKHgpID0+ICEheCksXG4gICAgICAgICAgICAgICAgaXNzdWVEYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3JldHVybl90eXBlLFxuICAgICAgICAgICAgICAgICAgICByZXR1cm5UeXBlRXJyb3I6IGVycm9yLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwYXJhbXMgPSB7IGVycm9yTWFwOiBjdHguY29tbW9uLmNvbnRleHR1YWxFcnJvck1hcCB9O1xuICAgICAgICBjb25zdCBmbiA9IGN0eC5kYXRhO1xuICAgICAgICBpZiAodGhpcy5fZGVmLnJldHVybnMgaW5zdGFuY2VvZiBab2RQcm9taXNlKSB7XG4gICAgICAgICAgICAvLyBXb3VsZCBsb3ZlIGEgd2F5IHRvIGF2b2lkIGRpc2FibGluZyB0aGlzIHJ1bGUsIGJ1dCB3ZSBuZWVkXG4gICAgICAgICAgICAvLyBhbiBhbGlhcyAodXNpbmcgYW4gYXJyb3cgZnVuY3Rpb24gd2FzIHdoYXQgY2F1c2VkIDI2NTEpLlxuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby10aGlzLWFsaWFzXG4gICAgICAgICAgICBjb25zdCBtZSA9IHRoaXM7XG4gICAgICAgICAgICByZXR1cm4gT0soYXN5bmMgZnVuY3Rpb24gKC4uLmFyZ3MpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlcnJvciA9IG5ldyBab2RFcnJvcihbXSk7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFyc2VkQXJncyA9IGF3YWl0IG1lLl9kZWYuYXJnc1xuICAgICAgICAgICAgICAgICAgICAucGFyc2VBc3luYyhhcmdzLCBwYXJhbXMpXG4gICAgICAgICAgICAgICAgICAgIC5jYXRjaCgoZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBlcnJvci5hZGRJc3N1ZShtYWtlQXJnc0lzc3VlKGFyZ3MsIGUpKTtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgUmVmbGVjdC5hcHBseShmbiwgdGhpcywgcGFyc2VkQXJncyk7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFyc2VkUmV0dXJucyA9IGF3YWl0IG1lLl9kZWYucmV0dXJucy5fZGVmLnR5cGVcbiAgICAgICAgICAgICAgICAgICAgLnBhcnNlQXN5bmMocmVzdWx0LCBwYXJhbXMpXG4gICAgICAgICAgICAgICAgICAgIC5jYXRjaCgoZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBlcnJvci5hZGRJc3N1ZShtYWtlUmV0dXJuc0lzc3VlKHJlc3VsdCwgZSkpO1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2VkUmV0dXJucztcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gV291bGQgbG92ZSBhIHdheSB0byBhdm9pZCBkaXNhYmxpbmcgdGhpcyBydWxlLCBidXQgd2UgbmVlZFxuICAgICAgICAgICAgLy8gYW4gYWxpYXMgKHVzaW5nIGFuIGFycm93IGZ1bmN0aW9uIHdhcyB3aGF0IGNhdXNlZCAyNjUxKS5cbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdGhpcy1hbGlhc1xuICAgICAgICAgICAgY29uc3QgbWUgPSB0aGlzO1xuICAgICAgICAgICAgcmV0dXJuIE9LKGZ1bmN0aW9uICguLi5hcmdzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFyc2VkQXJncyA9IG1lLl9kZWYuYXJncy5zYWZlUGFyc2UoYXJncywgcGFyYW1zKTtcbiAgICAgICAgICAgICAgICBpZiAoIXBhcnNlZEFyZ3Muc3VjY2Vzcykge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWm9kRXJyb3IoW21ha2VBcmdzSXNzdWUoYXJncywgcGFyc2VkQXJncy5lcnJvcildKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gUmVmbGVjdC5hcHBseShmbiwgdGhpcywgcGFyc2VkQXJncy5kYXRhKTtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJzZWRSZXR1cm5zID0gbWUuX2RlZi5yZXR1cm5zLnNhZmVQYXJzZShyZXN1bHQsIHBhcmFtcyk7XG4gICAgICAgICAgICAgICAgaWYgKCFwYXJzZWRSZXR1cm5zLnN1Y2Nlc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFpvZEVycm9yKFttYWtlUmV0dXJuc0lzc3VlKHJlc3VsdCwgcGFyc2VkUmV0dXJucy5lcnJvcildKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlZFJldHVybnMuZGF0YTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHBhcmFtZXRlcnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWYuYXJncztcbiAgICB9XG4gICAgcmV0dXJuVHlwZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi5yZXR1cm5zO1xuICAgIH1cbiAgICBhcmdzKC4uLml0ZW1zKSB7XG4gICAgICAgIHJldHVybiBuZXcgWm9kRnVuY3Rpb24oe1xuICAgICAgICAgICAgLi4udGhpcy5fZGVmLFxuICAgICAgICAgICAgYXJnczogWm9kVHVwbGUuY3JlYXRlKGl0ZW1zKS5yZXN0KFpvZFVua25vd24uY3JlYXRlKCkpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJucyhyZXR1cm5UeXBlKSB7XG4gICAgICAgIHJldHVybiBuZXcgWm9kRnVuY3Rpb24oe1xuICAgICAgICAgICAgLi4udGhpcy5fZGVmLFxuICAgICAgICAgICAgcmV0dXJuczogcmV0dXJuVHlwZSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGltcGxlbWVudChmdW5jKSB7XG4gICAgICAgIGNvbnN0IHZhbGlkYXRlZEZ1bmMgPSB0aGlzLnBhcnNlKGZ1bmMpO1xuICAgICAgICByZXR1cm4gdmFsaWRhdGVkRnVuYztcbiAgICB9XG4gICAgc3RyaWN0SW1wbGVtZW50KGZ1bmMpIHtcbiAgICAgICAgY29uc3QgdmFsaWRhdGVkRnVuYyA9IHRoaXMucGFyc2UoZnVuYyk7XG4gICAgICAgIHJldHVybiB2YWxpZGF0ZWRGdW5jO1xuICAgIH1cbiAgICBzdGF0aWMgY3JlYXRlKGFyZ3MsIHJldHVybnMsIHBhcmFtcykge1xuICAgICAgICByZXR1cm4gbmV3IFpvZEZ1bmN0aW9uKHtcbiAgICAgICAgICAgIGFyZ3M6IChhcmdzXG4gICAgICAgICAgICAgICAgPyBhcmdzXG4gICAgICAgICAgICAgICAgOiBab2RUdXBsZS5jcmVhdGUoW10pLnJlc3QoWm9kVW5rbm93bi5jcmVhdGUoKSkpLFxuICAgICAgICAgICAgcmV0dXJuczogcmV0dXJucyB8fCBab2RVbmtub3duLmNyZWF0ZSgpLFxuICAgICAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RGdW5jdGlvbixcbiAgICAgICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICAgICAgfSk7XG4gICAgfVxufVxuY2xhc3MgWm9kTGF6eSBleHRlbmRzIFpvZFR5cGUge1xuICAgIGdldCBzY2hlbWEoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWYuZ2V0dGVyKCk7XG4gICAgfVxuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBjb25zdCB7IGN0eCB9ID0gdGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGlucHV0KTtcbiAgICAgICAgY29uc3QgbGF6eVNjaGVtYSA9IHRoaXMuX2RlZi5nZXR0ZXIoKTtcbiAgICAgICAgcmV0dXJuIGxhenlTY2hlbWEuX3BhcnNlKHsgZGF0YTogY3R4LmRhdGEsIHBhdGg6IGN0eC5wYXRoLCBwYXJlbnQ6IGN0eCB9KTtcbiAgICB9XG59XG5ab2RMYXp5LmNyZWF0ZSA9IChnZXR0ZXIsIHBhcmFtcykgPT4ge1xuICAgIHJldHVybiBuZXcgWm9kTGF6eSh7XG4gICAgICAgIGdldHRlcjogZ2V0dGVyLFxuICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZExhenksXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG5jbGFzcyBab2RMaXRlcmFsIGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIGlmIChpbnB1dC5kYXRhICE9PSB0aGlzLl9kZWYudmFsdWUpIHtcbiAgICAgICAgICAgIGNvbnN0IGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0KTtcbiAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgIHJlY2VpdmVkOiBjdHguZGF0YSxcbiAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF9saXRlcmFsLFxuICAgICAgICAgICAgICAgIGV4cGVjdGVkOiB0aGlzLl9kZWYudmFsdWUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBJTlZBTElEO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IHN0YXR1czogXCJ2YWxpZFwiLCB2YWx1ZTogaW5wdXQuZGF0YSB9O1xuICAgIH1cbiAgICBnZXQgdmFsdWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWYudmFsdWU7XG4gICAgfVxufVxuWm9kTGl0ZXJhbC5jcmVhdGUgPSAodmFsdWUsIHBhcmFtcykgPT4ge1xuICAgIHJldHVybiBuZXcgWm9kTGl0ZXJhbCh7XG4gICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RMaXRlcmFsLFxuICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgfSk7XG59O1xuZnVuY3Rpb24gY3JlYXRlWm9kRW51bSh2YWx1ZXMsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgWm9kRW51bSh7XG4gICAgICAgIHZhbHVlcyxcbiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RFbnVtLFxuICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgfSk7XG59XG5jbGFzcyBab2RFbnVtIGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIGlmICh0eXBlb2YgaW5wdXQuZGF0YSAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgY29uc3QgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQpO1xuICAgICAgICAgICAgY29uc3QgZXhwZWN0ZWRWYWx1ZXMgPSB0aGlzLl9kZWYudmFsdWVzO1xuICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgZXhwZWN0ZWQ6IHV0aWwuam9pblZhbHVlcyhleHBlY3RlZFZhbHVlcyksXG4gICAgICAgICAgICAgICAgcmVjZWl2ZWQ6IGN0eC5wYXJzZWRUeXBlLFxuICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3R5cGUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBJTlZBTElEO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9kZWYudmFsdWVzLmluZGV4T2YoaW5wdXQuZGF0YSkgPT09IC0xKSB7XG4gICAgICAgICAgICBjb25zdCBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCk7XG4gICAgICAgICAgICBjb25zdCBleHBlY3RlZFZhbHVlcyA9IHRoaXMuX2RlZi52YWx1ZXM7XG4gICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICByZWNlaXZlZDogY3R4LmRhdGEsXG4gICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfZW51bV92YWx1ZSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBleHBlY3RlZFZhbHVlcyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIE9LKGlucHV0LmRhdGEpO1xuICAgIH1cbiAgICBnZXQgb3B0aW9ucygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi52YWx1ZXM7XG4gICAgfVxuICAgIGdldCBlbnVtKCkge1xuICAgICAgICBjb25zdCBlbnVtVmFsdWVzID0ge307XG4gICAgICAgIGZvciAoY29uc3QgdmFsIG9mIHRoaXMuX2RlZi52YWx1ZXMpIHtcbiAgICAgICAgICAgIGVudW1WYWx1ZXNbdmFsXSA9IHZhbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZW51bVZhbHVlcztcbiAgICB9XG4gICAgZ2V0IFZhbHVlcygpIHtcbiAgICAgICAgY29uc3QgZW51bVZhbHVlcyA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IHZhbCBvZiB0aGlzLl9kZWYudmFsdWVzKSB7XG4gICAgICAgICAgICBlbnVtVmFsdWVzW3ZhbF0gPSB2YWw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVudW1WYWx1ZXM7XG4gICAgfVxuICAgIGdldCBFbnVtKCkge1xuICAgICAgICBjb25zdCBlbnVtVmFsdWVzID0ge307XG4gICAgICAgIGZvciAoY29uc3QgdmFsIG9mIHRoaXMuX2RlZi52YWx1ZXMpIHtcbiAgICAgICAgICAgIGVudW1WYWx1ZXNbdmFsXSA9IHZhbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZW51bVZhbHVlcztcbiAgICB9XG4gICAgZXh0cmFjdCh2YWx1ZXMpIHtcbiAgICAgICAgcmV0dXJuIFpvZEVudW0uY3JlYXRlKHZhbHVlcyk7XG4gICAgfVxuICAgIGV4Y2x1ZGUodmFsdWVzKSB7XG4gICAgICAgIHJldHVybiBab2RFbnVtLmNyZWF0ZSh0aGlzLm9wdGlvbnMuZmlsdGVyKChvcHQpID0+ICF2YWx1ZXMuaW5jbHVkZXMob3B0KSkpO1xuICAgIH1cbn1cblpvZEVudW0uY3JlYXRlID0gY3JlYXRlWm9kRW51bTtcbmNsYXNzIFpvZE5hdGl2ZUVudW0gZXh0ZW5kcyBab2RUeXBlIHtcbiAgICBfcGFyc2UoaW5wdXQpIHtcbiAgICAgICAgY29uc3QgbmF0aXZlRW51bVZhbHVlcyA9IHV0aWwuZ2V0VmFsaWRFbnVtVmFsdWVzKHRoaXMuX2RlZi52YWx1ZXMpO1xuICAgICAgICBjb25zdCBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCk7XG4gICAgICAgIGlmIChjdHgucGFyc2VkVHlwZSAhPT0gWm9kUGFyc2VkVHlwZS5zdHJpbmcgJiZcbiAgICAgICAgICAgIGN0eC5wYXJzZWRUeXBlICE9PSBab2RQYXJzZWRUeXBlLm51bWJlcikge1xuICAgICAgICAgICAgY29uc3QgZXhwZWN0ZWRWYWx1ZXMgPSB1dGlsLm9iamVjdFZhbHVlcyhuYXRpdmVFbnVtVmFsdWVzKTtcbiAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgIGV4cGVjdGVkOiB1dGlsLmpvaW5WYWx1ZXMoZXhwZWN0ZWRWYWx1ZXMpLFxuICAgICAgICAgICAgICAgIHJlY2VpdmVkOiBjdHgucGFyc2VkVHlwZSxcbiAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF90eXBlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgfVxuICAgICAgICBpZiAobmF0aXZlRW51bVZhbHVlcy5pbmRleE9mKGlucHV0LmRhdGEpID09PSAtMSkge1xuICAgICAgICAgICAgY29uc3QgZXhwZWN0ZWRWYWx1ZXMgPSB1dGlsLm9iamVjdFZhbHVlcyhuYXRpdmVFbnVtVmFsdWVzKTtcbiAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgIHJlY2VpdmVkOiBjdHguZGF0YSxcbiAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF9lbnVtX3ZhbHVlLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGV4cGVjdGVkVmFsdWVzLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gT0soaW5wdXQuZGF0YSk7XG4gICAgfVxuICAgIGdldCBlbnVtKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVmLnZhbHVlcztcbiAgICB9XG59XG5ab2ROYXRpdmVFbnVtLmNyZWF0ZSA9ICh2YWx1ZXMsIHBhcmFtcykgPT4ge1xuICAgIHJldHVybiBuZXcgWm9kTmF0aXZlRW51bSh7XG4gICAgICAgIHZhbHVlczogdmFsdWVzLFxuICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZE5hdGl2ZUVudW0sXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG5jbGFzcyBab2RQcm9taXNlIGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgdW53cmFwKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVmLnR5cGU7XG4gICAgfVxuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBjb25zdCB7IGN0eCB9ID0gdGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGlucHV0KTtcbiAgICAgICAgaWYgKGN0eC5wYXJzZWRUeXBlICE9PSBab2RQYXJzZWRUeXBlLnByb21pc2UgJiZcbiAgICAgICAgICAgIGN0eC5jb21tb24uYXN5bmMgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF90eXBlLFxuICAgICAgICAgICAgICAgIGV4cGVjdGVkOiBab2RQYXJzZWRUeXBlLnByb21pc2UsXG4gICAgICAgICAgICAgICAgcmVjZWl2ZWQ6IGN0eC5wYXJzZWRUeXBlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwcm9taXNpZmllZCA9IGN0eC5wYXJzZWRUeXBlID09PSBab2RQYXJzZWRUeXBlLnByb21pc2VcbiAgICAgICAgICAgID8gY3R4LmRhdGFcbiAgICAgICAgICAgIDogUHJvbWlzZS5yZXNvbHZlKGN0eC5kYXRhKTtcbiAgICAgICAgcmV0dXJuIE9LKHByb21pc2lmaWVkLnRoZW4oKGRhdGEpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9kZWYudHlwZS5wYXJzZUFzeW5jKGRhdGEsIHtcbiAgICAgICAgICAgICAgICBwYXRoOiBjdHgucGF0aCxcbiAgICAgICAgICAgICAgICBlcnJvck1hcDogY3R4LmNvbW1vbi5jb250ZXh0dWFsRXJyb3JNYXAsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSkpO1xuICAgIH1cbn1cblpvZFByb21pc2UuY3JlYXRlID0gKHNjaGVtYSwgcGFyYW1zKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBab2RQcm9taXNlKHtcbiAgICAgICAgdHlwZTogc2NoZW1hLFxuICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZFByb21pc2UsXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG5jbGFzcyBab2RFZmZlY3RzIGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgaW5uZXJUeXBlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVmLnNjaGVtYTtcbiAgICB9XG4gICAgc291cmNlVHlwZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi5zY2hlbWEuX2RlZi50eXBlTmFtZSA9PT0gWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZEVmZmVjdHNcbiAgICAgICAgICAgID8gdGhpcy5fZGVmLnNjaGVtYS5zb3VyY2VUeXBlKClcbiAgICAgICAgICAgIDogdGhpcy5fZGVmLnNjaGVtYTtcbiAgICB9XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIGNvbnN0IHsgc3RhdHVzLCBjdHggfSA9IHRoaXMuX3Byb2Nlc3NJbnB1dFBhcmFtcyhpbnB1dCk7XG4gICAgICAgIGNvbnN0IGVmZmVjdCA9IHRoaXMuX2RlZi5lZmZlY3QgfHwgbnVsbDtcbiAgICAgICAgY29uc3QgY2hlY2tDdHggPSB7XG4gICAgICAgICAgICBhZGRJc3N1ZTogKGFyZykgPT4ge1xuICAgICAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwgYXJnKTtcbiAgICAgICAgICAgICAgICBpZiAoYXJnLmZhdGFsKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5hYm9ydCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGdldCBwYXRoKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjdHgucGF0aDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICAgIGNoZWNrQ3R4LmFkZElzc3VlID0gY2hlY2tDdHguYWRkSXNzdWUuYmluZChjaGVja0N0eCk7XG4gICAgICAgIGlmIChlZmZlY3QudHlwZSA9PT0gXCJwcmVwcm9jZXNzXCIpIHtcbiAgICAgICAgICAgIGNvbnN0IHByb2Nlc3NlZCA9IGVmZmVjdC50cmFuc2Zvcm0oY3R4LmRhdGEsIGNoZWNrQ3R4KTtcbiAgICAgICAgICAgIGlmIChjdHguY29tbW9uLmlzc3Vlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXM6IFwiZGlydHlcIixcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGN0eC5kYXRhLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY3R4LmNvbW1vbi5hc3luYykge1xuICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUocHJvY2Vzc2VkKS50aGVuKChwcm9jZXNzZWQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi5zY2hlbWEuX3BhcnNlQXN5bmMoe1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogcHJvY2Vzc2VkLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGF0aDogY3R4LnBhdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQ6IGN0eCxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZGVmLnNjaGVtYS5fcGFyc2VTeW5jKHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogcHJvY2Vzc2VkLFxuICAgICAgICAgICAgICAgICAgICBwYXRoOiBjdHgucGF0aCxcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50OiBjdHgsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVmZmVjdC50eXBlID09PSBcInJlZmluZW1lbnRcIikge1xuICAgICAgICAgICAgY29uc3QgZXhlY3V0ZVJlZmluZW1lbnQgPSAoYWNjXG4gICAgICAgICAgICAvLyBlZmZlY3Q6IFJlZmluZW1lbnRFZmZlY3Q8YW55PlxuICAgICAgICAgICAgKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gZWZmZWN0LnJlZmluZW1lbnQoYWNjLCBjaGVja0N0eCk7XG4gICAgICAgICAgICAgICAgaWYgKGN0eC5jb21tb24uYXN5bmMpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShyZXN1bHQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJBc3luYyByZWZpbmVtZW50IGVuY291bnRlcmVkIGR1cmluZyBzeW5jaHJvbm91cyBwYXJzZSBvcGVyYXRpb24uIFVzZSAucGFyc2VBc3luYyBpbnN0ZWFkLlwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpZiAoY3R4LmNvbW1vbi5hc3luYyA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpbm5lciA9IHRoaXMuX2RlZi5zY2hlbWEuX3BhcnNlU3luYyh7XG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IGN0eC5kYXRhLFxuICAgICAgICAgICAgICAgICAgICBwYXRoOiBjdHgucGF0aCxcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50OiBjdHgsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKGlubmVyLnN0YXR1cyA9PT0gXCJhYm9ydGVkXCIpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEO1xuICAgICAgICAgICAgICAgIGlmIChpbm5lci5zdGF0dXMgPT09IFwiZGlydHlcIilcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgLy8gcmV0dXJuIHZhbHVlIGlzIGlnbm9yZWRcbiAgICAgICAgICAgICAgICBleGVjdXRlUmVmaW5lbWVudChpbm5lci52YWx1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgc3RhdHVzOiBzdGF0dXMudmFsdWUsIHZhbHVlOiBpbm5lci52YWx1ZSB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi5zY2hlbWFcbiAgICAgICAgICAgICAgICAgICAgLl9wYXJzZUFzeW5jKHsgZGF0YTogY3R4LmRhdGEsIHBhdGg6IGN0eC5wYXRoLCBwYXJlbnQ6IGN0eCB9KVxuICAgICAgICAgICAgICAgICAgICAudGhlbigoaW5uZXIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlubmVyLnN0YXR1cyA9PT0gXCJhYm9ydGVkXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlubmVyLnN0YXR1cyA9PT0gXCJkaXJ0eVwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBleGVjdXRlUmVmaW5lbWVudChpbm5lci52YWx1ZSkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBzdGF0dXM6IHN0YXR1cy52YWx1ZSwgdmFsdWU6IGlubmVyLnZhbHVlIH07XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChlZmZlY3QudHlwZSA9PT0gXCJ0cmFuc2Zvcm1cIikge1xuICAgICAgICAgICAgaWYgKGN0eC5jb21tb24uYXN5bmMgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYmFzZSA9IHRoaXMuX2RlZi5zY2hlbWEuX3BhcnNlU3luYyh7XG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IGN0eC5kYXRhLFxuICAgICAgICAgICAgICAgICAgICBwYXRoOiBjdHgucGF0aCxcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50OiBjdHgsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKCFpc1ZhbGlkKGJhc2UpKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmFzZTtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBlZmZlY3QudHJhbnNmb3JtKGJhc2UudmFsdWUsIGNoZWNrQ3R4KTtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEFzeW5jaHJvbm91cyB0cmFuc2Zvcm0gZW5jb3VudGVyZWQgZHVyaW5nIHN5bmNocm9ub3VzIHBhcnNlIG9wZXJhdGlvbi4gVXNlIC5wYXJzZUFzeW5jIGluc3RlYWQuYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB7IHN0YXR1czogc3RhdHVzLnZhbHVlLCB2YWx1ZTogcmVzdWx0IH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZGVmLnNjaGVtYVxuICAgICAgICAgICAgICAgICAgICAuX3BhcnNlQXN5bmMoeyBkYXRhOiBjdHguZGF0YSwgcGF0aDogY3R4LnBhdGgsIHBhcmVudDogY3R4IH0pXG4gICAgICAgICAgICAgICAgICAgIC50aGVuKChiYXNlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghaXNWYWxpZChiYXNlKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiYXNlO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGVmZmVjdC50cmFuc2Zvcm0oYmFzZS52YWx1ZSwgY2hlY2tDdHgpKS50aGVuKChyZXN1bHQpID0+ICh7IHN0YXR1czogc3RhdHVzLnZhbHVlLCB2YWx1ZTogcmVzdWx0IH0pKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB1dGlsLmFzc2VydE5ldmVyKGVmZmVjdCk7XG4gICAgfVxufVxuWm9kRWZmZWN0cy5jcmVhdGUgPSAoc2NoZW1hLCBlZmZlY3QsIHBhcmFtcykgPT4ge1xuICAgIHJldHVybiBuZXcgWm9kRWZmZWN0cyh7XG4gICAgICAgIHNjaGVtYSxcbiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RFZmZlY3RzLFxuICAgICAgICBlZmZlY3QsXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG5ab2RFZmZlY3RzLmNyZWF0ZVdpdGhQcmVwcm9jZXNzID0gKHByZXByb2Nlc3MsIHNjaGVtYSwgcGFyYW1zKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBab2RFZmZlY3RzKHtcbiAgICAgICAgc2NoZW1hLFxuICAgICAgICBlZmZlY3Q6IHsgdHlwZTogXCJwcmVwcm9jZXNzXCIsIHRyYW5zZm9ybTogcHJlcHJvY2VzcyB9LFxuICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZEVmZmVjdHMsXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG5jbGFzcyBab2RPcHRpb25hbCBleHRlbmRzIFpvZFR5cGUge1xuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBjb25zdCBwYXJzZWRUeXBlID0gdGhpcy5fZ2V0VHlwZShpbnB1dCk7XG4gICAgICAgIGlmIChwYXJzZWRUeXBlID09PSBab2RQYXJzZWRUeXBlLnVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIE9LKHVuZGVmaW5lZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi5pbm5lclR5cGUuX3BhcnNlKGlucHV0KTtcbiAgICB9XG4gICAgdW53cmFwKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVmLmlubmVyVHlwZTtcbiAgICB9XG59XG5ab2RPcHRpb25hbC5jcmVhdGUgPSAodHlwZSwgcGFyYW1zKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBab2RPcHRpb25hbCh7XG4gICAgICAgIGlubmVyVHlwZTogdHlwZSxcbiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RPcHRpb25hbCxcbiAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpLFxuICAgIH0pO1xufTtcbmNsYXNzIFpvZE51bGxhYmxlIGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZFR5cGUgPSB0aGlzLl9nZXRUeXBlKGlucHV0KTtcbiAgICAgICAgaWYgKHBhcnNlZFR5cGUgPT09IFpvZFBhcnNlZFR5cGUubnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIE9LKG51bGwpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWYuaW5uZXJUeXBlLl9wYXJzZShpbnB1dCk7XG4gICAgfVxuICAgIHVud3JhcCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi5pbm5lclR5cGU7XG4gICAgfVxufVxuWm9kTnVsbGFibGUuY3JlYXRlID0gKHR5cGUsIHBhcmFtcykgPT4ge1xuICAgIHJldHVybiBuZXcgWm9kTnVsbGFibGUoe1xuICAgICAgICBpbm5lclR5cGU6IHR5cGUsXG4gICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kTnVsbGFibGUsXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG5jbGFzcyBab2REZWZhdWx0IGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIGNvbnN0IHsgY3R4IH0gPSB0aGlzLl9wcm9jZXNzSW5wdXRQYXJhbXMoaW5wdXQpO1xuICAgICAgICBsZXQgZGF0YSA9IGN0eC5kYXRhO1xuICAgICAgICBpZiAoY3R4LnBhcnNlZFR5cGUgPT09IFpvZFBhcnNlZFR5cGUudW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBkYXRhID0gdGhpcy5fZGVmLmRlZmF1bHRWYWx1ZSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWYuaW5uZXJUeXBlLl9wYXJzZSh7XG4gICAgICAgICAgICBkYXRhLFxuICAgICAgICAgICAgcGF0aDogY3R4LnBhdGgsXG4gICAgICAgICAgICBwYXJlbnQ6IGN0eCxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJlbW92ZURlZmF1bHQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWYuaW5uZXJUeXBlO1xuICAgIH1cbn1cblpvZERlZmF1bHQuY3JlYXRlID0gKHR5cGUsIHBhcmFtcykgPT4ge1xuICAgIHJldHVybiBuZXcgWm9kRGVmYXVsdCh7XG4gICAgICAgIGlubmVyVHlwZTogdHlwZSxcbiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2REZWZhdWx0LFxuICAgICAgICBkZWZhdWx0VmFsdWU6IHR5cGVvZiBwYXJhbXMuZGVmYXVsdCA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgICAgICA/IHBhcmFtcy5kZWZhdWx0XG4gICAgICAgICAgICA6ICgpID0+IHBhcmFtcy5kZWZhdWx0LFxuICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgfSk7XG59O1xuY2xhc3MgWm9kQ2F0Y2ggZXh0ZW5kcyBab2RUeXBlIHtcbiAgICBfcGFyc2UoaW5wdXQpIHtcbiAgICAgICAgY29uc3QgeyBjdHggfSA9IHRoaXMuX3Byb2Nlc3NJbnB1dFBhcmFtcyhpbnB1dCk7XG4gICAgICAgIC8vIG5ld0N0eCBpcyB1c2VkIHRvIG5vdCBjb2xsZWN0IGlzc3VlcyBmcm9tIGlubmVyIHR5cGVzIGluIGN0eFxuICAgICAgICBjb25zdCBuZXdDdHggPSB7XG4gICAgICAgICAgICAuLi5jdHgsXG4gICAgICAgICAgICBjb21tb246IHtcbiAgICAgICAgICAgICAgICAuLi5jdHguY29tbW9uLFxuICAgICAgICAgICAgICAgIGlzc3VlczogW10sXG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLl9kZWYuaW5uZXJUeXBlLl9wYXJzZSh7XG4gICAgICAgICAgICBkYXRhOiBuZXdDdHguZGF0YSxcbiAgICAgICAgICAgIHBhdGg6IG5ld0N0eC5wYXRoLFxuICAgICAgICAgICAgcGFyZW50OiB7XG4gICAgICAgICAgICAgICAgLi4ubmV3Q3R4LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChpc0FzeW5jKHJlc3VsdCkpIHtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiBcInZhbGlkXCIsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiByZXN1bHQuc3RhdHVzID09PSBcInZhbGlkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID8gcmVzdWx0LnZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICA6IHRoaXMuX2RlZi5jYXRjaFZhbHVlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXQgZXJyb3IoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWm9kRXJyb3IobmV3Q3R4LmNvbW1vbi5pc3N1ZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQ6IG5ld0N0eC5kYXRhLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBzdGF0dXM6IFwidmFsaWRcIixcbiAgICAgICAgICAgICAgICB2YWx1ZTogcmVzdWx0LnN0YXR1cyA9PT0gXCJ2YWxpZFwiXG4gICAgICAgICAgICAgICAgICAgID8gcmVzdWx0LnZhbHVlXG4gICAgICAgICAgICAgICAgICAgIDogdGhpcy5fZGVmLmNhdGNoVmFsdWUoe1xuICAgICAgICAgICAgICAgICAgICAgICAgZ2V0IGVycm9yKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWm9kRXJyb3IobmV3Q3R4LmNvbW1vbi5pc3N1ZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0OiBuZXdDdHguZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfVxuICAgIHJlbW92ZUNhdGNoKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVmLmlubmVyVHlwZTtcbiAgICB9XG59XG5ab2RDYXRjaC5jcmVhdGUgPSAodHlwZSwgcGFyYW1zKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBab2RDYXRjaCh7XG4gICAgICAgIGlubmVyVHlwZTogdHlwZSxcbiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RDYXRjaCxcbiAgICAgICAgY2F0Y2hWYWx1ZTogdHlwZW9mIHBhcmFtcy5jYXRjaCA9PT0gXCJmdW5jdGlvblwiID8gcGFyYW1zLmNhdGNoIDogKCkgPT4gcGFyYW1zLmNhdGNoLFxuICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgfSk7XG59O1xuY2xhc3MgWm9kTmFOIGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZFR5cGUgPSB0aGlzLl9nZXRUeXBlKGlucHV0KTtcbiAgICAgICAgaWYgKHBhcnNlZFR5cGUgIT09IFpvZFBhcnNlZFR5cGUubmFuKSB7XG4gICAgICAgICAgICBjb25zdCBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCk7XG4gICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF90eXBlLFxuICAgICAgICAgICAgICAgIGV4cGVjdGVkOiBab2RQYXJzZWRUeXBlLm5hbixcbiAgICAgICAgICAgICAgICByZWNlaXZlZDogY3R4LnBhcnNlZFR5cGUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBJTlZBTElEO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IHN0YXR1czogXCJ2YWxpZFwiLCB2YWx1ZTogaW5wdXQuZGF0YSB9O1xuICAgIH1cbn1cblpvZE5hTi5jcmVhdGUgPSAocGFyYW1zKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBab2ROYU4oe1xuICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZE5hTixcbiAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpLFxuICAgIH0pO1xufTtcbmNvbnN0IEJSQU5EID0gU3ltYm9sKFwiem9kX2JyYW5kXCIpO1xuY2xhc3MgWm9kQnJhbmRlZCBleHRlbmRzIFpvZFR5cGUge1xuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBjb25zdCB7IGN0eCB9ID0gdGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGlucHV0KTtcbiAgICAgICAgY29uc3QgZGF0YSA9IGN0eC5kYXRhO1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVmLnR5cGUuX3BhcnNlKHtcbiAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgICBwYXRoOiBjdHgucGF0aCxcbiAgICAgICAgICAgIHBhcmVudDogY3R4LFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdW53cmFwKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVmLnR5cGU7XG4gICAgfVxufVxuY2xhc3MgWm9kUGlwZWxpbmUgZXh0ZW5kcyBab2RUeXBlIHtcbiAgICBfcGFyc2UoaW5wdXQpIHtcbiAgICAgICAgY29uc3QgeyBzdGF0dXMsIGN0eCB9ID0gdGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGlucHV0KTtcbiAgICAgICAgaWYgKGN0eC5jb21tb24uYXN5bmMpIHtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZUFzeW5jID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGluUmVzdWx0ID0gYXdhaXQgdGhpcy5fZGVmLmluLl9wYXJzZUFzeW5jKHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogY3R4LmRhdGEsXG4gICAgICAgICAgICAgICAgICAgIHBhdGg6IGN0eC5wYXRoLFxuICAgICAgICAgICAgICAgICAgICBwYXJlbnQ6IGN0eCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZiAoaW5SZXN1bHQuc3RhdHVzID09PSBcImFib3J0ZWRcIilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7XG4gICAgICAgICAgICAgICAgaWYgKGluUmVzdWx0LnN0YXR1cyA9PT0gXCJkaXJ0eVwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gRElSVFkoaW5SZXN1bHQudmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi5vdXQuX3BhcnNlQXN5bmMoe1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogaW5SZXN1bHQudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRoOiBjdHgucGF0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudDogY3R4LFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmV0dXJuIGhhbmRsZUFzeW5jKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBpblJlc3VsdCA9IHRoaXMuX2RlZi5pbi5fcGFyc2VTeW5jKHtcbiAgICAgICAgICAgICAgICBkYXRhOiBjdHguZGF0YSxcbiAgICAgICAgICAgICAgICBwYXRoOiBjdHgucGF0aCxcbiAgICAgICAgICAgICAgICBwYXJlbnQ6IGN0eCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKGluUmVzdWx0LnN0YXR1cyA9PT0gXCJhYm9ydGVkXCIpXG4gICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7XG4gICAgICAgICAgICBpZiAoaW5SZXN1bHQuc3RhdHVzID09PSBcImRpcnR5XCIpIHtcbiAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXM6IFwiZGlydHlcIixcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGluUmVzdWx0LnZhbHVlLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZGVmLm91dC5fcGFyc2VTeW5jKHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogaW5SZXN1bHQudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIHBhdGg6IGN0eC5wYXRoLFxuICAgICAgICAgICAgICAgICAgICBwYXJlbnQ6IGN0eCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBzdGF0aWMgY3JlYXRlKGEsIGIpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBab2RQaXBlbGluZSh7XG4gICAgICAgICAgICBpbjogYSxcbiAgICAgICAgICAgIG91dDogYixcbiAgICAgICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kUGlwZWxpbmUsXG4gICAgICAgIH0pO1xuICAgIH1cbn1cbmNsYXNzIFpvZFJlYWRvbmx5IGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuX2RlZi5pbm5lclR5cGUuX3BhcnNlKGlucHV0KTtcbiAgICAgICAgaWYgKGlzVmFsaWQocmVzdWx0KSkge1xuICAgICAgICAgICAgcmVzdWx0LnZhbHVlID0gT2JqZWN0LmZyZWV6ZShyZXN1bHQudmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxufVxuWm9kUmVhZG9ubHkuY3JlYXRlID0gKHR5cGUsIHBhcmFtcykgPT4ge1xuICAgIHJldHVybiBuZXcgWm9kUmVhZG9ubHkoe1xuICAgICAgICBpbm5lclR5cGU6IHR5cGUsXG4gICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kUmVhZG9ubHksXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG5jb25zdCBjdXN0b20gPSAoY2hlY2ssIHBhcmFtcyA9IHt9LCBcbi8qKlxuICogQGRlcHJlY2F0ZWRcbiAqXG4gKiBQYXNzIGBmYXRhbGAgaW50byB0aGUgcGFyYW1zIG9iamVjdCBpbnN0ZWFkOlxuICpcbiAqIGBgYHRzXG4gKiB6LnN0cmluZygpLmN1c3RvbSgodmFsKSA9PiB2YWwubGVuZ3RoID4gNSwgeyBmYXRhbDogZmFsc2UgfSlcbiAqIGBgYFxuICpcbiAqL1xuZmF0YWwpID0+IHtcbiAgICBpZiAoY2hlY2spXG4gICAgICAgIHJldHVybiBab2RBbnkuY3JlYXRlKCkuc3VwZXJSZWZpbmUoKGRhdGEsIGN0eCkgPT4ge1xuICAgICAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgICAgIGlmICghY2hlY2soZGF0YSkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwID0gdHlwZW9mIHBhcmFtcyA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgICAgICAgICAgICAgID8gcGFyYW1zKGRhdGEpXG4gICAgICAgICAgICAgICAgICAgIDogdHlwZW9mIHBhcmFtcyA9PT0gXCJzdHJpbmdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPyB7IG1lc3NhZ2U6IHBhcmFtcyB9XG4gICAgICAgICAgICAgICAgICAgICAgICA6IHBhcmFtcztcbiAgICAgICAgICAgICAgICBjb25zdCBfZmF0YWwgPSAoX2IgPSAoX2EgPSBwLmZhdGFsKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBmYXRhbCkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogdHJ1ZTtcbiAgICAgICAgICAgICAgICBjb25zdCBwMiA9IHR5cGVvZiBwID09PSBcInN0cmluZ1wiID8geyBtZXNzYWdlOiBwIH0gOiBwO1xuICAgICAgICAgICAgICAgIGN0eC5hZGRJc3N1ZSh7IGNvZGU6IFwiY3VzdG9tXCIsIC4uLnAyLCBmYXRhbDogX2ZhdGFsIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICByZXR1cm4gWm9kQW55LmNyZWF0ZSgpO1xufTtcbmNvbnN0IGxhdGUgPSB7XG4gICAgb2JqZWN0OiBab2RPYmplY3QubGF6eWNyZWF0ZSxcbn07XG52YXIgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kO1xuKGZ1bmN0aW9uIChab2RGaXJzdFBhcnR5VHlwZUtpbmQpIHtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2RTdHJpbmdcIl0gPSBcIlpvZFN0cmluZ1wiO1xuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZFtcIlpvZE51bWJlclwiXSA9IFwiWm9kTnVtYmVyXCI7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kTmFOXCJdID0gXCJab2ROYU5cIjtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2RCaWdJbnRcIl0gPSBcIlpvZEJpZ0ludFwiO1xuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZFtcIlpvZEJvb2xlYW5cIl0gPSBcIlpvZEJvb2xlYW5cIjtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2REYXRlXCJdID0gXCJab2REYXRlXCI7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kU3ltYm9sXCJdID0gXCJab2RTeW1ib2xcIjtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2RVbmRlZmluZWRcIl0gPSBcIlpvZFVuZGVmaW5lZFwiO1xuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZFtcIlpvZE51bGxcIl0gPSBcIlpvZE51bGxcIjtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2RBbnlcIl0gPSBcIlpvZEFueVwiO1xuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZFtcIlpvZFVua25vd25cIl0gPSBcIlpvZFVua25vd25cIjtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2ROZXZlclwiXSA9IFwiWm9kTmV2ZXJcIjtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2RWb2lkXCJdID0gXCJab2RWb2lkXCI7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kQXJyYXlcIl0gPSBcIlpvZEFycmF5XCI7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kT2JqZWN0XCJdID0gXCJab2RPYmplY3RcIjtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2RVbmlvblwiXSA9IFwiWm9kVW5pb25cIjtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2REaXNjcmltaW5hdGVkVW5pb25cIl0gPSBcIlpvZERpc2NyaW1pbmF0ZWRVbmlvblwiO1xuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZFtcIlpvZEludGVyc2VjdGlvblwiXSA9IFwiWm9kSW50ZXJzZWN0aW9uXCI7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kVHVwbGVcIl0gPSBcIlpvZFR1cGxlXCI7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kUmVjb3JkXCJdID0gXCJab2RSZWNvcmRcIjtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2RNYXBcIl0gPSBcIlpvZE1hcFwiO1xuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZFtcIlpvZFNldFwiXSA9IFwiWm9kU2V0XCI7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kRnVuY3Rpb25cIl0gPSBcIlpvZEZ1bmN0aW9uXCI7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kTGF6eVwiXSA9IFwiWm9kTGF6eVwiO1xuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZFtcIlpvZExpdGVyYWxcIl0gPSBcIlpvZExpdGVyYWxcIjtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2RFbnVtXCJdID0gXCJab2RFbnVtXCI7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kRWZmZWN0c1wiXSA9IFwiWm9kRWZmZWN0c1wiO1xuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZFtcIlpvZE5hdGl2ZUVudW1cIl0gPSBcIlpvZE5hdGl2ZUVudW1cIjtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2RPcHRpb25hbFwiXSA9IFwiWm9kT3B0aW9uYWxcIjtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2ROdWxsYWJsZVwiXSA9IFwiWm9kTnVsbGFibGVcIjtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2REZWZhdWx0XCJdID0gXCJab2REZWZhdWx0XCI7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kQ2F0Y2hcIl0gPSBcIlpvZENhdGNoXCI7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kUHJvbWlzZVwiXSA9IFwiWm9kUHJvbWlzZVwiO1xuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZFtcIlpvZEJyYW5kZWRcIl0gPSBcIlpvZEJyYW5kZWRcIjtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2RQaXBlbGluZVwiXSA9IFwiWm9kUGlwZWxpbmVcIjtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2RSZWFkb25seVwiXSA9IFwiWm9kUmVhZG9ubHlcIjtcbn0pKFpvZEZpcnN0UGFydHlUeXBlS2luZCB8fCAoWm9kRmlyc3RQYXJ0eVR5cGVLaW5kID0ge30pKTtcbmNvbnN0IGluc3RhbmNlT2ZUeXBlID0gKFxuLy8gY29uc3QgaW5zdGFuY2VPZlR5cGUgPSA8VCBleHRlbmRzIG5ldyAoLi4uYXJnczogYW55W10pID0+IGFueT4oXG5jbHMsIHBhcmFtcyA9IHtcbiAgICBtZXNzYWdlOiBgSW5wdXQgbm90IGluc3RhbmNlIG9mICR7Y2xzLm5hbWV9YCxcbn0pID0+IGN1c3RvbSgoZGF0YSkgPT4gZGF0YSBpbnN0YW5jZW9mIGNscywgcGFyYW1zKTtcbmNvbnN0IHN0cmluZ1R5cGUgPSBab2RTdHJpbmcuY3JlYXRlO1xuY29uc3QgbnVtYmVyVHlwZSA9IFpvZE51bWJlci5jcmVhdGU7XG5jb25zdCBuYW5UeXBlID0gWm9kTmFOLmNyZWF0ZTtcbmNvbnN0IGJpZ0ludFR5cGUgPSBab2RCaWdJbnQuY3JlYXRlO1xuY29uc3QgYm9vbGVhblR5cGUgPSBab2RCb29sZWFuLmNyZWF0ZTtcbmNvbnN0IGRhdGVUeXBlID0gWm9kRGF0ZS5jcmVhdGU7XG5jb25zdCBzeW1ib2xUeXBlID0gWm9kU3ltYm9sLmNyZWF0ZTtcbmNvbnN0IHVuZGVmaW5lZFR5cGUgPSBab2RVbmRlZmluZWQuY3JlYXRlO1xuY29uc3QgbnVsbFR5cGUgPSBab2ROdWxsLmNyZWF0ZTtcbmNvbnN0IGFueVR5cGUgPSBab2RBbnkuY3JlYXRlO1xuY29uc3QgdW5rbm93blR5cGUgPSBab2RVbmtub3duLmNyZWF0ZTtcbmNvbnN0IG5ldmVyVHlwZSA9IFpvZE5ldmVyLmNyZWF0ZTtcbmNvbnN0IHZvaWRUeXBlID0gWm9kVm9pZC5jcmVhdGU7XG5jb25zdCBhcnJheVR5cGUgPSBab2RBcnJheS5jcmVhdGU7XG5jb25zdCBvYmplY3RUeXBlID0gWm9kT2JqZWN0LmNyZWF0ZTtcbmNvbnN0IHN0cmljdE9iamVjdFR5cGUgPSBab2RPYmplY3Quc3RyaWN0Q3JlYXRlO1xuY29uc3QgdW5pb25UeXBlID0gWm9kVW5pb24uY3JlYXRlO1xuY29uc3QgZGlzY3JpbWluYXRlZFVuaW9uVHlwZSA9IFpvZERpc2NyaW1pbmF0ZWRVbmlvbi5jcmVhdGU7XG5jb25zdCBpbnRlcnNlY3Rpb25UeXBlID0gWm9kSW50ZXJzZWN0aW9uLmNyZWF0ZTtcbmNvbnN0IHR1cGxlVHlwZSA9IFpvZFR1cGxlLmNyZWF0ZTtcbmNvbnN0IHJlY29yZFR5cGUgPSBab2RSZWNvcmQuY3JlYXRlO1xuY29uc3QgbWFwVHlwZSA9IFpvZE1hcC5jcmVhdGU7XG5jb25zdCBzZXRUeXBlID0gWm9kU2V0LmNyZWF0ZTtcbmNvbnN0IGZ1bmN0aW9uVHlwZSA9IFpvZEZ1bmN0aW9uLmNyZWF0ZTtcbmNvbnN0IGxhenlUeXBlID0gWm9kTGF6eS5jcmVhdGU7XG5jb25zdCBsaXRlcmFsVHlwZSA9IFpvZExpdGVyYWwuY3JlYXRlO1xuY29uc3QgZW51bVR5cGUgPSBab2RFbnVtLmNyZWF0ZTtcbmNvbnN0IG5hdGl2ZUVudW1UeXBlID0gWm9kTmF0aXZlRW51bS5jcmVhdGU7XG5jb25zdCBwcm9taXNlVHlwZSA9IFpvZFByb21pc2UuY3JlYXRlO1xuY29uc3QgZWZmZWN0c1R5cGUgPSBab2RFZmZlY3RzLmNyZWF0ZTtcbmNvbnN0IG9wdGlvbmFsVHlwZSA9IFpvZE9wdGlvbmFsLmNyZWF0ZTtcbmNvbnN0IG51bGxhYmxlVHlwZSA9IFpvZE51bGxhYmxlLmNyZWF0ZTtcbmNvbnN0IHByZXByb2Nlc3NUeXBlID0gWm9kRWZmZWN0cy5jcmVhdGVXaXRoUHJlcHJvY2VzcztcbmNvbnN0IHBpcGVsaW5lVHlwZSA9IFpvZFBpcGVsaW5lLmNyZWF0ZTtcbmNvbnN0IG9zdHJpbmcgPSAoKSA9PiBzdHJpbmdUeXBlKCkub3B0aW9uYWwoKTtcbmNvbnN0IG9udW1iZXIgPSAoKSA9PiBudW1iZXJUeXBlKCkub3B0aW9uYWwoKTtcbmNvbnN0IG9ib29sZWFuID0gKCkgPT4gYm9vbGVhblR5cGUoKS5vcHRpb25hbCgpO1xuY29uc3QgY29lcmNlID0ge1xuICAgIHN0cmluZzogKChhcmcpID0+IFpvZFN0cmluZy5jcmVhdGUoeyAuLi5hcmcsIGNvZXJjZTogdHJ1ZSB9KSksXG4gICAgbnVtYmVyOiAoKGFyZykgPT4gWm9kTnVtYmVyLmNyZWF0ZSh7IC4uLmFyZywgY29lcmNlOiB0cnVlIH0pKSxcbiAgICBib29sZWFuOiAoKGFyZykgPT4gWm9kQm9vbGVhbi5jcmVhdGUoe1xuICAgICAgICAuLi5hcmcsXG4gICAgICAgIGNvZXJjZTogdHJ1ZSxcbiAgICB9KSksXG4gICAgYmlnaW50OiAoKGFyZykgPT4gWm9kQmlnSW50LmNyZWF0ZSh7IC4uLmFyZywgY29lcmNlOiB0cnVlIH0pKSxcbiAgICBkYXRlOiAoKGFyZykgPT4gWm9kRGF0ZS5jcmVhdGUoeyAuLi5hcmcsIGNvZXJjZTogdHJ1ZSB9KSksXG59O1xuY29uc3QgTkVWRVIgPSBJTlZBTElEO1xuXG52YXIgeiA9IC8qI19fUFVSRV9fKi9PYmplY3QuZnJlZXplKHtcbiAgICBfX3Byb3RvX186IG51bGwsXG4gICAgZGVmYXVsdEVycm9yTWFwOiBlcnJvck1hcCxcbiAgICBzZXRFcnJvck1hcDogc2V0RXJyb3JNYXAsXG4gICAgZ2V0RXJyb3JNYXA6IGdldEVycm9yTWFwLFxuICAgIG1ha2VJc3N1ZTogbWFrZUlzc3VlLFxuICAgIEVNUFRZX1BBVEg6IEVNUFRZX1BBVEgsXG4gICAgYWRkSXNzdWVUb0NvbnRleHQ6IGFkZElzc3VlVG9Db250ZXh0LFxuICAgIFBhcnNlU3RhdHVzOiBQYXJzZVN0YXR1cyxcbiAgICBJTlZBTElEOiBJTlZBTElELFxuICAgIERJUlRZOiBESVJUWSxcbiAgICBPSzogT0ssXG4gICAgaXNBYm9ydGVkOiBpc0Fib3J0ZWQsXG4gICAgaXNEaXJ0eTogaXNEaXJ0eSxcbiAgICBpc1ZhbGlkOiBpc1ZhbGlkLFxuICAgIGlzQXN5bmM6IGlzQXN5bmMsXG4gICAgZ2V0IHV0aWwgKCkgeyByZXR1cm4gdXRpbDsgfSxcbiAgICBnZXQgb2JqZWN0VXRpbCAoKSB7IHJldHVybiBvYmplY3RVdGlsOyB9LFxuICAgIFpvZFBhcnNlZFR5cGU6IFpvZFBhcnNlZFR5cGUsXG4gICAgZ2V0UGFyc2VkVHlwZTogZ2V0UGFyc2VkVHlwZSxcbiAgICBab2RUeXBlOiBab2RUeXBlLFxuICAgIFpvZFN0cmluZzogWm9kU3RyaW5nLFxuICAgIFpvZE51bWJlcjogWm9kTnVtYmVyLFxuICAgIFpvZEJpZ0ludDogWm9kQmlnSW50LFxuICAgIFpvZEJvb2xlYW46IFpvZEJvb2xlYW4sXG4gICAgWm9kRGF0ZTogWm9kRGF0ZSxcbiAgICBab2RTeW1ib2w6IFpvZFN5bWJvbCxcbiAgICBab2RVbmRlZmluZWQ6IFpvZFVuZGVmaW5lZCxcbiAgICBab2ROdWxsOiBab2ROdWxsLFxuICAgIFpvZEFueTogWm9kQW55LFxuICAgIFpvZFVua25vd246IFpvZFVua25vd24sXG4gICAgWm9kTmV2ZXI6IFpvZE5ldmVyLFxuICAgIFpvZFZvaWQ6IFpvZFZvaWQsXG4gICAgWm9kQXJyYXk6IFpvZEFycmF5LFxuICAgIFpvZE9iamVjdDogWm9kT2JqZWN0LFxuICAgIFpvZFVuaW9uOiBab2RVbmlvbixcbiAgICBab2REaXNjcmltaW5hdGVkVW5pb246IFpvZERpc2NyaW1pbmF0ZWRVbmlvbixcbiAgICBab2RJbnRlcnNlY3Rpb246IFpvZEludGVyc2VjdGlvbixcbiAgICBab2RUdXBsZTogWm9kVHVwbGUsXG4gICAgWm9kUmVjb3JkOiBab2RSZWNvcmQsXG4gICAgWm9kTWFwOiBab2RNYXAsXG4gICAgWm9kU2V0OiBab2RTZXQsXG4gICAgWm9kRnVuY3Rpb246IFpvZEZ1bmN0aW9uLFxuICAgIFpvZExhenk6IFpvZExhenksXG4gICAgWm9kTGl0ZXJhbDogWm9kTGl0ZXJhbCxcbiAgICBab2RFbnVtOiBab2RFbnVtLFxuICAgIFpvZE5hdGl2ZUVudW06IFpvZE5hdGl2ZUVudW0sXG4gICAgWm9kUHJvbWlzZTogWm9kUHJvbWlzZSxcbiAgICBab2RFZmZlY3RzOiBab2RFZmZlY3RzLFxuICAgIFpvZFRyYW5zZm9ybWVyOiBab2RFZmZlY3RzLFxuICAgIFpvZE9wdGlvbmFsOiBab2RPcHRpb25hbCxcbiAgICBab2ROdWxsYWJsZTogWm9kTnVsbGFibGUsXG4gICAgWm9kRGVmYXVsdDogWm9kRGVmYXVsdCxcbiAgICBab2RDYXRjaDogWm9kQ2F0Y2gsXG4gICAgWm9kTmFOOiBab2ROYU4sXG4gICAgQlJBTkQ6IEJSQU5ELFxuICAgIFpvZEJyYW5kZWQ6IFpvZEJyYW5kZWQsXG4gICAgWm9kUGlwZWxpbmU6IFpvZFBpcGVsaW5lLFxuICAgIFpvZFJlYWRvbmx5OiBab2RSZWFkb25seSxcbiAgICBjdXN0b206IGN1c3RvbSxcbiAgICBTY2hlbWE6IFpvZFR5cGUsXG4gICAgWm9kU2NoZW1hOiBab2RUeXBlLFxuICAgIGxhdGU6IGxhdGUsXG4gICAgZ2V0IFpvZEZpcnN0UGFydHlUeXBlS2luZCAoKSB7IHJldHVybiBab2RGaXJzdFBhcnR5VHlwZUtpbmQ7IH0sXG4gICAgY29lcmNlOiBjb2VyY2UsXG4gICAgYW55OiBhbnlUeXBlLFxuICAgIGFycmF5OiBhcnJheVR5cGUsXG4gICAgYmlnaW50OiBiaWdJbnRUeXBlLFxuICAgIGJvb2xlYW46IGJvb2xlYW5UeXBlLFxuICAgIGRhdGU6IGRhdGVUeXBlLFxuICAgIGRpc2NyaW1pbmF0ZWRVbmlvbjogZGlzY3JpbWluYXRlZFVuaW9uVHlwZSxcbiAgICBlZmZlY3Q6IGVmZmVjdHNUeXBlLFxuICAgICdlbnVtJzogZW51bVR5cGUsXG4gICAgJ2Z1bmN0aW9uJzogZnVuY3Rpb25UeXBlLFxuICAgICdpbnN0YW5jZW9mJzogaW5zdGFuY2VPZlR5cGUsXG4gICAgaW50ZXJzZWN0aW9uOiBpbnRlcnNlY3Rpb25UeXBlLFxuICAgIGxhenk6IGxhenlUeXBlLFxuICAgIGxpdGVyYWw6IGxpdGVyYWxUeXBlLFxuICAgIG1hcDogbWFwVHlwZSxcbiAgICBuYW46IG5hblR5cGUsXG4gICAgbmF0aXZlRW51bTogbmF0aXZlRW51bVR5cGUsXG4gICAgbmV2ZXI6IG5ldmVyVHlwZSxcbiAgICAnbnVsbCc6IG51bGxUeXBlLFxuICAgIG51bGxhYmxlOiBudWxsYWJsZVR5cGUsXG4gICAgbnVtYmVyOiBudW1iZXJUeXBlLFxuICAgIG9iamVjdDogb2JqZWN0VHlwZSxcbiAgICBvYm9vbGVhbjogb2Jvb2xlYW4sXG4gICAgb251bWJlcjogb251bWJlcixcbiAgICBvcHRpb25hbDogb3B0aW9uYWxUeXBlLFxuICAgIG9zdHJpbmc6IG9zdHJpbmcsXG4gICAgcGlwZWxpbmU6IHBpcGVsaW5lVHlwZSxcbiAgICBwcmVwcm9jZXNzOiBwcmVwcm9jZXNzVHlwZSxcbiAgICBwcm9taXNlOiBwcm9taXNlVHlwZSxcbiAgICByZWNvcmQ6IHJlY29yZFR5cGUsXG4gICAgc2V0OiBzZXRUeXBlLFxuICAgIHN0cmljdE9iamVjdDogc3RyaWN0T2JqZWN0VHlwZSxcbiAgICBzdHJpbmc6IHN0cmluZ1R5cGUsXG4gICAgc3ltYm9sOiBzeW1ib2xUeXBlLFxuICAgIHRyYW5zZm9ybWVyOiBlZmZlY3RzVHlwZSxcbiAgICB0dXBsZTogdHVwbGVUeXBlLFxuICAgICd1bmRlZmluZWQnOiB1bmRlZmluZWRUeXBlLFxuICAgIHVuaW9uOiB1bmlvblR5cGUsXG4gICAgdW5rbm93bjogdW5rbm93blR5cGUsXG4gICAgJ3ZvaWQnOiB2b2lkVHlwZSxcbiAgICBORVZFUjogTkVWRVIsXG4gICAgWm9kSXNzdWVDb2RlOiBab2RJc3N1ZUNvZGUsXG4gICAgcXVvdGVsZXNzSnNvbjogcXVvdGVsZXNzSnNvbixcbiAgICBab2RFcnJvcjogWm9kRXJyb3Jcbn0pO1xuXG5leHBvcnQgeyBCUkFORCwgRElSVFksIEVNUFRZX1BBVEgsIElOVkFMSUQsIE5FVkVSLCBPSywgUGFyc2VTdGF0dXMsIFpvZFR5cGUgYXMgU2NoZW1hLCBab2RBbnksIFpvZEFycmF5LCBab2RCaWdJbnQsIFpvZEJvb2xlYW4sIFpvZEJyYW5kZWQsIFpvZENhdGNoLCBab2REYXRlLCBab2REZWZhdWx0LCBab2REaXNjcmltaW5hdGVkVW5pb24sIFpvZEVmZmVjdHMsIFpvZEVudW0sIFpvZEVycm9yLCBab2RGaXJzdFBhcnR5VHlwZUtpbmQsIFpvZEZ1bmN0aW9uLCBab2RJbnRlcnNlY3Rpb24sIFpvZElzc3VlQ29kZSwgWm9kTGF6eSwgWm9kTGl0ZXJhbCwgWm9kTWFwLCBab2ROYU4sIFpvZE5hdGl2ZUVudW0sIFpvZE5ldmVyLCBab2ROdWxsLCBab2ROdWxsYWJsZSwgWm9kTnVtYmVyLCBab2RPYmplY3QsIFpvZE9wdGlvbmFsLCBab2RQYXJzZWRUeXBlLCBab2RQaXBlbGluZSwgWm9kUHJvbWlzZSwgWm9kUmVhZG9ubHksIFpvZFJlY29yZCwgWm9kVHlwZSBhcyBab2RTY2hlbWEsIFpvZFNldCwgWm9kU3RyaW5nLCBab2RTeW1ib2wsIFpvZEVmZmVjdHMgYXMgWm9kVHJhbnNmb3JtZXIsIFpvZFR1cGxlLCBab2RUeXBlLCBab2RVbmRlZmluZWQsIFpvZFVuaW9uLCBab2RVbmtub3duLCBab2RWb2lkLCBhZGRJc3N1ZVRvQ29udGV4dCwgYW55VHlwZSBhcyBhbnksIGFycmF5VHlwZSBhcyBhcnJheSwgYmlnSW50VHlwZSBhcyBiaWdpbnQsIGJvb2xlYW5UeXBlIGFzIGJvb2xlYW4sIGNvZXJjZSwgY3VzdG9tLCBkYXRlVHlwZSBhcyBkYXRlLCB6IGFzIGRlZmF1bHQsIGVycm9yTWFwIGFzIGRlZmF1bHRFcnJvck1hcCwgZGlzY3JpbWluYXRlZFVuaW9uVHlwZSBhcyBkaXNjcmltaW5hdGVkVW5pb24sIGVmZmVjdHNUeXBlIGFzIGVmZmVjdCwgZW51bVR5cGUgYXMgZW51bSwgZnVuY3Rpb25UeXBlIGFzIGZ1bmN0aW9uLCBnZXRFcnJvck1hcCwgZ2V0UGFyc2VkVHlwZSwgaW5zdGFuY2VPZlR5cGUgYXMgaW5zdGFuY2VvZiwgaW50ZXJzZWN0aW9uVHlwZSBhcyBpbnRlcnNlY3Rpb24sIGlzQWJvcnRlZCwgaXNBc3luYywgaXNEaXJ0eSwgaXNWYWxpZCwgbGF0ZSwgbGF6eVR5cGUgYXMgbGF6eSwgbGl0ZXJhbFR5cGUgYXMgbGl0ZXJhbCwgbWFrZUlzc3VlLCBtYXBUeXBlIGFzIG1hcCwgbmFuVHlwZSBhcyBuYW4sIG5hdGl2ZUVudW1UeXBlIGFzIG5hdGl2ZUVudW0sIG5ldmVyVHlwZSBhcyBuZXZlciwgbnVsbFR5cGUgYXMgbnVsbCwgbnVsbGFibGVUeXBlIGFzIG51bGxhYmxlLCBudW1iZXJUeXBlIGFzIG51bWJlciwgb2JqZWN0VHlwZSBhcyBvYmplY3QsIG9iamVjdFV0aWwsIG9ib29sZWFuLCBvbnVtYmVyLCBvcHRpb25hbFR5cGUgYXMgb3B0aW9uYWwsIG9zdHJpbmcsIHBpcGVsaW5lVHlwZSBhcyBwaXBlbGluZSwgcHJlcHJvY2Vzc1R5cGUgYXMgcHJlcHJvY2VzcywgcHJvbWlzZVR5cGUgYXMgcHJvbWlzZSwgcXVvdGVsZXNzSnNvbiwgcmVjb3JkVHlwZSBhcyByZWNvcmQsIHNldFR5cGUgYXMgc2V0LCBzZXRFcnJvck1hcCwgc3RyaWN0T2JqZWN0VHlwZSBhcyBzdHJpY3RPYmplY3QsIHN0cmluZ1R5cGUgYXMgc3RyaW5nLCBzeW1ib2xUeXBlIGFzIHN5bWJvbCwgZWZmZWN0c1R5cGUgYXMgdHJhbnNmb3JtZXIsIHR1cGxlVHlwZSBhcyB0dXBsZSwgdW5kZWZpbmVkVHlwZSBhcyB1bmRlZmluZWQsIHVuaW9uVHlwZSBhcyB1bmlvbiwgdW5rbm93blR5cGUgYXMgdW5rbm93biwgdXRpbCwgdm9pZFR5cGUgYXMgdm9pZCwgeiB9O1xuIiwiaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcblxuZXhwb3J0IGNvbnN0IEJvb2sgPSB6LnVuaW9uKFtcblx0ei5saXRlcmFsKFwicHVcIiksXG5cdHoubGl0ZXJhbChcImt1IHN1bGlcIiksXG5cdHoubGl0ZXJhbChcImt1IGxpbGlcIiksXG5cdHoubGl0ZXJhbChcIm5vbmVcIiksXG5dKTtcbmV4cG9ydCB0eXBlIEJvb2sgPSB6LmluZmVyPHR5cGVvZiBCb29rPjtcblxuZXhwb3J0IGNvbnN0IENvaW5lZEVyYSA9IHoudW5pb24oW3oubGl0ZXJhbChcInByZS1wdVwiKSwgei5saXRlcmFsKFwicG9zdC1wdVwiKSwgei5saXRlcmFsKFwicG9zdC1rdVwiKV0pO1xuZXhwb3J0IHR5cGUgQ29pbmVkRXJhID0gei5pbmZlcjx0eXBlb2YgQ29pbmVkRXJhPjtcblxuZXhwb3J0IGNvbnN0IFVzYWdlQ2F0ZWdvcnkgPSB6LnVuaW9uKFtcblx0ei5saXRlcmFsKFwiY29yZVwiKSxcblx0ei5saXRlcmFsKFwiY29tbW9uXCIpLFxuXHR6LmxpdGVyYWwoXCJ1bmNvbW1vblwiKSxcblx0ei5saXRlcmFsKFwib2JzY3VyZVwiKSxcblx0ei5saXRlcmFsKFwic2FuZGJveFwiKSxcbl0pO1xuZXhwb3J0IHR5cGUgVXNhZ2VDYXRlZ29yeSA9IHouaW5mZXI8dHlwZW9mIFVzYWdlQ2F0ZWdvcnk+O1xuXG5leHBvcnQgY29uc3QgV3JpdGluZ1N5c3RlbSA9IHouZW51bShbXG5cdFwic2l0ZWxlbiBwb25hXCIsXG5cdFwic2l0ZWxlbiBzaXRlbGVuXCIsXG5cdFwiYWxwaGFiZXRcIixcblx0XCJzeWxsYWJhcnlcIixcblx0XCJsb2dvZ3JhcGh5XCIsXG5cdFwidG9raXBvbmlkbyBhbHBoYWJldFwiLFxuXHRcInRva2lwb25pZG8gc3lsbGFiYXJ5XCIsXG5cdFwidG9raXBvbmlkbyBsb2dvZ3JhcGh5XCIsXG5dKTtcbmV4cG9ydCB0eXBlIFdyaXRpbmdTeXN0ZW0gPSB6LmluZmVyPHR5cGVvZiBXcml0aW5nU3lzdGVtPjtcblxuZXhwb3J0IHR5cGUgKiBmcm9tIFwiLi90eXBlc1wiO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VHJhbnNsYXRlZERhdGE8XG5cdE9iaiBleHRlbmRzIHsgdHJhbnNsYXRpb25zOiBSZWNvcmQ8c3RyaW5nLCBvYmplY3Q+IH0sXG5cdEtleSBleHRlbmRzIGtleW9mIE9ialtcInRyYW5zbGF0aW9uc1wiXVtzdHJpbmddLFxuPihkYXRhOiBPYmosIGtleTogS2V5LCBsYW5ndWFnZTogc3RyaW5nKTogT2JqW1widHJhbnNsYXRpb25zXCJdW3N0cmluZ11bS2V5XSB7XG5cdHJldHVybiAoKGRhdGEudHJhbnNsYXRpb25zW2xhbmd1YWdlXSA/PyBkYXRhLnRyYW5zbGF0aW9uc1tcImVuXCJdISkgYXMgT2JqW1widHJhbnNsYXRpb25zXCJdW3N0cmluZ10pW1xuXHRcdGtleVxuXHRdO1xufVxuIl0sIm5hbWVzIjpbInV0aWwiLCJ2YWwiLCJhc3NlcnRJcyIsIl9hcmciLCJhc3NlcnROZXZlciIsIl94IiwiaXRlbXMiLCJvYmoiLCJpdGVtIiwidmFsaWRLZXlzIiwiayIsImZpbHRlcmVkIiwiZSIsIm9iamVjdCIsImtleXMiLCJrZXkiLCJhcnIiLCJjaGVja2VyIiwiam9pblZhbHVlcyIsImFycmF5Iiwic2VwYXJhdG9yIiwiXyIsInZhbHVlIiwib2JqZWN0VXRpbCIsImZpcnN0Iiwic2Vjb25kIiwiWm9kUGFyc2VkVHlwZSIsImdldFBhcnNlZFR5cGUiLCJkYXRhIiwiWm9kSXNzdWVDb2RlIiwicXVvdGVsZXNzSnNvbiIsIlpvZEVycm9yIiwiaXNzdWVzIiwic3ViIiwic3VicyIsImFjdHVhbFByb3RvIiwiX21hcHBlciIsIm1hcHBlciIsImlzc3VlIiwiZmllbGRFcnJvcnMiLCJwcm9jZXNzRXJyb3IiLCJlcnJvciIsImN1cnIiLCJpIiwiZWwiLCJmb3JtRXJyb3JzIiwiZXJyb3JNYXAiLCJfY3R4IiwibWVzc2FnZSIsIm92ZXJyaWRlRXJyb3JNYXAiLCJzZXRFcnJvck1hcCIsIm1hcCIsImdldEVycm9yTWFwIiwibWFrZUlzc3VlIiwicGFyYW1zIiwicGF0aCIsImVycm9yTWFwcyIsImlzc3VlRGF0YSIsImZ1bGxQYXRoIiwiZnVsbElzc3VlIiwiZXJyb3JNZXNzYWdlIiwibWFwcyIsIm0iLCJFTVBUWV9QQVRIIiwiYWRkSXNzdWVUb0NvbnRleHQiLCJjdHgiLCJ4IiwiUGFyc2VTdGF0dXMiLCJzdGF0dXMiLCJyZXN1bHRzIiwiYXJyYXlWYWx1ZSIsInMiLCJJTlZBTElEIiwicGFpcnMiLCJzeW5jUGFpcnMiLCJwYWlyIiwiZmluYWxPYmplY3QiLCJESVJUWSIsIk9LIiwiaXNBYm9ydGVkIiwiaXNEaXJ0eSIsImlzVmFsaWQiLCJpc0FzeW5jIiwiZXJyb3JVdGlsIiwiUGFyc2VJbnB1dExhenlQYXRoIiwicGFyZW50IiwiaGFuZGxlUmVzdWx0IiwicmVzdWx0IiwicHJvY2Vzc0NyZWF0ZVBhcmFtcyIsImludmFsaWRfdHlwZV9lcnJvciIsInJlcXVpcmVkX2Vycm9yIiwiZGVzY3JpcHRpb24iLCJpc3MiLCJab2RUeXBlIiwiZGVmIiwiaW5wdXQiLCJfYSIsIm1heWJlQXN5bmNSZXN1bHQiLCJjaGVjayIsImdldElzc3VlUHJvcGVydGllcyIsInNldEVycm9yIiwicmVmaW5lbWVudERhdGEiLCJyZWZpbmVtZW50IiwiWm9kRWZmZWN0cyIsIlpvZEZpcnN0UGFydHlUeXBlS2luZCIsIlpvZE9wdGlvbmFsIiwiWm9kTnVsbGFibGUiLCJab2RBcnJheSIsIlpvZFByb21pc2UiLCJvcHRpb24iLCJab2RVbmlvbiIsImluY29taW5nIiwiWm9kSW50ZXJzZWN0aW9uIiwidHJhbnNmb3JtIiwiZGVmYXVsdFZhbHVlRnVuYyIsIlpvZERlZmF1bHQiLCJab2RCcmFuZGVkIiwiY2F0Y2hWYWx1ZUZ1bmMiLCJab2RDYXRjaCIsIlRoaXMiLCJ0YXJnZXQiLCJab2RQaXBlbGluZSIsIlpvZFJlYWRvbmx5IiwiY3VpZFJlZ2V4IiwiY3VpZDJSZWdleCIsInVsaWRSZWdleCIsInV1aWRSZWdleCIsImVtYWlsUmVnZXgiLCJfZW1vamlSZWdleCIsImVtb2ppUmVnZXgiLCJpcHY0UmVnZXgiLCJpcHY2UmVnZXgiLCJkYXRldGltZVJlZ2V4IiwiYXJncyIsImlzVmFsaWRJUCIsImlwIiwidmVyc2lvbiIsIlpvZFN0cmluZyIsInRvb0JpZyIsInRvb1NtYWxsIiwicmVnZXgiLCJ2YWxpZGF0aW9uIiwib3B0aW9ucyIsIm1pbkxlbmd0aCIsIm1heExlbmd0aCIsImxlbiIsImNoIiwibWluIiwibWF4IiwiZmxvYXRTYWZlUmVtYWluZGVyIiwic3RlcCIsInZhbERlY0NvdW50Iiwic3RlcERlY0NvdW50IiwiZGVjQ291bnQiLCJ2YWxJbnQiLCJzdGVwSW50IiwiWm9kTnVtYmVyIiwia2luZCIsImluY2x1c2l2ZSIsIlpvZEJpZ0ludCIsIlpvZEJvb2xlYW4iLCJab2REYXRlIiwibWluRGF0ZSIsIm1heERhdGUiLCJab2RTeW1ib2wiLCJab2RVbmRlZmluZWQiLCJab2ROdWxsIiwiWm9kQW55IiwiWm9kVW5rbm93biIsIlpvZE5ldmVyIiwiWm9kVm9pZCIsInNjaGVtYSIsImRlZXBQYXJ0aWFsaWZ5IiwiWm9kT2JqZWN0IiwibmV3U2hhcGUiLCJmaWVsZFNjaGVtYSIsIlpvZFR1cGxlIiwic2hhcGUiLCJzaGFwZUtleXMiLCJleHRyYUtleXMiLCJrZXlWYWxpZGF0b3IiLCJ1bmtub3duS2V5cyIsImNhdGNoYWxsIiwiX2IiLCJfYyIsIl9kIiwiZGVmYXVsdEVycm9yIiwiYXVnbWVudGF0aW9uIiwibWVyZ2luZyIsImluZGV4IiwibWFzayIsIm5ld0ZpZWxkIiwiY3JlYXRlWm9kRW51bSIsImhhbmRsZVJlc3VsdHMiLCJ1bmlvbkVycm9ycyIsImNoaWxkQ3R4IiwiZGlydHkiLCJ0eXBlcyIsImdldERpc2NyaW1pbmF0b3IiLCJ0eXBlIiwiWm9kTGF6eSIsIlpvZExpdGVyYWwiLCJab2RFbnVtIiwiWm9kTmF0aXZlRW51bSIsIlpvZERpc2NyaW1pbmF0ZWRVbmlvbiIsImRpc2NyaW1pbmF0b3IiLCJkaXNjcmltaW5hdG9yVmFsdWUiLCJvcHRpb25zTWFwIiwiZGlzY3JpbWluYXRvclZhbHVlcyIsIm1lcmdlVmFsdWVzIiwiYSIsImIiLCJhVHlwZSIsImJUeXBlIiwiYktleXMiLCJzaGFyZWRLZXlzIiwibmV3T2JqIiwic2hhcmVkVmFsdWUiLCJuZXdBcnJheSIsIml0ZW1BIiwiaXRlbUIiLCJoYW5kbGVQYXJzZWQiLCJwYXJzZWRMZWZ0IiwicGFyc2VkUmlnaHQiLCJtZXJnZWQiLCJsZWZ0IiwicmlnaHQiLCJpdGVtSW5kZXgiLCJyZXN0Iiwic2NoZW1hcyIsIlpvZFJlY29yZCIsImtleVR5cGUiLCJ2YWx1ZVR5cGUiLCJ0aGlyZCIsIlpvZE1hcCIsImZpbmFsTWFwIiwiWm9kU2V0IiwiZmluYWxpemVTZXQiLCJlbGVtZW50cyIsInBhcnNlZFNldCIsImVsZW1lbnQiLCJtaW5TaXplIiwibWF4U2l6ZSIsInNpemUiLCJab2RGdW5jdGlvbiIsIm1ha2VBcmdzSXNzdWUiLCJtYWtlUmV0dXJuc0lzc3VlIiwicmV0dXJucyIsImZuIiwibWUiLCJwYXJzZWRBcmdzIiwicGFyc2VkUmV0dXJucyIsInJldHVyblR5cGUiLCJmdW5jIiwiZ2V0dGVyIiwidmFsdWVzIiwiZXhwZWN0ZWRWYWx1ZXMiLCJlbnVtVmFsdWVzIiwib3B0IiwibmF0aXZlRW51bVZhbHVlcyIsInByb21pc2lmaWVkIiwiZWZmZWN0IiwiY2hlY2tDdHgiLCJhcmciLCJwcm9jZXNzZWQiLCJleGVjdXRlUmVmaW5lbWVudCIsImFjYyIsImlubmVyIiwiYmFzZSIsInByZXByb2Nlc3MiLCJuZXdDdHgiLCJab2ROYU4iLCJCUkFORCIsImluUmVzdWx0IiwiY3VzdG9tIiwiZmF0YWwiLCJwIiwiX2ZhdGFsIiwicDIiLCJsYXRlIiwiaW5zdGFuY2VPZlR5cGUiLCJjbHMiLCJzdHJpbmdUeXBlIiwibnVtYmVyVHlwZSIsIm5hblR5cGUiLCJiaWdJbnRUeXBlIiwiYm9vbGVhblR5cGUiLCJkYXRlVHlwZSIsInN5bWJvbFR5cGUiLCJ1bmRlZmluZWRUeXBlIiwibnVsbFR5cGUiLCJhbnlUeXBlIiwidW5rbm93blR5cGUiLCJuZXZlclR5cGUiLCJ2b2lkVHlwZSIsImFycmF5VHlwZSIsIm9iamVjdFR5cGUiLCJzdHJpY3RPYmplY3RUeXBlIiwidW5pb25UeXBlIiwiZGlzY3JpbWluYXRlZFVuaW9uVHlwZSIsImludGVyc2VjdGlvblR5cGUiLCJ0dXBsZVR5cGUiLCJyZWNvcmRUeXBlIiwibWFwVHlwZSIsInNldFR5cGUiLCJmdW5jdGlvblR5cGUiLCJsYXp5VHlwZSIsImxpdGVyYWxUeXBlIiwiZW51bVR5cGUiLCJuYXRpdmVFbnVtVHlwZSIsInByb21pc2VUeXBlIiwiZWZmZWN0c1R5cGUiLCJvcHRpb25hbFR5cGUiLCJudWxsYWJsZVR5cGUiLCJwcmVwcm9jZXNzVHlwZSIsInBpcGVsaW5lVHlwZSIsIm9zdHJpbmciLCJvbnVtYmVyIiwib2Jvb2xlYW4iLCJjb2VyY2UiLCJORVZFUiIsInoiLCJCb29rIiwiQ29pbmVkRXJhIiwiVXNhZ2VDYXRlZ29yeSIsIldyaXRpbmdTeXN0ZW0iLCJnZXRUcmFuc2xhdGVkRGF0YSIsImxhbmd1YWdlIl0sIm1hcHBpbmdzIjoiQUFBQSxJQUFJQTtBQUFBLENBQ0gsU0FBVUEsR0FBTTtBQUNiLEVBQUFBLEVBQUssY0FBYyxDQUFDQyxNQUFRQTtBQUM1QixXQUFTQyxFQUFTQyxHQUFNO0FBQUEsRUFBRztBQUMzQixFQUFBSCxFQUFLLFdBQVdFO0FBQ2hCLFdBQVNFLEVBQVlDLEdBQUk7QUFDckIsVUFBTSxJQUFJLE1BQUs7QUFBQSxFQUNsQjtBQUNELEVBQUFMLEVBQUssY0FBY0ksR0FDbkJKLEVBQUssY0FBYyxDQUFDTSxNQUFVO0FBQzFCLFVBQU1DLElBQU0sQ0FBQTtBQUNaLGVBQVdDLEtBQVFGO0FBQ2YsTUFBQUMsRUFBSUMsQ0FBSSxJQUFJQTtBQUVoQixXQUFPRDtBQUFBLEVBQ2YsR0FDSVAsRUFBSyxxQkFBcUIsQ0FBQ08sTUFBUTtBQUMvQixVQUFNRSxJQUFZVCxFQUFLLFdBQVdPLENBQUcsRUFBRSxP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