nextlove 2.1.9 → 2.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunk-7JYJ5SIL.mjs +144 -0
- package/dist/generators/index.js +937 -549
- package/dist/generators/index.mjs +945 -557
- package/dist/index.d.ts +1 -1
- package/dist/index.js +144 -13
- package/dist/index.mjs +17 -8
- package/dist/nextjs-exception-middleware/index.d.ts +83 -0
- package/dist/nextjs-exception-middleware/index.js +164 -0
- package/dist/nextjs-exception-middleware/index.mjs +20 -0
- package/exception-middleware.d.ts +1 -0
- package/package.json +23 -13
package/dist/generators/index.js
CHANGED
|
@@ -35,14 +35,377 @@ var init_cjs_shims = __esm({
|
|
|
35
35
|
}
|
|
36
36
|
});
|
|
37
37
|
|
|
38
|
-
// ../../node_modules/
|
|
39
|
-
var
|
|
40
|
-
"../../node_modules/
|
|
38
|
+
// ../../node_modules/ts-deepmerge/cjs/index.js
|
|
39
|
+
var require_cjs = __commonJS({
|
|
40
|
+
"../../node_modules/ts-deepmerge/cjs/index.js"(exports) {
|
|
41
41
|
"use strict";
|
|
42
42
|
init_cjs_shims();
|
|
43
|
-
|
|
44
|
-
|
|
43
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
44
|
+
var isObject = (obj) => {
|
|
45
|
+
if (typeof obj === "object" && obj !== null) {
|
|
46
|
+
if (typeof Object.getPrototypeOf === "function") {
|
|
47
|
+
const prototype = Object.getPrototypeOf(obj);
|
|
48
|
+
return prototype === Object.prototype || prototype === null;
|
|
49
|
+
}
|
|
50
|
+
return Object.prototype.toString.call(obj) === "[object Object]";
|
|
51
|
+
}
|
|
52
|
+
return false;
|
|
45
53
|
};
|
|
54
|
+
var merge = (...objects) => objects.reduce((result, current) => {
|
|
55
|
+
if (Array.isArray(current)) {
|
|
56
|
+
throw new TypeError("Arguments provided to ts-deepmerge must be objects, not arrays.");
|
|
57
|
+
}
|
|
58
|
+
Object.keys(current).forEach((key) => {
|
|
59
|
+
if (["__proto__", "constructor", "prototype"].includes(key)) {
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
if (Array.isArray(result[key]) && Array.isArray(current[key])) {
|
|
63
|
+
result[key] = merge.options.mergeArrays ? merge.options.uniqueArrayItems ? Array.from(new Set(result[key].concat(current[key]))) : [...result[key], ...current[key]] : current[key];
|
|
64
|
+
} else if (isObject(result[key]) && isObject(current[key])) {
|
|
65
|
+
result[key] = merge(result[key], current[key]);
|
|
66
|
+
} else {
|
|
67
|
+
result[key] = current[key] === void 0 ? merge.options.allowUndefinedOverrides ? current[key] : result[key] : current[key];
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
return result;
|
|
71
|
+
}, {});
|
|
72
|
+
var defaultOptions = {
|
|
73
|
+
allowUndefinedOverrides: true,
|
|
74
|
+
mergeArrays: true,
|
|
75
|
+
uniqueArrayItems: true
|
|
76
|
+
};
|
|
77
|
+
merge.options = defaultOptions;
|
|
78
|
+
merge.withOptions = (options, ...objects) => {
|
|
79
|
+
merge.options = Object.assign(Object.assign({}, defaultOptions), options);
|
|
80
|
+
const result = merge(...objects);
|
|
81
|
+
merge.options = defaultOptions;
|
|
82
|
+
return result;
|
|
83
|
+
};
|
|
84
|
+
exports.default = merge;
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
// ../../node_modules/@anatine/zod-openapi/src/lib/zod-openapi.js
|
|
89
|
+
var require_zod_openapi = __commonJS({
|
|
90
|
+
"../../node_modules/@anatine/zod-openapi/src/lib/zod-openapi.js"(exports) {
|
|
91
|
+
"use strict";
|
|
92
|
+
init_cjs_shims();
|
|
93
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
94
|
+
exports.generateSchema = exports.extendApi = void 0;
|
|
95
|
+
var ts_deepmerge_1 = require_cjs();
|
|
96
|
+
var zod_1 = require("zod");
|
|
97
|
+
function extendApi(schema, SchemaObject = {}) {
|
|
98
|
+
schema.metaOpenApi = Object.assign(schema.metaOpenApi || {}, SchemaObject);
|
|
99
|
+
return schema;
|
|
100
|
+
}
|
|
101
|
+
exports.extendApi = extendApi;
|
|
102
|
+
function iterateZodObject({ zodRef, useOutput }) {
|
|
103
|
+
return Object.keys(zodRef.shape).reduce((carry, key) => Object.assign(Object.assign({}, carry), { [key]: generateSchema2(zodRef.shape[key], useOutput) }), {});
|
|
104
|
+
}
|
|
105
|
+
function parseTransformation({ zodRef, schemas, useOutput }) {
|
|
106
|
+
const input = generateSchema2(zodRef._def.schema, useOutput);
|
|
107
|
+
let output = "undefined";
|
|
108
|
+
if (useOutput && zodRef._def.effect) {
|
|
109
|
+
const effect = zodRef._def.effect.type === "transform" ? zodRef._def.effect : null;
|
|
110
|
+
if (effect && "transform" in effect) {
|
|
111
|
+
try {
|
|
112
|
+
output = typeof effect.transform(
|
|
113
|
+
["integer", "number"].includes(`${input.type}`) ? 0 : "string" === input.type ? "" : "boolean" === input.type ? false : "object" === input.type ? {} : "null" === input.type ? null : "array" === input.type ? [] : void 0,
|
|
114
|
+
{ addIssue: () => void 0, path: [] }
|
|
115
|
+
);
|
|
116
|
+
} catch (e) {
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
return (0, ts_deepmerge_1.default)(Object.assign(Object.assign(Object.assign({}, zodRef.description ? { description: zodRef.description } : {}), input), ["number", "string", "boolean", "null"].includes(output) ? {
|
|
121
|
+
type: output
|
|
122
|
+
} : {}), ...schemas);
|
|
123
|
+
}
|
|
124
|
+
function parseString({ zodRef, schemas }) {
|
|
125
|
+
const baseSchema = {
|
|
126
|
+
type: "string"
|
|
127
|
+
};
|
|
128
|
+
const { checks = [] } = zodRef._def;
|
|
129
|
+
checks.forEach((item) => {
|
|
130
|
+
switch (item.kind) {
|
|
131
|
+
case "email":
|
|
132
|
+
baseSchema.format = "email";
|
|
133
|
+
break;
|
|
134
|
+
case "uuid":
|
|
135
|
+
baseSchema.format = "uuid";
|
|
136
|
+
break;
|
|
137
|
+
case "cuid":
|
|
138
|
+
baseSchema.format = "cuid";
|
|
139
|
+
break;
|
|
140
|
+
case "url":
|
|
141
|
+
baseSchema.format = "uri";
|
|
142
|
+
break;
|
|
143
|
+
case "datetime":
|
|
144
|
+
baseSchema.format = "date-time";
|
|
145
|
+
break;
|
|
146
|
+
case "length":
|
|
147
|
+
baseSchema.minLength = item.value;
|
|
148
|
+
baseSchema.maxLength = item.value;
|
|
149
|
+
break;
|
|
150
|
+
case "max":
|
|
151
|
+
baseSchema.maxLength = item.value;
|
|
152
|
+
break;
|
|
153
|
+
case "min":
|
|
154
|
+
baseSchema.minLength = item.value;
|
|
155
|
+
break;
|
|
156
|
+
case "regex":
|
|
157
|
+
baseSchema.pattern = item.regex.source;
|
|
158
|
+
break;
|
|
159
|
+
}
|
|
160
|
+
});
|
|
161
|
+
return (0, ts_deepmerge_1.default)(baseSchema, zodRef.description ? { description: zodRef.description } : {}, ...schemas);
|
|
162
|
+
}
|
|
163
|
+
function parseNumber({ zodRef, schemas }) {
|
|
164
|
+
const baseSchema = {
|
|
165
|
+
type: "number"
|
|
166
|
+
};
|
|
167
|
+
const { checks = [] } = zodRef._def;
|
|
168
|
+
checks.forEach((item) => {
|
|
169
|
+
switch (item.kind) {
|
|
170
|
+
case "max":
|
|
171
|
+
baseSchema.maximum = item.value;
|
|
172
|
+
if (!item.inclusive)
|
|
173
|
+
baseSchema.exclusiveMaximum = item.value;
|
|
174
|
+
break;
|
|
175
|
+
case "min":
|
|
176
|
+
baseSchema.minimum = item.value;
|
|
177
|
+
if (!item.inclusive)
|
|
178
|
+
baseSchema.exclusiveMinimum = item.value;
|
|
179
|
+
break;
|
|
180
|
+
case "int":
|
|
181
|
+
baseSchema.type = "integer";
|
|
182
|
+
break;
|
|
183
|
+
case "multipleOf":
|
|
184
|
+
baseSchema.multipleOf = item.value;
|
|
185
|
+
}
|
|
186
|
+
});
|
|
187
|
+
return (0, ts_deepmerge_1.default)(baseSchema, zodRef.description ? { description: zodRef.description } : {}, ...schemas);
|
|
188
|
+
}
|
|
189
|
+
function parseObject({ zodRef, schemas, useOutput }) {
|
|
190
|
+
var _a;
|
|
191
|
+
let additionalProperties;
|
|
192
|
+
if (!(zodRef._def.catchall instanceof zod_1.z.ZodNever || ((_a = zodRef._def.catchall) === null || _a === void 0 ? void 0 : _a._def.typeName) === "ZodNever"))
|
|
193
|
+
additionalProperties = generateSchema2(zodRef._def.catchall, useOutput);
|
|
194
|
+
else if (zodRef._def.unknownKeys === "passthrough")
|
|
195
|
+
additionalProperties = true;
|
|
196
|
+
else if (zodRef._def.unknownKeys === "strict")
|
|
197
|
+
additionalProperties = false;
|
|
198
|
+
additionalProperties = additionalProperties != null ? { additionalProperties } : {};
|
|
199
|
+
const requiredProperties = Object.keys(zodRef.shape).filter((key) => {
|
|
200
|
+
const item = zodRef.shape[key];
|
|
201
|
+
return !(item.isOptional() || item instanceof zod_1.z.ZodDefault || item._def.typeName === "ZodDefault") && !(item instanceof zod_1.z.ZodNever || item._def.typeName === "ZodDefault");
|
|
202
|
+
});
|
|
203
|
+
const required = requiredProperties.length > 0 ? { required: requiredProperties } : {};
|
|
204
|
+
return (0, ts_deepmerge_1.default)(Object.assign(Object.assign({ type: "object", properties: iterateZodObject({
|
|
205
|
+
zodRef,
|
|
206
|
+
schemas,
|
|
207
|
+
useOutput
|
|
208
|
+
}) }, required), additionalProperties), zodRef.description ? { description: zodRef.description } : {}, ...schemas);
|
|
209
|
+
}
|
|
210
|
+
function parseRecord({ zodRef, schemas, useOutput }) {
|
|
211
|
+
return (0, ts_deepmerge_1.default)({
|
|
212
|
+
type: "object",
|
|
213
|
+
additionalProperties: zodRef._def.valueType instanceof zod_1.z.ZodUnknown ? {} : generateSchema2(zodRef._def.valueType, useOutput)
|
|
214
|
+
}, zodRef.description ? { description: zodRef.description } : {}, ...schemas);
|
|
215
|
+
}
|
|
216
|
+
function parseBigInt({ zodRef, schemas }) {
|
|
217
|
+
return (0, ts_deepmerge_1.default)({ type: "integer", format: "int64" }, zodRef.description ? { description: zodRef.description } : {}, ...schemas);
|
|
218
|
+
}
|
|
219
|
+
function parseBoolean({ zodRef, schemas }) {
|
|
220
|
+
return (0, ts_deepmerge_1.default)({ type: "boolean" }, zodRef.description ? { description: zodRef.description } : {}, ...schemas);
|
|
221
|
+
}
|
|
222
|
+
function parseDate({ zodRef, schemas }) {
|
|
223
|
+
return (0, ts_deepmerge_1.default)({ type: "string", format: "date-time" }, zodRef.description ? { description: zodRef.description } : {}, ...schemas);
|
|
224
|
+
}
|
|
225
|
+
function parseNull({ zodRef, schemas }) {
|
|
226
|
+
return (0, ts_deepmerge_1.default)({
|
|
227
|
+
type: "string",
|
|
228
|
+
format: "null",
|
|
229
|
+
nullable: true
|
|
230
|
+
}, zodRef.description ? { description: zodRef.description } : {}, ...schemas);
|
|
231
|
+
}
|
|
232
|
+
function parseOptionalNullable({ schemas, zodRef, useOutput }) {
|
|
233
|
+
return (0, ts_deepmerge_1.default)(generateSchema2(zodRef.unwrap(), useOutput), zodRef.description ? { description: zodRef.description } : {}, ...schemas);
|
|
234
|
+
}
|
|
235
|
+
function parseDefault({ schemas, zodRef, useOutput }) {
|
|
236
|
+
return (0, ts_deepmerge_1.default)(Object.assign({ default: zodRef._def.defaultValue() }, generateSchema2(zodRef._def.innerType, useOutput)), zodRef.description ? { description: zodRef.description } : {}, ...schemas);
|
|
237
|
+
}
|
|
238
|
+
function parseArray({ schemas, zodRef, useOutput }) {
|
|
239
|
+
const constraints = {};
|
|
240
|
+
if (zodRef._def.exactLength != null) {
|
|
241
|
+
constraints.minItems = zodRef._def.exactLength.value;
|
|
242
|
+
constraints.maxItems = zodRef._def.exactLength.value;
|
|
243
|
+
}
|
|
244
|
+
if (zodRef._def.minLength != null)
|
|
245
|
+
constraints.minItems = zodRef._def.minLength.value;
|
|
246
|
+
if (zodRef._def.maxLength != null)
|
|
247
|
+
constraints.maxItems = zodRef._def.maxLength.value;
|
|
248
|
+
return (0, ts_deepmerge_1.default)(Object.assign({ type: "array", items: generateSchema2(zodRef.element, useOutput) }, constraints), zodRef.description ? { description: zodRef.description } : {}, ...schemas);
|
|
249
|
+
}
|
|
250
|
+
function parseLiteral({ schemas, zodRef }) {
|
|
251
|
+
return (0, ts_deepmerge_1.default)({
|
|
252
|
+
type: typeof zodRef._def.value,
|
|
253
|
+
enum: [zodRef._def.value]
|
|
254
|
+
}, zodRef.description ? { description: zodRef.description } : {}, ...schemas);
|
|
255
|
+
}
|
|
256
|
+
function parseEnum({ schemas, zodRef }) {
|
|
257
|
+
return (0, ts_deepmerge_1.default)({
|
|
258
|
+
type: typeof Object.values(zodRef._def.values)[0],
|
|
259
|
+
enum: Object.values(zodRef._def.values)
|
|
260
|
+
}, zodRef.description ? { description: zodRef.description } : {}, ...schemas);
|
|
261
|
+
}
|
|
262
|
+
function parseIntersection({ schemas, zodRef, useOutput }) {
|
|
263
|
+
return (0, ts_deepmerge_1.default)({
|
|
264
|
+
allOf: [
|
|
265
|
+
generateSchema2(zodRef._def.left, useOutput),
|
|
266
|
+
generateSchema2(zodRef._def.right, useOutput)
|
|
267
|
+
]
|
|
268
|
+
}, zodRef.description ? { description: zodRef.description } : {}, ...schemas);
|
|
269
|
+
}
|
|
270
|
+
function parseUnion({ schemas, zodRef, useOutput }) {
|
|
271
|
+
const contents = zodRef._def.options;
|
|
272
|
+
if (contents.reduce((prev, content) => prev && content._def.typeName === "ZodLiteral", true)) {
|
|
273
|
+
const literals = contents;
|
|
274
|
+
const type = literals.reduce((prev, content) => !prev || prev === typeof content._def.value ? typeof content._def.value : null, null);
|
|
275
|
+
if (type) {
|
|
276
|
+
return (0, ts_deepmerge_1.default)({
|
|
277
|
+
type,
|
|
278
|
+
enum: literals.map((literal) => literal._def.value)
|
|
279
|
+
}, zodRef.description ? { description: zodRef.description } : {}, ...schemas);
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
return (0, ts_deepmerge_1.default)({
|
|
283
|
+
oneOf: contents.map((schema) => generateSchema2(schema, useOutput))
|
|
284
|
+
}, zodRef.description ? { description: zodRef.description } : {}, ...schemas);
|
|
285
|
+
}
|
|
286
|
+
function parseDiscriminatedUnion({ schemas, zodRef, useOutput }) {
|
|
287
|
+
return (0, ts_deepmerge_1.default)({
|
|
288
|
+
discriminator: {
|
|
289
|
+
propertyName: zodRef._def.discriminator
|
|
290
|
+
},
|
|
291
|
+
oneOf: Array.from(zodRef._def.options.values()).map((schema) => generateSchema2(schema, useOutput))
|
|
292
|
+
}, zodRef.description ? { description: zodRef.description } : {}, ...schemas);
|
|
293
|
+
}
|
|
294
|
+
function parseNever({ zodRef, schemas }) {
|
|
295
|
+
return (0, ts_deepmerge_1.default)({ readOnly: true }, zodRef.description ? { description: zodRef.description } : {}, ...schemas);
|
|
296
|
+
}
|
|
297
|
+
function parseBranded({ schemas, zodRef }) {
|
|
298
|
+
return (0, ts_deepmerge_1.default)(generateSchema2(zodRef._def.type), ...schemas);
|
|
299
|
+
}
|
|
300
|
+
function catchAllParser({ zodRef, schemas }) {
|
|
301
|
+
return (0, ts_deepmerge_1.default)(zodRef.description ? { description: zodRef.description } : {}, ...schemas);
|
|
302
|
+
}
|
|
303
|
+
var workerMap = {
|
|
304
|
+
ZodObject: parseObject,
|
|
305
|
+
ZodRecord: parseRecord,
|
|
306
|
+
ZodString: parseString,
|
|
307
|
+
ZodNumber: parseNumber,
|
|
308
|
+
ZodBigInt: parseBigInt,
|
|
309
|
+
ZodBoolean: parseBoolean,
|
|
310
|
+
ZodDate: parseDate,
|
|
311
|
+
ZodNull: parseNull,
|
|
312
|
+
ZodOptional: parseOptionalNullable,
|
|
313
|
+
ZodNullable: parseOptionalNullable,
|
|
314
|
+
ZodDefault: parseDefault,
|
|
315
|
+
ZodArray: parseArray,
|
|
316
|
+
ZodLiteral: parseLiteral,
|
|
317
|
+
ZodEnum: parseEnum,
|
|
318
|
+
ZodNativeEnum: parseEnum,
|
|
319
|
+
ZodTransformer: parseTransformation,
|
|
320
|
+
ZodEffects: parseTransformation,
|
|
321
|
+
ZodIntersection: parseIntersection,
|
|
322
|
+
ZodUnion: parseUnion,
|
|
323
|
+
ZodDiscriminatedUnion: parseDiscriminatedUnion,
|
|
324
|
+
ZodNever: parseNever,
|
|
325
|
+
ZodBranded: parseBranded,
|
|
326
|
+
ZodUndefined: catchAllParser,
|
|
327
|
+
ZodTuple: catchAllParser,
|
|
328
|
+
ZodMap: catchAllParser,
|
|
329
|
+
ZodFunction: catchAllParser,
|
|
330
|
+
ZodLazy: catchAllParser,
|
|
331
|
+
ZodPromise: catchAllParser,
|
|
332
|
+
ZodAny: catchAllParser,
|
|
333
|
+
ZodUnknown: catchAllParser,
|
|
334
|
+
ZodVoid: catchAllParser
|
|
335
|
+
};
|
|
336
|
+
function generateSchema2(zodRef, useOutput) {
|
|
337
|
+
const { metaOpenApi = {} } = zodRef;
|
|
338
|
+
const schemas = [
|
|
339
|
+
zodRef.isNullable && zodRef.isNullable() ? { nullable: true } : {},
|
|
340
|
+
...Array.isArray(metaOpenApi) ? metaOpenApi : [metaOpenApi]
|
|
341
|
+
];
|
|
342
|
+
try {
|
|
343
|
+
const typeName = zodRef._def.typeName;
|
|
344
|
+
if (typeName in workerMap) {
|
|
345
|
+
return workerMap[typeName]({
|
|
346
|
+
zodRef,
|
|
347
|
+
schemas,
|
|
348
|
+
useOutput
|
|
349
|
+
});
|
|
350
|
+
}
|
|
351
|
+
return catchAllParser({ zodRef, schemas });
|
|
352
|
+
} catch (err) {
|
|
353
|
+
console.error(err);
|
|
354
|
+
return catchAllParser({ zodRef, schemas });
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
exports.generateSchema = generateSchema2;
|
|
358
|
+
}
|
|
359
|
+
});
|
|
360
|
+
|
|
361
|
+
// ../../node_modules/@anatine/zod-openapi/src/lib/zod-extensions.js
|
|
362
|
+
var require_zod_extensions = __commonJS({
|
|
363
|
+
"../../node_modules/@anatine/zod-openapi/src/lib/zod-extensions.js"(exports) {
|
|
364
|
+
"use strict";
|
|
365
|
+
init_cjs_shims();
|
|
366
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
367
|
+
exports.extendZodWithOpenApi = void 0;
|
|
368
|
+
var zod_openapi_1 = require_zod_openapi();
|
|
369
|
+
function extendZodWithOpenApi(zod, forceOverride = false) {
|
|
370
|
+
if (!forceOverride && typeof zod.ZodSchema.prototype.openapi !== "undefined") {
|
|
371
|
+
return;
|
|
372
|
+
}
|
|
373
|
+
zod.ZodSchema.prototype.openapi = function(metadata) {
|
|
374
|
+
return (0, zod_openapi_1.extendApi)(this, metadata);
|
|
375
|
+
};
|
|
376
|
+
}
|
|
377
|
+
exports.extendZodWithOpenApi = extendZodWithOpenApi;
|
|
378
|
+
}
|
|
379
|
+
});
|
|
380
|
+
|
|
381
|
+
// ../../node_modules/@anatine/zod-openapi/src/index.js
|
|
382
|
+
var require_src = __commonJS({
|
|
383
|
+
"../../node_modules/@anatine/zod-openapi/src/index.js"(exports) {
|
|
384
|
+
"use strict";
|
|
385
|
+
init_cjs_shims();
|
|
386
|
+
var __createBinding = exports && exports.__createBinding || (Object.create ? function(o, m, k, k2) {
|
|
387
|
+
if (k2 === void 0)
|
|
388
|
+
k2 = k;
|
|
389
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
390
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
391
|
+
desc = { enumerable: true, get: function() {
|
|
392
|
+
return m[k];
|
|
393
|
+
} };
|
|
394
|
+
}
|
|
395
|
+
Object.defineProperty(o, k2, desc);
|
|
396
|
+
} : function(o, m, k, k2) {
|
|
397
|
+
if (k2 === void 0)
|
|
398
|
+
k2 = k;
|
|
399
|
+
o[k2] = m[k];
|
|
400
|
+
});
|
|
401
|
+
var __exportStar = exports && exports.__exportStar || function(m, exports2) {
|
|
402
|
+
for (var p in m)
|
|
403
|
+
if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports2, p))
|
|
404
|
+
__createBinding(exports2, m, p);
|
|
405
|
+
};
|
|
406
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
407
|
+
__exportStar(require_zod_openapi(), exports);
|
|
408
|
+
__exportStar(require_zod_extensions(), exports);
|
|
46
409
|
}
|
|
47
410
|
});
|
|
48
411
|
|
|
@@ -54,8 +417,8 @@ var require_merge2 = __commonJS({
|
|
|
54
417
|
var Stream = require("stream");
|
|
55
418
|
var PassThrough = Stream.PassThrough;
|
|
56
419
|
var slice = Array.prototype.slice;
|
|
57
|
-
module2.exports =
|
|
58
|
-
function
|
|
420
|
+
module2.exports = merge22;
|
|
421
|
+
function merge22() {
|
|
59
422
|
const streamsQueue = [];
|
|
60
423
|
const args = slice.call(arguments);
|
|
61
424
|
let merging = false;
|
|
@@ -166,9 +529,9 @@ var require_merge2 = __commonJS({
|
|
|
166
529
|
}
|
|
167
530
|
});
|
|
168
531
|
|
|
169
|
-
//
|
|
532
|
+
// node_modules/fast-glob/out/utils/array.js
|
|
170
533
|
var require_array = __commonJS({
|
|
171
|
-
"
|
|
534
|
+
"node_modules/fast-glob/out/utils/array.js"(exports) {
|
|
172
535
|
"use strict";
|
|
173
536
|
init_cjs_shims();
|
|
174
537
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
@@ -194,9 +557,9 @@ var require_array = __commonJS({
|
|
|
194
557
|
}
|
|
195
558
|
});
|
|
196
559
|
|
|
197
|
-
//
|
|
560
|
+
// node_modules/fast-glob/out/utils/errno.js
|
|
198
561
|
var require_errno = __commonJS({
|
|
199
|
-
"
|
|
562
|
+
"node_modules/fast-glob/out/utils/errno.js"(exports) {
|
|
200
563
|
"use strict";
|
|
201
564
|
init_cjs_shims();
|
|
202
565
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
@@ -208,9 +571,9 @@ var require_errno = __commonJS({
|
|
|
208
571
|
}
|
|
209
572
|
});
|
|
210
573
|
|
|
211
|
-
//
|
|
574
|
+
// node_modules/fast-glob/out/utils/fs.js
|
|
212
575
|
var require_fs = __commonJS({
|
|
213
|
-
"
|
|
576
|
+
"node_modules/fast-glob/out/utils/fs.js"(exports) {
|
|
214
577
|
"use strict";
|
|
215
578
|
init_cjs_shims();
|
|
216
579
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
@@ -234,28 +597,29 @@ var require_fs = __commonJS({
|
|
|
234
597
|
}
|
|
235
598
|
});
|
|
236
599
|
|
|
237
|
-
//
|
|
600
|
+
// node_modules/fast-glob/out/utils/path.js
|
|
238
601
|
var require_path = __commonJS({
|
|
239
|
-
"
|
|
602
|
+
"node_modules/fast-glob/out/utils/path.js"(exports) {
|
|
240
603
|
"use strict";
|
|
241
604
|
init_cjs_shims();
|
|
242
605
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
243
|
-
exports.
|
|
244
|
-
var
|
|
606
|
+
exports.convertPosixPathToPattern = exports.convertWindowsPathToPattern = exports.convertPathToPattern = exports.escapePosixPath = exports.escapeWindowsPath = exports.escape = exports.removeLeadingDotSegment = exports.makeAbsolute = exports.unixify = void 0;
|
|
607
|
+
var os2 = require("os");
|
|
608
|
+
var path4 = require("path");
|
|
609
|
+
var IS_WINDOWS_PLATFORM = os2.platform() === "win32";
|
|
245
610
|
var LEADING_DOT_SEGMENT_CHARACTERS_COUNT = 2;
|
|
246
|
-
var
|
|
611
|
+
var POSIX_UNESCAPED_GLOB_SYMBOLS_RE = /(\\?)([()*?[\]{|}]|^!|[!+@](?=\()|\\(?![!()*+?@[\]{|}]))/g;
|
|
612
|
+
var WINDOWS_UNESCAPED_GLOB_SYMBOLS_RE = /(\\?)([(){}]|^!|[!+@](?=\())/g;
|
|
613
|
+
var DOS_DEVICE_PATH_RE = /^\\\\([.?])/;
|
|
614
|
+
var WINDOWS_BACKSLASHES_RE = /\\(?![!()+@{}])/g;
|
|
247
615
|
function unixify(filepath) {
|
|
248
616
|
return filepath.replace(/\\/g, "/");
|
|
249
617
|
}
|
|
250
618
|
exports.unixify = unixify;
|
|
251
619
|
function makeAbsolute(cwd, filepath) {
|
|
252
|
-
return
|
|
620
|
+
return path4.resolve(cwd, filepath);
|
|
253
621
|
}
|
|
254
622
|
exports.makeAbsolute = makeAbsolute;
|
|
255
|
-
function escape(pattern) {
|
|
256
|
-
return pattern.replace(UNESCAPED_GLOB_SYMBOLS_RE, "\\$2");
|
|
257
|
-
}
|
|
258
|
-
exports.escape = escape;
|
|
259
623
|
function removeLeadingDotSegment(entry) {
|
|
260
624
|
if (entry.charAt(0) === ".") {
|
|
261
625
|
const secondCharactery = entry.charAt(1);
|
|
@@ -266,6 +630,24 @@ var require_path = __commonJS({
|
|
|
266
630
|
return entry;
|
|
267
631
|
}
|
|
268
632
|
exports.removeLeadingDotSegment = removeLeadingDotSegment;
|
|
633
|
+
exports.escape = IS_WINDOWS_PLATFORM ? escapeWindowsPath : escapePosixPath;
|
|
634
|
+
function escapeWindowsPath(pattern) {
|
|
635
|
+
return pattern.replace(WINDOWS_UNESCAPED_GLOB_SYMBOLS_RE, "\\$2");
|
|
636
|
+
}
|
|
637
|
+
exports.escapeWindowsPath = escapeWindowsPath;
|
|
638
|
+
function escapePosixPath(pattern) {
|
|
639
|
+
return pattern.replace(POSIX_UNESCAPED_GLOB_SYMBOLS_RE, "\\$2");
|
|
640
|
+
}
|
|
641
|
+
exports.escapePosixPath = escapePosixPath;
|
|
642
|
+
exports.convertPathToPattern = IS_WINDOWS_PLATFORM ? convertWindowsPathToPattern : convertPosixPathToPattern;
|
|
643
|
+
function convertWindowsPathToPattern(filepath) {
|
|
644
|
+
return escapeWindowsPath(filepath).replace(DOS_DEVICE_PATH_RE, "//$1").replace(WINDOWS_BACKSLASHES_RE, "/");
|
|
645
|
+
}
|
|
646
|
+
exports.convertWindowsPathToPattern = convertWindowsPathToPattern;
|
|
647
|
+
function convertPosixPathToPattern(filepath) {
|
|
648
|
+
return escapePosixPath(filepath);
|
|
649
|
+
}
|
|
650
|
+
exports.convertPosixPathToPattern = convertPosixPathToPattern;
|
|
269
651
|
}
|
|
270
652
|
});
|
|
271
653
|
|
|
@@ -420,26 +802,26 @@ var require_is_glob = __commonJS({
|
|
|
420
802
|
}
|
|
421
803
|
});
|
|
422
804
|
|
|
423
|
-
//
|
|
805
|
+
// node_modules/fast-glob/node_modules/glob-parent/index.js
|
|
424
806
|
var require_glob_parent = __commonJS({
|
|
425
|
-
"
|
|
807
|
+
"node_modules/fast-glob/node_modules/glob-parent/index.js"(exports, module2) {
|
|
426
808
|
"use strict";
|
|
427
809
|
init_cjs_shims();
|
|
428
810
|
var isGlob = require_is_glob();
|
|
429
811
|
var pathPosixDirname = require("path").posix.dirname;
|
|
430
812
|
var isWin32 = require("os").platform() === "win32";
|
|
431
|
-
var
|
|
813
|
+
var slash2 = "/";
|
|
432
814
|
var backslash = /\\/g;
|
|
433
815
|
var enclosure = /[\{\[].*[\}\]]$/;
|
|
434
816
|
var globby2 = /(^|[^\\])([\{\[]|\([^\)]+$)/;
|
|
435
817
|
var escaped = /\\([\!\*\?\|\[\]\(\)\{\}])/g;
|
|
436
818
|
module2.exports = function globParent(str, opts) {
|
|
437
819
|
var options = Object.assign({ flipBackslashes: true }, opts);
|
|
438
|
-
if (options.flipBackslashes && isWin32 && str.indexOf(
|
|
439
|
-
str = str.replace(backslash,
|
|
820
|
+
if (options.flipBackslashes && isWin32 && str.indexOf(slash2) < 0) {
|
|
821
|
+
str = str.replace(backslash, slash2);
|
|
440
822
|
}
|
|
441
823
|
if (enclosure.test(str)) {
|
|
442
|
-
str +=
|
|
824
|
+
str += slash2;
|
|
443
825
|
}
|
|
444
826
|
str += "a";
|
|
445
827
|
do {
|
|
@@ -1511,7 +1893,7 @@ var require_constants2 = __commonJS({
|
|
|
1511
1893
|
"../../node_modules/picomatch/lib/constants.js"(exports, module2) {
|
|
1512
1894
|
"use strict";
|
|
1513
1895
|
init_cjs_shims();
|
|
1514
|
-
var
|
|
1896
|
+
var path4 = require("path");
|
|
1515
1897
|
var WIN_SLASH = "\\\\/";
|
|
1516
1898
|
var WIN_NO_SLASH = `[^${WIN_SLASH}]`;
|
|
1517
1899
|
var DOT_LITERAL = "\\.";
|
|
@@ -1633,7 +2015,7 @@ var require_constants2 = __commonJS({
|
|
|
1633
2015
|
CHAR_UNDERSCORE: 95,
|
|
1634
2016
|
CHAR_VERTICAL_LINE: 124,
|
|
1635
2017
|
CHAR_ZERO_WIDTH_NOBREAK_SPACE: 65279,
|
|
1636
|
-
SEP:
|
|
2018
|
+
SEP: path4.sep,
|
|
1637
2019
|
extglobChars(chars) {
|
|
1638
2020
|
return {
|
|
1639
2021
|
"!": { type: "negate", open: "(?:(?!(?:", close: `))${chars.STAR})` },
|
|
@@ -1655,7 +2037,7 @@ var require_utils2 = __commonJS({
|
|
|
1655
2037
|
"../../node_modules/picomatch/lib/utils.js"(exports) {
|
|
1656
2038
|
"use strict";
|
|
1657
2039
|
init_cjs_shims();
|
|
1658
|
-
var
|
|
2040
|
+
var path4 = require("path");
|
|
1659
2041
|
var win32 = process.platform === "win32";
|
|
1660
2042
|
var {
|
|
1661
2043
|
REGEX_BACKSLASH,
|
|
@@ -1684,7 +2066,7 @@ var require_utils2 = __commonJS({
|
|
|
1684
2066
|
if (options && typeof options.windows === "boolean") {
|
|
1685
2067
|
return options.windows;
|
|
1686
2068
|
}
|
|
1687
|
-
return win32 === true ||
|
|
2069
|
+
return win32 === true || path4.sep === "\\";
|
|
1688
2070
|
};
|
|
1689
2071
|
exports.escapeLast = (input, char, lastIdx) => {
|
|
1690
2072
|
const idx = input.lastIndexOf(char, lastIdx);
|
|
@@ -2820,7 +3202,7 @@ var require_picomatch = __commonJS({
|
|
|
2820
3202
|
"../../node_modules/picomatch/lib/picomatch.js"(exports, module2) {
|
|
2821
3203
|
"use strict";
|
|
2822
3204
|
init_cjs_shims();
|
|
2823
|
-
var
|
|
3205
|
+
var path4 = require("path");
|
|
2824
3206
|
var scan = require_scan();
|
|
2825
3207
|
var parse = require_parse2();
|
|
2826
3208
|
var utils = require_utils2();
|
|
@@ -2906,7 +3288,7 @@ var require_picomatch = __commonJS({
|
|
|
2906
3288
|
};
|
|
2907
3289
|
picomatch.matchBase = (input, glob, options, posix = utils.isWindows(options)) => {
|
|
2908
3290
|
const regex = glob instanceof RegExp ? glob : picomatch.makeRe(glob, options);
|
|
2909
|
-
return regex.test(
|
|
3291
|
+
return regex.test(path4.basename(input));
|
|
2910
3292
|
};
|
|
2911
3293
|
picomatch.isMatch = (str, patterns, options) => picomatch(patterns, options)(str);
|
|
2912
3294
|
picomatch.parse = (pattern, options) => {
|
|
@@ -3132,14 +3514,14 @@ var require_micromatch = __commonJS({
|
|
|
3132
3514
|
}
|
|
3133
3515
|
});
|
|
3134
3516
|
|
|
3135
|
-
//
|
|
3517
|
+
// node_modules/fast-glob/out/utils/pattern.js
|
|
3136
3518
|
var require_pattern = __commonJS({
|
|
3137
|
-
"
|
|
3519
|
+
"node_modules/fast-glob/out/utils/pattern.js"(exports) {
|
|
3138
3520
|
"use strict";
|
|
3139
3521
|
init_cjs_shims();
|
|
3140
3522
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3141
|
-
exports.matchAny = exports.convertPatternsToRe = exports.makeRe = exports.getPatternParts = exports.expandBraceExpansion = exports.expandPatternsWithBraceExpansion = exports.isAffectDepthOfReadingPattern = exports.endsWithSlashGlobStar = exports.hasGlobStar = exports.getBaseDirectory = exports.isPatternRelatedToParentDirectory = exports.getPatternsOutsideCurrentDirectory = exports.getPatternsInsideCurrentDirectory = exports.getPositivePatterns = exports.getNegativePatterns = exports.isPositivePattern = exports.isNegativePattern = exports.convertToNegativePattern = exports.convertToPositivePattern = exports.isDynamicPattern = exports.isStaticPattern = void 0;
|
|
3142
|
-
var
|
|
3523
|
+
exports.removeDuplicateSlashes = exports.matchAny = exports.convertPatternsToRe = exports.makeRe = exports.getPatternParts = exports.expandBraceExpansion = exports.expandPatternsWithBraceExpansion = exports.isAffectDepthOfReadingPattern = exports.endsWithSlashGlobStar = exports.hasGlobStar = exports.getBaseDirectory = exports.isPatternRelatedToParentDirectory = exports.getPatternsOutsideCurrentDirectory = exports.getPatternsInsideCurrentDirectory = exports.getPositivePatterns = exports.getNegativePatterns = exports.isPositivePattern = exports.isNegativePattern = exports.convertToNegativePattern = exports.convertToPositivePattern = exports.isDynamicPattern = exports.isStaticPattern = void 0;
|
|
3524
|
+
var path4 = require("path");
|
|
3143
3525
|
var globParent = require_glob_parent();
|
|
3144
3526
|
var micromatch = require_micromatch();
|
|
3145
3527
|
var GLOBSTAR = "**";
|
|
@@ -3149,11 +3531,12 @@ var require_pattern = __commonJS({
|
|
|
3149
3531
|
var REGEX_GROUP_SYMBOLS_RE = /(?:^|[^!*+?@])\([^(]*\|[^|]*\)/;
|
|
3150
3532
|
var GLOB_EXTENSION_SYMBOLS_RE = /[!*+?@]\([^(]*\)/;
|
|
3151
3533
|
var BRACE_EXPANSION_SEPARATORS_RE = /,|\.\./;
|
|
3534
|
+
var DOUBLE_SLASH_RE = /(?!^)\/{2,}/g;
|
|
3152
3535
|
function isStaticPattern(pattern, options = {}) {
|
|
3153
|
-
return !
|
|
3536
|
+
return !isDynamicPattern2(pattern, options);
|
|
3154
3537
|
}
|
|
3155
3538
|
exports.isStaticPattern = isStaticPattern;
|
|
3156
|
-
function
|
|
3539
|
+
function isDynamicPattern2(pattern, options = {}) {
|
|
3157
3540
|
if (pattern === "") {
|
|
3158
3541
|
return false;
|
|
3159
3542
|
}
|
|
@@ -3171,7 +3554,7 @@ var require_pattern = __commonJS({
|
|
|
3171
3554
|
}
|
|
3172
3555
|
return false;
|
|
3173
3556
|
}
|
|
3174
|
-
exports.isDynamicPattern =
|
|
3557
|
+
exports.isDynamicPattern = isDynamicPattern2;
|
|
3175
3558
|
function hasBraceExpansion(pattern) {
|
|
3176
3559
|
const openingBraceIndex = pattern.indexOf("{");
|
|
3177
3560
|
if (openingBraceIndex === -1) {
|
|
@@ -3185,23 +3568,23 @@ var require_pattern = __commonJS({
|
|
|
3185
3568
|
return BRACE_EXPANSION_SEPARATORS_RE.test(braceContent);
|
|
3186
3569
|
}
|
|
3187
3570
|
function convertToPositivePattern(pattern) {
|
|
3188
|
-
return
|
|
3571
|
+
return isNegativePattern2(pattern) ? pattern.slice(1) : pattern;
|
|
3189
3572
|
}
|
|
3190
3573
|
exports.convertToPositivePattern = convertToPositivePattern;
|
|
3191
3574
|
function convertToNegativePattern(pattern) {
|
|
3192
3575
|
return "!" + pattern;
|
|
3193
3576
|
}
|
|
3194
3577
|
exports.convertToNegativePattern = convertToNegativePattern;
|
|
3195
|
-
function
|
|
3578
|
+
function isNegativePattern2(pattern) {
|
|
3196
3579
|
return pattern.startsWith("!") && pattern[1] !== "(";
|
|
3197
3580
|
}
|
|
3198
|
-
exports.isNegativePattern =
|
|
3581
|
+
exports.isNegativePattern = isNegativePattern2;
|
|
3199
3582
|
function isPositivePattern(pattern) {
|
|
3200
|
-
return !
|
|
3583
|
+
return !isNegativePattern2(pattern);
|
|
3201
3584
|
}
|
|
3202
3585
|
exports.isPositivePattern = isPositivePattern;
|
|
3203
3586
|
function getNegativePatterns(patterns) {
|
|
3204
|
-
return patterns.filter(
|
|
3587
|
+
return patterns.filter(isNegativePattern2);
|
|
3205
3588
|
}
|
|
3206
3589
|
exports.getNegativePatterns = getNegativePatterns;
|
|
3207
3590
|
function getPositivePatterns(patterns) {
|
|
@@ -3233,7 +3616,7 @@ var require_pattern = __commonJS({
|
|
|
3233
3616
|
}
|
|
3234
3617
|
exports.endsWithSlashGlobStar = endsWithSlashGlobStar;
|
|
3235
3618
|
function isAffectDepthOfReadingPattern(pattern) {
|
|
3236
|
-
const basename =
|
|
3619
|
+
const basename = path4.basename(pattern);
|
|
3237
3620
|
return endsWithSlashGlobStar(pattern) || isStaticPattern(basename);
|
|
3238
3621
|
}
|
|
3239
3622
|
exports.isAffectDepthOfReadingPattern = isAffectDepthOfReadingPattern;
|
|
@@ -3244,10 +3627,9 @@ var require_pattern = __commonJS({
|
|
|
3244
3627
|
}
|
|
3245
3628
|
exports.expandPatternsWithBraceExpansion = expandPatternsWithBraceExpansion;
|
|
3246
3629
|
function expandBraceExpansion(pattern) {
|
|
3247
|
-
|
|
3248
|
-
|
|
3249
|
-
|
|
3250
|
-
});
|
|
3630
|
+
const patterns = micromatch.braces(pattern, { expand: true, nodupes: true });
|
|
3631
|
+
patterns.sort((a, b) => a.length - b.length);
|
|
3632
|
+
return patterns.filter((pattern2) => pattern2 !== "");
|
|
3251
3633
|
}
|
|
3252
3634
|
exports.expandBraceExpansion = expandBraceExpansion;
|
|
3253
3635
|
function getPatternParts(pattern, options) {
|
|
@@ -3274,19 +3656,23 @@ var require_pattern = __commonJS({
|
|
|
3274
3656
|
return patternsRe.some((patternRe) => patternRe.test(entry));
|
|
3275
3657
|
}
|
|
3276
3658
|
exports.matchAny = matchAny;
|
|
3659
|
+
function removeDuplicateSlashes(pattern) {
|
|
3660
|
+
return pattern.replace(DOUBLE_SLASH_RE, "/");
|
|
3661
|
+
}
|
|
3662
|
+
exports.removeDuplicateSlashes = removeDuplicateSlashes;
|
|
3277
3663
|
}
|
|
3278
3664
|
});
|
|
3279
3665
|
|
|
3280
|
-
//
|
|
3666
|
+
// node_modules/fast-glob/out/utils/stream.js
|
|
3281
3667
|
var require_stream = __commonJS({
|
|
3282
|
-
"
|
|
3668
|
+
"node_modules/fast-glob/out/utils/stream.js"(exports) {
|
|
3283
3669
|
"use strict";
|
|
3284
3670
|
init_cjs_shims();
|
|
3285
3671
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3286
3672
|
exports.merge = void 0;
|
|
3287
|
-
var
|
|
3673
|
+
var merge22 = require_merge2();
|
|
3288
3674
|
function merge(streams) {
|
|
3289
|
-
const mergedStream =
|
|
3675
|
+
const mergedStream = merge22(streams);
|
|
3290
3676
|
streams.forEach((stream) => {
|
|
3291
3677
|
stream.once("error", (error) => mergedStream.emit("error", error));
|
|
3292
3678
|
});
|
|
@@ -3301,9 +3687,9 @@ var require_stream = __commonJS({
|
|
|
3301
3687
|
}
|
|
3302
3688
|
});
|
|
3303
3689
|
|
|
3304
|
-
//
|
|
3690
|
+
// node_modules/fast-glob/out/utils/string.js
|
|
3305
3691
|
var require_string = __commonJS({
|
|
3306
|
-
"
|
|
3692
|
+
"node_modules/fast-glob/out/utils/string.js"(exports) {
|
|
3307
3693
|
"use strict";
|
|
3308
3694
|
init_cjs_shims();
|
|
3309
3695
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
@@ -3319,9 +3705,9 @@ var require_string = __commonJS({
|
|
|
3319
3705
|
}
|
|
3320
3706
|
});
|
|
3321
3707
|
|
|
3322
|
-
//
|
|
3708
|
+
// node_modules/fast-glob/out/utils/index.js
|
|
3323
3709
|
var require_utils3 = __commonJS({
|
|
3324
|
-
"
|
|
3710
|
+
"node_modules/fast-glob/out/utils/index.js"(exports) {
|
|
3325
3711
|
"use strict";
|
|
3326
3712
|
init_cjs_shims();
|
|
3327
3713
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
@@ -3330,10 +3716,10 @@ var require_utils3 = __commonJS({
|
|
|
3330
3716
|
exports.array = array;
|
|
3331
3717
|
var errno = require_errno();
|
|
3332
3718
|
exports.errno = errno;
|
|
3333
|
-
var
|
|
3334
|
-
exports.fs =
|
|
3335
|
-
var
|
|
3336
|
-
exports.path =
|
|
3719
|
+
var fs5 = require_fs();
|
|
3720
|
+
exports.fs = fs5;
|
|
3721
|
+
var path4 = require_path();
|
|
3722
|
+
exports.path = path4;
|
|
3337
3723
|
var pattern = require_pattern();
|
|
3338
3724
|
exports.pattern = pattern;
|
|
3339
3725
|
var stream = require_stream();
|
|
@@ -3343,17 +3729,19 @@ var require_utils3 = __commonJS({
|
|
|
3343
3729
|
}
|
|
3344
3730
|
});
|
|
3345
3731
|
|
|
3346
|
-
//
|
|
3732
|
+
// node_modules/fast-glob/out/managers/tasks.js
|
|
3347
3733
|
var require_tasks = __commonJS({
|
|
3348
|
-
"
|
|
3734
|
+
"node_modules/fast-glob/out/managers/tasks.js"(exports) {
|
|
3349
3735
|
"use strict";
|
|
3350
3736
|
init_cjs_shims();
|
|
3351
3737
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3352
3738
|
exports.convertPatternGroupToTask = exports.convertPatternGroupsToTasks = exports.groupPatternsByBaseDirectory = exports.getNegativePatternsAsPositive = exports.getPositivePatterns = exports.convertPatternsToTasks = exports.generate = void 0;
|
|
3353
3739
|
var utils = require_utils3();
|
|
3354
|
-
function generate(
|
|
3740
|
+
function generate(input, settings) {
|
|
3741
|
+
const patterns = processPatterns(input, settings);
|
|
3742
|
+
const ignore = processPatterns(settings.ignore, settings);
|
|
3355
3743
|
const positivePatterns = getPositivePatterns(patterns);
|
|
3356
|
-
const negativePatterns = getNegativePatternsAsPositive(patterns,
|
|
3744
|
+
const negativePatterns = getNegativePatternsAsPositive(patterns, ignore);
|
|
3357
3745
|
const staticPatterns = positivePatterns.filter((pattern) => utils.pattern.isStaticPattern(pattern, settings));
|
|
3358
3746
|
const dynamicPatterns = positivePatterns.filter((pattern) => utils.pattern.isDynamicPattern(pattern, settings));
|
|
3359
3747
|
const staticTasks = convertPatternsToTasks(staticPatterns, negativePatterns, false);
|
|
@@ -3361,6 +3749,16 @@ var require_tasks = __commonJS({
|
|
|
3361
3749
|
return staticTasks.concat(dynamicTasks);
|
|
3362
3750
|
}
|
|
3363
3751
|
exports.generate = generate;
|
|
3752
|
+
function processPatterns(input, settings) {
|
|
3753
|
+
let patterns = input;
|
|
3754
|
+
if (settings.braceExpansion) {
|
|
3755
|
+
patterns = utils.pattern.expandPatternsWithBraceExpansion(patterns);
|
|
3756
|
+
}
|
|
3757
|
+
if (settings.baseNameMatch) {
|
|
3758
|
+
patterns = patterns.map((pattern) => pattern.includes("/") ? pattern : `**/${pattern}`);
|
|
3759
|
+
}
|
|
3760
|
+
return patterns.map((pattern) => utils.pattern.removeDuplicateSlashes(pattern));
|
|
3761
|
+
}
|
|
3364
3762
|
function convertPatternsToTasks(positive, negative, dynamic) {
|
|
3365
3763
|
const tasks = [];
|
|
3366
3764
|
const patternsOutsideCurrentDirectory = utils.pattern.getPatternsOutsideCurrentDirectory(positive);
|
|
@@ -3418,25 +3816,6 @@ var require_tasks = __commonJS({
|
|
|
3418
3816
|
}
|
|
3419
3817
|
});
|
|
3420
3818
|
|
|
3421
|
-
// ../../node_modules/fast-glob/out/managers/patterns.js
|
|
3422
|
-
var require_patterns = __commonJS({
|
|
3423
|
-
"../../node_modules/fast-glob/out/managers/patterns.js"(exports) {
|
|
3424
|
-
"use strict";
|
|
3425
|
-
init_cjs_shims();
|
|
3426
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3427
|
-
exports.removeDuplicateSlashes = exports.transform = void 0;
|
|
3428
|
-
var DOUBLE_SLASH_RE = /(?!^)\/{2,}/g;
|
|
3429
|
-
function transform(patterns) {
|
|
3430
|
-
return patterns.map((pattern) => removeDuplicateSlashes(pattern));
|
|
3431
|
-
}
|
|
3432
|
-
exports.transform = transform;
|
|
3433
|
-
function removeDuplicateSlashes(pattern) {
|
|
3434
|
-
return pattern.replace(DOUBLE_SLASH_RE, "/");
|
|
3435
|
-
}
|
|
3436
|
-
exports.removeDuplicateSlashes = removeDuplicateSlashes;
|
|
3437
|
-
}
|
|
3438
|
-
});
|
|
3439
|
-
|
|
3440
3819
|
// ../../node_modules/@nodelib/fs.stat/out/providers/async.js
|
|
3441
3820
|
var require_async = __commonJS({
|
|
3442
3821
|
"../../node_modules/@nodelib/fs.stat/out/providers/async.js"(exports) {
|
|
@@ -3444,8 +3823,8 @@ var require_async = __commonJS({
|
|
|
3444
3823
|
init_cjs_shims();
|
|
3445
3824
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3446
3825
|
exports.read = void 0;
|
|
3447
|
-
function read(
|
|
3448
|
-
settings.fs.lstat(
|
|
3826
|
+
function read(path4, settings, callback) {
|
|
3827
|
+
settings.fs.lstat(path4, (lstatError, lstat) => {
|
|
3449
3828
|
if (lstatError !== null) {
|
|
3450
3829
|
callFailureCallback(callback, lstatError);
|
|
3451
3830
|
return;
|
|
@@ -3454,7 +3833,7 @@ var require_async = __commonJS({
|
|
|
3454
3833
|
callSuccessCallback(callback, lstat);
|
|
3455
3834
|
return;
|
|
3456
3835
|
}
|
|
3457
|
-
settings.fs.stat(
|
|
3836
|
+
settings.fs.stat(path4, (statError, stat) => {
|
|
3458
3837
|
if (statError !== null) {
|
|
3459
3838
|
if (settings.throwErrorOnBrokenSymbolicLink) {
|
|
3460
3839
|
callFailureCallback(callback, statError);
|
|
@@ -3487,13 +3866,13 @@ var require_sync = __commonJS({
|
|
|
3487
3866
|
init_cjs_shims();
|
|
3488
3867
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3489
3868
|
exports.read = void 0;
|
|
3490
|
-
function read(
|
|
3491
|
-
const lstat = settings.fs.lstatSync(
|
|
3869
|
+
function read(path4, settings) {
|
|
3870
|
+
const lstat = settings.fs.lstatSync(path4);
|
|
3492
3871
|
if (!lstat.isSymbolicLink() || !settings.followSymbolicLink) {
|
|
3493
3872
|
return lstat;
|
|
3494
3873
|
}
|
|
3495
3874
|
try {
|
|
3496
|
-
const stat = settings.fs.statSync(
|
|
3875
|
+
const stat = settings.fs.statSync(path4);
|
|
3497
3876
|
if (settings.markSymbolicLink) {
|
|
3498
3877
|
stat.isSymbolicLink = () => true;
|
|
3499
3878
|
}
|
|
@@ -3516,12 +3895,12 @@ var require_fs2 = __commonJS({
|
|
|
3516
3895
|
init_cjs_shims();
|
|
3517
3896
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3518
3897
|
exports.createFileSystemAdapter = exports.FILE_SYSTEM_ADAPTER = void 0;
|
|
3519
|
-
var
|
|
3898
|
+
var fs5 = require("fs");
|
|
3520
3899
|
exports.FILE_SYSTEM_ADAPTER = {
|
|
3521
|
-
lstat:
|
|
3522
|
-
stat:
|
|
3523
|
-
lstatSync:
|
|
3524
|
-
statSync:
|
|
3900
|
+
lstat: fs5.lstat,
|
|
3901
|
+
stat: fs5.stat,
|
|
3902
|
+
lstatSync: fs5.lstatSync,
|
|
3903
|
+
statSync: fs5.statSync
|
|
3525
3904
|
};
|
|
3526
3905
|
function createFileSystemAdapter(fsMethods) {
|
|
3527
3906
|
if (fsMethods === void 0) {
|
|
@@ -3539,12 +3918,12 @@ var require_settings = __commonJS({
|
|
|
3539
3918
|
"use strict";
|
|
3540
3919
|
init_cjs_shims();
|
|
3541
3920
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3542
|
-
var
|
|
3921
|
+
var fs5 = require_fs2();
|
|
3543
3922
|
var Settings = class {
|
|
3544
3923
|
constructor(_options = {}) {
|
|
3545
3924
|
this._options = _options;
|
|
3546
3925
|
this.followSymbolicLink = this._getValue(this._options.followSymbolicLink, true);
|
|
3547
|
-
this.fs =
|
|
3926
|
+
this.fs = fs5.createFileSystemAdapter(this._options.fs);
|
|
3548
3927
|
this.markSymbolicLink = this._getValue(this._options.markSymbolicLink, false);
|
|
3549
3928
|
this.throwErrorOnBrokenSymbolicLink = this._getValue(this._options.throwErrorOnBrokenSymbolicLink, true);
|
|
3550
3929
|
}
|
|
@@ -3567,17 +3946,17 @@ var require_out = __commonJS({
|
|
|
3567
3946
|
var sync = require_sync();
|
|
3568
3947
|
var settings_1 = require_settings();
|
|
3569
3948
|
exports.Settings = settings_1.default;
|
|
3570
|
-
function stat(
|
|
3949
|
+
function stat(path4, optionsOrSettingsOrCallback, callback) {
|
|
3571
3950
|
if (typeof optionsOrSettingsOrCallback === "function") {
|
|
3572
|
-
async.read(
|
|
3951
|
+
async.read(path4, getSettings(), optionsOrSettingsOrCallback);
|
|
3573
3952
|
return;
|
|
3574
3953
|
}
|
|
3575
|
-
async.read(
|
|
3954
|
+
async.read(path4, getSettings(optionsOrSettingsOrCallback), callback);
|
|
3576
3955
|
}
|
|
3577
3956
|
exports.stat = stat;
|
|
3578
|
-
function statSync(
|
|
3957
|
+
function statSync(path4, optionsOrSettings) {
|
|
3579
3958
|
const settings = getSettings(optionsOrSettings);
|
|
3580
|
-
return sync.read(
|
|
3959
|
+
return sync.read(path4, settings);
|
|
3581
3960
|
}
|
|
3582
3961
|
exports.statSync = statSync;
|
|
3583
3962
|
function getSettings(settingsOrOptions = {}) {
|
|
@@ -3708,8 +4087,8 @@ var require_utils4 = __commonJS({
|
|
|
3708
4087
|
init_cjs_shims();
|
|
3709
4088
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3710
4089
|
exports.fs = void 0;
|
|
3711
|
-
var
|
|
3712
|
-
exports.fs =
|
|
4090
|
+
var fs5 = require_fs3();
|
|
4091
|
+
exports.fs = fs5;
|
|
3713
4092
|
}
|
|
3714
4093
|
});
|
|
3715
4094
|
|
|
@@ -3803,16 +4182,16 @@ var require_async2 = __commonJS({
|
|
|
3803
4182
|
return;
|
|
3804
4183
|
}
|
|
3805
4184
|
const tasks = names.map((name) => {
|
|
3806
|
-
const
|
|
4185
|
+
const path4 = common.joinPathSegments(directory, name, settings.pathSegmentSeparator);
|
|
3807
4186
|
return (done) => {
|
|
3808
|
-
fsStat.stat(
|
|
4187
|
+
fsStat.stat(path4, settings.fsStatSettings, (error, stats) => {
|
|
3809
4188
|
if (error !== null) {
|
|
3810
4189
|
done(error);
|
|
3811
4190
|
return;
|
|
3812
4191
|
}
|
|
3813
4192
|
const entry = {
|
|
3814
4193
|
name,
|
|
3815
|
-
path:
|
|
4194
|
+
path: path4,
|
|
3816
4195
|
dirent: utils.fs.createDirentFromStats(name, stats)
|
|
3817
4196
|
};
|
|
3818
4197
|
if (settings.stats) {
|
|
@@ -3908,14 +4287,14 @@ var require_fs4 = __commonJS({
|
|
|
3908
4287
|
init_cjs_shims();
|
|
3909
4288
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3910
4289
|
exports.createFileSystemAdapter = exports.FILE_SYSTEM_ADAPTER = void 0;
|
|
3911
|
-
var
|
|
4290
|
+
var fs5 = require("fs");
|
|
3912
4291
|
exports.FILE_SYSTEM_ADAPTER = {
|
|
3913
|
-
lstat:
|
|
3914
|
-
stat:
|
|
3915
|
-
lstatSync:
|
|
3916
|
-
statSync:
|
|
3917
|
-
readdir:
|
|
3918
|
-
readdirSync:
|
|
4292
|
+
lstat: fs5.lstat,
|
|
4293
|
+
stat: fs5.stat,
|
|
4294
|
+
lstatSync: fs5.lstatSync,
|
|
4295
|
+
statSync: fs5.statSync,
|
|
4296
|
+
readdir: fs5.readdir,
|
|
4297
|
+
readdirSync: fs5.readdirSync
|
|
3919
4298
|
};
|
|
3920
4299
|
function createFileSystemAdapter(fsMethods) {
|
|
3921
4300
|
if (fsMethods === void 0) {
|
|
@@ -3933,15 +4312,15 @@ var require_settings2 = __commonJS({
|
|
|
3933
4312
|
"use strict";
|
|
3934
4313
|
init_cjs_shims();
|
|
3935
4314
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3936
|
-
var
|
|
4315
|
+
var path4 = require("path");
|
|
3937
4316
|
var fsStat = require_out();
|
|
3938
|
-
var
|
|
4317
|
+
var fs5 = require_fs4();
|
|
3939
4318
|
var Settings = class {
|
|
3940
4319
|
constructor(_options = {}) {
|
|
3941
4320
|
this._options = _options;
|
|
3942
4321
|
this.followSymbolicLinks = this._getValue(this._options.followSymbolicLinks, false);
|
|
3943
|
-
this.fs =
|
|
3944
|
-
this.pathSegmentSeparator = this._getValue(this._options.pathSegmentSeparator,
|
|
4322
|
+
this.fs = fs5.createFileSystemAdapter(this._options.fs);
|
|
4323
|
+
this.pathSegmentSeparator = this._getValue(this._options.pathSegmentSeparator, path4.sep);
|
|
3945
4324
|
this.stats = this._getValue(this._options.stats, false);
|
|
3946
4325
|
this.throwErrorOnBrokenSymbolicLink = this._getValue(this._options.throwErrorOnBrokenSymbolicLink, true);
|
|
3947
4326
|
this.fsStatSettings = new fsStat.Settings({
|
|
@@ -3969,17 +4348,17 @@ var require_out2 = __commonJS({
|
|
|
3969
4348
|
var sync = require_sync2();
|
|
3970
4349
|
var settings_1 = require_settings2();
|
|
3971
4350
|
exports.Settings = settings_1.default;
|
|
3972
|
-
function scandir(
|
|
4351
|
+
function scandir(path4, optionsOrSettingsOrCallback, callback) {
|
|
3973
4352
|
if (typeof optionsOrSettingsOrCallback === "function") {
|
|
3974
|
-
async.read(
|
|
4353
|
+
async.read(path4, getSettings(), optionsOrSettingsOrCallback);
|
|
3975
4354
|
return;
|
|
3976
4355
|
}
|
|
3977
|
-
async.read(
|
|
4356
|
+
async.read(path4, getSettings(optionsOrSettingsOrCallback), callback);
|
|
3978
4357
|
}
|
|
3979
4358
|
exports.scandir = scandir;
|
|
3980
|
-
function scandirSync(
|
|
4359
|
+
function scandirSync(path4, optionsOrSettings) {
|
|
3981
4360
|
const settings = getSettings(optionsOrSettings);
|
|
3982
|
-
return sync.read(
|
|
4361
|
+
return sync.read(path4, settings);
|
|
3983
4362
|
}
|
|
3984
4363
|
exports.scandirSync = scandirSync;
|
|
3985
4364
|
function getSettings(settingsOrOptions = {}) {
|
|
@@ -4593,7 +4972,7 @@ var require_settings3 = __commonJS({
|
|
|
4593
4972
|
"use strict";
|
|
4594
4973
|
init_cjs_shims();
|
|
4595
4974
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4596
|
-
var
|
|
4975
|
+
var path4 = require("path");
|
|
4597
4976
|
var fsScandir = require_out2();
|
|
4598
4977
|
var Settings = class {
|
|
4599
4978
|
constructor(_options = {}) {
|
|
@@ -4603,7 +4982,7 @@ var require_settings3 = __commonJS({
|
|
|
4603
4982
|
this.deepFilter = this._getValue(this._options.deepFilter, null);
|
|
4604
4983
|
this.entryFilter = this._getValue(this._options.entryFilter, null);
|
|
4605
4984
|
this.errorFilter = this._getValue(this._options.errorFilter, null);
|
|
4606
|
-
this.pathSegmentSeparator = this._getValue(this._options.pathSegmentSeparator,
|
|
4985
|
+
this.pathSegmentSeparator = this._getValue(this._options.pathSegmentSeparator, path4.sep);
|
|
4607
4986
|
this.fsScandirSettings = new fsScandir.Settings({
|
|
4608
4987
|
followSymbolicLinks: this._options.followSymbolicLinks,
|
|
4609
4988
|
fs: this._options.fs,
|
|
@@ -4661,13 +5040,13 @@ var require_out3 = __commonJS({
|
|
|
4661
5040
|
}
|
|
4662
5041
|
});
|
|
4663
5042
|
|
|
4664
|
-
//
|
|
5043
|
+
// node_modules/fast-glob/out/readers/reader.js
|
|
4665
5044
|
var require_reader2 = __commonJS({
|
|
4666
|
-
"
|
|
5045
|
+
"node_modules/fast-glob/out/readers/reader.js"(exports) {
|
|
4667
5046
|
"use strict";
|
|
4668
5047
|
init_cjs_shims();
|
|
4669
5048
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4670
|
-
var
|
|
5049
|
+
var path4 = require("path");
|
|
4671
5050
|
var fsStat = require_out();
|
|
4672
5051
|
var utils = require_utils3();
|
|
4673
5052
|
var Reader = class {
|
|
@@ -4680,7 +5059,7 @@ var require_reader2 = __commonJS({
|
|
|
4680
5059
|
});
|
|
4681
5060
|
}
|
|
4682
5061
|
_getFullEntryPath(filepath) {
|
|
4683
|
-
return
|
|
5062
|
+
return path4.resolve(this._settings.cwd, filepath);
|
|
4684
5063
|
}
|
|
4685
5064
|
_makeEntry(stats, pattern) {
|
|
4686
5065
|
const entry = {
|
|
@@ -4701,9 +5080,9 @@ var require_reader2 = __commonJS({
|
|
|
4701
5080
|
}
|
|
4702
5081
|
});
|
|
4703
5082
|
|
|
4704
|
-
//
|
|
5083
|
+
// node_modules/fast-glob/out/readers/stream.js
|
|
4705
5084
|
var require_stream3 = __commonJS({
|
|
4706
|
-
"
|
|
5085
|
+
"node_modules/fast-glob/out/readers/stream.js"(exports) {
|
|
4707
5086
|
"use strict";
|
|
4708
5087
|
init_cjs_shims();
|
|
4709
5088
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
@@ -4759,9 +5138,9 @@ var require_stream3 = __commonJS({
|
|
|
4759
5138
|
}
|
|
4760
5139
|
});
|
|
4761
5140
|
|
|
4762
|
-
//
|
|
5141
|
+
// node_modules/fast-glob/out/readers/async.js
|
|
4763
5142
|
var require_async5 = __commonJS({
|
|
4764
|
-
"
|
|
5143
|
+
"node_modules/fast-glob/out/readers/async.js"(exports) {
|
|
4765
5144
|
"use strict";
|
|
4766
5145
|
init_cjs_shims();
|
|
4767
5146
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
@@ -4799,9 +5178,9 @@ var require_async5 = __commonJS({
|
|
|
4799
5178
|
}
|
|
4800
5179
|
});
|
|
4801
5180
|
|
|
4802
|
-
//
|
|
5181
|
+
// node_modules/fast-glob/out/providers/matchers/matcher.js
|
|
4803
5182
|
var require_matcher = __commonJS({
|
|
4804
|
-
"
|
|
5183
|
+
"node_modules/fast-glob/out/providers/matchers/matcher.js"(exports) {
|
|
4805
5184
|
"use strict";
|
|
4806
5185
|
init_cjs_shims();
|
|
4807
5186
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
@@ -4815,8 +5194,7 @@ var require_matcher = __commonJS({
|
|
|
4815
5194
|
this._fillStorage();
|
|
4816
5195
|
}
|
|
4817
5196
|
_fillStorage() {
|
|
4818
|
-
const
|
|
4819
|
-
for (const pattern of patterns) {
|
|
5197
|
+
for (const pattern of this._patterns) {
|
|
4820
5198
|
const segments = this._getPatternSegments(pattern);
|
|
4821
5199
|
const sections = this._splitSegmentsIntoSections(segments);
|
|
4822
5200
|
this._storage.push({
|
|
@@ -4852,9 +5230,9 @@ var require_matcher = __commonJS({
|
|
|
4852
5230
|
}
|
|
4853
5231
|
});
|
|
4854
5232
|
|
|
4855
|
-
//
|
|
5233
|
+
// node_modules/fast-glob/out/providers/matchers/partial.js
|
|
4856
5234
|
var require_partial = __commonJS({
|
|
4857
|
-
"
|
|
5235
|
+
"node_modules/fast-glob/out/providers/matchers/partial.js"(exports) {
|
|
4858
5236
|
"use strict";
|
|
4859
5237
|
init_cjs_shims();
|
|
4860
5238
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
@@ -4890,9 +5268,9 @@ var require_partial = __commonJS({
|
|
|
4890
5268
|
}
|
|
4891
5269
|
});
|
|
4892
5270
|
|
|
4893
|
-
//
|
|
5271
|
+
// node_modules/fast-glob/out/providers/filters/deep.js
|
|
4894
5272
|
var require_deep = __commonJS({
|
|
4895
|
-
"
|
|
5273
|
+
"node_modules/fast-glob/out/providers/filters/deep.js"(exports) {
|
|
4896
5274
|
"use strict";
|
|
4897
5275
|
init_cjs_shims();
|
|
4898
5276
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
@@ -4956,9 +5334,9 @@ var require_deep = __commonJS({
|
|
|
4956
5334
|
}
|
|
4957
5335
|
});
|
|
4958
5336
|
|
|
4959
|
-
//
|
|
5337
|
+
// node_modules/fast-glob/out/providers/filters/entry.js
|
|
4960
5338
|
var require_entry = __commonJS({
|
|
4961
|
-
"
|
|
5339
|
+
"node_modules/fast-glob/out/providers/filters/entry.js"(exports) {
|
|
4962
5340
|
"use strict";
|
|
4963
5341
|
init_cjs_shims();
|
|
4964
5342
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
@@ -4971,32 +5349,32 @@ var require_entry = __commonJS({
|
|
|
4971
5349
|
}
|
|
4972
5350
|
getFilter(positive, negative) {
|
|
4973
5351
|
const positiveRe = utils.pattern.convertPatternsToRe(positive, this._micromatchOptions);
|
|
4974
|
-
const negativeRe = utils.pattern.convertPatternsToRe(negative, this._micromatchOptions);
|
|
5352
|
+
const negativeRe = utils.pattern.convertPatternsToRe(negative, Object.assign(Object.assign({}, this._micromatchOptions), { dot: true }));
|
|
4975
5353
|
return (entry) => this._filter(entry, positiveRe, negativeRe);
|
|
4976
5354
|
}
|
|
4977
5355
|
_filter(entry, positiveRe, negativeRe) {
|
|
4978
|
-
|
|
5356
|
+
const filepath = utils.path.removeLeadingDotSegment(entry.path);
|
|
5357
|
+
if (this._settings.unique && this._isDuplicateEntry(filepath)) {
|
|
4979
5358
|
return false;
|
|
4980
5359
|
}
|
|
4981
5360
|
if (this._onlyFileFilter(entry) || this._onlyDirectoryFilter(entry)) {
|
|
4982
5361
|
return false;
|
|
4983
5362
|
}
|
|
4984
|
-
if (this._isSkippedByAbsoluteNegativePatterns(
|
|
5363
|
+
if (this._isSkippedByAbsoluteNegativePatterns(filepath, negativeRe)) {
|
|
4985
5364
|
return false;
|
|
4986
5365
|
}
|
|
4987
|
-
const filepath = this._settings.baseNameMatch ? entry.name : entry.path;
|
|
4988
5366
|
const isDirectory = entry.dirent.isDirectory();
|
|
4989
|
-
const isMatched = this._isMatchToPatterns(filepath, positiveRe, isDirectory) && !this._isMatchToPatterns(
|
|
5367
|
+
const isMatched = this._isMatchToPatterns(filepath, positiveRe, isDirectory) && !this._isMatchToPatterns(filepath, negativeRe, isDirectory);
|
|
4990
5368
|
if (this._settings.unique && isMatched) {
|
|
4991
|
-
this._createIndexRecord(
|
|
5369
|
+
this._createIndexRecord(filepath);
|
|
4992
5370
|
}
|
|
4993
5371
|
return isMatched;
|
|
4994
5372
|
}
|
|
4995
|
-
_isDuplicateEntry(
|
|
4996
|
-
return this.index.has(
|
|
5373
|
+
_isDuplicateEntry(filepath) {
|
|
5374
|
+
return this.index.has(filepath);
|
|
4997
5375
|
}
|
|
4998
|
-
_createIndexRecord(
|
|
4999
|
-
this.index.set(
|
|
5376
|
+
_createIndexRecord(filepath) {
|
|
5377
|
+
this.index.set(filepath, void 0);
|
|
5000
5378
|
}
|
|
5001
5379
|
_onlyFileFilter(entry) {
|
|
5002
5380
|
return this._settings.onlyFiles && !entry.dirent.isFile();
|
|
@@ -5011,8 +5389,7 @@ var require_entry = __commonJS({
|
|
|
5011
5389
|
const fullpath = utils.path.makeAbsolute(this._settings.cwd, entryPath);
|
|
5012
5390
|
return utils.pattern.matchAny(fullpath, patternsRe);
|
|
5013
5391
|
}
|
|
5014
|
-
_isMatchToPatterns(
|
|
5015
|
-
const filepath = utils.path.removeLeadingDotSegment(entryPath);
|
|
5392
|
+
_isMatchToPatterns(filepath, patternsRe, isDirectory) {
|
|
5016
5393
|
const isMatched = utils.pattern.matchAny(filepath, patternsRe);
|
|
5017
5394
|
if (!isMatched && isDirectory) {
|
|
5018
5395
|
return utils.pattern.matchAny(filepath + "/", patternsRe);
|
|
@@ -5024,9 +5401,9 @@ var require_entry = __commonJS({
|
|
|
5024
5401
|
}
|
|
5025
5402
|
});
|
|
5026
5403
|
|
|
5027
|
-
//
|
|
5404
|
+
// node_modules/fast-glob/out/providers/filters/error.js
|
|
5028
5405
|
var require_error = __commonJS({
|
|
5029
|
-
"
|
|
5406
|
+
"node_modules/fast-glob/out/providers/filters/error.js"(exports) {
|
|
5030
5407
|
"use strict";
|
|
5031
5408
|
init_cjs_shims();
|
|
5032
5409
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
@@ -5046,9 +5423,9 @@ var require_error = __commonJS({
|
|
|
5046
5423
|
}
|
|
5047
5424
|
});
|
|
5048
5425
|
|
|
5049
|
-
//
|
|
5426
|
+
// node_modules/fast-glob/out/providers/transformers/entry.js
|
|
5050
5427
|
var require_entry2 = __commonJS({
|
|
5051
|
-
"
|
|
5428
|
+
"node_modules/fast-glob/out/providers/transformers/entry.js"(exports) {
|
|
5052
5429
|
"use strict";
|
|
5053
5430
|
init_cjs_shims();
|
|
5054
5431
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
@@ -5079,13 +5456,13 @@ var require_entry2 = __commonJS({
|
|
|
5079
5456
|
}
|
|
5080
5457
|
});
|
|
5081
5458
|
|
|
5082
|
-
//
|
|
5459
|
+
// node_modules/fast-glob/out/providers/provider.js
|
|
5083
5460
|
var require_provider = __commonJS({
|
|
5084
|
-
"
|
|
5461
|
+
"node_modules/fast-glob/out/providers/provider.js"(exports) {
|
|
5085
5462
|
"use strict";
|
|
5086
5463
|
init_cjs_shims();
|
|
5087
5464
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5088
|
-
var
|
|
5465
|
+
var path4 = require("path");
|
|
5089
5466
|
var deep_1 = require_deep();
|
|
5090
5467
|
var entry_1 = require_entry();
|
|
5091
5468
|
var error_1 = require_error();
|
|
@@ -5099,7 +5476,7 @@ var require_provider = __commonJS({
|
|
|
5099
5476
|
this.entryTransformer = new entry_2.default(this._settings);
|
|
5100
5477
|
}
|
|
5101
5478
|
_getRootDirectory(task) {
|
|
5102
|
-
return
|
|
5479
|
+
return path4.resolve(this._settings.cwd, task.base);
|
|
5103
5480
|
}
|
|
5104
5481
|
_getReaderOptions(task) {
|
|
5105
5482
|
const basePath = task.base === "." ? "" : task.base;
|
|
@@ -5134,9 +5511,9 @@ var require_provider = __commonJS({
|
|
|
5134
5511
|
}
|
|
5135
5512
|
});
|
|
5136
5513
|
|
|
5137
|
-
//
|
|
5514
|
+
// node_modules/fast-glob/out/providers/async.js
|
|
5138
5515
|
var require_async6 = __commonJS({
|
|
5139
|
-
"
|
|
5516
|
+
"node_modules/fast-glob/out/providers/async.js"(exports) {
|
|
5140
5517
|
"use strict";
|
|
5141
5518
|
init_cjs_shims();
|
|
5142
5519
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
@@ -5164,9 +5541,9 @@ var require_async6 = __commonJS({
|
|
|
5164
5541
|
}
|
|
5165
5542
|
});
|
|
5166
5543
|
|
|
5167
|
-
//
|
|
5544
|
+
// node_modules/fast-glob/out/providers/stream.js
|
|
5168
5545
|
var require_stream4 = __commonJS({
|
|
5169
|
-
"
|
|
5546
|
+
"node_modules/fast-glob/out/providers/stream.js"(exports) {
|
|
5170
5547
|
"use strict";
|
|
5171
5548
|
init_cjs_shims();
|
|
5172
5549
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
@@ -5199,9 +5576,9 @@ var require_stream4 = __commonJS({
|
|
|
5199
5576
|
}
|
|
5200
5577
|
});
|
|
5201
5578
|
|
|
5202
|
-
//
|
|
5579
|
+
// node_modules/fast-glob/out/readers/sync.js
|
|
5203
5580
|
var require_sync5 = __commonJS({
|
|
5204
|
-
"
|
|
5581
|
+
"node_modules/fast-glob/out/readers/sync.js"(exports) {
|
|
5205
5582
|
"use strict";
|
|
5206
5583
|
init_cjs_shims();
|
|
5207
5584
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
@@ -5248,9 +5625,9 @@ var require_sync5 = __commonJS({
|
|
|
5248
5625
|
}
|
|
5249
5626
|
});
|
|
5250
5627
|
|
|
5251
|
-
//
|
|
5628
|
+
// node_modules/fast-glob/out/providers/sync.js
|
|
5252
5629
|
var require_sync6 = __commonJS({
|
|
5253
|
-
"
|
|
5630
|
+
"node_modules/fast-glob/out/providers/sync.js"(exports) {
|
|
5254
5631
|
"use strict";
|
|
5255
5632
|
init_cjs_shims();
|
|
5256
5633
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
@@ -5278,23 +5655,23 @@ var require_sync6 = __commonJS({
|
|
|
5278
5655
|
}
|
|
5279
5656
|
});
|
|
5280
5657
|
|
|
5281
|
-
//
|
|
5658
|
+
// node_modules/fast-glob/out/settings.js
|
|
5282
5659
|
var require_settings4 = __commonJS({
|
|
5283
|
-
"
|
|
5660
|
+
"node_modules/fast-glob/out/settings.js"(exports) {
|
|
5284
5661
|
"use strict";
|
|
5285
5662
|
init_cjs_shims();
|
|
5286
5663
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5287
5664
|
exports.DEFAULT_FILE_SYSTEM_ADAPTER = void 0;
|
|
5288
|
-
var
|
|
5665
|
+
var fs5 = require("fs");
|
|
5289
5666
|
var os2 = require("os");
|
|
5290
5667
|
var CPU_COUNT = Math.max(os2.cpus().length, 1);
|
|
5291
5668
|
exports.DEFAULT_FILE_SYSTEM_ADAPTER = {
|
|
5292
|
-
lstat:
|
|
5293
|
-
lstatSync:
|
|
5294
|
-
stat:
|
|
5295
|
-
statSync:
|
|
5296
|
-
readdir:
|
|
5297
|
-
readdirSync:
|
|
5669
|
+
lstat: fs5.lstat,
|
|
5670
|
+
lstatSync: fs5.lstatSync,
|
|
5671
|
+
stat: fs5.stat,
|
|
5672
|
+
statSync: fs5.statSync,
|
|
5673
|
+
readdir: fs5.readdir,
|
|
5674
|
+
readdirSync: fs5.readdirSync
|
|
5298
5675
|
};
|
|
5299
5676
|
var Settings = class {
|
|
5300
5677
|
constructor(_options = {}) {
|
|
@@ -5326,6 +5703,7 @@ var require_settings4 = __commonJS({
|
|
|
5326
5703
|
if (this.stats) {
|
|
5327
5704
|
this.objectMode = true;
|
|
5328
5705
|
}
|
|
5706
|
+
this.ignore = [].concat(this.ignore);
|
|
5329
5707
|
}
|
|
5330
5708
|
_getValue(option, value) {
|
|
5331
5709
|
return option === void 0 ? value : option;
|
|
@@ -5338,64 +5716,98 @@ var require_settings4 = __commonJS({
|
|
|
5338
5716
|
}
|
|
5339
5717
|
});
|
|
5340
5718
|
|
|
5341
|
-
//
|
|
5719
|
+
// node_modules/fast-glob/out/index.js
|
|
5342
5720
|
var require_out4 = __commonJS({
|
|
5343
|
-
"
|
|
5721
|
+
"node_modules/fast-glob/out/index.js"(exports, module2) {
|
|
5344
5722
|
"use strict";
|
|
5345
5723
|
init_cjs_shims();
|
|
5346
5724
|
var taskManager = require_tasks();
|
|
5347
|
-
var patternManager = require_patterns();
|
|
5348
5725
|
var async_1 = require_async6();
|
|
5349
5726
|
var stream_1 = require_stream4();
|
|
5350
5727
|
var sync_1 = require_sync6();
|
|
5351
5728
|
var settings_1 = require_settings4();
|
|
5352
5729
|
var utils = require_utils3();
|
|
5353
5730
|
async function FastGlob(source, options) {
|
|
5354
|
-
|
|
5731
|
+
assertPatternsInput2(source);
|
|
5355
5732
|
const works = getWorks(source, async_1.default, options);
|
|
5356
5733
|
const result = await Promise.all(works);
|
|
5357
5734
|
return utils.array.flatten(result);
|
|
5358
5735
|
}
|
|
5359
5736
|
(function(FastGlob2) {
|
|
5737
|
+
FastGlob2.glob = FastGlob2;
|
|
5738
|
+
FastGlob2.globSync = sync;
|
|
5739
|
+
FastGlob2.globStream = stream;
|
|
5740
|
+
FastGlob2.async = FastGlob2;
|
|
5360
5741
|
function sync(source, options) {
|
|
5361
|
-
|
|
5742
|
+
assertPatternsInput2(source);
|
|
5362
5743
|
const works = getWorks(source, sync_1.default, options);
|
|
5363
5744
|
return utils.array.flatten(works);
|
|
5364
5745
|
}
|
|
5365
5746
|
FastGlob2.sync = sync;
|
|
5366
5747
|
function stream(source, options) {
|
|
5367
|
-
|
|
5748
|
+
assertPatternsInput2(source);
|
|
5368
5749
|
const works = getWorks(source, stream_1.default, options);
|
|
5369
5750
|
return utils.stream.merge(works);
|
|
5370
5751
|
}
|
|
5371
5752
|
FastGlob2.stream = stream;
|
|
5372
|
-
function
|
|
5373
|
-
|
|
5374
|
-
const patterns =
|
|
5753
|
+
function generateTasks2(source, options) {
|
|
5754
|
+
assertPatternsInput2(source);
|
|
5755
|
+
const patterns = [].concat(source);
|
|
5375
5756
|
const settings = new settings_1.default(options);
|
|
5376
5757
|
return taskManager.generate(patterns, settings);
|
|
5377
5758
|
}
|
|
5378
|
-
FastGlob2.generateTasks =
|
|
5379
|
-
function
|
|
5380
|
-
|
|
5759
|
+
FastGlob2.generateTasks = generateTasks2;
|
|
5760
|
+
function isDynamicPattern2(source, options) {
|
|
5761
|
+
assertPatternsInput2(source);
|
|
5381
5762
|
const settings = new settings_1.default(options);
|
|
5382
5763
|
return utils.pattern.isDynamicPattern(source, settings);
|
|
5383
5764
|
}
|
|
5384
|
-
FastGlob2.isDynamicPattern =
|
|
5765
|
+
FastGlob2.isDynamicPattern = isDynamicPattern2;
|
|
5385
5766
|
function escapePath(source) {
|
|
5386
|
-
|
|
5767
|
+
assertPatternsInput2(source);
|
|
5387
5768
|
return utils.path.escape(source);
|
|
5388
5769
|
}
|
|
5389
5770
|
FastGlob2.escapePath = escapePath;
|
|
5771
|
+
function convertPathToPattern(source) {
|
|
5772
|
+
assertPatternsInput2(source);
|
|
5773
|
+
return utils.path.convertPathToPattern(source);
|
|
5774
|
+
}
|
|
5775
|
+
FastGlob2.convertPathToPattern = convertPathToPattern;
|
|
5776
|
+
let posix;
|
|
5777
|
+
(function(posix2) {
|
|
5778
|
+
function escapePath2(source) {
|
|
5779
|
+
assertPatternsInput2(source);
|
|
5780
|
+
return utils.path.escapePosixPath(source);
|
|
5781
|
+
}
|
|
5782
|
+
posix2.escapePath = escapePath2;
|
|
5783
|
+
function convertPathToPattern2(source) {
|
|
5784
|
+
assertPatternsInput2(source);
|
|
5785
|
+
return utils.path.convertPosixPathToPattern(source);
|
|
5786
|
+
}
|
|
5787
|
+
posix2.convertPathToPattern = convertPathToPattern2;
|
|
5788
|
+
})(posix = FastGlob2.posix || (FastGlob2.posix = {}));
|
|
5789
|
+
let win32;
|
|
5790
|
+
(function(win322) {
|
|
5791
|
+
function escapePath2(source) {
|
|
5792
|
+
assertPatternsInput2(source);
|
|
5793
|
+
return utils.path.escapeWindowsPath(source);
|
|
5794
|
+
}
|
|
5795
|
+
win322.escapePath = escapePath2;
|
|
5796
|
+
function convertPathToPattern2(source) {
|
|
5797
|
+
assertPatternsInput2(source);
|
|
5798
|
+
return utils.path.convertWindowsPathToPattern(source);
|
|
5799
|
+
}
|
|
5800
|
+
win322.convertPathToPattern = convertPathToPattern2;
|
|
5801
|
+
})(win32 = FastGlob2.win32 || (FastGlob2.win32 = {}));
|
|
5390
5802
|
})(FastGlob || (FastGlob = {}));
|
|
5391
5803
|
function getWorks(source, _Provider, options) {
|
|
5392
|
-
const patterns =
|
|
5804
|
+
const patterns = [].concat(source);
|
|
5393
5805
|
const settings = new settings_1.default(options);
|
|
5394
5806
|
const tasks = taskManager.generate(patterns, settings);
|
|
5395
5807
|
const provider = new _Provider(settings);
|
|
5396
5808
|
return tasks.map(provider.read, provider);
|
|
5397
5809
|
}
|
|
5398
|
-
function
|
|
5810
|
+
function assertPatternsInput2(input) {
|
|
5399
5811
|
const source = [].concat(input);
|
|
5400
5812
|
const isValidSource = source.every((item) => utils.string.isString(item) && !utils.string.isEmpty(item));
|
|
5401
5813
|
if (!isValidSource) {
|
|
@@ -5412,13 +5824,13 @@ var require_path_type = __commonJS({
|
|
|
5412
5824
|
"use strict";
|
|
5413
5825
|
init_cjs_shims();
|
|
5414
5826
|
var { promisify } = require("util");
|
|
5415
|
-
var
|
|
5827
|
+
var fs5 = require("fs");
|
|
5416
5828
|
async function isType(fsStatType, statsMethodName, filePath) {
|
|
5417
5829
|
if (typeof filePath !== "string") {
|
|
5418
5830
|
throw new TypeError(`Expected a string, got ${typeof filePath}`);
|
|
5419
5831
|
}
|
|
5420
5832
|
try {
|
|
5421
|
-
const stats = await promisify(
|
|
5833
|
+
const stats = await promisify(fs5[fsStatType])(filePath);
|
|
5422
5834
|
return stats[statsMethodName]();
|
|
5423
5835
|
} catch (error) {
|
|
5424
5836
|
if (error.code === "ENOENT") {
|
|
@@ -5432,7 +5844,7 @@ var require_path_type = __commonJS({
|
|
|
5432
5844
|
throw new TypeError(`Expected a string, got ${typeof filePath}`);
|
|
5433
5845
|
}
|
|
5434
5846
|
try {
|
|
5435
|
-
return
|
|
5847
|
+
return fs5[fsStatType](filePath)[statsMethodName]();
|
|
5436
5848
|
} catch (error) {
|
|
5437
5849
|
if (error.code === "ENOENT") {
|
|
5438
5850
|
return false;
|
|
@@ -5454,15 +5866,15 @@ var require_dir_glob = __commonJS({
|
|
|
5454
5866
|
"../../node_modules/dir-glob/index.js"(exports, module2) {
|
|
5455
5867
|
"use strict";
|
|
5456
5868
|
init_cjs_shims();
|
|
5457
|
-
var
|
|
5869
|
+
var path4 = require("path");
|
|
5458
5870
|
var pathType = require_path_type();
|
|
5459
5871
|
var getExtensions = (extensions) => extensions.length > 1 ? `{${extensions.join(",")}}` : extensions[0];
|
|
5460
5872
|
var getPath = (filepath, cwd) => {
|
|
5461
5873
|
const pth = filepath[0] === "!" ? filepath.slice(1) : filepath;
|
|
5462
|
-
return
|
|
5874
|
+
return path4.isAbsolute(pth) ? pth : path4.join(cwd, pth);
|
|
5463
5875
|
};
|
|
5464
5876
|
var addExtensions = (file, extensions) => {
|
|
5465
|
-
if (
|
|
5877
|
+
if (path4.extname(file)) {
|
|
5466
5878
|
return `**/${file}`;
|
|
5467
5879
|
}
|
|
5468
5880
|
return `**/${file}.${getExtensions(extensions)}`;
|
|
@@ -5475,15 +5887,15 @@ var require_dir_glob = __commonJS({
|
|
|
5475
5887
|
throw new TypeError(`Expected \`extensions\` to be of type \`Array\` but received type \`${typeof options.extensions}\``);
|
|
5476
5888
|
}
|
|
5477
5889
|
if (options.files && options.extensions) {
|
|
5478
|
-
return options.files.map((x) =>
|
|
5890
|
+
return options.files.map((x) => path4.posix.join(directory, addExtensions(x, options.extensions)));
|
|
5479
5891
|
}
|
|
5480
5892
|
if (options.files) {
|
|
5481
|
-
return options.files.map((x) =>
|
|
5893
|
+
return options.files.map((x) => path4.posix.join(directory, `**/${x}`));
|
|
5482
5894
|
}
|
|
5483
5895
|
if (options.extensions) {
|
|
5484
|
-
return [
|
|
5896
|
+
return [path4.posix.join(directory, `**/*.${getExtensions(options.extensions)}`)];
|
|
5485
5897
|
}
|
|
5486
|
-
return [
|
|
5898
|
+
return [path4.posix.join(directory, "**")];
|
|
5487
5899
|
};
|
|
5488
5900
|
module2.exports = async (input, options) => {
|
|
5489
5901
|
options = {
|
|
@@ -5658,17 +6070,17 @@ var require_ignore = __commonJS({
|
|
|
5658
6070
|
var throwError = (message, Ctor) => {
|
|
5659
6071
|
throw new Ctor(message);
|
|
5660
6072
|
};
|
|
5661
|
-
var checkPath = (
|
|
5662
|
-
if (!isString(
|
|
6073
|
+
var checkPath = (path4, originalPath, doThrow) => {
|
|
6074
|
+
if (!isString(path4)) {
|
|
5663
6075
|
return doThrow(
|
|
5664
6076
|
`path must be a string, but got \`${originalPath}\``,
|
|
5665
6077
|
TypeError
|
|
5666
6078
|
);
|
|
5667
6079
|
}
|
|
5668
|
-
if (!
|
|
6080
|
+
if (!path4) {
|
|
5669
6081
|
return doThrow(`path must not be empty`, TypeError);
|
|
5670
6082
|
}
|
|
5671
|
-
if (checkPath.isNotRelative(
|
|
6083
|
+
if (checkPath.isNotRelative(path4)) {
|
|
5672
6084
|
const r = "`path.relative()`d";
|
|
5673
6085
|
return doThrow(
|
|
5674
6086
|
`path should be a ${r} string, but got "${originalPath}"`,
|
|
@@ -5677,7 +6089,7 @@ var require_ignore = __commonJS({
|
|
|
5677
6089
|
}
|
|
5678
6090
|
return true;
|
|
5679
6091
|
};
|
|
5680
|
-
var isNotRelative = (
|
|
6092
|
+
var isNotRelative = (path4) => REGEX_TEST_INVALID_PATH.test(path4);
|
|
5681
6093
|
checkPath.isNotRelative = isNotRelative;
|
|
5682
6094
|
checkPath.convert = (p) => p;
|
|
5683
6095
|
var Ignore = class {
|
|
@@ -5721,7 +6133,7 @@ var require_ignore = __commonJS({
|
|
|
5721
6133
|
addPattern(pattern) {
|
|
5722
6134
|
return this.add(pattern);
|
|
5723
6135
|
}
|
|
5724
|
-
_testOne(
|
|
6136
|
+
_testOne(path4, checkUnignored) {
|
|
5725
6137
|
let ignored = false;
|
|
5726
6138
|
let unignored = false;
|
|
5727
6139
|
this._rules.forEach((rule) => {
|
|
@@ -5729,7 +6141,7 @@ var require_ignore = __commonJS({
|
|
|
5729
6141
|
if (unignored === negative && ignored !== unignored || negative && !ignored && !unignored && !checkUnignored) {
|
|
5730
6142
|
return;
|
|
5731
6143
|
}
|
|
5732
|
-
const matched = rule.regex.test(
|
|
6144
|
+
const matched = rule.regex.test(path4);
|
|
5733
6145
|
if (matched) {
|
|
5734
6146
|
ignored = !negative;
|
|
5735
6147
|
unignored = negative;
|
|
@@ -5741,24 +6153,24 @@ var require_ignore = __commonJS({
|
|
|
5741
6153
|
};
|
|
5742
6154
|
}
|
|
5743
6155
|
_test(originalPath, cache, checkUnignored, slices) {
|
|
5744
|
-
const
|
|
6156
|
+
const path4 = originalPath && checkPath.convert(originalPath);
|
|
5745
6157
|
checkPath(
|
|
5746
|
-
|
|
6158
|
+
path4,
|
|
5747
6159
|
originalPath,
|
|
5748
6160
|
this._allowRelativePaths ? RETURN_FALSE : throwError
|
|
5749
6161
|
);
|
|
5750
|
-
return this._t(
|
|
6162
|
+
return this._t(path4, cache, checkUnignored, slices);
|
|
5751
6163
|
}
|
|
5752
|
-
_t(
|
|
5753
|
-
if (
|
|
5754
|
-
return cache[
|
|
6164
|
+
_t(path4, cache, checkUnignored, slices) {
|
|
6165
|
+
if (path4 in cache) {
|
|
6166
|
+
return cache[path4];
|
|
5755
6167
|
}
|
|
5756
6168
|
if (!slices) {
|
|
5757
|
-
slices =
|
|
6169
|
+
slices = path4.split(SLASH);
|
|
5758
6170
|
}
|
|
5759
6171
|
slices.pop();
|
|
5760
6172
|
if (!slices.length) {
|
|
5761
|
-
return cache[
|
|
6173
|
+
return cache[path4] = this._testOne(path4, checkUnignored);
|
|
5762
6174
|
}
|
|
5763
6175
|
const parent = this._t(
|
|
5764
6176
|
slices.join(SLASH) + SLASH,
|
|
@@ -5766,23 +6178,23 @@ var require_ignore = __commonJS({
|
|
|
5766
6178
|
checkUnignored,
|
|
5767
6179
|
slices
|
|
5768
6180
|
);
|
|
5769
|
-
return cache[
|
|
6181
|
+
return cache[path4] = parent.ignored ? parent : this._testOne(path4, checkUnignored);
|
|
5770
6182
|
}
|
|
5771
|
-
ignores(
|
|
5772
|
-
return this._test(
|
|
6183
|
+
ignores(path4) {
|
|
6184
|
+
return this._test(path4, this._ignoreCache, false).ignored;
|
|
5773
6185
|
}
|
|
5774
6186
|
createFilter() {
|
|
5775
|
-
return (
|
|
6187
|
+
return (path4) => !this.ignores(path4);
|
|
5776
6188
|
}
|
|
5777
6189
|
filter(paths) {
|
|
5778
6190
|
return makeArray(paths).filter(this.createFilter());
|
|
5779
6191
|
}
|
|
5780
|
-
test(
|
|
5781
|
-
return this._test(
|
|
6192
|
+
test(path4) {
|
|
6193
|
+
return this._test(path4, this._testCache, true);
|
|
5782
6194
|
}
|
|
5783
6195
|
};
|
|
5784
6196
|
var factory = (options) => new Ignore(options);
|
|
5785
|
-
var isPathValid = (
|
|
6197
|
+
var isPathValid = (path4) => checkPath(path4 && checkPath.convert(path4), path4, RETURN_FALSE);
|
|
5786
6198
|
factory.isPathValid = isPathValid;
|
|
5787
6199
|
factory.default = factory;
|
|
5788
6200
|
module2.exports = factory;
|
|
@@ -5790,307 +6202,11 @@ var require_ignore = __commonJS({
|
|
|
5790
6202
|
const makePosix = (str) => /^\\\\\?\\/.test(str) || /["<>|\u0000-\u001F]+/u.test(str) ? str : str.replace(/\\/g, "/");
|
|
5791
6203
|
checkPath.convert = makePosix;
|
|
5792
6204
|
const REGIX_IS_WINDOWS_PATH_ABSOLUTE = /^[a-z]:\//i;
|
|
5793
|
-
checkPath.isNotRelative = (
|
|
6205
|
+
checkPath.isNotRelative = (path4) => REGIX_IS_WINDOWS_PATH_ABSOLUTE.test(path4) || isNotRelative(path4);
|
|
5794
6206
|
}
|
|
5795
6207
|
}
|
|
5796
6208
|
});
|
|
5797
6209
|
|
|
5798
|
-
// ../../node_modules/slash/index.js
|
|
5799
|
-
var require_slash = __commonJS({
|
|
5800
|
-
"../../node_modules/slash/index.js"(exports, module2) {
|
|
5801
|
-
"use strict";
|
|
5802
|
-
init_cjs_shims();
|
|
5803
|
-
module2.exports = (path3) => {
|
|
5804
|
-
const isExtendedLengthPath = /^\\\\\?\\/.test(path3);
|
|
5805
|
-
const hasNonAscii = /[^\u0000-\u0080]+/.test(path3);
|
|
5806
|
-
if (isExtendedLengthPath || hasNonAscii) {
|
|
5807
|
-
return path3;
|
|
5808
|
-
}
|
|
5809
|
-
return path3.replace(/\\/g, "/");
|
|
5810
|
-
};
|
|
5811
|
-
}
|
|
5812
|
-
});
|
|
5813
|
-
|
|
5814
|
-
// ../../node_modules/globby/gitignore.js
|
|
5815
|
-
var require_gitignore = __commonJS({
|
|
5816
|
-
"../../node_modules/globby/gitignore.js"(exports, module2) {
|
|
5817
|
-
"use strict";
|
|
5818
|
-
init_cjs_shims();
|
|
5819
|
-
var { promisify } = require("util");
|
|
5820
|
-
var fs3 = require("fs");
|
|
5821
|
-
var path3 = require("path");
|
|
5822
|
-
var fastGlob = require_out4();
|
|
5823
|
-
var gitIgnore = require_ignore();
|
|
5824
|
-
var slash = require_slash();
|
|
5825
|
-
var DEFAULT_IGNORE = [
|
|
5826
|
-
"**/node_modules/**",
|
|
5827
|
-
"**/flow-typed/**",
|
|
5828
|
-
"**/coverage/**",
|
|
5829
|
-
"**/.git"
|
|
5830
|
-
];
|
|
5831
|
-
var readFileP = promisify(fs3.readFile);
|
|
5832
|
-
var mapGitIgnorePatternTo = (base) => (ignore) => {
|
|
5833
|
-
if (ignore.startsWith("!")) {
|
|
5834
|
-
return "!" + path3.posix.join(base, ignore.slice(1));
|
|
5835
|
-
}
|
|
5836
|
-
return path3.posix.join(base, ignore);
|
|
5837
|
-
};
|
|
5838
|
-
var parseGitIgnore = (content, options) => {
|
|
5839
|
-
const base = slash(path3.relative(options.cwd, path3.dirname(options.fileName)));
|
|
5840
|
-
return content.split(/\r?\n/).filter(Boolean).filter((line) => !line.startsWith("#")).map(mapGitIgnorePatternTo(base));
|
|
5841
|
-
};
|
|
5842
|
-
var reduceIgnore = (files) => {
|
|
5843
|
-
const ignores = gitIgnore();
|
|
5844
|
-
for (const file of files) {
|
|
5845
|
-
ignores.add(parseGitIgnore(file.content, {
|
|
5846
|
-
cwd: file.cwd,
|
|
5847
|
-
fileName: file.filePath
|
|
5848
|
-
}));
|
|
5849
|
-
}
|
|
5850
|
-
return ignores;
|
|
5851
|
-
};
|
|
5852
|
-
var ensureAbsolutePathForCwd = (cwd, p) => {
|
|
5853
|
-
cwd = slash(cwd);
|
|
5854
|
-
if (path3.isAbsolute(p)) {
|
|
5855
|
-
if (slash(p).startsWith(cwd)) {
|
|
5856
|
-
return p;
|
|
5857
|
-
}
|
|
5858
|
-
throw new Error(`Path ${p} is not in cwd ${cwd}`);
|
|
5859
|
-
}
|
|
5860
|
-
return path3.join(cwd, p);
|
|
5861
|
-
};
|
|
5862
|
-
var getIsIgnoredPredecate = (ignores, cwd) => {
|
|
5863
|
-
return (p) => ignores.ignores(slash(path3.relative(cwd, ensureAbsolutePathForCwd(cwd, p.path || p))));
|
|
5864
|
-
};
|
|
5865
|
-
var getFile = async (file, cwd) => {
|
|
5866
|
-
const filePath = path3.join(cwd, file);
|
|
5867
|
-
const content = await readFileP(filePath, "utf8");
|
|
5868
|
-
return {
|
|
5869
|
-
cwd,
|
|
5870
|
-
filePath,
|
|
5871
|
-
content
|
|
5872
|
-
};
|
|
5873
|
-
};
|
|
5874
|
-
var getFileSync = (file, cwd) => {
|
|
5875
|
-
const filePath = path3.join(cwd, file);
|
|
5876
|
-
const content = fs3.readFileSync(filePath, "utf8");
|
|
5877
|
-
return {
|
|
5878
|
-
cwd,
|
|
5879
|
-
filePath,
|
|
5880
|
-
content
|
|
5881
|
-
};
|
|
5882
|
-
};
|
|
5883
|
-
var normalizeOptions = ({
|
|
5884
|
-
ignore = [],
|
|
5885
|
-
cwd = slash(process.cwd())
|
|
5886
|
-
} = {}) => {
|
|
5887
|
-
return { ignore, cwd };
|
|
5888
|
-
};
|
|
5889
|
-
module2.exports = async (options) => {
|
|
5890
|
-
options = normalizeOptions(options);
|
|
5891
|
-
const paths = await fastGlob("**/.gitignore", {
|
|
5892
|
-
ignore: DEFAULT_IGNORE.concat(options.ignore),
|
|
5893
|
-
cwd: options.cwd
|
|
5894
|
-
});
|
|
5895
|
-
const files = await Promise.all(paths.map((file) => getFile(file, options.cwd)));
|
|
5896
|
-
const ignores = reduceIgnore(files);
|
|
5897
|
-
return getIsIgnoredPredecate(ignores, options.cwd);
|
|
5898
|
-
};
|
|
5899
|
-
module2.exports.sync = (options) => {
|
|
5900
|
-
options = normalizeOptions(options);
|
|
5901
|
-
const paths = fastGlob.sync("**/.gitignore", {
|
|
5902
|
-
ignore: DEFAULT_IGNORE.concat(options.ignore),
|
|
5903
|
-
cwd: options.cwd
|
|
5904
|
-
});
|
|
5905
|
-
const files = paths.map((file) => getFileSync(file, options.cwd));
|
|
5906
|
-
const ignores = reduceIgnore(files);
|
|
5907
|
-
return getIsIgnoredPredecate(ignores, options.cwd);
|
|
5908
|
-
};
|
|
5909
|
-
}
|
|
5910
|
-
});
|
|
5911
|
-
|
|
5912
|
-
// ../../node_modules/globby/stream-utils.js
|
|
5913
|
-
var require_stream_utils = __commonJS({
|
|
5914
|
-
"../../node_modules/globby/stream-utils.js"(exports, module2) {
|
|
5915
|
-
"use strict";
|
|
5916
|
-
init_cjs_shims();
|
|
5917
|
-
var { Transform } = require("stream");
|
|
5918
|
-
var ObjectTransform = class extends Transform {
|
|
5919
|
-
constructor() {
|
|
5920
|
-
super({
|
|
5921
|
-
objectMode: true
|
|
5922
|
-
});
|
|
5923
|
-
}
|
|
5924
|
-
};
|
|
5925
|
-
var FilterStream = class extends ObjectTransform {
|
|
5926
|
-
constructor(filter) {
|
|
5927
|
-
super();
|
|
5928
|
-
this._filter = filter;
|
|
5929
|
-
}
|
|
5930
|
-
_transform(data, encoding, callback) {
|
|
5931
|
-
if (this._filter(data)) {
|
|
5932
|
-
this.push(data);
|
|
5933
|
-
}
|
|
5934
|
-
callback();
|
|
5935
|
-
}
|
|
5936
|
-
};
|
|
5937
|
-
var UniqueStream = class extends ObjectTransform {
|
|
5938
|
-
constructor() {
|
|
5939
|
-
super();
|
|
5940
|
-
this._pushed = /* @__PURE__ */ new Set();
|
|
5941
|
-
}
|
|
5942
|
-
_transform(data, encoding, callback) {
|
|
5943
|
-
if (!this._pushed.has(data)) {
|
|
5944
|
-
this.push(data);
|
|
5945
|
-
this._pushed.add(data);
|
|
5946
|
-
}
|
|
5947
|
-
callback();
|
|
5948
|
-
}
|
|
5949
|
-
};
|
|
5950
|
-
module2.exports = {
|
|
5951
|
-
FilterStream,
|
|
5952
|
-
UniqueStream
|
|
5953
|
-
};
|
|
5954
|
-
}
|
|
5955
|
-
});
|
|
5956
|
-
|
|
5957
|
-
// ../../node_modules/globby/index.js
|
|
5958
|
-
var require_globby = __commonJS({
|
|
5959
|
-
"../../node_modules/globby/index.js"(exports, module2) {
|
|
5960
|
-
"use strict";
|
|
5961
|
-
init_cjs_shims();
|
|
5962
|
-
var fs3 = require("fs");
|
|
5963
|
-
var arrayUnion = require_array_union();
|
|
5964
|
-
var merge2 = require_merge2();
|
|
5965
|
-
var fastGlob = require_out4();
|
|
5966
|
-
var dirGlob = require_dir_glob();
|
|
5967
|
-
var gitignore = require_gitignore();
|
|
5968
|
-
var { FilterStream, UniqueStream } = require_stream_utils();
|
|
5969
|
-
var DEFAULT_FILTER = () => false;
|
|
5970
|
-
var isNegative = (pattern) => pattern[0] === "!";
|
|
5971
|
-
var assertPatternsInput = (patterns) => {
|
|
5972
|
-
if (!patterns.every((pattern) => typeof pattern === "string")) {
|
|
5973
|
-
throw new TypeError("Patterns must be a string or an array of strings");
|
|
5974
|
-
}
|
|
5975
|
-
};
|
|
5976
|
-
var checkCwdOption = (options = {}) => {
|
|
5977
|
-
if (!options.cwd) {
|
|
5978
|
-
return;
|
|
5979
|
-
}
|
|
5980
|
-
let stat;
|
|
5981
|
-
try {
|
|
5982
|
-
stat = fs3.statSync(options.cwd);
|
|
5983
|
-
} catch {
|
|
5984
|
-
return;
|
|
5985
|
-
}
|
|
5986
|
-
if (!stat.isDirectory()) {
|
|
5987
|
-
throw new Error("The `cwd` option must be a path to a directory");
|
|
5988
|
-
}
|
|
5989
|
-
};
|
|
5990
|
-
var getPathString = (p) => p.stats instanceof fs3.Stats ? p.path : p;
|
|
5991
|
-
var generateGlobTasks = (patterns, taskOptions) => {
|
|
5992
|
-
patterns = arrayUnion([].concat(patterns));
|
|
5993
|
-
assertPatternsInput(patterns);
|
|
5994
|
-
checkCwdOption(taskOptions);
|
|
5995
|
-
const globTasks = [];
|
|
5996
|
-
taskOptions = {
|
|
5997
|
-
ignore: [],
|
|
5998
|
-
expandDirectories: true,
|
|
5999
|
-
...taskOptions
|
|
6000
|
-
};
|
|
6001
|
-
for (const [index, pattern] of patterns.entries()) {
|
|
6002
|
-
if (isNegative(pattern)) {
|
|
6003
|
-
continue;
|
|
6004
|
-
}
|
|
6005
|
-
const ignore = patterns.slice(index).filter((pattern2) => isNegative(pattern2)).map((pattern2) => pattern2.slice(1));
|
|
6006
|
-
const options = {
|
|
6007
|
-
...taskOptions,
|
|
6008
|
-
ignore: taskOptions.ignore.concat(ignore)
|
|
6009
|
-
};
|
|
6010
|
-
globTasks.push({ pattern, options });
|
|
6011
|
-
}
|
|
6012
|
-
return globTasks;
|
|
6013
|
-
};
|
|
6014
|
-
var globDirs = (task, fn) => {
|
|
6015
|
-
let options = {};
|
|
6016
|
-
if (task.options.cwd) {
|
|
6017
|
-
options.cwd = task.options.cwd;
|
|
6018
|
-
}
|
|
6019
|
-
if (Array.isArray(task.options.expandDirectories)) {
|
|
6020
|
-
options = {
|
|
6021
|
-
...options,
|
|
6022
|
-
files: task.options.expandDirectories
|
|
6023
|
-
};
|
|
6024
|
-
} else if (typeof task.options.expandDirectories === "object") {
|
|
6025
|
-
options = {
|
|
6026
|
-
...options,
|
|
6027
|
-
...task.options.expandDirectories
|
|
6028
|
-
};
|
|
6029
|
-
}
|
|
6030
|
-
return fn(task.pattern, options);
|
|
6031
|
-
};
|
|
6032
|
-
var getPattern = (task, fn) => task.options.expandDirectories ? globDirs(task, fn) : [task.pattern];
|
|
6033
|
-
var getFilterSync = (options) => {
|
|
6034
|
-
return options && options.gitignore ? gitignore.sync({ cwd: options.cwd, ignore: options.ignore }) : DEFAULT_FILTER;
|
|
6035
|
-
};
|
|
6036
|
-
var globToTask = (task) => (glob) => {
|
|
6037
|
-
const { options } = task;
|
|
6038
|
-
if (options.ignore && Array.isArray(options.ignore) && options.expandDirectories) {
|
|
6039
|
-
options.ignore = dirGlob.sync(options.ignore);
|
|
6040
|
-
}
|
|
6041
|
-
return {
|
|
6042
|
-
pattern: glob,
|
|
6043
|
-
options
|
|
6044
|
-
};
|
|
6045
|
-
};
|
|
6046
|
-
module2.exports = async (patterns, options) => {
|
|
6047
|
-
const globTasks = generateGlobTasks(patterns, options);
|
|
6048
|
-
const getFilter = async () => {
|
|
6049
|
-
return options && options.gitignore ? gitignore({ cwd: options.cwd, ignore: options.ignore }) : DEFAULT_FILTER;
|
|
6050
|
-
};
|
|
6051
|
-
const getTasks = async () => {
|
|
6052
|
-
const tasks2 = await Promise.all(globTasks.map(async (task) => {
|
|
6053
|
-
const globs = await getPattern(task, dirGlob);
|
|
6054
|
-
return Promise.all(globs.map(globToTask(task)));
|
|
6055
|
-
}));
|
|
6056
|
-
return arrayUnion(...tasks2);
|
|
6057
|
-
};
|
|
6058
|
-
const [filter, tasks] = await Promise.all([getFilter(), getTasks()]);
|
|
6059
|
-
const paths = await Promise.all(tasks.map((task) => fastGlob(task.pattern, task.options)));
|
|
6060
|
-
return arrayUnion(...paths).filter((path_) => !filter(getPathString(path_)));
|
|
6061
|
-
};
|
|
6062
|
-
module2.exports.sync = (patterns, options) => {
|
|
6063
|
-
const globTasks = generateGlobTasks(patterns, options);
|
|
6064
|
-
const tasks = [];
|
|
6065
|
-
for (const task of globTasks) {
|
|
6066
|
-
const newTask = getPattern(task, dirGlob.sync).map(globToTask(task));
|
|
6067
|
-
tasks.push(...newTask);
|
|
6068
|
-
}
|
|
6069
|
-
const filter = getFilterSync(options);
|
|
6070
|
-
let matches = [];
|
|
6071
|
-
for (const task of tasks) {
|
|
6072
|
-
matches = arrayUnion(matches, fastGlob.sync(task.pattern, task.options));
|
|
6073
|
-
}
|
|
6074
|
-
return matches.filter((path_) => !filter(path_));
|
|
6075
|
-
};
|
|
6076
|
-
module2.exports.stream = (patterns, options) => {
|
|
6077
|
-
const globTasks = generateGlobTasks(patterns, options);
|
|
6078
|
-
const tasks = [];
|
|
6079
|
-
for (const task of globTasks) {
|
|
6080
|
-
const newTask = getPattern(task, dirGlob.sync).map(globToTask(task));
|
|
6081
|
-
tasks.push(...newTask);
|
|
6082
|
-
}
|
|
6083
|
-
const filter = getFilterSync(options);
|
|
6084
|
-
const filterStream = new FilterStream((p) => !filter(p));
|
|
6085
|
-
const uniqueStream = new UniqueStream();
|
|
6086
|
-
return merge2(tasks.map((task) => fastGlob.stream(task.pattern, task.options))).pipe(filterStream).pipe(uniqueStream);
|
|
6087
|
-
};
|
|
6088
|
-
module2.exports.generateGlobTasks = generateGlobTasks;
|
|
6089
|
-
module2.exports.hasMagic = (patterns, options) => [].concat(patterns).some((pattern) => fastGlob.isDynamicPattern(pattern, options));
|
|
6090
|
-
module2.exports.gitignore = gitignore;
|
|
6091
|
-
}
|
|
6092
|
-
});
|
|
6093
|
-
|
|
6094
6210
|
// src/generators/index.ts
|
|
6095
6211
|
var generators_exports = {};
|
|
6096
6212
|
__export(generators_exports, {
|
|
@@ -6103,7 +6219,7 @@ init_cjs_shims();
|
|
|
6103
6219
|
// src/generators/generate-openapi/index.ts
|
|
6104
6220
|
init_cjs_shims();
|
|
6105
6221
|
var import_promises = __toESM(require("fs/promises"));
|
|
6106
|
-
var import_zod_openapi =
|
|
6222
|
+
var import_zod_openapi = __toESM(require_src());
|
|
6107
6223
|
var import_oas31 = require("openapi3-ts/oas31");
|
|
6108
6224
|
|
|
6109
6225
|
// node_modules/chalk/source/index.js
|
|
@@ -6597,8 +6713,280 @@ var import_zod = require("zod");
|
|
|
6597
6713
|
|
|
6598
6714
|
// src/generators/lib/parse-routes-in-package.ts
|
|
6599
6715
|
init_cjs_shims();
|
|
6600
|
-
var
|
|
6601
|
-
|
|
6716
|
+
var import_node_path3 = __toESM(require("path"));
|
|
6717
|
+
|
|
6718
|
+
// node_modules/globby/index.js
|
|
6719
|
+
init_cjs_shims();
|
|
6720
|
+
var import_node_fs2 = __toESM(require("fs"), 1);
|
|
6721
|
+
var import_node_path2 = __toESM(require("path"), 1);
|
|
6722
|
+
var import_merge2 = __toESM(require_merge2(), 1);
|
|
6723
|
+
var import_fast_glob2 = __toESM(require_out4(), 1);
|
|
6724
|
+
var import_dir_glob = __toESM(require_dir_glob(), 1);
|
|
6725
|
+
|
|
6726
|
+
// node_modules/globby/ignore.js
|
|
6727
|
+
init_cjs_shims();
|
|
6728
|
+
var import_node_process2 = __toESM(require("process"), 1);
|
|
6729
|
+
var import_node_fs = __toESM(require("fs"), 1);
|
|
6730
|
+
var import_node_path = __toESM(require("path"), 1);
|
|
6731
|
+
var import_fast_glob = __toESM(require_out4(), 1);
|
|
6732
|
+
var import_ignore = __toESM(require_ignore(), 1);
|
|
6733
|
+
|
|
6734
|
+
// node_modules/slash/index.js
|
|
6735
|
+
init_cjs_shims();
|
|
6736
|
+
function slash(path4) {
|
|
6737
|
+
const isExtendedLengthPath = /^\\\\\?\\/.test(path4);
|
|
6738
|
+
const hasNonAscii = /[^\u0000-\u0080]+/.test(path4);
|
|
6739
|
+
if (isExtendedLengthPath || hasNonAscii) {
|
|
6740
|
+
return path4;
|
|
6741
|
+
}
|
|
6742
|
+
return path4.replace(/\\/g, "/");
|
|
6743
|
+
}
|
|
6744
|
+
|
|
6745
|
+
// node_modules/globby/utilities.js
|
|
6746
|
+
init_cjs_shims();
|
|
6747
|
+
var import_node_url = require("url");
|
|
6748
|
+
var import_node_stream = require("stream");
|
|
6749
|
+
var toPath = (urlOrPath) => urlOrPath instanceof URL ? (0, import_node_url.fileURLToPath)(urlOrPath) : urlOrPath;
|
|
6750
|
+
var FilterStream = class extends import_node_stream.Transform {
|
|
6751
|
+
constructor(filter) {
|
|
6752
|
+
super({
|
|
6753
|
+
objectMode: true,
|
|
6754
|
+
transform(data, encoding, callback) {
|
|
6755
|
+
callback(void 0, filter(data) ? data : void 0);
|
|
6756
|
+
}
|
|
6757
|
+
});
|
|
6758
|
+
}
|
|
6759
|
+
};
|
|
6760
|
+
var isNegativePattern = (pattern) => pattern[0] === "!";
|
|
6761
|
+
|
|
6762
|
+
// node_modules/globby/ignore.js
|
|
6763
|
+
var ignoreFilesGlobOptions = {
|
|
6764
|
+
ignore: [
|
|
6765
|
+
"**/node_modules",
|
|
6766
|
+
"**/flow-typed",
|
|
6767
|
+
"**/coverage",
|
|
6768
|
+
"**/.git"
|
|
6769
|
+
],
|
|
6770
|
+
absolute: true,
|
|
6771
|
+
dot: true
|
|
6772
|
+
};
|
|
6773
|
+
var GITIGNORE_FILES_PATTERN = "**/.gitignore";
|
|
6774
|
+
var applyBaseToPattern = (pattern, base) => isNegativePattern(pattern) ? "!" + import_node_path.default.posix.join(base, pattern.slice(1)) : import_node_path.default.posix.join(base, pattern);
|
|
6775
|
+
var parseIgnoreFile = (file, cwd) => {
|
|
6776
|
+
const base = slash(import_node_path.default.relative(cwd, import_node_path.default.dirname(file.filePath)));
|
|
6777
|
+
return file.content.split(/\r?\n/).filter((line) => line && !line.startsWith("#")).map((pattern) => applyBaseToPattern(pattern, base));
|
|
6778
|
+
};
|
|
6779
|
+
var toRelativePath = (fileOrDirectory, cwd) => {
|
|
6780
|
+
cwd = slash(cwd);
|
|
6781
|
+
if (import_node_path.default.isAbsolute(fileOrDirectory)) {
|
|
6782
|
+
if (slash(fileOrDirectory).startsWith(cwd)) {
|
|
6783
|
+
return import_node_path.default.relative(cwd, fileOrDirectory);
|
|
6784
|
+
}
|
|
6785
|
+
throw new Error(`Path ${fileOrDirectory} is not in cwd ${cwd}`);
|
|
6786
|
+
}
|
|
6787
|
+
return fileOrDirectory;
|
|
6788
|
+
};
|
|
6789
|
+
var getIsIgnoredPredicate = (files, cwd) => {
|
|
6790
|
+
const patterns = files.flatMap((file) => parseIgnoreFile(file, cwd));
|
|
6791
|
+
const ignores = (0, import_ignore.default)().add(patterns);
|
|
6792
|
+
return (fileOrDirectory) => {
|
|
6793
|
+
fileOrDirectory = toPath(fileOrDirectory);
|
|
6794
|
+
fileOrDirectory = toRelativePath(fileOrDirectory, cwd);
|
|
6795
|
+
return fileOrDirectory ? ignores.ignores(slash(fileOrDirectory)) : false;
|
|
6796
|
+
};
|
|
6797
|
+
};
|
|
6798
|
+
var normalizeOptions = (options = {}) => ({
|
|
6799
|
+
cwd: toPath(options.cwd) || import_node_process2.default.cwd(),
|
|
6800
|
+
suppressErrors: Boolean(options.suppressErrors),
|
|
6801
|
+
deep: typeof options.deep === "number" ? options.deep : Number.POSITIVE_INFINITY
|
|
6802
|
+
});
|
|
6803
|
+
var isIgnoredByIgnoreFiles = async (patterns, options) => {
|
|
6804
|
+
const { cwd, suppressErrors, deep } = normalizeOptions(options);
|
|
6805
|
+
const paths = await (0, import_fast_glob.default)(patterns, { cwd, suppressErrors, deep, ...ignoreFilesGlobOptions });
|
|
6806
|
+
const files = await Promise.all(
|
|
6807
|
+
paths.map(async (filePath) => ({
|
|
6808
|
+
filePath,
|
|
6809
|
+
content: await import_node_fs.default.promises.readFile(filePath, "utf8")
|
|
6810
|
+
}))
|
|
6811
|
+
);
|
|
6812
|
+
return getIsIgnoredPredicate(files, cwd);
|
|
6813
|
+
};
|
|
6814
|
+
var isIgnoredByIgnoreFilesSync = (patterns, options) => {
|
|
6815
|
+
const { cwd, suppressErrors, deep } = normalizeOptions(options);
|
|
6816
|
+
const paths = import_fast_glob.default.sync(patterns, { cwd, suppressErrors, deep, ...ignoreFilesGlobOptions });
|
|
6817
|
+
const files = paths.map((filePath) => ({
|
|
6818
|
+
filePath,
|
|
6819
|
+
content: import_node_fs.default.readFileSync(filePath, "utf8")
|
|
6820
|
+
}));
|
|
6821
|
+
return getIsIgnoredPredicate(files, cwd);
|
|
6822
|
+
};
|
|
6823
|
+
|
|
6824
|
+
// node_modules/globby/index.js
|
|
6825
|
+
var assertPatternsInput = (patterns) => {
|
|
6826
|
+
if (patterns.some((pattern) => typeof pattern !== "string")) {
|
|
6827
|
+
throw new TypeError("Patterns must be a string or an array of strings");
|
|
6828
|
+
}
|
|
6829
|
+
};
|
|
6830
|
+
var toPatternsArray = (patterns) => {
|
|
6831
|
+
patterns = [...new Set([patterns].flat())];
|
|
6832
|
+
assertPatternsInput(patterns);
|
|
6833
|
+
return patterns;
|
|
6834
|
+
};
|
|
6835
|
+
var checkCwdOption = (options) => {
|
|
6836
|
+
if (!options.cwd) {
|
|
6837
|
+
return;
|
|
6838
|
+
}
|
|
6839
|
+
let stat;
|
|
6840
|
+
try {
|
|
6841
|
+
stat = import_node_fs2.default.statSync(options.cwd);
|
|
6842
|
+
} catch {
|
|
6843
|
+
return;
|
|
6844
|
+
}
|
|
6845
|
+
if (!stat.isDirectory()) {
|
|
6846
|
+
throw new Error("The `cwd` option must be a path to a directory");
|
|
6847
|
+
}
|
|
6848
|
+
};
|
|
6849
|
+
var normalizeOptions2 = (options = {}) => {
|
|
6850
|
+
options = {
|
|
6851
|
+
...options,
|
|
6852
|
+
ignore: options.ignore || [],
|
|
6853
|
+
expandDirectories: options.expandDirectories === void 0 ? true : options.expandDirectories,
|
|
6854
|
+
cwd: toPath(options.cwd)
|
|
6855
|
+
};
|
|
6856
|
+
checkCwdOption(options);
|
|
6857
|
+
return options;
|
|
6858
|
+
};
|
|
6859
|
+
var normalizeArguments = (fn) => async (patterns, options) => fn(toPatternsArray(patterns), normalizeOptions2(options));
|
|
6860
|
+
var normalizeArgumentsSync = (fn) => (patterns, options) => fn(toPatternsArray(patterns), normalizeOptions2(options));
|
|
6861
|
+
var getIgnoreFilesPatterns = (options) => {
|
|
6862
|
+
const { ignoreFiles, gitignore } = options;
|
|
6863
|
+
const patterns = ignoreFiles ? toPatternsArray(ignoreFiles) : [];
|
|
6864
|
+
if (gitignore) {
|
|
6865
|
+
patterns.push(GITIGNORE_FILES_PATTERN);
|
|
6866
|
+
}
|
|
6867
|
+
return patterns;
|
|
6868
|
+
};
|
|
6869
|
+
var getFilter = async (options) => {
|
|
6870
|
+
const ignoreFilesPatterns = getIgnoreFilesPatterns(options);
|
|
6871
|
+
return createFilterFunction(
|
|
6872
|
+
ignoreFilesPatterns.length > 0 && await isIgnoredByIgnoreFiles(ignoreFilesPatterns, options)
|
|
6873
|
+
);
|
|
6874
|
+
};
|
|
6875
|
+
var getFilterSync = (options) => {
|
|
6876
|
+
const ignoreFilesPatterns = getIgnoreFilesPatterns(options);
|
|
6877
|
+
return createFilterFunction(
|
|
6878
|
+
ignoreFilesPatterns.length > 0 && isIgnoredByIgnoreFilesSync(ignoreFilesPatterns, options)
|
|
6879
|
+
);
|
|
6880
|
+
};
|
|
6881
|
+
var createFilterFunction = (isIgnored) => {
|
|
6882
|
+
const seen = /* @__PURE__ */ new Set();
|
|
6883
|
+
return (fastGlobResult) => {
|
|
6884
|
+
const path4 = fastGlobResult.path || fastGlobResult;
|
|
6885
|
+
const pathKey = import_node_path2.default.normalize(path4);
|
|
6886
|
+
const seenOrIgnored = seen.has(pathKey) || isIgnored && isIgnored(path4);
|
|
6887
|
+
seen.add(pathKey);
|
|
6888
|
+
return !seenOrIgnored;
|
|
6889
|
+
};
|
|
6890
|
+
};
|
|
6891
|
+
var unionFastGlobResults = (results, filter) => results.flat().filter((fastGlobResult) => filter(fastGlobResult));
|
|
6892
|
+
var unionFastGlobStreams = (streams, filter) => (0, import_merge2.default)(streams).pipe(new FilterStream((fastGlobResult) => filter(fastGlobResult)));
|
|
6893
|
+
var convertNegativePatterns = (patterns, options) => {
|
|
6894
|
+
const tasks = [];
|
|
6895
|
+
while (patterns.length > 0) {
|
|
6896
|
+
const index = patterns.findIndex((pattern) => isNegativePattern(pattern));
|
|
6897
|
+
if (index === -1) {
|
|
6898
|
+
tasks.push({ patterns, options });
|
|
6899
|
+
break;
|
|
6900
|
+
}
|
|
6901
|
+
const ignorePattern = patterns[index].slice(1);
|
|
6902
|
+
for (const task of tasks) {
|
|
6903
|
+
task.options.ignore.push(ignorePattern);
|
|
6904
|
+
}
|
|
6905
|
+
if (index !== 0) {
|
|
6906
|
+
tasks.push({
|
|
6907
|
+
patterns: patterns.slice(0, index),
|
|
6908
|
+
options: {
|
|
6909
|
+
...options,
|
|
6910
|
+
ignore: [
|
|
6911
|
+
...options.ignore,
|
|
6912
|
+
ignorePattern
|
|
6913
|
+
]
|
|
6914
|
+
}
|
|
6915
|
+
});
|
|
6916
|
+
}
|
|
6917
|
+
patterns = patterns.slice(index + 1);
|
|
6918
|
+
}
|
|
6919
|
+
return tasks;
|
|
6920
|
+
};
|
|
6921
|
+
var getDirGlobOptions = (options, cwd) => ({
|
|
6922
|
+
...cwd ? { cwd } : {},
|
|
6923
|
+
...Array.isArray(options) ? { files: options } : options
|
|
6924
|
+
});
|
|
6925
|
+
var generateTasks = async (patterns, options) => {
|
|
6926
|
+
const globTasks = convertNegativePatterns(patterns, options);
|
|
6927
|
+
const { cwd, expandDirectories } = options;
|
|
6928
|
+
if (!expandDirectories) {
|
|
6929
|
+
return globTasks;
|
|
6930
|
+
}
|
|
6931
|
+
const patternExpandOptions = getDirGlobOptions(expandDirectories, cwd);
|
|
6932
|
+
const ignoreExpandOptions = cwd ? { cwd } : void 0;
|
|
6933
|
+
return Promise.all(
|
|
6934
|
+
globTasks.map(async (task) => {
|
|
6935
|
+
let { patterns: patterns2, options: options2 } = task;
|
|
6936
|
+
[
|
|
6937
|
+
patterns2,
|
|
6938
|
+
options2.ignore
|
|
6939
|
+
] = await Promise.all([
|
|
6940
|
+
(0, import_dir_glob.default)(patterns2, patternExpandOptions),
|
|
6941
|
+
(0, import_dir_glob.default)(options2.ignore, ignoreExpandOptions)
|
|
6942
|
+
]);
|
|
6943
|
+
return { patterns: patterns2, options: options2 };
|
|
6944
|
+
})
|
|
6945
|
+
);
|
|
6946
|
+
};
|
|
6947
|
+
var generateTasksSync = (patterns, options) => {
|
|
6948
|
+
const globTasks = convertNegativePatterns(patterns, options);
|
|
6949
|
+
const { cwd, expandDirectories } = options;
|
|
6950
|
+
if (!expandDirectories) {
|
|
6951
|
+
return globTasks;
|
|
6952
|
+
}
|
|
6953
|
+
const patternExpandOptions = getDirGlobOptions(expandDirectories, cwd);
|
|
6954
|
+
const ignoreExpandOptions = cwd ? { cwd } : void 0;
|
|
6955
|
+
return globTasks.map((task) => {
|
|
6956
|
+
let { patterns: patterns2, options: options2 } = task;
|
|
6957
|
+
patterns2 = import_dir_glob.default.sync(patterns2, patternExpandOptions);
|
|
6958
|
+
options2.ignore = import_dir_glob.default.sync(options2.ignore, ignoreExpandOptions);
|
|
6959
|
+
return { patterns: patterns2, options: options2 };
|
|
6960
|
+
});
|
|
6961
|
+
};
|
|
6962
|
+
var globby = normalizeArguments(async (patterns, options) => {
|
|
6963
|
+
const [
|
|
6964
|
+
tasks,
|
|
6965
|
+
filter
|
|
6966
|
+
] = await Promise.all([
|
|
6967
|
+
generateTasks(patterns, options),
|
|
6968
|
+
getFilter(options)
|
|
6969
|
+
]);
|
|
6970
|
+
const results = await Promise.all(tasks.map((task) => (0, import_fast_glob2.default)(task.patterns, task.options)));
|
|
6971
|
+
return unionFastGlobResults(results, filter);
|
|
6972
|
+
});
|
|
6973
|
+
var globbySync = normalizeArgumentsSync((patterns, options) => {
|
|
6974
|
+
const tasks = generateTasksSync(patterns, options);
|
|
6975
|
+
const filter = getFilterSync(options);
|
|
6976
|
+
const results = tasks.map((task) => import_fast_glob2.default.sync(task.patterns, task.options));
|
|
6977
|
+
return unionFastGlobResults(results, filter);
|
|
6978
|
+
});
|
|
6979
|
+
var globbyStream = normalizeArgumentsSync((patterns, options) => {
|
|
6980
|
+
const tasks = generateTasksSync(patterns, options);
|
|
6981
|
+
const filter = getFilterSync(options);
|
|
6982
|
+
const streams = tasks.map((task) => import_fast_glob2.default.stream(task.patterns, task.options));
|
|
6983
|
+
return unionFastGlobStreams(streams, filter);
|
|
6984
|
+
});
|
|
6985
|
+
var isDynamicPattern = normalizeArgumentsSync(
|
|
6986
|
+
(patterns, options) => patterns.some((pattern) => import_fast_glob2.default.isDynamicPattern(pattern, options))
|
|
6987
|
+
);
|
|
6988
|
+
var generateGlobTasks = normalizeArguments(generateTasks);
|
|
6989
|
+
var generateGlobTasksSync = normalizeArgumentsSync(generateTasksSync);
|
|
6602
6990
|
|
|
6603
6991
|
// src/generators/lib/default-map-file-path-to-http-route.ts
|
|
6604
6992
|
init_cjs_shims();
|
|
@@ -6615,9 +7003,9 @@ var parseRoutesInPackage = async (opts) => {
|
|
|
6615
7003
|
pathGlob = "/pages/api/**/*.ts",
|
|
6616
7004
|
mapFilePathToHTTPRoute = defaultMapFilePathToHTTPRoute(opts.apiPrefix)
|
|
6617
7005
|
} = opts;
|
|
6618
|
-
const fullPathGlob =
|
|
7006
|
+
const fullPathGlob = import_node_path3.default.posix.join(packageDir, pathGlob);
|
|
6619
7007
|
console.log(`searching "${fullPathGlob}"...`);
|
|
6620
|
-
const filepaths = await (
|
|
7008
|
+
const filepaths = await globby(`${fullPathGlob}`);
|
|
6621
7009
|
console.log(`found ${filepaths.length} files`);
|
|
6622
7010
|
if (filepaths.length === 0) {
|
|
6623
7011
|
throw new Error(`No files found at "${fullPathGlob}"`);
|
|
@@ -6625,7 +7013,7 @@ var parseRoutesInPackage = async (opts) => {
|
|
|
6625
7013
|
const filepathToRouteFn = /* @__PURE__ */ new Map();
|
|
6626
7014
|
await Promise.all(
|
|
6627
7015
|
filepaths.map(async (p) => {
|
|
6628
|
-
const { default: routeFn } = await require(
|
|
7016
|
+
const { default: routeFn } = await require(import_node_path3.default.resolve(p));
|
|
6629
7017
|
if (routeFn) {
|
|
6630
7018
|
if (!routeFn._setupParams) {
|
|
6631
7019
|
console.warn(
|
|
@@ -6681,8 +7069,8 @@ function embedSchemaReferences(obj1, obj2) {
|
|
|
6681
7069
|
|
|
6682
7070
|
// src/generators/generate-openapi/fern-sdk-utils.ts
|
|
6683
7071
|
init_cjs_shims();
|
|
6684
|
-
function transformPathToFernSdkMethodName(
|
|
6685
|
-
const parts =
|
|
7072
|
+
function transformPathToFernSdkMethodName(path4) {
|
|
7073
|
+
const parts = path4.split("/").filter((part) => part !== "");
|
|
6686
7074
|
const lastPart = parts[parts.length - 1];
|
|
6687
7075
|
if (lastPart.startsWith("[") && lastPart.endsWith("]")) {
|
|
6688
7076
|
const param = lastPart.slice(1, -1);
|
|
@@ -6690,23 +7078,23 @@ function transformPathToFernSdkMethodName(path3) {
|
|
|
6690
7078
|
}
|
|
6691
7079
|
return lastPart;
|
|
6692
7080
|
}
|
|
6693
|
-
function transformPathToFernSdkGroupName(
|
|
6694
|
-
const parts =
|
|
7081
|
+
function transformPathToFernSdkGroupName(path4) {
|
|
7082
|
+
const parts = path4.split("/").filter((part) => part !== "");
|
|
6695
7083
|
return parts.slice(0, parts.length - 1);
|
|
6696
7084
|
}
|
|
6697
|
-
function getFernSdkMetadata(
|
|
6698
|
-
if (
|
|
7085
|
+
function getFernSdkMetadata(path4) {
|
|
7086
|
+
if (path4.split("/").filter((part) => part !== "").length === 1) {
|
|
6699
7087
|
return {
|
|
6700
7088
|
"x-fern-ignore": true
|
|
6701
7089
|
};
|
|
6702
7090
|
}
|
|
6703
7091
|
return {
|
|
6704
|
-
"x-fern-sdk-group-name": transformPathToFernSdkGroupName(
|
|
6705
|
-
"x-fern-sdk-method-name": transformPathToFernSdkMethodName(
|
|
7092
|
+
"x-fern-sdk-group-name": transformPathToFernSdkGroupName(path4),
|
|
7093
|
+
"x-fern-sdk-method-name": transformPathToFernSdkMethodName(path4)
|
|
6706
7094
|
};
|
|
6707
7095
|
}
|
|
6708
|
-
function mapMethodsToFernSdkMetadata(methods,
|
|
6709
|
-
const fernSdkMetadata = getFernSdkMetadata(
|
|
7096
|
+
function mapMethodsToFernSdkMetadata(methods, path4) {
|
|
7097
|
+
const fernSdkMetadata = getFernSdkMetadata(path4);
|
|
6710
7098
|
if (methods.length === 1) {
|
|
6711
7099
|
return {
|
|
6712
7100
|
[methods[0]]: fernSdkMetadata
|
|
@@ -6739,8 +7127,8 @@ function replaceFirstCharToLowercase(str) {
|
|
|
6739
7127
|
const firstChar = str.charAt(0).toLowerCase();
|
|
6740
7128
|
return firstChar + str.slice(1);
|
|
6741
7129
|
}
|
|
6742
|
-
function transformPathToOperationId(
|
|
6743
|
-
const parts =
|
|
7130
|
+
function transformPathToOperationId(path4) {
|
|
7131
|
+
const parts = path4.replace(/-/g, "_").split("/").filter((part) => part !== "");
|
|
6744
7132
|
const transformedParts = parts.map((part) => {
|
|
6745
7133
|
if (part.startsWith("[") && part.endsWith("]")) {
|
|
6746
7134
|
const serviceName = part.slice(1, -1);
|
|
@@ -6963,7 +7351,7 @@ You can also define "securityObjects" this way, if you want to make the endpoint
|
|
|
6963
7351
|
|
|
6964
7352
|
// src/generators/generate-route-types/index.ts
|
|
6965
7353
|
init_cjs_shims();
|
|
6966
|
-
var
|
|
7354
|
+
var fs4 = __toESM(require("fs/promises"));
|
|
6967
7355
|
var import_zod_to_ts = require("zod-to-ts");
|
|
6968
7356
|
var import_prettier = __toESM(require("prettier"));
|
|
6969
7357
|
var import_zod2 = require("zod");
|
|
@@ -7026,7 +7414,7 @@ export type RouteRequestParams<Path extends keyof Routes> =
|
|
|
7026
7414
|
{ semi: false, parser: "typescript" }
|
|
7027
7415
|
);
|
|
7028
7416
|
if (opts.outputFile) {
|
|
7029
|
-
await
|
|
7417
|
+
await fs4.writeFile(opts.outputFile, output);
|
|
7030
7418
|
}
|
|
7031
7419
|
return output;
|
|
7032
7420
|
};
|
|
@@ -7067,4 +7455,4 @@ export type RouteRequestParams<Path extends keyof Routes> =
|
|
|
7067
7455
|
*/
|
|
7068
7456
|
/*! queue-microtask. MIT License. Feross Aboukhadijeh <https://feross.org/opensource> */
|
|
7069
7457
|
/*! run-parallel. MIT License. Feross Aboukhadijeh <https://feross.org/opensource> */
|
|
7070
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3RzdXAvYXNzZXRzL2Nqc19zaGltcy5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvYXJyYXktdW5pb24vaW5kZXguanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL21lcmdlMi9pbmRleC5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvZmFzdC1nbG9iL291dC91dGlscy9hcnJheS5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvZmFzdC1nbG9iL291dC91dGlscy9lcnJuby5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvZmFzdC1nbG9iL291dC91dGlscy9mcy5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvZmFzdC1nbG9iL291dC91dGlscy9wYXRoLmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9pcy1leHRnbG9iL2luZGV4LmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9pcy1nbG9iL2luZGV4LmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9mYXN0LWdsb2Ivbm9kZV9tb2R1bGVzL2dsb2ItcGFyZW50L2luZGV4LmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9icmFjZXMvbGliL3V0aWxzLmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9icmFjZXMvbGliL3N0cmluZ2lmeS5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvaXMtbnVtYmVyL2luZGV4LmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy90by1yZWdleC1yYW5nZS9pbmRleC5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvZmlsbC1yYW5nZS9pbmRleC5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvYnJhY2VzL2xpYi9jb21waWxlLmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9icmFjZXMvbGliL2V4cGFuZC5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvYnJhY2VzL2xpYi9jb25zdGFudHMuanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2JyYWNlcy9saWIvcGFyc2UuanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2JyYWNlcy9pbmRleC5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvcGljb21hdGNoL2xpYi9jb25zdGFudHMuanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3BpY29tYXRjaC9saWIvdXRpbHMuanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3BpY29tYXRjaC9saWIvc2Nhbi5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvcGljb21hdGNoL2xpYi9wYXJzZS5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvcGljb21hdGNoL2xpYi9waWNvbWF0Y2guanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3BpY29tYXRjaC9pbmRleC5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvbWljcm9tYXRjaC9pbmRleC5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvZmFzdC1nbG9iL291dC91dGlscy9wYXR0ZXJuLmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9mYXN0LWdsb2Ivb3V0L3V0aWxzL3N0cmVhbS5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvZmFzdC1nbG9iL291dC91dGlscy9zdHJpbmcuanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Zhc3QtZ2xvYi9vdXQvdXRpbHMvaW5kZXguanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Zhc3QtZ2xvYi9vdXQvbWFuYWdlcnMvdGFza3MuanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Zhc3QtZ2xvYi9vdXQvbWFuYWdlcnMvcGF0dGVybnMuanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0Bub2RlbGliL2ZzLnN0YXQvb3V0L3Byb3ZpZGVycy9hc3luYy5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQG5vZGVsaWIvZnMuc3RhdC9vdXQvcHJvdmlkZXJzL3N5bmMuanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0Bub2RlbGliL2ZzLnN0YXQvb3V0L2FkYXB0ZXJzL2ZzLmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9Abm9kZWxpYi9mcy5zdGF0L291dC9zZXR0aW5ncy5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQG5vZGVsaWIvZnMuc3RhdC9vdXQvaW5kZXguanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3F1ZXVlLW1pY3JvdGFzay9pbmRleC5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvcnVuLXBhcmFsbGVsL2luZGV4LmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9Abm9kZWxpYi9mcy5zY2FuZGlyL291dC9jb25zdGFudHMuanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0Bub2RlbGliL2ZzLnNjYW5kaXIvb3V0L3V0aWxzL2ZzLmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9Abm9kZWxpYi9mcy5zY2FuZGlyL291dC91dGlscy9pbmRleC5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQG5vZGVsaWIvZnMuc2NhbmRpci9vdXQvcHJvdmlkZXJzL2NvbW1vbi5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQG5vZGVsaWIvZnMuc2NhbmRpci9vdXQvcHJvdmlkZXJzL2FzeW5jLmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9Abm9kZWxpYi9mcy5zY2FuZGlyL291dC9wcm92aWRlcnMvc3luYy5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQG5vZGVsaWIvZnMuc2NhbmRpci9vdXQvYWRhcHRlcnMvZnMuanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0Bub2RlbGliL2ZzLnNjYW5kaXIvb3V0L3NldHRpbmdzLmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9Abm9kZWxpYi9mcy5zY2FuZGlyL291dC9pbmRleC5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvcmV1c2lmeS9yZXVzaWZ5LmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9mYXN0cS9xdWV1ZS5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQG5vZGVsaWIvZnMud2Fsay9vdXQvcmVhZGVycy9jb21tb24uanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0Bub2RlbGliL2ZzLndhbGsvb3V0L3JlYWRlcnMvcmVhZGVyLmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9Abm9kZWxpYi9mcy53YWxrL291dC9yZWFkZXJzL2FzeW5jLmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9Abm9kZWxpYi9mcy53YWxrL291dC9wcm92aWRlcnMvYXN5bmMuanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0Bub2RlbGliL2ZzLndhbGsvb3V0L3Byb3ZpZGVycy9zdHJlYW0uanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0Bub2RlbGliL2ZzLndhbGsvb3V0L3JlYWRlcnMvc3luYy5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQG5vZGVsaWIvZnMud2Fsay9vdXQvcHJvdmlkZXJzL3N5bmMuanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0Bub2RlbGliL2ZzLndhbGsvb3V0L3NldHRpbmdzLmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9Abm9kZWxpYi9mcy53YWxrL291dC9pbmRleC5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvZmFzdC1nbG9iL291dC9yZWFkZXJzL3JlYWRlci5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvZmFzdC1nbG9iL291dC9yZWFkZXJzL3N0cmVhbS5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvZmFzdC1nbG9iL291dC9yZWFkZXJzL2FzeW5jLmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9mYXN0LWdsb2Ivb3V0L3Byb3ZpZGVycy9tYXRjaGVycy9tYXRjaGVyLmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9mYXN0LWdsb2Ivb3V0L3Byb3ZpZGVycy9tYXRjaGVycy9wYXJ0aWFsLmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9mYXN0LWdsb2Ivb3V0L3Byb3ZpZGVycy9maWx0ZXJzL2RlZXAuanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Zhc3QtZ2xvYi9vdXQvcHJvdmlkZXJzL2ZpbHRlcnMvZW50cnkuanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Zhc3QtZ2xvYi9vdXQvcHJvdmlkZXJzL2ZpbHRlcnMvZXJyb3IuanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Zhc3QtZ2xvYi9vdXQvcHJvdmlkZXJzL3RyYW5zZm9ybWVycy9lbnRyeS5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvZmFzdC1nbG9iL291dC9wcm92aWRlcnMvcHJvdmlkZXIuanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Zhc3QtZ2xvYi9vdXQvcHJvdmlkZXJzL2FzeW5jLmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9mYXN0LWdsb2Ivb3V0L3Byb3ZpZGVycy9zdHJlYW0uanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Zhc3QtZ2xvYi9vdXQvcmVhZGVycy9zeW5jLmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9mYXN0LWdsb2Ivb3V0L3Byb3ZpZGVycy9zeW5jLmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9mYXN0LWdsb2Ivb3V0L3NldHRpbmdzLmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9mYXN0LWdsb2Ivb3V0L2luZGV4LmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9wYXRoLXR5cGUvaW5kZXguanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Rpci1nbG9iL2luZGV4LmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9pZ25vcmUvaW5kZXguanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3NsYXNoL2luZGV4LmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9nbG9iYnkvZ2l0aWdub3JlLmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9nbG9iYnkvc3RyZWFtLXV0aWxzLmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9nbG9iYnkvaW5kZXguanMiLCAiLi4vLi4vc3JjL2dlbmVyYXRvcnMvaW5kZXgudHMiLCAiLi4vLi4vc3JjL2dlbmVyYXRvcnMvZ2VuZXJhdGUtb3BlbmFwaS9pbmRleC50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvY2hhbGsvc291cmNlL2luZGV4LmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9jaGFsay9zb3VyY2UvdmVuZG9yL2Fuc2ktc3R5bGVzL2luZGV4LmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9jaGFsay9zb3VyY2UvdmVuZG9yL3N1cHBvcnRzLWNvbG9yL2luZGV4LmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9jaGFsay9zb3VyY2UvdXRpbGl0aWVzLmpzIiwgIi4uLy4uL3NyYy9nZW5lcmF0b3JzL2xpYi9wYXJzZS1yb3V0ZXMtaW4tcGFja2FnZS50cyIsICIuLi8uLi9zcmMvZ2VuZXJhdG9ycy9saWIvZGVmYXVsdC1tYXAtZmlsZS1wYXRoLXRvLWh0dHAtcm91dGUudHMiLCAiLi4vLi4vc3JjL2dlbmVyYXRvcnMvZ2VuZXJhdGUtb3BlbmFwaS9lbWJlZC1zY2hlbWEtcmVmZXJlbmNlcy50cyIsICIuLi8uLi9zcmMvZ2VuZXJhdG9ycy9nZW5lcmF0ZS1vcGVuYXBpL2Zlcm4tc2RrLXV0aWxzLnRzIiwgIi4uLy4uL3NyYy9nZW5lcmF0b3JzL2dlbmVyYXRlLXJvdXRlLXR5cGVzL2luZGV4LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvLyBTaGltIGdsb2JhbHMgaW4gY2pzIGJ1bmRsZVxuLy8gVGhlcmUncyBhIHdlaXJkIGJ1ZyB0aGF0IGVzYnVpbGQgd2lsbCBhbHdheXMgaW5qZWN0IGltcG9ydE1ldGFVcmxcbi8vIGlmIHdlIGV4cG9ydCBpdCBhcyBgY29uc3QgaW1wb3J0TWV0YVVybCA9IC4uLiBfX2ZpbGVuYW1lIC4uLmBcbi8vIEJ1dCB1c2luZyBhIGZ1bmN0aW9uIHdpbGwgbm90IGNhdXNlIHRoaXMgaXNzdWVcblxuY29uc3QgZ2V0SW1wb3J0TWV0YVVybCA9ICgpID0+XG4gIHR5cGVvZiBkb2N1bWVudCA9PT0gJ3VuZGVmaW5lZCdcbiAgICA/IG5ldyBVUkwoJ2ZpbGU6JyArIF9fZmlsZW5hbWUpLmhyZWZcbiAgICA6IChkb2N1bWVudC5jdXJyZW50U2NyaXB0ICYmIGRvY3VtZW50LmN1cnJlbnRTY3JpcHQuc3JjKSB8fFxuICAgICAgbmV3IFVSTCgnbWFpbi5qcycsIGRvY3VtZW50LmJhc2VVUkkpLmhyZWZcblxuZXhwb3J0IGNvbnN0IGltcG9ydE1ldGFVcmwgPSAvKiBAX19QVVJFX18gKi8gZ2V0SW1wb3J0TWV0YVVybCgpXG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9ICguLi5hcmd1bWVudHNfKSA9PiB7XG5cdHJldHVybiBbLi4ubmV3IFNldChbXS5jb25jYXQoLi4uYXJndW1lbnRzXykpXTtcbn07XG4iLCAiJ3VzZSBzdHJpY3QnXG4vKlxuICogbWVyZ2UyXG4gKiBodHRwczovL2dpdGh1Yi5jb20vdGVhbWJpdGlvbi9tZXJnZTJcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAyMCBUZWFtYml0aW9uXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG4gKi9cbmNvbnN0IFN0cmVhbSA9IHJlcXVpcmUoJ3N0cmVhbScpXG5jb25zdCBQYXNzVGhyb3VnaCA9IFN0cmVhbS5QYXNzVGhyb3VnaFxuY29uc3Qgc2xpY2UgPSBBcnJheS5wcm90b3R5cGUuc2xpY2VcblxubW9kdWxlLmV4cG9ydHMgPSBtZXJnZTJcblxuZnVuY3Rpb24gbWVyZ2UyICgpIHtcbiAgY29uc3Qgc3RyZWFtc1F1ZXVlID0gW11cbiAgY29uc3QgYXJncyA9IHNsaWNlLmNhbGwoYXJndW1lbnRzKVxuICBsZXQgbWVyZ2luZyA9IGZhbHNlXG4gIGxldCBvcHRpb25zID0gYXJnc1thcmdzLmxlbmd0aCAtIDFdXG5cbiAgaWYgKG9wdGlvbnMgJiYgIUFycmF5LmlzQXJyYXkob3B0aW9ucykgJiYgb3B0aW9ucy5waXBlID09IG51bGwpIHtcbiAgICBhcmdzLnBvcCgpXG4gIH0gZWxzZSB7XG4gICAgb3B0aW9ucyA9IHt9XG4gIH1cblxuICBjb25zdCBkb0VuZCA9IG9wdGlvbnMuZW5kICE9PSBmYWxzZVxuICBjb25zdCBkb1BpcGVFcnJvciA9IG9wdGlvbnMucGlwZUVycm9yID09PSB0cnVlXG4gIGlmIChvcHRpb25zLm9iamVjdE1vZGUgPT0gbnVsbCkge1xuICAgIG9wdGlvbnMub2JqZWN0TW9kZSA9IHRydWVcbiAgfVxuICBpZiAob3B0aW9ucy5oaWdoV2F0ZXJNYXJrID09IG51bGwpIHtcbiAgICBvcHRpb25zLmhpZ2hXYXRlck1hcmsgPSA2NCAqIDEwMjRcbiAgfVxuICBjb25zdCBtZXJnZWRTdHJlYW0gPSBQYXNzVGhyb3VnaChvcHRpb25zKVxuXG4gIGZ1bmN0aW9uIGFkZFN0cmVhbSAoKSB7XG4gICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgc3RyZWFtc1F1ZXVlLnB1c2gocGF1c2VTdHJlYW1zKGFyZ3VtZW50c1tpXSwgb3B0aW9ucykpXG4gICAgfVxuICAgIG1lcmdlU3RyZWFtKClcbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgZnVuY3Rpb24gbWVyZ2VTdHJlYW0gKCkge1xuICAgIGlmIChtZXJnaW5nKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgbWVyZ2luZyA9IHRydWVcblxuICAgIGxldCBzdHJlYW1zID0gc3RyZWFtc1F1ZXVlLnNoaWZ0KClcbiAgICBpZiAoIXN0cmVhbXMpIHtcbiAgICAgIHByb2Nlc3MubmV4dFRpY2soZW5kU3RyZWFtKVxuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGlmICghQXJyYXkuaXNBcnJheShzdHJlYW1zKSkge1xuICAgICAgc3RyZWFtcyA9IFtzdHJlYW1zXVxuICAgIH1cblxuICAgIGxldCBwaXBlc0NvdW50ID0gc3RyZWFtcy5sZW5ndGggKyAxXG5cbiAgICBmdW5jdGlvbiBuZXh0ICgpIHtcbiAgICAgIGlmICgtLXBpcGVzQ291bnQgPiAwKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgbWVyZ2luZyA9IGZhbHNlXG4gICAgICBtZXJnZVN0cmVhbSgpXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcGlwZSAoc3RyZWFtKSB7XG4gICAgICBmdW5jdGlvbiBvbmVuZCAoKSB7XG4gICAgICAgIHN0cmVhbS5yZW1vdmVMaXN0ZW5lcignbWVyZ2UyVW5waXBlRW5kJywgb25lbmQpXG4gICAgICAgIHN0cmVhbS5yZW1vdmVMaXN0ZW5lcignZW5kJywgb25lbmQpXG4gICAgICAgIGlmIChkb1BpcGVFcnJvcikge1xuICAgICAgICAgIHN0cmVhbS5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCBvbmVycm9yKVxuICAgICAgICB9XG4gICAgICAgIG5leHQoKVxuICAgICAgfVxuICAgICAgZnVuY3Rpb24gb25lcnJvciAoZXJyKSB7XG4gICAgICAgIG1lcmdlZFN0cmVhbS5lbWl0KCdlcnJvcicsIGVycilcbiAgICAgIH1cbiAgICAgIC8vIHNraXAgZW5kZWQgc3RyZWFtXG4gICAgICBpZiAoc3RyZWFtLl9yZWFkYWJsZVN0YXRlLmVuZEVtaXR0ZWQpIHtcbiAgICAgICAgcmV0dXJuIG5leHQoKVxuICAgICAgfVxuXG4gICAgICBzdHJlYW0ub24oJ21lcmdlMlVucGlwZUVuZCcsIG9uZW5kKVxuICAgICAgc3RyZWFtLm9uKCdlbmQnLCBvbmVuZClcblxuICAgICAgaWYgKGRvUGlwZUVycm9yKSB7XG4gICAgICAgIHN0cmVhbS5vbignZXJyb3InLCBvbmVycm9yKVxuICAgICAgfVxuXG4gICAgICBzdHJlYW0ucGlwZShtZXJnZWRTdHJlYW0sIHsgZW5kOiBmYWxzZSB9KVxuICAgICAgLy8gY29tcGF0aWJsZSBmb3Igb2xkIHN0cmVhbVxuICAgICAgc3RyZWFtLnJlc3VtZSgpXG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdHJlYW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBwaXBlKHN0cmVhbXNbaV0pXG4gICAgfVxuXG4gICAgbmV4dCgpXG4gIH1cblxuICBmdW5jdGlvbiBlbmRTdHJlYW0gKCkge1xuICAgIG1lcmdpbmcgPSBmYWxzZVxuICAgIC8vIGVtaXQgJ3F1ZXVlRHJhaW4nIHdoZW4gYWxsIHN0cmVhbXMgbWVyZ2VkLlxuICAgIG1lcmdlZFN0cmVhbS5lbWl0KCdxdWV1ZURyYWluJylcbiAgICBpZiAoZG9FbmQpIHtcbiAgICAgIG1lcmdlZFN0cmVhbS5lbmQoKVxuICAgIH1cbiAgfVxuXG4gIG1lcmdlZFN0cmVhbS5zZXRNYXhMaXN0ZW5lcnMoMClcbiAgbWVyZ2VkU3RyZWFtLmFkZCA9IGFkZFN0cmVhbVxuICBtZXJnZWRTdHJlYW0ub24oJ3VucGlwZScsIGZ1bmN0aW9uIChzdHJlYW0pIHtcbiAgICBzdHJlYW0uZW1pdCgnbWVyZ2UyVW5waXBlRW5kJylcbiAgfSlcblxuICBpZiAoYXJncy5sZW5ndGgpIHtcbiAgICBhZGRTdHJlYW0uYXBwbHkobnVsbCwgYXJncylcbiAgfVxuICByZXR1cm4gbWVyZ2VkU3RyZWFtXG59XG5cbi8vIGNoZWNrIGFuZCBwYXVzZSBzdHJlYW1zIGZvciBwaXBlLlxuZnVuY3Rpb24gcGF1c2VTdHJlYW1zIChzdHJlYW1zLCBvcHRpb25zKSB7XG4gIGlmICghQXJyYXkuaXNBcnJheShzdHJlYW1zKSkge1xuICAgIC8vIEJhY2t3YXJkcy1jb21wYXQgd2l0aCBvbGQtc3R5bGUgc3RyZWFtc1xuICAgIGlmICghc3RyZWFtcy5fcmVhZGFibGVTdGF0ZSAmJiBzdHJlYW1zLnBpcGUpIHtcbiAgICAgIHN0cmVhbXMgPSBzdHJlYW1zLnBpcGUoUGFzc1Rocm91Z2gob3B0aW9ucykpXG4gICAgfVxuICAgIGlmICghc3RyZWFtcy5fcmVhZGFibGVTdGF0ZSB8fCAhc3RyZWFtcy5wYXVzZSB8fCAhc3RyZWFtcy5waXBlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ09ubHkgcmVhZGFibGUgc3RyZWFtIGNhbiBiZSBtZXJnZWQuJylcbiAgICB9XG4gICAgc3RyZWFtcy5wYXVzZSgpXG4gIH0gZWxzZSB7XG4gICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHN0cmVhbXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIHN0cmVhbXNbaV0gPSBwYXVzZVN0cmVhbXMoc3RyZWFtc1tpXSwgb3B0aW9ucylcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHN0cmVhbXNcbn1cbiIsICJcInVzZSBzdHJpY3RcIjtcclxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xyXG5leHBvcnRzLnNwbGl0V2hlbiA9IGV4cG9ydHMuZmxhdHRlbiA9IHZvaWQgMDtcclxuZnVuY3Rpb24gZmxhdHRlbihpdGVtcykge1xyXG4gICAgcmV0dXJuIGl0ZW1zLnJlZHVjZSgoY29sbGVjdGlvbiwgaXRlbSkgPT4gW10uY29uY2F0KGNvbGxlY3Rpb24sIGl0ZW0pLCBbXSk7XHJcbn1cclxuZXhwb3J0cy5mbGF0dGVuID0gZmxhdHRlbjtcclxuZnVuY3Rpb24gc3BsaXRXaGVuKGl0ZW1zLCBwcmVkaWNhdGUpIHtcclxuICAgIGNvbnN0IHJlc3VsdCA9IFtbXV07XHJcbiAgICBsZXQgZ3JvdXBJbmRleCA9IDA7XHJcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHtcclxuICAgICAgICBpZiAocHJlZGljYXRlKGl0ZW0pKSB7XHJcbiAgICAgICAgICAgIGdyb3VwSW5kZXgrKztcclxuICAgICAgICAgICAgcmVzdWx0W2dyb3VwSW5kZXhdID0gW107XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICByZXN1bHRbZ3JvdXBJbmRleF0ucHVzaChpdGVtKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG59XHJcbmV4cG9ydHMuc3BsaXRXaGVuID0gc3BsaXRXaGVuO1xyXG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XHJcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcclxuZXhwb3J0cy5pc0Vub2VudENvZGVFcnJvciA9IHZvaWQgMDtcclxuZnVuY3Rpb24gaXNFbm9lbnRDb2RlRXJyb3IoZXJyb3IpIHtcclxuICAgIHJldHVybiBlcnJvci5jb2RlID09PSAnRU5PRU5UJztcclxufVxyXG5leHBvcnRzLmlzRW5vZW50Q29kZUVycm9yID0gaXNFbm9lbnRDb2RlRXJyb3I7XHJcbiIsICJcInVzZSBzdHJpY3RcIjtcclxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xyXG5leHBvcnRzLmNyZWF0ZURpcmVudEZyb21TdGF0cyA9IHZvaWQgMDtcclxuY2xhc3MgRGlyZW50RnJvbVN0YXRzIHtcclxuICAgIGNvbnN0cnVjdG9yKG5hbWUsIHN0YXRzKSB7XHJcbiAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcclxuICAgICAgICB0aGlzLmlzQmxvY2tEZXZpY2UgPSBzdGF0cy5pc0Jsb2NrRGV2aWNlLmJpbmQoc3RhdHMpO1xyXG4gICAgICAgIHRoaXMuaXNDaGFyYWN0ZXJEZXZpY2UgPSBzdGF0cy5pc0NoYXJhY3RlckRldmljZS5iaW5kKHN0YXRzKTtcclxuICAgICAgICB0aGlzLmlzRGlyZWN0b3J5ID0gc3RhdHMuaXNEaXJlY3RvcnkuYmluZChzdGF0cyk7XHJcbiAgICAgICAgdGhpcy5pc0ZJRk8gPSBzdGF0cy5pc0ZJRk8uYmluZChzdGF0cyk7XHJcbiAgICAgICAgdGhpcy5pc0ZpbGUgPSBzdGF0cy5pc0ZpbGUuYmluZChzdGF0cyk7XHJcbiAgICAgICAgdGhpcy5pc1NvY2tldCA9IHN0YXRzLmlzU29ja2V0LmJpbmQoc3RhdHMpO1xyXG4gICAgICAgIHRoaXMuaXNTeW1ib2xpY0xpbmsgPSBzdGF0cy5pc1N5bWJvbGljTGluay5iaW5kKHN0YXRzKTtcclxuICAgIH1cclxufVxyXG5mdW5jdGlvbiBjcmVhdGVEaXJlbnRGcm9tU3RhdHMobmFtZSwgc3RhdHMpIHtcclxuICAgIHJldHVybiBuZXcgRGlyZW50RnJvbVN0YXRzKG5hbWUsIHN0YXRzKTtcclxufVxyXG5leHBvcnRzLmNyZWF0ZURpcmVudEZyb21TdGF0cyA9IGNyZWF0ZURpcmVudEZyb21TdGF0cztcclxuIiwgIlwidXNlIHN0cmljdFwiO1xyXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XHJcbmV4cG9ydHMucmVtb3ZlTGVhZGluZ0RvdFNlZ21lbnQgPSBleHBvcnRzLmVzY2FwZSA9IGV4cG9ydHMubWFrZUFic29sdXRlID0gZXhwb3J0cy51bml4aWZ5ID0gdm9pZCAwO1xyXG5jb25zdCBwYXRoID0gcmVxdWlyZShcInBhdGhcIik7XHJcbmNvbnN0IExFQURJTkdfRE9UX1NFR01FTlRfQ0hBUkFDVEVSU19DT1VOVCA9IDI7IC8vIC4vIG9yIC5cXFxcXHJcbmNvbnN0IFVORVNDQVBFRF9HTE9CX1NZTUJPTFNfUkUgPSAvKFxcXFw/KShbKCkqP1tcXF17fH1dfF4hfFshK0BdKD89XFwoKSkvZztcclxuLyoqXHJcbiAqIERlc2lnbmVkIHRvIHdvcmsgb25seSB3aXRoIHNpbXBsZSBwYXRoczogYGRpclxcXFxmaWxlYC5cclxuICovXHJcbmZ1bmN0aW9uIHVuaXhpZnkoZmlsZXBhdGgpIHtcclxuICAgIHJldHVybiBmaWxlcGF0aC5yZXBsYWNlKC9cXFxcL2csICcvJyk7XHJcbn1cclxuZXhwb3J0cy51bml4aWZ5ID0gdW5peGlmeTtcclxuZnVuY3Rpb24gbWFrZUFic29sdXRlKGN3ZCwgZmlsZXBhdGgpIHtcclxuICAgIHJldHVybiBwYXRoLnJlc29sdmUoY3dkLCBmaWxlcGF0aCk7XHJcbn1cclxuZXhwb3J0cy5tYWtlQWJzb2x1dGUgPSBtYWtlQWJzb2x1dGU7XHJcbmZ1bmN0aW9uIGVzY2FwZShwYXR0ZXJuKSB7XHJcbiAgICByZXR1cm4gcGF0dGVybi5yZXBsYWNlKFVORVNDQVBFRF9HTE9CX1NZTUJPTFNfUkUsICdcXFxcJDInKTtcclxufVxyXG5leHBvcnRzLmVzY2FwZSA9IGVzY2FwZTtcclxuZnVuY3Rpb24gcmVtb3ZlTGVhZGluZ0RvdFNlZ21lbnQoZW50cnkpIHtcclxuICAgIC8vIFdlIGRvIG5vdCB1c2UgYHN0YXJ0c1dpdGhgIGJlY2F1c2UgdGhpcyBpcyAxMHggc2xvd2VyIHRoYW4gY3VycmVudCBpbXBsZW1lbnRhdGlvbiBmb3Igc29tZSBjYXNlcy5cclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvcHJlZmVyLXN0cmluZy1zdGFydHMtZW5kcy13aXRoXHJcbiAgICBpZiAoZW50cnkuY2hhckF0KDApID09PSAnLicpIHtcclxuICAgICAgICBjb25zdCBzZWNvbmRDaGFyYWN0ZXJ5ID0gZW50cnkuY2hhckF0KDEpO1xyXG4gICAgICAgIGlmIChzZWNvbmRDaGFyYWN0ZXJ5ID09PSAnLycgfHwgc2Vjb25kQ2hhcmFjdGVyeSA9PT0gJ1xcXFwnKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBlbnRyeS5zbGljZShMRUFESU5HX0RPVF9TRUdNRU5UX0NIQVJBQ1RFUlNfQ09VTlQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBlbnRyeTtcclxufVxyXG5leHBvcnRzLnJlbW92ZUxlYWRpbmdEb3RTZWdtZW50ID0gcmVtb3ZlTGVhZGluZ0RvdFNlZ21lbnQ7XHJcbiIsICIvKiFcbiAqIGlzLWV4dGdsb2IgPGh0dHBzOi8vZ2l0aHViLmNvbS9qb25zY2hsaW5rZXJ0L2lzLWV4dGdsb2I+XG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTYsIEpvbiBTY2hsaW5rZXJ0LlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaXNFeHRnbG9iKHN0cikge1xuICBpZiAodHlwZW9mIHN0ciAhPT0gJ3N0cmluZycgfHwgc3RyID09PSAnJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciBtYXRjaDtcbiAgd2hpbGUgKChtYXRjaCA9IC8oXFxcXCkufChbQD8hKypdXFwoLipcXCkpL2cuZXhlYyhzdHIpKSkge1xuICAgIGlmIChtYXRjaFsyXSkgcmV0dXJuIHRydWU7XG4gICAgc3RyID0gc3RyLnNsaWNlKG1hdGNoLmluZGV4ICsgbWF0Y2hbMF0ubGVuZ3RoKTtcbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn07XG4iLCAiLyohXG4gKiBpcy1nbG9iIDxodHRwczovL2dpdGh1Yi5jb20vam9uc2NobGlua2VydC9pcy1nbG9iPlxuICpcbiAqIENvcHlyaWdodCAoYykgMjAxNC0yMDE3LCBKb24gU2NobGlua2VydC5cbiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cbiAqL1xuXG52YXIgaXNFeHRnbG9iID0gcmVxdWlyZSgnaXMtZXh0Z2xvYicpO1xudmFyIGNoYXJzID0geyAneyc6ICd9JywgJygnOiAnKScsICdbJzogJ10nfTtcbnZhciBzdHJpY3RDaGVjayA9IGZ1bmN0aW9uKHN0cikge1xuICBpZiAoc3RyWzBdID09PSAnIScpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICB2YXIgaW5kZXggPSAwO1xuICB2YXIgcGlwZUluZGV4ID0gLTI7XG4gIHZhciBjbG9zZVNxdWFyZUluZGV4ID0gLTI7XG4gIHZhciBjbG9zZUN1cmx5SW5kZXggPSAtMjtcbiAgdmFyIGNsb3NlUGFyZW5JbmRleCA9IC0yO1xuICB2YXIgYmFja1NsYXNoSW5kZXggPSAtMjtcbiAgd2hpbGUgKGluZGV4IDwgc3RyLmxlbmd0aCkge1xuICAgIGlmIChzdHJbaW5kZXhdID09PSAnKicpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmIChzdHJbaW5kZXggKyAxXSA9PT0gJz8nICYmIC9bXFxdLispXS8udGVzdChzdHJbaW5kZXhdKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKGNsb3NlU3F1YXJlSW5kZXggIT09IC0xICYmIHN0cltpbmRleF0gPT09ICdbJyAmJiBzdHJbaW5kZXggKyAxXSAhPT0gJ10nKSB7XG4gICAgICBpZiAoY2xvc2VTcXVhcmVJbmRleCA8IGluZGV4KSB7XG4gICAgICAgIGNsb3NlU3F1YXJlSW5kZXggPSBzdHIuaW5kZXhPZignXScsIGluZGV4KTtcbiAgICAgIH1cbiAgICAgIGlmIChjbG9zZVNxdWFyZUluZGV4ID4gaW5kZXgpIHtcbiAgICAgICAgaWYgKGJhY2tTbGFzaEluZGV4ID09PSAtMSB8fCBiYWNrU2xhc2hJbmRleCA+IGNsb3NlU3F1YXJlSW5kZXgpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBiYWNrU2xhc2hJbmRleCA9IHN0ci5pbmRleE9mKCdcXFxcJywgaW5kZXgpO1xuICAgICAgICBpZiAoYmFja1NsYXNoSW5kZXggPT09IC0xIHx8IGJhY2tTbGFzaEluZGV4ID4gY2xvc2VTcXVhcmVJbmRleCkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNsb3NlQ3VybHlJbmRleCAhPT0gLTEgJiYgc3RyW2luZGV4XSA9PT0gJ3snICYmIHN0cltpbmRleCArIDFdICE9PSAnfScpIHtcbiAgICAgIGNsb3NlQ3VybHlJbmRleCA9IHN0ci5pbmRleE9mKCd9JywgaW5kZXgpO1xuICAgICAgaWYgKGNsb3NlQ3VybHlJbmRleCA+IGluZGV4KSB7XG4gICAgICAgIGJhY2tTbGFzaEluZGV4ID0gc3RyLmluZGV4T2YoJ1xcXFwnLCBpbmRleCk7XG4gICAgICAgIGlmIChiYWNrU2xhc2hJbmRleCA9PT0gLTEgfHwgYmFja1NsYXNoSW5kZXggPiBjbG9zZUN1cmx5SW5kZXgpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjbG9zZVBhcmVuSW5kZXggIT09IC0xICYmIHN0cltpbmRleF0gPT09ICcoJyAmJiBzdHJbaW5kZXggKyAxXSA9PT0gJz8nICYmIC9bOiE9XS8udGVzdChzdHJbaW5kZXggKyAyXSkgJiYgc3RyW2luZGV4ICsgM10gIT09ICcpJykge1xuICAgICAgY2xvc2VQYXJlbkluZGV4ID0gc3RyLmluZGV4T2YoJyknLCBpbmRleCk7XG4gICAgICBpZiAoY2xvc2VQYXJlbkluZGV4ID4gaW5kZXgpIHtcbiAgICAgICAgYmFja1NsYXNoSW5kZXggPSBzdHIuaW5kZXhPZignXFxcXCcsIGluZGV4KTtcbiAgICAgICAgaWYgKGJhY2tTbGFzaEluZGV4ID09PSAtMSB8fCBiYWNrU2xhc2hJbmRleCA+IGNsb3NlUGFyZW5JbmRleCkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHBpcGVJbmRleCAhPT0gLTEgJiYgc3RyW2luZGV4XSA9PT0gJygnICYmIHN0cltpbmRleCArIDFdICE9PSAnfCcpIHtcbiAgICAgIGlmIChwaXBlSW5kZXggPCBpbmRleCkge1xuICAgICAgICBwaXBlSW5kZXggPSBzdHIuaW5kZXhPZignfCcsIGluZGV4KTtcbiAgICAgIH1cbiAgICAgIGlmIChwaXBlSW5kZXggIT09IC0xICYmIHN0cltwaXBlSW5kZXggKyAxXSAhPT0gJyknKSB7XG4gICAgICAgIGNsb3NlUGFyZW5JbmRleCA9IHN0ci5pbmRleE9mKCcpJywgcGlwZUluZGV4KTtcbiAgICAgICAgaWYgKGNsb3NlUGFyZW5JbmRleCA+IHBpcGVJbmRleCkge1xuICAgICAgICAgIGJhY2tTbGFzaEluZGV4ID0gc3RyLmluZGV4T2YoJ1xcXFwnLCBwaXBlSW5kZXgpO1xuICAgICAgICAgIGlmIChiYWNrU2xhc2hJbmRleCA9PT0gLTEgfHwgYmFja1NsYXNoSW5kZXggPiBjbG9zZVBhcmVuSW5kZXgpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzdHJbaW5kZXhdID09PSAnXFxcXCcpIHtcbiAgICAgIHZhciBvcGVuID0gc3RyW2luZGV4ICsgMV07XG4gICAgICBpbmRleCArPSAyO1xuICAgICAgdmFyIGNsb3NlID0gY2hhcnNbb3Blbl07XG5cbiAgICAgIGlmIChjbG9zZSkge1xuICAgICAgICB2YXIgbiA9IHN0ci5pbmRleE9mKGNsb3NlLCBpbmRleCk7XG4gICAgICAgIGlmIChuICE9PSAtMSkge1xuICAgICAgICAgIGluZGV4ID0gbiArIDE7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHN0cltpbmRleF0gPT09ICchJykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaW5kZXgrKztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufTtcblxudmFyIHJlbGF4ZWRDaGVjayA9IGZ1bmN0aW9uKHN0cikge1xuICBpZiAoc3RyWzBdID09PSAnIScpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICB2YXIgaW5kZXggPSAwO1xuICB3aGlsZSAoaW5kZXggPCBzdHIubGVuZ3RoKSB7XG4gICAgaWYgKC9bKj97fSgpW1xcXV0vLnRlc3Qoc3RyW2luZGV4XSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmIChzdHJbaW5kZXhdID09PSAnXFxcXCcpIHtcbiAgICAgIHZhciBvcGVuID0gc3RyW2luZGV4ICsgMV07XG4gICAgICBpbmRleCArPSAyO1xuICAgICAgdmFyIGNsb3NlID0gY2hhcnNbb3Blbl07XG5cbiAgICAgIGlmIChjbG9zZSkge1xuICAgICAgICB2YXIgbiA9IHN0ci5pbmRleE9mKGNsb3NlLCBpbmRleCk7XG4gICAgICAgIGlmIChuICE9PSAtMSkge1xuICAgICAgICAgIGluZGV4ID0gbiArIDE7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHN0cltpbmRleF0gPT09ICchJykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaW5kZXgrKztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpc0dsb2Ioc3RyLCBvcHRpb25zKSB7XG4gIGlmICh0eXBlb2Ygc3RyICE9PSAnc3RyaW5nJyB8fCBzdHIgPT09ICcnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKGlzRXh0Z2xvYihzdHIpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICB2YXIgY2hlY2sgPSBzdHJpY3RDaGVjaztcblxuICAvLyBvcHRpb25hbGx5IHJlbGF4IGNoZWNrXG4gIGlmIChvcHRpb25zICYmIG9wdGlvbnMuc3RyaWN0ID09PSBmYWxzZSkge1xuICAgIGNoZWNrID0gcmVsYXhlZENoZWNrO1xuICB9XG5cbiAgcmV0dXJuIGNoZWNrKHN0cik7XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcblxudmFyIGlzR2xvYiA9IHJlcXVpcmUoJ2lzLWdsb2InKTtcbnZhciBwYXRoUG9zaXhEaXJuYW1lID0gcmVxdWlyZSgncGF0aCcpLnBvc2l4LmRpcm5hbWU7XG52YXIgaXNXaW4zMiA9IHJlcXVpcmUoJ29zJykucGxhdGZvcm0oKSA9PT0gJ3dpbjMyJztcblxudmFyIHNsYXNoID0gJy8nO1xudmFyIGJhY2tzbGFzaCA9IC9cXFxcL2c7XG52YXIgZW5jbG9zdXJlID0gL1tcXHtcXFtdLipbXFx9XFxdXSQvO1xudmFyIGdsb2JieSA9IC8oXnxbXlxcXFxdKShbXFx7XFxbXXxcXChbXlxcKV0rJCkvO1xudmFyIGVzY2FwZWQgPSAvXFxcXChbXFwhXFwqXFw/XFx8XFxbXFxdXFwoXFwpXFx7XFx9XSkvZztcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0c1xuICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5mbGlwQmFja3NsYXNoZXM9dHJ1ZV1cbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZ2xvYlBhcmVudChzdHIsIG9wdHMpIHtcbiAgdmFyIG9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHsgZmxpcEJhY2tzbGFzaGVzOiB0cnVlIH0sIG9wdHMpO1xuXG4gIC8vIGZsaXAgd2luZG93cyBwYXRoIHNlcGFyYXRvcnNcbiAgaWYgKG9wdGlvbnMuZmxpcEJhY2tzbGFzaGVzICYmIGlzV2luMzIgJiYgc3RyLmluZGV4T2Yoc2xhc2gpIDwgMCkge1xuICAgIHN0ciA9IHN0ci5yZXBsYWNlKGJhY2tzbGFzaCwgc2xhc2gpO1xuICB9XG5cbiAgLy8gc3BlY2lhbCBjYXNlIGZvciBzdHJpbmdzIGVuZGluZyBpbiBlbmNsb3N1cmUgY29udGFpbmluZyBwYXRoIHNlcGFyYXRvclxuICBpZiAoZW5jbG9zdXJlLnRlc3Qoc3RyKSkge1xuICAgIHN0ciArPSBzbGFzaDtcbiAgfVxuXG4gIC8vIHByZXNlcnZlcyBmdWxsIHBhdGggaW4gY2FzZSBvZiB0cmFpbGluZyBwYXRoIHNlcGFyYXRvclxuICBzdHIgKz0gJ2EnO1xuXG4gIC8vIHJlbW92ZSBwYXRoIHBhcnRzIHRoYXQgYXJlIGdsb2JieVxuICBkbyB7XG4gICAgc3RyID0gcGF0aFBvc2l4RGlybmFtZShzdHIpO1xuICB9IHdoaWxlIChpc0dsb2Ioc3RyKSB8fCBnbG9iYnkudGVzdChzdHIpKTtcblxuICAvLyByZW1vdmUgZXNjYXBlIGNoYXJzIGFuZCByZXR1cm4gcmVzdWx0XG4gIHJldHVybiBzdHIucmVwbGFjZShlc2NhcGVkLCAnJDEnKTtcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLmlzSW50ZWdlciA9IG51bSA9PiB7XG4gIGlmICh0eXBlb2YgbnVtID09PSAnbnVtYmVyJykge1xuICAgIHJldHVybiBOdW1iZXIuaXNJbnRlZ2VyKG51bSk7XG4gIH1cbiAgaWYgKHR5cGVvZiBudW0gPT09ICdzdHJpbmcnICYmIG51bS50cmltKCkgIT09ICcnKSB7XG4gICAgcmV0dXJuIE51bWJlci5pc0ludGVnZXIoTnVtYmVyKG51bSkpO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn07XG5cbi8qKlxuICogRmluZCBhIG5vZGUgb2YgdGhlIGdpdmVuIHR5cGVcbiAqL1xuXG5leHBvcnRzLmZpbmQgPSAobm9kZSwgdHlwZSkgPT4gbm9kZS5ub2Rlcy5maW5kKG5vZGUgPT4gbm9kZS50eXBlID09PSB0eXBlKTtcblxuLyoqXG4gKiBGaW5kIGEgbm9kZSBvZiB0aGUgZ2l2ZW4gdHlwZVxuICovXG5cbmV4cG9ydHMuZXhjZWVkc0xpbWl0ID0gKG1pbiwgbWF4LCBzdGVwID0gMSwgbGltaXQpID0+IHtcbiAgaWYgKGxpbWl0ID09PSBmYWxzZSkgcmV0dXJuIGZhbHNlO1xuICBpZiAoIWV4cG9ydHMuaXNJbnRlZ2VyKG1pbikgfHwgIWV4cG9ydHMuaXNJbnRlZ2VyKG1heCkpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuICgoTnVtYmVyKG1heCkgLSBOdW1iZXIobWluKSkgLyBOdW1iZXIoc3RlcCkpID49IGxpbWl0O1xufTtcblxuLyoqXG4gKiBFc2NhcGUgdGhlIGdpdmVuIG5vZGUgd2l0aCAnXFxcXCcgYmVmb3JlIG5vZGUudmFsdWVcbiAqL1xuXG5leHBvcnRzLmVzY2FwZU5vZGUgPSAoYmxvY2ssIG4gPSAwLCB0eXBlKSA9PiB7XG4gIGxldCBub2RlID0gYmxvY2subm9kZXNbbl07XG4gIGlmICghbm9kZSkgcmV0dXJuO1xuXG4gIGlmICgodHlwZSAmJiBub2RlLnR5cGUgPT09IHR5cGUpIHx8IG5vZGUudHlwZSA9PT0gJ29wZW4nIHx8IG5vZGUudHlwZSA9PT0gJ2Nsb3NlJykge1xuICAgIGlmIChub2RlLmVzY2FwZWQgIT09IHRydWUpIHtcbiAgICAgIG5vZGUudmFsdWUgPSAnXFxcXCcgKyBub2RlLnZhbHVlO1xuICAgICAgbm9kZS5lc2NhcGVkID0gdHJ1ZTtcbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBicmFjZSBub2RlIHNob3VsZCBiZSBlbmNsb3NlZCBpbiBsaXRlcmFsIGJyYWNlc1xuICovXG5cbmV4cG9ydHMuZW5jbG9zZUJyYWNlID0gbm9kZSA9PiB7XG4gIGlmIChub2RlLnR5cGUgIT09ICdicmFjZScpIHJldHVybiBmYWxzZTtcbiAgaWYgKChub2RlLmNvbW1hcyA+PiAwICsgbm9kZS5yYW5nZXMgPj4gMCkgPT09IDApIHtcbiAgICBub2RlLmludmFsaWQgPSB0cnVlO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn07XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIGEgYnJhY2Ugbm9kZSBpcyBpbnZhbGlkLlxuICovXG5cbmV4cG9ydHMuaXNJbnZhbGlkQnJhY2UgPSBibG9jayA9PiB7XG4gIGlmIChibG9jay50eXBlICE9PSAnYnJhY2UnKSByZXR1cm4gZmFsc2U7XG4gIGlmIChibG9jay5pbnZhbGlkID09PSB0cnVlIHx8IGJsb2NrLmRvbGxhcikgcmV0dXJuIHRydWU7XG4gIGlmICgoYmxvY2suY29tbWFzID4+IDAgKyBibG9jay5yYW5nZXMgPj4gMCkgPT09IDApIHtcbiAgICBibG9jay5pbnZhbGlkID0gdHJ1ZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAoYmxvY2sub3BlbiAhPT0gdHJ1ZSB8fCBibG9jay5jbG9zZSAhPT0gdHJ1ZSkge1xuICAgIGJsb2NrLmludmFsaWQgPSB0cnVlO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn07XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIGEgbm9kZSBpcyBhbiBvcGVuIG9yIGNsb3NlIG5vZGVcbiAqL1xuXG5leHBvcnRzLmlzT3Blbk9yQ2xvc2UgPSBub2RlID0+IHtcbiAgaWYgKG5vZGUudHlwZSA9PT0gJ29wZW4nIHx8IG5vZGUudHlwZSA9PT0gJ2Nsb3NlJykge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBub2RlLm9wZW4gPT09IHRydWUgfHwgbm9kZS5jbG9zZSA9PT0gdHJ1ZTtcbn07XG5cbi8qKlxuICogUmVkdWNlIGFuIGFycmF5IG9mIHRleHQgbm9kZXMuXG4gKi9cblxuZXhwb3J0cy5yZWR1Y2UgPSBub2RlcyA9PiBub2Rlcy5yZWR1Y2UoKGFjYywgbm9kZSkgPT4ge1xuICBpZiAobm9kZS50eXBlID09PSAndGV4dCcpIGFjYy5wdXNoKG5vZGUudmFsdWUpO1xuICBpZiAobm9kZS50eXBlID09PSAncmFuZ2UnKSBub2RlLnR5cGUgPSAndGV4dCc7XG4gIHJldHVybiBhY2M7XG59LCBbXSk7XG5cbi8qKlxuICogRmxhdHRlbiBhbiBhcnJheVxuICovXG5cbmV4cG9ydHMuZmxhdHRlbiA9ICguLi5hcmdzKSA9PiB7XG4gIGNvbnN0IHJlc3VsdCA9IFtdO1xuICBjb25zdCBmbGF0ID0gYXJyID0+IHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuICAgICAgbGV0IGVsZSA9IGFycltpXTtcbiAgICAgIEFycmF5LmlzQXJyYXkoZWxlKSA/IGZsYXQoZWxlLCByZXN1bHQpIDogZWxlICE9PSB2b2lkIDAgJiYgcmVzdWx0LnB1c2goZWxlKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbiAgZmxhdChhcmdzKTtcbiAgcmV0dXJuIHJlc3VsdDtcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCB1dGlscyA9IHJlcXVpcmUoJy4vdXRpbHMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSAoYXN0LCBvcHRpb25zID0ge30pID0+IHtcbiAgbGV0IHN0cmluZ2lmeSA9IChub2RlLCBwYXJlbnQgPSB7fSkgPT4ge1xuICAgIGxldCBpbnZhbGlkQmxvY2sgPSBvcHRpb25zLmVzY2FwZUludmFsaWQgJiYgdXRpbHMuaXNJbnZhbGlkQnJhY2UocGFyZW50KTtcbiAgICBsZXQgaW52YWxpZE5vZGUgPSBub2RlLmludmFsaWQgPT09IHRydWUgJiYgb3B0aW9ucy5lc2NhcGVJbnZhbGlkID09PSB0cnVlO1xuICAgIGxldCBvdXRwdXQgPSAnJztcblxuICAgIGlmIChub2RlLnZhbHVlKSB7XG4gICAgICBpZiAoKGludmFsaWRCbG9jayB8fCBpbnZhbGlkTm9kZSkgJiYgdXRpbHMuaXNPcGVuT3JDbG9zZShub2RlKSkge1xuICAgICAgICByZXR1cm4gJ1xcXFwnICsgbm9kZS52YWx1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBub2RlLnZhbHVlO1xuICAgIH1cblxuICAgIGlmIChub2RlLnZhbHVlKSB7XG4gICAgICByZXR1cm4gbm9kZS52YWx1ZTtcbiAgICB9XG5cbiAgICBpZiAobm9kZS5ub2Rlcykge1xuICAgICAgZm9yIChsZXQgY2hpbGQgb2Ygbm9kZS5ub2Rlcykge1xuICAgICAgICBvdXRwdXQgKz0gc3RyaW5naWZ5KGNoaWxkKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG91dHB1dDtcbiAgfTtcblxuICByZXR1cm4gc3RyaW5naWZ5KGFzdCk7XG59O1xuXG4iLCAiLyohXG4gKiBpcy1udW1iZXIgPGh0dHBzOi8vZ2l0aHViLmNvbS9qb25zY2hsaW5rZXJ0L2lzLW51bWJlcj5cbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTQtcHJlc2VudCwgSm9uIFNjaGxpbmtlcnQuXG4gKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKG51bSkge1xuICBpZiAodHlwZW9mIG51bSA9PT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4gbnVtIC0gbnVtID09PSAwO1xuICB9XG4gIGlmICh0eXBlb2YgbnVtID09PSAnc3RyaW5nJyAmJiBudW0udHJpbSgpICE9PSAnJykge1xuICAgIHJldHVybiBOdW1iZXIuaXNGaW5pdGUgPyBOdW1iZXIuaXNGaW5pdGUoK251bSkgOiBpc0Zpbml0ZSgrbnVtKTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59O1xuIiwgIi8qIVxuICogdG8tcmVnZXgtcmFuZ2UgPGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb21hdGNoL3RvLXJlZ2V4LXJhbmdlPlxuICpcbiAqIENvcHlyaWdodCAoYykgMjAxNS1wcmVzZW50LCBKb24gU2NobGlua2VydC5cbiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbmNvbnN0IGlzTnVtYmVyID0gcmVxdWlyZSgnaXMtbnVtYmVyJyk7XG5cbmNvbnN0IHRvUmVnZXhSYW5nZSA9IChtaW4sIG1heCwgb3B0aW9ucykgPT4ge1xuICBpZiAoaXNOdW1iZXIobWluKSA9PT0gZmFsc2UpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCd0b1JlZ2V4UmFuZ2U6IGV4cGVjdGVkIHRoZSBmaXJzdCBhcmd1bWVudCB0byBiZSBhIG51bWJlcicpO1xuICB9XG5cbiAgaWYgKG1heCA9PT0gdm9pZCAwIHx8IG1pbiA9PT0gbWF4KSB7XG4gICAgcmV0dXJuIFN0cmluZyhtaW4pO1xuICB9XG5cbiAgaWYgKGlzTnVtYmVyKG1heCkgPT09IGZhbHNlKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcigndG9SZWdleFJhbmdlOiBleHBlY3RlZCB0aGUgc2Vjb25kIGFyZ3VtZW50IHRvIGJlIGEgbnVtYmVyLicpO1xuICB9XG5cbiAgbGV0IG9wdHMgPSB7IHJlbGF4WmVyb3M6IHRydWUsIC4uLm9wdGlvbnMgfTtcbiAgaWYgKHR5cGVvZiBvcHRzLnN0cmljdFplcm9zID09PSAnYm9vbGVhbicpIHtcbiAgICBvcHRzLnJlbGF4WmVyb3MgPSBvcHRzLnN0cmljdFplcm9zID09PSBmYWxzZTtcbiAgfVxuXG4gIGxldCByZWxheCA9IFN0cmluZyhvcHRzLnJlbGF4WmVyb3MpO1xuICBsZXQgc2hvcnRoYW5kID0gU3RyaW5nKG9wdHMuc2hvcnRoYW5kKTtcbiAgbGV0IGNhcHR1cmUgPSBTdHJpbmcob3B0cy5jYXB0dXJlKTtcbiAgbGV0IHdyYXAgPSBTdHJpbmcob3B0cy53cmFwKTtcbiAgbGV0IGNhY2hlS2V5ID0gbWluICsgJzonICsgbWF4ICsgJz0nICsgcmVsYXggKyBzaG9ydGhhbmQgKyBjYXB0dXJlICsgd3JhcDtcblxuICBpZiAodG9SZWdleFJhbmdlLmNhY2hlLmhhc093blByb3BlcnR5KGNhY2hlS2V5KSkge1xuICAgIHJldHVybiB0b1JlZ2V4UmFuZ2UuY2FjaGVbY2FjaGVLZXldLnJlc3VsdDtcbiAgfVxuXG4gIGxldCBhID0gTWF0aC5taW4obWluLCBtYXgpO1xuICBsZXQgYiA9IE1hdGgubWF4KG1pbiwgbWF4KTtcblxuICBpZiAoTWF0aC5hYnMoYSAtIGIpID09PSAxKSB7XG4gICAgbGV0IHJlc3VsdCA9IG1pbiArICd8JyArIG1heDtcbiAgICBpZiAob3B0cy5jYXB0dXJlKSB7XG4gICAgICByZXR1cm4gYCgke3Jlc3VsdH0pYDtcbiAgICB9XG4gICAgaWYgKG9wdHMud3JhcCA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIHJldHVybiBgKD86JHtyZXN1bHR9KWA7XG4gIH1cblxuICBsZXQgaXNQYWRkZWQgPSBoYXNQYWRkaW5nKG1pbikgfHwgaGFzUGFkZGluZyhtYXgpO1xuICBsZXQgc3RhdGUgPSB7IG1pbiwgbWF4LCBhLCBiIH07XG4gIGxldCBwb3NpdGl2ZXMgPSBbXTtcbiAgbGV0IG5lZ2F0aXZlcyA9IFtdO1xuXG4gIGlmIChpc1BhZGRlZCkge1xuICAgIHN0YXRlLmlzUGFkZGVkID0gaXNQYWRkZWQ7XG4gICAgc3RhdGUubWF4TGVuID0gU3RyaW5nKHN0YXRlLm1heCkubGVuZ3RoO1xuICB9XG5cbiAgaWYgKGEgPCAwKSB7XG4gICAgbGV0IG5ld01pbiA9IGIgPCAwID8gTWF0aC5hYnMoYikgOiAxO1xuICAgIG5lZ2F0aXZlcyA9IHNwbGl0VG9QYXR0ZXJucyhuZXdNaW4sIE1hdGguYWJzKGEpLCBzdGF0ZSwgb3B0cyk7XG4gICAgYSA9IHN0YXRlLmEgPSAwO1xuICB9XG5cbiAgaWYgKGIgPj0gMCkge1xuICAgIHBvc2l0aXZlcyA9IHNwbGl0VG9QYXR0ZXJucyhhLCBiLCBzdGF0ZSwgb3B0cyk7XG4gIH1cblxuICBzdGF0ZS5uZWdhdGl2ZXMgPSBuZWdhdGl2ZXM7XG4gIHN0YXRlLnBvc2l0aXZlcyA9IHBvc2l0aXZlcztcbiAgc3RhdGUucmVzdWx0ID0gY29sbGF0ZVBhdHRlcm5zKG5lZ2F0aXZlcywgcG9zaXRpdmVzLCBvcHRzKTtcblxuICBpZiAob3B0cy5jYXB0dXJlID09PSB0cnVlKSB7XG4gICAgc3RhdGUucmVzdWx0ID0gYCgke3N0YXRlLnJlc3VsdH0pYDtcbiAgfSBlbHNlIGlmIChvcHRzLndyYXAgIT09IGZhbHNlICYmIChwb3NpdGl2ZXMubGVuZ3RoICsgbmVnYXRpdmVzLmxlbmd0aCkgPiAxKSB7XG4gICAgc3RhdGUucmVzdWx0ID0gYCg/OiR7c3RhdGUucmVzdWx0fSlgO1xuICB9XG5cbiAgdG9SZWdleFJhbmdlLmNhY2hlW2NhY2hlS2V5XSA9IHN0YXRlO1xuICByZXR1cm4gc3RhdGUucmVzdWx0O1xufTtcblxuZnVuY3Rpb24gY29sbGF0ZVBhdHRlcm5zKG5lZywgcG9zLCBvcHRpb25zKSB7XG4gIGxldCBvbmx5TmVnYXRpdmUgPSBmaWx0ZXJQYXR0ZXJucyhuZWcsIHBvcywgJy0nLCBmYWxzZSwgb3B0aW9ucykgfHwgW107XG4gIGxldCBvbmx5UG9zaXRpdmUgPSBmaWx0ZXJQYXR0ZXJucyhwb3MsIG5lZywgJycsIGZhbHNlLCBvcHRpb25zKSB8fCBbXTtcbiAgbGV0IGludGVyc2VjdGVkID0gZmlsdGVyUGF0dGVybnMobmVnLCBwb3MsICctPycsIHRydWUsIG9wdGlvbnMpIHx8IFtdO1xuICBsZXQgc3VicGF0dGVybnMgPSBvbmx5TmVnYXRpdmUuY29uY2F0KGludGVyc2VjdGVkKS5jb25jYXQob25seVBvc2l0aXZlKTtcbiAgcmV0dXJuIHN1YnBhdHRlcm5zLmpvaW4oJ3wnKTtcbn1cblxuZnVuY3Rpb24gc3BsaXRUb1JhbmdlcyhtaW4sIG1heCkge1xuICBsZXQgbmluZXMgPSAxO1xuICBsZXQgemVyb3MgPSAxO1xuXG4gIGxldCBzdG9wID0gY291bnROaW5lcyhtaW4sIG5pbmVzKTtcbiAgbGV0IHN0b3BzID0gbmV3IFNldChbbWF4XSk7XG5cbiAgd2hpbGUgKG1pbiA8PSBzdG9wICYmIHN0b3AgPD0gbWF4KSB7XG4gICAgc3RvcHMuYWRkKHN0b3ApO1xuICAgIG5pbmVzICs9IDE7XG4gICAgc3RvcCA9IGNvdW50TmluZXMobWluLCBuaW5lcyk7XG4gIH1cblxuICBzdG9wID0gY291bnRaZXJvcyhtYXggKyAxLCB6ZXJvcykgLSAxO1xuXG4gIHdoaWxlIChtaW4gPCBzdG9wICYmIHN0b3AgPD0gbWF4KSB7XG4gICAgc3RvcHMuYWRkKHN0b3ApO1xuICAgIHplcm9zICs9IDE7XG4gICAgc3RvcCA9IGNvdW50WmVyb3MobWF4ICsgMSwgemVyb3MpIC0gMTtcbiAgfVxuXG4gIHN0b3BzID0gWy4uLnN0b3BzXTtcbiAgc3RvcHMuc29ydChjb21wYXJlKTtcbiAgcmV0dXJuIHN0b3BzO1xufVxuXG4vKipcbiAqIENvbnZlcnQgYSByYW5nZSB0byBhIHJlZ2V4IHBhdHRlcm5cbiAqIEBwYXJhbSB7TnVtYmVyfSBgc3RhcnRgXG4gKiBAcGFyYW0ge051bWJlcn0gYHN0b3BgXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKi9cblxuZnVuY3Rpb24gcmFuZ2VUb1BhdHRlcm4oc3RhcnQsIHN0b3AsIG9wdGlvbnMpIHtcbiAgaWYgKHN0YXJ0ID09PSBzdG9wKSB7XG4gICAgcmV0dXJuIHsgcGF0dGVybjogc3RhcnQsIGNvdW50OiBbXSwgZGlnaXRzOiAwIH07XG4gIH1cblxuICBsZXQgemlwcGVkID0gemlwKHN0YXJ0LCBzdG9wKTtcbiAgbGV0IGRpZ2l0cyA9IHppcHBlZC5sZW5ndGg7XG4gIGxldCBwYXR0ZXJuID0gJyc7XG4gIGxldCBjb3VudCA9IDA7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBkaWdpdHM7IGkrKykge1xuICAgIGxldCBbc3RhcnREaWdpdCwgc3RvcERpZ2l0XSA9IHppcHBlZFtpXTtcblxuICAgIGlmIChzdGFydERpZ2l0ID09PSBzdG9wRGlnaXQpIHtcbiAgICAgIHBhdHRlcm4gKz0gc3RhcnREaWdpdDtcblxuICAgIH0gZWxzZSBpZiAoc3RhcnREaWdpdCAhPT0gJzAnIHx8IHN0b3BEaWdpdCAhPT0gJzknKSB7XG4gICAgICBwYXR0ZXJuICs9IHRvQ2hhcmFjdGVyQ2xhc3Moc3RhcnREaWdpdCwgc3RvcERpZ2l0LCBvcHRpb25zKTtcblxuICAgIH0gZWxzZSB7XG4gICAgICBjb3VudCsrO1xuICAgIH1cbiAgfVxuXG4gIGlmIChjb3VudCkge1xuICAgIHBhdHRlcm4gKz0gb3B0aW9ucy5zaG9ydGhhbmQgPT09IHRydWUgPyAnXFxcXGQnIDogJ1swLTldJztcbiAgfVxuXG4gIHJldHVybiB7IHBhdHRlcm4sIGNvdW50OiBbY291bnRdLCBkaWdpdHMgfTtcbn1cblxuZnVuY3Rpb24gc3BsaXRUb1BhdHRlcm5zKG1pbiwgbWF4LCB0b2ssIG9wdGlvbnMpIHtcbiAgbGV0IHJhbmdlcyA9IHNwbGl0VG9SYW5nZXMobWluLCBtYXgpO1xuICBsZXQgdG9rZW5zID0gW107XG4gIGxldCBzdGFydCA9IG1pbjtcbiAgbGV0IHByZXY7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCByYW5nZXMubGVuZ3RoOyBpKyspIHtcbiAgICBsZXQgbWF4ID0gcmFuZ2VzW2ldO1xuICAgIGxldCBvYmogPSByYW5nZVRvUGF0dGVybihTdHJpbmcoc3RhcnQpLCBTdHJpbmcobWF4KSwgb3B0aW9ucyk7XG4gICAgbGV0IHplcm9zID0gJyc7XG5cbiAgICBpZiAoIXRvay5pc1BhZGRlZCAmJiBwcmV2ICYmIHByZXYucGF0dGVybiA9PT0gb2JqLnBhdHRlcm4pIHtcbiAgICAgIGlmIChwcmV2LmNvdW50Lmxlbmd0aCA+IDEpIHtcbiAgICAgICAgcHJldi5jb3VudC5wb3AoKTtcbiAgICAgIH1cblxuICAgICAgcHJldi5jb3VudC5wdXNoKG9iai5jb3VudFswXSk7XG4gICAgICBwcmV2LnN0cmluZyA9IHByZXYucGF0dGVybiArIHRvUXVhbnRpZmllcihwcmV2LmNvdW50KTtcbiAgICAgIHN0YXJ0ID0gbWF4ICsgMTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmICh0b2suaXNQYWRkZWQpIHtcbiAgICAgIHplcm9zID0gcGFkWmVyb3MobWF4LCB0b2ssIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIG9iai5zdHJpbmcgPSB6ZXJvcyArIG9iai5wYXR0ZXJuICsgdG9RdWFudGlmaWVyKG9iai5jb3VudCk7XG4gICAgdG9rZW5zLnB1c2gob2JqKTtcbiAgICBzdGFydCA9IG1heCArIDE7XG4gICAgcHJldiA9IG9iajtcbiAgfVxuXG4gIHJldHVybiB0b2tlbnM7XG59XG5cbmZ1bmN0aW9uIGZpbHRlclBhdHRlcm5zKGFyciwgY29tcGFyaXNvbiwgcHJlZml4LCBpbnRlcnNlY3Rpb24sIG9wdGlvbnMpIHtcbiAgbGV0IHJlc3VsdCA9IFtdO1xuXG4gIGZvciAobGV0IGVsZSBvZiBhcnIpIHtcbiAgICBsZXQgeyBzdHJpbmcgfSA9IGVsZTtcblxuICAgIC8vIG9ubHkgcHVzaCBpZiBfYm90aF8gYXJlIG5lZ2F0aXZlLi4uXG4gICAgaWYgKCFpbnRlcnNlY3Rpb24gJiYgIWNvbnRhaW5zKGNvbXBhcmlzb24sICdzdHJpbmcnLCBzdHJpbmcpKSB7XG4gICAgICByZXN1bHQucHVzaChwcmVmaXggKyBzdHJpbmcpO1xuICAgIH1cblxuICAgIC8vIG9yIF9ib3RoXyBhcmUgcG9zaXRpdmVcbiAgICBpZiAoaW50ZXJzZWN0aW9uICYmIGNvbnRhaW5zKGNvbXBhcmlzb24sICdzdHJpbmcnLCBzdHJpbmcpKSB7XG4gICAgICByZXN1bHQucHVzaChwcmVmaXggKyBzdHJpbmcpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIFppcCBzdHJpbmdzXG4gKi9cblxuZnVuY3Rpb24gemlwKGEsIGIpIHtcbiAgbGV0IGFyciA9IFtdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspIGFyci5wdXNoKFthW2ldLCBiW2ldXSk7XG4gIHJldHVybiBhcnI7XG59XG5cbmZ1bmN0aW9uIGNvbXBhcmUoYSwgYikge1xuICByZXR1cm4gYSA+IGIgPyAxIDogYiA+IGEgPyAtMSA6IDA7XG59XG5cbmZ1bmN0aW9uIGNvbnRhaW5zKGFyciwga2V5LCB2YWwpIHtcbiAgcmV0dXJuIGFyci5zb21lKGVsZSA9PiBlbGVba2V5XSA9PT0gdmFsKTtcbn1cblxuZnVuY3Rpb24gY291bnROaW5lcyhtaW4sIGxlbikge1xuICByZXR1cm4gTnVtYmVyKFN0cmluZyhtaW4pLnNsaWNlKDAsIC1sZW4pICsgJzknLnJlcGVhdChsZW4pKTtcbn1cblxuZnVuY3Rpb24gY291bnRaZXJvcyhpbnRlZ2VyLCB6ZXJvcykge1xuICByZXR1cm4gaW50ZWdlciAtIChpbnRlZ2VyICUgTWF0aC5wb3coMTAsIHplcm9zKSk7XG59XG5cbmZ1bmN0aW9uIHRvUXVhbnRpZmllcihkaWdpdHMpIHtcbiAgbGV0IFtzdGFydCA9IDAsIHN0b3AgPSAnJ10gPSBkaWdpdHM7XG4gIGlmIChzdG9wIHx8IHN0YXJ0ID4gMSkge1xuICAgIHJldHVybiBgeyR7c3RhcnQgKyAoc3RvcCA/ICcsJyArIHN0b3AgOiAnJyl9fWA7XG4gIH1cbiAgcmV0dXJuICcnO1xufVxuXG5mdW5jdGlvbiB0b0NoYXJhY3RlckNsYXNzKGEsIGIsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIGBbJHthfSR7KGIgLSBhID09PSAxKSA/ICcnIDogJy0nfSR7Yn1dYDtcbn1cblxuZnVuY3Rpb24gaGFzUGFkZGluZyhzdHIpIHtcbiAgcmV0dXJuIC9eLT8oMCspXFxkLy50ZXN0KHN0cik7XG59XG5cbmZ1bmN0aW9uIHBhZFplcm9zKHZhbHVlLCB0b2ssIG9wdGlvbnMpIHtcbiAgaWYgKCF0b2suaXNQYWRkZWQpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICBsZXQgZGlmZiA9IE1hdGguYWJzKHRvay5tYXhMZW4gLSBTdHJpbmcodmFsdWUpLmxlbmd0aCk7XG4gIGxldCByZWxheCA9IG9wdGlvbnMucmVsYXhaZXJvcyAhPT0gZmFsc2U7XG5cbiAgc3dpdGNoIChkaWZmKSB7XG4gICAgY2FzZSAwOlxuICAgICAgcmV0dXJuICcnO1xuICAgIGNhc2UgMTpcbiAgICAgIHJldHVybiByZWxheCA/ICcwPycgOiAnMCc7XG4gICAgY2FzZSAyOlxuICAgICAgcmV0dXJuIHJlbGF4ID8gJzB7MCwyfScgOiAnMDAnO1xuICAgIGRlZmF1bHQ6IHtcbiAgICAgIHJldHVybiByZWxheCA/IGAwezAsJHtkaWZmfX1gIDogYDB7JHtkaWZmfX1gO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIENhY2hlXG4gKi9cblxudG9SZWdleFJhbmdlLmNhY2hlID0ge307XG50b1JlZ2V4UmFuZ2UuY2xlYXJDYWNoZSA9ICgpID0+ICh0b1JlZ2V4UmFuZ2UuY2FjaGUgPSB7fSk7XG5cbi8qKlxuICogRXhwb3NlIGB0b1JlZ2V4UmFuZ2VgXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSB0b1JlZ2V4UmFuZ2U7XG4iLCAiLyohXG4gKiBmaWxsLXJhbmdlIDxodHRwczovL2dpdGh1Yi5jb20vam9uc2NobGlua2VydC9maWxsLXJhbmdlPlxuICpcbiAqIENvcHlyaWdodCAoYykgMjAxNC1wcmVzZW50LCBKb24gU2NobGlua2VydC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbmNvbnN0IHV0aWwgPSByZXF1aXJlKCd1dGlsJyk7XG5jb25zdCB0b1JlZ2V4UmFuZ2UgPSByZXF1aXJlKCd0by1yZWdleC1yYW5nZScpO1xuXG5jb25zdCBpc09iamVjdCA9IHZhbCA9PiB2YWwgIT09IG51bGwgJiYgdHlwZW9mIHZhbCA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkodmFsKTtcblxuY29uc3QgdHJhbnNmb3JtID0gdG9OdW1iZXIgPT4ge1xuICByZXR1cm4gdmFsdWUgPT4gdG9OdW1iZXIgPT09IHRydWUgPyBOdW1iZXIodmFsdWUpIDogU3RyaW5nKHZhbHVlKTtcbn07XG5cbmNvbnN0IGlzVmFsaWRWYWx1ZSA9IHZhbHVlID0+IHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgfHwgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgdmFsdWUgIT09ICcnKTtcbn07XG5cbmNvbnN0IGlzTnVtYmVyID0gbnVtID0+IE51bWJlci5pc0ludGVnZXIoK251bSk7XG5cbmNvbnN0IHplcm9zID0gaW5wdXQgPT4ge1xuICBsZXQgdmFsdWUgPSBgJHtpbnB1dH1gO1xuICBsZXQgaW5kZXggPSAtMTtcbiAgaWYgKHZhbHVlWzBdID09PSAnLScpIHZhbHVlID0gdmFsdWUuc2xpY2UoMSk7XG4gIGlmICh2YWx1ZSA9PT0gJzAnKSByZXR1cm4gZmFsc2U7XG4gIHdoaWxlICh2YWx1ZVsrK2luZGV4XSA9PT0gJzAnKTtcbiAgcmV0dXJuIGluZGV4ID4gMDtcbn07XG5cbmNvbnN0IHN0cmluZ2lmeSA9IChzdGFydCwgZW5kLCBvcHRpb25zKSA9PiB7XG4gIGlmICh0eXBlb2Ygc3RhcnQgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBlbmQgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIG9wdGlvbnMuc3RyaW5naWZ5ID09PSB0cnVlO1xufTtcblxuY29uc3QgcGFkID0gKGlucHV0LCBtYXhMZW5ndGgsIHRvTnVtYmVyKSA9PiB7XG4gIGlmIChtYXhMZW5ndGggPiAwKSB7XG4gICAgbGV0IGRhc2ggPSBpbnB1dFswXSA9PT0gJy0nID8gJy0nIDogJyc7XG4gICAgaWYgKGRhc2gpIGlucHV0ID0gaW5wdXQuc2xpY2UoMSk7XG4gICAgaW5wdXQgPSAoZGFzaCArIGlucHV0LnBhZFN0YXJ0KGRhc2ggPyBtYXhMZW5ndGggLSAxIDogbWF4TGVuZ3RoLCAnMCcpKTtcbiAgfVxuICBpZiAodG9OdW1iZXIgPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuIFN0cmluZyhpbnB1dCk7XG4gIH1cbiAgcmV0dXJuIGlucHV0O1xufTtcblxuY29uc3QgdG9NYXhMZW4gPSAoaW5wdXQsIG1heExlbmd0aCkgPT4ge1xuICBsZXQgbmVnYXRpdmUgPSBpbnB1dFswXSA9PT0gJy0nID8gJy0nIDogJyc7XG4gIGlmIChuZWdhdGl2ZSkge1xuICAgIGlucHV0ID0gaW5wdXQuc2xpY2UoMSk7XG4gICAgbWF4TGVuZ3RoLS07XG4gIH1cbiAgd2hpbGUgKGlucHV0Lmxlbmd0aCA8IG1heExlbmd0aCkgaW5wdXQgPSAnMCcgKyBpbnB1dDtcbiAgcmV0dXJuIG5lZ2F0aXZlID8gKCctJyArIGlucHV0KSA6IGlucHV0O1xufTtcblxuY29uc3QgdG9TZXF1ZW5jZSA9IChwYXJ0cywgb3B0aW9ucykgPT4ge1xuICBwYXJ0cy5uZWdhdGl2ZXMuc29ydCgoYSwgYikgPT4gYSA8IGIgPyAtMSA6IGEgPiBiID8gMSA6IDApO1xuICBwYXJ0cy5wb3NpdGl2ZXMuc29ydCgoYSwgYikgPT4gYSA8IGIgPyAtMSA6IGEgPiBiID8gMSA6IDApO1xuXG4gIGxldCBwcmVmaXggPSBvcHRpb25zLmNhcHR1cmUgPyAnJyA6ICc/Oic7XG4gIGxldCBwb3NpdGl2ZXMgPSAnJztcbiAgbGV0IG5lZ2F0aXZlcyA9ICcnO1xuICBsZXQgcmVzdWx0O1xuXG4gIGlmIChwYXJ0cy5wb3NpdGl2ZXMubGVuZ3RoKSB7XG4gICAgcG9zaXRpdmVzID0gcGFydHMucG9zaXRpdmVzLmpvaW4oJ3wnKTtcbiAgfVxuXG4gIGlmIChwYXJ0cy5uZWdhdGl2ZXMubGVuZ3RoKSB7XG4gICAgbmVnYXRpdmVzID0gYC0oJHtwcmVmaXh9JHtwYXJ0cy5uZWdhdGl2ZXMuam9pbignfCcpfSlgO1xuICB9XG5cbiAgaWYgKHBvc2l0aXZlcyAmJiBuZWdhdGl2ZXMpIHtcbiAgICByZXN1bHQgPSBgJHtwb3NpdGl2ZXN9fCR7bmVnYXRpdmVzfWA7XG4gIH0gZWxzZSB7XG4gICAgcmVzdWx0ID0gcG9zaXRpdmVzIHx8IG5lZ2F0aXZlcztcbiAgfVxuXG4gIGlmIChvcHRpb25zLndyYXApIHtcbiAgICByZXR1cm4gYCgke3ByZWZpeH0ke3Jlc3VsdH0pYDtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG5jb25zdCB0b1JhbmdlID0gKGEsIGIsIGlzTnVtYmVycywgb3B0aW9ucykgPT4ge1xuICBpZiAoaXNOdW1iZXJzKSB7XG4gICAgcmV0dXJuIHRvUmVnZXhSYW5nZShhLCBiLCB7IHdyYXA6IGZhbHNlLCAuLi5vcHRpb25zIH0pO1xuICB9XG5cbiAgbGV0IHN0YXJ0ID0gU3RyaW5nLmZyb21DaGFyQ29kZShhKTtcbiAgaWYgKGEgPT09IGIpIHJldHVybiBzdGFydDtcblxuICBsZXQgc3RvcCA9IFN0cmluZy5mcm9tQ2hhckNvZGUoYik7XG4gIHJldHVybiBgWyR7c3RhcnR9LSR7c3RvcH1dYDtcbn07XG5cbmNvbnN0IHRvUmVnZXggPSAoc3RhcnQsIGVuZCwgb3B0aW9ucykgPT4ge1xuICBpZiAoQXJyYXkuaXNBcnJheShzdGFydCkpIHtcbiAgICBsZXQgd3JhcCA9IG9wdGlvbnMud3JhcCA9PT0gdHJ1ZTtcbiAgICBsZXQgcHJlZml4ID0gb3B0aW9ucy5jYXB0dXJlID8gJycgOiAnPzonO1xuICAgIHJldHVybiB3cmFwID8gYCgke3ByZWZpeH0ke3N0YXJ0LmpvaW4oJ3wnKX0pYCA6IHN0YXJ0LmpvaW4oJ3wnKTtcbiAgfVxuICByZXR1cm4gdG9SZWdleFJhbmdlKHN0YXJ0LCBlbmQsIG9wdGlvbnMpO1xufTtcblxuY29uc3QgcmFuZ2VFcnJvciA9ICguLi5hcmdzKSA9PiB7XG4gIHJldHVybiBuZXcgUmFuZ2VFcnJvcignSW52YWxpZCByYW5nZSBhcmd1bWVudHM6ICcgKyB1dGlsLmluc3BlY3QoLi4uYXJncykpO1xufTtcblxuY29uc3QgaW52YWxpZFJhbmdlID0gKHN0YXJ0LCBlbmQsIG9wdGlvbnMpID0+IHtcbiAgaWYgKG9wdGlvbnMuc3RyaWN0UmFuZ2VzID09PSB0cnVlKSB0aHJvdyByYW5nZUVycm9yKFtzdGFydCwgZW5kXSk7XG4gIHJldHVybiBbXTtcbn07XG5cbmNvbnN0IGludmFsaWRTdGVwID0gKHN0ZXAsIG9wdGlvbnMpID0+IHtcbiAgaWYgKG9wdGlvbnMuc3RyaWN0UmFuZ2VzID09PSB0cnVlKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgRXhwZWN0ZWQgc3RlcCBcIiR7c3RlcH1cIiB0byBiZSBhIG51bWJlcmApO1xuICB9XG4gIHJldHVybiBbXTtcbn07XG5cbmNvbnN0IGZpbGxOdW1iZXJzID0gKHN0YXJ0LCBlbmQsIHN0ZXAgPSAxLCBvcHRpb25zID0ge30pID0+IHtcbiAgbGV0IGEgPSBOdW1iZXIoc3RhcnQpO1xuICBsZXQgYiA9IE51bWJlcihlbmQpO1xuXG4gIGlmICghTnVtYmVyLmlzSW50ZWdlcihhKSB8fCAhTnVtYmVyLmlzSW50ZWdlcihiKSkge1xuICAgIGlmIChvcHRpb25zLnN0cmljdFJhbmdlcyA9PT0gdHJ1ZSkgdGhyb3cgcmFuZ2VFcnJvcihbc3RhcnQsIGVuZF0pO1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIC8vIGZpeCBuZWdhdGl2ZSB6ZXJvXG4gIGlmIChhID09PSAwKSBhID0gMDtcbiAgaWYgKGIgPT09IDApIGIgPSAwO1xuXG4gIGxldCBkZXNjZW5kaW5nID0gYSA+IGI7XG4gIGxldCBzdGFydFN0cmluZyA9IFN0cmluZyhzdGFydCk7XG4gIGxldCBlbmRTdHJpbmcgPSBTdHJpbmcoZW5kKTtcbiAgbGV0IHN0ZXBTdHJpbmcgPSBTdHJpbmcoc3RlcCk7XG4gIHN0ZXAgPSBNYXRoLm1heChNYXRoLmFicyhzdGVwKSwgMSk7XG5cbiAgbGV0IHBhZGRlZCA9IHplcm9zKHN0YXJ0U3RyaW5nKSB8fCB6ZXJvcyhlbmRTdHJpbmcpIHx8IHplcm9zKHN0ZXBTdHJpbmcpO1xuICBsZXQgbWF4TGVuID0gcGFkZGVkID8gTWF0aC5tYXgoc3RhcnRTdHJpbmcubGVuZ3RoLCBlbmRTdHJpbmcubGVuZ3RoLCBzdGVwU3RyaW5nLmxlbmd0aCkgOiAwO1xuICBsZXQgdG9OdW1iZXIgPSBwYWRkZWQgPT09IGZhbHNlICYmIHN0cmluZ2lmeShzdGFydCwgZW5kLCBvcHRpb25zKSA9PT0gZmFsc2U7XG4gIGxldCBmb3JtYXQgPSBvcHRpb25zLnRyYW5zZm9ybSB8fCB0cmFuc2Zvcm0odG9OdW1iZXIpO1xuXG4gIGlmIChvcHRpb25zLnRvUmVnZXggJiYgc3RlcCA9PT0gMSkge1xuICAgIHJldHVybiB0b1JhbmdlKHRvTWF4TGVuKHN0YXJ0LCBtYXhMZW4pLCB0b01heExlbihlbmQsIG1heExlbiksIHRydWUsIG9wdGlvbnMpO1xuICB9XG5cbiAgbGV0IHBhcnRzID0geyBuZWdhdGl2ZXM6IFtdLCBwb3NpdGl2ZXM6IFtdIH07XG4gIGxldCBwdXNoID0gbnVtID0+IHBhcnRzW251bSA8IDAgPyAnbmVnYXRpdmVzJyA6ICdwb3NpdGl2ZXMnXS5wdXNoKE1hdGguYWJzKG51bSkpO1xuICBsZXQgcmFuZ2UgPSBbXTtcbiAgbGV0IGluZGV4ID0gMDtcblxuICB3aGlsZSAoZGVzY2VuZGluZyA/IGEgPj0gYiA6IGEgPD0gYikge1xuICAgIGlmIChvcHRpb25zLnRvUmVnZXggPT09IHRydWUgJiYgc3RlcCA+IDEpIHtcbiAgICAgIHB1c2goYSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJhbmdlLnB1c2gocGFkKGZvcm1hdChhLCBpbmRleCksIG1heExlbiwgdG9OdW1iZXIpKTtcbiAgICB9XG4gICAgYSA9IGRlc2NlbmRpbmcgPyBhIC0gc3RlcCA6IGEgKyBzdGVwO1xuICAgIGluZGV4Kys7XG4gIH1cblxuICBpZiAob3B0aW9ucy50b1JlZ2V4ID09PSB0cnVlKSB7XG4gICAgcmV0dXJuIHN0ZXAgPiAxXG4gICAgICA/IHRvU2VxdWVuY2UocGFydHMsIG9wdGlvbnMpXG4gICAgICA6IHRvUmVnZXgocmFuZ2UsIG51bGwsIHsgd3JhcDogZmFsc2UsIC4uLm9wdGlvbnMgfSk7XG4gIH1cblxuICByZXR1cm4gcmFuZ2U7XG59O1xuXG5jb25zdCBmaWxsTGV0dGVycyA9IChzdGFydCwgZW5kLCBzdGVwID0gMSwgb3B0aW9ucyA9IHt9KSA9PiB7XG4gIGlmICgoIWlzTnVtYmVyKHN0YXJ0KSAmJiBzdGFydC5sZW5ndGggPiAxKSB8fCAoIWlzTnVtYmVyKGVuZCkgJiYgZW5kLmxlbmd0aCA+IDEpKSB7XG4gICAgcmV0dXJuIGludmFsaWRSYW5nZShzdGFydCwgZW5kLCBvcHRpb25zKTtcbiAgfVxuXG5cbiAgbGV0IGZvcm1hdCA9IG9wdGlvbnMudHJhbnNmb3JtIHx8ICh2YWwgPT4gU3RyaW5nLmZyb21DaGFyQ29kZSh2YWwpKTtcbiAgbGV0IGEgPSBgJHtzdGFydH1gLmNoYXJDb2RlQXQoMCk7XG4gIGxldCBiID0gYCR7ZW5kfWAuY2hhckNvZGVBdCgwKTtcblxuICBsZXQgZGVzY2VuZGluZyA9IGEgPiBiO1xuICBsZXQgbWluID0gTWF0aC5taW4oYSwgYik7XG4gIGxldCBtYXggPSBNYXRoLm1heChhLCBiKTtcblxuICBpZiAob3B0aW9ucy50b1JlZ2V4ICYmIHN0ZXAgPT09IDEpIHtcbiAgICByZXR1cm4gdG9SYW5nZShtaW4sIG1heCwgZmFsc2UsIG9wdGlvbnMpO1xuICB9XG5cbiAgbGV0IHJhbmdlID0gW107XG4gIGxldCBpbmRleCA9IDA7XG5cbiAgd2hpbGUgKGRlc2NlbmRpbmcgPyBhID49IGIgOiBhIDw9IGIpIHtcbiAgICByYW5nZS5wdXNoKGZvcm1hdChhLCBpbmRleCkpO1xuICAgIGEgPSBkZXNjZW5kaW5nID8gYSAtIHN0ZXAgOiBhICsgc3RlcDtcbiAgICBpbmRleCsrO1xuICB9XG5cbiAgaWYgKG9wdGlvbnMudG9SZWdleCA9PT0gdHJ1ZSkge1xuICAgIHJldHVybiB0b1JlZ2V4KHJhbmdlLCBudWxsLCB7IHdyYXA6IGZhbHNlLCBvcHRpb25zIH0pO1xuICB9XG5cbiAgcmV0dXJuIHJhbmdlO1xufTtcblxuY29uc3QgZmlsbCA9IChzdGFydCwgZW5kLCBzdGVwLCBvcHRpb25zID0ge30pID0+IHtcbiAgaWYgKGVuZCA9PSBudWxsICYmIGlzVmFsaWRWYWx1ZShzdGFydCkpIHtcbiAgICByZXR1cm4gW3N0YXJ0XTtcbiAgfVxuXG4gIGlmICghaXNWYWxpZFZhbHVlKHN0YXJ0KSB8fCAhaXNWYWxpZFZhbHVlKGVuZCkpIHtcbiAgICByZXR1cm4gaW52YWxpZFJhbmdlKHN0YXJ0LCBlbmQsIG9wdGlvbnMpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBzdGVwID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIGZpbGwoc3RhcnQsIGVuZCwgMSwgeyB0cmFuc2Zvcm06IHN0ZXAgfSk7XG4gIH1cblxuICBpZiAoaXNPYmplY3Qoc3RlcCkpIHtcbiAgICByZXR1cm4gZmlsbChzdGFydCwgZW5kLCAwLCBzdGVwKTtcbiAgfVxuXG4gIGxldCBvcHRzID0geyAuLi5vcHRpb25zIH07XG4gIGlmIChvcHRzLmNhcHR1cmUgPT09IHRydWUpIG9wdHMud3JhcCA9IHRydWU7XG4gIHN0ZXAgPSBzdGVwIHx8IG9wdHMuc3RlcCB8fCAxO1xuXG4gIGlmICghaXNOdW1iZXIoc3RlcCkpIHtcbiAgICBpZiAoc3RlcCAhPSBudWxsICYmICFpc09iamVjdChzdGVwKSkgcmV0dXJuIGludmFsaWRTdGVwKHN0ZXAsIG9wdHMpO1xuICAgIHJldHVybiBmaWxsKHN0YXJ0LCBlbmQsIDEsIHN0ZXApO1xuICB9XG5cbiAgaWYgKGlzTnVtYmVyKHN0YXJ0KSAmJiBpc051bWJlcihlbmQpKSB7XG4gICAgcmV0dXJuIGZpbGxOdW1iZXJzKHN0YXJ0LCBlbmQsIHN0ZXAsIG9wdHMpO1xuICB9XG5cbiAgcmV0dXJuIGZpbGxMZXR0ZXJzKHN0YXJ0LCBlbmQsIE1hdGgubWF4KE1hdGguYWJzKHN0ZXApLCAxKSwgb3B0cyk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZpbGw7XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBmaWxsID0gcmVxdWlyZSgnZmlsbC1yYW5nZScpO1xuY29uc3QgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG5cbmNvbnN0IGNvbXBpbGUgPSAoYXN0LCBvcHRpb25zID0ge30pID0+IHtcbiAgbGV0IHdhbGsgPSAobm9kZSwgcGFyZW50ID0ge30pID0+IHtcbiAgICBsZXQgaW52YWxpZEJsb2NrID0gdXRpbHMuaXNJbnZhbGlkQnJhY2UocGFyZW50KTtcbiAgICBsZXQgaW52YWxpZE5vZGUgPSBub2RlLmludmFsaWQgPT09IHRydWUgJiYgb3B0aW9ucy5lc2NhcGVJbnZhbGlkID09PSB0cnVlO1xuICAgIGxldCBpbnZhbGlkID0gaW52YWxpZEJsb2NrID09PSB0cnVlIHx8IGludmFsaWROb2RlID09PSB0cnVlO1xuICAgIGxldCBwcmVmaXggPSBvcHRpb25zLmVzY2FwZUludmFsaWQgPT09IHRydWUgPyAnXFxcXCcgOiAnJztcbiAgICBsZXQgb3V0cHV0ID0gJyc7XG5cbiAgICBpZiAobm9kZS5pc09wZW4gPT09IHRydWUpIHtcbiAgICAgIHJldHVybiBwcmVmaXggKyBub2RlLnZhbHVlO1xuICAgIH1cbiAgICBpZiAobm9kZS5pc0Nsb3NlID09PSB0cnVlKSB7XG4gICAgICByZXR1cm4gcHJlZml4ICsgbm9kZS52YWx1ZTtcbiAgICB9XG5cbiAgICBpZiAobm9kZS50eXBlID09PSAnb3BlbicpIHtcbiAgICAgIHJldHVybiBpbnZhbGlkID8gKHByZWZpeCArIG5vZGUudmFsdWUpIDogJygnO1xuICAgIH1cblxuICAgIGlmIChub2RlLnR5cGUgPT09ICdjbG9zZScpIHtcbiAgICAgIHJldHVybiBpbnZhbGlkID8gKHByZWZpeCArIG5vZGUudmFsdWUpIDogJyknO1xuICAgIH1cblxuICAgIGlmIChub2RlLnR5cGUgPT09ICdjb21tYScpIHtcbiAgICAgIHJldHVybiBub2RlLnByZXYudHlwZSA9PT0gJ2NvbW1hJyA/ICcnIDogKGludmFsaWQgPyBub2RlLnZhbHVlIDogJ3wnKTtcbiAgICB9XG5cbiAgICBpZiAobm9kZS52YWx1ZSkge1xuICAgICAgcmV0dXJuIG5vZGUudmFsdWU7XG4gICAgfVxuXG4gICAgaWYgKG5vZGUubm9kZXMgJiYgbm9kZS5yYW5nZXMgPiAwKSB7XG4gICAgICBsZXQgYXJncyA9IHV0aWxzLnJlZHVjZShub2RlLm5vZGVzKTtcbiAgICAgIGxldCByYW5nZSA9IGZpbGwoLi4uYXJncywgeyAuLi5vcHRpb25zLCB3cmFwOiBmYWxzZSwgdG9SZWdleDogdHJ1ZSB9KTtcblxuICAgICAgaWYgKHJhbmdlLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICByZXR1cm4gYXJncy5sZW5ndGggPiAxICYmIHJhbmdlLmxlbmd0aCA+IDEgPyBgKCR7cmFuZ2V9KWAgOiByYW5nZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobm9kZS5ub2Rlcykge1xuICAgICAgZm9yIChsZXQgY2hpbGQgb2Ygbm9kZS5ub2Rlcykge1xuICAgICAgICBvdXRwdXQgKz0gd2FsayhjaGlsZCwgbm9kZSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvdXRwdXQ7XG4gIH07XG5cbiAgcmV0dXJuIHdhbGsoYXN0KTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gY29tcGlsZTtcbiIsICIndXNlIHN0cmljdCc7XG5cbmNvbnN0IGZpbGwgPSByZXF1aXJlKCdmaWxsLXJhbmdlJyk7XG5jb25zdCBzdHJpbmdpZnkgPSByZXF1aXJlKCcuL3N0cmluZ2lmeScpO1xuY29uc3QgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG5cbmNvbnN0IGFwcGVuZCA9IChxdWV1ZSA9ICcnLCBzdGFzaCA9ICcnLCBlbmNsb3NlID0gZmFsc2UpID0+IHtcbiAgbGV0IHJlc3VsdCA9IFtdO1xuXG4gIHF1ZXVlID0gW10uY29uY2F0KHF1ZXVlKTtcbiAgc3Rhc2ggPSBbXS5jb25jYXQoc3Rhc2gpO1xuXG4gIGlmICghc3Rhc2gubGVuZ3RoKSByZXR1cm4gcXVldWU7XG4gIGlmICghcXVldWUubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGVuY2xvc2UgPyB1dGlscy5mbGF0dGVuKHN0YXNoKS5tYXAoZWxlID0+IGB7JHtlbGV9fWApIDogc3Rhc2g7XG4gIH1cblxuICBmb3IgKGxldCBpdGVtIG9mIHF1ZXVlKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoaXRlbSkpIHtcbiAgICAgIGZvciAobGV0IHZhbHVlIG9mIGl0ZW0pIHtcbiAgICAgICAgcmVzdWx0LnB1c2goYXBwZW5kKHZhbHVlLCBzdGFzaCwgZW5jbG9zZSkpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGxldCBlbGUgb2Ygc3Rhc2gpIHtcbiAgICAgICAgaWYgKGVuY2xvc2UgPT09IHRydWUgJiYgdHlwZW9mIGVsZSA9PT0gJ3N0cmluZycpIGVsZSA9IGB7JHtlbGV9fWA7XG4gICAgICAgIHJlc3VsdC5wdXNoKEFycmF5LmlzQXJyYXkoZWxlKSA/IGFwcGVuZChpdGVtLCBlbGUsIGVuY2xvc2UpIDogKGl0ZW0gKyBlbGUpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHV0aWxzLmZsYXR0ZW4ocmVzdWx0KTtcbn07XG5cbmNvbnN0IGV4cGFuZCA9IChhc3QsIG9wdGlvbnMgPSB7fSkgPT4ge1xuICBsZXQgcmFuZ2VMaW1pdCA9IG9wdGlvbnMucmFuZ2VMaW1pdCA9PT0gdm9pZCAwID8gMTAwMCA6IG9wdGlvbnMucmFuZ2VMaW1pdDtcblxuICBsZXQgd2FsayA9IChub2RlLCBwYXJlbnQgPSB7fSkgPT4ge1xuICAgIG5vZGUucXVldWUgPSBbXTtcblxuICAgIGxldCBwID0gcGFyZW50O1xuICAgIGxldCBxID0gcGFyZW50LnF1ZXVlO1xuXG4gICAgd2hpbGUgKHAudHlwZSAhPT0gJ2JyYWNlJyAmJiBwLnR5cGUgIT09ICdyb290JyAmJiBwLnBhcmVudCkge1xuICAgICAgcCA9IHAucGFyZW50O1xuICAgICAgcSA9IHAucXVldWU7XG4gICAgfVxuXG4gICAgaWYgKG5vZGUuaW52YWxpZCB8fCBub2RlLmRvbGxhcikge1xuICAgICAgcS5wdXNoKGFwcGVuZChxLnBvcCgpLCBzdHJpbmdpZnkobm9kZSwgb3B0aW9ucykpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAobm9kZS50eXBlID09PSAnYnJhY2UnICYmIG5vZGUuaW52YWxpZCAhPT0gdHJ1ZSAmJiBub2RlLm5vZGVzLmxlbmd0aCA9PT0gMikge1xuICAgICAgcS5wdXNoKGFwcGVuZChxLnBvcCgpLCBbJ3t9J10pKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAobm9kZS5ub2RlcyAmJiBub2RlLnJhbmdlcyA+IDApIHtcbiAgICAgIGxldCBhcmdzID0gdXRpbHMucmVkdWNlKG5vZGUubm9kZXMpO1xuXG4gICAgICBpZiAodXRpbHMuZXhjZWVkc0xpbWl0KC4uLmFyZ3MsIG9wdGlvbnMuc3RlcCwgcmFuZ2VMaW1pdCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ2V4cGFuZGVkIGFycmF5IGxlbmd0aCBleGNlZWRzIHJhbmdlIGxpbWl0LiBVc2Ugb3B0aW9ucy5yYW5nZUxpbWl0IHRvIGluY3JlYXNlIG9yIGRpc2FibGUgdGhlIGxpbWl0LicpO1xuICAgICAgfVxuXG4gICAgICBsZXQgcmFuZ2UgPSBmaWxsKC4uLmFyZ3MsIG9wdGlvbnMpO1xuICAgICAgaWYgKHJhbmdlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByYW5nZSA9IHN0cmluZ2lmeShub2RlLCBvcHRpb25zKTtcbiAgICAgIH1cblxuICAgICAgcS5wdXNoKGFwcGVuZChxLnBvcCgpLCByYW5nZSkpO1xuICAgICAgbm9kZS5ub2RlcyA9IFtdO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBlbmNsb3NlID0gdXRpbHMuZW5jbG9zZUJyYWNlKG5vZGUpO1xuICAgIGxldCBxdWV1ZSA9IG5vZGUucXVldWU7XG4gICAgbGV0IGJsb2NrID0gbm9kZTtcblxuICAgIHdoaWxlIChibG9jay50eXBlICE9PSAnYnJhY2UnICYmIGJsb2NrLnR5cGUgIT09ICdyb290JyAmJiBibG9jay5wYXJlbnQpIHtcbiAgICAgIGJsb2NrID0gYmxvY2sucGFyZW50O1xuICAgICAgcXVldWUgPSBibG9jay5xdWV1ZTtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGUubm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGxldCBjaGlsZCA9IG5vZGUubm9kZXNbaV07XG5cbiAgICAgIGlmIChjaGlsZC50eXBlID09PSAnY29tbWEnICYmIG5vZGUudHlwZSA9PT0gJ2JyYWNlJykge1xuICAgICAgICBpZiAoaSA9PT0gMSkgcXVldWUucHVzaCgnJyk7XG4gICAgICAgIHF1ZXVlLnB1c2goJycpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNoaWxkLnR5cGUgPT09ICdjbG9zZScpIHtcbiAgICAgICAgcS5wdXNoKGFwcGVuZChxLnBvcCgpLCBxdWV1ZSwgZW5jbG9zZSkpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNoaWxkLnZhbHVlICYmIGNoaWxkLnR5cGUgIT09ICdvcGVuJykge1xuICAgICAgICBxdWV1ZS5wdXNoKGFwcGVuZChxdWV1ZS5wb3AoKSwgY2hpbGQudmFsdWUpKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChjaGlsZC5ub2Rlcykge1xuICAgICAgICB3YWxrKGNoaWxkLCBub2RlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcXVldWU7XG4gIH07XG5cbiAgcmV0dXJuIHV0aWxzLmZsYXR0ZW4od2Fsayhhc3QpKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZXhwYW5kO1xuIiwgIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIE1BWF9MRU5HVEg6IDEwMjQgKiA2NCxcblxuICAvLyBEaWdpdHNcbiAgQ0hBUl8wOiAnMCcsIC8qIDAgKi9cbiAgQ0hBUl85OiAnOScsIC8qIDkgKi9cblxuICAvLyBBbHBoYWJldCBjaGFycy5cbiAgQ0hBUl9VUFBFUkNBU0VfQTogJ0EnLCAvKiBBICovXG4gIENIQVJfTE9XRVJDQVNFX0E6ICdhJywgLyogYSAqL1xuICBDSEFSX1VQUEVSQ0FTRV9aOiAnWicsIC8qIFogKi9cbiAgQ0hBUl9MT1dFUkNBU0VfWjogJ3onLCAvKiB6ICovXG5cbiAgQ0hBUl9MRUZUX1BBUkVOVEhFU0VTOiAnKCcsIC8qICggKi9cbiAgQ0hBUl9SSUdIVF9QQVJFTlRIRVNFUzogJyknLCAvKiApICovXG5cbiAgQ0hBUl9BU1RFUklTSzogJyonLCAvKiAqICovXG5cbiAgLy8gTm9uLWFscGhhYmV0aWMgY2hhcnMuXG4gIENIQVJfQU1QRVJTQU5EOiAnJicsIC8qICYgKi9cbiAgQ0hBUl9BVDogJ0AnLCAvKiBAICovXG4gIENIQVJfQkFDS1NMQVNIOiAnXFxcXCcsIC8qIFxcICovXG4gIENIQVJfQkFDS1RJQ0s6ICdgJywgLyogYCAqL1xuICBDSEFSX0NBUlJJQUdFX1JFVFVSTjogJ1xccicsIC8qIFxcciAqL1xuICBDSEFSX0NJUkNVTUZMRVhfQUNDRU5UOiAnXicsIC8qIF4gKi9cbiAgQ0hBUl9DT0xPTjogJzonLCAvKiA6ICovXG4gIENIQVJfQ09NTUE6ICcsJywgLyogLCAqL1xuICBDSEFSX0RPTExBUjogJyQnLCAvKiAuICovXG4gIENIQVJfRE9UOiAnLicsIC8qIC4gKi9cbiAgQ0hBUl9ET1VCTEVfUVVPVEU6ICdcIicsIC8qIFwiICovXG4gIENIQVJfRVFVQUw6ICc9JywgLyogPSAqL1xuICBDSEFSX0VYQ0xBTUFUSU9OX01BUks6ICchJywgLyogISAqL1xuICBDSEFSX0ZPUk1fRkVFRDogJ1xcZicsIC8qIFxcZiAqL1xuICBDSEFSX0ZPUldBUkRfU0xBU0g6ICcvJywgLyogLyAqL1xuICBDSEFSX0hBU0g6ICcjJywgLyogIyAqL1xuICBDSEFSX0hZUEhFTl9NSU5VUzogJy0nLCAvKiAtICovXG4gIENIQVJfTEVGVF9BTkdMRV9CUkFDS0VUOiAnPCcsIC8qIDwgKi9cbiAgQ0hBUl9MRUZUX0NVUkxZX0JSQUNFOiAneycsIC8qIHsgKi9cbiAgQ0hBUl9MRUZUX1NRVUFSRV9CUkFDS0VUOiAnWycsIC8qIFsgKi9cbiAgQ0hBUl9MSU5FX0ZFRUQ6ICdcXG4nLCAvKiBcXG4gKi9cbiAgQ0hBUl9OT19CUkVBS19TUEFDRTogJ1xcdTAwQTAnLCAvKiBcXHUwMEEwICovXG4gIENIQVJfUEVSQ0VOVDogJyUnLCAvKiAlICovXG4gIENIQVJfUExVUzogJysnLCAvKiArICovXG4gIENIQVJfUVVFU1RJT05fTUFSSzogJz8nLCAvKiA/ICovXG4gIENIQVJfUklHSFRfQU5HTEVfQlJBQ0tFVDogJz4nLCAvKiA+ICovXG4gIENIQVJfUklHSFRfQ1VSTFlfQlJBQ0U6ICd9JywgLyogfSAqL1xuICBDSEFSX1JJR0hUX1NRVUFSRV9CUkFDS0VUOiAnXScsIC8qIF0gKi9cbiAgQ0hBUl9TRU1JQ09MT046ICc7JywgLyogOyAqL1xuICBDSEFSX1NJTkdMRV9RVU9URTogJ1xcJycsIC8qICcgKi9cbiAgQ0hBUl9TUEFDRTogJyAnLCAvKiAgICovXG4gIENIQVJfVEFCOiAnXFx0JywgLyogXFx0ICovXG4gIENIQVJfVU5ERVJTQ09SRTogJ18nLCAvKiBfICovXG4gIENIQVJfVkVSVElDQUxfTElORTogJ3wnLCAvKiB8ICovXG4gIENIQVJfWkVST19XSURUSF9OT0JSRUFLX1NQQUNFOiAnXFx1RkVGRicgLyogXFx1RkVGRiAqL1xufTtcbiIsICIndXNlIHN0cmljdCc7XG5cbmNvbnN0IHN0cmluZ2lmeSA9IHJlcXVpcmUoJy4vc3RyaW5naWZ5Jyk7XG5cbi8qKlxuICogQ29uc3RhbnRzXG4gKi9cblxuY29uc3Qge1xuICBNQVhfTEVOR1RILFxuICBDSEFSX0JBQ0tTTEFTSCwgLyogXFwgKi9cbiAgQ0hBUl9CQUNLVElDSywgLyogYCAqL1xuICBDSEFSX0NPTU1BLCAvKiAsICovXG4gIENIQVJfRE9ULCAvKiAuICovXG4gIENIQVJfTEVGVF9QQVJFTlRIRVNFUywgLyogKCAqL1xuICBDSEFSX1JJR0hUX1BBUkVOVEhFU0VTLCAvKiApICovXG4gIENIQVJfTEVGVF9DVVJMWV9CUkFDRSwgLyogeyAqL1xuICBDSEFSX1JJR0hUX0NVUkxZX0JSQUNFLCAvKiB9ICovXG4gIENIQVJfTEVGVF9TUVVBUkVfQlJBQ0tFVCwgLyogWyAqL1xuICBDSEFSX1JJR0hUX1NRVUFSRV9CUkFDS0VULCAvKiBdICovXG4gIENIQVJfRE9VQkxFX1FVT1RFLCAvKiBcIiAqL1xuICBDSEFSX1NJTkdMRV9RVU9URSwgLyogJyAqL1xuICBDSEFSX05PX0JSRUFLX1NQQUNFLFxuICBDSEFSX1pFUk9fV0lEVEhfTk9CUkVBS19TUEFDRVxufSA9IHJlcXVpcmUoJy4vY29uc3RhbnRzJyk7XG5cbi8qKlxuICogcGFyc2VcbiAqL1xuXG5jb25zdCBwYXJzZSA9IChpbnB1dCwgb3B0aW9ucyA9IHt9KSA9PiB7XG4gIGlmICh0eXBlb2YgaW5wdXQgIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgYSBzdHJpbmcnKTtcbiAgfVxuXG4gIGxldCBvcHRzID0gb3B0aW9ucyB8fCB7fTtcbiAgbGV0IG1heCA9IHR5cGVvZiBvcHRzLm1heExlbmd0aCA9PT0gJ251bWJlcicgPyBNYXRoLm1pbihNQVhfTEVOR1RILCBvcHRzLm1heExlbmd0aCkgOiBNQVhfTEVOR1RIO1xuICBpZiAoaW5wdXQubGVuZ3RoID4gbWF4KSB7XG4gICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKGBJbnB1dCBsZW5ndGggKCR7aW5wdXQubGVuZ3RofSksIGV4Y2VlZHMgbWF4IGNoYXJhY3RlcnMgKCR7bWF4fSlgKTtcbiAgfVxuXG4gIGxldCBhc3QgPSB7IHR5cGU6ICdyb290JywgaW5wdXQsIG5vZGVzOiBbXSB9O1xuICBsZXQgc3RhY2sgPSBbYXN0XTtcbiAgbGV0IGJsb2NrID0gYXN0O1xuICBsZXQgcHJldiA9IGFzdDtcbiAgbGV0IGJyYWNrZXRzID0gMDtcbiAgbGV0IGxlbmd0aCA9IGlucHV0Lmxlbmd0aDtcbiAgbGV0IGluZGV4ID0gMDtcbiAgbGV0IGRlcHRoID0gMDtcbiAgbGV0IHZhbHVlO1xuICBsZXQgbWVtbyA9IHt9O1xuXG4gIC8qKlxuICAgKiBIZWxwZXJzXG4gICAqL1xuXG4gIGNvbnN0IGFkdmFuY2UgPSAoKSA9PiBpbnB1dFtpbmRleCsrXTtcbiAgY29uc3QgcHVzaCA9IG5vZGUgPT4ge1xuICAgIGlmIChub2RlLnR5cGUgPT09ICd0ZXh0JyAmJiBwcmV2LnR5cGUgPT09ICdkb3QnKSB7XG4gICAgICBwcmV2LnR5cGUgPSAndGV4dCc7XG4gICAgfVxuXG4gICAgaWYgKHByZXYgJiYgcHJldi50eXBlID09PSAndGV4dCcgJiYgbm9kZS50eXBlID09PSAndGV4dCcpIHtcbiAgICAgIHByZXYudmFsdWUgKz0gbm9kZS52YWx1ZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBibG9jay5ub2Rlcy5wdXNoKG5vZGUpO1xuICAgIG5vZGUucGFyZW50ID0gYmxvY2s7XG4gICAgbm9kZS5wcmV2ID0gcHJldjtcbiAgICBwcmV2ID0gbm9kZTtcbiAgICByZXR1cm4gbm9kZTtcbiAgfTtcblxuICBwdXNoKHsgdHlwZTogJ2JvcycgfSk7XG5cbiAgd2hpbGUgKGluZGV4IDwgbGVuZ3RoKSB7XG4gICAgYmxvY2sgPSBzdGFja1tzdGFjay5sZW5ndGggLSAxXTtcbiAgICB2YWx1ZSA9IGFkdmFuY2UoKTtcblxuICAgIC8qKlxuICAgICAqIEludmFsaWQgY2hhcnNcbiAgICAgKi9cblxuICAgIGlmICh2YWx1ZSA9PT0gQ0hBUl9aRVJPX1dJRFRIX05PQlJFQUtfU1BBQ0UgfHwgdmFsdWUgPT09IENIQVJfTk9fQlJFQUtfU1BBQ0UpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVzY2FwZWQgY2hhcnNcbiAgICAgKi9cblxuICAgIGlmICh2YWx1ZSA9PT0gQ0hBUl9CQUNLU0xBU0gpIHtcbiAgICAgIHB1c2goeyB0eXBlOiAndGV4dCcsIHZhbHVlOiAob3B0aW9ucy5rZWVwRXNjYXBpbmcgPyB2YWx1ZSA6ICcnKSArIGFkdmFuY2UoKSB9KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJpZ2h0IHNxdWFyZSBicmFja2V0IChsaXRlcmFsKTogJ10nXG4gICAgICovXG5cbiAgICBpZiAodmFsdWUgPT09IENIQVJfUklHSFRfU1FVQVJFX0JSQUNLRVQpIHtcbiAgICAgIHB1c2goeyB0eXBlOiAndGV4dCcsIHZhbHVlOiAnXFxcXCcgKyB2YWx1ZSB9KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExlZnQgc3F1YXJlIGJyYWNrZXQ6ICdbJ1xuICAgICAqL1xuXG4gICAgaWYgKHZhbHVlID09PSBDSEFSX0xFRlRfU1FVQVJFX0JSQUNLRVQpIHtcbiAgICAgIGJyYWNrZXRzKys7XG5cbiAgICAgIGxldCBjbG9zZWQgPSB0cnVlO1xuICAgICAgbGV0IG5leHQ7XG5cbiAgICAgIHdoaWxlIChpbmRleCA8IGxlbmd0aCAmJiAobmV4dCA9IGFkdmFuY2UoKSkpIHtcbiAgICAgICAgdmFsdWUgKz0gbmV4dDtcblxuICAgICAgICBpZiAobmV4dCA9PT0gQ0hBUl9MRUZUX1NRVUFSRV9CUkFDS0VUKSB7XG4gICAgICAgICAgYnJhY2tldHMrKztcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChuZXh0ID09PSBDSEFSX0JBQ0tTTEFTSCkge1xuICAgICAgICAgIHZhbHVlICs9IGFkdmFuY2UoKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChuZXh0ID09PSBDSEFSX1JJR0hUX1NRVUFSRV9CUkFDS0VUKSB7XG4gICAgICAgICAgYnJhY2tldHMtLTtcblxuICAgICAgICAgIGlmIChicmFja2V0cyA9PT0gMCkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHB1c2goeyB0eXBlOiAndGV4dCcsIHZhbHVlIH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGFyZW50aGVzZXNcbiAgICAgKi9cblxuICAgIGlmICh2YWx1ZSA9PT0gQ0hBUl9MRUZUX1BBUkVOVEhFU0VTKSB7XG4gICAgICBibG9jayA9IHB1c2goeyB0eXBlOiAncGFyZW4nLCBub2RlczogW10gfSk7XG4gICAgICBzdGFjay5wdXNoKGJsb2NrKTtcbiAgICAgIHB1c2goeyB0eXBlOiAndGV4dCcsIHZhbHVlIH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKHZhbHVlID09PSBDSEFSX1JJR0hUX1BBUkVOVEhFU0VTKSB7XG4gICAgICBpZiAoYmxvY2sudHlwZSAhPT0gJ3BhcmVuJykge1xuICAgICAgICBwdXNoKHsgdHlwZTogJ3RleHQnLCB2YWx1ZSB9KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBibG9jayA9IHN0YWNrLnBvcCgpO1xuICAgICAgcHVzaCh7IHR5cGU6ICd0ZXh0JywgdmFsdWUgfSk7XG4gICAgICBibG9jayA9IHN0YWNrW3N0YWNrLmxlbmd0aCAtIDFdO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUXVvdGVzOiAnfFwifGBcbiAgICAgKi9cblxuICAgIGlmICh2YWx1ZSA9PT0gQ0hBUl9ET1VCTEVfUVVPVEUgfHwgdmFsdWUgPT09IENIQVJfU0lOR0xFX1FVT1RFIHx8IHZhbHVlID09PSBDSEFSX0JBQ0tUSUNLKSB7XG4gICAgICBsZXQgb3BlbiA9IHZhbHVlO1xuICAgICAgbGV0IG5leHQ7XG5cbiAgICAgIGlmIChvcHRpb25zLmtlZXBRdW90ZXMgIT09IHRydWUpIHtcbiAgICAgICAgdmFsdWUgPSAnJztcbiAgICAgIH1cblxuICAgICAgd2hpbGUgKGluZGV4IDwgbGVuZ3RoICYmIChuZXh0ID0gYWR2YW5jZSgpKSkge1xuICAgICAgICBpZiAobmV4dCA9PT0gQ0hBUl9CQUNLU0xBU0gpIHtcbiAgICAgICAgICB2YWx1ZSArPSBuZXh0ICsgYWR2YW5jZSgpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG5leHQgPT09IG9wZW4pIHtcbiAgICAgICAgICBpZiAob3B0aW9ucy5rZWVwUXVvdGVzID09PSB0cnVlKSB2YWx1ZSArPSBuZXh0O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFsdWUgKz0gbmV4dDtcbiAgICAgIH1cblxuICAgICAgcHVzaCh7IHR5cGU6ICd0ZXh0JywgdmFsdWUgfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMZWZ0IGN1cmx5IGJyYWNlOiAneydcbiAgICAgKi9cblxuICAgIGlmICh2YWx1ZSA9PT0gQ0hBUl9MRUZUX0NVUkxZX0JSQUNFKSB7XG4gICAgICBkZXB0aCsrO1xuXG4gICAgICBsZXQgZG9sbGFyID0gcHJldi52YWx1ZSAmJiBwcmV2LnZhbHVlLnNsaWNlKC0xKSA9PT0gJyQnIHx8IGJsb2NrLmRvbGxhciA9PT0gdHJ1ZTtcbiAgICAgIGxldCBicmFjZSA9IHtcbiAgICAgICAgdHlwZTogJ2JyYWNlJyxcbiAgICAgICAgb3BlbjogdHJ1ZSxcbiAgICAgICAgY2xvc2U6IGZhbHNlLFxuICAgICAgICBkb2xsYXIsXG4gICAgICAgIGRlcHRoLFxuICAgICAgICBjb21tYXM6IDAsXG4gICAgICAgIHJhbmdlczogMCxcbiAgICAgICAgbm9kZXM6IFtdXG4gICAgICB9O1xuXG4gICAgICBibG9jayA9IHB1c2goYnJhY2UpO1xuICAgICAgc3RhY2sucHVzaChibG9jayk7XG4gICAgICBwdXNoKHsgdHlwZTogJ29wZW4nLCB2YWx1ZSB9KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJpZ2h0IGN1cmx5IGJyYWNlOiAnfSdcbiAgICAgKi9cblxuICAgIGlmICh2YWx1ZSA9PT0gQ0hBUl9SSUdIVF9DVVJMWV9CUkFDRSkge1xuICAgICAgaWYgKGJsb2NrLnR5cGUgIT09ICdicmFjZScpIHtcbiAgICAgICAgcHVzaCh7IHR5cGU6ICd0ZXh0JywgdmFsdWUgfSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBsZXQgdHlwZSA9ICdjbG9zZSc7XG4gICAgICBibG9jayA9IHN0YWNrLnBvcCgpO1xuICAgICAgYmxvY2suY2xvc2UgPSB0cnVlO1xuXG4gICAgICBwdXNoKHsgdHlwZSwgdmFsdWUgfSk7XG4gICAgICBkZXB0aC0tO1xuXG4gICAgICBibG9jayA9IHN0YWNrW3N0YWNrLmxlbmd0aCAtIDFdO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29tbWE6ICcsJ1xuICAgICAqL1xuXG4gICAgaWYgKHZhbHVlID09PSBDSEFSX0NPTU1BICYmIGRlcHRoID4gMCkge1xuICAgICAgaWYgKGJsb2NrLnJhbmdlcyA+IDApIHtcbiAgICAgICAgYmxvY2sucmFuZ2VzID0gMDtcbiAgICAgICAgbGV0IG9wZW4gPSBibG9jay5ub2Rlcy5zaGlmdCgpO1xuICAgICAgICBibG9jay5ub2RlcyA9IFtvcGVuLCB7IHR5cGU6ICd0ZXh0JywgdmFsdWU6IHN0cmluZ2lmeShibG9jaykgfV07XG4gICAgICB9XG5cbiAgICAgIHB1c2goeyB0eXBlOiAnY29tbWEnLCB2YWx1ZSB9KTtcbiAgICAgIGJsb2NrLmNvbW1hcysrO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRG90OiAnLidcbiAgICAgKi9cblxuICAgIGlmICh2YWx1ZSA9PT0gQ0hBUl9ET1QgJiYgZGVwdGggPiAwICYmIGJsb2NrLmNvbW1hcyA9PT0gMCkge1xuICAgICAgbGV0IHNpYmxpbmdzID0gYmxvY2subm9kZXM7XG5cbiAgICAgIGlmIChkZXB0aCA9PT0gMCB8fCBzaWJsaW5ncy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcHVzaCh7IHR5cGU6ICd0ZXh0JywgdmFsdWUgfSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAocHJldi50eXBlID09PSAnZG90Jykge1xuICAgICAgICBibG9jay5yYW5nZSA9IFtdO1xuICAgICAgICBwcmV2LnZhbHVlICs9IHZhbHVlO1xuICAgICAgICBwcmV2LnR5cGUgPSAncmFuZ2UnO1xuXG4gICAgICAgIGlmIChibG9jay5ub2Rlcy5sZW5ndGggIT09IDMgJiYgYmxvY2subm9kZXMubGVuZ3RoICE9PSA1KSB7XG4gICAgICAgICAgYmxvY2suaW52YWxpZCA9IHRydWU7XG4gICAgICAgICAgYmxvY2sucmFuZ2VzID0gMDtcbiAgICAgICAgICBwcmV2LnR5cGUgPSAndGV4dCc7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBibG9jay5yYW5nZXMrKztcbiAgICAgICAgYmxvY2suYXJncyA9IFtdO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHByZXYudHlwZSA9PT0gJ3JhbmdlJykge1xuICAgICAgICBzaWJsaW5ncy5wb3AoKTtcblxuICAgICAgICBsZXQgYmVmb3JlID0gc2libGluZ3Nbc2libGluZ3MubGVuZ3RoIC0gMV07XG4gICAgICAgIGJlZm9yZS52YWx1ZSArPSBwcmV2LnZhbHVlICsgdmFsdWU7XG4gICAgICAgIHByZXYgPSBiZWZvcmU7XG4gICAgICAgIGJsb2NrLnJhbmdlcy0tO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgcHVzaCh7IHR5cGU6ICdkb3QnLCB2YWx1ZSB9KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRleHRcbiAgICAgKi9cblxuICAgIHB1c2goeyB0eXBlOiAndGV4dCcsIHZhbHVlIH0pO1xuICB9XG5cbiAgLy8gTWFyayBpbWJhbGFuY2VkIGJyYWNlcyBhbmQgYnJhY2tldHMgYXMgaW52YWxpZFxuICBkbyB7XG4gICAgYmxvY2sgPSBzdGFjay5wb3AoKTtcblxuICAgIGlmIChibG9jay50eXBlICE9PSAncm9vdCcpIHtcbiAgICAgIGJsb2NrLm5vZGVzLmZvckVhY2gobm9kZSA9PiB7XG4gICAgICAgIGlmICghbm9kZS5ub2Rlcykge1xuICAgICAgICAgIGlmIChub2RlLnR5cGUgPT09ICdvcGVuJykgbm9kZS5pc09wZW4gPSB0cnVlO1xuICAgICAgICAgIGlmIChub2RlLnR5cGUgPT09ICdjbG9zZScpIG5vZGUuaXNDbG9zZSA9IHRydWU7XG4gICAgICAgICAgaWYgKCFub2RlLm5vZGVzKSBub2RlLnR5cGUgPSAndGV4dCc7XG4gICAgICAgICAgbm9kZS5pbnZhbGlkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIGdldCB0aGUgbG9jYXRpb24gb2YgdGhlIGJsb2NrIG9uIHBhcmVudC5ub2RlcyAoYmxvY2sncyBzaWJsaW5ncylcbiAgICAgIGxldCBwYXJlbnQgPSBzdGFja1tzdGFjay5sZW5ndGggLSAxXTtcbiAgICAgIGxldCBpbmRleCA9IHBhcmVudC5ub2Rlcy5pbmRleE9mKGJsb2NrKTtcbiAgICAgIC8vIHJlcGxhY2UgdGhlIChpbnZhbGlkKSBibG9jayB3aXRoIGl0J3Mgbm9kZXNcbiAgICAgIHBhcmVudC5ub2Rlcy5zcGxpY2UoaW5kZXgsIDEsIC4uLmJsb2NrLm5vZGVzKTtcbiAgICB9XG4gIH0gd2hpbGUgKHN0YWNrLmxlbmd0aCA+IDApO1xuXG4gIHB1c2goeyB0eXBlOiAnZW9zJyB9KTtcbiAgcmV0dXJuIGFzdDtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gcGFyc2U7XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBzdHJpbmdpZnkgPSByZXF1aXJlKCcuL2xpYi9zdHJpbmdpZnknKTtcbmNvbnN0IGNvbXBpbGUgPSByZXF1aXJlKCcuL2xpYi9jb21waWxlJyk7XG5jb25zdCBleHBhbmQgPSByZXF1aXJlKCcuL2xpYi9leHBhbmQnKTtcbmNvbnN0IHBhcnNlID0gcmVxdWlyZSgnLi9saWIvcGFyc2UnKTtcblxuLyoqXG4gKiBFeHBhbmQgdGhlIGdpdmVuIHBhdHRlcm4gb3IgY3JlYXRlIGEgcmVnZXgtY29tcGF0aWJsZSBzdHJpbmcuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGJyYWNlcyA9IHJlcXVpcmUoJ2JyYWNlcycpO1xuICogY29uc29sZS5sb2coYnJhY2VzKCd7YSxiLGN9JywgeyBjb21waWxlOiB0cnVlIH0pKTsgLy89PiBbJyhhfGJ8YyknXVxuICogY29uc29sZS5sb2coYnJhY2VzKCd7YSxiLGN9JykpOyAvLz0+IFsnYScsICdiJywgJ2MnXVxuICogYGBgXG4gKiBAcGFyYW0ge1N0cmluZ30gYHN0cmBcbiAqIEBwYXJhbSB7T2JqZWN0fSBgb3B0aW9uc2BcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuY29uc3QgYnJhY2VzID0gKGlucHV0LCBvcHRpb25zID0ge30pID0+IHtcbiAgbGV0IG91dHB1dCA9IFtdO1xuXG4gIGlmIChBcnJheS5pc0FycmF5KGlucHV0KSkge1xuICAgIGZvciAobGV0IHBhdHRlcm4gb2YgaW5wdXQpIHtcbiAgICAgIGxldCByZXN1bHQgPSBicmFjZXMuY3JlYXRlKHBhdHRlcm4sIG9wdGlvbnMpO1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkocmVzdWx0KSkge1xuICAgICAgICBvdXRwdXQucHVzaCguLi5yZXN1bHQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3V0cHV0LnB1c2gocmVzdWx0KTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgb3V0cHV0ID0gW10uY29uY2F0KGJyYWNlcy5jcmVhdGUoaW5wdXQsIG9wdGlvbnMpKTtcbiAgfVxuXG4gIGlmIChvcHRpb25zICYmIG9wdGlvbnMuZXhwYW5kID09PSB0cnVlICYmIG9wdGlvbnMubm9kdXBlcyA9PT0gdHJ1ZSkge1xuICAgIG91dHB1dCA9IFsuLi5uZXcgU2V0KG91dHB1dCldO1xuICB9XG4gIHJldHVybiBvdXRwdXQ7XG59O1xuXG4vKipcbiAqIFBhcnNlIHRoZSBnaXZlbiBgc3RyYCB3aXRoIHRoZSBnaXZlbiBgb3B0aW9uc2AuXG4gKlxuICogYGBganNcbiAqIC8vIGJyYWNlcy5wYXJzZShwYXR0ZXJuLCBbLCBvcHRpb25zXSk7XG4gKiBjb25zdCBhc3QgPSBicmFjZXMucGFyc2UoJ2Eve2IsY30vZCcpO1xuICogY29uc29sZS5sb2coYXN0KTtcbiAqIGBgYFxuICogQHBhcmFtIHtTdHJpbmd9IHBhdHRlcm4gQnJhY2UgcGF0dGVybiB0byBwYXJzZVxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAqIEByZXR1cm4ge09iamVjdH0gUmV0dXJucyBhbiBBU1RcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuYnJhY2VzLnBhcnNlID0gKGlucHV0LCBvcHRpb25zID0ge30pID0+IHBhcnNlKGlucHV0LCBvcHRpb25zKTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgYnJhY2VzIHN0cmluZyBmcm9tIGFuIEFTVCwgb3IgYW4gQVNUIG5vZGUuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGJyYWNlcyA9IHJlcXVpcmUoJ2JyYWNlcycpO1xuICogbGV0IGFzdCA9IGJyYWNlcy5wYXJzZSgnZm9vL3thLGJ9L2JhcicpO1xuICogY29uc29sZS5sb2coc3RyaW5naWZ5KGFzdC5ub2Rlc1syXSkpOyAvLz0+ICd7YSxifSdcbiAqIGBgYFxuICogQHBhcmFtIHtTdHJpbmd9IGBpbnB1dGAgQnJhY2UgcGF0dGVybiBvciBBU1QuXG4gKiBAcGFyYW0ge09iamVjdH0gYG9wdGlvbnNgXG4gKiBAcmV0dXJuIHtBcnJheX0gUmV0dXJucyBhbiBhcnJheSBvZiBleHBhbmRlZCB2YWx1ZXMuXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmJyYWNlcy5zdHJpbmdpZnkgPSAoaW5wdXQsIG9wdGlvbnMgPSB7fSkgPT4ge1xuICBpZiAodHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBzdHJpbmdpZnkoYnJhY2VzLnBhcnNlKGlucHV0LCBvcHRpb25zKSwgb3B0aW9ucyk7XG4gIH1cbiAgcmV0dXJuIHN0cmluZ2lmeShpbnB1dCwgb3B0aW9ucyk7XG59O1xuXG4vKipcbiAqIENvbXBpbGVzIGEgYnJhY2UgcGF0dGVybiBpbnRvIGEgcmVnZXgtY29tcGF0aWJsZSwgb3B0aW1pemVkIHN0cmluZy5cbiAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGUgbWFpbiBbYnJhY2VzXSgjYnJhY2VzKSBmdW5jdGlvbiBieSBkZWZhdWx0LlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBicmFjZXMgPSByZXF1aXJlKCdicmFjZXMnKTtcbiAqIGNvbnNvbGUubG9nKGJyYWNlcy5jb21waWxlKCdhL3tiLGN9L2QnKSk7XG4gKiAvLz0+IFsnYS8oYnxjKS9kJ11cbiAqIGBgYFxuICogQHBhcmFtIHtTdHJpbmd9IGBpbnB1dGAgQnJhY2UgcGF0dGVybiBvciBBU1QuXG4gKiBAcGFyYW0ge09iamVjdH0gYG9wdGlvbnNgXG4gKiBAcmV0dXJuIHtBcnJheX0gUmV0dXJucyBhbiBhcnJheSBvZiBleHBhbmRlZCB2YWx1ZXMuXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmJyYWNlcy5jb21waWxlID0gKGlucHV0LCBvcHRpb25zID0ge30pID0+IHtcbiAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZycpIHtcbiAgICBpbnB1dCA9IGJyYWNlcy5wYXJzZShpbnB1dCwgb3B0aW9ucyk7XG4gIH1cbiAgcmV0dXJuIGNvbXBpbGUoaW5wdXQsIG9wdGlvbnMpO1xufTtcblxuLyoqXG4gKiBFeHBhbmRzIGEgYnJhY2UgcGF0dGVybiBpbnRvIGFuIGFycmF5LiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGhlXG4gKiBtYWluIFticmFjZXNdKCNicmFjZXMpIGZ1bmN0aW9uIHdoZW4gYG9wdGlvbnMuZXhwYW5kYCBpcyB0cnVlLiBCZWZvcmVcbiAqIHVzaW5nIHRoaXMgbWV0aG9kIGl0J3MgcmVjb21tZW5kZWQgdGhhdCB5b3UgcmVhZCB0aGUgW3BlcmZvcm1hbmNlIG5vdGVzXSgjcGVyZm9ybWFuY2UpKVxuICogYW5kIGFkdmFudGFnZXMgb2YgdXNpbmcgWy5jb21waWxlXSgjY29tcGlsZSkgaW5zdGVhZC5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgYnJhY2VzID0gcmVxdWlyZSgnYnJhY2VzJyk7XG4gKiBjb25zb2xlLmxvZyhicmFjZXMuZXhwYW5kKCdhL3tiLGN9L2QnKSk7XG4gKiAvLz0+IFsnYS9iL2QnLCAnYS9jL2QnXTtcbiAqIGBgYFxuICogQHBhcmFtIHtTdHJpbmd9IGBwYXR0ZXJuYCBCcmFjZSBwYXR0ZXJuXG4gKiBAcGFyYW0ge09iamVjdH0gYG9wdGlvbnNgXG4gKiBAcmV0dXJuIHtBcnJheX0gUmV0dXJucyBhbiBhcnJheSBvZiBleHBhbmRlZCB2YWx1ZXMuXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmJyYWNlcy5leHBhbmQgPSAoaW5wdXQsIG9wdGlvbnMgPSB7fSkgPT4ge1xuICBpZiAodHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJykge1xuICAgIGlucHV0ID0gYnJhY2VzLnBhcnNlKGlucHV0LCBvcHRpb25zKTtcbiAgfVxuXG4gIGxldCByZXN1bHQgPSBleHBhbmQoaW5wdXQsIG9wdGlvbnMpO1xuXG4gIC8vIGZpbHRlciBvdXQgZW1wdHkgc3RyaW5ncyBpZiBzcGVjaWZpZWRcbiAgaWYgKG9wdGlvbnMubm9lbXB0eSA9PT0gdHJ1ZSkge1xuICAgIHJlc3VsdCA9IHJlc3VsdC5maWx0ZXIoQm9vbGVhbik7XG4gIH1cblxuICAvLyBmaWx0ZXIgb3V0IGR1cGxpY2F0ZXMgaWYgc3BlY2lmaWVkXG4gIGlmIChvcHRpb25zLm5vZHVwZXMgPT09IHRydWUpIHtcbiAgICByZXN1bHQgPSBbLi4ubmV3IFNldChyZXN1bHQpXTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vKipcbiAqIFByb2Nlc3NlcyBhIGJyYWNlIHBhdHRlcm4gYW5kIHJldHVybnMgZWl0aGVyIGFuIGV4cGFuZGVkIGFycmF5XG4gKiAoaWYgYG9wdGlvbnMuZXhwYW5kYCBpcyB0cnVlKSwgYSBoaWdobHkgb3B0aW1pemVkIHJlZ2V4LWNvbXBhdGlibGUgc3RyaW5nLlxuICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoZSBtYWluIFticmFjZXNdKCNicmFjZXMpIGZ1bmN0aW9uLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBicmFjZXMgPSByZXF1aXJlKCdicmFjZXMnKTtcbiAqIGNvbnNvbGUubG9nKGJyYWNlcy5jcmVhdGUoJ3VzZXItezIwMC4uMzAwfS9wcm9qZWN0LXthLGIsY30tezEuLjEwfScpKVxuICogLy89PiAndXNlci0oMjBbMC05XXwyWzEtOV1bMC05XXwzMDApL3Byb2plY3QtKGF8YnxjKS0oWzEtOV18MTApJ1xuICogYGBgXG4gKiBAcGFyYW0ge1N0cmluZ30gYHBhdHRlcm5gIEJyYWNlIHBhdHRlcm5cbiAqIEBwYXJhbSB7T2JqZWN0fSBgb3B0aW9uc2BcbiAqIEByZXR1cm4ge0FycmF5fSBSZXR1cm5zIGFuIGFycmF5IG9mIGV4cGFuZGVkIHZhbHVlcy5cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuYnJhY2VzLmNyZWF0ZSA9IChpbnB1dCwgb3B0aW9ucyA9IHt9KSA9PiB7XG4gIGlmIChpbnB1dCA9PT0gJycgfHwgaW5wdXQubGVuZ3RoIDwgMykge1xuICAgIHJldHVybiBbaW5wdXRdO1xuICB9XG5cbiByZXR1cm4gb3B0aW9ucy5leHBhbmQgIT09IHRydWVcbiAgICA/IGJyYWNlcy5jb21waWxlKGlucHV0LCBvcHRpb25zKVxuICAgIDogYnJhY2VzLmV4cGFuZChpbnB1dCwgb3B0aW9ucyk7XG59O1xuXG4vKipcbiAqIEV4cG9zZSBcImJyYWNlc1wiXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBicmFjZXM7XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBwYXRoID0gcmVxdWlyZSgncGF0aCcpO1xuY29uc3QgV0lOX1NMQVNIID0gJ1xcXFxcXFxcLyc7XG5jb25zdCBXSU5fTk9fU0xBU0ggPSBgW14ke1dJTl9TTEFTSH1dYDtcblxuLyoqXG4gKiBQb3NpeCBnbG9iIHJlZ2V4XG4gKi9cblxuY29uc3QgRE9UX0xJVEVSQUwgPSAnXFxcXC4nO1xuY29uc3QgUExVU19MSVRFUkFMID0gJ1xcXFwrJztcbmNvbnN0IFFNQVJLX0xJVEVSQUwgPSAnXFxcXD8nO1xuY29uc3QgU0xBU0hfTElURVJBTCA9ICdcXFxcLyc7XG5jb25zdCBPTkVfQ0hBUiA9ICcoPz0uKSc7XG5jb25zdCBRTUFSSyA9ICdbXi9dJztcbmNvbnN0IEVORF9BTkNIT1IgPSBgKD86JHtTTEFTSF9MSVRFUkFMfXwkKWA7XG5jb25zdCBTVEFSVF9BTkNIT1IgPSBgKD86Xnwke1NMQVNIX0xJVEVSQUx9KWA7XG5jb25zdCBET1RTX1NMQVNIID0gYCR7RE9UX0xJVEVSQUx9ezEsMn0ke0VORF9BTkNIT1J9YDtcbmNvbnN0IE5PX0RPVCA9IGAoPyEke0RPVF9MSVRFUkFMfSlgO1xuY29uc3QgTk9fRE9UUyA9IGAoPyEke1NUQVJUX0FOQ0hPUn0ke0RPVFNfU0xBU0h9KWA7XG5jb25zdCBOT19ET1RfU0xBU0ggPSBgKD8hJHtET1RfTElURVJBTH17MCwxfSR7RU5EX0FOQ0hPUn0pYDtcbmNvbnN0IE5PX0RPVFNfU0xBU0ggPSBgKD8hJHtET1RTX1NMQVNIfSlgO1xuY29uc3QgUU1BUktfTk9fRE9UID0gYFteLiR7U0xBU0hfTElURVJBTH1dYDtcbmNvbnN0IFNUQVIgPSBgJHtRTUFSS30qP2A7XG5cbmNvbnN0IFBPU0lYX0NIQVJTID0ge1xuICBET1RfTElURVJBTCxcbiAgUExVU19MSVRFUkFMLFxuICBRTUFSS19MSVRFUkFMLFxuICBTTEFTSF9MSVRFUkFMLFxuICBPTkVfQ0hBUixcbiAgUU1BUkssXG4gIEVORF9BTkNIT1IsXG4gIERPVFNfU0xBU0gsXG4gIE5PX0RPVCxcbiAgTk9fRE9UUyxcbiAgTk9fRE9UX1NMQVNILFxuICBOT19ET1RTX1NMQVNILFxuICBRTUFSS19OT19ET1QsXG4gIFNUQVIsXG4gIFNUQVJUX0FOQ0hPUlxufTtcblxuLyoqXG4gKiBXaW5kb3dzIGdsb2IgcmVnZXhcbiAqL1xuXG5jb25zdCBXSU5ET1dTX0NIQVJTID0ge1xuICAuLi5QT1NJWF9DSEFSUyxcblxuICBTTEFTSF9MSVRFUkFMOiBgWyR7V0lOX1NMQVNIfV1gLFxuICBRTUFSSzogV0lOX05PX1NMQVNILFxuICBTVEFSOiBgJHtXSU5fTk9fU0xBU0h9Kj9gLFxuICBET1RTX1NMQVNIOiBgJHtET1RfTElURVJBTH17MSwyfSg/Olske1dJTl9TTEFTSH1dfCQpYCxcbiAgTk9fRE9UOiBgKD8hJHtET1RfTElURVJBTH0pYCxcbiAgTk9fRE9UUzogYCg/ISg/Ol58WyR7V0lOX1NMQVNIfV0pJHtET1RfTElURVJBTH17MSwyfSg/Olske1dJTl9TTEFTSH1dfCQpKWAsXG4gIE5PX0RPVF9TTEFTSDogYCg/ISR7RE9UX0xJVEVSQUx9ezAsMX0oPzpbJHtXSU5fU0xBU0h9XXwkKSlgLFxuICBOT19ET1RTX1NMQVNIOiBgKD8hJHtET1RfTElURVJBTH17MSwyfSg/Olske1dJTl9TTEFTSH1dfCQpKWAsXG4gIFFNQVJLX05PX0RPVDogYFteLiR7V0lOX1NMQVNIfV1gLFxuICBTVEFSVF9BTkNIT1I6IGAoPzpefFske1dJTl9TTEFTSH1dKWAsXG4gIEVORF9BTkNIT1I6IGAoPzpbJHtXSU5fU0xBU0h9XXwkKWBcbn07XG5cbi8qKlxuICogUE9TSVggQnJhY2tldCBSZWdleFxuICovXG5cbmNvbnN0IFBPU0lYX1JFR0VYX1NPVVJDRSA9IHtcbiAgYWxudW06ICdhLXpBLVowLTknLFxuICBhbHBoYTogJ2EtekEtWicsXG4gIGFzY2lpOiAnXFxcXHgwMC1cXFxceDdGJyxcbiAgYmxhbms6ICcgXFxcXHQnLFxuICBjbnRybDogJ1xcXFx4MDAtXFxcXHgxRlxcXFx4N0YnLFxuICBkaWdpdDogJzAtOScsXG4gIGdyYXBoOiAnXFxcXHgyMS1cXFxceDdFJyxcbiAgbG93ZXI6ICdhLXonLFxuICBwcmludDogJ1xcXFx4MjAtXFxcXHg3RSAnLFxuICBwdW5jdDogJ1xcXFwtIVwiIyQlJlxcJygpXFxcXCorLC4vOjs8PT4/QFtcXFxcXV5fYHt8fX4nLFxuICBzcGFjZTogJyBcXFxcdFxcXFxyXFxcXG5cXFxcdlxcXFxmJyxcbiAgdXBwZXI6ICdBLVonLFxuICB3b3JkOiAnQS1aYS16MC05XycsXG4gIHhkaWdpdDogJ0EtRmEtZjAtOSdcbn07XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBNQVhfTEVOR1RIOiAxMDI0ICogNjQsXG4gIFBPU0lYX1JFR0VYX1NPVVJDRSxcblxuICAvLyByZWd1bGFyIGV4cHJlc3Npb25zXG4gIFJFR0VYX0JBQ0tTTEFTSDogL1xcXFwoPyFbKis/XiR7fSh8KVtcXF1dKS9nLFxuICBSRUdFWF9OT05fU1BFQ0lBTF9DSEFSUzogL15bXkAhW1xcXS4sJCorP157fSgpfFxcXFwvXSsvLFxuICBSRUdFWF9TUEVDSUFMX0NIQVJTOiAvWy0qKz8uXiR7fSh8KVtcXF1dLyxcbiAgUkVHRVhfU1BFQ0lBTF9DSEFSU19CQUNLUkVGOiAvKFxcXFw/KSgoXFxXKShcXDMqKSkvZyxcbiAgUkVHRVhfU1BFQ0lBTF9DSEFSU19HTE9CQUw6IC8oWy0qKz8uXiR7fSh8KVtcXF1dKS9nLFxuICBSRUdFWF9SRU1PVkVfQkFDS1NMQVNIOiAvKD86XFxbLio/W15cXFxcXVxcXXxcXFxcKD89LikpL2csXG5cbiAgLy8gUmVwbGFjZSBnbG9icyB3aXRoIGVxdWl2YWxlbnQgcGF0dGVybnMgdG8gcmVkdWNlIHBhcnNpbmcgdGltZS5cbiAgUkVQTEFDRU1FTlRTOiB7XG4gICAgJyoqKic6ICcqJyxcbiAgICAnKiovKionOiAnKionLFxuICAgICcqKi8qKi8qKic6ICcqKidcbiAgfSxcblxuICAvLyBEaWdpdHNcbiAgQ0hBUl8wOiA0OCwgLyogMCAqL1xuICBDSEFSXzk6IDU3LCAvKiA5ICovXG5cbiAgLy8gQWxwaGFiZXQgY2hhcnMuXG4gIENIQVJfVVBQRVJDQVNFX0E6IDY1LCAvKiBBICovXG4gIENIQVJfTE9XRVJDQVNFX0E6IDk3LCAvKiBhICovXG4gIENIQVJfVVBQRVJDQVNFX1o6IDkwLCAvKiBaICovXG4gIENIQVJfTE9XRVJDQVNFX1o6IDEyMiwgLyogeiAqL1xuXG4gIENIQVJfTEVGVF9QQVJFTlRIRVNFUzogNDAsIC8qICggKi9cbiAgQ0hBUl9SSUdIVF9QQVJFTlRIRVNFUzogNDEsIC8qICkgKi9cblxuICBDSEFSX0FTVEVSSVNLOiA0MiwgLyogKiAqL1xuXG4gIC8vIE5vbi1hbHBoYWJldGljIGNoYXJzLlxuICBDSEFSX0FNUEVSU0FORDogMzgsIC8qICYgKi9cbiAgQ0hBUl9BVDogNjQsIC8qIEAgKi9cbiAgQ0hBUl9CQUNLV0FSRF9TTEFTSDogOTIsIC8qIFxcICovXG4gIENIQVJfQ0FSUklBR0VfUkVUVVJOOiAxMywgLyogXFxyICovXG4gIENIQVJfQ0lSQ1VNRkxFWF9BQ0NFTlQ6IDk0LCAvKiBeICovXG4gIENIQVJfQ09MT046IDU4LCAvKiA6ICovXG4gIENIQVJfQ09NTUE6IDQ0LCAvKiAsICovXG4gIENIQVJfRE9UOiA0NiwgLyogLiAqL1xuICBDSEFSX0RPVUJMRV9RVU9URTogMzQsIC8qIFwiICovXG4gIENIQVJfRVFVQUw6IDYxLCAvKiA9ICovXG4gIENIQVJfRVhDTEFNQVRJT05fTUFSSzogMzMsIC8qICEgKi9cbiAgQ0hBUl9GT1JNX0ZFRUQ6IDEyLCAvKiBcXGYgKi9cbiAgQ0hBUl9GT1JXQVJEX1NMQVNIOiA0NywgLyogLyAqL1xuICBDSEFSX0dSQVZFX0FDQ0VOVDogOTYsIC8qIGAgKi9cbiAgQ0hBUl9IQVNIOiAzNSwgLyogIyAqL1xuICBDSEFSX0hZUEhFTl9NSU5VUzogNDUsIC8qIC0gKi9cbiAgQ0hBUl9MRUZUX0FOR0xFX0JSQUNLRVQ6IDYwLCAvKiA8ICovXG4gIENIQVJfTEVGVF9DVVJMWV9CUkFDRTogMTIzLCAvKiB7ICovXG4gIENIQVJfTEVGVF9TUVVBUkVfQlJBQ0tFVDogOTEsIC8qIFsgKi9cbiAgQ0hBUl9MSU5FX0ZFRUQ6IDEwLCAvKiBcXG4gKi9cbiAgQ0hBUl9OT19CUkVBS19TUEFDRTogMTYwLCAvKiBcXHUwMEEwICovXG4gIENIQVJfUEVSQ0VOVDogMzcsIC8qICUgKi9cbiAgQ0hBUl9QTFVTOiA0MywgLyogKyAqL1xuICBDSEFSX1FVRVNUSU9OX01BUks6IDYzLCAvKiA/ICovXG4gIENIQVJfUklHSFRfQU5HTEVfQlJBQ0tFVDogNjIsIC8qID4gKi9cbiAgQ0hBUl9SSUdIVF9DVVJMWV9CUkFDRTogMTI1LCAvKiB9ICovXG4gIENIQVJfUklHSFRfU1FVQVJFX0JSQUNLRVQ6IDkzLCAvKiBdICovXG4gIENIQVJfU0VNSUNPTE9OOiA1OSwgLyogOyAqL1xuICBDSEFSX1NJTkdMRV9RVU9URTogMzksIC8qICcgKi9cbiAgQ0hBUl9TUEFDRTogMzIsIC8qICAgKi9cbiAgQ0hBUl9UQUI6IDksIC8qIFxcdCAqL1xuICBDSEFSX1VOREVSU0NPUkU6IDk1LCAvKiBfICovXG4gIENIQVJfVkVSVElDQUxfTElORTogMTI0LCAvKiB8ICovXG4gIENIQVJfWkVST19XSURUSF9OT0JSRUFLX1NQQUNFOiA2NTI3OSwgLyogXFx1RkVGRiAqL1xuXG4gIFNFUDogcGF0aC5zZXAsXG5cbiAgLyoqXG4gICAqIENyZWF0ZSBFWFRHTE9CX0NIQVJTXG4gICAqL1xuXG4gIGV4dGdsb2JDaGFycyhjaGFycykge1xuICAgIHJldHVybiB7XG4gICAgICAnISc6IHsgdHlwZTogJ25lZ2F0ZScsIG9wZW46ICcoPzooPyEoPzonLCBjbG9zZTogYCkpJHtjaGFycy5TVEFSfSlgIH0sXG4gICAgICAnPyc6IHsgdHlwZTogJ3FtYXJrJywgb3BlbjogJyg/OicsIGNsb3NlOiAnKT8nIH0sXG4gICAgICAnKyc6IHsgdHlwZTogJ3BsdXMnLCBvcGVuOiAnKD86JywgY2xvc2U6ICcpKycgfSxcbiAgICAgICcqJzogeyB0eXBlOiAnc3RhcicsIG9wZW46ICcoPzonLCBjbG9zZTogJykqJyB9LFxuICAgICAgJ0AnOiB7IHR5cGU6ICdhdCcsIG9wZW46ICcoPzonLCBjbG9zZTogJyknIH1cbiAgICB9O1xuICB9LFxuXG4gIC8qKlxuICAgKiBDcmVhdGUgR0xPQl9DSEFSU1xuICAgKi9cblxuICBnbG9iQ2hhcnMod2luMzIpIHtcbiAgICByZXR1cm4gd2luMzIgPT09IHRydWUgPyBXSU5ET1dTX0NIQVJTIDogUE9TSVhfQ0hBUlM7XG4gIH1cbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBwYXRoID0gcmVxdWlyZSgncGF0aCcpO1xuY29uc3Qgd2luMzIgPSBwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInO1xuY29uc3Qge1xuICBSRUdFWF9CQUNLU0xBU0gsXG4gIFJFR0VYX1JFTU9WRV9CQUNLU0xBU0gsXG4gIFJFR0VYX1NQRUNJQUxfQ0hBUlMsXG4gIFJFR0VYX1NQRUNJQUxfQ0hBUlNfR0xPQkFMXG59ID0gcmVxdWlyZSgnLi9jb25zdGFudHMnKTtcblxuZXhwb3J0cy5pc09iamVjdCA9IHZhbCA9PiB2YWwgIT09IG51bGwgJiYgdHlwZW9mIHZhbCA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkodmFsKTtcbmV4cG9ydHMuaGFzUmVnZXhDaGFycyA9IHN0ciA9PiBSRUdFWF9TUEVDSUFMX0NIQVJTLnRlc3Qoc3RyKTtcbmV4cG9ydHMuaXNSZWdleENoYXIgPSBzdHIgPT4gc3RyLmxlbmd0aCA9PT0gMSAmJiBleHBvcnRzLmhhc1JlZ2V4Q2hhcnMoc3RyKTtcbmV4cG9ydHMuZXNjYXBlUmVnZXggPSBzdHIgPT4gc3RyLnJlcGxhY2UoUkVHRVhfU1BFQ0lBTF9DSEFSU19HTE9CQUwsICdcXFxcJDEnKTtcbmV4cG9ydHMudG9Qb3NpeFNsYXNoZXMgPSBzdHIgPT4gc3RyLnJlcGxhY2UoUkVHRVhfQkFDS1NMQVNILCAnLycpO1xuXG5leHBvcnRzLnJlbW92ZUJhY2tzbGFzaGVzID0gc3RyID0+IHtcbiAgcmV0dXJuIHN0ci5yZXBsYWNlKFJFR0VYX1JFTU9WRV9CQUNLU0xBU0gsIG1hdGNoID0+IHtcbiAgICByZXR1cm4gbWF0Y2ggPT09ICdcXFxcJyA/ICcnIDogbWF0Y2g7XG4gIH0pO1xufTtcblxuZXhwb3J0cy5zdXBwb3J0c0xvb2tiZWhpbmRzID0gKCkgPT4ge1xuICBjb25zdCBzZWdzID0gcHJvY2Vzcy52ZXJzaW9uLnNsaWNlKDEpLnNwbGl0KCcuJykubWFwKE51bWJlcik7XG4gIGlmIChzZWdzLmxlbmd0aCA9PT0gMyAmJiBzZWdzWzBdID49IDkgfHwgKHNlZ3NbMF0gPT09IDggJiYgc2Vnc1sxXSA+PSAxMCkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59O1xuXG5leHBvcnRzLmlzV2luZG93cyA9IG9wdGlvbnMgPT4ge1xuICBpZiAob3B0aW9ucyAmJiB0eXBlb2Ygb3B0aW9ucy53aW5kb3dzID09PSAnYm9vbGVhbicpIHtcbiAgICByZXR1cm4gb3B0aW9ucy53aW5kb3dzO1xuICB9XG4gIHJldHVybiB3aW4zMiA9PT0gdHJ1ZSB8fCBwYXRoLnNlcCA9PT0gJ1xcXFwnO1xufTtcblxuZXhwb3J0cy5lc2NhcGVMYXN0ID0gKGlucHV0LCBjaGFyLCBsYXN0SWR4KSA9PiB7XG4gIGNvbnN0IGlkeCA9IGlucHV0Lmxhc3RJbmRleE9mKGNoYXIsIGxhc3RJZHgpO1xuICBpZiAoaWR4ID09PSAtMSkgcmV0dXJuIGlucHV0O1xuICBpZiAoaW5wdXRbaWR4IC0gMV0gPT09ICdcXFxcJykgcmV0dXJuIGV4cG9ydHMuZXNjYXBlTGFzdChpbnB1dCwgY2hhciwgaWR4IC0gMSk7XG4gIHJldHVybiBgJHtpbnB1dC5zbGljZSgwLCBpZHgpfVxcXFwke2lucHV0LnNsaWNlKGlkeCl9YDtcbn07XG5cbmV4cG9ydHMucmVtb3ZlUHJlZml4ID0gKGlucHV0LCBzdGF0ZSA9IHt9KSA9PiB7XG4gIGxldCBvdXRwdXQgPSBpbnB1dDtcbiAgaWYgKG91dHB1dC5zdGFydHNXaXRoKCcuLycpKSB7XG4gICAgb3V0cHV0ID0gb3V0cHV0LnNsaWNlKDIpO1xuICAgIHN0YXRlLnByZWZpeCA9ICcuLyc7XG4gIH1cbiAgcmV0dXJuIG91dHB1dDtcbn07XG5cbmV4cG9ydHMud3JhcE91dHB1dCA9IChpbnB1dCwgc3RhdGUgPSB7fSwgb3B0aW9ucyA9IHt9KSA9PiB7XG4gIGNvbnN0IHByZXBlbmQgPSBvcHRpb25zLmNvbnRhaW5zID8gJycgOiAnXic7XG4gIGNvbnN0IGFwcGVuZCA9IG9wdGlvbnMuY29udGFpbnMgPyAnJyA6ICckJztcblxuICBsZXQgb3V0cHV0ID0gYCR7cHJlcGVuZH0oPzoke2lucHV0fSkke2FwcGVuZH1gO1xuICBpZiAoc3RhdGUubmVnYXRlZCA9PT0gdHJ1ZSkge1xuICAgIG91dHB1dCA9IGAoPzpeKD8hJHtvdXRwdXR9KS4qJClgO1xuICB9XG4gIHJldHVybiBvdXRwdXQ7XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcblxuY29uc3QgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG5jb25zdCB7XG4gIENIQVJfQVNURVJJU0ssICAgICAgICAgICAgIC8qICogKi9cbiAgQ0hBUl9BVCwgICAgICAgICAgICAgICAgICAgLyogQCAqL1xuICBDSEFSX0JBQ0tXQVJEX1NMQVNILCAgICAgICAvKiBcXCAqL1xuICBDSEFSX0NPTU1BLCAgICAgICAgICAgICAgICAvKiAsICovXG4gIENIQVJfRE9ULCAgICAgICAgICAgICAgICAgIC8qIC4gKi9cbiAgQ0hBUl9FWENMQU1BVElPTl9NQVJLLCAgICAgLyogISAqL1xuICBDSEFSX0ZPUldBUkRfU0xBU0gsICAgICAgICAvKiAvICovXG4gIENIQVJfTEVGVF9DVVJMWV9CUkFDRSwgICAgIC8qIHsgKi9cbiAgQ0hBUl9MRUZUX1BBUkVOVEhFU0VTLCAgICAgLyogKCAqL1xuICBDSEFSX0xFRlRfU1FVQVJFX0JSQUNLRVQsICAvKiBbICovXG4gIENIQVJfUExVUywgICAgICAgICAgICAgICAgIC8qICsgKi9cbiAgQ0hBUl9RVUVTVElPTl9NQVJLLCAgICAgICAgLyogPyAqL1xuICBDSEFSX1JJR0hUX0NVUkxZX0JSQUNFLCAgICAvKiB9ICovXG4gIENIQVJfUklHSFRfUEFSRU5USEVTRVMsICAgIC8qICkgKi9cbiAgQ0hBUl9SSUdIVF9TUVVBUkVfQlJBQ0tFVCAgLyogXSAqL1xufSA9IHJlcXVpcmUoJy4vY29uc3RhbnRzJyk7XG5cbmNvbnN0IGlzUGF0aFNlcGFyYXRvciA9IGNvZGUgPT4ge1xuICByZXR1cm4gY29kZSA9PT0gQ0hBUl9GT1JXQVJEX1NMQVNIIHx8IGNvZGUgPT09IENIQVJfQkFDS1dBUkRfU0xBU0g7XG59O1xuXG5jb25zdCBkZXB0aCA9IHRva2VuID0+IHtcbiAgaWYgKHRva2VuLmlzUHJlZml4ICE9PSB0cnVlKSB7XG4gICAgdG9rZW4uZGVwdGggPSB0b2tlbi5pc0dsb2JzdGFyID8gSW5maW5pdHkgOiAxO1xuICB9XG59O1xuXG4vKipcbiAqIFF1aWNrbHkgc2NhbnMgYSBnbG9iIHBhdHRlcm4gYW5kIHJldHVybnMgYW4gb2JqZWN0IHdpdGggYSBoYW5kZnVsIG9mXG4gKiB1c2VmdWwgcHJvcGVydGllcywgbGlrZSBgaXNHbG9iYCwgYHBhdGhgICh0aGUgbGVhZGluZyBub24tZ2xvYiwgaWYgaXQgZXhpc3RzKSxcbiAqIGBnbG9iYCAodGhlIGFjdHVhbCBwYXR0ZXJuKSwgYG5lZ2F0ZWRgICh0cnVlIGlmIHRoZSBwYXRoIHN0YXJ0cyB3aXRoIGAhYCBidXQgbm90XG4gKiB3aXRoIGAhKGApIGFuZCBgbmVnYXRlZEV4dGdsb2JgICh0cnVlIGlmIHRoZSBwYXRoIHN0YXJ0cyB3aXRoIGAhKGApLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBwbSA9IHJlcXVpcmUoJ3BpY29tYXRjaCcpO1xuICogY29uc29sZS5sb2cocG0uc2NhbignZm9vL2Jhci8qLmpzJykpO1xuICogeyBpc0dsb2I6IHRydWUsIGlucHV0OiAnZm9vL2Jhci8qLmpzJywgYmFzZTogJ2Zvby9iYXInLCBnbG9iOiAnKi5qcycgfVxuICogYGBgXG4gKiBAcGFyYW0ge1N0cmluZ30gYHN0cmBcbiAqIEBwYXJhbSB7T2JqZWN0fSBgb3B0aW9uc2BcbiAqIEByZXR1cm4ge09iamVjdH0gUmV0dXJucyBhbiBvYmplY3Qgd2l0aCB0b2tlbnMgYW5kIHJlZ2V4IHNvdXJjZSBzdHJpbmcuXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmNvbnN0IHNjYW4gPSAoaW5wdXQsIG9wdGlvbnMpID0+IHtcbiAgY29uc3Qgb3B0cyA9IG9wdGlvbnMgfHwge307XG5cbiAgY29uc3QgbGVuZ3RoID0gaW5wdXQubGVuZ3RoIC0gMTtcbiAgY29uc3Qgc2NhblRvRW5kID0gb3B0cy5wYXJ0cyA9PT0gdHJ1ZSB8fCBvcHRzLnNjYW5Ub0VuZCA9PT0gdHJ1ZTtcbiAgY29uc3Qgc2xhc2hlcyA9IFtdO1xuICBjb25zdCB0b2tlbnMgPSBbXTtcbiAgY29uc3QgcGFydHMgPSBbXTtcblxuICBsZXQgc3RyID0gaW5wdXQ7XG4gIGxldCBpbmRleCA9IC0xO1xuICBsZXQgc3RhcnQgPSAwO1xuICBsZXQgbGFzdEluZGV4ID0gMDtcbiAgbGV0IGlzQnJhY2UgPSBmYWxzZTtcbiAgbGV0IGlzQnJhY2tldCA9IGZhbHNlO1xuICBsZXQgaXNHbG9iID0gZmFsc2U7XG4gIGxldCBpc0V4dGdsb2IgPSBmYWxzZTtcbiAgbGV0IGlzR2xvYnN0YXIgPSBmYWxzZTtcbiAgbGV0IGJyYWNlRXNjYXBlZCA9IGZhbHNlO1xuICBsZXQgYmFja3NsYXNoZXMgPSBmYWxzZTtcbiAgbGV0IG5lZ2F0ZWQgPSBmYWxzZTtcbiAgbGV0IG5lZ2F0ZWRFeHRnbG9iID0gZmFsc2U7XG4gIGxldCBmaW5pc2hlZCA9IGZhbHNlO1xuICBsZXQgYnJhY2VzID0gMDtcbiAgbGV0IHByZXY7XG4gIGxldCBjb2RlO1xuICBsZXQgdG9rZW4gPSB7IHZhbHVlOiAnJywgZGVwdGg6IDAsIGlzR2xvYjogZmFsc2UgfTtcblxuICBjb25zdCBlb3MgPSAoKSA9PiBpbmRleCA+PSBsZW5ndGg7XG4gIGNvbnN0IHBlZWsgPSAoKSA9PiBzdHIuY2hhckNvZGVBdChpbmRleCArIDEpO1xuICBjb25zdCBhZHZhbmNlID0gKCkgPT4ge1xuICAgIHByZXYgPSBjb2RlO1xuICAgIHJldHVybiBzdHIuY2hhckNvZGVBdCgrK2luZGV4KTtcbiAgfTtcblxuICB3aGlsZSAoaW5kZXggPCBsZW5ndGgpIHtcbiAgICBjb2RlID0gYWR2YW5jZSgpO1xuICAgIGxldCBuZXh0O1xuXG4gICAgaWYgKGNvZGUgPT09IENIQVJfQkFDS1dBUkRfU0xBU0gpIHtcbiAgICAgIGJhY2tzbGFzaGVzID0gdG9rZW4uYmFja3NsYXNoZXMgPSB0cnVlO1xuICAgICAgY29kZSA9IGFkdmFuY2UoKTtcblxuICAgICAgaWYgKGNvZGUgPT09IENIQVJfTEVGVF9DVVJMWV9CUkFDRSkge1xuICAgICAgICBicmFjZUVzY2FwZWQgPSB0cnVlO1xuICAgICAgfVxuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKGJyYWNlRXNjYXBlZCA9PT0gdHJ1ZSB8fCBjb2RlID09PSBDSEFSX0xFRlRfQ1VSTFlfQlJBQ0UpIHtcbiAgICAgIGJyYWNlcysrO1xuXG4gICAgICB3aGlsZSAoZW9zKCkgIT09IHRydWUgJiYgKGNvZGUgPSBhZHZhbmNlKCkpKSB7XG4gICAgICAgIGlmIChjb2RlID09PSBDSEFSX0JBQ0tXQVJEX1NMQVNIKSB7XG4gICAgICAgICAgYmFja3NsYXNoZXMgPSB0b2tlbi5iYWNrc2xhc2hlcyA9IHRydWU7XG4gICAgICAgICAgYWR2YW5jZSgpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvZGUgPT09IENIQVJfTEVGVF9DVVJMWV9CUkFDRSkge1xuICAgICAgICAgIGJyYWNlcysrO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGJyYWNlRXNjYXBlZCAhPT0gdHJ1ZSAmJiBjb2RlID09PSBDSEFSX0RPVCAmJiAoY29kZSA9IGFkdmFuY2UoKSkgPT09IENIQVJfRE9UKSB7XG4gICAgICAgICAgaXNCcmFjZSA9IHRva2VuLmlzQnJhY2UgPSB0cnVlO1xuICAgICAgICAgIGlzR2xvYiA9IHRva2VuLmlzR2xvYiA9IHRydWU7XG4gICAgICAgICAgZmluaXNoZWQgPSB0cnVlO1xuXG4gICAgICAgICAgaWYgKHNjYW5Ub0VuZCA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYnJhY2VFc2NhcGVkICE9PSB0cnVlICYmIGNvZGUgPT09IENIQVJfQ09NTUEpIHtcbiAgICAgICAgICBpc0JyYWNlID0gdG9rZW4uaXNCcmFjZSA9IHRydWU7XG4gICAgICAgICAgaXNHbG9iID0gdG9rZW4uaXNHbG9iID0gdHJ1ZTtcbiAgICAgICAgICBmaW5pc2hlZCA9IHRydWU7XG5cbiAgICAgICAgICBpZiAoc2NhblRvRW5kID09PSB0cnVlKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb2RlID09PSBDSEFSX1JJR0hUX0NVUkxZX0JSQUNFKSB7XG4gICAgICAgICAgYnJhY2VzLS07XG5cbiAgICAgICAgICBpZiAoYnJhY2VzID09PSAwKSB7XG4gICAgICAgICAgICBicmFjZUVzY2FwZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIGlzQnJhY2UgPSB0b2tlbi5pc0JyYWNlID0gdHJ1ZTtcbiAgICAgICAgICAgIGZpbmlzaGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoc2NhblRvRW5kID09PSB0cnVlKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBpZiAoY29kZSA9PT0gQ0hBUl9GT1JXQVJEX1NMQVNIKSB7XG4gICAgICBzbGFzaGVzLnB1c2goaW5kZXgpO1xuICAgICAgdG9rZW5zLnB1c2godG9rZW4pO1xuICAgICAgdG9rZW4gPSB7IHZhbHVlOiAnJywgZGVwdGg6IDAsIGlzR2xvYjogZmFsc2UgfTtcblxuICAgICAgaWYgKGZpbmlzaGVkID09PSB0cnVlKSBjb250aW51ZTtcbiAgICAgIGlmIChwcmV2ID09PSBDSEFSX0RPVCAmJiBpbmRleCA9PT0gKHN0YXJ0ICsgMSkpIHtcbiAgICAgICAgc3RhcnQgKz0gMjtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGxhc3RJbmRleCA9IGluZGV4ICsgMTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChvcHRzLm5vZXh0ICE9PSB0cnVlKSB7XG4gICAgICBjb25zdCBpc0V4dGdsb2JDaGFyID0gY29kZSA9PT0gQ0hBUl9QTFVTXG4gICAgICAgIHx8IGNvZGUgPT09IENIQVJfQVRcbiAgICAgICAgfHwgY29kZSA9PT0gQ0hBUl9BU1RFUklTS1xuICAgICAgICB8fCBjb2RlID09PSBDSEFSX1FVRVNUSU9OX01BUktcbiAgICAgICAgfHwgY29kZSA9PT0gQ0hBUl9FWENMQU1BVElPTl9NQVJLO1xuXG4gICAgICBpZiAoaXNFeHRnbG9iQ2hhciA9PT0gdHJ1ZSAmJiBwZWVrKCkgPT09IENIQVJfTEVGVF9QQVJFTlRIRVNFUykge1xuICAgICAgICBpc0dsb2IgPSB0b2tlbi5pc0dsb2IgPSB0cnVlO1xuICAgICAgICBpc0V4dGdsb2IgPSB0b2tlbi5pc0V4dGdsb2IgPSB0cnVlO1xuICAgICAgICBmaW5pc2hlZCA9IHRydWU7XG4gICAgICAgIGlmIChjb2RlID09PSBDSEFSX0VYQ0xBTUFUSU9OX01BUksgJiYgaW5kZXggPT09IHN0YXJ0KSB7XG4gICAgICAgICAgbmVnYXRlZEV4dGdsb2IgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNjYW5Ub0VuZCA9PT0gdHJ1ZSkge1xuICAgICAgICAgIHdoaWxlIChlb3MoKSAhPT0gdHJ1ZSAmJiAoY29kZSA9IGFkdmFuY2UoKSkpIHtcbiAgICAgICAgICAgIGlmIChjb2RlID09PSBDSEFSX0JBQ0tXQVJEX1NMQVNIKSB7XG4gICAgICAgICAgICAgIGJhY2tzbGFzaGVzID0gdG9rZW4uYmFja3NsYXNoZXMgPSB0cnVlO1xuICAgICAgICAgICAgICBjb2RlID0gYWR2YW5jZSgpO1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGNvZGUgPT09IENIQVJfUklHSFRfUEFSRU5USEVTRVMpIHtcbiAgICAgICAgICAgICAgaXNHbG9iID0gdG9rZW4uaXNHbG9iID0gdHJ1ZTtcbiAgICAgICAgICAgICAgZmluaXNoZWQgPSB0cnVlO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNvZGUgPT09IENIQVJfQVNURVJJU0spIHtcbiAgICAgIGlmIChwcmV2ID09PSBDSEFSX0FTVEVSSVNLKSBpc0dsb2JzdGFyID0gdG9rZW4uaXNHbG9ic3RhciA9IHRydWU7XG4gICAgICBpc0dsb2IgPSB0b2tlbi5pc0dsb2IgPSB0cnVlO1xuICAgICAgZmluaXNoZWQgPSB0cnVlO1xuXG4gICAgICBpZiAoc2NhblRvRW5kID09PSB0cnVlKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgaWYgKGNvZGUgPT09IENIQVJfUVVFU1RJT05fTUFSSykge1xuICAgICAgaXNHbG9iID0gdG9rZW4uaXNHbG9iID0gdHJ1ZTtcbiAgICAgIGZpbmlzaGVkID0gdHJ1ZTtcblxuICAgICAgaWYgKHNjYW5Ub0VuZCA9PT0gdHJ1ZSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGlmIChjb2RlID09PSBDSEFSX0xFRlRfU1FVQVJFX0JSQUNLRVQpIHtcbiAgICAgIHdoaWxlIChlb3MoKSAhPT0gdHJ1ZSAmJiAobmV4dCA9IGFkdmFuY2UoKSkpIHtcbiAgICAgICAgaWYgKG5leHQgPT09IENIQVJfQkFDS1dBUkRfU0xBU0gpIHtcbiAgICAgICAgICBiYWNrc2xhc2hlcyA9IHRva2VuLmJhY2tzbGFzaGVzID0gdHJ1ZTtcbiAgICAgICAgICBhZHZhbmNlKCk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobmV4dCA9PT0gQ0hBUl9SSUdIVF9TUVVBUkVfQlJBQ0tFVCkge1xuICAgICAgICAgIGlzQnJhY2tldCA9IHRva2VuLmlzQnJhY2tldCA9IHRydWU7XG4gICAgICAgICAgaXNHbG9iID0gdG9rZW4uaXNHbG9iID0gdHJ1ZTtcbiAgICAgICAgICBmaW5pc2hlZCA9IHRydWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHNjYW5Ub0VuZCA9PT0gdHJ1ZSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgaWYgKG9wdHMubm9uZWdhdGUgIT09IHRydWUgJiYgY29kZSA9PT0gQ0hBUl9FWENMQU1BVElPTl9NQVJLICYmIGluZGV4ID09PSBzdGFydCkge1xuICAgICAgbmVnYXRlZCA9IHRva2VuLm5lZ2F0ZWQgPSB0cnVlO1xuICAgICAgc3RhcnQrKztcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChvcHRzLm5vcGFyZW4gIT09IHRydWUgJiYgY29kZSA9PT0gQ0hBUl9MRUZUX1BBUkVOVEhFU0VTKSB7XG4gICAgICBpc0dsb2IgPSB0b2tlbi5pc0dsb2IgPSB0cnVlO1xuXG4gICAgICBpZiAoc2NhblRvRW5kID09PSB0cnVlKSB7XG4gICAgICAgIHdoaWxlIChlb3MoKSAhPT0gdHJ1ZSAmJiAoY29kZSA9IGFkdmFuY2UoKSkpIHtcbiAgICAgICAgICBpZiAoY29kZSA9PT0gQ0hBUl9MRUZUX1BBUkVOVEhFU0VTKSB7XG4gICAgICAgICAgICBiYWNrc2xhc2hlcyA9IHRva2VuLmJhY2tzbGFzaGVzID0gdHJ1ZTtcbiAgICAgICAgICAgIGNvZGUgPSBhZHZhbmNlKCk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoY29kZSA9PT0gQ0hBUl9SSUdIVF9QQVJFTlRIRVNFUykge1xuICAgICAgICAgICAgZmluaXNoZWQgPSB0cnVlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgaWYgKGlzR2xvYiA9PT0gdHJ1ZSkge1xuICAgICAgZmluaXNoZWQgPSB0cnVlO1xuXG4gICAgICBpZiAoc2NhblRvRW5kID09PSB0cnVlKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBpZiAob3B0cy5ub2V4dCA9PT0gdHJ1ZSkge1xuICAgIGlzRXh0Z2xvYiA9IGZhbHNlO1xuICAgIGlzR2xvYiA9IGZhbHNlO1xuICB9XG5cbiAgbGV0IGJhc2UgPSBzdHI7XG4gIGxldCBwcmVmaXggPSAnJztcbiAgbGV0IGdsb2IgPSAnJztcblxuICBpZiAoc3RhcnQgPiAwKSB7XG4gICAgcHJlZml4ID0gc3RyLnNsaWNlKDAsIHN0YXJ0KTtcbiAgICBzdHIgPSBzdHIuc2xpY2Uoc3RhcnQpO1xuICAgIGxhc3RJbmRleCAtPSBzdGFydDtcbiAgfVxuXG4gIGlmIChiYXNlICYmIGlzR2xvYiA9PT0gdHJ1ZSAmJiBsYXN0SW5kZXggPiAwKSB7XG4gICAgYmFzZSA9IHN0ci5zbGljZSgwLCBsYXN0SW5kZXgpO1xuICAgIGdsb2IgPSBzdHIuc2xpY2UobGFzdEluZGV4KTtcbiAgfSBlbHNlIGlmIChpc0dsb2IgPT09IHRydWUpIHtcbiAgICBiYXNlID0gJyc7XG4gICAgZ2xvYiA9IHN0cjtcbiAgfSBlbHNlIHtcbiAgICBiYXNlID0gc3RyO1xuICB9XG5cbiAgaWYgKGJhc2UgJiYgYmFzZSAhPT0gJycgJiYgYmFzZSAhPT0gJy8nICYmIGJhc2UgIT09IHN0cikge1xuICAgIGlmIChpc1BhdGhTZXBhcmF0b3IoYmFzZS5jaGFyQ29kZUF0KGJhc2UubGVuZ3RoIC0gMSkpKSB7XG4gICAgICBiYXNlID0gYmFzZS5zbGljZSgwLCAtMSk7XG4gICAgfVxuICB9XG5cbiAgaWYgKG9wdHMudW5lc2NhcGUgPT09IHRydWUpIHtcbiAgICBpZiAoZ2xvYikgZ2xvYiA9IHV0aWxzLnJlbW92ZUJhY2tzbGFzaGVzKGdsb2IpO1xuXG4gICAgaWYgKGJhc2UgJiYgYmFja3NsYXNoZXMgPT09IHRydWUpIHtcbiAgICAgIGJhc2UgPSB1dGlscy5yZW1vdmVCYWNrc2xhc2hlcyhiYXNlKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBzdGF0ZSA9IHtcbiAgICBwcmVmaXgsXG4gICAgaW5wdXQsXG4gICAgc3RhcnQsXG4gICAgYmFzZSxcbiAgICBnbG9iLFxuICAgIGlzQnJhY2UsXG4gICAgaXNCcmFja2V0LFxuICAgIGlzR2xvYixcbiAgICBpc0V4dGdsb2IsXG4gICAgaXNHbG9ic3RhcixcbiAgICBuZWdhdGVkLFxuICAgIG5lZ2F0ZWRFeHRnbG9iXG4gIH07XG5cbiAgaWYgKG9wdHMudG9rZW5zID09PSB0cnVlKSB7XG4gICAgc3RhdGUubWF4RGVwdGggPSAwO1xuICAgIGlmICghaXNQYXRoU2VwYXJhdG9yKGNvZGUpKSB7XG4gICAgICB0b2tlbnMucHVzaCh0b2tlbik7XG4gICAgfVxuICAgIHN0YXRlLnRva2VucyA9IHRva2VucztcbiAgfVxuXG4gIGlmIChvcHRzLnBhcnRzID09PSB0cnVlIHx8IG9wdHMudG9rZW5zID09PSB0cnVlKSB7XG4gICAgbGV0IHByZXZJbmRleDtcblxuICAgIGZvciAobGV0IGlkeCA9IDA7IGlkeCA8IHNsYXNoZXMubGVuZ3RoOyBpZHgrKykge1xuICAgICAgY29uc3QgbiA9IHByZXZJbmRleCA/IHByZXZJbmRleCArIDEgOiBzdGFydDtcbiAgICAgIGNvbnN0IGkgPSBzbGFzaGVzW2lkeF07XG4gICAgICBjb25zdCB2YWx1ZSA9IGlucHV0LnNsaWNlKG4sIGkpO1xuICAgICAgaWYgKG9wdHMudG9rZW5zKSB7XG4gICAgICAgIGlmIChpZHggPT09IDAgJiYgc3RhcnQgIT09IDApIHtcbiAgICAgICAgICB0b2tlbnNbaWR4XS5pc1ByZWZpeCA9IHRydWU7XG4gICAgICAgICAgdG9rZW5zW2lkeF0udmFsdWUgPSBwcmVmaXg7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdG9rZW5zW2lkeF0udmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBkZXB0aCh0b2tlbnNbaWR4XSk7XG4gICAgICAgIHN0YXRlLm1heERlcHRoICs9IHRva2Vuc1tpZHhdLmRlcHRoO1xuICAgICAgfVxuICAgICAgaWYgKGlkeCAhPT0gMCB8fCB2YWx1ZSAhPT0gJycpIHtcbiAgICAgICAgcGFydHMucHVzaCh2YWx1ZSk7XG4gICAgICB9XG4gICAgICBwcmV2SW5kZXggPSBpO1xuICAgIH1cblxuICAgIGlmIChwcmV2SW5kZXggJiYgcHJldkluZGV4ICsgMSA8IGlucHV0Lmxlbmd0aCkge1xuICAgICAgY29uc3QgdmFsdWUgPSBpbnB1dC5zbGljZShwcmV2SW5kZXggKyAxKTtcbiAgICAgIHBhcnRzLnB1c2godmFsdWUpO1xuXG4gICAgICBpZiAob3B0cy50b2tlbnMpIHtcbiAgICAgICAgdG9rZW5zW3Rva2Vucy5sZW5ndGggLSAxXS52YWx1ZSA9IHZhbHVlO1xuICAgICAgICBkZXB0aCh0b2tlbnNbdG9rZW5zLmxlbmd0aCAtIDFdKTtcbiAgICAgICAgc3RhdGUubWF4RGVwdGggKz0gdG9rZW5zW3Rva2Vucy5sZW5ndGggLSAxXS5kZXB0aDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0ZS5zbGFzaGVzID0gc2xhc2hlcztcbiAgICBzdGF0ZS5wYXJ0cyA9IHBhcnRzO1xuICB9XG5cbiAgcmV0dXJuIHN0YXRlO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBzY2FuO1xuIiwgIid1c2Ugc3RyaWN0JztcblxuY29uc3QgY29uc3RhbnRzID0gcmVxdWlyZSgnLi9jb25zdGFudHMnKTtcbmNvbnN0IHV0aWxzID0gcmVxdWlyZSgnLi91dGlscycpO1xuXG4vKipcbiAqIENvbnN0YW50c1xuICovXG5cbmNvbnN0IHtcbiAgTUFYX0xFTkdUSCxcbiAgUE9TSVhfUkVHRVhfU09VUkNFLFxuICBSRUdFWF9OT05fU1BFQ0lBTF9DSEFSUyxcbiAgUkVHRVhfU1BFQ0lBTF9DSEFSU19CQUNLUkVGLFxuICBSRVBMQUNFTUVOVFNcbn0gPSBjb25zdGFudHM7XG5cbi8qKlxuICogSGVscGVyc1xuICovXG5cbmNvbnN0IGV4cGFuZFJhbmdlID0gKGFyZ3MsIG9wdGlvbnMpID0+IHtcbiAgaWYgKHR5cGVvZiBvcHRpb25zLmV4cGFuZFJhbmdlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIG9wdGlvbnMuZXhwYW5kUmFuZ2UoLi4uYXJncywgb3B0aW9ucyk7XG4gIH1cblxuICBhcmdzLnNvcnQoKTtcbiAgY29uc3QgdmFsdWUgPSBgWyR7YXJncy5qb2luKCctJyl9XWA7XG5cbiAgdHJ5IHtcbiAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmV3ICovXG4gICAgbmV3IFJlZ0V4cCh2YWx1ZSk7XG4gIH0gY2F0Y2ggKGV4KSB7XG4gICAgcmV0dXJuIGFyZ3MubWFwKHYgPT4gdXRpbHMuZXNjYXBlUmVnZXgodikpLmpvaW4oJy4uJyk7XG4gIH1cblxuICByZXR1cm4gdmFsdWU7XG59O1xuXG4vKipcbiAqIENyZWF0ZSB0aGUgbWVzc2FnZSBmb3IgYSBzeW50YXggZXJyb3JcbiAqL1xuXG5jb25zdCBzeW50YXhFcnJvciA9ICh0eXBlLCBjaGFyKSA9PiB7XG4gIHJldHVybiBgTWlzc2luZyAke3R5cGV9OiBcIiR7Y2hhcn1cIiAtIHVzZSBcIlxcXFxcXFxcJHtjaGFyfVwiIHRvIG1hdGNoIGxpdGVyYWwgY2hhcmFjdGVyc2A7XG59O1xuXG4vKipcbiAqIFBhcnNlIHRoZSBnaXZlbiBpbnB1dCBzdHJpbmcuXG4gKiBAcGFyYW0ge1N0cmluZ30gaW5wdXRcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKi9cblxuY29uc3QgcGFyc2UgPSAoaW5wdXQsIG9wdGlvbnMpID0+IHtcbiAgaWYgKHR5cGVvZiBpbnB1dCAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBhIHN0cmluZycpO1xuICB9XG5cbiAgaW5wdXQgPSBSRVBMQUNFTUVOVFNbaW5wdXRdIHx8IGlucHV0O1xuXG4gIGNvbnN0IG9wdHMgPSB7IC4uLm9wdGlvbnMgfTtcbiAgY29uc3QgbWF4ID0gdHlwZW9mIG9wdHMubWF4TGVuZ3RoID09PSAnbnVtYmVyJyA/IE1hdGgubWluKE1BWF9MRU5HVEgsIG9wdHMubWF4TGVuZ3RoKSA6IE1BWF9MRU5HVEg7XG5cbiAgbGV0IGxlbiA9IGlucHV0Lmxlbmd0aDtcbiAgaWYgKGxlbiA+IG1heCkge1xuICAgIHRocm93IG5ldyBTeW50YXhFcnJvcihgSW5wdXQgbGVuZ3RoOiAke2xlbn0sIGV4Y2VlZHMgbWF4aW11bSBhbGxvd2VkIGxlbmd0aDogJHttYXh9YCk7XG4gIH1cblxuICBjb25zdCBib3MgPSB7IHR5cGU6ICdib3MnLCB2YWx1ZTogJycsIG91dHB1dDogb3B0cy5wcmVwZW5kIHx8ICcnIH07XG4gIGNvbnN0IHRva2VucyA9IFtib3NdO1xuXG4gIGNvbnN0IGNhcHR1cmUgPSBvcHRzLmNhcHR1cmUgPyAnJyA6ICc/Oic7XG4gIGNvbnN0IHdpbjMyID0gdXRpbHMuaXNXaW5kb3dzKG9wdGlvbnMpO1xuXG4gIC8vIGNyZWF0ZSBjb25zdGFudHMgYmFzZWQgb24gcGxhdGZvcm0sIGZvciB3aW5kb3dzIG9yIHBvc2l4XG4gIGNvbnN0IFBMQVRGT1JNX0NIQVJTID0gY29uc3RhbnRzLmdsb2JDaGFycyh3aW4zMik7XG4gIGNvbnN0IEVYVEdMT0JfQ0hBUlMgPSBjb25zdGFudHMuZXh0Z2xvYkNoYXJzKFBMQVRGT1JNX0NIQVJTKTtcblxuICBjb25zdCB7XG4gICAgRE9UX0xJVEVSQUwsXG4gICAgUExVU19MSVRFUkFMLFxuICAgIFNMQVNIX0xJVEVSQUwsXG4gICAgT05FX0NIQVIsXG4gICAgRE9UU19TTEFTSCxcbiAgICBOT19ET1QsXG4gICAgTk9fRE9UX1NMQVNILFxuICAgIE5PX0RPVFNfU0xBU0gsXG4gICAgUU1BUkssXG4gICAgUU1BUktfTk9fRE9ULFxuICAgIFNUQVIsXG4gICAgU1RBUlRfQU5DSE9SXG4gIH0gPSBQTEFURk9STV9DSEFSUztcblxuICBjb25zdCBnbG9ic3RhciA9IG9wdHMgPT4ge1xuICAgIHJldHVybiBgKCR7Y2FwdHVyZX0oPzooPyEke1NUQVJUX0FOQ0hPUn0ke29wdHMuZG90ID8gRE9UU19TTEFTSCA6IERPVF9MSVRFUkFMfSkuKSo/KWA7XG4gIH07XG5cbiAgY29uc3Qgbm9kb3QgPSBvcHRzLmRvdCA/ICcnIDogTk9fRE9UO1xuICBjb25zdCBxbWFya05vRG90ID0gb3B0cy5kb3QgPyBRTUFSSyA6IFFNQVJLX05PX0RPVDtcbiAgbGV0IHN0YXIgPSBvcHRzLmJhc2ggPT09IHRydWUgPyBnbG9ic3RhcihvcHRzKSA6IFNUQVI7XG5cbiAgaWYgKG9wdHMuY2FwdHVyZSkge1xuICAgIHN0YXIgPSBgKCR7c3Rhcn0pYDtcbiAgfVxuXG4gIC8vIG1pbmltYXRjaCBvcHRpb25zIHN1cHBvcnRcbiAgaWYgKHR5cGVvZiBvcHRzLm5vZXh0ID09PSAnYm9vbGVhbicpIHtcbiAgICBvcHRzLm5vZXh0Z2xvYiA9IG9wdHMubm9leHQ7XG4gIH1cblxuICBjb25zdCBzdGF0ZSA9IHtcbiAgICBpbnB1dCxcbiAgICBpbmRleDogLTEsXG4gICAgc3RhcnQ6IDAsXG4gICAgZG90OiBvcHRzLmRvdCA9PT0gdHJ1ZSxcbiAgICBjb25zdW1lZDogJycsXG4gICAgb3V0cHV0OiAnJyxcbiAgICBwcmVmaXg6ICcnLFxuICAgIGJhY2t0cmFjazogZmFsc2UsXG4gICAgbmVnYXRlZDogZmFsc2UsXG4gICAgYnJhY2tldHM6IDAsXG4gICAgYnJhY2VzOiAwLFxuICAgIHBhcmVuczogMCxcbiAgICBxdW90ZXM6IDAsXG4gICAgZ2xvYnN0YXI6IGZhbHNlLFxuICAgIHRva2Vuc1xuICB9O1xuXG4gIGlucHV0ID0gdXRpbHMucmVtb3ZlUHJlZml4KGlucHV0LCBzdGF0ZSk7XG4gIGxlbiA9IGlucHV0Lmxlbmd0aDtcblxuICBjb25zdCBleHRnbG9icyA9IFtdO1xuICBjb25zdCBicmFjZXMgPSBbXTtcbiAgY29uc3Qgc3RhY2sgPSBbXTtcbiAgbGV0IHByZXYgPSBib3M7XG4gIGxldCB2YWx1ZTtcblxuICAvKipcbiAgICogVG9rZW5pemluZyBoZWxwZXJzXG4gICAqL1xuXG4gIGNvbnN0IGVvcyA9ICgpID0+IHN0YXRlLmluZGV4ID09PSBsZW4gLSAxO1xuICBjb25zdCBwZWVrID0gc3RhdGUucGVlayA9IChuID0gMSkgPT4gaW5wdXRbc3RhdGUuaW5kZXggKyBuXTtcbiAgY29uc3QgYWR2YW5jZSA9IHN0YXRlLmFkdmFuY2UgPSAoKSA9PiBpbnB1dFsrK3N0YXRlLmluZGV4XSB8fCAnJztcbiAgY29uc3QgcmVtYWluaW5nID0gKCkgPT4gaW5wdXQuc2xpY2Uoc3RhdGUuaW5kZXggKyAxKTtcbiAgY29uc3QgY29uc3VtZSA9ICh2YWx1ZSA9ICcnLCBudW0gPSAwKSA9PiB7XG4gICAgc3RhdGUuY29uc3VtZWQgKz0gdmFsdWU7XG4gICAgc3RhdGUuaW5kZXggKz0gbnVtO1xuICB9O1xuXG4gIGNvbnN0IGFwcGVuZCA9IHRva2VuID0+IHtcbiAgICBzdGF0ZS5vdXRwdXQgKz0gdG9rZW4ub3V0cHV0ICE9IG51bGwgPyB0b2tlbi5vdXRwdXQgOiB0b2tlbi52YWx1ZTtcbiAgICBjb25zdW1lKHRva2VuLnZhbHVlKTtcbiAgfTtcblxuICBjb25zdCBuZWdhdGUgPSAoKSA9PiB7XG4gICAgbGV0IGNvdW50ID0gMTtcblxuICAgIHdoaWxlIChwZWVrKCkgPT09ICchJyAmJiAocGVlaygyKSAhPT0gJygnIHx8IHBlZWsoMykgPT09ICc/JykpIHtcbiAgICAgIGFkdmFuY2UoKTtcbiAgICAgIHN0YXRlLnN0YXJ0Kys7XG4gICAgICBjb3VudCsrO1xuICAgIH1cblxuICAgIGlmIChjb3VudCAlIDIgPT09IDApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBzdGF0ZS5uZWdhdGVkID0gdHJ1ZTtcbiAgICBzdGF0ZS5zdGFydCsrO1xuICAgIHJldHVybiB0cnVlO1xuICB9O1xuXG4gIGNvbnN0IGluY3JlbWVudCA9IHR5cGUgPT4ge1xuICAgIHN0YXRlW3R5cGVdKys7XG4gICAgc3RhY2sucHVzaCh0eXBlKTtcbiAgfTtcblxuICBjb25zdCBkZWNyZW1lbnQgPSB0eXBlID0+IHtcbiAgICBzdGF0ZVt0eXBlXS0tO1xuICAgIHN0YWNrLnBvcCgpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBQdXNoIHRva2VucyBvbnRvIHRoZSB0b2tlbnMgYXJyYXkuIFRoaXMgaGVscGVyIHNwZWVkcyB1cFxuICAgKiB0b2tlbml6aW5nIGJ5IDEpIGhlbHBpbmcgdXMgYXZvaWQgYmFja3RyYWNraW5nIGFzIG11Y2ggYXMgcG9zc2libGUsXG4gICAqIGFuZCAyKSBoZWxwaW5nIHVzIGF2b2lkIGNyZWF0aW5nIGV4dHJhIHRva2VucyB3aGVuIGNvbnNlY3V0aXZlXG4gICAqIGNoYXJhY3RlcnMgYXJlIHBsYWluIHRleHQuIFRoaXMgaW1wcm92ZXMgcGVyZm9ybWFuY2UgYW5kIHNpbXBsaWZpZXNcbiAgICogbG9va2JlaGluZHMuXG4gICAqL1xuXG4gIGNvbnN0IHB1c2ggPSB0b2sgPT4ge1xuICAgIGlmIChwcmV2LnR5cGUgPT09ICdnbG9ic3RhcicpIHtcbiAgICAgIGNvbnN0IGlzQnJhY2UgPSBzdGF0ZS5icmFjZXMgPiAwICYmICh0b2sudHlwZSA9PT0gJ2NvbW1hJyB8fCB0b2sudHlwZSA9PT0gJ2JyYWNlJyk7XG4gICAgICBjb25zdCBpc0V4dGdsb2IgPSB0b2suZXh0Z2xvYiA9PT0gdHJ1ZSB8fCAoZXh0Z2xvYnMubGVuZ3RoICYmICh0b2sudHlwZSA9PT0gJ3BpcGUnIHx8IHRvay50eXBlID09PSAncGFyZW4nKSk7XG5cbiAgICAgIGlmICh0b2sudHlwZSAhPT0gJ3NsYXNoJyAmJiB0b2sudHlwZSAhPT0gJ3BhcmVuJyAmJiAhaXNCcmFjZSAmJiAhaXNFeHRnbG9iKSB7XG4gICAgICAgIHN0YXRlLm91dHB1dCA9IHN0YXRlLm91dHB1dC5zbGljZSgwLCAtcHJldi5vdXRwdXQubGVuZ3RoKTtcbiAgICAgICAgcHJldi50eXBlID0gJ3N0YXInO1xuICAgICAgICBwcmV2LnZhbHVlID0gJyonO1xuICAgICAgICBwcmV2Lm91dHB1dCA9IHN0YXI7XG4gICAgICAgIHN0YXRlLm91dHB1dCArPSBwcmV2Lm91dHB1dDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZXh0Z2xvYnMubGVuZ3RoICYmIHRvay50eXBlICE9PSAncGFyZW4nKSB7XG4gICAgICBleHRnbG9ic1tleHRnbG9icy5sZW5ndGggLSAxXS5pbm5lciArPSB0b2sudmFsdWU7XG4gICAgfVxuXG4gICAgaWYgKHRvay52YWx1ZSB8fCB0b2sub3V0cHV0KSBhcHBlbmQodG9rKTtcbiAgICBpZiAocHJldiAmJiBwcmV2LnR5cGUgPT09ICd0ZXh0JyAmJiB0b2sudHlwZSA9PT0gJ3RleHQnKSB7XG4gICAgICBwcmV2LnZhbHVlICs9IHRvay52YWx1ZTtcbiAgICAgIHByZXYub3V0cHV0ID0gKHByZXYub3V0cHV0IHx8ICcnKSArIHRvay52YWx1ZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0b2sucHJldiA9IHByZXY7XG4gICAgdG9rZW5zLnB1c2godG9rKTtcbiAgICBwcmV2ID0gdG9rO1xuICB9O1xuXG4gIGNvbnN0IGV4dGdsb2JPcGVuID0gKHR5cGUsIHZhbHVlKSA9PiB7XG4gICAgY29uc3QgdG9rZW4gPSB7IC4uLkVYVEdMT0JfQ0hBUlNbdmFsdWVdLCBjb25kaXRpb25zOiAxLCBpbm5lcjogJycgfTtcblxuICAgIHRva2VuLnByZXYgPSBwcmV2O1xuICAgIHRva2VuLnBhcmVucyA9IHN0YXRlLnBhcmVucztcbiAgICB0b2tlbi5vdXRwdXQgPSBzdGF0ZS5vdXRwdXQ7XG4gICAgY29uc3Qgb3V0cHV0ID0gKG9wdHMuY2FwdHVyZSA/ICcoJyA6ICcnKSArIHRva2VuLm9wZW47XG5cbiAgICBpbmNyZW1lbnQoJ3BhcmVucycpO1xuICAgIHB1c2goeyB0eXBlLCB2YWx1ZSwgb3V0cHV0OiBzdGF0ZS5vdXRwdXQgPyAnJyA6IE9ORV9DSEFSIH0pO1xuICAgIHB1c2goeyB0eXBlOiAncGFyZW4nLCBleHRnbG9iOiB0cnVlLCB2YWx1ZTogYWR2YW5jZSgpLCBvdXRwdXQgfSk7XG4gICAgZXh0Z2xvYnMucHVzaCh0b2tlbik7XG4gIH07XG5cbiAgY29uc3QgZXh0Z2xvYkNsb3NlID0gdG9rZW4gPT4ge1xuICAgIGxldCBvdXRwdXQgPSB0b2tlbi5jbG9zZSArIChvcHRzLmNhcHR1cmUgPyAnKScgOiAnJyk7XG4gICAgbGV0IHJlc3Q7XG5cbiAgICBpZiAodG9rZW4udHlwZSA9PT0gJ25lZ2F0ZScpIHtcbiAgICAgIGxldCBleHRnbG9iU3RhciA9IHN0YXI7XG5cbiAgICAgIGlmICh0b2tlbi5pbm5lciAmJiB0b2tlbi5pbm5lci5sZW5ndGggPiAxICYmIHRva2VuLmlubmVyLmluY2x1ZGVzKCcvJykpIHtcbiAgICAgICAgZXh0Z2xvYlN0YXIgPSBnbG9ic3RhcihvcHRzKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGV4dGdsb2JTdGFyICE9PSBzdGFyIHx8IGVvcygpIHx8IC9eXFwpKyQvLnRlc3QocmVtYWluaW5nKCkpKSB7XG4gICAgICAgIG91dHB1dCA9IHRva2VuLmNsb3NlID0gYCkkKSkke2V4dGdsb2JTdGFyfWA7XG4gICAgICB9XG5cbiAgICAgIGlmICh0b2tlbi5pbm5lci5pbmNsdWRlcygnKicpICYmIChyZXN0ID0gcmVtYWluaW5nKCkpICYmIC9eXFwuW15cXFxcLy5dKyQvLnRlc3QocmVzdCkpIHtcbiAgICAgICAgLy8gQW55IG5vbi1tYWdpY2FsIHN0cmluZyAoYC50c2ApIG9yIGV2ZW4gbmVzdGVkIGV4cHJlc3Npb24gKGAue3RzLHRzeH1gKSBjYW4gZm9sbG93IGFmdGVyIHRoZSBjbG9zaW5nIHBhcmVudGhlc2lzLlxuICAgICAgICAvLyBJbiB0aGlzIGNhc2UsIHdlIG5lZWQgdG8gcGFyc2UgdGhlIHN0cmluZyBhbmQgdXNlIGl0IGluIHRoZSBvdXRwdXQgb2YgdGhlIG9yaWdpbmFsIHBhdHRlcm4uXG4gICAgICAgIC8vIFN1aXRhYmxlIHBhdHRlcm5zOiBgLyEoKi5kKS50c2AsIGAvISgqLmQpLnt0cyx0c3h9YCwgYCoqLyEoKi1kYmcpLkAoanMpYC5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gRGlzYWJsaW5nIHRoZSBgZmFzdHBhdGhzYCBvcHRpb24gZHVlIHRvIGEgcHJvYmxlbSB3aXRoIHBhcnNpbmcgc3RyaW5ncyBhcyBgLnRzYCBpbiB0aGUgcGF0dGVybiBsaWtlIGAqKi8hKCouZCkudHNgLlxuICAgICAgICBjb25zdCBleHByZXNzaW9uID0gcGFyc2UocmVzdCwgeyAuLi5vcHRpb25zLCBmYXN0cGF0aHM6IGZhbHNlIH0pLm91dHB1dDtcblxuICAgICAgICBvdXRwdXQgPSB0b2tlbi5jbG9zZSA9IGApJHtleHByZXNzaW9ufSkke2V4dGdsb2JTdGFyfSlgO1xuICAgICAgfVxuXG4gICAgICBpZiAodG9rZW4ucHJldi50eXBlID09PSAnYm9zJykge1xuICAgICAgICBzdGF0ZS5uZWdhdGVkRXh0Z2xvYiA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcHVzaCh7IHR5cGU6ICdwYXJlbicsIGV4dGdsb2I6IHRydWUsIHZhbHVlLCBvdXRwdXQgfSk7XG4gICAgZGVjcmVtZW50KCdwYXJlbnMnKTtcbiAgfTtcblxuICAvKipcbiAgICogRmFzdCBwYXRoc1xuICAgKi9cblxuICBpZiAob3B0cy5mYXN0cGF0aHMgIT09IGZhbHNlICYmICEvKF5bKiFdfFsvKClbXFxde31cIl0pLy50ZXN0KGlucHV0KSkge1xuICAgIGxldCBiYWNrc2xhc2hlcyA9IGZhbHNlO1xuXG4gICAgbGV0IG91dHB1dCA9IGlucHV0LnJlcGxhY2UoUkVHRVhfU1BFQ0lBTF9DSEFSU19CQUNLUkVGLCAobSwgZXNjLCBjaGFycywgZmlyc3QsIHJlc3QsIGluZGV4KSA9PiB7XG4gICAgICBpZiAoZmlyc3QgPT09ICdcXFxcJykge1xuICAgICAgICBiYWNrc2xhc2hlcyA9IHRydWU7XG4gICAgICAgIHJldHVybiBtO1xuICAgICAgfVxuXG4gICAgICBpZiAoZmlyc3QgPT09ICc/Jykge1xuICAgICAgICBpZiAoZXNjKSB7XG4gICAgICAgICAgcmV0dXJuIGVzYyArIGZpcnN0ICsgKHJlc3QgPyBRTUFSSy5yZXBlYXQocmVzdC5sZW5ndGgpIDogJycpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpbmRleCA9PT0gMCkge1xuICAgICAgICAgIHJldHVybiBxbWFya05vRG90ICsgKHJlc3QgPyBRTUFSSy5yZXBlYXQocmVzdC5sZW5ndGgpIDogJycpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBRTUFSSy5yZXBlYXQoY2hhcnMubGVuZ3RoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGZpcnN0ID09PSAnLicpIHtcbiAgICAgICAgcmV0dXJuIERPVF9MSVRFUkFMLnJlcGVhdChjaGFycy5sZW5ndGgpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZmlyc3QgPT09ICcqJykge1xuICAgICAgICBpZiAoZXNjKSB7XG4gICAgICAgICAgcmV0dXJuIGVzYyArIGZpcnN0ICsgKHJlc3QgPyBzdGFyIDogJycpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdGFyO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGVzYyA/IG0gOiBgXFxcXCR7bX1gO1xuICAgIH0pO1xuXG4gICAgaWYgKGJhY2tzbGFzaGVzID09PSB0cnVlKSB7XG4gICAgICBpZiAob3B0cy51bmVzY2FwZSA9PT0gdHJ1ZSkge1xuICAgICAgICBvdXRwdXQgPSBvdXRwdXQucmVwbGFjZSgvXFxcXC9nLCAnJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvdXRwdXQgPSBvdXRwdXQucmVwbGFjZSgvXFxcXCsvZywgbSA9PiB7XG4gICAgICAgICAgcmV0dXJuIG0ubGVuZ3RoICUgMiA9PT0gMCA/ICdcXFxcXFxcXCcgOiAobSA/ICdcXFxcJyA6ICcnKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG91dHB1dCA9PT0gaW5wdXQgJiYgb3B0cy5jb250YWlucyA9PT0gdHJ1ZSkge1xuICAgICAgc3RhdGUub3V0cHV0ID0gaW5wdXQ7XG4gICAgICByZXR1cm4gc3RhdGU7XG4gICAgfVxuXG4gICAgc3RhdGUub3V0cHV0ID0gdXRpbHMud3JhcE91dHB1dChvdXRwdXQsIHN0YXRlLCBvcHRpb25zKTtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cblxuICAvKipcbiAgICogVG9rZW5pemUgaW5wdXQgdW50aWwgd2UgcmVhY2ggZW5kLW9mLXN0cmluZ1xuICAgKi9cblxuICB3aGlsZSAoIWVvcygpKSB7XG4gICAgdmFsdWUgPSBhZHZhbmNlKCk7XG5cbiAgICBpZiAodmFsdWUgPT09ICdcXHUwMDAwJykge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXNjYXBlZCBjaGFyYWN0ZXJzXG4gICAgICovXG5cbiAgICBpZiAodmFsdWUgPT09ICdcXFxcJykge1xuICAgICAgY29uc3QgbmV4dCA9IHBlZWsoKTtcblxuICAgICAgaWYgKG5leHQgPT09ICcvJyAmJiBvcHRzLmJhc2ggIT09IHRydWUpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChuZXh0ID09PSAnLicgfHwgbmV4dCA9PT0gJzsnKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoIW5leHQpIHtcbiAgICAgICAgdmFsdWUgKz0gJ1xcXFwnO1xuICAgICAgICBwdXNoKHsgdHlwZTogJ3RleHQnLCB2YWx1ZSB9KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIGNvbGxhcHNlIHNsYXNoZXMgdG8gcmVkdWNlIHBvdGVudGlhbCBmb3IgZXhwbG9pdHNcbiAgICAgIGNvbnN0IG1hdGNoID0gL15cXFxcKy8uZXhlYyhyZW1haW5pbmcoKSk7XG4gICAgICBsZXQgc2xhc2hlcyA9IDA7XG5cbiAgICAgIGlmIChtYXRjaCAmJiBtYXRjaFswXS5sZW5ndGggPiAyKSB7XG4gICAgICAgIHNsYXNoZXMgPSBtYXRjaFswXS5sZW5ndGg7XG4gICAgICAgIHN0YXRlLmluZGV4ICs9IHNsYXNoZXM7XG4gICAgICAgIGlmIChzbGFzaGVzICUgMiAhPT0gMCkge1xuICAgICAgICAgIHZhbHVlICs9ICdcXFxcJztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAob3B0cy51bmVzY2FwZSA9PT0gdHJ1ZSkge1xuICAgICAgICB2YWx1ZSA9IGFkdmFuY2UoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbHVlICs9IGFkdmFuY2UoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHN0YXRlLmJyYWNrZXRzID09PSAwKSB7XG4gICAgICAgIHB1c2goeyB0eXBlOiAndGV4dCcsIHZhbHVlIH0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJZiB3ZSdyZSBpbnNpZGUgYSByZWdleCBjaGFyYWN0ZXIgY2xhc3MsIGNvbnRpbnVlXG4gICAgICogdW50aWwgd2UgcmVhY2ggdGhlIGNsb3NpbmcgYnJhY2tldC5cbiAgICAgKi9cblxuICAgIGlmIChzdGF0ZS5icmFja2V0cyA+IDAgJiYgKHZhbHVlICE9PSAnXScgfHwgcHJldi52YWx1ZSA9PT0gJ1snIHx8IHByZXYudmFsdWUgPT09ICdbXicpKSB7XG4gICAgICBpZiAob3B0cy5wb3NpeCAhPT0gZmFsc2UgJiYgdmFsdWUgPT09ICc6Jykge1xuICAgICAgICBjb25zdCBpbm5lciA9IHByZXYudmFsdWUuc2xpY2UoMSk7XG4gICAgICAgIGlmIChpbm5lci5pbmNsdWRlcygnWycpKSB7XG4gICAgICAgICAgcHJldi5wb3NpeCA9IHRydWU7XG5cbiAgICAgICAgICBpZiAoaW5uZXIuaW5jbHVkZXMoJzonKSkge1xuICAgICAgICAgICAgY29uc3QgaWR4ID0gcHJldi52YWx1ZS5sYXN0SW5kZXhPZignWycpO1xuICAgICAgICAgICAgY29uc3QgcHJlID0gcHJldi52YWx1ZS5zbGljZSgwLCBpZHgpO1xuICAgICAgICAgICAgY29uc3QgcmVzdCA9IHByZXYudmFsdWUuc2xpY2UoaWR4ICsgMik7XG4gICAgICAgICAgICBjb25zdCBwb3NpeCA9IFBPU0lYX1JFR0VYX1NPVVJDRVtyZXN0XTtcbiAgICAgICAgICAgIGlmIChwb3NpeCkge1xuICAgICAgICAgICAgICBwcmV2LnZhbHVlID0gcHJlICsgcG9zaXg7XG4gICAgICAgICAgICAgIHN0YXRlLmJhY2t0cmFjayA9IHRydWU7XG4gICAgICAgICAgICAgIGFkdmFuY2UoKTtcblxuICAgICAgICAgICAgICBpZiAoIWJvcy5vdXRwdXQgJiYgdG9rZW5zLmluZGV4T2YocHJldikgPT09IDEpIHtcbiAgICAgICAgICAgICAgICBib3Mub3V0cHV0ID0gT05FX0NIQVI7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICgodmFsdWUgPT09ICdbJyAmJiBwZWVrKCkgIT09ICc6JykgfHwgKHZhbHVlID09PSAnLScgJiYgcGVlaygpID09PSAnXScpKSB7XG4gICAgICAgIHZhbHVlID0gYFxcXFwke3ZhbHVlfWA7XG4gICAgICB9XG5cbiAgICAgIGlmICh2YWx1ZSA9PT0gJ10nICYmIChwcmV2LnZhbHVlID09PSAnWycgfHwgcHJldi52YWx1ZSA9PT0gJ1teJykpIHtcbiAgICAgICAgdmFsdWUgPSBgXFxcXCR7dmFsdWV9YDtcbiAgICAgIH1cblxuICAgICAgaWYgKG9wdHMucG9zaXggPT09IHRydWUgJiYgdmFsdWUgPT09ICchJyAmJiBwcmV2LnZhbHVlID09PSAnWycpIHtcbiAgICAgICAgdmFsdWUgPSAnXic7XG4gICAgICB9XG5cbiAgICAgIHByZXYudmFsdWUgKz0gdmFsdWU7XG4gICAgICBhcHBlbmQoeyB2YWx1ZSB9KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIElmIHdlJ3JlIGluc2lkZSBhIHF1b3RlZCBzdHJpbmcsIGNvbnRpbnVlXG4gICAgICogdW50aWwgd2UgcmVhY2ggdGhlIGNsb3NpbmcgZG91YmxlIHF1b3RlLlxuICAgICAqL1xuXG4gICAgaWYgKHN0YXRlLnF1b3RlcyA9PT0gMSAmJiB2YWx1ZSAhPT0gJ1wiJykge1xuICAgICAgdmFsdWUgPSB1dGlscy5lc2NhcGVSZWdleCh2YWx1ZSk7XG4gICAgICBwcmV2LnZhbHVlICs9IHZhbHVlO1xuICAgICAgYXBwZW5kKHsgdmFsdWUgfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEb3VibGUgcXVvdGVzXG4gICAgICovXG5cbiAgICBpZiAodmFsdWUgPT09ICdcIicpIHtcbiAgICAgIHN0YXRlLnF1b3RlcyA9IHN0YXRlLnF1b3RlcyA9PT0gMSA/IDAgOiAxO1xuICAgICAgaWYgKG9wdHMua2VlcFF1b3RlcyA9PT0gdHJ1ZSkge1xuICAgICAgICBwdXNoKHsgdHlwZTogJ3RleHQnLCB2YWx1ZSB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBhcmVudGhlc2VzXG4gICAgICovXG5cbiAgICBpZiAodmFsdWUgPT09ICcoJykge1xuICAgICAgaW5jcmVtZW50KCdwYXJlbnMnKTtcbiAgICAgIHB1c2goeyB0eXBlOiAncGFyZW4nLCB2YWx1ZSB9KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmICh2YWx1ZSA9PT0gJyknKSB7XG4gICAgICBpZiAoc3RhdGUucGFyZW5zID09PSAwICYmIG9wdHMuc3RyaWN0QnJhY2tldHMgPT09IHRydWUpIHtcbiAgICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKHN5bnRheEVycm9yKCdvcGVuaW5nJywgJygnKSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGV4dGdsb2IgPSBleHRnbG9ic1tleHRnbG9icy5sZW5ndGggLSAxXTtcbiAgICAgIGlmIChleHRnbG9iICYmIHN0YXRlLnBhcmVucyA9PT0gZXh0Z2xvYi5wYXJlbnMgKyAxKSB7XG4gICAgICAgIGV4dGdsb2JDbG9zZShleHRnbG9icy5wb3AoKSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBwdXNoKHsgdHlwZTogJ3BhcmVuJywgdmFsdWUsIG91dHB1dDogc3RhdGUucGFyZW5zID8gJyknIDogJ1xcXFwpJyB9KTtcbiAgICAgIGRlY3JlbWVudCgncGFyZW5zJyk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTcXVhcmUgYnJhY2tldHNcbiAgICAgKi9cblxuICAgIGlmICh2YWx1ZSA9PT0gJ1snKSB7XG4gICAgICBpZiAob3B0cy5ub2JyYWNrZXQgPT09IHRydWUgfHwgIXJlbWFpbmluZygpLmluY2x1ZGVzKCddJykpIHtcbiAgICAgICAgaWYgKG9wdHMubm9icmFja2V0ICE9PSB0cnVlICYmIG9wdHMuc3RyaWN0QnJhY2tldHMgPT09IHRydWUpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3Ioc3ludGF4RXJyb3IoJ2Nsb3NpbmcnLCAnXScpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhbHVlID0gYFxcXFwke3ZhbHVlfWA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpbmNyZW1lbnQoJ2JyYWNrZXRzJyk7XG4gICAgICB9XG5cbiAgICAgIHB1c2goeyB0eXBlOiAnYnJhY2tldCcsIHZhbHVlIH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKHZhbHVlID09PSAnXScpIHtcbiAgICAgIGlmIChvcHRzLm5vYnJhY2tldCA9PT0gdHJ1ZSB8fCAocHJldiAmJiBwcmV2LnR5cGUgPT09ICdicmFja2V0JyAmJiBwcmV2LnZhbHVlLmxlbmd0aCA9PT0gMSkpIHtcbiAgICAgICAgcHVzaCh7IHR5cGU6ICd0ZXh0JywgdmFsdWUsIG91dHB1dDogYFxcXFwke3ZhbHVlfWAgfSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoc3RhdGUuYnJhY2tldHMgPT09IDApIHtcbiAgICAgICAgaWYgKG9wdHMuc3RyaWN0QnJhY2tldHMgPT09IHRydWUpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3Ioc3ludGF4RXJyb3IoJ29wZW5pbmcnLCAnWycpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHB1c2goeyB0eXBlOiAndGV4dCcsIHZhbHVlLCBvdXRwdXQ6IGBcXFxcJHt2YWx1ZX1gIH0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgZGVjcmVtZW50KCdicmFja2V0cycpO1xuXG4gICAgICBjb25zdCBwcmV2VmFsdWUgPSBwcmV2LnZhbHVlLnNsaWNlKDEpO1xuICAgICAgaWYgKHByZXYucG9zaXggIT09IHRydWUgJiYgcHJldlZhbHVlWzBdID09PSAnXicgJiYgIXByZXZWYWx1ZS5pbmNsdWRlcygnLycpKSB7XG4gICAgICAgIHZhbHVlID0gYC8ke3ZhbHVlfWA7XG4gICAgICB9XG5cbiAgICAgIHByZXYudmFsdWUgKz0gdmFsdWU7XG4gICAgICBhcHBlbmQoeyB2YWx1ZSB9KTtcblxuICAgICAgLy8gd2hlbiBsaXRlcmFsIGJyYWNrZXRzIGFyZSBleHBsaWNpdGx5IGRpc2FibGVkXG4gICAgICAvLyBhc3N1bWUgd2Ugc2hvdWxkIG1hdGNoIHdpdGggYSByZWdleCBjaGFyYWN0ZXIgY2xhc3NcbiAgICAgIGlmIChvcHRzLmxpdGVyYWxCcmFja2V0cyA9PT0gZmFsc2UgfHwgdXRpbHMuaGFzUmVnZXhDaGFycyhwcmV2VmFsdWUpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBlc2NhcGVkID0gdXRpbHMuZXNjYXBlUmVnZXgocHJldi52YWx1ZSk7XG4gICAgICBzdGF0ZS5vdXRwdXQgPSBzdGF0ZS5vdXRwdXQuc2xpY2UoMCwgLXByZXYudmFsdWUubGVuZ3RoKTtcblxuICAgICAgLy8gd2hlbiBsaXRlcmFsIGJyYWNrZXRzIGFyZSBleHBsaWNpdGx5IGVuYWJsZWRcbiAgICAgIC8vIGFzc3VtZSB3ZSBzaG91bGQgZXNjYXBlIHRoZSBicmFja2V0cyB0byBtYXRjaCBsaXRlcmFsIGNoYXJhY3RlcnNcbiAgICAgIGlmIChvcHRzLmxpdGVyYWxCcmFja2V0cyA9PT0gdHJ1ZSkge1xuICAgICAgICBzdGF0ZS5vdXRwdXQgKz0gZXNjYXBlZDtcbiAgICAgICAgcHJldi52YWx1ZSA9IGVzY2FwZWQ7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyB3aGVuIHRoZSB1c2VyIHNwZWNpZmllcyBub3RoaW5nLCB0cnkgdG8gbWF0Y2ggYm90aFxuICAgICAgcHJldi52YWx1ZSA9IGAoJHtjYXB0dXJlfSR7ZXNjYXBlZH18JHtwcmV2LnZhbHVlfSlgO1xuICAgICAgc3RhdGUub3V0cHV0ICs9IHByZXYudmFsdWU7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBCcmFjZXNcbiAgICAgKi9cblxuICAgIGlmICh2YWx1ZSA9PT0gJ3snICYmIG9wdHMubm9icmFjZSAhPT0gdHJ1ZSkge1xuICAgICAgaW5jcmVtZW50KCdicmFjZXMnKTtcblxuICAgICAgY29uc3Qgb3BlbiA9IHtcbiAgICAgICAgdHlwZTogJ2JyYWNlJyxcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIG91dHB1dDogJygnLFxuICAgICAgICBvdXRwdXRJbmRleDogc3RhdGUub3V0cHV0Lmxlbmd0aCxcbiAgICAgICAgdG9rZW5zSW5kZXg6IHN0YXRlLnRva2Vucy5sZW5ndGhcbiAgICAgIH07XG5cbiAgICAgIGJyYWNlcy5wdXNoKG9wZW4pO1xuICAgICAgcHVzaChvcGVuKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmICh2YWx1ZSA9PT0gJ30nKSB7XG4gICAgICBjb25zdCBicmFjZSA9IGJyYWNlc1ticmFjZXMubGVuZ3RoIC0gMV07XG5cbiAgICAgIGlmIChvcHRzLm5vYnJhY2UgPT09IHRydWUgfHwgIWJyYWNlKSB7XG4gICAgICAgIHB1c2goeyB0eXBlOiAndGV4dCcsIHZhbHVlLCBvdXRwdXQ6IHZhbHVlIH0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgbGV0IG91dHB1dCA9ICcpJztcblxuICAgICAgaWYgKGJyYWNlLmRvdHMgPT09IHRydWUpIHtcbiAgICAgICAgY29uc3QgYXJyID0gdG9rZW5zLnNsaWNlKCk7XG4gICAgICAgIGNvbnN0IHJhbmdlID0gW107XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IGFyci5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgIHRva2Vucy5wb3AoKTtcbiAgICAgICAgICBpZiAoYXJyW2ldLnR5cGUgPT09ICdicmFjZScpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoYXJyW2ldLnR5cGUgIT09ICdkb3RzJykge1xuICAgICAgICAgICAgcmFuZ2UudW5zaGlmdChhcnJbaV0udmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIG91dHB1dCA9IGV4cGFuZFJhbmdlKHJhbmdlLCBvcHRzKTtcbiAgICAgICAgc3RhdGUuYmFja3RyYWNrID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGJyYWNlLmNvbW1hICE9PSB0cnVlICYmIGJyYWNlLmRvdHMgIT09IHRydWUpIHtcbiAgICAgICAgY29uc3Qgb3V0ID0gc3RhdGUub3V0cHV0LnNsaWNlKDAsIGJyYWNlLm91dHB1dEluZGV4KTtcbiAgICAgICAgY29uc3QgdG9rcyA9IHN0YXRlLnRva2Vucy5zbGljZShicmFjZS50b2tlbnNJbmRleCk7XG4gICAgICAgIGJyYWNlLnZhbHVlID0gYnJhY2Uub3V0cHV0ID0gJ1xcXFx7JztcbiAgICAgICAgdmFsdWUgPSBvdXRwdXQgPSAnXFxcXH0nO1xuICAgICAgICBzdGF0ZS5vdXRwdXQgPSBvdXQ7XG4gICAgICAgIGZvciAoY29uc3QgdCBvZiB0b2tzKSB7XG4gICAgICAgICAgc3RhdGUub3V0cHV0ICs9ICh0Lm91dHB1dCB8fCB0LnZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBwdXNoKHsgdHlwZTogJ2JyYWNlJywgdmFsdWUsIG91dHB1dCB9KTtcbiAgICAgIGRlY3JlbWVudCgnYnJhY2VzJyk7XG4gICAgICBicmFjZXMucG9wKCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQaXBlc1xuICAgICAqL1xuXG4gICAgaWYgKHZhbHVlID09PSAnfCcpIHtcbiAgICAgIGlmIChleHRnbG9icy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGV4dGdsb2JzW2V4dGdsb2JzLmxlbmd0aCAtIDFdLmNvbmRpdGlvbnMrKztcbiAgICAgIH1cbiAgICAgIHB1c2goeyB0eXBlOiAndGV4dCcsIHZhbHVlIH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29tbWFzXG4gICAgICovXG5cbiAgICBpZiAodmFsdWUgPT09ICcsJykge1xuICAgICAgbGV0IG91dHB1dCA9IHZhbHVlO1xuXG4gICAgICBjb25zdCBicmFjZSA9IGJyYWNlc1ticmFjZXMubGVuZ3RoIC0gMV07XG4gICAgICBpZiAoYnJhY2UgJiYgc3RhY2tbc3RhY2subGVuZ3RoIC0gMV0gPT09ICdicmFjZXMnKSB7XG4gICAgICAgIGJyYWNlLmNvbW1hID0gdHJ1ZTtcbiAgICAgICAgb3V0cHV0ID0gJ3wnO1xuICAgICAgfVxuXG4gICAgICBwdXNoKHsgdHlwZTogJ2NvbW1hJywgdmFsdWUsIG91dHB1dCB9KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNsYXNoZXNcbiAgICAgKi9cblxuICAgIGlmICh2YWx1ZSA9PT0gJy8nKSB7XG4gICAgICAvLyBpZiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBnbG9iIGlzIFwiLi9cIiwgYWR2YW5jZSB0aGUgc3RhcnRcbiAgICAgIC8vIHRvIHRoZSBjdXJyZW50IGluZGV4LCBhbmQgZG9uJ3QgYWRkIHRoZSBcIi4vXCIgY2hhcmFjdGVyc1xuICAgICAgLy8gdG8gdGhlIHN0YXRlLiBUaGlzIGdyZWF0bHkgc2ltcGxpZmllcyBsb29rYmVoaW5kcyB3aGVuXG4gICAgICAvLyBjaGVja2luZyBmb3IgQk9TIGNoYXJhY3RlcnMgbGlrZSBcIiFcIiBhbmQgXCIuXCIgKG5vdCBcIi4vXCIpXG4gICAgICBpZiAocHJldi50eXBlID09PSAnZG90JyAmJiBzdGF0ZS5pbmRleCA9PT0gc3RhdGUuc3RhcnQgKyAxKSB7XG4gICAgICAgIHN0YXRlLnN0YXJ0ID0gc3RhdGUuaW5kZXggKyAxO1xuICAgICAgICBzdGF0ZS5jb25zdW1lZCA9ICcnO1xuICAgICAgICBzdGF0ZS5vdXRwdXQgPSAnJztcbiAgICAgICAgdG9rZW5zLnBvcCgpO1xuICAgICAgICBwcmV2ID0gYm9zOyAvLyByZXNldCBcInByZXZcIiB0byB0aGUgZmlyc3QgdG9rZW5cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHB1c2goeyB0eXBlOiAnc2xhc2gnLCB2YWx1ZSwgb3V0cHV0OiBTTEFTSF9MSVRFUkFMIH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRG90c1xuICAgICAqL1xuXG4gICAgaWYgKHZhbHVlID09PSAnLicpIHtcbiAgICAgIGlmIChzdGF0ZS5icmFjZXMgPiAwICYmIHByZXYudHlwZSA9PT0gJ2RvdCcpIHtcbiAgICAgICAgaWYgKHByZXYudmFsdWUgPT09ICcuJykgcHJldi5vdXRwdXQgPSBET1RfTElURVJBTDtcbiAgICAgICAgY29uc3QgYnJhY2UgPSBicmFjZXNbYnJhY2VzLmxlbmd0aCAtIDFdO1xuICAgICAgICBwcmV2LnR5cGUgPSAnZG90cyc7XG4gICAgICAgIHByZXYub3V0cHV0ICs9IHZhbHVlO1xuICAgICAgICBwcmV2LnZhbHVlICs9IHZhbHVlO1xuICAgICAgICBicmFjZS5kb3RzID0gdHJ1ZTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmICgoc3RhdGUuYnJhY2VzICsgc3RhdGUucGFyZW5zKSA9PT0gMCAmJiBwcmV2LnR5cGUgIT09ICdib3MnICYmIHByZXYudHlwZSAhPT0gJ3NsYXNoJykge1xuICAgICAgICBwdXNoKHsgdHlwZTogJ3RleHQnLCB2YWx1ZSwgb3V0cHV0OiBET1RfTElURVJBTCB9KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHB1c2goeyB0eXBlOiAnZG90JywgdmFsdWUsIG91dHB1dDogRE9UX0xJVEVSQUwgfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBRdWVzdGlvbiBtYXJrc1xuICAgICAqL1xuXG4gICAgaWYgKHZhbHVlID09PSAnPycpIHtcbiAgICAgIGNvbnN0IGlzR3JvdXAgPSBwcmV2ICYmIHByZXYudmFsdWUgPT09ICcoJztcbiAgICAgIGlmICghaXNHcm91cCAmJiBvcHRzLm5vZXh0Z2xvYiAhPT0gdHJ1ZSAmJiBwZWVrKCkgPT09ICcoJyAmJiBwZWVrKDIpICE9PSAnPycpIHtcbiAgICAgICAgZXh0Z2xvYk9wZW4oJ3FtYXJrJywgdmFsdWUpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHByZXYgJiYgcHJldi50eXBlID09PSAncGFyZW4nKSB7XG4gICAgICAgIGNvbnN0IG5leHQgPSBwZWVrKCk7XG4gICAgICAgIGxldCBvdXRwdXQgPSB2YWx1ZTtcblxuICAgICAgICBpZiAobmV4dCA9PT0gJzwnICYmICF1dGlscy5zdXBwb3J0c0xvb2tiZWhpbmRzKCkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vZGUuanMgdjEwIG9yIGhpZ2hlciBpcyByZXF1aXJlZCBmb3IgcmVnZXggbG9va2JlaGluZHMnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICgocHJldi52YWx1ZSA9PT0gJygnICYmICEvWyE9PDpdLy50ZXN0KG5leHQpKSB8fCAobmV4dCA9PT0gJzwnICYmICEvPChbIT1dfFxcdys+KS8udGVzdChyZW1haW5pbmcoKSkpKSB7XG4gICAgICAgICAgb3V0cHV0ID0gYFxcXFwke3ZhbHVlfWA7XG4gICAgICAgIH1cblxuICAgICAgICBwdXNoKHsgdHlwZTogJ3RleHQnLCB2YWx1ZSwgb3V0cHV0IH0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKG9wdHMuZG90ICE9PSB0cnVlICYmIChwcmV2LnR5cGUgPT09ICdzbGFzaCcgfHwgcHJldi50eXBlID09PSAnYm9zJykpIHtcbiAgICAgICAgcHVzaCh7IHR5cGU6ICdxbWFyaycsIHZhbHVlLCBvdXRwdXQ6IFFNQVJLX05PX0RPVCB9KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHB1c2goeyB0eXBlOiAncW1hcmsnLCB2YWx1ZSwgb3V0cHV0OiBRTUFSSyB9KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV4Y2xhbWF0aW9uXG4gICAgICovXG5cbiAgICBpZiAodmFsdWUgPT09ICchJykge1xuICAgICAgaWYgKG9wdHMubm9leHRnbG9iICE9PSB0cnVlICYmIHBlZWsoKSA9PT0gJygnKSB7XG4gICAgICAgIGlmIChwZWVrKDIpICE9PSAnPycgfHwgIS9bIT08Ol0vLnRlc3QocGVlaygzKSkpIHtcbiAgICAgICAgICBleHRnbG9iT3BlbignbmVnYXRlJywgdmFsdWUpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChvcHRzLm5vbmVnYXRlICE9PSB0cnVlICYmIHN0YXRlLmluZGV4ID09PSAwKSB7XG4gICAgICAgIG5lZ2F0ZSgpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQbHVzXG4gICAgICovXG5cbiAgICBpZiAodmFsdWUgPT09ICcrJykge1xuICAgICAgaWYgKG9wdHMubm9leHRnbG9iICE9PSB0cnVlICYmIHBlZWsoKSA9PT0gJygnICYmIHBlZWsoMikgIT09ICc/Jykge1xuICAgICAgICBleHRnbG9iT3BlbigncGx1cycsIHZhbHVlKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmICgocHJldiAmJiBwcmV2LnZhbHVlID09PSAnKCcpIHx8IG9wdHMucmVnZXggPT09IGZhbHNlKSB7XG4gICAgICAgIHB1c2goeyB0eXBlOiAncGx1cycsIHZhbHVlLCBvdXRwdXQ6IFBMVVNfTElURVJBTCB9KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmICgocHJldiAmJiAocHJldi50eXBlID09PSAnYnJhY2tldCcgfHwgcHJldi50eXBlID09PSAncGFyZW4nIHx8IHByZXYudHlwZSA9PT0gJ2JyYWNlJykpIHx8IHN0YXRlLnBhcmVucyA+IDApIHtcbiAgICAgICAgcHVzaCh7IHR5cGU6ICdwbHVzJywgdmFsdWUgfSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBwdXNoKHsgdHlwZTogJ3BsdXMnLCB2YWx1ZTogUExVU19MSVRFUkFMIH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGxhaW4gdGV4dFxuICAgICAqL1xuXG4gICAgaWYgKHZhbHVlID09PSAnQCcpIHtcbiAgICAgIGlmIChvcHRzLm5vZXh0Z2xvYiAhPT0gdHJ1ZSAmJiBwZWVrKCkgPT09ICcoJyAmJiBwZWVrKDIpICE9PSAnPycpIHtcbiAgICAgICAgcHVzaCh7IHR5cGU6ICdhdCcsIGV4dGdsb2I6IHRydWUsIHZhbHVlLCBvdXRwdXQ6ICcnIH0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgcHVzaCh7IHR5cGU6ICd0ZXh0JywgdmFsdWUgfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQbGFpbiB0ZXh0XG4gICAgICovXG5cbiAgICBpZiAodmFsdWUgIT09ICcqJykge1xuICAgICAgaWYgKHZhbHVlID09PSAnJCcgfHwgdmFsdWUgPT09ICdeJykge1xuICAgICAgICB2YWx1ZSA9IGBcXFxcJHt2YWx1ZX1gO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBtYXRjaCA9IFJFR0VYX05PTl9TUEVDSUFMX0NIQVJTLmV4ZWMocmVtYWluaW5nKCkpO1xuICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgIHZhbHVlICs9IG1hdGNoWzBdO1xuICAgICAgICBzdGF0ZS5pbmRleCArPSBtYXRjaFswXS5sZW5ndGg7XG4gICAgICB9XG5cbiAgICAgIHB1c2goeyB0eXBlOiAndGV4dCcsIHZhbHVlIH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU3RhcnNcbiAgICAgKi9cblxuICAgIGlmIChwcmV2ICYmIChwcmV2LnR5cGUgPT09ICdnbG9ic3RhcicgfHwgcHJldi5zdGFyID09PSB0cnVlKSkge1xuICAgICAgcHJldi50eXBlID0gJ3N0YXInO1xuICAgICAgcHJldi5zdGFyID0gdHJ1ZTtcbiAgICAgIHByZXYudmFsdWUgKz0gdmFsdWU7XG4gICAgICBwcmV2Lm91dHB1dCA9IHN0YXI7XG4gICAgICBzdGF0ZS5iYWNrdHJhY2sgPSB0cnVlO1xuICAgICAgc3RhdGUuZ2xvYnN0YXIgPSB0cnVlO1xuICAgICAgY29uc3VtZSh2YWx1ZSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBsZXQgcmVzdCA9IHJlbWFpbmluZygpO1xuICAgIGlmIChvcHRzLm5vZXh0Z2xvYiAhPT0gdHJ1ZSAmJiAvXlxcKFteP10vLnRlc3QocmVzdCkpIHtcbiAgICAgIGV4dGdsb2JPcGVuKCdzdGFyJywgdmFsdWUpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKHByZXYudHlwZSA9PT0gJ3N0YXInKSB7XG4gICAgICBpZiAob3B0cy5ub2dsb2JzdGFyID09PSB0cnVlKSB7XG4gICAgICAgIGNvbnN1bWUodmFsdWUpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcHJpb3IgPSBwcmV2LnByZXY7XG4gICAgICBjb25zdCBiZWZvcmUgPSBwcmlvci5wcmV2O1xuICAgICAgY29uc3QgaXNTdGFydCA9IHByaW9yLnR5cGUgPT09ICdzbGFzaCcgfHwgcHJpb3IudHlwZSA9PT0gJ2Jvcyc7XG4gICAgICBjb25zdCBhZnRlclN0YXIgPSBiZWZvcmUgJiYgKGJlZm9yZS50eXBlID09PSAnc3RhcicgfHwgYmVmb3JlLnR5cGUgPT09ICdnbG9ic3RhcicpO1xuXG4gICAgICBpZiAob3B0cy5iYXNoID09PSB0cnVlICYmICghaXNTdGFydCB8fCAocmVzdFswXSAmJiByZXN0WzBdICE9PSAnLycpKSkge1xuICAgICAgICBwdXNoKHsgdHlwZTogJ3N0YXInLCB2YWx1ZSwgb3V0cHV0OiAnJyB9KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGlzQnJhY2UgPSBzdGF0ZS5icmFjZXMgPiAwICYmIChwcmlvci50eXBlID09PSAnY29tbWEnIHx8IHByaW9yLnR5cGUgPT09ICdicmFjZScpO1xuICAgICAgY29uc3QgaXNFeHRnbG9iID0gZXh0Z2xvYnMubGVuZ3RoICYmIChwcmlvci50eXBlID09PSAncGlwZScgfHwgcHJpb3IudHlwZSA9PT0gJ3BhcmVuJyk7XG4gICAgICBpZiAoIWlzU3RhcnQgJiYgcHJpb3IudHlwZSAhPT0gJ3BhcmVuJyAmJiAhaXNCcmFjZSAmJiAhaXNFeHRnbG9iKSB7XG4gICAgICAgIHB1c2goeyB0eXBlOiAnc3RhcicsIHZhbHVlLCBvdXRwdXQ6ICcnIH0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gc3RyaXAgY29uc2VjdXRpdmUgYC8qKi9gXG4gICAgICB3aGlsZSAocmVzdC5zbGljZSgwLCAzKSA9PT0gJy8qKicpIHtcbiAgICAgICAgY29uc3QgYWZ0ZXIgPSBpbnB1dFtzdGF0ZS5pbmRleCArIDRdO1xuICAgICAgICBpZiAoYWZ0ZXIgJiYgYWZ0ZXIgIT09ICcvJykge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHJlc3QgPSByZXN0LnNsaWNlKDMpO1xuICAgICAgICBjb25zdW1lKCcvKionLCAzKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHByaW9yLnR5cGUgPT09ICdib3MnICYmIGVvcygpKSB7XG4gICAgICAgIHByZXYudHlwZSA9ICdnbG9ic3Rhcic7XG4gICAgICAgIHByZXYudmFsdWUgKz0gdmFsdWU7XG4gICAgICAgIHByZXYub3V0cHV0ID0gZ2xvYnN0YXIob3B0cyk7XG4gICAgICAgIHN0YXRlLm91dHB1dCA9IHByZXYub3V0cHV0O1xuICAgICAgICBzdGF0ZS5nbG9ic3RhciA9IHRydWU7XG4gICAgICAgIGNvbnN1bWUodmFsdWUpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHByaW9yLnR5cGUgPT09ICdzbGFzaCcgJiYgcHJpb3IucHJldi50eXBlICE9PSAnYm9zJyAmJiAhYWZ0ZXJTdGFyICYmIGVvcygpKSB7XG4gICAgICAgIHN0YXRlLm91dHB1dCA9IHN0YXRlLm91dHB1dC5zbGljZSgwLCAtKHByaW9yLm91dHB1dCArIHByZXYub3V0cHV0KS5sZW5ndGgpO1xuICAgICAgICBwcmlvci5vdXRwdXQgPSBgKD86JHtwcmlvci5vdXRwdXR9YDtcblxuICAgICAgICBwcmV2LnR5cGUgPSAnZ2xvYnN0YXInO1xuICAgICAgICBwcmV2Lm91dHB1dCA9IGdsb2JzdGFyKG9wdHMpICsgKG9wdHMuc3RyaWN0U2xhc2hlcyA/ICcpJyA6ICd8JCknKTtcbiAgICAgICAgcHJldi52YWx1ZSArPSB2YWx1ZTtcbiAgICAgICAgc3RhdGUuZ2xvYnN0YXIgPSB0cnVlO1xuICAgICAgICBzdGF0ZS5vdXRwdXQgKz0gcHJpb3Iub3V0cHV0ICsgcHJldi5vdXRwdXQ7XG4gICAgICAgIGNvbnN1bWUodmFsdWUpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHByaW9yLnR5cGUgPT09ICdzbGFzaCcgJiYgcHJpb3IucHJldi50eXBlICE9PSAnYm9zJyAmJiByZXN0WzBdID09PSAnLycpIHtcbiAgICAgICAgY29uc3QgZW5kID0gcmVzdFsxXSAhPT0gdm9pZCAwID8gJ3wkJyA6ICcnO1xuXG4gICAgICAgIHN0YXRlLm91dHB1dCA9IHN0YXRlLm91dHB1dC5zbGljZSgwLCAtKHByaW9yLm91dHB1dCArIHByZXYub3V0cHV0KS5sZW5ndGgpO1xuICAgICAgICBwcmlvci5vdXRwdXQgPSBgKD86JHtwcmlvci5vdXRwdXR9YDtcblxuICAgICAgICBwcmV2LnR5cGUgPSAnZ2xvYnN0YXInO1xuICAgICAgICBwcmV2Lm91dHB1dCA9IGAke2dsb2JzdGFyKG9wdHMpfSR7U0xBU0hfTElURVJBTH18JHtTTEFTSF9MSVRFUkFMfSR7ZW5kfSlgO1xuICAgICAgICBwcmV2LnZhbHVlICs9IHZhbHVlO1xuXG4gICAgICAgIHN0YXRlLm91dHB1dCArPSBwcmlvci5vdXRwdXQgKyBwcmV2Lm91dHB1dDtcbiAgICAgICAgc3RhdGUuZ2xvYnN0YXIgPSB0cnVlO1xuXG4gICAgICAgIGNvbnN1bWUodmFsdWUgKyBhZHZhbmNlKCkpO1xuXG4gICAgICAgIHB1c2goeyB0eXBlOiAnc2xhc2gnLCB2YWx1ZTogJy8nLCBvdXRwdXQ6ICcnIH0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHByaW9yLnR5cGUgPT09ICdib3MnICYmIHJlc3RbMF0gPT09ICcvJykge1xuICAgICAgICBwcmV2LnR5cGUgPSAnZ2xvYnN0YXInO1xuICAgICAgICBwcmV2LnZhbHVlICs9IHZhbHVlO1xuICAgICAgICBwcmV2Lm91dHB1dCA9IGAoPzpefCR7U0xBU0hfTElURVJBTH18JHtnbG9ic3RhcihvcHRzKX0ke1NMQVNIX0xJVEVSQUx9KWA7XG4gICAgICAgIHN0YXRlLm91dHB1dCA9IHByZXYub3V0cHV0O1xuICAgICAgICBzdGF0ZS5nbG9ic3RhciA9IHRydWU7XG4gICAgICAgIGNvbnN1bWUodmFsdWUgKyBhZHZhbmNlKCkpO1xuICAgICAgICBwdXNoKHsgdHlwZTogJ3NsYXNoJywgdmFsdWU6ICcvJywgb3V0cHV0OiAnJyB9KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIHJlbW92ZSBzaW5nbGUgc3RhciBmcm9tIG91dHB1dFxuICAgICAgc3RhdGUub3V0cHV0ID0gc3RhdGUub3V0cHV0LnNsaWNlKDAsIC1wcmV2Lm91dHB1dC5sZW5ndGgpO1xuXG4gICAgICAvLyByZXNldCBwcmV2aW91cyB0b2tlbiB0byBnbG9ic3RhclxuICAgICAgcHJldi50eXBlID0gJ2dsb2JzdGFyJztcbiAgICAgIHByZXYub3V0cHV0ID0gZ2xvYnN0YXIob3B0cyk7XG4gICAgICBwcmV2LnZhbHVlICs9IHZhbHVlO1xuXG4gICAgICAvLyByZXNldCBvdXRwdXQgd2l0aCBnbG9ic3RhclxuICAgICAgc3RhdGUub3V0cHV0ICs9IHByZXYub3V0cHV0O1xuICAgICAgc3RhdGUuZ2xvYnN0YXIgPSB0cnVlO1xuICAgICAgY29uc3VtZSh2YWx1ZSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCB0b2tlbiA9IHsgdHlwZTogJ3N0YXInLCB2YWx1ZSwgb3V0cHV0OiBzdGFyIH07XG5cbiAgICBpZiAob3B0cy5iYXNoID09PSB0cnVlKSB7XG4gICAgICB0b2tlbi5vdXRwdXQgPSAnLio/JztcbiAgICAgIGlmIChwcmV2LnR5cGUgPT09ICdib3MnIHx8IHByZXYudHlwZSA9PT0gJ3NsYXNoJykge1xuICAgICAgICB0b2tlbi5vdXRwdXQgPSBub2RvdCArIHRva2VuLm91dHB1dDtcbiAgICAgIH1cbiAgICAgIHB1c2godG9rZW4pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKHByZXYgJiYgKHByZXYudHlwZSA9PT0gJ2JyYWNrZXQnIHx8IHByZXYudHlwZSA9PT0gJ3BhcmVuJykgJiYgb3B0cy5yZWdleCA9PT0gdHJ1ZSkge1xuICAgICAgdG9rZW4ub3V0cHV0ID0gdmFsdWU7XG4gICAgICBwdXNoKHRva2VuKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChzdGF0ZS5pbmRleCA9PT0gc3RhdGUuc3RhcnQgfHwgcHJldi50eXBlID09PSAnc2xhc2gnIHx8IHByZXYudHlwZSA9PT0gJ2RvdCcpIHtcbiAgICAgIGlmIChwcmV2LnR5cGUgPT09ICdkb3QnKSB7XG4gICAgICAgIHN0YXRlLm91dHB1dCArPSBOT19ET1RfU0xBU0g7XG4gICAgICAgIHByZXYub3V0cHV0ICs9IE5PX0RPVF9TTEFTSDtcblxuICAgICAgfSBlbHNlIGlmIChvcHRzLmRvdCA9PT0gdHJ1ZSkge1xuICAgICAgICBzdGF0ZS5vdXRwdXQgKz0gTk9fRE9UU19TTEFTSDtcbiAgICAgICAgcHJldi5vdXRwdXQgKz0gTk9fRE9UU19TTEFTSDtcblxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RhdGUub3V0cHV0ICs9IG5vZG90O1xuICAgICAgICBwcmV2Lm91dHB1dCArPSBub2RvdDtcbiAgICAgIH1cblxuICAgICAgaWYgKHBlZWsoKSAhPT0gJyonKSB7XG4gICAgICAgIHN0YXRlLm91dHB1dCArPSBPTkVfQ0hBUjtcbiAgICAgICAgcHJldi5vdXRwdXQgKz0gT05FX0NIQVI7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcHVzaCh0b2tlbik7XG4gIH1cblxuICB3aGlsZSAoc3RhdGUuYnJhY2tldHMgPiAwKSB7XG4gICAgaWYgKG9wdHMuc3RyaWN0QnJhY2tldHMgPT09IHRydWUpIHRocm93IG5ldyBTeW50YXhFcnJvcihzeW50YXhFcnJvcignY2xvc2luZycsICddJykpO1xuICAgIHN0YXRlLm91dHB1dCA9IHV0aWxzLmVzY2FwZUxhc3Qoc3RhdGUub3V0cHV0LCAnWycpO1xuICAgIGRlY3JlbWVudCgnYnJhY2tldHMnKTtcbiAgfVxuXG4gIHdoaWxlIChzdGF0ZS5wYXJlbnMgPiAwKSB7XG4gICAgaWYgKG9wdHMuc3RyaWN0QnJhY2tldHMgPT09IHRydWUpIHRocm93IG5ldyBTeW50YXhFcnJvcihzeW50YXhFcnJvcignY2xvc2luZycsICcpJykpO1xuICAgIHN0YXRlLm91dHB1dCA9IHV0aWxzLmVzY2FwZUxhc3Qoc3RhdGUub3V0cHV0LCAnKCcpO1xuICAgIGRlY3JlbWVudCgncGFyZW5zJyk7XG4gIH1cblxuICB3aGlsZSAoc3RhdGUuYnJhY2VzID4gMCkge1xuICAgIGlmIChvcHRzLnN0cmljdEJyYWNrZXRzID09PSB0cnVlKSB0aHJvdyBuZXcgU3ludGF4RXJyb3Ioc3ludGF4RXJyb3IoJ2Nsb3NpbmcnLCAnfScpKTtcbiAgICBzdGF0ZS5vdXRwdXQgPSB1dGlscy5lc2NhcGVMYXN0KHN0YXRlLm91dHB1dCwgJ3snKTtcbiAgICBkZWNyZW1lbnQoJ2JyYWNlcycpO1xuICB9XG5cbiAgaWYgKG9wdHMuc3RyaWN0U2xhc2hlcyAhPT0gdHJ1ZSAmJiAocHJldi50eXBlID09PSAnc3RhcicgfHwgcHJldi50eXBlID09PSAnYnJhY2tldCcpKSB7XG4gICAgcHVzaCh7IHR5cGU6ICdtYXliZV9zbGFzaCcsIHZhbHVlOiAnJywgb3V0cHV0OiBgJHtTTEFTSF9MSVRFUkFMfT9gIH0pO1xuICB9XG5cbiAgLy8gcmVidWlsZCB0aGUgb3V0cHV0IGlmIHdlIGhhZCB0byBiYWNrdHJhY2sgYXQgYW55IHBvaW50XG4gIGlmIChzdGF0ZS5iYWNrdHJhY2sgPT09IHRydWUpIHtcbiAgICBzdGF0ZS5vdXRwdXQgPSAnJztcblxuICAgIGZvciAoY29uc3QgdG9rZW4gb2Ygc3RhdGUudG9rZW5zKSB7XG4gICAgICBzdGF0ZS5vdXRwdXQgKz0gdG9rZW4ub3V0cHV0ICE9IG51bGwgPyB0b2tlbi5vdXRwdXQgOiB0b2tlbi52YWx1ZTtcblxuICAgICAgaWYgKHRva2VuLnN1ZmZpeCkge1xuICAgICAgICBzdGF0ZS5vdXRwdXQgKz0gdG9rZW4uc3VmZml4O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBzdGF0ZTtcbn07XG5cbi8qKlxuICogRmFzdCBwYXRocyBmb3IgY3JlYXRpbmcgcmVndWxhciBleHByZXNzaW9ucyBmb3IgY29tbW9uIGdsb2IgcGF0dGVybnMuXG4gKiBUaGlzIGNhbiBzaWduaWZpY2FudGx5IHNwZWVkIHVwIHByb2Nlc3NpbmcgYW5kIGhhcyB2ZXJ5IGxpdHRsZSBkb3duc2lkZVxuICogaW1wYWN0IHdoZW4gbm9uZSBvZiB0aGUgZmFzdCBwYXRocyBtYXRjaC5cbiAqL1xuXG5wYXJzZS5mYXN0cGF0aHMgPSAoaW5wdXQsIG9wdGlvbnMpID0+IHtcbiAgY29uc3Qgb3B0cyA9IHsgLi4ub3B0aW9ucyB9O1xuICBjb25zdCBtYXggPSB0eXBlb2Ygb3B0cy5tYXhMZW5ndGggPT09ICdudW1iZXInID8gTWF0aC5taW4oTUFYX0xFTkdUSCwgb3B0cy5tYXhMZW5ndGgpIDogTUFYX0xFTkdUSDtcbiAgY29uc3QgbGVuID0gaW5wdXQubGVuZ3RoO1xuICBpZiAobGVuID4gbWF4KSB7XG4gICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKGBJbnB1dCBsZW5ndGg6ICR7bGVufSwgZXhjZWVkcyBtYXhpbXVtIGFsbG93ZWQgbGVuZ3RoOiAke21heH1gKTtcbiAgfVxuXG4gIGlucHV0ID0gUkVQTEFDRU1FTlRTW2lucHV0XSB8fCBpbnB1dDtcbiAgY29uc3Qgd2luMzIgPSB1dGlscy5pc1dpbmRvd3Mob3B0aW9ucyk7XG5cbiAgLy8gY3JlYXRlIGNvbnN0YW50cyBiYXNlZCBvbiBwbGF0Zm9ybSwgZm9yIHdpbmRvd3Mgb3IgcG9zaXhcbiAgY29uc3Qge1xuICAgIERPVF9MSVRFUkFMLFxuICAgIFNMQVNIX0xJVEVSQUwsXG4gICAgT05FX0NIQVIsXG4gICAgRE9UU19TTEFTSCxcbiAgICBOT19ET1QsXG4gICAgTk9fRE9UUyxcbiAgICBOT19ET1RTX1NMQVNILFxuICAgIFNUQVIsXG4gICAgU1RBUlRfQU5DSE9SXG4gIH0gPSBjb25zdGFudHMuZ2xvYkNoYXJzKHdpbjMyKTtcblxuICBjb25zdCBub2RvdCA9IG9wdHMuZG90ID8gTk9fRE9UUyA6IE5PX0RPVDtcbiAgY29uc3Qgc2xhc2hEb3QgPSBvcHRzLmRvdCA/IE5PX0RPVFNfU0xBU0ggOiBOT19ET1Q7XG4gIGNvbnN0IGNhcHR1cmUgPSBvcHRzLmNhcHR1cmUgPyAnJyA6ICc/Oic7XG4gIGNvbnN0IHN0YXRlID0geyBuZWdhdGVkOiBmYWxzZSwgcHJlZml4OiAnJyB9O1xuICBsZXQgc3RhciA9IG9wdHMuYmFzaCA9PT0gdHJ1ZSA/ICcuKj8nIDogU1RBUjtcblxuICBpZiAob3B0cy5jYXB0dXJlKSB7XG4gICAgc3RhciA9IGAoJHtzdGFyfSlgO1xuICB9XG5cbiAgY29uc3QgZ2xvYnN0YXIgPSBvcHRzID0+IHtcbiAgICBpZiAob3B0cy5ub2dsb2JzdGFyID09PSB0cnVlKSByZXR1cm4gc3RhcjtcbiAgICByZXR1cm4gYCgke2NhcHR1cmV9KD86KD8hJHtTVEFSVF9BTkNIT1J9JHtvcHRzLmRvdCA/IERPVFNfU0xBU0ggOiBET1RfTElURVJBTH0pLikqPylgO1xuICB9O1xuXG4gIGNvbnN0IGNyZWF0ZSA9IHN0ciA9PiB7XG4gICAgc3dpdGNoIChzdHIpIHtcbiAgICAgIGNhc2UgJyonOlxuICAgICAgICByZXR1cm4gYCR7bm9kb3R9JHtPTkVfQ0hBUn0ke3N0YXJ9YDtcblxuICAgICAgY2FzZSAnLionOlxuICAgICAgICByZXR1cm4gYCR7RE9UX0xJVEVSQUx9JHtPTkVfQ0hBUn0ke3N0YXJ9YDtcblxuICAgICAgY2FzZSAnKi4qJzpcbiAgICAgICAgcmV0dXJuIGAke25vZG90fSR7c3Rhcn0ke0RPVF9MSVRFUkFMfSR7T05FX0NIQVJ9JHtzdGFyfWA7XG5cbiAgICAgIGNhc2UgJyovKic6XG4gICAgICAgIHJldHVybiBgJHtub2RvdH0ke3N0YXJ9JHtTTEFTSF9MSVRFUkFMfSR7T05FX0NIQVJ9JHtzbGFzaERvdH0ke3N0YXJ9YDtcblxuICAgICAgY2FzZSAnKionOlxuICAgICAgICByZXR1cm4gbm9kb3QgKyBnbG9ic3RhcihvcHRzKTtcblxuICAgICAgY2FzZSAnKiovKic6XG4gICAgICAgIHJldHVybiBgKD86JHtub2RvdH0ke2dsb2JzdGFyKG9wdHMpfSR7U0xBU0hfTElURVJBTH0pPyR7c2xhc2hEb3R9JHtPTkVfQ0hBUn0ke3N0YXJ9YDtcblxuICAgICAgY2FzZSAnKiovKi4qJzpcbiAgICAgICAgcmV0dXJuIGAoPzoke25vZG90fSR7Z2xvYnN0YXIob3B0cyl9JHtTTEFTSF9MSVRFUkFMfSk/JHtzbGFzaERvdH0ke3N0YXJ9JHtET1RfTElURVJBTH0ke09ORV9DSEFSfSR7c3Rhcn1gO1xuXG4gICAgICBjYXNlICcqKi8uKic6XG4gICAgICAgIHJldHVybiBgKD86JHtub2RvdH0ke2dsb2JzdGFyKG9wdHMpfSR7U0xBU0hfTElURVJBTH0pPyR7RE9UX0xJVEVSQUx9JHtPTkVfQ0hBUn0ke3N0YXJ9YDtcblxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICBjb25zdCBtYXRjaCA9IC9eKC4qPylcXC4oXFx3KykkLy5leGVjKHN0cik7XG4gICAgICAgIGlmICghbWF0Y2gpIHJldHVybjtcblxuICAgICAgICBjb25zdCBzb3VyY2UgPSBjcmVhdGUobWF0Y2hbMV0pO1xuICAgICAgICBpZiAoIXNvdXJjZSkgcmV0dXJuO1xuXG4gICAgICAgIHJldHVybiBzb3VyY2UgKyBET1RfTElURVJBTCArIG1hdGNoWzJdO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBjb25zdCBvdXRwdXQgPSB1dGlscy5yZW1vdmVQcmVmaXgoaW5wdXQsIHN0YXRlKTtcbiAgbGV0IHNvdXJjZSA9IGNyZWF0ZShvdXRwdXQpO1xuXG4gIGlmIChzb3VyY2UgJiYgb3B0cy5zdHJpY3RTbGFzaGVzICE9PSB0cnVlKSB7XG4gICAgc291cmNlICs9IGAke1NMQVNIX0xJVEVSQUx9P2A7XG4gIH1cblxuICByZXR1cm4gc291cmNlO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXJzZTtcbiIsICIndXNlIHN0cmljdCc7XG5cbmNvbnN0IHBhdGggPSByZXF1aXJlKCdwYXRoJyk7XG5jb25zdCBzY2FuID0gcmVxdWlyZSgnLi9zY2FuJyk7XG5jb25zdCBwYXJzZSA9IHJlcXVpcmUoJy4vcGFyc2UnKTtcbmNvbnN0IHV0aWxzID0gcmVxdWlyZSgnLi91dGlscycpO1xuY29uc3QgY29uc3RhbnRzID0gcmVxdWlyZSgnLi9jb25zdGFudHMnKTtcbmNvbnN0IGlzT2JqZWN0ID0gdmFsID0+IHZhbCAmJiB0eXBlb2YgdmFsID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheSh2YWwpO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBtYXRjaGVyIGZ1bmN0aW9uIGZyb20gb25lIG9yIG1vcmUgZ2xvYiBwYXR0ZXJucy4gVGhlXG4gKiByZXR1cm5lZCBmdW5jdGlvbiB0YWtlcyBhIHN0cmluZyB0byBtYXRjaCBhcyBpdHMgZmlyc3QgYXJndW1lbnQsXG4gKiBhbmQgcmV0dXJucyB0cnVlIGlmIHRoZSBzdHJpbmcgaXMgYSBtYXRjaC4gVGhlIHJldHVybmVkIG1hdGNoZXJcbiAqIGZ1bmN0aW9uIGFsc28gdGFrZXMgYSBib29sZWFuIGFzIHRoZSBzZWNvbmQgYXJndW1lbnQgdGhhdCwgd2hlbiB0cnVlLFxuICogcmV0dXJucyBhbiBvYmplY3Qgd2l0aCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBwaWNvbWF0Y2ggPSByZXF1aXJlKCdwaWNvbWF0Y2gnKTtcbiAqIC8vIHBpY29tYXRjaChnbG9iWywgb3B0aW9uc10pO1xuICpcbiAqIGNvbnN0IGlzTWF0Y2ggPSBwaWNvbWF0Y2goJyouISgqYSknKTtcbiAqIGNvbnNvbGUubG9nKGlzTWF0Y2goJ2EuYScpKTsgLy89PiBmYWxzZVxuICogY29uc29sZS5sb2coaXNNYXRjaCgnYS5iJykpOyAvLz0+IHRydWVcbiAqIGBgYFxuICogQG5hbWUgcGljb21hdGNoXG4gKiBAcGFyYW0ge1N0cmluZ3xBcnJheX0gYGdsb2JzYCBPbmUgb3IgbW9yZSBnbG9iIHBhdHRlcm5zLlxuICogQHBhcmFtIHtPYmplY3Q9fSBgb3B0aW9uc2BcbiAqIEByZXR1cm4ge0Z1bmN0aW9uPX0gUmV0dXJucyBhIG1hdGNoZXIgZnVuY3Rpb24uXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmNvbnN0IHBpY29tYXRjaCA9IChnbG9iLCBvcHRpb25zLCByZXR1cm5TdGF0ZSA9IGZhbHNlKSA9PiB7XG4gIGlmIChBcnJheS5pc0FycmF5KGdsb2IpKSB7XG4gICAgY29uc3QgZm5zID0gZ2xvYi5tYXAoaW5wdXQgPT4gcGljb21hdGNoKGlucHV0LCBvcHRpb25zLCByZXR1cm5TdGF0ZSkpO1xuICAgIGNvbnN0IGFycmF5TWF0Y2hlciA9IHN0ciA9PiB7XG4gICAgICBmb3IgKGNvbnN0IGlzTWF0Y2ggb2YgZm5zKSB7XG4gICAgICAgIGNvbnN0IHN0YXRlID0gaXNNYXRjaChzdHIpO1xuICAgICAgICBpZiAoc3RhdGUpIHJldHVybiBzdGF0ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuICAgIHJldHVybiBhcnJheU1hdGNoZXI7XG4gIH1cblxuICBjb25zdCBpc1N0YXRlID0gaXNPYmplY3QoZ2xvYikgJiYgZ2xvYi50b2tlbnMgJiYgZ2xvYi5pbnB1dDtcblxuICBpZiAoZ2xvYiA9PT0gJycgfHwgKHR5cGVvZiBnbG9iICE9PSAnc3RyaW5nJyAmJiAhaXNTdGF0ZSkpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBwYXR0ZXJuIHRvIGJlIGEgbm9uLWVtcHR5IHN0cmluZycpO1xuICB9XG5cbiAgY29uc3Qgb3B0cyA9IG9wdGlvbnMgfHwge307XG4gIGNvbnN0IHBvc2l4ID0gdXRpbHMuaXNXaW5kb3dzKG9wdGlvbnMpO1xuICBjb25zdCByZWdleCA9IGlzU3RhdGVcbiAgICA/IHBpY29tYXRjaC5jb21waWxlUmUoZ2xvYiwgb3B0aW9ucylcbiAgICA6IHBpY29tYXRjaC5tYWtlUmUoZ2xvYiwgb3B0aW9ucywgZmFsc2UsIHRydWUpO1xuXG4gIGNvbnN0IHN0YXRlID0gcmVnZXguc3RhdGU7XG4gIGRlbGV0ZSByZWdleC5zdGF0ZTtcblxuICBsZXQgaXNJZ25vcmVkID0gKCkgPT4gZmFsc2U7XG4gIGlmIChvcHRzLmlnbm9yZSkge1xuICAgIGNvbnN0IGlnbm9yZU9wdHMgPSB7IC4uLm9wdGlvbnMsIGlnbm9yZTogbnVsbCwgb25NYXRjaDogbnVsbCwgb25SZXN1bHQ6IG51bGwgfTtcbiAgICBpc0lnbm9yZWQgPSBwaWNvbWF0Y2gob3B0cy5pZ25vcmUsIGlnbm9yZU9wdHMsIHJldHVyblN0YXRlKTtcbiAgfVxuXG4gIGNvbnN0IG1hdGNoZXIgPSAoaW5wdXQsIHJldHVybk9iamVjdCA9IGZhbHNlKSA9PiB7XG4gICAgY29uc3QgeyBpc01hdGNoLCBtYXRjaCwgb3V0cHV0IH0gPSBwaWNvbWF0Y2gudGVzdChpbnB1dCwgcmVnZXgsIG9wdGlvbnMsIHsgZ2xvYiwgcG9zaXggfSk7XG4gICAgY29uc3QgcmVzdWx0ID0geyBnbG9iLCBzdGF0ZSwgcmVnZXgsIHBvc2l4LCBpbnB1dCwgb3V0cHV0LCBtYXRjaCwgaXNNYXRjaCB9O1xuXG4gICAgaWYgKHR5cGVvZiBvcHRzLm9uUmVzdWx0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBvcHRzLm9uUmVzdWx0KHJlc3VsdCk7XG4gICAgfVxuXG4gICAgaWYgKGlzTWF0Y2ggPT09IGZhbHNlKSB7XG4gICAgICByZXN1bHQuaXNNYXRjaCA9IGZhbHNlO1xuICAgICAgcmV0dXJuIHJldHVybk9iamVjdCA/IHJlc3VsdCA6IGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChpc0lnbm9yZWQoaW5wdXQpKSB7XG4gICAgICBpZiAodHlwZW9mIG9wdHMub25JZ25vcmUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgb3B0cy5vbklnbm9yZShyZXN1bHQpO1xuICAgICAgfVxuICAgICAgcmVzdWx0LmlzTWF0Y2ggPSBmYWxzZTtcbiAgICAgIHJldHVybiByZXR1cm5PYmplY3QgPyByZXN1bHQgOiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG9wdHMub25NYXRjaCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgb3B0cy5vbk1hdGNoKHJlc3VsdCk7XG4gICAgfVxuICAgIHJldHVybiByZXR1cm5PYmplY3QgPyByZXN1bHQgOiB0cnVlO1xuICB9O1xuXG4gIGlmIChyZXR1cm5TdGF0ZSkge1xuICAgIG1hdGNoZXIuc3RhdGUgPSBzdGF0ZTtcbiAgfVxuXG4gIHJldHVybiBtYXRjaGVyO1xufTtcblxuLyoqXG4gKiBUZXN0IGBpbnB1dGAgd2l0aCB0aGUgZ2l2ZW4gYHJlZ2V4YC4gVGhpcyBpcyB1c2VkIGJ5IHRoZSBtYWluXG4gKiBgcGljb21hdGNoKClgIGZ1bmN0aW9uIHRvIHRlc3QgdGhlIGlucHV0IHN0cmluZy5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgcGljb21hdGNoID0gcmVxdWlyZSgncGljb21hdGNoJyk7XG4gKiAvLyBwaWNvbWF0Y2gudGVzdChpbnB1dCwgcmVnZXhbLCBvcHRpb25zXSk7XG4gKlxuICogY29uc29sZS5sb2cocGljb21hdGNoLnRlc3QoJ2Zvby9iYXInLCAvXig/OihbXi9dKj8pXFwvKFteL10qPykpJC8pKTtcbiAqIC8vIHsgaXNNYXRjaDogdHJ1ZSwgbWF0Y2g6IFsgJ2Zvby8nLCAnZm9vJywgJ2JhcicgXSwgb3V0cHV0OiAnZm9vL2JhcicgfVxuICogYGBgXG4gKiBAcGFyYW0ge1N0cmluZ30gYGlucHV0YCBTdHJpbmcgdG8gdGVzdC5cbiAqIEBwYXJhbSB7UmVnRXhwfSBgcmVnZXhgXG4gKiBAcmV0dXJuIHtPYmplY3R9IFJldHVybnMgYW4gb2JqZWN0IHdpdGggbWF0Y2hpbmcgaW5mby5cbiAqIEBhcGkgcHVibGljXG4gKi9cblxucGljb21hdGNoLnRlc3QgPSAoaW5wdXQsIHJlZ2V4LCBvcHRpb25zLCB7IGdsb2IsIHBvc2l4IH0gPSB7fSkgPT4ge1xuICBpZiAodHlwZW9mIGlucHV0ICE9PSAnc3RyaW5nJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdGVkIGlucHV0IHRvIGJlIGEgc3RyaW5nJyk7XG4gIH1cblxuICBpZiAoaW5wdXQgPT09ICcnKSB7XG4gICAgcmV0dXJuIHsgaXNNYXRjaDogZmFsc2UsIG91dHB1dDogJycgfTtcbiAgfVxuXG4gIGNvbnN0IG9wdHMgPSBvcHRpb25zIHx8IHt9O1xuICBjb25zdCBmb3JtYXQgPSBvcHRzLmZvcm1hdCB8fCAocG9zaXggPyB1dGlscy50b1Bvc2l4U2xhc2hlcyA6IG51bGwpO1xuICBsZXQgbWF0Y2ggPSBpbnB1dCA9PT0gZ2xvYjtcbiAgbGV0IG91dHB1dCA9IChtYXRjaCAmJiBmb3JtYXQpID8gZm9ybWF0KGlucHV0KSA6IGlucHV0O1xuXG4gIGlmIChtYXRjaCA9PT0gZmFsc2UpIHtcbiAgICBvdXRwdXQgPSBmb3JtYXQgPyBmb3JtYXQoaW5wdXQpIDogaW5wdXQ7XG4gICAgbWF0Y2ggPSBvdXRwdXQgPT09IGdsb2I7XG4gIH1cblxuICBpZiAobWF0Y2ggPT09IGZhbHNlIHx8IG9wdHMuY2FwdHVyZSA9PT0gdHJ1ZSkge1xuICAgIGlmIChvcHRzLm1hdGNoQmFzZSA9PT0gdHJ1ZSB8fCBvcHRzLmJhc2VuYW1lID09PSB0cnVlKSB7XG4gICAgICBtYXRjaCA9IHBpY29tYXRjaC5tYXRjaEJhc2UoaW5wdXQsIHJlZ2V4LCBvcHRpb25zLCBwb3NpeCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG1hdGNoID0gcmVnZXguZXhlYyhvdXRwdXQpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7IGlzTWF0Y2g6IEJvb2xlYW4obWF0Y2gpLCBtYXRjaCwgb3V0cHV0IH07XG59O1xuXG4vKipcbiAqIE1hdGNoIHRoZSBiYXNlbmFtZSBvZiBhIGZpbGVwYXRoLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBwaWNvbWF0Y2ggPSByZXF1aXJlKCdwaWNvbWF0Y2gnKTtcbiAqIC8vIHBpY29tYXRjaC5tYXRjaEJhc2UoaW5wdXQsIGdsb2JbLCBvcHRpb25zXSk7XG4gKiBjb25zb2xlLmxvZyhwaWNvbWF0Y2gubWF0Y2hCYXNlKCdmb28vYmFyLmpzJywgJyouanMnKTsgLy8gdHJ1ZVxuICogYGBgXG4gKiBAcGFyYW0ge1N0cmluZ30gYGlucHV0YCBTdHJpbmcgdG8gdGVzdC5cbiAqIEBwYXJhbSB7UmVnRXhwfFN0cmluZ30gYGdsb2JgIEdsb2IgcGF0dGVybiBvciByZWdleCBjcmVhdGVkIGJ5IFsubWFrZVJlXSgjbWFrZVJlKS5cbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbnBpY29tYXRjaC5tYXRjaEJhc2UgPSAoaW5wdXQsIGdsb2IsIG9wdGlvbnMsIHBvc2l4ID0gdXRpbHMuaXNXaW5kb3dzKG9wdGlvbnMpKSA9PiB7XG4gIGNvbnN0IHJlZ2V4ID0gZ2xvYiBpbnN0YW5jZW9mIFJlZ0V4cCA/IGdsb2IgOiBwaWNvbWF0Y2gubWFrZVJlKGdsb2IsIG9wdGlvbnMpO1xuICByZXR1cm4gcmVnZXgudGVzdChwYXRoLmJhc2VuYW1lKGlucHV0KSk7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiAqKmFueSoqIG9mIHRoZSBnaXZlbiBnbG9iIGBwYXR0ZXJuc2AgbWF0Y2ggdGhlIHNwZWNpZmllZCBgc3RyaW5nYC5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgcGljb21hdGNoID0gcmVxdWlyZSgncGljb21hdGNoJyk7XG4gKiAvLyBwaWNvbWF0Y2guaXNNYXRjaChzdHJpbmcsIHBhdHRlcm5zWywgb3B0aW9uc10pO1xuICpcbiAqIGNvbnNvbGUubG9nKHBpY29tYXRjaC5pc01hdGNoKCdhLmEnLCBbJ2IuKicsICcqLmEnXSkpOyAvLz0+IHRydWVcbiAqIGNvbnNvbGUubG9nKHBpY29tYXRjaC5pc01hdGNoKCdhLmEnLCAnYi4qJykpOyAvLz0+IGZhbHNlXG4gKiBgYGBcbiAqIEBwYXJhbSB7U3RyaW5nfEFycmF5fSBzdHIgVGhlIHN0cmluZyB0byB0ZXN0LlxuICogQHBhcmFtIHtTdHJpbmd8QXJyYXl9IHBhdHRlcm5zIE9uZSBvciBtb3JlIGdsb2IgcGF0dGVybnMgdG8gdXNlIGZvciBtYXRjaGluZy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gU2VlIGF2YWlsYWJsZSBbb3B0aW9uc10oI29wdGlvbnMpLlxuICogQHJldHVybiB7Qm9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIGFueSBwYXR0ZXJucyBtYXRjaCBgc3RyYFxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5waWNvbWF0Y2guaXNNYXRjaCA9IChzdHIsIHBhdHRlcm5zLCBvcHRpb25zKSA9PiBwaWNvbWF0Y2gocGF0dGVybnMsIG9wdGlvbnMpKHN0cik7XG5cbi8qKlxuICogUGFyc2UgYSBnbG9iIHBhdHRlcm4gdG8gY3JlYXRlIHRoZSBzb3VyY2Ugc3RyaW5nIGZvciBhIHJlZ3VsYXJcbiAqIGV4cHJlc3Npb24uXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHBpY29tYXRjaCA9IHJlcXVpcmUoJ3BpY29tYXRjaCcpO1xuICogY29uc3QgcmVzdWx0ID0gcGljb21hdGNoLnBhcnNlKHBhdHRlcm5bLCBvcHRpb25zXSk7XG4gKiBgYGBcbiAqIEBwYXJhbSB7U3RyaW5nfSBgcGF0dGVybmBcbiAqIEBwYXJhbSB7T2JqZWN0fSBgb3B0aW9uc2BcbiAqIEByZXR1cm4ge09iamVjdH0gUmV0dXJucyBhbiBvYmplY3Qgd2l0aCB1c2VmdWwgcHJvcGVydGllcyBhbmQgb3V0cHV0IHRvIGJlIHVzZWQgYXMgYSByZWdleCBzb3VyY2Ugc3RyaW5nLlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5waWNvbWF0Y2gucGFyc2UgPSAocGF0dGVybiwgb3B0aW9ucykgPT4ge1xuICBpZiAoQXJyYXkuaXNBcnJheShwYXR0ZXJuKSkgcmV0dXJuIHBhdHRlcm4ubWFwKHAgPT4gcGljb21hdGNoLnBhcnNlKHAsIG9wdGlvbnMpKTtcbiAgcmV0dXJuIHBhcnNlKHBhdHRlcm4sIHsgLi4ub3B0aW9ucywgZmFzdHBhdGhzOiBmYWxzZSB9KTtcbn07XG5cbi8qKlxuICogU2NhbiBhIGdsb2IgcGF0dGVybiB0byBzZXBhcmF0ZSB0aGUgcGF0dGVybiBpbnRvIHNlZ21lbnRzLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBwaWNvbWF0Y2ggPSByZXF1aXJlKCdwaWNvbWF0Y2gnKTtcbiAqIC8vIHBpY29tYXRjaC5zY2FuKGlucHV0Wywgb3B0aW9uc10pO1xuICpcbiAqIGNvbnN0IHJlc3VsdCA9IHBpY29tYXRjaC5zY2FuKCchLi9mb28vKi5qcycpO1xuICogY29uc29sZS5sb2cocmVzdWx0KTtcbiAqIHsgcHJlZml4OiAnIS4vJyxcbiAqICAgaW5wdXQ6ICchLi9mb28vKi5qcycsXG4gKiAgIHN0YXJ0OiAzLFxuICogICBiYXNlOiAnZm9vJyxcbiAqICAgZ2xvYjogJyouanMnLFxuICogICBpc0JyYWNlOiBmYWxzZSxcbiAqICAgaXNCcmFja2V0OiBmYWxzZSxcbiAqICAgaXNHbG9iOiB0cnVlLFxuICogICBpc0V4dGdsb2I6IGZhbHNlLFxuICogICBpc0dsb2JzdGFyOiBmYWxzZSxcbiAqICAgbmVnYXRlZDogdHJ1ZSB9XG4gKiBgYGBcbiAqIEBwYXJhbSB7U3RyaW5nfSBgaW5wdXRgIEdsb2IgcGF0dGVybiB0byBzY2FuLlxuICogQHBhcmFtIHtPYmplY3R9IGBvcHRpb25zYFxuICogQHJldHVybiB7T2JqZWN0fSBSZXR1cm5zIGFuIG9iamVjdCB3aXRoXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbnBpY29tYXRjaC5zY2FuID0gKGlucHV0LCBvcHRpb25zKSA9PiBzY2FuKGlucHV0LCBvcHRpb25zKTtcblxuLyoqXG4gKiBDb21waWxlIGEgcmVndWxhciBleHByZXNzaW9uIGZyb20gdGhlIGBzdGF0ZWAgb2JqZWN0IHJldHVybmVkIGJ5IHRoZVxuICogW3BhcnNlKCldKCNwYXJzZSkgbWV0aG9kLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBgc3RhdGVgXG4gKiBAcGFyYW0ge09iamVjdH0gYG9wdGlvbnNgXG4gKiBAcGFyYW0ge0Jvb2xlYW59IGByZXR1cm5PdXRwdXRgIEludGVuZGVkIGZvciBpbXBsZW1lbnRvcnMsIHRoaXMgYXJndW1lbnQgYWxsb3dzIHlvdSB0byByZXR1cm4gdGhlIHJhdyBvdXRwdXQgZnJvbSB0aGUgcGFyc2VyLlxuICogQHBhcmFtIHtCb29sZWFufSBgcmV0dXJuU3RhdGVgIEFkZHMgdGhlIHN0YXRlIHRvIGEgYHN0YXRlYCBwcm9wZXJ0eSBvbiB0aGUgcmV0dXJuZWQgcmVnZXguIFVzZWZ1bCBmb3IgaW1wbGVtZW50b3JzIGFuZCBkZWJ1Z2dpbmcuXG4gKiBAcmV0dXJuIHtSZWdFeHB9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbnBpY29tYXRjaC5jb21waWxlUmUgPSAoc3RhdGUsIG9wdGlvbnMsIHJldHVybk91dHB1dCA9IGZhbHNlLCByZXR1cm5TdGF0ZSA9IGZhbHNlKSA9PiB7XG4gIGlmIChyZXR1cm5PdXRwdXQgPT09IHRydWUpIHtcbiAgICByZXR1cm4gc3RhdGUub3V0cHV0O1xuICB9XG5cbiAgY29uc3Qgb3B0cyA9IG9wdGlvbnMgfHwge307XG4gIGNvbnN0IHByZXBlbmQgPSBvcHRzLmNvbnRhaW5zID8gJycgOiAnXic7XG4gIGNvbnN0IGFwcGVuZCA9IG9wdHMuY29udGFpbnMgPyAnJyA6ICckJztcblxuICBsZXQgc291cmNlID0gYCR7cHJlcGVuZH0oPzoke3N0YXRlLm91dHB1dH0pJHthcHBlbmR9YDtcbiAgaWYgKHN0YXRlICYmIHN0YXRlLm5lZ2F0ZWQgPT09IHRydWUpIHtcbiAgICBzb3VyY2UgPSBgXig/ISR7c291cmNlfSkuKiRgO1xuICB9XG5cbiAgY29uc3QgcmVnZXggPSBwaWNvbWF0Y2gudG9SZWdleChzb3VyY2UsIG9wdGlvbnMpO1xuICBpZiAocmV0dXJuU3RhdGUgPT09IHRydWUpIHtcbiAgICByZWdleC5zdGF0ZSA9IHN0YXRlO1xuICB9XG5cbiAgcmV0dXJuIHJlZ2V4O1xufTtcblxuLyoqXG4gKiBDcmVhdGUgYSByZWd1bGFyIGV4cHJlc3Npb24gZnJvbSBhIHBhcnNlZCBnbG9iIHBhdHRlcm4uXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHBpY29tYXRjaCA9IHJlcXVpcmUoJ3BpY29tYXRjaCcpO1xuICogY29uc3Qgc3RhdGUgPSBwaWNvbWF0Y2gucGFyc2UoJyouanMnKTtcbiAqIC8vIHBpY29tYXRjaC5jb21waWxlUmUoc3RhdGVbLCBvcHRpb25zXSk7XG4gKlxuICogY29uc29sZS5sb2cocGljb21hdGNoLmNvbXBpbGVSZShzdGF0ZSkpO1xuICogLy89PiAvXig/Oig/IVxcLikoPz0uKVteL10qP1xcLmpzKSQvXG4gKiBgYGBcbiAqIEBwYXJhbSB7U3RyaW5nfSBgc3RhdGVgIFRoZSBvYmplY3QgcmV0dXJuZWQgZnJvbSB0aGUgYC5wYXJzZWAgbWV0aG9kLlxuICogQHBhcmFtIHtPYmplY3R9IGBvcHRpb25zYFxuICogQHBhcmFtIHtCb29sZWFufSBgcmV0dXJuT3V0cHV0YCBJbXBsZW1lbnRvcnMgbWF5IHVzZSB0aGlzIGFyZ3VtZW50IHRvIHJldHVybiB0aGUgY29tcGlsZWQgb3V0cHV0LCBpbnN0ZWFkIG9mIGEgcmVndWxhciBleHByZXNzaW9uLiBUaGlzIGlzIG5vdCBleHBvc2VkIG9uIHRoZSBvcHRpb25zIHRvIHByZXZlbnQgZW5kLXVzZXJzIGZyb20gbXV0YXRpbmcgdGhlIHJlc3VsdC5cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gYHJldHVyblN0YXRlYCBJbXBsZW1lbnRvcnMgbWF5IHVzZSB0aGlzIGFyZ3VtZW50IHRvIHJldHVybiB0aGUgc3RhdGUgZnJvbSB0aGUgcGFyc2VkIGdsb2Igd2l0aCB0aGUgcmV0dXJuZWQgcmVndWxhciBleHByZXNzaW9uLlxuICogQHJldHVybiB7UmVnRXhwfSBSZXR1cm5zIGEgcmVnZXggY3JlYXRlZCBmcm9tIHRoZSBnaXZlbiBwYXR0ZXJuLlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5waWNvbWF0Y2gubWFrZVJlID0gKGlucHV0LCBvcHRpb25zID0ge30sIHJldHVybk91dHB1dCA9IGZhbHNlLCByZXR1cm5TdGF0ZSA9IGZhbHNlKSA9PiB7XG4gIGlmICghaW5wdXQgfHwgdHlwZW9mIGlucHV0ICE9PSAnc3RyaW5nJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdGVkIGEgbm9uLWVtcHR5IHN0cmluZycpO1xuICB9XG5cbiAgbGV0IHBhcnNlZCA9IHsgbmVnYXRlZDogZmFsc2UsIGZhc3RwYXRoczogdHJ1ZSB9O1xuXG4gIGlmIChvcHRpb25zLmZhc3RwYXRocyAhPT0gZmFsc2UgJiYgKGlucHV0WzBdID09PSAnLicgfHwgaW5wdXRbMF0gPT09ICcqJykpIHtcbiAgICBwYXJzZWQub3V0cHV0ID0gcGFyc2UuZmFzdHBhdGhzKGlucHV0LCBvcHRpb25zKTtcbiAgfVxuXG4gIGlmICghcGFyc2VkLm91dHB1dCkge1xuICAgIHBhcnNlZCA9IHBhcnNlKGlucHV0LCBvcHRpb25zKTtcbiAgfVxuXG4gIHJldHVybiBwaWNvbWF0Y2guY29tcGlsZVJlKHBhcnNlZCwgb3B0aW9ucywgcmV0dXJuT3V0cHV0LCByZXR1cm5TdGF0ZSk7XG59O1xuXG4vKipcbiAqIENyZWF0ZSBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBmcm9tIHRoZSBnaXZlbiByZWdleCBzb3VyY2Ugc3RyaW5nLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBwaWNvbWF0Y2ggPSByZXF1aXJlKCdwaWNvbWF0Y2gnKTtcbiAqIC8vIHBpY29tYXRjaC50b1JlZ2V4KHNvdXJjZVssIG9wdGlvbnNdKTtcbiAqXG4gKiBjb25zdCB7IG91dHB1dCB9ID0gcGljb21hdGNoLnBhcnNlKCcqLmpzJyk7XG4gKiBjb25zb2xlLmxvZyhwaWNvbWF0Y2gudG9SZWdleChvdXRwdXQpKTtcbiAqIC8vPT4gL14oPzooPyFcXC4pKD89LilbXi9dKj9cXC5qcykkL1xuICogYGBgXG4gKiBAcGFyYW0ge1N0cmluZ30gYHNvdXJjZWAgUmVndWxhciBleHByZXNzaW9uIHNvdXJjZSBzdHJpbmcuXG4gKiBAcGFyYW0ge09iamVjdH0gYG9wdGlvbnNgXG4gKiBAcmV0dXJuIHtSZWdFeHB9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbnBpY29tYXRjaC50b1JlZ2V4ID0gKHNvdXJjZSwgb3B0aW9ucykgPT4ge1xuICB0cnkge1xuICAgIGNvbnN0IG9wdHMgPSBvcHRpb25zIHx8IHt9O1xuICAgIHJldHVybiBuZXcgUmVnRXhwKHNvdXJjZSwgb3B0cy5mbGFncyB8fCAob3B0cy5ub2Nhc2UgPyAnaScgOiAnJykpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLmRlYnVnID09PSB0cnVlKSB0aHJvdyBlcnI7XG4gICAgcmV0dXJuIC8kXi87XG4gIH1cbn07XG5cbi8qKlxuICogUGljb21hdGNoIGNvbnN0YW50cy5cbiAqIEByZXR1cm4ge09iamVjdH1cbiAqL1xuXG5waWNvbWF0Y2guY29uc3RhbnRzID0gY29uc3RhbnRzO1xuXG4vKipcbiAqIEV4cG9zZSBcInBpY29tYXRjaFwiXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBwaWNvbWF0Y2g7XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vbGliL3BpY29tYXRjaCcpO1xuIiwgIid1c2Ugc3RyaWN0JztcblxuY29uc3QgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTtcbmNvbnN0IGJyYWNlcyA9IHJlcXVpcmUoJ2JyYWNlcycpO1xuY29uc3QgcGljb21hdGNoID0gcmVxdWlyZSgncGljb21hdGNoJyk7XG5jb25zdCB1dGlscyA9IHJlcXVpcmUoJ3BpY29tYXRjaC9saWIvdXRpbHMnKTtcbmNvbnN0IGlzRW1wdHlTdHJpbmcgPSB2YWwgPT4gdmFsID09PSAnJyB8fCB2YWwgPT09ICcuLyc7XG5cbi8qKlxuICogUmV0dXJucyBhbiBhcnJheSBvZiBzdHJpbmdzIHRoYXQgbWF0Y2ggb25lIG9yIG1vcmUgZ2xvYiBwYXR0ZXJucy5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgbW0gPSByZXF1aXJlKCdtaWNyb21hdGNoJyk7XG4gKiAvLyBtbShsaXN0LCBwYXR0ZXJuc1ssIG9wdGlvbnNdKTtcbiAqXG4gKiBjb25zb2xlLmxvZyhtbShbJ2EuanMnLCAnYS50eHQnXSwgWycqLmpzJ10pKTtcbiAqIC8vPT4gWyAnYS5qcycgXVxuICogYGBgXG4gKiBAcGFyYW0ge1N0cmluZ3xBcnJheTxzdHJpbmc+fSBgbGlzdGAgTGlzdCBvZiBzdHJpbmdzIHRvIG1hdGNoLlxuICogQHBhcmFtIHtTdHJpbmd8QXJyYXk8c3RyaW5nPn0gYHBhdHRlcm5zYCBPbmUgb3IgbW9yZSBnbG9iIHBhdHRlcm5zIHRvIHVzZSBmb3IgbWF0Y2hpbmcuXG4gKiBAcGFyYW0ge09iamVjdH0gYG9wdGlvbnNgIFNlZSBhdmFpbGFibGUgW29wdGlvbnNdKCNvcHRpb25zKVxuICogQHJldHVybiB7QXJyYXl9IFJldHVybnMgYW4gYXJyYXkgb2YgbWF0Y2hlc1xuICogQHN1bW1hcnkgZmFsc2VcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuY29uc3QgbWljcm9tYXRjaCA9IChsaXN0LCBwYXR0ZXJucywgb3B0aW9ucykgPT4ge1xuICBwYXR0ZXJucyA9IFtdLmNvbmNhdChwYXR0ZXJucyk7XG4gIGxpc3QgPSBbXS5jb25jYXQobGlzdCk7XG5cbiAgbGV0IG9taXQgPSBuZXcgU2V0KCk7XG4gIGxldCBrZWVwID0gbmV3IFNldCgpO1xuICBsZXQgaXRlbXMgPSBuZXcgU2V0KCk7XG4gIGxldCBuZWdhdGl2ZXMgPSAwO1xuXG4gIGxldCBvblJlc3VsdCA9IHN0YXRlID0+IHtcbiAgICBpdGVtcy5hZGQoc3RhdGUub3V0cHV0KTtcbiAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLm9uUmVzdWx0KSB7XG4gICAgICBvcHRpb25zLm9uUmVzdWx0KHN0YXRlKTtcbiAgICB9XG4gIH07XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXR0ZXJucy5sZW5ndGg7IGkrKykge1xuICAgIGxldCBpc01hdGNoID0gcGljb21hdGNoKFN0cmluZyhwYXR0ZXJuc1tpXSksIHsgLi4ub3B0aW9ucywgb25SZXN1bHQgfSwgdHJ1ZSk7XG4gICAgbGV0IG5lZ2F0ZWQgPSBpc01hdGNoLnN0YXRlLm5lZ2F0ZWQgfHwgaXNNYXRjaC5zdGF0ZS5uZWdhdGVkRXh0Z2xvYjtcbiAgICBpZiAobmVnYXRlZCkgbmVnYXRpdmVzKys7XG5cbiAgICBmb3IgKGxldCBpdGVtIG9mIGxpc3QpIHtcbiAgICAgIGxldCBtYXRjaGVkID0gaXNNYXRjaChpdGVtLCB0cnVlKTtcblxuICAgICAgbGV0IG1hdGNoID0gbmVnYXRlZCA/ICFtYXRjaGVkLmlzTWF0Y2ggOiBtYXRjaGVkLmlzTWF0Y2g7XG4gICAgICBpZiAoIW1hdGNoKSBjb250aW51ZTtcblxuICAgICAgaWYgKG5lZ2F0ZWQpIHtcbiAgICAgICAgb21pdC5hZGQobWF0Y2hlZC5vdXRwdXQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb21pdC5kZWxldGUobWF0Y2hlZC5vdXRwdXQpO1xuICAgICAgICBrZWVwLmFkZChtYXRjaGVkLm91dHB1dCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgbGV0IHJlc3VsdCA9IG5lZ2F0aXZlcyA9PT0gcGF0dGVybnMubGVuZ3RoID8gWy4uLml0ZW1zXSA6IFsuLi5rZWVwXTtcbiAgbGV0IG1hdGNoZXMgPSByZXN1bHQuZmlsdGVyKGl0ZW0gPT4gIW9taXQuaGFzKGl0ZW0pKTtcblxuICBpZiAob3B0aW9ucyAmJiBtYXRjaGVzLmxlbmd0aCA9PT0gMCkge1xuICAgIGlmIChvcHRpb25zLmZhaWxnbG9iID09PSB0cnVlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIG1hdGNoZXMgZm91bmQgZm9yIFwiJHtwYXR0ZXJucy5qb2luKCcsICcpfVwiYCk7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMubm9udWxsID09PSB0cnVlIHx8IG9wdGlvbnMubnVsbGdsb2IgPT09IHRydWUpIHtcbiAgICAgIHJldHVybiBvcHRpb25zLnVuZXNjYXBlID8gcGF0dGVybnMubWFwKHAgPT4gcC5yZXBsYWNlKC9cXFxcL2csICcnKSkgOiBwYXR0ZXJucztcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbWF0Y2hlcztcbn07XG5cbi8qKlxuICogQmFja3dhcmRzIGNvbXBhdGliaWxpdHlcbiAqL1xuXG5taWNyb21hdGNoLm1hdGNoID0gbWljcm9tYXRjaDtcblxuLyoqXG4gKiBSZXR1cm5zIGEgbWF0Y2hlciBmdW5jdGlvbiBmcm9tIHRoZSBnaXZlbiBnbG9iIGBwYXR0ZXJuYCBhbmQgYG9wdGlvbnNgLlxuICogVGhlIHJldHVybmVkIGZ1bmN0aW9uIHRha2VzIGEgc3RyaW5nIHRvIG1hdGNoIGFzIGl0cyBvbmx5IGFyZ3VtZW50IGFuZCByZXR1cm5zXG4gKiB0cnVlIGlmIHRoZSBzdHJpbmcgaXMgYSBtYXRjaC5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgbW0gPSByZXF1aXJlKCdtaWNyb21hdGNoJyk7XG4gKiAvLyBtbS5tYXRjaGVyKHBhdHRlcm5bLCBvcHRpb25zXSk7XG4gKlxuICogY29uc3QgaXNNYXRjaCA9IG1tLm1hdGNoZXIoJyouISgqYSknKTtcbiAqIGNvbnNvbGUubG9nKGlzTWF0Y2goJ2EuYScpKTsgLy89PiBmYWxzZVxuICogY29uc29sZS5sb2coaXNNYXRjaCgnYS5iJykpOyAvLz0+IHRydWVcbiAqIGBgYFxuICogQHBhcmFtIHtTdHJpbmd9IGBwYXR0ZXJuYCBHbG9iIHBhdHRlcm5cbiAqIEBwYXJhbSB7T2JqZWN0fSBgb3B0aW9uc2BcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBSZXR1cm5zIGEgbWF0Y2hlciBmdW5jdGlvbi5cbiAqIEBhcGkgcHVibGljXG4gKi9cblxubWljcm9tYXRjaC5tYXRjaGVyID0gKHBhdHRlcm4sIG9wdGlvbnMpID0+IHBpY29tYXRjaChwYXR0ZXJuLCBvcHRpb25zKTtcblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgKiphbnkqKiBvZiB0aGUgZ2l2ZW4gZ2xvYiBgcGF0dGVybnNgIG1hdGNoIHRoZSBzcGVjaWZpZWQgYHN0cmluZ2AuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IG1tID0gcmVxdWlyZSgnbWljcm9tYXRjaCcpO1xuICogLy8gbW0uaXNNYXRjaChzdHJpbmcsIHBhdHRlcm5zWywgb3B0aW9uc10pO1xuICpcbiAqIGNvbnNvbGUubG9nKG1tLmlzTWF0Y2goJ2EuYScsIFsnYi4qJywgJyouYSddKSk7IC8vPT4gdHJ1ZVxuICogY29uc29sZS5sb2cobW0uaXNNYXRjaCgnYS5hJywgJ2IuKicpKTsgLy89PiBmYWxzZVxuICogYGBgXG4gKiBAcGFyYW0ge1N0cmluZ30gYHN0cmAgVGhlIHN0cmluZyB0byB0ZXN0LlxuICogQHBhcmFtIHtTdHJpbmd8QXJyYXl9IGBwYXR0ZXJuc2AgT25lIG9yIG1vcmUgZ2xvYiBwYXR0ZXJucyB0byB1c2UgZm9yIG1hdGNoaW5nLlxuICogQHBhcmFtIHtPYmplY3R9IGBbb3B0aW9uc11gIFNlZSBhdmFpbGFibGUgW29wdGlvbnNdKCNvcHRpb25zKS5cbiAqIEByZXR1cm4ge0Jvb2xlYW59IFJldHVybnMgdHJ1ZSBpZiBhbnkgcGF0dGVybnMgbWF0Y2ggYHN0cmBcbiAqIEBhcGkgcHVibGljXG4gKi9cblxubWljcm9tYXRjaC5pc01hdGNoID0gKHN0ciwgcGF0dGVybnMsIG9wdGlvbnMpID0+IHBpY29tYXRjaChwYXR0ZXJucywgb3B0aW9ucykoc3RyKTtcblxuLyoqXG4gKiBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuICovXG5cbm1pY3JvbWF0Y2guYW55ID0gbWljcm9tYXRjaC5pc01hdGNoO1xuXG4vKipcbiAqIFJldHVybnMgYSBsaXN0IG9mIHN0cmluZ3MgdGhhdCBfKipkbyBub3QgbWF0Y2ggYW55KipfIG9mIHRoZSBnaXZlbiBgcGF0dGVybnNgLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBtbSA9IHJlcXVpcmUoJ21pY3JvbWF0Y2gnKTtcbiAqIC8vIG1tLm5vdChsaXN0LCBwYXR0ZXJuc1ssIG9wdGlvbnNdKTtcbiAqXG4gKiBjb25zb2xlLmxvZyhtbS5ub3QoWydhLmEnLCAnYi5iJywgJ2MuYyddLCAnKi5hJykpO1xuICogLy89PiBbJ2IuYicsICdjLmMnXVxuICogYGBgXG4gKiBAcGFyYW0ge0FycmF5fSBgbGlzdGAgQXJyYXkgb2Ygc3RyaW5ncyB0byBtYXRjaC5cbiAqIEBwYXJhbSB7U3RyaW5nfEFycmF5fSBgcGF0dGVybnNgIE9uZSBvciBtb3JlIGdsb2IgcGF0dGVybiB0byB1c2UgZm9yIG1hdGNoaW5nLlxuICogQHBhcmFtIHtPYmplY3R9IGBvcHRpb25zYCBTZWUgYXZhaWxhYmxlIFtvcHRpb25zXSgjb3B0aW9ucykgZm9yIGNoYW5naW5nIGhvdyBtYXRjaGVzIGFyZSBwZXJmb3JtZWRcbiAqIEByZXR1cm4ge0FycmF5fSBSZXR1cm5zIGFuIGFycmF5IG9mIHN0cmluZ3MgdGhhdCAqKmRvIG5vdCBtYXRjaCoqIHRoZSBnaXZlbiBwYXR0ZXJucy5cbiAqIEBhcGkgcHVibGljXG4gKi9cblxubWljcm9tYXRjaC5ub3QgPSAobGlzdCwgcGF0dGVybnMsIG9wdGlvbnMgPSB7fSkgPT4ge1xuICBwYXR0ZXJucyA9IFtdLmNvbmNhdChwYXR0ZXJucykubWFwKFN0cmluZyk7XG4gIGxldCByZXN1bHQgPSBuZXcgU2V0KCk7XG4gIGxldCBpdGVtcyA9IFtdO1xuXG4gIGxldCBvblJlc3VsdCA9IHN0YXRlID0+IHtcbiAgICBpZiAob3B0aW9ucy5vblJlc3VsdCkgb3B0aW9ucy5vblJlc3VsdChzdGF0ZSk7XG4gICAgaXRlbXMucHVzaChzdGF0ZS5vdXRwdXQpO1xuICB9O1xuXG4gIGxldCBtYXRjaGVzID0gbmV3IFNldChtaWNyb21hdGNoKGxpc3QsIHBhdHRlcm5zLCB7IC4uLm9wdGlvbnMsIG9uUmVzdWx0IH0pKTtcblxuICBmb3IgKGxldCBpdGVtIG9mIGl0ZW1zKSB7XG4gICAgaWYgKCFtYXRjaGVzLmhhcyhpdGVtKSkge1xuICAgICAgcmVzdWx0LmFkZChpdGVtKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIFsuLi5yZXN1bHRdO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIGBzdHJpbmdgIGNvbnRhaW5zIHRoZSBnaXZlbiBwYXR0ZXJuLiBTaW1pbGFyXG4gKiB0byBbLmlzTWF0Y2hdKCNpc01hdGNoKSBidXQgdGhlIHBhdHRlcm4gY2FuIG1hdGNoIGFueSBwYXJ0IG9mIHRoZSBzdHJpbmcuXG4gKlxuICogYGBganNcbiAqIHZhciBtbSA9IHJlcXVpcmUoJ21pY3JvbWF0Y2gnKTtcbiAqIC8vIG1tLmNvbnRhaW5zKHN0cmluZywgcGF0dGVyblssIG9wdGlvbnNdKTtcbiAqXG4gKiBjb25zb2xlLmxvZyhtbS5jb250YWlucygnYWEvYmIvY2MnLCAnKmInKSk7XG4gKiAvLz0+IHRydWVcbiAqIGNvbnNvbGUubG9nKG1tLmNvbnRhaW5zKCdhYS9iYi9jYycsICcqZCcpKTtcbiAqIC8vPT4gZmFsc2VcbiAqIGBgYFxuICogQHBhcmFtIHtTdHJpbmd9IGBzdHJgIFRoZSBzdHJpbmcgdG8gbWF0Y2guXG4gKiBAcGFyYW0ge1N0cmluZ3xBcnJheX0gYHBhdHRlcm5zYCBHbG9iIHBhdHRlcm4gdG8gdXNlIGZvciBtYXRjaGluZy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBgb3B0aW9uc2AgU2VlIGF2YWlsYWJsZSBbb3B0aW9uc10oI29wdGlvbnMpIGZvciBjaGFuZ2luZyBob3cgbWF0Y2hlcyBhcmUgcGVyZm9ybWVkXG4gKiBAcmV0dXJuIHtCb29sZWFufSBSZXR1cm5zIHRydWUgaWYgYW55IG9mIHRoZSBwYXR0ZXJucyBtYXRjaGVzIGFueSBwYXJ0IG9mIGBzdHJgLlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5taWNyb21hdGNoLmNvbnRhaW5zID0gKHN0ciwgcGF0dGVybiwgb3B0aW9ucykgPT4ge1xuICBpZiAodHlwZW9mIHN0ciAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBFeHBlY3RlZCBhIHN0cmluZzogXCIke3V0aWwuaW5zcGVjdChzdHIpfVwiYCk7XG4gIH1cblxuICBpZiAoQXJyYXkuaXNBcnJheShwYXR0ZXJuKSkge1xuICAgIHJldHVybiBwYXR0ZXJuLnNvbWUocCA9PiBtaWNyb21hdGNoLmNvbnRhaW5zKHN0ciwgcCwgb3B0aW9ucykpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBwYXR0ZXJuID09PSAnc3RyaW5nJykge1xuICAgIGlmIChpc0VtcHR5U3RyaW5nKHN0cikgfHwgaXNFbXB0eVN0cmluZyhwYXR0ZXJuKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChzdHIuaW5jbHVkZXMocGF0dGVybikgfHwgKHN0ci5zdGFydHNXaXRoKCcuLycpICYmIHN0ci5zbGljZSgyKS5pbmNsdWRlcyhwYXR0ZXJuKSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBtaWNyb21hdGNoLmlzTWF0Y2goc3RyLCBwYXR0ZXJuLCB7IC4uLm9wdGlvbnMsIGNvbnRhaW5zOiB0cnVlIH0pO1xufTtcblxuLyoqXG4gKiBGaWx0ZXIgdGhlIGtleXMgb2YgdGhlIGdpdmVuIG9iamVjdCB3aXRoIHRoZSBnaXZlbiBgZ2xvYmAgcGF0dGVyblxuICogYW5kIGBvcHRpb25zYC4gRG9lcyBub3QgYXR0ZW1wdCB0byBtYXRjaCBuZXN0ZWQga2V5cy4gSWYgeW91IG5lZWQgdGhpcyBmZWF0dXJlLFxuICogdXNlIFtnbG9iLW9iamVjdF1bXSBpbnN0ZWFkLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBtbSA9IHJlcXVpcmUoJ21pY3JvbWF0Y2gnKTtcbiAqIC8vIG1tLm1hdGNoS2V5cyhvYmplY3QsIHBhdHRlcm5zWywgb3B0aW9uc10pO1xuICpcbiAqIGNvbnN0IG9iaiA9IHsgYWE6ICdhJywgYWI6ICdiJywgYWM6ICdjJyB9O1xuICogY29uc29sZS5sb2cobW0ubWF0Y2hLZXlzKG9iaiwgJypiJykpO1xuICogLy89PiB7IGFiOiAnYicgfVxuICogYGBgXG4gKiBAcGFyYW0ge09iamVjdH0gYG9iamVjdGAgVGhlIG9iamVjdCB3aXRoIGtleXMgdG8gZmlsdGVyLlxuICogQHBhcmFtIHtTdHJpbmd8QXJyYXl9IGBwYXR0ZXJuc2AgT25lIG9yIG1vcmUgZ2xvYiBwYXR0ZXJucyB0byB1c2UgZm9yIG1hdGNoaW5nLlxuICogQHBhcmFtIHtPYmplY3R9IGBvcHRpb25zYCBTZWUgYXZhaWxhYmxlIFtvcHRpb25zXSgjb3B0aW9ucykgZm9yIGNoYW5naW5nIGhvdyBtYXRjaGVzIGFyZSBwZXJmb3JtZWRcbiAqIEByZXR1cm4ge09iamVjdH0gUmV0dXJucyBhbiBvYmplY3Qgd2l0aCBvbmx5IGtleXMgdGhhdCBtYXRjaCB0aGUgZ2l2ZW4gcGF0dGVybnMuXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbm1pY3JvbWF0Y2gubWF0Y2hLZXlzID0gKG9iaiwgcGF0dGVybnMsIG9wdGlvbnMpID0+IHtcbiAgaWYgKCF1dGlscy5pc09iamVjdChvYmopKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgdGhlIGZpcnN0IGFyZ3VtZW50IHRvIGJlIGFuIG9iamVjdCcpO1xuICB9XG4gIGxldCBrZXlzID0gbWljcm9tYXRjaChPYmplY3Qua2V5cyhvYmopLCBwYXR0ZXJucywgb3B0aW9ucyk7XG4gIGxldCByZXMgPSB7fTtcbiAgZm9yIChsZXQga2V5IG9mIGtleXMpIHJlc1trZXldID0gb2JqW2tleV07XG4gIHJldHVybiByZXM7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiBzb21lIG9mIHRoZSBzdHJpbmdzIGluIHRoZSBnaXZlbiBgbGlzdGAgbWF0Y2ggYW55IG9mIHRoZSBnaXZlbiBnbG9iIGBwYXR0ZXJuc2AuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IG1tID0gcmVxdWlyZSgnbWljcm9tYXRjaCcpO1xuICogLy8gbW0uc29tZShsaXN0LCBwYXR0ZXJuc1ssIG9wdGlvbnNdKTtcbiAqXG4gKiBjb25zb2xlLmxvZyhtbS5zb21lKFsnZm9vLmpzJywgJ2Jhci5qcyddLCBbJyouanMnLCAnIWZvby5qcyddKSk7XG4gKiAvLyB0cnVlXG4gKiBjb25zb2xlLmxvZyhtbS5zb21lKFsnZm9vLmpzJ10sIFsnKi5qcycsICchZm9vLmpzJ10pKTtcbiAqIC8vIGZhbHNlXG4gKiBgYGBcbiAqIEBwYXJhbSB7U3RyaW5nfEFycmF5fSBgbGlzdGAgVGhlIHN0cmluZyBvciBhcnJheSBvZiBzdHJpbmdzIHRvIHRlc3QuIFJldHVybnMgYXMgc29vbiBhcyB0aGUgZmlyc3QgbWF0Y2ggaXMgZm91bmQuXG4gKiBAcGFyYW0ge1N0cmluZ3xBcnJheX0gYHBhdHRlcm5zYCBPbmUgb3IgbW9yZSBnbG9iIHBhdHRlcm5zIHRvIHVzZSBmb3IgbWF0Y2hpbmcuXG4gKiBAcGFyYW0ge09iamVjdH0gYG9wdGlvbnNgIFNlZSBhdmFpbGFibGUgW29wdGlvbnNdKCNvcHRpb25zKSBmb3IgY2hhbmdpbmcgaG93IG1hdGNoZXMgYXJlIHBlcmZvcm1lZFxuICogQHJldHVybiB7Qm9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIGFueSBgcGF0dGVybnNgIG1hdGNoZXMgYW55IG9mIHRoZSBzdHJpbmdzIGluIGBsaXN0YFxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5taWNyb21hdGNoLnNvbWUgPSAobGlzdCwgcGF0dGVybnMsIG9wdGlvbnMpID0+IHtcbiAgbGV0IGl0ZW1zID0gW10uY29uY2F0KGxpc3QpO1xuXG4gIGZvciAobGV0IHBhdHRlcm4gb2YgW10uY29uY2F0KHBhdHRlcm5zKSkge1xuICAgIGxldCBpc01hdGNoID0gcGljb21hdGNoKFN0cmluZyhwYXR0ZXJuKSwgb3B0aW9ucyk7XG4gICAgaWYgKGl0ZW1zLnNvbWUoaXRlbSA9PiBpc01hdGNoKGl0ZW0pKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn07XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIGV2ZXJ5IHN0cmluZyBpbiB0aGUgZ2l2ZW4gYGxpc3RgIG1hdGNoZXNcbiAqIGFueSBvZiB0aGUgZ2l2ZW4gZ2xvYiBgcGF0dGVybnNgLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBtbSA9IHJlcXVpcmUoJ21pY3JvbWF0Y2gnKTtcbiAqIC8vIG1tLmV2ZXJ5KGxpc3QsIHBhdHRlcm5zWywgb3B0aW9uc10pO1xuICpcbiAqIGNvbnNvbGUubG9nKG1tLmV2ZXJ5KCdmb28uanMnLCBbJ2Zvby5qcyddKSk7XG4gKiAvLyB0cnVlXG4gKiBjb25zb2xlLmxvZyhtbS5ldmVyeShbJ2Zvby5qcycsICdiYXIuanMnXSwgWycqLmpzJ10pKTtcbiAqIC8vIHRydWVcbiAqIGNvbnNvbGUubG9nKG1tLmV2ZXJ5KFsnZm9vLmpzJywgJ2Jhci5qcyddLCBbJyouanMnLCAnIWZvby5qcyddKSk7XG4gKiAvLyBmYWxzZVxuICogY29uc29sZS5sb2cobW0uZXZlcnkoWydmb28uanMnXSwgWycqLmpzJywgJyFmb28uanMnXSkpO1xuICogLy8gZmFsc2VcbiAqIGBgYFxuICogQHBhcmFtIHtTdHJpbmd8QXJyYXl9IGBsaXN0YCBUaGUgc3RyaW5nIG9yIGFycmF5IG9mIHN0cmluZ3MgdG8gdGVzdC5cbiAqIEBwYXJhbSB7U3RyaW5nfEFycmF5fSBgcGF0dGVybnNgIE9uZSBvciBtb3JlIGdsb2IgcGF0dGVybnMgdG8gdXNlIGZvciBtYXRjaGluZy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBgb3B0aW9uc2AgU2VlIGF2YWlsYWJsZSBbb3B0aW9uc10oI29wdGlvbnMpIGZvciBjaGFuZ2luZyBob3cgbWF0Y2hlcyBhcmUgcGVyZm9ybWVkXG4gKiBAcmV0dXJuIHtCb29sZWFufSBSZXR1cm5zIHRydWUgaWYgYWxsIGBwYXR0ZXJuc2AgbWF0Y2hlcyBhbGwgb2YgdGhlIHN0cmluZ3MgaW4gYGxpc3RgXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbm1pY3JvbWF0Y2guZXZlcnkgPSAobGlzdCwgcGF0dGVybnMsIG9wdGlvbnMpID0+IHtcbiAgbGV0IGl0ZW1zID0gW10uY29uY2F0KGxpc3QpO1xuXG4gIGZvciAobGV0IHBhdHRlcm4gb2YgW10uY29uY2F0KHBhdHRlcm5zKSkge1xuICAgIGxldCBpc01hdGNoID0gcGljb21hdGNoKFN0cmluZyhwYXR0ZXJuKSwgb3B0aW9ucyk7XG4gICAgaWYgKCFpdGVtcy5ldmVyeShpdGVtID0+IGlzTWF0Y2goaXRlbSkpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgKiphbGwqKiBvZiB0aGUgZ2l2ZW4gYHBhdHRlcm5zYCBtYXRjaFxuICogdGhlIHNwZWNpZmllZCBzdHJpbmcuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IG1tID0gcmVxdWlyZSgnbWljcm9tYXRjaCcpO1xuICogLy8gbW0uYWxsKHN0cmluZywgcGF0dGVybnNbLCBvcHRpb25zXSk7XG4gKlxuICogY29uc29sZS5sb2cobW0uYWxsKCdmb28uanMnLCBbJ2Zvby5qcyddKSk7XG4gKiAvLyB0cnVlXG4gKlxuICogY29uc29sZS5sb2cobW0uYWxsKCdmb28uanMnLCBbJyouanMnLCAnIWZvby5qcyddKSk7XG4gKiAvLyBmYWxzZVxuICpcbiAqIGNvbnNvbGUubG9nKG1tLmFsbCgnZm9vLmpzJywgWycqLmpzJywgJ2Zvby5qcyddKSk7XG4gKiAvLyB0cnVlXG4gKlxuICogY29uc29sZS5sb2cobW0uYWxsKCdmb28uanMnLCBbJyouanMnLCAnZionLCAnKm8qJywgJypvLmpzJ10pKTtcbiAqIC8vIHRydWVcbiAqIGBgYFxuICogQHBhcmFtIHtTdHJpbmd8QXJyYXl9IGBzdHJgIFRoZSBzdHJpbmcgdG8gdGVzdC5cbiAqIEBwYXJhbSB7U3RyaW5nfEFycmF5fSBgcGF0dGVybnNgIE9uZSBvciBtb3JlIGdsb2IgcGF0dGVybnMgdG8gdXNlIGZvciBtYXRjaGluZy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBgb3B0aW9uc2AgU2VlIGF2YWlsYWJsZSBbb3B0aW9uc10oI29wdGlvbnMpIGZvciBjaGFuZ2luZyBob3cgbWF0Y2hlcyBhcmUgcGVyZm9ybWVkXG4gKiBAcmV0dXJuIHtCb29sZWFufSBSZXR1cm5zIHRydWUgaWYgYW55IHBhdHRlcm5zIG1hdGNoIGBzdHJgXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbm1pY3JvbWF0Y2guYWxsID0gKHN0ciwgcGF0dGVybnMsIG9wdGlvbnMpID0+IHtcbiAgaWYgKHR5cGVvZiBzdHIgIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgRXhwZWN0ZWQgYSBzdHJpbmc6IFwiJHt1dGlsLmluc3BlY3Qoc3RyKX1cImApO1xuICB9XG5cbiAgcmV0dXJuIFtdLmNvbmNhdChwYXR0ZXJucykuZXZlcnkocCA9PiBwaWNvbWF0Y2gocCwgb3B0aW9ucykoc3RyKSk7XG59O1xuXG4vKipcbiAqIFJldHVybnMgYW4gYXJyYXkgb2YgbWF0Y2hlcyBjYXB0dXJlZCBieSBgcGF0dGVybmAgaW4gYHN0cmluZywgb3IgYG51bGxgIGlmIHRoZSBwYXR0ZXJuIGRpZCBub3QgbWF0Y2guXG4gKlxuICogYGBganNcbiAqIGNvbnN0IG1tID0gcmVxdWlyZSgnbWljcm9tYXRjaCcpO1xuICogLy8gbW0uY2FwdHVyZShwYXR0ZXJuLCBzdHJpbmdbLCBvcHRpb25zXSk7XG4gKlxuICogY29uc29sZS5sb2cobW0uY2FwdHVyZSgndGVzdC8qLmpzJywgJ3Rlc3QvZm9vLmpzJykpO1xuICogLy89PiBbJ2ZvbyddXG4gKiBjb25zb2xlLmxvZyhtbS5jYXB0dXJlKCd0ZXN0LyouanMnLCAnZm9vL2Jhci5jc3MnKSk7XG4gKiAvLz0+IG51bGxcbiAqIGBgYFxuICogQHBhcmFtIHtTdHJpbmd9IGBnbG9iYCBHbG9iIHBhdHRlcm4gdG8gdXNlIGZvciBtYXRjaGluZy5cbiAqIEBwYXJhbSB7U3RyaW5nfSBgaW5wdXRgIFN0cmluZyB0byBtYXRjaFxuICogQHBhcmFtIHtPYmplY3R9IGBvcHRpb25zYCBTZWUgYXZhaWxhYmxlIFtvcHRpb25zXSgjb3B0aW9ucykgZm9yIGNoYW5naW5nIGhvdyBtYXRjaGVzIGFyZSBwZXJmb3JtZWRcbiAqIEByZXR1cm4ge0FycmF5fG51bGx9IFJldHVybnMgYW4gYXJyYXkgb2YgY2FwdHVyZXMgaWYgdGhlIGlucHV0IG1hdGNoZXMgdGhlIGdsb2IgcGF0dGVybiwgb3RoZXJ3aXNlIGBudWxsYC5cbiAqIEBhcGkgcHVibGljXG4gKi9cblxubWljcm9tYXRjaC5jYXB0dXJlID0gKGdsb2IsIGlucHV0LCBvcHRpb25zKSA9PiB7XG4gIGxldCBwb3NpeCA9IHV0aWxzLmlzV2luZG93cyhvcHRpb25zKTtcbiAgbGV0IHJlZ2V4ID0gcGljb21hdGNoLm1ha2VSZShTdHJpbmcoZ2xvYiksIHsgLi4ub3B0aW9ucywgY2FwdHVyZTogdHJ1ZSB9KTtcbiAgbGV0IG1hdGNoID0gcmVnZXguZXhlYyhwb3NpeCA/IHV0aWxzLnRvUG9zaXhTbGFzaGVzKGlucHV0KSA6IGlucHV0KTtcblxuICBpZiAobWF0Y2gpIHtcbiAgICByZXR1cm4gbWF0Y2guc2xpY2UoMSkubWFwKHYgPT4gdiA9PT0gdm9pZCAwID8gJycgOiB2KTtcbiAgfVxufTtcblxuLyoqXG4gKiBDcmVhdGUgYSByZWd1bGFyIGV4cHJlc3Npb24gZnJvbSB0aGUgZ2l2ZW4gZ2xvYiBgcGF0dGVybmAuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IG1tID0gcmVxdWlyZSgnbWljcm9tYXRjaCcpO1xuICogLy8gbW0ubWFrZVJlKHBhdHRlcm5bLCBvcHRpb25zXSk7XG4gKlxuICogY29uc29sZS5sb2cobW0ubWFrZVJlKCcqLmpzJykpO1xuICogLy89PiAvXig/OihcXC5bXFxcXFxcL10pPyg/IVxcLikoPz0uKVteXFwvXSo/XFwuanMpJC9cbiAqIGBgYFxuICogQHBhcmFtIHtTdHJpbmd9IGBwYXR0ZXJuYCBBIGdsb2IgcGF0dGVybiB0byBjb252ZXJ0IHRvIHJlZ2V4LlxuICogQHBhcmFtIHtPYmplY3R9IGBvcHRpb25zYFxuICogQHJldHVybiB7UmVnRXhwfSBSZXR1cm5zIGEgcmVnZXggY3JlYXRlZCBmcm9tIHRoZSBnaXZlbiBwYXR0ZXJuLlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5taWNyb21hdGNoLm1ha2VSZSA9ICguLi5hcmdzKSA9PiBwaWNvbWF0Y2gubWFrZVJlKC4uLmFyZ3MpO1xuXG4vKipcbiAqIFNjYW4gYSBnbG9iIHBhdHRlcm4gdG8gc2VwYXJhdGUgdGhlIHBhdHRlcm4gaW50byBzZWdtZW50cy4gVXNlZFxuICogYnkgdGhlIFtzcGxpdF0oI3NwbGl0KSBtZXRob2QuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IG1tID0gcmVxdWlyZSgnbWljcm9tYXRjaCcpO1xuICogY29uc3Qgc3RhdGUgPSBtbS5zY2FuKHBhdHRlcm5bLCBvcHRpb25zXSk7XG4gKiBgYGBcbiAqIEBwYXJhbSB7U3RyaW5nfSBgcGF0dGVybmBcbiAqIEBwYXJhbSB7T2JqZWN0fSBgb3B0aW9uc2BcbiAqIEByZXR1cm4ge09iamVjdH0gUmV0dXJucyBhbiBvYmplY3Qgd2l0aFxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5taWNyb21hdGNoLnNjYW4gPSAoLi4uYXJncykgPT4gcGljb21hdGNoLnNjYW4oLi4uYXJncyk7XG5cbi8qKlxuICogUGFyc2UgYSBnbG9iIHBhdHRlcm4gdG8gY3JlYXRlIHRoZSBzb3VyY2Ugc3RyaW5nIGZvciBhIHJlZ3VsYXJcbiAqIGV4cHJlc3Npb24uXG4gKlxuICogYGBganNcbiAqIGNvbnN0IG1tID0gcmVxdWlyZSgnbWljcm9tYXRjaCcpO1xuICogY29uc3Qgc3RhdGUgPSBtbS5wYXJzZShwYXR0ZXJuWywgb3B0aW9uc10pO1xuICogYGBgXG4gKiBAcGFyYW0ge1N0cmluZ30gYGdsb2JgXG4gKiBAcGFyYW0ge09iamVjdH0gYG9wdGlvbnNgXG4gKiBAcmV0dXJuIHtPYmplY3R9IFJldHVybnMgYW4gb2JqZWN0IHdpdGggdXNlZnVsIHByb3BlcnRpZXMgYW5kIG91dHB1dCB0byBiZSB1c2VkIGFzIHJlZ2V4IHNvdXJjZSBzdHJpbmcuXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbm1pY3JvbWF0Y2gucGFyc2UgPSAocGF0dGVybnMsIG9wdGlvbnMpID0+IHtcbiAgbGV0IHJlcyA9IFtdO1xuICBmb3IgKGxldCBwYXR0ZXJuIG9mIFtdLmNvbmNhdChwYXR0ZXJucyB8fCBbXSkpIHtcbiAgICBmb3IgKGxldCBzdHIgb2YgYnJhY2VzKFN0cmluZyhwYXR0ZXJuKSwgb3B0aW9ucykpIHtcbiAgICAgIHJlcy5wdXNoKHBpY29tYXRjaC5wYXJzZShzdHIsIG9wdGlvbnMpKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlcztcbn07XG5cbi8qKlxuICogUHJvY2VzcyB0aGUgZ2l2ZW4gYnJhY2UgYHBhdHRlcm5gLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB7IGJyYWNlcyB9ID0gcmVxdWlyZSgnbWljcm9tYXRjaCcpO1xuICogY29uc29sZS5sb2coYnJhY2VzKCdmb28ve2EsYixjfS9iYXInKSk7XG4gKiAvLz0+IFsgJ2Zvby8oYXxifGMpL2JhcicgXVxuICpcbiAqIGNvbnNvbGUubG9nKGJyYWNlcygnZm9vL3thLGIsY30vYmFyJywgeyBleHBhbmQ6IHRydWUgfSkpO1xuICogLy89PiBbICdmb28vYS9iYXInLCAnZm9vL2IvYmFyJywgJ2Zvby9jL2JhcicgXVxuICogYGBgXG4gKiBAcGFyYW0ge1N0cmluZ30gYHBhdHRlcm5gIFN0cmluZyB3aXRoIGJyYWNlIHBhdHRlcm4gdG8gcHJvY2Vzcy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBgb3B0aW9uc2AgQW55IFtvcHRpb25zXSgjb3B0aW9ucykgdG8gY2hhbmdlIGhvdyBleHBhbnNpb24gaXMgcGVyZm9ybWVkLiBTZWUgdGhlIFticmFjZXNdW10gbGlicmFyeSBmb3IgYWxsIGF2YWlsYWJsZSBvcHRpb25zLlxuICogQHJldHVybiB7QXJyYXl9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbm1pY3JvbWF0Y2guYnJhY2VzID0gKHBhdHRlcm4sIG9wdGlvbnMpID0+IHtcbiAgaWYgKHR5cGVvZiBwYXR0ZXJuICE9PSAnc3RyaW5nJykgdGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgYSBzdHJpbmcnKTtcbiAgaWYgKChvcHRpb25zICYmIG9wdGlvbnMubm9icmFjZSA9PT0gdHJ1ZSkgfHwgIS9cXHsuKlxcfS8udGVzdChwYXR0ZXJuKSkge1xuICAgIHJldHVybiBbcGF0dGVybl07XG4gIH1cbiAgcmV0dXJuIGJyYWNlcyhwYXR0ZXJuLCBvcHRpb25zKTtcbn07XG5cbi8qKlxuICogRXhwYW5kIGJyYWNlc1xuICovXG5cbm1pY3JvbWF0Y2guYnJhY2VFeHBhbmQgPSAocGF0dGVybiwgb3B0aW9ucykgPT4ge1xuICBpZiAodHlwZW9mIHBhdHRlcm4gIT09ICdzdHJpbmcnKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBhIHN0cmluZycpO1xuICByZXR1cm4gbWljcm9tYXRjaC5icmFjZXMocGF0dGVybiwgeyAuLi5vcHRpb25zLCBleHBhbmQ6IHRydWUgfSk7XG59O1xuXG4vKipcbiAqIEV4cG9zZSBtaWNyb21hdGNoXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBtaWNyb21hdGNoO1xuIiwgIlwidXNlIHN0cmljdFwiO1xyXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XHJcbmV4cG9ydHMubWF0Y2hBbnkgPSBleHBvcnRzLmNvbnZlcnRQYXR0ZXJuc1RvUmUgPSBleHBvcnRzLm1ha2VSZSA9IGV4cG9ydHMuZ2V0UGF0dGVyblBhcnRzID0gZXhwb3J0cy5leHBhbmRCcmFjZUV4cGFuc2lvbiA9IGV4cG9ydHMuZXhwYW5kUGF0dGVybnNXaXRoQnJhY2VFeHBhbnNpb24gPSBleHBvcnRzLmlzQWZmZWN0RGVwdGhPZlJlYWRpbmdQYXR0ZXJuID0gZXhwb3J0cy5lbmRzV2l0aFNsYXNoR2xvYlN0YXIgPSBleHBvcnRzLmhhc0dsb2JTdGFyID0gZXhwb3J0cy5nZXRCYXNlRGlyZWN0b3J5ID0gZXhwb3J0cy5pc1BhdHRlcm5SZWxhdGVkVG9QYXJlbnREaXJlY3RvcnkgPSBleHBvcnRzLmdldFBhdHRlcm5zT3V0c2lkZUN1cnJlbnREaXJlY3RvcnkgPSBleHBvcnRzLmdldFBhdHRlcm5zSW5zaWRlQ3VycmVudERpcmVjdG9yeSA9IGV4cG9ydHMuZ2V0UG9zaXRpdmVQYXR0ZXJucyA9IGV4cG9ydHMuZ2V0TmVnYXRpdmVQYXR0ZXJucyA9IGV4cG9ydHMuaXNQb3NpdGl2ZVBhdHRlcm4gPSBleHBvcnRzLmlzTmVnYXRpdmVQYXR0ZXJuID0gZXhwb3J0cy5jb252ZXJ0VG9OZWdhdGl2ZVBhdHRlcm4gPSBleHBvcnRzLmNvbnZlcnRUb1Bvc2l0aXZlUGF0dGVybiA9IGV4cG9ydHMuaXNEeW5hbWljUGF0dGVybiA9IGV4cG9ydHMuaXNTdGF0aWNQYXR0ZXJuID0gdm9pZCAwO1xyXG5jb25zdCBwYXRoID0gcmVxdWlyZShcInBhdGhcIik7XHJcbmNvbnN0IGdsb2JQYXJlbnQgPSByZXF1aXJlKFwiZ2xvYi1wYXJlbnRcIik7XHJcbmNvbnN0IG1pY3JvbWF0Y2ggPSByZXF1aXJlKFwibWljcm9tYXRjaFwiKTtcclxuY29uc3QgR0xPQlNUQVIgPSAnKionO1xyXG5jb25zdCBFU0NBUEVfU1lNQk9MID0gJ1xcXFwnO1xyXG5jb25zdCBDT01NT05fR0xPQl9TWU1CT0xTX1JFID0gL1sqP118XiEvO1xyXG5jb25zdCBSRUdFWF9DSEFSQUNURVJfQ0xBU1NfU1lNQk9MU19SRSA9IC9cXFtbXltdKl0vO1xyXG5jb25zdCBSRUdFWF9HUk9VUF9TWU1CT0xTX1JFID0gLyg/Ol58W14hKis/QF0pXFwoW14oXSpcXHxbXnxdKlxcKS87XHJcbmNvbnN0IEdMT0JfRVhURU5TSU9OX1NZTUJPTFNfUkUgPSAvWyEqKz9AXVxcKFteKF0qXFwpLztcclxuY29uc3QgQlJBQ0VfRVhQQU5TSU9OX1NFUEFSQVRPUlNfUkUgPSAvLHxcXC5cXC4vO1xyXG5mdW5jdGlvbiBpc1N0YXRpY1BhdHRlcm4ocGF0dGVybiwgb3B0aW9ucyA9IHt9KSB7XHJcbiAgICByZXR1cm4gIWlzRHluYW1pY1BhdHRlcm4ocGF0dGVybiwgb3B0aW9ucyk7XHJcbn1cclxuZXhwb3J0cy5pc1N0YXRpY1BhdHRlcm4gPSBpc1N0YXRpY1BhdHRlcm47XHJcbmZ1bmN0aW9uIGlzRHluYW1pY1BhdHRlcm4ocGF0dGVybiwgb3B0aW9ucyA9IHt9KSB7XHJcbiAgICAvKipcclxuICAgICAqIEEgc3BlY2lhbCBjYXNlIHdpdGggYW4gZW1wdHkgc3RyaW5nIGlzIG5lY2Vzc2FyeSBmb3IgbWF0Y2hpbmcgcGF0dGVybnMgdGhhdCBzdGFydCB3aXRoIGEgZm9yd2FyZCBzbGFzaC5cclxuICAgICAqIEFuIGVtcHR5IHN0cmluZyBjYW5ub3QgYmUgYSBkeW5hbWljIHBhdHRlcm4uXHJcbiAgICAgKiBGb3IgZXhhbXBsZSwgdGhlIHBhdHRlcm4gYC9saWIvKmAgd2lsbCBiZSBzcHJlYWQgaW50byBwYXJ0czogJycsICdsaWInLCAnKicuXHJcbiAgICAgKi9cclxuICAgIGlmIChwYXR0ZXJuID09PSAnJykge1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogV2hlbiB0aGUgYGNhc2VTZW5zaXRpdmVNYXRjaGAgb3B0aW9uIGlzIGRpc2FibGVkLCBhbGwgcGF0dGVybnMgbXVzdCBiZSBtYXJrZWQgYXMgZHluYW1pYywgYmVjYXVzZSB3ZSBjYW5ub3QgY2hlY2tcclxuICAgICAqIGZpbGVwYXRoIGRpcmVjdGx5ICh3aXRob3V0IHJlYWQgZGlyZWN0b3J5KS5cclxuICAgICAqL1xyXG4gICAgaWYgKG9wdGlvbnMuY2FzZVNlbnNpdGl2ZU1hdGNoID09PSBmYWxzZSB8fCBwYXR0ZXJuLmluY2x1ZGVzKEVTQ0FQRV9TWU1CT0wpKSB7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICBpZiAoQ09NTU9OX0dMT0JfU1lNQk9MU19SRS50ZXN0KHBhdHRlcm4pIHx8IFJFR0VYX0NIQVJBQ1RFUl9DTEFTU19TWU1CT0xTX1JFLnRlc3QocGF0dGVybikgfHwgUkVHRVhfR1JPVVBfU1lNQk9MU19SRS50ZXN0KHBhdHRlcm4pKSB7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICBpZiAob3B0aW9ucy5leHRnbG9iICE9PSBmYWxzZSAmJiBHTE9CX0VYVEVOU0lPTl9TWU1CT0xTX1JFLnRlc3QocGF0dGVybikpIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIGlmIChvcHRpb25zLmJyYWNlRXhwYW5zaW9uICE9PSBmYWxzZSAmJiBoYXNCcmFjZUV4cGFuc2lvbihwYXR0ZXJuKSkge1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG59XHJcbmV4cG9ydHMuaXNEeW5hbWljUGF0dGVybiA9IGlzRHluYW1pY1BhdHRlcm47XHJcbmZ1bmN0aW9uIGhhc0JyYWNlRXhwYW5zaW9uKHBhdHRlcm4pIHtcclxuICAgIGNvbnN0IG9wZW5pbmdCcmFjZUluZGV4ID0gcGF0dGVybi5pbmRleE9mKCd7Jyk7XHJcbiAgICBpZiAob3BlbmluZ0JyYWNlSW5kZXggPT09IC0xKSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgY29uc3QgY2xvc2luZ0JyYWNlSW5kZXggPSBwYXR0ZXJuLmluZGV4T2YoJ30nLCBvcGVuaW5nQnJhY2VJbmRleCArIDEpO1xyXG4gICAgaWYgKGNsb3NpbmdCcmFjZUluZGV4ID09PSAtMSkge1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIGNvbnN0IGJyYWNlQ29udGVudCA9IHBhdHRlcm4uc2xpY2Uob3BlbmluZ0JyYWNlSW5kZXgsIGNsb3NpbmdCcmFjZUluZGV4KTtcclxuICAgIHJldHVybiBCUkFDRV9FWFBBTlNJT05fU0VQQVJBVE9SU19SRS50ZXN0KGJyYWNlQ29udGVudCk7XHJcbn1cclxuZnVuY3Rpb24gY29udmVydFRvUG9zaXRpdmVQYXR0ZXJuKHBhdHRlcm4pIHtcclxuICAgIHJldHVybiBpc05lZ2F0aXZlUGF0dGVybihwYXR0ZXJuKSA/IHBhdHRlcm4uc2xpY2UoMSkgOiBwYXR0ZXJuO1xyXG59XHJcbmV4cG9ydHMuY29udmVydFRvUG9zaXRpdmVQYXR0ZXJuID0gY29udmVydFRvUG9zaXRpdmVQYXR0ZXJuO1xyXG5mdW5jdGlvbiBjb252ZXJ0VG9OZWdhdGl2ZVBhdHRlcm4ocGF0dGVybikge1xyXG4gICAgcmV0dXJuICchJyArIHBhdHRlcm47XHJcbn1cclxuZXhwb3J0cy5jb252ZXJ0VG9OZWdhdGl2ZVBhdHRlcm4gPSBjb252ZXJ0VG9OZWdhdGl2ZVBhdHRlcm47XHJcbmZ1bmN0aW9uIGlzTmVnYXRpdmVQYXR0ZXJuKHBhdHRlcm4pIHtcclxuICAgIHJldHVybiBwYXR0ZXJuLnN0YXJ0c1dpdGgoJyEnKSAmJiBwYXR0ZXJuWzFdICE9PSAnKCc7XHJcbn1cclxuZXhwb3J0cy5pc05lZ2F0aXZlUGF0dGVybiA9IGlzTmVnYXRpdmVQYXR0ZXJuO1xyXG5mdW5jdGlvbiBpc1Bvc2l0aXZlUGF0dGVybihwYXR0ZXJuKSB7XHJcbiAgICByZXR1cm4gIWlzTmVnYXRpdmVQYXR0ZXJuKHBhdHRlcm4pO1xyXG59XHJcbmV4cG9ydHMuaXNQb3NpdGl2ZVBhdHRlcm4gPSBpc1Bvc2l0aXZlUGF0dGVybjtcclxuZnVuY3Rpb24gZ2V0TmVnYXRpdmVQYXR0ZXJucyhwYXR0ZXJucykge1xyXG4gICAgcmV0dXJuIHBhdHRlcm5zLmZpbHRlcihpc05lZ2F0aXZlUGF0dGVybik7XHJcbn1cclxuZXhwb3J0cy5nZXROZWdhdGl2ZVBhdHRlcm5zID0gZ2V0TmVnYXRpdmVQYXR0ZXJucztcclxuZnVuY3Rpb24gZ2V0UG9zaXRpdmVQYXR0ZXJucyhwYXR0ZXJucykge1xyXG4gICAgcmV0dXJuIHBhdHRlcm5zLmZpbHRlcihpc1Bvc2l0aXZlUGF0dGVybik7XHJcbn1cclxuZXhwb3J0cy5nZXRQb3NpdGl2ZVBhdHRlcm5zID0gZ2V0UG9zaXRpdmVQYXR0ZXJucztcclxuLyoqXHJcbiAqIFJldHVybnMgcGF0dGVybnMgdGhhdCBjYW4gYmUgYXBwbGllZCBpbnNpZGUgdGhlIGN1cnJlbnQgZGlyZWN0b3J5LlxyXG4gKlxyXG4gKiBAZXhhbXBsZVxyXG4gKiAvLyBbJy4vKicsICcqJywgJ2EvKiddXHJcbiAqIGdldFBhdHRlcm5zSW5zaWRlQ3VycmVudERpcmVjdG9yeShbJy4vKicsICcqJywgJ2EvKicsICcuLi8qJywgJy4vLi4vKiddKVxyXG4gKi9cclxuZnVuY3Rpb24gZ2V0UGF0dGVybnNJbnNpZGVDdXJyZW50RGlyZWN0b3J5KHBhdHRlcm5zKSB7XHJcbiAgICByZXR1cm4gcGF0dGVybnMuZmlsdGVyKChwYXR0ZXJuKSA9PiAhaXNQYXR0ZXJuUmVsYXRlZFRvUGFyZW50RGlyZWN0b3J5KHBhdHRlcm4pKTtcclxufVxyXG5leHBvcnRzLmdldFBhdHRlcm5zSW5zaWRlQ3VycmVudERpcmVjdG9yeSA9IGdldFBhdHRlcm5zSW5zaWRlQ3VycmVudERpcmVjdG9yeTtcclxuLyoqXHJcbiAqIFJldHVybnMgcGF0dGVybnMgdG8gYmUgZXhwYW5kZWQgcmVsYXRpdmUgdG8gKG91dHNpZGUpIHRoZSBjdXJyZW50IGRpcmVjdG9yeS5cclxuICpcclxuICogQGV4YW1wbGVcclxuICogLy8gWycuLi8qJywgJy4vLi4vKiddXHJcbiAqIGdldFBhdHRlcm5zSW5zaWRlQ3VycmVudERpcmVjdG9yeShbJy4vKicsICcqJywgJ2EvKicsICcuLi8qJywgJy4vLi4vKiddKVxyXG4gKi9cclxuZnVuY3Rpb24gZ2V0UGF0dGVybnNPdXRzaWRlQ3VycmVudERpcmVjdG9yeShwYXR0ZXJucykge1xyXG4gICAgcmV0dXJuIHBhdHRlcm5zLmZpbHRlcihpc1BhdHRlcm5SZWxhdGVkVG9QYXJlbnREaXJlY3RvcnkpO1xyXG59XHJcbmV4cG9ydHMuZ2V0UGF0dGVybnNPdXRzaWRlQ3VycmVudERpcmVjdG9yeSA9IGdldFBhdHRlcm5zT3V0c2lkZUN1cnJlbnREaXJlY3Rvcnk7XHJcbmZ1bmN0aW9uIGlzUGF0dGVyblJlbGF0ZWRUb1BhcmVudERpcmVjdG9yeShwYXR0ZXJuKSB7XHJcbiAgICByZXR1cm4gcGF0dGVybi5zdGFydHNXaXRoKCcuLicpIHx8IHBhdHRlcm4uc3RhcnRzV2l0aCgnLi8uLicpO1xyXG59XHJcbmV4cG9ydHMuaXNQYXR0ZXJuUmVsYXRlZFRvUGFyZW50RGlyZWN0b3J5ID0gaXNQYXR0ZXJuUmVsYXRlZFRvUGFyZW50RGlyZWN0b3J5O1xyXG5mdW5jdGlvbiBnZXRCYXNlRGlyZWN0b3J5KHBhdHRlcm4pIHtcclxuICAgIHJldHVybiBnbG9iUGFyZW50KHBhdHRlcm4sIHsgZmxpcEJhY2tzbGFzaGVzOiBmYWxzZSB9KTtcclxufVxyXG5leHBvcnRzLmdldEJhc2VEaXJlY3RvcnkgPSBnZXRCYXNlRGlyZWN0b3J5O1xyXG5mdW5jdGlvbiBoYXNHbG9iU3RhcihwYXR0ZXJuKSB7XHJcbiAgICByZXR1cm4gcGF0dGVybi5pbmNsdWRlcyhHTE9CU1RBUik7XHJcbn1cclxuZXhwb3J0cy5oYXNHbG9iU3RhciA9IGhhc0dsb2JTdGFyO1xyXG5mdW5jdGlvbiBlbmRzV2l0aFNsYXNoR2xvYlN0YXIocGF0dGVybikge1xyXG4gICAgcmV0dXJuIHBhdHRlcm4uZW5kc1dpdGgoJy8nICsgR0xPQlNUQVIpO1xyXG59XHJcbmV4cG9ydHMuZW5kc1dpdGhTbGFzaEdsb2JTdGFyID0gZW5kc1dpdGhTbGFzaEdsb2JTdGFyO1xyXG5mdW5jdGlvbiBpc0FmZmVjdERlcHRoT2ZSZWFkaW5nUGF0dGVybihwYXR0ZXJuKSB7XHJcbiAgICBjb25zdCBiYXNlbmFtZSA9IHBhdGguYmFzZW5hbWUocGF0dGVybik7XHJcbiAgICByZXR1cm4gZW5kc1dpdGhTbGFzaEdsb2JTdGFyKHBhdHRlcm4pIHx8IGlzU3RhdGljUGF0dGVybihiYXNlbmFtZSk7XHJcbn1cclxuZXhwb3J0cy5pc0FmZmVjdERlcHRoT2ZSZWFkaW5nUGF0dGVybiA9IGlzQWZmZWN0RGVwdGhPZlJlYWRpbmdQYXR0ZXJuO1xyXG5mdW5jdGlvbiBleHBhbmRQYXR0ZXJuc1dpdGhCcmFjZUV4cGFuc2lvbihwYXR0ZXJucykge1xyXG4gICAgcmV0dXJuIHBhdHRlcm5zLnJlZHVjZSgoY29sbGVjdGlvbiwgcGF0dGVybikgPT4ge1xyXG4gICAgICAgIHJldHVybiBjb2xsZWN0aW9uLmNvbmNhdChleHBhbmRCcmFjZUV4cGFuc2lvbihwYXR0ZXJuKSk7XHJcbiAgICB9LCBbXSk7XHJcbn1cclxuZXhwb3J0cy5leHBhbmRQYXR0ZXJuc1dpdGhCcmFjZUV4cGFuc2lvbiA9IGV4cGFuZFBhdHRlcm5zV2l0aEJyYWNlRXhwYW5zaW9uO1xyXG5mdW5jdGlvbiBleHBhbmRCcmFjZUV4cGFuc2lvbihwYXR0ZXJuKSB7XHJcbiAgICByZXR1cm4gbWljcm9tYXRjaC5icmFjZXMocGF0dGVybiwge1xyXG4gICAgICAgIGV4cGFuZDogdHJ1ZSxcclxuICAgICAgICBub2R1cGVzOiB0cnVlXHJcbiAgICB9KTtcclxufVxyXG5leHBvcnRzLmV4cGFuZEJyYWNlRXhwYW5zaW9uID0gZXhwYW5kQnJhY2VFeHBhbnNpb247XHJcbmZ1bmN0aW9uIGdldFBhdHRlcm5QYXJ0cyhwYXR0ZXJuLCBvcHRpb25zKSB7XHJcbiAgICBsZXQgeyBwYXJ0cyB9ID0gbWljcm9tYXRjaC5zY2FuKHBhdHRlcm4sIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucyksIHsgcGFydHM6IHRydWUgfSkpO1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgc2NhbiBtZXRob2QgcmV0dXJucyBhbiBlbXB0eSBhcnJheSBpbiBzb21lIGNhc2VzLlxyXG4gICAgICogU2VlIG1pY3JvbWF0Y2gvcGljb21hdGNoIzU4IGZvciBtb3JlIGRldGFpbHMuXHJcbiAgICAgKi9cclxuICAgIGlmIChwYXJ0cy5sZW5ndGggPT09IDApIHtcclxuICAgICAgICBwYXJ0cyA9IFtwYXR0ZXJuXTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogVGhlIHNjYW4gbWV0aG9kIGRvZXMgbm90IHJldHVybiBhbiBlbXB0eSBwYXJ0IGZvciB0aGUgcGF0dGVybiB3aXRoIGEgZm9yd2FyZCBzbGFzaC5cclxuICAgICAqIFRoaXMgaXMgYW5vdGhlciBwYXJ0IG9mIG1pY3JvbWF0Y2gvcGljb21hdGNoIzU4LlxyXG4gICAgICovXHJcbiAgICBpZiAocGFydHNbMF0uc3RhcnRzV2l0aCgnLycpKSB7XHJcbiAgICAgICAgcGFydHNbMF0gPSBwYXJ0c1swXS5zbGljZSgxKTtcclxuICAgICAgICBwYXJ0cy51bnNoaWZ0KCcnKTtcclxuICAgIH1cclxuICAgIHJldHVybiBwYXJ0cztcclxufVxyXG5leHBvcnRzLmdldFBhdHRlcm5QYXJ0cyA9IGdldFBhdHRlcm5QYXJ0cztcclxuZnVuY3Rpb24gbWFrZVJlKHBhdHRlcm4sIG9wdGlvbnMpIHtcclxuICAgIHJldHVybiBtaWNyb21hdGNoLm1ha2VSZShwYXR0ZXJuLCBvcHRpb25zKTtcclxufVxyXG5leHBvcnRzLm1ha2VSZSA9IG1ha2VSZTtcclxuZnVuY3Rpb24gY29udmVydFBhdHRlcm5zVG9SZShwYXR0ZXJucywgb3B0aW9ucykge1xyXG4gICAgcmV0dXJuIHBhdHRlcm5zLm1hcCgocGF0dGVybikgPT4gbWFrZVJlKHBhdHRlcm4sIG9wdGlvbnMpKTtcclxufVxyXG5leHBvcnRzLmNvbnZlcnRQYXR0ZXJuc1RvUmUgPSBjb252ZXJ0UGF0dGVybnNUb1JlO1xyXG5mdW5jdGlvbiBtYXRjaEFueShlbnRyeSwgcGF0dGVybnNSZSkge1xyXG4gICAgcmV0dXJuIHBhdHRlcm5zUmUuc29tZSgocGF0dGVyblJlKSA9PiBwYXR0ZXJuUmUudGVzdChlbnRyeSkpO1xyXG59XHJcbmV4cG9ydHMubWF0Y2hBbnkgPSBtYXRjaEFueTtcclxuIiwgIlwidXNlIHN0cmljdFwiO1xyXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XHJcbmV4cG9ydHMubWVyZ2UgPSB2b2lkIDA7XHJcbmNvbnN0IG1lcmdlMiA9IHJlcXVpcmUoXCJtZXJnZTJcIik7XHJcbmZ1bmN0aW9uIG1lcmdlKHN0cmVhbXMpIHtcclxuICAgIGNvbnN0IG1lcmdlZFN0cmVhbSA9IG1lcmdlMihzdHJlYW1zKTtcclxuICAgIHN0cmVhbXMuZm9yRWFjaCgoc3RyZWFtKSA9PiB7XHJcbiAgICAgICAgc3RyZWFtLm9uY2UoJ2Vycm9yJywgKGVycm9yKSA9PiBtZXJnZWRTdHJlYW0uZW1pdCgnZXJyb3InLCBlcnJvcikpO1xyXG4gICAgfSk7XHJcbiAgICBtZXJnZWRTdHJlYW0ub25jZSgnY2xvc2UnLCAoKSA9PiBwcm9wYWdhdGVDbG9zZUV2ZW50VG9Tb3VyY2VzKHN0cmVhbXMpKTtcclxuICAgIG1lcmdlZFN0cmVhbS5vbmNlKCdlbmQnLCAoKSA9PiBwcm9wYWdhdGVDbG9zZUV2ZW50VG9Tb3VyY2VzKHN0cmVhbXMpKTtcclxuICAgIHJldHVybiBtZXJnZWRTdHJlYW07XHJcbn1cclxuZXhwb3J0cy5tZXJnZSA9IG1lcmdlO1xyXG5mdW5jdGlvbiBwcm9wYWdhdGVDbG9zZUV2ZW50VG9Tb3VyY2VzKHN0cmVhbXMpIHtcclxuICAgIHN0cmVhbXMuZm9yRWFjaCgoc3RyZWFtKSA9PiBzdHJlYW0uZW1pdCgnY2xvc2UnKSk7XHJcbn1cclxuIiwgIlwidXNlIHN0cmljdFwiO1xyXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XHJcbmV4cG9ydHMuaXNFbXB0eSA9IGV4cG9ydHMuaXNTdHJpbmcgPSB2b2lkIDA7XHJcbmZ1bmN0aW9uIGlzU3RyaW5nKGlucHV0KSB7XHJcbiAgICByZXR1cm4gdHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJztcclxufVxyXG5leHBvcnRzLmlzU3RyaW5nID0gaXNTdHJpbmc7XHJcbmZ1bmN0aW9uIGlzRW1wdHkoaW5wdXQpIHtcclxuICAgIHJldHVybiBpbnB1dCA9PT0gJyc7XHJcbn1cclxuZXhwb3J0cy5pc0VtcHR5ID0gaXNFbXB0eTtcclxuIiwgIlwidXNlIHN0cmljdFwiO1xyXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XHJcbmV4cG9ydHMuc3RyaW5nID0gZXhwb3J0cy5zdHJlYW0gPSBleHBvcnRzLnBhdHRlcm4gPSBleHBvcnRzLnBhdGggPSBleHBvcnRzLmZzID0gZXhwb3J0cy5lcnJubyA9IGV4cG9ydHMuYXJyYXkgPSB2b2lkIDA7XHJcbmNvbnN0IGFycmF5ID0gcmVxdWlyZShcIi4vYXJyYXlcIik7XHJcbmV4cG9ydHMuYXJyYXkgPSBhcnJheTtcclxuY29uc3QgZXJybm8gPSByZXF1aXJlKFwiLi9lcnJub1wiKTtcclxuZXhwb3J0cy5lcnJubyA9IGVycm5vO1xyXG5jb25zdCBmcyA9IHJlcXVpcmUoXCIuL2ZzXCIpO1xyXG5leHBvcnRzLmZzID0gZnM7XHJcbmNvbnN0IHBhdGggPSByZXF1aXJlKFwiLi9wYXRoXCIpO1xyXG5leHBvcnRzLnBhdGggPSBwYXRoO1xyXG5jb25zdCBwYXR0ZXJuID0gcmVxdWlyZShcIi4vcGF0dGVyblwiKTtcclxuZXhwb3J0cy5wYXR0ZXJuID0gcGF0dGVybjtcclxuY29uc3Qgc3RyZWFtID0gcmVxdWlyZShcIi4vc3RyZWFtXCIpO1xyXG5leHBvcnRzLnN0cmVhbSA9IHN0cmVhbTtcclxuY29uc3Qgc3RyaW5nID0gcmVxdWlyZShcIi4vc3RyaW5nXCIpO1xyXG5leHBvcnRzLnN0cmluZyA9IHN0cmluZztcclxuIiwgIlwidXNlIHN0cmljdFwiO1xyXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XHJcbmV4cG9ydHMuY29udmVydFBhdHRlcm5Hcm91cFRvVGFzayA9IGV4cG9ydHMuY29udmVydFBhdHRlcm5Hcm91cHNUb1Rhc2tzID0gZXhwb3J0cy5ncm91cFBhdHRlcm5zQnlCYXNlRGlyZWN0b3J5ID0gZXhwb3J0cy5nZXROZWdhdGl2ZVBhdHRlcm5zQXNQb3NpdGl2ZSA9IGV4cG9ydHMuZ2V0UG9zaXRpdmVQYXR0ZXJucyA9IGV4cG9ydHMuY29udmVydFBhdHRlcm5zVG9UYXNrcyA9IGV4cG9ydHMuZ2VuZXJhdGUgPSB2b2lkIDA7XHJcbmNvbnN0IHV0aWxzID0gcmVxdWlyZShcIi4uL3V0aWxzXCIpO1xyXG5mdW5jdGlvbiBnZW5lcmF0ZShwYXR0ZXJucywgc2V0dGluZ3MpIHtcclxuICAgIGNvbnN0IHBvc2l0aXZlUGF0dGVybnMgPSBnZXRQb3NpdGl2ZVBhdHRlcm5zKHBhdHRlcm5zKTtcclxuICAgIGNvbnN0IG5lZ2F0aXZlUGF0dGVybnMgPSBnZXROZWdhdGl2ZVBhdHRlcm5zQXNQb3NpdGl2ZShwYXR0ZXJucywgc2V0dGluZ3MuaWdub3JlKTtcclxuICAgIGNvbnN0IHN0YXRpY1BhdHRlcm5zID0gcG9zaXRpdmVQYXR0ZXJucy5maWx0ZXIoKHBhdHRlcm4pID0+IHV0aWxzLnBhdHRlcm4uaXNTdGF0aWNQYXR0ZXJuKHBhdHRlcm4sIHNldHRpbmdzKSk7XHJcbiAgICBjb25zdCBkeW5hbWljUGF0dGVybnMgPSBwb3NpdGl2ZVBhdHRlcm5zLmZpbHRlcigocGF0dGVybikgPT4gdXRpbHMucGF0dGVybi5pc0R5bmFtaWNQYXR0ZXJuKHBhdHRlcm4sIHNldHRpbmdzKSk7XHJcbiAgICBjb25zdCBzdGF0aWNUYXNrcyA9IGNvbnZlcnRQYXR0ZXJuc1RvVGFza3Moc3RhdGljUGF0dGVybnMsIG5lZ2F0aXZlUGF0dGVybnMsIC8qIGR5bmFtaWMgKi8gZmFsc2UpO1xyXG4gICAgY29uc3QgZHluYW1pY1Rhc2tzID0gY29udmVydFBhdHRlcm5zVG9UYXNrcyhkeW5hbWljUGF0dGVybnMsIG5lZ2F0aXZlUGF0dGVybnMsIC8qIGR5bmFtaWMgKi8gdHJ1ZSk7XHJcbiAgICByZXR1cm4gc3RhdGljVGFza3MuY29uY2F0KGR5bmFtaWNUYXNrcyk7XHJcbn1cclxuZXhwb3J0cy5nZW5lcmF0ZSA9IGdlbmVyYXRlO1xyXG4vKipcclxuICogUmV0dXJucyB0YXNrcyBncm91cGVkIGJ5IGJhc2ljIHBhdHRlcm4gZGlyZWN0b3JpZXMuXHJcbiAqXHJcbiAqIFBhdHRlcm5zIHRoYXQgY2FuIGJlIGZvdW5kIGluc2lkZSAoYC4vYCkgYW5kIG91dHNpZGUgKGAuLi9gKSB0aGUgY3VycmVudCBkaXJlY3RvcnkgYXJlIGhhbmRsZWQgc2VwYXJhdGVseS5cclxuICogVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSBkaXJlY3RvcnkgdHJhdmVyc2FsIHN0YXJ0cyBhdCB0aGUgYmFzZSBkaXJlY3RvcnkgYW5kIGdvZXMgZGVlcGVyLlxyXG4gKi9cclxuZnVuY3Rpb24gY29udmVydFBhdHRlcm5zVG9UYXNrcyhwb3NpdGl2ZSwgbmVnYXRpdmUsIGR5bmFtaWMpIHtcclxuICAgIGNvbnN0IHRhc2tzID0gW107XHJcbiAgICBjb25zdCBwYXR0ZXJuc091dHNpZGVDdXJyZW50RGlyZWN0b3J5ID0gdXRpbHMucGF0dGVybi5nZXRQYXR0ZXJuc091dHNpZGVDdXJyZW50RGlyZWN0b3J5KHBvc2l0aXZlKTtcclxuICAgIGNvbnN0IHBhdHRlcm5zSW5zaWRlQ3VycmVudERpcmVjdG9yeSA9IHV0aWxzLnBhdHRlcm4uZ2V0UGF0dGVybnNJbnNpZGVDdXJyZW50RGlyZWN0b3J5KHBvc2l0aXZlKTtcclxuICAgIGNvbnN0IG91dHNpZGVDdXJyZW50RGlyZWN0b3J5R3JvdXAgPSBncm91cFBhdHRlcm5zQnlCYXNlRGlyZWN0b3J5KHBhdHRlcm5zT3V0c2lkZUN1cnJlbnREaXJlY3RvcnkpO1xyXG4gICAgY29uc3QgaW5zaWRlQ3VycmVudERpcmVjdG9yeUdyb3VwID0gZ3JvdXBQYXR0ZXJuc0J5QmFzZURpcmVjdG9yeShwYXR0ZXJuc0luc2lkZUN1cnJlbnREaXJlY3RvcnkpO1xyXG4gICAgdGFza3MucHVzaCguLi5jb252ZXJ0UGF0dGVybkdyb3Vwc1RvVGFza3Mob3V0c2lkZUN1cnJlbnREaXJlY3RvcnlHcm91cCwgbmVnYXRpdmUsIGR5bmFtaWMpKTtcclxuICAgIC8qXHJcbiAgICAgKiBGb3IgdGhlIHNha2Ugb2YgcmVkdWNpbmcgZnV0dXJlIGFjY2Vzc2VzIHRvIHRoZSBmaWxlIHN5c3RlbSwgd2UgbWVyZ2UgYWxsIHRhc2tzIHdpdGhpbiB0aGUgY3VycmVudCBkaXJlY3RvcnlcclxuICAgICAqIGludG8gYSBnbG9iYWwgdGFzaywgaWYgYXQgbGVhc3Qgb25lIHBhdHRlcm4gcmVmZXJzIHRvIHRoZSByb290IChgLmApLiBJbiB0aGlzIGNhc2UsIHRoZSBnbG9iYWwgdGFzayBjb3ZlcnMgdGhlIHJlc3QuXHJcbiAgICAgKi9cclxuICAgIGlmICgnLicgaW4gaW5zaWRlQ3VycmVudERpcmVjdG9yeUdyb3VwKSB7XHJcbiAgICAgICAgdGFza3MucHVzaChjb252ZXJ0UGF0dGVybkdyb3VwVG9UYXNrKCcuJywgcGF0dGVybnNJbnNpZGVDdXJyZW50RGlyZWN0b3J5LCBuZWdhdGl2ZSwgZHluYW1pYykpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgICAgdGFza3MucHVzaCguLi5jb252ZXJ0UGF0dGVybkdyb3Vwc1RvVGFza3MoaW5zaWRlQ3VycmVudERpcmVjdG9yeUdyb3VwLCBuZWdhdGl2ZSwgZHluYW1pYykpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRhc2tzO1xyXG59XHJcbmV4cG9ydHMuY29udmVydFBhdHRlcm5zVG9UYXNrcyA9IGNvbnZlcnRQYXR0ZXJuc1RvVGFza3M7XHJcbmZ1bmN0aW9uIGdldFBvc2l0aXZlUGF0dGVybnMocGF0dGVybnMpIHtcclxuICAgIHJldHVybiB1dGlscy5wYXR0ZXJuLmdldFBvc2l0aXZlUGF0dGVybnMocGF0dGVybnMpO1xyXG59XHJcbmV4cG9ydHMuZ2V0UG9zaXRpdmVQYXR0ZXJucyA9IGdldFBvc2l0aXZlUGF0dGVybnM7XHJcbmZ1bmN0aW9uIGdldE5lZ2F0aXZlUGF0dGVybnNBc1Bvc2l0aXZlKHBhdHRlcm5zLCBpZ25vcmUpIHtcclxuICAgIGNvbnN0IG5lZ2F0aXZlID0gdXRpbHMucGF0dGVybi5nZXROZWdhdGl2ZVBhdHRlcm5zKHBhdHRlcm5zKS5jb25jYXQoaWdub3JlKTtcclxuICAgIGNvbnN0IHBvc2l0aXZlID0gbmVnYXRpdmUubWFwKHV0aWxzLnBhdHRlcm4uY29udmVydFRvUG9zaXRpdmVQYXR0ZXJuKTtcclxuICAgIHJldHVybiBwb3NpdGl2ZTtcclxufVxyXG5leHBvcnRzLmdldE5lZ2F0aXZlUGF0dGVybnNBc1Bvc2l0aXZlID0gZ2V0TmVnYXRpdmVQYXR0ZXJuc0FzUG9zaXRpdmU7XHJcbmZ1bmN0aW9uIGdyb3VwUGF0dGVybnNCeUJhc2VEaXJlY3RvcnkocGF0dGVybnMpIHtcclxuICAgIGNvbnN0IGdyb3VwID0ge307XHJcbiAgICByZXR1cm4gcGF0dGVybnMucmVkdWNlKChjb2xsZWN0aW9uLCBwYXR0ZXJuKSA9PiB7XHJcbiAgICAgICAgY29uc3QgYmFzZSA9IHV0aWxzLnBhdHRlcm4uZ2V0QmFzZURpcmVjdG9yeShwYXR0ZXJuKTtcclxuICAgICAgICBpZiAoYmFzZSBpbiBjb2xsZWN0aW9uKSB7XHJcbiAgICAgICAgICAgIGNvbGxlY3Rpb25bYmFzZV0ucHVzaChwYXR0ZXJuKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbGxlY3Rpb25bYmFzZV0gPSBbcGF0dGVybl07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBjb2xsZWN0aW9uO1xyXG4gICAgfSwgZ3JvdXApO1xyXG59XHJcbmV4cG9ydHMuZ3JvdXBQYXR0ZXJuc0J5QmFzZURpcmVjdG9yeSA9IGdyb3VwUGF0dGVybnNCeUJhc2VEaXJlY3Rvcnk7XHJcbmZ1bmN0aW9uIGNvbnZlcnRQYXR0ZXJuR3JvdXBzVG9UYXNrcyhwb3NpdGl2ZSwgbmVnYXRpdmUsIGR5bmFtaWMpIHtcclxuICAgIHJldHVybiBPYmplY3Qua2V5cyhwb3NpdGl2ZSkubWFwKChiYXNlKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGNvbnZlcnRQYXR0ZXJuR3JvdXBUb1Rhc2soYmFzZSwgcG9zaXRpdmVbYmFzZV0sIG5lZ2F0aXZlLCBkeW5hbWljKTtcclxuICAgIH0pO1xyXG59XHJcbmV4cG9ydHMuY29udmVydFBhdHRlcm5Hcm91cHNUb1Rhc2tzID0gY29udmVydFBhdHRlcm5Hcm91cHNUb1Rhc2tzO1xyXG5mdW5jdGlvbiBjb252ZXJ0UGF0dGVybkdyb3VwVG9UYXNrKGJhc2UsIHBvc2l0aXZlLCBuZWdhdGl2ZSwgZHluYW1pYykge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICBkeW5hbWljLFxyXG4gICAgICAgIHBvc2l0aXZlLFxyXG4gICAgICAgIG5lZ2F0aXZlLFxyXG4gICAgICAgIGJhc2UsXHJcbiAgICAgICAgcGF0dGVybnM6IFtdLmNvbmNhdChwb3NpdGl2ZSwgbmVnYXRpdmUubWFwKHV0aWxzLnBhdHRlcm4uY29udmVydFRvTmVnYXRpdmVQYXR0ZXJuKSlcclxuICAgIH07XHJcbn1cclxuZXhwb3J0cy5jb252ZXJ0UGF0dGVybkdyb3VwVG9UYXNrID0gY29udmVydFBhdHRlcm5Hcm91cFRvVGFzaztcclxuIiwgIlwidXNlIHN0cmljdFwiO1xyXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XHJcbmV4cG9ydHMucmVtb3ZlRHVwbGljYXRlU2xhc2hlcyA9IGV4cG9ydHMudHJhbnNmb3JtID0gdm9pZCAwO1xyXG4vKipcclxuICogTWF0Y2hlcyBhIHNlcXVlbmNlIG9mIHR3byBvciBtb3JlIGNvbnNlY3V0aXZlIHNsYXNoZXMsIGV4Y2x1ZGluZyB0aGUgZmlyc3QgdHdvIHNsYXNoZXMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgc3RyaW5nLlxyXG4gKiBUaGUgbGF0dGVyIGlzIGR1ZSB0byB0aGUgcHJlc2VuY2Ugb2YgdGhlIGRldmljZSBwYXRoIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIFVOQyBwYXRoLlxyXG4gKiBAdG9kbyByZXdyaXRlIHRvIG5lZ2F0aXZlIGxvb2tiZWhpbmQgd2l0aCB0aGUgbmV4dCBtYWpvciByZWxlYXNlLlxyXG4gKi9cclxuY29uc3QgRE9VQkxFX1NMQVNIX1JFID0gLyg/IV4pXFwvezIsfS9nO1xyXG5mdW5jdGlvbiB0cmFuc2Zvcm0ocGF0dGVybnMpIHtcclxuICAgIHJldHVybiBwYXR0ZXJucy5tYXAoKHBhdHRlcm4pID0+IHJlbW92ZUR1cGxpY2F0ZVNsYXNoZXMocGF0dGVybikpO1xyXG59XHJcbmV4cG9ydHMudHJhbnNmb3JtID0gdHJhbnNmb3JtO1xyXG4vKipcclxuICogVGhpcyBwYWNrYWdlIG9ubHkgd29ya3Mgd2l0aCBmb3J3YXJkIHNsYXNoZXMgYXMgYSBwYXRoIHNlcGFyYXRvci5cclxuICogQmVjYXVzZSBvZiB0aGlzLCB3ZSBjYW5ub3QgdXNlIHRoZSBzdGFuZGFyZCBgcGF0aC5ub3JtYWxpemVgIG1ldGhvZCwgYmVjYXVzZSBvbiBXaW5kb3dzIHBsYXRmb3JtIGl0IHdpbGwgdXNlIG9mIGJhY2tzbGFzaGVzLlxyXG4gKi9cclxuZnVuY3Rpb24gcmVtb3ZlRHVwbGljYXRlU2xhc2hlcyhwYXR0ZXJuKSB7XHJcbiAgICByZXR1cm4gcGF0dGVybi5yZXBsYWNlKERPVUJMRV9TTEFTSF9SRSwgJy8nKTtcclxufVxyXG5leHBvcnRzLnJlbW92ZUR1cGxpY2F0ZVNsYXNoZXMgPSByZW1vdmVEdXBsaWNhdGVTbGFzaGVzO1xyXG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLnJlYWQgPSB2b2lkIDA7XG5mdW5jdGlvbiByZWFkKHBhdGgsIHNldHRpbmdzLCBjYWxsYmFjaykge1xuICAgIHNldHRpbmdzLmZzLmxzdGF0KHBhdGgsIChsc3RhdEVycm9yLCBsc3RhdCkgPT4ge1xuICAgICAgICBpZiAobHN0YXRFcnJvciAhPT0gbnVsbCkge1xuICAgICAgICAgICAgY2FsbEZhaWx1cmVDYWxsYmFjayhjYWxsYmFjaywgbHN0YXRFcnJvcik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFsc3RhdC5pc1N5bWJvbGljTGluaygpIHx8ICFzZXR0aW5ncy5mb2xsb3dTeW1ib2xpY0xpbmspIHtcbiAgICAgICAgICAgIGNhbGxTdWNjZXNzQ2FsbGJhY2soY2FsbGJhY2ssIGxzdGF0KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBzZXR0aW5ncy5mcy5zdGF0KHBhdGgsIChzdGF0RXJyb3IsIHN0YXQpID0+IHtcbiAgICAgICAgICAgIGlmIChzdGF0RXJyb3IgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBpZiAoc2V0dGluZ3MudGhyb3dFcnJvck9uQnJva2VuU3ltYm9saWNMaW5rKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxGYWlsdXJlQ2FsbGJhY2soY2FsbGJhY2ssIHN0YXRFcnJvcik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FsbFN1Y2Nlc3NDYWxsYmFjayhjYWxsYmFjaywgbHN0YXQpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzZXR0aW5ncy5tYXJrU3ltYm9saWNMaW5rKSB7XG4gICAgICAgICAgICAgICAgc3RhdC5pc1N5bWJvbGljTGluayA9ICgpID0+IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYWxsU3VjY2Vzc0NhbGxiYWNrKGNhbGxiYWNrLCBzdGF0KTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG59XG5leHBvcnRzLnJlYWQgPSByZWFkO1xuZnVuY3Rpb24gY2FsbEZhaWx1cmVDYWxsYmFjayhjYWxsYmFjaywgZXJyb3IpIHtcbiAgICBjYWxsYmFjayhlcnJvcik7XG59XG5mdW5jdGlvbiBjYWxsU3VjY2Vzc0NhbGxiYWNrKGNhbGxiYWNrLCByZXN1bHQpIHtcbiAgICBjYWxsYmFjayhudWxsLCByZXN1bHQpO1xufVxuIiwgIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5yZWFkID0gdm9pZCAwO1xuZnVuY3Rpb24gcmVhZChwYXRoLCBzZXR0aW5ncykge1xuICAgIGNvbnN0IGxzdGF0ID0gc2V0dGluZ3MuZnMubHN0YXRTeW5jKHBhdGgpO1xuICAgIGlmICghbHN0YXQuaXNTeW1ib2xpY0xpbmsoKSB8fCAhc2V0dGluZ3MuZm9sbG93U3ltYm9saWNMaW5rKSB7XG4gICAgICAgIHJldHVybiBsc3RhdDtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3Qgc3RhdCA9IHNldHRpbmdzLmZzLnN0YXRTeW5jKHBhdGgpO1xuICAgICAgICBpZiAoc2V0dGluZ3MubWFya1N5bWJvbGljTGluaykge1xuICAgICAgICAgICAgc3RhdC5pc1N5bWJvbGljTGluayA9ICgpID0+IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN0YXQ7XG4gICAgfVxuICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICBpZiAoIXNldHRpbmdzLnRocm93RXJyb3JPbkJyb2tlblN5bWJvbGljTGluaykge1xuICAgICAgICAgICAgcmV0dXJuIGxzdGF0O1xuICAgICAgICB9XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbn1cbmV4cG9ydHMucmVhZCA9IHJlYWQ7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmNyZWF0ZUZpbGVTeXN0ZW1BZGFwdGVyID0gZXhwb3J0cy5GSUxFX1NZU1RFTV9BREFQVEVSID0gdm9pZCAwO1xuY29uc3QgZnMgPSByZXF1aXJlKFwiZnNcIik7XG5leHBvcnRzLkZJTEVfU1lTVEVNX0FEQVBURVIgPSB7XG4gICAgbHN0YXQ6IGZzLmxzdGF0LFxuICAgIHN0YXQ6IGZzLnN0YXQsXG4gICAgbHN0YXRTeW5jOiBmcy5sc3RhdFN5bmMsXG4gICAgc3RhdFN5bmM6IGZzLnN0YXRTeW5jXG59O1xuZnVuY3Rpb24gY3JlYXRlRmlsZVN5c3RlbUFkYXB0ZXIoZnNNZXRob2RzKSB7XG4gICAgaWYgKGZzTWV0aG9kcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBleHBvcnRzLkZJTEVfU1lTVEVNX0FEQVBURVI7XG4gICAgfVxuICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGV4cG9ydHMuRklMRV9TWVNURU1fQURBUFRFUiksIGZzTWV0aG9kcyk7XG59XG5leHBvcnRzLmNyZWF0ZUZpbGVTeXN0ZW1BZGFwdGVyID0gY3JlYXRlRmlsZVN5c3RlbUFkYXB0ZXI7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5jb25zdCBmcyA9IHJlcXVpcmUoXCIuL2FkYXB0ZXJzL2ZzXCIpO1xuY2xhc3MgU2V0dGluZ3Mge1xuICAgIGNvbnN0cnVjdG9yKF9vcHRpb25zID0ge30pIHtcbiAgICAgICAgdGhpcy5fb3B0aW9ucyA9IF9vcHRpb25zO1xuICAgICAgICB0aGlzLmZvbGxvd1N5bWJvbGljTGluayA9IHRoaXMuX2dldFZhbHVlKHRoaXMuX29wdGlvbnMuZm9sbG93U3ltYm9saWNMaW5rLCB0cnVlKTtcbiAgICAgICAgdGhpcy5mcyA9IGZzLmNyZWF0ZUZpbGVTeXN0ZW1BZGFwdGVyKHRoaXMuX29wdGlvbnMuZnMpO1xuICAgICAgICB0aGlzLm1hcmtTeW1ib2xpY0xpbmsgPSB0aGlzLl9nZXRWYWx1ZSh0aGlzLl9vcHRpb25zLm1hcmtTeW1ib2xpY0xpbmssIGZhbHNlKTtcbiAgICAgICAgdGhpcy50aHJvd0Vycm9yT25Ccm9rZW5TeW1ib2xpY0xpbmsgPSB0aGlzLl9nZXRWYWx1ZSh0aGlzLl9vcHRpb25zLnRocm93RXJyb3JPbkJyb2tlblN5bWJvbGljTGluaywgdHJ1ZSk7XG4gICAgfVxuICAgIF9nZXRWYWx1ZShvcHRpb24sIHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBvcHRpb24gIT09IG51bGwgJiYgb3B0aW9uICE9PSB2b2lkIDAgPyBvcHRpb24gOiB2YWx1ZTtcbiAgICB9XG59XG5leHBvcnRzLmRlZmF1bHQgPSBTZXR0aW5ncztcbiIsICJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuc3RhdFN5bmMgPSBleHBvcnRzLnN0YXQgPSBleHBvcnRzLlNldHRpbmdzID0gdm9pZCAwO1xuY29uc3QgYXN5bmMgPSByZXF1aXJlKFwiLi9wcm92aWRlcnMvYXN5bmNcIik7XG5jb25zdCBzeW5jID0gcmVxdWlyZShcIi4vcHJvdmlkZXJzL3N5bmNcIik7XG5jb25zdCBzZXR0aW5nc18xID0gcmVxdWlyZShcIi4vc2V0dGluZ3NcIik7XG5leHBvcnRzLlNldHRpbmdzID0gc2V0dGluZ3NfMS5kZWZhdWx0O1xuZnVuY3Rpb24gc3RhdChwYXRoLCBvcHRpb25zT3JTZXR0aW5nc09yQ2FsbGJhY2ssIGNhbGxiYWNrKSB7XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zT3JTZXR0aW5nc09yQ2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgYXN5bmMucmVhZChwYXRoLCBnZXRTZXR0aW5ncygpLCBvcHRpb25zT3JTZXR0aW5nc09yQ2FsbGJhY2spO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGFzeW5jLnJlYWQocGF0aCwgZ2V0U2V0dGluZ3Mob3B0aW9uc09yU2V0dGluZ3NPckNhbGxiYWNrKSwgY2FsbGJhY2spO1xufVxuZXhwb3J0cy5zdGF0ID0gc3RhdDtcbmZ1bmN0aW9uIHN0YXRTeW5jKHBhdGgsIG9wdGlvbnNPclNldHRpbmdzKSB7XG4gICAgY29uc3Qgc2V0dGluZ3MgPSBnZXRTZXR0aW5ncyhvcHRpb25zT3JTZXR0aW5ncyk7XG4gICAgcmV0dXJuIHN5bmMucmVhZChwYXRoLCBzZXR0aW5ncyk7XG59XG5leHBvcnRzLnN0YXRTeW5jID0gc3RhdFN5bmM7XG5mdW5jdGlvbiBnZXRTZXR0aW5ncyhzZXR0aW5nc09yT3B0aW9ucyA9IHt9KSB7XG4gICAgaWYgKHNldHRpbmdzT3JPcHRpb25zIGluc3RhbmNlb2Ygc2V0dGluZ3NfMS5kZWZhdWx0KSB7XG4gICAgICAgIHJldHVybiBzZXR0aW5nc09yT3B0aW9ucztcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBzZXR0aW5nc18xLmRlZmF1bHQoc2V0dGluZ3NPck9wdGlvbnMpO1xufVxuIiwgIi8qISBxdWV1ZS1taWNyb3Rhc2suIE1JVCBMaWNlbnNlLiBGZXJvc3MgQWJvdWtoYWRpamVoIDxodHRwczovL2Zlcm9zcy5vcmcvb3BlbnNvdXJjZT4gKi9cbmxldCBwcm9taXNlXG5cbm1vZHVsZS5leHBvcnRzID0gdHlwZW9mIHF1ZXVlTWljcm90YXNrID09PSAnZnVuY3Rpb24nXG4gID8gcXVldWVNaWNyb3Rhc2suYmluZCh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyA/IHdpbmRvdyA6IGdsb2JhbClcbiAgLy8gcmV1c2UgcmVzb2x2ZWQgcHJvbWlzZSwgYW5kIGFsbG9jYXRlIGl0IGxhemlseVxuICA6IGNiID0+IChwcm9taXNlIHx8IChwcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKCkpKVxuICAgIC50aGVuKGNiKVxuICAgIC5jYXRjaChlcnIgPT4gc2V0VGltZW91dCgoKSA9PiB7IHRocm93IGVyciB9LCAwKSlcbiIsICIvKiEgcnVuLXBhcmFsbGVsLiBNSVQgTGljZW5zZS4gRmVyb3NzIEFib3VraGFkaWplaCA8aHR0cHM6Ly9mZXJvc3Mub3JnL29wZW5zb3VyY2U+ICovXG5tb2R1bGUuZXhwb3J0cyA9IHJ1blBhcmFsbGVsXG5cbmNvbnN0IHF1ZXVlTWljcm90YXNrID0gcmVxdWlyZSgncXVldWUtbWljcm90YXNrJylcblxuZnVuY3Rpb24gcnVuUGFyYWxsZWwgKHRhc2tzLCBjYikge1xuICBsZXQgcmVzdWx0cywgcGVuZGluZywga2V5c1xuICBsZXQgaXNTeW5jID0gdHJ1ZVxuXG4gIGlmIChBcnJheS5pc0FycmF5KHRhc2tzKSkge1xuICAgIHJlc3VsdHMgPSBbXVxuICAgIHBlbmRpbmcgPSB0YXNrcy5sZW5ndGhcbiAgfSBlbHNlIHtcbiAgICBrZXlzID0gT2JqZWN0LmtleXModGFza3MpXG4gICAgcmVzdWx0cyA9IHt9XG4gICAgcGVuZGluZyA9IGtleXMubGVuZ3RoXG4gIH1cblxuICBmdW5jdGlvbiBkb25lIChlcnIpIHtcbiAgICBmdW5jdGlvbiBlbmQgKCkge1xuICAgICAgaWYgKGNiKSBjYihlcnIsIHJlc3VsdHMpXG4gICAgICBjYiA9IG51bGxcbiAgICB9XG4gICAgaWYgKGlzU3luYykgcXVldWVNaWNyb3Rhc2soZW5kKVxuICAgIGVsc2UgZW5kKClcbiAgfVxuXG4gIGZ1bmN0aW9uIGVhY2ggKGksIGVyciwgcmVzdWx0KSB7XG4gICAgcmVzdWx0c1tpXSA9IHJlc3VsdFxuICAgIGlmICgtLXBlbmRpbmcgPT09IDAgfHwgZXJyKSB7XG4gICAgICBkb25lKGVycilcbiAgICB9XG4gIH1cblxuICBpZiAoIXBlbmRpbmcpIHtcbiAgICAvLyBlbXB0eVxuICAgIGRvbmUobnVsbClcbiAgfSBlbHNlIGlmIChrZXlzKSB7XG4gICAgLy8gb2JqZWN0XG4gICAga2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgIHRhc2tzW2tleV0oZnVuY3Rpb24gKGVyciwgcmVzdWx0KSB7IGVhY2goa2V5LCBlcnIsIHJlc3VsdCkgfSlcbiAgICB9KVxuICB9IGVsc2Uge1xuICAgIC8vIGFycmF5XG4gICAgdGFza3MuZm9yRWFjaChmdW5jdGlvbiAodGFzaywgaSkge1xuICAgICAgdGFzayhmdW5jdGlvbiAoZXJyLCByZXN1bHQpIHsgZWFjaChpLCBlcnIsIHJlc3VsdCkgfSlcbiAgICB9KVxuICB9XG5cbiAgaXNTeW5jID0gZmFsc2Vcbn1cbiIsICJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuSVNfU1VQUE9SVF9SRUFERElSX1dJVEhfRklMRV9UWVBFUyA9IHZvaWQgMDtcbmNvbnN0IE5PREVfUFJPQ0VTU19WRVJTSU9OX1BBUlRTID0gcHJvY2Vzcy52ZXJzaW9ucy5ub2RlLnNwbGl0KCcuJyk7XG5pZiAoTk9ERV9QUk9DRVNTX1ZFUlNJT05fUEFSVFNbMF0gPT09IHVuZGVmaW5lZCB8fCBOT0RFX1BST0NFU1NfVkVSU0lPTl9QQVJUU1sxXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbmV4cGVjdGVkIGJlaGF2aW9yLiBUaGUgJ3Byb2Nlc3MudmVyc2lvbnMubm9kZScgdmFyaWFibGUgaGFzIGludmFsaWQgdmFsdWU6ICR7cHJvY2Vzcy52ZXJzaW9ucy5ub2RlfWApO1xufVxuY29uc3QgTUFKT1JfVkVSU0lPTiA9IE51bWJlci5wYXJzZUludChOT0RFX1BST0NFU1NfVkVSU0lPTl9QQVJUU1swXSwgMTApO1xuY29uc3QgTUlOT1JfVkVSU0lPTiA9IE51bWJlci5wYXJzZUludChOT0RFX1BST0NFU1NfVkVSU0lPTl9QQVJUU1sxXSwgMTApO1xuY29uc3QgU1VQUE9SVEVEX01BSk9SX1ZFUlNJT04gPSAxMDtcbmNvbnN0IFNVUFBPUlRFRF9NSU5PUl9WRVJTSU9OID0gMTA7XG5jb25zdCBJU19NQVRDSEVEX0JZX01BSk9SID0gTUFKT1JfVkVSU0lPTiA+IFNVUFBPUlRFRF9NQUpPUl9WRVJTSU9OO1xuY29uc3QgSVNfTUFUQ0hFRF9CWV9NQUpPUl9BTkRfTUlOT1IgPSBNQUpPUl9WRVJTSU9OID09PSBTVVBQT1JURURfTUFKT1JfVkVSU0lPTiAmJiBNSU5PUl9WRVJTSU9OID49IFNVUFBPUlRFRF9NSU5PUl9WRVJTSU9OO1xuLyoqXG4gKiBJUyBgdHJ1ZWAgZm9yIE5vZGUuanMgMTAuMTAgYW5kIGdyZWF0ZXIuXG4gKi9cbmV4cG9ydHMuSVNfU1VQUE9SVF9SRUFERElSX1dJVEhfRklMRV9UWVBFUyA9IElTX01BVENIRURfQllfTUFKT1IgfHwgSVNfTUFUQ0hFRF9CWV9NQUpPUl9BTkRfTUlOT1I7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmNyZWF0ZURpcmVudEZyb21TdGF0cyA9IHZvaWQgMDtcbmNsYXNzIERpcmVudEZyb21TdGF0cyB7XG4gICAgY29uc3RydWN0b3IobmFtZSwgc3RhdHMpIHtcbiAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgdGhpcy5pc0Jsb2NrRGV2aWNlID0gc3RhdHMuaXNCbG9ja0RldmljZS5iaW5kKHN0YXRzKTtcbiAgICAgICAgdGhpcy5pc0NoYXJhY3RlckRldmljZSA9IHN0YXRzLmlzQ2hhcmFjdGVyRGV2aWNlLmJpbmQoc3RhdHMpO1xuICAgICAgICB0aGlzLmlzRGlyZWN0b3J5ID0gc3RhdHMuaXNEaXJlY3RvcnkuYmluZChzdGF0cyk7XG4gICAgICAgIHRoaXMuaXNGSUZPID0gc3RhdHMuaXNGSUZPLmJpbmQoc3RhdHMpO1xuICAgICAgICB0aGlzLmlzRmlsZSA9IHN0YXRzLmlzRmlsZS5iaW5kKHN0YXRzKTtcbiAgICAgICAgdGhpcy5pc1NvY2tldCA9IHN0YXRzLmlzU29ja2V0LmJpbmQoc3RhdHMpO1xuICAgICAgICB0aGlzLmlzU3ltYm9saWNMaW5rID0gc3RhdHMuaXNTeW1ib2xpY0xpbmsuYmluZChzdGF0cyk7XG4gICAgfVxufVxuZnVuY3Rpb24gY3JlYXRlRGlyZW50RnJvbVN0YXRzKG5hbWUsIHN0YXRzKSB7XG4gICAgcmV0dXJuIG5ldyBEaXJlbnRGcm9tU3RhdHMobmFtZSwgc3RhdHMpO1xufVxuZXhwb3J0cy5jcmVhdGVEaXJlbnRGcm9tU3RhdHMgPSBjcmVhdGVEaXJlbnRGcm9tU3RhdHM7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmZzID0gdm9pZCAwO1xuY29uc3QgZnMgPSByZXF1aXJlKFwiLi9mc1wiKTtcbmV4cG9ydHMuZnMgPSBmcztcbiIsICJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuam9pblBhdGhTZWdtZW50cyA9IHZvaWQgMDtcbmZ1bmN0aW9uIGpvaW5QYXRoU2VnbWVudHMoYSwgYiwgc2VwYXJhdG9yKSB7XG4gICAgLyoqXG4gICAgICogVGhlIGNvcnJlY3QgaGFuZGxpbmcgb2YgY2FzZXMgd2hlbiB0aGUgZmlyc3Qgc2VnbWVudCBpcyBhIHJvb3QgKGAvYCwgYEM6L2ApIG9yIFVOQyBwYXRoIChgLy8/L0M6L2ApLlxuICAgICAqL1xuICAgIGlmIChhLmVuZHNXaXRoKHNlcGFyYXRvcikpIHtcbiAgICAgICAgcmV0dXJuIGEgKyBiO1xuICAgIH1cbiAgICByZXR1cm4gYSArIHNlcGFyYXRvciArIGI7XG59XG5leHBvcnRzLmpvaW5QYXRoU2VnbWVudHMgPSBqb2luUGF0aFNlZ21lbnRzO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5yZWFkZGlyID0gZXhwb3J0cy5yZWFkZGlyV2l0aEZpbGVUeXBlcyA9IGV4cG9ydHMucmVhZCA9IHZvaWQgMDtcbmNvbnN0IGZzU3RhdCA9IHJlcXVpcmUoXCJAbm9kZWxpYi9mcy5zdGF0XCIpO1xuY29uc3QgcnBsID0gcmVxdWlyZShcInJ1bi1wYXJhbGxlbFwiKTtcbmNvbnN0IGNvbnN0YW50c18xID0gcmVxdWlyZShcIi4uL2NvbnN0YW50c1wiKTtcbmNvbnN0IHV0aWxzID0gcmVxdWlyZShcIi4uL3V0aWxzXCIpO1xuY29uc3QgY29tbW9uID0gcmVxdWlyZShcIi4vY29tbW9uXCIpO1xuZnVuY3Rpb24gcmVhZChkaXJlY3RvcnksIHNldHRpbmdzLCBjYWxsYmFjaykge1xuICAgIGlmICghc2V0dGluZ3Muc3RhdHMgJiYgY29uc3RhbnRzXzEuSVNfU1VQUE9SVF9SRUFERElSX1dJVEhfRklMRV9UWVBFUykge1xuICAgICAgICByZWFkZGlyV2l0aEZpbGVUeXBlcyhkaXJlY3RvcnksIHNldHRpbmdzLCBjYWxsYmFjayk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmVhZGRpcihkaXJlY3RvcnksIHNldHRpbmdzLCBjYWxsYmFjayk7XG59XG5leHBvcnRzLnJlYWQgPSByZWFkO1xuZnVuY3Rpb24gcmVhZGRpcldpdGhGaWxlVHlwZXMoZGlyZWN0b3J5LCBzZXR0aW5ncywgY2FsbGJhY2spIHtcbiAgICBzZXR0aW5ncy5mcy5yZWFkZGlyKGRpcmVjdG9yeSwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0sIChyZWFkZGlyRXJyb3IsIGRpcmVudHMpID0+IHtcbiAgICAgICAgaWYgKHJlYWRkaXJFcnJvciAhPT0gbnVsbCkge1xuICAgICAgICAgICAgY2FsbEZhaWx1cmVDYWxsYmFjayhjYWxsYmFjaywgcmVhZGRpckVycm9yKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBlbnRyaWVzID0gZGlyZW50cy5tYXAoKGRpcmVudCkgPT4gKHtcbiAgICAgICAgICAgIGRpcmVudCxcbiAgICAgICAgICAgIG5hbWU6IGRpcmVudC5uYW1lLFxuICAgICAgICAgICAgcGF0aDogY29tbW9uLmpvaW5QYXRoU2VnbWVudHMoZGlyZWN0b3J5LCBkaXJlbnQubmFtZSwgc2V0dGluZ3MucGF0aFNlZ21lbnRTZXBhcmF0b3IpXG4gICAgICAgIH0pKTtcbiAgICAgICAgaWYgKCFzZXR0aW5ncy5mb2xsb3dTeW1ib2xpY0xpbmtzKSB7XG4gICAgICAgICAgICBjYWxsU3VjY2Vzc0NhbGxiYWNrKGNhbGxiYWNrLCBlbnRyaWVzKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0YXNrcyA9IGVudHJpZXMubWFwKChlbnRyeSkgPT4gbWFrZVJwbFRhc2tFbnRyeShlbnRyeSwgc2V0dGluZ3MpKTtcbiAgICAgICAgcnBsKHRhc2tzLCAocnBsRXJyb3IsIHJwbEVudHJpZXMpID0+IHtcbiAgICAgICAgICAgIGlmIChycGxFcnJvciAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGNhbGxGYWlsdXJlQ2FsbGJhY2soY2FsbGJhY2ssIHJwbEVycm9yKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYWxsU3VjY2Vzc0NhbGxiYWNrKGNhbGxiYWNrLCBycGxFbnRyaWVzKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG59XG5leHBvcnRzLnJlYWRkaXJXaXRoRmlsZVR5cGVzID0gcmVhZGRpcldpdGhGaWxlVHlwZXM7XG5mdW5jdGlvbiBtYWtlUnBsVGFza0VudHJ5KGVudHJ5LCBzZXR0aW5ncykge1xuICAgIHJldHVybiAoZG9uZSkgPT4ge1xuICAgICAgICBpZiAoIWVudHJ5LmRpcmVudC5pc1N5bWJvbGljTGluaygpKSB7XG4gICAgICAgICAgICBkb25lKG51bGwsIGVudHJ5KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBzZXR0aW5ncy5mcy5zdGF0KGVudHJ5LnBhdGgsIChzdGF0RXJyb3IsIHN0YXRzKSA9PiB7XG4gICAgICAgICAgICBpZiAoc3RhdEVycm9yICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgaWYgKHNldHRpbmdzLnRocm93RXJyb3JPbkJyb2tlblN5bWJvbGljTGluaykge1xuICAgICAgICAgICAgICAgICAgICBkb25lKHN0YXRFcnJvcik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZG9uZShudWxsLCBlbnRyeSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZW50cnkuZGlyZW50ID0gdXRpbHMuZnMuY3JlYXRlRGlyZW50RnJvbVN0YXRzKGVudHJ5Lm5hbWUsIHN0YXRzKTtcbiAgICAgICAgICAgIGRvbmUobnVsbCwgZW50cnkpO1xuICAgICAgICB9KTtcbiAgICB9O1xufVxuZnVuY3Rpb24gcmVhZGRpcihkaXJlY3RvcnksIHNldHRpbmdzLCBjYWxsYmFjaykge1xuICAgIHNldHRpbmdzLmZzLnJlYWRkaXIoZGlyZWN0b3J5LCAocmVhZGRpckVycm9yLCBuYW1lcykgPT4ge1xuICAgICAgICBpZiAocmVhZGRpckVycm9yICE9PSBudWxsKSB7XG4gICAgICAgICAgICBjYWxsRmFpbHVyZUNhbGxiYWNrKGNhbGxiYWNrLCByZWFkZGlyRXJyb3IpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRhc2tzID0gbmFtZXMubWFwKChuYW1lKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBwYXRoID0gY29tbW9uLmpvaW5QYXRoU2VnbWVudHMoZGlyZWN0b3J5LCBuYW1lLCBzZXR0aW5ncy5wYXRoU2VnbWVudFNlcGFyYXRvcik7XG4gICAgICAgICAgICByZXR1cm4gKGRvbmUpID0+IHtcbiAgICAgICAgICAgICAgICBmc1N0YXQuc3RhdChwYXRoLCBzZXR0aW5ncy5mc1N0YXRTZXR0aW5ncywgKGVycm9yLCBzdGF0cykgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3IgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUoZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVudHJ5ID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXJlbnQ6IHV0aWxzLmZzLmNyZWF0ZURpcmVudEZyb21TdGF0cyhuYW1lLCBzdGF0cylcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNldHRpbmdzLnN0YXRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5zdGF0cyA9IHN0YXRzO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGRvbmUobnVsbCwgZW50cnkpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJwbCh0YXNrcywgKHJwbEVycm9yLCBlbnRyaWVzKSA9PiB7XG4gICAgICAgICAgICBpZiAocnBsRXJyb3IgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBjYWxsRmFpbHVyZUNhbGxiYWNrKGNhbGxiYWNrLCBycGxFcnJvcik7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FsbFN1Y2Nlc3NDYWxsYmFjayhjYWxsYmFjaywgZW50cmllcyk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xufVxuZXhwb3J0cy5yZWFkZGlyID0gcmVhZGRpcjtcbmZ1bmN0aW9uIGNhbGxGYWlsdXJlQ2FsbGJhY2soY2FsbGJhY2ssIGVycm9yKSB7XG4gICAgY2FsbGJhY2soZXJyb3IpO1xufVxuZnVuY3Rpb24gY2FsbFN1Y2Nlc3NDYWxsYmFjayhjYWxsYmFjaywgcmVzdWx0KSB7XG4gICAgY2FsbGJhY2sobnVsbCwgcmVzdWx0KTtcbn1cbiIsICJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMucmVhZGRpciA9IGV4cG9ydHMucmVhZGRpcldpdGhGaWxlVHlwZXMgPSBleHBvcnRzLnJlYWQgPSB2b2lkIDA7XG5jb25zdCBmc1N0YXQgPSByZXF1aXJlKFwiQG5vZGVsaWIvZnMuc3RhdFwiKTtcbmNvbnN0IGNvbnN0YW50c18xID0gcmVxdWlyZShcIi4uL2NvbnN0YW50c1wiKTtcbmNvbnN0IHV0aWxzID0gcmVxdWlyZShcIi4uL3V0aWxzXCIpO1xuY29uc3QgY29tbW9uID0gcmVxdWlyZShcIi4vY29tbW9uXCIpO1xuZnVuY3Rpb24gcmVhZChkaXJlY3RvcnksIHNldHRpbmdzKSB7XG4gICAgaWYgKCFzZXR0aW5ncy5zdGF0cyAmJiBjb25zdGFudHNfMS5JU19TVVBQT1JUX1JFQURESVJfV0lUSF9GSUxFX1RZUEVTKSB7XG4gICAgICAgIHJldHVybiByZWFkZGlyV2l0aEZpbGVUeXBlcyhkaXJlY3RvcnksIHNldHRpbmdzKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlYWRkaXIoZGlyZWN0b3J5LCBzZXR0aW5ncyk7XG59XG5leHBvcnRzLnJlYWQgPSByZWFkO1xuZnVuY3Rpb24gcmVhZGRpcldpdGhGaWxlVHlwZXMoZGlyZWN0b3J5LCBzZXR0aW5ncykge1xuICAgIGNvbnN0IGRpcmVudHMgPSBzZXR0aW5ncy5mcy5yZWFkZGlyU3luYyhkaXJlY3RvcnksIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgICByZXR1cm4gZGlyZW50cy5tYXAoKGRpcmVudCkgPT4ge1xuICAgICAgICBjb25zdCBlbnRyeSA9IHtcbiAgICAgICAgICAgIGRpcmVudCxcbiAgICAgICAgICAgIG5hbWU6IGRpcmVudC5uYW1lLFxuICAgICAgICAgICAgcGF0aDogY29tbW9uLmpvaW5QYXRoU2VnbWVudHMoZGlyZWN0b3J5LCBkaXJlbnQubmFtZSwgc2V0dGluZ3MucGF0aFNlZ21lbnRTZXBhcmF0b3IpXG4gICAgICAgIH07XG4gICAgICAgIGlmIChlbnRyeS5kaXJlbnQuaXNTeW1ib2xpY0xpbmsoKSAmJiBzZXR0aW5ncy5mb2xsb3dTeW1ib2xpY0xpbmtzKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHN0YXRzID0gc2V0dGluZ3MuZnMuc3RhdFN5bmMoZW50cnkucGF0aCk7XG4gICAgICAgICAgICAgICAgZW50cnkuZGlyZW50ID0gdXRpbHMuZnMuY3JlYXRlRGlyZW50RnJvbVN0YXRzKGVudHJ5Lm5hbWUsIHN0YXRzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIGlmIChzZXR0aW5ncy50aHJvd0Vycm9yT25Ccm9rZW5TeW1ib2xpY0xpbmspIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlbnRyeTtcbiAgICB9KTtcbn1cbmV4cG9ydHMucmVhZGRpcldpdGhGaWxlVHlwZXMgPSByZWFkZGlyV2l0aEZpbGVUeXBlcztcbmZ1bmN0aW9uIHJlYWRkaXIoZGlyZWN0b3J5LCBzZXR0aW5ncykge1xuICAgIGNvbnN0IG5hbWVzID0gc2V0dGluZ3MuZnMucmVhZGRpclN5bmMoZGlyZWN0b3J5KTtcbiAgICByZXR1cm4gbmFtZXMubWFwKChuYW1lKSA9PiB7XG4gICAgICAgIGNvbnN0IGVudHJ5UGF0aCA9IGNvbW1vbi5qb2luUGF0aFNlZ21lbnRzKGRpcmVjdG9yeSwgbmFtZSwgc2V0dGluZ3MucGF0aFNlZ21lbnRTZXBhcmF0b3IpO1xuICAgICAgICBjb25zdCBzdGF0cyA9IGZzU3RhdC5zdGF0U3luYyhlbnRyeVBhdGgsIHNldHRpbmdzLmZzU3RhdFNldHRpbmdzKTtcbiAgICAgICAgY29uc3QgZW50cnkgPSB7XG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgcGF0aDogZW50cnlQYXRoLFxuICAgICAgICAgICAgZGlyZW50OiB1dGlscy5mcy5jcmVhdGVEaXJlbnRGcm9tU3RhdHMobmFtZSwgc3RhdHMpXG4gICAgICAgIH07XG4gICAgICAgIGlmIChzZXR0aW5ncy5zdGF0cykge1xuICAgICAgICAgICAgZW50cnkuc3RhdHMgPSBzdGF0cztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZW50cnk7XG4gICAgfSk7XG59XG5leHBvcnRzLnJlYWRkaXIgPSByZWFkZGlyO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5jcmVhdGVGaWxlU3lzdGVtQWRhcHRlciA9IGV4cG9ydHMuRklMRV9TWVNURU1fQURBUFRFUiA9IHZvaWQgMDtcbmNvbnN0IGZzID0gcmVxdWlyZShcImZzXCIpO1xuZXhwb3J0cy5GSUxFX1NZU1RFTV9BREFQVEVSID0ge1xuICAgIGxzdGF0OiBmcy5sc3RhdCxcbiAgICBzdGF0OiBmcy5zdGF0LFxuICAgIGxzdGF0U3luYzogZnMubHN0YXRTeW5jLFxuICAgIHN0YXRTeW5jOiBmcy5zdGF0U3luYyxcbiAgICByZWFkZGlyOiBmcy5yZWFkZGlyLFxuICAgIHJlYWRkaXJTeW5jOiBmcy5yZWFkZGlyU3luY1xufTtcbmZ1bmN0aW9uIGNyZWF0ZUZpbGVTeXN0ZW1BZGFwdGVyKGZzTWV0aG9kcykge1xuICAgIGlmIChmc01ldGhvZHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gZXhwb3J0cy5GSUxFX1NZU1RFTV9BREFQVEVSO1xuICAgIH1cbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBleHBvcnRzLkZJTEVfU1lTVEVNX0FEQVBURVIpLCBmc01ldGhvZHMpO1xufVxuZXhwb3J0cy5jcmVhdGVGaWxlU3lzdGVtQWRhcHRlciA9IGNyZWF0ZUZpbGVTeXN0ZW1BZGFwdGVyO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuY29uc3QgcGF0aCA9IHJlcXVpcmUoXCJwYXRoXCIpO1xuY29uc3QgZnNTdGF0ID0gcmVxdWlyZShcIkBub2RlbGliL2ZzLnN0YXRcIik7XG5jb25zdCBmcyA9IHJlcXVpcmUoXCIuL2FkYXB0ZXJzL2ZzXCIpO1xuY2xhc3MgU2V0dGluZ3Mge1xuICAgIGNvbnN0cnVjdG9yKF9vcHRpb25zID0ge30pIHtcbiAgICAgICAgdGhpcy5fb3B0aW9ucyA9IF9vcHRpb25zO1xuICAgICAgICB0aGlzLmZvbGxvd1N5bWJvbGljTGlua3MgPSB0aGlzLl9nZXRWYWx1ZSh0aGlzLl9vcHRpb25zLmZvbGxvd1N5bWJvbGljTGlua3MsIGZhbHNlKTtcbiAgICAgICAgdGhpcy5mcyA9IGZzLmNyZWF0ZUZpbGVTeXN0ZW1BZGFwdGVyKHRoaXMuX29wdGlvbnMuZnMpO1xuICAgICAgICB0aGlzLnBhdGhTZWdtZW50U2VwYXJhdG9yID0gdGhpcy5fZ2V0VmFsdWUodGhpcy5fb3B0aW9ucy5wYXRoU2VnbWVudFNlcGFyYXRvciwgcGF0aC5zZXApO1xuICAgICAgICB0aGlzLnN0YXRzID0gdGhpcy5fZ2V0VmFsdWUodGhpcy5fb3B0aW9ucy5zdGF0cywgZmFsc2UpO1xuICAgICAgICB0aGlzLnRocm93RXJyb3JPbkJyb2tlblN5bWJvbGljTGluayA9IHRoaXMuX2dldFZhbHVlKHRoaXMuX29wdGlvbnMudGhyb3dFcnJvck9uQnJva2VuU3ltYm9saWNMaW5rLCB0cnVlKTtcbiAgICAgICAgdGhpcy5mc1N0YXRTZXR0aW5ncyA9IG5ldyBmc1N0YXQuU2V0dGluZ3Moe1xuICAgICAgICAgICAgZm9sbG93U3ltYm9saWNMaW5rOiB0aGlzLmZvbGxvd1N5bWJvbGljTGlua3MsXG4gICAgICAgICAgICBmczogdGhpcy5mcyxcbiAgICAgICAgICAgIHRocm93RXJyb3JPbkJyb2tlblN5bWJvbGljTGluazogdGhpcy50aHJvd0Vycm9yT25Ccm9rZW5TeW1ib2xpY0xpbmtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIF9nZXRWYWx1ZShvcHRpb24sIHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBvcHRpb24gIT09IG51bGwgJiYgb3B0aW9uICE9PSB2b2lkIDAgPyBvcHRpb24gOiB2YWx1ZTtcbiAgICB9XG59XG5leHBvcnRzLmRlZmF1bHQgPSBTZXR0aW5ncztcbiIsICJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuU2V0dGluZ3MgPSBleHBvcnRzLnNjYW5kaXJTeW5jID0gZXhwb3J0cy5zY2FuZGlyID0gdm9pZCAwO1xuY29uc3QgYXN5bmMgPSByZXF1aXJlKFwiLi9wcm92aWRlcnMvYXN5bmNcIik7XG5jb25zdCBzeW5jID0gcmVxdWlyZShcIi4vcHJvdmlkZXJzL3N5bmNcIik7XG5jb25zdCBzZXR0aW5nc18xID0gcmVxdWlyZShcIi4vc2V0dGluZ3NcIik7XG5leHBvcnRzLlNldHRpbmdzID0gc2V0dGluZ3NfMS5kZWZhdWx0O1xuZnVuY3Rpb24gc2NhbmRpcihwYXRoLCBvcHRpb25zT3JTZXR0aW5nc09yQ2FsbGJhY2ssIGNhbGxiYWNrKSB7XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zT3JTZXR0aW5nc09yQ2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgYXN5bmMucmVhZChwYXRoLCBnZXRTZXR0aW5ncygpLCBvcHRpb25zT3JTZXR0aW5nc09yQ2FsbGJhY2spO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGFzeW5jLnJlYWQocGF0aCwgZ2V0U2V0dGluZ3Mob3B0aW9uc09yU2V0dGluZ3NPckNhbGxiYWNrKSwgY2FsbGJhY2spO1xufVxuZXhwb3J0cy5zY2FuZGlyID0gc2NhbmRpcjtcbmZ1bmN0aW9uIHNjYW5kaXJTeW5jKHBhdGgsIG9wdGlvbnNPclNldHRpbmdzKSB7XG4gICAgY29uc3Qgc2V0dGluZ3MgPSBnZXRTZXR0aW5ncyhvcHRpb25zT3JTZXR0aW5ncyk7XG4gICAgcmV0dXJuIHN5bmMucmVhZChwYXRoLCBzZXR0aW5ncyk7XG59XG5leHBvcnRzLnNjYW5kaXJTeW5jID0gc2NhbmRpclN5bmM7XG5mdW5jdGlvbiBnZXRTZXR0aW5ncyhzZXR0aW5nc09yT3B0aW9ucyA9IHt9KSB7XG4gICAgaWYgKHNldHRpbmdzT3JPcHRpb25zIGluc3RhbmNlb2Ygc2V0dGluZ3NfMS5kZWZhdWx0KSB7XG4gICAgICAgIHJldHVybiBzZXR0aW5nc09yT3B0aW9ucztcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBzZXR0aW5nc18xLmRlZmF1bHQoc2V0dGluZ3NPck9wdGlvbnMpO1xufVxuIiwgIid1c2Ugc3RyaWN0J1xuXG5mdW5jdGlvbiByZXVzaWZ5IChDb25zdHJ1Y3Rvcikge1xuICB2YXIgaGVhZCA9IG5ldyBDb25zdHJ1Y3RvcigpXG4gIHZhciB0YWlsID0gaGVhZFxuXG4gIGZ1bmN0aW9uIGdldCAoKSB7XG4gICAgdmFyIGN1cnJlbnQgPSBoZWFkXG5cbiAgICBpZiAoY3VycmVudC5uZXh0KSB7XG4gICAgICBoZWFkID0gY3VycmVudC5uZXh0XG4gICAgfSBlbHNlIHtcbiAgICAgIGhlYWQgPSBuZXcgQ29uc3RydWN0b3IoKVxuICAgICAgdGFpbCA9IGhlYWRcbiAgICB9XG5cbiAgICBjdXJyZW50Lm5leHQgPSBudWxsXG5cbiAgICByZXR1cm4gY3VycmVudFxuICB9XG5cbiAgZnVuY3Rpb24gcmVsZWFzZSAob2JqKSB7XG4gICAgdGFpbC5uZXh0ID0gb2JqXG4gICAgdGFpbCA9IG9ialxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBnZXQ6IGdldCxcbiAgICByZWxlYXNlOiByZWxlYXNlXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSByZXVzaWZ5XG4iLCAiJ3VzZSBzdHJpY3QnXG5cbi8qIGVzbGludC1kaXNhYmxlIG5vLXZhciAqL1xuXG52YXIgcmV1c2lmeSA9IHJlcXVpcmUoJ3JldXNpZnknKVxuXG5mdW5jdGlvbiBmYXN0cXVldWUgKGNvbnRleHQsIHdvcmtlciwgY29uY3VycmVuY3kpIHtcbiAgaWYgKHR5cGVvZiBjb250ZXh0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY29uY3VycmVuY3kgPSB3b3JrZXJcbiAgICB3b3JrZXIgPSBjb250ZXh0XG4gICAgY29udGV4dCA9IG51bGxcbiAgfVxuXG4gIGlmIChjb25jdXJyZW5jeSA8IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2Zhc3RxdWV1ZSBjb25jdXJyZW5jeSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAxJylcbiAgfVxuXG4gIHZhciBjYWNoZSA9IHJldXNpZnkoVGFzaylcbiAgdmFyIHF1ZXVlSGVhZCA9IG51bGxcbiAgdmFyIHF1ZXVlVGFpbCA9IG51bGxcbiAgdmFyIF9ydW5uaW5nID0gMFxuICB2YXIgZXJyb3JIYW5kbGVyID0gbnVsbFxuXG4gIHZhciBzZWxmID0ge1xuICAgIHB1c2g6IHB1c2gsXG4gICAgZHJhaW46IG5vb3AsXG4gICAgc2F0dXJhdGVkOiBub29wLFxuICAgIHBhdXNlOiBwYXVzZSxcbiAgICBwYXVzZWQ6IGZhbHNlLFxuICAgIGNvbmN1cnJlbmN5OiBjb25jdXJyZW5jeSxcbiAgICBydW5uaW5nOiBydW5uaW5nLFxuICAgIHJlc3VtZTogcmVzdW1lLFxuICAgIGlkbGU6IGlkbGUsXG4gICAgbGVuZ3RoOiBsZW5ndGgsXG4gICAgZ2V0UXVldWU6IGdldFF1ZXVlLFxuICAgIHVuc2hpZnQ6IHVuc2hpZnQsXG4gICAgZW1wdHk6IG5vb3AsXG4gICAga2lsbDoga2lsbCxcbiAgICBraWxsQW5kRHJhaW46IGtpbGxBbmREcmFpbixcbiAgICBlcnJvcjogZXJyb3JcbiAgfVxuXG4gIHJldHVybiBzZWxmXG5cbiAgZnVuY3Rpb24gcnVubmluZyAoKSB7XG4gICAgcmV0dXJuIF9ydW5uaW5nXG4gIH1cblxuICBmdW5jdGlvbiBwYXVzZSAoKSB7XG4gICAgc2VsZi5wYXVzZWQgPSB0cnVlXG4gIH1cblxuICBmdW5jdGlvbiBsZW5ndGggKCkge1xuICAgIHZhciBjdXJyZW50ID0gcXVldWVIZWFkXG4gICAgdmFyIGNvdW50ZXIgPSAwXG5cbiAgICB3aGlsZSAoY3VycmVudCkge1xuICAgICAgY3VycmVudCA9IGN1cnJlbnQubmV4dFxuICAgICAgY291bnRlcisrXG4gICAgfVxuXG4gICAgcmV0dXJuIGNvdW50ZXJcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldFF1ZXVlICgpIHtcbiAgICB2YXIgY3VycmVudCA9IHF1ZXVlSGVhZFxuICAgIHZhciB0YXNrcyA9IFtdXG5cbiAgICB3aGlsZSAoY3VycmVudCkge1xuICAgICAgdGFza3MucHVzaChjdXJyZW50LnZhbHVlKVxuICAgICAgY3VycmVudCA9IGN1cnJlbnQubmV4dFxuICAgIH1cblxuICAgIHJldHVybiB0YXNrc1xuICB9XG5cbiAgZnVuY3Rpb24gcmVzdW1lICgpIHtcbiAgICBpZiAoIXNlbGYucGF1c2VkKSByZXR1cm5cbiAgICBzZWxmLnBhdXNlZCA9IGZhbHNlXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLmNvbmN1cnJlbmN5OyBpKyspIHtcbiAgICAgIF9ydW5uaW5nKytcbiAgICAgIHJlbGVhc2UoKVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGlkbGUgKCkge1xuICAgIHJldHVybiBfcnVubmluZyA9PT0gMCAmJiBzZWxmLmxlbmd0aCgpID09PSAwXG4gIH1cblxuICBmdW5jdGlvbiBwdXNoICh2YWx1ZSwgZG9uZSkge1xuICAgIHZhciBjdXJyZW50ID0gY2FjaGUuZ2V0KClcblxuICAgIGN1cnJlbnQuY29udGV4dCA9IGNvbnRleHRcbiAgICBjdXJyZW50LnJlbGVhc2UgPSByZWxlYXNlXG4gICAgY3VycmVudC52YWx1ZSA9IHZhbHVlXG4gICAgY3VycmVudC5jYWxsYmFjayA9IGRvbmUgfHwgbm9vcFxuICAgIGN1cnJlbnQuZXJyb3JIYW5kbGVyID0gZXJyb3JIYW5kbGVyXG5cbiAgICBpZiAoX3J1bm5pbmcgPT09IHNlbGYuY29uY3VycmVuY3kgfHwgc2VsZi5wYXVzZWQpIHtcbiAgICAgIGlmIChxdWV1ZVRhaWwpIHtcbiAgICAgICAgcXVldWVUYWlsLm5leHQgPSBjdXJyZW50XG4gICAgICAgIHF1ZXVlVGFpbCA9IGN1cnJlbnRcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHF1ZXVlSGVhZCA9IGN1cnJlbnRcbiAgICAgICAgcXVldWVUYWlsID0gY3VycmVudFxuICAgICAgICBzZWxmLnNhdHVyYXRlZCgpXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIF9ydW5uaW5nKytcbiAgICAgIHdvcmtlci5jYWxsKGNvbnRleHQsIGN1cnJlbnQudmFsdWUsIGN1cnJlbnQud29ya2VkKVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHVuc2hpZnQgKHZhbHVlLCBkb25lKSB7XG4gICAgdmFyIGN1cnJlbnQgPSBjYWNoZS5nZXQoKVxuXG4gICAgY3VycmVudC5jb250ZXh0ID0gY29udGV4dFxuICAgIGN1cnJlbnQucmVsZWFzZSA9IHJlbGVhc2VcbiAgICBjdXJyZW50LnZhbHVlID0gdmFsdWVcbiAgICBjdXJyZW50LmNhbGxiYWNrID0gZG9uZSB8fCBub29wXG5cbiAgICBpZiAoX3J1bm5pbmcgPT09IHNlbGYuY29uY3VycmVuY3kgfHwgc2VsZi5wYXVzZWQpIHtcbiAgICAgIGlmIChxdWV1ZUhlYWQpIHtcbiAgICAgICAgY3VycmVudC5uZXh0ID0gcXVldWVIZWFkXG4gICAgICAgIHF1ZXVlSGVhZCA9IGN1cnJlbnRcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHF1ZXVlSGVhZCA9IGN1cnJlbnRcbiAgICAgICAgcXVldWVUYWlsID0gY3VycmVudFxuICAgICAgICBzZWxmLnNhdHVyYXRlZCgpXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIF9ydW5uaW5nKytcbiAgICAgIHdvcmtlci5jYWxsKGNvbnRleHQsIGN1cnJlbnQudmFsdWUsIGN1cnJlbnQud29ya2VkKVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHJlbGVhc2UgKGhvbGRlcikge1xuICAgIGlmIChob2xkZXIpIHtcbiAgICAgIGNhY2hlLnJlbGVhc2UoaG9sZGVyKVxuICAgIH1cbiAgICB2YXIgbmV4dCA9IHF1ZXVlSGVhZFxuICAgIGlmIChuZXh0KSB7XG4gICAgICBpZiAoIXNlbGYucGF1c2VkKSB7XG4gICAgICAgIGlmIChxdWV1ZVRhaWwgPT09IHF1ZXVlSGVhZCkge1xuICAgICAgICAgIHF1ZXVlVGFpbCA9IG51bGxcbiAgICAgICAgfVxuICAgICAgICBxdWV1ZUhlYWQgPSBuZXh0Lm5leHRcbiAgICAgICAgbmV4dC5uZXh0ID0gbnVsbFxuICAgICAgICB3b3JrZXIuY2FsbChjb250ZXh0LCBuZXh0LnZhbHVlLCBuZXh0LndvcmtlZClcbiAgICAgICAgaWYgKHF1ZXVlVGFpbCA9PT0gbnVsbCkge1xuICAgICAgICAgIHNlbGYuZW1wdHkoKVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBfcnVubmluZy0tXG4gICAgICB9XG4gICAgfSBlbHNlIGlmICgtLV9ydW5uaW5nID09PSAwKSB7XG4gICAgICBzZWxmLmRyYWluKClcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBraWxsICgpIHtcbiAgICBxdWV1ZUhlYWQgPSBudWxsXG4gICAgcXVldWVUYWlsID0gbnVsbFxuICAgIHNlbGYuZHJhaW4gPSBub29wXG4gIH1cblxuICBmdW5jdGlvbiBraWxsQW5kRHJhaW4gKCkge1xuICAgIHF1ZXVlSGVhZCA9IG51bGxcbiAgICBxdWV1ZVRhaWwgPSBudWxsXG4gICAgc2VsZi5kcmFpbigpXG4gICAgc2VsZi5kcmFpbiA9IG5vb3BcbiAgfVxuXG4gIGZ1bmN0aW9uIGVycm9yIChoYW5kbGVyKSB7XG4gICAgZXJyb3JIYW5kbGVyID0gaGFuZGxlclxuICB9XG59XG5cbmZ1bmN0aW9uIG5vb3AgKCkge31cblxuZnVuY3Rpb24gVGFzayAoKSB7XG4gIHRoaXMudmFsdWUgPSBudWxsXG4gIHRoaXMuY2FsbGJhY2sgPSBub29wXG4gIHRoaXMubmV4dCA9IG51bGxcbiAgdGhpcy5yZWxlYXNlID0gbm9vcFxuICB0aGlzLmNvbnRleHQgPSBudWxsXG4gIHRoaXMuZXJyb3JIYW5kbGVyID0gbnVsbFxuXG4gIHZhciBzZWxmID0gdGhpc1xuXG4gIHRoaXMud29ya2VkID0gZnVuY3Rpb24gd29ya2VkIChlcnIsIHJlc3VsdCkge1xuICAgIHZhciBjYWxsYmFjayA9IHNlbGYuY2FsbGJhY2tcbiAgICB2YXIgZXJyb3JIYW5kbGVyID0gc2VsZi5lcnJvckhhbmRsZXJcbiAgICB2YXIgdmFsID0gc2VsZi52YWx1ZVxuICAgIHNlbGYudmFsdWUgPSBudWxsXG4gICAgc2VsZi5jYWxsYmFjayA9IG5vb3BcbiAgICBpZiAoc2VsZi5lcnJvckhhbmRsZXIpIHtcbiAgICAgIGVycm9ySGFuZGxlcihlcnIsIHZhbClcbiAgICB9XG4gICAgY2FsbGJhY2suY2FsbChzZWxmLmNvbnRleHQsIGVyciwgcmVzdWx0KVxuICAgIHNlbGYucmVsZWFzZShzZWxmKVxuICB9XG59XG5cbmZ1bmN0aW9uIHF1ZXVlQXNQcm9taXNlZCAoY29udGV4dCwgd29ya2VyLCBjb25jdXJyZW5jeSkge1xuICBpZiAodHlwZW9mIGNvbnRleHQgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjb25jdXJyZW5jeSA9IHdvcmtlclxuICAgIHdvcmtlciA9IGNvbnRleHRcbiAgICBjb250ZXh0ID0gbnVsbFxuICB9XG5cbiAgZnVuY3Rpb24gYXN5bmNXcmFwcGVyIChhcmcsIGNiKSB7XG4gICAgd29ya2VyLmNhbGwodGhpcywgYXJnKVxuICAgICAgLnRoZW4oZnVuY3Rpb24gKHJlcykge1xuICAgICAgICBjYihudWxsLCByZXMpXG4gICAgICB9LCBjYilcbiAgfVxuXG4gIHZhciBxdWV1ZSA9IGZhc3RxdWV1ZShjb250ZXh0LCBhc3luY1dyYXBwZXIsIGNvbmN1cnJlbmN5KVxuXG4gIHZhciBwdXNoQ2IgPSBxdWV1ZS5wdXNoXG4gIHZhciB1bnNoaWZ0Q2IgPSBxdWV1ZS51bnNoaWZ0XG5cbiAgcXVldWUucHVzaCA9IHB1c2hcbiAgcXVldWUudW5zaGlmdCA9IHVuc2hpZnRcbiAgcXVldWUuZHJhaW5lZCA9IGRyYWluZWRcblxuICByZXR1cm4gcXVldWVcblxuICBmdW5jdGlvbiBwdXNoICh2YWx1ZSkge1xuICAgIHZhciBwID0gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgcHVzaENiKHZhbHVlLCBmdW5jdGlvbiAoZXJyLCByZXN1bHQpIHtcbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgIHJlamVjdChlcnIpXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgcmVzb2x2ZShyZXN1bHQpXG4gICAgICB9KVxuICAgIH0pXG5cbiAgICAvLyBMZXQncyBmb3JrIHRoZSBwcm9taXNlIGNoYWluIHRvXG4gICAgLy8gbWFrZSB0aGUgZXJyb3IgYnViYmxlIHVwIHRvIHRoZSB1c2VyIGJ1dFxuICAgIC8vIG5vdCBsZWFkIHRvIGEgdW5oYW5kbGVkUmVqZWN0aW9uXG4gICAgcC5jYXRjaChub29wKVxuXG4gICAgcmV0dXJuIHBcbiAgfVxuXG4gIGZ1bmN0aW9uIHVuc2hpZnQgKHZhbHVlKSB7XG4gICAgdmFyIHAgPSBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICB1bnNoaWZ0Q2IodmFsdWUsIGZ1bmN0aW9uIChlcnIsIHJlc3VsdCkge1xuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgcmVqZWN0KGVycilcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICByZXNvbHZlKHJlc3VsdClcbiAgICAgIH0pXG4gICAgfSlcblxuICAgIC8vIExldCdzIGZvcmsgdGhlIHByb21pc2UgY2hhaW4gdG9cbiAgICAvLyBtYWtlIHRoZSBlcnJvciBidWJibGUgdXAgdG8gdGhlIHVzZXIgYnV0XG4gICAgLy8gbm90IGxlYWQgdG8gYSB1bmhhbmRsZWRSZWplY3Rpb25cbiAgICBwLmNhdGNoKG5vb3ApXG5cbiAgICByZXR1cm4gcFxuICB9XG5cbiAgZnVuY3Rpb24gZHJhaW5lZCAoKSB7XG4gICAgaWYgKHF1ZXVlLmlkbGUoKSkge1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICAgIHJlc29sdmUoKVxuICAgICAgfSlcbiAgICB9XG5cbiAgICB2YXIgcHJldmlvdXNEcmFpbiA9IHF1ZXVlLmRyYWluXG5cbiAgICB2YXIgcCA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICBxdWV1ZS5kcmFpbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcHJldmlvdXNEcmFpbigpXG4gICAgICAgIHJlc29sdmUoKVxuICAgICAgfVxuICAgIH0pXG5cbiAgICByZXR1cm4gcFxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZmFzdHF1ZXVlXG5tb2R1bGUuZXhwb3J0cy5wcm9taXNlID0gcXVldWVBc1Byb21pc2VkXG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmpvaW5QYXRoU2VnbWVudHMgPSBleHBvcnRzLnJlcGxhY2VQYXRoU2VnbWVudFNlcGFyYXRvciA9IGV4cG9ydHMuaXNBcHBsaWVkRmlsdGVyID0gZXhwb3J0cy5pc0ZhdGFsRXJyb3IgPSB2b2lkIDA7XG5mdW5jdGlvbiBpc0ZhdGFsRXJyb3Ioc2V0dGluZ3MsIGVycm9yKSB7XG4gICAgaWYgKHNldHRpbmdzLmVycm9yRmlsdGVyID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gIXNldHRpbmdzLmVycm9yRmlsdGVyKGVycm9yKTtcbn1cbmV4cG9ydHMuaXNGYXRhbEVycm9yID0gaXNGYXRhbEVycm9yO1xuZnVuY3Rpb24gaXNBcHBsaWVkRmlsdGVyKGZpbHRlciwgdmFsdWUpIHtcbiAgICByZXR1cm4gZmlsdGVyID09PSBudWxsIHx8IGZpbHRlcih2YWx1ZSk7XG59XG5leHBvcnRzLmlzQXBwbGllZEZpbHRlciA9IGlzQXBwbGllZEZpbHRlcjtcbmZ1bmN0aW9uIHJlcGxhY2VQYXRoU2VnbWVudFNlcGFyYXRvcihmaWxlcGF0aCwgc2VwYXJhdG9yKSB7XG4gICAgcmV0dXJuIGZpbGVwYXRoLnNwbGl0KC9bL1xcXFxdLykuam9pbihzZXBhcmF0b3IpO1xufVxuZXhwb3J0cy5yZXBsYWNlUGF0aFNlZ21lbnRTZXBhcmF0b3IgPSByZXBsYWNlUGF0aFNlZ21lbnRTZXBhcmF0b3I7XG5mdW5jdGlvbiBqb2luUGF0aFNlZ21lbnRzKGEsIGIsIHNlcGFyYXRvcikge1xuICAgIGlmIChhID09PSAnJykge1xuICAgICAgICByZXR1cm4gYjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIGNvcnJlY3QgaGFuZGxpbmcgb2YgY2FzZXMgd2hlbiB0aGUgZmlyc3Qgc2VnbWVudCBpcyBhIHJvb3QgKGAvYCwgYEM6L2ApIG9yIFVOQyBwYXRoIChgLy8/L0M6L2ApLlxuICAgICAqL1xuICAgIGlmIChhLmVuZHNXaXRoKHNlcGFyYXRvcikpIHtcbiAgICAgICAgcmV0dXJuIGEgKyBiO1xuICAgIH1cbiAgICByZXR1cm4gYSArIHNlcGFyYXRvciArIGI7XG59XG5leHBvcnRzLmpvaW5QYXRoU2VnbWVudHMgPSBqb2luUGF0aFNlZ21lbnRzO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuY29uc3QgY29tbW9uID0gcmVxdWlyZShcIi4vY29tbW9uXCIpO1xuY2xhc3MgUmVhZGVyIHtcbiAgICBjb25zdHJ1Y3Rvcihfcm9vdCwgX3NldHRpbmdzKSB7XG4gICAgICAgIHRoaXMuX3Jvb3QgPSBfcm9vdDtcbiAgICAgICAgdGhpcy5fc2V0dGluZ3MgPSBfc2V0dGluZ3M7XG4gICAgICAgIHRoaXMuX3Jvb3QgPSBjb21tb24ucmVwbGFjZVBhdGhTZWdtZW50U2VwYXJhdG9yKF9yb290LCBfc2V0dGluZ3MucGF0aFNlZ21lbnRTZXBhcmF0b3IpO1xuICAgIH1cbn1cbmV4cG9ydHMuZGVmYXVsdCA9IFJlYWRlcjtcbiIsICJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IGV2ZW50c18xID0gcmVxdWlyZShcImV2ZW50c1wiKTtcbmNvbnN0IGZzU2NhbmRpciA9IHJlcXVpcmUoXCJAbm9kZWxpYi9mcy5zY2FuZGlyXCIpO1xuY29uc3QgZmFzdHEgPSByZXF1aXJlKFwiZmFzdHFcIik7XG5jb25zdCBjb21tb24gPSByZXF1aXJlKFwiLi9jb21tb25cIik7XG5jb25zdCByZWFkZXJfMSA9IHJlcXVpcmUoXCIuL3JlYWRlclwiKTtcbmNsYXNzIEFzeW5jUmVhZGVyIGV4dGVuZHMgcmVhZGVyXzEuZGVmYXVsdCB7XG4gICAgY29uc3RydWN0b3IoX3Jvb3QsIF9zZXR0aW5ncykge1xuICAgICAgICBzdXBlcihfcm9vdCwgX3NldHRpbmdzKTtcbiAgICAgICAgdGhpcy5fc2V0dGluZ3MgPSBfc2V0dGluZ3M7XG4gICAgICAgIHRoaXMuX3NjYW5kaXIgPSBmc1NjYW5kaXIuc2NhbmRpcjtcbiAgICAgICAgdGhpcy5fZW1pdHRlciA9IG5ldyBldmVudHNfMS5FdmVudEVtaXR0ZXIoKTtcbiAgICAgICAgdGhpcy5fcXVldWUgPSBmYXN0cSh0aGlzLl93b3JrZXIuYmluZCh0aGlzKSwgdGhpcy5fc2V0dGluZ3MuY29uY3VycmVuY3kpO1xuICAgICAgICB0aGlzLl9pc0ZhdGFsRXJyb3IgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5faXNEZXN0cm95ZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fcXVldWUuZHJhaW4gPSAoKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuX2lzRmF0YWxFcnJvcikge1xuICAgICAgICAgICAgICAgIHRoaXMuX2VtaXR0ZXIuZW1pdCgnZW5kJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuICAgIHJlYWQoKSB7XG4gICAgICAgIHRoaXMuX2lzRmF0YWxFcnJvciA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9pc0Rlc3Ryb3llZCA9IGZhbHNlO1xuICAgICAgICBzZXRJbW1lZGlhdGUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fcHVzaFRvUXVldWUodGhpcy5fcm9vdCwgdGhpcy5fc2V0dGluZ3MuYmFzZVBhdGgpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2VtaXR0ZXI7XG4gICAgfVxuICAgIGdldCBpc0Rlc3Ryb3llZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lzRGVzdHJveWVkO1xuICAgIH1cbiAgICBkZXN0cm95KCkge1xuICAgICAgICBpZiAodGhpcy5faXNEZXN0cm95ZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIHJlYWRlciBpcyBhbHJlYWR5IGRlc3Ryb3llZCcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2lzRGVzdHJveWVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5fcXVldWUua2lsbEFuZERyYWluKCk7XG4gICAgfVxuICAgIG9uRW50cnkoY2FsbGJhY2spIHtcbiAgICAgICAgdGhpcy5fZW1pdHRlci5vbignZW50cnknLCBjYWxsYmFjayk7XG4gICAgfVxuICAgIG9uRXJyb3IoY2FsbGJhY2spIHtcbiAgICAgICAgdGhpcy5fZW1pdHRlci5vbmNlKCdlcnJvcicsIGNhbGxiYWNrKTtcbiAgICB9XG4gICAgb25FbmQoY2FsbGJhY2spIHtcbiAgICAgICAgdGhpcy5fZW1pdHRlci5vbmNlKCdlbmQnLCBjYWxsYmFjayk7XG4gICAgfVxuICAgIF9wdXNoVG9RdWV1ZShkaXJlY3RvcnksIGJhc2UpIHtcbiAgICAgICAgY29uc3QgcXVldWVJdGVtID0geyBkaXJlY3RvcnksIGJhc2UgfTtcbiAgICAgICAgdGhpcy5fcXVldWUucHVzaChxdWV1ZUl0ZW0sIChlcnJvcikgPT4ge1xuICAgICAgICAgICAgaWYgKGVycm9yICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5faGFuZGxlRXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgX3dvcmtlcihpdGVtLCBkb25lKSB7XG4gICAgICAgIHRoaXMuX3NjYW5kaXIoaXRlbS5kaXJlY3RvcnksIHRoaXMuX3NldHRpbmdzLmZzU2NhbmRpclNldHRpbmdzLCAoZXJyb3IsIGVudHJpZXMpID0+IHtcbiAgICAgICAgICAgIGlmIChlcnJvciAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGRvbmUoZXJyb3IsIHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5faGFuZGxlRW50cnkoZW50cnksIGl0ZW0uYmFzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkb25lKG51bGwsIHVuZGVmaW5lZCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBfaGFuZGxlRXJyb3IoZXJyb3IpIHtcbiAgICAgICAgaWYgKHRoaXMuX2lzRGVzdHJveWVkIHx8ICFjb21tb24uaXNGYXRhbEVycm9yKHRoaXMuX3NldHRpbmdzLCBlcnJvcikpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9pc0ZhdGFsRXJyb3IgPSB0cnVlO1xuICAgICAgICB0aGlzLl9pc0Rlc3Ryb3llZCA9IHRydWU7XG4gICAgICAgIHRoaXMuX2VtaXR0ZXIuZW1pdCgnZXJyb3InLCBlcnJvcik7XG4gICAgfVxuICAgIF9oYW5kbGVFbnRyeShlbnRyeSwgYmFzZSkge1xuICAgICAgICBpZiAodGhpcy5faXNEZXN0cm95ZWQgfHwgdGhpcy5faXNGYXRhbEVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZnVsbHBhdGggPSBlbnRyeS5wYXRoO1xuICAgICAgICBpZiAoYmFzZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBlbnRyeS5wYXRoID0gY29tbW9uLmpvaW5QYXRoU2VnbWVudHMoYmFzZSwgZW50cnkubmFtZSwgdGhpcy5fc2V0dGluZ3MucGF0aFNlZ21lbnRTZXBhcmF0b3IpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb21tb24uaXNBcHBsaWVkRmlsdGVyKHRoaXMuX3NldHRpbmdzLmVudHJ5RmlsdGVyLCBlbnRyeSkpIHtcbiAgICAgICAgICAgIHRoaXMuX2VtaXRFbnRyeShlbnRyeSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVudHJ5LmRpcmVudC5pc0RpcmVjdG9yeSgpICYmIGNvbW1vbi5pc0FwcGxpZWRGaWx0ZXIodGhpcy5fc2V0dGluZ3MuZGVlcEZpbHRlciwgZW50cnkpKSB7XG4gICAgICAgICAgICB0aGlzLl9wdXNoVG9RdWV1ZShmdWxscGF0aCwgYmFzZSA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogZW50cnkucGF0aCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgX2VtaXRFbnRyeShlbnRyeSkge1xuICAgICAgICB0aGlzLl9lbWl0dGVyLmVtaXQoJ2VudHJ5JywgZW50cnkpO1xuICAgIH1cbn1cbmV4cG9ydHMuZGVmYXVsdCA9IEFzeW5jUmVhZGVyO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuY29uc3QgYXN5bmNfMSA9IHJlcXVpcmUoXCIuLi9yZWFkZXJzL2FzeW5jXCIpO1xuY2xhc3MgQXN5bmNQcm92aWRlciB7XG4gICAgY29uc3RydWN0b3IoX3Jvb3QsIF9zZXR0aW5ncykge1xuICAgICAgICB0aGlzLl9yb290ID0gX3Jvb3Q7XG4gICAgICAgIHRoaXMuX3NldHRpbmdzID0gX3NldHRpbmdzO1xuICAgICAgICB0aGlzLl9yZWFkZXIgPSBuZXcgYXN5bmNfMS5kZWZhdWx0KHRoaXMuX3Jvb3QsIHRoaXMuX3NldHRpbmdzKTtcbiAgICAgICAgdGhpcy5fc3RvcmFnZSA9IFtdO1xuICAgIH1cbiAgICByZWFkKGNhbGxiYWNrKSB7XG4gICAgICAgIHRoaXMuX3JlYWRlci5vbkVycm9yKChlcnJvcikgPT4ge1xuICAgICAgICAgICAgY2FsbEZhaWx1cmVDYWxsYmFjayhjYWxsYmFjaywgZXJyb3IpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5fcmVhZGVyLm9uRW50cnkoKGVudHJ5KSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9zdG9yYWdlLnB1c2goZW50cnkpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5fcmVhZGVyLm9uRW5kKCgpID0+IHtcbiAgICAgICAgICAgIGNhbGxTdWNjZXNzQ2FsbGJhY2soY2FsbGJhY2ssIHRoaXMuX3N0b3JhZ2UpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5fcmVhZGVyLnJlYWQoKTtcbiAgICB9XG59XG5leHBvcnRzLmRlZmF1bHQgPSBBc3luY1Byb3ZpZGVyO1xuZnVuY3Rpb24gY2FsbEZhaWx1cmVDYWxsYmFjayhjYWxsYmFjaywgZXJyb3IpIHtcbiAgICBjYWxsYmFjayhlcnJvcik7XG59XG5mdW5jdGlvbiBjYWxsU3VjY2Vzc0NhbGxiYWNrKGNhbGxiYWNrLCBlbnRyaWVzKSB7XG4gICAgY2FsbGJhY2sobnVsbCwgZW50cmllcyk7XG59XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5jb25zdCBzdHJlYW1fMSA9IHJlcXVpcmUoXCJzdHJlYW1cIik7XG5jb25zdCBhc3luY18xID0gcmVxdWlyZShcIi4uL3JlYWRlcnMvYXN5bmNcIik7XG5jbGFzcyBTdHJlYW1Qcm92aWRlciB7XG4gICAgY29uc3RydWN0b3IoX3Jvb3QsIF9zZXR0aW5ncykge1xuICAgICAgICB0aGlzLl9yb290ID0gX3Jvb3Q7XG4gICAgICAgIHRoaXMuX3NldHRpbmdzID0gX3NldHRpbmdzO1xuICAgICAgICB0aGlzLl9yZWFkZXIgPSBuZXcgYXN5bmNfMS5kZWZhdWx0KHRoaXMuX3Jvb3QsIHRoaXMuX3NldHRpbmdzKTtcbiAgICAgICAgdGhpcy5fc3RyZWFtID0gbmV3IHN0cmVhbV8xLlJlYWRhYmxlKHtcbiAgICAgICAgICAgIG9iamVjdE1vZGU6IHRydWUsXG4gICAgICAgICAgICByZWFkOiAoKSA9PiB7IH0sXG4gICAgICAgICAgICBkZXN0cm95OiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLl9yZWFkZXIuaXNEZXN0cm95ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmVhZGVyLmRlc3Ryb3koKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZWFkKCkge1xuICAgICAgICB0aGlzLl9yZWFkZXIub25FcnJvcigoZXJyb3IpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX3N0cmVhbS5lbWl0KCdlcnJvcicsIGVycm9yKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuX3JlYWRlci5vbkVudHJ5KChlbnRyeSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fc3RyZWFtLnB1c2goZW50cnkpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5fcmVhZGVyLm9uRW5kKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX3N0cmVhbS5wdXNoKG51bGwpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5fcmVhZGVyLnJlYWQoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N0cmVhbTtcbiAgICB9XG59XG5leHBvcnRzLmRlZmF1bHQgPSBTdHJlYW1Qcm92aWRlcjtcbiIsICJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IGZzU2NhbmRpciA9IHJlcXVpcmUoXCJAbm9kZWxpYi9mcy5zY2FuZGlyXCIpO1xuY29uc3QgY29tbW9uID0gcmVxdWlyZShcIi4vY29tbW9uXCIpO1xuY29uc3QgcmVhZGVyXzEgPSByZXF1aXJlKFwiLi9yZWFkZXJcIik7XG5jbGFzcyBTeW5jUmVhZGVyIGV4dGVuZHMgcmVhZGVyXzEuZGVmYXVsdCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIHRoaXMuX3NjYW5kaXIgPSBmc1NjYW5kaXIuc2NhbmRpclN5bmM7XG4gICAgICAgIHRoaXMuX3N0b3JhZ2UgPSBbXTtcbiAgICAgICAgdGhpcy5fcXVldWUgPSBuZXcgU2V0KCk7XG4gICAgfVxuICAgIHJlYWQoKSB7XG4gICAgICAgIHRoaXMuX3B1c2hUb1F1ZXVlKHRoaXMuX3Jvb3QsIHRoaXMuX3NldHRpbmdzLmJhc2VQYXRoKTtcbiAgICAgICAgdGhpcy5faGFuZGxlUXVldWUoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N0b3JhZ2U7XG4gICAgfVxuICAgIF9wdXNoVG9RdWV1ZShkaXJlY3RvcnksIGJhc2UpIHtcbiAgICAgICAgdGhpcy5fcXVldWUuYWRkKHsgZGlyZWN0b3J5LCBiYXNlIH0pO1xuICAgIH1cbiAgICBfaGFuZGxlUXVldWUoKSB7XG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiB0aGlzLl9xdWV1ZS52YWx1ZXMoKSkge1xuICAgICAgICAgICAgdGhpcy5faGFuZGxlRGlyZWN0b3J5KGl0ZW0uZGlyZWN0b3J5LCBpdGVtLmJhc2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIF9oYW5kbGVEaXJlY3RvcnkoZGlyZWN0b3J5LCBiYXNlKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBlbnRyaWVzID0gdGhpcy5fc2NhbmRpcihkaXJlY3RvcnksIHRoaXMuX3NldHRpbmdzLmZzU2NhbmRpclNldHRpbmdzKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgICAgICAgICAgIHRoaXMuX2hhbmRsZUVudHJ5KGVudHJ5LCBiYXNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMuX2hhbmRsZUVycm9yKGVycm9yKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBfaGFuZGxlRXJyb3IoZXJyb3IpIHtcbiAgICAgICAgaWYgKCFjb21tb24uaXNGYXRhbEVycm9yKHRoaXMuX3NldHRpbmdzLCBlcnJvcikpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gICAgX2hhbmRsZUVudHJ5KGVudHJ5LCBiYXNlKSB7XG4gICAgICAgIGNvbnN0IGZ1bGxwYXRoID0gZW50cnkucGF0aDtcbiAgICAgICAgaWYgKGJhc2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZW50cnkucGF0aCA9IGNvbW1vbi5qb2luUGF0aFNlZ21lbnRzKGJhc2UsIGVudHJ5Lm5hbWUsIHRoaXMuX3NldHRpbmdzLnBhdGhTZWdtZW50U2VwYXJhdG9yKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29tbW9uLmlzQXBwbGllZEZpbHRlcih0aGlzLl9zZXR0aW5ncy5lbnRyeUZpbHRlciwgZW50cnkpKSB7XG4gICAgICAgICAgICB0aGlzLl9wdXNoVG9TdG9yYWdlKGVudHJ5KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZW50cnkuZGlyZW50LmlzRGlyZWN0b3J5KCkgJiYgY29tbW9uLmlzQXBwbGllZEZpbHRlcih0aGlzLl9zZXR0aW5ncy5kZWVwRmlsdGVyLCBlbnRyeSkpIHtcbiAgICAgICAgICAgIHRoaXMuX3B1c2hUb1F1ZXVlKGZ1bGxwYXRoLCBiYXNlID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBlbnRyeS5wYXRoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBfcHVzaFRvU3RvcmFnZShlbnRyeSkge1xuICAgICAgICB0aGlzLl9zdG9yYWdlLnB1c2goZW50cnkpO1xuICAgIH1cbn1cbmV4cG9ydHMuZGVmYXVsdCA9IFN5bmNSZWFkZXI7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5jb25zdCBzeW5jXzEgPSByZXF1aXJlKFwiLi4vcmVhZGVycy9zeW5jXCIpO1xuY2xhc3MgU3luY1Byb3ZpZGVyIHtcbiAgICBjb25zdHJ1Y3Rvcihfcm9vdCwgX3NldHRpbmdzKSB7XG4gICAgICAgIHRoaXMuX3Jvb3QgPSBfcm9vdDtcbiAgICAgICAgdGhpcy5fc2V0dGluZ3MgPSBfc2V0dGluZ3M7XG4gICAgICAgIHRoaXMuX3JlYWRlciA9IG5ldyBzeW5jXzEuZGVmYXVsdCh0aGlzLl9yb290LCB0aGlzLl9zZXR0aW5ncyk7XG4gICAgfVxuICAgIHJlYWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yZWFkZXIucmVhZCgpO1xuICAgIH1cbn1cbmV4cG9ydHMuZGVmYXVsdCA9IFN5bmNQcm92aWRlcjtcbiIsICJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IHBhdGggPSByZXF1aXJlKFwicGF0aFwiKTtcbmNvbnN0IGZzU2NhbmRpciA9IHJlcXVpcmUoXCJAbm9kZWxpYi9mcy5zY2FuZGlyXCIpO1xuY2xhc3MgU2V0dGluZ3Mge1xuICAgIGNvbnN0cnVjdG9yKF9vcHRpb25zID0ge30pIHtcbiAgICAgICAgdGhpcy5fb3B0aW9ucyA9IF9vcHRpb25zO1xuICAgICAgICB0aGlzLmJhc2VQYXRoID0gdGhpcy5fZ2V0VmFsdWUodGhpcy5fb3B0aW9ucy5iYXNlUGF0aCwgdW5kZWZpbmVkKTtcbiAgICAgICAgdGhpcy5jb25jdXJyZW5jeSA9IHRoaXMuX2dldFZhbHVlKHRoaXMuX29wdGlvbnMuY29uY3VycmVuY3ksIE51bWJlci5QT1NJVElWRV9JTkZJTklUWSk7XG4gICAgICAgIHRoaXMuZGVlcEZpbHRlciA9IHRoaXMuX2dldFZhbHVlKHRoaXMuX29wdGlvbnMuZGVlcEZpbHRlciwgbnVsbCk7XG4gICAgICAgIHRoaXMuZW50cnlGaWx0ZXIgPSB0aGlzLl9nZXRWYWx1ZSh0aGlzLl9vcHRpb25zLmVudHJ5RmlsdGVyLCBudWxsKTtcbiAgICAgICAgdGhpcy5lcnJvckZpbHRlciA9IHRoaXMuX2dldFZhbHVlKHRoaXMuX29wdGlvbnMuZXJyb3JGaWx0ZXIsIG51bGwpO1xuICAgICAgICB0aGlzLnBhdGhTZWdtZW50U2VwYXJhdG9yID0gdGhpcy5fZ2V0VmFsdWUodGhpcy5fb3B0aW9ucy5wYXRoU2VnbWVudFNlcGFyYXRvciwgcGF0aC5zZXApO1xuICAgICAgICB0aGlzLmZzU2NhbmRpclNldHRpbmdzID0gbmV3IGZzU2NhbmRpci5TZXR0aW5ncyh7XG4gICAgICAgICAgICBmb2xsb3dTeW1ib2xpY0xpbmtzOiB0aGlzLl9vcHRpb25zLmZvbGxvd1N5bWJvbGljTGlua3MsXG4gICAgICAgICAgICBmczogdGhpcy5fb3B0aW9ucy5mcyxcbiAgICAgICAgICAgIHBhdGhTZWdtZW50U2VwYXJhdG9yOiB0aGlzLl9vcHRpb25zLnBhdGhTZWdtZW50U2VwYXJhdG9yLFxuICAgICAgICAgICAgc3RhdHM6IHRoaXMuX29wdGlvbnMuc3RhdHMsXG4gICAgICAgICAgICB0aHJvd0Vycm9yT25Ccm9rZW5TeW1ib2xpY0xpbms6IHRoaXMuX29wdGlvbnMudGhyb3dFcnJvck9uQnJva2VuU3ltYm9saWNMaW5rXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBfZ2V0VmFsdWUob3B0aW9uLCB2YWx1ZSkge1xuICAgICAgICByZXR1cm4gb3B0aW9uICE9PSBudWxsICYmIG9wdGlvbiAhPT0gdm9pZCAwID8gb3B0aW9uIDogdmFsdWU7XG4gICAgfVxufVxuZXhwb3J0cy5kZWZhdWx0ID0gU2V0dGluZ3M7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLlNldHRpbmdzID0gZXhwb3J0cy53YWxrU3RyZWFtID0gZXhwb3J0cy53YWxrU3luYyA9IGV4cG9ydHMud2FsayA9IHZvaWQgMDtcbmNvbnN0IGFzeW5jXzEgPSByZXF1aXJlKFwiLi9wcm92aWRlcnMvYXN5bmNcIik7XG5jb25zdCBzdHJlYW1fMSA9IHJlcXVpcmUoXCIuL3Byb3ZpZGVycy9zdHJlYW1cIik7XG5jb25zdCBzeW5jXzEgPSByZXF1aXJlKFwiLi9wcm92aWRlcnMvc3luY1wiKTtcbmNvbnN0IHNldHRpbmdzXzEgPSByZXF1aXJlKFwiLi9zZXR0aW5nc1wiKTtcbmV4cG9ydHMuU2V0dGluZ3MgPSBzZXR0aW5nc18xLmRlZmF1bHQ7XG5mdW5jdGlvbiB3YWxrKGRpcmVjdG9yeSwgb3B0aW9uc09yU2V0dGluZ3NPckNhbGxiYWNrLCBjYWxsYmFjaykge1xuICAgIGlmICh0eXBlb2Ygb3B0aW9uc09yU2V0dGluZ3NPckNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIG5ldyBhc3luY18xLmRlZmF1bHQoZGlyZWN0b3J5LCBnZXRTZXR0aW5ncygpKS5yZWFkKG9wdGlvbnNPclNldHRpbmdzT3JDYWxsYmFjayk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbmV3IGFzeW5jXzEuZGVmYXVsdChkaXJlY3RvcnksIGdldFNldHRpbmdzKG9wdGlvbnNPclNldHRpbmdzT3JDYWxsYmFjaykpLnJlYWQoY2FsbGJhY2spO1xufVxuZXhwb3J0cy53YWxrID0gd2FsaztcbmZ1bmN0aW9uIHdhbGtTeW5jKGRpcmVjdG9yeSwgb3B0aW9uc09yU2V0dGluZ3MpIHtcbiAgICBjb25zdCBzZXR0aW5ncyA9IGdldFNldHRpbmdzKG9wdGlvbnNPclNldHRpbmdzKTtcbiAgICBjb25zdCBwcm92aWRlciA9IG5ldyBzeW5jXzEuZGVmYXVsdChkaXJlY3RvcnksIHNldHRpbmdzKTtcbiAgICByZXR1cm4gcHJvdmlkZXIucmVhZCgpO1xufVxuZXhwb3J0cy53YWxrU3luYyA9IHdhbGtTeW5jO1xuZnVuY3Rpb24gd2Fsa1N0cmVhbShkaXJlY3RvcnksIG9wdGlvbnNPclNldHRpbmdzKSB7XG4gICAgY29uc3Qgc2V0dGluZ3MgPSBnZXRTZXR0aW5ncyhvcHRpb25zT3JTZXR0aW5ncyk7XG4gICAgY29uc3QgcHJvdmlkZXIgPSBuZXcgc3RyZWFtXzEuZGVmYXVsdChkaXJlY3RvcnksIHNldHRpbmdzKTtcbiAgICByZXR1cm4gcHJvdmlkZXIucmVhZCgpO1xufVxuZXhwb3J0cy53YWxrU3RyZWFtID0gd2Fsa1N0cmVhbTtcbmZ1bmN0aW9uIGdldFNldHRpbmdzKHNldHRpbmdzT3JPcHRpb25zID0ge30pIHtcbiAgICBpZiAoc2V0dGluZ3NPck9wdGlvbnMgaW5zdGFuY2VvZiBzZXR0aW5nc18xLmRlZmF1bHQpIHtcbiAgICAgICAgcmV0dXJuIHNldHRpbmdzT3JPcHRpb25zO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IHNldHRpbmdzXzEuZGVmYXVsdChzZXR0aW5nc09yT3B0aW9ucyk7XG59XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XHJcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcclxuY29uc3QgcGF0aCA9IHJlcXVpcmUoXCJwYXRoXCIpO1xyXG5jb25zdCBmc1N0YXQgPSByZXF1aXJlKFwiQG5vZGVsaWIvZnMuc3RhdFwiKTtcclxuY29uc3QgdXRpbHMgPSByZXF1aXJlKFwiLi4vdXRpbHNcIik7XHJcbmNsYXNzIFJlYWRlciB7XHJcbiAgICBjb25zdHJ1Y3Rvcihfc2V0dGluZ3MpIHtcclxuICAgICAgICB0aGlzLl9zZXR0aW5ncyA9IF9zZXR0aW5ncztcclxuICAgICAgICB0aGlzLl9mc1N0YXRTZXR0aW5ncyA9IG5ldyBmc1N0YXQuU2V0dGluZ3Moe1xyXG4gICAgICAgICAgICBmb2xsb3dTeW1ib2xpY0xpbms6IHRoaXMuX3NldHRpbmdzLmZvbGxvd1N5bWJvbGljTGlua3MsXHJcbiAgICAgICAgICAgIGZzOiB0aGlzLl9zZXR0aW5ncy5mcyxcclxuICAgICAgICAgICAgdGhyb3dFcnJvck9uQnJva2VuU3ltYm9saWNMaW5rOiB0aGlzLl9zZXR0aW5ncy5mb2xsb3dTeW1ib2xpY0xpbmtzXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBfZ2V0RnVsbEVudHJ5UGF0aChmaWxlcGF0aCkge1xyXG4gICAgICAgIHJldHVybiBwYXRoLnJlc29sdmUodGhpcy5fc2V0dGluZ3MuY3dkLCBmaWxlcGF0aCk7XHJcbiAgICB9XHJcbiAgICBfbWFrZUVudHJ5KHN0YXRzLCBwYXR0ZXJuKSB7XHJcbiAgICAgICAgY29uc3QgZW50cnkgPSB7XHJcbiAgICAgICAgICAgIG5hbWU6IHBhdHRlcm4sXHJcbiAgICAgICAgICAgIHBhdGg6IHBhdHRlcm4sXHJcbiAgICAgICAgICAgIGRpcmVudDogdXRpbHMuZnMuY3JlYXRlRGlyZW50RnJvbVN0YXRzKHBhdHRlcm4sIHN0YXRzKVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgaWYgKHRoaXMuX3NldHRpbmdzLnN0YXRzKSB7XHJcbiAgICAgICAgICAgIGVudHJ5LnN0YXRzID0gc3RhdHM7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBlbnRyeTtcclxuICAgIH1cclxuICAgIF9pc0ZhdGFsRXJyb3IoZXJyb3IpIHtcclxuICAgICAgICByZXR1cm4gIXV0aWxzLmVycm5vLmlzRW5vZW50Q29kZUVycm9yKGVycm9yKSAmJiAhdGhpcy5fc2V0dGluZ3Muc3VwcHJlc3NFcnJvcnM7XHJcbiAgICB9XHJcbn1cclxuZXhwb3J0cy5kZWZhdWx0ID0gUmVhZGVyO1xyXG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XHJcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcclxuY29uc3Qgc3RyZWFtXzEgPSByZXF1aXJlKFwic3RyZWFtXCIpO1xyXG5jb25zdCBmc1N0YXQgPSByZXF1aXJlKFwiQG5vZGVsaWIvZnMuc3RhdFwiKTtcclxuY29uc3QgZnNXYWxrID0gcmVxdWlyZShcIkBub2RlbGliL2ZzLndhbGtcIik7XHJcbmNvbnN0IHJlYWRlcl8xID0gcmVxdWlyZShcIi4vcmVhZGVyXCIpO1xyXG5jbGFzcyBSZWFkZXJTdHJlYW0gZXh0ZW5kcyByZWFkZXJfMS5kZWZhdWx0IHtcclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XHJcbiAgICAgICAgdGhpcy5fd2Fsa1N0cmVhbSA9IGZzV2Fsay53YWxrU3RyZWFtO1xyXG4gICAgICAgIHRoaXMuX3N0YXQgPSBmc1N0YXQuc3RhdDtcclxuICAgIH1cclxuICAgIGR5bmFtaWMocm9vdCwgb3B0aW9ucykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl93YWxrU3RyZWFtKHJvb3QsIG9wdGlvbnMpO1xyXG4gICAgfVxyXG4gICAgc3RhdGljKHBhdHRlcm5zLCBvcHRpb25zKSB7XHJcbiAgICAgICAgY29uc3QgZmlsZXBhdGhzID0gcGF0dGVybnMubWFwKHRoaXMuX2dldEZ1bGxFbnRyeVBhdGgsIHRoaXMpO1xyXG4gICAgICAgIGNvbnN0IHN0cmVhbSA9IG5ldyBzdHJlYW1fMS5QYXNzVGhyb3VnaCh7IG9iamVjdE1vZGU6IHRydWUgfSk7XHJcbiAgICAgICAgc3RyZWFtLl93cml0ZSA9IChpbmRleCwgX2VuYywgZG9uZSkgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZ2V0RW50cnkoZmlsZXBhdGhzW2luZGV4XSwgcGF0dGVybnNbaW5kZXhdLCBvcHRpb25zKVxyXG4gICAgICAgICAgICAgICAgLnRoZW4oKGVudHJ5KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZW50cnkgIT09IG51bGwgJiYgb3B0aW9ucy5lbnRyeUZpbHRlcihlbnRyeSkpIHtcclxuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChlbnRyeSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoaW5kZXggPT09IGZpbGVwYXRocy5sZW5ndGggLSAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLmVuZCgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZG9uZSgpO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgLmNhdGNoKGRvbmUpO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmaWxlcGF0aHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgc3RyZWFtLndyaXRlKGkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gc3RyZWFtO1xyXG4gICAgfVxyXG4gICAgX2dldEVudHJ5KGZpbGVwYXRoLCBwYXR0ZXJuLCBvcHRpb25zKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldFN0YXQoZmlsZXBhdGgpXHJcbiAgICAgICAgICAgIC50aGVuKChzdGF0cykgPT4gdGhpcy5fbWFrZUVudHJ5KHN0YXRzLCBwYXR0ZXJuKSlcclxuICAgICAgICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgICBpZiAob3B0aW9ucy5lcnJvckZpbHRlcihlcnJvcikpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgX2dldFN0YXQoZmlsZXBhdGgpIHtcclxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLl9zdGF0KGZpbGVwYXRoLCB0aGlzLl9mc1N0YXRTZXR0aW5ncywgKGVycm9yLCBzdGF0cykgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yID09PSBudWxsID8gcmVzb2x2ZShzdGF0cykgOiByZWplY3QoZXJyb3IpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxufVxyXG5leHBvcnRzLmRlZmF1bHQgPSBSZWFkZXJTdHJlYW07XHJcbiIsICJcInVzZSBzdHJpY3RcIjtcclxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xyXG5jb25zdCBmc1dhbGsgPSByZXF1aXJlKFwiQG5vZGVsaWIvZnMud2Fsa1wiKTtcclxuY29uc3QgcmVhZGVyXzEgPSByZXF1aXJlKFwiLi9yZWFkZXJcIik7XHJcbmNvbnN0IHN0cmVhbV8xID0gcmVxdWlyZShcIi4vc3RyZWFtXCIpO1xyXG5jbGFzcyBSZWFkZXJBc3luYyBleHRlbmRzIHJlYWRlcl8xLmRlZmF1bHQge1xyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcclxuICAgICAgICB0aGlzLl93YWxrQXN5bmMgPSBmc1dhbGsud2FsaztcclxuICAgICAgICB0aGlzLl9yZWFkZXJTdHJlYW0gPSBuZXcgc3RyZWFtXzEuZGVmYXVsdCh0aGlzLl9zZXR0aW5ncyk7XHJcbiAgICB9XHJcbiAgICBkeW5hbWljKHJvb3QsIG9wdGlvbnMpIHtcclxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLl93YWxrQXN5bmMocm9vdCwgb3B0aW9ucywgKGVycm9yLCBlbnRyaWVzKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZXJyb3IgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGVudHJpZXMpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBhc3luYyBzdGF0aWMocGF0dGVybnMsIG9wdGlvbnMpIHtcclxuICAgICAgICBjb25zdCBlbnRyaWVzID0gW107XHJcbiAgICAgICAgY29uc3Qgc3RyZWFtID0gdGhpcy5fcmVhZGVyU3RyZWFtLnN0YXRpYyhwYXR0ZXJucywgb3B0aW9ucyk7XHJcbiAgICAgICAgLy8gQWZ0ZXIgIzIzNSwgcmVwbGFjZSBpdCB3aXRoIGFuIGFzeW5jaHJvbm91cyBpdGVyYXRvci5cclxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICBzdHJlYW0ub25jZSgnZXJyb3InLCByZWplY3QpO1xyXG4gICAgICAgICAgICBzdHJlYW0ub24oJ2RhdGEnLCAoZW50cnkpID0+IGVudHJpZXMucHVzaChlbnRyeSkpO1xyXG4gICAgICAgICAgICBzdHJlYW0ub25jZSgnZW5kJywgKCkgPT4gcmVzb2x2ZShlbnRyaWVzKSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbn1cclxuZXhwb3J0cy5kZWZhdWx0ID0gUmVhZGVyQXN5bmM7XHJcbiIsICJcInVzZSBzdHJpY3RcIjtcclxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xyXG5jb25zdCB1dGlscyA9IHJlcXVpcmUoXCIuLi8uLi91dGlsc1wiKTtcclxuY2xhc3MgTWF0Y2hlciB7XHJcbiAgICBjb25zdHJ1Y3RvcihfcGF0dGVybnMsIF9zZXR0aW5ncywgX21pY3JvbWF0Y2hPcHRpb25zKSB7XHJcbiAgICAgICAgdGhpcy5fcGF0dGVybnMgPSBfcGF0dGVybnM7XHJcbiAgICAgICAgdGhpcy5fc2V0dGluZ3MgPSBfc2V0dGluZ3M7XHJcbiAgICAgICAgdGhpcy5fbWljcm9tYXRjaE9wdGlvbnMgPSBfbWljcm9tYXRjaE9wdGlvbnM7XHJcbiAgICAgICAgdGhpcy5fc3RvcmFnZSA9IFtdO1xyXG4gICAgICAgIHRoaXMuX2ZpbGxTdG9yYWdlKCk7XHJcbiAgICB9XHJcbiAgICBfZmlsbFN0b3JhZ2UoKSB7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIG9yaWdpbmFsIHBhdHRlcm4gbWF5IGluY2x1ZGUgYHssKiwqKixhLyp9YCwgd2hpY2ggd2lsbCBsZWFkIHRvIHByb2JsZW1zIHdpdGggbWF0Y2hpbmcgKHVucmVzb2x2ZWQgbGV2ZWwpLlxyXG4gICAgICAgICAqIFNvLCBiZWZvcmUgZXhwYW5kIHBhdHRlcm5zIHdpdGggYnJhY2UgZXhwYW5zaW9uIGludG8gc2VwYXJhdGVkIHBhdHRlcm5zLlxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGNvbnN0IHBhdHRlcm5zID0gdXRpbHMucGF0dGVybi5leHBhbmRQYXR0ZXJuc1dpdGhCcmFjZUV4cGFuc2lvbih0aGlzLl9wYXR0ZXJucyk7XHJcbiAgICAgICAgZm9yIChjb25zdCBwYXR0ZXJuIG9mIHBhdHRlcm5zKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHNlZ21lbnRzID0gdGhpcy5fZ2V0UGF0dGVyblNlZ21lbnRzKHBhdHRlcm4pO1xyXG4gICAgICAgICAgICBjb25zdCBzZWN0aW9ucyA9IHRoaXMuX3NwbGl0U2VnbWVudHNJbnRvU2VjdGlvbnMoc2VnbWVudHMpO1xyXG4gICAgICAgICAgICB0aGlzLl9zdG9yYWdlLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgY29tcGxldGU6IHNlY3Rpb25zLmxlbmd0aCA8PSAxLFxyXG4gICAgICAgICAgICAgICAgcGF0dGVybixcclxuICAgICAgICAgICAgICAgIHNlZ21lbnRzLFxyXG4gICAgICAgICAgICAgICAgc2VjdGlvbnNcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgX2dldFBhdHRlcm5TZWdtZW50cyhwYXR0ZXJuKSB7XHJcbiAgICAgICAgY29uc3QgcGFydHMgPSB1dGlscy5wYXR0ZXJuLmdldFBhdHRlcm5QYXJ0cyhwYXR0ZXJuLCB0aGlzLl9taWNyb21hdGNoT3B0aW9ucyk7XHJcbiAgICAgICAgcmV0dXJuIHBhcnRzLm1hcCgocGFydCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBkeW5hbWljID0gdXRpbHMucGF0dGVybi5pc0R5bmFtaWNQYXR0ZXJuKHBhcnQsIHRoaXMuX3NldHRpbmdzKTtcclxuICAgICAgICAgICAgaWYgKCFkeW5hbWljKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGR5bmFtaWM6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgIHBhdHRlcm46IHBhcnRcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIGR5bmFtaWM6IHRydWUsXHJcbiAgICAgICAgICAgICAgICBwYXR0ZXJuOiBwYXJ0LFxyXG4gICAgICAgICAgICAgICAgcGF0dGVyblJlOiB1dGlscy5wYXR0ZXJuLm1ha2VSZShwYXJ0LCB0aGlzLl9taWNyb21hdGNoT3B0aW9ucylcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIF9zcGxpdFNlZ21lbnRzSW50b1NlY3Rpb25zKHNlZ21lbnRzKSB7XHJcbiAgICAgICAgcmV0dXJuIHV0aWxzLmFycmF5LnNwbGl0V2hlbihzZWdtZW50cywgKHNlZ21lbnQpID0+IHNlZ21lbnQuZHluYW1pYyAmJiB1dGlscy5wYXR0ZXJuLmhhc0dsb2JTdGFyKHNlZ21lbnQucGF0dGVybikpO1xyXG4gICAgfVxyXG59XHJcbmV4cG9ydHMuZGVmYXVsdCA9IE1hdGNoZXI7XHJcbiIsICJcInVzZSBzdHJpY3RcIjtcclxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xyXG5jb25zdCBtYXRjaGVyXzEgPSByZXF1aXJlKFwiLi9tYXRjaGVyXCIpO1xyXG5jbGFzcyBQYXJ0aWFsTWF0Y2hlciBleHRlbmRzIG1hdGNoZXJfMS5kZWZhdWx0IHtcclxuICAgIG1hdGNoKGZpbGVwYXRoKSB7XHJcbiAgICAgICAgY29uc3QgcGFydHMgPSBmaWxlcGF0aC5zcGxpdCgnLycpO1xyXG4gICAgICAgIGNvbnN0IGxldmVscyA9IHBhcnRzLmxlbmd0aDtcclxuICAgICAgICBjb25zdCBwYXR0ZXJucyA9IHRoaXMuX3N0b3JhZ2UuZmlsdGVyKChpbmZvKSA9PiAhaW5mby5jb21wbGV0ZSB8fCBpbmZvLnNlZ21lbnRzLmxlbmd0aCA+IGxldmVscyk7XHJcbiAgICAgICAgZm9yIChjb25zdCBwYXR0ZXJuIG9mIHBhdHRlcm5zKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHNlY3Rpb24gPSBwYXR0ZXJuLnNlY3Rpb25zWzBdO1xyXG4gICAgICAgICAgICAvKipcclxuICAgICAgICAgICAgICogSW4gdGhpcyBjYXNlLCB0aGUgcGF0dGVybiBoYXMgYSBnbG9ic3RhciBhbmQgd2UgbXVzdCByZWFkIGFsbCBkaXJlY3RvcmllcyB1bmNvbmRpdGlvbmFsbHksXHJcbiAgICAgICAgICAgICAqIGJ1dCBvbmx5IGlmIHRoZSBsZXZlbCBoYXMgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBmaXJzdCBncm91cC5cclxuICAgICAgICAgICAgICpcclxuICAgICAgICAgICAgICogZml4dHVyZXMve2EsYn0vKipcclxuICAgICAgICAgICAgICogIF4gdHJ1ZS9mYWxzZSAgXiBhbHdheXMgdHJ1ZVxyXG4gICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICBpZiAoIXBhdHRlcm4uY29tcGxldGUgJiYgbGV2ZWxzID4gc2VjdGlvbi5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IG1hdGNoID0gcGFydHMuZXZlcnkoKHBhcnQsIGluZGV4KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzZWdtZW50ID0gcGF0dGVybi5zZWdtZW50c1tpbmRleF07XHJcbiAgICAgICAgICAgICAgICBpZiAoc2VnbWVudC5keW5hbWljICYmIHNlZ21lbnQucGF0dGVyblJlLnRlc3QocGFydCkpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmICghc2VnbWVudC5keW5hbWljICYmIHNlZ21lbnQucGF0dGVybiA9PT0gcGFydCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgaWYgKG1hdGNoKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbn1cclxuZXhwb3J0cy5kZWZhdWx0ID0gUGFydGlhbE1hdGNoZXI7XHJcbiIsICJcInVzZSBzdHJpY3RcIjtcclxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xyXG5jb25zdCB1dGlscyA9IHJlcXVpcmUoXCIuLi8uLi91dGlsc1wiKTtcclxuY29uc3QgcGFydGlhbF8xID0gcmVxdWlyZShcIi4uL21hdGNoZXJzL3BhcnRpYWxcIik7XHJcbmNsYXNzIERlZXBGaWx0ZXIge1xyXG4gICAgY29uc3RydWN0b3IoX3NldHRpbmdzLCBfbWljcm9tYXRjaE9wdGlvbnMpIHtcclxuICAgICAgICB0aGlzLl9zZXR0aW5ncyA9IF9zZXR0aW5ncztcclxuICAgICAgICB0aGlzLl9taWNyb21hdGNoT3B0aW9ucyA9IF9taWNyb21hdGNoT3B0aW9ucztcclxuICAgIH1cclxuICAgIGdldEZpbHRlcihiYXNlUGF0aCwgcG9zaXRpdmUsIG5lZ2F0aXZlKSB7XHJcbiAgICAgICAgY29uc3QgbWF0Y2hlciA9IHRoaXMuX2dldE1hdGNoZXIocG9zaXRpdmUpO1xyXG4gICAgICAgIGNvbnN0IG5lZ2F0aXZlUmUgPSB0aGlzLl9nZXROZWdhdGl2ZVBhdHRlcm5zUmUobmVnYXRpdmUpO1xyXG4gICAgICAgIHJldHVybiAoZW50cnkpID0+IHRoaXMuX2ZpbHRlcihiYXNlUGF0aCwgZW50cnksIG1hdGNoZXIsIG5lZ2F0aXZlUmUpO1xyXG4gICAgfVxyXG4gICAgX2dldE1hdGNoZXIocGF0dGVybnMpIHtcclxuICAgICAgICByZXR1cm4gbmV3IHBhcnRpYWxfMS5kZWZhdWx0KHBhdHRlcm5zLCB0aGlzLl9zZXR0aW5ncywgdGhpcy5fbWljcm9tYXRjaE9wdGlvbnMpO1xyXG4gICAgfVxyXG4gICAgX2dldE5lZ2F0aXZlUGF0dGVybnNSZShwYXR0ZXJucykge1xyXG4gICAgICAgIGNvbnN0IGFmZmVjdERlcHRoT2ZSZWFkaW5nUGF0dGVybnMgPSBwYXR0ZXJucy5maWx0ZXIodXRpbHMucGF0dGVybi5pc0FmZmVjdERlcHRoT2ZSZWFkaW5nUGF0dGVybik7XHJcbiAgICAgICAgcmV0dXJuIHV0aWxzLnBhdHRlcm4uY29udmVydFBhdHRlcm5zVG9SZShhZmZlY3REZXB0aE9mUmVhZGluZ1BhdHRlcm5zLCB0aGlzLl9taWNyb21hdGNoT3B0aW9ucyk7XHJcbiAgICB9XHJcbiAgICBfZmlsdGVyKGJhc2VQYXRoLCBlbnRyeSwgbWF0Y2hlciwgbmVnYXRpdmVSZSkge1xyXG4gICAgICAgIGlmICh0aGlzLl9pc1NraXBwZWRCeURlZXAoYmFzZVBhdGgsIGVudHJ5LnBhdGgpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuX2lzU2tpcHBlZFN5bWJvbGljTGluayhlbnRyeSkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBmaWxlcGF0aCA9IHV0aWxzLnBhdGgucmVtb3ZlTGVhZGluZ0RvdFNlZ21lbnQoZW50cnkucGF0aCk7XHJcbiAgICAgICAgaWYgKHRoaXMuX2lzU2tpcHBlZEJ5UG9zaXRpdmVQYXR0ZXJucyhmaWxlcGF0aCwgbWF0Y2hlcikpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy5faXNTa2lwcGVkQnlOZWdhdGl2ZVBhdHRlcm5zKGZpbGVwYXRoLCBuZWdhdGl2ZVJlKTtcclxuICAgIH1cclxuICAgIF9pc1NraXBwZWRCeURlZXAoYmFzZVBhdGgsIGVudHJ5UGF0aCkge1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEF2b2lkIHVubmVjZXNzYXJ5IGRlcHRoIGNhbGN1bGF0aW9ucyB3aGVuIGl0IGRvZXNuJ3QgbWF0dGVyLlxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGlmICh0aGlzLl9zZXR0aW5ncy5kZWVwID09PSBJbmZpbml0eSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRFbnRyeUxldmVsKGJhc2VQYXRoLCBlbnRyeVBhdGgpID49IHRoaXMuX3NldHRpbmdzLmRlZXA7XHJcbiAgICB9XHJcbiAgICBfZ2V0RW50cnlMZXZlbChiYXNlUGF0aCwgZW50cnlQYXRoKSB7XHJcbiAgICAgICAgY29uc3QgZW50cnlQYXRoRGVwdGggPSBlbnRyeVBhdGguc3BsaXQoJy8nKS5sZW5ndGg7XHJcbiAgICAgICAgaWYgKGJhc2VQYXRoID09PSAnJykge1xyXG4gICAgICAgICAgICByZXR1cm4gZW50cnlQYXRoRGVwdGg7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGJhc2VQYXRoRGVwdGggPSBiYXNlUGF0aC5zcGxpdCgnLycpLmxlbmd0aDtcclxuICAgICAgICByZXR1cm4gZW50cnlQYXRoRGVwdGggLSBiYXNlUGF0aERlcHRoO1xyXG4gICAgfVxyXG4gICAgX2lzU2tpcHBlZFN5bWJvbGljTGluayhlbnRyeSkge1xyXG4gICAgICAgIHJldHVybiAhdGhpcy5fc2V0dGluZ3MuZm9sbG93U3ltYm9saWNMaW5rcyAmJiBlbnRyeS5kaXJlbnQuaXNTeW1ib2xpY0xpbmsoKTtcclxuICAgIH1cclxuICAgIF9pc1NraXBwZWRCeVBvc2l0aXZlUGF0dGVybnMoZW50cnlQYXRoLCBtYXRjaGVyKSB7XHJcbiAgICAgICAgcmV0dXJuICF0aGlzLl9zZXR0aW5ncy5iYXNlTmFtZU1hdGNoICYmICFtYXRjaGVyLm1hdGNoKGVudHJ5UGF0aCk7XHJcbiAgICB9XHJcbiAgICBfaXNTa2lwcGVkQnlOZWdhdGl2ZVBhdHRlcm5zKGVudHJ5UGF0aCwgcGF0dGVybnNSZSkge1xyXG4gICAgICAgIHJldHVybiAhdXRpbHMucGF0dGVybi5tYXRjaEFueShlbnRyeVBhdGgsIHBhdHRlcm5zUmUpO1xyXG4gICAgfVxyXG59XHJcbmV4cG9ydHMuZGVmYXVsdCA9IERlZXBGaWx0ZXI7XHJcbiIsICJcInVzZSBzdHJpY3RcIjtcclxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xyXG5jb25zdCB1dGlscyA9IHJlcXVpcmUoXCIuLi8uLi91dGlsc1wiKTtcclxuY2xhc3MgRW50cnlGaWx0ZXIge1xyXG4gICAgY29uc3RydWN0b3IoX3NldHRpbmdzLCBfbWljcm9tYXRjaE9wdGlvbnMpIHtcclxuICAgICAgICB0aGlzLl9zZXR0aW5ncyA9IF9zZXR0aW5ncztcclxuICAgICAgICB0aGlzLl9taWNyb21hdGNoT3B0aW9ucyA9IF9taWNyb21hdGNoT3B0aW9ucztcclxuICAgICAgICB0aGlzLmluZGV4ID0gbmV3IE1hcCgpO1xyXG4gICAgfVxyXG4gICAgZ2V0RmlsdGVyKHBvc2l0aXZlLCBuZWdhdGl2ZSkge1xyXG4gICAgICAgIGNvbnN0IHBvc2l0aXZlUmUgPSB1dGlscy5wYXR0ZXJuLmNvbnZlcnRQYXR0ZXJuc1RvUmUocG9zaXRpdmUsIHRoaXMuX21pY3JvbWF0Y2hPcHRpb25zKTtcclxuICAgICAgICBjb25zdCBuZWdhdGl2ZVJlID0gdXRpbHMucGF0dGVybi5jb252ZXJ0UGF0dGVybnNUb1JlKG5lZ2F0aXZlLCB0aGlzLl9taWNyb21hdGNoT3B0aW9ucyk7XHJcbiAgICAgICAgcmV0dXJuIChlbnRyeSkgPT4gdGhpcy5fZmlsdGVyKGVudHJ5LCBwb3NpdGl2ZVJlLCBuZWdhdGl2ZVJlKTtcclxuICAgIH1cclxuICAgIF9maWx0ZXIoZW50cnksIHBvc2l0aXZlUmUsIG5lZ2F0aXZlUmUpIHtcclxuICAgICAgICBpZiAodGhpcy5fc2V0dGluZ3MudW5pcXVlICYmIHRoaXMuX2lzRHVwbGljYXRlRW50cnkoZW50cnkpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuX29ubHlGaWxlRmlsdGVyKGVudHJ5KSB8fCB0aGlzLl9vbmx5RGlyZWN0b3J5RmlsdGVyKGVudHJ5KSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLl9pc1NraXBwZWRCeUFic29sdXRlTmVnYXRpdmVQYXR0ZXJucyhlbnRyeS5wYXRoLCBuZWdhdGl2ZVJlKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGZpbGVwYXRoID0gdGhpcy5fc2V0dGluZ3MuYmFzZU5hbWVNYXRjaCA/IGVudHJ5Lm5hbWUgOiBlbnRyeS5wYXRoO1xyXG4gICAgICAgIGNvbnN0IGlzRGlyZWN0b3J5ID0gZW50cnkuZGlyZW50LmlzRGlyZWN0b3J5KCk7XHJcbiAgICAgICAgY29uc3QgaXNNYXRjaGVkID0gdGhpcy5faXNNYXRjaFRvUGF0dGVybnMoZmlsZXBhdGgsIHBvc2l0aXZlUmUsIGlzRGlyZWN0b3J5KSAmJiAhdGhpcy5faXNNYXRjaFRvUGF0dGVybnMoZW50cnkucGF0aCwgbmVnYXRpdmVSZSwgaXNEaXJlY3RvcnkpO1xyXG4gICAgICAgIGlmICh0aGlzLl9zZXR0aW5ncy51bmlxdWUgJiYgaXNNYXRjaGVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2NyZWF0ZUluZGV4UmVjb3JkKGVudHJ5KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGlzTWF0Y2hlZDtcclxuICAgIH1cclxuICAgIF9pc0R1cGxpY2F0ZUVudHJ5KGVudHJ5KSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5kZXguaGFzKGVudHJ5LnBhdGgpO1xyXG4gICAgfVxyXG4gICAgX2NyZWF0ZUluZGV4UmVjb3JkKGVudHJ5KSB7XHJcbiAgICAgICAgdGhpcy5pbmRleC5zZXQoZW50cnkucGF0aCwgdW5kZWZpbmVkKTtcclxuICAgIH1cclxuICAgIF9vbmx5RmlsZUZpbHRlcihlbnRyeSkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9zZXR0aW5ncy5vbmx5RmlsZXMgJiYgIWVudHJ5LmRpcmVudC5pc0ZpbGUoKTtcclxuICAgIH1cclxuICAgIF9vbmx5RGlyZWN0b3J5RmlsdGVyKGVudHJ5KSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NldHRpbmdzLm9ubHlEaXJlY3RvcmllcyAmJiAhZW50cnkuZGlyZW50LmlzRGlyZWN0b3J5KCk7XHJcbiAgICB9XHJcbiAgICBfaXNTa2lwcGVkQnlBYnNvbHV0ZU5lZ2F0aXZlUGF0dGVybnMoZW50cnlQYXRoLCBwYXR0ZXJuc1JlKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9zZXR0aW5ncy5hYnNvbHV0ZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGZ1bGxwYXRoID0gdXRpbHMucGF0aC5tYWtlQWJzb2x1dGUodGhpcy5fc2V0dGluZ3MuY3dkLCBlbnRyeVBhdGgpO1xyXG4gICAgICAgIHJldHVybiB1dGlscy5wYXR0ZXJuLm1hdGNoQW55KGZ1bGxwYXRoLCBwYXR0ZXJuc1JlKTtcclxuICAgIH1cclxuICAgIF9pc01hdGNoVG9QYXR0ZXJucyhlbnRyeVBhdGgsIHBhdHRlcm5zUmUsIGlzRGlyZWN0b3J5KSB7XHJcbiAgICAgICAgY29uc3QgZmlsZXBhdGggPSB1dGlscy5wYXRoLnJlbW92ZUxlYWRpbmdEb3RTZWdtZW50KGVudHJ5UGF0aCk7XHJcbiAgICAgICAgLy8gVHJ5aW5nIHRvIG1hdGNoIGZpbGVzIGFuZCBkaXJlY3RvcmllcyBieSBwYXR0ZXJucy5cclxuICAgICAgICBjb25zdCBpc01hdGNoZWQgPSB1dGlscy5wYXR0ZXJuLm1hdGNoQW55KGZpbGVwYXRoLCBwYXR0ZXJuc1JlKTtcclxuICAgICAgICAvLyBBIHBhdHRlcm4gd2l0aCBhIHRyYWlsbGluZyBzbGFzaCBjYW4gYmUgdXNlZCBmb3IgZGlyZWN0b3J5IG1hdGNoaW5nLlxyXG4gICAgICAgIC8vIFRvIGFwcGx5IHN1Y2ggcGF0dGVybiwgd2UgbmVlZCB0byBhZGQgYSB0cmFsbGluZyBzbGFzaCB0byB0aGUgcGF0aC5cclxuICAgICAgICBpZiAoIWlzTWF0Y2hlZCAmJiBpc0RpcmVjdG9yeSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdXRpbHMucGF0dGVybi5tYXRjaEFueShmaWxlcGF0aCArICcvJywgcGF0dGVybnNSZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBpc01hdGNoZWQ7XHJcbiAgICB9XHJcbn1cclxuZXhwb3J0cy5kZWZhdWx0ID0gRW50cnlGaWx0ZXI7XHJcbiIsICJcInVzZSBzdHJpY3RcIjtcclxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xyXG5jb25zdCB1dGlscyA9IHJlcXVpcmUoXCIuLi8uLi91dGlsc1wiKTtcclxuY2xhc3MgRXJyb3JGaWx0ZXIge1xyXG4gICAgY29uc3RydWN0b3IoX3NldHRpbmdzKSB7XHJcbiAgICAgICAgdGhpcy5fc2V0dGluZ3MgPSBfc2V0dGluZ3M7XHJcbiAgICB9XHJcbiAgICBnZXRGaWx0ZXIoKSB7XHJcbiAgICAgICAgcmV0dXJuIChlcnJvcikgPT4gdGhpcy5faXNOb25GYXRhbEVycm9yKGVycm9yKTtcclxuICAgIH1cclxuICAgIF9pc05vbkZhdGFsRXJyb3IoZXJyb3IpIHtcclxuICAgICAgICByZXR1cm4gdXRpbHMuZXJybm8uaXNFbm9lbnRDb2RlRXJyb3IoZXJyb3IpIHx8IHRoaXMuX3NldHRpbmdzLnN1cHByZXNzRXJyb3JzO1xyXG4gICAgfVxyXG59XHJcbmV4cG9ydHMuZGVmYXVsdCA9IEVycm9yRmlsdGVyO1xyXG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XHJcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcclxuY29uc3QgdXRpbHMgPSByZXF1aXJlKFwiLi4vLi4vdXRpbHNcIik7XHJcbmNsYXNzIEVudHJ5VHJhbnNmb3JtZXIge1xyXG4gICAgY29uc3RydWN0b3IoX3NldHRpbmdzKSB7XHJcbiAgICAgICAgdGhpcy5fc2V0dGluZ3MgPSBfc2V0dGluZ3M7XHJcbiAgICB9XHJcbiAgICBnZXRUcmFuc2Zvcm1lcigpIHtcclxuICAgICAgICByZXR1cm4gKGVudHJ5KSA9PiB0aGlzLl90cmFuc2Zvcm0oZW50cnkpO1xyXG4gICAgfVxyXG4gICAgX3RyYW5zZm9ybShlbnRyeSkge1xyXG4gICAgICAgIGxldCBmaWxlcGF0aCA9IGVudHJ5LnBhdGg7XHJcbiAgICAgICAgaWYgKHRoaXMuX3NldHRpbmdzLmFic29sdXRlKSB7XHJcbiAgICAgICAgICAgIGZpbGVwYXRoID0gdXRpbHMucGF0aC5tYWtlQWJzb2x1dGUodGhpcy5fc2V0dGluZ3MuY3dkLCBmaWxlcGF0aCk7XHJcbiAgICAgICAgICAgIGZpbGVwYXRoID0gdXRpbHMucGF0aC51bml4aWZ5KGZpbGVwYXRoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuX3NldHRpbmdzLm1hcmtEaXJlY3RvcmllcyAmJiBlbnRyeS5kaXJlbnQuaXNEaXJlY3RvcnkoKSkge1xyXG4gICAgICAgICAgICBmaWxlcGF0aCArPSAnLyc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghdGhpcy5fc2V0dGluZ3Mub2JqZWN0TW9kZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmlsZXBhdGg7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGVudHJ5KSwgeyBwYXRoOiBmaWxlcGF0aCB9KTtcclxuICAgIH1cclxufVxyXG5leHBvcnRzLmRlZmF1bHQgPSBFbnRyeVRyYW5zZm9ybWVyO1xyXG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XHJcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcclxuY29uc3QgcGF0aCA9IHJlcXVpcmUoXCJwYXRoXCIpO1xyXG5jb25zdCBkZWVwXzEgPSByZXF1aXJlKFwiLi9maWx0ZXJzL2RlZXBcIik7XHJcbmNvbnN0IGVudHJ5XzEgPSByZXF1aXJlKFwiLi9maWx0ZXJzL2VudHJ5XCIpO1xyXG5jb25zdCBlcnJvcl8xID0gcmVxdWlyZShcIi4vZmlsdGVycy9lcnJvclwiKTtcclxuY29uc3QgZW50cnlfMiA9IHJlcXVpcmUoXCIuL3RyYW5zZm9ybWVycy9lbnRyeVwiKTtcclxuY2xhc3MgUHJvdmlkZXIge1xyXG4gICAgY29uc3RydWN0b3IoX3NldHRpbmdzKSB7XHJcbiAgICAgICAgdGhpcy5fc2V0dGluZ3MgPSBfc2V0dGluZ3M7XHJcbiAgICAgICAgdGhpcy5lcnJvckZpbHRlciA9IG5ldyBlcnJvcl8xLmRlZmF1bHQodGhpcy5fc2V0dGluZ3MpO1xyXG4gICAgICAgIHRoaXMuZW50cnlGaWx0ZXIgPSBuZXcgZW50cnlfMS5kZWZhdWx0KHRoaXMuX3NldHRpbmdzLCB0aGlzLl9nZXRNaWNyb21hdGNoT3B0aW9ucygpKTtcclxuICAgICAgICB0aGlzLmRlZXBGaWx0ZXIgPSBuZXcgZGVlcF8xLmRlZmF1bHQodGhpcy5fc2V0dGluZ3MsIHRoaXMuX2dldE1pY3JvbWF0Y2hPcHRpb25zKCkpO1xyXG4gICAgICAgIHRoaXMuZW50cnlUcmFuc2Zvcm1lciA9IG5ldyBlbnRyeV8yLmRlZmF1bHQodGhpcy5fc2V0dGluZ3MpO1xyXG4gICAgfVxyXG4gICAgX2dldFJvb3REaXJlY3RvcnkodGFzaykge1xyXG4gICAgICAgIHJldHVybiBwYXRoLnJlc29sdmUodGhpcy5fc2V0dGluZ3MuY3dkLCB0YXNrLmJhc2UpO1xyXG4gICAgfVxyXG4gICAgX2dldFJlYWRlck9wdGlvbnModGFzaykge1xyXG4gICAgICAgIGNvbnN0IGJhc2VQYXRoID0gdGFzay5iYXNlID09PSAnLicgPyAnJyA6IHRhc2suYmFzZTtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBiYXNlUGF0aCxcclxuICAgICAgICAgICAgcGF0aFNlZ21lbnRTZXBhcmF0b3I6ICcvJyxcclxuICAgICAgICAgICAgY29uY3VycmVuY3k6IHRoaXMuX3NldHRpbmdzLmNvbmN1cnJlbmN5LFxyXG4gICAgICAgICAgICBkZWVwRmlsdGVyOiB0aGlzLmRlZXBGaWx0ZXIuZ2V0RmlsdGVyKGJhc2VQYXRoLCB0YXNrLnBvc2l0aXZlLCB0YXNrLm5lZ2F0aXZlKSxcclxuICAgICAgICAgICAgZW50cnlGaWx0ZXI6IHRoaXMuZW50cnlGaWx0ZXIuZ2V0RmlsdGVyKHRhc2sucG9zaXRpdmUsIHRhc2submVnYXRpdmUpLFxyXG4gICAgICAgICAgICBlcnJvckZpbHRlcjogdGhpcy5lcnJvckZpbHRlci5nZXRGaWx0ZXIoKSxcclxuICAgICAgICAgICAgZm9sbG93U3ltYm9saWNMaW5rczogdGhpcy5fc2V0dGluZ3MuZm9sbG93U3ltYm9saWNMaW5rcyxcclxuICAgICAgICAgICAgZnM6IHRoaXMuX3NldHRpbmdzLmZzLFxyXG4gICAgICAgICAgICBzdGF0czogdGhpcy5fc2V0dGluZ3Muc3RhdHMsXHJcbiAgICAgICAgICAgIHRocm93RXJyb3JPbkJyb2tlblN5bWJvbGljTGluazogdGhpcy5fc2V0dGluZ3MudGhyb3dFcnJvck9uQnJva2VuU3ltYm9saWNMaW5rLFxyXG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRoaXMuZW50cnlUcmFuc2Zvcm1lci5nZXRUcmFuc2Zvcm1lcigpXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuICAgIF9nZXRNaWNyb21hdGNoT3B0aW9ucygpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBkb3Q6IHRoaXMuX3NldHRpbmdzLmRvdCxcclxuICAgICAgICAgICAgbWF0Y2hCYXNlOiB0aGlzLl9zZXR0aW5ncy5iYXNlTmFtZU1hdGNoLFxyXG4gICAgICAgICAgICBub2JyYWNlOiAhdGhpcy5fc2V0dGluZ3MuYnJhY2VFeHBhbnNpb24sXHJcbiAgICAgICAgICAgIG5vY2FzZTogIXRoaXMuX3NldHRpbmdzLmNhc2VTZW5zaXRpdmVNYXRjaCxcclxuICAgICAgICAgICAgbm9leHQ6ICF0aGlzLl9zZXR0aW5ncy5leHRnbG9iLFxyXG4gICAgICAgICAgICBub2dsb2JzdGFyOiAhdGhpcy5fc2V0dGluZ3MuZ2xvYnN0YXIsXHJcbiAgICAgICAgICAgIHBvc2l4OiB0cnVlLFxyXG4gICAgICAgICAgICBzdHJpY3RTbGFzaGVzOiBmYWxzZVxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbn1cclxuZXhwb3J0cy5kZWZhdWx0ID0gUHJvdmlkZXI7XHJcbiIsICJcInVzZSBzdHJpY3RcIjtcclxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xyXG5jb25zdCBhc3luY18xID0gcmVxdWlyZShcIi4uL3JlYWRlcnMvYXN5bmNcIik7XHJcbmNvbnN0IHByb3ZpZGVyXzEgPSByZXF1aXJlKFwiLi9wcm92aWRlclwiKTtcclxuY2xhc3MgUHJvdmlkZXJBc3luYyBleHRlbmRzIHByb3ZpZGVyXzEuZGVmYXVsdCB7XHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xyXG4gICAgICAgIHRoaXMuX3JlYWRlciA9IG5ldyBhc3luY18xLmRlZmF1bHQodGhpcy5fc2V0dGluZ3MpO1xyXG4gICAgfVxyXG4gICAgYXN5bmMgcmVhZCh0YXNrKSB7XHJcbiAgICAgICAgY29uc3Qgcm9vdCA9IHRoaXMuX2dldFJvb3REaXJlY3RvcnkodGFzayk7XHJcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMuX2dldFJlYWRlck9wdGlvbnModGFzayk7XHJcbiAgICAgICAgY29uc3QgZW50cmllcyA9IGF3YWl0IHRoaXMuYXBpKHJvb3QsIHRhc2ssIG9wdGlvbnMpO1xyXG4gICAgICAgIHJldHVybiBlbnRyaWVzLm1hcCgoZW50cnkpID0+IG9wdGlvbnMudHJhbnNmb3JtKGVudHJ5KSk7XHJcbiAgICB9XHJcbiAgICBhcGkocm9vdCwgdGFzaywgb3B0aW9ucykge1xyXG4gICAgICAgIGlmICh0YXNrLmR5bmFtaWMpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JlYWRlci5keW5hbWljKHJvb3QsIG9wdGlvbnMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy5fcmVhZGVyLnN0YXRpYyh0YXNrLnBhdHRlcm5zLCBvcHRpb25zKTtcclxuICAgIH1cclxufVxyXG5leHBvcnRzLmRlZmF1bHQgPSBQcm92aWRlckFzeW5jO1xyXG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XHJcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcclxuY29uc3Qgc3RyZWFtXzEgPSByZXF1aXJlKFwic3RyZWFtXCIpO1xyXG5jb25zdCBzdHJlYW1fMiA9IHJlcXVpcmUoXCIuLi9yZWFkZXJzL3N0cmVhbVwiKTtcclxuY29uc3QgcHJvdmlkZXJfMSA9IHJlcXVpcmUoXCIuL3Byb3ZpZGVyXCIpO1xyXG5jbGFzcyBQcm92aWRlclN0cmVhbSBleHRlbmRzIHByb3ZpZGVyXzEuZGVmYXVsdCB7XHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xyXG4gICAgICAgIHRoaXMuX3JlYWRlciA9IG5ldyBzdHJlYW1fMi5kZWZhdWx0KHRoaXMuX3NldHRpbmdzKTtcclxuICAgIH1cclxuICAgIHJlYWQodGFzaykge1xyXG4gICAgICAgIGNvbnN0IHJvb3QgPSB0aGlzLl9nZXRSb290RGlyZWN0b3J5KHRhc2spO1xyXG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLl9nZXRSZWFkZXJPcHRpb25zKHRhc2spO1xyXG4gICAgICAgIGNvbnN0IHNvdXJjZSA9IHRoaXMuYXBpKHJvb3QsIHRhc2ssIG9wdGlvbnMpO1xyXG4gICAgICAgIGNvbnN0IGRlc3RpbmF0aW9uID0gbmV3IHN0cmVhbV8xLlJlYWRhYmxlKHsgb2JqZWN0TW9kZTogdHJ1ZSwgcmVhZDogKCkgPT4geyB9IH0pO1xyXG4gICAgICAgIHNvdXJjZVxyXG4gICAgICAgICAgICAub25jZSgnZXJyb3InLCAoZXJyb3IpID0+IGRlc3RpbmF0aW9uLmVtaXQoJ2Vycm9yJywgZXJyb3IpKVxyXG4gICAgICAgICAgICAub24oJ2RhdGEnLCAoZW50cnkpID0+IGRlc3RpbmF0aW9uLmVtaXQoJ2RhdGEnLCBvcHRpb25zLnRyYW5zZm9ybShlbnRyeSkpKVxyXG4gICAgICAgICAgICAub25jZSgnZW5kJywgKCkgPT4gZGVzdGluYXRpb24uZW1pdCgnZW5kJykpO1xyXG4gICAgICAgIGRlc3RpbmF0aW9uXHJcbiAgICAgICAgICAgIC5vbmNlKCdjbG9zZScsICgpID0+IHNvdXJjZS5kZXN0cm95KCkpO1xyXG4gICAgICAgIHJldHVybiBkZXN0aW5hdGlvbjtcclxuICAgIH1cclxuICAgIGFwaShyb290LCB0YXNrLCBvcHRpb25zKSB7XHJcbiAgICAgICAgaWYgKHRhc2suZHluYW1pYykge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fcmVhZGVyLmR5bmFtaWMocm9vdCwgb3B0aW9ucyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLl9yZWFkZXIuc3RhdGljKHRhc2sucGF0dGVybnMsIG9wdGlvbnMpO1xyXG4gICAgfVxyXG59XHJcbmV4cG9ydHMuZGVmYXVsdCA9IFByb3ZpZGVyU3RyZWFtO1xyXG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XHJcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcclxuY29uc3QgZnNTdGF0ID0gcmVxdWlyZShcIkBub2RlbGliL2ZzLnN0YXRcIik7XHJcbmNvbnN0IGZzV2FsayA9IHJlcXVpcmUoXCJAbm9kZWxpYi9mcy53YWxrXCIpO1xyXG5jb25zdCByZWFkZXJfMSA9IHJlcXVpcmUoXCIuL3JlYWRlclwiKTtcclxuY2xhc3MgUmVhZGVyU3luYyBleHRlbmRzIHJlYWRlcl8xLmRlZmF1bHQge1xyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcclxuICAgICAgICB0aGlzLl93YWxrU3luYyA9IGZzV2Fsay53YWxrU3luYztcclxuICAgICAgICB0aGlzLl9zdGF0U3luYyA9IGZzU3RhdC5zdGF0U3luYztcclxuICAgIH1cclxuICAgIGR5bmFtaWMocm9vdCwgb3B0aW9ucykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl93YWxrU3luYyhyb290LCBvcHRpb25zKTtcclxuICAgIH1cclxuICAgIHN0YXRpYyhwYXR0ZXJucywgb3B0aW9ucykge1xyXG4gICAgICAgIGNvbnN0IGVudHJpZXMgPSBbXTtcclxuICAgICAgICBmb3IgKGNvbnN0IHBhdHRlcm4gb2YgcGF0dGVybnMpIHtcclxuICAgICAgICAgICAgY29uc3QgZmlsZXBhdGggPSB0aGlzLl9nZXRGdWxsRW50cnlQYXRoKHBhdHRlcm4pO1xyXG4gICAgICAgICAgICBjb25zdCBlbnRyeSA9IHRoaXMuX2dldEVudHJ5KGZpbGVwYXRoLCBwYXR0ZXJuLCBvcHRpb25zKTtcclxuICAgICAgICAgICAgaWYgKGVudHJ5ID09PSBudWxsIHx8ICFvcHRpb25zLmVudHJ5RmlsdGVyKGVudHJ5KSkge1xyXG4gICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZW50cmllcy5wdXNoKGVudHJ5KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGVudHJpZXM7XHJcbiAgICB9XHJcbiAgICBfZ2V0RW50cnkoZmlsZXBhdGgsIHBhdHRlcm4sIG9wdGlvbnMpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBjb25zdCBzdGF0cyA9IHRoaXMuX2dldFN0YXQoZmlsZXBhdGgpO1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fbWFrZUVudHJ5KHN0YXRzLCBwYXR0ZXJuKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgICAgIGlmIChvcHRpb25zLmVycm9yRmlsdGVyKGVycm9yKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgX2dldFN0YXQoZmlsZXBhdGgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fc3RhdFN5bmMoZmlsZXBhdGgsIHRoaXMuX2ZzU3RhdFNldHRpbmdzKTtcclxuICAgIH1cclxufVxyXG5leHBvcnRzLmRlZmF1bHQgPSBSZWFkZXJTeW5jO1xyXG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XHJcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcclxuY29uc3Qgc3luY18xID0gcmVxdWlyZShcIi4uL3JlYWRlcnMvc3luY1wiKTtcclxuY29uc3QgcHJvdmlkZXJfMSA9IHJlcXVpcmUoXCIuL3Byb3ZpZGVyXCIpO1xyXG5jbGFzcyBQcm92aWRlclN5bmMgZXh0ZW5kcyBwcm92aWRlcl8xLmRlZmF1bHQge1xyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcclxuICAgICAgICB0aGlzLl9yZWFkZXIgPSBuZXcgc3luY18xLmRlZmF1bHQodGhpcy5fc2V0dGluZ3MpO1xyXG4gICAgfVxyXG4gICAgcmVhZCh0YXNrKSB7XHJcbiAgICAgICAgY29uc3Qgcm9vdCA9IHRoaXMuX2dldFJvb3REaXJlY3RvcnkodGFzayk7XHJcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMuX2dldFJlYWRlck9wdGlvbnModGFzayk7XHJcbiAgICAgICAgY29uc3QgZW50cmllcyA9IHRoaXMuYXBpKHJvb3QsIHRhc2ssIG9wdGlvbnMpO1xyXG4gICAgICAgIHJldHVybiBlbnRyaWVzLm1hcChvcHRpb25zLnRyYW5zZm9ybSk7XHJcbiAgICB9XHJcbiAgICBhcGkocm9vdCwgdGFzaywgb3B0aW9ucykge1xyXG4gICAgICAgIGlmICh0YXNrLmR5bmFtaWMpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JlYWRlci5keW5hbWljKHJvb3QsIG9wdGlvbnMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy5fcmVhZGVyLnN0YXRpYyh0YXNrLnBhdHRlcm5zLCBvcHRpb25zKTtcclxuICAgIH1cclxufVxyXG5leHBvcnRzLmRlZmF1bHQgPSBQcm92aWRlclN5bmM7XHJcbiIsICJcInVzZSBzdHJpY3RcIjtcclxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xyXG5leHBvcnRzLkRFRkFVTFRfRklMRV9TWVNURU1fQURBUFRFUiA9IHZvaWQgMDtcclxuY29uc3QgZnMgPSByZXF1aXJlKFwiZnNcIik7XHJcbmNvbnN0IG9zID0gcmVxdWlyZShcIm9zXCIpO1xyXG4vKipcclxuICogVGhlIGBvcy5jcHVzYCBtZXRob2QgY2FuIHJldHVybiB6ZXJvLiBXZSBleHBlY3QgdGhlIG51bWJlciBvZiBjb3JlcyB0byBiZSBncmVhdGVyIHRoYW4gemVyby5cclxuICogaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy9ub2RlL2Jsb2IvN2ZhZWRkZjIzYTk4YzUzODk2ZjhiNTc0YTZlNjY1ODllOGZiMWViOC9saWIvb3MuanMjTDEwNi1MMTA3XHJcbiAqL1xyXG5jb25zdCBDUFVfQ09VTlQgPSBNYXRoLm1heChvcy5jcHVzKCkubGVuZ3RoLCAxKTtcclxuZXhwb3J0cy5ERUZBVUxUX0ZJTEVfU1lTVEVNX0FEQVBURVIgPSB7XHJcbiAgICBsc3RhdDogZnMubHN0YXQsXHJcbiAgICBsc3RhdFN5bmM6IGZzLmxzdGF0U3luYyxcclxuICAgIHN0YXQ6IGZzLnN0YXQsXHJcbiAgICBzdGF0U3luYzogZnMuc3RhdFN5bmMsXHJcbiAgICByZWFkZGlyOiBmcy5yZWFkZGlyLFxyXG4gICAgcmVhZGRpclN5bmM6IGZzLnJlYWRkaXJTeW5jXHJcbn07XHJcbmNsYXNzIFNldHRpbmdzIHtcclxuICAgIGNvbnN0cnVjdG9yKF9vcHRpb25zID0ge30pIHtcclxuICAgICAgICB0aGlzLl9vcHRpb25zID0gX29wdGlvbnM7XHJcbiAgICAgICAgdGhpcy5hYnNvbHV0ZSA9IHRoaXMuX2dldFZhbHVlKHRoaXMuX29wdGlvbnMuYWJzb2x1dGUsIGZhbHNlKTtcclxuICAgICAgICB0aGlzLmJhc2VOYW1lTWF0Y2ggPSB0aGlzLl9nZXRWYWx1ZSh0aGlzLl9vcHRpb25zLmJhc2VOYW1lTWF0Y2gsIGZhbHNlKTtcclxuICAgICAgICB0aGlzLmJyYWNlRXhwYW5zaW9uID0gdGhpcy5fZ2V0VmFsdWUodGhpcy5fb3B0aW9ucy5icmFjZUV4cGFuc2lvbiwgdHJ1ZSk7XHJcbiAgICAgICAgdGhpcy5jYXNlU2Vuc2l0aXZlTWF0Y2ggPSB0aGlzLl9nZXRWYWx1ZSh0aGlzLl9vcHRpb25zLmNhc2VTZW5zaXRpdmVNYXRjaCwgdHJ1ZSk7XHJcbiAgICAgICAgdGhpcy5jb25jdXJyZW5jeSA9IHRoaXMuX2dldFZhbHVlKHRoaXMuX29wdGlvbnMuY29uY3VycmVuY3ksIENQVV9DT1VOVCk7XHJcbiAgICAgICAgdGhpcy5jd2QgPSB0aGlzLl9nZXRWYWx1ZSh0aGlzLl9vcHRpb25zLmN3ZCwgcHJvY2Vzcy5jd2QoKSk7XHJcbiAgICAgICAgdGhpcy5kZWVwID0gdGhpcy5fZ2V0VmFsdWUodGhpcy5fb3B0aW9ucy5kZWVwLCBJbmZpbml0eSk7XHJcbiAgICAgICAgdGhpcy5kb3QgPSB0aGlzLl9nZXRWYWx1ZSh0aGlzLl9vcHRpb25zLmRvdCwgZmFsc2UpO1xyXG4gICAgICAgIHRoaXMuZXh0Z2xvYiA9IHRoaXMuX2dldFZhbHVlKHRoaXMuX29wdGlvbnMuZXh0Z2xvYiwgdHJ1ZSk7XHJcbiAgICAgICAgdGhpcy5mb2xsb3dTeW1ib2xpY0xpbmtzID0gdGhpcy5fZ2V0VmFsdWUodGhpcy5fb3B0aW9ucy5mb2xsb3dTeW1ib2xpY0xpbmtzLCB0cnVlKTtcclxuICAgICAgICB0aGlzLmZzID0gdGhpcy5fZ2V0RmlsZVN5c3RlbU1ldGhvZHModGhpcy5fb3B0aW9ucy5mcyk7XHJcbiAgICAgICAgdGhpcy5nbG9ic3RhciA9IHRoaXMuX2dldFZhbHVlKHRoaXMuX29wdGlvbnMuZ2xvYnN0YXIsIHRydWUpO1xyXG4gICAgICAgIHRoaXMuaWdub3JlID0gdGhpcy5fZ2V0VmFsdWUodGhpcy5fb3B0aW9ucy5pZ25vcmUsIFtdKTtcclxuICAgICAgICB0aGlzLm1hcmtEaXJlY3RvcmllcyA9IHRoaXMuX2dldFZhbHVlKHRoaXMuX29wdGlvbnMubWFya0RpcmVjdG9yaWVzLCBmYWxzZSk7XHJcbiAgICAgICAgdGhpcy5vYmplY3RNb2RlID0gdGhpcy5fZ2V0VmFsdWUodGhpcy5fb3B0aW9ucy5vYmplY3RNb2RlLCBmYWxzZSk7XHJcbiAgICAgICAgdGhpcy5vbmx5RGlyZWN0b3JpZXMgPSB0aGlzLl9nZXRWYWx1ZSh0aGlzLl9vcHRpb25zLm9ubHlEaXJlY3RvcmllcywgZmFsc2UpO1xyXG4gICAgICAgIHRoaXMub25seUZpbGVzID0gdGhpcy5fZ2V0VmFsdWUodGhpcy5fb3B0aW9ucy5vbmx5RmlsZXMsIHRydWUpO1xyXG4gICAgICAgIHRoaXMuc3RhdHMgPSB0aGlzLl9nZXRWYWx1ZSh0aGlzLl9vcHRpb25zLnN0YXRzLCBmYWxzZSk7XHJcbiAgICAgICAgdGhpcy5zdXBwcmVzc0Vycm9ycyA9IHRoaXMuX2dldFZhbHVlKHRoaXMuX29wdGlvbnMuc3VwcHJlc3NFcnJvcnMsIGZhbHNlKTtcclxuICAgICAgICB0aGlzLnRocm93RXJyb3JPbkJyb2tlblN5bWJvbGljTGluayA9IHRoaXMuX2dldFZhbHVlKHRoaXMuX29wdGlvbnMudGhyb3dFcnJvck9uQnJva2VuU3ltYm9saWNMaW5rLCBmYWxzZSk7XHJcbiAgICAgICAgdGhpcy51bmlxdWUgPSB0aGlzLl9nZXRWYWx1ZSh0aGlzLl9vcHRpb25zLnVuaXF1ZSwgdHJ1ZSk7XHJcbiAgICAgICAgaWYgKHRoaXMub25seURpcmVjdG9yaWVzKSB7XHJcbiAgICAgICAgICAgIHRoaXMub25seUZpbGVzID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLnN0YXRzKSB7XHJcbiAgICAgICAgICAgIHRoaXMub2JqZWN0TW9kZSA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgX2dldFZhbHVlKG9wdGlvbiwgdmFsdWUpIHtcclxuICAgICAgICByZXR1cm4gb3B0aW9uID09PSB1bmRlZmluZWQgPyB2YWx1ZSA6IG9wdGlvbjtcclxuICAgIH1cclxuICAgIF9nZXRGaWxlU3lzdGVtTWV0aG9kcyhtZXRob2RzID0ge30pIHtcclxuICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBleHBvcnRzLkRFRkFVTFRfRklMRV9TWVNURU1fQURBUFRFUiksIG1ldGhvZHMpO1xyXG4gICAgfVxyXG59XHJcbmV4cG9ydHMuZGVmYXVsdCA9IFNldHRpbmdzO1xyXG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XHJcbmNvbnN0IHRhc2tNYW5hZ2VyID0gcmVxdWlyZShcIi4vbWFuYWdlcnMvdGFza3NcIik7XHJcbmNvbnN0IHBhdHRlcm5NYW5hZ2VyID0gcmVxdWlyZShcIi4vbWFuYWdlcnMvcGF0dGVybnNcIik7XHJcbmNvbnN0IGFzeW5jXzEgPSByZXF1aXJlKFwiLi9wcm92aWRlcnMvYXN5bmNcIik7XHJcbmNvbnN0IHN0cmVhbV8xID0gcmVxdWlyZShcIi4vcHJvdmlkZXJzL3N0cmVhbVwiKTtcclxuY29uc3Qgc3luY18xID0gcmVxdWlyZShcIi4vcHJvdmlkZXJzL3N5bmNcIik7XHJcbmNvbnN0IHNldHRpbmdzXzEgPSByZXF1aXJlKFwiLi9zZXR0aW5nc1wiKTtcclxuY29uc3QgdXRpbHMgPSByZXF1aXJlKFwiLi91dGlsc1wiKTtcclxuYXN5bmMgZnVuY3Rpb24gRmFzdEdsb2Ioc291cmNlLCBvcHRpb25zKSB7XHJcbiAgICBhc3NlcnRQYXR0ZXJuc0lucHV0KHNvdXJjZSk7XHJcbiAgICBjb25zdCB3b3JrcyA9IGdldFdvcmtzKHNvdXJjZSwgYXN5bmNfMS5kZWZhdWx0LCBvcHRpb25zKTtcclxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IFByb21pc2UuYWxsKHdvcmtzKTtcclxuICAgIHJldHVybiB1dGlscy5hcnJheS5mbGF0dGVuKHJlc3VsdCk7XHJcbn1cclxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3R5cGVzY3JpcHQtZXNsaW50L3R5cGVzY3JpcHQtZXNsaW50L2lzc3Vlcy82MFxyXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVkZWNsYXJlXHJcbihmdW5jdGlvbiAoRmFzdEdsb2IpIHtcclxuICAgIGZ1bmN0aW9uIHN5bmMoc291cmNlLCBvcHRpb25zKSB7XHJcbiAgICAgICAgYXNzZXJ0UGF0dGVybnNJbnB1dChzb3VyY2UpO1xyXG4gICAgICAgIGNvbnN0IHdvcmtzID0gZ2V0V29ya3Moc291cmNlLCBzeW5jXzEuZGVmYXVsdCwgb3B0aW9ucyk7XHJcbiAgICAgICAgcmV0dXJuIHV0aWxzLmFycmF5LmZsYXR0ZW4od29ya3MpO1xyXG4gICAgfVxyXG4gICAgRmFzdEdsb2Iuc3luYyA9IHN5bmM7XHJcbiAgICBmdW5jdGlvbiBzdHJlYW0oc291cmNlLCBvcHRpb25zKSB7XHJcbiAgICAgICAgYXNzZXJ0UGF0dGVybnNJbnB1dChzb3VyY2UpO1xyXG4gICAgICAgIGNvbnN0IHdvcmtzID0gZ2V0V29ya3Moc291cmNlLCBzdHJlYW1fMS5kZWZhdWx0LCBvcHRpb25zKTtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgc3RyZWFtIHJldHVybmVkIGJ5IHRoZSBwcm92aWRlciBjYW5ub3Qgd29yayB3aXRoIGFuIGFzeW5jaHJvbm91cyBpdGVyYXRvci5cclxuICAgICAgICAgKiBUbyBzdXBwb3J0IGFzeW5jaHJvbm91cyBpdGVyYXRvcnMsIHJlZ2FyZGxlc3Mgb2YgdGhlIG51bWJlciBvZiB0YXNrcywgd2UgYWx3YXlzIG11bHRpcGxleCBzdHJlYW1zLlxyXG4gICAgICAgICAqIFRoaXMgYWZmZWN0cyBwZXJmb3JtYW5jZSAoKzI1JSkuIEkgZG9uJ3Qgc2VlIGJlc3Qgc29sdXRpb24gcmlnaHQgbm93LlxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHJldHVybiB1dGlscy5zdHJlYW0ubWVyZ2Uod29ya3MpO1xyXG4gICAgfVxyXG4gICAgRmFzdEdsb2Iuc3RyZWFtID0gc3RyZWFtO1xyXG4gICAgZnVuY3Rpb24gZ2VuZXJhdGVUYXNrcyhzb3VyY2UsIG9wdGlvbnMpIHtcclxuICAgICAgICBhc3NlcnRQYXR0ZXJuc0lucHV0KHNvdXJjZSk7XHJcbiAgICAgICAgY29uc3QgcGF0dGVybnMgPSBwYXR0ZXJuTWFuYWdlci50cmFuc2Zvcm0oW10uY29uY2F0KHNvdXJjZSkpO1xyXG4gICAgICAgIGNvbnN0IHNldHRpbmdzID0gbmV3IHNldHRpbmdzXzEuZGVmYXVsdChvcHRpb25zKTtcclxuICAgICAgICByZXR1cm4gdGFza01hbmFnZXIuZ2VuZXJhdGUocGF0dGVybnMsIHNldHRpbmdzKTtcclxuICAgIH1cclxuICAgIEZhc3RHbG9iLmdlbmVyYXRlVGFza3MgPSBnZW5lcmF0ZVRhc2tzO1xyXG4gICAgZnVuY3Rpb24gaXNEeW5hbWljUGF0dGVybihzb3VyY2UsIG9wdGlvbnMpIHtcclxuICAgICAgICBhc3NlcnRQYXR0ZXJuc0lucHV0KHNvdXJjZSk7XHJcbiAgICAgICAgY29uc3Qgc2V0dGluZ3MgPSBuZXcgc2V0dGluZ3NfMS5kZWZhdWx0KG9wdGlvbnMpO1xyXG4gICAgICAgIHJldHVybiB1dGlscy5wYXR0ZXJuLmlzRHluYW1pY1BhdHRlcm4oc291cmNlLCBzZXR0aW5ncyk7XHJcbiAgICB9XHJcbiAgICBGYXN0R2xvYi5pc0R5bmFtaWNQYXR0ZXJuID0gaXNEeW5hbWljUGF0dGVybjtcclxuICAgIGZ1bmN0aW9uIGVzY2FwZVBhdGgoc291cmNlKSB7XHJcbiAgICAgICAgYXNzZXJ0UGF0dGVybnNJbnB1dChzb3VyY2UpO1xyXG4gICAgICAgIHJldHVybiB1dGlscy5wYXRoLmVzY2FwZShzb3VyY2UpO1xyXG4gICAgfVxyXG4gICAgRmFzdEdsb2IuZXNjYXBlUGF0aCA9IGVzY2FwZVBhdGg7XHJcbn0pKEZhc3RHbG9iIHx8IChGYXN0R2xvYiA9IHt9KSk7XHJcbmZ1bmN0aW9uIGdldFdvcmtzKHNvdXJjZSwgX1Byb3ZpZGVyLCBvcHRpb25zKSB7XHJcbiAgICBjb25zdCBwYXR0ZXJucyA9IHBhdHRlcm5NYW5hZ2VyLnRyYW5zZm9ybShbXS5jb25jYXQoc291cmNlKSk7XHJcbiAgICBjb25zdCBzZXR0aW5ncyA9IG5ldyBzZXR0aW5nc18xLmRlZmF1bHQob3B0aW9ucyk7XHJcbiAgICBjb25zdCB0YXNrcyA9IHRhc2tNYW5hZ2VyLmdlbmVyYXRlKHBhdHRlcm5zLCBzZXR0aW5ncyk7XHJcbiAgICBjb25zdCBwcm92aWRlciA9IG5ldyBfUHJvdmlkZXIoc2V0dGluZ3MpO1xyXG4gICAgcmV0dXJuIHRhc2tzLm1hcChwcm92aWRlci5yZWFkLCBwcm92aWRlcik7XHJcbn1cclxuZnVuY3Rpb24gYXNzZXJ0UGF0dGVybnNJbnB1dChpbnB1dCkge1xyXG4gICAgY29uc3Qgc291cmNlID0gW10uY29uY2F0KGlucHV0KTtcclxuICAgIGNvbnN0IGlzVmFsaWRTb3VyY2UgPSBzb3VyY2UuZXZlcnkoKGl0ZW0pID0+IHV0aWxzLnN0cmluZy5pc1N0cmluZyhpdGVtKSAmJiAhdXRpbHMuc3RyaW5nLmlzRW1wdHkoaXRlbSkpO1xyXG4gICAgaWYgKCFpc1ZhbGlkU291cmNlKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignUGF0dGVybnMgbXVzdCBiZSBhIHN0cmluZyAobm9uIGVtcHR5KSBvciBhbiBhcnJheSBvZiBzdHJpbmdzJyk7XHJcbiAgICB9XHJcbn1cclxubW9kdWxlLmV4cG9ydHMgPSBGYXN0R2xvYjtcclxuIiwgIid1c2Ugc3RyaWN0JztcbmNvbnN0IHtwcm9taXNpZnl9ID0gcmVxdWlyZSgndXRpbCcpO1xuY29uc3QgZnMgPSByZXF1aXJlKCdmcycpO1xuXG5hc3luYyBmdW5jdGlvbiBpc1R5cGUoZnNTdGF0VHlwZSwgc3RhdHNNZXRob2ROYW1lLCBmaWxlUGF0aCkge1xuXHRpZiAodHlwZW9mIGZpbGVQYXRoICE9PSAnc3RyaW5nJykge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoYEV4cGVjdGVkIGEgc3RyaW5nLCBnb3QgJHt0eXBlb2YgZmlsZVBhdGh9YCk7XG5cdH1cblxuXHR0cnkge1xuXHRcdGNvbnN0IHN0YXRzID0gYXdhaXQgcHJvbWlzaWZ5KGZzW2ZzU3RhdFR5cGVdKShmaWxlUGF0aCk7XG5cdFx0cmV0dXJuIHN0YXRzW3N0YXRzTWV0aG9kTmFtZV0oKTtcblx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRpZiAoZXJyb3IuY29kZSA9PT0gJ0VOT0VOVCcpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHR0aHJvdyBlcnJvcjtcblx0fVxufVxuXG5mdW5jdGlvbiBpc1R5cGVTeW5jKGZzU3RhdFR5cGUsIHN0YXRzTWV0aG9kTmFtZSwgZmlsZVBhdGgpIHtcblx0aWYgKHR5cGVvZiBmaWxlUGF0aCAhPT0gJ3N0cmluZycpIHtcblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKGBFeHBlY3RlZCBhIHN0cmluZywgZ290ICR7dHlwZW9mIGZpbGVQYXRofWApO1xuXHR9XG5cblx0dHJ5IHtcblx0XHRyZXR1cm4gZnNbZnNTdGF0VHlwZV0oZmlsZVBhdGgpW3N0YXRzTWV0aG9kTmFtZV0oKTtcblx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRpZiAoZXJyb3IuY29kZSA9PT0gJ0VOT0VOVCcpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHR0aHJvdyBlcnJvcjtcblx0fVxufVxuXG5leHBvcnRzLmlzRmlsZSA9IGlzVHlwZS5iaW5kKG51bGwsICdzdGF0JywgJ2lzRmlsZScpO1xuZXhwb3J0cy5pc0RpcmVjdG9yeSA9IGlzVHlwZS5iaW5kKG51bGwsICdzdGF0JywgJ2lzRGlyZWN0b3J5Jyk7XG5leHBvcnRzLmlzU3ltbGluayA9IGlzVHlwZS5iaW5kKG51bGwsICdsc3RhdCcsICdpc1N5bWJvbGljTGluaycpO1xuZXhwb3J0cy5pc0ZpbGVTeW5jID0gaXNUeXBlU3luYy5iaW5kKG51bGwsICdzdGF0U3luYycsICdpc0ZpbGUnKTtcbmV4cG9ydHMuaXNEaXJlY3RvcnlTeW5jID0gaXNUeXBlU3luYy5iaW5kKG51bGwsICdzdGF0U3luYycsICdpc0RpcmVjdG9yeScpO1xuZXhwb3J0cy5pc1N5bWxpbmtTeW5jID0gaXNUeXBlU3luYy5iaW5kKG51bGwsICdsc3RhdFN5bmMnLCAnaXNTeW1ib2xpY0xpbmsnKTtcbiIsICIndXNlIHN0cmljdCc7XG5jb25zdCBwYXRoID0gcmVxdWlyZSgncGF0aCcpO1xuY29uc3QgcGF0aFR5cGUgPSByZXF1aXJlKCdwYXRoLXR5cGUnKTtcblxuY29uc3QgZ2V0RXh0ZW5zaW9ucyA9IGV4dGVuc2lvbnMgPT4gZXh0ZW5zaW9ucy5sZW5ndGggPiAxID8gYHske2V4dGVuc2lvbnMuam9pbignLCcpfX1gIDogZXh0ZW5zaW9uc1swXTtcblxuY29uc3QgZ2V0UGF0aCA9IChmaWxlcGF0aCwgY3dkKSA9PiB7XG5cdGNvbnN0IHB0aCA9IGZpbGVwYXRoWzBdID09PSAnIScgPyBmaWxlcGF0aC5zbGljZSgxKSA6IGZpbGVwYXRoO1xuXHRyZXR1cm4gcGF0aC5pc0Fic29sdXRlKHB0aCkgPyBwdGggOiBwYXRoLmpvaW4oY3dkLCBwdGgpO1xufTtcblxuY29uc3QgYWRkRXh0ZW5zaW9ucyA9IChmaWxlLCBleHRlbnNpb25zKSA9PiB7XG5cdGlmIChwYXRoLmV4dG5hbWUoZmlsZSkpIHtcblx0XHRyZXR1cm4gYCoqLyR7ZmlsZX1gO1xuXHR9XG5cblx0cmV0dXJuIGAqKi8ke2ZpbGV9LiR7Z2V0RXh0ZW5zaW9ucyhleHRlbnNpb25zKX1gO1xufTtcblxuY29uc3QgZ2V0R2xvYiA9IChkaXJlY3RvcnksIG9wdGlvbnMpID0+IHtcblx0aWYgKG9wdGlvbnMuZmlsZXMgJiYgIUFycmF5LmlzQXJyYXkob3B0aW9ucy5maWxlcykpIHtcblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKGBFeHBlY3RlZCBcXGBmaWxlc1xcYCB0byBiZSBvZiB0eXBlIFxcYEFycmF5XFxgIGJ1dCByZWNlaXZlZCB0eXBlIFxcYCR7dHlwZW9mIG9wdGlvbnMuZmlsZXN9XFxgYCk7XG5cdH1cblxuXHRpZiAob3B0aW9ucy5leHRlbnNpb25zICYmICFBcnJheS5pc0FycmF5KG9wdGlvbnMuZXh0ZW5zaW9ucykpIHtcblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKGBFeHBlY3RlZCBcXGBleHRlbnNpb25zXFxgIHRvIGJlIG9mIHR5cGUgXFxgQXJyYXlcXGAgYnV0IHJlY2VpdmVkIHR5cGUgXFxgJHt0eXBlb2Ygb3B0aW9ucy5leHRlbnNpb25zfVxcYGApO1xuXHR9XG5cblx0aWYgKG9wdGlvbnMuZmlsZXMgJiYgb3B0aW9ucy5leHRlbnNpb25zKSB7XG5cdFx0cmV0dXJuIG9wdGlvbnMuZmlsZXMubWFwKHggPT4gcGF0aC5wb3NpeC5qb2luKGRpcmVjdG9yeSwgYWRkRXh0ZW5zaW9ucyh4LCBvcHRpb25zLmV4dGVuc2lvbnMpKSk7XG5cdH1cblxuXHRpZiAob3B0aW9ucy5maWxlcykge1xuXHRcdHJldHVybiBvcHRpb25zLmZpbGVzLm1hcCh4ID0+IHBhdGgucG9zaXguam9pbihkaXJlY3RvcnksIGAqKi8ke3h9YCkpO1xuXHR9XG5cblx0aWYgKG9wdGlvbnMuZXh0ZW5zaW9ucykge1xuXHRcdHJldHVybiBbcGF0aC5wb3NpeC5qb2luKGRpcmVjdG9yeSwgYCoqLyouJHtnZXRFeHRlbnNpb25zKG9wdGlvbnMuZXh0ZW5zaW9ucyl9YCldO1xuXHR9XG5cblx0cmV0dXJuIFtwYXRoLnBvc2l4LmpvaW4oZGlyZWN0b3J5LCAnKionKV07XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGFzeW5jIChpbnB1dCwgb3B0aW9ucykgPT4ge1xuXHRvcHRpb25zID0ge1xuXHRcdGN3ZDogcHJvY2Vzcy5jd2QoKSxcblx0XHQuLi5vcHRpb25zXG5cdH07XG5cblx0aWYgKHR5cGVvZiBvcHRpb25zLmN3ZCAhPT0gJ3N0cmluZycpIHtcblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKGBFeHBlY3RlZCBcXGBjd2RcXGAgdG8gYmUgb2YgdHlwZSBcXGBzdHJpbmdcXGAgYnV0IHJlY2VpdmVkIHR5cGUgXFxgJHt0eXBlb2Ygb3B0aW9ucy5jd2R9XFxgYCk7XG5cdH1cblxuXHRjb25zdCBnbG9icyA9IGF3YWl0IFByb21pc2UuYWxsKFtdLmNvbmNhdChpbnB1dCkubWFwKGFzeW5jIHggPT4ge1xuXHRcdGNvbnN0IGlzRGlyZWN0b3J5ID0gYXdhaXQgcGF0aFR5cGUuaXNEaXJlY3RvcnkoZ2V0UGF0aCh4LCBvcHRpb25zLmN3ZCkpO1xuXHRcdHJldHVybiBpc0RpcmVjdG9yeSA/IGdldEdsb2IoeCwgb3B0aW9ucykgOiB4O1xuXHR9KSk7XG5cblx0cmV0dXJuIFtdLmNvbmNhdC5hcHBseShbXSwgZ2xvYnMpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHByZWZlci1zcHJlYWRcbn07XG5cbm1vZHVsZS5leHBvcnRzLnN5bmMgPSAoaW5wdXQsIG9wdGlvbnMpID0+IHtcblx0b3B0aW9ucyA9IHtcblx0XHRjd2Q6IHByb2Nlc3MuY3dkKCksXG5cdFx0Li4ub3B0aW9uc1xuXHR9O1xuXG5cdGlmICh0eXBlb2Ygb3B0aW9ucy5jd2QgIT09ICdzdHJpbmcnKSB7XG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcihgRXhwZWN0ZWQgXFxgY3dkXFxgIHRvIGJlIG9mIHR5cGUgXFxgc3RyaW5nXFxgIGJ1dCByZWNlaXZlZCB0eXBlIFxcYCR7dHlwZW9mIG9wdGlvbnMuY3dkfVxcYGApO1xuXHR9XG5cblx0Y29uc3QgZ2xvYnMgPSBbXS5jb25jYXQoaW5wdXQpLm1hcCh4ID0+IHBhdGhUeXBlLmlzRGlyZWN0b3J5U3luYyhnZXRQYXRoKHgsIG9wdGlvbnMuY3dkKSkgPyBnZXRHbG9iKHgsIG9wdGlvbnMpIDogeCk7XG5cblx0cmV0dXJuIFtdLmNvbmNhdC5hcHBseShbXSwgZ2xvYnMpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHByZWZlci1zcHJlYWRcbn07XG4iLCAiLy8gQSBzaW1wbGUgaW1wbGVtZW50YXRpb24gb2YgbWFrZS1hcnJheVxuZnVuY3Rpb24gbWFrZUFycmF5IChzdWJqZWN0KSB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHN1YmplY3QpXG4gICAgPyBzdWJqZWN0XG4gICAgOiBbc3ViamVjdF1cbn1cblxuY29uc3QgRU1QVFkgPSAnJ1xuY29uc3QgU1BBQ0UgPSAnICdcbmNvbnN0IEVTQ0FQRSA9ICdcXFxcJ1xuY29uc3QgUkVHRVhfVEVTVF9CTEFOS19MSU5FID0gL15cXHMrJC9cbmNvbnN0IFJFR0VYX0lOVkFMSURfVFJBSUxJTkdfQkFDS1NMQVNIID0gLyg/OlteXFxcXF18XilcXFxcJC9cbmNvbnN0IFJFR0VYX1JFUExBQ0VfTEVBRElOR19FWENBUEVEX0VYQ0xBTUFUSU9OID0gL15cXFxcIS9cbmNvbnN0IFJFR0VYX1JFUExBQ0VfTEVBRElOR19FWENBUEVEX0hBU0ggPSAvXlxcXFwjL1xuY29uc3QgUkVHRVhfU1BMSVRBTExfQ1JMRiA9IC9cXHI/XFxuL2dcbi8vIC9mb28sXG4vLyAuL2Zvbyxcbi8vIC4uL2Zvbyxcbi8vIC5cbi8vIC4uXG5jb25zdCBSRUdFWF9URVNUX0lOVkFMSURfUEFUSCA9IC9eXFwuKlxcL3xeXFwuKyQvXG5cbmNvbnN0IFNMQVNIID0gJy8nXG5cbi8vIERvIG5vdCB1c2UgdGVybmFyeSBleHByZXNzaW9uIGhlcmUsIHNpbmNlIFwiaXN0YW5idWwgaWdub3JlIG5leHRcIiBpcyBidWdneVxubGV0IFRNUF9LRVlfSUdOT1JFID0gJ25vZGUtaWdub3JlJ1xuLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbmlmICh0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJykge1xuICBUTVBfS0VZX0lHTk9SRSA9IFN5bWJvbC5mb3IoJ25vZGUtaWdub3JlJylcbn1cbmNvbnN0IEtFWV9JR05PUkUgPSBUTVBfS0VZX0lHTk9SRVxuXG5jb25zdCBkZWZpbmUgPSAob2JqZWN0LCBrZXksIHZhbHVlKSA9PlxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqZWN0LCBrZXksIHt2YWx1ZX0pXG5cbmNvbnN0IFJFR0VYX1JFR0VYUF9SQU5HRSA9IC8oWzAtel0pLShbMC16XSkvZ1xuXG5jb25zdCBSRVRVUk5fRkFMU0UgPSAoKSA9PiBmYWxzZVxuXG4vLyBTYW5pdGl6ZSB0aGUgcmFuZ2Ugb2YgYSByZWd1bGFyIGV4cHJlc3Npb25cbi8vIFRoZSBjYXNlcyBhcmUgY29tcGxpY2F0ZWQsIHNlZSB0ZXN0IGNhc2VzIGZvciBkZXRhaWxzXG5jb25zdCBzYW5pdGl6ZVJhbmdlID0gcmFuZ2UgPT4gcmFuZ2UucmVwbGFjZShcbiAgUkVHRVhfUkVHRVhQX1JBTkdFLFxuICAobWF0Y2gsIGZyb20sIHRvKSA9PiBmcm9tLmNoYXJDb2RlQXQoMCkgPD0gdG8uY2hhckNvZGVBdCgwKVxuICAgID8gbWF0Y2hcbiAgICAvLyBJbnZhbGlkIHJhbmdlIChvdXQgb2Ygb3JkZXIpIHdoaWNoIGlzIG9rIGZvciBnaXRpZ25vcmUgcnVsZXMgYnV0XG4gICAgLy8gICBmYXRhbCBmb3IgSmF2YVNjcmlwdCByZWd1bGFyIGV4cHJlc3Npb24sIHNvIGVsaW1pbmF0ZSBpdC5cbiAgICA6IEVNUFRZXG4pXG5cbi8vIFNlZSBmaXh0dXJlcyAjNTlcbmNvbnN0IGNsZWFuUmFuZ2VCYWNrU2xhc2ggPSBzbGFzaGVzID0+IHtcbiAgY29uc3Qge2xlbmd0aH0gPSBzbGFzaGVzXG4gIHJldHVybiBzbGFzaGVzLnNsaWNlKDAsIGxlbmd0aCAtIGxlbmd0aCAlIDIpXG59XG5cbi8vID4gSWYgdGhlIHBhdHRlcm4gZW5kcyB3aXRoIGEgc2xhc2gsXG4vLyA+IGl0IGlzIHJlbW92ZWQgZm9yIHRoZSBwdXJwb3NlIG9mIHRoZSBmb2xsb3dpbmcgZGVzY3JpcHRpb24sXG4vLyA+IGJ1dCBpdCB3b3VsZCBvbmx5IGZpbmQgYSBtYXRjaCB3aXRoIGEgZGlyZWN0b3J5LlxuLy8gPiBJbiBvdGhlciB3b3JkcywgZm9vLyB3aWxsIG1hdGNoIGEgZGlyZWN0b3J5IGZvbyBhbmQgcGF0aHMgdW5kZXJuZWF0aCBpdCxcbi8vID4gYnV0IHdpbGwgbm90IG1hdGNoIGEgcmVndWxhciBmaWxlIG9yIGEgc3ltYm9saWMgbGluayBmb29cbi8vID4gICh0aGlzIGlzIGNvbnNpc3RlbnQgd2l0aCB0aGUgd2F5IGhvdyBwYXRoc3BlYyB3b3JrcyBpbiBnZW5lcmFsIGluIEdpdCkuXG4vLyAnYGZvby9gJyB3aWxsIG5vdCBtYXRjaCByZWd1bGFyIGZpbGUgJ2Bmb29gJyBvciBzeW1ib2xpYyBsaW5rICdgZm9vYCdcbi8vIC0+IGlnbm9yZS1ydWxlcyB3aWxsIG5vdCBkZWFsIHdpdGggaXQsIGJlY2F1c2UgaXQgY29zdHMgZXh0cmEgYGZzLnN0YXRgIGNhbGxcbi8vICAgICAgeW91IGNvdWxkIHVzZSBvcHRpb24gYG1hcms6IHRydWVgIHdpdGggYGdsb2JgXG5cbi8vICdgZm9vL2AnIHNob3VsZCBub3QgY29udGludWUgd2l0aCB0aGUgJ2AuLmAnXG5jb25zdCBSRVBMQUNFUlMgPSBbXG5cbiAgLy8gPiBUcmFpbGluZyBzcGFjZXMgYXJlIGlnbm9yZWQgdW5sZXNzIHRoZXkgYXJlIHF1b3RlZCB3aXRoIGJhY2tzbGFzaCAoXCJcXFwiKVxuICBbXG4gICAgLy8gKGFcXCApIC0+IChhIClcbiAgICAvLyAoYSAgKSAtPiAoYSlcbiAgICAvLyAoYSBcXCApIC0+IChhICApXG4gICAgL1xcXFw/XFxzKyQvLFxuICAgIG1hdGNoID0+IG1hdGNoLmluZGV4T2YoJ1xcXFwnKSA9PT0gMFxuICAgICAgPyBTUEFDRVxuICAgICAgOiBFTVBUWVxuICBdLFxuXG4gIC8vIHJlcGxhY2UgKFxcICkgd2l0aCAnICdcbiAgW1xuICAgIC9cXFxcXFxzL2csXG4gICAgKCkgPT4gU1BBQ0VcbiAgXSxcblxuICAvLyBFc2NhcGUgbWV0YWNoYXJhY3RlcnNcbiAgLy8gd2hpY2ggaXMgd3JpdHRlbiBkb3duIGJ5IHVzZXJzIGJ1dCBtZWFucyBzcGVjaWFsIGZvciByZWd1bGFyIGV4cHJlc3Npb25zLlxuXG4gIC8vID4gVGhlcmUgYXJlIDEyIGNoYXJhY3RlcnMgd2l0aCBzcGVjaWFsIG1lYW5pbmdzOlxuICAvLyA+IC0gdGhlIGJhY2tzbGFzaCBcXCxcbiAgLy8gPiAtIHRoZSBjYXJldCBeLFxuICAvLyA+IC0gdGhlIGRvbGxhciBzaWduICQsXG4gIC8vID4gLSB0aGUgcGVyaW9kIG9yIGRvdCAuLFxuICAvLyA+IC0gdGhlIHZlcnRpY2FsIGJhciBvciBwaXBlIHN5bWJvbCB8LFxuICAvLyA+IC0gdGhlIHF1ZXN0aW9uIG1hcmsgPyxcbiAgLy8gPiAtIHRoZSBhc3RlcmlzayBvciBzdGFyICosXG4gIC8vID4gLSB0aGUgcGx1cyBzaWduICssXG4gIC8vID4gLSB0aGUgb3BlbmluZyBwYXJlbnRoZXNpcyAoLFxuICAvLyA+IC0gdGhlIGNsb3NpbmcgcGFyZW50aGVzaXMgKSxcbiAgLy8gPiAtIGFuZCB0aGUgb3BlbmluZyBzcXVhcmUgYnJhY2tldCBbLFxuICAvLyA+IC0gdGhlIG9wZW5pbmcgY3VybHkgYnJhY2UgeyxcbiAgLy8gPiBUaGVzZSBzcGVjaWFsIGNoYXJhY3RlcnMgYXJlIG9mdGVuIGNhbGxlZCBcIm1ldGFjaGFyYWN0ZXJzXCIuXG4gIFtcbiAgICAvW1xcXFwkLnwqKygpe15dL2csXG4gICAgbWF0Y2ggPT4gYFxcXFwke21hdGNofWBcbiAgXSxcblxuICBbXG4gICAgLy8gPiBhIHF1ZXN0aW9uIG1hcmsgKD8pIG1hdGNoZXMgYSBzaW5nbGUgY2hhcmFjdGVyXG4gICAgLyg/IVxcXFwpXFw/L2csXG4gICAgKCkgPT4gJ1teL10nXG4gIF0sXG5cbiAgLy8gbGVhZGluZyBzbGFzaFxuICBbXG5cbiAgICAvLyA+IEEgbGVhZGluZyBzbGFzaCBtYXRjaGVzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHBhdGhuYW1lLlxuICAgIC8vID4gRm9yIGV4YW1wbGUsIFwiLyouY1wiIG1hdGNoZXMgXCJjYXQtZmlsZS5jXCIgYnV0IG5vdCBcIm1vemlsbGEtc2hhMS9zaGExLmNcIi5cbiAgICAvLyBBIGxlYWRpbmcgc2xhc2ggbWF0Y2hlcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSBwYXRobmFtZVxuICAgIC9eXFwvLyxcbiAgICAoKSA9PiAnXidcbiAgXSxcblxuICAvLyByZXBsYWNlIHNwZWNpYWwgbWV0YWNoYXJhY3RlciBzbGFzaCBhZnRlciB0aGUgbGVhZGluZyBzbGFzaFxuICBbXG4gICAgL1xcLy9nLFxuICAgICgpID0+ICdcXFxcLydcbiAgXSxcblxuICBbXG4gICAgLy8gPiBBIGxlYWRpbmcgXCIqKlwiIGZvbGxvd2VkIGJ5IGEgc2xhc2ggbWVhbnMgbWF0Y2ggaW4gYWxsIGRpcmVjdG9yaWVzLlxuICAgIC8vID4gRm9yIGV4YW1wbGUsIFwiKiovZm9vXCIgbWF0Y2hlcyBmaWxlIG9yIGRpcmVjdG9yeSBcImZvb1wiIGFueXdoZXJlLFxuICAgIC8vID4gdGhlIHNhbWUgYXMgcGF0dGVybiBcImZvb1wiLlxuICAgIC8vID4gXCIqKi9mb28vYmFyXCIgbWF0Y2hlcyBmaWxlIG9yIGRpcmVjdG9yeSBcImJhclwiIGFueXdoZXJlIHRoYXQgaXMgZGlyZWN0bHlcbiAgICAvLyA+ICAgdW5kZXIgZGlyZWN0b3J5IFwiZm9vXCIuXG4gICAgLy8gTm90aWNlIHRoYXQgdGhlICcqJ3MgaGF2ZSBiZWVuIHJlcGxhY2VkIGFzICdcXFxcKidcbiAgICAvXlxcXipcXFxcXFwqXFxcXFxcKlxcXFxcXC8vLFxuXG4gICAgLy8gJyoqL2ZvbycgPC0+ICdmb28nXG4gICAgKCkgPT4gJ14oPzouKlxcXFwvKT8nXG4gIF0sXG5cbiAgLy8gc3RhcnRpbmdcbiAgW1xuICAgIC8vIHRoZXJlIHdpbGwgYmUgbm8gbGVhZGluZyAnLydcbiAgICAvLyAgICh3aGljaCBoYXMgYmVlbiByZXBsYWNlZCBieSBzZWN0aW9uIFwibGVhZGluZyBzbGFzaFwiKVxuICAgIC8vIElmIHN0YXJ0cyB3aXRoICcqKicsIGFkZGluZyBhICdeJyB0byB0aGUgcmVndWxhciBleHByZXNzaW9uIGFsc28gd29ya3NcbiAgICAvXig/PVteXl0pLyxcbiAgICBmdW5jdGlvbiBzdGFydGluZ1JlcGxhY2VyICgpIHtcbiAgICAgIC8vIElmIGhhcyBhIHNsYXNoIGAvYCBhdCB0aGUgYmVnaW5uaW5nIG9yIG1pZGRsZVxuICAgICAgcmV0dXJuICEvXFwvKD8hJCkvLnRlc3QodGhpcylcbiAgICAgICAgLy8gPiBQcmlvciB0byAyLjIyLjFcbiAgICAgICAgLy8gPiBJZiB0aGUgcGF0dGVybiBkb2VzIG5vdCBjb250YWluIGEgc2xhc2ggLyxcbiAgICAgICAgLy8gPiAgIEdpdCB0cmVhdHMgaXQgYXMgYSBzaGVsbCBnbG9iIHBhdHRlcm5cbiAgICAgICAgLy8gQWN0dWFsbHksIGlmIHRoZXJlIGlzIG9ubHkgYSB0cmFpbGluZyBzbGFzaCxcbiAgICAgICAgLy8gICBnaXQgYWxzbyB0cmVhdHMgaXQgYXMgYSBzaGVsbCBnbG9iIHBhdHRlcm5cblxuICAgICAgICAvLyBBZnRlciAyLjIyLjEgKGNvbXBhdGlibGUgYnV0IGNsZWFyZXIpXG4gICAgICAgIC8vID4gSWYgdGhlcmUgaXMgYSBzZXBhcmF0b3IgYXQgdGhlIGJlZ2lubmluZyBvciBtaWRkbGUgKG9yIGJvdGgpXG4gICAgICAgIC8vID4gb2YgdGhlIHBhdHRlcm4sIHRoZW4gdGhlIHBhdHRlcm4gaXMgcmVsYXRpdmUgdG8gdGhlIGRpcmVjdG9yeVxuICAgICAgICAvLyA+IGxldmVsIG9mIHRoZSBwYXJ0aWN1bGFyIC5naXRpZ25vcmUgZmlsZSBpdHNlbGYuXG4gICAgICAgIC8vID4gT3RoZXJ3aXNlIHRoZSBwYXR0ZXJuIG1heSBhbHNvIG1hdGNoIGF0IGFueSBsZXZlbCBiZWxvd1xuICAgICAgICAvLyA+IHRoZSAuZ2l0aWdub3JlIGxldmVsLlxuICAgICAgICA/ICcoPzpefFxcXFwvKSdcblxuICAgICAgICAvLyA+IE90aGVyd2lzZSwgR2l0IHRyZWF0cyB0aGUgcGF0dGVybiBhcyBhIHNoZWxsIGdsb2Igc3VpdGFibGUgZm9yXG4gICAgICAgIC8vID4gICBjb25zdW1wdGlvbiBieSBmbm1hdGNoKDMpXG4gICAgICAgIDogJ14nXG4gICAgfVxuICBdLFxuXG4gIC8vIHR3byBnbG9ic3RhcnNcbiAgW1xuICAgIC8vIFVzZSBsb29rYWhlYWQgYXNzZXJ0aW9ucyBzbyB0aGF0IHdlIGNvdWxkIG1hdGNoIG1vcmUgdGhhbiBvbmUgYCcvKionYFxuICAgIC9cXFxcXFwvXFxcXFxcKlxcXFxcXCooPz1cXFxcXFwvfCQpL2csXG5cbiAgICAvLyBaZXJvLCBvbmUgb3Igc2V2ZXJhbCBkaXJlY3Rvcmllc1xuICAgIC8vIHNob3VsZCBub3QgdXNlICcqJywgb3IgaXQgd2lsbCBiZSByZXBsYWNlZCBieSB0aGUgbmV4dCByZXBsYWNlclxuXG4gICAgLy8gQ2hlY2sgaWYgaXQgaXMgbm90IHRoZSBsYXN0IGAnLyoqJ2BcbiAgICAoXywgaW5kZXgsIHN0cikgPT4gaW5kZXggKyA2IDwgc3RyLmxlbmd0aFxuXG4gICAgICAvLyBjYXNlOiAvKiovXG4gICAgICAvLyA+IEEgc2xhc2ggZm9sbG93ZWQgYnkgdHdvIGNvbnNlY3V0aXZlIGFzdGVyaXNrcyB0aGVuIGEgc2xhc2ggbWF0Y2hlc1xuICAgICAgLy8gPiAgIHplcm8gb3IgbW9yZSBkaXJlY3Rvcmllcy5cbiAgICAgIC8vID4gRm9yIGV4YW1wbGUsIFwiYS8qKi9iXCIgbWF0Y2hlcyBcImEvYlwiLCBcImEveC9iXCIsIFwiYS94L3kvYlwiIGFuZCBzbyBvbi5cbiAgICAgIC8vICcvKiovJ1xuICAgICAgPyAnKD86XFxcXC9bXlxcXFwvXSspKidcblxuICAgICAgLy8gY2FzZTogLyoqXG4gICAgICAvLyA+IEEgdHJhaWxpbmcgYFwiLyoqXCJgIG1hdGNoZXMgZXZlcnl0aGluZyBpbnNpZGUuXG5cbiAgICAgIC8vICMyMTogZXZlcnl0aGluZyBpbnNpZGUgYnV0IGl0IHNob3VsZCBub3QgaW5jbHVkZSB0aGUgY3VycmVudCBmb2xkZXJcbiAgICAgIDogJ1xcXFwvLisnXG4gIF0sXG5cbiAgLy8gbm9ybWFsIGludGVybWVkaWF0ZSB3aWxkY2FyZHNcbiAgW1xuICAgIC8vIE5ldmVyIHJlcGxhY2UgZXNjYXBlZCAnKidcbiAgICAvLyBpZ25vcmUgcnVsZSAnXFwqJyB3aWxsIG1hdGNoIHRoZSBwYXRoICcqJ1xuXG4gICAgLy8gJ2FiYy4qLycgLT4gZ29cbiAgICAvLyAnYWJjLionICAtPiBza2lwIHRoaXMgcnVsZSxcbiAgICAvLyAgICBjb3ogdHJhaWxpbmcgc2luZ2xlIHdpbGRjYXJkIHdpbGwgYmUgaGFuZGVkIGJ5IFt0cmFpbGluZyB3aWxkY2FyZF1cbiAgICAvKF58W15cXFxcXSspKFxcXFxcXCopKyg/PS4rKS9nLFxuXG4gICAgLy8gJyouanMnIG1hdGNoZXMgJy5qcydcbiAgICAvLyAnKi5qcycgZG9lc24ndCBtYXRjaCAnYWJjJ1xuICAgIChfLCBwMSwgcDIpID0+IHtcbiAgICAgIC8vIDEuXG4gICAgICAvLyA+IEFuIGFzdGVyaXNrIFwiKlwiIG1hdGNoZXMgYW55dGhpbmcgZXhjZXB0IGEgc2xhc2guXG4gICAgICAvLyAyLlxuICAgICAgLy8gPiBPdGhlciBjb25zZWN1dGl2ZSBhc3Rlcmlza3MgYXJlIGNvbnNpZGVyZWQgcmVndWxhciBhc3Rlcmlza3NcbiAgICAgIC8vID4gYW5kIHdpbGwgbWF0Y2ggYWNjb3JkaW5nIHRvIHRoZSBwcmV2aW91cyBydWxlcy5cbiAgICAgIGNvbnN0IHVuZXNjYXBlZCA9IHAyLnJlcGxhY2UoL1xcXFxcXCovZywgJ1teXFxcXC9dKicpXG4gICAgICByZXR1cm4gcDEgKyB1bmVzY2FwZWRcbiAgICB9XG4gIF0sXG5cbiAgW1xuICAgIC8vIHVuZXNjYXBlLCByZXZlcnQgc3RlcCAzIGV4Y2VwdCBmb3IgYmFjayBzbGFzaFxuICAgIC8vIEZvciBleGFtcGxlLCBpZiBhIHVzZXIgZXNjYXBlIGEgJ1xcXFwqJyxcbiAgICAvLyBhZnRlciBzdGVwIDMsIHRoZSByZXN1bHQgd2lsbCBiZSAnXFxcXFxcXFxcXFxcKidcbiAgICAvXFxcXFxcXFxcXFxcKD89WyQufCorKCl7Xl0pL2csXG4gICAgKCkgPT4gRVNDQVBFXG4gIF0sXG5cbiAgW1xuICAgIC8vICdcXFxcXFxcXCcgLT4gJ1xcXFwnXG4gICAgL1xcXFxcXFxcL2csXG4gICAgKCkgPT4gRVNDQVBFXG4gIF0sXG5cbiAgW1xuICAgIC8vID4gVGhlIHJhbmdlIG5vdGF0aW9uLCBlLmcuIFthLXpBLVpdLFxuICAgIC8vID4gY2FuIGJlIHVzZWQgdG8gbWF0Y2ggb25lIG9mIHRoZSBjaGFyYWN0ZXJzIGluIGEgcmFuZ2UuXG5cbiAgICAvLyBgXFxgIGlzIGVzY2FwZWQgYnkgc3RlcCAzXG4gICAgLyhcXFxcKT9cXFsoW15cXF0vXSo/KShcXFxcKikoJHxcXF0pL2csXG4gICAgKG1hdGNoLCBsZWFkRXNjYXBlLCByYW5nZSwgZW5kRXNjYXBlLCBjbG9zZSkgPT4gbGVhZEVzY2FwZSA9PT0gRVNDQVBFXG4gICAgICAvLyAnXFxcXFtiYXJdJyAtPiAnXFxcXFxcXFxbYmFyXFxcXF0nXG4gICAgICA/IGBcXFxcWyR7cmFuZ2V9JHtjbGVhblJhbmdlQmFja1NsYXNoKGVuZEVzY2FwZSl9JHtjbG9zZX1gXG4gICAgICA6IGNsb3NlID09PSAnXSdcbiAgICAgICAgPyBlbmRFc2NhcGUubGVuZ3RoICUgMiA9PT0gMFxuICAgICAgICAgIC8vIEEgbm9ybWFsIGNhc2UsIGFuZCBpdCBpcyBhIHJhbmdlIG5vdGF0aW9uXG4gICAgICAgICAgLy8gJ1tiYXJdJ1xuICAgICAgICAgIC8vICdbYmFyXFxcXFxcXFxdJ1xuICAgICAgICAgID8gYFske3Nhbml0aXplUmFuZ2UocmFuZ2UpfSR7ZW5kRXNjYXBlfV1gXG4gICAgICAgICAgLy8gSW52YWxpZCByYW5nZSBub3RhdG9uXG4gICAgICAgICAgLy8gJ1tiYXJcXFxcXScgLT4gJ1tiYXJcXFxcXFxcXF0nXG4gICAgICAgICAgOiAnW10nXG4gICAgICAgIDogJ1tdJ1xuICBdLFxuXG4gIC8vIGVuZGluZ1xuICBbXG4gICAgLy8gJ2pzJyB3aWxsIG5vdCBtYXRjaCAnanMuJ1xuICAgIC8vICdhYicgd2lsbCBub3QgbWF0Y2ggJ2FiYydcbiAgICAvKD86W14qXSkkLyxcblxuICAgIC8vIFdURiFcbiAgICAvLyBodHRwczovL2dpdC1zY20uY29tL2RvY3MvZ2l0aWdub3JlXG4gICAgLy8gY2hhbmdlcyBpbiBbMi4yMi4xXShodHRwczovL2dpdC1zY20uY29tL2RvY3MvZ2l0aWdub3JlLzIuMjIuMSlcbiAgICAvLyB3aGljaCByZS1maXhlcyAjMjQsICMzOFxuXG4gICAgLy8gPiBJZiB0aGVyZSBpcyBhIHNlcGFyYXRvciBhdCB0aGUgZW5kIG9mIHRoZSBwYXR0ZXJuIHRoZW4gdGhlIHBhdHRlcm5cbiAgICAvLyA+IHdpbGwgb25seSBtYXRjaCBkaXJlY3Rvcmllcywgb3RoZXJ3aXNlIHRoZSBwYXR0ZXJuIGNhbiBtYXRjaCBib3RoXG4gICAgLy8gPiBmaWxlcyBhbmQgZGlyZWN0b3JpZXMuXG5cbiAgICAvLyAnanMqJyB3aWxsIG5vdCBtYXRjaCAnYS5qcydcbiAgICAvLyAnanMvJyB3aWxsIG5vdCBtYXRjaCAnYS5qcydcbiAgICAvLyAnanMnIHdpbGwgbWF0Y2ggJ2EuanMnIGFuZCAnYS5qcy8nXG4gICAgbWF0Y2ggPT4gL1xcLyQvLnRlc3QobWF0Y2gpXG4gICAgICAvLyBmb28vIHdpbGwgbm90IG1hdGNoICdmb28nXG4gICAgICA/IGAke21hdGNofSRgXG4gICAgICAvLyBmb28gbWF0Y2hlcyAnZm9vJyBhbmQgJ2Zvby8nXG4gICAgICA6IGAke21hdGNofSg/PSR8XFxcXC8kKWBcbiAgXSxcblxuICAvLyB0cmFpbGluZyB3aWxkY2FyZFxuICBbXG4gICAgLyhcXF58XFxcXFxcLyk/XFxcXFxcKiQvLFxuICAgIChfLCBwMSkgPT4ge1xuICAgICAgY29uc3QgcHJlZml4ID0gcDFcbiAgICAgICAgLy8gJ1xcXic6XG4gICAgICAgIC8vICcvKicgZG9lcyBub3QgbWF0Y2ggRU1QVFlcbiAgICAgICAgLy8gJy8qJyBkb2VzIG5vdCBtYXRjaCBldmVyeXRoaW5nXG5cbiAgICAgICAgLy8gJ1xcXFxcXC8nOlxuICAgICAgICAvLyAnYWJjLyonIGRvZXMgbm90IG1hdGNoICdhYmMvJ1xuICAgICAgICA/IGAke3AxfVteL10rYFxuXG4gICAgICAgIC8vICdhKicgbWF0Y2hlcyAnYSdcbiAgICAgICAgLy8gJ2EqJyBtYXRjaGVzICdhYSdcbiAgICAgICAgOiAnW14vXSonXG5cbiAgICAgIHJldHVybiBgJHtwcmVmaXh9KD89JHxcXFxcLyQpYFxuICAgIH1cbiAgXSxcbl1cblxuLy8gQSBzaW1wbGUgY2FjaGUsIGJlY2F1c2UgYW4gaWdub3JlIHJ1bGUgb25seSBoYXMgb25seSBvbmUgY2VydGFpbiBtZWFuaW5nXG5jb25zdCByZWdleENhY2hlID0gT2JqZWN0LmNyZWF0ZShudWxsKVxuXG4vLyBAcGFyYW0ge3BhdHRlcm59XG5jb25zdCBtYWtlUmVnZXggPSAocGF0dGVybiwgaWdub3JlQ2FzZSkgPT4ge1xuICBsZXQgc291cmNlID0gcmVnZXhDYWNoZVtwYXR0ZXJuXVxuXG4gIGlmICghc291cmNlKSB7XG4gICAgc291cmNlID0gUkVQTEFDRVJTLnJlZHVjZShcbiAgICAgIChwcmV2LCBjdXJyZW50KSA9PiBwcmV2LnJlcGxhY2UoY3VycmVudFswXSwgY3VycmVudFsxXS5iaW5kKHBhdHRlcm4pKSxcbiAgICAgIHBhdHRlcm5cbiAgICApXG4gICAgcmVnZXhDYWNoZVtwYXR0ZXJuXSA9IHNvdXJjZVxuICB9XG5cbiAgcmV0dXJuIGlnbm9yZUNhc2VcbiAgICA/IG5ldyBSZWdFeHAoc291cmNlLCAnaScpXG4gICAgOiBuZXcgUmVnRXhwKHNvdXJjZSlcbn1cblxuY29uc3QgaXNTdHJpbmcgPSBzdWJqZWN0ID0+IHR5cGVvZiBzdWJqZWN0ID09PSAnc3RyaW5nJ1xuXG4vLyA+IEEgYmxhbmsgbGluZSBtYXRjaGVzIG5vIGZpbGVzLCBzbyBpdCBjYW4gc2VydmUgYXMgYSBzZXBhcmF0b3IgZm9yIHJlYWRhYmlsaXR5LlxuY29uc3QgY2hlY2tQYXR0ZXJuID0gcGF0dGVybiA9PiBwYXR0ZXJuXG4gICYmIGlzU3RyaW5nKHBhdHRlcm4pXG4gICYmICFSRUdFWF9URVNUX0JMQU5LX0xJTkUudGVzdChwYXR0ZXJuKVxuICAmJiAhUkVHRVhfSU5WQUxJRF9UUkFJTElOR19CQUNLU0xBU0gudGVzdChwYXR0ZXJuKVxuXG4gIC8vID4gQSBsaW5lIHN0YXJ0aW5nIHdpdGggIyBzZXJ2ZXMgYXMgYSBjb21tZW50LlxuICAmJiBwYXR0ZXJuLmluZGV4T2YoJyMnKSAhPT0gMFxuXG5jb25zdCBzcGxpdFBhdHRlcm4gPSBwYXR0ZXJuID0+IHBhdHRlcm4uc3BsaXQoUkVHRVhfU1BMSVRBTExfQ1JMRilcblxuY2xhc3MgSWdub3JlUnVsZSB7XG4gIGNvbnN0cnVjdG9yIChcbiAgICBvcmlnaW4sXG4gICAgcGF0dGVybixcbiAgICBuZWdhdGl2ZSxcbiAgICByZWdleFxuICApIHtcbiAgICB0aGlzLm9yaWdpbiA9IG9yaWdpblxuICAgIHRoaXMucGF0dGVybiA9IHBhdHRlcm5cbiAgICB0aGlzLm5lZ2F0aXZlID0gbmVnYXRpdmVcbiAgICB0aGlzLnJlZ2V4ID0gcmVnZXhcbiAgfVxufVxuXG5jb25zdCBjcmVhdGVSdWxlID0gKHBhdHRlcm4sIGlnbm9yZUNhc2UpID0+IHtcbiAgY29uc3Qgb3JpZ2luID0gcGF0dGVyblxuICBsZXQgbmVnYXRpdmUgPSBmYWxzZVxuXG4gIC8vID4gQW4gb3B0aW9uYWwgcHJlZml4IFwiIVwiIHdoaWNoIG5lZ2F0ZXMgdGhlIHBhdHRlcm47XG4gIGlmIChwYXR0ZXJuLmluZGV4T2YoJyEnKSA9PT0gMCkge1xuICAgIG5lZ2F0aXZlID0gdHJ1ZVxuICAgIHBhdHRlcm4gPSBwYXR0ZXJuLnN1YnN0cigxKVxuICB9XG5cbiAgcGF0dGVybiA9IHBhdHRlcm5cbiAgLy8gPiBQdXQgYSBiYWNrc2xhc2ggKFwiXFxcIikgaW4gZnJvbnQgb2YgdGhlIGZpcnN0IFwiIVwiIGZvciBwYXR0ZXJucyB0aGF0XG4gIC8vID4gICBiZWdpbiB3aXRoIGEgbGl0ZXJhbCBcIiFcIiwgZm9yIGV4YW1wbGUsIGBcIlxcIWltcG9ydGFudCEudHh0XCJgLlxuICAucmVwbGFjZShSRUdFWF9SRVBMQUNFX0xFQURJTkdfRVhDQVBFRF9FWENMQU1BVElPTiwgJyEnKVxuICAvLyA+IFB1dCBhIGJhY2tzbGFzaCAoXCJcXFwiKSBpbiBmcm9udCBvZiB0aGUgZmlyc3QgaGFzaCBmb3IgcGF0dGVybnMgdGhhdFxuICAvLyA+ICAgYmVnaW4gd2l0aCBhIGhhc2guXG4gIC5yZXBsYWNlKFJFR0VYX1JFUExBQ0VfTEVBRElOR19FWENBUEVEX0hBU0gsICcjJylcblxuICBjb25zdCByZWdleCA9IG1ha2VSZWdleChwYXR0ZXJuLCBpZ25vcmVDYXNlKVxuXG4gIHJldHVybiBuZXcgSWdub3JlUnVsZShcbiAgICBvcmlnaW4sXG4gICAgcGF0dGVybixcbiAgICBuZWdhdGl2ZSxcbiAgICByZWdleFxuICApXG59XG5cbmNvbnN0IHRocm93RXJyb3IgPSAobWVzc2FnZSwgQ3RvcikgPT4ge1xuICB0aHJvdyBuZXcgQ3RvcihtZXNzYWdlKVxufVxuXG5jb25zdCBjaGVja1BhdGggPSAocGF0aCwgb3JpZ2luYWxQYXRoLCBkb1Rocm93KSA9PiB7XG4gIGlmICghaXNTdHJpbmcocGF0aCkpIHtcbiAgICByZXR1cm4gZG9UaHJvdyhcbiAgICAgIGBwYXRoIG11c3QgYmUgYSBzdHJpbmcsIGJ1dCBnb3QgXFxgJHtvcmlnaW5hbFBhdGh9XFxgYCxcbiAgICAgIFR5cGVFcnJvclxuICAgIClcbiAgfVxuXG4gIC8vIFdlIGRvbid0IGtub3cgaWYgd2Ugc2hvdWxkIGlnbm9yZSBFTVBUWSwgc28gdGhyb3dcbiAgaWYgKCFwYXRoKSB7XG4gICAgcmV0dXJuIGRvVGhyb3coYHBhdGggbXVzdCBub3QgYmUgZW1wdHlgLCBUeXBlRXJyb3IpXG4gIH1cblxuICAvLyBDaGVjayBpZiBpdCBpcyBhIHJlbGF0aXZlIHBhdGhcbiAgaWYgKGNoZWNrUGF0aC5pc05vdFJlbGF0aXZlKHBhdGgpKSB7XG4gICAgY29uc3QgciA9ICdgcGF0aC5yZWxhdGl2ZSgpYGQnXG4gICAgcmV0dXJuIGRvVGhyb3coXG4gICAgICBgcGF0aCBzaG91bGQgYmUgYSAke3J9IHN0cmluZywgYnV0IGdvdCBcIiR7b3JpZ2luYWxQYXRofVwiYCxcbiAgICAgIFJhbmdlRXJyb3JcbiAgICApXG4gIH1cblxuICByZXR1cm4gdHJ1ZVxufVxuXG5jb25zdCBpc05vdFJlbGF0aXZlID0gcGF0aCA9PiBSRUdFWF9URVNUX0lOVkFMSURfUEFUSC50ZXN0KHBhdGgpXG5cbmNoZWNrUGF0aC5pc05vdFJlbGF0aXZlID0gaXNOb3RSZWxhdGl2ZVxuY2hlY2tQYXRoLmNvbnZlcnQgPSBwID0+IHBcblxuY2xhc3MgSWdub3JlIHtcbiAgY29uc3RydWN0b3IgKHtcbiAgICBpZ25vcmVjYXNlID0gdHJ1ZSxcbiAgICBpZ25vcmVDYXNlID0gaWdub3JlY2FzZSxcbiAgICBhbGxvd1JlbGF0aXZlUGF0aHMgPSBmYWxzZVxuICB9ID0ge30pIHtcbiAgICBkZWZpbmUodGhpcywgS0VZX0lHTk9SRSwgdHJ1ZSlcblxuICAgIHRoaXMuX3J1bGVzID0gW11cbiAgICB0aGlzLl9pZ25vcmVDYXNlID0gaWdub3JlQ2FzZVxuICAgIHRoaXMuX2FsbG93UmVsYXRpdmVQYXRocyA9IGFsbG93UmVsYXRpdmVQYXRoc1xuICAgIHRoaXMuX2luaXRDYWNoZSgpXG4gIH1cblxuICBfaW5pdENhY2hlICgpIHtcbiAgICB0aGlzLl9pZ25vcmVDYWNoZSA9IE9iamVjdC5jcmVhdGUobnVsbClcbiAgICB0aGlzLl90ZXN0Q2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpXG4gIH1cblxuICBfYWRkUGF0dGVybiAocGF0dGVybikge1xuICAgIC8vICMzMlxuICAgIGlmIChwYXR0ZXJuICYmIHBhdHRlcm5bS0VZX0lHTk9SRV0pIHtcbiAgICAgIHRoaXMuX3J1bGVzID0gdGhpcy5fcnVsZXMuY29uY2F0KHBhdHRlcm4uX3J1bGVzKVxuICAgICAgdGhpcy5fYWRkZWQgPSB0cnVlXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoY2hlY2tQYXR0ZXJuKHBhdHRlcm4pKSB7XG4gICAgICBjb25zdCBydWxlID0gY3JlYXRlUnVsZShwYXR0ZXJuLCB0aGlzLl9pZ25vcmVDYXNlKVxuICAgICAgdGhpcy5fYWRkZWQgPSB0cnVlXG4gICAgICB0aGlzLl9ydWxlcy5wdXNoKHJ1bGUpXG4gICAgfVxuICB9XG5cbiAgLy8gQHBhcmFtIHtBcnJheTxzdHJpbmc+IHwgc3RyaW5nIHwgSWdub3JlfSBwYXR0ZXJuXG4gIGFkZCAocGF0dGVybikge1xuICAgIHRoaXMuX2FkZGVkID0gZmFsc2VcblxuICAgIG1ha2VBcnJheShcbiAgICAgIGlzU3RyaW5nKHBhdHRlcm4pXG4gICAgICAgID8gc3BsaXRQYXR0ZXJuKHBhdHRlcm4pXG4gICAgICAgIDogcGF0dGVyblxuICAgICkuZm9yRWFjaCh0aGlzLl9hZGRQYXR0ZXJuLCB0aGlzKVxuXG4gICAgLy8gU29tZSBydWxlcyBoYXZlIGp1c3QgYWRkZWQgdG8gdGhlIGlnbm9yZSxcbiAgICAvLyBtYWtpbmcgdGhlIGJlaGF2aW9yIGNoYW5nZWQuXG4gICAgaWYgKHRoaXMuX2FkZGVkKSB7XG4gICAgICB0aGlzLl9pbml0Q2FjaGUoKVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICAvLyBsZWdhY3lcbiAgYWRkUGF0dGVybiAocGF0dGVybikge1xuICAgIHJldHVybiB0aGlzLmFkZChwYXR0ZXJuKVxuICB9XG5cbiAgLy8gICAgICAgICAgfCAgICAgICAgICAgaWdub3JlZCA6IHVuaWdub3JlZFxuICAvLyBuZWdhdGl2ZSB8ICAgMDowICAgfCAgIDA6MSAgIHwgICAxOjAgICB8ICAgMToxXG4gIC8vIC0tLS0tLS0tIHwgLS0tLS0tLSB8IC0tLS0tLS0gfCAtLS0tLS0tIHwgLS0tLS0tLS1cbiAgLy8gICAgIDAgICAgfCAgVEVTVCAgIHwgIFRFU1QgICB8ICBTS0lQICAgfCAgICBYXG4gIC8vICAgICAxICAgIHwgIFRFU1RJRiB8ICBTS0lQICAgfCAgVEVTVCAgIHwgICAgWFxuXG4gIC8vIC0gU0tJUDogYWx3YXlzIHNraXBcbiAgLy8gLSBURVNUOiBhbHdheXMgdGVzdFxuICAvLyAtIFRFU1RJRjogb25seSB0ZXN0IGlmIGNoZWNrVW5pZ25vcmVkXG4gIC8vIC0gWDogdGhhdCBuZXZlciBoYXBwZW5cblxuICAvLyBAcGFyYW0ge2Jvb2xlYW59IHdoZXRoZXIgc2hvdWxkIGNoZWNrIGlmIHRoZSBwYXRoIGlzIHVuaWdub3JlZCxcbiAgLy8gICBzZXR0aW5nIGBjaGVja1VuaWdub3JlZGAgdG8gYGZhbHNlYCBjb3VsZCByZWR1Y2UgYWRkaXRpb25hbFxuICAvLyAgIHBhdGggbWF0Y2hpbmcuXG5cbiAgLy8gQHJldHVybnMge1Rlc3RSZXN1bHR9IHRydWUgaWYgYSBmaWxlIGlzIGlnbm9yZWRcbiAgX3Rlc3RPbmUgKHBhdGgsIGNoZWNrVW5pZ25vcmVkKSB7XG4gICAgbGV0IGlnbm9yZWQgPSBmYWxzZVxuICAgIGxldCB1bmlnbm9yZWQgPSBmYWxzZVxuXG4gICAgdGhpcy5fcnVsZXMuZm9yRWFjaChydWxlID0+IHtcbiAgICAgIGNvbnN0IHtuZWdhdGl2ZX0gPSBydWxlXG4gICAgICBpZiAoXG4gICAgICAgIHVuaWdub3JlZCA9PT0gbmVnYXRpdmUgJiYgaWdub3JlZCAhPT0gdW5pZ25vcmVkXG4gICAgICAgIHx8IG5lZ2F0aXZlICYmICFpZ25vcmVkICYmICF1bmlnbm9yZWQgJiYgIWNoZWNrVW5pZ25vcmVkXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG1hdGNoZWQgPSBydWxlLnJlZ2V4LnRlc3QocGF0aClcblxuICAgICAgaWYgKG1hdGNoZWQpIHtcbiAgICAgICAgaWdub3JlZCA9ICFuZWdhdGl2ZVxuICAgICAgICB1bmlnbm9yZWQgPSBuZWdhdGl2ZVxuICAgICAgfVxuICAgIH0pXG5cbiAgICByZXR1cm4ge1xuICAgICAgaWdub3JlZCxcbiAgICAgIHVuaWdub3JlZFxuICAgIH1cbiAgfVxuXG4gIC8vIEByZXR1cm5zIHtUZXN0UmVzdWx0fVxuICBfdGVzdCAob3JpZ2luYWxQYXRoLCBjYWNoZSwgY2hlY2tVbmlnbm9yZWQsIHNsaWNlcykge1xuICAgIGNvbnN0IHBhdGggPSBvcmlnaW5hbFBhdGhcbiAgICAgIC8vIFN1cHBvcnRzIG51bGxhYmxlIHBhdGhcbiAgICAgICYmIGNoZWNrUGF0aC5jb252ZXJ0KG9yaWdpbmFsUGF0aClcblxuICAgIGNoZWNrUGF0aChcbiAgICAgIHBhdGgsXG4gICAgICBvcmlnaW5hbFBhdGgsXG4gICAgICB0aGlzLl9hbGxvd1JlbGF0aXZlUGF0aHNcbiAgICAgICAgPyBSRVRVUk5fRkFMU0VcbiAgICAgICAgOiB0aHJvd0Vycm9yXG4gICAgKVxuXG4gICAgcmV0dXJuIHRoaXMuX3QocGF0aCwgY2FjaGUsIGNoZWNrVW5pZ25vcmVkLCBzbGljZXMpXG4gIH1cblxuICBfdCAocGF0aCwgY2FjaGUsIGNoZWNrVW5pZ25vcmVkLCBzbGljZXMpIHtcbiAgICBpZiAocGF0aCBpbiBjYWNoZSkge1xuICAgICAgcmV0dXJuIGNhY2hlW3BhdGhdXG4gICAgfVxuXG4gICAgaWYgKCFzbGljZXMpIHtcbiAgICAgIC8vIHBhdGgvdG8vYS5qc1xuICAgICAgLy8gWydwYXRoJywgJ3RvJywgJ2EuanMnXVxuICAgICAgc2xpY2VzID0gcGF0aC5zcGxpdChTTEFTSClcbiAgICB9XG5cbiAgICBzbGljZXMucG9wKClcblxuICAgIC8vIElmIHRoZSBwYXRoIGhhcyBubyBwYXJlbnQgZGlyZWN0b3J5LCBqdXN0IHRlc3QgaXRcbiAgICBpZiAoIXNsaWNlcy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBjYWNoZVtwYXRoXSA9IHRoaXMuX3Rlc3RPbmUocGF0aCwgY2hlY2tVbmlnbm9yZWQpXG4gICAgfVxuXG4gICAgY29uc3QgcGFyZW50ID0gdGhpcy5fdChcbiAgICAgIHNsaWNlcy5qb2luKFNMQVNIKSArIFNMQVNILFxuICAgICAgY2FjaGUsXG4gICAgICBjaGVja1VuaWdub3JlZCxcbiAgICAgIHNsaWNlc1xuICAgIClcblxuICAgIC8vIElmIHRoZSBwYXRoIGNvbnRhaW5zIGEgcGFyZW50IGRpcmVjdG9yeSwgY2hlY2sgdGhlIHBhcmVudCBmaXJzdFxuICAgIHJldHVybiBjYWNoZVtwYXRoXSA9IHBhcmVudC5pZ25vcmVkXG4gICAgICAvLyA+IEl0IGlzIG5vdCBwb3NzaWJsZSB0byByZS1pbmNsdWRlIGEgZmlsZSBpZiBhIHBhcmVudCBkaXJlY3Rvcnkgb2ZcbiAgICAgIC8vID4gICB0aGF0IGZpbGUgaXMgZXhjbHVkZWQuXG4gICAgICA/IHBhcmVudFxuICAgICAgOiB0aGlzLl90ZXN0T25lKHBhdGgsIGNoZWNrVW5pZ25vcmVkKVxuICB9XG5cbiAgaWdub3JlcyAocGF0aCkge1xuICAgIHJldHVybiB0aGlzLl90ZXN0KHBhdGgsIHRoaXMuX2lnbm9yZUNhY2hlLCBmYWxzZSkuaWdub3JlZFxuICB9XG5cbiAgY3JlYXRlRmlsdGVyICgpIHtcbiAgICByZXR1cm4gcGF0aCA9PiAhdGhpcy5pZ25vcmVzKHBhdGgpXG4gIH1cblxuICBmaWx0ZXIgKHBhdGhzKSB7XG4gICAgcmV0dXJuIG1ha2VBcnJheShwYXRocykuZmlsdGVyKHRoaXMuY3JlYXRlRmlsdGVyKCkpXG4gIH1cblxuICAvLyBAcmV0dXJucyB7VGVzdFJlc3VsdH1cbiAgdGVzdCAocGF0aCkge1xuICAgIHJldHVybiB0aGlzLl90ZXN0KHBhdGgsIHRoaXMuX3Rlc3RDYWNoZSwgdHJ1ZSlcbiAgfVxufVxuXG5jb25zdCBmYWN0b3J5ID0gb3B0aW9ucyA9PiBuZXcgSWdub3JlKG9wdGlvbnMpXG5cbmNvbnN0IGlzUGF0aFZhbGlkID0gcGF0aCA9PlxuICBjaGVja1BhdGgocGF0aCAmJiBjaGVja1BhdGguY29udmVydChwYXRoKSwgcGF0aCwgUkVUVVJOX0ZBTFNFKVxuXG5mYWN0b3J5LmlzUGF0aFZhbGlkID0gaXNQYXRoVmFsaWRcblxuLy8gRml4ZXMgdHlwZXNjcmlwdFxuZmFjdG9yeS5kZWZhdWx0ID0gZmFjdG9yeVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnlcblxuLy8gV2luZG93c1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuaWYgKFxuICAvLyBEZXRlY3QgYHByb2Nlc3NgIHNvIHRoYXQgaXQgY2FuIHJ1biBpbiBicm93c2Vycy5cbiAgdHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnXG4gICYmIChcbiAgICBwcm9jZXNzLmVudiAmJiBwcm9jZXNzLmVudi5JR05PUkVfVEVTVF9XSU4zMlxuICAgIHx8IHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMidcbiAgKVxuKSB7XG4gIC8qIGVzbGludCBuby1jb250cm9sLXJlZ2V4OiBcIm9mZlwiICovXG4gIGNvbnN0IG1ha2VQb3NpeCA9IHN0ciA9PiAvXlxcXFxcXFxcXFw/XFxcXC8udGVzdChzdHIpXG4gIHx8IC9bXCI8PnxcXHUwMDAwLVxcdTAwMUZdKy91LnRlc3Qoc3RyKVxuICAgID8gc3RyXG4gICAgOiBzdHIucmVwbGFjZSgvXFxcXC9nLCAnLycpXG5cbiAgY2hlY2tQYXRoLmNvbnZlcnQgPSBtYWtlUG9zaXhcblxuICAvLyAnQzpcXFxcZm9vJyAgICAgPC0gJ0M6XFxcXGZvbycgaGFzIGJlZW4gY29udmVydGVkIHRvICdDOi8nXG4gIC8vICdkOlxcXFxmb28nXG4gIGNvbnN0IFJFR0lYX0lTX1dJTkRPV1NfUEFUSF9BQlNPTFVURSA9IC9eW2Etel06XFwvL2lcbiAgY2hlY2tQYXRoLmlzTm90UmVsYXRpdmUgPSBwYXRoID0+XG4gICAgUkVHSVhfSVNfV0lORE9XU19QQVRIX0FCU09MVVRFLnRlc3QocGF0aClcbiAgICB8fCBpc05vdFJlbGF0aXZlKHBhdGgpXG59XG4iLCAiJ3VzZSBzdHJpY3QnO1xubW9kdWxlLmV4cG9ydHMgPSBwYXRoID0+IHtcblx0Y29uc3QgaXNFeHRlbmRlZExlbmd0aFBhdGggPSAvXlxcXFxcXFxcXFw/XFxcXC8udGVzdChwYXRoKTtcblx0Y29uc3QgaGFzTm9uQXNjaWkgPSAvW15cXHUwMDAwLVxcdTAwODBdKy8udGVzdChwYXRoKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1jb250cm9sLXJlZ2V4XG5cblx0aWYgKGlzRXh0ZW5kZWRMZW5ndGhQYXRoIHx8IGhhc05vbkFzY2lpKSB7XG5cdFx0cmV0dXJuIHBhdGg7XG5cdH1cblxuXHRyZXR1cm4gcGF0aC5yZXBsYWNlKC9cXFxcL2csICcvJyk7XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcbmNvbnN0IHtwcm9taXNpZnl9ID0gcmVxdWlyZSgndXRpbCcpO1xuY29uc3QgZnMgPSByZXF1aXJlKCdmcycpO1xuY29uc3QgcGF0aCA9IHJlcXVpcmUoJ3BhdGgnKTtcbmNvbnN0IGZhc3RHbG9iID0gcmVxdWlyZSgnZmFzdC1nbG9iJyk7XG5jb25zdCBnaXRJZ25vcmUgPSByZXF1aXJlKCdpZ25vcmUnKTtcbmNvbnN0IHNsYXNoID0gcmVxdWlyZSgnc2xhc2gnKTtcblxuY29uc3QgREVGQVVMVF9JR05PUkUgPSBbXG5cdCcqKi9ub2RlX21vZHVsZXMvKionLFxuXHQnKiovZmxvdy10eXBlZC8qKicsXG5cdCcqKi9jb3ZlcmFnZS8qKicsXG5cdCcqKi8uZ2l0J1xuXTtcblxuY29uc3QgcmVhZEZpbGVQID0gcHJvbWlzaWZ5KGZzLnJlYWRGaWxlKTtcblxuY29uc3QgbWFwR2l0SWdub3JlUGF0dGVyblRvID0gYmFzZSA9PiBpZ25vcmUgPT4ge1xuXHRpZiAoaWdub3JlLnN0YXJ0c1dpdGgoJyEnKSkge1xuXHRcdHJldHVybiAnIScgKyBwYXRoLnBvc2l4LmpvaW4oYmFzZSwgaWdub3JlLnNsaWNlKDEpKTtcblx0fVxuXG5cdHJldHVybiBwYXRoLnBvc2l4LmpvaW4oYmFzZSwgaWdub3JlKTtcbn07XG5cbmNvbnN0IHBhcnNlR2l0SWdub3JlID0gKGNvbnRlbnQsIG9wdGlvbnMpID0+IHtcblx0Y29uc3QgYmFzZSA9IHNsYXNoKHBhdGgucmVsYXRpdmUob3B0aW9ucy5jd2QsIHBhdGguZGlybmFtZShvcHRpb25zLmZpbGVOYW1lKSkpO1xuXG5cdHJldHVybiBjb250ZW50XG5cdFx0LnNwbGl0KC9cXHI/XFxuLylcblx0XHQuZmlsdGVyKEJvb2xlYW4pXG5cdFx0LmZpbHRlcihsaW5lID0+ICFsaW5lLnN0YXJ0c1dpdGgoJyMnKSlcblx0XHQubWFwKG1hcEdpdElnbm9yZVBhdHRlcm5UbyhiYXNlKSk7XG59O1xuXG5jb25zdCByZWR1Y2VJZ25vcmUgPSBmaWxlcyA9PiB7XG5cdGNvbnN0IGlnbm9yZXMgPSBnaXRJZ25vcmUoKTtcblx0Zm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG5cdFx0aWdub3Jlcy5hZGQocGFyc2VHaXRJZ25vcmUoZmlsZS5jb250ZW50LCB7XG5cdFx0XHRjd2Q6IGZpbGUuY3dkLFxuXHRcdFx0ZmlsZU5hbWU6IGZpbGUuZmlsZVBhdGhcblx0XHR9KSk7XG5cdH1cblxuXHRyZXR1cm4gaWdub3Jlcztcbn07XG5cbmNvbnN0IGVuc3VyZUFic29sdXRlUGF0aEZvckN3ZCA9IChjd2QsIHApID0+IHtcblx0Y3dkID0gc2xhc2goY3dkKTtcblx0aWYgKHBhdGguaXNBYnNvbHV0ZShwKSkge1xuXHRcdGlmIChzbGFzaChwKS5zdGFydHNXaXRoKGN3ZCkpIHtcblx0XHRcdHJldHVybiBwO1xuXHRcdH1cblxuXHRcdHRocm93IG5ldyBFcnJvcihgUGF0aCAke3B9IGlzIG5vdCBpbiBjd2QgJHtjd2R9YCk7XG5cdH1cblxuXHRyZXR1cm4gcGF0aC5qb2luKGN3ZCwgcCk7XG59O1xuXG5jb25zdCBnZXRJc0lnbm9yZWRQcmVkZWNhdGUgPSAoaWdub3JlcywgY3dkKSA9PiB7XG5cdHJldHVybiBwID0+IGlnbm9yZXMuaWdub3JlcyhzbGFzaChwYXRoLnJlbGF0aXZlKGN3ZCwgZW5zdXJlQWJzb2x1dGVQYXRoRm9yQ3dkKGN3ZCwgcC5wYXRoIHx8IHApKSkpO1xufTtcblxuY29uc3QgZ2V0RmlsZSA9IGFzeW5jIChmaWxlLCBjd2QpID0+IHtcblx0Y29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4oY3dkLCBmaWxlKTtcblx0Y29uc3QgY29udGVudCA9IGF3YWl0IHJlYWRGaWxlUChmaWxlUGF0aCwgJ3V0ZjgnKTtcblxuXHRyZXR1cm4ge1xuXHRcdGN3ZCxcblx0XHRmaWxlUGF0aCxcblx0XHRjb250ZW50XG5cdH07XG59O1xuXG5jb25zdCBnZXRGaWxlU3luYyA9IChmaWxlLCBjd2QpID0+IHtcblx0Y29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4oY3dkLCBmaWxlKTtcblx0Y29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhmaWxlUGF0aCwgJ3V0ZjgnKTtcblxuXHRyZXR1cm4ge1xuXHRcdGN3ZCxcblx0XHRmaWxlUGF0aCxcblx0XHRjb250ZW50XG5cdH07XG59O1xuXG5jb25zdCBub3JtYWxpemVPcHRpb25zID0gKHtcblx0aWdub3JlID0gW10sXG5cdGN3ZCA9IHNsYXNoKHByb2Nlc3MuY3dkKCkpXG59ID0ge30pID0+IHtcblx0cmV0dXJuIHtpZ25vcmUsIGN3ZH07XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGFzeW5jIG9wdGlvbnMgPT4ge1xuXHRvcHRpb25zID0gbm9ybWFsaXplT3B0aW9ucyhvcHRpb25zKTtcblxuXHRjb25zdCBwYXRocyA9IGF3YWl0IGZhc3RHbG9iKCcqKi8uZ2l0aWdub3JlJywge1xuXHRcdGlnbm9yZTogREVGQVVMVF9JR05PUkUuY29uY2F0KG9wdGlvbnMuaWdub3JlKSxcblx0XHRjd2Q6IG9wdGlvbnMuY3dkXG5cdH0pO1xuXG5cdGNvbnN0IGZpbGVzID0gYXdhaXQgUHJvbWlzZS5hbGwocGF0aHMubWFwKGZpbGUgPT4gZ2V0RmlsZShmaWxlLCBvcHRpb25zLmN3ZCkpKTtcblx0Y29uc3QgaWdub3JlcyA9IHJlZHVjZUlnbm9yZShmaWxlcyk7XG5cblx0cmV0dXJuIGdldElzSWdub3JlZFByZWRlY2F0ZShpZ25vcmVzLCBvcHRpb25zLmN3ZCk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cy5zeW5jID0gb3B0aW9ucyA9PiB7XG5cdG9wdGlvbnMgPSBub3JtYWxpemVPcHRpb25zKG9wdGlvbnMpO1xuXG5cdGNvbnN0IHBhdGhzID0gZmFzdEdsb2Iuc3luYygnKiovLmdpdGlnbm9yZScsIHtcblx0XHRpZ25vcmU6IERFRkFVTFRfSUdOT1JFLmNvbmNhdChvcHRpb25zLmlnbm9yZSksXG5cdFx0Y3dkOiBvcHRpb25zLmN3ZFxuXHR9KTtcblxuXHRjb25zdCBmaWxlcyA9IHBhdGhzLm1hcChmaWxlID0+IGdldEZpbGVTeW5jKGZpbGUsIG9wdGlvbnMuY3dkKSk7XG5cdGNvbnN0IGlnbm9yZXMgPSByZWR1Y2VJZ25vcmUoZmlsZXMpO1xuXG5cdHJldHVybiBnZXRJc0lnbm9yZWRQcmVkZWNhdGUoaWdub3Jlcywgb3B0aW9ucy5jd2QpO1xufTtcbiIsICIndXNlIHN0cmljdCc7XG5jb25zdCB7VHJhbnNmb3JtfSA9IHJlcXVpcmUoJ3N0cmVhbScpO1xuXG5jbGFzcyBPYmplY3RUcmFuc2Zvcm0gZXh0ZW5kcyBUcmFuc2Zvcm0ge1xuXHRjb25zdHJ1Y3RvcigpIHtcblx0XHRzdXBlcih7XG5cdFx0XHRvYmplY3RNb2RlOiB0cnVlXG5cdFx0fSk7XG5cdH1cbn1cblxuY2xhc3MgRmlsdGVyU3RyZWFtIGV4dGVuZHMgT2JqZWN0VHJhbnNmb3JtIHtcblx0Y29uc3RydWN0b3IoZmlsdGVyKSB7XG5cdFx0c3VwZXIoKTtcblx0XHR0aGlzLl9maWx0ZXIgPSBmaWx0ZXI7XG5cdH1cblxuXHRfdHJhbnNmb3JtKGRhdGEsIGVuY29kaW5nLCBjYWxsYmFjaykge1xuXHRcdGlmICh0aGlzLl9maWx0ZXIoZGF0YSkpIHtcblx0XHRcdHRoaXMucHVzaChkYXRhKTtcblx0XHR9XG5cblx0XHRjYWxsYmFjaygpO1xuXHR9XG59XG5cbmNsYXNzIFVuaXF1ZVN0cmVhbSBleHRlbmRzIE9iamVjdFRyYW5zZm9ybSB7XG5cdGNvbnN0cnVjdG9yKCkge1xuXHRcdHN1cGVyKCk7XG5cdFx0dGhpcy5fcHVzaGVkID0gbmV3IFNldCgpO1xuXHR9XG5cblx0X3RyYW5zZm9ybShkYXRhLCBlbmNvZGluZywgY2FsbGJhY2spIHtcblx0XHRpZiAoIXRoaXMuX3B1c2hlZC5oYXMoZGF0YSkpIHtcblx0XHRcdHRoaXMucHVzaChkYXRhKTtcblx0XHRcdHRoaXMuX3B1c2hlZC5hZGQoZGF0YSk7XG5cdFx0fVxuXG5cdFx0Y2FsbGJhY2soKTtcblx0fVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcblx0RmlsdGVyU3RyZWFtLFxuXHRVbmlxdWVTdHJlYW1cbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xuY29uc3QgZnMgPSByZXF1aXJlKCdmcycpO1xuY29uc3QgYXJyYXlVbmlvbiA9IHJlcXVpcmUoJ2FycmF5LXVuaW9uJyk7XG5jb25zdCBtZXJnZTIgPSByZXF1aXJlKCdtZXJnZTInKTtcbmNvbnN0IGZhc3RHbG9iID0gcmVxdWlyZSgnZmFzdC1nbG9iJyk7XG5jb25zdCBkaXJHbG9iID0gcmVxdWlyZSgnZGlyLWdsb2InKTtcbmNvbnN0IGdpdGlnbm9yZSA9IHJlcXVpcmUoJy4vZ2l0aWdub3JlJyk7XG5jb25zdCB7RmlsdGVyU3RyZWFtLCBVbmlxdWVTdHJlYW19ID0gcmVxdWlyZSgnLi9zdHJlYW0tdXRpbHMnKTtcblxuY29uc3QgREVGQVVMVF9GSUxURVIgPSAoKSA9PiBmYWxzZTtcblxuY29uc3QgaXNOZWdhdGl2ZSA9IHBhdHRlcm4gPT4gcGF0dGVyblswXSA9PT0gJyEnO1xuXG5jb25zdCBhc3NlcnRQYXR0ZXJuc0lucHV0ID0gcGF0dGVybnMgPT4ge1xuXHRpZiAoIXBhdHRlcm5zLmV2ZXJ5KHBhdHRlcm4gPT4gdHlwZW9mIHBhdHRlcm4gPT09ICdzdHJpbmcnKSkge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ1BhdHRlcm5zIG11c3QgYmUgYSBzdHJpbmcgb3IgYW4gYXJyYXkgb2Ygc3RyaW5ncycpO1xuXHR9XG59O1xuXG5jb25zdCBjaGVja0N3ZE9wdGlvbiA9IChvcHRpb25zID0ge30pID0+IHtcblx0aWYgKCFvcHRpb25zLmN3ZCkge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdGxldCBzdGF0O1xuXHR0cnkge1xuXHRcdHN0YXQgPSBmcy5zdGF0U3luYyhvcHRpb25zLmN3ZCk7XG5cdH0gY2F0Y2gge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdGlmICghc3RhdC5pc0RpcmVjdG9yeSgpKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCdUaGUgYGN3ZGAgb3B0aW9uIG11c3QgYmUgYSBwYXRoIHRvIGEgZGlyZWN0b3J5Jyk7XG5cdH1cbn07XG5cbmNvbnN0IGdldFBhdGhTdHJpbmcgPSBwID0+IHAuc3RhdHMgaW5zdGFuY2VvZiBmcy5TdGF0cyA/IHAucGF0aCA6IHA7XG5cbmNvbnN0IGdlbmVyYXRlR2xvYlRhc2tzID0gKHBhdHRlcm5zLCB0YXNrT3B0aW9ucykgPT4ge1xuXHRwYXR0ZXJucyA9IGFycmF5VW5pb24oW10uY29uY2F0KHBhdHRlcm5zKSk7XG5cdGFzc2VydFBhdHRlcm5zSW5wdXQocGF0dGVybnMpO1xuXHRjaGVja0N3ZE9wdGlvbih0YXNrT3B0aW9ucyk7XG5cblx0Y29uc3QgZ2xvYlRhc2tzID0gW107XG5cblx0dGFza09wdGlvbnMgPSB7XG5cdFx0aWdub3JlOiBbXSxcblx0XHRleHBhbmREaXJlY3RvcmllczogdHJ1ZSxcblx0XHQuLi50YXNrT3B0aW9uc1xuXHR9O1xuXG5cdGZvciAoY29uc3QgW2luZGV4LCBwYXR0ZXJuXSBvZiBwYXR0ZXJucy5lbnRyaWVzKCkpIHtcblx0XHRpZiAoaXNOZWdhdGl2ZShwYXR0ZXJuKSkge1xuXHRcdFx0Y29udGludWU7XG5cdFx0fVxuXG5cdFx0Y29uc3QgaWdub3JlID0gcGF0dGVybnNcblx0XHRcdC5zbGljZShpbmRleClcblx0XHRcdC5maWx0ZXIocGF0dGVybiA9PiBpc05lZ2F0aXZlKHBhdHRlcm4pKVxuXHRcdFx0Lm1hcChwYXR0ZXJuID0+IHBhdHRlcm4uc2xpY2UoMSkpO1xuXG5cdFx0Y29uc3Qgb3B0aW9ucyA9IHtcblx0XHRcdC4uLnRhc2tPcHRpb25zLFxuXHRcdFx0aWdub3JlOiB0YXNrT3B0aW9ucy5pZ25vcmUuY29uY2F0KGlnbm9yZSlcblx0XHR9O1xuXG5cdFx0Z2xvYlRhc2tzLnB1c2goe3BhdHRlcm4sIG9wdGlvbnN9KTtcblx0fVxuXG5cdHJldHVybiBnbG9iVGFza3M7XG59O1xuXG5jb25zdCBnbG9iRGlycyA9ICh0YXNrLCBmbikgPT4ge1xuXHRsZXQgb3B0aW9ucyA9IHt9O1xuXHRpZiAodGFzay5vcHRpb25zLmN3ZCkge1xuXHRcdG9wdGlvbnMuY3dkID0gdGFzay5vcHRpb25zLmN3ZDtcblx0fVxuXG5cdGlmIChBcnJheS5pc0FycmF5KHRhc2sub3B0aW9ucy5leHBhbmREaXJlY3RvcmllcykpIHtcblx0XHRvcHRpb25zID0ge1xuXHRcdFx0Li4ub3B0aW9ucyxcblx0XHRcdGZpbGVzOiB0YXNrLm9wdGlvbnMuZXhwYW5kRGlyZWN0b3JpZXNcblx0XHR9O1xuXHR9IGVsc2UgaWYgKHR5cGVvZiB0YXNrLm9wdGlvbnMuZXhwYW5kRGlyZWN0b3JpZXMgPT09ICdvYmplY3QnKSB7XG5cdFx0b3B0aW9ucyA9IHtcblx0XHRcdC4uLm9wdGlvbnMsXG5cdFx0XHQuLi50YXNrLm9wdGlvbnMuZXhwYW5kRGlyZWN0b3JpZXNcblx0XHR9O1xuXHR9XG5cblx0cmV0dXJuIGZuKHRhc2sucGF0dGVybiwgb3B0aW9ucyk7XG59O1xuXG5jb25zdCBnZXRQYXR0ZXJuID0gKHRhc2ssIGZuKSA9PiB0YXNrLm9wdGlvbnMuZXhwYW5kRGlyZWN0b3JpZXMgPyBnbG9iRGlycyh0YXNrLCBmbikgOiBbdGFzay5wYXR0ZXJuXTtcblxuY29uc3QgZ2V0RmlsdGVyU3luYyA9IG9wdGlvbnMgPT4ge1xuXHRyZXR1cm4gb3B0aW9ucyAmJiBvcHRpb25zLmdpdGlnbm9yZSA/XG5cdFx0Z2l0aWdub3JlLnN5bmMoe2N3ZDogb3B0aW9ucy5jd2QsIGlnbm9yZTogb3B0aW9ucy5pZ25vcmV9KSA6XG5cdFx0REVGQVVMVF9GSUxURVI7XG59O1xuXG5jb25zdCBnbG9iVG9UYXNrID0gdGFzayA9PiBnbG9iID0+IHtcblx0Y29uc3Qge29wdGlvbnN9ID0gdGFzaztcblx0aWYgKG9wdGlvbnMuaWdub3JlICYmIEFycmF5LmlzQXJyYXkob3B0aW9ucy5pZ25vcmUpICYmIG9wdGlvbnMuZXhwYW5kRGlyZWN0b3JpZXMpIHtcblx0XHRvcHRpb25zLmlnbm9yZSA9IGRpckdsb2Iuc3luYyhvcHRpb25zLmlnbm9yZSk7XG5cdH1cblxuXHRyZXR1cm4ge1xuXHRcdHBhdHRlcm46IGdsb2IsXG5cdFx0b3B0aW9uc1xuXHR9O1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBhc3luYyAocGF0dGVybnMsIG9wdGlvbnMpID0+IHtcblx0Y29uc3QgZ2xvYlRhc2tzID0gZ2VuZXJhdGVHbG9iVGFza3MocGF0dGVybnMsIG9wdGlvbnMpO1xuXG5cdGNvbnN0IGdldEZpbHRlciA9IGFzeW5jICgpID0+IHtcblx0XHRyZXR1cm4gb3B0aW9ucyAmJiBvcHRpb25zLmdpdGlnbm9yZSA/XG5cdFx0XHRnaXRpZ25vcmUoe2N3ZDogb3B0aW9ucy5jd2QsIGlnbm9yZTogb3B0aW9ucy5pZ25vcmV9KSA6XG5cdFx0XHRERUZBVUxUX0ZJTFRFUjtcblx0fTtcblxuXHRjb25zdCBnZXRUYXNrcyA9IGFzeW5jICgpID0+IHtcblx0XHRjb25zdCB0YXNrcyA9IGF3YWl0IFByb21pc2UuYWxsKGdsb2JUYXNrcy5tYXAoYXN5bmMgdGFzayA9PiB7XG5cdFx0XHRjb25zdCBnbG9icyA9IGF3YWl0IGdldFBhdHRlcm4odGFzaywgZGlyR2xvYik7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5hbGwoZ2xvYnMubWFwKGdsb2JUb1Rhc2sodGFzaykpKTtcblx0XHR9KSk7XG5cblx0XHRyZXR1cm4gYXJyYXlVbmlvbiguLi50YXNrcyk7XG5cdH07XG5cblx0Y29uc3QgW2ZpbHRlciwgdGFza3NdID0gYXdhaXQgUHJvbWlzZS5hbGwoW2dldEZpbHRlcigpLCBnZXRUYXNrcygpXSk7XG5cdGNvbnN0IHBhdGhzID0gYXdhaXQgUHJvbWlzZS5hbGwodGFza3MubWFwKHRhc2sgPT4gZmFzdEdsb2IodGFzay5wYXR0ZXJuLCB0YXNrLm9wdGlvbnMpKSk7XG5cblx0cmV0dXJuIGFycmF5VW5pb24oLi4ucGF0aHMpLmZpbHRlcihwYXRoXyA9PiAhZmlsdGVyKGdldFBhdGhTdHJpbmcocGF0aF8pKSk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cy5zeW5jID0gKHBhdHRlcm5zLCBvcHRpb25zKSA9PiB7XG5cdGNvbnN0IGdsb2JUYXNrcyA9IGdlbmVyYXRlR2xvYlRhc2tzKHBhdHRlcm5zLCBvcHRpb25zKTtcblxuXHRjb25zdCB0YXNrcyA9IFtdO1xuXHRmb3IgKGNvbnN0IHRhc2sgb2YgZ2xvYlRhc2tzKSB7XG5cdFx0Y29uc3QgbmV3VGFzayA9IGdldFBhdHRlcm4odGFzaywgZGlyR2xvYi5zeW5jKS5tYXAoZ2xvYlRvVGFzayh0YXNrKSk7XG5cdFx0dGFza3MucHVzaCguLi5uZXdUYXNrKTtcblx0fVxuXG5cdGNvbnN0IGZpbHRlciA9IGdldEZpbHRlclN5bmMob3B0aW9ucyk7XG5cblx0bGV0IG1hdGNoZXMgPSBbXTtcblx0Zm9yIChjb25zdCB0YXNrIG9mIHRhc2tzKSB7XG5cdFx0bWF0Y2hlcyA9IGFycmF5VW5pb24obWF0Y2hlcywgZmFzdEdsb2Iuc3luYyh0YXNrLnBhdHRlcm4sIHRhc2sub3B0aW9ucykpO1xuXHR9XG5cblx0cmV0dXJuIG1hdGNoZXMuZmlsdGVyKHBhdGhfID0+ICFmaWx0ZXIocGF0aF8pKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzLnN0cmVhbSA9IChwYXR0ZXJucywgb3B0aW9ucykgPT4ge1xuXHRjb25zdCBnbG9iVGFza3MgPSBnZW5lcmF0ZUdsb2JUYXNrcyhwYXR0ZXJucywgb3B0aW9ucyk7XG5cblx0Y29uc3QgdGFza3MgPSBbXTtcblx0Zm9yIChjb25zdCB0YXNrIG9mIGdsb2JUYXNrcykge1xuXHRcdGNvbnN0IG5ld1Rhc2sgPSBnZXRQYXR0ZXJuKHRhc2ssIGRpckdsb2Iuc3luYykubWFwKGdsb2JUb1Rhc2sodGFzaykpO1xuXHRcdHRhc2tzLnB1c2goLi4ubmV3VGFzayk7XG5cdH1cblxuXHRjb25zdCBmaWx0ZXIgPSBnZXRGaWx0ZXJTeW5jKG9wdGlvbnMpO1xuXHRjb25zdCBmaWx0ZXJTdHJlYW0gPSBuZXcgRmlsdGVyU3RyZWFtKHAgPT4gIWZpbHRlcihwKSk7XG5cdGNvbnN0IHVuaXF1ZVN0cmVhbSA9IG5ldyBVbmlxdWVTdHJlYW0oKTtcblxuXHRyZXR1cm4gbWVyZ2UyKHRhc2tzLm1hcCh0YXNrID0+IGZhc3RHbG9iLnN0cmVhbSh0YXNrLnBhdHRlcm4sIHRhc2sub3B0aW9ucykpKVxuXHRcdC5waXBlKGZpbHRlclN0cmVhbSlcblx0XHQucGlwZSh1bmlxdWVTdHJlYW0pO1xufTtcblxubW9kdWxlLmV4cG9ydHMuZ2VuZXJhdGVHbG9iVGFza3MgPSBnZW5lcmF0ZUdsb2JUYXNrcztcblxubW9kdWxlLmV4cG9ydHMuaGFzTWFnaWMgPSAocGF0dGVybnMsIG9wdGlvbnMpID0+IFtdXG5cdC5jb25jYXQocGF0dGVybnMpXG5cdC5zb21lKHBhdHRlcm4gPT4gZmFzdEdsb2IuaXNEeW5hbWljUGF0dGVybihwYXR0ZXJuLCBvcHRpb25zKSk7XG5cbm1vZHVsZS5leHBvcnRzLmdpdGlnbm9yZSA9IGdpdGlnbm9yZTtcbiIsICJleHBvcnQgKiBmcm9tIFwiLi9nZW5lcmF0ZS1vcGVuYXBpXCJcbmV4cG9ydCAqIGZyb20gXCIuL2dlbmVyYXRlLXJvdXRlLXR5cGVzXCJcbiIsICJpbXBvcnQgZnMgZnJvbSBcIm5vZGU6ZnMvcHJvbWlzZXNcIlxuaW1wb3J0IHsgZ2VuZXJhdGVTY2hlbWEgfSBmcm9tIFwiQGFuYXRpbmUvem9kLW9wZW5hcGlcIlxuaW1wb3J0IHtcbiAgT3BlbkFwaUJ1aWxkZXIsXG4gIE9wZXJhdGlvbk9iamVjdCxcbiAgUGFyYW1ldGVyT2JqZWN0LFxufSBmcm9tIFwib3BlbmFwaTMtdHMvb2FzMzFcIlxuaW1wb3J0IHsgU2V0dXBQYXJhbXMgfSBmcm9tIFwiLi4vLi4vdHlwZXNcIlxuaW1wb3J0IGNoYWxrIGZyb20gXCJjaGFsa1wiXG5pbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiXG5pbXBvcnQgeyBwYXJzZVJvdXRlc0luUGFja2FnZSB9IGZyb20gXCIuLi9saWIvcGFyc2Utcm91dGVzLWluLXBhY2thZ2VcIlxuaW1wb3J0IHsgZW1iZWRTY2hlbWFSZWZlcmVuY2VzIH0gZnJvbSBcIi4vZW1iZWQtc2NoZW1hLXJlZmVyZW5jZXNcIlxuaW1wb3J0IHsgbWFwTWV0aG9kc1RvRmVyblNka01ldGFkYXRhIH0gZnJvbSBcIi4vZmVybi1zZGstdXRpbHNcIlxuXG5mdW5jdGlvbiByZXBsYWNlRmlyc3RDaGFyVG9Mb3dlcmNhc2Uoc3RyOiBzdHJpbmcpIHtcbiAgaWYgKHN0ci5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gc3RyXG4gIH1cblxuICBjb25zdCBmaXJzdENoYXIgPSBzdHIuY2hhckF0KDApLnRvTG93ZXJDYXNlKClcbiAgcmV0dXJuIGZpcnN0Q2hhciArIHN0ci5zbGljZSgxKVxufVxuXG5mdW5jdGlvbiB0cmFuc2Zvcm1QYXRoVG9PcGVyYXRpb25JZChwYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBwYXJ0cyA9IHBhdGhcbiAgICAucmVwbGFjZSgvLS9nLCBcIl9cIilcbiAgICAuc3BsaXQoXCIvXCIpXG4gICAgLmZpbHRlcigocGFydCkgPT4gcGFydCAhPT0gXCJcIilcbiAgY29uc3QgdHJhbnNmb3JtZWRQYXJ0cyA9IHBhcnRzLm1hcCgocGFydCkgPT4ge1xuICAgIGlmIChwYXJ0LnN0YXJ0c1dpdGgoXCJbXCIpICYmIHBhcnQuZW5kc1dpdGgoXCJdXCIpKSB7XG4gICAgICAvLyBDb252ZXJ0IFtwYXJhbV0gdG8gQnlQYXJhbVxuICAgICAgY29uc3Qgc2VydmljZU5hbWUgPSBwYXJ0LnNsaWNlKDEsIC0xKVxuICAgICAgY29uc3Qgd29yZHMgPSBzZXJ2aWNlTmFtZS5zcGxpdChcIl9cIilcbiAgICAgIGNvbnN0IGNhcGl0YWxpemVkV29yZHMgPSB3b3Jkcy5tYXAoXG4gICAgICAgICh3b3JkKSA9PiB3b3JkLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgd29yZC5zbGljZSgxKVxuICAgICAgKVxuICAgICAgcmV0dXJuIGBCeSR7Y2FwaXRhbGl6ZWRXb3Jkcy5qb2luKFwiXCIpfWBcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQ29udmVydCBhcGlfcGF0aCB0byBBcGlQYXRoXG4gICAgICBjb25zdCB3b3JkcyA9IHBhcnQuc3BsaXQoXCJfXCIpXG4gICAgICBjb25zdCBjYXBpdGFsaXplZFdvcmRzID0gd29yZHMubWFwKFxuICAgICAgICAod29yZCkgPT4gd29yZC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHdvcmQuc2xpY2UoMSlcbiAgICAgIClcbiAgICAgIHJldHVybiBjYXBpdGFsaXplZFdvcmRzLmpvaW4oXCJcIilcbiAgICB9XG4gIH0pXG5cbiAgcmV0dXJuIHJlcGxhY2VGaXJzdENoYXJUb0xvd2VyY2FzZSh0cmFuc2Zvcm1lZFBhcnRzLmpvaW4oXCJcIikpXG59XG5cbmZ1bmN0aW9uIHBhc2NhbENhc2UoaW5wdXQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHdvcmRzID0gaW5wdXQuc3BsaXQoXCIgXCIpXG4gIGNvbnN0IGNhcGl0YWxpemVkV29yZHMgPSB3b3Jkcy5tYXAoXG4gICAgKHdvcmQpID0+IHdvcmQuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB3b3JkLnNsaWNlKDEpLnRvTG93ZXJDYXNlKClcbiAgKVxuICBjb25zdCBwYXNjYWxDYXNlU3RyaW5nID0gY2FwaXRhbGl6ZWRXb3Jkcy5qb2luKFwiXCIpXG4gIHJldHVybiBwYXNjYWxDYXNlU3RyaW5nXG59XG5cbmludGVyZmFjZSBUYWdPcHRpb24ge1xuICBuYW1lOiBzdHJpbmdcbiAgZGVzY3JpcHRpb246IHN0cmluZ1xuICBkb2VzUm91dGVIYXZlVGFnPzogKHJvdXRlOiBzdHJpbmcpID0+IGJvb2xlYW5cbn1cblxuaW50ZXJmYWNlIEdlbmVyYXRlT3BlbkFQSU9wdHMge1xuICBwYWNrYWdlRGlyOiBzdHJpbmdcbiAgb3V0cHV0RmlsZT86IHN0cmluZ1xuICBwYXRoR2xvYj86IHN0cmluZ1xuICB0YWdzPzogQXJyYXk8VGFnT3B0aW9uPlxuICBhcGlQcmVmaXg/OiBzdHJpbmdcbiAgbWFwRmlsZVBhdGhUb0hUVFBSb3V0ZT86IChmaWxlX3BhdGg6IHN0cmluZykgPT4gc3RyaW5nXG59XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiBnZW5lcmF0ZXMgYW4gT3BlbkFQSSBzcGVjIGZyb20gdGhlIE5leHQuanMgQVBJIHJvdXRlcy5cbiAqXG4gKiBZb3Ugbm9ybWFsbHkgaW52b2tlIHRoaXMgd2l0aCBgbmV4dGFwaSBnZW5lcmF0ZS1vcGVuYXBpYCBpbiBhXG4gKiBcImJ1aWxkOm9wZW5hcGlcIiBwYWNrYWdlLmpzb24gc2NyaXB0LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVPcGVuQVBJKG9wdHM6IEdlbmVyYXRlT3BlbkFQSU9wdHMpIHtcbiAgY29uc3QgeyBvdXRwdXRGaWxlLCB0YWdzID0gW10gfSA9IG9wdHNcblxuICBjb25zdCBmaWxlcGF0aFRvUm91dGVGbiA9IGF3YWl0IHBhcnNlUm91dGVzSW5QYWNrYWdlKG9wdHMpXG5cbiAgLy8gVE9ETyBkZXRlY3QgaWYgdGhlcmUgYXJlIG11bHRpcGxlIHNldHVwcyBhbmQgb3V0cHV0IGRpZmZlcmVudCBBUElzXG4gIGNvbnN0IHsgc2V0dXBQYXJhbXM6IGdsb2JhbFNldHVwUGFyYW1zIH0gPSBmaWxlcGF0aFRvUm91dGVGbi52YWx1ZXMoKS5uZXh0KClcbiAgICAudmFsdWUgYXMgeyBzZXR1cFBhcmFtczogU2V0dXBQYXJhbXMgfVxuXG4gIGNvbnN0IHNlY3VyaXR5U2NoZW1lcyA9IGdsb2JhbFNldHVwUGFyYW1zLnNlY3VyaXR5U2NoZW1hcyA/PyB7fVxuICBjb25zdCBzZWN1cml0eU9iamVjdHNGb3JBdXRoVHlwZSA9IHt9XG4gIGZvciAoY29uc3QgYXV0aE5hbWUgb2YgT2JqZWN0LmtleXMoZ2xvYmFsU2V0dXBQYXJhbXMuYXV0aE1pZGRsZXdhcmVNYXApKSB7XG4gICAgY29uc3QgbXcgPSBnbG9iYWxTZXR1cFBhcmFtcy5hdXRoTWlkZGxld2FyZU1hcFthdXRoTmFtZV1cbiAgICBpZiAobXcuc2VjdXJpdHlTY2hlbWEpIHtcbiAgICAgIHNlY3VyaXR5U2NoZW1lc1thdXRoTmFtZV0gPSAobXcgYXMgYW55KS5zZWN1cml0eVNjaGVtYVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGNoYWxrLnllbGxvdyhcbiAgICAgICAgICBgQXV0aGVudGljYXRpb24gbWlkZGxld2FyZSBcIiR7YXV0aE5hbWV9XCIgaGFzIG5vIHNlY3VyaXR5U2NoZW1hLiBZb3UgY2FuIGRlZmluZSB0aGlzIG9uIHRoZSBmdW5jdGlvbiAoZS5nLiBhZnRlciB0aGUgZXhwb3J0IGRvLi4uIFxcblxcbm15TWlkZGxld2FyZS5zZWN1cml0eVNjaGVtYSA9IHtcXG4gIHR5cGU6IFwiaHR0cFwiXFxuICBzY2hlbWU6IFwiYmVhcmVyXCJcXG4gIGJlYXJlckZvcm1hdDogXCJKV1RcIlxcbiAvLyBvciBBUEkgVG9rZW4gZXRjLlxcbn1cXG5cXG5Zb3UgY2FuIGFsc28gZGVmaW5lIFwic2VjdXJpdHlPYmplY3RzXCIgdGhpcyB3YXksIGlmIHlvdSB3YW50IHRvIG1ha2UgdGhlIGVuZHBvaW50IHN1cHBvcnQgbXVsdGlwbGUgbW9kZXMgb2YgYXV0aGVudGljYXRpb24uXFxuXFxuYFxuICAgICAgICApXG4gICAgICApXG4gICAgfVxuXG4gICAgc2VjdXJpdHlPYmplY3RzRm9yQXV0aFR5cGVbYXV0aE5hbWVdID0gKG13IGFzIGFueSkuc2VjdXJpdHlPYmplY3RzIHx8IFtcbiAgICAgIHtcbiAgICAgICAgW2F1dGhOYW1lXTogW10sXG4gICAgICB9LFxuICAgIF1cbiAgfVxuXG4gIGNvbnN0IGdsb2JhbFNjaGVtYXMgPSB7fVxuICBmb3IgKGNvbnN0IFtzY2hlbWFOYW1lLCB6b2RTY2hlbWFdIG9mIE9iamVjdC5lbnRyaWVzKFxuICAgIGdsb2JhbFNldHVwUGFyYW1zLmdsb2JhbFNjaGVtYXMgPz8ge31cbiAgKSkge1xuICAgIGdsb2JhbFNjaGVtYXNbc2NoZW1hTmFtZV0gPSBnZW5lcmF0ZVNjaGVtYSh6b2RTY2hlbWEpXG4gIH1cblxuICAvLyBCdWlsZCBPcGVuQVBJIHNwZWNcbiAgY29uc3QgYnVpbGRlciA9IE9wZW5BcGlCdWlsZGVyLmNyZWF0ZSh7XG4gICAgb3BlbmFwaTogXCIzLjAuMFwiLFxuICAgIGluZm86IHtcbiAgICAgIHRpdGxlOiBnbG9iYWxTZXR1cFBhcmFtcy5hcGlOYW1lLFxuICAgICAgdmVyc2lvbjogXCIxLjAuMFwiLFxuICAgIH0sXG4gICAgc2VydmVyczogW1xuICAgICAge1xuICAgICAgICB1cmw6IGdsb2JhbFNldHVwUGFyYW1zLnByb2R1Y3Rpb25TZXJ2ZXJVcmwgfHwgXCJodHRwczovL2V4YW1wbGUuY29tXCIsXG4gICAgICB9LFxuICAgIF0sXG4gICAgdGFnczogdGFncy5tYXAoKHRhZykgPT4gKHsgbmFtZTogdGFnLm5hbWUsIGRlc2NyaXB0aW9uOiB0YWcuZGVzY3JpcHRpb24gfSkpLFxuICAgIHBhdGhzOiB7fSxcbiAgICBjb21wb25lbnRzOiB7XG4gICAgICBzZWN1cml0eVNjaGVtZXMsXG4gICAgICBzY2hlbWFzOiBnbG9iYWxTY2hlbWFzLFxuICAgIH0sXG4gIH0pXG5cbiAgZm9yIChjb25zdCBbXG4gICAgZmlsZV9wYXRoLFxuICAgIHsgc2V0dXBQYXJhbXMsIHJvdXRlU3BlYywgcm91dGU6IHJvdXRlUGF0aCB9LFxuICBdIG9mIGZpbGVwYXRoVG9Sb3V0ZUZuKSB7XG4gICAgY29uc3QgaXNQb3N0T3JQdXRPclBhdGNoID0gW1wiUE9TVFwiLCBcIlBVVFwiLCBcIlBBVENIXCJdLnNvbWUoKG1ldGhvZCkgPT5cbiAgICAgIHJvdXRlU3BlYy5tZXRob2RzLmluY2x1ZGVzKG1ldGhvZClcbiAgICApXG4gICAgLy8gVE9ETzogc3VwcG9ydCBtdWx0aXBhcnQvZm9ybS1kYXRhXG5cbiAgICAvLyBoYW5kbGUgYm9keVxuICAgIGxldCBib2R5X3RvX2dlbmVyYXRlX3NjaGVtYVxuICAgIGlmIChpc1Bvc3RPclB1dE9yUGF0Y2gpIHtcbiAgICAgIGJvZHlfdG9fZ2VuZXJhdGVfc2NoZW1hID0gcm91dGVTcGVjLmpzb25Cb2R5ID8/IHJvdXRlU3BlYy5jb21tb25QYXJhbXNcblxuICAgICAgaWYgKHJvdXRlU3BlYy5qc29uQm9keSAmJiByb3V0ZVNwZWMuY29tbW9uUGFyYW1zKSB7XG4gICAgICAgIGJvZHlfdG9fZ2VuZXJhdGVfc2NoZW1hID0gcm91dGVTcGVjLmpzb25Cb2R5Lm1lcmdlKFxuICAgICAgICAgIHJvdXRlU3BlYy5jb21tb25QYXJhbXNcbiAgICAgICAgKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBib2R5X3RvX2dlbmVyYXRlX3NjaGVtYSA9IHJvdXRlU3BlYy5qc29uQm9keVxuICAgIH1cblxuICAgIC8vIGhhbmRsZSBxdWVyeVxuICAgIGxldCBxdWVyeV90b19nZW5lcmF0ZV9zY2hlbWFcbiAgICBpZiAoaXNQb3N0T3JQdXRPclBhdGNoKSB7XG4gICAgICBxdWVyeV90b19nZW5lcmF0ZV9zY2hlbWEgPSByb3V0ZVNwZWMucXVlcnlQYXJhbXNcbiAgICB9IGVsc2Uge1xuICAgICAgcXVlcnlfdG9fZ2VuZXJhdGVfc2NoZW1hID0gcm91dGVTcGVjLnF1ZXJ5UGFyYW1zID8/IHJvdXRlU3BlYy5jb21tb25QYXJhbXNcblxuICAgICAgaWYgKHJvdXRlU3BlYy5xdWVyeVBhcmFtcyAmJiByb3V0ZVNwZWMuY29tbW9uUGFyYW1zKSB7XG4gICAgICAgIHF1ZXJ5X3RvX2dlbmVyYXRlX3NjaGVtYSA9IHJvdXRlU3BlYy5xdWVyeVBhcmFtcy5tZXJnZShcbiAgICAgICAgICByb3V0ZVNwZWMuY29tbW9uUGFyYW1zXG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBERUxFVEUgYW5kIEdFVCBjYW5ub3QgaGF2ZSBhIGJvZHlcbiAgICBsZXQgbWV0aG9kcyA9IHJvdXRlU3BlYy5tZXRob2RzXG5cbiAgICBpZiAocm91dGVTcGVjLm1ldGhvZHMuaW5jbHVkZXMoXCJERUxFVEVcIikgJiYgYm9keV90b19nZW5lcmF0ZV9zY2hlbWEpIHtcbiAgICAgIG1ldGhvZHMgPSBtZXRob2RzLmZpbHRlcigobSkgPT4gbSAhPT0gXCJERUxFVEVcIilcbiAgICB9XG5cbiAgICBpZiAocm91dGVTcGVjLm1ldGhvZHMuaW5jbHVkZXMoXCJHRVRcIikgJiYgYm9keV90b19nZW5lcmF0ZV9zY2hlbWEpIHtcbiAgICAgIG1ldGhvZHMgPSBtZXRob2RzLmZpbHRlcigobSkgPT4gbSAhPT0gXCJHRVRcIilcbiAgICB9XG5cbiAgICBpZiAobWV0aG9kcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgY2hhbGsueWVsbG93KGBTa2lwcGluZyByb3V0ZSAke3JvdXRlUGF0aH0gYmVjYXVzZSBpdCBoYXMgbm8gbWV0aG9kcy5gKVxuICAgICAgKVxuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICBjb25zdCByb3V0ZTogT3BlcmF0aW9uT2JqZWN0ID0ge1xuICAgICAgc3VtbWFyeTogcm91dGVQYXRoLFxuICAgICAgcmVzcG9uc2VzOiB7XG4gICAgICAgIDIwMDoge1xuICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIk9LXCIsXG4gICAgICAgIH0sXG4gICAgICAgIDQwMDoge1xuICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIkJhZCBSZXF1ZXN0XCIsXG4gICAgICAgIH0sXG4gICAgICAgIDQwMToge1xuICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIlVuYXV0aG9yaXplZFwiLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHNlY3VyaXR5OiBzZWN1cml0eU9iamVjdHNGb3JBdXRoVHlwZVtyb3V0ZVNwZWMuYXV0aF0sXG4gICAgfVxuXG4gICAgaWYgKGJvZHlfdG9fZ2VuZXJhdGVfc2NoZW1hKSB7XG4gICAgICByb3V0ZS5yZXF1ZXN0Qm9keSA9IHtcbiAgICAgICAgY29udGVudDoge1xuICAgICAgICAgIFwiYXBwbGljYXRpb24vanNvblwiOiB7XG4gICAgICAgICAgICBzY2hlbWE6IGdlbmVyYXRlU2NoZW1hKGJvZHlfdG9fZ2VuZXJhdGVfc2NoZW1hIGFzIGFueSksXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocXVlcnlfdG9fZ2VuZXJhdGVfc2NoZW1hKSB7XG4gICAgICBjb25zdCBzY2hlbWEgPSBnZW5lcmF0ZVNjaGVtYShxdWVyeV90b19nZW5lcmF0ZV9zY2hlbWEgYXMgYW55KVxuICAgICAgaWYgKHNjaGVtYS5wcm9wZXJ0aWVzKSB7XG4gICAgICAgIGNvbnN0IHBhcmFtZXRlcnM6IFBhcmFtZXRlck9iamVjdFtdID0gT2JqZWN0LmtleXMoXG4gICAgICAgICAgc2NoZW1hLnByb3BlcnRpZXMgYXMgYW55XG4gICAgICAgICkubWFwKChuYW1lKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICBpbjogXCJxdWVyeVwiLFxuICAgICAgICAgICAgc2NoZW1hOiBzY2hlbWEucHJvcGVydGllcyFbbmFtZV0sXG4gICAgICAgICAgICByZXF1aXJlZDogc2NoZW1hLnJlcXVpcmVkPy5pbmNsdWRlcyhuYW1lKSxcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG5cbiAgICAgICAgcm91dGUucGFyYW1ldGVycyA9IHBhcmFtZXRlcnNcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCB7IGpzb25SZXNwb25zZSB9ID0gcm91dGVTcGVjXG4gICAgY29uc3QgeyBhZGRPa1N0YXR1cyA9IHRydWUgfSA9IHNldHVwUGFyYW1zXG5cbiAgICBpZiAoanNvblJlc3BvbnNlKSB7XG4gICAgICBpZiAoXG4gICAgICAgICFqc29uUmVzcG9uc2UuX2RlZiB8fFxuICAgICAgICAhanNvblJlc3BvbnNlLl9kZWYudHlwZU5hbWUgfHxcbiAgICAgICAganNvblJlc3BvbnNlLl9kZWYudHlwZU5hbWUgIT09IFwiWm9kT2JqZWN0XCJcbiAgICAgICkge1xuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgY2hhbGsueWVsbG93KFxuICAgICAgICAgICAgYFNraXBwaW5nIHJvdXRlICR7cm91dGVQYXRofSBiZWNhdXNlIHRoZSByZXNwb25zZSBpcyBub3QgYSBab2RPYmplY3QuYFxuICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBjb25zdCByZXNwb25zZVNjaGVtYSA9IGdlbmVyYXRlU2NoZW1hKFxuICAgICAgICBhZGRPa1N0YXR1cyA/IGpzb25SZXNwb25zZS5leHRlbmQoeyBvazogei5ib29sZWFuKCkgfSkgOiBqc29uUmVzcG9uc2VcbiAgICAgIClcblxuICAgICAgY29uc3Qgc2NoZW1hV2l0aFJlZmVyZW5jZXMgPSBlbWJlZFNjaGVtYVJlZmVyZW5jZXMoXG4gICAgICAgIHJlc3BvbnNlU2NoZW1hLFxuICAgICAgICBnbG9iYWxTY2hlbWFzXG4gICAgICApXG5cbiAgICAgIHJvdXRlLnJlc3BvbnNlc1syMDBdLmNvbnRlbnQgPSB7XG4gICAgICAgIFwiYXBwbGljYXRpb24vanNvblwiOiB7XG4gICAgICAgICAgc2NoZW1hOiBzY2hlbWFXaXRoUmVmZXJlbmNlcyxcbiAgICAgICAgfSxcbiAgICAgIH1cbiAgICB9XG5cbiAgICByb3V0ZS50YWdzID0gW11cbiAgICBmb3IgKGNvbnN0IHRhZyBvZiB0YWdzKSB7XG4gICAgICBpZiAodGFnLmRvZXNSb3V0ZUhhdmVUYWcgJiYgdGFnLmRvZXNSb3V0ZUhhdmVUYWcocm91dGUuc3VtbWFyeSB8fCBcIlwiKSkge1xuICAgICAgICByb3V0ZS50YWdzLnB1c2godGFnLm5hbWUpXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgbWV0aG9kc01hcHBlZFRvRmVyblNka01ldGFkYXRhID0gbWFwTWV0aG9kc1RvRmVyblNka01ldGFkYXRhKFxuICAgICAgbWV0aG9kcyxcbiAgICAgIHJvdXRlUGF0aFxuICAgIClcblxuICAgIC8vIFNvbWUgcm91dGVzIGFjY2VwdCBtdWx0aXBsZSBtZXRob2RzXG4gICAgYnVpbGRlci5hZGRQYXRoKHJvdXRlUGF0aCwge1xuICAgICAgLi4ubWV0aG9kc1xuICAgICAgICAubWFwKChtZXRob2QpID0+ICh7XG4gICAgICAgICAgW21ldGhvZC50b0xvd2VyQ2FzZSgpXToge1xuICAgICAgICAgICAgLi4ubWV0aG9kc01hcHBlZFRvRmVyblNka01ldGFkYXRhW21ldGhvZF0sXG4gICAgICAgICAgICAuLi5yb3V0ZSxcbiAgICAgICAgICAgIG9wZXJhdGlvbklkOiBgJHt0cmFuc2Zvcm1QYXRoVG9PcGVyYXRpb25JZChyb3V0ZVBhdGgpfSR7cGFzY2FsQ2FzZShcbiAgICAgICAgICAgICAgbWV0aG9kXG4gICAgICAgICAgICApfWAsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSkpXG4gICAgICAgIC5yZWR1Y2VSaWdodCgoYWNjLCBjdXIpID0+ICh7IC4uLmFjYywgLi4uY3VyIH0pLCB7fSksXG4gICAgfSlcbiAgfVxuXG4gIGlmIChvdXRwdXRGaWxlKSB7XG4gICAgYXdhaXQgZnMud3JpdGVGaWxlKG91dHB1dEZpbGUsIGJ1aWxkZXIuZ2V0U3BlY0FzSnNvbigpKVxuICB9XG5cbiAgcmV0dXJuIGJ1aWxkZXIuZ2V0U3BlY0FzSnNvbigpXG59XG4iLCAiaW1wb3J0IGFuc2lTdHlsZXMgZnJvbSAnI2Fuc2ktc3R5bGVzJztcbmltcG9ydCBzdXBwb3J0c0NvbG9yIGZyb20gJyNzdXBwb3J0cy1jb2xvcic7XG5pbXBvcnQgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGltcG9ydC9vcmRlclxuXHRzdHJpbmdSZXBsYWNlQWxsLFxuXHRzdHJpbmdFbmNhc2VDUkxGV2l0aEZpcnN0SW5kZXgsXG59IGZyb20gJy4vdXRpbGl0aWVzLmpzJztcblxuY29uc3Qge3N0ZG91dDogc3Rkb3V0Q29sb3IsIHN0ZGVycjogc3RkZXJyQ29sb3J9ID0gc3VwcG9ydHNDb2xvcjtcblxuY29uc3QgR0VORVJBVE9SID0gU3ltYm9sKCdHRU5FUkFUT1InKTtcbmNvbnN0IFNUWUxFUiA9IFN5bWJvbCgnU1RZTEVSJyk7XG5jb25zdCBJU19FTVBUWSA9IFN5bWJvbCgnSVNfRU1QVFknKTtcblxuLy8gYHN1cHBvcnRzQ29sb3IubGV2ZWxgIFx1MjE5MiBgYW5zaVN0eWxlcy5jb2xvcltuYW1lXWAgbWFwcGluZ1xuY29uc3QgbGV2ZWxNYXBwaW5nID0gW1xuXHQnYW5zaScsXG5cdCdhbnNpJyxcblx0J2Fuc2kyNTYnLFxuXHQnYW5zaTE2bScsXG5dO1xuXG5jb25zdCBzdHlsZXMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuXG5jb25zdCBhcHBseU9wdGlvbnMgPSAob2JqZWN0LCBvcHRpb25zID0ge30pID0+IHtcblx0aWYgKG9wdGlvbnMubGV2ZWwgJiYgIShOdW1iZXIuaXNJbnRlZ2VyKG9wdGlvbnMubGV2ZWwpICYmIG9wdGlvbnMubGV2ZWwgPj0gMCAmJiBvcHRpb25zLmxldmVsIDw9IDMpKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCdUaGUgYGxldmVsYCBvcHRpb24gc2hvdWxkIGJlIGFuIGludGVnZXIgZnJvbSAwIHRvIDMnKTtcblx0fVxuXG5cdC8vIERldGVjdCBsZXZlbCBpZiBub3Qgc2V0IG1hbnVhbGx5XG5cdGNvbnN0IGNvbG9yTGV2ZWwgPSBzdGRvdXRDb2xvciA/IHN0ZG91dENvbG9yLmxldmVsIDogMDtcblx0b2JqZWN0LmxldmVsID0gb3B0aW9ucy5sZXZlbCA9PT0gdW5kZWZpbmVkID8gY29sb3JMZXZlbCA6IG9wdGlvbnMubGV2ZWw7XG59O1xuXG5leHBvcnQgY2xhc3MgQ2hhbGsge1xuXHRjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnN0cnVjdG9yLXJldHVyblxuXHRcdHJldHVybiBjaGFsa0ZhY3Rvcnkob3B0aW9ucyk7XG5cdH1cbn1cblxuY29uc3QgY2hhbGtGYWN0b3J5ID0gb3B0aW9ucyA9PiB7XG5cdGNvbnN0IGNoYWxrID0gKC4uLnN0cmluZ3MpID0+IHN0cmluZ3Muam9pbignICcpO1xuXHRhcHBseU9wdGlvbnMoY2hhbGssIG9wdGlvbnMpO1xuXG5cdE9iamVjdC5zZXRQcm90b3R5cGVPZihjaGFsaywgY3JlYXRlQ2hhbGsucHJvdG90eXBlKTtcblxuXHRyZXR1cm4gY2hhbGs7XG59O1xuXG5mdW5jdGlvbiBjcmVhdGVDaGFsayhvcHRpb25zKSB7XG5cdHJldHVybiBjaGFsa0ZhY3Rvcnkob3B0aW9ucyk7XG59XG5cbk9iamVjdC5zZXRQcm90b3R5cGVPZihjcmVhdGVDaGFsay5wcm90b3R5cGUsIEZ1bmN0aW9uLnByb3RvdHlwZSk7XG5cbmZvciAoY29uc3QgW3N0eWxlTmFtZSwgc3R5bGVdIG9mIE9iamVjdC5lbnRyaWVzKGFuc2lTdHlsZXMpKSB7XG5cdHN0eWxlc1tzdHlsZU5hbWVdID0ge1xuXHRcdGdldCgpIHtcblx0XHRcdGNvbnN0IGJ1aWxkZXIgPSBjcmVhdGVCdWlsZGVyKHRoaXMsIGNyZWF0ZVN0eWxlcihzdHlsZS5vcGVuLCBzdHlsZS5jbG9zZSwgdGhpc1tTVFlMRVJdKSwgdGhpc1tJU19FTVBUWV0pO1xuXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIHN0eWxlTmFtZSwge3ZhbHVlOiBidWlsZGVyfSk7XG5cdFx0XHRyZXR1cm4gYnVpbGRlcjtcblx0XHR9LFxuXHR9O1xufVxuXG5zdHlsZXMudmlzaWJsZSA9IHtcblx0Z2V0KCkge1xuXHRcdGNvbnN0IGJ1aWxkZXIgPSBjcmVhdGVCdWlsZGVyKHRoaXMsIHRoaXNbU1RZTEVSXSwgdHJ1ZSk7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICd2aXNpYmxlJywge3ZhbHVlOiBidWlsZGVyfSk7XG5cdFx0cmV0dXJuIGJ1aWxkZXI7XG5cdH0sXG59O1xuXG5jb25zdCBnZXRNb2RlbEFuc2kgPSAobW9kZWwsIGxldmVsLCB0eXBlLCAuLi5hcmd1bWVudHNfKSA9PiB7XG5cdGlmIChtb2RlbCA9PT0gJ3JnYicpIHtcblx0XHRpZiAobGV2ZWwgPT09ICdhbnNpMTZtJykge1xuXHRcdFx0cmV0dXJuIGFuc2lTdHlsZXNbdHlwZV0uYW5zaTE2bSguLi5hcmd1bWVudHNfKTtcblx0XHR9XG5cblx0XHRpZiAobGV2ZWwgPT09ICdhbnNpMjU2Jykge1xuXHRcdFx0cmV0dXJuIGFuc2lTdHlsZXNbdHlwZV0uYW5zaTI1NihhbnNpU3R5bGVzLnJnYlRvQW5zaTI1NiguLi5hcmd1bWVudHNfKSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGFuc2lTdHlsZXNbdHlwZV0uYW5zaShhbnNpU3R5bGVzLnJnYlRvQW5zaSguLi5hcmd1bWVudHNfKSk7XG5cdH1cblxuXHRpZiAobW9kZWwgPT09ICdoZXgnKSB7XG5cdFx0cmV0dXJuIGdldE1vZGVsQW5zaSgncmdiJywgbGV2ZWwsIHR5cGUsIC4uLmFuc2lTdHlsZXMuaGV4VG9SZ2IoLi4uYXJndW1lbnRzXykpO1xuXHR9XG5cblx0cmV0dXJuIGFuc2lTdHlsZXNbdHlwZV1bbW9kZWxdKC4uLmFyZ3VtZW50c18pO1xufTtcblxuY29uc3QgdXNlZE1vZGVscyA9IFsncmdiJywgJ2hleCcsICdhbnNpMjU2J107XG5cbmZvciAoY29uc3QgbW9kZWwgb2YgdXNlZE1vZGVscykge1xuXHRzdHlsZXNbbW9kZWxdID0ge1xuXHRcdGdldCgpIHtcblx0XHRcdGNvbnN0IHtsZXZlbH0gPSB0aGlzO1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uICguLi5hcmd1bWVudHNfKSB7XG5cdFx0XHRcdGNvbnN0IHN0eWxlciA9IGNyZWF0ZVN0eWxlcihnZXRNb2RlbEFuc2kobW9kZWwsIGxldmVsTWFwcGluZ1tsZXZlbF0sICdjb2xvcicsIC4uLmFyZ3VtZW50c18pLCBhbnNpU3R5bGVzLmNvbG9yLmNsb3NlLCB0aGlzW1NUWUxFUl0pO1xuXHRcdFx0XHRyZXR1cm4gY3JlYXRlQnVpbGRlcih0aGlzLCBzdHlsZXIsIHRoaXNbSVNfRU1QVFldKTtcblx0XHRcdH07XG5cdFx0fSxcblx0fTtcblxuXHRjb25zdCBiZ01vZGVsID0gJ2JnJyArIG1vZGVsWzBdLnRvVXBwZXJDYXNlKCkgKyBtb2RlbC5zbGljZSgxKTtcblx0c3R5bGVzW2JnTW9kZWxdID0ge1xuXHRcdGdldCgpIHtcblx0XHRcdGNvbnN0IHtsZXZlbH0gPSB0aGlzO1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uICguLi5hcmd1bWVudHNfKSB7XG5cdFx0XHRcdGNvbnN0IHN0eWxlciA9IGNyZWF0ZVN0eWxlcihnZXRNb2RlbEFuc2kobW9kZWwsIGxldmVsTWFwcGluZ1tsZXZlbF0sICdiZ0NvbG9yJywgLi4uYXJndW1lbnRzXyksIGFuc2lTdHlsZXMuYmdDb2xvci5jbG9zZSwgdGhpc1tTVFlMRVJdKTtcblx0XHRcdFx0cmV0dXJuIGNyZWF0ZUJ1aWxkZXIodGhpcywgc3R5bGVyLCB0aGlzW0lTX0VNUFRZXSk7XG5cdFx0XHR9O1xuXHRcdH0sXG5cdH07XG59XG5cbmNvbnN0IHByb3RvID0gT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoKCkgPT4ge30sIHtcblx0Li4uc3R5bGVzLFxuXHRsZXZlbDoge1xuXHRcdGVudW1lcmFibGU6IHRydWUsXG5cdFx0Z2V0KCkge1xuXHRcdFx0cmV0dXJuIHRoaXNbR0VORVJBVE9SXS5sZXZlbDtcblx0XHR9LFxuXHRcdHNldChsZXZlbCkge1xuXHRcdFx0dGhpc1tHRU5FUkFUT1JdLmxldmVsID0gbGV2ZWw7XG5cdFx0fSxcblx0fSxcbn0pO1xuXG5jb25zdCBjcmVhdGVTdHlsZXIgPSAob3BlbiwgY2xvc2UsIHBhcmVudCkgPT4ge1xuXHRsZXQgb3BlbkFsbDtcblx0bGV0IGNsb3NlQWxsO1xuXHRpZiAocGFyZW50ID09PSB1bmRlZmluZWQpIHtcblx0XHRvcGVuQWxsID0gb3Blbjtcblx0XHRjbG9zZUFsbCA9IGNsb3NlO1xuXHR9IGVsc2Uge1xuXHRcdG9wZW5BbGwgPSBwYXJlbnQub3BlbkFsbCArIG9wZW47XG5cdFx0Y2xvc2VBbGwgPSBjbG9zZSArIHBhcmVudC5jbG9zZUFsbDtcblx0fVxuXG5cdHJldHVybiB7XG5cdFx0b3Blbixcblx0XHRjbG9zZSxcblx0XHRvcGVuQWxsLFxuXHRcdGNsb3NlQWxsLFxuXHRcdHBhcmVudCxcblx0fTtcbn07XG5cbmNvbnN0IGNyZWF0ZUJ1aWxkZXIgPSAoc2VsZiwgX3N0eWxlciwgX2lzRW1wdHkpID0+IHtcblx0Ly8gU2luZ2xlIGFyZ3VtZW50IGlzIGhvdCBwYXRoLCBpbXBsaWNpdCBjb2VyY2lvbiBpcyBmYXN0ZXIgdGhhbiBhbnl0aGluZ1xuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8taW1wbGljaXQtY29lcmNpb25cblx0Y29uc3QgYnVpbGRlciA9ICguLi5hcmd1bWVudHNfKSA9PiBhcHBseVN0eWxlKGJ1aWxkZXIsIChhcmd1bWVudHNfLmxlbmd0aCA9PT0gMSkgPyAoJycgKyBhcmd1bWVudHNfWzBdKSA6IGFyZ3VtZW50c18uam9pbignICcpKTtcblxuXHQvLyBXZSBhbHRlciB0aGUgcHJvdG90eXBlIGJlY2F1c2Ugd2UgbXVzdCByZXR1cm4gYSBmdW5jdGlvbiwgYnV0IHRoZXJlIGlzXG5cdC8vIG5vIHdheSB0byBjcmVhdGUgYSBmdW5jdGlvbiB3aXRoIGEgZGlmZmVyZW50IHByb3RvdHlwZVxuXHRPYmplY3Quc2V0UHJvdG90eXBlT2YoYnVpbGRlciwgcHJvdG8pO1xuXG5cdGJ1aWxkZXJbR0VORVJBVE9SXSA9IHNlbGY7XG5cdGJ1aWxkZXJbU1RZTEVSXSA9IF9zdHlsZXI7XG5cdGJ1aWxkZXJbSVNfRU1QVFldID0gX2lzRW1wdHk7XG5cblx0cmV0dXJuIGJ1aWxkZXI7XG59O1xuXG5jb25zdCBhcHBseVN0eWxlID0gKHNlbGYsIHN0cmluZykgPT4ge1xuXHRpZiAoc2VsZi5sZXZlbCA8PSAwIHx8ICFzdHJpbmcpIHtcblx0XHRyZXR1cm4gc2VsZltJU19FTVBUWV0gPyAnJyA6IHN0cmluZztcblx0fVxuXG5cdGxldCBzdHlsZXIgPSBzZWxmW1NUWUxFUl07XG5cblx0aWYgKHN0eWxlciA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIHN0cmluZztcblx0fVxuXG5cdGNvbnN0IHtvcGVuQWxsLCBjbG9zZUFsbH0gPSBzdHlsZXI7XG5cdGlmIChzdHJpbmcuaW5jbHVkZXMoJ1xcdTAwMUInKSkge1xuXHRcdHdoaWxlIChzdHlsZXIgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0Ly8gUmVwbGFjZSBhbnkgaW5zdGFuY2VzIGFscmVhZHkgcHJlc2VudCB3aXRoIGEgcmUtb3BlbmluZyBjb2RlXG5cdFx0XHQvLyBvdGhlcndpc2Ugb25seSB0aGUgcGFydCBvZiB0aGUgc3RyaW5nIHVudGlsIHNhaWQgY2xvc2luZyBjb2RlXG5cdFx0XHQvLyB3aWxsIGJlIGNvbG9yZWQsIGFuZCB0aGUgcmVzdCB3aWxsIHNpbXBseSBiZSAncGxhaW4nLlxuXHRcdFx0c3RyaW5nID0gc3RyaW5nUmVwbGFjZUFsbChzdHJpbmcsIHN0eWxlci5jbG9zZSwgc3R5bGVyLm9wZW4pO1xuXG5cdFx0XHRzdHlsZXIgPSBzdHlsZXIucGFyZW50O1xuXHRcdH1cblx0fVxuXG5cdC8vIFdlIGNhbiBtb3ZlIGJvdGggbmV4dCBhY3Rpb25zIG91dCBvZiBsb29wLCBiZWNhdXNlIHJlbWFpbmluZyBhY3Rpb25zIGluIGxvb3Agd29uJ3QgaGF2ZVxuXHQvLyBhbnkvdmlzaWJsZSBlZmZlY3Qgb24gcGFydHMgd2UgYWRkIGhlcmUuIENsb3NlIHRoZSBzdHlsaW5nIGJlZm9yZSBhIGxpbmVicmVhayBhbmQgcmVvcGVuXG5cdC8vIGFmdGVyIG5leHQgbGluZSB0byBmaXggYSBibGVlZCBpc3N1ZSBvbiBtYWNPUzogaHR0cHM6Ly9naXRodWIuY29tL2NoYWxrL2NoYWxrL3B1bGwvOTJcblx0Y29uc3QgbGZJbmRleCA9IHN0cmluZy5pbmRleE9mKCdcXG4nKTtcblx0aWYgKGxmSW5kZXggIT09IC0xKSB7XG5cdFx0c3RyaW5nID0gc3RyaW5nRW5jYXNlQ1JMRldpdGhGaXJzdEluZGV4KHN0cmluZywgY2xvc2VBbGwsIG9wZW5BbGwsIGxmSW5kZXgpO1xuXHR9XG5cblx0cmV0dXJuIG9wZW5BbGwgKyBzdHJpbmcgKyBjbG9zZUFsbDtcbn07XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGNyZWF0ZUNoYWxrLnByb3RvdHlwZSwgc3R5bGVzKTtcblxuY29uc3QgY2hhbGsgPSBjcmVhdGVDaGFsaygpO1xuZXhwb3J0IGNvbnN0IGNoYWxrU3RkZXJyID0gY3JlYXRlQ2hhbGsoe2xldmVsOiBzdGRlcnJDb2xvciA/IHN0ZGVyckNvbG9yLmxldmVsIDogMH0pO1xuXG5leHBvcnQge1xuXHRtb2RpZmllck5hbWVzLFxuXHRmb3JlZ3JvdW5kQ29sb3JOYW1lcyxcblx0YmFja2dyb3VuZENvbG9yTmFtZXMsXG5cdGNvbG9yTmFtZXMsXG5cblx0Ly8gVE9ETzogUmVtb3ZlIHRoZXNlIGFsaWFzZXMgaW4gdGhlIG5leHQgbWFqb3IgdmVyc2lvblxuXHRtb2RpZmllck5hbWVzIGFzIG1vZGlmaWVycyxcblx0Zm9yZWdyb3VuZENvbG9yTmFtZXMgYXMgZm9yZWdyb3VuZENvbG9ycyxcblx0YmFja2dyb3VuZENvbG9yTmFtZXMgYXMgYmFja2dyb3VuZENvbG9ycyxcblx0Y29sb3JOYW1lcyBhcyBjb2xvcnMsXG59IGZyb20gJy4vdmVuZG9yL2Fuc2ktc3R5bGVzL2luZGV4LmpzJztcblxuZXhwb3J0IHtcblx0c3Rkb3V0Q29sb3IgYXMgc3VwcG9ydHNDb2xvcixcblx0c3RkZXJyQ29sb3IgYXMgc3VwcG9ydHNDb2xvclN0ZGVycixcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGNoYWxrO1xuIiwgImNvbnN0IEFOU0lfQkFDS0dST1VORF9PRkZTRVQgPSAxMDtcblxuY29uc3Qgd3JhcEFuc2kxNiA9IChvZmZzZXQgPSAwKSA9PiBjb2RlID0+IGBcXHUwMDFCWyR7Y29kZSArIG9mZnNldH1tYDtcblxuY29uc3Qgd3JhcEFuc2kyNTYgPSAob2Zmc2V0ID0gMCkgPT4gY29kZSA9PiBgXFx1MDAxQlskezM4ICsgb2Zmc2V0fTs1OyR7Y29kZX1tYDtcblxuY29uc3Qgd3JhcEFuc2kxNm0gPSAob2Zmc2V0ID0gMCkgPT4gKHJlZCwgZ3JlZW4sIGJsdWUpID0+IGBcXHUwMDFCWyR7MzggKyBvZmZzZXR9OzI7JHtyZWR9OyR7Z3JlZW59OyR7Ymx1ZX1tYDtcblxuY29uc3Qgc3R5bGVzID0ge1xuXHRtb2RpZmllcjoge1xuXHRcdHJlc2V0OiBbMCwgMF0sXG5cdFx0Ly8gMjEgaXNuJ3Qgd2lkZWx5IHN1cHBvcnRlZCBhbmQgMjIgZG9lcyB0aGUgc2FtZSB0aGluZ1xuXHRcdGJvbGQ6IFsxLCAyMl0sXG5cdFx0ZGltOiBbMiwgMjJdLFxuXHRcdGl0YWxpYzogWzMsIDIzXSxcblx0XHR1bmRlcmxpbmU6IFs0LCAyNF0sXG5cdFx0b3ZlcmxpbmU6IFs1MywgNTVdLFxuXHRcdGludmVyc2U6IFs3LCAyN10sXG5cdFx0aGlkZGVuOiBbOCwgMjhdLFxuXHRcdHN0cmlrZXRocm91Z2g6IFs5LCAyOV0sXG5cdH0sXG5cdGNvbG9yOiB7XG5cdFx0YmxhY2s6IFszMCwgMzldLFxuXHRcdHJlZDogWzMxLCAzOV0sXG5cdFx0Z3JlZW46IFszMiwgMzldLFxuXHRcdHllbGxvdzogWzMzLCAzOV0sXG5cdFx0Ymx1ZTogWzM0LCAzOV0sXG5cdFx0bWFnZW50YTogWzM1LCAzOV0sXG5cdFx0Y3lhbjogWzM2LCAzOV0sXG5cdFx0d2hpdGU6IFszNywgMzldLFxuXG5cdFx0Ly8gQnJpZ2h0IGNvbG9yXG5cdFx0YmxhY2tCcmlnaHQ6IFs5MCwgMzldLFxuXHRcdGdyYXk6IFs5MCwgMzldLCAvLyBBbGlhcyBvZiBgYmxhY2tCcmlnaHRgXG5cdFx0Z3JleTogWzkwLCAzOV0sIC8vIEFsaWFzIG9mIGBibGFja0JyaWdodGBcblx0XHRyZWRCcmlnaHQ6IFs5MSwgMzldLFxuXHRcdGdyZWVuQnJpZ2h0OiBbOTIsIDM5XSxcblx0XHR5ZWxsb3dCcmlnaHQ6IFs5MywgMzldLFxuXHRcdGJsdWVCcmlnaHQ6IFs5NCwgMzldLFxuXHRcdG1hZ2VudGFCcmlnaHQ6IFs5NSwgMzldLFxuXHRcdGN5YW5CcmlnaHQ6IFs5NiwgMzldLFxuXHRcdHdoaXRlQnJpZ2h0OiBbOTcsIDM5XSxcblx0fSxcblx0YmdDb2xvcjoge1xuXHRcdGJnQmxhY2s6IFs0MCwgNDldLFxuXHRcdGJnUmVkOiBbNDEsIDQ5XSxcblx0XHRiZ0dyZWVuOiBbNDIsIDQ5XSxcblx0XHRiZ1llbGxvdzogWzQzLCA0OV0sXG5cdFx0YmdCbHVlOiBbNDQsIDQ5XSxcblx0XHRiZ01hZ2VudGE6IFs0NSwgNDldLFxuXHRcdGJnQ3lhbjogWzQ2LCA0OV0sXG5cdFx0YmdXaGl0ZTogWzQ3LCA0OV0sXG5cblx0XHQvLyBCcmlnaHQgY29sb3Jcblx0XHRiZ0JsYWNrQnJpZ2h0OiBbMTAwLCA0OV0sXG5cdFx0YmdHcmF5OiBbMTAwLCA0OV0sIC8vIEFsaWFzIG9mIGBiZ0JsYWNrQnJpZ2h0YFxuXHRcdGJnR3JleTogWzEwMCwgNDldLCAvLyBBbGlhcyBvZiBgYmdCbGFja0JyaWdodGBcblx0XHRiZ1JlZEJyaWdodDogWzEwMSwgNDldLFxuXHRcdGJnR3JlZW5CcmlnaHQ6IFsxMDIsIDQ5XSxcblx0XHRiZ1llbGxvd0JyaWdodDogWzEwMywgNDldLFxuXHRcdGJnQmx1ZUJyaWdodDogWzEwNCwgNDldLFxuXHRcdGJnTWFnZW50YUJyaWdodDogWzEwNSwgNDldLFxuXHRcdGJnQ3lhbkJyaWdodDogWzEwNiwgNDldLFxuXHRcdGJnV2hpdGVCcmlnaHQ6IFsxMDcsIDQ5XSxcblx0fSxcbn07XG5cbmV4cG9ydCBjb25zdCBtb2RpZmllck5hbWVzID0gT2JqZWN0LmtleXMoc3R5bGVzLm1vZGlmaWVyKTtcbmV4cG9ydCBjb25zdCBmb3JlZ3JvdW5kQ29sb3JOYW1lcyA9IE9iamVjdC5rZXlzKHN0eWxlcy5jb2xvcik7XG5leHBvcnQgY29uc3QgYmFja2dyb3VuZENvbG9yTmFtZXMgPSBPYmplY3Qua2V5cyhzdHlsZXMuYmdDb2xvcik7XG5leHBvcnQgY29uc3QgY29sb3JOYW1lcyA9IFsuLi5mb3JlZ3JvdW5kQ29sb3JOYW1lcywgLi4uYmFja2dyb3VuZENvbG9yTmFtZXNdO1xuXG5mdW5jdGlvbiBhc3NlbWJsZVN0eWxlcygpIHtcblx0Y29uc3QgY29kZXMgPSBuZXcgTWFwKCk7XG5cblx0Zm9yIChjb25zdCBbZ3JvdXBOYW1lLCBncm91cF0gb2YgT2JqZWN0LmVudHJpZXMoc3R5bGVzKSkge1xuXHRcdGZvciAoY29uc3QgW3N0eWxlTmFtZSwgc3R5bGVdIG9mIE9iamVjdC5lbnRyaWVzKGdyb3VwKSkge1xuXHRcdFx0c3R5bGVzW3N0eWxlTmFtZV0gPSB7XG5cdFx0XHRcdG9wZW46IGBcXHUwMDFCWyR7c3R5bGVbMF19bWAsXG5cdFx0XHRcdGNsb3NlOiBgXFx1MDAxQlske3N0eWxlWzFdfW1gLFxuXHRcdFx0fTtcblxuXHRcdFx0Z3JvdXBbc3R5bGVOYW1lXSA9IHN0eWxlc1tzdHlsZU5hbWVdO1xuXG5cdFx0XHRjb2Rlcy5zZXQoc3R5bGVbMF0sIHN0eWxlWzFdKTtcblx0XHR9XG5cblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoc3R5bGVzLCBncm91cE5hbWUsIHtcblx0XHRcdHZhbHVlOiBncm91cCxcblx0XHRcdGVudW1lcmFibGU6IGZhbHNlLFxuXHRcdH0pO1xuXHR9XG5cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KHN0eWxlcywgJ2NvZGVzJywge1xuXHRcdHZhbHVlOiBjb2Rlcyxcblx0XHRlbnVtZXJhYmxlOiBmYWxzZSxcblx0fSk7XG5cblx0c3R5bGVzLmNvbG9yLmNsb3NlID0gJ1xcdTAwMUJbMzltJztcblx0c3R5bGVzLmJnQ29sb3IuY2xvc2UgPSAnXFx1MDAxQls0OW0nO1xuXG5cdHN0eWxlcy5jb2xvci5hbnNpID0gd3JhcEFuc2kxNigpO1xuXHRzdHlsZXMuY29sb3IuYW5zaTI1NiA9IHdyYXBBbnNpMjU2KCk7XG5cdHN0eWxlcy5jb2xvci5hbnNpMTZtID0gd3JhcEFuc2kxNm0oKTtcblx0c3R5bGVzLmJnQ29sb3IuYW5zaSA9IHdyYXBBbnNpMTYoQU5TSV9CQUNLR1JPVU5EX09GRlNFVCk7XG5cdHN0eWxlcy5iZ0NvbG9yLmFuc2kyNTYgPSB3cmFwQW5zaTI1NihBTlNJX0JBQ0tHUk9VTkRfT0ZGU0VUKTtcblx0c3R5bGVzLmJnQ29sb3IuYW5zaTE2bSA9IHdyYXBBbnNpMTZtKEFOU0lfQkFDS0dST1VORF9PRkZTRVQpO1xuXG5cdC8vIEZyb20gaHR0cHM6Ly9naXRodWIuY29tL1FpeC0vY29sb3ItY29udmVydC9ibG9iLzNmMGUwZDRlOTJlMjM1Nzk2Y2NiMTdmNmU4NWM3MjA5NGE2NTFmNDkvY29udmVyc2lvbnMuanNcblx0T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoc3R5bGVzLCB7XG5cdFx0cmdiVG9BbnNpMjU2OiB7XG5cdFx0XHR2YWx1ZShyZWQsIGdyZWVuLCBibHVlKSB7XG5cdFx0XHRcdC8vIFdlIHVzZSB0aGUgZXh0ZW5kZWQgZ3JleXNjYWxlIHBhbGV0dGUgaGVyZSwgd2l0aCB0aGUgZXhjZXB0aW9uIG9mXG5cdFx0XHRcdC8vIGJsYWNrIGFuZCB3aGl0ZS4gbm9ybWFsIHBhbGV0dGUgb25seSBoYXMgNCBncmV5c2NhbGUgc2hhZGVzLlxuXHRcdFx0XHRpZiAocmVkID09PSBncmVlbiAmJiBncmVlbiA9PT0gYmx1ZSkge1xuXHRcdFx0XHRcdGlmIChyZWQgPCA4KSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gMTY7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKHJlZCA+IDI0OCkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIDIzMTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRyZXR1cm4gTWF0aC5yb3VuZCgoKHJlZCAtIDgpIC8gMjQ3KSAqIDI0KSArIDIzMjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiAxNlxuXHRcdFx0XHRcdCsgKDM2ICogTWF0aC5yb3VuZChyZWQgLyAyNTUgKiA1KSlcblx0XHRcdFx0XHQrICg2ICogTWF0aC5yb3VuZChncmVlbiAvIDI1NSAqIDUpKVxuXHRcdFx0XHRcdCsgTWF0aC5yb3VuZChibHVlIC8gMjU1ICogNSk7XG5cdFx0XHR9LFxuXHRcdFx0ZW51bWVyYWJsZTogZmFsc2UsXG5cdFx0fSxcblx0XHRoZXhUb1JnYjoge1xuXHRcdFx0dmFsdWUoaGV4KSB7XG5cdFx0XHRcdGNvbnN0IG1hdGNoZXMgPSAvW2EtZlxcZF17Nn18W2EtZlxcZF17M30vaS5leGVjKGhleC50b1N0cmluZygxNikpO1xuXHRcdFx0XHRpZiAoIW1hdGNoZXMpIHtcblx0XHRcdFx0XHRyZXR1cm4gWzAsIDAsIDBdO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0bGV0IFtjb2xvclN0cmluZ10gPSBtYXRjaGVzO1xuXG5cdFx0XHRcdGlmIChjb2xvclN0cmluZy5sZW5ndGggPT09IDMpIHtcblx0XHRcdFx0XHRjb2xvclN0cmluZyA9IFsuLi5jb2xvclN0cmluZ10ubWFwKGNoYXJhY3RlciA9PiBjaGFyYWN0ZXIgKyBjaGFyYWN0ZXIpLmpvaW4oJycpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Y29uc3QgaW50ZWdlciA9IE51bWJlci5wYXJzZUludChjb2xvclN0cmluZywgMTYpO1xuXG5cdFx0XHRcdHJldHVybiBbXG5cdFx0XHRcdFx0LyogZXNsaW50LWRpc2FibGUgbm8tYml0d2lzZSAqL1xuXHRcdFx0XHRcdChpbnRlZ2VyID4+IDE2KSAmIDB4RkYsXG5cdFx0XHRcdFx0KGludGVnZXIgPj4gOCkgJiAweEZGLFxuXHRcdFx0XHRcdGludGVnZXIgJiAweEZGLFxuXHRcdFx0XHRcdC8qIGVzbGludC1lbmFibGUgbm8tYml0d2lzZSAqL1xuXHRcdFx0XHRdO1xuXHRcdFx0fSxcblx0XHRcdGVudW1lcmFibGU6IGZhbHNlLFxuXHRcdH0sXG5cdFx0aGV4VG9BbnNpMjU2OiB7XG5cdFx0XHR2YWx1ZTogaGV4ID0+IHN0eWxlcy5yZ2JUb0Fuc2kyNTYoLi4uc3R5bGVzLmhleFRvUmdiKGhleCkpLFxuXHRcdFx0ZW51bWVyYWJsZTogZmFsc2UsXG5cdFx0fSxcblx0XHRhbnNpMjU2VG9BbnNpOiB7XG5cdFx0XHR2YWx1ZShjb2RlKSB7XG5cdFx0XHRcdGlmIChjb2RlIDwgOCkge1xuXHRcdFx0XHRcdHJldHVybiAzMCArIGNvZGU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoY29kZSA8IDE2KSB7XG5cdFx0XHRcdFx0cmV0dXJuIDkwICsgKGNvZGUgLSA4KTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGxldCByZWQ7XG5cdFx0XHRcdGxldCBncmVlbjtcblx0XHRcdFx0bGV0IGJsdWU7XG5cblx0XHRcdFx0aWYgKGNvZGUgPj0gMjMyKSB7XG5cdFx0XHRcdFx0cmVkID0gKCgoY29kZSAtIDIzMikgKiAxMCkgKyA4KSAvIDI1NTtcblx0XHRcdFx0XHRncmVlbiA9IHJlZDtcblx0XHRcdFx0XHRibHVlID0gcmVkO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGNvZGUgLT0gMTY7XG5cblx0XHRcdFx0XHRjb25zdCByZW1haW5kZXIgPSBjb2RlICUgMzY7XG5cblx0XHRcdFx0XHRyZWQgPSBNYXRoLmZsb29yKGNvZGUgLyAzNikgLyA1O1xuXHRcdFx0XHRcdGdyZWVuID0gTWF0aC5mbG9vcihyZW1haW5kZXIgLyA2KSAvIDU7XG5cdFx0XHRcdFx0Ymx1ZSA9IChyZW1haW5kZXIgJSA2KSAvIDU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRjb25zdCB2YWx1ZSA9IE1hdGgubWF4KHJlZCwgZ3JlZW4sIGJsdWUpICogMjtcblxuXHRcdFx0XHRpZiAodmFsdWUgPT09IDApIHtcblx0XHRcdFx0XHRyZXR1cm4gMzA7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYml0d2lzZVxuXHRcdFx0XHRsZXQgcmVzdWx0ID0gMzAgKyAoKE1hdGgucm91bmQoYmx1ZSkgPDwgMikgfCAoTWF0aC5yb3VuZChncmVlbikgPDwgMSkgfCBNYXRoLnJvdW5kKHJlZCkpO1xuXG5cdFx0XHRcdGlmICh2YWx1ZSA9PT0gMikge1xuXHRcdFx0XHRcdHJlc3VsdCArPSA2MDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0XHR9LFxuXHRcdFx0ZW51bWVyYWJsZTogZmFsc2UsXG5cdFx0fSxcblx0XHRyZ2JUb0Fuc2k6IHtcblx0XHRcdHZhbHVlOiAocmVkLCBncmVlbiwgYmx1ZSkgPT4gc3R5bGVzLmFuc2kyNTZUb0Fuc2koc3R5bGVzLnJnYlRvQW5zaTI1NihyZWQsIGdyZWVuLCBibHVlKSksXG5cdFx0XHRlbnVtZXJhYmxlOiBmYWxzZSxcblx0XHR9LFxuXHRcdGhleFRvQW5zaToge1xuXHRcdFx0dmFsdWU6IGhleCA9PiBzdHlsZXMuYW5zaTI1NlRvQW5zaShzdHlsZXMuaGV4VG9BbnNpMjU2KGhleCkpLFxuXHRcdFx0ZW51bWVyYWJsZTogZmFsc2UsXG5cdFx0fSxcblx0fSk7XG5cblx0cmV0dXJuIHN0eWxlcztcbn1cblxuY29uc3QgYW5zaVN0eWxlcyA9IGFzc2VtYmxlU3R5bGVzKCk7XG5cbmV4cG9ydCBkZWZhdWx0IGFuc2lTdHlsZXM7XG4iLCAiaW1wb3J0IHByb2Nlc3MgZnJvbSAnbm9kZTpwcm9jZXNzJztcbmltcG9ydCBvcyBmcm9tICdub2RlOm9zJztcbmltcG9ydCB0dHkgZnJvbSAnbm9kZTp0dHknO1xuXG4vLyBGcm9tOiBodHRwczovL2dpdGh1Yi5jb20vc2luZHJlc29yaHVzL2hhcy1mbGFnL2Jsb2IvbWFpbi9pbmRleC5qc1xuLy8vIGZ1bmN0aW9uIGhhc0ZsYWcoZmxhZywgYXJndiA9IGdsb2JhbFRoaXMuRGVubz8uYXJncyA/PyBwcm9jZXNzLmFyZ3YpIHtcbmZ1bmN0aW9uIGhhc0ZsYWcoZmxhZywgYXJndiA9IGdsb2JhbFRoaXMuRGVubyA/IGdsb2JhbFRoaXMuRGVuby5hcmdzIDogcHJvY2Vzcy5hcmd2KSB7XG5cdGNvbnN0IHByZWZpeCA9IGZsYWcuc3RhcnRzV2l0aCgnLScpID8gJycgOiAoZmxhZy5sZW5ndGggPT09IDEgPyAnLScgOiAnLS0nKTtcblx0Y29uc3QgcG9zaXRpb24gPSBhcmd2LmluZGV4T2YocHJlZml4ICsgZmxhZyk7XG5cdGNvbnN0IHRlcm1pbmF0b3JQb3NpdGlvbiA9IGFyZ3YuaW5kZXhPZignLS0nKTtcblx0cmV0dXJuIHBvc2l0aW9uICE9PSAtMSAmJiAodGVybWluYXRvclBvc2l0aW9uID09PSAtMSB8fCBwb3NpdGlvbiA8IHRlcm1pbmF0b3JQb3NpdGlvbik7XG59XG5cbmNvbnN0IHtlbnZ9ID0gcHJvY2VzcztcblxubGV0IGZsYWdGb3JjZUNvbG9yO1xuaWYgKFxuXHRoYXNGbGFnKCduby1jb2xvcicpXG5cdHx8IGhhc0ZsYWcoJ25vLWNvbG9ycycpXG5cdHx8IGhhc0ZsYWcoJ2NvbG9yPWZhbHNlJylcblx0fHwgaGFzRmxhZygnY29sb3I9bmV2ZXInKVxuKSB7XG5cdGZsYWdGb3JjZUNvbG9yID0gMDtcbn0gZWxzZSBpZiAoXG5cdGhhc0ZsYWcoJ2NvbG9yJylcblx0fHwgaGFzRmxhZygnY29sb3JzJylcblx0fHwgaGFzRmxhZygnY29sb3I9dHJ1ZScpXG5cdHx8IGhhc0ZsYWcoJ2NvbG9yPWFsd2F5cycpXG4pIHtcblx0ZmxhZ0ZvcmNlQ29sb3IgPSAxO1xufVxuXG5mdW5jdGlvbiBlbnZGb3JjZUNvbG9yKCkge1xuXHRpZiAoJ0ZPUkNFX0NPTE9SJyBpbiBlbnYpIHtcblx0XHRpZiAoZW52LkZPUkNFX0NPTE9SID09PSAndHJ1ZScpIHtcblx0XHRcdHJldHVybiAxO1xuXHRcdH1cblxuXHRcdGlmIChlbnYuRk9SQ0VfQ09MT1IgPT09ICdmYWxzZScpIHtcblx0XHRcdHJldHVybiAwO1xuXHRcdH1cblxuXHRcdHJldHVybiBlbnYuRk9SQ0VfQ09MT1IubGVuZ3RoID09PSAwID8gMSA6IE1hdGgubWluKE51bWJlci5wYXJzZUludChlbnYuRk9SQ0VfQ09MT1IsIDEwKSwgMyk7XG5cdH1cbn1cblxuZnVuY3Rpb24gdHJhbnNsYXRlTGV2ZWwobGV2ZWwpIHtcblx0aWYgKGxldmVsID09PSAwKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0cmV0dXJuIHtcblx0XHRsZXZlbCxcblx0XHRoYXNCYXNpYzogdHJ1ZSxcblx0XHRoYXMyNTY6IGxldmVsID49IDIsXG5cdFx0aGFzMTZtOiBsZXZlbCA+PSAzLFxuXHR9O1xufVxuXG5mdW5jdGlvbiBfc3VwcG9ydHNDb2xvcihoYXZlU3RyZWFtLCB7c3RyZWFtSXNUVFksIHNuaWZmRmxhZ3MgPSB0cnVlfSA9IHt9KSB7XG5cdGNvbnN0IG5vRmxhZ0ZvcmNlQ29sb3IgPSBlbnZGb3JjZUNvbG9yKCk7XG5cdGlmIChub0ZsYWdGb3JjZUNvbG9yICE9PSB1bmRlZmluZWQpIHtcblx0XHRmbGFnRm9yY2VDb2xvciA9IG5vRmxhZ0ZvcmNlQ29sb3I7XG5cdH1cblxuXHRjb25zdCBmb3JjZUNvbG9yID0gc25pZmZGbGFncyA/IGZsYWdGb3JjZUNvbG9yIDogbm9GbGFnRm9yY2VDb2xvcjtcblxuXHRpZiAoZm9yY2VDb2xvciA9PT0gMCkge1xuXHRcdHJldHVybiAwO1xuXHR9XG5cblx0aWYgKHNuaWZmRmxhZ3MpIHtcblx0XHRpZiAoaGFzRmxhZygnY29sb3I9MTZtJylcblx0XHRcdHx8IGhhc0ZsYWcoJ2NvbG9yPWZ1bGwnKVxuXHRcdFx0fHwgaGFzRmxhZygnY29sb3I9dHJ1ZWNvbG9yJykpIHtcblx0XHRcdHJldHVybiAzO1xuXHRcdH1cblxuXHRcdGlmIChoYXNGbGFnKCdjb2xvcj0yNTYnKSkge1xuXHRcdFx0cmV0dXJuIDI7XG5cdFx0fVxuXHR9XG5cblx0Ly8gQ2hlY2sgZm9yIEF6dXJlIERldk9wcyBwaXBlbGluZXMuXG5cdC8vIEhhcyB0byBiZSBhYm92ZSB0aGUgYCFzdHJlYW1Jc1RUWWAgY2hlY2suXG5cdGlmICgnVEZfQlVJTEQnIGluIGVudiAmJiAnQUdFTlRfTkFNRScgaW4gZW52KSB7XG5cdFx0cmV0dXJuIDE7XG5cdH1cblxuXHRpZiAoaGF2ZVN0cmVhbSAmJiAhc3RyZWFtSXNUVFkgJiYgZm9yY2VDb2xvciA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIDA7XG5cdH1cblxuXHRjb25zdCBtaW4gPSBmb3JjZUNvbG9yIHx8IDA7XG5cblx0aWYgKGVudi5URVJNID09PSAnZHVtYicpIHtcblx0XHRyZXR1cm4gbWluO1xuXHR9XG5cblx0aWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicpIHtcblx0XHQvLyBXaW5kb3dzIDEwIGJ1aWxkIDEwNTg2IGlzIHRoZSBmaXJzdCBXaW5kb3dzIHJlbGVhc2UgdGhhdCBzdXBwb3J0cyAyNTYgY29sb3JzLlxuXHRcdC8vIFdpbmRvd3MgMTAgYnVpbGQgMTQ5MzEgaXMgdGhlIGZpcnN0IHJlbGVhc2UgdGhhdCBzdXBwb3J0cyAxNm0vVHJ1ZUNvbG9yLlxuXHRcdGNvbnN0IG9zUmVsZWFzZSA9IG9zLnJlbGVhc2UoKS5zcGxpdCgnLicpO1xuXHRcdGlmIChcblx0XHRcdE51bWJlcihvc1JlbGVhc2VbMF0pID49IDEwXG5cdFx0XHQmJiBOdW1iZXIob3NSZWxlYXNlWzJdKSA+PSAxMF81ODZcblx0XHQpIHtcblx0XHRcdHJldHVybiBOdW1iZXIob3NSZWxlYXNlWzJdKSA+PSAxNF85MzEgPyAzIDogMjtcblx0XHR9XG5cblx0XHRyZXR1cm4gMTtcblx0fVxuXG5cdGlmICgnQ0knIGluIGVudikge1xuXHRcdGlmICgnR0lUSFVCX0FDVElPTlMnIGluIGVudiB8fCAnR0lURUFfQUNUSU9OUycgaW4gZW52KSB7XG5cdFx0XHRyZXR1cm4gMztcblx0XHR9XG5cblx0XHRpZiAoWydUUkFWSVMnLCAnQ0lSQ0xFQ0knLCAnQVBQVkVZT1InLCAnR0lUTEFCX0NJJywgJ0JVSUxES0lURScsICdEUk9ORSddLnNvbWUoc2lnbiA9PiBzaWduIGluIGVudikgfHwgZW52LkNJX05BTUUgPT09ICdjb2Rlc2hpcCcpIHtcblx0XHRcdHJldHVybiAxO1xuXHRcdH1cblxuXHRcdHJldHVybiBtaW47XG5cdH1cblxuXHRpZiAoJ1RFQU1DSVRZX1ZFUlNJT04nIGluIGVudikge1xuXHRcdHJldHVybiAvXig5XFwuKDAqWzEtOV1cXGQqKVxcLnxcXGR7Mix9XFwuKS8udGVzdChlbnYuVEVBTUNJVFlfVkVSU0lPTikgPyAxIDogMDtcblx0fVxuXG5cdGlmIChlbnYuQ09MT1JURVJNID09PSAndHJ1ZWNvbG9yJykge1xuXHRcdHJldHVybiAzO1xuXHR9XG5cblx0aWYgKGVudi5URVJNID09PSAneHRlcm0ta2l0dHknKSB7XG5cdFx0cmV0dXJuIDM7XG5cdH1cblxuXHRpZiAoJ1RFUk1fUFJPR1JBTScgaW4gZW52KSB7XG5cdFx0Y29uc3QgdmVyc2lvbiA9IE51bWJlci5wYXJzZUludCgoZW52LlRFUk1fUFJPR1JBTV9WRVJTSU9OIHx8ICcnKS5zcGxpdCgnLicpWzBdLCAxMCk7XG5cblx0XHRzd2l0Y2ggKGVudi5URVJNX1BST0dSQU0pIHtcblx0XHRcdGNhc2UgJ2lUZXJtLmFwcCc6IHtcblx0XHRcdFx0cmV0dXJuIHZlcnNpb24gPj0gMyA/IDMgOiAyO1xuXHRcdFx0fVxuXG5cdFx0XHRjYXNlICdBcHBsZV9UZXJtaW5hbCc6IHtcblx0XHRcdFx0cmV0dXJuIDI7XG5cdFx0XHR9XG5cdFx0XHQvLyBObyBkZWZhdWx0XG5cdFx0fVxuXHR9XG5cblx0aWYgKC8tMjU2KGNvbG9yKT8kL2kudGVzdChlbnYuVEVSTSkpIHtcblx0XHRyZXR1cm4gMjtcblx0fVxuXG5cdGlmICgvXnNjcmVlbnxeeHRlcm18XnZ0MTAwfF52dDIyMHxecnh2dHxjb2xvcnxhbnNpfGN5Z3dpbnxsaW51eC9pLnRlc3QoZW52LlRFUk0pKSB7XG5cdFx0cmV0dXJuIDE7XG5cdH1cblxuXHRpZiAoJ0NPTE9SVEVSTScgaW4gZW52KSB7XG5cdFx0cmV0dXJuIDE7XG5cdH1cblxuXHRyZXR1cm4gbWluO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU3VwcG9ydHNDb2xvcihzdHJlYW0sIG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCBsZXZlbCA9IF9zdXBwb3J0c0NvbG9yKHN0cmVhbSwge1xuXHRcdHN0cmVhbUlzVFRZOiBzdHJlYW0gJiYgc3RyZWFtLmlzVFRZLFxuXHRcdC4uLm9wdGlvbnMsXG5cdH0pO1xuXG5cdHJldHVybiB0cmFuc2xhdGVMZXZlbChsZXZlbCk7XG59XG5cbmNvbnN0IHN1cHBvcnRzQ29sb3IgPSB7XG5cdHN0ZG91dDogY3JlYXRlU3VwcG9ydHNDb2xvcih7aXNUVFk6IHR0eS5pc2F0dHkoMSl9KSxcblx0c3RkZXJyOiBjcmVhdGVTdXBwb3J0c0NvbG9yKHtpc1RUWTogdHR5LmlzYXR0eSgyKX0pLFxufTtcblxuZXhwb3J0IGRlZmF1bHQgc3VwcG9ydHNDb2xvcjtcbiIsICIvLyBUT0RPOiBXaGVuIHRhcmdldGluZyBOb2RlLmpzIDE2LCB1c2UgYFN0cmluZy5wcm90b3R5cGUucmVwbGFjZUFsbGAuXG5leHBvcnQgZnVuY3Rpb24gc3RyaW5nUmVwbGFjZUFsbChzdHJpbmcsIHN1YnN0cmluZywgcmVwbGFjZXIpIHtcblx0bGV0IGluZGV4ID0gc3RyaW5nLmluZGV4T2Yoc3Vic3RyaW5nKTtcblx0aWYgKGluZGV4ID09PSAtMSkge1xuXHRcdHJldHVybiBzdHJpbmc7XG5cdH1cblxuXHRjb25zdCBzdWJzdHJpbmdMZW5ndGggPSBzdWJzdHJpbmcubGVuZ3RoO1xuXHRsZXQgZW5kSW5kZXggPSAwO1xuXHRsZXQgcmV0dXJuVmFsdWUgPSAnJztcblx0ZG8ge1xuXHRcdHJldHVyblZhbHVlICs9IHN0cmluZy5zbGljZShlbmRJbmRleCwgaW5kZXgpICsgc3Vic3RyaW5nICsgcmVwbGFjZXI7XG5cdFx0ZW5kSW5kZXggPSBpbmRleCArIHN1YnN0cmluZ0xlbmd0aDtcblx0XHRpbmRleCA9IHN0cmluZy5pbmRleE9mKHN1YnN0cmluZywgZW5kSW5kZXgpO1xuXHR9IHdoaWxlIChpbmRleCAhPT0gLTEpO1xuXG5cdHJldHVyblZhbHVlICs9IHN0cmluZy5zbGljZShlbmRJbmRleCk7XG5cdHJldHVybiByZXR1cm5WYWx1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHN0cmluZ0VuY2FzZUNSTEZXaXRoRmlyc3RJbmRleChzdHJpbmcsIHByZWZpeCwgcG9zdGZpeCwgaW5kZXgpIHtcblx0bGV0IGVuZEluZGV4ID0gMDtcblx0bGV0IHJldHVyblZhbHVlID0gJyc7XG5cdGRvIHtcblx0XHRjb25zdCBnb3RDUiA9IHN0cmluZ1tpbmRleCAtIDFdID09PSAnXFxyJztcblx0XHRyZXR1cm5WYWx1ZSArPSBzdHJpbmcuc2xpY2UoZW5kSW5kZXgsIChnb3RDUiA/IGluZGV4IC0gMSA6IGluZGV4KSkgKyBwcmVmaXggKyAoZ290Q1IgPyAnXFxyXFxuJyA6ICdcXG4nKSArIHBvc3RmaXg7XG5cdFx0ZW5kSW5kZXggPSBpbmRleCArIDE7XG5cdFx0aW5kZXggPSBzdHJpbmcuaW5kZXhPZignXFxuJywgZW5kSW5kZXgpO1xuXHR9IHdoaWxlIChpbmRleCAhPT0gLTEpO1xuXG5cdHJldHVyblZhbHVlICs9IHN0cmluZy5zbGljZShlbmRJbmRleCk7XG5cdHJldHVybiByZXR1cm5WYWx1ZTtcbn1cbiIsICJpbXBvcnQgY2hhbGsgZnJvbSBcImNoYWxrXCJcbmltcG9ydCBwYXRoIGZyb20gXCJub2RlOnBhdGhcIlxuaW1wb3J0IGdsb2JieSBmcm9tIFwiZ2xvYmJ5XCJcbmltcG9ydCB7IFJvdXRlU3BlYywgU2V0dXBQYXJhbXMgfSBmcm9tIFwiLi4vLi4vdHlwZXNcIlxuaW1wb3J0IHsgZGVmYXVsdE1hcEZpbGVQYXRoVG9IVFRQUm91dGUgfSBmcm9tIFwiLi9kZWZhdWx0LW1hcC1maWxlLXBhdGgtdG8taHR0cC1yb3V0ZVwiXG5cbmV4cG9ydCBpbnRlcmZhY2UgUm91dGVJbmZvIHtcbiAgc2V0dXBQYXJhbXM6IFNldHVwUGFyYW1zXG4gIHJvdXRlU3BlYzogUm91dGVTcGVjXG4gIHJvdXRlRm46IEZ1bmN0aW9uXG4gIHJvdXRlOiBzdHJpbmdcbn1cblxuZXhwb3J0IGNvbnN0IHBhcnNlUm91dGVzSW5QYWNrYWdlID0gYXN5bmMgKG9wdHM6IHtcbiAgcGFja2FnZURpcjogc3RyaW5nXG4gIHBhdGhHbG9iPzogc3RyaW5nXG4gIGFwaVByZWZpeD86IHN0cmluZ1xuICBtYXBGaWxlUGF0aFRvSFRUUFJvdXRlPzogKGZpbGVfcGF0aDogc3RyaW5nKSA9PiBzdHJpbmdcbn0pOiBQcm9taXNlPE1hcDxzdHJpbmcsIFJvdXRlSW5mbz4+ID0+IHtcbiAgY29uc3Qge1xuICAgIHBhY2thZ2VEaXIsXG4gICAgcGF0aEdsb2IgPSBcIi9wYWdlcy9hcGkvKiovKi50c1wiLFxuICAgIG1hcEZpbGVQYXRoVG9IVFRQUm91dGUgPSBkZWZhdWx0TWFwRmlsZVBhdGhUb0hUVFBSb3V0ZShvcHRzLmFwaVByZWZpeCksXG4gIH0gPSBvcHRzXG4gIC8vIExvYWQgYWxsIHJvdXRlIHNwZWNzXG4gIGNvbnN0IGZ1bGxQYXRoR2xvYiA9IHBhdGgucG9zaXguam9pbihwYWNrYWdlRGlyLCBwYXRoR2xvYilcbiAgY29uc29sZS5sb2coYHNlYXJjaGluZyBcIiR7ZnVsbFBhdGhHbG9ifVwiLi4uYClcbiAgY29uc3QgZmlsZXBhdGhzID0gYXdhaXQgZ2xvYmJ5KGAke2Z1bGxQYXRoR2xvYn1gKVxuICBjb25zb2xlLmxvZyhgZm91bmQgJHtmaWxlcGF0aHMubGVuZ3RofSBmaWxlc2ApXG4gIGlmIChmaWxlcGF0aHMubGVuZ3RoID09PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBObyBmaWxlcyBmb3VuZCBhdCBcIiR7ZnVsbFBhdGhHbG9ifVwiYClcbiAgfVxuICBjb25zdCBmaWxlcGF0aFRvUm91dGVGbiA9IG5ldyBNYXA8c3RyaW5nLCBSb3V0ZUluZm8+KClcblxuICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICBmaWxlcGF0aHMubWFwKGFzeW5jIChwKSA9PiB7XG4gICAgICBjb25zdCB7IGRlZmF1bHQ6IHJvdXRlRm4gfSA9IGF3YWl0IHJlcXVpcmUocGF0aC5yZXNvbHZlKHApKVxuXG4gICAgICBpZiAocm91dGVGbikge1xuICAgICAgICBpZiAoIXJvdXRlRm4uX3NldHVwUGFyYW1zKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgY2hhbGsueWVsbG93KFxuICAgICAgICAgICAgICBgSWdub3JpbmcgXCIke3B9XCIgYmVjYXVzZSBpdCB3YXNuJ3QgY3JlYXRlZCB3aXRoIHdpdGhSb3V0ZVNwZWNgXG4gICAgICAgICAgICApXG4gICAgICAgICAgKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGZpbGVwYXRoVG9Sb3V0ZUZuLnNldChwLCB7XG4gICAgICAgICAgc2V0dXBQYXJhbXM6IHJvdXRlRm4uX3NldHVwUGFyYW1zLFxuICAgICAgICAgIHJvdXRlU3BlYzogcm91dGVGbi5fcm91dGVTcGVjLFxuICAgICAgICAgIHJvdXRlOiBtYXBGaWxlUGF0aFRvSFRUUFJvdXRlKHApLFxuICAgICAgICAgIHJvdXRlRm4sXG4gICAgICAgIH0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLndhcm4oY2hhbGsueWVsbG93KGBDb3VsZG4ndCBmaW5kIHJvdXRlICR7cH1gKSlcbiAgICAgIH1cbiAgICB9KVxuICApXG5cbiAgcmV0dXJuIGZpbGVwYXRoVG9Sb3V0ZUZuXG59XG4iLCAiaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIlxuXG5leHBvcnQgY29uc3QgZGVmYXVsdE1hcEZpbGVQYXRoVG9IVFRQUm91dGUgPVxuICAoYXBpX3ByZWZpeDogc3RyaW5nID0gXCIvYXBpXCIpID0+XG4gIChmaWxlX3BhdGg6IHN0cmluZykgPT4ge1xuICAgIGNvbnN0IHJvdXRlID0gZmlsZV9wYXRoXG4gICAgICAvLyByZXBsYWNlIC4vIGlmIGl0IHN0YXJ0cyB3aXRoIC4vXG4gICAgICAucmVwbGFjZSgvXlxcLlxcLy8sIFwiL1wiKVxuICAgICAgLy8gcmVwbGFjZSBzdGFydGluZyAvXG4gICAgICAucmVwbGFjZSgvXlxcLy8sIFwiXCIpXG4gICAgICAvLyByZXBsYWNlIC9zcmMgaWYgaXQgc3RhcnRzIHdpdGggL3NyY1xuICAgICAgLnJlcGxhY2UoL15zcmNcXC8vLCBcIlwiKVxuICAgICAgLy8gcmVwbGFjZSAvcGFnZXMgaWYgaXQgc3RhcnRzIHdpdGggL3BhZ2VzXG4gICAgICAucmVwbGFjZSgvXnBhZ2VzXFwvLywgXCJcIilcbiAgICAgIC8vIHJlcGxhY2UgL2FwaSBpZiBpdCBzdGFydHMgd2l0aCAvYXBpXG4gICAgICAucmVwbGFjZSgvXmFwaVxcLy8sIFwiXCIpXG4gICAgICAvLyByZXBsYWNlIC50cyBpZiBpdCBlbmRzIHdpdGggLnRzXG4gICAgICAucmVwbGFjZSgvXFwudHMkLywgXCJcIilcbiAgICAgIC8vIHJlbW92ZSBwdWJsaWMgcmVmZXJlbmNlXG4gICAgICAucmVwbGFjZShcInB1YmxpY1wiLCBcIlwiKVxuICAgICAgLy8gcmVwbGFjZSBpbmRleCBpZiBpdCBlbmRzIHdpdGggaW5kZXhcbiAgICAgIC5yZXBsYWNlKC9cXC9cXGluZGV4KD8hLikvLCBcIlwiKVxuXG4gICAgcmV0dXJuIHBhdGguam9pbihhcGlfcHJlZml4LCByb3V0ZSlcbiAgfVxuIiwgImltcG9ydCBfIGZyb20gXCJsb2Rhc2hcIlxuXG5mdW5jdGlvbiBmaW5kS2V5SW5PYmoob2JqOiBhbnksIHZhbHVlOiBhbnkpOiBzdHJpbmcgfCBudWxsIHtcbiAgbGV0IHJlc3VsdEtleTogc3RyaW5nIHwgbnVsbCA9IG51bGxcbiAgXy5mb3JPd24ob2JqLCAodiwgaykgPT4ge1xuICAgIGlmIChfLmlzT2JqZWN0KHYpICYmIF8uaXNNYXRjaCh2LCB2YWx1ZSkpIHtcbiAgICAgIHJlc3VsdEtleSA9IGtcbiAgICAgIC8vIFN0b3AgdGhlIGl0ZXJhdGlvblxuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICB9KVxuICByZXR1cm4gcmVzdWx0S2V5XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBlbWJlZFNjaGVtYVJlZmVyZW5jZXMob2JqMTogYW55LCBvYmoyOiBhbnkpOiBhbnkge1xuICByZXR1cm4gXy50cmFuc2Zvcm0ob2JqMSwgKHJlc3VsdCwgdmFsdWUsIGtleSkgPT4ge1xuICAgIGlmIChfLmlzT2JqZWN0KHZhbHVlKSkge1xuICAgICAgY29uc3QgbWF0Y2hpbmdLZXkgPSBmaW5kS2V5SW5PYmoob2JqMiwgdmFsdWUpXG4gICAgICBpZiAobWF0Y2hpbmdLZXkpIHtcbiAgICAgICAgcmVzdWx0W2tleV0gPSB7XG4gICAgICAgICAgJHJlZjogYCMvY29tcG9uZW50cy9zY2hlbWFzLyR7bWF0Y2hpbmdLZXl9YCxcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0W2tleV0gPSBlbWJlZFNjaGVtYVJlZmVyZW5jZXModmFsdWUsIG9iajIpXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdFtrZXldID0gdmFsdWVcbiAgICB9XG4gIH0pXG59XG4iLCAiaW1wb3J0IHsgUm91dGVTcGVjIH0gZnJvbSBcIi4uLy4uL3R5cGVzXCJcblxuZnVuY3Rpb24gdHJhbnNmb3JtUGF0aFRvRmVyblNka01ldGhvZE5hbWUocGF0aDogc3RyaW5nKSB7XG4gIGNvbnN0IHBhcnRzID0gcGF0aC5zcGxpdChcIi9cIikuZmlsdGVyKChwYXJ0KSA9PiBwYXJ0ICE9PSBcIlwiKVxuICBjb25zdCBsYXN0UGFydCA9IHBhcnRzW3BhcnRzLmxlbmd0aCAtIDFdXG4gIGlmIChsYXN0UGFydC5zdGFydHNXaXRoKFwiW1wiKSAmJiBsYXN0UGFydC5lbmRzV2l0aChcIl1cIikpIHtcbiAgICAvLyBDb252ZXJ0IFtwYXJhbV0gdG8gYnlfcGFyYW1cbiAgICBjb25zdCBwYXJhbSA9IGxhc3RQYXJ0LnNsaWNlKDEsIC0xKVxuICAgIHJldHVybiBgYnlfJHtwYXJhbX1gXG4gIH1cblxuICByZXR1cm4gbGFzdFBhcnRcbn1cblxuLy8gZmVybiBkb2NzOiBodHRwczovL2J1aWxkd2l0aGZlcm4uY29tL2RvY3Mvc3BlYy9leHRlbnNpb25zXG5mdW5jdGlvbiB0cmFuc2Zvcm1QYXRoVG9GZXJuU2RrR3JvdXBOYW1lKHBhdGg6IHN0cmluZykge1xuICBjb25zdCBwYXJ0cyA9IHBhdGguc3BsaXQoXCIvXCIpLmZpbHRlcigocGFydCkgPT4gcGFydCAhPT0gXCJcIilcbiAgcmV0dXJuIHBhcnRzLnNsaWNlKDAsIHBhcnRzLmxlbmd0aCAtIDEpXG59XG5cbmZ1bmN0aW9uIGdldEZlcm5TZGtNZXRhZGF0YShwYXRoOiBzdHJpbmcpOlxuICB8IHtcbiAgICAgIFwieC1mZXJuLWlnbm9yZVwiOiB0cnVlXG4gICAgfVxuICB8IHtcbiAgICAgIFwieC1mZXJuLXNkay1ncm91cC1uYW1lXCI6IHN0cmluZ1tdXG4gICAgICBcIngtZmVybi1zZGstbWV0aG9kLW5hbWVcIjogc3RyaW5nXG4gICAgfSB7XG4gIGlmIChwYXRoLnNwbGl0KFwiL1wiKS5maWx0ZXIoKHBhcnQpID0+IHBhcnQgIT09IFwiXCIpLmxlbmd0aCA9PT0gMSkge1xuICAgIHJldHVybiB7XG4gICAgICBcIngtZmVybi1pZ25vcmVcIjogdHJ1ZSxcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIFwieC1mZXJuLXNkay1ncm91cC1uYW1lXCI6IHRyYW5zZm9ybVBhdGhUb0Zlcm5TZGtHcm91cE5hbWUocGF0aCksXG4gICAgXCJ4LWZlcm4tc2RrLW1ldGhvZC1uYW1lXCI6IHRyYW5zZm9ybVBhdGhUb0Zlcm5TZGtNZXRob2ROYW1lKHBhdGgpLFxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtYXBNZXRob2RzVG9GZXJuU2RrTWV0YWRhdGEoXG4gIG1ldGhvZHM6IFJvdXRlU3BlY1tcIm1ldGhvZHNcIl0sXG4gIHBhdGg6IHN0cmluZ1xuKSB7XG4gIGNvbnN0IGZlcm5TZGtNZXRhZGF0YSA9IGdldEZlcm5TZGtNZXRhZGF0YShwYXRoKVxuICBpZiAobWV0aG9kcy5sZW5ndGggPT09IDEpIHtcbiAgICByZXR1cm4ge1xuICAgICAgW21ldGhvZHNbMF1dOiBmZXJuU2RrTWV0YWRhdGEsXG4gICAgfVxuICB9XG5cbiAgY29uc3QgbWFwcGVkTWV0aG9kcyA9IHt9XG4gIGNvbnN0IGF0TGVhc3RPbmVNZXRob2RJc1Bvc3QgPSBtZXRob2RzLmluY2x1ZGVzKFwiUE9TVFwiKVxuXG4gIGlmICghYXRMZWFzdE9uZU1ldGhvZElzUG9zdCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIFwiQSByb3V0ZSB0aGF0IGFjY2VwdHMgbXVsdGlwbGUgbWV0aG9kcyBzaG91bGQgaW5jbHVkZSBhdCBsZWFzdCB0aGUgUE9TVCBtZXRob2QuXCJcbiAgICApXG4gIH1cblxuICBtZXRob2RzLmZvckVhY2goKG1ldGhvZCkgPT4ge1xuICAgIGlmIChtZXRob2QgPT09IFwiUE9TVFwiKSB7XG4gICAgICBtYXBwZWRNZXRob2RzW21ldGhvZF0gPSBmZXJuU2RrTWV0YWRhdGFcbiAgICB9IGVsc2Uge1xuICAgICAgbWFwcGVkTWV0aG9kc1ttZXRob2RdID0ge1xuICAgICAgICBcIngtZmVybi1pZ25vcmVcIjogdHJ1ZSxcbiAgICAgIH1cbiAgICB9XG4gIH0pXG5cbiAgcmV0dXJuIG1hcHBlZE1ldGhvZHNcbn1cbiIsICJpbXBvcnQgKiBhcyBmcyBmcm9tIFwibm9kZTpmcy9wcm9taXNlc1wiXG5pbXBvcnQgeyBwYXJzZVJvdXRlc0luUGFja2FnZSB9IGZyb20gXCIuLi9saWIvcGFyc2Utcm91dGVzLWluLXBhY2thZ2VcIlxuaW1wb3J0IHsgem9kVG9UcywgcHJpbnROb2RlIH0gZnJvbSBcInpvZC10by10c1wiXG5pbXBvcnQgcHJldHRpZXIgZnJvbSBcInByZXR0aWVyXCJcbmltcG9ydCB7IHosIFpvZEVmZmVjdHMsIFpvZE9wdGlvbmFsIH0gZnJvbSBcInpvZFwiXG5cbmludGVyZmFjZSBHZW5lcmF0ZVJvdXRlVHlwZXNPcHRzIHtcbiAgcGFja2FnZURpcjogc3RyaW5nXG4gIG91dHB1dEZpbGU/OiBzdHJpbmdcbiAgcGF0aEdsb2I/OiBzdHJpbmdcbiAgYXBpUHJlZml4Pzogc3RyaW5nXG4gIG1hcEZpbGVQYXRoVG9IVFRQUm91dGU/OiAoZmlsZV9wYXRoOiBzdHJpbmcpID0+IHN0cmluZ1xuICAvKipcbiAgICogSWYgcHJvdmlkZWQsIG9ubHkgcm91dGVzIHRoYXQgcmV0dXJuIHRydWUgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgZ2VuZXJhdGVkIHR5cGVzLlxuICAgKi9cbiAgZmlsdGVyUm91dGVzPzogKHJvdXRlOiBzdHJpbmcpID0+IGJvb2xlYW5cbn1cblxuZXhwb3J0IGNvbnN0IGdlbmVyYXRlUm91dGVUeXBlcyA9IGFzeW5jIChvcHRzOiBHZW5lcmF0ZVJvdXRlVHlwZXNPcHRzKSA9PiB7XG4gIGNvbnN0IGZpbGVwYXRoVG9Sb3V0ZSA9IGF3YWl0IHBhcnNlUm91dGVzSW5QYWNrYWdlKG9wdHMpXG5cbiAgY29uc3Qgc29ydGVkUm91dGVzID0gQXJyYXkuZnJvbShmaWxlcGF0aFRvUm91dGUuZW50cmllcygpKS5zb3J0KChhLCBiKSA9PlxuICAgIGFbMV0ucm91dGUubG9jYWxlQ29tcGFyZShiWzFdLnJvdXRlKVxuICApXG4gIGNvbnN0IGZpbHRlcmVkUm91dGVzID0gc29ydGVkUm91dGVzLmZpbHRlcihcbiAgICAoW18sIHsgcm91dGUgfV0pID0+ICFvcHRzLmZpbHRlclJvdXRlcyB8fCBvcHRzLmZpbHRlclJvdXRlcyhyb3V0ZSlcbiAgKVxuXG4gIC8vIFRPRE8gd2hlbiBsZXNzIGxhenksIHVzZSB0cy1tb3JwaCBmb3IgYmV0dGVyIGdlbmVyYXRpb25cbiAgY29uc3Qgcm91dGVEZWZzOiBzdHJpbmdbXSA9IFtdXG4gIGZvciAoY29uc3QgW18sIHsgcm91dGUsIHJvdXRlU3BlYywgc2V0dXBQYXJhbXMgfV0gb2YgZmlsdGVyZWRSb3V0ZXMpIHtcbiAgICBjb25zdCBxdWVyeUtleXMgPSBPYmplY3Qua2V5cyhyb3V0ZVNwZWMucXVlcnlQYXJhbXM/LnNoYXBlID8/IHt9KVxuICAgIGNvbnN0IHBhdGhQYXJhbWV0ZXJzID0gcXVlcnlLZXlzLmZpbHRlcigoa2V5KSA9PiByb3V0ZS5pbmNsdWRlcyhgWyR7a2V5fV1gKSlcblxuICAgIC8vIHF1ZXJ5UGFyYW1zIG1pZ2h0IGJlIGEgWm9kRWZmZWN0cyBvciBab2RPcHRpb25hbCBpbiBzb21lIGNhc2VzXG4gICAgbGV0IHF1ZXJ5UGFyYW1zID0gcm91dGVTcGVjLnF1ZXJ5UGFyYW1zXG4gICAgd2hpbGUgKFxuICAgICAgcXVlcnlQYXJhbXMgJiZcbiAgICAgIChcInNvdXJjZVR5cGVcIiBpbiBxdWVyeVBhcmFtcyB8fCBcInVud3JhcFwiIGluIHF1ZXJ5UGFyYW1zKVxuICAgICkge1xuICAgICAgaWYgKFwic291cmNlVHlwZVwiIGluIHF1ZXJ5UGFyYW1zKSB7XG4gICAgICAgIHF1ZXJ5UGFyYW1zID0gKHF1ZXJ5UGFyYW1zIGFzIHVua25vd24gYXMgWm9kRWZmZWN0czxhbnk+KS5zb3VyY2VUeXBlKClcbiAgICAgIH0gZWxzZSBpZiAoXCJ1bndyYXBcIiBpbiBxdWVyeVBhcmFtcykge1xuICAgICAgICBxdWVyeVBhcmFtcyA9IChxdWVyeVBhcmFtcyBhcyB1bmtub3duIGFzIFpvZE9wdGlvbmFsPGFueT4pLnVud3JhcCgpXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgcXVlcnlQYXJhbXNTY2hlbWFXaXRob3V0UGF0aFBhcmFtZXRlcnMgPSBxdWVyeVBhcmFtcz8ub21pdChcbiAgICAgIE9iamVjdC5mcm9tRW50cmllcyhwYXRoUGFyYW1ldGVycy5tYXAoKHBhcmFtKSA9PiBbcGFyYW0sIHRydWVdKSlcbiAgICApXG5cbiAgICByb3V0ZURlZnMucHVzaChcbiAgICAgIGBcblwiJHtyb3V0ZX1cIjoge1xuICByb3V0ZTogXCIke3JvdXRlfVwiLFxuICBtZXRob2Q6ICR7cm91dGVTcGVjLm1ldGhvZHMubWFwKChtKSA9PiBgXCIke219XCJgKS5qb2luKFwiIHwgXCIpfSxcbiAgcXVlcnlQYXJhbXM6ICR7XG4gICAgcXVlcnlQYXJhbXNTY2hlbWFXaXRob3V0UGF0aFBhcmFtZXRlcnNcbiAgICAgID8gcHJpbnROb2RlKHpvZFRvVHMocXVlcnlQYXJhbXNTY2hlbWFXaXRob3V0UGF0aFBhcmFtZXRlcnMpLm5vZGUpXG4gICAgICA6IFwie31cIlxuICB9LFxuICBqc29uQm9keTogJHtcbiAgICByb3V0ZVNwZWMuanNvbkJvZHkgPyBwcmludE5vZGUoem9kVG9Ucyhyb3V0ZVNwZWMuanNvbkJvZHkpLm5vZGUpIDogXCJ7fVwiXG4gIH0sXG4gIGNvbW1vblBhcmFtczogJHtcbiAgICByb3V0ZVNwZWMuY29tbW9uUGFyYW1zXG4gICAgICA/IHByaW50Tm9kZSh6b2RUb1RzKHJvdXRlU3BlYy5jb21tb25QYXJhbXMpLm5vZGUpXG4gICAgICA6IFwie31cIlxuICB9LFxuICBmb3JtRGF0YTogJHtcbiAgICByb3V0ZVNwZWMuZm9ybURhdGEgPyBwcmludE5vZGUoem9kVG9Ucyhyb3V0ZVNwZWMuZm9ybURhdGEpLm5vZGUpIDogXCJ7fVwiXG4gIH0sXG4gIGpzb25SZXNwb25zZTogJHtcbiAgICByb3V0ZVNwZWMuanNvblJlc3BvbnNlXG4gICAgICA/IHByaW50Tm9kZShcbiAgICAgICAgICB6b2RUb1RzKFxuICAgICAgICAgICAgc2V0dXBQYXJhbXMuYWRkT2tTdGF0dXNcbiAgICAgICAgICAgICAgPyByb3V0ZVNwZWMuanNvblJlc3BvbnNlLmV4dGVuZCh7IG9rOiB6LmJvb2xlYW4oKSB9KVxuICAgICAgICAgICAgICA6IHJvdXRlU3BlYy5qc29uUmVzcG9uc2VcbiAgICAgICAgICApLm5vZGVcbiAgICAgICAgKVxuICAgICAgOiBcInt9XCJcbiAgfVxufWAudHJpbSgpXG4gICAgKVxuICB9XG4gIGNvbnN0IHJvdXRlRGVmU3RyID0gcm91dGVEZWZzLmpvaW4oXCIsXFxuXCIpXG4gIGNvbnN0IG91dHB1dCA9IGF3YWl0IHByZXR0aWVyLmZvcm1hdChcbiAgICBgZXhwb3J0IHR5cGUgUm91dGVzID0ge1xuJHtyb3V0ZURlZlN0cn1cbn1cblxuZXhwb3J0IHR5cGUgUm91dGVSZXNwb25zZTxQYXRoIGV4dGVuZHMga2V5b2YgUm91dGVzPiA9XG4gIFJvdXRlc1tQYXRoXVtcImpzb25SZXNwb25zZVwiXVxuXG5leHBvcnQgdHlwZSBSb3V0ZVJlcXVlc3RCb2R5PFBhdGggZXh0ZW5kcyBrZXlvZiBSb3V0ZXM+ID1cbiAgUm91dGVzW1BhdGhdW1wianNvbkJvZHlcIl0gJiBSb3V0ZXNbUGF0aF1bXCJjb21tb25QYXJhbXNcIl1cblxuZXhwb3J0IHR5cGUgUm91dGVSZXF1ZXN0UGFyYW1zPFBhdGggZXh0ZW5kcyBrZXlvZiBSb3V0ZXM+ID1cbiAgUm91dGVzW1BhdGhdW1wicXVlcnlQYXJhbXNcIl0gJiBSb3V0ZXNbUGF0aF1bXCJjb21tb25QYXJhbXNcIl1cbmAudHJpbSgpLFxuICAgIHsgc2VtaTogZmFsc2UsIHBhcnNlcjogXCJ0eXBlc2NyaXB0XCIgfVxuICApXG5cbiAgaWYgKG9wdHMub3V0cHV0RmlsZSkge1xuICAgIGF3YWl0IGZzLndyaXRlRmlsZShvcHRzLm91dHB1dEZpbGUsIG91dHB1dClcbiAgfVxuXG4gIHJldHVybiBvdXRwdXRcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7OztBQ0FBO0FBQUEscURBQUFBLFNBQUE7QUFBQTtBQUFBO0FBRUEsSUFBQUEsUUFBTyxVQUFVLElBQUksZUFBZTtBQUNuQyxhQUFPLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxFQUFFLE9BQU8sR0FBRyxVQUFVLENBQUMsQ0FBQztBQUFBLElBQzdDO0FBQUE7QUFBQTs7O0FDSkE7QUFB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QUFLLEtBQUs7QUFBQSxpQkFFekQsNkNBQ0ksZ0NBQVUsMEJBQVEsc0NBQXNDLEVBQUUsSUFBSSxJQUM5RDtBQUFBLGNBR0osVUFBVSxlQUFXLGdDQUFVLDBCQUFRLFVBQVUsUUFBUSxFQUFFLElBQUksSUFBSTtBQUFBLGtCQUduRSxVQUFVLG1CQUNOLGdDQUFVLDBCQUFRLFVBQVUsWUFBWSxFQUFFLElBQUksSUFDOUM7QUFBQSxjQUdKLFVBQVUsZUFBVyxnQ0FBVSwwQkFBUSxVQUFVLFFBQVEsRUFBRSxJQUFJLElBQUk7QUFBQSxrQkFHbkUsVUFBVSxtQkFDTjtBQUFBLFlBQ0U7QUFBQSxVQUNFLFlBQVksY0FDUixVQUFVLGFBQWEsT0FBTyxFQUFFLElBQUksY0FBRSxRQUFRLEVBQUUsQ0FBQyxJQUNqRCxVQUFVO0FBQUEsUUFDaEIsRUFBRTtBQUFBLE1BQ0osSUFDQTtBQUFBLEdBRUwsS0FBSztBQUFBLElBQ0o7QUFBQSxFQUNGO0FBQ0EsUUFBTSxjQUFjLFVBQVUsS0FBSyxLQUFLO0FBQ3hDLFFBQU0sU0FBUyxNQUFNLGdCQUFBQyxRQUFTO0FBQUEsSUFDNUI7QUFBQSxFQUNGO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVdBLEtBQUs7QUFBQSxJQUNILEVBQUUsTUFBTSxPQUFPLFFBQVEsYUFBYTtBQUFBLEVBQ3RDO0FBRUEsTUFBSSxLQUFLLFlBQVk7QUFDbkIsVUFBUyxjQUFVLEtBQUssWUFBWSxNQUFNO0FBQUEsRUFDNUM7QUFFQSxTQUFPO0FBQ1Q7IiwKICAibmFtZXMiOiBbIm1vZHVsZSIsICJtb2R1bGUiLCAicGF0aCIsICJtb2R1bGUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJnbG9iYnkiLCAibm9kZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJtYXgiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJpbmRleCIsICJtb2R1bGUiLCAicmVxdWlyZV9jb25zdGFudHMiLCAibW9kdWxlIiwgInBhdGgiLCAicmVxdWlyZV91dGlscyIsICJwYXRoIiwgIm1vZHVsZSIsICJyZXF1aXJlX3BhcnNlIiwgIm1vZHVsZSIsICJvcHRzIiwgInZhbHVlIiwgInJlc3QiLCAic291cmNlIiwgIm1vZHVsZSIsICJwYXRoIiwgInN0YXRlIiwgInJlcXVpcmVfcGljb21hdGNoIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAicGF0aCIsICJyZXF1aXJlX3V0aWxzIiwgImZzIiwgInBhdGgiLCAicGF0aCIsICJwYXRoIiwgInJlcXVpcmVfZnMiLCAiZnMiLCAiZnMiLCAicGF0aCIsICJtb2R1bGUiLCAibW9kdWxlIiwgInF1ZXVlTWljcm90YXNrIiwgInJlcXVpcmVfY29uc3RhbnRzIiwgInJlcXVpcmVfZnMiLCAicmVxdWlyZV91dGlscyIsICJmcyIsICJyZXF1aXJlX2FzeW5jIiwgInBhdGgiLCAicmVxdWlyZV9zeW5jIiwgInJlcXVpcmVfZnMiLCAiZnMiLCAicmVxdWlyZV9zZXR0aW5ncyIsICJwYXRoIiwgImZzIiwgInJlcXVpcmVfb3V0IiwgInBhdGgiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJyZXF1aXJlX2NvbW1vbiIsICJyZXF1aXJlX2FzeW5jIiwgInJlcXVpcmVfYXN5bmMiLCAicmVxdWlyZV9zdHJlYW0iLCAicmVxdWlyZV9zeW5jIiwgInJlcXVpcmVfc3luYyIsICJyZXF1aXJlX3NldHRpbmdzIiwgInBhdGgiLCAicmVxdWlyZV9vdXQiLCAicmVxdWlyZV9yZWFkZXIiLCAicGF0aCIsICJyZXF1aXJlX3N0cmVhbSIsICJyZXF1aXJlX2FzeW5jIiwgInJlcXVpcmVfZW50cnkiLCAicGF0aCIsICJyZXF1aXJlX2FzeW5jIiwgInJlcXVpcmVfc3RyZWFtIiwgInJlcXVpcmVfc3luYyIsICJyZXF1aXJlX3N5bmMiLCAicmVxdWlyZV9zZXR0aW5ncyIsICJmcyIsICJvcyIsICJyZXF1aXJlX291dCIsICJtb2R1bGUiLCAiRmFzdEdsb2IiLCAiZnMiLCAibW9kdWxlIiwgInBhdGgiLCAibW9kdWxlIiwgIl8iLCAicGF0aCIsICJtb2R1bGUiLCAicGF0aCIsICJtb2R1bGUiLCAiZnMiLCAicGF0aCIsICJtb2R1bGUiLCAibW9kdWxlIiwgImZzIiwgInBhdHRlcm4iLCAidGFza3MiLCAicHJvY2VzcyIsICJvcyIsICJ0dHkiLCAic3R5bGVzIiwgImNoYWxrIiwgInN0eWxlcyIsICJwYXRoIiwgInBhdGgiLCAiZ2xvYmJ5IiwgIl8iLCAicGF0aCIsICJwYXRoIiwgIl9hIiwgImZzIiwgImZzIiwgImltcG9ydF96b2QiLCAiXyIsICJwcmV0dGllciJdCn0K
|
|
7458
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3RzdXAvYXNzZXRzL2Nqc19zaGltcy5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvdHMtZGVlcG1lcmdlL2Nqcy9pbmRleC5qcyIsICIuLi8uLi8uLi96b2Qtb3BlbmFwaS9zcmMvbGliL3pvZC1vcGVuYXBpLnRzIiwgIi4uLy4uLy4uL3pvZC1vcGVuYXBpL3NyYy9saWIvem9kLWV4dGVuc2lvbnMudHMiLCAiLi4vLi4vLi4vem9kLW9wZW5hcGkvc3JjL2luZGV4LnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9tZXJnZTIvaW5kZXguanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL2Zhc3QtZ2xvYi9vdXQvdXRpbHMvYXJyYXkuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL2Zhc3QtZ2xvYi9vdXQvdXRpbHMvZXJybm8uanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL2Zhc3QtZ2xvYi9vdXQvdXRpbHMvZnMuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL2Zhc3QtZ2xvYi9vdXQvdXRpbHMvcGF0aC5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvaXMtZXh0Z2xvYi9pbmRleC5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvaXMtZ2xvYi9pbmRleC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvZmFzdC1nbG9iL25vZGVfbW9kdWxlcy9nbG9iLXBhcmVudC9pbmRleC5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvYnJhY2VzL2xpYi91dGlscy5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvYnJhY2VzL2xpYi9zdHJpbmdpZnkuanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2lzLW51bWJlci9pbmRleC5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvdG8tcmVnZXgtcmFuZ2UvaW5kZXguanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2ZpbGwtcmFuZ2UvaW5kZXguanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2JyYWNlcy9saWIvY29tcGlsZS5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvYnJhY2VzL2xpYi9leHBhbmQuanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2JyYWNlcy9saWIvY29uc3RhbnRzLmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9icmFjZXMvbGliL3BhcnNlLmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9icmFjZXMvaW5kZXguanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3BpY29tYXRjaC9saWIvY29uc3RhbnRzLmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9waWNvbWF0Y2gvbGliL3V0aWxzLmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9waWNvbWF0Y2gvbGliL3NjYW4uanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3BpY29tYXRjaC9saWIvcGFyc2UuanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3BpY29tYXRjaC9saWIvcGljb21hdGNoLmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9waWNvbWF0Y2gvaW5kZXguanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL21pY3JvbWF0Y2gvaW5kZXguanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL2Zhc3QtZ2xvYi9vdXQvdXRpbHMvcGF0dGVybi5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvZmFzdC1nbG9iL291dC91dGlscy9zdHJlYW0uanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL2Zhc3QtZ2xvYi9vdXQvdXRpbHMvc3RyaW5nLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9mYXN0LWdsb2Ivb3V0L3V0aWxzL2luZGV4LmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9mYXN0LWdsb2Ivb3V0L21hbmFnZXJzL3Rhc2tzLmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9Abm9kZWxpYi9mcy5zdGF0L291dC9wcm92aWRlcnMvYXN5bmMuanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0Bub2RlbGliL2ZzLnN0YXQvb3V0L3Byb3ZpZGVycy9zeW5jLmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9Abm9kZWxpYi9mcy5zdGF0L291dC9hZGFwdGVycy9mcy5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQG5vZGVsaWIvZnMuc3RhdC9vdXQvc2V0dGluZ3MuanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0Bub2RlbGliL2ZzLnN0YXQvb3V0L2luZGV4LmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9xdWV1ZS1taWNyb3Rhc2svaW5kZXguanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3J1bi1wYXJhbGxlbC9pbmRleC5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQG5vZGVsaWIvZnMuc2NhbmRpci9vdXQvY29uc3RhbnRzLmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9Abm9kZWxpYi9mcy5zY2FuZGlyL291dC91dGlscy9mcy5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQG5vZGVsaWIvZnMuc2NhbmRpci9vdXQvdXRpbHMvaW5kZXguanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0Bub2RlbGliL2ZzLnNjYW5kaXIvb3V0L3Byb3ZpZGVycy9jb21tb24uanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0Bub2RlbGliL2ZzLnNjYW5kaXIvb3V0L3Byb3ZpZGVycy9hc3luYy5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQG5vZGVsaWIvZnMuc2NhbmRpci9vdXQvcHJvdmlkZXJzL3N5bmMuanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0Bub2RlbGliL2ZzLnNjYW5kaXIvb3V0L2FkYXB0ZXJzL2ZzLmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9Abm9kZWxpYi9mcy5zY2FuZGlyL291dC9zZXR0aW5ncy5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQG5vZGVsaWIvZnMuc2NhbmRpci9vdXQvaW5kZXguanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3JldXNpZnkvcmV1c2lmeS5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvZmFzdHEvcXVldWUuanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0Bub2RlbGliL2ZzLndhbGsvb3V0L3JlYWRlcnMvY29tbW9uLmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9Abm9kZWxpYi9mcy53YWxrL291dC9yZWFkZXJzL3JlYWRlci5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQG5vZGVsaWIvZnMud2Fsay9vdXQvcmVhZGVycy9hc3luYy5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQG5vZGVsaWIvZnMud2Fsay9vdXQvcHJvdmlkZXJzL2FzeW5jLmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9Abm9kZWxpYi9mcy53YWxrL291dC9wcm92aWRlcnMvc3RyZWFtLmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9Abm9kZWxpYi9mcy53YWxrL291dC9yZWFkZXJzL3N5bmMuanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0Bub2RlbGliL2ZzLndhbGsvb3V0L3Byb3ZpZGVycy9zeW5jLmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9Abm9kZWxpYi9mcy53YWxrL291dC9zZXR0aW5ncy5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQG5vZGVsaWIvZnMud2Fsay9vdXQvaW5kZXguanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL2Zhc3QtZ2xvYi9vdXQvcmVhZGVycy9yZWFkZXIuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL2Zhc3QtZ2xvYi9vdXQvcmVhZGVycy9zdHJlYW0uanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL2Zhc3QtZ2xvYi9vdXQvcmVhZGVycy9hc3luYy5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvZmFzdC1nbG9iL291dC9wcm92aWRlcnMvbWF0Y2hlcnMvbWF0Y2hlci5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvZmFzdC1nbG9iL291dC9wcm92aWRlcnMvbWF0Y2hlcnMvcGFydGlhbC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvZmFzdC1nbG9iL291dC9wcm92aWRlcnMvZmlsdGVycy9kZWVwLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9mYXN0LWdsb2Ivb3V0L3Byb3ZpZGVycy9maWx0ZXJzL2VudHJ5LmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9mYXN0LWdsb2Ivb3V0L3Byb3ZpZGVycy9maWx0ZXJzL2Vycm9yLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9mYXN0LWdsb2Ivb3V0L3Byb3ZpZGVycy90cmFuc2Zvcm1lcnMvZW50cnkuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL2Zhc3QtZ2xvYi9vdXQvcHJvdmlkZXJzL3Byb3ZpZGVyLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9mYXN0LWdsb2Ivb3V0L3Byb3ZpZGVycy9hc3luYy5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvZmFzdC1nbG9iL291dC9wcm92aWRlcnMvc3RyZWFtLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9mYXN0LWdsb2Ivb3V0L3JlYWRlcnMvc3luYy5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvZmFzdC1nbG9iL291dC9wcm92aWRlcnMvc3luYy5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvZmFzdC1nbG9iL291dC9zZXR0aW5ncy5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvZmFzdC1nbG9iL291dC9pbmRleC5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvcGF0aC10eXBlL2luZGV4LmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9kaXItZ2xvYi9pbmRleC5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvaWdub3JlL2luZGV4LmpzIiwgIi4uLy4uL3NyYy9nZW5lcmF0b3JzL2luZGV4LnRzIiwgIi4uLy4uL3NyYy9nZW5lcmF0b3JzL2dlbmVyYXRlLW9wZW5hcGkvaW5kZXgudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL2NoYWxrL3NvdXJjZS9pbmRleC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvY2hhbGsvc291cmNlL3ZlbmRvci9hbnNpLXN0eWxlcy9pbmRleC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvY2hhbGsvc291cmNlL3ZlbmRvci9zdXBwb3J0cy1jb2xvci9pbmRleC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvY2hhbGsvc291cmNlL3V0aWxpdGllcy5qcyIsICIuLi8uLi9zcmMvZ2VuZXJhdG9ycy9saWIvcGFyc2Utcm91dGVzLWluLXBhY2thZ2UudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL2dsb2JieS9pbmRleC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvZ2xvYmJ5L2lnbm9yZS5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvc2xhc2gvaW5kZXguanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL2dsb2JieS91dGlsaXRpZXMuanMiLCAiLi4vLi4vc3JjL2dlbmVyYXRvcnMvbGliL2RlZmF1bHQtbWFwLWZpbGUtcGF0aC10by1odHRwLXJvdXRlLnRzIiwgIi4uLy4uL3NyYy9nZW5lcmF0b3JzL2dlbmVyYXRlLW9wZW5hcGkvZW1iZWQtc2NoZW1hLXJlZmVyZW5jZXMudHMiLCAiLi4vLi4vc3JjL2dlbmVyYXRvcnMvZ2VuZXJhdGUtb3BlbmFwaS9mZXJuLXNkay11dGlscy50cyIsICIuLi8uLi9zcmMvZ2VuZXJhdG9ycy9nZW5lcmF0ZS1yb3V0ZS10eXBlcy9pbmRleC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLy8gU2hpbSBnbG9iYWxzIGluIGNqcyBidW5kbGVcbi8vIFRoZXJlJ3MgYSB3ZWlyZCBidWcgdGhhdCBlc2J1aWxkIHdpbGwgYWx3YXlzIGluamVjdCBpbXBvcnRNZXRhVXJsXG4vLyBpZiB3ZSBleHBvcnQgaXQgYXMgYGNvbnN0IGltcG9ydE1ldGFVcmwgPSAuLi4gX19maWxlbmFtZSAuLi5gXG4vLyBCdXQgdXNpbmcgYSBmdW5jdGlvbiB3aWxsIG5vdCBjYXVzZSB0aGlzIGlzc3VlXG5cbmNvbnN0IGdldEltcG9ydE1ldGFVcmwgPSAoKSA9PlxuICB0eXBlb2YgZG9jdW1lbnQgPT09ICd1bmRlZmluZWQnXG4gICAgPyBuZXcgVVJMKCdmaWxlOicgKyBfX2ZpbGVuYW1lKS5ocmVmXG4gICAgOiAoZG9jdW1lbnQuY3VycmVudFNjcmlwdCAmJiBkb2N1bWVudC5jdXJyZW50U2NyaXB0LnNyYykgfHxcbiAgICAgIG5ldyBVUkwoJ21haW4uanMnLCBkb2N1bWVudC5iYXNlVVJJKS5ocmVmXG5cbmV4cG9ydCBjb25zdCBpbXBvcnRNZXRhVXJsID0gLyogQF9fUFVSRV9fICovIGdldEltcG9ydE1ldGFVcmwoKVxuIiwgIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuLy8gaXN0YW5idWwgaWdub3JlIG5leHRcbmNvbnN0IGlzT2JqZWN0ID0gKG9iaikgPT4ge1xuICAgIGlmICh0eXBlb2Ygb2JqID09PSBcIm9iamVjdFwiICYmIG9iaiAhPT0gbnVsbCkge1xuICAgICAgICBpZiAodHlwZW9mIE9iamVjdC5nZXRQcm90b3R5cGVPZiA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICBjb25zdCBwcm90b3R5cGUgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Yob2JqKTtcbiAgICAgICAgICAgIHJldHVybiBwcm90b3R5cGUgPT09IE9iamVjdC5wcm90b3R5cGUgfHwgcHJvdG90eXBlID09PSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqKSA9PT0gXCJbb2JqZWN0IE9iamVjdF1cIjtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufTtcbmNvbnN0IG1lcmdlID0gKC4uLm9iamVjdHMpID0+IG9iamVjdHMucmVkdWNlKChyZXN1bHQsIGN1cnJlbnQpID0+IHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShjdXJyZW50KSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQXJndW1lbnRzIHByb3ZpZGVkIHRvIHRzLWRlZXBtZXJnZSBtdXN0IGJlIG9iamVjdHMsIG5vdCBhcnJheXMuXCIpO1xuICAgIH1cbiAgICBPYmplY3Qua2V5cyhjdXJyZW50KS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgaWYgKFtcIl9fcHJvdG9fX1wiLCBcImNvbnN0cnVjdG9yXCIsIFwicHJvdG90eXBlXCJdLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShyZXN1bHRba2V5XSkgJiYgQXJyYXkuaXNBcnJheShjdXJyZW50W2tleV0pKSB7XG4gICAgICAgICAgICByZXN1bHRba2V5XSA9IG1lcmdlLm9wdGlvbnMubWVyZ2VBcnJheXNcbiAgICAgICAgICAgICAgICA/IG1lcmdlLm9wdGlvbnMudW5pcXVlQXJyYXlJdGVtc1xuICAgICAgICAgICAgICAgICAgICA/IEFycmF5LmZyb20obmV3IFNldChyZXN1bHRba2V5XS5jb25jYXQoY3VycmVudFtrZXldKSkpXG4gICAgICAgICAgICAgICAgICAgIDogWy4uLnJlc3VsdFtrZXldLCAuLi5jdXJyZW50W2tleV1dXG4gICAgICAgICAgICAgICAgOiBjdXJyZW50W2tleV07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNPYmplY3QocmVzdWx0W2tleV0pICYmIGlzT2JqZWN0KGN1cnJlbnRba2V5XSkpIHtcbiAgICAgICAgICAgIHJlc3VsdFtrZXldID0gbWVyZ2UocmVzdWx0W2tleV0sIGN1cnJlbnRba2V5XSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXN1bHRba2V5XSA9XG4gICAgICAgICAgICAgICAgY3VycmVudFtrZXldID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICAgICAgPyBtZXJnZS5vcHRpb25zLmFsbG93VW5kZWZpbmVkT3ZlcnJpZGVzXG4gICAgICAgICAgICAgICAgICAgICAgICA/IGN1cnJlbnRba2V5XVxuICAgICAgICAgICAgICAgICAgICAgICAgOiByZXN1bHRba2V5XVxuICAgICAgICAgICAgICAgICAgICA6IGN1cnJlbnRba2V5XTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQ7XG59LCB7fSk7XG5jb25zdCBkZWZhdWx0T3B0aW9ucyA9IHtcbiAgICBhbGxvd1VuZGVmaW5lZE92ZXJyaWRlczogdHJ1ZSxcbiAgICBtZXJnZUFycmF5czogdHJ1ZSxcbiAgICB1bmlxdWVBcnJheUl0ZW1zOiB0cnVlLFxufTtcbm1lcmdlLm9wdGlvbnMgPSBkZWZhdWx0T3B0aW9ucztcbm1lcmdlLndpdGhPcHRpb25zID0gKG9wdGlvbnMsIC4uLm9iamVjdHMpID0+IHtcbiAgICBtZXJnZS5vcHRpb25zID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBkZWZhdWx0T3B0aW9ucyksIG9wdGlvbnMpO1xuICAgIGNvbnN0IHJlc3VsdCA9IG1lcmdlKC4uLm9iamVjdHMpO1xuICAgIG1lcmdlLm9wdGlvbnMgPSBkZWZhdWx0T3B0aW9ucztcbiAgICByZXR1cm4gcmVzdWx0O1xufTtcbmV4cG9ydHMuZGVmYXVsdCA9IG1lcmdlO1xuIiwgbnVsbCwgbnVsbCwgbnVsbCwgIid1c2Ugc3RyaWN0J1xuLypcbiAqIG1lcmdlMlxuICogaHR0cHM6Ly9naXRodWIuY29tL3RlYW1iaXRpb24vbWVyZ2UyXG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDE0LTIwMjAgVGVhbWJpdGlvblxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuICovXG5jb25zdCBTdHJlYW0gPSByZXF1aXJlKCdzdHJlYW0nKVxuY29uc3QgUGFzc1Rocm91Z2ggPSBTdHJlYW0uUGFzc1Rocm91Z2hcbmNvbnN0IHNsaWNlID0gQXJyYXkucHJvdG90eXBlLnNsaWNlXG5cbm1vZHVsZS5leHBvcnRzID0gbWVyZ2UyXG5cbmZ1bmN0aW9uIG1lcmdlMiAoKSB7XG4gIGNvbnN0IHN0cmVhbXNRdWV1ZSA9IFtdXG4gIGNvbnN0IGFyZ3MgPSBzbGljZS5jYWxsKGFyZ3VtZW50cylcbiAgbGV0IG1lcmdpbmcgPSBmYWxzZVxuICBsZXQgb3B0aW9ucyA9IGFyZ3NbYXJncy5sZW5ndGggLSAxXVxuXG4gIGlmIChvcHRpb25zICYmICFBcnJheS5pc0FycmF5KG9wdGlvbnMpICYmIG9wdGlvbnMucGlwZSA9PSBudWxsKSB7XG4gICAgYXJncy5wb3AoKVxuICB9IGVsc2Uge1xuICAgIG9wdGlvbnMgPSB7fVxuICB9XG5cbiAgY29uc3QgZG9FbmQgPSBvcHRpb25zLmVuZCAhPT0gZmFsc2VcbiAgY29uc3QgZG9QaXBlRXJyb3IgPSBvcHRpb25zLnBpcGVFcnJvciA9PT0gdHJ1ZVxuICBpZiAob3B0aW9ucy5vYmplY3RNb2RlID09IG51bGwpIHtcbiAgICBvcHRpb25zLm9iamVjdE1vZGUgPSB0cnVlXG4gIH1cbiAgaWYgKG9wdGlvbnMuaGlnaFdhdGVyTWFyayA9PSBudWxsKSB7XG4gICAgb3B0aW9ucy5oaWdoV2F0ZXJNYXJrID0gNjQgKiAxMDI0XG4gIH1cbiAgY29uc3QgbWVyZ2VkU3RyZWFtID0gUGFzc1Rocm91Z2gob3B0aW9ucylcblxuICBmdW5jdGlvbiBhZGRTdHJlYW0gKCkge1xuICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIHN0cmVhbXNRdWV1ZS5wdXNoKHBhdXNlU3RyZWFtcyhhcmd1bWVudHNbaV0sIG9wdGlvbnMpKVxuICAgIH1cbiAgICBtZXJnZVN0cmVhbSgpXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIGZ1bmN0aW9uIG1lcmdlU3RyZWFtICgpIHtcbiAgICBpZiAobWVyZ2luZykge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIG1lcmdpbmcgPSB0cnVlXG5cbiAgICBsZXQgc3RyZWFtcyA9IHN0cmVhbXNRdWV1ZS5zaGlmdCgpXG4gICAgaWYgKCFzdHJlYW1zKSB7XG4gICAgICBwcm9jZXNzLm5leHRUaWNrKGVuZFN0cmVhbSlcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoc3RyZWFtcykpIHtcbiAgICAgIHN0cmVhbXMgPSBbc3RyZWFtc11cbiAgICB9XG5cbiAgICBsZXQgcGlwZXNDb3VudCA9IHN0cmVhbXMubGVuZ3RoICsgMVxuXG4gICAgZnVuY3Rpb24gbmV4dCAoKSB7XG4gICAgICBpZiAoLS1waXBlc0NvdW50ID4gMCkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIG1lcmdpbmcgPSBmYWxzZVxuICAgICAgbWVyZ2VTdHJlYW0oKVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHBpcGUgKHN0cmVhbSkge1xuICAgICAgZnVuY3Rpb24gb25lbmQgKCkge1xuICAgICAgICBzdHJlYW0ucmVtb3ZlTGlzdGVuZXIoJ21lcmdlMlVucGlwZUVuZCcsIG9uZW5kKVxuICAgICAgICBzdHJlYW0ucmVtb3ZlTGlzdGVuZXIoJ2VuZCcsIG9uZW5kKVxuICAgICAgICBpZiAoZG9QaXBlRXJyb3IpIHtcbiAgICAgICAgICBzdHJlYW0ucmVtb3ZlTGlzdGVuZXIoJ2Vycm9yJywgb25lcnJvcilcbiAgICAgICAgfVxuICAgICAgICBuZXh0KClcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIG9uZXJyb3IgKGVycikge1xuICAgICAgICBtZXJnZWRTdHJlYW0uZW1pdCgnZXJyb3InLCBlcnIpXG4gICAgICB9XG4gICAgICAvLyBza2lwIGVuZGVkIHN0cmVhbVxuICAgICAgaWYgKHN0cmVhbS5fcmVhZGFibGVTdGF0ZS5lbmRFbWl0dGVkKSB7XG4gICAgICAgIHJldHVybiBuZXh0KClcbiAgICAgIH1cblxuICAgICAgc3RyZWFtLm9uKCdtZXJnZTJVbnBpcGVFbmQnLCBvbmVuZClcbiAgICAgIHN0cmVhbS5vbignZW5kJywgb25lbmQpXG5cbiAgICAgIGlmIChkb1BpcGVFcnJvcikge1xuICAgICAgICBzdHJlYW0ub24oJ2Vycm9yJywgb25lcnJvcilcbiAgICAgIH1cblxuICAgICAgc3RyZWFtLnBpcGUobWVyZ2VkU3RyZWFtLCB7IGVuZDogZmFsc2UgfSlcbiAgICAgIC8vIGNvbXBhdGlibGUgZm9yIG9sZCBzdHJlYW1cbiAgICAgIHN0cmVhbS5yZXN1bWUoKVxuICAgIH1cblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3RyZWFtcy5sZW5ndGg7IGkrKykge1xuICAgICAgcGlwZShzdHJlYW1zW2ldKVxuICAgIH1cblxuICAgIG5leHQoKVxuICB9XG5cbiAgZnVuY3Rpb24gZW5kU3RyZWFtICgpIHtcbiAgICBtZXJnaW5nID0gZmFsc2VcbiAgICAvLyBlbWl0ICdxdWV1ZURyYWluJyB3aGVuIGFsbCBzdHJlYW1zIG1lcmdlZC5cbiAgICBtZXJnZWRTdHJlYW0uZW1pdCgncXVldWVEcmFpbicpXG4gICAgaWYgKGRvRW5kKSB7XG4gICAgICBtZXJnZWRTdHJlYW0uZW5kKClcbiAgICB9XG4gIH1cblxuICBtZXJnZWRTdHJlYW0uc2V0TWF4TGlzdGVuZXJzKDApXG4gIG1lcmdlZFN0cmVhbS5hZGQgPSBhZGRTdHJlYW1cbiAgbWVyZ2VkU3RyZWFtLm9uKCd1bnBpcGUnLCBmdW5jdGlvbiAoc3RyZWFtKSB7XG4gICAgc3RyZWFtLmVtaXQoJ21lcmdlMlVucGlwZUVuZCcpXG4gIH0pXG5cbiAgaWYgKGFyZ3MubGVuZ3RoKSB7XG4gICAgYWRkU3RyZWFtLmFwcGx5KG51bGwsIGFyZ3MpXG4gIH1cbiAgcmV0dXJuIG1lcmdlZFN0cmVhbVxufVxuXG4vLyBjaGVjayBhbmQgcGF1c2Ugc3RyZWFtcyBmb3IgcGlwZS5cbmZ1bmN0aW9uIHBhdXNlU3RyZWFtcyAoc3RyZWFtcywgb3B0aW9ucykge1xuICBpZiAoIUFycmF5LmlzQXJyYXkoc3RyZWFtcykpIHtcbiAgICAvLyBCYWNrd2FyZHMtY29tcGF0IHdpdGggb2xkLXN0eWxlIHN0cmVhbXNcbiAgICBpZiAoIXN0cmVhbXMuX3JlYWRhYmxlU3RhdGUgJiYgc3RyZWFtcy5waXBlKSB7XG4gICAgICBzdHJlYW1zID0gc3RyZWFtcy5waXBlKFBhc3NUaHJvdWdoKG9wdGlvbnMpKVxuICAgIH1cbiAgICBpZiAoIXN0cmVhbXMuX3JlYWRhYmxlU3RhdGUgfHwgIXN0cmVhbXMucGF1c2UgfHwgIXN0cmVhbXMucGlwZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdPbmx5IHJlYWRhYmxlIHN0cmVhbSBjYW4gYmUgbWVyZ2VkLicpXG4gICAgfVxuICAgIHN0cmVhbXMucGF1c2UoKVxuICB9IGVsc2Uge1xuICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBzdHJlYW1zLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBzdHJlYW1zW2ldID0gcGF1c2VTdHJlYW1zKHN0cmVhbXNbaV0sIG9wdGlvbnMpXG4gICAgfVxuICB9XG4gIHJldHVybiBzdHJlYW1zXG59XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLnNwbGl0V2hlbiA9IGV4cG9ydHMuZmxhdHRlbiA9IHZvaWQgMDtcbmZ1bmN0aW9uIGZsYXR0ZW4oaXRlbXMpIHtcbiAgICByZXR1cm4gaXRlbXMucmVkdWNlKChjb2xsZWN0aW9uLCBpdGVtKSA9PiBbXS5jb25jYXQoY29sbGVjdGlvbiwgaXRlbSksIFtdKTtcbn1cbmV4cG9ydHMuZmxhdHRlbiA9IGZsYXR0ZW47XG5mdW5jdGlvbiBzcGxpdFdoZW4oaXRlbXMsIHByZWRpY2F0ZSkge1xuICAgIGNvbnN0IHJlc3VsdCA9IFtbXV07XG4gICAgbGV0IGdyb3VwSW5kZXggPSAwO1xuICAgIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykge1xuICAgICAgICBpZiAocHJlZGljYXRlKGl0ZW0pKSB7XG4gICAgICAgICAgICBncm91cEluZGV4Kys7XG4gICAgICAgICAgICByZXN1bHRbZ3JvdXBJbmRleF0gPSBbXTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJlc3VsdFtncm91cEluZGV4XS5wdXNoKGl0ZW0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5leHBvcnRzLnNwbGl0V2hlbiA9IHNwbGl0V2hlbjtcbiIsICJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuaXNFbm9lbnRDb2RlRXJyb3IgPSB2b2lkIDA7XG5mdW5jdGlvbiBpc0Vub2VudENvZGVFcnJvcihlcnJvcikge1xuICAgIHJldHVybiBlcnJvci5jb2RlID09PSAnRU5PRU5UJztcbn1cbmV4cG9ydHMuaXNFbm9lbnRDb2RlRXJyb3IgPSBpc0Vub2VudENvZGVFcnJvcjtcbiIsICJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuY3JlYXRlRGlyZW50RnJvbVN0YXRzID0gdm9pZCAwO1xuY2xhc3MgRGlyZW50RnJvbVN0YXRzIHtcbiAgICBjb25zdHJ1Y3RvcihuYW1lLCBzdGF0cykge1xuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICB0aGlzLmlzQmxvY2tEZXZpY2UgPSBzdGF0cy5pc0Jsb2NrRGV2aWNlLmJpbmQoc3RhdHMpO1xuICAgICAgICB0aGlzLmlzQ2hhcmFjdGVyRGV2aWNlID0gc3RhdHMuaXNDaGFyYWN0ZXJEZXZpY2UuYmluZChzdGF0cyk7XG4gICAgICAgIHRoaXMuaXNEaXJlY3RvcnkgPSBzdGF0cy5pc0RpcmVjdG9yeS5iaW5kKHN0YXRzKTtcbiAgICAgICAgdGhpcy5pc0ZJRk8gPSBzdGF0cy5pc0ZJRk8uYmluZChzdGF0cyk7XG4gICAgICAgIHRoaXMuaXNGaWxlID0gc3RhdHMuaXNGaWxlLmJpbmQoc3RhdHMpO1xuICAgICAgICB0aGlzLmlzU29ja2V0ID0gc3RhdHMuaXNTb2NrZXQuYmluZChzdGF0cyk7XG4gICAgICAgIHRoaXMuaXNTeW1ib2xpY0xpbmsgPSBzdGF0cy5pc1N5bWJvbGljTGluay5iaW5kKHN0YXRzKTtcbiAgICB9XG59XG5mdW5jdGlvbiBjcmVhdGVEaXJlbnRGcm9tU3RhdHMobmFtZSwgc3RhdHMpIHtcbiAgICByZXR1cm4gbmV3IERpcmVudEZyb21TdGF0cyhuYW1lLCBzdGF0cyk7XG59XG5leHBvcnRzLmNyZWF0ZURpcmVudEZyb21TdGF0cyA9IGNyZWF0ZURpcmVudEZyb21TdGF0cztcbiIsICJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuY29udmVydFBvc2l4UGF0aFRvUGF0dGVybiA9IGV4cG9ydHMuY29udmVydFdpbmRvd3NQYXRoVG9QYXR0ZXJuID0gZXhwb3J0cy5jb252ZXJ0UGF0aFRvUGF0dGVybiA9IGV4cG9ydHMuZXNjYXBlUG9zaXhQYXRoID0gZXhwb3J0cy5lc2NhcGVXaW5kb3dzUGF0aCA9IGV4cG9ydHMuZXNjYXBlID0gZXhwb3J0cy5yZW1vdmVMZWFkaW5nRG90U2VnbWVudCA9IGV4cG9ydHMubWFrZUFic29sdXRlID0gZXhwb3J0cy51bml4aWZ5ID0gdm9pZCAwO1xuY29uc3Qgb3MgPSByZXF1aXJlKFwib3NcIik7XG5jb25zdCBwYXRoID0gcmVxdWlyZShcInBhdGhcIik7XG5jb25zdCBJU19XSU5ET1dTX1BMQVRGT1JNID0gb3MucGxhdGZvcm0oKSA9PT0gJ3dpbjMyJztcbmNvbnN0IExFQURJTkdfRE9UX1NFR01FTlRfQ0hBUkFDVEVSU19DT1VOVCA9IDI7IC8vIC4vIG9yIC5cXFxcXG4vKipcbiAqIEFsbCBub24tZXNjYXBlZCBzcGVjaWFsIGNoYXJhY3RlcnMuXG4gKiBQb3NpeDogKCkqP1tcXF17fH0sICErQCBiZWZvcmUgKCwgISBhdCB0aGUgYmVnaW5uaW5nLCBcXFxcIGJlZm9yZSBub24tc3BlY2lhbCBjaGFyYWN0ZXJzLlxuICogV2luZG93czogKCl7fSwgIStAIGJlZm9yZSAoLCAhIGF0IHRoZSBiZWdpbm5pbmcuXG4gKi9cbmNvbnN0IFBPU0lYX1VORVNDQVBFRF9HTE9CX1NZTUJPTFNfUkUgPSAvKFxcXFw/KShbKCkqP1tcXF17fH1dfF4hfFshK0BdKD89XFwoKXxcXFxcKD8hWyEoKSorP0BbXFxde3x9XSkpL2c7XG5jb25zdCBXSU5ET1dTX1VORVNDQVBFRF9HTE9CX1NZTUJPTFNfUkUgPSAvKFxcXFw/KShbKCl7fV18XiF8WyErQF0oPz1cXCgpKS9nO1xuLyoqXG4gKiBUaGUgZGV2aWNlIHBhdGggKFxcXFwuXFwgb3IgXFxcXD9cXCkuXG4gKiBodHRwczovL2xlYXJuLm1pY3Jvc29mdC5jb20vZW4tdXMvZG90bmV0L3N0YW5kYXJkL2lvL2ZpbGUtcGF0aC1mb3JtYXRzI2Rvcy1kZXZpY2UtcGF0aHNcbiAqL1xuY29uc3QgRE9TX0RFVklDRV9QQVRIX1JFID0gL15cXFxcXFxcXChbLj9dKS87XG4vKipcbiAqIEFsbCBiYWNrc2xhc2hlcyBleGNlcHQgdGhvc2UgZXNjYXBpbmcgc3BlY2lhbCBjaGFyYWN0ZXJzLlxuICogV2luZG93czogISgpK0B7fVxuICogaHR0cHM6Ly9sZWFybi5taWNyb3NvZnQuY29tL2VuLXVzL3dpbmRvd3Mvd2luMzIvZmlsZWlvL25hbWluZy1hLWZpbGUjbmFtaW5nLWNvbnZlbnRpb25zXG4gKi9cbmNvbnN0IFdJTkRPV1NfQkFDS1NMQVNIRVNfUkUgPSAvXFxcXCg/IVshKCkrQHt9XSkvZztcbi8qKlxuICogRGVzaWduZWQgdG8gd29yayBvbmx5IHdpdGggc2ltcGxlIHBhdGhzOiBgZGlyXFxcXGZpbGVgLlxuICovXG5mdW5jdGlvbiB1bml4aWZ5KGZpbGVwYXRoKSB7XG4gICAgcmV0dXJuIGZpbGVwYXRoLnJlcGxhY2UoL1xcXFwvZywgJy8nKTtcbn1cbmV4cG9ydHMudW5peGlmeSA9IHVuaXhpZnk7XG5mdW5jdGlvbiBtYWtlQWJzb2x1dGUoY3dkLCBmaWxlcGF0aCkge1xuICAgIHJldHVybiBwYXRoLnJlc29sdmUoY3dkLCBmaWxlcGF0aCk7XG59XG5leHBvcnRzLm1ha2VBYnNvbHV0ZSA9IG1ha2VBYnNvbHV0ZTtcbmZ1bmN0aW9uIHJlbW92ZUxlYWRpbmdEb3RTZWdtZW50KGVudHJ5KSB7XG4gICAgLy8gV2UgZG8gbm90IHVzZSBgc3RhcnRzV2l0aGAgYmVjYXVzZSB0aGlzIGlzIDEweCBzbG93ZXIgdGhhbiBjdXJyZW50IGltcGxlbWVudGF0aW9uIGZvciBzb21lIGNhc2VzLlxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvcHJlZmVyLXN0cmluZy1zdGFydHMtZW5kcy13aXRoXG4gICAgaWYgKGVudHJ5LmNoYXJBdCgwKSA9PT0gJy4nKSB7XG4gICAgICAgIGNvbnN0IHNlY29uZENoYXJhY3RlcnkgPSBlbnRyeS5jaGFyQXQoMSk7XG4gICAgICAgIGlmIChzZWNvbmRDaGFyYWN0ZXJ5ID09PSAnLycgfHwgc2Vjb25kQ2hhcmFjdGVyeSA9PT0gJ1xcXFwnKSB7XG4gICAgICAgICAgICByZXR1cm4gZW50cnkuc2xpY2UoTEVBRElOR19ET1RfU0VHTUVOVF9DSEFSQUNURVJTX0NPVU5UKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZW50cnk7XG59XG5leHBvcnRzLnJlbW92ZUxlYWRpbmdEb3RTZWdtZW50ID0gcmVtb3ZlTGVhZGluZ0RvdFNlZ21lbnQ7XG5leHBvcnRzLmVzY2FwZSA9IElTX1dJTkRPV1NfUExBVEZPUk0gPyBlc2NhcGVXaW5kb3dzUGF0aCA6IGVzY2FwZVBvc2l4UGF0aDtcbmZ1bmN0aW9uIGVzY2FwZVdpbmRvd3NQYXRoKHBhdHRlcm4pIHtcbiAgICByZXR1cm4gcGF0dGVybi5yZXBsYWNlKFdJTkRPV1NfVU5FU0NBUEVEX0dMT0JfU1lNQk9MU19SRSwgJ1xcXFwkMicpO1xufVxuZXhwb3J0cy5lc2NhcGVXaW5kb3dzUGF0aCA9IGVzY2FwZVdpbmRvd3NQYXRoO1xuZnVuY3Rpb24gZXNjYXBlUG9zaXhQYXRoKHBhdHRlcm4pIHtcbiAgICByZXR1cm4gcGF0dGVybi5yZXBsYWNlKFBPU0lYX1VORVNDQVBFRF9HTE9CX1NZTUJPTFNfUkUsICdcXFxcJDInKTtcbn1cbmV4cG9ydHMuZXNjYXBlUG9zaXhQYXRoID0gZXNjYXBlUG9zaXhQYXRoO1xuZXhwb3J0cy5jb252ZXJ0UGF0aFRvUGF0dGVybiA9IElTX1dJTkRPV1NfUExBVEZPUk0gPyBjb252ZXJ0V2luZG93c1BhdGhUb1BhdHRlcm4gOiBjb252ZXJ0UG9zaXhQYXRoVG9QYXR0ZXJuO1xuZnVuY3Rpb24gY29udmVydFdpbmRvd3NQYXRoVG9QYXR0ZXJuKGZpbGVwYXRoKSB7XG4gICAgcmV0dXJuIGVzY2FwZVdpbmRvd3NQYXRoKGZpbGVwYXRoKVxuICAgICAgICAucmVwbGFjZShET1NfREVWSUNFX1BBVEhfUkUsICcvLyQxJylcbiAgICAgICAgLnJlcGxhY2UoV0lORE9XU19CQUNLU0xBU0hFU19SRSwgJy8nKTtcbn1cbmV4cG9ydHMuY29udmVydFdpbmRvd3NQYXRoVG9QYXR0ZXJuID0gY29udmVydFdpbmRvd3NQYXRoVG9QYXR0ZXJuO1xuZnVuY3Rpb24gY29udmVydFBvc2l4UGF0aFRvUGF0dGVybihmaWxlcGF0aCkge1xuICAgIHJldHVybiBlc2NhcGVQb3NpeFBhdGgoZmlsZXBhdGgpO1xufVxuZXhwb3J0cy5jb252ZXJ0UG9zaXhQYXRoVG9QYXR0ZXJuID0gY29udmVydFBvc2l4UGF0aFRvUGF0dGVybjtcbiIsICIvKiFcbiAqIGlzLWV4dGdsb2IgPGh0dHBzOi8vZ2l0aHViLmNvbS9qb25zY2hsaW5rZXJ0L2lzLWV4dGdsb2I+XG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTYsIEpvbiBTY2hsaW5rZXJ0LlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaXNFeHRnbG9iKHN0cikge1xuICBpZiAodHlwZW9mIHN0ciAhPT0gJ3N0cmluZycgfHwgc3RyID09PSAnJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciBtYXRjaDtcbiAgd2hpbGUgKChtYXRjaCA9IC8oXFxcXCkufChbQD8hKypdXFwoLipcXCkpL2cuZXhlYyhzdHIpKSkge1xuICAgIGlmIChtYXRjaFsyXSkgcmV0dXJuIHRydWU7XG4gICAgc3RyID0gc3RyLnNsaWNlKG1hdGNoLmluZGV4ICsgbWF0Y2hbMF0ubGVuZ3RoKTtcbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn07XG4iLCAiLyohXG4gKiBpcy1nbG9iIDxodHRwczovL2dpdGh1Yi5jb20vam9uc2NobGlua2VydC9pcy1nbG9iPlxuICpcbiAqIENvcHlyaWdodCAoYykgMjAxNC0yMDE3LCBKb24gU2NobGlua2VydC5cbiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cbiAqL1xuXG52YXIgaXNFeHRnbG9iID0gcmVxdWlyZSgnaXMtZXh0Z2xvYicpO1xudmFyIGNoYXJzID0geyAneyc6ICd9JywgJygnOiAnKScsICdbJzogJ10nfTtcbnZhciBzdHJpY3RDaGVjayA9IGZ1bmN0aW9uKHN0cikge1xuICBpZiAoc3RyWzBdID09PSAnIScpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICB2YXIgaW5kZXggPSAwO1xuICB2YXIgcGlwZUluZGV4ID0gLTI7XG4gIHZhciBjbG9zZVNxdWFyZUluZGV4ID0gLTI7XG4gIHZhciBjbG9zZUN1cmx5SW5kZXggPSAtMjtcbiAgdmFyIGNsb3NlUGFyZW5JbmRleCA9IC0yO1xuICB2YXIgYmFja1NsYXNoSW5kZXggPSAtMjtcbiAgd2hpbGUgKGluZGV4IDwgc3RyLmxlbmd0aCkge1xuICAgIGlmIChzdHJbaW5kZXhdID09PSAnKicpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmIChzdHJbaW5kZXggKyAxXSA9PT0gJz8nICYmIC9bXFxdLispXS8udGVzdChzdHJbaW5kZXhdKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKGNsb3NlU3F1YXJlSW5kZXggIT09IC0xICYmIHN0cltpbmRleF0gPT09ICdbJyAmJiBzdHJbaW5kZXggKyAxXSAhPT0gJ10nKSB7XG4gICAgICBpZiAoY2xvc2VTcXVhcmVJbmRleCA8IGluZGV4KSB7XG4gICAgICAgIGNsb3NlU3F1YXJlSW5kZXggPSBzdHIuaW5kZXhPZignXScsIGluZGV4KTtcbiAgICAgIH1cbiAgICAgIGlmIChjbG9zZVNxdWFyZUluZGV4ID4gaW5kZXgpIHtcbiAgICAgICAgaWYgKGJhY2tTbGFzaEluZGV4ID09PSAtMSB8fCBiYWNrU2xhc2hJbmRleCA+IGNsb3NlU3F1YXJlSW5kZXgpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBiYWNrU2xhc2hJbmRleCA9IHN0ci5pbmRleE9mKCdcXFxcJywgaW5kZXgpO1xuICAgICAgICBpZiAoYmFja1NsYXNoSW5kZXggPT09IC0xIHx8IGJhY2tTbGFzaEluZGV4ID4gY2xvc2VTcXVhcmVJbmRleCkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNsb3NlQ3VybHlJbmRleCAhPT0gLTEgJiYgc3RyW2luZGV4XSA9PT0gJ3snICYmIHN0cltpbmRleCArIDFdICE9PSAnfScpIHtcbiAgICAgIGNsb3NlQ3VybHlJbmRleCA9IHN0ci5pbmRleE9mKCd9JywgaW5kZXgpO1xuICAgICAgaWYgKGNsb3NlQ3VybHlJbmRleCA+IGluZGV4KSB7XG4gICAgICAgIGJhY2tTbGFzaEluZGV4ID0gc3RyLmluZGV4T2YoJ1xcXFwnLCBpbmRleCk7XG4gICAgICAgIGlmIChiYWNrU2xhc2hJbmRleCA9PT0gLTEgfHwgYmFja1NsYXNoSW5kZXggPiBjbG9zZUN1cmx5SW5kZXgpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjbG9zZVBhcmVuSW5kZXggIT09IC0xICYmIHN0cltpbmRleF0gPT09ICcoJyAmJiBzdHJbaW5kZXggKyAxXSA9PT0gJz8nICYmIC9bOiE9XS8udGVzdChzdHJbaW5kZXggKyAyXSkgJiYgc3RyW2luZGV4ICsgM10gIT09ICcpJykge1xuICAgICAgY2xvc2VQYXJlbkluZGV4ID0gc3RyLmluZGV4T2YoJyknLCBpbmRleCk7XG4gICAgICBpZiAoY2xvc2VQYXJlbkluZGV4ID4gaW5kZXgpIHtcbiAgICAgICAgYmFja1NsYXNoSW5kZXggPSBzdHIuaW5kZXhPZignXFxcXCcsIGluZGV4KTtcbiAgICAgICAgaWYgKGJhY2tTbGFzaEluZGV4ID09PSAtMSB8fCBiYWNrU2xhc2hJbmRleCA+IGNsb3NlUGFyZW5JbmRleCkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHBpcGVJbmRleCAhPT0gLTEgJiYgc3RyW2luZGV4XSA9PT0gJygnICYmIHN0cltpbmRleCArIDFdICE9PSAnfCcpIHtcbiAgICAgIGlmIChwaXBlSW5kZXggPCBpbmRleCkge1xuICAgICAgICBwaXBlSW5kZXggPSBzdHIuaW5kZXhPZignfCcsIGluZGV4KTtcbiAgICAgIH1cbiAgICAgIGlmIChwaXBlSW5kZXggIT09IC0xICYmIHN0cltwaXBlSW5kZXggKyAxXSAhPT0gJyknKSB7XG4gICAgICAgIGNsb3NlUGFyZW5JbmRleCA9IHN0ci5pbmRleE9mKCcpJywgcGlwZUluZGV4KTtcbiAgICAgICAgaWYgKGNsb3NlUGFyZW5JbmRleCA+IHBpcGVJbmRleCkge1xuICAgICAgICAgIGJhY2tTbGFzaEluZGV4ID0gc3RyLmluZGV4T2YoJ1xcXFwnLCBwaXBlSW5kZXgpO1xuICAgICAgICAgIGlmIChiYWNrU2xhc2hJbmRleCA9PT0gLTEgfHwgYmFja1NsYXNoSW5kZXggPiBjbG9zZVBhcmVuSW5kZXgpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzdHJbaW5kZXhdID09PSAnXFxcXCcpIHtcbiAgICAgIHZhciBvcGVuID0gc3RyW2luZGV4ICsgMV07XG4gICAgICBpbmRleCArPSAyO1xuICAgICAgdmFyIGNsb3NlID0gY2hhcnNbb3Blbl07XG5cbiAgICAgIGlmIChjbG9zZSkge1xuICAgICAgICB2YXIgbiA9IHN0ci5pbmRleE9mKGNsb3NlLCBpbmRleCk7XG4gICAgICAgIGlmIChuICE9PSAtMSkge1xuICAgICAgICAgIGluZGV4ID0gbiArIDE7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHN0cltpbmRleF0gPT09ICchJykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaW5kZXgrKztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufTtcblxudmFyIHJlbGF4ZWRDaGVjayA9IGZ1bmN0aW9uKHN0cikge1xuICBpZiAoc3RyWzBdID09PSAnIScpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICB2YXIgaW5kZXggPSAwO1xuICB3aGlsZSAoaW5kZXggPCBzdHIubGVuZ3RoKSB7XG4gICAgaWYgKC9bKj97fSgpW1xcXV0vLnRlc3Qoc3RyW2luZGV4XSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmIChzdHJbaW5kZXhdID09PSAnXFxcXCcpIHtcbiAgICAgIHZhciBvcGVuID0gc3RyW2luZGV4ICsgMV07XG4gICAgICBpbmRleCArPSAyO1xuICAgICAgdmFyIGNsb3NlID0gY2hhcnNbb3Blbl07XG5cbiAgICAgIGlmIChjbG9zZSkge1xuICAgICAgICB2YXIgbiA9IHN0ci5pbmRleE9mKGNsb3NlLCBpbmRleCk7XG4gICAgICAgIGlmIChuICE9PSAtMSkge1xuICAgICAgICAgIGluZGV4ID0gbiArIDE7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHN0cltpbmRleF0gPT09ICchJykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaW5kZXgrKztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpc0dsb2Ioc3RyLCBvcHRpb25zKSB7XG4gIGlmICh0eXBlb2Ygc3RyICE9PSAnc3RyaW5nJyB8fCBzdHIgPT09ICcnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKGlzRXh0Z2xvYihzdHIpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICB2YXIgY2hlY2sgPSBzdHJpY3RDaGVjaztcblxuICAvLyBvcHRpb25hbGx5IHJlbGF4IGNoZWNrXG4gIGlmIChvcHRpb25zICYmIG9wdGlvbnMuc3RyaWN0ID09PSBmYWxzZSkge1xuICAgIGNoZWNrID0gcmVsYXhlZENoZWNrO1xuICB9XG5cbiAgcmV0dXJuIGNoZWNrKHN0cik7XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcblxudmFyIGlzR2xvYiA9IHJlcXVpcmUoJ2lzLWdsb2InKTtcbnZhciBwYXRoUG9zaXhEaXJuYW1lID0gcmVxdWlyZSgncGF0aCcpLnBvc2l4LmRpcm5hbWU7XG52YXIgaXNXaW4zMiA9IHJlcXVpcmUoJ29zJykucGxhdGZvcm0oKSA9PT0gJ3dpbjMyJztcblxudmFyIHNsYXNoID0gJy8nO1xudmFyIGJhY2tzbGFzaCA9IC9cXFxcL2c7XG52YXIgZW5jbG9zdXJlID0gL1tcXHtcXFtdLipbXFx9XFxdXSQvO1xudmFyIGdsb2JieSA9IC8oXnxbXlxcXFxdKShbXFx7XFxbXXxcXChbXlxcKV0rJCkvO1xudmFyIGVzY2FwZWQgPSAvXFxcXChbXFwhXFwqXFw/XFx8XFxbXFxdXFwoXFwpXFx7XFx9XSkvZztcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0c1xuICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5mbGlwQmFja3NsYXNoZXM9dHJ1ZV1cbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZ2xvYlBhcmVudChzdHIsIG9wdHMpIHtcbiAgdmFyIG9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHsgZmxpcEJhY2tzbGFzaGVzOiB0cnVlIH0sIG9wdHMpO1xuXG4gIC8vIGZsaXAgd2luZG93cyBwYXRoIHNlcGFyYXRvcnNcbiAgaWYgKG9wdGlvbnMuZmxpcEJhY2tzbGFzaGVzICYmIGlzV2luMzIgJiYgc3RyLmluZGV4T2Yoc2xhc2gpIDwgMCkge1xuICAgIHN0ciA9IHN0ci5yZXBsYWNlKGJhY2tzbGFzaCwgc2xhc2gpO1xuICB9XG5cbiAgLy8gc3BlY2lhbCBjYXNlIGZvciBzdHJpbmdzIGVuZGluZyBpbiBlbmNsb3N1cmUgY29udGFpbmluZyBwYXRoIHNlcGFyYXRvclxuICBpZiAoZW5jbG9zdXJlLnRlc3Qoc3RyKSkge1xuICAgIHN0ciArPSBzbGFzaDtcbiAgfVxuXG4gIC8vIHByZXNlcnZlcyBmdWxsIHBhdGggaW4gY2FzZSBvZiB0cmFpbGluZyBwYXRoIHNlcGFyYXRvclxuICBzdHIgKz0gJ2EnO1xuXG4gIC8vIHJlbW92ZSBwYXRoIHBhcnRzIHRoYXQgYXJlIGdsb2JieVxuICBkbyB7XG4gICAgc3RyID0gcGF0aFBvc2l4RGlybmFtZShzdHIpO1xuICB9IHdoaWxlIChpc0dsb2Ioc3RyKSB8fCBnbG9iYnkudGVzdChzdHIpKTtcblxuICAvLyByZW1vdmUgZXNjYXBlIGNoYXJzIGFuZCByZXR1cm4gcmVzdWx0XG4gIHJldHVybiBzdHIucmVwbGFjZShlc2NhcGVkLCAnJDEnKTtcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLmlzSW50ZWdlciA9IG51bSA9PiB7XG4gIGlmICh0eXBlb2YgbnVtID09PSAnbnVtYmVyJykge1xuICAgIHJldHVybiBOdW1iZXIuaXNJbnRlZ2VyKG51bSk7XG4gIH1cbiAgaWYgKHR5cGVvZiBudW0gPT09ICdzdHJpbmcnICYmIG51bS50cmltKCkgIT09ICcnKSB7XG4gICAgcmV0dXJuIE51bWJlci5pc0ludGVnZXIoTnVtYmVyKG51bSkpO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn07XG5cbi8qKlxuICogRmluZCBhIG5vZGUgb2YgdGhlIGdpdmVuIHR5cGVcbiAqL1xuXG5leHBvcnRzLmZpbmQgPSAobm9kZSwgdHlwZSkgPT4gbm9kZS5ub2Rlcy5maW5kKG5vZGUgPT4gbm9kZS50eXBlID09PSB0eXBlKTtcblxuLyoqXG4gKiBGaW5kIGEgbm9kZSBvZiB0aGUgZ2l2ZW4gdHlwZVxuICovXG5cbmV4cG9ydHMuZXhjZWVkc0xpbWl0ID0gKG1pbiwgbWF4LCBzdGVwID0gMSwgbGltaXQpID0+IHtcbiAgaWYgKGxpbWl0ID09PSBmYWxzZSkgcmV0dXJuIGZhbHNlO1xuICBpZiAoIWV4cG9ydHMuaXNJbnRlZ2VyKG1pbikgfHwgIWV4cG9ydHMuaXNJbnRlZ2VyKG1heCkpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuICgoTnVtYmVyKG1heCkgLSBOdW1iZXIobWluKSkgLyBOdW1iZXIoc3RlcCkpID49IGxpbWl0O1xufTtcblxuLyoqXG4gKiBFc2NhcGUgdGhlIGdpdmVuIG5vZGUgd2l0aCAnXFxcXCcgYmVmb3JlIG5vZGUudmFsdWVcbiAqL1xuXG5leHBvcnRzLmVzY2FwZU5vZGUgPSAoYmxvY2ssIG4gPSAwLCB0eXBlKSA9PiB7XG4gIGxldCBub2RlID0gYmxvY2subm9kZXNbbl07XG4gIGlmICghbm9kZSkgcmV0dXJuO1xuXG4gIGlmICgodHlwZSAmJiBub2RlLnR5cGUgPT09IHR5cGUpIHx8IG5vZGUudHlwZSA9PT0gJ29wZW4nIHx8IG5vZGUudHlwZSA9PT0gJ2Nsb3NlJykge1xuICAgIGlmIChub2RlLmVzY2FwZWQgIT09IHRydWUpIHtcbiAgICAgIG5vZGUudmFsdWUgPSAnXFxcXCcgKyBub2RlLnZhbHVlO1xuICAgICAgbm9kZS5lc2NhcGVkID0gdHJ1ZTtcbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBicmFjZSBub2RlIHNob3VsZCBiZSBlbmNsb3NlZCBpbiBsaXRlcmFsIGJyYWNlc1xuICovXG5cbmV4cG9ydHMuZW5jbG9zZUJyYWNlID0gbm9kZSA9PiB7XG4gIGlmIChub2RlLnR5cGUgIT09ICdicmFjZScpIHJldHVybiBmYWxzZTtcbiAgaWYgKChub2RlLmNvbW1hcyA+PiAwICsgbm9kZS5yYW5nZXMgPj4gMCkgPT09IDApIHtcbiAgICBub2RlLmludmFsaWQgPSB0cnVlO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn07XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIGEgYnJhY2Ugbm9kZSBpcyBpbnZhbGlkLlxuICovXG5cbmV4cG9ydHMuaXNJbnZhbGlkQnJhY2UgPSBibG9jayA9PiB7XG4gIGlmIChibG9jay50eXBlICE9PSAnYnJhY2UnKSByZXR1cm4gZmFsc2U7XG4gIGlmIChibG9jay5pbnZhbGlkID09PSB0cnVlIHx8IGJsb2NrLmRvbGxhcikgcmV0dXJuIHRydWU7XG4gIGlmICgoYmxvY2suY29tbWFzID4+IDAgKyBibG9jay5yYW5nZXMgPj4gMCkgPT09IDApIHtcbiAgICBibG9jay5pbnZhbGlkID0gdHJ1ZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAoYmxvY2sub3BlbiAhPT0gdHJ1ZSB8fCBibG9jay5jbG9zZSAhPT0gdHJ1ZSkge1xuICAgIGJsb2NrLmludmFsaWQgPSB0cnVlO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn07XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIGEgbm9kZSBpcyBhbiBvcGVuIG9yIGNsb3NlIG5vZGVcbiAqL1xuXG5leHBvcnRzLmlzT3Blbk9yQ2xvc2UgPSBub2RlID0+IHtcbiAgaWYgKG5vZGUudHlwZSA9PT0gJ29wZW4nIHx8IG5vZGUudHlwZSA9PT0gJ2Nsb3NlJykge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBub2RlLm9wZW4gPT09IHRydWUgfHwgbm9kZS5jbG9zZSA9PT0gdHJ1ZTtcbn07XG5cbi8qKlxuICogUmVkdWNlIGFuIGFycmF5IG9mIHRleHQgbm9kZXMuXG4gKi9cblxuZXhwb3J0cy5yZWR1Y2UgPSBub2RlcyA9PiBub2Rlcy5yZWR1Y2UoKGFjYywgbm9kZSkgPT4ge1xuICBpZiAobm9kZS50eXBlID09PSAndGV4dCcpIGFjYy5wdXNoKG5vZGUudmFsdWUpO1xuICBpZiAobm9kZS50eXBlID09PSAncmFuZ2UnKSBub2RlLnR5cGUgPSAndGV4dCc7XG4gIHJldHVybiBhY2M7XG59LCBbXSk7XG5cbi8qKlxuICogRmxhdHRlbiBhbiBhcnJheVxuICovXG5cbmV4cG9ydHMuZmxhdHRlbiA9ICguLi5hcmdzKSA9PiB7XG4gIGNvbnN0IHJlc3VsdCA9IFtdO1xuICBjb25zdCBmbGF0ID0gYXJyID0+IHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuICAgICAgbGV0IGVsZSA9IGFycltpXTtcbiAgICAgIEFycmF5LmlzQXJyYXkoZWxlKSA/IGZsYXQoZWxlLCByZXN1bHQpIDogZWxlICE9PSB2b2lkIDAgJiYgcmVzdWx0LnB1c2goZWxlKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbiAgZmxhdChhcmdzKTtcbiAgcmV0dXJuIHJlc3VsdDtcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCB1dGlscyA9IHJlcXVpcmUoJy4vdXRpbHMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSAoYXN0LCBvcHRpb25zID0ge30pID0+IHtcbiAgbGV0IHN0cmluZ2lmeSA9IChub2RlLCBwYXJlbnQgPSB7fSkgPT4ge1xuICAgIGxldCBpbnZhbGlkQmxvY2sgPSBvcHRpb25zLmVzY2FwZUludmFsaWQgJiYgdXRpbHMuaXNJbnZhbGlkQnJhY2UocGFyZW50KTtcbiAgICBsZXQgaW52YWxpZE5vZGUgPSBub2RlLmludmFsaWQgPT09IHRydWUgJiYgb3B0aW9ucy5lc2NhcGVJbnZhbGlkID09PSB0cnVlO1xuICAgIGxldCBvdXRwdXQgPSAnJztcblxuICAgIGlmIChub2RlLnZhbHVlKSB7XG4gICAgICBpZiAoKGludmFsaWRCbG9jayB8fCBpbnZhbGlkTm9kZSkgJiYgdXRpbHMuaXNPcGVuT3JDbG9zZShub2RlKSkge1xuICAgICAgICByZXR1cm4gJ1xcXFwnICsgbm9kZS52YWx1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBub2RlLnZhbHVlO1xuICAgIH1cblxuICAgIGlmIChub2RlLnZhbHVlKSB7XG4gICAgICByZXR1cm4gbm9kZS52YWx1ZTtcbiAgICB9XG5cbiAgICBpZiAobm9kZS5ub2Rlcykge1xuICAgICAgZm9yIChsZXQgY2hpbGQgb2Ygbm9kZS5ub2Rlcykge1xuICAgICAgICBvdXRwdXQgKz0gc3RyaW5naWZ5KGNoaWxkKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG91dHB1dDtcbiAgfTtcblxuICByZXR1cm4gc3RyaW5naWZ5KGFzdCk7XG59O1xuXG4iLCAiLyohXG4gKiBpcy1udW1iZXIgPGh0dHBzOi8vZ2l0aHViLmNvbS9qb25zY2hsaW5rZXJ0L2lzLW51bWJlcj5cbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTQtcHJlc2VudCwgSm9uIFNjaGxpbmtlcnQuXG4gKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKG51bSkge1xuICBpZiAodHlwZW9mIG51bSA9PT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4gbnVtIC0gbnVtID09PSAwO1xuICB9XG4gIGlmICh0eXBlb2YgbnVtID09PSAnc3RyaW5nJyAmJiBudW0udHJpbSgpICE9PSAnJykge1xuICAgIHJldHVybiBOdW1iZXIuaXNGaW5pdGUgPyBOdW1iZXIuaXNGaW5pdGUoK251bSkgOiBpc0Zpbml0ZSgrbnVtKTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59O1xuIiwgIi8qIVxuICogdG8tcmVnZXgtcmFuZ2UgPGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb21hdGNoL3RvLXJlZ2V4LXJhbmdlPlxuICpcbiAqIENvcHlyaWdodCAoYykgMjAxNS1wcmVzZW50LCBKb24gU2NobGlua2VydC5cbiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbmNvbnN0IGlzTnVtYmVyID0gcmVxdWlyZSgnaXMtbnVtYmVyJyk7XG5cbmNvbnN0IHRvUmVnZXhSYW5nZSA9IChtaW4sIG1heCwgb3B0aW9ucykgPT4ge1xuICBpZiAoaXNOdW1iZXIobWluKSA9PT0gZmFsc2UpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCd0b1JlZ2V4UmFuZ2U6IGV4cGVjdGVkIHRoZSBmaXJzdCBhcmd1bWVudCB0byBiZSBhIG51bWJlcicpO1xuICB9XG5cbiAgaWYgKG1heCA9PT0gdm9pZCAwIHx8IG1pbiA9PT0gbWF4KSB7XG4gICAgcmV0dXJuIFN0cmluZyhtaW4pO1xuICB9XG5cbiAgaWYgKGlzTnVtYmVyKG1heCkgPT09IGZhbHNlKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcigndG9SZWdleFJhbmdlOiBleHBlY3RlZCB0aGUgc2Vjb25kIGFyZ3VtZW50IHRvIGJlIGEgbnVtYmVyLicpO1xuICB9XG5cbiAgbGV0IG9wdHMgPSB7IHJlbGF4WmVyb3M6IHRydWUsIC4uLm9wdGlvbnMgfTtcbiAgaWYgKHR5cGVvZiBvcHRzLnN0cmljdFplcm9zID09PSAnYm9vbGVhbicpIHtcbiAgICBvcHRzLnJlbGF4WmVyb3MgPSBvcHRzLnN0cmljdFplcm9zID09PSBmYWxzZTtcbiAgfVxuXG4gIGxldCByZWxheCA9IFN0cmluZyhvcHRzLnJlbGF4WmVyb3MpO1xuICBsZXQgc2hvcnRoYW5kID0gU3RyaW5nKG9wdHMuc2hvcnRoYW5kKTtcbiAgbGV0IGNhcHR1cmUgPSBTdHJpbmcob3B0cy5jYXB0dXJlKTtcbiAgbGV0IHdyYXAgPSBTdHJpbmcob3B0cy53cmFwKTtcbiAgbGV0IGNhY2hlS2V5ID0gbWluICsgJzonICsgbWF4ICsgJz0nICsgcmVsYXggKyBzaG9ydGhhbmQgKyBjYXB0dXJlICsgd3JhcDtcblxuICBpZiAodG9SZWdleFJhbmdlLmNhY2hlLmhhc093blByb3BlcnR5KGNhY2hlS2V5KSkge1xuICAgIHJldHVybiB0b1JlZ2V4UmFuZ2UuY2FjaGVbY2FjaGVLZXldLnJlc3VsdDtcbiAgfVxuXG4gIGxldCBhID0gTWF0aC5taW4obWluLCBtYXgpO1xuICBsZXQgYiA9IE1hdGgubWF4KG1pbiwgbWF4KTtcblxuICBpZiAoTWF0aC5hYnMoYSAtIGIpID09PSAxKSB7XG4gICAgbGV0IHJlc3VsdCA9IG1pbiArICd8JyArIG1heDtcbiAgICBpZiAob3B0cy5jYXB0dXJlKSB7XG4gICAgICByZXR1cm4gYCgke3Jlc3VsdH0pYDtcbiAgICB9XG4gICAgaWYgKG9wdHMud3JhcCA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIHJldHVybiBgKD86JHtyZXN1bHR9KWA7XG4gIH1cblxuICBsZXQgaXNQYWRkZWQgPSBoYXNQYWRkaW5nKG1pbikgfHwgaGFzUGFkZGluZyhtYXgpO1xuICBsZXQgc3RhdGUgPSB7IG1pbiwgbWF4LCBhLCBiIH07XG4gIGxldCBwb3NpdGl2ZXMgPSBbXTtcbiAgbGV0IG5lZ2F0aXZlcyA9IFtdO1xuXG4gIGlmIChpc1BhZGRlZCkge1xuICAgIHN0YXRlLmlzUGFkZGVkID0gaXNQYWRkZWQ7XG4gICAgc3RhdGUubWF4TGVuID0gU3RyaW5nKHN0YXRlLm1heCkubGVuZ3RoO1xuICB9XG5cbiAgaWYgKGEgPCAwKSB7XG4gICAgbGV0IG5ld01pbiA9IGIgPCAwID8gTWF0aC5hYnMoYikgOiAxO1xuICAgIG5lZ2F0aXZlcyA9IHNwbGl0VG9QYXR0ZXJucyhuZXdNaW4sIE1hdGguYWJzKGEpLCBzdGF0ZSwgb3B0cyk7XG4gICAgYSA9IHN0YXRlLmEgPSAwO1xuICB9XG5cbiAgaWYgKGIgPj0gMCkge1xuICAgIHBvc2l0aXZlcyA9IHNwbGl0VG9QYXR0ZXJucyhhLCBiLCBzdGF0ZSwgb3B0cyk7XG4gIH1cblxuICBzdGF0ZS5uZWdhdGl2ZXMgPSBuZWdhdGl2ZXM7XG4gIHN0YXRlLnBvc2l0aXZlcyA9IHBvc2l0aXZlcztcbiAgc3RhdGUucmVzdWx0ID0gY29sbGF0ZVBhdHRlcm5zKG5lZ2F0aXZlcywgcG9zaXRpdmVzLCBvcHRzKTtcblxuICBpZiAob3B0cy5jYXB0dXJlID09PSB0cnVlKSB7XG4gICAgc3RhdGUucmVzdWx0ID0gYCgke3N0YXRlLnJlc3VsdH0pYDtcbiAgfSBlbHNlIGlmIChvcHRzLndyYXAgIT09IGZhbHNlICYmIChwb3NpdGl2ZXMubGVuZ3RoICsgbmVnYXRpdmVzLmxlbmd0aCkgPiAxKSB7XG4gICAgc3RhdGUucmVzdWx0ID0gYCg/OiR7c3RhdGUucmVzdWx0fSlgO1xuICB9XG5cbiAgdG9SZWdleFJhbmdlLmNhY2hlW2NhY2hlS2V5XSA9IHN0YXRlO1xuICByZXR1cm4gc3RhdGUucmVzdWx0O1xufTtcblxuZnVuY3Rpb24gY29sbGF0ZVBhdHRlcm5zKG5lZywgcG9zLCBvcHRpb25zKSB7XG4gIGxldCBvbmx5TmVnYXRpdmUgPSBmaWx0ZXJQYXR0ZXJucyhuZWcsIHBvcywgJy0nLCBmYWxzZSwgb3B0aW9ucykgfHwgW107XG4gIGxldCBvbmx5UG9zaXRpdmUgPSBmaWx0ZXJQYXR0ZXJucyhwb3MsIG5lZywgJycsIGZhbHNlLCBvcHRpb25zKSB8fCBbXTtcbiAgbGV0IGludGVyc2VjdGVkID0gZmlsdGVyUGF0dGVybnMobmVnLCBwb3MsICctPycsIHRydWUsIG9wdGlvbnMpIHx8IFtdO1xuICBsZXQgc3VicGF0dGVybnMgPSBvbmx5TmVnYXRpdmUuY29uY2F0KGludGVyc2VjdGVkKS5jb25jYXQob25seVBvc2l0aXZlKTtcbiAgcmV0dXJuIHN1YnBhdHRlcm5zLmpvaW4oJ3wnKTtcbn1cblxuZnVuY3Rpb24gc3BsaXRUb1JhbmdlcyhtaW4sIG1heCkge1xuICBsZXQgbmluZXMgPSAxO1xuICBsZXQgemVyb3MgPSAxO1xuXG4gIGxldCBzdG9wID0gY291bnROaW5lcyhtaW4sIG5pbmVzKTtcbiAgbGV0IHN0b3BzID0gbmV3IFNldChbbWF4XSk7XG5cbiAgd2hpbGUgKG1pbiA8PSBzdG9wICYmIHN0b3AgPD0gbWF4KSB7XG4gICAgc3RvcHMuYWRkKHN0b3ApO1xuICAgIG5pbmVzICs9IDE7XG4gICAgc3RvcCA9IGNvdW50TmluZXMobWluLCBuaW5lcyk7XG4gIH1cblxuICBzdG9wID0gY291bnRaZXJvcyhtYXggKyAxLCB6ZXJvcykgLSAxO1xuXG4gIHdoaWxlIChtaW4gPCBzdG9wICYmIHN0b3AgPD0gbWF4KSB7XG4gICAgc3RvcHMuYWRkKHN0b3ApO1xuICAgIHplcm9zICs9IDE7XG4gICAgc3RvcCA9IGNvdW50WmVyb3MobWF4ICsgMSwgemVyb3MpIC0gMTtcbiAgfVxuXG4gIHN0b3BzID0gWy4uLnN0b3BzXTtcbiAgc3RvcHMuc29ydChjb21wYXJlKTtcbiAgcmV0dXJuIHN0b3BzO1xufVxuXG4vKipcbiAqIENvbnZlcnQgYSByYW5nZSB0byBhIHJlZ2V4IHBhdHRlcm5cbiAqIEBwYXJhbSB7TnVtYmVyfSBgc3RhcnRgXG4gKiBAcGFyYW0ge051bWJlcn0gYHN0b3BgXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKi9cblxuZnVuY3Rpb24gcmFuZ2VUb1BhdHRlcm4oc3RhcnQsIHN0b3AsIG9wdGlvbnMpIHtcbiAgaWYgKHN0YXJ0ID09PSBzdG9wKSB7XG4gICAgcmV0dXJuIHsgcGF0dGVybjogc3RhcnQsIGNvdW50OiBbXSwgZGlnaXRzOiAwIH07XG4gIH1cblxuICBsZXQgemlwcGVkID0gemlwKHN0YXJ0LCBzdG9wKTtcbiAgbGV0IGRpZ2l0cyA9IHppcHBlZC5sZW5ndGg7XG4gIGxldCBwYXR0ZXJuID0gJyc7XG4gIGxldCBjb3VudCA9IDA7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBkaWdpdHM7IGkrKykge1xuICAgIGxldCBbc3RhcnREaWdpdCwgc3RvcERpZ2l0XSA9IHppcHBlZFtpXTtcblxuICAgIGlmIChzdGFydERpZ2l0ID09PSBzdG9wRGlnaXQpIHtcbiAgICAgIHBhdHRlcm4gKz0gc3RhcnREaWdpdDtcblxuICAgIH0gZWxzZSBpZiAoc3RhcnREaWdpdCAhPT0gJzAnIHx8IHN0b3BEaWdpdCAhPT0gJzknKSB7XG4gICAgICBwYXR0ZXJuICs9IHRvQ2hhcmFjdGVyQ2xhc3Moc3RhcnREaWdpdCwgc3RvcERpZ2l0LCBvcHRpb25zKTtcblxuICAgIH0gZWxzZSB7XG4gICAgICBjb3VudCsrO1xuICAgIH1cbiAgfVxuXG4gIGlmIChjb3VudCkge1xuICAgIHBhdHRlcm4gKz0gb3B0aW9ucy5zaG9ydGhhbmQgPT09IHRydWUgPyAnXFxcXGQnIDogJ1swLTldJztcbiAgfVxuXG4gIHJldHVybiB7IHBhdHRlcm4sIGNvdW50OiBbY291bnRdLCBkaWdpdHMgfTtcbn1cblxuZnVuY3Rpb24gc3BsaXRUb1BhdHRlcm5zKG1pbiwgbWF4LCB0b2ssIG9wdGlvbnMpIHtcbiAgbGV0IHJhbmdlcyA9IHNwbGl0VG9SYW5nZXMobWluLCBtYXgpO1xuICBsZXQgdG9rZW5zID0gW107XG4gIGxldCBzdGFydCA9IG1pbjtcbiAgbGV0IHByZXY7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCByYW5nZXMubGVuZ3RoOyBpKyspIHtcbiAgICBsZXQgbWF4ID0gcmFuZ2VzW2ldO1xuICAgIGxldCBvYmogPSByYW5nZVRvUGF0dGVybihTdHJpbmcoc3RhcnQpLCBTdHJpbmcobWF4KSwgb3B0aW9ucyk7XG4gICAgbGV0IHplcm9zID0gJyc7XG5cbiAgICBpZiAoIXRvay5pc1BhZGRlZCAmJiBwcmV2ICYmIHByZXYucGF0dGVybiA9PT0gb2JqLnBhdHRlcm4pIHtcbiAgICAgIGlmIChwcmV2LmNvdW50Lmxlbmd0aCA+IDEpIHtcbiAgICAgICAgcHJldi5jb3VudC5wb3AoKTtcbiAgICAgIH1cblxuICAgICAgcHJldi5jb3VudC5wdXNoKG9iai5jb3VudFswXSk7XG4gICAgICBwcmV2LnN0cmluZyA9IHByZXYucGF0dGVybiArIHRvUXVhbnRpZmllcihwcmV2LmNvdW50KTtcbiAgICAgIHN0YXJ0ID0gbWF4ICsgMTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmICh0b2suaXNQYWRkZWQpIHtcbiAgICAgIHplcm9zID0gcGFkWmVyb3MobWF4LCB0b2ssIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIG9iai5zdHJpbmcgPSB6ZXJvcyArIG9iai5wYXR0ZXJuICsgdG9RdWFudGlmaWVyKG9iai5jb3VudCk7XG4gICAgdG9rZW5zLnB1c2gob2JqKTtcbiAgICBzdGFydCA9IG1heCArIDE7XG4gICAgcHJldiA9IG9iajtcbiAgfVxuXG4gIHJldHVybiB0b2tlbnM7XG59XG5cbmZ1bmN0aW9uIGZpbHRlclBhdHRlcm5zKGFyciwgY29tcGFyaXNvbiwgcHJlZml4LCBpbnRlcnNlY3Rpb24sIG9wdGlvbnMpIHtcbiAgbGV0IHJlc3VsdCA9IFtdO1xuXG4gIGZvciAobGV0IGVsZSBvZiBhcnIpIHtcbiAgICBsZXQgeyBzdHJpbmcgfSA9IGVsZTtcblxuICAgIC8vIG9ubHkgcHVzaCBpZiBfYm90aF8gYXJlIG5lZ2F0aXZlLi4uXG4gICAgaWYgKCFpbnRlcnNlY3Rpb24gJiYgIWNvbnRhaW5zKGNvbXBhcmlzb24sICdzdHJpbmcnLCBzdHJpbmcpKSB7XG4gICAgICByZXN1bHQucHVzaChwcmVmaXggKyBzdHJpbmcpO1xuICAgIH1cblxuICAgIC8vIG9yIF9ib3RoXyBhcmUgcG9zaXRpdmVcbiAgICBpZiAoaW50ZXJzZWN0aW9uICYmIGNvbnRhaW5zKGNvbXBhcmlzb24sICdzdHJpbmcnLCBzdHJpbmcpKSB7XG4gICAgICByZXN1bHQucHVzaChwcmVmaXggKyBzdHJpbmcpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIFppcCBzdHJpbmdzXG4gKi9cblxuZnVuY3Rpb24gemlwKGEsIGIpIHtcbiAgbGV0IGFyciA9IFtdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspIGFyci5wdXNoKFthW2ldLCBiW2ldXSk7XG4gIHJldHVybiBhcnI7XG59XG5cbmZ1bmN0aW9uIGNvbXBhcmUoYSwgYikge1xuICByZXR1cm4gYSA+IGIgPyAxIDogYiA+IGEgPyAtMSA6IDA7XG59XG5cbmZ1bmN0aW9uIGNvbnRhaW5zKGFyciwga2V5LCB2YWwpIHtcbiAgcmV0dXJuIGFyci5zb21lKGVsZSA9PiBlbGVba2V5XSA9PT0gdmFsKTtcbn1cblxuZnVuY3Rpb24gY291bnROaW5lcyhtaW4sIGxlbikge1xuICByZXR1cm4gTnVtYmVyKFN0cmluZyhtaW4pLnNsaWNlKDAsIC1sZW4pICsgJzknLnJlcGVhdChsZW4pKTtcbn1cblxuZnVuY3Rpb24gY291bnRaZXJvcyhpbnRlZ2VyLCB6ZXJvcykge1xuICByZXR1cm4gaW50ZWdlciAtIChpbnRlZ2VyICUgTWF0aC5wb3coMTAsIHplcm9zKSk7XG59XG5cbmZ1bmN0aW9uIHRvUXVhbnRpZmllcihkaWdpdHMpIHtcbiAgbGV0IFtzdGFydCA9IDAsIHN0b3AgPSAnJ10gPSBkaWdpdHM7XG4gIGlmIChzdG9wIHx8IHN0YXJ0ID4gMSkge1xuICAgIHJldHVybiBgeyR7c3RhcnQgKyAoc3RvcCA/ICcsJyArIHN0b3AgOiAnJyl9fWA7XG4gIH1cbiAgcmV0dXJuICcnO1xufVxuXG5mdW5jdGlvbiB0b0NoYXJhY3RlckNsYXNzKGEsIGIsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIGBbJHthfSR7KGIgLSBhID09PSAxKSA/ICcnIDogJy0nfSR7Yn1dYDtcbn1cblxuZnVuY3Rpb24gaGFzUGFkZGluZyhzdHIpIHtcbiAgcmV0dXJuIC9eLT8oMCspXFxkLy50ZXN0KHN0cik7XG59XG5cbmZ1bmN0aW9uIHBhZFplcm9zKHZhbHVlLCB0b2ssIG9wdGlvbnMpIHtcbiAgaWYgKCF0b2suaXNQYWRkZWQpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICBsZXQgZGlmZiA9IE1hdGguYWJzKHRvay5tYXhMZW4gLSBTdHJpbmcodmFsdWUpLmxlbmd0aCk7XG4gIGxldCByZWxheCA9IG9wdGlvbnMucmVsYXhaZXJvcyAhPT0gZmFsc2U7XG5cbiAgc3dpdGNoIChkaWZmKSB7XG4gICAgY2FzZSAwOlxuICAgICAgcmV0dXJuICcnO1xuICAgIGNhc2UgMTpcbiAgICAgIHJldHVybiByZWxheCA/ICcwPycgOiAnMCc7XG4gICAgY2FzZSAyOlxuICAgICAgcmV0dXJuIHJlbGF4ID8gJzB7MCwyfScgOiAnMDAnO1xuICAgIGRlZmF1bHQ6IHtcbiAgICAgIHJldHVybiByZWxheCA/IGAwezAsJHtkaWZmfX1gIDogYDB7JHtkaWZmfX1gO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIENhY2hlXG4gKi9cblxudG9SZWdleFJhbmdlLmNhY2hlID0ge307XG50b1JlZ2V4UmFuZ2UuY2xlYXJDYWNoZSA9ICgpID0+ICh0b1JlZ2V4UmFuZ2UuY2FjaGUgPSB7fSk7XG5cbi8qKlxuICogRXhwb3NlIGB0b1JlZ2V4UmFuZ2VgXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSB0b1JlZ2V4UmFuZ2U7XG4iLCAiLyohXG4gKiBmaWxsLXJhbmdlIDxodHRwczovL2dpdGh1Yi5jb20vam9uc2NobGlua2VydC9maWxsLXJhbmdlPlxuICpcbiAqIENvcHlyaWdodCAoYykgMjAxNC1wcmVzZW50LCBKb24gU2NobGlua2VydC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbmNvbnN0IHV0aWwgPSByZXF1aXJlKCd1dGlsJyk7XG5jb25zdCB0b1JlZ2V4UmFuZ2UgPSByZXF1aXJlKCd0by1yZWdleC1yYW5nZScpO1xuXG5jb25zdCBpc09iamVjdCA9IHZhbCA9PiB2YWwgIT09IG51bGwgJiYgdHlwZW9mIHZhbCA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkodmFsKTtcblxuY29uc3QgdHJhbnNmb3JtID0gdG9OdW1iZXIgPT4ge1xuICByZXR1cm4gdmFsdWUgPT4gdG9OdW1iZXIgPT09IHRydWUgPyBOdW1iZXIodmFsdWUpIDogU3RyaW5nKHZhbHVlKTtcbn07XG5cbmNvbnN0IGlzVmFsaWRWYWx1ZSA9IHZhbHVlID0+IHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgfHwgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgdmFsdWUgIT09ICcnKTtcbn07XG5cbmNvbnN0IGlzTnVtYmVyID0gbnVtID0+IE51bWJlci5pc0ludGVnZXIoK251bSk7XG5cbmNvbnN0IHplcm9zID0gaW5wdXQgPT4ge1xuICBsZXQgdmFsdWUgPSBgJHtpbnB1dH1gO1xuICBsZXQgaW5kZXggPSAtMTtcbiAgaWYgKHZhbHVlWzBdID09PSAnLScpIHZhbHVlID0gdmFsdWUuc2xpY2UoMSk7XG4gIGlmICh2YWx1ZSA9PT0gJzAnKSByZXR1cm4gZmFsc2U7XG4gIHdoaWxlICh2YWx1ZVsrK2luZGV4XSA9PT0gJzAnKTtcbiAgcmV0dXJuIGluZGV4ID4gMDtcbn07XG5cbmNvbnN0IHN0cmluZ2lmeSA9IChzdGFydCwgZW5kLCBvcHRpb25zKSA9PiB7XG4gIGlmICh0eXBlb2Ygc3RhcnQgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBlbmQgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIG9wdGlvbnMuc3RyaW5naWZ5ID09PSB0cnVlO1xufTtcblxuY29uc3QgcGFkID0gKGlucHV0LCBtYXhMZW5ndGgsIHRvTnVtYmVyKSA9PiB7XG4gIGlmIChtYXhMZW5ndGggPiAwKSB7XG4gICAgbGV0IGRhc2ggPSBpbnB1dFswXSA9PT0gJy0nID8gJy0nIDogJyc7XG4gICAgaWYgKGRhc2gpIGlucHV0ID0gaW5wdXQuc2xpY2UoMSk7XG4gICAgaW5wdXQgPSAoZGFzaCArIGlucHV0LnBhZFN0YXJ0KGRhc2ggPyBtYXhMZW5ndGggLSAxIDogbWF4TGVuZ3RoLCAnMCcpKTtcbiAgfVxuICBpZiAodG9OdW1iZXIgPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuIFN0cmluZyhpbnB1dCk7XG4gIH1cbiAgcmV0dXJuIGlucHV0O1xufTtcblxuY29uc3QgdG9NYXhMZW4gPSAoaW5wdXQsIG1heExlbmd0aCkgPT4ge1xuICBsZXQgbmVnYXRpdmUgPSBpbnB1dFswXSA9PT0gJy0nID8gJy0nIDogJyc7XG4gIGlmIChuZWdhdGl2ZSkge1xuICAgIGlucHV0ID0gaW5wdXQuc2xpY2UoMSk7XG4gICAgbWF4TGVuZ3RoLS07XG4gIH1cbiAgd2hpbGUgKGlucHV0Lmxlbmd0aCA8IG1heExlbmd0aCkgaW5wdXQgPSAnMCcgKyBpbnB1dDtcbiAgcmV0dXJuIG5lZ2F0aXZlID8gKCctJyArIGlucHV0KSA6IGlucHV0O1xufTtcblxuY29uc3QgdG9TZXF1ZW5jZSA9IChwYXJ0cywgb3B0aW9ucykgPT4ge1xuICBwYXJ0cy5uZWdhdGl2ZXMuc29ydCgoYSwgYikgPT4gYSA8IGIgPyAtMSA6IGEgPiBiID8gMSA6IDApO1xuICBwYXJ0cy5wb3NpdGl2ZXMuc29ydCgoYSwgYikgPT4gYSA8IGIgPyAtMSA6IGEgPiBiID8gMSA6IDApO1xuXG4gIGxldCBwcmVmaXggPSBvcHRpb25zLmNhcHR1cmUgPyAnJyA6ICc/Oic7XG4gIGxldCBwb3NpdGl2ZXMgPSAnJztcbiAgbGV0IG5lZ2F0aXZlcyA9ICcnO1xuICBsZXQgcmVzdWx0O1xuXG4gIGlmIChwYXJ0cy5wb3NpdGl2ZXMubGVuZ3RoKSB7XG4gICAgcG9zaXRpdmVzID0gcGFydHMucG9zaXRpdmVzLmpvaW4oJ3wnKTtcbiAgfVxuXG4gIGlmIChwYXJ0cy5uZWdhdGl2ZXMubGVuZ3RoKSB7XG4gICAgbmVnYXRpdmVzID0gYC0oJHtwcmVmaXh9JHtwYXJ0cy5uZWdhdGl2ZXMuam9pbignfCcpfSlgO1xuICB9XG5cbiAgaWYgKHBvc2l0aXZlcyAmJiBuZWdhdGl2ZXMpIHtcbiAgICByZXN1bHQgPSBgJHtwb3NpdGl2ZXN9fCR7bmVnYXRpdmVzfWA7XG4gIH0gZWxzZSB7XG4gICAgcmVzdWx0ID0gcG9zaXRpdmVzIHx8IG5lZ2F0aXZlcztcbiAgfVxuXG4gIGlmIChvcHRpb25zLndyYXApIHtcbiAgICByZXR1cm4gYCgke3ByZWZpeH0ke3Jlc3VsdH0pYDtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG5jb25zdCB0b1JhbmdlID0gKGEsIGIsIGlzTnVtYmVycywgb3B0aW9ucykgPT4ge1xuICBpZiAoaXNOdW1iZXJzKSB7XG4gICAgcmV0dXJuIHRvUmVnZXhSYW5nZShhLCBiLCB7IHdyYXA6IGZhbHNlLCAuLi5vcHRpb25zIH0pO1xuICB9XG5cbiAgbGV0IHN0YXJ0ID0gU3RyaW5nLmZyb21DaGFyQ29kZShhKTtcbiAgaWYgKGEgPT09IGIpIHJldHVybiBzdGFydDtcblxuICBsZXQgc3RvcCA9IFN0cmluZy5mcm9tQ2hhckNvZGUoYik7XG4gIHJldHVybiBgWyR7c3RhcnR9LSR7c3RvcH1dYDtcbn07XG5cbmNvbnN0IHRvUmVnZXggPSAoc3RhcnQsIGVuZCwgb3B0aW9ucykgPT4ge1xuICBpZiAoQXJyYXkuaXNBcnJheShzdGFydCkpIHtcbiAgICBsZXQgd3JhcCA9IG9wdGlvbnMud3JhcCA9PT0gdHJ1ZTtcbiAgICBsZXQgcHJlZml4ID0gb3B0aW9ucy5jYXB0dXJlID8gJycgOiAnPzonO1xuICAgIHJldHVybiB3cmFwID8gYCgke3ByZWZpeH0ke3N0YXJ0LmpvaW4oJ3wnKX0pYCA6IHN0YXJ0LmpvaW4oJ3wnKTtcbiAgfVxuICByZXR1cm4gdG9SZWdleFJhbmdlKHN0YXJ0LCBlbmQsIG9wdGlvbnMpO1xufTtcblxuY29uc3QgcmFuZ2VFcnJvciA9ICguLi5hcmdzKSA9PiB7XG4gIHJldHVybiBuZXcgUmFuZ2VFcnJvcignSW52YWxpZCByYW5nZSBhcmd1bWVudHM6ICcgKyB1dGlsLmluc3BlY3QoLi4uYXJncykpO1xufTtcblxuY29uc3QgaW52YWxpZFJhbmdlID0gKHN0YXJ0LCBlbmQsIG9wdGlvbnMpID0+IHtcbiAgaWYgKG9wdGlvbnMuc3RyaWN0UmFuZ2VzID09PSB0cnVlKSB0aHJvdyByYW5nZUVycm9yKFtzdGFydCwgZW5kXSk7XG4gIHJldHVybiBbXTtcbn07XG5cbmNvbnN0IGludmFsaWRTdGVwID0gKHN0ZXAsIG9wdGlvbnMpID0+IHtcbiAgaWYgKG9wdGlvbnMuc3RyaWN0UmFuZ2VzID09PSB0cnVlKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgRXhwZWN0ZWQgc3RlcCBcIiR7c3RlcH1cIiB0byBiZSBhIG51bWJlcmApO1xuICB9XG4gIHJldHVybiBbXTtcbn07XG5cbmNvbnN0IGZpbGxOdW1iZXJzID0gKHN0YXJ0LCBlbmQsIHN0ZXAgPSAxLCBvcHRpb25zID0ge30pID0+IHtcbiAgbGV0IGEgPSBOdW1iZXIoc3RhcnQpO1xuICBsZXQgYiA9IE51bWJlcihlbmQpO1xuXG4gIGlmICghTnVtYmVyLmlzSW50ZWdlcihhKSB8fCAhTnVtYmVyLmlzSW50ZWdlcihiKSkge1xuICAgIGlmIChvcHRpb25zLnN0cmljdFJhbmdlcyA9PT0gdHJ1ZSkgdGhyb3cgcmFuZ2VFcnJvcihbc3RhcnQsIGVuZF0pO1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIC8vIGZpeCBuZWdhdGl2ZSB6ZXJvXG4gIGlmIChhID09PSAwKSBhID0gMDtcbiAgaWYgKGIgPT09IDApIGIgPSAwO1xuXG4gIGxldCBkZXNjZW5kaW5nID0gYSA+IGI7XG4gIGxldCBzdGFydFN0cmluZyA9IFN0cmluZyhzdGFydCk7XG4gIGxldCBlbmRTdHJpbmcgPSBTdHJpbmcoZW5kKTtcbiAgbGV0IHN0ZXBTdHJpbmcgPSBTdHJpbmcoc3RlcCk7XG4gIHN0ZXAgPSBNYXRoLm1heChNYXRoLmFicyhzdGVwKSwgMSk7XG5cbiAgbGV0IHBhZGRlZCA9IHplcm9zKHN0YXJ0U3RyaW5nKSB8fCB6ZXJvcyhlbmRTdHJpbmcpIHx8IHplcm9zKHN0ZXBTdHJpbmcpO1xuICBsZXQgbWF4TGVuID0gcGFkZGVkID8gTWF0aC5tYXgoc3RhcnRTdHJpbmcubGVuZ3RoLCBlbmRTdHJpbmcubGVuZ3RoLCBzdGVwU3RyaW5nLmxlbmd0aCkgOiAwO1xuICBsZXQgdG9OdW1iZXIgPSBwYWRkZWQgPT09IGZhbHNlICYmIHN0cmluZ2lmeShzdGFydCwgZW5kLCBvcHRpb25zKSA9PT0gZmFsc2U7XG4gIGxldCBmb3JtYXQgPSBvcHRpb25zLnRyYW5zZm9ybSB8fCB0cmFuc2Zvcm0odG9OdW1iZXIpO1xuXG4gIGlmIChvcHRpb25zLnRvUmVnZXggJiYgc3RlcCA9PT0gMSkge1xuICAgIHJldHVybiB0b1JhbmdlKHRvTWF4TGVuKHN0YXJ0LCBtYXhMZW4pLCB0b01heExlbihlbmQsIG1heExlbiksIHRydWUsIG9wdGlvbnMpO1xuICB9XG5cbiAgbGV0IHBhcnRzID0geyBuZWdhdGl2ZXM6IFtdLCBwb3NpdGl2ZXM6IFtdIH07XG4gIGxldCBwdXNoID0gbnVtID0+IHBhcnRzW251bSA8IDAgPyAnbmVnYXRpdmVzJyA6ICdwb3NpdGl2ZXMnXS5wdXNoKE1hdGguYWJzKG51bSkpO1xuICBsZXQgcmFuZ2UgPSBbXTtcbiAgbGV0IGluZGV4ID0gMDtcblxuICB3aGlsZSAoZGVzY2VuZGluZyA/IGEgPj0gYiA6IGEgPD0gYikge1xuICAgIGlmIChvcHRpb25zLnRvUmVnZXggPT09IHRydWUgJiYgc3RlcCA+IDEpIHtcbiAgICAgIHB1c2goYSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJhbmdlLnB1c2gocGFkKGZvcm1hdChhLCBpbmRleCksIG1heExlbiwgdG9OdW1iZXIpKTtcbiAgICB9XG4gICAgYSA9IGRlc2NlbmRpbmcgPyBhIC0gc3RlcCA6IGEgKyBzdGVwO1xuICAgIGluZGV4Kys7XG4gIH1cblxuICBpZiAob3B0aW9ucy50b1JlZ2V4ID09PSB0cnVlKSB7XG4gICAgcmV0dXJuIHN0ZXAgPiAxXG4gICAgICA/IHRvU2VxdWVuY2UocGFydHMsIG9wdGlvbnMpXG4gICAgICA6IHRvUmVnZXgocmFuZ2UsIG51bGwsIHsgd3JhcDogZmFsc2UsIC4uLm9wdGlvbnMgfSk7XG4gIH1cblxuICByZXR1cm4gcmFuZ2U7XG59O1xuXG5jb25zdCBmaWxsTGV0dGVycyA9IChzdGFydCwgZW5kLCBzdGVwID0gMSwgb3B0aW9ucyA9IHt9KSA9PiB7XG4gIGlmICgoIWlzTnVtYmVyKHN0YXJ0KSAmJiBzdGFydC5sZW5ndGggPiAxKSB8fCAoIWlzTnVtYmVyKGVuZCkgJiYgZW5kLmxlbmd0aCA+IDEpKSB7XG4gICAgcmV0dXJuIGludmFsaWRSYW5nZShzdGFydCwgZW5kLCBvcHRpb25zKTtcbiAgfVxuXG5cbiAgbGV0IGZvcm1hdCA9IG9wdGlvbnMudHJhbnNmb3JtIHx8ICh2YWwgPT4gU3RyaW5nLmZyb21DaGFyQ29kZSh2YWwpKTtcbiAgbGV0IGEgPSBgJHtzdGFydH1gLmNoYXJDb2RlQXQoMCk7XG4gIGxldCBiID0gYCR7ZW5kfWAuY2hhckNvZGVBdCgwKTtcblxuICBsZXQgZGVzY2VuZGluZyA9IGEgPiBiO1xuICBsZXQgbWluID0gTWF0aC5taW4oYSwgYik7XG4gIGxldCBtYXggPSBNYXRoLm1heChhLCBiKTtcblxuICBpZiAob3B0aW9ucy50b1JlZ2V4ICYmIHN0ZXAgPT09IDEpIHtcbiAgICByZXR1cm4gdG9SYW5nZShtaW4sIG1heCwgZmFsc2UsIG9wdGlvbnMpO1xuICB9XG5cbiAgbGV0IHJhbmdlID0gW107XG4gIGxldCBpbmRleCA9IDA7XG5cbiAgd2hpbGUgKGRlc2NlbmRpbmcgPyBhID49IGIgOiBhIDw9IGIpIHtcbiAgICByYW5nZS5wdXNoKGZvcm1hdChhLCBpbmRleCkpO1xuICAgIGEgPSBkZXNjZW5kaW5nID8gYSAtIHN0ZXAgOiBhICsgc3RlcDtcbiAgICBpbmRleCsrO1xuICB9XG5cbiAgaWYgKG9wdGlvbnMudG9SZWdleCA9PT0gdHJ1ZSkge1xuICAgIHJldHVybiB0b1JlZ2V4KHJhbmdlLCBudWxsLCB7IHdyYXA6IGZhbHNlLCBvcHRpb25zIH0pO1xuICB9XG5cbiAgcmV0dXJuIHJhbmdlO1xufTtcblxuY29uc3QgZmlsbCA9IChzdGFydCwgZW5kLCBzdGVwLCBvcHRpb25zID0ge30pID0+IHtcbiAgaWYgKGVuZCA9PSBudWxsICYmIGlzVmFsaWRWYWx1ZShzdGFydCkpIHtcbiAgICByZXR1cm4gW3N0YXJ0XTtcbiAgfVxuXG4gIGlmICghaXNWYWxpZFZhbHVlKHN0YXJ0KSB8fCAhaXNWYWxpZFZhbHVlKGVuZCkpIHtcbiAgICByZXR1cm4gaW52YWxpZFJhbmdlKHN0YXJ0LCBlbmQsIG9wdGlvbnMpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBzdGVwID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIGZpbGwoc3RhcnQsIGVuZCwgMSwgeyB0cmFuc2Zvcm06IHN0ZXAgfSk7XG4gIH1cblxuICBpZiAoaXNPYmplY3Qoc3RlcCkpIHtcbiAgICByZXR1cm4gZmlsbChzdGFydCwgZW5kLCAwLCBzdGVwKTtcbiAgfVxuXG4gIGxldCBvcHRzID0geyAuLi5vcHRpb25zIH07XG4gIGlmIChvcHRzLmNhcHR1cmUgPT09IHRydWUpIG9wdHMud3JhcCA9IHRydWU7XG4gIHN0ZXAgPSBzdGVwIHx8IG9wdHMuc3RlcCB8fCAxO1xuXG4gIGlmICghaXNOdW1iZXIoc3RlcCkpIHtcbiAgICBpZiAoc3RlcCAhPSBudWxsICYmICFpc09iamVjdChzdGVwKSkgcmV0dXJuIGludmFsaWRTdGVwKHN0ZXAsIG9wdHMpO1xuICAgIHJldHVybiBmaWxsKHN0YXJ0LCBlbmQsIDEsIHN0ZXApO1xuICB9XG5cbiAgaWYgKGlzTnVtYmVyKHN0YXJ0KSAmJiBpc051bWJlcihlbmQpKSB7XG4gICAgcmV0dXJuIGZpbGxOdW1iZXJzKHN0YXJ0LCBlbmQsIHN0ZXAsIG9wdHMpO1xuICB9XG5cbiAgcmV0dXJuIGZpbGxMZXR0ZXJzKHN0YXJ0LCBlbmQsIE1hdGgubWF4KE1hdGguYWJzKHN0ZXApLCAxKSwgb3B0cyk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZpbGw7XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBmaWxsID0gcmVxdWlyZSgnZmlsbC1yYW5nZScpO1xuY29uc3QgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG5cbmNvbnN0IGNvbXBpbGUgPSAoYXN0LCBvcHRpb25zID0ge30pID0+IHtcbiAgbGV0IHdhbGsgPSAobm9kZSwgcGFyZW50ID0ge30pID0+IHtcbiAgICBsZXQgaW52YWxpZEJsb2NrID0gdXRpbHMuaXNJbnZhbGlkQnJhY2UocGFyZW50KTtcbiAgICBsZXQgaW52YWxpZE5vZGUgPSBub2RlLmludmFsaWQgPT09IHRydWUgJiYgb3B0aW9ucy5lc2NhcGVJbnZhbGlkID09PSB0cnVlO1xuICAgIGxldCBpbnZhbGlkID0gaW52YWxpZEJsb2NrID09PSB0cnVlIHx8IGludmFsaWROb2RlID09PSB0cnVlO1xuICAgIGxldCBwcmVmaXggPSBvcHRpb25zLmVzY2FwZUludmFsaWQgPT09IHRydWUgPyAnXFxcXCcgOiAnJztcbiAgICBsZXQgb3V0cHV0ID0gJyc7XG5cbiAgICBpZiAobm9kZS5pc09wZW4gPT09IHRydWUpIHtcbiAgICAgIHJldHVybiBwcmVmaXggKyBub2RlLnZhbHVlO1xuICAgIH1cbiAgICBpZiAobm9kZS5pc0Nsb3NlID09PSB0cnVlKSB7XG4gICAgICByZXR1cm4gcHJlZml4ICsgbm9kZS52YWx1ZTtcbiAgICB9XG5cbiAgICBpZiAobm9kZS50eXBlID09PSAnb3BlbicpIHtcbiAgICAgIHJldHVybiBpbnZhbGlkID8gKHByZWZpeCArIG5vZGUudmFsdWUpIDogJygnO1xuICAgIH1cblxuICAgIGlmIChub2RlLnR5cGUgPT09ICdjbG9zZScpIHtcbiAgICAgIHJldHVybiBpbnZhbGlkID8gKHByZWZpeCArIG5vZGUudmFsdWUpIDogJyknO1xuICAgIH1cblxuICAgIGlmIChub2RlLnR5cGUgPT09ICdjb21tYScpIHtcbiAgICAgIHJldHVybiBub2RlLnByZXYudHlwZSA9PT0gJ2NvbW1hJyA/ICcnIDogKGludmFsaWQgPyBub2RlLnZhbHVlIDogJ3wnKTtcbiAgICB9XG5cbiAgICBpZiAobm9kZS52YWx1ZSkge1xuICAgICAgcmV0dXJuIG5vZGUudmFsdWU7XG4gICAgfVxuXG4gICAgaWYgKG5vZGUubm9kZXMgJiYgbm9kZS5yYW5nZXMgPiAwKSB7XG4gICAgICBsZXQgYXJncyA9IHV0aWxzLnJlZHVjZShub2RlLm5vZGVzKTtcbiAgICAgIGxldCByYW5nZSA9IGZpbGwoLi4uYXJncywgeyAuLi5vcHRpb25zLCB3cmFwOiBmYWxzZSwgdG9SZWdleDogdHJ1ZSB9KTtcblxuICAgICAgaWYgKHJhbmdlLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICByZXR1cm4gYXJncy5sZW5ndGggPiAxICYmIHJhbmdlLmxlbmd0aCA+IDEgPyBgKCR7cmFuZ2V9KWAgOiByYW5nZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobm9kZS5ub2Rlcykge1xuICAgICAgZm9yIChsZXQgY2hpbGQgb2Ygbm9kZS5ub2Rlcykge1xuICAgICAgICBvdXRwdXQgKz0gd2FsayhjaGlsZCwgbm9kZSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvdXRwdXQ7XG4gIH07XG5cbiAgcmV0dXJuIHdhbGsoYXN0KTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gY29tcGlsZTtcbiIsICIndXNlIHN0cmljdCc7XG5cbmNvbnN0IGZpbGwgPSByZXF1aXJlKCdmaWxsLXJhbmdlJyk7XG5jb25zdCBzdHJpbmdpZnkgPSByZXF1aXJlKCcuL3N0cmluZ2lmeScpO1xuY29uc3QgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG5cbmNvbnN0IGFwcGVuZCA9IChxdWV1ZSA9ICcnLCBzdGFzaCA9ICcnLCBlbmNsb3NlID0gZmFsc2UpID0+IHtcbiAgbGV0IHJlc3VsdCA9IFtdO1xuXG4gIHF1ZXVlID0gW10uY29uY2F0KHF1ZXVlKTtcbiAgc3Rhc2ggPSBbXS5jb25jYXQoc3Rhc2gpO1xuXG4gIGlmICghc3Rhc2gubGVuZ3RoKSByZXR1cm4gcXVldWU7XG4gIGlmICghcXVldWUubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGVuY2xvc2UgPyB1dGlscy5mbGF0dGVuKHN0YXNoKS5tYXAoZWxlID0+IGB7JHtlbGV9fWApIDogc3Rhc2g7XG4gIH1cblxuICBmb3IgKGxldCBpdGVtIG9mIHF1ZXVlKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoaXRlbSkpIHtcbiAgICAgIGZvciAobGV0IHZhbHVlIG9mIGl0ZW0pIHtcbiAgICAgICAgcmVzdWx0LnB1c2goYXBwZW5kKHZhbHVlLCBzdGFzaCwgZW5jbG9zZSkpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGxldCBlbGUgb2Ygc3Rhc2gpIHtcbiAgICAgICAgaWYgKGVuY2xvc2UgPT09IHRydWUgJiYgdHlwZW9mIGVsZSA9PT0gJ3N0cmluZycpIGVsZSA9IGB7JHtlbGV9fWA7XG4gICAgICAgIHJlc3VsdC5wdXNoKEFycmF5LmlzQXJyYXkoZWxlKSA/IGFwcGVuZChpdGVtLCBlbGUsIGVuY2xvc2UpIDogKGl0ZW0gKyBlbGUpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHV0aWxzLmZsYXR0ZW4ocmVzdWx0KTtcbn07XG5cbmNvbnN0IGV4cGFuZCA9IChhc3QsIG9wdGlvbnMgPSB7fSkgPT4ge1xuICBsZXQgcmFuZ2VMaW1pdCA9IG9wdGlvbnMucmFuZ2VMaW1pdCA9PT0gdm9pZCAwID8gMTAwMCA6IG9wdGlvbnMucmFuZ2VMaW1pdDtcblxuICBsZXQgd2FsayA9IChub2RlLCBwYXJlbnQgPSB7fSkgPT4ge1xuICAgIG5vZGUucXVldWUgPSBbXTtcblxuICAgIGxldCBwID0gcGFyZW50O1xuICAgIGxldCBxID0gcGFyZW50LnF1ZXVlO1xuXG4gICAgd2hpbGUgKHAudHlwZSAhPT0gJ2JyYWNlJyAmJiBwLnR5cGUgIT09ICdyb290JyAmJiBwLnBhcmVudCkge1xuICAgICAgcCA9IHAucGFyZW50O1xuICAgICAgcSA9IHAucXVldWU7XG4gICAgfVxuXG4gICAgaWYgKG5vZGUuaW52YWxpZCB8fCBub2RlLmRvbGxhcikge1xuICAgICAgcS5wdXNoKGFwcGVuZChxLnBvcCgpLCBzdHJpbmdpZnkobm9kZSwgb3B0aW9ucykpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAobm9kZS50eXBlID09PSAnYnJhY2UnICYmIG5vZGUuaW52YWxpZCAhPT0gdHJ1ZSAmJiBub2RlLm5vZGVzLmxlbmd0aCA9PT0gMikge1xuICAgICAgcS5wdXNoKGFwcGVuZChxLnBvcCgpLCBbJ3t9J10pKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAobm9kZS5ub2RlcyAmJiBub2RlLnJhbmdlcyA+IDApIHtcbiAgICAgIGxldCBhcmdzID0gdXRpbHMucmVkdWNlKG5vZGUubm9kZXMpO1xuXG4gICAgICBpZiAodXRpbHMuZXhjZWVkc0xpbWl0KC4uLmFyZ3MsIG9wdGlvbnMuc3RlcCwgcmFuZ2VMaW1pdCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ2V4cGFuZGVkIGFycmF5IGxlbmd0aCBleGNlZWRzIHJhbmdlIGxpbWl0LiBVc2Ugb3B0aW9ucy5yYW5nZUxpbWl0IHRvIGluY3JlYXNlIG9yIGRpc2FibGUgdGhlIGxpbWl0LicpO1xuICAgICAgfVxuXG4gICAgICBsZXQgcmFuZ2UgPSBmaWxsKC4uLmFyZ3MsIG9wdGlvbnMpO1xuICAgICAgaWYgKHJhbmdlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByYW5nZSA9IHN0cmluZ2lmeShub2RlLCBvcHRpb25zKTtcbiAgICAgIH1cblxuICAgICAgcS5wdXNoKGFwcGVuZChxLnBvcCgpLCByYW5nZSkpO1xuICAgICAgbm9kZS5ub2RlcyA9IFtdO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBlbmNsb3NlID0gdXRpbHMuZW5jbG9zZUJyYWNlKG5vZGUpO1xuICAgIGxldCBxdWV1ZSA9IG5vZGUucXVldWU7XG4gICAgbGV0IGJsb2NrID0gbm9kZTtcblxuICAgIHdoaWxlIChibG9jay50eXBlICE9PSAnYnJhY2UnICYmIGJsb2NrLnR5cGUgIT09ICdyb290JyAmJiBibG9jay5wYXJlbnQpIHtcbiAgICAgIGJsb2NrID0gYmxvY2sucGFyZW50O1xuICAgICAgcXVldWUgPSBibG9jay5xdWV1ZTtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGUubm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGxldCBjaGlsZCA9IG5vZGUubm9kZXNbaV07XG5cbiAgICAgIGlmIChjaGlsZC50eXBlID09PSAnY29tbWEnICYmIG5vZGUudHlwZSA9PT0gJ2JyYWNlJykge1xuICAgICAgICBpZiAoaSA9PT0gMSkgcXVldWUucHVzaCgnJyk7XG4gICAgICAgIHF1ZXVlLnB1c2goJycpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNoaWxkLnR5cGUgPT09ICdjbG9zZScpIHtcbiAgICAgICAgcS5wdXNoKGFwcGVuZChxLnBvcCgpLCBxdWV1ZSwgZW5jbG9zZSkpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNoaWxkLnZhbHVlICYmIGNoaWxkLnR5cGUgIT09ICdvcGVuJykge1xuICAgICAgICBxdWV1ZS5wdXNoKGFwcGVuZChxdWV1ZS5wb3AoKSwgY2hpbGQudmFsdWUpKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChjaGlsZC5ub2Rlcykge1xuICAgICAgICB3YWxrKGNoaWxkLCBub2RlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcXVldWU7XG4gIH07XG5cbiAgcmV0dXJuIHV0aWxzLmZsYXR0ZW4od2Fsayhhc3QpKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZXhwYW5kO1xuIiwgIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIE1BWF9MRU5HVEg6IDEwMjQgKiA2NCxcblxuICAvLyBEaWdpdHNcbiAgQ0hBUl8wOiAnMCcsIC8qIDAgKi9cbiAgQ0hBUl85OiAnOScsIC8qIDkgKi9cblxuICAvLyBBbHBoYWJldCBjaGFycy5cbiAgQ0hBUl9VUFBFUkNBU0VfQTogJ0EnLCAvKiBBICovXG4gIENIQVJfTE9XRVJDQVNFX0E6ICdhJywgLyogYSAqL1xuICBDSEFSX1VQUEVSQ0FTRV9aOiAnWicsIC8qIFogKi9cbiAgQ0hBUl9MT1dFUkNBU0VfWjogJ3onLCAvKiB6ICovXG5cbiAgQ0hBUl9MRUZUX1BBUkVOVEhFU0VTOiAnKCcsIC8qICggKi9cbiAgQ0hBUl9SSUdIVF9QQVJFTlRIRVNFUzogJyknLCAvKiApICovXG5cbiAgQ0hBUl9BU1RFUklTSzogJyonLCAvKiAqICovXG5cbiAgLy8gTm9uLWFscGhhYmV0aWMgY2hhcnMuXG4gIENIQVJfQU1QRVJTQU5EOiAnJicsIC8qICYgKi9cbiAgQ0hBUl9BVDogJ0AnLCAvKiBAICovXG4gIENIQVJfQkFDS1NMQVNIOiAnXFxcXCcsIC8qIFxcICovXG4gIENIQVJfQkFDS1RJQ0s6ICdgJywgLyogYCAqL1xuICBDSEFSX0NBUlJJQUdFX1JFVFVSTjogJ1xccicsIC8qIFxcciAqL1xuICBDSEFSX0NJUkNVTUZMRVhfQUNDRU5UOiAnXicsIC8qIF4gKi9cbiAgQ0hBUl9DT0xPTjogJzonLCAvKiA6ICovXG4gIENIQVJfQ09NTUE6ICcsJywgLyogLCAqL1xuICBDSEFSX0RPTExBUjogJyQnLCAvKiAuICovXG4gIENIQVJfRE9UOiAnLicsIC8qIC4gKi9cbiAgQ0hBUl9ET1VCTEVfUVVPVEU6ICdcIicsIC8qIFwiICovXG4gIENIQVJfRVFVQUw6ICc9JywgLyogPSAqL1xuICBDSEFSX0VYQ0xBTUFUSU9OX01BUks6ICchJywgLyogISAqL1xuICBDSEFSX0ZPUk1fRkVFRDogJ1xcZicsIC8qIFxcZiAqL1xuICBDSEFSX0ZPUldBUkRfU0xBU0g6ICcvJywgLyogLyAqL1xuICBDSEFSX0hBU0g6ICcjJywgLyogIyAqL1xuICBDSEFSX0hZUEhFTl9NSU5VUzogJy0nLCAvKiAtICovXG4gIENIQVJfTEVGVF9BTkdMRV9CUkFDS0VUOiAnPCcsIC8qIDwgKi9cbiAgQ0hBUl9MRUZUX0NVUkxZX0JSQUNFOiAneycsIC8qIHsgKi9cbiAgQ0hBUl9MRUZUX1NRVUFSRV9CUkFDS0VUOiAnWycsIC8qIFsgKi9cbiAgQ0hBUl9MSU5FX0ZFRUQ6ICdcXG4nLCAvKiBcXG4gKi9cbiAgQ0hBUl9OT19CUkVBS19TUEFDRTogJ1xcdTAwQTAnLCAvKiBcXHUwMEEwICovXG4gIENIQVJfUEVSQ0VOVDogJyUnLCAvKiAlICovXG4gIENIQVJfUExVUzogJysnLCAvKiArICovXG4gIENIQVJfUVVFU1RJT05fTUFSSzogJz8nLCAvKiA/ICovXG4gIENIQVJfUklHSFRfQU5HTEVfQlJBQ0tFVDogJz4nLCAvKiA+ICovXG4gIENIQVJfUklHSFRfQ1VSTFlfQlJBQ0U6ICd9JywgLyogfSAqL1xuICBDSEFSX1JJR0hUX1NRVUFSRV9CUkFDS0VUOiAnXScsIC8qIF0gKi9cbiAgQ0hBUl9TRU1JQ09MT046ICc7JywgLyogOyAqL1xuICBDSEFSX1NJTkdMRV9RVU9URTogJ1xcJycsIC8qICcgKi9cbiAgQ0hBUl9TUEFDRTogJyAnLCAvKiAgICovXG4gIENIQVJfVEFCOiAnXFx0JywgLyogXFx0ICovXG4gIENIQVJfVU5ERVJTQ09SRTogJ18nLCAvKiBfICovXG4gIENIQVJfVkVSVElDQUxfTElORTogJ3wnLCAvKiB8ICovXG4gIENIQVJfWkVST19XSURUSF9OT0JSRUFLX1NQQUNFOiAnXFx1RkVGRicgLyogXFx1RkVGRiAqL1xufTtcbiIsICIndXNlIHN0cmljdCc7XG5cbmNvbnN0IHN0cmluZ2lmeSA9IHJlcXVpcmUoJy4vc3RyaW5naWZ5Jyk7XG5cbi8qKlxuICogQ29uc3RhbnRzXG4gKi9cblxuY29uc3Qge1xuICBNQVhfTEVOR1RILFxuICBDSEFSX0JBQ0tTTEFTSCwgLyogXFwgKi9cbiAgQ0hBUl9CQUNLVElDSywgLyogYCAqL1xuICBDSEFSX0NPTU1BLCAvKiAsICovXG4gIENIQVJfRE9ULCAvKiAuICovXG4gIENIQVJfTEVGVF9QQVJFTlRIRVNFUywgLyogKCAqL1xuICBDSEFSX1JJR0hUX1BBUkVOVEhFU0VTLCAvKiApICovXG4gIENIQVJfTEVGVF9DVVJMWV9CUkFDRSwgLyogeyAqL1xuICBDSEFSX1JJR0hUX0NVUkxZX0JSQUNFLCAvKiB9ICovXG4gIENIQVJfTEVGVF9TUVVBUkVfQlJBQ0tFVCwgLyogWyAqL1xuICBDSEFSX1JJR0hUX1NRVUFSRV9CUkFDS0VULCAvKiBdICovXG4gIENIQVJfRE9VQkxFX1FVT1RFLCAvKiBcIiAqL1xuICBDSEFSX1NJTkdMRV9RVU9URSwgLyogJyAqL1xuICBDSEFSX05PX0JSRUFLX1NQQUNFLFxuICBDSEFSX1pFUk9fV0lEVEhfTk9CUkVBS19TUEFDRVxufSA9IHJlcXVpcmUoJy4vY29uc3RhbnRzJyk7XG5cbi8qKlxuICogcGFyc2VcbiAqL1xuXG5jb25zdCBwYXJzZSA9IChpbnB1dCwgb3B0aW9ucyA9IHt9KSA9PiB7XG4gIGlmICh0eXBlb2YgaW5wdXQgIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgYSBzdHJpbmcnKTtcbiAgfVxuXG4gIGxldCBvcHRzID0gb3B0aW9ucyB8fCB7fTtcbiAgbGV0IG1heCA9IHR5cGVvZiBvcHRzLm1heExlbmd0aCA9PT0gJ251bWJlcicgPyBNYXRoLm1pbihNQVhfTEVOR1RILCBvcHRzLm1heExlbmd0aCkgOiBNQVhfTEVOR1RIO1xuICBpZiAoaW5wdXQubGVuZ3RoID4gbWF4KSB7XG4gICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKGBJbnB1dCBsZW5ndGggKCR7aW5wdXQubGVuZ3RofSksIGV4Y2VlZHMgbWF4IGNoYXJhY3RlcnMgKCR7bWF4fSlgKTtcbiAgfVxuXG4gIGxldCBhc3QgPSB7IHR5cGU6ICdyb290JywgaW5wdXQsIG5vZGVzOiBbXSB9O1xuICBsZXQgc3RhY2sgPSBbYXN0XTtcbiAgbGV0IGJsb2NrID0gYXN0O1xuICBsZXQgcHJldiA9IGFzdDtcbiAgbGV0IGJyYWNrZXRzID0gMDtcbiAgbGV0IGxlbmd0aCA9IGlucHV0Lmxlbmd0aDtcbiAgbGV0IGluZGV4ID0gMDtcbiAgbGV0IGRlcHRoID0gMDtcbiAgbGV0IHZhbHVlO1xuICBsZXQgbWVtbyA9IHt9O1xuXG4gIC8qKlxuICAgKiBIZWxwZXJzXG4gICAqL1xuXG4gIGNvbnN0IGFkdmFuY2UgPSAoKSA9PiBpbnB1dFtpbmRleCsrXTtcbiAgY29uc3QgcHVzaCA9IG5vZGUgPT4ge1xuICAgIGlmIChub2RlLnR5cGUgPT09ICd0ZXh0JyAmJiBwcmV2LnR5cGUgPT09ICdkb3QnKSB7XG4gICAgICBwcmV2LnR5cGUgPSAndGV4dCc7XG4gICAgfVxuXG4gICAgaWYgKHByZXYgJiYgcHJldi50eXBlID09PSAndGV4dCcgJiYgbm9kZS50eXBlID09PSAndGV4dCcpIHtcbiAgICAgIHByZXYudmFsdWUgKz0gbm9kZS52YWx1ZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBibG9jay5ub2Rlcy5wdXNoKG5vZGUpO1xuICAgIG5vZGUucGFyZW50ID0gYmxvY2s7XG4gICAgbm9kZS5wcmV2ID0gcHJldjtcbiAgICBwcmV2ID0gbm9kZTtcbiAgICByZXR1cm4gbm9kZTtcbiAgfTtcblxuICBwdXNoKHsgdHlwZTogJ2JvcycgfSk7XG5cbiAgd2hpbGUgKGluZGV4IDwgbGVuZ3RoKSB7XG4gICAgYmxvY2sgPSBzdGFja1tzdGFjay5sZW5ndGggLSAxXTtcbiAgICB2YWx1ZSA9IGFkdmFuY2UoKTtcblxuICAgIC8qKlxuICAgICAqIEludmFsaWQgY2hhcnNcbiAgICAgKi9cblxuICAgIGlmICh2YWx1ZSA9PT0gQ0hBUl9aRVJPX1dJRFRIX05PQlJFQUtfU1BBQ0UgfHwgdmFsdWUgPT09IENIQVJfTk9fQlJFQUtfU1BBQ0UpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVzY2FwZWQgY2hhcnNcbiAgICAgKi9cblxuICAgIGlmICh2YWx1ZSA9PT0gQ0hBUl9CQUNLU0xBU0gpIHtcbiAgICAgIHB1c2goeyB0eXBlOiAndGV4dCcsIHZhbHVlOiAob3B0aW9ucy5rZWVwRXNjYXBpbmcgPyB2YWx1ZSA6ICcnKSArIGFkdmFuY2UoKSB9KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJpZ2h0IHNxdWFyZSBicmFja2V0IChsaXRlcmFsKTogJ10nXG4gICAgICovXG5cbiAgICBpZiAodmFsdWUgPT09IENIQVJfUklHSFRfU1FVQVJFX0JSQUNLRVQpIHtcbiAgICAgIHB1c2goeyB0eXBlOiAndGV4dCcsIHZhbHVlOiAnXFxcXCcgKyB2YWx1ZSB9KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExlZnQgc3F1YXJlIGJyYWNrZXQ6ICdbJ1xuICAgICAqL1xuXG4gICAgaWYgKHZhbHVlID09PSBDSEFSX0xFRlRfU1FVQVJFX0JSQUNLRVQpIHtcbiAgICAgIGJyYWNrZXRzKys7XG5cbiAgICAgIGxldCBjbG9zZWQgPSB0cnVlO1xuICAgICAgbGV0IG5leHQ7XG5cbiAgICAgIHdoaWxlIChpbmRleCA8IGxlbmd0aCAmJiAobmV4dCA9IGFkdmFuY2UoKSkpIHtcbiAgICAgICAgdmFsdWUgKz0gbmV4dDtcblxuICAgICAgICBpZiAobmV4dCA9PT0gQ0hBUl9MRUZUX1NRVUFSRV9CUkFDS0VUKSB7XG4gICAgICAgICAgYnJhY2tldHMrKztcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChuZXh0ID09PSBDSEFSX0JBQ0tTTEFTSCkge1xuICAgICAgICAgIHZhbHVlICs9IGFkdmFuY2UoKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChuZXh0ID09PSBDSEFSX1JJR0hUX1NRVUFSRV9CUkFDS0VUKSB7XG4gICAgICAgICAgYnJhY2tldHMtLTtcblxuICAgICAgICAgIGlmIChicmFja2V0cyA9PT0gMCkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHB1c2goeyB0eXBlOiAndGV4dCcsIHZhbHVlIH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGFyZW50aGVzZXNcbiAgICAgKi9cblxuICAgIGlmICh2YWx1ZSA9PT0gQ0hBUl9MRUZUX1BBUkVOVEhFU0VTKSB7XG4gICAgICBibG9jayA9IHB1c2goeyB0eXBlOiAncGFyZW4nLCBub2RlczogW10gfSk7XG4gICAgICBzdGFjay5wdXNoKGJsb2NrKTtcbiAgICAgIHB1c2goeyB0eXBlOiAndGV4dCcsIHZhbHVlIH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKHZhbHVlID09PSBDSEFSX1JJR0hUX1BBUkVOVEhFU0VTKSB7XG4gICAgICBpZiAoYmxvY2sudHlwZSAhPT0gJ3BhcmVuJykge1xuICAgICAgICBwdXNoKHsgdHlwZTogJ3RleHQnLCB2YWx1ZSB9KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBibG9jayA9IHN0YWNrLnBvcCgpO1xuICAgICAgcHVzaCh7IHR5cGU6ICd0ZXh0JywgdmFsdWUgfSk7XG4gICAgICBibG9jayA9IHN0YWNrW3N0YWNrLmxlbmd0aCAtIDFdO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUXVvdGVzOiAnfFwifGBcbiAgICAgKi9cblxuICAgIGlmICh2YWx1ZSA9PT0gQ0hBUl9ET1VCTEVfUVVPVEUgfHwgdmFsdWUgPT09IENIQVJfU0lOR0xFX1FVT1RFIHx8IHZhbHVlID09PSBDSEFSX0JBQ0tUSUNLKSB7XG4gICAgICBsZXQgb3BlbiA9IHZhbHVlO1xuICAgICAgbGV0IG5leHQ7XG5cbiAgICAgIGlmIChvcHRpb25zLmtlZXBRdW90ZXMgIT09IHRydWUpIHtcbiAgICAgICAgdmFsdWUgPSAnJztcbiAgICAgIH1cblxuICAgICAgd2hpbGUgKGluZGV4IDwgbGVuZ3RoICYmIChuZXh0ID0gYWR2YW5jZSgpKSkge1xuICAgICAgICBpZiAobmV4dCA9PT0gQ0hBUl9CQUNLU0xBU0gpIHtcbiAgICAgICAgICB2YWx1ZSArPSBuZXh0ICsgYWR2YW5jZSgpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG5leHQgPT09IG9wZW4pIHtcbiAgICAgICAgICBpZiAob3B0aW9ucy5rZWVwUXVvdGVzID09PSB0cnVlKSB2YWx1ZSArPSBuZXh0O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFsdWUgKz0gbmV4dDtcbiAgICAgIH1cblxuICAgICAgcHVzaCh7IHR5cGU6ICd0ZXh0JywgdmFsdWUgfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMZWZ0IGN1cmx5IGJyYWNlOiAneydcbiAgICAgKi9cblxuICAgIGlmICh2YWx1ZSA9PT0gQ0hBUl9MRUZUX0NVUkxZX0JSQUNFKSB7XG4gICAgICBkZXB0aCsrO1xuXG4gICAgICBsZXQgZG9sbGFyID0gcHJldi52YWx1ZSAmJiBwcmV2LnZhbHVlLnNsaWNlKC0xKSA9PT0gJyQnIHx8IGJsb2NrLmRvbGxhciA9PT0gdHJ1ZTtcbiAgICAgIGxldCBicmFjZSA9IHtcbiAgICAgICAgdHlwZTogJ2JyYWNlJyxcbiAgICAgICAgb3BlbjogdHJ1ZSxcbiAgICAgICAgY2xvc2U6IGZhbHNlLFxuICAgICAgICBkb2xsYXIsXG4gICAgICAgIGRlcHRoLFxuICAgICAgICBjb21tYXM6IDAsXG4gICAgICAgIHJhbmdlczogMCxcbiAgICAgICAgbm9kZXM6IFtdXG4gICAgICB9O1xuXG4gICAgICBibG9jayA9IHB1c2goYnJhY2UpO1xuICAgICAgc3RhY2sucHVzaChibG9jayk7XG4gICAgICBwdXNoKHsgdHlwZTogJ29wZW4nLCB2YWx1ZSB9KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJpZ2h0IGN1cmx5IGJyYWNlOiAnfSdcbiAgICAgKi9cblxuICAgIGlmICh2YWx1ZSA9PT0gQ0hBUl9SSUdIVF9DVVJMWV9CUkFDRSkge1xuICAgICAgaWYgKGJsb2NrLnR5cGUgIT09ICdicmFjZScpIHtcbiAgICAgICAgcHVzaCh7IHR5cGU6ICd0ZXh0JywgdmFsdWUgfSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBsZXQgdHlwZSA9ICdjbG9zZSc7XG4gICAgICBibG9jayA9IHN0YWNrLnBvcCgpO1xuICAgICAgYmxvY2suY2xvc2UgPSB0cnVlO1xuXG4gICAgICBwdXNoKHsgdHlwZSwgdmFsdWUgfSk7XG4gICAgICBkZXB0aC0tO1xuXG4gICAgICBibG9jayA9IHN0YWNrW3N0YWNrLmxlbmd0aCAtIDFdO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29tbWE6ICcsJ1xuICAgICAqL1xuXG4gICAgaWYgKHZhbHVlID09PSBDSEFSX0NPTU1BICYmIGRlcHRoID4gMCkge1xuICAgICAgaWYgKGJsb2NrLnJhbmdlcyA+IDApIHtcbiAgICAgICAgYmxvY2sucmFuZ2VzID0gMDtcbiAgICAgICAgbGV0IG9wZW4gPSBibG9jay5ub2Rlcy5zaGlmdCgpO1xuICAgICAgICBibG9jay5ub2RlcyA9IFtvcGVuLCB7IHR5cGU6ICd0ZXh0JywgdmFsdWU6IHN0cmluZ2lmeShibG9jaykgfV07XG4gICAgICB9XG5cbiAgICAgIHB1c2goeyB0eXBlOiAnY29tbWEnLCB2YWx1ZSB9KTtcbiAgICAgIGJsb2NrLmNvbW1hcysrO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRG90OiAnLidcbiAgICAgKi9cblxuICAgIGlmICh2YWx1ZSA9PT0gQ0hBUl9ET1QgJiYgZGVwdGggPiAwICYmIGJsb2NrLmNvbW1hcyA9PT0gMCkge1xuICAgICAgbGV0IHNpYmxpbmdzID0gYmxvY2subm9kZXM7XG5cbiAgICAgIGlmIChkZXB0aCA9PT0gMCB8fCBzaWJsaW5ncy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcHVzaCh7IHR5cGU6ICd0ZXh0JywgdmFsdWUgfSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAocHJldi50eXBlID09PSAnZG90Jykge1xuICAgICAgICBibG9jay5yYW5nZSA9IFtdO1xuICAgICAgICBwcmV2LnZhbHVlICs9IHZhbHVlO1xuICAgICAgICBwcmV2LnR5cGUgPSAncmFuZ2UnO1xuXG4gICAgICAgIGlmIChibG9jay5ub2Rlcy5sZW5ndGggIT09IDMgJiYgYmxvY2subm9kZXMubGVuZ3RoICE9PSA1KSB7XG4gICAgICAgICAgYmxvY2suaW52YWxpZCA9IHRydWU7XG4gICAgICAgICAgYmxvY2sucmFuZ2VzID0gMDtcbiAgICAgICAgICBwcmV2LnR5cGUgPSAndGV4dCc7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBibG9jay5yYW5nZXMrKztcbiAgICAgICAgYmxvY2suYXJncyA9IFtdO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHByZXYudHlwZSA9PT0gJ3JhbmdlJykge1xuICAgICAgICBzaWJsaW5ncy5wb3AoKTtcblxuICAgICAgICBsZXQgYmVmb3JlID0gc2libGluZ3Nbc2libGluZ3MubGVuZ3RoIC0gMV07XG4gICAgICAgIGJlZm9yZS52YWx1ZSArPSBwcmV2LnZhbHVlICsgdmFsdWU7XG4gICAgICAgIHByZXYgPSBiZWZvcmU7XG4gICAgICAgIGJsb2NrLnJhbmdlcy0tO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgcHVzaCh7IHR5cGU6ICdkb3QnLCB2YWx1ZSB9KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRleHRcbiAgICAgKi9cblxuICAgIHB1c2goeyB0eXBlOiAndGV4dCcsIHZhbHVlIH0pO1xuICB9XG5cbiAgLy8gTWFyayBpbWJhbGFuY2VkIGJyYWNlcyBhbmQgYnJhY2tldHMgYXMgaW52YWxpZFxuICBkbyB7XG4gICAgYmxvY2sgPSBzdGFjay5wb3AoKTtcblxuICAgIGlmIChibG9jay50eXBlICE9PSAncm9vdCcpIHtcbiAgICAgIGJsb2NrLm5vZGVzLmZvckVhY2gobm9kZSA9PiB7XG4gICAgICAgIGlmICghbm9kZS5ub2Rlcykge1xuICAgICAgICAgIGlmIChub2RlLnR5cGUgPT09ICdvcGVuJykgbm9kZS5pc09wZW4gPSB0cnVlO1xuICAgICAgICAgIGlmIChub2RlLnR5cGUgPT09ICdjbG9zZScpIG5vZGUuaXNDbG9zZSA9IHRydWU7XG4gICAgICAgICAgaWYgKCFub2RlLm5vZGVzKSBub2RlLnR5cGUgPSAndGV4dCc7XG4gICAgICAgICAgbm9kZS5pbnZhbGlkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIGdldCB0aGUgbG9jYXRpb24gb2YgdGhlIGJsb2NrIG9uIHBhcmVudC5ub2RlcyAoYmxvY2sncyBzaWJsaW5ncylcbiAgICAgIGxldCBwYXJlbnQgPSBzdGFja1tzdGFjay5sZW5ndGggLSAxXTtcbiAgICAgIGxldCBpbmRleCA9IHBhcmVudC5ub2Rlcy5pbmRleE9mKGJsb2NrKTtcbiAgICAgIC8vIHJlcGxhY2UgdGhlIChpbnZhbGlkKSBibG9jayB3aXRoIGl0J3Mgbm9kZXNcbiAgICAgIHBhcmVudC5ub2Rlcy5zcGxpY2UoaW5kZXgsIDEsIC4uLmJsb2NrLm5vZGVzKTtcbiAgICB9XG4gIH0gd2hpbGUgKHN0YWNrLmxlbmd0aCA+IDApO1xuXG4gIHB1c2goeyB0eXBlOiAnZW9zJyB9KTtcbiAgcmV0dXJuIGFzdDtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gcGFyc2U7XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBzdHJpbmdpZnkgPSByZXF1aXJlKCcuL2xpYi9zdHJpbmdpZnknKTtcbmNvbnN0IGNvbXBpbGUgPSByZXF1aXJlKCcuL2xpYi9jb21waWxlJyk7XG5jb25zdCBleHBhbmQgPSByZXF1aXJlKCcuL2xpYi9leHBhbmQnKTtcbmNvbnN0IHBhcnNlID0gcmVxdWlyZSgnLi9saWIvcGFyc2UnKTtcblxuLyoqXG4gKiBFeHBhbmQgdGhlIGdpdmVuIHBhdHRlcm4gb3IgY3JlYXRlIGEgcmVnZXgtY29tcGF0aWJsZSBzdHJpbmcuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGJyYWNlcyA9IHJlcXVpcmUoJ2JyYWNlcycpO1xuICogY29uc29sZS5sb2coYnJhY2VzKCd7YSxiLGN9JywgeyBjb21waWxlOiB0cnVlIH0pKTsgLy89PiBbJyhhfGJ8YyknXVxuICogY29uc29sZS5sb2coYnJhY2VzKCd7YSxiLGN9JykpOyAvLz0+IFsnYScsICdiJywgJ2MnXVxuICogYGBgXG4gKiBAcGFyYW0ge1N0cmluZ30gYHN0cmBcbiAqIEBwYXJhbSB7T2JqZWN0fSBgb3B0aW9uc2BcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuY29uc3QgYnJhY2VzID0gKGlucHV0LCBvcHRpb25zID0ge30pID0+IHtcbiAgbGV0IG91dHB1dCA9IFtdO1xuXG4gIGlmIChBcnJheS5pc0FycmF5KGlucHV0KSkge1xuICAgIGZvciAobGV0IHBhdHRlcm4gb2YgaW5wdXQpIHtcbiAgICAgIGxldCByZXN1bHQgPSBicmFjZXMuY3JlYXRlKHBhdHRlcm4sIG9wdGlvbnMpO1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkocmVzdWx0KSkge1xuICAgICAgICBvdXRwdXQucHVzaCguLi5yZXN1bHQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3V0cHV0LnB1c2gocmVzdWx0KTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgb3V0cHV0ID0gW10uY29uY2F0KGJyYWNlcy5jcmVhdGUoaW5wdXQsIG9wdGlvbnMpKTtcbiAgfVxuXG4gIGlmIChvcHRpb25zICYmIG9wdGlvbnMuZXhwYW5kID09PSB0cnVlICYmIG9wdGlvbnMubm9kdXBlcyA9PT0gdHJ1ZSkge1xuICAgIG91dHB1dCA9IFsuLi5uZXcgU2V0KG91dHB1dCldO1xuICB9XG4gIHJldHVybiBvdXRwdXQ7XG59O1xuXG4vKipcbiAqIFBhcnNlIHRoZSBnaXZlbiBgc3RyYCB3aXRoIHRoZSBnaXZlbiBgb3B0aW9uc2AuXG4gKlxuICogYGBganNcbiAqIC8vIGJyYWNlcy5wYXJzZShwYXR0ZXJuLCBbLCBvcHRpb25zXSk7XG4gKiBjb25zdCBhc3QgPSBicmFjZXMucGFyc2UoJ2Eve2IsY30vZCcpO1xuICogY29uc29sZS5sb2coYXN0KTtcbiAqIGBgYFxuICogQHBhcmFtIHtTdHJpbmd9IHBhdHRlcm4gQnJhY2UgcGF0dGVybiB0byBwYXJzZVxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAqIEByZXR1cm4ge09iamVjdH0gUmV0dXJucyBhbiBBU1RcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuYnJhY2VzLnBhcnNlID0gKGlucHV0LCBvcHRpb25zID0ge30pID0+IHBhcnNlKGlucHV0LCBvcHRpb25zKTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgYnJhY2VzIHN0cmluZyBmcm9tIGFuIEFTVCwgb3IgYW4gQVNUIG5vZGUuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGJyYWNlcyA9IHJlcXVpcmUoJ2JyYWNlcycpO1xuICogbGV0IGFzdCA9IGJyYWNlcy5wYXJzZSgnZm9vL3thLGJ9L2JhcicpO1xuICogY29uc29sZS5sb2coc3RyaW5naWZ5KGFzdC5ub2Rlc1syXSkpOyAvLz0+ICd7YSxifSdcbiAqIGBgYFxuICogQHBhcmFtIHtTdHJpbmd9IGBpbnB1dGAgQnJhY2UgcGF0dGVybiBvciBBU1QuXG4gKiBAcGFyYW0ge09iamVjdH0gYG9wdGlvbnNgXG4gKiBAcmV0dXJuIHtBcnJheX0gUmV0dXJucyBhbiBhcnJheSBvZiBleHBhbmRlZCB2YWx1ZXMuXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmJyYWNlcy5zdHJpbmdpZnkgPSAoaW5wdXQsIG9wdGlvbnMgPSB7fSkgPT4ge1xuICBpZiAodHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBzdHJpbmdpZnkoYnJhY2VzLnBhcnNlKGlucHV0LCBvcHRpb25zKSwgb3B0aW9ucyk7XG4gIH1cbiAgcmV0dXJuIHN0cmluZ2lmeShpbnB1dCwgb3B0aW9ucyk7XG59O1xuXG4vKipcbiAqIENvbXBpbGVzIGEgYnJhY2UgcGF0dGVybiBpbnRvIGEgcmVnZXgtY29tcGF0aWJsZSwgb3B0aW1pemVkIHN0cmluZy5cbiAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGUgbWFpbiBbYnJhY2VzXSgjYnJhY2VzKSBmdW5jdGlvbiBieSBkZWZhdWx0LlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBicmFjZXMgPSByZXF1aXJlKCdicmFjZXMnKTtcbiAqIGNvbnNvbGUubG9nKGJyYWNlcy5jb21waWxlKCdhL3tiLGN9L2QnKSk7XG4gKiAvLz0+IFsnYS8oYnxjKS9kJ11cbiAqIGBgYFxuICogQHBhcmFtIHtTdHJpbmd9IGBpbnB1dGAgQnJhY2UgcGF0dGVybiBvciBBU1QuXG4gKiBAcGFyYW0ge09iamVjdH0gYG9wdGlvbnNgXG4gKiBAcmV0dXJuIHtBcnJheX0gUmV0dXJucyBhbiBhcnJheSBvZiBleHBhbmRlZCB2YWx1ZXMuXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmJyYWNlcy5jb21waWxlID0gKGlucHV0LCBvcHRpb25zID0ge30pID0+IHtcbiAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZycpIHtcbiAgICBpbnB1dCA9IGJyYWNlcy5wYXJzZShpbnB1dCwgb3B0aW9ucyk7XG4gIH1cbiAgcmV0dXJuIGNvbXBpbGUoaW5wdXQsIG9wdGlvbnMpO1xufTtcblxuLyoqXG4gKiBFeHBhbmRzIGEgYnJhY2UgcGF0dGVybiBpbnRvIGFuIGFycmF5LiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGhlXG4gKiBtYWluIFticmFjZXNdKCNicmFjZXMpIGZ1bmN0aW9uIHdoZW4gYG9wdGlvbnMuZXhwYW5kYCBpcyB0cnVlLiBCZWZvcmVcbiAqIHVzaW5nIHRoaXMgbWV0aG9kIGl0J3MgcmVjb21tZW5kZWQgdGhhdCB5b3UgcmVhZCB0aGUgW3BlcmZvcm1hbmNlIG5vdGVzXSgjcGVyZm9ybWFuY2UpKVxuICogYW5kIGFkdmFudGFnZXMgb2YgdXNpbmcgWy5jb21waWxlXSgjY29tcGlsZSkgaW5zdGVhZC5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgYnJhY2VzID0gcmVxdWlyZSgnYnJhY2VzJyk7XG4gKiBjb25zb2xlLmxvZyhicmFjZXMuZXhwYW5kKCdhL3tiLGN9L2QnKSk7XG4gKiAvLz0+IFsnYS9iL2QnLCAnYS9jL2QnXTtcbiAqIGBgYFxuICogQHBhcmFtIHtTdHJpbmd9IGBwYXR0ZXJuYCBCcmFjZSBwYXR0ZXJuXG4gKiBAcGFyYW0ge09iamVjdH0gYG9wdGlvbnNgXG4gKiBAcmV0dXJuIHtBcnJheX0gUmV0dXJucyBhbiBhcnJheSBvZiBleHBhbmRlZCB2YWx1ZXMuXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmJyYWNlcy5leHBhbmQgPSAoaW5wdXQsIG9wdGlvbnMgPSB7fSkgPT4ge1xuICBpZiAodHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJykge1xuICAgIGlucHV0ID0gYnJhY2VzLnBhcnNlKGlucHV0LCBvcHRpb25zKTtcbiAgfVxuXG4gIGxldCByZXN1bHQgPSBleHBhbmQoaW5wdXQsIG9wdGlvbnMpO1xuXG4gIC8vIGZpbHRlciBvdXQgZW1wdHkgc3RyaW5ncyBpZiBzcGVjaWZpZWRcbiAgaWYgKG9wdGlvbnMubm9lbXB0eSA9PT0gdHJ1ZSkge1xuICAgIHJlc3VsdCA9IHJlc3VsdC5maWx0ZXIoQm9vbGVhbik7XG4gIH1cblxuICAvLyBmaWx0ZXIgb3V0IGR1cGxpY2F0ZXMgaWYgc3BlY2lmaWVkXG4gIGlmIChvcHRpb25zLm5vZHVwZXMgPT09IHRydWUpIHtcbiAgICByZXN1bHQgPSBbLi4ubmV3IFNldChyZXN1bHQpXTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vKipcbiAqIFByb2Nlc3NlcyBhIGJyYWNlIHBhdHRlcm4gYW5kIHJldHVybnMgZWl0aGVyIGFuIGV4cGFuZGVkIGFycmF5XG4gKiAoaWYgYG9wdGlvbnMuZXhwYW5kYCBpcyB0cnVlKSwgYSBoaWdobHkgb3B0aW1pemVkIHJlZ2V4LWNvbXBhdGlibGUgc3RyaW5nLlxuICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoZSBtYWluIFticmFjZXNdKCNicmFjZXMpIGZ1bmN0aW9uLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBicmFjZXMgPSByZXF1aXJlKCdicmFjZXMnKTtcbiAqIGNvbnNvbGUubG9nKGJyYWNlcy5jcmVhdGUoJ3VzZXItezIwMC4uMzAwfS9wcm9qZWN0LXthLGIsY30tezEuLjEwfScpKVxuICogLy89PiAndXNlci0oMjBbMC05XXwyWzEtOV1bMC05XXwzMDApL3Byb2plY3QtKGF8YnxjKS0oWzEtOV18MTApJ1xuICogYGBgXG4gKiBAcGFyYW0ge1N0cmluZ30gYHBhdHRlcm5gIEJyYWNlIHBhdHRlcm5cbiAqIEBwYXJhbSB7T2JqZWN0fSBgb3B0aW9uc2BcbiAqIEByZXR1cm4ge0FycmF5fSBSZXR1cm5zIGFuIGFycmF5IG9mIGV4cGFuZGVkIHZhbHVlcy5cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuYnJhY2VzLmNyZWF0ZSA9IChpbnB1dCwgb3B0aW9ucyA9IHt9KSA9PiB7XG4gIGlmIChpbnB1dCA9PT0gJycgfHwgaW5wdXQubGVuZ3RoIDwgMykge1xuICAgIHJldHVybiBbaW5wdXRdO1xuICB9XG5cbiByZXR1cm4gb3B0aW9ucy5leHBhbmQgIT09IHRydWVcbiAgICA/IGJyYWNlcy5jb21waWxlKGlucHV0LCBvcHRpb25zKVxuICAgIDogYnJhY2VzLmV4cGFuZChpbnB1dCwgb3B0aW9ucyk7XG59O1xuXG4vKipcbiAqIEV4cG9zZSBcImJyYWNlc1wiXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBicmFjZXM7XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBwYXRoID0gcmVxdWlyZSgncGF0aCcpO1xuY29uc3QgV0lOX1NMQVNIID0gJ1xcXFxcXFxcLyc7XG5jb25zdCBXSU5fTk9fU0xBU0ggPSBgW14ke1dJTl9TTEFTSH1dYDtcblxuLyoqXG4gKiBQb3NpeCBnbG9iIHJlZ2V4XG4gKi9cblxuY29uc3QgRE9UX0xJVEVSQUwgPSAnXFxcXC4nO1xuY29uc3QgUExVU19MSVRFUkFMID0gJ1xcXFwrJztcbmNvbnN0IFFNQVJLX0xJVEVSQUwgPSAnXFxcXD8nO1xuY29uc3QgU0xBU0hfTElURVJBTCA9ICdcXFxcLyc7XG5jb25zdCBPTkVfQ0hBUiA9ICcoPz0uKSc7XG5jb25zdCBRTUFSSyA9ICdbXi9dJztcbmNvbnN0IEVORF9BTkNIT1IgPSBgKD86JHtTTEFTSF9MSVRFUkFMfXwkKWA7XG5jb25zdCBTVEFSVF9BTkNIT1IgPSBgKD86Xnwke1NMQVNIX0xJVEVSQUx9KWA7XG5jb25zdCBET1RTX1NMQVNIID0gYCR7RE9UX0xJVEVSQUx9ezEsMn0ke0VORF9BTkNIT1J9YDtcbmNvbnN0IE5PX0RPVCA9IGAoPyEke0RPVF9MSVRFUkFMfSlgO1xuY29uc3QgTk9fRE9UUyA9IGAoPyEke1NUQVJUX0FOQ0hPUn0ke0RPVFNfU0xBU0h9KWA7XG5jb25zdCBOT19ET1RfU0xBU0ggPSBgKD8hJHtET1RfTElURVJBTH17MCwxfSR7RU5EX0FOQ0hPUn0pYDtcbmNvbnN0IE5PX0RPVFNfU0xBU0ggPSBgKD8hJHtET1RTX1NMQVNIfSlgO1xuY29uc3QgUU1BUktfTk9fRE9UID0gYFteLiR7U0xBU0hfTElURVJBTH1dYDtcbmNvbnN0IFNUQVIgPSBgJHtRTUFSS30qP2A7XG5cbmNvbnN0IFBPU0lYX0NIQVJTID0ge1xuICBET1RfTElURVJBTCxcbiAgUExVU19MSVRFUkFMLFxuICBRTUFSS19MSVRFUkFMLFxuICBTTEFTSF9MSVRFUkFMLFxuICBPTkVfQ0hBUixcbiAgUU1BUkssXG4gIEVORF9BTkNIT1IsXG4gIERPVFNfU0xBU0gsXG4gIE5PX0RPVCxcbiAgTk9fRE9UUyxcbiAgTk9fRE9UX1NMQVNILFxuICBOT19ET1RTX1NMQVNILFxuICBRTUFSS19OT19ET1QsXG4gIFNUQVIsXG4gIFNUQVJUX0FOQ0hPUlxufTtcblxuLyoqXG4gKiBXaW5kb3dzIGdsb2IgcmVnZXhcbiAqL1xuXG5jb25zdCBXSU5ET1dTX0NIQVJTID0ge1xuICAuLi5QT1NJWF9DSEFSUyxcblxuICBTTEFTSF9MSVRFUkFMOiBgWyR7V0lOX1NMQVNIfV1gLFxuICBRTUFSSzogV0lOX05PX1NMQVNILFxuICBTVEFSOiBgJHtXSU5fTk9fU0xBU0h9Kj9gLFxuICBET1RTX1NMQVNIOiBgJHtET1RfTElURVJBTH17MSwyfSg/Olske1dJTl9TTEFTSH1dfCQpYCxcbiAgTk9fRE9UOiBgKD8hJHtET1RfTElURVJBTH0pYCxcbiAgTk9fRE9UUzogYCg/ISg/Ol58WyR7V0lOX1NMQVNIfV0pJHtET1RfTElURVJBTH17MSwyfSg/Olske1dJTl9TTEFTSH1dfCQpKWAsXG4gIE5PX0RPVF9TTEFTSDogYCg/ISR7RE9UX0xJVEVSQUx9ezAsMX0oPzpbJHtXSU5fU0xBU0h9XXwkKSlgLFxuICBOT19ET1RTX1NMQVNIOiBgKD8hJHtET1RfTElURVJBTH17MSwyfSg/Olske1dJTl9TTEFTSH1dfCQpKWAsXG4gIFFNQVJLX05PX0RPVDogYFteLiR7V0lOX1NMQVNIfV1gLFxuICBTVEFSVF9BTkNIT1I6IGAoPzpefFske1dJTl9TTEFTSH1dKWAsXG4gIEVORF9BTkNIT1I6IGAoPzpbJHtXSU5fU0xBU0h9XXwkKWBcbn07XG5cbi8qKlxuICogUE9TSVggQnJhY2tldCBSZWdleFxuICovXG5cbmNvbnN0IFBPU0lYX1JFR0VYX1NPVVJDRSA9IHtcbiAgYWxudW06ICdhLXpBLVowLTknLFxuICBhbHBoYTogJ2EtekEtWicsXG4gIGFzY2lpOiAnXFxcXHgwMC1cXFxceDdGJyxcbiAgYmxhbms6ICcgXFxcXHQnLFxuICBjbnRybDogJ1xcXFx4MDAtXFxcXHgxRlxcXFx4N0YnLFxuICBkaWdpdDogJzAtOScsXG4gIGdyYXBoOiAnXFxcXHgyMS1cXFxceDdFJyxcbiAgbG93ZXI6ICdhLXonLFxuICBwcmludDogJ1xcXFx4MjAtXFxcXHg3RSAnLFxuICBwdW5jdDogJ1xcXFwtIVwiIyQlJlxcJygpXFxcXCorLC4vOjs8PT4/QFtcXFxcXV5fYHt8fX4nLFxuICBzcGFjZTogJyBcXFxcdFxcXFxyXFxcXG5cXFxcdlxcXFxmJyxcbiAgdXBwZXI6ICdBLVonLFxuICB3b3JkOiAnQS1aYS16MC05XycsXG4gIHhkaWdpdDogJ0EtRmEtZjAtOSdcbn07XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBNQVhfTEVOR1RIOiAxMDI0ICogNjQsXG4gIFBPU0lYX1JFR0VYX1NPVVJDRSxcblxuICAvLyByZWd1bGFyIGV4cHJlc3Npb25zXG4gIFJFR0VYX0JBQ0tTTEFTSDogL1xcXFwoPyFbKis/XiR7fSh8KVtcXF1dKS9nLFxuICBSRUdFWF9OT05fU1BFQ0lBTF9DSEFSUzogL15bXkAhW1xcXS4sJCorP157fSgpfFxcXFwvXSsvLFxuICBSRUdFWF9TUEVDSUFMX0NIQVJTOiAvWy0qKz8uXiR7fSh8KVtcXF1dLyxcbiAgUkVHRVhfU1BFQ0lBTF9DSEFSU19CQUNLUkVGOiAvKFxcXFw/KSgoXFxXKShcXDMqKSkvZyxcbiAgUkVHRVhfU1BFQ0lBTF9DSEFSU19HTE9CQUw6IC8oWy0qKz8uXiR7fSh8KVtcXF1dKS9nLFxuICBSRUdFWF9SRU1PVkVfQkFDS1NMQVNIOiAvKD86XFxbLio/W15cXFxcXVxcXXxcXFxcKD89LikpL2csXG5cbiAgLy8gUmVwbGFjZSBnbG9icyB3aXRoIGVxdWl2YWxlbnQgcGF0dGVybnMgdG8gcmVkdWNlIHBhcnNpbmcgdGltZS5cbiAgUkVQTEFDRU1FTlRTOiB7XG4gICAgJyoqKic6ICcqJyxcbiAgICAnKiovKionOiAnKionLFxuICAgICcqKi8qKi8qKic6ICcqKidcbiAgfSxcblxuICAvLyBEaWdpdHNcbiAgQ0hBUl8wOiA0OCwgLyogMCAqL1xuICBDSEFSXzk6IDU3LCAvKiA5ICovXG5cbiAgLy8gQWxwaGFiZXQgY2hhcnMuXG4gIENIQVJfVVBQRVJDQVNFX0E6IDY1LCAvKiBBICovXG4gIENIQVJfTE9XRVJDQVNFX0E6IDk3LCAvKiBhICovXG4gIENIQVJfVVBQRVJDQVNFX1o6IDkwLCAvKiBaICovXG4gIENIQVJfTE9XRVJDQVNFX1o6IDEyMiwgLyogeiAqL1xuXG4gIENIQVJfTEVGVF9QQVJFTlRIRVNFUzogNDAsIC8qICggKi9cbiAgQ0hBUl9SSUdIVF9QQVJFTlRIRVNFUzogNDEsIC8qICkgKi9cblxuICBDSEFSX0FTVEVSSVNLOiA0MiwgLyogKiAqL1xuXG4gIC8vIE5vbi1hbHBoYWJldGljIGNoYXJzLlxuICBDSEFSX0FNUEVSU0FORDogMzgsIC8qICYgKi9cbiAgQ0hBUl9BVDogNjQsIC8qIEAgKi9cbiAgQ0hBUl9CQUNLV0FSRF9TTEFTSDogOTIsIC8qIFxcICovXG4gIENIQVJfQ0FSUklBR0VfUkVUVVJOOiAxMywgLyogXFxyICovXG4gIENIQVJfQ0lSQ1VNRkxFWF9BQ0NFTlQ6IDk0LCAvKiBeICovXG4gIENIQVJfQ09MT046IDU4LCAvKiA6ICovXG4gIENIQVJfQ09NTUE6IDQ0LCAvKiAsICovXG4gIENIQVJfRE9UOiA0NiwgLyogLiAqL1xuICBDSEFSX0RPVUJMRV9RVU9URTogMzQsIC8qIFwiICovXG4gIENIQVJfRVFVQUw6IDYxLCAvKiA9ICovXG4gIENIQVJfRVhDTEFNQVRJT05fTUFSSzogMzMsIC8qICEgKi9cbiAgQ0hBUl9GT1JNX0ZFRUQ6IDEyLCAvKiBcXGYgKi9cbiAgQ0hBUl9GT1JXQVJEX1NMQVNIOiA0NywgLyogLyAqL1xuICBDSEFSX0dSQVZFX0FDQ0VOVDogOTYsIC8qIGAgKi9cbiAgQ0hBUl9IQVNIOiAzNSwgLyogIyAqL1xuICBDSEFSX0hZUEhFTl9NSU5VUzogNDUsIC8qIC0gKi9cbiAgQ0hBUl9MRUZUX0FOR0xFX0JSQUNLRVQ6IDYwLCAvKiA8ICovXG4gIENIQVJfTEVGVF9DVVJMWV9CUkFDRTogMTIzLCAvKiB7ICovXG4gIENIQVJfTEVGVF9TUVVBUkVfQlJBQ0tFVDogOTEsIC8qIFsgKi9cbiAgQ0hBUl9MSU5FX0ZFRUQ6IDEwLCAvKiBcXG4gKi9cbiAgQ0hBUl9OT19CUkVBS19TUEFDRTogMTYwLCAvKiBcXHUwMEEwICovXG4gIENIQVJfUEVSQ0VOVDogMzcsIC8qICUgKi9cbiAgQ0hBUl9QTFVTOiA0MywgLyogKyAqL1xuICBDSEFSX1FVRVNUSU9OX01BUks6IDYzLCAvKiA/ICovXG4gIENIQVJfUklHSFRfQU5HTEVfQlJBQ0tFVDogNjIsIC8qID4gKi9cbiAgQ0hBUl9SSUdIVF9DVVJMWV9CUkFDRTogMTI1LCAvKiB9ICovXG4gIENIQVJfUklHSFRfU1FVQVJFX0JSQUNLRVQ6IDkzLCAvKiBdICovXG4gIENIQVJfU0VNSUNPTE9OOiA1OSwgLyogOyAqL1xuICBDSEFSX1NJTkdMRV9RVU9URTogMzksIC8qICcgKi9cbiAgQ0hBUl9TUEFDRTogMzIsIC8qICAgKi9cbiAgQ0hBUl9UQUI6IDksIC8qIFxcdCAqL1xuICBDSEFSX1VOREVSU0NPUkU6IDk1LCAvKiBfICovXG4gIENIQVJfVkVSVElDQUxfTElORTogMTI0LCAvKiB8ICovXG4gIENIQVJfWkVST19XSURUSF9OT0JSRUFLX1NQQUNFOiA2NTI3OSwgLyogXFx1RkVGRiAqL1xuXG4gIFNFUDogcGF0aC5zZXAsXG5cbiAgLyoqXG4gICAqIENyZWF0ZSBFWFRHTE9CX0NIQVJTXG4gICAqL1xuXG4gIGV4dGdsb2JDaGFycyhjaGFycykge1xuICAgIHJldHVybiB7XG4gICAgICAnISc6IHsgdHlwZTogJ25lZ2F0ZScsIG9wZW46ICcoPzooPyEoPzonLCBjbG9zZTogYCkpJHtjaGFycy5TVEFSfSlgIH0sXG4gICAgICAnPyc6IHsgdHlwZTogJ3FtYXJrJywgb3BlbjogJyg/OicsIGNsb3NlOiAnKT8nIH0sXG4gICAgICAnKyc6IHsgdHlwZTogJ3BsdXMnLCBvcGVuOiAnKD86JywgY2xvc2U6ICcpKycgfSxcbiAgICAgICcqJzogeyB0eXBlOiAnc3RhcicsIG9wZW46ICcoPzonLCBjbG9zZTogJykqJyB9LFxuICAgICAgJ0AnOiB7IHR5cGU6ICdhdCcsIG9wZW46ICcoPzonLCBjbG9zZTogJyknIH1cbiAgICB9O1xuICB9LFxuXG4gIC8qKlxuICAgKiBDcmVhdGUgR0xPQl9DSEFSU1xuICAgKi9cblxuICBnbG9iQ2hhcnMod2luMzIpIHtcbiAgICByZXR1cm4gd2luMzIgPT09IHRydWUgPyBXSU5ET1dTX0NIQVJTIDogUE9TSVhfQ0hBUlM7XG4gIH1cbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBwYXRoID0gcmVxdWlyZSgncGF0aCcpO1xuY29uc3Qgd2luMzIgPSBwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInO1xuY29uc3Qge1xuICBSRUdFWF9CQUNLU0xBU0gsXG4gIFJFR0VYX1JFTU9WRV9CQUNLU0xBU0gsXG4gIFJFR0VYX1NQRUNJQUxfQ0hBUlMsXG4gIFJFR0VYX1NQRUNJQUxfQ0hBUlNfR0xPQkFMXG59ID0gcmVxdWlyZSgnLi9jb25zdGFudHMnKTtcblxuZXhwb3J0cy5pc09iamVjdCA9IHZhbCA9PiB2YWwgIT09IG51bGwgJiYgdHlwZW9mIHZhbCA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkodmFsKTtcbmV4cG9ydHMuaGFzUmVnZXhDaGFycyA9IHN0ciA9PiBSRUdFWF9TUEVDSUFMX0NIQVJTLnRlc3Qoc3RyKTtcbmV4cG9ydHMuaXNSZWdleENoYXIgPSBzdHIgPT4gc3RyLmxlbmd0aCA9PT0gMSAmJiBleHBvcnRzLmhhc1JlZ2V4Q2hhcnMoc3RyKTtcbmV4cG9ydHMuZXNjYXBlUmVnZXggPSBzdHIgPT4gc3RyLnJlcGxhY2UoUkVHRVhfU1BFQ0lBTF9DSEFSU19HTE9CQUwsICdcXFxcJDEnKTtcbmV4cG9ydHMudG9Qb3NpeFNsYXNoZXMgPSBzdHIgPT4gc3RyLnJlcGxhY2UoUkVHRVhfQkFDS1NMQVNILCAnLycpO1xuXG5leHBvcnRzLnJlbW92ZUJhY2tzbGFzaGVzID0gc3RyID0+IHtcbiAgcmV0dXJuIHN0ci5yZXBsYWNlKFJFR0VYX1JFTU9WRV9CQUNLU0xBU0gsIG1hdGNoID0+IHtcbiAgICByZXR1cm4gbWF0Y2ggPT09ICdcXFxcJyA/ICcnIDogbWF0Y2g7XG4gIH0pO1xufTtcblxuZXhwb3J0cy5zdXBwb3J0c0xvb2tiZWhpbmRzID0gKCkgPT4ge1xuICBjb25zdCBzZWdzID0gcHJvY2Vzcy52ZXJzaW9uLnNsaWNlKDEpLnNwbGl0KCcuJykubWFwKE51bWJlcik7XG4gIGlmIChzZWdzLmxlbmd0aCA9PT0gMyAmJiBzZWdzWzBdID49IDkgfHwgKHNlZ3NbMF0gPT09IDggJiYgc2Vnc1sxXSA+PSAxMCkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59O1xuXG5leHBvcnRzLmlzV2luZG93cyA9IG9wdGlvbnMgPT4ge1xuICBpZiAob3B0aW9ucyAmJiB0eXBlb2Ygb3B0aW9ucy53aW5kb3dzID09PSAnYm9vbGVhbicpIHtcbiAgICByZXR1cm4gb3B0aW9ucy53aW5kb3dzO1xuICB9XG4gIHJldHVybiB3aW4zMiA9PT0gdHJ1ZSB8fCBwYXRoLnNlcCA9PT0gJ1xcXFwnO1xufTtcblxuZXhwb3J0cy5lc2NhcGVMYXN0ID0gKGlucHV0LCBjaGFyLCBsYXN0SWR4KSA9PiB7XG4gIGNvbnN0IGlkeCA9IGlucHV0Lmxhc3RJbmRleE9mKGNoYXIsIGxhc3RJZHgpO1xuICBpZiAoaWR4ID09PSAtMSkgcmV0dXJuIGlucHV0O1xuICBpZiAoaW5wdXRbaWR4IC0gMV0gPT09ICdcXFxcJykgcmV0dXJuIGV4cG9ydHMuZXNjYXBlTGFzdChpbnB1dCwgY2hhciwgaWR4IC0gMSk7XG4gIHJldHVybiBgJHtpbnB1dC5zbGljZSgwLCBpZHgpfVxcXFwke2lucHV0LnNsaWNlKGlkeCl9YDtcbn07XG5cbmV4cG9ydHMucmVtb3ZlUHJlZml4ID0gKGlucHV0LCBzdGF0ZSA9IHt9KSA9PiB7XG4gIGxldCBvdXRwdXQgPSBpbnB1dDtcbiAgaWYgKG91dHB1dC5zdGFydHNXaXRoKCcuLycpKSB7XG4gICAgb3V0cHV0ID0gb3V0cHV0LnNsaWNlKDIpO1xuICAgIHN0YXRlLnByZWZpeCA9ICcuLyc7XG4gIH1cbiAgcmV0dXJuIG91dHB1dDtcbn07XG5cbmV4cG9ydHMud3JhcE91dHB1dCA9IChpbnB1dCwgc3RhdGUgPSB7fSwgb3B0aW9ucyA9IHt9KSA9PiB7XG4gIGNvbnN0IHByZXBlbmQgPSBvcHRpb25zLmNvbnRhaW5zID8gJycgOiAnXic7XG4gIGNvbnN0IGFwcGVuZCA9IG9wdGlvbnMuY29udGFpbnMgPyAnJyA6ICckJztcblxuICBsZXQgb3V0cHV0ID0gYCR7cHJlcGVuZH0oPzoke2lucHV0fSkke2FwcGVuZH1gO1xuICBpZiAoc3RhdGUubmVnYXRlZCA9PT0gdHJ1ZSkge1xuICAgIG91dHB1dCA9IGAoPzpeKD8hJHtvdXRwdXR9KS4qJClgO1xuICB9XG4gIHJldHVybiBvdXRwdXQ7XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcblxuY29uc3QgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG5jb25zdCB7XG4gIENIQVJfQVNURVJJU0ssICAgICAgICAgICAgIC8qICogKi9cbiAgQ0hBUl9BVCwgICAgICAgICAgICAgICAgICAgLyogQCAqL1xuICBDSEFSX0JBQ0tXQVJEX1NMQVNILCAgICAgICAvKiBcXCAqL1xuICBDSEFSX0NPTU1BLCAgICAgICAgICAgICAgICAvKiAsICovXG4gIENIQVJfRE9ULCAgICAgICAgICAgICAgICAgIC8qIC4gKi9cbiAgQ0hBUl9FWENMQU1BVElPTl9NQVJLLCAgICAgLyogISAqL1xuICBDSEFSX0ZPUldBUkRfU0xBU0gsICAgICAgICAvKiAvICovXG4gIENIQVJfTEVGVF9DVVJMWV9CUkFDRSwgICAgIC8qIHsgKi9cbiAgQ0hBUl9MRUZUX1BBUkVOVEhFU0VTLCAgICAgLyogKCAqL1xuICBDSEFSX0xFRlRfU1FVQVJFX0JSQUNLRVQsICAvKiBbICovXG4gIENIQVJfUExVUywgICAgICAgICAgICAgICAgIC8qICsgKi9cbiAgQ0hBUl9RVUVTVElPTl9NQVJLLCAgICAgICAgLyogPyAqL1xuICBDSEFSX1JJR0hUX0NVUkxZX0JSQUNFLCAgICAvKiB9ICovXG4gIENIQVJfUklHSFRfUEFSRU5USEVTRVMsICAgIC8qICkgKi9cbiAgQ0hBUl9SSUdIVF9TUVVBUkVfQlJBQ0tFVCAgLyogXSAqL1xufSA9IHJlcXVpcmUoJy4vY29uc3RhbnRzJyk7XG5cbmNvbnN0IGlzUGF0aFNlcGFyYXRvciA9IGNvZGUgPT4ge1xuICByZXR1cm4gY29kZSA9PT0gQ0hBUl9GT1JXQVJEX1NMQVNIIHx8IGNvZGUgPT09IENIQVJfQkFDS1dBUkRfU0xBU0g7XG59O1xuXG5jb25zdCBkZXB0aCA9IHRva2VuID0+IHtcbiAgaWYgKHRva2VuLmlzUHJlZml4ICE9PSB0cnVlKSB7XG4gICAgdG9rZW4uZGVwdGggPSB0b2tlbi5pc0dsb2JzdGFyID8gSW5maW5pdHkgOiAxO1xuICB9XG59O1xuXG4vKipcbiAqIFF1aWNrbHkgc2NhbnMgYSBnbG9iIHBhdHRlcm4gYW5kIHJldHVybnMgYW4gb2JqZWN0IHdpdGggYSBoYW5kZnVsIG9mXG4gKiB1c2VmdWwgcHJvcGVydGllcywgbGlrZSBgaXNHbG9iYCwgYHBhdGhgICh0aGUgbGVhZGluZyBub24tZ2xvYiwgaWYgaXQgZXhpc3RzKSxcbiAqIGBnbG9iYCAodGhlIGFjdHVhbCBwYXR0ZXJuKSwgYG5lZ2F0ZWRgICh0cnVlIGlmIHRoZSBwYXRoIHN0YXJ0cyB3aXRoIGAhYCBidXQgbm90XG4gKiB3aXRoIGAhKGApIGFuZCBgbmVnYXRlZEV4dGdsb2JgICh0cnVlIGlmIHRoZSBwYXRoIHN0YXJ0cyB3aXRoIGAhKGApLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBwbSA9IHJlcXVpcmUoJ3BpY29tYXRjaCcpO1xuICogY29uc29sZS5sb2cocG0uc2NhbignZm9vL2Jhci8qLmpzJykpO1xuICogeyBpc0dsb2I6IHRydWUsIGlucHV0OiAnZm9vL2Jhci8qLmpzJywgYmFzZTogJ2Zvby9iYXInLCBnbG9iOiAnKi5qcycgfVxuICogYGBgXG4gKiBAcGFyYW0ge1N0cmluZ30gYHN0cmBcbiAqIEBwYXJhbSB7T2JqZWN0fSBgb3B0aW9uc2BcbiAqIEByZXR1cm4ge09iamVjdH0gUmV0dXJucyBhbiBvYmplY3Qgd2l0aCB0b2tlbnMgYW5kIHJlZ2V4IHNvdXJjZSBzdHJpbmcuXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmNvbnN0IHNjYW4gPSAoaW5wdXQsIG9wdGlvbnMpID0+IHtcbiAgY29uc3Qgb3B0cyA9IG9wdGlvbnMgfHwge307XG5cbiAgY29uc3QgbGVuZ3RoID0gaW5wdXQubGVuZ3RoIC0gMTtcbiAgY29uc3Qgc2NhblRvRW5kID0gb3B0cy5wYXJ0cyA9PT0gdHJ1ZSB8fCBvcHRzLnNjYW5Ub0VuZCA9PT0gdHJ1ZTtcbiAgY29uc3Qgc2xhc2hlcyA9IFtdO1xuICBjb25zdCB0b2tlbnMgPSBbXTtcbiAgY29uc3QgcGFydHMgPSBbXTtcblxuICBsZXQgc3RyID0gaW5wdXQ7XG4gIGxldCBpbmRleCA9IC0xO1xuICBsZXQgc3RhcnQgPSAwO1xuICBsZXQgbGFzdEluZGV4ID0gMDtcbiAgbGV0IGlzQnJhY2UgPSBmYWxzZTtcbiAgbGV0IGlzQnJhY2tldCA9IGZhbHNlO1xuICBsZXQgaXNHbG9iID0gZmFsc2U7XG4gIGxldCBpc0V4dGdsb2IgPSBmYWxzZTtcbiAgbGV0IGlzR2xvYnN0YXIgPSBmYWxzZTtcbiAgbGV0IGJyYWNlRXNjYXBlZCA9IGZhbHNlO1xuICBsZXQgYmFja3NsYXNoZXMgPSBmYWxzZTtcbiAgbGV0IG5lZ2F0ZWQgPSBmYWxzZTtcbiAgbGV0IG5lZ2F0ZWRFeHRnbG9iID0gZmFsc2U7XG4gIGxldCBmaW5pc2hlZCA9IGZhbHNlO1xuICBsZXQgYnJhY2VzID0gMDtcbiAgbGV0IHByZXY7XG4gIGxldCBjb2RlO1xuICBsZXQgdG9rZW4gPSB7IHZhbHVlOiAnJywgZGVwdGg6IDAsIGlzR2xvYjogZmFsc2UgfTtcblxuICBjb25zdCBlb3MgPSAoKSA9PiBpbmRleCA+PSBsZW5ndGg7XG4gIGNvbnN0IHBlZWsgPSAoKSA9PiBzdHIuY2hhckNvZGVBdChpbmRleCArIDEpO1xuICBjb25zdCBhZHZhbmNlID0gKCkgPT4ge1xuICAgIHByZXYgPSBjb2RlO1xuICAgIHJldHVybiBzdHIuY2hhckNvZGVBdCgrK2luZGV4KTtcbiAgfTtcblxuICB3aGlsZSAoaW5kZXggPCBsZW5ndGgpIHtcbiAgICBjb2RlID0gYWR2YW5jZSgpO1xuICAgIGxldCBuZXh0O1xuXG4gICAgaWYgKGNvZGUgPT09IENIQVJfQkFDS1dBUkRfU0xBU0gpIHtcbiAgICAgIGJhY2tzbGFzaGVzID0gdG9rZW4uYmFja3NsYXNoZXMgPSB0cnVlO1xuICAgICAgY29kZSA9IGFkdmFuY2UoKTtcblxuICAgICAgaWYgKGNvZGUgPT09IENIQVJfTEVGVF9DVVJMWV9CUkFDRSkge1xuICAgICAgICBicmFjZUVzY2FwZWQgPSB0cnVlO1xuICAgICAgfVxuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKGJyYWNlRXNjYXBlZCA9PT0gdHJ1ZSB8fCBjb2RlID09PSBDSEFSX0xFRlRfQ1VSTFlfQlJBQ0UpIHtcbiAgICAgIGJyYWNlcysrO1xuXG4gICAgICB3aGlsZSAoZW9zKCkgIT09IHRydWUgJiYgKGNvZGUgPSBhZHZhbmNlKCkpKSB7XG4gICAgICAgIGlmIChjb2RlID09PSBDSEFSX0JBQ0tXQVJEX1NMQVNIKSB7XG4gICAgICAgICAgYmFja3NsYXNoZXMgPSB0b2tlbi5iYWNrc2xhc2hlcyA9IHRydWU7XG4gICAgICAgICAgYWR2YW5jZSgpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvZGUgPT09IENIQVJfTEVGVF9DVVJMWV9CUkFDRSkge1xuICAgICAgICAgIGJyYWNlcysrO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGJyYWNlRXNjYXBlZCAhPT0gdHJ1ZSAmJiBjb2RlID09PSBDSEFSX0RPVCAmJiAoY29kZSA9IGFkdmFuY2UoKSkgPT09IENIQVJfRE9UKSB7XG4gICAgICAgICAgaXNCcmFjZSA9IHRva2VuLmlzQnJhY2UgPSB0cnVlO1xuICAgICAgICAgIGlzR2xvYiA9IHRva2VuLmlzR2xvYiA9IHRydWU7XG4gICAgICAgICAgZmluaXNoZWQgPSB0cnVlO1xuXG4gICAgICAgICAgaWYgKHNjYW5Ub0VuZCA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYnJhY2VFc2NhcGVkICE9PSB0cnVlICYmIGNvZGUgPT09IENIQVJfQ09NTUEpIHtcbiAgICAgICAgICBpc0JyYWNlID0gdG9rZW4uaXNCcmFjZSA9IHRydWU7XG4gICAgICAgICAgaXNHbG9iID0gdG9rZW4uaXNHbG9iID0gdHJ1ZTtcbiAgICAgICAgICBmaW5pc2hlZCA9IHRydWU7XG5cbiAgICAgICAgICBpZiAoc2NhblRvRW5kID09PSB0cnVlKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb2RlID09PSBDSEFSX1JJR0hUX0NVUkxZX0JSQUNFKSB7XG4gICAgICAgICAgYnJhY2VzLS07XG5cbiAgICAgICAgICBpZiAoYnJhY2VzID09PSAwKSB7XG4gICAgICAgICAgICBicmFjZUVzY2FwZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIGlzQnJhY2UgPSB0b2tlbi5pc0JyYWNlID0gdHJ1ZTtcbiAgICAgICAgICAgIGZpbmlzaGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoc2NhblRvRW5kID09PSB0cnVlKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBpZiAoY29kZSA9PT0gQ0hBUl9GT1JXQVJEX1NMQVNIKSB7XG4gICAgICBzbGFzaGVzLnB1c2goaW5kZXgpO1xuICAgICAgdG9rZW5zLnB1c2godG9rZW4pO1xuICAgICAgdG9rZW4gPSB7IHZhbHVlOiAnJywgZGVwdGg6IDAsIGlzR2xvYjogZmFsc2UgfTtcblxuICAgICAgaWYgKGZpbmlzaGVkID09PSB0cnVlKSBjb250aW51ZTtcbiAgICAgIGlmIChwcmV2ID09PSBDSEFSX0RPVCAmJiBpbmRleCA9PT0gKHN0YXJ0ICsgMSkpIHtcbiAgICAgICAgc3RhcnQgKz0gMjtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGxhc3RJbmRleCA9IGluZGV4ICsgMTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChvcHRzLm5vZXh0ICE9PSB0cnVlKSB7XG4gICAgICBjb25zdCBpc0V4dGdsb2JDaGFyID0gY29kZSA9PT0gQ0hBUl9QTFVTXG4gICAgICAgIHx8IGNvZGUgPT09IENIQVJfQVRcbiAgICAgICAgfHwgY29kZSA9PT0gQ0hBUl9BU1RFUklTS1xuICAgICAgICB8fCBjb2RlID09PSBDSEFSX1FVRVNUSU9OX01BUktcbiAgICAgICAgfHwgY29kZSA9PT0gQ0hBUl9FWENMQU1BVElPTl9NQVJLO1xuXG4gICAgICBpZiAoaXNFeHRnbG9iQ2hhciA9PT0gdHJ1ZSAmJiBwZWVrKCkgPT09IENIQVJfTEVGVF9QQVJFTlRIRVNFUykge1xuICAgICAgICBpc0dsb2IgPSB0b2tlbi5pc0dsb2IgPSB0cnVlO1xuICAgICAgICBpc0V4dGdsb2IgPSB0b2tlbi5pc0V4dGdsb2IgPSB0cnVlO1xuICAgICAgICBmaW5pc2hlZCA9IHRydWU7XG4gICAgICAgIGlmIChjb2RlID09PSBDSEFSX0VYQ0xBTUFUSU9OX01BUksgJiYgaW5kZXggPT09IHN0YXJ0KSB7XG4gICAgICAgICAgbmVnYXRlZEV4dGdsb2IgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNjYW5Ub0VuZCA9PT0gdHJ1ZSkge1xuICAgICAgICAgIHdoaWxlIChlb3MoKSAhPT0gdHJ1ZSAmJiAoY29kZSA9IGFkdmFuY2UoKSkpIHtcbiAgICAgICAgICAgIGlmIChjb2RlID09PSBDSEFSX0JBQ0tXQVJEX1NMQVNIKSB7XG4gICAgICAgICAgICAgIGJhY2tzbGFzaGVzID0gdG9rZW4uYmFja3NsYXNoZXMgPSB0cnVlO1xuICAgICAgICAgICAgICBjb2RlID0gYWR2YW5jZSgpO1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGNvZGUgPT09IENIQVJfUklHSFRfUEFSRU5USEVTRVMpIHtcbiAgICAgICAgICAgICAgaXNHbG9iID0gdG9rZW4uaXNHbG9iID0gdHJ1ZTtcbiAgICAgICAgICAgICAgZmluaXNoZWQgPSB0cnVlO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNvZGUgPT09IENIQVJfQVNURVJJU0spIHtcbiAgICAgIGlmIChwcmV2ID09PSBDSEFSX0FTVEVSSVNLKSBpc0dsb2JzdGFyID0gdG9rZW4uaXNHbG9ic3RhciA9IHRydWU7XG4gICAgICBpc0dsb2IgPSB0b2tlbi5pc0dsb2IgPSB0cnVlO1xuICAgICAgZmluaXNoZWQgPSB0cnVlO1xuXG4gICAgICBpZiAoc2NhblRvRW5kID09PSB0cnVlKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgaWYgKGNvZGUgPT09IENIQVJfUVVFU1RJT05fTUFSSykge1xuICAgICAgaXNHbG9iID0gdG9rZW4uaXNHbG9iID0gdHJ1ZTtcbiAgICAgIGZpbmlzaGVkID0gdHJ1ZTtcblxuICAgICAgaWYgKHNjYW5Ub0VuZCA9PT0gdHJ1ZSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGlmIChjb2RlID09PSBDSEFSX0xFRlRfU1FVQVJFX0JSQUNLRVQpIHtcbiAgICAgIHdoaWxlIChlb3MoKSAhPT0gdHJ1ZSAmJiAobmV4dCA9IGFkdmFuY2UoKSkpIHtcbiAgICAgICAgaWYgKG5leHQgPT09IENIQVJfQkFDS1dBUkRfU0xBU0gpIHtcbiAgICAgICAgICBiYWNrc2xhc2hlcyA9IHRva2VuLmJhY2tzbGFzaGVzID0gdHJ1ZTtcbiAgICAgICAgICBhZHZhbmNlKCk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobmV4dCA9PT0gQ0hBUl9SSUdIVF9TUVVBUkVfQlJBQ0tFVCkge1xuICAgICAgICAgIGlzQnJhY2tldCA9IHRva2VuLmlzQnJhY2tldCA9IHRydWU7XG4gICAgICAgICAgaXNHbG9iID0gdG9rZW4uaXNHbG9iID0gdHJ1ZTtcbiAgICAgICAgICBmaW5pc2hlZCA9IHRydWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHNjYW5Ub0VuZCA9PT0gdHJ1ZSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgaWYgKG9wdHMubm9uZWdhdGUgIT09IHRydWUgJiYgY29kZSA9PT0gQ0hBUl9FWENMQU1BVElPTl9NQVJLICYmIGluZGV4ID09PSBzdGFydCkge1xuICAgICAgbmVnYXRlZCA9IHRva2VuLm5lZ2F0ZWQgPSB0cnVlO1xuICAgICAgc3RhcnQrKztcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChvcHRzLm5vcGFyZW4gIT09IHRydWUgJiYgY29kZSA9PT0gQ0hBUl9MRUZUX1BBUkVOVEhFU0VTKSB7XG4gICAgICBpc0dsb2IgPSB0b2tlbi5pc0dsb2IgPSB0cnVlO1xuXG4gICAgICBpZiAoc2NhblRvRW5kID09PSB0cnVlKSB7XG4gICAgICAgIHdoaWxlIChlb3MoKSAhPT0gdHJ1ZSAmJiAoY29kZSA9IGFkdmFuY2UoKSkpIHtcbiAgICAgICAgICBpZiAoY29kZSA9PT0gQ0hBUl9MRUZUX1BBUkVOVEhFU0VTKSB7XG4gICAgICAgICAgICBiYWNrc2xhc2hlcyA9IHRva2VuLmJhY2tzbGFzaGVzID0gdHJ1ZTtcbiAgICAgICAgICAgIGNvZGUgPSBhZHZhbmNlKCk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoY29kZSA9PT0gQ0hBUl9SSUdIVF9QQVJFTlRIRVNFUykge1xuICAgICAgICAgICAgZmluaXNoZWQgPSB0cnVlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgaWYgKGlzR2xvYiA9PT0gdHJ1ZSkge1xuICAgICAgZmluaXNoZWQgPSB0cnVlO1xuXG4gICAgICBpZiAoc2NhblRvRW5kID09PSB0cnVlKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBpZiAob3B0cy5ub2V4dCA9PT0gdHJ1ZSkge1xuICAgIGlzRXh0Z2xvYiA9IGZhbHNlO1xuICAgIGlzR2xvYiA9IGZhbHNlO1xuICB9XG5cbiAgbGV0IGJhc2UgPSBzdHI7XG4gIGxldCBwcmVmaXggPSAnJztcbiAgbGV0IGdsb2IgPSAnJztcblxuICBpZiAoc3RhcnQgPiAwKSB7XG4gICAgcHJlZml4ID0gc3RyLnNsaWNlKDAsIHN0YXJ0KTtcbiAgICBzdHIgPSBzdHIuc2xpY2Uoc3RhcnQpO1xuICAgIGxhc3RJbmRleCAtPSBzdGFydDtcbiAgfVxuXG4gIGlmIChiYXNlICYmIGlzR2xvYiA9PT0gdHJ1ZSAmJiBsYXN0SW5kZXggPiAwKSB7XG4gICAgYmFzZSA9IHN0ci5zbGljZSgwLCBsYXN0SW5kZXgpO1xuICAgIGdsb2IgPSBzdHIuc2xpY2UobGFzdEluZGV4KTtcbiAgfSBlbHNlIGlmIChpc0dsb2IgPT09IHRydWUpIHtcbiAgICBiYXNlID0gJyc7XG4gICAgZ2xvYiA9IHN0cjtcbiAgfSBlbHNlIHtcbiAgICBiYXNlID0gc3RyO1xuICB9XG5cbiAgaWYgKGJhc2UgJiYgYmFzZSAhPT0gJycgJiYgYmFzZSAhPT0gJy8nICYmIGJhc2UgIT09IHN0cikge1xuICAgIGlmIChpc1BhdGhTZXBhcmF0b3IoYmFzZS5jaGFyQ29kZUF0KGJhc2UubGVuZ3RoIC0gMSkpKSB7XG4gICAgICBiYXNlID0gYmFzZS5zbGljZSgwLCAtMSk7XG4gICAgfVxuICB9XG5cbiAgaWYgKG9wdHMudW5lc2NhcGUgPT09IHRydWUpIHtcbiAgICBpZiAoZ2xvYikgZ2xvYiA9IHV0aWxzLnJlbW92ZUJhY2tzbGFzaGVzKGdsb2IpO1xuXG4gICAgaWYgKGJhc2UgJiYgYmFja3NsYXNoZXMgPT09IHRydWUpIHtcbiAgICAgIGJhc2UgPSB1dGlscy5yZW1vdmVCYWNrc2xhc2hlcyhiYXNlKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBzdGF0ZSA9IHtcbiAgICBwcmVmaXgsXG4gICAgaW5wdXQsXG4gICAgc3RhcnQsXG4gICAgYmFzZSxcbiAgICBnbG9iLFxuICAgIGlzQnJhY2UsXG4gICAgaXNCcmFja2V0LFxuICAgIGlzR2xvYixcbiAgICBpc0V4dGdsb2IsXG4gICAgaXNHbG9ic3RhcixcbiAgICBuZWdhdGVkLFxuICAgIG5lZ2F0ZWRFeHRnbG9iXG4gIH07XG5cbiAgaWYgKG9wdHMudG9rZW5zID09PSB0cnVlKSB7XG4gICAgc3RhdGUubWF4RGVwdGggPSAwO1xuICAgIGlmICghaXNQYXRoU2VwYXJhdG9yKGNvZGUpKSB7XG4gICAgICB0b2tlbnMucHVzaCh0b2tlbik7XG4gICAgfVxuICAgIHN0YXRlLnRva2VucyA9IHRva2VucztcbiAgfVxuXG4gIGlmIChvcHRzLnBhcnRzID09PSB0cnVlIHx8IG9wdHMudG9rZW5zID09PSB0cnVlKSB7XG4gICAgbGV0IHByZXZJbmRleDtcblxuICAgIGZvciAobGV0IGlkeCA9IDA7IGlkeCA8IHNsYXNoZXMubGVuZ3RoOyBpZHgrKykge1xuICAgICAgY29uc3QgbiA9IHByZXZJbmRleCA/IHByZXZJbmRleCArIDEgOiBzdGFydDtcbiAgICAgIGNvbnN0IGkgPSBzbGFzaGVzW2lkeF07XG4gICAgICBjb25zdCB2YWx1ZSA9IGlucHV0LnNsaWNlKG4sIGkpO1xuICAgICAgaWYgKG9wdHMudG9rZW5zKSB7XG4gICAgICAgIGlmIChpZHggPT09IDAgJiYgc3RhcnQgIT09IDApIHtcbiAgICAgICAgICB0b2tlbnNbaWR4XS5pc1ByZWZpeCA9IHRydWU7XG4gICAgICAgICAgdG9rZW5zW2lkeF0udmFsdWUgPSBwcmVmaXg7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdG9rZW5zW2lkeF0udmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBkZXB0aCh0b2tlbnNbaWR4XSk7XG4gICAgICAgIHN0YXRlLm1heERlcHRoICs9IHRva2Vuc1tpZHhdLmRlcHRoO1xuICAgICAgfVxuICAgICAgaWYgKGlkeCAhPT0gMCB8fCB2YWx1ZSAhPT0gJycpIHtcbiAgICAgICAgcGFydHMucHVzaCh2YWx1ZSk7XG4gICAgICB9XG4gICAgICBwcmV2SW5kZXggPSBpO1xuICAgIH1cblxuICAgIGlmIChwcmV2SW5kZXggJiYgcHJldkluZGV4ICsgMSA8IGlucHV0Lmxlbmd0aCkge1xuICAgICAgY29uc3QgdmFsdWUgPSBpbnB1dC5zbGljZShwcmV2SW5kZXggKyAxKTtcbiAgICAgIHBhcnRzLnB1c2godmFsdWUpO1xuXG4gICAgICBpZiAob3B0cy50b2tlbnMpIHtcbiAgICAgICAgdG9rZW5zW3Rva2Vucy5sZW5ndGggLSAxXS52YWx1ZSA9IHZhbHVlO1xuICAgICAgICBkZXB0aCh0b2tlbnNbdG9rZW5zLmxlbmd0aCAtIDFdKTtcbiAgICAgICAgc3RhdGUubWF4RGVwdGggKz0gdG9rZW5zW3Rva2Vucy5sZW5ndGggLSAxXS5kZXB0aDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0ZS5zbGFzaGVzID0gc2xhc2hlcztcbiAgICBzdGF0ZS5wYXJ0cyA9IHBhcnRzO1xuICB9XG5cbiAgcmV0dXJuIHN0YXRlO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBzY2FuO1xuIiwgIid1c2Ugc3RyaWN0JztcblxuY29uc3QgY29uc3RhbnRzID0gcmVxdWlyZSgnLi9jb25zdGFudHMnKTtcbmNvbnN0IHV0aWxzID0gcmVxdWlyZSgnLi91dGlscycpO1xuXG4vKipcbiAqIENvbnN0YW50c1xuICovXG5cbmNvbnN0IHtcbiAgTUFYX0xFTkdUSCxcbiAgUE9TSVhfUkVHRVhfU09VUkNFLFxuICBSRUdFWF9OT05fU1BFQ0lBTF9DSEFSUyxcbiAgUkVHRVhfU1BFQ0lBTF9DSEFSU19CQUNLUkVGLFxuICBSRVBMQUNFTUVOVFNcbn0gPSBjb25zdGFudHM7XG5cbi8qKlxuICogSGVscGVyc1xuICovXG5cbmNvbnN0IGV4cGFuZFJhbmdlID0gKGFyZ3MsIG9wdGlvbnMpID0+IHtcbiAgaWYgKHR5cGVvZiBvcHRpb25zLmV4cGFuZFJhbmdlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIG9wdGlvbnMuZXhwYW5kUmFuZ2UoLi4uYXJncywgb3B0aW9ucyk7XG4gIH1cblxuICBhcmdzLnNvcnQoKTtcbiAgY29uc3QgdmFsdWUgPSBgWyR7YXJncy5qb2luKCctJyl9XWA7XG5cbiAgdHJ5IHtcbiAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmV3ICovXG4gICAgbmV3IFJlZ0V4cCh2YWx1ZSk7XG4gIH0gY2F0Y2ggKGV4KSB7XG4gICAgcmV0dXJuIGFyZ3MubWFwKHYgPT4gdXRpbHMuZXNjYXBlUmVnZXgodikpLmpvaW4oJy4uJyk7XG4gIH1cblxuICByZXR1cm4gdmFsdWU7XG59O1xuXG4vKipcbiAqIENyZWF0ZSB0aGUgbWVzc2FnZSBmb3IgYSBzeW50YXggZXJyb3JcbiAqL1xuXG5jb25zdCBzeW50YXhFcnJvciA9ICh0eXBlLCBjaGFyKSA9PiB7XG4gIHJldHVybiBgTWlzc2luZyAke3R5cGV9OiBcIiR7Y2hhcn1cIiAtIHVzZSBcIlxcXFxcXFxcJHtjaGFyfVwiIHRvIG1hdGNoIGxpdGVyYWwgY2hhcmFjdGVyc2A7XG59O1xuXG4vKipcbiAqIFBhcnNlIHRoZSBnaXZlbiBpbnB1dCBzdHJpbmcuXG4gKiBAcGFyYW0ge1N0cmluZ30gaW5wdXRcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKi9cblxuY29uc3QgcGFyc2UgPSAoaW5wdXQsIG9wdGlvbnMpID0+IHtcbiAgaWYgKHR5cGVvZiBpbnB1dCAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBhIHN0cmluZycpO1xuICB9XG5cbiAgaW5wdXQgPSBSRVBMQUNFTUVOVFNbaW5wdXRdIHx8IGlucHV0O1xuXG4gIGNvbnN0IG9wdHMgPSB7IC4uLm9wdGlvbnMgfTtcbiAgY29uc3QgbWF4ID0gdHlwZW9mIG9wdHMubWF4TGVuZ3RoID09PSAnbnVtYmVyJyA/IE1hdGgubWluKE1BWF9MRU5HVEgsIG9wdHMubWF4TGVuZ3RoKSA6IE1BWF9MRU5HVEg7XG5cbiAgbGV0IGxlbiA9IGlucHV0Lmxlbmd0aDtcbiAgaWYgKGxlbiA+IG1heCkge1xuICAgIHRocm93IG5ldyBTeW50YXhFcnJvcihgSW5wdXQgbGVuZ3RoOiAke2xlbn0sIGV4Y2VlZHMgbWF4aW11bSBhbGxvd2VkIGxlbmd0aDogJHttYXh9YCk7XG4gIH1cblxuICBjb25zdCBib3MgPSB7IHR5cGU6ICdib3MnLCB2YWx1ZTogJycsIG91dHB1dDogb3B0cy5wcmVwZW5kIHx8ICcnIH07XG4gIGNvbnN0IHRva2VucyA9IFtib3NdO1xuXG4gIGNvbnN0IGNhcHR1cmUgPSBvcHRzLmNhcHR1cmUgPyAnJyA6ICc/Oic7XG4gIGNvbnN0IHdpbjMyID0gdXRpbHMuaXNXaW5kb3dzKG9wdGlvbnMpO1xuXG4gIC8vIGNyZWF0ZSBjb25zdGFudHMgYmFzZWQgb24gcGxhdGZvcm0sIGZvciB3aW5kb3dzIG9yIHBvc2l4XG4gIGNvbnN0IFBMQVRGT1JNX0NIQVJTID0gY29uc3RhbnRzLmdsb2JDaGFycyh3aW4zMik7XG4gIGNvbnN0IEVYVEdMT0JfQ0hBUlMgPSBjb25zdGFudHMuZXh0Z2xvYkNoYXJzKFBMQVRGT1JNX0NIQVJTKTtcblxuICBjb25zdCB7XG4gICAgRE9UX0xJVEVSQUwsXG4gICAgUExVU19MSVRFUkFMLFxuICAgIFNMQVNIX0xJVEVSQUwsXG4gICAgT05FX0NIQVIsXG4gICAgRE9UU19TTEFTSCxcbiAgICBOT19ET1QsXG4gICAgTk9fRE9UX1NMQVNILFxuICAgIE5PX0RPVFNfU0xBU0gsXG4gICAgUU1BUkssXG4gICAgUU1BUktfTk9fRE9ULFxuICAgIFNUQVIsXG4gICAgU1RBUlRfQU5DSE9SXG4gIH0gPSBQTEFURk9STV9DSEFSUztcblxuICBjb25zdCBnbG9ic3RhciA9IG9wdHMgPT4ge1xuICAgIHJldHVybiBgKCR7Y2FwdHVyZX0oPzooPyEke1NUQVJUX0FOQ0hPUn0ke29wdHMuZG90ID8gRE9UU19TTEFTSCA6IERPVF9MSVRFUkFMfSkuKSo/KWA7XG4gIH07XG5cbiAgY29uc3Qgbm9kb3QgPSBvcHRzLmRvdCA/ICcnIDogTk9fRE9UO1xuICBjb25zdCBxbWFya05vRG90ID0gb3B0cy5kb3QgPyBRTUFSSyA6IFFNQVJLX05PX0RPVDtcbiAgbGV0IHN0YXIgPSBvcHRzLmJhc2ggPT09IHRydWUgPyBnbG9ic3RhcihvcHRzKSA6IFNUQVI7XG5cbiAgaWYgKG9wdHMuY2FwdHVyZSkge1xuICAgIHN0YXIgPSBgKCR7c3Rhcn0pYDtcbiAgfVxuXG4gIC8vIG1pbmltYXRjaCBvcHRpb25zIHN1cHBvcnRcbiAgaWYgKHR5cGVvZiBvcHRzLm5vZXh0ID09PSAnYm9vbGVhbicpIHtcbiAgICBvcHRzLm5vZXh0Z2xvYiA9IG9wdHMubm9leHQ7XG4gIH1cblxuICBjb25zdCBzdGF0ZSA9IHtcbiAgICBpbnB1dCxcbiAgICBpbmRleDogLTEsXG4gICAgc3RhcnQ6IDAsXG4gICAgZG90OiBvcHRzLmRvdCA9PT0gdHJ1ZSxcbiAgICBjb25zdW1lZDogJycsXG4gICAgb3V0cHV0OiAnJyxcbiAgICBwcmVmaXg6ICcnLFxuICAgIGJhY2t0cmFjazogZmFsc2UsXG4gICAgbmVnYXRlZDogZmFsc2UsXG4gICAgYnJhY2tldHM6IDAsXG4gICAgYnJhY2VzOiAwLFxuICAgIHBhcmVuczogMCxcbiAgICBxdW90ZXM6IDAsXG4gICAgZ2xvYnN0YXI6IGZhbHNlLFxuICAgIHRva2Vuc1xuICB9O1xuXG4gIGlucHV0ID0gdXRpbHMucmVtb3ZlUHJlZml4KGlucHV0LCBzdGF0ZSk7XG4gIGxlbiA9IGlucHV0Lmxlbmd0aDtcblxuICBjb25zdCBleHRnbG9icyA9IFtdO1xuICBjb25zdCBicmFjZXMgPSBbXTtcbiAgY29uc3Qgc3RhY2sgPSBbXTtcbiAgbGV0IHByZXYgPSBib3M7XG4gIGxldCB2YWx1ZTtcblxuICAvKipcbiAgICogVG9rZW5pemluZyBoZWxwZXJzXG4gICAqL1xuXG4gIGNvbnN0IGVvcyA9ICgpID0+IHN0YXRlLmluZGV4ID09PSBsZW4gLSAxO1xuICBjb25zdCBwZWVrID0gc3RhdGUucGVlayA9IChuID0gMSkgPT4gaW5wdXRbc3RhdGUuaW5kZXggKyBuXTtcbiAgY29uc3QgYWR2YW5jZSA9IHN0YXRlLmFkdmFuY2UgPSAoKSA9PiBpbnB1dFsrK3N0YXRlLmluZGV4XSB8fCAnJztcbiAgY29uc3QgcmVtYWluaW5nID0gKCkgPT4gaW5wdXQuc2xpY2Uoc3RhdGUuaW5kZXggKyAxKTtcbiAgY29uc3QgY29uc3VtZSA9ICh2YWx1ZSA9ICcnLCBudW0gPSAwKSA9PiB7XG4gICAgc3RhdGUuY29uc3VtZWQgKz0gdmFsdWU7XG4gICAgc3RhdGUuaW5kZXggKz0gbnVtO1xuICB9O1xuXG4gIGNvbnN0IGFwcGVuZCA9IHRva2VuID0+IHtcbiAgICBzdGF0ZS5vdXRwdXQgKz0gdG9rZW4ub3V0cHV0ICE9IG51bGwgPyB0b2tlbi5vdXRwdXQgOiB0b2tlbi52YWx1ZTtcbiAgICBjb25zdW1lKHRva2VuLnZhbHVlKTtcbiAgfTtcblxuICBjb25zdCBuZWdhdGUgPSAoKSA9PiB7XG4gICAgbGV0IGNvdW50ID0gMTtcblxuICAgIHdoaWxlIChwZWVrKCkgPT09ICchJyAmJiAocGVlaygyKSAhPT0gJygnIHx8IHBlZWsoMykgPT09ICc/JykpIHtcbiAgICAgIGFkdmFuY2UoKTtcbiAgICAgIHN0YXRlLnN0YXJ0Kys7XG4gICAgICBjb3VudCsrO1xuICAgIH1cblxuICAgIGlmIChjb3VudCAlIDIgPT09IDApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBzdGF0ZS5uZWdhdGVkID0gdHJ1ZTtcbiAgICBzdGF0ZS5zdGFydCsrO1xuICAgIHJldHVybiB0cnVlO1xuICB9O1xuXG4gIGNvbnN0IGluY3JlbWVudCA9IHR5cGUgPT4ge1xuICAgIHN0YXRlW3R5cGVdKys7XG4gICAgc3RhY2sucHVzaCh0eXBlKTtcbiAgfTtcblxuICBjb25zdCBkZWNyZW1lbnQgPSB0eXBlID0+IHtcbiAgICBzdGF0ZVt0eXBlXS0tO1xuICAgIHN0YWNrLnBvcCgpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBQdXNoIHRva2VucyBvbnRvIHRoZSB0b2tlbnMgYXJyYXkuIFRoaXMgaGVscGVyIHNwZWVkcyB1cFxuICAgKiB0b2tlbml6aW5nIGJ5IDEpIGhlbHBpbmcgdXMgYXZvaWQgYmFja3RyYWNraW5nIGFzIG11Y2ggYXMgcG9zc2libGUsXG4gICAqIGFuZCAyKSBoZWxwaW5nIHVzIGF2b2lkIGNyZWF0aW5nIGV4dHJhIHRva2VucyB3aGVuIGNvbnNlY3V0aXZlXG4gICAqIGNoYXJhY3RlcnMgYXJlIHBsYWluIHRleHQuIFRoaXMgaW1wcm92ZXMgcGVyZm9ybWFuY2UgYW5kIHNpbXBsaWZpZXNcbiAgICogbG9va2JlaGluZHMuXG4gICAqL1xuXG4gIGNvbnN0IHB1c2ggPSB0b2sgPT4ge1xuICAgIGlmIChwcmV2LnR5cGUgPT09ICdnbG9ic3RhcicpIHtcbiAgICAgIGNvbnN0IGlzQnJhY2UgPSBzdGF0ZS5icmFjZXMgPiAwICYmICh0b2sudHlwZSA9PT0gJ2NvbW1hJyB8fCB0b2sudHlwZSA9PT0gJ2JyYWNlJyk7XG4gICAgICBjb25zdCBpc0V4dGdsb2IgPSB0b2suZXh0Z2xvYiA9PT0gdHJ1ZSB8fCAoZXh0Z2xvYnMubGVuZ3RoICYmICh0b2sudHlwZSA9PT0gJ3BpcGUnIHx8IHRvay50eXBlID09PSAncGFyZW4nKSk7XG5cbiAgICAgIGlmICh0b2sudHlwZSAhPT0gJ3NsYXNoJyAmJiB0b2sudHlwZSAhPT0gJ3BhcmVuJyAmJiAhaXNCcmFjZSAmJiAhaXNFeHRnbG9iKSB7XG4gICAgICAgIHN0YXRlLm91dHB1dCA9IHN0YXRlLm91dHB1dC5zbGljZSgwLCAtcHJldi5vdXRwdXQubGVuZ3RoKTtcbiAgICAgICAgcHJldi50eXBlID0gJ3N0YXInO1xuICAgICAgICBwcmV2LnZhbHVlID0gJyonO1xuICAgICAgICBwcmV2Lm91dHB1dCA9IHN0YXI7XG4gICAgICAgIHN0YXRlLm91dHB1dCArPSBwcmV2Lm91dHB1dDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZXh0Z2xvYnMubGVuZ3RoICYmIHRvay50eXBlICE9PSAncGFyZW4nKSB7XG4gICAgICBleHRnbG9ic1tleHRnbG9icy5sZW5ndGggLSAxXS5pbm5lciArPSB0b2sudmFsdWU7XG4gICAgfVxuXG4gICAgaWYgKHRvay52YWx1ZSB8fCB0b2sub3V0cHV0KSBhcHBlbmQodG9rKTtcbiAgICBpZiAocHJldiAmJiBwcmV2LnR5cGUgPT09ICd0ZXh0JyAmJiB0b2sudHlwZSA9PT0gJ3RleHQnKSB7XG4gICAgICBwcmV2LnZhbHVlICs9IHRvay52YWx1ZTtcbiAgICAgIHByZXYub3V0cHV0ID0gKHByZXYub3V0cHV0IHx8ICcnKSArIHRvay52YWx1ZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0b2sucHJldiA9IHByZXY7XG4gICAgdG9rZW5zLnB1c2godG9rKTtcbiAgICBwcmV2ID0gdG9rO1xuICB9O1xuXG4gIGNvbnN0IGV4dGdsb2JPcGVuID0gKHR5cGUsIHZhbHVlKSA9PiB7XG4gICAgY29uc3QgdG9rZW4gPSB7IC4uLkVYVEdMT0JfQ0hBUlNbdmFsdWVdLCBjb25kaXRpb25zOiAxLCBpbm5lcjogJycgfTtcblxuICAgIHRva2VuLnByZXYgPSBwcmV2O1xuICAgIHRva2VuLnBhcmVucyA9IHN0YXRlLnBhcmVucztcbiAgICB0b2tlbi5vdXRwdXQgPSBzdGF0ZS5vdXRwdXQ7XG4gICAgY29uc3Qgb3V0cHV0ID0gKG9wdHMuY2FwdHVyZSA/ICcoJyA6ICcnKSArIHRva2VuLm9wZW47XG5cbiAgICBpbmNyZW1lbnQoJ3BhcmVucycpO1xuICAgIHB1c2goeyB0eXBlLCB2YWx1ZSwgb3V0cHV0OiBzdGF0ZS5vdXRwdXQgPyAnJyA6IE9ORV9DSEFSIH0pO1xuICAgIHB1c2goeyB0eXBlOiAncGFyZW4nLCBleHRnbG9iOiB0cnVlLCB2YWx1ZTogYWR2YW5jZSgpLCBvdXRwdXQgfSk7XG4gICAgZXh0Z2xvYnMucHVzaCh0b2tlbik7XG4gIH07XG5cbiAgY29uc3QgZXh0Z2xvYkNsb3NlID0gdG9rZW4gPT4ge1xuICAgIGxldCBvdXRwdXQgPSB0b2tlbi5jbG9zZSArIChvcHRzLmNhcHR1cmUgPyAnKScgOiAnJyk7XG4gICAgbGV0IHJlc3Q7XG5cbiAgICBpZiAodG9rZW4udHlwZSA9PT0gJ25lZ2F0ZScpIHtcbiAgICAgIGxldCBleHRnbG9iU3RhciA9IHN0YXI7XG5cbiAgICAgIGlmICh0b2tlbi5pbm5lciAmJiB0b2tlbi5pbm5lci5sZW5ndGggPiAxICYmIHRva2VuLmlubmVyLmluY2x1ZGVzKCcvJykpIHtcbiAgICAgICAgZXh0Z2xvYlN0YXIgPSBnbG9ic3RhcihvcHRzKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGV4dGdsb2JTdGFyICE9PSBzdGFyIHx8IGVvcygpIHx8IC9eXFwpKyQvLnRlc3QocmVtYWluaW5nKCkpKSB7XG4gICAgICAgIG91dHB1dCA9IHRva2VuLmNsb3NlID0gYCkkKSkke2V4dGdsb2JTdGFyfWA7XG4gICAgICB9XG5cbiAgICAgIGlmICh0b2tlbi5pbm5lci5pbmNsdWRlcygnKicpICYmIChyZXN0ID0gcmVtYWluaW5nKCkpICYmIC9eXFwuW15cXFxcLy5dKyQvLnRlc3QocmVzdCkpIHtcbiAgICAgICAgLy8gQW55IG5vbi1tYWdpY2FsIHN0cmluZyAoYC50c2ApIG9yIGV2ZW4gbmVzdGVkIGV4cHJlc3Npb24gKGAue3RzLHRzeH1gKSBjYW4gZm9sbG93IGFmdGVyIHRoZSBjbG9zaW5nIHBhcmVudGhlc2lzLlxuICAgICAgICAvLyBJbiB0aGlzIGNhc2UsIHdlIG5lZWQgdG8gcGFyc2UgdGhlIHN0cmluZyBhbmQgdXNlIGl0IGluIHRoZSBvdXRwdXQgb2YgdGhlIG9yaWdpbmFsIHBhdHRlcm4uXG4gICAgICAgIC8vIFN1aXRhYmxlIHBhdHRlcm5zOiBgLyEoKi5kKS50c2AsIGAvISgqLmQpLnt0cyx0c3h9YCwgYCoqLyEoKi1kYmcpLkAoanMpYC5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gRGlzYWJsaW5nIHRoZSBgZmFzdHBhdGhzYCBvcHRpb24gZHVlIHRvIGEgcHJvYmxlbSB3aXRoIHBhcnNpbmcgc3RyaW5ncyBhcyBgLnRzYCBpbiB0aGUgcGF0dGVybiBsaWtlIGAqKi8hKCouZCkudHNgLlxuICAgICAgICBjb25zdCBleHByZXNzaW9uID0gcGFyc2UocmVzdCwgeyAuLi5vcHRpb25zLCBmYXN0cGF0aHM6IGZhbHNlIH0pLm91dHB1dDtcblxuICAgICAgICBvdXRwdXQgPSB0b2tlbi5jbG9zZSA9IGApJHtleHByZXNzaW9ufSkke2V4dGdsb2JTdGFyfSlgO1xuICAgICAgfVxuXG4gICAgICBpZiAodG9rZW4ucHJldi50eXBlID09PSAnYm9zJykge1xuICAgICAgICBzdGF0ZS5uZWdhdGVkRXh0Z2xvYiA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcHVzaCh7IHR5cGU6ICdwYXJlbicsIGV4dGdsb2I6IHRydWUsIHZhbHVlLCBvdXRwdXQgfSk7XG4gICAgZGVjcmVtZW50KCdwYXJlbnMnKTtcbiAgfTtcblxuICAvKipcbiAgICogRmFzdCBwYXRoc1xuICAgKi9cblxuICBpZiAob3B0cy5mYXN0cGF0aHMgIT09IGZhbHNlICYmICEvKF5bKiFdfFsvKClbXFxde31cIl0pLy50ZXN0KGlucHV0KSkge1xuICAgIGxldCBiYWNrc2xhc2hlcyA9IGZhbHNlO1xuXG4gICAgbGV0IG91dHB1dCA9IGlucHV0LnJlcGxhY2UoUkVHRVhfU1BFQ0lBTF9DSEFSU19CQUNLUkVGLCAobSwgZXNjLCBjaGFycywgZmlyc3QsIHJlc3QsIGluZGV4KSA9PiB7XG4gICAgICBpZiAoZmlyc3QgPT09ICdcXFxcJykge1xuICAgICAgICBiYWNrc2xhc2hlcyA9IHRydWU7XG4gICAgICAgIHJldHVybiBtO1xuICAgICAgfVxuXG4gICAgICBpZiAoZmlyc3QgPT09ICc/Jykge1xuICAgICAgICBpZiAoZXNjKSB7XG4gICAgICAgICAgcmV0dXJuIGVzYyArIGZpcnN0ICsgKHJlc3QgPyBRTUFSSy5yZXBlYXQocmVzdC5sZW5ndGgpIDogJycpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpbmRleCA9PT0gMCkge1xuICAgICAgICAgIHJldHVybiBxbWFya05vRG90ICsgKHJlc3QgPyBRTUFSSy5yZXBlYXQocmVzdC5sZW5ndGgpIDogJycpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBRTUFSSy5yZXBlYXQoY2hhcnMubGVuZ3RoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGZpcnN0ID09PSAnLicpIHtcbiAgICAgICAgcmV0dXJuIERPVF9MSVRFUkFMLnJlcGVhdChjaGFycy5sZW5ndGgpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZmlyc3QgPT09ICcqJykge1xuICAgICAgICBpZiAoZXNjKSB7XG4gICAgICAgICAgcmV0dXJuIGVzYyArIGZpcnN0ICsgKHJlc3QgPyBzdGFyIDogJycpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdGFyO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGVzYyA/IG0gOiBgXFxcXCR7bX1gO1xuICAgIH0pO1xuXG4gICAgaWYgKGJhY2tzbGFzaGVzID09PSB0cnVlKSB7XG4gICAgICBpZiAob3B0cy51bmVzY2FwZSA9PT0gdHJ1ZSkge1xuICAgICAgICBvdXRwdXQgPSBvdXRwdXQucmVwbGFjZSgvXFxcXC9nLCAnJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvdXRwdXQgPSBvdXRwdXQucmVwbGFjZSgvXFxcXCsvZywgbSA9PiB7XG4gICAgICAgICAgcmV0dXJuIG0ubGVuZ3RoICUgMiA9PT0gMCA/ICdcXFxcXFxcXCcgOiAobSA/ICdcXFxcJyA6ICcnKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG91dHB1dCA9PT0gaW5wdXQgJiYgb3B0cy5jb250YWlucyA9PT0gdHJ1ZSkge1xuICAgICAgc3RhdGUub3V0cHV0ID0gaW5wdXQ7XG4gICAgICByZXR1cm4gc3RhdGU7XG4gICAgfVxuXG4gICAgc3RhdGUub3V0cHV0ID0gdXRpbHMud3JhcE91dHB1dChvdXRwdXQsIHN0YXRlLCBvcHRpb25zKTtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cblxuICAvKipcbiAgICogVG9rZW5pemUgaW5wdXQgdW50aWwgd2UgcmVhY2ggZW5kLW9mLXN0cmluZ1xuICAgKi9cblxuICB3aGlsZSAoIWVvcygpKSB7XG4gICAgdmFsdWUgPSBhZHZhbmNlKCk7XG5cbiAgICBpZiAodmFsdWUgPT09ICdcXHUwMDAwJykge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXNjYXBlZCBjaGFyYWN0ZXJzXG4gICAgICovXG5cbiAgICBpZiAodmFsdWUgPT09ICdcXFxcJykge1xuICAgICAgY29uc3QgbmV4dCA9IHBlZWsoKTtcblxuICAgICAgaWYgKG5leHQgPT09ICcvJyAmJiBvcHRzLmJhc2ggIT09IHRydWUpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChuZXh0ID09PSAnLicgfHwgbmV4dCA9PT0gJzsnKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoIW5leHQpIHtcbiAgICAgICAgdmFsdWUgKz0gJ1xcXFwnO1xuICAgICAgICBwdXNoKHsgdHlwZTogJ3RleHQnLCB2YWx1ZSB9KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIGNvbGxhcHNlIHNsYXNoZXMgdG8gcmVkdWNlIHBvdGVudGlhbCBmb3IgZXhwbG9pdHNcbiAgICAgIGNvbnN0IG1hdGNoID0gL15cXFxcKy8uZXhlYyhyZW1haW5pbmcoKSk7XG4gICAgICBsZXQgc2xhc2hlcyA9IDA7XG5cbiAgICAgIGlmIChtYXRjaCAmJiBtYXRjaFswXS5sZW5ndGggPiAyKSB7XG4gICAgICAgIHNsYXNoZXMgPSBtYXRjaFswXS5sZW5ndGg7XG4gICAgICAgIHN0YXRlLmluZGV4ICs9IHNsYXNoZXM7XG4gICAgICAgIGlmIChzbGFzaGVzICUgMiAhPT0gMCkge1xuICAgICAgICAgIHZhbHVlICs9ICdcXFxcJztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAob3B0cy51bmVzY2FwZSA9PT0gdHJ1ZSkge1xuICAgICAgICB2YWx1ZSA9IGFkdmFuY2UoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbHVlICs9IGFkdmFuY2UoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHN0YXRlLmJyYWNrZXRzID09PSAwKSB7XG4gICAgICAgIHB1c2goeyB0eXBlOiAndGV4dCcsIHZhbHVlIH0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJZiB3ZSdyZSBpbnNpZGUgYSByZWdleCBjaGFyYWN0ZXIgY2xhc3MsIGNvbnRpbnVlXG4gICAgICogdW50aWwgd2UgcmVhY2ggdGhlIGNsb3NpbmcgYnJhY2tldC5cbiAgICAgKi9cblxuICAgIGlmIChzdGF0ZS5icmFja2V0cyA+IDAgJiYgKHZhbHVlICE9PSAnXScgfHwgcHJldi52YWx1ZSA9PT0gJ1snIHx8IHByZXYudmFsdWUgPT09ICdbXicpKSB7XG4gICAgICBpZiAob3B0cy5wb3NpeCAhPT0gZmFsc2UgJiYgdmFsdWUgPT09ICc6Jykge1xuICAgICAgICBjb25zdCBpbm5lciA9IHByZXYudmFsdWUuc2xpY2UoMSk7XG4gICAgICAgIGlmIChpbm5lci5pbmNsdWRlcygnWycpKSB7XG4gICAgICAgICAgcHJldi5wb3NpeCA9IHRydWU7XG5cbiAgICAgICAgICBpZiAoaW5uZXIuaW5jbHVkZXMoJzonKSkge1xuICAgICAgICAgICAgY29uc3QgaWR4ID0gcHJldi52YWx1ZS5sYXN0SW5kZXhPZignWycpO1xuICAgICAgICAgICAgY29uc3QgcHJlID0gcHJldi52YWx1ZS5zbGljZSgwLCBpZHgpO1xuICAgICAgICAgICAgY29uc3QgcmVzdCA9IHByZXYudmFsdWUuc2xpY2UoaWR4ICsgMik7XG4gICAgICAgICAgICBjb25zdCBwb3NpeCA9IFBPU0lYX1JFR0VYX1NPVVJDRVtyZXN0XTtcbiAgICAgICAgICAgIGlmIChwb3NpeCkge1xuICAgICAgICAgICAgICBwcmV2LnZhbHVlID0gcHJlICsgcG9zaXg7XG4gICAgICAgICAgICAgIHN0YXRlLmJhY2t0cmFjayA9IHRydWU7XG4gICAgICAgICAgICAgIGFkdmFuY2UoKTtcblxuICAgICAgICAgICAgICBpZiAoIWJvcy5vdXRwdXQgJiYgdG9rZW5zLmluZGV4T2YocHJldikgPT09IDEpIHtcbiAgICAgICAgICAgICAgICBib3Mub3V0cHV0ID0gT05FX0NIQVI7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICgodmFsdWUgPT09ICdbJyAmJiBwZWVrKCkgIT09ICc6JykgfHwgKHZhbHVlID09PSAnLScgJiYgcGVlaygpID09PSAnXScpKSB7XG4gICAgICAgIHZhbHVlID0gYFxcXFwke3ZhbHVlfWA7XG4gICAgICB9XG5cbiAgICAgIGlmICh2YWx1ZSA9PT0gJ10nICYmIChwcmV2LnZhbHVlID09PSAnWycgfHwgcHJldi52YWx1ZSA9PT0gJ1teJykpIHtcbiAgICAgICAgdmFsdWUgPSBgXFxcXCR7dmFsdWV9YDtcbiAgICAgIH1cblxuICAgICAgaWYgKG9wdHMucG9zaXggPT09IHRydWUgJiYgdmFsdWUgPT09ICchJyAmJiBwcmV2LnZhbHVlID09PSAnWycpIHtcbiAgICAgICAgdmFsdWUgPSAnXic7XG4gICAgICB9XG5cbiAgICAgIHByZXYudmFsdWUgKz0gdmFsdWU7XG4gICAgICBhcHBlbmQoeyB2YWx1ZSB9KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIElmIHdlJ3JlIGluc2lkZSBhIHF1b3RlZCBzdHJpbmcsIGNvbnRpbnVlXG4gICAgICogdW50aWwgd2UgcmVhY2ggdGhlIGNsb3NpbmcgZG91YmxlIHF1b3RlLlxuICAgICAqL1xuXG4gICAgaWYgKHN0YXRlLnF1b3RlcyA9PT0gMSAmJiB2YWx1ZSAhPT0gJ1wiJykge1xuICAgICAgdmFsdWUgPSB1dGlscy5lc2NhcGVSZWdleCh2YWx1ZSk7XG4gICAgICBwcmV2LnZhbHVlICs9IHZhbHVlO1xuICAgICAgYXBwZW5kKHsgdmFsdWUgfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEb3VibGUgcXVvdGVzXG4gICAgICovXG5cbiAgICBpZiAodmFsdWUgPT09ICdcIicpIHtcbiAgICAgIHN0YXRlLnF1b3RlcyA9IHN0YXRlLnF1b3RlcyA9PT0gMSA/IDAgOiAxO1xuICAgICAgaWYgKG9wdHMua2VlcFF1b3RlcyA9PT0gdHJ1ZSkge1xuICAgICAgICBwdXNoKHsgdHlwZTogJ3RleHQnLCB2YWx1ZSB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBhcmVudGhlc2VzXG4gICAgICovXG5cbiAgICBpZiAodmFsdWUgPT09ICcoJykge1xuICAgICAgaW5jcmVtZW50KCdwYXJlbnMnKTtcbiAgICAgIHB1c2goeyB0eXBlOiAncGFyZW4nLCB2YWx1ZSB9KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmICh2YWx1ZSA9PT0gJyknKSB7XG4gICAgICBpZiAoc3RhdGUucGFyZW5zID09PSAwICYmIG9wdHMuc3RyaWN0QnJhY2tldHMgPT09IHRydWUpIHtcbiAgICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKHN5bnRheEVycm9yKCdvcGVuaW5nJywgJygnKSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGV4dGdsb2IgPSBleHRnbG9ic1tleHRnbG9icy5sZW5ndGggLSAxXTtcbiAgICAgIGlmIChleHRnbG9iICYmIHN0YXRlLnBhcmVucyA9PT0gZXh0Z2xvYi5wYXJlbnMgKyAxKSB7XG4gICAgICAgIGV4dGdsb2JDbG9zZShleHRnbG9icy5wb3AoKSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBwdXNoKHsgdHlwZTogJ3BhcmVuJywgdmFsdWUsIG91dHB1dDogc3RhdGUucGFyZW5zID8gJyknIDogJ1xcXFwpJyB9KTtcbiAgICAgIGRlY3JlbWVudCgncGFyZW5zJyk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTcXVhcmUgYnJhY2tldHNcbiAgICAgKi9cblxuICAgIGlmICh2YWx1ZSA9PT0gJ1snKSB7XG4gICAgICBpZiAob3B0cy5ub2JyYWNrZXQgPT09IHRydWUgfHwgIXJlbWFpbmluZygpLmluY2x1ZGVzKCddJykpIHtcbiAgICAgICAgaWYgKG9wdHMubm9icmFja2V0ICE9PSB0cnVlICYmIG9wdHMuc3RyaWN0QnJhY2tldHMgPT09IHRydWUpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3Ioc3ludGF4RXJyb3IoJ2Nsb3NpbmcnLCAnXScpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhbHVlID0gYFxcXFwke3ZhbHVlfWA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpbmNyZW1lbnQoJ2JyYWNrZXRzJyk7XG4gICAgICB9XG5cbiAgICAgIHB1c2goeyB0eXBlOiAnYnJhY2tldCcsIHZhbHVlIH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKHZhbHVlID09PSAnXScpIHtcbiAgICAgIGlmIChvcHRzLm5vYnJhY2tldCA9PT0gdHJ1ZSB8fCAocHJldiAmJiBwcmV2LnR5cGUgPT09ICdicmFja2V0JyAmJiBwcmV2LnZhbHVlLmxlbmd0aCA9PT0gMSkpIHtcbiAgICAgICAgcHVzaCh7IHR5cGU6ICd0ZXh0JywgdmFsdWUsIG91dHB1dDogYFxcXFwke3ZhbHVlfWAgfSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoc3RhdGUuYnJhY2tldHMgPT09IDApIHtcbiAgICAgICAgaWYgKG9wdHMuc3RyaWN0QnJhY2tldHMgPT09IHRydWUpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3Ioc3ludGF4RXJyb3IoJ29wZW5pbmcnLCAnWycpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHB1c2goeyB0eXBlOiAndGV4dCcsIHZhbHVlLCBvdXRwdXQ6IGBcXFxcJHt2YWx1ZX1gIH0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgZGVjcmVtZW50KCdicmFja2V0cycpO1xuXG4gICAgICBjb25zdCBwcmV2VmFsdWUgPSBwcmV2LnZhbHVlLnNsaWNlKDEpO1xuICAgICAgaWYgKHByZXYucG9zaXggIT09IHRydWUgJiYgcHJldlZhbHVlWzBdID09PSAnXicgJiYgIXByZXZWYWx1ZS5pbmNsdWRlcygnLycpKSB7XG4gICAgICAgIHZhbHVlID0gYC8ke3ZhbHVlfWA7XG4gICAgICB9XG5cbiAgICAgIHByZXYudmFsdWUgKz0gdmFsdWU7XG4gICAgICBhcHBlbmQoeyB2YWx1ZSB9KTtcblxuICAgICAgLy8gd2hlbiBsaXRlcmFsIGJyYWNrZXRzIGFyZSBleHBsaWNpdGx5IGRpc2FibGVkXG4gICAgICAvLyBhc3N1bWUgd2Ugc2hvdWxkIG1hdGNoIHdpdGggYSByZWdleCBjaGFyYWN0ZXIgY2xhc3NcbiAgICAgIGlmIChvcHRzLmxpdGVyYWxCcmFja2V0cyA9PT0gZmFsc2UgfHwgdXRpbHMuaGFzUmVnZXhDaGFycyhwcmV2VmFsdWUpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBlc2NhcGVkID0gdXRpbHMuZXNjYXBlUmVnZXgocHJldi52YWx1ZSk7XG4gICAgICBzdGF0ZS5vdXRwdXQgPSBzdGF0ZS5vdXRwdXQuc2xpY2UoMCwgLXByZXYudmFsdWUubGVuZ3RoKTtcblxuICAgICAgLy8gd2hlbiBsaXRlcmFsIGJyYWNrZXRzIGFyZSBleHBsaWNpdGx5IGVuYWJsZWRcbiAgICAgIC8vIGFzc3VtZSB3ZSBzaG91bGQgZXNjYXBlIHRoZSBicmFja2V0cyB0byBtYXRjaCBsaXRlcmFsIGNoYXJhY3RlcnNcbiAgICAgIGlmIChvcHRzLmxpdGVyYWxCcmFja2V0cyA9PT0gdHJ1ZSkge1xuICAgICAgICBzdGF0ZS5vdXRwdXQgKz0gZXNjYXBlZDtcbiAgICAgICAgcHJldi52YWx1ZSA9IGVzY2FwZWQ7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyB3aGVuIHRoZSB1c2VyIHNwZWNpZmllcyBub3RoaW5nLCB0cnkgdG8gbWF0Y2ggYm90aFxuICAgICAgcHJldi52YWx1ZSA9IGAoJHtjYXB0dXJlfSR7ZXNjYXBlZH18JHtwcmV2LnZhbHVlfSlgO1xuICAgICAgc3RhdGUub3V0cHV0ICs9IHByZXYudmFsdWU7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBCcmFjZXNcbiAgICAgKi9cblxuICAgIGlmICh2YWx1ZSA9PT0gJ3snICYmIG9wdHMubm9icmFjZSAhPT0gdHJ1ZSkge1xuICAgICAgaW5jcmVtZW50KCdicmFjZXMnKTtcblxuICAgICAgY29uc3Qgb3BlbiA9IHtcbiAgICAgICAgdHlwZTogJ2JyYWNlJyxcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIG91dHB1dDogJygnLFxuICAgICAgICBvdXRwdXRJbmRleDogc3RhdGUub3V0cHV0Lmxlbmd0aCxcbiAgICAgICAgdG9rZW5zSW5kZXg6IHN0YXRlLnRva2Vucy5sZW5ndGhcbiAgICAgIH07XG5cbiAgICAgIGJyYWNlcy5wdXNoKG9wZW4pO1xuICAgICAgcHVzaChvcGVuKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmICh2YWx1ZSA9PT0gJ30nKSB7XG4gICAgICBjb25zdCBicmFjZSA9IGJyYWNlc1ticmFjZXMubGVuZ3RoIC0gMV07XG5cbiAgICAgIGlmIChvcHRzLm5vYnJhY2UgPT09IHRydWUgfHwgIWJyYWNlKSB7XG4gICAgICAgIHB1c2goeyB0eXBlOiAndGV4dCcsIHZhbHVlLCBvdXRwdXQ6IHZhbHVlIH0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgbGV0IG91dHB1dCA9ICcpJztcblxuICAgICAgaWYgKGJyYWNlLmRvdHMgPT09IHRydWUpIHtcbiAgICAgICAgY29uc3QgYXJyID0gdG9rZW5zLnNsaWNlKCk7XG4gICAgICAgIGNvbnN0IHJhbmdlID0gW107XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IGFyci5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgIHRva2Vucy5wb3AoKTtcbiAgICAgICAgICBpZiAoYXJyW2ldLnR5cGUgPT09ICdicmFjZScpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoYXJyW2ldLnR5cGUgIT09ICdkb3RzJykge1xuICAgICAgICAgICAgcmFuZ2UudW5zaGlmdChhcnJbaV0udmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIG91dHB1dCA9IGV4cGFuZFJhbmdlKHJhbmdlLCBvcHRzKTtcbiAgICAgICAgc3RhdGUuYmFja3RyYWNrID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGJyYWNlLmNvbW1hICE9PSB0cnVlICYmIGJyYWNlLmRvdHMgIT09IHRydWUpIHtcbiAgICAgICAgY29uc3Qgb3V0ID0gc3RhdGUub3V0cHV0LnNsaWNlKDAsIGJyYWNlLm91dHB1dEluZGV4KTtcbiAgICAgICAgY29uc3QgdG9rcyA9IHN0YXRlLnRva2Vucy5zbGljZShicmFjZS50b2tlbnNJbmRleCk7XG4gICAgICAgIGJyYWNlLnZhbHVlID0gYnJhY2Uub3V0cHV0ID0gJ1xcXFx7JztcbiAgICAgICAgdmFsdWUgPSBvdXRwdXQgPSAnXFxcXH0nO1xuICAgICAgICBzdGF0ZS5vdXRwdXQgPSBvdXQ7XG4gICAgICAgIGZvciAoY29uc3QgdCBvZiB0b2tzKSB7XG4gICAgICAgICAgc3RhdGUub3V0cHV0ICs9ICh0Lm91dHB1dCB8fCB0LnZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBwdXNoKHsgdHlwZTogJ2JyYWNlJywgdmFsdWUsIG91dHB1dCB9KTtcbiAgICAgIGRlY3JlbWVudCgnYnJhY2VzJyk7XG4gICAgICBicmFjZXMucG9wKCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQaXBlc1xuICAgICAqL1xuXG4gICAgaWYgKHZhbHVlID09PSAnfCcpIHtcbiAgICAgIGlmIChleHRnbG9icy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGV4dGdsb2JzW2V4dGdsb2JzLmxlbmd0aCAtIDFdLmNvbmRpdGlvbnMrKztcbiAgICAgIH1cbiAgICAgIHB1c2goeyB0eXBlOiAndGV4dCcsIHZhbHVlIH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29tbWFzXG4gICAgICovXG5cbiAgICBpZiAodmFsdWUgPT09ICcsJykge1xuICAgICAgbGV0IG91dHB1dCA9IHZhbHVlO1xuXG4gICAgICBjb25zdCBicmFjZSA9IGJyYWNlc1ticmFjZXMubGVuZ3RoIC0gMV07XG4gICAgICBpZiAoYnJhY2UgJiYgc3RhY2tbc3RhY2subGVuZ3RoIC0gMV0gPT09ICdicmFjZXMnKSB7XG4gICAgICAgIGJyYWNlLmNvbW1hID0gdHJ1ZTtcbiAgICAgICAgb3V0cHV0ID0gJ3wnO1xuICAgICAgfVxuXG4gICAgICBwdXNoKHsgdHlwZTogJ2NvbW1hJywgdmFsdWUsIG91dHB1dCB9KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNsYXNoZXNcbiAgICAgKi9cblxuICAgIGlmICh2YWx1ZSA9PT0gJy8nKSB7XG4gICAgICAvLyBpZiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBnbG9iIGlzIFwiLi9cIiwgYWR2YW5jZSB0aGUgc3RhcnRcbiAgICAgIC8vIHRvIHRoZSBjdXJyZW50IGluZGV4LCBhbmQgZG9uJ3QgYWRkIHRoZSBcIi4vXCIgY2hhcmFjdGVyc1xuICAgICAgLy8gdG8gdGhlIHN0YXRlLiBUaGlzIGdyZWF0bHkgc2ltcGxpZmllcyBsb29rYmVoaW5kcyB3aGVuXG4gICAgICAvLyBjaGVja2luZyBmb3IgQk9TIGNoYXJhY3RlcnMgbGlrZSBcIiFcIiBhbmQgXCIuXCIgKG5vdCBcIi4vXCIpXG4gICAgICBpZiAocHJldi50eXBlID09PSAnZG90JyAmJiBzdGF0ZS5pbmRleCA9PT0gc3RhdGUuc3RhcnQgKyAxKSB7XG4gICAgICAgIHN0YXRlLnN0YXJ0ID0gc3RhdGUuaW5kZXggKyAxO1xuICAgICAgICBzdGF0ZS5jb25zdW1lZCA9ICcnO1xuICAgICAgICBzdGF0ZS5vdXRwdXQgPSAnJztcbiAgICAgICAgdG9rZW5zLnBvcCgpO1xuICAgICAgICBwcmV2ID0gYm9zOyAvLyByZXNldCBcInByZXZcIiB0byB0aGUgZmlyc3QgdG9rZW5cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHB1c2goeyB0eXBlOiAnc2xhc2gnLCB2YWx1ZSwgb3V0cHV0OiBTTEFTSF9MSVRFUkFMIH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRG90c1xuICAgICAqL1xuXG4gICAgaWYgKHZhbHVlID09PSAnLicpIHtcbiAgICAgIGlmIChzdGF0ZS5icmFjZXMgPiAwICYmIHByZXYudHlwZSA9PT0gJ2RvdCcpIHtcbiAgICAgICAgaWYgKHByZXYudmFsdWUgPT09ICcuJykgcHJldi5vdXRwdXQgPSBET1RfTElURVJBTDtcbiAgICAgICAgY29uc3QgYnJhY2UgPSBicmFjZXNbYnJhY2VzLmxlbmd0aCAtIDFdO1xuICAgICAgICBwcmV2LnR5cGUgPSAnZG90cyc7XG4gICAgICAgIHByZXYub3V0cHV0ICs9IHZhbHVlO1xuICAgICAgICBwcmV2LnZhbHVlICs9IHZhbHVlO1xuICAgICAgICBicmFjZS5kb3RzID0gdHJ1ZTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmICgoc3RhdGUuYnJhY2VzICsgc3RhdGUucGFyZW5zKSA9PT0gMCAmJiBwcmV2LnR5cGUgIT09ICdib3MnICYmIHByZXYudHlwZSAhPT0gJ3NsYXNoJykge1xuICAgICAgICBwdXNoKHsgdHlwZTogJ3RleHQnLCB2YWx1ZSwgb3V0cHV0OiBET1RfTElURVJBTCB9KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHB1c2goeyB0eXBlOiAnZG90JywgdmFsdWUsIG91dHB1dDogRE9UX0xJVEVSQUwgfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBRdWVzdGlvbiBtYXJrc1xuICAgICAqL1xuXG4gICAgaWYgKHZhbHVlID09PSAnPycpIHtcbiAgICAgIGNvbnN0IGlzR3JvdXAgPSBwcmV2ICYmIHByZXYudmFsdWUgPT09ICcoJztcbiAgICAgIGlmICghaXNHcm91cCAmJiBvcHRzLm5vZXh0Z2xvYiAhPT0gdHJ1ZSAmJiBwZWVrKCkgPT09ICcoJyAmJiBwZWVrKDIpICE9PSAnPycpIHtcbiAgICAgICAgZXh0Z2xvYk9wZW4oJ3FtYXJrJywgdmFsdWUpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHByZXYgJiYgcHJldi50eXBlID09PSAncGFyZW4nKSB7XG4gICAgICAgIGNvbnN0IG5leHQgPSBwZWVrKCk7XG4gICAgICAgIGxldCBvdXRwdXQgPSB2YWx1ZTtcblxuICAgICAgICBpZiAobmV4dCA9PT0gJzwnICYmICF1dGlscy5zdXBwb3J0c0xvb2tiZWhpbmRzKCkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vZGUuanMgdjEwIG9yIGhpZ2hlciBpcyByZXF1aXJlZCBmb3IgcmVnZXggbG9va2JlaGluZHMnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICgocHJldi52YWx1ZSA9PT0gJygnICYmICEvWyE9PDpdLy50ZXN0KG5leHQpKSB8fCAobmV4dCA9PT0gJzwnICYmICEvPChbIT1dfFxcdys+KS8udGVzdChyZW1haW5pbmcoKSkpKSB7XG4gICAgICAgICAgb3V0cHV0ID0gYFxcXFwke3ZhbHVlfWA7XG4gICAgICAgIH1cblxuICAgICAgICBwdXNoKHsgdHlwZTogJ3RleHQnLCB2YWx1ZSwgb3V0cHV0IH0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKG9wdHMuZG90ICE9PSB0cnVlICYmIChwcmV2LnR5cGUgPT09ICdzbGFzaCcgfHwgcHJldi50eXBlID09PSAnYm9zJykpIHtcbiAgICAgICAgcHVzaCh7IHR5cGU6ICdxbWFyaycsIHZhbHVlLCBvdXRwdXQ6IFFNQVJLX05PX0RPVCB9KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHB1c2goeyB0eXBlOiAncW1hcmsnLCB2YWx1ZSwgb3V0cHV0OiBRTUFSSyB9KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV4Y2xhbWF0aW9uXG4gICAgICovXG5cbiAgICBpZiAodmFsdWUgPT09ICchJykge1xuICAgICAgaWYgKG9wdHMubm9leHRnbG9iICE9PSB0cnVlICYmIHBlZWsoKSA9PT0gJygnKSB7XG4gICAgICAgIGlmIChwZWVrKDIpICE9PSAnPycgfHwgIS9bIT08Ol0vLnRlc3QocGVlaygzKSkpIHtcbiAgICAgICAgICBleHRnbG9iT3BlbignbmVnYXRlJywgdmFsdWUpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChvcHRzLm5vbmVnYXRlICE9PSB0cnVlICYmIHN0YXRlLmluZGV4ID09PSAwKSB7XG4gICAgICAgIG5lZ2F0ZSgpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQbHVzXG4gICAgICovXG5cbiAgICBpZiAodmFsdWUgPT09ICcrJykge1xuICAgICAgaWYgKG9wdHMubm9leHRnbG9iICE9PSB0cnVlICYmIHBlZWsoKSA9PT0gJygnICYmIHBlZWsoMikgIT09ICc/Jykge1xuICAgICAgICBleHRnbG9iT3BlbigncGx1cycsIHZhbHVlKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmICgocHJldiAmJiBwcmV2LnZhbHVlID09PSAnKCcpIHx8IG9wdHMucmVnZXggPT09IGZhbHNlKSB7XG4gICAgICAgIHB1c2goeyB0eXBlOiAncGx1cycsIHZhbHVlLCBvdXRwdXQ6IFBMVVNfTElURVJBTCB9KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmICgocHJldiAmJiAocHJldi50eXBlID09PSAnYnJhY2tldCcgfHwgcHJldi50eXBlID09PSAncGFyZW4nIHx8IHByZXYudHlwZSA9PT0gJ2JyYWNlJykpIHx8IHN0YXRlLnBhcmVucyA+IDApIHtcbiAgICAgICAgcHVzaCh7IHR5cGU6ICdwbHVzJywgdmFsdWUgfSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBwdXNoKHsgdHlwZTogJ3BsdXMnLCB2YWx1ZTogUExVU19MSVRFUkFMIH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGxhaW4gdGV4dFxuICAgICAqL1xuXG4gICAgaWYgKHZhbHVlID09PSAnQCcpIHtcbiAgICAgIGlmIChvcHRzLm5vZXh0Z2xvYiAhPT0gdHJ1ZSAmJiBwZWVrKCkgPT09ICcoJyAmJiBwZWVrKDIpICE9PSAnPycpIHtcbiAgICAgICAgcHVzaCh7IHR5cGU6ICdhdCcsIGV4dGdsb2I6IHRydWUsIHZhbHVlLCBvdXRwdXQ6ICcnIH0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgcHVzaCh7IHR5cGU6ICd0ZXh0JywgdmFsdWUgfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQbGFpbiB0ZXh0XG4gICAgICovXG5cbiAgICBpZiAodmFsdWUgIT09ICcqJykge1xuICAgICAgaWYgKHZhbHVlID09PSAnJCcgfHwgdmFsdWUgPT09ICdeJykge1xuICAgICAgICB2YWx1ZSA9IGBcXFxcJHt2YWx1ZX1gO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBtYXRjaCA9IFJFR0VYX05PTl9TUEVDSUFMX0NIQVJTLmV4ZWMocmVtYWluaW5nKCkpO1xuICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgIHZhbHVlICs9IG1hdGNoWzBdO1xuICAgICAgICBzdGF0ZS5pbmRleCArPSBtYXRjaFswXS5sZW5ndGg7XG4gICAgICB9XG5cbiAgICAgIHB1c2goeyB0eXBlOiAndGV4dCcsIHZhbHVlIH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU3RhcnNcbiAgICAgKi9cblxuICAgIGlmIChwcmV2ICYmIChwcmV2LnR5cGUgPT09ICdnbG9ic3RhcicgfHwgcHJldi5zdGFyID09PSB0cnVlKSkge1xuICAgICAgcHJldi50eXBlID0gJ3N0YXInO1xuICAgICAgcHJldi5zdGFyID0gdHJ1ZTtcbiAgICAgIHByZXYudmFsdWUgKz0gdmFsdWU7XG4gICAgICBwcmV2Lm91dHB1dCA9IHN0YXI7XG4gICAgICBzdGF0ZS5iYWNrdHJhY2sgPSB0cnVlO1xuICAgICAgc3RhdGUuZ2xvYnN0YXIgPSB0cnVlO1xuICAgICAgY29uc3VtZSh2YWx1ZSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBsZXQgcmVzdCA9IHJlbWFpbmluZygpO1xuICAgIGlmIChvcHRzLm5vZXh0Z2xvYiAhPT0gdHJ1ZSAmJiAvXlxcKFteP10vLnRlc3QocmVzdCkpIHtcbiAgICAgIGV4dGdsb2JPcGVuKCdzdGFyJywgdmFsdWUpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKHByZXYudHlwZSA9PT0gJ3N0YXInKSB7XG4gICAgICBpZiAob3B0cy5ub2dsb2JzdGFyID09PSB0cnVlKSB7XG4gICAgICAgIGNvbnN1bWUodmFsdWUpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcHJpb3IgPSBwcmV2LnByZXY7XG4gICAgICBjb25zdCBiZWZvcmUgPSBwcmlvci5wcmV2O1xuICAgICAgY29uc3QgaXNTdGFydCA9IHByaW9yLnR5cGUgPT09ICdzbGFzaCcgfHwgcHJpb3IudHlwZSA9PT0gJ2Jvcyc7XG4gICAgICBjb25zdCBhZnRlclN0YXIgPSBiZWZvcmUgJiYgKGJlZm9yZS50eXBlID09PSAnc3RhcicgfHwgYmVmb3JlLnR5cGUgPT09ICdnbG9ic3RhcicpO1xuXG4gICAgICBpZiAob3B0cy5iYXNoID09PSB0cnVlICYmICghaXNTdGFydCB8fCAocmVzdFswXSAmJiByZXN0WzBdICE9PSAnLycpKSkge1xuICAgICAgICBwdXNoKHsgdHlwZTogJ3N0YXInLCB2YWx1ZSwgb3V0cHV0OiAnJyB9KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGlzQnJhY2UgPSBzdGF0ZS5icmFjZXMgPiAwICYmIChwcmlvci50eXBlID09PSAnY29tbWEnIHx8IHByaW9yLnR5cGUgPT09ICdicmFjZScpO1xuICAgICAgY29uc3QgaXNFeHRnbG9iID0gZXh0Z2xvYnMubGVuZ3RoICYmIChwcmlvci50eXBlID09PSAncGlwZScgfHwgcHJpb3IudHlwZSA9PT0gJ3BhcmVuJyk7XG4gICAgICBpZiAoIWlzU3RhcnQgJiYgcHJpb3IudHlwZSAhPT0gJ3BhcmVuJyAmJiAhaXNCcmFjZSAmJiAhaXNFeHRnbG9iKSB7XG4gICAgICAgIHB1c2goeyB0eXBlOiAnc3RhcicsIHZhbHVlLCBvdXRwdXQ6ICcnIH0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gc3RyaXAgY29uc2VjdXRpdmUgYC8qKi9gXG4gICAgICB3aGlsZSAocmVzdC5zbGljZSgwLCAzKSA9PT0gJy8qKicpIHtcbiAgICAgICAgY29uc3QgYWZ0ZXIgPSBpbnB1dFtzdGF0ZS5pbmRleCArIDRdO1xuICAgICAgICBpZiAoYWZ0ZXIgJiYgYWZ0ZXIgIT09ICcvJykge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHJlc3QgPSByZXN0LnNsaWNlKDMpO1xuICAgICAgICBjb25zdW1lKCcvKionLCAzKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHByaW9yLnR5cGUgPT09ICdib3MnICYmIGVvcygpKSB7XG4gICAgICAgIHByZXYudHlwZSA9ICdnbG9ic3Rhcic7XG4gICAgICAgIHByZXYudmFsdWUgKz0gdmFsdWU7XG4gICAgICAgIHByZXYub3V0cHV0ID0gZ2xvYnN0YXIob3B0cyk7XG4gICAgICAgIHN0YXRlLm91dHB1dCA9IHByZXYub3V0cHV0O1xuICAgICAgICBzdGF0ZS5nbG9ic3RhciA9IHRydWU7XG4gICAgICAgIGNvbnN1bWUodmFsdWUpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHByaW9yLnR5cGUgPT09ICdzbGFzaCcgJiYgcHJpb3IucHJldi50eXBlICE9PSAnYm9zJyAmJiAhYWZ0ZXJTdGFyICYmIGVvcygpKSB7XG4gICAgICAgIHN0YXRlLm91dHB1dCA9IHN0YXRlLm91dHB1dC5zbGljZSgwLCAtKHByaW9yLm91dHB1dCArIHByZXYub3V0cHV0KS5sZW5ndGgpO1xuICAgICAgICBwcmlvci5vdXRwdXQgPSBgKD86JHtwcmlvci5vdXRwdXR9YDtcblxuICAgICAgICBwcmV2LnR5cGUgPSAnZ2xvYnN0YXInO1xuICAgICAgICBwcmV2Lm91dHB1dCA9IGdsb2JzdGFyKG9wdHMpICsgKG9wdHMuc3RyaWN0U2xhc2hlcyA/ICcpJyA6ICd8JCknKTtcbiAgICAgICAgcHJldi52YWx1ZSArPSB2YWx1ZTtcbiAgICAgICAgc3RhdGUuZ2xvYnN0YXIgPSB0cnVlO1xuICAgICAgICBzdGF0ZS5vdXRwdXQgKz0gcHJpb3Iub3V0cHV0ICsgcHJldi5vdXRwdXQ7XG4gICAgICAgIGNvbnN1bWUodmFsdWUpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHByaW9yLnR5cGUgPT09ICdzbGFzaCcgJiYgcHJpb3IucHJldi50eXBlICE9PSAnYm9zJyAmJiByZXN0WzBdID09PSAnLycpIHtcbiAgICAgICAgY29uc3QgZW5kID0gcmVzdFsxXSAhPT0gdm9pZCAwID8gJ3wkJyA6ICcnO1xuXG4gICAgICAgIHN0YXRlLm91dHB1dCA9IHN0YXRlLm91dHB1dC5zbGljZSgwLCAtKHByaW9yLm91dHB1dCArIHByZXYub3V0cHV0KS5sZW5ndGgpO1xuICAgICAgICBwcmlvci5vdXRwdXQgPSBgKD86JHtwcmlvci5vdXRwdXR9YDtcblxuICAgICAgICBwcmV2LnR5cGUgPSAnZ2xvYnN0YXInO1xuICAgICAgICBwcmV2Lm91dHB1dCA9IGAke2dsb2JzdGFyKG9wdHMpfSR7U0xBU0hfTElURVJBTH18JHtTTEFTSF9MSVRFUkFMfSR7ZW5kfSlgO1xuICAgICAgICBwcmV2LnZhbHVlICs9IHZhbHVlO1xuXG4gICAgICAgIHN0YXRlLm91dHB1dCArPSBwcmlvci5vdXRwdXQgKyBwcmV2Lm91dHB1dDtcbiAgICAgICAgc3RhdGUuZ2xvYnN0YXIgPSB0cnVlO1xuXG4gICAgICAgIGNvbnN1bWUodmFsdWUgKyBhZHZhbmNlKCkpO1xuXG4gICAgICAgIHB1c2goeyB0eXBlOiAnc2xhc2gnLCB2YWx1ZTogJy8nLCBvdXRwdXQ6ICcnIH0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHByaW9yLnR5cGUgPT09ICdib3MnICYmIHJlc3RbMF0gPT09ICcvJykge1xuICAgICAgICBwcmV2LnR5cGUgPSAnZ2xvYnN0YXInO1xuICAgICAgICBwcmV2LnZhbHVlICs9IHZhbHVlO1xuICAgICAgICBwcmV2Lm91dHB1dCA9IGAoPzpefCR7U0xBU0hfTElURVJBTH18JHtnbG9ic3RhcihvcHRzKX0ke1NMQVNIX0xJVEVSQUx9KWA7XG4gICAgICAgIHN0YXRlLm91dHB1dCA9IHByZXYub3V0cHV0O1xuICAgICAgICBzdGF0ZS5nbG9ic3RhciA9IHRydWU7XG4gICAgICAgIGNvbnN1bWUodmFsdWUgKyBhZHZhbmNlKCkpO1xuICAgICAgICBwdXNoKHsgdHlwZTogJ3NsYXNoJywgdmFsdWU6ICcvJywgb3V0cHV0OiAnJyB9KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIHJlbW92ZSBzaW5nbGUgc3RhciBmcm9tIG91dHB1dFxuICAgICAgc3RhdGUub3V0cHV0ID0gc3RhdGUub3V0cHV0LnNsaWNlKDAsIC1wcmV2Lm91dHB1dC5sZW5ndGgpO1xuXG4gICAgICAvLyByZXNldCBwcmV2aW91cyB0b2tlbiB0byBnbG9ic3RhclxuICAgICAgcHJldi50eXBlID0gJ2dsb2JzdGFyJztcbiAgICAgIHByZXYub3V0cHV0ID0gZ2xvYnN0YXIob3B0cyk7XG4gICAgICBwcmV2LnZhbHVlICs9IHZhbHVlO1xuXG4gICAgICAvLyByZXNldCBvdXRwdXQgd2l0aCBnbG9ic3RhclxuICAgICAgc3RhdGUub3V0cHV0ICs9IHByZXYub3V0cHV0O1xuICAgICAgc3RhdGUuZ2xvYnN0YXIgPSB0cnVlO1xuICAgICAgY29uc3VtZSh2YWx1ZSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCB0b2tlbiA9IHsgdHlwZTogJ3N0YXInLCB2YWx1ZSwgb3V0cHV0OiBzdGFyIH07XG5cbiAgICBpZiAob3B0cy5iYXNoID09PSB0cnVlKSB7XG4gICAgICB0b2tlbi5vdXRwdXQgPSAnLio/JztcbiAgICAgIGlmIChwcmV2LnR5cGUgPT09ICdib3MnIHx8IHByZXYudHlwZSA9PT0gJ3NsYXNoJykge1xuICAgICAgICB0b2tlbi5vdXRwdXQgPSBub2RvdCArIHRva2VuLm91dHB1dDtcbiAgICAgIH1cbiAgICAgIHB1c2godG9rZW4pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKHByZXYgJiYgKHByZXYudHlwZSA9PT0gJ2JyYWNrZXQnIHx8IHByZXYudHlwZSA9PT0gJ3BhcmVuJykgJiYgb3B0cy5yZWdleCA9PT0gdHJ1ZSkge1xuICAgICAgdG9rZW4ub3V0cHV0ID0gdmFsdWU7XG4gICAgICBwdXNoKHRva2VuKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChzdGF0ZS5pbmRleCA9PT0gc3RhdGUuc3RhcnQgfHwgcHJldi50eXBlID09PSAnc2xhc2gnIHx8IHByZXYudHlwZSA9PT0gJ2RvdCcpIHtcbiAgICAgIGlmIChwcmV2LnR5cGUgPT09ICdkb3QnKSB7XG4gICAgICAgIHN0YXRlLm91dHB1dCArPSBOT19ET1RfU0xBU0g7XG4gICAgICAgIHByZXYub3V0cHV0ICs9IE5PX0RPVF9TTEFTSDtcblxuICAgICAgfSBlbHNlIGlmIChvcHRzLmRvdCA9PT0gdHJ1ZSkge1xuICAgICAgICBzdGF0ZS5vdXRwdXQgKz0gTk9fRE9UU19TTEFTSDtcbiAgICAgICAgcHJldi5vdXRwdXQgKz0gTk9fRE9UU19TTEFTSDtcblxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RhdGUub3V0cHV0ICs9IG5vZG90O1xuICAgICAgICBwcmV2Lm91dHB1dCArPSBub2RvdDtcbiAgICAgIH1cblxuICAgICAgaWYgKHBlZWsoKSAhPT0gJyonKSB7XG4gICAgICAgIHN0YXRlLm91dHB1dCArPSBPTkVfQ0hBUjtcbiAgICAgICAgcHJldi5vdXRwdXQgKz0gT05FX0NIQVI7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcHVzaCh0b2tlbik7XG4gIH1cblxuICB3aGlsZSAoc3RhdGUuYnJhY2tldHMgPiAwKSB7XG4gICAgaWYgKG9wdHMuc3RyaWN0QnJhY2tldHMgPT09IHRydWUpIHRocm93IG5ldyBTeW50YXhFcnJvcihzeW50YXhFcnJvcignY2xvc2luZycsICddJykpO1xuICAgIHN0YXRlLm91dHB1dCA9IHV0aWxzLmVzY2FwZUxhc3Qoc3RhdGUub3V0cHV0LCAnWycpO1xuICAgIGRlY3JlbWVudCgnYnJhY2tldHMnKTtcbiAgfVxuXG4gIHdoaWxlIChzdGF0ZS5wYXJlbnMgPiAwKSB7XG4gICAgaWYgKG9wdHMuc3RyaWN0QnJhY2tldHMgPT09IHRydWUpIHRocm93IG5ldyBTeW50YXhFcnJvcihzeW50YXhFcnJvcignY2xvc2luZycsICcpJykpO1xuICAgIHN0YXRlLm91dHB1dCA9IHV0aWxzLmVzY2FwZUxhc3Qoc3RhdGUub3V0cHV0LCAnKCcpO1xuICAgIGRlY3JlbWVudCgncGFyZW5zJyk7XG4gIH1cblxuICB3aGlsZSAoc3RhdGUuYnJhY2VzID4gMCkge1xuICAgIGlmIChvcHRzLnN0cmljdEJyYWNrZXRzID09PSB0cnVlKSB0aHJvdyBuZXcgU3ludGF4RXJyb3Ioc3ludGF4RXJyb3IoJ2Nsb3NpbmcnLCAnfScpKTtcbiAgICBzdGF0ZS5vdXRwdXQgPSB1dGlscy5lc2NhcGVMYXN0KHN0YXRlLm91dHB1dCwgJ3snKTtcbiAgICBkZWNyZW1lbnQoJ2JyYWNlcycpO1xuICB9XG5cbiAgaWYgKG9wdHMuc3RyaWN0U2xhc2hlcyAhPT0gdHJ1ZSAmJiAocHJldi50eXBlID09PSAnc3RhcicgfHwgcHJldi50eXBlID09PSAnYnJhY2tldCcpKSB7XG4gICAgcHVzaCh7IHR5cGU6ICdtYXliZV9zbGFzaCcsIHZhbHVlOiAnJywgb3V0cHV0OiBgJHtTTEFTSF9MSVRFUkFMfT9gIH0pO1xuICB9XG5cbiAgLy8gcmVidWlsZCB0aGUgb3V0cHV0IGlmIHdlIGhhZCB0byBiYWNrdHJhY2sgYXQgYW55IHBvaW50XG4gIGlmIChzdGF0ZS5iYWNrdHJhY2sgPT09IHRydWUpIHtcbiAgICBzdGF0ZS5vdXRwdXQgPSAnJztcblxuICAgIGZvciAoY29uc3QgdG9rZW4gb2Ygc3RhdGUudG9rZW5zKSB7XG4gICAgICBzdGF0ZS5vdXRwdXQgKz0gdG9rZW4ub3V0cHV0ICE9IG51bGwgPyB0b2tlbi5vdXRwdXQgOiB0b2tlbi52YWx1ZTtcblxuICAgICAgaWYgKHRva2VuLnN1ZmZpeCkge1xuICAgICAgICBzdGF0ZS5vdXRwdXQgKz0gdG9rZW4uc3VmZml4O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBzdGF0ZTtcbn07XG5cbi8qKlxuICogRmFzdCBwYXRocyBmb3IgY3JlYXRpbmcgcmVndWxhciBleHByZXNzaW9ucyBmb3IgY29tbW9uIGdsb2IgcGF0dGVybnMuXG4gKiBUaGlzIGNhbiBzaWduaWZpY2FudGx5IHNwZWVkIHVwIHByb2Nlc3NpbmcgYW5kIGhhcyB2ZXJ5IGxpdHRsZSBkb3duc2lkZVxuICogaW1wYWN0IHdoZW4gbm9uZSBvZiB0aGUgZmFzdCBwYXRocyBtYXRjaC5cbiAqL1xuXG5wYXJzZS5mYXN0cGF0aHMgPSAoaW5wdXQsIG9wdGlvbnMpID0+IHtcbiAgY29uc3Qgb3B0cyA9IHsgLi4ub3B0aW9ucyB9O1xuICBjb25zdCBtYXggPSB0eXBlb2Ygb3B0cy5tYXhMZW5ndGggPT09ICdudW1iZXInID8gTWF0aC5taW4oTUFYX0xFTkdUSCwgb3B0cy5tYXhMZW5ndGgpIDogTUFYX0xFTkdUSDtcbiAgY29uc3QgbGVuID0gaW5wdXQubGVuZ3RoO1xuICBpZiAobGVuID4gbWF4KSB7XG4gICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKGBJbnB1dCBsZW5ndGg6ICR7bGVufSwgZXhjZWVkcyBtYXhpbXVtIGFsbG93ZWQgbGVuZ3RoOiAke21heH1gKTtcbiAgfVxuXG4gIGlucHV0ID0gUkVQTEFDRU1FTlRTW2lucHV0XSB8fCBpbnB1dDtcbiAgY29uc3Qgd2luMzIgPSB1dGlscy5pc1dpbmRvd3Mob3B0aW9ucyk7XG5cbiAgLy8gY3JlYXRlIGNvbnN0YW50cyBiYXNlZCBvbiBwbGF0Zm9ybSwgZm9yIHdpbmRvd3Mgb3IgcG9zaXhcbiAgY29uc3Qge1xuICAgIERPVF9MSVRFUkFMLFxuICAgIFNMQVNIX0xJVEVSQUwsXG4gICAgT05FX0NIQVIsXG4gICAgRE9UU19TTEFTSCxcbiAgICBOT19ET1QsXG4gICAgTk9fRE9UUyxcbiAgICBOT19ET1RTX1NMQVNILFxuICAgIFNUQVIsXG4gICAgU1RBUlRfQU5DSE9SXG4gIH0gPSBjb25zdGFudHMuZ2xvYkNoYXJzKHdpbjMyKTtcblxuICBjb25zdCBub2RvdCA9IG9wdHMuZG90ID8gTk9fRE9UUyA6IE5PX0RPVDtcbiAgY29uc3Qgc2xhc2hEb3QgPSBvcHRzLmRvdCA/IE5PX0RPVFNfU0xBU0ggOiBOT19ET1Q7XG4gIGNvbnN0IGNhcHR1cmUgPSBvcHRzLmNhcHR1cmUgPyAnJyA6ICc/Oic7XG4gIGNvbnN0IHN0YXRlID0geyBuZWdhdGVkOiBmYWxzZSwgcHJlZml4OiAnJyB9O1xuICBsZXQgc3RhciA9IG9wdHMuYmFzaCA9PT0gdHJ1ZSA/ICcuKj8nIDogU1RBUjtcblxuICBpZiAob3B0cy5jYXB0dXJlKSB7XG4gICAgc3RhciA9IGAoJHtzdGFyfSlgO1xuICB9XG5cbiAgY29uc3QgZ2xvYnN0YXIgPSBvcHRzID0+IHtcbiAgICBpZiAob3B0cy5ub2dsb2JzdGFyID09PSB0cnVlKSByZXR1cm4gc3RhcjtcbiAgICByZXR1cm4gYCgke2NhcHR1cmV9KD86KD8hJHtTVEFSVF9BTkNIT1J9JHtvcHRzLmRvdCA/IERPVFNfU0xBU0ggOiBET1RfTElURVJBTH0pLikqPylgO1xuICB9O1xuXG4gIGNvbnN0IGNyZWF0ZSA9IHN0ciA9PiB7XG4gICAgc3dpdGNoIChzdHIpIHtcbiAgICAgIGNhc2UgJyonOlxuICAgICAgICByZXR1cm4gYCR7bm9kb3R9JHtPTkVfQ0hBUn0ke3N0YXJ9YDtcblxuICAgICAgY2FzZSAnLionOlxuICAgICAgICByZXR1cm4gYCR7RE9UX0xJVEVSQUx9JHtPTkVfQ0hBUn0ke3N0YXJ9YDtcblxuICAgICAgY2FzZSAnKi4qJzpcbiAgICAgICAgcmV0dXJuIGAke25vZG90fSR7c3Rhcn0ke0RPVF9MSVRFUkFMfSR7T05FX0NIQVJ9JHtzdGFyfWA7XG5cbiAgICAgIGNhc2UgJyovKic6XG4gICAgICAgIHJldHVybiBgJHtub2RvdH0ke3N0YXJ9JHtTTEFTSF9MSVRFUkFMfSR7T05FX0NIQVJ9JHtzbGFzaERvdH0ke3N0YXJ9YDtcblxuICAgICAgY2FzZSAnKionOlxuICAgICAgICByZXR1cm4gbm9kb3QgKyBnbG9ic3RhcihvcHRzKTtcblxuICAgICAgY2FzZSAnKiovKic6XG4gICAgICAgIHJldHVybiBgKD86JHtub2RvdH0ke2dsb2JzdGFyKG9wdHMpfSR7U0xBU0hfTElURVJBTH0pPyR7c2xhc2hEb3R9JHtPTkVfQ0hBUn0ke3N0YXJ9YDtcblxuICAgICAgY2FzZSAnKiovKi4qJzpcbiAgICAgICAgcmV0dXJuIGAoPzoke25vZG90fSR7Z2xvYnN0YXIob3B0cyl9JHtTTEFTSF9MSVRFUkFMfSk/JHtzbGFzaERvdH0ke3N0YXJ9JHtET1RfTElURVJBTH0ke09ORV9DSEFSfSR7c3Rhcn1gO1xuXG4gICAgICBjYXNlICcqKi8uKic6XG4gICAgICAgIHJldHVybiBgKD86JHtub2RvdH0ke2dsb2JzdGFyKG9wdHMpfSR7U0xBU0hfTElURVJBTH0pPyR7RE9UX0xJVEVSQUx9JHtPTkVfQ0hBUn0ke3N0YXJ9YDtcblxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICBjb25zdCBtYXRjaCA9IC9eKC4qPylcXC4oXFx3KykkLy5leGVjKHN0cik7XG4gICAgICAgIGlmICghbWF0Y2gpIHJldHVybjtcblxuICAgICAgICBjb25zdCBzb3VyY2UgPSBjcmVhdGUobWF0Y2hbMV0pO1xuICAgICAgICBpZiAoIXNvdXJjZSkgcmV0dXJuO1xuXG4gICAgICAgIHJldHVybiBzb3VyY2UgKyBET1RfTElURVJBTCArIG1hdGNoWzJdO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBjb25zdCBvdXRwdXQgPSB1dGlscy5yZW1vdmVQcmVmaXgoaW5wdXQsIHN0YXRlKTtcbiAgbGV0IHNvdXJjZSA9IGNyZWF0ZShvdXRwdXQpO1xuXG4gIGlmIChzb3VyY2UgJiYgb3B0cy5zdHJpY3RTbGFzaGVzICE9PSB0cnVlKSB7XG4gICAgc291cmNlICs9IGAke1NMQVNIX0xJVEVSQUx9P2A7XG4gIH1cblxuICByZXR1cm4gc291cmNlO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXJzZTtcbiIsICIndXNlIHN0cmljdCc7XG5cbmNvbnN0IHBhdGggPSByZXF1aXJlKCdwYXRoJyk7XG5jb25zdCBzY2FuID0gcmVxdWlyZSgnLi9zY2FuJyk7XG5jb25zdCBwYXJzZSA9IHJlcXVpcmUoJy4vcGFyc2UnKTtcbmNvbnN0IHV0aWxzID0gcmVxdWlyZSgnLi91dGlscycpO1xuY29uc3QgY29uc3RhbnRzID0gcmVxdWlyZSgnLi9jb25zdGFudHMnKTtcbmNvbnN0IGlzT2JqZWN0ID0gdmFsID0+IHZhbCAmJiB0eXBlb2YgdmFsID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheSh2YWwpO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBtYXRjaGVyIGZ1bmN0aW9uIGZyb20gb25lIG9yIG1vcmUgZ2xvYiBwYXR0ZXJucy4gVGhlXG4gKiByZXR1cm5lZCBmdW5jdGlvbiB0YWtlcyBhIHN0cmluZyB0byBtYXRjaCBhcyBpdHMgZmlyc3QgYXJndW1lbnQsXG4gKiBhbmQgcmV0dXJucyB0cnVlIGlmIHRoZSBzdHJpbmcgaXMgYSBtYXRjaC4gVGhlIHJldHVybmVkIG1hdGNoZXJcbiAqIGZ1bmN0aW9uIGFsc28gdGFrZXMgYSBib29sZWFuIGFzIHRoZSBzZWNvbmQgYXJndW1lbnQgdGhhdCwgd2hlbiB0cnVlLFxuICogcmV0dXJucyBhbiBvYmplY3Qgd2l0aCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBwaWNvbWF0Y2ggPSByZXF1aXJlKCdwaWNvbWF0Y2gnKTtcbiAqIC8vIHBpY29tYXRjaChnbG9iWywgb3B0aW9uc10pO1xuICpcbiAqIGNvbnN0IGlzTWF0Y2ggPSBwaWNvbWF0Y2goJyouISgqYSknKTtcbiAqIGNvbnNvbGUubG9nKGlzTWF0Y2goJ2EuYScpKTsgLy89PiBmYWxzZVxuICogY29uc29sZS5sb2coaXNNYXRjaCgnYS5iJykpOyAvLz0+IHRydWVcbiAqIGBgYFxuICogQG5hbWUgcGljb21hdGNoXG4gKiBAcGFyYW0ge1N0cmluZ3xBcnJheX0gYGdsb2JzYCBPbmUgb3IgbW9yZSBnbG9iIHBhdHRlcm5zLlxuICogQHBhcmFtIHtPYmplY3Q9fSBgb3B0aW9uc2BcbiAqIEByZXR1cm4ge0Z1bmN0aW9uPX0gUmV0dXJucyBhIG1hdGNoZXIgZnVuY3Rpb24uXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmNvbnN0IHBpY29tYXRjaCA9IChnbG9iLCBvcHRpb25zLCByZXR1cm5TdGF0ZSA9IGZhbHNlKSA9PiB7XG4gIGlmIChBcnJheS5pc0FycmF5KGdsb2IpKSB7XG4gICAgY29uc3QgZm5zID0gZ2xvYi5tYXAoaW5wdXQgPT4gcGljb21hdGNoKGlucHV0LCBvcHRpb25zLCByZXR1cm5TdGF0ZSkpO1xuICAgIGNvbnN0IGFycmF5TWF0Y2hlciA9IHN0ciA9PiB7XG4gICAgICBmb3IgKGNvbnN0IGlzTWF0Y2ggb2YgZm5zKSB7XG4gICAgICAgIGNvbnN0IHN0YXRlID0gaXNNYXRjaChzdHIpO1xuICAgICAgICBpZiAoc3RhdGUpIHJldHVybiBzdGF0ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuICAgIHJldHVybiBhcnJheU1hdGNoZXI7XG4gIH1cblxuICBjb25zdCBpc1N0YXRlID0gaXNPYmplY3QoZ2xvYikgJiYgZ2xvYi50b2tlbnMgJiYgZ2xvYi5pbnB1dDtcblxuICBpZiAoZ2xvYiA9PT0gJycgfHwgKHR5cGVvZiBnbG9iICE9PSAnc3RyaW5nJyAmJiAhaXNTdGF0ZSkpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBwYXR0ZXJuIHRvIGJlIGEgbm9uLWVtcHR5IHN0cmluZycpO1xuICB9XG5cbiAgY29uc3Qgb3B0cyA9IG9wdGlvbnMgfHwge307XG4gIGNvbnN0IHBvc2l4ID0gdXRpbHMuaXNXaW5kb3dzKG9wdGlvbnMpO1xuICBjb25zdCByZWdleCA9IGlzU3RhdGVcbiAgICA/IHBpY29tYXRjaC5jb21waWxlUmUoZ2xvYiwgb3B0aW9ucylcbiAgICA6IHBpY29tYXRjaC5tYWtlUmUoZ2xvYiwgb3B0aW9ucywgZmFsc2UsIHRydWUpO1xuXG4gIGNvbnN0IHN0YXRlID0gcmVnZXguc3RhdGU7XG4gIGRlbGV0ZSByZWdleC5zdGF0ZTtcblxuICBsZXQgaXNJZ25vcmVkID0gKCkgPT4gZmFsc2U7XG4gIGlmIChvcHRzLmlnbm9yZSkge1xuICAgIGNvbnN0IGlnbm9yZU9wdHMgPSB7IC4uLm9wdGlvbnMsIGlnbm9yZTogbnVsbCwgb25NYXRjaDogbnVsbCwgb25SZXN1bHQ6IG51bGwgfTtcbiAgICBpc0lnbm9yZWQgPSBwaWNvbWF0Y2gob3B0cy5pZ25vcmUsIGlnbm9yZU9wdHMsIHJldHVyblN0YXRlKTtcbiAgfVxuXG4gIGNvbnN0IG1hdGNoZXIgPSAoaW5wdXQsIHJldHVybk9iamVjdCA9IGZhbHNlKSA9PiB7XG4gICAgY29uc3QgeyBpc01hdGNoLCBtYXRjaCwgb3V0cHV0IH0gPSBwaWNvbWF0Y2gudGVzdChpbnB1dCwgcmVnZXgsIG9wdGlvbnMsIHsgZ2xvYiwgcG9zaXggfSk7XG4gICAgY29uc3QgcmVzdWx0ID0geyBnbG9iLCBzdGF0ZSwgcmVnZXgsIHBvc2l4LCBpbnB1dCwgb3V0cHV0LCBtYXRjaCwgaXNNYXRjaCB9O1xuXG4gICAgaWYgKHR5cGVvZiBvcHRzLm9uUmVzdWx0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBvcHRzLm9uUmVzdWx0KHJlc3VsdCk7XG4gICAgfVxuXG4gICAgaWYgKGlzTWF0Y2ggPT09IGZhbHNlKSB7XG4gICAgICByZXN1bHQuaXNNYXRjaCA9IGZhbHNlO1xuICAgICAgcmV0dXJuIHJldHVybk9iamVjdCA/IHJlc3VsdCA6IGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChpc0lnbm9yZWQoaW5wdXQpKSB7XG4gICAgICBpZiAodHlwZW9mIG9wdHMub25JZ25vcmUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgb3B0cy5vbklnbm9yZShyZXN1bHQpO1xuICAgICAgfVxuICAgICAgcmVzdWx0LmlzTWF0Y2ggPSBmYWxzZTtcbiAgICAgIHJldHVybiByZXR1cm5PYmplY3QgPyByZXN1bHQgOiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG9wdHMub25NYXRjaCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgb3B0cy5vbk1hdGNoKHJlc3VsdCk7XG4gICAgfVxuICAgIHJldHVybiByZXR1cm5PYmplY3QgPyByZXN1bHQgOiB0cnVlO1xuICB9O1xuXG4gIGlmIChyZXR1cm5TdGF0ZSkge1xuICAgIG1hdGNoZXIuc3RhdGUgPSBzdGF0ZTtcbiAgfVxuXG4gIHJldHVybiBtYXRjaGVyO1xufTtcblxuLyoqXG4gKiBUZXN0IGBpbnB1dGAgd2l0aCB0aGUgZ2l2ZW4gYHJlZ2V4YC4gVGhpcyBpcyB1c2VkIGJ5IHRoZSBtYWluXG4gKiBgcGljb21hdGNoKClgIGZ1bmN0aW9uIHRvIHRlc3QgdGhlIGlucHV0IHN0cmluZy5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgcGljb21hdGNoID0gcmVxdWlyZSgncGljb21hdGNoJyk7XG4gKiAvLyBwaWNvbWF0Y2gudGVzdChpbnB1dCwgcmVnZXhbLCBvcHRpb25zXSk7XG4gKlxuICogY29uc29sZS5sb2cocGljb21hdGNoLnRlc3QoJ2Zvby9iYXInLCAvXig/OihbXi9dKj8pXFwvKFteL10qPykpJC8pKTtcbiAqIC8vIHsgaXNNYXRjaDogdHJ1ZSwgbWF0Y2g6IFsgJ2Zvby8nLCAnZm9vJywgJ2JhcicgXSwgb3V0cHV0OiAnZm9vL2JhcicgfVxuICogYGBgXG4gKiBAcGFyYW0ge1N0cmluZ30gYGlucHV0YCBTdHJpbmcgdG8gdGVzdC5cbiAqIEBwYXJhbSB7UmVnRXhwfSBgcmVnZXhgXG4gKiBAcmV0dXJuIHtPYmplY3R9IFJldHVybnMgYW4gb2JqZWN0IHdpdGggbWF0Y2hpbmcgaW5mby5cbiAqIEBhcGkgcHVibGljXG4gKi9cblxucGljb21hdGNoLnRlc3QgPSAoaW5wdXQsIHJlZ2V4LCBvcHRpb25zLCB7IGdsb2IsIHBvc2l4IH0gPSB7fSkgPT4ge1xuICBpZiAodHlwZW9mIGlucHV0ICE9PSAnc3RyaW5nJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdGVkIGlucHV0IHRvIGJlIGEgc3RyaW5nJyk7XG4gIH1cblxuICBpZiAoaW5wdXQgPT09ICcnKSB7XG4gICAgcmV0dXJuIHsgaXNNYXRjaDogZmFsc2UsIG91dHB1dDogJycgfTtcbiAgfVxuXG4gIGNvbnN0IG9wdHMgPSBvcHRpb25zIHx8IHt9O1xuICBjb25zdCBmb3JtYXQgPSBvcHRzLmZvcm1hdCB8fCAocG9zaXggPyB1dGlscy50b1Bvc2l4U2xhc2hlcyA6IG51bGwpO1xuICBsZXQgbWF0Y2ggPSBpbnB1dCA9PT0gZ2xvYjtcbiAgbGV0IG91dHB1dCA9IChtYXRjaCAmJiBmb3JtYXQpID8gZm9ybWF0KGlucHV0KSA6IGlucHV0O1xuXG4gIGlmIChtYXRjaCA9PT0gZmFsc2UpIHtcbiAgICBvdXRwdXQgPSBmb3JtYXQgPyBmb3JtYXQoaW5wdXQpIDogaW5wdXQ7XG4gICAgbWF0Y2ggPSBvdXRwdXQgPT09IGdsb2I7XG4gIH1cblxuICBpZiAobWF0Y2ggPT09IGZhbHNlIHx8IG9wdHMuY2FwdHVyZSA9PT0gdHJ1ZSkge1xuICAgIGlmIChvcHRzLm1hdGNoQmFzZSA9PT0gdHJ1ZSB8fCBvcHRzLmJhc2VuYW1lID09PSB0cnVlKSB7XG4gICAgICBtYXRjaCA9IHBpY29tYXRjaC5tYXRjaEJhc2UoaW5wdXQsIHJlZ2V4LCBvcHRpb25zLCBwb3NpeCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG1hdGNoID0gcmVnZXguZXhlYyhvdXRwdXQpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7IGlzTWF0Y2g6IEJvb2xlYW4obWF0Y2gpLCBtYXRjaCwgb3V0cHV0IH07XG59O1xuXG4vKipcbiAqIE1hdGNoIHRoZSBiYXNlbmFtZSBvZiBhIGZpbGVwYXRoLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBwaWNvbWF0Y2ggPSByZXF1aXJlKCdwaWNvbWF0Y2gnKTtcbiAqIC8vIHBpY29tYXRjaC5tYXRjaEJhc2UoaW5wdXQsIGdsb2JbLCBvcHRpb25zXSk7XG4gKiBjb25zb2xlLmxvZyhwaWNvbWF0Y2gubWF0Y2hCYXNlKCdmb28vYmFyLmpzJywgJyouanMnKTsgLy8gdHJ1ZVxuICogYGBgXG4gKiBAcGFyYW0ge1N0cmluZ30gYGlucHV0YCBTdHJpbmcgdG8gdGVzdC5cbiAqIEBwYXJhbSB7UmVnRXhwfFN0cmluZ30gYGdsb2JgIEdsb2IgcGF0dGVybiBvciByZWdleCBjcmVhdGVkIGJ5IFsubWFrZVJlXSgjbWFrZVJlKS5cbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbnBpY29tYXRjaC5tYXRjaEJhc2UgPSAoaW5wdXQsIGdsb2IsIG9wdGlvbnMsIHBvc2l4ID0gdXRpbHMuaXNXaW5kb3dzKG9wdGlvbnMpKSA9PiB7XG4gIGNvbnN0IHJlZ2V4ID0gZ2xvYiBpbnN0YW5jZW9mIFJlZ0V4cCA/IGdsb2IgOiBwaWNvbWF0Y2gubWFrZVJlKGdsb2IsIG9wdGlvbnMpO1xuICByZXR1cm4gcmVnZXgudGVzdChwYXRoLmJhc2VuYW1lKGlucHV0KSk7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiAqKmFueSoqIG9mIHRoZSBnaXZlbiBnbG9iIGBwYXR0ZXJuc2AgbWF0Y2ggdGhlIHNwZWNpZmllZCBgc3RyaW5nYC5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgcGljb21hdGNoID0gcmVxdWlyZSgncGljb21hdGNoJyk7XG4gKiAvLyBwaWNvbWF0Y2guaXNNYXRjaChzdHJpbmcsIHBhdHRlcm5zWywgb3B0aW9uc10pO1xuICpcbiAqIGNvbnNvbGUubG9nKHBpY29tYXRjaC5pc01hdGNoKCdhLmEnLCBbJ2IuKicsICcqLmEnXSkpOyAvLz0+IHRydWVcbiAqIGNvbnNvbGUubG9nKHBpY29tYXRjaC5pc01hdGNoKCdhLmEnLCAnYi4qJykpOyAvLz0+IGZhbHNlXG4gKiBgYGBcbiAqIEBwYXJhbSB7U3RyaW5nfEFycmF5fSBzdHIgVGhlIHN0cmluZyB0byB0ZXN0LlxuICogQHBhcmFtIHtTdHJpbmd8QXJyYXl9IHBhdHRlcm5zIE9uZSBvciBtb3JlIGdsb2IgcGF0dGVybnMgdG8gdXNlIGZvciBtYXRjaGluZy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gU2VlIGF2YWlsYWJsZSBbb3B0aW9uc10oI29wdGlvbnMpLlxuICogQHJldHVybiB7Qm9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIGFueSBwYXR0ZXJucyBtYXRjaCBgc3RyYFxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5waWNvbWF0Y2guaXNNYXRjaCA9IChzdHIsIHBhdHRlcm5zLCBvcHRpb25zKSA9PiBwaWNvbWF0Y2gocGF0dGVybnMsIG9wdGlvbnMpKHN0cik7XG5cbi8qKlxuICogUGFyc2UgYSBnbG9iIHBhdHRlcm4gdG8gY3JlYXRlIHRoZSBzb3VyY2Ugc3RyaW5nIGZvciBhIHJlZ3VsYXJcbiAqIGV4cHJlc3Npb24uXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHBpY29tYXRjaCA9IHJlcXVpcmUoJ3BpY29tYXRjaCcpO1xuICogY29uc3QgcmVzdWx0ID0gcGljb21hdGNoLnBhcnNlKHBhdHRlcm5bLCBvcHRpb25zXSk7XG4gKiBgYGBcbiAqIEBwYXJhbSB7U3RyaW5nfSBgcGF0dGVybmBcbiAqIEBwYXJhbSB7T2JqZWN0fSBgb3B0aW9uc2BcbiAqIEByZXR1cm4ge09iamVjdH0gUmV0dXJucyBhbiBvYmplY3Qgd2l0aCB1c2VmdWwgcHJvcGVydGllcyBhbmQgb3V0cHV0IHRvIGJlIHVzZWQgYXMgYSByZWdleCBzb3VyY2Ugc3RyaW5nLlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5waWNvbWF0Y2gucGFyc2UgPSAocGF0dGVybiwgb3B0aW9ucykgPT4ge1xuICBpZiAoQXJyYXkuaXNBcnJheShwYXR0ZXJuKSkgcmV0dXJuIHBhdHRlcm4ubWFwKHAgPT4gcGljb21hdGNoLnBhcnNlKHAsIG9wdGlvbnMpKTtcbiAgcmV0dXJuIHBhcnNlKHBhdHRlcm4sIHsgLi4ub3B0aW9ucywgZmFzdHBhdGhzOiBmYWxzZSB9KTtcbn07XG5cbi8qKlxuICogU2NhbiBhIGdsb2IgcGF0dGVybiB0byBzZXBhcmF0ZSB0aGUgcGF0dGVybiBpbnRvIHNlZ21lbnRzLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBwaWNvbWF0Y2ggPSByZXF1aXJlKCdwaWNvbWF0Y2gnKTtcbiAqIC8vIHBpY29tYXRjaC5zY2FuKGlucHV0Wywgb3B0aW9uc10pO1xuICpcbiAqIGNvbnN0IHJlc3VsdCA9IHBpY29tYXRjaC5zY2FuKCchLi9mb28vKi5qcycpO1xuICogY29uc29sZS5sb2cocmVzdWx0KTtcbiAqIHsgcHJlZml4OiAnIS4vJyxcbiAqICAgaW5wdXQ6ICchLi9mb28vKi5qcycsXG4gKiAgIHN0YXJ0OiAzLFxuICogICBiYXNlOiAnZm9vJyxcbiAqICAgZ2xvYjogJyouanMnLFxuICogICBpc0JyYWNlOiBmYWxzZSxcbiAqICAgaXNCcmFja2V0OiBmYWxzZSxcbiAqICAgaXNHbG9iOiB0cnVlLFxuICogICBpc0V4dGdsb2I6IGZhbHNlLFxuICogICBpc0dsb2JzdGFyOiBmYWxzZSxcbiAqICAgbmVnYXRlZDogdHJ1ZSB9XG4gKiBgYGBcbiAqIEBwYXJhbSB7U3RyaW5nfSBgaW5wdXRgIEdsb2IgcGF0dGVybiB0byBzY2FuLlxuICogQHBhcmFtIHtPYmplY3R9IGBvcHRpb25zYFxuICogQHJldHVybiB7T2JqZWN0fSBSZXR1cm5zIGFuIG9iamVjdCB3aXRoXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbnBpY29tYXRjaC5zY2FuID0gKGlucHV0LCBvcHRpb25zKSA9PiBzY2FuKGlucHV0LCBvcHRpb25zKTtcblxuLyoqXG4gKiBDb21waWxlIGEgcmVndWxhciBleHByZXNzaW9uIGZyb20gdGhlIGBzdGF0ZWAgb2JqZWN0IHJldHVybmVkIGJ5IHRoZVxuICogW3BhcnNlKCldKCNwYXJzZSkgbWV0aG9kLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBgc3RhdGVgXG4gKiBAcGFyYW0ge09iamVjdH0gYG9wdGlvbnNgXG4gKiBAcGFyYW0ge0Jvb2xlYW59IGByZXR1cm5PdXRwdXRgIEludGVuZGVkIGZvciBpbXBsZW1lbnRvcnMsIHRoaXMgYXJndW1lbnQgYWxsb3dzIHlvdSB0byByZXR1cm4gdGhlIHJhdyBvdXRwdXQgZnJvbSB0aGUgcGFyc2VyLlxuICogQHBhcmFtIHtCb29sZWFufSBgcmV0dXJuU3RhdGVgIEFkZHMgdGhlIHN0YXRlIHRvIGEgYHN0YXRlYCBwcm9wZXJ0eSBvbiB0aGUgcmV0dXJuZWQgcmVnZXguIFVzZWZ1bCBmb3IgaW1wbGVtZW50b3JzIGFuZCBkZWJ1Z2dpbmcuXG4gKiBAcmV0dXJuIHtSZWdFeHB9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbnBpY29tYXRjaC5jb21waWxlUmUgPSAoc3RhdGUsIG9wdGlvbnMsIHJldHVybk91dHB1dCA9IGZhbHNlLCByZXR1cm5TdGF0ZSA9IGZhbHNlKSA9PiB7XG4gIGlmIChyZXR1cm5PdXRwdXQgPT09IHRydWUpIHtcbiAgICByZXR1cm4gc3RhdGUub3V0cHV0O1xuICB9XG5cbiAgY29uc3Qgb3B0cyA9IG9wdGlvbnMgfHwge307XG4gIGNvbnN0IHByZXBlbmQgPSBvcHRzLmNvbnRhaW5zID8gJycgOiAnXic7XG4gIGNvbnN0IGFwcGVuZCA9IG9wdHMuY29udGFpbnMgPyAnJyA6ICckJztcblxuICBsZXQgc291cmNlID0gYCR7cHJlcGVuZH0oPzoke3N0YXRlLm91dHB1dH0pJHthcHBlbmR9YDtcbiAgaWYgKHN0YXRlICYmIHN0YXRlLm5lZ2F0ZWQgPT09IHRydWUpIHtcbiAgICBzb3VyY2UgPSBgXig/ISR7c291cmNlfSkuKiRgO1xuICB9XG5cbiAgY29uc3QgcmVnZXggPSBwaWNvbWF0Y2gudG9SZWdleChzb3VyY2UsIG9wdGlvbnMpO1xuICBpZiAocmV0dXJuU3RhdGUgPT09IHRydWUpIHtcbiAgICByZWdleC5zdGF0ZSA9IHN0YXRlO1xuICB9XG5cbiAgcmV0dXJuIHJlZ2V4O1xufTtcblxuLyoqXG4gKiBDcmVhdGUgYSByZWd1bGFyIGV4cHJlc3Npb24gZnJvbSBhIHBhcnNlZCBnbG9iIHBhdHRlcm4uXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHBpY29tYXRjaCA9IHJlcXVpcmUoJ3BpY29tYXRjaCcpO1xuICogY29uc3Qgc3RhdGUgPSBwaWNvbWF0Y2gucGFyc2UoJyouanMnKTtcbiAqIC8vIHBpY29tYXRjaC5jb21waWxlUmUoc3RhdGVbLCBvcHRpb25zXSk7XG4gKlxuICogY29uc29sZS5sb2cocGljb21hdGNoLmNvbXBpbGVSZShzdGF0ZSkpO1xuICogLy89PiAvXig/Oig/IVxcLikoPz0uKVteL10qP1xcLmpzKSQvXG4gKiBgYGBcbiAqIEBwYXJhbSB7U3RyaW5nfSBgc3RhdGVgIFRoZSBvYmplY3QgcmV0dXJuZWQgZnJvbSB0aGUgYC5wYXJzZWAgbWV0aG9kLlxuICogQHBhcmFtIHtPYmplY3R9IGBvcHRpb25zYFxuICogQHBhcmFtIHtCb29sZWFufSBgcmV0dXJuT3V0cHV0YCBJbXBsZW1lbnRvcnMgbWF5IHVzZSB0aGlzIGFyZ3VtZW50IHRvIHJldHVybiB0aGUgY29tcGlsZWQgb3V0cHV0LCBpbnN0ZWFkIG9mIGEgcmVndWxhciBleHByZXNzaW9uLiBUaGlzIGlzIG5vdCBleHBvc2VkIG9uIHRoZSBvcHRpb25zIHRvIHByZXZlbnQgZW5kLXVzZXJzIGZyb20gbXV0YXRpbmcgdGhlIHJlc3VsdC5cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gYHJldHVyblN0YXRlYCBJbXBsZW1lbnRvcnMgbWF5IHVzZSB0aGlzIGFyZ3VtZW50IHRvIHJldHVybiB0aGUgc3RhdGUgZnJvbSB0aGUgcGFyc2VkIGdsb2Igd2l0aCB0aGUgcmV0dXJuZWQgcmVndWxhciBleHByZXNzaW9uLlxuICogQHJldHVybiB7UmVnRXhwfSBSZXR1cm5zIGEgcmVnZXggY3JlYXRlZCBmcm9tIHRoZSBnaXZlbiBwYXR0ZXJuLlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5waWNvbWF0Y2gubWFrZVJlID0gKGlucHV0LCBvcHRpb25zID0ge30sIHJldHVybk91dHB1dCA9IGZhbHNlLCByZXR1cm5TdGF0ZSA9IGZhbHNlKSA9PiB7XG4gIGlmICghaW5wdXQgfHwgdHlwZW9mIGlucHV0ICE9PSAnc3RyaW5nJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdGVkIGEgbm9uLWVtcHR5IHN0cmluZycpO1xuICB9XG5cbiAgbGV0IHBhcnNlZCA9IHsgbmVnYXRlZDogZmFsc2UsIGZhc3RwYXRoczogdHJ1ZSB9O1xuXG4gIGlmIChvcHRpb25zLmZhc3RwYXRocyAhPT0gZmFsc2UgJiYgKGlucHV0WzBdID09PSAnLicgfHwgaW5wdXRbMF0gPT09ICcqJykpIHtcbiAgICBwYXJzZWQub3V0cHV0ID0gcGFyc2UuZmFzdHBhdGhzKGlucHV0LCBvcHRpb25zKTtcbiAgfVxuXG4gIGlmICghcGFyc2VkLm91dHB1dCkge1xuICAgIHBhcnNlZCA9IHBhcnNlKGlucHV0LCBvcHRpb25zKTtcbiAgfVxuXG4gIHJldHVybiBwaWNvbWF0Y2guY29tcGlsZVJlKHBhcnNlZCwgb3B0aW9ucywgcmV0dXJuT3V0cHV0LCByZXR1cm5TdGF0ZSk7XG59O1xuXG4vKipcbiAqIENyZWF0ZSBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBmcm9tIHRoZSBnaXZlbiByZWdleCBzb3VyY2Ugc3RyaW5nLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBwaWNvbWF0Y2ggPSByZXF1aXJlKCdwaWNvbWF0Y2gnKTtcbiAqIC8vIHBpY29tYXRjaC50b1JlZ2V4KHNvdXJjZVssIG9wdGlvbnNdKTtcbiAqXG4gKiBjb25zdCB7IG91dHB1dCB9ID0gcGljb21hdGNoLnBhcnNlKCcqLmpzJyk7XG4gKiBjb25zb2xlLmxvZyhwaWNvbWF0Y2gudG9SZWdleChvdXRwdXQpKTtcbiAqIC8vPT4gL14oPzooPyFcXC4pKD89LilbXi9dKj9cXC5qcykkL1xuICogYGBgXG4gKiBAcGFyYW0ge1N0cmluZ30gYHNvdXJjZWAgUmVndWxhciBleHByZXNzaW9uIHNvdXJjZSBzdHJpbmcuXG4gKiBAcGFyYW0ge09iamVjdH0gYG9wdGlvbnNgXG4gKiBAcmV0dXJuIHtSZWdFeHB9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbnBpY29tYXRjaC50b1JlZ2V4ID0gKHNvdXJjZSwgb3B0aW9ucykgPT4ge1xuICB0cnkge1xuICAgIGNvbnN0IG9wdHMgPSBvcHRpb25zIHx8IHt9O1xuICAgIHJldHVybiBuZXcgUmVnRXhwKHNvdXJjZSwgb3B0cy5mbGFncyB8fCAob3B0cy5ub2Nhc2UgPyAnaScgOiAnJykpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLmRlYnVnID09PSB0cnVlKSB0aHJvdyBlcnI7XG4gICAgcmV0dXJuIC8kXi87XG4gIH1cbn07XG5cbi8qKlxuICogUGljb21hdGNoIGNvbnN0YW50cy5cbiAqIEByZXR1cm4ge09iamVjdH1cbiAqL1xuXG5waWNvbWF0Y2guY29uc3RhbnRzID0gY29uc3RhbnRzO1xuXG4vKipcbiAqIEV4cG9zZSBcInBpY29tYXRjaFwiXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBwaWNvbWF0Y2g7XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vbGliL3BpY29tYXRjaCcpO1xuIiwgIid1c2Ugc3RyaWN0JztcblxuY29uc3QgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTtcbmNvbnN0IGJyYWNlcyA9IHJlcXVpcmUoJ2JyYWNlcycpO1xuY29uc3QgcGljb21hdGNoID0gcmVxdWlyZSgncGljb21hdGNoJyk7XG5jb25zdCB1dGlscyA9IHJlcXVpcmUoJ3BpY29tYXRjaC9saWIvdXRpbHMnKTtcbmNvbnN0IGlzRW1wdHlTdHJpbmcgPSB2YWwgPT4gdmFsID09PSAnJyB8fCB2YWwgPT09ICcuLyc7XG5cbi8qKlxuICogUmV0dXJucyBhbiBhcnJheSBvZiBzdHJpbmdzIHRoYXQgbWF0Y2ggb25lIG9yIG1vcmUgZ2xvYiBwYXR0ZXJucy5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgbW0gPSByZXF1aXJlKCdtaWNyb21hdGNoJyk7XG4gKiAvLyBtbShsaXN0LCBwYXR0ZXJuc1ssIG9wdGlvbnNdKTtcbiAqXG4gKiBjb25zb2xlLmxvZyhtbShbJ2EuanMnLCAnYS50eHQnXSwgWycqLmpzJ10pKTtcbiAqIC8vPT4gWyAnYS5qcycgXVxuICogYGBgXG4gKiBAcGFyYW0ge1N0cmluZ3xBcnJheTxzdHJpbmc+fSBgbGlzdGAgTGlzdCBvZiBzdHJpbmdzIHRvIG1hdGNoLlxuICogQHBhcmFtIHtTdHJpbmd8QXJyYXk8c3RyaW5nPn0gYHBhdHRlcm5zYCBPbmUgb3IgbW9yZSBnbG9iIHBhdHRlcm5zIHRvIHVzZSBmb3IgbWF0Y2hpbmcuXG4gKiBAcGFyYW0ge09iamVjdH0gYG9wdGlvbnNgIFNlZSBhdmFpbGFibGUgW29wdGlvbnNdKCNvcHRpb25zKVxuICogQHJldHVybiB7QXJyYXl9IFJldHVybnMgYW4gYXJyYXkgb2YgbWF0Y2hlc1xuICogQHN1bW1hcnkgZmFsc2VcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuY29uc3QgbWljcm9tYXRjaCA9IChsaXN0LCBwYXR0ZXJucywgb3B0aW9ucykgPT4ge1xuICBwYXR0ZXJucyA9IFtdLmNvbmNhdChwYXR0ZXJucyk7XG4gIGxpc3QgPSBbXS5jb25jYXQobGlzdCk7XG5cbiAgbGV0IG9taXQgPSBuZXcgU2V0KCk7XG4gIGxldCBrZWVwID0gbmV3IFNldCgpO1xuICBsZXQgaXRlbXMgPSBuZXcgU2V0KCk7XG4gIGxldCBuZWdhdGl2ZXMgPSAwO1xuXG4gIGxldCBvblJlc3VsdCA9IHN0YXRlID0+IHtcbiAgICBpdGVtcy5hZGQoc3RhdGUub3V0cHV0KTtcbiAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLm9uUmVzdWx0KSB7XG4gICAgICBvcHRpb25zLm9uUmVzdWx0KHN0YXRlKTtcbiAgICB9XG4gIH07XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXR0ZXJucy5sZW5ndGg7IGkrKykge1xuICAgIGxldCBpc01hdGNoID0gcGljb21hdGNoKFN0cmluZyhwYXR0ZXJuc1tpXSksIHsgLi4ub3B0aW9ucywgb25SZXN1bHQgfSwgdHJ1ZSk7XG4gICAgbGV0IG5lZ2F0ZWQgPSBpc01hdGNoLnN0YXRlLm5lZ2F0ZWQgfHwgaXNNYXRjaC5zdGF0ZS5uZWdhdGVkRXh0Z2xvYjtcbiAgICBpZiAobmVnYXRlZCkgbmVnYXRpdmVzKys7XG5cbiAgICBmb3IgKGxldCBpdGVtIG9mIGxpc3QpIHtcbiAgICAgIGxldCBtYXRjaGVkID0gaXNNYXRjaChpdGVtLCB0cnVlKTtcblxuICAgICAgbGV0IG1hdGNoID0gbmVnYXRlZCA/ICFtYXRjaGVkLmlzTWF0Y2ggOiBtYXRjaGVkLmlzTWF0Y2g7XG4gICAgICBpZiAoIW1hdGNoKSBjb250aW51ZTtcblxuICAgICAgaWYgKG5lZ2F0ZWQpIHtcbiAgICAgICAgb21pdC5hZGQobWF0Y2hlZC5vdXRwdXQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb21pdC5kZWxldGUobWF0Y2hlZC5vdXRwdXQpO1xuICAgICAgICBrZWVwLmFkZChtYXRjaGVkLm91dHB1dCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgbGV0IHJlc3VsdCA9IG5lZ2F0aXZlcyA9PT0gcGF0dGVybnMubGVuZ3RoID8gWy4uLml0ZW1zXSA6IFsuLi5rZWVwXTtcbiAgbGV0IG1hdGNoZXMgPSByZXN1bHQuZmlsdGVyKGl0ZW0gPT4gIW9taXQuaGFzKGl0ZW0pKTtcblxuICBpZiAob3B0aW9ucyAmJiBtYXRjaGVzLmxlbmd0aCA9PT0gMCkge1xuICAgIGlmIChvcHRpb25zLmZhaWxnbG9iID09PSB0cnVlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIG1hdGNoZXMgZm91bmQgZm9yIFwiJHtwYXR0ZXJucy5qb2luKCcsICcpfVwiYCk7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMubm9udWxsID09PSB0cnVlIHx8IG9wdGlvbnMubnVsbGdsb2IgPT09IHRydWUpIHtcbiAgICAgIHJldHVybiBvcHRpb25zLnVuZXNjYXBlID8gcGF0dGVybnMubWFwKHAgPT4gcC5yZXBsYWNlKC9cXFxcL2csICcnKSkgOiBwYXR0ZXJucztcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbWF0Y2hlcztcbn07XG5cbi8qKlxuICogQmFja3dhcmRzIGNvbXBhdGliaWxpdHlcbiAqL1xuXG5taWNyb21hdGNoLm1hdGNoID0gbWljcm9tYXRjaDtcblxuLyoqXG4gKiBSZXR1cm5zIGEgbWF0Y2hlciBmdW5jdGlvbiBmcm9tIHRoZSBnaXZlbiBnbG9iIGBwYXR0ZXJuYCBhbmQgYG9wdGlvbnNgLlxuICogVGhlIHJldHVybmVkIGZ1bmN0aW9uIHRha2VzIGEgc3RyaW5nIHRvIG1hdGNoIGFzIGl0cyBvbmx5IGFyZ3VtZW50IGFuZCByZXR1cm5zXG4gKiB0cnVlIGlmIHRoZSBzdHJpbmcgaXMgYSBtYXRjaC5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgbW0gPSByZXF1aXJlKCdtaWNyb21hdGNoJyk7XG4gKiAvLyBtbS5tYXRjaGVyKHBhdHRlcm5bLCBvcHRpb25zXSk7XG4gKlxuICogY29uc3QgaXNNYXRjaCA9IG1tLm1hdGNoZXIoJyouISgqYSknKTtcbiAqIGNvbnNvbGUubG9nKGlzTWF0Y2goJ2EuYScpKTsgLy89PiBmYWxzZVxuICogY29uc29sZS5sb2coaXNNYXRjaCgnYS5iJykpOyAvLz0+IHRydWVcbiAqIGBgYFxuICogQHBhcmFtIHtTdHJpbmd9IGBwYXR0ZXJuYCBHbG9iIHBhdHRlcm5cbiAqIEBwYXJhbSB7T2JqZWN0fSBgb3B0aW9uc2BcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBSZXR1cm5zIGEgbWF0Y2hlciBmdW5jdGlvbi5cbiAqIEBhcGkgcHVibGljXG4gKi9cblxubWljcm9tYXRjaC5tYXRjaGVyID0gKHBhdHRlcm4sIG9wdGlvbnMpID0+IHBpY29tYXRjaChwYXR0ZXJuLCBvcHRpb25zKTtcblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgKiphbnkqKiBvZiB0aGUgZ2l2ZW4gZ2xvYiBgcGF0dGVybnNgIG1hdGNoIHRoZSBzcGVjaWZpZWQgYHN0cmluZ2AuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IG1tID0gcmVxdWlyZSgnbWljcm9tYXRjaCcpO1xuICogLy8gbW0uaXNNYXRjaChzdHJpbmcsIHBhdHRlcm5zWywgb3B0aW9uc10pO1xuICpcbiAqIGNvbnNvbGUubG9nKG1tLmlzTWF0Y2goJ2EuYScsIFsnYi4qJywgJyouYSddKSk7IC8vPT4gdHJ1ZVxuICogY29uc29sZS5sb2cobW0uaXNNYXRjaCgnYS5hJywgJ2IuKicpKTsgLy89PiBmYWxzZVxuICogYGBgXG4gKiBAcGFyYW0ge1N0cmluZ30gYHN0cmAgVGhlIHN0cmluZyB0byB0ZXN0LlxuICogQHBhcmFtIHtTdHJpbmd8QXJyYXl9IGBwYXR0ZXJuc2AgT25lIG9yIG1vcmUgZ2xvYiBwYXR0ZXJucyB0byB1c2UgZm9yIG1hdGNoaW5nLlxuICogQHBhcmFtIHtPYmplY3R9IGBbb3B0aW9uc11gIFNlZSBhdmFpbGFibGUgW29wdGlvbnNdKCNvcHRpb25zKS5cbiAqIEByZXR1cm4ge0Jvb2xlYW59IFJldHVybnMgdHJ1ZSBpZiBhbnkgcGF0dGVybnMgbWF0Y2ggYHN0cmBcbiAqIEBhcGkgcHVibGljXG4gKi9cblxubWljcm9tYXRjaC5pc01hdGNoID0gKHN0ciwgcGF0dGVybnMsIG9wdGlvbnMpID0+IHBpY29tYXRjaChwYXR0ZXJucywgb3B0aW9ucykoc3RyKTtcblxuLyoqXG4gKiBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuICovXG5cbm1pY3JvbWF0Y2guYW55ID0gbWljcm9tYXRjaC5pc01hdGNoO1xuXG4vKipcbiAqIFJldHVybnMgYSBsaXN0IG9mIHN0cmluZ3MgdGhhdCBfKipkbyBub3QgbWF0Y2ggYW55KipfIG9mIHRoZSBnaXZlbiBgcGF0dGVybnNgLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBtbSA9IHJlcXVpcmUoJ21pY3JvbWF0Y2gnKTtcbiAqIC8vIG1tLm5vdChsaXN0LCBwYXR0ZXJuc1ssIG9wdGlvbnNdKTtcbiAqXG4gKiBjb25zb2xlLmxvZyhtbS5ub3QoWydhLmEnLCAnYi5iJywgJ2MuYyddLCAnKi5hJykpO1xuICogLy89PiBbJ2IuYicsICdjLmMnXVxuICogYGBgXG4gKiBAcGFyYW0ge0FycmF5fSBgbGlzdGAgQXJyYXkgb2Ygc3RyaW5ncyB0byBtYXRjaC5cbiAqIEBwYXJhbSB7U3RyaW5nfEFycmF5fSBgcGF0dGVybnNgIE9uZSBvciBtb3JlIGdsb2IgcGF0dGVybiB0byB1c2UgZm9yIG1hdGNoaW5nLlxuICogQHBhcmFtIHtPYmplY3R9IGBvcHRpb25zYCBTZWUgYXZhaWxhYmxlIFtvcHRpb25zXSgjb3B0aW9ucykgZm9yIGNoYW5naW5nIGhvdyBtYXRjaGVzIGFyZSBwZXJmb3JtZWRcbiAqIEByZXR1cm4ge0FycmF5fSBSZXR1cm5zIGFuIGFycmF5IG9mIHN0cmluZ3MgdGhhdCAqKmRvIG5vdCBtYXRjaCoqIHRoZSBnaXZlbiBwYXR0ZXJucy5cbiAqIEBhcGkgcHVibGljXG4gKi9cblxubWljcm9tYXRjaC5ub3QgPSAobGlzdCwgcGF0dGVybnMsIG9wdGlvbnMgPSB7fSkgPT4ge1xuICBwYXR0ZXJucyA9IFtdLmNvbmNhdChwYXR0ZXJucykubWFwKFN0cmluZyk7XG4gIGxldCByZXN1bHQgPSBuZXcgU2V0KCk7XG4gIGxldCBpdGVtcyA9IFtdO1xuXG4gIGxldCBvblJlc3VsdCA9IHN0YXRlID0+IHtcbiAgICBpZiAob3B0aW9ucy5vblJlc3VsdCkgb3B0aW9ucy5vblJlc3VsdChzdGF0ZSk7XG4gICAgaXRlbXMucHVzaChzdGF0ZS5vdXRwdXQpO1xuICB9O1xuXG4gIGxldCBtYXRjaGVzID0gbmV3IFNldChtaWNyb21hdGNoKGxpc3QsIHBhdHRlcm5zLCB7IC4uLm9wdGlvbnMsIG9uUmVzdWx0IH0pKTtcblxuICBmb3IgKGxldCBpdGVtIG9mIGl0ZW1zKSB7XG4gICAgaWYgKCFtYXRjaGVzLmhhcyhpdGVtKSkge1xuICAgICAgcmVzdWx0LmFkZChpdGVtKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIFsuLi5yZXN1bHRdO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIGBzdHJpbmdgIGNvbnRhaW5zIHRoZSBnaXZlbiBwYXR0ZXJuLiBTaW1pbGFyXG4gKiB0byBbLmlzTWF0Y2hdKCNpc01hdGNoKSBidXQgdGhlIHBhdHRlcm4gY2FuIG1hdGNoIGFueSBwYXJ0IG9mIHRoZSBzdHJpbmcuXG4gKlxuICogYGBganNcbiAqIHZhciBtbSA9IHJlcXVpcmUoJ21pY3JvbWF0Y2gnKTtcbiAqIC8vIG1tLmNvbnRhaW5zKHN0cmluZywgcGF0dGVyblssIG9wdGlvbnNdKTtcbiAqXG4gKiBjb25zb2xlLmxvZyhtbS5jb250YWlucygnYWEvYmIvY2MnLCAnKmInKSk7XG4gKiAvLz0+IHRydWVcbiAqIGNvbnNvbGUubG9nKG1tLmNvbnRhaW5zKCdhYS9iYi9jYycsICcqZCcpKTtcbiAqIC8vPT4gZmFsc2VcbiAqIGBgYFxuICogQHBhcmFtIHtTdHJpbmd9IGBzdHJgIFRoZSBzdHJpbmcgdG8gbWF0Y2guXG4gKiBAcGFyYW0ge1N0cmluZ3xBcnJheX0gYHBhdHRlcm5zYCBHbG9iIHBhdHRlcm4gdG8gdXNlIGZvciBtYXRjaGluZy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBgb3B0aW9uc2AgU2VlIGF2YWlsYWJsZSBbb3B0aW9uc10oI29wdGlvbnMpIGZvciBjaGFuZ2luZyBob3cgbWF0Y2hlcyBhcmUgcGVyZm9ybWVkXG4gKiBAcmV0dXJuIHtCb29sZWFufSBSZXR1cm5zIHRydWUgaWYgYW55IG9mIHRoZSBwYXR0ZXJucyBtYXRjaGVzIGFueSBwYXJ0IG9mIGBzdHJgLlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5taWNyb21hdGNoLmNvbnRhaW5zID0gKHN0ciwgcGF0dGVybiwgb3B0aW9ucykgPT4ge1xuICBpZiAodHlwZW9mIHN0ciAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBFeHBlY3RlZCBhIHN0cmluZzogXCIke3V0aWwuaW5zcGVjdChzdHIpfVwiYCk7XG4gIH1cblxuICBpZiAoQXJyYXkuaXNBcnJheShwYXR0ZXJuKSkge1xuICAgIHJldHVybiBwYXR0ZXJuLnNvbWUocCA9PiBtaWNyb21hdGNoLmNvbnRhaW5zKHN0ciwgcCwgb3B0aW9ucykpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBwYXR0ZXJuID09PSAnc3RyaW5nJykge1xuICAgIGlmIChpc0VtcHR5U3RyaW5nKHN0cikgfHwgaXNFbXB0eVN0cmluZyhwYXR0ZXJuKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChzdHIuaW5jbHVkZXMocGF0dGVybikgfHwgKHN0ci5zdGFydHNXaXRoKCcuLycpICYmIHN0ci5zbGljZSgyKS5pbmNsdWRlcyhwYXR0ZXJuKSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBtaWNyb21hdGNoLmlzTWF0Y2goc3RyLCBwYXR0ZXJuLCB7IC4uLm9wdGlvbnMsIGNvbnRhaW5zOiB0cnVlIH0pO1xufTtcblxuLyoqXG4gKiBGaWx0ZXIgdGhlIGtleXMgb2YgdGhlIGdpdmVuIG9iamVjdCB3aXRoIHRoZSBnaXZlbiBgZ2xvYmAgcGF0dGVyblxuICogYW5kIGBvcHRpb25zYC4gRG9lcyBub3QgYXR0ZW1wdCB0byBtYXRjaCBuZXN0ZWQga2V5cy4gSWYgeW91IG5lZWQgdGhpcyBmZWF0dXJlLFxuICogdXNlIFtnbG9iLW9iamVjdF1bXSBpbnN0ZWFkLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBtbSA9IHJlcXVpcmUoJ21pY3JvbWF0Y2gnKTtcbiAqIC8vIG1tLm1hdGNoS2V5cyhvYmplY3QsIHBhdHRlcm5zWywgb3B0aW9uc10pO1xuICpcbiAqIGNvbnN0IG9iaiA9IHsgYWE6ICdhJywgYWI6ICdiJywgYWM6ICdjJyB9O1xuICogY29uc29sZS5sb2cobW0ubWF0Y2hLZXlzKG9iaiwgJypiJykpO1xuICogLy89PiB7IGFiOiAnYicgfVxuICogYGBgXG4gKiBAcGFyYW0ge09iamVjdH0gYG9iamVjdGAgVGhlIG9iamVjdCB3aXRoIGtleXMgdG8gZmlsdGVyLlxuICogQHBhcmFtIHtTdHJpbmd8QXJyYXl9IGBwYXR0ZXJuc2AgT25lIG9yIG1vcmUgZ2xvYiBwYXR0ZXJucyB0byB1c2UgZm9yIG1hdGNoaW5nLlxuICogQHBhcmFtIHtPYmplY3R9IGBvcHRpb25zYCBTZWUgYXZhaWxhYmxlIFtvcHRpb25zXSgjb3B0aW9ucykgZm9yIGNoYW5naW5nIGhvdyBtYXRjaGVzIGFyZSBwZXJmb3JtZWRcbiAqIEByZXR1cm4ge09iamVjdH0gUmV0dXJucyBhbiBvYmplY3Qgd2l0aCBvbmx5IGtleXMgdGhhdCBtYXRjaCB0aGUgZ2l2ZW4gcGF0dGVybnMuXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbm1pY3JvbWF0Y2gubWF0Y2hLZXlzID0gKG9iaiwgcGF0dGVybnMsIG9wdGlvbnMpID0+IHtcbiAgaWYgKCF1dGlscy5pc09iamVjdChvYmopKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgdGhlIGZpcnN0IGFyZ3VtZW50IHRvIGJlIGFuIG9iamVjdCcpO1xuICB9XG4gIGxldCBrZXlzID0gbWljcm9tYXRjaChPYmplY3Qua2V5cyhvYmopLCBwYXR0ZXJucywgb3B0aW9ucyk7XG4gIGxldCByZXMgPSB7fTtcbiAgZm9yIChsZXQga2V5IG9mIGtleXMpIHJlc1trZXldID0gb2JqW2tleV07XG4gIHJldHVybiByZXM7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiBzb21lIG9mIHRoZSBzdHJpbmdzIGluIHRoZSBnaXZlbiBgbGlzdGAgbWF0Y2ggYW55IG9mIHRoZSBnaXZlbiBnbG9iIGBwYXR0ZXJuc2AuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IG1tID0gcmVxdWlyZSgnbWljcm9tYXRjaCcpO1xuICogLy8gbW0uc29tZShsaXN0LCBwYXR0ZXJuc1ssIG9wdGlvbnNdKTtcbiAqXG4gKiBjb25zb2xlLmxvZyhtbS5zb21lKFsnZm9vLmpzJywgJ2Jhci5qcyddLCBbJyouanMnLCAnIWZvby5qcyddKSk7XG4gKiAvLyB0cnVlXG4gKiBjb25zb2xlLmxvZyhtbS5zb21lKFsnZm9vLmpzJ10sIFsnKi5qcycsICchZm9vLmpzJ10pKTtcbiAqIC8vIGZhbHNlXG4gKiBgYGBcbiAqIEBwYXJhbSB7U3RyaW5nfEFycmF5fSBgbGlzdGAgVGhlIHN0cmluZyBvciBhcnJheSBvZiBzdHJpbmdzIHRvIHRlc3QuIFJldHVybnMgYXMgc29vbiBhcyB0aGUgZmlyc3QgbWF0Y2ggaXMgZm91bmQuXG4gKiBAcGFyYW0ge1N0cmluZ3xBcnJheX0gYHBhdHRlcm5zYCBPbmUgb3IgbW9yZSBnbG9iIHBhdHRlcm5zIHRvIHVzZSBmb3IgbWF0Y2hpbmcuXG4gKiBAcGFyYW0ge09iamVjdH0gYG9wdGlvbnNgIFNlZSBhdmFpbGFibGUgW29wdGlvbnNdKCNvcHRpb25zKSBmb3IgY2hhbmdpbmcgaG93IG1hdGNoZXMgYXJlIHBlcmZvcm1lZFxuICogQHJldHVybiB7Qm9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIGFueSBgcGF0dGVybnNgIG1hdGNoZXMgYW55IG9mIHRoZSBzdHJpbmdzIGluIGBsaXN0YFxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5taWNyb21hdGNoLnNvbWUgPSAobGlzdCwgcGF0dGVybnMsIG9wdGlvbnMpID0+IHtcbiAgbGV0IGl0ZW1zID0gW10uY29uY2F0KGxpc3QpO1xuXG4gIGZvciAobGV0IHBhdHRlcm4gb2YgW10uY29uY2F0KHBhdHRlcm5zKSkge1xuICAgIGxldCBpc01hdGNoID0gcGljb21hdGNoKFN0cmluZyhwYXR0ZXJuKSwgb3B0aW9ucyk7XG4gICAgaWYgKGl0ZW1zLnNvbWUoaXRlbSA9PiBpc01hdGNoKGl0ZW0pKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn07XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIGV2ZXJ5IHN0cmluZyBpbiB0aGUgZ2l2ZW4gYGxpc3RgIG1hdGNoZXNcbiAqIGFueSBvZiB0aGUgZ2l2ZW4gZ2xvYiBgcGF0dGVybnNgLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBtbSA9IHJlcXVpcmUoJ21pY3JvbWF0Y2gnKTtcbiAqIC8vIG1tLmV2ZXJ5KGxpc3QsIHBhdHRlcm5zWywgb3B0aW9uc10pO1xuICpcbiAqIGNvbnNvbGUubG9nKG1tLmV2ZXJ5KCdmb28uanMnLCBbJ2Zvby5qcyddKSk7XG4gKiAvLyB0cnVlXG4gKiBjb25zb2xlLmxvZyhtbS5ldmVyeShbJ2Zvby5qcycsICdiYXIuanMnXSwgWycqLmpzJ10pKTtcbiAqIC8vIHRydWVcbiAqIGNvbnNvbGUubG9nKG1tLmV2ZXJ5KFsnZm9vLmpzJywgJ2Jhci5qcyddLCBbJyouanMnLCAnIWZvby5qcyddKSk7XG4gKiAvLyBmYWxzZVxuICogY29uc29sZS5sb2cobW0uZXZlcnkoWydmb28uanMnXSwgWycqLmpzJywgJyFmb28uanMnXSkpO1xuICogLy8gZmFsc2VcbiAqIGBgYFxuICogQHBhcmFtIHtTdHJpbmd8QXJyYXl9IGBsaXN0YCBUaGUgc3RyaW5nIG9yIGFycmF5IG9mIHN0cmluZ3MgdG8gdGVzdC5cbiAqIEBwYXJhbSB7U3RyaW5nfEFycmF5fSBgcGF0dGVybnNgIE9uZSBvciBtb3JlIGdsb2IgcGF0dGVybnMgdG8gdXNlIGZvciBtYXRjaGluZy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBgb3B0aW9uc2AgU2VlIGF2YWlsYWJsZSBbb3B0aW9uc10oI29wdGlvbnMpIGZvciBjaGFuZ2luZyBob3cgbWF0Y2hlcyBhcmUgcGVyZm9ybWVkXG4gKiBAcmV0dXJuIHtCb29sZWFufSBSZXR1cm5zIHRydWUgaWYgYWxsIGBwYXR0ZXJuc2AgbWF0Y2hlcyBhbGwgb2YgdGhlIHN0cmluZ3MgaW4gYGxpc3RgXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbm1pY3JvbWF0Y2guZXZlcnkgPSAobGlzdCwgcGF0dGVybnMsIG9wdGlvbnMpID0+IHtcbiAgbGV0IGl0ZW1zID0gW10uY29uY2F0KGxpc3QpO1xuXG4gIGZvciAobGV0IHBhdHRlcm4gb2YgW10uY29uY2F0KHBhdHRlcm5zKSkge1xuICAgIGxldCBpc01hdGNoID0gcGljb21hdGNoKFN0cmluZyhwYXR0ZXJuKSwgb3B0aW9ucyk7XG4gICAgaWYgKCFpdGVtcy5ldmVyeShpdGVtID0+IGlzTWF0Y2goaXRlbSkpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgKiphbGwqKiBvZiB0aGUgZ2l2ZW4gYHBhdHRlcm5zYCBtYXRjaFxuICogdGhlIHNwZWNpZmllZCBzdHJpbmcuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IG1tID0gcmVxdWlyZSgnbWljcm9tYXRjaCcpO1xuICogLy8gbW0uYWxsKHN0cmluZywgcGF0dGVybnNbLCBvcHRpb25zXSk7XG4gKlxuICogY29uc29sZS5sb2cobW0uYWxsKCdmb28uanMnLCBbJ2Zvby5qcyddKSk7XG4gKiAvLyB0cnVlXG4gKlxuICogY29uc29sZS5sb2cobW0uYWxsKCdmb28uanMnLCBbJyouanMnLCAnIWZvby5qcyddKSk7XG4gKiAvLyBmYWxzZVxuICpcbiAqIGNvbnNvbGUubG9nKG1tLmFsbCgnZm9vLmpzJywgWycqLmpzJywgJ2Zvby5qcyddKSk7XG4gKiAvLyB0cnVlXG4gKlxuICogY29uc29sZS5sb2cobW0uYWxsKCdmb28uanMnLCBbJyouanMnLCAnZionLCAnKm8qJywgJypvLmpzJ10pKTtcbiAqIC8vIHRydWVcbiAqIGBgYFxuICogQHBhcmFtIHtTdHJpbmd8QXJyYXl9IGBzdHJgIFRoZSBzdHJpbmcgdG8gdGVzdC5cbiAqIEBwYXJhbSB7U3RyaW5nfEFycmF5fSBgcGF0dGVybnNgIE9uZSBvciBtb3JlIGdsb2IgcGF0dGVybnMgdG8gdXNlIGZvciBtYXRjaGluZy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBgb3B0aW9uc2AgU2VlIGF2YWlsYWJsZSBbb3B0aW9uc10oI29wdGlvbnMpIGZvciBjaGFuZ2luZyBob3cgbWF0Y2hlcyBhcmUgcGVyZm9ybWVkXG4gKiBAcmV0dXJuIHtCb29sZWFufSBSZXR1cm5zIHRydWUgaWYgYW55IHBhdHRlcm5zIG1hdGNoIGBzdHJgXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbm1pY3JvbWF0Y2guYWxsID0gKHN0ciwgcGF0dGVybnMsIG9wdGlvbnMpID0+IHtcbiAgaWYgKHR5cGVvZiBzdHIgIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgRXhwZWN0ZWQgYSBzdHJpbmc6IFwiJHt1dGlsLmluc3BlY3Qoc3RyKX1cImApO1xuICB9XG5cbiAgcmV0dXJuIFtdLmNvbmNhdChwYXR0ZXJucykuZXZlcnkocCA9PiBwaWNvbWF0Y2gocCwgb3B0aW9ucykoc3RyKSk7XG59O1xuXG4vKipcbiAqIFJldHVybnMgYW4gYXJyYXkgb2YgbWF0Y2hlcyBjYXB0dXJlZCBieSBgcGF0dGVybmAgaW4gYHN0cmluZywgb3IgYG51bGxgIGlmIHRoZSBwYXR0ZXJuIGRpZCBub3QgbWF0Y2guXG4gKlxuICogYGBganNcbiAqIGNvbnN0IG1tID0gcmVxdWlyZSgnbWljcm9tYXRjaCcpO1xuICogLy8gbW0uY2FwdHVyZShwYXR0ZXJuLCBzdHJpbmdbLCBvcHRpb25zXSk7XG4gKlxuICogY29uc29sZS5sb2cobW0uY2FwdHVyZSgndGVzdC8qLmpzJywgJ3Rlc3QvZm9vLmpzJykpO1xuICogLy89PiBbJ2ZvbyddXG4gKiBjb25zb2xlLmxvZyhtbS5jYXB0dXJlKCd0ZXN0LyouanMnLCAnZm9vL2Jhci5jc3MnKSk7XG4gKiAvLz0+IG51bGxcbiAqIGBgYFxuICogQHBhcmFtIHtTdHJpbmd9IGBnbG9iYCBHbG9iIHBhdHRlcm4gdG8gdXNlIGZvciBtYXRjaGluZy5cbiAqIEBwYXJhbSB7U3RyaW5nfSBgaW5wdXRgIFN0cmluZyB0byBtYXRjaFxuICogQHBhcmFtIHtPYmplY3R9IGBvcHRpb25zYCBTZWUgYXZhaWxhYmxlIFtvcHRpb25zXSgjb3B0aW9ucykgZm9yIGNoYW5naW5nIGhvdyBtYXRjaGVzIGFyZSBwZXJmb3JtZWRcbiAqIEByZXR1cm4ge0FycmF5fG51bGx9IFJldHVybnMgYW4gYXJyYXkgb2YgY2FwdHVyZXMgaWYgdGhlIGlucHV0IG1hdGNoZXMgdGhlIGdsb2IgcGF0dGVybiwgb3RoZXJ3aXNlIGBudWxsYC5cbiAqIEBhcGkgcHVibGljXG4gKi9cblxubWljcm9tYXRjaC5jYXB0dXJlID0gKGdsb2IsIGlucHV0LCBvcHRpb25zKSA9PiB7XG4gIGxldCBwb3NpeCA9IHV0aWxzLmlzV2luZG93cyhvcHRpb25zKTtcbiAgbGV0IHJlZ2V4ID0gcGljb21hdGNoLm1ha2VSZShTdHJpbmcoZ2xvYiksIHsgLi4ub3B0aW9ucywgY2FwdHVyZTogdHJ1ZSB9KTtcbiAgbGV0IG1hdGNoID0gcmVnZXguZXhlYyhwb3NpeCA/IHV0aWxzLnRvUG9zaXhTbGFzaGVzKGlucHV0KSA6IGlucHV0KTtcblxuICBpZiAobWF0Y2gpIHtcbiAgICByZXR1cm4gbWF0Y2guc2xpY2UoMSkubWFwKHYgPT4gdiA9PT0gdm9pZCAwID8gJycgOiB2KTtcbiAgfVxufTtcblxuLyoqXG4gKiBDcmVhdGUgYSByZWd1bGFyIGV4cHJlc3Npb24gZnJvbSB0aGUgZ2l2ZW4gZ2xvYiBgcGF0dGVybmAuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IG1tID0gcmVxdWlyZSgnbWljcm9tYXRjaCcpO1xuICogLy8gbW0ubWFrZVJlKHBhdHRlcm5bLCBvcHRpb25zXSk7XG4gKlxuICogY29uc29sZS5sb2cobW0ubWFrZVJlKCcqLmpzJykpO1xuICogLy89PiAvXig/OihcXC5bXFxcXFxcL10pPyg/IVxcLikoPz0uKVteXFwvXSo/XFwuanMpJC9cbiAqIGBgYFxuICogQHBhcmFtIHtTdHJpbmd9IGBwYXR0ZXJuYCBBIGdsb2IgcGF0dGVybiB0byBjb252ZXJ0IHRvIHJlZ2V4LlxuICogQHBhcmFtIHtPYmplY3R9IGBvcHRpb25zYFxuICogQHJldHVybiB7UmVnRXhwfSBSZXR1cm5zIGEgcmVnZXggY3JlYXRlZCBmcm9tIHRoZSBnaXZlbiBwYXR0ZXJuLlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5taWNyb21hdGNoLm1ha2VSZSA9ICguLi5hcmdzKSA9PiBwaWNvbWF0Y2gubWFrZVJlKC4uLmFyZ3MpO1xuXG4vKipcbiAqIFNjYW4gYSBnbG9iIHBhdHRlcm4gdG8gc2VwYXJhdGUgdGhlIHBhdHRlcm4gaW50byBzZWdtZW50cy4gVXNlZFxuICogYnkgdGhlIFtzcGxpdF0oI3NwbGl0KSBtZXRob2QuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IG1tID0gcmVxdWlyZSgnbWljcm9tYXRjaCcpO1xuICogY29uc3Qgc3RhdGUgPSBtbS5zY2FuKHBhdHRlcm5bLCBvcHRpb25zXSk7XG4gKiBgYGBcbiAqIEBwYXJhbSB7U3RyaW5nfSBgcGF0dGVybmBcbiAqIEBwYXJhbSB7T2JqZWN0fSBgb3B0aW9uc2BcbiAqIEByZXR1cm4ge09iamVjdH0gUmV0dXJucyBhbiBvYmplY3Qgd2l0aFxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5taWNyb21hdGNoLnNjYW4gPSAoLi4uYXJncykgPT4gcGljb21hdGNoLnNjYW4oLi4uYXJncyk7XG5cbi8qKlxuICogUGFyc2UgYSBnbG9iIHBhdHRlcm4gdG8gY3JlYXRlIHRoZSBzb3VyY2Ugc3RyaW5nIGZvciBhIHJlZ3VsYXJcbiAqIGV4cHJlc3Npb24uXG4gKlxuICogYGBganNcbiAqIGNvbnN0IG1tID0gcmVxdWlyZSgnbWljcm9tYXRjaCcpO1xuICogY29uc3Qgc3RhdGUgPSBtbS5wYXJzZShwYXR0ZXJuWywgb3B0aW9uc10pO1xuICogYGBgXG4gKiBAcGFyYW0ge1N0cmluZ30gYGdsb2JgXG4gKiBAcGFyYW0ge09iamVjdH0gYG9wdGlvbnNgXG4gKiBAcmV0dXJuIHtPYmplY3R9IFJldHVybnMgYW4gb2JqZWN0IHdpdGggdXNlZnVsIHByb3BlcnRpZXMgYW5kIG91dHB1dCB0byBiZSB1c2VkIGFzIHJlZ2V4IHNvdXJjZSBzdHJpbmcuXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbm1pY3JvbWF0Y2gucGFyc2UgPSAocGF0dGVybnMsIG9wdGlvbnMpID0+IHtcbiAgbGV0IHJlcyA9IFtdO1xuICBmb3IgKGxldCBwYXR0ZXJuIG9mIFtdLmNvbmNhdChwYXR0ZXJucyB8fCBbXSkpIHtcbiAgICBmb3IgKGxldCBzdHIgb2YgYnJhY2VzKFN0cmluZyhwYXR0ZXJuKSwgb3B0aW9ucykpIHtcbiAgICAgIHJlcy5wdXNoKHBpY29tYXRjaC5wYXJzZShzdHIsIG9wdGlvbnMpKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlcztcbn07XG5cbi8qKlxuICogUHJvY2VzcyB0aGUgZ2l2ZW4gYnJhY2UgYHBhdHRlcm5gLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB7IGJyYWNlcyB9ID0gcmVxdWlyZSgnbWljcm9tYXRjaCcpO1xuICogY29uc29sZS5sb2coYnJhY2VzKCdmb28ve2EsYixjfS9iYXInKSk7XG4gKiAvLz0+IFsgJ2Zvby8oYXxifGMpL2JhcicgXVxuICpcbiAqIGNvbnNvbGUubG9nKGJyYWNlcygnZm9vL3thLGIsY30vYmFyJywgeyBleHBhbmQ6IHRydWUgfSkpO1xuICogLy89PiBbICdmb28vYS9iYXInLCAnZm9vL2IvYmFyJywgJ2Zvby9jL2JhcicgXVxuICogYGBgXG4gKiBAcGFyYW0ge1N0cmluZ30gYHBhdHRlcm5gIFN0cmluZyB3aXRoIGJyYWNlIHBhdHRlcm4gdG8gcHJvY2Vzcy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBgb3B0aW9uc2AgQW55IFtvcHRpb25zXSgjb3B0aW9ucykgdG8gY2hhbmdlIGhvdyBleHBhbnNpb24gaXMgcGVyZm9ybWVkLiBTZWUgdGhlIFticmFjZXNdW10gbGlicmFyeSBmb3IgYWxsIGF2YWlsYWJsZSBvcHRpb25zLlxuICogQHJldHVybiB7QXJyYXl9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbm1pY3JvbWF0Y2guYnJhY2VzID0gKHBhdHRlcm4sIG9wdGlvbnMpID0+IHtcbiAgaWYgKHR5cGVvZiBwYXR0ZXJuICE9PSAnc3RyaW5nJykgdGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgYSBzdHJpbmcnKTtcbiAgaWYgKChvcHRpb25zICYmIG9wdGlvbnMubm9icmFjZSA9PT0gdHJ1ZSkgfHwgIS9cXHsuKlxcfS8udGVzdChwYXR0ZXJuKSkge1xuICAgIHJldHVybiBbcGF0dGVybl07XG4gIH1cbiAgcmV0dXJuIGJyYWNlcyhwYXR0ZXJuLCBvcHRpb25zKTtcbn07XG5cbi8qKlxuICogRXhwYW5kIGJyYWNlc1xuICovXG5cbm1pY3JvbWF0Y2guYnJhY2VFeHBhbmQgPSAocGF0dGVybiwgb3B0aW9ucykgPT4ge1xuICBpZiAodHlwZW9mIHBhdHRlcm4gIT09ICdzdHJpbmcnKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBhIHN0cmluZycpO1xuICByZXR1cm4gbWljcm9tYXRjaC5icmFjZXMocGF0dGVybiwgeyAuLi5vcHRpb25zLCBleHBhbmQ6IHRydWUgfSk7XG59O1xuXG4vKipcbiAqIEV4cG9zZSBtaWNyb21hdGNoXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBtaWNyb21hdGNoO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5yZW1vdmVEdXBsaWNhdGVTbGFzaGVzID0gZXhwb3J0cy5tYXRjaEFueSA9IGV4cG9ydHMuY29udmVydFBhdHRlcm5zVG9SZSA9IGV4cG9ydHMubWFrZVJlID0gZXhwb3J0cy5nZXRQYXR0ZXJuUGFydHMgPSBleHBvcnRzLmV4cGFuZEJyYWNlRXhwYW5zaW9uID0gZXhwb3J0cy5leHBhbmRQYXR0ZXJuc1dpdGhCcmFjZUV4cGFuc2lvbiA9IGV4cG9ydHMuaXNBZmZlY3REZXB0aE9mUmVhZGluZ1BhdHRlcm4gPSBleHBvcnRzLmVuZHNXaXRoU2xhc2hHbG9iU3RhciA9IGV4cG9ydHMuaGFzR2xvYlN0YXIgPSBleHBvcnRzLmdldEJhc2VEaXJlY3RvcnkgPSBleHBvcnRzLmlzUGF0dGVyblJlbGF0ZWRUb1BhcmVudERpcmVjdG9yeSA9IGV4cG9ydHMuZ2V0UGF0dGVybnNPdXRzaWRlQ3VycmVudERpcmVjdG9yeSA9IGV4cG9ydHMuZ2V0UGF0dGVybnNJbnNpZGVDdXJyZW50RGlyZWN0b3J5ID0gZXhwb3J0cy5nZXRQb3NpdGl2ZVBhdHRlcm5zID0gZXhwb3J0cy5nZXROZWdhdGl2ZVBhdHRlcm5zID0gZXhwb3J0cy5pc1Bvc2l0aXZlUGF0dGVybiA9IGV4cG9ydHMuaXNOZWdhdGl2ZVBhdHRlcm4gPSBleHBvcnRzLmNvbnZlcnRUb05lZ2F0aXZlUGF0dGVybiA9IGV4cG9ydHMuY29udmVydFRvUG9zaXRpdmVQYXR0ZXJuID0gZXhwb3J0cy5pc0R5bmFtaWNQYXR0ZXJuID0gZXhwb3J0cy5pc1N0YXRpY1BhdHRlcm4gPSB2b2lkIDA7XG5jb25zdCBwYXRoID0gcmVxdWlyZShcInBhdGhcIik7XG5jb25zdCBnbG9iUGFyZW50ID0gcmVxdWlyZShcImdsb2ItcGFyZW50XCIpO1xuY29uc3QgbWljcm9tYXRjaCA9IHJlcXVpcmUoXCJtaWNyb21hdGNoXCIpO1xuY29uc3QgR0xPQlNUQVIgPSAnKionO1xuY29uc3QgRVNDQVBFX1NZTUJPTCA9ICdcXFxcJztcbmNvbnN0IENPTU1PTl9HTE9CX1NZTUJPTFNfUkUgPSAvWyo/XXxeIS87XG5jb25zdCBSRUdFWF9DSEFSQUNURVJfQ0xBU1NfU1lNQk9MU19SRSA9IC9cXFtbXltdKl0vO1xuY29uc3QgUkVHRVhfR1JPVVBfU1lNQk9MU19SRSA9IC8oPzpefFteISorP0BdKVxcKFteKF0qXFx8W158XSpcXCkvO1xuY29uc3QgR0xPQl9FWFRFTlNJT05fU1lNQk9MU19SRSA9IC9bISorP0BdXFwoW14oXSpcXCkvO1xuY29uc3QgQlJBQ0VfRVhQQU5TSU9OX1NFUEFSQVRPUlNfUkUgPSAvLHxcXC5cXC4vO1xuLyoqXG4gKiBNYXRjaGVzIGEgc2VxdWVuY2Ugb2YgdHdvIG9yIG1vcmUgY29uc2VjdXRpdmUgc2xhc2hlcywgZXhjbHVkaW5nIHRoZSBmaXJzdCB0d28gc2xhc2hlcyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzdHJpbmcuXG4gKiBUaGUgbGF0dGVyIGlzIGR1ZSB0byB0aGUgcHJlc2VuY2Ugb2YgdGhlIGRldmljZSBwYXRoIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIFVOQyBwYXRoLlxuICovXG5jb25zdCBET1VCTEVfU0xBU0hfUkUgPSAvKD8hXilcXC97Mix9L2c7XG5mdW5jdGlvbiBpc1N0YXRpY1BhdHRlcm4ocGF0dGVybiwgb3B0aW9ucyA9IHt9KSB7XG4gICAgcmV0dXJuICFpc0R5bmFtaWNQYXR0ZXJuKHBhdHRlcm4sIG9wdGlvbnMpO1xufVxuZXhwb3J0cy5pc1N0YXRpY1BhdHRlcm4gPSBpc1N0YXRpY1BhdHRlcm47XG5mdW5jdGlvbiBpc0R5bmFtaWNQYXR0ZXJuKHBhdHRlcm4sIG9wdGlvbnMgPSB7fSkge1xuICAgIC8qKlxuICAgICAqIEEgc3BlY2lhbCBjYXNlIHdpdGggYW4gZW1wdHkgc3RyaW5nIGlzIG5lY2Vzc2FyeSBmb3IgbWF0Y2hpbmcgcGF0dGVybnMgdGhhdCBzdGFydCB3aXRoIGEgZm9yd2FyZCBzbGFzaC5cbiAgICAgKiBBbiBlbXB0eSBzdHJpbmcgY2Fubm90IGJlIGEgZHluYW1pYyBwYXR0ZXJuLlxuICAgICAqIEZvciBleGFtcGxlLCB0aGUgcGF0dGVybiBgL2xpYi8qYCB3aWxsIGJlIHNwcmVhZCBpbnRvIHBhcnRzOiAnJywgJ2xpYicsICcqJy5cbiAgICAgKi9cbiAgICBpZiAocGF0dGVybiA9PT0gJycpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBXaGVuIHRoZSBgY2FzZVNlbnNpdGl2ZU1hdGNoYCBvcHRpb24gaXMgZGlzYWJsZWQsIGFsbCBwYXR0ZXJucyBtdXN0IGJlIG1hcmtlZCBhcyBkeW5hbWljLCBiZWNhdXNlIHdlIGNhbm5vdCBjaGVja1xuICAgICAqIGZpbGVwYXRoIGRpcmVjdGx5ICh3aXRob3V0IHJlYWQgZGlyZWN0b3J5KS5cbiAgICAgKi9cbiAgICBpZiAob3B0aW9ucy5jYXNlU2Vuc2l0aXZlTWF0Y2ggPT09IGZhbHNlIHx8IHBhdHRlcm4uaW5jbHVkZXMoRVNDQVBFX1NZTUJPTCkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChDT01NT05fR0xPQl9TWU1CT0xTX1JFLnRlc3QocGF0dGVybikgfHwgUkVHRVhfQ0hBUkFDVEVSX0NMQVNTX1NZTUJPTFNfUkUudGVzdChwYXR0ZXJuKSB8fCBSRUdFWF9HUk9VUF9TWU1CT0xTX1JFLnRlc3QocGF0dGVybikpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmV4dGdsb2IgIT09IGZhbHNlICYmIEdMT0JfRVhURU5TSU9OX1NZTUJPTFNfUkUudGVzdChwYXR0ZXJuKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuYnJhY2VFeHBhbnNpb24gIT09IGZhbHNlICYmIGhhc0JyYWNlRXhwYW5zaW9uKHBhdHRlcm4pKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5leHBvcnRzLmlzRHluYW1pY1BhdHRlcm4gPSBpc0R5bmFtaWNQYXR0ZXJuO1xuZnVuY3Rpb24gaGFzQnJhY2VFeHBhbnNpb24ocGF0dGVybikge1xuICAgIGNvbnN0IG9wZW5pbmdCcmFjZUluZGV4ID0gcGF0dGVybi5pbmRleE9mKCd7Jyk7XG4gICAgaWYgKG9wZW5pbmdCcmFjZUluZGV4ID09PSAtMSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IGNsb3NpbmdCcmFjZUluZGV4ID0gcGF0dGVybi5pbmRleE9mKCd9Jywgb3BlbmluZ0JyYWNlSW5kZXggKyAxKTtcbiAgICBpZiAoY2xvc2luZ0JyYWNlSW5kZXggPT09IC0xKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgYnJhY2VDb250ZW50ID0gcGF0dGVybi5zbGljZShvcGVuaW5nQnJhY2VJbmRleCwgY2xvc2luZ0JyYWNlSW5kZXgpO1xuICAgIHJldHVybiBCUkFDRV9FWFBBTlNJT05fU0VQQVJBVE9SU19SRS50ZXN0KGJyYWNlQ29udGVudCk7XG59XG5mdW5jdGlvbiBjb252ZXJ0VG9Qb3NpdGl2ZVBhdHRlcm4ocGF0dGVybikge1xuICAgIHJldHVybiBpc05lZ2F0aXZlUGF0dGVybihwYXR0ZXJuKSA/IHBhdHRlcm4uc2xpY2UoMSkgOiBwYXR0ZXJuO1xufVxuZXhwb3J0cy5jb252ZXJ0VG9Qb3NpdGl2ZVBhdHRlcm4gPSBjb252ZXJ0VG9Qb3NpdGl2ZVBhdHRlcm47XG5mdW5jdGlvbiBjb252ZXJ0VG9OZWdhdGl2ZVBhdHRlcm4ocGF0dGVybikge1xuICAgIHJldHVybiAnIScgKyBwYXR0ZXJuO1xufVxuZXhwb3J0cy5jb252ZXJ0VG9OZWdhdGl2ZVBhdHRlcm4gPSBjb252ZXJ0VG9OZWdhdGl2ZVBhdHRlcm47XG5mdW5jdGlvbiBpc05lZ2F0aXZlUGF0dGVybihwYXR0ZXJuKSB7XG4gICAgcmV0dXJuIHBhdHRlcm4uc3RhcnRzV2l0aCgnIScpICYmIHBhdHRlcm5bMV0gIT09ICcoJztcbn1cbmV4cG9ydHMuaXNOZWdhdGl2ZVBhdHRlcm4gPSBpc05lZ2F0aXZlUGF0dGVybjtcbmZ1bmN0aW9uIGlzUG9zaXRpdmVQYXR0ZXJuKHBhdHRlcm4pIHtcbiAgICByZXR1cm4gIWlzTmVnYXRpdmVQYXR0ZXJuKHBhdHRlcm4pO1xufVxuZXhwb3J0cy5pc1Bvc2l0aXZlUGF0dGVybiA9IGlzUG9zaXRpdmVQYXR0ZXJuO1xuZnVuY3Rpb24gZ2V0TmVnYXRpdmVQYXR0ZXJucyhwYXR0ZXJucykge1xuICAgIHJldHVybiBwYXR0ZXJucy5maWx0ZXIoaXNOZWdhdGl2ZVBhdHRlcm4pO1xufVxuZXhwb3J0cy5nZXROZWdhdGl2ZVBhdHRlcm5zID0gZ2V0TmVnYXRpdmVQYXR0ZXJucztcbmZ1bmN0aW9uIGdldFBvc2l0aXZlUGF0dGVybnMocGF0dGVybnMpIHtcbiAgICByZXR1cm4gcGF0dGVybnMuZmlsdGVyKGlzUG9zaXRpdmVQYXR0ZXJuKTtcbn1cbmV4cG9ydHMuZ2V0UG9zaXRpdmVQYXR0ZXJucyA9IGdldFBvc2l0aXZlUGF0dGVybnM7XG4vKipcbiAqIFJldHVybnMgcGF0dGVybnMgdGhhdCBjYW4gYmUgYXBwbGllZCBpbnNpZGUgdGhlIGN1cnJlbnQgZGlyZWN0b3J5LlxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBbJy4vKicsICcqJywgJ2EvKiddXG4gKiBnZXRQYXR0ZXJuc0luc2lkZUN1cnJlbnREaXJlY3RvcnkoWycuLyonLCAnKicsICdhLyonLCAnLi4vKicsICcuLy4uLyonXSlcbiAqL1xuZnVuY3Rpb24gZ2V0UGF0dGVybnNJbnNpZGVDdXJyZW50RGlyZWN0b3J5KHBhdHRlcm5zKSB7XG4gICAgcmV0dXJuIHBhdHRlcm5zLmZpbHRlcigocGF0dGVybikgPT4gIWlzUGF0dGVyblJlbGF0ZWRUb1BhcmVudERpcmVjdG9yeShwYXR0ZXJuKSk7XG59XG5leHBvcnRzLmdldFBhdHRlcm5zSW5zaWRlQ3VycmVudERpcmVjdG9yeSA9IGdldFBhdHRlcm5zSW5zaWRlQ3VycmVudERpcmVjdG9yeTtcbi8qKlxuICogUmV0dXJucyBwYXR0ZXJucyB0byBiZSBleHBhbmRlZCByZWxhdGl2ZSB0byAob3V0c2lkZSkgdGhlIGN1cnJlbnQgZGlyZWN0b3J5LlxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBbJy4uLyonLCAnLi8uLi8qJ11cbiAqIGdldFBhdHRlcm5zSW5zaWRlQ3VycmVudERpcmVjdG9yeShbJy4vKicsICcqJywgJ2EvKicsICcuLi8qJywgJy4vLi4vKiddKVxuICovXG5mdW5jdGlvbiBnZXRQYXR0ZXJuc091dHNpZGVDdXJyZW50RGlyZWN0b3J5KHBhdHRlcm5zKSB7XG4gICAgcmV0dXJuIHBhdHRlcm5zLmZpbHRlcihpc1BhdHRlcm5SZWxhdGVkVG9QYXJlbnREaXJlY3RvcnkpO1xufVxuZXhwb3J0cy5nZXRQYXR0ZXJuc091dHNpZGVDdXJyZW50RGlyZWN0b3J5ID0gZ2V0UGF0dGVybnNPdXRzaWRlQ3VycmVudERpcmVjdG9yeTtcbmZ1bmN0aW9uIGlzUGF0dGVyblJlbGF0ZWRUb1BhcmVudERpcmVjdG9yeShwYXR0ZXJuKSB7XG4gICAgcmV0dXJuIHBhdHRlcm4uc3RhcnRzV2l0aCgnLi4nKSB8fCBwYXR0ZXJuLnN0YXJ0c1dpdGgoJy4vLi4nKTtcbn1cbmV4cG9ydHMuaXNQYXR0ZXJuUmVsYXRlZFRvUGFyZW50RGlyZWN0b3J5ID0gaXNQYXR0ZXJuUmVsYXRlZFRvUGFyZW50RGlyZWN0b3J5O1xuZnVuY3Rpb24gZ2V0QmFzZURpcmVjdG9yeShwYXR0ZXJuKSB7XG4gICAgcmV0dXJuIGdsb2JQYXJlbnQocGF0dGVybiwgeyBmbGlwQmFja3NsYXNoZXM6IGZhbHNlIH0pO1xufVxuZXhwb3J0cy5nZXRCYXNlRGlyZWN0b3J5ID0gZ2V0QmFzZURpcmVjdG9yeTtcbmZ1bmN0aW9uIGhhc0dsb2JTdGFyKHBhdHRlcm4pIHtcbiAgICByZXR1cm4gcGF0dGVybi5pbmNsdWRlcyhHTE9CU1RBUik7XG59XG5leHBvcnRzLmhhc0dsb2JTdGFyID0gaGFzR2xvYlN0YXI7XG5mdW5jdGlvbiBlbmRzV2l0aFNsYXNoR2xvYlN0YXIocGF0dGVybikge1xuICAgIHJldHVybiBwYXR0ZXJuLmVuZHNXaXRoKCcvJyArIEdMT0JTVEFSKTtcbn1cbmV4cG9ydHMuZW5kc1dpdGhTbGFzaEdsb2JTdGFyID0gZW5kc1dpdGhTbGFzaEdsb2JTdGFyO1xuZnVuY3Rpb24gaXNBZmZlY3REZXB0aE9mUmVhZGluZ1BhdHRlcm4ocGF0dGVybikge1xuICAgIGNvbnN0IGJhc2VuYW1lID0gcGF0aC5iYXNlbmFtZShwYXR0ZXJuKTtcbiAgICByZXR1cm4gZW5kc1dpdGhTbGFzaEdsb2JTdGFyKHBhdHRlcm4pIHx8IGlzU3RhdGljUGF0dGVybihiYXNlbmFtZSk7XG59XG5leHBvcnRzLmlzQWZmZWN0RGVwdGhPZlJlYWRpbmdQYXR0ZXJuID0gaXNBZmZlY3REZXB0aE9mUmVhZGluZ1BhdHRlcm47XG5mdW5jdGlvbiBleHBhbmRQYXR0ZXJuc1dpdGhCcmFjZUV4cGFuc2lvbihwYXR0ZXJucykge1xuICAgIHJldHVybiBwYXR0ZXJucy5yZWR1Y2UoKGNvbGxlY3Rpb24sIHBhdHRlcm4pID0+IHtcbiAgICAgICAgcmV0dXJuIGNvbGxlY3Rpb24uY29uY2F0KGV4cGFuZEJyYWNlRXhwYW5zaW9uKHBhdHRlcm4pKTtcbiAgICB9LCBbXSk7XG59XG5leHBvcnRzLmV4cGFuZFBhdHRlcm5zV2l0aEJyYWNlRXhwYW5zaW9uID0gZXhwYW5kUGF0dGVybnNXaXRoQnJhY2VFeHBhbnNpb247XG5mdW5jdGlvbiBleHBhbmRCcmFjZUV4cGFuc2lvbihwYXR0ZXJuKSB7XG4gICAgY29uc3QgcGF0dGVybnMgPSBtaWNyb21hdGNoLmJyYWNlcyhwYXR0ZXJuLCB7IGV4cGFuZDogdHJ1ZSwgbm9kdXBlczogdHJ1ZSB9KTtcbiAgICAvKipcbiAgICAgKiBTb3J0IHRoZSBwYXR0ZXJucyBieSBsZW5ndGggc28gdGhhdCB0aGUgc2FtZSBkZXB0aCBwYXR0ZXJucyBhcmUgcHJvY2Vzc2VkIHNpZGUgYnkgc2lkZS5cbiAgICAgKiBgYS97Yix9L3tjLH0vKmAgXHUyMDEzIGBbJ2EvLy8qJywgJ2EvYi8vKicsICdhLy9jLyonLCAnYS9iL2MvKiddYFxuICAgICAqL1xuICAgIHBhdHRlcm5zLnNvcnQoKGEsIGIpID0+IGEubGVuZ3RoIC0gYi5sZW5ndGgpO1xuICAgIC8qKlxuICAgICAqIE1pY3JvbWF0Y2ggY2FuIHJldHVybiBhbiBlbXB0eSBzdHJpbmcgaW4gdGhlIGNhc2Ugb2YgcGF0dGVybnMgbGlrZSBge2EsfWAuXG4gICAgICovXG4gICAgcmV0dXJuIHBhdHRlcm5zLmZpbHRlcigocGF0dGVybikgPT4gcGF0dGVybiAhPT0gJycpO1xufVxuZXhwb3J0cy5leHBhbmRCcmFjZUV4cGFuc2lvbiA9IGV4cGFuZEJyYWNlRXhwYW5zaW9uO1xuZnVuY3Rpb24gZ2V0UGF0dGVyblBhcnRzKHBhdHRlcm4sIG9wdGlvbnMpIHtcbiAgICBsZXQgeyBwYXJ0cyB9ID0gbWljcm9tYXRjaC5zY2FuKHBhdHRlcm4sIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucyksIHsgcGFydHM6IHRydWUgfSkpO1xuICAgIC8qKlxuICAgICAqIFRoZSBzY2FuIG1ldGhvZCByZXR1cm5zIGFuIGVtcHR5IGFycmF5IGluIHNvbWUgY2FzZXMuXG4gICAgICogU2VlIG1pY3JvbWF0Y2gvcGljb21hdGNoIzU4IGZvciBtb3JlIGRldGFpbHMuXG4gICAgICovXG4gICAgaWYgKHBhcnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBwYXJ0cyA9IFtwYXR0ZXJuXTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIHNjYW4gbWV0aG9kIGRvZXMgbm90IHJldHVybiBhbiBlbXB0eSBwYXJ0IGZvciB0aGUgcGF0dGVybiB3aXRoIGEgZm9yd2FyZCBzbGFzaC5cbiAgICAgKiBUaGlzIGlzIGFub3RoZXIgcGFydCBvZiBtaWNyb21hdGNoL3BpY29tYXRjaCM1OC5cbiAgICAgKi9cbiAgICBpZiAocGFydHNbMF0uc3RhcnRzV2l0aCgnLycpKSB7XG4gICAgICAgIHBhcnRzWzBdID0gcGFydHNbMF0uc2xpY2UoMSk7XG4gICAgICAgIHBhcnRzLnVuc2hpZnQoJycpO1xuICAgIH1cbiAgICByZXR1cm4gcGFydHM7XG59XG5leHBvcnRzLmdldFBhdHRlcm5QYXJ0cyA9IGdldFBhdHRlcm5QYXJ0cztcbmZ1bmN0aW9uIG1ha2VSZShwYXR0ZXJuLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIG1pY3JvbWF0Y2gubWFrZVJlKHBhdHRlcm4sIG9wdGlvbnMpO1xufVxuZXhwb3J0cy5tYWtlUmUgPSBtYWtlUmU7XG5mdW5jdGlvbiBjb252ZXJ0UGF0dGVybnNUb1JlKHBhdHRlcm5zLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIHBhdHRlcm5zLm1hcCgocGF0dGVybikgPT4gbWFrZVJlKHBhdHRlcm4sIG9wdGlvbnMpKTtcbn1cbmV4cG9ydHMuY29udmVydFBhdHRlcm5zVG9SZSA9IGNvbnZlcnRQYXR0ZXJuc1RvUmU7XG5mdW5jdGlvbiBtYXRjaEFueShlbnRyeSwgcGF0dGVybnNSZSkge1xuICAgIHJldHVybiBwYXR0ZXJuc1JlLnNvbWUoKHBhdHRlcm5SZSkgPT4gcGF0dGVyblJlLnRlc3QoZW50cnkpKTtcbn1cbmV4cG9ydHMubWF0Y2hBbnkgPSBtYXRjaEFueTtcbi8qKlxuICogVGhpcyBwYWNrYWdlIG9ubHkgd29ya3Mgd2l0aCBmb3J3YXJkIHNsYXNoZXMgYXMgYSBwYXRoIHNlcGFyYXRvci5cbiAqIEJlY2F1c2Ugb2YgdGhpcywgd2UgY2Fubm90IHVzZSB0aGUgc3RhbmRhcmQgYHBhdGgubm9ybWFsaXplYCBtZXRob2QsIGJlY2F1c2Ugb24gV2luZG93cyBwbGF0Zm9ybSBpdCB3aWxsIHVzZSBvZiBiYWNrc2xhc2hlcy5cbiAqL1xuZnVuY3Rpb24gcmVtb3ZlRHVwbGljYXRlU2xhc2hlcyhwYXR0ZXJuKSB7XG4gICAgcmV0dXJuIHBhdHRlcm4ucmVwbGFjZShET1VCTEVfU0xBU0hfUkUsICcvJyk7XG59XG5leHBvcnRzLnJlbW92ZUR1cGxpY2F0ZVNsYXNoZXMgPSByZW1vdmVEdXBsaWNhdGVTbGFzaGVzO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5tZXJnZSA9IHZvaWQgMDtcbmNvbnN0IG1lcmdlMiA9IHJlcXVpcmUoXCJtZXJnZTJcIik7XG5mdW5jdGlvbiBtZXJnZShzdHJlYW1zKSB7XG4gICAgY29uc3QgbWVyZ2VkU3RyZWFtID0gbWVyZ2UyKHN0cmVhbXMpO1xuICAgIHN0cmVhbXMuZm9yRWFjaCgoc3RyZWFtKSA9PiB7XG4gICAgICAgIHN0cmVhbS5vbmNlKCdlcnJvcicsIChlcnJvcikgPT4gbWVyZ2VkU3RyZWFtLmVtaXQoJ2Vycm9yJywgZXJyb3IpKTtcbiAgICB9KTtcbiAgICBtZXJnZWRTdHJlYW0ub25jZSgnY2xvc2UnLCAoKSA9PiBwcm9wYWdhdGVDbG9zZUV2ZW50VG9Tb3VyY2VzKHN0cmVhbXMpKTtcbiAgICBtZXJnZWRTdHJlYW0ub25jZSgnZW5kJywgKCkgPT4gcHJvcGFnYXRlQ2xvc2VFdmVudFRvU291cmNlcyhzdHJlYW1zKSk7XG4gICAgcmV0dXJuIG1lcmdlZFN0cmVhbTtcbn1cbmV4cG9ydHMubWVyZ2UgPSBtZXJnZTtcbmZ1bmN0aW9uIHByb3BhZ2F0ZUNsb3NlRXZlbnRUb1NvdXJjZXMoc3RyZWFtcykge1xuICAgIHN0cmVhbXMuZm9yRWFjaCgoc3RyZWFtKSA9PiBzdHJlYW0uZW1pdCgnY2xvc2UnKSk7XG59XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmlzRW1wdHkgPSBleHBvcnRzLmlzU3RyaW5nID0gdm9pZCAwO1xuZnVuY3Rpb24gaXNTdHJpbmcoaW5wdXQpIHtcbiAgICByZXR1cm4gdHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJztcbn1cbmV4cG9ydHMuaXNTdHJpbmcgPSBpc1N0cmluZztcbmZ1bmN0aW9uIGlzRW1wdHkoaW5wdXQpIHtcbiAgICByZXR1cm4gaW5wdXQgPT09ICcnO1xufVxuZXhwb3J0cy5pc0VtcHR5ID0gaXNFbXB0eTtcbiIsICJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuc3RyaW5nID0gZXhwb3J0cy5zdHJlYW0gPSBleHBvcnRzLnBhdHRlcm4gPSBleHBvcnRzLnBhdGggPSBleHBvcnRzLmZzID0gZXhwb3J0cy5lcnJubyA9IGV4cG9ydHMuYXJyYXkgPSB2b2lkIDA7XG5jb25zdCBhcnJheSA9IHJlcXVpcmUoXCIuL2FycmF5XCIpO1xuZXhwb3J0cy5hcnJheSA9IGFycmF5O1xuY29uc3QgZXJybm8gPSByZXF1aXJlKFwiLi9lcnJub1wiKTtcbmV4cG9ydHMuZXJybm8gPSBlcnJubztcbmNvbnN0IGZzID0gcmVxdWlyZShcIi4vZnNcIik7XG5leHBvcnRzLmZzID0gZnM7XG5jb25zdCBwYXRoID0gcmVxdWlyZShcIi4vcGF0aFwiKTtcbmV4cG9ydHMucGF0aCA9IHBhdGg7XG5jb25zdCBwYXR0ZXJuID0gcmVxdWlyZShcIi4vcGF0dGVyblwiKTtcbmV4cG9ydHMucGF0dGVybiA9IHBhdHRlcm47XG5jb25zdCBzdHJlYW0gPSByZXF1aXJlKFwiLi9zdHJlYW1cIik7XG5leHBvcnRzLnN0cmVhbSA9IHN0cmVhbTtcbmNvbnN0IHN0cmluZyA9IHJlcXVpcmUoXCIuL3N0cmluZ1wiKTtcbmV4cG9ydHMuc3RyaW5nID0gc3RyaW5nO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5jb252ZXJ0UGF0dGVybkdyb3VwVG9UYXNrID0gZXhwb3J0cy5jb252ZXJ0UGF0dGVybkdyb3Vwc1RvVGFza3MgPSBleHBvcnRzLmdyb3VwUGF0dGVybnNCeUJhc2VEaXJlY3RvcnkgPSBleHBvcnRzLmdldE5lZ2F0aXZlUGF0dGVybnNBc1Bvc2l0aXZlID0gZXhwb3J0cy5nZXRQb3NpdGl2ZVBhdHRlcm5zID0gZXhwb3J0cy5jb252ZXJ0UGF0dGVybnNUb1Rhc2tzID0gZXhwb3J0cy5nZW5lcmF0ZSA9IHZvaWQgMDtcbmNvbnN0IHV0aWxzID0gcmVxdWlyZShcIi4uL3V0aWxzXCIpO1xuZnVuY3Rpb24gZ2VuZXJhdGUoaW5wdXQsIHNldHRpbmdzKSB7XG4gICAgY29uc3QgcGF0dGVybnMgPSBwcm9jZXNzUGF0dGVybnMoaW5wdXQsIHNldHRpbmdzKTtcbiAgICBjb25zdCBpZ25vcmUgPSBwcm9jZXNzUGF0dGVybnMoc2V0dGluZ3MuaWdub3JlLCBzZXR0aW5ncyk7XG4gICAgY29uc3QgcG9zaXRpdmVQYXR0ZXJucyA9IGdldFBvc2l0aXZlUGF0dGVybnMocGF0dGVybnMpO1xuICAgIGNvbnN0IG5lZ2F0aXZlUGF0dGVybnMgPSBnZXROZWdhdGl2ZVBhdHRlcm5zQXNQb3NpdGl2ZShwYXR0ZXJucywgaWdub3JlKTtcbiAgICBjb25zdCBzdGF0aWNQYXR0ZXJucyA9IHBvc2l0aXZlUGF0dGVybnMuZmlsdGVyKChwYXR0ZXJuKSA9PiB1dGlscy5wYXR0ZXJuLmlzU3RhdGljUGF0dGVybihwYXR0ZXJuLCBzZXR0aW5ncykpO1xuICAgIGNvbnN0IGR5bmFtaWNQYXR0ZXJucyA9IHBvc2l0aXZlUGF0dGVybnMuZmlsdGVyKChwYXR0ZXJuKSA9PiB1dGlscy5wYXR0ZXJuLmlzRHluYW1pY1BhdHRlcm4ocGF0dGVybiwgc2V0dGluZ3MpKTtcbiAgICBjb25zdCBzdGF0aWNUYXNrcyA9IGNvbnZlcnRQYXR0ZXJuc1RvVGFza3Moc3RhdGljUGF0dGVybnMsIG5lZ2F0aXZlUGF0dGVybnMsIC8qIGR5bmFtaWMgKi8gZmFsc2UpO1xuICAgIGNvbnN0IGR5bmFtaWNUYXNrcyA9IGNvbnZlcnRQYXR0ZXJuc1RvVGFza3MoZHluYW1pY1BhdHRlcm5zLCBuZWdhdGl2ZVBhdHRlcm5zLCAvKiBkeW5hbWljICovIHRydWUpO1xuICAgIHJldHVybiBzdGF0aWNUYXNrcy5jb25jYXQoZHluYW1pY1Rhc2tzKTtcbn1cbmV4cG9ydHMuZ2VuZXJhdGUgPSBnZW5lcmF0ZTtcbmZ1bmN0aW9uIHByb2Nlc3NQYXR0ZXJucyhpbnB1dCwgc2V0dGluZ3MpIHtcbiAgICBsZXQgcGF0dGVybnMgPSBpbnB1dDtcbiAgICAvKipcbiAgICAgKiBUaGUgb3JpZ2luYWwgcGF0dGVybiBsaWtlIGB7LCosKiosYS8qfWAgY2FuIGxlYWQgdG8gcHJvYmxlbXMgY2hlY2tpbmcgdGhlIGRlcHRoIHdoZW4gbWF0Y2hpbmcgZW50cnlcbiAgICAgKiBhbmQgc29tZSBwcm9ibGVtcyB3aXRoIHRoZSBtaWNyb21hdGNoIHBhY2thZ2UgKHNlZSBmYXN0LWdsb2IgaXNzdWVzOiAjMzY1LCAjMzk0KS5cbiAgICAgKlxuICAgICAqIFRvIHNvbHZlIHRoaXMgcHJvYmxlbSwgd2UgZXhwYW5kIGFsbCBwYXR0ZXJucyBjb250YWluaW5nIGJyYWNlIGV4cGFuc2lvbi4gVGhpcyBjYW4gbGVhZCB0byBhIHNsaWdodCBzbG93ZG93blxuICAgICAqIGluIG1hdGNoaW5nIGluIHRoZSBjYXNlIG9mIGEgbGFyZ2Ugc2V0IG9mIHBhdHRlcm5zIGFmdGVyIGV4cGFuc2lvbi5cbiAgICAgKi9cbiAgICBpZiAoc2V0dGluZ3MuYnJhY2VFeHBhbnNpb24pIHtcbiAgICAgICAgcGF0dGVybnMgPSB1dGlscy5wYXR0ZXJuLmV4cGFuZFBhdHRlcm5zV2l0aEJyYWNlRXhwYW5zaW9uKHBhdHRlcm5zKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSWYgdGhlIGBiYXNlTmFtZU1hdGNoYCBvcHRpb24gaXMgZW5hYmxlZCwgd2UgbXVzdCBhZGQgZ2xvYnN0YXIgdG8gcGF0dGVybnMsIHNvIHRoYXQgdGhleSBjYW4gYmUgdXNlZFxuICAgICAqIGF0IGFueSBuZXN0aW5nIGxldmVsLlxuICAgICAqXG4gICAgICogV2UgZG8gdGhpcyBoZXJlLCBiZWNhdXNlIG90aGVyd2lzZSB3ZSBoYXZlIHRvIGNvbXBsaWNhdGUgdGhlIGZpbHRlcmluZyBsb2dpYy4gRm9yIGV4YW1wbGUsIHdlIG5lZWQgdG8gY2hhbmdlXG4gICAgICogdGhlIHBhdHRlcm4gaW4gdGhlIGZpbHRlciBiZWZvcmUgY3JlYXRpbmcgYSByZWd1bGFyIGV4cHJlc3Npb24uIFRoZXJlIGlzIG5vIG5lZWQgdG8gY2hhbmdlIHRoZSBwYXR0ZXJuc1xuICAgICAqIGluIHRoZSBhcHBsaWNhdGlvbi4gT25seSBvbiB0aGUgaW5wdXQuXG4gICAgICovXG4gICAgaWYgKHNldHRpbmdzLmJhc2VOYW1lTWF0Y2gpIHtcbiAgICAgICAgcGF0dGVybnMgPSBwYXR0ZXJucy5tYXAoKHBhdHRlcm4pID0+IHBhdHRlcm4uaW5jbHVkZXMoJy8nKSA/IHBhdHRlcm4gOiBgKiovJHtwYXR0ZXJufWApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBhbHNvIHJlbW92ZXMgZHVwbGljYXRlIHNsYXNoZXMgdGhhdCBtYXkgaGF2ZSBiZWVuIGluIHRoZSBwYXR0ZXJuIG9yIGZvcm1lZCBhcyBhIHJlc3VsdCBvZiBleHBhbnNpb24uXG4gICAgICovXG4gICAgcmV0dXJuIHBhdHRlcm5zLm1hcCgocGF0dGVybikgPT4gdXRpbHMucGF0dGVybi5yZW1vdmVEdXBsaWNhdGVTbGFzaGVzKHBhdHRlcm4pKTtcbn1cbi8qKlxuICogUmV0dXJucyB0YXNrcyBncm91cGVkIGJ5IGJhc2ljIHBhdHRlcm4gZGlyZWN0b3JpZXMuXG4gKlxuICogUGF0dGVybnMgdGhhdCBjYW4gYmUgZm91bmQgaW5zaWRlIChgLi9gKSBhbmQgb3V0c2lkZSAoYC4uL2ApIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBhcmUgaGFuZGxlZCBzZXBhcmF0ZWx5LlxuICogVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSBkaXJlY3RvcnkgdHJhdmVyc2FsIHN0YXJ0cyBhdCB0aGUgYmFzZSBkaXJlY3RvcnkgYW5kIGdvZXMgZGVlcGVyLlxuICovXG5mdW5jdGlvbiBjb252ZXJ0UGF0dGVybnNUb1Rhc2tzKHBvc2l0aXZlLCBuZWdhdGl2ZSwgZHluYW1pYykge1xuICAgIGNvbnN0IHRhc2tzID0gW107XG4gICAgY29uc3QgcGF0dGVybnNPdXRzaWRlQ3VycmVudERpcmVjdG9yeSA9IHV0aWxzLnBhdHRlcm4uZ2V0UGF0dGVybnNPdXRzaWRlQ3VycmVudERpcmVjdG9yeShwb3NpdGl2ZSk7XG4gICAgY29uc3QgcGF0dGVybnNJbnNpZGVDdXJyZW50RGlyZWN0b3J5ID0gdXRpbHMucGF0dGVybi5nZXRQYXR0ZXJuc0luc2lkZUN1cnJlbnREaXJlY3RvcnkocG9zaXRpdmUpO1xuICAgIGNvbnN0IG91dHNpZGVDdXJyZW50RGlyZWN0b3J5R3JvdXAgPSBncm91cFBhdHRlcm5zQnlCYXNlRGlyZWN0b3J5KHBhdHRlcm5zT3V0c2lkZUN1cnJlbnREaXJlY3RvcnkpO1xuICAgIGNvbnN0IGluc2lkZUN1cnJlbnREaXJlY3RvcnlHcm91cCA9IGdyb3VwUGF0dGVybnNCeUJhc2VEaXJlY3RvcnkocGF0dGVybnNJbnNpZGVDdXJyZW50RGlyZWN0b3J5KTtcbiAgICB0YXNrcy5wdXNoKC4uLmNvbnZlcnRQYXR0ZXJuR3JvdXBzVG9UYXNrcyhvdXRzaWRlQ3VycmVudERpcmVjdG9yeUdyb3VwLCBuZWdhdGl2ZSwgZHluYW1pYykpO1xuICAgIC8qXG4gICAgICogRm9yIHRoZSBzYWtlIG9mIHJlZHVjaW5nIGZ1dHVyZSBhY2Nlc3NlcyB0byB0aGUgZmlsZSBzeXN0ZW0sIHdlIG1lcmdlIGFsbCB0YXNrcyB3aXRoaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5XG4gICAgICogaW50byBhIGdsb2JhbCB0YXNrLCBpZiBhdCBsZWFzdCBvbmUgcGF0dGVybiByZWZlcnMgdG8gdGhlIHJvb3QgKGAuYCkuIEluIHRoaXMgY2FzZSwgdGhlIGdsb2JhbCB0YXNrIGNvdmVycyB0aGUgcmVzdC5cbiAgICAgKi9cbiAgICBpZiAoJy4nIGluIGluc2lkZUN1cnJlbnREaXJlY3RvcnlHcm91cCkge1xuICAgICAgICB0YXNrcy5wdXNoKGNvbnZlcnRQYXR0ZXJuR3JvdXBUb1Rhc2soJy4nLCBwYXR0ZXJuc0luc2lkZUN1cnJlbnREaXJlY3RvcnksIG5lZ2F0aXZlLCBkeW5hbWljKSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB0YXNrcy5wdXNoKC4uLmNvbnZlcnRQYXR0ZXJuR3JvdXBzVG9UYXNrcyhpbnNpZGVDdXJyZW50RGlyZWN0b3J5R3JvdXAsIG5lZ2F0aXZlLCBkeW5hbWljKSk7XG4gICAgfVxuICAgIHJldHVybiB0YXNrcztcbn1cbmV4cG9ydHMuY29udmVydFBhdHRlcm5zVG9UYXNrcyA9IGNvbnZlcnRQYXR0ZXJuc1RvVGFza3M7XG5mdW5jdGlvbiBnZXRQb3NpdGl2ZVBhdHRlcm5zKHBhdHRlcm5zKSB7XG4gICAgcmV0dXJuIHV0aWxzLnBhdHRlcm4uZ2V0UG9zaXRpdmVQYXR0ZXJucyhwYXR0ZXJucyk7XG59XG5leHBvcnRzLmdldFBvc2l0aXZlUGF0dGVybnMgPSBnZXRQb3NpdGl2ZVBhdHRlcm5zO1xuZnVuY3Rpb24gZ2V0TmVnYXRpdmVQYXR0ZXJuc0FzUG9zaXRpdmUocGF0dGVybnMsIGlnbm9yZSkge1xuICAgIGNvbnN0IG5lZ2F0aXZlID0gdXRpbHMucGF0dGVybi5nZXROZWdhdGl2ZVBhdHRlcm5zKHBhdHRlcm5zKS5jb25jYXQoaWdub3JlKTtcbiAgICBjb25zdCBwb3NpdGl2ZSA9IG5lZ2F0aXZlLm1hcCh1dGlscy5wYXR0ZXJuLmNvbnZlcnRUb1Bvc2l0aXZlUGF0dGVybik7XG4gICAgcmV0dXJuIHBvc2l0aXZlO1xufVxuZXhwb3J0cy5nZXROZWdhdGl2ZVBhdHRlcm5zQXNQb3NpdGl2ZSA9IGdldE5lZ2F0aXZlUGF0dGVybnNBc1Bvc2l0aXZlO1xuZnVuY3Rpb24gZ3JvdXBQYXR0ZXJuc0J5QmFzZURpcmVjdG9yeShwYXR0ZXJucykge1xuICAgIGNvbnN0IGdyb3VwID0ge307XG4gICAgcmV0dXJuIHBhdHRlcm5zLnJlZHVjZSgoY29sbGVjdGlvbiwgcGF0dGVybikgPT4ge1xuICAgICAgICBjb25zdCBiYXNlID0gdXRpbHMucGF0dGVybi5nZXRCYXNlRGlyZWN0b3J5KHBhdHRlcm4pO1xuICAgICAgICBpZiAoYmFzZSBpbiBjb2xsZWN0aW9uKSB7XG4gICAgICAgICAgICBjb2xsZWN0aW9uW2Jhc2VdLnB1c2gocGF0dGVybik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb2xsZWN0aW9uW2Jhc2VdID0gW3BhdHRlcm5dO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb2xsZWN0aW9uO1xuICAgIH0sIGdyb3VwKTtcbn1cbmV4cG9ydHMuZ3JvdXBQYXR0ZXJuc0J5QmFzZURpcmVjdG9yeSA9IGdyb3VwUGF0dGVybnNCeUJhc2VEaXJlY3Rvcnk7XG5mdW5jdGlvbiBjb252ZXJ0UGF0dGVybkdyb3Vwc1RvVGFza3MocG9zaXRpdmUsIG5lZ2F0aXZlLCBkeW5hbWljKSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHBvc2l0aXZlKS5tYXAoKGJhc2UpID0+IHtcbiAgICAgICAgcmV0dXJuIGNvbnZlcnRQYXR0ZXJuR3JvdXBUb1Rhc2soYmFzZSwgcG9zaXRpdmVbYmFzZV0sIG5lZ2F0aXZlLCBkeW5hbWljKTtcbiAgICB9KTtcbn1cbmV4cG9ydHMuY29udmVydFBhdHRlcm5Hcm91cHNUb1Rhc2tzID0gY29udmVydFBhdHRlcm5Hcm91cHNUb1Rhc2tzO1xuZnVuY3Rpb24gY29udmVydFBhdHRlcm5Hcm91cFRvVGFzayhiYXNlLCBwb3NpdGl2ZSwgbmVnYXRpdmUsIGR5bmFtaWMpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBkeW5hbWljLFxuICAgICAgICBwb3NpdGl2ZSxcbiAgICAgICAgbmVnYXRpdmUsXG4gICAgICAgIGJhc2UsXG4gICAgICAgIHBhdHRlcm5zOiBbXS5jb25jYXQocG9zaXRpdmUsIG5lZ2F0aXZlLm1hcCh1dGlscy5wYXR0ZXJuLmNvbnZlcnRUb05lZ2F0aXZlUGF0dGVybikpXG4gICAgfTtcbn1cbmV4cG9ydHMuY29udmVydFBhdHRlcm5Hcm91cFRvVGFzayA9IGNvbnZlcnRQYXR0ZXJuR3JvdXBUb1Rhc2s7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLnJlYWQgPSB2b2lkIDA7XG5mdW5jdGlvbiByZWFkKHBhdGgsIHNldHRpbmdzLCBjYWxsYmFjaykge1xuICAgIHNldHRpbmdzLmZzLmxzdGF0KHBhdGgsIChsc3RhdEVycm9yLCBsc3RhdCkgPT4ge1xuICAgICAgICBpZiAobHN0YXRFcnJvciAhPT0gbnVsbCkge1xuICAgICAgICAgICAgY2FsbEZhaWx1cmVDYWxsYmFjayhjYWxsYmFjaywgbHN0YXRFcnJvcik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFsc3RhdC5pc1N5bWJvbGljTGluaygpIHx8ICFzZXR0aW5ncy5mb2xsb3dTeW1ib2xpY0xpbmspIHtcbiAgICAgICAgICAgIGNhbGxTdWNjZXNzQ2FsbGJhY2soY2FsbGJhY2ssIGxzdGF0KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBzZXR0aW5ncy5mcy5zdGF0KHBhdGgsIChzdGF0RXJyb3IsIHN0YXQpID0+IHtcbiAgICAgICAgICAgIGlmIChzdGF0RXJyb3IgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBpZiAoc2V0dGluZ3MudGhyb3dFcnJvck9uQnJva2VuU3ltYm9saWNMaW5rKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxGYWlsdXJlQ2FsbGJhY2soY2FsbGJhY2ssIHN0YXRFcnJvcik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FsbFN1Y2Nlc3NDYWxsYmFjayhjYWxsYmFjaywgbHN0YXQpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzZXR0aW5ncy5tYXJrU3ltYm9saWNMaW5rKSB7XG4gICAgICAgICAgICAgICAgc3RhdC5pc1N5bWJvbGljTGluayA9ICgpID0+IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYWxsU3VjY2Vzc0NhbGxiYWNrKGNhbGxiYWNrLCBzdGF0KTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG59XG5leHBvcnRzLnJlYWQgPSByZWFkO1xuZnVuY3Rpb24gY2FsbEZhaWx1cmVDYWxsYmFjayhjYWxsYmFjaywgZXJyb3IpIHtcbiAgICBjYWxsYmFjayhlcnJvcik7XG59XG5mdW5jdGlvbiBjYWxsU3VjY2Vzc0NhbGxiYWNrKGNhbGxiYWNrLCByZXN1bHQpIHtcbiAgICBjYWxsYmFjayhudWxsLCByZXN1bHQpO1xufVxuIiwgIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5yZWFkID0gdm9pZCAwO1xuZnVuY3Rpb24gcmVhZChwYXRoLCBzZXR0aW5ncykge1xuICAgIGNvbnN0IGxzdGF0ID0gc2V0dGluZ3MuZnMubHN0YXRTeW5jKHBhdGgpO1xuICAgIGlmICghbHN0YXQuaXNTeW1ib2xpY0xpbmsoKSB8fCAhc2V0dGluZ3MuZm9sbG93U3ltYm9saWNMaW5rKSB7XG4gICAgICAgIHJldHVybiBsc3RhdDtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3Qgc3RhdCA9IHNldHRpbmdzLmZzLnN0YXRTeW5jKHBhdGgpO1xuICAgICAgICBpZiAoc2V0dGluZ3MubWFya1N5bWJvbGljTGluaykge1xuICAgICAgICAgICAgc3RhdC5pc1N5bWJvbGljTGluayA9ICgpID0+IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN0YXQ7XG4gICAgfVxuICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICBpZiAoIXNldHRpbmdzLnRocm93RXJyb3JPbkJyb2tlblN5bWJvbGljTGluaykge1xuICAgICAgICAgICAgcmV0dXJuIGxzdGF0O1xuICAgICAgICB9XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbn1cbmV4cG9ydHMucmVhZCA9IHJlYWQ7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmNyZWF0ZUZpbGVTeXN0ZW1BZGFwdGVyID0gZXhwb3J0cy5GSUxFX1NZU1RFTV9BREFQVEVSID0gdm9pZCAwO1xuY29uc3QgZnMgPSByZXF1aXJlKFwiZnNcIik7XG5leHBvcnRzLkZJTEVfU1lTVEVNX0FEQVBURVIgPSB7XG4gICAgbHN0YXQ6IGZzLmxzdGF0LFxuICAgIHN0YXQ6IGZzLnN0YXQsXG4gICAgbHN0YXRTeW5jOiBmcy5sc3RhdFN5bmMsXG4gICAgc3RhdFN5bmM6IGZzLnN0YXRTeW5jXG59O1xuZnVuY3Rpb24gY3JlYXRlRmlsZVN5c3RlbUFkYXB0ZXIoZnNNZXRob2RzKSB7XG4gICAgaWYgKGZzTWV0aG9kcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBleHBvcnRzLkZJTEVfU1lTVEVNX0FEQVBURVI7XG4gICAgfVxuICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGV4cG9ydHMuRklMRV9TWVNURU1fQURBUFRFUiksIGZzTWV0aG9kcyk7XG59XG5leHBvcnRzLmNyZWF0ZUZpbGVTeXN0ZW1BZGFwdGVyID0gY3JlYXRlRmlsZVN5c3RlbUFkYXB0ZXI7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5jb25zdCBmcyA9IHJlcXVpcmUoXCIuL2FkYXB0ZXJzL2ZzXCIpO1xuY2xhc3MgU2V0dGluZ3Mge1xuICAgIGNvbnN0cnVjdG9yKF9vcHRpb25zID0ge30pIHtcbiAgICAgICAgdGhpcy5fb3B0aW9ucyA9IF9vcHRpb25zO1xuICAgICAgICB0aGlzLmZvbGxvd1N5bWJvbGljTGluayA9IHRoaXMuX2dldFZhbHVlKHRoaXMuX29wdGlvbnMuZm9sbG93U3ltYm9saWNMaW5rLCB0cnVlKTtcbiAgICAgICAgdGhpcy5mcyA9IGZzLmNyZWF0ZUZpbGVTeXN0ZW1BZGFwdGVyKHRoaXMuX29wdGlvbnMuZnMpO1xuICAgICAgICB0aGlzLm1hcmtTeW1ib2xpY0xpbmsgPSB0aGlzLl9nZXRWYWx1ZSh0aGlzLl9vcHRpb25zLm1hcmtTeW1ib2xpY0xpbmssIGZhbHNlKTtcbiAgICAgICAgdGhpcy50aHJvd0Vycm9yT25Ccm9rZW5TeW1ib2xpY0xpbmsgPSB0aGlzLl9nZXRWYWx1ZSh0aGlzLl9vcHRpb25zLnRocm93RXJyb3JPbkJyb2tlblN5bWJvbGljTGluaywgdHJ1ZSk7XG4gICAgfVxuICAgIF9nZXRWYWx1ZShvcHRpb24sIHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBvcHRpb24gIT09IG51bGwgJiYgb3B0aW9uICE9PSB2b2lkIDAgPyBvcHRpb24gOiB2YWx1ZTtcbiAgICB9XG59XG5leHBvcnRzLmRlZmF1bHQgPSBTZXR0aW5ncztcbiIsICJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuc3RhdFN5bmMgPSBleHBvcnRzLnN0YXQgPSBleHBvcnRzLlNldHRpbmdzID0gdm9pZCAwO1xuY29uc3QgYXN5bmMgPSByZXF1aXJlKFwiLi9wcm92aWRlcnMvYXN5bmNcIik7XG5jb25zdCBzeW5jID0gcmVxdWlyZShcIi4vcHJvdmlkZXJzL3N5bmNcIik7XG5jb25zdCBzZXR0aW5nc18xID0gcmVxdWlyZShcIi4vc2V0dGluZ3NcIik7XG5leHBvcnRzLlNldHRpbmdzID0gc2V0dGluZ3NfMS5kZWZhdWx0O1xuZnVuY3Rpb24gc3RhdChwYXRoLCBvcHRpb25zT3JTZXR0aW5nc09yQ2FsbGJhY2ssIGNhbGxiYWNrKSB7XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zT3JTZXR0aW5nc09yQ2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgYXN5bmMucmVhZChwYXRoLCBnZXRTZXR0aW5ncygpLCBvcHRpb25zT3JTZXR0aW5nc09yQ2FsbGJhY2spO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGFzeW5jLnJlYWQocGF0aCwgZ2V0U2V0dGluZ3Mob3B0aW9uc09yU2V0dGluZ3NPckNhbGxiYWNrKSwgY2FsbGJhY2spO1xufVxuZXhwb3J0cy5zdGF0ID0gc3RhdDtcbmZ1bmN0aW9uIHN0YXRTeW5jKHBhdGgsIG9wdGlvbnNPclNldHRpbmdzKSB7XG4gICAgY29uc3Qgc2V0dGluZ3MgPSBnZXRTZXR0aW5ncyhvcHRpb25zT3JTZXR0aW5ncyk7XG4gICAgcmV0dXJuIHN5bmMucmVhZChwYXRoLCBzZXR0aW5ncyk7XG59XG5leHBvcnRzLnN0YXRTeW5jID0gc3RhdFN5bmM7XG5mdW5jdGlvbiBnZXRTZXR0aW5ncyhzZXR0aW5nc09yT3B0aW9ucyA9IHt9KSB7XG4gICAgaWYgKHNldHRpbmdzT3JPcHRpb25zIGluc3RhbmNlb2Ygc2V0dGluZ3NfMS5kZWZhdWx0KSB7XG4gICAgICAgIHJldHVybiBzZXR0aW5nc09yT3B0aW9ucztcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBzZXR0aW5nc18xLmRlZmF1bHQoc2V0dGluZ3NPck9wdGlvbnMpO1xufVxuIiwgIi8qISBxdWV1ZS1taWNyb3Rhc2suIE1JVCBMaWNlbnNlLiBGZXJvc3MgQWJvdWtoYWRpamVoIDxodHRwczovL2Zlcm9zcy5vcmcvb3BlbnNvdXJjZT4gKi9cbmxldCBwcm9taXNlXG5cbm1vZHVsZS5leHBvcnRzID0gdHlwZW9mIHF1ZXVlTWljcm90YXNrID09PSAnZnVuY3Rpb24nXG4gID8gcXVldWVNaWNyb3Rhc2suYmluZCh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyA/IHdpbmRvdyA6IGdsb2JhbClcbiAgLy8gcmV1c2UgcmVzb2x2ZWQgcHJvbWlzZSwgYW5kIGFsbG9jYXRlIGl0IGxhemlseVxuICA6IGNiID0+IChwcm9taXNlIHx8IChwcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKCkpKVxuICAgIC50aGVuKGNiKVxuICAgIC5jYXRjaChlcnIgPT4gc2V0VGltZW91dCgoKSA9PiB7IHRocm93IGVyciB9LCAwKSlcbiIsICIvKiEgcnVuLXBhcmFsbGVsLiBNSVQgTGljZW5zZS4gRmVyb3NzIEFib3VraGFkaWplaCA8aHR0cHM6Ly9mZXJvc3Mub3JnL29wZW5zb3VyY2U+ICovXG5tb2R1bGUuZXhwb3J0cyA9IHJ1blBhcmFsbGVsXG5cbmNvbnN0IHF1ZXVlTWljcm90YXNrID0gcmVxdWlyZSgncXVldWUtbWljcm90YXNrJylcblxuZnVuY3Rpb24gcnVuUGFyYWxsZWwgKHRhc2tzLCBjYikge1xuICBsZXQgcmVzdWx0cywgcGVuZGluZywga2V5c1xuICBsZXQgaXNTeW5jID0gdHJ1ZVxuXG4gIGlmIChBcnJheS5pc0FycmF5KHRhc2tzKSkge1xuICAgIHJlc3VsdHMgPSBbXVxuICAgIHBlbmRpbmcgPSB0YXNrcy5sZW5ndGhcbiAgfSBlbHNlIHtcbiAgICBrZXlzID0gT2JqZWN0LmtleXModGFza3MpXG4gICAgcmVzdWx0cyA9IHt9XG4gICAgcGVuZGluZyA9IGtleXMubGVuZ3RoXG4gIH1cblxuICBmdW5jdGlvbiBkb25lIChlcnIpIHtcbiAgICBmdW5jdGlvbiBlbmQgKCkge1xuICAgICAgaWYgKGNiKSBjYihlcnIsIHJlc3VsdHMpXG4gICAgICBjYiA9IG51bGxcbiAgICB9XG4gICAgaWYgKGlzU3luYykgcXVldWVNaWNyb3Rhc2soZW5kKVxuICAgIGVsc2UgZW5kKClcbiAgfVxuXG4gIGZ1bmN0aW9uIGVhY2ggKGksIGVyciwgcmVzdWx0KSB7XG4gICAgcmVzdWx0c1tpXSA9IHJlc3VsdFxuICAgIGlmICgtLXBlbmRpbmcgPT09IDAgfHwgZXJyKSB7XG4gICAgICBkb25lKGVycilcbiAgICB9XG4gIH1cblxuICBpZiAoIXBlbmRpbmcpIHtcbiAgICAvLyBlbXB0eVxuICAgIGRvbmUobnVsbClcbiAgfSBlbHNlIGlmIChrZXlzKSB7XG4gICAgLy8gb2JqZWN0XG4gICAga2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgIHRhc2tzW2tleV0oZnVuY3Rpb24gKGVyciwgcmVzdWx0KSB7IGVhY2goa2V5LCBlcnIsIHJlc3VsdCkgfSlcbiAgICB9KVxuICB9IGVsc2Uge1xuICAgIC8vIGFycmF5XG4gICAgdGFza3MuZm9yRWFjaChmdW5jdGlvbiAodGFzaywgaSkge1xuICAgICAgdGFzayhmdW5jdGlvbiAoZXJyLCByZXN1bHQpIHsgZWFjaChpLCBlcnIsIHJlc3VsdCkgfSlcbiAgICB9KVxuICB9XG5cbiAgaXNTeW5jID0gZmFsc2Vcbn1cbiIsICJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuSVNfU1VQUE9SVF9SRUFERElSX1dJVEhfRklMRV9UWVBFUyA9IHZvaWQgMDtcbmNvbnN0IE5PREVfUFJPQ0VTU19WRVJTSU9OX1BBUlRTID0gcHJvY2Vzcy52ZXJzaW9ucy5ub2RlLnNwbGl0KCcuJyk7XG5pZiAoTk9ERV9QUk9DRVNTX1ZFUlNJT05fUEFSVFNbMF0gPT09IHVuZGVmaW5lZCB8fCBOT0RFX1BST0NFU1NfVkVSU0lPTl9QQVJUU1sxXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbmV4cGVjdGVkIGJlaGF2aW9yLiBUaGUgJ3Byb2Nlc3MudmVyc2lvbnMubm9kZScgdmFyaWFibGUgaGFzIGludmFsaWQgdmFsdWU6ICR7cHJvY2Vzcy52ZXJzaW9ucy5ub2RlfWApO1xufVxuY29uc3QgTUFKT1JfVkVSU0lPTiA9IE51bWJlci5wYXJzZUludChOT0RFX1BST0NFU1NfVkVSU0lPTl9QQVJUU1swXSwgMTApO1xuY29uc3QgTUlOT1JfVkVSU0lPTiA9IE51bWJlci5wYXJzZUludChOT0RFX1BST0NFU1NfVkVSU0lPTl9QQVJUU1sxXSwgMTApO1xuY29uc3QgU1VQUE9SVEVEX01BSk9SX1ZFUlNJT04gPSAxMDtcbmNvbnN0IFNVUFBPUlRFRF9NSU5PUl9WRVJTSU9OID0gMTA7XG5jb25zdCBJU19NQVRDSEVEX0JZX01BSk9SID0gTUFKT1JfVkVSU0lPTiA+IFNVUFBPUlRFRF9NQUpPUl9WRVJTSU9OO1xuY29uc3QgSVNfTUFUQ0hFRF9CWV9NQUpPUl9BTkRfTUlOT1IgPSBNQUpPUl9WRVJTSU9OID09PSBTVVBQT1JURURfTUFKT1JfVkVSU0lPTiAmJiBNSU5PUl9WRVJTSU9OID49IFNVUFBPUlRFRF9NSU5PUl9WRVJTSU9OO1xuLyoqXG4gKiBJUyBgdHJ1ZWAgZm9yIE5vZGUuanMgMTAuMTAgYW5kIGdyZWF0ZXIuXG4gKi9cbmV4cG9ydHMuSVNfU1VQUE9SVF9SRUFERElSX1dJVEhfRklMRV9UWVBFUyA9IElTX01BVENIRURfQllfTUFKT1IgfHwgSVNfTUFUQ0hFRF9CWV9NQUpPUl9BTkRfTUlOT1I7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmNyZWF0ZURpcmVudEZyb21TdGF0cyA9IHZvaWQgMDtcbmNsYXNzIERpcmVudEZyb21TdGF0cyB7XG4gICAgY29uc3RydWN0b3IobmFtZSwgc3RhdHMpIHtcbiAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgdGhpcy5pc0Jsb2NrRGV2aWNlID0gc3RhdHMuaXNCbG9ja0RldmljZS5iaW5kKHN0YXRzKTtcbiAgICAgICAgdGhpcy5pc0NoYXJhY3RlckRldmljZSA9IHN0YXRzLmlzQ2hhcmFjdGVyRGV2aWNlLmJpbmQoc3RhdHMpO1xuICAgICAgICB0aGlzLmlzRGlyZWN0b3J5ID0gc3RhdHMuaXNEaXJlY3RvcnkuYmluZChzdGF0cyk7XG4gICAgICAgIHRoaXMuaXNGSUZPID0gc3RhdHMuaXNGSUZPLmJpbmQoc3RhdHMpO1xuICAgICAgICB0aGlzLmlzRmlsZSA9IHN0YXRzLmlzRmlsZS5iaW5kKHN0YXRzKTtcbiAgICAgICAgdGhpcy5pc1NvY2tldCA9IHN0YXRzLmlzU29ja2V0LmJpbmQoc3RhdHMpO1xuICAgICAgICB0aGlzLmlzU3ltYm9saWNMaW5rID0gc3RhdHMuaXNTeW1ib2xpY0xpbmsuYmluZChzdGF0cyk7XG4gICAgfVxufVxuZnVuY3Rpb24gY3JlYXRlRGlyZW50RnJvbVN0YXRzKG5hbWUsIHN0YXRzKSB7XG4gICAgcmV0dXJuIG5ldyBEaXJlbnRGcm9tU3RhdHMobmFtZSwgc3RhdHMpO1xufVxuZXhwb3J0cy5jcmVhdGVEaXJlbnRGcm9tU3RhdHMgPSBjcmVhdGVEaXJlbnRGcm9tU3RhdHM7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmZzID0gdm9pZCAwO1xuY29uc3QgZnMgPSByZXF1aXJlKFwiLi9mc1wiKTtcbmV4cG9ydHMuZnMgPSBmcztcbiIsICJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuam9pblBhdGhTZWdtZW50cyA9IHZvaWQgMDtcbmZ1bmN0aW9uIGpvaW5QYXRoU2VnbWVudHMoYSwgYiwgc2VwYXJhdG9yKSB7XG4gICAgLyoqXG4gICAgICogVGhlIGNvcnJlY3QgaGFuZGxpbmcgb2YgY2FzZXMgd2hlbiB0aGUgZmlyc3Qgc2VnbWVudCBpcyBhIHJvb3QgKGAvYCwgYEM6L2ApIG9yIFVOQyBwYXRoIChgLy8/L0M6L2ApLlxuICAgICAqL1xuICAgIGlmIChhLmVuZHNXaXRoKHNlcGFyYXRvcikpIHtcbiAgICAgICAgcmV0dXJuIGEgKyBiO1xuICAgIH1cbiAgICByZXR1cm4gYSArIHNlcGFyYXRvciArIGI7XG59XG5leHBvcnRzLmpvaW5QYXRoU2VnbWVudHMgPSBqb2luUGF0aFNlZ21lbnRzO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5yZWFkZGlyID0gZXhwb3J0cy5yZWFkZGlyV2l0aEZpbGVUeXBlcyA9IGV4cG9ydHMucmVhZCA9IHZvaWQgMDtcbmNvbnN0IGZzU3RhdCA9IHJlcXVpcmUoXCJAbm9kZWxpYi9mcy5zdGF0XCIpO1xuY29uc3QgcnBsID0gcmVxdWlyZShcInJ1bi1wYXJhbGxlbFwiKTtcbmNvbnN0IGNvbnN0YW50c18xID0gcmVxdWlyZShcIi4uL2NvbnN0YW50c1wiKTtcbmNvbnN0IHV0aWxzID0gcmVxdWlyZShcIi4uL3V0aWxzXCIpO1xuY29uc3QgY29tbW9uID0gcmVxdWlyZShcIi4vY29tbW9uXCIpO1xuZnVuY3Rpb24gcmVhZChkaXJlY3RvcnksIHNldHRpbmdzLCBjYWxsYmFjaykge1xuICAgIGlmICghc2V0dGluZ3Muc3RhdHMgJiYgY29uc3RhbnRzXzEuSVNfU1VQUE9SVF9SRUFERElSX1dJVEhfRklMRV9UWVBFUykge1xuICAgICAgICByZWFkZGlyV2l0aEZpbGVUeXBlcyhkaXJlY3RvcnksIHNldHRpbmdzLCBjYWxsYmFjayk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmVhZGRpcihkaXJlY3RvcnksIHNldHRpbmdzLCBjYWxsYmFjayk7XG59XG5leHBvcnRzLnJlYWQgPSByZWFkO1xuZnVuY3Rpb24gcmVhZGRpcldpdGhGaWxlVHlwZXMoZGlyZWN0b3J5LCBzZXR0aW5ncywgY2FsbGJhY2spIHtcbiAgICBzZXR0aW5ncy5mcy5yZWFkZGlyKGRpcmVjdG9yeSwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0sIChyZWFkZGlyRXJyb3IsIGRpcmVudHMpID0+IHtcbiAgICAgICAgaWYgKHJlYWRkaXJFcnJvciAhPT0gbnVsbCkge1xuICAgICAgICAgICAgY2FsbEZhaWx1cmVDYWxsYmFjayhjYWxsYmFjaywgcmVhZGRpckVycm9yKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBlbnRyaWVzID0gZGlyZW50cy5tYXAoKGRpcmVudCkgPT4gKHtcbiAgICAgICAgICAgIGRpcmVudCxcbiAgICAgICAgICAgIG5hbWU6IGRpcmVudC5uYW1lLFxuICAgICAgICAgICAgcGF0aDogY29tbW9uLmpvaW5QYXRoU2VnbWVudHMoZGlyZWN0b3J5LCBkaXJlbnQubmFtZSwgc2V0dGluZ3MucGF0aFNlZ21lbnRTZXBhcmF0b3IpXG4gICAgICAgIH0pKTtcbiAgICAgICAgaWYgKCFzZXR0aW5ncy5mb2xsb3dTeW1ib2xpY0xpbmtzKSB7XG4gICAgICAgICAgICBjYWxsU3VjY2Vzc0NhbGxiYWNrKGNhbGxiYWNrLCBlbnRyaWVzKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0YXNrcyA9IGVudHJpZXMubWFwKChlbnRyeSkgPT4gbWFrZVJwbFRhc2tFbnRyeShlbnRyeSwgc2V0dGluZ3MpKTtcbiAgICAgICAgcnBsKHRhc2tzLCAocnBsRXJyb3IsIHJwbEVudHJpZXMpID0+IHtcbiAgICAgICAgICAgIGlmIChycGxFcnJvciAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGNhbGxGYWlsdXJlQ2FsbGJhY2soY2FsbGJhY2ssIHJwbEVycm9yKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYWxsU3VjY2Vzc0NhbGxiYWNrKGNhbGxiYWNrLCBycGxFbnRyaWVzKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG59XG5leHBvcnRzLnJlYWRkaXJXaXRoRmlsZVR5cGVzID0gcmVhZGRpcldpdGhGaWxlVHlwZXM7XG5mdW5jdGlvbiBtYWtlUnBsVGFza0VudHJ5KGVudHJ5LCBzZXR0aW5ncykge1xuICAgIHJldHVybiAoZG9uZSkgPT4ge1xuICAgICAgICBpZiAoIWVudHJ5LmRpcmVudC5pc1N5bWJvbGljTGluaygpKSB7XG4gICAgICAgICAgICBkb25lKG51bGwsIGVudHJ5KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBzZXR0aW5ncy5mcy5zdGF0KGVudHJ5LnBhdGgsIChzdGF0RXJyb3IsIHN0YXRzKSA9PiB7XG4gICAgICAgICAgICBpZiAoc3RhdEVycm9yICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgaWYgKHNldHRpbmdzLnRocm93RXJyb3JPbkJyb2tlblN5bWJvbGljTGluaykge1xuICAgICAgICAgICAgICAgICAgICBkb25lKHN0YXRFcnJvcik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZG9uZShudWxsLCBlbnRyeSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZW50cnkuZGlyZW50ID0gdXRpbHMuZnMuY3JlYXRlRGlyZW50RnJvbVN0YXRzKGVudHJ5Lm5hbWUsIHN0YXRzKTtcbiAgICAgICAgICAgIGRvbmUobnVsbCwgZW50cnkpO1xuICAgICAgICB9KTtcbiAgICB9O1xufVxuZnVuY3Rpb24gcmVhZGRpcihkaXJlY3RvcnksIHNldHRpbmdzLCBjYWxsYmFjaykge1xuICAgIHNldHRpbmdzLmZzLnJlYWRkaXIoZGlyZWN0b3J5LCAocmVhZGRpckVycm9yLCBuYW1lcykgPT4ge1xuICAgICAgICBpZiAocmVhZGRpckVycm9yICE9PSBudWxsKSB7XG4gICAgICAgICAgICBjYWxsRmFpbHVyZUNhbGxiYWNrKGNhbGxiYWNrLCByZWFkZGlyRXJyb3IpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRhc2tzID0gbmFtZXMubWFwKChuYW1lKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBwYXRoID0gY29tbW9uLmpvaW5QYXRoU2VnbWVudHMoZGlyZWN0b3J5LCBuYW1lLCBzZXR0aW5ncy5wYXRoU2VnbWVudFNlcGFyYXRvcik7XG4gICAgICAgICAgICByZXR1cm4gKGRvbmUpID0+IHtcbiAgICAgICAgICAgICAgICBmc1N0YXQuc3RhdChwYXRoLCBzZXR0aW5ncy5mc1N0YXRTZXR0aW5ncywgKGVycm9yLCBzdGF0cykgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3IgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUoZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVudHJ5ID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXJlbnQ6IHV0aWxzLmZzLmNyZWF0ZURpcmVudEZyb21TdGF0cyhuYW1lLCBzdGF0cylcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNldHRpbmdzLnN0YXRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5zdGF0cyA9IHN0YXRzO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGRvbmUobnVsbCwgZW50cnkpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJwbCh0YXNrcywgKHJwbEVycm9yLCBlbnRyaWVzKSA9PiB7XG4gICAgICAgICAgICBpZiAocnBsRXJyb3IgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBjYWxsRmFpbHVyZUNhbGxiYWNrKGNhbGxiYWNrLCBycGxFcnJvcik7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FsbFN1Y2Nlc3NDYWxsYmFjayhjYWxsYmFjaywgZW50cmllcyk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xufVxuZXhwb3J0cy5yZWFkZGlyID0gcmVhZGRpcjtcbmZ1bmN0aW9uIGNhbGxGYWlsdXJlQ2FsbGJhY2soY2FsbGJhY2ssIGVycm9yKSB7XG4gICAgY2FsbGJhY2soZXJyb3IpO1xufVxuZnVuY3Rpb24gY2FsbFN1Y2Nlc3NDYWxsYmFjayhjYWxsYmFjaywgcmVzdWx0KSB7XG4gICAgY2FsbGJhY2sobnVsbCwgcmVzdWx0KTtcbn1cbiIsICJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMucmVhZGRpciA9IGV4cG9ydHMucmVhZGRpcldpdGhGaWxlVHlwZXMgPSBleHBvcnRzLnJlYWQgPSB2b2lkIDA7XG5jb25zdCBmc1N0YXQgPSByZXF1aXJlKFwiQG5vZGVsaWIvZnMuc3RhdFwiKTtcbmNvbnN0IGNvbnN0YW50c18xID0gcmVxdWlyZShcIi4uL2NvbnN0YW50c1wiKTtcbmNvbnN0IHV0aWxzID0gcmVxdWlyZShcIi4uL3V0aWxzXCIpO1xuY29uc3QgY29tbW9uID0gcmVxdWlyZShcIi4vY29tbW9uXCIpO1xuZnVuY3Rpb24gcmVhZChkaXJlY3RvcnksIHNldHRpbmdzKSB7XG4gICAgaWYgKCFzZXR0aW5ncy5zdGF0cyAmJiBjb25zdGFudHNfMS5JU19TVVBQT1JUX1JFQURESVJfV0lUSF9GSUxFX1RZUEVTKSB7XG4gICAgICAgIHJldHVybiByZWFkZGlyV2l0aEZpbGVUeXBlcyhkaXJlY3RvcnksIHNldHRpbmdzKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlYWRkaXIoZGlyZWN0b3J5LCBzZXR0aW5ncyk7XG59XG5leHBvcnRzLnJlYWQgPSByZWFkO1xuZnVuY3Rpb24gcmVhZGRpcldpdGhGaWxlVHlwZXMoZGlyZWN0b3J5LCBzZXR0aW5ncykge1xuICAgIGNvbnN0IGRpcmVudHMgPSBzZXR0aW5ncy5mcy5yZWFkZGlyU3luYyhkaXJlY3RvcnksIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgICByZXR1cm4gZGlyZW50cy5tYXAoKGRpcmVudCkgPT4ge1xuICAgICAgICBjb25zdCBlbnRyeSA9IHtcbiAgICAgICAgICAgIGRpcmVudCxcbiAgICAgICAgICAgIG5hbWU6IGRpcmVudC5uYW1lLFxuICAgICAgICAgICAgcGF0aDogY29tbW9uLmpvaW5QYXRoU2VnbWVudHMoZGlyZWN0b3J5LCBkaXJlbnQubmFtZSwgc2V0dGluZ3MucGF0aFNlZ21lbnRTZXBhcmF0b3IpXG4gICAgICAgIH07XG4gICAgICAgIGlmIChlbnRyeS5kaXJlbnQuaXNTeW1ib2xpY0xpbmsoKSAmJiBzZXR0aW5ncy5mb2xsb3dTeW1ib2xpY0xpbmtzKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHN0YXRzID0gc2V0dGluZ3MuZnMuc3RhdFN5bmMoZW50cnkucGF0aCk7XG4gICAgICAgICAgICAgICAgZW50cnkuZGlyZW50ID0gdXRpbHMuZnMuY3JlYXRlRGlyZW50RnJvbVN0YXRzKGVudHJ5Lm5hbWUsIHN0YXRzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIGlmIChzZXR0aW5ncy50aHJvd0Vycm9yT25Ccm9rZW5TeW1ib2xpY0xpbmspIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlbnRyeTtcbiAgICB9KTtcbn1cbmV4cG9ydHMucmVhZGRpcldpdGhGaWxlVHlwZXMgPSByZWFkZGlyV2l0aEZpbGVUeXBlcztcbmZ1bmN0aW9uIHJlYWRkaXIoZGlyZWN0b3J5LCBzZXR0aW5ncykge1xuICAgIGNvbnN0IG5hbWVzID0gc2V0dGluZ3MuZnMucmVhZGRpclN5bmMoZGlyZWN0b3J5KTtcbiAgICByZXR1cm4gbmFtZXMubWFwKChuYW1lKSA9PiB7XG4gICAgICAgIGNvbnN0IGVudHJ5UGF0aCA9IGNvbW1vbi5qb2luUGF0aFNlZ21lbnRzKGRpcmVjdG9yeSwgbmFtZSwgc2V0dGluZ3MucGF0aFNlZ21lbnRTZXBhcmF0b3IpO1xuICAgICAgICBjb25zdCBzdGF0cyA9IGZzU3RhdC5zdGF0U3luYyhlbnRyeVBhdGgsIHNldHRpbmdzLmZzU3RhdFNldHRpbmdzKTtcbiAgICAgICAgY29uc3QgZW50cnkgPSB7XG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgcGF0aDogZW50cnlQYXRoLFxuICAgICAgICAgICAgZGlyZW50OiB1dGlscy5mcy5jcmVhdGVEaXJlbnRGcm9tU3RhdHMobmFtZSwgc3RhdHMpXG4gICAgICAgIH07XG4gICAgICAgIGlmIChzZXR0aW5ncy5zdGF0cykge1xuICAgICAgICAgICAgZW50cnkuc3RhdHMgPSBzdGF0cztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZW50cnk7XG4gICAgfSk7XG59XG5leHBvcnRzLnJlYWRkaXIgPSByZWFkZGlyO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5jcmVhdGVGaWxlU3lzdGVtQWRhcHRlciA9IGV4cG9ydHMuRklMRV9TWVNURU1fQURBUFRFUiA9IHZvaWQgMDtcbmNvbnN0IGZzID0gcmVxdWlyZShcImZzXCIpO1xuZXhwb3J0cy5GSUxFX1NZU1RFTV9BREFQVEVSID0ge1xuICAgIGxzdGF0OiBmcy5sc3RhdCxcbiAgICBzdGF0OiBmcy5zdGF0LFxuICAgIGxzdGF0U3luYzogZnMubHN0YXRTeW5jLFxuICAgIHN0YXRTeW5jOiBmcy5zdGF0U3luYyxcbiAgICByZWFkZGlyOiBmcy5yZWFkZGlyLFxuICAgIHJlYWRkaXJTeW5jOiBmcy5yZWFkZGlyU3luY1xufTtcbmZ1bmN0aW9uIGNyZWF0ZUZpbGVTeXN0ZW1BZGFwdGVyKGZzTWV0aG9kcykge1xuICAgIGlmIChmc01ldGhvZHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gZXhwb3J0cy5GSUxFX1NZU1RFTV9BREFQVEVSO1xuICAgIH1cbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBleHBvcnRzLkZJTEVfU1lTVEVNX0FEQVBURVIpLCBmc01ldGhvZHMpO1xufVxuZXhwb3J0cy5jcmVhdGVGaWxlU3lzdGVtQWRhcHRlciA9IGNyZWF0ZUZpbGVTeXN0ZW1BZGFwdGVyO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuY29uc3QgcGF0aCA9IHJlcXVpcmUoXCJwYXRoXCIpO1xuY29uc3QgZnNTdGF0ID0gcmVxdWlyZShcIkBub2RlbGliL2ZzLnN0YXRcIik7XG5jb25zdCBmcyA9IHJlcXVpcmUoXCIuL2FkYXB0ZXJzL2ZzXCIpO1xuY2xhc3MgU2V0dGluZ3Mge1xuICAgIGNvbnN0cnVjdG9yKF9vcHRpb25zID0ge30pIHtcbiAgICAgICAgdGhpcy5fb3B0aW9ucyA9IF9vcHRpb25zO1xuICAgICAgICB0aGlzLmZvbGxvd1N5bWJvbGljTGlua3MgPSB0aGlzLl9nZXRWYWx1ZSh0aGlzLl9vcHRpb25zLmZvbGxvd1N5bWJvbGljTGlua3MsIGZhbHNlKTtcbiAgICAgICAgdGhpcy5mcyA9IGZzLmNyZWF0ZUZpbGVTeXN0ZW1BZGFwdGVyKHRoaXMuX29wdGlvbnMuZnMpO1xuICAgICAgICB0aGlzLnBhdGhTZWdtZW50U2VwYXJhdG9yID0gdGhpcy5fZ2V0VmFsdWUodGhpcy5fb3B0aW9ucy5wYXRoU2VnbWVudFNlcGFyYXRvciwgcGF0aC5zZXApO1xuICAgICAgICB0aGlzLnN0YXRzID0gdGhpcy5fZ2V0VmFsdWUodGhpcy5fb3B0aW9ucy5zdGF0cywgZmFsc2UpO1xuICAgICAgICB0aGlzLnRocm93RXJyb3JPbkJyb2tlblN5bWJvbGljTGluayA9IHRoaXMuX2dldFZhbHVlKHRoaXMuX29wdGlvbnMudGhyb3dFcnJvck9uQnJva2VuU3ltYm9saWNMaW5rLCB0cnVlKTtcbiAgICAgICAgdGhpcy5mc1N0YXRTZXR0aW5ncyA9IG5ldyBmc1N0YXQuU2V0dGluZ3Moe1xuICAgICAgICAgICAgZm9sbG93U3ltYm9saWNMaW5rOiB0aGlzLmZvbGxvd1N5bWJvbGljTGlua3MsXG4gICAgICAgICAgICBmczogdGhpcy5mcyxcbiAgICAgICAgICAgIHRocm93RXJyb3JPbkJyb2tlblN5bWJvbGljTGluazogdGhpcy50aHJvd0Vycm9yT25Ccm9rZW5TeW1ib2xpY0xpbmtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIF9nZXRWYWx1ZShvcHRpb24sIHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBvcHRpb24gIT09IG51bGwgJiYgb3B0aW9uICE9PSB2b2lkIDAgPyBvcHRpb24gOiB2YWx1ZTtcbiAgICB9XG59XG5leHBvcnRzLmRlZmF1bHQgPSBTZXR0aW5ncztcbiIsICJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuU2V0dGluZ3MgPSBleHBvcnRzLnNjYW5kaXJTeW5jID0gZXhwb3J0cy5zY2FuZGlyID0gdm9pZCAwO1xuY29uc3QgYXN5bmMgPSByZXF1aXJlKFwiLi9wcm92aWRlcnMvYXN5bmNcIik7XG5jb25zdCBzeW5jID0gcmVxdWlyZShcIi4vcHJvdmlkZXJzL3N5bmNcIik7XG5jb25zdCBzZXR0aW5nc18xID0gcmVxdWlyZShcIi4vc2V0dGluZ3NcIik7XG5leHBvcnRzLlNldHRpbmdzID0gc2V0dGluZ3NfMS5kZWZhdWx0O1xuZnVuY3Rpb24gc2NhbmRpcihwYXRoLCBvcHRpb25zT3JTZXR0aW5nc09yQ2FsbGJhY2ssIGNhbGxiYWNrKSB7XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zT3JTZXR0aW5nc09yQ2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgYXN5bmMucmVhZChwYXRoLCBnZXRTZXR0aW5ncygpLCBvcHRpb25zT3JTZXR0aW5nc09yQ2FsbGJhY2spO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGFzeW5jLnJlYWQocGF0aCwgZ2V0U2V0dGluZ3Mob3B0aW9uc09yU2V0dGluZ3NPckNhbGxiYWNrKSwgY2FsbGJhY2spO1xufVxuZXhwb3J0cy5zY2FuZGlyID0gc2NhbmRpcjtcbmZ1bmN0aW9uIHNjYW5kaXJTeW5jKHBhdGgsIG9wdGlvbnNPclNldHRpbmdzKSB7XG4gICAgY29uc3Qgc2V0dGluZ3MgPSBnZXRTZXR0aW5ncyhvcHRpb25zT3JTZXR0aW5ncyk7XG4gICAgcmV0dXJuIHN5bmMucmVhZChwYXRoLCBzZXR0aW5ncyk7XG59XG5leHBvcnRzLnNjYW5kaXJTeW5jID0gc2NhbmRpclN5bmM7XG5mdW5jdGlvbiBnZXRTZXR0aW5ncyhzZXR0aW5nc09yT3B0aW9ucyA9IHt9KSB7XG4gICAgaWYgKHNldHRpbmdzT3JPcHRpb25zIGluc3RhbmNlb2Ygc2V0dGluZ3NfMS5kZWZhdWx0KSB7XG4gICAgICAgIHJldHVybiBzZXR0aW5nc09yT3B0aW9ucztcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBzZXR0aW5nc18xLmRlZmF1bHQoc2V0dGluZ3NPck9wdGlvbnMpO1xufVxuIiwgIid1c2Ugc3RyaWN0J1xuXG5mdW5jdGlvbiByZXVzaWZ5IChDb25zdHJ1Y3Rvcikge1xuICB2YXIgaGVhZCA9IG5ldyBDb25zdHJ1Y3RvcigpXG4gIHZhciB0YWlsID0gaGVhZFxuXG4gIGZ1bmN0aW9uIGdldCAoKSB7XG4gICAgdmFyIGN1cnJlbnQgPSBoZWFkXG5cbiAgICBpZiAoY3VycmVudC5uZXh0KSB7XG4gICAgICBoZWFkID0gY3VycmVudC5uZXh0XG4gICAgfSBlbHNlIHtcbiAgICAgIGhlYWQgPSBuZXcgQ29uc3RydWN0b3IoKVxuICAgICAgdGFpbCA9IGhlYWRcbiAgICB9XG5cbiAgICBjdXJyZW50Lm5leHQgPSBudWxsXG5cbiAgICByZXR1cm4gY3VycmVudFxuICB9XG5cbiAgZnVuY3Rpb24gcmVsZWFzZSAob2JqKSB7XG4gICAgdGFpbC5uZXh0ID0gb2JqXG4gICAgdGFpbCA9IG9ialxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBnZXQ6IGdldCxcbiAgICByZWxlYXNlOiByZWxlYXNlXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSByZXVzaWZ5XG4iLCAiJ3VzZSBzdHJpY3QnXG5cbi8qIGVzbGludC1kaXNhYmxlIG5vLXZhciAqL1xuXG52YXIgcmV1c2lmeSA9IHJlcXVpcmUoJ3JldXNpZnknKVxuXG5mdW5jdGlvbiBmYXN0cXVldWUgKGNvbnRleHQsIHdvcmtlciwgY29uY3VycmVuY3kpIHtcbiAgaWYgKHR5cGVvZiBjb250ZXh0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY29uY3VycmVuY3kgPSB3b3JrZXJcbiAgICB3b3JrZXIgPSBjb250ZXh0XG4gICAgY29udGV4dCA9IG51bGxcbiAgfVxuXG4gIGlmIChjb25jdXJyZW5jeSA8IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2Zhc3RxdWV1ZSBjb25jdXJyZW5jeSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAxJylcbiAgfVxuXG4gIHZhciBjYWNoZSA9IHJldXNpZnkoVGFzaylcbiAgdmFyIHF1ZXVlSGVhZCA9IG51bGxcbiAgdmFyIHF1ZXVlVGFpbCA9IG51bGxcbiAgdmFyIF9ydW5uaW5nID0gMFxuICB2YXIgZXJyb3JIYW5kbGVyID0gbnVsbFxuXG4gIHZhciBzZWxmID0ge1xuICAgIHB1c2g6IHB1c2gsXG4gICAgZHJhaW46IG5vb3AsXG4gICAgc2F0dXJhdGVkOiBub29wLFxuICAgIHBhdXNlOiBwYXVzZSxcbiAgICBwYXVzZWQ6IGZhbHNlLFxuICAgIGNvbmN1cnJlbmN5OiBjb25jdXJyZW5jeSxcbiAgICBydW5uaW5nOiBydW5uaW5nLFxuICAgIHJlc3VtZTogcmVzdW1lLFxuICAgIGlkbGU6IGlkbGUsXG4gICAgbGVuZ3RoOiBsZW5ndGgsXG4gICAgZ2V0UXVldWU6IGdldFF1ZXVlLFxuICAgIHVuc2hpZnQ6IHVuc2hpZnQsXG4gICAgZW1wdHk6IG5vb3AsXG4gICAga2lsbDoga2lsbCxcbiAgICBraWxsQW5kRHJhaW46IGtpbGxBbmREcmFpbixcbiAgICBlcnJvcjogZXJyb3JcbiAgfVxuXG4gIHJldHVybiBzZWxmXG5cbiAgZnVuY3Rpb24gcnVubmluZyAoKSB7XG4gICAgcmV0dXJuIF9ydW5uaW5nXG4gIH1cblxuICBmdW5jdGlvbiBwYXVzZSAoKSB7XG4gICAgc2VsZi5wYXVzZWQgPSB0cnVlXG4gIH1cblxuICBmdW5jdGlvbiBsZW5ndGggKCkge1xuICAgIHZhciBjdXJyZW50ID0gcXVldWVIZWFkXG4gICAgdmFyIGNvdW50ZXIgPSAwXG5cbiAgICB3aGlsZSAoY3VycmVudCkge1xuICAgICAgY3VycmVudCA9IGN1cnJlbnQubmV4dFxuICAgICAgY291bnRlcisrXG4gICAgfVxuXG4gICAgcmV0dXJuIGNvdW50ZXJcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldFF1ZXVlICgpIHtcbiAgICB2YXIgY3VycmVudCA9IHF1ZXVlSGVhZFxuICAgIHZhciB0YXNrcyA9IFtdXG5cbiAgICB3aGlsZSAoY3VycmVudCkge1xuICAgICAgdGFza3MucHVzaChjdXJyZW50LnZhbHVlKVxuICAgICAgY3VycmVudCA9IGN1cnJlbnQubmV4dFxuICAgIH1cblxuICAgIHJldHVybiB0YXNrc1xuICB9XG5cbiAgZnVuY3Rpb24gcmVzdW1lICgpIHtcbiAgICBpZiAoIXNlbGYucGF1c2VkKSByZXR1cm5cbiAgICBzZWxmLnBhdXNlZCA9IGZhbHNlXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLmNvbmN1cnJlbmN5OyBpKyspIHtcbiAgICAgIF9ydW5uaW5nKytcbiAgICAgIHJlbGVhc2UoKVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGlkbGUgKCkge1xuICAgIHJldHVybiBfcnVubmluZyA9PT0gMCAmJiBzZWxmLmxlbmd0aCgpID09PSAwXG4gIH1cblxuICBmdW5jdGlvbiBwdXNoICh2YWx1ZSwgZG9uZSkge1xuICAgIHZhciBjdXJyZW50ID0gY2FjaGUuZ2V0KClcblxuICAgIGN1cnJlbnQuY29udGV4dCA9IGNvbnRleHRcbiAgICBjdXJyZW50LnJlbGVhc2UgPSByZWxlYXNlXG4gICAgY3VycmVudC52YWx1ZSA9IHZhbHVlXG4gICAgY3VycmVudC5jYWxsYmFjayA9IGRvbmUgfHwgbm9vcFxuICAgIGN1cnJlbnQuZXJyb3JIYW5kbGVyID0gZXJyb3JIYW5kbGVyXG5cbiAgICBpZiAoX3J1bm5pbmcgPT09IHNlbGYuY29uY3VycmVuY3kgfHwgc2VsZi5wYXVzZWQpIHtcbiAgICAgIGlmIChxdWV1ZVRhaWwpIHtcbiAgICAgICAgcXVldWVUYWlsLm5leHQgPSBjdXJyZW50XG4gICAgICAgIHF1ZXVlVGFpbCA9IGN1cnJlbnRcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHF1ZXVlSGVhZCA9IGN1cnJlbnRcbiAgICAgICAgcXVldWVUYWlsID0gY3VycmVudFxuICAgICAgICBzZWxmLnNhdHVyYXRlZCgpXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIF9ydW5uaW5nKytcbiAgICAgIHdvcmtlci5jYWxsKGNvbnRleHQsIGN1cnJlbnQudmFsdWUsIGN1cnJlbnQud29ya2VkKVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHVuc2hpZnQgKHZhbHVlLCBkb25lKSB7XG4gICAgdmFyIGN1cnJlbnQgPSBjYWNoZS5nZXQoKVxuXG4gICAgY3VycmVudC5jb250ZXh0ID0gY29udGV4dFxuICAgIGN1cnJlbnQucmVsZWFzZSA9IHJlbGVhc2VcbiAgICBjdXJyZW50LnZhbHVlID0gdmFsdWVcbiAgICBjdXJyZW50LmNhbGxiYWNrID0gZG9uZSB8fCBub29wXG5cbiAgICBpZiAoX3J1bm5pbmcgPT09IHNlbGYuY29uY3VycmVuY3kgfHwgc2VsZi5wYXVzZWQpIHtcbiAgICAgIGlmIChxdWV1ZUhlYWQpIHtcbiAgICAgICAgY3VycmVudC5uZXh0ID0gcXVldWVIZWFkXG4gICAgICAgIHF1ZXVlSGVhZCA9IGN1cnJlbnRcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHF1ZXVlSGVhZCA9IGN1cnJlbnRcbiAgICAgICAgcXVldWVUYWlsID0gY3VycmVudFxuICAgICAgICBzZWxmLnNhdHVyYXRlZCgpXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIF9ydW5uaW5nKytcbiAgICAgIHdvcmtlci5jYWxsKGNvbnRleHQsIGN1cnJlbnQudmFsdWUsIGN1cnJlbnQud29ya2VkKVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHJlbGVhc2UgKGhvbGRlcikge1xuICAgIGlmIChob2xkZXIpIHtcbiAgICAgIGNhY2hlLnJlbGVhc2UoaG9sZGVyKVxuICAgIH1cbiAgICB2YXIgbmV4dCA9IHF1ZXVlSGVhZFxuICAgIGlmIChuZXh0KSB7XG4gICAgICBpZiAoIXNlbGYucGF1c2VkKSB7XG4gICAgICAgIGlmIChxdWV1ZVRhaWwgPT09IHF1ZXVlSGVhZCkge1xuICAgICAgICAgIHF1ZXVlVGFpbCA9IG51bGxcbiAgICAgICAgfVxuICAgICAgICBxdWV1ZUhlYWQgPSBuZXh0Lm5leHRcbiAgICAgICAgbmV4dC5uZXh0ID0gbnVsbFxuICAgICAgICB3b3JrZXIuY2FsbChjb250ZXh0LCBuZXh0LnZhbHVlLCBuZXh0LndvcmtlZClcbiAgICAgICAgaWYgKHF1ZXVlVGFpbCA9PT0gbnVsbCkge1xuICAgICAgICAgIHNlbGYuZW1wdHkoKVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBfcnVubmluZy0tXG4gICAgICB9XG4gICAgfSBlbHNlIGlmICgtLV9ydW5uaW5nID09PSAwKSB7XG4gICAgICBzZWxmLmRyYWluKClcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBraWxsICgpIHtcbiAgICBxdWV1ZUhlYWQgPSBudWxsXG4gICAgcXVldWVUYWlsID0gbnVsbFxuICAgIHNlbGYuZHJhaW4gPSBub29wXG4gIH1cblxuICBmdW5jdGlvbiBraWxsQW5kRHJhaW4gKCkge1xuICAgIHF1ZXVlSGVhZCA9IG51bGxcbiAgICBxdWV1ZVRhaWwgPSBudWxsXG4gICAgc2VsZi5kcmFpbigpXG4gICAgc2VsZi5kcmFpbiA9IG5vb3BcbiAgfVxuXG4gIGZ1bmN0aW9uIGVycm9yIChoYW5kbGVyKSB7XG4gICAgZXJyb3JIYW5kbGVyID0gaGFuZGxlclxuICB9XG59XG5cbmZ1bmN0aW9uIG5vb3AgKCkge31cblxuZnVuY3Rpb24gVGFzayAoKSB7XG4gIHRoaXMudmFsdWUgPSBudWxsXG4gIHRoaXMuY2FsbGJhY2sgPSBub29wXG4gIHRoaXMubmV4dCA9IG51bGxcbiAgdGhpcy5yZWxlYXNlID0gbm9vcFxuICB0aGlzLmNvbnRleHQgPSBudWxsXG4gIHRoaXMuZXJyb3JIYW5kbGVyID0gbnVsbFxuXG4gIHZhciBzZWxmID0gdGhpc1xuXG4gIHRoaXMud29ya2VkID0gZnVuY3Rpb24gd29ya2VkIChlcnIsIHJlc3VsdCkge1xuICAgIHZhciBjYWxsYmFjayA9IHNlbGYuY2FsbGJhY2tcbiAgICB2YXIgZXJyb3JIYW5kbGVyID0gc2VsZi5lcnJvckhhbmRsZXJcbiAgICB2YXIgdmFsID0gc2VsZi52YWx1ZVxuICAgIHNlbGYudmFsdWUgPSBudWxsXG4gICAgc2VsZi5jYWxsYmFjayA9IG5vb3BcbiAgICBpZiAoc2VsZi5lcnJvckhhbmRsZXIpIHtcbiAgICAgIGVycm9ySGFuZGxlcihlcnIsIHZhbClcbiAgICB9XG4gICAgY2FsbGJhY2suY2FsbChzZWxmLmNvbnRleHQsIGVyciwgcmVzdWx0KVxuICAgIHNlbGYucmVsZWFzZShzZWxmKVxuICB9XG59XG5cbmZ1bmN0aW9uIHF1ZXVlQXNQcm9taXNlZCAoY29udGV4dCwgd29ya2VyLCBjb25jdXJyZW5jeSkge1xuICBpZiAodHlwZW9mIGNvbnRleHQgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjb25jdXJyZW5jeSA9IHdvcmtlclxuICAgIHdvcmtlciA9IGNvbnRleHRcbiAgICBjb250ZXh0ID0gbnVsbFxuICB9XG5cbiAgZnVuY3Rpb24gYXN5bmNXcmFwcGVyIChhcmcsIGNiKSB7XG4gICAgd29ya2VyLmNhbGwodGhpcywgYXJnKVxuICAgICAgLnRoZW4oZnVuY3Rpb24gKHJlcykge1xuICAgICAgICBjYihudWxsLCByZXMpXG4gICAgICB9LCBjYilcbiAgfVxuXG4gIHZhciBxdWV1ZSA9IGZhc3RxdWV1ZShjb250ZXh0LCBhc3luY1dyYXBwZXIsIGNvbmN1cnJlbmN5KVxuXG4gIHZhciBwdXNoQ2IgPSBxdWV1ZS5wdXNoXG4gIHZhciB1bnNoaWZ0Q2IgPSBxdWV1ZS51bnNoaWZ0XG5cbiAgcXVldWUucHVzaCA9IHB1c2hcbiAgcXVldWUudW5zaGlmdCA9IHVuc2hpZnRcbiAgcXVldWUuZHJhaW5lZCA9IGRyYWluZWRcblxuICByZXR1cm4gcXVldWVcblxuICBmdW5jdGlvbiBwdXNoICh2YWx1ZSkge1xuICAgIHZhciBwID0gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgcHVzaENiKHZhbHVlLCBmdW5jdGlvbiAoZXJyLCByZXN1bHQpIHtcbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgIHJlamVjdChlcnIpXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgcmVzb2x2ZShyZXN1bHQpXG4gICAgICB9KVxuICAgIH0pXG5cbiAgICAvLyBMZXQncyBmb3JrIHRoZSBwcm9taXNlIGNoYWluIHRvXG4gICAgLy8gbWFrZSB0aGUgZXJyb3IgYnViYmxlIHVwIHRvIHRoZSB1c2VyIGJ1dFxuICAgIC8vIG5vdCBsZWFkIHRvIGEgdW5oYW5kbGVkUmVqZWN0aW9uXG4gICAgcC5jYXRjaChub29wKVxuXG4gICAgcmV0dXJuIHBcbiAgfVxuXG4gIGZ1bmN0aW9uIHVuc2hpZnQgKHZhbHVlKSB7XG4gICAgdmFyIHAgPSBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICB1bnNoaWZ0Q2IodmFsdWUsIGZ1bmN0aW9uIChlcnIsIHJlc3VsdCkge1xuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgcmVqZWN0KGVycilcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICByZXNvbHZlKHJlc3VsdClcbiAgICAgIH0pXG4gICAgfSlcblxuICAgIC8vIExldCdzIGZvcmsgdGhlIHByb21pc2UgY2hhaW4gdG9cbiAgICAvLyBtYWtlIHRoZSBlcnJvciBidWJibGUgdXAgdG8gdGhlIHVzZXIgYnV0XG4gICAgLy8gbm90IGxlYWQgdG8gYSB1bmhhbmRsZWRSZWplY3Rpb25cbiAgICBwLmNhdGNoKG5vb3ApXG5cbiAgICByZXR1cm4gcFxuICB9XG5cbiAgZnVuY3Rpb24gZHJhaW5lZCAoKSB7XG4gICAgaWYgKHF1ZXVlLmlkbGUoKSkge1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICAgIHJlc29sdmUoKVxuICAgICAgfSlcbiAgICB9XG5cbiAgICB2YXIgcHJldmlvdXNEcmFpbiA9IHF1ZXVlLmRyYWluXG5cbiAgICB2YXIgcCA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICBxdWV1ZS5kcmFpbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcHJldmlvdXNEcmFpbigpXG4gICAgICAgIHJlc29sdmUoKVxuICAgICAgfVxuICAgIH0pXG5cbiAgICByZXR1cm4gcFxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZmFzdHF1ZXVlXG5tb2R1bGUuZXhwb3J0cy5wcm9taXNlID0gcXVldWVBc1Byb21pc2VkXG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmpvaW5QYXRoU2VnbWVudHMgPSBleHBvcnRzLnJlcGxhY2VQYXRoU2VnbWVudFNlcGFyYXRvciA9IGV4cG9ydHMuaXNBcHBsaWVkRmlsdGVyID0gZXhwb3J0cy5pc0ZhdGFsRXJyb3IgPSB2b2lkIDA7XG5mdW5jdGlvbiBpc0ZhdGFsRXJyb3Ioc2V0dGluZ3MsIGVycm9yKSB7XG4gICAgaWYgKHNldHRpbmdzLmVycm9yRmlsdGVyID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gIXNldHRpbmdzLmVycm9yRmlsdGVyKGVycm9yKTtcbn1cbmV4cG9ydHMuaXNGYXRhbEVycm9yID0gaXNGYXRhbEVycm9yO1xuZnVuY3Rpb24gaXNBcHBsaWVkRmlsdGVyKGZpbHRlciwgdmFsdWUpIHtcbiAgICByZXR1cm4gZmlsdGVyID09PSBudWxsIHx8IGZpbHRlcih2YWx1ZSk7XG59XG5leHBvcnRzLmlzQXBwbGllZEZpbHRlciA9IGlzQXBwbGllZEZpbHRlcjtcbmZ1bmN0aW9uIHJlcGxhY2VQYXRoU2VnbWVudFNlcGFyYXRvcihmaWxlcGF0aCwgc2VwYXJhdG9yKSB7XG4gICAgcmV0dXJuIGZpbGVwYXRoLnNwbGl0KC9bL1xcXFxdLykuam9pbihzZXBhcmF0b3IpO1xufVxuZXhwb3J0cy5yZXBsYWNlUGF0aFNlZ21lbnRTZXBhcmF0b3IgPSByZXBsYWNlUGF0aFNlZ21lbnRTZXBhcmF0b3I7XG5mdW5jdGlvbiBqb2luUGF0aFNlZ21lbnRzKGEsIGIsIHNlcGFyYXRvcikge1xuICAgIGlmIChhID09PSAnJykge1xuICAgICAgICByZXR1cm4gYjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIGNvcnJlY3QgaGFuZGxpbmcgb2YgY2FzZXMgd2hlbiB0aGUgZmlyc3Qgc2VnbWVudCBpcyBhIHJvb3QgKGAvYCwgYEM6L2ApIG9yIFVOQyBwYXRoIChgLy8/L0M6L2ApLlxuICAgICAqL1xuICAgIGlmIChhLmVuZHNXaXRoKHNlcGFyYXRvcikpIHtcbiAgICAgICAgcmV0dXJuIGEgKyBiO1xuICAgIH1cbiAgICByZXR1cm4gYSArIHNlcGFyYXRvciArIGI7XG59XG5leHBvcnRzLmpvaW5QYXRoU2VnbWVudHMgPSBqb2luUGF0aFNlZ21lbnRzO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuY29uc3QgY29tbW9uID0gcmVxdWlyZShcIi4vY29tbW9uXCIpO1xuY2xhc3MgUmVhZGVyIHtcbiAgICBjb25zdHJ1Y3Rvcihfcm9vdCwgX3NldHRpbmdzKSB7XG4gICAgICAgIHRoaXMuX3Jvb3QgPSBfcm9vdDtcbiAgICAgICAgdGhpcy5fc2V0dGluZ3MgPSBfc2V0dGluZ3M7XG4gICAgICAgIHRoaXMuX3Jvb3QgPSBjb21tb24ucmVwbGFjZVBhdGhTZWdtZW50U2VwYXJhdG9yKF9yb290LCBfc2V0dGluZ3MucGF0aFNlZ21lbnRTZXBhcmF0b3IpO1xuICAgIH1cbn1cbmV4cG9ydHMuZGVmYXVsdCA9IFJlYWRlcjtcbiIsICJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IGV2ZW50c18xID0gcmVxdWlyZShcImV2ZW50c1wiKTtcbmNvbnN0IGZzU2NhbmRpciA9IHJlcXVpcmUoXCJAbm9kZWxpYi9mcy5zY2FuZGlyXCIpO1xuY29uc3QgZmFzdHEgPSByZXF1aXJlKFwiZmFzdHFcIik7XG5jb25zdCBjb21tb24gPSByZXF1aXJlKFwiLi9jb21tb25cIik7XG5jb25zdCByZWFkZXJfMSA9IHJlcXVpcmUoXCIuL3JlYWRlclwiKTtcbmNsYXNzIEFzeW5jUmVhZGVyIGV4dGVuZHMgcmVhZGVyXzEuZGVmYXVsdCB7XG4gICAgY29uc3RydWN0b3IoX3Jvb3QsIF9zZXR0aW5ncykge1xuICAgICAgICBzdXBlcihfcm9vdCwgX3NldHRpbmdzKTtcbiAgICAgICAgdGhpcy5fc2V0dGluZ3MgPSBfc2V0dGluZ3M7XG4gICAgICAgIHRoaXMuX3NjYW5kaXIgPSBmc1NjYW5kaXIuc2NhbmRpcjtcbiAgICAgICAgdGhpcy5fZW1pdHRlciA9IG5ldyBldmVudHNfMS5FdmVudEVtaXR0ZXIoKTtcbiAgICAgICAgdGhpcy5fcXVldWUgPSBmYXN0cSh0aGlzLl93b3JrZXIuYmluZCh0aGlzKSwgdGhpcy5fc2V0dGluZ3MuY29uY3VycmVuY3kpO1xuICAgICAgICB0aGlzLl9pc0ZhdGFsRXJyb3IgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5faXNEZXN0cm95ZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fcXVldWUuZHJhaW4gPSAoKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuX2lzRmF0YWxFcnJvcikge1xuICAgICAgICAgICAgICAgIHRoaXMuX2VtaXR0ZXIuZW1pdCgnZW5kJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuICAgIHJlYWQoKSB7XG4gICAgICAgIHRoaXMuX2lzRmF0YWxFcnJvciA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9pc0Rlc3Ryb3llZCA9IGZhbHNlO1xuICAgICAgICBzZXRJbW1lZGlhdGUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fcHVzaFRvUXVldWUodGhpcy5fcm9vdCwgdGhpcy5fc2V0dGluZ3MuYmFzZVBhdGgpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2VtaXR0ZXI7XG4gICAgfVxuICAgIGdldCBpc0Rlc3Ryb3llZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lzRGVzdHJveWVkO1xuICAgIH1cbiAgICBkZXN0cm95KCkge1xuICAgICAgICBpZiAodGhpcy5faXNEZXN0cm95ZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIHJlYWRlciBpcyBhbHJlYWR5IGRlc3Ryb3llZCcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2lzRGVzdHJveWVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5fcXVldWUua2lsbEFuZERyYWluKCk7XG4gICAgfVxuICAgIG9uRW50cnkoY2FsbGJhY2spIHtcbiAgICAgICAgdGhpcy5fZW1pdHRlci5vbignZW50cnknLCBjYWxsYmFjayk7XG4gICAgfVxuICAgIG9uRXJyb3IoY2FsbGJhY2spIHtcbiAgICAgICAgdGhpcy5fZW1pdHRlci5vbmNlKCdlcnJvcicsIGNhbGxiYWNrKTtcbiAgICB9XG4gICAgb25FbmQoY2FsbGJhY2spIHtcbiAgICAgICAgdGhpcy5fZW1pdHRlci5vbmNlKCdlbmQnLCBjYWxsYmFjayk7XG4gICAgfVxuICAgIF9wdXNoVG9RdWV1ZShkaXJlY3RvcnksIGJhc2UpIHtcbiAgICAgICAgY29uc3QgcXVldWVJdGVtID0geyBkaXJlY3RvcnksIGJhc2UgfTtcbiAgICAgICAgdGhpcy5fcXVldWUucHVzaChxdWV1ZUl0ZW0sIChlcnJvcikgPT4ge1xuICAgICAgICAgICAgaWYgKGVycm9yICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5faGFuZGxlRXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgX3dvcmtlcihpdGVtLCBkb25lKSB7XG4gICAgICAgIHRoaXMuX3NjYW5kaXIoaXRlbS5kaXJlY3RvcnksIHRoaXMuX3NldHRpbmdzLmZzU2NhbmRpclNldHRpbmdzLCAoZXJyb3IsIGVudHJpZXMpID0+IHtcbiAgICAgICAgICAgIGlmIChlcnJvciAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGRvbmUoZXJyb3IsIHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5faGFuZGxlRW50cnkoZW50cnksIGl0ZW0uYmFzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkb25lKG51bGwsIHVuZGVmaW5lZCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBfaGFuZGxlRXJyb3IoZXJyb3IpIHtcbiAgICAgICAgaWYgKHRoaXMuX2lzRGVzdHJveWVkIHx8ICFjb21tb24uaXNGYXRhbEVycm9yKHRoaXMuX3NldHRpbmdzLCBlcnJvcikpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9pc0ZhdGFsRXJyb3IgPSB0cnVlO1xuICAgICAgICB0aGlzLl9pc0Rlc3Ryb3llZCA9IHRydWU7XG4gICAgICAgIHRoaXMuX2VtaXR0ZXIuZW1pdCgnZXJyb3InLCBlcnJvcik7XG4gICAgfVxuICAgIF9oYW5kbGVFbnRyeShlbnRyeSwgYmFzZSkge1xuICAgICAgICBpZiAodGhpcy5faXNEZXN0cm95ZWQgfHwgdGhpcy5faXNGYXRhbEVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZnVsbHBhdGggPSBlbnRyeS5wYXRoO1xuICAgICAgICBpZiAoYmFzZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBlbnRyeS5wYXRoID0gY29tbW9uLmpvaW5QYXRoU2VnbWVudHMoYmFzZSwgZW50cnkubmFtZSwgdGhpcy5fc2V0dGluZ3MucGF0aFNlZ21lbnRTZXBhcmF0b3IpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb21tb24uaXNBcHBsaWVkRmlsdGVyKHRoaXMuX3NldHRpbmdzLmVudHJ5RmlsdGVyLCBlbnRyeSkpIHtcbiAgICAgICAgICAgIHRoaXMuX2VtaXRFbnRyeShlbnRyeSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVudHJ5LmRpcmVudC5pc0RpcmVjdG9yeSgpICYmIGNvbW1vbi5pc0FwcGxpZWRGaWx0ZXIodGhpcy5fc2V0dGluZ3MuZGVlcEZpbHRlciwgZW50cnkpKSB7XG4gICAgICAgICAgICB0aGlzLl9wdXNoVG9RdWV1ZShmdWxscGF0aCwgYmFzZSA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogZW50cnkucGF0aCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgX2VtaXRFbnRyeShlbnRyeSkge1xuICAgICAgICB0aGlzLl9lbWl0dGVyLmVtaXQoJ2VudHJ5JywgZW50cnkpO1xuICAgIH1cbn1cbmV4cG9ydHMuZGVmYXVsdCA9IEFzeW5jUmVhZGVyO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuY29uc3QgYXN5bmNfMSA9IHJlcXVpcmUoXCIuLi9yZWFkZXJzL2FzeW5jXCIpO1xuY2xhc3MgQXN5bmNQcm92aWRlciB7XG4gICAgY29uc3RydWN0b3IoX3Jvb3QsIF9zZXR0aW5ncykge1xuICAgICAgICB0aGlzLl9yb290ID0gX3Jvb3Q7XG4gICAgICAgIHRoaXMuX3NldHRpbmdzID0gX3NldHRpbmdzO1xuICAgICAgICB0aGlzLl9yZWFkZXIgPSBuZXcgYXN5bmNfMS5kZWZhdWx0KHRoaXMuX3Jvb3QsIHRoaXMuX3NldHRpbmdzKTtcbiAgICAgICAgdGhpcy5fc3RvcmFnZSA9IFtdO1xuICAgIH1cbiAgICByZWFkKGNhbGxiYWNrKSB7XG4gICAgICAgIHRoaXMuX3JlYWRlci5vbkVycm9yKChlcnJvcikgPT4ge1xuICAgICAgICAgICAgY2FsbEZhaWx1cmVDYWxsYmFjayhjYWxsYmFjaywgZXJyb3IpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5fcmVhZGVyLm9uRW50cnkoKGVudHJ5KSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9zdG9yYWdlLnB1c2goZW50cnkpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5fcmVhZGVyLm9uRW5kKCgpID0+IHtcbiAgICAgICAgICAgIGNhbGxTdWNjZXNzQ2FsbGJhY2soY2FsbGJhY2ssIHRoaXMuX3N0b3JhZ2UpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5fcmVhZGVyLnJlYWQoKTtcbiAgICB9XG59XG5leHBvcnRzLmRlZmF1bHQgPSBBc3luY1Byb3ZpZGVyO1xuZnVuY3Rpb24gY2FsbEZhaWx1cmVDYWxsYmFjayhjYWxsYmFjaywgZXJyb3IpIHtcbiAgICBjYWxsYmFjayhlcnJvcik7XG59XG5mdW5jdGlvbiBjYWxsU3VjY2Vzc0NhbGxiYWNrKGNhbGxiYWNrLCBlbnRyaWVzKSB7XG4gICAgY2FsbGJhY2sobnVsbCwgZW50cmllcyk7XG59XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5jb25zdCBzdHJlYW1fMSA9IHJlcXVpcmUoXCJzdHJlYW1cIik7XG5jb25zdCBhc3luY18xID0gcmVxdWlyZShcIi4uL3JlYWRlcnMvYXN5bmNcIik7XG5jbGFzcyBTdHJlYW1Qcm92aWRlciB7XG4gICAgY29uc3RydWN0b3IoX3Jvb3QsIF9zZXR0aW5ncykge1xuICAgICAgICB0aGlzLl9yb290ID0gX3Jvb3Q7XG4gICAgICAgIHRoaXMuX3NldHRpbmdzID0gX3NldHRpbmdzO1xuICAgICAgICB0aGlzLl9yZWFkZXIgPSBuZXcgYXN5bmNfMS5kZWZhdWx0KHRoaXMuX3Jvb3QsIHRoaXMuX3NldHRpbmdzKTtcbiAgICAgICAgdGhpcy5fc3RyZWFtID0gbmV3IHN0cmVhbV8xLlJlYWRhYmxlKHtcbiAgICAgICAgICAgIG9iamVjdE1vZGU6IHRydWUsXG4gICAgICAgICAgICByZWFkOiAoKSA9PiB7IH0sXG4gICAgICAgICAgICBkZXN0cm95OiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLl9yZWFkZXIuaXNEZXN0cm95ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmVhZGVyLmRlc3Ryb3koKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZWFkKCkge1xuICAgICAgICB0aGlzLl9yZWFkZXIub25FcnJvcigoZXJyb3IpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX3N0cmVhbS5lbWl0KCdlcnJvcicsIGVycm9yKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuX3JlYWRlci5vbkVudHJ5KChlbnRyeSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fc3RyZWFtLnB1c2goZW50cnkpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5fcmVhZGVyLm9uRW5kKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX3N0cmVhbS5wdXNoKG51bGwpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5fcmVhZGVyLnJlYWQoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N0cmVhbTtcbiAgICB9XG59XG5leHBvcnRzLmRlZmF1bHQgPSBTdHJlYW1Qcm92aWRlcjtcbiIsICJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IGZzU2NhbmRpciA9IHJlcXVpcmUoXCJAbm9kZWxpYi9mcy5zY2FuZGlyXCIpO1xuY29uc3QgY29tbW9uID0gcmVxdWlyZShcIi4vY29tbW9uXCIpO1xuY29uc3QgcmVhZGVyXzEgPSByZXF1aXJlKFwiLi9yZWFkZXJcIik7XG5jbGFzcyBTeW5jUmVhZGVyIGV4dGVuZHMgcmVhZGVyXzEuZGVmYXVsdCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIHRoaXMuX3NjYW5kaXIgPSBmc1NjYW5kaXIuc2NhbmRpclN5bmM7XG4gICAgICAgIHRoaXMuX3N0b3JhZ2UgPSBbXTtcbiAgICAgICAgdGhpcy5fcXVldWUgPSBuZXcgU2V0KCk7XG4gICAgfVxuICAgIHJlYWQoKSB7XG4gICAgICAgIHRoaXMuX3B1c2hUb1F1ZXVlKHRoaXMuX3Jvb3QsIHRoaXMuX3NldHRpbmdzLmJhc2VQYXRoKTtcbiAgICAgICAgdGhpcy5faGFuZGxlUXVldWUoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N0b3JhZ2U7XG4gICAgfVxuICAgIF9wdXNoVG9RdWV1ZShkaXJlY3RvcnksIGJhc2UpIHtcbiAgICAgICAgdGhpcy5fcXVldWUuYWRkKHsgZGlyZWN0b3J5LCBiYXNlIH0pO1xuICAgIH1cbiAgICBfaGFuZGxlUXVldWUoKSB7XG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiB0aGlzLl9xdWV1ZS52YWx1ZXMoKSkge1xuICAgICAgICAgICAgdGhpcy5faGFuZGxlRGlyZWN0b3J5KGl0ZW0uZGlyZWN0b3J5LCBpdGVtLmJhc2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIF9oYW5kbGVEaXJlY3RvcnkoZGlyZWN0b3J5LCBiYXNlKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBlbnRyaWVzID0gdGhpcy5fc2NhbmRpcihkaXJlY3RvcnksIHRoaXMuX3NldHRpbmdzLmZzU2NhbmRpclNldHRpbmdzKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgICAgICAgICAgIHRoaXMuX2hhbmRsZUVudHJ5KGVudHJ5LCBiYXNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMuX2hhbmRsZUVycm9yKGVycm9yKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBfaGFuZGxlRXJyb3IoZXJyb3IpIHtcbiAgICAgICAgaWYgKCFjb21tb24uaXNGYXRhbEVycm9yKHRoaXMuX3NldHRpbmdzLCBlcnJvcikpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gICAgX2hhbmRsZUVudHJ5KGVudHJ5LCBiYXNlKSB7XG4gICAgICAgIGNvbnN0IGZ1bGxwYXRoID0gZW50cnkucGF0aDtcbiAgICAgICAgaWYgKGJhc2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZW50cnkucGF0aCA9IGNvbW1vbi5qb2luUGF0aFNlZ21lbnRzKGJhc2UsIGVudHJ5Lm5hbWUsIHRoaXMuX3NldHRpbmdzLnBhdGhTZWdtZW50U2VwYXJhdG9yKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29tbW9uLmlzQXBwbGllZEZpbHRlcih0aGlzLl9zZXR0aW5ncy5lbnRyeUZpbHRlciwgZW50cnkpKSB7XG4gICAgICAgICAgICB0aGlzLl9wdXNoVG9TdG9yYWdlKGVudHJ5KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZW50cnkuZGlyZW50LmlzRGlyZWN0b3J5KCkgJiYgY29tbW9uLmlzQXBwbGllZEZpbHRlcih0aGlzLl9zZXR0aW5ncy5kZWVwRmlsdGVyLCBlbnRyeSkpIHtcbiAgICAgICAgICAgIHRoaXMuX3B1c2hUb1F1ZXVlKGZ1bGxwYXRoLCBiYXNlID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBlbnRyeS5wYXRoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBfcHVzaFRvU3RvcmFnZShlbnRyeSkge1xuICAgICAgICB0aGlzLl9zdG9yYWdlLnB1c2goZW50cnkpO1xuICAgIH1cbn1cbmV4cG9ydHMuZGVmYXVsdCA9IFN5bmNSZWFkZXI7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5jb25zdCBzeW5jXzEgPSByZXF1aXJlKFwiLi4vcmVhZGVycy9zeW5jXCIpO1xuY2xhc3MgU3luY1Byb3ZpZGVyIHtcbiAgICBjb25zdHJ1Y3Rvcihfcm9vdCwgX3NldHRpbmdzKSB7XG4gICAgICAgIHRoaXMuX3Jvb3QgPSBfcm9vdDtcbiAgICAgICAgdGhpcy5fc2V0dGluZ3MgPSBfc2V0dGluZ3M7XG4gICAgICAgIHRoaXMuX3JlYWRlciA9IG5ldyBzeW5jXzEuZGVmYXVsdCh0aGlzLl9yb290LCB0aGlzLl9zZXR0aW5ncyk7XG4gICAgfVxuICAgIHJlYWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yZWFkZXIucmVhZCgpO1xuICAgIH1cbn1cbmV4cG9ydHMuZGVmYXVsdCA9IFN5bmNQcm92aWRlcjtcbiIsICJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IHBhdGggPSByZXF1aXJlKFwicGF0aFwiKTtcbmNvbnN0IGZzU2NhbmRpciA9IHJlcXVpcmUoXCJAbm9kZWxpYi9mcy5zY2FuZGlyXCIpO1xuY2xhc3MgU2V0dGluZ3Mge1xuICAgIGNvbnN0cnVjdG9yKF9vcHRpb25zID0ge30pIHtcbiAgICAgICAgdGhpcy5fb3B0aW9ucyA9IF9vcHRpb25zO1xuICAgICAgICB0aGlzLmJhc2VQYXRoID0gdGhpcy5fZ2V0VmFsdWUodGhpcy5fb3B0aW9ucy5iYXNlUGF0aCwgdW5kZWZpbmVkKTtcbiAgICAgICAgdGhpcy5jb25jdXJyZW5jeSA9IHRoaXMuX2dldFZhbHVlKHRoaXMuX29wdGlvbnMuY29uY3VycmVuY3ksIE51bWJlci5QT1NJVElWRV9JTkZJTklUWSk7XG4gICAgICAgIHRoaXMuZGVlcEZpbHRlciA9IHRoaXMuX2dldFZhbHVlKHRoaXMuX29wdGlvbnMuZGVlcEZpbHRlciwgbnVsbCk7XG4gICAgICAgIHRoaXMuZW50cnlGaWx0ZXIgPSB0aGlzLl9nZXRWYWx1ZSh0aGlzLl9vcHRpb25zLmVudHJ5RmlsdGVyLCBudWxsKTtcbiAgICAgICAgdGhpcy5lcnJvckZpbHRlciA9IHRoaXMuX2dldFZhbHVlKHRoaXMuX29wdGlvbnMuZXJyb3JGaWx0ZXIsIG51bGwpO1xuICAgICAgICB0aGlzLnBhdGhTZWdtZW50U2VwYXJhdG9yID0gdGhpcy5fZ2V0VmFsdWUodGhpcy5fb3B0aW9ucy5wYXRoU2VnbWVudFNlcGFyYXRvciwgcGF0aC5zZXApO1xuICAgICAgICB0aGlzLmZzU2NhbmRpclNldHRpbmdzID0gbmV3IGZzU2NhbmRpci5TZXR0aW5ncyh7XG4gICAgICAgICAgICBmb2xsb3dTeW1ib2xpY0xpbmtzOiB0aGlzLl9vcHRpb25zLmZvbGxvd1N5bWJvbGljTGlua3MsXG4gICAgICAgICAgICBmczogdGhpcy5fb3B0aW9ucy5mcyxcbiAgICAgICAgICAgIHBhdGhTZWdtZW50U2VwYXJhdG9yOiB0aGlzLl9vcHRpb25zLnBhdGhTZWdtZW50U2VwYXJhdG9yLFxuICAgICAgICAgICAgc3RhdHM6IHRoaXMuX29wdGlvbnMuc3RhdHMsXG4gICAgICAgICAgICB0aHJvd0Vycm9yT25Ccm9rZW5TeW1ib2xpY0xpbms6IHRoaXMuX29wdGlvbnMudGhyb3dFcnJvck9uQnJva2VuU3ltYm9saWNMaW5rXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBfZ2V0VmFsdWUob3B0aW9uLCB2YWx1ZSkge1xuICAgICAgICByZXR1cm4gb3B0aW9uICE9PSBudWxsICYmIG9wdGlvbiAhPT0gdm9pZCAwID8gb3B0aW9uIDogdmFsdWU7XG4gICAgfVxufVxuZXhwb3J0cy5kZWZhdWx0ID0gU2V0dGluZ3M7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLlNldHRpbmdzID0gZXhwb3J0cy53YWxrU3RyZWFtID0gZXhwb3J0cy53YWxrU3luYyA9IGV4cG9ydHMud2FsayA9IHZvaWQgMDtcbmNvbnN0IGFzeW5jXzEgPSByZXF1aXJlKFwiLi9wcm92aWRlcnMvYXN5bmNcIik7XG5jb25zdCBzdHJlYW1fMSA9IHJlcXVpcmUoXCIuL3Byb3ZpZGVycy9zdHJlYW1cIik7XG5jb25zdCBzeW5jXzEgPSByZXF1aXJlKFwiLi9wcm92aWRlcnMvc3luY1wiKTtcbmNvbnN0IHNldHRpbmdzXzEgPSByZXF1aXJlKFwiLi9zZXR0aW5nc1wiKTtcbmV4cG9ydHMuU2V0dGluZ3MgPSBzZXR0aW5nc18xLmRlZmF1bHQ7XG5mdW5jdGlvbiB3YWxrKGRpcmVjdG9yeSwgb3B0aW9uc09yU2V0dGluZ3NPckNhbGxiYWNrLCBjYWxsYmFjaykge1xuICAgIGlmICh0eXBlb2Ygb3B0aW9uc09yU2V0dGluZ3NPckNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIG5ldyBhc3luY18xLmRlZmF1bHQoZGlyZWN0b3J5LCBnZXRTZXR0aW5ncygpKS5yZWFkKG9wdGlvbnNPclNldHRpbmdzT3JDYWxsYmFjayk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbmV3IGFzeW5jXzEuZGVmYXVsdChkaXJlY3RvcnksIGdldFNldHRpbmdzKG9wdGlvbnNPclNldHRpbmdzT3JDYWxsYmFjaykpLnJlYWQoY2FsbGJhY2spO1xufVxuZXhwb3J0cy53YWxrID0gd2FsaztcbmZ1bmN0aW9uIHdhbGtTeW5jKGRpcmVjdG9yeSwgb3B0aW9uc09yU2V0dGluZ3MpIHtcbiAgICBjb25zdCBzZXR0aW5ncyA9IGdldFNldHRpbmdzKG9wdGlvbnNPclNldHRpbmdzKTtcbiAgICBjb25zdCBwcm92aWRlciA9IG5ldyBzeW5jXzEuZGVmYXVsdChkaXJlY3RvcnksIHNldHRpbmdzKTtcbiAgICByZXR1cm4gcHJvdmlkZXIucmVhZCgpO1xufVxuZXhwb3J0cy53YWxrU3luYyA9IHdhbGtTeW5jO1xuZnVuY3Rpb24gd2Fsa1N0cmVhbShkaXJlY3RvcnksIG9wdGlvbnNPclNldHRpbmdzKSB7XG4gICAgY29uc3Qgc2V0dGluZ3MgPSBnZXRTZXR0aW5ncyhvcHRpb25zT3JTZXR0aW5ncyk7XG4gICAgY29uc3QgcHJvdmlkZXIgPSBuZXcgc3RyZWFtXzEuZGVmYXVsdChkaXJlY3RvcnksIHNldHRpbmdzKTtcbiAgICByZXR1cm4gcHJvdmlkZXIucmVhZCgpO1xufVxuZXhwb3J0cy53YWxrU3RyZWFtID0gd2Fsa1N0cmVhbTtcbmZ1bmN0aW9uIGdldFNldHRpbmdzKHNldHRpbmdzT3JPcHRpb25zID0ge30pIHtcbiAgICBpZiAoc2V0dGluZ3NPck9wdGlvbnMgaW5zdGFuY2VvZiBzZXR0aW5nc18xLmRlZmF1bHQpIHtcbiAgICAgICAgcmV0dXJuIHNldHRpbmdzT3JPcHRpb25zO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IHNldHRpbmdzXzEuZGVmYXVsdChzZXR0aW5nc09yT3B0aW9ucyk7XG59XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5jb25zdCBwYXRoID0gcmVxdWlyZShcInBhdGhcIik7XG5jb25zdCBmc1N0YXQgPSByZXF1aXJlKFwiQG5vZGVsaWIvZnMuc3RhdFwiKTtcbmNvbnN0IHV0aWxzID0gcmVxdWlyZShcIi4uL3V0aWxzXCIpO1xuY2xhc3MgUmVhZGVyIHtcbiAgICBjb25zdHJ1Y3Rvcihfc2V0dGluZ3MpIHtcbiAgICAgICAgdGhpcy5fc2V0dGluZ3MgPSBfc2V0dGluZ3M7XG4gICAgICAgIHRoaXMuX2ZzU3RhdFNldHRpbmdzID0gbmV3IGZzU3RhdC5TZXR0aW5ncyh7XG4gICAgICAgICAgICBmb2xsb3dTeW1ib2xpY0xpbms6IHRoaXMuX3NldHRpbmdzLmZvbGxvd1N5bWJvbGljTGlua3MsXG4gICAgICAgICAgICBmczogdGhpcy5fc2V0dGluZ3MuZnMsXG4gICAgICAgICAgICB0aHJvd0Vycm9yT25Ccm9rZW5TeW1ib2xpY0xpbms6IHRoaXMuX3NldHRpbmdzLmZvbGxvd1N5bWJvbGljTGlua3NcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIF9nZXRGdWxsRW50cnlQYXRoKGZpbGVwYXRoKSB7XG4gICAgICAgIHJldHVybiBwYXRoLnJlc29sdmUodGhpcy5fc2V0dGluZ3MuY3dkLCBmaWxlcGF0aCk7XG4gICAgfVxuICAgIF9tYWtlRW50cnkoc3RhdHMsIHBhdHRlcm4pIHtcbiAgICAgICAgY29uc3QgZW50cnkgPSB7XG4gICAgICAgICAgICBuYW1lOiBwYXR0ZXJuLFxuICAgICAgICAgICAgcGF0aDogcGF0dGVybixcbiAgICAgICAgICAgIGRpcmVudDogdXRpbHMuZnMuY3JlYXRlRGlyZW50RnJvbVN0YXRzKHBhdHRlcm4sIHN0YXRzKVxuICAgICAgICB9O1xuICAgICAgICBpZiAodGhpcy5fc2V0dGluZ3Muc3RhdHMpIHtcbiAgICAgICAgICAgIGVudHJ5LnN0YXRzID0gc3RhdHM7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVudHJ5O1xuICAgIH1cbiAgICBfaXNGYXRhbEVycm9yKGVycm9yKSB7XG4gICAgICAgIHJldHVybiAhdXRpbHMuZXJybm8uaXNFbm9lbnRDb2RlRXJyb3IoZXJyb3IpICYmICF0aGlzLl9zZXR0aW5ncy5zdXBwcmVzc0Vycm9ycztcbiAgICB9XG59XG5leHBvcnRzLmRlZmF1bHQgPSBSZWFkZXI7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5jb25zdCBzdHJlYW1fMSA9IHJlcXVpcmUoXCJzdHJlYW1cIik7XG5jb25zdCBmc1N0YXQgPSByZXF1aXJlKFwiQG5vZGVsaWIvZnMuc3RhdFwiKTtcbmNvbnN0IGZzV2FsayA9IHJlcXVpcmUoXCJAbm9kZWxpYi9mcy53YWxrXCIpO1xuY29uc3QgcmVhZGVyXzEgPSByZXF1aXJlKFwiLi9yZWFkZXJcIik7XG5jbGFzcyBSZWFkZXJTdHJlYW0gZXh0ZW5kcyByZWFkZXJfMS5kZWZhdWx0IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICAgICAgdGhpcy5fd2Fsa1N0cmVhbSA9IGZzV2Fsay53YWxrU3RyZWFtO1xuICAgICAgICB0aGlzLl9zdGF0ID0gZnNTdGF0LnN0YXQ7XG4gICAgfVxuICAgIGR5bmFtaWMocm9vdCwgb3B0aW9ucykge1xuICAgICAgICByZXR1cm4gdGhpcy5fd2Fsa1N0cmVhbShyb290LCBvcHRpb25zKTtcbiAgICB9XG4gICAgc3RhdGljKHBhdHRlcm5zLCBvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IGZpbGVwYXRocyA9IHBhdHRlcm5zLm1hcCh0aGlzLl9nZXRGdWxsRW50cnlQYXRoLCB0aGlzKTtcbiAgICAgICAgY29uc3Qgc3RyZWFtID0gbmV3IHN0cmVhbV8xLlBhc3NUaHJvdWdoKHsgb2JqZWN0TW9kZTogdHJ1ZSB9KTtcbiAgICAgICAgc3RyZWFtLl93cml0ZSA9IChpbmRleCwgX2VuYywgZG9uZSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2dldEVudHJ5KGZpbGVwYXRoc1tpbmRleF0sIHBhdHRlcm5zW2luZGV4XSwgb3B0aW9ucylcbiAgICAgICAgICAgICAgICAudGhlbigoZW50cnkpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZW50cnkgIT09IG51bGwgJiYgb3B0aW9ucy5lbnRyeUZpbHRlcihlbnRyeSkpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goZW50cnkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoaW5kZXggPT09IGZpbGVwYXRocy5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5lbmQoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZG9uZSgpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAuY2F0Y2goZG9uZSk7XG4gICAgICAgIH07XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZmlsZXBhdGhzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBzdHJlYW0ud3JpdGUoaSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN0cmVhbTtcbiAgICB9XG4gICAgX2dldEVudHJ5KGZpbGVwYXRoLCBwYXR0ZXJuLCBvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRTdGF0KGZpbGVwYXRoKVxuICAgICAgICAgICAgLnRoZW4oKHN0YXRzKSA9PiB0aGlzLl9tYWtlRW50cnkoc3RhdHMsIHBhdHRlcm4pKVxuICAgICAgICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMuZXJyb3JGaWx0ZXIoZXJyb3IpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIF9nZXRTdGF0KGZpbGVwYXRoKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9zdGF0KGZpbGVwYXRoLCB0aGlzLl9mc1N0YXRTZXR0aW5ncywgKGVycm9yLCBzdGF0cykgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBlcnJvciA9PT0gbnVsbCA/IHJlc29sdmUoc3RhdHMpIDogcmVqZWN0KGVycm9yKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG59XG5leHBvcnRzLmRlZmF1bHQgPSBSZWFkZXJTdHJlYW07XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5jb25zdCBmc1dhbGsgPSByZXF1aXJlKFwiQG5vZGVsaWIvZnMud2Fsa1wiKTtcbmNvbnN0IHJlYWRlcl8xID0gcmVxdWlyZShcIi4vcmVhZGVyXCIpO1xuY29uc3Qgc3RyZWFtXzEgPSByZXF1aXJlKFwiLi9zdHJlYW1cIik7XG5jbGFzcyBSZWFkZXJBc3luYyBleHRlbmRzIHJlYWRlcl8xLmRlZmF1bHQge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgICAgICB0aGlzLl93YWxrQXN5bmMgPSBmc1dhbGsud2FsaztcbiAgICAgICAgdGhpcy5fcmVhZGVyU3RyZWFtID0gbmV3IHN0cmVhbV8xLmRlZmF1bHQodGhpcy5fc2V0dGluZ3MpO1xuICAgIH1cbiAgICBkeW5hbWljKHJvb3QsIG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX3dhbGtBc3luYyhyb290LCBvcHRpb25zLCAoZXJyb3IsIGVudHJpZXMpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyb3IgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShlbnRyaWVzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBhc3luYyBzdGF0aWMocGF0dGVybnMsIG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgZW50cmllcyA9IFtdO1xuICAgICAgICBjb25zdCBzdHJlYW0gPSB0aGlzLl9yZWFkZXJTdHJlYW0uc3RhdGljKHBhdHRlcm5zLCBvcHRpb25zKTtcbiAgICAgICAgLy8gQWZ0ZXIgIzIzNSwgcmVwbGFjZSBpdCB3aXRoIGFuIGFzeW5jaHJvbm91cyBpdGVyYXRvci5cbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIHN0cmVhbS5vbmNlKCdlcnJvcicsIHJlamVjdCk7XG4gICAgICAgICAgICBzdHJlYW0ub24oJ2RhdGEnLCAoZW50cnkpID0+IGVudHJpZXMucHVzaChlbnRyeSkpO1xuICAgICAgICAgICAgc3RyZWFtLm9uY2UoJ2VuZCcsICgpID0+IHJlc29sdmUoZW50cmllcykpO1xuICAgICAgICB9KTtcbiAgICB9XG59XG5leHBvcnRzLmRlZmF1bHQgPSBSZWFkZXJBc3luYztcbiIsICJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IHV0aWxzID0gcmVxdWlyZShcIi4uLy4uL3V0aWxzXCIpO1xuY2xhc3MgTWF0Y2hlciB7XG4gICAgY29uc3RydWN0b3IoX3BhdHRlcm5zLCBfc2V0dGluZ3MsIF9taWNyb21hdGNoT3B0aW9ucykge1xuICAgICAgICB0aGlzLl9wYXR0ZXJucyA9IF9wYXR0ZXJucztcbiAgICAgICAgdGhpcy5fc2V0dGluZ3MgPSBfc2V0dGluZ3M7XG4gICAgICAgIHRoaXMuX21pY3JvbWF0Y2hPcHRpb25zID0gX21pY3JvbWF0Y2hPcHRpb25zO1xuICAgICAgICB0aGlzLl9zdG9yYWdlID0gW107XG4gICAgICAgIHRoaXMuX2ZpbGxTdG9yYWdlKCk7XG4gICAgfVxuICAgIF9maWxsU3RvcmFnZSgpIHtcbiAgICAgICAgZm9yIChjb25zdCBwYXR0ZXJuIG9mIHRoaXMuX3BhdHRlcm5zKSB7XG4gICAgICAgICAgICBjb25zdCBzZWdtZW50cyA9IHRoaXMuX2dldFBhdHRlcm5TZWdtZW50cyhwYXR0ZXJuKTtcbiAgICAgICAgICAgIGNvbnN0IHNlY3Rpb25zID0gdGhpcy5fc3BsaXRTZWdtZW50c0ludG9TZWN0aW9ucyhzZWdtZW50cyk7XG4gICAgICAgICAgICB0aGlzLl9zdG9yYWdlLnB1c2goe1xuICAgICAgICAgICAgICAgIGNvbXBsZXRlOiBzZWN0aW9ucy5sZW5ndGggPD0gMSxcbiAgICAgICAgICAgICAgICBwYXR0ZXJuLFxuICAgICAgICAgICAgICAgIHNlZ21lbnRzLFxuICAgICAgICAgICAgICAgIHNlY3Rpb25zXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBfZ2V0UGF0dGVyblNlZ21lbnRzKHBhdHRlcm4pIHtcbiAgICAgICAgY29uc3QgcGFydHMgPSB1dGlscy5wYXR0ZXJuLmdldFBhdHRlcm5QYXJ0cyhwYXR0ZXJuLCB0aGlzLl9taWNyb21hdGNoT3B0aW9ucyk7XG4gICAgICAgIHJldHVybiBwYXJ0cy5tYXAoKHBhcnQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGR5bmFtaWMgPSB1dGlscy5wYXR0ZXJuLmlzRHluYW1pY1BhdHRlcm4ocGFydCwgdGhpcy5fc2V0dGluZ3MpO1xuICAgICAgICAgICAgaWYgKCFkeW5hbWljKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgZHluYW1pYzogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIHBhdHRlcm46IHBhcnRcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBkeW5hbWljOiB0cnVlLFxuICAgICAgICAgICAgICAgIHBhdHRlcm46IHBhcnQsXG4gICAgICAgICAgICAgICAgcGF0dGVyblJlOiB1dGlscy5wYXR0ZXJuLm1ha2VSZShwYXJ0LCB0aGlzLl9taWNyb21hdGNoT3B0aW9ucylcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBfc3BsaXRTZWdtZW50c0ludG9TZWN0aW9ucyhzZWdtZW50cykge1xuICAgICAgICByZXR1cm4gdXRpbHMuYXJyYXkuc3BsaXRXaGVuKHNlZ21lbnRzLCAoc2VnbWVudCkgPT4gc2VnbWVudC5keW5hbWljICYmIHV0aWxzLnBhdHRlcm4uaGFzR2xvYlN0YXIoc2VnbWVudC5wYXR0ZXJuKSk7XG4gICAgfVxufVxuZXhwb3J0cy5kZWZhdWx0ID0gTWF0Y2hlcjtcbiIsICJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IG1hdGNoZXJfMSA9IHJlcXVpcmUoXCIuL21hdGNoZXJcIik7XG5jbGFzcyBQYXJ0aWFsTWF0Y2hlciBleHRlbmRzIG1hdGNoZXJfMS5kZWZhdWx0IHtcbiAgICBtYXRjaChmaWxlcGF0aCkge1xuICAgICAgICBjb25zdCBwYXJ0cyA9IGZpbGVwYXRoLnNwbGl0KCcvJyk7XG4gICAgICAgIGNvbnN0IGxldmVscyA9IHBhcnRzLmxlbmd0aDtcbiAgICAgICAgY29uc3QgcGF0dGVybnMgPSB0aGlzLl9zdG9yYWdlLmZpbHRlcigoaW5mbykgPT4gIWluZm8uY29tcGxldGUgfHwgaW5mby5zZWdtZW50cy5sZW5ndGggPiBsZXZlbHMpO1xuICAgICAgICBmb3IgKGNvbnN0IHBhdHRlcm4gb2YgcGF0dGVybnMpIHtcbiAgICAgICAgICAgIGNvbnN0IHNlY3Rpb24gPSBwYXR0ZXJuLnNlY3Rpb25zWzBdO1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBJbiB0aGlzIGNhc2UsIHRoZSBwYXR0ZXJuIGhhcyBhIGdsb2JzdGFyIGFuZCB3ZSBtdXN0IHJlYWQgYWxsIGRpcmVjdG9yaWVzIHVuY29uZGl0aW9uYWxseSxcbiAgICAgICAgICAgICAqIGJ1dCBvbmx5IGlmIHRoZSBsZXZlbCBoYXMgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBmaXJzdCBncm91cC5cbiAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgKiBmaXh0dXJlcy97YSxifS8qKlxuICAgICAgICAgICAgICogIF4gdHJ1ZS9mYWxzZSAgXiBhbHdheXMgdHJ1ZVxuICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGlmICghcGF0dGVybi5jb21wbGV0ZSAmJiBsZXZlbHMgPiBzZWN0aW9uLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSBwYXJ0cy5ldmVyeSgocGFydCwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBzZWdtZW50ID0gcGF0dGVybi5zZWdtZW50c1tpbmRleF07XG4gICAgICAgICAgICAgICAgaWYgKHNlZ21lbnQuZHluYW1pYyAmJiBzZWdtZW50LnBhdHRlcm5SZS50ZXN0KHBhcnQpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIXNlZ21lbnQuZHluYW1pYyAmJiBzZWdtZW50LnBhdHRlcm4gPT09IHBhcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn1cbmV4cG9ydHMuZGVmYXVsdCA9IFBhcnRpYWxNYXRjaGVyO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuY29uc3QgdXRpbHMgPSByZXF1aXJlKFwiLi4vLi4vdXRpbHNcIik7XG5jb25zdCBwYXJ0aWFsXzEgPSByZXF1aXJlKFwiLi4vbWF0Y2hlcnMvcGFydGlhbFwiKTtcbmNsYXNzIERlZXBGaWx0ZXIge1xuICAgIGNvbnN0cnVjdG9yKF9zZXR0aW5ncywgX21pY3JvbWF0Y2hPcHRpb25zKSB7XG4gICAgICAgIHRoaXMuX3NldHRpbmdzID0gX3NldHRpbmdzO1xuICAgICAgICB0aGlzLl9taWNyb21hdGNoT3B0aW9ucyA9IF9taWNyb21hdGNoT3B0aW9ucztcbiAgICB9XG4gICAgZ2V0RmlsdGVyKGJhc2VQYXRoLCBwb3NpdGl2ZSwgbmVnYXRpdmUpIHtcbiAgICAgICAgY29uc3QgbWF0Y2hlciA9IHRoaXMuX2dldE1hdGNoZXIocG9zaXRpdmUpO1xuICAgICAgICBjb25zdCBuZWdhdGl2ZVJlID0gdGhpcy5fZ2V0TmVnYXRpdmVQYXR0ZXJuc1JlKG5lZ2F0aXZlKTtcbiAgICAgICAgcmV0dXJuIChlbnRyeSkgPT4gdGhpcy5fZmlsdGVyKGJhc2VQYXRoLCBlbnRyeSwgbWF0Y2hlciwgbmVnYXRpdmVSZSk7XG4gICAgfVxuICAgIF9nZXRNYXRjaGVyKHBhdHRlcm5zKSB7XG4gICAgICAgIHJldHVybiBuZXcgcGFydGlhbF8xLmRlZmF1bHQocGF0dGVybnMsIHRoaXMuX3NldHRpbmdzLCB0aGlzLl9taWNyb21hdGNoT3B0aW9ucyk7XG4gICAgfVxuICAgIF9nZXROZWdhdGl2ZVBhdHRlcm5zUmUocGF0dGVybnMpIHtcbiAgICAgICAgY29uc3QgYWZmZWN0RGVwdGhPZlJlYWRpbmdQYXR0ZXJucyA9IHBhdHRlcm5zLmZpbHRlcih1dGlscy5wYXR0ZXJuLmlzQWZmZWN0RGVwdGhPZlJlYWRpbmdQYXR0ZXJuKTtcbiAgICAgICAgcmV0dXJuIHV0aWxzLnBhdHRlcm4uY29udmVydFBhdHRlcm5zVG9SZShhZmZlY3REZXB0aE9mUmVhZGluZ1BhdHRlcm5zLCB0aGlzLl9taWNyb21hdGNoT3B0aW9ucyk7XG4gICAgfVxuICAgIF9maWx0ZXIoYmFzZVBhdGgsIGVudHJ5LCBtYXRjaGVyLCBuZWdhdGl2ZVJlKSB7XG4gICAgICAgIGlmICh0aGlzLl9pc1NraXBwZWRCeURlZXAoYmFzZVBhdGgsIGVudHJ5LnBhdGgpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX2lzU2tpcHBlZFN5bWJvbGljTGluayhlbnRyeSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBmaWxlcGF0aCA9IHV0aWxzLnBhdGgucmVtb3ZlTGVhZGluZ0RvdFNlZ21lbnQoZW50cnkucGF0aCk7XG4gICAgICAgIGlmICh0aGlzLl9pc1NraXBwZWRCeVBvc2l0aXZlUGF0dGVybnMoZmlsZXBhdGgsIG1hdGNoZXIpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2lzU2tpcHBlZEJ5TmVnYXRpdmVQYXR0ZXJucyhmaWxlcGF0aCwgbmVnYXRpdmVSZSk7XG4gICAgfVxuICAgIF9pc1NraXBwZWRCeURlZXAoYmFzZVBhdGgsIGVudHJ5UGF0aCkge1xuICAgICAgICAvKipcbiAgICAgICAgICogQXZvaWQgdW5uZWNlc3NhcnkgZGVwdGggY2FsY3VsYXRpb25zIHdoZW4gaXQgZG9lc24ndCBtYXR0ZXIuXG4gICAgICAgICAqL1xuICAgICAgICBpZiAodGhpcy5fc2V0dGluZ3MuZGVlcCA9PT0gSW5maW5pdHkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0RW50cnlMZXZlbChiYXNlUGF0aCwgZW50cnlQYXRoKSA+PSB0aGlzLl9zZXR0aW5ncy5kZWVwO1xuICAgIH1cbiAgICBfZ2V0RW50cnlMZXZlbChiYXNlUGF0aCwgZW50cnlQYXRoKSB7XG4gICAgICAgIGNvbnN0IGVudHJ5UGF0aERlcHRoID0gZW50cnlQYXRoLnNwbGl0KCcvJykubGVuZ3RoO1xuICAgICAgICBpZiAoYmFzZVBhdGggPT09ICcnKSB7XG4gICAgICAgICAgICByZXR1cm4gZW50cnlQYXRoRGVwdGg7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYmFzZVBhdGhEZXB0aCA9IGJhc2VQYXRoLnNwbGl0KCcvJykubGVuZ3RoO1xuICAgICAgICByZXR1cm4gZW50cnlQYXRoRGVwdGggLSBiYXNlUGF0aERlcHRoO1xuICAgIH1cbiAgICBfaXNTa2lwcGVkU3ltYm9saWNMaW5rKGVudHJ5KSB7XG4gICAgICAgIHJldHVybiAhdGhpcy5fc2V0dGluZ3MuZm9sbG93U3ltYm9saWNMaW5rcyAmJiBlbnRyeS5kaXJlbnQuaXNTeW1ib2xpY0xpbmsoKTtcbiAgICB9XG4gICAgX2lzU2tpcHBlZEJ5UG9zaXRpdmVQYXR0ZXJucyhlbnRyeVBhdGgsIG1hdGNoZXIpIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLl9zZXR0aW5ncy5iYXNlTmFtZU1hdGNoICYmICFtYXRjaGVyLm1hdGNoKGVudHJ5UGF0aCk7XG4gICAgfVxuICAgIF9pc1NraXBwZWRCeU5lZ2F0aXZlUGF0dGVybnMoZW50cnlQYXRoLCBwYXR0ZXJuc1JlKSB7XG4gICAgICAgIHJldHVybiAhdXRpbHMucGF0dGVybi5tYXRjaEFueShlbnRyeVBhdGgsIHBhdHRlcm5zUmUpO1xuICAgIH1cbn1cbmV4cG9ydHMuZGVmYXVsdCA9IERlZXBGaWx0ZXI7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5jb25zdCB1dGlscyA9IHJlcXVpcmUoXCIuLi8uLi91dGlsc1wiKTtcbmNsYXNzIEVudHJ5RmlsdGVyIHtcbiAgICBjb25zdHJ1Y3Rvcihfc2V0dGluZ3MsIF9taWNyb21hdGNoT3B0aW9ucykge1xuICAgICAgICB0aGlzLl9zZXR0aW5ncyA9IF9zZXR0aW5ncztcbiAgICAgICAgdGhpcy5fbWljcm9tYXRjaE9wdGlvbnMgPSBfbWljcm9tYXRjaE9wdGlvbnM7XG4gICAgICAgIHRoaXMuaW5kZXggPSBuZXcgTWFwKCk7XG4gICAgfVxuICAgIGdldEZpbHRlcihwb3NpdGl2ZSwgbmVnYXRpdmUpIHtcbiAgICAgICAgY29uc3QgcG9zaXRpdmVSZSA9IHV0aWxzLnBhdHRlcm4uY29udmVydFBhdHRlcm5zVG9SZShwb3NpdGl2ZSwgdGhpcy5fbWljcm9tYXRjaE9wdGlvbnMpO1xuICAgICAgICBjb25zdCBuZWdhdGl2ZVJlID0gdXRpbHMucGF0dGVybi5jb252ZXJ0UGF0dGVybnNUb1JlKG5lZ2F0aXZlLCBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHRoaXMuX21pY3JvbWF0Y2hPcHRpb25zKSwgeyBkb3Q6IHRydWUgfSkpO1xuICAgICAgICByZXR1cm4gKGVudHJ5KSA9PiB0aGlzLl9maWx0ZXIoZW50cnksIHBvc2l0aXZlUmUsIG5lZ2F0aXZlUmUpO1xuICAgIH1cbiAgICBfZmlsdGVyKGVudHJ5LCBwb3NpdGl2ZVJlLCBuZWdhdGl2ZVJlKSB7XG4gICAgICAgIGNvbnN0IGZpbGVwYXRoID0gdXRpbHMucGF0aC5yZW1vdmVMZWFkaW5nRG90U2VnbWVudChlbnRyeS5wYXRoKTtcbiAgICAgICAgaWYgKHRoaXMuX3NldHRpbmdzLnVuaXF1ZSAmJiB0aGlzLl9pc0R1cGxpY2F0ZUVudHJ5KGZpbGVwYXRoKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9vbmx5RmlsZUZpbHRlcihlbnRyeSkgfHwgdGhpcy5fb25seURpcmVjdG9yeUZpbHRlcihlbnRyeSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5faXNTa2lwcGVkQnlBYnNvbHV0ZU5lZ2F0aXZlUGF0dGVybnMoZmlsZXBhdGgsIG5lZ2F0aXZlUmUpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaXNEaXJlY3RvcnkgPSBlbnRyeS5kaXJlbnQuaXNEaXJlY3RvcnkoKTtcbiAgICAgICAgY29uc3QgaXNNYXRjaGVkID0gdGhpcy5faXNNYXRjaFRvUGF0dGVybnMoZmlsZXBhdGgsIHBvc2l0aXZlUmUsIGlzRGlyZWN0b3J5KSAmJiAhdGhpcy5faXNNYXRjaFRvUGF0dGVybnMoZmlsZXBhdGgsIG5lZ2F0aXZlUmUsIGlzRGlyZWN0b3J5KTtcbiAgICAgICAgaWYgKHRoaXMuX3NldHRpbmdzLnVuaXF1ZSAmJiBpc01hdGNoZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX2NyZWF0ZUluZGV4UmVjb3JkKGZpbGVwYXRoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXNNYXRjaGVkO1xuICAgIH1cbiAgICBfaXNEdXBsaWNhdGVFbnRyeShmaWxlcGF0aCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pbmRleC5oYXMoZmlsZXBhdGgpO1xuICAgIH1cbiAgICBfY3JlYXRlSW5kZXhSZWNvcmQoZmlsZXBhdGgpIHtcbiAgICAgICAgdGhpcy5pbmRleC5zZXQoZmlsZXBhdGgsIHVuZGVmaW5lZCk7XG4gICAgfVxuICAgIF9vbmx5RmlsZUZpbHRlcihlbnRyeSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2V0dGluZ3Mub25seUZpbGVzICYmICFlbnRyeS5kaXJlbnQuaXNGaWxlKCk7XG4gICAgfVxuICAgIF9vbmx5RGlyZWN0b3J5RmlsdGVyKGVudHJ5KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zZXR0aW5ncy5vbmx5RGlyZWN0b3JpZXMgJiYgIWVudHJ5LmRpcmVudC5pc0RpcmVjdG9yeSgpO1xuICAgIH1cbiAgICBfaXNTa2lwcGVkQnlBYnNvbHV0ZU5lZ2F0aXZlUGF0dGVybnMoZW50cnlQYXRoLCBwYXR0ZXJuc1JlKSB7XG4gICAgICAgIGlmICghdGhpcy5fc2V0dGluZ3MuYWJzb2x1dGUpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBmdWxscGF0aCA9IHV0aWxzLnBhdGgubWFrZUFic29sdXRlKHRoaXMuX3NldHRpbmdzLmN3ZCwgZW50cnlQYXRoKTtcbiAgICAgICAgcmV0dXJuIHV0aWxzLnBhdHRlcm4ubWF0Y2hBbnkoZnVsbHBhdGgsIHBhdHRlcm5zUmUpO1xuICAgIH1cbiAgICBfaXNNYXRjaFRvUGF0dGVybnMoZmlsZXBhdGgsIHBhdHRlcm5zUmUsIGlzRGlyZWN0b3J5KSB7XG4gICAgICAgIC8vIFRyeWluZyB0byBtYXRjaCBmaWxlcyBhbmQgZGlyZWN0b3JpZXMgYnkgcGF0dGVybnMuXG4gICAgICAgIGNvbnN0IGlzTWF0Y2hlZCA9IHV0aWxzLnBhdHRlcm4ubWF0Y2hBbnkoZmlsZXBhdGgsIHBhdHRlcm5zUmUpO1xuICAgICAgICAvLyBBIHBhdHRlcm4gd2l0aCBhIHRyYWlsbGluZyBzbGFzaCBjYW4gYmUgdXNlZCBmb3IgZGlyZWN0b3J5IG1hdGNoaW5nLlxuICAgICAgICAvLyBUbyBhcHBseSBzdWNoIHBhdHRlcm4sIHdlIG5lZWQgdG8gYWRkIGEgdHJhbGxpbmcgc2xhc2ggdG8gdGhlIHBhdGguXG4gICAgICAgIGlmICghaXNNYXRjaGVkICYmIGlzRGlyZWN0b3J5KSB7XG4gICAgICAgICAgICByZXR1cm4gdXRpbHMucGF0dGVybi5tYXRjaEFueShmaWxlcGF0aCArICcvJywgcGF0dGVybnNSZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGlzTWF0Y2hlZDtcbiAgICB9XG59XG5leHBvcnRzLmRlZmF1bHQgPSBFbnRyeUZpbHRlcjtcbiIsICJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IHV0aWxzID0gcmVxdWlyZShcIi4uLy4uL3V0aWxzXCIpO1xuY2xhc3MgRXJyb3JGaWx0ZXIge1xuICAgIGNvbnN0cnVjdG9yKF9zZXR0aW5ncykge1xuICAgICAgICB0aGlzLl9zZXR0aW5ncyA9IF9zZXR0aW5ncztcbiAgICB9XG4gICAgZ2V0RmlsdGVyKCkge1xuICAgICAgICByZXR1cm4gKGVycm9yKSA9PiB0aGlzLl9pc05vbkZhdGFsRXJyb3IoZXJyb3IpO1xuICAgIH1cbiAgICBfaXNOb25GYXRhbEVycm9yKGVycm9yKSB7XG4gICAgICAgIHJldHVybiB1dGlscy5lcnJuby5pc0Vub2VudENvZGVFcnJvcihlcnJvcikgfHwgdGhpcy5fc2V0dGluZ3Muc3VwcHJlc3NFcnJvcnM7XG4gICAgfVxufVxuZXhwb3J0cy5kZWZhdWx0ID0gRXJyb3JGaWx0ZXI7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5jb25zdCB1dGlscyA9IHJlcXVpcmUoXCIuLi8uLi91dGlsc1wiKTtcbmNsYXNzIEVudHJ5VHJhbnNmb3JtZXIge1xuICAgIGNvbnN0cnVjdG9yKF9zZXR0aW5ncykge1xuICAgICAgICB0aGlzLl9zZXR0aW5ncyA9IF9zZXR0aW5ncztcbiAgICB9XG4gICAgZ2V0VHJhbnNmb3JtZXIoKSB7XG4gICAgICAgIHJldHVybiAoZW50cnkpID0+IHRoaXMuX3RyYW5zZm9ybShlbnRyeSk7XG4gICAgfVxuICAgIF90cmFuc2Zvcm0oZW50cnkpIHtcbiAgICAgICAgbGV0IGZpbGVwYXRoID0gZW50cnkucGF0aDtcbiAgICAgICAgaWYgKHRoaXMuX3NldHRpbmdzLmFic29sdXRlKSB7XG4gICAgICAgICAgICBmaWxlcGF0aCA9IHV0aWxzLnBhdGgubWFrZUFic29sdXRlKHRoaXMuX3NldHRpbmdzLmN3ZCwgZmlsZXBhdGgpO1xuICAgICAgICAgICAgZmlsZXBhdGggPSB1dGlscy5wYXRoLnVuaXhpZnkoZmlsZXBhdGgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9zZXR0aW5ncy5tYXJrRGlyZWN0b3JpZXMgJiYgZW50cnkuZGlyZW50LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgICAgICAgIGZpbGVwYXRoICs9ICcvJztcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuX3NldHRpbmdzLm9iamVjdE1vZGUpIHtcbiAgICAgICAgICAgIHJldHVybiBmaWxlcGF0aDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBlbnRyeSksIHsgcGF0aDogZmlsZXBhdGggfSk7XG4gICAgfVxufVxuZXhwb3J0cy5kZWZhdWx0ID0gRW50cnlUcmFuc2Zvcm1lcjtcbiIsICJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IHBhdGggPSByZXF1aXJlKFwicGF0aFwiKTtcbmNvbnN0IGRlZXBfMSA9IHJlcXVpcmUoXCIuL2ZpbHRlcnMvZGVlcFwiKTtcbmNvbnN0IGVudHJ5XzEgPSByZXF1aXJlKFwiLi9maWx0ZXJzL2VudHJ5XCIpO1xuY29uc3QgZXJyb3JfMSA9IHJlcXVpcmUoXCIuL2ZpbHRlcnMvZXJyb3JcIik7XG5jb25zdCBlbnRyeV8yID0gcmVxdWlyZShcIi4vdHJhbnNmb3JtZXJzL2VudHJ5XCIpO1xuY2xhc3MgUHJvdmlkZXIge1xuICAgIGNvbnN0cnVjdG9yKF9zZXR0aW5ncykge1xuICAgICAgICB0aGlzLl9zZXR0aW5ncyA9IF9zZXR0aW5ncztcbiAgICAgICAgdGhpcy5lcnJvckZpbHRlciA9IG5ldyBlcnJvcl8xLmRlZmF1bHQodGhpcy5fc2V0dGluZ3MpO1xuICAgICAgICB0aGlzLmVudHJ5RmlsdGVyID0gbmV3IGVudHJ5XzEuZGVmYXVsdCh0aGlzLl9zZXR0aW5ncywgdGhpcy5fZ2V0TWljcm9tYXRjaE9wdGlvbnMoKSk7XG4gICAgICAgIHRoaXMuZGVlcEZpbHRlciA9IG5ldyBkZWVwXzEuZGVmYXVsdCh0aGlzLl9zZXR0aW5ncywgdGhpcy5fZ2V0TWljcm9tYXRjaE9wdGlvbnMoKSk7XG4gICAgICAgIHRoaXMuZW50cnlUcmFuc2Zvcm1lciA9IG5ldyBlbnRyeV8yLmRlZmF1bHQodGhpcy5fc2V0dGluZ3MpO1xuICAgIH1cbiAgICBfZ2V0Um9vdERpcmVjdG9yeSh0YXNrKSB7XG4gICAgICAgIHJldHVybiBwYXRoLnJlc29sdmUodGhpcy5fc2V0dGluZ3MuY3dkLCB0YXNrLmJhc2UpO1xuICAgIH1cbiAgICBfZ2V0UmVhZGVyT3B0aW9ucyh0YXNrKSB7XG4gICAgICAgIGNvbnN0IGJhc2VQYXRoID0gdGFzay5iYXNlID09PSAnLicgPyAnJyA6IHRhc2suYmFzZTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGJhc2VQYXRoLFxuICAgICAgICAgICAgcGF0aFNlZ21lbnRTZXBhcmF0b3I6ICcvJyxcbiAgICAgICAgICAgIGNvbmN1cnJlbmN5OiB0aGlzLl9zZXR0aW5ncy5jb25jdXJyZW5jeSxcbiAgICAgICAgICAgIGRlZXBGaWx0ZXI6IHRoaXMuZGVlcEZpbHRlci5nZXRGaWx0ZXIoYmFzZVBhdGgsIHRhc2sucG9zaXRpdmUsIHRhc2submVnYXRpdmUpLFxuICAgICAgICAgICAgZW50cnlGaWx0ZXI6IHRoaXMuZW50cnlGaWx0ZXIuZ2V0RmlsdGVyKHRhc2sucG9zaXRpdmUsIHRhc2submVnYXRpdmUpLFxuICAgICAgICAgICAgZXJyb3JGaWx0ZXI6IHRoaXMuZXJyb3JGaWx0ZXIuZ2V0RmlsdGVyKCksXG4gICAgICAgICAgICBmb2xsb3dTeW1ib2xpY0xpbmtzOiB0aGlzLl9zZXR0aW5ncy5mb2xsb3dTeW1ib2xpY0xpbmtzLFxuICAgICAgICAgICAgZnM6IHRoaXMuX3NldHRpbmdzLmZzLFxuICAgICAgICAgICAgc3RhdHM6IHRoaXMuX3NldHRpbmdzLnN0YXRzLFxuICAgICAgICAgICAgdGhyb3dFcnJvck9uQnJva2VuU3ltYm9saWNMaW5rOiB0aGlzLl9zZXR0aW5ncy50aHJvd0Vycm9yT25Ccm9rZW5TeW1ib2xpY0xpbmssXG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRoaXMuZW50cnlUcmFuc2Zvcm1lci5nZXRUcmFuc2Zvcm1lcigpXG4gICAgICAgIH07XG4gICAgfVxuICAgIF9nZXRNaWNyb21hdGNoT3B0aW9ucygpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGRvdDogdGhpcy5fc2V0dGluZ3MuZG90LFxuICAgICAgICAgICAgbWF0Y2hCYXNlOiB0aGlzLl9zZXR0aW5ncy5iYXNlTmFtZU1hdGNoLFxuICAgICAgICAgICAgbm9icmFjZTogIXRoaXMuX3NldHRpbmdzLmJyYWNlRXhwYW5zaW9uLFxuICAgICAgICAgICAgbm9jYXNlOiAhdGhpcy5fc2V0dGluZ3MuY2FzZVNlbnNpdGl2ZU1hdGNoLFxuICAgICAgICAgICAgbm9leHQ6ICF0aGlzLl9zZXR0aW5ncy5leHRnbG9iLFxuICAgICAgICAgICAgbm9nbG9ic3RhcjogIXRoaXMuX3NldHRpbmdzLmdsb2JzdGFyLFxuICAgICAgICAgICAgcG9zaXg6IHRydWUsXG4gICAgICAgICAgICBzdHJpY3RTbGFzaGVzOiBmYWxzZVxuICAgICAgICB9O1xuICAgIH1cbn1cbmV4cG9ydHMuZGVmYXVsdCA9IFByb3ZpZGVyO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuY29uc3QgYXN5bmNfMSA9IHJlcXVpcmUoXCIuLi9yZWFkZXJzL2FzeW5jXCIpO1xuY29uc3QgcHJvdmlkZXJfMSA9IHJlcXVpcmUoXCIuL3Byb3ZpZGVyXCIpO1xuY2xhc3MgUHJvdmlkZXJBc3luYyBleHRlbmRzIHByb3ZpZGVyXzEuZGVmYXVsdCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIHRoaXMuX3JlYWRlciA9IG5ldyBhc3luY18xLmRlZmF1bHQodGhpcy5fc2V0dGluZ3MpO1xuICAgIH1cbiAgICBhc3luYyByZWFkKHRhc2spIHtcbiAgICAgICAgY29uc3Qgcm9vdCA9IHRoaXMuX2dldFJvb3REaXJlY3RvcnkodGFzayk7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLl9nZXRSZWFkZXJPcHRpb25zKHRhc2spO1xuICAgICAgICBjb25zdCBlbnRyaWVzID0gYXdhaXQgdGhpcy5hcGkocm9vdCwgdGFzaywgb3B0aW9ucyk7XG4gICAgICAgIHJldHVybiBlbnRyaWVzLm1hcCgoZW50cnkpID0+IG9wdGlvbnMudHJhbnNmb3JtKGVudHJ5KSk7XG4gICAgfVxuICAgIGFwaShyb290LCB0YXNrLCBvcHRpb25zKSB7XG4gICAgICAgIGlmICh0YXNrLmR5bmFtaWMpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZWFkZXIuZHluYW1pYyhyb290LCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fcmVhZGVyLnN0YXRpYyh0YXNrLnBhdHRlcm5zLCBvcHRpb25zKTtcbiAgICB9XG59XG5leHBvcnRzLmRlZmF1bHQgPSBQcm92aWRlckFzeW5jO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuY29uc3Qgc3RyZWFtXzEgPSByZXF1aXJlKFwic3RyZWFtXCIpO1xuY29uc3Qgc3RyZWFtXzIgPSByZXF1aXJlKFwiLi4vcmVhZGVycy9zdHJlYW1cIik7XG5jb25zdCBwcm92aWRlcl8xID0gcmVxdWlyZShcIi4vcHJvdmlkZXJcIik7XG5jbGFzcyBQcm92aWRlclN0cmVhbSBleHRlbmRzIHByb3ZpZGVyXzEuZGVmYXVsdCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIHRoaXMuX3JlYWRlciA9IG5ldyBzdHJlYW1fMi5kZWZhdWx0KHRoaXMuX3NldHRpbmdzKTtcbiAgICB9XG4gICAgcmVhZCh0YXNrKSB7XG4gICAgICAgIGNvbnN0IHJvb3QgPSB0aGlzLl9nZXRSb290RGlyZWN0b3J5KHRhc2spO1xuICAgICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5fZ2V0UmVhZGVyT3B0aW9ucyh0YXNrKTtcbiAgICAgICAgY29uc3Qgc291cmNlID0gdGhpcy5hcGkocm9vdCwgdGFzaywgb3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGRlc3RpbmF0aW9uID0gbmV3IHN0cmVhbV8xLlJlYWRhYmxlKHsgb2JqZWN0TW9kZTogdHJ1ZSwgcmVhZDogKCkgPT4geyB9IH0pO1xuICAgICAgICBzb3VyY2VcbiAgICAgICAgICAgIC5vbmNlKCdlcnJvcicsIChlcnJvcikgPT4gZGVzdGluYXRpb24uZW1pdCgnZXJyb3InLCBlcnJvcikpXG4gICAgICAgICAgICAub24oJ2RhdGEnLCAoZW50cnkpID0+IGRlc3RpbmF0aW9uLmVtaXQoJ2RhdGEnLCBvcHRpb25zLnRyYW5zZm9ybShlbnRyeSkpKVxuICAgICAgICAgICAgLm9uY2UoJ2VuZCcsICgpID0+IGRlc3RpbmF0aW9uLmVtaXQoJ2VuZCcpKTtcbiAgICAgICAgZGVzdGluYXRpb25cbiAgICAgICAgICAgIC5vbmNlKCdjbG9zZScsICgpID0+IHNvdXJjZS5kZXN0cm95KCkpO1xuICAgICAgICByZXR1cm4gZGVzdGluYXRpb247XG4gICAgfVxuICAgIGFwaShyb290LCB0YXNrLCBvcHRpb25zKSB7XG4gICAgICAgIGlmICh0YXNrLmR5bmFtaWMpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZWFkZXIuZHluYW1pYyhyb290LCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fcmVhZGVyLnN0YXRpYyh0YXNrLnBhdHRlcm5zLCBvcHRpb25zKTtcbiAgICB9XG59XG5leHBvcnRzLmRlZmF1bHQgPSBQcm92aWRlclN0cmVhbTtcbiIsICJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IGZzU3RhdCA9IHJlcXVpcmUoXCJAbm9kZWxpYi9mcy5zdGF0XCIpO1xuY29uc3QgZnNXYWxrID0gcmVxdWlyZShcIkBub2RlbGliL2ZzLndhbGtcIik7XG5jb25zdCByZWFkZXJfMSA9IHJlcXVpcmUoXCIuL3JlYWRlclwiKTtcbmNsYXNzIFJlYWRlclN5bmMgZXh0ZW5kcyByZWFkZXJfMS5kZWZhdWx0IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICAgICAgdGhpcy5fd2Fsa1N5bmMgPSBmc1dhbGsud2Fsa1N5bmM7XG4gICAgICAgIHRoaXMuX3N0YXRTeW5jID0gZnNTdGF0LnN0YXRTeW5jO1xuICAgIH1cbiAgICBkeW5hbWljKHJvb3QsIG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3dhbGtTeW5jKHJvb3QsIG9wdGlvbnMpO1xuICAgIH1cbiAgICBzdGF0aWMocGF0dGVybnMsIG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgZW50cmllcyA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IHBhdHRlcm4gb2YgcGF0dGVybnMpIHtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVwYXRoID0gdGhpcy5fZ2V0RnVsbEVudHJ5UGF0aChwYXR0ZXJuKTtcbiAgICAgICAgICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5fZ2V0RW50cnkoZmlsZXBhdGgsIHBhdHRlcm4sIG9wdGlvbnMpO1xuICAgICAgICAgICAgaWYgKGVudHJ5ID09PSBudWxsIHx8ICFvcHRpb25zLmVudHJ5RmlsdGVyKGVudHJ5KSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZW50cmllcy5wdXNoKGVudHJ5KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZW50cmllcztcbiAgICB9XG4gICAgX2dldEVudHJ5KGZpbGVwYXRoLCBwYXR0ZXJuLCBvcHRpb25zKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBzdGF0cyA9IHRoaXMuX2dldFN0YXQoZmlsZXBhdGgpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX21ha2VFbnRyeShzdGF0cywgcGF0dGVybik7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5lcnJvckZpbHRlcihlcnJvcikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgfVxuICAgIF9nZXRTdGF0KGZpbGVwYXRoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zdGF0U3luYyhmaWxlcGF0aCwgdGhpcy5fZnNTdGF0U2V0dGluZ3MpO1xuICAgIH1cbn1cbmV4cG9ydHMuZGVmYXVsdCA9IFJlYWRlclN5bmM7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5jb25zdCBzeW5jXzEgPSByZXF1aXJlKFwiLi4vcmVhZGVycy9zeW5jXCIpO1xuY29uc3QgcHJvdmlkZXJfMSA9IHJlcXVpcmUoXCIuL3Byb3ZpZGVyXCIpO1xuY2xhc3MgUHJvdmlkZXJTeW5jIGV4dGVuZHMgcHJvdmlkZXJfMS5kZWZhdWx0IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICAgICAgdGhpcy5fcmVhZGVyID0gbmV3IHN5bmNfMS5kZWZhdWx0KHRoaXMuX3NldHRpbmdzKTtcbiAgICB9XG4gICAgcmVhZCh0YXNrKSB7XG4gICAgICAgIGNvbnN0IHJvb3QgPSB0aGlzLl9nZXRSb290RGlyZWN0b3J5KHRhc2spO1xuICAgICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5fZ2V0UmVhZGVyT3B0aW9ucyh0YXNrKTtcbiAgICAgICAgY29uc3QgZW50cmllcyA9IHRoaXMuYXBpKHJvb3QsIHRhc2ssIG9wdGlvbnMpO1xuICAgICAgICByZXR1cm4gZW50cmllcy5tYXAob3B0aW9ucy50cmFuc2Zvcm0pO1xuICAgIH1cbiAgICBhcGkocm9vdCwgdGFzaywgb3B0aW9ucykge1xuICAgICAgICBpZiAodGFzay5keW5hbWljKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fcmVhZGVyLmR5bmFtaWMocm9vdCwgb3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlYWRlci5zdGF0aWModGFzay5wYXR0ZXJucywgb3B0aW9ucyk7XG4gICAgfVxufVxuZXhwb3J0cy5kZWZhdWx0ID0gUHJvdmlkZXJTeW5jO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5ERUZBVUxUX0ZJTEVfU1lTVEVNX0FEQVBURVIgPSB2b2lkIDA7XG5jb25zdCBmcyA9IHJlcXVpcmUoXCJmc1wiKTtcbmNvbnN0IG9zID0gcmVxdWlyZShcIm9zXCIpO1xuLyoqXG4gKiBUaGUgYG9zLmNwdXNgIG1ldGhvZCBjYW4gcmV0dXJuIHplcm8uIFdlIGV4cGVjdCB0aGUgbnVtYmVyIG9mIGNvcmVzIHRvIGJlIGdyZWF0ZXIgdGhhbiB6ZXJvLlxuICogaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy9ub2RlL2Jsb2IvN2ZhZWRkZjIzYTk4YzUzODk2ZjhiNTc0YTZlNjY1ODllOGZiMWViOC9saWIvb3MuanMjTDEwNi1MMTA3XG4gKi9cbmNvbnN0IENQVV9DT1VOVCA9IE1hdGgubWF4KG9zLmNwdXMoKS5sZW5ndGgsIDEpO1xuZXhwb3J0cy5ERUZBVUxUX0ZJTEVfU1lTVEVNX0FEQVBURVIgPSB7XG4gICAgbHN0YXQ6IGZzLmxzdGF0LFxuICAgIGxzdGF0U3luYzogZnMubHN0YXRTeW5jLFxuICAgIHN0YXQ6IGZzLnN0YXQsXG4gICAgc3RhdFN5bmM6IGZzLnN0YXRTeW5jLFxuICAgIHJlYWRkaXI6IGZzLnJlYWRkaXIsXG4gICAgcmVhZGRpclN5bmM6IGZzLnJlYWRkaXJTeW5jXG59O1xuY2xhc3MgU2V0dGluZ3Mge1xuICAgIGNvbnN0cnVjdG9yKF9vcHRpb25zID0ge30pIHtcbiAgICAgICAgdGhpcy5fb3B0aW9ucyA9IF9vcHRpb25zO1xuICAgICAgICB0aGlzLmFic29sdXRlID0gdGhpcy5fZ2V0VmFsdWUodGhpcy5fb3B0aW9ucy5hYnNvbHV0ZSwgZmFsc2UpO1xuICAgICAgICB0aGlzLmJhc2VOYW1lTWF0Y2ggPSB0aGlzLl9nZXRWYWx1ZSh0aGlzLl9vcHRpb25zLmJhc2VOYW1lTWF0Y2gsIGZhbHNlKTtcbiAgICAgICAgdGhpcy5icmFjZUV4cGFuc2lvbiA9IHRoaXMuX2dldFZhbHVlKHRoaXMuX29wdGlvbnMuYnJhY2VFeHBhbnNpb24sIHRydWUpO1xuICAgICAgICB0aGlzLmNhc2VTZW5zaXRpdmVNYXRjaCA9IHRoaXMuX2dldFZhbHVlKHRoaXMuX29wdGlvbnMuY2FzZVNlbnNpdGl2ZU1hdGNoLCB0cnVlKTtcbiAgICAgICAgdGhpcy5jb25jdXJyZW5jeSA9IHRoaXMuX2dldFZhbHVlKHRoaXMuX29wdGlvbnMuY29uY3VycmVuY3ksIENQVV9DT1VOVCk7XG4gICAgICAgIHRoaXMuY3dkID0gdGhpcy5fZ2V0VmFsdWUodGhpcy5fb3B0aW9ucy5jd2QsIHByb2Nlc3MuY3dkKCkpO1xuICAgICAgICB0aGlzLmRlZXAgPSB0aGlzLl9nZXRWYWx1ZSh0aGlzLl9vcHRpb25zLmRlZXAsIEluZmluaXR5KTtcbiAgICAgICAgdGhpcy5kb3QgPSB0aGlzLl9nZXRWYWx1ZSh0aGlzLl9vcHRpb25zLmRvdCwgZmFsc2UpO1xuICAgICAgICB0aGlzLmV4dGdsb2IgPSB0aGlzLl9nZXRWYWx1ZSh0aGlzLl9vcHRpb25zLmV4dGdsb2IsIHRydWUpO1xuICAgICAgICB0aGlzLmZvbGxvd1N5bWJvbGljTGlua3MgPSB0aGlzLl9nZXRWYWx1ZSh0aGlzLl9vcHRpb25zLmZvbGxvd1N5bWJvbGljTGlua3MsIHRydWUpO1xuICAgICAgICB0aGlzLmZzID0gdGhpcy5fZ2V0RmlsZVN5c3RlbU1ldGhvZHModGhpcy5fb3B0aW9ucy5mcyk7XG4gICAgICAgIHRoaXMuZ2xvYnN0YXIgPSB0aGlzLl9nZXRWYWx1ZSh0aGlzLl9vcHRpb25zLmdsb2JzdGFyLCB0cnVlKTtcbiAgICAgICAgdGhpcy5pZ25vcmUgPSB0aGlzLl9nZXRWYWx1ZSh0aGlzLl9vcHRpb25zLmlnbm9yZSwgW10pO1xuICAgICAgICB0aGlzLm1hcmtEaXJlY3RvcmllcyA9IHRoaXMuX2dldFZhbHVlKHRoaXMuX29wdGlvbnMubWFya0RpcmVjdG9yaWVzLCBmYWxzZSk7XG4gICAgICAgIHRoaXMub2JqZWN0TW9kZSA9IHRoaXMuX2dldFZhbHVlKHRoaXMuX29wdGlvbnMub2JqZWN0TW9kZSwgZmFsc2UpO1xuICAgICAgICB0aGlzLm9ubHlEaXJlY3RvcmllcyA9IHRoaXMuX2dldFZhbHVlKHRoaXMuX29wdGlvbnMub25seURpcmVjdG9yaWVzLCBmYWxzZSk7XG4gICAgICAgIHRoaXMub25seUZpbGVzID0gdGhpcy5fZ2V0VmFsdWUodGhpcy5fb3B0aW9ucy5vbmx5RmlsZXMsIHRydWUpO1xuICAgICAgICB0aGlzLnN0YXRzID0gdGhpcy5fZ2V0VmFsdWUodGhpcy5fb3B0aW9ucy5zdGF0cywgZmFsc2UpO1xuICAgICAgICB0aGlzLnN1cHByZXNzRXJyb3JzID0gdGhpcy5fZ2V0VmFsdWUodGhpcy5fb3B0aW9ucy5zdXBwcmVzc0Vycm9ycywgZmFsc2UpO1xuICAgICAgICB0aGlzLnRocm93RXJyb3JPbkJyb2tlblN5bWJvbGljTGluayA9IHRoaXMuX2dldFZhbHVlKHRoaXMuX29wdGlvbnMudGhyb3dFcnJvck9uQnJva2VuU3ltYm9saWNMaW5rLCBmYWxzZSk7XG4gICAgICAgIHRoaXMudW5pcXVlID0gdGhpcy5fZ2V0VmFsdWUodGhpcy5fb3B0aW9ucy51bmlxdWUsIHRydWUpO1xuICAgICAgICBpZiAodGhpcy5vbmx5RGlyZWN0b3JpZXMpIHtcbiAgICAgICAgICAgIHRoaXMub25seUZpbGVzID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuc3RhdHMpIHtcbiAgICAgICAgICAgIHRoaXMub2JqZWN0TW9kZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gUmVtb3ZlIHRoZSBjYXN0IHRvIHRoZSBhcnJheSBpbiB0aGUgbmV4dCBtYWpvciAoIzQwNCkuXG4gICAgICAgIHRoaXMuaWdub3JlID0gW10uY29uY2F0KHRoaXMuaWdub3JlKTtcbiAgICB9XG4gICAgX2dldFZhbHVlKG9wdGlvbiwgdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIG9wdGlvbiA9PT0gdW5kZWZpbmVkID8gdmFsdWUgOiBvcHRpb247XG4gICAgfVxuICAgIF9nZXRGaWxlU3lzdGVtTWV0aG9kcyhtZXRob2RzID0ge30pIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgZXhwb3J0cy5ERUZBVUxUX0ZJTEVfU1lTVEVNX0FEQVBURVIpLCBtZXRob2RzKTtcbiAgICB9XG59XG5leHBvcnRzLmRlZmF1bHQgPSBTZXR0aW5ncztcbiIsICJcInVzZSBzdHJpY3RcIjtcbmNvbnN0IHRhc2tNYW5hZ2VyID0gcmVxdWlyZShcIi4vbWFuYWdlcnMvdGFza3NcIik7XG5jb25zdCBhc3luY18xID0gcmVxdWlyZShcIi4vcHJvdmlkZXJzL2FzeW5jXCIpO1xuY29uc3Qgc3RyZWFtXzEgPSByZXF1aXJlKFwiLi9wcm92aWRlcnMvc3RyZWFtXCIpO1xuY29uc3Qgc3luY18xID0gcmVxdWlyZShcIi4vcHJvdmlkZXJzL3N5bmNcIik7XG5jb25zdCBzZXR0aW5nc18xID0gcmVxdWlyZShcIi4vc2V0dGluZ3NcIik7XG5jb25zdCB1dGlscyA9IHJlcXVpcmUoXCIuL3V0aWxzXCIpO1xuYXN5bmMgZnVuY3Rpb24gRmFzdEdsb2Ioc291cmNlLCBvcHRpb25zKSB7XG4gICAgYXNzZXJ0UGF0dGVybnNJbnB1dChzb3VyY2UpO1xuICAgIGNvbnN0IHdvcmtzID0gZ2V0V29ya3Moc291cmNlLCBhc3luY18xLmRlZmF1bHQsIG9wdGlvbnMpO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IFByb21pc2UuYWxsKHdvcmtzKTtcbiAgICByZXR1cm4gdXRpbHMuYXJyYXkuZmxhdHRlbihyZXN1bHQpO1xufVxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3R5cGVzY3JpcHQtZXNsaW50L3R5cGVzY3JpcHQtZXNsaW50L2lzc3Vlcy82MFxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlZGVjbGFyZVxuKGZ1bmN0aW9uIChGYXN0R2xvYikge1xuICAgIEZhc3RHbG9iLmdsb2IgPSBGYXN0R2xvYjtcbiAgICBGYXN0R2xvYi5nbG9iU3luYyA9IHN5bmM7XG4gICAgRmFzdEdsb2IuZ2xvYlN0cmVhbSA9IHN0cmVhbTtcbiAgICBGYXN0R2xvYi5hc3luYyA9IEZhc3RHbG9iO1xuICAgIGZ1bmN0aW9uIHN5bmMoc291cmNlLCBvcHRpb25zKSB7XG4gICAgICAgIGFzc2VydFBhdHRlcm5zSW5wdXQoc291cmNlKTtcbiAgICAgICAgY29uc3Qgd29ya3MgPSBnZXRXb3Jrcyhzb3VyY2UsIHN5bmNfMS5kZWZhdWx0LCBvcHRpb25zKTtcbiAgICAgICAgcmV0dXJuIHV0aWxzLmFycmF5LmZsYXR0ZW4od29ya3MpO1xuICAgIH1cbiAgICBGYXN0R2xvYi5zeW5jID0gc3luYztcbiAgICBmdW5jdGlvbiBzdHJlYW0oc291cmNlLCBvcHRpb25zKSB7XG4gICAgICAgIGFzc2VydFBhdHRlcm5zSW5wdXQoc291cmNlKTtcbiAgICAgICAgY29uc3Qgd29ya3MgPSBnZXRXb3Jrcyhzb3VyY2UsIHN0cmVhbV8xLmRlZmF1bHQsIG9wdGlvbnMpO1xuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIHN0cmVhbSByZXR1cm5lZCBieSB0aGUgcHJvdmlkZXIgY2Fubm90IHdvcmsgd2l0aCBhbiBhc3luY2hyb25vdXMgaXRlcmF0b3IuXG4gICAgICAgICAqIFRvIHN1cHBvcnQgYXN5bmNocm9ub3VzIGl0ZXJhdG9ycywgcmVnYXJkbGVzcyBvZiB0aGUgbnVtYmVyIG9mIHRhc2tzLCB3ZSBhbHdheXMgbXVsdGlwbGV4IHN0cmVhbXMuXG4gICAgICAgICAqIFRoaXMgYWZmZWN0cyBwZXJmb3JtYW5jZSAoKzI1JSkuIEkgZG9uJ3Qgc2VlIGJlc3Qgc29sdXRpb24gcmlnaHQgbm93LlxuICAgICAgICAgKi9cbiAgICAgICAgcmV0dXJuIHV0aWxzLnN0cmVhbS5tZXJnZSh3b3Jrcyk7XG4gICAgfVxuICAgIEZhc3RHbG9iLnN0cmVhbSA9IHN0cmVhbTtcbiAgICBmdW5jdGlvbiBnZW5lcmF0ZVRhc2tzKHNvdXJjZSwgb3B0aW9ucykge1xuICAgICAgICBhc3NlcnRQYXR0ZXJuc0lucHV0KHNvdXJjZSk7XG4gICAgICAgIGNvbnN0IHBhdHRlcm5zID0gW10uY29uY2F0KHNvdXJjZSk7XG4gICAgICAgIGNvbnN0IHNldHRpbmdzID0gbmV3IHNldHRpbmdzXzEuZGVmYXVsdChvcHRpb25zKTtcbiAgICAgICAgcmV0dXJuIHRhc2tNYW5hZ2VyLmdlbmVyYXRlKHBhdHRlcm5zLCBzZXR0aW5ncyk7XG4gICAgfVxuICAgIEZhc3RHbG9iLmdlbmVyYXRlVGFza3MgPSBnZW5lcmF0ZVRhc2tzO1xuICAgIGZ1bmN0aW9uIGlzRHluYW1pY1BhdHRlcm4oc291cmNlLCBvcHRpb25zKSB7XG4gICAgICAgIGFzc2VydFBhdHRlcm5zSW5wdXQoc291cmNlKTtcbiAgICAgICAgY29uc3Qgc2V0dGluZ3MgPSBuZXcgc2V0dGluZ3NfMS5kZWZhdWx0KG9wdGlvbnMpO1xuICAgICAgICByZXR1cm4gdXRpbHMucGF0dGVybi5pc0R5bmFtaWNQYXR0ZXJuKHNvdXJjZSwgc2V0dGluZ3MpO1xuICAgIH1cbiAgICBGYXN0R2xvYi5pc0R5bmFtaWNQYXR0ZXJuID0gaXNEeW5hbWljUGF0dGVybjtcbiAgICBmdW5jdGlvbiBlc2NhcGVQYXRoKHNvdXJjZSkge1xuICAgICAgICBhc3NlcnRQYXR0ZXJuc0lucHV0KHNvdXJjZSk7XG4gICAgICAgIHJldHVybiB1dGlscy5wYXRoLmVzY2FwZShzb3VyY2UpO1xuICAgIH1cbiAgICBGYXN0R2xvYi5lc2NhcGVQYXRoID0gZXNjYXBlUGF0aDtcbiAgICBmdW5jdGlvbiBjb252ZXJ0UGF0aFRvUGF0dGVybihzb3VyY2UpIHtcbiAgICAgICAgYXNzZXJ0UGF0dGVybnNJbnB1dChzb3VyY2UpO1xuICAgICAgICByZXR1cm4gdXRpbHMucGF0aC5jb252ZXJ0UGF0aFRvUGF0dGVybihzb3VyY2UpO1xuICAgIH1cbiAgICBGYXN0R2xvYi5jb252ZXJ0UGF0aFRvUGF0dGVybiA9IGNvbnZlcnRQYXRoVG9QYXR0ZXJuO1xuICAgIGxldCBwb3NpeDtcbiAgICAoZnVuY3Rpb24gKHBvc2l4KSB7XG4gICAgICAgIGZ1bmN0aW9uIGVzY2FwZVBhdGgoc291cmNlKSB7XG4gICAgICAgICAgICBhc3NlcnRQYXR0ZXJuc0lucHV0KHNvdXJjZSk7XG4gICAgICAgICAgICByZXR1cm4gdXRpbHMucGF0aC5lc2NhcGVQb3NpeFBhdGgoc291cmNlKTtcbiAgICAgICAgfVxuICAgICAgICBwb3NpeC5lc2NhcGVQYXRoID0gZXNjYXBlUGF0aDtcbiAgICAgICAgZnVuY3Rpb24gY29udmVydFBhdGhUb1BhdHRlcm4oc291cmNlKSB7XG4gICAgICAgICAgICBhc3NlcnRQYXR0ZXJuc0lucHV0KHNvdXJjZSk7XG4gICAgICAgICAgICByZXR1cm4gdXRpbHMucGF0aC5jb252ZXJ0UG9zaXhQYXRoVG9QYXR0ZXJuKHNvdXJjZSk7XG4gICAgICAgIH1cbiAgICAgICAgcG9zaXguY29udmVydFBhdGhUb1BhdHRlcm4gPSBjb252ZXJ0UGF0aFRvUGF0dGVybjtcbiAgICB9KShwb3NpeCA9IEZhc3RHbG9iLnBvc2l4IHx8IChGYXN0R2xvYi5wb3NpeCA9IHt9KSk7XG4gICAgbGV0IHdpbjMyO1xuICAgIChmdW5jdGlvbiAod2luMzIpIHtcbiAgICAgICAgZnVuY3Rpb24gZXNjYXBlUGF0aChzb3VyY2UpIHtcbiAgICAgICAgICAgIGFzc2VydFBhdHRlcm5zSW5wdXQoc291cmNlKTtcbiAgICAgICAgICAgIHJldHVybiB1dGlscy5wYXRoLmVzY2FwZVdpbmRvd3NQYXRoKHNvdXJjZSk7XG4gICAgICAgIH1cbiAgICAgICAgd2luMzIuZXNjYXBlUGF0aCA9IGVzY2FwZVBhdGg7XG4gICAgICAgIGZ1bmN0aW9uIGNvbnZlcnRQYXRoVG9QYXR0ZXJuKHNvdXJjZSkge1xuICAgICAgICAgICAgYXNzZXJ0UGF0dGVybnNJbnB1dChzb3VyY2UpO1xuICAgICAgICAgICAgcmV0dXJuIHV0aWxzLnBhdGguY29udmVydFdpbmRvd3NQYXRoVG9QYXR0ZXJuKHNvdXJjZSk7XG4gICAgICAgIH1cbiAgICAgICAgd2luMzIuY29udmVydFBhdGhUb1BhdHRlcm4gPSBjb252ZXJ0UGF0aFRvUGF0dGVybjtcbiAgICB9KSh3aW4zMiA9IEZhc3RHbG9iLndpbjMyIHx8IChGYXN0R2xvYi53aW4zMiA9IHt9KSk7XG59KShGYXN0R2xvYiB8fCAoRmFzdEdsb2IgPSB7fSkpO1xuZnVuY3Rpb24gZ2V0V29ya3Moc291cmNlLCBfUHJvdmlkZXIsIG9wdGlvbnMpIHtcbiAgICBjb25zdCBwYXR0ZXJucyA9IFtdLmNvbmNhdChzb3VyY2UpO1xuICAgIGNvbnN0IHNldHRpbmdzID0gbmV3IHNldHRpbmdzXzEuZGVmYXVsdChvcHRpb25zKTtcbiAgICBjb25zdCB0YXNrcyA9IHRhc2tNYW5hZ2VyLmdlbmVyYXRlKHBhdHRlcm5zLCBzZXR0aW5ncyk7XG4gICAgY29uc3QgcHJvdmlkZXIgPSBuZXcgX1Byb3ZpZGVyKHNldHRpbmdzKTtcbiAgICByZXR1cm4gdGFza3MubWFwKHByb3ZpZGVyLnJlYWQsIHByb3ZpZGVyKTtcbn1cbmZ1bmN0aW9uIGFzc2VydFBhdHRlcm5zSW5wdXQoaW5wdXQpIHtcbiAgICBjb25zdCBzb3VyY2UgPSBbXS5jb25jYXQoaW5wdXQpO1xuICAgIGNvbnN0IGlzVmFsaWRTb3VyY2UgPSBzb3VyY2UuZXZlcnkoKGl0ZW0pID0+IHV0aWxzLnN0cmluZy5pc1N0cmluZyhpdGVtKSAmJiAhdXRpbHMuc3RyaW5nLmlzRW1wdHkoaXRlbSkpO1xuICAgIGlmICghaXNWYWxpZFNvdXJjZSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdQYXR0ZXJucyBtdXN0IGJlIGEgc3RyaW5nIChub24gZW1wdHkpIG9yIGFuIGFycmF5IG9mIHN0cmluZ3MnKTtcbiAgICB9XG59XG5tb2R1bGUuZXhwb3J0cyA9IEZhc3RHbG9iO1xuIiwgIid1c2Ugc3RyaWN0JztcbmNvbnN0IHtwcm9taXNpZnl9ID0gcmVxdWlyZSgndXRpbCcpO1xuY29uc3QgZnMgPSByZXF1aXJlKCdmcycpO1xuXG5hc3luYyBmdW5jdGlvbiBpc1R5cGUoZnNTdGF0VHlwZSwgc3RhdHNNZXRob2ROYW1lLCBmaWxlUGF0aCkge1xuXHRpZiAodHlwZW9mIGZpbGVQYXRoICE9PSAnc3RyaW5nJykge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoYEV4cGVjdGVkIGEgc3RyaW5nLCBnb3QgJHt0eXBlb2YgZmlsZVBhdGh9YCk7XG5cdH1cblxuXHR0cnkge1xuXHRcdGNvbnN0IHN0YXRzID0gYXdhaXQgcHJvbWlzaWZ5KGZzW2ZzU3RhdFR5cGVdKShmaWxlUGF0aCk7XG5cdFx0cmV0dXJuIHN0YXRzW3N0YXRzTWV0aG9kTmFtZV0oKTtcblx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRpZiAoZXJyb3IuY29kZSA9PT0gJ0VOT0VOVCcpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHR0aHJvdyBlcnJvcjtcblx0fVxufVxuXG5mdW5jdGlvbiBpc1R5cGVTeW5jKGZzU3RhdFR5cGUsIHN0YXRzTWV0aG9kTmFtZSwgZmlsZVBhdGgpIHtcblx0aWYgKHR5cGVvZiBmaWxlUGF0aCAhPT0gJ3N0cmluZycpIHtcblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKGBFeHBlY3RlZCBhIHN0cmluZywgZ290ICR7dHlwZW9mIGZpbGVQYXRofWApO1xuXHR9XG5cblx0dHJ5IHtcblx0XHRyZXR1cm4gZnNbZnNTdGF0VHlwZV0oZmlsZVBhdGgpW3N0YXRzTWV0aG9kTmFtZV0oKTtcblx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRpZiAoZXJyb3IuY29kZSA9PT0gJ0VOT0VOVCcpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHR0aHJvdyBlcnJvcjtcblx0fVxufVxuXG5leHBvcnRzLmlzRmlsZSA9IGlzVHlwZS5iaW5kKG51bGwsICdzdGF0JywgJ2lzRmlsZScpO1xuZXhwb3J0cy5pc0RpcmVjdG9yeSA9IGlzVHlwZS5iaW5kKG51bGwsICdzdGF0JywgJ2lzRGlyZWN0b3J5Jyk7XG5leHBvcnRzLmlzU3ltbGluayA9IGlzVHlwZS5iaW5kKG51bGwsICdsc3RhdCcsICdpc1N5bWJvbGljTGluaycpO1xuZXhwb3J0cy5pc0ZpbGVTeW5jID0gaXNUeXBlU3luYy5iaW5kKG51bGwsICdzdGF0U3luYycsICdpc0ZpbGUnKTtcbmV4cG9ydHMuaXNEaXJlY3RvcnlTeW5jID0gaXNUeXBlU3luYy5iaW5kKG51bGwsICdzdGF0U3luYycsICdpc0RpcmVjdG9yeScpO1xuZXhwb3J0cy5pc1N5bWxpbmtTeW5jID0gaXNUeXBlU3luYy5iaW5kKG51bGwsICdsc3RhdFN5bmMnLCAnaXNTeW1ib2xpY0xpbmsnKTtcbiIsICIndXNlIHN0cmljdCc7XG5jb25zdCBwYXRoID0gcmVxdWlyZSgncGF0aCcpO1xuY29uc3QgcGF0aFR5cGUgPSByZXF1aXJlKCdwYXRoLXR5cGUnKTtcblxuY29uc3QgZ2V0RXh0ZW5zaW9ucyA9IGV4dGVuc2lvbnMgPT4gZXh0ZW5zaW9ucy5sZW5ndGggPiAxID8gYHske2V4dGVuc2lvbnMuam9pbignLCcpfX1gIDogZXh0ZW5zaW9uc1swXTtcblxuY29uc3QgZ2V0UGF0aCA9IChmaWxlcGF0aCwgY3dkKSA9PiB7XG5cdGNvbnN0IHB0aCA9IGZpbGVwYXRoWzBdID09PSAnIScgPyBmaWxlcGF0aC5zbGljZSgxKSA6IGZpbGVwYXRoO1xuXHRyZXR1cm4gcGF0aC5pc0Fic29sdXRlKHB0aCkgPyBwdGggOiBwYXRoLmpvaW4oY3dkLCBwdGgpO1xufTtcblxuY29uc3QgYWRkRXh0ZW5zaW9ucyA9IChmaWxlLCBleHRlbnNpb25zKSA9PiB7XG5cdGlmIChwYXRoLmV4dG5hbWUoZmlsZSkpIHtcblx0XHRyZXR1cm4gYCoqLyR7ZmlsZX1gO1xuXHR9XG5cblx0cmV0dXJuIGAqKi8ke2ZpbGV9LiR7Z2V0RXh0ZW5zaW9ucyhleHRlbnNpb25zKX1gO1xufTtcblxuY29uc3QgZ2V0R2xvYiA9IChkaXJlY3RvcnksIG9wdGlvbnMpID0+IHtcblx0aWYgKG9wdGlvbnMuZmlsZXMgJiYgIUFycmF5LmlzQXJyYXkob3B0aW9ucy5maWxlcykpIHtcblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKGBFeHBlY3RlZCBcXGBmaWxlc1xcYCB0byBiZSBvZiB0eXBlIFxcYEFycmF5XFxgIGJ1dCByZWNlaXZlZCB0eXBlIFxcYCR7dHlwZW9mIG9wdGlvbnMuZmlsZXN9XFxgYCk7XG5cdH1cblxuXHRpZiAob3B0aW9ucy5leHRlbnNpb25zICYmICFBcnJheS5pc0FycmF5KG9wdGlvbnMuZXh0ZW5zaW9ucykpIHtcblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKGBFeHBlY3RlZCBcXGBleHRlbnNpb25zXFxgIHRvIGJlIG9mIHR5cGUgXFxgQXJyYXlcXGAgYnV0IHJlY2VpdmVkIHR5cGUgXFxgJHt0eXBlb2Ygb3B0aW9ucy5leHRlbnNpb25zfVxcYGApO1xuXHR9XG5cblx0aWYgKG9wdGlvbnMuZmlsZXMgJiYgb3B0aW9ucy5leHRlbnNpb25zKSB7XG5cdFx0cmV0dXJuIG9wdGlvbnMuZmlsZXMubWFwKHggPT4gcGF0aC5wb3NpeC5qb2luKGRpcmVjdG9yeSwgYWRkRXh0ZW5zaW9ucyh4LCBvcHRpb25zLmV4dGVuc2lvbnMpKSk7XG5cdH1cblxuXHRpZiAob3B0aW9ucy5maWxlcykge1xuXHRcdHJldHVybiBvcHRpb25zLmZpbGVzLm1hcCh4ID0+IHBhdGgucG9zaXguam9pbihkaXJlY3RvcnksIGAqKi8ke3h9YCkpO1xuXHR9XG5cblx0aWYgKG9wdGlvbnMuZXh0ZW5zaW9ucykge1xuXHRcdHJldHVybiBbcGF0aC5wb3NpeC5qb2luKGRpcmVjdG9yeSwgYCoqLyouJHtnZXRFeHRlbnNpb25zKG9wdGlvbnMuZXh0ZW5zaW9ucyl9YCldO1xuXHR9XG5cblx0cmV0dXJuIFtwYXRoLnBvc2l4LmpvaW4oZGlyZWN0b3J5LCAnKionKV07XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGFzeW5jIChpbnB1dCwgb3B0aW9ucykgPT4ge1xuXHRvcHRpb25zID0ge1xuXHRcdGN3ZDogcHJvY2Vzcy5jd2QoKSxcblx0XHQuLi5vcHRpb25zXG5cdH07XG5cblx0aWYgKHR5cGVvZiBvcHRpb25zLmN3ZCAhPT0gJ3N0cmluZycpIHtcblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKGBFeHBlY3RlZCBcXGBjd2RcXGAgdG8gYmUgb2YgdHlwZSBcXGBzdHJpbmdcXGAgYnV0IHJlY2VpdmVkIHR5cGUgXFxgJHt0eXBlb2Ygb3B0aW9ucy5jd2R9XFxgYCk7XG5cdH1cblxuXHRjb25zdCBnbG9icyA9IGF3YWl0IFByb21pc2UuYWxsKFtdLmNvbmNhdChpbnB1dCkubWFwKGFzeW5jIHggPT4ge1xuXHRcdGNvbnN0IGlzRGlyZWN0b3J5ID0gYXdhaXQgcGF0aFR5cGUuaXNEaXJlY3RvcnkoZ2V0UGF0aCh4LCBvcHRpb25zLmN3ZCkpO1xuXHRcdHJldHVybiBpc0RpcmVjdG9yeSA/IGdldEdsb2IoeCwgb3B0aW9ucykgOiB4O1xuXHR9KSk7XG5cblx0cmV0dXJuIFtdLmNvbmNhdC5hcHBseShbXSwgZ2xvYnMpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHByZWZlci1zcHJlYWRcbn07XG5cbm1vZHVsZS5leHBvcnRzLnN5bmMgPSAoaW5wdXQsIG9wdGlvbnMpID0+IHtcblx0b3B0aW9ucyA9IHtcblx0XHRjd2Q6IHByb2Nlc3MuY3dkKCksXG5cdFx0Li4ub3B0aW9uc1xuXHR9O1xuXG5cdGlmICh0eXBlb2Ygb3B0aW9ucy5jd2QgIT09ICdzdHJpbmcnKSB7XG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcihgRXhwZWN0ZWQgXFxgY3dkXFxgIHRvIGJlIG9mIHR5cGUgXFxgc3RyaW5nXFxgIGJ1dCByZWNlaXZlZCB0eXBlIFxcYCR7dHlwZW9mIG9wdGlvbnMuY3dkfVxcYGApO1xuXHR9XG5cblx0Y29uc3QgZ2xvYnMgPSBbXS5jb25jYXQoaW5wdXQpLm1hcCh4ID0+IHBhdGhUeXBlLmlzRGlyZWN0b3J5U3luYyhnZXRQYXRoKHgsIG9wdGlvbnMuY3dkKSkgPyBnZXRHbG9iKHgsIG9wdGlvbnMpIDogeCk7XG5cblx0cmV0dXJuIFtdLmNvbmNhdC5hcHBseShbXSwgZ2xvYnMpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHByZWZlci1zcHJlYWRcbn07XG4iLCAiLy8gQSBzaW1wbGUgaW1wbGVtZW50YXRpb24gb2YgbWFrZS1hcnJheVxuZnVuY3Rpb24gbWFrZUFycmF5IChzdWJqZWN0KSB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHN1YmplY3QpXG4gICAgPyBzdWJqZWN0XG4gICAgOiBbc3ViamVjdF1cbn1cblxuY29uc3QgRU1QVFkgPSAnJ1xuY29uc3QgU1BBQ0UgPSAnICdcbmNvbnN0IEVTQ0FQRSA9ICdcXFxcJ1xuY29uc3QgUkVHRVhfVEVTVF9CTEFOS19MSU5FID0gL15cXHMrJC9cbmNvbnN0IFJFR0VYX0lOVkFMSURfVFJBSUxJTkdfQkFDS1NMQVNIID0gLyg/OlteXFxcXF18XilcXFxcJC9cbmNvbnN0IFJFR0VYX1JFUExBQ0VfTEVBRElOR19FWENBUEVEX0VYQ0xBTUFUSU9OID0gL15cXFxcIS9cbmNvbnN0IFJFR0VYX1JFUExBQ0VfTEVBRElOR19FWENBUEVEX0hBU0ggPSAvXlxcXFwjL1xuY29uc3QgUkVHRVhfU1BMSVRBTExfQ1JMRiA9IC9cXHI/XFxuL2dcbi8vIC9mb28sXG4vLyAuL2Zvbyxcbi8vIC4uL2Zvbyxcbi8vIC5cbi8vIC4uXG5jb25zdCBSRUdFWF9URVNUX0lOVkFMSURfUEFUSCA9IC9eXFwuKlxcL3xeXFwuKyQvXG5cbmNvbnN0IFNMQVNIID0gJy8nXG5cbi8vIERvIG5vdCB1c2UgdGVybmFyeSBleHByZXNzaW9uIGhlcmUsIHNpbmNlIFwiaXN0YW5idWwgaWdub3JlIG5leHRcIiBpcyBidWdneVxubGV0IFRNUF9LRVlfSUdOT1JFID0gJ25vZGUtaWdub3JlJ1xuLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbmlmICh0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJykge1xuICBUTVBfS0VZX0lHTk9SRSA9IFN5bWJvbC5mb3IoJ25vZGUtaWdub3JlJylcbn1cbmNvbnN0IEtFWV9JR05PUkUgPSBUTVBfS0VZX0lHTk9SRVxuXG5jb25zdCBkZWZpbmUgPSAob2JqZWN0LCBrZXksIHZhbHVlKSA9PlxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqZWN0LCBrZXksIHt2YWx1ZX0pXG5cbmNvbnN0IFJFR0VYX1JFR0VYUF9SQU5HRSA9IC8oWzAtel0pLShbMC16XSkvZ1xuXG5jb25zdCBSRVRVUk5fRkFMU0UgPSAoKSA9PiBmYWxzZVxuXG4vLyBTYW5pdGl6ZSB0aGUgcmFuZ2Ugb2YgYSByZWd1bGFyIGV4cHJlc3Npb25cbi8vIFRoZSBjYXNlcyBhcmUgY29tcGxpY2F0ZWQsIHNlZSB0ZXN0IGNhc2VzIGZvciBkZXRhaWxzXG5jb25zdCBzYW5pdGl6ZVJhbmdlID0gcmFuZ2UgPT4gcmFuZ2UucmVwbGFjZShcbiAgUkVHRVhfUkVHRVhQX1JBTkdFLFxuICAobWF0Y2gsIGZyb20sIHRvKSA9PiBmcm9tLmNoYXJDb2RlQXQoMCkgPD0gdG8uY2hhckNvZGVBdCgwKVxuICAgID8gbWF0Y2hcbiAgICAvLyBJbnZhbGlkIHJhbmdlIChvdXQgb2Ygb3JkZXIpIHdoaWNoIGlzIG9rIGZvciBnaXRpZ25vcmUgcnVsZXMgYnV0XG4gICAgLy8gICBmYXRhbCBmb3IgSmF2YVNjcmlwdCByZWd1bGFyIGV4cHJlc3Npb24sIHNvIGVsaW1pbmF0ZSBpdC5cbiAgICA6IEVNUFRZXG4pXG5cbi8vIFNlZSBmaXh0dXJlcyAjNTlcbmNvbnN0IGNsZWFuUmFuZ2VCYWNrU2xhc2ggPSBzbGFzaGVzID0+IHtcbiAgY29uc3Qge2xlbmd0aH0gPSBzbGFzaGVzXG4gIHJldHVybiBzbGFzaGVzLnNsaWNlKDAsIGxlbmd0aCAtIGxlbmd0aCAlIDIpXG59XG5cbi8vID4gSWYgdGhlIHBhdHRlcm4gZW5kcyB3aXRoIGEgc2xhc2gsXG4vLyA+IGl0IGlzIHJlbW92ZWQgZm9yIHRoZSBwdXJwb3NlIG9mIHRoZSBmb2xsb3dpbmcgZGVzY3JpcHRpb24sXG4vLyA+IGJ1dCBpdCB3b3VsZCBvbmx5IGZpbmQgYSBtYXRjaCB3aXRoIGEgZGlyZWN0b3J5LlxuLy8gPiBJbiBvdGhlciB3b3JkcywgZm9vLyB3aWxsIG1hdGNoIGEgZGlyZWN0b3J5IGZvbyBhbmQgcGF0aHMgdW5kZXJuZWF0aCBpdCxcbi8vID4gYnV0IHdpbGwgbm90IG1hdGNoIGEgcmVndWxhciBmaWxlIG9yIGEgc3ltYm9saWMgbGluayBmb29cbi8vID4gICh0aGlzIGlzIGNvbnNpc3RlbnQgd2l0aCB0aGUgd2F5IGhvdyBwYXRoc3BlYyB3b3JrcyBpbiBnZW5lcmFsIGluIEdpdCkuXG4vLyAnYGZvby9gJyB3aWxsIG5vdCBtYXRjaCByZWd1bGFyIGZpbGUgJ2Bmb29gJyBvciBzeW1ib2xpYyBsaW5rICdgZm9vYCdcbi8vIC0+IGlnbm9yZS1ydWxlcyB3aWxsIG5vdCBkZWFsIHdpdGggaXQsIGJlY2F1c2UgaXQgY29zdHMgZXh0cmEgYGZzLnN0YXRgIGNhbGxcbi8vICAgICAgeW91IGNvdWxkIHVzZSBvcHRpb24gYG1hcms6IHRydWVgIHdpdGggYGdsb2JgXG5cbi8vICdgZm9vL2AnIHNob3VsZCBub3QgY29udGludWUgd2l0aCB0aGUgJ2AuLmAnXG5jb25zdCBSRVBMQUNFUlMgPSBbXG5cbiAgLy8gPiBUcmFpbGluZyBzcGFjZXMgYXJlIGlnbm9yZWQgdW5sZXNzIHRoZXkgYXJlIHF1b3RlZCB3aXRoIGJhY2tzbGFzaCAoXCJcXFwiKVxuICBbXG4gICAgLy8gKGFcXCApIC0+IChhIClcbiAgICAvLyAoYSAgKSAtPiAoYSlcbiAgICAvLyAoYSBcXCApIC0+IChhICApXG4gICAgL1xcXFw/XFxzKyQvLFxuICAgIG1hdGNoID0+IG1hdGNoLmluZGV4T2YoJ1xcXFwnKSA9PT0gMFxuICAgICAgPyBTUEFDRVxuICAgICAgOiBFTVBUWVxuICBdLFxuXG4gIC8vIHJlcGxhY2UgKFxcICkgd2l0aCAnICdcbiAgW1xuICAgIC9cXFxcXFxzL2csXG4gICAgKCkgPT4gU1BBQ0VcbiAgXSxcblxuICAvLyBFc2NhcGUgbWV0YWNoYXJhY3RlcnNcbiAgLy8gd2hpY2ggaXMgd3JpdHRlbiBkb3duIGJ5IHVzZXJzIGJ1dCBtZWFucyBzcGVjaWFsIGZvciByZWd1bGFyIGV4cHJlc3Npb25zLlxuXG4gIC8vID4gVGhlcmUgYXJlIDEyIGNoYXJhY3RlcnMgd2l0aCBzcGVjaWFsIG1lYW5pbmdzOlxuICAvLyA+IC0gdGhlIGJhY2tzbGFzaCBcXCxcbiAgLy8gPiAtIHRoZSBjYXJldCBeLFxuICAvLyA+IC0gdGhlIGRvbGxhciBzaWduICQsXG4gIC8vID4gLSB0aGUgcGVyaW9kIG9yIGRvdCAuLFxuICAvLyA+IC0gdGhlIHZlcnRpY2FsIGJhciBvciBwaXBlIHN5bWJvbCB8LFxuICAvLyA+IC0gdGhlIHF1ZXN0aW9uIG1hcmsgPyxcbiAgLy8gPiAtIHRoZSBhc3RlcmlzayBvciBzdGFyICosXG4gIC8vID4gLSB0aGUgcGx1cyBzaWduICssXG4gIC8vID4gLSB0aGUgb3BlbmluZyBwYXJlbnRoZXNpcyAoLFxuICAvLyA+IC0gdGhlIGNsb3NpbmcgcGFyZW50aGVzaXMgKSxcbiAgLy8gPiAtIGFuZCB0aGUgb3BlbmluZyBzcXVhcmUgYnJhY2tldCBbLFxuICAvLyA+IC0gdGhlIG9wZW5pbmcgY3VybHkgYnJhY2UgeyxcbiAgLy8gPiBUaGVzZSBzcGVjaWFsIGNoYXJhY3RlcnMgYXJlIG9mdGVuIGNhbGxlZCBcIm1ldGFjaGFyYWN0ZXJzXCIuXG4gIFtcbiAgICAvW1xcXFwkLnwqKygpe15dL2csXG4gICAgbWF0Y2ggPT4gYFxcXFwke21hdGNofWBcbiAgXSxcblxuICBbXG4gICAgLy8gPiBhIHF1ZXN0aW9uIG1hcmsgKD8pIG1hdGNoZXMgYSBzaW5nbGUgY2hhcmFjdGVyXG4gICAgLyg/IVxcXFwpXFw/L2csXG4gICAgKCkgPT4gJ1teL10nXG4gIF0sXG5cbiAgLy8gbGVhZGluZyBzbGFzaFxuICBbXG5cbiAgICAvLyA+IEEgbGVhZGluZyBzbGFzaCBtYXRjaGVzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHBhdGhuYW1lLlxuICAgIC8vID4gRm9yIGV4YW1wbGUsIFwiLyouY1wiIG1hdGNoZXMgXCJjYXQtZmlsZS5jXCIgYnV0IG5vdCBcIm1vemlsbGEtc2hhMS9zaGExLmNcIi5cbiAgICAvLyBBIGxlYWRpbmcgc2xhc2ggbWF0Y2hlcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSBwYXRobmFtZVxuICAgIC9eXFwvLyxcbiAgICAoKSA9PiAnXidcbiAgXSxcblxuICAvLyByZXBsYWNlIHNwZWNpYWwgbWV0YWNoYXJhY3RlciBzbGFzaCBhZnRlciB0aGUgbGVhZGluZyBzbGFzaFxuICBbXG4gICAgL1xcLy9nLFxuICAgICgpID0+ICdcXFxcLydcbiAgXSxcblxuICBbXG4gICAgLy8gPiBBIGxlYWRpbmcgXCIqKlwiIGZvbGxvd2VkIGJ5IGEgc2xhc2ggbWVhbnMgbWF0Y2ggaW4gYWxsIGRpcmVjdG9yaWVzLlxuICAgIC8vID4gRm9yIGV4YW1wbGUsIFwiKiovZm9vXCIgbWF0Y2hlcyBmaWxlIG9yIGRpcmVjdG9yeSBcImZvb1wiIGFueXdoZXJlLFxuICAgIC8vID4gdGhlIHNhbWUgYXMgcGF0dGVybiBcImZvb1wiLlxuICAgIC8vID4gXCIqKi9mb28vYmFyXCIgbWF0Y2hlcyBmaWxlIG9yIGRpcmVjdG9yeSBcImJhclwiIGFueXdoZXJlIHRoYXQgaXMgZGlyZWN0bHlcbiAgICAvLyA+ICAgdW5kZXIgZGlyZWN0b3J5IFwiZm9vXCIuXG4gICAgLy8gTm90aWNlIHRoYXQgdGhlICcqJ3MgaGF2ZSBiZWVuIHJlcGxhY2VkIGFzICdcXFxcKidcbiAgICAvXlxcXipcXFxcXFwqXFxcXFxcKlxcXFxcXC8vLFxuXG4gICAgLy8gJyoqL2ZvbycgPC0+ICdmb28nXG4gICAgKCkgPT4gJ14oPzouKlxcXFwvKT8nXG4gIF0sXG5cbiAgLy8gc3RhcnRpbmdcbiAgW1xuICAgIC8vIHRoZXJlIHdpbGwgYmUgbm8gbGVhZGluZyAnLydcbiAgICAvLyAgICh3aGljaCBoYXMgYmVlbiByZXBsYWNlZCBieSBzZWN0aW9uIFwibGVhZGluZyBzbGFzaFwiKVxuICAgIC8vIElmIHN0YXJ0cyB3aXRoICcqKicsIGFkZGluZyBhICdeJyB0byB0aGUgcmVndWxhciBleHByZXNzaW9uIGFsc28gd29ya3NcbiAgICAvXig/PVteXl0pLyxcbiAgICBmdW5jdGlvbiBzdGFydGluZ1JlcGxhY2VyICgpIHtcbiAgICAgIC8vIElmIGhhcyBhIHNsYXNoIGAvYCBhdCB0aGUgYmVnaW5uaW5nIG9yIG1pZGRsZVxuICAgICAgcmV0dXJuICEvXFwvKD8hJCkvLnRlc3QodGhpcylcbiAgICAgICAgLy8gPiBQcmlvciB0byAyLjIyLjFcbiAgICAgICAgLy8gPiBJZiB0aGUgcGF0dGVybiBkb2VzIG5vdCBjb250YWluIGEgc2xhc2ggLyxcbiAgICAgICAgLy8gPiAgIEdpdCB0cmVhdHMgaXQgYXMgYSBzaGVsbCBnbG9iIHBhdHRlcm5cbiAgICAgICAgLy8gQWN0dWFsbHksIGlmIHRoZXJlIGlzIG9ubHkgYSB0cmFpbGluZyBzbGFzaCxcbiAgICAgICAgLy8gICBnaXQgYWxzbyB0cmVhdHMgaXQgYXMgYSBzaGVsbCBnbG9iIHBhdHRlcm5cblxuICAgICAgICAvLyBBZnRlciAyLjIyLjEgKGNvbXBhdGlibGUgYnV0IGNsZWFyZXIpXG4gICAgICAgIC8vID4gSWYgdGhlcmUgaXMgYSBzZXBhcmF0b3IgYXQgdGhlIGJlZ2lubmluZyBvciBtaWRkbGUgKG9yIGJvdGgpXG4gICAgICAgIC8vID4gb2YgdGhlIHBhdHRlcm4sIHRoZW4gdGhlIHBhdHRlcm4gaXMgcmVsYXRpdmUgdG8gdGhlIGRpcmVjdG9yeVxuICAgICAgICAvLyA+IGxldmVsIG9mIHRoZSBwYXJ0aWN1bGFyIC5naXRpZ25vcmUgZmlsZSBpdHNlbGYuXG4gICAgICAgIC8vID4gT3RoZXJ3aXNlIHRoZSBwYXR0ZXJuIG1heSBhbHNvIG1hdGNoIGF0IGFueSBsZXZlbCBiZWxvd1xuICAgICAgICAvLyA+IHRoZSAuZ2l0aWdub3JlIGxldmVsLlxuICAgICAgICA/ICcoPzpefFxcXFwvKSdcblxuICAgICAgICAvLyA+IE90aGVyd2lzZSwgR2l0IHRyZWF0cyB0aGUgcGF0dGVybiBhcyBhIHNoZWxsIGdsb2Igc3VpdGFibGUgZm9yXG4gICAgICAgIC8vID4gICBjb25zdW1wdGlvbiBieSBmbm1hdGNoKDMpXG4gICAgICAgIDogJ14nXG4gICAgfVxuICBdLFxuXG4gIC8vIHR3byBnbG9ic3RhcnNcbiAgW1xuICAgIC8vIFVzZSBsb29rYWhlYWQgYXNzZXJ0aW9ucyBzbyB0aGF0IHdlIGNvdWxkIG1hdGNoIG1vcmUgdGhhbiBvbmUgYCcvKionYFxuICAgIC9cXFxcXFwvXFxcXFxcKlxcXFxcXCooPz1cXFxcXFwvfCQpL2csXG5cbiAgICAvLyBaZXJvLCBvbmUgb3Igc2V2ZXJhbCBkaXJlY3Rvcmllc1xuICAgIC8vIHNob3VsZCBub3QgdXNlICcqJywgb3IgaXQgd2lsbCBiZSByZXBsYWNlZCBieSB0aGUgbmV4dCByZXBsYWNlclxuXG4gICAgLy8gQ2hlY2sgaWYgaXQgaXMgbm90IHRoZSBsYXN0IGAnLyoqJ2BcbiAgICAoXywgaW5kZXgsIHN0cikgPT4gaW5kZXggKyA2IDwgc3RyLmxlbmd0aFxuXG4gICAgICAvLyBjYXNlOiAvKiovXG4gICAgICAvLyA+IEEgc2xhc2ggZm9sbG93ZWQgYnkgdHdvIGNvbnNlY3V0aXZlIGFzdGVyaXNrcyB0aGVuIGEgc2xhc2ggbWF0Y2hlc1xuICAgICAgLy8gPiAgIHplcm8gb3IgbW9yZSBkaXJlY3Rvcmllcy5cbiAgICAgIC8vID4gRm9yIGV4YW1wbGUsIFwiYS8qKi9iXCIgbWF0Y2hlcyBcImEvYlwiLCBcImEveC9iXCIsIFwiYS94L3kvYlwiIGFuZCBzbyBvbi5cbiAgICAgIC8vICcvKiovJ1xuICAgICAgPyAnKD86XFxcXC9bXlxcXFwvXSspKidcblxuICAgICAgLy8gY2FzZTogLyoqXG4gICAgICAvLyA+IEEgdHJhaWxpbmcgYFwiLyoqXCJgIG1hdGNoZXMgZXZlcnl0aGluZyBpbnNpZGUuXG5cbiAgICAgIC8vICMyMTogZXZlcnl0aGluZyBpbnNpZGUgYnV0IGl0IHNob3VsZCBub3QgaW5jbHVkZSB0aGUgY3VycmVudCBmb2xkZXJcbiAgICAgIDogJ1xcXFwvLisnXG4gIF0sXG5cbiAgLy8gbm9ybWFsIGludGVybWVkaWF0ZSB3aWxkY2FyZHNcbiAgW1xuICAgIC8vIE5ldmVyIHJlcGxhY2UgZXNjYXBlZCAnKidcbiAgICAvLyBpZ25vcmUgcnVsZSAnXFwqJyB3aWxsIG1hdGNoIHRoZSBwYXRoICcqJ1xuXG4gICAgLy8gJ2FiYy4qLycgLT4gZ29cbiAgICAvLyAnYWJjLionICAtPiBza2lwIHRoaXMgcnVsZSxcbiAgICAvLyAgICBjb3ogdHJhaWxpbmcgc2luZ2xlIHdpbGRjYXJkIHdpbGwgYmUgaGFuZGVkIGJ5IFt0cmFpbGluZyB3aWxkY2FyZF1cbiAgICAvKF58W15cXFxcXSspKFxcXFxcXCopKyg/PS4rKS9nLFxuXG4gICAgLy8gJyouanMnIG1hdGNoZXMgJy5qcydcbiAgICAvLyAnKi5qcycgZG9lc24ndCBtYXRjaCAnYWJjJ1xuICAgIChfLCBwMSwgcDIpID0+IHtcbiAgICAgIC8vIDEuXG4gICAgICAvLyA+IEFuIGFzdGVyaXNrIFwiKlwiIG1hdGNoZXMgYW55dGhpbmcgZXhjZXB0IGEgc2xhc2guXG4gICAgICAvLyAyLlxuICAgICAgLy8gPiBPdGhlciBjb25zZWN1dGl2ZSBhc3Rlcmlza3MgYXJlIGNvbnNpZGVyZWQgcmVndWxhciBhc3Rlcmlza3NcbiAgICAgIC8vID4gYW5kIHdpbGwgbWF0Y2ggYWNjb3JkaW5nIHRvIHRoZSBwcmV2aW91cyBydWxlcy5cbiAgICAgIGNvbnN0IHVuZXNjYXBlZCA9IHAyLnJlcGxhY2UoL1xcXFxcXCovZywgJ1teXFxcXC9dKicpXG4gICAgICByZXR1cm4gcDEgKyB1bmVzY2FwZWRcbiAgICB9XG4gIF0sXG5cbiAgW1xuICAgIC8vIHVuZXNjYXBlLCByZXZlcnQgc3RlcCAzIGV4Y2VwdCBmb3IgYmFjayBzbGFzaFxuICAgIC8vIEZvciBleGFtcGxlLCBpZiBhIHVzZXIgZXNjYXBlIGEgJ1xcXFwqJyxcbiAgICAvLyBhZnRlciBzdGVwIDMsIHRoZSByZXN1bHQgd2lsbCBiZSAnXFxcXFxcXFxcXFxcKidcbiAgICAvXFxcXFxcXFxcXFxcKD89WyQufCorKCl7Xl0pL2csXG4gICAgKCkgPT4gRVNDQVBFXG4gIF0sXG5cbiAgW1xuICAgIC8vICdcXFxcXFxcXCcgLT4gJ1xcXFwnXG4gICAgL1xcXFxcXFxcL2csXG4gICAgKCkgPT4gRVNDQVBFXG4gIF0sXG5cbiAgW1xuICAgIC8vID4gVGhlIHJhbmdlIG5vdGF0aW9uLCBlLmcuIFthLXpBLVpdLFxuICAgIC8vID4gY2FuIGJlIHVzZWQgdG8gbWF0Y2ggb25lIG9mIHRoZSBjaGFyYWN0ZXJzIGluIGEgcmFuZ2UuXG5cbiAgICAvLyBgXFxgIGlzIGVzY2FwZWQgYnkgc3RlcCAzXG4gICAgLyhcXFxcKT9cXFsoW15cXF0vXSo/KShcXFxcKikoJHxcXF0pL2csXG4gICAgKG1hdGNoLCBsZWFkRXNjYXBlLCByYW5nZSwgZW5kRXNjYXBlLCBjbG9zZSkgPT4gbGVhZEVzY2FwZSA9PT0gRVNDQVBFXG4gICAgICAvLyAnXFxcXFtiYXJdJyAtPiAnXFxcXFxcXFxbYmFyXFxcXF0nXG4gICAgICA/IGBcXFxcWyR7cmFuZ2V9JHtjbGVhblJhbmdlQmFja1NsYXNoKGVuZEVzY2FwZSl9JHtjbG9zZX1gXG4gICAgICA6IGNsb3NlID09PSAnXSdcbiAgICAgICAgPyBlbmRFc2NhcGUubGVuZ3RoICUgMiA9PT0gMFxuICAgICAgICAgIC8vIEEgbm9ybWFsIGNhc2UsIGFuZCBpdCBpcyBhIHJhbmdlIG5vdGF0aW9uXG4gICAgICAgICAgLy8gJ1tiYXJdJ1xuICAgICAgICAgIC8vICdbYmFyXFxcXFxcXFxdJ1xuICAgICAgICAgID8gYFske3Nhbml0aXplUmFuZ2UocmFuZ2UpfSR7ZW5kRXNjYXBlfV1gXG4gICAgICAgICAgLy8gSW52YWxpZCByYW5nZSBub3RhdG9uXG4gICAgICAgICAgLy8gJ1tiYXJcXFxcXScgLT4gJ1tiYXJcXFxcXFxcXF0nXG4gICAgICAgICAgOiAnW10nXG4gICAgICAgIDogJ1tdJ1xuICBdLFxuXG4gIC8vIGVuZGluZ1xuICBbXG4gICAgLy8gJ2pzJyB3aWxsIG5vdCBtYXRjaCAnanMuJ1xuICAgIC8vICdhYicgd2lsbCBub3QgbWF0Y2ggJ2FiYydcbiAgICAvKD86W14qXSkkLyxcblxuICAgIC8vIFdURiFcbiAgICAvLyBodHRwczovL2dpdC1zY20uY29tL2RvY3MvZ2l0aWdub3JlXG4gICAgLy8gY2hhbmdlcyBpbiBbMi4yMi4xXShodHRwczovL2dpdC1zY20uY29tL2RvY3MvZ2l0aWdub3JlLzIuMjIuMSlcbiAgICAvLyB3aGljaCByZS1maXhlcyAjMjQsICMzOFxuXG4gICAgLy8gPiBJZiB0aGVyZSBpcyBhIHNlcGFyYXRvciBhdCB0aGUgZW5kIG9mIHRoZSBwYXR0ZXJuIHRoZW4gdGhlIHBhdHRlcm5cbiAgICAvLyA+IHdpbGwgb25seSBtYXRjaCBkaXJlY3Rvcmllcywgb3RoZXJ3aXNlIHRoZSBwYXR0ZXJuIGNhbiBtYXRjaCBib3RoXG4gICAgLy8gPiBmaWxlcyBhbmQgZGlyZWN0b3JpZXMuXG5cbiAgICAvLyAnanMqJyB3aWxsIG5vdCBtYXRjaCAnYS5qcydcbiAgICAvLyAnanMvJyB3aWxsIG5vdCBtYXRjaCAnYS5qcydcbiAgICAvLyAnanMnIHdpbGwgbWF0Y2ggJ2EuanMnIGFuZCAnYS5qcy8nXG4gICAgbWF0Y2ggPT4gL1xcLyQvLnRlc3QobWF0Y2gpXG4gICAgICAvLyBmb28vIHdpbGwgbm90IG1hdGNoICdmb28nXG4gICAgICA/IGAke21hdGNofSRgXG4gICAgICAvLyBmb28gbWF0Y2hlcyAnZm9vJyBhbmQgJ2Zvby8nXG4gICAgICA6IGAke21hdGNofSg/PSR8XFxcXC8kKWBcbiAgXSxcblxuICAvLyB0cmFpbGluZyB3aWxkY2FyZFxuICBbXG4gICAgLyhcXF58XFxcXFxcLyk/XFxcXFxcKiQvLFxuICAgIChfLCBwMSkgPT4ge1xuICAgICAgY29uc3QgcHJlZml4ID0gcDFcbiAgICAgICAgLy8gJ1xcXic6XG4gICAgICAgIC8vICcvKicgZG9lcyBub3QgbWF0Y2ggRU1QVFlcbiAgICAgICAgLy8gJy8qJyBkb2VzIG5vdCBtYXRjaCBldmVyeXRoaW5nXG5cbiAgICAgICAgLy8gJ1xcXFxcXC8nOlxuICAgICAgICAvLyAnYWJjLyonIGRvZXMgbm90IG1hdGNoICdhYmMvJ1xuICAgICAgICA/IGAke3AxfVteL10rYFxuXG4gICAgICAgIC8vICdhKicgbWF0Y2hlcyAnYSdcbiAgICAgICAgLy8gJ2EqJyBtYXRjaGVzICdhYSdcbiAgICAgICAgOiAnW14vXSonXG5cbiAgICAgIHJldHVybiBgJHtwcmVmaXh9KD89JHxcXFxcLyQpYFxuICAgIH1cbiAgXSxcbl1cblxuLy8gQSBzaW1wbGUgY2FjaGUsIGJlY2F1c2UgYW4gaWdub3JlIHJ1bGUgb25seSBoYXMgb25seSBvbmUgY2VydGFpbiBtZWFuaW5nXG5jb25zdCByZWdleENhY2hlID0gT2JqZWN0LmNyZWF0ZShudWxsKVxuXG4vLyBAcGFyYW0ge3BhdHRlcm59XG5jb25zdCBtYWtlUmVnZXggPSAocGF0dGVybiwgaWdub3JlQ2FzZSkgPT4ge1xuICBsZXQgc291cmNlID0gcmVnZXhDYWNoZVtwYXR0ZXJuXVxuXG4gIGlmICghc291cmNlKSB7XG4gICAgc291cmNlID0gUkVQTEFDRVJTLnJlZHVjZShcbiAgICAgIChwcmV2LCBjdXJyZW50KSA9PiBwcmV2LnJlcGxhY2UoY3VycmVudFswXSwgY3VycmVudFsxXS5iaW5kKHBhdHRlcm4pKSxcbiAgICAgIHBhdHRlcm5cbiAgICApXG4gICAgcmVnZXhDYWNoZVtwYXR0ZXJuXSA9IHNvdXJjZVxuICB9XG5cbiAgcmV0dXJuIGlnbm9yZUNhc2VcbiAgICA/IG5ldyBSZWdFeHAoc291cmNlLCAnaScpXG4gICAgOiBuZXcgUmVnRXhwKHNvdXJjZSlcbn1cblxuY29uc3QgaXNTdHJpbmcgPSBzdWJqZWN0ID0+IHR5cGVvZiBzdWJqZWN0ID09PSAnc3RyaW5nJ1xuXG4vLyA+IEEgYmxhbmsgbGluZSBtYXRjaGVzIG5vIGZpbGVzLCBzbyBpdCBjYW4gc2VydmUgYXMgYSBzZXBhcmF0b3IgZm9yIHJlYWRhYmlsaXR5LlxuY29uc3QgY2hlY2tQYXR0ZXJuID0gcGF0dGVybiA9PiBwYXR0ZXJuXG4gICYmIGlzU3RyaW5nKHBhdHRlcm4pXG4gICYmICFSRUdFWF9URVNUX0JMQU5LX0xJTkUudGVzdChwYXR0ZXJuKVxuICAmJiAhUkVHRVhfSU5WQUxJRF9UUkFJTElOR19CQUNLU0xBU0gudGVzdChwYXR0ZXJuKVxuXG4gIC8vID4gQSBsaW5lIHN0YXJ0aW5nIHdpdGggIyBzZXJ2ZXMgYXMgYSBjb21tZW50LlxuICAmJiBwYXR0ZXJuLmluZGV4T2YoJyMnKSAhPT0gMFxuXG5jb25zdCBzcGxpdFBhdHRlcm4gPSBwYXR0ZXJuID0+IHBhdHRlcm4uc3BsaXQoUkVHRVhfU1BMSVRBTExfQ1JMRilcblxuY2xhc3MgSWdub3JlUnVsZSB7XG4gIGNvbnN0cnVjdG9yIChcbiAgICBvcmlnaW4sXG4gICAgcGF0dGVybixcbiAgICBuZWdhdGl2ZSxcbiAgICByZWdleFxuICApIHtcbiAgICB0aGlzLm9yaWdpbiA9IG9yaWdpblxuICAgIHRoaXMucGF0dGVybiA9IHBhdHRlcm5cbiAgICB0aGlzLm5lZ2F0aXZlID0gbmVnYXRpdmVcbiAgICB0aGlzLnJlZ2V4ID0gcmVnZXhcbiAgfVxufVxuXG5jb25zdCBjcmVhdGVSdWxlID0gKHBhdHRlcm4sIGlnbm9yZUNhc2UpID0+IHtcbiAgY29uc3Qgb3JpZ2luID0gcGF0dGVyblxuICBsZXQgbmVnYXRpdmUgPSBmYWxzZVxuXG4gIC8vID4gQW4gb3B0aW9uYWwgcHJlZml4IFwiIVwiIHdoaWNoIG5lZ2F0ZXMgdGhlIHBhdHRlcm47XG4gIGlmIChwYXR0ZXJuLmluZGV4T2YoJyEnKSA9PT0gMCkge1xuICAgIG5lZ2F0aXZlID0gdHJ1ZVxuICAgIHBhdHRlcm4gPSBwYXR0ZXJuLnN1YnN0cigxKVxuICB9XG5cbiAgcGF0dGVybiA9IHBhdHRlcm5cbiAgLy8gPiBQdXQgYSBiYWNrc2xhc2ggKFwiXFxcIikgaW4gZnJvbnQgb2YgdGhlIGZpcnN0IFwiIVwiIGZvciBwYXR0ZXJucyB0aGF0XG4gIC8vID4gICBiZWdpbiB3aXRoIGEgbGl0ZXJhbCBcIiFcIiwgZm9yIGV4YW1wbGUsIGBcIlxcIWltcG9ydGFudCEudHh0XCJgLlxuICAucmVwbGFjZShSRUdFWF9SRVBMQUNFX0xFQURJTkdfRVhDQVBFRF9FWENMQU1BVElPTiwgJyEnKVxuICAvLyA+IFB1dCBhIGJhY2tzbGFzaCAoXCJcXFwiKSBpbiBmcm9udCBvZiB0aGUgZmlyc3QgaGFzaCBmb3IgcGF0dGVybnMgdGhhdFxuICAvLyA+ICAgYmVnaW4gd2l0aCBhIGhhc2guXG4gIC5yZXBsYWNlKFJFR0VYX1JFUExBQ0VfTEVBRElOR19FWENBUEVEX0hBU0gsICcjJylcblxuICBjb25zdCByZWdleCA9IG1ha2VSZWdleChwYXR0ZXJuLCBpZ25vcmVDYXNlKVxuXG4gIHJldHVybiBuZXcgSWdub3JlUnVsZShcbiAgICBvcmlnaW4sXG4gICAgcGF0dGVybixcbiAgICBuZWdhdGl2ZSxcbiAgICByZWdleFxuICApXG59XG5cbmNvbnN0IHRocm93RXJyb3IgPSAobWVzc2FnZSwgQ3RvcikgPT4ge1xuICB0aHJvdyBuZXcgQ3RvcihtZXNzYWdlKVxufVxuXG5jb25zdCBjaGVja1BhdGggPSAocGF0aCwgb3JpZ2luYWxQYXRoLCBkb1Rocm93KSA9PiB7XG4gIGlmICghaXNTdHJpbmcocGF0aCkpIHtcbiAgICByZXR1cm4gZG9UaHJvdyhcbiAgICAgIGBwYXRoIG11c3QgYmUgYSBzdHJpbmcsIGJ1dCBnb3QgXFxgJHtvcmlnaW5hbFBhdGh9XFxgYCxcbiAgICAgIFR5cGVFcnJvclxuICAgIClcbiAgfVxuXG4gIC8vIFdlIGRvbid0IGtub3cgaWYgd2Ugc2hvdWxkIGlnbm9yZSBFTVBUWSwgc28gdGhyb3dcbiAgaWYgKCFwYXRoKSB7XG4gICAgcmV0dXJuIGRvVGhyb3coYHBhdGggbXVzdCBub3QgYmUgZW1wdHlgLCBUeXBlRXJyb3IpXG4gIH1cblxuICAvLyBDaGVjayBpZiBpdCBpcyBhIHJlbGF0aXZlIHBhdGhcbiAgaWYgKGNoZWNrUGF0aC5pc05vdFJlbGF0aXZlKHBhdGgpKSB7XG4gICAgY29uc3QgciA9ICdgcGF0aC5yZWxhdGl2ZSgpYGQnXG4gICAgcmV0dXJuIGRvVGhyb3coXG4gICAgICBgcGF0aCBzaG91bGQgYmUgYSAke3J9IHN0cmluZywgYnV0IGdvdCBcIiR7b3JpZ2luYWxQYXRofVwiYCxcbiAgICAgIFJhbmdlRXJyb3JcbiAgICApXG4gIH1cblxuICByZXR1cm4gdHJ1ZVxufVxuXG5jb25zdCBpc05vdFJlbGF0aXZlID0gcGF0aCA9PiBSRUdFWF9URVNUX0lOVkFMSURfUEFUSC50ZXN0KHBhdGgpXG5cbmNoZWNrUGF0aC5pc05vdFJlbGF0aXZlID0gaXNOb3RSZWxhdGl2ZVxuY2hlY2tQYXRoLmNvbnZlcnQgPSBwID0+IHBcblxuY2xhc3MgSWdub3JlIHtcbiAgY29uc3RydWN0b3IgKHtcbiAgICBpZ25vcmVjYXNlID0gdHJ1ZSxcbiAgICBpZ25vcmVDYXNlID0gaWdub3JlY2FzZSxcbiAgICBhbGxvd1JlbGF0aXZlUGF0aHMgPSBmYWxzZVxuICB9ID0ge30pIHtcbiAgICBkZWZpbmUodGhpcywgS0VZX0lHTk9SRSwgdHJ1ZSlcblxuICAgIHRoaXMuX3J1bGVzID0gW11cbiAgICB0aGlzLl9pZ25vcmVDYXNlID0gaWdub3JlQ2FzZVxuICAgIHRoaXMuX2FsbG93UmVsYXRpdmVQYXRocyA9IGFsbG93UmVsYXRpdmVQYXRoc1xuICAgIHRoaXMuX2luaXRDYWNoZSgpXG4gIH1cblxuICBfaW5pdENhY2hlICgpIHtcbiAgICB0aGlzLl9pZ25vcmVDYWNoZSA9IE9iamVjdC5jcmVhdGUobnVsbClcbiAgICB0aGlzLl90ZXN0Q2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpXG4gIH1cblxuICBfYWRkUGF0dGVybiAocGF0dGVybikge1xuICAgIC8vICMzMlxuICAgIGlmIChwYXR0ZXJuICYmIHBhdHRlcm5bS0VZX0lHTk9SRV0pIHtcbiAgICAgIHRoaXMuX3J1bGVzID0gdGhpcy5fcnVsZXMuY29uY2F0KHBhdHRlcm4uX3J1bGVzKVxuICAgICAgdGhpcy5fYWRkZWQgPSB0cnVlXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoY2hlY2tQYXR0ZXJuKHBhdHRlcm4pKSB7XG4gICAgICBjb25zdCBydWxlID0gY3JlYXRlUnVsZShwYXR0ZXJuLCB0aGlzLl9pZ25vcmVDYXNlKVxuICAgICAgdGhpcy5fYWRkZWQgPSB0cnVlXG4gICAgICB0aGlzLl9ydWxlcy5wdXNoKHJ1bGUpXG4gICAgfVxuICB9XG5cbiAgLy8gQHBhcmFtIHtBcnJheTxzdHJpbmc+IHwgc3RyaW5nIHwgSWdub3JlfSBwYXR0ZXJuXG4gIGFkZCAocGF0dGVybikge1xuICAgIHRoaXMuX2FkZGVkID0gZmFsc2VcblxuICAgIG1ha2VBcnJheShcbiAgICAgIGlzU3RyaW5nKHBhdHRlcm4pXG4gICAgICAgID8gc3BsaXRQYXR0ZXJuKHBhdHRlcm4pXG4gICAgICAgIDogcGF0dGVyblxuICAgICkuZm9yRWFjaCh0aGlzLl9hZGRQYXR0ZXJuLCB0aGlzKVxuXG4gICAgLy8gU29tZSBydWxlcyBoYXZlIGp1c3QgYWRkZWQgdG8gdGhlIGlnbm9yZSxcbiAgICAvLyBtYWtpbmcgdGhlIGJlaGF2aW9yIGNoYW5nZWQuXG4gICAgaWYgKHRoaXMuX2FkZGVkKSB7XG4gICAgICB0aGlzLl9pbml0Q2FjaGUoKVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICAvLyBsZWdhY3lcbiAgYWRkUGF0dGVybiAocGF0dGVybikge1xuICAgIHJldHVybiB0aGlzLmFkZChwYXR0ZXJuKVxuICB9XG5cbiAgLy8gICAgICAgICAgfCAgICAgICAgICAgaWdub3JlZCA6IHVuaWdub3JlZFxuICAvLyBuZWdhdGl2ZSB8ICAgMDowICAgfCAgIDA6MSAgIHwgICAxOjAgICB8ICAgMToxXG4gIC8vIC0tLS0tLS0tIHwgLS0tLS0tLSB8IC0tLS0tLS0gfCAtLS0tLS0tIHwgLS0tLS0tLS1cbiAgLy8gICAgIDAgICAgfCAgVEVTVCAgIHwgIFRFU1QgICB8ICBTS0lQICAgfCAgICBYXG4gIC8vICAgICAxICAgIHwgIFRFU1RJRiB8ICBTS0lQICAgfCAgVEVTVCAgIHwgICAgWFxuXG4gIC8vIC0gU0tJUDogYWx3YXlzIHNraXBcbiAgLy8gLSBURVNUOiBhbHdheXMgdGVzdFxuICAvLyAtIFRFU1RJRjogb25seSB0ZXN0IGlmIGNoZWNrVW5pZ25vcmVkXG4gIC8vIC0gWDogdGhhdCBuZXZlciBoYXBwZW5cblxuICAvLyBAcGFyYW0ge2Jvb2xlYW59IHdoZXRoZXIgc2hvdWxkIGNoZWNrIGlmIHRoZSBwYXRoIGlzIHVuaWdub3JlZCxcbiAgLy8gICBzZXR0aW5nIGBjaGVja1VuaWdub3JlZGAgdG8gYGZhbHNlYCBjb3VsZCByZWR1Y2UgYWRkaXRpb25hbFxuICAvLyAgIHBhdGggbWF0Y2hpbmcuXG5cbiAgLy8gQHJldHVybnMge1Rlc3RSZXN1bHR9IHRydWUgaWYgYSBmaWxlIGlzIGlnbm9yZWRcbiAgX3Rlc3RPbmUgKHBhdGgsIGNoZWNrVW5pZ25vcmVkKSB7XG4gICAgbGV0IGlnbm9yZWQgPSBmYWxzZVxuICAgIGxldCB1bmlnbm9yZWQgPSBmYWxzZVxuXG4gICAgdGhpcy5fcnVsZXMuZm9yRWFjaChydWxlID0+IHtcbiAgICAgIGNvbnN0IHtuZWdhdGl2ZX0gPSBydWxlXG4gICAgICBpZiAoXG4gICAgICAgIHVuaWdub3JlZCA9PT0gbmVnYXRpdmUgJiYgaWdub3JlZCAhPT0gdW5pZ25vcmVkXG4gICAgICAgIHx8IG5lZ2F0aXZlICYmICFpZ25vcmVkICYmICF1bmlnbm9yZWQgJiYgIWNoZWNrVW5pZ25vcmVkXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG1hdGNoZWQgPSBydWxlLnJlZ2V4LnRlc3QocGF0aClcblxuICAgICAgaWYgKG1hdGNoZWQpIHtcbiAgICAgICAgaWdub3JlZCA9ICFuZWdhdGl2ZVxuICAgICAgICB1bmlnbm9yZWQgPSBuZWdhdGl2ZVxuICAgICAgfVxuICAgIH0pXG5cbiAgICByZXR1cm4ge1xuICAgICAgaWdub3JlZCxcbiAgICAgIHVuaWdub3JlZFxuICAgIH1cbiAgfVxuXG4gIC8vIEByZXR1cm5zIHtUZXN0UmVzdWx0fVxuICBfdGVzdCAob3JpZ2luYWxQYXRoLCBjYWNoZSwgY2hlY2tVbmlnbm9yZWQsIHNsaWNlcykge1xuICAgIGNvbnN0IHBhdGggPSBvcmlnaW5hbFBhdGhcbiAgICAgIC8vIFN1cHBvcnRzIG51bGxhYmxlIHBhdGhcbiAgICAgICYmIGNoZWNrUGF0aC5jb252ZXJ0KG9yaWdpbmFsUGF0aClcblxuICAgIGNoZWNrUGF0aChcbiAgICAgIHBhdGgsXG4gICAgICBvcmlnaW5hbFBhdGgsXG4gICAgICB0aGlzLl9hbGxvd1JlbGF0aXZlUGF0aHNcbiAgICAgICAgPyBSRVRVUk5fRkFMU0VcbiAgICAgICAgOiB0aHJvd0Vycm9yXG4gICAgKVxuXG4gICAgcmV0dXJuIHRoaXMuX3QocGF0aCwgY2FjaGUsIGNoZWNrVW5pZ25vcmVkLCBzbGljZXMpXG4gIH1cblxuICBfdCAocGF0aCwgY2FjaGUsIGNoZWNrVW5pZ25vcmVkLCBzbGljZXMpIHtcbiAgICBpZiAocGF0aCBpbiBjYWNoZSkge1xuICAgICAgcmV0dXJuIGNhY2hlW3BhdGhdXG4gICAgfVxuXG4gICAgaWYgKCFzbGljZXMpIHtcbiAgICAgIC8vIHBhdGgvdG8vYS5qc1xuICAgICAgLy8gWydwYXRoJywgJ3RvJywgJ2EuanMnXVxuICAgICAgc2xpY2VzID0gcGF0aC5zcGxpdChTTEFTSClcbiAgICB9XG5cbiAgICBzbGljZXMucG9wKClcblxuICAgIC8vIElmIHRoZSBwYXRoIGhhcyBubyBwYXJlbnQgZGlyZWN0b3J5LCBqdXN0IHRlc3QgaXRcbiAgICBpZiAoIXNsaWNlcy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBjYWNoZVtwYXRoXSA9IHRoaXMuX3Rlc3RPbmUocGF0aCwgY2hlY2tVbmlnbm9yZWQpXG4gICAgfVxuXG4gICAgY29uc3QgcGFyZW50ID0gdGhpcy5fdChcbiAgICAgIHNsaWNlcy5qb2luKFNMQVNIKSArIFNMQVNILFxuICAgICAgY2FjaGUsXG4gICAgICBjaGVja1VuaWdub3JlZCxcbiAgICAgIHNsaWNlc1xuICAgIClcblxuICAgIC8vIElmIHRoZSBwYXRoIGNvbnRhaW5zIGEgcGFyZW50IGRpcmVjdG9yeSwgY2hlY2sgdGhlIHBhcmVudCBmaXJzdFxuICAgIHJldHVybiBjYWNoZVtwYXRoXSA9IHBhcmVudC5pZ25vcmVkXG4gICAgICAvLyA+IEl0IGlzIG5vdCBwb3NzaWJsZSB0byByZS1pbmNsdWRlIGEgZmlsZSBpZiBhIHBhcmVudCBkaXJlY3Rvcnkgb2ZcbiAgICAgIC8vID4gICB0aGF0IGZpbGUgaXMgZXhjbHVkZWQuXG4gICAgICA/IHBhcmVudFxuICAgICAgOiB0aGlzLl90ZXN0T25lKHBhdGgsIGNoZWNrVW5pZ25vcmVkKVxuICB9XG5cbiAgaWdub3JlcyAocGF0aCkge1xuICAgIHJldHVybiB0aGlzLl90ZXN0KHBhdGgsIHRoaXMuX2lnbm9yZUNhY2hlLCBmYWxzZSkuaWdub3JlZFxuICB9XG5cbiAgY3JlYXRlRmlsdGVyICgpIHtcbiAgICByZXR1cm4gcGF0aCA9PiAhdGhpcy5pZ25vcmVzKHBhdGgpXG4gIH1cblxuICBmaWx0ZXIgKHBhdGhzKSB7XG4gICAgcmV0dXJuIG1ha2VBcnJheShwYXRocykuZmlsdGVyKHRoaXMuY3JlYXRlRmlsdGVyKCkpXG4gIH1cblxuICAvLyBAcmV0dXJucyB7VGVzdFJlc3VsdH1cbiAgdGVzdCAocGF0aCkge1xuICAgIHJldHVybiB0aGlzLl90ZXN0KHBhdGgsIHRoaXMuX3Rlc3RDYWNoZSwgdHJ1ZSlcbiAgfVxufVxuXG5jb25zdCBmYWN0b3J5ID0gb3B0aW9ucyA9PiBuZXcgSWdub3JlKG9wdGlvbnMpXG5cbmNvbnN0IGlzUGF0aFZhbGlkID0gcGF0aCA9PlxuICBjaGVja1BhdGgocGF0aCAmJiBjaGVja1BhdGguY29udmVydChwYXRoKSwgcGF0aCwgUkVUVVJOX0ZBTFNFKVxuXG5mYWN0b3J5LmlzUGF0aFZhbGlkID0gaXNQYXRoVmFsaWRcblxuLy8gRml4ZXMgdHlwZXNjcmlwdFxuZmFjdG9yeS5kZWZhdWx0ID0gZmFjdG9yeVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnlcblxuLy8gV2luZG93c1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuaWYgKFxuICAvLyBEZXRlY3QgYHByb2Nlc3NgIHNvIHRoYXQgaXQgY2FuIHJ1biBpbiBicm93c2Vycy5cbiAgdHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnXG4gICYmIChcbiAgICBwcm9jZXNzLmVudiAmJiBwcm9jZXNzLmVudi5JR05PUkVfVEVTVF9XSU4zMlxuICAgIHx8IHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMidcbiAgKVxuKSB7XG4gIC8qIGVzbGludCBuby1jb250cm9sLXJlZ2V4OiBcIm9mZlwiICovXG4gIGNvbnN0IG1ha2VQb3NpeCA9IHN0ciA9PiAvXlxcXFxcXFxcXFw/XFxcXC8udGVzdChzdHIpXG4gIHx8IC9bXCI8PnxcXHUwMDAwLVxcdTAwMUZdKy91LnRlc3Qoc3RyKVxuICAgID8gc3RyXG4gICAgOiBzdHIucmVwbGFjZSgvXFxcXC9nLCAnLycpXG5cbiAgY2hlY2tQYXRoLmNvbnZlcnQgPSBtYWtlUG9zaXhcblxuICAvLyAnQzpcXFxcZm9vJyAgICAgPC0gJ0M6XFxcXGZvbycgaGFzIGJlZW4gY29udmVydGVkIHRvICdDOi8nXG4gIC8vICdkOlxcXFxmb28nXG4gIGNvbnN0IFJFR0lYX0lTX1dJTkRPV1NfUEFUSF9BQlNPTFVURSA9IC9eW2Etel06XFwvL2lcbiAgY2hlY2tQYXRoLmlzTm90UmVsYXRpdmUgPSBwYXRoID0+XG4gICAgUkVHSVhfSVNfV0lORE9XU19QQVRIX0FCU09MVVRFLnRlc3QocGF0aClcbiAgICB8fCBpc05vdFJlbGF0aXZlKHBhdGgpXG59XG4iLCAiZXhwb3J0ICogZnJvbSBcIi4vZ2VuZXJhdGUtb3BlbmFwaVwiXG5leHBvcnQgKiBmcm9tIFwiLi9nZW5lcmF0ZS1yb3V0ZS10eXBlc1wiXG4iLCAiaW1wb3J0IGZzIGZyb20gXCJub2RlOmZzL3Byb21pc2VzXCJcbmltcG9ydCB7IGdlbmVyYXRlU2NoZW1hIH0gZnJvbSBcIkBhbmF0aW5lL3pvZC1vcGVuYXBpXCJcbmltcG9ydCB7XG4gIE9wZW5BcGlCdWlsZGVyLFxuICBPcGVyYXRpb25PYmplY3QsXG4gIFBhcmFtZXRlck9iamVjdCxcbn0gZnJvbSBcIm9wZW5hcGkzLXRzL29hczMxXCJcbmltcG9ydCB7IFNldHVwUGFyYW1zIH0gZnJvbSBcIi4uLy4uL3R5cGVzXCJcbmltcG9ydCBjaGFsayBmcm9tIFwiY2hhbGtcIlxuaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIlxuaW1wb3J0IHsgcGFyc2VSb3V0ZXNJblBhY2thZ2UgfSBmcm9tIFwiLi4vbGliL3BhcnNlLXJvdXRlcy1pbi1wYWNrYWdlXCJcbmltcG9ydCB7IGVtYmVkU2NoZW1hUmVmZXJlbmNlcyB9IGZyb20gXCIuL2VtYmVkLXNjaGVtYS1yZWZlcmVuY2VzXCJcbmltcG9ydCB7IG1hcE1ldGhvZHNUb0Zlcm5TZGtNZXRhZGF0YSB9IGZyb20gXCIuL2Zlcm4tc2RrLXV0aWxzXCJcblxuZnVuY3Rpb24gcmVwbGFjZUZpcnN0Q2hhclRvTG93ZXJjYXNlKHN0cjogc3RyaW5nKSB7XG4gIGlmIChzdHIubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIHN0clxuICB9XG5cbiAgY29uc3QgZmlyc3RDaGFyID0gc3RyLmNoYXJBdCgwKS50b0xvd2VyQ2FzZSgpXG4gIHJldHVybiBmaXJzdENoYXIgKyBzdHIuc2xpY2UoMSlcbn1cblxuZnVuY3Rpb24gdHJhbnNmb3JtUGF0aFRvT3BlcmF0aW9uSWQocGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgcGFydHMgPSBwYXRoXG4gICAgLnJlcGxhY2UoLy0vZywgXCJfXCIpXG4gICAgLnNwbGl0KFwiL1wiKVxuICAgIC5maWx0ZXIoKHBhcnQpID0+IHBhcnQgIT09IFwiXCIpXG4gIGNvbnN0IHRyYW5zZm9ybWVkUGFydHMgPSBwYXJ0cy5tYXAoKHBhcnQpID0+IHtcbiAgICBpZiAocGFydC5zdGFydHNXaXRoKFwiW1wiKSAmJiBwYXJ0LmVuZHNXaXRoKFwiXVwiKSkge1xuICAgICAgLy8gQ29udmVydCBbcGFyYW1dIHRvIEJ5UGFyYW1cbiAgICAgIGNvbnN0IHNlcnZpY2VOYW1lID0gcGFydC5zbGljZSgxLCAtMSlcbiAgICAgIGNvbnN0IHdvcmRzID0gc2VydmljZU5hbWUuc3BsaXQoXCJfXCIpXG4gICAgICBjb25zdCBjYXBpdGFsaXplZFdvcmRzID0gd29yZHMubWFwKFxuICAgICAgICAod29yZCkgPT4gd29yZC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHdvcmQuc2xpY2UoMSlcbiAgICAgIClcbiAgICAgIHJldHVybiBgQnkke2NhcGl0YWxpemVkV29yZHMuam9pbihcIlwiKX1gXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIENvbnZlcnQgYXBpX3BhdGggdG8gQXBpUGF0aFxuICAgICAgY29uc3Qgd29yZHMgPSBwYXJ0LnNwbGl0KFwiX1wiKVxuICAgICAgY29uc3QgY2FwaXRhbGl6ZWRXb3JkcyA9IHdvcmRzLm1hcChcbiAgICAgICAgKHdvcmQpID0+IHdvcmQuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB3b3JkLnNsaWNlKDEpXG4gICAgICApXG4gICAgICByZXR1cm4gY2FwaXRhbGl6ZWRXb3Jkcy5qb2luKFwiXCIpXG4gICAgfVxuICB9KVxuXG4gIHJldHVybiByZXBsYWNlRmlyc3RDaGFyVG9Mb3dlcmNhc2UodHJhbnNmb3JtZWRQYXJ0cy5qb2luKFwiXCIpKVxufVxuXG5mdW5jdGlvbiBwYXNjYWxDYXNlKGlucHV0OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCB3b3JkcyA9IGlucHV0LnNwbGl0KFwiIFwiKVxuICBjb25zdCBjYXBpdGFsaXplZFdvcmRzID0gd29yZHMubWFwKFxuICAgICh3b3JkKSA9PiB3b3JkLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgd29yZC5zbGljZSgxKS50b0xvd2VyQ2FzZSgpXG4gIClcbiAgY29uc3QgcGFzY2FsQ2FzZVN0cmluZyA9IGNhcGl0YWxpemVkV29yZHMuam9pbihcIlwiKVxuICByZXR1cm4gcGFzY2FsQ2FzZVN0cmluZ1xufVxuXG5pbnRlcmZhY2UgVGFnT3B0aW9uIHtcbiAgbmFtZTogc3RyaW5nXG4gIGRlc2NyaXB0aW9uOiBzdHJpbmdcbiAgZG9lc1JvdXRlSGF2ZVRhZz86IChyb3V0ZTogc3RyaW5nKSA9PiBib29sZWFuXG59XG5cbmludGVyZmFjZSBHZW5lcmF0ZU9wZW5BUElPcHRzIHtcbiAgcGFja2FnZURpcjogc3RyaW5nXG4gIG91dHB1dEZpbGU/OiBzdHJpbmdcbiAgcGF0aEdsb2I/OiBzdHJpbmdcbiAgdGFncz86IEFycmF5PFRhZ09wdGlvbj5cbiAgYXBpUHJlZml4Pzogc3RyaW5nXG4gIG1hcEZpbGVQYXRoVG9IVFRQUm91dGU/OiAoZmlsZV9wYXRoOiBzdHJpbmcpID0+IHN0cmluZ1xufVxuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gZ2VuZXJhdGVzIGFuIE9wZW5BUEkgc3BlYyBmcm9tIHRoZSBOZXh0LmpzIEFQSSByb3V0ZXMuXG4gKlxuICogWW91IG5vcm1hbGx5IGludm9rZSB0aGlzIHdpdGggYG5leHRhcGkgZ2VuZXJhdGUtb3BlbmFwaWAgaW4gYVxuICogXCJidWlsZDpvcGVuYXBpXCIgcGFja2FnZS5qc29uIHNjcmlwdC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlT3BlbkFQSShvcHRzOiBHZW5lcmF0ZU9wZW5BUElPcHRzKSB7XG4gIGNvbnN0IHsgb3V0cHV0RmlsZSwgdGFncyA9IFtdIH0gPSBvcHRzXG5cbiAgY29uc3QgZmlsZXBhdGhUb1JvdXRlRm4gPSBhd2FpdCBwYXJzZVJvdXRlc0luUGFja2FnZShvcHRzKVxuXG4gIC8vIFRPRE8gZGV0ZWN0IGlmIHRoZXJlIGFyZSBtdWx0aXBsZSBzZXR1cHMgYW5kIG91dHB1dCBkaWZmZXJlbnQgQVBJc1xuICBjb25zdCB7IHNldHVwUGFyYW1zOiBnbG9iYWxTZXR1cFBhcmFtcyB9ID0gZmlsZXBhdGhUb1JvdXRlRm4udmFsdWVzKCkubmV4dCgpXG4gICAgLnZhbHVlIGFzIHsgc2V0dXBQYXJhbXM6IFNldHVwUGFyYW1zIH1cblxuICBjb25zdCBzZWN1cml0eVNjaGVtZXMgPSBnbG9iYWxTZXR1cFBhcmFtcy5zZWN1cml0eVNjaGVtYXMgPz8ge31cbiAgY29uc3Qgc2VjdXJpdHlPYmplY3RzRm9yQXV0aFR5cGUgPSB7fVxuICBmb3IgKGNvbnN0IGF1dGhOYW1lIG9mIE9iamVjdC5rZXlzKGdsb2JhbFNldHVwUGFyYW1zLmF1dGhNaWRkbGV3YXJlTWFwKSkge1xuICAgIGNvbnN0IG13ID0gZ2xvYmFsU2V0dXBQYXJhbXMuYXV0aE1pZGRsZXdhcmVNYXBbYXV0aE5hbWVdXG4gICAgaWYgKG13LnNlY3VyaXR5U2NoZW1hKSB7XG4gICAgICBzZWN1cml0eVNjaGVtZXNbYXV0aE5hbWVdID0gKG13IGFzIGFueSkuc2VjdXJpdHlTY2hlbWFcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBjaGFsay55ZWxsb3coXG4gICAgICAgICAgYEF1dGhlbnRpY2F0aW9uIG1pZGRsZXdhcmUgXCIke2F1dGhOYW1lfVwiIGhhcyBubyBzZWN1cml0eVNjaGVtYS4gWW91IGNhbiBkZWZpbmUgdGhpcyBvbiB0aGUgZnVuY3Rpb24gKGUuZy4gYWZ0ZXIgdGhlIGV4cG9ydCBkby4uLiBcXG5cXG5teU1pZGRsZXdhcmUuc2VjdXJpdHlTY2hlbWEgPSB7XFxuICB0eXBlOiBcImh0dHBcIlxcbiAgc2NoZW1lOiBcImJlYXJlclwiXFxuICBiZWFyZXJGb3JtYXQ6IFwiSldUXCJcXG4gLy8gb3IgQVBJIFRva2VuIGV0Yy5cXG59XFxuXFxuWW91IGNhbiBhbHNvIGRlZmluZSBcInNlY3VyaXR5T2JqZWN0c1wiIHRoaXMgd2F5LCBpZiB5b3Ugd2FudCB0byBtYWtlIHRoZSBlbmRwb2ludCBzdXBwb3J0IG11bHRpcGxlIG1vZGVzIG9mIGF1dGhlbnRpY2F0aW9uLlxcblxcbmBcbiAgICAgICAgKVxuICAgICAgKVxuICAgIH1cblxuICAgIHNlY3VyaXR5T2JqZWN0c0ZvckF1dGhUeXBlW2F1dGhOYW1lXSA9IChtdyBhcyBhbnkpLnNlY3VyaXR5T2JqZWN0cyB8fCBbXG4gICAgICB7XG4gICAgICAgIFthdXRoTmFtZV06IFtdLFxuICAgICAgfSxcbiAgICBdXG4gIH1cblxuICBjb25zdCBnbG9iYWxTY2hlbWFzID0ge31cbiAgZm9yIChjb25zdCBbc2NoZW1hTmFtZSwgem9kU2NoZW1hXSBvZiBPYmplY3QuZW50cmllcyhcbiAgICBnbG9iYWxTZXR1cFBhcmFtcy5nbG9iYWxTY2hlbWFzID8/IHt9XG4gICkpIHtcbiAgICBnbG9iYWxTY2hlbWFzW3NjaGVtYU5hbWVdID0gZ2VuZXJhdGVTY2hlbWEoem9kU2NoZW1hKVxuICB9XG5cbiAgLy8gQnVpbGQgT3BlbkFQSSBzcGVjXG4gIGNvbnN0IGJ1aWxkZXIgPSBPcGVuQXBpQnVpbGRlci5jcmVhdGUoe1xuICAgIG9wZW5hcGk6IFwiMy4wLjBcIixcbiAgICBpbmZvOiB7XG4gICAgICB0aXRsZTogZ2xvYmFsU2V0dXBQYXJhbXMuYXBpTmFtZSxcbiAgICAgIHZlcnNpb246IFwiMS4wLjBcIixcbiAgICB9LFxuICAgIHNlcnZlcnM6IFtcbiAgICAgIHtcbiAgICAgICAgdXJsOiBnbG9iYWxTZXR1cFBhcmFtcy5wcm9kdWN0aW9uU2VydmVyVXJsIHx8IFwiaHR0cHM6Ly9leGFtcGxlLmNvbVwiLFxuICAgICAgfSxcbiAgICBdLFxuICAgIHRhZ3M6IHRhZ3MubWFwKCh0YWcpID0+ICh7IG5hbWU6IHRhZy5uYW1lLCBkZXNjcmlwdGlvbjogdGFnLmRlc2NyaXB0aW9uIH0pKSxcbiAgICBwYXRoczoge30sXG4gICAgY29tcG9uZW50czoge1xuICAgICAgc2VjdXJpdHlTY2hlbWVzLFxuICAgICAgc2NoZW1hczogZ2xvYmFsU2NoZW1hcyxcbiAgICB9LFxuICB9KVxuXG4gIGZvciAoY29uc3QgW1xuICAgIGZpbGVfcGF0aCxcbiAgICB7IHNldHVwUGFyYW1zLCByb3V0ZVNwZWMsIHJvdXRlOiByb3V0ZVBhdGggfSxcbiAgXSBvZiBmaWxlcGF0aFRvUm91dGVGbikge1xuICAgIGNvbnN0IGlzUG9zdE9yUHV0T3JQYXRjaCA9IFtcIlBPU1RcIiwgXCJQVVRcIiwgXCJQQVRDSFwiXS5zb21lKChtZXRob2QpID0+XG4gICAgICByb3V0ZVNwZWMubWV0aG9kcy5pbmNsdWRlcyhtZXRob2QpXG4gICAgKVxuICAgIC8vIFRPRE86IHN1cHBvcnQgbXVsdGlwYXJ0L2Zvcm0tZGF0YVxuXG4gICAgLy8gaGFuZGxlIGJvZHlcbiAgICBsZXQgYm9keV90b19nZW5lcmF0ZV9zY2hlbWFcbiAgICBpZiAoaXNQb3N0T3JQdXRPclBhdGNoKSB7XG4gICAgICBib2R5X3RvX2dlbmVyYXRlX3NjaGVtYSA9IHJvdXRlU3BlYy5qc29uQm9keSA/PyByb3V0ZVNwZWMuY29tbW9uUGFyYW1zXG5cbiAgICAgIGlmIChyb3V0ZVNwZWMuanNvbkJvZHkgJiYgcm91dGVTcGVjLmNvbW1vblBhcmFtcykge1xuICAgICAgICBib2R5X3RvX2dlbmVyYXRlX3NjaGVtYSA9IHJvdXRlU3BlYy5qc29uQm9keS5tZXJnZShcbiAgICAgICAgICByb3V0ZVNwZWMuY29tbW9uUGFyYW1zXG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgYm9keV90b19nZW5lcmF0ZV9zY2hlbWEgPSByb3V0ZVNwZWMuanNvbkJvZHlcbiAgICB9XG5cbiAgICAvLyBoYW5kbGUgcXVlcnlcbiAgICBsZXQgcXVlcnlfdG9fZ2VuZXJhdGVfc2NoZW1hXG4gICAgaWYgKGlzUG9zdE9yUHV0T3JQYXRjaCkge1xuICAgICAgcXVlcnlfdG9fZ2VuZXJhdGVfc2NoZW1hID0gcm91dGVTcGVjLnF1ZXJ5UGFyYW1zXG4gICAgfSBlbHNlIHtcbiAgICAgIHF1ZXJ5X3RvX2dlbmVyYXRlX3NjaGVtYSA9IHJvdXRlU3BlYy5xdWVyeVBhcmFtcyA/PyByb3V0ZVNwZWMuY29tbW9uUGFyYW1zXG5cbiAgICAgIGlmIChyb3V0ZVNwZWMucXVlcnlQYXJhbXMgJiYgcm91dGVTcGVjLmNvbW1vblBhcmFtcykge1xuICAgICAgICBxdWVyeV90b19nZW5lcmF0ZV9zY2hlbWEgPSByb3V0ZVNwZWMucXVlcnlQYXJhbXMubWVyZ2UoXG4gICAgICAgICAgcm91dGVTcGVjLmNvbW1vblBhcmFtc1xuICAgICAgICApXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gREVMRVRFIGFuZCBHRVQgY2Fubm90IGhhdmUgYSBib2R5XG4gICAgbGV0IG1ldGhvZHMgPSByb3V0ZVNwZWMubWV0aG9kc1xuXG4gICAgaWYgKHJvdXRlU3BlYy5tZXRob2RzLmluY2x1ZGVzKFwiREVMRVRFXCIpICYmIGJvZHlfdG9fZ2VuZXJhdGVfc2NoZW1hKSB7XG4gICAgICBtZXRob2RzID0gbWV0aG9kcy5maWx0ZXIoKG0pID0+IG0gIT09IFwiREVMRVRFXCIpXG4gICAgfVxuXG4gICAgaWYgKHJvdXRlU3BlYy5tZXRob2RzLmluY2x1ZGVzKFwiR0VUXCIpICYmIGJvZHlfdG9fZ2VuZXJhdGVfc2NoZW1hKSB7XG4gICAgICBtZXRob2RzID0gbWV0aG9kcy5maWx0ZXIoKG0pID0+IG0gIT09IFwiR0VUXCIpXG4gICAgfVxuXG4gICAgaWYgKG1ldGhvZHMubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGNoYWxrLnllbGxvdyhgU2tpcHBpbmcgcm91dGUgJHtyb3V0ZVBhdGh9IGJlY2F1c2UgaXQgaGFzIG5vIG1ldGhvZHMuYClcbiAgICAgIClcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgY29uc3Qgcm91dGU6IE9wZXJhdGlvbk9iamVjdCA9IHtcbiAgICAgIHN1bW1hcnk6IHJvdXRlUGF0aCxcbiAgICAgIHJlc3BvbnNlczoge1xuICAgICAgICAyMDA6IHtcbiAgICAgICAgICBkZXNjcmlwdGlvbjogXCJPS1wiLFxuICAgICAgICB9LFxuICAgICAgICA0MDA6IHtcbiAgICAgICAgICBkZXNjcmlwdGlvbjogXCJCYWQgUmVxdWVzdFwiLFxuICAgICAgICB9LFxuICAgICAgICA0MDE6IHtcbiAgICAgICAgICBkZXNjcmlwdGlvbjogXCJVbmF1dGhvcml6ZWRcIixcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBzZWN1cml0eTogc2VjdXJpdHlPYmplY3RzRm9yQXV0aFR5cGVbcm91dGVTcGVjLmF1dGhdLFxuICAgIH1cblxuICAgIGlmIChib2R5X3RvX2dlbmVyYXRlX3NjaGVtYSkge1xuICAgICAgcm91dGUucmVxdWVzdEJvZHkgPSB7XG4gICAgICAgIGNvbnRlbnQ6IHtcbiAgICAgICAgICBcImFwcGxpY2F0aW9uL2pzb25cIjoge1xuICAgICAgICAgICAgc2NoZW1hOiBnZW5lcmF0ZVNjaGVtYShib2R5X3RvX2dlbmVyYXRlX3NjaGVtYSBhcyBhbnkpLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHF1ZXJ5X3RvX2dlbmVyYXRlX3NjaGVtYSkge1xuICAgICAgY29uc3Qgc2NoZW1hID0gZ2VuZXJhdGVTY2hlbWEocXVlcnlfdG9fZ2VuZXJhdGVfc2NoZW1hIGFzIGFueSlcbiAgICAgIGlmIChzY2hlbWEucHJvcGVydGllcykge1xuICAgICAgICBjb25zdCBwYXJhbWV0ZXJzOiBQYXJhbWV0ZXJPYmplY3RbXSA9IE9iamVjdC5rZXlzKFxuICAgICAgICAgIHNjaGVtYS5wcm9wZXJ0aWVzIGFzIGFueVxuICAgICAgICApLm1hcCgobmFtZSkgPT4ge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgaW46IFwicXVlcnlcIixcbiAgICAgICAgICAgIHNjaGVtYTogc2NoZW1hLnByb3BlcnRpZXMhW25hbWVdLFxuICAgICAgICAgICAgcmVxdWlyZWQ6IHNjaGVtYS5yZXF1aXJlZD8uaW5jbHVkZXMobmFtZSksXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuXG4gICAgICAgIHJvdXRlLnBhcmFtZXRlcnMgPSBwYXJhbWV0ZXJzXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgeyBqc29uUmVzcG9uc2UgfSA9IHJvdXRlU3BlY1xuICAgIGNvbnN0IHsgYWRkT2tTdGF0dXMgPSB0cnVlIH0gPSBzZXR1cFBhcmFtc1xuXG4gICAgaWYgKGpzb25SZXNwb25zZSkge1xuICAgICAgaWYgKFxuICAgICAgICAhanNvblJlc3BvbnNlLl9kZWYgfHxcbiAgICAgICAgIWpzb25SZXNwb25zZS5fZGVmLnR5cGVOYW1lIHx8XG4gICAgICAgIGpzb25SZXNwb25zZS5fZGVmLnR5cGVOYW1lICE9PSBcIlpvZE9iamVjdFwiXG4gICAgICApIHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGNoYWxrLnllbGxvdyhcbiAgICAgICAgICAgIGBTa2lwcGluZyByb3V0ZSAke3JvdXRlUGF0aH0gYmVjYXVzZSB0aGUgcmVzcG9uc2UgaXMgbm90IGEgWm9kT2JqZWN0LmBcbiAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVzcG9uc2VTY2hlbWEgPSBnZW5lcmF0ZVNjaGVtYShcbiAgICAgICAgYWRkT2tTdGF0dXMgPyBqc29uUmVzcG9uc2UuZXh0ZW5kKHsgb2s6IHouYm9vbGVhbigpIH0pIDoganNvblJlc3BvbnNlXG4gICAgICApXG5cbiAgICAgIGNvbnN0IHNjaGVtYVdpdGhSZWZlcmVuY2VzID0gZW1iZWRTY2hlbWFSZWZlcmVuY2VzKFxuICAgICAgICByZXNwb25zZVNjaGVtYSxcbiAgICAgICAgZ2xvYmFsU2NoZW1hc1xuICAgICAgKVxuXG4gICAgICByb3V0ZS5yZXNwb25zZXNbMjAwXS5jb250ZW50ID0ge1xuICAgICAgICBcImFwcGxpY2F0aW9uL2pzb25cIjoge1xuICAgICAgICAgIHNjaGVtYTogc2NoZW1hV2l0aFJlZmVyZW5jZXMsXG4gICAgICAgIH0sXG4gICAgICB9XG4gICAgfVxuXG4gICAgcm91dGUudGFncyA9IFtdXG4gICAgZm9yIChjb25zdCB0YWcgb2YgdGFncykge1xuICAgICAgaWYgKHRhZy5kb2VzUm91dGVIYXZlVGFnICYmIHRhZy5kb2VzUm91dGVIYXZlVGFnKHJvdXRlLnN1bW1hcnkgfHwgXCJcIikpIHtcbiAgICAgICAgcm91dGUudGFncy5wdXNoKHRhZy5uYW1lKVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IG1ldGhvZHNNYXBwZWRUb0Zlcm5TZGtNZXRhZGF0YSA9IG1hcE1ldGhvZHNUb0Zlcm5TZGtNZXRhZGF0YShcbiAgICAgIG1ldGhvZHMsXG4gICAgICByb3V0ZVBhdGhcbiAgICApXG5cbiAgICAvLyBTb21lIHJvdXRlcyBhY2NlcHQgbXVsdGlwbGUgbWV0aG9kc1xuICAgIGJ1aWxkZXIuYWRkUGF0aChyb3V0ZVBhdGgsIHtcbiAgICAgIC4uLm1ldGhvZHNcbiAgICAgICAgLm1hcCgobWV0aG9kKSA9PiAoe1xuICAgICAgICAgIFttZXRob2QudG9Mb3dlckNhc2UoKV06IHtcbiAgICAgICAgICAgIC4uLm1ldGhvZHNNYXBwZWRUb0Zlcm5TZGtNZXRhZGF0YVttZXRob2RdLFxuICAgICAgICAgICAgLi4ucm91dGUsXG4gICAgICAgICAgICBvcGVyYXRpb25JZDogYCR7dHJhbnNmb3JtUGF0aFRvT3BlcmF0aW9uSWQocm91dGVQYXRoKX0ke3Bhc2NhbENhc2UoXG4gICAgICAgICAgICAgIG1ldGhvZFxuICAgICAgICAgICAgKX1gLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pKVxuICAgICAgICAucmVkdWNlUmlnaHQoKGFjYywgY3VyKSA9PiAoeyAuLi5hY2MsIC4uLmN1ciB9KSwge30pLFxuICAgIH0pXG4gIH1cblxuICBpZiAob3V0cHV0RmlsZSkge1xuICAgIGF3YWl0IGZzLndyaXRlRmlsZShvdXRwdXRGaWxlLCBidWlsZGVyLmdldFNwZWNBc0pzb24oKSlcbiAgfVxuXG4gIHJldHVybiBidWlsZGVyLmdldFNwZWNBc0pzb24oKVxufVxuIiwgImltcG9ydCBhbnNpU3R5bGVzIGZyb20gJyNhbnNpLXN0eWxlcyc7XG5pbXBvcnQgc3VwcG9ydHNDb2xvciBmcm9tICcjc3VwcG9ydHMtY29sb3InO1xuaW1wb3J0IHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBpbXBvcnQvb3JkZXJcblx0c3RyaW5nUmVwbGFjZUFsbCxcblx0c3RyaW5nRW5jYXNlQ1JMRldpdGhGaXJzdEluZGV4LFxufSBmcm9tICcuL3V0aWxpdGllcy5qcyc7XG5cbmNvbnN0IHtzdGRvdXQ6IHN0ZG91dENvbG9yLCBzdGRlcnI6IHN0ZGVyckNvbG9yfSA9IHN1cHBvcnRzQ29sb3I7XG5cbmNvbnN0IEdFTkVSQVRPUiA9IFN5bWJvbCgnR0VORVJBVE9SJyk7XG5jb25zdCBTVFlMRVIgPSBTeW1ib2woJ1NUWUxFUicpO1xuY29uc3QgSVNfRU1QVFkgPSBTeW1ib2woJ0lTX0VNUFRZJyk7XG5cbi8vIGBzdXBwb3J0c0NvbG9yLmxldmVsYCBcdTIxOTIgYGFuc2lTdHlsZXMuY29sb3JbbmFtZV1gIG1hcHBpbmdcbmNvbnN0IGxldmVsTWFwcGluZyA9IFtcblx0J2Fuc2knLFxuXHQnYW5zaScsXG5cdCdhbnNpMjU2Jyxcblx0J2Fuc2kxNm0nLFxuXTtcblxuY29uc3Qgc3R5bGVzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcblxuY29uc3QgYXBwbHlPcHRpb25zID0gKG9iamVjdCwgb3B0aW9ucyA9IHt9KSA9PiB7XG5cdGlmIChvcHRpb25zLmxldmVsICYmICEoTnVtYmVyLmlzSW50ZWdlcihvcHRpb25zLmxldmVsKSAmJiBvcHRpb25zLmxldmVsID49IDAgJiYgb3B0aW9ucy5sZXZlbCA8PSAzKSkge1xuXHRcdHRocm93IG5ldyBFcnJvcignVGhlIGBsZXZlbGAgb3B0aW9uIHNob3VsZCBiZSBhbiBpbnRlZ2VyIGZyb20gMCB0byAzJyk7XG5cdH1cblxuXHQvLyBEZXRlY3QgbGV2ZWwgaWYgbm90IHNldCBtYW51YWxseVxuXHRjb25zdCBjb2xvckxldmVsID0gc3Rkb3V0Q29sb3IgPyBzdGRvdXRDb2xvci5sZXZlbCA6IDA7XG5cdG9iamVjdC5sZXZlbCA9IG9wdGlvbnMubGV2ZWwgPT09IHVuZGVmaW5lZCA/IGNvbG9yTGV2ZWwgOiBvcHRpb25zLmxldmVsO1xufTtcblxuZXhwb3J0IGNsYXNzIENoYWxrIHtcblx0Y29uc3RydWN0b3Iob3B0aW9ucykge1xuXHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zdHJ1Y3Rvci1yZXR1cm5cblx0XHRyZXR1cm4gY2hhbGtGYWN0b3J5KG9wdGlvbnMpO1xuXHR9XG59XG5cbmNvbnN0IGNoYWxrRmFjdG9yeSA9IG9wdGlvbnMgPT4ge1xuXHRjb25zdCBjaGFsayA9ICguLi5zdHJpbmdzKSA9PiBzdHJpbmdzLmpvaW4oJyAnKTtcblx0YXBwbHlPcHRpb25zKGNoYWxrLCBvcHRpb25zKTtcblxuXHRPYmplY3Quc2V0UHJvdG90eXBlT2YoY2hhbGssIGNyZWF0ZUNoYWxrLnByb3RvdHlwZSk7XG5cblx0cmV0dXJuIGNoYWxrO1xufTtcblxuZnVuY3Rpb24gY3JlYXRlQ2hhbGsob3B0aW9ucykge1xuXHRyZXR1cm4gY2hhbGtGYWN0b3J5KG9wdGlvbnMpO1xufVxuXG5PYmplY3Quc2V0UHJvdG90eXBlT2YoY3JlYXRlQ2hhbGsucHJvdG90eXBlLCBGdW5jdGlvbi5wcm90b3R5cGUpO1xuXG5mb3IgKGNvbnN0IFtzdHlsZU5hbWUsIHN0eWxlXSBvZiBPYmplY3QuZW50cmllcyhhbnNpU3R5bGVzKSkge1xuXHRzdHlsZXNbc3R5bGVOYW1lXSA9IHtcblx0XHRnZXQoKSB7XG5cdFx0XHRjb25zdCBidWlsZGVyID0gY3JlYXRlQnVpbGRlcih0aGlzLCBjcmVhdGVTdHlsZXIoc3R5bGUub3Blbiwgc3R5bGUuY2xvc2UsIHRoaXNbU1RZTEVSXSksIHRoaXNbSVNfRU1QVFldKTtcblx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBzdHlsZU5hbWUsIHt2YWx1ZTogYnVpbGRlcn0pO1xuXHRcdFx0cmV0dXJuIGJ1aWxkZXI7XG5cdFx0fSxcblx0fTtcbn1cblxuc3R5bGVzLnZpc2libGUgPSB7XG5cdGdldCgpIHtcblx0XHRjb25zdCBidWlsZGVyID0gY3JlYXRlQnVpbGRlcih0aGlzLCB0aGlzW1NUWUxFUl0sIHRydWUpO1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAndmlzaWJsZScsIHt2YWx1ZTogYnVpbGRlcn0pO1xuXHRcdHJldHVybiBidWlsZGVyO1xuXHR9LFxufTtcblxuY29uc3QgZ2V0TW9kZWxBbnNpID0gKG1vZGVsLCBsZXZlbCwgdHlwZSwgLi4uYXJndW1lbnRzXykgPT4ge1xuXHRpZiAobW9kZWwgPT09ICdyZ2InKSB7XG5cdFx0aWYgKGxldmVsID09PSAnYW5zaTE2bScpIHtcblx0XHRcdHJldHVybiBhbnNpU3R5bGVzW3R5cGVdLmFuc2kxNm0oLi4uYXJndW1lbnRzXyk7XG5cdFx0fVxuXG5cdFx0aWYgKGxldmVsID09PSAnYW5zaTI1NicpIHtcblx0XHRcdHJldHVybiBhbnNpU3R5bGVzW3R5cGVdLmFuc2kyNTYoYW5zaVN0eWxlcy5yZ2JUb0Fuc2kyNTYoLi4uYXJndW1lbnRzXykpO1xuXHRcdH1cblxuXHRcdHJldHVybiBhbnNpU3R5bGVzW3R5cGVdLmFuc2koYW5zaVN0eWxlcy5yZ2JUb0Fuc2koLi4uYXJndW1lbnRzXykpO1xuXHR9XG5cblx0aWYgKG1vZGVsID09PSAnaGV4Jykge1xuXHRcdHJldHVybiBnZXRNb2RlbEFuc2koJ3JnYicsIGxldmVsLCB0eXBlLCAuLi5hbnNpU3R5bGVzLmhleFRvUmdiKC4uLmFyZ3VtZW50c18pKTtcblx0fVxuXG5cdHJldHVybiBhbnNpU3R5bGVzW3R5cGVdW21vZGVsXSguLi5hcmd1bWVudHNfKTtcbn07XG5cbmNvbnN0IHVzZWRNb2RlbHMgPSBbJ3JnYicsICdoZXgnLCAnYW5zaTI1NiddO1xuXG5mb3IgKGNvbnN0IG1vZGVsIG9mIHVzZWRNb2RlbHMpIHtcblx0c3R5bGVzW21vZGVsXSA9IHtcblx0XHRnZXQoKSB7XG5cdFx0XHRjb25zdCB7bGV2ZWx9ID0gdGhpcztcblx0XHRcdHJldHVybiBmdW5jdGlvbiAoLi4uYXJndW1lbnRzXykge1xuXHRcdFx0XHRjb25zdCBzdHlsZXIgPSBjcmVhdGVTdHlsZXIoZ2V0TW9kZWxBbnNpKG1vZGVsLCBsZXZlbE1hcHBpbmdbbGV2ZWxdLCAnY29sb3InLCAuLi5hcmd1bWVudHNfKSwgYW5zaVN0eWxlcy5jb2xvci5jbG9zZSwgdGhpc1tTVFlMRVJdKTtcblx0XHRcdFx0cmV0dXJuIGNyZWF0ZUJ1aWxkZXIodGhpcywgc3R5bGVyLCB0aGlzW0lTX0VNUFRZXSk7XG5cdFx0XHR9O1xuXHRcdH0sXG5cdH07XG5cblx0Y29uc3QgYmdNb2RlbCA9ICdiZycgKyBtb2RlbFswXS50b1VwcGVyQ2FzZSgpICsgbW9kZWwuc2xpY2UoMSk7XG5cdHN0eWxlc1tiZ01vZGVsXSA9IHtcblx0XHRnZXQoKSB7XG5cdFx0XHRjb25zdCB7bGV2ZWx9ID0gdGhpcztcblx0XHRcdHJldHVybiBmdW5jdGlvbiAoLi4uYXJndW1lbnRzXykge1xuXHRcdFx0XHRjb25zdCBzdHlsZXIgPSBjcmVhdGVTdHlsZXIoZ2V0TW9kZWxBbnNpKG1vZGVsLCBsZXZlbE1hcHBpbmdbbGV2ZWxdLCAnYmdDb2xvcicsIC4uLmFyZ3VtZW50c18pLCBhbnNpU3R5bGVzLmJnQ29sb3IuY2xvc2UsIHRoaXNbU1RZTEVSXSk7XG5cdFx0XHRcdHJldHVybiBjcmVhdGVCdWlsZGVyKHRoaXMsIHN0eWxlciwgdGhpc1tJU19FTVBUWV0pO1xuXHRcdFx0fTtcblx0XHR9LFxuXHR9O1xufVxuXG5jb25zdCBwcm90byA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCgpID0+IHt9LCB7XG5cdC4uLnN0eWxlcyxcblx0bGV2ZWw6IHtcblx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuXHRcdGdldCgpIHtcblx0XHRcdHJldHVybiB0aGlzW0dFTkVSQVRPUl0ubGV2ZWw7XG5cdFx0fSxcblx0XHRzZXQobGV2ZWwpIHtcblx0XHRcdHRoaXNbR0VORVJBVE9SXS5sZXZlbCA9IGxldmVsO1xuXHRcdH0sXG5cdH0sXG59KTtcblxuY29uc3QgY3JlYXRlU3R5bGVyID0gKG9wZW4sIGNsb3NlLCBwYXJlbnQpID0+IHtcblx0bGV0IG9wZW5BbGw7XG5cdGxldCBjbG9zZUFsbDtcblx0aWYgKHBhcmVudCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0b3BlbkFsbCA9IG9wZW47XG5cdFx0Y2xvc2VBbGwgPSBjbG9zZTtcblx0fSBlbHNlIHtcblx0XHRvcGVuQWxsID0gcGFyZW50Lm9wZW5BbGwgKyBvcGVuO1xuXHRcdGNsb3NlQWxsID0gY2xvc2UgKyBwYXJlbnQuY2xvc2VBbGw7XG5cdH1cblxuXHRyZXR1cm4ge1xuXHRcdG9wZW4sXG5cdFx0Y2xvc2UsXG5cdFx0b3BlbkFsbCxcblx0XHRjbG9zZUFsbCxcblx0XHRwYXJlbnQsXG5cdH07XG59O1xuXG5jb25zdCBjcmVhdGVCdWlsZGVyID0gKHNlbGYsIF9zdHlsZXIsIF9pc0VtcHR5KSA9PiB7XG5cdC8vIFNpbmdsZSBhcmd1bWVudCBpcyBob3QgcGF0aCwgaW1wbGljaXQgY29lcmNpb24gaXMgZmFzdGVyIHRoYW4gYW55dGhpbmdcblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWltcGxpY2l0LWNvZXJjaW9uXG5cdGNvbnN0IGJ1aWxkZXIgPSAoLi4uYXJndW1lbnRzXykgPT4gYXBwbHlTdHlsZShidWlsZGVyLCAoYXJndW1lbnRzXy5sZW5ndGggPT09IDEpID8gKCcnICsgYXJndW1lbnRzX1swXSkgOiBhcmd1bWVudHNfLmpvaW4oJyAnKSk7XG5cblx0Ly8gV2UgYWx0ZXIgdGhlIHByb3RvdHlwZSBiZWNhdXNlIHdlIG11c3QgcmV0dXJuIGEgZnVuY3Rpb24sIGJ1dCB0aGVyZSBpc1xuXHQvLyBubyB3YXkgdG8gY3JlYXRlIGEgZnVuY3Rpb24gd2l0aCBhIGRpZmZlcmVudCBwcm90b3R5cGVcblx0T2JqZWN0LnNldFByb3RvdHlwZU9mKGJ1aWxkZXIsIHByb3RvKTtcblxuXHRidWlsZGVyW0dFTkVSQVRPUl0gPSBzZWxmO1xuXHRidWlsZGVyW1NUWUxFUl0gPSBfc3R5bGVyO1xuXHRidWlsZGVyW0lTX0VNUFRZXSA9IF9pc0VtcHR5O1xuXG5cdHJldHVybiBidWlsZGVyO1xufTtcblxuY29uc3QgYXBwbHlTdHlsZSA9IChzZWxmLCBzdHJpbmcpID0+IHtcblx0aWYgKHNlbGYubGV2ZWwgPD0gMCB8fCAhc3RyaW5nKSB7XG5cdFx0cmV0dXJuIHNlbGZbSVNfRU1QVFldID8gJycgOiBzdHJpbmc7XG5cdH1cblxuXHRsZXQgc3R5bGVyID0gc2VsZltTVFlMRVJdO1xuXG5cdGlmIChzdHlsZXIgPT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiBzdHJpbmc7XG5cdH1cblxuXHRjb25zdCB7b3BlbkFsbCwgY2xvc2VBbGx9ID0gc3R5bGVyO1xuXHRpZiAoc3RyaW5nLmluY2x1ZGVzKCdcXHUwMDFCJykpIHtcblx0XHR3aGlsZSAoc3R5bGVyICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdC8vIFJlcGxhY2UgYW55IGluc3RhbmNlcyBhbHJlYWR5IHByZXNlbnQgd2l0aCBhIHJlLW9wZW5pbmcgY29kZVxuXHRcdFx0Ly8gb3RoZXJ3aXNlIG9ubHkgdGhlIHBhcnQgb2YgdGhlIHN0cmluZyB1bnRpbCBzYWlkIGNsb3NpbmcgY29kZVxuXHRcdFx0Ly8gd2lsbCBiZSBjb2xvcmVkLCBhbmQgdGhlIHJlc3Qgd2lsbCBzaW1wbHkgYmUgJ3BsYWluJy5cblx0XHRcdHN0cmluZyA9IHN0cmluZ1JlcGxhY2VBbGwoc3RyaW5nLCBzdHlsZXIuY2xvc2UsIHN0eWxlci5vcGVuKTtcblxuXHRcdFx0c3R5bGVyID0gc3R5bGVyLnBhcmVudDtcblx0XHR9XG5cdH1cblxuXHQvLyBXZSBjYW4gbW92ZSBib3RoIG5leHQgYWN0aW9ucyBvdXQgb2YgbG9vcCwgYmVjYXVzZSByZW1haW5pbmcgYWN0aW9ucyBpbiBsb29wIHdvbid0IGhhdmVcblx0Ly8gYW55L3Zpc2libGUgZWZmZWN0IG9uIHBhcnRzIHdlIGFkZCBoZXJlLiBDbG9zZSB0aGUgc3R5bGluZyBiZWZvcmUgYSBsaW5lYnJlYWsgYW5kIHJlb3BlblxuXHQvLyBhZnRlciBuZXh0IGxpbmUgdG8gZml4IGEgYmxlZWQgaXNzdWUgb24gbWFjT1M6IGh0dHBzOi8vZ2l0aHViLmNvbS9jaGFsay9jaGFsay9wdWxsLzkyXG5cdGNvbnN0IGxmSW5kZXggPSBzdHJpbmcuaW5kZXhPZignXFxuJyk7XG5cdGlmIChsZkluZGV4ICE9PSAtMSkge1xuXHRcdHN0cmluZyA9IHN0cmluZ0VuY2FzZUNSTEZXaXRoRmlyc3RJbmRleChzdHJpbmcsIGNsb3NlQWxsLCBvcGVuQWxsLCBsZkluZGV4KTtcblx0fVxuXG5cdHJldHVybiBvcGVuQWxsICsgc3RyaW5nICsgY2xvc2VBbGw7XG59O1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhjcmVhdGVDaGFsay5wcm90b3R5cGUsIHN0eWxlcyk7XG5cbmNvbnN0IGNoYWxrID0gY3JlYXRlQ2hhbGsoKTtcbmV4cG9ydCBjb25zdCBjaGFsa1N0ZGVyciA9IGNyZWF0ZUNoYWxrKHtsZXZlbDogc3RkZXJyQ29sb3IgPyBzdGRlcnJDb2xvci5sZXZlbCA6IDB9KTtcblxuZXhwb3J0IHtcblx0bW9kaWZpZXJOYW1lcyxcblx0Zm9yZWdyb3VuZENvbG9yTmFtZXMsXG5cdGJhY2tncm91bmRDb2xvck5hbWVzLFxuXHRjb2xvck5hbWVzLFxuXG5cdC8vIFRPRE86IFJlbW92ZSB0aGVzZSBhbGlhc2VzIGluIHRoZSBuZXh0IG1ham9yIHZlcnNpb25cblx0bW9kaWZpZXJOYW1lcyBhcyBtb2RpZmllcnMsXG5cdGZvcmVncm91bmRDb2xvck5hbWVzIGFzIGZvcmVncm91bmRDb2xvcnMsXG5cdGJhY2tncm91bmRDb2xvck5hbWVzIGFzIGJhY2tncm91bmRDb2xvcnMsXG5cdGNvbG9yTmFtZXMgYXMgY29sb3JzLFxufSBmcm9tICcuL3ZlbmRvci9hbnNpLXN0eWxlcy9pbmRleC5qcyc7XG5cbmV4cG9ydCB7XG5cdHN0ZG91dENvbG9yIGFzIHN1cHBvcnRzQ29sb3IsXG5cdHN0ZGVyckNvbG9yIGFzIHN1cHBvcnRzQ29sb3JTdGRlcnIsXG59O1xuXG5leHBvcnQgZGVmYXVsdCBjaGFsaztcbiIsICJjb25zdCBBTlNJX0JBQ0tHUk9VTkRfT0ZGU0VUID0gMTA7XG5cbmNvbnN0IHdyYXBBbnNpMTYgPSAob2Zmc2V0ID0gMCkgPT4gY29kZSA9PiBgXFx1MDAxQlske2NvZGUgKyBvZmZzZXR9bWA7XG5cbmNvbnN0IHdyYXBBbnNpMjU2ID0gKG9mZnNldCA9IDApID0+IGNvZGUgPT4gYFxcdTAwMUJbJHszOCArIG9mZnNldH07NTske2NvZGV9bWA7XG5cbmNvbnN0IHdyYXBBbnNpMTZtID0gKG9mZnNldCA9IDApID0+IChyZWQsIGdyZWVuLCBibHVlKSA9PiBgXFx1MDAxQlskezM4ICsgb2Zmc2V0fTsyOyR7cmVkfTske2dyZWVufTske2JsdWV9bWA7XG5cbmNvbnN0IHN0eWxlcyA9IHtcblx0bW9kaWZpZXI6IHtcblx0XHRyZXNldDogWzAsIDBdLFxuXHRcdC8vIDIxIGlzbid0IHdpZGVseSBzdXBwb3J0ZWQgYW5kIDIyIGRvZXMgdGhlIHNhbWUgdGhpbmdcblx0XHRib2xkOiBbMSwgMjJdLFxuXHRcdGRpbTogWzIsIDIyXSxcblx0XHRpdGFsaWM6IFszLCAyM10sXG5cdFx0dW5kZXJsaW5lOiBbNCwgMjRdLFxuXHRcdG92ZXJsaW5lOiBbNTMsIDU1XSxcblx0XHRpbnZlcnNlOiBbNywgMjddLFxuXHRcdGhpZGRlbjogWzgsIDI4XSxcblx0XHRzdHJpa2V0aHJvdWdoOiBbOSwgMjldLFxuXHR9LFxuXHRjb2xvcjoge1xuXHRcdGJsYWNrOiBbMzAsIDM5XSxcblx0XHRyZWQ6IFszMSwgMzldLFxuXHRcdGdyZWVuOiBbMzIsIDM5XSxcblx0XHR5ZWxsb3c6IFszMywgMzldLFxuXHRcdGJsdWU6IFszNCwgMzldLFxuXHRcdG1hZ2VudGE6IFszNSwgMzldLFxuXHRcdGN5YW46IFszNiwgMzldLFxuXHRcdHdoaXRlOiBbMzcsIDM5XSxcblxuXHRcdC8vIEJyaWdodCBjb2xvclxuXHRcdGJsYWNrQnJpZ2h0OiBbOTAsIDM5XSxcblx0XHRncmF5OiBbOTAsIDM5XSwgLy8gQWxpYXMgb2YgYGJsYWNrQnJpZ2h0YFxuXHRcdGdyZXk6IFs5MCwgMzldLCAvLyBBbGlhcyBvZiBgYmxhY2tCcmlnaHRgXG5cdFx0cmVkQnJpZ2h0OiBbOTEsIDM5XSxcblx0XHRncmVlbkJyaWdodDogWzkyLCAzOV0sXG5cdFx0eWVsbG93QnJpZ2h0OiBbOTMsIDM5XSxcblx0XHRibHVlQnJpZ2h0OiBbOTQsIDM5XSxcblx0XHRtYWdlbnRhQnJpZ2h0OiBbOTUsIDM5XSxcblx0XHRjeWFuQnJpZ2h0OiBbOTYsIDM5XSxcblx0XHR3aGl0ZUJyaWdodDogWzk3LCAzOV0sXG5cdH0sXG5cdGJnQ29sb3I6IHtcblx0XHRiZ0JsYWNrOiBbNDAsIDQ5XSxcblx0XHRiZ1JlZDogWzQxLCA0OV0sXG5cdFx0YmdHcmVlbjogWzQyLCA0OV0sXG5cdFx0YmdZZWxsb3c6IFs0MywgNDldLFxuXHRcdGJnQmx1ZTogWzQ0LCA0OV0sXG5cdFx0YmdNYWdlbnRhOiBbNDUsIDQ5XSxcblx0XHRiZ0N5YW46IFs0NiwgNDldLFxuXHRcdGJnV2hpdGU6IFs0NywgNDldLFxuXG5cdFx0Ly8gQnJpZ2h0IGNvbG9yXG5cdFx0YmdCbGFja0JyaWdodDogWzEwMCwgNDldLFxuXHRcdGJnR3JheTogWzEwMCwgNDldLCAvLyBBbGlhcyBvZiBgYmdCbGFja0JyaWdodGBcblx0XHRiZ0dyZXk6IFsxMDAsIDQ5XSwgLy8gQWxpYXMgb2YgYGJnQmxhY2tCcmlnaHRgXG5cdFx0YmdSZWRCcmlnaHQ6IFsxMDEsIDQ5XSxcblx0XHRiZ0dyZWVuQnJpZ2h0OiBbMTAyLCA0OV0sXG5cdFx0YmdZZWxsb3dCcmlnaHQ6IFsxMDMsIDQ5XSxcblx0XHRiZ0JsdWVCcmlnaHQ6IFsxMDQsIDQ5XSxcblx0XHRiZ01hZ2VudGFCcmlnaHQ6IFsxMDUsIDQ5XSxcblx0XHRiZ0N5YW5CcmlnaHQ6IFsxMDYsIDQ5XSxcblx0XHRiZ1doaXRlQnJpZ2h0OiBbMTA3LCA0OV0sXG5cdH0sXG59O1xuXG5leHBvcnQgY29uc3QgbW9kaWZpZXJOYW1lcyA9IE9iamVjdC5rZXlzKHN0eWxlcy5tb2RpZmllcik7XG5leHBvcnQgY29uc3QgZm9yZWdyb3VuZENvbG9yTmFtZXMgPSBPYmplY3Qua2V5cyhzdHlsZXMuY29sb3IpO1xuZXhwb3J0IGNvbnN0IGJhY2tncm91bmRDb2xvck5hbWVzID0gT2JqZWN0LmtleXMoc3R5bGVzLmJnQ29sb3IpO1xuZXhwb3J0IGNvbnN0IGNvbG9yTmFtZXMgPSBbLi4uZm9yZWdyb3VuZENvbG9yTmFtZXMsIC4uLmJhY2tncm91bmRDb2xvck5hbWVzXTtcblxuZnVuY3Rpb24gYXNzZW1ibGVTdHlsZXMoKSB7XG5cdGNvbnN0IGNvZGVzID0gbmV3IE1hcCgpO1xuXG5cdGZvciAoY29uc3QgW2dyb3VwTmFtZSwgZ3JvdXBdIG9mIE9iamVjdC5lbnRyaWVzKHN0eWxlcykpIHtcblx0XHRmb3IgKGNvbnN0IFtzdHlsZU5hbWUsIHN0eWxlXSBvZiBPYmplY3QuZW50cmllcyhncm91cCkpIHtcblx0XHRcdHN0eWxlc1tzdHlsZU5hbWVdID0ge1xuXHRcdFx0XHRvcGVuOiBgXFx1MDAxQlske3N0eWxlWzBdfW1gLFxuXHRcdFx0XHRjbG9zZTogYFxcdTAwMUJbJHtzdHlsZVsxXX1tYCxcblx0XHRcdH07XG5cblx0XHRcdGdyb3VwW3N0eWxlTmFtZV0gPSBzdHlsZXNbc3R5bGVOYW1lXTtcblxuXHRcdFx0Y29kZXMuc2V0KHN0eWxlWzBdLCBzdHlsZVsxXSk7XG5cdFx0fVxuXG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KHN0eWxlcywgZ3JvdXBOYW1lLCB7XG5cdFx0XHR2YWx1ZTogZ3JvdXAsXG5cdFx0XHRlbnVtZXJhYmxlOiBmYWxzZSxcblx0XHR9KTtcblx0fVxuXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzdHlsZXMsICdjb2RlcycsIHtcblx0XHR2YWx1ZTogY29kZXMsXG5cdFx0ZW51bWVyYWJsZTogZmFsc2UsXG5cdH0pO1xuXG5cdHN0eWxlcy5jb2xvci5jbG9zZSA9ICdcXHUwMDFCWzM5bSc7XG5cdHN0eWxlcy5iZ0NvbG9yLmNsb3NlID0gJ1xcdTAwMUJbNDltJztcblxuXHRzdHlsZXMuY29sb3IuYW5zaSA9IHdyYXBBbnNpMTYoKTtcblx0c3R5bGVzLmNvbG9yLmFuc2kyNTYgPSB3cmFwQW5zaTI1NigpO1xuXHRzdHlsZXMuY29sb3IuYW5zaTE2bSA9IHdyYXBBbnNpMTZtKCk7XG5cdHN0eWxlcy5iZ0NvbG9yLmFuc2kgPSB3cmFwQW5zaTE2KEFOU0lfQkFDS0dST1VORF9PRkZTRVQpO1xuXHRzdHlsZXMuYmdDb2xvci5hbnNpMjU2ID0gd3JhcEFuc2kyNTYoQU5TSV9CQUNLR1JPVU5EX09GRlNFVCk7XG5cdHN0eWxlcy5iZ0NvbG9yLmFuc2kxNm0gPSB3cmFwQW5zaTE2bShBTlNJX0JBQ0tHUk9VTkRfT0ZGU0VUKTtcblxuXHQvLyBGcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9RaXgtL2NvbG9yLWNvbnZlcnQvYmxvYi8zZjBlMGQ0ZTkyZTIzNTc5NmNjYjE3ZjZlODVjNzIwOTRhNjUxZjQ5L2NvbnZlcnNpb25zLmpzXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHN0eWxlcywge1xuXHRcdHJnYlRvQW5zaTI1Njoge1xuXHRcdFx0dmFsdWUocmVkLCBncmVlbiwgYmx1ZSkge1xuXHRcdFx0XHQvLyBXZSB1c2UgdGhlIGV4dGVuZGVkIGdyZXlzY2FsZSBwYWxldHRlIGhlcmUsIHdpdGggdGhlIGV4Y2VwdGlvbiBvZlxuXHRcdFx0XHQvLyBibGFjayBhbmQgd2hpdGUuIG5vcm1hbCBwYWxldHRlIG9ubHkgaGFzIDQgZ3JleXNjYWxlIHNoYWRlcy5cblx0XHRcdFx0aWYgKHJlZCA9PT0gZ3JlZW4gJiYgZ3JlZW4gPT09IGJsdWUpIHtcblx0XHRcdFx0XHRpZiAocmVkIDwgOCkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIDE2O1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlmIChyZWQgPiAyNDgpIHtcblx0XHRcdFx0XHRcdHJldHVybiAyMzE7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0cmV0dXJuIE1hdGgucm91bmQoKChyZWQgLSA4KSAvIDI0NykgKiAyNCkgKyAyMzI7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gMTZcblx0XHRcdFx0XHQrICgzNiAqIE1hdGgucm91bmQocmVkIC8gMjU1ICogNSkpXG5cdFx0XHRcdFx0KyAoNiAqIE1hdGgucm91bmQoZ3JlZW4gLyAyNTUgKiA1KSlcblx0XHRcdFx0XHQrIE1hdGgucm91bmQoYmx1ZSAvIDI1NSAqIDUpO1xuXHRcdFx0fSxcblx0XHRcdGVudW1lcmFibGU6IGZhbHNlLFxuXHRcdH0sXG5cdFx0aGV4VG9SZ2I6IHtcblx0XHRcdHZhbHVlKGhleCkge1xuXHRcdFx0XHRjb25zdCBtYXRjaGVzID0gL1thLWZcXGRdezZ9fFthLWZcXGRdezN9L2kuZXhlYyhoZXgudG9TdHJpbmcoMTYpKTtcblx0XHRcdFx0aWYgKCFtYXRjaGVzKSB7XG5cdFx0XHRcdFx0cmV0dXJuIFswLCAwLCAwXTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGxldCBbY29sb3JTdHJpbmddID0gbWF0Y2hlcztcblxuXHRcdFx0XHRpZiAoY29sb3JTdHJpbmcubGVuZ3RoID09PSAzKSB7XG5cdFx0XHRcdFx0Y29sb3JTdHJpbmcgPSBbLi4uY29sb3JTdHJpbmddLm1hcChjaGFyYWN0ZXIgPT4gY2hhcmFjdGVyICsgY2hhcmFjdGVyKS5qb2luKCcnKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGNvbnN0IGludGVnZXIgPSBOdW1iZXIucGFyc2VJbnQoY29sb3JTdHJpbmcsIDE2KTtcblxuXHRcdFx0XHRyZXR1cm4gW1xuXHRcdFx0XHRcdC8qIGVzbGludC1kaXNhYmxlIG5vLWJpdHdpc2UgKi9cblx0XHRcdFx0XHQoaW50ZWdlciA+PiAxNikgJiAweEZGLFxuXHRcdFx0XHRcdChpbnRlZ2VyID4+IDgpICYgMHhGRixcblx0XHRcdFx0XHRpbnRlZ2VyICYgMHhGRixcblx0XHRcdFx0XHQvKiBlc2xpbnQtZW5hYmxlIG5vLWJpdHdpc2UgKi9cblx0XHRcdFx0XTtcblx0XHRcdH0sXG5cdFx0XHRlbnVtZXJhYmxlOiBmYWxzZSxcblx0XHR9LFxuXHRcdGhleFRvQW5zaTI1Njoge1xuXHRcdFx0dmFsdWU6IGhleCA9PiBzdHlsZXMucmdiVG9BbnNpMjU2KC4uLnN0eWxlcy5oZXhUb1JnYihoZXgpKSxcblx0XHRcdGVudW1lcmFibGU6IGZhbHNlLFxuXHRcdH0sXG5cdFx0YW5zaTI1NlRvQW5zaToge1xuXHRcdFx0dmFsdWUoY29kZSkge1xuXHRcdFx0XHRpZiAoY29kZSA8IDgpIHtcblx0XHRcdFx0XHRyZXR1cm4gMzAgKyBjb2RlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKGNvZGUgPCAxNikge1xuXHRcdFx0XHRcdHJldHVybiA5MCArIChjb2RlIC0gOCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRsZXQgcmVkO1xuXHRcdFx0XHRsZXQgZ3JlZW47XG5cdFx0XHRcdGxldCBibHVlO1xuXG5cdFx0XHRcdGlmIChjb2RlID49IDIzMikge1xuXHRcdFx0XHRcdHJlZCA9ICgoKGNvZGUgLSAyMzIpICogMTApICsgOCkgLyAyNTU7XG5cdFx0XHRcdFx0Z3JlZW4gPSByZWQ7XG5cdFx0XHRcdFx0Ymx1ZSA9IHJlZDtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRjb2RlIC09IDE2O1xuXG5cdFx0XHRcdFx0Y29uc3QgcmVtYWluZGVyID0gY29kZSAlIDM2O1xuXG5cdFx0XHRcdFx0cmVkID0gTWF0aC5mbG9vcihjb2RlIC8gMzYpIC8gNTtcblx0XHRcdFx0XHRncmVlbiA9IE1hdGguZmxvb3IocmVtYWluZGVyIC8gNikgLyA1O1xuXHRcdFx0XHRcdGJsdWUgPSAocmVtYWluZGVyICUgNikgLyA1O1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Y29uc3QgdmFsdWUgPSBNYXRoLm1heChyZWQsIGdyZWVuLCBibHVlKSAqIDI7XG5cblx0XHRcdFx0aWYgKHZhbHVlID09PSAwKSB7XG5cdFx0XHRcdFx0cmV0dXJuIDMwO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWJpdHdpc2Vcblx0XHRcdFx0bGV0IHJlc3VsdCA9IDMwICsgKChNYXRoLnJvdW5kKGJsdWUpIDw8IDIpIHwgKE1hdGgucm91bmQoZ3JlZW4pIDw8IDEpIHwgTWF0aC5yb3VuZChyZWQpKTtcblxuXHRcdFx0XHRpZiAodmFsdWUgPT09IDIpIHtcblx0XHRcdFx0XHRyZXN1bHQgKz0gNjA7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdFx0fSxcblx0XHRcdGVudW1lcmFibGU6IGZhbHNlLFxuXHRcdH0sXG5cdFx0cmdiVG9BbnNpOiB7XG5cdFx0XHR2YWx1ZTogKHJlZCwgZ3JlZW4sIGJsdWUpID0+IHN0eWxlcy5hbnNpMjU2VG9BbnNpKHN0eWxlcy5yZ2JUb0Fuc2kyNTYocmVkLCBncmVlbiwgYmx1ZSkpLFxuXHRcdFx0ZW51bWVyYWJsZTogZmFsc2UsXG5cdFx0fSxcblx0XHRoZXhUb0Fuc2k6IHtcblx0XHRcdHZhbHVlOiBoZXggPT4gc3R5bGVzLmFuc2kyNTZUb0Fuc2koc3R5bGVzLmhleFRvQW5zaTI1NihoZXgpKSxcblx0XHRcdGVudW1lcmFibGU6IGZhbHNlLFxuXHRcdH0sXG5cdH0pO1xuXG5cdHJldHVybiBzdHlsZXM7XG59XG5cbmNvbnN0IGFuc2lTdHlsZXMgPSBhc3NlbWJsZVN0eWxlcygpO1xuXG5leHBvcnQgZGVmYXVsdCBhbnNpU3R5bGVzO1xuIiwgImltcG9ydCBwcm9jZXNzIGZyb20gJ25vZGU6cHJvY2Vzcyc7XG5pbXBvcnQgb3MgZnJvbSAnbm9kZTpvcyc7XG5pbXBvcnQgdHR5IGZyb20gJ25vZGU6dHR5JztcblxuLy8gRnJvbTogaHR0cHM6Ly9naXRodWIuY29tL3NpbmRyZXNvcmh1cy9oYXMtZmxhZy9ibG9iL21haW4vaW5kZXguanNcbi8vLyBmdW5jdGlvbiBoYXNGbGFnKGZsYWcsIGFyZ3YgPSBnbG9iYWxUaGlzLkRlbm8/LmFyZ3MgPz8gcHJvY2Vzcy5hcmd2KSB7XG5mdW5jdGlvbiBoYXNGbGFnKGZsYWcsIGFyZ3YgPSBnbG9iYWxUaGlzLkRlbm8gPyBnbG9iYWxUaGlzLkRlbm8uYXJncyA6IHByb2Nlc3MuYXJndikge1xuXHRjb25zdCBwcmVmaXggPSBmbGFnLnN0YXJ0c1dpdGgoJy0nKSA/ICcnIDogKGZsYWcubGVuZ3RoID09PSAxID8gJy0nIDogJy0tJyk7XG5cdGNvbnN0IHBvc2l0aW9uID0gYXJndi5pbmRleE9mKHByZWZpeCArIGZsYWcpO1xuXHRjb25zdCB0ZXJtaW5hdG9yUG9zaXRpb24gPSBhcmd2LmluZGV4T2YoJy0tJyk7XG5cdHJldHVybiBwb3NpdGlvbiAhPT0gLTEgJiYgKHRlcm1pbmF0b3JQb3NpdGlvbiA9PT0gLTEgfHwgcG9zaXRpb24gPCB0ZXJtaW5hdG9yUG9zaXRpb24pO1xufVxuXG5jb25zdCB7ZW52fSA9IHByb2Nlc3M7XG5cbmxldCBmbGFnRm9yY2VDb2xvcjtcbmlmIChcblx0aGFzRmxhZygnbm8tY29sb3InKVxuXHR8fCBoYXNGbGFnKCduby1jb2xvcnMnKVxuXHR8fCBoYXNGbGFnKCdjb2xvcj1mYWxzZScpXG5cdHx8IGhhc0ZsYWcoJ2NvbG9yPW5ldmVyJylcbikge1xuXHRmbGFnRm9yY2VDb2xvciA9IDA7XG59IGVsc2UgaWYgKFxuXHRoYXNGbGFnKCdjb2xvcicpXG5cdHx8IGhhc0ZsYWcoJ2NvbG9ycycpXG5cdHx8IGhhc0ZsYWcoJ2NvbG9yPXRydWUnKVxuXHR8fCBoYXNGbGFnKCdjb2xvcj1hbHdheXMnKVxuKSB7XG5cdGZsYWdGb3JjZUNvbG9yID0gMTtcbn1cblxuZnVuY3Rpb24gZW52Rm9yY2VDb2xvcigpIHtcblx0aWYgKCdGT1JDRV9DT0xPUicgaW4gZW52KSB7XG5cdFx0aWYgKGVudi5GT1JDRV9DT0xPUiA9PT0gJ3RydWUnKSB7XG5cdFx0XHRyZXR1cm4gMTtcblx0XHR9XG5cblx0XHRpZiAoZW52LkZPUkNFX0NPTE9SID09PSAnZmFsc2UnKSB7XG5cdFx0XHRyZXR1cm4gMDtcblx0XHR9XG5cblx0XHRyZXR1cm4gZW52LkZPUkNFX0NPTE9SLmxlbmd0aCA9PT0gMCA/IDEgOiBNYXRoLm1pbihOdW1iZXIucGFyc2VJbnQoZW52LkZPUkNFX0NPTE9SLCAxMCksIDMpO1xuXHR9XG59XG5cbmZ1bmN0aW9uIHRyYW5zbGF0ZUxldmVsKGxldmVsKSB7XG5cdGlmIChsZXZlbCA9PT0gMCkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdHJldHVybiB7XG5cdFx0bGV2ZWwsXG5cdFx0aGFzQmFzaWM6IHRydWUsXG5cdFx0aGFzMjU2OiBsZXZlbCA+PSAyLFxuXHRcdGhhczE2bTogbGV2ZWwgPj0gMyxcblx0fTtcbn1cblxuZnVuY3Rpb24gX3N1cHBvcnRzQ29sb3IoaGF2ZVN0cmVhbSwge3N0cmVhbUlzVFRZLCBzbmlmZkZsYWdzID0gdHJ1ZX0gPSB7fSkge1xuXHRjb25zdCBub0ZsYWdGb3JjZUNvbG9yID0gZW52Rm9yY2VDb2xvcigpO1xuXHRpZiAobm9GbGFnRm9yY2VDb2xvciAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0ZmxhZ0ZvcmNlQ29sb3IgPSBub0ZsYWdGb3JjZUNvbG9yO1xuXHR9XG5cblx0Y29uc3QgZm9yY2VDb2xvciA9IHNuaWZmRmxhZ3MgPyBmbGFnRm9yY2VDb2xvciA6IG5vRmxhZ0ZvcmNlQ29sb3I7XG5cblx0aWYgKGZvcmNlQ29sb3IgPT09IDApIHtcblx0XHRyZXR1cm4gMDtcblx0fVxuXG5cdGlmIChzbmlmZkZsYWdzKSB7XG5cdFx0aWYgKGhhc0ZsYWcoJ2NvbG9yPTE2bScpXG5cdFx0XHR8fCBoYXNGbGFnKCdjb2xvcj1mdWxsJylcblx0XHRcdHx8IGhhc0ZsYWcoJ2NvbG9yPXRydWVjb2xvcicpKSB7XG5cdFx0XHRyZXR1cm4gMztcblx0XHR9XG5cblx0XHRpZiAoaGFzRmxhZygnY29sb3I9MjU2JykpIHtcblx0XHRcdHJldHVybiAyO1xuXHRcdH1cblx0fVxuXG5cdC8vIENoZWNrIGZvciBBenVyZSBEZXZPcHMgcGlwZWxpbmVzLlxuXHQvLyBIYXMgdG8gYmUgYWJvdmUgdGhlIGAhc3RyZWFtSXNUVFlgIGNoZWNrLlxuXHRpZiAoJ1RGX0JVSUxEJyBpbiBlbnYgJiYgJ0FHRU5UX05BTUUnIGluIGVudikge1xuXHRcdHJldHVybiAxO1xuXHR9XG5cblx0aWYgKGhhdmVTdHJlYW0gJiYgIXN0cmVhbUlzVFRZICYmIGZvcmNlQ29sb3IgPT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiAwO1xuXHR9XG5cblx0Y29uc3QgbWluID0gZm9yY2VDb2xvciB8fCAwO1xuXG5cdGlmIChlbnYuVEVSTSA9PT0gJ2R1bWInKSB7XG5cdFx0cmV0dXJuIG1pbjtcblx0fVxuXG5cdGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInKSB7XG5cdFx0Ly8gV2luZG93cyAxMCBidWlsZCAxMDU4NiBpcyB0aGUgZmlyc3QgV2luZG93cyByZWxlYXNlIHRoYXQgc3VwcG9ydHMgMjU2IGNvbG9ycy5cblx0XHQvLyBXaW5kb3dzIDEwIGJ1aWxkIDE0OTMxIGlzIHRoZSBmaXJzdCByZWxlYXNlIHRoYXQgc3VwcG9ydHMgMTZtL1RydWVDb2xvci5cblx0XHRjb25zdCBvc1JlbGVhc2UgPSBvcy5yZWxlYXNlKCkuc3BsaXQoJy4nKTtcblx0XHRpZiAoXG5cdFx0XHROdW1iZXIob3NSZWxlYXNlWzBdKSA+PSAxMFxuXHRcdFx0JiYgTnVtYmVyKG9zUmVsZWFzZVsyXSkgPj0gMTBfNTg2XG5cdFx0KSB7XG5cdFx0XHRyZXR1cm4gTnVtYmVyKG9zUmVsZWFzZVsyXSkgPj0gMTRfOTMxID8gMyA6IDI7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIDE7XG5cdH1cblxuXHRpZiAoJ0NJJyBpbiBlbnYpIHtcblx0XHRpZiAoJ0dJVEhVQl9BQ1RJT05TJyBpbiBlbnYgfHwgJ0dJVEVBX0FDVElPTlMnIGluIGVudikge1xuXHRcdFx0cmV0dXJuIDM7XG5cdFx0fVxuXG5cdFx0aWYgKFsnVFJBVklTJywgJ0NJUkNMRUNJJywgJ0FQUFZFWU9SJywgJ0dJVExBQl9DSScsICdCVUlMREtJVEUnLCAnRFJPTkUnXS5zb21lKHNpZ24gPT4gc2lnbiBpbiBlbnYpIHx8IGVudi5DSV9OQU1FID09PSAnY29kZXNoaXAnKSB7XG5cdFx0XHRyZXR1cm4gMTtcblx0XHR9XG5cblx0XHRyZXR1cm4gbWluO1xuXHR9XG5cblx0aWYgKCdURUFNQ0lUWV9WRVJTSU9OJyBpbiBlbnYpIHtcblx0XHRyZXR1cm4gL14oOVxcLigwKlsxLTldXFxkKilcXC58XFxkezIsfVxcLikvLnRlc3QoZW52LlRFQU1DSVRZX1ZFUlNJT04pID8gMSA6IDA7XG5cdH1cblxuXHRpZiAoZW52LkNPTE9SVEVSTSA9PT0gJ3RydWVjb2xvcicpIHtcblx0XHRyZXR1cm4gMztcblx0fVxuXG5cdGlmIChlbnYuVEVSTSA9PT0gJ3h0ZXJtLWtpdHR5Jykge1xuXHRcdHJldHVybiAzO1xuXHR9XG5cblx0aWYgKCdURVJNX1BST0dSQU0nIGluIGVudikge1xuXHRcdGNvbnN0IHZlcnNpb24gPSBOdW1iZXIucGFyc2VJbnQoKGVudi5URVJNX1BST0dSQU1fVkVSU0lPTiB8fCAnJykuc3BsaXQoJy4nKVswXSwgMTApO1xuXG5cdFx0c3dpdGNoIChlbnYuVEVSTV9QUk9HUkFNKSB7XG5cdFx0XHRjYXNlICdpVGVybS5hcHAnOiB7XG5cdFx0XHRcdHJldHVybiB2ZXJzaW9uID49IDMgPyAzIDogMjtcblx0XHRcdH1cblxuXHRcdFx0Y2FzZSAnQXBwbGVfVGVybWluYWwnOiB7XG5cdFx0XHRcdHJldHVybiAyO1xuXHRcdFx0fVxuXHRcdFx0Ly8gTm8gZGVmYXVsdFxuXHRcdH1cblx0fVxuXG5cdGlmICgvLTI1Nihjb2xvcik/JC9pLnRlc3QoZW52LlRFUk0pKSB7XG5cdFx0cmV0dXJuIDI7XG5cdH1cblxuXHRpZiAoL15zY3JlZW58Xnh0ZXJtfF52dDEwMHxednQyMjB8XnJ4dnR8Y29sb3J8YW5zaXxjeWd3aW58bGludXgvaS50ZXN0KGVudi5URVJNKSkge1xuXHRcdHJldHVybiAxO1xuXHR9XG5cblx0aWYgKCdDT0xPUlRFUk0nIGluIGVudikge1xuXHRcdHJldHVybiAxO1xuXHR9XG5cblx0cmV0dXJuIG1pbjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVN1cHBvcnRzQ29sb3Ioc3RyZWFtLCBvcHRpb25zID0ge30pIHtcblx0Y29uc3QgbGV2ZWwgPSBfc3VwcG9ydHNDb2xvcihzdHJlYW0sIHtcblx0XHRzdHJlYW1Jc1RUWTogc3RyZWFtICYmIHN0cmVhbS5pc1RUWSxcblx0XHQuLi5vcHRpb25zLFxuXHR9KTtcblxuXHRyZXR1cm4gdHJhbnNsYXRlTGV2ZWwobGV2ZWwpO1xufVxuXG5jb25zdCBzdXBwb3J0c0NvbG9yID0ge1xuXHRzdGRvdXQ6IGNyZWF0ZVN1cHBvcnRzQ29sb3Ioe2lzVFRZOiB0dHkuaXNhdHR5KDEpfSksXG5cdHN0ZGVycjogY3JlYXRlU3VwcG9ydHNDb2xvcih7aXNUVFk6IHR0eS5pc2F0dHkoMil9KSxcbn07XG5cbmV4cG9ydCBkZWZhdWx0IHN1cHBvcnRzQ29sb3I7XG4iLCAiLy8gVE9ETzogV2hlbiB0YXJnZXRpbmcgTm9kZS5qcyAxNiwgdXNlIGBTdHJpbmcucHJvdG90eXBlLnJlcGxhY2VBbGxgLlxuZXhwb3J0IGZ1bmN0aW9uIHN0cmluZ1JlcGxhY2VBbGwoc3RyaW5nLCBzdWJzdHJpbmcsIHJlcGxhY2VyKSB7XG5cdGxldCBpbmRleCA9IHN0cmluZy5pbmRleE9mKHN1YnN0cmluZyk7XG5cdGlmIChpbmRleCA9PT0gLTEpIHtcblx0XHRyZXR1cm4gc3RyaW5nO1xuXHR9XG5cblx0Y29uc3Qgc3Vic3RyaW5nTGVuZ3RoID0gc3Vic3RyaW5nLmxlbmd0aDtcblx0bGV0IGVuZEluZGV4ID0gMDtcblx0bGV0IHJldHVyblZhbHVlID0gJyc7XG5cdGRvIHtcblx0XHRyZXR1cm5WYWx1ZSArPSBzdHJpbmcuc2xpY2UoZW5kSW5kZXgsIGluZGV4KSArIHN1YnN0cmluZyArIHJlcGxhY2VyO1xuXHRcdGVuZEluZGV4ID0gaW5kZXggKyBzdWJzdHJpbmdMZW5ndGg7XG5cdFx0aW5kZXggPSBzdHJpbmcuaW5kZXhPZihzdWJzdHJpbmcsIGVuZEluZGV4KTtcblx0fSB3aGlsZSAoaW5kZXggIT09IC0xKTtcblxuXHRyZXR1cm5WYWx1ZSArPSBzdHJpbmcuc2xpY2UoZW5kSW5kZXgpO1xuXHRyZXR1cm4gcmV0dXJuVmFsdWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzdHJpbmdFbmNhc2VDUkxGV2l0aEZpcnN0SW5kZXgoc3RyaW5nLCBwcmVmaXgsIHBvc3RmaXgsIGluZGV4KSB7XG5cdGxldCBlbmRJbmRleCA9IDA7XG5cdGxldCByZXR1cm5WYWx1ZSA9ICcnO1xuXHRkbyB7XG5cdFx0Y29uc3QgZ290Q1IgPSBzdHJpbmdbaW5kZXggLSAxXSA9PT0gJ1xccic7XG5cdFx0cmV0dXJuVmFsdWUgKz0gc3RyaW5nLnNsaWNlKGVuZEluZGV4LCAoZ290Q1IgPyBpbmRleCAtIDEgOiBpbmRleCkpICsgcHJlZml4ICsgKGdvdENSID8gJ1xcclxcbicgOiAnXFxuJykgKyBwb3N0Zml4O1xuXHRcdGVuZEluZGV4ID0gaW5kZXggKyAxO1xuXHRcdGluZGV4ID0gc3RyaW5nLmluZGV4T2YoJ1xcbicsIGVuZEluZGV4KTtcblx0fSB3aGlsZSAoaW5kZXggIT09IC0xKTtcblxuXHRyZXR1cm5WYWx1ZSArPSBzdHJpbmcuc2xpY2UoZW5kSW5kZXgpO1xuXHRyZXR1cm4gcmV0dXJuVmFsdWU7XG59XG4iLCAiaW1wb3J0IGNoYWxrIGZyb20gXCJjaGFsa1wiXG5pbXBvcnQgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCJcbmltcG9ydCB7IGdsb2JieSB9IGZyb20gXCJnbG9iYnlcIlxuaW1wb3J0IHsgUm91dGVTcGVjLCBTZXR1cFBhcmFtcyB9IGZyb20gXCIuLi8uLi90eXBlc1wiXG5pbXBvcnQgeyBkZWZhdWx0TWFwRmlsZVBhdGhUb0hUVFBSb3V0ZSB9IGZyb20gXCIuL2RlZmF1bHQtbWFwLWZpbGUtcGF0aC10by1odHRwLXJvdXRlXCJcblxuZXhwb3J0IGludGVyZmFjZSBSb3V0ZUluZm8ge1xuICBzZXR1cFBhcmFtczogU2V0dXBQYXJhbXNcbiAgcm91dGVTcGVjOiBSb3V0ZVNwZWNcbiAgcm91dGVGbjogRnVuY3Rpb25cbiAgcm91dGU6IHN0cmluZ1xufVxuXG5leHBvcnQgY29uc3QgcGFyc2VSb3V0ZXNJblBhY2thZ2UgPSBhc3luYyAob3B0czoge1xuICBwYWNrYWdlRGlyOiBzdHJpbmdcbiAgcGF0aEdsb2I/OiBzdHJpbmdcbiAgYXBpUHJlZml4Pzogc3RyaW5nXG4gIG1hcEZpbGVQYXRoVG9IVFRQUm91dGU/OiAoZmlsZV9wYXRoOiBzdHJpbmcpID0+IHN0cmluZ1xufSk6IFByb21pc2U8TWFwPHN0cmluZywgUm91dGVJbmZvPj4gPT4ge1xuICBjb25zdCB7XG4gICAgcGFja2FnZURpcixcbiAgICBwYXRoR2xvYiA9IFwiL3BhZ2VzL2FwaS8qKi8qLnRzXCIsXG4gICAgbWFwRmlsZVBhdGhUb0hUVFBSb3V0ZSA9IGRlZmF1bHRNYXBGaWxlUGF0aFRvSFRUUFJvdXRlKG9wdHMuYXBpUHJlZml4KSxcbiAgfSA9IG9wdHNcbiAgLy8gTG9hZCBhbGwgcm91dGUgc3BlY3NcbiAgY29uc3QgZnVsbFBhdGhHbG9iID0gcGF0aC5wb3NpeC5qb2luKHBhY2thZ2VEaXIsIHBhdGhHbG9iKVxuICBjb25zb2xlLmxvZyhgc2VhcmNoaW5nIFwiJHtmdWxsUGF0aEdsb2J9XCIuLi5gKVxuICBjb25zdCBmaWxlcGF0aHMgPSBhd2FpdCBnbG9iYnkoYCR7ZnVsbFBhdGhHbG9ifWApXG4gIGNvbnNvbGUubG9nKGBmb3VuZCAke2ZpbGVwYXRocy5sZW5ndGh9IGZpbGVzYClcbiAgaWYgKGZpbGVwYXRocy5sZW5ndGggPT09IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIGZpbGVzIGZvdW5kIGF0IFwiJHtmdWxsUGF0aEdsb2J9XCJgKVxuICB9XG4gIGNvbnN0IGZpbGVwYXRoVG9Sb3V0ZUZuID0gbmV3IE1hcDxzdHJpbmcsIFJvdXRlSW5mbz4oKVxuXG4gIGF3YWl0IFByb21pc2UuYWxsKFxuICAgIGZpbGVwYXRocy5tYXAoYXN5bmMgKHApID0+IHtcbiAgICAgIGNvbnN0IHsgZGVmYXVsdDogcm91dGVGbiB9ID0gYXdhaXQgcmVxdWlyZShwYXRoLnJlc29sdmUocCkpXG5cbiAgICAgIGlmIChyb3V0ZUZuKSB7XG4gICAgICAgIGlmICghcm91dGVGbi5fc2V0dXBQYXJhbXMpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICBjaGFsay55ZWxsb3coXG4gICAgICAgICAgICAgIGBJZ25vcmluZyBcIiR7cH1cIiBiZWNhdXNlIGl0IHdhc24ndCBjcmVhdGVkIHdpdGggd2l0aFJvdXRlU3BlY2BcbiAgICAgICAgICAgIClcbiAgICAgICAgICApXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgZmlsZXBhdGhUb1JvdXRlRm4uc2V0KHAsIHtcbiAgICAgICAgICBzZXR1cFBhcmFtczogcm91dGVGbi5fc2V0dXBQYXJhbXMsXG4gICAgICAgICAgcm91dGVTcGVjOiByb3V0ZUZuLl9yb3V0ZVNwZWMsXG4gICAgICAgICAgcm91dGU6IG1hcEZpbGVQYXRoVG9IVFRQUm91dGUocCksXG4gICAgICAgICAgcm91dGVGbixcbiAgICAgICAgfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUud2FybihjaGFsay55ZWxsb3coYENvdWxkbid0IGZpbmQgcm91dGUgJHtwfWApKVxuICAgICAgfVxuICAgIH0pXG4gIClcblxuICByZXR1cm4gZmlsZXBhdGhUb1JvdXRlRm5cbn1cbiIsICJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgbm9kZVBhdGggZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCBtZXJnZTIgZnJvbSAnbWVyZ2UyJztcbmltcG9ydCBmYXN0R2xvYiBmcm9tICdmYXN0LWdsb2InO1xuaW1wb3J0IGRpckdsb2IgZnJvbSAnZGlyLWdsb2InO1xuaW1wb3J0IHtcblx0R0lUSUdOT1JFX0ZJTEVTX1BBVFRFUk4sXG5cdGlzSWdub3JlZEJ5SWdub3JlRmlsZXMsXG5cdGlzSWdub3JlZEJ5SWdub3JlRmlsZXNTeW5jLFxufSBmcm9tICcuL2lnbm9yZS5qcyc7XG5pbXBvcnQge0ZpbHRlclN0cmVhbSwgdG9QYXRoLCBpc05lZ2F0aXZlUGF0dGVybn0gZnJvbSAnLi91dGlsaXRpZXMuanMnO1xuXG5jb25zdCBhc3NlcnRQYXR0ZXJuc0lucHV0ID0gcGF0dGVybnMgPT4ge1xuXHRpZiAocGF0dGVybnMuc29tZShwYXR0ZXJuID0+IHR5cGVvZiBwYXR0ZXJuICE9PSAnc3RyaW5nJykpIHtcblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdQYXR0ZXJucyBtdXN0IGJlIGEgc3RyaW5nIG9yIGFuIGFycmF5IG9mIHN0cmluZ3MnKTtcblx0fVxufTtcblxuY29uc3QgdG9QYXR0ZXJuc0FycmF5ID0gcGF0dGVybnMgPT4ge1xuXHRwYXR0ZXJucyA9IFsuLi5uZXcgU2V0KFtwYXR0ZXJuc10uZmxhdCgpKV07XG5cdGFzc2VydFBhdHRlcm5zSW5wdXQocGF0dGVybnMpO1xuXHRyZXR1cm4gcGF0dGVybnM7XG59O1xuXG5jb25zdCBjaGVja0N3ZE9wdGlvbiA9IG9wdGlvbnMgPT4ge1xuXHRpZiAoIW9wdGlvbnMuY3dkKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0bGV0IHN0YXQ7XG5cdHRyeSB7XG5cdFx0c3RhdCA9IGZzLnN0YXRTeW5jKG9wdGlvbnMuY3dkKTtcblx0fSBjYXRjaCB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0aWYgKCFzdGF0LmlzRGlyZWN0b3J5KCkpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoJ1RoZSBgY3dkYCBvcHRpb24gbXVzdCBiZSBhIHBhdGggdG8gYSBkaXJlY3RvcnknKTtcblx0fVxufTtcblxuY29uc3Qgbm9ybWFsaXplT3B0aW9ucyA9IChvcHRpb25zID0ge30pID0+IHtcblx0b3B0aW9ucyA9IHtcblx0XHQuLi5vcHRpb25zLFxuXHRcdGlnbm9yZTogb3B0aW9ucy5pZ25vcmUgfHwgW10sXG5cdFx0ZXhwYW5kRGlyZWN0b3JpZXM6IG9wdGlvbnMuZXhwYW5kRGlyZWN0b3JpZXMgPT09IHVuZGVmaW5lZFxuXHRcdFx0PyB0cnVlXG5cdFx0XHQ6IG9wdGlvbnMuZXhwYW5kRGlyZWN0b3JpZXMsXG5cdFx0Y3dkOiB0b1BhdGgob3B0aW9ucy5jd2QpLFxuXHR9O1xuXG5cdGNoZWNrQ3dkT3B0aW9uKG9wdGlvbnMpO1xuXG5cdHJldHVybiBvcHRpb25zO1xufTtcblxuY29uc3Qgbm9ybWFsaXplQXJndW1lbnRzID0gZm4gPT4gYXN5bmMgKHBhdHRlcm5zLCBvcHRpb25zKSA9PiBmbih0b1BhdHRlcm5zQXJyYXkocGF0dGVybnMpLCBub3JtYWxpemVPcHRpb25zKG9wdGlvbnMpKTtcbmNvbnN0IG5vcm1hbGl6ZUFyZ3VtZW50c1N5bmMgPSBmbiA9PiAocGF0dGVybnMsIG9wdGlvbnMpID0+IGZuKHRvUGF0dGVybnNBcnJheShwYXR0ZXJucyksIG5vcm1hbGl6ZU9wdGlvbnMob3B0aW9ucykpO1xuXG5jb25zdCBnZXRJZ25vcmVGaWxlc1BhdHRlcm5zID0gb3B0aW9ucyA9PiB7XG5cdGNvbnN0IHtpZ25vcmVGaWxlcywgZ2l0aWdub3JlfSA9IG9wdGlvbnM7XG5cblx0Y29uc3QgcGF0dGVybnMgPSBpZ25vcmVGaWxlcyA/IHRvUGF0dGVybnNBcnJheShpZ25vcmVGaWxlcykgOiBbXTtcblx0aWYgKGdpdGlnbm9yZSkge1xuXHRcdHBhdHRlcm5zLnB1c2goR0lUSUdOT1JFX0ZJTEVTX1BBVFRFUk4pO1xuXHR9XG5cblx0cmV0dXJuIHBhdHRlcm5zO1xufTtcblxuY29uc3QgZ2V0RmlsdGVyID0gYXN5bmMgb3B0aW9ucyA9PiB7XG5cdGNvbnN0IGlnbm9yZUZpbGVzUGF0dGVybnMgPSBnZXRJZ25vcmVGaWxlc1BhdHRlcm5zKG9wdGlvbnMpO1xuXHRyZXR1cm4gY3JlYXRlRmlsdGVyRnVuY3Rpb24oXG5cdFx0aWdub3JlRmlsZXNQYXR0ZXJucy5sZW5ndGggPiAwICYmIGF3YWl0IGlzSWdub3JlZEJ5SWdub3JlRmlsZXMoaWdub3JlRmlsZXNQYXR0ZXJucywgb3B0aW9ucyksXG5cdCk7XG59O1xuXG5jb25zdCBnZXRGaWx0ZXJTeW5jID0gb3B0aW9ucyA9PiB7XG5cdGNvbnN0IGlnbm9yZUZpbGVzUGF0dGVybnMgPSBnZXRJZ25vcmVGaWxlc1BhdHRlcm5zKG9wdGlvbnMpO1xuXHRyZXR1cm4gY3JlYXRlRmlsdGVyRnVuY3Rpb24oXG5cdFx0aWdub3JlRmlsZXNQYXR0ZXJucy5sZW5ndGggPiAwICYmIGlzSWdub3JlZEJ5SWdub3JlRmlsZXNTeW5jKGlnbm9yZUZpbGVzUGF0dGVybnMsIG9wdGlvbnMpLFxuXHQpO1xufTtcblxuY29uc3QgY3JlYXRlRmlsdGVyRnVuY3Rpb24gPSBpc0lnbm9yZWQgPT4ge1xuXHRjb25zdCBzZWVuID0gbmV3IFNldCgpO1xuXG5cdHJldHVybiBmYXN0R2xvYlJlc3VsdCA9PiB7XG5cdFx0Y29uc3QgcGF0aCA9IGZhc3RHbG9iUmVzdWx0LnBhdGggfHwgZmFzdEdsb2JSZXN1bHQ7XG5cdFx0Y29uc3QgcGF0aEtleSA9IG5vZGVQYXRoLm5vcm1hbGl6ZShwYXRoKTtcblx0XHRjb25zdCBzZWVuT3JJZ25vcmVkID0gc2Vlbi5oYXMocGF0aEtleSkgfHwgKGlzSWdub3JlZCAmJiBpc0lnbm9yZWQocGF0aCkpO1xuXHRcdHNlZW4uYWRkKHBhdGhLZXkpO1xuXHRcdHJldHVybiAhc2Vlbk9ySWdub3JlZDtcblx0fTtcbn07XG5cbmNvbnN0IHVuaW9uRmFzdEdsb2JSZXN1bHRzID0gKHJlc3VsdHMsIGZpbHRlcikgPT4gcmVzdWx0cy5mbGF0KCkuZmlsdGVyKGZhc3RHbG9iUmVzdWx0ID0+IGZpbHRlcihmYXN0R2xvYlJlc3VsdCkpO1xuY29uc3QgdW5pb25GYXN0R2xvYlN0cmVhbXMgPSAoc3RyZWFtcywgZmlsdGVyKSA9PiBtZXJnZTIoc3RyZWFtcykucGlwZShuZXcgRmlsdGVyU3RyZWFtKGZhc3RHbG9iUmVzdWx0ID0+IGZpbHRlcihmYXN0R2xvYlJlc3VsdCkpKTtcblxuY29uc3QgY29udmVydE5lZ2F0aXZlUGF0dGVybnMgPSAocGF0dGVybnMsIG9wdGlvbnMpID0+IHtcblx0Y29uc3QgdGFza3MgPSBbXTtcblxuXHR3aGlsZSAocGF0dGVybnMubGVuZ3RoID4gMCkge1xuXHRcdGNvbnN0IGluZGV4ID0gcGF0dGVybnMuZmluZEluZGV4KHBhdHRlcm4gPT4gaXNOZWdhdGl2ZVBhdHRlcm4ocGF0dGVybikpO1xuXG5cdFx0aWYgKGluZGV4ID09PSAtMSkge1xuXHRcdFx0dGFza3MucHVzaCh7cGF0dGVybnMsIG9wdGlvbnN9KTtcblx0XHRcdGJyZWFrO1xuXHRcdH1cblxuXHRcdGNvbnN0IGlnbm9yZVBhdHRlcm4gPSBwYXR0ZXJuc1tpbmRleF0uc2xpY2UoMSk7XG5cblx0XHRmb3IgKGNvbnN0IHRhc2sgb2YgdGFza3MpIHtcblx0XHRcdHRhc2sub3B0aW9ucy5pZ25vcmUucHVzaChpZ25vcmVQYXR0ZXJuKTtcblx0XHR9XG5cblx0XHRpZiAoaW5kZXggIT09IDApIHtcblx0XHRcdHRhc2tzLnB1c2goe1xuXHRcdFx0XHRwYXR0ZXJuczogcGF0dGVybnMuc2xpY2UoMCwgaW5kZXgpLFxuXHRcdFx0XHRvcHRpb25zOiB7XG5cdFx0XHRcdFx0Li4ub3B0aW9ucyxcblx0XHRcdFx0XHRpZ25vcmU6IFtcblx0XHRcdFx0XHRcdC4uLm9wdGlvbnMuaWdub3JlLFxuXHRcdFx0XHRcdFx0aWdub3JlUGF0dGVybixcblx0XHRcdFx0XHRdLFxuXHRcdFx0XHR9LFxuXHRcdFx0fSk7XG5cdFx0fVxuXG5cdFx0cGF0dGVybnMgPSBwYXR0ZXJucy5zbGljZShpbmRleCArIDEpO1xuXHR9XG5cblx0cmV0dXJuIHRhc2tzO1xufTtcblxuY29uc3QgZ2V0RGlyR2xvYk9wdGlvbnMgPSAob3B0aW9ucywgY3dkKSA9PiAoe1xuXHQuLi4oY3dkID8ge2N3ZH0gOiB7fSksXG5cdC4uLihBcnJheS5pc0FycmF5KG9wdGlvbnMpID8ge2ZpbGVzOiBvcHRpb25zfSA6IG9wdGlvbnMpLFxufSk7XG5cbmNvbnN0IGdlbmVyYXRlVGFza3MgPSBhc3luYyAocGF0dGVybnMsIG9wdGlvbnMpID0+IHtcblx0Y29uc3QgZ2xvYlRhc2tzID0gY29udmVydE5lZ2F0aXZlUGF0dGVybnMocGF0dGVybnMsIG9wdGlvbnMpO1xuXG5cdGNvbnN0IHtjd2QsIGV4cGFuZERpcmVjdG9yaWVzfSA9IG9wdGlvbnM7XG5cblx0aWYgKCFleHBhbmREaXJlY3Rvcmllcykge1xuXHRcdHJldHVybiBnbG9iVGFza3M7XG5cdH1cblxuXHRjb25zdCBwYXR0ZXJuRXhwYW5kT3B0aW9ucyA9IGdldERpckdsb2JPcHRpb25zKGV4cGFuZERpcmVjdG9yaWVzLCBjd2QpO1xuXHRjb25zdCBpZ25vcmVFeHBhbmRPcHRpb25zID0gY3dkID8ge2N3ZH0gOiB1bmRlZmluZWQ7XG5cblx0cmV0dXJuIFByb21pc2UuYWxsKFxuXHRcdGdsb2JUYXNrcy5tYXAoYXN5bmMgdGFzayA9PiB7XG5cdFx0XHRsZXQge3BhdHRlcm5zLCBvcHRpb25zfSA9IHRhc2s7XG5cblx0XHRcdFtcblx0XHRcdFx0cGF0dGVybnMsXG5cdFx0XHRcdG9wdGlvbnMuaWdub3JlLFxuXHRcdFx0XSA9IGF3YWl0IFByb21pc2UuYWxsKFtcblx0XHRcdFx0ZGlyR2xvYihwYXR0ZXJucywgcGF0dGVybkV4cGFuZE9wdGlvbnMpLFxuXHRcdFx0XHRkaXJHbG9iKG9wdGlvbnMuaWdub3JlLCBpZ25vcmVFeHBhbmRPcHRpb25zKSxcblx0XHRcdF0pO1xuXG5cdFx0XHRyZXR1cm4ge3BhdHRlcm5zLCBvcHRpb25zfTtcblx0XHR9KSxcblx0KTtcbn07XG5cbmNvbnN0IGdlbmVyYXRlVGFza3NTeW5jID0gKHBhdHRlcm5zLCBvcHRpb25zKSA9PiB7XG5cdGNvbnN0IGdsb2JUYXNrcyA9IGNvbnZlcnROZWdhdGl2ZVBhdHRlcm5zKHBhdHRlcm5zLCBvcHRpb25zKTtcblxuXHRjb25zdCB7Y3dkLCBleHBhbmREaXJlY3Rvcmllc30gPSBvcHRpb25zO1xuXG5cdGlmICghZXhwYW5kRGlyZWN0b3JpZXMpIHtcblx0XHRyZXR1cm4gZ2xvYlRhc2tzO1xuXHR9XG5cblx0Y29uc3QgcGF0dGVybkV4cGFuZE9wdGlvbnMgPSBnZXREaXJHbG9iT3B0aW9ucyhleHBhbmREaXJlY3RvcmllcywgY3dkKTtcblx0Y29uc3QgaWdub3JlRXhwYW5kT3B0aW9ucyA9IGN3ZCA/IHtjd2R9IDogdW5kZWZpbmVkO1xuXG5cdHJldHVybiBnbG9iVGFza3MubWFwKHRhc2sgPT4ge1xuXHRcdGxldCB7cGF0dGVybnMsIG9wdGlvbnN9ID0gdGFzaztcblx0XHRwYXR0ZXJucyA9IGRpckdsb2Iuc3luYyhwYXR0ZXJucywgcGF0dGVybkV4cGFuZE9wdGlvbnMpO1xuXHRcdG9wdGlvbnMuaWdub3JlID0gZGlyR2xvYi5zeW5jKG9wdGlvbnMuaWdub3JlLCBpZ25vcmVFeHBhbmRPcHRpb25zKTtcblx0XHRyZXR1cm4ge3BhdHRlcm5zLCBvcHRpb25zfTtcblx0fSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2xvYmJ5ID0gbm9ybWFsaXplQXJndW1lbnRzKGFzeW5jIChwYXR0ZXJucywgb3B0aW9ucykgPT4ge1xuXHRjb25zdCBbXG5cdFx0dGFza3MsXG5cdFx0ZmlsdGVyLFxuXHRdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuXHRcdGdlbmVyYXRlVGFza3MocGF0dGVybnMsIG9wdGlvbnMpLFxuXHRcdGdldEZpbHRlcihvcHRpb25zKSxcblx0XSk7XG5cdGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbCh0YXNrcy5tYXAodGFzayA9PiBmYXN0R2xvYih0YXNrLnBhdHRlcm5zLCB0YXNrLm9wdGlvbnMpKSk7XG5cblx0cmV0dXJuIHVuaW9uRmFzdEdsb2JSZXN1bHRzKHJlc3VsdHMsIGZpbHRlcik7XG59KTtcblxuZXhwb3J0IGNvbnN0IGdsb2JieVN5bmMgPSBub3JtYWxpemVBcmd1bWVudHNTeW5jKChwYXR0ZXJucywgb3B0aW9ucykgPT4ge1xuXHRjb25zdCB0YXNrcyA9IGdlbmVyYXRlVGFza3NTeW5jKHBhdHRlcm5zLCBvcHRpb25zKTtcblx0Y29uc3QgZmlsdGVyID0gZ2V0RmlsdGVyU3luYyhvcHRpb25zKTtcblx0Y29uc3QgcmVzdWx0cyA9IHRhc2tzLm1hcCh0YXNrID0+IGZhc3RHbG9iLnN5bmModGFzay5wYXR0ZXJucywgdGFzay5vcHRpb25zKSk7XG5cblx0cmV0dXJuIHVuaW9uRmFzdEdsb2JSZXN1bHRzKHJlc3VsdHMsIGZpbHRlcik7XG59KTtcblxuZXhwb3J0IGNvbnN0IGdsb2JieVN0cmVhbSA9IG5vcm1hbGl6ZUFyZ3VtZW50c1N5bmMoKHBhdHRlcm5zLCBvcHRpb25zKSA9PiB7XG5cdGNvbnN0IHRhc2tzID0gZ2VuZXJhdGVUYXNrc1N5bmMocGF0dGVybnMsIG9wdGlvbnMpO1xuXHRjb25zdCBmaWx0ZXIgPSBnZXRGaWx0ZXJTeW5jKG9wdGlvbnMpO1xuXHRjb25zdCBzdHJlYW1zID0gdGFza3MubWFwKHRhc2sgPT4gZmFzdEdsb2Iuc3RyZWFtKHRhc2sucGF0dGVybnMsIHRhc2sub3B0aW9ucykpO1xuXG5cdHJldHVybiB1bmlvbkZhc3RHbG9iU3RyZWFtcyhzdHJlYW1zLCBmaWx0ZXIpO1xufSk7XG5cbmV4cG9ydCBjb25zdCBpc0R5bmFtaWNQYXR0ZXJuID0gbm9ybWFsaXplQXJndW1lbnRzU3luYyhcblx0KHBhdHRlcm5zLCBvcHRpb25zKSA9PiBwYXR0ZXJucy5zb21lKHBhdHRlcm4gPT4gZmFzdEdsb2IuaXNEeW5hbWljUGF0dGVybihwYXR0ZXJuLCBvcHRpb25zKSksXG4pO1xuXG5leHBvcnQgY29uc3QgZ2VuZXJhdGVHbG9iVGFza3MgPSBub3JtYWxpemVBcmd1bWVudHMoZ2VuZXJhdGVUYXNrcyk7XG5leHBvcnQgY29uc3QgZ2VuZXJhdGVHbG9iVGFza3NTeW5jID0gbm9ybWFsaXplQXJndW1lbnRzU3luYyhnZW5lcmF0ZVRhc2tzU3luYyk7XG5cbmV4cG9ydCB7XG5cdGlzR2l0SWdub3JlZCxcblx0aXNHaXRJZ25vcmVkU3luYyxcbn0gZnJvbSAnLi9pZ25vcmUuanMnO1xuIiwgImltcG9ydCBwcm9jZXNzIGZyb20gJ25vZGU6cHJvY2Vzcyc7XG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IGZhc3RHbG9iIGZyb20gJ2Zhc3QtZ2xvYic7XG5pbXBvcnQgZ2l0SWdub3JlIGZyb20gJ2lnbm9yZSc7XG5pbXBvcnQgc2xhc2ggZnJvbSAnc2xhc2gnO1xuaW1wb3J0IHt0b1BhdGgsIGlzTmVnYXRpdmVQYXR0ZXJufSBmcm9tICcuL3V0aWxpdGllcy5qcyc7XG5cbmNvbnN0IGlnbm9yZUZpbGVzR2xvYk9wdGlvbnMgPSB7XG5cdGlnbm9yZTogW1xuXHRcdCcqKi9ub2RlX21vZHVsZXMnLFxuXHRcdCcqKi9mbG93LXR5cGVkJyxcblx0XHQnKiovY292ZXJhZ2UnLFxuXHRcdCcqKi8uZ2l0Jyxcblx0XSxcblx0YWJzb2x1dGU6IHRydWUsXG5cdGRvdDogdHJ1ZSxcbn07XG5cbmV4cG9ydCBjb25zdCBHSVRJR05PUkVfRklMRVNfUEFUVEVSTiA9ICcqKi8uZ2l0aWdub3JlJztcblxuY29uc3QgYXBwbHlCYXNlVG9QYXR0ZXJuID0gKHBhdHRlcm4sIGJhc2UpID0+IGlzTmVnYXRpdmVQYXR0ZXJuKHBhdHRlcm4pXG5cdD8gJyEnICsgcGF0aC5wb3NpeC5qb2luKGJhc2UsIHBhdHRlcm4uc2xpY2UoMSkpXG5cdDogcGF0aC5wb3NpeC5qb2luKGJhc2UsIHBhdHRlcm4pO1xuXG5jb25zdCBwYXJzZUlnbm9yZUZpbGUgPSAoZmlsZSwgY3dkKSA9PiB7XG5cdGNvbnN0IGJhc2UgPSBzbGFzaChwYXRoLnJlbGF0aXZlKGN3ZCwgcGF0aC5kaXJuYW1lKGZpbGUuZmlsZVBhdGgpKSk7XG5cblx0cmV0dXJuIGZpbGUuY29udGVudFxuXHRcdC5zcGxpdCgvXFxyP1xcbi8pXG5cdFx0LmZpbHRlcihsaW5lID0+IGxpbmUgJiYgIWxpbmUuc3RhcnRzV2l0aCgnIycpKVxuXHRcdC5tYXAocGF0dGVybiA9PiBhcHBseUJhc2VUb1BhdHRlcm4ocGF0dGVybiwgYmFzZSkpO1xufTtcblxuY29uc3QgdG9SZWxhdGl2ZVBhdGggPSAoZmlsZU9yRGlyZWN0b3J5LCBjd2QpID0+IHtcblx0Y3dkID0gc2xhc2goY3dkKTtcblx0aWYgKHBhdGguaXNBYnNvbHV0ZShmaWxlT3JEaXJlY3RvcnkpKSB7XG5cdFx0aWYgKHNsYXNoKGZpbGVPckRpcmVjdG9yeSkuc3RhcnRzV2l0aChjd2QpKSB7XG5cdFx0XHRyZXR1cm4gcGF0aC5yZWxhdGl2ZShjd2QsIGZpbGVPckRpcmVjdG9yeSk7XG5cdFx0fVxuXG5cdFx0dGhyb3cgbmV3IEVycm9yKGBQYXRoICR7ZmlsZU9yRGlyZWN0b3J5fSBpcyBub3QgaW4gY3dkICR7Y3dkfWApO1xuXHR9XG5cblx0cmV0dXJuIGZpbGVPckRpcmVjdG9yeTtcbn07XG5cbmNvbnN0IGdldElzSWdub3JlZFByZWRpY2F0ZSA9IChmaWxlcywgY3dkKSA9PiB7XG5cdGNvbnN0IHBhdHRlcm5zID0gZmlsZXMuZmxhdE1hcChmaWxlID0+IHBhcnNlSWdub3JlRmlsZShmaWxlLCBjd2QpKTtcblx0Y29uc3QgaWdub3JlcyA9IGdpdElnbm9yZSgpLmFkZChwYXR0ZXJucyk7XG5cblx0cmV0dXJuIGZpbGVPckRpcmVjdG9yeSA9PiB7XG5cdFx0ZmlsZU9yRGlyZWN0b3J5ID0gdG9QYXRoKGZpbGVPckRpcmVjdG9yeSk7XG5cdFx0ZmlsZU9yRGlyZWN0b3J5ID0gdG9SZWxhdGl2ZVBhdGgoZmlsZU9yRGlyZWN0b3J5LCBjd2QpO1xuXHRcdHJldHVybiBmaWxlT3JEaXJlY3RvcnkgPyBpZ25vcmVzLmlnbm9yZXMoc2xhc2goZmlsZU9yRGlyZWN0b3J5KSkgOiBmYWxzZTtcblx0fTtcbn07XG5cbmNvbnN0IG5vcm1hbGl6ZU9wdGlvbnMgPSAob3B0aW9ucyA9IHt9KSA9PiAoe1xuXHRjd2Q6IHRvUGF0aChvcHRpb25zLmN3ZCkgfHwgcHJvY2Vzcy5jd2QoKSxcblx0c3VwcHJlc3NFcnJvcnM6IEJvb2xlYW4ob3B0aW9ucy5zdXBwcmVzc0Vycm9ycyksXG5cdGRlZXA6IHR5cGVvZiBvcHRpb25zLmRlZXAgPT09ICdudW1iZXInID8gb3B0aW9ucy5kZWVwIDogTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLFxufSk7XG5cbmV4cG9ydCBjb25zdCBpc0lnbm9yZWRCeUlnbm9yZUZpbGVzID0gYXN5bmMgKHBhdHRlcm5zLCBvcHRpb25zKSA9PiB7XG5cdGNvbnN0IHtjd2QsIHN1cHByZXNzRXJyb3JzLCBkZWVwfSA9IG5vcm1hbGl6ZU9wdGlvbnMob3B0aW9ucyk7XG5cblx0Y29uc3QgcGF0aHMgPSBhd2FpdCBmYXN0R2xvYihwYXR0ZXJucywge2N3ZCwgc3VwcHJlc3NFcnJvcnMsIGRlZXAsIC4uLmlnbm9yZUZpbGVzR2xvYk9wdGlvbnN9KTtcblxuXHRjb25zdCBmaWxlcyA9IGF3YWl0IFByb21pc2UuYWxsKFxuXHRcdHBhdGhzLm1hcChhc3luYyBmaWxlUGF0aCA9PiAoe1xuXHRcdFx0ZmlsZVBhdGgsXG5cdFx0XHRjb250ZW50OiBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKSxcblx0XHR9KSksXG5cdCk7XG5cblx0cmV0dXJuIGdldElzSWdub3JlZFByZWRpY2F0ZShmaWxlcywgY3dkKTtcbn07XG5cbmV4cG9ydCBjb25zdCBpc0lnbm9yZWRCeUlnbm9yZUZpbGVzU3luYyA9IChwYXR0ZXJucywgb3B0aW9ucykgPT4ge1xuXHRjb25zdCB7Y3dkLCBzdXBwcmVzc0Vycm9ycywgZGVlcH0gPSBub3JtYWxpemVPcHRpb25zKG9wdGlvbnMpO1xuXG5cdGNvbnN0IHBhdGhzID0gZmFzdEdsb2Iuc3luYyhwYXR0ZXJucywge2N3ZCwgc3VwcHJlc3NFcnJvcnMsIGRlZXAsIC4uLmlnbm9yZUZpbGVzR2xvYk9wdGlvbnN9KTtcblxuXHRjb25zdCBmaWxlcyA9IHBhdGhzLm1hcChmaWxlUGF0aCA9PiAoe1xuXHRcdGZpbGVQYXRoLFxuXHRcdGNvbnRlbnQ6IGZzLnJlYWRGaWxlU3luYyhmaWxlUGF0aCwgJ3V0ZjgnKSxcblx0fSkpO1xuXG5cdHJldHVybiBnZXRJc0lnbm9yZWRQcmVkaWNhdGUoZmlsZXMsIGN3ZCk7XG59O1xuXG5leHBvcnQgY29uc3QgaXNHaXRJZ25vcmVkID0gb3B0aW9ucyA9PiBpc0lnbm9yZWRCeUlnbm9yZUZpbGVzKEdJVElHTk9SRV9GSUxFU19QQVRURVJOLCBvcHRpb25zKTtcbmV4cG9ydCBjb25zdCBpc0dpdElnbm9yZWRTeW5jID0gb3B0aW9ucyA9PiBpc0lnbm9yZWRCeUlnbm9yZUZpbGVzU3luYyhHSVRJR05PUkVfRklMRVNfUEFUVEVSTiwgb3B0aW9ucyk7XG4iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gc2xhc2gocGF0aCkge1xuXHRjb25zdCBpc0V4dGVuZGVkTGVuZ3RoUGF0aCA9IC9eXFxcXFxcXFxcXD9cXFxcLy50ZXN0KHBhdGgpO1xuXHRjb25zdCBoYXNOb25Bc2NpaSA9IC9bXlxcdTAwMDAtXFx1MDA4MF0rLy50ZXN0KHBhdGgpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWNvbnRyb2wtcmVnZXhcblxuXHRpZiAoaXNFeHRlbmRlZExlbmd0aFBhdGggfHwgaGFzTm9uQXNjaWkpIHtcblx0XHRyZXR1cm4gcGF0aDtcblx0fVxuXG5cdHJldHVybiBwYXRoLnJlcGxhY2UoL1xcXFwvZywgJy8nKTtcbn1cbiIsICJpbXBvcnQge2ZpbGVVUkxUb1BhdGh9IGZyb20gJ25vZGU6dXJsJztcbmltcG9ydCB7VHJhbnNmb3JtfSBmcm9tICdub2RlOnN0cmVhbSc7XG5cbmV4cG9ydCBjb25zdCB0b1BhdGggPSB1cmxPclBhdGggPT4gdXJsT3JQYXRoIGluc3RhbmNlb2YgVVJMID8gZmlsZVVSTFRvUGF0aCh1cmxPclBhdGgpIDogdXJsT3JQYXRoO1xuXG5leHBvcnQgY2xhc3MgRmlsdGVyU3RyZWFtIGV4dGVuZHMgVHJhbnNmb3JtIHtcblx0Y29uc3RydWN0b3IoZmlsdGVyKSB7XG5cdFx0c3VwZXIoe1xuXHRcdFx0b2JqZWN0TW9kZTogdHJ1ZSxcblx0XHRcdHRyYW5zZm9ybShkYXRhLCBlbmNvZGluZywgY2FsbGJhY2spIHtcblx0XHRcdFx0Y2FsbGJhY2sodW5kZWZpbmVkLCBmaWx0ZXIoZGF0YSkgPyBkYXRhIDogdW5kZWZpbmVkKTtcblx0XHRcdH0sXG5cdFx0fSk7XG5cdH1cbn1cblxuZXhwb3J0IGNvbnN0IGlzTmVnYXRpdmVQYXR0ZXJuID0gcGF0dGVybiA9PiBwYXR0ZXJuWzBdID09PSAnISc7XG4iLCAiaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIlxuXG5leHBvcnQgY29uc3QgZGVmYXVsdE1hcEZpbGVQYXRoVG9IVFRQUm91dGUgPVxuICAoYXBpX3ByZWZpeDogc3RyaW5nID0gXCIvYXBpXCIpID0+XG4gIChmaWxlX3BhdGg6IHN0cmluZykgPT4ge1xuICAgIGNvbnN0IHJvdXRlID0gZmlsZV9wYXRoXG4gICAgICAvLyByZXBsYWNlIC4vIGlmIGl0IHN0YXJ0cyB3aXRoIC4vXG4gICAgICAucmVwbGFjZSgvXlxcLlxcLy8sIFwiL1wiKVxuICAgICAgLy8gcmVwbGFjZSBzdGFydGluZyAvXG4gICAgICAucmVwbGFjZSgvXlxcLy8sIFwiXCIpXG4gICAgICAvLyByZXBsYWNlIC9zcmMgaWYgaXQgc3RhcnRzIHdpdGggL3NyY1xuICAgICAgLnJlcGxhY2UoL15zcmNcXC8vLCBcIlwiKVxuICAgICAgLy8gcmVwbGFjZSAvcGFnZXMgaWYgaXQgc3RhcnRzIHdpdGggL3BhZ2VzXG4gICAgICAucmVwbGFjZSgvXnBhZ2VzXFwvLywgXCJcIilcbiAgICAgIC8vIHJlcGxhY2UgL2FwaSBpZiBpdCBzdGFydHMgd2l0aCAvYXBpXG4gICAgICAucmVwbGFjZSgvXmFwaVxcLy8sIFwiXCIpXG4gICAgICAvLyByZXBsYWNlIC50cyBpZiBpdCBlbmRzIHdpdGggLnRzXG4gICAgICAucmVwbGFjZSgvXFwudHMkLywgXCJcIilcbiAgICAgIC8vIHJlbW92ZSBwdWJsaWMgcmVmZXJlbmNlXG4gICAgICAucmVwbGFjZShcInB1YmxpY1wiLCBcIlwiKVxuICAgICAgLy8gcmVwbGFjZSBpbmRleCBpZiBpdCBlbmRzIHdpdGggaW5kZXhcbiAgICAgIC5yZXBsYWNlKC9cXC9cXGluZGV4KD8hLikvLCBcIlwiKVxuXG4gICAgcmV0dXJuIHBhdGguam9pbihhcGlfcHJlZml4LCByb3V0ZSlcbiAgfVxuIiwgImltcG9ydCBfIGZyb20gXCJsb2Rhc2hcIlxuXG5mdW5jdGlvbiBmaW5kS2V5SW5PYmoob2JqOiBhbnksIHZhbHVlOiBhbnkpOiBzdHJpbmcgfCBudWxsIHtcbiAgbGV0IHJlc3VsdEtleTogc3RyaW5nIHwgbnVsbCA9IG51bGxcbiAgXy5mb3JPd24ob2JqLCAodiwgaykgPT4ge1xuICAgIGlmIChfLmlzT2JqZWN0KHYpICYmIF8uaXNNYXRjaCh2LCB2YWx1ZSkpIHtcbiAgICAgIHJlc3VsdEtleSA9IGtcbiAgICAgIC8vIFN0b3AgdGhlIGl0ZXJhdGlvblxuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICB9KVxuICByZXR1cm4gcmVzdWx0S2V5XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBlbWJlZFNjaGVtYVJlZmVyZW5jZXMob2JqMTogYW55LCBvYmoyOiBhbnkpOiBhbnkge1xuICByZXR1cm4gXy50cmFuc2Zvcm0ob2JqMSwgKHJlc3VsdCwgdmFsdWUsIGtleSkgPT4ge1xuICAgIGlmIChfLmlzT2JqZWN0KHZhbHVlKSkge1xuICAgICAgY29uc3QgbWF0Y2hpbmdLZXkgPSBmaW5kS2V5SW5PYmoob2JqMiwgdmFsdWUpXG4gICAgICBpZiAobWF0Y2hpbmdLZXkpIHtcbiAgICAgICAgcmVzdWx0W2tleV0gPSB7XG4gICAgICAgICAgJHJlZjogYCMvY29tcG9uZW50cy9zY2hlbWFzLyR7bWF0Y2hpbmdLZXl9YCxcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0W2tleV0gPSBlbWJlZFNjaGVtYVJlZmVyZW5jZXModmFsdWUsIG9iajIpXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdFtrZXldID0gdmFsdWVcbiAgICB9XG4gIH0pXG59XG4iLCAiaW1wb3J0IHsgUm91dGVTcGVjIH0gZnJvbSBcIi4uLy4uL3R5cGVzXCJcblxuZnVuY3Rpb24gdHJhbnNmb3JtUGF0aFRvRmVyblNka01ldGhvZE5hbWUocGF0aDogc3RyaW5nKSB7XG4gIGNvbnN0IHBhcnRzID0gcGF0aC5zcGxpdChcIi9cIikuZmlsdGVyKChwYXJ0KSA9PiBwYXJ0ICE9PSBcIlwiKVxuICBjb25zdCBsYXN0UGFydCA9IHBhcnRzW3BhcnRzLmxlbmd0aCAtIDFdXG4gIGlmIChsYXN0UGFydC5zdGFydHNXaXRoKFwiW1wiKSAmJiBsYXN0UGFydC5lbmRzV2l0aChcIl1cIikpIHtcbiAgICAvLyBDb252ZXJ0IFtwYXJhbV0gdG8gYnlfcGFyYW1cbiAgICBjb25zdCBwYXJhbSA9IGxhc3RQYXJ0LnNsaWNlKDEsIC0xKVxuICAgIHJldHVybiBgYnlfJHtwYXJhbX1gXG4gIH1cblxuICByZXR1cm4gbGFzdFBhcnRcbn1cblxuLy8gZmVybiBkb2NzOiBodHRwczovL2J1aWxkd2l0aGZlcm4uY29tL2RvY3Mvc3BlYy9leHRlbnNpb25zXG5mdW5jdGlvbiB0cmFuc2Zvcm1QYXRoVG9GZXJuU2RrR3JvdXBOYW1lKHBhdGg6IHN0cmluZykge1xuICBjb25zdCBwYXJ0cyA9IHBhdGguc3BsaXQoXCIvXCIpLmZpbHRlcigocGFydCkgPT4gcGFydCAhPT0gXCJcIilcbiAgcmV0dXJuIHBhcnRzLnNsaWNlKDAsIHBhcnRzLmxlbmd0aCAtIDEpXG59XG5cbmZ1bmN0aW9uIGdldEZlcm5TZGtNZXRhZGF0YShwYXRoOiBzdHJpbmcpOlxuICB8IHtcbiAgICAgIFwieC1mZXJuLWlnbm9yZVwiOiB0cnVlXG4gICAgfVxuICB8IHtcbiAgICAgIFwieC1mZXJuLXNkay1ncm91cC1uYW1lXCI6IHN0cmluZ1tdXG4gICAgICBcIngtZmVybi1zZGstbWV0aG9kLW5hbWVcIjogc3RyaW5nXG4gICAgfSB7XG4gIGlmIChwYXRoLnNwbGl0KFwiL1wiKS5maWx0ZXIoKHBhcnQpID0+IHBhcnQgIT09IFwiXCIpLmxlbmd0aCA9PT0gMSkge1xuICAgIHJldHVybiB7XG4gICAgICBcIngtZmVybi1pZ25vcmVcIjogdHJ1ZSxcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIFwieC1mZXJuLXNkay1ncm91cC1uYW1lXCI6IHRyYW5zZm9ybVBhdGhUb0Zlcm5TZGtHcm91cE5hbWUocGF0aCksXG4gICAgXCJ4LWZlcm4tc2RrLW1ldGhvZC1uYW1lXCI6IHRyYW5zZm9ybVBhdGhUb0Zlcm5TZGtNZXRob2ROYW1lKHBhdGgpLFxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtYXBNZXRob2RzVG9GZXJuU2RrTWV0YWRhdGEoXG4gIG1ldGhvZHM6IFJvdXRlU3BlY1tcIm1ldGhvZHNcIl0sXG4gIHBhdGg6IHN0cmluZ1xuKSB7XG4gIGNvbnN0IGZlcm5TZGtNZXRhZGF0YSA9IGdldEZlcm5TZGtNZXRhZGF0YShwYXRoKVxuICBpZiAobWV0aG9kcy5sZW5ndGggPT09IDEpIHtcbiAgICByZXR1cm4ge1xuICAgICAgW21ldGhvZHNbMF1dOiBmZXJuU2RrTWV0YWRhdGEsXG4gICAgfVxuICB9XG5cbiAgY29uc3QgbWFwcGVkTWV0aG9kcyA9IHt9XG4gIGNvbnN0IGF0TGVhc3RPbmVNZXRob2RJc1Bvc3QgPSBtZXRob2RzLmluY2x1ZGVzKFwiUE9TVFwiKVxuXG4gIGlmICghYXRMZWFzdE9uZU1ldGhvZElzUG9zdCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIFwiQSByb3V0ZSB0aGF0IGFjY2VwdHMgbXVsdGlwbGUgbWV0aG9kcyBzaG91bGQgaW5jbHVkZSBhdCBsZWFzdCB0aGUgUE9TVCBtZXRob2QuXCJcbiAgICApXG4gIH1cblxuICBtZXRob2RzLmZvckVhY2goKG1ldGhvZCkgPT4ge1xuICAgIGlmIChtZXRob2QgPT09IFwiUE9TVFwiKSB7XG4gICAgICBtYXBwZWRNZXRob2RzW21ldGhvZF0gPSBmZXJuU2RrTWV0YWRhdGFcbiAgICB9IGVsc2Uge1xuICAgICAgbWFwcGVkTWV0aG9kc1ttZXRob2RdID0ge1xuICAgICAgICBcIngtZmVybi1pZ25vcmVcIjogdHJ1ZSxcbiAgICAgIH1cbiAgICB9XG4gIH0pXG5cbiAgcmV0dXJuIG1hcHBlZE1ldGhvZHNcbn1cbiIsICJpbXBvcnQgKiBhcyBmcyBmcm9tIFwibm9kZTpmcy9wcm9taXNlc1wiXG5pbXBvcnQgeyBwYXJzZVJvdXRlc0luUGFja2FnZSB9IGZyb20gXCIuLi9saWIvcGFyc2Utcm91dGVzLWluLXBhY2thZ2VcIlxuaW1wb3J0IHsgem9kVG9UcywgcHJpbnROb2RlIH0gZnJvbSBcInpvZC10by10c1wiXG5pbXBvcnQgcHJldHRpZXIgZnJvbSBcInByZXR0aWVyXCJcbmltcG9ydCB7IHosIFpvZEVmZmVjdHMsIFpvZE9wdGlvbmFsIH0gZnJvbSBcInpvZFwiXG5cbmludGVyZmFjZSBHZW5lcmF0ZVJvdXRlVHlwZXNPcHRzIHtcbiAgcGFja2FnZURpcjogc3RyaW5nXG4gIG91dHB1dEZpbGU/OiBzdHJpbmdcbiAgcGF0aEdsb2I/OiBzdHJpbmdcbiAgYXBpUHJlZml4Pzogc3RyaW5nXG4gIG1hcEZpbGVQYXRoVG9IVFRQUm91dGU/OiAoZmlsZV9wYXRoOiBzdHJpbmcpID0+IHN0cmluZ1xuICAvKipcbiAgICogSWYgcHJvdmlkZWQsIG9ubHkgcm91dGVzIHRoYXQgcmV0dXJuIHRydWUgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgZ2VuZXJhdGVkIHR5cGVzLlxuICAgKi9cbiAgZmlsdGVyUm91dGVzPzogKHJvdXRlOiBzdHJpbmcpID0+IGJvb2xlYW5cbn1cblxuZXhwb3J0IGNvbnN0IGdlbmVyYXRlUm91dGVUeXBlcyA9IGFzeW5jIChvcHRzOiBHZW5lcmF0ZVJvdXRlVHlwZXNPcHRzKSA9PiB7XG4gIGNvbnN0IGZpbGVwYXRoVG9Sb3V0ZSA9IGF3YWl0IHBhcnNlUm91dGVzSW5QYWNrYWdlKG9wdHMpXG5cbiAgY29uc3Qgc29ydGVkUm91dGVzID0gQXJyYXkuZnJvbShmaWxlcGF0aFRvUm91dGUuZW50cmllcygpKS5zb3J0KChhLCBiKSA9PlxuICAgIGFbMV0ucm91dGUubG9jYWxlQ29tcGFyZShiWzFdLnJvdXRlKVxuICApXG4gIGNvbnN0IGZpbHRlcmVkUm91dGVzID0gc29ydGVkUm91dGVzLmZpbHRlcihcbiAgICAoW18sIHsgcm91dGUgfV0pID0+ICFvcHRzLmZpbHRlclJvdXRlcyB8fCBvcHRzLmZpbHRlclJvdXRlcyhyb3V0ZSlcbiAgKVxuXG4gIC8vIFRPRE8gd2hlbiBsZXNzIGxhenksIHVzZSB0cy1tb3JwaCBmb3IgYmV0dGVyIGdlbmVyYXRpb25cbiAgY29uc3Qgcm91dGVEZWZzOiBzdHJpbmdbXSA9IFtdXG4gIGZvciAoY29uc3QgW18sIHsgcm91dGUsIHJvdXRlU3BlYywgc2V0dXBQYXJhbXMgfV0gb2YgZmlsdGVyZWRSb3V0ZXMpIHtcbiAgICBjb25zdCBxdWVyeUtleXMgPSBPYmplY3Qua2V5cyhyb3V0ZVNwZWMucXVlcnlQYXJhbXM/LnNoYXBlID8/IHt9KVxuICAgIGNvbnN0IHBhdGhQYXJhbWV0ZXJzID0gcXVlcnlLZXlzLmZpbHRlcigoa2V5KSA9PiByb3V0ZS5pbmNsdWRlcyhgWyR7a2V5fV1gKSlcblxuICAgIC8vIHF1ZXJ5UGFyYW1zIG1pZ2h0IGJlIGEgWm9kRWZmZWN0cyBvciBab2RPcHRpb25hbCBpbiBzb21lIGNhc2VzXG4gICAgbGV0IHF1ZXJ5UGFyYW1zID0gcm91dGVTcGVjLnF1ZXJ5UGFyYW1zXG4gICAgd2hpbGUgKFxuICAgICAgcXVlcnlQYXJhbXMgJiZcbiAgICAgIChcInNvdXJjZVR5cGVcIiBpbiBxdWVyeVBhcmFtcyB8fCBcInVud3JhcFwiIGluIHF1ZXJ5UGFyYW1zKVxuICAgICkge1xuICAgICAgaWYgKFwic291cmNlVHlwZVwiIGluIHF1ZXJ5UGFyYW1zKSB7XG4gICAgICAgIHF1ZXJ5UGFyYW1zID0gKHF1ZXJ5UGFyYW1zIGFzIHVua25vd24gYXMgWm9kRWZmZWN0czxhbnk+KS5zb3VyY2VUeXBlKClcbiAgICAgIH0gZWxzZSBpZiAoXCJ1bndyYXBcIiBpbiBxdWVyeVBhcmFtcykge1xuICAgICAgICBxdWVyeVBhcmFtcyA9IChxdWVyeVBhcmFtcyBhcyB1bmtub3duIGFzIFpvZE9wdGlvbmFsPGFueT4pLnVud3JhcCgpXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgcXVlcnlQYXJhbXNTY2hlbWFXaXRob3V0UGF0aFBhcmFtZXRlcnMgPSBxdWVyeVBhcmFtcz8ub21pdChcbiAgICAgIE9iamVjdC5mcm9tRW50cmllcyhwYXRoUGFyYW1ldGVycy5tYXAoKHBhcmFtKSA9PiBbcGFyYW0sIHRydWVdKSlcbiAgICApXG5cbiAgICByb3V0ZURlZnMucHVzaChcbiAgICAgIGBcblwiJHtyb3V0ZX1cIjoge1xuICByb3V0ZTogXCIke3JvdXRlfVwiLFxuICBtZXRob2Q6ICR7cm91dGVTcGVjLm1ldGhvZHMubWFwKChtKSA9PiBgXCIke219XCJgKS5qb2luKFwiIHwgXCIpfSxcbiAgcXVlcnlQYXJhbXM6ICR7XG4gICAgcXVlcnlQYXJhbXNTY2hlbWFXaXRob3V0UGF0aFBhcmFtZXRlcnNcbiAgICAgID8gcHJpbnROb2RlKHpvZFRvVHMocXVlcnlQYXJhbXNTY2hlbWFXaXRob3V0UGF0aFBhcmFtZXRlcnMpLm5vZGUpXG4gICAgICA6IFwie31cIlxuICB9LFxuICBqc29uQm9keTogJHtcbiAgICByb3V0ZVNwZWMuanNvbkJvZHkgPyBwcmludE5vZGUoem9kVG9Ucyhyb3V0ZVNwZWMuanNvbkJvZHkpLm5vZGUpIDogXCJ7fVwiXG4gIH0sXG4gIGNvbW1vblBhcmFtczogJHtcbiAgICByb3V0ZVNwZWMuY29tbW9uUGFyYW1zXG4gICAgICA/IHByaW50Tm9kZSh6b2RUb1RzKHJvdXRlU3BlYy5jb21tb25QYXJhbXMpLm5vZGUpXG4gICAgICA6IFwie31cIlxuICB9LFxuICBmb3JtRGF0YTogJHtcbiAgICByb3V0ZVNwZWMuZm9ybURhdGEgPyBwcmludE5vZGUoem9kVG9Ucyhyb3V0ZVNwZWMuZm9ybURhdGEpLm5vZGUpIDogXCJ7fVwiXG4gIH0sXG4gIGpzb25SZXNwb25zZTogJHtcbiAgICByb3V0ZVNwZWMuanNvblJlc3BvbnNlXG4gICAgICA/IHByaW50Tm9kZShcbiAgICAgICAgICB6b2RUb1RzKFxuICAgICAgICAgICAgc2V0dXBQYXJhbXMuYWRkT2tTdGF0dXNcbiAgICAgICAgICAgICAgPyByb3V0ZVNwZWMuanNvblJlc3BvbnNlLmV4dGVuZCh7IG9rOiB6LmJvb2xlYW4oKSB9KVxuICAgICAgICAgICAgICA6IHJvdXRlU3BlYy5qc29uUmVzcG9uc2VcbiAgICAgICAgICApLm5vZGVcbiAgICAgICAgKVxuICAgICAgOiBcInt9XCJcbiAgfVxufWAudHJpbSgpXG4gICAgKVxuICB9XG4gIGNvbnN0IHJvdXRlRGVmU3RyID0gcm91dGVEZWZzLmpvaW4oXCIsXFxuXCIpXG4gIGNvbnN0IG91dHB1dCA9IGF3YWl0IHByZXR0aWVyLmZvcm1hdChcbiAgICBgZXhwb3J0IHR5cGUgUm91dGVzID0ge1xuJHtyb3V0ZURlZlN0cn1cbn1cblxuZXhwb3J0IHR5cGUgUm91dGVSZXNwb25zZTxQYXRoIGV4dGVuZHMga2V5b2YgUm91dGVzPiA9XG4gIFJvdXRlc1tQYXRoXVtcImpzb25SZXNwb25zZVwiXVxuXG5leHBvcnQgdHlwZSBSb3V0ZVJlcXVlc3RCb2R5PFBhdGggZXh0ZW5kcyBrZXlvZiBSb3V0ZXM+ID1cbiAgUm91dGVzW1BhdGhdW1wianNvbkJvZHlcIl0gJiBSb3V0ZXNbUGF0aF1bXCJjb21tb25QYXJhbXNcIl1cblxuZXhwb3J0IHR5cGUgUm91dGVSZXF1ZXN0UGFyYW1zPFBhdGggZXh0ZW5kcyBrZXlvZiBSb3V0ZXM+ID1cbiAgUm91dGVzW1BhdGhdW1wicXVlcnlQYXJhbXNcIl0gJiBSb3V0ZXNbUGF0aF1bXCJjb21tb25QYXJhbXNcIl1cbmAudHJpbSgpLFxuICAgIHsgc2VtaTogZmFsc2UsIHBhcnNlcjogXCJ0eXBlc2NyaXB0XCIgfVxuICApXG5cbiAgaWYgKG9wdHMub3V0cHV0RmlsZSkge1xuICAgIGF3YWl0IGZzLndyaXRlRmlsZShvcHRzLm91dHB1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VUFBUyxjQUFVLEtBQUssWUFBWSxNQUFNO0FBQUEsRUFDNUM7QUFFQSxTQUFPO0FBQ1Q7IiwKICAibmFtZXMiOiBbImdlbmVyYXRlU2NoZW1hIiwgIm1vZHVsZSIsICJtZXJnZTIiLCAib3MiLCAicGF0aCIsICJtb2R1bGUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJzbGFzaCIsICJnbG9iYnkiLCAibm9kZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJtYXgiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJpbmRleCIsICJtb2R1bGUiLCAicmVxdWlyZV9jb25zdGFudHMiLCAibW9kdWxlIiwgInBhdGgiLCAicmVxdWlyZV91dGlscyIsICJwYXRoIiwgIm1vZHVsZSIsICJyZXF1aXJlX3BhcnNlIiwgIm1vZHVsZSIsICJvcHRzIiwgInZhbHVlIiwgInJlc3QiLCAic291cmNlIiwgIm1vZHVsZSIsICJwYXRoIiwgInN0YXRlIiwgInJlcXVpcmVfcGljb21hdGNoIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAicGF0aCIsICJpc0R5bmFtaWNQYXR0ZXJuIiwgImlzTmVnYXRpdmVQYXR0ZXJuIiwgInBhdHRlcm4iLCAibWVyZ2UyIiwgInJlcXVpcmVfdXRpbHMiLCAiZnMiLCAicGF0aCIsICJwYXRoIiwgInBhdGgiLCAicmVxdWlyZV9mcyIsICJmcyIsICJmcyIsICJwYXRoIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAicXVldWVNaWNyb3Rhc2siLCAicmVxdWlyZV9jb25zdGFudHMiLCAicmVxdWlyZV9mcyIsICJyZXF1aXJlX3V0aWxzIiwgImZzIiwgInJlcXVpcmVfYXN5bmMiLCAicGF0aCIsICJyZXF1aXJlX3N5bmMiLCAicmVxdWlyZV9mcyIsICJmcyIsICJyZXF1aXJlX3NldHRpbmdzIiwgInBhdGgiLCAiZnMiLCAicmVxdWlyZV9vdXQiLCAicGF0aCIsICJtb2R1bGUiLCAibW9kdWxlIiwgInJlcXVpcmVfY29tbW9uIiwgInJlcXVpcmVfYXN5bmMiLCAicmVxdWlyZV9hc3luYyIsICJyZXF1aXJlX3N0cmVhbSIsICJyZXF1aXJlX3N5bmMiLCAicmVxdWlyZV9zeW5jIiwgInJlcXVpcmVfc2V0dGluZ3MiLCAicGF0aCIsICJyZXF1aXJlX291dCIsICJyZXF1aXJlX3JlYWRlciIsICJwYXRoIiwgInJlcXVpcmVfc3RyZWFtIiwgInJlcXVpcmVfYXN5bmMiLCAicmVxdWlyZV9lbnRyeSIsICJwYXRoIiwgInJlcXVpcmVfYXN5bmMiLCAicmVxdWlyZV9zdHJlYW0iLCAicmVxdWlyZV9zeW5jIiwgInJlcXVpcmVfc3luYyIsICJyZXF1aXJlX3NldHRpbmdzIiwgImZzIiwgIm9zIiwgInJlcXVpcmVfb3V0IiwgIm1vZHVsZSIsICJhc3NlcnRQYXR0ZXJuc0lucHV0IiwgIkZhc3RHbG9iIiwgImdlbmVyYXRlVGFza3MiLCAiaXNEeW5hbWljUGF0dGVybiIsICJwb3NpeCIsICJlc2NhcGVQYXRoIiwgImNvbnZlcnRQYXRoVG9QYXR0ZXJuIiwgIndpbjMyIiwgImZzIiwgIm1vZHVsZSIsICJwYXRoIiwgIm1vZHVsZSIsICJfIiwgInBhdGgiLCAicHJvY2VzcyIsICJvcyIsICJ0dHkiLCAic3R5bGVzIiwgImNoYWxrIiwgInN0eWxlcyIsICJpbXBvcnRfbm9kZV9wYXRoIiwgImltcG9ydF9ub2RlX2ZzIiwgImltcG9ydF9ub2RlX3BhdGgiLCAiaW1wb3J0X2Zhc3RfZ2xvYiIsICJpbXBvcnRfbm9kZV9wcm9jZXNzIiwgInBhdGgiLCAicGF0aCIsICJnaXRJZ25vcmUiLCAicHJvY2VzcyIsICJmYXN0R2xvYiIsICJmcyIsICJmcyIsICJub3JtYWxpemVPcHRpb25zIiwgInBhdGgiLCAibm9kZVBhdGgiLCAibWVyZ2UyIiwgInBhdHRlcm5zIiwgIm9wdGlvbnMiLCAiZGlyR2xvYiIsICJmYXN0R2xvYiIsICJwYXRoIiwgInBhdGgiLCAiXyIsICJwYXRoIiwgInBhdGgiLCAiX2EiLCAiZnMiLCAiZnMiLCAiaW1wb3J0X3pvZCIsICJfIiwgInByZXR0aWVyIl0KfQo=
|