@kulupu-linku/sona 0.3.7 → 2.0.2

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