@stemy/backend 3.4.0 → 3.4.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/esm2015/utils.js CHANGED
@@ -14,11 +14,9 @@ import { canReportError } from "rxjs/internal/util/canReportError";
14
14
  import { mkdir, readFile as fsReadFile, unlink, writeFile as fsWriteFile } from "fs";
15
15
  import { basename, dirname } from "path";
16
16
  import { ObjectId } from "mongodb";
17
- import { model, Types } from "mongoose";
18
- import { getValue as getMongoValue, setValue as setMongoValue } from "mongoose/lib/utils";
17
+ import { Types } from "mongoose";
19
18
  import { PassThrough, Readable } from "stream";
20
19
  import sharp_ from "sharp";
21
- import { BadRequestError, createParamDecorator, HttpError } from "routing-controllers";
22
20
  const sharp = sharp_;
23
21
  export const diContainers = {
24
22
  appContainer: null
@@ -162,146 +160,6 @@ export function convertValue(value, type) {
162
160
  }
163
161
  return value;
164
162
  }
165
- export function injectServices(schema, services) {
166
- const serviceMap = {};
167
- Object.keys(services).forEach(prop => {
168
- schema
169
- .virtual(prop)
170
- .get(() => {
171
- const diContainer = diContainers.appContainer;
172
- serviceMap[prop] = serviceMap[prop] || (!diContainer ? {} : diContainer.resolve(services[prop]));
173
- return serviceMap[prop];
174
- });
175
- });
176
- }
177
- export function paginate(model, where, params) {
178
- return model.countDocuments(where).then(count => {
179
- let query = model.find(where);
180
- if (isString(params.sort)) {
181
- query = query.sort(params.sort);
182
- }
183
- if (isArray(params.populate)) {
184
- params.populate.forEach(field => {
185
- query = query.populate(field);
186
- });
187
- }
188
- return (params.limit > 0 ? query.skip(params.page * params.limit).limit(params.limit) : query).then(items => {
189
- const meta = { total: count };
190
- return { count, items, meta };
191
- });
192
- });
193
- }
194
- export function lookupStages(from, localField, as = null, foreignField = "_id", shouldUnwind = true) {
195
- as = as || localField.replace("Id", "");
196
- const stages = [
197
- {
198
- $lookup: {
199
- from,
200
- localField,
201
- foreignField,
202
- as
203
- }
204
- },
205
- {
206
- $unwind: {
207
- path: `$${as}`,
208
- preserveNullAndEmptyArrays: true
209
- }
210
- }
211
- ];
212
- if (!shouldUnwind) {
213
- stages.splice(1, 1);
214
- }
215
- return stages;
216
- }
217
- export function letsLookupStage(from, pipeline, as = null, letFields = null) {
218
- as = as || from;
219
- letFields = letFields || { id: "$_id" };
220
- return {
221
- $lookup: {
222
- from,
223
- let: letFields,
224
- pipeline,
225
- as
226
- }
227
- };
228
- }
229
- export function matchStage(match) {
230
- return { $match: match };
231
- }
232
- export function matchField(field, filter, when) {
233
- return { field, filter, when };
234
- }
235
- export function matchFieldStages(...fields) {
236
- const match = {};
237
- fields.forEach(field => {
238
- if (field.when) {
239
- match[field.field] = field.filter;
240
- }
241
- });
242
- return Object.keys(match).length > 0 ? [matchStage(match)] : [];
243
- }
244
- export function projectStage(fields) {
245
- return { $project: fields };
246
- }
247
- export function unwindStage(fieldOrOpts) {
248
- return { $unwind: fieldOrOpts };
249
- }
250
- export function hydratePopulated(modelType, json) {
251
- let object = modelType.hydrate(json);
252
- for (const [path, obj] of Object.entries(modelType.schema.obj)) {
253
- let { ref, type } = obj;
254
- if (Array.isArray(type) && type.length > 0) {
255
- ref = type[0].ref;
256
- }
257
- if (!ref)
258
- continue;
259
- const value = getMongoValue(path, json);
260
- const hydrateVal = val => {
261
- if (val == null || val instanceof Types.ObjectId)
262
- return val;
263
- return hydratePopulated(model(ref), val);
264
- };
265
- if (Array.isArray(value)) {
266
- setMongoValue(path, value.map(hydrateVal), object);
267
- continue;
268
- }
269
- setMongoValue(path, hydrateVal(value), object);
270
- }
271
- return object;
272
- }
273
- export function paginateAggregations(model, aggregations, params, metaProjection = {}) {
274
- return __awaiter(this, void 0, void 0, function* () {
275
- const sortField = !isString(params.sort) || !params.sort ? null : (params.sort.startsWith("-") ? params.sort.substr(1) : params.sort);
276
- const sortAggregation = !sortField ? [] : [{
277
- $sort: { [sortField]: sortField == params.sort ? 1 : -1 }
278
- }];
279
- const result = yield model.aggregate([
280
- ...aggregations,
281
- ...sortAggregation,
282
- {
283
- $group: {
284
- _id: "results",
285
- result: { $push: "$$CURRENT" }
286
- }
287
- },
288
- {
289
- $project: {
290
- _id: 0,
291
- items: params.limit > 0 ? { $slice: ["$result", params.page * params.limit, params.limit] } : "$result",
292
- count: { $size: "$result" },
293
- meta: Object.assign({ total: { $size: "$result" } }, metaProjection)
294
- }
295
- }
296
- ]);
297
- const pagination = result[0];
298
- if (!pagination) {
299
- return { items: [], count: 0, meta: { total: 0 } };
300
- }
301
- pagination.items = pagination.items.map(i => hydratePopulated(model, i));
302
- return pagination;
303
- });
304
- }
305
163
  const cropInterface = {
306
164
  x: "number",
307
165
  y: "number",
@@ -531,43 +389,6 @@ export function getFunctionParams(func) {
531
389
  });
532
390
  return params;
533
391
  }
