@blinkk/root-cms 1.0.0-rc.38 → 1.0.0-rc.39
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/cli.js +31 -13
- package/dist/plugin.d.ts +0 -2
- package/dist/plugin.js +1 -1
- package/dist/ui/ui.css +10 -1
- package/dist/ui/ui.js +17 -5
- package/package.json +3 -3
package/dist/cli.js
CHANGED
|
@@ -196,6 +196,7 @@ function reindent(input) {
|
|
|
196
196
|
|
|
197
197
|
// cli/init-firebase.ts
|
|
198
198
|
import { loadRootConfig as loadRootConfig2 } from "@blinkk/root/node";
|
|
199
|
+
import { getFirestore as getFirestore2 } from "firebase-admin/firestore";
|
|
199
200
|
|
|
200
201
|
// core/client.ts
|
|
201
202
|
import crypto from "node:crypto";
|
|
@@ -276,24 +277,41 @@ async function applySecurityRules(projectId) {
|
|
|
276
277
|
|
|
277
278
|
// cli/init-firebase.ts
|
|
278
279
|
async function initFirebase(options) {
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
const rootConfig = await loadRootConfig2(rootDir, { command: "root-cms" });
|
|
285
|
-
const cmsPlugin = getCmsPlugin(rootConfig);
|
|
286
|
-
const cmsPluginOptions = cmsPlugin.getConfig();
|
|
287
|
-
gcpProjectId = cmsPluginOptions.firebaseConfig.projectId;
|
|
288
|
-
}
|
|
280
|
+
const rootDir = process.cwd();
|
|
281
|
+
const rootConfig = await loadRootConfig2(rootDir, { command: "root-cms" });
|
|
282
|
+
const cmsPlugin = getCmsPlugin(rootConfig);
|
|
283
|
+
const cmsPluginOptions = cmsPlugin.getConfig();
|
|
284
|
+
const gcpProjectId = options.project || cmsPluginOptions.firebaseConfig.projectId;
|
|
289
285
|
if (!gcpProjectId) {
|
|
290
286
|
throw new Error("firebaseConfig.projectId not set in cms plugin options");
|
|
291
287
|
}
|
|
292
288
|
console.log(`gcp project: ${gcpProjectId}`);
|
|
293
289
|
console.log("\u{1F46E} updating security rules...");
|
|
294
290
|
await applySecurityRules(gcpProjectId);
|
|
291
|
+
if (options.admin) {
|
|
292
|
+
const app = cmsPlugin.getFirebaseApp();
|
|
293
|
+
const db = getFirestore2(app);
|
|
294
|
+
const rootProjectId = cmsPluginOptions.id || "default";
|
|
295
|
+
await addAdmin(db, rootProjectId, options.admin);
|
|
296
|
+
}
|
|
295
297
|
console.log("done initializing firebase project!");
|
|
296
298
|
}
|
|
299
|
+
async function addAdmin(db, projectId, email) {
|
|
300
|
+
const dbPath = `Projects/${encodeURIComponent(projectId)}`;
|
|
301
|
+
const docRef = db.doc(dbPath);
|
|
302
|
+
const snapshot = await docRef.get();
|
|
303
|
+
let data;
|
|
304
|
+
if (snapshot.exists) {
|
|
305
|
+
data = snapshot.data() || {};
|
|
306
|
+
} else {
|
|
307
|
+
data = {};
|
|
308
|
+
}
|
|
309
|
+
const roles = data.roles ?? {};
|
|
310
|
+
roles[email] = "ADMIN";
|
|
311
|
+
data.roles = roles;
|
|
312
|
+
await docRef.set(data);
|
|
313
|
+
console.log(`added admin ${email} to project ${projectId}`);
|
|
314
|
+
}
|
|
297
315
|
|
|
298
316
|
// cli/cli.ts
|
|
299
317
|
var CliRunner = class {
|
|
@@ -313,8 +331,8 @@ var CliRunner = class {
|
|
|
313
331
|
);
|
|
314
332
|
}
|
|
315
333
|
});
|
|
316
|
-
program.command("init-firebase").description("inits the firebase project
|
|
317
|
-
program.command("generate-types").description(
|
|
334
|
+
program.command("init-firebase").description("inits the firebase project proper security rules").option("--project <project>", "gcp project id").option("--admin <email>", "adds an admin to the project").action(initFirebase);
|
|
335
|
+
program.command("generate-types").alias("types").description(
|
|
318
336
|
"generates root-cms.d.ts from *.schema.ts files in the project"
|
|
319
337
|
).action(generateTypes);
|
|
320
338
|
await program.parseAsync(argv);
|
|
@@ -325,4 +343,4 @@ export {
|
|
|
325
343
|
generateTypes,
|
|
326
344
|
initFirebase
|
|
327
345
|
};
|
|
328
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vY2xpL2NsaS50cyIsICIuLi9jbGkvZ2VuZXJhdGUtdHlwZXMudHMiLCAiLi4vY2xpL2luaXQtZmlyZWJhc2UudHMiLCAiLi4vY29yZS9jbGllbnQudHMiLCAiLi4vY29yZS9zZWN1cml0eS50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0IHtDb21tYW5kfSBmcm9tICdjb21tYW5kZXInO1xuaW1wb3J0IHtiZ0dyZWVuLCBibGFja30gZnJvbSAna2xldXIvY29sb3JzJztcbmltcG9ydCB7Z2VuZXJhdGVUeXBlc30gZnJvbSAnLi9nZW5lcmF0ZS10eXBlcy5qcyc7XG5pbXBvcnQge2luaXRGaXJlYmFzZX0gZnJvbSAnLi9pbml0LWZpcmViYXNlLmpzJztcblxuY2xhc3MgQ2xpUnVubmVyIHtcbiAgcHJpdmF0ZSBuYW1lOiBzdHJpbmc7XG4gIHByaXZhdGUgdmVyc2lvbjogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZywgdmVyc2lvbjogc3RyaW5nKSB7XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICB0aGlzLnZlcnNpb24gPSB2ZXJzaW9uO1xuICB9XG5cbiAgYXN5bmMgcnVuKGFyZ3Y6IHN0cmluZ1tdKSB7XG4gICAgY29uc3QgcHJvZ3JhbSA9IG5ldyBDb21tYW5kKHRoaXMubmFtZSk7XG4gICAgcHJvZ3JhbS52ZXJzaW9uKHRoaXMudmVyc2lvbik7XG4gICAgcHJvZ3JhbS5vcHRpb24oJy1xLCAtLXF1aWV0JywgJ3F1aWV0Jyk7XG4gICAgcHJvZ3JhbS5ob29rKCdwcmVBY3Rpb24nLCAoY21kKSA9PiB7XG4gICAgICBpZiAoIWNtZC5vcHRzKCkucXVpZXQpIHtcbiAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgYFx1RDgzRVx1REQ1NSAke2JnR3JlZW4oYmxhY2soYCAke3RoaXMubmFtZX0gYCkpfSB2JHt0aGlzLnZlcnNpb259XFxuYFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHByb2dyYW1cbiAgICAgIC5jb21tYW5kKCdpbml0LWZpcmViYXNlJylcbiAgICAgIC5kZXNjcmlwdGlvbignaW5pdHMgdGhlIGZpcmViYXNlIHByb2plY3Qgd2l0aCBwcm9wZXIgc2VjdXJpdHkgcnVsZXMnKVxuICAgICAgLm9wdGlvbignLS1wcm9qZWN0IDxwcm9qZWN0PicsICdnY3AgcHJvamVjdCBpZCcpXG4gICAgICAuYWN0aW9uKGluaXRGaXJlYmFzZSk7XG4gICAgcHJvZ3JhbVxuICAgICAgLmNvbW1hbmQoJ2dlbmVyYXRlLXR5cGVzJylcbiAgICAgIC5kZXNjcmlwdGlvbihcbiAgICAgICAgJ2dlbmVyYXRlcyByb290LWNtcy5kLnRzIGZyb20gKi5zY2hlbWEudHMgZmlsZXMgaW4gdGhlIHByb2plY3QnXG4gICAgICApXG4gICAgICAuYWN0aW9uKGdlbmVyYXRlVHlwZXMpO1xuICAgIGF3YWl0IHByb2dyYW0ucGFyc2VBc3luYyhhcmd2KTtcbiAgfVxufVxuXG5leHBvcnQge0NsaVJ1bm5lciwgZ2VuZXJhdGVUeXBlcywgaW5pdEZpcmViYXNlfTtcbiIsICJpbXBvcnQge3Byb21pc2VzIGFzIGZzfSBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQge2ZpbGVVUkxUb1BhdGh9IGZyb20gJ25vZGU6dXJsJztcbmltcG9ydCB7bG9hZFJvb3RDb25maWcsIHZpdGVTc3JMb2FkTW9kdWxlfSBmcm9tICdAYmxpbmtrL3Jvb3Qvbm9kZSc7XG5pbXBvcnQgKiBhcyBkb20gZnJvbSAnZHRzLWRvbSc7XG5cbmltcG9ydCB7RmllbGQsIFNjaGVtYX0gZnJvbSAnLi4vY29yZS9zY2hlbWEuanMnO1xuXG50eXBlIFByb2plY3RNb2R1bGUgPSB0eXBlb2YgaW1wb3J0KCcuLi9jb3JlL3Byb2plY3QuanMnKTtcbmNvbnN0IF9fZGlybmFtZSA9IHBhdGguZGlybmFtZShmaWxlVVJMVG9QYXRoKGltcG9ydC5tZXRhLnVybCkpO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVUeXBlcygpIHtcbiAgY29uc3Qgcm9vdERpciA9IHByb2Nlc3MuY3dkKCk7XG4gIGNvbnN0IHJvb3RDb25maWcgPSBhd2FpdCBsb2FkUm9vdENvbmZpZyhyb290RGlyLCB7Y29tbWFuZDogJ3Jvb3QtY21zJ30pO1xuICBjb25zdCBtb2R1bGVQYXRoID0gcGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgJy4vcHJvamVjdC5qcycpO1xuICBjb25zdCBwcm9qZWN0ID0gKGF3YWl0IHZpdGVTc3JMb2FkTW9kdWxlKFxuICAgIHJvb3RDb25maWcsXG4gICAgbW9kdWxlUGF0aFxuICApKSBhcyBQcm9qZWN0TW9kdWxlO1xuICBjb25zdCBzY2hlbWFzID0gcHJvamVjdC5nZXRQcm9qZWN0U2NoZW1hcygpO1xuICBjb25zb2xlLmxvZyhgZ2VuZXJhdGluZyByb290LWNtcy5kLnRzIGZyb20gJHtyb290RGlyfS4uLmApO1xuICBjb25zdCBvdXRwdXRQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3REaXIsICdyb290LWNtcy5kLnRzJyk7XG4gIGF3YWl0IGdlbmVyYXRlU2NoZW1hRHRzKG91dHB1dFBhdGgsIHNjaGVtYXMpO1xuICBjb25zb2xlLmxvZygnc2F2ZWQgcm9vdC1jbXMuZC50cyEnKTtcbn1cblxuY29uc3QgVEVNUExBVEUgPSBgLyoqIFJvb3QuanMgQ01TIHR5cGVzLiBUaGlzIGZpbGUgaXMgYXV0b2dlbmVyYXRlZC4gKi9cblxuZXhwb3J0IGludGVyZmFjZSBSb290Q01TSW1hZ2Uge1xuICBzcmM6IHN0cmluZztcbiAgd2lkdGg/OiBudW1iZXI7XG4gIGhlaWdodD86IG51bWJlcjtcbiAgYWx0Pzogc3RyaW5nO1xufVxuXG5leHBvcnQgdHlwZSBSb290Q01TT25lT2Y8VCA9IGFueT4gPSBUICYge1xuICBfdHlwZTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJvb3RDTVNSaWNoVGV4dEJsb2NrIHtcbiAgdHlwZTogc3RyaW5nO1xuICBkYXRhOiBhbnk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUm9vdENNU1JpY2hUZXh0IHtcbiAgYmxvY2tzOiBSb290Q01TUmljaFRleHRCbG9ja1tdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJvb3RDTVNSZWZlcmVuY2Uge1xuICAvKiogVGhlIGlkIG9mIHRoZSBkb2MsIGUuZy4gXCJQYWdlcy9mb28tYmFyXCIuICovXG4gIGlkOiBzdHJpbmc7XG4gIC8qKiBUaGUgY29sbGVjdGlvbiBpZCBvZiB0aGUgZG9jLCBlLmcuIFwiUGFnZXNcIi4gKi9cbiAgY29sbGVjdGlvbjogc3RyaW5nO1xuICAvKiogVGhlIHNsdWcgb2YgdGhlIGRvYywgZS5nLiBcImZvby1iYXJcIi4gKi9cbiAgc2x1Zzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJvb3RDTVNEb2M8RmllbGRzIGV4dGVuZHMge30+IHtcbiAgLyoqIFRoZSBpZCBvZiB0aGUgZG9jLCBlLmcuIFwiUGFnZXMvZm9vLWJhclwiLiAqL1xuICBpZDogc3RyaW5nO1xuICAvKiogVGhlIGNvbGxlY3Rpb24gaWQgb2YgdGhlIGRvYywgZS5nLiBcIlBhZ2VzXCIuICovXG4gIGNvbGxlY3Rpb246IHN0cmluZztcbiAgLyoqIFRoZSBzbHVnIG9mIHRoZSBkb2MsIGUuZy4gXCJmb28tYmFyXCIuICovXG4gIHNsdWc6IHN0cmluZztcbiAgLyoqIFN5c3RlbS1sZXZlbCBtZXRhZGF0YS4gKi9cbiAgc3lzOiB7XG4gICAgY3JlYXRlZEF0OiBudW1iZXI7XG4gICAgY3JlYXRlZEJ5OiBzdHJpbmc7XG4gICAgbW9kaWZpZWRBdDogbnVtYmVyO1xuICAgIG1vZGlmaWVkQnk6IHN0cmluZztcbiAgICBmaXJzdFB1Ymxpc2hlZEF0PzogbnVtYmVyO1xuICAgIGZpcnN0UHVibGlzaGVkQnk/OiBzdHJpbmc7XG4gICAgcHVibGlzaGVkQXQ/OiBudW1iZXI7XG4gICAgcHVibGlzaGVkQnk/OiBzdHJpbmc7XG4gICAgbG9jYWxlcz86IHN0cmluZ1tdO1xuICB9O1xuICAvKiogVXNlci1lbnRlcmVkIGZpZWxkIHZhbHVlcyBmcm9tIHRoZSBDTVMuICovXG4gIGZpZWxkcz86IEZpZWxkcztcbn1gO1xuXG4vKipcbiAqIEdlbmVyYXRlcyBhIHJvb3QtY21zLmQudHMgZmlsZSBmcm9tIHRoZSAuc2NoZW1hLnRzIGZpbGVzIGluIHRoZSBwcm9qZWN0LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVTY2hlbWFEdHMoXG4gIG91dHB1dFBhdGg6IHN0cmluZyxcbiAgc2NoZW1hczogUmVjb3JkPHN0cmluZywgU2NoZW1hPlxuKSB7XG4gIGNvbnN0IHJlc3VsdHMgPSBbVEVNUExBVEVdO1xuICBmb3IgKGNvbnN0IGZpbGVJZCBpbiBzY2hlbWFzKSB7XG4gICAgY29uc3Qgc2NoZW1hID0gc2NoZW1hc1tmaWxlSWRdO1xuICAgIHJlc3VsdHMucHVzaChyZW5kZXJTY2hlbWEoZmlsZUlkLCBzY2hlbWEpKTtcbiAgfVxuICBjb25zdCBvdXRwdXQgPSByZXN1bHRzXG4gICAgLmpvaW4oJ1xcblxcbicpXG4gICAgLnJlcGxhY2VBbGwoJy8qKiAgJywgJy8qKiAnKVxuICAgIC5yZXBsYWNlQWxsKCcgICovJywgJyAqLycpXG4gICAgLnJlcGxhY2UoL1xcclxcbnxcXHJ8XFxuL2csICdcXG4nKTtcbiAgYXdhaXQgZnMud3JpdGVGaWxlKG91dHB1dFBhdGgsIG91dHB1dCwgJ3V0Zi04Jyk7XG59XG5cbmZ1bmN0aW9uIGZpZWxkUHJvcGVydHkoZmllbGQ6IEZpZWxkKTogZG9tLlByb3BlcnR5RGVjbGFyYXRpb24ge1xuICBjb25zdCBwcm9wID0gZG9tLmNyZWF0ZS5wcm9wZXJ0eShcbiAgICBmaWVsZC5pZCEsXG4gICAgZmllbGRUeXBlKGZpZWxkKSxcbiAgICBkb20uRGVjbGFyYXRpb25GbGFncy5PcHRpb25hbFxuICApO1xuICBjb25zdCBqc2RvYyA9IFtdO1xuICBpZiAoZmllbGQubGFiZWwpIHtcbiAgICBpZiAoZmllbGQuaGVscCkge1xuICAgICAganNkb2MucHVzaChgJHtmaWVsZC5sYWJlbH0uICR7ZmllbGQuaGVscH1gKTtcbiAgICB9IGVsc2Uge1xuICAgICAganNkb2MucHVzaChmaWVsZC5sYWJlbCk7XG4gICAgfVxuICB9XG4gIGlmIChmaWVsZC5kZXByZWNhdGVkKSB7XG4gICAganNkb2MucHVzaCgnQGRlcHJlY2F0ZWQnKTtcbiAgfVxuICBpZiAoanNkb2MubGVuZ3RoID4gMCkge1xuICAgIHByb3AuanNEb2NDb21tZW50ID0ganNkb2Muam9pbignXFxuJyk7XG4gIH1cbiAgcmV0dXJuIHByb3A7XG59XG5cbmZ1bmN0aW9uIGZpZWxkVHlwZShmaWVsZDogRmllbGQpOiBkb20uVHlwZSB7XG4gIGlmIChmaWVsZC50eXBlID09PSAnYXJyYXknKSB7XG4gICAgcmV0dXJuIGRvbS50eXBlLmFycmF5KGZpZWxkVHlwZShmaWVsZC5vZikpO1xuICB9XG4gIGlmIChmaWVsZC50eXBlID09PSAnYm9vbGVhbicpIHtcbiAgICByZXR1cm4gZG9tLnR5cGUuYm9vbGVhbjtcbiAgfVxuICBpZiAoZmllbGQudHlwZSA9PT0gJ2RhdGUnKSB7XG4gICAgcmV0dXJuIGRvbS50eXBlLnN0cmluZztcbiAgfVxuICBpZiAoZmllbGQudHlwZSA9PT0gJ2RhdGV0aW1lJykge1xuICAgIHJldHVybiBkb20udHlwZS5udW1iZXI7XG4gIH1cbiAgaWYgKGZpZWxkLnR5cGUgPT09ICdpbWFnZScpIHtcbiAgICBjb25zdCBpbWFnZVR5cGUgPSBkb20uY3JlYXRlLm5hbWVkVHlwZVJlZmVyZW5jZSgnUm9vdENNU0ltYWdlJyk7XG4gICAgcmV0dXJuIGltYWdlVHlwZTtcbiAgfVxuICBpZiAoZmllbGQudHlwZSA9PT0gJ2ZpbGUnKSB7XG4gICAgcmV0dXJuIGRvbS5jcmVhdGUub2JqZWN0VHlwZShbZG9tLmNyZWF0ZS5wcm9wZXJ0eSgnc3JjJywgZG9tLnR5cGUuc3RyaW5nKV0pO1xuICB9XG4gIGlmIChmaWVsZC50eXBlID09PSAnbXVsdGlzZWxlY3QnKSB7XG4gICAgcmV0dXJuIGRvbS50eXBlLmFycmF5KGRvbS50eXBlLnN0cmluZyk7XG4gIH1cbiAgaWYgKGZpZWxkLnR5cGUgPT09ICdvbmVvZicpIHtcbiAgICBjb25zdCBvbmVvZlR5cGUgPSBkb20uY3JlYXRlLm5hbWVkVHlwZVJlZmVyZW5jZSgnUm9vdENNU09uZU9mJyk7XG4gICAgcmV0dXJuIG9uZW9mVHlwZTtcbiAgfVxuICBpZiAoZmllbGQudHlwZSA9PT0gJ3JlZmVyZW5jZScpIHtcbiAgICBjb25zdCByZWZlcmVuY2VUeXBlID0gZG9tLmNyZWF0ZS5uYW1lZFR5cGVSZWZlcmVuY2UoJ1Jvb3RDTVNSZWZlcmVuY2UnKTtcbiAgICByZXR1cm4gcmVmZXJlbmNlVHlwZTtcbiAgfVxuICBpZiAoZmllbGQudHlwZSA9PT0gJ3JpY2h0ZXh0Jykge1xuICAgIGNvbnN0IHJpY2h0ZXh0VHlwZSA9IGRvbS5jcmVhdGUubmFtZWRUeXBlUmVmZXJlbmNlKCdSb290Q01TUmljaFRleHQnKTtcbiAgICByZXR1cm4gcmljaHRleHRUeXBlO1xuICB9XG4gIGlmIChmaWVsZC50eXBlID09PSAnc2VsZWN0Jykge1xuICAgIHJldHVybiBkb20udHlwZS5zdHJpbmc7XG4gIH1cbiAgaWYgKGZpZWxkLnR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGRvbS50eXBlLnN0cmluZztcbiAgfVxuICBpZiAoZmllbGQudHlwZSA9PT0gJ29iamVjdCcpIHtcbiAgICBjb25zdCBzdWJwcm9wZXJ0aWVzID0gKGZpZWxkLmZpZWxkcyB8fCBbXSkubWFwKChmKSA9PiBmaWVsZFByb3BlcnR5KGYpKTtcbiAgICByZXR1cm4gZG9tLmNyZWF0ZS5vYmplY3RUeXBlKHN1YnByb3BlcnRpZXMpO1xuICB9XG4gIHJldHVybiBkb20udHlwZS51bmtub3duO1xufVxuXG5mdW5jdGlvbiByZW5kZXJTY2hlbWEoZmlsZUlkOiBzdHJpbmcsIHNjaGVtYTogU2NoZW1hKTogc3RyaW5nIHtcbiAgY29uc3QganNkb2MgPSBgR2VuZXJhdGVkIGZyb20gXFxgJHtmaWxlSWR9XFxgLmA7XG4gIGNvbnN0IGlkID0gcGF0aC5wYXJzZShmaWxlSWQpLm5hbWUuc3BsaXQoJy4nKVswXTtcbiAgY29uc3QgZmllbGRzSW50ZXJmYWNlID0gYCR7aWR9RmllbGRzYDtcbiAgY29uc3QgZmllbGRzID0gZG9tLmNyZWF0ZS5pbnRlcmZhY2UoXG4gICAgZmllbGRzSW50ZXJmYWNlLFxuICAgIGRvbS5EZWNsYXJhdGlvbkZsYWdzLkV4cG9ydFxuICApO1xuICBmaWVsZHMuanNEb2NDb21tZW50ID0ganNkb2M7XG4gIGZvciAoY29uc3QgZmllbGQgb2Ygc2NoZW1hLmZpZWxkcykge1xuICAgIGlmICghZmllbGQuaWQpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBmaWVsZHMubWVtYmVycy5wdXNoKGZpZWxkUHJvcGVydHkoZmllbGQpKTtcbiAgfVxuXG4gIGNvbnN0IGZpZWxkc1R5cGVPdXRwdXQgPSBkb21cbiAgICAuZW1pdChmaWVsZHMsIHtzaW5nbGVMaW5lSnNEb2NDb21tZW50czogdHJ1ZX0pXG4gICAgLnRyaW0oKTtcbiAgaWYgKGZpbGVJZC5zdGFydHNXaXRoKCcvY29sbGVjdGlvbnMvJykpIHtcbiAgICBjb25zdCBiYXNlVHlwZSA9IGRvbS5jcmVhdGUubmFtZWRUeXBlUmVmZXJlbmNlKCdSb290Q01TRG9jJyk7XG4gICAgYmFzZVR5cGUudHlwZUFyZ3VtZW50cy5wdXNoKGRvbS5jcmVhdGUubmFtZWRUeXBlUmVmZXJlbmNlKGZpZWxkc0ludGVyZmFjZSkpO1xuICAgIGNvbnN0IGRvY1R5cGUgPSBkb20uY3JlYXRlLmFsaWFzKFxuICAgICAgYCR7aWR9RG9jYCxcbiAgICAgIGJhc2VUeXBlLFxuICAgICAgZG9tLkRlY2xhcmF0aW9uRmxhZ3MuRXhwb3J0XG4gICAgKTtcbiAgICBkb2NUeXBlLmpzRG9jQ29tbWVudCA9IGpzZG9jO1xuXG4gICAgY29uc3QgZG9jVHlwZU91dHB1dCA9IGRvbVxuICAgICAgLmVtaXQoZG9jVHlwZSwge3NpbmdsZUxpbmVKc0RvY0NvbW1lbnRzOiB0cnVlfSlcbiAgICAgIC50cmltKCk7XG4gICAgcmV0dXJuIHJlaW5kZW50KGZpZWxkc1R5cGVPdXRwdXQgKyAnXFxuXFxuJyArIGRvY1R5cGVPdXRwdXQpO1xuICB9XG4gIHJldHVybiByZWluZGVudChmaWVsZHNUeXBlT3V0cHV0KTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyA0LXNwYWNlIGluZGVudHMgdG8gMi5cbiAqL1xuZnVuY3Rpb24gcmVpbmRlbnQoaW5wdXQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGxpbmVzID0gaW5wdXQuc3BsaXQoJ1xcbicpO1xuICBjb25zdCByZXN1bHRzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IGxpbmUgb2YgbGluZXMpIHtcbiAgICBjb25zdCBjb252ZXJ0ZWRMaW5lID0gbGluZS5yZXBsYWNlKC8gezR9L2csICcgICcpO1xuICAgIHJlc3VsdHMucHVzaChjb252ZXJ0ZWRMaW5lKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0cy5qb2luKCdcXG4nKTtcbn1cbiIsICJpbXBvcnQge1Jvb3RDb25maWd9IGZyb20gJ0BibGlua2svcm9vdCc7XG5cbmltcG9ydCB7bG9hZFJvb3RDb25maWd9IGZyb20gJ0BibGlua2svcm9vdC9ub2RlJztcbmltcG9ydCB7Z2V0Q21zUGx1Z2lufSBmcm9tICcuLi9jb3JlL2NsaWVudC5qcyc7XG5pbXBvcnQge2FwcGx5U2VjdXJpdHlSdWxlc30gZnJvbSAnLi4vY29yZS9zZWN1cml0eS5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW5pdEZpcmViYXNlT3B0aW9ucyB7XG4gIC8qKiBHQ1AgcHJvamVjdCBpZC4gKi9cbiAgcHJvamVjdD86IHN0cmluZztcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGluaXRGaXJlYmFzZShvcHRpb25zOiBJbml0RmlyZWJhc2VPcHRpb25zKSB7XG4gIGxldCBnY3BQcm9qZWN0SWQ6IHN0cmluZztcbiAgaWYgKG9wdGlvbnMucHJvamVjdCkge1xuICAgIGdjcFByb2plY3RJZCA9IG9wdGlvbnMucHJvamVjdDtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCByb290RGlyID0gcHJvY2Vzcy5jd2QoKTtcbiAgICBjb25zdCByb290Q29uZmlnID0gYXdhaXQgbG9hZFJvb3RDb25maWcocm9vdERpciwge2NvbW1hbmQ6ICdyb290LWNtcyd9KTtcbiAgICBjb25zdCBjbXNQbHVnaW4gPSBnZXRDbXNQbHVnaW4ocm9vdENvbmZpZyk7XG4gICAgY29uc3QgY21zUGx1Z2luT3B0aW9ucyA9IGNtc1BsdWdpbi5nZXRDb25maWcoKTtcbiAgICBnY3BQcm9qZWN0SWQgPSBjbXNQbHVnaW5PcHRpb25zLmZpcmViYXNlQ29uZmlnLnByb2plY3RJZDtcbiAgfVxuICBpZiAoIWdjcFByb2plY3RJZCkge1xuICAgIHRocm93IG5ldyBFcnJvcignZmlyZWJhc2VDb25maWcucHJvamVjdElkIG5vdCBzZXQgaW4gY21zIHBsdWdpbiBvcHRpb25zJyk7XG4gIH1cblxuICBjb25zb2xlLmxvZyhgZ2NwIHByb2plY3Q6ICR7Z2NwUHJvamVjdElkfWApO1xuICBjb25zb2xlLmxvZygnXHVEODNEXHVEQzZFIHVwZGF0aW5nIHNlY3VyaXR5IHJ1bGVzLi4uJyk7XG4gIGF3YWl0IGFwcGx5U2VjdXJpdHlSdWxlcyhnY3BQcm9qZWN0SWQpO1xuICBjb25zb2xlLmxvZygnZG9uZSBpbml0aWFsaXppbmcgZmlyZWJhc2UgcHJvamVjdCEnKTtcbn1cbiIsICJpbXBvcnQgY3J5cHRvIGZyb20gJ25vZGU6Y3J5cHRvJztcbmltcG9ydCB7UGx1Z2luLCBSb290Q29uZmlnfSBmcm9tICdAYmxpbmtrL3Jvb3QnO1xuaW1wb3J0IHtBcHB9IGZyb20gJ2ZpcmViYXNlLWFkbWluL2FwcCc7XG5pbXBvcnQge1xuICBGaWVsZFZhbHVlLFxuICBGaXJlc3RvcmUsXG4gIFF1ZXJ5LFxuICBUaW1lc3RhbXAsXG4gIFdyaXRlQmF0Y2gsXG4gIGdldEZpcmVzdG9yZSxcbn0gZnJvbSAnZmlyZWJhc2UtYWRtaW4vZmlyZXN0b3JlJztcbmltcG9ydCB7Q01TUGx1Z2lufSBmcm9tICcuL3BsdWdpbi5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRG9jPEZpZWxkcyA9IGFueT4ge1xuICAvKiogVGhlIGlkIG9mIHRoZSBkb2MsIGUuZy4gXCJQYWdlcy9mb28tYmFyXCIuICovXG4gIGlkOiBzdHJpbmc7XG4gIC8qKiBUaGUgY29sbGVjdGlvbiBpZCBvZiB0aGUgZG9jLCBlLmcuIFwiUGFnZXNcIi4gKi9cbiAgY29sbGVjdGlvbjogc3RyaW5nO1xuICAvKiogVGhlIHNsdWcgb2YgdGhlIGRvYywgZS5nLiBcImZvby1iYXJcIi4gKi9cbiAgc2x1Zzogc3RyaW5nO1xuICBzeXM6IHtcbiAgICBjcmVhdGVkQXQ6IG51bWJlcjtcbiAgICBjcmVhdGVkQnk6IHN0cmluZztcbiAgICBtb2RpZmllZEF0OiBudW1iZXI7XG4gICAgbW9kaWZpZWRCeTogc3RyaW5nO1xuICAgIGZpcnN0UHVibGlzaGVkQXQ/OiBudW1iZXI7XG4gICAgZmlyc3RQdWJsaXNoZWRCeT86IHN0cmluZztcbiAgICBwdWJsaXNoZWRBdD86IG51bWJlcjtcbiAgICBwdWJsaXNoZWRCeT86IHN0cmluZztcbiAgICBsb2NhbGVzPzogc3RyaW5nW107XG4gIH07XG4gIGZpZWxkczogRmllbGRzO1xufVxuXG5leHBvcnQgdHlwZSBEb2NNb2RlID0gJ2RyYWZ0JyB8ICdwdWJsaXNoZWQnO1xuXG5leHBvcnQgdHlwZSBIdHRwTWV0aG9kID0gJ0dFVCcgfCAnUE9TVCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGF0YVNvdXJjZSB7XG4gIGlkOiBzdHJpbmc7XG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICB0eXBlOiAnaHR0cCcgfCAnZ3NoZWV0JztcbiAgdXJsOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBDdXJyZW50bHkgb25seSB1c2VkIGJ5IGdzaGVldC4gYGFycmF5YCByZXR1cm5zIHRoZSBzaGVldCBhcyBhbiBhcnJheSBvZlxuICAgKiBhcnJheXMsIGBtYXBgIHJldHVybnMgdGhlIHNoZWV0IGFzIGFuIGFycmF5IG9mIG9iamVjdHMuXG4gICAqL1xuICBkYXRhRm9ybWF0PzogJ2FycmF5JyB8ICdtYXAnO1xuICAvKipcbiAgICogT3B0aW9ucyBmb3IgSFRUUCByZXF1ZXN0cy5cbiAgICovXG4gIGh0dHBPcHRpb25zPzoge1xuICAgIG1ldGhvZDogSHR0cE1ldGhvZDtcbiAgICBoZWFkZXJzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgICBib2R5Pzogc3RyaW5nO1xuICB9O1xuICBjcmVhdGVkQXQ6IFRpbWVzdGFtcDtcbiAgY3JlYXRlZEJ5OiBzdHJpbmc7XG4gIHN5bmNlZEF0PzogVGltZXN0YW1wO1xuICBzeW5jZWRCeT86IHN0cmluZztcbiAgcHVibGlzaGVkQXQ/OiBUaW1lc3RhbXA7XG4gIHB1Ymxpc2hlZEJ5Pzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERhdGFTb3VyY2VEYXRhPFQgPSBhbnk+IHtcbiAgZGF0YVNvdXJjZTogRGF0YVNvdXJjZTtcbiAgZGF0YTogVDtcbn1cblxuZXhwb3J0IHR5cGUgRGF0YVNvdXJjZU1vZGUgPSAnZHJhZnQnIHwgJ3B1Ymxpc2hlZCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2V0RG9jT3B0aW9ucyB7XG4gIC8qKiBNb2RlLCBlaXRoZXIgXCJkcmFmdFwiIG9yIFwicHVibGlzaGVkXCIuICovXG4gIG1vZGU6IERvY01vZGU7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2V0RG9jT3B0aW9ucyB7XG4gIC8qKiBNb2RlLCBlaXRoZXIgXCJkcmFmdFwiIG9yIFwicHVibGlzaGVkXCIuICovXG4gIG1vZGU6IERvY01vZGU7XG4gIC8qKlxuICAgKiBFbWFpbCBvZiB1c2VyIG1vZGlmeWluZyB0aGUgZG9jLiBJZiBibGFuaywgZGVmYXVsdHMgdG8gYHJvb3QtY21zLWNsaWVudGAuXG4gICAqL1xuICBtb2RpZmllZEJ5Pzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExpc3REb2NzT3B0aW9ucyB7XG4gIG1vZGU6IERvY01vZGU7XG4gIG9mZnNldD86IG51bWJlcjtcbiAgbGltaXQ/OiBudW1iZXI7XG4gIG9yZGVyQnk/OiBzdHJpbmc7XG4gIG9yZGVyQnlEaXJlY3Rpb24/OiAnYXNjJyB8ICdkZXNjJztcbiAgcXVlcnk/OiAocXVlcnk6IFF1ZXJ5KSA9PiBRdWVyeTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBHZXRDb3VudE9wdGlvbnMge1xuICBtb2RlOiBEb2NNb2RlO1xuICBxdWVyeT86IChxdWVyeTogUXVlcnkpID0+IFF1ZXJ5O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zbGF0aW9uIHtcbiAgW2xvY2FsZTogc3RyaW5nXTogc3RyaW5nO1xuICBzb3VyY2U6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2xhdGlvbnNNYXAge1xuICBbaGFzaDogc3RyaW5nXTogVHJhbnNsYXRpb247XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTG9jYWxlVHJhbnNsYXRpb25zIHtcbiAgW3NvdXJjZTogc3RyaW5nXTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExvYWRUcmFuc2xhdGlvbnNPcHRpb25zIHtcbiAgdGFncz86IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlbGVhc2Uge1xuICBpZDogc3RyaW5nO1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgZG9jSWRzPzogc3RyaW5nW107XG4gIGNyZWF0ZWRBdD86IFRpbWVzdGFtcDtcbiAgY3JlYXRlZEJ5Pzogc3RyaW5nO1xuICBzY2hlZHVsZWRBdD86IFRpbWVzdGFtcDtcbiAgc2NoZWR1bGVkQnk/OiBzdHJpbmc7XG4gIHB1Ymxpc2hlZEF0PzogVGltZXN0YW1wO1xuICBwdWJsaXNoZWRCeT86IHN0cmluZztcbn1cblxuZXhwb3J0IGNsYXNzIFJvb3RDTVNDbGllbnQge1xuICBwcml2YXRlIHJlYWRvbmx5IHJvb3RDb25maWc6IFJvb3RDb25maWc7XG4gIHByaXZhdGUgcmVhZG9ubHkgY21zUGx1Z2luOiBDTVNQbHVnaW47XG4gIHByaXZhdGUgcmVhZG9ubHkgcHJvamVjdElkOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGI6IEZpcmVzdG9yZTtcblxuICBjb25zdHJ1Y3Rvcihyb290Q29uZmlnOiBSb290Q29uZmlnKSB7XG4gICAgdGhpcy5yb290Q29uZmlnID0gcm9vdENvbmZpZztcbiAgICB0aGlzLmNtc1BsdWdpbiA9IGdldENtc1BsdWdpbih0aGlzLnJvb3RDb25maWcpO1xuXG4gICAgY29uc3QgY21zUGx1Z2luT3B0aW9ucyA9IHRoaXMuY21zUGx1Z2luLmdldENvbmZpZygpO1xuICAgIHRoaXMucHJvamVjdElkID0gY21zUGx1Z2luT3B0aW9ucy5pZCB8fCAnZGVmYXVsdCc7XG4gICAgdGhpcy5hcHAgPSB0aGlzLmNtc1BsdWdpbi5nZXRGaXJlYmFzZUFwcCgpO1xuICAgIHRoaXMuZGIgPSBnZXRGaXJlc3RvcmUodGhpcy5hcHApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyBkb2MgZGF0YSBmcm9tIFJvb3QuanMgQ01TLlxuICAgKi9cbiAgYXN5bmMgZ2V0RG9jPEZpZWxkcyA9IGFueT4oXG4gICAgY29sbGVjdGlvbklkOiBzdHJpbmcsXG4gICAgc2x1Zzogc3RyaW5nLFxuICAgIG9wdGlvbnM6IEdldERvY09wdGlvbnNcbiAgKTogUHJvbWlzZTxEb2M8RmllbGRzPiB8IG51bGw+IHtcbiAgICBjb25zdCByYXdEYXRhID0gYXdhaXQgdGhpcy5nZXRSYXdEb2MoY29sbGVjdGlvbklkLCBzbHVnLCBvcHRpb25zKTtcbiAgICBpZiAocmF3RGF0YSkge1xuICAgICAgcmV0dXJuIHVubWFyc2hhbERhdGEocmF3RGF0YSkgYXMgRG9jPEZpZWxkcz47XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyByYXcgZG9jIGRhdGEgYXMgc3RvcmVkIGluIHRoZSBkYXRhYmFzZS4gT25seSB1c2UgdGhpcyBpZiB5b3Uga25vd1xuICAgKiB3aGF0IHlvdSBhcmUgZG9pbmcuXG4gICAqL1xuICBhc3luYyBnZXRSYXdEb2MoXG4gICAgY29sbGVjdGlvbklkOiBzdHJpbmcsXG4gICAgc2x1Zzogc3RyaW5nLFxuICAgIG9wdGlvbnM6IEdldERvY09wdGlvbnNcbiAgKTogUHJvbWlzZTxhbnkgfCBudWxsPiB7XG4gICAgY29uc3QgbW9kZSA9IG9wdGlvbnMubW9kZTtcbiAgICBjb25zdCBtb2RlQ29sbGVjdGlvbiA9IG1vZGUgPT09ICdkcmFmdCcgPyAnRHJhZnRzJyA6ICdQdWJsaXNoZWQnO1xuICAgIC8vIFNsdWdzIHdpdGggc2xhc2hlcyBhcmUgZW5jb2RlZCBhcyBgLS1gIGluIHRoZSBEQi5cbiAgICBzbHVnID0gc2x1Zy5yZXBsYWNlQWxsKCcvJywgJy0tJyk7XG4gICAgY29uc3QgZGJQYXRoID0gYFByb2plY3RzLyR7dGhpcy5wcm9qZWN0SWR9L0NvbGxlY3Rpb25zLyR7Y29sbGVjdGlvbklkfS8ke21vZGVDb2xsZWN0aW9ufS8ke3NsdWd9YDtcbiAgICBjb25zdCBkb2NSZWYgPSB0aGlzLmRiLmRvYyhkYlBhdGgpO1xuICAgIGNvbnN0IGRvYyA9IGF3YWl0IGRvY1JlZi5nZXQoKTtcbiAgICBpZiAoZG9jLmV4aXN0cykge1xuICAgICAgcmV0dXJuIGRvYy5kYXRhKCk7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgYXN5bmMgc2V0UmF3RG9jKFxuICAgIGNvbGxlY3Rpb25JZDogc3RyaW5nLFxuICAgIHNsdWc6IHN0cmluZyxcbiAgICBkYXRhOiBhbnksXG4gICAgb3B0aW9uczogU2V0RG9jT3B0aW9uc1xuICApIHtcbiAgICBjb25zdCBtb2RlID0gb3B0aW9ucy5tb2RlO1xuICAgIGNvbnN0IG1vZGVDb2xsZWN0aW9uID0gbW9kZSA9PT0gJ2RyYWZ0JyA/ICdEcmFmdHMnIDogJ1B1Ymxpc2hlZCc7XG4gICAgY29uc3QgZGJQYXRoID0gYFByb2plY3RzLyR7dGhpcy5wcm9qZWN0SWR9L0NvbGxlY3Rpb25zLyR7Y29sbGVjdGlvbklkfS8ke21vZGVDb2xsZWN0aW9ufS8ke3NsdWd9YDtcbiAgICBjb25zdCBkb2NSZWYgPSB0aGlzLmRiLmRvYyhkYlBhdGgpO1xuICAgIGF3YWl0IGRvY1JlZi5zZXQoZGF0YSk7XG4gIH1cblxuICAvKipcbiAgICogTGlzdHMgZG9jcyBmcm9tIGEgUm9vdC5qcyBDTVMgY29sbGVjdGlvbi5cbiAgICovXG4gIGFzeW5jIGxpc3REb2NzPFQ+KFxuICAgIGNvbGxlY3Rpb25JZDogc3RyaW5nLFxuICAgIG9wdGlvbnM6IExpc3REb2NzT3B0aW9uc1xuICApOiBQcm9taXNlPHtkb2NzOiBUW119PiB7XG4gICAgY29uc3QgbW9kZSA9IG9wdGlvbnMubW9kZTtcbiAgICBjb25zdCBtb2RlQ29sbGVjdGlvbiA9IG1vZGUgPT09ICdkcmFmdCcgPyAnRHJhZnRzJyA6ICdQdWJsaXNoZWQnO1xuICAgIGNvbnN0IGRiUGF0aCA9IGBQcm9qZWN0cy8ke3RoaXMucHJvamVjdElkfS9Db2xsZWN0aW9ucy8ke2NvbGxlY3Rpb25JZH0vJHttb2RlQ29sbGVjdGlvbn1gO1xuICAgIGxldCBxdWVyeTogUXVlcnkgPSB0aGlzLmRiLmNvbGxlY3Rpb24oZGJQYXRoKTtcbiAgICBpZiAob3B0aW9ucy5saW1pdCkge1xuICAgICAgcXVlcnkgPSBxdWVyeS5saW1pdChvcHRpb25zLmxpbWl0KTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMub2Zmc2V0KSB7XG4gICAgICBxdWVyeSA9IHF1ZXJ5Lm9mZnNldChvcHRpb25zLm9mZnNldCk7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLm9yZGVyQnkpIHtcbiAgICAgIHF1ZXJ5ID0gcXVlcnkub3JkZXJCeShvcHRpb25zLm9yZGVyQnksIG9wdGlvbnMub3JkZXJCeURpcmVjdGlvbik7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLnF1ZXJ5KSB7XG4gICAgICBxdWVyeSA9IG9wdGlvbnMucXVlcnkocXVlcnkpO1xuICAgIH1cbiAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgcXVlcnkuZ2V0KCk7XG4gICAgY29uc3QgZG9jczogVFtdID0gW107XG4gICAgcmVzdWx0cy5mb3JFYWNoKChyZXN1bHQpID0+IHtcbiAgICAgIGNvbnN0IGRvYyA9IHVubWFyc2hhbERhdGEocmVzdWx0LmRhdGEoKSkgYXMgVDtcbiAgICAgIGRvY3MucHVzaChkb2MpO1xuICAgIH0pO1xuICAgIHJldHVybiB7ZG9jc307XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGRvY3MgaW4gYSBSb290LmpzIENNUyBjb2xsZWN0aW9uLlxuICAgKi9cbiAgYXN5bmMgZ2V0RG9jc0NvdW50KGNvbGxlY3Rpb25JZDogc3RyaW5nLCBvcHRpb25zOiBHZXRDb3VudE9wdGlvbnMpIHtcbiAgICBjb25zdCBtb2RlID0gb3B0aW9ucy5tb2RlO1xuICAgIGNvbnN0IG1vZGVDb2xsZWN0aW9uID0gbW9kZSA9PT0gJ2RyYWZ0JyA/ICdEcmFmdHMnIDogJ1B1Ymxpc2hlZCc7XG4gICAgY29uc3QgZGJQYXRoID0gYFByb2plY3RzLyR7dGhpcy5wcm9qZWN0SWR9L0NvbGxlY3Rpb25zLyR7Y29sbGVjdGlvbklkfS8ke21vZGVDb2xsZWN0aW9ufWA7XG4gICAgbGV0IHF1ZXJ5OiBRdWVyeSA9IHRoaXMuZGIuY29sbGVjdGlvbihkYlBhdGgpO1xuICAgIGlmIChvcHRpb25zLnF1ZXJ5KSB7XG4gICAgICBxdWVyeSA9IG9wdGlvbnMucXVlcnkocXVlcnkpO1xuICAgIH1cbiAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgcXVlcnkuY291bnQoKS5nZXQoKTtcbiAgICBjb25zdCBjb3VudCA9IHJlc3VsdHMuZGF0YSgpLmNvdW50O1xuICAgIHJldHVybiBjb3VudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBCYXRjaCBwdWJsaXNoZXMgYSBzZXQgb2YgZG9jcyBieSBpZC5cbiAgICovXG4gIGFzeW5jIHB1Ymxpc2hEb2NzKFxuICAgIGRvY0lkczogc3RyaW5nW10sXG4gICAgb3B0aW9ucz86IHtwdWJsaXNoZWRCeTogc3RyaW5nOyBiYXRjaD86IFdyaXRlQmF0Y2h9XG4gICkge1xuICAgIGNvbnN0IHByb2plY3RDb2xsZWN0aW9uc1BhdGggPSBgUHJvamVjdHMvJHt0aGlzLnByb2plY3RJZH0vQ29sbGVjdGlvbnNgO1xuICAgIGNvbnN0IHB1Ymxpc2hlZEJ5ID0gb3B0aW9ucz8ucHVibGlzaGVkQnkgfHwgJ3Jvb3QtY21zLWNsaWVudCc7XG5cbiAgICAvLyBGZXRjaCB0aGUgY3VycmVudCBkcmFmdCBkYXRhIGZvciBlYWNoIGRvYy5cbiAgICBjb25zdCBkb2NSZWZzID0gZG9jSWRzLm1hcCgoZG9jSWQpID0+IHtcbiAgICAgIGNvbnN0IFtjb2xsZWN0aW9uLCBzbHVnXSA9IGRvY0lkLnNwbGl0KCcvJyk7XG4gICAgICBpZiAoIWNvbGxlY3Rpb24gfHwgIXNsdWcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIGRvYyBpZDogJHtkb2NJZH1gKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGRvY1JlZiA9IHRoaXMuZGIuZG9jKFxuICAgICAgICBgJHtwcm9qZWN0Q29sbGVjdGlvbnNQYXRofS8ke2NvbGxlY3Rpb259L0RyYWZ0cy8ke3NsdWd9YFxuICAgICAgKTtcbiAgICAgIHJldHVybiBkb2NSZWY7XG4gICAgfSk7XG4gICAgY29uc3QgZG9jU25hcHNob3RzID0gYXdhaXQgdGhpcy5kYi5nZXRBbGwoLi4uZG9jUmVmcyk7XG4gICAgY29uc3QgZG9jcyA9IGRvY1NuYXBzaG90c1xuICAgICAgLy8gUmV0cmlldmUgc25hcHNob3QgZGF0YSBmb3IgZWFjaCBkb2MuXG4gICAgICAubWFwKChzbmFwc2hvdCkgPT4gc25hcHNob3QuZGF0YSgpIGFzIERvYylcbiAgICAgIC8vIFJlbW92ZSBkb2NzIHRoYXQgZG9uJ3QgZXhpc3QuXG4gICAgICAuZmlsdGVyKChkKSA9PiAhIWQpO1xuXG4gICAgaWYgKGRvY3MubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb25zb2xlLmxvZygnbm8gZG9jcyB0byBwdWJsaXNoJyk7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgLy8gLy8gRWFjaCB0cmFuc2FjdGlvbiBvciBiYXRjaCBjYW4gd3JpdGUgYSBtYXggb2YgNTAwIG9wcy5cbiAgICAvLyAvLyBodHRwczovL2ZpcmViYXNlLmdvb2dsZS5jb20vZG9jcy9maXJlc3RvcmUvbWFuYWdlLWRhdGEvdHJhbnNhY3Rpb25zXG4gICAgbGV0IGJhdGNoQ291bnQgPSAwO1xuICAgIGNvbnN0IGJhdGNoID0gb3B0aW9ucz8uYmF0Y2ggfHwgdGhpcy5kYi5iYXRjaCgpO1xuICAgIGNvbnN0IHB1Ymxpc2hlZERvY3M6IGFueVtdID0gW107XG4gICAgZm9yIChjb25zdCBkb2Mgb2YgZG9jcykge1xuICAgICAgY29uc3Qge2lkLCBjb2xsZWN0aW9uLCBzbHVnLCBzeXMsIGZpZWxkc30gPSBkb2M7XG4gICAgICBjb25zdCBkcmFmdFJlZiA9IHRoaXMuZGIuZG9jKFxuICAgICAgICBgJHtwcm9qZWN0Q29sbGVjdGlvbnNQYXRofS8ke2NvbGxlY3Rpb259L0RyYWZ0cy8ke3NsdWd9YFxuICAgICAgKTtcbiAgICAgIGNvbnN0IHNjaGVkdWxlZFJlZiA9IHRoaXMuZGIuZG9jKFxuICAgICAgICBgJHtwcm9qZWN0Q29sbGVjdGlvbnNQYXRofS8ke2NvbGxlY3Rpb259L1NjaGVkdWxlZC8ke3NsdWd9YFxuICAgICAgKTtcbiAgICAgIGNvbnN0IHB1Ymxpc2hlZFJlZiA9IHRoaXMuZGIuZG9jKFxuICAgICAgICBgJHtwcm9qZWN0Q29sbGVjdGlvbnNQYXRofS8ke2NvbGxlY3Rpb259L1B1Ymxpc2hlZC8ke3NsdWd9YFxuICAgICAgKTtcblxuICAgICAgLy8gT25seSB1cGRhdGUgYGZpcnN0UHVibGlzaGVkYCBpZiBpdCBkb2Vzbid0IGFscmVhZHkgZXhpc3QuXG4gICAgICBjb25zdCBmaXJzdFB1Ymxpc2hlZEF0ID1cbiAgICAgICAgc3lzLmZpcnN0UHVibGlzaGVkQXQgPz8gRmllbGRWYWx1ZS5zZXJ2ZXJUaW1lc3RhbXAoKTtcbiAgICAgIGNvbnN0IGZpcnN0UHVibGlzaGVkQnkgPSBzeXMuZmlyc3RQdWJsaXNoZWRCeSA/PyBwdWJsaXNoZWRCeTtcblxuICAgICAgLy8gU2F2ZSBwdWJsaXNoZWQgZG9jLlxuICAgICAgYmF0Y2guc2V0KHB1Ymxpc2hlZFJlZiwge1xuICAgICAgICBpZCxcbiAgICAgICAgY29sbGVjdGlvbixcbiAgICAgICAgc2x1ZyxcbiAgICAgICAgZmllbGRzOiBmaWVsZHMgfHwge30sXG4gICAgICAgIHN5czoge1xuICAgICAgICAgIC4uLnN5cyxcbiAgICAgICAgICBmaXJzdFB1Ymxpc2hlZEF0OiBmaXJzdFB1Ymxpc2hlZEF0LFxuICAgICAgICAgIGZpcnN0UHVibGlzaGVkQnk6IGZpcnN0UHVibGlzaGVkQnksXG4gICAgICAgICAgcHVibGlzaGVkQXQ6IEZpZWxkVmFsdWUuc2VydmVyVGltZXN0YW1wKCksXG4gICAgICAgICAgcHVibGlzaGVkQnk6IHB1Ymxpc2hlZEJ5LFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgICBiYXRjaENvdW50ICs9IDE7XG5cbiAgICAgIC8vIFJlbW92ZSBzY2hlZHVsZWQgZG9jLCBpZiBhbnkuXG4gICAgICBiYXRjaC5kZWxldGUoc2NoZWR1bGVkUmVmKTtcbiAgICAgIGJhdGNoQ291bnQgKz0gMTtcblxuICAgICAgLy8gVXBkYXRlIHRoZSBkcmFmdCBkb2MgdG8gcmVtb3ZlIGBzY2hlZHVsZWRBdGAgYW5kIGBzY2hlZHVsZWRCeWAgZmllbGRzXG4gICAgICAvLyBhbmQgdXBkYXRlIHRoZSBgcHVibGlzaGVkQXRgIGFuZCBgcHVibGlzaGVkQnlgIGZpZWxkcy5cbiAgICAgIGJhdGNoLnVwZGF0ZShkcmFmdFJlZiwge1xuICAgICAgICAnc3lzLnNjaGVkdWxlZEF0JzogRmllbGRWYWx1ZS5kZWxldGUoKSxcbiAgICAgICAgJ3N5cy5zY2hlZHVsZWRCeSc6IEZpZWxkVmFsdWUuZGVsZXRlKCksXG4gICAgICAgICdzeXMuZmlyc3RQdWJsaXNoZWRBdCc6IGZpcnN0UHVibGlzaGVkQXQsXG4gICAgICAgICdzeXMuZmlyc3RQdWJsaXNoZWRCeSc6IGZpcnN0UHVibGlzaGVkQnksXG4gICAgICAgICdzeXMucHVibGlzaGVkQXQnOiBGaWVsZFZhbHVlLnNlcnZlclRpbWVzdGFtcCgpLFxuICAgICAgICAnc3lzLnB1Ymxpc2hlZEJ5JzogcHVibGlzaGVkQnksXG4gICAgICB9KTtcbiAgICAgIGJhdGNoQ291bnQgKz0gMTtcblxuICAgICAgcHVibGlzaGVkRG9jcy5wdXNoKGRvYyk7XG5cbiAgICAgIGlmIChiYXRjaENvdW50ID49IDQwMCkge1xuICAgICAgICBhd2FpdCBiYXRjaC5jb21taXQoKTtcbiAgICAgICAgYmF0Y2hDb3VudCA9IDA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGJhdGNoQ291bnQgPiAwKSB7XG4gICAgICBhd2FpdCBiYXRjaC5jb21taXQoKTtcbiAgICB9XG4gICAgY29uc29sZS5sb2coYHB1Ymxpc2hlZCAke3B1Ymxpc2hlZERvY3MubGVuZ3RofSBkb2NzIWApO1xuICAgIHJldHVybiBwdWJsaXNoZWREb2NzO1xuICB9XG5cbiAgLyoqXG4gICAqIFB1Ymxpc2hlcyBzY2hlZHVsZWQgZG9jcy5cbiAgICovXG4gIGFzeW5jIHB1Ymxpc2hTY2hlZHVsZWREb2NzKCkge1xuICAgIGNvbnN0IHByb2plY3RDb2xsZWN0aW9uc1BhdGggPSBgUHJvamVjdHMvJHt0aGlzLnByb2plY3RJZH0vQ29sbGVjdGlvbnNgO1xuICAgIGNvbnN0IG5vdyA9IE1hdGguY2VpbChuZXcgRGF0ZSgpLmdldFRpbWUoKSk7XG5cbiAgICBjb25zdCBzbmFwc2hvdCA9IGF3YWl0IHRoaXMuZGIuY29sbGVjdGlvbkdyb3VwKCdTY2hlZHVsZWQnKS5nZXQoKTtcbiAgICBjb25zdCBkb2NzID0gc25hcHNob3QuZG9jc1xuICAgICAgLmZpbHRlcigoZCkgPT4ge1xuICAgICAgICAvLyBGaWx0ZXIgZG9jcyBieSBwcm9qZWN0LlxuICAgICAgICBpZiAoIWQucmVmLnBhdGguc3RhcnRzV2l0aChwcm9qZWN0Q29sbGVjdGlvbnNQYXRoKSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBGaWx0ZXIgZG9jcyB3aGVyZSBzY2hlZHVsZWRBdCBpcyBpbiB0aGUgcGFzdC5cbiAgICAgICAgLy8gTk9URShzdGV2ZW5sZSk6IHRoZSBmaWx0ZXJpbmcgaXMgZG9uZSBtYW51YWxseSBpbnN0ZWFkIG9mIHVzaW5nIGEgcXVlcnlcbiAgICAgICAgLy8gdG8gYXZvaWQgaGF2aW5nIHRvIGNyZWF0ZSBhbiBpbmRleCBpbiBmaXJlc3RvcmUuXG4gICAgICAgIGNvbnN0IGRhdGEgPSBkLmRhdGEoKSB8fCB7fTtcbiAgICAgICAgY29uc3Qgc2NoZWR1bGVkQXQ6IFRpbWVzdGFtcCB8IHVuZGVmaW5lZCA9IGRhdGEuc3lzPy5zY2hlZHVsZWRBdDtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICBzY2hlZHVsZWRBdCAmJiBzY2hlZHVsZWRBdC50b01pbGxpcyAmJiBzY2hlZHVsZWRBdC50b01pbGxpcygpIDw9IG5vd1xuICAgICAgICApO1xuICAgICAgfSlcbiAgICAgIC5tYXAoKGQpID0+IHtcbiAgICAgICAgY29uc3QgZGJQYXRoID0gZC5yZWYucGF0aDtcbiAgICAgICAgY29uc3Qgc2VnbWVudHMgPSBkYlBhdGguc3BsaXQoJy8nKTtcbiAgICAgICAgY29uc3Qgc2x1ZyA9IHNlZ21lbnRzLmF0KC0xKTtcbiAgICAgICAgY29uc3QgY29sbGVjdGlvbiA9IHNlZ21lbnRzLmF0KC0zKTtcbiAgICAgICAgY29uc3QgaWQgPSBgJHtjb2xsZWN0aW9ufS8ke3NsdWd9YDtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBkYXRhOiBkLmRhdGEoKSxcbiAgICAgICAgICBpZCxcbiAgICAgICAgICBjb2xsZWN0aW9uLFxuICAgICAgICAgIHNsdWcsXG4gICAgICAgIH07XG4gICAgICB9KTtcblxuICAgIGlmIChkb2NzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29uc29sZS5sb2coJ25vIGRvY3MgdG8gc2NoZWR1bGUnKTtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICAvLyBFYWNoIHRyYW5zYWN0aW9uIG9yIGJhdGNoIGNhbiB3cml0ZSBhIG1heCBvZiA1MDAgb3BzLlxuICAgIC8vIGh0dHBzOi8vZmlyZWJhc2UuZ29vZ2xlLmNvbS9kb2NzL2ZpcmVzdG9yZS9tYW5hZ2UtZGF0YS90cmFuc2FjdGlvbnNcbiAgICBsZXQgYmF0Y2hDb3VudCA9IDA7XG4gICAgY29uc3QgYmF0Y2ggPSB0aGlzLmRiLmJhdGNoKCk7XG4gICAgY29uc3QgcHVibGlzaGVkRG9jczogYW55W10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGRvYyBvZiBkb2NzKSB7XG4gICAgICBjb25zdCB7aWQsIGNvbGxlY3Rpb24sIHNsdWcsIGRhdGF9ID0gZG9jO1xuICAgICAgY29uc3QgZHJhZnRSZWYgPSB0aGlzLmRiLmRvYyhcbiAgICAgICAgYCR7cHJvamVjdENvbGxlY3Rpb25zUGF0aH0vJHtjb2xsZWN0aW9ufS9EcmFmdHMvJHtzbHVnfWBcbiAgICAgICk7XG4gICAgICBjb25zdCBzY2hlZHVsZWRSZWYgPSB0aGlzLmRiLmRvYyhcbiAgICAgICAgYCR7cHJvamVjdENvbGxlY3Rpb25zUGF0aH0vJHtjb2xsZWN0aW9ufS9TY2hlZHVsZWQvJHtzbHVnfWBcbiAgICAgICk7XG4gICAgICBjb25zdCBwdWJsaXNoZWRSZWYgPSB0aGlzLmRiLmRvYyhcbiAgICAgICAgYCR7cHJvamVjdENvbGxlY3Rpb25zUGF0aH0vJHtjb2xsZWN0aW9ufS9QdWJsaXNoZWQvJHtzbHVnfWBcbiAgICAgICk7XG4gICAgICBjb25zdCB7c2NoZWR1bGVkQXQsIHNjaGVkdWxlZEJ5LCAuLi5zeXN9ID0gZGF0YS5zeXMgfHwge307XG5cbiAgICAgIC8vIE9ubHkgdXBkYXRlIGBmaXJzdFB1Ymxpc2hlZGAgaWYgaXQgZG9lc24ndCBhbHJlYWR5IGV4aXN0LlxuICAgICAgY29uc3QgZmlyc3RQdWJsaXNoZWRBdCA9IHN5cy5maXJzdFB1Ymxpc2hlZEF0ID8/IHNjaGVkdWxlZEF0O1xuICAgICAgY29uc3QgZmlyc3RQdWJsaXNoZWRCeSA9XG4gICAgICAgIHN5cy5maXJzdFB1Ymxpc2hlZEJ5ID8/IChzY2hlZHVsZWRCeSB8fCAncm9vdC1jbXMtY2xpZW50Jyk7XG5cbiAgICAgIC8vIFNhdmUgcHVibGlzaGVkIGRvYy5cbiAgICAgIGJhdGNoLnNldChwdWJsaXNoZWRSZWYsIHtcbiAgICAgICAgaWQsXG4gICAgICAgIGNvbGxlY3Rpb24sXG4gICAgICAgIHNsdWcsXG4gICAgICAgIGZpZWxkczogZGF0YS5maWVsZHMgfHwge30sXG4gICAgICAgIHN5czoge1xuICAgICAgICAgIC4uLnN5cyxcbiAgICAgICAgICBmaXJzdFB1Ymxpc2hlZEF0OiBmaXJzdFB1Ymxpc2hlZEF0LFxuICAgICAgICAgIGZpcnN0UHVibGlzaGVkQnk6IGZpcnN0UHVibGlzaGVkQnksXG4gICAgICAgICAgcHVibGlzaGVkQXQ6IEZpZWxkVmFsdWUuc2VydmVyVGltZXN0YW1wKCksXG4gICAgICAgICAgcHVibGlzaGVkQnk6IHNjaGVkdWxlZEJ5IHx8ICcnLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgICBiYXRjaENvdW50ICs9IDE7XG5cbiAgICAgIC8vIFJlbW92ZSBwdWJsaXNoZWQgZG9jLlxuICAgICAgYmF0Y2guZGVsZXRlKHNjaGVkdWxlZFJlZik7XG4gICAgICBiYXRjaENvdW50ICs9IDE7XG5cbiAgICAgIC8vIFVwZGF0ZSB0aGUgZHJhZnQgZG9jIHRvIHJlbW92ZSBgc2NoZWR1bGVkQXRgIGFuZCBgc2NoZWR1bGVkQnlgIGZpZWxkc1xuICAgICAgLy8gYW5kIHVwZGF0ZSB0aGUgYHB1Ymxpc2hlZEF0YCBhbmQgYHB1Ymxpc2hlZEJ5YCBmaWVsZHMuXG4gICAgICBiYXRjaC51cGRhdGUoZHJhZnRSZWYsIHtcbiAgICAgICAgJ3N5cy5zY2hlZHVsZWRBdCc6IEZpZWxkVmFsdWUuZGVsZXRlKCksXG4gICAgICAgICdzeXMuc2NoZWR1bGVkQnknOiBGaWVsZFZhbHVlLmRlbGV0ZSgpLFxuICAgICAgICAnc3lzLmZpcnN0UHVibGlzaGVkQXQnOiBmaXJzdFB1Ymxpc2hlZEF0LFxuICAgICAgICAnc3lzLmZpcnN0UHVibGlzaGVkQnknOiBmaXJzdFB1Ymxpc2hlZEJ5LFxuICAgICAgICAnc3lzLnB1Ymxpc2hlZEF0JzogRmllbGRWYWx1ZS5zZXJ2ZXJUaW1lc3RhbXAoKSxcbiAgICAgICAgJ3N5cy5wdWJsaXNoZWRCeSc6IHNjaGVkdWxlZEJ5IHx8ICdyb290LWNtcy1jbGllbnQnLFxuICAgICAgfSk7XG4gICAgICBiYXRjaENvdW50ICs9IDE7XG5cbiAgICAgIHB1Ymxpc2hlZERvY3MucHVzaChkb2MpO1xuXG4gICAgICBpZiAoYmF0Y2hDb3VudCA+PSA0MDApIHtcbiAgICAgICAgYXdhaXQgYmF0Y2guY29tbWl0KCk7XG4gICAgICAgIGJhdGNoQ291bnQgPSAwO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoYmF0Y2hDb3VudCA+IDApIHtcbiAgICAgIGF3YWl0IGJhdGNoLmNvbW1pdCgpO1xuICAgIH1cbiAgICBjb25zb2xlLmxvZyhgcHVibGlzaGVkICR7cHVibGlzaGVkRG9jcy5sZW5ndGh9IGRvY3MhYCk7XG4gICAgcmV0dXJuIHB1Ymxpc2hlZERvY3M7XG4gIH1cblxuICAvKipcbiAgICogUHVibGlzaGVzIGRvY3MgaW4gc2NoZWR1bGVkIHJlbGVhc2VzLlxuICAgKi9cbiAgYXN5bmMgcHVibGlzaFNjaGVkdWxlZFJlbGVhc2VzKCkge1xuICAgIGNvbnN0IHJlbGVhc2VzUGF0aCA9IGBQcm9qZWN0cy8ke3RoaXMucHJvamVjdElkfS9SZWxlYXNlc2A7XG4gICAgY29uc3Qgbm93ID0gTWF0aC5jZWlsKG5ldyBEYXRlKCkuZ2V0VGltZSgpKTtcbiAgICBjb25zdCBxdWVyeTogUXVlcnkgPSB0aGlzLmRiXG4gICAgICAuY29sbGVjdGlvbihyZWxlYXNlc1BhdGgpXG4gICAgICAud2hlcmUoJ3NjaGVkdWxlZEF0JywgJzw9JywgVGltZXN0YW1wLmZyb21NaWxsaXMobm93KSk7XG4gICAgY29uc3QgcXVlcnlTbmFwc2hvdCA9IGF3YWl0IHF1ZXJ5LmdldCgpO1xuXG4gICAgZm9yIChjb25zdCBzbmFwc2hvdCBvZiBxdWVyeVNuYXBzaG90LmRvY3MpIHtcbiAgICAgIGNvbnN0IHJlbGVhc2UgPSBzbmFwc2hvdC5kYXRhKCkgYXMgUmVsZWFzZTtcbiAgICAgIGNvbnN0IGJhdGNoID0gdGhpcy5kYi5iYXRjaCgpO1xuICAgICAgY29uc3QgcHVibGlzaGVkQnkgPSByZWxlYXNlLnNjaGVkdWxlZEJ5IHx8ICdyb290LWNtcy1jbGllbnQnO1xuICAgICAgYmF0Y2gudXBkYXRlKHNuYXBzaG90LnJlZiwge1xuICAgICAgICBwdWJsaXNoZWRBdDogVGltZXN0YW1wLm5vdygpLFxuICAgICAgICBwdWJsaXNoZWRCeTogcHVibGlzaGVkQnksXG4gICAgICAgIHNjaGVkdWxlZEF0OiBGaWVsZFZhbHVlLmRlbGV0ZSgpLFxuICAgICAgICBzY2hlZHVsZWRCeTogRmllbGRWYWx1ZS5kZWxldGUoKSxcbiAgICAgIH0pO1xuICAgICAgYXdhaXQgdGhpcy5wdWJsaXNoRG9jcyhyZWxlYXNlLmRvY0lkcyB8fCBbXSwge3B1Ymxpc2hlZEJ5LCBiYXRjaH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkcyB0cmFuc2xhdGlvbnMgc2F2ZWQgaW4gdGhlIHRyYW5zbGF0aW9ucyBjb2xsZWN0aW9uLCBvcHRpb25hbGx5XG4gICAqIGZpbHRlcmVkIGJ5IHRhZy5cbiAgICpcbiAgICogUmV0dXJucyBhIG1hcCBsaWtlOlxuICAgKiBgYGBcbiAgICoge1xuICAgKiAgIFwiPGhhc2g+XCI6IHtcInNvdXJjZVwiOiBcIkhlbGxvXCIsIFwiZXNcIjogXCJIb2xhXCIsIFwiZnJcIjogXCJCb25qb3VyXCJ9LFxuICAgKiB9XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgbG9hZFRyYW5zbGF0aW9ucyhcbiAgICBvcHRpb25zPzogTG9hZFRyYW5zbGF0aW9uc09wdGlvbnNcbiAgKTogUHJvbWlzZTxUcmFuc2xhdGlvbnNNYXA+IHtcbiAgICBjb25zdCBkYlBhdGggPSBgUHJvamVjdHMvJHt0aGlzLnByb2plY3RJZH0vVHJhbnNsYXRpb25zYDtcbiAgICBsZXQgcXVlcnk6IFF1ZXJ5ID0gdGhpcy5kYi5jb2xsZWN0aW9uKGRiUGF0aCk7XG4gICAgaWYgKG9wdGlvbnM/LnRhZ3MpIHtcbiAgICAgIHF1ZXJ5ID0gcXVlcnkud2hlcmUoJ3RhZ3MnLCAnYXJyYXktY29udGFpbnMtYW55Jywgb3B0aW9ucy50YWdzKTtcbiAgICB9XG5cbiAgICBjb25zdCBxdWVyeVNuYXBzaG90ID0gYXdhaXQgcXVlcnkuZ2V0KCk7XG4gICAgY29uc3QgdHJhbnNsYXRpb25zTWFwOiBUcmFuc2xhdGlvbnNNYXAgPSB7fTtcbiAgICBxdWVyeVNuYXBzaG90LmZvckVhY2goKGRvYykgPT4ge1xuICAgICAgY29uc3QgaGFzaCA9IGRvYy5pZDtcbiAgICAgIHRyYW5zbGF0aW9uc01hcFtoYXNoXSA9IGRvYy5kYXRhKCkgYXMgVHJhbnNsYXRpb247XG4gICAgfSk7XG4gICAgcmV0dXJuIHRyYW5zbGF0aW9uc01hcDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTYXZlcyBhIG1hcCBvZiB0cmFuc2xhdGlvbnMsIGUuZy46XG4gICAqIGBgYFxuICAgKiBhd2FpdCBjbGllbnQuc2F2ZVRyYW5zbGF0aW9ucyh7XG4gICAqICAgXCJIZWxsb1wiOiB7XCJlc1wiOiBcIkhvbGFcIiwgXCJmclwiOiBcIkJvbmpvdXJcIn0sXG4gICAqIH0pO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIHNhdmVUcmFuc2xhdGlvbnMoXG4gICAgdHJhbnNsYXRpb25zOiB7XG4gICAgICBbc291cmNlOiBzdHJpbmddOiB7W2xvY2FsZTogc3RyaW5nXTogc3RyaW5nfTtcbiAgICB9LFxuICAgIHRhZ3M/OiBzdHJpbmdbXVxuICApIHtcbiAgICBjb25zdCB0cmFuc2xhdGlvbnNQYXRoID0gYFByb2plY3RzLyR7dGhpcy5wcm9qZWN0SWR9L1RyYW5zbGF0aW9uc2A7XG4gICAgY29uc3QgYmF0Y2ggPSB0aGlzLmRiLmJhdGNoKCk7XG4gICAgbGV0IGJhdGNoQ291bnQgPSAwO1xuICAgIE9iamVjdC5lbnRyaWVzKHRyYW5zbGF0aW9ucykuZm9yRWFjaCgoW3NvdXJjZSwgc291cmNlVHJhbnNsYXRpb25zXSkgPT4ge1xuICAgICAgY29uc3QgaGFzaCA9IHRoaXMuZ2V0VHJhbnNsYXRpb25LZXkoc291cmNlKTtcbiAgICAgIGNvbnN0IHRyYW5zbGF0aW9uUmVmID0gdGhpcy5kYi5kb2MoYCR7dHJhbnNsYXRpb25zUGF0aH0vJHtoYXNofWApO1xuICAgICAgY29uc3QgZGF0YTogYW55ID0ge1xuICAgICAgICAuLi5zb3VyY2VUcmFuc2xhdGlvbnMsXG4gICAgICAgIHNvdXJjZTogdGhpcy5ub3JtYWxpemVTdHJpbmcoc291cmNlKSxcbiAgICAgIH07XG4gICAgICBpZiAodGFncykge1xuICAgICAgICBkYXRhLnRhZ3MgPSB0YWdzO1xuICAgICAgfVxuICAgICAgYmF0Y2gudXBkYXRlKHRyYW5zbGF0aW9uUmVmLCBkYXRhKTtcbiAgICAgIGJhdGNoQ291bnQgKz0gMTtcbiAgICB9KTtcbiAgICBpZiAoYmF0Y2hDb3VudCA+IDUwMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd1cCB0byA1MDAgdHJhbnNsYXRpb25zIGNhbiBiZSBzYXZlZCBhdCBhIHRpbWUuJyk7XG4gICAgfVxuICAgIGF3YWl0IGJhdGNoLmNvbW1pdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIFwia2V5XCIgdXNlZCBmb3IgYSB0cmFuc2xhdGlvbiBhcyBzdG9yZWQgaW4gdGhlIGRiLiBUcmFuc2xhdGlvbnNcbiAgICogYXJlIHN0b3JlZCB1bmRlciBgUHJvamVjdHMvPHByb2plY3QgaWQ+L1RyYW5zbGF0aW9ucy88c2hhMSBoYXNoPmAuXG4gICAqL1xuICBnZXRUcmFuc2xhdGlvbktleShzb3VyY2U6IHN0cmluZykge1xuICAgIGNvbnN0IHNoYTEgPSBjcnlwdG9cbiAgICAgIC5jcmVhdGVIYXNoKCdzaGExJylcbiAgICAgIC51cGRhdGUodGhpcy5ub3JtYWxpemVTdHJpbmcoc291cmNlKSlcbiAgICAgIC5kaWdlc3QoJ2hleCcpO1xuICAgIHJldHVybiBzaGExO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFucyBhIHN0cmluZyB0aGF0J3MgdXNlZCBmb3IgdHJhbnNsYXRpb25zLiBQZXJmb3JtcyB0aGUgZm9sbG93aW5nOlxuICAgKiAtIFJlbW92ZXMgYW55IGxlYWRpbmcvdHJhaWxpbmcgd2hpdGVzcGFjZVxuICAgKiAtIFJlbW92ZXMgc3BhY2VzIGF0IHRoZSBlbmQgb2YgYW55IGxpbmVcbiAgICovXG4gIG5vcm1hbGl6ZVN0cmluZyhzdHI6IHN0cmluZykge1xuICAgIGNvbnN0IGxpbmVzID0gU3RyaW5nKHN0cilcbiAgICAgIC50cmltKClcbiAgICAgIC5zcGxpdCgnXFxuJylcbiAgICAgIC5tYXAoKGxpbmUpID0+IGxpbmUudHJpbUVuZCgpKTtcbiAgICByZXR1cm4gbGluZXMuam9pbignXFxuJyk7XG4gIH1cblxuICAvKipcbiAgICogTG9hZHMgdHJhbnNsYXRpb25zIGZvciBhIHBhcnRpY3VsYXIgbG9jYWxlLlxuICAgKlxuICAgKiBSZXR1cm5zIGEgbWFwIGxpa2U6XG4gICAqIGBgYFxuICAgKiB7XG4gICAqICAgXCJIZWxsb1wiOiBcIkJvbmpvdXJcIixcbiAgICogfVxuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGxvYWRUcmFuc2xhdGlvbnNGb3JMb2NhbGUoXG4gICAgbG9jYWxlOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IExvYWRUcmFuc2xhdGlvbnNPcHRpb25zXG4gICk6IFByb21pc2U8TG9jYWxlVHJhbnNsYXRpb25zPiB7XG4gICAgY29uc3QgdHJhbnNsYXRpb25zTWFwID0gYXdhaXQgdGhpcy5sb2FkVHJhbnNsYXRpb25zKG9wdGlvbnMpO1xuICAgIHJldHVybiB0cmFuc2xhdGlvbnNGb3JMb2NhbGUodHJhbnNsYXRpb25zTWFwLCBsb2NhbGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBkYXRhIHNvdXJjZSBjb25maWd1cmF0aW9uIG9iamVjdC5cbiAgICovXG4gIGFzeW5jIGdldERhdGFTb3VyY2UoZGF0YVNvdXJjZUlkOiBzdHJpbmcpIHtcbiAgICBjb25zdCBkYlBhdGggPSBgUHJvamVjdHMvJHt0aGlzLnByb2plY3RJZH0vRGF0YVNvdXJjZXMvJHtkYXRhU291cmNlSWR9YDtcbiAgICBjb25zdCBkb2NSZWYgPSB0aGlzLmRiLmRvYyhkYlBhdGgpO1xuICAgIGNvbnN0IGRvYyA9IGF3YWl0IGRvY1JlZi5nZXQoKTtcbiAgICBpZiAoZG9jLmV4aXN0cykge1xuICAgICAgcmV0dXJuIGRvYy5kYXRhKCkgYXMgRGF0YVNvdXJjZTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKipcbiAgICogU3luY3MgYSBkYXRhIHNvdXJjZSB0byBkcmFmdCBzdGF0ZS5cbiAgICovXG4gIGFzeW5jIHN5bmNEYXRhU291cmNlKGRhdGFTb3VyY2VJZDogc3RyaW5nLCBvcHRpb25zPzoge3N5bmNlZEJ5Pzogc3RyaW5nfSkge1xuICAgIGNvbnN0IGRhdGFTb3VyY2UgPSBhd2FpdCB0aGlzLmdldERhdGFTb3VyY2UoZGF0YVNvdXJjZUlkKTtcbiAgICBpZiAoIWRhdGFTb3VyY2UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgZGF0YSBzb3VyY2Ugbm90IGZvdW5kOiAke2RhdGFTb3VyY2VJZH1gKTtcbiAgICB9XG5cbiAgICBjb25zdCBkYXRhID0gYXdhaXQgdGhpcy5mZXRjaERhdGEoZGF0YVNvdXJjZSk7XG5cbiAgICBjb25zdCBkYXRhU291cmNlRG9jUmVmID0gdGhpcy5kYi5kb2MoXG4gICAgICBgUHJvamVjdHMvJHt0aGlzLnByb2plY3RJZH0vRGF0YVNvdXJjZXMvJHtkYXRhU291cmNlSWR9YFxuICAgICk7XG4gICAgY29uc3QgZGF0YURvY1JlZiA9IHRoaXMuZGIuZG9jKFxuICAgICAgYFByb2plY3RzLyR7dGhpcy5wcm9qZWN0SWR9L0RhdGFTb3VyY2VzLyR7ZGF0YVNvdXJjZUlkfS9EYXRhL2RyYWZ0YFxuICAgICk7XG4gICAgY29uc3Qgc3luY2VkQnkgPSBvcHRpb25zPy5zeW5jZWRCeSB8fCAncm9vdC1jbXMtY2xpZW50JztcblxuICAgIGNvbnN0IHVwZGF0ZWREYXRhU291cmNlOiBEYXRhU291cmNlID0ge1xuICAgICAgLi4uZGF0YVNvdXJjZSxcbiAgICAgIHN5bmNlZEF0OiBUaW1lc3RhbXAubm93KCksXG4gICAgICBzeW5jZWRCeTogc3luY2VkQnksXG4gICAgfTtcblxuICAgIGNvbnN0IGJhdGNoID0gdGhpcy5kYi5iYXRjaCgpO1xuICAgIGJhdGNoLnNldChkYXRhRG9jUmVmLCB7XG4gICAgICBkYXRhU291cmNlOiB1cGRhdGVkRGF0YVNvdXJjZSxcbiAgICAgIGRhdGE6IGRhdGEsXG4gICAgfSk7XG4gICAgYmF0Y2gudXBkYXRlKGRhdGFTb3VyY2VEb2NSZWYsIHtcbiAgICAgIHN5bmNlZEF0OiBUaW1lc3RhbXAubm93KCksXG4gICAgICBzeW5jZWRCeTogc3luY2VkQnksXG4gICAgfSk7XG4gICAgYXdhaXQgYmF0Y2guY29tbWl0KCk7XG5cbiAgICBjb25zb2xlLmxvZyhgc3luY2VkIGRhdGEgc291cmNlOiAke2RhdGFTb3VyY2VJZH1gKTtcbiAgICBjb25zb2xlLmxvZyhgc3luY2VkIGJ5OiAke3N5bmNlZEJ5fWApO1xuICB9XG5cbiAgYXN5bmMgcHVibGlzaERhdGFTb3VyY2UoXG4gICAgZGF0YVNvdXJjZUlkOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IHtwdWJsaXNoZWRCeT86IHN0cmluZ31cbiAgKSB7XG4gICAgY29uc3QgZGF0YVNvdXJjZSA9IGF3YWl0IHRoaXMuZ2V0RGF0YVNvdXJjZShkYXRhU291cmNlSWQpO1xuICAgIGlmICghZGF0YVNvdXJjZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBkYXRhIHNvdXJjZSBub3QgZm91bmQ6ICR7ZGF0YVNvdXJjZUlkfWApO1xuICAgIH1cblxuICAgIGNvbnN0IGRhdGFTb3VyY2VEb2NSZWYgPSB0aGlzLmRiLmRvYyhcbiAgICAgIGBQcm9qZWN0cy8ke3RoaXMucHJvamVjdElkfS9EYXRhU291cmNlcy8ke2RhdGFTb3VyY2VJZH1gXG4gICAgKTtcbiAgICBjb25zdCBkYXRhRG9jUmVmRHJhZnQgPSB0aGlzLmRiLmRvYyhcbiAgICAgIGBQcm9qZWN0cy8ke3RoaXMucHJvamVjdElkfS9EYXRhU291cmNlcy8ke2RhdGFTb3VyY2VJZH0vZHJhZnRgXG4gICAgKTtcbiAgICBjb25zdCBkYXRhRG9jUmVmUHVibGlzaGVkID0gdGhpcy5kYi5kb2MoXG4gICAgICBgUHJvamVjdHMvJHt0aGlzLnByb2plY3RJZH0vRGF0YVNvdXJjZXMvJHtkYXRhU291cmNlSWR9L3B1Ymxpc2hlZGBcbiAgICApO1xuXG4gICAgY29uc3QgZGF0YVJlcyA9IGF3YWl0IHRoaXMuZ2V0RnJvbURhdGFTb3VyY2UoZGF0YVNvdXJjZUlkLCB7bW9kZTogJ2RyYWZ0J30pO1xuXG4gICAgY29uc3QgcHVibGlzaGVkQnkgPSBvcHRpb25zPy5wdWJsaXNoZWRCeSB8fCAncm9vdC1jbXMtY2xpZW50JztcblxuICAgIGNvbnN0IHVwZGF0ZWREYXRhU291cmNlOiBEYXRhU291cmNlID0ge1xuICAgICAgLi4uZGF0YVNvdXJjZSxcbiAgICAgIHB1Ymxpc2hlZEF0OiBUaW1lc3RhbXAubm93KCksXG4gICAgICBwdWJsaXNoZWRCeTogcHVibGlzaGVkQnksXG4gICAgfTtcblxuICAgIGNvbnN0IGJhdGNoID0gdGhpcy5kYi5iYXRjaCgpO1xuICAgIGJhdGNoLnNldChkYXRhRG9jUmVmUHVibGlzaGVkLCB7XG4gICAgICBkYXRhU291cmNlOiB1cGRhdGVkRGF0YVNvdXJjZSxcbiAgICAgIGRhdGE6IGRhdGFSZXM/LmRhdGEgfHwgbnVsbCxcbiAgICB9KTtcbiAgICBiYXRjaC51cGRhdGUoZGF0YURvY1JlZkRyYWZ0LCB7XG4gICAgICBkYXRhU291cmNlOiB1cGRhdGVkRGF0YVNvdXJjZSxcbiAgICB9KTtcbiAgICBiYXRjaC51cGRhdGUoZGF0YVNvdXJjZURvY1JlZiwge1xuICAgICAgcHVibGlzaGVkQXQ6IFRpbWVzdGFtcC5ub3coKSxcbiAgICAgIHB1Ymxpc2hlZEJ5OiBwdWJsaXNoZWRCeSxcbiAgICB9KTtcbiAgICBhd2FpdCBiYXRjaC5jb21taXQoKTtcblxuICAgIGNvbnNvbGUubG9nKGBwdWJsaXNoZWQgZGF0YSAke2RhdGFTb3VyY2VJZH1gKTtcbiAgICBjb25zb2xlLmxvZyhgcHVibGlzaGVkIGJ5OiAke3B1Ymxpc2hlZEJ5fWApO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBmZXRjaERhdGEoZGF0YVNvdXJjZTogRGF0YVNvdXJjZSkge1xuICAgIGlmIChkYXRhU291cmNlLnR5cGUgPT09ICdodHRwJykge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZmV0Y2hIdHRwRGF0YShkYXRhU291cmNlKTtcbiAgICB9XG4gICAgLy8gVE9ETyhzdGV2ZW5sZSk6IGltcGwuXG4gICAgLy8gaWYgKGRhdGFTb3VyY2UudHlwZSA9PT0gJ2dzaGVldCcpIHtcbiAgICAvLyAgIHJldHVybiBhd2FpdCBmZXRjaEdzaGVldERhdGEoZGF0YVNvdXJjZSk7XG4gICAgLy8gfVxuICAgIHRocm93IG5ldyBFcnJvcihgdW5zdXBwb3J0ZWQgZGF0YSBzb3VyY2U6ICR7ZGF0YVNvdXJjZS50eXBlfWApO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBmZXRjaEh0dHBEYXRhKGRhdGFTb3VyY2U6IERhdGFTb3VyY2UpIHtcbiAgICBjb25zdCB1cmwgPSBkYXRhU291cmNlLnVybCB8fCAnJztcbiAgICBpZiAoIXVybC5zdGFydHNXaXRoKCdodHRwczovLycpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYHVybCBub3Qgc3VwcG9ydGVkOiAke3VybH1gKTtcbiAgICB9XG5cbiAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCh1cmwsIHtcbiAgICAgIG1ldGhvZDogZGF0YVNvdXJjZS5odHRwT3B0aW9ucz8ubWV0aG9kIHx8ICdHRVQnLFxuICAgICAgaGVhZGVyczogZGF0YVNvdXJjZS5odHRwT3B0aW9ucz8uaGVhZGVycyB8fCBbXSxcbiAgICAgIGJvZHk6IGRhdGFTb3VyY2UuaHR0cE9wdGlvbnM/LmJvZHkgfHwgdW5kZWZpbmVkLFxuICAgIH0pO1xuXG4gICAgaWYgKHJlcy5zdGF0dXMgIT09IDIwMCkge1xuICAgICAgY29uc3QgZXJyID0gYXdhaXQgcmVzLnRleHQoKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgcmVxIGZhaWxlZDogJHtlcnJ9YCk7XG4gICAgfVxuXG4gICAgY29uc3QgY29udGVudFR5cGUgPSBTdHJpbmcocmVzLmhlYWRlcnMuZ2V0KCdjb250ZW50LXR5cGUnKSk7XG4gICAgaWYgKGNvbnRlbnRUeXBlLmluY2x1ZGVzKCdhcHBsaWNhdGlvbi9qc29uJykpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXMuanNvbigpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzLnRleHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaGVzIGRhdGEgZnJvbSBhIGRhdGEgc291cmNlLlxuICAgKi9cbiAgYXN5bmMgZ2V0RnJvbURhdGFTb3VyY2U8VCA9IGFueT4oXG4gICAgZGF0YVNvdXJjZUlkOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IHttb2RlPzogJ2RyYWZ0JyB8ICdwdWJsaXNoZWQnfVxuICApOiBQcm9taXNlPERhdGFTb3VyY2VEYXRhPFQ+IHwgbnVsbD4ge1xuICAgIGNvbnN0IG1vZGUgPSBvcHRpb25zPy5tb2RlIHx8ICdwdWJsaXNoZWQnO1xuICAgIGlmICghKG1vZGUgPT09ICdkcmFmdCcgfHwgbW9kZSA9PT0gJ3B1Ymxpc2hlZCcpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgbW9kZTogJHttb2RlfWApO1xuICAgIH1cbiAgICBpZiAoIWRhdGFTb3VyY2VJZCB8fCBkYXRhU291cmNlSWQuaW5jbHVkZXMoJy8nKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIGRhdGEgc291cmNlIGlkOiAke2RhdGFTb3VyY2VJZH1gKTtcbiAgICB9XG5cbiAgICBjb25zdCBkYlBhdGggPSBgUHJvamVjdHMvJHt0aGlzLnByb2plY3RJZH0vRGF0YVNvdXJjZXMvJHtkYXRhU291cmNlSWR9L0RhdGEvJHttb2RlfWA7XG4gICAgY29uc3QgZG9jUmVmID0gdGhpcy5kYi5kb2MoZGJQYXRoKTtcbiAgICBjb25zdCBkb2MgPSBhd2FpdCBkb2NSZWYuZ2V0KCk7XG4gICAgaWYgKGRvYy5leGlzdHMpIHtcbiAgICAgIHJldHVybiBkb2MuZGF0YSgpIGFzIERhdGFTb3VyY2VEYXRhPFQ+O1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmllcyB1c2VyIGV4aXN0cyBpbiB0aGUgQUNMIGxpc3QuXG4gICAqL1xuICBhc3luYyB1c2VyRXhpc3RzSW5BY2woZW1haWw6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGlmICghZW1haWwpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgZG9jUmVmID0gdGhpcy5kYi5kb2MoYFByb2plY3RzLyR7dGhpcy5wcm9qZWN0SWR9YCk7XG4gICAgY29uc3Qgc25hcHNob3QgPSBhd2FpdCBkb2NSZWYuZ2V0KCk7XG4gICAgY29uc3QgZGF0YSA9IHNuYXBzaG90LmRhdGEoKSB8fCB7fTtcbiAgICBjb25zdCBhY2wgPSBkYXRhLnJvbGVzIHx8IHt9O1xuICAgIGlmIChlbWFpbCBpbiBhY2wpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8vIENoZWNrIHdpbGRjYXJkIGRvbWFpbnMsIGUuZy4gYCpAZXhhbXBsZS5jb21gLlxuICAgIGlmICghZW1haWwuaW5jbHVkZXMoJ0AnKSkge1xuICAgICAgY29uc29sZS53YXJuKGBpbnZhbGlkIGVtYWlsOiAke2VtYWlsfWApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBkb21haW4gPSBlbWFpbC5zcGxpdCgnQCcpLmF0KC0xKTtcbiAgICBpZiAoZG9tYWluICYmIGAqQCR7ZG9tYWlufWAgaW4gYWNsKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDbXNQbHVnaW4ocm9vdENvbmZpZzogUm9vdENvbmZpZyk6IENNU1BsdWdpbiB7XG4gIGNvbnN0IHBsdWdpbnM6IFBsdWdpbltdID0gcm9vdENvbmZpZy5wbHVnaW5zIHx8IFtdO1xuICBjb25zdCBwbHVnaW4gPSBwbHVnaW5zLmZpbmQoKHBsdWdpbikgPT4gcGx1Z2luLm5hbWUgPT09ICdyb290LWNtcycpO1xuICBpZiAoIXBsdWdpbikge1xuICAgIHRocm93IG5ldyBFcnJvcignY291bGQgbm90IGZpbmQgcm9vdC1jbXMgcGx1Z2luIGNvbmZpZyBpbiByb290LmNvbmZpZy50cycpO1xuICB9XG4gIHJldHVybiBwbHVnaW4gYXMgQ01TUGx1Z2luO1xufVxuXG4vKipcbiAqIFdhbGtzIHRoZSBkYXRhIHRyZWUgYW5kIGNvbnZlcnRzIGFueSBUaW1lc3RhbXAgb2JqZWN0cyB0byBtaWxsaXMgYW5kIGFueVxuICogX2FycmF5IG1hcHMgdG8gbm9ybWFsIGFycmF5cy5cbiAqXG4gKiBFLmcuOlxuICpcbiAqIG5vcm1hbGl6ZURhdGEoe1xuICogICBzeXM6IHttb2RpZmllZEF0OiBUaW1lc3RhbXAoMTIzKX0sXG4gKiAgIGZpZWxkczoge1xuICogICAgIF9hcnJheTogWydhc2RmJ10sXG4gKiAgICAgYXNkZjoge3RpdGxlOiAnaGVsbG8nfVxuICogICB9XG4gKiB9KVxuICogLy8gPT4ge3N5czoge21vZGlmaWVkQXQ6IDEyM30sIGZpZWxkczoge2ZvbzogW3t0aXRsZTogJ2hlbGxvJ31dfX1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVubWFyc2hhbERhdGEoZGF0YTogYW55KTogYW55IHtcbiAgY29uc3QgcmVzdWx0OiBhbnkgPSB7fTtcbiAgZm9yIChjb25zdCBrZXkgaW4gZGF0YSkge1xuICAgIGNvbnN0IHZhbCA9IGRhdGFba2V5XTtcbiAgICBpZiAoaXNPYmplY3QodmFsKSkge1xuICAgICAgaWYgKHZhbC50b01pbGxpcykge1xuICAgICAgICByZXN1bHRba2V5XSA9IHZhbC50b01pbGxpcygpO1xuICAgICAgfSBlbHNlIGlmIChPYmplY3QuaGFzT3duKHZhbCwgJ19hcnJheScpICYmIEFycmF5LmlzQXJyYXkodmFsLl9hcnJheSkpIHtcbiAgICAgICAgY29uc3QgYXJyID0gdmFsLl9hcnJheS5tYXAoKGFycmF5S2V5OiBzdHJpbmcpID0+IHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4udW5tYXJzaGFsRGF0YSh2YWxbYXJyYXlLZXldIHx8IHt9KSxcbiAgICAgICAgICAgIF9hcnJheUtleTogYXJyYXlLZXksXG4gICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJlc3VsdFtrZXldID0gYXJyO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0W2tleV0gPSB1bm1hcnNoYWxEYXRhKHZhbCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdFtrZXldID0gdmFsO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKiogQGRlcHJlY2F0ZWQgVXNlIGB1bm1hcnNoYWxEYXRhKClgIGluc3RlYWQuICovXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplRGF0YShkYXRhOiBhbnkpOiBhbnkge1xuICByZXR1cm4gdW5tYXJzaGFsRGF0YShkYXRhKTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBcnJheU9iamVjdCB7XG4gIFtrZXk6IHN0cmluZ106IGFueTtcbiAgX2FycmF5OiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBTZXJpYWxpemVzIGFuIGFycmF5IGludG8gYW4gYEFycmF5T2JqZWN0YCwgZS5nLjpcbiAqXG4gKiBgYGBcbiAqIG1hcnNoYWxBcnJheShbMSwgMiwgM10pXG4gKiAvLyA9PiB7YTogMSwgYjogMiwgYzogMywgX2FycmF5OiBbJ2EnLCAnYicsICdjJ119XG4gKiBgYGBcbiAqXG4gKiBUaGlzIGRhdGFiYXNlIHN0b3JhZ2UgbWV0aG9kIG1ha2VzIGl0IGVhc2llciB0byB1cGRhdGUgYSBzaW5nbGUgZmllbGQgaW4gYVxuICogZGVlcGx5IG5lc3RlZCBhcnJheSBvYmplY3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXJzaGFsQXJyYXkoYXJyOiBhbnlbXSk6IEFycmF5T2JqZWN0IHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KGFycikpIHtcbiAgICByZXR1cm4gYXJyO1xuICB9XG4gIGNvbnN0IGFyck9iamVjdDogQXJyYXlPYmplY3QgPSB7X2FycmF5OiBbXX07XG4gIGZvciAoY29uc3QgaXRlbSBvZiBhcnIpIHtcbiAgICBjb25zdCBrZXkgPSByYW5kU3RyaW5nKDYpO1xuICAgIGFyck9iamVjdFtrZXldID0gaXRlbTtcbiAgICBhcnJPYmplY3QuX2FycmF5LnB1c2goa2V5KTtcbiAgfVxuICByZXR1cm4gYXJyT2JqZWN0O1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIGBBcnJheU9iamVjdGAgdG8gYSBub3JtYWwgYXJyYXkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bm1hcnNoYWxBcnJheShhcnJPYmplY3Q6IEFycmF5T2JqZWN0KTogYW55W10ge1xuICBpZiAoIUFycmF5LmlzQXJyYXkoYXJyT2JqZWN0Py5fYXJyYXkpKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIGNvbnN0IGFyciA9IGFyck9iamVjdC5fYXJyYXkubWFwKChrOiBzdHJpbmcpID0+IGFyck9iamVjdFtrXSk7XG4gIHJldHVybiBhcnI7XG59XG5cbmZ1bmN0aW9uIGlzT2JqZWN0KGRhdGE6IGFueSk6IGJvb2xlYW4ge1xuICByZXR1cm4gdHlwZW9mIGRhdGEgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KGRhdGEpICYmIGRhdGEgIT09IG51bGw7XG59XG5cbmZ1bmN0aW9uIHJhbmRTdHJpbmcobGVuOiBudW1iZXIpOiBzdHJpbmcge1xuICBjb25zdCByZXN1bHQgPSBbXTtcbiAgY29uc3QgY2hhcnMgPVxuICAgICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSc7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICBjb25zdCByYW5kID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogY2hhcnMubGVuZ3RoKTtcbiAgICByZXN1bHQucHVzaChjaGFycy5jaGFyQXQocmFuZCkpO1xuICB9XG4gIHJldHVybiByZXN1bHQuam9pbignJyk7XG59XG5cbi8qKlxuICogQ29udmVydHMgYSB0cmFuc2xhdGlvbnMgbWFwIGZyb20gYGxvYWRUcmFuc2xhdGlvbnMoKWAgdG8gYSBtYXAgb2Ygc291cmNlIHRvXG4gKiB0cmFuc2xhdGVkIHN0cmluZyBmb3IgYSBwYXJ0aWN1bGFyIGxvY2FsZS5cbiAqXG4gKiBSZXR1cm5zIGEgbWFwIGxpa2U6XG4gKiBgYGBcbiAqIHtcbiAqICAgXCJIZWxsb1wiOiBcIkJvbmpvdXJcIixcbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNsYXRpb25zRm9yTG9jYWxlKFxuICB0cmFuc2xhdGlvbnNNYXA6IFRyYW5zbGF0aW9uc01hcCxcbiAgbG9jYWxlOiBzdHJpbmdcbikge1xuICBjb25zdCBsb2NhbGVUcmFuc2xhdGlvbnM6IExvY2FsZVRyYW5zbGF0aW9ucyA9IHt9O1xuICBPYmplY3QudmFsdWVzKHRyYW5zbGF0aW9uc01hcCkuZm9yRWFjaCgoc3RyaW5nKSA9PiB7XG4gICAgY29uc3Qgc291cmNlID0gc3RyaW5nLnNvdXJjZTtcbiAgICBjb25zdCB0cmFuc2xhdGlvbiA9IHN0cmluZ1tsb2NhbGVdIHx8IHN0cmluZy5lbiB8fCBzdHJpbmcuc291cmNlO1xuICAgIGxvY2FsZVRyYW5zbGF0aW9uc1tzb3VyY2VdID0gdHJhbnNsYXRpb247XG4gIH0pO1xuICByZXR1cm4gbG9jYWxlVHJhbnNsYXRpb25zO1xufVxuIiwgImltcG9ydCB7aW5pdGlhbGl6ZUFwcH0gZnJvbSAnZmlyZWJhc2UtYWRtaW4vYXBwJztcbmltcG9ydCB7Z2V0U2VjdXJpdHlSdWxlc30gZnJvbSAnZmlyZWJhc2UtYWRtaW4vc2VjdXJpdHktcnVsZXMnO1xuXG5leHBvcnQgY29uc3QgRklSRVNUT1JFX1JVTEVTID0gYHJ1bGVzX3ZlcnNpb24gPSAnMic7XG5zZXJ2aWNlIGNsb3VkLmZpcmVzdG9yZSB7XG4gIG1hdGNoIC9kYXRhYmFzZXMve2RhdGFiYXNlfS9kb2N1bWVudHMge1xuICAgIG1hdGNoIC97ZG9jdW1lbnQ9Kip9IHtcbiAgICAgIGFsbG93IHJlYWQsIHdyaXRlOiBpZiBmYWxzZTtcbiAgICB9XG5cbiAgICBtYXRjaCAvUHJvamVjdHMve3Byb2plY3R9IHtcbiAgICAgIGFsbG93IHdyaXRlOlxuICAgICAgICBpZiBpc1NpZ25lZEluKCkgJiYgdXNlcklzQWRtaW4oKTtcbiAgICAgIGFsbG93IHJlYWQ6XG4gICAgICAgIGlmIGlzU2lnbmVkSW4oKSAmJiB1c2VyQ2FuUmVhZCgpO1xuXG4gICAgICBtYXRjaCAve2NvbGxlY3Rpb259L3tkb2N1bWVudD0qKn0ge1xuICAgICAgICBhbGxvdyB3cml0ZTpcbiAgICAgICAgICBpZiBpc1NpZ25lZEluKCkgJiYgdXNlckNhbldyaXRlKCk7XG4gICAgICAgIGFsbG93IHJlYWQ6XG4gICAgICAgICAgaWYgaXNTaWduZWRJbigpICYmIHVzZXJDYW5SZWFkKCk7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIGlzU2lnbmVkSW4oKSB7XG4gICAgICAgIHJldHVybiByZXF1ZXN0LmF1dGggIT0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gZ2V0Um9sZXMoKSB7XG4gICAgICAgIHJldHVybiBnZXQoL2RhdGFiYXNlcy8kKGRhdGFiYXNlKS9kb2N1bWVudHMvUHJvamVjdHMvJChwcm9qZWN0KSkuZGF0YS5yb2xlcztcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gdXNlckNhblJlYWQoKSB7XG4gICAgICAgIGxldCByb2xlcyA9IGdldFJvbGVzKCk7XG4gICAgICAgIGxldCBlbWFpbCA9IHJlcXVlc3QuYXV0aC50b2tlbi5lbWFpbDtcbiAgICAgICAgbGV0IGRvbWFpbiA9ICcqQCcgKyBlbWFpbC5zcGxpdCgnQCcpWzFdO1xuICAgICAgICByZXR1cm4gKHJvbGVzW2VtYWlsXSBpbiBbJ0FETUlOJywgJ0VESVRPUicsICdWSUVXRVInXSkgfHwgKHJvbGVzW2RvbWFpbl0gaW4gWydBRE1JTicsICdFRElUT1InLCAnVklFV0VSJ10pO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiB1c2VyQ2FuV3JpdGUoKSB7XG4gICAgICAgIGxldCByb2xlcyA9IGdldFJvbGVzKCk7XG4gICAgICAgIGxldCBlbWFpbCA9IHJlcXVlc3QuYXV0aC50b2tlbi5lbWFpbDtcbiAgICAgICAgbGV0IGRvbWFpbiA9ICcqQCcgKyBlbWFpbC5zcGxpdCgnQCcpWzFdO1xuICAgICAgICByZXR1cm4gKHJvbGVzW2VtYWlsXSBpbiBbJ0FETUlOJywgJ0VESVRPUiddKSB8fCAocm9sZXNbZG9tYWluXSBpbiBbJ0FETUlOJywgJ0VESVRPUiddKTtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gdXNlcklzQWRtaW4oKSB7XG4gICAgICAgIGxldCByb2xlcyA9IGdldFJvbGVzKCk7XG4gICAgICAgIGxldCBlbWFpbCA9IHJlcXVlc3QuYXV0aC50b2tlbi5lbWFpbDtcbiAgICAgICAgbGV0IGRvbWFpbiA9ICcqQCcgKyBlbWFpbC5zcGxpdCgnQCcpWzFdO1xuICAgICAgICByZXR1cm4gKHJvbGVzW2VtYWlsXSA9PSAnQURNSU4nKSB8fCAocm9sZXNbZG9tYWluXSA9PSAnQURNSU4nKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbmA7XG5cbi8qKlxuICogQWRkcyB0aGUgcm9vdC1jbXMgc2VjdXJpdHkgcnVsZXMgdG8gYSBGaXJlYmFzZSBwcm9qZWN0LlxuICogTk9URTogVGhpcyBmdW5jdGlvbiB3aWxsIG92ZXJ3cml0ZSBhbnkgZXhpc3RpbmcgcnVsZXMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhcHBseVNlY3VyaXR5UnVsZXMocHJvamVjdElkOiBzdHJpbmcpIHtcbiAgLy8gVE9ETyhzdGV2ZW5sZSk6IGNoZWNrIGlmIGFuIGFwcCBleGlzdHMgZmlyc3QgYmVmb3JlIGluaXRpYWxpemluZy5cbiAgY29uc3QgYXBwID0gaW5pdGlhbGl6ZUFwcCh7cHJvamVjdElkfSk7XG4gIGNvbnN0IHNlY3VyaXR5UnVsZXMgPSBnZXRTZWN1cml0eVJ1bGVzKGFwcCk7XG4gIGF3YWl0IHNlY3VyaXR5UnVsZXMucmVsZWFzZUZpcmVzdG9yZVJ1bGVzZXRGcm9tU291cmNlKEZJUkVTVE9SRV9SVUxFUyk7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiO0FBQUEsU0FBUSxlQUFjO0FBQ3RCLFNBQVEsU0FBUyxhQUFZOzs7QUNEN0IsU0FBUSxZQUFZLFVBQVM7QUFDN0IsT0FBTyxVQUFVO0FBQ2pCLFNBQVEscUJBQW9CO0FBQzVCLFNBQVEsZ0JBQWdCLHlCQUF3QjtBQUNoRCxZQUFZLFNBQVM7QUFLckIsSUFBTSxZQUFZLEtBQUssUUFBUSxjQUFjLFlBQVksR0FBRyxDQUFDO0FBRTdELGVBQXNCLGdCQUFnQjtBQUNwQyxRQUFNLFVBQVUsUUFBUSxJQUFJO0FBQzVCLFFBQU0sYUFBYSxNQUFNLGVBQWUsU0FBUyxFQUFDLFNBQVMsV0FBVSxDQUFDO0FBQ3RFLFFBQU0sYUFBYSxLQUFLLFFBQVEsV0FBVyxjQUFjO0FBQ3pELFFBQU0sVUFBVyxNQUFNO0FBQUEsSUFDckI7QUFBQSxJQUNBO0FBQUEsRUFDRjtBQUNBLFFBQU0sVUFBVSxRQUFRLGtCQUFrQjtBQUMxQyxVQUFRLElBQUksaUNBQWlDLE9BQU8sS0FBSztBQUN6RCxRQUFNLGFBQWEsS0FBSyxRQUFRLFNBQVMsZUFBZTtBQUN4RCxRQUFNLGtCQUFrQixZQUFZ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QUFDMUMsUUFBTSxjQUFjLGtDQUFrQyxlQUFlO0FBQ3ZFOzs7QUZ0REEsZUFBc0IsYUFBYSxTQUE4QjtBQUMvRCxNQUFJO0FBQ0osTUFBSSxRQUFRLFNBQVM7QUFDbkIsbUJBQWUsUUFBUTtBQUFBLEVBQ3pCLE9BQU87QUFDTCxVQUFNLFVBQVUsUUFBUSxJQUFJO0FBQzVCLFVBQU0sYUFBYSxNQUFNQyxnQkFBZSxTQUFTLEVBQUMsU0FBUyxXQUFVLENBQUM7QUFDdEUsVUFBTSxZQUFZLGFBQWEsVUFBVTtBQUN6QyxVQUFNLG1CQUFtQixVQUFVLFVBQVU7QUFDN0MsbUJBQWUsaUJBQWlCLGVBQWU7QUFBQSxFQUNqRDtBQUNBLE1BQUksQ0FBQyxjQUFjO0FBQ2pCLFVBQU0sSUFBSSxNQUFNLHdEQUF3RDtBQUFBLEVBQzFFO0FBRUEsVUFBUSxJQUFJLGdCQUFnQixZQUFZLEVBQUU7QUFDMUMsVUFBUSxJQUFJLHNDQUErQjtBQUMzQyxRQUFNLG1CQUFtQixZQUFZO0FBQ3JDLFVBQVEsSUFBSSxxQ0FBcUM7QUFDbkQ7OztBRnpCQSxJQUFNLFlBQU4sTUFBZ0I7QUFBQSxFQUlkLFlBQVksTUFBYyxTQUFpQjtBQUN6QyxTQUFLLE9BQU87QUFDWixTQUFLLFVBQVU7QUFBQSxFQUNqQjtBQUFBLEVBRUEsTUFBTSxJQUFJLE1BQWdCO0FBQ3hCLFVBQU0sVUFBVSxJQUFJLFFBQVEsS0FBSyxJQUFJO0FBQ3JDLFlBQVEsUUFBUSxLQUFLLE9BQU87QUFDNUIsWUFBUSxPQUFPLGVBQWUsT0FBTztBQUNyQyxZQUFRLEtBQUssYUFBYSxDQUFDLFFBQVE7QUFDakMsVUFBSSxDQUFDLElBQUksS0FBSyxFQUFFLE9BQU87QUFDckIsZ0JBQVE7QUFBQSxVQUNOLGFBQU0sUUFBUSxNQUFNLElBQUksS0FBSyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEtBQUssS0FBSyxPQUFPO0FBQUE7QUFBQSxRQUN6RDtBQUFBLE1BQ0Y7QUFBQSxJQUNGLENBQUM7QUFDRCxZQUNHLFFBQVEsZUFBZSxFQUN2QixZQUFZLHVEQUF1RCxFQUNuRSxPQUFPLHVCQUF1QixnQkFBZ0IsRUFDOUMsT0FBTyxZQUFZO0FBQ3RCLFlBQ0csUUFBUSxnQkFBZ0IsRUFDeEI7QUFBQSxNQUNDO0FBQUEsSUFDRixFQUNDLE9BQU8sYUFBYTtBQUN2QixVQUFNLFFBQVEsV0FBVyxJQUFJO0FBQUEsRUFDL0I7QUFDRjsiLAogICJuYW1lcyI6IFsibG9hZFJvb3RDb25maWciLCAicGx1Z2luIiwgImxvYWRSb290Q29uZmlnIl0KfQo=
|
|
346
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vY2xpL2NsaS50cyIsICIuLi9jbGkvZ2VuZXJhdGUtdHlwZXMudHMiLCAiLi4vY2xpL2luaXQtZmlyZWJhc2UudHMiLCAiLi4vY29yZS9jbGllbnQudHMiLCAiLi4vY29yZS9zZWN1cml0eS50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0IHtDb21tYW5kfSBmcm9tICdjb21tYW5kZXInO1xuaW1wb3J0IHtiZ0dyZWVuLCBibGFja30gZnJvbSAna2xldXIvY29sb3JzJztcbmltcG9ydCB7Z2VuZXJhdGVUeXBlc30gZnJvbSAnLi9nZW5lcmF0ZS10eXBlcy5qcyc7XG5pbXBvcnQge2luaXRGaXJlYmFzZX0gZnJvbSAnLi9pbml0LWZpcmViYXNlLmpzJztcblxuY2xhc3MgQ2xpUnVubmVyIHtcbiAgcHJpdmF0ZSBuYW1lOiBzdHJpbmc7XG4gIHByaXZhdGUgdmVyc2lvbjogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZywgdmVyc2lvbjogc3RyaW5nKSB7XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICB0aGlzLnZlcnNpb24gPSB2ZXJzaW9uO1xuICB9XG5cbiAgYXN5bmMgcnVuKGFyZ3Y6IHN0cmluZ1tdKSB7XG4gICAgY29uc3QgcHJvZ3JhbSA9IG5ldyBDb21tYW5kKHRoaXMubmFtZSk7XG4gICAgcHJvZ3JhbS52ZXJzaW9uKHRoaXMudmVyc2lvbik7XG4gICAgcHJvZ3JhbS5vcHRpb24oJy1xLCAtLXF1aWV0JywgJ3F1aWV0Jyk7XG4gICAgcHJvZ3JhbS5ob29rKCdwcmVBY3Rpb24nLCAoY21kKSA9PiB7XG4gICAgICBpZiAoIWNtZC5vcHRzKCkucXVpZXQpIHtcbiAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgYFx1RDgzRVx1REQ1NSAke2JnR3JlZW4oYmxhY2soYCAke3RoaXMubmFtZX0gYCkpfSB2JHt0aGlzLnZlcnNpb259XFxuYFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHByb2dyYW1cbiAgICAgIC5jb21tYW5kKCdpbml0LWZpcmViYXNlJylcbiAgICAgIC5kZXNjcmlwdGlvbignaW5pdHMgdGhlIGZpcmViYXNlIHByb2plY3QgcHJvcGVyIHNlY3VyaXR5IHJ1bGVzJylcbiAgICAgIC5vcHRpb24oJy0tcHJvamVjdCA8cHJvamVjdD4nLCAnZ2NwIHByb2plY3QgaWQnKVxuICAgICAgLm9wdGlvbignLS1hZG1pbiA8ZW1haWw+JywgJ2FkZHMgYW4gYWRtaW4gdG8gdGhlIHByb2plY3QnKVxuICAgICAgLmFjdGlvbihpbml0RmlyZWJhc2UpO1xuICAgIHByb2dyYW1cbiAgICAgIC5jb21tYW5kKCdnZW5lcmF0ZS10eXBlcycpXG4gICAgICAuYWxpYXMoJ3R5cGVzJylcbiAgICAgIC5kZXNjcmlwdGlvbihcbiAgICAgICAgJ2dlbmVyYXRlcyByb290LWNtcy5kLnRzIGZyb20gKi5zY2hlbWEudHMgZmlsZXMgaW4gdGhlIHByb2plY3QnXG4gICAgICApXG4gICAgICAuYWN0aW9uKGdlbmVyYXRlVHlwZXMpO1xuICAgIGF3YWl0IHByb2dyYW0ucGFyc2VBc3luYyhhcmd2KTtcbiAgfVxufVxuXG5leHBvcnQge0NsaVJ1bm5lciwgZ2VuZXJhdGVUeXBlcywgaW5pdEZpcmViYXNlfTtcbiIsICJpbXBvcnQge3Byb21pc2VzIGFzIGZzfSBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQge2ZpbGVVUkxUb1BhdGh9IGZyb20gJ25vZGU6dXJsJztcbmltcG9ydCB7bG9hZFJvb3RDb25maWcsIHZpdGVTc3JMb2FkTW9kdWxlfSBmcm9tICdAYmxpbmtrL3Jvb3Qvbm9kZSc7XG5pbXBvcnQgKiBhcyBkb20gZnJvbSAnZHRzLWRvbSc7XG5cbmltcG9ydCB7RmllbGQsIFNjaGVtYX0gZnJvbSAnLi4vY29yZS9zY2hlbWEuanMnO1xuXG50eXBlIFByb2plY3RNb2R1bGUgPSB0eXBlb2YgaW1wb3J0KCcuLi9jb3JlL3Byb2plY3QuanMnKTtcbmNvbnN0IF9fZGlybmFtZSA9IHBhdGguZGlybmFtZShmaWxlVVJMVG9QYXRoKGltcG9ydC5tZXRhLnVybCkpO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVUeXBlcygpIHtcbiAgY29uc3Qgcm9vdERpciA9IHByb2Nlc3MuY3dkKCk7XG4gIGNvbnN0IHJvb3RDb25maWcgPSBhd2FpdCBsb2FkUm9vdENvbmZpZyhyb290RGlyLCB7Y29tbWFuZDogJ3Jvb3QtY21zJ30pO1xuICBjb25zdCBtb2R1bGVQYXRoID0gcGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgJy4vcHJvamVjdC5qcycpO1xuICBjb25zdCBwcm9qZWN0ID0gKGF3YWl0IHZpdGVTc3JMb2FkTW9kdWxlKFxuICAgIHJvb3RDb25maWcsXG4gICAgbW9kdWxlUGF0aFxuICApKSBhcyBQcm9qZWN0TW9kdWxlO1xuICBjb25zdCBzY2hlbWFzID0gcHJvamVjdC5nZXRQcm9qZWN0U2NoZW1hcygpO1xuICBjb25zb2xlLmxvZyhgZ2VuZXJhdGluZyByb290LWNtcy5kLnRzIGZyb20gJHtyb290RGlyfS4uLmApO1xuICBjb25zdCBvdXRwdXRQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3REaXIsICdyb290LWNtcy5kLnRzJyk7XG4gIGF3YWl0IGdlbmVyYXRlU2NoZW1hRHRzKG91dHB1dFBhdGgsIHNjaGVtYXMpO1xuICBjb25zb2xlLmxvZygnc2F2ZWQgcm9vdC1jbXMuZC50cyEnKTtcbn1cblxuY29uc3QgVEVNUExBVEUgPSBgLyoqIFJvb3QuanMgQ01TIHR5cGVzLiBUaGlzIGZpbGUgaXMgYXV0b2dlbmVyYXRlZC4gKi9cblxuZXhwb3J0IGludGVyZmFjZSBSb290Q01TSW1hZ2Uge1xuICBzcmM6IHN0cmluZztcbiAgd2lkdGg/OiBudW1iZXI7XG4gIGhlaWdodD86IG51bWJlcjtcbiAgYWx0Pzogc3RyaW5nO1xufVxuXG5leHBvcnQgdHlwZSBSb290Q01TT25lT2Y8VCA9IGFueT4gPSBUICYge1xuICBfdHlwZTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJvb3RDTVNSaWNoVGV4dEJsb2NrIHtcbiAgdHlwZTogc3RyaW5nO1xuICBkYXRhOiBhbnk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUm9vdENNU1JpY2hUZXh0IHtcbiAgYmxvY2tzOiBSb290Q01TUmljaFRleHRCbG9ja1tdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJvb3RDTVNSZWZlcmVuY2Uge1xuICAvKiogVGhlIGlkIG9mIHRoZSBkb2MsIGUuZy4gXCJQYWdlcy9mb28tYmFyXCIuICovXG4gIGlkOiBzdHJpbmc7XG4gIC8qKiBUaGUgY29sbGVjdGlvbiBpZCBvZiB0aGUgZG9jLCBlLmcuIFwiUGFnZXNcIi4gKi9cbiAgY29sbGVjdGlvbjogc3RyaW5nO1xuICAvKiogVGhlIHNsdWcgb2YgdGhlIGRvYywgZS5nLiBcImZvby1iYXJcIi4gKi9cbiAgc2x1Zzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJvb3RDTVNEb2M8RmllbGRzIGV4dGVuZHMge30+IHtcbiAgLyoqIFRoZSBpZCBvZiB0aGUgZG9jLCBlLmcuIFwiUGFnZXMvZm9vLWJhclwiLiAqL1xuICBpZDogc3RyaW5nO1xuICAvKiogVGhlIGNvbGxlY3Rpb24gaWQgb2YgdGhlIGRvYywgZS5nLiBcIlBhZ2VzXCIuICovXG4gIGNvbGxlY3Rpb246IHN0cmluZztcbiAgLyoqIFRoZSBzbHVnIG9mIHRoZSBkb2MsIGUuZy4gXCJmb28tYmFyXCIuICovXG4gIHNsdWc6IHN0cmluZztcbiAgLyoqIFN5c3RlbS1sZXZlbCBtZXRhZGF0YS4gKi9cbiAgc3lzOiB7XG4gICAgY3JlYXRlZEF0OiBudW1iZXI7XG4gICAgY3JlYXRlZEJ5OiBzdHJpbmc7XG4gICAgbW9kaWZpZWRBdDogbnVtYmVyO1xuICAgIG1vZGlmaWVkQnk6IHN0cmluZztcbiAgICBmaXJzdFB1Ymxpc2hlZEF0PzogbnVtYmVyO1xuICAgIGZpcnN0UHVibGlzaGVkQnk/OiBzdHJpbmc7XG4gICAgcHVibGlzaGVkQXQ/OiBudW1iZXI7XG4gICAgcHVibGlzaGVkQnk/OiBzdHJpbmc7XG4gICAgbG9jYWxlcz86IHN0cmluZ1tdO1xuICB9O1xuICAvKiogVXNlci1lbnRlcmVkIGZpZWxkIHZhbHVlcyBmcm9tIHRoZSBDTVMuICovXG4gIGZpZWxkcz86IEZpZWxkcztcbn1gO1xuXG4vKipcbiAqIEdlbmVyYXRlcyBhIHJvb3QtY21zLmQudHMgZmlsZSBmcm9tIHRoZSAuc2NoZW1hLnRzIGZpbGVzIGluIHRoZSBwcm9qZWN0LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVTY2hlbWFEdHMoXG4gIG91dHB1dFBhdGg6IHN0cmluZyxcbiAgc2NoZW1hczogUmVjb3JkPHN0cmluZywgU2NoZW1hPlxuKSB7XG4gIGNvbnN0IHJlc3VsdHMgPSBbVEVNUExBVEVdO1xuICBmb3IgKGNvbnN0IGZpbGVJZCBpbiBzY2hlbWFzKSB7XG4gICAgY29uc3Qgc2NoZW1hID0gc2NoZW1hc1tmaWxlSWRdO1xuICAgIHJlc3VsdHMucHVzaChyZW5kZXJTY2hlbWEoZmlsZUlkLCBzY2hlbWEpKTtcbiAgfVxuICBjb25zdCBvdXRwdXQgPSByZXN1bHRzXG4gICAgLmpvaW4oJ1xcblxcbicpXG4gICAgLnJlcGxhY2VBbGwoJy8qKiAgJywgJy8qKiAnKVxuICAgIC5yZXBsYWNlQWxsKCcgICovJywgJyAqLycpXG4gICAgLnJlcGxhY2UoL1xcclxcbnxcXHJ8XFxuL2csICdcXG4nKTtcbiAgYXdhaXQgZnMud3JpdGVGaWxlKG91dHB1dFBhdGgsIG91dHB1dCwgJ3V0Zi04Jyk7XG59XG5cbmZ1bmN0aW9uIGZpZWxkUHJvcGVydHkoZmllbGQ6IEZpZWxkKTogZG9tLlByb3BlcnR5RGVjbGFyYXRpb24ge1xuICBjb25zdCBwcm9wID0gZG9tLmNyZWF0ZS5wcm9wZXJ0eShcbiAgICBmaWVsZC5pZCEsXG4gICAgZmllbGRUeXBlKGZpZWxkKSxcbiAgICBkb20uRGVjbGFyYXRpb25GbGFncy5PcHRpb25hbFxuICApO1xuICBjb25zdCBqc2RvYyA9IFtdO1xuICBpZiAoZmllbGQubGFiZWwpIHtcbiAgICBpZiAoZmllbGQuaGVscCkge1xuICAgICAganNkb2MucHVzaChgJHtmaWVsZC5sYWJlbH0uICR7ZmllbGQuaGVscH1gKTtcbiAgICB9IGVsc2Uge1xuICAgICAganNkb2MucHVzaChmaWVsZC5sYWJlbCk7XG4gICAgfVxuICB9XG4gIGlmIChmaWVsZC5kZXByZWNhdGVkKSB7XG4gICAganNkb2MucHVzaCgnQGRlcHJlY2F0ZWQnKTtcbiAgfVxuICBpZiAoanNkb2MubGVuZ3RoID4gMCkge1xuICAgIHByb3AuanNEb2NDb21tZW50ID0ganNkb2Muam9pbignXFxuJyk7XG4gIH1cbiAgcmV0dXJuIHByb3A7XG59XG5cbmZ1bmN0aW9uIGZpZWxkVHlwZShmaWVsZDogRmllbGQpOiBkb20uVHlwZSB7XG4gIGlmIChmaWVsZC50eXBlID09PSAnYXJyYXknKSB7XG4gICAgcmV0dXJuIGRvbS50eXBlLmFycmF5KGZpZWxkVHlwZShmaWVsZC5vZikpO1xuICB9XG4gIGlmIChmaWVsZC50eXBlID09PSAnYm9vbGVhbicpIHtcbiAgICByZXR1cm4gZG9tLnR5cGUuYm9vbGVhbjtcbiAgfVxuICBpZiAoZmllbGQudHlwZSA9PT0gJ2RhdGUnKSB7XG4gICAgcmV0dXJuIGRvbS50eXBlLnN0cmluZztcbiAgfVxuICBpZiAoZmllbGQudHlwZSA9PT0gJ2RhdGV0aW1lJykge1xuICAgIHJldHVybiBkb20udHlwZS5udW1iZXI7XG4gIH1cbiAgaWYgKGZpZWxkLnR5cGUgPT09ICdpbWFnZScpIHtcbiAgICBjb25zdCBpbWFnZVR5cGUgPSBkb20uY3JlYXRlLm5hbWVkVHlwZVJlZmVyZW5jZSgnUm9vdENNU0ltYWdlJyk7XG4gICAgcmV0dXJuIGltYWdlVHlwZTtcbiAgfVxuICBpZiAoZmllbGQudHlwZSA9PT0gJ2ZpbGUnKSB7XG4gICAgcmV0dXJuIGRvbS5jcmVhdGUub2JqZWN0VHlwZShbZG9tLmNyZWF0ZS5wcm9wZXJ0eSgnc3JjJywgZG9tLnR5cGUuc3RyaW5nKV0pO1xuICB9XG4gIGlmIChmaWVsZC50eXBlID09PSAnbXVsdGlzZWxlY3QnKSB7XG4gICAgcmV0dXJuIGRvbS50eXBlLmFycmF5KGRvbS50eXBlLnN0cmluZyk7XG4gIH1cbiAgaWYgKGZpZWxkLnR5cGUgPT09ICdvbmVvZicpIHtcbiAgICBjb25zdCBvbmVvZlR5cGUgPSBkb20uY3JlYXRlLm5hbWVkVHlwZVJlZmVyZW5jZSgnUm9vdENNU09uZU9mJyk7XG4gICAgcmV0dXJuIG9uZW9mVHlwZTtcbiAgfVxuICBpZiAoZmllbGQudHlwZSA9PT0gJ3JlZmVyZW5jZScpIHtcbiAgICBjb25zdCByZWZlcmVuY2VUeXBlID0gZG9tLmNyZWF0ZS5uYW1lZFR5cGVSZWZlcmVuY2UoJ1Jvb3RDTVNSZWZlcmVuY2UnKTtcbiAgICByZXR1cm4gcmVmZXJlbmNlVHlwZTtcbiAgfVxuICBpZiAoZmllbGQudHlwZSA9PT0gJ3JpY2h0ZXh0Jykge1xuICAgIGNvbnN0IHJpY2h0ZXh0VHlwZSA9IGRvbS5jcmVhdGUubmFtZWRUeXBlUmVmZXJlbmNlKCdSb290Q01TUmljaFRleHQnKTtcbiAgICByZXR1cm4gcmljaHRleHRUeXBlO1xuICB9XG4gIGlmIChmaWVsZC50eXBlID09PSAnc2VsZWN0Jykge1xuICAgIHJldHVybiBkb20udHlwZS5zdHJpbmc7XG4gIH1cbiAgaWYgKGZpZWxkLnR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGRvbS50eXBlLnN0cmluZztcbiAgfVxuICBpZiAoZmllbGQudHlwZSA9PT0gJ29iamVjdCcpIHtcbiAgICBjb25zdCBzdWJwcm9wZXJ0aWVzID0gKGZpZWxkLmZpZWxkcyB8fCBbXSkubWFwKChmKSA9PiBmaWVsZFByb3BlcnR5KGYpKTtcbiAgICByZXR1cm4gZG9tLmNyZWF0ZS5vYmplY3RUeXBlKHN1YnByb3BlcnRpZXMpO1xuICB9XG4gIHJldHVybiBkb20udHlwZS51bmtub3duO1xufVxuXG5mdW5jdGlvbiByZW5kZXJTY2hlbWEoZmlsZUlkOiBzdHJpbmcsIHNjaGVtYTogU2NoZW1hKTogc3RyaW5nIHtcbiAgY29uc3QganNkb2MgPSBgR2VuZXJhdGVkIGZyb20gXFxgJHtmaWxlSWR9XFxgLmA7XG4gIGNvbnN0IGlkID0gcGF0aC5wYXJzZShmaWxlSWQpLm5hbWUuc3BsaXQoJy4nKVswXTtcbiAgY29uc3QgZmllbGRzSW50ZXJmYWNlID0gYCR7aWR9RmllbGRzYDtcbiAgY29uc3QgZmllbGRzID0gZG9tLmNyZWF0ZS5pbnRlcmZhY2UoXG4gICAgZmllbGRzSW50ZXJmYWNlLFxuICAgIGRvbS5EZWNsYXJhdGlvbkZsYWdzLkV4cG9ydFxuICApO1xuICBmaWVsZHMuanNEb2NDb21tZW50ID0ganNkb2M7XG4gIGZvciAoY29uc3QgZmllbGQgb2Ygc2NoZW1hLmZpZWxkcykge1xuICAgIGlmICghZmllbGQuaWQpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBmaWVsZHMubWVtYmVycy5wdXNoKGZpZWxkUHJvcGVydHkoZmllbGQpKTtcbiAgfVxuXG4gIGNvbnN0IGZpZWxkc1R5cGVPdXRwdXQgPSBkb21cbiAgICAuZW1pdChmaWVsZHMsIHtzaW5nbGVMaW5lSnNEb2NDb21tZW50czogdHJ1ZX0pXG4gICAgLnRyaW0oKTtcbiAgaWYgKGZpbGVJZC5zdGFydHNXaXRoKCcvY29sbGVjdGlvbnMvJykpIHtcbiAgICBjb25zdCBiYXNlVHlwZSA9IGRvbS5jcmVhdGUubmFtZWRUeXBlUmVmZXJlbmNlKCdSb290Q01TRG9jJyk7XG4gICAgYmFzZVR5cGUudHlwZUFyZ3VtZW50cy5wdXNoKGRvbS5jcmVhdGUubmFtZWRUeXBlUmVmZXJlbmNlKGZpZWxkc0ludGVyZmFjZSkpO1xuICAgIGNvbnN0IGRvY1R5cGUgPSBkb20uY3JlYXRlLmFsaWFzKFxuICAgICAgYCR7aWR9RG9jYCxcbiAgICAgIGJhc2VUeXBlLFxuICAgICAgZG9tLkRlY2xhcmF0aW9uRmxhZ3MuRXhwb3J0XG4gICAgKTtcbiAgICBkb2NUeXBlLmpzRG9jQ29tbWVudCA9IGpzZG9jO1xuXG4gICAgY29uc3QgZG9jVHlwZU91dHB1dCA9IGRvbVxuICAgICAgLmVtaXQoZG9jVHlwZSwge3NpbmdsZUxpbmVKc0RvY0NvbW1lbnRzOiB0cnVlfSlcbiAgICAgIC50cmltKCk7XG4gICAgcmV0dXJuIHJlaW5kZW50KGZpZWxkc1R5cGVPdXRwdXQgKyAnXFxuXFxuJyArIGRvY1R5cGVPdXRwdXQpO1xuICB9XG4gIHJldHVybiByZWluZGVudChmaWVsZHNUeXBlT3V0cHV0KTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyA0LXNwYWNlIGluZGVudHMgdG8gMi5cbiAqL1xuZnVuY3Rpb24gcmVpbmRlbnQoaW5wdXQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGxpbmVzID0gaW5wdXQuc3BsaXQoJ1xcbicpO1xuICBjb25zdCByZXN1bHRzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IGxpbmUgb2YgbGluZXMpIHtcbiAgICBjb25zdCBjb252ZXJ0ZWRMaW5lID0gbGluZS5yZXBsYWNlKC8gezR9L2csICcgICcpO1xuICAgIHJlc3VsdHMucHVzaChjb252ZXJ0ZWRMaW5lKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0cy5qb2luKCdcXG4nKTtcbn1cbiIsICJpbXBvcnQge2xvYWRSb290Q29uZmlnfSBmcm9tICdAYmxpbmtrL3Jvb3Qvbm9kZSc7XG5pbXBvcnQge0ZpcmVzdG9yZSwgZ2V0RmlyZXN0b3JlfSBmcm9tICdmaXJlYmFzZS1hZG1pbi9maXJlc3RvcmUnO1xuaW1wb3J0IHtnZXRDbXNQbHVnaW59IGZyb20gJy4uL2NvcmUvY2xpZW50LmpzJztcbmltcG9ydCB7YXBwbHlTZWN1cml0eVJ1bGVzfSBmcm9tICcuLi9jb3JlL3NlY3VyaXR5LmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBJbml0RmlyZWJhc2VPcHRpb25zIHtcbiAgLyoqIEdDUCBwcm9qZWN0IGlkLiAqL1xuICBwcm9qZWN0Pzogc3RyaW5nO1xuICAvKiogQWRkcyBhbiBBRE1JTiB0byB0aGUgc2VjdXJpdHkgcnVsZXMuICovXG4gIGFkbWluPzogc3RyaW5nO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW5pdEZpcmViYXNlKG9wdGlvbnM6IEluaXRGaXJlYmFzZU9wdGlvbnMpIHtcbiAgY29uc3Qgcm9vdERpciA9IHByb2Nlc3MuY3dkKCk7XG4gIGNvbnN0IHJvb3RDb25maWcgPSBhd2FpdCBsb2FkUm9vdENvbmZpZyhyb290RGlyLCB7Y29tbWFuZDogJ3Jvb3QtY21zJ30pO1xuICBjb25zdCBjbXNQbHVnaW4gPSBnZXRDbXNQbHVnaW4ocm9vdENvbmZpZyk7XG4gIGNvbnN0IGNtc1BsdWdpbk9wdGlvbnMgPSBjbXNQbHVnaW4uZ2V0Q29uZmlnKCk7XG4gIGNvbnN0IGdjcFByb2plY3RJZCA9XG4gICAgb3B0aW9ucy5wcm9qZWN0IHx8IGNtc1BsdWdpbk9wdGlvbnMuZmlyZWJhc2VDb25maWcucHJvamVjdElkO1xuXG4gIGlmICghZ2NwUHJvamVjdElkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdmaXJlYmFzZUNvbmZpZy5wcm9qZWN0SWQgbm90IHNldCBpbiBjbXMgcGx1Z2luIG9wdGlvbnMnKTtcbiAgfVxuXG4gIGNvbnNvbGUubG9nKGBnY3AgcHJvamVjdDogJHtnY3BQcm9qZWN0SWR9YCk7XG4gIGNvbnNvbGUubG9nKCdcdUQ4M0RcdURDNkUgdXBkYXRpbmcgc2VjdXJpdHkgcnVsZXMuLi4nKTtcbiAgYXdhaXQgYXBwbHlTZWN1cml0eVJ1bGVzKGdjcFByb2plY3RJZCk7XG5cbiAgaWYgKG9wdGlvbnMuYWRtaW4pIHtcbiAgICBjb25zdCBhcHAgPSBjbXNQbHVnaW4uZ2V0RmlyZWJhc2VBcHAoKTtcbiAgICBjb25zdCBkYiA9IGdldEZpcmVzdG9yZShhcHApO1xuICAgIGNvbnN0IHJvb3RQcm9qZWN0SWQgPSBjbXNQbHVnaW5PcHRpb25zLmlkIHx8ICdkZWZhdWx0JztcbiAgICBhd2FpdCBhZGRBZG1pbihkYiwgcm9vdFByb2plY3RJZCwgb3B0aW9ucy5hZG1pbik7XG4gIH1cblxuICBjb25zb2xlLmxvZygnZG9uZSBpbml0aWFsaXppbmcgZmlyZWJhc2UgcHJvamVjdCEnKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gYWRkQWRtaW4oZGI6IEZpcmVzdG9yZSwgcHJvamVjdElkOiBzdHJpbmcsIGVtYWlsOiBzdHJpbmcpIHtcbiAgY29uc3QgZGJQYXRoID0gYFByb2plY3RzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KHByb2plY3RJZCl9YDtcbiAgY29uc3QgZG9jUmVmID0gZGIuZG9jKGRiUGF0aCk7XG4gIGNvbnN0IHNuYXBzaG90ID0gYXdhaXQgZG9jUmVmLmdldCgpO1xuICBsZXQgZGF0YTtcbiAgaWYgKHNuYXBzaG90LmV4aXN0cykge1xuICAgIGRhdGEgPSBzbmFwc2hvdC5kYXRhKCkgfHwge307XG4gIH0gZWxzZSB7XG4gICAgZGF0YSA9IHt9O1xuICB9XG4gIGNvbnN0IHJvbGVzID0gZGF0YS5yb2xlcyA/PyB7fTtcbiAgcm9sZXNbZW1haWxdID0gJ0FETUlOJztcbiAgZGF0YS5yb2xlcyA9IHJvbGVzO1xuICBhd2FpdCBkb2NSZWYuc2V0KGRhdGEpO1xuICBjb25zb2xlLmxvZyhgYWRkZWQgYWRtaW4gJHtlbWFpbH0gdG8gcHJvamVjdCAke3Byb2plY3RJZH1gKTtcbn1cbiIsICJpbXBvcnQgY3J5cHRvIGZyb20gJ25vZGU6Y3J5cHRvJztcbmltcG9ydCB7UGx1Z2luLCBSb290Q29uZmlnfSBmcm9tICdAYmxpbmtrL3Jvb3QnO1xuaW1wb3J0IHtBcHB9IGZyb20gJ2ZpcmViYXNlLWFkbWluL2FwcCc7XG5pbXBvcnQge1xuICBGaWVsZFZhbHVlLFxuICBGaXJlc3RvcmUsXG4gIFF1ZXJ5LFxuICBUaW1lc3RhbXAsXG4gIFdyaXRlQmF0Y2gsXG4gIGdldEZpcmVzdG9yZSxcbn0gZnJvbSAnZmlyZWJhc2UtYWRtaW4vZmlyZXN0b3JlJztcbmltcG9ydCB7Q01TUGx1Z2lufSBmcm9tICcuL3BsdWdpbi5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRG9jPEZpZWxkcyA9IGFueT4ge1xuICAvKiogVGhlIGlkIG9mIHRoZSBkb2MsIGUuZy4gXCJQYWdlcy9mb28tYmFyXCIuICovXG4gIGlkOiBzdHJpbmc7XG4gIC8qKiBUaGUgY29sbGVjdGlvbiBpZCBvZiB0aGUgZG9jLCBlLmcuIFwiUGFnZXNcIi4gKi9cbiAgY29sbGVjdGlvbjogc3RyaW5nO1xuICAvKiogVGhlIHNsdWcgb2YgdGhlIGRvYywgZS5nLiBcImZvby1iYXJcIi4gKi9cbiAgc2x1Zzogc3RyaW5nO1xuICBzeXM6IHtcbiAgICBjcmVhdGVkQXQ6IG51bWJlcjtcbiAgICBjcmVhdGVkQnk6IHN0cmluZztcbiAgICBtb2RpZmllZEF0OiBudW1iZXI7XG4gICAgbW9kaWZpZWRCeTogc3RyaW5nO1xuICAgIGZpcnN0UHVibGlzaGVkQXQ/OiBudW1iZXI7XG4gICAgZmlyc3RQdWJsaXNoZWRCeT86IHN0cmluZztcbiAgICBwdWJsaXNoZWRBdD86IG51bWJlcjtcbiAgICBwdWJsaXNoZWRCeT86IHN0cmluZztcbiAgICBsb2NhbGVzPzogc3RyaW5nW107XG4gIH07XG4gIGZpZWxkczogRmllbGRzO1xufVxuXG5leHBvcnQgdHlwZSBEb2NNb2RlID0gJ2RyYWZ0JyB8ICdwdWJsaXNoZWQnO1xuXG5leHBvcnQgdHlwZSBIdHRwTWV0aG9kID0gJ0dFVCcgfCAnUE9TVCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGF0YVNvdXJjZSB7XG4gIGlkOiBzdHJpbmc7XG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICB0eXBlOiAnaHR0cCcgfCAnZ3NoZWV0JztcbiAgdXJsOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBDdXJyZW50bHkgb25seSB1c2VkIGJ5IGdzaGVldC4gYGFycmF5YCByZXR1cm5zIHRoZSBzaGVldCBhcyBhbiBhcnJheSBvZlxuICAgKiBhcnJheXMsIGBtYXBgIHJldHVybnMgdGhlIHNoZWV0IGFzIGFuIGFycmF5IG9mIG9iamVjdHMuXG4gICAqL1xuICBkYXRhRm9ybWF0PzogJ2FycmF5JyB8ICdtYXAnO1xuICAvKipcbiAgICogT3B0aW9ucyBmb3IgSFRUUCByZXF1ZXN0cy5cbiAgICovXG4gIGh0dHBPcHRpb25zPzoge1xuICAgIG1ldGhvZDogSHR0cE1ldGhvZDtcbiAgICBoZWFkZXJzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgICBib2R5Pzogc3RyaW5nO1xuICB9O1xuICBjcmVhdGVkQXQ6IFRpbWVzdGFtcDtcbiAgY3JlYXRlZEJ5OiBzdHJpbmc7XG4gIHN5bmNlZEF0PzogVGltZXN0YW1wO1xuICBzeW5jZWRCeT86IHN0cmluZztcbiAgcHVibGlzaGVkQXQ/OiBUaW1lc3RhbXA7XG4gIHB1Ymxpc2hlZEJ5Pzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERhdGFTb3VyY2VEYXRhPFQgPSBhbnk+IHtcbiAgZGF0YVNvdXJjZTogRGF0YVNvdXJjZTtcbiAgZGF0YTogVDtcbn1cblxuZXhwb3J0IHR5cGUgRGF0YVNvdXJjZU1vZGUgPSAnZHJhZnQnIHwgJ3B1Ymxpc2hlZCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2V0RG9jT3B0aW9ucyB7XG4gIC8qKiBNb2RlLCBlaXRoZXIgXCJkcmFmdFwiIG9yIFwicHVibGlzaGVkXCIuICovXG4gIG1vZGU6IERvY01vZGU7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2V0RG9jT3B0aW9ucyB7XG4gIC8qKiBNb2RlLCBlaXRoZXIgXCJkcmFmdFwiIG9yIFwicHVibGlzaGVkXCIuICovXG4gIG1vZGU6IERvY01vZGU7XG4gIC8qKlxuICAgKiBFbWFpbCBvZiB1c2VyIG1vZGlmeWluZyB0aGUgZG9jLiBJZiBibGFuaywgZGVmYXVsdHMgdG8gYHJvb3QtY21zLWNsaWVudGAuXG4gICAqL1xuICBtb2RpZmllZEJ5Pzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExpc3REb2NzT3B0aW9ucyB7XG4gIG1vZGU6IERvY01vZGU7XG4gIG9mZnNldD86IG51bWJlcjtcbiAgbGltaXQ/OiBudW1iZXI7XG4gIG9yZGVyQnk/OiBzdHJpbmc7XG4gIG9yZGVyQnlEaXJlY3Rpb24/OiAnYXNjJyB8ICdkZXNjJztcbiAgcXVlcnk/OiAocXVlcnk6IFF1ZXJ5KSA9PiBRdWVyeTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBHZXRDb3VudE9wdGlvbnMge1xuICBtb2RlOiBEb2NNb2RlO1xuICBxdWVyeT86IChxdWVyeTogUXVlcnkpID0+IFF1ZXJ5O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zbGF0aW9uIHtcbiAgW2xvY2FsZTogc3RyaW5nXTogc3RyaW5nO1xuICBzb3VyY2U6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2xhdGlvbnNNYXAge1xuICBbaGFzaDogc3RyaW5nXTogVHJhbnNsYXRpb247XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTG9jYWxlVHJhbnNsYXRpb25zIHtcbiAgW3NvdXJjZTogc3RyaW5nXTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExvYWRUcmFuc2xhdGlvbnNPcHRpb25zIHtcbiAgdGFncz86IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlbGVhc2Uge1xuICBpZDogc3RyaW5nO1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgZG9jSWRzPzogc3RyaW5nW107XG4gIGNyZWF0ZWRBdD86IFRpbWVzdGFtcDtcbiAgY3JlYXRlZEJ5Pzogc3RyaW5nO1xuICBzY2hlZHVsZWRBdD86IFRpbWVzdGFtcDtcbiAgc2NoZWR1bGVkQnk/OiBzdHJpbmc7XG4gIHB1Ymxpc2hlZEF0PzogVGltZXN0YW1wO1xuICBwdWJsaXNoZWRCeT86IHN0cmluZztcbn1cblxuZXhwb3J0IGNsYXNzIFJvb3RDTVNDbGllbnQge1xuICBwcml2YXRlIHJlYWRvbmx5IHJvb3RDb25maWc6IFJvb3RDb25maWc7XG4gIHByaXZhdGUgcmVhZG9ubHkgY21zUGx1Z2luOiBDTVNQbHVnaW47XG4gIHByaXZhdGUgcmVhZG9ubHkgcHJvamVjdElkOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGI6IEZpcmVzdG9yZTtcblxuICBjb25zdHJ1Y3Rvcihyb290Q29uZmlnOiBSb290Q29uZmlnKSB7XG4gICAgdGhpcy5yb290Q29uZmlnID0gcm9vdENvbmZpZztcbiAgICB0aGlzLmNtc1BsdWdpbiA9IGdldENtc1BsdWdpbih0aGlzLnJvb3RDb25maWcpO1xuXG4gICAgY29uc3QgY21zUGx1Z2luT3B0aW9ucyA9IHRoaXMuY21zUGx1Z2luLmdldENvbmZpZygpO1xuICAgIHRoaXMucHJvamVjdElkID0gY21zUGx1Z2luT3B0aW9ucy5pZCB8fCAnZGVmYXVsdCc7XG4gICAgdGhpcy5hcHAgPSB0aGlzLmNtc1BsdWdpbi5nZXRGaXJlYmFzZUFwcCgpO1xuICAgIHRoaXMuZGIgPSBnZXRGaXJlc3RvcmUodGhpcy5hcHApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyBkb2MgZGF0YSBmcm9tIFJvb3QuanMgQ01TLlxuICAgKi9cbiAgYXN5bmMgZ2V0RG9jPEZpZWxkcyA9IGFueT4oXG4gICAgY29sbGVjdGlvbklkOiBzdHJpbmcsXG4gICAgc2x1Zzogc3RyaW5nLFxuICAgIG9wdGlvbnM6IEdldERvY09wdGlvbnNcbiAgKTogUHJvbWlzZTxEb2M8RmllbGRzPiB8IG51bGw+IHtcbiAgICBjb25zdCByYXdEYXRhID0gYXdhaXQgdGhpcy5nZXRSYXdEb2MoY29sbGVjdGlvbklkLCBzbHVnLCBvcHRpb25zKTtcbiAgICBpZiAocmF3RGF0YSkge1xuICAgICAgcmV0dXJuIHVubWFyc2hhbERhdGEocmF3RGF0YSkgYXMgRG9jPEZpZWxkcz47XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyByYXcgZG9jIGRhdGEgYXMgc3RvcmVkIGluIHRoZSBkYXRhYmFzZS4gT25seSB1c2UgdGhpcyBpZiB5b3Uga25vd1xuICAgKiB3aGF0IHlvdSBhcmUgZG9pbmcuXG4gICAqL1xuICBhc3luYyBnZXRSYXdEb2MoXG4gICAgY29sbGVjdGlvbklkOiBzdHJpbmcsXG4gICAgc2x1Zzogc3RyaW5nLFxuICAgIG9wdGlvbnM6IEdldERvY09wdGlvbnNcbiAgKTogUHJvbWlzZTxhbnkgfCBudWxsPiB7XG4gICAgY29uc3QgbW9kZSA9IG9wdGlvbnMubW9kZTtcbiAgICBjb25zdCBtb2RlQ29sbGVjdGlvbiA9IG1vZGUgPT09ICdkcmFmdCcgPyAnRHJhZnRzJyA6ICdQdWJsaXNoZWQnO1xuICAgIC8vIFNsdWdzIHdpdGggc2xhc2hlcyBhcmUgZW5jb2RlZCBhcyBgLS1gIGluIHRoZSBEQi5cbiAgICBzbHVnID0gc2x1Zy5yZXBsYWNlQWxsKCcvJywgJy0tJyk7XG4gICAgY29uc3QgZGJQYXRoID0gYFByb2plY3RzLyR7dGhpcy5wcm9qZWN0SWR9L0NvbGxlY3Rpb25zLyR7Y29sbGVjdGlvbklkfS8ke21vZGVDb2xsZWN0aW9ufS8ke3NsdWd9YDtcbiAgICBjb25zdCBkb2NSZWYgPSB0aGlzLmRiLmRvYyhkYlBhdGgpO1xuICAgIGNvbnN0IGRvYyA9IGF3YWl0IGRvY1JlZi5nZXQoKTtcbiAgICBpZiAoZG9jLmV4aXN0cykge1xuICAgICAgcmV0dXJuIGRvYy5kYXRhKCk7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgYXN5bmMgc2V0UmF3RG9jKFxuICAgIGNvbGxlY3Rpb25JZDogc3RyaW5nLFxuICAgIHNsdWc6IHN0cmluZyxcbiAgICBkYXRhOiBhbnksXG4gICAgb3B0aW9uczogU2V0RG9jT3B0aW9uc1xuICApIHtcbiAgICBjb25zdCBtb2RlID0gb3B0aW9ucy5tb2RlO1xuICAgIGNvbnN0IG1vZGVDb2xsZWN0aW9uID0gbW9kZSA9PT0gJ2RyYWZ0JyA/ICdEcmFmdHMnIDogJ1B1Ymxpc2hlZCc7XG4gICAgY29uc3QgZGJQYXRoID0gYFByb2plY3RzLyR7dGhpcy5wcm9qZWN0SWR9L0NvbGxlY3Rpb25zLyR7Y29sbGVjdGlvbklkfS8ke21vZGVDb2xsZWN0aW9ufS8ke3NsdWd9YDtcbiAgICBjb25zdCBkb2NSZWYgPSB0aGlzLmRiLmRvYyhkYlBhdGgpO1xuICAgIGF3YWl0IGRvY1JlZi5zZXQoZGF0YSk7XG4gIH1cblxuICAvKipcbiAgICogTGlzdHMgZG9jcyBmcm9tIGEgUm9vdC5qcyBDTVMgY29sbGVjdGlvbi5cbiAgICovXG4gIGFzeW5jIGxpc3REb2NzPFQ+KFxuICAgIGNvbGxlY3Rpb25JZDogc3RyaW5nLFxuICAgIG9wdGlvbnM6IExpc3REb2NzT3B0aW9uc1xuICApOiBQcm9taXNlPHtkb2NzOiBUW119PiB7XG4gICAgY29uc3QgbW9kZSA9IG9wdGlvbnMubW9kZTtcbiAgICBjb25zdCBtb2RlQ29sbGVjdGlvbiA9IG1vZGUgPT09ICdkcmFmdCcgPyAnRHJhZnRzJyA6ICdQdWJsaXNoZWQnO1xuICAgIGNvbnN0IGRiUGF0aCA9IGBQcm9qZWN0cy8ke3RoaXMucHJvamVjdElkfS9Db2xsZWN0aW9ucy8ke2NvbGxlY3Rpb25JZH0vJHttb2RlQ29sbGVjdGlvbn1gO1xuICAgIGxldCBxdWVyeTogUXVlcnkgPSB0aGlzLmRiLmNvbGxlY3Rpb24oZGJQYXRoKTtcbiAgICBpZiAob3B0aW9ucy5saW1pdCkge1xuICAgICAgcXVlcnkgPSBxdWVyeS5saW1pdChvcHRpb25zLmxpbWl0KTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMub2Zmc2V0KSB7XG4gICAgICBxdWVyeSA9IHF1ZXJ5Lm9mZnNldChvcHRpb25zLm9mZnNldCk7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLm9yZGVyQnkpIHtcbiAgICAgIHF1ZXJ5ID0gcXVlcnkub3JkZXJCeShvcHRpb25zLm9yZGVyQnksIG9wdGlvbnMub3JkZXJCeURpcmVjdGlvbik7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLnF1ZXJ5KSB7XG4gICAgICBxdWVyeSA9IG9wdGlvbnMucXVlcnkocXVlcnkpO1xuICAgIH1cbiAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgcXVlcnkuZ2V0KCk7XG4gICAgY29uc3QgZG9jczogVFtdID0gW107XG4gICAgcmVzdWx0cy5mb3JFYWNoKChyZXN1bHQpID0+IHtcbiAgICAgIGNvbnN0IGRvYyA9IHVubWFyc2hhbERhdGEocmVzdWx0LmRhdGEoKSkgYXMgVDtcbiAgICAgIGRvY3MucHVzaChkb2MpO1xuICAgIH0pO1xuICAgIHJldHVybiB7ZG9jc307XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGRvY3MgaW4gYSBSb290LmpzIENNUyBjb2xsZWN0aW9uLlxuICAgKi9cbiAgYXN5bmMgZ2V0RG9jc0NvdW50KGNvbGxlY3Rpb25JZDogc3RyaW5nLCBvcHRpb25zOiBHZXRDb3VudE9wdGlvbnMpIHtcbiAgICBjb25zdCBtb2RlID0gb3B0aW9ucy5tb2RlO1xuICAgIGNvbnN0IG1vZGVDb2xsZWN0aW9uID0gbW9kZSA9PT0gJ2RyYWZ0JyA/ICdEcmFmdHMnIDogJ1B1Ymxpc2hlZCc7XG4gICAgY29uc3QgZGJQYXRoID0gYFByb2plY3RzLyR7dGhpcy5wcm9qZWN0SWR9L0NvbGxlY3Rpb25zLyR7Y29sbGVjdGlvbklkfS8ke21vZGVDb2xsZWN0aW9ufWA7XG4gICAgbGV0IHF1ZXJ5OiBRdWVyeSA9IHRoaXMuZGIuY29sbGVjdGlvbihkYlBhdGgpO1xuICAgIGlmIChvcHRpb25zLnF1ZXJ5KSB7XG4gICAgICBxdWVyeSA9IG9wdGlvbnMucXVlcnkocXVlcnkpO1xuICAgIH1cbiAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgcXVlcnkuY291bnQoKS5nZXQoKTtcbiAgICBjb25zdCBjb3VudCA9IHJlc3VsdHMuZGF0YSgpLmNvdW50O1xuICAgIHJldHVybiBjb3VudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBCYXRjaCBwdWJsaXNoZXMgYSBzZXQgb2YgZG9jcyBieSBpZC5cbiAgICovXG4gIGFzeW5jIHB1Ymxpc2hEb2NzKFxuICAgIGRvY0lkczogc3RyaW5nW10sXG4gICAgb3B0aW9ucz86IHtwdWJsaXNoZWRCeTogc3RyaW5nOyBiYXRjaD86IFdyaXRlQmF0Y2h9XG4gICkge1xuICAgIGNvbnN0IHByb2plY3RDb2xsZWN0aW9uc1BhdGggPSBgUHJvamVjdHMvJHt0aGlzLnByb2plY3RJZH0vQ29sbGVjdGlvbnNgO1xuICAgIGNvbnN0IHB1Ymxpc2hlZEJ5ID0gb3B0aW9ucz8ucHVibGlzaGVkQnkgfHwgJ3Jvb3QtY21zLWNsaWVudCc7XG5cbiAgICAvLyBGZXRjaCB0aGUgY3VycmVudCBkcmFmdCBkYXRhIGZvciBlYWNoIGRvYy5cbiAgICBjb25zdCBkb2NSZWZzID0gZG9jSWRzLm1hcCgoZG9jSWQpID0+IHtcbiAgICAgIGNvbnN0IFtjb2xsZWN0aW9uLCBzbHVnXSA9IGRvY0lkLnNwbGl0KCcvJyk7XG4gICAgICBpZiAoIWNvbGxlY3Rpb24gfHwgIXNsdWcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIGRvYyBpZDogJHtkb2NJZH1gKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGRvY1JlZiA9IHRoaXMuZGIuZG9jKFxuICAgICAgICBgJHtwcm9qZWN0Q29sbGVjdGlvbnNQYXRofS8ke2NvbGxlY3Rpb259L0RyYWZ0cy8ke3NsdWd9YFxuICAgICAgKTtcbiAgICAgIHJldHVybiBkb2NSZWY7XG4gICAgfSk7XG4gICAgY29uc3QgZG9jU25hcHNob3RzID0gYXdhaXQgdGhpcy5kYi5nZXRBbGwoLi4uZG9jUmVmcyk7XG4gICAgY29uc3QgZG9jcyA9IGRvY1NuYXBzaG90c1xuICAgICAgLy8gUmV0cmlldmUgc25hcHNob3QgZGF0YSBmb3IgZWFjaCBkb2MuXG4gICAgICAubWFwKChzbmFwc2hvdCkgPT4gc25hcHNob3QuZGF0YSgpIGFzIERvYylcbiAgICAgIC8vIFJlbW92ZSBkb2NzIHRoYXQgZG9uJ3QgZXhpc3QuXG4gICAgICAuZmlsdGVyKChkKSA9PiAhIWQpO1xuXG4gICAgaWYgKGRvY3MubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb25zb2xlLmxvZygnbm8gZG9jcyB0byBwdWJsaXNoJyk7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgLy8gLy8gRWFjaCB0cmFuc2FjdGlvbiBvciBiYXRjaCBjYW4gd3JpdGUgYSBtYXggb2YgNTAwIG9wcy5cbiAgICAvLyAvLyBodHRwczovL2ZpcmViYXNlLmdvb2dsZS5jb20vZG9jcy9maXJlc3RvcmUvbWFuYWdlLWRhdGEvdHJhbnNhY3Rpb25zXG4gICAgbGV0IGJhdGNoQ291bnQgPSAwO1xuICAgIGNvbnN0IGJhdGNoID0gb3B0aW9ucz8uYmF0Y2ggfHwgdGhpcy5kYi5iYXRjaCgpO1xuICAgIGNvbnN0IHB1Ymxpc2hlZERvY3M6IGFueVtdID0gW107XG4gICAgZm9yIChjb25zdCBkb2Mgb2YgZG9jcykge1xuICAgICAgY29uc3Qge2lkLCBjb2xsZWN0aW9uLCBzbHVnLCBzeXMsIGZpZWxkc30gPSBkb2M7XG4gICAgICBjb25zdCBkcmFmdFJlZiA9IHRoaXMuZGIuZG9jKFxuICAgICAgICBgJHtwcm9qZWN0Q29sbGVjdGlvbnNQYXRofS8ke2NvbGxlY3Rpb259L0RyYWZ0cy8ke3NsdWd9YFxuICAgICAgKTtcbiAgICAgIGNvbnN0IHNjaGVkdWxlZFJlZiA9IHRoaXMuZGIuZG9jKFxuICAgICAgICBgJHtwcm9qZWN0Q29sbGVjdGlvbnNQYXRofS8ke2NvbGxlY3Rpb259L1NjaGVkdWxlZC8ke3NsdWd9YFxuICAgICAgKTtcbiAgICAgIGNvbnN0IHB1Ymxpc2hlZFJlZiA9IHRoaXMuZGIuZG9jKFxuICAgICAgICBgJHtwcm9qZWN0Q29sbGVjdGlvbnNQYXRofS8ke2NvbGxlY3Rpb259L1B1Ymxpc2hlZC8ke3NsdWd9YFxuICAgICAgKTtcblxuICAgICAgLy8gT25seSB1cGRhdGUgYGZpcnN0UHVibGlzaGVkYCBpZiBpdCBkb2Vzbid0IGFscmVhZHkgZXhpc3QuXG4gICAgICBjb25zdCBmaXJzdFB1Ymxpc2hlZEF0ID1cbiAgICAgICAgc3lzLmZpcnN0UHVibGlzaGVkQXQgPz8gRmllbGRWYWx1ZS5zZXJ2ZXJUaW1lc3RhbXAoKTtcbiAgICAgIGNvbnN0IGZpcnN0UHVibGlzaGVkQnkgPSBzeXMuZmlyc3RQdWJsaXNoZWRCeSA/PyBwdWJsaXNoZWRCeTtcblxuICAgICAgLy8gU2F2ZSBwdWJsaXNoZWQgZG9jLlxuICAgICAgYmF0Y2guc2V0KHB1Ymxpc2hlZFJlZiwge1xuICAgICAgICBpZCxcbiAgICAgICAgY29sbGVjdGlvbixcbiAgICAgICAgc2x1ZyxcbiAgICAgICAgZmllbGRzOiBmaWVsZHMgfHwge30sXG4gICAgICAgIHN5czoge1xuICAgICAgICAgIC4uLnN5cyxcbiAgICAgICAgICBmaXJzdFB1Ymxpc2hlZEF0OiBmaXJzdFB1Ymxpc2hlZEF0LFxuICAgICAgICAgIGZpcnN0UHVibGlzaGVkQnk6IGZpcnN0UHVibGlzaGVkQnksXG4gICAgICAgICAgcHVibGlzaGVkQXQ6IEZpZWxkVmFsdWUuc2VydmVyVGltZXN0YW1wKCksXG4gICAgICAgICAgcHVibGlzaGVkQnk6IHB1Ymxpc2hlZEJ5LFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgICBiYXRjaENvdW50ICs9IDE7XG5cbiAgICAgIC8vIFJlbW92ZSBzY2hlZHVsZWQgZG9jLCBpZiBhbnkuXG4gICAgICBiYXRjaC5kZWxldGUoc2NoZWR1bGVkUmVmKTtcbiAgICAgIGJhdGNoQ291bnQgKz0gMTtcblxuICAgICAgLy8gVXBkYXRlIHRoZSBkcmFmdCBkb2MgdG8gcmVtb3ZlIGBzY2hlZHVsZWRBdGAgYW5kIGBzY2hlZHVsZWRCeWAgZmllbGRzXG4gICAgICAvLyBhbmQgdXBkYXRlIHRoZSBgcHVibGlzaGVkQXRgIGFuZCBgcHVibGlzaGVkQnlgIGZpZWxkcy5cbiAgICAgIGJhdGNoLnVwZGF0ZShkcmFmdFJlZiwge1xuICAgICAgICAnc3lzLnNjaGVkdWxlZEF0JzogRmllbGRWYWx1ZS5kZWxldGUoKSxcbiAgICAgICAgJ3N5cy5zY2hlZHVsZWRCeSc6IEZpZWxkVmFsdWUuZGVsZXRlKCksXG4gICAgICAgICdzeXMuZmlyc3RQdWJsaXNoZWRBdCc6IGZpcnN0UHVibGlzaGVkQXQsXG4gICAgICAgICdzeXMuZmlyc3RQdWJsaXNoZWRCeSc6IGZpcnN0UHVibGlzaGVkQnksXG4gICAgICAgICdzeXMucHVibGlzaGVkQXQnOiBGaWVsZFZhbHVlLnNlcnZlclRpbWVzdGFtcCgpLFxuICAgICAgICAnc3lzLnB1Ymxpc2hlZEJ5JzogcHVibGlzaGVkQnksXG4gICAgICB9KTtcbiAgICAgIGJhdGNoQ291bnQgKz0gMTtcblxuICAgICAgcHVibGlzaGVkRG9jcy5wdXNoKGRvYyk7XG5cbiAgICAgIGlmIChiYXRjaENvdW50ID49IDQwMCkge1xuICAgICAgICBhd2FpdCBiYXRjaC5jb21taXQoKTtcbiAgICAgICAgYmF0Y2hDb3VudCA9IDA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGJhdGNoQ291bnQgPiAwKSB7XG4gICAgICBhd2FpdCBiYXRjaC5jb21taXQoKTtcbiAgICB9XG4gICAgY29uc29sZS5sb2coYHB1Ymxpc2hlZCAke3B1Ymxpc2hlZERvY3MubGVuZ3RofSBkb2NzIWApO1xuICAgIHJldHVybiBwdWJsaXNoZWREb2NzO1xuICB9XG5cbiAgLyoqXG4gICAqIFB1Ymxpc2hlcyBzY2hlZHVsZWQgZG9jcy5cbiAgICovXG4gIGFzeW5jIHB1Ymxpc2hTY2hlZHVsZWREb2NzKCkge1xuICAgIGNvbnN0IHByb2plY3RDb2xsZWN0aW9uc1BhdGggPSBgUHJvamVjdHMvJHt0aGlzLnByb2plY3RJZH0vQ29sbGVjdGlvbnNgO1xuICAgIGNvbnN0IG5vdyA9IE1hdGguY2VpbChuZXcgRGF0ZSgpLmdldFRpbWUoKSk7XG5cbiAgICBjb25zdCBzbmFwc2hvdCA9IGF3YWl0IHRoaXMuZGIuY29sbGVjdGlvbkdyb3VwKCdTY2hlZHVsZWQnKS5nZXQoKTtcbiAgICBjb25zdCBkb2NzID0gc25hcHNob3QuZG9jc1xuICAgICAgLmZpbHRlcigoZCkgPT4ge1xuICAgICAgICAvLyBGaWx0ZXIgZG9jcyBieSBwcm9qZWN0LlxuICAgICAgICBpZiAoIWQucmVmLnBhdGguc3RhcnRzV2l0aChwcm9qZWN0Q29sbGVjdGlvbnNQYXRoKSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBGaWx0ZXIgZG9jcyB3aGVyZSBzY2hlZHVsZWRBdCBpcyBpbiB0aGUgcGFzdC5cbiAgICAgICAgLy8gTk9URShzdGV2ZW5sZSk6IHRoZSBmaWx0ZXJpbmcgaXMgZG9uZSBtYW51YWxseSBpbnN0ZWFkIG9mIHVzaW5nIGEgcXVlcnlcbiAgICAgICAgLy8gdG8gYXZvaWQgaGF2aW5nIHRvIGNyZWF0ZSBhbiBpbmRleCBpbiBmaXJlc3RvcmUuXG4gICAgICAgIGNvbnN0IGRhdGEgPSBkLmRhdGEoKSB8fCB7fTtcbiAgICAgICAgY29uc3Qgc2NoZWR1bGVkQXQ6IFRpbWVzdGFtcCB8IHVuZGVmaW5lZCA9IGRhdGEuc3lzPy5zY2hlZHVsZWRBdDtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICBzY2hlZHVsZWRBdCAmJiBzY2hlZHVsZWRBdC50b01pbGxpcyAmJiBzY2hlZHVsZWRBdC50b01pbGxpcygpIDw9IG5vd1xuICAgICAgICApO1xuICAgICAgfSlcbiAgICAgIC5tYXAoKGQpID0+IHtcbiAgICAgICAgY29uc3QgZGJQYXRoID0gZC5yZWYucGF0aDtcbiAgICAgICAgY29uc3Qgc2VnbWVudHMgPSBkYlBhdGguc3BsaXQoJy8nKTtcbiAgICAgICAgY29uc3Qgc2x1ZyA9IHNlZ21lbnRzLmF0KC0xKTtcbiAgICAgICAgY29uc3QgY29sbGVjdGlvbiA9IHNlZ21lbnRzLmF0KC0zKTtcbiAgICAgICAgY29uc3QgaWQgPSBgJHtjb2xsZWN0aW9ufS8ke3NsdWd9YDtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBkYXRhOiBkLmRhdGEoKSxcbiAgICAgICAgICBpZCxcbiAgICAgICAgICBjb2xsZWN0aW9uLFxuICAgICAgICAgIHNsdWcsXG4gICAgICAgIH07XG4gICAgICB9KTtcblxuICAgIGlmIChkb2NzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29uc29sZS5sb2coJ25vIGRvY3MgdG8gc2NoZWR1bGUnKTtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICAvLyBFYWNoIHRyYW5zYWN0aW9uIG9yIGJhdGNoIGNhbiB3cml0ZSBhIG1heCBvZiA1MDAgb3BzLlxuICAgIC8vIGh0dHBzOi8vZmlyZWJhc2UuZ29vZ2xlLmNvbS9kb2NzL2ZpcmVzdG9yZS9tYW5hZ2UtZGF0YS90cmFuc2FjdGlvbnNcbiAgICBsZXQgYmF0Y2hDb3VudCA9IDA7XG4gICAgY29uc3QgYmF0Y2ggPSB0aGlzLmRiLmJhdGNoKCk7XG4gICAgY29uc3QgcHVibGlzaGVkRG9jczogYW55W10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGRvYyBvZiBkb2NzKSB7XG4gICAgICBjb25zdCB7aWQsIGNvbGxlY3Rpb24sIHNsdWcsIGRhdGF9ID0gZG9jO1xuICAgICAgY29uc3QgZHJhZnRSZWYgPSB0aGlzLmRiLmRvYyhcbiAgICAgICAgYCR7cHJvamVjdENvbGxlY3Rpb25zUGF0aH0vJHtjb2xsZWN0aW9ufS9EcmFmdHMvJHtzbHVnfWBcbiAgICAgICk7XG4gICAgICBjb25zdCBzY2hlZHVsZWRSZWYgPSB0aGlzLmRiLmRvYyhcbiAgICAgICAgYCR7cHJvamVjdENvbGxlY3Rpb25zUGF0aH0vJHtjb2xsZWN0aW9ufS9TY2hlZHVsZWQvJHtzbHVnfWBcbiAgICAgICk7XG4gICAgICBjb25zdCBwdWJsaXNoZWRSZWYgPSB0aGlzLmRiLmRvYyhcbiAgICAgICAgYCR7cHJvamVjdENvbGxlY3Rpb25zUGF0aH0vJHtjb2xsZWN0aW9ufS9QdWJsaXNoZWQvJHtzbHVnfWBcbiAgICAgICk7XG4gICAgICBjb25zdCB7c2NoZWR1bGVkQXQsIHNjaGVkdWxlZEJ5LCAuLi5zeXN9ID0gZGF0YS5zeXMgfHwge307XG5cbiAgICAgIC8vIE9ubHkgdXBkYXRlIGBmaXJzdFB1Ymxpc2hlZGAgaWYgaXQgZG9lc24ndCBhbHJlYWR5IGV4aXN0LlxuICAgICAgY29uc3QgZmlyc3RQdWJsaXNoZWRBdCA9IHN5cy5maXJzdFB1Ymxpc2hlZEF0ID8/IHNjaGVkdWxlZEF0O1xuICAgICAgY29uc3QgZmlyc3RQdWJsaXNoZWRCeSA9XG4gICAgICAgIHN5cy5maXJzdFB1Ymxpc2hlZEJ5ID8/IChzY2hlZHVsZWRCeSB8fCAncm9vdC1jbXMtY2xpZW50Jyk7XG5cbiAgICAgIC8vIFNhdmUgcHVibGlzaGVkIGRvYy5cbiAgICAgIGJhdGNoLnNldChwdWJsaXNoZWRSZWYsIHtcbiAgICAgICAgaWQsXG4gICAgICAgIGNvbGxlY3Rpb24sXG4gICAgICAgIHNsdWcsXG4gICAgICAgIGZpZWxkczogZGF0YS5maWVsZHMgfHwge30sXG4gICAgICAgIHN5czoge1xuICAgICAgICAgIC4uLnN5cyxcbiAgICAgICAgICBmaXJzdFB1Ymxpc2hlZEF0OiBmaXJzdFB1Ymxpc2hlZEF0LFxuICAgICAgICAgIGZpcnN0UHVibGlzaGVkQnk6IGZpcnN0UHVibGlzaGVkQnksXG4gICAgICAgICAgcHVibGlzaGVkQXQ6IEZpZWxkVmFsdWUuc2VydmVyVGltZXN0YW1wKCksXG4gICAgICAgICAgcHVibGlzaGVkQnk6IHNjaGVkdWxlZEJ5IHx8ICcnLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgICBiYXRjaENvdW50ICs9IDE7XG5cbiAgICAgIC8vIFJlbW92ZSBwdWJsaXNoZWQgZG9jLlxuICAgICAgYmF0Y2guZGVsZXRlKHNjaGVkdWxlZFJlZik7XG4gICAgICBiYXRjaENvdW50ICs9IDE7XG5cbiAgICAgIC8vIFVwZGF0ZSB0aGUgZHJhZnQgZG9jIHRvIHJlbW92ZSBgc2NoZWR1bGVkQXRgIGFuZCBgc2NoZWR1bGVkQnlgIGZpZWxkc1xuICAgICAgLy8gYW5kIHVwZGF0ZSB0aGUgYHB1Ymxpc2hlZEF0YCBhbmQgYHB1Ymxpc2hlZEJ5YCBmaWVsZHMuXG4gICAgICBiYXRjaC51cGRhdGUoZHJhZnRSZWYsIHtcbiAgICAgICAgJ3N5cy5zY2hlZHVsZWRBdCc6IEZpZWxkVmFsdWUuZGVsZXRlKCksXG4gICAgICAgICdzeXMuc2NoZWR1bGVkQnknOiBGaWVsZFZhbHVlLmRlbGV0ZSgpLFxuICAgICAgICAnc3lzLmZpcnN0UHVibGlzaGVkQXQnOiBmaXJzdFB1Ymxpc2hlZEF0LFxuICAgICAgICAnc3lzLmZpcnN0UHVibGlzaGVkQnknOiBmaXJzdFB1Ymxpc2hlZEJ5LFxuICAgICAgICAnc3lzLnB1Ymxpc2hlZEF0JzogRmllbGRWYWx1ZS5zZXJ2ZXJUaW1lc3RhbXAoKSxcbiAgICAgICAgJ3N5cy5wdWJsaXNoZWRCeSc6IHNjaGVkdWxlZEJ5IHx8ICdyb290LWNtcy1jbGllbnQnLFxuICAgICAgfSk7XG4gICAgICBiYXRjaENvdW50ICs9IDE7XG5cbiAgICAgIHB1Ymxpc2hlZERvY3MucHVzaChkb2MpO1xuXG4gICAgICBpZiAoYmF0Y2hDb3VudCA+PSA0MDApIHtcbiAgICAgICAgYXdhaXQgYmF0Y2guY29tbWl0KCk7XG4gICAgICAgIGJhdGNoQ291bnQgPSAwO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoYmF0Y2hDb3VudCA+IDApIHtcbiAgICAgIGF3YWl0IGJhdGNoLmNvbW1pdCgpO1xuICAgIH1cbiAgICBjb25zb2xlLmxvZyhgcHVibGlzaGVkICR7cHVibGlzaGVkRG9jcy5sZW5ndGh9IGRvY3MhYCk7XG4gICAgcmV0dXJuIHB1Ymxpc2hlZERvY3M7XG4gIH1cblxuICAvKipcbiAgICogUHVibGlzaGVzIGRvY3MgaW4gc2NoZWR1bGVkIHJlbGVhc2VzLlxuICAgKi9cbiAgYXN5bmMgcHVibGlzaFNjaGVkdWxlZFJlbGVhc2VzKCkge1xuICAgIGNvbnN0IHJlbGVhc2VzUGF0aCA9IGBQcm9qZWN0cy8ke3RoaXMucHJvamVjdElkfS9SZWxlYXNlc2A7XG4gICAgY29uc3Qgbm93ID0gTWF0aC5jZWlsKG5ldyBEYXRlKCkuZ2V0VGltZSgpKTtcbiAgICBjb25zdCBxdWVyeTogUXVlcnkgPSB0aGlzLmRiXG4gICAgICAuY29sbGVjdGlvbihyZWxlYXNlc1BhdGgpXG4gICAgICAud2hlcmUoJ3NjaGVkdWxlZEF0JywgJzw9JywgVGltZXN0YW1wLmZyb21NaWxsaXMobm93KSk7XG4gICAgY29uc3QgcXVlcnlTbmFwc2hvdCA9IGF3YWl0IHF1ZXJ5LmdldCgpO1xuXG4gICAgZm9yIChjb25zdCBzbmFwc2hvdCBvZiBxdWVyeVNuYXBzaG90LmRvY3MpIHtcbiAgICAgIGNvbnN0IHJlbGVhc2UgPSBzbmFwc2hvdC5kYXRhKCkgYXMgUmVsZWFzZTtcbiAgICAgIGNvbnN0IGJhdGNoID0gdGhpcy5kYi5iYXRjaCgpO1xuICAgICAgY29uc3QgcHVibGlzaGVkQnkgPSByZWxlYXNlLnNjaGVkdWxlZEJ5IHx8ICdyb290LWNtcy1jbGllbnQnO1xuICAgICAgYmF0Y2gudXBkYXRlKHNuYXBzaG90LnJlZiwge1xuICAgICAgICBwdWJsaXNoZWRBdDogVGltZXN0YW1wLm5vdygpLFxuICAgICAgICBwdWJsaXNoZWRCeTogcHVibGlzaGVkQnksXG4gICAgICAgIHNjaGVkdWxlZEF0OiBGaWVsZFZhbHVlLmRlbGV0ZSgpLFxuICAgICAgICBzY2hlZHVsZWRCeTogRmllbGRWYWx1ZS5kZWxldGUoKSxcbiAgICAgIH0pO1xuICAgICAgYXdhaXQgdGhpcy5wdWJsaXNoRG9jcyhyZWxlYXNlLmRvY0lkcyB8fCBbXSwge3B1Ymxpc2hlZEJ5LCBiYXRjaH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkcyB0cmFuc2xhdGlvbnMgc2F2ZWQgaW4gdGhlIHRyYW5zbGF0aW9ucyBjb2xsZWN0aW9uLCBvcHRpb25hbGx5XG4gICAqIGZpbHRlcmVkIGJ5IHRhZy5cbiAgICpcbiAgICogUmV0dXJucyBhIG1hcCBsaWtlOlxuICAgKiBgYGBcbiAgICoge1xuICAgKiAgIFwiPGhhc2g+XCI6IHtcInNvdXJjZVwiOiBcIkhlbGxvXCIsIFwiZXNcIjogXCJIb2xhXCIsIFwiZnJcIjogXCJCb25qb3VyXCJ9LFxuICAgKiB9XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgbG9hZFRyYW5zbGF0aW9ucyhcbiAgICBvcHRpb25zPzogTG9hZFRyYW5zbGF0aW9uc09wdGlvbnNcbiAgKTogUHJvbWlzZTxUcmFuc2xhdGlvbnNNYXA+IHtcbiAgICBjb25zdCBkYlBhdGggPSBgUHJvamVjdHMvJHt0aGlzLnByb2plY3RJZH0vVHJhbnNsYXRpb25zYDtcbiAgICBsZXQgcXVlcnk6IFF1ZXJ5ID0gdGhpcy5kYi5jb2xsZWN0aW9uKGRiUGF0aCk7XG4gICAgaWYgKG9wdGlvbnM/LnRhZ3MpIHtcbiAgICAgIHF1ZXJ5ID0gcXVlcnkud2hlcmUoJ3RhZ3MnLCAnYXJyYXktY29udGFpbnMtYW55Jywgb3B0aW9ucy50YWdzKTtcbiAgICB9XG5cbiAgICBjb25zdCBxdWVyeVNuYXBzaG90ID0gYXdhaXQgcXVlcnkuZ2V0KCk7XG4gICAgY29uc3QgdHJhbnNsYXRpb25zTWFwOiBUcmFuc2xhdGlvbnNNYXAgPSB7fTtcbiAgICBxdWVyeVNuYXBzaG90LmZvckVhY2goKGRvYykgPT4ge1xuICAgICAgY29uc3QgaGFzaCA9IGRvYy5pZDtcbiAgICAgIHRyYW5zbGF0aW9uc01hcFtoYXNoXSA9IGRvYy5kYXRhKCkgYXMgVHJhbnNsYXRpb247XG4gICAgfSk7XG4gICAgcmV0dXJuIHRyYW5zbGF0aW9uc01hcDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTYXZlcyBhIG1hcCBvZiB0cmFuc2xhdGlvbnMsIGUuZy46XG4gICAqIGBgYFxuICAgKiBhd2FpdCBjbGllbnQuc2F2ZVRyYW5zbGF0aW9ucyh7XG4gICAqICAgXCJIZWxsb1wiOiB7XCJlc1wiOiBcIkhvbGFcIiwgXCJmclwiOiBcIkJvbmpvdXJcIn0sXG4gICAqIH0pO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIHNhdmVUcmFuc2xhdGlvbnMoXG4gICAgdHJhbnNsYXRpb25zOiB7XG4gICAgICBbc291cmNlOiBzdHJpbmddOiB7W2xvY2FsZTogc3RyaW5nXTogc3RyaW5nfTtcbiAgICB9LFxuICAgIHRhZ3M/OiBzdHJpbmdbXVxuICApIHtcbiAgICBjb25zdCB0cmFuc2xhdGlvbnNQYXRoID0gYFByb2plY3RzLyR7dGhpcy5wcm9qZWN0SWR9L1RyYW5zbGF0aW9uc2A7XG4gICAgY29uc3QgYmF0Y2ggPSB0aGlzLmRiLmJhdGNoKCk7XG4gICAgbGV0IGJhdGNoQ291bnQgPSAwO1xuICAgIE9iamVjdC5lbnRyaWVzKHRyYW5zbGF0aW9ucykuZm9yRWFjaCgoW3NvdXJjZSwgc291cmNlVHJhbnNsYXRpb25zXSkgPT4ge1xuICAgICAgY29uc3QgaGFzaCA9IHRoaXMuZ2V0VHJhbnNsYXRpb25LZXkoc291cmNlKTtcbiAgICAgIGNvbnN0IHRyYW5zbGF0aW9uUmVmID0gdGhpcy5kYi5kb2MoYCR7dHJhbnNsYXRpb25zUGF0aH0vJHtoYXNofWApO1xuICAgICAgY29uc3QgZGF0YTogYW55ID0ge1xuICAgICAgICAuLi5zb3VyY2VUcmFuc2xhdGlvbnMsXG4gICAgICAgIHNvdXJjZTogdGhpcy5ub3JtYWxpemVTdHJpbmcoc291cmNlKSxcbiAgICAgIH07XG4gICAgICBpZiAodGFncykge1xuICAgICAgICBkYXRhLnRhZ3MgPSB0YWdzO1xuICAgICAgfVxuICAgICAgYmF0Y2gudXBkYXRlKHRyYW5zbGF0aW9uUmVmLCBkYXRhKTtcbiAgICAgIGJhdGNoQ291bnQgKz0gMTtcbiAgICB9KTtcbiAgICBpZiAoYmF0Y2hDb3VudCA+IDUwMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd1cCB0byA1MDAgdHJhbnNsYXRpb25zIGNhbiBiZSBzYXZlZCBhdCBhIHRpbWUuJyk7XG4gICAgfVxuICAgIGF3YWl0IGJhdGNoLmNvbW1pdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIFwia2V5XCIgdXNlZCBmb3IgYSB0cmFuc2xhdGlvbiBhcyBzdG9yZWQgaW4gdGhlIGRiLiBUcmFuc2xhdGlvbnNcbiAgICogYXJlIHN0b3JlZCB1bmRlciBgUHJvamVjdHMvPHByb2plY3QgaWQ+L1RyYW5zbGF0aW9ucy88c2hhMSBoYXNoPmAuXG4gICAqL1xuICBnZXRUcmFuc2xhdGlvbktleShzb3VyY2U6IHN0cmluZykge1xuICAgIGNvbnN0IHNoYTEgPSBjcnlwdG9cbiAgICAgIC5jcmVhdGVIYXNoKCdzaGExJylcbiAgICAgIC51cGRhdGUodGhpcy5ub3JtYWxpemVTdHJpbmcoc291cmNlKSlcbiAgICAgIC5kaWdlc3QoJ2hleCcpO1xuICAgIHJldHVybiBzaGExO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFucyBhIHN0cmluZyB0aGF0J3MgdXNlZCBmb3IgdHJhbnNsYXRpb25zLiBQZXJmb3JtcyB0aGUgZm9sbG93aW5nOlxuICAgKiAtIFJlbW92ZXMgYW55IGxlYWRpbmcvdHJhaWxpbmcgd2hpdGVzcGFjZVxuICAgKiAtIFJlbW92ZXMgc3BhY2VzIGF0IHRoZSBlbmQgb2YgYW55IGxpbmVcbiAgICovXG4gIG5vcm1hbGl6ZVN0cmluZyhzdHI6IHN0cmluZykge1xuICAgIGNvbnN0IGxpbmVzID0gU3RyaW5nKHN0cilcbiAgICAgIC50cmltKClcbiAgICAgIC5zcGxpdCgnXFxuJylcbiAgICAgIC5tYXAoKGxpbmUpID0+IGxpbmUudHJpbUVuZCgpKTtcbiAgICByZXR1cm4gbGluZXMuam9pbignXFxuJyk7XG4gIH1cblxuICAvKipcbiAgICogTG9hZHMgdHJhbnNsYXRpb25zIGZvciBhIHBhcnRpY3VsYXIgbG9jYWxlLlxuICAgKlxuICAgKiBSZXR1cm5zIGEgbWFwIGxpa2U6XG4gICAqIGBgYFxuICAgKiB7XG4gICAqICAgXCJIZWxsb1wiOiBcIkJvbmpvdXJcIixcbiAgICogfVxuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGxvYWRUcmFuc2xhdGlvbnNGb3JMb2NhbGUoXG4gICAgbG9jYWxlOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IExvYWRUcmFuc2xhdGlvbnNPcHRpb25zXG4gICk6IFByb21pc2U8TG9jYWxlVHJhbnNsYXRpb25zPiB7XG4gICAgY29uc3QgdHJhbnNsYXRpb25zTWFwID0gYXdhaXQgdGhpcy5sb2FkVHJhbnNsYXRpb25zKG9wdGlvbnMpO1xuICAgIHJldHVybiB0cmFuc2xhdGlvbnNGb3JMb2NhbGUodHJhbnNsYXRpb25zTWFwLCBsb2NhbGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBkYXRhIHNvdXJjZSBjb25maWd1cmF0aW9uIG9iamVjdC5cbiAgICovXG4gIGFzeW5jIGdldERhdGFTb3VyY2UoZGF0YVNvdXJjZUlkOiBzdHJpbmcpIHtcbiAgICBjb25zdCBkYlBhdGggPSBgUHJvamVjdHMvJHt0aGlzLnByb2plY3RJZH0vRGF0YVNvdXJjZXMvJHtkYXRhU291cmNlSWR9YDtcbiAgICBjb25zdCBkb2NSZWYgPSB0aGlzLmRiLmRvYyhkYlBhdGgpO1xuICAgIGNvbnN0IGRvYyA9IGF3YWl0IGRvY1JlZi5nZXQoKTtcbiAgICBpZiAoZG9jLmV4aXN0cykge1xuICAgICAgcmV0dXJuIGRvYy5kYXRhKCkgYXMgRGF0YVNvdXJjZTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKipcbiAgICogU3luY3MgYSBkYXRhIHNvdXJjZSB0byBkcmFmdCBzdGF0ZS5cbiAgICovXG4gIGFzeW5jIHN5bmNEYXRhU291cmNlKGRhdGFTb3VyY2VJZDogc3RyaW5nLCBvcHRpb25zPzoge3N5bmNlZEJ5Pzogc3RyaW5nfSkge1xuICAgIGNvbnN0IGRhdGFTb3VyY2UgPSBhd2FpdCB0aGlzLmdldERhdGFTb3VyY2UoZGF0YVNvdXJjZUlkKTtcbiAgICBpZiAoIWRhdGFTb3VyY2UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgZGF0YSBzb3VyY2Ugbm90IGZvdW5kOiAke2RhdGFTb3VyY2VJZH1gKTtcbiAgICB9XG5cbiAgICBjb25zdCBkYXRhID0gYXdhaXQgdGhpcy5mZXRjaERhdGEoZGF0YVNvdXJjZSk7XG5cbiAgICBjb25zdCBkYXRhU291cmNlRG9jUmVmID0gdGhpcy5kYi5kb2MoXG4gICAgICBgUHJvamVjdHMvJHt0aGlzLnByb2plY3RJZH0vRGF0YVNvdXJjZXMvJHtkYXRhU291cmNlSWR9YFxuICAgICk7XG4gICAgY29uc3QgZGF0YURvY1JlZiA9IHRoaXMuZGIuZG9jKFxuICAgICAgYFByb2plY3RzLyR7dGhpcy5wcm9qZWN0SWR9L0RhdGFTb3VyY2VzLyR7ZGF0YVNvdXJjZUlkfS9EYXRhL2RyYWZ0YFxuICAgICk7XG4gICAgY29uc3Qgc3luY2VkQnkgPSBvcHRpb25zPy5zeW5jZWRCeSB8fCAncm9vdC1jbXMtY2xpZW50JztcblxuICAgIGNvbnN0IHVwZGF0ZWREYXRhU291cmNlOiBEYXRhU291cmNlID0ge1xuICAgICAgLi4uZGF0YVNvdXJjZSxcbiAgICAgIHN5bmNlZEF0OiBUaW1lc3RhbXAubm93KCksXG4gICAgICBzeW5jZWRCeTogc3luY2VkQnksXG4gICAgfTtcblxuICAgIGNvbnN0IGJhdGNoID0gdGhpcy5kYi5iYXRjaCgpO1xuICAgIGJhdGNoLnNldChkYXRhRG9jUmVmLCB7XG4gICAgICBkYXRhU291cmNlOiB1cGRhdGVkRGF0YVNvdXJjZSxcbiAgICAgIGRhdGE6IGRhdGEsXG4gICAgfSk7XG4gICAgYmF0Y2gudXBkYXRlKGRhdGFTb3VyY2VEb2NSZWYsIHtcbiAgICAgIHN5bmNlZEF0OiBUaW1lc3RhbXAubm93KCksXG4gICAgICBzeW5jZWRCeTogc3luY2VkQnksXG4gICAgfSk7XG4gICAgYXdhaXQgYmF0Y2guY29tbWl0KCk7XG5cbiAgICBjb25zb2xlLmxvZyhgc3luY2VkIGRhdGEgc291cmNlOiAke2RhdGFTb3VyY2VJZH1gKTtcbiAgICBjb25zb2xlLmxvZyhgc3luY2VkIGJ5OiAke3N5bmNlZEJ5fWApO1xuICB9XG5cbiAgYXN5bmMgcHVibGlzaERhdGFTb3VyY2UoXG4gICAgZGF0YVNvdXJjZUlkOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IHtwdWJsaXNoZWRCeT86IHN0cmluZ31cbiAgKSB7XG4gICAgY29uc3QgZGF0YVNvdXJjZSA9IGF3YWl0IHRoaXMuZ2V0RGF0YVNvdXJjZShkYXRhU291cmNlSWQpO1xuICAgIGlmICghZGF0YVNvdXJjZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBkYXRhIHNvdXJjZSBub3QgZm91bmQ6ICR7ZGF0YVNvdXJjZUlkfWApO1xuICAgIH1cblxuICAgIGNvbnN0IGRhdGFTb3VyY2VEb2NSZWYgPSB0aGlzLmRiLmRvYyhcbiAgICAgIGBQcm9qZWN0cy8ke3RoaXMucHJvamVjdElkfS9EYXRhU291cmNlcy8ke2RhdGFTb3VyY2VJZH1gXG4gICAgKTtcbiAgICBjb25zdCBkYXRhRG9jUmVmRHJhZnQgPSB0aGlzLmRiLmRvYyhcbiAgICAgIGBQcm9qZWN0cy8ke3RoaXMucHJvamVjdElkfS9EYXRhU291cmNlcy8ke2RhdGFTb3VyY2VJZH0vZHJhZnRgXG4gICAgKTtcbiAgICBjb25zdCBkYXRhRG9jUmVmUHVibGlzaGVkID0gdGhpcy5kYi5kb2MoXG4gICAgICBgUHJvamVjdHMvJHt0aGlzLnByb2plY3RJZH0vRGF0YVNvdXJjZXMvJHtkYXRhU291cmNlSWR9L3B1Ymxpc2hlZGBcbiAgICApO1xuXG4gICAgY29uc3QgZGF0YVJlcyA9IGF3YWl0IHRoaXMuZ2V0RnJvbURhdGFTb3VyY2UoZGF0YVNvdXJjZUlkLCB7bW9kZTogJ2RyYWZ0J30pO1xuXG4gICAgY29uc3QgcHVibGlzaGVkQnkgPSBvcHRpb25zPy5wdWJsaXNoZWRCeSB8fCAncm9vdC1jbXMtY2xpZW50JztcblxuICAgIGNvbnN0IHVwZGF0ZWREYXRhU291cmNlOiBEYXRhU291cmNlID0ge1xuICAgICAgLi4uZGF0YVNvdXJjZSxcbiAgICAgIHB1Ymxpc2hlZEF0OiBUaW1lc3RhbXAubm93KCksXG4gICAgICBwdWJsaXNoZWRCeTogcHVibGlzaGVkQnksXG4gICAgfTtcblxuICAgIGNvbnN0IGJhdGNoID0gdGhpcy5kYi5iYXRjaCgpO1xuICAgIGJhdGNoLnNldChkYXRhRG9jUmVmUHVibGlzaGVkLCB7XG4gICAgICBkYXRhU291cmNlOiB1cGRhdGVkRGF0YVNvdXJjZSxcbiAgICAgIGRhdGE6IGRhdGFSZXM/LmRhdGEgfHwgbnVsbCxcbiAgICB9KTtcbiAgICBiYXRjaC51cGRhdGUoZGF0YURvY1JlZkRyYWZ0LCB7XG4gICAgICBkYXRhU291cmNlOiB1cGRhdGVkRGF0YVNvdXJjZSxcbiAgICB9KTtcbiAgICBiYXRjaC51cGRhdGUoZGF0YVNvdXJjZURvY1JlZiwge1xuICAgICAgcHVibGlzaGVkQXQ6IFRpbWVzdGFtcC5ub3coKSxcbiAgICAgIHB1Ymxpc2hlZEJ5OiBwdWJsaXNoZWRCeSxcbiAgICB9KTtcbiAgICBhd2FpdCBiYXRjaC5jb21taXQoKTtcblxuICAgIGNvbnNvbGUubG9nKGBwdWJsaXNoZWQgZGF0YSAke2RhdGFTb3VyY2VJZH1gKTtcbiAgICBjb25zb2xlLmxvZyhgcHVibGlzaGVkIGJ5OiAke3B1Ymxpc2hlZEJ5fWApO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBmZXRjaERhdGEoZGF0YVNvdXJjZTogRGF0YVNvdXJjZSkge1xuICAgIGlmIChkYXRhU291cmNlLnR5cGUgPT09ICdodHRwJykge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZmV0Y2hIdHRwRGF0YShkYXRhU291cmNlKTtcbiAgICB9XG4gICAgLy8gVE9ETyhzdGV2ZW5sZSk6IGltcGwuXG4gICAgLy8gaWYgKGRhdGFTb3VyY2UudHlwZSA9PT0gJ2dzaGVldCcpIHtcbiAgICAvLyAgIHJldHVybiBhd2FpdCBmZXRjaEdzaGVldERhdGEoZGF0YVNvdXJjZSk7XG4gICAgLy8gfVxuICAgIHRocm93IG5ldyBFcnJvcihgdW5zdXBwb3J0ZWQgZGF0YSBzb3VyY2U6ICR7ZGF0YVNvdXJjZS50eXBlfWApO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBmZXRjaEh0dHBEYXRhKGRhdGFTb3VyY2U6IERhdGFTb3VyY2UpIHtcbiAgICBjb25zdCB1cmwgPSBkYXRhU291cmNlLnVybCB8fCAnJztcbiAgICBpZiAoIXVybC5zdGFydHNXaXRoKCdodHRwczovLycpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYHVybCBub3Qgc3VwcG9ydGVkOiAke3VybH1gKTtcbiAgICB9XG5cbiAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCh1cmwsIHtcbiAgICAgIG1ldGhvZDogZGF0YVNvdXJjZS5odHRwT3B0aW9ucz8ubWV0aG9kIHx8ICdHRVQnLFxuICAgICAgaGVhZGVyczogZGF0YVNvdXJjZS5odHRwT3B0aW9ucz8uaGVhZGVycyB8fCBbXSxcbiAgICAgIGJvZHk6IGRhdGFTb3VyY2UuaHR0cE9wdGlvbnM/LmJvZHkgfHwgdW5kZWZpbmVkLFxuICAgIH0pO1xuXG4gICAgaWYgKHJlcy5zdGF0dXMgIT09IDIwMCkge1xuICAgICAgY29uc3QgZXJyID0gYXdhaXQgcmVzLnRleHQoKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgcmVxIGZhaWxlZDogJHtlcnJ9YCk7XG4gICAgfVxuXG4gICAgY29uc3QgY29udGVudFR5cGUgPSBTdHJpbmcocmVzLmhlYWRlcnMuZ2V0KCdjb250ZW50LXR5cGUnKSk7XG4gICAgaWYgKGNvbnRlbnRUeXBlLmluY2x1ZGVzKCdhcHBsaWNhdGlvbi9qc29uJykpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXMuanNvbigpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzLnRleHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaGVzIGRhdGEgZnJvbSBhIGRhdGEgc291cmNlLlxuICAgKi9cbiAgYXN5bmMgZ2V0RnJvbURhdGFTb3VyY2U8VCA9IGFueT4oXG4gICAgZGF0YVNvdXJjZUlkOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IHttb2RlPzogJ2RyYWZ0JyB8ICdwdWJsaXNoZWQnfVxuICApOiBQcm9taXNlPERhdGFTb3VyY2VEYXRhPFQ+IHwgbnVsbD4ge1xuICAgIGNvbnN0IG1vZGUgPSBvcHRpb25zPy5tb2RlIHx8ICdwdWJsaXNoZWQnO1xuICAgIGlmICghKG1vZGUgPT09ICdkcmFmdCcgfHwgbW9kZSA9PT0gJ3B1Ymxpc2hlZCcpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgbW9kZTogJHttb2RlfWApO1xuICAgIH1cbiAgICBpZiAoIWRhdGFTb3VyY2VJZCB8fCBkYXRhU291cmNlSWQuaW5jbHVkZXMoJy8nKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIGRhdGEgc291cmNlIGlkOiAke2RhdGFTb3VyY2VJZH1gKTtcbiAgICB9XG5cbiAgICBjb25zdCBkYlBhdGggPSBgUHJvamVjdHMvJHt0aGlzLnByb2plY3RJZH0vRGF0YVNvdXJjZXMvJHtkYXRhU291cmNlSWR9L0RhdGEvJHttb2RlfWA7XG4gICAgY29uc3QgZG9jUmVmID0gdGhpcy5kYi5kb2MoZGJQYXRoKTtcbiAgICBjb25zdCBkb2MgPSBhd2FpdCBkb2NSZWYuZ2V0KCk7XG4gICAgaWYgKGRvYy5leGlzdHMpIHtcbiAgICAgIHJldHVybiBkb2MuZGF0YSgpIGFzIERhdGFTb3VyY2VEYXRhPFQ+O1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmllcyB1c2VyIGV4aXN0cyBpbiB0aGUgQUNMIGxpc3QuXG4gICAqL1xuICBhc3luYyB1c2VyRXhpc3RzSW5BY2woZW1haWw6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGlmICghZW1haWwpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgZG9jUmVmID0gdGhpcy5kYi5kb2MoYFByb2plY3RzLyR7dGhpcy5wcm9qZWN0SWR9YCk7XG4gICAgY29uc3Qgc25hcHNob3QgPSBhd2FpdCBkb2NSZWYuZ2V0KCk7XG4gICAgY29uc3QgZGF0YSA9IHNuYXBzaG90LmRhdGEoKSB8fCB7fTtcbiAgICBjb25zdCBhY2wgPSBkYXRhLnJvbGVzIHx8IHt9O1xuICAgIGlmIChlbWFpbCBpbiBhY2wpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8vIENoZWNrIHdpbGRjYXJkIGRvbWFpbnMsIGUuZy4gYCpAZXhhbXBsZS5jb21gLlxuICAgIGlmICghZW1haWwuaW5jbHVkZXMoJ0AnKSkge1xuICAgICAgY29uc29sZS53YXJuKGBpbnZhbGlkIGVtYWlsOiAke2VtYWlsfWApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBkb21haW4gPSBlbWFpbC5zcGxpdCgnQCcpLmF0KC0xKTtcbiAgICBpZiAoZG9tYWluICYmIGAqQCR7ZG9tYWlufWAgaW4gYWNsKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDbXNQbHVnaW4ocm9vdENvbmZpZzogUm9vdENvbmZpZyk6IENNU1BsdWdpbiB7XG4gIGNvbnN0IHBsdWdpbnM6IFBsdWdpbltdID0gcm9vdENvbmZpZy5wbHVnaW5zIHx8IFtdO1xuICBjb25zdCBwbHVnaW4gPSBwbHVnaW5zLmZpbmQoKHBsdWdpbikgPT4gcGx1Z2luLm5hbWUgPT09ICdyb290LWNtcycpO1xuICBpZiAoIXBsdWdpbikge1xuICAgIHRocm93IG5ldyBFcnJvcignY291bGQgbm90IGZpbmQgcm9vdC1jbXMgcGx1Z2luIGNvbmZpZyBpbiByb290LmNvbmZpZy50cycpO1xuICB9XG4gIHJldHVybiBwbHVnaW4gYXMgQ01TUGx1Z2luO1xufVxuXG4vKipcbiAqIFdhbGtzIHRoZSBkYXRhIHRyZWUgYW5kIGNvbnZlcnRzIGFueSBUaW1lc3RhbXAgb2JqZWN0cyB0byBtaWxsaXMgYW5kIGFueVxuICogX2FycmF5IG1hcHMgdG8gbm9ybWFsIGFycmF5cy5cbiAqXG4gKiBFLmcuOlxuICpcbiAqIG5vcm1hbGl6ZURhdGEoe1xuICogICBzeXM6IHttb2RpZmllZEF0OiBUaW1lc3RhbXAoMTIzKX0sXG4gKiAgIGZpZWxkczoge1xuICogICAgIF9hcnJheTogWydhc2RmJ10sXG4gKiAgICAgYXNkZjoge3RpdGxlOiAnaGVsbG8nfVxuICogICB9XG4gKiB9KVxuICogLy8gPT4ge3N5czoge21vZGlmaWVkQXQ6IDEyM30sIGZpZWxkczoge2ZvbzogW3t0aXRsZTogJ2hlbGxvJ31dfX1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVubWFyc2hhbERhdGEoZGF0YTogYW55KTogYW55IHtcbiAgY29uc3QgcmVzdWx0OiBhbnkgPSB7fTtcbiAgZm9yIChjb25zdCBrZXkgaW4gZGF0YSkge1xuICAgIGNvbnN0IHZhbCA9IGRhdGFba2V5XTtcbiAgICBpZiAoaXNPYmplY3QodmFsKSkge1xuICAgICAgaWYgKHZhbC50b01pbGxpcykge1xuICAgICAgICByZXN1bHRba2V5XSA9IHZhbC50b01pbGxpcygpO1xuICAgICAgfSBlbHNlIGlmIChPYmplY3QuaGFzT3duKHZhbCwgJ19hcnJheScpICYmIEFycmF5LmlzQXJyYXkodmFsLl9hcnJheSkpIHtcbiAgICAgICAgY29uc3QgYXJyID0gdmFsLl9hcnJheS5tYXAoKGFycmF5S2V5OiBzdHJpbmcpID0+IHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4udW5tYXJzaGFsRGF0YSh2YWxbYXJyYXlLZXldIHx8IHt9KSxcbiAgICAgICAgICAgIF9hcnJheUtleTogYXJyYXlLZXksXG4gICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJlc3VsdFtrZXldID0gYXJyO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0W2tleV0gPSB1bm1hcnNoYWxEYXRhKHZhbCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdFtrZXldID0gdmFsO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKiogQGRlcHJlY2F0ZWQgVXNlIGB1bm1hcnNoYWxEYXRhKClgIGluc3RlYWQuICovXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplRGF0YShkYXRhOiBhbnkpOiBhbnkge1xuICByZXR1cm4gdW5tYXJzaGFsRGF0YShkYXRhKTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBcnJheU9iamVjdCB7XG4gIFtrZXk6IHN0cmluZ106IGFueTtcbiAgX2FycmF5OiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBTZXJpYWxpemVzIGFuIGFycmF5IGludG8gYW4gYEFycmF5T2JqZWN0YCwgZS5nLjpcbiAqXG4gKiBgYGBcbiAqIG1hcnNoYWxBcnJheShbMSwgMiwgM10pXG4gKiAvLyA9PiB7YTogMSwgYjogMiwgYzogMywgX2FycmF5OiBbJ2EnLCAnYicsICdjJ119XG4gKiBgYGBcbiAqXG4gKiBUaGlzIGRhdGFiYXNlIHN0b3JhZ2UgbWV0aG9kIG1ha2VzIGl0IGVhc2llciB0byB1cGRhdGUgYSBzaW5nbGUgZmllbGQgaW4gYVxuICogZGVlcGx5IG5lc3RlZCBhcnJheSBvYmplY3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXJzaGFsQXJyYXkoYXJyOiBhbnlbXSk6IEFycmF5T2JqZWN0IHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KGFycikpIHtcbiAgICByZXR1cm4gYXJyO1xuICB9XG4gIGNvbnN0IGFyck9iamVjdDogQXJyYXlPYmplY3QgPSB7X2FycmF5OiBbXX07XG4gIGZvciAoY29uc3QgaXRlbSBvZiBhcnIpIHtcbiAgICBjb25zdCBrZXkgPSByYW5kU3RyaW5nKDYpO1xuICAgIGFyck9iamVjdFtrZXldID0gaXRlbTtcbiAgICBhcnJPYmplY3QuX2FycmF5LnB1c2goa2V5KTtcbiAgfVxuICByZXR1cm4gYXJyT2JqZWN0O1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIGBBcnJheU9iamVjdGAgdG8gYSBub3JtYWwgYXJyYXkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bm1hcnNoYWxBcnJheShhcnJPYmplY3Q6IEFycmF5T2JqZWN0KTogYW55W10ge1xuICBpZiAoIUFycmF5LmlzQXJyYXkoYXJyT2JqZWN0Py5fYXJyYXkpKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIGNvbnN0IGFyciA9IGFyck9iamVjdC5fYXJyYXkubWFwKChrOiBzdHJpbmcpID0+IGFyck9iamVjdFtrXSk7XG4gIHJldHVybiBhcnI7XG59XG5cbmZ1bmN0aW9uIGlzT2JqZWN0KGRhdGE6IGFueSk6IGJvb2xlYW4ge1xuICByZXR1cm4gdHlwZW9mIGRhdGEgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KGRhdGEpICYmIGRhdGEgIT09IG51bGw7XG59XG5cbmZ1bmN0aW9uIHJhbmRTdHJpbmcobGVuOiBudW1iZXIpOiBzdHJpbmcge1xuICBjb25zdCByZXN1bHQgPSBbXTtcbiAgY29uc3QgY2hhcnMgPVxuICAgICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSc7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICBjb25zdCByYW5kID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogY2hhcnMubGVuZ3RoKTtcbiAgICByZXN1bHQucHVzaChjaGFycy5jaGFyQXQocmFuZCkpO1xuICB9XG4gIHJldHVybiByZXN1bHQuam9pbignJyk7XG59XG5cbi8qKlxuICogQ29udmVydHMgYSB0cmFuc2xhdGlvbnMgbWFwIGZyb20gYGxvYWRUcmFuc2xhdGlvbnMoKWAgdG8gYSBtYXAgb2Ygc291cmNlIHRvXG4gKiB0cmFuc2xhdGVkIHN0cmluZyBmb3IgYSBwYXJ0aWN1bGFyIGxvY2FsZS5cbiAqXG4gKiBSZXR1cm5zIGEgbWFwIGxpa2U6XG4gKiBgYGBcbiAqIHtcbiAqICAgXCJIZWxsb1wiOiBcIkJvbmpvdXJcIixcbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNsYXRpb25zRm9yTG9jYWxlKFxuICB0cmFuc2xhdGlvbnNNYXA6IFRyYW5zbGF0aW9uc01hcCxcbiAgbG9jYWxlOiBzdHJpbmdcbikge1xuICBjb25zdCBsb2NhbGVUcmFuc2xhdGlvbnM6IExvY2FsZVRyYW5zbGF0aW9ucyA9IHt9O1xuICBPYmplY3QudmFsdWVzKHRyYW5zbGF0aW9uc01hcCkuZm9yRWFjaCgoc3RyaW5nKSA9PiB7XG4gICAgY29uc3Qgc291cmNlID0gc3RyaW5nLnNvdXJjZTtcbiAgICBjb25zdCB0cmFuc2xhdGlvbiA9IHN0cmluZ1tsb2NhbGVdIHx8IHN0cmluZy5lbiB8fCBzdHJpbmcuc291cmNlO1xuICAgIGxvY2FsZVRyYW5zbGF0aW9uc1tzb3VyY2VdID0gdHJhbnNsYXRpb247XG4gIH0pO1xuICByZXR1cm4gbG9jYWxlVHJhbnNsYXRpb25zO1xufVxuIiwgImltcG9ydCB7aW5pdGlhbGl6ZUFwcH0gZnJvbSAnZmlyZWJhc2UtYWRtaW4vYXBwJztcbmltcG9ydCB7Z2V0U2VjdXJpdHlSdWxlc30gZnJvbSAnZmlyZWJhc2UtYWRtaW4vc2VjdXJpdHktcnVsZXMnO1xuXG5leHBvcnQgY29uc3QgRklSRVNUT1JFX1JVTEVTID0gYHJ1bGVzX3ZlcnNpb24gPSAnMic7XG5zZXJ2aWNlIGNsb3VkLmZpcmVzdG9yZSB7XG4gIG1hdGNoIC9kYXRhYmFzZXMve2RhdGFiYXNlfS9kb2N1bWVudHMge1xuICAgIG1hdGNoIC97ZG9jdW1lbnQ9Kip9IHtcbiAgICAgIGFsbG93IHJlYWQsIHdyaXRlOiBpZiBmYWxzZTtcbiAgICB9XG5cbiAgICBtYXRjaCAvUHJvamVjdHMve3Byb2plY3R9IHtcbiAgICAgIGFsbG93IHdyaXRlOlxuICAgICAgICBpZiBpc1NpZ25lZEluKCkgJiYgdXNlcklzQWRtaW4oKTtcbiAgICAgIGFsbG93IHJlYWQ6XG4gICAgICAgIGlmIGlzU2lnbmVkSW4oKSAmJiB1c2VyQ2FuUmVhZCgpO1xuXG4gICAgICBtYXRjaCAve2NvbGxlY3Rpb259L3tkb2N1bWVudD0qKn0ge1xuICAgICAgICBhbGxvdyB3cml0ZTpcbiAgICAgICAgICBpZiBpc1NpZ25lZEluKCkgJiYgdXNlckNhbldyaXRlKCk7XG4gICAgICAgIGFsbG93IHJlYWQ6XG4gICAgICAgICAgaWYgaXNTaWduZWRJbigpICYmIHVzZXJDYW5SZWFkKCk7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIGlzU2lnbmVkSW4oKSB7XG4gICAgICAgIHJldHVybiByZXF1ZXN0LmF1dGggIT0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gZ2V0Um9sZXMoKSB7XG4gICAgICAgIHJldHVybiBnZXQoL2RhdGFiYXNlcy8kKGRhdGFiYXNlKS9kb2N1bWVudHMvUHJvamVjdHMvJChwcm9qZWN0KSkuZGF0YS5yb2xlcztcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gdXNlckNhblJlYWQoKSB7XG4gICAgICAgIGxldCByb2xlcyA9IGdldFJvbGVzKCk7XG4gICAgICAgIGxldCBlbWFpbCA9IHJlcXVlc3QuYXV0aC50b2tlbi5lbWFpbDtcbiAgICAgICAgbGV0IGRvbWFpbiA9ICcqQCcgKyBlbWFpbC5zcGxpdCgnQCcpWzFdO1xuICAgICAgICByZXR1cm4gKHJvbGVzW2VtYWlsXSBpbiBbJ0FETUlOJywgJ0VESVRPUicsICdWSUVXRVInXSkgfHwgKHJvbGVzW2RvbWFpbl0gaW4gWydBRE1JTicsICdFRElUT1InLCAnVklFV0VSJ10pO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiB1c2VyQ2FuV3JpdGUoKSB7XG4gICAgICAgIGxldCByb2xlcyA9IGdldFJvbGVzKCk7XG4gICAgICAgIGxldCBlbWFpbCA9IHJlcXVlc3QuYXV0aC50b2tlbi5lbWFpbDtcbiAgICAgICAgbGV0IGRvbWFpbiA9ICcqQCcgKyBlbWFpbC5zcGxpdCgnQCcpWzFdO1xuICAgICAgICByZXR1cm4gKHJvbGVzW2VtYWlsXSBpbiBbJ0FETUlOJywgJ0VESVRPUiddKSB8fCAocm9sZXNbZG9tYWluXSBpbiBbJ0FETUlOJywgJ0VESVRPUiddKTtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gdXNlcklzQWRtaW4oKSB7XG4gICAgICAgIGxldCByb2xlcyA9IGdldFJvbGVzKCk7XG4gICAgICAgIGxldCBlbWFpbCA9IHJlcXVlc3QuYXV0aC50b2tlbi5lbWFpbDtcbiAgICAgICAgbGV0IGRvbWFpbiA9ICcqQCcgKyBlbWFpbC5zcGxpdCgnQCcpWzFdO1xuICAgICAgICByZXR1cm4gKHJvbGVzW2VtYWlsXSA9PSAnQURNSU4nKSB8fCAocm9sZXNbZG9tYWluXSA9PSAnQURNSU4nKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbmA7XG5cbi8qKlxuICogQWRkcyB0aGUgcm9vdC1jbXMgc2VjdXJpdHkgcnVsZXMgdG8gYSBGaXJlYmFzZSBwcm9qZWN0LlxuICogTk9URTogVGhpcyBmdW5jdGlvbiB3aWxsIG92ZXJ3cml0ZSBhbnkgZXhpc3RpbmcgcnVsZXMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhcHBseVNlY3VyaXR5UnVsZXMocHJvamVjdElkOiBzdHJpbmcpIHtcbiAgLy8gVE9ETyhzdGV2ZW5sZSk6IGNoZWNrIGlmIGFuIGFwcCBleGlzdHMgZmlyc3QgYmVmb3JlIGluaXRpYWxpemluZy5cbiAgY29uc3QgYXBwID0gaW5pdGlhbGl6ZUFwcCh7cHJvamVjdElkfSk7XG4gIGNvbnN0IHNlY3VyaXR5UnVsZXMgPSBnZXRTZWN1cml0eVJ1bGVzKGFwcCk7XG4gIGF3YWl0IHNlY3VyaXR5UnVsZXMucmVsZWFzZUZpcmVzdG9yZVJ1bGVzZXRGcm9tU291cmNlKEZJUkVTVE9SRV9SVUxFUyk7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiO0FBQUEsU0FBUSxlQUFjO0FBQ3RCLFNBQVEsU0FBUyxhQUFZOzs7QUNEN0IsU0FBUSxZQUFZLFVBQVM7QUFDN0IsT0FBTyxVQUFVO0FBQ2pCLFNBQVEscUJBQW9CO0FBQzVCLFNBQVEsZ0JBQWdCLHlCQUF3QjtBQUNoRCxZQUFZLFNBQVM7QUFLckIsSUFBTSxZQUFZLEtBQUssUUFBUSxjQUFjLFlBQVksR0FBRyxDQUFDO0FBRTdELGVBQXNCLGdCQUFnQjtBQUNwQyxRQUFNLFVBQVUsUUFBUSxJQUFJO0FBQzVCLFFBQU0sYUFBYSxNQUFNLGVBQWUsU0FBUyxFQUFDLFNBQVMsV0FBVSxDQUFDO0FBQ3RFLFFBQU0sYUFBYSxLQUFLLFFBQVEsV0FBVyxjQUFjO0FBQ3pELFFBQU0sVUFBVyxNQUFNO0FBQUEsSUFDckI7QUFBQSxJQUNBO0FBQUEsRUFDRjtBQUNBLFFBQU0sVUFBVSxRQUFRLGtCQUFrQjtBQUMxQyxVQUFRLElBQUksaUNBQWlDLE9BQU8sS0FBSztBQUN6RCxRQUFNLGFBQWEsS0FBSyxRQUFRLFNBQVMsZUFBZTtBQUN4RCxRQUFNLGtCQUFrQixZQUFZLE9BQU87QUFDM0MsVUFBUSxJQUFJLHNCQUFzQjtBQUNwQztBQUVBLElBQU0sV0FBVztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFB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TUFBYyxTQUFpQjtBQUN6QyxTQUFLLE9BQU87QUFDWixTQUFLLFVBQVU7QUFBQSxFQUNqQjtBQUFBLEVBRUEsTUFBTSxJQUFJLE1BQWdCO0FBQ3hCLFVBQU0sVUFBVSxJQUFJLFFBQVEsS0FBSyxJQUFJO0FBQ3JDLFlBQVEsUUFBUSxLQUFLLE9BQU87QUFDNUIsWUFBUSxPQUFPLGVBQWUsT0FBTztBQUNyQyxZQUFRLEtBQUssYUFBYSxDQUFDLFFBQVE7QUFDakMsVUFBSSxDQUFDLElBQUksS0FBSyxFQUFFLE9BQU87QUFDckIsZ0JBQVE7QUFBQSxVQUNOLGFBQU0sUUFBUSxNQUFNLElBQUksS0FBSyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEtBQUssS0FBSyxPQUFPO0FBQUE7QUFBQSxRQUN6RDtBQUFBLE1BQ0Y7QUFBQSxJQUNGLENBQUM7QUFDRCxZQUNHLFFBQVEsZUFBZSxFQUN2QixZQUFZLGtEQUFrRCxFQUM5RCxPQUFPLHVCQUF1QixnQkFBZ0IsRUFDOUMsT0FBTyxtQkFBbUIsOEJBQThCLEVBQ3hELE9BQU8sWUFBWTtBQUN0QixZQUNHLFFBQVEsZ0JBQWdCLEVBQ3hCLE1BQU0sT0FBTyxFQUNiO0FBQUEsTUFDQztBQUFBLElBQ0YsRUFDQyxPQUFPLGFBQWE7QUFDdkIsVUFBTSxRQUFRLFdBQVcsSUFBSTtBQUFBLEVBQy9CO0FBQ0Y7IiwKICAibmFtZXMiOiBbImxvYWRSb290Q29uZmlnIiwgImdldEZpcmVzdG9yZSIsICJwbHVnaW4iLCAibG9hZFJvb3RDb25maWciLCAiZ2V0RmlyZXN0b3JlIl0KfQo=
|
package/dist/plugin.d.ts
CHANGED