534
- export function ResolveEntity(model, extraCheck) {
535
- const modelName = model.modelName;
536
- const paramName = modelName.toLowerCase();
537
- return createParamDecorator({
538
- required: false,
539
- value: (action) => __awaiter(this, void 0, void 0, function* () {
540
- const req = action.request;
541
- const token = req.header(`x-${paramName}-token`);
542
- const id = req.params[`${paramName}Id`];
543
- if (!id && !token) {
544
- throw new BadRequestError(`${modelName} id or token should be defined!`);
545
- }
546
- const query = !token
547
- ? model.findById(id)
548
- : model.findOne({ token });
549
- let doc = null;
550
- if (isFunction(extraCheck)) {
551
- try {
552
- doc = yield valueToPromise(extraCheck(query, action));
553
- }
554
- catch (e) {
555
- throw new BadRequestError(`${modelName} check error: ${e.message || e}`);
556
- }
557
- }
558
- else {
559
- doc = yield query;
560
- }
561
- if (!doc) {
562
- throw new HttpError(404, !token
563
- ? `${modelName} could not be found with id: ${id}`
564
- : `${modelName} could not be found with token: ${token}`);
565
- }
566
- action.request[paramName] = doc;
567
- return doc;
568
- })
569
- });
570
- }
571
392
  export function getFileName(path, withExtension = false) {
572
393
  const name = basename(path || "");
573
394
  return withExtension ? name : name.split(".").slice(0, -1).join(".");
@@ -824,4 +645,4 @@ export function replaceSpecialChars(str, to = "-") {
824
645
  return `${str}`.replace(/[&\/\\#, +()$~%.@'":*?<>{}]/g, to);
825
646
  }
826
647
  export { ɵ0 };
827
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQ0EsT0FBTyxFQUFDLElBQUksSUFBSSxnQkFBZ0IsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN2RCxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sUUFBUSxDQUFDO0FBRWxDLE9BQU8sRUFBQyxJQUFJLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFDN0QsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLG1DQUFtQyxDQUFDO0FBRWpFLE9BQU8sRUFBQyxLQUFLLEVBQUUsUUFBUSxJQUFJLFVBQVUsRUFBRSxNQUFNLEVBQUUsU0FBUyxJQUFJLFdBQVcsRUFBQyxNQUFNLElBQUksQ0FBQztBQUNuRixPQUFPLEVBQUMsUUFBUSxFQUFFLE9BQU8sRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUN2QyxPQUFPLEVBQWUsUUFBUSxFQUFDLE1BQU0sU0FBUyxDQUFDO0FBQy9DLE9BQU8sRUFBMkMsS0FBSyxFQUFnQyxLQUFLLEVBQUMsTUFBTSxVQUFVLENBQUM7QUFDOUcsT0FBTyxFQUFDLFFBQVEsSUFBSSxhQUFhLEVBQUUsUUFBUSxJQUFJLGFBQWEsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBQ3hGLE9BQU8sRUFBQyxXQUFXLEVBQUUsUUFBUSxFQUFrQixNQUFNLFFBQVEsQ0FBQztBQUM5RCxPQUFPLE1BQWdCLE1BQU0sT0FBTyxDQUFDO0FBQ3JDLE9BQU8sRUFBUyxlQUFlLEVBQUUsb0JBQW9CLEVBQUUsU0FBUyxFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFnQjdGLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQztBQU1yQixNQUFNLENBQUMsTUFBTSxZQUFZLEdBQWtCO0lBQ3ZDLFlBQVksRUFBRSxJQUFJO0NBQ3JCLENBQUM7QUFJRixNQUFNLFVBQVUsaUJBQWlCLENBQUMs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bkYsTUFBTSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDbkYsTUFBTSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDakUsTUFBTSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDakUsTUFBTSxDQUFDLElBQUksR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxJQUFJLE1BQU0sQ0FBQztRQUUzRSxJQUFJLE1BQU0sR0FBRyxHQUFHLFlBQVksUUFBUSxDQUFDLENBQUMsQ0FBQyxNQUFNLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBVSxDQUFDO1FBQzlFLElBQUk7WUFDQSxnQkFBZ0I7WUFDaEIsTUFBTSxVQUFVLEdBQUcsWUFBWSxDQUFDLE1BQU0sQ0FBQyxVQUFVLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQzdGLE1BQU0sU0FBUyxHQUFHLFlBQVksQ0FBQyxNQUFNLENBQUMsU0FBUyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FB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Q25CLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQzt3QkFDaEIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTO3dCQUNsQixDQUFDLENBQUMsS0FBSyxDQUFBO1NBQ3RCO1FBQ0QsT0FBTyxHQUFHLEtBQUssR0FBRyxLQUFLLEdBQUcsWUFBWSxDQUFDLEtBQUssRUFBRSxDQUFBO0lBQ2xELENBQUMsQ0FBQyxDQUFBO0FBQ04sQ0FBQztBQUVELE1BQU0sVUFBVSxtQkFBbUIsQ0FBQyxHQUFXLEVBQUUsS0FBYSxHQUFHO0lBQzdELE9BQU8sR0FBRyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsOEJBQThCLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDaEUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7RG9jdW1lbnRUeXBlLCBSZXR1cm5Nb2RlbFR5cGV9IGZyb20gXCJAdHlwZWdvb3NlL3R5cGVnb29zZVwiO1xyXG5pbXBvcnQge2V4ZWMgYXMgZXhlY0NoaWxkUHJvY2Vzc30gZnJvbSBcImNoaWxkX3Byb2Nlc3NcIjtcclxuaW1wb3J0IHtjcmVhdGVIYXNofSBmcm9tIFwiY3J5cHRvXCI7XHJcbmltcG9ydCB7RGVwZW5kZW5jeUNvbnRhaW5lciwgSW5qZWN0aW9uVG9rZW59IGZyb20gXCJ0c3lyaW5nZVwiO1xyXG5pbXBvcnQge2Zyb20sIE9ic2VydmFibGUsIFN1YmplY3QsIFN1YnNjcmlwdGlvbn0gZnJvbSBcInJ4anNcIjtcclxuaW1wb3J0IHtjYW5SZXBvcnRFcnJvcn0gZnJvbSBcInJ4anMvaW50ZXJuYWwvdXRpbC9jYW5SZXBvcnRFcnJvclwiO1xyXG5pbXBvcnQge1NlcnZlcn0gZnJvbSBcInNvY2tldC5pb1wiO1xyXG5pbXBvcnQge21rZGlyLCByZWFkRmlsZSBhcyBmc1JlYWRGaWxlLCB1bmxpbmssIHdyaXRlRmlsZSBhcyBmc1dyaXRlRmlsZX0gZnJvbSBcImZzXCI7XHJcbmltcG9ydCB7YmFzZW5hbWUsIGRpcm5hbWV9IGZyb20gXCJwYXRoXCI7XHJcbmltcG9ydCB7R3JpZEZTQnVja2V0LCBPYmplY3RJZH0gZnJvbSBcIm1vbmdvZGJcIjtcclxuaW1wb3J0IHtEb2N1bWVudCwgRXhwcmVzc2lvbiwgRmlsdGVyUXVlcnksIE1vZGVsLCBtb2RlbCwgUGlwZWxpbmVTdGFnZSwgUXVlcnksIFNjaGVtYSwgVHlwZXN9IGZyb20gXCJtb25nb29zZVwiO1xyXG5pbXBvcnQge2dldFZhbHVlIGFzIGdldE1vbmdvVmFsdWUsIHNldFZhbHVlIGFzIHNldE1vbmdvVmFsdWV9IGZyb20gXCJtb25nb29zZS9saWIvdXRpbHNcIjtcclxuaW1wb3J0IHtQYXNzVGhyb3VnaCwgUmVhZGFibGUsIFJlYWRhYmxlT3B0aW9uc30gZnJvbSBcInN0cmVhbVwiO1xyXG5pbXBvcnQgc2hhcnBfLCB7UmVnaW9ufSBmcm9tIFwic2hhcnBcIjtcclxuaW1wb3J0IHtBY3Rpb24sIEJhZFJlcXVlc3RFcnJvciwgY3JlYXRlUGFyYW1EZWNvcmF0b3IsIEh0dHBFcnJvcn0gZnJvbSBcInJvdXRpbmctY29udHJvbGxlcnNcIjtcclxuaW1wb3J0IHtcclxuICAgIElBc3NldENyb3BJbmZvLFxyXG4gICAgSUFzc2V0SW1hZ2VQYXJhbXMsXHJcbiAgICBJQXNzZXRNZXRhLFxyXG4gICAgSUNsaWVudFNvY2tldCxcclxuICAgIElNYXRjaEZpZWxkLFxyXG4gICAgSW5mZXJHZW5lcmljLFxyXG4gICAgSVBhZ2luYXRpb25CYXNlLFxyXG4gICAgSVBhZ2luYXRpb25QYXJhbXMsXHJcbiAgICBJUHJvamVjdE9wdGlvbnMsXHJcbiAgICBJUmVxdWVzdCxcclxuICAgIElVbndpbmRPcHRpb25zLFxyXG4gICAgVHlwZVxyXG59IGZyb20gXCIuL2NvbW1vbi10eXBlc1wiO1xyXG5cclxuY29uc3Qgc2hhcnAgPSBzaGFycF87XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElESUNvbnRhaW5lcnMge1xyXG4gICAgYXBwQ29udGFpbmVyOiBEZXBlbmRlbmN5Q29udGFpbmVyXHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBkaUNvbnRhaW5lcnM6IElESUNvbnRhaW5lcnMgPSB7XHJcbiAgICBhcHBDb250YWluZXI6IG51bGxcclxufTtcclxuXHJcbmV4cG9ydCB0eXBlIEZpbHRlclByZWRpY2F0ZSA9ICh2YWx1ZTogYW55LCBrZXk/OiBhbnksIHRhcmdldD86IGFueSwgc291cmNlPzogYW55KSA9PiBib29sZWFuO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGlzTnVsbE9yVW5kZWZpbmVkKHZhbHVlOiBhbnkpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB2YWx1ZSA9PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSA9PSBcInVuZGVmaW5lZFwiO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaXNEZWZpbmVkKHZhbHVlOiBhbnkpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAhaXNOdWxsT3JVbmRlZmluZWQodmFsdWUpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0VHlwZShvYmo6IGFueSk6IHN0cmluZyB7XHJcbiAgICBjb25zdCByZWdleCA9IG5ldyBSZWdFeHAoXCJcXFxccyhbYS16QS1aXSspXCIpO1xyXG4gICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmopLm1hdGNoKHJlZ2V4KVsxXS50b0xvd2VyQ2FzZSgpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaXNPYmplY3QodmFsdWU6IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIGdldFR5cGUodmFsdWUpID09IFwib2JqZWN0XCI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBpc0FycmF5KHZhbHVlOiBhbnkpOiB2YWx1ZSBpcyBBcnJheTxhbnk+IHtcclxuICAgIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGlzQm9vbGVhbih2YWx1ZTogYW55KTogdmFsdWUgaXMgYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSBcImJvb2xlYW5cIjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGlzRGF0ZSh2YWx1ZTogYW55KTogdmFsdWUgaXMgRGF0ZSB7XHJcbiAgICByZXR1cm4gISF2YWx1ZSAmJiB2YWx1ZVtTeW1ib2wudG9QcmltaXRpdmVdICYmICFpc05hTih2YWx1ZSkgJiYgXCJ1bmRlZmluZWRcIiAhPT0gdHlwZW9mIHZhbHVlLmdldERhdGU7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBpc1ByaW1pdGl2ZSh2YWx1ZTogYW55KTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCB0eXBlID0gdHlwZW9mIHZhbHVlO1xyXG4gICAgcmV0dXJuIHZhbHVlID09IG51bGwgfHwgKHR5cGUgIT09IFwib2JqZWN0XCIgJiYgdHlwZSAhPT0gXCJmdW5jdGlvblwiKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGlzU3RyaW5nKHZhbHVlOiBhbnkpOiB2YWx1ZSBpcyBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGlzRnVuY3Rpb24odmFsdWU6IGFueSk6IHZhbHVlIGlzIEZ1bmN0aW9uIHtcclxuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGlzQ29uc3RydWN0b3IodmFsdWU6IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIiAmJiB2YWx1ZS5wcm90b3R5cGUgJiYgdmFsdWUucHJvdG90eXBlLmNvbnN0cnVjdG9yKSA9PT0gdmFsdWUgJiYgdmFsdWUubmFtZSAhPT0gXCJPYmplY3RcIjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGlzVHlwZSh2YWx1ZTogYW55KTogdmFsdWUgaXMgVHlwZTxhbnk+IHtcclxuICAgIHJldHVybiBpc0NvbnN0cnVjdG9yKHZhbHVlKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGlzSW50ZXJmYWNlKG9iajogYW55LCBpbnRlckZhY2VPYmplY3Q6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0pOiBib29sZWFuIHtcclxuICAgIGlmICghb2JqIHx8IHR5cGVvZiBvYmogIT09IFwib2JqZWN0XCIgfHwgaXNBcnJheShvYmopIHx8ICFpc09iamVjdChpbnRlckZhY2VPYmplY3QpKSByZXR1cm4gZmFsc2U7XHJcbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoaW50ZXJGYWNlT2JqZWN0KTtcclxuICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcclxuICAgICAgICBsZXQgdHlwZSA9IGludGVyRmFjZU9iamVjdFtrZXldIHx8IFwiXCI7XHJcbiAgICAgICAgaWYgKHR5cGUuc3RhcnRzV2l0aChcIipcIikpIHtcclxuICAgICAgICAgICAgdHlwZSA9IHR5cGUuc3Vic3RyKDEpO1xyXG4gICAgICAgICAgICBpZiAob2JqLmhhc093blByb3BlcnR5KGtleSkgJiYgZ2V0VHlwZShvYmpba2V5XSkgIT09IHR5cGUpIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9IGVsc2UgaWYgKCFvYmouaGFzT3duUHJvcGVydHkoa2V5KSB8fCBnZXRUeXBlKG9ialtrZXldKSAhPT0gdHlwZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRydWU7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiB1Y0ZpcnN0KHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgaWYgKCF2YWx1ZSkgcmV0dXJuIFwiXCI7XHJcbiAgICByZXR1cm4gdmFsdWVbMF0udG9VcHBlckNhc2UoKSArIHZhbHVlLnN1YnN0cigxKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGxjRmlyc3QodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBpZiAoIXZhbHVlKSByZXR1cm4gXCJcIjtcclxuICAgIHJldHVybiB2YWx1ZVswXS50b0xvd2VyQ2FzZSgpICsgdmFsdWUuc3Vic3RyKDEpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaXNPYmplY3RJZChpZDogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdHlwZW9mIGlkID09PSBcInN0cmluZ1wiICYmIGlkLmxlbmd0aCA9PSAyNCAmJiAhaXNOYU4oTnVtYmVyKFwiMHhcIiArIGlkKSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBmaXJzdEl0ZW08VD4odmFsdWU6IFRbXSk6IFQge1xyXG4gICAgcmV0dXJuIHZhbHVlWzBdO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gbGFzdEl0ZW08VD4odmFsdWU6IFRbXSk6IFQge1xyXG4gICAgcmV0dXJuIHZhbHVlW3ZhbHVlLmxlbmd0aCAtIDFdO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gcmVncm91cDxUPih2YWx1ZTogVFtdLCBjb21wYXJhdG9yOiAoYTogVCwgYjogVCkgPT4gYm9vbGVhbik6IEFycmF5PFRbXT4ge1xyXG4gICAgY29uc3QgcmVzdWx0OiBBcnJheTxUW10+ID0gW107XHJcbiAgICBpZiAoIWlzQXJyYXkodmFsdWUpIHx8IHZhbHVlLmxlbmd0aCA9PSAwKSByZXR1cm4gcmVzdWx0O1xyXG4gICAgdmFsdWUgPSBBcnJheS5mcm9tKHZhbHVlKTtcclxuICAgIHJlc3VsdC5wdXNoKFt2YWx1ZS5zaGlmdCgpXSk7XHJcbiAgICB2YWx1ZS5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgIGNvbnN0IGdyb3VwID0gcmVzdWx0LmZpbmQoZyA9PiBnLnNvbWUoYSA9PiBjb21wYXJhdG9yKGEsIGl0ZW0pKSk7XHJcbiAgICAgICAgaWYgKGdyb3VwKSB7XHJcbiAgICAgICAgICAgIGdyb3VwLnB1c2goaXRlbSk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmVzdWx0LnB1c2goW2l0ZW1dKTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHVuaXF1ZUl0ZW1zPFQ+KHZhbHVlOiBUW10pOiBUW10ge1xyXG4gICAgcmV0dXJuIHZhbHVlLmZpbHRlcigodiwgaXgpID0+IHZhbHVlLmluZGV4T2YodikgPT09IGl4KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldFZhbHVlKG9iajogYW55LCBrZXk6IHN0cmluZywgZGVmYXVsdFZhbHVlPzogYW55LCB0cmVlRmFsbGJhY2s6IGJvb2xlYW4gPSBmYWxzZSk6IGFueSB7XHJcbiAgICBrZXkgPSBrZXkgfHwgXCJcIjtcclxuICAgIGNvbnN0IGtleXMgPSBrZXkuc3BsaXQoXCIuXCIpO1xyXG4gICAgbGV0IGN1cktleSA9IFwiXCI7XHJcbiAgICBkbyB7XHJcbiAgICAgICAgY3VyS2V5ICs9IGtleXMuc2hpZnQoKTtcclxuICAgICAgICBpZiAoaXNEZWZpbmVkKG9iaikgJiYgaXNEZWZpbmVkKG9ialtjdXJLZXldKSAmJiAodHlwZW9mIG9ialtjdXJLZXldID09PSBcIm9iamVjdFwiIHx8ICFrZXlzLmxlbmd0aCkpIHtcclxuICAgICAgICAgICAgb2JqID0gb2JqW2N1cktleV07XHJcbiAgICAgICAgICAgIGN1cktleSA9IFwiXCI7XHJcbiAgICAgICAgfSBlbHNlIGlmICgha2V5cy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgZGVmYXVsdFZhbHVlID0gdHlwZW9mIGRlZmF1bHRWYWx1ZSA9PSBcInVuZGVmaW5lZFwiID8ga2V5LnJlcGxhY2UobmV3IFJlZ0V4cChgJHtjdXJLZXl9JGApLCBgeyR7Y3VyS2V5fX1gKSA6IGRlZmF1bHRWYWx1ZTtcclxuICAgICAgICAgICAgb2JqID0gdHJlZUZhbGxiYWNrID8gb2JqIHx8IGRlZmF1bHRWYWx1ZSA6IGRlZmF1bHRWYWx1ZTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjdXJLZXkgKz0gXCIuXCI7XHJcbiAgICAgICAgfVxyXG4gICAgfSB3aGlsZSAoa2V5cy5sZW5ndGgpO1xyXG4gICAgcmV0dXJuIG9iajtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdyb3VwQnk8VD4oaXRlbXM6IFRbXSwgY2I6IChpdGVtOiBUKSA9PiBzdHJpbmcpIHtcclxuICAgIHJldHVybiBpdGVtcy5yZWR1Y2UoKHJlcywgaXRlbSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGdyb3VwID0gY2IoaXRlbSk7XHJcbiAgICAgICAgcmVzW2dyb3VwXSA9IHJlc1tncm91cF0gfHwgW107XHJcbiAgICAgICAgcmVzW2dyb3VwXS5wdXNoKGl0ZW0pO1xyXG4gICAgICAgIHJldHVybiByZXM7XHJcbiAgICB9LCB7fSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0VmFsdWUodmFsdWU6IGFueSwgdHlwZTogc3RyaW5nKTogYW55IHtcclxuICAgIHN3aXRjaCAodHlwZSkge1xyXG4gICAgICAgIGNhc2UgXCJib29sZWFuXCI6XHJcbiAgICAgICAgICAgIHZhbHVlID0gdHlwZW9mIHZhbHVlID09IFwic3RyaW5nXCIgPyB2YWx1ZS50b0xvd2VyQ2FzZSgpIDogdmFsdWU7XHJcbiAgICAgICAgICAgIHJldHVybiAodmFsdWUgPT0gXCJub1wiIHx8IHZhbHVlID09IFwiZmFsc2VcIiB8fCB2YWx1ZSA9PSBcIjBcIikgPyBmYWxzZSA6ICEhdmFsdWU7XHJcbiAgICAgICAgY2FzZSBcIm51bWJlclwiOlxyXG4gICAgICAgICAgICBjb25zdCB2YWwgPSBwYXJzZUZsb2F0KHZhbHVlKTtcclxuICAgICAgICAgICAgcmV0dXJuIGlzTmFOKHZhbCkgPyAwIDogdmFsO1xyXG4gICAgICAgIGNhc2UgXCJhcnJheVwiOlxyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UodmFsdWUpO1xyXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYCR7dmFsdWV9YC5zcGxpdChcIiwgXCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdmFsdWU7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBpbmplY3RTZXJ2aWNlcyhzY2hlbWE6IFNjaGVtYTxhbnk+LCBzZXJ2aWNlczogeyBbcHJvcDogc3RyaW5nXTogSW5qZWN0aW9uVG9rZW48YW55PiB9KSB7XHJcbiAgICBjb25zdCBzZXJ2aWNlTWFwOiB7IFtwcm9wOiBzdHJpbmddOiBhbnkgfSA9IHt9O1xyXG4gICAgT2JqZWN0LmtleXMoc2VydmljZXMpLmZvckVhY2gocHJvcCA9PiB7XHJcbiAgICAgICAgc2NoZW1hXHJcbiAgICAgICAgICAgIC52aXJ0dWFsKHByb3ApXHJcbiAgICAgICAgICAgIC5nZXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZGlDb250YWluZXIgPSBkaUNvbnRhaW5lcnMuYXBwQ29udGFpbmVyO1xyXG4gICAgICAgICAgICAgICAgc2VydmljZU1hcFtwcm9wXSA9IHNlcnZpY2VNYXBbcHJvcF0gfHwgKCFkaUNvbnRhaW5lciA/IHt9IDogZGlDb250YWluZXIucmVzb2x2ZShzZXJ2aWNlc1twcm9wXSkpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHNlcnZpY2VNYXBbcHJvcF07XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBwYWdpbmF0ZTxUIGV4dGVuZHMgVHlwZTxhbnk+LCBVID0gSW5mZXJHZW5lcmljPFQ+Pihtb2RlbDogUmV0dXJuTW9kZWxUeXBlPFQ+LCB3aGVyZTogRmlsdGVyUXVlcnk8RG9jdW1lbnRUeXBlPFU+PiwgcGFyYW1zOiBJUGFnaW5hdGlvblBhcmFtcyk6IFByb21pc2U8SVBhZ2luYXRpb25CYXNlPERvY3VtZW50VHlwZTxVPj4+IHtcclxuICAgIHJldHVybiBtb2RlbC5jb3VudERvY3VtZW50cyh3aGVyZSkudGhlbihjb3VudCA9PiB7XHJcbiAgICAgICAgbGV0IHF1ZXJ5OiBRdWVyeTxhbnksIGFueT4gPSBtb2RlbC5maW5kKHdoZXJlKTtcclxuICAgICAgICBpZiAoaXNTdHJpbmcocGFyYW1zLnNvcnQpKSB7XHJcbiAgICAgICAgICAgIHF1ZXJ5ID0gcXVlcnkuc29ydChwYXJhbXMuc29ydCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChpc0FycmF5KHBhcmFtcy5wb3B1bGF0ZSkpIHtcclxuICAgICAgICAgICAgcGFyYW1zLnBvcHVsYXRlLmZvckVhY2goZmllbGQgPT4ge1xyXG4gICAgICAgICAgICAgICAgcXVlcnkgPSBxdWVyeS5wb3B1bGF0ZShmaWVsZCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gKHBhcmFtcy5saW1pdCA+IDAgPyBxdWVyeS5za2lwKHBhcmFtcy5wYWdlICogcGFyYW1zLmxpbWl0KS5saW1pdChwYXJhbXMubGltaXQpIDogcXVlcnkpLnRoZW4oaXRlbXMgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBtZXRhID0ge3RvdGFsOiBjb3VudH07XHJcbiAgICAgICAgICAgIHJldHVybiB7Y291bnQsIGl0ZW1zLCBtZXRhfTtcclxuICAgICAgICB9KTtcclxuICAgIH0pO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gbG9va3VwU3RhZ2VzKGZyb206IHN0cmluZywgbG9jYWxGaWVsZDogc3RyaW5nLCBhczogc3RyaW5nID0gbnVsbCwgZm9yZWlnbkZpZWxkOiBzdHJpbmcgPSBcIl9pZFwiLCBzaG91bGRVbndpbmQ6IGJvb2xlYW4gPSB0cnVlKTogW1BpcGVsaW5lU3RhZ2UuTG9va3VwLCBQaXBlbGluZVN0YWdlLlVud2luZF0ge1xyXG4gICAgYXMgPSBhcyB8fCBsb2NhbEZpZWxkLnJlcGxhY2UoXCJJZFwiLCBcIlwiKTtcclxuICAgIGNvbnN0IHN0YWdlczogW1BpcGVsaW5lU3RhZ2UuTG9va3VwLCBQaXBlbGluZVN0YWdlLlVud2luZF0gPSBbXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICAkbG9va3VwOiB7XHJcbiAgICAgICAgICAgICAgICBmcm9tLFxyXG4gICAgICAgICAgICAgICAgbG9jYWxGaWVsZCxcclxuICAgICAgICAgICAgICAgIGZvcmVpZ25GaWVsZCxcclxuICAgICAgICAgICAgICAgIGFzXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgJHVud2luZDoge1xyXG4gICAgICAgICAgICAgICAgcGF0aDogYCQke2FzfWAsXHJcbiAgICAgICAgICAgICAgICBwcmVzZXJ2ZU51bGxBbmRFbXB0eUFycmF5czogdHJ1ZVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgXTtcclxuICAgIGlmICghc2hvdWxkVW53aW5kKSB7XHJcbiAgICAgICAgc3RhZ2VzLnNwbGljZSgxLCAxKTtcclxuICAgIH1cclxuICAgIHJldHVybiBzdGFnZXM7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBsZXRzTG9va3VwU3RhZ2UoZnJvbTogc3RyaW5nLCBwaXBlbGluZTogRXhjbHVkZTxQaXBlbGluZVN0YWdlLCBQaXBlbGluZVN0YWdlLk1lcmdlIHwgUGlwZWxpbmVTdGFnZS5PdXQgfCBQaXBlbGluZVN0YWdlLlNlYXJjaD5bXSwgYXM6IHN0cmluZyA9IG51bGwsIGxldEZpZWxkczogYW55ID0gbnVsbCk6IFBpcGVsaW5lU3RhZ2UuTG9va3VwIHtcclxuICAgIGFzID0gYXMgfHwgZnJvbTtcclxuICAgIGxldEZpZWxkcyA9IGxldEZpZWxkcyB8fCB7aWQ6IFwiJF9pZFwifTtcclxuICAgIHJldHVybiB7XHJcbiAgICAgICAgJGxvb2t1cDoge1xyXG4gICAgICAgICAgICBmcm9tLFxyXG4gICAgICAgICAgICBsZXQ6IGxldEZpZWxkcyxcclxuICAgICAgICAgICAgcGlwZWxpbmUsXHJcbiAgICAgICAgICAgIGFzXHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIG1hdGNoU3RhZ2UobWF0Y2g6IEZpbHRlclF1ZXJ5PGFueT4pOiBQaXBlbGluZVN0YWdlLk1hdGNoIHtcclxuICAgIHJldHVybiB7JG1hdGNoOiBtYXRjaH07XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBtYXRjaEZpZWxkKGZpZWxkOiBzdHJpbmcsIGZpbHRlcjogYW55LCB3aGVuOiBib29sZWFuKTogSU1hdGNoRmllbGQge1xyXG4gICAgcmV0dXJuIHtmaWVsZCwgZmlsdGVyLCB3aGVufTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIG1hdGNoRmllbGRTdGFnZXMoLi4uZmllbGRzOiBJTWF0Y2hGaWVsZFtdKTogUmVhZG9ubHlBcnJheTxQaXBlbGluZVN0YWdlLk1hdGNoPiB7XHJcbiAgICBjb25zdCBtYXRjaCA9IHt9O1xyXG4gICAgZmllbGRzLmZvckVhY2goZmllbGQgPT4ge1xyXG4gICAgICAgIGlmIChmaWVsZC53aGVuKSB7XHJcbiAgICAgICAgICAgIG1hdGNoW2ZpZWxkLmZpZWxkXSA9IGZpZWxkLmZpbHRlcjtcclxuICAgICAgICB9XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBPYmplY3Qua2V5cyhtYXRjaCkubGVuZ3RoID4gMCA/IFttYXRjaFN0YWdlKG1hdGNoKV0gOiBbXTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHByb2plY3RTdGFnZShmaWVsZHM6IElQcm9qZWN0T3B0aW9ucyk6IFBpcGVsaW5lU3RhZ2UuUHJvamVjdCB7XHJcbiAgICByZXR1cm4geyRwcm9qZWN0OiBmaWVsZHN9O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gdW53aW5kU3RhZ2UoZmllbGRPck9wdHM6IHN0cmluZyB8IElVbndpbmRPcHRpb25zKTogUGlwZWxpbmVTdGFnZS5VbndpbmQge1xyXG4gICAgcmV0dXJuIHskdW53aW5kOiBmaWVsZE9yT3B0c307XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBoeWRyYXRlUG9wdWxhdGVkPFQgZXh0ZW5kcyBEb2N1bWVudD4obW9kZWxUeXBlOiBNb2RlbDxUPiwganNvbjogYW55KTogVCB7XHJcbiAgICBsZXQgb2JqZWN0ID0gbW9kZWxUeXBlLmh5ZHJhdGUoanNvbik7XHJcblxyXG4gICAgZm9yIChjb25zdCBbcGF0aCwgb2JqXSBvZiBPYmplY3QuZW50cmllcyhtb2RlbFR5cGUuc2NoZW1hLm9iaikpIHtcclxuICAgICAgICBsZXQge3JlZiwgdHlwZX0gPSBvYmogYXMgYW55O1xyXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHR5cGUpICYmIHR5cGUubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICByZWYgPSB0eXBlWzBdLnJlZjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFyZWYpIGNvbnRpbnVlO1xyXG4gICAgICAgIGNvbnN0IHZhbHVlID0gZ2V0TW9uZ29WYWx1ZShwYXRoLCBqc29uKTtcclxuICAgICAgICBjb25zdCBoeWRyYXRlVmFsID0gdmFsID0+IHtcclxuICAgICAgICAgICAgaWYgKHZhbCA9PSBudWxsIHx8IHZhbCBpbnN0YW5jZW9mIFR5cGVzLk9iamVjdElkKSByZXR1cm4gdmFsO1xyXG4gICAgICAgICAgICByZXR1cm4gaHlkcmF0ZVBvcHVsYXRlZChtb2RlbChyZWYpIGFzIGFueSwgdmFsKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xyXG4gICAgICAgICAgICBzZXRNb25nb1ZhbHVlKHBhdGgsIHZhbHVlLm1hcChoeWRyYXRlVmFsKSwgb2JqZWN0KTtcclxuICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNldE1vbmdvVmFsdWUocGF0aCwgaHlkcmF0ZVZhbCh2YWx1ZSksIG9iamVjdCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG9iamVjdDtcclxuXHJcbn1cclxuXHJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwYWdpbmF0ZUFnZ3JlZ2F0aW9uczxUIGV4dGVuZHMgVHlwZTxhbnk+LCBVID0gSW5mZXJHZW5lcmljPFQ+Pihtb2RlbDogUmV0dXJuTW9kZWxUeXBlPFQ+LCBhZ2dyZWdhdGlvbnM6IFBpcGVsaW5lU3RhZ2VbXSwgcGFyYW1zOiBJUGFnaW5hdGlvblBhcmFtcywgbWV0YVByb2plY3Rpb246IGFueSA9IHt9KTogUHJvbWlzZTxJUGFnaW5hdGlvbkJhc2U8RG9jdW1lbnRUeXBlPFU+Pj4ge1xyXG4gICAgY29uc3Qgc29ydEZpZWxkID0gIWlzU3RyaW5nKHBhcmFtcy5zb3J0KSB8fCAhcGFyYW1zLnNvcnQgPyBudWxsIDogKHBhcmFtcy5zb3J0LnN0YXJ0c1dpdGgoXCItXCIpID8gcGFyYW1zLnNvcnQuc3Vic3RyKDEpIDogcGFyYW1zLnNvcnQpO1xyXG4gICAgY29uc3Qgc29ydEFnZ3JlZ2F0aW9uOiBQaXBlbGluZVN0YWdlLlNvcnRbXSA9ICFzb3J0RmllbGQgPyBbXSA6IFt7XHJcbiAgICAgICAgJHNvcnQ6IHtbc29ydEZpZWxkXTogc29ydEZpZWxkID09IHBhcmFtcy5zb3J0ID8gMSA6IC0xfVxyXG4gICAgfV07XHJcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBtb2RlbC5hZ2dyZWdhdGUoW1xyXG4gICAgICAgIC4uLmFnZ3JlZ2F0aW9ucyxcclxuICAgICAgICAuLi5zb3J0QWdncmVnYXRpb24sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICAkZ3JvdXA6IHtcclxuICAgICAgICAgICAgICAgIF9pZDogXCJyZXN1bHRzXCIsXHJcbiAgICAgICAgICAgICAgICByZXN1bHQ6IHskcHVzaDogXCIkJENVUlJFTlRcIn1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICAkcHJvamVjdDoge1xyXG4gICAgICAgICAgICAgICAgX2lkOiAwLFxyXG4gICAgICAgICAgICAgICAgaXRlbXM6IHBhcmFtcy5saW1pdCA+IDAgPyB7JHNsaWNlOiBbXCIkcmVzdWx0XCIsIHBhcmFtcy5wYWdlICogcGFyYW1zLmxpbWl0LCBwYXJhbXMubGltaXRdfSA6IFwiJHJlc3VsdFwiLFxyXG4gICAgICAgICAgICAgICAgY291bnQ6IHskc2l6ZTogXCIkcmVzdWx0XCJ9LFxyXG4gICAgICAgICAgICAgICAgbWV0YToge1xyXG4gICAgICAgICAgICAgICAgICAgIHRvdGFsOiB7JHNpemU6IFwiJHJlc3VsdFwifSxcclxuICAgICAgICAgICAgICAgICAgICAuLi5tZXRhUHJvamVjdGlvblxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgXSk7XHJcbiAgICBjb25zdCBwYWdpbmF0aW9uID0gcmVzdWx0WzBdIGFzIElQYWdpbmF0aW9uQmFzZTxEb2N1bWVudFR5cGU8VT4+O1xyXG4gICAgaWYgKCFwYWdpbmF0aW9uKSB7XHJcbiAgICAgICAgcmV0dXJuIHtpdGVtczogW10sIGNvdW50OiAwLCBtZXRhOiB7dG90YWw6IDB9fTtcclxuICAgIH1cclxuICAgIHBhZ2luYXRpb24uaXRlbXMgPSBwYWdpbmF0aW9uLml0ZW1zLm1hcChpID0+IGh5ZHJhdGVQb3B1bGF0ZWQobW9kZWwsIGkpIGFzIGFueSk7XHJcbiAgICByZXR1cm4gcGFnaW5hdGlvbjtcclxufVxyXG5cclxuY29uc3QgY3JvcEludGVyZmFjZSA9IHtcclxuICAgIHg6IFwibnVtYmVyXCIsXHJcbiAgICB5OiBcIm51bWJlclwiLFxyXG4gICAgdzogXCJudW1iZXJcIixcclxuICAgIGg6IFwibnVtYmVyXCJcclxufTtcclxuXHJcbmZ1bmN0aW9uIHRvQ3JvcFJlZ2lvbihjcm9wSW5mbzogc3RyaW5nIHwgYm9vbGVhbiB8IElBc3NldENyb3BJbmZvKTogUmVnaW9uIHtcclxuICAgIGxldCBjcm9wID0gY3JvcEluZm8gYXMgSUFzc2V0Q3JvcEluZm87XHJcbiAgICBpZiAoaXNTdHJpbmcoY3JvcEluZm8pKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgY3JvcCA9IEpTT04ucGFyc2UoY3JvcEluZm8gYXMgc3RyaW5nKTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGlmICghaXNJbnRlcmZhY2UoY3JvcCwgY3JvcEludGVyZmFjZSkpIHJldHVybiBudWxsO1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICB3aWR0aDogTWF0aC5yb3VuZChjcm9wLncpLFxyXG4gICAgICAgIGhlaWdodDogTWF0aC5yb3VuZChjcm9wLmgpLFxyXG4gICAgICAgIHRvcDogTWF0aC5yb3VuZChjcm9wLnkpLFxyXG4gICAgICAgIGxlZnQ6IE1hdGgucm91bmQoY3JvcC54KVxyXG4gICAgfTtcclxufVxyXG5cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRvSW1hZ2U8VCA9IEJ1ZmZlciB8IFJlYWRhYmxlPihzcmM6IFQsIHBhcmFtcz86IElBc3NldEltYWdlUGFyYW1zLCBtZXRhPzogSUFzc2V0TWV0YSk6IFByb21pc2U8VD4ge1xyXG5cclxuICAgIC8vIERlZmF1bHQgcGFyYW1zIGFuZCBtZXRhXHJcbiAgICBwYXJhbXMgPSBwYXJhbXMgfHwge307XHJcbiAgICBtZXRhID0gbWV0YSB8fCB7fTtcclxuXHJcbiAgICAvLyBHZXQgZGVmYXVsdCBjcm9wIGluZm9cclxuICAgIGNvbnN0IGNyb3AgPSB0b0Nyb3BSZWdpb24obWV0YS5jcm9wKTtcclxuXHJcbiAgICAvLyBSZXR1cm4gdGhlIHNyYyBpZiB0aGVyZSBhcmUgbm8gcGFyYW1zIGFuZCBubyBkZWZhdWx0IGNyb3AgZXhpc3RzXHJcbiAgICBpZiAobWV0YS5leHRlbnNpb24gPT09IFwic3ZnXCIgfHwgKE9iamVjdC5rZXlzKHBhcmFtcykubGVuZ3RoID09IDAgJiYgIWNyb3ApKSB7XHJcbiAgICAgICAgcmV0dXJuIHNyYztcclxuICAgIH1cclxuXHJcbiAgICAvLyBQYXJzZSBwYXJhbXNcclxuICAgIHBhcmFtcy5yb3RhdGlvbiA9IGlzTmFOKHBhcmFtcy5yb3RhdGlvbikgPyAwIDogTWF0aC5yb3VuZChwYXJhbXMucm90YXRpb24gLyA5MCkgKiA5MDtcclxuICAgIHBhcmFtcy5jYW52YXNTY2FsZVggPSBpc05hTihwYXJhbXMuY2FudmFzU2NhbGVYKSA/IDEgOiBOdW1iZXIocGFyYW1zLmNhbnZhc1NjYWxlWCk7XHJcbiAgICBwYXJhbXMuY2FudmFzU2NhbGVZID0gaXNOYU4ocGFyYW1zLmNhbnZhc1NjYWxlWSkgPyAxIDogTnVtYmVyKHBhcmFtcy5jYW52YXNTY2FsZVkpO1xyXG4gICAgcGFyYW1zLnNjYWxlWCA9IGlzTmFOKHBhcmFtcy5zY2FsZVgpID8gMSA6IE51bWJlcihwYXJhbXMuc2NhbGVYKTtcclxuICAgIHBhcmFtcy5zY2FsZVkgPSBpc05hTihwYXJhbXMuc2NhbGVZKSA/IDEgOiBOdW1iZXIocGFyYW1zLnNjYWxlWSk7XHJcbiAgICBwYXJhbXMuY3JvcCA9IGlzQm9vbGVhbihwYXJhbXMuY3JvcCkgPyBwYXJhbXMuY3JvcCA6IHBhcmFtcy5jcm9wID09IFwidHJ1ZVwiO1xyXG5cclxuICAgIGxldCBidWZmZXIgPSBzcmMgaW5zdGFuY2VvZiBSZWFkYWJsZSA/IGF3YWl0IHN0cmVhbVRvQnVmZmVyKHNyYykgOiBzcmMgYXMgYW55O1xyXG4gICAgdHJ5IHtcclxuICAgICAgICAvLyBHZXQgY3JvcCBpbmZvXHJcbiAgICAgICAgY29uc3QgY3JvcEJlZm9yZSA9IHRvQ3JvcFJlZ2lvbihwYXJhbXMuY3JvcEJlZm9yZSB8fCAocGFyYW1zLmNyb3AgPyBtZXRhLmNyb3BCZWZvcmUgOiBudWxsKSk7XHJcbiAgICAgICAgY29uc3QgY3JvcEFmdGVyID0gdG9Dcm9wUmVnaW9uKHBhcmFtcy5jcm9wQWZ0ZXIgfHwgKHBhcmFtcy5jcm9wID8gbWV0YS5jcm9wQWZ0ZXIgOiBudWxsKSk7XHJcbiAgICAgICAgLy8gR2V0IG1ldGFkYXRhXHJcbiAgICAgICAgbGV0IGltZyA9IHNoYXJwKGJ1ZmZlcik7XHJcbiAgICAgICAgbGV0IHt3aWR0aCwgaGVpZ2h0fSA9IGF3YWl0IGltZy5tZXRhZGF0YSgpO1xyXG4gICAgICAgIC8vIENyb3AgYmVmb3JlIHJlc2l6ZVxyXG4gICAgICAgIGlmIChjcm9wQmVmb3JlKSB7XHJcbiAgICAgICAgICAgIHdpZHRoID0gY3JvcEJlZm9yZS53aWR0aDtcclxuICAgICAgICAgICAgaGVpZ2h0ID0gY3JvcEJlZm9yZS5oZWlnaHQ7XHJcbiAgICAgICAgICAgIGltZyA9IGltZy5leHRyYWN0KGNyb3BCZWZvcmUpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoY3JvcCkge1xyXG4gICAgICAgICAgICB3aWR0aCA9IGNyb3Aud2lkdGg7XHJcbiAgICAgICAgICAgIGhlaWdodCA9IGNyb3AuaGVpZ2h0O1xyXG4gICAgICAgICAgICBpbWcgPSBpbWcuZXh0cmFjdChjcm9wKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gUmVzaXplIGNhbnZhc1xyXG4gICAgICAgIGNvbnN0IGNhbnZhc1NjYWxlWCA9IG1ldGE/LmNhbnZhc1NjYWxlWCB8fCAxO1xyXG4gICAgICAgIGNvbnN0IGNhbnZhc1NjYWxlWSA9IG1ldGE/LmNhbnZhc1NjYWxlWSB8fCAxO1xyXG4gICAgICAgIGlmIChwYXJhbXMuY2FudmFzU2NhbGVYICE9PSBjYW52YXNTY2FsZVggfHwgcGFyYW1zLmNhbnZhc1NjYWxlWSAhPT0gY2FudmFzU2NhbGVZKSB7XHJcbiAgICAgICAgICAgIHdpZHRoID0gTWF0aC5yb3VuZCh3aWR0aCAqIHBhcmFtcy5jYW52YXNTY2FsZVgpO1xyXG4gICAgICAgICAgICBoZWlnaHQgPSBNYXRoLnJvdW5kKGhlaWdodCAqIHBhcmFtcy5jYW52YXNTY2FsZVkpO1xyXG4gICAgICAgICAgICBpbWcgPSBpbWcucmVzaXplKHt3aWR0aCwgaGVpZ2h0LCBiYWNrZ3JvdW5kOiBcIiMwMDAwMDAwMFwiLCBmaXQ6IFwiY29udGFpblwifSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIFJlc2l6ZSBpbWFnZVxyXG4gICAgICAgIGlmIChwYXJhbXMuc2NhbGVYICE9PSAxIHx8IHBhcmFtcy5zY2FsZVkgIT09IDEpIHtcclxuICAgICAgICAgICAgd2lkdGggPSBNYXRoLnJvdW5kKHdpZHRoICogcGFyYW1zLnNjYWxlWCk7XHJcbiAgICAgICAgICAgIGhlaWdodCA9IE1hdGgucm91bmQoaGVpZ2h0ICogcGFyYW1zLnNjYWxlWSk7XHJcbiAgICAgICAgICAgIGltZyA9IGltZy5yZXNpemUoe3dpZHRoLCBoZWlnaHQsIGJhY2tncm91bmQ6IFwiIzAwMDAwMDAwXCIsIGZpdDogXCJmaWxsXCJ9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gQ3JvcCBhZnRlciByZXNpemVcclxuICAgICAgICBpZiAoY3JvcEFmdGVyKSB7XHJcbiAgICAgICAgICAgIGltZyA9IGltZy5leHRyYWN0KGNyb3BBZnRlcik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIFJvdGF0ZVxyXG4gICAgICAgIGlmIChwYXJhbXMucm90YXRpb24gIT09IDApIHtcclxuICAgICAgICAgICAgYnVmZmVyID0gYXdhaXQgaW1nLnRvQnVmZmVyKCk7XHJcbiAgICAgICAgICAgIGltZyA9IHNoYXJwKGJ1ZmZlcikucm90YXRlKHBhcmFtcy5yb3RhdGlvbik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJ1ZmZlciA9IGF3YWl0IGltZy50b0J1ZmZlcigpO1xyXG4gICAgICAgIHNyYyA9IHNyYyBpbnN0YW5jZW9mIFJlYWRhYmxlID8gYnVmZmVyVG9TdHJlYW0oYnVmZmVyKSA6IGJ1ZmZlcjtcclxuICAgICAgICByZXR1cm4gc3JjO1xyXG4gICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiSW1hZ2UgY29udmVyc2lvbiBlcnJvclwiLCBlKTtcclxuICAgICAgICBzcmMgPSBzcmMgaW5zdGFuY2VvZiBSZWFkYWJsZSA/IGJ1ZmZlclRvU3RyZWFtKGJ1ZmZlcikgOiBidWZmZXI7XHJcbiAgICAgICAgcmV0dXJuIHNyYztcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGJ1ZmZlclRvU3RyZWFtKGJ1ZmZlcjogQnVmZmVyKTogUmVhZGFibGUge1xyXG4gICAgY29uc3QgcmVhZFN0cmVhbSA9IG5ldyBQYXNzVGhyb3VnaCgpO1xyXG4gICAgcmVhZFN0cmVhbS5lbmQoYnVmZmVyKTtcclxuICAgIHJldHVybiByZWFkU3RyZWFtXHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBzdHJlYW1Ub0J1ZmZlcihzdHJlYW06IFJlYWRhYmxlKTogUHJvbWlzZTxCdWZmZXI+IHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZTxCdWZmZXI+KChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICBjb25zdCBjb25jYXQgPSBbXTtcclxuICAgICAgICBzdHJlYW0ub24oXCJkYXRhXCIsIGRhdGEgPT4ge1xyXG4gICAgICAgICAgICBjb25jYXQucHVzaChkYXRhKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICBzdHJlYW0ub24oXCJlcnJvclwiLCByZWplY3QpO1xyXG4gICAgICAgIHN0cmVhbS5vbihcImVuZFwiLCAoKSA9PiByZXNvbHZlKEJ1ZmZlci5jb25jYXQoY29uY2F0KSkpO1xyXG4gICAgfSlcclxufVxyXG5cclxuY2xhc3MgUmVhZGFibGVTdHJlYW1DbG9uZSBleHRlbmRzIFJlYWRhYmxlIHtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihyZWFkYWJsZVN0cmVhbTogUmVhZGFibGUsIG9wdHM/OiBSZWFkYWJsZU9wdGlvbnMpIHtcclxuICAgICAgICBzdXBlcihvcHRzKTtcclxuICAgICAgICByZWFkYWJsZVN0cmVhbT8ub24oXCJkYXRhXCIsIGNodW5rID0+IHtcclxuICAgICAgICAgICAgdGhpcy5wdXNoKGNodW5rKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICByZWFkYWJsZVN0cmVhbT8ub24oXCJlbmRcIiwgKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnB1c2gobnVsbCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmVhZGFibGVTdHJlYW0/Lm9uKFwiZXJyb3JcIiwgZXJyID0+IHtcclxuICAgICAgICAgICAgdGhpcy5lbWl0KFwiZXJyb3JcIiwgZXJyKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBfcmVhZChzaXplOiBudW1iZXIpIHtcclxuXHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjb3B5U3RyZWFtKHN0cmVhbTogUmVhZGFibGUsIG9wdHM/OiBSZWFkYWJsZU9wdGlvbnMpOiBSZWFkYWJsZSB7XHJcbiAgICByZXR1cm4gbmV3IFJlYWRhYmxlU3RyZWFtQ2xvbmUoc3RyZWFtLCBvcHRzKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIG1rZGlyUmVjdXJzaXZlKHBhdGg6IHN0cmluZywgbW9kZTogbnVtYmVyID0gbnVsbCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICBta2RpcihwYXRoLCB7bW9kZTogbW9kZSB8fCAwbzc3NywgcmVjdXJzaXZlOiB0cnVlfSwgZXJyID0+IHtcclxuICAgICAgICAgICAgaWYgKGVycikge1xyXG4gICAgICAgICAgICAgICAgcmVqZWN0KGVycik7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBkZWxldGVGaWxlKHBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICB1bmxpbmsocGF0aCwgZXJyID0+IHtcclxuICAgICAgICAgICAgaWYgKGVycikge1xyXG4gICAgICAgICAgICAgICAgcmVqZWN0KGVycik7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiByZWFkRmlsZShwYXRoOiBzdHJpbmcpOiBQcm9taXNlPEJ1ZmZlcj4ge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPEJ1ZmZlcj4oKHJlcywgcmVqKSA9PiB7XHJcbiAgICAgICAgZnNSZWFkRmlsZShwYXRoLCAoZXJyLCBkYXRhKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChlcnIpIHtcclxuICAgICAgICAgICAgICAgIHJlaihlcnIpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJlcyhkYXRhKTtcclxuICAgICAgICB9KTtcclxuICAgIH0pO1xyXG59XHJcblxyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVhZEFuZERlbGV0ZUZpbGUocGF0aDogc3RyaW5nLCB0aW1lb3V0OiBudW1iZXIgPSA1MDAwKTogUHJvbWlzZTxCdWZmZXI+IHtcclxuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZWFkRmlsZShwYXRoKTtcclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIHVubGluayhwYXRoLCAoKSA9PiB7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9LCB0aW1lb3V0KTtcclxuICAgIHJldHVybiBkYXRhO1xyXG59XHJcblxyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd3JpdGVGaWxlKHBhdGg6IHN0cmluZywgZGF0YTogQnVmZmVyKTogUHJvbWlzZTxCdWZmZXI+IHtcclxuICAgIGF3YWl0IG1rZGlyUmVjdXJzaXZlKGRpcm5hbWUocGF0aCkpO1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPEJ1ZmZlcj4oKHJlcywgcmVqKSA9PiB7XHJcbiAgICAgICAgZnNXcml0ZUZpbGUocGF0aCwgZGF0YSwgZXJyID0+IHtcclxuICAgICAgICAgICAgaWYgKGVycikge1xyXG4gICAgICAgICAgICAgICAgcmVqKGVycik7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmVzKGRhdGEpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiB2YWx1ZVRvUHJvbWlzZSh2YWx1ZTogYW55KTogUHJvbWlzZTxhbnk+IHtcclxuICAgIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFByb21pc2UgPyB2YWx1ZSA6IFByb21pc2UucmVzb2x2ZSh2YWx1ZSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBwcm9taXNlVGltZW91dCh0aW1lb3V0OiBudW1iZXIgPSAxMDAwLCBlcnJvcjogYm9vbGVhbiA9IGZhbHNlKTogUHJvbWlzZTxzdHJpbmc+IHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZTxhbnk+KChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgaWYgKGVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICByZWplY3QoYFRpbWVvdXQgZXhjZWVkZWQ6ICR7dGltZW91dH1tc2ApO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJlc29sdmUoYFRpbWVvdXQ6ICR7dGltZW91dH1tc2ApO1xyXG4gICAgICAgIH0sIHRpbWVvdXQpO1xyXG4gICAgfSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRDb25zdHJ1Y3Rvck5hbWUodHlwZTogVHlwZTxhbnk+KTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0eXBlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvci5uYW1lO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0RnVuY3Rpb25QYXJhbXMoZnVuYzogRnVuY3Rpb24pOiBzdHJpbmdbXSB7XHJcbiAgICAvLyBSZW1vdmUgY29tbWVudHMgb2YgdGhlIGZvcm0gLyogLi4uICovXHJcbiAgICAvLyBSZW1vdmluZyBjb21tZW50cyBvZiB0aGUgZm9ybSAvL1xyXG4gICAgLy8gUmVtb3ZlIGJvZHkgb2YgdGhlIGZ1bmN0aW9uIHsgLi4uIH1cclxuICAgIC8vIHJlbW92aW5nIFwiPT5cIiBpZiBmdW5jIGlzIGFycm93IGZ1bmN0aW9uXHJcbiAgICBjb25zdCBzdHIgPSBmdW5jLnRvU3RyaW5nKClcclxuICAgICAgICAucmVwbGFjZSgvXFwvXFwqW1xcc1xcU10qP1xcKlxcLy9nLCBcIlwiKVxyXG4gICAgICAgIC5yZXBsYWNlKC9cXC9cXC8oLikqL2csIFwiXCIpXHJcbiAgICAgICAgLnJlcGxhY2UoL3tbXFxzXFxTXSp9LywgXCJcIilcclxuICAgICAgICAucmVwbGFjZSgvPT4vZywgXCJcIilcclxuICAgICAgICAudHJpbSgpO1xyXG5cclxuICAgIC8vIFN0YXJ0IHBhcmFtZXRlciBuYW1lcyBhZnRlciBmaXJzdCBcIihcIlxyXG4gICAgY29uc3Qgc3RhcnQgPSBzdHIuaW5kZXhPZihcIihcIikgKyAxO1xyXG5cclxuICAgIC8vIEVuZCBwYXJhbWV0ZXIgbmFtZXMgaXMganVzdCBiZWZvcmUgbGFzdCBcIilcIlxyXG4gICAgY29uc3QgZW5kID0gc3RyLmxlbmd0aCAtIDE7XHJcbiAgICBjb25zdCByZXN1bHQgPSBzdHIuc3Vic3RyaW5nKHN0YXJ0LCBlbmQpLnNwbGl0KFwiLCBcIik7XHJcbiAgICBjb25zdCBwYXJhbXMgPSBbXTtcclxuXHJcbiAgICByZXN1bHQuZm9yRWFjaChlbGVtZW50ID0+IHtcclxuXHJcbiAgICAgICAgLy8gUmVtb3ZpbmcgYW55IGRlZmF1bHQgdmFsdWVcclxuICAgICAgICBlbGVtZW50ID0gZWxlbWVudC5yZXBsYWNlKC89W1xcc1xcU10qL2csIFwiXCIpLnRyaW0oKTtcclxuXHJcbiAgICAgICAgaWYgKGVsZW1lbnQubGVuZ3RoID4gMClcclxuICAgICAgICAgICAgcGFyYW1zLnB1c2goZWxlbWVudCk7XHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gcGFyYW1zO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gUmVzb2x2ZUVudGl0eTxUIGV4dGVuZHMgVHlwZTxhbnk+LCBVID0gSW5mZXJHZW5lcmljPFQ+Pihtb2RlbDogUmV0dXJuTW9kZWxUeXBlPFQ+LCBleHRyYUNoZWNrPzogKHF1ZXJ5OiBRdWVyeTxEb2N1bWVudFR5cGU8VT4sIGFueT4sIGFjdGlvbjogQWN0aW9uKSA9PiBQcm9taXNlPERvY3VtZW50VHlwZTxVPj4pOiBQYXJhbWV0ZXJEZWNvcmF0b3Ige1xyXG4gICAgY29uc3QgbW9kZWxOYW1lID0gbW9kZWwubW9kZWxOYW1lO1xyXG4gICAgY29uc3QgcGFyYW1OYW1lID0gbW9kZWxOYW1lLnRvTG93ZXJDYXNlKCk7XHJcbiAgICByZXR1cm4gY3JlYXRlUGFyYW1EZWNvcmF0b3Ioe1xyXG4gICAgICAgIHJlcXVpcmVkOiBmYWxzZSxcclxuICAgICAgICB2YWx1ZTogYXN5bmMgYWN0aW9uID0+IHtcclxuICAgICAgICAgICAgY29uc3QgcmVxID0gYWN0aW9uLnJlcXVlc3QgYXMgSVJlcXVlc3Q7XHJcbiAgICAgICAgICAgIGNvbnN0IHRva2VuID0gcmVxLmhlYWRlcihgeC0ke3BhcmFtTmFtZX0tdG9rZW5gKTtcclxuICAgICAgICAgICAgY29uc3QgaWQgPSByZXEucGFyYW1zW2Ake3BhcmFtTmFtZX1JZGBdIGFzIHN0cmluZztcclxuICAgICAgICAgICAgaWYgKCFpZCAmJiAhdG9rZW4pIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXJyb3IoYCR7bW9kZWxOYW1lfSBpZCBvciB0b2tlbiBzaG91bGQgYmUgZGVmaW5lZCFgKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zdCBxdWVyeSA9ICF0b2tlblxyXG4gICAgICAgICAgICAgICAgPyBtb2RlbC5maW5kQnlJZChpZClcclxuICAgICAgICAgICAgICAgIDogbW9kZWwuZmluZE9uZSh7dG9rZW59IGFzIGFueSk7XHJcbiAgICAgICAgICAgIGxldCBkb2M6IERvY3VtZW50ID0gbnVsbDtcclxuICAgICAgICAgICAgaWYgKGlzRnVuY3Rpb24oZXh0cmFDaGVjaykpIHtcclxuICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZG9jID0gYXdhaXQgdmFsdWVUb1Byb21pc2UoZXh0cmFDaGVjayhxdWVyeSwgYWN0aW9uKSk7XHJcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFcnJvcihgJHttb2RlbE5hbWV9IGNoZWNrIGVycm9yOiAke2UubWVzc2FnZSB8fCBlfWApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgZG9jID0gYXdhaXQgcXVlcnk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKCFkb2MpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBIdHRwRXJyb3IoNDA0LCAhdG9rZW5cclxuICAgICAgICAgICAgICAgICAgICA/IGAke21vZGVsTmFtZX0gY291bGQgbm90IGJlIGZvdW5kIHdpdGggaWQ6ICR7aWR9YFxyXG4gICAgICAgICAgICAgICAgICAgIDogYCR7bW9kZWxOYW1lfSBjb3VsZCBub3QgYmUgZm91bmQgd2l0aCB0b2tlbjogJHt0b2tlbn1gKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBhY3Rpb24ucmVxdWVzdFtwYXJhbU5hbWVdID0gZG9jO1xyXG4gICAgICAgICAgICByZXR1cm4gZG9jO1xyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0RmlsZU5hbWUocGF0aDogc3RyaW5nLCB3aXRoRXh0ZW5zaW9uOiBib29sZWFuID0gZmFsc2UpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgbmFtZSA9IGJhc2VuYW1lKHBhdGggfHwgXCJcIik7XHJcbiAgICByZXR1cm4gd2l0aEV4dGVuc2lvbiA/IG5hbWUgOiBuYW1lLnNwbGl0KFwiLlwiKS5zbGljZSgwLCAtMSkuam9pbihcIi5cIik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRFeHRlbnNpb24ocGF0aDogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IG5hbWUgPSBiYXNlbmFtZShwYXRoIHx8IFwiXCIpO1xyXG4gICAgcmV0dXJuIG5hbWUuc3BsaXQoXCIuXCIpLnBvcCgpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaWRUb1N0cmluZyh2YWx1ZTogYW55KTogYW55IHtcclxuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xyXG4gICAgICAgIHJldHVybiB2YWx1ZS5tYXAoaWRUb1N0cmluZyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBPYmplY3RJZCB8fCB2YWx1ZSBpbnN0YW5jZW9mIFR5cGVzLk9iamVjdElkXHJcbiAgICAgICAgPyB2YWx1ZS50b0hleFN0cmluZygpXHJcbiAgICAgICAgOiAoaXNTdHJpbmcodmFsdWUpID8gdmFsdWUgOiB2YWx1ZSB8fCBudWxsKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVRyYW5zZm9ybWVyKHRyYW5zZm9ybT86IChkb2M6IERvY3VtZW50LCByZXQ6IGFueSwgb3B0aW9ucz86IGFueSkgPT4gYW55KSB7XHJcbiAgICByZXR1cm4gKGRvYzogRG9jdW1lbnQsIHJldDogYW55LCBvcHRpb25zPzogYW55KSA9PiB7XHJcbiAgICAgICAgcmV0LmlkID0gaWRUb1N0cmluZyhyZXQuaWQpIHx8IHJldC5pZDtcclxuICAgICAgICBpZiAoZG9jLl9pZCkge1xyXG4gICAgICAgICAgICByZXQuX2lkID0gaWRUb1N0cmluZyhkb2MuX2lkKTtcclxuICAgICAgICAgICAgcmV0LmlkID0gcmV0LmlkIHx8IHJldC5faWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGRlbGV0ZSByZXQuX192O1xyXG4gICAgICAgIHJldHVybiBpc0Z1bmN0aW9uKHRyYW5zZm9ybSkgPyB0cmFuc2Zvcm0oZG9jLCByZXQsIG9wdGlvbnMpIHx8IHJldCA6IHJldDtcclxuICAgIH07XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBicm9hZGNhc3Qoc29ja2V0U2VydmVyOiBTZXJ2ZXIsIGNiOiAoY2xpZW50OiBJQ2xpZW50U29ja2V0KSA9PiB2b2lkKTogdm9pZCB7XHJcbiAgICBBcnJheS5mcm9tKE9iamVjdC52YWx1ZXMoc29ja2V0U2VydmVyLnNvY2tldHMuc29ja2V0cykpLmZvckVhY2goY2IpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gcmFuZChtaW46IG51bWJlciwgbWF4OiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIE1hdGgucm91bmQocmFuZG9tKG1pbiwgbWF4KSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiByYW5kb20obWluOiBudW1iZXIsIG1heDogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIHJldHVybiBtaW4gKyBNYXRoLnJhbmRvbSgpICogKG1heCAtIG1pbik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBtdWx0aVN1YnNjcmlwdGlvbiguLi5zdWJzY3JpcHRpb25zOiBTdWJzY3JpcHRpb25bXSk6IFN1YnNjcmlwdGlvbiB7XHJcbiAgICByZXR1cm4gbmV3IFN1YnNjcmlwdGlvbigoKSA9PiB7XHJcbiAgICAgICAgc3Vic2NyaXB0aW9ucy5mb3JFYWNoKHMgPT4ge1xyXG4gICAgICAgICAgICBzLnVuc3Vic2NyaWJlKCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIG9ic2VydmFibGVGcm9tRnVuY3Rpb24oY2FsbGJhY2tGdW5jOiAoKSA9PiBhbnkpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgbGV0IHN1YmplY3Q6IGFueTtcclxuICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZTxhbnk+KChzdWJzY3JpYmVyKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzdWJqZWN0KSB7XHJcbiAgICAgICAgICAgIHN1YmplY3QgPSBuZXcgU3ViamVjdCgpO1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgc3ViamVjdCA9IGZyb20oY2FsbGJhY2tGdW5jKCkpO1xyXG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgICAgICAgICAgIGlmIChjYW5SZXBvcnRFcnJvcihzdWJqZWN0KSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHN1YmplY3QuZXJyb3IoZXJyKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKGVycik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHN1YmplY3Quc3Vic2NyaWJlKHN1YnNjcmliZXIpO1xyXG4gICAgfSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBwYWRMZWZ0KHZhbHVlOiBhbnksIGNvdW50OiBudW1iZXIgPSAzLCBwYWRXaXRoOiBzdHJpbmcgPSBcIjBcIik6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gYCR7dmFsdWV9YC5wYWRTdGFydChjb3VudCwgcGFkV2l0aCk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBwYWRSaWdodCh2YWx1ZTogYW55LCBjb3VudDogbnVtYmVyID0gMywgcGFkV2l0aDogc3RyaW5nID0gXCIwXCIpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIGAke3ZhbHVlfWAucGFkRW5kKGNvdW50LCBwYWRXaXRoKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGRlbGV0ZUZyb21CdWNrZXQoYnVja2V0OiBHcmlkRlNCdWNrZXQsIGZpbGVJZDogT2JqZWN0SWQpOiBQcm9taXNlPHN0cmluZz4ge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPHN0cmluZz4oKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICBidWNrZXQuZGVsZXRlKGZpbGVJZCwgZXJyb3IgPT4ge1xyXG4gICAgICAgICAgICBsZXQgZXJyID0gZXJyb3IgYXMgYW55O1xyXG4gICAgICAgICAgICBpZiAoZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgIGVyciA9IGVycm9yLm1lc3NhZ2UgfHwgZXJyb3IgfHwgXCJcIjtcclxuICAgICAgICAgICAgICAgIGlmICghaXNTdHJpbmcoZXJyKSB8fCAhZXJyLnN0YXJ0c1dpdGgoXCJGaWxlTm90Rm91bmRcIikpIHtcclxuICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmVzb2x2ZShmaWxlSWQudG9IZXhTdHJpbmcoKSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9KSk7XHJcbn1cclxuXHJcbmNvbnN0IGRlZmF1bHRQcmVkaWNhdGU6IEZpbHRlclByZWRpY2F0ZSA9ICgpID0+IHRydWU7XHJcblxyXG5mdW5jdGlvbiBjb3B5UmVjdXJzaXZlKHRhcmdldDogYW55LCBzb3VyY2U6IGFueSwgcHJlZGljYXRlPzogRmlsdGVyUHJlZGljYXRlKTogYW55IHtcclxuICAgIHByZWRpY2F0ZSA9IHByZWRpY2F0ZSB8fCBkZWZhdWx0UHJlZGljYXRlO1xyXG4gICAgaWYgKGlzUHJpbWl0aXZlKHNvdXJjZSkgfHwgaXNEYXRlKHNvdXJjZSkgfHwgaXNGdW5jdGlvbihzb3VyY2UpKSByZXR1cm4gc291cmNlO1xyXG4gICAgaWYgKGlzQXJyYXkoc291cmNlKSkge1xyXG4gICAgICAgIHRhcmdldCA9IGlzQXJyYXkodGFyZ2V0KSA/IEFycmF5LmZyb20odGFyZ2V0KSA6IFtdO1xyXG4gICAgICAgIHNvdXJjZS5mb3JFYWNoKChpdGVtLCBpbmRleCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoIXByZWRpY2F0ZShpdGVtLCBpbmRleCwgdGFyZ2V0LCBzb3VyY2UpKSByZXR1cm47XHJcbiAgICAgICAgICAgIGlmICh0YXJnZXQubGVuZ3RoID4gaW5kZXgpXHJcbiAgICAgICAgICAgICAgICB0YXJnZXRbaW5kZXhdID0gY29weVJlY3Vyc2l2ZSh0YXJnZXRbaW5kZXhdLCBpdGVtLCBwcmVkaWNhdGUpO1xyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICB0YXJnZXQucHVzaChjb3B5UmVjdXJzaXZlKG51bGwsIGl0ZW0sIHByZWRpY2F0ZSkpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiB0YXJnZXQ7XHJcbiAgICB9XHJcbiAgICBjb25zdCBzaG91bGRDb3B5ID0gaXNGdW5jdGlvbihzb3VyY2UuX19zaG91bGRDb3B5KSA/IHNvdXJjZS5fX3Nob3VsZENvcHkgOiAoKSA9PiB0cnVlO1xyXG4gICAgaWYgKGlzQ29uc3RydWN0b3Ioc291cmNlLmNvbnN0cnVjdG9yKSkge1xyXG4gICAgICAgIGlmIChzb3VyY2UuX19zaG91bGRDb3B5ID09PSBmYWxzZSkgcmV0dXJuIHNvdXJjZTtcclxuICAgICAgICBpZiAoIXRhcmdldCkge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgdGFyZ2V0ID0gbmV3IHNvdXJjZS5jb25zdHJ1Y3RvcigpO1xyXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBwcm90byA9IHNvdXJjZS5jb25zdHJ1Y3Rvci5wcm90b3R5cGUgfHwgc291cmNlLnByb3RvdHlwZTtcclxuICAgICAgICAgICAgICAgIHRhcmdldCA9IE9iamVjdC5jcmVhdGUocHJvdG8pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICB0YXJnZXQgPSBPYmplY3QuYXNzaWduKHt9LCB0YXJnZXQgfHwge30pO1xyXG4gICAgfVxyXG4gICAgLy8gQ29weSBtYXAgZW50cmllc1xyXG4gICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIE1hcCkge1xyXG4gICAgICAgIGlmIChzb3VyY2UgaW5zdGFuY2VvZiBNYXApIHtcclxuICAgICAgICAgICAgZm9yIChsZXQgW2tleSwgdmFsdWVdIG9mIHNvdXJjZS5lbnRyaWVzKCkpIHtcclxuICAgICAgICAgICAgICAgIGlmICghcHJlZGljYXRlKHZhbHVlLCBrZXksIHRhcmdldCwgc291cmNlKSkgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICB0YXJnZXQuc2V0KGtleSwgIXNob3VsZENvcHkoa2V5LCB2YWx1ZSkgPyB2YWx1ZSA6IGNvcHlSZWN1cnNpdmUodGFyZ2V0LmdldChrZXkpLCB2YWx1ZSwgcHJlZGljYXRlKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRhcmdldDtcclxuICAgIH1cclxuXHJcbiAgICAvLyBDb3B5IG9iamVjdCBtZW1iZXJzXHJcbiAgICBsZXQga2V5cyA9IE9iamVjdC5rZXlzKHNvdXJjZSk7XHJcbiAgICB0YXJnZXQgPSBrZXlzLnJlZHVjZSgocmVzdWx0LCBrZXkpID0+IHtcclxuICAgICAgICBpZiAoIXByZWRpY2F0ZShzb3VyY2Vba2V5XSwga2V5LCByZXN1bHQsIHNvdXJjZSkpIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgcmVzdWx0W2tleV0gPSAhc2hvdWxkQ29weShrZXksIHNvdXJjZVtrZXldKSA/IHNvdXJjZVtrZXldIDogY29weVJlY3Vyc2l2ZShyZXN1bHRba2V5XSwgc291cmNlW2tleV0sIHByZWRpY2F0ZSk7XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH0sIHRhcmdldCk7XHJcblxyXG4gICAgLy8gQ29weSBvYmplY3QgcHJvcGVydGllc1xyXG4gICAgY29uc3QgZGVzY3JpcHRvcnMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhzb3VyY2UpO1xyXG4gICAga2V5cyA9IE9iamVjdC5rZXlzKGRlc2NyaXB0b3JzKS5maWx0ZXIoayA9PiBrZXlzLmluZGV4T2YoaykgPCAwKTtcclxuICAgIGtleXMuZm9yRWFjaChrZXkgPT4ge1xyXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgZGVzY3JpcHRvcnNba2V5XSk7XHJcbiAgICB9KTtcclxuICAgIHJldHVybiB0YXJnZXQ7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBmaWx0ZXI8VD4ob2JqOiBULCBwcmVkaWNhdGU6IEZpbHRlclByZWRpY2F0ZSk6IFBhcnRpYWw8VD4ge1xyXG4gICAgcmV0dXJuIGNvcHlSZWN1cnNpdmUobnVsbCwgb2JqLCBwcmVkaWNhdGUpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY29weTxUPihvYmo6IFQpOiBUIHtcclxuICAgIHJldHVybiBjb3B5UmVjdXJzaXZlKG51bGwsIG9iaik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBhc3NpZ248VD4odGFyZ2V0OiBULCBzb3VyY2U6IGFueSwgcHJlZGljYXRlPzogRmlsdGVyUHJlZGljYXRlKTogVCB7XHJcbiAgICByZXR1cm4gY29weVJlY3Vyc2l2ZSh0YXJnZXQsIHNvdXJjZSwgcHJlZGljYXRlKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIG1kNShkYXRhOiBhbnkpOiBzdHJpbmcge1xyXG4gICAgaWYgKGlzT2JqZWN0KGRhdGEpKSB7XHJcbiAgICAgICAgZGF0YSA9IEpTT04uc3RyaW5naWZ5KGRhdGEpO1xyXG4gICAgfVxyXG4gICAgaWYgKCFpc1N0cmluZyhkYXRhKSkge1xyXG4gICAgICAgIHRocm93IGBDYW4ndCBtZDUgb3RoZXIgdGhhdCByYXcgb2JqZWN0IG9yIHN0cmluZ2A7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gY3JlYXRlSGFzaChcIm1kNVwiKS51cGRhdGUoZGF0YSkuZGlnZXN0KFwiaGV4XCIpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gcnVuQ29tbWFuZChzY3JpcHRQYXRoOiBzdHJpbmcsIGV4cGVjdGVkQ29kZTogbnVtYmVyID0gMCk6IFByb21pc2U8c3RyaW5nPiB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGNwID0gZXhlY0NoaWxkUHJvY2VzcyhzY3JpcHRQYXRoLCAoZXJyb3IsIHN0ZG91dCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoZXJyb3IgJiYgZXhwZWN0ZWRDb2RlICE9PSBlcnJvci5jb2RlKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlcnJvcik7XHJcbiAgICAgICAgICAgICAgICByZWplY3QoZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IGxpbmVzID0gKHN0ZG91dCB8fCBcIlwiKS5zcGxpdChcIlxcblwiKTtcclxuICAgICAgICAgICAgbGV0IGxpbmUgPSBudWxsO1xyXG4gICAgICAgICAgICB3aGlsZSAoIWxpbmUgJiYgbGluZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgbGluZSA9IGxpbmVzLnBvcCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJlc29sdmUobGluZSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgY3Auc3Rkb3V0Lm9uKFwiZGF0YVwiLCBmdW5jdGlvbiAoZGF0YSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhkYXRhLnRvU3RyaW5nKCkpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGNwLnN0ZGVyci5vbihcImRhdGFcIiwgZnVuY3Rpb24gKGRhdGEpIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihkYXRhLnRvU3RyaW5nKCkpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfSk7XHJcbn1cclxuXHJcbmV4cG9ydCBlbnVtIENvbnNvbGVDb2xvciB7XHJcbiAgICBSZXNldCA9IFwiXFx4MWJbMG1cIixcclxuICAgIEJyaWdodCA9IFwiXFx4MWJbMW1cIixcclxuICAgIERpbSA9IFwiXFx4MWJbMm1cIixcclxuICAgIFVuZGVyc2NvcmUgPSBcIlxceDFiWzRtXCIsXHJcbiAgICBCbGluayA9IFwiXFx4MWJbNW1cIixcclxuICAgIFJldmVyc2UgPSBcIlxceDFiWzdtXCIsXHJcbiAgICBIaWRkZW4gPSBcIlxceDFiWzhtXCIsXHJcblxyXG4gICAgRmdCbGFjayA9IFwiXFx4MWJbMzBtXCIsXHJcbiAgICBGZ1JlZCA9IFwiXFx4MWJbMzFtXCIsXHJcbiAgICBGZ0dyZWVuID0gXCJcXHgxYlszMm1cIixcclxuICAgIEZnWWVsbG93ID0gXCJcXHgxYlszM21cIixcclxuICAgIEZnQmx1ZSA9IFwiXFx4MWJbMzRtXCIsXHJcbiAgICBGZ01hZ2VudGEgPSBcIlxceDFiWzM1bVwiLFxyXG4gICAgRmdDeWFuID0gXCJcXHgxYlszNm1cIixcclxuICAgIEZnV2hpdGUgPSBcIlxceDFiWzM3bVwiLFxyXG4gICAgRmdEZWZhdWx0ID0gXCJcXHgxYlszOG1cIixcclxuXHJcbiAgICBCZ0JsYWNrID0gXCJcXHgxYls0MG1cIixcclxuICAgIEJnUmVkID0gXCJcXHgxYls0MW1cIixcclxuICAgIEJnR3JlZW4gPSBcIlxceDFiWzQybVwiLFxyXG4gICAgQmdZZWxsb3cgPSBcIlxceDFiWzQzbVwiLFxyXG4gICAgQmdCbHVlID0gXCJcXHgxYls0NG1cIixcclxuICAgIEJnTWFnZW50YSA9IFwiXFx4MWJbNDVtXCIsXHJcbiAgICBCZ0N5YW4gPSBcIlxceDFiWzQ2bVwiLFxyXG4gICAgQmdXaGl0ZSA9IFwiXFx4MWJbNDdtXCIsXHJcbiAgICBCZ0RlZmF1bHQgPSBcIlxceDFiWzQ4bVwiXHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUpzb25Db2xvcnMge1xyXG4gICAga2V5Q29sb3I/OiBDb25zb2xlQ29sb3I7XHJcbiAgICBudW1iZXJDb2xvcj86IENvbnNvbGVDb2xvcjtcclxuICAgIHN0cmluZ0NvbG9yPzogQ29uc29sZUNvbG9yO1xyXG4gICAgdHJ1ZUNvbG9yPzogQ29uc29sZUNvbG9yO1xyXG4gICAgZmFsc2VDb2xvcj86IENvbnNvbGVDb2xvcjtcclxuICAgIG51bGxDb2xvcj86IENvbnNvbGVDb2xvcjtcclxufVxyXG5cclxuY29uc3QgZGVmYXVsdENvbG9yczogSUpzb25Db2xvcnMgPSB7XHJcbiAgICBrZXlDb2xvcjogQ29uc29sZUNvbG9yLkZnV2hpdGUsXHJcbiAgICBudW1iZXJDb2xvcjogQ29uc29sZUNvbG9yLkZnQmx1ZSxcclxuICAgIHN0cmluZ0NvbG9yOiBDb25zb2xlQ29sb3IuRmdZZWxsb3csXHJcbiAgICB0cnVlQ29sb3I6IENvbnNvbGVDb2xvci5GZ0dyZWVuLFxyXG4gICAgZmFsc2VDb2xvcjogQ29uc29sZUNvbG9yLkZnUmVkLFxyXG4gICAgbnVsbENvbG9yOiBDb25zb2xlQ29sb3IuQmdNYWdlbnRhXHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjb2xvcml6ZShpbnB1dDogYW55LCBjb2xvcjogQ29uc29sZUNvbG9yKTogc3RyaW5nIHtcclxuICAgIHJldHVybiBgJHtjb2xvcn0ke2lucHV0fSR7Q29uc29sZUNvbG9yLlJlc2V0fWA7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBqc29uSGlnaGxpZ2h0KGlucHV0OiBzdHJpbmcgfCBvYmplY3QsIGNvbG9yT3B0aW9ucz86IElKc29uQ29sb3JzKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IGNvbG9ycyA9IE9iamVjdC5hc3NpZ24oe30sIGRlZmF1bHRDb2xvcnMsIGNvbG9yT3B0aW9ucylcclxuICAgIGNvbnN0IGpzb24gPSAoaXNTdHJpbmcoaW5wdXQpID8gaW5wdXQgOiBKU09OLnN0cmluZ2lmeShpbnB1dCwgbnVsbCwgMikpLnJlcGxhY2UoLyYvZywgJyYnKS5yZXBsYWNlKC88L2csICc8JykucmVwbGFjZSgvPi9nLCAnPicpXHJcbiAgICByZXR1cm4ganNvbi5yZXBsYWNlKC8oXCIoXFxcXHVbYS16QS1aMC05XXs0fXxcXFxcW151XXxbXlxcXFxcIl0pKlwiKFxccyo6KT98XFxiKHRydWV8ZmFsc2V8bnVsbClcXGJ8LT9cXGQrKD86XFwuXFxkKik/KD86W2VFXVsrXT9cXGQrKT8pL2csIChtYXRjaCkgPT4ge1xyXG4gICAgICAgIGxldCBjb2xvciA9IGNvbG9ycy5udW1iZXJDb2xvclxyXG4gICAgICAgIGlmICgvXlwiLy50ZXN0KG1hdGNoKSkge1xyXG4gICAgICAgICAgICBpZiAoLzokLy50ZXN0KG1hdGNoKSkge1xyXG4gICAgICAgICAgICAgICAgY29sb3IgPSBjb2xvcnMua2V5Q29sb3JcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbG9yID0gY29sb3JzLnN0cmluZ0NvbG9yO1xyXG4gICAgICAgICAgICAgICAgbWF0Y2ggPSAnXCInICsgbWF0Y2guc3Vic3RyKDEsIG1hdGNoLmxlbmd0aCAtIDIpICsgJ1wiJztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbG9yID0gL3RydWUvLnRlc3QobWF0Y2gpXHJcbiAgICAgICAgICAgICAgICA/IGNvbG9ycy50cnVlQ29sb3JcclxuICAgICAgICAgICAgICAgIDogL2ZhbHNlLy50ZXN0KG1hdGNoKVxyXG4gICAgICAgICAgICAgICAgICAgID8gY29sb3JzLmZhbHNlQ29sb3JcclxuICAgICAgICAgICAgICAgICAgICA6IC9udWxsLy50ZXN0KG1hdGNoKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA/IGNvbG9ycy5udWxsQ29sb3JcclxuICAgICAgICAgICAgICAgICAgICAgICAgOiBjb2xvclxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gYCR7Y29sb3J9JHttYXRjaH0ke0NvbnNvbGVDb2xvci5SZXNldH1gXHJcbiAgICB9KVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gcmVwbGFjZVNwZWNpYWxDaGFycyhzdHI6IHN0cmluZywgdG86IHN0cmluZyA9IFwiLVwiKTogc3RyaW5nIHtcclxuICAgIHJldHVybiBgJHtzdHJ9YC5yZXBsYWNlKC9bJlxcL1xcXFwjLCArKCkkfiUuQCdcIjoqPzw+e31dL2csIHRvKTtcclxufVxyXG4iXX0=
648
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUEsT0FBTyxFQUFDLElBQUksSUFBSSxnQkFBZ0IsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN2RCxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sUUFBUSxDQUFDO0FBRWxDLE9BQU8sRUFBQyxJQUFJLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFDN0QsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLG1DQUFtQyxDQUFDO0FBRWpFLE9BQU8sRUFBQyxLQUFLLEVBQUUsUUFBUSxJQUFJLFVBQVUsRUFBRSxNQUFNLEVBQUUsU0FBUyxJQUFJLFdBQVcsRUFBQyxNQUFNLElBQUksQ0FBQztBQUNuRixPQUFPLEVBQUMsUUFBUSxFQUFFLE9BQU8sRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUN2QyxPQUFPLEVBQWUsUUFBUSxFQUFDLE1BQU0sU0FBUyxDQUFDO0FBQy9DLE9BQU8sRUFBVyxLQUFLLEVBQUMsTUFBTSxVQUFVLENBQUM7QUFDekMsT0FBTyxFQUFDLFdBQVcsRUFBRSxRQUFRLEVBQWtCLE1BQU0sUUFBUSxDQUFDO0FBQzlELE9BQU8sTUFBZ0IsTUFBTSxPQUFPLENBQUM7QUFHckMsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDO0FBTXJCLE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBa0I7SUFDdkMsWUFBWSxFQUFFLElBQUk7Q0FDckIsQ0FBQztBQUlGLE1BQU0sVUFBVSxpQkFBaUIsQ0FBQyxLQUFVO0lBQ3hDLE9BQU8sS0FBSyxJQUFJLElBQUksSUFBSSxPQUFPLEtBQUssSUFBSSxXQUFXLENBQUM7QUFDeEQsQ0FBQztBQUVELE1BQU0sVUFBVSxTQUFTLENBQUMsS0FBVTtJQUNoQyxPQUFPLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDckMs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QUFLLENBQUMsTUFBTSxDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDckYsTUFBTSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDbkYsTUFBTSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDbkYsTUFBTSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDakUsTUFBTSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDakUsTUFBTSxDQUFDLElBQUksR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxJQUFJLE1BQU0sQ0FBQztRQUUzRSxJQUFJLE1BQU0sR0FBRyxHQUFHLFlBQVksUUFBUSxDQUFDLENBQUMsQ0FBQyxNQUFNLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBVSxDQUFDO1FBQzlFLElBQUk7WUFDQSxnQkFBZ0I7WUFDaEIsTUFBTSxVQUFVLEdBQUcsWUFBWSxDQUFDLE1BQU0sQ0FBQyxVQUFVLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJ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QUcsWUFBWSxDQUFDLEtBQUssRUFBRSxDQUFBO0lBQ2xELENBQUMsQ0FBQyxDQUFBO0FBQ04sQ0FBQztBQUVELE1BQU0sVUFBVSxtQkFBbUIsQ0FBQyxHQUFXLEVBQUUsS0FBYSxHQUFHO0lBQzdELE9BQU8sR0FBRyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsOEJBQThCLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDaEUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7ZXhlYyBhcyBleGVjQ2hpbGRQcm9jZXNzfSBmcm9tIFwiY2hpbGRfcHJvY2Vzc1wiO1xyXG5pbXBvcnQge2NyZWF0ZUhhc2h9IGZyb20gXCJjcnlwdG9cIjtcclxuaW1wb3J0IHtEZXBlbmRlbmN5Q29udGFpbmVyfSBmcm9tIFwidHN5cmluZ2VcIjtcclxuaW1wb3J0IHtmcm9tLCBPYnNlcnZhYmxlLCBTdWJqZWN0LCBTdWJzY3JpcHRpb259IGZyb20gXCJyeGpzXCI7XHJcbmltcG9ydCB7Y2FuUmVwb3J0RXJyb3J9IGZyb20gXCJyeGpzL2ludGVybmFsL3V0aWwvY2FuUmVwb3J0RXJyb3JcIjtcclxuaW1wb3J0IHtTZXJ2ZXJ9IGZyb20gXCJzb2NrZXQuaW9cIjtcclxuaW1wb3J0IHtta2RpciwgcmVhZEZpbGUgYXMgZnNSZWFkRmlsZSwgdW5saW5rLCB3cml0ZUZpbGUgYXMgZnNXcml0ZUZpbGV9IGZyb20gXCJmc1wiO1xyXG5pbXBvcnQge2Jhc2VuYW1lLCBkaXJuYW1lfSBmcm9tIFwicGF0aFwiO1xyXG5pbXBvcnQge0dyaWRGU0J1Y2tldCwgT2JqZWN0SWR9IGZyb20gXCJtb25nb2RiXCI7XHJcbmltcG9ydCB7RG9jdW1lbnQsIFR5cGVzfSBmcm9tIFwibW9uZ29vc2VcIjtcclxuaW1wb3J0IHtQYXNzVGhyb3VnaCwgUmVhZGFibGUsIFJlYWRhYmxlT3B0aW9uc30gZnJvbSBcInN0cmVhbVwiO1xyXG5pbXBvcnQgc2hhcnBfLCB7UmVnaW9ufSBmcm9tIFwic2hhcnBcIjtcclxuaW1wb3J0IHtJQXNzZXRDcm9wSW5mbywgSUFzc2V0SW1hZ2VQYXJhbXMsIElBc3NldE1ldGEsIElDbGllbnRTb2NrZXQsIFR5cGV9IGZyb20gXCIuL2NvbW1vbi10eXBlc1wiO1xyXG5cclxuY29uc3Qgc2hhcnAgPSBzaGFycF87XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElESUNvbnRhaW5lcnMge1xyXG4gICAgYXBwQ29udGFpbmVyOiBEZXBlbmRlbmN5Q29udGFpbmVyXHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBkaUNvbnRhaW5lcnM6IElESUNvbnRhaW5lcnMgPSB7XHJcbiAgICBhcHBDb250YWluZXI6IG51bGxcclxufTtcclxuXHJcbmV4cG9ydCB0eXBlIEZpbHRlclByZWRpY2F0ZSA9ICh2YWx1ZTogYW55LCBrZXk/OiBhbnksIHRhcmdldD86IGFueSwgc291cmNlPzogYW55KSA9PiBib29sZWFuO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGlzTnVsbE9yVW5kZWZpbmVkKHZhbHVlOiBhbnkpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB2YWx1ZSA9PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSA9PSBcInVuZGVmaW5lZFwiO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaXNEZWZpbmVkKHZhbHVlOiBhbnkpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAhaXNOdWxsT3JVbmRlZmluZWQodmFsdWUpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0VHlwZShvYmo6IGFueSk6IHN0cmluZyB7XHJcbiAgICBjb25zdCByZWdleCA9IG5ldyBSZWdFeHAoXCJcXFxccyhbYS16QS1aXSspXCIpO1xyXG4gICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmopLm1hdGNoKHJlZ2V4KVsxXS50b0xvd2VyQ2FzZSgpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaXNPYmplY3QodmFsdWU6IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIGdldFR5cGUodmFsdWUpID09IFwib2JqZWN0XCI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBpc0FycmF5KHZhbHVlOiBhbnkpOiB2YWx1ZSBpcyBBcnJheTxhbnk+IHtcclxuICAgIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGlzQm9vbGVhbih2YWx1ZTogYW55KTogdmFsdWUgaXMgYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSBcImJvb2xlYW5cIjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGlzRGF0ZSh2YWx1ZTogYW55KTogdmFsdWUgaXMgRGF0ZSB7XHJcbiAgICByZXR1cm4gISF2YWx1ZSAmJiB2YWx1ZVtTeW1ib2wudG9QcmltaXRpdmVdICYmICFpc05hTih2YWx1ZSkgJiYgXCJ1bmRlZmluZWRcIiAhPT0gdHlwZW9mIHZhbHVlLmdldERhdGU7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBpc1ByaW1pdGl2ZSh2YWx1ZTogYW55KTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCB0eXBlID0gdHlwZW9mIHZhbHVlO1xyXG4gICAgcmV0dXJuIHZhbHVlID09IG51bGwgfHwgKHR5cGUgIT09IFwib2JqZWN0XCIgJiYgdHlwZSAhPT0gXCJmdW5jdGlvblwiKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGlzU3RyaW5nKHZhbHVlOiBhbnkpOiB2YWx1ZSBpcyBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGlzRnVuY3Rpb24odmFsdWU6IGFueSk6IHZhbHVlIGlzIEZ1bmN0aW9uIHtcclxuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGlzQ29uc3RydWN0b3IodmFsdWU6IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIiAmJiB2YWx1ZS5wcm90b3R5cGUgJiYgdmFsdWUucHJvdG90eXBlLmNvbnN0cnVjdG9yKSA9PT0gdmFsdWUgJiYgdmFsdWUubmFtZSAhPT0gXCJPYmplY3RcIjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGlzVHlwZSh2YWx1ZTogYW55KTogdmFsdWUgaXMgVHlwZTxhbnk+IHtcclxuICAgIHJldHVybiBpc0NvbnN0cnVjdG9yKHZhbHVlKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGlzSW50ZXJmYWNlKG9iajogYW55LCBpbnRlckZhY2VPYmplY3Q6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0pOiBib29sZWFuIHtcclxuICAgIGlmICghb2JqIHx8IHR5cGVvZiBvYmogIT09IFwib2JqZWN0XCIgfHwgaXNBcnJheShvYmopIHx8ICFpc09iamVjdChpbnRlckZhY2VPYmplY3QpKSByZXR1cm4gZmFsc2U7XHJcbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoaW50ZXJGYWNlT2JqZWN0KTtcclxuICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcclxuICAgICAgICBsZXQgdHlwZSA9IGludGVyRmFjZU9iamVjdFtrZXldIHx8IFwiXCI7XHJcbiAgICAgICAgaWYgKHR5cGUuc3RhcnRzV2l0aChcIipcIikpIHtcclxuICAgICAgICAgICAgdHlwZSA9IHR5cGUuc3Vic3RyKDEpO1xyXG4gICAgICAgICAgICBpZiAob2JqLmhhc093blByb3BlcnR5KGtleSkgJiYgZ2V0VHlwZShvYmpba2V5XSkgIT09IHR5cGUpIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9IGVsc2UgaWYgKCFvYmouaGFzT3duUHJvcGVydHkoa2V5KSB8fCBnZXRUeXBlKG9ialtrZXldKSAhPT0gdHlwZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRydWU7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiB1Y0ZpcnN0KHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgaWYgKCF2YWx1ZSkgcmV0dXJuIFwiXCI7XHJcbiAgICByZXR1cm4gdmFsdWVbMF0udG9VcHBlckNhc2UoKSArIHZhbHVlLnN1YnN0cigxKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGxjRmlyc3QodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBpZiAoIXZhbHVlKSByZXR1cm4gXCJcIjtcclxuICAgIHJldHVybiB2YWx1ZVswXS50b0xvd2VyQ2FzZSgpICsgdmFsdWUuc3Vic3RyKDEpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaXNPYmplY3RJZChpZDogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdHlwZW9mIGlkID09PSBcInN0cmluZ1wiICYmIGlkLmxlbmd0aCA9PSAyNCAmJiAhaXNOYU4oTnVtYmVyKFwiMHhcIiArIGlkKSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBmaXJzdEl0ZW08VD4odmFsdWU6IFRbXSk6IFQge1xyXG4gICAgcmV0dXJuIHZhbHVlWzBdO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gbGFzdEl0ZW08VD4odmFsdWU6IFRbXSk6IFQge1xyXG4gICAgcmV0dXJuIHZhbHVlW3ZhbHVlLmxlbmd0aCAtIDFdO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gcmVncm91cDxUPih2YWx1ZTogVFtdLCBjb21wYXJhdG9yOiAoYTogVCwgYjogVCkgPT4gYm9vbGVhbik6IEFycmF5PFRbXT4ge1xyXG4gICAgY29uc3QgcmVzdWx0OiBBcnJheTxUW10+ID0gW107XHJcbiAgICBpZiAoIWlzQXJyYXkodmFsdWUpIHx8IHZhbHVlLmxlbmd0aCA9PSAwKSByZXR1cm4gcmVzdWx0O1xyXG4gICAgdmFsdWUgPSBBcnJheS5mcm9tKHZhbHVlKTtcclxuICAgIHJlc3VsdC5wdXNoKFt2YWx1ZS5zaGlmdCgpXSk7XHJcbiAgICB2YWx1ZS5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgIGNvbnN0IGdyb3VwID0gcmVzdWx0LmZpbmQoZyA9PiBnLnNvbWUoYSA9PiBjb21wYXJhdG9yKGEsIGl0ZW0pKSk7XHJcbiAgICAgICAgaWYgKGdyb3VwKSB7XHJcbiAgICAgICAgICAgIGdyb3VwLnB1c2goaXRlbSk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmVzdWx0LnB1c2goW2l0ZW1dKTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHVuaXF1ZUl0ZW1zPFQ+KHZhbHVlOiBUW10pOiBUW10ge1xyXG4gICAgcmV0dXJuIHZhbHVlLmZpbHRlcigodiwgaXgpID0+IHZhbHVlLmluZGV4T2YodikgPT09IGl4KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldFZhbHVlKG9iajogYW55LCBrZXk6IHN0cmluZywgZGVmYXVsdFZhbHVlPzogYW55LCB0cmVlRmFsbGJhY2s6IGJvb2xlYW4gPSBmYWxzZSk6IGFueSB7XHJcbiAgICBrZXkgPSBrZXkgfHwgXCJcIjtcclxuICAgIGNvbnN0IGtleXMgPSBrZXkuc3BsaXQoXCIuXCIpO1xyXG4gICAgbGV0IGN1cktleSA9IFwiXCI7XHJcbiAgICBkbyB7XHJcbiAgICAgICAgY3VyS2V5ICs9IGtleXMuc2hpZnQoKTtcclxuICAgICAgICBpZiAoaXNEZWZpbmVkKG9iaikgJiYgaXNEZWZpbmVkKG9ialtjdXJLZXldKSAmJiAodHlwZW9mIG9ialtjdXJLZXldID09PSBcIm9iamVjdFwiIHx8ICFrZXlzLmxlbmd0aCkpIHtcclxuICAgICAgICAgICAgb2JqID0gb2JqW2N1cktleV07XHJcbiAgICAgICAgICAgIGN1cktleSA9IFwiXCI7XHJcbiAgICAgICAgfSBlbHNlIGlmICgha2V5cy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgZGVmYXVsdFZhbHVlID0gdHlwZW9mIGRlZmF1bHRWYWx1ZSA9PSBcInVuZGVmaW5lZFwiID8ga2V5LnJlcGxhY2UobmV3IFJlZ0V4cChgJHtjdXJLZXl9JGApLCBgeyR7Y3VyS2V5fX1gKSA6IGRlZmF1bHRWYWx1ZTtcclxuICAgICAgICAgICAgb2JqID0gdHJlZUZhbGxiYWNrID8gb2JqIHx8IGRlZmF1bHRWYWx1ZSA6IGRlZmF1bHRWYWx1ZTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjdXJLZXkgKz0gXCIuXCI7XHJcbiAgICAgICAgfVxyXG4gICAgfSB3aGlsZSAoa2V5cy5sZW5ndGgpO1xyXG4gICAgcmV0dXJuIG9iajtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdyb3VwQnk8VD4oaXRlbXM6IFRbXSwgY2I6IChpdGVtOiBUKSA9PiBzdHJpbmcpIHtcclxuICAgIHJldHVybiBpdGVtcy5yZWR1Y2UoKHJlcywgaXRlbSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGdyb3VwID0gY2IoaXRlbSk7XHJcbiAgICAgICAgcmVzW2dyb3VwXSA9IHJlc1tncm91cF0gfHwgW107XHJcbiAgICAgICAgcmVzW2dyb3VwXS5wdXNoKGl0ZW0pO1xyXG4gICAgICAgIHJldHVybiByZXM7XHJcbiAgICB9LCB7fSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0VmFsdWUodmFsdWU6IGFueSwgdHlwZTogc3RyaW5nKTogYW55IHtcclxuICAgIHN3aXRjaCAodHlwZSkge1xyXG4gICAgICAgIGNhc2UgXCJib29sZWFuXCI6XHJcbiAgICAgICAgICAgIHZhbHVlID0gdHlwZW9mIHZhbHVlID09IFwic3RyaW5nXCIgPyB2YWx1ZS50b0xvd2VyQ2FzZSgpIDogdmFsdWU7XHJcbiAgICAgICAgICAgIHJldHVybiAodmFsdWUgPT0gXCJub1wiIHx8IHZhbHVlID09IFwiZmFsc2VcIiB8fCB2YWx1ZSA9PSBcIjBcIikgPyBmYWxzZSA6ICEhdmFsdWU7XHJcbiAgICAgICAgY2FzZSBcIm51bWJlclwiOlxyXG4gICAgICAgICAgICBjb25zdCB2YWwgPSBwYXJzZUZsb2F0KHZhbHVlKTtcclxuICAgICAgICAgICAgcmV0dXJuIGlzTmFOKHZhbCkgPyAwIDogdmFsO1xyXG4gICAgICAgIGNhc2UgXCJhcnJheVwiOlxyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UodmFsdWUpO1xyXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYCR7dmFsdWV9YC5zcGxpdChcIiwgXCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdmFsdWU7XHJcbn1cclxuXHJcbmNvbnN0IGNyb3BJbnRlcmZhY2UgPSB7XHJcbiAgICB4OiBcIm51bWJlclwiLFxyXG4gICAgeTogXCJudW1iZXJcIixcclxuICAgIHc6IFwibnVtYmVyXCIsXHJcbiAgICBoOiBcIm51bWJlclwiXHJcbn07XHJcblxyXG5mdW5jdGlvbiB0b0Nyb3BSZWdpb24oY3JvcEluZm86IHN0cmluZyB8IGJvb2xlYW4gfCBJQXNzZXRDcm9wSW5mbyk6IFJlZ2lvbiB7XHJcbiAgICBsZXQgY3JvcCA9IGNyb3BJbmZvIGFzIElBc3NldENyb3BJbmZvO1xyXG4gICAgaWYgKGlzU3RyaW5nKGNyb3BJbmZvKSkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNyb3AgPSBKU09OLnBhcnNlKGNyb3BJbmZvIGFzIHN0cmluZyk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAoIWlzSW50ZXJmYWNlKGNyb3AsIGNyb3BJbnRlcmZhY2UpKSByZXR1cm4gbnVsbDtcclxuICAgIHJldHVybiB7XHJcbiAgICAgICAgd2lkdGg6IE1hdGgucm91bmQoY3JvcC53KSxcclxuICAgICAgICBoZWlnaHQ6IE1hdGgucm91bmQoY3JvcC5oKSxcclxuICAgICAgICB0b3A6IE1hdGgucm91bmQoY3JvcC55KSxcclxuICAgICAgICBsZWZ0OiBNYXRoLnJvdW5kKGNyb3AueClcclxuICAgIH07XHJcbn1cclxuXHJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0b0ltYWdlPFQgPSBCdWZmZXIgfCBSZWFkYWJsZT4oc3JjOiBULCBwYXJhbXM/OiBJQXNzZXRJbWFnZVBhcmFtcywgbWV0YT86IElBc3NldE1ldGEpOiBQcm9taXNlPFQ+IHtcclxuXHJcbiAgICAvLyBEZWZhdWx0IHBhcmFtcyBhbmQgbWV0YVxyXG4gICAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xyXG4gICAgbWV0YSA9IG1ldGEgfHwge307XHJcblxyXG4gICAgLy8gR2V0IGRlZmF1bHQgY3JvcCBpbmZvXHJcbiAgICBjb25zdCBjcm9wID0gdG9Dcm9wUmVnaW9uKG1ldGEuY3JvcCk7XHJcblxyXG4gICAgLy8gUmV0dXJuIHRoZSBzcmMgaWYgdGhlcmUgYXJlIG5vIHBhcmFtcyBhbmQgbm8gZGVmYXVsdCBjcm9wIGV4aXN0c1xyXG4gICAgaWYgKG1ldGEuZXh0ZW5zaW9uID09PSBcInN2Z1wiIHx8IChPYmplY3Qua2V5cyhwYXJhbXMpLmxlbmd0aCA9PSAwICYmICFjcm9wKSkge1xyXG4gICAgICAgIHJldHVybiBzcmM7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gUGFyc2UgcGFyYW1zXHJcbiAgICBwYXJhbXMucm90YXRpb24gPSBpc05hTihwYXJhbXMucm90YXRpb24pID8gMCA6IE1hdGgucm91bmQocGFyYW1zLnJvdGF0aW9uIC8gOTApICogOTA7XHJcbiAgICBwYXJhbXMuY2FudmFzU2NhbGVYID0gaXNOYU4ocGFyYW1zLmNhbnZhc1NjYWxlWCkgPyAxIDogTnVtYmVyKHBhcmFtcy5jYW52YXNTY2FsZVgpO1xyXG4gICAgcGFyYW1zLmNhbnZhc1NjYWxlWSA9IGlzTmFOKHBhcmFtcy5jYW52YXNTY2FsZVkpID8gMSA6IE51bWJlcihwYXJhbXMuY2FudmFzU2NhbGVZKTtcclxuICAgIHBhcmFtcy5zY2FsZVggPSBpc05hTihwYXJhbXMuc2NhbGVYKSA/IDEgOiBOdW1iZXIocGFyYW1zLnNjYWxlWCk7XHJcbiAgICBwYXJhbXMuc2NhbGVZID0gaXNOYU4ocGFyYW1zLnNjYWxlWSkgPyAxIDogTnVtYmVyKHBhcmFtcy5zY2FsZVkpO1xyXG4gICAgcGFyYW1zLmNyb3AgPSBpc0Jvb2xlYW4ocGFyYW1zLmNyb3ApID8gcGFyYW1zLmNyb3AgOiBwYXJhbXMuY3JvcCA9PSBcInRydWVcIjtcclxuXHJcbiAgICBsZXQgYnVmZmVyID0gc3JjIGluc3RhbmNlb2YgUmVhZGFibGUgPyBhd2FpdCBzdHJlYW1Ub0J1ZmZlcihzcmMpIDogc3JjIGFzIGFueTtcclxuICAgIHRyeSB7XHJcbiAgICAgICAgLy8gR2V0IGNyb3AgaW5mb1xyXG4gICAgICAgIGNvbnN0IGNyb3BCZWZvcmUgPSB0b0Nyb3BSZWdpb24ocGFyYW1zLmNyb3BCZWZvcmUgfHwgKHBhcmFtcy5jcm9wID8gbWV0YS5jcm9wQmVmb3JlIDogbnVsbCkpO1xyXG4gICAgICAgIGNvbnN0IGNyb3BBZnRlciA9IHRvQ3JvcFJlZ2lvbihwYXJhbXMuY3JvcEFmdGVyIHx8IChwYXJhbXMuY3JvcCA/IG1ldGEuY3JvcEFmdGVyIDogbnVsbCkpO1xyXG4gICAgICAgIC8vIEdldCBtZXRhZGF0YVxyXG4gICAgICAgIGxldCBpbWcgPSBzaGFycChidWZmZXIpO1xyXG4gICAgICAgIGxldCB7d2lkdGgsIGhlaWdodH0gPSBhd2FpdCBpbWcubWV0YWRhdGEoKTtcclxuICAgICAgICAvLyBDcm9wIGJlZm9yZSByZXNpemVcclxuICAgICAgICBpZiAoY3JvcEJlZm9yZSkge1xyXG4gICAgICAgICAgICB3aWR0aCA9IGNyb3BCZWZvcmUud2lkdGg7XHJcbiAgICAgICAgICAgIGhlaWdodCA9IGNyb3BCZWZvcmUuaGVpZ2h0O1xyXG4gICAgICAgICAgICBpbWcgPSBpbWcuZXh0cmFjdChjcm9wQmVmb3JlKTtcclxuICAgICAgICB9IGVsc2UgaWYgKGNyb3ApIHtcclxuICAgICAgICAgICAgd2lkdGggPSBjcm9wLndpZHRoO1xyXG4gICAgICAgICAgICBoZWlnaHQgPSBjcm9wLmhlaWdodDtcclxuICAgICAgICAgICAgaW1nID0gaW1nLmV4dHJhY3QoY3JvcCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIFJlc2l6ZSBjYW52YXNcclxuICAgICAgICBjb25zdCBjYW52YXNTY2FsZVggPSBtZXRhPy5jYW52YXNTY2FsZVggfHwgMTtcclxuICAgICAgICBjb25zdCBjYW52YXNTY2FsZVkgPSBtZXRhPy5jYW52YXNTY2FsZVkgfHwgMTtcclxuICAgICAgICBpZiAocGFyYW1zLmNhbnZhc1NjYWxlWCAhPT0gY2FudmFzU2NhbGVYIHx8IHBhcmFtcy5jYW52YXNTY2FsZVkgIT09IGNhbnZhc1NjYWxlWSkge1xyXG4gICAgICAgICAgICB3aWR0aCA9IE1hdGgucm91bmQod2lkdGggKiBwYXJhbXMuY2FudmFzU2NhbGVYKTtcclxuICAgICAgICAgICAgaGVpZ2h0ID0gTWF0aC5yb3VuZChoZWlnaHQgKiBwYXJhbXMuY2FudmFzU2NhbGVZKTtcclxuICAgICAgICAgICAgaW1nID0gaW1nLnJlc2l6ZSh7d2lkdGgsIGhlaWdodCwgYmFja2dyb3VuZDogXCIjMDAwMDAwMDBcIiwgZml0OiBcImNvbnRhaW5cIn0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBSZXNpemUgaW1hZ2VcclxuICAgICAgICBpZiAocGFyYW1zLnNjYWxlWCAhPT0gMSB8fCBwYXJhbXMuc2NhbGVZICE9PSAxKSB7XHJcbiAgICAgICAgICAgIHdpZHRoID0gTWF0aC5yb3VuZCh3aWR0aCAqIHBhcmFtcy5zY2FsZVgpO1xyXG4gICAgICAgICAgICBoZWlnaHQgPSBNYXRoLnJvdW5kKGhlaWdodCAqIHBhcmFtcy5zY2FsZVkpO1xyXG4gICAgICAgICAgICBpbWcgPSBpbWcucmVzaXplKHt3aWR0aCwgaGVpZ2h0LCBiYWNrZ3JvdW5kOiBcIiMwMDAwMDAwMFwiLCBmaXQ6IFwiZmlsbFwifSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIENyb3AgYWZ0ZXIgcmVzaXplXHJcbiAgICAgICAgaWYgKGNyb3BBZnRlcikge1xyXG4gICAgICAgICAgICBpbWcgPSBpbWcuZXh0cmFjdChjcm9wQWZ0ZXIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBSb3RhdGVcclxuICAgICAgICBpZiAocGFyYW1zLnJvdGF0aW9uICE9PSAwKSB7XHJcbiAgICAgICAgICAgIGJ1ZmZlciA9IGF3YWl0IGltZy50b0J1ZmZlcigpO1xyXG4gICAgICAgICAgICBpbWcgPSBzaGFycChidWZmZXIpLnJvdGF0ZShwYXJhbXMucm90YXRpb24pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBidWZmZXIgPSBhd2FpdCBpbWcudG9CdWZmZXIoKTtcclxuICAgICAgICBzcmMgPSBzcmMgaW5zdGFuY2VvZiBSZWFkYWJsZSA/IGJ1ZmZlclRvU3RyZWFtKGJ1ZmZlcikgOiBidWZmZXI7XHJcbiAgICAgICAgcmV0dXJuIHNyYztcclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICBjb25zb2xlLmxvZyhcIkltYWdlIGNvbnZlcnNpb24gZXJyb3JcIiwgZSk7XHJcbiAgICAgICAgc3JjID0gc3JjIGluc3RhbmNlb2YgUmVhZGFibGUgPyBidWZmZXJUb1N0cmVhbShidWZmZXIpIDogYnVmZmVyO1xyXG4gICAgICAgIHJldHVybiBzcmM7XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBidWZmZXJUb1N0cmVhbShidWZmZXI6IEJ1ZmZlcik6IFJlYWRhYmxlIHtcclxuICAgIGNvbnN0IHJlYWRTdHJlYW0gPSBuZXcgUGFzc1Rocm91Z2goKTtcclxuICAgIHJlYWRTdHJlYW0uZW5kKGJ1ZmZlcik7XHJcbiAgICByZXR1cm4gcmVhZFN0cmVhbVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gc3RyZWFtVG9CdWZmZXIoc3RyZWFtOiBSZWFkYWJsZSk6IFByb21pc2U8QnVmZmVyPiB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2U8QnVmZmVyPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgY29uc3QgY29uY2F0ID0gW107XHJcbiAgICAgICAgc3RyZWFtLm9uKFwiZGF0YVwiLCBkYXRhID0+IHtcclxuICAgICAgICAgICAgY29uY2F0LnB1c2goZGF0YSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgc3RyZWFtLm9uKFwiZXJyb3JcIiwgcmVqZWN0KTtcclxuICAgICAgICBzdHJlYW0ub24oXCJlbmRcIiwgKCkgPT4gcmVzb2x2ZShCdWZmZXIuY29uY2F0KGNvbmNhdCkpKTtcclxuICAgIH0pXHJcbn1cclxuXHJcbmNsYXNzIFJlYWRhYmxlU3RyZWFtQ2xvbmUgZXh0ZW5kcyBSZWFkYWJsZSB7XHJcblxyXG4gICAgY29uc3RydWN0b3IocmVhZGFibGVTdHJlYW06IFJlYWRhYmxlLCBvcHRzPzogUmVhZGFibGVPcHRpb25zKSB7XHJcbiAgICAgICAgc3VwZXIob3B0cyk7XHJcbiAgICAgICAgcmVhZGFibGVTdHJlYW0/Lm9uKFwiZGF0YVwiLCBjaHVuayA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMucHVzaChjaHVuayk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmVhZGFibGVTdHJlYW0/Lm9uKFwiZW5kXCIsICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5wdXNoKG51bGwpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJlYWRhYmxlU3RyZWFtPy5vbihcImVycm9yXCIsIGVyciA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuZW1pdChcImVycm9yXCIsIGVycik7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgX3JlYWQoc2l6ZTogbnVtYmVyKSB7XHJcblxyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY29weVN0cmVhbShzdHJlYW06IFJlYWRhYmxlLCBvcHRzPzogUmVhZGFibGVPcHRpb25zKTogUmVhZGFibGUge1xyXG4gICAgcmV0dXJuIG5ldyBSZWFkYWJsZVN0cmVhbUNsb25lKHN0cmVhbSwgb3B0cyk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBta2RpclJlY3Vyc2l2ZShwYXRoOiBzdHJpbmcsIG1vZGU6IG51bWJlciA9IG51bGwpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgbWtkaXIocGF0aCwge21vZGU6IG1vZGUgfHwgMG83NzcsIHJlY3Vyc2l2ZTogdHJ1ZX0sIGVyciA9PiB7XHJcbiAgICAgICAgICAgIGlmIChlcnIpIHtcclxuICAgICAgICAgICAgICAgIHJlamVjdChlcnIpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgICB9KTtcclxuICAgIH0pO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZGVsZXRlRmlsZShwYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgdW5saW5rKHBhdGgsIGVyciA9PiB7XHJcbiAgICAgICAgICAgIGlmIChlcnIpIHtcclxuICAgICAgICAgICAgICAgIHJlamVjdChlcnIpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgICB9KTtcclxuICAgIH0pO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gcmVhZEZpbGUocGF0aDogc3RyaW5nKTogUHJvbWlzZTxCdWZmZXI+IHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZTxCdWZmZXI+KChyZXMsIHJlaikgPT4ge1xyXG4gICAgICAgIGZzUmVhZEZpbGUocGF0aCwgKGVyciwgZGF0YSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoZXJyKSB7XHJcbiAgICAgICAgICAgICAgICByZWooZXJyKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXMoZGF0YSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9KTtcclxufVxyXG5cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYWRBbmREZWxldGVGaWxlKHBhdGg6IHN0cmluZywgdGltZW91dDogbnVtYmVyID0gNTAwMCk6IFByb21pc2U8QnVmZmVyPiB7XHJcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVhZEZpbGUocGF0aCk7XHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICB1bmxpbmsocGF0aCwgKCkgPT4ge1xyXG4gICAgICAgIH0pO1xyXG4gICAgfSwgdGltZW91dCk7XHJcbiAgICByZXR1cm4gZGF0YTtcclxufVxyXG5cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdyaXRlRmlsZShwYXRoOiBzdHJpbmcsIGRhdGE6IEJ1ZmZlcik6IFByb21pc2U8QnVmZmVyPiB7XHJcbiAgICBhd2FpdCBta2RpclJlY3Vyc2l2ZShkaXJuYW1lKHBhdGgpKTtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZTxCdWZmZXI+KChyZXMsIHJlaikgPT4ge1xyXG4gICAgICAgIGZzV3JpdGVGaWxlKHBhdGgsIGRhdGEsIGVyciA9PiB7XHJcbiAgICAgICAgICAgIGlmIChlcnIpIHtcclxuICAgICAgICAgICAgICAgIHJlaihlcnIpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJlcyhkYXRhKTtcclxuICAgICAgICB9KTtcclxuICAgIH0pO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gdmFsdWVUb1Byb21pc2UodmFsdWU6IGFueSk6IFByb21pc2U8YW55PiB7XHJcbiAgICByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQcm9taXNlID8gdmFsdWUgOiBQcm9taXNlLnJlc29sdmUodmFsdWUpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gcHJvbWlzZVRpbWVvdXQodGltZW91dDogbnVtYmVyID0gMTAwMCwgZXJyb3I6IGJvb2xlYW4gPSBmYWxzZSk6IFByb21pc2U8c3RyaW5nPiB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2U8YW55PigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChlcnJvcikge1xyXG4gICAgICAgICAgICAgICAgcmVqZWN0KGBUaW1lb3V0IGV4Y2VlZGVkOiAke3RpbWVvdXR9bXNgKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXNvbHZlKGBUaW1lb3V0OiAke3RpbWVvdXR9bXNgKTtcclxuICAgICAgICB9LCB0aW1lb3V0KTtcclxuICAgIH0pO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q29uc3RydWN0b3JOYW1lKHR5cGU6IFR5cGU8YW55Pik6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdHlwZS5wcm90b3R5cGUuY29uc3RydWN0b3IubmFtZTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldEZ1bmN0aW9uUGFyYW1zKGZ1bmM6IEZ1bmN0aW9uKTogc3RyaW5nW10ge1xyXG4gICAgLy8gUmVtb3ZlIGNvbW1lbnRzIG9mIHRoZSBmb3JtIC8qIC4uLiAqL1xyXG4gICAgLy8gUmVtb3ZpbmcgY29tbWVudHMgb2YgdGhlIGZvcm0gLy9cclxuICAgIC8vIFJlbW92ZSBib2R5IG9mIHRoZSBmdW5jdGlvbiB7IC4uLiB9XHJcbiAgICAvLyByZW1vdmluZyBcIj0+XCIgaWYgZnVuYyBpcyBhcnJvdyBmdW5jdGlvblxyXG4gICAgY29uc3Qgc3RyID0gZnVuYy50b1N0cmluZygpXHJcbiAgICAgICAgLnJlcGxhY2UoL1xcL1xcKltcXHNcXFNdKj9cXCpcXC8vZywgXCJcIilcclxuICAgICAgICAucmVwbGFjZSgvXFwvXFwvKC4pKi9nLCBcIlwiKVxyXG4gICAgICAgIC5yZXBsYWNlKC97W1xcc1xcU10qfS8sIFwiXCIpXHJcbiAgICAgICAgLnJlcGxhY2UoLz0+L2csIFwiXCIpXHJcbiAgICAgICAgLnRyaW0oKTtcclxuXHJcbiAgICAvLyBTdGFydCBwYXJhbWV0ZXIgbmFtZXMgYWZ0ZXIgZmlyc3QgXCIoXCJcclxuICAgIGNvbnN0IHN0YXJ0ID0gc3RyLmluZGV4T2YoXCIoXCIpICsgMTtcclxuXHJcbiAgICAvLyBFbmQgcGFyYW1ldGVyIG5hbWVzIGlzIGp1c3QgYmVmb3JlIGxhc3QgXCIpXCJcclxuICAgIGNvbnN0IGVuZCA9IHN0ci5sZW5ndGggLSAxO1xyXG4gICAgY29uc3QgcmVzdWx0ID0gc3RyLnN1YnN0cmluZyhzdGFydCwgZW5kKS5zcGxpdChcIiwgXCIpO1xyXG4gICAgY29uc3QgcGFyYW1zID0gW107XHJcblxyXG4gICAgcmVzdWx0LmZvckVhY2goZWxlbWVudCA9PiB7XHJcblxyXG4gICAgICAgIC8vIFJlbW92aW5nIGFueSBkZWZhdWx0IHZhbHVlXHJcbiAgICAgICAgZWxlbWVudCA9IGVsZW1lbnQucmVwbGFjZSgvPVtcXHNcXFNdKi9nLCBcIlwiKS50cmltKCk7XHJcblxyXG4gICAgICAgIGlmIChlbGVtZW50Lmxlbmd0aCA+IDApXHJcbiAgICAgICAgICAgIHBhcmFtcy5wdXNoKGVsZW1lbnQpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIHBhcmFtcztcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldEZpbGVOYW1lKHBhdGg6IHN0cmluZywgd2l0aEV4dGVuc2lvbjogYm9vbGVhbiA9IGZhbHNlKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IG5hbWUgPSBiYXNlbmFtZShwYXRoIHx8IFwiXCIpO1xyXG4gICAgcmV0dXJuIHdpdGhFeHRlbnNpb24gPyBuYW1lIDogbmFtZS5zcGxpdChcIi5cIikuc2xpY2UoMCwgLTEpLmpvaW4oXCIuXCIpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0RXh0ZW5zaW9uKHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBuYW1lID0gYmFzZW5hbWUocGF0aCB8fCBcIlwiKTtcclxuICAgIHJldHVybiBuYW1lLnNwbGl0KFwiLlwiKS5wb3AoKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGlkVG9TdHJpbmcodmFsdWU6IGFueSk6IGFueSB7XHJcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcclxuICAgICAgICByZXR1cm4gdmFsdWUubWFwKGlkVG9TdHJpbmcpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgT2JqZWN0SWQgfHwgdmFsdWUgaW5zdGFuY2VvZiBUeXBlcy5PYmplY3RJZFxyXG4gICAgICAgID8gdmFsdWUudG9IZXhTdHJpbmcoKVxyXG4gICAgICAgIDogKGlzU3RyaW5nKHZhbHVlKSA/IHZhbHVlIDogdmFsdWUgfHwgbnVsbCk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVUcmFuc2Zvcm1lcih0cmFuc2Zvcm0/OiAoZG9jOiBEb2N1bWVudCwgcmV0OiBhbnksIG9wdGlvbnM/OiBhbnkpID0+IGFueSkge1xyXG4gICAgcmV0dXJuIChkb2M6IERvY3VtZW50LCByZXQ6IGFueSwgb3B0aW9ucz86IGFueSkgPT4ge1xyXG4gICAgICAgIHJldC5pZCA9IGlkVG9TdHJpbmcocmV0LmlkKSB8fCByZXQuaWQ7XHJcbiAgICAgICAgaWYgKGRvYy5faWQpIHtcclxuICAgICAgICAgICAgcmV0Ll9pZCA9IGlkVG9TdHJpbmcoZG9jLl9pZCk7XHJcbiAgICAgICAgICAgIHJldC5pZCA9IHJldC5pZCB8fCByZXQuX2lkO1xyXG4gICAgICAgIH1cclxuICAgICAgICBkZWxldGUgcmV0Ll9fdjtcclxuICAgICAgICByZXR1cm4gaXNGdW5jdGlvbih0cmFuc2Zvcm0pID8gdHJhbnNmb3JtKGRvYywgcmV0LCBvcHRpb25zKSB8fCByZXQgOiByZXQ7XHJcbiAgICB9O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gYnJvYWRjYXN0KHNvY2tldFNlcnZlcjogU2VydmVyLCBjYjogKGNsaWVudDogSUNsaWVudFNvY2tldCkgPT4gdm9pZCk6IHZvaWQge1xyXG4gICAgQXJyYXkuZnJvbShPYmplY3QudmFsdWVzKHNvY2tldFNlcnZlci5zb2NrZXRzLnNvY2tldHMpKS5mb3JFYWNoKGNiKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHJhbmQobWluOiBudW1iZXIsIG1heDogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIHJldHVybiBNYXRoLnJvdW5kKHJhbmRvbShtaW4sIG1heCkpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gcmFuZG9tKG1pbjogbnVtYmVyLCBtYXg6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICByZXR1cm4gbWluICsgTWF0aC5yYW5kb20oKSAqIChtYXggLSBtaW4pO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gbXVsdGlTdWJzY3JpcHRpb24oLi4uc3Vic2NyaXB0aW9uczogU3Vic2NyaXB0aW9uW10pOiBTdWJzY3JpcHRpb24ge1xyXG4gICAgcmV0dXJuIG5ldyBTdWJzY3JpcHRpb24oKCkgPT4ge1xyXG4gICAgICAgIHN1YnNjcmlwdGlvbnMuZm9yRWFjaChzID0+IHtcclxuICAgICAgICAgICAgcy51bnN1YnNjcmliZSgpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBvYnNlcnZhYmxlRnJvbUZ1bmN0aW9uKGNhbGxiYWNrRnVuYzogKCkgPT4gYW55KTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIGxldCBzdWJqZWN0OiBhbnk7XHJcbiAgICByZXR1cm4gbmV3IE9ic2VydmFibGU8YW55Pigoc3Vic2NyaWJlcikgPT4ge1xyXG4gICAgICAgIGlmICghc3ViamVjdCkge1xyXG4gICAgICAgICAgICBzdWJqZWN0ID0gbmV3IFN1YmplY3QoKTtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIHN1YmplY3QgPSBmcm9tKGNhbGxiYWNrRnVuYygpKTtcclxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoY2FuUmVwb3J0RXJyb3Ioc3ViamVjdCkpIHtcclxuICAgICAgICAgICAgICAgICAgICBzdWJqZWN0LmVycm9yKGVycik7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihlcnIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBzdWJqZWN0LnN1YnNjcmliZShzdWJzY3JpYmVyKTtcclxuICAgIH0pO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gcGFkTGVmdCh2YWx1ZTogYW55LCBjb3VudDogbnVtYmVyID0gMywgcGFkV2l0aDogc3RyaW5nID0gXCIwXCIpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIGAke3ZhbHVlfWAucGFkU3RhcnQoY291bnQsIHBhZFdpdGgpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gcGFkUmlnaHQodmFsdWU6IGFueSwgY291bnQ6IG51bWJlciA9IDMsIHBhZFdpdGg6IHN0cmluZyA9IFwiMFwiKTogc3RyaW5nIHtcclxuICAgIHJldHVybiBgJHt2YWx1ZX1gLnBhZEVuZChjb3VudCwgcGFkV2l0aCk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBkZWxldGVGcm9tQnVja2V0KGJ1Y2tldDogR3JpZEZTQnVja2V0LCBmaWxlSWQ6IE9iamVjdElkKTogUHJvbWlzZTxzdHJpbmc+IHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZTxzdHJpbmc+KCgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgYnVja2V0LmRlbGV0ZShmaWxlSWQsIGVycm9yID0+IHtcclxuICAgICAgICAgICAgbGV0IGVyciA9IGVycm9yIGFzIGFueTtcclxuICAgICAgICAgICAgaWYgKGVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICBlcnIgPSBlcnJvci5tZXNzYWdlIHx8IGVycm9yIHx8IFwiXCI7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWlzU3RyaW5nKGVycikgfHwgIWVyci5zdGFydHNXaXRoKFwiRmlsZU5vdEZvdW5kXCIpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycik7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJlc29sdmUoZmlsZUlkLnRvSGV4U3RyaW5nKCkpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfSkpO1xyXG59XHJcblxyXG5jb25zdCBkZWZhdWx0UHJlZGljYXRlOiBGaWx0ZXJQcmVkaWNhdGUgPSAoKSA9PiB0cnVlO1xyXG5cclxuZnVuY3Rpb24gY29weVJlY3Vyc2l2ZSh0YXJnZXQ6IGFueSwgc291cmNlOiBhbnksIHByZWRpY2F0ZT86IEZpbHRlclByZWRpY2F0ZSk6IGFueSB7XHJcbiAgICBwcmVkaWNhdGUgPSBwcmVkaWNhdGUgfHwgZGVmYXVsdFByZWRpY2F0ZTtcclxuICAgIGlmIChpc1ByaW1pdGl2ZShzb3VyY2UpIHx8IGlzRGF0ZShzb3VyY2UpIHx8IGlzRnVuY3Rpb24oc291cmNlKSkgcmV0dXJuIHNvdXJjZTtcclxuICAgIGlmIChpc0FycmF5KHNvdXJjZSkpIHtcclxuICAgICAgICB0YXJnZXQgPSBpc0FycmF5KHRhcmdldCkgPyBBcnJheS5mcm9tKHRhcmdldCkgOiBbXTtcclxuICAgICAgICBzb3VyY2UuZm9yRWFjaCgoaXRlbSwgaW5kZXgpID0+IHtcclxuICAgICAgICAgICAgaWYgKCFwcmVkaWNhdGUoaXRlbSwgaW5kZXgsIHRhcmdldCwgc291cmNlKSkgcmV0dXJuO1xyXG4gICAgICAgICAgICBpZiAodGFyZ2V0Lmxlbmd0aCA+IGluZGV4KVxyXG4gICAgICAgICAgICAgICAgdGFyZ2V0W2luZGV4XSA9IGNvcHlSZWN1cnNpdmUodGFyZ2V0W2luZGV4XSwgaXRlbSwgcHJlZGljYXRlKTtcclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgdGFyZ2V0LnB1c2goY29weVJlY3Vyc2l2ZShudWxsLCBpdGVtLCBwcmVkaWNhdGUpKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4gdGFyZ2V0O1xyXG4gICAgfVxyXG4gICAgY29uc3Qgc2hvdWxkQ29weSA9IGlzRnVuY3Rpb24oc291cmNlLl9fc2hvdWxkQ29weSkgPyBzb3VyY2UuX19zaG91bGRDb3B5IDogKCkgPT4gdHJ1ZTtcclxuICAgIGlmIChpc0NvbnN0cnVjdG9yKHNvdXJjZS5jb25zdHJ1Y3RvcikpIHtcclxuICAgICAgICBpZiAoc291cmNlLl9fc2hvdWxkQ29weSA9PT0gZmFsc2UpIHJldHVybiBzb3VyY2U7XHJcbiAgICAgICAgaWYgKCF0YXJnZXQpIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIHRhcmdldCA9IG5ldyBzb3VyY2UuY29uc3RydWN0b3IoKTtcclxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcHJvdG8gPSBzb3VyY2UuY29uc3RydWN0b3IucHJvdG90eXBlIHx8IHNvdXJjZS5wcm90b3R5cGU7XHJcbiAgICAgICAgICAgICAgICB0YXJnZXQgPSBPYmplY3QuY3JlYXRlKHByb3RvKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGFyZ2V0ID0gT2JqZWN0LmFzc2lnbih7fSwgdGFyZ2V0IHx8IHt9KTtcclxuICAgIH1cclxuICAgIC8vIENvcHkgbWFwIGVudHJpZXNcclxuICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBNYXApIHtcclxuICAgICAgICBpZiAoc291cmNlIGluc3RhbmNlb2YgTWFwKSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IFtrZXksIHZhbHVlXSBvZiBzb3VyY2UuZW50cmllcygpKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXByZWRpY2F0ZSh2YWx1ZSwga2V5LCB0YXJnZXQsIHNvdXJjZSkpIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgdGFyZ2V0LnNldChrZXksICFzaG91bGRDb3B5KGtleSwgdmFsdWUpID8gdmFsdWUgOiBjb3B5UmVjdXJzaXZlKHRhcmdldC5nZXQoa2V5KSwgdmFsdWUsIHByZWRpY2F0ZSkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0YXJnZXQ7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ29weSBvYmplY3QgbWVtYmVyc1xyXG4gICAgbGV0IGtleXMgPSBPYmplY3Qua2V5cyhzb3VyY2UpO1xyXG4gICAgdGFyZ2V0ID0ga2V5cy5yZWR1Y2UoKHJlc3VsdCwga2V5KSA9PiB7XHJcbiAgICAgICAgaWYgKCFwcmVkaWNhdGUoc291cmNlW2tleV0sIGtleSwgcmVzdWx0LCBzb3VyY2UpKSByZXR1cm4gcmVzdWx0O1xyXG4gICAgICAgIHJlc3VsdFtrZXldID0gIXNob3VsZENvcHkoa2V5LCBzb3VyY2Vba2V5XSkgPyBzb3VyY2Vba2V5XSA6IGNvcHlSZWN1cnNpdmUocmVzdWx0W2tleV0sIHNvdXJjZVtrZXldLCBwcmVkaWNhdGUpO1xyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9LCB0YXJnZXQpO1xyXG5cclxuICAgIC8vIENvcHkgb2JqZWN0IHByb3BlcnRpZXNcclxuICAgIGNvbnN0IGRlc2NyaXB0b3JzID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoc291cmNlKTtcclxuICAgIGtleXMgPSBPYmplY3Qua2V5cyhkZXNjcmlwdG9ycykuZmlsdGVyKGsgPT4ga2V5cy5pbmRleE9mKGspIDwgMCk7XHJcbiAgICBrZXlzLmZvckVhY2goa2V5ID0+IHtcclxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIGRlc2NyaXB0b3JzW2tleV0pO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gdGFyZ2V0O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZmlsdGVyPFQ+KG9iajogVCwgcHJlZGljYXRlOiBGaWx0ZXJQcmVkaWNhdGUpOiBQYXJ0aWFsPFQ+IHtcclxuICAgIHJldHVybiBjb3B5UmVjdXJzaXZlKG51bGwsIG9iaiwgcHJlZGljYXRlKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNvcHk8VD4ob2JqOiBUKTogVCB7XHJcbiAgICByZXR1cm4gY29weVJlY3Vyc2l2ZShudWxsLCBvYmopO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gYXNzaWduPFQ+KHRhcmdldDogVCwgc291cmNlOiBhbnksIHByZWRpY2F0ZT86IEZpbHRlclByZWRpY2F0ZSk6IFQge1xyXG4gICAgcmV0dXJuIGNvcHlSZWN1cnNpdmUodGFyZ2V0LCBzb3VyY2UsIHByZWRpY2F0ZSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBtZDUoZGF0YTogYW55KTogc3RyaW5nIHtcclxuICAgIGlmIChpc09iamVjdChkYXRhKSkge1xyXG4gICAgICAgIGRhdGEgPSBKU09OLnN0cmluZ2lmeShkYXRhKTtcclxuICAgIH1cclxuICAgIGlmICghaXNTdHJpbmcoZGF0YSkpIHtcclxuICAgICAgICB0aHJvdyBgQ2FuJ3QgbWQ1IG90aGVyIHRoYXQgcmF3IG9iamVjdCBvciBzdHJpbmdgO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGNyZWF0ZUhhc2goXCJtZDVcIikudXBkYXRlKGRhdGEpLmRpZ2VzdChcImhleFwiKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHJ1bkNvbW1hbmQoc2NyaXB0UGF0aDogc3RyaW5nLCBleHBlY3RlZENvZGU6IG51bWJlciA9IDApOiBQcm9taXNlPHN0cmluZz4ge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICBjb25zdCBjcCA9IGV4ZWNDaGlsZFByb2Nlc3Moc2NyaXB0UGF0aCwgKGVycm9yLCBzdGRvdXQpID0+IHtcclxuICAgICAgICAgICAgaWYgKGVycm9yICYmIGV4cGVjdGVkQ29kZSAhPT0gZXJyb3IuY29kZSkge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zdCBsaW5lcyA9IChzdGRvdXQgfHwgXCJcIikuc3BsaXQoXCJcXG5cIik7XHJcbiAgICAgICAgICAgIGxldCBsaW5lID0gbnVsbDtcclxuICAgICAgICAgICAgd2hpbGUgKCFsaW5lICYmIGxpbmVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lcy5wb3AoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXNvbHZlKGxpbmUpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGNwLnN0ZG91dC5vbihcImRhdGFcIiwgZnVuY3Rpb24gKGRhdGEpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coZGF0YS50b1N0cmluZygpKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICBjcC5zdGRlcnIub24oXCJkYXRhXCIsIGZ1bmN0aW9uIChkYXRhKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZGF0YS50b1N0cmluZygpKTtcclxuICAgICAgICB9KTtcclxuICAgIH0pO1xyXG59XHJcblxyXG5leHBvcnQgZW51bSBDb25zb2xlQ29sb3Ige1xyXG4gICAgUmVzZXQgPSBcIlxceDFiWzBtXCIsXHJcbiAgICBCcmlnaHQgPSBcIlxceDFiWzFtXCIsXHJcbiAgICBEaW0gPSBcIlxceDFiWzJtXCIsXHJcbiAgICBVbmRlcnNjb3JlID0gXCJcXHgxYls0bVwiLFxyXG4gICAgQmxpbmsgPSBcIlxceDFiWzVtXCIsXHJcbiAgICBSZXZlcnNlID0gXCJcXHgxYls3bVwiLFxyXG4gICAgSGlkZGVuID0gXCJcXHgxYls4bVwiLFxyXG5cclxuICAgIEZnQmxhY2sgPSBcIlxceDFiWzMwbVwiLFxyXG4gICAgRmdSZWQgPSBcIlxceDFiWzMxbVwiLFxyXG4gICAgRmdHcmVlbiA9IFwiXFx4MWJbMzJtXCIsXHJcbiAgICBGZ1llbGxvdyA9IFwiXFx4MWJbMzNtXCIsXHJcbiAgICBGZ0JsdWUgPSBcIlxceDFiWzM0bVwiLFxyXG4gICAgRmdNYWdlbnRhID0gXCJcXHgxYlszNW1cIixcclxuICAgIEZnQ3lhbiA9IFwiXFx4MWJbMzZtXCIsXHJcbiAgICBGZ1doaXRlID0gXCJcXHgxYlszN21cIixcclxuICAgIEZnRGVmYXVsdCA9IFwiXFx4MWJbMzhtXCIsXHJcblxyXG4gICAgQmdCbGFjayA9IFwiXFx4MWJbNDBtXCIsXHJcbiAgICBCZ1JlZCA9IFwiXFx4MWJbNDFtXCIsXHJcbiAgICBCZ0dyZWVuID0gXCJcXHgxYls0Mm1cIixcclxuICAgIEJnWWVsbG93ID0gXCJcXHgxYls0M21cIixcclxuICAgIEJnQmx1ZSA9IFwiXFx4MWJbNDRtXCIsXHJcbiAgICBCZ01hZ2VudGEgPSBcIlxceDFiWzQ1bVwiLFxyXG4gICAgQmdDeWFuID0gXCJcXHgxYls0Nm1cIixcclxuICAgIEJnV2hpdGUgPSBcIlxceDFiWzQ3bVwiLFxyXG4gICAgQmdEZWZhdWx0ID0gXCJcXHgxYls0OG1cIlxyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElKc29uQ29sb3JzIHtcclxuICAgIGtleUNvbG9yPzogQ29uc29sZUNvbG9yO1xyXG4gICAgbnVtYmVyQ29sb3I/OiBDb25zb2xlQ29sb3I7XHJcbiAgICBzdHJpbmdDb2xvcj86IENvbnNvbGVDb2xvcjtcclxuICAgIHRydWVDb2xvcj86IENvbnNvbGVDb2xvcjtcclxuICAgIGZhbHNlQ29sb3I/OiBDb25zb2xlQ29sb3I7XHJcbiAgICBudWxsQ29sb3I/OiBDb25zb2xlQ29sb3I7XHJcbn1cclxuXHJcbmNvbnN0IGRlZmF1bHRDb2xvcnM6IElKc29uQ29sb3JzID0ge1xyXG4gICAga2V5Q29sb3I6IENvbnNvbGVDb2xvci5GZ1doaXRlLFxyXG4gICAgbnVtYmVyQ29sb3I6IENvbnNvbGVDb2xvci5GZ0JsdWUsXHJcbiAgICBzdHJpbmdDb2xvcjogQ29uc29sZUNvbG9yLkZnWWVsbG93LFxyXG4gICAgdHJ1ZUNvbG9yOiBDb25zb2xlQ29sb3IuRmdHcmVlbixcclxuICAgIGZhbHNlQ29sb3I6IENvbnNvbGVDb2xvci5GZ1JlZCxcclxuICAgIG51bGxDb2xvcjogQ29uc29sZUNvbG9yLkJnTWFnZW50YVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY29sb3JpemUoaW5wdXQ6IGFueSwgY29sb3I6IENvbnNvbGVDb2xvcik6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gYCR7Y29sb3J9JHtpbnB1dH0ke0NvbnNvbGVDb2xvci5SZXNldH1gO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24ganNvbkhpZ2hsaWdodChpbnB1dDogc3RyaW5nIHwgb2JqZWN0LCBjb2xvck9wdGlvbnM/OiBJSnNvbkNvbG9ycyk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBjb2xvcnMgPSBPYmplY3QuYXNzaWduKHt9LCBkZWZhdWx0Q29sb3JzLCBjb2xvck9wdGlvbnMpXHJcbiAgICBjb25zdCBqc29uID0gKGlzU3RyaW5nKGlucHV0KSA/IGlucHV0IDogSlNPTi5zdHJpbmdpZnkoaW5wdXQsIG51bGwsIDIpKS5yZXBsYWNlKC8mL2csICcmJykucmVwbGFjZSgvPC9nLCAnPCcpLnJlcGxhY2UoLz4vZywgJz4nKVxyXG4gICAgcmV0dXJuIGpzb24ucmVwbGFjZSgvKFwiKFxcXFx1W2EtekEtWjAtOV17NH18XFxcXFtedV18W15cXFxcXCJdKSpcIihcXHMqOik/fFxcYih0cnVlfGZhbHNlfG51bGwpXFxifC0/XFxkKyg/OlxcLlxcZCopPyg/OltlRV1bK10/XFxkKyk/KS9nLCAobWF0Y2gpID0+IHtcclxuICAgICAgICBsZXQgY29sb3IgPSBjb2xvcnMubnVtYmVyQ29sb3JcclxuICAgICAgICBpZiAoL15cIi8udGVzdChtYXRjaCkpIHtcclxuICAgICAgICAgICAgaWYgKC86JC8udGVzdChtYXRjaCkpIHtcclxuICAgICAgICAgICAgICAgIGNvbG9yID0gY29sb3JzLmtleUNvbG9yXHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb2xvciA9IGNvbG9ycy5zdHJpbmdDb2xvcjtcclxuICAgICAgICAgICAgICAgIG1hdGNoID0gJ1wiJyArIG1hdGNoLnN1YnN0cigxLCBtYXRjaC5sZW5ndGggLSAyKSArICdcIic7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb2xvciA9IC90cnVlLy50ZXN0KG1hdGNoKVxyXG4gICAgICAgICAgICAgICAgPyBjb2xvcnMudHJ1ZUNvbG9yXHJcbiAgICAgICAgICAgICAgICA6IC9mYWxzZS8udGVzdChtYXRjaClcclxuICAgICAgICAgICAgICAgICAgICA/IGNvbG9ycy5mYWxzZUNvbG9yXHJcbiAgICAgICAgICAgICAgICAgICAgOiAvbnVsbC8udGVzdChtYXRjaClcclxuICAgICAgICAgICAgICAgICAgICAgICAgPyBjb2xvcnMubnVsbENvbG9yXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDogY29sb3JcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGAke2NvbG9yfSR7bWF0Y2h9JHtDb25zb2xlQ29sb3IuUmVzZXR9YFxyXG4gICAgfSlcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHJlcGxhY2VTcGVjaWFsQ2hhcnMoc3RyOiBzdHJpbmcsIHRvOiBzdHJpbmcgPSBcIi1cIik6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gYCR7c3RyfWAucmVwbGFjZSgvWyZcXC9cXFxcIywgKygpJH4lLkAnXCI6Kj88Pnt9XS9nLCB0byk7XHJcbn1cclxuIl19